From 6b1ae946170b7f5971fe23e49935b7ffeb204383 Mon Sep 17 00:00:00 2001 From: Moses Narrow Date: Mon, 4 Nov 2024 13:30:08 -0600 Subject: [PATCH 1/4] add joint compilation cmd/skycoin-skywire --- cmd/skycoin-skywire/README.md | 3023 +++++++++++ cmd/skycoin-skywire/commands/root.go | 365 ++ cmd/skycoin-skywire/skywire.go | 45 + go.mod | 29 +- go.sum | 67 +- vendor/github.com/blang/semver/.travis.yml | 21 + vendor/github.com/blang/semver/LICENSE | 22 + vendor/github.com/blang/semver/README.md | 194 + vendor/github.com/blang/semver/json.go | 23 + vendor/github.com/blang/semver/package.json | 17 + vendor/github.com/blang/semver/range.go | 416 ++ vendor/github.com/blang/semver/semver.go | 418 ++ vendor/github.com/blang/semver/sort.go | 28 + vendor/github.com/blang/semver/sql.go | 30 + vendor/github.com/boltdb/bolt/.gitignore | 4 + vendor/github.com/boltdb/bolt/LICENSE | 20 + vendor/github.com/boltdb/bolt/Makefile | 18 + vendor/github.com/boltdb/bolt/README.md | 916 ++++ vendor/github.com/boltdb/bolt/appveyor.yml | 18 + vendor/github.com/boltdb/bolt/bolt_386.go | 10 + vendor/github.com/boltdb/bolt/bolt_amd64.go | 10 + vendor/github.com/boltdb/bolt/bolt_arm.go | 28 + vendor/github.com/boltdb/bolt/bolt_arm64.go | 12 + vendor/github.com/boltdb/bolt/bolt_linux.go | 10 + vendor/github.com/boltdb/bolt/bolt_openbsd.go | 27 + vendor/github.com/boltdb/bolt/bolt_ppc.go | 9 + vendor/github.com/boltdb/bolt/bolt_ppc64.go | 12 + vendor/github.com/boltdb/bolt/bolt_ppc64le.go | 12 + vendor/github.com/boltdb/bolt/bolt_s390x.go | 12 + vendor/github.com/boltdb/bolt/bolt_unix.go | 89 + .../boltdb/bolt/bolt_unix_solaris.go | 90 + vendor/github.com/boltdb/bolt/bolt_windows.go | 144 + .../github.com/boltdb/bolt/boltsync_unix.go | 8 + vendor/github.com/boltdb/bolt/bucket.go | 777 +++ vendor/github.com/boltdb/bolt/cursor.go | 400 ++ vendor/github.com/boltdb/bolt/db.go | 1039 ++++ vendor/github.com/boltdb/bolt/doc.go | 44 + vendor/github.com/boltdb/bolt/errors.go | 71 + vendor/github.com/boltdb/bolt/freelist.go | 252 + vendor/github.com/boltdb/bolt/node.go | 604 +++ vendor/github.com/boltdb/bolt/page.go | 197 + vendor/github.com/boltdb/bolt/tx.go | 684 +++ vendor/github.com/cenkalti/backoff/.gitignore | 22 + .../github.com/cenkalti/backoff/.travis.yml | 10 + vendor/github.com/cenkalti/backoff/LICENSE | 20 + vendor/github.com/cenkalti/backoff/README.md | 30 + vendor/github.com/cenkalti/backoff/backoff.go | 66 + vendor/github.com/cenkalti/backoff/context.go | 63 + .../cenkalti/backoff/exponential.go | 153 + vendor/github.com/cenkalti/backoff/retry.go | 82 + vendor/github.com/cenkalti/backoff/ticker.go | 82 + vendor/github.com/cenkalti/backoff/tries.go | 35 + vendor/github.com/fatih/color/README.md | 23 +- vendor/github.com/fatih/color/color.go | 32 +- .../github.com/fsnotify/fsnotify/.cirrus.yml | 13 + .../fsnotify/fsnotify/.editorconfig | 12 + .../fsnotify/fsnotify/.gitattributes | 1 + .../github.com/fsnotify/fsnotify/.gitignore | 7 + vendor/github.com/fsnotify/fsnotify/.mailmap | 2 + .../github.com/fsnotify/fsnotify/CHANGELOG.md | 541 ++ .../fsnotify/fsnotify/CONTRIBUTING.md | 26 + vendor/github.com/fsnotify/fsnotify/LICENSE | 25 + vendor/github.com/fsnotify/fsnotify/README.md | 184 + .../fsnotify/fsnotify/backend_fen.go | 640 +++ .../fsnotify/fsnotify/backend_inotify.go | 594 +++ .../fsnotify/fsnotify/backend_kqueue.go | 782 +++ .../fsnotify/fsnotify/backend_other.go | 205 + .../fsnotify/fsnotify/backend_windows.go | 827 +++ .../github.com/fsnotify/fsnotify/fsnotify.go | 146 + vendor/github.com/fsnotify/fsnotify/mkdoc.zsh | 259 + .../fsnotify/fsnotify/system_bsd.go | 8 + .../fsnotify/fsnotify/system_darwin.go | 9 + vendor/github.com/hashicorp/hcl/.gitignore | 9 + vendor/github.com/hashicorp/hcl/.travis.yml | 13 + vendor/github.com/hashicorp/hcl/LICENSE | 354 ++ vendor/github.com/hashicorp/hcl/Makefile | 18 + vendor/github.com/hashicorp/hcl/README.md | 125 + vendor/github.com/hashicorp/hcl/appveyor.yml | 19 + vendor/github.com/hashicorp/hcl/decoder.go | 729 +++ vendor/github.com/hashicorp/hcl/hcl.go | 11 + .../github.com/hashicorp/hcl/hcl/ast/ast.go | 219 + .../github.com/hashicorp/hcl/hcl/ast/walk.go | 52 + .../hashicorp/hcl/hcl/parser/error.go | 17 + .../hashicorp/hcl/hcl/parser/parser.go | 532 ++ .../hashicorp/hcl/hcl/printer/nodes.go | 789 +++ .../hashicorp/hcl/hcl/printer/printer.go | 66 + .../hashicorp/hcl/hcl/scanner/scanner.go | 652 +++ .../hashicorp/hcl/hcl/strconv/quote.go | 241 + .../hashicorp/hcl/hcl/token/position.go | 46 + .../hashicorp/hcl/hcl/token/token.go | 219 + .../hashicorp/hcl/json/parser/flatten.go | 117 + .../hashicorp/hcl/json/parser/parser.go | 313 ++ .../hashicorp/hcl/json/scanner/scanner.go | 451 ++ .../hashicorp/hcl/json/token/position.go | 46 + .../hashicorp/hcl/json/token/token.go | 118 + vendor/github.com/hashicorp/hcl/lex.go | 38 + vendor/github.com/hashicorp/hcl/parse.go | 39 + .../magiconair/properties/.gitignore | 6 + .../magiconair/properties/CHANGELOG.md | 205 + .../magiconair/properties/LICENSE.md | 24 + .../magiconair/properties/README.md | 128 + .../magiconair/properties/decode.go | 289 ++ .../github.com/magiconair/properties/doc.go | 155 + .../magiconair/properties/integrate.go | 35 + .../github.com/magiconair/properties/lex.go | 395 ++ .../github.com/magiconair/properties/load.go | 293 ++ .../magiconair/properties/parser.go | 86 + .../magiconair/properties/properties.go | 848 +++ .../magiconair/properties/rangecheck.go | 31 + .../mitchellh/mapstructure/CHANGELOG.md | 96 + .../github.com/mitchellh/mapstructure/LICENSE | 21 + .../mitchellh/mapstructure/README.md | 46 + .../mitchellh/mapstructure/decode_hooks.go | 279 + .../mitchellh/mapstructure/error.go | 50 + .../mitchellh/mapstructure/mapstructure.go | 1540 ++++++ .../sagikazarmark/locafero/.editorconfig | 21 + .../github.com/sagikazarmark/locafero/.envrc | 4 + .../sagikazarmark/locafero/.gitignore | 8 + .../sagikazarmark/locafero/.golangci.yaml | 27 + .../github.com/sagikazarmark/locafero/LICENSE | 19 + .../sagikazarmark/locafero/README.md | 37 + .../sagikazarmark/locafero/file_type.go | 28 + .../sagikazarmark/locafero/finder.go | 165 + .../sagikazarmark/locafero/flake.lock | 472 ++ .../sagikazarmark/locafero/flake.nix | 47 + .../github.com/sagikazarmark/locafero/glob.go | 5 + .../sagikazarmark/locafero/glob_windows.go | 8 + .../sagikazarmark/locafero/helpers.go | 41 + .../sagikazarmark/locafero/justfile | 11 + .../sagikazarmark/slog-shim/.editorconfig | 18 + .../github.com/sagikazarmark/slog-shim/.envrc | 4 + .../sagikazarmark/slog-shim/.gitignore | 4 + .../sagikazarmark/slog-shim/LICENSE | 27 + .../sagikazarmark/slog-shim/README.md | 81 + .../sagikazarmark/slog-shim/attr.go | 74 + .../sagikazarmark/slog-shim/attr_120.go | 75 + .../sagikazarmark/slog-shim/flake.lock | 273 + .../sagikazarmark/slog-shim/flake.nix | 57 + .../sagikazarmark/slog-shim/handler.go | 45 + .../sagikazarmark/slog-shim/handler_120.go | 45 + .../sagikazarmark/slog-shim/json_handler.go | 23 + .../slog-shim/json_handler_120.go | 24 + .../sagikazarmark/slog-shim/level.go | 61 + .../sagikazarmark/slog-shim/level_120.go | 61 + .../sagikazarmark/slog-shim/logger.go | 98 + .../sagikazarmark/slog-shim/logger_120.go | 99 + .../sagikazarmark/slog-shim/record.go | 31 + .../sagikazarmark/slog-shim/record_120.go | 32 + .../sagikazarmark/slog-shim/text_handler.go | 23 + .../slog-shim/text_handler_120.go | 24 + .../sagikazarmark/slog-shim/value.go | 109 + .../sagikazarmark/slog-shim/value_120.go | 110 + .../github.com/shopspring/decimal/.gitignore | 9 + .../shopspring/decimal/CHANGELOG.md | 76 + vendor/github.com/shopspring/decimal/LICENSE | 45 + .../github.com/shopspring/decimal/README.md | 139 + vendor/github.com/shopspring/decimal/const.go | 63 + .../shopspring/decimal/decimal-go.go | 415 ++ .../github.com/shopspring/decimal/decimal.go | 2339 +++++++++ .../github.com/shopspring/decimal/rounding.go | 160 + .../github.com/skycoin/skycoin/.dockerignore | 32 + .../github.com/skycoin/skycoin/.editorconfig | 32 + vendor/github.com/skycoin/skycoin/.gitignore | 160 + .../github.com/skycoin/skycoin/.golangci.yml | 198 + .../github.com/skycoin/skycoin/CHANGELOG.md | 641 +++ .../skycoin/skycoin/INSTALLATION.md | 102 + .../github.com/skycoin/skycoin/INTEGRATION.md | 349 ++ vendor/github.com/skycoin/skycoin/Makefile | 243 + vendor/github.com/skycoin/skycoin/README.md | 842 +++ .../skycoin/cmd/newcoin/commands/root.go | 237 + .../skycoin/cmd/skycoin-cli/commands/root.go | 57 + .../cmd/skycoin-wallet/commands/root.go | 50 + .../skycoin/cmd/skycoin/commands/root.go | 140 + .../skycoin/skycoin/docker_launcher.sh | 16 + vendor/github.com/skycoin/skycoin/fiber.toml | 148 + .../skycoin/skycoin/iketheadore.asc | 14 + vendor/github.com/skycoin/skycoin/peers.txt | 7 + .../github.com/skycoin/skycoin/run-client.sh | 25 + .../github.com/skycoin/skycoin/run-daemon.sh | 23 + vendor/github.com/skycoin/skycoin/skycoin.go | 47 + .../skycoin/skycoin/src/api/README.md | 4570 +++++++++++++++++ .../skycoin/skycoin/src/api/address.go | 56 + .../skycoin/skycoin/src/api/blockchain.go | 404 ++ .../skycoin/skycoin/src/api/client.go | 1468 ++++++ .../skycoin/skycoin/src/api/csrf.go | 166 + .../skycoin/skycoin/src/api/explorer.go | 243 + .../skycoin/skycoin/src/api/gateway.go | 122 + .../skycoin/skycoin/src/api/health.go | 118 + .../skycoin/skycoin/src/api/http.go | 790 +++ .../skycoin/skycoin/src/api/middleware.go | 208 + .../skycoin/skycoin/src/api/network.go | 231 + .../skycoin/skycoin/src/api/outputs.go | 79 + .../skycoin/skycoin/src/api/spend.go | 748 +++ .../skycoin/skycoin/src/api/storage.go | 194 + .../skycoin/skycoin/src/api/transaction.go | 857 ++++ .../skycoin/skycoin/src/api/uxout.go | 102 + .../skycoin/skycoin/src/api/version.go | 22 + .../skycoin/skycoin/src/api/wallet.go | 1191 +++++ .../skycoin/src/cipher/base58/base58_old.go | 6 +- .../skycoin/skycoin/src/cipher/bip32/LICENSE | 22 + .../skycoin/src/cipher/bip32/README.md | 102 + .../skycoin/skycoin/src/cipher/bip32/bip32.go | 653 +++ .../skycoin/skycoin/src/cipher/bip32/path.go | 108 + .../skycoin/skycoin/src/cipher/bip32/utils.go | 171 + .../skycoin/skycoin/src/cipher/bip39/LICENSE | 22 + .../skycoin/src/cipher/bip39/README.md | 43 + .../skycoin/skycoin/src/cipher/bip39/bip39.go | 408 ++ .../bip39/wordlists/chinese_simplified.go | 2071 ++++++++ .../bip39/wordlists/chinese_traditional.go | 2071 ++++++++ .../src/cipher/bip39/wordlists/english.go | 2071 ++++++++ .../src/cipher/bip39/wordlists/french.go | 2071 ++++++++ .../src/cipher/bip39/wordlists/italian.go | 2071 ++++++++ .../src/cipher/bip39/wordlists/japanese.go | 2071 ++++++++ .../src/cipher/bip39/wordlists/korean.go | 2071 ++++++++ .../src/cipher/bip39/wordlists/spanish.go | 2071 ++++++++ .../skycoin/skycoin/src/cipher/bip44/bip44.go | 103 + .../chacha20poly1305/chacha20poly1305.go | 83 + .../chacha20poly1305_amd64.go | 128 + .../chacha20poly1305/chacha20poly1305_amd64.s | 2714 ++++++++++ .../chacha20poly1305_generic.go | 70 + .../chacha20poly1305_noasm.go | 16 + .../internal/chacha20/chacha_generic.go | 199 + .../skycoin/skycoin/src/cipher/crypto.go | 2 +- .../skycoin/src/cipher/crypto/crypto.go | 86 + .../skycoin/src/cipher/encoder/README.md | 8 + .../skycoin/src/cipher/encoder/encoder.go | 1027 ++++ .../cipher/encrypt/scrypt_chacha20poly1305.go | 171 + .../skycoin/src/cipher/encrypt/sha256xor.go | 261 + .../skycoin/src/cipher/pbkdf2/pbkdf2.go | 77 + .../skycoin/src/cipher/poly1305/poly1305.go | 32 + .../skycoin/src/cipher/poly1305/sum_amd64.go | 24 + .../skycoin/src/cipher/poly1305/sum_amd64.s | 125 + .../skycoin/src/cipher/poly1305/sum_arm.go | 24 + .../skycoin/src/cipher/poly1305/sum_arm.s | 427 ++ .../skycoin/src/cipher/poly1305/sum_ref.go | 142 + .../skycoin/src/cipher/scrypt/scrypt.go | 243 + .../secp256k1-go/secp256k1-go2/secp256k1.go | 4 +- .../cipher/secp256k1-go/secp256k1-go2/xy.go | 2 +- .../skycoin/src/cli/add_private_key.go | 140 + .../skycoin/skycoin/src/cli/address_gen.go | 342 ++ .../skycoin/skycoin/src/cli/addresscount.go | 26 + .../skycoin/skycoin/src/cli/blocks.go | 49 + .../skycoin/src/cli/broadcast_rawtx.go | 29 + .../skycoin/skycoin/src/cli/check_balance.go | 258 + .../skycoin/skycoin/src/cli/checkdb.go | 141 + .../github.com/skycoin/skycoin/src/cli/cli.go | 323 ++ .../skycoin/skycoin/src/cli/create_rawtx.go | 1011 ++++ .../skycoin/skycoin/src/cli/decrypt_wallet.go | 60 + .../skycoin/src/cli/distribute_genesis.go | 147 + .../skycoin/skycoin/src/cli/encrypt_wallet.go | 63 + .../skycoin/skycoin/src/cli/generate_addrs.go | 208 + .../skycoin/src/cli/generate_wallet.go | 523 ++ .../skycoin/skycoin/src/cli/last_blocks.go | 37 + .../skycoin/skycoin/src/cli/list_addrs.go | 47 + .../skycoin/skycoin/src/cli/list_wallets.go | 56 + .../skycoin/skycoin/src/cli/outputs.go | 76 + .../skycoin/skycoin/src/cli/richlist.go | 58 + .../skycoin/skycoin/src/cli/scan_addrs.go | 110 + .../skycoin/skycoin/src/cli/send.go | 67 + .../skycoin/skycoin/src/cli/show_seed.go | 91 + .../skycoin/skycoin/src/cli/status.go | 52 + .../skycoin/skycoin/src/cli/transaction.go | 405 ++ .../skycoin/skycoin/src/cli/verify_address.go | 21 + .../skycoin/skycoin/src/cli/version.go | 50 + .../skycoin/skycoin/src/cli/wallet_history.go | 229 + .../skycoin/src/cli/wallet_key_export.go | 180 + .../skycoin/skycoin/src/coin/block.go | 236 + .../skycoin/src/coin/block_body_skyencoder.go | 407 ++ .../src/coin/block_header_skyencoder.go | 168 + .../skycoin/skycoin/src/coin/outputs.go | 327 ++ .../src/coin/transaction_inputs_skyencoder.go | 135 + .../coin/transaction_outputs_skyencoder.go | 179 + .../src/coin/transaction_skyencoder.go | 357 ++ .../skycoin/skycoin/src/coin/transactions.go | 788 +++ .../skycoin/src/coin/ux_body_skyencoder.go | 138 + .../skycoin/src/coin/ux_head_skyencoder.go | 93 + .../announce_blocks_message_skyencoder.go | 78 + .../announce_txns_message_skyencoder.go | 135 + .../skycoin/src/daemon/announced_txns.go | 44 + .../skycoin/skycoin/src/daemon/connections.go | 554 ++ .../skycoin/skycoin/src/daemon/daemon.go | 1787 +++++++ .../daemon/disconnect_message_skyencoder.go | 118 + .../skycoin/skycoin/src/daemon/errors.go | 112 + .../daemon/get_blocks_message_skyencoder.go | 93 + .../src/daemon/get_txns_message_skyencoder.go | 135 + .../daemon/give_blocks_message_skyencoder.go | 579 +++ .../daemon/give_peers_message_skyencoder.go | 149 + .../daemon/give_txns_message_skyencoder.go | 408 ++ .../skycoin/skycoin/src/daemon/gnet/README.md | 7 + .../skycoin/src/daemon/gnet/dispatcher.go | 209 + .../skycoin/src/daemon/gnet/message.go | 140 + .../skycoin/skycoin/src/daemon/gnet/pool.go | 1076 ++++ .../daemon/introduction_message_skyencoder.go | 162 + .../skycoin/src/daemon/ip_addr_skyencoder.go | 93 + .../skycoin/skycoin/src/daemon/messages.go | 1390 +++++ .../skycoin/skycoin/src/daemon/pex/README.md | 8 + .../skycoin/src/daemon/pex/peerlist.go | 396 ++ .../skycoin/skycoin/src/daemon/pex/pex.go | 738 +++ .../skycoin/skycoin/src/daemon/pool.go | 133 + .../src/daemon/signed_block_skyencoder.go | 528 ++ .../skycoin/src/daemon/strand/strand.go | 135 + .../src/daemon/transaction_skyencoder.go | 358 ++ .../skycoin/skycoin/src/fiber/config.go | 182 + .../dist/0.d5967d50848818a3b5b3.chunk.js | 1 + .../gui/static/dist/1.7e4369252841c80f4cac.js | 1 + .../dist/1.bf6ae8acc706c3217da3.chunk.js | 1 + .../gui/static/dist/1.fff400d64f7210ba95bd.js | 1 + .../static/dist/11.020fa0852ac300d8fd70.js | 1 + .../static/dist/11.254b5afd8c604835170d.js | 1 + .../static/dist/118.c125ed41f2fd9967c716.js | 1 + .../dist/2.af5e2fa6c65ff6f39739.chunk.js | 1 + .../gui/static/dist/2.e99a3fcb8d9c8f814e72.js | 1 + .../gui/static/dist/2.ffa4899fe52b74655a98.js | 1 + .../gui/static/dist/3.48d5cf3cd51fcbe131a5.js | 1 + .../gui/static/dist/3.94cd60a03904447d91d6.js | 1 + .../dist/3.b1328f7fc5fe260edda4.chunk.js | 1 + .../src/gui/static/dist/3rdpartylicenses.txt | 294 ++ .../gui/static/dist/4.044e43d2fce319e7ba13.js | 1 + .../gui/static/dist/4.6fa8f54aba27f0eba2c9.js | 1 + .../dist/4.7f8f58ff3f30291666bf.chunk.js | 1 + .../static/dist/403.bf84efb5e25e9ed81d23.js | 1 + .../static/dist/478.20842158e3db8ad2787f.js | 1 + .../gui/static/dist/5.2e4f5db4750af0606fed.js | 1 + .../gui/static/dist/5.63460ae96b986f20f8dc.js | 1 + .../dist/5.a2cdc3b5d1d15440fa16.chunk.js | 1 + .../static/dist/526.f76257ac8fde4c59c131.js | 1 + .../dist/6.86e4e580e25082578bb8.chunk.js | 1 + .../gui/static/dist/6.ba3a26d3a7fe46a61514.js | 1 + .../gui/static/dist/6.ecbc64c3f043e17d66b5.js | 1 + .../static/dist/736.fa2bb87eeea79bc4242a.js | 1 + .../static/dist/813.1a1a8e09f2bd06a481f1.js | 1 + .../static/dist/875.b9a2a5c7c242dbc194f6.js | 1 + ...ialIcons-Regular.012cf6a10129e2275d79.woff | Bin 0 -> 57620 bytes ...rialIcons-Regular.4674f8ded773cb03e824.eot | Bin 0 -> 143258 bytes ...alIcons-Regular.570eb83859dc23dd0eec.woff2 | Bin 0 -> 44300 bytes ...rialIcons-Regular.5e7382c63da0098d634a.ttf | Bin 0 -> 128180 bytes ...ialIcons-Regular.83bebaf37c09c7e1c3ee.woff | Bin 0 -> 57620 bytes ...rialIcons-Regular.a37b0c01c0baf1888ca8.ttf | Bin 0 -> 128180 bytes ...alIcons-Regular.cff684e59ffb052d72cb.woff2 | Bin 0 -> 44300 bytes ...rialIcons-Regular.e79bfd88537def476913.eot | Bin 0 -> 143258 bytes .../Skycoin-Bold.42363955889f2f20c527.woff | Bin 0 -> 29700 bytes .../Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 | Bin 0 -> 19940 bytes ...ycoin-BoldItalic.923dce74069362d168fe.woff | Bin 0 -> 30876 bytes ...coin-BoldItalic.c414dad20c4e3020221c.woff2 | Bin 0 -> 20320 bytes .../Skycoin-Light.4be01e4a68be8bf590da.woff | Bin 0 -> 29048 bytes .../Skycoin-Light.770b27ec05c2f97a1a27.woff2 | Bin 0 -> 19744 bytes ...coin-LightItalic.39e68da05bf8b4a77aa2.woff | Bin 0 -> 31636 bytes ...oin-LightItalic.d10a437db5d8e2a52b4a.woff2 | Bin 0 -> 20436 bytes ...Skycoin-Regular.21b4caaaedc00594e7bd.woff2 | Bin 0 -> 19176 bytes .../Skycoin-Regular.98d953e74f174cf013b4.woff | Bin 0 -> 28472 bytes ...in-RegularItalic.9947360f79b09132fd21.woff | Bin 0 -> 31120 bytes ...n-RegularItalic.9eabbc2e01a7e17bb57d.woff2 | Bin 0 -> 20380 bytes .../static/dist/assets/bip39-word-list.json | 2049 ++++++++ .../assets/error-alert/big-error-icon.png | Bin 0 -> 1557 bytes .../static/dist/assets/error-alert/index.html | 95 + .../material-icons/MaterialIcons-Regular.eot | Bin 0 -> 143258 bytes .../MaterialIcons-Regular.ijmap | 1 + .../material-icons/MaterialIcons-Regular.svg | 2373 +++++++++ .../material-icons/MaterialIcons-Regular.ttf | Bin 0 -> 128180 bytes .../material-icons/MaterialIcons-Regular.woff | Bin 0 -> 57620 bytes .../MaterialIcons-Regular.woff2 | Bin 0 -> 44300 bytes .../fonts/material-icons/material-icons.css | 36 + .../assets/fonts/skycoin/Skycoin-Bold.woff | Bin 0 -> 29700 bytes .../assets/fonts/skycoin/Skycoin-Bold.woff2 | Bin 0 -> 19940 bytes .../fonts/skycoin/Skycoin-BoldItalic.woff | Bin 0 -> 30876 bytes .../fonts/skycoin/Skycoin-BoldItalic.woff2 | Bin 0 -> 20320 bytes .../assets/fonts/skycoin/Skycoin-Light.woff | Bin 0 -> 29048 bytes .../assets/fonts/skycoin/Skycoin-Light.woff2 | Bin 0 -> 19744 bytes .../fonts/skycoin/Skycoin-LightItalic.woff | Bin 0 -> 31636 bytes .../fonts/skycoin/Skycoin-LightItalic.woff2 | Bin 0 -> 20436 bytes .../assets/fonts/skycoin/Skycoin-Regular.woff | Bin 0 -> 28472 bytes .../fonts/skycoin/Skycoin-Regular.woff2 | Bin 0 -> 19176 bytes .../fonts/skycoin/Skycoin-RegularItalic.woff | Bin 0 -> 31120 bytes .../fonts/skycoin/Skycoin-RegularItalic.woff2 | Bin 0 -> 20380 bytes .../src/gui/static/dist/assets/header.png | Bin 0 -> 284713 bytes .../src/gui/static/dist/assets/i18n/README.md | 368 ++ .../src/gui/static/dist/assets/i18n/app1.png | Bin 0 -> 49616 bytes .../src/gui/static/dist/assets/i18n/app2.png | Bin 0 -> 54068 bytes .../src/gui/static/dist/assets/i18n/check.js | 230 + .../src/gui/static/dist/assets/i18n/en.json | 752 +++ .../src/gui/static/dist/assets/i18n/es.json | 752 +++ .../gui/static/dist/assets/i18n/es_base.json | 752 +++ .../src/gui/static/dist/assets/i18n/ru.json | 250 + .../src/gui/static/dist/assets/i18n/zh.json | 752 +++ .../gui/static/dist/assets/i18n/zh_base.json | 752 +++ .../gui/static/dist/assets/img/alert-red.png | Bin 0 -> 954 bytes .../static/dist/assets/img/big-error-icon.png | Bin 0 -> 1557 bytes .../dist/assets/img/chevron-right-grey.png | Bin 0 -> 516 bytes .../gui/static/dist/assets/img/close-grey.png | Bin 0 -> 584 bytes .../static/dist/assets/img/delete-grey.png | Bin 0 -> 1620 bytes .../gui/static/dist/assets/img/delete-red.png | Bin 0 -> 1620 bytes .../gui/static/dist/assets/img/edit-blue.png | Bin 0 -> 893 bytes .../gui/static/dist/assets/img/edit-grey.png | Bin 0 -> 909 bytes .../src/gui/static/dist/assets/img/header.png | Bin 0 -> 920348 bytes .../gui/static/dist/assets/img/hw-gold.png | Bin 0 -> 1082 bytes .../gui/static/dist/assets/img/lang/en.png | Bin 0 -> 3229 bytes .../gui/static/dist/assets/img/lang/es.png | Bin 0 -> 2304 bytes .../gui/static/dist/assets/img/lang/ru.png | Bin 0 -> 282 bytes .../gui/static/dist/assets/img/lang/zh.png | Bin 0 -> 1059 bytes .../gui/static/dist/assets/img/link-blue.png | Bin 0 -> 1369 bytes .../gui/static/dist/assets/img/list-blue.png | Bin 0 -> 1164 bytes .../gui/static/dist/assets/img/list-grey.png | Bin 0 -> 1171 bytes .../static/dist/assets/img/list-purple.png | Bin 0 -> 1166 bytes .../gui/static/dist/assets/img/load-gold.png | Bin 0 -> 2014 bytes .../gui/static/dist/assets/img/lock-gold.png | Bin 0 -> 751 bytes .../gui/static/dist/assets/img/lock-grey.png | Bin 0 -> 774 bytes .../gui/static/dist/assets/img/logo-white.png | Bin 0 -> 19670 bytes .../gui/static/dist/assets/img/minus-grey.png | Bin 0 -> 947 bytes .../gui/static/dist/assets/img/minus-red.png | Bin 0 -> 1595 bytes .../gui/static/dist/assets/img/money-gold.png | Bin 0 -> 809 bytes .../static/dist/assets/img/otc-background.jpg | Bin 0 -> 387638 bytes .../gui/static/dist/assets/img/plus-gold.png | Bin 0 -> 1908 bytes .../gui/static/dist/assets/img/plus-green.png | Bin 0 -> 937 bytes .../gui/static/dist/assets/img/plus-grey.png | Bin 0 -> 980 bytes .../static/dist/assets/img/qr-code-black.png | Bin 0 -> 298 bytes .../static/dist/assets/img/received-blue.png | Bin 0 -> 1819 bytes .../static/dist/assets/img/search-gold.png | Bin 0 -> 1753 bytes .../gui/static/dist/assets/img/send-black.png | Bin 0 -> 2001 bytes .../gui/static/dist/assets/img/send-blue.png | Bin 0 -> 783 bytes .../gui/static/dist/assets/img/send-gold.png | Bin 0 -> 908 bytes .../gui/static/dist/assets/img/send-white.png | Bin 0 -> 827 bytes .../gui/static/dist/assets/img/sent-blue.png | Bin 0 -> 1754 bytes .../gui/static/dist/assets/img/size-alert.png | Bin 0 -> 1132 bytes .../static/dist/assets/img/temporal-gold.png | Bin 0 -> 1905 bytes .../static/dist/assets/img/temporal-grey.png | Bin 0 -> 1914 bytes .../dist/assets/img/transactions-black.png | Bin 0 -> 1525 bytes .../static/dist/assets/img/unlock-gold.png | Bin 0 -> 772 bytes .../static/dist/assets/img/unlock-grey.png | Bin 0 -> 1001 bytes .../static/dist/assets/img/wallet-black.png | Bin 0 -> 1493 bytes .../src/gui/static/dist/assets/logo-white.png | Bin 0 -> 119032 bytes .../static/dist/assets/scripts/qrcode.min.js | 1 + .../static/dist/customize/header-gradient.png | Bin 0 -> 1744 bytes .../src/gui/static/dist/customize/header.png | Bin 0 -> 920348 bytes .../gui/static/dist/customize/styling.scss | 16 + .../skycoin/src/gui/static/dist/favicon.ico | Bin 0 -> 15086 bytes ...ntawesome-webfont.1e59d2330b4c6deb84b3.ttf | Bin 0 -> 165548 bytes ...awesome-webfont.20fd1704ea223900efa9.woff2 | Bin 0 -> 77160 bytes ...ntawesome-webfont.674f50d287a8c48dc19b.eot | Bin 0 -> 165742 bytes ...ntawesome-webfont.8b43027f47b20503057d.eot | Bin 0 -> 165742 bytes ...ntawesome-webfont.912ec66d7572ff821749.svg | 2671 ++++++++++ ...awesome-webfont.af7ae505a9eed503f8b8.woff2 | Bin 0 -> 77160 bytes ...ntawesome-webfont.b06871f281fee6b241d6.ttf | Bin 0 -> 165548 bytes ...ntawesome-webfont.c1e38fd9e0e74ba58f7a.svg | 2671 ++++++++++ ...tawesome-webfont.f691f37e57f04c152e23.woff | Bin 0 -> 98024 bytes ...tawesome-webfont.fee66e712a8a08eef580.woff | Bin 0 -> 98024 bytes .../dist/header.03fb33b04c982a1a804d.png | Bin 0 -> 920348 bytes .../dist/header.e11f7c6852766b9319d6.png | Bin 0 -> 284713 bytes .../skycoin/src/gui/static/dist/index.html | 49 + .../inline.2fc97466d3eec1b646d4.bundle.js | 1 + .../static/dist/main.6d10cde83adbac10bc53.js | 1 + .../dist/main.85a0e2e4ac9f36ebc6fd.bundle.js | 1 + .../static/dist/main.b001397656dd94b099f7.js | 1 + .../static/dist/main.c10691d5e28b636af8ce.js | 1 + .../polyfills-es5.2dce468a73eba67421f8.js | 1 + .../polyfills-es5.4b50447e86aeb5a73956.js | 1 + .../polyfills-es5.536f380f70e485dd235a.js | 1 + .../polyfills.44742ea60435cec4c09d.bundle.js | 1 + .../dist/polyfills.99c8da52d65b02b3a1ec.js | 1 + .../dist/polyfills.a40be6a04b40d9da3520.js | 1 + .../dist/polyfills.b345f03b4424b430e9a0.js | 1 + .../dist/runtime.1e5f853b68db4abd1254.js | 1 + .../dist/runtime.7e9d5b3140df80a87e3e.js | 1 + .../dist/runtime.a5ea00cdcbf09f438d85.js | 1 + .../dist/scripts.2778e03caf146da29266.js | 1 + .../scripts.8c1255aec48c8ec38c00.bundle.js | 1 + .../dist/styles.0a54ebf55b758e9dc9cb.css | 14 + .../styles.3072000db951801c187c.bundle.css | 9 + .../dist/styles.3ef0b8e554b94dd4ced7.css | 14 + .../dist/styles.e12d12da5d9fd17e084b.css | 14 + .../skycoin/skycoin/src/kvstorage/empty.go | 5 + .../skycoin/skycoin/src/kvstorage/error.go | 16 + .../skycoin/src/kvstorage/kvstorage.go | 162 + .../skycoin/skycoin/src/kvstorage/manager.go | 252 + .../skycoin/src/kvstorage/manager_config.go | 15 + .../skycoin/skycoin/src/kvstorage/map.go | 12 + .../skycoin/src/params/distribution.go | 153 + .../skycoin/skycoin/src/params/droplet.go | 34 + .../skycoin/skycoin/src/params/init.go | 78 + .../skycoin/skycoin/src/params/params.go | 128 + .../skycoin/skycoin/src/params/verify_txn.go | 55 + .../skycoin/skycoin/src/readable/block.go | 145 + .../skycoin/src/readable/blockchain.go | 58 + .../skycoin/skycoin/src/readable/fiber.go | 17 + .../skycoin/skycoin/src/readable/network.go | 73 + .../skycoin/skycoin/src/readable/output.go | 298 ++ .../skycoin/skycoin/src/readable/page.go | 8 + .../skycoin/skycoin/src/readable/richlist.go | 32 + .../skycoin/src/readable/transaction.go | 254 + .../skycoin/skycoin/src/readable/verbose.go | 258 + .../skycoin/skycoin/src/readable/version.go | 20 + .../skycoin/skycoin/src/readable/wallet.go | 70 + .../skycoin/skycoin/src/skycoin/config.go | 776 +++ .../skycoin/skycoin/src/skycoin/db_check.go | 165 + .../skycoin/skycoin/src/skycoin/skycoin.go | 617 +++ .../skycoin/skycoin/src/transaction/choose.go | 280 + .../skycoin/skycoin/src/transaction/create.go | 505 ++ .../skycoin/src/transaction/distribution.go | 24 + .../skycoin/skycoin/src/transaction/hours.go | 165 + .../skycoin/skycoin/src/transaction/params.go | 155 + .../skycoin/skycoin/src/transaction/verify.go | 339 ++ .../skycoin/src/util/apputil/apputil.go | 56 + .../skycoin/skycoin/src/util/certutil/LICENSE | 15 + .../skycoin/skycoin/src/util/certutil/cert.go | 150 + .../skycoin/src/util/droplet/droplet.go | 95 + .../skycoin/src/util/elapse/elapser.go | 72 + .../skycoin/skycoin/src/util/fee/fee.go | 99 + .../skycoin/skycoin/src/util/file/file.go | 322 ++ .../skycoin/src/util/gziphandler/LICENSE | 22 + .../src/util/gziphandler/gziphandler.go | 53 + .../skycoin/skycoin/src/util/http/error.go | 68 + .../skycoin/skycoin/src/util/http/json.go | 190 + .../skycoin/skycoin/src/util/http/log.go | 75 + .../skycoin/skycoin/src/util/iputil/iputil.go | 66 + .../skycoin/src/util/mathutil/mathutil.go | 81 + .../skycoin/src/util/timeutil/timeutil.go | 15 + .../skycoin/src/util/useragent/useragent.go | 222 + .../skycoin/skycoin/src/visor/blockchain.go | 853 +++ .../src/visor/blockdb/block_skyencoder.go | 513 ++ .../skycoin/src/visor/blockdb/block_tree.go | 269 + .../skycoin/src/visor/blockdb/blockchain.go | 285 + .../skycoin/src/visor/blockdb/blocksigs.go | 69 + .../skycoin/src/visor/blockdb/chain_meta.go | 29 + .../blockdb/hash_pairs_wrapper_skyencoder.go | 141 + .../blockdb/hashes_wrapper_skyencoder.go | 126 + .../visor/blockdb/sig_wrapper_skyencoder.go | 78 + .../skycoin/src/visor/blockdb/unspent.go | 541 ++ .../src/visor/blockdb/ux_out_skyencoder.go | 171 + .../skycoin/src/visor/blockdb/verify.go | 156 + .../skycoin/skycoin/src/visor/config.go | 119 + .../skycoin/skycoin/src/visor/db.go | 401 ++ .../skycoin/src/visor/dbutil/dbutil.go | 363 ++ .../src/visor/historydb/address_txn.go | 79 + .../src/visor/historydb/address_uxout.go | 66 + .../historydb/hashes_wrapper_skyencoder.go | 125 + .../src/visor/historydb/history_meta.go | 36 + .../skycoin/src/visor/historydb/historydb.go | 412 ++ .../skycoin/src/visor/historydb/output.go | 102 + .../src/visor/historydb/transaction.go | 112 + .../visor/historydb/transaction_skyencoder.go | 372 ++ .../src/visor/historydb/ux_out_skyencoder.go | 197 + .../skycoin/src/visor/historydb/verify.go | 129 + .../skycoin/skycoin/src/visor/interfaces.go | 73 + .../skycoin/skycoin/src/visor/meta.go | 71 + .../skycoin/skycoin/src/visor/objects.go | 213 + .../skycoin/skycoin/src/visor/richlist.go | 64 + .../skycoin/src/visor/transaction_model.go | 599 +++ .../skycoin/skycoin/src/visor/unconfirmed.go | 562 ++ .../unconfirmed_transaction_skyencoder.go | 417 ++ .../skycoin/src/visor/ux_array_skyencoder.go | 215 + .../skycoin/skycoin/src/visor/visor.go | 2300 +++++++++ .../skycoin/skycoin/src/visor/wallet.go | 615 +++ .../skycoin/skycoin/src/wallet/balance.go | 87 + .../skycoin/src/wallet/bip44wallet/account.go | 544 ++ .../skycoin/src/wallet/bip44wallet/decoder.go | 268 + .../skycoin/src/wallet/bip44wallet/wallet.go | 906 ++++ .../skycoin/src/wallet/collection/decoder.go | 176 + .../skycoin/src/wallet/collection/wallet.go | 486 ++ .../skycoin/skycoin/src/wallet/creators.go | 53 + .../skycoin/skycoin/src/wallet/decoders.go | 114 + .../src/wallet/deterministic/decoder.go | 178 + .../src/wallet/deterministic/wallet.go | 569 ++ .../skycoin/skycoin/src/wallet/entry.go | 122 + .../skycoin/skycoin/src/wallet/loaders.go | 53 + .../skycoin/skycoin/src/wallet/meta.go | 348 ++ .../skycoin/skycoin/src/wallet/options.go | 183 + .../skycoin/skycoin/src/wallet/secrets.go | 46 + .../skycoin/skycoin/src/wallet/service.go | 870 ++++ .../skycoin/skycoin/src/wallet/transaction.go | 279 + .../skycoin/skycoin/src/wallet/wallet.go | 622 +++ .../skycoin/skycoin/src/wallet/wallets.go | 146 + .../skycoin/src/wallet/xpubwallet/decoder.go | 112 + .../skycoin/src/wallet/xpubwallet/wallet.go | 472 ++ .../github.com/sourcegraph/conc/.golangci.yml | 11 + vendor/github.com/sourcegraph/conc/LICENSE | 21 + vendor/github.com/sourcegraph/conc/README.md | 464 ++ .../internal/multierror/multierror_go119.go | 10 + .../internal/multierror/multierror_go120.go | 10 + .../github.com/sourcegraph/conc/iter/iter.go | 85 + .../github.com/sourcegraph/conc/iter/map.go | 65 + .../sourcegraph/conc/panics/panics.go | 102 + .../github.com/sourcegraph/conc/panics/try.go | 11 + .../github.com/sourcegraph/conc/waitgroup.go | 52 + vendor/github.com/spf13/afero/.gitignore | 2 + vendor/github.com/spf13/afero/LICENSE.txt | 174 + vendor/github.com/spf13/afero/README.md | 442 ++ vendor/github.com/spf13/afero/afero.go | 111 + vendor/github.com/spf13/afero/appveyor.yml | 10 + vendor/github.com/spf13/afero/basepath.go | 222 + .../github.com/spf13/afero/cacheOnReadFs.go | 315 ++ vendor/github.com/spf13/afero/const_bsds.go | 23 + .../github.com/spf13/afero/const_win_unix.go | 22 + .../github.com/spf13/afero/copyOnWriteFs.go | 327 ++ vendor/github.com/spf13/afero/httpFs.go | 114 + .../spf13/afero/internal/common/adapters.go | 27 + vendor/github.com/spf13/afero/iofs.go | 298 ++ vendor/github.com/spf13/afero/ioutil.go | 243 + vendor/github.com/spf13/afero/lstater.go | 27 + vendor/github.com/spf13/afero/match.go | 110 + vendor/github.com/spf13/afero/mem/dir.go | 37 + vendor/github.com/spf13/afero/mem/dirmap.go | 43 + vendor/github.com/spf13/afero/mem/file.go | 359 ++ vendor/github.com/spf13/afero/memmap.go | 465 ++ vendor/github.com/spf13/afero/os.go | 113 + vendor/github.com/spf13/afero/path.go | 106 + vendor/github.com/spf13/afero/readonlyfs.go | 96 + vendor/github.com/spf13/afero/regexpfs.go | 223 + vendor/github.com/spf13/afero/symlink.go | 55 + vendor/github.com/spf13/afero/unionFile.go | 330 ++ vendor/github.com/spf13/afero/util.go | 329 ++ vendor/github.com/spf13/cast/.gitignore | 25 + vendor/github.com/spf13/cast/LICENSE | 21 + vendor/github.com/spf13/cast/Makefile | 40 + vendor/github.com/spf13/cast/README.md | 75 + vendor/github.com/spf13/cast/cast.go | 176 + vendor/github.com/spf13/cast/caste.go | 1510 ++++++ .../spf13/cast/timeformattype_string.go | 27 + vendor/github.com/spf13/viper/.editorconfig | 18 + vendor/github.com/spf13/viper/.envrc | 4 + vendor/github.com/spf13/viper/.gitignore | 8 + vendor/github.com/spf13/viper/.golangci.yaml | 108 + vendor/github.com/spf13/viper/.yamlignore | 2 + vendor/github.com/spf13/viper/.yamllint.yaml | 6 + vendor/github.com/spf13/viper/LICENSE | 21 + vendor/github.com/spf13/viper/Makefile | 87 + vendor/github.com/spf13/viper/README.md | 928 ++++ .../github.com/spf13/viper/TROUBLESHOOTING.md | 32 + vendor/github.com/spf13/viper/file.go | 56 + vendor/github.com/spf13/viper/file_finder.go | 38 + vendor/github.com/spf13/viper/flags.go | 57 + vendor/github.com/spf13/viper/flake.lock | 273 + vendor/github.com/spf13/viper/flake.nix | 57 + .../spf13/viper/internal/encoding/decoder.go | 61 + .../viper/internal/encoding/dotenv/codec.go | 61 + .../internal/encoding/dotenv/map_utils.go | 41 + .../spf13/viper/internal/encoding/encoder.go | 60 + .../spf13/viper/internal/encoding/error.go | 7 + .../viper/internal/encoding/hcl/codec.go | 40 + .../viper/internal/encoding/ini/codec.go | 99 + .../viper/internal/encoding/ini/map_utils.go | 74 + .../internal/encoding/javaproperties/codec.go | 86 + .../encoding/javaproperties/map_utils.go | 74 + .../viper/internal/encoding/json/codec.go | 17 + .../viper/internal/encoding/toml/codec.go | 16 + .../viper/internal/encoding/yaml/codec.go | 14 + .../viper/internal/features/bind_struct.go | 5 + .../internal/features/bind_struct_default.go | 5 + vendor/github.com/spf13/viper/logger.go | 68 + vendor/github.com/spf13/viper/util.go | 223 + vendor/github.com/spf13/viper/viper.go | 2252 ++++++++ vendor/github.com/subosito/gotenv/.env | 1 + .../github.com/subosito/gotenv/.env.invalid | 1 + vendor/github.com/subosito/gotenv/.gitignore | 4 + .../github.com/subosito/gotenv/.golangci.yaml | 7 + .../github.com/subosito/gotenv/CHANGELOG.md | 105 + vendor/github.com/subosito/gotenv/LICENSE | 21 + vendor/github.com/subosito/gotenv/README.md | 129 + vendor/github.com/subosito/gotenv/gotenv.go | 409 ++ vendor/go.uber.org/multierr/.codecov.yml | 15 + vendor/go.uber.org/multierr/.gitignore | 4 + vendor/go.uber.org/multierr/CHANGELOG.md | 95 + vendor/go.uber.org/multierr/LICENSE.txt | 19 + vendor/go.uber.org/multierr/Makefile | 38 + vendor/go.uber.org/multierr/README.md | 43 + vendor/go.uber.org/multierr/error.go | 646 +++ .../go.uber.org/multierr/error_post_go120.go | 48 + .../go.uber.org/multierr/error_pre_go120.go | 79 + .../x/exp/constraints/constraints.go | 50 + vendor/golang.org/x/exp/slices/cmp.go | 44 + vendor/golang.org/x/exp/slices/slices.go | 515 ++ vendor/golang.org/x/exp/slices/sort.go | 197 + .../golang.org/x/exp/slices/zsortanyfunc.go | 479 ++ .../golang.org/x/exp/slices/zsortordered.go | 481 ++ vendor/golang.org/x/exp/slog/attr.go | 102 + vendor/golang.org/x/exp/slog/doc.go | 316 ++ vendor/golang.org/x/exp/slog/handler.go | 577 +++ .../x/exp/slog/internal/buffer/buffer.go | 84 + .../x/exp/slog/internal/ignorepc.go | 9 + vendor/golang.org/x/exp/slog/json_handler.go | 336 ++ vendor/golang.org/x/exp/slog/level.go | 201 + vendor/golang.org/x/exp/slog/logger.go | 343 ++ vendor/golang.org/x/exp/slog/noplog.bench | 36 + vendor/golang.org/x/exp/slog/record.go | 207 + vendor/golang.org/x/exp/slog/text_handler.go | 161 + vendor/golang.org/x/exp/slog/value.go | 456 ++ vendor/golang.org/x/exp/slog/value_119.go | 53 + vendor/golang.org/x/exp/slog/value_120.go | 39 + vendor/golang.org/x/text/encoding/encoding.go | 335 ++ .../internal/identifier/identifier.go | 81 + .../text/encoding/internal/identifier/mib.go | 1627 ++++++ .../x/text/encoding/internal/internal.go | 75 + .../x/text/encoding/unicode/override.go | 82 + .../x/text/encoding/unicode/unicode.go | 512 ++ .../internal/utf8internal/utf8internal.go | 87 + vendor/gopkg.in/ini.v1/.editorconfig | 12 + vendor/gopkg.in/ini.v1/.gitignore | 7 + vendor/gopkg.in/ini.v1/.golangci.yml | 27 + vendor/gopkg.in/ini.v1/LICENSE | 191 + vendor/gopkg.in/ini.v1/Makefile | 15 + vendor/gopkg.in/ini.v1/README.md | 43 + vendor/gopkg.in/ini.v1/codecov.yml | 16 + vendor/gopkg.in/ini.v1/data_source.go | 76 + vendor/gopkg.in/ini.v1/deprecated.go | 22 + vendor/gopkg.in/ini.v1/error.go | 49 + vendor/gopkg.in/ini.v1/file.go | 541 ++ vendor/gopkg.in/ini.v1/helper.go | 24 + vendor/gopkg.in/ini.v1/ini.go | 176 + vendor/gopkg.in/ini.v1/key.go | 837 +++ vendor/gopkg.in/ini.v1/parser.go | 520 ++ vendor/gopkg.in/ini.v1/section.go | 256 + vendor/gopkg.in/ini.v1/struct.go | 747 +++ vendor/modules.txt | 147 +- 711 files changed, 151053 insertions(+), 53 deletions(-) create mode 100644 cmd/skycoin-skywire/README.md create mode 100644 cmd/skycoin-skywire/commands/root.go create mode 100644 cmd/skycoin-skywire/skywire.go create mode 100644 vendor/github.com/blang/semver/.travis.yml create mode 100644 vendor/github.com/blang/semver/LICENSE create mode 100644 vendor/github.com/blang/semver/README.md create mode 100644 vendor/github.com/blang/semver/json.go create mode 100644 vendor/github.com/blang/semver/package.json create mode 100644 vendor/github.com/blang/semver/range.go create mode 100644 vendor/github.com/blang/semver/semver.go create mode 100644 vendor/github.com/blang/semver/sort.go create mode 100644 vendor/github.com/blang/semver/sql.go create mode 100644 vendor/github.com/boltdb/bolt/.gitignore create mode 100644 vendor/github.com/boltdb/bolt/LICENSE create mode 100644 vendor/github.com/boltdb/bolt/Makefile create mode 100644 vendor/github.com/boltdb/bolt/README.md create mode 100644 vendor/github.com/boltdb/bolt/appveyor.yml create mode 100644 vendor/github.com/boltdb/bolt/bolt_386.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_amd64.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_arm.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_arm64.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_linux.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_openbsd.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_ppc.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_ppc64.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_ppc64le.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_s390x.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_unix.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_unix_solaris.go create mode 100644 vendor/github.com/boltdb/bolt/bolt_windows.go create mode 100644 vendor/github.com/boltdb/bolt/boltsync_unix.go create mode 100644 vendor/github.com/boltdb/bolt/bucket.go create mode 100644 vendor/github.com/boltdb/bolt/cursor.go create mode 100644 vendor/github.com/boltdb/bolt/db.go create mode 100644 vendor/github.com/boltdb/bolt/doc.go create mode 100644 vendor/github.com/boltdb/bolt/errors.go create mode 100644 vendor/github.com/boltdb/bolt/freelist.go create mode 100644 vendor/github.com/boltdb/bolt/node.go create mode 100644 vendor/github.com/boltdb/bolt/page.go create mode 100644 vendor/github.com/boltdb/bolt/tx.go create mode 100644 vendor/github.com/cenkalti/backoff/.gitignore create mode 100644 vendor/github.com/cenkalti/backoff/.travis.yml create mode 100644 vendor/github.com/cenkalti/backoff/LICENSE create mode 100644 vendor/github.com/cenkalti/backoff/README.md create mode 100644 vendor/github.com/cenkalti/backoff/backoff.go create mode 100644 vendor/github.com/cenkalti/backoff/context.go create mode 100644 vendor/github.com/cenkalti/backoff/exponential.go create mode 100644 vendor/github.com/cenkalti/backoff/retry.go create mode 100644 vendor/github.com/cenkalti/backoff/ticker.go create mode 100644 vendor/github.com/cenkalti/backoff/tries.go create mode 100644 vendor/github.com/fsnotify/fsnotify/.cirrus.yml create mode 100644 vendor/github.com/fsnotify/fsnotify/.editorconfig create mode 100644 vendor/github.com/fsnotify/fsnotify/.gitattributes create mode 100644 vendor/github.com/fsnotify/fsnotify/.gitignore create mode 100644 vendor/github.com/fsnotify/fsnotify/.mailmap create mode 100644 vendor/github.com/fsnotify/fsnotify/CHANGELOG.md create mode 100644 vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md create mode 100644 vendor/github.com/fsnotify/fsnotify/LICENSE create mode 100644 vendor/github.com/fsnotify/fsnotify/README.md create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_fen.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_inotify.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_kqueue.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_other.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_windows.go create mode 100644 vendor/github.com/fsnotify/fsnotify/fsnotify.go create mode 100644 vendor/github.com/fsnotify/fsnotify/mkdoc.zsh create mode 100644 vendor/github.com/fsnotify/fsnotify/system_bsd.go create mode 100644 vendor/github.com/fsnotify/fsnotify/system_darwin.go create mode 100644 vendor/github.com/hashicorp/hcl/.gitignore create mode 100644 vendor/github.com/hashicorp/hcl/.travis.yml create mode 100644 vendor/github.com/hashicorp/hcl/LICENSE create mode 100644 vendor/github.com/hashicorp/hcl/Makefile create mode 100644 vendor/github.com/hashicorp/hcl/README.md create mode 100644 vendor/github.com/hashicorp/hcl/appveyor.yml create mode 100644 vendor/github.com/hashicorp/hcl/decoder.go create mode 100644 vendor/github.com/hashicorp/hcl/hcl.go create mode 100644 vendor/github.com/hashicorp/hcl/hcl/ast/ast.go create mode 100644 vendor/github.com/hashicorp/hcl/hcl/ast/walk.go create mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/error.go create mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/parser.go create mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go create mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/printer.go create mode 100644 vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go create mode 100644 vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go create mode 100644 vendor/github.com/hashicorp/hcl/hcl/token/position.go create mode 100644 vendor/github.com/hashicorp/hcl/hcl/token/token.go create mode 100644 vendor/github.com/hashicorp/hcl/json/parser/flatten.go create mode 100644 vendor/github.com/hashicorp/hcl/json/parser/parser.go create mode 100644 vendor/github.com/hashicorp/hcl/json/scanner/scanner.go create mode 100644 vendor/github.com/hashicorp/hcl/json/token/position.go create mode 100644 vendor/github.com/hashicorp/hcl/json/token/token.go create mode 100644 vendor/github.com/hashicorp/hcl/lex.go create mode 100644 vendor/github.com/hashicorp/hcl/parse.go create mode 100644 vendor/github.com/magiconair/properties/.gitignore create mode 100644 vendor/github.com/magiconair/properties/CHANGELOG.md create mode 100644 vendor/github.com/magiconair/properties/LICENSE.md create mode 100644 vendor/github.com/magiconair/properties/README.md create mode 100644 vendor/github.com/magiconair/properties/decode.go create mode 100644 vendor/github.com/magiconair/properties/doc.go create mode 100644 vendor/github.com/magiconair/properties/integrate.go create mode 100644 vendor/github.com/magiconair/properties/lex.go create mode 100644 vendor/github.com/magiconair/properties/load.go create mode 100644 vendor/github.com/magiconair/properties/parser.go create mode 100644 vendor/github.com/magiconair/properties/properties.go create mode 100644 vendor/github.com/magiconair/properties/rangecheck.go create mode 100644 vendor/github.com/mitchellh/mapstructure/CHANGELOG.md create mode 100644 vendor/github.com/mitchellh/mapstructure/LICENSE create mode 100644 vendor/github.com/mitchellh/mapstructure/README.md create mode 100644 vendor/github.com/mitchellh/mapstructure/decode_hooks.go create mode 100644 vendor/github.com/mitchellh/mapstructure/error.go create mode 100644 vendor/github.com/mitchellh/mapstructure/mapstructure.go create mode 100644 vendor/github.com/sagikazarmark/locafero/.editorconfig create mode 100644 vendor/github.com/sagikazarmark/locafero/.envrc create mode 100644 vendor/github.com/sagikazarmark/locafero/.gitignore create mode 100644 vendor/github.com/sagikazarmark/locafero/.golangci.yaml create mode 100644 vendor/github.com/sagikazarmark/locafero/LICENSE create mode 100644 vendor/github.com/sagikazarmark/locafero/README.md create mode 100644 vendor/github.com/sagikazarmark/locafero/file_type.go create mode 100644 vendor/github.com/sagikazarmark/locafero/finder.go create mode 100644 vendor/github.com/sagikazarmark/locafero/flake.lock create mode 100644 vendor/github.com/sagikazarmark/locafero/flake.nix create mode 100644 vendor/github.com/sagikazarmark/locafero/glob.go create mode 100644 vendor/github.com/sagikazarmark/locafero/glob_windows.go create mode 100644 vendor/github.com/sagikazarmark/locafero/helpers.go create mode 100644 vendor/github.com/sagikazarmark/locafero/justfile create mode 100644 vendor/github.com/sagikazarmark/slog-shim/.editorconfig create mode 100644 vendor/github.com/sagikazarmark/slog-shim/.envrc create mode 100644 vendor/github.com/sagikazarmark/slog-shim/.gitignore create mode 100644 vendor/github.com/sagikazarmark/slog-shim/LICENSE create mode 100644 vendor/github.com/sagikazarmark/slog-shim/README.md create mode 100644 vendor/github.com/sagikazarmark/slog-shim/attr.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/attr_120.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/flake.lock create mode 100644 vendor/github.com/sagikazarmark/slog-shim/flake.nix create mode 100644 vendor/github.com/sagikazarmark/slog-shim/handler.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/handler_120.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/json_handler.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/json_handler_120.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/level.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/level_120.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/logger.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/logger_120.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/record.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/record_120.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/text_handler.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/text_handler_120.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/value.go create mode 100644 vendor/github.com/sagikazarmark/slog-shim/value_120.go create mode 100644 vendor/github.com/shopspring/decimal/.gitignore create mode 100644 vendor/github.com/shopspring/decimal/CHANGELOG.md create mode 100644 vendor/github.com/shopspring/decimal/LICENSE create mode 100644 vendor/github.com/shopspring/decimal/README.md create mode 100644 vendor/github.com/shopspring/decimal/const.go create mode 100644 vendor/github.com/shopspring/decimal/decimal-go.go create mode 100644 vendor/github.com/shopspring/decimal/decimal.go create mode 100644 vendor/github.com/shopspring/decimal/rounding.go create mode 100644 vendor/github.com/skycoin/skycoin/.dockerignore create mode 100644 vendor/github.com/skycoin/skycoin/.editorconfig create mode 100644 vendor/github.com/skycoin/skycoin/.gitignore create mode 100644 vendor/github.com/skycoin/skycoin/.golangci.yml create mode 100644 vendor/github.com/skycoin/skycoin/CHANGELOG.md create mode 100644 vendor/github.com/skycoin/skycoin/INSTALLATION.md create mode 100644 vendor/github.com/skycoin/skycoin/INTEGRATION.md create mode 100644 vendor/github.com/skycoin/skycoin/Makefile create mode 100644 vendor/github.com/skycoin/skycoin/README.md create mode 100644 vendor/github.com/skycoin/skycoin/cmd/newcoin/commands/root.go create mode 100644 vendor/github.com/skycoin/skycoin/cmd/skycoin-cli/commands/root.go create mode 100644 vendor/github.com/skycoin/skycoin/cmd/skycoin-wallet/commands/root.go create mode 100644 vendor/github.com/skycoin/skycoin/cmd/skycoin/commands/root.go create mode 100644 vendor/github.com/skycoin/skycoin/docker_launcher.sh create mode 100644 vendor/github.com/skycoin/skycoin/fiber.toml create mode 100644 vendor/github.com/skycoin/skycoin/iketheadore.asc create mode 100644 vendor/github.com/skycoin/skycoin/peers.txt create mode 100644 vendor/github.com/skycoin/skycoin/run-client.sh create mode 100644 vendor/github.com/skycoin/skycoin/run-daemon.sh create mode 100644 vendor/github.com/skycoin/skycoin/skycoin.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/README.md create mode 100644 vendor/github.com/skycoin/skycoin/src/api/address.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/blockchain.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/client.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/csrf.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/explorer.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/gateway.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/health.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/http.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/middleware.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/network.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/outputs.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/spend.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/storage.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/transaction.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/uxout.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/version.go create mode 100644 vendor/github.com/skycoin/skycoin/src/api/wallet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip32/LICENSE create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip32/README.md create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip32/bip32.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip32/path.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip32/utils.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip39/LICENSE create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip39/README.md create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip39/bip39.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/chinese_simplified.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/chinese_traditional.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/english.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/french.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/italian.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/japanese.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/korean.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/spanish.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/bip44/bip44.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.s create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/crypto/crypto.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/encoder/README.md create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/encoder/encoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/encrypt/sha256xor.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/pbkdf2/pbkdf2.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/poly1305/poly1305.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.s create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.s create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_ref.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cipher/scrypt/scrypt.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/add_private_key.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/address_gen.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/addresscount.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/blocks.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/broadcast_rawtx.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/check_balance.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/checkdb.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/cli.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/create_rawtx.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/decrypt_wallet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/distribute_genesis.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/encrypt_wallet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/generate_addrs.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/generate_wallet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/last_blocks.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/list_addrs.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/list_wallets.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/outputs.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/richlist.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/scan_addrs.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/send.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/show_seed.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/status.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/transaction.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/verify_address.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/version.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/wallet_history.go create mode 100644 vendor/github.com/skycoin/skycoin/src/cli/wallet_key_export.go create mode 100644 vendor/github.com/skycoin/skycoin/src/coin/block.go create mode 100644 vendor/github.com/skycoin/skycoin/src/coin/block_body_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/coin/block_header_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/coin/outputs.go create mode 100644 vendor/github.com/skycoin/skycoin/src/coin/transaction_inputs_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/coin/transaction_outputs_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/coin/transaction_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/coin/transactions.go create mode 100644 vendor/github.com/skycoin/skycoin/src/coin/ux_body_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/coin/ux_head_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/announce_blocks_message_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/announce_txns_message_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/announced_txns.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/connections.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/daemon.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/disconnect_message_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/errors.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/get_blocks_message_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/get_txns_message_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/give_blocks_message_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/give_peers_message_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/give_txns_message_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/gnet/README.md create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/gnet/dispatcher.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/gnet/message.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/gnet/pool.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/introduction_message_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/ip_addr_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/messages.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/pex/README.md create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/pex/peerlist.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/pex/pex.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/pool.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/signed_block_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/strand/strand.go create mode 100644 vendor/github.com/skycoin/skycoin/src/daemon/transaction_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/fiber/config.go create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/0.d5967d50848818a3b5b3.chunk.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.7e4369252841c80f4cac.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.bf6ae8acc706c3217da3.chunk.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.fff400d64f7210ba95bd.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/11.020fa0852ac300d8fd70.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/11.254b5afd8c604835170d.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/118.c125ed41f2fd9967c716.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.af5e2fa6c65ff6f39739.chunk.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.e99a3fcb8d9c8f814e72.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.ffa4899fe52b74655a98.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.48d5cf3cd51fcbe131a5.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.94cd60a03904447d91d6.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.b1328f7fc5fe260edda4.chunk.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/3rdpartylicenses.txt create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.044e43d2fce319e7ba13.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.6fa8f54aba27f0eba2c9.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.7f8f58ff3f30291666bf.chunk.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/403.bf84efb5e25e9ed81d23.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/478.20842158e3db8ad2787f.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.2e4f5db4750af0606fed.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.63460ae96b986f20f8dc.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.a2cdc3b5d1d15440fa16.chunk.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/526.f76257ac8fde4c59c131.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.86e4e580e25082578bb8.chunk.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.ba3a26d3a7fe46a61514.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.ecbc64c3f043e17d66b5.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/736.fa2bb87eeea79bc4242a.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/813.1a1a8e09f2bd06a481f1.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/875.b9a2a5c7c242dbc194f6.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.4674f8ded773cb03e824.eot create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.5e7382c63da0098d634a.ttf create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.83bebaf37c09c7e1c3ee.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.cff684e59ffb052d72cb.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Light.4be01e4a68be8bf590da.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Light.770b27ec05c2f97a1a27.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9947360f79b09132fd21.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/bip39-word-list.json create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/error-alert/big-error-icon.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/error-alert/index.html create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/header.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/README.md create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/app1.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/app2.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/check.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/en.json create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/es.json create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/es_base.json create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/ru.json create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/zh.json create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/zh_base.json create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/alert-red.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/big-error-icon.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/close-grey.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/delete-grey.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/delete-red.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/edit-blue.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/edit-grey.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/header.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/hw-gold.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lang/en.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lang/es.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lang/ru.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lang/zh.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/link-blue.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/list-blue.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/list-grey.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/list-purple.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/load-gold.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lock-gold.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lock-grey.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/logo-white.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/minus-grey.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/minus-red.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/money-gold.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/otc-background.jpg create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-gold.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-green.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-grey.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/qr-code-black.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/received-blue.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/search-gold.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-black.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-blue.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-gold.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-white.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/sent-blue.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/size-alert.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/temporal-gold.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/temporal-grey.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/transactions-black.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/unlock-gold.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/unlock-grey.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/wallet-black.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/logo-white.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/customize/header-gradient.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/customize/header.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/customize/styling.scss create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/favicon.ico create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.1e59d2330b4c6deb84b3.ttf create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.20fd1704ea223900efa9.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.8b43027f47b20503057d.eot create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.912ec66d7572ff821749.svg create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.c1e38fd9e0e74ba58f7a.svg create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.f691f37e57f04c152e23.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/header.e11f7c6852766b9319d6.png create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/index.html create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/inline.2fc97466d3eec1b646d4.bundle.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.6d10cde83adbac10bc53.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.85a0e2e4ac9f36ebc6fd.bundle.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.b001397656dd94b099f7.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.c10691d5e28b636af8ce.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills-es5.2dce468a73eba67421f8.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills-es5.4b50447e86aeb5a73956.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills-es5.536f380f70e485dd235a.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills.44742ea60435cec4c09d.bundle.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills.99c8da52d65b02b3a1ec.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills.a40be6a04b40d9da3520.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills.b345f03b4424b430e9a0.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/runtime.1e5f853b68db4abd1254.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/runtime.7e9d5b3140df80a87e3e.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/runtime.a5ea00cdcbf09f438d85.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/scripts.2778e03caf146da29266.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/scripts.8c1255aec48c8ec38c00.bundle.js create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.0a54ebf55b758e9dc9cb.css create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.3072000db951801c187c.bundle.css create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.3ef0b8e554b94dd4ced7.css create mode 100644 vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.e12d12da5d9fd17e084b.css create mode 100644 vendor/github.com/skycoin/skycoin/src/kvstorage/empty.go create mode 100644 vendor/github.com/skycoin/skycoin/src/kvstorage/error.go create mode 100644 vendor/github.com/skycoin/skycoin/src/kvstorage/kvstorage.go create mode 100644 vendor/github.com/skycoin/skycoin/src/kvstorage/manager.go create mode 100644 vendor/github.com/skycoin/skycoin/src/kvstorage/manager_config.go create mode 100644 vendor/github.com/skycoin/skycoin/src/kvstorage/map.go create mode 100644 vendor/github.com/skycoin/skycoin/src/params/distribution.go create mode 100644 vendor/github.com/skycoin/skycoin/src/params/droplet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/params/init.go create mode 100644 vendor/github.com/skycoin/skycoin/src/params/params.go create mode 100644 vendor/github.com/skycoin/skycoin/src/params/verify_txn.go create mode 100644 vendor/github.com/skycoin/skycoin/src/readable/block.go create mode 100644 vendor/github.com/skycoin/skycoin/src/readable/blockchain.go create mode 100644 vendor/github.com/skycoin/skycoin/src/readable/fiber.go create mode 100644 vendor/github.com/skycoin/skycoin/src/readable/network.go create mode 100644 vendor/github.com/skycoin/skycoin/src/readable/output.go create mode 100644 vendor/github.com/skycoin/skycoin/src/readable/page.go create mode 100644 vendor/github.com/skycoin/skycoin/src/readable/richlist.go create mode 100644 vendor/github.com/skycoin/skycoin/src/readable/transaction.go create mode 100644 vendor/github.com/skycoin/skycoin/src/readable/verbose.go create mode 100644 vendor/github.com/skycoin/skycoin/src/readable/version.go create mode 100644 vendor/github.com/skycoin/skycoin/src/readable/wallet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/skycoin/config.go create mode 100644 vendor/github.com/skycoin/skycoin/src/skycoin/db_check.go create mode 100644 vendor/github.com/skycoin/skycoin/src/skycoin/skycoin.go create mode 100644 vendor/github.com/skycoin/skycoin/src/transaction/choose.go create mode 100644 vendor/github.com/skycoin/skycoin/src/transaction/create.go create mode 100644 vendor/github.com/skycoin/skycoin/src/transaction/distribution.go create mode 100644 vendor/github.com/skycoin/skycoin/src/transaction/hours.go create mode 100644 vendor/github.com/skycoin/skycoin/src/transaction/params.go create mode 100644 vendor/github.com/skycoin/skycoin/src/transaction/verify.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/apputil/apputil.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/certutil/LICENSE create mode 100644 vendor/github.com/skycoin/skycoin/src/util/certutil/cert.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/droplet/droplet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/elapse/elapser.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/fee/fee.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/file/file.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/gziphandler/LICENSE create mode 100644 vendor/github.com/skycoin/skycoin/src/util/gziphandler/gziphandler.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/http/error.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/http/json.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/http/log.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/iputil/iputil.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/mathutil/mathutil.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/timeutil/timeutil.go create mode 100644 vendor/github.com/skycoin/skycoin/src/util/useragent/useragent.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockchain.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_tree.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockdb/blockchain.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockdb/blocksigs.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockdb/chain_meta.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockdb/sig_wrapper_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockdb/unspent.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockdb/ux_out_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/blockdb/verify.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/config.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/db.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/dbutil/dbutil.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/historydb/address_txn.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/historydb/address_uxout.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/historydb/hashes_wrapper_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/historydb/history_meta.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/historydb/historydb.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/historydb/output.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/historydb/ux_out_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/historydb/verify.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/interfaces.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/meta.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/objects.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/richlist.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/transaction_model.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/unconfirmed.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/unconfirmed_transaction_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/ux_array_skyencoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/visor.go create mode 100644 vendor/github.com/skycoin/skycoin/src/visor/wallet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/balance.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/account.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/decoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/wallet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/collection/decoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/collection/wallet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/creators.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/decoders.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/deterministic/decoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/deterministic/wallet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/entry.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/loaders.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/meta.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/options.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/secrets.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/service.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/transaction.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/wallet.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/wallets.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/xpubwallet/decoder.go create mode 100644 vendor/github.com/skycoin/skycoin/src/wallet/xpubwallet/wallet.go create mode 100644 vendor/github.com/sourcegraph/conc/.golangci.yml create mode 100644 vendor/github.com/sourcegraph/conc/LICENSE create mode 100644 vendor/github.com/sourcegraph/conc/README.md create mode 100644 vendor/github.com/sourcegraph/conc/internal/multierror/multierror_go119.go create mode 100644 vendor/github.com/sourcegraph/conc/internal/multierror/multierror_go120.go create mode 100644 vendor/github.com/sourcegraph/conc/iter/iter.go create mode 100644 vendor/github.com/sourcegraph/conc/iter/map.go create mode 100644 vendor/github.com/sourcegraph/conc/panics/panics.go create mode 100644 vendor/github.com/sourcegraph/conc/panics/try.go create mode 100644 vendor/github.com/sourcegraph/conc/waitgroup.go create mode 100644 vendor/github.com/spf13/afero/.gitignore create mode 100644 vendor/github.com/spf13/afero/LICENSE.txt create mode 100644 vendor/github.com/spf13/afero/README.md create mode 100644 vendor/github.com/spf13/afero/afero.go create mode 100644 vendor/github.com/spf13/afero/appveyor.yml create mode 100644 vendor/github.com/spf13/afero/basepath.go create mode 100644 vendor/github.com/spf13/afero/cacheOnReadFs.go create mode 100644 vendor/github.com/spf13/afero/const_bsds.go create mode 100644 vendor/github.com/spf13/afero/const_win_unix.go create mode 100644 vendor/github.com/spf13/afero/copyOnWriteFs.go create mode 100644 vendor/github.com/spf13/afero/httpFs.go create mode 100644 vendor/github.com/spf13/afero/internal/common/adapters.go create mode 100644 vendor/github.com/spf13/afero/iofs.go create mode 100644 vendor/github.com/spf13/afero/ioutil.go create mode 100644 vendor/github.com/spf13/afero/lstater.go create mode 100644 vendor/github.com/spf13/afero/match.go create mode 100644 vendor/github.com/spf13/afero/mem/dir.go create mode 100644 vendor/github.com/spf13/afero/mem/dirmap.go create mode 100644 vendor/github.com/spf13/afero/mem/file.go create mode 100644 vendor/github.com/spf13/afero/memmap.go create mode 100644 vendor/github.com/spf13/afero/os.go create mode 100644 vendor/github.com/spf13/afero/path.go create mode 100644 vendor/github.com/spf13/afero/readonlyfs.go create mode 100644 vendor/github.com/spf13/afero/regexpfs.go create mode 100644 vendor/github.com/spf13/afero/symlink.go create mode 100644 vendor/github.com/spf13/afero/unionFile.go create mode 100644 vendor/github.com/spf13/afero/util.go create mode 100644 vendor/github.com/spf13/cast/.gitignore create mode 100644 vendor/github.com/spf13/cast/LICENSE create mode 100644 vendor/github.com/spf13/cast/Makefile create mode 100644 vendor/github.com/spf13/cast/README.md create mode 100644 vendor/github.com/spf13/cast/cast.go create mode 100644 vendor/github.com/spf13/cast/caste.go create mode 100644 vendor/github.com/spf13/cast/timeformattype_string.go create mode 100644 vendor/github.com/spf13/viper/.editorconfig create mode 100644 vendor/github.com/spf13/viper/.envrc create mode 100644 vendor/github.com/spf13/viper/.gitignore create mode 100644 vendor/github.com/spf13/viper/.golangci.yaml create mode 100644 vendor/github.com/spf13/viper/.yamlignore create mode 100644 vendor/github.com/spf13/viper/.yamllint.yaml create mode 100644 vendor/github.com/spf13/viper/LICENSE create mode 100644 vendor/github.com/spf13/viper/Makefile create mode 100644 vendor/github.com/spf13/viper/README.md create mode 100644 vendor/github.com/spf13/viper/TROUBLESHOOTING.md create mode 100644 vendor/github.com/spf13/viper/file.go create mode 100644 vendor/github.com/spf13/viper/file_finder.go create mode 100644 vendor/github.com/spf13/viper/flags.go create mode 100644 vendor/github.com/spf13/viper/flake.lock create mode 100644 vendor/github.com/spf13/viper/flake.nix create mode 100644 vendor/github.com/spf13/viper/internal/encoding/decoder.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/dotenv/codec.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/dotenv/map_utils.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/encoder.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/error.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/hcl/codec.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/ini/codec.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/ini/map_utils.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/javaproperties/codec.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/javaproperties/map_utils.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/json/codec.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/toml/codec.go create mode 100644 vendor/github.com/spf13/viper/internal/encoding/yaml/codec.go create mode 100644 vendor/github.com/spf13/viper/internal/features/bind_struct.go create mode 100644 vendor/github.com/spf13/viper/internal/features/bind_struct_default.go create mode 100644 vendor/github.com/spf13/viper/logger.go create mode 100644 vendor/github.com/spf13/viper/util.go create mode 100644 vendor/github.com/spf13/viper/viper.go create mode 100644 vendor/github.com/subosito/gotenv/.env create mode 100644 vendor/github.com/subosito/gotenv/.env.invalid create mode 100644 vendor/github.com/subosito/gotenv/.gitignore create mode 100644 vendor/github.com/subosito/gotenv/.golangci.yaml create mode 100644 vendor/github.com/subosito/gotenv/CHANGELOG.md create mode 100644 vendor/github.com/subosito/gotenv/LICENSE create mode 100644 vendor/github.com/subosito/gotenv/README.md create mode 100644 vendor/github.com/subosito/gotenv/gotenv.go create mode 100644 vendor/go.uber.org/multierr/.codecov.yml create mode 100644 vendor/go.uber.org/multierr/.gitignore create mode 100644 vendor/go.uber.org/multierr/CHANGELOG.md create mode 100644 vendor/go.uber.org/multierr/LICENSE.txt create mode 100644 vendor/go.uber.org/multierr/Makefile create mode 100644 vendor/go.uber.org/multierr/README.md create mode 100644 vendor/go.uber.org/multierr/error.go create mode 100644 vendor/go.uber.org/multierr/error_post_go120.go create mode 100644 vendor/go.uber.org/multierr/error_pre_go120.go create mode 100644 vendor/golang.org/x/exp/constraints/constraints.go create mode 100644 vendor/golang.org/x/exp/slices/cmp.go create mode 100644 vendor/golang.org/x/exp/slices/slices.go create mode 100644 vendor/golang.org/x/exp/slices/sort.go create mode 100644 vendor/golang.org/x/exp/slices/zsortanyfunc.go create mode 100644 vendor/golang.org/x/exp/slices/zsortordered.go create mode 100644 vendor/golang.org/x/exp/slog/attr.go create mode 100644 vendor/golang.org/x/exp/slog/doc.go create mode 100644 vendor/golang.org/x/exp/slog/handler.go create mode 100644 vendor/golang.org/x/exp/slog/internal/buffer/buffer.go create mode 100644 vendor/golang.org/x/exp/slog/internal/ignorepc.go create mode 100644 vendor/golang.org/x/exp/slog/json_handler.go create mode 100644 vendor/golang.org/x/exp/slog/level.go create mode 100644 vendor/golang.org/x/exp/slog/logger.go create mode 100644 vendor/golang.org/x/exp/slog/noplog.bench create mode 100644 vendor/golang.org/x/exp/slog/record.go create mode 100644 vendor/golang.org/x/exp/slog/text_handler.go create mode 100644 vendor/golang.org/x/exp/slog/value.go create mode 100644 vendor/golang.org/x/exp/slog/value_119.go create mode 100644 vendor/golang.org/x/exp/slog/value_120.go create mode 100644 vendor/golang.org/x/text/encoding/encoding.go create mode 100644 vendor/golang.org/x/text/encoding/internal/identifier/identifier.go create mode 100644 vendor/golang.org/x/text/encoding/internal/identifier/mib.go create mode 100644 vendor/golang.org/x/text/encoding/internal/internal.go create mode 100644 vendor/golang.org/x/text/encoding/unicode/override.go create mode 100644 vendor/golang.org/x/text/encoding/unicode/unicode.go create mode 100644 vendor/golang.org/x/text/internal/utf8internal/utf8internal.go create mode 100644 vendor/gopkg.in/ini.v1/.editorconfig create mode 100644 vendor/gopkg.in/ini.v1/.gitignore create mode 100644 vendor/gopkg.in/ini.v1/.golangci.yml create mode 100644 vendor/gopkg.in/ini.v1/LICENSE create mode 100644 vendor/gopkg.in/ini.v1/Makefile create mode 100644 vendor/gopkg.in/ini.v1/README.md create mode 100644 vendor/gopkg.in/ini.v1/codecov.yml create mode 100644 vendor/gopkg.in/ini.v1/data_source.go create mode 100644 vendor/gopkg.in/ini.v1/deprecated.go create mode 100644 vendor/gopkg.in/ini.v1/error.go create mode 100644 vendor/gopkg.in/ini.v1/file.go create mode 100644 vendor/gopkg.in/ini.v1/helper.go create mode 100644 vendor/gopkg.in/ini.v1/ini.go create mode 100644 vendor/gopkg.in/ini.v1/key.go create mode 100644 vendor/gopkg.in/ini.v1/parser.go create mode 100644 vendor/gopkg.in/ini.v1/section.go create mode 100644 vendor/gopkg.in/ini.v1/struct.go diff --git a/cmd/skycoin-skywire/README.md b/cmd/skycoin-skywire/README.md new file mode 100644 index 0000000000..be2ce6eca2 --- /dev/null +++ b/cmd/skycoin-skywire/README.md @@ -0,0 +1,3023 @@ +# Skywire Merged Binary + + +# skywire documentation + +## subcommand tree + +A tree representation of the skywire subcommands + +``` +└─┬skywire + ├──visor + ├─┬cli + │ ├─┬config + │ │ ├──gen + │ │ ├──gen-keys + │ │ ├──check-pk + │ │ └─┬update + │ │ ├──dmsghttp + │ │ ├──svc + │ │ ├──hv + │ │ ├──sc + │ │ ├──ss + │ │ ├──vpnc + │ │ └──vpns + │ ├─┬dmsgpty + │ │ ├──ui + │ │ ├──url + │ │ ├──list + │ │ └──start + │ ├─┬visor + │ │ ├─┬app + │ │ │ ├──ls + │ │ │ ├──start + │ │ │ ├──stop + │ │ │ ├──register + │ │ │ ├──deregister + │ │ │ ├──log + │ │ │ └─┬arg + │ │ │ ├──autostart + │ │ │ ├──killswitch + │ │ │ ├──secure + │ │ │ ├──passcode + │ │ │ └──netifc + │ │ ├─┬hv + │ │ │ ├──ui + │ │ │ ├──cpk + │ │ │ └──pk + │ │ ├──pk + │ │ ├──info + │ │ ├──ver + │ │ ├──ports + │ │ ├──ip + │ │ ├──ping + │ │ ├──test + │ │ ├──start + │ │ ├──reload + │ │ └──halt + │ ├─┬vpn + │ │ ├──start + │ │ ├──stop + │ │ ├──status + │ │ ├──list + │ │ ├──ui + │ │ └──url + │ ├──ut + │ ├──fwd + │ ├──rev + │ ├──reward + │ ├─┬rewards + │ │ └──ui + │ ├──survey + │ ├─┬route + │ │ ├──rm + │ │ ├─┬add + │ │ │ ├──a + │ │ │ ├──b + │ │ │ └──c + │ │ └──find + │ ├─┬tp + │ │ ├──add + │ │ ├──rm + │ │ ├──disc + │ │ └──tree + │ ├─┬mdisc + │ │ ├──entry + │ │ └──servers + │ ├──completion + │ ├─┬log + │ │ ├──st + │ │ └──tp + │ ├─┬proxy + │ │ ├──start + │ │ ├──stop + │ │ ├──status + │ │ └──list + │ ├──tree + │ └──doc + ├─┬svc + │ ├──sn + │ ├──tpd + │ ├─┬tps + │ │ ├──add + │ │ ├──rm + │ │ └──list + │ ├──ar + │ ├──rf + │ ├──cb + │ ├──kg + │ ├──lc + │ ├──nv + │ ├─┬se + │ │ ├──visor + │ │ ├──dmsg + │ │ └──setup + │ ├──sd + │ ├──nwmon + │ ├──pvm + │ ├──ssm + │ └──vpnm + ├─┬dmsg + │ ├─┬pty + │ │ ├─┬cli + │ │ │ ├──whitelist + │ │ │ ├──whitelist-add + │ │ │ └──whitelist-remove + │ │ ├─┬host + │ │ │ └──confgen + │ │ └──ui + │ ├──disc + │ ├─┬server + │ │ ├─┬config + │ │ │ └──gen + │ │ └──start + │ ├──http + │ ├──curl + │ ├─┬web + │ │ └──gen-keys + │ ├─┬socks + │ │ ├──server + │ │ └──client + │ └──mon + ├─┬app + │ ├──vpn-server + │ ├──vpn-client + │ ├──skysocks-client + │ ├──skysocks + │ └──skychat + ├──tree + └──doc + +``` + +### visor + +``` + + ┌─┐┬┌─┬ ┬┬ ┬┬┬─┐┌─┐ ┬ ┬┬┌─┐┌─┐┬─┐ + └─┐├┴┐└┬┘││││├┬┘├┤───└┐┌┘│└─┐│ │├┬┘ + └─┘┴ ┴ ┴ └┴┘┴┴└─└─┘ └┘ ┴└─┘└─┘┴└─ + + + +Flags: + -c, --config string config file to use (default): skywire-config.json + -C, --confarg string supply config as argument + -b, --browser open hypervisor ui in default web browser + --systray run as systray + -i, --hvui run as hypervisor * + --all show all flags + --csrf Request a CSRF token for sensitive hypervisor API requests (default true) + + +``` + +### cli + +``` + + ┌─┐┬┌─┬ ┬┬ ┬┬┬─┐┌─┐ ┌─┐┬ ┬ + └─┐├┴┐└┬┘││││├┬┘├┤───│ │ │ + └─┘┴ ┴ ┴ └┴┘┴┴└─└─┘ └─┘┴─┘┴ + +Available Commands: + config Generate or update a skywire config + dmsgpty Interact with remote visors + visor Query the Skywire Visor + vpn VPN client + ut query uptime tracker + fwd Control skyforwarding + rev reverse proxy skyfwd + reward skycoin reward address + rewards calculate rewards from uptime data & collected surveys + survey system survey + route View and set rules + tp View and manage transports + mdisc Query remote DMSG Discovery + completion Generate completion script + log survey & transport log collection + proxy Skysocks client + tree subcommand tree + doc generate markdown docs + + +``` + +skywire command line interface + +## skywire + +``` + + ┌─┐┬┌─┬ ┬┬ ┬┬┬─┐┌─┐ + └─┐├┴┐└┬┘││││├┬┘├┤ + └─┘┴ ┴ ┴ └┴┘┴┴└─└─┘ + +Available Commands: + visor Skywire Visor + cli Command Line Interface for skywire + svc Skywire services + dmsg Dmsg services & utilities + app skywire native applications + tree subcommand tree + doc generate markdown docs + + +``` + +## global flags + +The skywire-cli interacts with the running visor via rpc calls. By default the rpc server is available on localhost:3435. The rpc address and port the visor is using may be changed in the config file, once generated. + +It is not recommended to expose the rpc server on the local network. Exposing the rpc allows unsecured access to the machine over the local network + +``` + +Global Flags: + + --rpc string RPC server address (default "localhost:3435") + + --json bool print output as json + +``` + +#### cli config + +``` +Generate or update the config file used by skywire-visor. + +Available Commands: + gen Generate a config file + gen-keys generate public / secret keypair + check-pk check a skywire public key + update Update a config file + + +``` + +##### cli config gen + +``` +Generate a config file + + Config defaults file may also be specified with: + SKYENV=/path/to/skywire.conf skywire-cli config gen + print the SKYENV file template with: + skywire-cli config gen -q + + + +Flags: + -a, --url string services conf url + + (default "http://conf.skywire.skycoin.com") + --loglvl string level of logging in config (default "info") + -b, --bestproto best protocol (dmsg | direct) based on location + -c, --noauth disable authentication for hypervisor UI + -d, --dmsghttp use dmsg connection to skywire services + -D, --dmsgconf string dmsghttp-config path (default "dmsghttp-config.json") + --minsess int number of dmsg servers to connect to (0 = unlimited) (default 2) + -e, --auth enable auth on hypervisor UI + -f, --force remove pre-existing config + -g, --disableapps string comma separated list of apps to disable + -i, --ishv local hypervisor configuration + -j, --hvpks string list of public keys to add as hypervisor + --dmsgpty string add dmsgpty whitelist PKs + --survey string add survey whitelist PKs + --routesetup string add route setup node PKs + --tpsetup string add transport setup node PKs + -k, --os string (linux / mac / win) paths (default "linux") + -l, --publicip allow display node ip in services + -m, --example-apps add example apps to the config + -n, --stdout write config to stdout + -N, --squash output config without whitespace or newlines + -q, --envs show the environmental variable settings + -o, --out string output config: skywire-config.json + -p, --pkg use path for package: /opt/skywire + -u, --user use paths for user space: /home/d0mo + -r, --regen re-generate existing config & retain keys + -s, --sk cipher.SecKey a random key is generated if unspecified + + (default 0000000000000000000000000000000000000000000000000000000000000000) + -t, --testenv use test deployment conf.skywire.dev + -v, --servevpn enable vpn server + -w, --hide dont print the config to the terminal :: show errors with -n flag + -x, --retainhv retain existing hypervisors with regen + -y, --autoconn disable autoconnect to public visors + -z, --public publicize visor in service discovery + --stcpr int set tcp transport listening port - 0 for random + --sudph int set udp transport listening port - 0 for random + --binpath string set bin_path for visor vative apps + --proxyclientpk string set server public key for proxy client + --startproxyclient autostart proxy client + --noproxyserver disable autostart of proxy server + --proxyserverpass string set proxy server password + --proxyclientpass string password for the proxy client to access the server (if needed) + --killsw string vpn client killswitch + --addvpn string set vpn server public key for vpn client + --vpnpass string password for vpn client to access the vpn server (if needed) + --vpnserverpass string set password to the vpn server + --secure string change secure mode status of vpn server + --netifc string VPN Server network interface (detected: eno1) + --nofetch do not fetch the services from the service conf url + -S, --svcconf string fallback service configuration file (default "services-config.json") + --nodefaults do not use hardcoded defaults for production / test services + --sn generate config for route setup-node + --version string custom version testing override + --all show all flags + + +``` + +##### Example for package / msi + +``` +$ skywire cli config gen -bpirxn +{ + "version": "v1.3.20", + "sk": "edbfbaaf1f4341e0536ba26249a8ee5d372699dab7be53aa9b38f335e479ce67", + "pk": "038a737f250cbbb077bca10c2ed5b2ba698bb3ffa72c412e095a92e01b72bf4b6b", + "dmsg": { + "discovery": "http://dmsgd.skywire.skycoin.com", + "sessions_count": 2, + "servers": [], + "servers_type": "all" + }, + "dmsgpty": { + "dmsg_port": 22, + "cli_network": "unix", + "cli_address": "/tmp/dmsgpty.sock", + "whitelist": [] + }, + "skywire-tcp": { + "pk_table": null, + "listening_address": ":7777" + }, + "transport": { + "discovery": "http://tpd.skywire.skycoin.com", + "address_resolver": "http://ar.skywire.skycoin.com", + "public_autoconnect": true, + "transport_setup": [ + "03530b786c670fc7f5ab9021478c7ec9cd06a03f3ea1416c50c4a8889ef5bba80e", + "03271c0de223b80400d9bd4b7722b536a245eb6c9c3176781ee41e7bac8f9bad21", + "03a792e6d960c88c6fb2184ee4f16714c58b55f0746840617a19f7dd6e021699d9", + "0313efedc579f57f05d4f5bc3fbf0261f31e51cdcfde7e568169acf92c78868926", + "025c7bbf23e3441a36d7e8a1e9d717921e2a49a2ce035680fec4808a048d244c8a", + "030eb6967f6e23e81db0d214f925fc5ce3371e1b059fb8379ae3eb1edfc95e0b46", + "02e582c0a5e5563aad47f561b272e4c3a9f7ac716258b58e58eb50afd83c286a7f", + "02ddc6c749d6ed067bb68df19c9bcb1a58b7587464043b1707398ffa26a9746b26", + "03aa0b1c4e23616872058c11c6efba777c130a85eaf909945d697399a1eb08426d", + "03adb2c924987d8deef04d02bd95236c5ae172fe5dfe7273e0461d96bf4bc220be" + ], + "log_store": { + "type": "file", + "location": "/opt/skywire/local/transport_logs", + "rotation_interval": "168h0m0s" + }, + "stcpr_port": 0, + "sudph_port": 0 + }, + "routing": { + "route_setup_nodes": [ + "0324579f003e6b4048bae2def4365e634d8e0e3054a20fc7af49daf2a179658557", + "024fbd3997d4260f731b01abcfce60b8967a6d4c6a11d1008812810ea1437ce438", + "03b87c282f6e9f70d97aeea90b07cf09864a235ef718725632d067873431dd1015" + ], + "route_finder": "http://rf.skywire.skycoin.com", + "route_finder_timeout": "10s", + "min_hops": 0 + }, + "uptime_tracker": { + "addr": "http://ut.skywire.skycoin.com" + }, + "launcher": { + "service_discovery": "http://sd.skycoin.com", + "apps": [ + { + "name": "vpn-client", + "binary": "skywire", + "args": [ + "app", + "vpn-client", + "--dns", + "1.1.1.1" + ], + "auto_start": false, + "port": 43 + }, + { + "name": "skychat", + "binary": "skywire", + "args": [ + "app", + "skychat", + "--addr", + ":8001" + ], + "auto_start": true, + "port": 1 + }, + { + "name": "skysocks", + "binary": "skywire", + "args": [ + "app", + "skysocks" + ], + "auto_start": true, + "port": 3 + }, + { + "name": "skysocks-client", + "binary": "skywire", + "args": [ + "app", + "skysocks-client", + "--addr", + ":1080" + ], + "auto_start": false, + "port": 13 + }, + { + "name": "vpn-server", + "binary": "skywire", + "args": [ + "app", + "vpn-server" + ], + "auto_start": false, + "port": 44 + } + ], + "server_addr": "localhost:5505", + "bin_path": "/opt/skywire/bin", + "display_node_ip": false + }, + "survey_whitelist": [ + "02b5ee5333aa6b7f5fc623b7d5f35f505cb7f974e98a70751cf41962f84c8c4637", + "03714c8bdaee0fb48f47babbc47c33e1880752b6620317c9d56b30f3b0ff58a9c3", + "020d35bbaf0a5abc8ec0ba33cde219fde734c63e7202098e1f9a6cf9daaeee55a9", + "027f7dec979482f418f01dfabddbd750ad036c579a16422125dd9a313eaa59c8e1", + "031d4cf1b7ab4c789b56c769f2888e4a61c778dfa5fe7e5cd0217fc41660b2eb65", + "0327e2cf1d2e516ecbfdbd616a87489cc92a73af97335d5c8c29eafb5d8882264a", + "03abbb3eff140cf3dce468b3fa5a28c80fa02c6703d7b952be6faaf2050990ebf4" + ], + "hypervisors": [], + "cli_addr": "localhost:3435", + "log_level": "", + "local_path": "/opt/skywire/local", + "dmsghttp_server_path": "/opt/skywire/local/custom", + "stun_servers": [ + "192.53.117.238:3478", + "170.187.228.44:3478", + "192.53.117.237:3478", + "192.53.117.146:3478", + "192.53.117.60:3478", + "192.53.117.124:3478", + "170.187.228.178:3478", + "170.187.225.246:3478" + ], + "shutdown_timeout": "10s", + "is_public": false, + "persistent_transports": null, + "hypervisor": { + "db_path": "/opt/skywire/users.db", + "enable_auth": true, + "cookies": { + "hash_key": "acce5f29bc86e280ecd58b78fc75401e1cfb94c3b613ed2fd6522d934cfb4f06c4ef932d7aec3b6d1c9a4974a2829bc464644731afb03412ecda2806502ea436", + "block_key": "c641019012c9313eb71800d9d7561edb93d393b8d2957ebb050d9864911c9477", + "expires_duration": 43200000000000, + "path": "/", + "domain": "" + }, + "dmsg_port": 46, + "http_addr": ":8000", + "enable_tls": false, + "tls_cert_file": "./ssl/cert.pem", + "tls_key_file": "./ssl/key.pem" + } +} +``` + +##### cli config gen-keys + +``` +generate public / secret keypair + + + + +``` + +##### cli config check-pk + +``` +check a skywire public key + + + + +``` + +##### cli config update + +``` +Update a config file + +Available Commands: + dmsghttp update dmsghttp-config.json file from config bootstrap service + svc update services-config.json file from config bootstrap service + hv update hypervisor config + sc update skysocks-client config + ss update skysocks-server config + vpnc update vpn-client config + vpns update vpn-server config + +Flags: + -a, --endpoints update server endpoints + --log-level string level of logging in config + -b, --url string service config URL: conf.skywire.skycoin.com + -t, --testenv use test deployment: conf.skywire.dev + --public-autoconn string change public autoconnect configuration + --set-minhop int change min hops value (default -1) + -i, --input string path of input config file. + -o, --output string config file to output + -u, --user update config at: $HOME/skywire-config.json + + +``` + +###### cli config update dmsghttp + +``` +update dmsghttp-config.json file from config bootstrap service + + + +Flags: + -p, --path string path of dmsghttp-config file, default is for pkg installation (default "/opt/skywire/dmsghttp-config.json") + +Global Flags: + -i, --input string path of input config file. + -o, --output string config file to output + -u, --user update config at: $HOME/skywire-config.json + + +``` + +###### cli config update svc + +``` +update services-config.json file from config bootstrap service + + + +Flags: + -p, --path string path of services-config file, default is for pkg installation (default "/opt/skywire/services-config.json") + +Global Flags: + -i, --input string path of input config file. + -o, --output string config file to output + -u, --user update config at: $HOME/skywire-config.json + + +``` + +###### cli config update hv + +``` +update hypervisor config + + + +Flags: + -+, --add-pks string public keys of hypervisors that should be added to this visor + -r, --reset resets hypervisor configuration + +Global Flags: + -i, --input string path of input config file. + -o, --output string config file to output + -u, --user update config at: $HOME/skywire-config.json + + +``` + +###### cli config update sc + +``` +update skysocks-client config + + + +Flags: + -+, --add-server string add skysocks server address to skysock-client + -r, --reset reset skysocks-client configuration + +Global Flags: + -i, --input string path of input config file. + -o, --output string config file to output + -u, --user update config at: $HOME/skywire-config.json + + +``` + +###### cli config update ss + +``` +update skysocks-server config + + + +Flags: + -s, --passwd string add passcode to skysocks server + -r, --reset reset skysocks configuration + +Global Flags: + -i, --input string path of input config file. + -o, --output string config file to output + -u, --user update config at: $HOME/skywire-config.json + + +``` + +###### cli config update vpnc + +``` +update vpn-client config + + + +Flags: + -x, --killsw string change killswitch status of vpn-client + --add-server string add server address to vpn-client + -s, --pass string add passcode of server if needed + -r, --reset reset vpn-client configurations + +Global Flags: + -i, --input string path of input config file. + -o, --output string config file to output + -u, --user update config at: $HOME/skywire-config.json + + +``` + +###### cli config update vpns + +``` +update vpn-server config + + + +Flags: + -s, --passwd string add passcode to vpn-server + --secure string change secure mode status of vpn-server + --autostart string change autostart of vpn-server + --netifc string set default network interface + -r, --reset reset vpn-server configurations + +Global Flags: + -i, --input string path of input config file. + -o, --output string config file to output + -u, --user update config at: $HOME/skywire-config.json + + +``` + +#### cli dmsgpty + +``` +Interact with remote visors + +Available Commands: + ui Open dmsgpty UI in default browser + url Show dmsgpty UI URL + list List connected visors + start Start dmsgpty session + + +``` + +##### cli dmsgpty ui + +``` +Open dmsgpty UI in default browser + + + +Flags: + -i, --input string read from specified config file + -p, --pkg read from /opt/skywire/skywire.json + -v, --visor string public key of visor to connect to + + +``` + +##### cli dmsgpty url + +``` +Show dmsgpty UI URL + + + +Flags: + -i, --input string read from specified config file + -p, --pkg read from /opt/skywire/skywire.json + -v, --visor string public key of visor to connect to + + +``` + +##### cli dmsgpty list + +``` +List connected visors + + + +Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli dmsgpty start + +``` +Start dmsgpty session + + + +Flags: + -p, --port string port of remote visor dmsgpty (default "22") + --rpc string RPC server address (default "localhost:3435") + + +``` + +#### cli visor + +``` +Query the Skywire Visor + +Available Commands: + app App settings + hv Hypervisor + pk Public key of the visor + info Summary of visor info + ver Version and build info + ports List of Ports + ip IP information of network + ping Ping the visor with given pk + test Test the visor with public visors on network + start start visor + halt Stop a running visor + +Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor app + +``` + + App settings + +Available Commands: + ls List apps + start Launch app + stop Halt app + register Register app + deregister Deregister app + log Logs from app + arg App args + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app ls + +``` + + List apps + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app start + +``` + + Launch app + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app stop + +``` + + Halt app + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app register + +``` + + Register app + + + +Flags: + -a, --appname string name of the app + -p, --localpath string path of the local folder (default "./local") + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app deregister + +``` + + Deregister app + + + +Flags: + -k, --procKey string proc key of the app to deregister + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app log + +``` + + Logs from app since RFC3339Nano-formatted timestamp. + + + "beginning" is a special timestamp to fetch all the logs + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app arg + +``` +App args + +Available Commands: + autostart Set app autostart + killswitch Set app killswitch + secure Set app secure + passcode Set app passcode + netifc Set app network interface + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app arg autostart + +``` +App args + +Available Commands: + autostart Set app autostart + killswitch Set app killswitch + secure Set app secure + passcode Set app passcode + netifc Set app network interface + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app arg killswitch + +``` +App args + +Available Commands: + autostart Set app autostart + killswitch Set app killswitch + secure Set app secure + passcode Set app passcode + netifc Set app network interface + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app arg secure + +``` +App args + +Available Commands: + autostart Set app autostart + killswitch Set app killswitch + secure Set app secure + passcode Set app passcode + netifc Set app network interface + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app arg passcode + +``` +App args + +Available Commands: + autostart Set app autostart + killswitch Set app killswitch + secure Set app secure + passcode Set app passcode + netifc Set app network interface + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor app arg netifc + +``` +App args + +Available Commands: + autostart Set app autostart + killswitch Set app killswitch + secure Set app secure + passcode Set app passcode + netifc Set app network interface + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor hv + +``` + + Hypervisor + + + Access the hypervisor UI + + View remote hypervisor public key + +Available Commands: + ui open Hypervisor UI in default browser + cpk Public key of remote hypervisor(s) set in config + pk Public key of remote hypervisor(s) + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor hv ui + +``` + + open Hypervisor UI in default browser + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor hv cpk + +``` + + Public key of remote hypervisor(s) set in config + + + +Flags: + -w, --http serve public key via http + -i, --input string path of input config file. + -p, --pkg read from /opt/skywire/skywire.json + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +###### cli visor hv pk + +``` +Public key of remote hypervisor(s) which are currently connected to + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor pk + +``` + + Public key of the visor + + + +Flags: + -w, --http serve public key via http + -i, --input string path of input config file. + -p, --pkg read from {/opt/skywire/bin /opt/skywire/local {/opt/skywire/users.db true}} + -x, --prt string serve public key via http (default "7998") + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor info + +``` + + Summary of visor info + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor ver + +``` + + Version and build info + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor ports + +``` + + List of all ports used by visor services and apps + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor ip + +``` + + IP information of network + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor ping + +``` + + Creates a route with the provided pk as a hop and returns latency on the conn + + + +Flags: + -s, --size int Size of packet, in KB, default is 2KB (default 2) + -t, --tries int Number of tries (default 1) + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor test + +``` + + Creates a route with public visors as a hop and returns latency on the conn + + + +Flags: + -c, --count int Count of Public Visors for using in test. (default 2) + -s, --size int Size of packet, in KB, default is 2KB (default 2) + -t, --tries int Number of tries per public visors (default 1) + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor start + +``` +start visor + + + +Flags: + -s, --src 'go run' external commands from the skywire sources + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor reload + +``` +reload visor + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli visor halt + +``` + + Stop a running visor + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +#### cli vpn + +``` +VPN client + +Available Commands: + start start the vpn for + stop stop the vpnclient + status vpn client status + list List servers + ui Open VPN UI in default browser + url Show VPN UI URL + +Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli vpn start + +``` +start the vpn for + + + +Flags: + -k, --pk string server public key + -t, --timeout int starting timeout value in second + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli vpn stop + +``` +stop the vpnclient + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli vpn status + +``` +vpn client status + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli vpn list + +``` +List vpn servers from service discovery +http://sd.skycoin.com/api/services?type=vpn +http://sd.skycoin.com/api/services?type=vpn&country=US + +Set cache file location to "" to avoid using cache files + + + +Flags: + -m, --cfa int update cache files if older than n minutes (default 5) + --cfs string SD cache file location (default "/tmp/vpnsd.json") + --cfu string UT cache file location. (default "/tmp/ut.json") + -c, --country string filter results by country + -l, --label label keys by country (SLOW) + -o, --noton do not filter by online status in UT + -k, --pk string check vpn service discovery for public key + -r, --raw print raw data + -a, --sdurl string service discovery url (default "http://sd.skycoin.com") + -s, --stats return only a count of the results + -u, --unfilter provide unfiltered results + -w, --uturl string uptime tracker url (default "http://ut.skywire.skycoin.com") + -v, --ver string filter results by version + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli vpn ui + +``` +Open VPN UI in default browser + + + +Flags: + -c, --config string config path + -p, --pkg use package config path: /opt/skywire + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli vpn url + +``` +Show VPN UI URL + + + +Flags: + -c, --config string config path + -p, --pkg use package config path: /opt/skywire + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +#### cli ut + +``` +query uptime tracker + +http://ut.skywire.skycoin.com/uptimes?v=v2 + +Check local visor daily uptime percent with: + skywire-cli ut -k $(skywire-cli visor pk)n +Set cache file location to "" to avoid using cache files + + + +Flags: + -m, --cfa int update cache files if older than n minutes (default 5) + --cfu string UT cache file location. (default "/tmp/ut.json") + -n, --min int list visors meeting minimum uptime (default 75) + -o, --on list currently online visors + -k, --pk string check uptime for the specified key + -s, --stats count the number of results + -u, --url string specify alternative uptime tracker url (default "http://ut.skywire.skycoin.com") + + +``` + +#### cli fwd + +``` +Control skyforwarding + forward local ports over skywire + + + +Flags: + -d, --deregister deregister local port of the external (http) app + -l, --ls list registered local ports + -p, --port int local port of the external (http) app + + +``` + +#### cli rev + +``` +connect or disconnect from remote ports + + + +Flags: + -l, --ls list configured connections + -k, --pk string remote public key to connect to + -p, --port int local port to reverse proxy + -r, --remote int remote port to read from + -d, --stop string disconnect from specified + + +``` + +#### cli reward + +``` + + skycoin reward address set to: + + + +Flags: + --all show all flags + + +``` + +#### cli rewards + +``` + +Collect surveys: skywire-cli log +Fetch uptimes: skywire-cli ut > ut.txt + +Available Commands: + ui reward system user interface + +Flags: + -d, --date string date for which to calculate reward (default "2024-04-12") + -k, --pk string check reward for pubkey + -n, --noarch string disallowed architectures, comma separated (default "amd64") + -y, --year int yearly total rewards (default 408000) + -u, --utfile string uptime tracker data file (default "ut.txt") + -p, --path string path to the surveys (default "log_collecting") + -0, --h0 hide statistical data + -1, --h1 hide survey csv data + -2, --h2 hide reward csv data + -e, --err account for non rewarded keys + + +``` + +##### cli rewards ui + +``` +skycoin reward system and skywire network metrics: https://fiber.skywire.dev + + ┌─┐┬┌┐ ┌─┐┬─┐ + ├┤ │├┴┐├┤ ├┬┘ + └ ┴└─┘└─┘┴└─ + run the web application + +.conf file may also be specified with +SKYENV=/path/to/fiber.conf fiber run + + + +Flags: + -D, --dmsg-disc string dmsg discovery url default: + http://dmsgd.skywire.skycoin.com + -d, --dport uint dmsg port to serve (default 80) + -e, --dsess int dmsg sessions (default 1) + -O, --ensure-online string Exit when the specified URL cannot be fetched; + i.e. https://fiber.skywire.dev + -p, --port uint port to serve (default 80) + -s, --sk cipher.SecKey a random key is generated if unspecified + + (default 0000000000000000000000000000000000000000000000000000000000000000) + -w, --wl string add whitelist keys, comma separated to permit POST of reward transaction to be broadcast + + +``` + +#### cli survey + +``` +print the system survey + + + +Flags: + -s, --sha generate checksum of system survey + + +``` + +``` +unknown command "survey" for "skywire" + +``` + +#### cli route + +``` + + View and set routing rules + +Available Commands: + rm Remove routing rule + add Add routing rule + find Query the Route Finder + +Flags: + -n, --nrid display the next available route id + -i, --rid string show routing rule matching route ID + + +``` + +##### cli route rm + +``` + + Remove routing rule + + + + +``` + +##### cli route add + +``` + + Add routing rule + +Available Commands: + a Add app/consume routing rule + b Add intermediary forward routing rule + c Add forward routing rule + +Flags: + -a, --keep-alive duration timeout for rule expiration (default 30s) + + +``` + +###### cli route add a + +``` + + Add app/consume routing rule + + + +Flags: + -i, --rid string route id + -l, --lpk string local public key + -m, --lpt string local port + -p, --rpk string remote pk + -q, --rpt string remote port + +Global Flags: + -a, --keep-alive duration timeout for rule expiration (default 30s) + + +``` + +###### cli route add b + +``` + + Add intermediary forward routing rule + + + +Flags: + -i, --rid string route id + -j, --nrid string next route id + -k, --tpid string next transport id + +Global Flags: + -a, --keep-alive duration timeout for rule expiration (default 30s) + + +``` + +###### cli route add c + +``` + + Add forward routing rule + + + +Flags: + -i, --rid string route id + -j, --nrid string next route id + -k, --tpid string next transport id + -l, --lpk string local public key + -m, --lpt string local port + -p, --rpk string remote pk + -q, --rpt string remote port + +Global Flags: + -a, --keep-alive duration timeout for rule expiration (default 30s) + + +``` + +##### cli route find + +``` +Query the Route Finder +Assumes the local visor public key as an argument if only one argument is given + + + +Flags: + -n, --min uint16 minimum hops (default 1) + -x, --max uint16 maximum hops (default 1000) + -t, --timeout duration request timeout (default 10s) + -a, --addr string route finder service address + http://rf.skywire.skycoin.com + + +``` + +#### cli tp + +``` +Display and manage transports of the local visor + + Transports are bidirectional communication protocols + used between two Skywire Visors (or Transport Edges) + + Each Transport is represented as a unique 16 byte (128 bit) + UUID value called the Transport ID + and has a Transport Type that identifies + a specific implementation of the Transport. + + Types: stcp stcpr sudph dmsg + +Available Commands: + add Add a transport + rm Remove transport(s) by id + disc Discover remote transport(s) + tree tree map of transports on the skywire network + +Flags: + -t, --types strings show transport(s) type(s) comma-separated + -p, --pks strings show transport(s) for public key(s) comma-separated + -l, --logs show transport logs (default true) + -i, --id string display transport matching ID + -u, --tptypes display transport types used by the local visor + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli tp add + +``` + + Add a transport + If the transport type is unspecified, + the visor will attempt to establish a transport + in the following order: stcpr, sudph, dmsg + + + +Flags: + --rpc string RPC server address (default "localhost:3435") + -r, --rpk string remote public key. + -t, --type string type of transport to add. + -o, --timeout duration if specified, sets an operation timeout + -a, --sdurl string service discovery url (default "http://sd.skycoin.com") + -f, --force attempt transport creation without check of SD + --cfs string SD cache file location (default "/tmp/pvisorsd.json") + -m, --cfa int update cache files if older than n minutes (default 5) + + +``` + +##### cli tp rm + +``` + + Remove transport(s) by id + + + +Flags: + --rpc string RPC server address (default "localhost:3435") + -a, --all remove all transports + -i, --id string remove transport of given ID + + +``` + +##### cli tp disc + +``` + + Discover remote transport(s) by ID or public key + + + +Flags: + -i, --id string obtain transport of given ID + -p, --pk string obtain transports by public key + + +``` + +##### cli tp tree + +``` +display a tree representation of transports from TPD + +http://tpd.skywire.skycoin.com/all-transports + +Set cache file location to "" to avoid using cache files + + + +Flags: + -a, --tpdurl string transport discovery url (default "http://tpd.skywire.skycoin.com") + -w, --uturl string uptime tracker url (default "http://ut.skywire.skycoin.com") + -r, --raw print raw json data + -p, --pretty print pretty json data + -o, --noton do not filter by online status in UT + --cft string TPD cache file location (default "/tmp/tpd.json") + --cfu string UT cache file location. (default "/tmp/ut.json") + -m, --cfa int update cache files if older than n minutes (default 5) + -P, --pad int padding between tree and tpid (default 15) + -s, --stats return only statistics + + +``` + +#### cli mdisc + +``` +Query remote DMSG Discovery + +Available Commands: + entry Fetch an entry + servers Fetch available servers + + +``` + +##### cli mdisc entry + +``` +Fetch an entry + + + +Flags: + -a, --addr string DMSG discovery server address + http://dmsgd.skywire.skycoin.com + + +``` + +##### cli mdisc servers + +``` +Fetch available servers + + + +Flags: + --addr string address of DMSG discovery server + (default "http://dmsgd.skywire.skycoin.com") + + +``` + +#### cli completion + +``` +Generate completion script + + + + +``` + +#### cli log + +``` +Fetch health, survey, and transport logging from visors which are online in the uptime tracker +http://ut.skywire.skycoin.com/uptimes?v=v2 +http://ut.skywire.skycoin.com/uptimes?v=v2&visors=;; + +Available Commands: + st survey tree + tp display collected transport bandwidth logging + +Flags: + -e, --env string deployment to get uptimes from (default "prod") + -l, --log fetch only transport logs + -v, --survey fetch only surveys + -f, --file string fetch only a specific file from all online visors + -k, --pks string fetch only from specific public keys ; semicolon separated + -d, --dir string save files to specified dir (default "log_collecting") + -c, --clean delete files and folders on errors + --minv string minimum visor version to fetch from (default "v1.3.19") + --include-versions string list of version that not satisfy our minimum version condition, but we want include them + -n, --duration int number of days before today to fetch transport logs for + --all consider all visors ; no version filtering + --batchSize int number of visor in each batch (default 50) + --maxfilesize int maximum file size allowed to download during collecting logs, in KB (default 1024) + -D, --dmsg-disc string dmsg discovery url + (default "http://dmsgd.skywire.skycoin.com") + -u, --ut string custom uptime tracker url + -s, --sk cipher.SecKey a random key is generated if unspecified + + (default 0000000000000000000000000000000000000000000000000000000000000000) + + +``` + +##### cli log st + +``` +survey tree + + + +Flags: + -d, --dir string path to surveys & transport bandwidth logging + -p, --pk string public key to check + + +``` + +##### cli log tp + +``` +display collected transport bandwidth logging + + + +Flags: + -d, --dir string path to surveys & transport bandwidth logging + + +``` + +#### cli proxy + +``` +Skysocks client + +Available Commands: + start start the proxy client + stop stop the proxy client + status proxy client status + list List servers + +Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli proxy start + +``` +start the proxy client + + + +Flags: + -a, --addr string address of proxy for use + --http string address for http proxy + -n, --name string name of skysocks client + -k, --pk string server public key + -t, --timeout int timeout for starting proxy + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli proxy stop + +``` +stop the proxy client + + + +Flags: + --all stop all skysocks client + --name string specific skysocks client that want stop + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli proxy status + +``` +proxy client status + + + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +##### cli proxy list + +``` +List proxy servers from service discovery +http://sd.skycoin.com/api/services?type=proxy +http://sd.skycoin.com/api/services?type=proxy&country=US + +Set cache file location to "" to avoid using cache files + + + +Flags: + -m, --cfa int update cache files if older than n minutes (default 5) + --cfs string SD cache file location (default "/tmp/proxysd.json") + --cfu string UT cache file location. (default "/tmp/ut.json") + -c, --country string filter results by country + -l, --label label keys by country (SLOW) + -o, --noton do not filter by online status in UT + -k, --pk string check proxy service discovery for public key + -r, --raw print raw data + -a, --sdurl string service discovery url (default "http://sd.skycoin.com") + -s, --stats return only a count of the results + -u, --unfilter provide unfiltered results + -w, --uturl string uptime tracker url (default "http://ut.skywire.skycoin.com") + -v, --ver string filter results by version + +Global Flags: + --rpc string RPC server address (default "localhost:3435") + + +``` + +#### cli tree + +``` +subcommand tree + + + + +``` + +#### cli doc + +``` +generate markdown docs + + UNHIDEFLAGS=1 go run cmd/skywire-cli/skywire-cli.go doc + + UNHIDEFLAGS=1 go run cmd/skywire-cli/skywire-cli.go doc > cmd/skywire-cli/README1.md + + generate toc: + + cat cmd/skywire-cli/README1.md | gh-md-toc + + + + +``` + +### svc + +``` + + ┌─┐┬┌─┬ ┬┬ ┬┬┬─┐┌─┐ ┌─┐┌─┐┬─┐┬ ┬┬┌─┐┌─┐┌─┐ + └─┐├┴┐└┬┘││││├┬┘├┤───└─┐├┤ ├┬┘└┐┌┘││ ├┤ └─┐ + └─┘┴ ┴ ┴ └┴┘┴┴└─└─┘ └─┘└─┘┴└─ └┘ ┴└─┘└─┘└─┘ + +Available Commands: + sn Route Setup Node for skywire + tpd Transport Discovery Server for skywire + tps Transport setup server for skywire + ar Address Resolver Server for skywire + rf Route Finder Server for skywire + cb Config Bootstrap Server for skywire + kg skywire keys generator, prints pub-key and sec-key + lc Liveness checker of the deployment. + nv Node Visualizer Server for skywire + se skywire environment generator + sd Service discovery server + nwmon Network monitor for skywire VPN and Visor. + pvm Public Visor monitor. + ssm Skysocks monitor. + vpnm VPN monitor. + + +``` + +#### svc sn + +``` + + ┌─┐┌─┐┌┬┐┬ ┬┌─┐ ┌┐┌┌─┐┌┬┐┌─┐ + └─┐├┤ │ │ │├─┘───││││ │ ││├┤ + └─┘└─┘ ┴ └─┘┴ ┘└┘└─┘─┴┘└─┘ + + + +Flags: + -m, --metrics string address to bind metrics API to + -i, --stdin read config from STDIN + --tag string logging tag (default "setup_node") + + +``` + +#### svc tpd + +``` + + ┌┬┐┬─┐┌─┐┌┐┌┌─┐┌─┐┌─┐┬─┐┌┬┐ ┌┬┐┬┌─┐┌─┐┌─┐┬ ┬┌─┐┬─┐┬ ┬ + │ ├┬┘├─┤│││└─┐├─┘│ │├┬┘ │───│││└─┐│ │ │└┐┌┘├┤ ├┬┘└┬┘ + ┴ ┴└─┴ ┴┘└┘└─┘┴ └─┘┴└─ ┴ ─┴┘┴└─┘└─┘└─┘ └┘ └─┘┴└─ ┴ +----- depends: redis, postgresql and initial DB setup ----- +sudo -iu postgres createdb tpd +keys-gen | tee tpd-config.json +PG_USER="postgres" PG_DATABASE="tpd" PG_PASSWORD="" transport-discovery --sk $(tail -n1 tpd-config.json) + + + +Flags: + -a, --addr string address to bind to (default ":9091") + --dmsg-disc string url of dmsg-discovery (default "http://dmsgd.skywire.skycoin.com") + --dmsgPort uint16 dmsg port value + (default 80) + -l, --loglvl string set log level one of: info, error, warn, debug, trace, panic (default "info") + -m, --metrics string address to bind metrics API to + --pg-host string host of postgres (default "localhost") + --pg-max-open-conn int maximum open connection of db (default 60) + --pg-port string port of postgres (default "5432") + --redis string connections string for a redis store (default "redis://localhost:6379") + --redis-pool-size int redis connection pool size (default 10) + --sk cipher.SecKey dmsg secret key + (default 0000000000000000000000000000000000000000000000000000000000000000) + --tag string logging tag (default "transport_discovery") + --test-environment distinguished between prod and test environment + -t, --testing enable testing to start without redis + --whitelist-keys string list of whitelisted keys of network monitor used for deregistration + + +``` + +#### svc tps + +``` + + ┌┬┐┬─┐┌─┐┌┐┌┌─┐┌─┐┌─┐┬─┐┌┬┐ ┌─┐┌─┐┌┬┐┬ ┬┌─┐ + │ ├┬┘├─┤│││└─┐├─┘│ │├┬┘ │───└─┐├┤ │ │ │├─┘ + ┴ ┴└─┴ ┴┘└┘└─┘┴ └─┘┴└─ ┴ └─┘└─┘ ┴ └─┘┴ + +Transport setup server for skywire +Takes config in the following format: +{ + "dmsg": { + "discovery": "http://dmsgd.skywire.skycoin.com", + "servers": [], + "sessions_count": 2 + }, + "log_level": "", + "port":8080, + "public_key": "", + "secret_key": "", + "transport_discovery": "http://tpd.skywire.skycoin.com" +} + +Available Commands: + add add transport to remote visor + rm remove transport from remote visor + list list transports of remote visor + +Flags: + -c, --config string path to config file + -l, --loglvl string [info|error|warn|debug|trace|panic] (default "debug") + + +``` + +##### svc tps add + +``` +add transport to remote visor + + + +Flags: + -1, --from string PK to request transport setup + -2, --to string other transport edge PK + -t, --type string transport type to request creation of [stcpr|sudph|dmsg] + -p, --pretty pretty print result + -z, --addr string address of the transport setup-node (default "http://127.0.0.1:8080") + + +``` + +##### svc tps rm + +``` +remove transport from remote visor + + + +Flags: + -1, --from string PK to request transport takedown + -i, --tpid string id of transport to remove + -p, --pretty pretty print result + -z, --addr string address of the transport setup-node (default "http://127.0.0.1:8080") + + +``` + +##### svc tps list + +``` +list transports of remote visor + + + +Flags: + -1, --from string PK to request transport list + -p, --pretty pretty print result + -z, --addr string address of the transport setup-node (default "http://127.0.0.1:8080") + + +``` + +#### svc ar + +``` + + ┌─┐┌┬┐┌┬┐┬─┐┌─┐┌─┐┌─┐ ┬─┐┌─┐┌─┐┌─┐┬ ┬ ┬┌─┐┬─┐ + ├─┤ ││ ││├┬┘├┤ └─┐└─┐───├┬┘├┤ └─┐│ ││ └┐┌┘├┤ ├┬┘ + ┴ ┴─┴┘─┴┘┴└─└─┘└─┘└─┘ ┴└─└─┘└─┘└─┘┴─┘└┘ └─┘┴└─ + +depends: redis + +Note: the specified port must be accessible from the internet ip address or port forwarded for udp +skywire cli config gen-keys > ar-config.json +skywire svc ar --addr ":9093" --redis "redis://localhost:6379" --sk $(tail -n1 ar-config.json) + +Usage: + skywire svc ar + +Flags: + -a, --addr string address to bind to (default ":9093") + --dmsg-disc string url of dmsg-discovery (default "http://dmsgd.skywire.skycoin.com") + --dmsgPort uint16 dmsg port value + (default 80) + -l, --loglvl string set log level one of: info, error, warn, debug, trace, panic (default "info") + -m, --metrics string address to bind metrics API to + --redis string connections string for a redis store (default "redis://localhost:6379") + --redis-pool-size int redis connection pool size (default 10) + --sk cipher.SecKey dmsg secret key + (default 0000000000000000000000000000000000000000000000000000000000000000) + --tag string logging tag (default "address_resolver") + --test-environment distinguished between prod and test environment + -t, --testing enable testing to start without redis + --whitelist-keys string list of whitelisted keys of network monitor used for deregistration + + +``` + +#### svc rf + +``` + + ┬─┐┌─┐┬ ┬┌┬┐┌─┐ ┌─┐┬┌┐┌┌┬┐┌─┐┬─┐ + ├┬┘│ ││ │ │ ├┤───├┤ ││││ ││├┤ ├┬┘ + ┴└─└─┘└─┘ ┴ └─┘ └ ┴┘└┘─┴┘└─┘┴└─ +----- depends: postgres and initial db setup ----- +sudo -iu postgres createdb rf +skywire cli config gen-keys | tee rf-config.json +PG_USER="postgres" PG_DATABASE="rf" PG_PASSWORD="" route-finder --addr ":9092" --sk $(tail -n1 rf-config.json) + + + +Flags: + -a, --addr string address to bind to (default ":9092") + --dmsg-disc string url of dmsg-discovery (default "http://dmsgd.skywire.skycoin.com") + --dmsgPort uint16 dmsg port value + (default 80) + -l, --loglvl string set log level one of: info, error, warn, debug, trace, panic (default "info") + -m, --metrics string address to bind metrics API to + --pg-host string host of postgres (default "localhost") + --pg-max-open-conn int maximum open connection of db (default 60) + --pg-port string port of postgres (default "5432") + --sk cipher.SecKey dmsg secret key + (default 0000000000000000000000000000000000000000000000000000000000000000) + --tag string logging tag (default "route_finder") + -t, --testing enable testing to start without redis + + +``` + +#### svc cb + +``` + + ┌─┐┌─┐┌┐┌┌─┐┬┌─┐ ┌┐ ┌─┐┌─┐┌┬┐┌─┐┌┬┐┬─┐┌─┐┌─┐┌─┐┌─┐┬─┐ + │ │ ││││├┤ ││ ┬───├┴┐│ ││ │ │ └─┐ │ ├┬┘├─┤├─┘├─┘├┤ ├┬┘ + └─┘└─┘┘└┘└ ┴└─┘ └─┘└─┘└─┘ ┴ └─┘ ┴ ┴└─┴ ┴┴ ┴ └─┘┴└─ + + + +Flags: + -a, --addr string address to bind to (default ":9082") + -c, --config string stun server list file location (default "./config.json") + --dmsg-disc string url of dmsg-discovery (default "http://dmsgd.skywire.skycoin.com") + --dmsgPort uint16 dmsg port value + (default 80) + -d, --domain string the domain of the endpoints (default "skywire.skycoin.com") + --sk cipher.SecKey dmsg secret key + (default 0000000000000000000000000000000000000000000000000000000000000000) + --tag string logging tag (default "address_resolver") + + +``` + +#### svc kg + +``` + + ┬┌─┌─┐┬ ┬┌─┐ ┌─┐┌─┐┌┐┌ + ├┴┐├┤ └┬┘└─┐───│ ┬├┤ │││ + ┴ ┴└─┘ ┴ └─┘ └─┘└─┘┘└┘ + + + + +``` + +#### svc lc + +``` + + ┬ ┬┬ ┬┌─┐┌┐┌┌─┐┌─┐┌─┐ ┌─┐┬ ┬┌─┐┌─┐┬┌─┌─┐┬─┐ + │ │└┐┌┘├┤ │││├┤ └─┐└─┐───│ ├─┤├┤ │ ├┴┐├┤ ├┬┘ + ┴─┘┴ └┘ └─┘┘└┘└─┘└─┘└─┘ └─┘┴ ┴└─┘└─┘┴ ┴└─┘┴└─ + + + +Flags: + -a, --addr string address to bind to. (default ":9081") + -c, --config string config file location. (default "liveness-checker.json") + -l, --loglvl string set log level one of: info, error, warn, debug, trace, panic (default "info") + --redis string connections string for a redis store (default "redis://localhost:6379") + --tag string logging tag (default "liveness_checker") + -t, --testing enable testing to start without redis + + +``` + +#### svc nv + +``` + + ┌┐┌┌─┐┌┬┐┌─┐ ┬ ┬┬┌─┐┬ ┬┌─┐┬ ┬┌─┐┌─┐┬─┐ + ││││ │ ││├┤───└┐┌┘│└─┐│ │├─┤│ │┌─┘├┤ ├┬┘ + ┘└┘└─┘─┴┘└─┘ └┘ ┴└─┘└─┘┴ ┴┴─┘┴└─┘└─┘┴└─ + + + +Flags: + -a, --addr string address to bind to (default ":9081") + -l, --log enable request logging (default true) + -m, --metrics string address to bind metrics API to + --tag string logging tag (default "node-visualizer") + -t, --testing enable testing to start without redis + + +``` + +#### svc se + +``` + + ┌─┐┬ ┬ ┌─┐┌┐┌┬ ┬ + └─┐│││───├┤ │││└┐┌┘ + └─┘└┴┘ └─┘┘└┘ └┘ + +Available Commands: + visor Generate config for skywire-visor + dmsg Generate config for dmsg-server + setup Generate config for setup node + +Flags: + -d, --docker Environment with dockerized skywire-services + -l, --local Environment with skywire-services on localhost + -n, --network string Docker network to use (default "SKYNET") + -p, --public Environment with public skywire-services + + +``` + +##### svc se visor + +``` +Generate config for skywire-visor + + + + +``` + +##### svc se dmsg + +``` +Generate config for dmsg-server + + + + +``` + +##### svc se setup + +``` +Generate config for setup node + + + + +``` + +#### svc sd + +``` + + ┌─┐┌─┐┬─┐┬ ┬┬┌─┐┌─┐ ┌┬┐┬┌─┐┌─┐┌─┐┬ ┬┌─┐┬─┐┬ ┬ + └─┐├┤ ├┬┘└┐┌┘││ ├┤───│││└─┐│ │ │└┐┌┘├┤ ├┬┘└┬┘ + └─┘└─┘┴└─ └┘ ┴└─┘└─┘ ─┴┘┴└─┘└─┘└─┘ └┘ └─┘┴└─ ┴ +----- depends: redis, postgresql and initial DB setup ----- +sudo -iu postgres createdb sd +keys-gen | tee sd-config.json +PG_USER="postgres" PG_DATABASE="sd" PG_PASSWORD="" service-discovery --sk $(tail -n1 sd-config.json) + + + +Flags: + -a, --addr string address to bind to (default ":9098") + -g, --api-key string geo API key + -d, --dmsg-disc string url of dmsg-discovery (default "http://dmsgd.skywire.skycoin.com") + --dmsgPort uint16 dmsg port value (default 80) + -m, --metrics string address to bind metrics API to + -o, --pg-host string host of postgres (default "localhost") + -p, --pg-port string port of postgres (default "5432") + -r, --redis string connections string for a redis store (default "redis://localhost:6379") + -s, --sk cipher.SecKey dmsg secret key + (default 0000000000000000000000000000000000000000000000000000000000000000) + -t, --test run in test mode and disable auth + -n, --test-environment distinguished between prod and test environment + -w, --whitelist-keys string list of whitelisted keys of network monitor used for deregistration + + +``` + +#### svc nwmon + +``` + + ┌┐┌┌─┐┌┬┐┬ ┬┌─┐┬─┐┬┌─ ┌┬┐┌─┐┌┐┌┬┌┬┐┌─┐┬─┐ + │││├┤ │ ││││ │├┬┘├┴┐───││││ │││││ │ │ │├┬┘ + ┘└┘└─┘ ┴ └┴┘└─┘┴└─┴ ┴ ┴ ┴└─┘┘└┘┴ ┴ └─┘┴└─ + + + +Flags: + -a, --addr string address to bind to. (default ":9080") + -v, --ar-url string url to address resolver. + -b, --batchsize int Batch size of deregistration (default 30) + -c, --config string config file location. (default "network-monitor.json") + -l, --loglvl string set log level one of: info, error, warn, debug, trace, panic (default "info") + -m, --metrics string address to bind metrics API to + --redis string connections string for a redis store (default "redis://localhost:6379") + --redis-pool-size int redis connection pool size (default 10) + -n, --sd-url string url to service discovery. + --sleep-deregistration duration Sleep time for derigstration process in minutes (default 10ns) + --tag string logging tag (default "network_monitor") + -t, --testing enable testing to start without redis + -u, --ut-url string url to uptime tracker visor data. + + +``` + +#### svc pvm + +``` + + ┌─┐┬ ┬┌┐ ┬ ┬┌─┐ ┬ ┬┬┌─┐┌─┐┬─┐ ┌┬┐┌─┐┌┐┌┬┌┬┐┌─┐┬─┐ + ├─┘│ │├┴┐│ ││───└┐┌┘│└─┐│ │├┬┘───││││ │││││ │ │ │├┬┘ + ┴ └─┘└─┘┴─┘┴└─┘ └┘ ┴└─┘└─┘┴└─ ┴ ┴└─┘┘└┘┴ ┴ └─┘┴└─ + + + +Flags: + -a, --addr string address to bind to. (default ":9082") + -c, --config string config file location. (default "public-visor-monitor.json") + -l, --loglvl string set log level one of: info, error, warn, debug, trace, panic (default "info") + -s, --sleep-deregistration duration Sleep time for derigstration process in minutes (default 10ns) + --tag string logging tag (default "public_visor_monitor") + + +``` + +#### svc ssm + +``` + + ┌─┐┬┌─┬ ┬┌─┐┌─┐┌─┐┬┌─┌─┐ ┌┬┐┌─┐┌┐┌┬┌┬┐┌─┐┬─┐ + └─┐├┴┐└┬┘└─┐│ ││ ├┴┐└─┐───││││ │││││ │ │ │├┬┘ + └─┘┴ ┴ ┴ └─┘└─┘└─┘┴ ┴└─┘ ┴ ┴└─┘┘└┘┴ ┴ └─┘┴└─ + + + +Flags: + -a, --addr string address to bind to. (default ":9081") + -c, --config string config file location. (default "skysocks-monitor.json") + -s, --sleep-deregistration duration Sleep time for derigstration process in minutes (default 10ns) + --tag string logging tag (default "skysocks_monitor") + + +``` + +#### svc vpnm + +``` + + ┬ ┬┌─┐┌┐┌ ┌┬┐┌─┐┌┐┌┬┌┬┐┌─┐┬─┐ + └┐┌┘├─┘│││───││││ │││││ │ │ │├┬┘ + └┘ ┴ ┘└┘ ┴ ┴└─┘┘└┘┴ ┴ └─┘┴└─ + + + +Flags: + -a, --addr string address to bind to. (default ":9081") + -c, --config string config file location. (default "vpn-monitor.json") + -s, --sleep-deregistration duration Sleep time for derigstration process in minutes (default 10ns) + --tag string logging tag (default "vpn_monitor") + + +``` + +### dmsg + +``` + + ┌┬┐┌┬┐┌─┐┌─┐ + │││││└─┐│ ┬ + ─┴┘┴ ┴└─┘└─┘ + +Available Commands: + pty Dmsg pseudoterminal (pty) + disc DMSG Discovery Server + server DMSG Server + http DMSG http file server + curl DMSG curl utility + web DMSG resolving proxy & browser client + socks DMSG socks5 proxy server & client + mon DMSG monitor of DMSG discovery entries. + + +``` + +#### dmsg pty + +``` + + ┌─┐┌┬┐┬ ┬ + ├─┘ │ └┬┘ + ┴ ┴ ┴ + +Available Commands: + cli DMSG pseudoterminal command line interface + host DMSG host for pseudoterminal command line interface + ui DMSG pseudoterminal GUI + + +``` + +##### dmsg pty cli + +``` + + ┌┬┐┌┬┐┌─┐┌─┐┌─┐┌┬┐┬ ┬ ┌─┐┬ ┬ + │││││└─┐│ ┬├─┘ │ └┬┘───│ │ │ + ─┴┘┴ ┴└─┘└─┘┴ ┴ ┴ └─┘┴─┘┴ +DMSG pseudoterminal command line interface + +Available Commands: + whitelist lists all whitelisted public keys + whitelist-add adds public key(s) to the whitelist + whitelist-remove removes public key(s) from the whitelist + +Flags: + --addr dmsg.Addr remote dmsg address of format 'pk:port' + If unspecified, the pty will start locally + (default 000000000000000000000000000000000000000000000000000000000000000000:~) + -a, --args strings command arguments + -r, --cliaddr string address to use for dialing to dmsgpty-host (default "/tmp/dmsgpty.sock") + -n, --clinet string network to use for dialing to dmsgpty-host (default "unix") + -c, --cmd string name of command to run + (default "/bin/bash") + -p, --confpath string config path (default "config.json") + + +``` + +###### dmsg pty cli whitelist + +``` +lists all whitelisted public keys + + + + +``` + +###### dmsg pty cli whitelist-add + +``` +adds public key(s) to the whitelist + + + + +``` + +###### dmsg pty cli whitelist-remove + +``` +removes public key(s) from the whitelist + + + + +``` + +##### dmsg pty host + +``` + + ┌┬┐┌┬┐┌─┐┌─┐┌─┐┌┬┐┬ ┬ ┬ ┬┌─┐┌─┐┌┬┐ + │││││└─┐│ ┬├─┘ │ └┬┘───├─┤│ │└─┐ │ + ─┴┘┴ ┴└─┘└─┘┴ ┴ ┴ ┴ ┴└─┘└─┘ ┴ +DMSG host for pseudoterminal command line interface + +Available Commands: + confgen generates config file + +Flags: + --cliaddr string address used for listening for cli connections (default "/tmp/dmsgpty.sock") + --clinet string network used for listening for cli connections (default "unix") + -c, --confpath string config path (default "./config.json") + --confstdin config will be read from stdin if set + --dmsgdisc string dmsg discovery address (default "http://dmsgd.skywire.skycoin.com") + --dmsgport uint16 dmsg port for listening for remote hosts (default 22) + --dmsgsessions int minimum number of dmsg sessions to ensure (default 1) + --envprefix string env prefix (default "DMSGPTY") + --wl cipher.PubKeys whitelist of the dmsgpty-host (default public keys: + ) + + +``` + +###### dmsg pty host confgen + +``` +generates config file + + + +Flags: + --unsafe will unsafely write config if set + + +``` + +##### dmsg pty ui + +``` + + ┌┬┐┌┬┐┌─┐┌─┐┌─┐┌┬┐┬ ┬ ┬ ┬┬ + │││││└─┐│ ┬├─┘ │ └┬┘───│ ││ + ─┴┘┴ ┴└─┘└─┘┴ ┴ ┴ └─┘┴ + DMSG pseudoterminal GUI + + + +Flags: + --addr string network address to serve UI on (default ":8080") + --arg stringArray command arguments to include when initiating pty + --cmd string command to run when initiating pty (default "/bin/bash") + --haddr string dmsgpty host network address (default "/tmp/dmsgpty.sock") + --hnet string dmsgpty host network name (default "unix") + + +``` + +#### dmsg disc + +``` + + ┌┬┐┌┬┐┌─┐┌─┐ ┌┬┐┬┌─┐┌─┐┌─┐┬ ┬┌─┐┬─┐┬ ┬ + │││││└─┐│ ┬───│││└─┐│ │ │└┐┌┘├┤ ├┬┘└┬┘ + ─┴┘┴ ┴└─┘└─┘ ─┴┘┴└─┘└─┘└─┘ └┘ └─┘┴└─ ┴ +DMSG Discovery Server +----- depends: redis ----- +skywire cli config gen-keys > dmsgd-config.json +skywire dmsg disc --sk $(tail -n1 dmsgd-config.json) + + + +Flags: + -a, --addr string address to bind to (default ":9090") + --auth string auth passphrase as simple auth for official dmsg servers registration + --dmsgPort uint16 dmsg port value (default 80) + --enable-load-testing enable load testing + --entry-timeout duration discovery entry timeout (default 3m0s) + -m, --metrics string address to serve metrics API from + --official-servers string list of official dmsg servers keys separated by comma + --redis string connections string for a redis store (default "redis://localhost:6379") + --sk cipher.SecKey dmsg secret key + (default 0000000000000000000000000000000000000000000000000000000000000000) + --syslog string address in which to dial to syslog server + --syslog-lvl string minimum log level to report (default "debug") + --syslog-net string network in which to dial to syslog server (default "udp") + --tag string tag used for logging and metrics (default "dmsg_disc") + --test-environment distinguished between prod and test environment + -t, --test-mode in testing mode + --whitelist-keys string list of whitelisted keys of network monitor used for deregistration + + +``` + +#### dmsg server + +``` + + ┌┬┐┌┬┐┌─┐┌─┐ ┌─┐┌─┐┬─┐┬ ┬┌─┐┬─┐ + ││││││└─┐│ ┬ ─ └─┐├┤ ├┬┘└┐┌┘├┤ ├┬┘ + ─┴┘┴ ┴└─┘└─┘ └─┘└─┘┴└─ └┘ └─┘┴└─ +DMSG Server +skywire dmsg server config gen -o dmsg-config.json +skywire dmsg server start dmsg-config.json + +Available Commands: + config Generate a dmsg-server config + start Start Dmsg Server + + +``` + +##### dmsg server config + +``` +Generate a dmsg-server config + +Available Commands: + gen Generate a config file + + +``` + +###### dmsg server config gen + +``` +Generate a config file + + + +Flags: + -o, --output string config output path/name + -t, --testenv use test deployment + + +``` + +##### dmsg server start + +``` +Start Dmsg Server + + + +Flags: + --auth string auth passphrase as simple auth for official dmsg servers registration + -c, --config string location of config file (STDIN to read from standard input) (default "config.json") + --limit-ip int set limitation of IPs want connect to specific dmsg-server, default value is 15 (default 15) + -m, --metrics string address to serve metrics API from + --stdin whether to read config via stdin + --syslog string address in which to dial to syslog server + --syslog-lvl string minimum log level to report (default "debug") + --syslog-net string network in which to dial to syslog server (default "udp") + --tag string tag used for logging and metrics (default "dmsg_srv") + + +``` + +#### dmsg http + +``` + + ┌┬┐┌┬┐┌─┐┌─┐┬ ┬┌┬┐┌┬┐┌─┐ + │││││└─┐│ ┬├─┤ │ │ ├─┘ + ─┴┘┴ ┴└─┘└─┘┴ ┴ ┴ ┴ ┴ +DMSG http file server + + + +Flags: + -d, --dir string local dir to serve via dmsghttp (default ".") + -D, --dmsg-disc string dmsg discovery url default: + http://dmsgd.skywire.skycoin.com + -p, --port uint dmsg port to serve from (default 80) + -s, --sk cipher.SecKey a random key is generated if unspecified + + (default 0000000000000000000000000000000000000000000000000000000000000000) + -w, --wl string whitelist keys, comma separated + + +``` + +#### dmsg curl + +``` + + ┌┬┐┌┬┐┌─┐┌─┐┌─┐┬ ┬┬─┐┬ + │││││└─┐│ ┬│ │ │├┬┘│ + ─┴┘┴ ┴└─┘└─┘└─┘└─┘┴└─┴─┘ +DMSG curl utility + + + +Flags: + -a, --agent AGENT identify as AGENT (default "dmsgcurl/unknown") + -d, --data string dmsghttp POST data + -c, --dmsg-disc string dmsg discovery url default: + http://dmsgd.skywire.skycoin.com + -l, --loglvl string [ debug | warn | error | fatal | panic | trace | info ] (default "fatal") + -o, --out string output filepath + -r, --replace replace exist file with new downloaded + -e, --sess int number of dmsg servers to connect to (default 1) + -s, --sk cipher.SecKey a random key is generated if unspecified + + (default 0000000000000000000000000000000000000000000000000000000000000000) + -t, --try int download attempts (0 unlimits) (default 1) + -w, --wait int time to wait between fetches + + +``` + +#### dmsg web + +``` + + ┌┬┐┌┬┐┌─┐┌─┐┬ ┬┌─┐┌┐ + │││││└─┐│ ┬│││├┤ ├┴┐ + ─┴┘┴ ┴└─┘└─┘└┴┘└─┘└─┘ +DMSG resolving proxy & browser client - access websites over dmsg + +Available Commands: + gen-keys generate public / secret keypair + +Flags: + -d, --dmsg-disc string dmsg discovery url default: + http://dmsgd.skywire.skycoin.com + -f, --filter string domain suffix to filter (default ".dmsg") + -l, --loglvl string [ debug | warn | error | fatal | panic | trace | info ] + -p, --port string port to serve the web application (default "8080") + -r, --proxy string configure additional socks5 proxy for dmsgweb (i.e. 127.0.0.1:1080) + -t, --resolve string resolve the specified dmsg address:port on the local port & disable proxy + -e, --sess int number of dmsg servers to connect to (default 1) + -s, --sk cipher.SecKey a random key is generated if unspecified + + (default 0000000000000000000000000000000000000000000000000000000000000000) + -q, --socks string port to serve the socks5 proxy (default "4445") + + +``` + +##### dmsg web gen-keys + +``` +generate public / secret keypair + + + + +``` + +#### dmsg socks + +``` + + ┌┬┐┌┬┐┌─┐┌─┐ ┌─┐┌─┐┌─┐┬┌─┌─┐ + │││││└─┐│ ┬───└─┐│ ││ ├┴┐└─┐ + ─┴┘┴ ┴└─┘└─┘ └─┘└─┘└─┘┴ ┴└─┘ +DMSG socks5 proxy server & client + +Available Commands: + server dmsg socks5 proxy server + client socks5 proxy client for dmsg socks5 proxy server + + +``` + +##### dmsg socks server + +``` +dmsg socks5 proxy server + + + +Flags: + -D, --dmsg-disc string dmsg discovery url (default "http://dmsgd.skywire.skycoin.com") + -q, --dport uint16 dmsg port to serve socks5 (default 1081) + -s, --sk cipher.SecKey a random key is generated if unspecified + + (default 0000000000000000000000000000000000000000000000000000000000000000) + -w, --wl string whitelist keys, comma separated + + +``` + +##### dmsg socks client + +``` +socks5 proxy client for dmsg socks5 proxy server + + + +Flags: + -D, --dmsg-disc string dmsg discovery url (default "http://dmsgd.skywire.skycoin.com") + -q, --dport uint16 dmsg port to connect to socks5 server (default 1081) + -k, --pk string dmsg socks5 proxy server public key to connect to + -p, --port int TCP port to serve SOCKS5 proxy locally (default 1081) + -s, --sk cipher.SecKey a random key is generated if unspecified + + (default 0000000000000000000000000000000000000000000000000000000000000000) + + +``` + +#### dmsg mon + +``` + + ┌┬┐┌┬┐┌─┐┌─┐ ┌┬┐┌─┐┌┐┌┬┌┬┐┌─┐┬─┐ + │││││└─┐│ ┬───││││ │││││ │ │ │├┬┘ + ─┴┘┴ ┴└─┘└─┘ ┴ ┴└─┘┘└┘┴ ┴ └─┘┴└─ + + + +Flags: + -a, --addr string address to bind to. (default ":9080") + -b, --batchsize int Batch size of deregistration (default 20) + -c, --config string config file location. (default "dmsg-monitor.json") + -d, --dmsg-url string url to dmsg data. + -l, --loglvl string set log level one of: info, error, warn, debug, trace, panic (default "info") + -s, --sleep-deregistration duration Sleep time for derigstration process in minutes (default 60ns) + --tag string logging tag (default "dmsg_monitor") + -u, --ut-url string url to uptime tracker visor data. + + +``` + +### app + +``` + + ┌─┐┌─┐┌─┐┌─┐ + ├─┤├─┘├─┘└─┐ + ┴ ┴┴ ┴ └─┘ + +Available Commands: + vpn-server skywire vpn server application + vpn-client skywire vpn client application + skysocks-client skywire socks5 proxy client application + skysocks skywire socks5 proxy server application + skychat skywire chat application + + +``` + +#### app vpn-server + +``` + + ┬ ┬┌─┐┌┐┌ ┌─┐┌─┐┬─┐┬ ┬┌─┐┬─┐ + └┐┌┘├─┘│││───└─┐├┤ ├┬┘└┐┌┘├┤ ├┬┘ + └┘ ┴ ┘└┘ └─┘└─┘┴└─ └┘ └─┘┴└─ + + + +Flags: + --netifc string Default network interface for multiple available interfaces + --passcode string passcode to authenticate connecting users + --pk string local pubkey + --secure Forbid connections from clients to server local network (default true) + --sk string local seckey + + +``` + +#### app vpn-client + +``` + + ┬ ┬┌─┐┌┐┌ ┌─┐┬ ┬┌─┐┌┐┌┌┬┐ + └┐┌┘├─┘│││───│ │ │├┤ │││ │ + └┘ ┴ ┘└┘ └─┘┴─┘┴└─┘┘└┘ ┴ + + + +Flags: + --dns string address of DNS want set to tun + --killswitch If set, the Internet won't be restored during reconnection attempts + --passcode string passcode to authenticate connection + --pk string local pubkey + --sk string local seckey + --srv string PubKey of the server to connect to + + +``` + +#### app skysocks-client + +``` + + ┌─┐┬┌─┬ ┬┌─┐┌─┐┌─┐┬┌─┌─┐ ┌─┐┬ ┬┌─┐┌┐┌┌┬┐ + └─┐├┴┐└┬┘└─┐│ ││ ├┴┐└─┐───│ │ │├┤ │││ │ + └─┘┴ ┴ ┴ └─┘└─┘└─┘┴ ┴└─┘ └─┘┴─┘┴└─┘┘└┘ ┴ + + + +Flags: + --addr string Client address to listen on (default ":1080") + --http string http proxy mode + --srv string PubKey of the server to connect to + + +``` + +#### app skysocks + +``` + + ┌─┐┬┌─┬ ┬┌─┐┌─┐┌─┐┬┌─┌─┐ + └─┐├┴┐└┬┘└─┐│ ││ ├┴┐└─┐ + └─┘┴ ┴ ┴ └─┘└─┘└─┘┴ ┴└─┘ + + + +Flags: + --passcode string passcode to authenticate connecting users + + +``` + +#### app skychat + +``` + + ┌─┐┬┌─┬ ┬┌─┐┬ ┬┌─┐┌┬┐ + └─┐├┴┐└┬┘│ ├─┤├─┤ │ + └─┘┴ ┴ ┴ └─┘┴ ┴┴ ┴ ┴ + + + +Flags: + --addr string address to bind, put an * before the port if you want to be able to access outside localhost (default ":8001") + + +``` + +### tree + +``` +subcommand tree + + + + +``` + +### doc + +``` +generate markdown docs + + UNHIDEFLAGS=1 go run cmd/skywire/skywire.go doc + + UNHIDEFLAGS=1 go run cmd/skywire/skywire.go doc > cmd/skywire/README1.md + + generate toc: + + cat cmd/skywire/README1.md | gh-md-toc + + + + +``` diff --git a/cmd/skycoin-skywire/commands/root.go b/cmd/skycoin-skywire/commands/root.go new file mode 100644 index 0000000000..fc79eb3a3e --- /dev/null +++ b/cmd/skycoin-skywire/commands/root.go @@ -0,0 +1,365 @@ +// Package commands cmd/skywire/commands/root.go +package commands + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + + "github.com/bitfield/script" + "github.com/pterm/pterm" + "github.com/pterm/pterm/putils" + dmsg "github.com/skycoin/dmsg/cmd/dmsg/commands" + sd "github.com/skycoin/skycoin-service-discovery/cmd/service-discovery/commands" + "github.com/spf13/cobra" + + services "github.com/skycoin/skywire-services/cmd/skywire-services/commands" + skycoin "github.com/skycoin/skycoin/cmd/skycoin-wallet/commands" + "github.com/skycoin/skywire-utilities/pkg/buildinfo" + sc "github.com/skycoin/skywire/cmd/apps/skychat/commands" + ssc "github.com/skycoin/skywire/cmd/apps/skysocks-client/commands" + ss "github.com/skycoin/skywire/cmd/apps/skysocks/commands" + vpnc "github.com/skycoin/skywire/cmd/apps/vpn-client/commands" + vpns "github.com/skycoin/skywire/cmd/apps/vpn-server/commands" + sn "github.com/skycoin/skywire/cmd/setup-node/commands" + scli "github.com/skycoin/skywire/cmd/skywire-cli/commands" + "github.com/skycoin/skywire/pkg/visor" +) + +func init() { + + appsCmd.AddCommand( + vpns.RootCmd, + vpnc.RootCmd, + ssc.RootCmd, + ss.RootCmd, + sc.RootCmd, + ) + services.RootCmd.AddCommand( + sd.RootCmd, + sn.RootCmd, + ) + RootCmd.AddCommand( + visor.RootCmd, + skycoin.RootCmd, + scli.RootCmd, + services.RootCmd, + dmsg.RootCmd, + appsCmd, + treeCmd, + docCmd, + ) + visor.RootCmd.Long = ` + ┌─┐┬┌─┬ ┬┬ ┬┬┬─┐┌─┐ ┬ ┬┬┌─┐┌─┐┬─┐ + └─┐├┴┐└┬┘││││├┬┘├┤───└┐┌┘│└─┐│ │├┬┘ + └─┘┴ ┴ ┴ └┴┘┴┴└─└─┘ └┘ ┴└─┘└─┘┴└─` + dmsg.RootCmd.Use = "dmsg" + services.RootCmd.Use = "svc" + skycoin.RootCmd.Use = "skycoin" + skycoin.RootCmd.Short = "skycoin daemon, cli, & newcoin" + sd.RootCmd.Use = "sd" + sn.RootCmd.Use = "sn" + scli.RootCmd.Use = "cli" + visor.RootCmd.Use = "visor" + vpns.RootCmd.Use = "vpn-server" + vpnc.RootCmd.Use = "vpn-client" + ssc.RootCmd.Use = "skysocks-client" + ss.RootCmd.Use = "skysocks" + sc.RootCmd.Use = "skychat" +} + +// RootCmd contains literally every 'command' from four repos here +var RootCmd = &cobra.Command{ + Use: func() string { + return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] + }(), + Long: ` + ┌─┐┬┌─┬ ┬┬ ┬┬┬─┐┌─┐ + └─┐├┴┐└┬┘││││├┬┘├┤ + └─┘┴ ┴ ┴ └┴┘┴┴└─└─┘`, + SilenceErrors: true, + SilenceUsage: true, + DisableSuggestions: true, + DisableFlagsInUseLine: true, + Version: buildinfo.Version(), +} + +var appsCmd = &cobra.Command{ + Use: "app", + Short: "skywire native applications", + Long: ` + ┌─┐┌─┐┌─┐┌─┐ + ├─┤├─┘├─┘└─┐ + ┴ ┴┴ ┴ └─┘`, + SilenceErrors: true, + SilenceUsage: true, + DisableSuggestions: true, + DisableFlagsInUseLine: true, +} + +var treeCmd = &cobra.Command{ + Use: "tree", + Short: "subcommand tree", + Long: `subcommand tree`, + Hidden: true, + SilenceErrors: true, + SilenceUsage: true, + DisableSuggestions: true, + DisableFlagsInUseLine: true, + Run: func(_ *cobra.Command, _ []string) { + // You can use a LeveledList here, for easy generation. + leveledList := pterm.LeveledList{} + leveledList = append(leveledList, pterm.LeveledListItem{Level: 0, Text: RootCmd.Use}) + for _, j := range RootCmd.Commands() { + use := strings.Split(j.Use, " ") + leveledList = append(leveledList, pterm.LeveledListItem{Level: 1, Text: use[0]}) + for _, k := range j.Commands() { + use := strings.Split(k.Use, " ") + leveledList = append(leveledList, pterm.LeveledListItem{Level: 2, Text: use[0]}) + for _, l := range k.Commands() { + use := strings.Split(l.Use, " ") + leveledList = append(leveledList, pterm.LeveledListItem{Level: 3, Text: use[0]}) + for _, m := range l.Commands() { + use := strings.Split(m.Use, " ") + leveledList = append(leveledList, pterm.LeveledListItem{Level: 4, Text: use[0]}) + for _, n := range m.Commands() { + use := strings.Split(n.Use, " ") + leveledList = append(leveledList, pterm.LeveledListItem{Level: 5, Text: use[0]}) + for _, o := range n.Commands() { + use := strings.Split(o.Use, " ") + leveledList = append(leveledList, pterm.LeveledListItem{Level: 6, Text: use[0]}) + for _, p := range o.Commands() { + use := strings.Split(p.Use, " ") + leveledList = append(leveledList, pterm.LeveledListItem{Level: 7, Text: use[0]}) + } + } + } + } + } + } + } + // Generate tree from LeveledList. + r := putils.TreeFromLeveledList(leveledList) + + // Render TreePrinter + err := pterm.DefaultTree.WithRoot(r).Render() + if err != nil { + log.Fatal("render subcommand tree: ", err) + } + }, +} + +// for toc generation use: https://github.com/ekalinin/github-markdown-toc.go +var docCmd = &cobra.Command{ + Use: "doc", + Short: "generate markdown docs", + Long: `generate markdown docs + + UNHIDEFLAGS=1 go run cmd/skywire/skywire.go doc + + UNHIDEFLAGS=1 go run cmd/skywire/skywire.go doc > cmd/skywire/README1.md + + generate toc: + + cat cmd/skywire/README1.md | gh-md-toc`, + Hidden: true, + SilenceErrors: true, + SilenceUsage: true, + DisableSuggestions: true, + DisableFlagsInUseLine: true, + Run: func(_ *cobra.Command, _ []string) { + fmt.Printf("\n# %s\n", "skywire documentation") + fmt.Printf("\n## %s\n", "subcommand tree") + fmt.Printf("\n%s\n", "A tree representation of the skywire subcommands") + fmt.Printf("\n```\n") + _, err := script.Exec(os.Args[0] + " tree").Stdout() //nolint + if err != nil { + fmt.Println(err.Error()) + } + fmt.Printf("\n```\n") + + var use string + for _, j := range RootCmd.Commands() { + use = strings.Split(j.Use, " ")[0] + fmt.Printf("\n### %s\n", use) + fmt.Printf("\n```\n") + j.Help() //nolint + fmt.Printf("\n```\n") + if j.Name() == "cli" { + fmt.Printf("\n%s\n", "skywire command line interface") + fmt.Printf("\n## %s\n", RootCmd.Use) + fmt.Printf("\n```\n") + RootCmd.Help() //nolint + fmt.Printf("\n```\n") + fmt.Printf("\n## %s\n", "global flags") + fmt.Printf("\n%s\n", "The skywire-cli interacts with the running visor via rpc calls. By default the rpc server is available on localhost:3435. The rpc address and port the visor is using may be changed in the config file, once generated.") + + fmt.Printf("\n%s\n", "It is not recommended to expose the rpc server on the local network. Exposing the rpc allows unsecured access to the machine over the local network") + fmt.Printf("\n```\n") + fmt.Printf("\n%s\n", "Global Flags:") + fmt.Printf("\n%s\n", " --rpc string RPC server address (default \"localhost:3435\")") + fmt.Printf("\n%s\n", " --json bool print output as json") + fmt.Printf("\n```\n") + } + for _, k := range j.Commands() { + use = strings.Split(j.Use, " ")[0] + " " + strings.Split(k.Use, " ")[0] + fmt.Printf("\n#### %s\n", use) + fmt.Printf("\n```\n") + k.Help() //nolint + fmt.Printf("\n```\n") + if k.Name() == "survey" { + fmt.Printf("\n```\n") + _, err = script.Exec("sudo " + os.Args[0] + ` survey`).Stdout() //nolint + if err != nil { + fmt.Println(err.Error()) + } + fmt.Printf("\n```\n") + } + for _, l := range k.Commands() { + use = strings.Split(j.Use, " ")[0] + " " + strings.Split(k.Use, " ")[0] + " " + strings.Split(l.Use, " ")[0] + fmt.Printf("\n##### %s\n", use) + fmt.Printf("\n```\n") + l.Help() //nolint + fmt.Printf("\n```\n") + if l.Name() == "gen" { + fmt.Printf("\n##### Example for package / msi\n") + fmt.Printf("\n```\n") + fmt.Printf("$ skywire cli config gen -bpirxn\n") + _, err = script.Exec(os.Args[0] + ` cli config gen -bpirxn`).Stdout() //nolint + if err != nil { + fmt.Println(err.Error()) + } + fmt.Printf("\n```\n") + } + for _, m := range l.Commands() { + use = strings.Split(j.Use, " ")[0] + " " + strings.Split(k.Use, " ")[0] + " " + strings.Split(l.Use, " ")[0] + " " + strings.Split(m.Use, " ")[0] + fmt.Printf("\n###### %s\n", use) + fmt.Printf("\n```\n") + m.Help() //nolint + fmt.Printf("\n```\n") + for _, n := range m.Commands() { + use = strings.Split(j.Use, " ")[0] + " " + strings.Split(k.Use, " ")[0] + " " + strings.Split(l.Use, " ")[0] + " " + strings.Split(m.Use, " ")[0] + " " + strings.Split(n.Use, " ")[0] + fmt.Printf("\n###### %s\n", use) + fmt.Printf("\n```\n") + m.Help() //nolint + fmt.Printf("\n```\n") + for _, o := range n.Commands() { + use = strings.Split(j.Use, " ")[0] + " " + strings.Split(k.Use, " ")[0] + " " + strings.Split(l.Use, " ")[0] + " " + strings.Split(m.Use, " ")[0] + " " + strings.Split(n.Use, " ")[0] + " " + strings.Split(o.Use, " ")[0] + fmt.Printf("\n###### %s\n", use) + fmt.Printf("\n```\n") + m.Help() //nolint + fmt.Printf("\n```\n") + } + } + } + } + } + } + }, +} + +/* +cfgCmd.Flags().StringVarP(&pdmsgdURL, "dprod", "q", skywire.Prod.DmsgDiscovery, "prod dmsg discovery url") +cfgCmd.Flags().StringVarP(&tdmsgdURL, "dtest", "r", skywire.Test.DmsgDiscovery, "test dmsg discovery url") +cfgCmd.Flags().StringVarP(&dmsghttpCfg, "dfile", "u", "dmsghttp-config.json", "dmsghttp config json file") +cfgCmd.Flags().BoolVarP(&writeDmsghttp, "dw", "x", false, "write updates to dmsghttp config file") +*/ + +/* +var ( +prodURL,testURL,svcCfg,pdmsgdURL,tdmsgdURL,dmsghttpCfg string +writeSvc, writeDmsghttp bool +) + +// CombinedConfig represents the combined configuration of the production services +type CombinedConfig struct { + Prod struct { + Conf string `json:"conf,omitempty"` + skywire.Services `json:",inline"` // Embed the Services struct + } `json:"prod"` +} + +func init() { + cfgCmd.Flags().StringVarP(&prodURL, "prod", "p", skywire.ProdConf.Conf, "prod configuration url") + cfgCmd.Flags().StringVarP(&svcCfg, "sfile", "s", "services-config.json", "services config json file") + cfgCmd.Flags().BoolVarP(&writeSvc, "sw", "w", false, "write updates to services config file") + cfgCmd.Flags().StringVarP(&testURL, "test", "t", skywire.TestConf.Conf, "test configuration url") +} + +var cfgCmd = &cobra.Command{ + Use: "cfg", + Short: "update services-config.json & dmsghttp-config.json", + Long: `update services-config.json & dmsghttp-config.json`, + Hidden: true, + SilenceErrors: true, + SilenceUsage: true, + DisableSuggestions: true, + DisableFlagsInUseLine: true, + Run: func(_ *cobra.Command, _ []string) { + _, _ = script.File(svcCfg).JQ(".prod").Stdout() + os.Exit(0) +// pConf, err := script.File(svcCfg).JQ(".prod").Bytes() +// tConf, err := script.File(svcCfg).JQ(".test").Bytes() + // Fetch the prod configuration from prodURL + if prodURL != "" { + prodConf, err := script.Get(prodURL).JQ(".").Bytes() + if err != nil { + log.Fatal(err) + } + + // Create an instance of the CombinedConfig struct + var combinedConfig CombinedConfig + combinedConfig.Prod.Conf = skywire.ProdConf.Conf // Assign the existing Conf + + // Unmarshal the fetched prod configuration into the Services field + err = json.Unmarshal(prodConf, &combinedConfig.Prod.Services) + if err != nil { + log.Fatalf("Error unmarshaling prod config into Services: %v", err) + } + + // Read the existing services-config.json file + existingConfigData, err := os.ReadFile(svcCfg) + if err != nil { + log.Fatalf("Error reading services config file: %v", err) + } + + // Parse the existing configuration + var existingConfig map[string]interface{} + err = json.Unmarshal(existingConfigData, &existingConfig) + if err != nil { + log.Fatalf("Error unmarshaling existing services config: %v", err) + } + + // Update the prod section with the new configuration + existingConfig["prod"] = combinedConfig.Prod + + // Marshal the updated configuration back to JSON for output or saving + marshaled, err := json.MarshalIndent(existingConfig, "", " ") + if err != nil { + log.Fatalf("Error marshaling updated config: %v", err) + } + + // Print the updated configuration to the console + fmt.Println(string(marshaled)) + + // Write to file if the writeSvc flag is set + if writeSvc { + _, err := script.Echo(string(marshaled)).WriteFile(svcCfg) + if err != nil { + log.Fatalf("Error writing to services config file: %v", err) + } + fmt.Printf("Updated %s successfully.\n",svcCfg) + } + } + }, +} +*/ + +// Execute executes root CLI command. +func Execute() { + if err := RootCmd.Execute(); err != nil { + log.Fatal("Failed to execute command: ", err) + } +} diff --git a/cmd/skycoin-skywire/skywire.go b/cmd/skycoin-skywire/skywire.go new file mode 100644 index 0000000000..2da9746980 --- /dev/null +++ b/cmd/skycoin-skywire/skywire.go @@ -0,0 +1,45 @@ +// cmd/skywire/skywire.go +/* +skywire +*/ +package main + +import ( + cc "github.com/ivanpirog/coloredcobra" + "github.com/spf13/cobra" + + "github.com/skycoin/skywire/cmd/skycoin-skywire/commands" +) + +func init() { + var helpflag bool + commands.RootCmd.SetUsageTemplate(help) + commands.RootCmd.PersistentFlags().BoolVarP(&helpflag, "help", "h", false, "help menu") + commands.RootCmd.SetHelpCommand(&cobra.Command{Hidden: true}) + commands.RootCmd.PersistentFlags().MarkHidden("help") //nolint +} + +func main() { + cc.Init(&cc.Config{ + RootCmd: commands.RootCmd, + Headings: cc.HiBlue + cc.Bold, + Commands: cc.HiBlue + cc.Bold, + CmdShortDescr: cc.HiBlue, + Example: cc.HiBlue + cc.Italic, + ExecName: cc.HiBlue + cc.Bold, + Flags: cc.HiBlue + cc.Bold, + FlagsDescr: cc.HiBlue, + NoExtraNewlines: true, + NoBottomNewline: true, + }) + commands.Execute() +} + +const help = "{{if .HasAvailableSubCommands}}{{end}} {{if gt (len .Aliases) 0}}\r\n\r\n" + + "{{.NameAndAliases}}{{end}}{{if .HasAvailableSubCommands}}" + + "Available Commands:{{range .Commands}} {{if and (ne .Name \"completion\") .IsAvailableCommand}}\r\n " + + "{{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}}\r\n\r\n" + + "Flags:\r\n" + + "{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}}\r\n\r\n" + + "Global Flags:\r\n" + + "{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}\r\n\r\n" diff --git a/go.mod b/go.mod index 0760c9bec2..5ec764fcfb 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/blang/semver/v4 v4.0.0 github.com/ccding/go-stun/stun v0.0.0-20200514191101-4dc67bcdb029 github.com/elazarl/goproxy v0.0.0-20240909085733-6741dbfc16a1 - github.com/fatih/color v1.17.0 + github.com/fatih/color v1.18.0 github.com/gen2brain/dlgs v0.0.0-20220603100644-40c77870fa8d github.com/gin-gonic/gin v1.10.0 github.com/go-chi/chi/v5 v5.1.0 @@ -31,7 +31,7 @@ require ( github.com/robert-nix/ansihtml v1.0.1 github.com/sirupsen/logrus v1.9.3 github.com/skycoin/dmsg v1.3.29-0.20241019182716-022283c93835 - github.com/skycoin/skycoin v0.28.0 + github.com/skycoin/skycoin v0.28.1-0.20241104170131-96e4203814d4 github.com/skycoin/skycoin-service-discovery v1.3.29-0.20241019190420-233c2d68bce0 github.com/skycoin/skywire-services v1.3.29-0.20241019183828-0d760251ca55 github.com/skycoin/skywire-utilities v1.3.25 @@ -65,8 +65,11 @@ require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/alecthomas/chroma v0.10.0 // indirect + github.com/blang/semver v3.5.1+incompatible // indirect + github.com/boltdb/bolt v1.3.1 // indirect github.com/bytedance/sonic v1.12.3 // indirect github.com/bytedance/sonic/loader v0.2.0 // indirect + github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chen3feng/safecast v0.0.0-20220908170618-81b2ecd47937 // indirect @@ -76,7 +79,7 @@ require ( github.com/confiant-inc/go-socks5 v0.0.0-20210816151940-c1124825b1d6 // indirect github.com/containerd/console v1.0.4 // indirect github.com/creack/pty v1.1.23 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgraph-io/badger/v3 v3.2103.2 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect @@ -84,7 +87,7 @@ require ( github.com/dlclark/regexp2 v1.11.4 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/eliukblau/pixterm/pkg/ansimage v0.0.0-20191210081756-9fb6cf8c2f75 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.6 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-chi/chi v4.1.2+incompatible // indirect @@ -109,6 +112,7 @@ require ( github.com/google/pprof v0.0.0-20241017200806-017d972448fc // indirect github.com/gookit/color v1.5.4 // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/itchyny/gojq v0.12.16 // indirect github.com/itchyny/timefmt-go v0.1.6 // indirect @@ -127,23 +131,33 @@ require ( github.com/leodido/go-urn v1.4.0 // indirect github.com/lithammer/fuzzysearch v1.1.8 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/onsi/ginkgo/v2 v2.20.2 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/pires/go-proxyproto v0.8.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/quic-go/quic-go v0.48.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rs/cors v1.11.1 // indirect + github.com/sagikazarmark/locafero v0.6.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/shopspring/decimal v1.4.0 // indirect github.com/skycoin/noise v0.0.0-20180327030543-2492fe189ae6 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.0 // indirect + github.com/spf13/viper v1.19.0 // indirect github.com/stretchr/objx v0.5.2 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 // indirect github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b // indirect github.com/tjfoc/gmsm v1.4.1 // indirect @@ -155,6 +169,7 @@ require ( github.com/xtaci/lossyconn v0.0.0-20200209145036-adba10fffc37 // indirect go.opencensus.io v0.24.0 // indirect go.uber.org/mock v0.5.0 // indirect + go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.11.0 // indirect golang.org/x/crypto v0.28.0 // indirect golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect @@ -164,6 +179,7 @@ require ( golang.org/x/tools v0.26.0 // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect google.golang.org/protobuf v1.35.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/driver/postgres v1.5.9 // indirect @@ -174,7 +190,7 @@ require ( replace github.com/xxxserxxx/gotop/v4 => github.com/ersonp/gotop/v4 v4.2.1 -// Uncomment for tests with local sources of other skywire repos +// Uncomment for tests with local sources //replace github.com/skycoin/dmsg => ../dmsg //replace github.com/skycoin/skywire-services => ../skywire-services //replace github.com/skycoin/skycoin-service-discovery => ../skycoin-service-discovery @@ -187,6 +203,7 @@ replace github.com/xxxserxxx/gotop/v4 => github.com/ersonp/gotop/v4 v4.2.1 // replace github.com/skycoin/dmsg => github.com/skycoin/dmsg // replace github.com/skycoin/skywire-services => github.com/skycoin/skywire-services //replace github.com/skycoin/skywire-services => github.com/skycoin/skywire-services +// replace github.com/skycoin/skycoin => github.com/skycoin/skycoin // replace github.com/skycoin/skycoin-service-discovery => github.com/skycoin/skycoin-service-discovery // replace github.com/skycoin/skywire-utilities => github.com/skycoin/skywire-utilities diff --git a/go.sum b/go.sum index 37e786c8cf..4a48b0a169 100644 --- a/go.sum +++ b/go.sum @@ -106,7 +106,6 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -123,9 +122,11 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitfield/script v0.23.0 h1:N0R5yLEl6wJIS9PR/A6xXwjMsplMubyxdi05N5l0X28= github.com/bitfield/script v0.23.0/go.mod h1:fv+6x4OzVsRs6qAlc7wiGq8fq1b5orhtQdtW0dwjUHI= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bytedance/sonic v1.12.3 h1:W2MGa7RCU1QTeYRTPE3+88mVC0yXmsRQRChiyVocVjU= github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= @@ -134,7 +135,8 @@ github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/ccding/go-stun/stun v0.0.0-20200514191101-4dc67bcdb029 h1:POmUHfxXdeyM8Aomg4tKDcwATCFuW+cYLkj6pwsw9pc= github.com/ccding/go-stun/stun v0.0.0-20200514191101-4dc67bcdb029/go.mod h1:Rpr5n9cGHYdM3S3IK8ROSUUUYjQOu+MSUCZDcJbYWi8= -github.com/cenkalti/backoff v1.1.0/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -182,8 +184,9 @@ github.com/creack/pty v1.1.23 h1:4M6+isWdcStXEf15G/RbrMPOQj1dZ7HPZCGwE4kOeP0= github.com/creack/pty v1.1.23/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= 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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgraph-io/badger/v3 v3.2103.2 h1:dpyM5eCJAtQCBcMCZcT4UBZchuTJgCywerHHgmxfxM8= github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= @@ -221,13 +224,15 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= github.com/gen2brain/dlgs v0.0.0-20220603100644-40c77870fa8d h1:dHYKX8CBAs1zSGXm3q3M15CLAEwPEkwrK1ed8FCo+Xo= @@ -427,6 +432,7 @@ github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 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.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= @@ -489,7 +495,6 @@ github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZY github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= -github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -518,6 +523,8 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -541,7 +548,6 @@ github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= @@ -551,9 +557,9 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= @@ -588,8 +594,9 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -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/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -632,19 +639,22 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= +github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk= +github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/sirupsen/logrus v1.1.1/go.mod h1:zrgwTnHtNr00buQ1vSptGe8m1f/BbgsPukg8qsT7A+A= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -653,11 +663,12 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skycoin/dmsg v1.3.29-0.20241019182716-022283c93835 h1:29jU+cxqQGJCWoxGsrgk3nIF+JDipvJsQU89x6FKSZw= github.com/skycoin/dmsg v1.3.29-0.20241019182716-022283c93835/go.mod h1:hFJtHnX+pDC6v5Z81QPbpVktMMfMNzL/kgcZmCKu3Bg= +github.com/skycoin/encodertest v0.0.0-20190217072920-14c2e31898b9 h1:DElGw1Fhj4amuW1KM5q8Xowosb3RiOQce0lDJw0Qv0Y= github.com/skycoin/encodertest v0.0.0-20190217072920-14c2e31898b9/go.mod h1:OQz8NXVJUWEw7PWYASZ/1BIw5GXgVMTGvrCGDlZa9+k= github.com/skycoin/noise v0.0.0-20180327030543-2492fe189ae6 h1:1Nc5EBY6pjfw1kwW0duwyG+7WliWz5u9kgk1h5MnLuA= github.com/skycoin/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:UXghlricA7J3aRD/k7p/zBObQfmBawwCxIVPVjz2Q3o= -github.com/skycoin/skycoin v0.28.0 h1:0TN2tsU8CbCnGANKKxMr4jcG8RuBa8hWREeYtjDDtlk= -github.com/skycoin/skycoin v0.28.0/go.mod h1:E9RvlMn8iQGX/upaIQvkHHcw/180JBqAQbRIzkLrkSQ= +github.com/skycoin/skycoin v0.28.1-0.20241104170131-96e4203814d4 h1:dAl3DH6MgY2hGc4ZyyAi6BzZ3lq3+Uc0OhVeSTnImIo= +github.com/skycoin/skycoin v0.28.1-0.20241104170131-96e4203814d4/go.mod h1:ON+OrsftvWL/HrTi5a6AYxbZFTxRQFqXKwhaSl/WzRk= github.com/skycoin/skycoin-service-discovery v1.3.29-0.20241019190420-233c2d68bce0 h1:2F9JSOHefkyTLsREj8bMMXk1z13fJhnVa0R/XCxbUwM= github.com/skycoin/skycoin-service-discovery v1.3.29-0.20241019190420-233c2d68bce0/go.mod h1:3/WomvXyOLcjEMV4GiLv8b+bueohWa9ceoNwtQSB9KI= github.com/skycoin/skywire-services v1.3.29-0.20241019183828-0d760251ca55 h1:BqMp8eU21Wg7CCs7IxL8/gGqfGtmta93W/NFfEsYBiY= @@ -668,28 +679,32 @@ github.com/skycoin/systray v1.10.0 h1:fQZJHMylpVvfmOOTLvUssfyHVDoC8Idx6Ba2BlLEuG github.com/skycoin/systray v1.10.0/go.mod h1:/i17Eni5GxFiboIZceeamY5LktDSFFRCvd3fBMerQ+4= github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8 h1:TG/diQgUe0pntT/2D9tmUCz4VNwm9MfrtPr0SU2qSX8= github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8/go.mod h1:P5HUIBuIWKbyjl083/loAegFkfbFNx5i2qEP4CNbm7E= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.2.1/go.mod h1:P4AexN0a+C9tGAnUFNwDMYYZv3pjFuvmeiMyKRaNVlI= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= 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= @@ -709,6 +724,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 h1:89CEmDvlq/F7SJEOqkIdNDGJXrQIhuIx9D2DBXjavSU= @@ -719,7 +736,6 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= -github.com/toqueteos/webbrowser v1.1.0/go.mod h1:Hqqqmzj8AHn+VlZyVjaRWY20i25hoOZGAABCcg2el4A= github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ= github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= @@ -728,7 +744,6 @@ github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/valyala/fastrand v1.1.0 h1:f+5HkLW4rsgzdNoleUOB69hyT9IlD2ZQh9GyDMfb5G8= github.com/valyala/fastrand v1.1.0/go.mod h1:HWqCzkrkg6QXT8V2EXWvXCoow7vLwOFN002oeRzjapQ= github.com/valyala/histogram v1.2.0 h1:wyYGAZZt3CpwUiIb9AU/Zbllg1llXyrtApRS815OLoQ= @@ -770,12 +785,13 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ= golang.org/x/arch v0.11.0 h1:KXV8WWKCXm6tRpLirl2szsO5j/oOODwZf4hATmGVNs4= golang.org/x/arch v0.11.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181015023909-0c41d7ab0a0e/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/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= @@ -838,7 +854,6 @@ golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 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-20181023162649-9b4f9f5ad519/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= @@ -931,8 +946,6 @@ golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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-20180906133057-8cf3aee42992/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181023152157-44b849a8bc13/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-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1017,7 +1030,6 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc 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= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1298,6 +1310,7 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= diff --git a/vendor/github.com/blang/semver/.travis.yml b/vendor/github.com/blang/semver/.travis.yml new file mode 100644 index 0000000000..102fb9a691 --- /dev/null +++ b/vendor/github.com/blang/semver/.travis.yml @@ -0,0 +1,21 @@ +language: go +matrix: + include: + - go: 1.4.3 + - go: 1.5.4 + - go: 1.6.3 + - go: 1.7 + - go: tip + allow_failures: + - go: tip +install: +- go get golang.org/x/tools/cmd/cover +- go get github.com/mattn/goveralls +script: +- echo "Test and track coverage" ; $HOME/gopath/bin/goveralls -package "." -service=travis-ci + -repotoken $COVERALLS_TOKEN +- echo "Build examples" ; cd examples && go build +- echo "Check if gofmt'd" ; diff -u <(echo -n) <(gofmt -d -s .) +env: + global: + secure: HroGEAUQpVq9zX1b1VIkraLiywhGbzvNnTZq2TMxgK7JHP8xqNplAeF1izrR2i4QLL9nsY+9WtYss4QuPvEtZcVHUobw6XnL6radF7jS1LgfYZ9Y7oF+zogZ2I5QUMRLGA7rcxQ05s7mKq3XZQfeqaNts4bms/eZRefWuaFZbkw= diff --git a/vendor/github.com/blang/semver/LICENSE b/vendor/github.com/blang/semver/LICENSE new file mode 100644 index 0000000000..5ba5c86fcb --- /dev/null +++ b/vendor/github.com/blang/semver/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2014 Benedikt Lang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/vendor/github.com/blang/semver/README.md b/vendor/github.com/blang/semver/README.md new file mode 100644 index 0000000000..08b2e4a3d7 --- /dev/null +++ b/vendor/github.com/blang/semver/README.md @@ -0,0 +1,194 @@ +semver for golang [![Build Status](https://travis-ci.org/blang/semver.svg?branch=master)](https://travis-ci.org/blang/semver) [![GoDoc](https://godoc.org/github.com/blang/semver?status.png)](https://godoc.org/github.com/blang/semver) [![Coverage Status](https://img.shields.io/coveralls/blang/semver.svg)](https://coveralls.io/r/blang/semver?branch=master) +====== + +semver is a [Semantic Versioning](http://semver.org/) library written in golang. It fully covers spec version `2.0.0`. + +Usage +----- +```bash +$ go get github.com/blang/semver +``` +Note: Always vendor your dependencies or fix on a specific version tag. + +```go +import github.com/blang/semver +v1, err := semver.Make("1.0.0-beta") +v2, err := semver.Make("2.0.0-beta") +v1.Compare(v2) +``` + +Also check the [GoDocs](http://godoc.org/github.com/blang/semver). + +Why should I use this lib? +----- + +- Fully spec compatible +- No reflection +- No regex +- Fully tested (Coverage >99%) +- Readable parsing/validation errors +- Fast (See [Benchmarks](#benchmarks)) +- Only Stdlib +- Uses values instead of pointers +- Many features, see below + + +Features +----- + +- Parsing and validation at all levels +- Comparator-like comparisons +- Compare Helper Methods +- InPlace manipulation +- Ranges `>=1.0.0 <2.0.0 || >=3.0.0 !3.0.1-beta.1` +- Wildcards `>=1.x`, `<=2.5.x` +- Sortable (implements sort.Interface) +- database/sql compatible (sql.Scanner/Valuer) +- encoding/json compatible (json.Marshaler/Unmarshaler) + +Ranges +------ + +A `Range` is a set of conditions which specify which versions satisfy the range. + +A condition is composed of an operator and a version. The supported operators are: + +- `<1.0.0` Less than `1.0.0` +- `<=1.0.0` Less than or equal to `1.0.0` +- `>1.0.0` Greater than `1.0.0` +- `>=1.0.0` Greater than or equal to `1.0.0` +- `1.0.0`, `=1.0.0`, `==1.0.0` Equal to `1.0.0` +- `!1.0.0`, `!=1.0.0` Not equal to `1.0.0`. Excludes version `1.0.0`. + +Note that spaces between the operator and the version will be gracefully tolerated. + +A `Range` can link multiple `Ranges` separated by space: + +Ranges can be linked by logical AND: + + - `>1.0.0 <2.0.0` would match between both ranges, so `1.1.1` and `1.8.7` but not `1.0.0` or `2.0.0` + - `>1.0.0 <3.0.0 !2.0.3-beta.2` would match every version between `1.0.0` and `3.0.0` except `2.0.3-beta.2` + +Ranges can also be linked by logical OR: + + - `<2.0.0 || >=3.0.0` would match `1.x.x` and `3.x.x` but not `2.x.x` + +AND has a higher precedence than OR. It's not possible to use brackets. + +Ranges can be combined by both AND and OR + + - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1` + +Range usage: + +``` +v, err := semver.Parse("1.2.3") +range, err := semver.ParseRange(">1.0.0 <2.0.0 || >=3.0.0") +if range(v) { + //valid +} + +``` + +Example +----- + +Have a look at full examples in [examples/main.go](examples/main.go) + +```go +import github.com/blang/semver + +v, err := semver.Make("0.0.1-alpha.preview+123.github") +fmt.Printf("Major: %d\n", v.Major) +fmt.Printf("Minor: %d\n", v.Minor) +fmt.Printf("Patch: %d\n", v.Patch) +fmt.Printf("Pre: %s\n", v.Pre) +fmt.Printf("Build: %s\n", v.Build) + +// Prerelease versions array +if len(v.Pre) > 0 { + fmt.Println("Prerelease versions:") + for i, pre := range v.Pre { + fmt.Printf("%d: %q\n", i, pre) + } +} + +// Build meta data array +if len(v.Build) > 0 { + fmt.Println("Build meta data:") + for i, build := range v.Build { + fmt.Printf("%d: %q\n", i, build) + } +} + +v001, err := semver.Make("0.0.1") +// Compare using helpers: v.GT(v2), v.LT, v.GTE, v.LTE +v001.GT(v) == true +v.LT(v001) == true +v.GTE(v) == true +v.LTE(v) == true + +// Or use v.Compare(v2) for comparisons (-1, 0, 1): +v001.Compare(v) == 1 +v.Compare(v001) == -1 +v.Compare(v) == 0 + +// Manipulate Version in place: +v.Pre[0], err = semver.NewPRVersion("beta") +if err != nil { + fmt.Printf("Error parsing pre release version: %q", err) +} + +fmt.Println("\nValidate versions:") +v.Build[0] = "?" + +err = v.Validate() +if err != nil { + fmt.Printf("Validation failed: %s\n", err) +} +``` + + +Benchmarks +----- + + BenchmarkParseSimple-4 5000000 390 ns/op 48 B/op 1 allocs/op + BenchmarkParseComplex-4 1000000 1813 ns/op 256 B/op 7 allocs/op + BenchmarkParseAverage-4 1000000 1171 ns/op 163 B/op 4 allocs/op + BenchmarkStringSimple-4 20000000 119 ns/op 16 B/op 1 allocs/op + BenchmarkStringLarger-4 10000000 206 ns/op 32 B/op 2 allocs/op + BenchmarkStringComplex-4 5000000 324 ns/op 80 B/op 3 allocs/op + BenchmarkStringAverage-4 5000000 273 ns/op 53 B/op 2 allocs/op + BenchmarkValidateSimple-4 200000000 9.33 ns/op 0 B/op 0 allocs/op + BenchmarkValidateComplex-4 3000000 469 ns/op 0 B/op 0 allocs/op + BenchmarkValidateAverage-4 5000000 256 ns/op 0 B/op 0 allocs/op + BenchmarkCompareSimple-4 100000000 11.8 ns/op 0 B/op 0 allocs/op + BenchmarkCompareComplex-4 50000000 30.8 ns/op 0 B/op 0 allocs/op + BenchmarkCompareAverage-4 30000000 41.5 ns/op 0 B/op 0 allocs/op + BenchmarkSort-4 3000000 419 ns/op 256 B/op 2 allocs/op + BenchmarkRangeParseSimple-4 2000000 850 ns/op 192 B/op 5 allocs/op + BenchmarkRangeParseAverage-4 1000000 1677 ns/op 400 B/op 10 allocs/op + BenchmarkRangeParseComplex-4 300000 5214 ns/op 1440 B/op 30 allocs/op + BenchmarkRangeMatchSimple-4 50000000 25.6 ns/op 0 B/op 0 allocs/op + BenchmarkRangeMatchAverage-4 30000000 56.4 ns/op 0 B/op 0 allocs/op + BenchmarkRangeMatchComplex-4 10000000 153 ns/op 0 B/op 0 allocs/op + +See benchmark cases at [semver_test.go](semver_test.go) + + +Motivation +----- + +I simply couldn't find any lib supporting the full spec. Others were just wrong or used reflection and regex which i don't like. + + +Contribution +----- + +Feel free to make a pull request. For bigger changes create a issue first to discuss about it. + + +License +----- + +See [LICENSE](LICENSE) file. diff --git a/vendor/github.com/blang/semver/json.go b/vendor/github.com/blang/semver/json.go new file mode 100644 index 0000000000..a74bf7c449 --- /dev/null +++ b/vendor/github.com/blang/semver/json.go @@ -0,0 +1,23 @@ +package semver + +import ( + "encoding/json" +) + +// MarshalJSON implements the encoding/json.Marshaler interface. +func (v Version) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements the encoding/json.Unmarshaler interface. +func (v *Version) UnmarshalJSON(data []byte) (err error) { + var versionString string + + if err = json.Unmarshal(data, &versionString); err != nil { + return + } + + *v, err = Parse(versionString) + + return +} diff --git a/vendor/github.com/blang/semver/package.json b/vendor/github.com/blang/semver/package.json new file mode 100644 index 0000000000..1cf8ebdd9c --- /dev/null +++ b/vendor/github.com/blang/semver/package.json @@ -0,0 +1,17 @@ +{ + "author": "blang", + "bugs": { + "URL": "https://github.com/blang/semver/issues", + "url": "https://github.com/blang/semver/issues" + }, + "gx": { + "dvcsimport": "github.com/blang/semver" + }, + "gxVersion": "0.10.0", + "language": "go", + "license": "MIT", + "name": "semver", + "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", + "version": "3.5.1" +} + diff --git a/vendor/github.com/blang/semver/range.go b/vendor/github.com/blang/semver/range.go new file mode 100644 index 0000000000..fca406d479 --- /dev/null +++ b/vendor/github.com/blang/semver/range.go @@ -0,0 +1,416 @@ +package semver + +import ( + "fmt" + "strconv" + "strings" + "unicode" +) + +type wildcardType int + +const ( + noneWildcard wildcardType = iota + majorWildcard wildcardType = 1 + minorWildcard wildcardType = 2 + patchWildcard wildcardType = 3 +) + +func wildcardTypefromInt(i int) wildcardType { + switch i { + case 1: + return majorWildcard + case 2: + return minorWildcard + case 3: + return patchWildcard + default: + return noneWildcard + } +} + +type comparator func(Version, Version) bool + +var ( + compEQ comparator = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == 0 + } + compNE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) != 0 + } + compGT = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == 1 + } + compGE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) >= 0 + } + compLT = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == -1 + } + compLE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) <= 0 + } +) + +type versionRange struct { + v Version + c comparator +} + +// rangeFunc creates a Range from the given versionRange. +func (vr *versionRange) rangeFunc() Range { + return Range(func(v Version) bool { + return vr.c(v, vr.v) + }) +} + +// Range represents a range of versions. +// A Range can be used to check if a Version satisfies it: +// +// range, err := semver.ParseRange(">1.0.0 <2.0.0") +// range(semver.MustParse("1.1.1") // returns true +type Range func(Version) bool + +// OR combines the existing Range with another Range using logical OR. +func (rf Range) OR(f Range) Range { + return Range(func(v Version) bool { + return rf(v) || f(v) + }) +} + +// AND combines the existing Range with another Range using logical AND. +func (rf Range) AND(f Range) Range { + return Range(func(v Version) bool { + return rf(v) && f(v) + }) +} + +// ParseRange parses a range and returns a Range. +// If the range could not be parsed an error is returned. +// +// Valid ranges are: +// - "<1.0.0" +// - "<=1.0.0" +// - ">1.0.0" +// - ">=1.0.0" +// - "1.0.0", "=1.0.0", "==1.0.0" +// - "!1.0.0", "!=1.0.0" +// +// A Range can consist of multiple ranges separated by space: +// Ranges can be linked by logical AND: +// - ">1.0.0 <2.0.0" would match between both ranges, so "1.1.1" and "1.8.7" but not "1.0.0" or "2.0.0" +// - ">1.0.0 <3.0.0 !2.0.3-beta.2" would match every version between 1.0.0 and 3.0.0 except 2.0.3-beta.2 +// +// Ranges can also be linked by logical OR: +// - "<2.0.0 || >=3.0.0" would match "1.x.x" and "3.x.x" but not "2.x.x" +// +// AND has a higher precedence than OR. It's not possible to use brackets. +// +// Ranges can be combined by both AND and OR +// +// - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1` +func ParseRange(s string) (Range, error) { + parts := splitAndTrim(s) + orParts, err := splitORParts(parts) + if err != nil { + return nil, err + } + expandedParts, err := expandWildcardVersion(orParts) + if err != nil { + return nil, err + } + var orFn Range + for _, p := range expandedParts { + var andFn Range + for _, ap := range p { + opStr, vStr, err := splitComparatorVersion(ap) + if err != nil { + return nil, err + } + vr, err := buildVersionRange(opStr, vStr) + if err != nil { + return nil, fmt.Errorf("Could not parse Range %q: %s", ap, err) + } + rf := vr.rangeFunc() + + // Set function + if andFn == nil { + andFn = rf + } else { // Combine with existing function + andFn = andFn.AND(rf) + } + } + if orFn == nil { + orFn = andFn + } else { + orFn = orFn.OR(andFn) + } + + } + return orFn, nil +} + +// splitORParts splits the already cleaned parts by '||'. +// Checks for invalid positions of the operator and returns an +// error if found. +func splitORParts(parts []string) ([][]string, error) { + var ORparts [][]string + last := 0 + for i, p := range parts { + if p == "||" { + if i == 0 { + return nil, fmt.Errorf("First element in range is '||'") + } + ORparts = append(ORparts, parts[last:i]) + last = i + 1 + } + } + if last == len(parts) { + return nil, fmt.Errorf("Last element in range is '||'") + } + ORparts = append(ORparts, parts[last:]) + return ORparts, nil +} + +// buildVersionRange takes a slice of 2: operator and version +// and builds a versionRange, otherwise an error. +func buildVersionRange(opStr, vStr string) (*versionRange, error) { + c := parseComparator(opStr) + if c == nil { + return nil, fmt.Errorf("Could not parse comparator %q in %q", opStr, strings.Join([]string{opStr, vStr}, "")) + } + v, err := Parse(vStr) + if err != nil { + return nil, fmt.Errorf("Could not parse version %q in %q: %s", vStr, strings.Join([]string{opStr, vStr}, ""), err) + } + + return &versionRange{ + v: v, + c: c, + }, nil + +} + +// inArray checks if a byte is contained in an array of bytes +func inArray(s byte, list []byte) bool { + for _, el := range list { + if el == s { + return true + } + } + return false +} + +// splitAndTrim splits a range string by spaces and cleans whitespaces +func splitAndTrim(s string) (result []string) { + last := 0 + var lastChar byte + excludeFromSplit := []byte{'>', '<', '='} + for i := 0; i < len(s); i++ { + if s[i] == ' ' && !inArray(lastChar, excludeFromSplit) { + if last < i-1 { + result = append(result, s[last:i]) + } + last = i + 1 + } else if s[i] != ' ' { + lastChar = s[i] + } + } + if last < len(s)-1 { + result = append(result, s[last:]) + } + + for i, v := range result { + result[i] = strings.Replace(v, " ", "", -1) + } + + // parts := strings.Split(s, " ") + // for _, x := range parts { + // if s := strings.TrimSpace(x); len(s) != 0 { + // result = append(result, s) + // } + // } + return +} + +// splitComparatorVersion splits the comparator from the version. +// Input must be free of leading or trailing spaces. +func splitComparatorVersion(s string) (string, string, error) { + i := strings.IndexFunc(s, unicode.IsDigit) + if i == -1 { + return "", "", fmt.Errorf("Could not get version from string: %q", s) + } + return strings.TrimSpace(s[0:i]), s[i:], nil +} + +// getWildcardType will return the type of wildcard that the +// passed version contains +func getWildcardType(vStr string) wildcardType { + parts := strings.Split(vStr, ".") + nparts := len(parts) + wildcard := parts[nparts-1] + + possibleWildcardType := wildcardTypefromInt(nparts) + if wildcard == "x" { + return possibleWildcardType + } + + return noneWildcard +} + +// createVersionFromWildcard will convert a wildcard version +// into a regular version, replacing 'x's with '0's, handling +// special cases like '1.x.x' and '1.x' +func createVersionFromWildcard(vStr string) string { + // handle 1.x.x + vStr2 := strings.Replace(vStr, ".x.x", ".x", 1) + vStr2 = strings.Replace(vStr2, ".x", ".0", 1) + parts := strings.Split(vStr2, ".") + + // handle 1.x + if len(parts) == 2 { + return vStr2 + ".0" + } + + return vStr2 +} + +// incrementMajorVersion will increment the major version +// of the passed version +func incrementMajorVersion(vStr string) (string, error) { + parts := strings.Split(vStr, ".") + i, err := strconv.Atoi(parts[0]) + if err != nil { + return "", err + } + parts[0] = strconv.Itoa(i + 1) + + return strings.Join(parts, "."), nil +} + +// incrementMajorVersion will increment the minor version +// of the passed version +func incrementMinorVersion(vStr string) (string, error) { + parts := strings.Split(vStr, ".") + i, err := strconv.Atoi(parts[1]) + if err != nil { + return "", err + } + parts[1] = strconv.Itoa(i + 1) + + return strings.Join(parts, "."), nil +} + +// expandWildcardVersion will expand wildcards inside versions +// following these rules: +// +// * when dealing with patch wildcards: +// >= 1.2.x will become >= 1.2.0 +// <= 1.2.x will become < 1.3.0 +// > 1.2.x will become >= 1.3.0 +// < 1.2.x will become < 1.2.0 +// != 1.2.x will become < 1.2.0 >= 1.3.0 +// +// * when dealing with minor wildcards: +// >= 1.x will become >= 1.0.0 +// <= 1.x will become < 2.0.0 +// > 1.x will become >= 2.0.0 +// < 1.0 will become < 1.0.0 +// != 1.x will become < 1.0.0 >= 2.0.0 +// +// * when dealing with wildcards without +// version operator: +// 1.2.x will become >= 1.2.0 < 1.3.0 +// 1.x will become >= 1.0.0 < 2.0.0 +func expandWildcardVersion(parts [][]string) ([][]string, error) { + var expandedParts [][]string + for _, p := range parts { + var newParts []string + for _, ap := range p { + if strings.Index(ap, "x") != -1 { + opStr, vStr, err := splitComparatorVersion(ap) + if err != nil { + return nil, err + } + + versionWildcardType := getWildcardType(vStr) + flatVersion := createVersionFromWildcard(vStr) + + var resultOperator string + var shouldIncrementVersion bool + switch opStr { + case ">": + resultOperator = ">=" + shouldIncrementVersion = true + case ">=": + resultOperator = ">=" + case "<": + resultOperator = "<" + case "<=": + resultOperator = "<" + shouldIncrementVersion = true + case "", "=", "==": + newParts = append(newParts, ">="+flatVersion) + resultOperator = "<" + shouldIncrementVersion = true + case "!=", "!": + newParts = append(newParts, "<"+flatVersion) + resultOperator = ">=" + shouldIncrementVersion = true + } + + var resultVersion string + if shouldIncrementVersion { + switch versionWildcardType { + case patchWildcard: + resultVersion, _ = incrementMinorVersion(flatVersion) + case minorWildcard: + resultVersion, _ = incrementMajorVersion(flatVersion) + } + } else { + resultVersion = flatVersion + } + + ap = resultOperator + resultVersion + } + newParts = append(newParts, ap) + } + expandedParts = append(expandedParts, newParts) + } + + return expandedParts, nil +} + +func parseComparator(s string) comparator { + switch s { + case "==": + fallthrough + case "": + fallthrough + case "=": + return compEQ + case ">": + return compGT + case ">=": + return compGE + case "<": + return compLT + case "<=": + return compLE + case "!": + fallthrough + case "!=": + return compNE + } + + return nil +} + +// MustParseRange is like ParseRange but panics if the range cannot be parsed. +func MustParseRange(s string) Range { + r, err := ParseRange(s) + if err != nil { + panic(`semver: ParseRange(` + s + `): ` + err.Error()) + } + return r +} diff --git a/vendor/github.com/blang/semver/semver.go b/vendor/github.com/blang/semver/semver.go new file mode 100644 index 0000000000..8ee0842e6a --- /dev/null +++ b/vendor/github.com/blang/semver/semver.go @@ -0,0 +1,418 @@ +package semver + +import ( + "errors" + "fmt" + "strconv" + "strings" +) + +const ( + numbers string = "0123456789" + alphas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + alphanum = alphas + numbers +) + +// SpecVersion is the latest fully supported spec version of semver +var SpecVersion = Version{ + Major: 2, + Minor: 0, + Patch: 0, +} + +// Version represents a semver compatible version +type Version struct { + Major uint64 + Minor uint64 + Patch uint64 + Pre []PRVersion + Build []string //No Precendence +} + +// Version to string +func (v Version) String() string { + b := make([]byte, 0, 5) + b = strconv.AppendUint(b, v.Major, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Minor, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Patch, 10) + + if len(v.Pre) > 0 { + b = append(b, '-') + b = append(b, v.Pre[0].String()...) + + for _, pre := range v.Pre[1:] { + b = append(b, '.') + b = append(b, pre.String()...) + } + } + + if len(v.Build) > 0 { + b = append(b, '+') + b = append(b, v.Build[0]...) + + for _, build := range v.Build[1:] { + b = append(b, '.') + b = append(b, build...) + } + } + + return string(b) +} + +// Equals checks if v is equal to o. +func (v Version) Equals(o Version) bool { + return (v.Compare(o) == 0) +} + +// EQ checks if v is equal to o. +func (v Version) EQ(o Version) bool { + return (v.Compare(o) == 0) +} + +// NE checks if v is not equal to o. +func (v Version) NE(o Version) bool { + return (v.Compare(o) != 0) +} + +// GT checks if v is greater than o. +func (v Version) GT(o Version) bool { + return (v.Compare(o) == 1) +} + +// GTE checks if v is greater than or equal to o. +func (v Version) GTE(o Version) bool { + return (v.Compare(o) >= 0) +} + +// GE checks if v is greater than or equal to o. +func (v Version) GE(o Version) bool { + return (v.Compare(o) >= 0) +} + +// LT checks if v is less than o. +func (v Version) LT(o Version) bool { + return (v.Compare(o) == -1) +} + +// LTE checks if v is less than or equal to o. +func (v Version) LTE(o Version) bool { + return (v.Compare(o) <= 0) +} + +// LE checks if v is less than or equal to o. +func (v Version) LE(o Version) bool { + return (v.Compare(o) <= 0) +} + +// Compare compares Versions v to o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v Version) Compare(o Version) int { + if v.Major != o.Major { + if v.Major > o.Major { + return 1 + } + return -1 + } + if v.Minor != o.Minor { + if v.Minor > o.Minor { + return 1 + } + return -1 + } + if v.Patch != o.Patch { + if v.Patch > o.Patch { + return 1 + } + return -1 + } + + // Quick comparison if a version has no prerelease versions + if len(v.Pre) == 0 && len(o.Pre) == 0 { + return 0 + } else if len(v.Pre) == 0 && len(o.Pre) > 0 { + return 1 + } else if len(v.Pre) > 0 && len(o.Pre) == 0 { + return -1 + } + + i := 0 + for ; i < len(v.Pre) && i < len(o.Pre); i++ { + if comp := v.Pre[i].Compare(o.Pre[i]); comp == 0 { + continue + } else if comp == 1 { + return 1 + } else { + return -1 + } + } + + // If all pr versions are the equal but one has further prversion, this one greater + if i == len(v.Pre) && i == len(o.Pre) { + return 0 + } else if i == len(v.Pre) && i < len(o.Pre) { + return -1 + } else { + return 1 + } + +} + +// Validate validates v and returns error in case +func (v Version) Validate() error { + // Major, Minor, Patch already validated using uint64 + + for _, pre := range v.Pre { + if !pre.IsNum { //Numeric prerelease versions already uint64 + if len(pre.VersionStr) == 0 { + return fmt.Errorf("Prerelease can not be empty %q", pre.VersionStr) + } + if !containsOnly(pre.VersionStr, alphanum) { + return fmt.Errorf("Invalid character(s) found in prerelease %q", pre.VersionStr) + } + } + } + + for _, build := range v.Build { + if len(build) == 0 { + return fmt.Errorf("Build meta data can not be empty %q", build) + } + if !containsOnly(build, alphanum) { + return fmt.Errorf("Invalid character(s) found in build meta data %q", build) + } + } + + return nil +} + +// New is an alias for Parse and returns a pointer, parses version string and returns a validated Version or error +func New(s string) (vp *Version, err error) { + v, err := Parse(s) + vp = &v + return +} + +// Make is an alias for Parse, parses version string and returns a validated Version or error +func Make(s string) (Version, error) { + return Parse(s) +} + +// ParseTolerant allows for certain version specifications that do not strictly adhere to semver +// specs to be parsed by this library. It does so by normalizing versions before passing them to +// Parse(). It currently trims spaces, removes a "v" prefix, and adds a 0 patch number to versions +// with only major and minor components specified +func ParseTolerant(s string) (Version, error) { + s = strings.TrimSpace(s) + s = strings.TrimPrefix(s, "v") + + // Split into major.minor.(patch+pr+meta) + parts := strings.SplitN(s, ".", 3) + if len(parts) < 3 { + if strings.ContainsAny(parts[len(parts)-1], "+-") { + return Version{}, errors.New("Short version cannot contain PreRelease/Build meta data") + } + for len(parts) < 3 { + parts = append(parts, "0") + } + s = strings.Join(parts, ".") + } + + return Parse(s) +} + +// Parse parses version string and returns a validated Version or error +func Parse(s string) (Version, error) { + if len(s) == 0 { + return Version{}, errors.New("Version string empty") + } + + // Split into major.minor.(patch+pr+meta) + parts := strings.SplitN(s, ".", 3) + if len(parts) != 3 { + return Version{}, errors.New("No Major.Minor.Patch elements found") + } + + // Major + if !containsOnly(parts[0], numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in major number %q", parts[0]) + } + if hasLeadingZeroes(parts[0]) { + return Version{}, fmt.Errorf("Major number must not contain leading zeroes %q", parts[0]) + } + major, err := strconv.ParseUint(parts[0], 10, 64) + if err != nil { + return Version{}, err + } + + // Minor + if !containsOnly(parts[1], numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in minor number %q", parts[1]) + } + if hasLeadingZeroes(parts[1]) { + return Version{}, fmt.Errorf("Minor number must not contain leading zeroes %q", parts[1]) + } + minor, err := strconv.ParseUint(parts[1], 10, 64) + if err != nil { + return Version{}, err + } + + v := Version{} + v.Major = major + v.Minor = minor + + var build, prerelease []string + patchStr := parts[2] + + if buildIndex := strings.IndexRune(patchStr, '+'); buildIndex != -1 { + build = strings.Split(patchStr[buildIndex+1:], ".") + patchStr = patchStr[:buildIndex] + } + + if preIndex := strings.IndexRune(patchStr, '-'); preIndex != -1 { + prerelease = strings.Split(patchStr[preIndex+1:], ".") + patchStr = patchStr[:preIndex] + } + + if !containsOnly(patchStr, numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in patch number %q", patchStr) + } + if hasLeadingZeroes(patchStr) { + return Version{}, fmt.Errorf("Patch number must not contain leading zeroes %q", patchStr) + } + patch, err := strconv.ParseUint(patchStr, 10, 64) + if err != nil { + return Version{}, err + } + + v.Patch = patch + + // Prerelease + for _, prstr := range prerelease { + parsedPR, err := NewPRVersion(prstr) + if err != nil { + return Version{}, err + } + v.Pre = append(v.Pre, parsedPR) + } + + // Build meta data + for _, str := range build { + if len(str) == 0 { + return Version{}, errors.New("Build meta data is empty") + } + if !containsOnly(str, alphanum) { + return Version{}, fmt.Errorf("Invalid character(s) found in build meta data %q", str) + } + v.Build = append(v.Build, str) + } + + return v, nil +} + +// MustParse is like Parse but panics if the version cannot be parsed. +func MustParse(s string) Version { + v, err := Parse(s) + if err != nil { + panic(`semver: Parse(` + s + `): ` + err.Error()) + } + return v +} + +// PRVersion represents a PreRelease Version +type PRVersion struct { + VersionStr string + VersionNum uint64 + IsNum bool +} + +// NewPRVersion creates a new valid prerelease version +func NewPRVersion(s string) (PRVersion, error) { + if len(s) == 0 { + return PRVersion{}, errors.New("Prerelease is empty") + } + v := PRVersion{} + if containsOnly(s, numbers) { + if hasLeadingZeroes(s) { + return PRVersion{}, fmt.Errorf("Numeric PreRelease version must not contain leading zeroes %q", s) + } + num, err := strconv.ParseUint(s, 10, 64) + + // Might never be hit, but just in case + if err != nil { + return PRVersion{}, err + } + v.VersionNum = num + v.IsNum = true + } else if containsOnly(s, alphanum) { + v.VersionStr = s + v.IsNum = false + } else { + return PRVersion{}, fmt.Errorf("Invalid character(s) found in prerelease %q", s) + } + return v, nil +} + +// IsNumeric checks if prerelease-version is numeric +func (v PRVersion) IsNumeric() bool { + return v.IsNum +} + +// Compare compares two PreRelease Versions v and o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v PRVersion) Compare(o PRVersion) int { + if v.IsNum && !o.IsNum { + return -1 + } else if !v.IsNum && o.IsNum { + return 1 + } else if v.IsNum && o.IsNum { + if v.VersionNum == o.VersionNum { + return 0 + } else if v.VersionNum > o.VersionNum { + return 1 + } else { + return -1 + } + } else { // both are Alphas + if v.VersionStr == o.VersionStr { + return 0 + } else if v.VersionStr > o.VersionStr { + return 1 + } else { + return -1 + } + } +} + +// PreRelease version to string +func (v PRVersion) String() string { + if v.IsNum { + return strconv.FormatUint(v.VersionNum, 10) + } + return v.VersionStr +} + +func containsOnly(s string, set string) bool { + return strings.IndexFunc(s, func(r rune) bool { + return !strings.ContainsRune(set, r) + }) == -1 +} + +func hasLeadingZeroes(s string) bool { + return len(s) > 1 && s[0] == '0' +} + +// NewBuildVersion creates a new valid build version +func NewBuildVersion(s string) (string, error) { + if len(s) == 0 { + return "", errors.New("Buildversion is empty") + } + if !containsOnly(s, alphanum) { + return "", fmt.Errorf("Invalid character(s) found in build meta data %q", s) + } + return s, nil +} diff --git a/vendor/github.com/blang/semver/sort.go b/vendor/github.com/blang/semver/sort.go new file mode 100644 index 0000000000..e18f880826 --- /dev/null +++ b/vendor/github.com/blang/semver/sort.go @@ -0,0 +1,28 @@ +package semver + +import ( + "sort" +) + +// Versions represents multiple versions. +type Versions []Version + +// Len returns length of version collection +func (s Versions) Len() int { + return len(s) +} + +// Swap swaps two versions inside the collection by its indices +func (s Versions) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Less checks if version at index i is less than version at index j +func (s Versions) Less(i, j int) bool { + return s[i].LT(s[j]) +} + +// Sort sorts a slice of versions +func Sort(versions []Version) { + sort.Sort(Versions(versions)) +} diff --git a/vendor/github.com/blang/semver/sql.go b/vendor/github.com/blang/semver/sql.go new file mode 100644 index 0000000000..eb4d802666 --- /dev/null +++ b/vendor/github.com/blang/semver/sql.go @@ -0,0 +1,30 @@ +package semver + +import ( + "database/sql/driver" + "fmt" +) + +// Scan implements the database/sql.Scanner interface. +func (v *Version) Scan(src interface{}) (err error) { + var str string + switch src := src.(type) { + case string: + str = src + case []byte: + str = string(src) + default: + return fmt.Errorf("Version.Scan: cannot convert %T to string.", src) + } + + if t, err := Parse(str); err == nil { + *v = t + } + + return +} + +// Value implements the database/sql/driver.Valuer interface. +func (v Version) Value() (driver.Value, error) { + return v.String(), nil +} diff --git a/vendor/github.com/boltdb/bolt/.gitignore b/vendor/github.com/boltdb/bolt/.gitignore new file mode 100644 index 0000000000..c7bd2b7a5b --- /dev/null +++ b/vendor/github.com/boltdb/bolt/.gitignore @@ -0,0 +1,4 @@ +*.prof +*.test +*.swp +/bin/ diff --git a/vendor/github.com/boltdb/bolt/LICENSE b/vendor/github.com/boltdb/bolt/LICENSE new file mode 100644 index 0000000000..004e77fe5d --- /dev/null +++ b/vendor/github.com/boltdb/bolt/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Ben Johnson + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/boltdb/bolt/Makefile b/vendor/github.com/boltdb/bolt/Makefile new file mode 100644 index 0000000000..e035e63adc --- /dev/null +++ b/vendor/github.com/boltdb/bolt/Makefile @@ -0,0 +1,18 @@ +BRANCH=`git rev-parse --abbrev-ref HEAD` +COMMIT=`git rev-parse --short HEAD` +GOLDFLAGS="-X main.branch $(BRANCH) -X main.commit $(COMMIT)" + +default: build + +race: + @go test -v -race -test.run="TestSimulate_(100op|1000op)" + +# go get github.com/kisielk/errcheck +errcheck: + @errcheck -ignorepkg=bytes -ignore=os:Remove github.com/boltdb/bolt + +test: + @go test -v -cover . + @go test -v ./cmd/bolt + +.PHONY: fmt test diff --git a/vendor/github.com/boltdb/bolt/README.md b/vendor/github.com/boltdb/bolt/README.md new file mode 100644 index 0000000000..7d43a15b2c --- /dev/null +++ b/vendor/github.com/boltdb/bolt/README.md @@ -0,0 +1,916 @@ +Bolt [![Coverage Status](https://coveralls.io/repos/boltdb/bolt/badge.svg?branch=master)](https://coveralls.io/r/boltdb/bolt?branch=master) [![GoDoc](https://godoc.org/github.com/boltdb/bolt?status.svg)](https://godoc.org/github.com/boltdb/bolt) ![Version](https://img.shields.io/badge/version-1.2.1-green.svg) +==== + +Bolt is a pure Go key/value store inspired by [Howard Chu's][hyc_symas] +[LMDB project][lmdb]. The goal of the project is to provide a simple, +fast, and reliable database for projects that don't require a full database +server such as Postgres or MySQL. + +Since Bolt is meant to be used as such a low-level piece of functionality, +simplicity is key. The API will be small and only focus on getting values +and setting values. That's it. + +[hyc_symas]: https://twitter.com/hyc_symas +[lmdb]: http://symas.com/mdb/ + +## Project Status + +Bolt is stable, the API is fixed, and the file format is fixed. Full unit +test coverage and randomized black box testing are used to ensure database +consistency and thread safety. Bolt is currently used in high-load production +environments serving databases as large as 1TB. Many companies such as +Shopify and Heroku use Bolt-backed services every day. + +## Table of Contents + +- [Getting Started](#getting-started) + - [Installing](#installing) + - [Opening a database](#opening-a-database) + - [Transactions](#transactions) + - [Read-write transactions](#read-write-transactions) + - [Read-only transactions](#read-only-transactions) + - [Batch read-write transactions](#batch-read-write-transactions) + - [Managing transactions manually](#managing-transactions-manually) + - [Using buckets](#using-buckets) + - [Using key/value pairs](#using-keyvalue-pairs) + - [Autoincrementing integer for the bucket](#autoincrementing-integer-for-the-bucket) + - [Iterating over keys](#iterating-over-keys) + - [Prefix scans](#prefix-scans) + - [Range scans](#range-scans) + - [ForEach()](#foreach) + - [Nested buckets](#nested-buckets) + - [Database backups](#database-backups) + - [Statistics](#statistics) + - [Read-Only Mode](#read-only-mode) + - [Mobile Use (iOS/Android)](#mobile-use-iosandroid) +- [Resources](#resources) +- [Comparison with other databases](#comparison-with-other-databases) + - [Postgres, MySQL, & other relational databases](#postgres-mysql--other-relational-databases) + - [LevelDB, RocksDB](#leveldb-rocksdb) + - [LMDB](#lmdb) +- [Caveats & Limitations](#caveats--limitations) +- [Reading the Source](#reading-the-source) +- [Other Projects Using Bolt](#other-projects-using-bolt) + +## Getting Started + +### Installing + +To start using Bolt, install Go and run `go get`: + +```sh +$ go get github.com/boltdb/bolt/... +``` + +This will retrieve the library and install the `bolt` command line utility into +your `$GOBIN` path. + + +### Opening a database + +The top-level object in Bolt is a `DB`. It is represented as a single file on +your disk and represents a consistent snapshot of your data. + +To open your database, simply use the `bolt.Open()` function: + +```go +package main + +import ( + "log" + + "github.com/boltdb/bolt" +) + +func main() { + // Open the my.db data file in your current directory. + // It will be created if it doesn't exist. + db, err := bolt.Open("my.db", 0600, nil) + if err != nil { + log.Fatal(err) + } + defer db.Close() + + ... +} +``` + +Please note that Bolt obtains a file lock on the data file so multiple processes +cannot open the same database at the same time. Opening an already open Bolt +database will cause it to hang until the other process closes it. To prevent +an indefinite wait you can pass a timeout option to the `Open()` function: + +```go +db, err := bolt.Open("my.db", 0600, &bolt.Options{Timeout: 1 * time.Second}) +``` + + +### Transactions + +Bolt allows only one read-write transaction at a time but allows as many +read-only transactions as you want at a time. Each transaction has a consistent +view of the data as it existed when the transaction started. + +Individual transactions and all objects created from them (e.g. buckets, keys) +are not thread safe. To work with data in multiple goroutines you must start +a transaction for each one or use locking to ensure only one goroutine accesses +a transaction at a time. Creating transaction from the `DB` is thread safe. + +Read-only transactions and read-write transactions should not depend on one +another and generally shouldn't be opened simultaneously in the same goroutine. +This can cause a deadlock as the read-write transaction needs to periodically +re-map the data file but it cannot do so while a read-only transaction is open. + + +#### Read-write transactions + +To start a read-write transaction, you can use the `DB.Update()` function: + +```go +err := db.Update(func(tx *bolt.Tx) error { + ... + return nil +}) +``` + +Inside the closure, you have a consistent view of the database. You commit the +transaction by returning `nil` at the end. You can also rollback the transaction +at any point by returning an error. All database operations are allowed inside +a read-write transaction. + +Always check the return error as it will report any disk failures that can cause +your transaction to not complete. If you return an error within your closure +it will be passed through. + + +#### Read-only transactions + +To start a read-only transaction, you can use the `DB.View()` function: + +```go +err := db.View(func(tx *bolt.Tx) error { + ... + return nil +}) +``` + +You also get a consistent view of the database within this closure, however, +no mutating operations are allowed within a read-only transaction. You can only +retrieve buckets, retrieve values, and copy the database within a read-only +transaction. + + +#### Batch read-write transactions + +Each `DB.Update()` waits for disk to commit the writes. This overhead +can be minimized by combining multiple updates with the `DB.Batch()` +function: + +```go +err := db.Batch(func(tx *bolt.Tx) error { + ... + return nil +}) +``` + +Concurrent Batch calls are opportunistically combined into larger +transactions. Batch is only useful when there are multiple goroutines +calling it. + +The trade-off is that `Batch` can call the given +function multiple times, if parts of the transaction fail. The +function must be idempotent and side effects must take effect only +after a successful return from `DB.Batch()`. + +For example: don't display messages from inside the function, instead +set variables in the enclosing scope: + +```go +var id uint64 +err := db.Batch(func(tx *bolt.Tx) error { + // Find last key in bucket, decode as bigendian uint64, increment + // by one, encode back to []byte, and add new key. + ... + id = newValue + return nil +}) +if err != nil { + return ... +} +fmt.Println("Allocated ID %d", id) +``` + + +#### Managing transactions manually + +The `DB.View()` and `DB.Update()` functions are wrappers around the `DB.Begin()` +function. These helper functions will start the transaction, execute a function, +and then safely close your transaction if an error is returned. This is the +recommended way to use Bolt transactions. + +However, sometimes you may want to manually start and end your transactions. +You can use the `DB.Begin()` function directly but **please** be sure to close +the transaction. + +```go +// Start a writable transaction. +tx, err := db.Begin(true) +if err != nil { + return err +} +defer tx.Rollback() + +// Use the transaction... +_, err := tx.CreateBucket([]byte("MyBucket")) +if err != nil { + return err +} + +// Commit the transaction and check for error. +if err := tx.Commit(); err != nil { + return err +} +``` + +The first argument to `DB.Begin()` is a boolean stating if the transaction +should be writable. + + +### Using buckets + +Buckets are collections of key/value pairs within the database. All keys in a +bucket must be unique. You can create a bucket using the `DB.CreateBucket()` +function: + +```go +db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("MyBucket")) + if err != nil { + return fmt.Errorf("create bucket: %s", err) + } + return nil +}) +``` + +You can also create a bucket only if it doesn't exist by using the +`Tx.CreateBucketIfNotExists()` function. It's a common pattern to call this +function for all your top-level buckets after you open your database so you can +guarantee that they exist for future transactions. + +To delete a bucket, simply call the `Tx.DeleteBucket()` function. + + +### Using key/value pairs + +To save a key/value pair to a bucket, use the `Bucket.Put()` function: + +```go +db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("MyBucket")) + err := b.Put([]byte("answer"), []byte("42")) + return err +}) +``` + +This will set the value of the `"answer"` key to `"42"` in the `MyBucket` +bucket. To retrieve this value, we can use the `Bucket.Get()` function: + +```go +db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("MyBucket")) + v := b.Get([]byte("answer")) + fmt.Printf("The answer is: %s\n", v) + return nil +}) +``` + +The `Get()` function does not return an error because its operation is +guaranteed to work (unless there is some kind of system failure). If the key +exists then it will return its byte slice value. If it doesn't exist then it +will return `nil`. It's important to note that you can have a zero-length value +set to a key which is different than the key not existing. + +Use the `Bucket.Delete()` function to delete a key from the bucket. + +Please note that values returned from `Get()` are only valid while the +transaction is open. If you need to use a value outside of the transaction +then you must use `copy()` to copy it to another byte slice. + + +### Autoincrementing integer for the bucket +By using the `NextSequence()` function, you can let Bolt determine a sequence +which can be used as the unique identifier for your key/value pairs. See the +example below. + +```go +// CreateUser saves u to the store. The new user ID is set on u once the data is persisted. +func (s *Store) CreateUser(u *User) error { + return s.db.Update(func(tx *bolt.Tx) error { + // Retrieve the users bucket. + // This should be created when the DB is first opened. + b := tx.Bucket([]byte("users")) + + // Generate ID for the user. + // This returns an error only if the Tx is closed or not writeable. + // That can't happen in an Update() call so I ignore the error check. + id, _ := b.NextSequence() + u.ID = int(id) + + // Marshal user data into bytes. + buf, err := json.Marshal(u) + if err != nil { + return err + } + + // Persist bytes to users bucket. + return b.Put(itob(u.ID), buf) + }) +} + +// itob returns an 8-byte big endian representation of v. +func itob(v int) []byte { + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, uint64(v)) + return b +} + +type User struct { + ID int + ... +} +``` + +### Iterating over keys + +Bolt stores its keys in byte-sorted order within a bucket. This makes sequential +iteration over these keys extremely fast. To iterate over keys we'll use a +`Cursor`: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume bucket exists and has keys + b := tx.Bucket([]byte("MyBucket")) + + c := b.Cursor() + + for k, v := c.First(); k != nil; k, v = c.Next() { + fmt.Printf("key=%s, value=%s\n", k, v) + } + + return nil +}) +``` + +The cursor allows you to move to a specific point in the list of keys and move +forward or backward through the keys one at a time. + +The following functions are available on the cursor: + +``` +First() Move to the first key. +Last() Move to the last key. +Seek() Move to a specific key. +Next() Move to the next key. +Prev() Move to the previous key. +``` + +Each of those functions has a return signature of `(key []byte, value []byte)`. +When you have iterated to the end of the cursor then `Next()` will return a +`nil` key. You must seek to a position using `First()`, `Last()`, or `Seek()` +before calling `Next()` or `Prev()`. If you do not seek to a position then +these functions will return a `nil` key. + +During iteration, if the key is non-`nil` but the value is `nil`, that means +the key refers to a bucket rather than a value. Use `Bucket.Bucket()` to +access the sub-bucket. + + +#### Prefix scans + +To iterate over a key prefix, you can combine `Seek()` and `bytes.HasPrefix()`: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume bucket exists and has keys + c := tx.Bucket([]byte("MyBucket")).Cursor() + + prefix := []byte("1234") + for k, v := c.Seek(prefix); k != nil && bytes.HasPrefix(k, prefix); k, v = c.Next() { + fmt.Printf("key=%s, value=%s\n", k, v) + } + + return nil +}) +``` + +#### Range scans + +Another common use case is scanning over a range such as a time range. If you +use a sortable time encoding such as RFC3339 then you can query a specific +date range like this: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume our events bucket exists and has RFC3339 encoded time keys. + c := tx.Bucket([]byte("Events")).Cursor() + + // Our time range spans the 90's decade. + min := []byte("1990-01-01T00:00:00Z") + max := []byte("2000-01-01T00:00:00Z") + + // Iterate over the 90's. + for k, v := c.Seek(min); k != nil && bytes.Compare(k, max) <= 0; k, v = c.Next() { + fmt.Printf("%s: %s\n", k, v) + } + + return nil +}) +``` + +Note that, while RFC3339 is sortable, the Golang implementation of RFC3339Nano does not use a fixed number of digits after the decimal point and is therefore not sortable. + + +#### ForEach() + +You can also use the function `ForEach()` if you know you'll be iterating over +all the keys in a bucket: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume bucket exists and has keys + b := tx.Bucket([]byte("MyBucket")) + + b.ForEach(func(k, v []byte) error { + fmt.Printf("key=%s, value=%s\n", k, v) + return nil + }) + return nil +}) +``` + +Please note that keys and values in `ForEach()` are only valid while +the transaction is open. If you need to use a key or value outside of +the transaction, you must use `copy()` to copy it to another byte +slice. + +### Nested buckets + +You can also store a bucket in a key to create nested buckets. The API is the +same as the bucket management API on the `DB` object: + +```go +func (*Bucket) CreateBucket(key []byte) (*Bucket, error) +func (*Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) +func (*Bucket) DeleteBucket(key []byte) error +``` + +Say you had a multi-tenant application where the root level bucket was the account bucket. Inside of this bucket was a sequence of accounts which themselves are buckets. And inside the sequence bucket you could have many buckets pertaining to the Account itself (Users, Notes, etc) isolating the information into logical groupings. + +```go + +// createUser creates a new user in the given account. +func createUser(accountID int, u *User) error { + // Start the transaction. + tx, err := db.Begin(true) + if err != nil { + return err + } + defer tx.Rollback() + + // Retrieve the root bucket for the account. + // Assume this has already been created when the account was set up. + root := tx.Bucket([]byte(strconv.FormatUint(accountID, 10))) + + // Setup the users bucket. + bkt, err := root.CreateBucketIfNotExists([]byte("USERS")) + if err != nil { + return err + } + + // Generate an ID for the new user. + userID, err := bkt.NextSequence() + if err != nil { + return err + } + u.ID = userID + + // Marshal and save the encoded user. + if buf, err := json.Marshal(u); err != nil { + return err + } else if err := bkt.Put([]byte(strconv.FormatUint(u.ID, 10)), buf); err != nil { + return err + } + + // Commit the transaction. + if err := tx.Commit(); err != nil { + return err + } + + return nil +} + +``` + + + + +### Database backups + +Bolt is a single file so it's easy to backup. You can use the `Tx.WriteTo()` +function to write a consistent view of the database to a writer. If you call +this from a read-only transaction, it will perform a hot backup and not block +your other database reads and writes. + +By default, it will use a regular file handle which will utilize the operating +system's page cache. See the [`Tx`](https://godoc.org/github.com/boltdb/bolt#Tx) +documentation for information about optimizing for larger-than-RAM datasets. + +One common use case is to backup over HTTP so you can use tools like `cURL` to +do database backups: + +```go +func BackupHandleFunc(w http.ResponseWriter, req *http.Request) { + err := db.View(func(tx *bolt.Tx) error { + w.Header().Set("Content-Type", "application/octet-stream") + w.Header().Set("Content-Disposition", `attachment; filename="my.db"`) + w.Header().Set("Content-Length", strconv.Itoa(int(tx.Size()))) + _, err := tx.WriteTo(w) + return err + }) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} +``` + +Then you can backup using this command: + +```sh +$ curl http://localhost/backup > my.db +``` + +Or you can open your browser to `http://localhost/backup` and it will download +automatically. + +If you want to backup to another file you can use the `Tx.CopyFile()` helper +function. + + +### Statistics + +The database keeps a running count of many of the internal operations it +performs so you can better understand what's going on. By grabbing a snapshot +of these stats at two points in time we can see what operations were performed +in that time range. + +For example, we could start a goroutine to log stats every 10 seconds: + +```go +go func() { + // Grab the initial stats. + prev := db.Stats() + + for { + // Wait for 10s. + time.Sleep(10 * time.Second) + + // Grab the current stats and diff them. + stats := db.Stats() + diff := stats.Sub(&prev) + + // Encode stats to JSON and print to STDERR. + json.NewEncoder(os.Stderr).Encode(diff) + + // Save stats for the next loop. + prev = stats + } +}() +``` + +It's also useful to pipe these stats to a service such as statsd for monitoring +or to provide an HTTP endpoint that will perform a fixed-length sample. + + +### Read-Only Mode + +Sometimes it is useful to create a shared, read-only Bolt database. To this, +set the `Options.ReadOnly` flag when opening your database. Read-only mode +uses a shared lock to allow multiple processes to read from the database but +it will block any processes from opening the database in read-write mode. + +```go +db, err := bolt.Open("my.db", 0666, &bolt.Options{ReadOnly: true}) +if err != nil { + log.Fatal(err) +} +``` + +### Mobile Use (iOS/Android) + +Bolt is able to run on mobile devices by leveraging the binding feature of the +[gomobile](https://github.com/golang/mobile) tool. Create a struct that will +contain your database logic and a reference to a `*bolt.DB` with a initializing +constructor that takes in a filepath where the database file will be stored. +Neither Android nor iOS require extra permissions or cleanup from using this method. + +```go +func NewBoltDB(filepath string) *BoltDB { + db, err := bolt.Open(filepath+"/demo.db", 0600, nil) + if err != nil { + log.Fatal(err) + } + + return &BoltDB{db} +} + +type BoltDB struct { + db *bolt.DB + ... +} + +func (b *BoltDB) Path() string { + return b.db.Path() +} + +func (b *BoltDB) Close() { + b.db.Close() +} +``` + +Database logic should be defined as methods on this wrapper struct. + +To initialize this struct from the native language (both platforms now sync +their local storage to the cloud. These snippets disable that functionality for the +database file): + +#### Android + +```java +String path; +if (android.os.Build.VERSION.SDK_INT >=android.os.Build.VERSION_CODES.LOLLIPOP){ + path = getNoBackupFilesDir().getAbsolutePath(); +} else{ + path = getFilesDir().getAbsolutePath(); +} +Boltmobiledemo.BoltDB boltDB = Boltmobiledemo.NewBoltDB(path) +``` + +#### iOS + +```objc +- (void)demo { + NSString* path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, + NSUserDomainMask, + YES) objectAtIndex:0]; + GoBoltmobiledemoBoltDB * demo = GoBoltmobiledemoNewBoltDB(path); + [self addSkipBackupAttributeToItemAtPath:demo.path]; + //Some DB Logic would go here + [demo close]; +} + +- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *) filePathString +{ + NSURL* URL= [NSURL fileURLWithPath: filePathString]; + assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); + + NSError *error = nil; + BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES] + forKey: NSURLIsExcludedFromBackupKey error: &error]; + if(!success){ + NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error); + } + return success; +} + +``` + +## Resources + +For more information on getting started with Bolt, check out the following articles: + +* [Intro to BoltDB: Painless Performant Persistence](http://npf.io/2014/07/intro-to-boltdb-painless-performant-persistence/) by [Nate Finch](https://github.com/natefinch). +* [Bolt -- an embedded key/value database for Go](https://www.progville.com/go/bolt-embedded-db-golang/) by Progville + + +## Comparison with other databases + +### Postgres, MySQL, & other relational databases + +Relational databases structure data into rows and are only accessible through +the use of SQL. This approach provides flexibility in how you store and query +your data but also incurs overhead in parsing and planning SQL statements. Bolt +accesses all data by a byte slice key. This makes Bolt fast to read and write +data by key but provides no built-in support for joining values together. + +Most relational databases (with the exception of SQLite) are standalone servers +that run separately from your application. This gives your systems +flexibility to connect multiple application servers to a single database +server but also adds overhead in serializing and transporting data over the +network. Bolt runs as a library included in your application so all data access +has to go through your application's process. This brings data closer to your +application but limits multi-process access to the data. + + +### LevelDB, RocksDB + +LevelDB and its derivatives (RocksDB, HyperLevelDB) are similar to Bolt in that +they are libraries bundled into the application, however, their underlying +structure is a log-structured merge-tree (LSM tree). An LSM tree optimizes +random writes by using a write ahead log and multi-tiered, sorted files called +SSTables. Bolt uses a B+tree internally and only a single file. Both approaches +have trade-offs. + +If you require a high random write throughput (>10,000 w/sec) or you need to use +spinning disks then LevelDB could be a good choice. If your application is +read-heavy or does a lot of range scans then Bolt could be a good choice. + +One other important consideration is that LevelDB does not have transactions. +It supports batch writing of key/values pairs and it supports read snapshots +but it will not give you the ability to do a compare-and-swap operation safely. +Bolt supports fully serializable ACID transactions. + + +### LMDB + +Bolt was originally a port of LMDB so it is architecturally similar. Both use +a B+tree, have ACID semantics with fully serializable transactions, and support +lock-free MVCC using a single writer and multiple readers. + +The two projects have somewhat diverged. LMDB heavily focuses on raw performance +while Bolt has focused on simplicity and ease of use. For example, LMDB allows +several unsafe actions such as direct writes for the sake of performance. Bolt +opts to disallow actions which can leave the database in a corrupted state. The +only exception to this in Bolt is `DB.NoSync`. + +There are also a few differences in API. LMDB requires a maximum mmap size when +opening an `mdb_env` whereas Bolt will handle incremental mmap resizing +automatically. LMDB overloads the getter and setter functions with multiple +flags whereas Bolt splits these specialized cases into their own functions. + + +## Caveats & Limitations + +It's important to pick the right tool for the job and Bolt is no exception. +Here are a few things to note when evaluating and using Bolt: + +* Bolt is good for read intensive workloads. Sequential write performance is + also fast but random writes can be slow. You can use `DB.Batch()` or add a + write-ahead log to help mitigate this issue. + +* Bolt uses a B+tree internally so there can be a lot of random page access. + SSDs provide a significant performance boost over spinning disks. + +* Try to avoid long running read transactions. Bolt uses copy-on-write so + old pages cannot be reclaimed while an old transaction is using them. + +* Byte slices returned from Bolt are only valid during a transaction. Once the + transaction has been committed or rolled back then the memory they point to + can be reused by a new page or can be unmapped from virtual memory and you'll + see an `unexpected fault address` panic when accessing it. + +* Bolt uses an exclusive write lock on the database file so it cannot be + shared by multiple processes. + +* Be careful when using `Bucket.FillPercent`. Setting a high fill percent for + buckets that have random inserts will cause your database to have very poor + page utilization. + +* Use larger buckets in general. Smaller buckets causes poor page utilization + once they become larger than the page size (typically 4KB). + +* Bulk loading a lot of random writes into a new bucket can be slow as the + page will not split until the transaction is committed. Randomly inserting + more than 100,000 key/value pairs into a single new bucket in a single + transaction is not advised. + +* Bolt uses a memory-mapped file so the underlying operating system handles the + caching of the data. Typically, the OS will cache as much of the file as it + can in memory and will release memory as needed to other processes. This means + that Bolt can show very high memory usage when working with large databases. + However, this is expected and the OS will release memory as needed. Bolt can + handle databases much larger than the available physical RAM, provided its + memory-map fits in the process virtual address space. It may be problematic + on 32-bits systems. + +* The data structures in the Bolt database are memory mapped so the data file + will be endian specific. This means that you cannot copy a Bolt file from a + little endian machine to a big endian machine and have it work. For most + users this is not a concern since most modern CPUs are little endian. + +* Because of the way pages are laid out on disk, Bolt cannot truncate data files + and return free pages back to the disk. Instead, Bolt maintains a free list + of unused pages within its data file. These free pages can be reused by later + transactions. This works well for many use cases as databases generally tend + to grow. However, it's important to note that deleting large chunks of data + will not allow you to reclaim that space on disk. + + For more information on page allocation, [see this comment][page-allocation]. + +[page-allocation]: https://github.com/boltdb/bolt/issues/308#issuecomment-74811638 + + +## Reading the Source + +Bolt is a relatively small code base (<3KLOC) for an embedded, serializable, +transactional key/value database so it can be a good starting point for people +interested in how databases work. + +The best places to start are the main entry points into Bolt: + +- `Open()` - Initializes the reference to the database. It's responsible for + creating the database if it doesn't exist, obtaining an exclusive lock on the + file, reading the meta pages, & memory-mapping the file. + +- `DB.Begin()` - Starts a read-only or read-write transaction depending on the + value of the `writable` argument. This requires briefly obtaining the "meta" + lock to keep track of open transactions. Only one read-write transaction can + exist at a time so the "rwlock" is acquired during the life of a read-write + transaction. + +- `Bucket.Put()` - Writes a key/value pair into a bucket. After validating the + arguments, a cursor is used to traverse the B+tree to the page and position + where they key & value will be written. Once the position is found, the bucket + materializes the underlying page and the page's parent pages into memory as + "nodes". These nodes are where mutations occur during read-write transactions. + These changes get flushed to disk during commit. + +- `Bucket.Get()` - Retrieves a key/value pair from a bucket. This uses a cursor + to move to the page & position of a key/value pair. During a read-only + transaction, the key and value data is returned as a direct reference to the + underlying mmap file so there's no allocation overhead. For read-write + transactions, this data may reference the mmap file or one of the in-memory + node values. + +- `Cursor` - This object is simply for traversing the B+tree of on-disk pages + or in-memory nodes. It can seek to a specific key, move to the first or last + value, or it can move forward or backward. The cursor handles the movement up + and down the B+tree transparently to the end user. + +- `Tx.Commit()` - Converts the in-memory dirty nodes and the list of free pages + into pages to be written to disk. Writing to disk then occurs in two phases. + First, the dirty pages are written to disk and an `fsync()` occurs. Second, a + new meta page with an incremented transaction ID is written and another + `fsync()` occurs. This two phase write ensures that partially written data + pages are ignored in the event of a crash since the meta page pointing to them + is never written. Partially written meta pages are invalidated because they + are written with a checksum. + +If you have additional notes that could be helpful for others, please submit +them via pull request. + + +## Other Projects Using Bolt + +Below is a list of public, open source projects that use Bolt: + +* [BoltDbWeb](https://github.com/evnix/boltdbweb) - A web based GUI for BoltDB files. +* [Operation Go: A Routine Mission](http://gocode.io) - An online programming game for Golang using Bolt for user accounts and a leaderboard. +* [Bazil](https://bazil.org/) - A file system that lets your data reside where it is most convenient for it to reside. +* [DVID](https://github.com/janelia-flyem/dvid) - Added Bolt as optional storage engine and testing it against Basho-tuned leveldb. +* [Skybox Analytics](https://github.com/skybox/skybox) - A standalone funnel analysis tool for web analytics. +* [Scuttlebutt](https://github.com/benbjohnson/scuttlebutt) - Uses Bolt to store and process all Twitter mentions of GitHub projects. +* [Wiki](https://github.com/peterhellberg/wiki) - A tiny wiki using Goji, BoltDB and Blackfriday. +* [ChainStore](https://github.com/pressly/chainstore) - Simple key-value interface to a variety of storage engines organized as a chain of operations. +* [MetricBase](https://github.com/msiebuhr/MetricBase) - Single-binary version of Graphite. +* [Gitchain](https://github.com/gitchain/gitchain) - Decentralized, peer-to-peer Git repositories aka "Git meets Bitcoin". +* [event-shuttle](https://github.com/sclasen/event-shuttle) - A Unix system service to collect and reliably deliver messages to Kafka. +* [ipxed](https://github.com/kelseyhightower/ipxed) - Web interface and api for ipxed. +* [BoltStore](https://github.com/yosssi/boltstore) - Session store using Bolt. +* [photosite/session](https://godoc.org/bitbucket.org/kardianos/photosite/session) - Sessions for a photo viewing site. +* [LedisDB](https://github.com/siddontang/ledisdb) - A high performance NoSQL, using Bolt as optional storage. +* [ipLocator](https://github.com/AndreasBriese/ipLocator) - A fast ip-geo-location-server using bolt with bloom filters. +* [cayley](https://github.com/google/cayley) - Cayley is an open-source graph database using Bolt as optional backend. +* [bleve](http://www.blevesearch.com/) - A pure Go search engine similar to ElasticSearch that uses Bolt as the default storage backend. +* [tentacool](https://github.com/optiflows/tentacool) - REST api server to manage system stuff (IP, DNS, Gateway...) on a linux server. +* [Seaweed File System](https://github.com/chrislusf/seaweedfs) - Highly scalable distributed key~file system with O(1) disk read. +* [InfluxDB](https://influxdata.com) - Scalable datastore for metrics, events, and real-time analytics. +* [Freehold](http://tshannon.bitbucket.org/freehold/) - An open, secure, and lightweight platform for your files and data. +* [Prometheus Annotation Server](https://github.com/oliver006/prom_annotation_server) - Annotation server for PromDash & Prometheus service monitoring system. +* [Consul](https://github.com/hashicorp/consul) - Consul is service discovery and configuration made easy. Distributed, highly available, and datacenter-aware. +* [Kala](https://github.com/ajvb/kala) - Kala is a modern job scheduler optimized to run on a single node. It is persistent, JSON over HTTP API, ISO 8601 duration notation, and dependent jobs. +* [drive](https://github.com/odeke-em/drive) - drive is an unofficial Google Drive command line client for \*NIX operating systems. +* [stow](https://github.com/djherbis/stow) - a persistence manager for objects + backed by boltdb. +* [buckets](https://github.com/joyrexus/buckets) - a bolt wrapper streamlining + simple tx and key scans. +* [mbuckets](https://github.com/abhigupta912/mbuckets) - A Bolt wrapper that allows easy operations on multi level (nested) buckets. +* [Request Baskets](https://github.com/darklynx/request-baskets) - A web service to collect arbitrary HTTP requests and inspect them via REST API or simple web UI, similar to [RequestBin](http://requestb.in/) service +* [Go Report Card](https://goreportcard.com/) - Go code quality report cards as a (free and open source) service. +* [Boltdb Boilerplate](https://github.com/bobintornado/boltdb-boilerplate) - Boilerplate wrapper around bolt aiming to make simple calls one-liners. +* [lru](https://github.com/crowdriff/lru) - Easy to use Bolt-backed Least-Recently-Used (LRU) read-through cache with chainable remote stores. +* [Storm](https://github.com/asdine/storm) - Simple and powerful ORM for BoltDB. +* [GoWebApp](https://github.com/josephspurrier/gowebapp) - A basic MVC web application in Go using BoltDB. +* [SimpleBolt](https://github.com/xyproto/simplebolt) - A simple way to use BoltDB. Deals mainly with strings. +* [Algernon](https://github.com/xyproto/algernon) - A HTTP/2 web server with built-in support for Lua. Uses BoltDB as the default database backend. +* [MuLiFS](https://github.com/dankomiocevic/mulifs) - Music Library Filesystem creates a filesystem to organise your music files. +* [GoShort](https://github.com/pankajkhairnar/goShort) - GoShort is a URL shortener written in Golang and BoltDB for persistent key/value storage and for routing it's using high performent HTTPRouter. +* [torrent](https://github.com/anacrolix/torrent) - Full-featured BitTorrent client package and utilities in Go. BoltDB is a storage backend in development. +* [gopherpit](https://github.com/gopherpit/gopherpit) - A web service to manage Go remote import paths with custom domains +* [bolter](https://github.com/hasit/bolter) - Command-line app for viewing BoltDB file in your terminal. +* [btcwallet](https://github.com/btcsuite/btcwallet) - A bitcoin wallet. +* [dcrwallet](https://github.com/decred/dcrwallet) - A wallet for the Decred cryptocurrency. +* [Ironsmith](https://github.com/timshannon/ironsmith) - A simple, script-driven continuous integration (build - > test -> release) tool, with no external dependencies +* [BoltHold](https://github.com/timshannon/bolthold) - An embeddable NoSQL store for Go types built on BoltDB +* [Ponzu CMS](https://ponzu-cms.org) - Headless CMS + automatic JSON API with auto-HTTPS, HTTP/2 Server Push, and flexible server framework. + +If you are using Bolt in a project please send a pull request to add it to the list. diff --git a/vendor/github.com/boltdb/bolt/appveyor.yml b/vendor/github.com/boltdb/bolt/appveyor.yml new file mode 100644 index 0000000000..6e26e941d6 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/appveyor.yml @@ -0,0 +1,18 @@ +version: "{build}" + +os: Windows Server 2012 R2 + +clone_folder: c:\gopath\src\github.com\boltdb\bolt + +environment: + GOPATH: c:\gopath + +install: + - echo %PATH% + - echo %GOPATH% + - go version + - go env + - go get -v -t ./... + +build_script: + - go test -v ./... diff --git a/vendor/github.com/boltdb/bolt/bolt_386.go b/vendor/github.com/boltdb/bolt/bolt_386.go new file mode 100644 index 0000000000..820d533c15 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_386.go @@ -0,0 +1,10 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_amd64.go b/vendor/github.com/boltdb/bolt/bolt_amd64.go new file mode 100644 index 0000000000..98fafdb47d --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_amd64.go @@ -0,0 +1,10 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_arm.go b/vendor/github.com/boltdb/bolt/bolt_arm.go new file mode 100644 index 0000000000..7e5cb4b941 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_arm.go @@ -0,0 +1,28 @@ +package bolt + +import "unsafe" + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned bool + +func init() { + // Simple check to see whether this arch handles unaligned load/stores + // correctly. + + // ARM9 and older devices require load/stores to be from/to aligned + // addresses. If not, the lower 2 bits are cleared and that address is + // read in a jumbled up order. + + // See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka15414.html + + raw := [6]byte{0xfe, 0xef, 0x11, 0x22, 0x22, 0x11} + val := *(*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(&raw)) + 2)) + + brokenUnaligned = val != 0x11222211 +} diff --git a/vendor/github.com/boltdb/bolt/bolt_arm64.go b/vendor/github.com/boltdb/bolt/bolt_arm64.go new file mode 100644 index 0000000000..b26d84f91b --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_arm64.go @@ -0,0 +1,12 @@ +// +build arm64 + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_linux.go b/vendor/github.com/boltdb/bolt/bolt_linux.go new file mode 100644 index 0000000000..2b67666140 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_linux.go @@ -0,0 +1,10 @@ +package bolt + +import ( + "syscall" +) + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return syscall.Fdatasync(int(db.file.Fd())) +} diff --git a/vendor/github.com/boltdb/bolt/bolt_openbsd.go b/vendor/github.com/boltdb/bolt/bolt_openbsd.go new file mode 100644 index 0000000000..7058c3d734 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_openbsd.go @@ -0,0 +1,27 @@ +package bolt + +import ( + "syscall" + "unsafe" +) + +const ( + msAsync = 1 << iota // perform asynchronous writes + msSync // perform synchronous writes + msInvalidate // invalidate cached data +) + +func msync(db *DB) error { + _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(db.data)), uintptr(db.datasz), msInvalidate) + if errno != 0 { + return errno + } + return nil +} + +func fdatasync(db *DB) error { + if db.data != nil { + return msync(db) + } + return db.file.Sync() +} diff --git a/vendor/github.com/boltdb/bolt/bolt_ppc.go b/vendor/github.com/boltdb/bolt/bolt_ppc.go new file mode 100644 index 0000000000..645ddc3edc --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_ppc.go @@ -0,0 +1,9 @@ +// +build ppc + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF diff --git a/vendor/github.com/boltdb/bolt/bolt_ppc64.go b/vendor/github.com/boltdb/bolt/bolt_ppc64.go new file mode 100644 index 0000000000..9331d9771e --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_ppc64.go @@ -0,0 +1,12 @@ +// +build ppc64 + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_ppc64le.go b/vendor/github.com/boltdb/bolt/bolt_ppc64le.go new file mode 100644 index 0000000000..8c143bc5d1 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_ppc64le.go @@ -0,0 +1,12 @@ +// +build ppc64le + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_s390x.go b/vendor/github.com/boltdb/bolt/bolt_s390x.go new file mode 100644 index 0000000000..d7c39af925 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_s390x.go @@ -0,0 +1,12 @@ +// +build s390x + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_unix.go b/vendor/github.com/boltdb/bolt/bolt_unix.go new file mode 100644 index 0000000000..cad62dda1e --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_unix.go @@ -0,0 +1,89 @@ +// +build !windows,!plan9,!solaris + +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" +) + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + flag := syscall.LOCK_SH + if exclusive { + flag = syscall.LOCK_EX + } + + // Otherwise attempt to obtain an exclusive lock. + err := syscall.Flock(int(db.file.Fd()), flag|syscall.LOCK_NB) + if err == nil { + return nil + } else if err != syscall.EWOULDBLOCK { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + return syscall.Flock(int(db.file.Fd()), syscall.LOCK_UN) +} + +// mmap memory maps a DB's data file. +func mmap(db *DB, sz int) error { + // Map the data file to memory. + b, err := syscall.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED|db.MmapFlags) + if err != nil { + return err + } + + // Advise the kernel that the mmap is accessed randomly. + if err := madvise(b, syscall.MADV_RANDOM); err != nil { + return fmt.Errorf("madvise: %s", err) + } + + // Save the original byte slice and convert to a byte array pointer. + db.dataref = b + db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0])) + db.datasz = sz + return nil +} + +// munmap unmaps a DB's data file from memory. +func munmap(db *DB) error { + // Ignore the unmap if we have no mapped data. + if db.dataref == nil { + return nil + } + + // Unmap using the original byte slice. + err := syscall.Munmap(db.dataref) + db.dataref = nil + db.data = nil + db.datasz = 0 + return err +} + +// NOTE: This function is copied from stdlib because it is not available on darwin. +func madvise(b []byte, advice int) (err error) { + _, _, e1 := syscall.Syscall(syscall.SYS_MADVISE, uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = e1 + } + return +} diff --git a/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go b/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go new file mode 100644 index 0000000000..307bf2b3ee --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go @@ -0,0 +1,90 @@ +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" + + "golang.org/x/sys/unix" +) + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + var lock syscall.Flock_t + lock.Start = 0 + lock.Len = 0 + lock.Pid = 0 + lock.Whence = 0 + lock.Pid = 0 + if exclusive { + lock.Type = syscall.F_WRLCK + } else { + lock.Type = syscall.F_RDLCK + } + err := syscall.FcntlFlock(db.file.Fd(), syscall.F_SETLK, &lock) + if err == nil { + return nil + } else if err != syscall.EAGAIN { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + var lock syscall.Flock_t + lock.Start = 0 + lock.Len = 0 + lock.Type = syscall.F_UNLCK + lock.Whence = 0 + return syscall.FcntlFlock(uintptr(db.file.Fd()), syscall.F_SETLK, &lock) +} + +// mmap memory maps a DB's data file. +func mmap(db *DB, sz int) error { + // Map the data file to memory. + b, err := unix.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED|db.MmapFlags) + if err != nil { + return err + } + + // Advise the kernel that the mmap is accessed randomly. + if err := unix.Madvise(b, syscall.MADV_RANDOM); err != nil { + return fmt.Errorf("madvise: %s", err) + } + + // Save the original byte slice and convert to a byte array pointer. + db.dataref = b + db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0])) + db.datasz = sz + return nil +} + +// munmap unmaps a DB's data file from memory. +func munmap(db *DB) error { + // Ignore the unmap if we have no mapped data. + if db.dataref == nil { + return nil + } + + // Unmap using the original byte slice. + err := unix.Munmap(db.dataref) + db.dataref = nil + db.data = nil + db.datasz = 0 + return err +} diff --git a/vendor/github.com/boltdb/bolt/bolt_windows.go b/vendor/github.com/boltdb/bolt/bolt_windows.go new file mode 100644 index 0000000000..b00fb0720a --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_windows.go @@ -0,0 +1,144 @@ +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" +) + +// LockFileEx code derived from golang build filemutex_windows.go @ v1.5.1 +var ( + modkernel32 = syscall.NewLazyDLL("kernel32.dll") + procLockFileEx = modkernel32.NewProc("LockFileEx") + procUnlockFileEx = modkernel32.NewProc("UnlockFileEx") +) + +const ( + lockExt = ".lock" + + // see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx + flagLockExclusive = 2 + flagLockFailImmediately = 1 + + // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx + errLockViolation syscall.Errno = 0x21 +) + +func lockFileEx(h syscall.Handle, flags, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { + r, _, err := procLockFileEx.Call(uintptr(h), uintptr(flags), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol))) + if r == 0 { + return err + } + return nil +} + +func unlockFileEx(h syscall.Handle, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { + r, _, err := procUnlockFileEx.Call(uintptr(h), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol)), 0) + if r == 0 { + return err + } + return nil +} + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return db.file.Sync() +} + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + // Create a separate lock file on windows because a process + // cannot share an exclusive lock on the same file. This is + // needed during Tx.WriteTo(). + f, err := os.OpenFile(db.path+lockExt, os.O_CREATE, mode) + if err != nil { + return err + } + db.lockfile = f + + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + + var flag uint32 = flagLockFailImmediately + if exclusive { + flag |= flagLockExclusive + } + + err := lockFileEx(syscall.Handle(db.lockfile.Fd()), flag, 0, 1, 0, &syscall.Overlapped{}) + if err == nil { + return nil + } else if err != errLockViolation { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + err := unlockFileEx(syscall.Handle(db.lockfile.Fd()), 0, 1, 0, &syscall.Overlapped{}) + db.lockfile.Close() + os.Remove(db.path + lockExt) + return err +} + +// mmap memory maps a DB's data file. +// Based on: https://github.com/edsrzf/mmap-go +func mmap(db *DB, sz int) error { + if !db.readOnly { + // Truncate the database to the size of the mmap. + if err := db.file.Truncate(int64(sz)); err != nil { + return fmt.Errorf("truncate: %s", err) + } + } + + // Open a file mapping handle. + sizelo := uint32(sz >> 32) + sizehi := uint32(sz) & 0xffffffff + h, errno := syscall.CreateFileMapping(syscall.Handle(db.file.Fd()), nil, syscall.PAGE_READONLY, sizelo, sizehi, nil) + if h == 0 { + return os.NewSyscallError("CreateFileMapping", errno) + } + + // Create the memory map. + addr, errno := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, uintptr(sz)) + if addr == 0 { + return os.NewSyscallError("MapViewOfFile", errno) + } + + // Close mapping handle. + if err := syscall.CloseHandle(syscall.Handle(h)); err != nil { + return os.NewSyscallError("CloseHandle", err) + } + + // Convert to a byte array. + db.data = ((*[maxMapSize]byte)(unsafe.Pointer(addr))) + db.datasz = sz + + return nil +} + +// munmap unmaps a pointer from a file. +// Based on: https://github.com/edsrzf/mmap-go +func munmap(db *DB) error { + if db.data == nil { + return nil + } + + addr := (uintptr)(unsafe.Pointer(&db.data[0])) + if err := syscall.UnmapViewOfFile(addr); err != nil { + return os.NewSyscallError("UnmapViewOfFile", err) + } + return nil +} diff --git a/vendor/github.com/boltdb/bolt/boltsync_unix.go b/vendor/github.com/boltdb/bolt/boltsync_unix.go new file mode 100644 index 0000000000..f50442523c --- /dev/null +++ b/vendor/github.com/boltdb/bolt/boltsync_unix.go @@ -0,0 +1,8 @@ +// +build !windows,!plan9,!linux,!openbsd + +package bolt + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return db.file.Sync() +} diff --git a/vendor/github.com/boltdb/bolt/bucket.go b/vendor/github.com/boltdb/bolt/bucket.go new file mode 100644 index 0000000000..0c5bf27463 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bucket.go @@ -0,0 +1,777 @@ +package bolt + +import ( + "bytes" + "fmt" + "unsafe" +) + +const ( + // MaxKeySize is the maximum length of a key, in bytes. + MaxKeySize = 32768 + + // MaxValueSize is the maximum length of a value, in bytes. + MaxValueSize = (1 << 31) - 2 +) + +const ( + maxUint = ^uint(0) + minUint = 0 + maxInt = int(^uint(0) >> 1) + minInt = -maxInt - 1 +) + +const bucketHeaderSize = int(unsafe.Sizeof(bucket{})) + +const ( + minFillPercent = 0.1 + maxFillPercent = 1.0 +) + +// DefaultFillPercent is the percentage that split pages are filled. +// This value can be changed by setting Bucket.FillPercent. +const DefaultFillPercent = 0.5 + +// Bucket represents a collection of key/value pairs inside the database. +type Bucket struct { + *bucket + tx *Tx // the associated transaction + buckets map[string]*Bucket // subbucket cache + page *page // inline page reference + rootNode *node // materialized node for the root page. + nodes map[pgid]*node // node cache + + // Sets the threshold for filling nodes when they split. By default, + // the bucket will fill to 50% but it can be useful to increase this + // amount if you know that your write workloads are mostly append-only. + // + // This is non-persisted across transactions so it must be set in every Tx. + FillPercent float64 +} + +// bucket represents the on-file representation of a bucket. +// This is stored as the "value" of a bucket key. If the bucket is small enough, +// then its root page can be stored inline in the "value", after the bucket +// header. In the case of inline buckets, the "root" will be 0. +type bucket struct { + root pgid // page id of the bucket's root-level page + sequence uint64 // monotonically incrementing, used by NextSequence() +} + +// newBucket returns a new bucket associated with a transaction. +func newBucket(tx *Tx) Bucket { + var b = Bucket{tx: tx, FillPercent: DefaultFillPercent} + if tx.writable { + b.buckets = make(map[string]*Bucket) + b.nodes = make(map[pgid]*node) + } + return b +} + +// Tx returns the tx of the bucket. +func (b *Bucket) Tx() *Tx { + return b.tx +} + +// Root returns the root of the bucket. +func (b *Bucket) Root() pgid { + return b.root +} + +// Writable returns whether the bucket is writable. +func (b *Bucket) Writable() bool { + return b.tx.writable +} + +// Cursor creates a cursor associated with the bucket. +// The cursor is only valid as long as the transaction is open. +// Do not use a cursor after the transaction is closed. +func (b *Bucket) Cursor() *Cursor { + // Update transaction statistics. + b.tx.stats.CursorCount++ + + // Allocate and return a cursor. + return &Cursor{ + bucket: b, + stack: make([]elemRef, 0), + } +} + +// Bucket retrieves a nested bucket by name. +// Returns nil if the bucket does not exist. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) Bucket(name []byte) *Bucket { + if b.buckets != nil { + if child := b.buckets[string(name)]; child != nil { + return child + } + } + + // Move cursor to key. + c := b.Cursor() + k, v, flags := c.seek(name) + + // Return nil if the key doesn't exist or it is not a bucket. + if !bytes.Equal(name, k) || (flags&bucketLeafFlag) == 0 { + return nil + } + + // Otherwise create a bucket and cache it. + var child = b.openBucket(v) + if b.buckets != nil { + b.buckets[string(name)] = child + } + + return child +} + +// Helper method that re-interprets a sub-bucket value +// from a parent into a Bucket +func (b *Bucket) openBucket(value []byte) *Bucket { + var child = newBucket(b.tx) + + // If unaligned load/stores are broken on this arch and value is + // unaligned simply clone to an aligned byte array. + unaligned := brokenUnaligned && uintptr(unsafe.Pointer(&value[0]))&3 != 0 + + if unaligned { + value = cloneBytes(value) + } + + // If this is a writable transaction then we need to copy the bucket entry. + // Read-only transactions can point directly at the mmap entry. + if b.tx.writable && !unaligned { + child.bucket = &bucket{} + *child.bucket = *(*bucket)(unsafe.Pointer(&value[0])) + } else { + child.bucket = (*bucket)(unsafe.Pointer(&value[0])) + } + + // Save a reference to the inline page if the bucket is inline. + if child.root == 0 { + child.page = (*page)(unsafe.Pointer(&value[bucketHeaderSize])) + } + + return &child +} + +// CreateBucket creates a new bucket at the given key and returns the new bucket. +// Returns an error if the key already exists, if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) CreateBucket(key []byte) (*Bucket, error) { + if b.tx.db == nil { + return nil, ErrTxClosed + } else if !b.tx.writable { + return nil, ErrTxNotWritable + } else if len(key) == 0 { + return nil, ErrBucketNameRequired + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if there is an existing key. + if bytes.Equal(key, k) { + if (flags & bucketLeafFlag) != 0 { + return nil, ErrBucketExists + } + return nil, ErrIncompatibleValue + } + + // Create empty, inline bucket. + var bucket = Bucket{ + bucket: &bucket{}, + rootNode: &node{isLeaf: true}, + FillPercent: DefaultFillPercent, + } + var value = bucket.write() + + // Insert into node. + key = cloneBytes(key) + c.node().put(key, key, value, 0, bucketLeafFlag) + + // Since subbuckets are not allowed on inline buckets, we need to + // dereference the inline page, if it exists. This will cause the bucket + // to be treated as a regular, non-inline bucket for the rest of the tx. + b.page = nil + + return b.Bucket(key), nil +} + +// CreateBucketIfNotExists creates a new bucket if it doesn't already exist and returns a reference to it. +// Returns an error if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) { + child, err := b.CreateBucket(key) + if err == ErrBucketExists { + return b.Bucket(key), nil + } else if err != nil { + return nil, err + } + return child, nil +} + +// DeleteBucket deletes a bucket at the given key. +// Returns an error if the bucket does not exists, or if the key represents a non-bucket value. +func (b *Bucket) DeleteBucket(key []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if bucket doesn't exist or is not a bucket. + if !bytes.Equal(key, k) { + return ErrBucketNotFound + } else if (flags & bucketLeafFlag) == 0 { + return ErrIncompatibleValue + } + + // Recursively delete all child buckets. + child := b.Bucket(key) + err := child.ForEach(func(k, v []byte) error { + if v == nil { + if err := child.DeleteBucket(k); err != nil { + return fmt.Errorf("delete bucket: %s", err) + } + } + return nil + }) + if err != nil { + return err + } + + // Remove cached copy. + delete(b.buckets, string(key)) + + // Release all bucket pages to freelist. + child.nodes = nil + child.rootNode = nil + child.free() + + // Delete the node if we have a matching key. + c.node().del(key) + + return nil +} + +// Get retrieves the value for a key in the bucket. +// Returns a nil value if the key does not exist or if the key is a nested bucket. +// The returned value is only valid for the life of the transaction. +func (b *Bucket) Get(key []byte) []byte { + k, v, flags := b.Cursor().seek(key) + + // Return nil if this is a bucket. + if (flags & bucketLeafFlag) != 0 { + return nil + } + + // If our target node isn't the same key as what's passed in then return nil. + if !bytes.Equal(key, k) { + return nil + } + return v +} + +// Put sets the value for a key in the bucket. +// If the key exist then its previous value will be overwritten. +// Supplied value must remain valid for the life of the transaction. +// Returns an error if the bucket was created from a read-only transaction, if the key is blank, if the key is too large, or if the value is too large. +func (b *Bucket) Put(key []byte, value []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } else if len(key) == 0 { + return ErrKeyRequired + } else if len(key) > MaxKeySize { + return ErrKeyTooLarge + } else if int64(len(value)) > MaxValueSize { + return ErrValueTooLarge + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if there is an existing key with a bucket value. + if bytes.Equal(key, k) && (flags&bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + + // Insert into node. + key = cloneBytes(key) + c.node().put(key, key, value, 0, 0) + + return nil +} + +// Delete removes a key from the bucket. +// If the key does not exist then nothing is done and a nil error is returned. +// Returns an error if the bucket was created from a read-only transaction. +func (b *Bucket) Delete(key []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Move cursor to correct position. + c := b.Cursor() + _, _, flags := c.seek(key) + + // Return an error if there is already existing bucket value. + if (flags & bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + + // Delete the node if we have a matching key. + c.node().del(key) + + return nil +} + +// Sequence returns the current integer for the bucket without incrementing it. +func (b *Bucket) Sequence() uint64 { return b.bucket.sequence } + +// SetSequence updates the sequence number for the bucket. +func (b *Bucket) SetSequence(v uint64) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Materialize the root node if it hasn't been already so that the + // bucket will be saved during commit. + if b.rootNode == nil { + _ = b.node(b.root, nil) + } + + // Increment and return the sequence. + b.bucket.sequence = v + return nil +} + +// NextSequence returns an autoincrementing integer for the bucket. +func (b *Bucket) NextSequence() (uint64, error) { + if b.tx.db == nil { + return 0, ErrTxClosed + } else if !b.Writable() { + return 0, ErrTxNotWritable + } + + // Materialize the root node if it hasn't been already so that the + // bucket will be saved during commit. + if b.rootNode == nil { + _ = b.node(b.root, nil) + } + + // Increment and return the sequence. + b.bucket.sequence++ + return b.bucket.sequence, nil +} + +// ForEach executes a function for each key/value pair in a bucket. +// If the provided function returns an error then the iteration is stopped and +// the error is returned to the caller. The provided function must not modify +// the bucket; this will result in undefined behavior. +func (b *Bucket) ForEach(fn func(k, v []byte) error) error { + if b.tx.db == nil { + return ErrTxClosed + } + c := b.Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + if err := fn(k, v); err != nil { + return err + } + } + return nil +} + +// Stat returns stats on a bucket. +func (b *Bucket) Stats() BucketStats { + var s, subStats BucketStats + pageSize := b.tx.db.pageSize + s.BucketN += 1 + if b.root == 0 { + s.InlineBucketN += 1 + } + b.forEachPage(func(p *page, depth int) { + if (p.flags & leafPageFlag) != 0 { + s.KeyN += int(p.count) + + // used totals the used bytes for the page + used := pageHeaderSize + + if p.count != 0 { + // If page has any elements, add all element headers. + used += leafPageElementSize * int(p.count-1) + + // Add all element key, value sizes. + // The computation takes advantage of the fact that the position + // of the last element's key/value equals to the total of the sizes + // of all previous elements' keys and values. + // It also includes the last element's header. + lastElement := p.leafPageElement(p.count - 1) + used += int(lastElement.pos + lastElement.ksize + lastElement.vsize) + } + + if b.root == 0 { + // For inlined bucket just update the inline stats + s.InlineBucketInuse += used + } else { + // For non-inlined bucket update all the leaf stats + s.LeafPageN++ + s.LeafInuse += used + s.LeafOverflowN += int(p.overflow) + + // Collect stats from sub-buckets. + // Do that by iterating over all element headers + // looking for the ones with the bucketLeafFlag. + for i := uint16(0); i < p.count; i++ { + e := p.leafPageElement(i) + if (e.flags & bucketLeafFlag) != 0 { + // For any bucket element, open the element value + // and recursively call Stats on the contained bucket. + subStats.Add(b.openBucket(e.value()).Stats()) + } + } + } + } else if (p.flags & branchPageFlag) != 0 { + s.BranchPageN++ + lastElement := p.branchPageElement(p.count - 1) + + // used totals the used bytes for the page + // Add header and all element headers. + used := pageHeaderSize + (branchPageElementSize * int(p.count-1)) + + // Add size of all keys and values. + // Again, use the fact that last element's position equals to + // the total of key, value sizes of all previous elements. + used += int(lastElement.pos + lastElement.ksize) + s.BranchInuse += used + s.BranchOverflowN += int(p.overflow) + } + + // Keep track of maximum page depth. + if depth+1 > s.Depth { + s.Depth = (depth + 1) + } + }) + + // Alloc stats can be computed from page counts and pageSize. + s.BranchAlloc = (s.BranchPageN + s.BranchOverflowN) * pageSize + s.LeafAlloc = (s.LeafPageN + s.LeafOverflowN) * pageSize + + // Add the max depth of sub-buckets to get total nested depth. + s.Depth += subStats.Depth + // Add the stats for all sub-buckets + s.Add(subStats) + return s +} + +// forEachPage iterates over every page in a bucket, including inline pages. +func (b *Bucket) forEachPage(fn func(*page, int)) { + // If we have an inline page then just use that. + if b.page != nil { + fn(b.page, 0) + return + } + + // Otherwise traverse the page hierarchy. + b.tx.forEachPage(b.root, 0, fn) +} + +// forEachPageNode iterates over every page (or node) in a bucket. +// This also includes inline pages. +func (b *Bucket) forEachPageNode(fn func(*page, *node, int)) { + // If we have an inline page or root node then just use that. + if b.page != nil { + fn(b.page, nil, 0) + return + } + b._forEachPageNode(b.root, 0, fn) +} + +func (b *Bucket) _forEachPageNode(pgid pgid, depth int, fn func(*page, *node, int)) { + var p, n = b.pageNode(pgid) + + // Execute function. + fn(p, n, depth) + + // Recursively loop over children. + if p != nil { + if (p.flags & branchPageFlag) != 0 { + for i := 0; i < int(p.count); i++ { + elem := p.branchPageElement(uint16(i)) + b._forEachPageNode(elem.pgid, depth+1, fn) + } + } + } else { + if !n.isLeaf { + for _, inode := range n.inodes { + b._forEachPageNode(inode.pgid, depth+1, fn) + } + } + } +} + +// spill writes all the nodes for this bucket to dirty pages. +func (b *Bucket) spill() error { + // Spill all child buckets first. + for name, child := range b.buckets { + // If the child bucket is small enough and it has no child buckets then + // write it inline into the parent bucket's page. Otherwise spill it + // like a normal bucket and make the parent value a pointer to the page. + var value []byte + if child.inlineable() { + child.free() + value = child.write() + } else { + if err := child.spill(); err != nil { + return err + } + + // Update the child bucket header in this bucket. + value = make([]byte, unsafe.Sizeof(bucket{})) + var bucket = (*bucket)(unsafe.Pointer(&value[0])) + *bucket = *child.bucket + } + + // Skip writing the bucket if there are no materialized nodes. + if child.rootNode == nil { + continue + } + + // Update parent node. + var c = b.Cursor() + k, _, flags := c.seek([]byte(name)) + if !bytes.Equal([]byte(name), k) { + panic(fmt.Sprintf("misplaced bucket header: %x -> %x", []byte(name), k)) + } + if flags&bucketLeafFlag == 0 { + panic(fmt.Sprintf("unexpected bucket header flag: %x", flags)) + } + c.node().put([]byte(name), []byte(name), value, 0, bucketLeafFlag) + } + + // Ignore if there's not a materialized root node. + if b.rootNode == nil { + return nil + } + + // Spill nodes. + if err := b.rootNode.spill(); err != nil { + return err + } + b.rootNode = b.rootNode.root() + + // Update the root node for this bucket. + if b.rootNode.pgid >= b.tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", b.rootNode.pgid, b.tx.meta.pgid)) + } + b.root = b.rootNode.pgid + + return nil +} + +// inlineable returns true if a bucket is small enough to be written inline +// and if it contains no subbuckets. Otherwise returns false. +func (b *Bucket) inlineable() bool { + var n = b.rootNode + + // Bucket must only contain a single leaf node. + if n == nil || !n.isLeaf { + return false + } + + // Bucket is not inlineable if it contains subbuckets or if it goes beyond + // our threshold for inline bucket size. + var size = pageHeaderSize + for _, inode := range n.inodes { + size += leafPageElementSize + len(inode.key) + len(inode.value) + + if inode.flags&bucketLeafFlag != 0 { + return false + } else if size > b.maxInlineBucketSize() { + return false + } + } + + return true +} + +// Returns the maximum total size of a bucket to make it a candidate for inlining. +func (b *Bucket) maxInlineBucketSize() int { + return b.tx.db.pageSize / 4 +} + +// write allocates and writes a bucket to a byte slice. +func (b *Bucket) write() []byte { + // Allocate the appropriate size. + var n = b.rootNode + var value = make([]byte, bucketHeaderSize+n.size()) + + // Write a bucket header. + var bucket = (*bucket)(unsafe.Pointer(&value[0])) + *bucket = *b.bucket + + // Convert byte slice to a fake page and write the root node. + var p = (*page)(unsafe.Pointer(&value[bucketHeaderSize])) + n.write(p) + + return value +} + +// rebalance attempts to balance all nodes. +func (b *Bucket) rebalance() { + for _, n := range b.nodes { + n.rebalance() + } + for _, child := range b.buckets { + child.rebalance() + } +} + +// node creates a node from a page and associates it with a given parent. +func (b *Bucket) node(pgid pgid, parent *node) *node { + _assert(b.nodes != nil, "nodes map expected") + + // Retrieve node if it's already been created. + if n := b.nodes[pgid]; n != nil { + return n + } + + // Otherwise create a node and cache it. + n := &node{bucket: b, parent: parent} + if parent == nil { + b.rootNode = n + } else { + parent.children = append(parent.children, n) + } + + // Use the inline page if this is an inline bucket. + var p = b.page + if p == nil { + p = b.tx.page(pgid) + } + + // Read the page into the node and cache it. + n.read(p) + b.nodes[pgid] = n + + // Update statistics. + b.tx.stats.NodeCount++ + + return n +} + +// free recursively frees all pages in the bucket. +func (b *Bucket) free() { + if b.root == 0 { + return + } + + var tx = b.tx + b.forEachPageNode(func(p *page, n *node, _ int) { + if p != nil { + tx.db.freelist.free(tx.meta.txid, p) + } else { + n.free() + } + }) + b.root = 0 +} + +// dereference removes all references to the old mmap. +func (b *Bucket) dereference() { + if b.rootNode != nil { + b.rootNode.root().dereference() + } + + for _, child := range b.buckets { + child.dereference() + } +} + +// pageNode returns the in-memory node, if it exists. +// Otherwise returns the underlying page. +func (b *Bucket) pageNode(id pgid) (*page, *node) { + // Inline buckets have a fake page embedded in their value so treat them + // differently. We'll return the rootNode (if available) or the fake page. + if b.root == 0 { + if id != 0 { + panic(fmt.Sprintf("inline bucket non-zero page access(2): %d != 0", id)) + } + if b.rootNode != nil { + return nil, b.rootNode + } + return b.page, nil + } + + // Check the node cache for non-inline buckets. + if b.nodes != nil { + if n := b.nodes[id]; n != nil { + return nil, n + } + } + + // Finally lookup the page from the transaction if no node is materialized. + return b.tx.page(id), nil +} + +// BucketStats records statistics about resources used by a bucket. +type BucketStats struct { + // Page count statistics. + BranchPageN int // number of logical branch pages + BranchOverflowN int // number of physical branch overflow pages + LeafPageN int // number of logical leaf pages + LeafOverflowN int // number of physical leaf overflow pages + + // Tree statistics. + KeyN int // number of keys/value pairs + Depth int // number of levels in B+tree + + // Page size utilization. + BranchAlloc int // bytes allocated for physical branch pages + BranchInuse int // bytes actually used for branch data + LeafAlloc int // bytes allocated for physical leaf pages + LeafInuse int // bytes actually used for leaf data + + // Bucket statistics + BucketN int // total number of buckets including the top bucket + InlineBucketN int // total number on inlined buckets + InlineBucketInuse int // bytes used for inlined buckets (also accounted for in LeafInuse) +} + +func (s *BucketStats) Add(other BucketStats) { + s.BranchPageN += other.BranchPageN + s.BranchOverflowN += other.BranchOverflowN + s.LeafPageN += other.LeafPageN + s.LeafOverflowN += other.LeafOverflowN + s.KeyN += other.KeyN + if s.Depth < other.Depth { + s.Depth = other.Depth + } + s.BranchAlloc += other.BranchAlloc + s.BranchInuse += other.BranchInuse + s.LeafAlloc += other.LeafAlloc + s.LeafInuse += other.LeafInuse + + s.BucketN += other.BucketN + s.InlineBucketN += other.InlineBucketN + s.InlineBucketInuse += other.InlineBucketInuse +} + +// cloneBytes returns a copy of a given slice. +func cloneBytes(v []byte) []byte { + var clone = make([]byte, len(v)) + copy(clone, v) + return clone +} diff --git a/vendor/github.com/boltdb/bolt/cursor.go b/vendor/github.com/boltdb/bolt/cursor.go new file mode 100644 index 0000000000..1be9f35e3e --- /dev/null +++ b/vendor/github.com/boltdb/bolt/cursor.go @@ -0,0 +1,400 @@ +package bolt + +import ( + "bytes" + "fmt" + "sort" +) + +// Cursor represents an iterator that can traverse over all key/value pairs in a bucket in sorted order. +// Cursors see nested buckets with value == nil. +// Cursors can be obtained from a transaction and are valid as long as the transaction is open. +// +// Keys and values returned from the cursor are only valid for the life of the transaction. +// +// Changing data while traversing with a cursor may cause it to be invalidated +// and return unexpected keys and/or values. You must reposition your cursor +// after mutating data. +type Cursor struct { + bucket *Bucket + stack []elemRef +} + +// Bucket returns the bucket that this cursor was created from. +func (c *Cursor) Bucket() *Bucket { + return c.bucket +} + +// First moves the cursor to the first item in the bucket and returns its key and value. +// If the bucket is empty then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) First() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + c.stack = c.stack[:0] + p, n := c.bucket.pageNode(c.bucket.root) + c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) + c.first() + + // If we land on an empty page then move to the next value. + // https://github.com/boltdb/bolt/issues/450 + if c.stack[len(c.stack)-1].count() == 0 { + c.next() + } + + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v + +} + +// Last moves the cursor to the last item in the bucket and returns its key and value. +// If the bucket is empty then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Last() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + c.stack = c.stack[:0] + p, n := c.bucket.pageNode(c.bucket.root) + ref := elemRef{page: p, node: n} + ref.index = ref.count() - 1 + c.stack = append(c.stack, ref) + c.last() + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Next moves the cursor to the next item in the bucket and returns its key and value. +// If the cursor is at the end of the bucket then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Next() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + k, v, flags := c.next() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Prev moves the cursor to the previous item in the bucket and returns its key and value. +// If the cursor is at the beginning of the bucket then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Prev() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + + // Attempt to move back one element until we're successful. + // Move up the stack as we hit the beginning of each page in our stack. + for i := len(c.stack) - 1; i >= 0; i-- { + elem := &c.stack[i] + if elem.index > 0 { + elem.index-- + break + } + c.stack = c.stack[:i] + } + + // If we've hit the end then return nil. + if len(c.stack) == 0 { + return nil, nil + } + + // Move down the stack to find the last element of the last leaf under this branch. + c.last() + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Seek moves the cursor to a given key and returns it. +// If the key does not exist then the next key is used. If no keys +// follow, a nil key is returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Seek(seek []byte) (key []byte, value []byte) { + k, v, flags := c.seek(seek) + + // If we ended up after the last element of a page then move to the next one. + if ref := &c.stack[len(c.stack)-1]; ref.index >= ref.count() { + k, v, flags = c.next() + } + + if k == nil { + return nil, nil + } else if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Delete removes the current key/value under the cursor from the bucket. +// Delete fails if current key/value is a bucket or if the transaction is not writable. +func (c *Cursor) Delete() error { + if c.bucket.tx.db == nil { + return ErrTxClosed + } else if !c.bucket.Writable() { + return ErrTxNotWritable + } + + key, _, flags := c.keyValue() + // Return an error if current value is a bucket. + if (flags & bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + c.node().del(key) + + return nil +} + +// seek moves the cursor to a given key and returns it. +// If the key does not exist then the next key is used. +func (c *Cursor) seek(seek []byte) (key []byte, value []byte, flags uint32) { + _assert(c.bucket.tx.db != nil, "tx closed") + + // Start from root page/node and traverse to correct page. + c.stack = c.stack[:0] + c.search(seek, c.bucket.root) + ref := &c.stack[len(c.stack)-1] + + // If the cursor is pointing to the end of page/node then return nil. + if ref.index >= ref.count() { + return nil, nil, 0 + } + + // If this is a bucket then return a nil value. + return c.keyValue() +} + +// first moves the cursor to the first leaf element under the last page in the stack. +func (c *Cursor) first() { + for { + // Exit when we hit a leaf page. + var ref = &c.stack[len(c.stack)-1] + if ref.isLeaf() { + break + } + + // Keep adding pages pointing to the first element to the stack. + var pgid pgid + if ref.node != nil { + pgid = ref.node.inodes[ref.index].pgid + } else { + pgid = ref.page.branchPageElement(uint16(ref.index)).pgid + } + p, n := c.bucket.pageNode(pgid) + c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) + } +} + +// last moves the cursor to the last leaf element under the last page in the stack. +func (c *Cursor) last() { + for { + // Exit when we hit a leaf page. + ref := &c.stack[len(c.stack)-1] + if ref.isLeaf() { + break + } + + // Keep adding pages pointing to the last element in the stack. + var pgid pgid + if ref.node != nil { + pgid = ref.node.inodes[ref.index].pgid + } else { + pgid = ref.page.branchPageElement(uint16(ref.index)).pgid + } + p, n := c.bucket.pageNode(pgid) + + var nextRef = elemRef{page: p, node: n} + nextRef.index = nextRef.count() - 1 + c.stack = append(c.stack, nextRef) + } +} + +// next moves to the next leaf element and returns the key and value. +// If the cursor is at the last leaf element then it stays there and returns nil. +func (c *Cursor) next() (key []byte, value []byte, flags uint32) { + for { + // Attempt to move over one element until we're successful. + // Move up the stack as we hit the end of each page in our stack. + var i int + for i = len(c.stack) - 1; i >= 0; i-- { + elem := &c.stack[i] + if elem.index < elem.count()-1 { + elem.index++ + break + } + } + + // If we've hit the root page then stop and return. This will leave the + // cursor on the last element of the last page. + if i == -1 { + return nil, nil, 0 + } + + // Otherwise start from where we left off in the stack and find the + // first element of the first leaf page. + c.stack = c.stack[:i+1] + c.first() + + // If this is an empty page then restart and move back up the stack. + // https://github.com/boltdb/bolt/issues/450 + if c.stack[len(c.stack)-1].count() == 0 { + continue + } + + return c.keyValue() + } +} + +// search recursively performs a binary search against a given page/node until it finds a given key. +func (c *Cursor) search(key []byte, pgid pgid) { + p, n := c.bucket.pageNode(pgid) + if p != nil && (p.flags&(branchPageFlag|leafPageFlag)) == 0 { + panic(fmt.Sprintf("invalid page type: %d: %x", p.id, p.flags)) + } + e := elemRef{page: p, node: n} + c.stack = append(c.stack, e) + + // If we're on a leaf page/node then find the specific node. + if e.isLeaf() { + c.nsearch(key) + return + } + + if n != nil { + c.searchNode(key, n) + return + } + c.searchPage(key, p) +} + +func (c *Cursor) searchNode(key []byte, n *node) { + var exact bool + index := sort.Search(len(n.inodes), func(i int) bool { + // TODO(benbjohnson): Optimize this range search. It's a bit hacky right now. + // sort.Search() finds the lowest index where f() != -1 but we need the highest index. + ret := bytes.Compare(n.inodes[i].key, key) + if ret == 0 { + exact = true + } + return ret != -1 + }) + if !exact && index > 0 { + index-- + } + c.stack[len(c.stack)-1].index = index + + // Recursively search to the next page. + c.search(key, n.inodes[index].pgid) +} + +func (c *Cursor) searchPage(key []byte, p *page) { + // Binary search for the correct range. + inodes := p.branchPageElements() + + var exact bool + index := sort.Search(int(p.count), func(i int) bool { + // TODO(benbjohnson): Optimize this range search. It's a bit hacky right now. + // sort.Search() finds the lowest index where f() != -1 but we need the highest index. + ret := bytes.Compare(inodes[i].key(), key) + if ret == 0 { + exact = true + } + return ret != -1 + }) + if !exact && index > 0 { + index-- + } + c.stack[len(c.stack)-1].index = index + + // Recursively search to the next page. + c.search(key, inodes[index].pgid) +} + +// nsearch searches the leaf node on the top of the stack for a key. +func (c *Cursor) nsearch(key []byte) { + e := &c.stack[len(c.stack)-1] + p, n := e.page, e.node + + // If we have a node then search its inodes. + if n != nil { + index := sort.Search(len(n.inodes), func(i int) bool { + return bytes.Compare(n.inodes[i].key, key) != -1 + }) + e.index = index + return + } + + // If we have a page then search its leaf elements. + inodes := p.leafPageElements() + index := sort.Search(int(p.count), func(i int) bool { + return bytes.Compare(inodes[i].key(), key) != -1 + }) + e.index = index +} + +// keyValue returns the key and value of the current leaf element. +func (c *Cursor) keyValue() ([]byte, []byte, uint32) { + ref := &c.stack[len(c.stack)-1] + if ref.count() == 0 || ref.index >= ref.count() { + return nil, nil, 0 + } + + // Retrieve value from node. + if ref.node != nil { + inode := &ref.node.inodes[ref.index] + return inode.key, inode.value, inode.flags + } + + // Or retrieve value from page. + elem := ref.page.leafPageElement(uint16(ref.index)) + return elem.key(), elem.value(), elem.flags +} + +// node returns the node that the cursor is currently positioned on. +func (c *Cursor) node() *node { + _assert(len(c.stack) > 0, "accessing a node with a zero-length cursor stack") + + // If the top of the stack is a leaf node then just return it. + if ref := &c.stack[len(c.stack)-1]; ref.node != nil && ref.isLeaf() { + return ref.node + } + + // Start from root and traverse down the hierarchy. + var n = c.stack[0].node + if n == nil { + n = c.bucket.node(c.stack[0].page.id, nil) + } + for _, ref := range c.stack[:len(c.stack)-1] { + _assert(!n.isLeaf, "expected branch node") + n = n.childAt(int(ref.index)) + } + _assert(n.isLeaf, "expected leaf node") + return n +} + +// elemRef represents a reference to an element on a given page/node. +type elemRef struct { + page *page + node *node + index int +} + +// isLeaf returns whether the ref is pointing at a leaf page/node. +func (r *elemRef) isLeaf() bool { + if r.node != nil { + return r.node.isLeaf + } + return (r.page.flags & leafPageFlag) != 0 +} + +// count returns the number of inodes or page elements. +func (r *elemRef) count() int { + if r.node != nil { + return len(r.node.inodes) + } + return int(r.page.count) +} diff --git a/vendor/github.com/boltdb/bolt/db.go b/vendor/github.com/boltdb/bolt/db.go new file mode 100644 index 0000000000..f352ff14fe --- /dev/null +++ b/vendor/github.com/boltdb/bolt/db.go @@ -0,0 +1,1039 @@ +package bolt + +import ( + "errors" + "fmt" + "hash/fnv" + "log" + "os" + "runtime" + "runtime/debug" + "strings" + "sync" + "time" + "unsafe" +) + +// The largest step that can be taken when remapping the mmap. +const maxMmapStep = 1 << 30 // 1GB + +// The data file format version. +const version = 2 + +// Represents a marker value to indicate that a file is a Bolt DB. +const magic uint32 = 0xED0CDAED + +// IgnoreNoSync specifies whether the NoSync field of a DB is ignored when +// syncing changes to a file. This is required as some operating systems, +// such as OpenBSD, do not have a unified buffer cache (UBC) and writes +// must be synchronized using the msync(2) syscall. +const IgnoreNoSync = runtime.GOOS == "openbsd" + +// Default values if not set in a DB instance. +const ( + DefaultMaxBatchSize int = 1000 + DefaultMaxBatchDelay = 10 * time.Millisecond + DefaultAllocSize = 16 * 1024 * 1024 +) + +// default page size for db is set to the OS page size. +var defaultPageSize = os.Getpagesize() + +// DB represents a collection of buckets persisted to a file on disk. +// All data access is performed through transactions which can be obtained through the DB. +// All the functions on DB will return a ErrDatabaseNotOpen if accessed before Open() is called. +type DB struct { + // When enabled, the database will perform a Check() after every commit. + // A panic is issued if the database is in an inconsistent state. This + // flag has a large performance impact so it should only be used for + // debugging purposes. + StrictMode bool + + // Setting the NoSync flag will cause the database to skip fsync() + // calls after each commit. This can be useful when bulk loading data + // into a database and you can restart the bulk load in the event of + // a system failure or database corruption. Do not set this flag for + // normal use. + // + // If the package global IgnoreNoSync constant is true, this value is + // ignored. See the comment on that constant for more details. + // + // THIS IS UNSAFE. PLEASE USE WITH CAUTION. + NoSync bool + + // When true, skips the truncate call when growing the database. + // Setting this to true is only safe on non-ext3/ext4 systems. + // Skipping truncation avoids preallocation of hard drive space and + // bypasses a truncate() and fsync() syscall on remapping. + // + // https://github.com/boltdb/bolt/issues/284 + NoGrowSync bool + + // If you want to read the entire database fast, you can set MmapFlag to + // syscall.MAP_POPULATE on Linux 2.6.23+ for sequential read-ahead. + MmapFlags int + + // MaxBatchSize is the maximum size of a batch. Default value is + // copied from DefaultMaxBatchSize in Open. + // + // If <=0, disables batching. + // + // Do not change concurrently with calls to Batch. + MaxBatchSize int + + // MaxBatchDelay is the maximum delay before a batch starts. + // Default value is copied from DefaultMaxBatchDelay in Open. + // + // If <=0, effectively disables batching. + // + // Do not change concurrently with calls to Batch. + MaxBatchDelay time.Duration + + // AllocSize is the amount of space allocated when the database + // needs to create new pages. This is done to amortize the cost + // of truncate() and fsync() when growing the data file. + AllocSize int + + path string + file *os.File + lockfile *os.File // windows only + dataref []byte // mmap'ed readonly, write throws SEGV + data *[maxMapSize]byte + datasz int + filesz int // current on disk file size + meta0 *meta + meta1 *meta + pageSize int + opened bool + rwtx *Tx + txs []*Tx + freelist *freelist + stats Stats + + pagePool sync.Pool + + batchMu sync.Mutex + batch *batch + + rwlock sync.Mutex // Allows only one writer at a time. + metalock sync.Mutex // Protects meta page access. + mmaplock sync.RWMutex // Protects mmap access during remapping. + statlock sync.RWMutex // Protects stats access. + + ops struct { + writeAt func(b []byte, off int64) (n int, err error) + } + + // Read only mode. + // When true, Update() and Begin(true) return ErrDatabaseReadOnly immediately. + readOnly bool +} + +// Path returns the path to currently open database file. +func (db *DB) Path() string { + return db.path +} + +// GoString returns the Go string representation of the database. +func (db *DB) GoString() string { + return fmt.Sprintf("bolt.DB{path:%q}", db.path) +} + +// String returns the string representation of the database. +func (db *DB) String() string { + return fmt.Sprintf("DB<%q>", db.path) +} + +// Open creates and opens a database at the given path. +// If the file does not exist then it will be created automatically. +// Passing in nil options will cause Bolt to open the database with the default options. +func Open(path string, mode os.FileMode, options *Options) (*DB, error) { + var db = &DB{opened: true} + + // Set default options if no options are provided. + if options == nil { + options = DefaultOptions + } + db.NoGrowSync = options.NoGrowSync + db.MmapFlags = options.MmapFlags + + // Set default values for later DB operations. + db.MaxBatchSize = DefaultMaxBatchSize + db.MaxBatchDelay = DefaultMaxBatchDelay + db.AllocSize = DefaultAllocSize + + flag := os.O_RDWR + if options.ReadOnly { + flag = os.O_RDONLY + db.readOnly = true + } + + // Open data file and separate sync handler for metadata writes. + db.path = path + var err error + if db.file, err = os.OpenFile(db.path, flag|os.O_CREATE, mode); err != nil { + _ = db.close() + return nil, err + } + + // Lock file so that other processes using Bolt in read-write mode cannot + // use the database at the same time. This would cause corruption since + // the two processes would write meta pages and free pages separately. + // The database file is locked exclusively (only one process can grab the lock) + // if !options.ReadOnly. + // The database file is locked using the shared lock (more than one process may + // hold a lock at the same time) otherwise (options.ReadOnly is set). + if err := flock(db, mode, !db.readOnly, options.Timeout); err != nil { + _ = db.close() + return nil, err + } + + // Default values for test hooks + db.ops.writeAt = db.file.WriteAt + + // Initialize the database if it doesn't exist. + if info, err := db.file.Stat(); err != nil { + return nil, err + } else if info.Size() == 0 { + // Initialize new files with meta pages. + if err := db.init(); err != nil { + return nil, err + } + } else { + // Read the first meta page to determine the page size. + var buf [0x1000]byte + if _, err := db.file.ReadAt(buf[:], 0); err == nil { + m := db.pageInBuffer(buf[:], 0).meta() + if err := m.validate(); err != nil { + // If we can't read the page size, we can assume it's the same + // as the OS -- since that's how the page size was chosen in the + // first place. + // + // If the first page is invalid and this OS uses a different + // page size than what the database was created with then we + // are out of luck and cannot access the database. + db.pageSize = os.Getpagesize() + } else { + db.pageSize = int(m.pageSize) + } + } + } + + // Initialize page pool. + db.pagePool = sync.Pool{ + New: func() interface{} { + return make([]byte, db.pageSize) + }, + } + + // Memory map the data file. + if err := db.mmap(options.InitialMmapSize); err != nil { + _ = db.close() + return nil, err + } + + // Read in the freelist. + db.freelist = newFreelist() + db.freelist.read(db.page(db.meta().freelist)) + + // Mark the database as opened and return. + return db, nil +} + +// mmap opens the underlying memory-mapped file and initializes the meta references. +// minsz is the minimum size that the new mmap can be. +func (db *DB) mmap(minsz int) error { + db.mmaplock.Lock() + defer db.mmaplock.Unlock() + + info, err := db.file.Stat() + if err != nil { + return fmt.Errorf("mmap stat error: %s", err) + } else if int(info.Size()) < db.pageSize*2 { + return fmt.Errorf("file size too small") + } + + // Ensure the size is at least the minimum size. + var size = int(info.Size()) + if size < minsz { + size = minsz + } + size, err = db.mmapSize(size) + if err != nil { + return err + } + + // Dereference all mmap references before unmapping. + if db.rwtx != nil { + db.rwtx.root.dereference() + } + + // Unmap existing data before continuing. + if err := db.munmap(); err != nil { + return err + } + + // Memory-map the data file as a byte slice. + if err := mmap(db, size); err != nil { + return err + } + + // Save references to the meta pages. + db.meta0 = db.page(0).meta() + db.meta1 = db.page(1).meta() + + // Validate the meta pages. We only return an error if both meta pages fail + // validation, since meta0 failing validation means that it wasn't saved + // properly -- but we can recover using meta1. And vice-versa. + err0 := db.meta0.validate() + err1 := db.meta1.validate() + if err0 != nil && err1 != nil { + return err0 + } + + return nil +} + +// munmap unmaps the data file from memory. +func (db *DB) munmap() error { + if err := munmap(db); err != nil { + return fmt.Errorf("unmap error: " + err.Error()) + } + return nil +} + +// mmapSize determines the appropriate size for the mmap given the current size +// of the database. The minimum size is 32KB and doubles until it reaches 1GB. +// Returns an error if the new mmap size is greater than the max allowed. +func (db *DB) mmapSize(size int) (int, error) { + // Double the size from 32KB until 1GB. + for i := uint(15); i <= 30; i++ { + if size <= 1< maxMapSize { + return 0, fmt.Errorf("mmap too large") + } + + // If larger than 1GB then grow by 1GB at a time. + sz := int64(size) + if remainder := sz % int64(maxMmapStep); remainder > 0 { + sz += int64(maxMmapStep) - remainder + } + + // Ensure that the mmap size is a multiple of the page size. + // This should always be true since we're incrementing in MBs. + pageSize := int64(db.pageSize) + if (sz % pageSize) != 0 { + sz = ((sz / pageSize) + 1) * pageSize + } + + // If we've exceeded the max size then only grow up to the max size. + if sz > maxMapSize { + sz = maxMapSize + } + + return int(sz), nil +} + +// init creates a new database file and initializes its meta pages. +func (db *DB) init() error { + // Set the page size to the OS page size. + db.pageSize = os.Getpagesize() + + // Create two meta pages on a buffer. + buf := make([]byte, db.pageSize*4) + for i := 0; i < 2; i++ { + p := db.pageInBuffer(buf[:], pgid(i)) + p.id = pgid(i) + p.flags = metaPageFlag + + // Initialize the meta page. + m := p.meta() + m.magic = magic + m.version = version + m.pageSize = uint32(db.pageSize) + m.freelist = 2 + m.root = bucket{root: 3} + m.pgid = 4 + m.txid = txid(i) + m.checksum = m.sum64() + } + + // Write an empty freelist at page 3. + p := db.pageInBuffer(buf[:], pgid(2)) + p.id = pgid(2) + p.flags = freelistPageFlag + p.count = 0 + + // Write an empty leaf page at page 4. + p = db.pageInBuffer(buf[:], pgid(3)) + p.id = pgid(3) + p.flags = leafPageFlag + p.count = 0 + + // Write the buffer to our data file. + if _, err := db.ops.writeAt(buf, 0); err != nil { + return err + } + if err := fdatasync(db); err != nil { + return err + } + + return nil +} + +// Close releases all database resources. +// All transactions must be closed before closing the database. +func (db *DB) Close() error { + db.rwlock.Lock() + defer db.rwlock.Unlock() + + db.metalock.Lock() + defer db.metalock.Unlock() + + db.mmaplock.RLock() + defer db.mmaplock.RUnlock() + + return db.close() +} + +func (db *DB) close() error { + if !db.opened { + return nil + } + + db.opened = false + + db.freelist = nil + + // Clear ops. + db.ops.writeAt = nil + + // Close the mmap. + if err := db.munmap(); err != nil { + return err + } + + // Close file handles. + if db.file != nil { + // No need to unlock read-only file. + if !db.readOnly { + // Unlock the file. + if err := funlock(db); err != nil { + log.Printf("bolt.Close(): funlock error: %s", err) + } + } + + // Close the file descriptor. + if err := db.file.Close(); err != nil { + return fmt.Errorf("db file close: %s", err) + } + db.file = nil + } + + db.path = "" + return nil +} + +// Begin starts a new transaction. +// Multiple read-only transactions can be used concurrently but only one +// write transaction can be used at a time. Starting multiple write transactions +// will cause the calls to block and be serialized until the current write +// transaction finishes. +// +// Transactions should not be dependent on one another. Opening a read +// transaction and a write transaction in the same goroutine can cause the +// writer to deadlock because the database periodically needs to re-mmap itself +// as it grows and it cannot do that while a read transaction is open. +// +// If a long running read transaction (for example, a snapshot transaction) is +// needed, you might want to set DB.InitialMmapSize to a large enough value +// to avoid potential blocking of write transaction. +// +// IMPORTANT: You must close read-only transactions after you are finished or +// else the database will not reclaim old pages. +func (db *DB) Begin(writable bool) (*Tx, error) { + if writable { + return db.beginRWTx() + } + return db.beginTx() +} + +func (db *DB) beginTx() (*Tx, error) { + // Lock the meta pages while we initialize the transaction. We obtain + // the meta lock before the mmap lock because that's the order that the + // write transaction will obtain them. + db.metalock.Lock() + + // Obtain a read-only lock on the mmap. When the mmap is remapped it will + // obtain a write lock so all transactions must finish before it can be + // remapped. + db.mmaplock.RLock() + + // Exit if the database is not open yet. + if !db.opened { + db.mmaplock.RUnlock() + db.metalock.Unlock() + return nil, ErrDatabaseNotOpen + } + + // Create a transaction associated with the database. + t := &Tx{} + t.init(db) + + // Keep track of transaction until it closes. + db.txs = append(db.txs, t) + n := len(db.txs) + + // Unlock the meta pages. + db.metalock.Unlock() + + // Update the transaction stats. + db.statlock.Lock() + db.stats.TxN++ + db.stats.OpenTxN = n + db.statlock.Unlock() + + return t, nil +} + +func (db *DB) beginRWTx() (*Tx, error) { + // If the database was opened with Options.ReadOnly, return an error. + if db.readOnly { + return nil, ErrDatabaseReadOnly + } + + // Obtain writer lock. This is released by the transaction when it closes. + // This enforces only one writer transaction at a time. + db.rwlock.Lock() + + // Once we have the writer lock then we can lock the meta pages so that + // we can set up the transaction. + db.metalock.Lock() + defer db.metalock.Unlock() + + // Exit if the database is not open yet. + if !db.opened { + db.rwlock.Unlock() + return nil, ErrDatabaseNotOpen + } + + // Create a transaction associated with the database. + t := &Tx{writable: true} + t.init(db) + db.rwtx = t + + // Free any pages associated with closed read-only transactions. + var minid txid = 0xFFFFFFFFFFFFFFFF + for _, t := range db.txs { + if t.meta.txid < minid { + minid = t.meta.txid + } + } + if minid > 0 { + db.freelist.release(minid - 1) + } + + return t, nil +} + +// removeTx removes a transaction from the database. +func (db *DB) removeTx(tx *Tx) { + // Release the read lock on the mmap. + db.mmaplock.RUnlock() + + // Use the meta lock to restrict access to the DB object. + db.metalock.Lock() + + // Remove the transaction. + for i, t := range db.txs { + if t == tx { + last := len(db.txs) - 1 + db.txs[i] = db.txs[last] + db.txs[last] = nil + db.txs = db.txs[:last] + break + } + } + n := len(db.txs) + + // Unlock the meta pages. + db.metalock.Unlock() + + // Merge statistics. + db.statlock.Lock() + db.stats.OpenTxN = n + db.stats.TxStats.add(&tx.stats) + db.statlock.Unlock() +} + +// Update executes a function within the context of a read-write managed transaction. +// If no error is returned from the function then the transaction is committed. +// If an error is returned then the entire transaction is rolled back. +// Any error that is returned from the function or returned from the commit is +// returned from the Update() method. +// +// Attempting to manually commit or rollback within the function will cause a panic. +func (db *DB) Update(fn func(*Tx) error) error { + t, err := db.Begin(true) + if err != nil { + return err + } + + // Make sure the transaction rolls back in the event of a panic. + defer func() { + if t.db != nil { + t.rollback() + } + }() + + // Mark as a managed tx so that the inner function cannot manually commit. + t.managed = true + + // If an error is returned from the function then rollback and return error. + err = fn(t) + t.managed = false + if err != nil { + _ = t.Rollback() + return err + } + + return t.Commit() +} + +// View executes a function within the context of a managed read-only transaction. +// Any error that is returned from the function is returned from the View() method. +// +// Attempting to manually rollback within the function will cause a panic. +func (db *DB) View(fn func(*Tx) error) error { + t, err := db.Begin(false) + if err != nil { + return err + } + + // Make sure the transaction rolls back in the event of a panic. + defer func() { + if t.db != nil { + t.rollback() + } + }() + + // Mark as a managed tx so that the inner function cannot manually rollback. + t.managed = true + + // If an error is returned from the function then pass it through. + err = fn(t) + t.managed = false + if err != nil { + _ = t.Rollback() + return err + } + + if err := t.Rollback(); err != nil { + return err + } + + return nil +} + +// Batch calls fn as part of a batch. It behaves similar to Update, +// except: +// +// 1. concurrent Batch calls can be combined into a single Bolt +// transaction. +// +// 2. the function passed to Batch may be called multiple times, +// regardless of whether it returns error or not. +// +// This means that Batch function side effects must be idempotent and +// take permanent effect only after a successful return is seen in +// caller. +// +// The maximum batch size and delay can be adjusted with DB.MaxBatchSize +// and DB.MaxBatchDelay, respectively. +// +// Batch is only useful when there are multiple goroutines calling it. +func (db *DB) Batch(fn func(*Tx) error) error { + errCh := make(chan error, 1) + + db.batchMu.Lock() + if (db.batch == nil) || (db.batch != nil && len(db.batch.calls) >= db.MaxBatchSize) { + // There is no existing batch, or the existing batch is full; start a new one. + db.batch = &batch{ + db: db, + } + db.batch.timer = time.AfterFunc(db.MaxBatchDelay, db.batch.trigger) + } + db.batch.calls = append(db.batch.calls, call{fn: fn, err: errCh}) + if len(db.batch.calls) >= db.MaxBatchSize { + // wake up batch, it's ready to run + go db.batch.trigger() + } + db.batchMu.Unlock() + + err := <-errCh + if err == trySolo { + err = db.Update(fn) + } + return err +} + +type call struct { + fn func(*Tx) error + err chan<- error +} + +type batch struct { + db *DB + timer *time.Timer + start sync.Once + calls []call +} + +// trigger runs the batch if it hasn't already been run. +func (b *batch) trigger() { + b.start.Do(b.run) +} + +// run performs the transactions in the batch and communicates results +// back to DB.Batch. +func (b *batch) run() { + b.db.batchMu.Lock() + b.timer.Stop() + // Make sure no new work is added to this batch, but don't break + // other batches. + if b.db.batch == b { + b.db.batch = nil + } + b.db.batchMu.Unlock() + +retry: + for len(b.calls) > 0 { + var failIdx = -1 + err := b.db.Update(func(tx *Tx) error { + for i, c := range b.calls { + if err := safelyCall(c.fn, tx); err != nil { + failIdx = i + return err + } + } + return nil + }) + + if failIdx >= 0 { + // take the failing transaction out of the batch. it's + // safe to shorten b.calls here because db.batch no longer + // points to us, and we hold the mutex anyway. + c := b.calls[failIdx] + b.calls[failIdx], b.calls = b.calls[len(b.calls)-1], b.calls[:len(b.calls)-1] + // tell the submitter re-run it solo, continue with the rest of the batch + c.err <- trySolo + continue retry + } + + // pass success, or bolt internal errors, to all callers + for _, c := range b.calls { + if c.err != nil { + c.err <- err + } + } + break retry + } +} + +// trySolo is a special sentinel error value used for signaling that a +// transaction function should be re-run. It should never be seen by +// callers. +var trySolo = errors.New("batch function returned an error and should be re-run solo") + +type panicked struct { + reason interface{} +} + +func (p panicked) Error() string { + if err, ok := p.reason.(error); ok { + return err.Error() + } + return fmt.Sprintf("panic: %v", p.reason) +} + +func safelyCall(fn func(*Tx) error, tx *Tx) (err error) { + defer func() { + if p := recover(); p != nil { + err = panicked{p} + } + }() + return fn(tx) +} + +// Sync executes fdatasync() against the database file handle. +// +// This is not necessary under normal operation, however, if you use NoSync +// then it allows you to force the database file to sync against the disk. +func (db *DB) Sync() error { return fdatasync(db) } + +// Stats retrieves ongoing performance stats for the database. +// This is only updated when a transaction closes. +func (db *DB) Stats() Stats { + db.statlock.RLock() + defer db.statlock.RUnlock() + return db.stats +} + +// This is for internal access to the raw data bytes from the C cursor, use +// carefully, or not at all. +func (db *DB) Info() *Info { + return &Info{uintptr(unsafe.Pointer(&db.data[0])), db.pageSize} +} + +// page retrieves a page reference from the mmap based on the current page size. +func (db *DB) page(id pgid) *page { + pos := id * pgid(db.pageSize) + return (*page)(unsafe.Pointer(&db.data[pos])) +} + +// pageInBuffer retrieves a page reference from a given byte array based on the current page size. +func (db *DB) pageInBuffer(b []byte, id pgid) *page { + return (*page)(unsafe.Pointer(&b[id*pgid(db.pageSize)])) +} + +// meta retrieves the current meta page reference. +func (db *DB) meta() *meta { + // We have to return the meta with the highest txid which doesn't fail + // validation. Otherwise, we can cause errors when in fact the database is + // in a consistent state. metaA is the one with the higher txid. + metaA := db.meta0 + metaB := db.meta1 + if db.meta1.txid > db.meta0.txid { + metaA = db.meta1 + metaB = db.meta0 + } + + // Use higher meta page if valid. Otherwise fallback to previous, if valid. + if err := metaA.validate(); err == nil { + return metaA + } else if err := metaB.validate(); err == nil { + return metaB + } + + // This should never be reached, because both meta1 and meta0 were validated + // on mmap() and we do fsync() on every write. + panic("bolt.DB.meta(): invalid meta pages") +} + +// allocate returns a contiguous block of memory starting at a given page. +func (db *DB) allocate(count int) (*page, error) { + // Allocate a temporary buffer for the page. + var buf []byte + if count == 1 { + buf = db.pagePool.Get().([]byte) + } else { + buf = make([]byte, count*db.pageSize) + } + p := (*page)(unsafe.Pointer(&buf[0])) + p.overflow = uint32(count - 1) + + // Use pages from the freelist if they are available. + if p.id = db.freelist.allocate(count); p.id != 0 { + return p, nil + } + + // Resize mmap() if we're at the end. + p.id = db.rwtx.meta.pgid + var minsz = int((p.id+pgid(count))+1) * db.pageSize + if minsz >= db.datasz { + if err := db.mmap(minsz); err != nil { + return nil, fmt.Errorf("mmap allocate error: %s", err) + } + } + + // Move the page id high water mark. + db.rwtx.meta.pgid += pgid(count) + + return p, nil +} + +// grow grows the size of the database to the given sz. +func (db *DB) grow(sz int) error { + // Ignore if the new size is less than available file size. + if sz <= db.filesz { + return nil + } + + // If the data is smaller than the alloc size then only allocate what's needed. + // Once it goes over the allocation size then allocate in chunks. + if db.datasz < db.AllocSize { + sz = db.datasz + } else { + sz += db.AllocSize + } + + // Truncate and fsync to ensure file size metadata is flushed. + // https://github.com/boltdb/bolt/issues/284 + if !db.NoGrowSync && !db.readOnly { + if runtime.GOOS != "windows" { + if err := db.file.Truncate(int64(sz)); err != nil { + return fmt.Errorf("file resize error: %s", err) + } + } + if err := db.file.Sync(); err != nil { + return fmt.Errorf("file sync error: %s", err) + } + } + + db.filesz = sz + return nil +} + +func (db *DB) IsReadOnly() bool { + return db.readOnly +} + +// Options represents the options that can be set when opening a database. +type Options struct { + // Timeout is the amount of time to wait to obtain a file lock. + // When set to zero it will wait indefinitely. This option is only + // available on Darwin and Linux. + Timeout time.Duration + + // Sets the DB.NoGrowSync flag before memory mapping the file. + NoGrowSync bool + + // Open database in read-only mode. Uses flock(..., LOCK_SH |LOCK_NB) to + // grab a shared lock (UNIX). + ReadOnly bool + + // Sets the DB.MmapFlags flag before memory mapping the file. + MmapFlags int + + // InitialMmapSize is the initial mmap size of the database + // in bytes. Read transactions won't block write transaction + // if the InitialMmapSize is large enough to hold database mmap + // size. (See DB.Begin for more information) + // + // If <=0, the initial map size is 0. + // If initialMmapSize is smaller than the previous database size, + // it takes no effect. + InitialMmapSize int +} + +// DefaultOptions represent the options used if nil options are passed into Open(). +// No timeout is used which will cause Bolt to wait indefinitely for a lock. +var DefaultOptions = &Options{ + Timeout: 0, + NoGrowSync: false, +} + +// Stats represents statistics about the database. +type Stats struct { + // Freelist stats + FreePageN int // total number of free pages on the freelist + PendingPageN int // total number of pending pages on the freelist + FreeAlloc int // total bytes allocated in free pages + FreelistInuse int // total bytes used by the freelist + + // Transaction stats + TxN int // total number of started read transactions + OpenTxN int // number of currently open read transactions + + TxStats TxStats // global, ongoing stats. +} + +// Sub calculates and returns the difference between two sets of database stats. +// This is useful when obtaining stats at two different points and time and +// you need the performance counters that occurred within that time span. +func (s *Stats) Sub(other *Stats) Stats { + if other == nil { + return *s + } + var diff Stats + diff.FreePageN = s.FreePageN + diff.PendingPageN = s.PendingPageN + diff.FreeAlloc = s.FreeAlloc + diff.FreelistInuse = s.FreelistInuse + diff.TxN = s.TxN - other.TxN + diff.TxStats = s.TxStats.Sub(&other.TxStats) + return diff +} + +func (s *Stats) add(other *Stats) { + s.TxStats.add(&other.TxStats) +} + +type Info struct { + Data uintptr + PageSize int +} + +type meta struct { + magic uint32 + version uint32 + pageSize uint32 + flags uint32 + root bucket + freelist pgid + pgid pgid + txid txid + checksum uint64 +} + +// validate checks the marker bytes and version of the meta page to ensure it matches this binary. +func (m *meta) validate() error { + if m.magic != magic { + return ErrInvalid + } else if m.version != version { + return ErrVersionMismatch + } else if m.checksum != 0 && m.checksum != m.sum64() { + return ErrChecksum + } + return nil +} + +// copy copies one meta object to another. +func (m *meta) copy(dest *meta) { + *dest = *m +} + +// write writes the meta onto a page. +func (m *meta) write(p *page) { + if m.root.root >= m.pgid { + panic(fmt.Sprintf("root bucket pgid (%d) above high water mark (%d)", m.root.root, m.pgid)) + } else if m.freelist >= m.pgid { + panic(fmt.Sprintf("freelist pgid (%d) above high water mark (%d)", m.freelist, m.pgid)) + } + + // Page id is either going to be 0 or 1 which we can determine by the transaction ID. + p.id = pgid(m.txid % 2) + p.flags |= metaPageFlag + + // Calculate the checksum. + m.checksum = m.sum64() + + m.copy(p.meta()) +} + +// generates the checksum for the meta. +func (m *meta) sum64() uint64 { + var h = fnv.New64a() + _, _ = h.Write((*[unsafe.Offsetof(meta{}.checksum)]byte)(unsafe.Pointer(m))[:]) + return h.Sum64() +} + +// _assert will panic with a given formatted message if the given condition is false. +func _assert(condition bool, msg string, v ...interface{}) { + if !condition { + panic(fmt.Sprintf("assertion failed: "+msg, v...)) + } +} + +func warn(v ...interface{}) { fmt.Fprintln(os.Stderr, v...) } +func warnf(msg string, v ...interface{}) { fmt.Fprintf(os.Stderr, msg+"\n", v...) } + +func printstack() { + stack := strings.Join(strings.Split(string(debug.Stack()), "\n")[2:], "\n") + fmt.Fprintln(os.Stderr, stack) +} diff --git a/vendor/github.com/boltdb/bolt/doc.go b/vendor/github.com/boltdb/bolt/doc.go new file mode 100644 index 0000000000..cc937845db --- /dev/null +++ b/vendor/github.com/boltdb/bolt/doc.go @@ -0,0 +1,44 @@ +/* +Package bolt implements a low-level key/value store in pure Go. It supports +fully serializable transactions, ACID semantics, and lock-free MVCC with +multiple readers and a single writer. Bolt can be used for projects that +want a simple data store without the need to add large dependencies such as +Postgres or MySQL. + +Bolt is a single-level, zero-copy, B+tree data store. This means that Bolt is +optimized for fast read access and does not require recovery in the event of a +system crash. Transactions which have not finished committing will simply be +rolled back in the event of a crash. + +The design of Bolt is based on Howard Chu's LMDB database project. + +Bolt currently works on Windows, Mac OS X, and Linux. + + +Basics + +There are only a few types in Bolt: DB, Bucket, Tx, and Cursor. The DB is +a collection of buckets and is represented by a single file on disk. A bucket is +a collection of unique keys that are associated with values. + +Transactions provide either read-only or read-write access to the database. +Read-only transactions can retrieve key/value pairs and can use Cursors to +iterate over the dataset sequentially. Read-write transactions can create and +delete buckets and can insert and remove keys. Only one read-write transaction +is allowed at a time. + + +Caveats + +The database uses a read-only, memory-mapped data file to ensure that +applications cannot corrupt the database, however, this means that keys and +values returned from Bolt cannot be changed. Writing to a read-only byte slice +will cause Go to panic. + +Keys and values retrieved from the database are only valid for the life of +the transaction. When used outside the transaction, these byte slices can +point to different data or can point to invalid memory which will cause a panic. + + +*/ +package bolt diff --git a/vendor/github.com/boltdb/bolt/errors.go b/vendor/github.com/boltdb/bolt/errors.go new file mode 100644 index 0000000000..a3620a3ebb --- /dev/null +++ b/vendor/github.com/boltdb/bolt/errors.go @@ -0,0 +1,71 @@ +package bolt + +import "errors" + +// These errors can be returned when opening or calling methods on a DB. +var ( + // ErrDatabaseNotOpen is returned when a DB instance is accessed before it + // is opened or after it is closed. + ErrDatabaseNotOpen = errors.New("database not open") + + // ErrDatabaseOpen is returned when opening a database that is + // already open. + ErrDatabaseOpen = errors.New("database already open") + + // ErrInvalid is returned when both meta pages on a database are invalid. + // This typically occurs when a file is not a bolt database. + ErrInvalid = errors.New("invalid database") + + // ErrVersionMismatch is returned when the data file was created with a + // different version of Bolt. + ErrVersionMismatch = errors.New("version mismatch") + + // ErrChecksum is returned when either meta page checksum does not match. + ErrChecksum = errors.New("checksum error") + + // ErrTimeout is returned when a database cannot obtain an exclusive lock + // on the data file after the timeout passed to Open(). + ErrTimeout = errors.New("timeout") +) + +// These errors can occur when beginning or committing a Tx. +var ( + // ErrTxNotWritable is returned when performing a write operation on a + // read-only transaction. + ErrTxNotWritable = errors.New("tx not writable") + + // ErrTxClosed is returned when committing or rolling back a transaction + // that has already been committed or rolled back. + ErrTxClosed = errors.New("tx closed") + + // ErrDatabaseReadOnly is returned when a mutating transaction is started on a + // read-only database. + ErrDatabaseReadOnly = errors.New("database is in read-only mode") +) + +// These errors can occur when putting or deleting a value or a bucket. +var ( + // ErrBucketNotFound is returned when trying to access a bucket that has + // not been created yet. + ErrBucketNotFound = errors.New("bucket not found") + + // ErrBucketExists is returned when creating a bucket that already exists. + ErrBucketExists = errors.New("bucket already exists") + + // ErrBucketNameRequired is returned when creating a bucket with a blank name. + ErrBucketNameRequired = errors.New("bucket name required") + + // ErrKeyRequired is returned when inserting a zero-length key. + ErrKeyRequired = errors.New("key required") + + // ErrKeyTooLarge is returned when inserting a key that is larger than MaxKeySize. + ErrKeyTooLarge = errors.New("key too large") + + // ErrValueTooLarge is returned when inserting a value that is larger than MaxValueSize. + ErrValueTooLarge = errors.New("value too large") + + // ErrIncompatibleValue is returned when trying create or delete a bucket + // on an existing non-bucket key or when trying to create or delete a + // non-bucket key on an existing bucket key. + ErrIncompatibleValue = errors.New("incompatible value") +) diff --git a/vendor/github.com/boltdb/bolt/freelist.go b/vendor/github.com/boltdb/bolt/freelist.go new file mode 100644 index 0000000000..aba48f58c6 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/freelist.go @@ -0,0 +1,252 @@ +package bolt + +import ( + "fmt" + "sort" + "unsafe" +) + +// freelist represents a list of all pages that are available for allocation. +// It also tracks pages that have been freed but are still in use by open transactions. +type freelist struct { + ids []pgid // all free and available free page ids. + pending map[txid][]pgid // mapping of soon-to-be free page ids by tx. + cache map[pgid]bool // fast lookup of all free and pending page ids. +} + +// newFreelist returns an empty, initialized freelist. +func newFreelist() *freelist { + return &freelist{ + pending: make(map[txid][]pgid), + cache: make(map[pgid]bool), + } +} + +// size returns the size of the page after serialization. +func (f *freelist) size() int { + n := f.count() + if n >= 0xFFFF { + // The first element will be used to store the count. See freelist.write. + n++ + } + return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * n) +} + +// count returns count of pages on the freelist +func (f *freelist) count() int { + return f.free_count() + f.pending_count() +} + +// free_count returns count of free pages +func (f *freelist) free_count() int { + return len(f.ids) +} + +// pending_count returns count of pending pages +func (f *freelist) pending_count() int { + var count int + for _, list := range f.pending { + count += len(list) + } + return count +} + +// copyall copies into dst a list of all free ids and all pending ids in one sorted list. +// f.count returns the minimum length required for dst. +func (f *freelist) copyall(dst []pgid) { + m := make(pgids, 0, f.pending_count()) + for _, list := range f.pending { + m = append(m, list...) + } + sort.Sort(m) + mergepgids(dst, f.ids, m) +} + +// allocate returns the starting page id of a contiguous list of pages of a given size. +// If a contiguous block cannot be found then 0 is returned. +func (f *freelist) allocate(n int) pgid { + if len(f.ids) == 0 { + return 0 + } + + var initial, previd pgid + for i, id := range f.ids { + if id <= 1 { + panic(fmt.Sprintf("invalid page allocation: %d", id)) + } + + // Reset initial page if this is not contiguous. + if previd == 0 || id-previd != 1 { + initial = id + } + + // If we found a contiguous block then remove it and return it. + if (id-initial)+1 == pgid(n) { + // If we're allocating off the beginning then take the fast path + // and just adjust the existing slice. This will use extra memory + // temporarily but the append() in free() will realloc the slice + // as is necessary. + if (i + 1) == n { + f.ids = f.ids[i+1:] + } else { + copy(f.ids[i-n+1:], f.ids[i+1:]) + f.ids = f.ids[:len(f.ids)-n] + } + + // Remove from the free cache. + for i := pgid(0); i < pgid(n); i++ { + delete(f.cache, initial+i) + } + + return initial + } + + previd = id + } + return 0 +} + +// free releases a page and its overflow for a given transaction id. +// If the page is already free then a panic will occur. +func (f *freelist) free(txid txid, p *page) { + if p.id <= 1 { + panic(fmt.Sprintf("cannot free page 0 or 1: %d", p.id)) + } + + // Free page and all its overflow pages. + var ids = f.pending[txid] + for id := p.id; id <= p.id+pgid(p.overflow); id++ { + // Verify that page is not already free. + if f.cache[id] { + panic(fmt.Sprintf("page %d already freed", id)) + } + + // Add to the freelist and cache. + ids = append(ids, id) + f.cache[id] = true + } + f.pending[txid] = ids +} + +// release moves all page ids for a transaction id (or older) to the freelist. +func (f *freelist) release(txid txid) { + m := make(pgids, 0) + for tid, ids := range f.pending { + if tid <= txid { + // Move transaction's pending pages to the available freelist. + // Don't remove from the cache since the page is still free. + m = append(m, ids...) + delete(f.pending, tid) + } + } + sort.Sort(m) + f.ids = pgids(f.ids).merge(m) +} + +// rollback removes the pages from a given pending tx. +func (f *freelist) rollback(txid txid) { + // Remove page ids from cache. + for _, id := range f.pending[txid] { + delete(f.cache, id) + } + + // Remove pages from pending list. + delete(f.pending, txid) +} + +// freed returns whether a given page is in the free list. +func (f *freelist) freed(pgid pgid) bool { + return f.cache[pgid] +} + +// read initializes the freelist from a freelist page. +func (f *freelist) read(p *page) { + // If the page.count is at the max uint16 value (64k) then it's considered + // an overflow and the size of the freelist is stored as the first element. + idx, count := 0, int(p.count) + if count == 0xFFFF { + idx = 1 + count = int(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0]) + } + + // Copy the list of page ids from the freelist. + if count == 0 { + f.ids = nil + } else { + ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx:count] + f.ids = make([]pgid, len(ids)) + copy(f.ids, ids) + + // Make sure they're sorted. + sort.Sort(pgids(f.ids)) + } + + // Rebuild the page cache. + f.reindex() +} + +// write writes the page ids onto a freelist page. All free and pending ids are +// saved to disk since in the event of a program crash, all pending ids will +// become free. +func (f *freelist) write(p *page) error { + // Combine the old free pgids and pgids waiting on an open transaction. + + // Update the header flag. + p.flags |= freelistPageFlag + + // The page.count can only hold up to 64k elements so if we overflow that + // number then we handle it by putting the size in the first element. + lenids := f.count() + if lenids == 0 { + p.count = uint16(lenids) + } else if lenids < 0xFFFF { + p.count = uint16(lenids) + f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:]) + } else { + p.count = 0xFFFF + ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0] = pgid(lenids) + f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[1:]) + } + + return nil +} + +// reload reads the freelist from a page and filters out pending items. +func (f *freelist) reload(p *page) { + f.read(p) + + // Build a cache of only pending pages. + pcache := make(map[pgid]bool) + for _, pendingIDs := range f.pending { + for _, pendingID := range pendingIDs { + pcache[pendingID] = true + } + } + + // Check each page in the freelist and build a new available freelist + // with any pages not in the pending lists. + var a []pgid + for _, id := range f.ids { + if !pcache[id] { + a = append(a, id) + } + } + f.ids = a + + // Once the available list is rebuilt then rebuild the free cache so that + // it includes the available and pending free pages. + f.reindex() +} + +// reindex rebuilds the free cache based on available and pending free lists. +func (f *freelist) reindex() { + f.cache = make(map[pgid]bool, len(f.ids)) + for _, id := range f.ids { + f.cache[id] = true + } + for _, pendingIDs := range f.pending { + for _, pendingID := range pendingIDs { + f.cache[pendingID] = true + } + } +} diff --git a/vendor/github.com/boltdb/bolt/node.go b/vendor/github.com/boltdb/bolt/node.go new file mode 100644 index 0000000000..159318b229 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/node.go @@ -0,0 +1,604 @@ +package bolt + +import ( + "bytes" + "fmt" + "sort" + "unsafe" +) + +// node represents an in-memory, deserialized page. +type node struct { + bucket *Bucket + isLeaf bool + unbalanced bool + spilled bool + key []byte + pgid pgid + parent *node + children nodes + inodes inodes +} + +// root returns the top-level node this node is attached to. +func (n *node) root() *node { + if n.parent == nil { + return n + } + return n.parent.root() +} + +// minKeys returns the minimum number of inodes this node should have. +func (n *node) minKeys() int { + if n.isLeaf { + return 1 + } + return 2 +} + +// size returns the size of the node after serialization. +func (n *node) size() int { + sz, elsz := pageHeaderSize, n.pageElementSize() + for i := 0; i < len(n.inodes); i++ { + item := &n.inodes[i] + sz += elsz + len(item.key) + len(item.value) + } + return sz +} + +// sizeLessThan returns true if the node is less than a given size. +// This is an optimization to avoid calculating a large node when we only need +// to know if it fits inside a certain page size. +func (n *node) sizeLessThan(v int) bool { + sz, elsz := pageHeaderSize, n.pageElementSize() + for i := 0; i < len(n.inodes); i++ { + item := &n.inodes[i] + sz += elsz + len(item.key) + len(item.value) + if sz >= v { + return false + } + } + return true +} + +// pageElementSize returns the size of each page element based on the type of node. +func (n *node) pageElementSize() int { + if n.isLeaf { + return leafPageElementSize + } + return branchPageElementSize +} + +// childAt returns the child node at a given index. +func (n *node) childAt(index int) *node { + if n.isLeaf { + panic(fmt.Sprintf("invalid childAt(%d) on a leaf node", index)) + } + return n.bucket.node(n.inodes[index].pgid, n) +} + +// childIndex returns the index of a given child node. +func (n *node) childIndex(child *node) int { + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, child.key) != -1 }) + return index +} + +// numChildren returns the number of children. +func (n *node) numChildren() int { + return len(n.inodes) +} + +// nextSibling returns the next node with the same parent. +func (n *node) nextSibling() *node { + if n.parent == nil { + return nil + } + index := n.parent.childIndex(n) + if index >= n.parent.numChildren()-1 { + return nil + } + return n.parent.childAt(index + 1) +} + +// prevSibling returns the previous node with the same parent. +func (n *node) prevSibling() *node { + if n.parent == nil { + return nil + } + index := n.parent.childIndex(n) + if index == 0 { + return nil + } + return n.parent.childAt(index - 1) +} + +// put inserts a key/value. +func (n *node) put(oldKey, newKey, value []byte, pgid pgid, flags uint32) { + if pgid >= n.bucket.tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", pgid, n.bucket.tx.meta.pgid)) + } else if len(oldKey) <= 0 { + panic("put: zero-length old key") + } else if len(newKey) <= 0 { + panic("put: zero-length new key") + } + + // Find insertion index. + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, oldKey) != -1 }) + + // Add capacity and shift nodes if we don't have an exact match and need to insert. + exact := (len(n.inodes) > 0 && index < len(n.inodes) && bytes.Equal(n.inodes[index].key, oldKey)) + if !exact { + n.inodes = append(n.inodes, inode{}) + copy(n.inodes[index+1:], n.inodes[index:]) + } + + inode := &n.inodes[index] + inode.flags = flags + inode.key = newKey + inode.value = value + inode.pgid = pgid + _assert(len(inode.key) > 0, "put: zero-length inode key") +} + +// del removes a key from the node. +func (n *node) del(key []byte) { + // Find index of key. + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, key) != -1 }) + + // Exit if the key isn't found. + if index >= len(n.inodes) || !bytes.Equal(n.inodes[index].key, key) { + return + } + + // Delete inode from the node. + n.inodes = append(n.inodes[:index], n.inodes[index+1:]...) + + // Mark the node as needing rebalancing. + n.unbalanced = true +} + +// read initializes the node from a page. +func (n *node) read(p *page) { + n.pgid = p.id + n.isLeaf = ((p.flags & leafPageFlag) != 0) + n.inodes = make(inodes, int(p.count)) + + for i := 0; i < int(p.count); i++ { + inode := &n.inodes[i] + if n.isLeaf { + elem := p.leafPageElement(uint16(i)) + inode.flags = elem.flags + inode.key = elem.key() + inode.value = elem.value() + } else { + elem := p.branchPageElement(uint16(i)) + inode.pgid = elem.pgid + inode.key = elem.key() + } + _assert(len(inode.key) > 0, "read: zero-length inode key") + } + + // Save first key so we can find the node in the parent when we spill. + if len(n.inodes) > 0 { + n.key = n.inodes[0].key + _assert(len(n.key) > 0, "read: zero-length node key") + } else { + n.key = nil + } +} + +// write writes the items onto one or more pages. +func (n *node) write(p *page) { + // Initialize page. + if n.isLeaf { + p.flags |= leafPageFlag + } else { + p.flags |= branchPageFlag + } + + if len(n.inodes) >= 0xFFFF { + panic(fmt.Sprintf("inode overflow: %d (pgid=%d)", len(n.inodes), p.id)) + } + p.count = uint16(len(n.inodes)) + + // Stop here if there are no items to write. + if p.count == 0 { + return + } + + // Loop over each item and write it to the page. + b := (*[maxAllocSize]byte)(unsafe.Pointer(&p.ptr))[n.pageElementSize()*len(n.inodes):] + for i, item := range n.inodes { + _assert(len(item.key) > 0, "write: zero-length inode key") + + // Write the page element. + if n.isLeaf { + elem := p.leafPageElement(uint16(i)) + elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))) + elem.flags = item.flags + elem.ksize = uint32(len(item.key)) + elem.vsize = uint32(len(item.value)) + } else { + elem := p.branchPageElement(uint16(i)) + elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))) + elem.ksize = uint32(len(item.key)) + elem.pgid = item.pgid + _assert(elem.pgid != p.id, "write: circular dependency occurred") + } + + // If the length of key+value is larger than the max allocation size + // then we need to reallocate the byte array pointer. + // + // See: https://github.com/boltdb/bolt/pull/335 + klen, vlen := len(item.key), len(item.value) + if len(b) < klen+vlen { + b = (*[maxAllocSize]byte)(unsafe.Pointer(&b[0]))[:] + } + + // Write data for the element to the end of the page. + copy(b[0:], item.key) + b = b[klen:] + copy(b[0:], item.value) + b = b[vlen:] + } + + // DEBUG ONLY: n.dump() +} + +// split breaks up a node into multiple smaller nodes, if appropriate. +// This should only be called from the spill() function. +func (n *node) split(pageSize int) []*node { + var nodes []*node + + node := n + for { + // Split node into two. + a, b := node.splitTwo(pageSize) + nodes = append(nodes, a) + + // If we can't split then exit the loop. + if b == nil { + break + } + + // Set node to b so it gets split on the next iteration. + node = b + } + + return nodes +} + +// splitTwo breaks up a node into two smaller nodes, if appropriate. +// This should only be called from the split() function. +func (n *node) splitTwo(pageSize int) (*node, *node) { + // Ignore the split if the page doesn't have at least enough nodes for + // two pages or if the nodes can fit in a single page. + if len(n.inodes) <= (minKeysPerPage*2) || n.sizeLessThan(pageSize) { + return n, nil + } + + // Determine the threshold before starting a new node. + var fillPercent = n.bucket.FillPercent + if fillPercent < minFillPercent { + fillPercent = minFillPercent + } else if fillPercent > maxFillPercent { + fillPercent = maxFillPercent + } + threshold := int(float64(pageSize) * fillPercent) + + // Determine split position and sizes of the two pages. + splitIndex, _ := n.splitIndex(threshold) + + // Split node into two separate nodes. + // If there's no parent then we'll need to create one. + if n.parent == nil { + n.parent = &node{bucket: n.bucket, children: []*node{n}} + } + + // Create a new node and add it to the parent. + next := &node{bucket: n.bucket, isLeaf: n.isLeaf, parent: n.parent} + n.parent.children = append(n.parent.children, next) + + // Split inodes across two nodes. + next.inodes = n.inodes[splitIndex:] + n.inodes = n.inodes[:splitIndex] + + // Update the statistics. + n.bucket.tx.stats.Split++ + + return n, next +} + +// splitIndex finds the position where a page will fill a given threshold. +// It returns the index as well as the size of the first page. +// This is only be called from split(). +func (n *node) splitIndex(threshold int) (index, sz int) { + sz = pageHeaderSize + + // Loop until we only have the minimum number of keys required for the second page. + for i := 0; i < len(n.inodes)-minKeysPerPage; i++ { + index = i + inode := n.inodes[i] + elsize := n.pageElementSize() + len(inode.key) + len(inode.value) + + // If we have at least the minimum number of keys and adding another + // node would put us over the threshold then exit and return. + if i >= minKeysPerPage && sz+elsize > threshold { + break + } + + // Add the element size to the total size. + sz += elsize + } + + return +} + +// spill writes the nodes to dirty pages and splits nodes as it goes. +// Returns an error if dirty pages cannot be allocated. +func (n *node) spill() error { + var tx = n.bucket.tx + if n.spilled { + return nil + } + + // Spill child nodes first. Child nodes can materialize sibling nodes in + // the case of split-merge so we cannot use a range loop. We have to check + // the children size on every loop iteration. + sort.Sort(n.children) + for i := 0; i < len(n.children); i++ { + if err := n.children[i].spill(); err != nil { + return err + } + } + + // We no longer need the child list because it's only used for spill tracking. + n.children = nil + + // Split nodes into appropriate sizes. The first node will always be n. + var nodes = n.split(tx.db.pageSize) + for _, node := range nodes { + // Add node's page to the freelist if it's not new. + if node.pgid > 0 { + tx.db.freelist.free(tx.meta.txid, tx.page(node.pgid)) + node.pgid = 0 + } + + // Allocate contiguous space for the node. + p, err := tx.allocate((node.size() / tx.db.pageSize) + 1) + if err != nil { + return err + } + + // Write the node. + if p.id >= tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", p.id, tx.meta.pgid)) + } + node.pgid = p.id + node.write(p) + node.spilled = true + + // Insert into parent inodes. + if node.parent != nil { + var key = node.key + if key == nil { + key = node.inodes[0].key + } + + node.parent.put(key, node.inodes[0].key, nil, node.pgid, 0) + node.key = node.inodes[0].key + _assert(len(node.key) > 0, "spill: zero-length node key") + } + + // Update the statistics. + tx.stats.Spill++ + } + + // If the root node split and created a new root then we need to spill that + // as well. We'll clear out the children to make sure it doesn't try to respill. + if n.parent != nil && n.parent.pgid == 0 { + n.children = nil + return n.parent.spill() + } + + return nil +} + +// rebalance attempts to combine the node with sibling nodes if the node fill +// size is below a threshold or if there are not enough keys. +func (n *node) rebalance() { + if !n.unbalanced { + return + } + n.unbalanced = false + + // Update statistics. + n.bucket.tx.stats.Rebalance++ + + // Ignore if node is above threshold (25%) and has enough keys. + var threshold = n.bucket.tx.db.pageSize / 4 + if n.size() > threshold && len(n.inodes) > n.minKeys() { + return + } + + // Root node has special handling. + if n.parent == nil { + // If root node is a branch and only has one node then collapse it. + if !n.isLeaf && len(n.inodes) == 1 { + // Move root's child up. + child := n.bucket.node(n.inodes[0].pgid, n) + n.isLeaf = child.isLeaf + n.inodes = child.inodes[:] + n.children = child.children + + // Reparent all child nodes being moved. + for _, inode := range n.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent = n + } + } + + // Remove old child. + child.parent = nil + delete(n.bucket.nodes, child.pgid) + child.free() + } + + return + } + + // If node has no keys then just remove it. + if n.numChildren() == 0 { + n.parent.del(n.key) + n.parent.removeChild(n) + delete(n.bucket.nodes, n.pgid) + n.free() + n.parent.rebalance() + return + } + + _assert(n.parent.numChildren() > 1, "parent must have at least 2 children") + + // Destination node is right sibling if idx == 0, otherwise left sibling. + var target *node + var useNextSibling = (n.parent.childIndex(n) == 0) + if useNextSibling { + target = n.nextSibling() + } else { + target = n.prevSibling() + } + + // If both this node and the target node are too small then merge them. + if useNextSibling { + // Reparent all child nodes being moved. + for _, inode := range target.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent.removeChild(child) + child.parent = n + child.parent.children = append(child.parent.children, child) + } + } + + // Copy over inodes from target and remove target. + n.inodes = append(n.inodes, target.inodes...) + n.parent.del(target.key) + n.parent.removeChild(target) + delete(n.bucket.nodes, target.pgid) + target.free() + } else { + // Reparent all child nodes being moved. + for _, inode := range n.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent.removeChild(child) + child.parent = target + child.parent.children = append(child.parent.children, child) + } + } + + // Copy over inodes to target and remove node. + target.inodes = append(target.inodes, n.inodes...) + n.parent.del(n.key) + n.parent.removeChild(n) + delete(n.bucket.nodes, n.pgid) + n.free() + } + + // Either this node or the target node was deleted from the parent so rebalance it. + n.parent.rebalance() +} + +// removes a node from the list of in-memory children. +// This does not affect the inodes. +func (n *node) removeChild(target *node) { + for i, child := range n.children { + if child == target { + n.children = append(n.children[:i], n.children[i+1:]...) + return + } + } +} + +// dereference causes the node to copy all its inode key/value references to heap memory. +// This is required when the mmap is reallocated so inodes are not pointing to stale data. +func (n *node) dereference() { + if n.key != nil { + key := make([]byte, len(n.key)) + copy(key, n.key) + n.key = key + _assert(n.pgid == 0 || len(n.key) > 0, "dereference: zero-length node key on existing node") + } + + for i := range n.inodes { + inode := &n.inodes[i] + + key := make([]byte, len(inode.key)) + copy(key, inode.key) + inode.key = key + _assert(len(inode.key) > 0, "dereference: zero-length inode key") + + value := make([]byte, len(inode.value)) + copy(value, inode.value) + inode.value = value + } + + // Recursively dereference children. + for _, child := range n.children { + child.dereference() + } + + // Update statistics. + n.bucket.tx.stats.NodeDeref++ +} + +// free adds the node's underlying page to the freelist. +func (n *node) free() { + if n.pgid != 0 { + n.bucket.tx.db.freelist.free(n.bucket.tx.meta.txid, n.bucket.tx.page(n.pgid)) + n.pgid = 0 + } +} + +// dump writes the contents of the node to STDERR for debugging purposes. +/* +func (n *node) dump() { + // Write node header. + var typ = "branch" + if n.isLeaf { + typ = "leaf" + } + warnf("[NODE %d {type=%s count=%d}]", n.pgid, typ, len(n.inodes)) + + // Write out abbreviated version of each item. + for _, item := range n.inodes { + if n.isLeaf { + if item.flags&bucketLeafFlag != 0 { + bucket := (*bucket)(unsafe.Pointer(&item.value[0])) + warnf("+L %08x -> (bucket root=%d)", trunc(item.key, 4), bucket.root) + } else { + warnf("+L %08x -> %08x", trunc(item.key, 4), trunc(item.value, 4)) + } + } else { + warnf("+B %08x -> pgid=%d", trunc(item.key, 4), item.pgid) + } + } + warn("") +} +*/ + +type nodes []*node + +func (s nodes) Len() int { return len(s) } +func (s nodes) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s nodes) Less(i, j int) bool { return bytes.Compare(s[i].inodes[0].key, s[j].inodes[0].key) == -1 } + +// inode represents an internal node inside of a node. +// It can be used to point to elements in a page or point +// to an element which hasn't been added to a page yet. +type inode struct { + flags uint32 + pgid pgid + key []byte + value []byte +} + +type inodes []inode diff --git a/vendor/github.com/boltdb/bolt/page.go b/vendor/github.com/boltdb/bolt/page.go new file mode 100644 index 0000000000..cde403ae86 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/page.go @@ -0,0 +1,197 @@ +package bolt + +import ( + "fmt" + "os" + "sort" + "unsafe" +) + +const pageHeaderSize = int(unsafe.Offsetof(((*page)(nil)).ptr)) + +const minKeysPerPage = 2 + +const branchPageElementSize = int(unsafe.Sizeof(branchPageElement{})) +const leafPageElementSize = int(unsafe.Sizeof(leafPageElement{})) + +const ( + branchPageFlag = 0x01 + leafPageFlag = 0x02 + metaPageFlag = 0x04 + freelistPageFlag = 0x10 +) + +const ( + bucketLeafFlag = 0x01 +) + +type pgid uint64 + +type page struct { + id pgid + flags uint16 + count uint16 + overflow uint32 + ptr uintptr +} + +// typ returns a human readable page type string used for debugging. +func (p *page) typ() string { + if (p.flags & branchPageFlag) != 0 { + return "branch" + } else if (p.flags & leafPageFlag) != 0 { + return "leaf" + } else if (p.flags & metaPageFlag) != 0 { + return "meta" + } else if (p.flags & freelistPageFlag) != 0 { + return "freelist" + } + return fmt.Sprintf("unknown<%02x>", p.flags) +} + +// meta returns a pointer to the metadata section of the page. +func (p *page) meta() *meta { + return (*meta)(unsafe.Pointer(&p.ptr)) +} + +// leafPageElement retrieves the leaf node by index +func (p *page) leafPageElement(index uint16) *leafPageElement { + n := &((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[index] + return n +} + +// leafPageElements retrieves a list of leaf nodes. +func (p *page) leafPageElements() []leafPageElement { + if p.count == 0 { + return nil + } + return ((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[:] +} + +// branchPageElement retrieves the branch node by index +func (p *page) branchPageElement(index uint16) *branchPageElement { + return &((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[index] +} + +// branchPageElements retrieves a list of branch nodes. +func (p *page) branchPageElements() []branchPageElement { + if p.count == 0 { + return nil + } + return ((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[:] +} + +// dump writes n bytes of the page to STDERR as hex output. +func (p *page) hexdump(n int) { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:n] + fmt.Fprintf(os.Stderr, "%x\n", buf) +} + +type pages []*page + +func (s pages) Len() int { return len(s) } +func (s pages) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s pages) Less(i, j int) bool { return s[i].id < s[j].id } + +// branchPageElement represents a node on a branch page. +type branchPageElement struct { + pos uint32 + ksize uint32 + pgid pgid +} + +// key returns a byte slice of the node key. +func (n *branchPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize] +} + +// leafPageElement represents a node on a leaf page. +type leafPageElement struct { + flags uint32 + pos uint32 + ksize uint32 + vsize uint32 +} + +// key returns a byte slice of the node key. +func (n *leafPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize:n.ksize] +} + +// value returns a byte slice of the node value. +func (n *leafPageElement) value() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos+n.ksize]))[:n.vsize:n.vsize] +} + +// PageInfo represents human readable information about a page. +type PageInfo struct { + ID int + Type string + Count int + OverflowCount int +} + +type pgids []pgid + +func (s pgids) Len() int { return len(s) } +func (s pgids) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s pgids) Less(i, j int) bool { return s[i] < s[j] } + +// merge returns the sorted union of a and b. +func (a pgids) merge(b pgids) pgids { + // Return the opposite slice if one is nil. + if len(a) == 0 { + return b + } + if len(b) == 0 { + return a + } + merged := make(pgids, len(a)+len(b)) + mergepgids(merged, a, b) + return merged +} + +// mergepgids copies the sorted union of a and b into dst. +// If dst is too small, it panics. +func mergepgids(dst, a, b pgids) { + if len(dst) < len(a)+len(b) { + panic(fmt.Errorf("mergepgids bad len %d < %d + %d", len(dst), len(a), len(b))) + } + // Copy in the opposite slice if one is nil. + if len(a) == 0 { + copy(dst, b) + return + } + if len(b) == 0 { + copy(dst, a) + return + } + + // Merged will hold all elements from both lists. + merged := dst[:0] + + // Assign lead to the slice with a lower starting value, follow to the higher value. + lead, follow := a, b + if b[0] < a[0] { + lead, follow = b, a + } + + // Continue while there are elements in the lead. + for len(lead) > 0 { + // Merge largest prefix of lead that is ahead of follow[0]. + n := sort.Search(len(lead), func(i int) bool { return lead[i] > follow[0] }) + merged = append(merged, lead[:n]...) + if n >= len(lead) { + break + } + + // Swap lead and follow. + lead, follow = follow, lead[n:] + } + + // Append what's left in follow. + _ = append(merged, follow...) +} diff --git a/vendor/github.com/boltdb/bolt/tx.go b/vendor/github.com/boltdb/bolt/tx.go new file mode 100644 index 0000000000..6700308a29 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/tx.go @@ -0,0 +1,684 @@ +package bolt + +import ( + "fmt" + "io" + "os" + "sort" + "strings" + "time" + "unsafe" +) + +// txid represents the internal transaction identifier. +type txid uint64 + +// Tx represents a read-only or read/write transaction on the database. +// Read-only transactions can be used for retrieving values for keys and creating cursors. +// Read/write transactions can create and remove buckets and create and remove keys. +// +// IMPORTANT: You must commit or rollback transactions when you are done with +// them. Pages can not be reclaimed by the writer until no more transactions +// are using them. A long running read transaction can cause the database to +// quickly grow. +type Tx struct { + writable bool + managed bool + db *DB + meta *meta + root Bucket + pages map[pgid]*page + stats TxStats + commitHandlers []func() + + // WriteFlag specifies the flag for write-related methods like WriteTo(). + // Tx opens the database file with the specified flag to copy the data. + // + // By default, the flag is unset, which works well for mostly in-memory + // workloads. For databases that are much larger than available RAM, + // set the flag to syscall.O_DIRECT to avoid trashing the page cache. + WriteFlag int +} + +// init initializes the transaction. +func (tx *Tx) init(db *DB) { + tx.db = db + tx.pages = nil + + // Copy the meta page since it can be changed by the writer. + tx.meta = &meta{} + db.meta().copy(tx.meta) + + // Copy over the root bucket. + tx.root = newBucket(tx) + tx.root.bucket = &bucket{} + *tx.root.bucket = tx.meta.root + + // Increment the transaction id and add a page cache for writable transactions. + if tx.writable { + tx.pages = make(map[pgid]*page) + tx.meta.txid += txid(1) + } +} + +// ID returns the transaction id. +func (tx *Tx) ID() int { + return int(tx.meta.txid) +} + +// DB returns a reference to the database that created the transaction. +func (tx *Tx) DB() *DB { + return tx.db +} + +// Size returns current database size in bytes as seen by this transaction. +func (tx *Tx) Size() int64 { + return int64(tx.meta.pgid) * int64(tx.db.pageSize) +} + +// Writable returns whether the transaction can perform write operations. +func (tx *Tx) Writable() bool { + return tx.writable +} + +// Cursor creates a cursor associated with the root bucket. +// All items in the cursor will return a nil value because all root bucket keys point to buckets. +// The cursor is only valid as long as the transaction is open. +// Do not use a cursor after the transaction is closed. +func (tx *Tx) Cursor() *Cursor { + return tx.root.Cursor() +} + +// Stats retrieves a copy of the current transaction statistics. +func (tx *Tx) Stats() TxStats { + return tx.stats +} + +// Bucket retrieves a bucket by name. +// Returns nil if the bucket does not exist. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) Bucket(name []byte) *Bucket { + return tx.root.Bucket(name) +} + +// CreateBucket creates a new bucket. +// Returns an error if the bucket already exists, if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) CreateBucket(name []byte) (*Bucket, error) { + return tx.root.CreateBucket(name) +} + +// CreateBucketIfNotExists creates a new bucket if it doesn't already exist. +// Returns an error if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) CreateBucketIfNotExists(name []byte) (*Bucket, error) { + return tx.root.CreateBucketIfNotExists(name) +} + +// DeleteBucket deletes a bucket. +// Returns an error if the bucket cannot be found or if the key represents a non-bucket value. +func (tx *Tx) DeleteBucket(name []byte) error { + return tx.root.DeleteBucket(name) +} + +// ForEach executes a function for each bucket in the root. +// If the provided function returns an error then the iteration is stopped and +// the error is returned to the caller. +func (tx *Tx) ForEach(fn func(name []byte, b *Bucket) error) error { + return tx.root.ForEach(func(k, v []byte) error { + if err := fn(k, tx.root.Bucket(k)); err != nil { + return err + } + return nil + }) +} + +// OnCommit adds a handler function to be executed after the transaction successfully commits. +func (tx *Tx) OnCommit(fn func()) { + tx.commitHandlers = append(tx.commitHandlers, fn) +} + +// Commit writes all changes to disk and updates the meta page. +// Returns an error if a disk write error occurs, or if Commit is +// called on a read-only transaction. +func (tx *Tx) Commit() error { + _assert(!tx.managed, "managed tx commit not allowed") + if tx.db == nil { + return ErrTxClosed + } else if !tx.writable { + return ErrTxNotWritable + } + + // TODO(benbjohnson): Use vectorized I/O to write out dirty pages. + + // Rebalance nodes which have had deletions. + var startTime = time.Now() + tx.root.rebalance() + if tx.stats.Rebalance > 0 { + tx.stats.RebalanceTime += time.Since(startTime) + } + + // spill data onto dirty pages. + startTime = time.Now() + if err := tx.root.spill(); err != nil { + tx.rollback() + return err + } + tx.stats.SpillTime += time.Since(startTime) + + // Free the old root bucket. + tx.meta.root.root = tx.root.root + + opgid := tx.meta.pgid + + // Free the freelist and allocate new pages for it. This will overestimate + // the size of the freelist but not underestimate the size (which would be bad). + tx.db.freelist.free(tx.meta.txid, tx.db.page(tx.meta.freelist)) + p, err := tx.allocate((tx.db.freelist.size() / tx.db.pageSize) + 1) + if err != nil { + tx.rollback() + return err + } + if err := tx.db.freelist.write(p); err != nil { + tx.rollback() + return err + } + tx.meta.freelist = p.id + + // If the high water mark has moved up then attempt to grow the database. + if tx.meta.pgid > opgid { + if err := tx.db.grow(int(tx.meta.pgid+1) * tx.db.pageSize); err != nil { + tx.rollback() + return err + } + } + + // Write dirty pages to disk. + startTime = time.Now() + if err := tx.write(); err != nil { + tx.rollback() + return err + } + + // If strict mode is enabled then perform a consistency check. + // Only the first consistency error is reported in the panic. + if tx.db.StrictMode { + ch := tx.Check() + var errs []string + for { + err, ok := <-ch + if !ok { + break + } + errs = append(errs, err.Error()) + } + if len(errs) > 0 { + panic("check fail: " + strings.Join(errs, "\n")) + } + } + + // Write meta to disk. + if err := tx.writeMeta(); err != nil { + tx.rollback() + return err + } + tx.stats.WriteTime += time.Since(startTime) + + // Finalize the transaction. + tx.close() + + // Execute commit handlers now that the locks have been removed. + for _, fn := range tx.commitHandlers { + fn() + } + + return nil +} + +// Rollback closes the transaction and ignores all previous updates. Read-only +// transactions must be rolled back and not committed. +func (tx *Tx) Rollback() error { + _assert(!tx.managed, "managed tx rollback not allowed") + if tx.db == nil { + return ErrTxClosed + } + tx.rollback() + return nil +} + +func (tx *Tx) rollback() { + if tx.db == nil { + return + } + if tx.writable { + tx.db.freelist.rollback(tx.meta.txid) + tx.db.freelist.reload(tx.db.page(tx.db.meta().freelist)) + } + tx.close() +} + +func (tx *Tx) close() { + if tx.db == nil { + return + } + if tx.writable { + // Grab freelist stats. + var freelistFreeN = tx.db.freelist.free_count() + var freelistPendingN = tx.db.freelist.pending_count() + var freelistAlloc = tx.db.freelist.size() + + // Remove transaction ref & writer lock. + tx.db.rwtx = nil + tx.db.rwlock.Unlock() + + // Merge statistics. + tx.db.statlock.Lock() + tx.db.stats.FreePageN = freelistFreeN + tx.db.stats.PendingPageN = freelistPendingN + tx.db.stats.FreeAlloc = (freelistFreeN + freelistPendingN) * tx.db.pageSize + tx.db.stats.FreelistInuse = freelistAlloc + tx.db.stats.TxStats.add(&tx.stats) + tx.db.statlock.Unlock() + } else { + tx.db.removeTx(tx) + } + + // Clear all references. + tx.db = nil + tx.meta = nil + tx.root = Bucket{tx: tx} + tx.pages = nil +} + +// Copy writes the entire database to a writer. +// This function exists for backwards compatibility. Use WriteTo() instead. +func (tx *Tx) Copy(w io.Writer) error { + _, err := tx.WriteTo(w) + return err +} + +// WriteTo writes the entire database to a writer. +// If err == nil then exactly tx.Size() bytes will be written into the writer. +func (tx *Tx) WriteTo(w io.Writer) (n int64, err error) { + // Attempt to open reader with WriteFlag + f, err := os.OpenFile(tx.db.path, os.O_RDONLY|tx.WriteFlag, 0) + if err != nil { + return 0, err + } + defer func() { _ = f.Close() }() + + // Generate a meta page. We use the same page data for both meta pages. + buf := make([]byte, tx.db.pageSize) + page := (*page)(unsafe.Pointer(&buf[0])) + page.flags = metaPageFlag + *page.meta() = *tx.meta + + // Write meta 0. + page.id = 0 + page.meta().checksum = page.meta().sum64() + nn, err := w.Write(buf) + n += int64(nn) + if err != nil { + return n, fmt.Errorf("meta 0 copy: %s", err) + } + + // Write meta 1 with a lower transaction id. + page.id = 1 + page.meta().txid -= 1 + page.meta().checksum = page.meta().sum64() + nn, err = w.Write(buf) + n += int64(nn) + if err != nil { + return n, fmt.Errorf("meta 1 copy: %s", err) + } + + // Move past the meta pages in the file. + if _, err := f.Seek(int64(tx.db.pageSize*2), os.SEEK_SET); err != nil { + return n, fmt.Errorf("seek: %s", err) + } + + // Copy data pages. + wn, err := io.CopyN(w, f, tx.Size()-int64(tx.db.pageSize*2)) + n += wn + if err != nil { + return n, err + } + + return n, f.Close() +} + +// CopyFile copies the entire database to file at the given path. +// A reader transaction is maintained during the copy so it is safe to continue +// using the database while a copy is in progress. +func (tx *Tx) CopyFile(path string, mode os.FileMode) error { + f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode) + if err != nil { + return err + } + + err = tx.Copy(f) + if err != nil { + _ = f.Close() + return err + } + return f.Close() +} + +// Check performs several consistency checks on the database for this transaction. +// An error is returned if any inconsistency is found. +// +// It can be safely run concurrently on a writable transaction. However, this +// incurs a high cost for large databases and databases with a lot of subbuckets +// because of caching. This overhead can be removed if running on a read-only +// transaction, however, it is not safe to execute other writer transactions at +// the same time. +func (tx *Tx) Check() <-chan error { + ch := make(chan error) + go tx.check(ch) + return ch +} + +func (tx *Tx) check(ch chan error) { + // Check if any pages are double freed. + freed := make(map[pgid]bool) + all := make([]pgid, tx.db.freelist.count()) + tx.db.freelist.copyall(all) + for _, id := range all { + if freed[id] { + ch <- fmt.Errorf("page %d: already freed", id) + } + freed[id] = true + } + + // Track every reachable page. + reachable := make(map[pgid]*page) + reachable[0] = tx.page(0) // meta0 + reachable[1] = tx.page(1) // meta1 + for i := uint32(0); i <= tx.page(tx.meta.freelist).overflow; i++ { + reachable[tx.meta.freelist+pgid(i)] = tx.page(tx.meta.freelist) + } + + // Recursively check buckets. + tx.checkBucket(&tx.root, reachable, freed, ch) + + // Ensure all pages below high water mark are either reachable or freed. + for i := pgid(0); i < tx.meta.pgid; i++ { + _, isReachable := reachable[i] + if !isReachable && !freed[i] { + ch <- fmt.Errorf("page %d: unreachable unfreed", int(i)) + } + } + + // Close the channel to signal completion. + close(ch) +} + +func (tx *Tx) checkBucket(b *Bucket, reachable map[pgid]*page, freed map[pgid]bool, ch chan error) { + // Ignore inline buckets. + if b.root == 0 { + return + } + + // Check every page used by this bucket. + b.tx.forEachPage(b.root, 0, func(p *page, _ int) { + if p.id > tx.meta.pgid { + ch <- fmt.Errorf("page %d: out of bounds: %d", int(p.id), int(b.tx.meta.pgid)) + } + + // Ensure each page is only referenced once. + for i := pgid(0); i <= pgid(p.overflow); i++ { + var id = p.id + i + if _, ok := reachable[id]; ok { + ch <- fmt.Errorf("page %d: multiple references", int(id)) + } + reachable[id] = p + } + + // We should only encounter un-freed leaf and branch pages. + if freed[p.id] { + ch <- fmt.Errorf("page %d: reachable freed", int(p.id)) + } else if (p.flags&branchPageFlag) == 0 && (p.flags&leafPageFlag) == 0 { + ch <- fmt.Errorf("page %d: invalid type: %s", int(p.id), p.typ()) + } + }) + + // Check each bucket within this bucket. + _ = b.ForEach(func(k, v []byte) error { + if child := b.Bucket(k); child != nil { + tx.checkBucket(child, reachable, freed, ch) + } + return nil + }) +} + +// allocate returns a contiguous block of memory starting at a given page. +func (tx *Tx) allocate(count int) (*page, error) { + p, err := tx.db.allocate(count) + if err != nil { + return nil, err + } + + // Save to our page cache. + tx.pages[p.id] = p + + // Update statistics. + tx.stats.PageCount++ + tx.stats.PageAlloc += count * tx.db.pageSize + + return p, nil +} + +// write writes any dirty pages to disk. +func (tx *Tx) write() error { + // Sort pages by id. + pages := make(pages, 0, len(tx.pages)) + for _, p := range tx.pages { + pages = append(pages, p) + } + // Clear out page cache early. + tx.pages = make(map[pgid]*page) + sort.Sort(pages) + + // Write pages to disk in order. + for _, p := range pages { + size := (int(p.overflow) + 1) * tx.db.pageSize + offset := int64(p.id) * int64(tx.db.pageSize) + + // Write out page in "max allocation" sized chunks. + ptr := (*[maxAllocSize]byte)(unsafe.Pointer(p)) + for { + // Limit our write to our max allocation size. + sz := size + if sz > maxAllocSize-1 { + sz = maxAllocSize - 1 + } + + // Write chunk to disk. + buf := ptr[:sz] + if _, err := tx.db.ops.writeAt(buf, offset); err != nil { + return err + } + + // Update statistics. + tx.stats.Write++ + + // Exit inner for loop if we've written all the chunks. + size -= sz + if size == 0 { + break + } + + // Otherwise move offset forward and move pointer to next chunk. + offset += int64(sz) + ptr = (*[maxAllocSize]byte)(unsafe.Pointer(&ptr[sz])) + } + } + + // Ignore file sync if flag is set on DB. + if !tx.db.NoSync || IgnoreNoSync { + if err := fdatasync(tx.db); err != nil { + return err + } + } + + // Put small pages back to page pool. + for _, p := range pages { + // Ignore page sizes over 1 page. + // These are allocated using make() instead of the page pool. + if int(p.overflow) != 0 { + continue + } + + buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:tx.db.pageSize] + + // See https://go.googlesource.com/go/+/f03c9202c43e0abb130669852082117ca50aa9b1 + for i := range buf { + buf[i] = 0 + } + tx.db.pagePool.Put(buf) + } + + return nil +} + +// writeMeta writes the meta to the disk. +func (tx *Tx) writeMeta() error { + // Create a temporary buffer for the meta page. + buf := make([]byte, tx.db.pageSize) + p := tx.db.pageInBuffer(buf, 0) + tx.meta.write(p) + + // Write the meta page to file. + if _, err := tx.db.ops.writeAt(buf, int64(p.id)*int64(tx.db.pageSize)); err != nil { + return err + } + if !tx.db.NoSync || IgnoreNoSync { + if err := fdatasync(tx.db); err != nil { + return err + } + } + + // Update statistics. + tx.stats.Write++ + + return nil +} + +// page returns a reference to the page with a given id. +// If page has been written to then a temporary buffered page is returned. +func (tx *Tx) page(id pgid) *page { + // Check the dirty pages first. + if tx.pages != nil { + if p, ok := tx.pages[id]; ok { + return p + } + } + + // Otherwise return directly from the mmap. + return tx.db.page(id) +} + +// forEachPage iterates over every page within a given page and executes a function. +func (tx *Tx) forEachPage(pgid pgid, depth int, fn func(*page, int)) { + p := tx.page(pgid) + + // Execute function. + fn(p, depth) + + // Recursively loop over children. + if (p.flags & branchPageFlag) != 0 { + for i := 0; i < int(p.count); i++ { + elem := p.branchPageElement(uint16(i)) + tx.forEachPage(elem.pgid, depth+1, fn) + } + } +} + +// Page returns page information for a given page number. +// This is only safe for concurrent use when used by a writable transaction. +func (tx *Tx) Page(id int) (*PageInfo, error) { + if tx.db == nil { + return nil, ErrTxClosed + } else if pgid(id) >= tx.meta.pgid { + return nil, nil + } + + // Build the page info. + p := tx.db.page(pgid(id)) + info := &PageInfo{ + ID: id, + Count: int(p.count), + OverflowCount: int(p.overflow), + } + + // Determine the type (or if it's free). + if tx.db.freelist.freed(pgid(id)) { + info.Type = "free" + } else { + info.Type = p.typ() + } + + return info, nil +} + +// TxStats represents statistics about the actions performed by the transaction. +type TxStats struct { + // Page statistics. + PageCount int // number of page allocations + PageAlloc int // total bytes allocated + + // Cursor statistics. + CursorCount int // number of cursors created + + // Node statistics + NodeCount int // number of node allocations + NodeDeref int // number of node dereferences + + // Rebalance statistics. + Rebalance int // number of node rebalances + RebalanceTime time.Duration // total time spent rebalancing + + // Split/Spill statistics. + Split int // number of nodes split + Spill int // number of nodes spilled + SpillTime time.Duration // total time spent spilling + + // Write statistics. + Write int // number of writes performed + WriteTime time.Duration // total time spent writing to disk +} + +func (s *TxStats) add(other *TxStats) { + s.PageCount += other.PageCount + s.PageAlloc += other.PageAlloc + s.CursorCount += other.CursorCount + s.NodeCount += other.NodeCount + s.NodeDeref += other.NodeDeref + s.Rebalance += other.Rebalance + s.RebalanceTime += other.RebalanceTime + s.Split += other.Split + s.Spill += other.Spill + s.SpillTime += other.SpillTime + s.Write += other.Write + s.WriteTime += other.WriteTime +} + +// Sub calculates and returns the difference between two sets of transaction stats. +// This is useful when obtaining stats at two different points and time and +// you need the performance counters that occurred within that time span. +func (s *TxStats) Sub(other *TxStats) TxStats { + var diff TxStats + diff.PageCount = s.PageCount - other.PageCount + diff.PageAlloc = s.PageAlloc - other.PageAlloc + diff.CursorCount = s.CursorCount - other.CursorCount + diff.NodeCount = s.NodeCount - other.NodeCount + diff.NodeDeref = s.NodeDeref - other.NodeDeref + diff.Rebalance = s.Rebalance - other.Rebalance + diff.RebalanceTime = s.RebalanceTime - other.RebalanceTime + diff.Split = s.Split - other.Split + diff.Spill = s.Spill - other.Spill + diff.SpillTime = s.SpillTime - other.SpillTime + diff.Write = s.Write - other.Write + diff.WriteTime = s.WriteTime - other.WriteTime + return diff +} diff --git a/vendor/github.com/cenkalti/backoff/.gitignore b/vendor/github.com/cenkalti/backoff/.gitignore new file mode 100644 index 0000000000..00268614f0 --- /dev/null +++ b/vendor/github.com/cenkalti/backoff/.gitignore @@ -0,0 +1,22 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe diff --git a/vendor/github.com/cenkalti/backoff/.travis.yml b/vendor/github.com/cenkalti/backoff/.travis.yml new file mode 100644 index 0000000000..47a6a46ec2 --- /dev/null +++ b/vendor/github.com/cenkalti/backoff/.travis.yml @@ -0,0 +1,10 @@ +language: go +go: + - 1.7 + - 1.x + - tip +before_install: + - go get github.com/mattn/goveralls + - go get golang.org/x/tools/cmd/cover +script: + - $HOME/gopath/bin/goveralls -service=travis-ci diff --git a/vendor/github.com/cenkalti/backoff/LICENSE b/vendor/github.com/cenkalti/backoff/LICENSE new file mode 100644 index 0000000000..89b8179965 --- /dev/null +++ b/vendor/github.com/cenkalti/backoff/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Cenk Altı + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/cenkalti/backoff/README.md b/vendor/github.com/cenkalti/backoff/README.md new file mode 100644 index 0000000000..55ebc98fc2 --- /dev/null +++ b/vendor/github.com/cenkalti/backoff/README.md @@ -0,0 +1,30 @@ +# Exponential Backoff [![GoDoc][godoc image]][godoc] [![Build Status][travis image]][travis] [![Coverage Status][coveralls image]][coveralls] + +This is a Go port of the exponential backoff algorithm from [Google's HTTP Client Library for Java][google-http-java-client]. + +[Exponential backoff][exponential backoff wiki] +is an algorithm that uses feedback to multiplicatively decrease the rate of some process, +in order to gradually find an acceptable rate. +The retries exponentially increase and stop increasing when a certain threshold is met. + +## Usage + +See https://godoc.org/github.com/cenkalti/backoff#pkg-examples + +## Contributing + +* I would like to keep this library as small as possible. +* Please don't send a PR without opening an issue and discussing it first. +* If proposed change is not a common use case, I will probably not accept it. + +[godoc]: https://godoc.org/github.com/cenkalti/backoff +[godoc image]: https://godoc.org/github.com/cenkalti/backoff?status.png +[travis]: https://travis-ci.org/cenkalti/backoff +[travis image]: https://travis-ci.org/cenkalti/backoff.png?branch=master +[coveralls]: https://coveralls.io/github/cenkalti/backoff?branch=master +[coveralls image]: https://coveralls.io/repos/github/cenkalti/backoff/badge.svg?branch=master + +[google-http-java-client]: https://github.com/google/google-http-java-client/blob/da1aa993e90285ec18579f1553339b00e19b3ab5/google-http-client/src/main/java/com/google/api/client/util/ExponentialBackOff.java +[exponential backoff wiki]: http://en.wikipedia.org/wiki/Exponential_backoff + +[advanced example]: https://godoc.org/github.com/cenkalti/backoff#example_ diff --git a/vendor/github.com/cenkalti/backoff/backoff.go b/vendor/github.com/cenkalti/backoff/backoff.go new file mode 100644 index 0000000000..3676ee405d --- /dev/null +++ b/vendor/github.com/cenkalti/backoff/backoff.go @@ -0,0 +1,66 @@ +// Package backoff implements backoff algorithms for retrying operations. +// +// Use Retry function for retrying operations that may fail. +// If Retry does not meet your needs, +// copy/paste the function into your project and modify as you wish. +// +// There is also Ticker type similar to time.Ticker. +// You can use it if you need to work with channels. +// +// See Examples section below for usage examples. +package backoff + +import "time" + +// BackOff is a backoff policy for retrying an operation. +type BackOff interface { + // NextBackOff returns the duration to wait before retrying the operation, + // or backoff. Stop to indicate that no more retries should be made. + // + // Example usage: + // + // duration := backoff.NextBackOff(); + // if (duration == backoff.Stop) { + // // Do not retry operation. + // } else { + // // Sleep for duration and retry operation. + // } + // + NextBackOff() time.Duration + + // Reset to initial state. + Reset() +} + +// Stop indicates that no more retries should be made for use in NextBackOff(). +const Stop time.Duration = -1 + +// ZeroBackOff is a fixed backoff policy whose backoff time is always zero, +// meaning that the operation is retried immediately without waiting, indefinitely. +type ZeroBackOff struct{} + +func (b *ZeroBackOff) Reset() {} + +func (b *ZeroBackOff) NextBackOff() time.Duration { return 0 } + +// StopBackOff is a fixed backoff policy that always returns backoff.Stop for +// NextBackOff(), meaning that the operation should never be retried. +type StopBackOff struct{} + +func (b *StopBackOff) Reset() {} + +func (b *StopBackOff) NextBackOff() time.Duration { return Stop } + +// ConstantBackOff is a backoff policy that always returns the same backoff delay. +// This is in contrast to an exponential backoff policy, +// which returns a delay that grows longer as you call NextBackOff() over and over again. +type ConstantBackOff struct { + Interval time.Duration +} + +func (b *ConstantBackOff) Reset() {} +func (b *ConstantBackOff) NextBackOff() time.Duration { return b.Interval } + +func NewConstantBackOff(d time.Duration) *ConstantBackOff { + return &ConstantBackOff{Interval: d} +} diff --git a/vendor/github.com/cenkalti/backoff/context.go b/vendor/github.com/cenkalti/backoff/context.go new file mode 100644 index 0000000000..7706faa2b6 --- /dev/null +++ b/vendor/github.com/cenkalti/backoff/context.go @@ -0,0 +1,63 @@ +package backoff + +import ( + "context" + "time" +) + +// BackOffContext is a backoff policy that stops retrying after the context +// is canceled. +type BackOffContext interface { + BackOff + Context() context.Context +} + +type backOffContext struct { + BackOff + ctx context.Context +} + +// WithContext returns a BackOffContext with context ctx +// +// ctx must not be nil +func WithContext(b BackOff, ctx context.Context) BackOffContext { + if ctx == nil { + panic("nil context") + } + + if b, ok := b.(*backOffContext); ok { + return &backOffContext{ + BackOff: b.BackOff, + ctx: ctx, + } + } + + return &backOffContext{ + BackOff: b, + ctx: ctx, + } +} + +func ensureContext(b BackOff) BackOffContext { + if cb, ok := b.(BackOffContext); ok { + return cb + } + return WithContext(b, context.Background()) +} + +func (b *backOffContext) Context() context.Context { + return b.ctx +} + +func (b *backOffContext) NextBackOff() time.Duration { + select { + case <-b.ctx.Done(): + return Stop + default: + } + next := b.BackOff.NextBackOff() + if deadline, ok := b.ctx.Deadline(); ok && deadline.Sub(time.Now()) < next { + return Stop + } + return next +} diff --git a/vendor/github.com/cenkalti/backoff/exponential.go b/vendor/github.com/cenkalti/backoff/exponential.go new file mode 100644 index 0000000000..a031a65979 --- /dev/null +++ b/vendor/github.com/cenkalti/backoff/exponential.go @@ -0,0 +1,153 @@ +package backoff + +import ( + "math/rand" + "time" +) + +/* +ExponentialBackOff is a backoff implementation that increases the backoff +period for each retry attempt using a randomization function that grows exponentially. + +NextBackOff() is calculated using the following formula: + + randomized interval = + RetryInterval * (random value in range [1 - RandomizationFactor, 1 + RandomizationFactor]) + +In other words NextBackOff() will range between the randomization factor +percentage below and above the retry interval. + +For example, given the following parameters: + + RetryInterval = 2 + RandomizationFactor = 0.5 + Multiplier = 2 + +the actual backoff period used in the next retry attempt will range between 1 and 3 seconds, +multiplied by the exponential, that is, between 2 and 6 seconds. + +Note: MaxInterval caps the RetryInterval and not the randomized interval. + +If the time elapsed since an ExponentialBackOff instance is created goes past the +MaxElapsedTime, then the method NextBackOff() starts returning backoff.Stop. + +The elapsed time can be reset by calling Reset(). + +Example: Given the following default arguments, for 10 tries the sequence will be, +and assuming we go over the MaxElapsedTime on the 10th try: + + Request # RetryInterval (seconds) Randomized Interval (seconds) + + 1 0.5 [0.25, 0.75] + 2 0.75 [0.375, 1.125] + 3 1.125 [0.562, 1.687] + 4 1.687 [0.8435, 2.53] + 5 2.53 [1.265, 3.795] + 6 3.795 [1.897, 5.692] + 7 5.692 [2.846, 8.538] + 8 8.538 [4.269, 12.807] + 9 12.807 [6.403, 19.210] + 10 19.210 backoff.Stop + +Note: Implementation is not thread-safe. +*/ +type ExponentialBackOff struct { + InitialInterval time.Duration + RandomizationFactor float64 + Multiplier float64 + MaxInterval time.Duration + // After MaxElapsedTime the ExponentialBackOff stops. + // It never stops if MaxElapsedTime == 0. + MaxElapsedTime time.Duration + Clock Clock + + currentInterval time.Duration + startTime time.Time +} + +// Clock is an interface that returns current time for BackOff. +type Clock interface { + Now() time.Time +} + +// Default values for ExponentialBackOff. +const ( + DefaultInitialInterval = 500 * time.Millisecond + DefaultRandomizationFactor = 0.5 + DefaultMultiplier = 1.5 + DefaultMaxInterval = 60 * time.Second + DefaultMaxElapsedTime = 15 * time.Minute +) + +// NewExponentialBackOff creates an instance of ExponentialBackOff using default values. +func NewExponentialBackOff() *ExponentialBackOff { + b := &ExponentialBackOff{ + InitialInterval: DefaultInitialInterval, + RandomizationFactor: DefaultRandomizationFactor, + Multiplier: DefaultMultiplier, + MaxInterval: DefaultMaxInterval, + MaxElapsedTime: DefaultMaxElapsedTime, + Clock: SystemClock, + } + b.Reset() + return b +} + +type systemClock struct{} + +func (t systemClock) Now() time.Time { + return time.Now() +} + +// SystemClock implements Clock interface that uses time.Now(). +var SystemClock = systemClock{} + +// Reset the interval back to the initial retry interval and restarts the timer. +func (b *ExponentialBackOff) Reset() { + b.currentInterval = b.InitialInterval + b.startTime = b.Clock.Now() +} + +// NextBackOff calculates the next backoff interval using the formula: +// Randomized interval = RetryInterval +/- (RandomizationFactor * RetryInterval) +func (b *ExponentialBackOff) NextBackOff() time.Duration { + // Make sure we have not gone over the maximum elapsed time. + if b.MaxElapsedTime != 0 && b.GetElapsedTime() > b.MaxElapsedTime { + return Stop + } + defer b.incrementCurrentInterval() + return getRandomValueFromInterval(b.RandomizationFactor, rand.Float64(), b.currentInterval) +} + +// GetElapsedTime returns the elapsed time since an ExponentialBackOff instance +// is created and is reset when Reset() is called. +// +// The elapsed time is computed using time.Now().UnixNano(). It is +// safe to call even while the backoff policy is used by a running +// ticker. +func (b *ExponentialBackOff) GetElapsedTime() time.Duration { + return b.Clock.Now().Sub(b.startTime) +} + +// Increments the current interval by multiplying it with the multiplier. +func (b *ExponentialBackOff) incrementCurrentInterval() { + // Check for overflow, if overflow is detected set the current interval to the max interval. + if float64(b.currentInterval) >= float64(b.MaxInterval)/b.Multiplier { + b.currentInterval = b.MaxInterval + } else { + b.currentInterval = time.Duration(float64(b.currentInterval) * b.Multiplier) + } +} + +// Returns a random value from the following interval: +// [randomizationFactor * currentInterval, randomizationFactor * currentInterval]. +func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration { + var delta = randomizationFactor * float64(currentInterval) + var minInterval = float64(currentInterval) - delta + var maxInterval = float64(currentInterval) + delta + + // Get a random value from the range [minInterval, maxInterval]. + // The formula used below has a +1 because if the minInterval is 1 and the maxInterval is 3 then + // we want a 33% chance for selecting either 1, 2 or 3. + return time.Duration(minInterval + (random * (maxInterval - minInterval + 1))) +} diff --git a/vendor/github.com/cenkalti/backoff/retry.go b/vendor/github.com/cenkalti/backoff/retry.go new file mode 100644 index 0000000000..e936a506f8 --- /dev/null +++ b/vendor/github.com/cenkalti/backoff/retry.go @@ -0,0 +1,82 @@ +package backoff + +import "time" + +// An Operation is executing by Retry() or RetryNotify(). +// The operation will be retried using a backoff policy if it returns an error. +type Operation func() error + +// Notify is a notify-on-error function. It receives an operation error and +// backoff delay if the operation failed (with an error). +// +// NOTE that if the backoff policy stated to stop retrying, +// the notify function isn't called. +type Notify func(error, time.Duration) + +// Retry the operation o until it does not return error or BackOff stops. +// o is guaranteed to be run at least once. +// +// If o returns a *PermanentError, the operation is not retried, and the +// wrapped error is returned. +// +// Retry sleeps the goroutine for the duration returned by BackOff after a +// failed operation returns. +func Retry(o Operation, b BackOff) error { return RetryNotify(o, b, nil) } + +// RetryNotify calls notify function with the error and wait duration +// for each failed attempt before sleep. +func RetryNotify(operation Operation, b BackOff, notify Notify) error { + var err error + var next time.Duration + var t *time.Timer + + cb := ensureContext(b) + + b.Reset() + for { + if err = operation(); err == nil { + return nil + } + + if permanent, ok := err.(*PermanentError); ok { + return permanent.Err + } + + if next = cb.NextBackOff(); next == Stop { + return err + } + + if notify != nil { + notify(err, next) + } + + if t == nil { + t = time.NewTimer(next) + defer t.Stop() + } else { + t.Reset(next) + } + + select { + case <-cb.Context().Done(): + return err + case <-t.C: + } + } +} + +// PermanentError signals that the operation should not be retried. +type PermanentError struct { + Err error +} + +func (e *PermanentError) Error() string { + return e.Err.Error() +} + +// Permanent wraps the given err in a *PermanentError. +func Permanent(err error) *PermanentError { + return &PermanentError{ + Err: err, + } +} diff --git a/vendor/github.com/cenkalti/backoff/ticker.go b/vendor/github.com/cenkalti/backoff/ticker.go new file mode 100644 index 0000000000..e41084b0ef --- /dev/null +++ b/vendor/github.com/cenkalti/backoff/ticker.go @@ -0,0 +1,82 @@ +package backoff + +import ( + "sync" + "time" +) + +// Ticker holds a channel that delivers `ticks' of a clock at times reported by a BackOff. +// +// Ticks will continue to arrive when the previous operation is still running, +// so operations that take a while to fail could run in quick succession. +type Ticker struct { + C <-chan time.Time + c chan time.Time + b BackOffContext + stop chan struct{} + stopOnce sync.Once +} + +// NewTicker returns a new Ticker containing a channel that will send +// the time at times specified by the BackOff argument. Ticker is +// guaranteed to tick at least once. The channel is closed when Stop +// method is called or BackOff stops. It is not safe to manipulate the +// provided backoff policy (notably calling NextBackOff or Reset) +// while the ticker is running. +func NewTicker(b BackOff) *Ticker { + c := make(chan time.Time) + t := &Ticker{ + C: c, + c: c, + b: ensureContext(b), + stop: make(chan struct{}), + } + t.b.Reset() + go t.run() + return t +} + +// Stop turns off a ticker. After Stop, no more ticks will be sent. +func (t *Ticker) Stop() { + t.stopOnce.Do(func() { close(t.stop) }) +} + +func (t *Ticker) run() { + c := t.c + defer close(c) + + // Ticker is guaranteed to tick at least once. + afterC := t.send(time.Now()) + + for { + if afterC == nil { + return + } + + select { + case tick := <-afterC: + afterC = t.send(tick) + case <-t.stop: + t.c = nil // Prevent future ticks from being sent to the channel. + return + case <-t.b.Context().Done(): + return + } + } +} + +func (t *Ticker) send(tick time.Time) <-chan time.Time { + select { + case t.c <- tick: + case <-t.stop: + return nil + } + + next := t.b.NextBackOff() + if next == Stop { + t.Stop() + return nil + } + + return time.After(next) +} diff --git a/vendor/github.com/cenkalti/backoff/tries.go b/vendor/github.com/cenkalti/backoff/tries.go new file mode 100644 index 0000000000..cfeefd9b76 --- /dev/null +++ b/vendor/github.com/cenkalti/backoff/tries.go @@ -0,0 +1,35 @@ +package backoff + +import "time" + +/* +WithMaxRetries creates a wrapper around another BackOff, which will +return Stop if NextBackOff() has been called too many times since +the last time Reset() was called + +Note: Implementation is not thread-safe. +*/ +func WithMaxRetries(b BackOff, max uint64) BackOff { + return &backOffTries{delegate: b, maxTries: max} +} + +type backOffTries struct { + delegate BackOff + maxTries uint64 + numTries uint64 +} + +func (b *backOffTries) NextBackOff() time.Duration { + if b.maxTries > 0 { + if b.maxTries <= b.numTries { + return Stop + } + b.numTries++ + } + return b.delegate.NextBackOff() +} + +func (b *backOffTries) Reset() { + b.numTries = 0 + b.delegate.Reset() +} diff --git a/vendor/github.com/fatih/color/README.md b/vendor/github.com/fatih/color/README.md index be82827cac..d135bfe023 100644 --- a/vendor/github.com/fatih/color/README.md +++ b/vendor/github.com/fatih/color/README.md @@ -9,7 +9,7 @@ suits you. ## Install -```bash +``` go get github.com/fatih/color ``` @@ -30,6 +30,18 @@ color.Magenta("And many others ..") ``` +### RGB colors + +If your terminal supports 24-bit colors, you can use RGB color codes. + +```go +color.RGB(255, 128, 0).Println("foreground orange") +color.RGB(230, 42, 42).Println("foreground red") + +color.BgRGB(255, 128, 0).Println("background orange") +color.BgRGB(230, 42, 42).Println("background red") +``` + ### Mix and reuse colors ```go @@ -49,6 +61,11 @@ boldRed.Println("This will print text in bold red.") whiteBackground := red.Add(color.BgWhite) whiteBackground.Println("Red text with white background.") + +// Mix with RGB color codes +color.RGB(255, 128, 0).AddBgRGB(0, 0, 0).Println("orange with black background") + +color.BgRGB(255, 128, 0).AddRGB(255, 255, 255).Println("orange background with white foreground") ``` ### Use your own output (io.Writer) @@ -161,10 +178,6 @@ c.Println("This prints again cyan...") To output color in GitHub Actions (or other CI systems that support ANSI colors), make sure to set `color.NoColor = false` so that it bypasses the check for non-tty output streams. -## Todo - -* Save/Return previous values -* Evaluate fmt.Formatter interface ## Credits diff --git a/vendor/github.com/fatih/color/color.go b/vendor/github.com/fatih/color/color.go index 81094e87c5..ee39b408e9 100644 --- a/vendor/github.com/fatih/color/color.go +++ b/vendor/github.com/fatih/color/color.go @@ -98,6 +98,9 @@ const ( FgMagenta FgCyan FgWhite + + // used internally for 256 and 24-bit coloring + foreground ) // Foreground Hi-Intensity text colors @@ -122,6 +125,9 @@ const ( BgMagenta BgCyan BgWhite + + // used internally for 256 and 24-bit coloring + background ) // Background Hi-Intensity text colors @@ -150,6 +156,30 @@ func New(value ...Attribute) *Color { return c } +// RGB returns a new foreground color in 24-bit RGB. +func RGB(r, g, b int) *Color { + return New(foreground, 2, Attribute(r), Attribute(g), Attribute(b)) +} + +// BgRGB returns a new background color in 24-bit RGB. +func BgRGB(r, g, b int) *Color { + return New(background, 2, Attribute(r), Attribute(g), Attribute(b)) +} + +// AddRGB is used to chain foreground RGB SGR parameters. Use as many as parameters to combine +// and create custom color objects. Example: .Add(34, 0, 12).Add(255, 128, 0). +func (c *Color) AddRGB(r, g, b int) *Color { + c.params = append(c.params, foreground, 2, Attribute(r), Attribute(g), Attribute(b)) + return c +} + +// AddRGB is used to chain background RGB SGR parameters. Use as many as parameters to combine +// and create custom color objects. Example: .Add(34, 0, 12).Add(255, 128, 0). +func (c *Color) AddBgRGB(r, g, b int) *Color { + c.params = append(c.params, background, 2, Attribute(r), Attribute(g), Attribute(b)) + return c +} + // Set sets the given parameters immediately. It will change the color of // output with the given SGR parameters until color.Unset() is called. func Set(p ...Attribute) *Color { @@ -401,7 +431,7 @@ func (c *Color) format() string { func (c *Color) unformat() string { //return fmt.Sprintf("%s[%dm", escape, Reset) - //for each element in sequence let's use the speficic reset escape, ou the generic one if not found + //for each element in sequence let's use the specific reset escape, or the generic one if not found format := make([]string, len(c.params)) for i, v := range c.params { format[i] = strconv.Itoa(int(Reset)) diff --git a/vendor/github.com/fsnotify/fsnotify/.cirrus.yml b/vendor/github.com/fsnotify/fsnotify/.cirrus.yml new file mode 100644 index 0000000000..ffc7b992b3 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.cirrus.yml @@ -0,0 +1,13 @@ +freebsd_task: + name: 'FreeBSD' + freebsd_instance: + image_family: freebsd-13-2 + install_script: + - pkg update -f + - pkg install -y go + test_script: + # run tests as user "cirrus" instead of root + - pw useradd cirrus -m + - chown -R cirrus:cirrus . + - FSNOTIFY_BUFFER=4096 sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race ./... + - sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race ./... diff --git a/vendor/github.com/fsnotify/fsnotify/.editorconfig b/vendor/github.com/fsnotify/fsnotify/.editorconfig new file mode 100644 index 0000000000..fad895851e --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*.go] +indent_style = tab +indent_size = 4 +insert_final_newline = true + +[*.{yml,yaml}] +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/vendor/github.com/fsnotify/fsnotify/.gitattributes b/vendor/github.com/fsnotify/fsnotify/.gitattributes new file mode 100644 index 0000000000..32f1001be0 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.gitattributes @@ -0,0 +1 @@ +go.sum linguist-generated diff --git a/vendor/github.com/fsnotify/fsnotify/.gitignore b/vendor/github.com/fsnotify/fsnotify/.gitignore new file mode 100644 index 0000000000..391cc076b1 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.gitignore @@ -0,0 +1,7 @@ +# go test -c output +*.test +*.test.exe + +# Output of go build ./cmd/fsnotify +/fsnotify +/fsnotify.exe diff --git a/vendor/github.com/fsnotify/fsnotify/.mailmap b/vendor/github.com/fsnotify/fsnotify/.mailmap new file mode 100644 index 0000000000..a04f2907fe --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.mailmap @@ -0,0 +1,2 @@ +Chris Howey +Nathan Youngman <4566+nathany@users.noreply.github.com> diff --git a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md new file mode 100644 index 0000000000..e0e5757549 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md @@ -0,0 +1,541 @@ +# Changelog + +Unreleased +---------- +Nothing yet. + +1.7.0 - 2023-10-22 +------------------ +This version of fsnotify needs Go 1.17. + +### Additions + +- illumos: add FEN backend to support illumos and Solaris. ([#371]) + +- all: add `NewBufferedWatcher()` to use a buffered channel, which can be useful + in cases where you can't control the kernel buffer and receive a large number + of events in bursts. ([#550], [#572]) + +- all: add `AddWith()`, which is identical to `Add()` but allows passing + options. ([#521]) + +- windows: allow setting the ReadDirectoryChangesW() buffer size with + `fsnotify.WithBufferSize()`; the default of 64K is the highest value that + works on all platforms and is enough for most purposes, but in some cases a + highest buffer is needed. ([#521]) + +### Changes and fixes + +- inotify: remove watcher if a watched path is renamed ([#518]) + + After a rename the reported name wasn't updated, or even an empty string. + Inotify doesn't provide any good facilities to update it, so just remove the + watcher. This is already how it worked on kqueue and FEN. + + On Windows this does work, and remains working. + +- windows: don't listen for file attribute changes ([#520]) + + File attribute changes are sent as `FILE_ACTION_MODIFIED` by the Windows API, + with no way to see if they're a file write or attribute change, so would show + up as a fsnotify.Write event. This is never useful, and could result in many + spurious Write events. + +- windows: return `ErrEventOverflow` if the buffer is full ([#525]) + + Before it would merely return "short read", making it hard to detect this + error. + +- kqueue: make sure events for all files are delivered properly when removing a + watched directory ([#526]) + + Previously they would get sent with `""` (empty string) or `"."` as the path + name. + +- kqueue: don't emit spurious Create events for symbolic links ([#524]) + + The link would get resolved but kqueue would "forget" it already saw the link + itself, resulting on a Create for every Write event for the directory. + +- all: return `ErrClosed` on `Add()` when the watcher is closed ([#516]) + +- other: add `Watcher.Errors` and `Watcher.Events` to the no-op `Watcher` in + `backend_other.go`, making it easier to use on unsupported platforms such as + WASM, AIX, etc. ([#528]) + +- other: use the `backend_other.go` no-op if the `appengine` build tag is set; + Google AppEngine forbids usage of the unsafe package so the inotify backend + won't compile there. + +[#371]: https://github.com/fsnotify/fsnotify/pull/371 +[#516]: https://github.com/fsnotify/fsnotify/pull/516 +[#518]: https://github.com/fsnotify/fsnotify/pull/518 +[#520]: https://github.com/fsnotify/fsnotify/pull/520 +[#521]: https://github.com/fsnotify/fsnotify/pull/521 +[#524]: https://github.com/fsnotify/fsnotify/pull/524 +[#525]: https://github.com/fsnotify/fsnotify/pull/525 +[#526]: https://github.com/fsnotify/fsnotify/pull/526 +[#528]: https://github.com/fsnotify/fsnotify/pull/528 +[#537]: https://github.com/fsnotify/fsnotify/pull/537 +[#550]: https://github.com/fsnotify/fsnotify/pull/550 +[#572]: https://github.com/fsnotify/fsnotify/pull/572 + +1.6.0 - 2022-10-13 +------------------ +This version of fsnotify needs Go 1.16 (this was already the case since 1.5.1, +but not documented). It also increases the minimum Linux version to 2.6.32. + +### Additions + +- all: add `Event.Has()` and `Op.Has()` ([#477]) + + This makes checking events a lot easier; for example: + + if event.Op&Write == Write && !(event.Op&Remove == Remove) { + } + + Becomes: + + if event.Has(Write) && !event.Has(Remove) { + } + +- all: add cmd/fsnotify ([#463]) + + A command-line utility for testing and some examples. + +### Changes and fixes + +- inotify: don't ignore events for files that don't exist ([#260], [#470]) + + Previously the inotify watcher would call `os.Lstat()` to check if a file + still exists before emitting events. + + This was inconsistent with other platforms and resulted in inconsistent event + reporting (e.g. when a file is quickly removed and re-created), and generally + a source of confusion. It was added in 2013 to fix a memory leak that no + longer exists. + +- all: return `ErrNonExistentWatch` when `Remove()` is called on a path that's + not watched ([#460]) + +- inotify: replace epoll() with non-blocking inotify ([#434]) + + Non-blocking inotify was not generally available at the time this library was + written in 2014, but now it is. As a result, the minimum Linux version is + bumped from 2.6.27 to 2.6.32. This hugely simplifies the code and is faster. + +- kqueue: don't check for events every 100ms ([#480]) + + The watcher would wake up every 100ms, even when there was nothing to do. Now + it waits until there is something to do. + +- macos: retry opening files on EINTR ([#475]) + +- kqueue: skip unreadable files ([#479]) + + kqueue requires a file descriptor for every file in a directory; this would + fail if a file was unreadable by the current user. Now these files are simply + skipped. + +- windows: fix renaming a watched directory if the parent is also watched ([#370]) + +- windows: increase buffer size from 4K to 64K ([#485]) + +- windows: close file handle on Remove() ([#288]) + +- kqueue: put pathname in the error if watching a file fails ([#471]) + +- inotify, windows: calling Close() more than once could race ([#465]) + +- kqueue: improve Close() performance ([#233]) + +- all: various documentation additions and clarifications. + +[#233]: https://github.com/fsnotify/fsnotify/pull/233 +[#260]: https://github.com/fsnotify/fsnotify/pull/260 +[#288]: https://github.com/fsnotify/fsnotify/pull/288 +[#370]: https://github.com/fsnotify/fsnotify/pull/370 +[#434]: https://github.com/fsnotify/fsnotify/pull/434 +[#460]: https://github.com/fsnotify/fsnotify/pull/460 +[#463]: https://github.com/fsnotify/fsnotify/pull/463 +[#465]: https://github.com/fsnotify/fsnotify/pull/465 +[#470]: https://github.com/fsnotify/fsnotify/pull/470 +[#471]: https://github.com/fsnotify/fsnotify/pull/471 +[#475]: https://github.com/fsnotify/fsnotify/pull/475 +[#477]: https://github.com/fsnotify/fsnotify/pull/477 +[#479]: https://github.com/fsnotify/fsnotify/pull/479 +[#480]: https://github.com/fsnotify/fsnotify/pull/480 +[#485]: https://github.com/fsnotify/fsnotify/pull/485 + +## [1.5.4] - 2022-04-25 + +* Windows: add missing defer to `Watcher.WatchList` [#447](https://github.com/fsnotify/fsnotify/pull/447) +* go.mod: use latest x/sys [#444](https://github.com/fsnotify/fsnotify/pull/444) +* Fix compilation for OpenBSD [#443](https://github.com/fsnotify/fsnotify/pull/443) + +## [1.5.3] - 2022-04-22 + +* This version is retracted. An incorrect branch is published accidentally [#445](https://github.com/fsnotify/fsnotify/issues/445) + +## [1.5.2] - 2022-04-21 + +* Add a feature to return the directories and files that are being monitored [#374](https://github.com/fsnotify/fsnotify/pull/374) +* Fix potential crash on windows if `raw.FileNameLength` exceeds `syscall.MAX_PATH` [#361](https://github.com/fsnotify/fsnotify/pull/361) +* Allow build on unsupported GOOS [#424](https://github.com/fsnotify/fsnotify/pull/424) +* Don't set `poller.fd` twice in `newFdPoller` [#406](https://github.com/fsnotify/fsnotify/pull/406) +* fix go vet warnings: call to `(*T).Fatalf` from a non-test goroutine [#416](https://github.com/fsnotify/fsnotify/pull/416) + +## [1.5.1] - 2021-08-24 + +* Revert Add AddRaw to not follow symlinks [#394](https://github.com/fsnotify/fsnotify/pull/394) + +## [1.5.0] - 2021-08-20 + +* Go: Increase minimum required version to Go 1.12 [#381](https://github.com/fsnotify/fsnotify/pull/381) +* Feature: Add AddRaw method which does not follow symlinks when adding a watch [#289](https://github.com/fsnotify/fsnotify/pull/298) +* Windows: Follow symlinks by default like on all other systems [#289](https://github.com/fsnotify/fsnotify/pull/289) +* CI: Use GitHub Actions for CI and cover go 1.12-1.17 + [#378](https://github.com/fsnotify/fsnotify/pull/378) + [#381](https://github.com/fsnotify/fsnotify/pull/381) + [#385](https://github.com/fsnotify/fsnotify/pull/385) +* Go 1.14+: Fix unsafe pointer conversion [#325](https://github.com/fsnotify/fsnotify/pull/325) + +## [1.4.9] - 2020-03-11 + +* Move example usage to the readme #329. This may resolve #328. + +## [1.4.8] - 2020-03-10 + +* CI: test more go versions (@nathany 1d13583d846ea9d66dcabbfefbfb9d8e6fb05216) +* Tests: Queued inotify events could have been read by the test before max_queued_events was hit (@matthias-stone #265) +* Tests: t.Fatalf -> t.Errorf in go routines (@gdey #266) +* CI: Less verbosity (@nathany #267) +* Tests: Darwin: Exchangedata is deprecated on 10.13 (@nathany #267) +* Tests: Check if channels are closed in the example (@alexeykazakov #244) +* CI: Only run golint on latest version of go and fix issues (@cpuguy83 #284) +* CI: Add windows to travis matrix (@cpuguy83 #284) +* Docs: Remover appveyor badge (@nathany 11844c0959f6fff69ba325d097fce35bd85a8e93) +* Linux: create epoll and pipe fds with close-on-exec (@JohannesEbke #219) +* Linux: open files with close-on-exec (@linxiulei #273) +* Docs: Plan to support fanotify (@nathany ab058b44498e8b7566a799372a39d150d9ea0119 ) +* Project: Add go.mod (@nathany #309) +* Project: Revise editor config (@nathany #309) +* Project: Update copyright for 2019 (@nathany #309) +* CI: Drop go1.8 from CI matrix (@nathany #309) +* Docs: Updating the FAQ section for supportability with NFS & FUSE filesystems (@Pratik32 4bf2d1fec78374803a39307bfb8d340688f4f28e ) + +## [1.4.7] - 2018-01-09 + +* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine) +* Tests: Fix missing verb on format string (thanks @rchiossi) +* Linux: Fix deadlock in Remove (thanks @aarondl) +* Linux: Watch.Add improvements (avoid race, fix consistency, reduce garbage) (thanks @twpayne) +* Docs: Moved FAQ into the README (thanks @vahe) +* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich) +* Docs: replace references to OS X with macOS + +## [1.4.2] - 2016-10-10 + +* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack) + +## [1.4.1] - 2016-10-04 + +* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack) + +## [1.4.0] - 2016-10-01 + +* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie) + +## [1.3.1] - 2016-06-28 + +* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc) + +## [1.3.0] - 2016-04-19 + +* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135) + +## [1.2.10] - 2016-03-02 + +* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj) + +## [1.2.9] - 2016-01-13 + +kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep) + +## [1.2.8] - 2015-12-17 + +* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test) +* inotify: fix race in test +* enable race detection for continuous integration (Linux, Mac, Windows) + +## [1.2.5] - 2015-10-17 + +* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki) +* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken) +* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie) +* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion) + +## [1.2.1] - 2015-10-14 + +* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx) + +## [1.2.0] - 2015-02-08 + +* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD) +* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD) +* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59) + +## [1.1.1] - 2015-02-05 + +* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD) + +## [1.1.0] - 2014-12-12 + +* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43) + * add low-level functions + * only need to store flags on directories + * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13) + * done can be an unbuffered channel + * remove calls to os.NewSyscallError +* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher) +* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48) +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## [1.0.4] - 2014-09-07 + +* kqueue: add dragonfly to the build tags. +* Rename source code files, rearrange code so exported APIs are at the top. +* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang) + +## [1.0.3] - 2014-08-19 + +* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36) + +## [1.0.2] - 2014-08-17 + +* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) +* [Fix] Make ./path and path equivalent. (thanks @zhsso) + +## [1.0.0] - 2014-08-15 + +* [API] Remove AddWatch on Windows, use Add. +* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30) +* Minor updates based on feedback from golint. + +## dev / 2014-07-09 + +* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify). +* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno) + +## dev / 2014-07-04 + +* kqueue: fix incorrect mutex used in Close() +* Update example to demonstrate usage of Op. + +## dev / 2014-06-28 + +* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4) +* Fix for String() method on Event (thanks Alex Brainman) +* Don't build on Plan 9 or Solaris (thanks @4ad) + +## dev / 2014-06-21 + +* Events channel of type Event rather than *Event. +* [internal] use syscall constants directly for inotify and kqueue. +* [internal] kqueue: rename events to kevents and fileEvent to event. + +## dev / 2014-06-19 + +* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally). +* [internal] remove cookie from Event struct (unused). +* [internal] Event struct has the same definition across every OS. +* [internal] remove internal watch and removeWatch methods. + +## dev / 2014-06-12 + +* [API] Renamed Watch() to Add() and RemoveWatch() to Remove(). +* [API] Pluralized channel names: Events and Errors. +* [API] Renamed FileEvent struct to Event. +* [API] Op constants replace methods like IsCreate(). + +## dev / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## dev / 2014-05-23 + +* [API] Remove current implementation of WatchFlags. + * current implementation doesn't take advantage of OS for efficiency + * provides little benefit over filtering events as they are received, but has extra bookkeeping and mutexes + * no tests for the current implementation + * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195) + +## [0.9.3] - 2014-12-31 + +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## [0.9.2] - 2014-08-17 + +* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) + +## [0.9.1] - 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## [0.9.0] - 2014-01-17 + +* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany) +* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare) +* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library. + +## [0.8.12] - 2013-11-13 + +* [API] Remove FD_SET and friends from Linux adapter + +## [0.8.11] - 2013-11-02 + +* [Doc] Add Changelog [#72][] (thanks @nathany) +* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond) + +## [0.8.10] - 2013-10-19 + +* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott) +* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer) +* [Doc] specify OS-specific limits in README (thanks @debrando) + +## [0.8.9] - 2013-09-08 + +* [Doc] Contributing (thanks @nathany) +* [Doc] update package path in example code [#63][] (thanks @paulhammond) +* [Doc] GoCI badge in README (Linux only) [#60][] +* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany) + +## [0.8.8] - 2013-06-17 + +* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie) + +## [0.8.7] - 2013-06-03 + +* [API] Make syscall flags internal +* [Fix] inotify: ignore event changes +* [Fix] race in symlink test [#45][] (reported by @srid) +* [Fix] tests on Windows +* lower case error messages + +## [0.8.6] - 2013-05-23 + +* kqueue: Use EVT_ONLY flag on Darwin +* [Doc] Update README with full example + +## [0.8.5] - 2013-05-09 + +* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg) + +## [0.8.4] - 2013-04-07 + +* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz) + +## [0.8.3] - 2013-03-13 + +* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin) +* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin) + +## [0.8.2] - 2013-02-07 + +* [Doc] add Authors +* [Fix] fix data races for map access [#29][] (thanks @fsouza) + +## [0.8.1] - 2013-01-09 + +* [Fix] Windows path separators +* [Doc] BSD License + +## [0.8.0] - 2012-11-09 + +* kqueue: directory watching improvements (thanks @vmirage) +* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto) +* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr) + +## [0.7.4] - 2012-10-09 + +* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji) +* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig) +* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig) +* [Fix] kqueue: modify after recreation of file + +## [0.7.3] - 2012-09-27 + +* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage) +* [Fix] kqueue: no longer get duplicate CREATE events + +## [0.7.2] - 2012-09-01 + +* kqueue: events for created directories + +## [0.7.1] - 2012-07-14 + +* [Fix] for renaming files + +## [0.7.0] - 2012-07-02 + +* [Feature] FSNotify flags +* [Fix] inotify: Added file name back to event path + +## [0.6.0] - 2012-06-06 + +* kqueue: watch files after directory created (thanks @tmc) + +## [0.5.1] - 2012-05-22 + +* [Fix] inotify: remove all watches before Close() + +## [0.5.0] - 2012-05-03 + +* [API] kqueue: return errors during watch instead of sending over channel +* kqueue: match symlink behavior on Linux +* inotify: add `DELETE_SELF` (requested by @taralx) +* [Fix] kqueue: handle EINTR (reported by @robfig) +* [Doc] Godoc example [#1][] (thanks @davecheney) + +## [0.4.0] - 2012-03-30 + +* Go 1 released: build with go tool +* [Feature] Windows support using winfsnotify +* Windows does not have attribute change notifications +* Roll attribute notifications into IsModify + +## [0.3.0] - 2012-02-19 + +* kqueue: add files when watch directory + +## [0.2.0] - 2011-12-30 + +* update to latest Go weekly code + +## [0.1.0] - 2011-10-19 + +* kqueue: add watch on file creation to match inotify +* kqueue: create file event +* inotify: ignore `IN_IGNORED` events +* event String() +* linux: common FileEvent functions +* initial commit + +[#79]: https://github.com/howeyc/fsnotify/pull/79 +[#77]: https://github.com/howeyc/fsnotify/pull/77 +[#72]: https://github.com/howeyc/fsnotify/issues/72 +[#71]: https://github.com/howeyc/fsnotify/issues/71 +[#70]: https://github.com/howeyc/fsnotify/issues/70 +[#63]: https://github.com/howeyc/fsnotify/issues/63 +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#60]: https://github.com/howeyc/fsnotify/issues/60 +[#59]: https://github.com/howeyc/fsnotify/issues/59 +[#49]: https://github.com/howeyc/fsnotify/issues/49 +[#45]: https://github.com/howeyc/fsnotify/issues/45 +[#40]: https://github.com/howeyc/fsnotify/issues/40 +[#36]: https://github.com/howeyc/fsnotify/issues/36 +[#33]: https://github.com/howeyc/fsnotify/issues/33 +[#29]: https://github.com/howeyc/fsnotify/issues/29 +[#25]: https://github.com/howeyc/fsnotify/issues/25 +[#24]: https://github.com/howeyc/fsnotify/issues/24 +[#21]: https://github.com/howeyc/fsnotify/issues/21 diff --git a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md new file mode 100644 index 0000000000..ea379759d5 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md @@ -0,0 +1,26 @@ +Thank you for your interest in contributing to fsnotify! We try to review and +merge PRs in a reasonable timeframe, but please be aware that: + +- To avoid "wasted" work, please discus changes on the issue tracker first. You + can just send PRs, but they may end up being rejected for one reason or the + other. + +- fsnotify is a cross-platform library, and changes must work reasonably well on + all supported platforms. + +- Changes will need to be compatible; old code should still compile, and the + runtime behaviour can't change in ways that are likely to lead to problems for + users. + +Testing +------- +Just `go test ./...` runs all the tests; the CI runs this on all supported +platforms. Testing different platforms locally can be done with something like +[goon] or [Vagrant], but this isn't super-easy to set up at the moment. + +Use the `-short` flag to make the "stress test" run faster. + + +[goon]: https://github.com/arp242/goon +[Vagrant]: https://www.vagrantup.com/ +[integration_test.go]: /integration_test.go diff --git a/vendor/github.com/fsnotify/fsnotify/LICENSE b/vendor/github.com/fsnotify/fsnotify/LICENSE new file mode 100644 index 0000000000..fb03ade750 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/LICENSE @@ -0,0 +1,25 @@ +Copyright © 2012 The Go Authors. All rights reserved. +Copyright © fsnotify Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. +* Neither the name of Google Inc. nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md new file mode 100644 index 0000000000..e480733d16 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/README.md @@ -0,0 +1,184 @@ +fsnotify is a Go library to provide cross-platform filesystem notifications on +Windows, Linux, macOS, BSD, and illumos. + +Go 1.17 or newer is required; the full documentation is at +https://pkg.go.dev/github.com/fsnotify/fsnotify + +--- + +Platform support: + +| Backend | OS | Status | +| :-------------------- | :--------- | :------------------------------------------------------------------------ | +| inotify | Linux | Supported | +| kqueue | BSD, macOS | Supported | +| ReadDirectoryChangesW | Windows | Supported | +| FEN | illumos | Supported | +| fanotify | Linux 5.9+ | [Not yet](https://github.com/fsnotify/fsnotify/issues/114) | +| AHAFS | AIX | [aix branch]; experimental due to lack of maintainer and test environment | +| FSEvents | macOS | [Needs support in x/sys/unix][fsevents] | +| USN Journals | Windows | [Needs support in x/sys/windows][usn] | +| Polling | *All* | [Not yet](https://github.com/fsnotify/fsnotify/issues/9) | + +Linux and illumos should include Android and Solaris, but these are currently +untested. + +[fsevents]: https://github.com/fsnotify/fsnotify/issues/11#issuecomment-1279133120 +[usn]: https://github.com/fsnotify/fsnotify/issues/53#issuecomment-1279829847 +[aix branch]: https://github.com/fsnotify/fsnotify/issues/353#issuecomment-1284590129 + +Usage +----- +A basic example: + +```go +package main + +import ( + "log" + + "github.com/fsnotify/fsnotify" +) + +func main() { + // Create new watcher. + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + defer watcher.Close() + + // Start listening for events. + go func() { + for { + select { + case event, ok := <-watcher.Events: + if !ok { + return + } + log.Println("event:", event) + if event.Has(fsnotify.Write) { + log.Println("modified file:", event.Name) + } + case err, ok := <-watcher.Errors: + if !ok { + return + } + log.Println("error:", err) + } + } + }() + + // Add a path. + err = watcher.Add("/tmp") + if err != nil { + log.Fatal(err) + } + + // Block main goroutine forever. + <-make(chan struct{}) +} +``` + +Some more examples can be found in [cmd/fsnotify](cmd/fsnotify), which can be +run with: + + % go run ./cmd/fsnotify + +Further detailed documentation can be found in godoc: +https://pkg.go.dev/github.com/fsnotify/fsnotify + +FAQ +--- +### Will a file still be watched when it's moved to another directory? +No, not unless you are watching the location it was moved to. + +### Are subdirectories watched? +No, you must add watches for any directory you want to watch (a recursive +watcher is on the roadmap: [#18]). + +[#18]: https://github.com/fsnotify/fsnotify/issues/18 + +### Do I have to watch the Error and Event channels in a goroutine? +Yes. You can read both channels in the same goroutine using `select` (you don't +need a separate goroutine for both channels; see the example). + +### Why don't notifications work with NFS, SMB, FUSE, /proc, or /sys? +fsnotify requires support from underlying OS to work. The current NFS and SMB +protocols does not provide network level support for file notifications, and +neither do the /proc and /sys virtual filesystems. + +This could be fixed with a polling watcher ([#9]), but it's not yet implemented. + +[#9]: https://github.com/fsnotify/fsnotify/issues/9 + +### Why do I get many Chmod events? +Some programs may generate a lot of attribute changes; for example Spotlight on +macOS, anti-virus programs, backup applications, and some others are known to do +this. As a rule, it's typically best to ignore Chmod events. They're often not +useful, and tend to cause problems. + +Spotlight indexing on macOS can result in multiple events (see [#15]). A +temporary workaround is to add your folder(s) to the *Spotlight Privacy +settings* until we have a native FSEvents implementation (see [#11]). + +[#11]: https://github.com/fsnotify/fsnotify/issues/11 +[#15]: https://github.com/fsnotify/fsnotify/issues/15 + +### Watching a file doesn't work well +Watching individual files (rather than directories) is generally not recommended +as many programs (especially editors) update files atomically: it will write to +a temporary file which is then moved to to destination, overwriting the original +(or some variant thereof). The watcher on the original file is now lost, as that +no longer exists. + +The upshot of this is that a power failure or crash won't leave a half-written +file. + +Watch the parent directory and use `Event.Name` to filter out files you're not +interested in. There is an example of this in `cmd/fsnotify/file.go`. + +Platform-specific notes +----------------------- +### Linux +When a file is removed a REMOVE event won't be emitted until all file +descriptors are closed; it will emit a CHMOD instead: + + fp := os.Open("file") + os.Remove("file") // CHMOD + fp.Close() // REMOVE + +This is the event that inotify sends, so not much can be changed about this. + +The `fs.inotify.max_user_watches` sysctl variable specifies the upper limit for +the number of watches per user, and `fs.inotify.max_user_instances` specifies +the maximum number of inotify instances per user. Every Watcher you create is an +"instance", and every path you add is a "watch". + +These are also exposed in `/proc` as `/proc/sys/fs/inotify/max_user_watches` and +`/proc/sys/fs/inotify/max_user_instances` + +To increase them you can use `sysctl` or write the value to proc file: + + # The default values on Linux 5.18 + sysctl fs.inotify.max_user_watches=124983 + sysctl fs.inotify.max_user_instances=128 + +To make the changes persist on reboot edit `/etc/sysctl.conf` or +`/usr/lib/sysctl.d/50-default.conf` (details differ per Linux distro; check your +distro's documentation): + + fs.inotify.max_user_watches=124983 + fs.inotify.max_user_instances=128 + +Reaching the limit will result in a "no space left on device" or "too many open +files" error. + +### kqueue (macOS, all BSD systems) +kqueue requires opening a file descriptor for every file that's being watched; +so if you're watching a directory with five files then that's six file +descriptors. You will run in to your system's "max open files" limit faster on +these platforms. + +The sysctl variables `kern.maxfiles` and `kern.maxfilesperproc` can be used to +control the maximum number of open files. diff --git a/vendor/github.com/fsnotify/fsnotify/backend_fen.go b/vendor/github.com/fsnotify/fsnotify/backend_fen.go new file mode 100644 index 0000000000..28497f1dd8 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/backend_fen.go @@ -0,0 +1,640 @@ +//go:build solaris +// +build solaris + +// Note: the documentation on the Watcher type and methods is generated from +// mkdoc.zsh + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "sync" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of paths, delivering events on a channel. +// +// A watcher should not be copied (e.g. pass it by pointer, rather than by +// value). +// +// # Linux notes +// +// When a file is removed a Remove event won't be emitted until all file +// descriptors are closed, and deletes will always emit a Chmod. For example: +// +// fp := os.Open("file") +// os.Remove("file") // Triggers Chmod +// fp.Close() // Triggers Remove +// +// This is the event that inotify sends, so not much can be changed about this. +// +// The fs.inotify.max_user_watches sysctl variable specifies the upper limit +// for the number of watches per user, and fs.inotify.max_user_instances +// specifies the maximum number of inotify instances per user. Every Watcher you +// create is an "instance", and every path you add is a "watch". +// +// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and +// /proc/sys/fs/inotify/max_user_instances +// +// To increase them you can use sysctl or write the value to the /proc file: +// +// # Default values on Linux 5.18 +// sysctl fs.inotify.max_user_watches=124983 +// sysctl fs.inotify.max_user_instances=128 +// +// To make the changes persist on reboot edit /etc/sysctl.conf or +// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check +// your distro's documentation): +// +// fs.inotify.max_user_watches=124983 +// fs.inotify.max_user_instances=128 +// +// Reaching the limit will result in a "no space left on device" or "too many open +// files" error. +// +// # kqueue notes (macOS, BSD) +// +// kqueue requires opening a file descriptor for every file that's being watched; +// so if you're watching a directory with five files then that's six file +// descriptors. You will run in to your system's "max open files" limit faster on +// these platforms. +// +// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to +// control the maximum number of open files, as well as /etc/login.conf on BSD +// systems. +// +// # Windows notes +// +// Paths can be added as "C:\path\to\dir", but forward slashes +// ("C:/path/to/dir") will also work. +// +// When a watched directory is removed it will always send an event for the +// directory itself, but may not send events for all files in that directory. +// Sometimes it will send events for all times, sometimes it will send no +// events, and often only for some files. +// +// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest +// value that is guaranteed to work with SMB filesystems. If you have many +// events in quick succession this may not be enough, and you will have to use +// [WithBufferSize] to increase the value. +type Watcher struct { + // Events sends the filesystem change events. + // + // fsnotify can send the following events; a "path" here can refer to a + // file, directory, symbolic link, or special file like a FIFO. + // + // fsnotify.Create A new path was created; this may be followed by one + // or more Write events if data also gets written to a + // file. + // + // fsnotify.Remove A path was removed. + // + // fsnotify.Rename A path was renamed. A rename is always sent with the + // old path as Event.Name, and a Create event will be + // sent with the new name. Renames are only sent for + // paths that are currently watched; e.g. moving an + // unmonitored file into a monitored directory will + // show up as just a Create. Similarly, renaming a file + // to outside a monitored directory will show up as + // only a Rename. + // + // fsnotify.Write A file or named pipe was written to. A Truncate will + // also trigger a Write. A single "write action" + // initiated by the user may show up as one or multiple + // writes, depending on when the system syncs things to + // disk. For example when compiling a large Go program + // you may get hundreds of Write events, and you may + // want to wait until you've stopped receiving them + // (see the dedup example in cmd/fsnotify). + // + // Some systems may send Write event for directories + // when the directory content changes. + // + // fsnotify.Chmod Attributes were changed. On Linux this is also sent + // when a file is removed (or more accurately, when a + // link to an inode is removed). On kqueue it's sent + // when a file is truncated. On Windows it's never + // sent. + Events chan Event + + // Errors sends any errors. + // + // ErrEventOverflow is used to indicate there are too many events: + // + // - inotify: There are too many queued events (fs.inotify.max_queued_events sysctl) + // - windows: The buffer size is too small; WithBufferSize() can be used to increase it. + // - kqueue, fen: Not used. + Errors chan error + + mu sync.Mutex + port *unix.EventPort + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + dirs map[string]struct{} // Explicitly watched directories + watches map[string]struct{} // Explicitly watched non-directories +} + +// NewWatcher creates a new Watcher. +func NewWatcher() (*Watcher, error) { + return NewBufferedWatcher(0) +} + +// NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events +// channel. +// +// The main use case for this is situations with a very large number of events +// where the kernel buffer size can't be increased (e.g. due to lack of +// permissions). An unbuffered Watcher will perform better for almost all use +// cases, and whenever possible you will be better off increasing the kernel +// buffers instead of adding a large userspace buffer. +func NewBufferedWatcher(sz uint) (*Watcher, error) { + w := &Watcher{ + Events: make(chan Event, sz), + Errors: make(chan error), + dirs: make(map[string]struct{}), + watches: make(map[string]struct{}), + done: make(chan struct{}), + } + + var err error + w.port, err = unix.NewEventPort() + if err != nil { + return nil, fmt.Errorf("fsnotify.NewWatcher: %w", err) + } + + go w.readEvents() + return w, nil +} + +// sendEvent attempts to send an event to the user, returning true if the event +// was put in the channel successfully and false if the watcher has been closed. +func (w *Watcher) sendEvent(name string, op Op) (sent bool) { + select { + case w.Events <- Event{Name: name, Op: op}: + return true + case <-w.done: + return false + } +} + +// sendError attempts to send an error to the user, returning true if the error +// was put in the channel successfully and false if the watcher has been closed. +func (w *Watcher) sendError(err error) (sent bool) { + select { + case w.Errors <- err: + return true + case <-w.done: + return false + } +} + +func (w *Watcher) isClosed() bool { + select { + case <-w.done: + return true + default: + return false + } +} + +// Close removes all watches and closes the Events channel. +func (w *Watcher) Close() error { + // Take the lock used by associateFile to prevent lingering events from + // being processed after the close + w.mu.Lock() + defer w.mu.Unlock() + if w.isClosed() { + return nil + } + close(w.done) + return w.port.Close() +} + +// Add starts monitoring the path for changes. +// +// A path can only be watched once; watching it more than once is a no-op and will +// not return an error. Paths that do not yet exist on the filesystem cannot be +// watched. +// +// A watch will be automatically removed if the watched path is deleted or +// renamed. The exception is the Windows backend, which doesn't remove the +// watcher on renames. +// +// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special +// filesystems (/proc, /sys, etc.) generally don't work. +// +// Returns [ErrClosed] if [Watcher.Close] was called. +// +// See [Watcher.AddWith] for a version that allows adding options. +// +// # Watching directories +// +// All files in a directory are monitored, including new files that are created +// after the watcher is started. Subdirectories are not watched (i.e. it's +// non-recursive). +// +// # Watching files +// +// Watching individual files (rather than directories) is generally not +// recommended as many programs (especially editors) update files atomically: it +// will write to a temporary file which is then moved to to destination, +// overwriting the original (or some variant thereof). The watcher on the +// original file is now lost, as that no longer exists. +// +// The upshot of this is that a power failure or crash won't leave a +// half-written file. +// +// Watch the parent directory and use Event.Name to filter out files you're not +// interested in. There is an example of this in cmd/fsnotify/file.go. +func (w *Watcher) Add(name string) error { return w.AddWith(name) } + +// AddWith is like [Watcher.Add], but allows adding options. When using Add() +// the defaults described below are used. +// +// Possible options are: +// +// - [WithBufferSize] sets the buffer size for the Windows backend; no-op on +// other platforms. The default is 64K (65536 bytes). +func (w *Watcher) AddWith(name string, opts ...addOpt) error { + if w.isClosed() { + return ErrClosed + } + if w.port.PathIsWatched(name) { + return nil + } + + _ = getOptions(opts...) + + // Currently we resolve symlinks that were explicitly requested to be + // watched. Otherwise we would use LStat here. + stat, err := os.Stat(name) + if err != nil { + return err + } + + // Associate all files in the directory. + if stat.IsDir() { + err := w.handleDirectory(name, stat, true, w.associateFile) + if err != nil { + return err + } + + w.mu.Lock() + w.dirs[name] = struct{}{} + w.mu.Unlock() + return nil + } + + err = w.associateFile(name, stat, true) + if err != nil { + return err + } + + w.mu.Lock() + w.watches[name] = struct{}{} + w.mu.Unlock() + return nil +} + +// Remove stops monitoring the path for changes. +// +// Directories are always removed non-recursively. For example, if you added +// /tmp/dir and /tmp/dir/subdir then you will need to remove both. +// +// Removing a path that has not yet been added returns [ErrNonExistentWatch]. +// +// Returns nil if [Watcher.Close] was called. +func (w *Watcher) Remove(name string) error { + if w.isClosed() { + return nil + } + if !w.port.PathIsWatched(name) { + return fmt.Errorf("%w: %s", ErrNonExistentWatch, name) + } + + // The user has expressed an intent. Immediately remove this name from + // whichever watch list it might be in. If it's not in there the delete + // doesn't cause harm. + w.mu.Lock() + delete(w.watches, name) + delete(w.dirs, name) + w.mu.Unlock() + + stat, err := os.Stat(name) + if err != nil { + return err + } + + // Remove associations for every file in the directory. + if stat.IsDir() { + err := w.handleDirectory(name, stat, false, w.dissociateFile) + if err != nil { + return err + } + return nil + } + + err = w.port.DissociatePath(name) + if err != nil { + return err + } + + return nil +} + +// readEvents contains the main loop that runs in a goroutine watching for events. +func (w *Watcher) readEvents() { + // If this function returns, the watcher has been closed and we can close + // these channels + defer func() { + close(w.Errors) + close(w.Events) + }() + + pevents := make([]unix.PortEvent, 8) + for { + count, err := w.port.Get(pevents, 1, nil) + if err != nil && err != unix.ETIME { + // Interrupted system call (count should be 0) ignore and continue + if errors.Is(err, unix.EINTR) && count == 0 { + continue + } + // Get failed because we called w.Close() + if errors.Is(err, unix.EBADF) && w.isClosed() { + return + } + // There was an error not caused by calling w.Close() + if !w.sendError(err) { + return + } + } + + p := pevents[:count] + for _, pevent := range p { + if pevent.Source != unix.PORT_SOURCE_FILE { + // Event from unexpected source received; should never happen. + if !w.sendError(errors.New("Event from unexpected source received")) { + return + } + continue + } + + err = w.handleEvent(&pevent) + if err != nil { + if !w.sendError(err) { + return + } + } + } + } +} + +func (w *Watcher) handleDirectory(path string, stat os.FileInfo, follow bool, handler func(string, os.FileInfo, bool) error) error { + files, err := os.ReadDir(path) + if err != nil { + return err + } + + // Handle all children of the directory. + for _, entry := range files { + finfo, err := entry.Info() + if err != nil { + return err + } + err = handler(filepath.Join(path, finfo.Name()), finfo, false) + if err != nil { + return err + } + } + + // And finally handle the directory itself. + return handler(path, stat, follow) +} + +// handleEvent might need to emit more than one fsnotify event if the events +// bitmap matches more than one event type (e.g. the file was both modified and +// had the attributes changed between when the association was created and the +// when event was returned) +func (w *Watcher) handleEvent(event *unix.PortEvent) error { + var ( + events = event.Events + path = event.Path + fmode = event.Cookie.(os.FileMode) + reRegister = true + ) + + w.mu.Lock() + _, watchedDir := w.dirs[path] + _, watchedPath := w.watches[path] + w.mu.Unlock() + isWatched := watchedDir || watchedPath + + if events&unix.FILE_DELETE != 0 { + if !w.sendEvent(path, Remove) { + return nil + } + reRegister = false + } + if events&unix.FILE_RENAME_FROM != 0 { + if !w.sendEvent(path, Rename) { + return nil + } + // Don't keep watching the new file name + reRegister = false + } + if events&unix.FILE_RENAME_TO != 0 { + // We don't report a Rename event for this case, because Rename events + // are interpreted as referring to the _old_ name of the file, and in + // this case the event would refer to the new name of the file. This + // type of rename event is not supported by fsnotify. + + // inotify reports a Remove event in this case, so we simulate this + // here. + if !w.sendEvent(path, Remove) { + return nil + } + // Don't keep watching the file that was removed + reRegister = false + } + + // The file is gone, nothing left to do. + if !reRegister { + if watchedDir { + w.mu.Lock() + delete(w.dirs, path) + w.mu.Unlock() + } + if watchedPath { + w.mu.Lock() + delete(w.watches, path) + w.mu.Unlock() + } + return nil + } + + // If we didn't get a deletion the file still exists and we're going to have + // to watch it again. Let's Stat it now so that we can compare permissions + // and have what we need to continue watching the file + + stat, err := os.Lstat(path) + if err != nil { + // This is unexpected, but we should still emit an event. This happens + // most often on "rm -r" of a subdirectory inside a watched directory We + // get a modify event of something happening inside, but by the time we + // get here, the sudirectory is already gone. Clearly we were watching + // this path but now it is gone. Let's tell the user that it was + // removed. + if !w.sendEvent(path, Remove) { + return nil + } + // Suppress extra write events on removed directories; they are not + // informative and can be confusing. + return nil + } + + // resolve symlinks that were explicitly watched as we would have at Add() + // time. this helps suppress spurious Chmod events on watched symlinks + if isWatched { + stat, err = os.Stat(path) + if err != nil { + // The symlink still exists, but the target is gone. Report the + // Remove similar to above. + if !w.sendEvent(path, Remove) { + return nil + } + // Don't return the error + } + } + + if events&unix.FILE_MODIFIED != 0 { + if fmode.IsDir() { + if watchedDir { + if err := w.updateDirectory(path); err != nil { + return err + } + } else { + if !w.sendEvent(path, Write) { + return nil + } + } + } else { + if !w.sendEvent(path, Write) { + return nil + } + } + } + if events&unix.FILE_ATTRIB != 0 && stat != nil { + // Only send Chmod if perms changed + if stat.Mode().Perm() != fmode.Perm() { + if !w.sendEvent(path, Chmod) { + return nil + } + } + } + + if stat != nil { + // If we get here, it means we've hit an event above that requires us to + // continue watching the file or directory + return w.associateFile(path, stat, isWatched) + } + return nil +} + +func (w *Watcher) updateDirectory(path string) error { + // The directory was modified, so we must find unwatched entities and watch + // them. If something was removed from the directory, nothing will happen, + // as everything else should still be watched. + files, err := os.ReadDir(path) + if err != nil { + return err + } + + for _, entry := range files { + path := filepath.Join(path, entry.Name()) + if w.port.PathIsWatched(path) { + continue + } + + finfo, err := entry.Info() + if err != nil { + return err + } + err = w.associateFile(path, finfo, false) + if err != nil { + if !w.sendError(err) { + return nil + } + } + if !w.sendEvent(path, Create) { + return nil + } + } + return nil +} + +func (w *Watcher) associateFile(path string, stat os.FileInfo, follow bool) error { + if w.isClosed() { + return ErrClosed + } + // This is primarily protecting the call to AssociatePath but it is + // important and intentional that the call to PathIsWatched is also + // protected by this mutex. Without this mutex, AssociatePath has been seen + // to error out that the path is already associated. + w.mu.Lock() + defer w.mu.Unlock() + + if w.port.PathIsWatched(path) { + // Remove the old association in favor of this one If we get ENOENT, + // then while the x/sys/unix wrapper still thought that this path was + // associated, the underlying event port did not. This call will have + // cleared up that discrepancy. The most likely cause is that the event + // has fired but we haven't processed it yet. + err := w.port.DissociatePath(path) + if err != nil && err != unix.ENOENT { + return err + } + } + // FILE_NOFOLLOW means we watch symlinks themselves rather than their + // targets. + events := unix.FILE_MODIFIED | unix.FILE_ATTRIB | unix.FILE_NOFOLLOW + if follow { + // We *DO* follow symlinks for explicitly watched entries. + events = unix.FILE_MODIFIED | unix.FILE_ATTRIB + } + return w.port.AssociatePath(path, stat, + events, + stat.Mode()) +} + +func (w *Watcher) dissociateFile(path string, stat os.FileInfo, unused bool) error { + if !w.port.PathIsWatched(path) { + return nil + } + return w.port.DissociatePath(path) +} + +// WatchList returns all paths explicitly added with [Watcher.Add] (and are not +// yet removed). +// +// Returns nil if [Watcher.Close] was called. +func (w *Watcher) WatchList() []string { + if w.isClosed() { + return nil + } + + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)+len(w.dirs)) + for pathname := range w.dirs { + entries = append(entries, pathname) + } + for pathname := range w.watches { + entries = append(entries, pathname) + } + + return entries +} diff --git a/vendor/github.com/fsnotify/fsnotify/backend_inotify.go b/vendor/github.com/fsnotify/fsnotify/backend_inotify.go new file mode 100644 index 0000000000..921c1c1e40 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/backend_inotify.go @@ -0,0 +1,594 @@ +//go:build linux && !appengine +// +build linux,!appengine + +// Note: the documentation on the Watcher type and methods is generated from +// mkdoc.zsh + +package fsnotify + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "sync" + "unsafe" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of paths, delivering events on a channel. +// +// A watcher should not be copied (e.g. pass it by pointer, rather than by +// value). +// +// # Linux notes +// +// When a file is removed a Remove event won't be emitted until all file +// descriptors are closed, and deletes will always emit a Chmod. For example: +// +// fp := os.Open("file") +// os.Remove("file") // Triggers Chmod +// fp.Close() // Triggers Remove +// +// This is the event that inotify sends, so not much can be changed about this. +// +// The fs.inotify.max_user_watches sysctl variable specifies the upper limit +// for the number of watches per user, and fs.inotify.max_user_instances +// specifies the maximum number of inotify instances per user. Every Watcher you +// create is an "instance", and every path you add is a "watch". +// +// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and +// /proc/sys/fs/inotify/max_user_instances +// +// To increase them you can use sysctl or write the value to the /proc file: +// +// # Default values on Linux 5.18 +// sysctl fs.inotify.max_user_watches=124983 +// sysctl fs.inotify.max_user_instances=128 +// +// To make the changes persist on reboot edit /etc/sysctl.conf or +// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check +// your distro's documentation): +// +// fs.inotify.max_user_watches=124983 +// fs.inotify.max_user_instances=128 +// +// Reaching the limit will result in a "no space left on device" or "too many open +// files" error. +// +// # kqueue notes (macOS, BSD) +// +// kqueue requires opening a file descriptor for every file that's being watched; +// so if you're watching a directory with five files then that's six file +// descriptors. You will run in to your system's "max open files" limit faster on +// these platforms. +// +// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to +// control the maximum number of open files, as well as /etc/login.conf on BSD +// systems. +// +// # Windows notes +// +// Paths can be added as "C:\path\to\dir", but forward slashes +// ("C:/path/to/dir") will also work. +// +// When a watched directory is removed it will always send an event for the +// directory itself, but may not send events for all files in that directory. +// Sometimes it will send events for all times, sometimes it will send no +// events, and often only for some files. +// +// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest +// value that is guaranteed to work with SMB filesystems. If you have many +// events in quick succession this may not be enough, and you will have to use +// [WithBufferSize] to increase the value. +type Watcher struct { + // Events sends the filesystem change events. + // + // fsnotify can send the following events; a "path" here can refer to a + // file, directory, symbolic link, or special file like a FIFO. + // + // fsnotify.Create A new path was created; this may be followed by one + // or more Write events if data also gets written to a + // file. + // + // fsnotify.Remove A path was removed. + // + // fsnotify.Rename A path was renamed. A rename is always sent with the + // old path as Event.Name, and a Create event will be + // sent with the new name. Renames are only sent for + // paths that are currently watched; e.g. moving an + // unmonitored file into a monitored directory will + // show up as just a Create. Similarly, renaming a file + // to outside a monitored directory will show up as + // only a Rename. + // + // fsnotify.Write A file or named pipe was written to. A Truncate will + // also trigger a Write. A single "write action" + // initiated by the user may show up as one or multiple + // writes, depending on when the system syncs things to + // disk. For example when compiling a large Go program + // you may get hundreds of Write events, and you may + // want to wait until you've stopped receiving them + // (see the dedup example in cmd/fsnotify). + // + // Some systems may send Write event for directories + // when the directory content changes. + // + // fsnotify.Chmod Attributes were changed. On Linux this is also sent + // when a file is removed (or more accurately, when a + // link to an inode is removed). On kqueue it's sent + // when a file is truncated. On Windows it's never + // sent. + Events chan Event + + // Errors sends any errors. + // + // ErrEventOverflow is used to indicate there are too many events: + // + // - inotify: There are too many queued events (fs.inotify.max_queued_events sysctl) + // - windows: The buffer size is too small; WithBufferSize() can be used to increase it. + // - kqueue, fen: Not used. + Errors chan error + + // Store fd here as os.File.Read() will no longer return on close after + // calling Fd(). See: https://github.com/golang/go/issues/26439 + fd int + inotifyFile *os.File + watches *watches + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + closeMu sync.Mutex + doneResp chan struct{} // Channel to respond to Close +} + +type ( + watches struct { + mu sync.RWMutex + wd map[uint32]*watch // wd → watch + path map[string]uint32 // pathname → wd + } + watch struct { + wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) + flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) + path string // Watch path. + } +) + +func newWatches() *watches { + return &watches{ + wd: make(map[uint32]*watch), + path: make(map[string]uint32), + } +} + +func (w *watches) len() int { + w.mu.RLock() + defer w.mu.RUnlock() + return len(w.wd) +} + +func (w *watches) add(ww *watch) { + w.mu.Lock() + defer w.mu.Unlock() + w.wd[ww.wd] = ww + w.path[ww.path] = ww.wd +} + +func (w *watches) remove(wd uint32) { + w.mu.Lock() + defer w.mu.Unlock() + delete(w.path, w.wd[wd].path) + delete(w.wd, wd) +} + +func (w *watches) removePath(path string) (uint32, bool) { + w.mu.Lock() + defer w.mu.Unlock() + + wd, ok := w.path[path] + if !ok { + return 0, false + } + + delete(w.path, path) + delete(w.wd, wd) + + return wd, true +} + +func (w *watches) byPath(path string) *watch { + w.mu.RLock() + defer w.mu.RUnlock() + return w.wd[w.path[path]] +} + +func (w *watches) byWd(wd uint32) *watch { + w.mu.RLock() + defer w.mu.RUnlock() + return w.wd[wd] +} + +func (w *watches) updatePath(path string, f func(*watch) (*watch, error)) error { + w.mu.Lock() + defer w.mu.Unlock() + + var existing *watch + wd, ok := w.path[path] + if ok { + existing = w.wd[wd] + } + + upd, err := f(existing) + if err != nil { + return err + } + if upd != nil { + w.wd[upd.wd] = upd + w.path[upd.path] = upd.wd + + if upd.wd != wd { + delete(w.wd, wd) + } + } + + return nil +} + +// NewWatcher creates a new Watcher. +func NewWatcher() (*Watcher, error) { + return NewBufferedWatcher(0) +} + +// NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events +// channel. +// +// The main use case for this is situations with a very large number of events +// where the kernel buffer size can't be increased (e.g. due to lack of +// permissions). An unbuffered Watcher will perform better for almost all use +// cases, and whenever possible you will be better off increasing the kernel +// buffers instead of adding a large userspace buffer. +func NewBufferedWatcher(sz uint) (*Watcher, error) { + // Need to set nonblocking mode for SetDeadline to work, otherwise blocking + // I/O operations won't terminate on close. + fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC | unix.IN_NONBLOCK) + if fd == -1 { + return nil, errno + } + + w := &Watcher{ + fd: fd, + inotifyFile: os.NewFile(uintptr(fd), ""), + watches: newWatches(), + Events: make(chan Event, sz), + Errors: make(chan error), + done: make(chan struct{}), + doneResp: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +// Returns true if the event was sent, or false if watcher is closed. +func (w *Watcher) sendEvent(e Event) bool { + select { + case w.Events <- e: + return true + case <-w.done: + return false + } +} + +// Returns true if the error was sent, or false if watcher is closed. +func (w *Watcher) sendError(err error) bool { + select { + case w.Errors <- err: + return true + case <-w.done: + return false + } +} + +func (w *Watcher) isClosed() bool { + select { + case <-w.done: + return true + default: + return false + } +} + +// Close removes all watches and closes the Events channel. +func (w *Watcher) Close() error { + w.closeMu.Lock() + if w.isClosed() { + w.closeMu.Unlock() + return nil + } + close(w.done) + w.closeMu.Unlock() + + // Causes any blocking reads to return with an error, provided the file + // still supports deadline operations. + err := w.inotifyFile.Close() + if err != nil { + return err + } + + // Wait for goroutine to close + <-w.doneResp + + return nil +} + +// Add starts monitoring the path for changes. +// +// A path can only be watched once; watching it more than once is a no-op and will +// not return an error. Paths that do not yet exist on the filesystem cannot be +// watched. +// +// A watch will be automatically removed if the watched path is deleted or +// renamed. The exception is the Windows backend, which doesn't remove the +// watcher on renames. +// +// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special +// filesystems (/proc, /sys, etc.) generally don't work. +// +// Returns [ErrClosed] if [Watcher.Close] was called. +// +// See [Watcher.AddWith] for a version that allows adding options. +// +// # Watching directories +// +// All files in a directory are monitored, including new files that are created +// after the watcher is started. Subdirectories are not watched (i.e. it's +// non-recursive). +// +// # Watching files +// +// Watching individual files (rather than directories) is generally not +// recommended as many programs (especially editors) update files atomically: it +// will write to a temporary file which is then moved to to destination, +// overwriting the original (or some variant thereof). The watcher on the +// original file is now lost, as that no longer exists. +// +// The upshot of this is that a power failure or crash won't leave a +// half-written file. +// +// Watch the parent directory and use Event.Name to filter out files you're not +// interested in. There is an example of this in cmd/fsnotify/file.go. +func (w *Watcher) Add(name string) error { return w.AddWith(name) } + +// AddWith is like [Watcher.Add], but allows adding options. When using Add() +// the defaults described below are used. +// +// Possible options are: +// +// - [WithBufferSize] sets the buffer size for the Windows backend; no-op on +// other platforms. The default is 64K (65536 bytes). +func (w *Watcher) AddWith(name string, opts ...addOpt) error { + if w.isClosed() { + return ErrClosed + } + + name = filepath.Clean(name) + _ = getOptions(opts...) + + var flags uint32 = unix.IN_MOVED_TO | unix.IN_MOVED_FROM | + unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY | + unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF + + return w.watches.updatePath(name, func(existing *watch) (*watch, error) { + if existing != nil { + flags |= existing.flags | unix.IN_MASK_ADD + } + + wd, err := unix.InotifyAddWatch(w.fd, name, flags) + if wd == -1 { + return nil, err + } + + if existing == nil { + return &watch{ + wd: uint32(wd), + path: name, + flags: flags, + }, nil + } + + existing.wd = uint32(wd) + existing.flags = flags + return existing, nil + }) +} + +// Remove stops monitoring the path for changes. +// +// Directories are always removed non-recursively. For example, if you added +// /tmp/dir and /tmp/dir/subdir then you will need to remove both. +// +// Removing a path that has not yet been added returns [ErrNonExistentWatch]. +// +// Returns nil if [Watcher.Close] was called. +func (w *Watcher) Remove(name string) error { + if w.isClosed() { + return nil + } + return w.remove(filepath.Clean(name)) +} + +func (w *Watcher) remove(name string) error { + wd, ok := w.watches.removePath(name) + if !ok { + return fmt.Errorf("%w: %s", ErrNonExistentWatch, name) + } + + success, errno := unix.InotifyRmWatch(w.fd, wd) + if success == -1 { + // TODO: Perhaps it's not helpful to return an error here in every case; + // The only two possible errors are: + // + // - EBADF, which happens when w.fd is not a valid file descriptor + // of any kind. + // - EINVAL, which is when fd is not an inotify descriptor or wd + // is not a valid watch descriptor. Watch descriptors are + // invalidated when they are removed explicitly or implicitly; + // explicitly by inotify_rm_watch, implicitly when the file they + // are watching is deleted. + return errno + } + return nil +} + +// WatchList returns all paths explicitly added with [Watcher.Add] (and are not +// yet removed). +// +// Returns nil if [Watcher.Close] was called. +func (w *Watcher) WatchList() []string { + if w.isClosed() { + return nil + } + + entries := make([]string, 0, w.watches.len()) + w.watches.mu.RLock() + for pathname := range w.watches.path { + entries = append(entries, pathname) + } + w.watches.mu.RUnlock() + + return entries +} + +// readEvents reads from the inotify file descriptor, converts the +// received events into Event objects and sends them via the Events channel +func (w *Watcher) readEvents() { + defer func() { + close(w.doneResp) + close(w.Errors) + close(w.Events) + }() + + var ( + buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events + errno error // Syscall errno + ) + for { + // See if we have been closed. + if w.isClosed() { + return + } + + n, err := w.inotifyFile.Read(buf[:]) + switch { + case errors.Unwrap(err) == os.ErrClosed: + return + case err != nil: + if !w.sendError(err) { + return + } + continue + } + + if n < unix.SizeofInotifyEvent { + var err error + if n == 0 { + err = io.EOF // If EOF is received. This should really never happen. + } else if n < 0 { + err = errno // If an error occurred while reading. + } else { + err = errors.New("notify: short read in readEvents()") // Read was too short. + } + if !w.sendError(err) { + return + } + continue + } + + var offset uint32 + // We don't know how many events we just read into the buffer + // While the offset points to at least one whole event... + for offset <= uint32(n-unix.SizeofInotifyEvent) { + var ( + // Point "raw" to the event in the buffer + raw = (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset])) + mask = uint32(raw.Mask) + nameLen = uint32(raw.Len) + ) + + if mask&unix.IN_Q_OVERFLOW != 0 { + if !w.sendError(ErrEventOverflow) { + return + } + } + + // If the event happened to the watched directory or the watched file, the kernel + // doesn't append the filename to the event, but we would like to always fill the + // the "Name" field with a valid filename. We retrieve the path of the watch from + // the "paths" map. + watch := w.watches.byWd(uint32(raw.Wd)) + + // inotify will automatically remove the watch on deletes; just need + // to clean our state here. + if watch != nil && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF { + w.watches.remove(watch.wd) + } + // We can't really update the state when a watched path is moved; + // only IN_MOVE_SELF is sent and not IN_MOVED_{FROM,TO}. So remove + // the watch. + if watch != nil && mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF { + err := w.remove(watch.path) + if err != nil && !errors.Is(err, ErrNonExistentWatch) { + if !w.sendError(err) { + return + } + } + } + + var name string + if watch != nil { + name = watch.path + } + if nameLen > 0 { + // Point "bytes" at the first byte of the filename + bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))[:nameLen:nameLen] + // The filename is padded with NULL bytes. TrimRight() gets rid of those. + name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") + } + + event := w.newEvent(name, mask) + + // Send the events that are not ignored on the events channel + if mask&unix.IN_IGNORED == 0 { + if !w.sendEvent(event) { + return + } + } + + // Move to the next event in the buffer + offset += unix.SizeofInotifyEvent + nameLen + } + } +} + +// newEvent returns an platform-independent Event based on an inotify mask. +func (w *Watcher) newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO { + e.Op |= Create + } + if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE { + e.Op |= Remove + } + if mask&unix.IN_MODIFY == unix.IN_MODIFY { + e.Op |= Write + } + if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM { + e.Op |= Rename + } + if mask&unix.IN_ATTRIB == unix.IN_ATTRIB { + e.Op |= Chmod + } + return e +} diff --git a/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go b/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go new file mode 100644 index 0000000000..063a0915a0 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go @@ -0,0 +1,782 @@ +//go:build freebsd || openbsd || netbsd || dragonfly || darwin +// +build freebsd openbsd netbsd dragonfly darwin + +// Note: the documentation on the Watcher type and methods is generated from +// mkdoc.zsh + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "sync" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of paths, delivering events on a channel. +// +// A watcher should not be copied (e.g. pass it by pointer, rather than by +// value). +// +// # Linux notes +// +// When a file is removed a Remove event won't be emitted until all file +// descriptors are closed, and deletes will always emit a Chmod. For example: +// +// fp := os.Open("file") +// os.Remove("file") // Triggers Chmod +// fp.Close() // Triggers Remove +// +// This is the event that inotify sends, so not much can be changed about this. +// +// The fs.inotify.max_user_watches sysctl variable specifies the upper limit +// for the number of watches per user, and fs.inotify.max_user_instances +// specifies the maximum number of inotify instances per user. Every Watcher you +// create is an "instance", and every path you add is a "watch". +// +// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and +// /proc/sys/fs/inotify/max_user_instances +// +// To increase them you can use sysctl or write the value to the /proc file: +// +// # Default values on Linux 5.18 +// sysctl fs.inotify.max_user_watches=124983 +// sysctl fs.inotify.max_user_instances=128 +// +// To make the changes persist on reboot edit /etc/sysctl.conf or +// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check +// your distro's documentation): +// +// fs.inotify.max_user_watches=124983 +// fs.inotify.max_user_instances=128 +// +// Reaching the limit will result in a "no space left on device" or "too many open +// files" error. +// +// # kqueue notes (macOS, BSD) +// +// kqueue requires opening a file descriptor for every file that's being watched; +// so if you're watching a directory with five files then that's six file +// descriptors. You will run in to your system's "max open files" limit faster on +// these platforms. +// +// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to +// control the maximum number of open files, as well as /etc/login.conf on BSD +// systems. +// +// # Windows notes +// +// Paths can be added as "C:\path\to\dir", but forward slashes +// ("C:/path/to/dir") will also work. +// +// When a watched directory is removed it will always send an event for the +// directory itself, but may not send events for all files in that directory. +// Sometimes it will send events for all times, sometimes it will send no +// events, and often only for some files. +// +// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest +// value that is guaranteed to work with SMB filesystems. If you have many +// events in quick succession this may not be enough, and you will have to use +// [WithBufferSize] to increase the value. +type Watcher struct { + // Events sends the filesystem change events. + // + // fsnotify can send the following events; a "path" here can refer to a + // file, directory, symbolic link, or special file like a FIFO. + // + // fsnotify.Create A new path was created; this may be followed by one + // or more Write events if data also gets written to a + // file. + // + // fsnotify.Remove A path was removed. + // + // fsnotify.Rename A path was renamed. A rename is always sent with the + // old path as Event.Name, and a Create event will be + // sent with the new name. Renames are only sent for + // paths that are currently watched; e.g. moving an + // unmonitored file into a monitored directory will + // show up as just a Create. Similarly, renaming a file + // to outside a monitored directory will show up as + // only a Rename. + // + // fsnotify.Write A file or named pipe was written to. A Truncate will + // also trigger a Write. A single "write action" + // initiated by the user may show up as one or multiple + // writes, depending on when the system syncs things to + // disk. For example when compiling a large Go program + // you may get hundreds of Write events, and you may + // want to wait until you've stopped receiving them + // (see the dedup example in cmd/fsnotify). + // + // Some systems may send Write event for directories + // when the directory content changes. + // + // fsnotify.Chmod Attributes were changed. On Linux this is also sent + // when a file is removed (or more accurately, when a + // link to an inode is removed). On kqueue it's sent + // when a file is truncated. On Windows it's never + // sent. + Events chan Event + + // Errors sends any errors. + // + // ErrEventOverflow is used to indicate there are too many events: + // + // - inotify: There are too many queued events (fs.inotify.max_queued_events sysctl) + // - windows: The buffer size is too small; WithBufferSize() can be used to increase it. + // - kqueue, fen: Not used. + Errors chan error + + done chan struct{} + kq int // File descriptor (as returned by the kqueue() syscall). + closepipe [2]int // Pipe used for closing. + mu sync.Mutex // Protects access to watcher data + watches map[string]int // Watched file descriptors (key: path). + watchesByDir map[string]map[int]struct{} // Watched file descriptors indexed by the parent directory (key: dirname(path)). + userWatches map[string]struct{} // Watches added with Watcher.Add() + dirFlags map[string]uint32 // Watched directories to fflags used in kqueue. + paths map[int]pathInfo // File descriptors to path names for processing kqueue events. + fileExists map[string]struct{} // Keep track of if we know this file exists (to stop duplicate create events). + isClosed bool // Set to true when Close() is first called +} + +type pathInfo struct { + name string + isDir bool +} + +// NewWatcher creates a new Watcher. +func NewWatcher() (*Watcher, error) { + return NewBufferedWatcher(0) +} + +// NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events +// channel. +// +// The main use case for this is situations with a very large number of events +// where the kernel buffer size can't be increased (e.g. due to lack of +// permissions). An unbuffered Watcher will perform better for almost all use +// cases, and whenever possible you will be better off increasing the kernel +// buffers instead of adding a large userspace buffer. +func NewBufferedWatcher(sz uint) (*Watcher, error) { + kq, closepipe, err := newKqueue() + if err != nil { + return nil, err + } + + w := &Watcher{ + kq: kq, + closepipe: closepipe, + watches: make(map[string]int), + watchesByDir: make(map[string]map[int]struct{}), + dirFlags: make(map[string]uint32), + paths: make(map[int]pathInfo), + fileExists: make(map[string]struct{}), + userWatches: make(map[string]struct{}), + Events: make(chan Event, sz), + Errors: make(chan error), + done: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +// newKqueue creates a new kernel event queue and returns a descriptor. +// +// This registers a new event on closepipe, which will trigger an event when +// it's closed. This way we can use kevent() without timeout/polling; without +// the closepipe, it would block forever and we wouldn't be able to stop it at +// all. +func newKqueue() (kq int, closepipe [2]int, err error) { + kq, err = unix.Kqueue() + if kq == -1 { + return kq, closepipe, err + } + + // Register the close pipe. + err = unix.Pipe(closepipe[:]) + if err != nil { + unix.Close(kq) + return kq, closepipe, err + } + + // Register changes to listen on the closepipe. + changes := make([]unix.Kevent_t, 1) + // SetKevent converts int to the platform-specific types. + unix.SetKevent(&changes[0], closepipe[0], unix.EVFILT_READ, + unix.EV_ADD|unix.EV_ENABLE|unix.EV_ONESHOT) + + ok, err := unix.Kevent(kq, changes, nil, nil) + if ok == -1 { + unix.Close(kq) + unix.Close(closepipe[0]) + unix.Close(closepipe[1]) + return kq, closepipe, err + } + return kq, closepipe, nil +} + +// Returns true if the event was sent, or false if watcher is closed. +func (w *Watcher) sendEvent(e Event) bool { + select { + case w.Events <- e: + return true + case <-w.done: + return false + } +} + +// Returns true if the error was sent, or false if watcher is closed. +func (w *Watcher) sendError(err error) bool { + select { + case w.Errors <- err: + return true + case <-w.done: + return false + } +} + +// Close removes all watches and closes the Events channel. +func (w *Watcher) Close() error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return nil + } + w.isClosed = true + + // copy paths to remove while locked + pathsToRemove := make([]string, 0, len(w.watches)) + for name := range w.watches { + pathsToRemove = append(pathsToRemove, name) + } + w.mu.Unlock() // Unlock before calling Remove, which also locks + for _, name := range pathsToRemove { + w.Remove(name) + } + + // Send "quit" message to the reader goroutine. + unix.Close(w.closepipe[1]) + close(w.done) + + return nil +} + +// Add starts monitoring the path for changes. +// +// A path can only be watched once; watching it more than once is a no-op and will +// not return an error. Paths that do not yet exist on the filesystem cannot be +// watched. +// +// A watch will be automatically removed if the watched path is deleted or +// renamed. The exception is the Windows backend, which doesn't remove the +// watcher on renames. +// +// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special +// filesystems (/proc, /sys, etc.) generally don't work. +// +// Returns [ErrClosed] if [Watcher.Close] was called. +// +// See [Watcher.AddWith] for a version that allows adding options. +// +// # Watching directories +// +// All files in a directory are monitored, including new files that are created +// after the watcher is started. Subdirectories are not watched (i.e. it's +// non-recursive). +// +// # Watching files +// +// Watching individual files (rather than directories) is generally not +// recommended as many programs (especially editors) update files atomically: it +// will write to a temporary file which is then moved to to destination, +// overwriting the original (or some variant thereof). The watcher on the +// original file is now lost, as that no longer exists. +// +// The upshot of this is that a power failure or crash won't leave a +// half-written file. +// +// Watch the parent directory and use Event.Name to filter out files you're not +// interested in. There is an example of this in cmd/fsnotify/file.go. +func (w *Watcher) Add(name string) error { return w.AddWith(name) } + +// AddWith is like [Watcher.Add], but allows adding options. When using Add() +// the defaults described below are used. +// +// Possible options are: +// +// - [WithBufferSize] sets the buffer size for the Windows backend; no-op on +// other platforms. The default is 64K (65536 bytes). +func (w *Watcher) AddWith(name string, opts ...addOpt) error { + _ = getOptions(opts...) + + w.mu.Lock() + w.userWatches[name] = struct{}{} + w.mu.Unlock() + _, err := w.addWatch(name, noteAllEvents) + return err +} + +// Remove stops monitoring the path for changes. +// +// Directories are always removed non-recursively. For example, if you added +// /tmp/dir and /tmp/dir/subdir then you will need to remove both. +// +// Removing a path that has not yet been added returns [ErrNonExistentWatch]. +// +// Returns nil if [Watcher.Close] was called. +func (w *Watcher) Remove(name string) error { + return w.remove(name, true) +} + +func (w *Watcher) remove(name string, unwatchFiles bool) error { + name = filepath.Clean(name) + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return nil + } + watchfd, ok := w.watches[name] + w.mu.Unlock() + if !ok { + return fmt.Errorf("%w: %s", ErrNonExistentWatch, name) + } + + err := w.register([]int{watchfd}, unix.EV_DELETE, 0) + if err != nil { + return err + } + + unix.Close(watchfd) + + w.mu.Lock() + isDir := w.paths[watchfd].isDir + delete(w.watches, name) + delete(w.userWatches, name) + + parentName := filepath.Dir(name) + delete(w.watchesByDir[parentName], watchfd) + + if len(w.watchesByDir[parentName]) == 0 { + delete(w.watchesByDir, parentName) + } + + delete(w.paths, watchfd) + delete(w.dirFlags, name) + delete(w.fileExists, name) + w.mu.Unlock() + + // Find all watched paths that are in this directory that are not external. + if unwatchFiles && isDir { + var pathsToRemove []string + w.mu.Lock() + for fd := range w.watchesByDir[name] { + path := w.paths[fd] + if _, ok := w.userWatches[path.name]; !ok { + pathsToRemove = append(pathsToRemove, path.name) + } + } + w.mu.Unlock() + for _, name := range pathsToRemove { + // Since these are internal, not much sense in propagating error to + // the user, as that will just confuse them with an error about a + // path they did not explicitly watch themselves. + w.Remove(name) + } + } + return nil +} + +// WatchList returns all paths explicitly added with [Watcher.Add] (and are not +// yet removed). +// +// Returns nil if [Watcher.Close] was called. +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + if w.isClosed { + return nil + } + + entries := make([]string, 0, len(w.userWatches)) + for pathname := range w.userWatches { + entries = append(entries, pathname) + } + + return entries +} + +// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) +const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME + +// addWatch adds name to the watched file set; the flags are interpreted as +// described in kevent(2). +// +// Returns the real path to the file which was added, with symlinks resolved. +func (w *Watcher) addWatch(name string, flags uint32) (string, error) { + var isDir bool + name = filepath.Clean(name) + + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return "", ErrClosed + } + watchfd, alreadyWatching := w.watches[name] + // We already have a watch, but we can still override flags. + if alreadyWatching { + isDir = w.paths[watchfd].isDir + } + w.mu.Unlock() + + if !alreadyWatching { + fi, err := os.Lstat(name) + if err != nil { + return "", err + } + + // Don't watch sockets or named pipes + if (fi.Mode()&os.ModeSocket == os.ModeSocket) || (fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe) { + return "", nil + } + + // Follow Symlinks. + if fi.Mode()&os.ModeSymlink == os.ModeSymlink { + link, err := os.Readlink(name) + if err != nil { + // Return nil because Linux can add unresolvable symlinks to the + // watch list without problems, so maintain consistency with + // that. There will be no file events for broken symlinks. + // TODO: more specific check; returns os.PathError; ENOENT? + return "", nil + } + + w.mu.Lock() + _, alreadyWatching = w.watches[link] + w.mu.Unlock() + + if alreadyWatching { + // Add to watches so we don't get spurious Create events later + // on when we diff the directories. + w.watches[name] = 0 + w.fileExists[name] = struct{}{} + return link, nil + } + + name = link + fi, err = os.Lstat(name) + if err != nil { + return "", nil + } + } + + // Retry on EINTR; open() can return EINTR in practice on macOS. + // See #354, and Go issues 11180 and 39237. + for { + watchfd, err = unix.Open(name, openMode, 0) + if err == nil { + break + } + if errors.Is(err, unix.EINTR) { + continue + } + + return "", err + } + + isDir = fi.IsDir() + } + + err := w.register([]int{watchfd}, unix.EV_ADD|unix.EV_CLEAR|unix.EV_ENABLE, flags) + if err != nil { + unix.Close(watchfd) + return "", err + } + + if !alreadyWatching { + w.mu.Lock() + parentName := filepath.Dir(name) + w.watches[name] = watchfd + + watchesByDir, ok := w.watchesByDir[parentName] + if !ok { + watchesByDir = make(map[int]struct{}, 1) + w.watchesByDir[parentName] = watchesByDir + } + watchesByDir[watchfd] = struct{}{} + w.paths[watchfd] = pathInfo{name: name, isDir: isDir} + w.mu.Unlock() + } + + if isDir { + // Watch the directory if it has not been watched before, or if it was + // watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) + w.mu.Lock() + + watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE && + (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE) + // Store flags so this watch can be updated later + w.dirFlags[name] = flags + w.mu.Unlock() + + if watchDir { + if err := w.watchDirectoryFiles(name); err != nil { + return "", err + } + } + } + return name, nil +} + +// readEvents reads from kqueue and converts the received kevents into +// Event values that it sends down the Events channel. +func (w *Watcher) readEvents() { + defer func() { + close(w.Events) + close(w.Errors) + _ = unix.Close(w.kq) + unix.Close(w.closepipe[0]) + }() + + eventBuffer := make([]unix.Kevent_t, 10) + for closed := false; !closed; { + kevents, err := w.read(eventBuffer) + // EINTR is okay, the syscall was interrupted before timeout expired. + if err != nil && err != unix.EINTR { + if !w.sendError(fmt.Errorf("fsnotify.readEvents: %w", err)) { + closed = true + } + continue + } + + // Flush the events we received to the Events channel + for _, kevent := range kevents { + var ( + watchfd = int(kevent.Ident) + mask = uint32(kevent.Fflags) + ) + + // Shut down the loop when the pipe is closed, but only after all + // other events have been processed. + if watchfd == w.closepipe[0] { + closed = true + continue + } + + w.mu.Lock() + path := w.paths[watchfd] + w.mu.Unlock() + + event := w.newEvent(path.name, mask) + + if event.Has(Rename) || event.Has(Remove) { + w.remove(event.Name, false) + w.mu.Lock() + delete(w.fileExists, event.Name) + w.mu.Unlock() + } + + if path.isDir && event.Has(Write) && !event.Has(Remove) { + w.sendDirectoryChangeEvents(event.Name) + } else { + if !w.sendEvent(event) { + closed = true + continue + } + } + + if event.Has(Remove) { + // Look for a file that may have overwritten this; for example, + // mv f1 f2 will delete f2, then create f2. + if path.isDir { + fileDir := filepath.Clean(event.Name) + w.mu.Lock() + _, found := w.watches[fileDir] + w.mu.Unlock() + if found { + err := w.sendDirectoryChangeEvents(fileDir) + if err != nil { + if !w.sendError(err) { + closed = true + } + } + } + } else { + filePath := filepath.Clean(event.Name) + if fi, err := os.Lstat(filePath); err == nil { + err := w.sendFileCreatedEventIfNew(filePath, fi) + if err != nil { + if !w.sendError(err) { + closed = true + } + } + } + } + } + } + } +} + +// newEvent returns an platform-independent Event based on kqueue Fflags. +func (w *Watcher) newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.NOTE_DELETE == unix.NOTE_DELETE { + e.Op |= Remove + } + if mask&unix.NOTE_WRITE == unix.NOTE_WRITE { + e.Op |= Write + } + if mask&unix.NOTE_RENAME == unix.NOTE_RENAME { + e.Op |= Rename + } + if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB { + e.Op |= Chmod + } + // No point sending a write and delete event at the same time: if it's gone, + // then it's gone. + if e.Op.Has(Write) && e.Op.Has(Remove) { + e.Op &^= Write + } + return e +} + +// watchDirectoryFiles to mimic inotify when adding a watch on a directory +func (w *Watcher) watchDirectoryFiles(dirPath string) error { + // Get all files + files, err := os.ReadDir(dirPath) + if err != nil { + return err + } + + for _, f := range files { + path := filepath.Join(dirPath, f.Name()) + + fi, err := f.Info() + if err != nil { + return fmt.Errorf("%q: %w", path, err) + } + + cleanPath, err := w.internalWatch(path, fi) + if err != nil { + // No permission to read the file; that's not a problem: just skip. + // But do add it to w.fileExists to prevent it from being picked up + // as a "new" file later (it still shows up in the directory + // listing). + switch { + case errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM): + cleanPath = filepath.Clean(path) + default: + return fmt.Errorf("%q: %w", path, err) + } + } + + w.mu.Lock() + w.fileExists[cleanPath] = struct{}{} + w.mu.Unlock() + } + + return nil +} + +// Search the directory for new files and send an event for them. +// +// This functionality is to have the BSD watcher match the inotify, which sends +// a create event for files created in a watched directory. +func (w *Watcher) sendDirectoryChangeEvents(dir string) error { + files, err := os.ReadDir(dir) + if err != nil { + // Directory no longer exists: we can ignore this safely. kqueue will + // still give us the correct events. + if errors.Is(err, os.ErrNotExist) { + return nil + } + return fmt.Errorf("fsnotify.sendDirectoryChangeEvents: %w", err) + } + + for _, f := range files { + fi, err := f.Info() + if err != nil { + return fmt.Errorf("fsnotify.sendDirectoryChangeEvents: %w", err) + } + + err = w.sendFileCreatedEventIfNew(filepath.Join(dir, fi.Name()), fi) + if err != nil { + // Don't need to send an error if this file isn't readable. + if errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM) { + return nil + } + return fmt.Errorf("fsnotify.sendDirectoryChangeEvents: %w", err) + } + } + return nil +} + +// sendFileCreatedEvent sends a create event if the file isn't already being tracked. +func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fi os.FileInfo) (err error) { + w.mu.Lock() + _, doesExist := w.fileExists[filePath] + w.mu.Unlock() + if !doesExist { + if !w.sendEvent(Event{Name: filePath, Op: Create}) { + return + } + } + + // like watchDirectoryFiles (but without doing another ReadDir) + filePath, err = w.internalWatch(filePath, fi) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = struct{}{} + w.mu.Unlock() + + return nil +} + +func (w *Watcher) internalWatch(name string, fi os.FileInfo) (string, error) { + if fi.IsDir() { + // mimic Linux providing delete events for subdirectories, but preserve + // the flags used if currently watching subdirectory + w.mu.Lock() + flags := w.dirFlags[name] + w.mu.Unlock() + + flags |= unix.NOTE_DELETE | unix.NOTE_RENAME + return w.addWatch(name, flags) + } + + // watch file to mimic Linux inotify + return w.addWatch(name, noteAllEvents) +} + +// Register events with the queue. +func (w *Watcher) register(fds []int, flags int, fflags uint32) error { + changes := make([]unix.Kevent_t, len(fds)) + for i, fd := range fds { + // SetKevent converts int to the platform-specific types. + unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags) + changes[i].Fflags = fflags + } + + // Register the events. + success, err := unix.Kevent(w.kq, changes, nil, nil) + if success == -1 { + return err + } + return nil +} + +// read retrieves pending events, or waits until an event occurs. +func (w *Watcher) read(events []unix.Kevent_t) ([]unix.Kevent_t, error) { + n, err := unix.Kevent(w.kq, nil, events, nil) + if err != nil { + return nil, err + } + return events[0:n], nil +} diff --git a/vendor/github.com/fsnotify/fsnotify/backend_other.go b/vendor/github.com/fsnotify/fsnotify/backend_other.go new file mode 100644 index 0000000000..d34a23c015 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/backend_other.go @@ -0,0 +1,205 @@ +//go:build appengine || (!darwin && !dragonfly && !freebsd && !openbsd && !linux && !netbsd && !solaris && !windows) +// +build appengine !darwin,!dragonfly,!freebsd,!openbsd,!linux,!netbsd,!solaris,!windows + +// Note: the documentation on the Watcher type and methods is generated from +// mkdoc.zsh + +package fsnotify + +import "errors" + +// Watcher watches a set of paths, delivering events on a channel. +// +// A watcher should not be copied (e.g. pass it by pointer, rather than by +// value). +// +// # Linux notes +// +// When a file is removed a Remove event won't be emitted until all file +// descriptors are closed, and deletes will always emit a Chmod. For example: +// +// fp := os.Open("file") +// os.Remove("file") // Triggers Chmod +// fp.Close() // Triggers Remove +// +// This is the event that inotify sends, so not much can be changed about this. +// +// The fs.inotify.max_user_watches sysctl variable specifies the upper limit +// for the number of watches per user, and fs.inotify.max_user_instances +// specifies the maximum number of inotify instances per user. Every Watcher you +// create is an "instance", and every path you add is a "watch". +// +// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and +// /proc/sys/fs/inotify/max_user_instances +// +// To increase them you can use sysctl or write the value to the /proc file: +// +// # Default values on Linux 5.18 +// sysctl fs.inotify.max_user_watches=124983 +// sysctl fs.inotify.max_user_instances=128 +// +// To make the changes persist on reboot edit /etc/sysctl.conf or +// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check +// your distro's documentation): +// +// fs.inotify.max_user_watches=124983 +// fs.inotify.max_user_instances=128 +// +// Reaching the limit will result in a "no space left on device" or "too many open +// files" error. +// +// # kqueue notes (macOS, BSD) +// +// kqueue requires opening a file descriptor for every file that's being watched; +// so if you're watching a directory with five files then that's six file +// descriptors. You will run in to your system's "max open files" limit faster on +// these platforms. +// +// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to +// control the maximum number of open files, as well as /etc/login.conf on BSD +// systems. +// +// # Windows notes +// +// Paths can be added as "C:\path\to\dir", but forward slashes +// ("C:/path/to/dir") will also work. +// +// When a watched directory is removed it will always send an event for the +// directory itself, but may not send events for all files in that directory. +// Sometimes it will send events for all times, sometimes it will send no +// events, and often only for some files. +// +// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest +// value that is guaranteed to work with SMB filesystems. If you have many +// events in quick succession this may not be enough, and you will have to use +// [WithBufferSize] to increase the value. +type Watcher struct { + // Events sends the filesystem change events. + // + // fsnotify can send the following events; a "path" here can refer to a + // file, directory, symbolic link, or special file like a FIFO. + // + // fsnotify.Create A new path was created; this may be followed by one + // or more Write events if data also gets written to a + // file. + // + // fsnotify.Remove A path was removed. + // + // fsnotify.Rename A path was renamed. A rename is always sent with the + // old path as Event.Name, and a Create event will be + // sent with the new name. Renames are only sent for + // paths that are currently watched; e.g. moving an + // unmonitored file into a monitored directory will + // show up as just a Create. Similarly, renaming a file + // to outside a monitored directory will show up as + // only a Rename. + // + // fsnotify.Write A file or named pipe was written to. A Truncate will + // also trigger a Write. A single "write action" + // initiated by the user may show up as one or multiple + // writes, depending on when the system syncs things to + // disk. For example when compiling a large Go program + // you may get hundreds of Write events, and you may + // want to wait until you've stopped receiving them + // (see the dedup example in cmd/fsnotify). + // + // Some systems may send Write event for directories + // when the directory content changes. + // + // fsnotify.Chmod Attributes were changed. On Linux this is also sent + // when a file is removed (or more accurately, when a + // link to an inode is removed). On kqueue it's sent + // when a file is truncated. On Windows it's never + // sent. + Events chan Event + + // Errors sends any errors. + // + // ErrEventOverflow is used to indicate there are too many events: + // + // - inotify: There are too many queued events (fs.inotify.max_queued_events sysctl) + // - windows: The buffer size is too small; WithBufferSize() can be used to increase it. + // - kqueue, fen: Not used. + Errors chan error +} + +// NewWatcher creates a new Watcher. +func NewWatcher() (*Watcher, error) { + return nil, errors.New("fsnotify not supported on the current platform") +} + +// NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events +// channel. +// +// The main use case for this is situations with a very large number of events +// where the kernel buffer size can't be increased (e.g. due to lack of +// permissions). An unbuffered Watcher will perform better for almost all use +// cases, and whenever possible you will be better off increasing the kernel +// buffers instead of adding a large userspace buffer. +func NewBufferedWatcher(sz uint) (*Watcher, error) { return NewWatcher() } + +// Close removes all watches and closes the Events channel. +func (w *Watcher) Close() error { return nil } + +// WatchList returns all paths explicitly added with [Watcher.Add] (and are not +// yet removed). +// +// Returns nil if [Watcher.Close] was called. +func (w *Watcher) WatchList() []string { return nil } + +// Add starts monitoring the path for changes. +// +// A path can only be watched once; watching it more than once is a no-op and will +// not return an error. Paths that do not yet exist on the filesystem cannot be +// watched. +// +// A watch will be automatically removed if the watched path is deleted or +// renamed. The exception is the Windows backend, which doesn't remove the +// watcher on renames. +// +// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special +// filesystems (/proc, /sys, etc.) generally don't work. +// +// Returns [ErrClosed] if [Watcher.Close] was called. +// +// See [Watcher.AddWith] for a version that allows adding options. +// +// # Watching directories +// +// All files in a directory are monitored, including new files that are created +// after the watcher is started. Subdirectories are not watched (i.e. it's +// non-recursive). +// +// # Watching files +// +// Watching individual files (rather than directories) is generally not +// recommended as many programs (especially editors) update files atomically: it +// will write to a temporary file which is then moved to to destination, +// overwriting the original (or some variant thereof). The watcher on the +// original file is now lost, as that no longer exists. +// +// The upshot of this is that a power failure or crash won't leave a +// half-written file. +// +// Watch the parent directory and use Event.Name to filter out files you're not +// interested in. There is an example of this in cmd/fsnotify/file.go. +func (w *Watcher) Add(name string) error { return nil } + +// AddWith is like [Watcher.Add], but allows adding options. When using Add() +// the defaults described below are used. +// +// Possible options are: +// +// - [WithBufferSize] sets the buffer size for the Windows backend; no-op on +// other platforms. The default is 64K (65536 bytes). +func (w *Watcher) AddWith(name string, opts ...addOpt) error { return nil } + +// Remove stops monitoring the path for changes. +// +// Directories are always removed non-recursively. For example, if you added +// /tmp/dir and /tmp/dir/subdir then you will need to remove both. +// +// Removing a path that has not yet been added returns [ErrNonExistentWatch]. +// +// Returns nil if [Watcher.Close] was called. +func (w *Watcher) Remove(name string) error { return nil } diff --git a/vendor/github.com/fsnotify/fsnotify/backend_windows.go b/vendor/github.com/fsnotify/fsnotify/backend_windows.go new file mode 100644 index 0000000000..9bc91e5d61 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/backend_windows.go @@ -0,0 +1,827 @@ +//go:build windows +// +build windows + +// Windows backend based on ReadDirectoryChangesW() +// +// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readdirectorychangesw +// +// Note: the documentation on the Watcher type and methods is generated from +// mkdoc.zsh + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "reflect" + "runtime" + "strings" + "sync" + "unsafe" + + "golang.org/x/sys/windows" +) + +// Watcher watches a set of paths, delivering events on a channel. +// +// A watcher should not be copied (e.g. pass it by pointer, rather than by +// value). +// +// # Linux notes +// +// When a file is removed a Remove event won't be emitted until all file +// descriptors are closed, and deletes will always emit a Chmod. For example: +// +// fp := os.Open("file") +// os.Remove("file") // Triggers Chmod +// fp.Close() // Triggers Remove +// +// This is the event that inotify sends, so not much can be changed about this. +// +// The fs.inotify.max_user_watches sysctl variable specifies the upper limit +// for the number of watches per user, and fs.inotify.max_user_instances +// specifies the maximum number of inotify instances per user. Every Watcher you +// create is an "instance", and every path you add is a "watch". +// +// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and +// /proc/sys/fs/inotify/max_user_instances +// +// To increase them you can use sysctl or write the value to the /proc file: +// +// # Default values on Linux 5.18 +// sysctl fs.inotify.max_user_watches=124983 +// sysctl fs.inotify.max_user_instances=128 +// +// To make the changes persist on reboot edit /etc/sysctl.conf or +// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check +// your distro's documentation): +// +// fs.inotify.max_user_watches=124983 +// fs.inotify.max_user_instances=128 +// +// Reaching the limit will result in a "no space left on device" or "too many open +// files" error. +// +// # kqueue notes (macOS, BSD) +// +// kqueue requires opening a file descriptor for every file that's being watched; +// so if you're watching a directory with five files then that's six file +// descriptors. You will run in to your system's "max open files" limit faster on +// these platforms. +// +// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to +// control the maximum number of open files, as well as /etc/login.conf on BSD +// systems. +// +// # Windows notes +// +// Paths can be added as "C:\path\to\dir", but forward slashes +// ("C:/path/to/dir") will also work. +// +// When a watched directory is removed it will always send an event for the +// directory itself, but may not send events for all files in that directory. +// Sometimes it will send events for all times, sometimes it will send no +// events, and often only for some files. +// +// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest +// value that is guaranteed to work with SMB filesystems. If you have many +// events in quick succession this may not be enough, and you will have to use +// [WithBufferSize] to increase the value. +type Watcher struct { + // Events sends the filesystem change events. + // + // fsnotify can send the following events; a "path" here can refer to a + // file, directory, symbolic link, or special file like a FIFO. + // + // fsnotify.Create A new path was created; this may be followed by one + // or more Write events if data also gets written to a + // file. + // + // fsnotify.Remove A path was removed. + // + // fsnotify.Rename A path was renamed. A rename is always sent with the + // old path as Event.Name, and a Create event will be + // sent with the new name. Renames are only sent for + // paths that are currently watched; e.g. moving an + // unmonitored file into a monitored directory will + // show up as just a Create. Similarly, renaming a file + // to outside a monitored directory will show up as + // only a Rename. + // + // fsnotify.Write A file or named pipe was written to. A Truncate will + // also trigger a Write. A single "write action" + // initiated by the user may show up as one or multiple + // writes, depending on when the system syncs things to + // disk. For example when compiling a large Go program + // you may get hundreds of Write events, and you may + // want to wait until you've stopped receiving them + // (see the dedup example in cmd/fsnotify). + // + // Some systems may send Write event for directories + // when the directory content changes. + // + // fsnotify.Chmod Attributes were changed. On Linux this is also sent + // when a file is removed (or more accurately, when a + // link to an inode is removed). On kqueue it's sent + // when a file is truncated. On Windows it's never + // sent. + Events chan Event + + // Errors sends any errors. + // + // ErrEventOverflow is used to indicate there are too many events: + // + // - inotify: There are too many queued events (fs.inotify.max_queued_events sysctl) + // - windows: The buffer size is too small; WithBufferSize() can be used to increase it. + // - kqueue, fen: Not used. + Errors chan error + + port windows.Handle // Handle to completion port + input chan *input // Inputs to the reader are sent on this channel + quit chan chan<- error + + mu sync.Mutex // Protects access to watches, closed + watches watchMap // Map of watches (key: i-number) + closed bool // Set to true when Close() is first called +} + +// NewWatcher creates a new Watcher. +func NewWatcher() (*Watcher, error) { + return NewBufferedWatcher(50) +} + +// NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events +// channel. +// +// The main use case for this is situations with a very large number of events +// where the kernel buffer size can't be increased (e.g. due to lack of +// permissions). An unbuffered Watcher will perform better for almost all use +// cases, and whenever possible you will be better off increasing the kernel +// buffers instead of adding a large userspace buffer. +func NewBufferedWatcher(sz uint) (*Watcher, error) { + port, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0) + if err != nil { + return nil, os.NewSyscallError("CreateIoCompletionPort", err) + } + w := &Watcher{ + port: port, + watches: make(watchMap), + input: make(chan *input, 1), + Events: make(chan Event, sz), + Errors: make(chan error), + quit: make(chan chan<- error, 1), + } + go w.readEvents() + return w, nil +} + +func (w *Watcher) isClosed() bool { + w.mu.Lock() + defer w.mu.Unlock() + return w.closed +} + +func (w *Watcher) sendEvent(name string, mask uint64) bool { + if mask == 0 { + return false + } + + event := w.newEvent(name, uint32(mask)) + select { + case ch := <-w.quit: + w.quit <- ch + case w.Events <- event: + } + return true +} + +// Returns true if the error was sent, or false if watcher is closed. +func (w *Watcher) sendError(err error) bool { + select { + case w.Errors <- err: + return true + case <-w.quit: + } + return false +} + +// Close removes all watches and closes the Events channel. +func (w *Watcher) Close() error { + if w.isClosed() { + return nil + } + + w.mu.Lock() + w.closed = true + w.mu.Unlock() + + // Send "quit" message to the reader goroutine + ch := make(chan error) + w.quit <- ch + if err := w.wakeupReader(); err != nil { + return err + } + return <-ch +} + +// Add starts monitoring the path for changes. +// +// A path can only be watched once; watching it more than once is a no-op and will +// not return an error. Paths that do not yet exist on the filesystem cannot be +// watched. +// +// A watch will be automatically removed if the watched path is deleted or +// renamed. The exception is the Windows backend, which doesn't remove the +// watcher on renames. +// +// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special +// filesystems (/proc, /sys, etc.) generally don't work. +// +// Returns [ErrClosed] if [Watcher.Close] was called. +// +// See [Watcher.AddWith] for a version that allows adding options. +// +// # Watching directories +// +// All files in a directory are monitored, including new files that are created +// after the watcher is started. Subdirectories are not watched (i.e. it's +// non-recursive). +// +// # Watching files +// +// Watching individual files (rather than directories) is generally not +// recommended as many programs (especially editors) update files atomically: it +// will write to a temporary file which is then moved to to destination, +// overwriting the original (or some variant thereof). The watcher on the +// original file is now lost, as that no longer exists. +// +// The upshot of this is that a power failure or crash won't leave a +// half-written file. +// +// Watch the parent directory and use Event.Name to filter out files you're not +// interested in. There is an example of this in cmd/fsnotify/file.go. +func (w *Watcher) Add(name string) error { return w.AddWith(name) } + +// AddWith is like [Watcher.Add], but allows adding options. When using Add() +// the defaults described below are used. +// +// Possible options are: +// +// - [WithBufferSize] sets the buffer size for the Windows backend; no-op on +// other platforms. The default is 64K (65536 bytes). +func (w *Watcher) AddWith(name string, opts ...addOpt) error { + if w.isClosed() { + return ErrClosed + } + + with := getOptions(opts...) + if with.bufsize < 4096 { + return fmt.Errorf("fsnotify.WithBufferSize: buffer size cannot be smaller than 4096 bytes") + } + + in := &input{ + op: opAddWatch, + path: filepath.Clean(name), + flags: sysFSALLEVENTS, + reply: make(chan error), + bufsize: with.bufsize, + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// Remove stops monitoring the path for changes. +// +// Directories are always removed non-recursively. For example, if you added +// /tmp/dir and /tmp/dir/subdir then you will need to remove both. +// +// Removing a path that has not yet been added returns [ErrNonExistentWatch]. +// +// Returns nil if [Watcher.Close] was called. +func (w *Watcher) Remove(name string) error { + if w.isClosed() { + return nil + } + + in := &input{ + op: opRemoveWatch, + path: filepath.Clean(name), + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// WatchList returns all paths explicitly added with [Watcher.Add] (and are not +// yet removed). +// +// Returns nil if [Watcher.Close] was called. +func (w *Watcher) WatchList() []string { + if w.isClosed() { + return nil + } + + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for _, entry := range w.watches { + for _, watchEntry := range entry { + entries = append(entries, watchEntry.path) + } + } + + return entries +} + +// These options are from the old golang.org/x/exp/winfsnotify, where you could +// add various options to the watch. This has long since been removed. +// +// The "sys" in the name is misleading as they're not part of any "system". +// +// This should all be removed at some point, and just use windows.FILE_NOTIFY_* +const ( + sysFSALLEVENTS = 0xfff + sysFSCREATE = 0x100 + sysFSDELETE = 0x200 + sysFSDELETESELF = 0x400 + sysFSMODIFY = 0x2 + sysFSMOVE = 0xc0 + sysFSMOVEDFROM = 0x40 + sysFSMOVEDTO = 0x80 + sysFSMOVESELF = 0x800 + sysFSIGNORED = 0x8000 +) + +func (w *Watcher) newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO { + e.Op |= Create + } + if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF { + e.Op |= Remove + } + if mask&sysFSMODIFY == sysFSMODIFY { + e.Op |= Write + } + if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM { + e.Op |= Rename + } + return e +} + +const ( + opAddWatch = iota + opRemoveWatch +) + +const ( + provisional uint64 = 1 << (32 + iota) +) + +type input struct { + op int + path string + flags uint32 + bufsize int + reply chan error +} + +type inode struct { + handle windows.Handle + volume uint32 + index uint64 +} + +type watch struct { + ov windows.Overlapped + ino *inode // i-number + recurse bool // Recursive watch? + path string // Directory path + mask uint64 // Directory itself is being watched with these notify flags + names map[string]uint64 // Map of names being watched and their notify flags + rename string // Remembers the old name while renaming a file + buf []byte // buffer, allocated later +} + +type ( + indexMap map[uint64]*watch + watchMap map[uint32]indexMap +) + +func (w *Watcher) wakeupReader() error { + err := windows.PostQueuedCompletionStatus(w.port, 0, 0, nil) + if err != nil { + return os.NewSyscallError("PostQueuedCompletionStatus", err) + } + return nil +} + +func (w *Watcher) getDir(pathname string) (dir string, err error) { + attr, err := windows.GetFileAttributes(windows.StringToUTF16Ptr(pathname)) + if err != nil { + return "", os.NewSyscallError("GetFileAttributes", err) + } + if attr&windows.FILE_ATTRIBUTE_DIRECTORY != 0 { + dir = pathname + } else { + dir, _ = filepath.Split(pathname) + dir = filepath.Clean(dir) + } + return +} + +func (w *Watcher) getIno(path string) (ino *inode, err error) { + h, err := windows.CreateFile(windows.StringToUTF16Ptr(path), + windows.FILE_LIST_DIRECTORY, + windows.FILE_SHARE_READ|windows.FILE_SHARE_WRITE|windows.FILE_SHARE_DELETE, + nil, windows.OPEN_EXISTING, + windows.FILE_FLAG_BACKUP_SEMANTICS|windows.FILE_FLAG_OVERLAPPED, 0) + if err != nil { + return nil, os.NewSyscallError("CreateFile", err) + } + + var fi windows.ByHandleFileInformation + err = windows.GetFileInformationByHandle(h, &fi) + if err != nil { + windows.CloseHandle(h) + return nil, os.NewSyscallError("GetFileInformationByHandle", err) + } + ino = &inode{ + handle: h, + volume: fi.VolumeSerialNumber, + index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), + } + return ino, nil +} + +// Must run within the I/O thread. +func (m watchMap) get(ino *inode) *watch { + if i := m[ino.volume]; i != nil { + return i[ino.index] + } + return nil +} + +// Must run within the I/O thread. +func (m watchMap) set(ino *inode, watch *watch) { + i := m[ino.volume] + if i == nil { + i = make(indexMap) + m[ino.volume] = i + } + i[ino.index] = watch +} + +// Must run within the I/O thread. +func (w *Watcher) addWatch(pathname string, flags uint64, bufsize int) error { + //pathname, recurse := recursivePath(pathname) + recurse := false + + dir, err := w.getDir(pathname) + if err != nil { + return err + } + + ino, err := w.getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watchEntry := w.watches.get(ino) + w.mu.Unlock() + if watchEntry == nil { + _, err := windows.CreateIoCompletionPort(ino.handle, w.port, 0, 0) + if err != nil { + windows.CloseHandle(ino.handle) + return os.NewSyscallError("CreateIoCompletionPort", err) + } + watchEntry = &watch{ + ino: ino, + path: dir, + names: make(map[string]uint64), + recurse: recurse, + buf: make([]byte, bufsize), + } + w.mu.Lock() + w.watches.set(ino, watchEntry) + w.mu.Unlock() + flags |= provisional + } else { + windows.CloseHandle(ino.handle) + } + if pathname == dir { + watchEntry.mask |= flags + } else { + watchEntry.names[filepath.Base(pathname)] |= flags + } + + err = w.startRead(watchEntry) + if err != nil { + return err + } + + if pathname == dir { + watchEntry.mask &= ^provisional + } else { + watchEntry.names[filepath.Base(pathname)] &= ^provisional + } + return nil +} + +// Must run within the I/O thread. +func (w *Watcher) remWatch(pathname string) error { + pathname, recurse := recursivePath(pathname) + + dir, err := w.getDir(pathname) + if err != nil { + return err + } + ino, err := w.getIno(dir) + if err != nil { + return err + } + + w.mu.Lock() + watch := w.watches.get(ino) + w.mu.Unlock() + + if recurse && !watch.recurse { + return fmt.Errorf("can't use \\... with non-recursive watch %q", pathname) + } + + err = windows.CloseHandle(ino.handle) + if err != nil { + w.sendError(os.NewSyscallError("CloseHandle", err)) + } + if watch == nil { + return fmt.Errorf("%w: %s", ErrNonExistentWatch, pathname) + } + if pathname == dir { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + watch.mask = 0 + } else { + name := filepath.Base(pathname) + w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + + return w.startRead(watch) +} + +// Must run within the I/O thread. +func (w *Watcher) deleteWatch(watch *watch) { + for name, mask := range watch.names { + if mask&provisional == 0 { + w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED) + } + delete(watch.names, name) + } + if watch.mask != 0 { + if watch.mask&provisional == 0 { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + } + watch.mask = 0 + } +} + +// Must run within the I/O thread. +func (w *Watcher) startRead(watch *watch) error { + err := windows.CancelIo(watch.ino.handle) + if err != nil { + w.sendError(os.NewSyscallError("CancelIo", err)) + w.deleteWatch(watch) + } + mask := w.toWindowsFlags(watch.mask) + for _, m := range watch.names { + mask |= w.toWindowsFlags(m) + } + if mask == 0 { + err := windows.CloseHandle(watch.ino.handle) + if err != nil { + w.sendError(os.NewSyscallError("CloseHandle", err)) + } + w.mu.Lock() + delete(w.watches[watch.ino.volume], watch.ino.index) + w.mu.Unlock() + return nil + } + + // We need to pass the array, rather than the slice. + hdr := (*reflect.SliceHeader)(unsafe.Pointer(&watch.buf)) + rdErr := windows.ReadDirectoryChanges(watch.ino.handle, + (*byte)(unsafe.Pointer(hdr.Data)), uint32(hdr.Len), + watch.recurse, mask, nil, &watch.ov, 0) + if rdErr != nil { + err := os.NewSyscallError("ReadDirectoryChanges", rdErr) + if rdErr == windows.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { + // Watched directory was probably removed + w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) + err = nil + } + w.deleteWatch(watch) + w.startRead(watch) + return err + } + return nil +} + +// readEvents reads from the I/O completion port, converts the +// received events into Event objects and sends them via the Events channel. +// Entry point to the I/O thread. +func (w *Watcher) readEvents() { + var ( + n uint32 + key uintptr + ov *windows.Overlapped + ) + runtime.LockOSThread() + + for { + // This error is handled after the watch == nil check below. + qErr := windows.GetQueuedCompletionStatus(w.port, &n, &key, &ov, windows.INFINITE) + + watch := (*watch)(unsafe.Pointer(ov)) + if watch == nil { + select { + case ch := <-w.quit: + w.mu.Lock() + var indexes []indexMap + for _, index := range w.watches { + indexes = append(indexes, index) + } + w.mu.Unlock() + for _, index := range indexes { + for _, watch := range index { + w.deleteWatch(watch) + w.startRead(watch) + } + } + + err := windows.CloseHandle(w.port) + if err != nil { + err = os.NewSyscallError("CloseHandle", err) + } + close(w.Events) + close(w.Errors) + ch <- err + return + case in := <-w.input: + switch in.op { + case opAddWatch: + in.reply <- w.addWatch(in.path, uint64(in.flags), in.bufsize) + case opRemoveWatch: + in.reply <- w.remWatch(in.path) + } + default: + } + continue + } + + switch qErr { + case nil: + // No error + case windows.ERROR_MORE_DATA: + if watch == nil { + w.sendError(errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer")) + } else { + // The i/o succeeded but the buffer is full. + // In theory we should be building up a full packet. + // In practice we can get away with just carrying on. + n = uint32(unsafe.Sizeof(watch.buf)) + } + case windows.ERROR_ACCESS_DENIED: + // Watched directory was probably removed + w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) + w.deleteWatch(watch) + w.startRead(watch) + continue + case windows.ERROR_OPERATION_ABORTED: + // CancelIo was called on this handle + continue + default: + w.sendError(os.NewSyscallError("GetQueuedCompletionPort", qErr)) + continue + } + + var offset uint32 + for { + if n == 0 { + w.sendError(ErrEventOverflow) + break + } + + // Point "raw" to the event in the buffer + raw := (*windows.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) + + // Create a buf that is the size of the path name + size := int(raw.FileNameLength / 2) + var buf []uint16 + // TODO: Use unsafe.Slice in Go 1.17; https://stackoverflow.com/questions/51187973 + sh := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) + sh.Data = uintptr(unsafe.Pointer(&raw.FileName)) + sh.Len = size + sh.Cap = size + name := windows.UTF16ToString(buf) + fullname := filepath.Join(watch.path, name) + + var mask uint64 + switch raw.Action { + case windows.FILE_ACTION_REMOVED: + mask = sysFSDELETESELF + case windows.FILE_ACTION_MODIFIED: + mask = sysFSMODIFY + case windows.FILE_ACTION_RENAMED_OLD_NAME: + watch.rename = name + case windows.FILE_ACTION_RENAMED_NEW_NAME: + // Update saved path of all sub-watches. + old := filepath.Join(watch.path, watch.rename) + w.mu.Lock() + for _, watchMap := range w.watches { + for _, ww := range watchMap { + if strings.HasPrefix(ww.path, old) { + ww.path = filepath.Join(fullname, strings.TrimPrefix(ww.path, old)) + } + } + } + w.mu.Unlock() + + if watch.names[watch.rename] != 0 { + watch.names[name] |= watch.names[watch.rename] + delete(watch.names, watch.rename) + mask = sysFSMOVESELF + } + } + + sendNameEvent := func() { + w.sendEvent(fullname, watch.names[name]&mask) + } + if raw.Action != windows.FILE_ACTION_RENAMED_NEW_NAME { + sendNameEvent() + } + if raw.Action == windows.FILE_ACTION_REMOVED { + w.sendEvent(fullname, watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + + w.sendEvent(fullname, watch.mask&w.toFSnotifyFlags(raw.Action)) + if raw.Action == windows.FILE_ACTION_RENAMED_NEW_NAME { + fullname = filepath.Join(watch.path, watch.rename) + sendNameEvent() + } + + // Move to the next event in the buffer + if raw.NextEntryOffset == 0 { + break + } + offset += raw.NextEntryOffset + + // Error! + if offset >= n { + //lint:ignore ST1005 Windows should be capitalized + w.sendError(errors.New( + "Windows system assumed buffer larger than it is, events have likely been missed")) + break + } + } + + if err := w.startRead(watch); err != nil { + w.sendError(err) + } + } +} + +func (w *Watcher) toWindowsFlags(mask uint64) uint32 { + var m uint32 + if mask&sysFSMODIFY != 0 { + m |= windows.FILE_NOTIFY_CHANGE_LAST_WRITE + } + if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 { + m |= windows.FILE_NOTIFY_CHANGE_FILE_NAME | windows.FILE_NOTIFY_CHANGE_DIR_NAME + } + return m +} + +func (w *Watcher) toFSnotifyFlags(action uint32) uint64 { + switch action { + case windows.FILE_ACTION_ADDED: + return sysFSCREATE + case windows.FILE_ACTION_REMOVED: + return sysFSDELETE + case windows.FILE_ACTION_MODIFIED: + return sysFSMODIFY + case windows.FILE_ACTION_RENAMED_OLD_NAME: + return sysFSMOVEDFROM + case windows.FILE_ACTION_RENAMED_NEW_NAME: + return sysFSMOVEDTO + } + return 0 +} diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/fsnotify/fsnotify/fsnotify.go new file mode 100644 index 0000000000..24c99cc499 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/fsnotify.go @@ -0,0 +1,146 @@ +// Package fsnotify provides a cross-platform interface for file system +// notifications. +// +// Currently supported systems: +// +// Linux 2.6.32+ via inotify +// BSD, macOS via kqueue +// Windows via ReadDirectoryChangesW +// illumos via FEN +package fsnotify + +import ( + "errors" + "fmt" + "path/filepath" + "strings" +) + +// Event represents a file system notification. +type Event struct { + // Path to the file or directory. + // + // Paths are relative to the input; for example with Add("dir") the Name + // will be set to "dir/file" if you create that file, but if you use + // Add("/path/to/dir") it will be "/path/to/dir/file". + Name string + + // File operation that triggered the event. + // + // This is a bitmask and some systems may send multiple operations at once. + // Use the Event.Has() method instead of comparing with ==. + Op Op +} + +// Op describes a set of file operations. +type Op uint32 + +// The operations fsnotify can trigger; see the documentation on [Watcher] for a +// full description, and check them with [Event.Has]. +const ( + // A new pathname was created. + Create Op = 1 << iota + + // The pathname was written to; this does *not* mean the write has finished, + // and a write can be followed by more writes. + Write + + // The path was removed; any watches on it will be removed. Some "remove" + // operations may trigger a Rename if the file is actually moved (for + // example "remove to trash" is often a rename). + Remove + + // The path was renamed to something else; any watched on it will be + // removed. + Rename + + // File attributes were changed. + // + // It's generally not recommended to take action on this event, as it may + // get triggered very frequently by some software. For example, Spotlight + // indexing on macOS, anti-virus software, backup software, etc. + Chmod +) + +// Common errors that can be reported. +var ( + ErrNonExistentWatch = errors.New("fsnotify: can't remove non-existent watch") + ErrEventOverflow = errors.New("fsnotify: queue or buffer overflow") + ErrClosed = errors.New("fsnotify: watcher already closed") +) + +func (o Op) String() string { + var b strings.Builder + if o.Has(Create) { + b.WriteString("|CREATE") + } + if o.Has(Remove) { + b.WriteString("|REMOVE") + } + if o.Has(Write) { + b.WriteString("|WRITE") + } + if o.Has(Rename) { + b.WriteString("|RENAME") + } + if o.Has(Chmod) { + b.WriteString("|CHMOD") + } + if b.Len() == 0 { + return "[no events]" + } + return b.String()[1:] +} + +// Has reports if this operation has the given operation. +func (o Op) Has(h Op) bool { return o&h != 0 } + +// Has reports if this event has the given operation. +func (e Event) Has(op Op) bool { return e.Op.Has(op) } + +// String returns a string representation of the event with their path. +func (e Event) String() string { + return fmt.Sprintf("%-13s %q", e.Op.String(), e.Name) +} + +type ( + addOpt func(opt *withOpts) + withOpts struct { + bufsize int + } +) + +var defaultOpts = withOpts{ + bufsize: 65536, // 64K +} + +func getOptions(opts ...addOpt) withOpts { + with := defaultOpts + for _, o := range opts { + o(&with) + } + return with +} + +// WithBufferSize sets the [ReadDirectoryChangesW] buffer size. +// +// This only has effect on Windows systems, and is a no-op for other backends. +// +// The default value is 64K (65536 bytes) which is the highest value that works +// on all filesystems and should be enough for most applications, but if you +// have a large burst of events it may not be enough. You can increase it if +// you're hitting "queue or buffer overflow" errors ([ErrEventOverflow]). +// +// [ReadDirectoryChangesW]: https://learn.microsoft.com/en-gb/windows/win32/api/winbase/nf-winbase-readdirectorychangesw +func WithBufferSize(bytes int) addOpt { + return func(opt *withOpts) { opt.bufsize = bytes } +} + +// Check if this path is recursive (ends with "/..." or "\..."), and return the +// path with the /... stripped. +func recursivePath(path string) (string, bool) { + if filepath.Base(path) == "..." { + return filepath.Dir(path), true + } + return path, false +} diff --git a/vendor/github.com/fsnotify/fsnotify/mkdoc.zsh b/vendor/github.com/fsnotify/fsnotify/mkdoc.zsh new file mode 100644 index 0000000000..99012ae653 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/mkdoc.zsh @@ -0,0 +1,259 @@ +#!/usr/bin/env zsh +[ "${ZSH_VERSION:-}" = "" ] && echo >&2 "Only works with zsh" && exit 1 +setopt err_exit no_unset pipefail extended_glob + +# Simple script to update the godoc comments on all watchers so you don't need +# to update the same comment 5 times. + +watcher=$(</tmp/x + print -r -- $cmt >>/tmp/x + tail -n+$(( end + 1 )) $file >>/tmp/x + mv /tmp/x $file + done +} + +set-cmt '^type Watcher struct ' $watcher +set-cmt '^func NewWatcher(' $new +set-cmt '^func NewBufferedWatcher(' $newbuffered +set-cmt '^func (w \*Watcher) Add(' $add +set-cmt '^func (w \*Watcher) AddWith(' $addwith +set-cmt '^func (w \*Watcher) Remove(' $remove +set-cmt '^func (w \*Watcher) Close(' $close +set-cmt '^func (w \*Watcher) WatchList(' $watchlist +set-cmt '^[[:space:]]*Events *chan Event$' $events +set-cmt '^[[:space:]]*Errors *chan error$' $errors diff --git a/vendor/github.com/fsnotify/fsnotify/system_bsd.go b/vendor/github.com/fsnotify/fsnotify/system_bsd.go new file mode 100644 index 0000000000..4322b0b885 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/system_bsd.go @@ -0,0 +1,8 @@ +//go:build freebsd || openbsd || netbsd || dragonfly +// +build freebsd openbsd netbsd dragonfly + +package fsnotify + +import "golang.org/x/sys/unix" + +const openMode = unix.O_NONBLOCK | unix.O_RDONLY | unix.O_CLOEXEC diff --git a/vendor/github.com/fsnotify/fsnotify/system_darwin.go b/vendor/github.com/fsnotify/fsnotify/system_darwin.go new file mode 100644 index 0000000000..5da5ffa78f --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/system_darwin.go @@ -0,0 +1,9 @@ +//go:build darwin +// +build darwin + +package fsnotify + +import "golang.org/x/sys/unix" + +// note: this constant is not defined on BSD +const openMode = unix.O_EVTONLY | unix.O_CLOEXEC diff --git a/vendor/github.com/hashicorp/hcl/.gitignore b/vendor/github.com/hashicorp/hcl/.gitignore new file mode 100644 index 0000000000..15586a2b54 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/.gitignore @@ -0,0 +1,9 @@ +y.output + +# ignore intellij files +.idea +*.iml +*.ipr +*.iws + +*.test diff --git a/vendor/github.com/hashicorp/hcl/.travis.yml b/vendor/github.com/hashicorp/hcl/.travis.yml new file mode 100644 index 0000000000..cb63a32161 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/.travis.yml @@ -0,0 +1,13 @@ +sudo: false + +language: go + +go: + - 1.x + - tip + +branches: + only: + - master + +script: make test diff --git a/vendor/github.com/hashicorp/hcl/LICENSE b/vendor/github.com/hashicorp/hcl/LICENSE new file mode 100644 index 0000000000..c33dcc7c92 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/LICENSE @@ -0,0 +1,354 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. “Contributor” + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. “Contributor Version” + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor’s Contribution. + +1.3. “Contribution” + + means Covered Software of a particular Contributor. + +1.4. “Covered Software” + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. “Incompatible With Secondary Licenses” + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of version + 1.1 or earlier of the License, but not also under the terms of a + Secondary License. + +1.6. “Executable Form” + + means any form of the work other than Source Code Form. + +1.7. “Larger Work” + + means a work that combines Covered Software with other material, in a separate + file or files, that is not Covered Software. + +1.8. “License” + + means this document. + +1.9. “Licensable” + + means having the right to grant, to the maximum extent possible, whether at the + time of the initial grant or subsequently, any and all of the rights conveyed by + this License. + +1.10. “Modifications” + + means any of the following: + + a. any file in Source Code Form that results from an addition to, deletion + from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. “Patent Claims” of a Contributor + + means any patent claim(s), including without limitation, method, process, + and apparatus claims, in any patent Licensable by such Contributor that + would be infringed, but for the grant of the License, by the making, + using, selling, offering for sale, having made, import, or transfer of + either its Contributions or its Contributor Version. + +1.12. “Secondary License” + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. “Source Code Form” + + means the form of the work preferred for making modifications. + +1.14. “You” (or “Your”) + + means an individual or a legal entity exercising rights under this + License. For legal entities, “You” includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, “control” means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or as + part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its Contributions + or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution become + effective for each Contribution on the date the Contributor first distributes + such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under this + License. No additional rights or licenses will be implied from the distribution + or licensing of Covered Software under this License. Notwithstanding Section + 2.1(b) above, no patent license is granted by a Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party’s + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of its + Contributions. + + This License does not grant any rights in the trademarks, service marks, or + logos of any Contributor (except as may be necessary to comply with the + notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this License + (see Section 10.2) or under the terms of a Secondary License (if permitted + under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its Contributions + are its original creation(s) or it has sufficient rights to grant the + rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under applicable + copyright doctrines of fair use, fair dealing, or other equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under the + terms of this License. You must inform recipients that the Source Code Form + of the Covered Software is governed by the terms of this License, and how + they can obtain a copy of this License. You may not attempt to alter or + restrict the recipients’ rights in the Source Code Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this License, + or sublicense it under different terms, provided that the license for + the Executable Form does not attempt to limit or alter the recipients’ + rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for the + Covered Software. If the Larger Work is a combination of Covered Software + with a work governed by one or more Secondary Licenses, and the Covered + Software is not Incompatible With Secondary Licenses, this License permits + You to additionally distribute such Covered Software under the terms of + such Secondary License(s), so that the recipient of the Larger Work may, at + their option, further distribute the Covered Software under the terms of + either this License or such Secondary License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices (including + copyright notices, patent notices, disclaimers of warranty, or limitations + of liability) contained within the Source Code Form of the Covered + Software, except that You may alter any license notices to the extent + required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on behalf + of any Contributor. You must make it absolutely clear that any such + warranty, support, indemnity, or liability obligation is offered by You + alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, judicial + order, or regulation then You must: (a) comply with the terms of this License + to the maximum extent possible; and (b) describe the limitations and the code + they affect. Such description must be placed in a text file included with all + distributions of the Covered Software under this License. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing basis, + if such Contributor fails to notify You of the non-compliance by some + reasonable means prior to 60 days after You have come back into compliance. + Moreover, Your grants from a particular Contributor are reinstated on an + ongoing basis if such Contributor notifies You of the non-compliance by + some reasonable means, this is the first time You have received notice of + non-compliance with this License from such Contributor, and You become + compliant prior to 30 days after Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, counter-claims, + and cross-claims) alleging that a Contributor Version directly or + indirectly infringes any patent, then the rights granted to You by any and + all Contributors for the Covered Software under Section 2.1 of this License + shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an “as is” basis, without + warranty of any kind, either expressed, implied, or statutory, including, + without limitation, warranties that the Covered Software is free of defects, + merchantable, fit for a particular purpose or non-infringing. The entire + risk as to the quality and performance of the Covered Software is with You. + Should any Covered Software prove defective in any respect, You (not any + Contributor) assume the cost of any necessary servicing, repair, or + correction. This disclaimer of warranty constitutes an essential part of this + License. No use of any Covered Software is authorized under this License + except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from such + party’s negligence to the extent applicable law prohibits such limitation. + Some jurisdictions do not allow the exclusion or limitation of incidental or + consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts of + a jurisdiction where the defendant maintains its principal place of business + and such litigation shall be governed by laws of that jurisdiction, without + reference to its conflict-of-law provisions. Nothing in this Section shall + prevent a party’s ability to bring cross-claims or counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject matter + hereof. If any provision of this License is held to be unenforceable, such + provision shall be reformed only to the extent necessary to make it + enforceable. Any law or regulation which provides that the language of a + contract shall be construed against the drafter shall not be used to construe + this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version of + the License under which You originally received the Covered Software, or + under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a modified + version of this License if you rename the license and remove any + references to the name of the license steward (except to note that such + modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + If You choose to distribute Source Code Form that is Incompatible With + Secondary Licenses under the terms of this version of the License, the + notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then +You may include the notice in a location (such as a LICENSE file in a relevant +directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - “Incompatible With Secondary Licenses” Notice + + This Source Code Form is “Incompatible + With Secondary Licenses”, as defined by + the Mozilla Public License, v. 2.0. + diff --git a/vendor/github.com/hashicorp/hcl/Makefile b/vendor/github.com/hashicorp/hcl/Makefile new file mode 100644 index 0000000000..84fd743f5c --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/Makefile @@ -0,0 +1,18 @@ +TEST?=./... + +default: test + +fmt: generate + go fmt ./... + +test: generate + go get -t ./... + go test $(TEST) $(TESTARGS) + +generate: + go generate ./... + +updatedeps: + go get -u golang.org/x/tools/cmd/stringer + +.PHONY: default generate test updatedeps diff --git a/vendor/github.com/hashicorp/hcl/README.md b/vendor/github.com/hashicorp/hcl/README.md new file mode 100644 index 0000000000..c8223326dd --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/README.md @@ -0,0 +1,125 @@ +# HCL + +[![GoDoc](https://godoc.org/github.com/hashicorp/hcl?status.png)](https://godoc.org/github.com/hashicorp/hcl) [![Build Status](https://travis-ci.org/hashicorp/hcl.svg?branch=master)](https://travis-ci.org/hashicorp/hcl) + +HCL (HashiCorp Configuration Language) is a configuration language built +by HashiCorp. The goal of HCL is to build a structured configuration language +that is both human and machine friendly for use with command-line tools, but +specifically targeted towards DevOps tools, servers, etc. + +HCL is also fully JSON compatible. That is, JSON can be used as completely +valid input to a system expecting HCL. This helps makes systems +interoperable with other systems. + +HCL is heavily inspired by +[libucl](https://github.com/vstakhov/libucl), +nginx configuration, and others similar. + +## Why? + +A common question when viewing HCL is to ask the question: why not +JSON, YAML, etc.? + +Prior to HCL, the tools we built at [HashiCorp](http://www.hashicorp.com) +used a variety of configuration languages from full programming languages +such as Ruby to complete data structure languages such as JSON. What we +learned is that some people wanted human-friendly configuration languages +and some people wanted machine-friendly languages. + +JSON fits a nice balance in this, but is fairly verbose and most +importantly doesn't support comments. With YAML, we found that beginners +had a really hard time determining what the actual structure was, and +ended up guessing more often than not whether to use a hyphen, colon, etc. +in order to represent some configuration key. + +Full programming languages such as Ruby enable complex behavior +a configuration language shouldn't usually allow, and also forces +people to learn some set of Ruby. + +Because of this, we decided to create our own configuration language +that is JSON-compatible. Our configuration language (HCL) is designed +to be written and modified by humans. The API for HCL allows JSON +as an input so that it is also machine-friendly (machines can generate +JSON instead of trying to generate HCL). + +Our goal with HCL is not to alienate other configuration languages. +It is instead to provide HCL as a specialized language for our tools, +and JSON as the interoperability layer. + +## Syntax + +For a complete grammar, please see the parser itself. A high-level overview +of the syntax and grammar is listed here. + + * Single line comments start with `#` or `//` + + * Multi-line comments are wrapped in `/*` and `*/`. Nested block comments + are not allowed. A multi-line comment (also known as a block comment) + terminates at the first `*/` found. + + * Values are assigned with the syntax `key = value` (whitespace doesn't + matter). The value can be any primitive: a string, number, boolean, + object, or list. + + * Strings are double-quoted and can contain any UTF-8 characters. + Example: `"Hello, World"` + + * Multi-line strings start with `<- + echo %Path% + + go version + + go env + + go get -t ./... + +build_script: +- cmd: go test -v ./... diff --git a/vendor/github.com/hashicorp/hcl/decoder.go b/vendor/github.com/hashicorp/hcl/decoder.go new file mode 100644 index 0000000000..bed9ebbe14 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/decoder.go @@ -0,0 +1,729 @@ +package hcl + +import ( + "errors" + "fmt" + "reflect" + "sort" + "strconv" + "strings" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/parser" + "github.com/hashicorp/hcl/hcl/token" +) + +// This is the tag to use with structures to have settings for HCL +const tagName = "hcl" + +var ( + // nodeType holds a reference to the type of ast.Node + nodeType reflect.Type = findNodeType() +) + +// Unmarshal accepts a byte slice as input and writes the +// data to the value pointed to by v. +func Unmarshal(bs []byte, v interface{}) error { + root, err := parse(bs) + if err != nil { + return err + } + + return DecodeObject(v, root) +} + +// Decode reads the given input and decodes it into the structure +// given by `out`. +func Decode(out interface{}, in string) error { + obj, err := Parse(in) + if err != nil { + return err + } + + return DecodeObject(out, obj) +} + +// DecodeObject is a lower-level version of Decode. It decodes a +// raw Object into the given output. +func DecodeObject(out interface{}, n ast.Node) error { + val := reflect.ValueOf(out) + if val.Kind() != reflect.Ptr { + return errors.New("result must be a pointer") + } + + // If we have the file, we really decode the root node + if f, ok := n.(*ast.File); ok { + n = f.Node + } + + var d decoder + return d.decode("root", n, val.Elem()) +} + +type decoder struct { + stack []reflect.Kind +} + +func (d *decoder) decode(name string, node ast.Node, result reflect.Value) error { + k := result + + // If we have an interface with a valid value, we use that + // for the check. + if result.Kind() == reflect.Interface { + elem := result.Elem() + if elem.IsValid() { + k = elem + } + } + + // Push current onto stack unless it is an interface. + if k.Kind() != reflect.Interface { + d.stack = append(d.stack, k.Kind()) + + // Schedule a pop + defer func() { + d.stack = d.stack[:len(d.stack)-1] + }() + } + + switch k.Kind() { + case reflect.Bool: + return d.decodeBool(name, node, result) + case reflect.Float32, reflect.Float64: + return d.decodeFloat(name, node, result) + case reflect.Int, reflect.Int32, reflect.Int64: + return d.decodeInt(name, node, result) + case reflect.Interface: + // When we see an interface, we make our own thing + return d.decodeInterface(name, node, result) + case reflect.Map: + return d.decodeMap(name, node, result) + case reflect.Ptr: + return d.decodePtr(name, node, result) + case reflect.Slice: + return d.decodeSlice(name, node, result) + case reflect.String: + return d.decodeString(name, node, result) + case reflect.Struct: + return d.decodeStruct(name, node, result) + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown kind to decode into: %s", name, k.Kind()), + } + } +} + +func (d *decoder) decodeBool(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + if n.Token.Type == token.BOOL { + v, err := strconv.ParseBool(n.Token.Text) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(v)) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeFloat(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + if n.Token.Type == token.FLOAT || n.Token.Type == token.NUMBER { + v, err := strconv.ParseFloat(n.Token.Text, 64) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(v).Convert(result.Type())) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeInt(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + switch n.Token.Type { + case token.NUMBER: + v, err := strconv.ParseInt(n.Token.Text, 0, 0) + if err != nil { + return err + } + + if result.Kind() == reflect.Interface { + result.Set(reflect.ValueOf(int(v))) + } else { + result.SetInt(v) + } + return nil + case token.STRING: + v, err := strconv.ParseInt(n.Token.Value().(string), 0, 0) + if err != nil { + return err + } + + if result.Kind() == reflect.Interface { + result.Set(reflect.ValueOf(int(v))) + } else { + result.SetInt(v) + } + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeInterface(name string, node ast.Node, result reflect.Value) error { + // When we see an ast.Node, we retain the value to enable deferred decoding. + // Very useful in situations where we want to preserve ast.Node information + // like Pos + if result.Type() == nodeType && result.CanSet() { + result.Set(reflect.ValueOf(node)) + return nil + } + + var set reflect.Value + redecode := true + + // For testing types, ObjectType should just be treated as a list. We + // set this to a temporary var because we want to pass in the real node. + testNode := node + if ot, ok := node.(*ast.ObjectType); ok { + testNode = ot.List + } + + switch n := testNode.(type) { + case *ast.ObjectList: + // If we're at the root or we're directly within a slice, then we + // decode objects into map[string]interface{}, otherwise we decode + // them into lists. + if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { + var temp map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeMap( + reflect.MapOf( + reflect.TypeOf(""), + tempVal.Type().Elem())) + + set = result + } else { + var temp []map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, len(n.Items)) + set = result + } + case *ast.ObjectType: + // If we're at the root or we're directly within a slice, then we + // decode objects into map[string]interface{}, otherwise we decode + // them into lists. + if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { + var temp map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeMap( + reflect.MapOf( + reflect.TypeOf(""), + tempVal.Type().Elem())) + + set = result + } else { + var temp []map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, 1) + set = result + } + case *ast.ListType: + var temp []interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, 0) + set = result + case *ast.LiteralType: + switch n.Token.Type { + case token.BOOL: + var result bool + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.FLOAT: + var result float64 + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.NUMBER: + var result int + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.STRING, token.HEREDOC: + set = reflect.Indirect(reflect.New(reflect.TypeOf(""))) + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: cannot decode into interface: %T", name, node), + } + } + default: + return fmt.Errorf( + "%s: cannot decode into interface: %T", + name, node) + } + + // Set the result to what its supposed to be, then reset + // result so we don't reflect into this method anymore. + result.Set(set) + + if redecode { + // Revisit the node so that we can use the newly instantiated + // thing and populate it. + if err := d.decode(name, node, result); err != nil { + return err + } + } + + return nil +} + +func (d *decoder) decodeMap(name string, node ast.Node, result reflect.Value) error { + if item, ok := node.(*ast.ObjectItem); ok { + node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} + } + + if ot, ok := node.(*ast.ObjectType); ok { + node = ot.List + } + + n, ok := node.(*ast.ObjectList) + if !ok { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: not an object type for map (%T)", name, node), + } + } + + // If we have an interface, then we can address the interface, + // but not the slice itself, so get the element but set the interface + set := result + if result.Kind() == reflect.Interface { + result = result.Elem() + } + + resultType := result.Type() + resultElemType := resultType.Elem() + resultKeyType := resultType.Key() + if resultKeyType.Kind() != reflect.String { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: map must have string keys", name), + } + } + + // Make a map if it is nil + resultMap := result + if result.IsNil() { + resultMap = reflect.MakeMap( + reflect.MapOf(resultKeyType, resultElemType)) + } + + // Go through each element and decode it. + done := make(map[string]struct{}) + for _, item := range n.Items { + if item.Val == nil { + continue + } + + // github.com/hashicorp/terraform/issue/5740 + if len(item.Keys) == 0 { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: map must have string keys", name), + } + } + + // Get the key we're dealing with, which is the first item + keyStr := item.Keys[0].Token.Value().(string) + + // If we've already processed this key, then ignore it + if _, ok := done[keyStr]; ok { + continue + } + + // Determine the value. If we have more than one key, then we + // get the objectlist of only these keys. + itemVal := item.Val + if len(item.Keys) > 1 { + itemVal = n.Filter(keyStr) + done[keyStr] = struct{}{} + } + + // Make the field name + fieldName := fmt.Sprintf("%s.%s", name, keyStr) + + // Get the key/value as reflection values + key := reflect.ValueOf(keyStr) + val := reflect.Indirect(reflect.New(resultElemType)) + + // If we have a pre-existing value in the map, use that + oldVal := resultMap.MapIndex(key) + if oldVal.IsValid() { + val.Set(oldVal) + } + + // Decode! + if err := d.decode(fieldName, itemVal, val); err != nil { + return err + } + + // Set the value on the map + resultMap.SetMapIndex(key, val) + } + + // Set the final map if we can + set.Set(resultMap) + return nil +} + +func (d *decoder) decodePtr(name string, node ast.Node, result reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + resultType := result.Type() + resultElemType := resultType.Elem() + val := reflect.New(resultElemType) + if err := d.decode(name, node, reflect.Indirect(val)); err != nil { + return err + } + + result.Set(val) + return nil +} + +func (d *decoder) decodeSlice(name string, node ast.Node, result reflect.Value) error { + // If we have an interface, then we can address the interface, + // but not the slice itself, so get the element but set the interface + set := result + if result.Kind() == reflect.Interface { + result = result.Elem() + } + // Create the slice if it isn't nil + resultType := result.Type() + resultElemType := resultType.Elem() + if result.IsNil() { + resultSliceType := reflect.SliceOf(resultElemType) + result = reflect.MakeSlice( + resultSliceType, 0, 0) + } + + // Figure out the items we'll be copying into the slice + var items []ast.Node + switch n := node.(type) { + case *ast.ObjectList: + items = make([]ast.Node, len(n.Items)) + for i, item := range n.Items { + items[i] = item + } + case *ast.ObjectType: + items = []ast.Node{n} + case *ast.ListType: + items = n.List + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("unknown slice type: %T", node), + } + } + + for i, item := range items { + fieldName := fmt.Sprintf("%s[%d]", name, i) + + // Decode + val := reflect.Indirect(reflect.New(resultElemType)) + + // if item is an object that was decoded from ambiguous JSON and + // flattened, make sure it's expanded if it needs to decode into a + // defined structure. + item := expandObject(item, val) + + if err := d.decode(fieldName, item, val); err != nil { + return err + } + + // Append it onto the slice + result = reflect.Append(result, val) + } + + set.Set(result) + return nil +} + +// expandObject detects if an ambiguous JSON object was flattened to a List which +// should be decoded into a struct, and expands the ast to properly deocode. +func expandObject(node ast.Node, result reflect.Value) ast.Node { + item, ok := node.(*ast.ObjectItem) + if !ok { + return node + } + + elemType := result.Type() + + // our target type must be a struct + switch elemType.Kind() { + case reflect.Ptr: + switch elemType.Elem().Kind() { + case reflect.Struct: + //OK + default: + return node + } + case reflect.Struct: + //OK + default: + return node + } + + // A list value will have a key and field name. If it had more fields, + // it wouldn't have been flattened. + if len(item.Keys) != 2 { + return node + } + + keyToken := item.Keys[0].Token + item.Keys = item.Keys[1:] + + // we need to un-flatten the ast enough to decode + newNode := &ast.ObjectItem{ + Keys: []*ast.ObjectKey{ + &ast.ObjectKey{ + Token: keyToken, + }, + }, + Val: &ast.ObjectType{ + List: &ast.ObjectList{ + Items: []*ast.ObjectItem{item}, + }, + }, + } + + return newNode +} + +func (d *decoder) decodeString(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + switch n.Token.Type { + case token.NUMBER: + result.Set(reflect.ValueOf(n.Token.Text).Convert(result.Type())) + return nil + case token.STRING, token.HEREDOC: + result.Set(reflect.ValueOf(n.Token.Value()).Convert(result.Type())) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type for string %T", name, node), + } +} + +func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value) error { + var item *ast.ObjectItem + if it, ok := node.(*ast.ObjectItem); ok { + item = it + node = it.Val + } + + if ot, ok := node.(*ast.ObjectType); ok { + node = ot.List + } + + // Handle the special case where the object itself is a literal. Previously + // the yacc parser would always ensure top-level elements were arrays. The new + // parser does not make the same guarantees, thus we need to convert any + // top-level literal elements into a list. + if _, ok := node.(*ast.LiteralType); ok && item != nil { + node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} + } + + list, ok := node.(*ast.ObjectList) + if !ok { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: not an object type for struct (%T)", name, node), + } + } + + // This slice will keep track of all the structs we'll be decoding. + // There can be more than one struct if there are embedded structs + // that are squashed. + structs := make([]reflect.Value, 1, 5) + structs[0] = result + + // Compile the list of all the fields that we're going to be decoding + // from all the structs. + type field struct { + field reflect.StructField + val reflect.Value + } + fields := []field{} + for len(structs) > 0 { + structVal := structs[0] + structs = structs[1:] + + structType := structVal.Type() + for i := 0; i < structType.NumField(); i++ { + fieldType := structType.Field(i) + tagParts := strings.Split(fieldType.Tag.Get(tagName), ",") + + // Ignore fields with tag name "-" + if tagParts[0] == "-" { + continue + } + + if fieldType.Anonymous { + fieldKind := fieldType.Type.Kind() + if fieldKind != reflect.Struct { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unsupported type to struct: %s", + fieldType.Name, fieldKind), + } + } + + // We have an embedded field. We "squash" the fields down + // if specified in the tag. + squash := false + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + + if squash { + structs = append( + structs, result.FieldByName(fieldType.Name)) + continue + } + } + + // Normal struct field, store it away + fields = append(fields, field{fieldType, structVal.Field(i)}) + } + } + + usedKeys := make(map[string]struct{}) + decodedFields := make([]string, 0, len(fields)) + decodedFieldsVal := make([]reflect.Value, 0) + unusedKeysVal := make([]reflect.Value, 0) + for _, f := range fields { + field, fieldValue := f.field, f.val + if !fieldValue.IsValid() { + // This should never happen + panic("field is not valid") + } + + // If we can't set the field, then it is unexported or something, + // and we just continue onwards. + if !fieldValue.CanSet() { + continue + } + + fieldName := field.Name + + tagValue := field.Tag.Get(tagName) + tagParts := strings.SplitN(tagValue, ",", 2) + if len(tagParts) >= 2 { + switch tagParts[1] { + case "decodedFields": + decodedFieldsVal = append(decodedFieldsVal, fieldValue) + continue + case "key": + if item == nil { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: %s asked for 'key', impossible", + name, fieldName), + } + } + + fieldValue.SetString(item.Keys[0].Token.Value().(string)) + continue + case "unusedKeys": + unusedKeysVal = append(unusedKeysVal, fieldValue) + continue + } + } + + if tagParts[0] != "" { + fieldName = tagParts[0] + } + + // Determine the element we'll use to decode. If it is a single + // match (only object with the field), then we decode it exactly. + // If it is a prefix match, then we decode the matches. + filter := list.Filter(fieldName) + + prefixMatches := filter.Children() + matches := filter.Elem() + if len(matches.Items) == 0 && len(prefixMatches.Items) == 0 { + continue + } + + // Track the used key + usedKeys[fieldName] = struct{}{} + + // Create the field name and decode. We range over the elements + // because we actually want the value. + fieldName = fmt.Sprintf("%s.%s", name, fieldName) + if len(prefixMatches.Items) > 0 { + if err := d.decode(fieldName, prefixMatches, fieldValue); err != nil { + return err + } + } + for _, match := range matches.Items { + var decodeNode ast.Node = match.Val + if ot, ok := decodeNode.(*ast.ObjectType); ok { + decodeNode = &ast.ObjectList{Items: ot.List.Items} + } + + if err := d.decode(fieldName, decodeNode, fieldValue); err != nil { + return err + } + } + + decodedFields = append(decodedFields, field.Name) + } + + if len(decodedFieldsVal) > 0 { + // Sort it so that it is deterministic + sort.Strings(decodedFields) + + for _, v := range decodedFieldsVal { + v.Set(reflect.ValueOf(decodedFields)) + } + } + + return nil +} + +// findNodeType returns the type of ast.Node +func findNodeType() reflect.Type { + var nodeContainer struct { + Node ast.Node + } + value := reflect.ValueOf(nodeContainer).FieldByName("Node") + return value.Type() +} diff --git a/vendor/github.com/hashicorp/hcl/hcl.go b/vendor/github.com/hashicorp/hcl/hcl.go new file mode 100644 index 0000000000..575a20b50b --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl.go @@ -0,0 +1,11 @@ +// Package hcl decodes HCL into usable Go structures. +// +// hcl input can come in either pure HCL format or JSON format. +// It can be parsed into an AST, and then decoded into a structure, +// or it can be decoded directly from a string into a structure. +// +// If you choose to parse HCL into a raw AST, the benefit is that you +// can write custom visitor implementations to implement custom +// semantic checks. By default, HCL does not perform any semantic +// checks. +package hcl diff --git a/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go b/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go new file mode 100644 index 0000000000..6e5ef654bb --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go @@ -0,0 +1,219 @@ +// Package ast declares the types used to represent syntax trees for HCL +// (HashiCorp Configuration Language) +package ast + +import ( + "fmt" + "strings" + + "github.com/hashicorp/hcl/hcl/token" +) + +// Node is an element in the abstract syntax tree. +type Node interface { + node() + Pos() token.Pos +} + +func (File) node() {} +func (ObjectList) node() {} +func (ObjectKey) node() {} +func (ObjectItem) node() {} +func (Comment) node() {} +func (CommentGroup) node() {} +func (ObjectType) node() {} +func (LiteralType) node() {} +func (ListType) node() {} + +// File represents a single HCL file +type File struct { + Node Node // usually a *ObjectList + Comments []*CommentGroup // list of all comments in the source +} + +func (f *File) Pos() token.Pos { + return f.Node.Pos() +} + +// ObjectList represents a list of ObjectItems. An HCL file itself is an +// ObjectList. +type ObjectList struct { + Items []*ObjectItem +} + +func (o *ObjectList) Add(item *ObjectItem) { + o.Items = append(o.Items, item) +} + +// Filter filters out the objects with the given key list as a prefix. +// +// The returned list of objects contain ObjectItems where the keys have +// this prefix already stripped off. This might result in objects with +// zero-length key lists if they have no children. +// +// If no matches are found, an empty ObjectList (non-nil) is returned. +func (o *ObjectList) Filter(keys ...string) *ObjectList { + var result ObjectList + for _, item := range o.Items { + // If there aren't enough keys, then ignore this + if len(item.Keys) < len(keys) { + continue + } + + match := true + for i, key := range item.Keys[:len(keys)] { + key := key.Token.Value().(string) + if key != keys[i] && !strings.EqualFold(key, keys[i]) { + match = false + break + } + } + if !match { + continue + } + + // Strip off the prefix from the children + newItem := *item + newItem.Keys = newItem.Keys[len(keys):] + result.Add(&newItem) + } + + return &result +} + +// Children returns further nested objects (key length > 0) within this +// ObjectList. This should be used with Filter to get at child items. +func (o *ObjectList) Children() *ObjectList { + var result ObjectList + for _, item := range o.Items { + if len(item.Keys) > 0 { + result.Add(item) + } + } + + return &result +} + +// Elem returns items in the list that are direct element assignments +// (key length == 0). This should be used with Filter to get at elements. +func (o *ObjectList) Elem() *ObjectList { + var result ObjectList + for _, item := range o.Items { + if len(item.Keys) == 0 { + result.Add(item) + } + } + + return &result +} + +func (o *ObjectList) Pos() token.Pos { + // always returns the uninitiliazed position + return o.Items[0].Pos() +} + +// ObjectItem represents a HCL Object Item. An item is represented with a key +// (or keys). It can be an assignment or an object (both normal and nested) +type ObjectItem struct { + // keys is only one length long if it's of type assignment. If it's a + // nested object it can be larger than one. In that case "assign" is + // invalid as there is no assignments for a nested object. + Keys []*ObjectKey + + // assign contains the position of "=", if any + Assign token.Pos + + // val is the item itself. It can be an object,list, number, bool or a + // string. If key length is larger than one, val can be only of type + // Object. + Val Node + + LeadComment *CommentGroup // associated lead comment + LineComment *CommentGroup // associated line comment +} + +func (o *ObjectItem) Pos() token.Pos { + // I'm not entirely sure what causes this, but removing this causes + // a test failure. We should investigate at some point. + if len(o.Keys) == 0 { + return token.Pos{} + } + + return o.Keys[0].Pos() +} + +// ObjectKeys are either an identifier or of type string. +type ObjectKey struct { + Token token.Token +} + +func (o *ObjectKey) Pos() token.Pos { + return o.Token.Pos +} + +// LiteralType represents a literal of basic type. Valid types are: +// token.NUMBER, token.FLOAT, token.BOOL and token.STRING +type LiteralType struct { + Token token.Token + + // comment types, only used when in a list + LeadComment *CommentGroup + LineComment *CommentGroup +} + +func (l *LiteralType) Pos() token.Pos { + return l.Token.Pos +} + +// ListStatement represents a HCL List type +type ListType struct { + Lbrack token.Pos // position of "[" + Rbrack token.Pos // position of "]" + List []Node // the elements in lexical order +} + +func (l *ListType) Pos() token.Pos { + return l.Lbrack +} + +func (l *ListType) Add(node Node) { + l.List = append(l.List, node) +} + +// ObjectType represents a HCL Object Type +type ObjectType struct { + Lbrace token.Pos // position of "{" + Rbrace token.Pos // position of "}" + List *ObjectList // the nodes in lexical order +} + +func (o *ObjectType) Pos() token.Pos { + return o.Lbrace +} + +// Comment node represents a single //, # style or /*- style commment +type Comment struct { + Start token.Pos // position of / or # + Text string +} + +func (c *Comment) Pos() token.Pos { + return c.Start +} + +// CommentGroup node represents a sequence of comments with no other tokens and +// no empty lines between. +type CommentGroup struct { + List []*Comment // len(List) > 0 +} + +func (c *CommentGroup) Pos() token.Pos { + return c.List[0].Pos() +} + +//------------------------------------------------------------------- +// GoStringer +//------------------------------------------------------------------- + +func (o *ObjectKey) GoString() string { return fmt.Sprintf("*%#v", *o) } +func (o *ObjectList) GoString() string { return fmt.Sprintf("*%#v", *o) } diff --git a/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go b/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go new file mode 100644 index 0000000000..ba07ad42b0 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go @@ -0,0 +1,52 @@ +package ast + +import "fmt" + +// WalkFunc describes a function to be called for each node during a Walk. The +// returned node can be used to rewrite the AST. Walking stops the returned +// bool is false. +type WalkFunc func(Node) (Node, bool) + +// Walk traverses an AST in depth-first order: It starts by calling fn(node); +// node must not be nil. If fn returns true, Walk invokes fn recursively for +// each of the non-nil children of node, followed by a call of fn(nil). The +// returned node of fn can be used to rewrite the passed node to fn. +func Walk(node Node, fn WalkFunc) Node { + rewritten, ok := fn(node) + if !ok { + return rewritten + } + + switch n := node.(type) { + case *File: + n.Node = Walk(n.Node, fn) + case *ObjectList: + for i, item := range n.Items { + n.Items[i] = Walk(item, fn).(*ObjectItem) + } + case *ObjectKey: + // nothing to do + case *ObjectItem: + for i, k := range n.Keys { + n.Keys[i] = Walk(k, fn).(*ObjectKey) + } + + if n.Val != nil { + n.Val = Walk(n.Val, fn) + } + case *LiteralType: + // nothing to do + case *ListType: + for i, l := range n.List { + n.List[i] = Walk(l, fn) + } + case *ObjectType: + n.List = Walk(n.List, fn).(*ObjectList) + default: + // should we panic here? + fmt.Printf("unknown type: %T\n", n) + } + + fn(nil) + return rewritten +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/error.go b/vendor/github.com/hashicorp/hcl/hcl/parser/error.go new file mode 100644 index 0000000000..5c99381dfb --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/error.go @@ -0,0 +1,17 @@ +package parser + +import ( + "fmt" + + "github.com/hashicorp/hcl/hcl/token" +) + +// PosError is a parse error that contains a position. +type PosError struct { + Pos token.Pos + Err error +} + +func (e *PosError) Error() string { + return fmt.Sprintf("At %s: %s", e.Pos, e.Err) +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go new file mode 100644 index 0000000000..64c83bcfb5 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go @@ -0,0 +1,532 @@ +// Package parser implements a parser for HCL (HashiCorp Configuration +// Language) +package parser + +import ( + "bytes" + "errors" + "fmt" + "strings" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/scanner" + "github.com/hashicorp/hcl/hcl/token" +) + +type Parser struct { + sc *scanner.Scanner + + // Last read token + tok token.Token + commaPrev token.Token + + comments []*ast.CommentGroup + leadComment *ast.CommentGroup // last lead comment + lineComment *ast.CommentGroup // last line comment + + enableTrace bool + indent int + n int // buffer size (max = 1) +} + +func newParser(src []byte) *Parser { + return &Parser{ + sc: scanner.New(src), + } +} + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func Parse(src []byte) (*ast.File, error) { + // normalize all line endings + // since the scanner and output only work with "\n" line endings, we may + // end up with dangling "\r" characters in the parsed data. + src = bytes.Replace(src, []byte("\r\n"), []byte("\n"), -1) + + p := newParser(src) + return p.Parse() +} + +var errEofToken = errors.New("EOF token found") + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func (p *Parser) Parse() (*ast.File, error) { + f := &ast.File{} + var err, scerr error + p.sc.Error = func(pos token.Pos, msg string) { + scerr = &PosError{Pos: pos, Err: errors.New(msg)} + } + + f.Node, err = p.objectList(false) + if scerr != nil { + return nil, scerr + } + if err != nil { + return nil, err + } + + f.Comments = p.comments + return f, nil +} + +// objectList parses a list of items within an object (generally k/v pairs). +// The parameter" obj" tells this whether to we are within an object (braces: +// '{', '}') or just at the top level. If we're within an object, we end +// at an RBRACE. +func (p *Parser) objectList(obj bool) (*ast.ObjectList, error) { + defer un(trace(p, "ParseObjectList")) + node := &ast.ObjectList{} + + for { + if obj { + tok := p.scan() + p.unscan() + if tok.Type == token.RBRACE { + break + } + } + + n, err := p.objectItem() + if err == errEofToken { + break // we are finished + } + + // we don't return a nil node, because might want to use already + // collected items. + if err != nil { + return node, err + } + + node.Add(n) + + // object lists can be optionally comma-delimited e.g. when a list of maps + // is being expressed, so a comma is allowed here - it's simply consumed + tok := p.scan() + if tok.Type != token.COMMA { + p.unscan() + } + } + return node, nil +} + +func (p *Parser) consumeComment() (comment *ast.Comment, endline int) { + endline = p.tok.Pos.Line + + // count the endline if it's multiline comment, ie starting with /* + if len(p.tok.Text) > 1 && p.tok.Text[1] == '*' { + // don't use range here - no need to decode Unicode code points + for i := 0; i < len(p.tok.Text); i++ { + if p.tok.Text[i] == '\n' { + endline++ + } + } + } + + comment = &ast.Comment{Start: p.tok.Pos, Text: p.tok.Text} + p.tok = p.sc.Scan() + return +} + +func (p *Parser) consumeCommentGroup(n int) (comments *ast.CommentGroup, endline int) { + var list []*ast.Comment + endline = p.tok.Pos.Line + + for p.tok.Type == token.COMMENT && p.tok.Pos.Line <= endline+n { + var comment *ast.Comment + comment, endline = p.consumeComment() + list = append(list, comment) + } + + // add comment group to the comments list + comments = &ast.CommentGroup{List: list} + p.comments = append(p.comments, comments) + + return +} + +// objectItem parses a single object item +func (p *Parser) objectItem() (*ast.ObjectItem, error) { + defer un(trace(p, "ParseObjectItem")) + + keys, err := p.objectKey() + if len(keys) > 0 && err == errEofToken { + // We ignore eof token here since it is an error if we didn't + // receive a value (but we did receive a key) for the item. + err = nil + } + if len(keys) > 0 && err != nil && p.tok.Type == token.RBRACE { + // This is a strange boolean statement, but what it means is: + // We have keys with no value, and we're likely in an object + // (since RBrace ends an object). For this, we set err to nil so + // we continue and get the error below of having the wrong value + // type. + err = nil + + // Reset the token type so we don't think it completed fine. See + // objectType which uses p.tok.Type to check if we're done with + // the object. + p.tok.Type = token.EOF + } + if err != nil { + return nil, err + } + + o := &ast.ObjectItem{ + Keys: keys, + } + + if p.leadComment != nil { + o.LeadComment = p.leadComment + p.leadComment = nil + } + + switch p.tok.Type { + case token.ASSIGN: + o.Assign = p.tok.Pos + o.Val, err = p.object() + if err != nil { + return nil, err + } + case token.LBRACE: + o.Val, err = p.objectType() + if err != nil { + return nil, err + } + default: + keyStr := make([]string, 0, len(keys)) + for _, k := range keys { + keyStr = append(keyStr, k.Token.Text) + } + + return nil, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf( + "key '%s' expected start of object ('{') or assignment ('=')", + strings.Join(keyStr, " ")), + } + } + + // key=#comment + // val + if p.lineComment != nil { + o.LineComment, p.lineComment = p.lineComment, nil + } + + // do a look-ahead for line comment + p.scan() + if len(keys) > 0 && o.Val.Pos().Line == keys[0].Pos().Line && p.lineComment != nil { + o.LineComment = p.lineComment + p.lineComment = nil + } + p.unscan() + return o, nil +} + +// objectKey parses an object key and returns a ObjectKey AST +func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { + keyCount := 0 + keys := make([]*ast.ObjectKey, 0) + + for { + tok := p.scan() + switch tok.Type { + case token.EOF: + // It is very important to also return the keys here as well as + // the error. This is because we need to be able to tell if we + // did parse keys prior to finding the EOF, or if we just found + // a bare EOF. + return keys, errEofToken + case token.ASSIGN: + // assignment or object only, but not nested objects. this is not + // allowed: `foo bar = {}` + if keyCount > 1 { + return nil, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("nested object expected: LBRACE got: %s", p.tok.Type), + } + } + + if keyCount == 0 { + return nil, &PosError{ + Pos: p.tok.Pos, + Err: errors.New("no object keys found!"), + } + } + + return keys, nil + case token.LBRACE: + var err error + + // If we have no keys, then it is a syntax error. i.e. {{}} is not + // allowed. + if len(keys) == 0 { + err = &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("expected: IDENT | STRING got: %s", p.tok.Type), + } + } + + // object + return keys, err + case token.IDENT, token.STRING: + keyCount++ + keys = append(keys, &ast.ObjectKey{Token: p.tok}) + case token.ILLEGAL: + return keys, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("illegal character"), + } + default: + return keys, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("expected: IDENT | STRING | ASSIGN | LBRACE got: %s", p.tok.Type), + } + } + } +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) object() (ast.Node, error) { + defer un(trace(p, "ParseType")) + tok := p.scan() + + switch tok.Type { + case token.NUMBER, token.FLOAT, token.BOOL, token.STRING, token.HEREDOC: + return p.literalType() + case token.LBRACE: + return p.objectType() + case token.LBRACK: + return p.listType() + case token.COMMENT: + // implement comment + case token.EOF: + return nil, errEofToken + } + + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("Unknown token: %+v", tok), + } +} + +// objectType parses an object type and returns a ObjectType AST +func (p *Parser) objectType() (*ast.ObjectType, error) { + defer un(trace(p, "ParseObjectType")) + + // we assume that the currently scanned token is a LBRACE + o := &ast.ObjectType{ + Lbrace: p.tok.Pos, + } + + l, err := p.objectList(true) + + // if we hit RBRACE, we are good to go (means we parsed all Items), if it's + // not a RBRACE, it's an syntax error and we just return it. + if err != nil && p.tok.Type != token.RBRACE { + return nil, err + } + + // No error, scan and expect the ending to be a brace + if tok := p.scan(); tok.Type != token.RBRACE { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("object expected closing RBRACE got: %s", tok.Type), + } + } + + o.List = l + o.Rbrace = p.tok.Pos // advanced via parseObjectList + return o, nil +} + +// listType parses a list type and returns a ListType AST +func (p *Parser) listType() (*ast.ListType, error) { + defer un(trace(p, "ParseListType")) + + // we assume that the currently scanned token is a LBRACK + l := &ast.ListType{ + Lbrack: p.tok.Pos, + } + + needComma := false + for { + tok := p.scan() + if needComma { + switch tok.Type { + case token.COMMA, token.RBRACK: + default: + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error parsing list, expected comma or list end, got: %s", + tok.Type), + } + } + } + switch tok.Type { + case token.BOOL, token.NUMBER, token.FLOAT, token.STRING, token.HEREDOC: + node, err := p.literalType() + if err != nil { + return nil, err + } + + // If there is a lead comment, apply it + if p.leadComment != nil { + node.LeadComment = p.leadComment + p.leadComment = nil + } + + l.Add(node) + needComma = true + case token.COMMA: + // get next list item or we are at the end + // do a look-ahead for line comment + p.scan() + if p.lineComment != nil && len(l.List) > 0 { + lit, ok := l.List[len(l.List)-1].(*ast.LiteralType) + if ok { + lit.LineComment = p.lineComment + l.List[len(l.List)-1] = lit + p.lineComment = nil + } + } + p.unscan() + + needComma = false + continue + case token.LBRACE: + // Looks like a nested object, so parse it out + node, err := p.objectType() + if err != nil { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error while trying to parse object within list: %s", err), + } + } + l.Add(node) + needComma = true + case token.LBRACK: + node, err := p.listType() + if err != nil { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error while trying to parse list within list: %s", err), + } + } + l.Add(node) + case token.RBRACK: + // finished + l.Rbrack = p.tok.Pos + return l, nil + default: + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("unexpected token while parsing list: %s", tok.Type), + } + } + } +} + +// literalType parses a literal type and returns a LiteralType AST +func (p *Parser) literalType() (*ast.LiteralType, error) { + defer un(trace(p, "ParseLiteral")) + + return &ast.LiteralType{ + Token: p.tok, + }, nil +} + +// scan returns the next token from the underlying scanner. If a token has +// been unscanned then read that instead. In the process, it collects any +// comment groups encountered, and remembers the last lead and line comments. +func (p *Parser) scan() token.Token { + // If we have a token on the buffer, then return it. + if p.n != 0 { + p.n = 0 + return p.tok + } + + // Otherwise read the next token from the scanner and Save it to the buffer + // in case we unscan later. + prev := p.tok + p.tok = p.sc.Scan() + + if p.tok.Type == token.COMMENT { + var comment *ast.CommentGroup + var endline int + + // fmt.Printf("p.tok.Pos.Line = %+v prev: %d endline %d \n", + // p.tok.Pos.Line, prev.Pos.Line, endline) + if p.tok.Pos.Line == prev.Pos.Line { + // The comment is on same line as the previous token; it + // cannot be a lead comment but may be a line comment. + comment, endline = p.consumeCommentGroup(0) + if p.tok.Pos.Line != endline { + // The next token is on a different line, thus + // the last comment group is a line comment. + p.lineComment = comment + } + } + + // consume successor comments, if any + endline = -1 + for p.tok.Type == token.COMMENT { + comment, endline = p.consumeCommentGroup(1) + } + + if endline+1 == p.tok.Pos.Line && p.tok.Type != token.RBRACE { + switch p.tok.Type { + case token.RBRACE, token.RBRACK: + // Do not count for these cases + default: + // The next token is following on the line immediately after the + // comment group, thus the last comment group is a lead comment. + p.leadComment = comment + } + } + + } + + return p.tok +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { + p.n = 1 +} + +// ---------------------------------------------------------------------------- +// Parsing support + +func (p *Parser) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) + + i := 2 * p.indent + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *Parser, msg string) *Parser { + p.printTrace(msg, "(") + p.indent++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *Parser) { + p.indent-- + p.printTrace(")") +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go b/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go new file mode 100644 index 0000000000..7c038d12a2 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go @@ -0,0 +1,789 @@ +package printer + +import ( + "bytes" + "fmt" + "sort" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/token" +) + +const ( + blank = byte(' ') + newline = byte('\n') + tab = byte('\t') + infinity = 1 << 30 // offset or line +) + +var ( + unindent = []byte("\uE123") // in the private use space +) + +type printer struct { + cfg Config + prev token.Pos + + comments []*ast.CommentGroup // may be nil, contains all comments + standaloneComments []*ast.CommentGroup // contains all standalone comments (not assigned to any node) + + enableTrace bool + indentTrace int +} + +type ByPosition []*ast.CommentGroup + +func (b ByPosition) Len() int { return len(b) } +func (b ByPosition) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b ByPosition) Less(i, j int) bool { return b[i].Pos().Before(b[j].Pos()) } + +// collectComments comments all standalone comments which are not lead or line +// comment +func (p *printer) collectComments(node ast.Node) { + // first collect all comments. This is already stored in + // ast.File.(comments) + ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { + switch t := nn.(type) { + case *ast.File: + p.comments = t.Comments + return nn, false + } + return nn, true + }) + + standaloneComments := make(map[token.Pos]*ast.CommentGroup, 0) + for _, c := range p.comments { + standaloneComments[c.Pos()] = c + } + + // next remove all lead and line comments from the overall comment map. + // This will give us comments which are standalone, comments which are not + // assigned to any kind of node. + ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { + switch t := nn.(type) { + case *ast.LiteralType: + if t.LeadComment != nil { + for _, comment := range t.LeadComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + + if t.LineComment != nil { + for _, comment := range t.LineComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + case *ast.ObjectItem: + if t.LeadComment != nil { + for _, comment := range t.LeadComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + + if t.LineComment != nil { + for _, comment := range t.LineComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + } + + return nn, true + }) + + for _, c := range standaloneComments { + p.standaloneComments = append(p.standaloneComments, c) + } + + sort.Sort(ByPosition(p.standaloneComments)) +} + +// output prints creates b printable HCL output and returns it. +func (p *printer) output(n interface{}) []byte { + var buf bytes.Buffer + + switch t := n.(type) { + case *ast.File: + // File doesn't trace so we add the tracing here + defer un(trace(p, "File")) + return p.output(t.Node) + case *ast.ObjectList: + defer un(trace(p, "ObjectList")) + + var index int + for { + // Determine the location of the next actual non-comment + // item. If we're at the end, the next item is at "infinity" + var nextItem token.Pos + if index != len(t.Items) { + nextItem = t.Items[index].Pos() + } else { + nextItem = token.Pos{Offset: infinity, Line: infinity} + } + + // Go through the standalone comments in the file and print out + // the comments that we should be for this object item. + for _, c := range p.standaloneComments { + // Go through all the comments in the group. The group + // should be printed together, not separated by double newlines. + printed := false + newlinePrinted := false + for _, comment := range c.List { + // We only care about comments after the previous item + // we've printed so that comments are printed in the + // correct locations (between two objects for example). + // And before the next item. + if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { + // if we hit the end add newlines so we can print the comment + // we don't do this if prev is invalid which means the + // beginning of the file since the first comment should + // be at the first line. + if !newlinePrinted && p.prev.IsValid() && index == len(t.Items) { + buf.Write([]byte{newline, newline}) + newlinePrinted = true + } + + // Write the actual comment. + buf.WriteString(comment.Text) + buf.WriteByte(newline) + + // Set printed to true to note that we printed something + printed = true + } + } + + // If we're not at the last item, write a new line so + // that there is a newline separating this comment from + // the next object. + if printed && index != len(t.Items) { + buf.WriteByte(newline) + } + } + + if index == len(t.Items) { + break + } + + buf.Write(p.output(t.Items[index])) + if index != len(t.Items)-1 { + // Always write a newline to separate us from the next item + buf.WriteByte(newline) + + // Need to determine if we're going to separate the next item + // with a blank line. The logic here is simple, though there + // are a few conditions: + // + // 1. The next object is more than one line away anyways, + // so we need an empty line. + // + // 2. The next object is not a "single line" object, so + // we need an empty line. + // + // 3. This current object is not a single line object, + // so we need an empty line. + current := t.Items[index] + next := t.Items[index+1] + if next.Pos().Line != t.Items[index].Pos().Line+1 || + !p.isSingleLineObject(next) || + !p.isSingleLineObject(current) { + buf.WriteByte(newline) + } + } + index++ + } + case *ast.ObjectKey: + buf.WriteString(t.Token.Text) + case *ast.ObjectItem: + p.prev = t.Pos() + buf.Write(p.objectItem(t)) + case *ast.LiteralType: + buf.Write(p.literalType(t)) + case *ast.ListType: + buf.Write(p.list(t)) + case *ast.ObjectType: + buf.Write(p.objectType(t)) + default: + fmt.Printf(" unknown type: %T\n", n) + } + + return buf.Bytes() +} + +func (p *printer) literalType(lit *ast.LiteralType) []byte { + result := []byte(lit.Token.Text) + switch lit.Token.Type { + case token.HEREDOC: + // Clear the trailing newline from heredocs + if result[len(result)-1] == '\n' { + result = result[:len(result)-1] + } + + // Poison lines 2+ so that we don't indent them + result = p.heredocIndent(result) + case token.STRING: + // If this is a multiline string, poison lines 2+ so we don't + // indent them. + if bytes.IndexRune(result, '\n') >= 0 { + result = p.heredocIndent(result) + } + } + + return result +} + +// objectItem returns the printable HCL form of an object item. An object type +// starts with one/multiple keys and has a value. The value might be of any +// type. +func (p *printer) objectItem(o *ast.ObjectItem) []byte { + defer un(trace(p, fmt.Sprintf("ObjectItem: %s", o.Keys[0].Token.Text))) + var buf bytes.Buffer + + if o.LeadComment != nil { + for _, comment := range o.LeadComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + // If key and val are on different lines, treat line comments like lead comments. + if o.LineComment != nil && o.Val.Pos().Line != o.Keys[0].Pos().Line { + for _, comment := range o.LineComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + for i, k := range o.Keys { + buf.WriteString(k.Token.Text) + buf.WriteByte(blank) + + // reach end of key + if o.Assign.IsValid() && i == len(o.Keys)-1 && len(o.Keys) == 1 { + buf.WriteString("=") + buf.WriteByte(blank) + } + } + + buf.Write(p.output(o.Val)) + + if o.LineComment != nil && o.Val.Pos().Line == o.Keys[0].Pos().Line { + buf.WriteByte(blank) + for _, comment := range o.LineComment.List { + buf.WriteString(comment.Text) + } + } + + return buf.Bytes() +} + +// objectType returns the printable HCL form of an object type. An object type +// begins with a brace and ends with a brace. +func (p *printer) objectType(o *ast.ObjectType) []byte { + defer un(trace(p, "ObjectType")) + var buf bytes.Buffer + buf.WriteString("{") + + var index int + var nextItem token.Pos + var commented, newlinePrinted bool + for { + // Determine the location of the next actual non-comment + // item. If we're at the end, the next item is the closing brace + if index != len(o.List.Items) { + nextItem = o.List.Items[index].Pos() + } else { + nextItem = o.Rbrace + } + + // Go through the standalone comments in the file and print out + // the comments that we should be for this object item. + for _, c := range p.standaloneComments { + printed := false + var lastCommentPos token.Pos + for _, comment := range c.List { + // We only care about comments after the previous item + // we've printed so that comments are printed in the + // correct locations (between two objects for example). + // And before the next item. + if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { + // If there are standalone comments and the initial newline has not + // been printed yet, do it now. + if !newlinePrinted { + newlinePrinted = true + buf.WriteByte(newline) + } + + // add newline if it's between other printed nodes + if index > 0 { + commented = true + buf.WriteByte(newline) + } + + // Store this position + lastCommentPos = comment.Pos() + + // output the comment itself + buf.Write(p.indent(p.heredocIndent([]byte(comment.Text)))) + + // Set printed to true to note that we printed something + printed = true + + /* + if index != len(o.List.Items) { + buf.WriteByte(newline) // do not print on the end + } + */ + } + } + + // Stuff to do if we had comments + if printed { + // Always write a newline + buf.WriteByte(newline) + + // If there is another item in the object and our comment + // didn't hug it directly, then make sure there is a blank + // line separating them. + if nextItem != o.Rbrace && nextItem.Line != lastCommentPos.Line+1 { + buf.WriteByte(newline) + } + } + } + + if index == len(o.List.Items) { + p.prev = o.Rbrace + break + } + + // At this point we are sure that it's not a totally empty block: print + // the initial newline if it hasn't been printed yet by the previous + // block about standalone comments. + if !newlinePrinted { + buf.WriteByte(newline) + newlinePrinted = true + } + + // check if we have adjacent one liner items. If yes we'll going to align + // the comments. + var aligned []*ast.ObjectItem + for _, item := range o.List.Items[index:] { + // we don't group one line lists + if len(o.List.Items) == 1 { + break + } + + // one means a oneliner with out any lead comment + // two means a oneliner with lead comment + // anything else might be something else + cur := lines(string(p.objectItem(item))) + if cur > 2 { + break + } + + curPos := item.Pos() + + nextPos := token.Pos{} + if index != len(o.List.Items)-1 { + nextPos = o.List.Items[index+1].Pos() + } + + prevPos := token.Pos{} + if index != 0 { + prevPos = o.List.Items[index-1].Pos() + } + + // fmt.Println("DEBUG ----------------") + // fmt.Printf("prev = %+v prevPos: %s\n", prev, prevPos) + // fmt.Printf("cur = %+v curPos: %s\n", cur, curPos) + // fmt.Printf("next = %+v nextPos: %s\n", next, nextPos) + + if curPos.Line+1 == nextPos.Line { + aligned = append(aligned, item) + index++ + continue + } + + if curPos.Line-1 == prevPos.Line { + aligned = append(aligned, item) + index++ + + // finish if we have a new line or comment next. This happens + // if the next item is not adjacent + if curPos.Line+1 != nextPos.Line { + break + } + continue + } + + break + } + + // put newlines if the items are between other non aligned items. + // newlines are also added if there is a standalone comment already, so + // check it too + if !commented && index != len(aligned) { + buf.WriteByte(newline) + } + + if len(aligned) >= 1 { + p.prev = aligned[len(aligned)-1].Pos() + + items := p.alignedItems(aligned) + buf.Write(p.indent(items)) + } else { + p.prev = o.List.Items[index].Pos() + + buf.Write(p.indent(p.objectItem(o.List.Items[index]))) + index++ + } + + buf.WriteByte(newline) + } + + buf.WriteString("}") + return buf.Bytes() +} + +func (p *printer) alignedItems(items []*ast.ObjectItem) []byte { + var buf bytes.Buffer + + // find the longest key and value length, needed for alignment + var longestKeyLen int // longest key length + var longestValLen int // longest value length + for _, item := range items { + key := len(item.Keys[0].Token.Text) + val := len(p.output(item.Val)) + + if key > longestKeyLen { + longestKeyLen = key + } + + if val > longestValLen { + longestValLen = val + } + } + + for i, item := range items { + if item.LeadComment != nil { + for _, comment := range item.LeadComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + for i, k := range item.Keys { + keyLen := len(k.Token.Text) + buf.WriteString(k.Token.Text) + for i := 0; i < longestKeyLen-keyLen+1; i++ { + buf.WriteByte(blank) + } + + // reach end of key + if i == len(item.Keys)-1 && len(item.Keys) == 1 { + buf.WriteString("=") + buf.WriteByte(blank) + } + } + + val := p.output(item.Val) + valLen := len(val) + buf.Write(val) + + if item.Val.Pos().Line == item.Keys[0].Pos().Line && item.LineComment != nil { + for i := 0; i < longestValLen-valLen+1; i++ { + buf.WriteByte(blank) + } + + for _, comment := range item.LineComment.List { + buf.WriteString(comment.Text) + } + } + + // do not print for the last item + if i != len(items)-1 { + buf.WriteByte(newline) + } + } + + return buf.Bytes() +} + +// list returns the printable HCL form of an list type. +func (p *printer) list(l *ast.ListType) []byte { + if p.isSingleLineList(l) { + return p.singleLineList(l) + } + + var buf bytes.Buffer + buf.WriteString("[") + buf.WriteByte(newline) + + var longestLine int + for _, item := range l.List { + // for now we assume that the list only contains literal types + if lit, ok := item.(*ast.LiteralType); ok { + lineLen := len(lit.Token.Text) + if lineLen > longestLine { + longestLine = lineLen + } + } + } + + haveEmptyLine := false + for i, item := range l.List { + // If we have a lead comment, then we want to write that first + leadComment := false + if lit, ok := item.(*ast.LiteralType); ok && lit.LeadComment != nil { + leadComment = true + + // Ensure an empty line before every element with a + // lead comment (except the first item in a list). + if !haveEmptyLine && i != 0 { + buf.WriteByte(newline) + } + + for _, comment := range lit.LeadComment.List { + buf.Write(p.indent([]byte(comment.Text))) + buf.WriteByte(newline) + } + } + + // also indent each line + val := p.output(item) + curLen := len(val) + buf.Write(p.indent(val)) + + // if this item is a heredoc, then we output the comma on + // the next line. This is the only case this happens. + comma := []byte{','} + if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC { + buf.WriteByte(newline) + comma = p.indent(comma) + } + + buf.Write(comma) + + if lit, ok := item.(*ast.LiteralType); ok && lit.LineComment != nil { + // if the next item doesn't have any comments, do not align + buf.WriteByte(blank) // align one space + for i := 0; i < longestLine-curLen; i++ { + buf.WriteByte(blank) + } + + for _, comment := range lit.LineComment.List { + buf.WriteString(comment.Text) + } + } + + buf.WriteByte(newline) + + // Ensure an empty line after every element with a + // lead comment (except the first item in a list). + haveEmptyLine = leadComment && i != len(l.List)-1 + if haveEmptyLine { + buf.WriteByte(newline) + } + } + + buf.WriteString("]") + return buf.Bytes() +} + +// isSingleLineList returns true if: +// * they were previously formatted entirely on one line +// * they consist entirely of literals +// * there are either no heredoc strings or the list has exactly one element +// * there are no line comments +func (printer) isSingleLineList(l *ast.ListType) bool { + for _, item := range l.List { + if item.Pos().Line != l.Lbrack.Line { + return false + } + + lit, ok := item.(*ast.LiteralType) + if !ok { + return false + } + + if lit.Token.Type == token.HEREDOC && len(l.List) != 1 { + return false + } + + if lit.LineComment != nil { + return false + } + } + + return true +} + +// singleLineList prints a simple single line list. +// For a definition of "simple", see isSingleLineList above. +func (p *printer) singleLineList(l *ast.ListType) []byte { + buf := &bytes.Buffer{} + + buf.WriteString("[") + for i, item := range l.List { + if i != 0 { + buf.WriteString(", ") + } + + // Output the item itself + buf.Write(p.output(item)) + + // The heredoc marker needs to be at the end of line. + if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC { + buf.WriteByte(newline) + } + } + + buf.WriteString("]") + return buf.Bytes() +} + +// indent indents the lines of the given buffer for each non-empty line +func (p *printer) indent(buf []byte) []byte { + var prefix []byte + if p.cfg.SpacesWidth != 0 { + for i := 0; i < p.cfg.SpacesWidth; i++ { + prefix = append(prefix, blank) + } + } else { + prefix = []byte{tab} + } + + var res []byte + bol := true + for _, c := range buf { + if bol && c != '\n' { + res = append(res, prefix...) + } + + res = append(res, c) + bol = c == '\n' + } + return res +} + +// unindent removes all the indentation from the tombstoned lines +func (p *printer) unindent(buf []byte) []byte { + var res []byte + for i := 0; i < len(buf); i++ { + skip := len(buf)-i <= len(unindent) + if !skip { + skip = !bytes.Equal(unindent, buf[i:i+len(unindent)]) + } + if skip { + res = append(res, buf[i]) + continue + } + + // We have a marker. we have to backtrace here and clean out + // any whitespace ahead of our tombstone up to a \n + for j := len(res) - 1; j >= 0; j-- { + if res[j] == '\n' { + break + } + + res = res[:j] + } + + // Skip the entire unindent marker + i += len(unindent) - 1 + } + + return res +} + +// heredocIndent marks all the 2nd and further lines as unindentable +func (p *printer) heredocIndent(buf []byte) []byte { + var res []byte + bol := false + for _, c := range buf { + if bol && c != '\n' { + res = append(res, unindent...) + } + res = append(res, c) + bol = c == '\n' + } + return res +} + +// isSingleLineObject tells whether the given object item is a single +// line object such as "obj {}". +// +// A single line object: +// +// * has no lead comments (hence multi-line) +// * has no assignment +// * has no values in the stanza (within {}) +// +func (p *printer) isSingleLineObject(val *ast.ObjectItem) bool { + // If there is a lead comment, can't be one line + if val.LeadComment != nil { + return false + } + + // If there is assignment, we always break by line + if val.Assign.IsValid() { + return false + } + + // If it isn't an object type, then its not a single line object + ot, ok := val.Val.(*ast.ObjectType) + if !ok { + return false + } + + // If the object has no items, it is single line! + return len(ot.List.Items) == 0 +} + +func lines(txt string) int { + endline := 1 + for i := 0; i < len(txt); i++ { + if txt[i] == '\n' { + endline++ + } + } + return endline +} + +// ---------------------------------------------------------------------------- +// Tracing support + +func (p *printer) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + i := 2 * p.indentTrace + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *printer, msg string) *printer { + p.printTrace(msg, "(") + p.indentTrace++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *printer) { + p.indentTrace-- + p.printTrace(")") +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go b/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go new file mode 100644 index 0000000000..6617ab8e7a --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go @@ -0,0 +1,66 @@ +// Package printer implements printing of AST nodes to HCL format. +package printer + +import ( + "bytes" + "io" + "text/tabwriter" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/parser" +) + +var DefaultConfig = Config{ + SpacesWidth: 2, +} + +// A Config node controls the output of Fprint. +type Config struct { + SpacesWidth int // if set, it will use spaces instead of tabs for alignment +} + +func (c *Config) Fprint(output io.Writer, node ast.Node) error { + p := &printer{ + cfg: *c, + comments: make([]*ast.CommentGroup, 0), + standaloneComments: make([]*ast.CommentGroup, 0), + // enableTrace: true, + } + + p.collectComments(node) + + if _, err := output.Write(p.unindent(p.output(node))); err != nil { + return err + } + + // flush tabwriter, if any + var err error + if tw, _ := output.(*tabwriter.Writer); tw != nil { + err = tw.Flush() + } + + return err +} + +// Fprint "pretty-prints" an HCL node to output +// It calls Config.Fprint with default settings. +func Fprint(output io.Writer, node ast.Node) error { + return DefaultConfig.Fprint(output, node) +} + +// Format formats src HCL and returns the result. +func Format(src []byte) ([]byte, error) { + node, err := parser.Parse(src) + if err != nil { + return nil, err + } + + var buf bytes.Buffer + if err := DefaultConfig.Fprint(&buf, node); err != nil { + return nil, err + } + + // Add trailing newline to result + buf.WriteString("\n") + return buf.Bytes(), nil +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go new file mode 100644 index 0000000000..624a18fe3a --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go @@ -0,0 +1,652 @@ +// Package scanner implements a scanner for HCL (HashiCorp Configuration +// Language) source text. +package scanner + +import ( + "bytes" + "fmt" + "os" + "regexp" + "unicode" + "unicode/utf8" + + "github.com/hashicorp/hcl/hcl/token" +) + +// eof represents a marker rune for the end of the reader. +const eof = rune(0) + +// Scanner defines a lexical scanner +type Scanner struct { + buf *bytes.Buffer // Source buffer for advancing and scanning + src []byte // Source buffer for immutable access + + // Source Position + srcPos token.Pos // current position + prevPos token.Pos // previous position, used for peek() method + + lastCharLen int // length of last character in bytes + lastLineLen int // length of last line in characters (for correct column reporting) + + tokStart int // token text start position + tokEnd int // token text end position + + // Error is called for each error encountered. If no Error + // function is set, the error is reported to os.Stderr. + Error func(pos token.Pos, msg string) + + // ErrorCount is incremented by one for each error encountered. + ErrorCount int + + // tokPos is the start position of most recently scanned token; set by + // Scan. The Filename field is always left untouched by the Scanner. If + // an error is reported (via Error) and Position is invalid, the scanner is + // not inside a token. + tokPos token.Pos +} + +// New creates and initializes a new instance of Scanner using src as +// its source content. +func New(src []byte) *Scanner { + // even though we accept a src, we read from a io.Reader compatible type + // (*bytes.Buffer). So in the future we might easily change it to streaming + // read. + b := bytes.NewBuffer(src) + s := &Scanner{ + buf: b, + src: src, + } + + // srcPosition always starts with 1 + s.srcPos.Line = 1 + return s +} + +// next reads the next rune from the bufferred reader. Returns the rune(0) if +// an error occurs (or io.EOF is returned). +func (s *Scanner) next() rune { + ch, size, err := s.buf.ReadRune() + if err != nil { + // advance for error reporting + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + return eof + } + + // remember last position + s.prevPos = s.srcPos + + s.srcPos.Column++ + s.lastCharLen = size + s.srcPos.Offset += size + + if ch == utf8.RuneError && size == 1 { + s.err("illegal UTF-8 encoding") + return ch + } + + if ch == '\n' { + s.srcPos.Line++ + s.lastLineLen = s.srcPos.Column + s.srcPos.Column = 0 + } + + if ch == '\x00' { + s.err("unexpected null character (0x00)") + return eof + } + + if ch == '\uE123' { + s.err("unicode code point U+E123 reserved for internal use") + return utf8.RuneError + } + + // debug + // fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column) + return ch +} + +// unread unreads the previous read Rune and updates the source position +func (s *Scanner) unread() { + if err := s.buf.UnreadRune(); err != nil { + panic(err) // this is user fault, we should catch it + } + s.srcPos = s.prevPos // put back last position +} + +// peek returns the next rune without advancing the reader. +func (s *Scanner) peek() rune { + peek, _, err := s.buf.ReadRune() + if err != nil { + return eof + } + + s.buf.UnreadRune() + return peek +} + +// Scan scans the next token and returns the token. +func (s *Scanner) Scan() token.Token { + ch := s.next() + + // skip white space + for isWhitespace(ch) { + ch = s.next() + } + + var tok token.Type + + // token text markings + s.tokStart = s.srcPos.Offset - s.lastCharLen + + // token position, initial next() is moving the offset by one(size of rune + // actually), though we are interested with the starting point + s.tokPos.Offset = s.srcPos.Offset - s.lastCharLen + if s.srcPos.Column > 0 { + // common case: last character was not a '\n' + s.tokPos.Line = s.srcPos.Line + s.tokPos.Column = s.srcPos.Column + } else { + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + s.tokPos.Line = s.srcPos.Line - 1 + s.tokPos.Column = s.lastLineLen + } + + switch { + case isLetter(ch): + tok = token.IDENT + lit := s.scanIdentifier() + if lit == "true" || lit == "false" { + tok = token.BOOL + } + case isDecimal(ch): + tok = s.scanNumber(ch) + default: + switch ch { + case eof: + tok = token.EOF + case '"': + tok = token.STRING + s.scanString() + case '#', '/': + tok = token.COMMENT + s.scanComment(ch) + case '.': + tok = token.PERIOD + ch = s.peek() + if isDecimal(ch) { + tok = token.FLOAT + ch = s.scanMantissa(ch) + ch = s.scanExponent(ch) + } + case '<': + tok = token.HEREDOC + s.scanHeredoc() + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case '{': + tok = token.LBRACE + case '}': + tok = token.RBRACE + case ',': + tok = token.COMMA + case '=': + tok = token.ASSIGN + case '+': + tok = token.ADD + case '-': + if isDecimal(s.peek()) { + ch := s.next() + tok = s.scanNumber(ch) + } else { + tok = token.SUB + } + default: + s.err("illegal char") + } + } + + // finish token ending + s.tokEnd = s.srcPos.Offset + + // create token literal + var tokenText string + if s.tokStart >= 0 { + tokenText = string(s.src[s.tokStart:s.tokEnd]) + } + s.tokStart = s.tokEnd // ensure idempotency of tokenText() call + + return token.Token{ + Type: tok, + Pos: s.tokPos, + Text: tokenText, + } +} + +func (s *Scanner) scanComment(ch rune) { + // single line comments + if ch == '#' || (ch == '/' && s.peek() != '*') { + if ch == '/' && s.peek() != '/' { + s.err("expected '/' for comment") + return + } + + ch = s.next() + for ch != '\n' && ch >= 0 && ch != eof { + ch = s.next() + } + if ch != eof && ch >= 0 { + s.unread() + } + return + } + + // be sure we get the character after /* This allows us to find comment's + // that are not erminated + if ch == '/' { + s.next() + ch = s.next() // read character after "/*" + } + + // look for /* - style comments + for { + if ch < 0 || ch == eof { + s.err("comment not terminated") + break + } + + ch0 := ch + ch = s.next() + if ch0 == '*' && ch == '/' { + break + } + } +} + +// scanNumber scans a HCL number definition starting with the given rune +func (s *Scanner) scanNumber(ch rune) token.Type { + if ch == '0' { + // check for hexadecimal, octal or float + ch = s.next() + if ch == 'x' || ch == 'X' { + // hexadecimal + ch = s.next() + found := false + for isHexadecimal(ch) { + ch = s.next() + found = true + } + + if !found { + s.err("illegal hexadecimal number") + } + + if ch != eof { + s.unread() + } + + return token.NUMBER + } + + // now it's either something like: 0421(octal) or 0.1231(float) + illegalOctal := false + for isDecimal(ch) { + ch = s.next() + if ch == '8' || ch == '9' { + // this is just a possibility. For example 0159 is illegal, but + // 0159.23 is valid. So we mark a possible illegal octal. If + // the next character is not a period, we'll print the error. + illegalOctal = true + } + } + + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if illegalOctal { + s.err("illegal octal number") + } + + if ch != eof { + s.unread() + } + return token.NUMBER + } + + s.scanMantissa(ch) + ch = s.next() // seek forward + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if ch != eof { + s.unread() + } + return token.NUMBER +} + +// scanMantissa scans the mantissa beginning from the rune. It returns the next +// non decimal rune. It's used to determine wheter it's a fraction or exponent. +func (s *Scanner) scanMantissa(ch rune) rune { + scanned := false + for isDecimal(ch) { + ch = s.next() + scanned = true + } + + if scanned && ch != eof { + s.unread() + } + return ch +} + +// scanFraction scans the fraction after the '.' rune +func (s *Scanner) scanFraction(ch rune) rune { + if ch == '.' { + ch = s.peek() // we peek just to see if we can move forward + ch = s.scanMantissa(ch) + } + return ch +} + +// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' +// rune. +func (s *Scanner) scanExponent(ch rune) rune { + if ch == 'e' || ch == 'E' { + ch = s.next() + if ch == '-' || ch == '+' { + ch = s.next() + } + ch = s.scanMantissa(ch) + } + return ch +} + +// scanHeredoc scans a heredoc string +func (s *Scanner) scanHeredoc() { + // Scan the second '<' in example: '<= len(identBytes) && identRegexp.Match(s.src[lineStart:s.srcPos.Offset-s.lastCharLen]) { + break + } + + // Not an anchor match, record the start of a new line + lineStart = s.srcPos.Offset + } + + if ch == eof { + s.err("heredoc not terminated") + return + } + } + + return +} + +// scanString scans a quoted string +func (s *Scanner) scanString() { + braces := 0 + for { + // '"' opening already consumed + // read character after quote + ch := s.next() + + if (ch == '\n' && braces == 0) || ch < 0 || ch == eof { + s.err("literal not terminated") + return + } + + if ch == '"' && braces == 0 { + break + } + + // If we're going into a ${} then we can ignore quotes for awhile + if braces == 0 && ch == '$' && s.peek() == '{' { + braces++ + s.next() + } else if braces > 0 && ch == '{' { + braces++ + } + if braces > 0 && ch == '}' { + braces-- + } + + if ch == '\\' { + s.scanEscape() + } + } + + return +} + +// scanEscape scans an escape sequence +func (s *Scanner) scanEscape() rune { + // http://en.cppreference.com/w/cpp/language/escape + ch := s.next() // read character after '/' + switch ch { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': + // nothing to do + case '0', '1', '2', '3', '4', '5', '6', '7': + // octal notation + ch = s.scanDigits(ch, 8, 3) + case 'x': + // hexademical notation + ch = s.scanDigits(s.next(), 16, 2) + case 'u': + // universal character name + ch = s.scanDigits(s.next(), 16, 4) + case 'U': + // universal character name + ch = s.scanDigits(s.next(), 16, 8) + default: + s.err("illegal char escape") + } + return ch +} + +// scanDigits scans a rune with the given base for n times. For example an +// octal notation \184 would yield in scanDigits(ch, 8, 3) +func (s *Scanner) scanDigits(ch rune, base, n int) rune { + start := n + for n > 0 && digitVal(ch) < base { + ch = s.next() + if ch == eof { + // If we see an EOF, we halt any more scanning of digits + // immediately. + break + } + + n-- + } + if n > 0 { + s.err("illegal char escape") + } + + if n != start && ch != eof { + // we scanned all digits, put the last non digit char back, + // only if we read anything at all + s.unread() + } + + return ch +} + +// scanIdentifier scans an identifier and returns the literal string +func (s *Scanner) scanIdentifier() string { + offs := s.srcPos.Offset - s.lastCharLen + ch := s.next() + for isLetter(ch) || isDigit(ch) || ch == '-' || ch == '.' { + ch = s.next() + } + + if ch != eof { + s.unread() // we got identifier, put back latest char + } + + return string(s.src[offs:s.srcPos.Offset]) +} + +// recentPosition returns the position of the character immediately after the +// character or token returned by the last call to Scan. +func (s *Scanner) recentPosition() (pos token.Pos) { + pos.Offset = s.srcPos.Offset - s.lastCharLen + switch { + case s.srcPos.Column > 0: + // common case: last character was not a '\n' + pos.Line = s.srcPos.Line + pos.Column = s.srcPos.Column + case s.lastLineLen > 0: + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + pos.Line = s.srcPos.Line - 1 + pos.Column = s.lastLineLen + default: + // at the beginning of the source + pos.Line = 1 + pos.Column = 1 + } + return +} + +// err prints the error of any scanning to s.Error function. If the function is +// not defined, by default it prints them to os.Stderr +func (s *Scanner) err(msg string) { + s.ErrorCount++ + pos := s.recentPosition() + + if s.Error != nil { + s.Error(pos, msg) + return + } + + fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) +} + +// isHexadecimal returns true if the given rune is a letter +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) +} + +// isDigit returns true if the given rune is a decimal digit +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +// isDecimal returns true if the given rune is a decimal number +func isDecimal(ch rune) bool { + return '0' <= ch && ch <= '9' +} + +// isHexadecimal returns true if the given rune is an hexadecimal number +func isHexadecimal(ch rune) bool { + return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' +} + +// isWhitespace returns true if the rune is a space, tab, newline or carriage return +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' +} + +// digitVal returns the integer value of a given octal,decimal or hexadecimal rune +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch - '0') + case 'a' <= ch && ch <= 'f': + return int(ch - 'a' + 10) + case 'A' <= ch && ch <= 'F': + return int(ch - 'A' + 10) + } + return 16 // larger than any legal digit val +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go b/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go new file mode 100644 index 0000000000..5f981eaa2f --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go @@ -0,0 +1,241 @@ +package strconv + +import ( + "errors" + "unicode/utf8" +) + +// ErrSyntax indicates that a value does not have the right syntax for the target type. +var ErrSyntax = errors.New("invalid syntax") + +// Unquote interprets s as a single-quoted, double-quoted, +// or backquoted Go string literal, returning the string value +// that s quotes. (If s is single-quoted, it would be a Go +// character literal; Unquote returns the corresponding +// one-character string.) +func Unquote(s string) (t string, err error) { + n := len(s) + if n < 2 { + return "", ErrSyntax + } + quote := s[0] + if quote != s[n-1] { + return "", ErrSyntax + } + s = s[1 : n-1] + + if quote != '"' { + return "", ErrSyntax + } + if !contains(s, '$') && !contains(s, '{') && contains(s, '\n') { + return "", ErrSyntax + } + + // Is it trivial? Avoid allocation. + if !contains(s, '\\') && !contains(s, quote) && !contains(s, '$') { + switch quote { + case '"': + return s, nil + case '\'': + r, size := utf8.DecodeRuneInString(s) + if size == len(s) && (r != utf8.RuneError || size != 1) { + return s, nil + } + } + } + + var runeTmp [utf8.UTFMax]byte + buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations. + for len(s) > 0 { + // If we're starting a '${}' then let it through un-unquoted. + // Specifically: we don't unquote any characters within the `${}` + // section. + if s[0] == '$' && len(s) > 1 && s[1] == '{' { + buf = append(buf, '$', '{') + s = s[2:] + + // Continue reading until we find the closing brace, copying as-is + braces := 1 + for len(s) > 0 && braces > 0 { + r, size := utf8.DecodeRuneInString(s) + if r == utf8.RuneError { + return "", ErrSyntax + } + + s = s[size:] + + n := utf8.EncodeRune(runeTmp[:], r) + buf = append(buf, runeTmp[:n]...) + + switch r { + case '{': + braces++ + case '}': + braces-- + } + } + if braces != 0 { + return "", ErrSyntax + } + if len(s) == 0 { + // If there's no string left, we're done! + break + } else { + // If there's more left, we need to pop back up to the top of the loop + // in case there's another interpolation in this string. + continue + } + } + + if s[0] == '\n' { + return "", ErrSyntax + } + + c, multibyte, ss, err := unquoteChar(s, quote) + if err != nil { + return "", err + } + s = ss + if c < utf8.RuneSelf || !multibyte { + buf = append(buf, byte(c)) + } else { + n := utf8.EncodeRune(runeTmp[:], c) + buf = append(buf, runeTmp[:n]...) + } + if quote == '\'' && len(s) != 0 { + // single-quoted must be single character + return "", ErrSyntax + } + } + return string(buf), nil +} + +// contains reports whether the string contains the byte c. +func contains(s string, c byte) bool { + for i := 0; i < len(s); i++ { + if s[i] == c { + return true + } + } + return false +} + +func unhex(b byte) (v rune, ok bool) { + c := rune(b) + switch { + case '0' <= c && c <= '9': + return c - '0', true + case 'a' <= c && c <= 'f': + return c - 'a' + 10, true + case 'A' <= c && c <= 'F': + return c - 'A' + 10, true + } + return +} + +func unquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error) { + // easy cases + switch c := s[0]; { + case c == quote && (quote == '\'' || quote == '"'): + err = ErrSyntax + return + case c >= utf8.RuneSelf: + r, size := utf8.DecodeRuneInString(s) + return r, true, s[size:], nil + case c != '\\': + return rune(s[0]), false, s[1:], nil + } + + // hard case: c is backslash + if len(s) <= 1 { + err = ErrSyntax + return + } + c := s[1] + s = s[2:] + + switch c { + case 'a': + value = '\a' + case 'b': + value = '\b' + case 'f': + value = '\f' + case 'n': + value = '\n' + case 'r': + value = '\r' + case 't': + value = '\t' + case 'v': + value = '\v' + case 'x', 'u', 'U': + n := 0 + switch c { + case 'x': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + var v rune + if len(s) < n { + err = ErrSyntax + return + } + for j := 0; j < n; j++ { + x, ok := unhex(s[j]) + if !ok { + err = ErrSyntax + return + } + v = v<<4 | x + } + s = s[n:] + if c == 'x' { + // single-byte string, possibly not UTF-8 + value = v + break + } + if v > utf8.MaxRune { + err = ErrSyntax + return + } + value = v + multibyte = true + case '0', '1', '2', '3', '4', '5', '6', '7': + v := rune(c) - '0' + if len(s) < 2 { + err = ErrSyntax + return + } + for j := 0; j < 2; j++ { // one digit already; two more + x := rune(s[j]) - '0' + if x < 0 || x > 7 { + err = ErrSyntax + return + } + v = (v << 3) | x + } + s = s[2:] + if v > 255 { + err = ErrSyntax + return + } + value = v + case '\\': + value = '\\' + case '\'', '"': + if c != quote { + err = ErrSyntax + return + } + value = rune(c) + default: + err = ErrSyntax + return + } + tail = s + return +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/token/position.go b/vendor/github.com/hashicorp/hcl/hcl/token/position.go new file mode 100644 index 0000000000..59c1bb72d4 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/token/position.go @@ -0,0 +1,46 @@ +package token + +import "fmt" + +// Pos describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +type Pos struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (p *Pos) IsValid() bool { return p.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +func (p Pos) String() string { + s := p.Filename + if p.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", p.Line, p.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Before reports whether the position p is before u. +func (p Pos) Before(u Pos) bool { + return u.Offset > p.Offset || u.Line > p.Line +} + +// After reports whether the position p is after u. +func (p Pos) After(u Pos) bool { + return u.Offset < p.Offset || u.Line < p.Line +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/token/token.go b/vendor/github.com/hashicorp/hcl/hcl/token/token.go new file mode 100644 index 0000000000..e37c0664ec --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/token/token.go @@ -0,0 +1,219 @@ +// Package token defines constants representing the lexical tokens for HCL +// (HashiCorp Configuration Language) +package token + +import ( + "fmt" + "strconv" + "strings" + + hclstrconv "github.com/hashicorp/hcl/hcl/strconv" +) + +// Token defines a single HCL token which can be obtained via the Scanner +type Token struct { + Type Type + Pos Pos + Text string + JSON bool +} + +// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) +type Type int + +const ( + // Special tokens + ILLEGAL Type = iota + EOF + COMMENT + + identifier_beg + IDENT // literals + literal_beg + NUMBER // 12345 + FLOAT // 123.45 + BOOL // true,false + STRING // "abc" + HEREDOC // < 0 { + // Pop the current item + n := len(frontier) + item := frontier[n-1] + frontier = frontier[:n-1] + + switch v := item.Val.(type) { + case *ast.ObjectType: + items, frontier = flattenObjectType(v, item, items, frontier) + case *ast.ListType: + items, frontier = flattenListType(v, item, items, frontier) + default: + items = append(items, item) + } + } + + // Reverse the list since the frontier model runs things backwards + for i := len(items)/2 - 1; i >= 0; i-- { + opp := len(items) - 1 - i + items[i], items[opp] = items[opp], items[i] + } + + // Done! Set the original items + list.Items = items + return n, true + }) +} + +func flattenListType( + ot *ast.ListType, + item *ast.ObjectItem, + items []*ast.ObjectItem, + frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { + // If the list is empty, keep the original list + if len(ot.List) == 0 { + items = append(items, item) + return items, frontier + } + + // All the elements of this object must also be objects! + for _, subitem := range ot.List { + if _, ok := subitem.(*ast.ObjectType); !ok { + items = append(items, item) + return items, frontier + } + } + + // Great! We have a match go through all the items and flatten + for _, elem := range ot.List { + // Add it to the frontier so that we can recurse + frontier = append(frontier, &ast.ObjectItem{ + Keys: item.Keys, + Assign: item.Assign, + Val: elem, + LeadComment: item.LeadComment, + LineComment: item.LineComment, + }) + } + + return items, frontier +} + +func flattenObjectType( + ot *ast.ObjectType, + item *ast.ObjectItem, + items []*ast.ObjectItem, + frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { + // If the list has no items we do not have to flatten anything + if ot.List.Items == nil { + items = append(items, item) + return items, frontier + } + + // All the elements of this object must also be objects! + for _, subitem := range ot.List.Items { + if _, ok := subitem.Val.(*ast.ObjectType); !ok { + items = append(items, item) + return items, frontier + } + } + + // Great! We have a match go through all the items and flatten + for _, subitem := range ot.List.Items { + // Copy the new key + keys := make([]*ast.ObjectKey, len(item.Keys)+len(subitem.Keys)) + copy(keys, item.Keys) + copy(keys[len(item.Keys):], subitem.Keys) + + // Add it to the frontier so that we can recurse + frontier = append(frontier, &ast.ObjectItem{ + Keys: keys, + Assign: item.Assign, + Val: subitem.Val, + LeadComment: item.LeadComment, + LineComment: item.LineComment, + }) + } + + return items, frontier +} diff --git a/vendor/github.com/hashicorp/hcl/json/parser/parser.go b/vendor/github.com/hashicorp/hcl/json/parser/parser.go new file mode 100644 index 0000000000..125a5f0729 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/parser/parser.go @@ -0,0 +1,313 @@ +package parser + +import ( + "errors" + "fmt" + + "github.com/hashicorp/hcl/hcl/ast" + hcltoken "github.com/hashicorp/hcl/hcl/token" + "github.com/hashicorp/hcl/json/scanner" + "github.com/hashicorp/hcl/json/token" +) + +type Parser struct { + sc *scanner.Scanner + + // Last read token + tok token.Token + commaPrev token.Token + + enableTrace bool + indent int + n int // buffer size (max = 1) +} + +func newParser(src []byte) *Parser { + return &Parser{ + sc: scanner.New(src), + } +} + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func Parse(src []byte) (*ast.File, error) { + p := newParser(src) + return p.Parse() +} + +var errEofToken = errors.New("EOF token found") + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func (p *Parser) Parse() (*ast.File, error) { + f := &ast.File{} + var err, scerr error + p.sc.Error = func(pos token.Pos, msg string) { + scerr = fmt.Errorf("%s: %s", pos, msg) + } + + // The root must be an object in JSON + object, err := p.object() + if scerr != nil { + return nil, scerr + } + if err != nil { + return nil, err + } + + // We make our final node an object list so it is more HCL compatible + f.Node = object.List + + // Flatten it, which finds patterns and turns them into more HCL-like + // AST trees. + flattenObjects(f.Node) + + return f, nil +} + +func (p *Parser) objectList() (*ast.ObjectList, error) { + defer un(trace(p, "ParseObjectList")) + node := &ast.ObjectList{} + + for { + n, err := p.objectItem() + if err == errEofToken { + break // we are finished + } + + // we don't return a nil node, because might want to use already + // collected items. + if err != nil { + return node, err + } + + node.Add(n) + + // Check for a followup comma. If it isn't a comma, then we're done + if tok := p.scan(); tok.Type != token.COMMA { + break + } + } + + return node, nil +} + +// objectItem parses a single object item +func (p *Parser) objectItem() (*ast.ObjectItem, error) { + defer un(trace(p, "ParseObjectItem")) + + keys, err := p.objectKey() + if err != nil { + return nil, err + } + + o := &ast.ObjectItem{ + Keys: keys, + } + + switch p.tok.Type { + case token.COLON: + pos := p.tok.Pos + o.Assign = hcltoken.Pos{ + Filename: pos.Filename, + Offset: pos.Offset, + Line: pos.Line, + Column: pos.Column, + } + + o.Val, err = p.objectValue() + if err != nil { + return nil, err + } + } + + return o, nil +} + +// objectKey parses an object key and returns a ObjectKey AST +func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { + keyCount := 0 + keys := make([]*ast.ObjectKey, 0) + + for { + tok := p.scan() + switch tok.Type { + case token.EOF: + return nil, errEofToken + case token.STRING: + keyCount++ + keys = append(keys, &ast.ObjectKey{ + Token: p.tok.HCLToken(), + }) + case token.COLON: + // If we have a zero keycount it means that we never got + // an object key, i.e. `{ :`. This is a syntax error. + if keyCount == 0 { + return nil, fmt.Errorf("expected: STRING got: %s", p.tok.Type) + } + + // Done + return keys, nil + case token.ILLEGAL: + return nil, errors.New("illegal") + default: + return nil, fmt.Errorf("expected: STRING got: %s", p.tok.Type) + } + } +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) objectValue() (ast.Node, error) { + defer un(trace(p, "ParseObjectValue")) + tok := p.scan() + + switch tok.Type { + case token.NUMBER, token.FLOAT, token.BOOL, token.NULL, token.STRING: + return p.literalType() + case token.LBRACE: + return p.objectType() + case token.LBRACK: + return p.listType() + case token.EOF: + return nil, errEofToken + } + + return nil, fmt.Errorf("Expected object value, got unknown token: %+v", tok) +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) object() (*ast.ObjectType, error) { + defer un(trace(p, "ParseType")) + tok := p.scan() + + switch tok.Type { + case token.LBRACE: + return p.objectType() + case token.EOF: + return nil, errEofToken + } + + return nil, fmt.Errorf("Expected object, got unknown token: %+v", tok) +} + +// objectType parses an object type and returns a ObjectType AST +func (p *Parser) objectType() (*ast.ObjectType, error) { + defer un(trace(p, "ParseObjectType")) + + // we assume that the currently scanned token is a LBRACE + o := &ast.ObjectType{} + + l, err := p.objectList() + + // if we hit RBRACE, we are good to go (means we parsed all Items), if it's + // not a RBRACE, it's an syntax error and we just return it. + if err != nil && p.tok.Type != token.RBRACE { + return nil, err + } + + o.List = l + return o, nil +} + +// listType parses a list type and returns a ListType AST +func (p *Parser) listType() (*ast.ListType, error) { + defer un(trace(p, "ParseListType")) + + // we assume that the currently scanned token is a LBRACK + l := &ast.ListType{} + + for { + tok := p.scan() + switch tok.Type { + case token.NUMBER, token.FLOAT, token.STRING: + node, err := p.literalType() + if err != nil { + return nil, err + } + + l.Add(node) + case token.COMMA: + continue + case token.LBRACE: + node, err := p.objectType() + if err != nil { + return nil, err + } + + l.Add(node) + case token.BOOL: + // TODO(arslan) should we support? not supported by HCL yet + case token.LBRACK: + // TODO(arslan) should we support nested lists? Even though it's + // written in README of HCL, it's not a part of the grammar + // (not defined in parse.y) + case token.RBRACK: + // finished + return l, nil + default: + return nil, fmt.Errorf("unexpected token while parsing list: %s", tok.Type) + } + + } +} + +// literalType parses a literal type and returns a LiteralType AST +func (p *Parser) literalType() (*ast.LiteralType, error) { + defer un(trace(p, "ParseLiteral")) + + return &ast.LiteralType{ + Token: p.tok.HCLToken(), + }, nil +} + +// scan returns the next token from the underlying scanner. If a token has +// been unscanned then read that instead. +func (p *Parser) scan() token.Token { + // If we have a token on the buffer, then return it. + if p.n != 0 { + p.n = 0 + return p.tok + } + + p.tok = p.sc.Scan() + return p.tok +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { + p.n = 1 +} + +// ---------------------------------------------------------------------------- +// Parsing support + +func (p *Parser) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) + + i := 2 * p.indent + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *Parser, msg string) *Parser { + p.printTrace(msg, "(") + p.indent++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *Parser) { + p.indent-- + p.printTrace(")") +} diff --git a/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go b/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go new file mode 100644 index 0000000000..fe3f0f0950 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go @@ -0,0 +1,451 @@ +package scanner + +import ( + "bytes" + "fmt" + "os" + "unicode" + "unicode/utf8" + + "github.com/hashicorp/hcl/json/token" +) + +// eof represents a marker rune for the end of the reader. +const eof = rune(0) + +// Scanner defines a lexical scanner +type Scanner struct { + buf *bytes.Buffer // Source buffer for advancing and scanning + src []byte // Source buffer for immutable access + + // Source Position + srcPos token.Pos // current position + prevPos token.Pos // previous position, used for peek() method + + lastCharLen int // length of last character in bytes + lastLineLen int // length of last line in characters (for correct column reporting) + + tokStart int // token text start position + tokEnd int // token text end position + + // Error is called for each error encountered. If no Error + // function is set, the error is reported to os.Stderr. + Error func(pos token.Pos, msg string) + + // ErrorCount is incremented by one for each error encountered. + ErrorCount int + + // tokPos is the start position of most recently scanned token; set by + // Scan. The Filename field is always left untouched by the Scanner. If + // an error is reported (via Error) and Position is invalid, the scanner is + // not inside a token. + tokPos token.Pos +} + +// New creates and initializes a new instance of Scanner using src as +// its source content. +func New(src []byte) *Scanner { + // even though we accept a src, we read from a io.Reader compatible type + // (*bytes.Buffer). So in the future we might easily change it to streaming + // read. + b := bytes.NewBuffer(src) + s := &Scanner{ + buf: b, + src: src, + } + + // srcPosition always starts with 1 + s.srcPos.Line = 1 + return s +} + +// next reads the next rune from the bufferred reader. Returns the rune(0) if +// an error occurs (or io.EOF is returned). +func (s *Scanner) next() rune { + ch, size, err := s.buf.ReadRune() + if err != nil { + // advance for error reporting + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + return eof + } + + if ch == utf8.RuneError && size == 1 { + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + s.err("illegal UTF-8 encoding") + return ch + } + + // remember last position + s.prevPos = s.srcPos + + s.srcPos.Column++ + s.lastCharLen = size + s.srcPos.Offset += size + + if ch == '\n' { + s.srcPos.Line++ + s.lastLineLen = s.srcPos.Column + s.srcPos.Column = 0 + } + + // debug + // fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column) + return ch +} + +// unread unreads the previous read Rune and updates the source position +func (s *Scanner) unread() { + if err := s.buf.UnreadRune(); err != nil { + panic(err) // this is user fault, we should catch it + } + s.srcPos = s.prevPos // put back last position +} + +// peek returns the next rune without advancing the reader. +func (s *Scanner) peek() rune { + peek, _, err := s.buf.ReadRune() + if err != nil { + return eof + } + + s.buf.UnreadRune() + return peek +} + +// Scan scans the next token and returns the token. +func (s *Scanner) Scan() token.Token { + ch := s.next() + + // skip white space + for isWhitespace(ch) { + ch = s.next() + } + + var tok token.Type + + // token text markings + s.tokStart = s.srcPos.Offset - s.lastCharLen + + // token position, initial next() is moving the offset by one(size of rune + // actually), though we are interested with the starting point + s.tokPos.Offset = s.srcPos.Offset - s.lastCharLen + if s.srcPos.Column > 0 { + // common case: last character was not a '\n' + s.tokPos.Line = s.srcPos.Line + s.tokPos.Column = s.srcPos.Column + } else { + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + s.tokPos.Line = s.srcPos.Line - 1 + s.tokPos.Column = s.lastLineLen + } + + switch { + case isLetter(ch): + lit := s.scanIdentifier() + if lit == "true" || lit == "false" { + tok = token.BOOL + } else if lit == "null" { + tok = token.NULL + } else { + s.err("illegal char") + } + case isDecimal(ch): + tok = s.scanNumber(ch) + default: + switch ch { + case eof: + tok = token.EOF + case '"': + tok = token.STRING + s.scanString() + case '.': + tok = token.PERIOD + ch = s.peek() + if isDecimal(ch) { + tok = token.FLOAT + ch = s.scanMantissa(ch) + ch = s.scanExponent(ch) + } + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case '{': + tok = token.LBRACE + case '}': + tok = token.RBRACE + case ',': + tok = token.COMMA + case ':': + tok = token.COLON + case '-': + if isDecimal(s.peek()) { + ch := s.next() + tok = s.scanNumber(ch) + } else { + s.err("illegal char") + } + default: + s.err("illegal char: " + string(ch)) + } + } + + // finish token ending + s.tokEnd = s.srcPos.Offset + + // create token literal + var tokenText string + if s.tokStart >= 0 { + tokenText = string(s.src[s.tokStart:s.tokEnd]) + } + s.tokStart = s.tokEnd // ensure idempotency of tokenText() call + + return token.Token{ + Type: tok, + Pos: s.tokPos, + Text: tokenText, + } +} + +// scanNumber scans a HCL number definition starting with the given rune +func (s *Scanner) scanNumber(ch rune) token.Type { + zero := ch == '0' + pos := s.srcPos + + s.scanMantissa(ch) + ch = s.next() // seek forward + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if ch != eof { + s.unread() + } + + // If we have a larger number and this is zero, error + if zero && pos != s.srcPos { + s.err("numbers cannot start with 0") + } + + return token.NUMBER +} + +// scanMantissa scans the mantissa beginning from the rune. It returns the next +// non decimal rune. It's used to determine wheter it's a fraction or exponent. +func (s *Scanner) scanMantissa(ch rune) rune { + scanned := false + for isDecimal(ch) { + ch = s.next() + scanned = true + } + + if scanned && ch != eof { + s.unread() + } + return ch +} + +// scanFraction scans the fraction after the '.' rune +func (s *Scanner) scanFraction(ch rune) rune { + if ch == '.' { + ch = s.peek() // we peek just to see if we can move forward + ch = s.scanMantissa(ch) + } + return ch +} + +// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' +// rune. +func (s *Scanner) scanExponent(ch rune) rune { + if ch == 'e' || ch == 'E' { + ch = s.next() + if ch == '-' || ch == '+' { + ch = s.next() + } + ch = s.scanMantissa(ch) + } + return ch +} + +// scanString scans a quoted string +func (s *Scanner) scanString() { + braces := 0 + for { + // '"' opening already consumed + // read character after quote + ch := s.next() + + if ch == '\n' || ch < 0 || ch == eof { + s.err("literal not terminated") + return + } + + if ch == '"' { + break + } + + // If we're going into a ${} then we can ignore quotes for awhile + if braces == 0 && ch == '$' && s.peek() == '{' { + braces++ + s.next() + } else if braces > 0 && ch == '{' { + braces++ + } + if braces > 0 && ch == '}' { + braces-- + } + + if ch == '\\' { + s.scanEscape() + } + } + + return +} + +// scanEscape scans an escape sequence +func (s *Scanner) scanEscape() rune { + // http://en.cppreference.com/w/cpp/language/escape + ch := s.next() // read character after '/' + switch ch { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': + // nothing to do + case '0', '1', '2', '3', '4', '5', '6', '7': + // octal notation + ch = s.scanDigits(ch, 8, 3) + case 'x': + // hexademical notation + ch = s.scanDigits(s.next(), 16, 2) + case 'u': + // universal character name + ch = s.scanDigits(s.next(), 16, 4) + case 'U': + // universal character name + ch = s.scanDigits(s.next(), 16, 8) + default: + s.err("illegal char escape") + } + return ch +} + +// scanDigits scans a rune with the given base for n times. For example an +// octal notation \184 would yield in scanDigits(ch, 8, 3) +func (s *Scanner) scanDigits(ch rune, base, n int) rune { + for n > 0 && digitVal(ch) < base { + ch = s.next() + n-- + } + if n > 0 { + s.err("illegal char escape") + } + + // we scanned all digits, put the last non digit char back + s.unread() + return ch +} + +// scanIdentifier scans an identifier and returns the literal string +func (s *Scanner) scanIdentifier() string { + offs := s.srcPos.Offset - s.lastCharLen + ch := s.next() + for isLetter(ch) || isDigit(ch) || ch == '-' { + ch = s.next() + } + + if ch != eof { + s.unread() // we got identifier, put back latest char + } + + return string(s.src[offs:s.srcPos.Offset]) +} + +// recentPosition returns the position of the character immediately after the +// character or token returned by the last call to Scan. +func (s *Scanner) recentPosition() (pos token.Pos) { + pos.Offset = s.srcPos.Offset - s.lastCharLen + switch { + case s.srcPos.Column > 0: + // common case: last character was not a '\n' + pos.Line = s.srcPos.Line + pos.Column = s.srcPos.Column + case s.lastLineLen > 0: + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + pos.Line = s.srcPos.Line - 1 + pos.Column = s.lastLineLen + default: + // at the beginning of the source + pos.Line = 1 + pos.Column = 1 + } + return +} + +// err prints the error of any scanning to s.Error function. If the function is +// not defined, by default it prints them to os.Stderr +func (s *Scanner) err(msg string) { + s.ErrorCount++ + pos := s.recentPosition() + + if s.Error != nil { + s.Error(pos, msg) + return + } + + fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) +} + +// isHexadecimal returns true if the given rune is a letter +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) +} + +// isHexadecimal returns true if the given rune is a decimal digit +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +// isHexadecimal returns true if the given rune is a decimal number +func isDecimal(ch rune) bool { + return '0' <= ch && ch <= '9' +} + +// isHexadecimal returns true if the given rune is an hexadecimal number +func isHexadecimal(ch rune) bool { + return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' +} + +// isWhitespace returns true if the rune is a space, tab, newline or carriage return +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' +} + +// digitVal returns the integer value of a given octal,decimal or hexadecimal rune +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch - '0') + case 'a' <= ch && ch <= 'f': + return int(ch - 'a' + 10) + case 'A' <= ch && ch <= 'F': + return int(ch - 'A' + 10) + } + return 16 // larger than any legal digit val +} diff --git a/vendor/github.com/hashicorp/hcl/json/token/position.go b/vendor/github.com/hashicorp/hcl/json/token/position.go new file mode 100644 index 0000000000..59c1bb72d4 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/token/position.go @@ -0,0 +1,46 @@ +package token + +import "fmt" + +// Pos describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +type Pos struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (p *Pos) IsValid() bool { return p.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +func (p Pos) String() string { + s := p.Filename + if p.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", p.Line, p.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Before reports whether the position p is before u. +func (p Pos) Before(u Pos) bool { + return u.Offset > p.Offset || u.Line > p.Line +} + +// After reports whether the position p is after u. +func (p Pos) After(u Pos) bool { + return u.Offset < p.Offset || u.Line < p.Line +} diff --git a/vendor/github.com/hashicorp/hcl/json/token/token.go b/vendor/github.com/hashicorp/hcl/json/token/token.go new file mode 100644 index 0000000000..95a0c3eee6 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/token/token.go @@ -0,0 +1,118 @@ +package token + +import ( + "fmt" + "strconv" + + hcltoken "github.com/hashicorp/hcl/hcl/token" +) + +// Token defines a single HCL token which can be obtained via the Scanner +type Token struct { + Type Type + Pos Pos + Text string +} + +// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) +type Type int + +const ( + // Special tokens + ILLEGAL Type = iota + EOF + + identifier_beg + literal_beg + NUMBER // 12345 + FLOAT // 123.45 + BOOL // true,false + STRING // "abc" + NULL // null + literal_end + identifier_end + + operator_beg + LBRACK // [ + LBRACE // { + COMMA // , + PERIOD // . + COLON // : + + RBRACK // ] + RBRACE // } + + operator_end +) + +var tokens = [...]string{ + ILLEGAL: "ILLEGAL", + + EOF: "EOF", + + NUMBER: "NUMBER", + FLOAT: "FLOAT", + BOOL: "BOOL", + STRING: "STRING", + NULL: "NULL", + + LBRACK: "LBRACK", + LBRACE: "LBRACE", + COMMA: "COMMA", + PERIOD: "PERIOD", + COLON: "COLON", + + RBRACK: "RBRACK", + RBRACE: "RBRACE", +} + +// String returns the string corresponding to the token tok. +func (t Type) String() string { + s := "" + if 0 <= t && t < Type(len(tokens)) { + s = tokens[t] + } + if s == "" { + s = "token(" + strconv.Itoa(int(t)) + ")" + } + return s +} + +// IsIdentifier returns true for tokens corresponding to identifiers and basic +// type literals; it returns false otherwise. +func (t Type) IsIdentifier() bool { return identifier_beg < t && t < identifier_end } + +// IsLiteral returns true for tokens corresponding to basic type literals; it +// returns false otherwise. +func (t Type) IsLiteral() bool { return literal_beg < t && t < literal_end } + +// IsOperator returns true for tokens corresponding to operators and +// delimiters; it returns false otherwise. +func (t Type) IsOperator() bool { return operator_beg < t && t < operator_end } + +// String returns the token's literal text. Note that this is only +// applicable for certain token types, such as token.IDENT, +// token.STRING, etc.. +func (t Token) String() string { + return fmt.Sprintf("%s %s %s", t.Pos.String(), t.Type.String(), t.Text) +} + +// HCLToken converts this token to an HCL token. +// +// The token type must be a literal type or this will panic. +func (t Token) HCLToken() hcltoken.Token { + switch t.Type { + case BOOL: + return hcltoken.Token{Type: hcltoken.BOOL, Text: t.Text} + case FLOAT: + return hcltoken.Token{Type: hcltoken.FLOAT, Text: t.Text} + case NULL: + return hcltoken.Token{Type: hcltoken.STRING, Text: ""} + case NUMBER: + return hcltoken.Token{Type: hcltoken.NUMBER, Text: t.Text} + case STRING: + return hcltoken.Token{Type: hcltoken.STRING, Text: t.Text, JSON: true} + default: + panic(fmt.Sprintf("unimplemented HCLToken for type: %s", t.Type)) + } +} diff --git a/vendor/github.com/hashicorp/hcl/lex.go b/vendor/github.com/hashicorp/hcl/lex.go new file mode 100644 index 0000000000..d9993c2928 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/lex.go @@ -0,0 +1,38 @@ +package hcl + +import ( + "unicode" + "unicode/utf8" +) + +type lexModeValue byte + +const ( + lexModeUnknown lexModeValue = iota + lexModeHcl + lexModeJson +) + +// lexMode returns whether we're going to be parsing in JSON +// mode or HCL mode. +func lexMode(v []byte) lexModeValue { + var ( + r rune + w int + offset int + ) + + for { + r, w = utf8.DecodeRune(v[offset:]) + offset += w + if unicode.IsSpace(r) { + continue + } + if r == '{' { + return lexModeJson + } + break + } + + return lexModeHcl +} diff --git a/vendor/github.com/hashicorp/hcl/parse.go b/vendor/github.com/hashicorp/hcl/parse.go new file mode 100644 index 0000000000..1fca53c4ce --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/parse.go @@ -0,0 +1,39 @@ +package hcl + +import ( + "fmt" + + "github.com/hashicorp/hcl/hcl/ast" + hclParser "github.com/hashicorp/hcl/hcl/parser" + jsonParser "github.com/hashicorp/hcl/json/parser" +) + +// ParseBytes accepts as input byte slice and returns ast tree. +// +// Input can be either JSON or HCL +func ParseBytes(in []byte) (*ast.File, error) { + return parse(in) +} + +// ParseString accepts input as a string and returns ast tree. +func ParseString(input string) (*ast.File, error) { + return parse([]byte(input)) +} + +func parse(in []byte) (*ast.File, error) { + switch lexMode(in) { + case lexModeHcl: + return hclParser.Parse(in) + case lexModeJson: + return jsonParser.Parse(in) + } + + return nil, fmt.Errorf("unknown config format") +} + +// Parse parses the given input and returns the root object. +// +// The input format can be either HCL or JSON. +func Parse(input string) (*ast.File, error) { + return parse([]byte(input)) +} diff --git a/vendor/github.com/magiconair/properties/.gitignore b/vendor/github.com/magiconair/properties/.gitignore new file mode 100644 index 0000000000..e7081ff522 --- /dev/null +++ b/vendor/github.com/magiconair/properties/.gitignore @@ -0,0 +1,6 @@ +*.sublime-project +*.sublime-workspace +*.un~ +*.swp +.idea/ +*.iml diff --git a/vendor/github.com/magiconair/properties/CHANGELOG.md b/vendor/github.com/magiconair/properties/CHANGELOG.md new file mode 100644 index 0000000000..842e8e24fb --- /dev/null +++ b/vendor/github.com/magiconair/properties/CHANGELOG.md @@ -0,0 +1,205 @@ +## Changelog + +### [1.8.7](https://github.com/magiconair/properties/tree/v1.8.7) - 08 Dec 2022 + + * [PR #65](https://github.com/magiconair/properties/pull/65): Speedup Merge + + Thanks to [@AdityaVallabh](https://github.com/AdityaVallabh) for the patch. + + * [PR #66](https://github.com/magiconair/properties/pull/66): use github actions + +### [1.8.6](https://github.com/magiconair/properties/tree/v1.8.6) - 23 Feb 2022 + + * [PR #57](https://github.com/magiconair/properties/pull/57):Fix "unreachable code" lint error + + Thanks to [@ellie](https://github.com/ellie) for the patch. + + * [PR #63](https://github.com/magiconair/properties/pull/63): Make TestMustGetParsedDuration backwards compatible + + This patch ensures that the `TestMustGetParsedDuration` still works with `go1.3` to make the + author happy until it affects real users. + + Thanks to [@maage](https://github.com/maage) for the patch. + +### [1.8.5](https://github.com/magiconair/properties/tree/v1.8.5) - 24 Mar 2021 + + * [PR #55](https://github.com/magiconair/properties/pull/55): Fix: Encoding Bug in Comments + + When reading comments \ are loaded correctly, but when writing they are then + replaced by \\. This leads to wrong comments when writing and reading multiple times. + + Thanks to [@doxsch](https://github.com/doxsch) for the patch. + +### [1.8.4](https://github.com/magiconair/properties/tree/v1.8.4) - 23 Sep 2020 + + * [PR #50](https://github.com/magiconair/properties/pull/50): enhance error message for circular references + + Thanks to [@sriv](https://github.com/sriv) for the patch. + +### [1.8.3](https://github.com/magiconair/properties/tree/v1.8.3) - 14 Sep 2020 + + * [PR #49](https://github.com/magiconair/properties/pull/49): Include the key in error message causing the circular reference + + The change is include the key in the error message which is causing the circular + reference when parsing/loading the properties files. + + Thanks to [@haroon-sheikh](https://github.com/haroon-sheikh) for the patch. + +### [1.8.2](https://github.com/magiconair/properties/tree/v1.8.2) - 25 Aug 2020 + + * [PR #36](https://github.com/magiconair/properties/pull/36): Escape backslash on write + + This patch ensures that backslashes are escaped on write. Existing applications which + rely on the old behavior may need to be updated. + + Thanks to [@apesternikov](https://github.com/apesternikov) for the patch. + + * [PR #42](https://github.com/magiconair/properties/pull/42): Made Content-Type check whitespace agnostic in LoadURL() + + Thanks to [@aliras1](https://github.com/aliras1) for the patch. + + * [PR #41](https://github.com/magiconair/properties/pull/41): Make key/value separator configurable on Write() + + Thanks to [@mkjor](https://github.com/mkjor) for the patch. + + * [PR #40](https://github.com/magiconair/properties/pull/40): Add method to return a sorted list of keys + + Thanks to [@mkjor](https://github.com/mkjor) for the patch. + +### [1.8.1](https://github.com/magiconair/properties/tree/v1.8.1) - 10 May 2019 + + * [PR #35](https://github.com/magiconair/properties/pull/35): Close body always after request + + This patch ensures that in `LoadURL` the response body is always closed. + + Thanks to [@liubog2008](https://github.com/liubog2008) for the patch. + +### [1.8](https://github.com/magiconair/properties/tree/v1.8) - 15 May 2018 + + * [PR #26](https://github.com/magiconair/properties/pull/26): Disable expansion during loading + + This adds the option to disable property expansion during loading. + + Thanks to [@kmala](https://github.com/kmala) for the patch. + +### [1.7.6](https://github.com/magiconair/properties/tree/v1.7.6) - 14 Feb 2018 + + * [PR #29](https://github.com/magiconair/properties/pull/29): Reworked expansion logic to handle more complex cases. + + See PR for an example. + + Thanks to [@yobert](https://github.com/yobert) for the fix. + +### [1.7.5](https://github.com/magiconair/properties/tree/v1.7.5) - 13 Feb 2018 + + * [PR #28](https://github.com/magiconair/properties/pull/28): Support duplicate expansions in the same value + + Values which expand the same key multiple times (e.g. `key=${a} ${a}`) will no longer fail + with a `circular reference error`. + + Thanks to [@yobert](https://github.com/yobert) for the fix. + +### [1.7.4](https://github.com/magiconair/properties/tree/v1.7.4) - 31 Oct 2017 + + * [Issue #23](https://github.com/magiconair/properties/issues/23): Ignore blank lines with whitespaces + + * [PR #24](https://github.com/magiconair/properties/pull/24): Update keys when DisableExpansion is enabled + + Thanks to [@mgurov](https://github.com/mgurov) for the fix. + +### [1.7.3](https://github.com/magiconair/properties/tree/v1.7.3) - 10 Jul 2017 + + * [Issue #17](https://github.com/magiconair/properties/issues/17): Add [SetValue()](http://godoc.org/github.com/magiconair/properties#Properties.SetValue) method to set values generically + * [Issue #22](https://github.com/magiconair/properties/issues/22): Add [LoadMap()](http://godoc.org/github.com/magiconair/properties#LoadMap) function to load properties from a string map + +### [1.7.2](https://github.com/magiconair/properties/tree/v1.7.2) - 20 Mar 2017 + + * [Issue #15](https://github.com/magiconair/properties/issues/15): Drop gocheck dependency + * [PR #21](https://github.com/magiconair/properties/pull/21): Add [Map()](http://godoc.org/github.com/magiconair/properties#Properties.Map) and [FilterFunc()](http://godoc.org/github.com/magiconair/properties#Properties.FilterFunc) + +### [1.7.1](https://github.com/magiconair/properties/tree/v1.7.1) - 13 Jan 2017 + + * [Issue #14](https://github.com/magiconair/properties/issues/14): Decouple TestLoadExpandedFile from `$USER` + * [PR #12](https://github.com/magiconair/properties/pull/12): Load from files and URLs + * [PR #16](https://github.com/magiconair/properties/pull/16): Keep gofmt happy + * [PR #18](https://github.com/magiconair/properties/pull/18): Fix Delete() function + +### [1.7.0](https://github.com/magiconair/properties/tree/v1.7.0) - 20 Mar 2016 + + * [Issue #10](https://github.com/magiconair/properties/issues/10): Add [LoadURL,LoadURLs,MustLoadURL,MustLoadURLs](http://godoc.org/github.com/magiconair/properties#LoadURL) method to load properties from a URL. + * [Issue #11](https://github.com/magiconair/properties/issues/11): Add [LoadString,MustLoadString](http://godoc.org/github.com/magiconair/properties#LoadString) method to load properties from an UTF8 string. + * [PR #8](https://github.com/magiconair/properties/pull/8): Add [MustFlag](http://godoc.org/github.com/magiconair/properties#Properties.MustFlag) method to provide overrides via command line flags. (@pascaldekloe) + +### [1.6.0](https://github.com/magiconair/properties/tree/v1.6.0) - 11 Dec 2015 + + * Add [Decode](http://godoc.org/github.com/magiconair/properties#Properties.Decode) method to populate struct from properties via tags. + +### [1.5.6](https://github.com/magiconair/properties/tree/v1.5.6) - 18 Oct 2015 + + * Vendored in gopkg.in/check.v1 + +### [1.5.5](https://github.com/magiconair/properties/tree/v1.5.5) - 31 Jul 2015 + + * [PR #6](https://github.com/magiconair/properties/pull/6): Add [Delete](http://godoc.org/github.com/magiconair/properties#Properties.Delete) method to remove keys including comments. (@gerbenjacobs) + +### [1.5.4](https://github.com/magiconair/properties/tree/v1.5.4) - 23 Jun 2015 + + * [Issue #5](https://github.com/magiconair/properties/issues/5): Allow disabling of property expansion [DisableExpansion](http://godoc.org/github.com/magiconair/properties#Properties.DisableExpansion). When property expansion is disabled Properties become a simple key/value store and don't check for circular references. + +### [1.5.3](https://github.com/magiconair/properties/tree/v1.5.3) - 02 Jun 2015 + + * [Issue #4](https://github.com/magiconair/properties/issues/4): Maintain key order in [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) and [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp) + +### [1.5.2](https://github.com/magiconair/properties/tree/v1.5.2) - 10 Apr 2015 + + * [Issue #3](https://github.com/magiconair/properties/issues/3): Don't print comments in [WriteComment()](http://godoc.org/github.com/magiconair/properties#Properties.WriteComment) if they are all empty + * Add clickable links to README + +### [1.5.1](https://github.com/magiconair/properties/tree/v1.5.1) - 08 Dec 2014 + + * Added [GetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.GetParsedDuration) and [MustGetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.MustGetParsedDuration) for values specified compatible with + [time.ParseDuration()](http://golang.org/pkg/time/#ParseDuration). + +### [1.5.0](https://github.com/magiconair/properties/tree/v1.5.0) - 18 Nov 2014 + + * Added support for single and multi-line comments (reading, writing and updating) + * The order of keys is now preserved + * Calling [Set()](http://godoc.org/github.com/magiconair/properties#Properties.Set) with an empty key now silently ignores the call and does not create a new entry + * Added a [MustSet()](http://godoc.org/github.com/magiconair/properties#Properties.MustSet) method + * Migrated test library from launchpad.net/gocheck to [gopkg.in/check.v1](http://gopkg.in/check.v1) + +### [1.4.2](https://github.com/magiconair/properties/tree/v1.4.2) - 15 Nov 2014 + + * [Issue #2](https://github.com/magiconair/properties/issues/2): Fixed goroutine leak in parser which created two lexers but cleaned up only one + +### [1.4.1](https://github.com/magiconair/properties/tree/v1.4.1) - 13 Nov 2014 + + * [Issue #1](https://github.com/magiconair/properties/issues/1): Fixed bug in Keys() method which returned an empty string + +### [1.4.0](https://github.com/magiconair/properties/tree/v1.4.0) - 23 Sep 2014 + + * Added [Keys()](http://godoc.org/github.com/magiconair/properties#Properties.Keys) to get the keys + * Added [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp) and [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) to get a subset of the properties + +### [1.3.0](https://github.com/magiconair/properties/tree/v1.3.0) - 18 Mar 2014 + +* Added support for time.Duration +* Made MustXXX() failure beha[ior configurable (log.Fatal, panic](https://github.com/magiconair/properties/tree/vior configurable (log.Fatal, panic) - custom) +* Changed default of MustXXX() failure from panic to log.Fatal + +### [1.2.0](https://github.com/magiconair/properties/tree/v1.2.0) - 05 Mar 2014 + +* Added MustGet... functions +* Added support for int and uint with range checks on 32 bit platforms + +### [1.1.0](https://github.com/magiconair/properties/tree/v1.1.0) - 20 Jan 2014 + +* Renamed from goproperties to properties +* Added support for expansion of environment vars in + filenames and value expressions +* Fixed bug where value expressions were not at the + start of the string + +### [1.0.0](https://github.com/magiconair/properties/tree/v1.0.0) - 7 Jan 2014 + +* Initial release diff --git a/vendor/github.com/magiconair/properties/LICENSE.md b/vendor/github.com/magiconair/properties/LICENSE.md new file mode 100644 index 0000000000..79c87e3e6f --- /dev/null +++ b/vendor/github.com/magiconair/properties/LICENSE.md @@ -0,0 +1,24 @@ +Copyright (c) 2013-2020, Frank Schroeder + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/magiconair/properties/README.md b/vendor/github.com/magiconair/properties/README.md new file mode 100644 index 0000000000..e2edda025b --- /dev/null +++ b/vendor/github.com/magiconair/properties/README.md @@ -0,0 +1,128 @@ +[![](https://img.shields.io/github/tag/magiconair/properties.svg?style=flat-square&label=release)](https://github.com/magiconair/properties/releases) +[![Travis CI Status](https://img.shields.io/travis/magiconair/properties.svg?branch=master&style=flat-square&label=travis)](https://travis-ci.org/magiconair/properties) +[![License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg?style=flat-square)](https://raw.githubusercontent.com/magiconair/properties/master/LICENSE) +[![GoDoc](http://img.shields.io/badge/godoc-reference-5272B4.svg?style=flat-square)](http://godoc.org/github.com/magiconair/properties) + +# Overview + +#### Please run `git pull --tags` to update the tags. See [below](#updated-git-tags) why. + +properties is a Go library for reading and writing properties files. + +It supports reading from multiple files or URLs and Spring style recursive +property expansion of expressions like `${key}` to their corresponding value. +Value expressions can refer to other keys like in `${key}` or to environment +variables like in `${USER}`. Filenames can also contain environment variables +like in `/home/${USER}/myapp.properties`. + +Properties can be decoded into structs, maps, arrays and values through +struct tags. + +Comments and the order of keys are preserved. Comments can be modified +and can be written to the output. + +The properties library supports both ISO-8859-1 and UTF-8 encoded data. + +Starting from version 1.3.0 the behavior of the MustXXX() functions is +configurable by providing a custom `ErrorHandler` function. The default has +changed from `panic` to `log.Fatal` but this is configurable and custom +error handling functions can be provided. See the package documentation for +details. + +Read the full documentation on [![GoDoc](http://img.shields.io/badge/godoc-reference-5272B4.svg?style=flat-square)](http://godoc.org/github.com/magiconair/properties) + +## Getting Started + +```go +import ( + "flag" + "github.com/magiconair/properties" +) + +func main() { + // init from a file + p := properties.MustLoadFile("${HOME}/config.properties", properties.UTF8) + + // or multiple files + p = properties.MustLoadFiles([]string{ + "${HOME}/config.properties", + "${HOME}/config-${USER}.properties", + }, properties.UTF8, true) + + // or from a map + p = properties.LoadMap(map[string]string{"key": "value", "abc": "def"}) + + // or from a string + p = properties.MustLoadString("key=value\nabc=def") + + // or from a URL + p = properties.MustLoadURL("http://host/path") + + // or from multiple URLs + p = properties.MustLoadURL([]string{ + "http://host/config", + "http://host/config-${USER}", + }, true) + + // or from flags + p.MustFlag(flag.CommandLine) + + // get values through getters + host := p.MustGetString("host") + port := p.GetInt("port", 8080) + + // or through Decode + type Config struct { + Host string `properties:"host"` + Port int `properties:"port,default=9000"` + Accept []string `properties:"accept,default=image/png;image;gif"` + Timeout time.Duration `properties:"timeout,default=5s"` + } + var cfg Config + if err := p.Decode(&cfg); err != nil { + log.Fatal(err) + } +} + +``` + +## Installation and Upgrade + +``` +$ go get -u github.com/magiconair/properties +``` + +## License + +2 clause BSD license. See [LICENSE](https://github.com/magiconair/properties/blob/master/LICENSE) file for details. + +## ToDo + +* Dump contents with passwords and secrets obscured + +## Updated Git tags + +#### 13 Feb 2018 + +I realized that all of the git tags I had pushed before v1.7.5 were lightweight tags +and I've only recently learned that this doesn't play well with `git describe` 😞 + +I have replaced all lightweight tags with signed tags using this script which should +retain the commit date, name and email address. Please run `git pull --tags` to update them. + +Worst case you have to reclone the repo. + +```shell +#!/bin/bash +tag=$1 +echo "Updating $tag" +date=$(git show ${tag}^0 --format=%aD | head -1) +email=$(git show ${tag}^0 --format=%aE | head -1) +name=$(git show ${tag}^0 --format=%aN | head -1) +GIT_COMMITTER_DATE="$date" GIT_COMMITTER_NAME="$name" GIT_COMMITTER_EMAIL="$email" git tag -s -f ${tag} ${tag}^0 -m ${tag} +``` + +I apologize for the inconvenience. + +Frank + diff --git a/vendor/github.com/magiconair/properties/decode.go b/vendor/github.com/magiconair/properties/decode.go new file mode 100644 index 0000000000..8e6aa441d9 --- /dev/null +++ b/vendor/github.com/magiconair/properties/decode.go @@ -0,0 +1,289 @@ +// Copyright 2013-2022 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "reflect" + "strconv" + "strings" + "time" +) + +// Decode assigns property values to exported fields of a struct. +// +// Decode traverses v recursively and returns an error if a value cannot be +// converted to the field type or a required value is missing for a field. +// +// The following type dependent decodings are used: +// +// String, boolean, numeric fields have the value of the property key assigned. +// The property key name is the name of the field. A different key and a default +// value can be set in the field's tag. Fields without default value are +// required. If the value cannot be converted to the field type an error is +// returned. +// +// time.Duration fields have the result of time.ParseDuration() assigned. +// +// time.Time fields have the vaule of time.Parse() assigned. The default layout +// is time.RFC3339 but can be set in the field's tag. +// +// Arrays and slices of string, boolean, numeric, time.Duration and time.Time +// fields have the value interpreted as a comma separated list of values. The +// individual values are trimmed of whitespace and empty values are ignored. A +// default value can be provided as a semicolon separated list in the field's +// tag. +// +// Struct fields are decoded recursively using the field name plus "." as +// prefix. The prefix (without dot) can be overridden in the field's tag. +// Default values are not supported in the field's tag. Specify them on the +// fields of the inner struct instead. +// +// Map fields must have a key of type string and are decoded recursively by +// using the field's name plus ".' as prefix and the next element of the key +// name as map key. The prefix (without dot) can be overridden in the field's +// tag. Default values are not supported. +// +// Examples: +// +// // Field is ignored. +// Field int `properties:"-"` +// +// // Field is assigned value of 'Field'. +// Field int +// +// // Field is assigned value of 'myName'. +// Field int `properties:"myName"` +// +// // Field is assigned value of key 'myName' and has a default +// // value 15 if the key does not exist. +// Field int `properties:"myName,default=15"` +// +// // Field is assigned value of key 'Field' and has a default +// // value 15 if the key does not exist. +// Field int `properties:",default=15"` +// +// // Field is assigned value of key 'date' and the date +// // is in format 2006-01-02 +// Field time.Time `properties:"date,layout=2006-01-02"` +// +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas. +// Field []string +// +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas and has a default +// // value ["a", "b", "c"] if the key does not exist. +// Field []string `properties:",default=a;b;c"` +// +// // Field is decoded recursively with "Field." as key prefix. +// Field SomeStruct +// +// // Field is decoded recursively with "myName." as key prefix. +// Field SomeStruct `properties:"myName"` +// +// // Field is decoded recursively with "Field." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string +// +// // Field is decoded recursively with "myName." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string `properties:"myName"` +func (p *Properties) Decode(x interface{}) error { + t, v := reflect.TypeOf(x), reflect.ValueOf(x) + if t.Kind() != reflect.Ptr || v.Elem().Type().Kind() != reflect.Struct { + return fmt.Errorf("not a pointer to struct: %s", t) + } + if err := dec(p, "", nil, nil, v); err != nil { + return err + } + return nil +} + +func dec(p *Properties, key string, def *string, opts map[string]string, v reflect.Value) error { + t := v.Type() + + // value returns the property value for key or the default if provided. + value := func() (string, error) { + if val, ok := p.Get(key); ok { + return val, nil + } + if def != nil { + return *def, nil + } + return "", fmt.Errorf("missing required key %s", key) + } + + // conv converts a string to a value of the given type. + conv := func(s string, t reflect.Type) (val reflect.Value, err error) { + var v interface{} + + switch { + case isDuration(t): + v, err = time.ParseDuration(s) + + case isTime(t): + layout := opts["layout"] + if layout == "" { + layout = time.RFC3339 + } + v, err = time.Parse(layout, s) + + case isBool(t): + v, err = boolVal(s), nil + + case isString(t): + v, err = s, nil + + case isFloat(t): + v, err = strconv.ParseFloat(s, 64) + + case isInt(t): + v, err = strconv.ParseInt(s, 10, 64) + + case isUint(t): + v, err = strconv.ParseUint(s, 10, 64) + + default: + return reflect.Zero(t), fmt.Errorf("unsupported type %s", t) + } + if err != nil { + return reflect.Zero(t), err + } + return reflect.ValueOf(v).Convert(t), nil + } + + // keydef returns the property key and the default value based on the + // name of the struct field and the options in the tag. + keydef := func(f reflect.StructField) (string, *string, map[string]string) { + _key, _opts := parseTag(f.Tag.Get("properties")) + + var _def *string + if d, ok := _opts["default"]; ok { + _def = &d + } + if _key != "" { + return _key, _def, _opts + } + return f.Name, _def, _opts + } + + switch { + case isDuration(t) || isTime(t) || isBool(t) || isString(t) || isFloat(t) || isInt(t) || isUint(t): + s, err := value() + if err != nil { + return err + } + val, err := conv(s, t) + if err != nil { + return err + } + v.Set(val) + + case isPtr(t): + return dec(p, key, def, opts, v.Elem()) + + case isStruct(t): + for i := 0; i < v.NumField(); i++ { + fv := v.Field(i) + fk, def, opts := keydef(t.Field(i)) + if !fv.CanSet() { + return fmt.Errorf("cannot set %s", t.Field(i).Name) + } + if fk == "-" { + continue + } + if key != "" { + fk = key + "." + fk + } + if err := dec(p, fk, def, opts, fv); err != nil { + return err + } + } + return nil + + case isArray(t): + val, err := value() + if err != nil { + return err + } + vals := split(val, ";") + a := reflect.MakeSlice(t, 0, len(vals)) + for _, s := range vals { + val, err := conv(s, t.Elem()) + if err != nil { + return err + } + a = reflect.Append(a, val) + } + v.Set(a) + + case isMap(t): + valT := t.Elem() + m := reflect.MakeMap(t) + for postfix := range p.FilterStripPrefix(key + ".").m { + pp := strings.SplitN(postfix, ".", 2) + mk, mv := pp[0], reflect.New(valT) + if err := dec(p, key+"."+mk, nil, nil, mv); err != nil { + return err + } + m.SetMapIndex(reflect.ValueOf(mk), mv.Elem()) + } + v.Set(m) + + default: + return fmt.Errorf("unsupported type %s", t) + } + return nil +} + +// split splits a string on sep, trims whitespace of elements +// and omits empty elements +func split(s string, sep string) []string { + var a []string + for _, v := range strings.Split(s, sep) { + if v = strings.TrimSpace(v); v != "" { + a = append(a, v) + } + } + return a +} + +// parseTag parses a "key,k=v,k=v,..." +func parseTag(tag string) (key string, opts map[string]string) { + opts = map[string]string{} + for i, s := range strings.Split(tag, ",") { + if i == 0 { + key = s + continue + } + + pp := strings.SplitN(s, "=", 2) + if len(pp) == 1 { + opts[pp[0]] = "" + } else { + opts[pp[0]] = pp[1] + } + } + return key, opts +} + +func isArray(t reflect.Type) bool { return t.Kind() == reflect.Array || t.Kind() == reflect.Slice } +func isBool(t reflect.Type) bool { return t.Kind() == reflect.Bool } +func isDuration(t reflect.Type) bool { return t == reflect.TypeOf(time.Second) } +func isMap(t reflect.Type) bool { return t.Kind() == reflect.Map } +func isPtr(t reflect.Type) bool { return t.Kind() == reflect.Ptr } +func isString(t reflect.Type) bool { return t.Kind() == reflect.String } +func isStruct(t reflect.Type) bool { return t.Kind() == reflect.Struct } +func isTime(t reflect.Type) bool { return t == reflect.TypeOf(time.Time{}) } +func isFloat(t reflect.Type) bool { + return t.Kind() == reflect.Float32 || t.Kind() == reflect.Float64 +} +func isInt(t reflect.Type) bool { + return t.Kind() == reflect.Int || t.Kind() == reflect.Int8 || t.Kind() == reflect.Int16 || t.Kind() == reflect.Int32 || t.Kind() == reflect.Int64 +} +func isUint(t reflect.Type) bool { + return t.Kind() == reflect.Uint || t.Kind() == reflect.Uint8 || t.Kind() == reflect.Uint16 || t.Kind() == reflect.Uint32 || t.Kind() == reflect.Uint64 +} diff --git a/vendor/github.com/magiconair/properties/doc.go b/vendor/github.com/magiconair/properties/doc.go new file mode 100644 index 0000000000..7c79793159 --- /dev/null +++ b/vendor/github.com/magiconair/properties/doc.go @@ -0,0 +1,155 @@ +// Copyright 2013-2022 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package properties provides functions for reading and writing +// ISO-8859-1 and UTF-8 encoded .properties files and has +// support for recursive property expansion. +// +// Java properties files are ISO-8859-1 encoded and use Unicode +// literals for characters outside the ISO character set. Unicode +// literals can be used in UTF-8 encoded properties files but +// aren't necessary. +// +// To load a single properties file use MustLoadFile(): +// +// p := properties.MustLoadFile(filename, properties.UTF8) +// +// To load multiple properties files use MustLoadFiles() +// which loads the files in the given order and merges the +// result. Missing properties files can be ignored if the +// 'ignoreMissing' flag is set to true. +// +// Filenames can contain environment variables which are expanded +// before loading. +// +// f1 := "/etc/myapp/myapp.conf" +// f2 := "/home/${USER}/myapp.conf" +// p := MustLoadFiles([]string{f1, f2}, properties.UTF8, true) +// +// All of the different key/value delimiters ' ', ':' and '=' are +// supported as well as the comment characters '!' and '#' and +// multi-line values. +// +// ! this is a comment +// # and so is this +// +// # the following expressions are equal +// key value +// key=value +// key:value +// key = value +// key : value +// key = val\ +// ue +// +// Properties stores all comments preceding a key and provides +// GetComments() and SetComments() methods to retrieve and +// update them. The convenience functions GetComment() and +// SetComment() allow access to the last comment. The +// WriteComment() method writes properties files including +// the comments and with the keys in the original order. +// This can be used for sanitizing properties files. +// +// Property expansion is recursive and circular references +// and malformed expressions are not allowed and cause an +// error. Expansion of environment variables is supported. +// +// # standard property +// key = value +// +// # property expansion: key2 = value +// key2 = ${key} +// +// # recursive expansion: key3 = value +// key3 = ${key2} +// +// # circular reference (error) +// key = ${key} +// +// # malformed expression (error) +// key = ${ke +// +// # refers to the users' home dir +// home = ${HOME} +// +// # local key takes precedence over env var: u = foo +// USER = foo +// u = ${USER} +// +// The default property expansion format is ${key} but can be +// changed by setting different pre- and postfix values on the +// Properties object. +// +// p := properties.NewProperties() +// p.Prefix = "#[" +// p.Postfix = "]#" +// +// Properties provides convenience functions for getting typed +// values with default values if the key does not exist or the +// type conversion failed. +// +// # Returns true if the value is either "1", "on", "yes" or "true" +// # Returns false for every other value and the default value if +// # the key does not exist. +// v = p.GetBool("key", false) +// +// # Returns the value if the key exists and the format conversion +// # was successful. Otherwise, the default value is returned. +// v = p.GetInt64("key", 999) +// v = p.GetUint64("key", 999) +// v = p.GetFloat64("key", 123.0) +// v = p.GetString("key", "def") +// v = p.GetDuration("key", 999) +// +// As an alternative properties may be applied with the standard +// library's flag implementation at any time. +// +// # Standard configuration +// v = flag.Int("key", 999, "help message") +// flag.Parse() +// +// # Merge p into the flag set +// p.MustFlag(flag.CommandLine) +// +// Properties provides several MustXXX() convenience functions +// which will terminate the app if an error occurs. The behavior +// of the failure is configurable and the default is to call +// log.Fatal(err). To have the MustXXX() functions panic instead +// of logging the error set a different ErrorHandler before +// you use the Properties package. +// +// properties.ErrorHandler = properties.PanicHandler +// +// # Will panic instead of logging an error +// p := properties.MustLoadFile("config.properties") +// +// You can also provide your own ErrorHandler function. The only requirement +// is that the error handler function must exit after handling the error. +// +// properties.ErrorHandler = func(err error) { +// fmt.Println(err) +// os.Exit(1) +// } +// +// # Will write to stdout and then exit +// p := properties.MustLoadFile("config.properties") +// +// Properties can also be loaded into a struct via the `Decode` +// method, e.g. +// +// type S struct { +// A string `properties:"a,default=foo"` +// D time.Duration `properties:"timeout,default=5s"` +// E time.Time `properties:"expires,layout=2006-01-02,default=2015-01-01"` +// } +// +// See `Decode()` method for the full documentation. +// +// The following documents provide a description of the properties +// file format. +// +// http://en.wikipedia.org/wiki/.properties +// +// http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html#load%28java.io.Reader%29 +package properties diff --git a/vendor/github.com/magiconair/properties/integrate.go b/vendor/github.com/magiconair/properties/integrate.go new file mode 100644 index 0000000000..35d0ae97b3 --- /dev/null +++ b/vendor/github.com/magiconair/properties/integrate.go @@ -0,0 +1,35 @@ +// Copyright 2013-2022 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import "flag" + +// MustFlag sets flags that are skipped by dst.Parse when p contains +// the respective key for flag.Flag.Name. +// +// It's use is recommended with command line arguments as in: +// +// flag.Parse() +// p.MustFlag(flag.CommandLine) +func (p *Properties) MustFlag(dst *flag.FlagSet) { + m := make(map[string]*flag.Flag) + dst.VisitAll(func(f *flag.Flag) { + m[f.Name] = f + }) + dst.Visit(func(f *flag.Flag) { + delete(m, f.Name) // overridden + }) + + for name, f := range m { + v, ok := p.Get(name) + if !ok { + continue + } + + if err := f.Value.Set(v); err != nil { + ErrorHandler(err) + } + } +} diff --git a/vendor/github.com/magiconair/properties/lex.go b/vendor/github.com/magiconair/properties/lex.go new file mode 100644 index 0000000000..3d15a1f6ed --- /dev/null +++ b/vendor/github.com/magiconair/properties/lex.go @@ -0,0 +1,395 @@ +// Copyright 2013-2022 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// Parts of the lexer are from the template/text/parser package +// For these parts the following applies: +// +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file of the go 1.2 +// distribution. + +package properties + +import ( + "fmt" + "strconv" + "strings" + "unicode/utf8" +) + +// item represents a token or text string returned from the scanner. +type item struct { + typ itemType // The type of this item. + pos int // The starting position, in bytes, of this item in the input string. + val string // The value of this item. +} + +func (i item) String() string { + switch { + case i.typ == itemEOF: + return "EOF" + case i.typ == itemError: + return i.val + case len(i.val) > 10: + return fmt.Sprintf("%.10q...", i.val) + } + return fmt.Sprintf("%q", i.val) +} + +// itemType identifies the type of lex items. +type itemType int + +const ( + itemError itemType = iota // error occurred; value is text of error + itemEOF + itemKey // a key + itemValue // a value + itemComment // a comment +) + +// defines a constant for EOF +const eof = -1 + +// permitted whitespace characters space, FF and TAB +const whitespace = " \f\t" + +// stateFn represents the state of the scanner as a function that returns the next state. +type stateFn func(*lexer) stateFn + +// lexer holds the state of the scanner. +type lexer struct { + input string // the string being scanned + state stateFn // the next lexing function to enter + pos int // current position in the input + start int // start position of this item + width int // width of last rune read from input + lastPos int // position of most recent item returned by nextItem + runes []rune // scanned runes for this item + items chan item // channel of scanned items +} + +// next returns the next rune in the input. +func (l *lexer) next() rune { + if l.pos >= len(l.input) { + l.width = 0 + return eof + } + r, w := utf8.DecodeRuneInString(l.input[l.pos:]) + l.width = w + l.pos += l.width + return r +} + +// peek returns but does not consume the next rune in the input. +func (l *lexer) peek() rune { + r := l.next() + l.backup() + return r +} + +// backup steps back one rune. Can only be called once per call of next. +func (l *lexer) backup() { + l.pos -= l.width +} + +// emit passes an item back to the client. +func (l *lexer) emit(t itemType) { + i := item{t, l.start, string(l.runes)} + l.items <- i + l.start = l.pos + l.runes = l.runes[:0] +} + +// ignore skips over the pending input before this point. +func (l *lexer) ignore() { + l.start = l.pos +} + +// appends the rune to the current value +func (l *lexer) appendRune(r rune) { + l.runes = append(l.runes, r) +} + +// accept consumes the next rune if it's from the valid set. +func (l *lexer) accept(valid string) bool { + if strings.ContainsRune(valid, l.next()) { + return true + } + l.backup() + return false +} + +// acceptRun consumes a run of runes from the valid set. +func (l *lexer) acceptRun(valid string) { + for strings.ContainsRune(valid, l.next()) { + } + l.backup() +} + +// lineNumber reports which line we're on, based on the position of +// the previous item returned by nextItem. Doing it this way +// means we don't have to worry about peek double counting. +func (l *lexer) lineNumber() int { + return 1 + strings.Count(l.input[:l.lastPos], "\n") +} + +// errorf returns an error token and terminates the scan by passing +// back a nil pointer that will be the next state, terminating l.nextItem. +func (l *lexer) errorf(format string, args ...interface{}) stateFn { + l.items <- item{itemError, l.start, fmt.Sprintf(format, args...)} + return nil +} + +// nextItem returns the next item from the input. +func (l *lexer) nextItem() item { + i := <-l.items + l.lastPos = i.pos + return i +} + +// lex creates a new scanner for the input string. +func lex(input string) *lexer { + l := &lexer{ + input: input, + items: make(chan item), + runes: make([]rune, 0, 32), + } + go l.run() + return l +} + +// run runs the state machine for the lexer. +func (l *lexer) run() { + for l.state = lexBeforeKey(l); l.state != nil; { + l.state = l.state(l) + } +} + +// state functions + +// lexBeforeKey scans until a key begins. +func lexBeforeKey(l *lexer) stateFn { + switch r := l.next(); { + case isEOF(r): + l.emit(itemEOF) + return nil + + case isEOL(r): + l.ignore() + return lexBeforeKey + + case isComment(r): + return lexComment + + case isWhitespace(r): + l.ignore() + return lexBeforeKey + + default: + l.backup() + return lexKey + } +} + +// lexComment scans a comment line. The comment character has already been scanned. +func lexComment(l *lexer) stateFn { + l.acceptRun(whitespace) + l.ignore() + for { + switch r := l.next(); { + case isEOF(r): + l.ignore() + l.emit(itemEOF) + return nil + case isEOL(r): + l.emit(itemComment) + return lexBeforeKey + default: + l.appendRune(r) + } + } +} + +// lexKey scans the key up to a delimiter +func lexKey(l *lexer) stateFn { + var r rune + +Loop: + for { + switch r = l.next(); { + + case isEscape(r): + err := l.scanEscapeSequence() + if err != nil { + return l.errorf(err.Error()) + } + + case isEndOfKey(r): + l.backup() + break Loop + + case isEOF(r): + break Loop + + default: + l.appendRune(r) + } + } + + if len(l.runes) > 0 { + l.emit(itemKey) + } + + if isEOF(r) { + l.emit(itemEOF) + return nil + } + + return lexBeforeValue +} + +// lexBeforeValue scans the delimiter between key and value. +// Leading and trailing whitespace is ignored. +// We expect to be just after the key. +func lexBeforeValue(l *lexer) stateFn { + l.acceptRun(whitespace) + l.accept(":=") + l.acceptRun(whitespace) + l.ignore() + return lexValue +} + +// lexValue scans text until the end of the line. We expect to be just after the delimiter. +func lexValue(l *lexer) stateFn { + for { + switch r := l.next(); { + case isEscape(r): + if isEOL(l.peek()) { + l.next() + l.acceptRun(whitespace) + } else { + err := l.scanEscapeSequence() + if err != nil { + return l.errorf(err.Error()) + } + } + + case isEOL(r): + l.emit(itemValue) + l.ignore() + return lexBeforeKey + + case isEOF(r): + l.emit(itemValue) + l.emit(itemEOF) + return nil + + default: + l.appendRune(r) + } + } +} + +// scanEscapeSequence scans either one of the escaped characters +// or a unicode literal. We expect to be after the escape character. +func (l *lexer) scanEscapeSequence() error { + switch r := l.next(); { + + case isEscapedCharacter(r): + l.appendRune(decodeEscapedCharacter(r)) + return nil + + case atUnicodeLiteral(r): + return l.scanUnicodeLiteral() + + case isEOF(r): + return fmt.Errorf("premature EOF") + + // silently drop the escape character and append the rune as is + default: + l.appendRune(r) + return nil + } +} + +// scans a unicode literal in the form \uXXXX. We expect to be after the \u. +func (l *lexer) scanUnicodeLiteral() error { + // scan the digits + d := make([]rune, 4) + for i := 0; i < 4; i++ { + d[i] = l.next() + if d[i] == eof || !strings.ContainsRune("0123456789abcdefABCDEF", d[i]) { + return fmt.Errorf("invalid unicode literal") + } + } + + // decode the digits into a rune + r, err := strconv.ParseInt(string(d), 16, 0) + if err != nil { + return err + } + + l.appendRune(rune(r)) + return nil +} + +// decodeEscapedCharacter returns the unescaped rune. We expect to be after the escape character. +func decodeEscapedCharacter(r rune) rune { + switch r { + case 'f': + return '\f' + case 'n': + return '\n' + case 'r': + return '\r' + case 't': + return '\t' + default: + return r + } +} + +// atUnicodeLiteral reports whether we are at a unicode literal. +// The escape character has already been consumed. +func atUnicodeLiteral(r rune) bool { + return r == 'u' +} + +// isComment reports whether we are at the start of a comment. +func isComment(r rune) bool { + return r == '#' || r == '!' +} + +// isEndOfKey reports whether the rune terminates the current key. +func isEndOfKey(r rune) bool { + return strings.ContainsRune(" \f\t\r\n:=", r) +} + +// isEOF reports whether we are at EOF. +func isEOF(r rune) bool { + return r == eof +} + +// isEOL reports whether we are at a new line character. +func isEOL(r rune) bool { + return r == '\n' || r == '\r' +} + +// isEscape reports whether the rune is the escape character which +// prefixes unicode literals and other escaped characters. +func isEscape(r rune) bool { + return r == '\\' +} + +// isEscapedCharacter reports whether we are at one of the characters that need escaping. +// The escape character has already been consumed. +func isEscapedCharacter(r rune) bool { + return strings.ContainsRune(" :=fnrt", r) +} + +// isWhitespace reports whether the rune is a whitespace character. +func isWhitespace(r rune) bool { + return strings.ContainsRune(whitespace, r) +} diff --git a/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/magiconair/properties/load.go new file mode 100644 index 0000000000..635368dc8a --- /dev/null +++ b/vendor/github.com/magiconair/properties/load.go @@ -0,0 +1,293 @@ +// Copyright 2013-2022 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "io/ioutil" + "net/http" + "os" + "strings" +) + +// Encoding specifies encoding of the input data. +type Encoding uint + +const ( + // utf8Default is a private placeholder for the zero value of Encoding to + // ensure that it has the correct meaning. UTF8 is the default encoding but + // was assigned a non-zero value which cannot be changed without breaking + // existing code. Clients should continue to use the public constants. + utf8Default Encoding = iota + + // UTF8 interprets the input data as UTF-8. + UTF8 + + // ISO_8859_1 interprets the input data as ISO-8859-1. + ISO_8859_1 +) + +type Loader struct { + // Encoding determines how the data from files and byte buffers + // is interpreted. For URLs the Content-Type header is used + // to determine the encoding of the data. + Encoding Encoding + + // DisableExpansion configures the property expansion of the + // returned property object. When set to true, the property values + // will not be expanded and the Property object will not be checked + // for invalid expansion expressions. + DisableExpansion bool + + // IgnoreMissing configures whether missing files or URLs which return + // 404 are reported as errors. When set to true, missing files and 404 + // status codes are not reported as errors. + IgnoreMissing bool +} + +// Load reads a buffer into a Properties struct. +func (l *Loader) LoadBytes(buf []byte) (*Properties, error) { + return l.loadBytes(buf, l.Encoding) +} + +// LoadAll reads the content of multiple URLs or files in the given order into +// a Properties struct. If IgnoreMissing is true then a 404 status code or +// missing file will not be reported as error. Encoding sets the encoding for +// files. For the URLs see LoadURL for the Content-Type header and the +// encoding. +func (l *Loader) LoadAll(names []string) (*Properties, error) { + all := NewProperties() + for _, name := range names { + n, err := expandName(name) + if err != nil { + return nil, err + } + + var p *Properties + switch { + case strings.HasPrefix(n, "http://"): + p, err = l.LoadURL(n) + case strings.HasPrefix(n, "https://"): + p, err = l.LoadURL(n) + default: + p, err = l.LoadFile(n) + } + if err != nil { + return nil, err + } + all.Merge(p) + } + + all.DisableExpansion = l.DisableExpansion + if all.DisableExpansion { + return all, nil + } + return all, all.check() +} + +// LoadFile reads a file into a Properties struct. +// If IgnoreMissing is true then a missing file will not be +// reported as error. +func (l *Loader) LoadFile(filename string) (*Properties, error) { + data, err := ioutil.ReadFile(filename) + if err != nil { + if l.IgnoreMissing && os.IsNotExist(err) { + LogPrintf("properties: %s not found. skipping", filename) + return NewProperties(), nil + } + return nil, err + } + return l.loadBytes(data, l.Encoding) +} + +// LoadURL reads the content of the URL into a Properties struct. +// +// The encoding is determined via the Content-Type header which +// should be set to 'text/plain'. If the 'charset' parameter is +// missing, 'iso-8859-1' or 'latin1' the encoding is set to +// ISO-8859-1. If the 'charset' parameter is set to 'utf-8' the +// encoding is set to UTF-8. A missing content type header is +// interpreted as 'text/plain; charset=utf-8'. +func (l *Loader) LoadURL(url string) (*Properties, error) { + resp, err := http.Get(url) + if err != nil { + return nil, fmt.Errorf("properties: error fetching %q. %s", url, err) + } + defer resp.Body.Close() + + if resp.StatusCode == 404 && l.IgnoreMissing { + LogPrintf("properties: %s returned %d. skipping", url, resp.StatusCode) + return NewProperties(), nil + } + + if resp.StatusCode != 200 { + return nil, fmt.Errorf("properties: %s returned %d", url, resp.StatusCode) + } + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("properties: %s error reading response. %s", url, err) + } + + ct := resp.Header.Get("Content-Type") + ct = strings.Join(strings.Fields(ct), "") + var enc Encoding + switch strings.ToLower(ct) { + case "text/plain", "text/plain;charset=iso-8859-1", "text/plain;charset=latin1": + enc = ISO_8859_1 + case "", "text/plain;charset=utf-8": + enc = UTF8 + default: + return nil, fmt.Errorf("properties: invalid content type %s", ct) + } + + return l.loadBytes(body, enc) +} + +func (l *Loader) loadBytes(buf []byte, enc Encoding) (*Properties, error) { + p, err := parse(convert(buf, enc)) + if err != nil { + return nil, err + } + p.DisableExpansion = l.DisableExpansion + if p.DisableExpansion { + return p, nil + } + return p, p.check() +} + +// Load reads a buffer into a Properties struct. +func Load(buf []byte, enc Encoding) (*Properties, error) { + l := &Loader{Encoding: enc} + return l.LoadBytes(buf) +} + +// LoadString reads an UTF8 string into a properties struct. +func LoadString(s string) (*Properties, error) { + l := &Loader{Encoding: UTF8} + return l.LoadBytes([]byte(s)) +} + +// LoadMap creates a new Properties struct from a string map. +func LoadMap(m map[string]string) *Properties { + p := NewProperties() + for k, v := range m { + p.Set(k, v) + } + return p +} + +// LoadFile reads a file into a Properties struct. +func LoadFile(filename string, enc Encoding) (*Properties, error) { + l := &Loader{Encoding: enc} + return l.LoadAll([]string{filename}) +} + +// LoadFiles reads multiple files in the given order into +// a Properties struct. If 'ignoreMissing' is true then +// non-existent files will not be reported as error. +func LoadFiles(filenames []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: enc, IgnoreMissing: ignoreMissing} + return l.LoadAll(filenames) +} + +// LoadURL reads the content of the URL into a Properties struct. +// See Loader#LoadURL for details. +func LoadURL(url string) (*Properties, error) { + l := &Loader{Encoding: UTF8} + return l.LoadAll([]string{url}) +} + +// LoadURLs reads the content of multiple URLs in the given order into a +// Properties struct. If IgnoreMissing is true then a 404 status code will +// not be reported as error. See Loader#LoadURL for the Content-Type header +// and the encoding. +func LoadURLs(urls []string, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: UTF8, IgnoreMissing: ignoreMissing} + return l.LoadAll(urls) +} + +// LoadAll reads the content of multiple URLs or files in the given order into a +// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will +// not be reported as error. Encoding sets the encoding for files. For the URLs please see +// LoadURL for the Content-Type header and the encoding. +func LoadAll(names []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: enc, IgnoreMissing: ignoreMissing} + return l.LoadAll(names) +} + +// MustLoadString reads an UTF8 string into a Properties struct and +// panics on error. +func MustLoadString(s string) *Properties { + return must(LoadString(s)) +} + +// MustLoadFile reads a file into a Properties struct and +// panics on error. +func MustLoadFile(filename string, enc Encoding) *Properties { + return must(LoadFile(filename, enc)) +} + +// MustLoadFiles reads multiple files in the given order into +// a Properties struct and panics on error. If 'ignoreMissing' +// is true then non-existent files will not be reported as error. +func MustLoadFiles(filenames []string, enc Encoding, ignoreMissing bool) *Properties { + return must(LoadFiles(filenames, enc, ignoreMissing)) +} + +// MustLoadURL reads the content of a URL into a Properties struct and +// panics on error. +func MustLoadURL(url string) *Properties { + return must(LoadURL(url)) +} + +// MustLoadURLs reads the content of multiple URLs in the given order into a +// Properties struct and panics on error. If 'ignoreMissing' is true then a 404 +// status code will not be reported as error. +func MustLoadURLs(urls []string, ignoreMissing bool) *Properties { + return must(LoadURLs(urls, ignoreMissing)) +} + +// MustLoadAll reads the content of multiple URLs or files in the given order into a +// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will +// not be reported as error. Encoding sets the encoding for files. For the URLs please see +// LoadURL for the Content-Type header and the encoding. It panics on error. +func MustLoadAll(names []string, enc Encoding, ignoreMissing bool) *Properties { + return must(LoadAll(names, enc, ignoreMissing)) +} + +func must(p *Properties, err error) *Properties { + if err != nil { + ErrorHandler(err) + } + return p +} + +// expandName expands ${ENV_VAR} expressions in a name. +// If the environment variable does not exist then it will be replaced +// with an empty string. Malformed expressions like "${ENV_VAR" will +// be reported as error. +func expandName(name string) (string, error) { + return expand(name, []string{}, "${", "}", make(map[string]string)) +} + +// Interprets a byte buffer either as an ISO-8859-1 or UTF-8 encoded string. +// For ISO-8859-1 we can convert each byte straight into a rune since the +// first 256 unicode code points cover ISO-8859-1. +func convert(buf []byte, enc Encoding) string { + switch enc { + case utf8Default, UTF8: + return string(buf) + case ISO_8859_1: + runes := make([]rune, len(buf)) + for i, b := range buf { + runes[i] = rune(b) + } + return string(runes) + default: + ErrorHandler(fmt.Errorf("unsupported encoding %v", enc)) + } + panic("ErrorHandler should exit") +} diff --git a/vendor/github.com/magiconair/properties/parser.go b/vendor/github.com/magiconair/properties/parser.go new file mode 100644 index 0000000000..fccfd39f6b --- /dev/null +++ b/vendor/github.com/magiconair/properties/parser.go @@ -0,0 +1,86 @@ +// Copyright 2013-2022 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "runtime" +) + +type parser struct { + lex *lexer +} + +func parse(input string) (properties *Properties, err error) { + p := &parser{lex: lex(input)} + defer p.recover(&err) + + properties = NewProperties() + key := "" + comments := []string{} + + for { + token := p.expectOneOf(itemComment, itemKey, itemEOF) + switch token.typ { + case itemEOF: + goto done + case itemComment: + comments = append(comments, token.val) + continue + case itemKey: + key = token.val + if _, ok := properties.m[key]; !ok { + properties.k = append(properties.k, key) + } + } + + token = p.expectOneOf(itemValue, itemEOF) + if len(comments) > 0 { + properties.c[key] = comments + comments = []string{} + } + switch token.typ { + case itemEOF: + properties.m[key] = "" + goto done + case itemValue: + properties.m[key] = token.val + } + } + +done: + return properties, nil +} + +func (p *parser) errorf(format string, args ...interface{}) { + format = fmt.Sprintf("properties: Line %d: %s", p.lex.lineNumber(), format) + panic(fmt.Errorf(format, args...)) +} + +func (p *parser) expectOneOf(expected ...itemType) (token item) { + token = p.lex.nextItem() + for _, v := range expected { + if token.typ == v { + return token + } + } + p.unexpected(token) + panic("unexpected token") +} + +func (p *parser) unexpected(token item) { + p.errorf(token.String()) +} + +// recover is the handler that turns panics into returns from the top level of Parse. +func (p *parser) recover(errp *error) { + e := recover() + if e != nil { + if _, ok := e.(runtime.Error); ok { + panic(e) + } + *errp = e.(error) + } +} diff --git a/vendor/github.com/magiconair/properties/properties.go b/vendor/github.com/magiconair/properties/properties.go new file mode 100644 index 0000000000..fb2f7b4048 --- /dev/null +++ b/vendor/github.com/magiconair/properties/properties.go @@ -0,0 +1,848 @@ +// Copyright 2013-2022 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +// BUG(frank): Set() does not check for invalid unicode literals since this is currently handled by the lexer. +// BUG(frank): Write() does not allow to configure the newline character. Therefore, on Windows LF is used. + +import ( + "bytes" + "fmt" + "io" + "log" + "os" + "regexp" + "sort" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +const maxExpansionDepth = 64 + +// ErrorHandlerFunc defines the type of function which handles failures +// of the MustXXX() functions. An error handler function must exit +// the application after handling the error. +type ErrorHandlerFunc func(error) + +// ErrorHandler is the function which handles failures of the MustXXX() +// functions. The default is LogFatalHandler. +var ErrorHandler ErrorHandlerFunc = LogFatalHandler + +// LogHandlerFunc defines the function prototype for logging errors. +type LogHandlerFunc func(fmt string, args ...interface{}) + +// LogPrintf defines a log handler which uses log.Printf. +var LogPrintf LogHandlerFunc = log.Printf + +// LogFatalHandler handles the error by logging a fatal error and exiting. +func LogFatalHandler(err error) { + log.Fatal(err) +} + +// PanicHandler handles the error by panicking. +func PanicHandler(err error) { + panic(err) +} + +// ----------------------------------------------------------------------------- + +// A Properties contains the key/value pairs from the properties input. +// All values are stored in unexpanded form and are expanded at runtime +type Properties struct { + // Pre-/Postfix for property expansion. + Prefix string + Postfix string + + // DisableExpansion controls the expansion of properties on Get() + // and the check for circular references on Set(). When set to + // true Properties behaves like a simple key/value store and does + // not check for circular references on Get() or on Set(). + DisableExpansion bool + + // Stores the key/value pairs + m map[string]string + + // Stores the comments per key. + c map[string][]string + + // Stores the keys in order of appearance. + k []string + + // WriteSeparator specifies the separator of key and value while writing the properties. + WriteSeparator string +} + +// NewProperties creates a new Properties struct with the default +// configuration for "${key}" expressions. +func NewProperties() *Properties { + return &Properties{ + Prefix: "${", + Postfix: "}", + m: map[string]string{}, + c: map[string][]string{}, + k: []string{}, + } +} + +// Load reads a buffer into the given Properties struct. +func (p *Properties) Load(buf []byte, enc Encoding) error { + l := &Loader{Encoding: enc, DisableExpansion: p.DisableExpansion} + newProperties, err := l.LoadBytes(buf) + if err != nil { + return err + } + p.Merge(newProperties) + return nil +} + +// Get returns the expanded value for the given key if exists. +// Otherwise, ok is false. +func (p *Properties) Get(key string) (value string, ok bool) { + v, ok := p.m[key] + if p.DisableExpansion { + return v, ok + } + if !ok { + return "", false + } + + expanded, err := p.expand(key, v) + + // we guarantee that the expanded value is free of + // circular references and malformed expressions + // so we panic if we still get an error here. + if err != nil { + ErrorHandler(err) + } + + return expanded, true +} + +// MustGet returns the expanded value for the given key if exists. +// Otherwise, it panics. +func (p *Properties) MustGet(key string) string { + if v, ok := p.Get(key); ok { + return v + } + ErrorHandler(invalidKeyError(key)) + panic("ErrorHandler should exit") +} + +// ---------------------------------------------------------------------------- + +// ClearComments removes the comments for all keys. +func (p *Properties) ClearComments() { + p.c = map[string][]string{} +} + +// ---------------------------------------------------------------------------- + +// GetComment returns the last comment before the given key or an empty string. +func (p *Properties) GetComment(key string) string { + comments, ok := p.c[key] + if !ok || len(comments) == 0 { + return "" + } + return comments[len(comments)-1] +} + +// ---------------------------------------------------------------------------- + +// GetComments returns all comments that appeared before the given key or nil. +func (p *Properties) GetComments(key string) []string { + if comments, ok := p.c[key]; ok { + return comments + } + return nil +} + +// ---------------------------------------------------------------------------- + +// SetComment sets the comment for the key. +func (p *Properties) SetComment(key, comment string) { + p.c[key] = []string{comment} +} + +// ---------------------------------------------------------------------------- + +// SetComments sets the comments for the key. If the comments are nil then +// all comments for this key are deleted. +func (p *Properties) SetComments(key string, comments []string) { + if comments == nil { + delete(p.c, key) + return + } + p.c[key] = comments +} + +// ---------------------------------------------------------------------------- + +// GetBool checks if the expanded value is one of '1', 'yes', +// 'true' or 'on' if the key exists. The comparison is case-insensitive. +// If the key does not exist the default value is returned. +func (p *Properties) GetBool(key string, def bool) bool { + v, err := p.getBool(key) + if err != nil { + return def + } + return v +} + +// MustGetBool checks if the expanded value is one of '1', 'yes', +// 'true' or 'on' if the key exists. The comparison is case-insensitive. +// If the key does not exist the function panics. +func (p *Properties) MustGetBool(key string) bool { + v, err := p.getBool(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getBool(key string) (value bool, err error) { + if v, ok := p.Get(key); ok { + return boolVal(v), nil + } + return false, invalidKeyError(key) +} + +func boolVal(v string) bool { + v = strings.ToLower(v) + return v == "1" || v == "true" || v == "yes" || v == "on" +} + +// ---------------------------------------------------------------------------- + +// GetDuration parses the expanded value as an time.Duration (in ns) if the +// key exists. If key does not exist or the value cannot be parsed the default +// value is returned. In almost all cases you want to use GetParsedDuration(). +func (p *Properties) GetDuration(key string, def time.Duration) time.Duration { + v, err := p.getInt64(key) + if err != nil { + return def + } + return time.Duration(v) +} + +// MustGetDuration parses the expanded value as an time.Duration (in ns) if +// the key exists. If key does not exist or the value cannot be parsed the +// function panics. In almost all cases you want to use MustGetParsedDuration(). +func (p *Properties) MustGetDuration(key string) time.Duration { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return time.Duration(v) +} + +// ---------------------------------------------------------------------------- + +// GetParsedDuration parses the expanded value with time.ParseDuration() if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetParsedDuration(key string, def time.Duration) time.Duration { + s, ok := p.Get(key) + if !ok { + return def + } + v, err := time.ParseDuration(s) + if err != nil { + return def + } + return v +} + +// MustGetParsedDuration parses the expanded value with time.ParseDuration() if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetParsedDuration(key string) time.Duration { + s, ok := p.Get(key) + if !ok { + ErrorHandler(invalidKeyError(key)) + } + v, err := time.ParseDuration(s) + if err != nil { + ErrorHandler(err) + } + return v +} + +// ---------------------------------------------------------------------------- + +// GetFloat64 parses the expanded value as a float64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetFloat64(key string, def float64) float64 { + v, err := p.getFloat64(key) + if err != nil { + return def + } + return v +} + +// MustGetFloat64 parses the expanded value as a float64 if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetFloat64(key string) float64 { + v, err := p.getFloat64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getFloat64(key string) (value float64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseFloat(v, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetInt parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. If the value does not fit into an int the +// function panics with an out of range error. +func (p *Properties) GetInt(key string, def int) int { + v, err := p.getInt64(key) + if err != nil { + return def + } + return intRangeCheck(key, v) +} + +// MustGetInt parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +// If the value does not fit into an int the function panics with +// an out of range error. +func (p *Properties) MustGetInt(key string) int { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return intRangeCheck(key, v) +} + +// ---------------------------------------------------------------------------- + +// GetInt64 parses the expanded value as an int64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetInt64(key string, def int64) int64 { + v, err := p.getInt64(key) + if err != nil { + return def + } + return v +} + +// MustGetInt64 parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetInt64(key string) int64 { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getInt64(key string) (value int64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseInt(v, 10, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetUint parses the expanded value as an uint if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. If the value does not fit into an int the +// function panics with an out of range error. +func (p *Properties) GetUint(key string, def uint) uint { + v, err := p.getUint64(key) + if err != nil { + return def + } + return uintRangeCheck(key, v) +} + +// MustGetUint parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +// If the value does not fit into an int the function panics with +// an out of range error. +func (p *Properties) MustGetUint(key string) uint { + v, err := p.getUint64(key) + if err != nil { + ErrorHandler(err) + } + return uintRangeCheck(key, v) +} + +// ---------------------------------------------------------------------------- + +// GetUint64 parses the expanded value as an uint64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetUint64(key string, def uint64) uint64 { + v, err := p.getUint64(key) + if err != nil { + return def + } + return v +} + +// MustGetUint64 parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetUint64(key string) uint64 { + v, err := p.getUint64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getUint64(key string) (value uint64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseUint(v, 10, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetString returns the expanded value for the given key if exists or +// the default value otherwise. +func (p *Properties) GetString(key, def string) string { + if v, ok := p.Get(key); ok { + return v + } + return def +} + +// MustGetString returns the expanded value for the given key if exists or +// panics otherwise. +func (p *Properties) MustGetString(key string) string { + if v, ok := p.Get(key); ok { + return v + } + ErrorHandler(invalidKeyError(key)) + panic("ErrorHandler should exit") +} + +// ---------------------------------------------------------------------------- + +// Filter returns a new properties object which contains all properties +// for which the key matches the pattern. +func (p *Properties) Filter(pattern string) (*Properties, error) { + re, err := regexp.Compile(pattern) + if err != nil { + return nil, err + } + + return p.FilterRegexp(re), nil +} + +// FilterRegexp returns a new properties object which contains all properties +// for which the key matches the regular expression. +func (p *Properties) FilterRegexp(re *regexp.Regexp) *Properties { + pp := NewProperties() + for _, k := range p.k { + if re.MatchString(k) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed) + pp.Set(k, p.m[k]) + } + } + return pp +} + +// FilterPrefix returns a new properties object with a subset of all keys +// with the given prefix. +func (p *Properties) FilterPrefix(prefix string) *Properties { + pp := NewProperties() + for _, k := range p.k { + if strings.HasPrefix(k, prefix) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed) + pp.Set(k, p.m[k]) + } + } + return pp +} + +// FilterStripPrefix returns a new properties object with a subset of all keys +// with the given prefix and the prefix removed from the keys. +func (p *Properties) FilterStripPrefix(prefix string) *Properties { + pp := NewProperties() + n := len(prefix) + for _, k := range p.k { + if len(k) > len(prefix) && strings.HasPrefix(k, prefix) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are modifying keys I am not entirely sure whether we can create a circular reference + // TODO(fs): this function should probably return an error but the signature is fixed + pp.Set(k[n:], p.m[k]) + } + } + return pp +} + +// Len returns the number of keys. +func (p *Properties) Len() int { + return len(p.m) +} + +// Keys returns all keys in the same order as in the input. +func (p *Properties) Keys() []string { + keys := make([]string, len(p.k)) + copy(keys, p.k) + return keys +} + +// Set sets the property key to the corresponding value. +// If a value for key existed before then ok is true and prev +// contains the previous value. If the value contains a +// circular reference or a malformed expression then +// an error is returned. +// An empty key is silently ignored. +func (p *Properties) Set(key, value string) (prev string, ok bool, err error) { + if key == "" { + return "", false, nil + } + + // if expansion is disabled we allow circular references + if p.DisableExpansion { + prev, ok = p.Get(key) + p.m[key] = value + if !ok { + p.k = append(p.k, key) + } + return prev, ok, nil + } + + // to check for a circular reference we temporarily need + // to set the new value. If there is an error then revert + // to the previous state. Only if all tests are successful + // then we add the key to the p.k list. + prev, ok = p.Get(key) + p.m[key] = value + + // now check for a circular reference + _, err = p.expand(key, value) + if err != nil { + + // revert to the previous state + if ok { + p.m[key] = prev + } else { + delete(p.m, key) + } + + return "", false, err + } + + if !ok { + p.k = append(p.k, key) + } + + return prev, ok, nil +} + +// SetValue sets property key to the default string value +// as defined by fmt.Sprintf("%v"). +func (p *Properties) SetValue(key string, value interface{}) error { + _, _, err := p.Set(key, fmt.Sprintf("%v", value)) + return err +} + +// MustSet sets the property key to the corresponding value. +// If a value for key existed before then ok is true and prev +// contains the previous value. An empty key is silently ignored. +func (p *Properties) MustSet(key, value string) (prev string, ok bool) { + prev, ok, err := p.Set(key, value) + if err != nil { + ErrorHandler(err) + } + return prev, ok +} + +// String returns a string of all expanded 'key = value' pairs. +func (p *Properties) String() string { + var s string + for _, key := range p.k { + value, _ := p.Get(key) + s = fmt.Sprintf("%s%s = %s\n", s, key, value) + } + return s +} + +// Sort sorts the properties keys in alphabetical order. +// This is helpfully before writing the properties. +func (p *Properties) Sort() { + sort.Strings(p.k) +} + +// Write writes all unexpanded 'key = value' pairs to the given writer. +// Write returns the number of bytes written and any write error encountered. +func (p *Properties) Write(w io.Writer, enc Encoding) (n int, err error) { + return p.WriteComment(w, "", enc) +} + +// WriteComment writes all unexpanced 'key = value' pairs to the given writer. +// If prefix is not empty then comments are written with a blank line and the +// given prefix. The prefix should be either "# " or "! " to be compatible with +// the properties file format. Otherwise, the properties parser will not be +// able to read the file back in. It returns the number of bytes written and +// any write error encountered. +func (p *Properties) WriteComment(w io.Writer, prefix string, enc Encoding) (n int, err error) { + var x int + + for _, key := range p.k { + value := p.m[key] + + if prefix != "" { + if comments, ok := p.c[key]; ok { + // don't print comments if they are all empty + allEmpty := true + for _, c := range comments { + if c != "" { + allEmpty = false + break + } + } + + if !allEmpty { + // add a blank line between entries but not at the top + if len(comments) > 0 && n > 0 { + x, err = fmt.Fprintln(w) + if err != nil { + return + } + n += x + } + + for _, c := range comments { + x, err = fmt.Fprintf(w, "%s%s\n", prefix, c) + if err != nil { + return + } + n += x + } + } + } + } + sep := " = " + if p.WriteSeparator != "" { + sep = p.WriteSeparator + } + x, err = fmt.Fprintf(w, "%s%s%s\n", encode(key, " :", enc), sep, encode(value, "", enc)) + if err != nil { + return + } + n += x + } + return +} + +// Map returns a copy of the properties as a map. +func (p *Properties) Map() map[string]string { + m := make(map[string]string) + for k, v := range p.m { + m[k] = v + } + return m +} + +// FilterFunc returns a copy of the properties which includes the values which passed all filters. +func (p *Properties) FilterFunc(filters ...func(k, v string) bool) *Properties { + pp := NewProperties() +outer: + for k, v := range p.m { + for _, f := range filters { + if !f(k, v) { + continue outer + } + pp.Set(k, v) + } + } + return pp +} + +// ---------------------------------------------------------------------------- + +// Delete removes the key and its comments. +func (p *Properties) Delete(key string) { + delete(p.m, key) + delete(p.c, key) + newKeys := []string{} + for _, k := range p.k { + if k != key { + newKeys = append(newKeys, k) + } + } + p.k = newKeys +} + +// Merge merges properties, comments and keys from other *Properties into p +func (p *Properties) Merge(other *Properties) { + for _, k := range other.k { + if _, ok := p.m[k]; !ok { + p.k = append(p.k, k) + } + } + for k, v := range other.m { + p.m[k] = v + } + for k, v := range other.c { + p.c[k] = v + } +} + +// ---------------------------------------------------------------------------- + +// check expands all values and returns an error if a circular reference or +// a malformed expression was found. +func (p *Properties) check() error { + for key, value := range p.m { + if _, err := p.expand(key, value); err != nil { + return err + } + } + return nil +} + +func (p *Properties) expand(key, input string) (string, error) { + // no pre/postfix -> nothing to expand + if p.Prefix == "" && p.Postfix == "" { + return input, nil + } + + return expand(input, []string{key}, p.Prefix, p.Postfix, p.m) +} + +// expand recursively expands expressions of '(prefix)key(postfix)' to their corresponding values. +// The function keeps track of the keys that were already expanded and stops if it +// detects a circular reference or a malformed expression of the form '(prefix)key'. +func expand(s string, keys []string, prefix, postfix string, values map[string]string) (string, error) { + if len(keys) > maxExpansionDepth { + return "", fmt.Errorf("expansion too deep") + } + + for { + start := strings.Index(s, prefix) + if start == -1 { + return s, nil + } + + keyStart := start + len(prefix) + keyLen := strings.Index(s[keyStart:], postfix) + if keyLen == -1 { + return "", fmt.Errorf("malformed expression") + } + + end := keyStart + keyLen + len(postfix) - 1 + key := s[keyStart : keyStart+keyLen] + + // fmt.Printf("s:%q pp:%q start:%d end:%d keyStart:%d keyLen:%d key:%q\n", s, prefix + "..." + postfix, start, end, keyStart, keyLen, key) + + for _, k := range keys { + if key == k { + var b bytes.Buffer + b.WriteString("circular reference in:\n") + for _, k1 := range keys { + fmt.Fprintf(&b, "%s=%s\n", k1, values[k1]) + } + return "", fmt.Errorf(b.String()) + } + } + + val, ok := values[key] + if !ok { + val = os.Getenv(key) + } + new_val, err := expand(val, append(keys, key), prefix, postfix, values) + if err != nil { + return "", err + } + s = s[:start] + new_val + s[end+1:] + } +} + +// encode encodes a UTF-8 string to ISO-8859-1 and escapes some characters. +func encode(s string, special string, enc Encoding) string { + switch enc { + case UTF8: + return encodeUtf8(s, special) + case ISO_8859_1: + return encodeIso(s, special) + default: + panic(fmt.Sprintf("unsupported encoding %v", enc)) + } +} + +func encodeUtf8(s string, special string) string { + v := "" + for pos := 0; pos < len(s); { + r, w := utf8.DecodeRuneInString(s[pos:]) + pos += w + v += escape(r, special) + } + return v +} + +func encodeIso(s string, special string) string { + var r rune + var w int + var v string + for pos := 0; pos < len(s); { + switch r, w = utf8.DecodeRuneInString(s[pos:]); { + case r < 1<<8: // single byte rune -> escape special chars only + v += escape(r, special) + case r < 1<<16: // two byte rune -> unicode literal + v += fmt.Sprintf("\\u%04x", r) + default: // more than two bytes per rune -> can't encode + v += "?" + } + pos += w + } + return v +} + +func escape(r rune, special string) string { + switch r { + case '\f': + return "\\f" + case '\n': + return "\\n" + case '\r': + return "\\r" + case '\t': + return "\\t" + case '\\': + return "\\\\" + default: + if strings.ContainsRune(special, r) { + return "\\" + string(r) + } + return string(r) + } +} + +func invalidKeyError(key string) error { + return fmt.Errorf("unknown property: %s", key) +} diff --git a/vendor/github.com/magiconair/properties/rangecheck.go b/vendor/github.com/magiconair/properties/rangecheck.go new file mode 100644 index 0000000000..dbd60b36e7 --- /dev/null +++ b/vendor/github.com/magiconair/properties/rangecheck.go @@ -0,0 +1,31 @@ +// Copyright 2013-2022 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "math" +) + +// make this a var to overwrite it in a test +var is32Bit = ^uint(0) == math.MaxUint32 + +// intRangeCheck checks if the value fits into the int type and +// panics if it does not. +func intRangeCheck(key string, v int64) int { + if is32Bit && (v < math.MinInt32 || v > math.MaxInt32) { + panic(fmt.Sprintf("Value %d for key %s out of range", v, key)) + } + return int(v) +} + +// uintRangeCheck checks if the value fits into the uint type and +// panics if it does not. +func uintRangeCheck(key string, v uint64) uint { + if is32Bit && v > math.MaxUint32 { + panic(fmt.Sprintf("Value %d for key %s out of range", v, key)) + } + return uint(v) +} diff --git a/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md b/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md new file mode 100644 index 0000000000..c758234904 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md @@ -0,0 +1,96 @@ +## 1.5.0 + +* New option `IgnoreUntaggedFields` to ignore decoding to any fields + without `mapstructure` (or the configured tag name) set [GH-277] +* New option `ErrorUnset` which makes it an error if any fields + in a target struct are not set by the decoding process. [GH-225] +* New function `OrComposeDecodeHookFunc` to help compose decode hooks. [GH-240] +* Decoding to slice from array no longer crashes [GH-265] +* Decode nested struct pointers to map [GH-271] +* Fix issue where `,squash` was ignored if `Squash` option was set. [GH-280] +* Fix issue where fields with `,omitempty` would sometimes decode + into a map with an empty string key [GH-281] + +## 1.4.3 + +* Fix cases where `json.Number` didn't decode properly [GH-261] + +## 1.4.2 + +* Custom name matchers to support any sort of casing, formatting, etc. for + field names. [GH-250] +* Fix possible panic in ComposeDecodeHookFunc [GH-251] + +## 1.4.1 + +* Fix regression where `*time.Time` value would be set to empty and not be sent + to decode hooks properly [GH-232] + +## 1.4.0 + +* A new decode hook type `DecodeHookFuncValue` has been added that has + access to the full values. [GH-183] +* Squash is now supported with embedded fields that are struct pointers [GH-205] +* Empty strings will convert to 0 for all numeric types when weakly decoding [GH-206] + +## 1.3.3 + +* Decoding maps from maps creates a settable value for decode hooks [GH-203] + +## 1.3.2 + +* Decode into interface type with a struct value is supported [GH-187] + +## 1.3.1 + +* Squash should only squash embedded structs. [GH-194] + +## 1.3.0 + +* Added `",omitempty"` support. This will ignore zero values in the source + structure when encoding. [GH-145] + +## 1.2.3 + +* Fix duplicate entries in Keys list with pointer values. [GH-185] + +## 1.2.2 + +* Do not add unsettable (unexported) values to the unused metadata key + or "remain" value. [GH-150] + +## 1.2.1 + +* Go modules checksum mismatch fix + +## 1.2.0 + +* Added support to capture unused values in a field using the `",remain"` value + in the mapstructure tag. There is an example to showcase usage. +* Added `DecoderConfig` option to always squash embedded structs +* `json.Number` can decode into `uint` types +* Empty slices are preserved and not replaced with nil slices +* Fix panic that can occur in when decoding a map into a nil slice of structs +* Improved package documentation for godoc + +## 1.1.2 + +* Fix error when decode hook decodes interface implementation into interface + type. [GH-140] + +## 1.1.1 + +* Fix panic that can happen in `decodePtr` + +## 1.1.0 + +* Added `StringToIPHookFunc` to convert `string` to `net.IP` and `net.IPNet` [GH-133] +* Support struct to struct decoding [GH-137] +* If source map value is nil, then destination map value is nil (instead of empty) +* If source slice value is nil, then destination slice value is nil (instead of empty) +* If source pointer is nil, then destination pointer is set to nil (instead of + allocated zero value of type) + +## 1.0.0 + +* Initial tagged stable release. diff --git a/vendor/github.com/mitchellh/mapstructure/LICENSE b/vendor/github.com/mitchellh/mapstructure/LICENSE new file mode 100644 index 0000000000..f9c841a51e --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Mitchell Hashimoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/mitchellh/mapstructure/README.md b/vendor/github.com/mitchellh/mapstructure/README.md new file mode 100644 index 0000000000..0018dc7d9f --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/README.md @@ -0,0 +1,46 @@ +# mapstructure [![Godoc](https://godoc.org/github.com/mitchellh/mapstructure?status.svg)](https://godoc.org/github.com/mitchellh/mapstructure) + +mapstructure is a Go library for decoding generic map values to structures +and vice versa, while providing helpful error handling. + +This library is most useful when decoding values from some data stream (JSON, +Gob, etc.) where you don't _quite_ know the structure of the underlying data +until you read a part of it. You can therefore read a `map[string]interface{}` +and use this library to decode it into the proper underlying native Go +structure. + +## Installation + +Standard `go get`: + +``` +$ go get github.com/mitchellh/mapstructure +``` + +## Usage & Example + +For usage and examples see the [Godoc](http://godoc.org/github.com/mitchellh/mapstructure). + +The `Decode` function has examples associated with it there. + +## But Why?! + +Go offers fantastic standard libraries for decoding formats such as JSON. +The standard method is to have a struct pre-created, and populate that struct +from the bytes of the encoded format. This is great, but the problem is if +you have configuration or an encoding that changes slightly depending on +specific fields. For example, consider this JSON: + +```json +{ + "type": "person", + "name": "Mitchell" +} +``` + +Perhaps we can't populate a specific structure without first reading +the "type" field from the JSON. We could always do two passes over the +decoding of the JSON (reading the "type" first, and the rest later). +However, it is much simpler to just decode this into a `map[string]interface{}` +structure, read the "type" key, then use something like this library +to decode it into the proper structure. diff --git a/vendor/github.com/mitchellh/mapstructure/decode_hooks.go b/vendor/github.com/mitchellh/mapstructure/decode_hooks.go new file mode 100644 index 0000000000..3a754ca724 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/decode_hooks.go @@ -0,0 +1,279 @@ +package mapstructure + +import ( + "encoding" + "errors" + "fmt" + "net" + "reflect" + "strconv" + "strings" + "time" +) + +// typedDecodeHook takes a raw DecodeHookFunc (an interface{}) and turns +// it into the proper DecodeHookFunc type, such as DecodeHookFuncType. +func typedDecodeHook(h DecodeHookFunc) DecodeHookFunc { + // Create variables here so we can reference them with the reflect pkg + var f1 DecodeHookFuncType + var f2 DecodeHookFuncKind + var f3 DecodeHookFuncValue + + // Fill in the variables into this interface and the rest is done + // automatically using the reflect package. + potential := []interface{}{f1, f2, f3} + + v := reflect.ValueOf(h) + vt := v.Type() + for _, raw := range potential { + pt := reflect.ValueOf(raw).Type() + if vt.ConvertibleTo(pt) { + return v.Convert(pt).Interface() + } + } + + return nil +} + +// DecodeHookExec executes the given decode hook. This should be used +// since it'll naturally degrade to the older backwards compatible DecodeHookFunc +// that took reflect.Kind instead of reflect.Type. +func DecodeHookExec( + raw DecodeHookFunc, + from reflect.Value, to reflect.Value) (interface{}, error) { + + switch f := typedDecodeHook(raw).(type) { + case DecodeHookFuncType: + return f(from.Type(), to.Type(), from.Interface()) + case DecodeHookFuncKind: + return f(from.Kind(), to.Kind(), from.Interface()) + case DecodeHookFuncValue: + return f(from, to) + default: + return nil, errors.New("invalid decode hook signature") + } +} + +// ComposeDecodeHookFunc creates a single DecodeHookFunc that +// automatically composes multiple DecodeHookFuncs. +// +// The composed funcs are called in order, with the result of the +// previous transformation. +func ComposeDecodeHookFunc(fs ...DecodeHookFunc) DecodeHookFunc { + return func(f reflect.Value, t reflect.Value) (interface{}, error) { + var err error + data := f.Interface() + + newFrom := f + for _, f1 := range fs { + data, err = DecodeHookExec(f1, newFrom, t) + if err != nil { + return nil, err + } + newFrom = reflect.ValueOf(data) + } + + return data, nil + } +} + +// OrComposeDecodeHookFunc executes all input hook functions until one of them returns no error. In that case its value is returned. +// If all hooks return an error, OrComposeDecodeHookFunc returns an error concatenating all error messages. +func OrComposeDecodeHookFunc(ff ...DecodeHookFunc) DecodeHookFunc { + return func(a, b reflect.Value) (interface{}, error) { + var allErrs string + var out interface{} + var err error + + for _, f := range ff { + out, err = DecodeHookExec(f, a, b) + if err != nil { + allErrs += err.Error() + "\n" + continue + } + + return out, nil + } + + return nil, errors.New(allErrs) + } +} + +// StringToSliceHookFunc returns a DecodeHookFunc that converts +// string to []string by splitting on the given sep. +func StringToSliceHookFunc(sep string) DecodeHookFunc { + return func( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + if f != reflect.String || t != reflect.Slice { + return data, nil + } + + raw := data.(string) + if raw == "" { + return []string{}, nil + } + + return strings.Split(raw, sep), nil + } +} + +// StringToTimeDurationHookFunc returns a DecodeHookFunc that converts +// strings to time.Duration. +func StringToTimeDurationHookFunc() DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(time.Duration(5)) { + return data, nil + } + + // Convert it by parsing + return time.ParseDuration(data.(string)) + } +} + +// StringToIPHookFunc returns a DecodeHookFunc that converts +// strings to net.IP +func StringToIPHookFunc() DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(net.IP{}) { + return data, nil + } + + // Convert it by parsing + ip := net.ParseIP(data.(string)) + if ip == nil { + return net.IP{}, fmt.Errorf("failed parsing ip %v", data) + } + + return ip, nil + } +} + +// StringToIPNetHookFunc returns a DecodeHookFunc that converts +// strings to net.IPNet +func StringToIPNetHookFunc() DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(net.IPNet{}) { + return data, nil + } + + // Convert it by parsing + _, net, err := net.ParseCIDR(data.(string)) + return net, err + } +} + +// StringToTimeHookFunc returns a DecodeHookFunc that converts +// strings to time.Time. +func StringToTimeHookFunc(layout string) DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(time.Time{}) { + return data, nil + } + + // Convert it by parsing + return time.Parse(layout, data.(string)) + } +} + +// WeaklyTypedHook is a DecodeHookFunc which adds support for weak typing to +// the decoder. +// +// Note that this is significantly different from the WeaklyTypedInput option +// of the DecoderConfig. +func WeaklyTypedHook( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + dataVal := reflect.ValueOf(data) + switch t { + case reflect.String: + switch f { + case reflect.Bool: + if dataVal.Bool() { + return "1", nil + } + return "0", nil + case reflect.Float32: + return strconv.FormatFloat(dataVal.Float(), 'f', -1, 64), nil + case reflect.Int: + return strconv.FormatInt(dataVal.Int(), 10), nil + case reflect.Slice: + dataType := dataVal.Type() + elemKind := dataType.Elem().Kind() + if elemKind == reflect.Uint8 { + return string(dataVal.Interface().([]uint8)), nil + } + case reflect.Uint: + return strconv.FormatUint(dataVal.Uint(), 10), nil + } + } + + return data, nil +} + +func RecursiveStructToMapHookFunc() DecodeHookFunc { + return func(f reflect.Value, t reflect.Value) (interface{}, error) { + if f.Kind() != reflect.Struct { + return f.Interface(), nil + } + + var i interface{} = struct{}{} + if t.Type() != reflect.TypeOf(&i).Elem() { + return f.Interface(), nil + } + + m := make(map[string]interface{}) + t.Set(reflect.ValueOf(m)) + + return f.Interface(), nil + } +} + +// TextUnmarshallerHookFunc returns a DecodeHookFunc that applies +// strings to the UnmarshalText function, when the target type +// implements the encoding.TextUnmarshaler interface +func TextUnmarshallerHookFunc() DecodeHookFuncType { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + result := reflect.New(t).Interface() + unmarshaller, ok := result.(encoding.TextUnmarshaler) + if !ok { + return data, nil + } + if err := unmarshaller.UnmarshalText([]byte(data.(string))); err != nil { + return nil, err + } + return result, nil + } +} diff --git a/vendor/github.com/mitchellh/mapstructure/error.go b/vendor/github.com/mitchellh/mapstructure/error.go new file mode 100644 index 0000000000..47a99e5af3 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/error.go @@ -0,0 +1,50 @@ +package mapstructure + +import ( + "errors" + "fmt" + "sort" + "strings" +) + +// Error implements the error interface and can represents multiple +// errors that occur in the course of a single decode. +type Error struct { + Errors []string +} + +func (e *Error) Error() string { + points := make([]string, len(e.Errors)) + for i, err := range e.Errors { + points[i] = fmt.Sprintf("* %s", err) + } + + sort.Strings(points) + return fmt.Sprintf( + "%d error(s) decoding:\n\n%s", + len(e.Errors), strings.Join(points, "\n")) +} + +// WrappedErrors implements the errwrap.Wrapper interface to make this +// return value more useful with the errwrap and go-multierror libraries. +func (e *Error) WrappedErrors() []error { + if e == nil { + return nil + } + + result := make([]error, len(e.Errors)) + for i, e := range e.Errors { + result[i] = errors.New(e) + } + + return result +} + +func appendErrors(errors []string, err error) []string { + switch e := err.(type) { + case *Error: + return append(errors, e.Errors...) + default: + return append(errors, e.Error()) + } +} diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/vendor/github.com/mitchellh/mapstructure/mapstructure.go new file mode 100644 index 0000000000..1efb22ac36 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/mapstructure.go @@ -0,0 +1,1540 @@ +// Package mapstructure exposes functionality to convert one arbitrary +// Go type into another, typically to convert a map[string]interface{} +// into a native Go structure. +// +// The Go structure can be arbitrarily complex, containing slices, +// other structs, etc. and the decoder will properly decode nested +// maps and so on into the proper structures in the native Go struct. +// See the examples to see what the decoder is capable of. +// +// The simplest function to start with is Decode. +// +// Field Tags +// +// When decoding to a struct, mapstructure will use the field name by +// default to perform the mapping. For example, if a struct has a field +// "Username" then mapstructure will look for a key in the source value +// of "username" (case insensitive). +// +// type User struct { +// Username string +// } +// +// You can change the behavior of mapstructure by using struct tags. +// The default struct tag that mapstructure looks for is "mapstructure" +// but you can customize it using DecoderConfig. +// +// Renaming Fields +// +// To rename the key that mapstructure looks for, use the "mapstructure" +// tag and set a value directly. For example, to change the "username" example +// above to "user": +// +// type User struct { +// Username string `mapstructure:"user"` +// } +// +// Embedded Structs and Squashing +// +// Embedded structs are treated as if they're another field with that name. +// By default, the two structs below are equivalent when decoding with +// mapstructure: +// +// type Person struct { +// Name string +// } +// +// type Friend struct { +// Person +// } +// +// type Friend struct { +// Person Person +// } +// +// This would require an input that looks like below: +// +// map[string]interface{}{ +// "person": map[string]interface{}{"name": "alice"}, +// } +// +// If your "person" value is NOT nested, then you can append ",squash" to +// your tag value and mapstructure will treat it as if the embedded struct +// were part of the struct directly. Example: +// +// type Friend struct { +// Person `mapstructure:",squash"` +// } +// +// Now the following input would be accepted: +// +// map[string]interface{}{ +// "name": "alice", +// } +// +// When decoding from a struct to a map, the squash tag squashes the struct +// fields into a single map. Using the example structs from above: +// +// Friend{Person: Person{Name: "alice"}} +// +// Will be decoded into a map: +// +// map[string]interface{}{ +// "name": "alice", +// } +// +// DecoderConfig has a field that changes the behavior of mapstructure +// to always squash embedded structs. +// +// Remainder Values +// +// If there are any unmapped keys in the source value, mapstructure by +// default will silently ignore them. You can error by setting ErrorUnused +// in DecoderConfig. If you're using Metadata you can also maintain a slice +// of the unused keys. +// +// You can also use the ",remain" suffix on your tag to collect all unused +// values in a map. The field with this tag MUST be a map type and should +// probably be a "map[string]interface{}" or "map[interface{}]interface{}". +// See example below: +// +// type Friend struct { +// Name string +// Other map[string]interface{} `mapstructure:",remain"` +// } +// +// Given the input below, Other would be populated with the other +// values that weren't used (everything but "name"): +// +// map[string]interface{}{ +// "name": "bob", +// "address": "123 Maple St.", +// } +// +// Omit Empty Values +// +// When decoding from a struct to any other value, you may use the +// ",omitempty" suffix on your tag to omit that value if it equates to +// the zero value. The zero value of all types is specified in the Go +// specification. +// +// For example, the zero type of a numeric type is zero ("0"). If the struct +// field value is zero and a numeric type, the field is empty, and it won't +// be encoded into the destination type. +// +// type Source struct { +// Age int `mapstructure:",omitempty"` +// } +// +// Unexported fields +// +// Since unexported (private) struct fields cannot be set outside the package +// where they are defined, the decoder will simply skip them. +// +// For this output type definition: +// +// type Exported struct { +// private string // this unexported field will be skipped +// Public string +// } +// +// Using this map as input: +// +// map[string]interface{}{ +// "private": "I will be ignored", +// "Public": "I made it through!", +// } +// +// The following struct will be decoded: +// +// type Exported struct { +// private: "" // field is left with an empty string (zero value) +// Public: "I made it through!" +// } +// +// Other Configuration +// +// mapstructure is highly configurable. See the DecoderConfig struct +// for other features and options that are supported. +package mapstructure + +import ( + "encoding/json" + "errors" + "fmt" + "reflect" + "sort" + "strconv" + "strings" +) + +// DecodeHookFunc is the callback function that can be used for +// data transformations. See "DecodeHook" in the DecoderConfig +// struct. +// +// The type must be one of DecodeHookFuncType, DecodeHookFuncKind, or +// DecodeHookFuncValue. +// Values are a superset of Types (Values can return types), and Types are a +// superset of Kinds (Types can return Kinds) and are generally a richer thing +// to use, but Kinds are simpler if you only need those. +// +// The reason DecodeHookFunc is multi-typed is for backwards compatibility: +// we started with Kinds and then realized Types were the better solution, +// but have a promise to not break backwards compat so we now support +// both. +type DecodeHookFunc interface{} + +// DecodeHookFuncType is a DecodeHookFunc which has complete information about +// the source and target types. +type DecodeHookFuncType func(reflect.Type, reflect.Type, interface{}) (interface{}, error) + +// DecodeHookFuncKind is a DecodeHookFunc which knows only the Kinds of the +// source and target types. +type DecodeHookFuncKind func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) + +// DecodeHookFuncValue is a DecodeHookFunc which has complete access to both the source and target +// values. +type DecodeHookFuncValue func(from reflect.Value, to reflect.Value) (interface{}, error) + +// DecoderConfig is the configuration that is used to create a new decoder +// and allows customization of various aspects of decoding. +type DecoderConfig struct { + // DecodeHook, if set, will be called before any decoding and any + // type conversion (if WeaklyTypedInput is on). This lets you modify + // the values before they're set down onto the resulting struct. The + // DecodeHook is called for every map and value in the input. This means + // that if a struct has embedded fields with squash tags the decode hook + // is called only once with all of the input data, not once for each + // embedded struct. + // + // If an error is returned, the entire decode will fail with that error. + DecodeHook DecodeHookFunc + + // If ErrorUnused is true, then it is an error for there to exist + // keys in the original map that were unused in the decoding process + // (extra keys). + ErrorUnused bool + + // If ErrorUnset is true, then it is an error for there to exist + // fields in the result that were not set in the decoding process + // (extra fields). This only applies to decoding to a struct. This + // will affect all nested structs as well. + ErrorUnset bool + + // ZeroFields, if set to true, will zero fields before writing them. + // For example, a map will be emptied before decoded values are put in + // it. If this is false, a map will be merged. + ZeroFields bool + + // If WeaklyTypedInput is true, the decoder will make the following + // "weak" conversions: + // + // - bools to string (true = "1", false = "0") + // - numbers to string (base 10) + // - bools to int/uint (true = 1, false = 0) + // - strings to int/uint (base implied by prefix) + // - int to bool (true if value != 0) + // - string to bool (accepts: 1, t, T, TRUE, true, True, 0, f, F, + // FALSE, false, False. Anything else is an error) + // - empty array = empty map and vice versa + // - negative numbers to overflowed uint values (base 10) + // - slice of maps to a merged map + // - single values are converted to slices if required. Each + // element is weakly decoded. For example: "4" can become []int{4} + // if the target type is an int slice. + // + WeaklyTypedInput bool + + // Squash will squash embedded structs. A squash tag may also be + // added to an individual struct field using a tag. For example: + // + // type Parent struct { + // Child `mapstructure:",squash"` + // } + Squash bool + + // Metadata is the struct that will contain extra metadata about + // the decoding. If this is nil, then no metadata will be tracked. + Metadata *Metadata + + // Result is a pointer to the struct that will contain the decoded + // value. + Result interface{} + + // The tag name that mapstructure reads for field names. This + // defaults to "mapstructure" + TagName string + + // IgnoreUntaggedFields ignores all struct fields without explicit + // TagName, comparable to `mapstructure:"-"` as default behaviour. + IgnoreUntaggedFields bool + + // MatchName is the function used to match the map key to the struct + // field name or tag. Defaults to `strings.EqualFold`. This can be used + // to implement case-sensitive tag values, support snake casing, etc. + MatchName func(mapKey, fieldName string) bool +} + +// A Decoder takes a raw interface value and turns it into structured +// data, keeping track of rich error information along the way in case +// anything goes wrong. Unlike the basic top-level Decode method, you can +// more finely control how the Decoder behaves using the DecoderConfig +// structure. The top-level Decode method is just a convenience that sets +// up the most basic Decoder. +type Decoder struct { + config *DecoderConfig +} + +// Metadata contains information about decoding a structure that +// is tedious or difficult to get otherwise. +type Metadata struct { + // Keys are the keys of the structure which were successfully decoded + Keys []string + + // Unused is a slice of keys that were found in the raw value but + // weren't decoded since there was no matching field in the result interface + Unused []string + + // Unset is a slice of field names that were found in the result interface + // but weren't set in the decoding process since there was no matching value + // in the input + Unset []string +} + +// Decode takes an input structure and uses reflection to translate it to +// the output structure. output must be a pointer to a map or struct. +func Decode(input interface{}, output interface{}) error { + config := &DecoderConfig{ + Metadata: nil, + Result: output, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// WeakDecode is the same as Decode but is shorthand to enable +// WeaklyTypedInput. See DecoderConfig for more info. +func WeakDecode(input, output interface{}) error { + config := &DecoderConfig{ + Metadata: nil, + Result: output, + WeaklyTypedInput: true, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// DecodeMetadata is the same as Decode, but is shorthand to +// enable metadata collection. See DecoderConfig for more info. +func DecodeMetadata(input interface{}, output interface{}, metadata *Metadata) error { + config := &DecoderConfig{ + Metadata: metadata, + Result: output, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// WeakDecodeMetadata is the same as Decode, but is shorthand to +// enable both WeaklyTypedInput and metadata collection. See +// DecoderConfig for more info. +func WeakDecodeMetadata(input interface{}, output interface{}, metadata *Metadata) error { + config := &DecoderConfig{ + Metadata: metadata, + Result: output, + WeaklyTypedInput: true, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// NewDecoder returns a new decoder for the given configuration. Once +// a decoder has been returned, the same configuration must not be used +// again. +func NewDecoder(config *DecoderConfig) (*Decoder, error) { + val := reflect.ValueOf(config.Result) + if val.Kind() != reflect.Ptr { + return nil, errors.New("result must be a pointer") + } + + val = val.Elem() + if !val.CanAddr() { + return nil, errors.New("result must be addressable (a pointer)") + } + + if config.Metadata != nil { + if config.Metadata.Keys == nil { + config.Metadata.Keys = make([]string, 0) + } + + if config.Metadata.Unused == nil { + config.Metadata.Unused = make([]string, 0) + } + + if config.Metadata.Unset == nil { + config.Metadata.Unset = make([]string, 0) + } + } + + if config.TagName == "" { + config.TagName = "mapstructure" + } + + if config.MatchName == nil { + config.MatchName = strings.EqualFold + } + + result := &Decoder{ + config: config, + } + + return result, nil +} + +// Decode decodes the given raw interface to the target pointer specified +// by the configuration. +func (d *Decoder) Decode(input interface{}) error { + return d.decode("", input, reflect.ValueOf(d.config.Result).Elem()) +} + +// Decodes an unknown data type into a specific reflection value. +func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) error { + var inputVal reflect.Value + if input != nil { + inputVal = reflect.ValueOf(input) + + // We need to check here if input is a typed nil. Typed nils won't + // match the "input == nil" below so we check that here. + if inputVal.Kind() == reflect.Ptr && inputVal.IsNil() { + input = nil + } + } + + if input == nil { + // If the data is nil, then we don't set anything, unless ZeroFields is set + // to true. + if d.config.ZeroFields { + outVal.Set(reflect.Zero(outVal.Type())) + + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + } + return nil + } + + if !inputVal.IsValid() { + // If the input value is invalid, then we just set the value + // to be the zero value. + outVal.Set(reflect.Zero(outVal.Type())) + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + return nil + } + + if d.config.DecodeHook != nil { + // We have a DecodeHook, so let's pre-process the input. + var err error + input, err = DecodeHookExec(d.config.DecodeHook, inputVal, outVal) + if err != nil { + return fmt.Errorf("error decoding '%s': %s", name, err) + } + } + + var err error + outputKind := getKind(outVal) + addMetaKey := true + switch outputKind { + case reflect.Bool: + err = d.decodeBool(name, input, outVal) + case reflect.Interface: + err = d.decodeBasic(name, input, outVal) + case reflect.String: + err = d.decodeString(name, input, outVal) + case reflect.Int: + err = d.decodeInt(name, input, outVal) + case reflect.Uint: + err = d.decodeUint(name, input, outVal) + case reflect.Float32: + err = d.decodeFloat(name, input, outVal) + case reflect.Struct: + err = d.decodeStruct(name, input, outVal) + case reflect.Map: + err = d.decodeMap(name, input, outVal) + case reflect.Ptr: + addMetaKey, err = d.decodePtr(name, input, outVal) + case reflect.Slice: + err = d.decodeSlice(name, input, outVal) + case reflect.Array: + err = d.decodeArray(name, input, outVal) + case reflect.Func: + err = d.decodeFunc(name, input, outVal) + default: + // If we reached this point then we weren't able to decode it + return fmt.Errorf("%s: unsupported type: %s", name, outputKind) + } + + // If we reached here, then we successfully decoded SOMETHING, so + // mark the key as used if we're tracking metainput. + if addMetaKey && d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + + return err +} + +// This decodes a basic type (bool, int, string, etc.) and sets the +// value to "data" of that type. +func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error { + if val.IsValid() && val.Elem().IsValid() { + elem := val.Elem() + + // If we can't address this element, then its not writable. Instead, + // we make a copy of the value (which is a pointer and therefore + // writable), decode into that, and replace the whole value. + copied := false + if !elem.CanAddr() { + copied = true + + // Make *T + copy := reflect.New(elem.Type()) + + // *T = elem + copy.Elem().Set(elem) + + // Set elem so we decode into it + elem = copy + } + + // Decode. If we have an error then return. We also return right + // away if we're not a copy because that means we decoded directly. + if err := d.decode(name, data, elem); err != nil || !copied { + return err + } + + // If we're a copy, we need to set te final result + val.Set(elem.Elem()) + return nil + } + + dataVal := reflect.ValueOf(data) + + // If the input data is a pointer, and the assigned type is the dereference + // of that exact pointer, then indirect it so that we can assign it. + // Example: *string to string + if dataVal.Kind() == reflect.Ptr && dataVal.Type().Elem() == val.Type() { + dataVal = reflect.Indirect(dataVal) + } + + if !dataVal.IsValid() { + dataVal = reflect.Zero(val.Type()) + } + + dataValType := dataVal.Type() + if !dataValType.AssignableTo(val.Type()) { + return fmt.Errorf( + "'%s' expected type '%s', got '%s'", + name, val.Type(), dataValType) + } + + val.Set(dataVal) + return nil +} + +func (d *Decoder) decodeString(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataKind := getKind(dataVal) + + converted := true + switch { + case dataKind == reflect.String: + val.SetString(dataVal.String()) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetString("1") + } else { + val.SetString("0") + } + case dataKind == reflect.Int && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatInt(dataVal.Int(), 10)) + case dataKind == reflect.Uint && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatUint(dataVal.Uint(), 10)) + case dataKind == reflect.Float32 && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatFloat(dataVal.Float(), 'f', -1, 64)) + case dataKind == reflect.Slice && d.config.WeaklyTypedInput, + dataKind == reflect.Array && d.config.WeaklyTypedInput: + dataType := dataVal.Type() + elemKind := dataType.Elem().Kind() + switch elemKind { + case reflect.Uint8: + var uints []uint8 + if dataKind == reflect.Array { + uints = make([]uint8, dataVal.Len(), dataVal.Len()) + for i := range uints { + uints[i] = dataVal.Index(i).Interface().(uint8) + } + } else { + uints = dataVal.Interface().([]uint8) + } + val.SetString(string(uints)) + default: + converted = false + } + default: + converted = false + } + + if !converted { + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) + } + + return nil +} + +func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataKind := getKind(dataVal) + dataType := dataVal.Type() + + switch { + case dataKind == reflect.Int: + val.SetInt(dataVal.Int()) + case dataKind == reflect.Uint: + val.SetInt(int64(dataVal.Uint())) + case dataKind == reflect.Float32: + val.SetInt(int64(dataVal.Float())) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetInt(1) + } else { + val.SetInt(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + str := dataVal.String() + if str == "" { + str = "0" + } + + i, err := strconv.ParseInt(str, 0, val.Type().Bits()) + if err == nil { + val.SetInt(i) + } else { + return fmt.Errorf("cannot parse '%s' as int: %s", name, err) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Int64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + val.SetInt(i) + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) + } + + return nil +} + +func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataKind := getKind(dataVal) + dataType := dataVal.Type() + + switch { + case dataKind == reflect.Int: + i := dataVal.Int() + if i < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %d overflows uint", + name, i) + } + val.SetUint(uint64(i)) + case dataKind == reflect.Uint: + val.SetUint(dataVal.Uint()) + case dataKind == reflect.Float32: + f := dataVal.Float() + if f < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %f overflows uint", + name, f) + } + val.SetUint(uint64(f)) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetUint(1) + } else { + val.SetUint(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + str := dataVal.String() + if str == "" { + str = "0" + } + + i, err := strconv.ParseUint(str, 0, val.Type().Bits()) + if err == nil { + val.SetUint(i) + } else { + return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := strconv.ParseUint(string(jn), 0, 64) + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + val.SetUint(i) + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) + } + + return nil +} + +func (d *Decoder) decodeBool(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataKind := getKind(dataVal) + + switch { + case dataKind == reflect.Bool: + val.SetBool(dataVal.Bool()) + case dataKind == reflect.Int && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Int() != 0) + case dataKind == reflect.Uint && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Uint() != 0) + case dataKind == reflect.Float32 && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Float() != 0) + case dataKind == reflect.String && d.config.WeaklyTypedInput: + b, err := strconv.ParseBool(dataVal.String()) + if err == nil { + val.SetBool(b) + } else if dataVal.String() == "" { + val.SetBool(false) + } else { + return fmt.Errorf("cannot parse '%s' as bool: %s", name, err) + } + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) + } + + return nil +} + +func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataKind := getKind(dataVal) + dataType := dataVal.Type() + + switch { + case dataKind == reflect.Int: + val.SetFloat(float64(dataVal.Int())) + case dataKind == reflect.Uint: + val.SetFloat(float64(dataVal.Uint())) + case dataKind == reflect.Float32: + val.SetFloat(dataVal.Float()) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetFloat(1) + } else { + val.SetFloat(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + str := dataVal.String() + if str == "" { + str = "0" + } + + f, err := strconv.ParseFloat(str, val.Type().Bits()) + if err == nil { + val.SetFloat(f) + } else { + return fmt.Errorf("cannot parse '%s' as float: %s", name, err) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Float64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + val.SetFloat(i) + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) + } + + return nil +} + +func (d *Decoder) decodeMap(name string, data interface{}, val reflect.Value) error { + valType := val.Type() + valKeyType := valType.Key() + valElemType := valType.Elem() + + // By default we overwrite keys in the current map + valMap := val + + // If the map is nil or we're purposely zeroing fields, make a new map + if valMap.IsNil() || d.config.ZeroFields { + // Make a new map to hold our result + mapType := reflect.MapOf(valKeyType, valElemType) + valMap = reflect.MakeMap(mapType) + } + + // Check input type and based on the input type jump to the proper func + dataVal := reflect.Indirect(reflect.ValueOf(data)) + switch dataVal.Kind() { + case reflect.Map: + return d.decodeMapFromMap(name, dataVal, val, valMap) + + case reflect.Struct: + return d.decodeMapFromStruct(name, dataVal, val, valMap) + + case reflect.Array, reflect.Slice: + if d.config.WeaklyTypedInput { + return d.decodeMapFromSlice(name, dataVal, val, valMap) + } + + fallthrough + + default: + return fmt.Errorf("'%s' expected a map, got '%s'", name, dataVal.Kind()) + } +} + +func (d *Decoder) decodeMapFromSlice(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + // Special case for BC reasons (covered by tests) + if dataVal.Len() == 0 { + val.Set(valMap) + return nil + } + + for i := 0; i < dataVal.Len(); i++ { + err := d.decode( + name+"["+strconv.Itoa(i)+"]", + dataVal.Index(i).Interface(), val) + if err != nil { + return err + } + } + + return nil +} + +func (d *Decoder) decodeMapFromMap(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + valType := val.Type() + valKeyType := valType.Key() + valElemType := valType.Elem() + + // Accumulate errors + errors := make([]string, 0) + + // If the input data is empty, then we just match what the input data is. + if dataVal.Len() == 0 { + if dataVal.IsNil() { + if !val.IsNil() { + val.Set(dataVal) + } + } else { + // Set to empty allocated value + val.Set(valMap) + } + + return nil + } + + for _, k := range dataVal.MapKeys() { + fieldName := name + "[" + k.String() + "]" + + // First decode the key into the proper type + currentKey := reflect.Indirect(reflect.New(valKeyType)) + if err := d.decode(fieldName, k.Interface(), currentKey); err != nil { + errors = appendErrors(errors, err) + continue + } + + // Next decode the data into the proper type + v := dataVal.MapIndex(k).Interface() + currentVal := reflect.Indirect(reflect.New(valElemType)) + if err := d.decode(fieldName, v, currentVal); err != nil { + errors = appendErrors(errors, err) + continue + } + + valMap.SetMapIndex(currentKey, currentVal) + } + + // Set the built up map to the value + val.Set(valMap) + + // If we had errors, return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + typ := dataVal.Type() + for i := 0; i < typ.NumField(); i++ { + // Get the StructField first since this is a cheap operation. If the + // field is unexported, then ignore it. + f := typ.Field(i) + if f.PkgPath != "" { + continue + } + + // Next get the actual value of this field and verify it is assignable + // to the map value. + v := dataVal.Field(i) + if !v.Type().AssignableTo(valMap.Type().Elem()) { + return fmt.Errorf("cannot assign type '%s' to map value field of type '%s'", v.Type(), valMap.Type().Elem()) + } + + tagValue := f.Tag.Get(d.config.TagName) + keyName := f.Name + + if tagValue == "" && d.config.IgnoreUntaggedFields { + continue + } + + // If Squash is set in the config, we squash the field down. + squash := d.config.Squash && v.Kind() == reflect.Struct && f.Anonymous + + v = dereferencePtrToStructIfNeeded(v, d.config.TagName) + + // Determine the name of the key in the map + if index := strings.Index(tagValue, ","); index != -1 { + if tagValue[:index] == "-" { + continue + } + // If "omitempty" is specified in the tag, it ignores empty values. + if strings.Index(tagValue[index+1:], "omitempty") != -1 && isEmptyValue(v) { + continue + } + + // If "squash" is specified in the tag, we squash the field down. + squash = squash || strings.Index(tagValue[index+1:], "squash") != -1 + if squash { + // When squashing, the embedded type can be a pointer to a struct. + if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct { + v = v.Elem() + } + + // The final type must be a struct + if v.Kind() != reflect.Struct { + return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + } + } + if keyNameTagValue := tagValue[:index]; keyNameTagValue != "" { + keyName = keyNameTagValue + } + } else if len(tagValue) > 0 { + if tagValue == "-" { + continue + } + keyName = tagValue + } + + switch v.Kind() { + // this is an embedded struct, so handle it differently + case reflect.Struct: + x := reflect.New(v.Type()) + x.Elem().Set(v) + + vType := valMap.Type() + vKeyType := vType.Key() + vElemType := vType.Elem() + mType := reflect.MapOf(vKeyType, vElemType) + vMap := reflect.MakeMap(mType) + + // Creating a pointer to a map so that other methods can completely + // overwrite the map if need be (looking at you decodeMapFromMap). The + // indirection allows the underlying map to be settable (CanSet() == true) + // where as reflect.MakeMap returns an unsettable map. + addrVal := reflect.New(vMap.Type()) + reflect.Indirect(addrVal).Set(vMap) + + err := d.decode(keyName, x.Interface(), reflect.Indirect(addrVal)) + if err != nil { + return err + } + + // the underlying map may have been completely overwritten so pull + // it indirectly out of the enclosing value. + vMap = reflect.Indirect(addrVal) + + if squash { + for _, k := range vMap.MapKeys() { + valMap.SetMapIndex(k, vMap.MapIndex(k)) + } + } else { + valMap.SetMapIndex(reflect.ValueOf(keyName), vMap) + } + + default: + valMap.SetMapIndex(reflect.ValueOf(keyName), v) + } + } + + if val.CanAddr() { + val.Set(valMap) + } + + return nil +} + +func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) (bool, error) { + // If the input data is nil, then we want to just set the output + // pointer to be nil as well. + isNil := data == nil + if !isNil { + switch v := reflect.Indirect(reflect.ValueOf(data)); v.Kind() { + case reflect.Chan, + reflect.Func, + reflect.Interface, + reflect.Map, + reflect.Ptr, + reflect.Slice: + isNil = v.IsNil() + } + } + if isNil { + if !val.IsNil() && val.CanSet() { + nilValue := reflect.New(val.Type()).Elem() + val.Set(nilValue) + } + + return true, nil + } + + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + valType := val.Type() + valElemType := valType.Elem() + if val.CanSet() { + realVal := val + if realVal.IsNil() || d.config.ZeroFields { + realVal = reflect.New(valElemType) + } + + if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil { + return false, err + } + + val.Set(realVal) + } else { + if err := d.decode(name, data, reflect.Indirect(val)); err != nil { + return false, err + } + } + return false, nil +} + +func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + dataVal := reflect.Indirect(reflect.ValueOf(data)) + if val.Type() != dataVal.Type() { + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) + } + val.Set(dataVal) + return nil +} + +func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataValKind := dataVal.Kind() + valType := val.Type() + valElemType := valType.Elem() + sliceType := reflect.SliceOf(valElemType) + + // If we have a non array/slice type then we first attempt to convert. + if dataValKind != reflect.Array && dataValKind != reflect.Slice { + if d.config.WeaklyTypedInput { + switch { + // Slice and array we use the normal logic + case dataValKind == reflect.Slice, dataValKind == reflect.Array: + break + + // Empty maps turn into empty slices + case dataValKind == reflect.Map: + if dataVal.Len() == 0 { + val.Set(reflect.MakeSlice(sliceType, 0, 0)) + return nil + } + // Create slice of maps of other sizes + return d.decodeSlice(name, []interface{}{data}, val) + + case dataValKind == reflect.String && valElemType.Kind() == reflect.Uint8: + return d.decodeSlice(name, []byte(dataVal.String()), val) + + // All other types we try to convert to the slice type + // and "lift" it into it. i.e. a string becomes a string slice. + default: + // Just re-try this function with data as a slice. + return d.decodeSlice(name, []interface{}{data}, val) + } + } + + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + } + + // If the input value is nil, then don't allocate since empty != nil + if dataValKind != reflect.Array && dataVal.IsNil() { + return nil + } + + valSlice := val + if valSlice.IsNil() || d.config.ZeroFields { + // Make a new slice to hold our result, same size as the original data. + valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len()) + } + + // Accumulate any errors + errors := make([]string, 0) + + for i := 0; i < dataVal.Len(); i++ { + currentData := dataVal.Index(i).Interface() + for valSlice.Len() <= i { + valSlice = reflect.Append(valSlice, reflect.Zero(valElemType)) + } + currentField := valSlice.Index(i) + + fieldName := name + "[" + strconv.Itoa(i) + "]" + if err := d.decode(fieldName, currentData, currentField); err != nil { + errors = appendErrors(errors, err) + } + } + + // Finally, set the value to the slice we built up + val.Set(valSlice) + + // If there were errors, we return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeArray(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataValKind := dataVal.Kind() + valType := val.Type() + valElemType := valType.Elem() + arrayType := reflect.ArrayOf(valType.Len(), valElemType) + + valArray := val + + if valArray.Interface() == reflect.Zero(valArray.Type()).Interface() || d.config.ZeroFields { + // Check input type + if dataValKind != reflect.Array && dataValKind != reflect.Slice { + if d.config.WeaklyTypedInput { + switch { + // Empty maps turn into empty arrays + case dataValKind == reflect.Map: + if dataVal.Len() == 0 { + val.Set(reflect.Zero(arrayType)) + return nil + } + + // All other types we try to convert to the array type + // and "lift" it into it. i.e. a string becomes a string array. + default: + // Just re-try this function with data as a slice. + return d.decodeArray(name, []interface{}{data}, val) + } + } + + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + + } + if dataVal.Len() > arrayType.Len() { + return fmt.Errorf( + "'%s': expected source data to have length less or equal to %d, got %d", name, arrayType.Len(), dataVal.Len()) + + } + + // Make a new array to hold our result, same size as the original data. + valArray = reflect.New(arrayType).Elem() + } + + // Accumulate any errors + errors := make([]string, 0) + + for i := 0; i < dataVal.Len(); i++ { + currentData := dataVal.Index(i).Interface() + currentField := valArray.Index(i) + + fieldName := name + "[" + strconv.Itoa(i) + "]" + if err := d.decode(fieldName, currentData, currentField); err != nil { + errors = appendErrors(errors, err) + } + } + + // Finally, set the value to the array we built up + val.Set(valArray) + + // If there were errors, we return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + + // If the type of the value to write to and the data match directly, + // then we just set it directly instead of recursing into the structure. + if dataVal.Type() == val.Type() { + val.Set(dataVal) + return nil + } + + dataValKind := dataVal.Kind() + switch dataValKind { + case reflect.Map: + return d.decodeStructFromMap(name, dataVal, val) + + case reflect.Struct: + // Not the most efficient way to do this but we can optimize later if + // we want to. To convert from struct to struct we go to map first + // as an intermediary. + + // Make a new map to hold our result + mapType := reflect.TypeOf((map[string]interface{})(nil)) + mval := reflect.MakeMap(mapType) + + // Creating a pointer to a map so that other methods can completely + // overwrite the map if need be (looking at you decodeMapFromMap). The + // indirection allows the underlying map to be settable (CanSet() == true) + // where as reflect.MakeMap returns an unsettable map. + addrVal := reflect.New(mval.Type()) + + reflect.Indirect(addrVal).Set(mval) + if err := d.decodeMapFromStruct(name, dataVal, reflect.Indirect(addrVal), mval); err != nil { + return err + } + + result := d.decodeStructFromMap(name, reflect.Indirect(addrVal), val) + return result + + default: + return fmt.Errorf("'%s' expected a map, got '%s'", name, dataVal.Kind()) + } +} + +func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) error { + dataValType := dataVal.Type() + if kind := dataValType.Key().Kind(); kind != reflect.String && kind != reflect.Interface { + return fmt.Errorf( + "'%s' needs a map with string keys, has '%s' keys", + name, dataValType.Key().Kind()) + } + + dataValKeys := make(map[reflect.Value]struct{}) + dataValKeysUnused := make(map[interface{}]struct{}) + for _, dataValKey := range dataVal.MapKeys() { + dataValKeys[dataValKey] = struct{}{} + dataValKeysUnused[dataValKey.Interface()] = struct{}{} + } + + targetValKeysUnused := make(map[interface{}]struct{}) + errors := make([]string, 0) + + // This slice will keep track of all the structs we'll be decoding. + // There can be more than one struct if there are embedded structs + // that are squashed. + structs := make([]reflect.Value, 1, 5) + structs[0] = val + + // Compile the list of all the fields that we're going to be decoding + // from all the structs. + type field struct { + field reflect.StructField + val reflect.Value + } + + // remainField is set to a valid field set with the "remain" tag if + // we are keeping track of remaining values. + var remainField *field + + fields := []field{} + for len(structs) > 0 { + structVal := structs[0] + structs = structs[1:] + + structType := structVal.Type() + + for i := 0; i < structType.NumField(); i++ { + fieldType := structType.Field(i) + fieldVal := structVal.Field(i) + if fieldVal.Kind() == reflect.Ptr && fieldVal.Elem().Kind() == reflect.Struct { + // Handle embedded struct pointers as embedded structs. + fieldVal = fieldVal.Elem() + } + + // If "squash" is specified in the tag, we squash the field down. + squash := d.config.Squash && fieldVal.Kind() == reflect.Struct && fieldType.Anonymous + remain := false + + // We always parse the tags cause we're looking for other tags too + tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",") + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + + if tag == "remain" { + remain = true + break + } + } + + if squash { + if fieldVal.Kind() != reflect.Struct { + errors = appendErrors(errors, + fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldVal.Kind())) + } else { + structs = append(structs, fieldVal) + } + continue + } + + // Build our field + if remain { + remainField = &field{fieldType, fieldVal} + } else { + // Normal struct field, store it away + fields = append(fields, field{fieldType, fieldVal}) + } + } + } + + // for fieldType, field := range fields { + for _, f := range fields { + field, fieldValue := f.field, f.val + fieldName := field.Name + + tagValue := field.Tag.Get(d.config.TagName) + tagValue = strings.SplitN(tagValue, ",", 2)[0] + if tagValue != "" { + fieldName = tagValue + } + + rawMapKey := reflect.ValueOf(fieldName) + rawMapVal := dataVal.MapIndex(rawMapKey) + if !rawMapVal.IsValid() { + // Do a slower search by iterating over each key and + // doing case-insensitive search. + for dataValKey := range dataValKeys { + mK, ok := dataValKey.Interface().(string) + if !ok { + // Not a string key + continue + } + + if d.config.MatchName(mK, fieldName) { + rawMapKey = dataValKey + rawMapVal = dataVal.MapIndex(dataValKey) + break + } + } + + if !rawMapVal.IsValid() { + // There was no matching key in the map for the value in + // the struct. Remember it for potential errors and metadata. + targetValKeysUnused[fieldName] = struct{}{} + continue + } + } + + if !fieldValue.IsValid() { + // This should never happen + panic("field is not valid") + } + + // If we can't set the field, then it is unexported or something, + // and we just continue onwards. + if !fieldValue.CanSet() { + continue + } + + // Delete the key we're using from the unused map so we stop tracking + delete(dataValKeysUnused, rawMapKey.Interface()) + + // If the name is empty string, then we're at the root, and we + // don't dot-join the fields. + if name != "" { + fieldName = name + "." + fieldName + } + + if err := d.decode(fieldName, rawMapVal.Interface(), fieldValue); err != nil { + errors = appendErrors(errors, err) + } + } + + // If we have a "remain"-tagged field and we have unused keys then + // we put the unused keys directly into the remain field. + if remainField != nil && len(dataValKeysUnused) > 0 { + // Build a map of only the unused values + remain := map[interface{}]interface{}{} + for key := range dataValKeysUnused { + remain[key] = dataVal.MapIndex(reflect.ValueOf(key)).Interface() + } + + // Decode it as-if we were just decoding this map onto our map. + if err := d.decodeMap(name, remain, remainField.val); err != nil { + errors = appendErrors(errors, err) + } + + // Set the map to nil so we have none so that the next check will + // not error (ErrorUnused) + dataValKeysUnused = nil + } + + if d.config.ErrorUnused && len(dataValKeysUnused) > 0 { + keys := make([]string, 0, len(dataValKeysUnused)) + for rawKey := range dataValKeysUnused { + keys = append(keys, rawKey.(string)) + } + sort.Strings(keys) + + err := fmt.Errorf("'%s' has invalid keys: %s", name, strings.Join(keys, ", ")) + errors = appendErrors(errors, err) + } + + if d.config.ErrorUnset && len(targetValKeysUnused) > 0 { + keys := make([]string, 0, len(targetValKeysUnused)) + for rawKey := range targetValKeysUnused { + keys = append(keys, rawKey.(string)) + } + sort.Strings(keys) + + err := fmt.Errorf("'%s' has unset fields: %s", name, strings.Join(keys, ", ")) + errors = appendErrors(errors, err) + } + + if len(errors) > 0 { + return &Error{errors} + } + + // Add the unused keys to the list of unused keys if we're tracking metadata + if d.config.Metadata != nil { + for rawKey := range dataValKeysUnused { + key := rawKey.(string) + if name != "" { + key = name + "." + key + } + + d.config.Metadata.Unused = append(d.config.Metadata.Unused, key) + } + for rawKey := range targetValKeysUnused { + key := rawKey.(string) + if name != "" { + key = name + "." + key + } + + d.config.Metadata.Unset = append(d.config.Metadata.Unset, key) + } + } + + return nil +} + +func isEmptyValue(v reflect.Value) bool { + switch getKind(v) { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + } + return false +} + +func getKind(val reflect.Value) reflect.Kind { + kind := val.Kind() + + switch { + case kind >= reflect.Int && kind <= reflect.Int64: + return reflect.Int + case kind >= reflect.Uint && kind <= reflect.Uint64: + return reflect.Uint + case kind >= reflect.Float32 && kind <= reflect.Float64: + return reflect.Float32 + default: + return kind + } +} + +func isStructTypeConvertibleToMap(typ reflect.Type, checkMapstructureTags bool, tagName string) bool { + for i := 0; i < typ.NumField(); i++ { + f := typ.Field(i) + if f.PkgPath == "" && !checkMapstructureTags { // check for unexported fields + return true + } + if checkMapstructureTags && f.Tag.Get(tagName) != "" { // check for mapstructure tags inside + return true + } + } + return false +} + +func dereferencePtrToStructIfNeeded(v reflect.Value, tagName string) reflect.Value { + if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Struct { + return v + } + deref := v.Elem() + derefT := deref.Type() + if isStructTypeConvertibleToMap(derefT, true, tagName) { + return deref + } + return v +} diff --git a/vendor/github.com/sagikazarmark/locafero/.editorconfig b/vendor/github.com/sagikazarmark/locafero/.editorconfig new file mode 100644 index 0000000000..6f944f5406 --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/.editorconfig @@ -0,0 +1,21 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[{Makefile,*.mk}] +indent_style = tab + +[*.nix] +indent_size = 2 + +[*.go] +indent_style = tab + +[{*.yml,*.yaml}] +indent_size = 2 diff --git a/vendor/github.com/sagikazarmark/locafero/.envrc b/vendor/github.com/sagikazarmark/locafero/.envrc new file mode 100644 index 0000000000..2e0f9f5f71 --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/.envrc @@ -0,0 +1,4 @@ +if ! has nix_direnv_version || ! nix_direnv_version 3.0.4; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.4/direnvrc" "sha256-DzlYZ33mWF/Gs8DDeyjr8mnVmQGx7ASYqA5WlxwvBG4=" +fi +use flake . --impure diff --git a/vendor/github.com/sagikazarmark/locafero/.gitignore b/vendor/github.com/sagikazarmark/locafero/.gitignore new file mode 100644 index 0000000000..8f07e60163 --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/.gitignore @@ -0,0 +1,8 @@ +/.devenv/ +/.direnv/ +/.task/ +/bin/ +/build/ +/tmp/ +/var/ +/vendor/ diff --git a/vendor/github.com/sagikazarmark/locafero/.golangci.yaml b/vendor/github.com/sagikazarmark/locafero/.golangci.yaml new file mode 100644 index 0000000000..829de2a4a0 --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/.golangci.yaml @@ -0,0 +1,27 @@ +run: + timeout: 10m + +linters-settings: + gci: + sections: + - standard + - default + - prefix(github.com/sagikazarmark/locafero) + goimports: + local-prefixes: github.com/sagikazarmark/locafero + misspell: + locale: US + nolintlint: + allow-leading-space: false # require machine-readable nolint directives (with no leading space) + allow-unused: false # report any unused nolint directives + require-specific: false # don't require nolint directives to be specific about which linter is being skipped + revive: + confidence: 0 + +linters: + enable: + - gci + - goimports + - misspell + - nolintlint + - revive diff --git a/vendor/github.com/sagikazarmark/locafero/LICENSE b/vendor/github.com/sagikazarmark/locafero/LICENSE new file mode 100644 index 0000000000..a70b0f2960 --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2023 Márk Sági-Kazár + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/sagikazarmark/locafero/README.md b/vendor/github.com/sagikazarmark/locafero/README.md new file mode 100644 index 0000000000..a48e8e9789 --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/README.md @@ -0,0 +1,37 @@ +# Finder library for [Afero](https://github.com/spf13/afero) + +[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/sagikazarmark/locafero/ci.yaml?style=flat-square)](https://github.com/sagikazarmark/locafero/actions/workflows/ci.yaml) +[![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/mod/github.com/sagikazarmark/locafero) +![Go Version](https://img.shields.io/badge/go%20version-%3E=1.20-61CFDD.svg?style=flat-square) +[![built with nix](https://img.shields.io/badge/builtwith-nix-7d81f7?style=flat-square)](https://builtwithnix.org) + +**Finder library for [Afero](https://github.com/spf13/afero) ported from [go-finder](https://github.com/sagikazarmark/go-finder).** + +> [!WARNING] +> This is an experimental library under development. +> +> **Backwards compatibility is not guaranteed, expect breaking changes.** + +## Installation + +```shell +go get github.com/sagikazarmark/locafero +``` + +## Usage + +Check out the [package example](https://pkg.go.dev/github.com/sagikazarmark/locafero#example-package) on go.dev. + +## Development + +**For an optimal developer experience, it is recommended to install [Nix](https://nixos.org/download.html) and [direnv](https://direnv.net/docs/installation.html).** + +Run the test suite: + +```shell +just test +``` + +## License + +The project is licensed under the [MIT License](LICENSE). diff --git a/vendor/github.com/sagikazarmark/locafero/file_type.go b/vendor/github.com/sagikazarmark/locafero/file_type.go new file mode 100644 index 0000000000..9a9b140233 --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/file_type.go @@ -0,0 +1,28 @@ +package locafero + +import "io/fs" + +// FileType represents the kind of entries [Finder] can return. +type FileType int + +const ( + FileTypeAll FileType = iota + FileTypeFile + FileTypeDir +) + +func (ft FileType) matchFileInfo(info fs.FileInfo) bool { + switch ft { + case FileTypeAll: + return true + + case FileTypeFile: + return !info.IsDir() + + case FileTypeDir: + return info.IsDir() + + default: + return false + } +} diff --git a/vendor/github.com/sagikazarmark/locafero/finder.go b/vendor/github.com/sagikazarmark/locafero/finder.go new file mode 100644 index 0000000000..ef8d547122 --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/finder.go @@ -0,0 +1,165 @@ +// Package finder looks for files and directories in an {fs.Fs} filesystem. +package locafero + +import ( + "errors" + "io/fs" + "path/filepath" + "strings" + + "github.com/sourcegraph/conc/iter" + "github.com/spf13/afero" +) + +// Finder looks for files and directories in an [afero.Fs] filesystem. +type Finder struct { + // Paths represents a list of locations that the [Finder] will search in. + // + // They are essentially the root directories or starting points for the search. + // + // Examples: + // - home/user + // - etc + Paths []string + + // Names are specific entries that the [Finder] will look for within the given Paths. + // + // It provides the capability to search for entries with depth, + // meaning it can target deeper locations within the directory structure. + // + // It also supports glob syntax (as defined by [filepath.Match]), offering greater flexibility in search patterns. + // + // Examples: + // - config.yaml + // - home/*/config.yaml + // - home/*/config.* + Names []string + + // Type restricts the kind of entries returned by the [Finder]. + // + // This parameter helps in differentiating and filtering out files from directories or vice versa. + Type FileType +} + +// Find looks for files and directories in an [afero.Fs] filesystem. +func (f Finder) Find(fsys afero.Fs) ([]string, error) { + // Arbitrary go routine limit (TODO: make this a parameter) + // pool := pool.NewWithResults[[]string]().WithMaxGoroutines(5).WithErrors().WithFirstError() + + type searchItem struct { + path string + name string + } + + var searchItems []searchItem + + for _, searchPath := range f.Paths { + searchPath := searchPath + + for _, searchName := range f.Names { + searchName := searchName + + searchItems = append(searchItems, searchItem{searchPath, searchName}) + + // pool.Go(func() ([]string, error) { + // // If the name contains any glob character, perform a glob match + // if strings.ContainsAny(searchName, globMatch) { + // return globWalkSearch(fsys, searchPath, searchName, f.Type) + // } + // + // return statSearch(fsys, searchPath, searchName, f.Type) + // }) + } + } + + // allResults, err := pool.Wait() + // if err != nil { + // return nil, err + // } + + allResults, err := iter.MapErr(searchItems, func(item *searchItem) ([]string, error) { + // If the name contains any glob character, perform a glob match + if strings.ContainsAny(item.name, globMatch) { + return globWalkSearch(fsys, item.path, item.name, f.Type) + } + + return statSearch(fsys, item.path, item.name, f.Type) + }) + if err != nil { + return nil, err + } + + var results []string + + for _, r := range allResults { + results = append(results, r...) + } + + // Sort results in alphabetical order for now + // sort.Strings(results) + + return results, nil +} + +func globWalkSearch(fsys afero.Fs, searchPath string, searchName string, searchType FileType) ([]string, error) { + var results []string + + err := afero.Walk(fsys, searchPath, func(p string, fileInfo fs.FileInfo, err error) error { + if err != nil { + return err + } + + // Skip the root path + if p == searchPath { + return nil + } + + var result error + + // Stop reading subdirectories + // TODO: add depth detection here + if fileInfo.IsDir() && filepath.Dir(p) == searchPath { + result = fs.SkipDir + } + + // Skip unmatching type + if !searchType.matchFileInfo(fileInfo) { + return result + } + + match, err := filepath.Match(searchName, fileInfo.Name()) + if err != nil { + return err + } + + if match { + results = append(results, p) + } + + return result + }) + if err != nil { + return results, err + } + + return results, nil +} + +func statSearch(fsys afero.Fs, searchPath string, searchName string, searchType FileType) ([]string, error) { + filePath := filepath.Join(searchPath, searchName) + + fileInfo, err := fsys.Stat(filePath) + if errors.Is(err, fs.ErrNotExist) { + return nil, nil + } + if err != nil { + return nil, err + } + + // Skip unmatching type + if !searchType.matchFileInfo(fileInfo) { + return nil, nil + } + + return []string{filePath}, nil +} diff --git a/vendor/github.com/sagikazarmark/locafero/flake.lock b/vendor/github.com/sagikazarmark/locafero/flake.lock new file mode 100644 index 0000000000..4bea8154e0 --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/flake.lock @@ -0,0 +1,472 @@ +{ + "nodes": { + "cachix": { + "inputs": { + "devenv": "devenv_2", + "flake-compat": [ + "devenv", + "flake-compat" + ], + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "pre-commit-hooks": [ + "devenv", + "pre-commit-hooks" + ] + }, + "locked": { + "lastModified": 1712055811, + "narHash": "sha256-7FcfMm5A/f02yyzuavJe06zLa9hcMHsagE28ADcmQvk=", + "owner": "cachix", + "repo": "cachix", + "rev": "02e38da89851ec7fec3356a5c04bc8349cae0e30", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "cachix", + "type": "github" + } + }, + "devenv": { + "inputs": { + "cachix": "cachix", + "flake-compat": "flake-compat_2", + "nix": "nix_2", + "nixpkgs": "nixpkgs_2", + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1717245169, + "narHash": "sha256-+mW3rTBjGU8p1THJN0lX/Dd/8FbnF+3dB+mJuSaxewE=", + "owner": "cachix", + "repo": "devenv", + "rev": "c3f9f053c077c6f88a3de5276d9178c62baa3fc3", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "devenv_2": { + "inputs": { + "flake-compat": [ + "devenv", + "cachix", + "flake-compat" + ], + "nix": "nix", + "nixpkgs": "nixpkgs", + "poetry2nix": "poetry2nix", + "pre-commit-hooks": [ + "devenv", + "cachix", + "pre-commit-hooks" + ] + }, + "locked": { + "lastModified": 1708704632, + "narHash": "sha256-w+dOIW60FKMaHI1q5714CSibk99JfYxm0CzTinYWr+Q=", + "owner": "cachix", + "repo": "devenv", + "rev": "2ee4450b0f4b95a1b90f2eb5ffea98b90e48c196", + "type": "github" + }, + "original": { + "owner": "cachix", + "ref": "python-rewrite", + "repo": "devenv", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1717285511, + "narHash": "sha256-iKzJcpdXih14qYVcZ9QC9XuZYnPc6T8YImb6dX166kw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "2a55567fcf15b1b1c7ed712a2c6fadaec7412ea8", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1689068808, + "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "devenv", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "nix": { + "inputs": { + "flake-compat": "flake-compat", + "nixpkgs": [ + "devenv", + "cachix", + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression" + }, + "locked": { + "lastModified": 1712911606, + "narHash": "sha256-BGvBhepCufsjcUkXnEEXhEVjwdJAwPglCC2+bInc794=", + "owner": "domenkozar", + "repo": "nix", + "rev": "b24a9318ea3f3600c1e24b4a00691ee912d4de12", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "devenv-2.21", + "repo": "nix", + "type": "github" + } + }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "devenv", + "cachix", + "devenv", + "poetry2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688870561, + "narHash": "sha256-4UYkifnPEw1nAzqqPOTL2MvWtm3sNGw1UTYTalkTcGY=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "165b1650b753316aa7f1787f3005a8d2da0f5301", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, + "nix_2": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression_2" + }, + "locked": { + "lastModified": 1712911606, + "narHash": "sha256-BGvBhepCufsjcUkXnEEXhEVjwdJAwPglCC2+bInc794=", + "owner": "domenkozar", + "repo": "nix", + "rev": "b24a9318ea3f3600c1e24b4a00691ee912d4de12", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "devenv-2.21", + "repo": "nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1692808169, + "narHash": "sha256-x9Opq06rIiwdwGeK2Ykj69dNc2IvUH1fY55Wm7atwrE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9201b5ff357e781bf014d0330d18555695df7ba8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1717284937, + "narHash": "sha256-lIbdfCsf8LMFloheeE6N31+BMIeixqyQWbSr2vk79EQ=", + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/eb9ceca17df2ea50a250b6b27f7bf6ab0186f198.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/eb9ceca17df2ea50a250b6b27f7bf6ab0186f198.tar.gz" + } + }, + "nixpkgs-regression": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-regression_2": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1710695816, + "narHash": "sha256-3Eh7fhEID17pv9ZxrPwCLfqXnYP006RKzSs0JptsN84=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "614b4613980a522ba49f0d194531beddbb7220d3", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1713361204, + "narHash": "sha256-TA6EDunWTkc5FvDCqU3W2T3SFn0gRZqh6D/hJnM02MM=", + "owner": "cachix", + "repo": "devenv-nixpkgs", + "rev": "285676e87ad9f0ca23d8714a6ab61e7e027020c6", + "type": "github" + }, + "original": { + "owner": "cachix", + "ref": "rolling", + "repo": "devenv-nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1717112898, + "narHash": "sha256-7R2ZvOnvd9h8fDd65p0JnB7wXfUvreox3xFdYWd1BnY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "6132b0f6e344ce2fe34fc051b72fb46e34f668e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "poetry2nix": { + "inputs": { + "flake-utils": "flake-utils", + "nix-github-actions": "nix-github-actions", + "nixpkgs": [ + "devenv", + "cachix", + "devenv", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1692876271, + "narHash": "sha256-IXfZEkI0Mal5y1jr6IRWMqK8GW2/f28xJenZIPQqkY0=", + "owner": "nix-community", + "repo": "poetry2nix", + "rev": "d5006be9c2c2417dafb2e2e5034d83fabd207ee3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "poetry2nix", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "flake-utils": "flake-utils_2", + "gitignore": "gitignore", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1713775815, + "narHash": "sha256-Wu9cdYTnGQQwtT20QQMg7jzkANKQjwBD9iccfGKkfls=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "2ac4dcbf55ed43f3be0bae15e181f08a57af24a4", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs_3" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/vendor/github.com/sagikazarmark/locafero/flake.nix b/vendor/github.com/sagikazarmark/locafero/flake.nix new file mode 100644 index 0000000000..cddf1d400b --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/flake.nix @@ -0,0 +1,47 @@ +{ + description = "Finder library for Afero"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + flake-parts.url = "github:hercules-ci/flake-parts"; + devenv.url = "github:cachix/devenv"; + }; + + outputs = inputs@{ flake-parts, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ + inputs.devenv.flakeModule + ]; + + systems = [ "x86_64-linux" "aarch64-darwin" ]; + + perSystem = { config, self', inputs', pkgs, system, ... }: rec { + devenv.shells = { + default = { + languages = { + go.enable = true; + }; + + packages = with pkgs; [ + just + + golangci-lint + ]; + + # https://github.com/cachix/devenv/issues/528#issuecomment-1556108767 + containers = pkgs.lib.mkForce { }; + }; + + ci = devenv.shells.default; + + ci_1_21 = { + imports = [ devenv.shells.ci ]; + + languages = { + go.package = pkgs.go_1_21; + }; + }; + }; + }; + }; +} diff --git a/vendor/github.com/sagikazarmark/locafero/glob.go b/vendor/github.com/sagikazarmark/locafero/glob.go new file mode 100644 index 0000000000..00f833e99c --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/glob.go @@ -0,0 +1,5 @@ +//go:build !windows + +package locafero + +const globMatch = "*?[]\\^" diff --git a/vendor/github.com/sagikazarmark/locafero/glob_windows.go b/vendor/github.com/sagikazarmark/locafero/glob_windows.go new file mode 100644 index 0000000000..7aec2b247d --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/glob_windows.go @@ -0,0 +1,8 @@ +//go:build windows + +package locafero + +// See [filepath.Match]: +// +// On Windows, escaping is disabled. Instead, '\\' is treated as path separator. +const globMatch = "*?[]^" diff --git a/vendor/github.com/sagikazarmark/locafero/helpers.go b/vendor/github.com/sagikazarmark/locafero/helpers.go new file mode 100644 index 0000000000..05b434481f --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/helpers.go @@ -0,0 +1,41 @@ +package locafero + +import "fmt" + +// NameWithExtensions creates a list of names from a base name and a list of extensions. +// +// TODO: find a better name for this function. +func NameWithExtensions(baseName string, extensions ...string) []string { + var names []string + + if baseName == "" { + return names + } + + for _, ext := range extensions { + if ext == "" { + continue + } + + names = append(names, fmt.Sprintf("%s.%s", baseName, ext)) + } + + return names +} + +// NameWithOptionalExtensions creates a list of names from a base name and a list of extensions, +// plus it adds the base name (without any extensions) to the end of the list. +// +// TODO: find a better name for this function. +func NameWithOptionalExtensions(baseName string, extensions ...string) []string { + var names []string + + if baseName == "" { + return names + } + + names = NameWithExtensions(baseName, extensions...) + names = append(names, baseName) + + return names +} diff --git a/vendor/github.com/sagikazarmark/locafero/justfile b/vendor/github.com/sagikazarmark/locafero/justfile new file mode 100644 index 0000000000..00a88850cc --- /dev/null +++ b/vendor/github.com/sagikazarmark/locafero/justfile @@ -0,0 +1,11 @@ +default: + just --list + +test: + go test -race -v ./... + +lint: + golangci-lint run + +fmt: + golangci-lint run --fix diff --git a/vendor/github.com/sagikazarmark/slog-shim/.editorconfig b/vendor/github.com/sagikazarmark/slog-shim/.editorconfig new file mode 100644 index 0000000000..1fb0e1bec6 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.nix] +indent_size = 2 + +[{Makefile,*.mk}] +indent_style = tab + +[Taskfile.yaml] +indent_size = 2 diff --git a/vendor/github.com/sagikazarmark/slog-shim/.envrc b/vendor/github.com/sagikazarmark/slog-shim/.envrc new file mode 100644 index 0000000000..3ce7171a3c --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/.envrc @@ -0,0 +1,4 @@ +if ! has nix_direnv_version || ! nix_direnv_version 2.3.0; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.3.0/direnvrc" "sha256-Dmd+j63L84wuzgyjITIfSxSD57Tx7v51DMxVZOsiUD8=" +fi +use flake . --impure diff --git a/vendor/github.com/sagikazarmark/slog-shim/.gitignore b/vendor/github.com/sagikazarmark/slog-shim/.gitignore new file mode 100644 index 0000000000..dc6d8b5875 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/.gitignore @@ -0,0 +1,4 @@ +/.devenv/ +/.direnv/ +/.task/ +/build/ diff --git a/vendor/github.com/sagikazarmark/slog-shim/LICENSE b/vendor/github.com/sagikazarmark/slog-shim/LICENSE new file mode 100644 index 0000000000..6a66aea5ea --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/sagikazarmark/slog-shim/README.md b/vendor/github.com/sagikazarmark/slog-shim/README.md new file mode 100644 index 0000000000..1f5be85e10 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/README.md @@ -0,0 +1,81 @@ +# [slog](https://pkg.go.dev/log/slog) shim + +[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/sagikazarmark/slog-shim/ci.yaml?style=flat-square)](https://github.com/sagikazarmark/slog-shim/actions/workflows/ci.yaml) +[![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/mod/github.com/sagikazarmark/slog-shim) +![Go Version](https://img.shields.io/badge/go%20version-%3E=1.20-61CFDD.svg?style=flat-square) +[![built with nix](https://img.shields.io/badge/builtwith-nix-7d81f7?style=flat-square)](https://builtwithnix.org) + +Go 1.21 introduced a [new structured logging package](https://golang.org/doc/go1.21#slog), `log/slog`, to the standard library. +Although it's been eagerly anticipated by many, widespread adoption isn't expected to occur immediately, +especially since updating to Go 1.21 is a decision that most libraries won't make overnight. + +Before this package was added to the standard library, there was an _experimental_ version available at [golang.org/x/exp/slog](https://pkg.go.dev/golang.org/x/exp/slog). +While it's generally advised against using experimental packages in production, +this one served as a sort of backport package for the last few years, +incorporating new features before they were added to the standard library (like `slices`, `maps` or `errors`). + +This package serves as a bridge, helping libraries integrate slog in a backward-compatible way without having to immediately update their Go version requirement to 1.21. On Go 1.21 (and above), it acts as a drop-in replacement for `log/slog`, while below 1.21 it falls back to `golang.org/x/exp/slog`. + +**How does it achieve backwards compatibility?** + +Although there's no consensus on whether dropping support for older Go versions is considered backward compatible, a majority seems to believe it is. +(I don't have scientific proof for this, but it's based on conversations with various individuals across different channels.) + +This package adheres to that interpretation of backward compatibility. On Go 1.21, the shim uses type aliases to offer the same API as `slog/log`. +Once a library upgrades its version requirement to Go 1.21, it should be able to discard this shim and use `log/slog` directly. + +For older Go versions, the library might become unstable after removing the shim. +However, since those older versions are no longer supported, the promise of backward compatibility remains intact. + +## Installation + +```shell +go get github.com/sagikazarmark/slog-shim +``` + +## Usage + +Import this package into your library and use it in your public API: + +```go +package mylib + +import slog "github.com/sagikazarmark/slog-shim" + +func New(logger *slog.Logger) MyLib { + // ... +} +``` + +When using the library, clients can either use `log/slog` (when on Go 1.21) or `golang.org/x/exp/slog` (below Go 1.21): + +```go +package main + +import "log/slog" + +// OR + +import "golang.org/x/exp/slog" + +mylib.New(slog.Default()) +``` + +**Make sure consumers are aware that your API behaves differently on different Go versions.** + +Once you bump your Go version requirement to Go 1.21, you can drop the shim entirely from your code: + +```diff +package mylib + +- import slog "github.com/sagikazarmark/slog-shim" ++ import "log/slog" + +func New(logger *slog.Logger) MyLib { + // ... +} +``` + +## License + +The project is licensed under a [BSD-style license](LICENSE). diff --git a/vendor/github.com/sagikazarmark/slog-shim/attr.go b/vendor/github.com/sagikazarmark/slog-shim/attr.go new file mode 100644 index 0000000000..89608bf3a7 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/attr.go @@ -0,0 +1,74 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.21 + +package slog + +import ( + "log/slog" + "time" +) + +// An Attr is a key-value pair. +type Attr = slog.Attr + +// String returns an Attr for a string value. +func String(key, value string) Attr { + return slog.String(key, value) +} + +// Int64 returns an Attr for an int64. +func Int64(key string, value int64) Attr { + return slog.Int64(key, value) +} + +// Int converts an int to an int64 and returns +// an Attr with that value. +func Int(key string, value int) Attr { + return slog.Int(key, value) +} + +// Uint64 returns an Attr for a uint64. +func Uint64(key string, v uint64) Attr { + return slog.Uint64(key, v) +} + +// Float64 returns an Attr for a floating-point number. +func Float64(key string, v float64) Attr { + return slog.Float64(key, v) +} + +// Bool returns an Attr for a bool. +func Bool(key string, v bool) Attr { + return slog.Bool(key, v) +} + +// Time returns an Attr for a time.Time. +// It discards the monotonic portion. +func Time(key string, v time.Time) Attr { + return slog.Time(key, v) +} + +// Duration returns an Attr for a time.Duration. +func Duration(key string, v time.Duration) Attr { + return slog.Duration(key, v) +} + +// Group returns an Attr for a Group Value. +// The first argument is the key; the remaining arguments +// are converted to Attrs as in [Logger.Log]. +// +// Use Group to collect several key-value pairs under a single +// key on a log line, or as the result of LogValue +// in order to log a single value as multiple Attrs. +func Group(key string, args ...any) Attr { + return slog.Group(key, args...) +} + +// Any returns an Attr for the supplied value. +// See [Value.AnyValue] for how values are treated. +func Any(key string, value any) Attr { + return slog.Any(key, value) +} diff --git a/vendor/github.com/sagikazarmark/slog-shim/attr_120.go b/vendor/github.com/sagikazarmark/slog-shim/attr_120.go new file mode 100644 index 0000000000..b664813331 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/attr_120.go @@ -0,0 +1,75 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.21 + +package slog + +import ( + "time" + + "golang.org/x/exp/slog" +) + +// An Attr is a key-value pair. +type Attr = slog.Attr + +// String returns an Attr for a string value. +func String(key, value string) Attr { + return slog.String(key, value) +} + +// Int64 returns an Attr for an int64. +func Int64(key string, value int64) Attr { + return slog.Int64(key, value) +} + +// Int converts an int to an int64 and returns +// an Attr with that value. +func Int(key string, value int) Attr { + return slog.Int(key, value) +} + +// Uint64 returns an Attr for a uint64. +func Uint64(key string, v uint64) Attr { + return slog.Uint64(key, v) +} + +// Float64 returns an Attr for a floating-point number. +func Float64(key string, v float64) Attr { + return slog.Float64(key, v) +} + +// Bool returns an Attr for a bool. +func Bool(key string, v bool) Attr { + return slog.Bool(key, v) +} + +// Time returns an Attr for a time.Time. +// It discards the monotonic portion. +func Time(key string, v time.Time) Attr { + return slog.Time(key, v) +} + +// Duration returns an Attr for a time.Duration. +func Duration(key string, v time.Duration) Attr { + return slog.Duration(key, v) +} + +// Group returns an Attr for a Group Value. +// The first argument is the key; the remaining arguments +// are converted to Attrs as in [Logger.Log]. +// +// Use Group to collect several key-value pairs under a single +// key on a log line, or as the result of LogValue +// in order to log a single value as multiple Attrs. +func Group(key string, args ...any) Attr { + return slog.Group(key, args...) +} + +// Any returns an Attr for the supplied value. +// See [Value.AnyValue] for how values are treated. +func Any(key string, value any) Attr { + return slog.Any(key, value) +} diff --git a/vendor/github.com/sagikazarmark/slog-shim/flake.lock b/vendor/github.com/sagikazarmark/slog-shim/flake.lock new file mode 100644 index 0000000000..7e8898e9e3 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/flake.lock @@ -0,0 +1,273 @@ +{ + "nodes": { + "devenv": { + "inputs": { + "flake-compat": "flake-compat", + "nix": "nix", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1694097209, + "narHash": "sha256-gQmBjjxeSyySjbh0yQVBKApo2KWIFqqbRUvG+Fa+QpM=", + "owner": "cachix", + "repo": "devenv", + "rev": "7a8e6a91510efe89d8dcb8e43233f93e86f6b189", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1693611461, + "narHash": "sha256-aPODl8vAgGQ0ZYFIRisxYG5MOGSkIczvu2Cd8Gb9+1Y=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "7f53fdb7bdc5bb237da7fefef12d099e4fd611ca", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1685518550, + "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "devenv", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "lowdown-src": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "nix": { + "inputs": { + "lowdown-src": "lowdown-src", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression" + }, + "locked": { + "lastModified": 1676545802, + "narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=", + "owner": "domenkozar", + "repo": "nix", + "rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "relaxed-flakes", + "repo": "nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1678875422, + "narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1693471703, + "narHash": "sha256-0l03ZBL8P1P6z8MaSDS/MvuU8E75rVxe5eE1N6gxeTo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3e52e76b70d5508f3cec70b882a29199f4d1ee85", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-regression": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1685801374, + "narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c37ca420157f4abc31e26f436c1145f8951ff373", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1694345580, + "narHash": "sha256-BbG0NUxQTz1dN/Y87yPWZc/0Kp/coJ0vM3+7sNa5kUM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f002de6834fdde9c864f33c1ec51da7df19cd832", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "master", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "flake-utils": "flake-utils", + "gitignore": "gitignore", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1688056373, + "narHash": "sha256-2+SDlNRTKsgo3LBRiMUcoEUb6sDViRNQhzJquZ4koOI=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "5843cf069272d92b60c3ed9e55b7a8989c01d4c7", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs_2" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/vendor/github.com/sagikazarmark/slog-shim/flake.nix b/vendor/github.com/sagikazarmark/slog-shim/flake.nix new file mode 100644 index 0000000000..7239bbc2ec --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/flake.nix @@ -0,0 +1,57 @@ +{ + inputs = { + # nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + nixpkgs.url = "github:NixOS/nixpkgs/master"; + flake-parts.url = "github:hercules-ci/flake-parts"; + devenv.url = "github:cachix/devenv"; + }; + + outputs = inputs@{ flake-parts, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ + inputs.devenv.flakeModule + ]; + + systems = [ "x86_64-linux" "x86_64-darwin" "aarch64-darwin" ]; + + perSystem = { config, self', inputs', pkgs, system, ... }: rec { + devenv.shells = { + default = { + languages = { + go.enable = true; + go.package = pkgs.lib.mkDefault pkgs.go_1_21; + }; + + # https://github.com/cachix/devenv/issues/528#issuecomment-1556108767 + containers = pkgs.lib.mkForce { }; + }; + + ci = devenv.shells.default; + + ci_1_19 = { + imports = [ devenv.shells.ci ]; + + languages = { + go.package = pkgs.go_1_19; + }; + }; + + ci_1_20 = { + imports = [ devenv.shells.ci ]; + + languages = { + go.package = pkgs.go_1_20; + }; + }; + + ci_1_21 = { + imports = [ devenv.shells.ci ]; + + languages = { + go.package = pkgs.go_1_21; + }; + }; + }; + }; + }; +} diff --git a/vendor/github.com/sagikazarmark/slog-shim/handler.go b/vendor/github.com/sagikazarmark/slog-shim/handler.go new file mode 100644 index 0000000000..f55556ae18 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/handler.go @@ -0,0 +1,45 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.21 + +package slog + +import ( + "log/slog" +) + +// A Handler handles log records produced by a Logger.. +// +// A typical handler may print log records to standard error, +// or write them to a file or database, or perhaps augment them +// with additional attributes and pass them on to another handler. +// +// Any of the Handler's methods may be called concurrently with itself +// or with other methods. It is the responsibility of the Handler to +// manage this concurrency. +// +// Users of the slog package should not invoke Handler methods directly. +// They should use the methods of [Logger] instead. +type Handler = slog.Handler + +// HandlerOptions are options for a TextHandler or JSONHandler. +// A zero HandlerOptions consists entirely of default values. +type HandlerOptions = slog.HandlerOptions + +// Keys for "built-in" attributes. +const ( + // TimeKey is the key used by the built-in handlers for the time + // when the log method is called. The associated Value is a [time.Time]. + TimeKey = slog.TimeKey + // LevelKey is the key used by the built-in handlers for the level + // of the log call. The associated value is a [Level]. + LevelKey = slog.LevelKey + // MessageKey is the key used by the built-in handlers for the + // message of the log call. The associated value is a string. + MessageKey = slog.MessageKey + // SourceKey is the key used by the built-in handlers for the source file + // and line of the log call. The associated value is a string. + SourceKey = slog.SourceKey +) diff --git a/vendor/github.com/sagikazarmark/slog-shim/handler_120.go b/vendor/github.com/sagikazarmark/slog-shim/handler_120.go new file mode 100644 index 0000000000..670057573f --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/handler_120.go @@ -0,0 +1,45 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.21 + +package slog + +import ( + "golang.org/x/exp/slog" +) + +// A Handler handles log records produced by a Logger.. +// +// A typical handler may print log records to standard error, +// or write them to a file or database, or perhaps augment them +// with additional attributes and pass them on to another handler. +// +// Any of the Handler's methods may be called concurrently with itself +// or with other methods. It is the responsibility of the Handler to +// manage this concurrency. +// +// Users of the slog package should not invoke Handler methods directly. +// They should use the methods of [Logger] instead. +type Handler = slog.Handler + +// HandlerOptions are options for a TextHandler or JSONHandler. +// A zero HandlerOptions consists entirely of default values. +type HandlerOptions = slog.HandlerOptions + +// Keys for "built-in" attributes. +const ( + // TimeKey is the key used by the built-in handlers for the time + // when the log method is called. The associated Value is a [time.Time]. + TimeKey = slog.TimeKey + // LevelKey is the key used by the built-in handlers for the level + // of the log call. The associated value is a [Level]. + LevelKey = slog.LevelKey + // MessageKey is the key used by the built-in handlers for the + // message of the log call. The associated value is a string. + MessageKey = slog.MessageKey + // SourceKey is the key used by the built-in handlers for the source file + // and line of the log call. The associated value is a string. + SourceKey = slog.SourceKey +) diff --git a/vendor/github.com/sagikazarmark/slog-shim/json_handler.go b/vendor/github.com/sagikazarmark/slog-shim/json_handler.go new file mode 100644 index 0000000000..7c22bd81e4 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/json_handler.go @@ -0,0 +1,23 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.21 + +package slog + +import ( + "io" + "log/slog" +) + +// JSONHandler is a Handler that writes Records to an io.Writer as +// line-delimited JSON objects. +type JSONHandler = slog.JSONHandler + +// NewJSONHandler creates a JSONHandler that writes to w, +// using the given options. +// If opts is nil, the default options are used. +func NewJSONHandler(w io.Writer, opts *HandlerOptions) *JSONHandler { + return slog.NewJSONHandler(w, opts) +} diff --git a/vendor/github.com/sagikazarmark/slog-shim/json_handler_120.go b/vendor/github.com/sagikazarmark/slog-shim/json_handler_120.go new file mode 100644 index 0000000000..7b14f10ba9 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/json_handler_120.go @@ -0,0 +1,24 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.21 + +package slog + +import ( + "io" + + "golang.org/x/exp/slog" +) + +// JSONHandler is a Handler that writes Records to an io.Writer as +// line-delimited JSON objects. +type JSONHandler = slog.JSONHandler + +// NewJSONHandler creates a JSONHandler that writes to w, +// using the given options. +// If opts is nil, the default options are used. +func NewJSONHandler(w io.Writer, opts *HandlerOptions) *JSONHandler { + return slog.NewJSONHandler(w, opts) +} diff --git a/vendor/github.com/sagikazarmark/slog-shim/level.go b/vendor/github.com/sagikazarmark/slog-shim/level.go new file mode 100644 index 0000000000..07288cf891 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/level.go @@ -0,0 +1,61 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.21 + +package slog + +import ( + "log/slog" +) + +// A Level is the importance or severity of a log event. +// The higher the level, the more important or severe the event. +type Level = slog.Level + +// Level numbers are inherently arbitrary, +// but we picked them to satisfy three constraints. +// Any system can map them to another numbering scheme if it wishes. +// +// First, we wanted the default level to be Info, Since Levels are ints, Info is +// the default value for int, zero. +// +// Second, we wanted to make it easy to use levels to specify logger verbosity. +// Since a larger level means a more severe event, a logger that accepts events +// with smaller (or more negative) level means a more verbose logger. Logger +// verbosity is thus the negation of event severity, and the default verbosity +// of 0 accepts all events at least as severe as INFO. +// +// Third, we wanted some room between levels to accommodate schemes with named +// levels between ours. For example, Google Cloud Logging defines a Notice level +// between Info and Warn. Since there are only a few of these intermediate +// levels, the gap between the numbers need not be large. Our gap of 4 matches +// OpenTelemetry's mapping. Subtracting 9 from an OpenTelemetry level in the +// DEBUG, INFO, WARN and ERROR ranges converts it to the corresponding slog +// Level range. OpenTelemetry also has the names TRACE and FATAL, which slog +// does not. But those OpenTelemetry levels can still be represented as slog +// Levels by using the appropriate integers. +// +// Names for common levels. +const ( + LevelDebug Level = slog.LevelDebug + LevelInfo Level = slog.LevelInfo + LevelWarn Level = slog.LevelWarn + LevelError Level = slog.LevelError +) + +// A LevelVar is a Level variable, to allow a Handler level to change +// dynamically. +// It implements Leveler as well as a Set method, +// and it is safe for use by multiple goroutines. +// The zero LevelVar corresponds to LevelInfo. +type LevelVar = slog.LevelVar + +// A Leveler provides a Level value. +// +// As Level itself implements Leveler, clients typically supply +// a Level value wherever a Leveler is needed, such as in HandlerOptions. +// Clients who need to vary the level dynamically can provide a more complex +// Leveler implementation such as *LevelVar. +type Leveler = slog.Leveler diff --git a/vendor/github.com/sagikazarmark/slog-shim/level_120.go b/vendor/github.com/sagikazarmark/slog-shim/level_120.go new file mode 100644 index 0000000000..d3feb94203 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/level_120.go @@ -0,0 +1,61 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.21 + +package slog + +import ( + "golang.org/x/exp/slog" +) + +// A Level is the importance or severity of a log event. +// The higher the level, the more important or severe the event. +type Level = slog.Level + +// Level numbers are inherently arbitrary, +// but we picked them to satisfy three constraints. +// Any system can map them to another numbering scheme if it wishes. +// +// First, we wanted the default level to be Info, Since Levels are ints, Info is +// the default value for int, zero. +// +// Second, we wanted to make it easy to use levels to specify logger verbosity. +// Since a larger level means a more severe event, a logger that accepts events +// with smaller (or more negative) level means a more verbose logger. Logger +// verbosity is thus the negation of event severity, and the default verbosity +// of 0 accepts all events at least as severe as INFO. +// +// Third, we wanted some room between levels to accommodate schemes with named +// levels between ours. For example, Google Cloud Logging defines a Notice level +// between Info and Warn. Since there are only a few of these intermediate +// levels, the gap between the numbers need not be large. Our gap of 4 matches +// OpenTelemetry's mapping. Subtracting 9 from an OpenTelemetry level in the +// DEBUG, INFO, WARN and ERROR ranges converts it to the corresponding slog +// Level range. OpenTelemetry also has the names TRACE and FATAL, which slog +// does not. But those OpenTelemetry levels can still be represented as slog +// Levels by using the appropriate integers. +// +// Names for common levels. +const ( + LevelDebug Level = slog.LevelDebug + LevelInfo Level = slog.LevelInfo + LevelWarn Level = slog.LevelWarn + LevelError Level = slog.LevelError +) + +// A LevelVar is a Level variable, to allow a Handler level to change +// dynamically. +// It implements Leveler as well as a Set method, +// and it is safe for use by multiple goroutines. +// The zero LevelVar corresponds to LevelInfo. +type LevelVar = slog.LevelVar + +// A Leveler provides a Level value. +// +// As Level itself implements Leveler, clients typically supply +// a Level value wherever a Leveler is needed, such as in HandlerOptions. +// Clients who need to vary the level dynamically can provide a more complex +// Leveler implementation such as *LevelVar. +type Leveler = slog.Leveler diff --git a/vendor/github.com/sagikazarmark/slog-shim/logger.go b/vendor/github.com/sagikazarmark/slog-shim/logger.go new file mode 100644 index 0000000000..e80036bec5 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/logger.go @@ -0,0 +1,98 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.21 + +package slog + +import ( + "context" + "log" + "log/slog" +) + +// Default returns the default Logger. +func Default() *Logger { return slog.Default() } + +// SetDefault makes l the default Logger. +// After this call, output from the log package's default Logger +// (as with [log.Print], etc.) will be logged at LevelInfo using l's Handler. +func SetDefault(l *Logger) { + slog.SetDefault(l) +} + +// A Logger records structured information about each call to its +// Log, Debug, Info, Warn, and Error methods. +// For each call, it creates a Record and passes it to a Handler. +// +// To create a new Logger, call [New] or a Logger method +// that begins "With". +type Logger = slog.Logger + +// New creates a new Logger with the given non-nil Handler. +func New(h Handler) *Logger { + return slog.New(h) +} + +// With calls Logger.With on the default logger. +func With(args ...any) *Logger { + return slog.With(args...) +} + +// NewLogLogger returns a new log.Logger such that each call to its Output method +// dispatches a Record to the specified handler. The logger acts as a bridge from +// the older log API to newer structured logging handlers. +func NewLogLogger(h Handler, level Level) *log.Logger { + return slog.NewLogLogger(h, level) +} + +// Debug calls Logger.Debug on the default logger. +func Debug(msg string, args ...any) { + slog.Debug(msg, args...) +} + +// DebugContext calls Logger.DebugContext on the default logger. +func DebugContext(ctx context.Context, msg string, args ...any) { + slog.DebugContext(ctx, msg, args...) +} + +// Info calls Logger.Info on the default logger. +func Info(msg string, args ...any) { + slog.Info(msg, args...) +} + +// InfoContext calls Logger.InfoContext on the default logger. +func InfoContext(ctx context.Context, msg string, args ...any) { + slog.InfoContext(ctx, msg, args...) +} + +// Warn calls Logger.Warn on the default logger. +func Warn(msg string, args ...any) { + slog.Warn(msg, args...) +} + +// WarnContext calls Logger.WarnContext on the default logger. +func WarnContext(ctx context.Context, msg string, args ...any) { + slog.WarnContext(ctx, msg, args...) +} + +// Error calls Logger.Error on the default logger. +func Error(msg string, args ...any) { + slog.Error(msg, args...) +} + +// ErrorContext calls Logger.ErrorContext on the default logger. +func ErrorContext(ctx context.Context, msg string, args ...any) { + slog.ErrorContext(ctx, msg, args...) +} + +// Log calls Logger.Log on the default logger. +func Log(ctx context.Context, level Level, msg string, args ...any) { + slog.Log(ctx, level, msg, args...) +} + +// LogAttrs calls Logger.LogAttrs on the default logger. +func LogAttrs(ctx context.Context, level Level, msg string, attrs ...Attr) { + slog.LogAttrs(ctx, level, msg, attrs...) +} diff --git a/vendor/github.com/sagikazarmark/slog-shim/logger_120.go b/vendor/github.com/sagikazarmark/slog-shim/logger_120.go new file mode 100644 index 0000000000..97ebdd5e1c --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/logger_120.go @@ -0,0 +1,99 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.21 + +package slog + +import ( + "context" + "log" + + "golang.org/x/exp/slog" +) + +// Default returns the default Logger. +func Default() *Logger { return slog.Default() } + +// SetDefault makes l the default Logger. +// After this call, output from the log package's default Logger +// (as with [log.Print], etc.) will be logged at LevelInfo using l's Handler. +func SetDefault(l *Logger) { + slog.SetDefault(l) +} + +// A Logger records structured information about each call to its +// Log, Debug, Info, Warn, and Error methods. +// For each call, it creates a Record and passes it to a Handler. +// +// To create a new Logger, call [New] or a Logger method +// that begins "With". +type Logger = slog.Logger + +// New creates a new Logger with the given non-nil Handler. +func New(h Handler) *Logger { + return slog.New(h) +} + +// With calls Logger.With on the default logger. +func With(args ...any) *Logger { + return slog.With(args...) +} + +// NewLogLogger returns a new log.Logger such that each call to its Output method +// dispatches a Record to the specified handler. The logger acts as a bridge from +// the older log API to newer structured logging handlers. +func NewLogLogger(h Handler, level Level) *log.Logger { + return slog.NewLogLogger(h, level) +} + +// Debug calls Logger.Debug on the default logger. +func Debug(msg string, args ...any) { + slog.Debug(msg, args...) +} + +// DebugContext calls Logger.DebugContext on the default logger. +func DebugContext(ctx context.Context, msg string, args ...any) { + slog.DebugContext(ctx, msg, args...) +} + +// Info calls Logger.Info on the default logger. +func Info(msg string, args ...any) { + slog.Info(msg, args...) +} + +// InfoContext calls Logger.InfoContext on the default logger. +func InfoContext(ctx context.Context, msg string, args ...any) { + slog.InfoContext(ctx, msg, args...) +} + +// Warn calls Logger.Warn on the default logger. +func Warn(msg string, args ...any) { + slog.Warn(msg, args...) +} + +// WarnContext calls Logger.WarnContext on the default logger. +func WarnContext(ctx context.Context, msg string, args ...any) { + slog.WarnContext(ctx, msg, args...) +} + +// Error calls Logger.Error on the default logger. +func Error(msg string, args ...any) { + slog.Error(msg, args...) +} + +// ErrorContext calls Logger.ErrorContext on the default logger. +func ErrorContext(ctx context.Context, msg string, args ...any) { + slog.ErrorContext(ctx, msg, args...) +} + +// Log calls Logger.Log on the default logger. +func Log(ctx context.Context, level Level, msg string, args ...any) { + slog.Log(ctx, level, msg, args...) +} + +// LogAttrs calls Logger.LogAttrs on the default logger. +func LogAttrs(ctx context.Context, level Level, msg string, attrs ...Attr) { + slog.LogAttrs(ctx, level, msg, attrs...) +} diff --git a/vendor/github.com/sagikazarmark/slog-shim/record.go b/vendor/github.com/sagikazarmark/slog-shim/record.go new file mode 100644 index 0000000000..85ad1f7842 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/record.go @@ -0,0 +1,31 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.21 + +package slog + +import ( + "log/slog" + "time" +) + +// A Record holds information about a log event. +// Copies of a Record share state. +// Do not modify a Record after handing out a copy to it. +// Call [NewRecord] to create a new Record. +// Use [Record.Clone] to create a copy with no shared state. +type Record = slog.Record + +// NewRecord creates a Record from the given arguments. +// Use [Record.AddAttrs] to add attributes to the Record. +// +// NewRecord is intended for logging APIs that want to support a [Handler] as +// a backend. +func NewRecord(t time.Time, level Level, msg string, pc uintptr) Record { + return slog.NewRecord(t, level, msg, pc) +} + +// Source describes the location of a line of source code. +type Source = slog.Source diff --git a/vendor/github.com/sagikazarmark/slog-shim/record_120.go b/vendor/github.com/sagikazarmark/slog-shim/record_120.go new file mode 100644 index 0000000000..c2eaf4e796 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/record_120.go @@ -0,0 +1,32 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.21 + +package slog + +import ( + "time" + + "golang.org/x/exp/slog" +) + +// A Record holds information about a log event. +// Copies of a Record share state. +// Do not modify a Record after handing out a copy to it. +// Call [NewRecord] to create a new Record. +// Use [Record.Clone] to create a copy with no shared state. +type Record = slog.Record + +// NewRecord creates a Record from the given arguments. +// Use [Record.AddAttrs] to add attributes to the Record. +// +// NewRecord is intended for logging APIs that want to support a [Handler] as +// a backend. +func NewRecord(t time.Time, level Level, msg string, pc uintptr) Record { + return slog.NewRecord(t, level, msg, pc) +} + +// Source describes the location of a line of source code. +type Source = slog.Source diff --git a/vendor/github.com/sagikazarmark/slog-shim/text_handler.go b/vendor/github.com/sagikazarmark/slog-shim/text_handler.go new file mode 100644 index 0000000000..45f6cfcba5 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/text_handler.go @@ -0,0 +1,23 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.21 + +package slog + +import ( + "io" + "log/slog" +) + +// TextHandler is a Handler that writes Records to an io.Writer as a +// sequence of key=value pairs separated by spaces and followed by a newline. +type TextHandler = slog.TextHandler + +// NewTextHandler creates a TextHandler that writes to w, +// using the given options. +// If opts is nil, the default options are used. +func NewTextHandler(w io.Writer, opts *HandlerOptions) *TextHandler { + return slog.NewTextHandler(w, opts) +} diff --git a/vendor/github.com/sagikazarmark/slog-shim/text_handler_120.go b/vendor/github.com/sagikazarmark/slog-shim/text_handler_120.go new file mode 100644 index 0000000000..a69d63ccea --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/text_handler_120.go @@ -0,0 +1,24 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.21 + +package slog + +import ( + "io" + + "golang.org/x/exp/slog" +) + +// TextHandler is a Handler that writes Records to an io.Writer as a +// sequence of key=value pairs separated by spaces and followed by a newline. +type TextHandler = slog.TextHandler + +// NewTextHandler creates a TextHandler that writes to w, +// using the given options. +// If opts is nil, the default options are used. +func NewTextHandler(w io.Writer, opts *HandlerOptions) *TextHandler { + return slog.NewTextHandler(w, opts) +} diff --git a/vendor/github.com/sagikazarmark/slog-shim/value.go b/vendor/github.com/sagikazarmark/slog-shim/value.go new file mode 100644 index 0000000000..61173eb946 --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/value.go @@ -0,0 +1,109 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.21 + +package slog + +import ( + "log/slog" + "time" +) + +// A Value can represent any Go value, but unlike type any, +// it can represent most small values without an allocation. +// The zero Value corresponds to nil. +type Value = slog.Value + +// Kind is the kind of a Value. +type Kind = slog.Kind + +// The following list is sorted alphabetically, but it's also important that +// KindAny is 0 so that a zero Value represents nil. +const ( + KindAny = slog.KindAny + KindBool = slog.KindBool + KindDuration = slog.KindDuration + KindFloat64 = slog.KindFloat64 + KindInt64 = slog.KindInt64 + KindString = slog.KindString + KindTime = slog.KindTime + KindUint64 = slog.KindUint64 + KindGroup = slog.KindGroup + KindLogValuer = slog.KindLogValuer +) + +//////////////// Constructors + +// StringValue returns a new Value for a string. +func StringValue(value string) Value { + return slog.StringValue(value) +} + +// IntValue returns a Value for an int. +func IntValue(v int) Value { + return slog.IntValue(v) +} + +// Int64Value returns a Value for an int64. +func Int64Value(v int64) Value { + return slog.Int64Value(v) +} + +// Uint64Value returns a Value for a uint64. +func Uint64Value(v uint64) Value { + return slog.Uint64Value(v) +} + +// Float64Value returns a Value for a floating-point number. +func Float64Value(v float64) Value { + return slog.Float64Value(v) +} + +// BoolValue returns a Value for a bool. +func BoolValue(v bool) Value { + return slog.BoolValue(v) +} + +// TimeValue returns a Value for a time.Time. +// It discards the monotonic portion. +func TimeValue(v time.Time) Value { + return slog.TimeValue(v) +} + +// DurationValue returns a Value for a time.Duration. +func DurationValue(v time.Duration) Value { + return slog.DurationValue(v) +} + +// GroupValue returns a new Value for a list of Attrs. +// The caller must not subsequently mutate the argument slice. +func GroupValue(as ...Attr) Value { + return slog.GroupValue(as...) +} + +// AnyValue returns a Value for the supplied value. +// +// If the supplied value is of type Value, it is returned +// unmodified. +// +// Given a value of one of Go's predeclared string, bool, or +// (non-complex) numeric types, AnyValue returns a Value of kind +// String, Bool, Uint64, Int64, or Float64. The width of the +// original numeric type is not preserved. +// +// Given a time.Time or time.Duration value, AnyValue returns a Value of kind +// KindTime or KindDuration. The monotonic time is not preserved. +// +// For nil, or values of all other types, including named types whose +// underlying type is numeric, AnyValue returns a value of kind KindAny. +func AnyValue(v any) Value { + return slog.AnyValue(v) +} + +// A LogValuer is any Go value that can convert itself into a Value for logging. +// +// This mechanism may be used to defer expensive operations until they are +// needed, or to expand a single value into a sequence of components. +type LogValuer = slog.LogValuer diff --git a/vendor/github.com/sagikazarmark/slog-shim/value_120.go b/vendor/github.com/sagikazarmark/slog-shim/value_120.go new file mode 100644 index 0000000000..0f9f871eee --- /dev/null +++ b/vendor/github.com/sagikazarmark/slog-shim/value_120.go @@ -0,0 +1,110 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.21 + +package slog + +import ( + "time" + + "golang.org/x/exp/slog" +) + +// A Value can represent any Go value, but unlike type any, +// it can represent most small values without an allocation. +// The zero Value corresponds to nil. +type Value = slog.Value + +// Kind is the kind of a Value. +type Kind = slog.Kind + +// The following list is sorted alphabetically, but it's also important that +// KindAny is 0 so that a zero Value represents nil. +const ( + KindAny = slog.KindAny + KindBool = slog.KindBool + KindDuration = slog.KindDuration + KindFloat64 = slog.KindFloat64 + KindInt64 = slog.KindInt64 + KindString = slog.KindString + KindTime = slog.KindTime + KindUint64 = slog.KindUint64 + KindGroup = slog.KindGroup + KindLogValuer = slog.KindLogValuer +) + +//////////////// Constructors + +// StringValue returns a new Value for a string. +func StringValue(value string) Value { + return slog.StringValue(value) +} + +// IntValue returns a Value for an int. +func IntValue(v int) Value { + return slog.IntValue(v) +} + +// Int64Value returns a Value for an int64. +func Int64Value(v int64) Value { + return slog.Int64Value(v) +} + +// Uint64Value returns a Value for a uint64. +func Uint64Value(v uint64) Value { + return slog.Uint64Value(v) +} + +// Float64Value returns a Value for a floating-point number. +func Float64Value(v float64) Value { + return slog.Float64Value(v) +} + +// BoolValue returns a Value for a bool. +func BoolValue(v bool) Value { + return slog.BoolValue(v) +} + +// TimeValue returns a Value for a time.Time. +// It discards the monotonic portion. +func TimeValue(v time.Time) Value { + return slog.TimeValue(v) +} + +// DurationValue returns a Value for a time.Duration. +func DurationValue(v time.Duration) Value { + return slog.DurationValue(v) +} + +// GroupValue returns a new Value for a list of Attrs. +// The caller must not subsequently mutate the argument slice. +func GroupValue(as ...Attr) Value { + return slog.GroupValue(as...) +} + +// AnyValue returns a Value for the supplied value. +// +// If the supplied value is of type Value, it is returned +// unmodified. +// +// Given a value of one of Go's predeclared string, bool, or +// (non-complex) numeric types, AnyValue returns a Value of kind +// String, Bool, Uint64, Int64, or Float64. The width of the +// original numeric type is not preserved. +// +// Given a time.Time or time.Duration value, AnyValue returns a Value of kind +// KindTime or KindDuration. The monotonic time is not preserved. +// +// For nil, or values of all other types, including named types whose +// underlying type is numeric, AnyValue returns a value of kind KindAny. +func AnyValue(v any) Value { + return slog.AnyValue(v) +} + +// A LogValuer is any Go value that can convert itself into a Value for logging. +// +// This mechanism may be used to defer expensive operations until they are +// needed, or to expand a single value into a sequence of components. +type LogValuer = slog.LogValuer diff --git a/vendor/github.com/shopspring/decimal/.gitignore b/vendor/github.com/shopspring/decimal/.gitignore new file mode 100644 index 0000000000..ff36b987f0 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/.gitignore @@ -0,0 +1,9 @@ +.git +*.swp + +# IntelliJ +.idea/ +*.iml + +# VS code +*.code-workspace diff --git a/vendor/github.com/shopspring/decimal/CHANGELOG.md b/vendor/github.com/shopspring/decimal/CHANGELOG.md new file mode 100644 index 0000000000..432d0fd4ea --- /dev/null +++ b/vendor/github.com/shopspring/decimal/CHANGELOG.md @@ -0,0 +1,76 @@ +## Decimal v1.4.0 +#### BREAKING +- Drop support for Go version older than 1.10 [#361](https://github.com/shopspring/decimal/pull/361) + +#### FEATURES +- Add implementation of natural logarithm [#339](https://github.com/shopspring/decimal/pull/339) [#357](https://github.com/shopspring/decimal/pull/357) +- Add improved implementation of power operation [#358](https://github.com/shopspring/decimal/pull/358) +- Add Compare method which forwards calls to Cmp [#346](https://github.com/shopspring/decimal/pull/346) +- Add NewFromBigRat constructor [#288](https://github.com/shopspring/decimal/pull/288) +- Add NewFromUint64 constructor [#352](https://github.com/shopspring/decimal/pull/352) + +#### ENHANCEMENTS +- Migrate to Github Actions [#245](https://github.com/shopspring/decimal/pull/245) [#340](https://github.com/shopspring/decimal/pull/340) +- Fix examples for RoundDown, RoundFloor, RoundUp, and RoundCeil [#285](https://github.com/shopspring/decimal/pull/285) [#328](https://github.com/shopspring/decimal/pull/328) [#341](https://github.com/shopspring/decimal/pull/341) +- Use Godoc standard to mark deprecated Equals and StringScaled methods [#342](https://github.com/shopspring/decimal/pull/342) +- Removed unnecessary min function for RescalePair method [#265](https://github.com/shopspring/decimal/pull/265) +- Avoid reallocation of initial slice in MarshalBinary (GobEncode) [#355](https://github.com/shopspring/decimal/pull/355) +- Optimize NumDigits method [#301](https://github.com/shopspring/decimal/pull/301) [#356](https://github.com/shopspring/decimal/pull/356) +- Optimize BigInt method [#359](https://github.com/shopspring/decimal/pull/359) +- Support scanning uint64 [#131](https://github.com/shopspring/decimal/pull/131) [#364](https://github.com/shopspring/decimal/pull/364) +- Add docs section with alternative libraries [#363](https://github.com/shopspring/decimal/pull/363) + +#### BUGFIXES +- Fix incorrect calculation of decimal modulo [#258](https://github.com/shopspring/decimal/pull/258) [#317](https://github.com/shopspring/decimal/pull/317) +- Allocate new(big.Int) in Copy method to deeply clone it [#278](https://github.com/shopspring/decimal/pull/278) +- Fix overflow edge case in QuoRem method [#322](https://github.com/shopspring/decimal/pull/322) + +## Decimal v1.3.1 + +#### ENHANCEMENTS +- Reduce memory allocation in case of initialization from big.Int [#252](https://github.com/shopspring/decimal/pull/252) + +#### BUGFIXES +- Fix binary marshalling of decimal zero value [#253](https://github.com/shopspring/decimal/pull/253) + +## Decimal v1.3.0 + +#### FEATURES +- Add NewFromFormattedString initializer [#184](https://github.com/shopspring/decimal/pull/184) +- Add NewNullDecimal initializer [#234](https://github.com/shopspring/decimal/pull/234) +- Add implementation of natural exponent function (Taylor, Hull-Abraham) [#229](https://github.com/shopspring/decimal/pull/229) +- Add RoundUp, RoundDown, RoundCeil, RoundFloor methods [#196](https://github.com/shopspring/decimal/pull/196) [#202](https://github.com/shopspring/decimal/pull/202) [#220](https://github.com/shopspring/decimal/pull/220) +- Add XML support for NullDecimal [#192](https://github.com/shopspring/decimal/pull/192) +- Add IsInteger method [#179](https://github.com/shopspring/decimal/pull/179) +- Add Copy helper method [#123](https://github.com/shopspring/decimal/pull/123) +- Add InexactFloat64 helper method [#205](https://github.com/shopspring/decimal/pull/205) +- Add CoefficientInt64 helper method [#244](https://github.com/shopspring/decimal/pull/244) + +#### ENHANCEMENTS +- Performance optimization of NewFromString init method [#198](https://github.com/shopspring/decimal/pull/198) +- Performance optimization of Abs and Round methods [#240](https://github.com/shopspring/decimal/pull/240) +- Additional tests (CI) for ppc64le architecture [#188](https://github.com/shopspring/decimal/pull/188) + +#### BUGFIXES +- Fix rounding in FormatFloat fallback path (roundShortest method, fix taken from Go main repository) [#161](https://github.com/shopspring/decimal/pull/161) +- Add slice range checks to UnmarshalBinary method [#232](https://github.com/shopspring/decimal/pull/232) + +## Decimal v1.2.0 + +#### BREAKING +- Drop support for Go version older than 1.7 [#172](https://github.com/shopspring/decimal/pull/172) + +#### FEATURES +- Add NewFromInt and NewFromInt32 initializers [#72](https://github.com/shopspring/decimal/pull/72) +- Add support for Go modules [#157](https://github.com/shopspring/decimal/pull/157) +- Add BigInt, BigFloat helper methods [#171](https://github.com/shopspring/decimal/pull/171) + +#### ENHANCEMENTS +- Memory usage optimization [#160](https://github.com/shopspring/decimal/pull/160) +- Updated travis CI golang versions [#156](https://github.com/shopspring/decimal/pull/156) +- Update documentation [#173](https://github.com/shopspring/decimal/pull/173) +- Improve code quality [#174](https://github.com/shopspring/decimal/pull/174) + +#### BUGFIXES +- Revert remove insignificant digits [#159](https://github.com/shopspring/decimal/pull/159) +- Remove 15 interval for RoundCash [#166](https://github.com/shopspring/decimal/pull/166) diff --git a/vendor/github.com/shopspring/decimal/LICENSE b/vendor/github.com/shopspring/decimal/LICENSE new file mode 100644 index 0000000000..ad2148aaf9 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/LICENSE @@ -0,0 +1,45 @@ +The MIT License (MIT) + +Copyright (c) 2015 Spring, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +- Based on https://github.com/oguzbilgic/fpd, which has the following license: +""" +The MIT License (MIT) + +Copyright (c) 2013 Oguz Bilgic + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" diff --git a/vendor/github.com/shopspring/decimal/README.md b/vendor/github.com/shopspring/decimal/README.md new file mode 100644 index 0000000000..318c9df581 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/README.md @@ -0,0 +1,139 @@ +# decimal + +[![ci](https://github.com/shopspring/decimal/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/shopspring/decimal/actions/workflows/ci.yml) +[![GoDoc](https://godoc.org/github.com/shopspring/decimal?status.svg)](https://godoc.org/github.com/shopspring/decimal) +[![Go Report Card](https://goreportcard.com/badge/github.com/shopspring/decimal)](https://goreportcard.com/report/github.com/shopspring/decimal) + +Arbitrary-precision fixed-point decimal numbers in go. + +_Note:_ Decimal library can "only" represent numbers with a maximum of 2^31 digits after the decimal point. + +## Features + + * The zero-value is 0, and is safe to use without initialization + * Addition, subtraction, multiplication with no loss of precision + * Division with specified precision + * Database/sql serialization/deserialization + * JSON and XML serialization/deserialization + +## Install + +Run `go get github.com/shopspring/decimal` + +## Requirements + +Decimal library requires Go version `>=1.10` + +## Documentation + +http://godoc.org/github.com/shopspring/decimal + + +## Usage + +```go +package main + +import ( + "fmt" + "github.com/shopspring/decimal" +) + +func main() { + price, err := decimal.NewFromString("136.02") + if err != nil { + panic(err) + } + + quantity := decimal.NewFromInt(3) + + fee, _ := decimal.NewFromString(".035") + taxRate, _ := decimal.NewFromString(".08875") + + subtotal := price.Mul(quantity) + + preTax := subtotal.Mul(fee.Add(decimal.NewFromFloat(1))) + + total := preTax.Mul(taxRate.Add(decimal.NewFromFloat(1))) + + fmt.Println("Subtotal:", subtotal) // Subtotal: 408.06 + fmt.Println("Pre-tax:", preTax) // Pre-tax: 422.3421 + fmt.Println("Taxes:", total.Sub(preTax)) // Taxes: 37.482861375 + fmt.Println("Total:", total) // Total: 459.824961375 + fmt.Println("Tax rate:", total.Sub(preTax).Div(preTax)) // Tax rate: 0.08875 +} +``` + +## Alternative libraries + +When working with decimal numbers, you might face problems this library is not perfectly suited for. +Fortunately, thanks to the wonderful community we have a dozen other libraries that you can choose from. +Explore other alternatives to find the one that best fits your needs :) + +* [cockroachdb/apd](https://github.com/cockroachdb/apd) - arbitrary precision, mutable and rich API similar to `big.Int`, more performant than this library +* [alpacahq/alpacadecimal](https://github.com/alpacahq/alpacadecimal) - high performance, low precision (12 digits), fully compatible API with this library +* [govalues/decimal](https://github.com/govalues/decimal) - high performance, zero-allocation, low precision (19 digits) +* [greatcloak/decimal](https://github.com/greatcloak/decimal) - fork focusing on billing and e-commerce web application related use cases, includes out-of-the-box BSON marshaling support + +## FAQ + +#### Why don't you just use float64? + +Because float64 (or any binary floating point type, actually) can't represent +numbers such as `0.1` exactly. + +Consider this code: http://play.golang.org/p/TQBd4yJe6B You might expect that +it prints out `10`, but it actually prints `9.999999999999831`. Over time, +these small errors can really add up! + +#### Why don't you just use big.Rat? + +big.Rat is fine for representing rational numbers, but Decimal is better for +representing money. Why? Here's a (contrived) example: + +Let's say you use big.Rat, and you have two numbers, x and y, both +representing 1/3, and you have `z = 1 - x - y = 1/3`. If you print each one +out, the string output has to stop somewhere (let's say it stops at 3 decimal +digits, for simplicity), so you'll get 0.333, 0.333, and 0.333. But where did +the other 0.001 go? + +Here's the above example as code: http://play.golang.org/p/lCZZs0w9KE + +With Decimal, the strings being printed out represent the number exactly. So, +if you have `x = y = 1/3` (with precision 3), they will actually be equal to +0.333, and when you do `z = 1 - x - y`, `z` will be equal to .334. No money is +unaccounted for! + +You still have to be careful. If you want to split a number `N` 3 ways, you +can't just send `N/3` to three different people. You have to pick one to send +`N - (2/3*N)` to. That person will receive the fraction of a penny remainder. + +But, it is much easier to be careful with Decimal than with big.Rat. + +#### Why isn't the API similar to big.Int's? + +big.Int's API is built to reduce the number of memory allocations for maximal +performance. This makes sense for its use-case, but the trade-off is that the +API is awkward and easy to misuse. + +For example, to add two big.Ints, you do: `z := new(big.Int).Add(x, y)`. A +developer unfamiliar with this API might try to do `z := a.Add(a, b)`. This +modifies `a` and sets `z` as an alias for `a`, which they might not expect. It +also modifies any other aliases to `a`. + +Here's an example of the subtle bugs you can introduce with big.Int's API: +https://play.golang.org/p/x2R_78pa8r + +In contrast, it's difficult to make such mistakes with decimal. Decimals +behave like other go numbers types: even though `a = b` will not deep copy +`b` into `a`, it is impossible to modify a Decimal, since all Decimal methods +return new Decimals and do not modify the originals. The downside is that +this causes extra allocations, so Decimal is less performant. My assumption +is that if you're using Decimals, you probably care more about correctness +than performance. + +## License + +The MIT License (MIT) + +This is a heavily modified fork of [fpd.Decimal](https://github.com/oguzbilgic/fpd), which was also released under the MIT License. diff --git a/vendor/github.com/shopspring/decimal/const.go b/vendor/github.com/shopspring/decimal/const.go new file mode 100644 index 0000000000..e5d6fa87e8 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/const.go @@ -0,0 +1,63 @@ +package decimal + +import ( + "strings" +) + +const ( + strLn10 = "2.302585092994045684017991454684364207601101488628772976033327900967572609677352480235997205089598298341967784042286248633409525465082806756666287369098781689482907208325554680843799894826233198528393505308965377732628846163366222287698219886746543667474404243274365155048934314939391479619404400222105101714174800368808401264708068556774321622835522011480466371565912137345074785694768346361679210180644507064800027750268491674655058685693567342067058113642922455440575892572420824131469568901675894025677631135691929203337658714166023010570308963457207544037084746994016826928280848118428931484852494864487192780967627127577539702766860595249671667418348570442250719796500471495105049221477656763693866297697952211071826454973477266242570942932258279850258550978526538320760672631716430950599508780752371033310119785754733154142180842754386359177811705430982748238504564801909561029929182431823752535770975053956518769751037497088869218020518933950723853920514463419726528728696511086257149219884997874887377134568620916705849807828059751193854445009978131146915934666241071846692310107598438319191292230792503747298650929009880391941702654416816335727555703151596113564846546190897042819763365836983716328982174407366009162177850541779276367731145041782137660111010731042397832521894898817597921798666394319523936855916447118246753245630912528778330963604262982153040874560927760726641354787576616262926568298704957954913954918049209069438580790032763017941503117866862092408537949861264933479354871737451675809537088281067452440105892444976479686075120275724181874989395971643105518848195288330746699317814634930000321200327765654130472621883970596794457943468343218395304414844803701305753674262153675579814770458031413637793236291560128185336498466942261465206459942072917119370602444929358037007718981097362533224548366988505528285966192805098447175198503666680874970496982273220244823343097169111136813588418696549323714996941979687803008850408979618598756579894836445212043698216415292987811742973332588607915912510967187510929248475023930572665446276200923068791518135803477701295593646298412366497023355174586195564772461857717369368404676577047874319780573853271810933883496338813069945569399346101090745616033312247949360455361849123333063704751724871276379140924398331810164737823379692265637682071706935846394531616949411701841938119405416449466111274712819705817783293841742231409930022911502362192186723337268385688273533371925103412930705632544426611429765388301822384091026198582888433587455960453004548370789052578473166283701953392231047527564998119228742789713715713228319641003422124210082180679525276689858180956119208391760721080919923461516952599099473782780648128058792731993893453415320185969711021407542282796298237068941764740642225757212455392526179373652434440560595336591539160312524480149313234572453879524389036839236450507881731359711238145323701508413491122324390927681724749607955799151363982881058285740538000653371655553014196332241918087621018204919492651483892" +) + +var ( + ln10 = newConstApproximation(strLn10) +) + +type constApproximation struct { + exact Decimal + approximations []Decimal +} + +func newConstApproximation(value string) constApproximation { + parts := strings.Split(value, ".") + coeff, fractional := parts[0], parts[1] + + coeffLen := len(coeff) + maxPrecision := len(fractional) + + var approximations []Decimal + for p := 1; p < maxPrecision; p *= 2 { + r := RequireFromString(value[:coeffLen+p]) + approximations = append(approximations, r) + } + + return constApproximation{ + RequireFromString(value), + approximations, + } +} + +// Returns the smallest approximation available that's at least as precise +// as the passed precision (places after decimal point), i.e. Floor[ log2(precision) ] + 1 +func (c constApproximation) withPrecision(precision int32) Decimal { + i := 0 + + if precision >= 1 { + i++ + } + + for precision >= 16 { + precision /= 16 + i += 4 + } + + for precision >= 2 { + precision /= 2 + i++ + } + + if i >= len(c.approximations) { + return c.exact + } + + return c.approximations[i] +} diff --git a/vendor/github.com/shopspring/decimal/decimal-go.go b/vendor/github.com/shopspring/decimal/decimal-go.go new file mode 100644 index 0000000000..9958d69020 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/decimal-go.go @@ -0,0 +1,415 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Multiprecision decimal numbers. +// For floating-point formatting only; not general purpose. +// Only operations are assign and (binary) left/right shift. +// Can do binary floating point in multiprecision decimal precisely +// because 2 divides 10; cannot do decimal floating point +// in multiprecision binary precisely. + +package decimal + +type decimal struct { + d [800]byte // digits, big-endian representation + nd int // number of digits used + dp int // decimal point + neg bool // negative flag + trunc bool // discarded nonzero digits beyond d[:nd] +} + +func (a *decimal) String() string { + n := 10 + a.nd + if a.dp > 0 { + n += a.dp + } + if a.dp < 0 { + n += -a.dp + } + + buf := make([]byte, n) + w := 0 + switch { + case a.nd == 0: + return "0" + + case a.dp <= 0: + // zeros fill space between decimal point and digits + buf[w] = '0' + w++ + buf[w] = '.' + w++ + w += digitZero(buf[w : w+-a.dp]) + w += copy(buf[w:], a.d[0:a.nd]) + + case a.dp < a.nd: + // decimal point in middle of digits + w += copy(buf[w:], a.d[0:a.dp]) + buf[w] = '.' + w++ + w += copy(buf[w:], a.d[a.dp:a.nd]) + + default: + // zeros fill space between digits and decimal point + w += copy(buf[w:], a.d[0:a.nd]) + w += digitZero(buf[w : w+a.dp-a.nd]) + } + return string(buf[0:w]) +} + +func digitZero(dst []byte) int { + for i := range dst { + dst[i] = '0' + } + return len(dst) +} + +// trim trailing zeros from number. +// (They are meaningless; the decimal point is tracked +// independent of the number of digits.) +func trim(a *decimal) { + for a.nd > 0 && a.d[a.nd-1] == '0' { + a.nd-- + } + if a.nd == 0 { + a.dp = 0 + } +} + +// Assign v to a. +func (a *decimal) Assign(v uint64) { + var buf [24]byte + + // Write reversed decimal in buf. + n := 0 + for v > 0 { + v1 := v / 10 + v -= 10 * v1 + buf[n] = byte(v + '0') + n++ + v = v1 + } + + // Reverse again to produce forward decimal in a.d. + a.nd = 0 + for n--; n >= 0; n-- { + a.d[a.nd] = buf[n] + a.nd++ + } + a.dp = a.nd + trim(a) +} + +// Maximum shift that we can do in one pass without overflow. +// A uint has 32 or 64 bits, and we have to be able to accommodate 9<> 63) +const maxShift = uintSize - 4 + +// Binary shift right (/ 2) by k bits. k <= maxShift to avoid overflow. +func rightShift(a *decimal, k uint) { + r := 0 // read pointer + w := 0 // write pointer + + // Pick up enough leading digits to cover first shift. + var n uint + for ; n>>k == 0; r++ { + if r >= a.nd { + if n == 0 { + // a == 0; shouldn't get here, but handle anyway. + a.nd = 0 + return + } + for n>>k == 0 { + n = n * 10 + r++ + } + break + } + c := uint(a.d[r]) + n = n*10 + c - '0' + } + a.dp -= r - 1 + + var mask uint = (1 << k) - 1 + + // Pick up a digit, put down a digit. + for ; r < a.nd; r++ { + c := uint(a.d[r]) + dig := n >> k + n &= mask + a.d[w] = byte(dig + '0') + w++ + n = n*10 + c - '0' + } + + // Put down extra digits. + for n > 0 { + dig := n >> k + n &= mask + if w < len(a.d) { + a.d[w] = byte(dig + '0') + w++ + } else if dig > 0 { + a.trunc = true + } + n = n * 10 + } + + a.nd = w + trim(a) +} + +// Cheat sheet for left shift: table indexed by shift count giving +// number of new digits that will be introduced by that shift. +// +// For example, leftcheats[4] = {2, "625"}. That means that +// if we are shifting by 4 (multiplying by 16), it will add 2 digits +// when the string prefix is "625" through "999", and one fewer digit +// if the string prefix is "000" through "624". +// +// Credit for this trick goes to Ken. + +type leftCheat struct { + delta int // number of new digits + cutoff string // minus one digit if original < a. +} + +var leftcheats = []leftCheat{ + // Leading digits of 1/2^i = 5^i. + // 5^23 is not an exact 64-bit floating point number, + // so have to use bc for the math. + // Go up to 60 to be large enough for 32bit and 64bit platforms. + /* + seq 60 | sed 's/^/5^/' | bc | + awk 'BEGIN{ print "\t{ 0, \"\" }," } + { + log2 = log(2)/log(10) + printf("\t{ %d, \"%s\" },\t// * %d\n", + int(log2*NR+1), $0, 2**NR) + }' + */ + {0, ""}, + {1, "5"}, // * 2 + {1, "25"}, // * 4 + {1, "125"}, // * 8 + {2, "625"}, // * 16 + {2, "3125"}, // * 32 + {2, "15625"}, // * 64 + {3, "78125"}, // * 128 + {3, "390625"}, // * 256 + {3, "1953125"}, // * 512 + {4, "9765625"}, // * 1024 + {4, "48828125"}, // * 2048 + {4, "244140625"}, // * 4096 + {4, "1220703125"}, // * 8192 + {5, "6103515625"}, // * 16384 + {5, "30517578125"}, // * 32768 + {5, "152587890625"}, // * 65536 + {6, "762939453125"}, // * 131072 + {6, "3814697265625"}, // * 262144 + {6, "19073486328125"}, // * 524288 + {7, "95367431640625"}, // * 1048576 + {7, "476837158203125"}, // * 2097152 + {7, "2384185791015625"}, // * 4194304 + {7, "11920928955078125"}, // * 8388608 + {8, "59604644775390625"}, // * 16777216 + {8, "298023223876953125"}, // * 33554432 + {8, "1490116119384765625"}, // * 67108864 + {9, "7450580596923828125"}, // * 134217728 + {9, "37252902984619140625"}, // * 268435456 + {9, "186264514923095703125"}, // * 536870912 + {10, "931322574615478515625"}, // * 1073741824 + {10, "4656612873077392578125"}, // * 2147483648 + {10, "23283064365386962890625"}, // * 4294967296 + {10, "116415321826934814453125"}, // * 8589934592 + {11, "582076609134674072265625"}, // * 17179869184 + {11, "2910383045673370361328125"}, // * 34359738368 + {11, "14551915228366851806640625"}, // * 68719476736 + {12, "72759576141834259033203125"}, // * 137438953472 + {12, "363797880709171295166015625"}, // * 274877906944 + {12, "1818989403545856475830078125"}, // * 549755813888 + {13, "9094947017729282379150390625"}, // * 1099511627776 + {13, "45474735088646411895751953125"}, // * 2199023255552 + {13, "227373675443232059478759765625"}, // * 4398046511104 + {13, "1136868377216160297393798828125"}, // * 8796093022208 + {14, "5684341886080801486968994140625"}, // * 17592186044416 + {14, "28421709430404007434844970703125"}, // * 35184372088832 + {14, "142108547152020037174224853515625"}, // * 70368744177664 + {15, "710542735760100185871124267578125"}, // * 140737488355328 + {15, "3552713678800500929355621337890625"}, // * 281474976710656 + {15, "17763568394002504646778106689453125"}, // * 562949953421312 + {16, "88817841970012523233890533447265625"}, // * 1125899906842624 + {16, "444089209850062616169452667236328125"}, // * 2251799813685248 + {16, "2220446049250313080847263336181640625"}, // * 4503599627370496 + {16, "11102230246251565404236316680908203125"}, // * 9007199254740992 + {17, "55511151231257827021181583404541015625"}, // * 18014398509481984 + {17, "277555756156289135105907917022705078125"}, // * 36028797018963968 + {17, "1387778780781445675529539585113525390625"}, // * 72057594037927936 + {18, "6938893903907228377647697925567626953125"}, // * 144115188075855872 + {18, "34694469519536141888238489627838134765625"}, // * 288230376151711744 + {18, "173472347597680709441192448139190673828125"}, // * 576460752303423488 + {19, "867361737988403547205962240695953369140625"}, // * 1152921504606846976 +} + +// Is the leading prefix of b lexicographically less than s? +func prefixIsLessThan(b []byte, s string) bool { + for i := 0; i < len(s); i++ { + if i >= len(b) { + return true + } + if b[i] != s[i] { + return b[i] < s[i] + } + } + return false +} + +// Binary shift left (* 2) by k bits. k <= maxShift to avoid overflow. +func leftShift(a *decimal, k uint) { + delta := leftcheats[k].delta + if prefixIsLessThan(a.d[0:a.nd], leftcheats[k].cutoff) { + delta-- + } + + r := a.nd // read index + w := a.nd + delta // write index + + // Pick up a digit, put down a digit. + var n uint + for r--; r >= 0; r-- { + n += (uint(a.d[r]) - '0') << k + quo := n / 10 + rem := n - 10*quo + w-- + if w < len(a.d) { + a.d[w] = byte(rem + '0') + } else if rem != 0 { + a.trunc = true + } + n = quo + } + + // Put down extra digits. + for n > 0 { + quo := n / 10 + rem := n - 10*quo + w-- + if w < len(a.d) { + a.d[w] = byte(rem + '0') + } else if rem != 0 { + a.trunc = true + } + n = quo + } + + a.nd += delta + if a.nd >= len(a.d) { + a.nd = len(a.d) + } + a.dp += delta + trim(a) +} + +// Binary shift left (k > 0) or right (k < 0). +func (a *decimal) Shift(k int) { + switch { + case a.nd == 0: + // nothing to do: a == 0 + case k > 0: + for k > maxShift { + leftShift(a, maxShift) + k -= maxShift + } + leftShift(a, uint(k)) + case k < 0: + for k < -maxShift { + rightShift(a, maxShift) + k += maxShift + } + rightShift(a, uint(-k)) + } +} + +// If we chop a at nd digits, should we round up? +func shouldRoundUp(a *decimal, nd int) bool { + if nd < 0 || nd >= a.nd { + return false + } + if a.d[nd] == '5' && nd+1 == a.nd { // exactly halfway - round to even + // if we truncated, a little higher than what's recorded - always round up + if a.trunc { + return true + } + return nd > 0 && (a.d[nd-1]-'0')%2 != 0 + } + // not halfway - digit tells all + return a.d[nd] >= '5' +} + +// Round a to nd digits (or fewer). +// If nd is zero, it means we're rounding +// just to the left of the digits, as in +// 0.09 -> 0.1. +func (a *decimal) Round(nd int) { + if nd < 0 || nd >= a.nd { + return + } + if shouldRoundUp(a, nd) { + a.RoundUp(nd) + } else { + a.RoundDown(nd) + } +} + +// Round a down to nd digits (or fewer). +func (a *decimal) RoundDown(nd int) { + if nd < 0 || nd >= a.nd { + return + } + a.nd = nd + trim(a) +} + +// Round a up to nd digits (or fewer). +func (a *decimal) RoundUp(nd int) { + if nd < 0 || nd >= a.nd { + return + } + + // round up + for i := nd - 1; i >= 0; i-- { + c := a.d[i] + if c < '9' { // can stop after this digit + a.d[i]++ + a.nd = i + 1 + return + } + } + + // Number is all 9s. + // Change to single 1 with adjusted decimal point. + a.d[0] = '1' + a.nd = 1 + a.dp++ +} + +// Extract integer part, rounded appropriately. +// No guarantees about overflow. +func (a *decimal) RoundedInteger() uint64 { + if a.dp > 20 { + return 0xFFFFFFFFFFFFFFFF + } + var i int + n := uint64(0) + for i = 0; i < a.dp && i < a.nd; i++ { + n = n*10 + uint64(a.d[i]-'0') + } + for ; i < a.dp; i++ { + n *= 10 + } + if shouldRoundUp(a, a.dp) { + n++ + } + return n +} diff --git a/vendor/github.com/shopspring/decimal/decimal.go b/vendor/github.com/shopspring/decimal/decimal.go new file mode 100644 index 0000000000..a37a2301ef --- /dev/null +++ b/vendor/github.com/shopspring/decimal/decimal.go @@ -0,0 +1,2339 @@ +// Package decimal implements an arbitrary precision fixed-point decimal. +// +// The zero-value of a Decimal is 0, as you would expect. +// +// The best way to create a new Decimal is to use decimal.NewFromString, ex: +// +// n, err := decimal.NewFromString("-123.4567") +// n.String() // output: "-123.4567" +// +// To use Decimal as part of a struct: +// +// type StructName struct { +// Number Decimal +// } +// +// Note: This can "only" represent numbers with a maximum of 2^31 digits after the decimal point. +package decimal + +import ( + "database/sql/driver" + "encoding/binary" + "fmt" + "math" + "math/big" + "regexp" + "strconv" + "strings" +) + +// DivisionPrecision is the number of decimal places in the result when it +// doesn't divide exactly. +// +// Example: +// +// d1 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3)) +// d1.String() // output: "0.6666666666666667" +// d2 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(30000)) +// d2.String() // output: "0.0000666666666667" +// d3 := decimal.NewFromFloat(20000).Div(decimal.NewFromFloat(3)) +// d3.String() // output: "6666.6666666666666667" +// decimal.DivisionPrecision = 3 +// d4 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3)) +// d4.String() // output: "0.667" +var DivisionPrecision = 16 + +// PowPrecisionNegativeExponent specifies the maximum precision of the result (digits after decimal point) +// when calculating decimal power. Only used for cases where the exponent is a negative number. +// This constant applies to Pow, PowInt32 and PowBigInt methods, PowWithPrecision method is not constrained by it. +// +// Example: +// +// d1, err := decimal.NewFromFloat(15.2).PowInt32(-2) +// d1.String() // output: "0.0043282548476454" +// +// decimal.PowPrecisionNegativeExponent = 24 +// d2, err := decimal.NewFromFloat(15.2).PowInt32(-2) +// d2.String() // output: "0.004328254847645429362881" +var PowPrecisionNegativeExponent = 16 + +// MarshalJSONWithoutQuotes should be set to true if you want the decimal to +// be JSON marshaled as a number, instead of as a string. +// WARNING: this is dangerous for decimals with many digits, since many JSON +// unmarshallers (ex: Javascript's) will unmarshal JSON numbers to IEEE 754 +// double-precision floating point numbers, which means you can potentially +// silently lose precision. +var MarshalJSONWithoutQuotes = false + +// ExpMaxIterations specifies the maximum number of iterations needed to calculate +// precise natural exponent value using ExpHullAbrham method. +var ExpMaxIterations = 1000 + +// Zero constant, to make computations faster. +// Zero should never be compared with == or != directly, please use decimal.Equal or decimal.Cmp instead. +var Zero = New(0, 1) + +var zeroInt = big.NewInt(0) +var oneInt = big.NewInt(1) +var twoInt = big.NewInt(2) +var fourInt = big.NewInt(4) +var fiveInt = big.NewInt(5) +var tenInt = big.NewInt(10) +var twentyInt = big.NewInt(20) + +var factorials = []Decimal{New(1, 0)} + +// Decimal represents a fixed-point decimal. It is immutable. +// number = value * 10 ^ exp +type Decimal struct { + value *big.Int + + // NOTE(vadim): this must be an int32, because we cast it to float64 during + // calculations. If exp is 64 bit, we might lose precision. + // If we cared about being able to represent every possible decimal, we + // could make exp a *big.Int but it would hurt performance and numbers + // like that are unrealistic. + exp int32 +} + +// New returns a new fixed-point decimal, value * 10 ^ exp. +func New(value int64, exp int32) Decimal { + return Decimal{ + value: big.NewInt(value), + exp: exp, + } +} + +// NewFromInt converts an int64 to Decimal. +// +// Example: +// +// NewFromInt(123).String() // output: "123" +// NewFromInt(-10).String() // output: "-10" +func NewFromInt(value int64) Decimal { + return Decimal{ + value: big.NewInt(value), + exp: 0, + } +} + +// NewFromInt32 converts an int32 to Decimal. +// +// Example: +// +// NewFromInt(123).String() // output: "123" +// NewFromInt(-10).String() // output: "-10" +func NewFromInt32(value int32) Decimal { + return Decimal{ + value: big.NewInt(int64(value)), + exp: 0, + } +} + +// NewFromUint64 converts an uint64 to Decimal. +// +// Example: +// +// NewFromUint64(123).String() // output: "123" +func NewFromUint64(value uint64) Decimal { + return Decimal{ + value: new(big.Int).SetUint64(value), + exp: 0, + } +} + +// NewFromBigInt returns a new Decimal from a big.Int, value * 10 ^ exp +func NewFromBigInt(value *big.Int, exp int32) Decimal { + return Decimal{ + value: new(big.Int).Set(value), + exp: exp, + } +} + +// NewFromBigRat returns a new Decimal from a big.Rat. The numerator and +// denominator are divided and rounded to the given precision. +// +// Example: +// +// d1 := NewFromBigRat(big.NewRat(0, 1), 0) // output: "0" +// d2 := NewFromBigRat(big.NewRat(4, 5), 1) // output: "0.8" +// d3 := NewFromBigRat(big.NewRat(1000, 3), 3) // output: "333.333" +// d4 := NewFromBigRat(big.NewRat(2, 7), 4) // output: "0.2857" +func NewFromBigRat(value *big.Rat, precision int32) Decimal { + return Decimal{ + value: new(big.Int).Set(value.Num()), + exp: 0, + }.DivRound(Decimal{ + value: new(big.Int).Set(value.Denom()), + exp: 0, + }, precision) +} + +// NewFromString returns a new Decimal from a string representation. +// Trailing zeroes are not trimmed. +// +// Example: +// +// d, err := NewFromString("-123.45") +// d2, err := NewFromString(".0001") +// d3, err := NewFromString("1.47000") +func NewFromString(value string) (Decimal, error) { + originalInput := value + var intString string + var exp int64 + + // Check if number is using scientific notation + eIndex := strings.IndexAny(value, "Ee") + if eIndex != -1 { + expInt, err := strconv.ParseInt(value[eIndex+1:], 10, 32) + if err != nil { + if e, ok := err.(*strconv.NumError); ok && e.Err == strconv.ErrRange { + return Decimal{}, fmt.Errorf("can't convert %s to decimal: fractional part too long", value) + } + return Decimal{}, fmt.Errorf("can't convert %s to decimal: exponent is not numeric", value) + } + value = value[:eIndex] + exp = expInt + } + + pIndex := -1 + vLen := len(value) + for i := 0; i < vLen; i++ { + if value[i] == '.' { + if pIndex > -1 { + return Decimal{}, fmt.Errorf("can't convert %s to decimal: too many .s", value) + } + pIndex = i + } + } + + if pIndex == -1 { + // There is no decimal point, we can just parse the original string as + // an int + intString = value + } else { + if pIndex+1 < vLen { + intString = value[:pIndex] + value[pIndex+1:] + } else { + intString = value[:pIndex] + } + expInt := -len(value[pIndex+1:]) + exp += int64(expInt) + } + + var dValue *big.Int + // strconv.ParseInt is faster than new(big.Int).SetString so this is just a shortcut for strings we know won't overflow + if len(intString) <= 18 { + parsed64, err := strconv.ParseInt(intString, 10, 64) + if err != nil { + return Decimal{}, fmt.Errorf("can't convert %s to decimal", value) + } + dValue = big.NewInt(parsed64) + } else { + dValue = new(big.Int) + _, ok := dValue.SetString(intString, 10) + if !ok { + return Decimal{}, fmt.Errorf("can't convert %s to decimal", value) + } + } + + if exp < math.MinInt32 || exp > math.MaxInt32 { + // NOTE(vadim): I doubt a string could realistically be this long + return Decimal{}, fmt.Errorf("can't convert %s to decimal: fractional part too long", originalInput) + } + + return Decimal{ + value: dValue, + exp: int32(exp), + }, nil +} + +// NewFromFormattedString returns a new Decimal from a formatted string representation. +// The second argument - replRegexp, is a regular expression that is used to find characters that should be +// removed from given decimal string representation. All matched characters will be replaced with an empty string. +// +// Example: +// +// r := regexp.MustCompile("[$,]") +// d1, err := NewFromFormattedString("$5,125.99", r) +// +// r2 := regexp.MustCompile("[_]") +// d2, err := NewFromFormattedString("1_000_000", r2) +// +// r3 := regexp.MustCompile("[USD\\s]") +// d3, err := NewFromFormattedString("5000 USD", r3) +func NewFromFormattedString(value string, replRegexp *regexp.Regexp) (Decimal, error) { + parsedValue := replRegexp.ReplaceAllString(value, "") + d, err := NewFromString(parsedValue) + if err != nil { + return Decimal{}, err + } + return d, nil +} + +// RequireFromString returns a new Decimal from a string representation +// or panics if NewFromString had returned an error. +// +// Example: +// +// d := RequireFromString("-123.45") +// d2 := RequireFromString(".0001") +func RequireFromString(value string) Decimal { + dec, err := NewFromString(value) + if err != nil { + panic(err) + } + return dec +} + +// NewFromFloat converts a float64 to Decimal. +// +// The converted number will contain the number of significant digits that can be +// represented in a float with reliable roundtrip. +// This is typically 15 digits, but may be more in some cases. +// See https://www.exploringbinary.com/decimal-precision-of-binary-floating-point-numbers/ for more information. +// +// For slightly faster conversion, use NewFromFloatWithExponent where you can specify the precision in absolute terms. +// +// NOTE: this will panic on NaN, +/-inf +func NewFromFloat(value float64) Decimal { + if value == 0 { + return New(0, 0) + } + return newFromFloat(value, math.Float64bits(value), &float64info) +} + +// NewFromFloat32 converts a float32 to Decimal. +// +// The converted number will contain the number of significant digits that can be +// represented in a float with reliable roundtrip. +// This is typically 6-8 digits depending on the input. +// See https://www.exploringbinary.com/decimal-precision-of-binary-floating-point-numbers/ for more information. +// +// For slightly faster conversion, use NewFromFloatWithExponent where you can specify the precision in absolute terms. +// +// NOTE: this will panic on NaN, +/-inf +func NewFromFloat32(value float32) Decimal { + if value == 0 { + return New(0, 0) + } + // XOR is workaround for https://github.com/golang/go/issues/26285 + a := math.Float32bits(value) ^ 0x80808080 + return newFromFloat(float64(value), uint64(a)^0x80808080, &float32info) +} + +func newFromFloat(val float64, bits uint64, flt *floatInfo) Decimal { + if math.IsNaN(val) || math.IsInf(val, 0) { + panic(fmt.Sprintf("Cannot create a Decimal from %v", val)) + } + exp := int(bits>>flt.mantbits) & (1<>(flt.expbits+flt.mantbits) != 0 + + roundShortest(&d, mant, exp, flt) + // If less than 19 digits, we can do calculation in an int64. + if d.nd < 19 { + tmp := int64(0) + m := int64(1) + for i := d.nd - 1; i >= 0; i-- { + tmp += m * int64(d.d[i]-'0') + m *= 10 + } + if d.neg { + tmp *= -1 + } + return Decimal{value: big.NewInt(tmp), exp: int32(d.dp) - int32(d.nd)} + } + dValue := new(big.Int) + dValue, ok := dValue.SetString(string(d.d[:d.nd]), 10) + if ok { + return Decimal{value: dValue, exp: int32(d.dp) - int32(d.nd)} + } + + return NewFromFloatWithExponent(val, int32(d.dp)-int32(d.nd)) +} + +// NewFromFloatWithExponent converts a float64 to Decimal, with an arbitrary +// number of fractional digits. +// +// Example: +// +// NewFromFloatWithExponent(123.456, -2).String() // output: "123.46" +func NewFromFloatWithExponent(value float64, exp int32) Decimal { + if math.IsNaN(value) || math.IsInf(value, 0) { + panic(fmt.Sprintf("Cannot create a Decimal from %v", value)) + } + + bits := math.Float64bits(value) + mant := bits & (1<<52 - 1) + exp2 := int32((bits >> 52) & (1<<11 - 1)) + sign := bits >> 63 + + if exp2 == 0 { + // specials + if mant == 0 { + return Decimal{} + } + // subnormal + exp2++ + } else { + // normal + mant |= 1 << 52 + } + + exp2 -= 1023 + 52 + + // normalizing base-2 values + for mant&1 == 0 { + mant = mant >> 1 + exp2++ + } + + // maximum number of fractional base-10 digits to represent 2^N exactly cannot be more than -N if N<0 + if exp < 0 && exp < exp2 { + if exp2 < 0 { + exp = exp2 + } else { + exp = 0 + } + } + + // representing 10^M * 2^N as 5^M * 2^(M+N) + exp2 -= exp + + temp := big.NewInt(1) + dMant := big.NewInt(int64(mant)) + + // applying 5^M + if exp > 0 { + temp = temp.SetInt64(int64(exp)) + temp = temp.Exp(fiveInt, temp, nil) + } else if exp < 0 { + temp = temp.SetInt64(-int64(exp)) + temp = temp.Exp(fiveInt, temp, nil) + dMant = dMant.Mul(dMant, temp) + temp = temp.SetUint64(1) + } + + // applying 2^(M+N) + if exp2 > 0 { + dMant = dMant.Lsh(dMant, uint(exp2)) + } else if exp2 < 0 { + temp = temp.Lsh(temp, uint(-exp2)) + } + + // rounding and downscaling + if exp > 0 || exp2 < 0 { + halfDown := new(big.Int).Rsh(temp, 1) + dMant = dMant.Add(dMant, halfDown) + dMant = dMant.Quo(dMant, temp) + } + + if sign == 1 { + dMant = dMant.Neg(dMant) + } + + return Decimal{ + value: dMant, + exp: exp, + } +} + +// Copy returns a copy of decimal with the same value and exponent, but a different pointer to value. +func (d Decimal) Copy() Decimal { + d.ensureInitialized() + return Decimal{ + value: new(big.Int).Set(d.value), + exp: d.exp, + } +} + +// rescale returns a rescaled version of the decimal. Returned +// decimal may be less precise if the given exponent is bigger +// than the initial exponent of the Decimal. +// NOTE: this will truncate, NOT round +// +// Example: +// +// d := New(12345, -4) +// d2 := d.rescale(-1) +// d3 := d2.rescale(-4) +// println(d1) +// println(d2) +// println(d3) +// +// Output: +// +// 1.2345 +// 1.2 +// 1.2000 +func (d Decimal) rescale(exp int32) Decimal { + d.ensureInitialized() + + if d.exp == exp { + return Decimal{ + new(big.Int).Set(d.value), + d.exp, + } + } + + // NOTE(vadim): must convert exps to float64 before - to prevent overflow + diff := math.Abs(float64(exp) - float64(d.exp)) + value := new(big.Int).Set(d.value) + + expScale := new(big.Int).Exp(tenInt, big.NewInt(int64(diff)), nil) + if exp > d.exp { + value = value.Quo(value, expScale) + } else if exp < d.exp { + value = value.Mul(value, expScale) + } + + return Decimal{ + value: value, + exp: exp, + } +} + +// Abs returns the absolute value of the decimal. +func (d Decimal) Abs() Decimal { + if !d.IsNegative() { + return d + } + d.ensureInitialized() + d2Value := new(big.Int).Abs(d.value) + return Decimal{ + value: d2Value, + exp: d.exp, + } +} + +// Add returns d + d2. +func (d Decimal) Add(d2 Decimal) Decimal { + rd, rd2 := RescalePair(d, d2) + + d3Value := new(big.Int).Add(rd.value, rd2.value) + return Decimal{ + value: d3Value, + exp: rd.exp, + } +} + +// Sub returns d - d2. +func (d Decimal) Sub(d2 Decimal) Decimal { + rd, rd2 := RescalePair(d, d2) + + d3Value := new(big.Int).Sub(rd.value, rd2.value) + return Decimal{ + value: d3Value, + exp: rd.exp, + } +} + +// Neg returns -d. +func (d Decimal) Neg() Decimal { + d.ensureInitialized() + val := new(big.Int).Neg(d.value) + return Decimal{ + value: val, + exp: d.exp, + } +} + +// Mul returns d * d2. +func (d Decimal) Mul(d2 Decimal) Decimal { + d.ensureInitialized() + d2.ensureInitialized() + + expInt64 := int64(d.exp) + int64(d2.exp) + if expInt64 > math.MaxInt32 || expInt64 < math.MinInt32 { + // NOTE(vadim): better to panic than give incorrect results, as + // Decimals are usually used for money + panic(fmt.Sprintf("exponent %v overflows an int32!", expInt64)) + } + + d3Value := new(big.Int).Mul(d.value, d2.value) + return Decimal{ + value: d3Value, + exp: int32(expInt64), + } +} + +// Shift shifts the decimal in base 10. +// It shifts left when shift is positive and right if shift is negative. +// In simpler terms, the given value for shift is added to the exponent +// of the decimal. +func (d Decimal) Shift(shift int32) Decimal { + d.ensureInitialized() + return Decimal{ + value: new(big.Int).Set(d.value), + exp: d.exp + shift, + } +} + +// Div returns d / d2. If it doesn't divide exactly, the result will have +// DivisionPrecision digits after the decimal point. +func (d Decimal) Div(d2 Decimal) Decimal { + return d.DivRound(d2, int32(DivisionPrecision)) +} + +// QuoRem does division with remainder +// d.QuoRem(d2,precision) returns quotient q and remainder r such that +// +// d = d2 * q + r, q an integer multiple of 10^(-precision) +// 0 <= r < abs(d2) * 10 ^(-precision) if d>=0 +// 0 >= r > -abs(d2) * 10 ^(-precision) if d<0 +// +// Note that precision<0 is allowed as input. +func (d Decimal) QuoRem(d2 Decimal, precision int32) (Decimal, Decimal) { + d.ensureInitialized() + d2.ensureInitialized() + if d2.value.Sign() == 0 { + panic("decimal division by 0") + } + scale := -precision + e := int64(d.exp) - int64(d2.exp) - int64(scale) + if e > math.MaxInt32 || e < math.MinInt32 { + panic("overflow in decimal QuoRem") + } + var aa, bb, expo big.Int + var scalerest int32 + // d = a 10^ea + // d2 = b 10^eb + if e < 0 { + aa = *d.value + expo.SetInt64(-e) + bb.Exp(tenInt, &expo, nil) + bb.Mul(d2.value, &bb) + scalerest = d.exp + // now aa = a + // bb = b 10^(scale + eb - ea) + } else { + expo.SetInt64(e) + aa.Exp(tenInt, &expo, nil) + aa.Mul(d.value, &aa) + bb = *d2.value + scalerest = scale + d2.exp + // now aa = a ^ (ea - eb - scale) + // bb = b + } + var q, r big.Int + q.QuoRem(&aa, &bb, &r) + dq := Decimal{value: &q, exp: scale} + dr := Decimal{value: &r, exp: scalerest} + return dq, dr +} + +// DivRound divides and rounds to a given precision +// i.e. to an integer multiple of 10^(-precision) +// +// for a positive quotient digit 5 is rounded up, away from 0 +// if the quotient is negative then digit 5 is rounded down, away from 0 +// +// Note that precision<0 is allowed as input. +func (d Decimal) DivRound(d2 Decimal, precision int32) Decimal { + // QuoRem already checks initialization + q, r := d.QuoRem(d2, precision) + // the actual rounding decision is based on comparing r*10^precision and d2/2 + // instead compare 2 r 10 ^precision and d2 + var rv2 big.Int + rv2.Abs(r.value) + rv2.Lsh(&rv2, 1) + // now rv2 = abs(r.value) * 2 + r2 := Decimal{value: &rv2, exp: r.exp + precision} + // r2 is now 2 * r * 10 ^ precision + var c = r2.Cmp(d2.Abs()) + + if c < 0 { + return q + } + + if d.value.Sign()*d2.value.Sign() < 0 { + return q.Sub(New(1, -precision)) + } + + return q.Add(New(1, -precision)) +} + +// Mod returns d % d2. +func (d Decimal) Mod(d2 Decimal) Decimal { + _, r := d.QuoRem(d2, 0) + return r +} + +// Pow returns d to the power of d2. +// When exponent is negative the returned decimal will have maximum precision of PowPrecisionNegativeExponent places after decimal point. +// +// Pow returns 0 (zero-value of Decimal) instead of error for power operation edge cases, to handle those edge cases use PowWithPrecision +// Edge cases not handled by Pow: +// - 0 ** 0 => undefined value +// - 0 ** y, where y < 0 => infinity +// - x ** y, where x < 0 and y is non-integer decimal => imaginary value +// +// Example: +// +// d1 := decimal.NewFromFloat(4.0) +// d2 := decimal.NewFromFloat(4.0) +// res1 := d1.Pow(d2) +// res1.String() // output: "256" +// +// d3 := decimal.NewFromFloat(5.0) +// d4 := decimal.NewFromFloat(5.73) +// res2 := d3.Pow(d4) +// res2.String() // output: "10118.08037125" +func (d Decimal) Pow(d2 Decimal) Decimal { + baseSign := d.Sign() + expSign := d2.Sign() + + if baseSign == 0 { + if expSign == 0 { + return Decimal{} + } + if expSign == 1 { + return Decimal{zeroInt, 0} + } + if expSign == -1 { + return Decimal{} + } + } + + if expSign == 0 { + return Decimal{oneInt, 0} + } + + // TODO: optimize extraction of fractional part + one := Decimal{oneInt, 0} + expIntPart, expFracPart := d2.QuoRem(one, 0) + + if baseSign == -1 && !expFracPart.IsZero() { + return Decimal{} + } + + intPartPow, _ := d.PowBigInt(expIntPart.value) + + // if exponent is an integer we don't need to calculate d1**frac(d2) + if expFracPart.value.Sign() == 0 { + return intPartPow + } + + // TODO: optimize NumDigits for more performant precision adjustment + digitsBase := d.NumDigits() + digitsExponent := d2.NumDigits() + + precision := digitsBase + + if digitsExponent > precision { + precision += digitsExponent + } + + precision += 6 + + // Calculate x ** frac(y), where + // x ** frac(y) = exp(ln(x ** frac(y)) = exp(ln(x) * frac(y)) + fracPartPow, err := d.Abs().Ln(-d.exp + int32(precision)) + if err != nil { + return Decimal{} + } + + fracPartPow = fracPartPow.Mul(expFracPart) + + fracPartPow, err = fracPartPow.ExpTaylor(-d.exp + int32(precision)) + if err != nil { + return Decimal{} + } + + // Join integer and fractional part, + // base ** (expBase + expFrac) = base ** expBase * base ** expFrac + res := intPartPow.Mul(fracPartPow) + + return res +} + +// PowWithPrecision returns d to the power of d2. +// Precision parameter specifies minimum precision of the result (digits after decimal point). +// Returned decimal is not rounded to 'precision' places after decimal point. +// +// PowWithPrecision returns error when: +// - 0 ** 0 => undefined value +// - 0 ** y, where y < 0 => infinity +// - x ** y, where x < 0 and y is non-integer decimal => imaginary value +// +// Example: +// +// d1 := decimal.NewFromFloat(4.0) +// d2 := decimal.NewFromFloat(4.0) +// res1, err := d1.PowWithPrecision(d2, 2) +// res1.String() // output: "256" +// +// d3 := decimal.NewFromFloat(5.0) +// d4 := decimal.NewFromFloat(5.73) +// res2, err := d3.PowWithPrecision(d4, 5) +// res2.String() // output: "10118.080371595015625" +// +// d5 := decimal.NewFromFloat(-3.0) +// d6 := decimal.NewFromFloat(-6.0) +// res3, err := d5.PowWithPrecision(d6, 10) +// res3.String() // output: "0.0013717421" +func (d Decimal) PowWithPrecision(d2 Decimal, precision int32) (Decimal, error) { + baseSign := d.Sign() + expSign := d2.Sign() + + if baseSign == 0 { + if expSign == 0 { + return Decimal{}, fmt.Errorf("cannot represent undefined value of 0**0") + } + if expSign == 1 { + return Decimal{zeroInt, 0}, nil + } + if expSign == -1 { + return Decimal{}, fmt.Errorf("cannot represent infinity value of 0 ** y, where y < 0") + } + } + + if expSign == 0 { + return Decimal{oneInt, 0}, nil + } + + // TODO: optimize extraction of fractional part + one := Decimal{oneInt, 0} + expIntPart, expFracPart := d2.QuoRem(one, 0) + + if baseSign == -1 && !expFracPart.IsZero() { + return Decimal{}, fmt.Errorf("cannot represent imaginary value of x ** y, where x < 0 and y is non-integer decimal") + } + + intPartPow, _ := d.powBigIntWithPrecision(expIntPart.value, precision) + + // if exponent is an integer we don't need to calculate d1**frac(d2) + if expFracPart.value.Sign() == 0 { + return intPartPow, nil + } + + // TODO: optimize NumDigits for more performant precision adjustment + digitsBase := d.NumDigits() + digitsExponent := d2.NumDigits() + + if int32(digitsBase) > precision { + precision = int32(digitsBase) + } + if int32(digitsExponent) > precision { + precision += int32(digitsExponent) + } + // increase precision by 10 to compensate for errors in further calculations + precision += 10 + + // Calculate x ** frac(y), where + // x ** frac(y) = exp(ln(x ** frac(y)) = exp(ln(x) * frac(y)) + fracPartPow, err := d.Abs().Ln(precision) + if err != nil { + return Decimal{}, err + } + + fracPartPow = fracPartPow.Mul(expFracPart) + + fracPartPow, err = fracPartPow.ExpTaylor(precision) + if err != nil { + return Decimal{}, err + } + + // Join integer and fractional part, + // base ** (expBase + expFrac) = base ** expBase * base ** expFrac + res := intPartPow.Mul(fracPartPow) + + return res, nil +} + +// PowInt32 returns d to the power of exp, where exp is int32. +// Only returns error when d and exp is 0, thus result is undefined. +// +// When exponent is negative the returned decimal will have maximum precision of PowPrecisionNegativeExponent places after decimal point. +// +// Example: +// +// d1, err := decimal.NewFromFloat(4.0).PowInt32(4) +// d1.String() // output: "256" +// +// d2, err := decimal.NewFromFloat(3.13).PowInt32(5) +// d2.String() // output: "300.4150512793" +func (d Decimal) PowInt32(exp int32) (Decimal, error) { + if d.IsZero() && exp == 0 { + return Decimal{}, fmt.Errorf("cannot represent undefined value of 0**0") + } + + isExpNeg := exp < 0 + exp = abs(exp) + + n, result := d, New(1, 0) + + for exp > 0 { + if exp%2 == 1 { + result = result.Mul(n) + } + exp /= 2 + + if exp > 0 { + n = n.Mul(n) + } + } + + if isExpNeg { + return New(1, 0).DivRound(result, int32(PowPrecisionNegativeExponent)), nil + } + + return result, nil +} + +// PowBigInt returns d to the power of exp, where exp is big.Int. +// Only returns error when d and exp is 0, thus result is undefined. +// +// When exponent is negative the returned decimal will have maximum precision of PowPrecisionNegativeExponent places after decimal point. +// +// Example: +// +// d1, err := decimal.NewFromFloat(3.0).PowBigInt(big.NewInt(3)) +// d1.String() // output: "27" +// +// d2, err := decimal.NewFromFloat(629.25).PowBigInt(big.NewInt(5)) +// d2.String() // output: "98654323103449.5673828125" +func (d Decimal) PowBigInt(exp *big.Int) (Decimal, error) { + return d.powBigIntWithPrecision(exp, int32(PowPrecisionNegativeExponent)) +} + +func (d Decimal) powBigIntWithPrecision(exp *big.Int, precision int32) (Decimal, error) { + if d.IsZero() && exp.Sign() == 0 { + return Decimal{}, fmt.Errorf("cannot represent undefined value of 0**0") + } + + tmpExp := new(big.Int).Set(exp) + isExpNeg := exp.Sign() < 0 + + if isExpNeg { + tmpExp.Abs(tmpExp) + } + + n, result := d, New(1, 0) + + for tmpExp.Sign() > 0 { + if tmpExp.Bit(0) == 1 { + result = result.Mul(n) + } + tmpExp.Rsh(tmpExp, 1) + + if tmpExp.Sign() > 0 { + n = n.Mul(n) + } + } + + if isExpNeg { + return New(1, 0).DivRound(result, precision), nil + } + + return result, nil +} + +// ExpHullAbrham calculates the natural exponent of decimal (e to the power of d) using Hull-Abraham algorithm. +// OverallPrecision argument specifies the overall precision of the result (integer part + decimal part). +// +// ExpHullAbrham is faster than ExpTaylor for small precision values, but it is much slower for large precision values. +// +// Example: +// +// NewFromFloat(26.1).ExpHullAbrham(2).String() // output: "220000000000" +// NewFromFloat(26.1).ExpHullAbrham(20).String() // output: "216314672147.05767284" +func (d Decimal) ExpHullAbrham(overallPrecision uint32) (Decimal, error) { + // Algorithm based on Variable precision exponential function. + // ACM Transactions on Mathematical Software by T. E. Hull & A. Abrham. + if d.IsZero() { + return Decimal{oneInt, 0}, nil + } + + currentPrecision := overallPrecision + + // Algorithm does not work if currentPrecision * 23 < |x|. + // Precision is automatically increased in such cases, so the value can be calculated precisely. + // If newly calculated precision is higher than ExpMaxIterations the currentPrecision will not be changed. + f := d.Abs().InexactFloat64() + if ncp := f / 23; ncp > float64(currentPrecision) && ncp < float64(ExpMaxIterations) { + currentPrecision = uint32(math.Ceil(ncp)) + } + + // fail if abs(d) beyond an over/underflow threshold + overflowThreshold := New(23*int64(currentPrecision), 0) + if d.Abs().Cmp(overflowThreshold) > 0 { + return Decimal{}, fmt.Errorf("over/underflow threshold, exp(x) cannot be calculated precisely") + } + + // Return 1 if abs(d) small enough; this also avoids later over/underflow + overflowThreshold2 := New(9, -int32(currentPrecision)-1) + if d.Abs().Cmp(overflowThreshold2) <= 0 { + return Decimal{oneInt, d.exp}, nil + } + + // t is the smallest integer >= 0 such that the corresponding abs(d/k) < 1 + t := d.exp + int32(d.NumDigits()) // Add d.NumDigits because the paper assumes that d.value [0.1, 1) + + if t < 0 { + t = 0 + } + + k := New(1, t) // reduction factor + r := Decimal{new(big.Int).Set(d.value), d.exp - t} // reduced argument + p := int32(currentPrecision) + t + 2 // precision for calculating the sum + + // Determine n, the number of therms for calculating sum + // use first Newton step (1.435p - 1.182) / log10(p/abs(r)) + // for solving appropriate equation, along with directed + // roundings and simple rational bound for log10(p/abs(r)) + rf := r.Abs().InexactFloat64() + pf := float64(p) + nf := math.Ceil((1.453*pf - 1.182) / math.Log10(pf/rf)) + if nf > float64(ExpMaxIterations) || math.IsNaN(nf) { + return Decimal{}, fmt.Errorf("exact value cannot be calculated in <=ExpMaxIterations iterations") + } + n := int64(nf) + + tmp := New(0, 0) + sum := New(1, 0) + one := New(1, 0) + for i := n - 1; i > 0; i-- { + tmp.value.SetInt64(i) + sum = sum.Mul(r.DivRound(tmp, p)) + sum = sum.Add(one) + } + + ki := k.IntPart() + res := New(1, 0) + for i := ki; i > 0; i-- { + res = res.Mul(sum) + } + + resNumDigits := int32(res.NumDigits()) + + var roundDigits int32 + if resNumDigits > abs(res.exp) { + roundDigits = int32(currentPrecision) - resNumDigits - res.exp + } else { + roundDigits = int32(currentPrecision) + } + + res = res.Round(roundDigits) + + return res, nil +} + +// ExpTaylor calculates the natural exponent of decimal (e to the power of d) using Taylor series expansion. +// Precision argument specifies how precise the result must be (number of digits after decimal point). +// Negative precision is allowed. +// +// ExpTaylor is much faster for large precision values than ExpHullAbrham. +// +// Example: +// +// d, err := NewFromFloat(26.1).ExpTaylor(2).String() +// d.String() // output: "216314672147.06" +// +// NewFromFloat(26.1).ExpTaylor(20).String() +// d.String() // output: "216314672147.05767284062928674083" +// +// NewFromFloat(26.1).ExpTaylor(-10).String() +// d.String() // output: "220000000000" +func (d Decimal) ExpTaylor(precision int32) (Decimal, error) { + // Note(mwoss): Implementation can be optimized by exclusively using big.Int API only + if d.IsZero() { + return Decimal{oneInt, 0}.Round(precision), nil + } + + var epsilon Decimal + var divPrecision int32 + if precision < 0 { + epsilon = New(1, -1) + divPrecision = 8 + } else { + epsilon = New(1, -precision-1) + divPrecision = precision + 1 + } + + decAbs := d.Abs() + pow := d.Abs() + factorial := New(1, 0) + + result := New(1, 0) + + for i := int64(1); ; { + step := pow.DivRound(factorial, divPrecision) + result = result.Add(step) + + // Stop Taylor series when current step is smaller than epsilon + if step.Cmp(epsilon) < 0 { + break + } + + pow = pow.Mul(decAbs) + + i++ + + // Calculate next factorial number or retrieve cached value + if len(factorials) >= int(i) && !factorials[i-1].IsZero() { + factorial = factorials[i-1] + } else { + // To avoid any race conditions, firstly the zero value is appended to a slice to create + // a spot for newly calculated factorial. After that, the zero value is replaced by calculated + // factorial using the index notation. + factorial = factorials[i-2].Mul(New(i, 0)) + factorials = append(factorials, Zero) + factorials[i-1] = factorial + } + } + + if d.Sign() < 0 { + result = New(1, 0).DivRound(result, precision+1) + } + + result = result.Round(precision) + return result, nil +} + +// Ln calculates natural logarithm of d. +// Precision argument specifies how precise the result must be (number of digits after decimal point). +// Negative precision is allowed. +// +// Example: +// +// d1, err := NewFromFloat(13.3).Ln(2) +// d1.String() // output: "2.59" +// +// d2, err := NewFromFloat(579.161).Ln(10) +// d2.String() // output: "6.3615805046" +func (d Decimal) Ln(precision int32) (Decimal, error) { + // Algorithm based on The Use of Iteration Methods for Approximating the Natural Logarithm, + // James F. Epperson, The American Mathematical Monthly, Vol. 96, No. 9, November 1989, pp. 831-835. + if d.IsNegative() { + return Decimal{}, fmt.Errorf("cannot calculate natural logarithm for negative decimals") + } + + if d.IsZero() { + return Decimal{}, fmt.Errorf("cannot represent natural logarithm of 0, result: -infinity") + } + + calcPrecision := precision + 2 + z := d.Copy() + + var comp1, comp3, comp2, comp4, reduceAdjust Decimal + comp1 = z.Sub(Decimal{oneInt, 0}) + comp3 = Decimal{oneInt, -1} + + // for decimal in range [0.9, 1.1] where ln(d) is close to 0 + usePowerSeries := false + + if comp1.Abs().Cmp(comp3) <= 0 { + usePowerSeries = true + } else { + // reduce input decimal to range [0.1, 1) + expDelta := int32(z.NumDigits()) + z.exp + z.exp -= expDelta + + // Input decimal was reduced by factor of 10^expDelta, thus we will need to add + // ln(10^expDelta) = expDelta * ln(10) + // to the result to compensate that + ln10 := ln10.withPrecision(calcPrecision) + reduceAdjust = NewFromInt32(expDelta) + reduceAdjust = reduceAdjust.Mul(ln10) + + comp1 = z.Sub(Decimal{oneInt, 0}) + + if comp1.Abs().Cmp(comp3) <= 0 { + usePowerSeries = true + } else { + // initial estimate using floats + zFloat := z.InexactFloat64() + comp1 = NewFromFloat(math.Log(zFloat)) + } + } + + epsilon := Decimal{oneInt, -calcPrecision} + + if usePowerSeries { + // Power Series - https://en.wikipedia.org/wiki/Logarithm#Power_series + // Calculating n-th term of formula: ln(z+1) = 2 sum [ 1 / (2n+1) * (z / (z+2))^(2n+1) ] + // until the difference between current and next term is smaller than epsilon. + // Coverage quite fast for decimals close to 1.0 + + // z + 2 + comp2 = comp1.Add(Decimal{twoInt, 0}) + // z / (z + 2) + comp3 = comp1.DivRound(comp2, calcPrecision) + // 2 * (z / (z + 2)) + comp1 = comp3.Add(comp3) + comp2 = comp1.Copy() + + for n := 1; ; n++ { + // 2 * (z / (z+2))^(2n+1) + comp2 = comp2.Mul(comp3).Mul(comp3) + + // 1 / (2n+1) * 2 * (z / (z+2))^(2n+1) + comp4 = NewFromInt(int64(2*n + 1)) + comp4 = comp2.DivRound(comp4, calcPrecision) + + // comp1 = 2 sum [ 1 / (2n+1) * (z / (z+2))^(2n+1) ] + comp1 = comp1.Add(comp4) + + if comp4.Abs().Cmp(epsilon) <= 0 { + break + } + } + } else { + // Halley's Iteration. + // Calculating n-th term of formula: a_(n+1) = a_n - 2 * (exp(a_n) - z) / (exp(a_n) + z), + // until the difference between current and next term is smaller than epsilon + var prevStep Decimal + maxIters := calcPrecision*2 + 10 + + for i := int32(0); i < maxIters; i++ { + // exp(a_n) + comp3, _ = comp1.ExpTaylor(calcPrecision) + // exp(a_n) - z + comp2 = comp3.Sub(z) + // 2 * (exp(a_n) - z) + comp2 = comp2.Add(comp2) + // exp(a_n) + z + comp4 = comp3.Add(z) + // 2 * (exp(a_n) - z) / (exp(a_n) + z) + comp3 = comp2.DivRound(comp4, calcPrecision) + // comp1 = a_(n+1) = a_n - 2 * (exp(a_n) - z) / (exp(a_n) + z) + comp1 = comp1.Sub(comp3) + + if prevStep.Add(comp3).IsZero() { + // If iteration steps oscillate we should return early and prevent an infinity loop + // NOTE(mwoss): This should be quite a rare case, returning error is not necessary + break + } + + if comp3.Abs().Cmp(epsilon) <= 0 { + break + } + + prevStep = comp3 + } + } + + comp1 = comp1.Add(reduceAdjust) + + return comp1.Round(precision), nil +} + +// NumDigits returns the number of digits of the decimal coefficient (d.Value) +func (d Decimal) NumDigits() int { + if d.value == nil { + return 1 + } + + if d.value.IsInt64() { + i64 := d.value.Int64() + // restrict fast path to integers with exact conversion to float64 + if i64 <= (1<<53) && i64 >= -(1<<53) { + if i64 == 0 { + return 1 + } + return int(math.Log10(math.Abs(float64(i64)))) + 1 + } + } + + estimatedNumDigits := int(float64(d.value.BitLen()) / math.Log2(10)) + + // estimatedNumDigits (lg10) may be off by 1, need to verify + digitsBigInt := big.NewInt(int64(estimatedNumDigits)) + errorCorrectionUnit := digitsBigInt.Exp(tenInt, digitsBigInt, nil) + + if d.value.CmpAbs(errorCorrectionUnit) >= 0 { + return estimatedNumDigits + 1 + } + + return estimatedNumDigits +} + +// IsInteger returns true when decimal can be represented as an integer value, otherwise, it returns false. +func (d Decimal) IsInteger() bool { + // The most typical case, all decimal with exponent higher or equal 0 can be represented as integer + if d.exp >= 0 { + return true + } + // When the exponent is negative we have to check every number after the decimal place + // If all of them are zeroes, we are sure that given decimal can be represented as an integer + var r big.Int + q := new(big.Int).Set(d.value) + for z := abs(d.exp); z > 0; z-- { + q.QuoRem(q, tenInt, &r) + if r.Cmp(zeroInt) != 0 { + return false + } + } + return true +} + +// Abs calculates absolute value of any int32. Used for calculating absolute value of decimal's exponent. +func abs(n int32) int32 { + if n < 0 { + return -n + } + return n +} + +// Cmp compares the numbers represented by d and d2 and returns: +// +// -1 if d < d2 +// 0 if d == d2 +// +1 if d > d2 +func (d Decimal) Cmp(d2 Decimal) int { + d.ensureInitialized() + d2.ensureInitialized() + + if d.exp == d2.exp { + return d.value.Cmp(d2.value) + } + + rd, rd2 := RescalePair(d, d2) + + return rd.value.Cmp(rd2.value) +} + +// Compare compares the numbers represented by d and d2 and returns: +// +// -1 if d < d2 +// 0 if d == d2 +// +1 if d > d2 +func (d Decimal) Compare(d2 Decimal) int { + return d.Cmp(d2) +} + +// Equal returns whether the numbers represented by d and d2 are equal. +func (d Decimal) Equal(d2 Decimal) bool { + return d.Cmp(d2) == 0 +} + +// Deprecated: Equals is deprecated, please use Equal method instead. +func (d Decimal) Equals(d2 Decimal) bool { + return d.Equal(d2) +} + +// GreaterThan (GT) returns true when d is greater than d2. +func (d Decimal) GreaterThan(d2 Decimal) bool { + return d.Cmp(d2) == 1 +} + +// GreaterThanOrEqual (GTE) returns true when d is greater than or equal to d2. +func (d Decimal) GreaterThanOrEqual(d2 Decimal) bool { + cmp := d.Cmp(d2) + return cmp == 1 || cmp == 0 +} + +// LessThan (LT) returns true when d is less than d2. +func (d Decimal) LessThan(d2 Decimal) bool { + return d.Cmp(d2) == -1 +} + +// LessThanOrEqual (LTE) returns true when d is less than or equal to d2. +func (d Decimal) LessThanOrEqual(d2 Decimal) bool { + cmp := d.Cmp(d2) + return cmp == -1 || cmp == 0 +} + +// Sign returns: +// +// -1 if d < 0 +// 0 if d == 0 +// +1 if d > 0 +func (d Decimal) Sign() int { + if d.value == nil { + return 0 + } + return d.value.Sign() +} + +// IsPositive return +// +// true if d > 0 +// false if d == 0 +// false if d < 0 +func (d Decimal) IsPositive() bool { + return d.Sign() == 1 +} + +// IsNegative return +// +// true if d < 0 +// false if d == 0 +// false if d > 0 +func (d Decimal) IsNegative() bool { + return d.Sign() == -1 +} + +// IsZero return +// +// true if d == 0 +// false if d > 0 +// false if d < 0 +func (d Decimal) IsZero() bool { + return d.Sign() == 0 +} + +// Exponent returns the exponent, or scale component of the decimal. +func (d Decimal) Exponent() int32 { + return d.exp +} + +// Coefficient returns the coefficient of the decimal. It is scaled by 10^Exponent() +func (d Decimal) Coefficient() *big.Int { + d.ensureInitialized() + // we copy the coefficient so that mutating the result does not mutate the Decimal. + return new(big.Int).Set(d.value) +} + +// CoefficientInt64 returns the coefficient of the decimal as int64. It is scaled by 10^Exponent() +// If coefficient cannot be represented in an int64, the result will be undefined. +func (d Decimal) CoefficientInt64() int64 { + d.ensureInitialized() + return d.value.Int64() +} + +// IntPart returns the integer component of the decimal. +func (d Decimal) IntPart() int64 { + scaledD := d.rescale(0) + return scaledD.value.Int64() +} + +// BigInt returns integer component of the decimal as a BigInt. +func (d Decimal) BigInt() *big.Int { + scaledD := d.rescale(0) + return scaledD.value +} + +// BigFloat returns decimal as BigFloat. +// Be aware that casting decimal to BigFloat might cause a loss of precision. +func (d Decimal) BigFloat() *big.Float { + f := &big.Float{} + f.SetString(d.String()) + return f +} + +// Rat returns a rational number representation of the decimal. +func (d Decimal) Rat() *big.Rat { + d.ensureInitialized() + if d.exp <= 0 { + // NOTE(vadim): must negate after casting to prevent int32 overflow + denom := new(big.Int).Exp(tenInt, big.NewInt(-int64(d.exp)), nil) + return new(big.Rat).SetFrac(d.value, denom) + } + + mul := new(big.Int).Exp(tenInt, big.NewInt(int64(d.exp)), nil) + num := new(big.Int).Mul(d.value, mul) + return new(big.Rat).SetFrac(num, oneInt) +} + +// Float64 returns the nearest float64 value for d and a bool indicating +// whether f represents d exactly. +// For more details, see the documentation for big.Rat.Float64 +func (d Decimal) Float64() (f float64, exact bool) { + return d.Rat().Float64() +} + +// InexactFloat64 returns the nearest float64 value for d. +// It doesn't indicate if the returned value represents d exactly. +func (d Decimal) InexactFloat64() float64 { + f, _ := d.Float64() + return f +} + +// String returns the string representation of the decimal +// with the fixed point. +// +// Example: +// +// d := New(-12345, -3) +// println(d.String()) +// +// Output: +// +// -12.345 +func (d Decimal) String() string { + return d.string(true) +} + +// StringFixed returns a rounded fixed-point string with places digits after +// the decimal point. +// +// Example: +// +// NewFromFloat(0).StringFixed(2) // output: "0.00" +// NewFromFloat(0).StringFixed(0) // output: "0" +// NewFromFloat(5.45).StringFixed(0) // output: "5" +// NewFromFloat(5.45).StringFixed(1) // output: "5.5" +// NewFromFloat(5.45).StringFixed(2) // output: "5.45" +// NewFromFloat(5.45).StringFixed(3) // output: "5.450" +// NewFromFloat(545).StringFixed(-1) // output: "550" +func (d Decimal) StringFixed(places int32) string { + rounded := d.Round(places) + return rounded.string(false) +} + +// StringFixedBank returns a banker rounded fixed-point string with places digits +// after the decimal point. +// +// Example: +// +// NewFromFloat(0).StringFixedBank(2) // output: "0.00" +// NewFromFloat(0).StringFixedBank(0) // output: "0" +// NewFromFloat(5.45).StringFixedBank(0) // output: "5" +// NewFromFloat(5.45).StringFixedBank(1) // output: "5.4" +// NewFromFloat(5.45).StringFixedBank(2) // output: "5.45" +// NewFromFloat(5.45).StringFixedBank(3) // output: "5.450" +// NewFromFloat(545).StringFixedBank(-1) // output: "540" +func (d Decimal) StringFixedBank(places int32) string { + rounded := d.RoundBank(places) + return rounded.string(false) +} + +// StringFixedCash returns a Swedish/Cash rounded fixed-point string. For +// more details see the documentation at function RoundCash. +func (d Decimal) StringFixedCash(interval uint8) string { + rounded := d.RoundCash(interval) + return rounded.string(false) +} + +// Round rounds the decimal to places decimal places. +// If places < 0, it will round the integer part to the nearest 10^(-places). +// +// Example: +// +// NewFromFloat(5.45).Round(1).String() // output: "5.5" +// NewFromFloat(545).Round(-1).String() // output: "550" +func (d Decimal) Round(places int32) Decimal { + if d.exp == -places { + return d + } + // truncate to places + 1 + ret := d.rescale(-places - 1) + + // add sign(d) * 0.5 + if ret.value.Sign() < 0 { + ret.value.Sub(ret.value, fiveInt) + } else { + ret.value.Add(ret.value, fiveInt) + } + + // floor for positive numbers, ceil for negative numbers + _, m := ret.value.DivMod(ret.value, tenInt, new(big.Int)) + ret.exp++ + if ret.value.Sign() < 0 && m.Cmp(zeroInt) != 0 { + ret.value.Add(ret.value, oneInt) + } + + return ret +} + +// RoundCeil rounds the decimal towards +infinity. +// +// Example: +// +// NewFromFloat(545).RoundCeil(-2).String() // output: "600" +// NewFromFloat(500).RoundCeil(-2).String() // output: "500" +// NewFromFloat(1.1001).RoundCeil(2).String() // output: "1.11" +// NewFromFloat(-1.454).RoundCeil(1).String() // output: "-1.4" +func (d Decimal) RoundCeil(places int32) Decimal { + if d.exp >= -places { + return d + } + + rescaled := d.rescale(-places) + if d.Equal(rescaled) { + return d + } + + if d.value.Sign() > 0 { + rescaled.value.Add(rescaled.value, oneInt) + } + + return rescaled +} + +// RoundFloor rounds the decimal towards -infinity. +// +// Example: +// +// NewFromFloat(545).RoundFloor(-2).String() // output: "500" +// NewFromFloat(-500).RoundFloor(-2).String() // output: "-500" +// NewFromFloat(1.1001).RoundFloor(2).String() // output: "1.1" +// NewFromFloat(-1.454).RoundFloor(1).String() // output: "-1.5" +func (d Decimal) RoundFloor(places int32) Decimal { + if d.exp >= -places { + return d + } + + rescaled := d.rescale(-places) + if d.Equal(rescaled) { + return d + } + + if d.value.Sign() < 0 { + rescaled.value.Sub(rescaled.value, oneInt) + } + + return rescaled +} + +// RoundUp rounds the decimal away from zero. +// +// Example: +// +// NewFromFloat(545).RoundUp(-2).String() // output: "600" +// NewFromFloat(500).RoundUp(-2).String() // output: "500" +// NewFromFloat(1.1001).RoundUp(2).String() // output: "1.11" +// NewFromFloat(-1.454).RoundUp(1).String() // output: "-1.5" +func (d Decimal) RoundUp(places int32) Decimal { + if d.exp >= -places { + return d + } + + rescaled := d.rescale(-places) + if d.Equal(rescaled) { + return d + } + + if d.value.Sign() > 0 { + rescaled.value.Add(rescaled.value, oneInt) + } else if d.value.Sign() < 0 { + rescaled.value.Sub(rescaled.value, oneInt) + } + + return rescaled +} + +// RoundDown rounds the decimal towards zero. +// +// Example: +// +// NewFromFloat(545).RoundDown(-2).String() // output: "500" +// NewFromFloat(-500).RoundDown(-2).String() // output: "-500" +// NewFromFloat(1.1001).RoundDown(2).String() // output: "1.1" +// NewFromFloat(-1.454).RoundDown(1).String() // output: "-1.4" +func (d Decimal) RoundDown(places int32) Decimal { + if d.exp >= -places { + return d + } + + rescaled := d.rescale(-places) + if d.Equal(rescaled) { + return d + } + return rescaled +} + +// RoundBank rounds the decimal to places decimal places. +// If the final digit to round is equidistant from the nearest two integers the +// rounded value is taken as the even number +// +// If places < 0, it will round the integer part to the nearest 10^(-places). +// +// Examples: +// +// NewFromFloat(5.45).RoundBank(1).String() // output: "5.4" +// NewFromFloat(545).RoundBank(-1).String() // output: "540" +// NewFromFloat(5.46).RoundBank(1).String() // output: "5.5" +// NewFromFloat(546).RoundBank(-1).String() // output: "550" +// NewFromFloat(5.55).RoundBank(1).String() // output: "5.6" +// NewFromFloat(555).RoundBank(-1).String() // output: "560" +func (d Decimal) RoundBank(places int32) Decimal { + + round := d.Round(places) + remainder := d.Sub(round).Abs() + + half := New(5, -places-1) + if remainder.Cmp(half) == 0 && round.value.Bit(0) != 0 { + if round.value.Sign() < 0 { + round.value.Add(round.value, oneInt) + } else { + round.value.Sub(round.value, oneInt) + } + } + + return round +} + +// RoundCash aka Cash/Penny/öre rounding rounds decimal to a specific +// interval. The amount payable for a cash transaction is rounded to the nearest +// multiple of the minimum currency unit available. The following intervals are +// available: 5, 10, 25, 50 and 100; any other number throws a panic. +// +// 5: 5 cent rounding 3.43 => 3.45 +// 10: 10 cent rounding 3.45 => 3.50 (5 gets rounded up) +// 25: 25 cent rounding 3.41 => 3.50 +// 50: 50 cent rounding 3.75 => 4.00 +// 100: 100 cent rounding 3.50 => 4.00 +// +// For more details: https://en.wikipedia.org/wiki/Cash_rounding +func (d Decimal) RoundCash(interval uint8) Decimal { + var iVal *big.Int + switch interval { + case 5: + iVal = twentyInt + case 10: + iVal = tenInt + case 25: + iVal = fourInt + case 50: + iVal = twoInt + case 100: + iVal = oneInt + default: + panic(fmt.Sprintf("Decimal does not support this Cash rounding interval `%d`. Supported: 5, 10, 25, 50, 100", interval)) + } + dVal := Decimal{ + value: iVal, + } + + // TODO: optimize those calculations to reduce the high allocations (~29 allocs). + return d.Mul(dVal).Round(0).Div(dVal).Truncate(2) +} + +// Floor returns the nearest integer value less than or equal to d. +func (d Decimal) Floor() Decimal { + d.ensureInitialized() + + if d.exp >= 0 { + return d + } + + exp := big.NewInt(10) + + // NOTE(vadim): must negate after casting to prevent int32 overflow + exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) + + z := new(big.Int).Div(d.value, exp) + return Decimal{value: z, exp: 0} +} + +// Ceil returns the nearest integer value greater than or equal to d. +func (d Decimal) Ceil() Decimal { + d.ensureInitialized() + + if d.exp >= 0 { + return d + } + + exp := big.NewInt(10) + + // NOTE(vadim): must negate after casting to prevent int32 overflow + exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) + + z, m := new(big.Int).DivMod(d.value, exp, new(big.Int)) + if m.Cmp(zeroInt) != 0 { + z.Add(z, oneInt) + } + return Decimal{value: z, exp: 0} +} + +// Truncate truncates off digits from the number, without rounding. +// +// NOTE: precision is the last digit that will not be truncated (must be >= 0). +// +// Example: +// +// decimal.NewFromString("123.456").Truncate(2).String() // "123.45" +func (d Decimal) Truncate(precision int32) Decimal { + d.ensureInitialized() + if precision >= 0 && -precision > d.exp { + return d.rescale(-precision) + } + return d +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (d *Decimal) UnmarshalJSON(decimalBytes []byte) error { + if string(decimalBytes) == "null" { + return nil + } + + str, err := unquoteIfQuoted(decimalBytes) + if err != nil { + return fmt.Errorf("error decoding string '%s': %s", decimalBytes, err) + } + + decimal, err := NewFromString(str) + *d = decimal + if err != nil { + return fmt.Errorf("error decoding string '%s': %s", str, err) + } + return nil +} + +// MarshalJSON implements the json.Marshaler interface. +func (d Decimal) MarshalJSON() ([]byte, error) { + var str string + if MarshalJSONWithoutQuotes { + str = d.String() + } else { + str = "\"" + d.String() + "\"" + } + return []byte(str), nil +} + +// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. As a string representation +// is already used when encoding to text, this method stores that string as []byte +func (d *Decimal) UnmarshalBinary(data []byte) error { + // Verify we have at least 4 bytes for the exponent. The GOB encoded value + // may be empty. + if len(data) < 4 { + return fmt.Errorf("error decoding binary %v: expected at least 4 bytes, got %d", data, len(data)) + } + + // Extract the exponent + d.exp = int32(binary.BigEndian.Uint32(data[:4])) + + // Extract the value + d.value = new(big.Int) + if err := d.value.GobDecode(data[4:]); err != nil { + return fmt.Errorf("error decoding binary %v: %s", data, err) + } + + return nil +} + +// MarshalBinary implements the encoding.BinaryMarshaler interface. +func (d Decimal) MarshalBinary() (data []byte, err error) { + // exp is written first, but encode value first to know output size + var valueData []byte + if valueData, err = d.value.GobEncode(); err != nil { + return nil, err + } + + // Write the exponent in front, since it's a fixed size + expData := make([]byte, 4, len(valueData)+4) + binary.BigEndian.PutUint32(expData, uint32(d.exp)) + + // Return the byte array + return append(expData, valueData...), nil +} + +// Scan implements the sql.Scanner interface for database deserialization. +func (d *Decimal) Scan(value interface{}) error { + // first try to see if the data is stored in database as a Numeric datatype + switch v := value.(type) { + + case float32: + *d = NewFromFloat(float64(v)) + return nil + + case float64: + // numeric in sqlite3 sends us float64 + *d = NewFromFloat(v) + return nil + + case int64: + // at least in sqlite3 when the value is 0 in db, the data is sent + // to us as an int64 instead of a float64 ... + *d = New(v, 0) + return nil + + case uint64: + // while clickhouse may send 0 in db as uint64 + *d = NewFromUint64(v) + return nil + + default: + // default is trying to interpret value stored as string + str, err := unquoteIfQuoted(v) + if err != nil { + return err + } + *d, err = NewFromString(str) + return err + } +} + +// Value implements the driver.Valuer interface for database serialization. +func (d Decimal) Value() (driver.Value, error) { + return d.String(), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface for XML +// deserialization. +func (d *Decimal) UnmarshalText(text []byte) error { + str := string(text) + + dec, err := NewFromString(str) + *d = dec + if err != nil { + return fmt.Errorf("error decoding string '%s': %s", str, err) + } + + return nil +} + +// MarshalText implements the encoding.TextMarshaler interface for XML +// serialization. +func (d Decimal) MarshalText() (text []byte, err error) { + return []byte(d.String()), nil +} + +// GobEncode implements the gob.GobEncoder interface for gob serialization. +func (d Decimal) GobEncode() ([]byte, error) { + return d.MarshalBinary() +} + +// GobDecode implements the gob.GobDecoder interface for gob serialization. +func (d *Decimal) GobDecode(data []byte) error { + return d.UnmarshalBinary(data) +} + +// StringScaled first scales the decimal then calls .String() on it. +// +// Deprecated: buggy and unintuitive. Use StringFixed instead. +func (d Decimal) StringScaled(exp int32) string { + return d.rescale(exp).String() +} + +func (d Decimal) string(trimTrailingZeros bool) string { + if d.exp >= 0 { + return d.rescale(0).value.String() + } + + abs := new(big.Int).Abs(d.value) + str := abs.String() + + var intPart, fractionalPart string + + // NOTE(vadim): this cast to int will cause bugs if d.exp == INT_MIN + // and you are on a 32-bit machine. Won't fix this super-edge case. + dExpInt := int(d.exp) + if len(str) > -dExpInt { + intPart = str[:len(str)+dExpInt] + fractionalPart = str[len(str)+dExpInt:] + } else { + intPart = "0" + + num0s := -dExpInt - len(str) + fractionalPart = strings.Repeat("0", num0s) + str + } + + if trimTrailingZeros { + i := len(fractionalPart) - 1 + for ; i >= 0; i-- { + if fractionalPart[i] != '0' { + break + } + } + fractionalPart = fractionalPart[:i+1] + } + + number := intPart + if len(fractionalPart) > 0 { + number += "." + fractionalPart + } + + if d.value.Sign() < 0 { + return "-" + number + } + + return number +} + +func (d *Decimal) ensureInitialized() { + if d.value == nil { + d.value = new(big.Int) + } +} + +// Min returns the smallest Decimal that was passed in the arguments. +// +// To call this function with an array, you must do: +// +// Min(arr[0], arr[1:]...) +// +// This makes it harder to accidentally call Min with 0 arguments. +func Min(first Decimal, rest ...Decimal) Decimal { + ans := first + for _, item := range rest { + if item.Cmp(ans) < 0 { + ans = item + } + } + return ans +} + +// Max returns the largest Decimal that was passed in the arguments. +// +// To call this function with an array, you must do: +// +// Max(arr[0], arr[1:]...) +// +// This makes it harder to accidentally call Max with 0 arguments. +func Max(first Decimal, rest ...Decimal) Decimal { + ans := first + for _, item := range rest { + if item.Cmp(ans) > 0 { + ans = item + } + } + return ans +} + +// Sum returns the combined total of the provided first and rest Decimals +func Sum(first Decimal, rest ...Decimal) Decimal { + total := first + for _, item := range rest { + total = total.Add(item) + } + + return total +} + +// Avg returns the average value of the provided first and rest Decimals +func Avg(first Decimal, rest ...Decimal) Decimal { + count := New(int64(len(rest)+1), 0) + sum := Sum(first, rest...) + return sum.Div(count) +} + +// RescalePair rescales two decimals to common exponential value (minimal exp of both decimals) +func RescalePair(d1 Decimal, d2 Decimal) (Decimal, Decimal) { + d1.ensureInitialized() + d2.ensureInitialized() + + if d1.exp < d2.exp { + return d1, d2.rescale(d1.exp) + } else if d1.exp > d2.exp { + return d1.rescale(d2.exp), d2 + } + + return d1, d2 +} + +func unquoteIfQuoted(value interface{}) (string, error) { + var bytes []byte + + switch v := value.(type) { + case string: + bytes = []byte(v) + case []byte: + bytes = v + default: + return "", fmt.Errorf("could not convert value '%+v' to byte array of type '%T'", value, value) + } + + // If the amount is quoted, strip the quotes + if len(bytes) > 2 && bytes[0] == '"' && bytes[len(bytes)-1] == '"' { + bytes = bytes[1 : len(bytes)-1] + } + return string(bytes), nil +} + +// NullDecimal represents a nullable decimal with compatibility for +// scanning null values from the database. +type NullDecimal struct { + Decimal Decimal + Valid bool +} + +func NewNullDecimal(d Decimal) NullDecimal { + return NullDecimal{ + Decimal: d, + Valid: true, + } +} + +// Scan implements the sql.Scanner interface for database deserialization. +func (d *NullDecimal) Scan(value interface{}) error { + if value == nil { + d.Valid = false + return nil + } + d.Valid = true + return d.Decimal.Scan(value) +} + +// Value implements the driver.Valuer interface for database serialization. +func (d NullDecimal) Value() (driver.Value, error) { + if !d.Valid { + return nil, nil + } + return d.Decimal.Value() +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (d *NullDecimal) UnmarshalJSON(decimalBytes []byte) error { + if string(decimalBytes) == "null" { + d.Valid = false + return nil + } + d.Valid = true + return d.Decimal.UnmarshalJSON(decimalBytes) +} + +// MarshalJSON implements the json.Marshaler interface. +func (d NullDecimal) MarshalJSON() ([]byte, error) { + if !d.Valid { + return []byte("null"), nil + } + return d.Decimal.MarshalJSON() +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface for XML +// deserialization +func (d *NullDecimal) UnmarshalText(text []byte) error { + str := string(text) + + // check for empty XML or XML without body e.g., + if str == "" { + d.Valid = false + return nil + } + if err := d.Decimal.UnmarshalText(text); err != nil { + d.Valid = false + return err + } + d.Valid = true + return nil +} + +// MarshalText implements the encoding.TextMarshaler interface for XML +// serialization. +func (d NullDecimal) MarshalText() (text []byte, err error) { + if !d.Valid { + return []byte{}, nil + } + return d.Decimal.MarshalText() +} + +// Trig functions + +// Atan returns the arctangent, in radians, of x. +func (d Decimal) Atan() Decimal { + if d.Equal(NewFromFloat(0.0)) { + return d + } + if d.GreaterThan(NewFromFloat(0.0)) { + return d.satan() + } + return d.Neg().satan().Neg() +} + +func (d Decimal) xatan() Decimal { + P0 := NewFromFloat(-8.750608600031904122785e-01) + P1 := NewFromFloat(-1.615753718733365076637e+01) + P2 := NewFromFloat(-7.500855792314704667340e+01) + P3 := NewFromFloat(-1.228866684490136173410e+02) + P4 := NewFromFloat(-6.485021904942025371773e+01) + Q0 := NewFromFloat(2.485846490142306297962e+01) + Q1 := NewFromFloat(1.650270098316988542046e+02) + Q2 := NewFromFloat(4.328810604912902668951e+02) + Q3 := NewFromFloat(4.853903996359136964868e+02) + Q4 := NewFromFloat(1.945506571482613964425e+02) + z := d.Mul(d) + b1 := P0.Mul(z).Add(P1).Mul(z).Add(P2).Mul(z).Add(P3).Mul(z).Add(P4).Mul(z) + b2 := z.Add(Q0).Mul(z).Add(Q1).Mul(z).Add(Q2).Mul(z).Add(Q3).Mul(z).Add(Q4) + z = b1.Div(b2) + z = d.Mul(z).Add(d) + return z +} + +// satan reduces its argument (known to be positive) +// to the range [0, 0.66] and calls xatan. +func (d Decimal) satan() Decimal { + Morebits := NewFromFloat(6.123233995736765886130e-17) // pi/2 = PIO2 + Morebits + Tan3pio8 := NewFromFloat(2.41421356237309504880) // tan(3*pi/8) + pi := NewFromFloat(3.14159265358979323846264338327950288419716939937510582097494459) + + if d.LessThanOrEqual(NewFromFloat(0.66)) { + return d.xatan() + } + if d.GreaterThan(Tan3pio8) { + return pi.Div(NewFromFloat(2.0)).Sub(NewFromFloat(1.0).Div(d).xatan()).Add(Morebits) + } + return pi.Div(NewFromFloat(4.0)).Add((d.Sub(NewFromFloat(1.0)).Div(d.Add(NewFromFloat(1.0)))).xatan()).Add(NewFromFloat(0.5).Mul(Morebits)) +} + +// sin coefficients +var _sin = [...]Decimal{ + NewFromFloat(1.58962301576546568060e-10), // 0x3de5d8fd1fd19ccd + NewFromFloat(-2.50507477628578072866e-8), // 0xbe5ae5e5a9291f5d + NewFromFloat(2.75573136213857245213e-6), // 0x3ec71de3567d48a1 + NewFromFloat(-1.98412698295895385996e-4), // 0xbf2a01a019bfdf03 + NewFromFloat(8.33333333332211858878e-3), // 0x3f8111111110f7d0 + NewFromFloat(-1.66666666666666307295e-1), // 0xbfc5555555555548 +} + +// Sin returns the sine of the radian argument x. +func (d Decimal) Sin() Decimal { + PI4A := NewFromFloat(7.85398125648498535156e-1) // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B := NewFromFloat(3.77489470793079817668e-8) // 0x3e64442d00000000, + PI4C := NewFromFloat(2.69515142907905952645e-15) // 0x3ce8469898cc5170, + M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi + + if d.Equal(NewFromFloat(0.0)) { + return d + } + // make argument positive but save the sign + sign := false + if d.LessThan(NewFromFloat(0.0)) { + d = d.Neg() + sign = true + } + + j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle + y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float + + // map zeros to origin + if j&1 == 1 { + j++ + y = y.Add(NewFromFloat(1.0)) + } + j &= 7 // octant modulo 2Pi radians (360 degrees) + // reflect in x axis + if j > 3 { + sign = !sign + j -= 4 + } + z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic + zz := z.Mul(z) + + if j == 1 || j == 2 { + w := zz.Mul(zz).Mul(_cos[0].Mul(zz).Add(_cos[1]).Mul(zz).Add(_cos[2]).Mul(zz).Add(_cos[3]).Mul(zz).Add(_cos[4]).Mul(zz).Add(_cos[5])) + y = NewFromFloat(1.0).Sub(NewFromFloat(0.5).Mul(zz)).Add(w) + } else { + y = z.Add(z.Mul(zz).Mul(_sin[0].Mul(zz).Add(_sin[1]).Mul(zz).Add(_sin[2]).Mul(zz).Add(_sin[3]).Mul(zz).Add(_sin[4]).Mul(zz).Add(_sin[5]))) + } + if sign { + y = y.Neg() + } + return y +} + +// cos coefficients +var _cos = [...]Decimal{ + NewFromFloat(-1.13585365213876817300e-11), // 0xbda8fa49a0861a9b + NewFromFloat(2.08757008419747316778e-9), // 0x3e21ee9d7b4e3f05 + NewFromFloat(-2.75573141792967388112e-7), // 0xbe927e4f7eac4bc6 + NewFromFloat(2.48015872888517045348e-5), // 0x3efa01a019c844f5 + NewFromFloat(-1.38888888888730564116e-3), // 0xbf56c16c16c14f91 + NewFromFloat(4.16666666666665929218e-2), // 0x3fa555555555554b +} + +// Cos returns the cosine of the radian argument x. +func (d Decimal) Cos() Decimal { + + PI4A := NewFromFloat(7.85398125648498535156e-1) // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B := NewFromFloat(3.77489470793079817668e-8) // 0x3e64442d00000000, + PI4C := NewFromFloat(2.69515142907905952645e-15) // 0x3ce8469898cc5170, + M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi + + // make argument positive + sign := false + if d.LessThan(NewFromFloat(0.0)) { + d = d.Neg() + } + + j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle + y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float + + // map zeros to origin + if j&1 == 1 { + j++ + y = y.Add(NewFromFloat(1.0)) + } + j &= 7 // octant modulo 2Pi radians (360 degrees) + // reflect in x axis + if j > 3 { + sign = !sign + j -= 4 + } + if j > 1 { + sign = !sign + } + + z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic + zz := z.Mul(z) + + if j == 1 || j == 2 { + y = z.Add(z.Mul(zz).Mul(_sin[0].Mul(zz).Add(_sin[1]).Mul(zz).Add(_sin[2]).Mul(zz).Add(_sin[3]).Mul(zz).Add(_sin[4]).Mul(zz).Add(_sin[5]))) + } else { + w := zz.Mul(zz).Mul(_cos[0].Mul(zz).Add(_cos[1]).Mul(zz).Add(_cos[2]).Mul(zz).Add(_cos[3]).Mul(zz).Add(_cos[4]).Mul(zz).Add(_cos[5])) + y = NewFromFloat(1.0).Sub(NewFromFloat(0.5).Mul(zz)).Add(w) + } + if sign { + y = y.Neg() + } + return y +} + +var _tanP = [...]Decimal{ + NewFromFloat(-1.30936939181383777646e+4), // 0xc0c992d8d24f3f38 + NewFromFloat(1.15351664838587416140e+6), // 0x413199eca5fc9ddd + NewFromFloat(-1.79565251976484877988e+7), // 0xc1711fead3299176 +} +var _tanQ = [...]Decimal{ + NewFromFloat(1.00000000000000000000e+0), + NewFromFloat(1.36812963470692954678e+4), //0x40cab8a5eeb36572 + NewFromFloat(-1.32089234440210967447e+6), //0xc13427bc582abc96 + NewFromFloat(2.50083801823357915839e+7), //0x4177d98fc2ead8ef + NewFromFloat(-5.38695755929454629881e+7), //0xc189afe03cbe5a31 +} + +// Tan returns the tangent of the radian argument x. +func (d Decimal) Tan() Decimal { + + PI4A := NewFromFloat(7.85398125648498535156e-1) // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B := NewFromFloat(3.77489470793079817668e-8) // 0x3e64442d00000000, + PI4C := NewFromFloat(2.69515142907905952645e-15) // 0x3ce8469898cc5170, + M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi + + if d.Equal(NewFromFloat(0.0)) { + return d + } + + // make argument positive but save the sign + sign := false + if d.LessThan(NewFromFloat(0.0)) { + d = d.Neg() + sign = true + } + + j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle + y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float + + // map zeros to origin + if j&1 == 1 { + j++ + y = y.Add(NewFromFloat(1.0)) + } + + z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic + zz := z.Mul(z) + + if zz.GreaterThan(NewFromFloat(1e-14)) { + w := zz.Mul(_tanP[0].Mul(zz).Add(_tanP[1]).Mul(zz).Add(_tanP[2])) + x := zz.Add(_tanQ[1]).Mul(zz).Add(_tanQ[2]).Mul(zz).Add(_tanQ[3]).Mul(zz).Add(_tanQ[4]) + y = z.Add(z.Mul(w.Div(x))) + } else { + y = z + } + if j&2 == 2 { + y = NewFromFloat(-1.0).Div(y) + } + if sign { + y = y.Neg() + } + return y +} diff --git a/vendor/github.com/shopspring/decimal/rounding.go b/vendor/github.com/shopspring/decimal/rounding.go new file mode 100644 index 0000000000..d4b0cd0079 --- /dev/null +++ b/vendor/github.com/shopspring/decimal/rounding.go @@ -0,0 +1,160 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Multiprecision decimal numbers. +// For floating-point formatting only; not general purpose. +// Only operations are assign and (binary) left/right shift. +// Can do binary floating point in multiprecision decimal precisely +// because 2 divides 10; cannot do decimal floating point +// in multiprecision binary precisely. + +package decimal + +type floatInfo struct { + mantbits uint + expbits uint + bias int +} + +var float32info = floatInfo{23, 8, -127} +var float64info = floatInfo{52, 11, -1023} + +// roundShortest rounds d (= mant * 2^exp) to the shortest number of digits +// that will let the original floating point value be precisely reconstructed. +func roundShortest(d *decimal, mant uint64, exp int, flt *floatInfo) { + // If mantissa is zero, the number is zero; stop now. + if mant == 0 { + d.nd = 0 + return + } + + // Compute upper and lower such that any decimal number + // between upper and lower (possibly inclusive) + // will round to the original floating point number. + + // We may see at once that the number is already shortest. + // + // Suppose d is not denormal, so that 2^exp <= d < 10^dp. + // The closest shorter number is at least 10^(dp-nd) away. + // The lower/upper bounds computed below are at distance + // at most 2^(exp-mantbits). + // + // So the number is already shortest if 10^(dp-nd) > 2^(exp-mantbits), + // or equivalently log2(10)*(dp-nd) > exp-mantbits. + // It is true if 332/100*(dp-nd) >= exp-mantbits (log2(10) > 3.32). + minexp := flt.bias + 1 // minimum possible exponent + if exp > minexp && 332*(d.dp-d.nd) >= 100*(exp-int(flt.mantbits)) { + // The number is already shortest. + return + } + + // d = mant << (exp - mantbits) + // Next highest floating point number is mant+1 << exp-mantbits. + // Our upper bound is halfway between, mant*2+1 << exp-mantbits-1. + upper := new(decimal) + upper.Assign(mant*2 + 1) + upper.Shift(exp - int(flt.mantbits) - 1) + + // d = mant << (exp - mantbits) + // Next lowest floating point number is mant-1 << exp-mantbits, + // unless mant-1 drops the significant bit and exp is not the minimum exp, + // in which case the next lowest is mant*2-1 << exp-mantbits-1. + // Either way, call it mantlo << explo-mantbits. + // Our lower bound is halfway between, mantlo*2+1 << explo-mantbits-1. + var mantlo uint64 + var explo int + if mant > 1<= d.nd { + break + } + li := ui - upper.dp + lower.dp + l := byte('0') // lower digit + if li >= 0 && li < lower.nd { + l = lower.d[li] + } + m := byte('0') // middle digit + if mi >= 0 { + m = d.d[mi] + } + u := byte('0') // upper digit + if ui < upper.nd { + u = upper.d[ui] + } + + // Okay to round down (truncate) if lower has a different digit + // or if lower is inclusive and is exactly the result of rounding + // down (i.e., and we have reached the final digit of lower). + okdown := l != m || inclusive && li+1 == lower.nd + + switch { + case upperdelta == 0 && m+1 < u: + // Example: + // m = 12345xxx + // u = 12347xxx + upperdelta = 2 + case upperdelta == 0 && m != u: + // Example: + // m = 12345xxx + // u = 12346xxx + upperdelta = 1 + case upperdelta == 1 && (m != '9' || u != '0'): + // Example: + // m = 1234598x + // u = 1234600x + upperdelta = 2 + } + // Okay to round up if upper has a different digit and either upper + // is inclusive or upper is bigger than the result of rounding up. + okup := upperdelta > 0 && (inclusive || upperdelta > 1 || ui+1 < upper.nd) + + // If it's okay to do either, then round to the nearest one. + // If it's okay to do only one, do it. + switch { + case okdown && okup: + d.Round(mi + 1) + return + case okdown: + d.RoundDown(mi + 1) + return + case okup: + d.RoundUp(mi + 1) + return + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/.dockerignore b/vendor/github.com/skycoin/skycoin/.dockerignore new file mode 100644 index 0000000000..fbb5916ab0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/.dockerignore @@ -0,0 +1,32 @@ +.DS_Store +.DS_Store? +._* +.Trashes +.vscode +.github +.dockerignore +.editorconfig +.gitignore +.golangci.yml +.travis.yml + +*.md +*.asc +*.class +*.dll +*.exe +*.o +*.so + + +Makefile +run-client.sh +run-daemon.sh +Gopkg.lock +Gopkg.toml + +**/node_modules/* +**/electron/* +**/ci-scripts/* +**/coverage/* + diff --git a/vendor/github.com/skycoin/skycoin/.editorconfig b/vendor/github.com/skycoin/skycoin/.editorconfig new file mode 100644 index 0000000000..c48ee69112 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/.editorconfig @@ -0,0 +1,32 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +# Use 4 spaces for the Python files +[*.py] +indent_size = 4 +max_line_length = 80 + +# The JSON files contain newlines inconsistently +[*.json] +insert_final_newline = ignore + +# Minified JavaScript files shouldn't be changed +[**.min.js] +indent_style = ignore +insert_final_newline = ignore + +# Makefiles always use tabs for indentation +[Makefile] +indent_style = tab + +[*.md] +trim_trailing_whitespace = false + diff --git a/vendor/github.com/skycoin/skycoin/.gitignore b/vendor/github.com/skycoin/skycoin/.gitignore new file mode 100644 index 0000000000..8bf4d11371 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/.gitignore @@ -0,0 +1,160 @@ +# Compiled source # +################### +*.class +*.dll +*.exe +*.o +*.so + +sb + +build +data +pkg +bin +_obj + +main + +test_node + +*~ +client + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip + +# Logs and databases # +###################### +*.log +*.sql +*.sqlite + +# OS generated files # +###################### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +Icon? +ehthumbs.db +Thumbs.db + +*.pyx +#build +*~ + +*.orig + +.cache +release +.bin + +.skycoin + +*.prof +*.out + +# Binaries +/skycoind +/skycoin +/skycoindev +/blockchain +/generate_cert +/address_gen +/skycoin-integration + +*.pem + +# Deprecated +_deprecated/ + +blockchain.bin +blockchain.sigs +master.keys +*.bak +benefactor-wallet.json +masterdata/ +.genv + +src/gui/static/dev +src/mesh/gui/static/dev + +npm-debug.log + +node_modules + +electron/release +electron/.cache +electron/.electron_cache +electron/node_modules +electron/.gox_output +electron/.electron_output +electron/.standalone_output +electron/.daemon_output +electron/.cli_output +# Do not ignore the icons folder +!electron/build +!electron/build/icons + +.vscode/ + +#File generation sublime text +.do.cfg +.do.state +skycoin.do + +*.swo +*.swp + +src/mesh/TODO + +.idea/ + +*.iml +*.test +coverage.html +coverage/ +*.coverage.out + +src/api/integration/wallets/ +src/api/integration/wallets/ + +# FIXME: see #1027 - Temporary solution to deal with generated file +include/libskycoin.h + +# Eclipse temp files +.cproject +.metadata/** +.project + +# Generated docs +docs/libc/latex +docs/libc/man +docs/libc/xml + + +# Do not ignore Docker Cloud build +!hooks/build + +*.prof +*.profile +*.cpuprofile +*.memprofile + +# cli fiberAddressGen default output +addresses.txt +seeds.csv + +histogram diff --git a/vendor/github.com/skycoin/skycoin/.golangci.yml b/vendor/github.com/skycoin/skycoin/.golangci.yml new file mode 100644 index 0000000000..b54a87cfb9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/.golangci.yml @@ -0,0 +1,198 @@ +# This file contains all available configuration options +# Modified for linting cmd/ and pkg/ + +# options for analysis running +run: + # default concurrency is a available CPU number + concurrency: 4 + + # timeout for analysis, e.g. 30s, 5m, default is 1m + deadline: 3m + + # exit code when at least one issue was found, default is 1 + issues-exit-code: 1 + + # include test files or not, default is true + tests: true + + # list of build tags, all linters use it. Default is empty list. + build-tags: + + # which dirs to skip: they won't be analyzed; + # can use regexp here: generated.*, regexp is applied on full path; + # default value is empty list, but next dirs are always skipped independently + # from this option's value: + # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + skip-dirs: + + # which files to skip: they will be analyzed, but issues from them + # won't be reported. Default value is empty list, but there is + # no need to include all autogenerated files, we confidently recognize + # autogenerated files. If it's not please let us know. + skip-files: + + # by default isn't set. If set we pass it to "go list -mod={option}". From "go help modules": + # If invoked with -mod=readonly, the go command is disallowed from the implicit + # automatic updating of go.mod described above. Instead, it fails when any changes + # to go.mod are needed. This setting is most useful to check that go.mod does + # not need updates, such as in a continuous integration and testing system. + # If invoked with -mod=vendor, the go command assumes that the vendor + # directory holds the correct copies of dependencies and ignores + # the dependency descriptions in go.mod. + modules-download-mode: vendor + + +# output configuration options +output: + # colored-line-number|line-number|json|tab|checkstyle, default is "colored-line-number" + formats: colored-line-number + + # print lines of code with issue, default is true + print-issued-lines: true + + # print linter name in the end of issue text, default is true + print-linter-name: true + + +# all available settings of specific linters +linters-settings: + errcheck: + # report about not checking of errors in type assetions: `a := b.(MyStruct)`; + # default is false: such cases aren't reported by default. + check-type-assertions: false + + # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; + # default is false: such cases aren't reported by default. + check-blank: true + govet: + # report about shadowed variables + shadow: true + # Obtain type information from installed (to $GOPATH/pkg) package files: + # golangci-lint will execute `go install -i` and `go test -i` for analyzed packages + # before analyzing them. + # By default this option is disabled and govet gets type information by loader from source code. + # Loading from source code is slow, but it's done only once for all linters. + # Go-installing of packages first time is much slower than loading them from source code, + # therefore this option is disabled by default. + # But repeated installation is fast in go >= 1.10 because of build caching. + # Enable this option only if all conditions are met: + # 1. you use only "fast" linters (--fast e.g.): no program loading occurs + # 2. you use go >= 1.10 + # 3. you do repeated runs (false for CI) or cache $GOPATH/pkg or `go env GOCACHE` dir in CI. + use-installed-packages: false + golint: + # minimal confidence for issues, default is 0.8 + min-confidence: 0.8 + gofmt: + # simplify code: gofmt with `-s` option, true by default + simplify: true + gocyclo: + # minimal code complexity to report, 30 by default (but we recommend 10-20) + min-complexity: 10 + maligned: + # print struct with more effective memory layout or not, false by default + suggest-new: true + dupl: + # tokens count to trigger issue, 150 by default + threshold: 100 + goconst: + # minimal length of string constant, 3 by default + min-len: 3 + # minimal occurrences count to trigger, 3 by default + min-occurrences: 3 + depguard: + list-type: blacklist + include-go-root: false + packages: + - github.com/pkg/errors + misspell: + # Correct spellings using locale preferences for US or UK. + # Default is to use a neutral variety of English. + # Setting locale to US will correct the British spelling of 'colour' to 'color'. + locale: US + lll: + # max line length, lines longer will be reported. Default is 120. + # '\t' is counted as 1 character by default, and can be changed with the tab-width option + line-length: 120 + # tab width in spaces. Default to 1. + tab-width: 1 + unused: + # treat code as a program (not a library) and report unused exported identifiers; default is false. + # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find funcs usages. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + unparam: + # call graph construction algorithm (cha, rta). In general, use cha for libraries, + # and rta for programs with main packages. Default is cha. + algo: cha + + # Inspect exported functions, default is false. Set to true if no external program/library imports your code. + # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find external interfaces. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + nakedret: + # make an issue if func has more lines of code than this setting and it has naked returns; default is 30 + max-func-lines: 30 + prealloc: + # XXX: we don't recommend using this linter before doing performance profiling. + # For most programs usage of prealloc will be a premature optimization. + + # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. + # True by default. + simple: true + range-loops: true # Report preallocation suggestions on range loops, true by default + for-loops: false # Report preallocation suggestions on for loops, false by default + goimports: + local-prefixes: github.com/skycoin/skycoin + + +linters: + enable: + - revive + - goimports + - unparam + - errcheck + - gosimple + - staticcheck + - ineffassign + - typecheck + - gosec + - gosimple + - staticcheck + - unused + - misspell + - nakedret + enable-all: false + disable-all: true + presets: + fast: false + + +issues: + # List of regexps of issue texts to exclude, empty list by default. + # But independently from this option we use default exclude patterns, + # it can be disabled by `exclude-use-default: false`. To list all + # excluded by default patterns execute `golangci-lint run --help` + exclude: + + # Independently from option `exclude` we use default exclude patterns, + # it can be disabled by this option. To list all + # excluded by default patterns execute `golangci-lint run --help`. + # Default value for this option is true. + exclude-use-default: false + + # Maximum issues count per one linter. Set to 0 to disable. Default is 50. + max-per-linter: 0 + + # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. + max-same: 0 + + # Show only new issues: if there are unstaged changes or untracked files, + # only those changes are analyzed, else only changes in HEAD~ are analyzed. + # It's a super-useful option for integration of golangci-lint into existing + # large codebase. It's not practical to fix all existing issues at the moment + # of integration: much better don't allow issues in new code. + # Default is false. + new: false diff --git a/vendor/github.com/skycoin/skycoin/CHANGELOG.md b/vendor/github.com/skycoin/skycoin/CHANGELOG.md new file mode 100644 index 0000000000..8eb75995b1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/CHANGELOG.md @@ -0,0 +1,641 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## Unreleased + +### Added + +- Add `/api/v1/transactions/num` to get total transactions number +- Add param `private-keys` to CLI commands `walletCreate`, `walletCreateTemp`, and `walletNewAddresses`. +- Add param `private-keys` to APIs `/api/v1/wallet/create`, `/api/v1/wallet/createTemp`, and `/api/v1/wallet/newAddress`. +- Add `CLI walletCreateTemp` command to create a temporary wallet. +- Add `POST /api/v1/wallet/createTemp` API to create a temporary wallet. Warning: The temporary wallet would not be + persisted after restarting. +- GUI add format to the number input fields. Now the numeric input fields add commas to the numbers, to make + them easier to read. Now the fields show 1,111,111 instead of just 1111111. +- Add `-max-last-blocks-count` flag to limit the maximum number of blocks the api `/api/v1/last_blocks` can return. + This also fixes the `out of memory` panic. The default maximum number is `256`. +- Add `src_txid` to verbose transaction inputs, affected apis: `/api/v1/transaction`, `/api/v1/transactions` `/api/v1/block` `/api/v1/blocks` `/api/v1/pendingTxs` +- Add `calculated_hours` to `/api/v1/uxout` and `/api/v1/address_uxouts`. +- Add go version of go1.14 support +- Add `POST /api/v1/wallet/scan` API to scan wallet addresses ahead, default scan number is `20`. +- Add `CLI walletScanAddresses` command to scan wallet addresses ahead. +- Add `GET /api/v2/transactions` API to get transactions with pagination. +- Add `-max-incoming-connection` flag to control the maximum allowed incoming connections. +- Add `qr_uri_prefix` field to `/api/v1/health` endpoint. + +### Fixed + +- #2579 Add emergency wipe option for the Skywallet. +- #1109 Temporary wallet load feature + +### changed + +- Move package `src/wallet/crypto` to `src/cipher/crypto` as each sub-package in `src/wallet` folder + represents a wallet type we support. Since `src/wallet/crypto` is not a wallet type, it may confuse people. + Therefore, it will be moved to `src/cipher/crypto`. +- GUI get the uri prefix from the api +- GUI update electron and electron builder. +- GUI General improvements for the front-end, see details in [#2589](https://github.com/skycoin/skycoin/pull/2589) +- GUI exchange page has been disabled, because the Swaplab integration is not working. The code was not removed +- CLI command `listWallets` removed the argument of `[directory]`, it is not being used at all. +- API change `POST /api/v1/wallet/encrypt` to encrypt wallet that has no 'cryptoType' field with the default crypto type. +- CLI command `/encryptWallet/decryptWallet` shows wallet details after encryption/decryption, it used to show nothing if wallet is decrypted successfully. +- CLI command `walletBalance, createRawTransactionV2, showSeed` use wallet file name to load wallet instead of + the full path of the wallet file. For example, For example, previously, to check wallet + balance we need to run: + `skycoin-cli walletBalance $HOME/.skycoin/wallets/wallet-with-balance.wlt`, + Now, we can run: + `skycoin-cli walletbalance wallet-with-balance.wlt`. +- CLI command `createRawTransactionV2` accepts wallet filename instead of the full path of the wallet file. +- Changes on the CLI command `walletCreate`: + * Removed `-wallet-file` flag, it was used to specific the wallet file name, and now the filename + will be automatically generated. + * The command result will be consistent with the API response of `/api/v1/wallet/create`. + * Encrypt the wallet by default, you will be prompted to enter a password to encrypt the wallet. + * Remove flags of `coin/c` `crypto-type/x`. + * Add flag `scan` to scan ahead addresses in the wallet that have history transactions. +- CLI command walletKeyExport -p flag is replaced with --path, and -p will be used as a shorthand of --password. +- CLI command `encryptWallet/decryptWallet` will only return none-sensitive data. Data like the seed, secrets and private keys will no longer be returned. +- Include change addresses for a bip44 wallet of the endpoint `/api/v1/wallet`. + +### Removed +- Removed endpoint `/api/v2/metrics`. The prometheus dependency was removed, this endpoint will no long be supported. + +## [0.27.0] - 2019-11-26 + +### Added + +- Add `createRawTransactionV2` CLI command, which calls the API of `/wallet/transaction` to create the transaction and can create then unsigned transaction. Once the API's performance issue has been fixed, we will replace the `createRawTransaction` with it. +- Add `signTransaction` CLI command to sign transaction. +- Do windows electron builds by travis and abandon the appveyor +- Migrate `skycoin.net` to `skycoin.com` +- Migrate project path to `SkycoinProject/skycoin` +- Use transaction history when scanning wallet addresses, instead of the current address balance +- Document the daemon's CLI options +- Add the ability to save transaction notes +- Add CLI `encodeJsonTransaction` command to retrieve raw transaction given its JSON representation +- Add `package bip44`, implementing the bip44 spec https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki +- Codesign daemon and standalone binaries +- Add a guided method for entering the seeds in the GUI +- Add new wallet type `collection` for wallets that are an arbitrary collection of private keys, rather than generated from a seed +- Add new wallet type `bip44` for hierarchical deterministic (HD) wallets obeying the bip44 protocol. + The Skycoin bip44 `coin` number is `8000`. + `bip44` wallets avoid address reuse, generating a new change address for each transaction. + Affects APIs are `POST /api/v1/wallet`, `GET /api/v1/wallets`, `GET /api/v1/wallet`, `POST /api/v1/wallet/seed` and `POST /api/v1/wallet/recover`. + Refer to the [API documentation](./src/api/README.md) for API changes. + `bip44` wallets support bip39 "seed passphrases". + More details are explained in https://github.com/skycoin/skycoin/wiki/Wallet-File-Formats-and-Types +- `cli walletCreate` support for `bip44` wallets added +- Add `bip44_coin` field to `GET /api/v1/health` `fiber` params +- Add the "bulk send" option to the GUI advanced form +- Add `cli walletKeyExport` command to export `xpub`, `xprv`, `pub` and `prv` key from a `bip44` wallet +- Add `xpub` type wallet, which can generate addresses without exposing private keys +- Add `block_publisher` flag to `/api/v1/health` +- Add `no_broadcast` option to `POST /api/v1/injectTransaction` to disable broadcast of the transaction. The transaction will only be added to the local pool. +- Add `cli distributeGenesis` command to split the genesis block into distribution addresses when setting up a new fiber coin + +### Fixed + +- #7, #162, corrupted file in ~/.skycoin/data/ dir makes the desktop wallet show ERROR #1. +- #87, can not run web gui from skycoin docker image. +- #2287 A `Content-Type` with a `charset` specified, for example `application/json; charset=utf-8`, will not return an HTTP 415 error anymore +- Fix `fiber.toml` transaction verification parameters ignored by newcoin +- #2373 Fix and clean-up further panics with various `skycoin-cli` commands (lastBlocks, checkdb) which were not correctly handling arguments. +- #2442 Reset the "trusted" flag to false for all peers on load, before registering default hardcoded peers in the peerlist +- #26 Add additional database corruption checks in ResetCorruptDB to detect encoder ErrBufferUnderflow and ErrMaxLenExceeded + +### Changed + +- `type` is now a required parameter for `POST /api/v1/wallet`. `type` can be `deterministic`, `bip44` or `xpub`. +- Add `display_name`, `ticker`, `coin_hours_display_name`, `coin_hours_display_name_singular`, `coin_hours_ticker`, `explorer_url` to the `/health` endpoint response +- `cli addPrivateKey` will only work on a `collection` type wallet. Create one with `cli walletCreate -t collection` +- Don't print the wallet in the terminal after `cli encryptWallet` or `cli decryptWallet` +- Remove `WALLET_DIR` and `WALLET_NAME` envvars from the `cli` tool. Commands which need to operate on a wallet file accept the wallet file on the command line instead. +- Now the modal window for showing QR codes in the GUI allows to request specific amounts of coins, as in mobile wallets. This changes did no include the ability to read QR codes or URLs. + +### Removed + +- Remove `-arbitrating` option from the daemon CLI options +- Remove `-print-web-interface-address` option from the daemon CLI options +- Remove `cli walletDir` command + +## [0.26.0] - 2019-05-21 + +### Added + +- When sending coins in the UI, the user can choose to send in SKY, or the equivalent amount of SKY in USD +- Add the option for changing the language of the GUI. +- Add Spanish and Simplified Chinese language options +- Add genesis block hash in `INTR` message +- Add `bip32` package for preliminary HD wallet support +- Add CLI `checkDBDecoding` command to verify the `skyencoder`-generated binary decoders match the reflect-based decoder +- Add CLI `addresscount` command to return the count of addresses that currently have unspent outputs (coins) associated with them. +- Add `-max-inc-msg-len` and `-max-out-msg-len` options to control the size of incoming and outgoing wire messages +- Add `-disable-header-check` flag to disable Host/Origin/Referer header checks for the node APIs +- Add `header_check_enabled` parameter in the `/health` endpoint response +- Add `unsigned` option to `POST /api/v1/wallet/transaction` to create unsigned transactions from a wallet +- Add `unsigned` option to `POST /api/v2/transaction/verify` for verifying an unsigned transaction +- Add `POST /api/v2/wallet/transaction/sign` to sign an unsigned transaction with a wallet +- Add `POST /api/v2/transaction` to create an unsigned transaction from addresses or unspent outputs without a wallet +- Add `/api/v2/data` APIs for transaction notes and generic key-value storage. +- Update `/metrics` endpoint to add metrics from `/health`: `unspent_outputs`, `unconfirmed_txns`, `time_since_last_block_seconds`, `open_connections`, `outgoing_connections`, `incoming_connections`, `start_at`, `uptime_seconds`, `last_block_seq`. +- Add to the GUI the ability to choose specific unspent outputs to spend + +### Fixed + +- Return a v2-style error for disabled API endpoints +- #2172 Fix electron build failure for linux systems +- Don't send wire protocol messages that exceed the configured 256kB limit, which caused peers to disconnect from the sender +- #2348 Fix panic in `skycoin-cli` `transaction` command if no (zero) arguments are passed. Exactly one argument is expected. + +### Changed + +- Duplicate wallets in the wallets folder will prevent the application from starting +- An empty wallet in the wallets folder will prevent the application from starting +- Use [`skyencoder`](https://github.com/skycoin/skyencoder)-generated binary encoders/decoders for network and database data, instead of the reflect-based encoders/decoders in `cipher/encoder`. +- Add `/api/v1/resendUnconfirmedTxns` to the `WALLET` API set +- In `POST /api/v1/wallet/transaction`, moved `wallet` parameters to the top level of the object +- Incoming wire message size limit increased to 1024kB +- Clients restrict the maximum number of blocks they will send in a `GiveBlocksMessage` to 20 +- `POST /api/v2/wallet/seed/verify` returns an error if the seed's checksum is invalid +- Increase the detail of error messages for invalid seeds sent to `POST /api/v2/wallet/seed/verify` +- Move package `github.com/skycoin/skycoin/src/cipher/go-bip39` to `github.com/skycoin/skycoin/src/cipher/bip39` +- The `Content-Security-Policy` header was modified to make it stricter +- Update `INTR` message verify logic to reject connection if blockchain pubkey not matched or provided +- Change the coinhour burn rate to 10% + +### Removed + +- `/api/v1/explorer/address` endpoint (use `GET /api/v1/transactions?verbose=1` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-explorer-address +- The unversioned REST API (the `-enable-unversioned-api` is removed, prefix your API requests with `/api/v1` if they don't have an `/api/vx` prefix already). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-unversioned-api +- JSON-RPC 2.0 interface (this is no longer used by the CLI tool, and the REST API supports everything the JSON-RPC 2.0 API does). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-jsonrpc-api +- `/api/v1/wallet/spend` endpoint (use `POST /api/v1/wallet/transaction` followed by `POST /api/v1/injectTransaction` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-spend +- Remove shell autocomplete files + +## [0.25.1] - 2019-02-08 + +### Added + +- Add CLI `addressTransactions` command +- Add `/api/v2/wallet/seed/verify` to verify if seed is a valid bip39 mnemonic seed +- Filter transactions in the History view in the UI + +### Fixed + +- `/api/v1/health` will return correct build info when running Docker containers based on `skycoin/skycoin` mainnet image. +- #2083, Windows desktop wallet sometimes shows "Error#1" on start + +### Changed + +- Extend URI specification to allow plain addresses (i.e. without a `skycoin:` prefix) +- Switch `skycoin-cli` from `urfave/cli` to `spf13/cobra`. + Now all options of a cli command must only use `--` prefix instead of a mix of `--` and `-` prefixes. + `-` prefix is only allowed when using shorthand notation. +- Use an optimized `base58` library for faster address decoding and encoding. +- `/api/v1/injectTransaction` will return 400 error for invalid transactions. + +### Removed + +- Remove libskycoin source code. Migrated to https://github.com/skycoin/libskycoin + +## [0.25.0] - 2018-12-19 + +### Upcoming deprecated method removal notice + +In the v0.26.0 these features and functions will be removed. If you have a need for any of these features, let us know. + +- JSON-RPC 2.0 interface (this is no longer used by the CLI tool, and the REST API supports everything the JSON-RPC 2.0 API does). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-jsonrpc-api +- `/api/v1/wallet/spend` endpoint (use `POST /api/v1/wallet/transaction` followed by `POST /api/v1/injectTransaction` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-spend +- The unversioned REST API (the `-enable-unversioned-api` option will be removed, prefix your API requests with `/api/v1`). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-unversioned-api +- `/api/v1/explorer/address` endpoint (use `GET /api/v1/transactions?verbose=1` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-explorer-address + +### Notice + +Nodes v0.23.0 and earlier will not be able to connect to v0.25.0 due to a change in the introduction packet message. + +Nodes v0.24.1 and earlier will not be able to connect to v0.26.0 due to a similar change. + +Make sure to upgrade to v0.25.0 so that your node will continue to connect once v0.26.0 is released. + +### Added + +- Add `-csv` option to `cli send` and `cli createRawTransaction`, which will send coins to multiple addresses defined in a csv file +- Add `-disable-default-peers` option to disable the default hardcoded peers and mark all cached peers as untrusted +- Add `-custom-peers-file` to load peers from disk. This peers file is a newline separate list of `ip:port` strings +- Add `user_agent`, `coin`, `csrf_enabled`, `csp_enabled`, `wallet_api_enabled`, `unversioned_api_enabled`, `gui_enabled` and `json_rpc_enabled`, `coinhour_burn_factor` configuration settings and `started_at` timestamp to the `/api/v1/health` endpoint response +- Add `verbose` flag to `/api/v1/block`, `/api/v1/blocks`, `/api/v1/last_blocks`, `/api/v1/pendingTxs`, `/api/v1/transaction`, `/api/v1/transactions`, `/api/v1/wallet/transactions` to return verbose block data, which includes the address, coins, hours and calculcated_hours of the block's transaction's inputs +- Add `encoded` flag to `/api/v1/transaction` to return an encoded transaction +- Add `-http-prof-host` option to choose the HTTP profiler's bind hostname (defaults to `localhost:6060`) +- Add `-enable-api-sets`, `-disable-api-sets`, `-enable-all-api-sets` options to choose which sets of API endpoints to enable. Options are `READ`, `STATUS`, `TXN`, `WALLET`, `INSECURE_WALLET_SEED`, `DEPRECATED_WALLET_SPEND`. Multiple values must be comma separated. +- `/api/v1/wallet/spend` is deprecated and requires `-enable-api-set=DEPRECATED_WALLET_SPEND` to enable it. Use `/api/v1/wallet/transaction` and `/api/v1/injectTransaction` instead. +- Add `-host-whitelist` option to specify alternate allowed hosts when communicating with the API bound to a localhost interface +- Add the head block header to the response of `GET /api/v1/outputs` +- Add `"ux_hash"` to block headers in API responses +- Database verification will only be performed once when upgrading to the next version. Verification will not be performed on subsequent upgrades unless necessary. To force verification, use `-verify-db=true`. Note that it is unsafe to downgrade the skycoin node without erasing the database first. +- Add `seqs` parameter to `/api/v1/blocks` to query multiple blocks by sequences +- Add `/api/v2/wallet/recover` to recover an encrypted wallet by providing the seed +- Add HTTP Basic Auth options `-web-interface-username` and `-web-interface-password`. Auth is only available when using `-web-interface-https` unless `-web-interface-plaintext-auth` is also used. +- Add `/api/v2/wallet/recover` to recover an encrypted wallet by providing the seed +- Add `fiberAddressGen` CLI command to generate distribution addresses for fiber coins +- Coinhour burn factor when creating transactions can be configured at runtime with `USER_BURN_FACTOR` envvar +- Max transaction size when creating transactions can be configured at runtime with `USER_MAX_TXN_SIZE` envvar +- Max decimals allowed when creating transactions can be configured at runtime with `USER_MAX_DECIMALS` envvar +- Daemon configured builds will be available on the [releases](https://github.com/skycoin/skycoin/releases) page. The builds available for previous versions are configured for desktop client use. +- `skycoin-cli` builds will be available on the [releases](https://github.com/skycoin/skycoin/releases) page. +- A user agent string is sent in the wire protocol's introduction packet +- `-max-connections` option to control total max connections +- `/api/v1/network/disconnect` to disconnect a peer +- Complete support for `cipher` package in `libskycoin` C API. +- Add `coin`, `wallet`, `util/droplet` and `util/fee` methods as part of `libskycoin` C API +- Add `make update-golden-files` to `Makefile` +- Add CLI `richlist` command +- Add `util/droplet` and `util/fee` API's as part of `libskycoin` +- Implement SWIG interfaces in order to generate client libraries for multiple programming languages + +### Fixed + +- Fix hanging process caused when the p2p listener port is already in use +- Fix exit status of CLI tool when wallet file cannot be loaded +- Fix `calculated_hours` and `fee` in `/api/v1/explorer/address` responses +- Fix `calculated_hours` and `fee` in `/api/v2/transaction/verify` responses for confirmed transactions +- `/api/v1/blocks` and `/api/v1/last_blocks` return `500` instead of `400` on database errors +- `POST /api/v1/wallet` returns `500` instead of `400` for internal errors +- Fix unspent output hashes in the `cli decodeRawTransaction` result +- `POST /api/v1/wallet/newAddress` and `POST /api/v1/wallet/spend` will correctly fail if the wallet is not encrypted but a password is provided +- Return `503` error for `/api/v1/injectTransaction` for all message broadcast failures (note that it is still possible for broadcast to fail but no error to be returned, in certain conditions) +- Fixed autogenerated HTTPS certs. Certs are now self-signed ECDSA certs, valid for 10 years, valid for localhost and all public interfaces found on the machine. The default cert and key are renamed from cert.pem, key.pem to skycoind.cert, skycoind.key +- `/api/v1/resendUnconfirmedTxns` will return `503 Service Unavailable` is no connections are available for broadcast +- #1979, Fix header check to allow `localhost:6420` + +### Changed + +- Add blockchain pubkey in introduction message, it would close the connection if the pubkey is not matched, but would accept it if pubkey is not provided. +- CLI tool uses the REST API instead of the deprecated webrpc API to communicate with the node +- `cli status` return value is now the response from `GET /api/v1/health`, which changes some fields +- `/api/v1/network/` endpoints will return an empty array for array values instead of `null` +- `/api/v1/blocks` will return an empty array for `"blocks"` instead of `null` +- `/api/v1/blockchain/progress` will return an empty array for `"peers"` instead of `null` +- `go run cmd/skycoin/skycoin.go` will have exit status 1 on failure and exit status 2 on panic +- The deprecated JSON 2.0 RPC interface is disabled by default for all run modes, since it is no longer needed for the CLI tool +- Remove `"unknown"` from the `"status"` field in responses from `/api/v1/explorer/address`, `/api/v1/transaction`, `/api/v1/transactions` +- `cli decodeRawTransaction` output format changed, see the [CLI README](./cmd/skycoin-cli/README.md) +- `/api/v1/wallet/spend` is deprecated, disabled by default and requires `-enable-api-sets=DEPRECATED_WALLET_SPEND` to enable it. Use `/api/v1/wallet/transaction` and `/api/v1/injectTransaction` instead. +- Invalid password in `/api/v1/wallet` requests now return `400` instead of `401` +- Replace `cmd/address_gen/` and `cmd/address_gen2` with `go run cmd/cli/cli.go addressGen` +- `cli addressGen` arguments have changed +- `cli generateWallet` renamed to `cli walletCreate` +- `cli generateAddresses` renamed to `cli walletAddAddresses` +- `/api/v1/explorer/address` is deprecated in favor of `/api/v1/transactions?verbose=1` +- `/api/v1/balance`, `/api/v1/transactions`, `/api/v1/outputs` and `/api/v1/blocks` accept the `POST` method so that large request bodies can be sent to the server, which would not fit in a `GET` query string +- Send new `DISC` disconnect packet to peer before disconnecting +- `/api/v1/health` `"open_connections"` value now includes incoming connections. Added `"outgoing_connections"` and `"incoming_connections"` fields to separate the two. +- `run.sh` is now `run-client.sh` and a new `run-daemon.sh` script is added for running in server daemon mode +- `/api/v1/network/connection*` connection object's field `"introduced"` replaced with field `"state"` which may have the values `"pending"`, `"connected"` or `"introduced"` +- `/api/v1/network/connection*` field `"is_trusted_peer"` added to connection object to indicate if the peer is in the hardcoded list of default peers +- `/api/v1/network/connection*` field `"connected_at"`, `"unconfirmed_burn_factor"` and `"unconfirmed_max_transaction_size"` added to connection object +- `/api/v1/network/connections` now includes incoming connections. Filters are added to query connections by state and direction +- `/api/v1/resendUnconfirmedTxns` is now a `POST` method, previously was a `GET` method +- Transactions that violation soft constraints will propagate through the network +- Node will send more peers before disconnecting due to a full peer list +- Refactor CSRF to use HMAC tokens. +- Add transaction verification parameters to the `GET /health` response + +### Removed + +- Remove `USE_CSRF` envvar from the CLI tool. It uses the REST API client now, which will automatically detect CSRF as needed, so no additional configuration is necessary. Operators may still wish to disable CSRF on their remote node to reduce request overhead. +- Remove `-enable-wallet-api` and `-enable-seed-api` in place of including `WALLET` and `INSECURE_WALLET_SEED` in `-enable-api-sets`. +- Copies of the source code removed from release builds due to build artifact size + +## [0.24.1] - 2018-07-30 + +### Added + +- Add Content-Security-Policy header to http responses + +### Fixed + +- Fix portable browser version opening to blank page + +### Changed + +- Increase visor db timeout to 5000 `ms` +- Change `InitTransaction` to accept parameters for distributing genesis coin to distribution wallets + +### Removed + +## [0.24.0] - 2018-07-06 + +### Added + +- Minimum go version is go1.10 +- Add environment variable `DATA_DIR` in CLI +- `USE_CSRF` environment variable for CLI, if the remote node has CSRF enabled (CSRF is enabled by default, use `-disable-csrf` to disable) +- `cli showConfig` command to echo the cli's configuration back to the user +- Option to generate 12/24 word seed when creating new wallet +- libskycoin 0.0.1 released with bindings for cipher/address, cipher/hash, cipher/crypto, cli/create_rawtx +- Add `-version` flag to show node version +- Add transaction verification step to "Send" page +- Add more details about transaction in transaction history +- Add advanced spend UI +- Add CLI `encryptWallet` command +- Add CLI `decryptWallet` command +- Add CLI `showSeed` command +- Add `password` argument to the CLI commands of `addPrivateKey`, `createRawTransaction`, `generateAddresses`, `generateWallet`, `send` +- Support for decoding map values in cipher binary encoder +- Expose known block height of peer in brand new `height` field added in responses of `GET /api/v1/network/connections` API endpoints +- `-verify-db` option (default true), will verify the database integrity during startup and exit if a problem is found +- `-reset-corrupt-db` option (default false) will verify the database integrity during startup and reset the db if a problem is found +- `GET /explorer/address`: add `fee` to transaction objects and `calculated_hours` to transaction inputs +- Test data generator and test suite for verification of alternative `cipher` implementations +- Begin `/api/v2` API endpoints. These endpoints are in beta and subject to change. +- Add `POST /api/v2/transaction/verify` API endpoint +- Add `POST /api/v2/address/verify` API endpoint +- Add `ignore_unconfirmed` option to `POST /api/v1/wallet/transaction` to allow transactions to be created or spent even if there are unspent outputs in the unconfirmed pool. +- Add `uxouts` to `POST /api/v1/wallet/transaction`, to allow specific unspent outputs to be used in a transaction. +- Add Dockerfile in docker/images/dev-cli to build a docker image suitable for development. +- Coin creator tool, `cmd/newcoin`, to quickly bootstrap a new fiber coin +- Add Dockerfile in `docker/images/dev-dind` to build a docker in docker image based on skycoindev-cli. + +### Fixed + +- Reduce connection disconnects, improves syncing +- Fix #1171, update CLI to support wallet encryption +- Use `bolt.Tx` correctly for read operations +- Docker images for `arm32v5` and `ar32v7` architectures by using busybox as base in docker/images/mainnet/Dockerfile and docker/images/mainnet/hooks/ + +### Changed + +- JSON 2.0 RPC interface (used by the CLI tool) is now served on the same host interface as the REST API, port `6420`. The additional listener has been removed. +- CLI's `RPC_ADDR` environment variable must now start with a scheme e.g. `http://127.0.0.1:6420`, previously it did not use a scheme. +- API response will be gzip compressed if client sends request with 'Accept-Encoding' contains 'gzip' in the header. +- `GET /api/v1/wallet/balance` and `GET /api/v1/balance` now return an address balance list as well. +- API endpoints are prefixed with `/api/v1/`. API endpoints without the `/api/v1/` prefix are deprecated but can be enabled with `-enable-unversioned-api`. Please migrate to use `/api/v1/` prefix in URLs. +- Enable message protocol upgrade +- `change_address` is no longer required in `POST /api/v1/wallet/transaction`. If not provided, `change_address` will default to one of the addresses being spent from. +- In `POST /api/v1/wallet/transaction`, for `auto` type `share` mode requests, if extra coinhours remain after applying the `share_factor` but change cannot be made due to insufficient coins, the `share_factor` will switch to `1.0`. +- Support automatic port allocation of the API interface by specifying port 0 +- The web interface / API port is randomly allocated for the precompiled standalone client and electron client released on the website. + If you are using the CLI tool or another API client to communicate with the standalone client, use `-web-interface-port=6420` to continue using port 6420. + If the program is run from source (e.g. `go run`, `run.sh`, `make run`) there is no change, the API will still be on port 6420. +- Change number of outgoing connections to 8 from 16 +- Transaction history shows transactions between own addresses +- Client will only maintain one connection to the default hardcoded peers, instead of all of them + +### Removed + +- Remove `-rpc-interface-addr`, `-rpc-interface-port` options. The RPC interface is now on default port `6420` with the REST API. +- Remove `-rpc-thread-num` option +- Remove `-connect-to` option +- Remove `-print-web-interface-address` option +- Remove support for go1.9 + +## [0.23.0] - 2018-04-22 + +### Added + +- Add wallet setup wizard +- Add wallet encryption, using chacha20+poly1305 for encryption and authentication and scrypt for key derivation. Encrypted data is stored in the wallet file in a `"secrets"` metadata field +- Add `GET /health` endpoint +- Add `POST /wallet/transaction` API endpoint, creates a transaction, allowing control of spending address and multiple destinations +- Add `POST /wallet/encrypt` API endpoint, encrypts wallet and returns encrypted wallet without sensitive data +- Add `POST /wallet/decrypt` API endpoint, decrypts wallet and returns decrypted wallet without sensitive data +- Add `POST /wallet/seed` API endpoint, returns the seed of an encrypted wallet. Unencrypted wallets will not expose their seeds over the API. Requires `-enable-seed-api` option +- `-enable-seed-api` option to enable `POST /wallet/seed` +- Add `"size"` to block API response data (affects `GET /block`, `GET /blocks` and `GET /last_blocks`) +- Write [specification for skycoin URIs](https://github.com/skycoin/skycoin#uri-specification) (based upon bip21) + +### Fixed + +- #1309, Float imprecision error in frontend malformed some spend amounts, preventing the spend +- Fix one aspect of sync stalling caused by a 5-second blocking channel write by switching it to a non-blocking write, decreasing timeouts and increasing buffer sizes + +### Changed + +- `GET /wallet` API endpoint, remove sensitive data from the response, and fix the data format to be the same as `POST /wallet/create` +- `GET /wallets` API endpoint, remove sensitive data from the response +- `POST /wallet/create` API endpoint, add `encrypt(bool)` and `password` argument +- `POST /wallet/newAddress` API endpoint, add `password` argument +- `POST /wallet/spend` API endpoint, add `password` argument +- Change `-disable-wallet-api` to `-enable-wallet-api`, and disable the wallet API by default +- `-launch-browser` is set to false by default +- A default wallet will not be created on startup if there is no wallet. Instead, the wallet setup wizard will run +- Replace [op/go-logging](https://github.com/op/go-logging) with [logrus](https://github.com/sirupsen/logrus) +- Disable JSON-RPC 2.0 interface when running the application with `run.sh` and electron +- Whitespace will be trimmed from the seed string by the frontend client before creating or loading a wallet +- Notify the user when their wallets have unconfirmed transactions +- Return an error when providing a transaction that spends to the null address in `POST /injectTransaction` +- Change accepted `-log-level` values to `debug`, `info`, `warn`, `error`, `fatal` and `panic` (previously were `debug`, `info`, `notice`, `warning`, `error` and `critical`) +- Default log level is `info` + +### Removed + +- Remove `"seed"`, `"lastSeed"` and `"secret_key"` in address entries from wallet API responses. A wallet's seed can be accessed through `POST /wallet/seed` only if the wallet is encrypted and the node is run with `-enable-seed-api` +- Remove unused `-logtogui` and `-logbufsize` options + +## [0.22.0] - 2018-03-20 + +### Added + +- go1.10 support +- Add Dockerfile +- Add libskycoin C API wrapper +- New wallet UI +- Notify the user when a new version is available +- CLI and GUI integration tests against a stable and live blockchain +- #877, Add `-disable-wallet-api` CLI option +- HTTP API client +- `/richlist` API method, returns top n address balances +- `/addresscount` API method, returns the number of addresses that have any amount of coins +- `/transactions` API method, returns transactions of addresses +- `/wallet/unload` API method, removes the wallet of given id from wallet services + +### Fixed + +- #1021, remove `SendOr404` and `SendOr500` as they do not work properly due to typed nils +- Add Read, Write and Idle timeouts to the HTTP listener, preventing file descriptor leaks +- Support absolute and relative paths for `-data-dir` option +- Prevent creating transactions whose size exceeds the maximum block size +- Check addition and multiplication uint64 overflow +- Keep trusted peers in the peerlist permanently, even if they are unreachable +- #885, Add `Host` header check to localhost HTTP interfaces to prevent DNS rebinding attacks +- #896, Add CSRF check to wallet API +- Fix base58 address parsing, which allowed leading invalid characters and treated unknown characters as a '1' +- Fix occasional error which causes blockchain progress not to be shown in front-end + +### Changed + +- #1080, `/wallet/transactions` now returns a proper json object with pending transactions under `transactions` key +- #951, cap cli createRawTransaction and send command coinhour distribution, coinhours are capped to a maximum of receiving coins for the address with a minimum of 1 coinhour +- Upgrade to Angular 5 +- Add `total_coinhour_supply` and `current_coinhour_supply` to `/coinSupply` endpoint +- #800, Add entropy parameter to `/wallet/newSeed` endpoint. Entropy can be 128 (default) or 256, corresponding to 12- and 24-word seeds respectively +- #866, Include coins and hours in `/explorer/address` inputs +- Rename cached `peers.txt` file to `peers.json` + +### Removed + +- Remove `/lastTxs` API endpoint +- Remove `/logs` and log buffering due to possible crash +- Remove `/wallets/reload` endpoint +- Remove deprecated `/api/getEffectiveOutputs`, use `/coinSupply`. + +## [0.21.1] - 2017-12-14 + +### Fixed + +- Fix blank page issue in windows gui wallet, which was caused by misusing the flag of -download-peers-list in electron. + +## [0.21.0] - 2017-12-10 + +### Added + +- Require transactions to have an input with non-zero coinhours +- Add `-peerlist-size` and `-max-outgoing-connections` CLI options +- Add `-download-peerlist` and `-peerlist-url` CLI options, to get peers from a URL +- For electron clients, download a list of peers from https://downloads.skycoin.com/blockchain/peers.txt by default + +### Fixed + +- Fix change hours calculation. Previous gave 1/8 to change and destination addresses; now gives 1/4 to each +- #653, the peerlist size was too small and could be easily filled up; default changed to 65535 from 1000 + +### Changed + +- CLI's `walletBalance` and `addressBalance` commands return aggregate balances for confirmed, spendable and expected balances. Coins are formatted as droplet strings. Hours added as strings. +- When splitting an odd number of hours in a spend, give the extra hour to the fee +- Add `block_seq` to `get_outputs` and `/outputs` API response +- Improve UxOut spend selection. Previously, they were spent oldest first. Now they are spent to ensure a non-zero coinhour input and otherwise minimize coinhours. +- `create_rawtx` will try to minimize the number of UxOuts used to create a transaction. +- `/wallet/spend` will try to maximize the number of UxOuts used to create a transaction. +- Update the default peerlist size to 65535 from 1000 +- When loading a wallet, 100 addresses will be scanned ahead to find one with a balance + +## [0.20.4] - 2017-11-22 + +### Added + +- Add `/logs` api to filter skycoin logs, so that we can add a debug panel to the GUI wallet to show logs + +## [0.20.3] - 2017-10-23 + +### Fixed + +- Fix block sync stall (mostly affected Windows users, but any OS was potentially affected) + +## [0.20.2] - 2017-10-12 + +### Fixed + +- Fixed Linux .AppImage missing "Category" field +- Clean up electron build script, switch to yarn and remove gulp + +## [0.20.1] - 2017-10-12 + +### Fixed + +- Fixed app icon padding + +## [0.20.0] - 2017-10-10 + +### Added + +- New wallet frontend in angular4. This is a complete rewrite and fixes many of the old wallet issues. +- New wallet has preliminary support for OTC functionality +- Create `webrpc.Client` for JSON-2.0 RPC calls. +- Add this CHANGELOG.md file. +- Add Installation.md file, with install instructions for go. +- Timelock distribution addresses. The first 25% of the distribution is spendable. After that 25% is spent, a timestamp will be added to the code to enable further distribution. +- Add `/coinSupply` endpoint. Correctly returns total, locked and unlocked coin amounts. +- `testutil` package for common test setup methods. +- `/version` endpoint, which will return the current node version number and the HEAD commit id when build the node +- `-no-ping-log` option to disable ping/pong log output +- Check for invalid block signatures during startup and recreate the database if they are corrupted. +- Add methods for converting fixed-point decimal strings to droplets and vice versa. +- Add `make run`, `make test`, `make lint`, `make check` to `Makefile` + +### Changed + +- Flag peers as incoming or outgoing. +- Refactor to decouple `wallet` and `visor` package. +- Refactor `cli` package for use as a library. +- `README` improvements. +- Set default wallet's label as "Your Wallet" +- Use BIP32 mnemomic seeds by default in `address_gen`. +- Add `-x` option to `address_gen`, to generate a random base64-encoded 128-bit seed instead of a BIP32 mnemomic seed. +- Add `-v` option to `address_gen` to print all address information (pubkey, seckey, address, seed) to stdout as JSON. +- All API and CLI methods with "coin"-related arguments must be a string and can use decimal notation to specify coin amounts. +- CLI's `walletHistory` command prints amounts as fixed-point decimal strings. Previously, it printed amounts as integers representing whole skycoin amounts, and did not support droplets / fractional skycoins. +- A user is prevented from broadcasting a new transaction with unspent outputs that they have already sent as an unconfirmed transaction. + +### Deprecated + +- `/api/getEffectiveOutputs` is deprecated in favor of `/coinSupply`. + +### Removed + +- Old wallet +- `/api/create-address` endpoint (use the `address_gen` tool) + +### Fixed + +- Wallet folder path loading. +- #371 Fix `/wallet/spend`, will return only when pending transaction is confirmed. +- #443 Fix predicted balance in `/wallet/spend` API call. +- #444 Fix bug in `/blockchain/progress` API call. +- Removed globals in `gui` package that caused race condition with wallet API calls. +- #494 Clean invalid unconfirmed transactions during startup. +- Various race conditions around the bolt.DB blockchain DB +- Missing `strand()` call in `daemon.Visor.AnnounceTxns`. + +### Security + +## [0.19.1] - 2017-08-26 + +### Fixed + +- #459 dist folder in repo out of date, wallet gui does not load + +## [0.19.0] - 2017-07-11 + +### Added + +- Add synchronize indicator when downloading blocks. +- #352 Store unspent pool in db for quick recovery when node restart +- Speed up the time the node start the browser +- Cache unspent pool in memory to speed up query action +- #411 Add button to hide seed +- #380 Move anything with heavy imports into util sub package + +### Fixed + +- #421 Sort wallet transaction history by time +- #398 Remove seeds from DOM +- #390 Make `go test ./src/...` work +- #383 Error during installation from skycoin source code +- #375 Node can't recovery from zero connections +- #376 Explorer api `/explorer/address` does not return spend transactions +- #373 Block publisher node will be closed if there're no transactions need to execute +- #360 Node will crash when do ctrl+c while downloading blocks +- #350 Wallet name always 'undefined' after loading wallet from seed + +[Unreleased]: https://github.com/skycoin/skycoin/compare/master...develop +[0.26.0]: https://github.com/skycoin/skycoin/compare/v0.25.1...v0.26.0 +[0.25.1]: https://github.com/skycoin/skycoin/compare/v0.25.0...v0.25.1 +[0.25.0]: https://github.com/skycoin/skycoin/compare/v0.24.1...v0.25.0 +[0.24.1]: https://github.com/skycoin/skycoin/compare/v0.24.0...v0.24.1 +[0.24.0]: https://github.com/skycoin/skycoin/compare/v0.23.0...v0.24.0 +[0.23.0]: https://github.com/skycoin/skycoin/compare/v0.22.0...v0.23.0 +[0.22.0]: https://github.com/skycoin/skycoin/compare/v0.21.1...v0.22.0 +[0.21.1]: https://github.com/skycoin/skycoin/compare/v0.21.0...v0.21.1 +[0.21.0]: https://github.com/skycoin/skycoin/compare/v0.20.4...v0.21.0 +[0.20.4]: https://github.com/skycoin/skycoin/compare/v0.20.3...v0.20.4 +[0.20.3]: https://github.com/skycoin/skycoin/compare/v0.20.2...v0.20.3 +[0.20.2]: https://github.com/skycoin/skycoin/compare/v0.20.1...v0.20.2 +[0.20.1]: https://github.com/skycoin/skycoin/compare/v0.20.0...v0.20.1 +[0.20.0]: https://github.com/skycoin/skycoin/compare/v0.19.1...v0.20.0 +[0.19.1]: https://github.com/skycoin/skycoin/compare/v0.19.0...v0.19.1 +[0.19.0]: https://github.com/skycoin/skycoin/commit/dd924e1f2de8fab945e05b3245dbeabf267f2910 diff --git a/vendor/github.com/skycoin/skycoin/INSTALLATION.md b/vendor/github.com/skycoin/skycoin/INSTALLATION.md new file mode 100644 index 0000000000..9446d73408 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/INSTALLATION.md @@ -0,0 +1,102 @@ +# Installing go + +Skycoin supports go1.14+. + +## For OSX +First you need to have `homebrew` installed, if you don't have it yet. + +```sh +/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" +``` + +Then, let's install go's latest version. + +```sh +brew install go +``` + +Lastly, let's install Mercurial and Bazaar + +```sh +brew install mercurial bzr +``` + +## For linux +We need to install linux dependencies on the correct distribution. + +#### Ubuntu and Debian +```sh +sudo apt-get update && sudo apt-get upgrade -y +sudo apt-get install -y curl git mercurial make binutils gcc bzr bison libgmp3-dev screen gcc build-essential +``` + +#### Centos and Fedora +```sh +sudo yum update -y && sudo yum upgrade -y +sudo yum install -y git curl make gcc mercurial binutils bzr bison screen +if [[ "$(cat /etc/redhat-release | grep -o CentOS)" == "CentOS" ]]; then sudo yum install -y build-essential libgmp3-dev; else sudo yum groupinstall -y "Development Tools" "Development Libraries" && sudo yum install -y gmp; fi; +``` +#### Archlinux +First update the system and ensure the dependancies are met +```sh +sudo pacman -Syy && sudo pacman -Syu +sudo pacman -S base-devel +``` + +Install the latest version of go on Archlinux with: +```sh +sudo pacman -S go +``` + +## Install Go manually +### Install Go + +Let's go to home directory and declare `go`'s version that you want to download. + +```sh +cd ~ +export GOV=1.14 # golang version +``` + +After that, let's download and uncompress golang source. + +```sh +curl -sS https://storage.googleapis.com/golang/go$GOV.linux-amd64.tar.gz > go$GOV.linux-amd64.tar.gz +tar xvf go$GOV.linux-amd64.tar.gz +rm go$GOV.linux-amd64.tar.gz +``` + +lastly, let's install `go`. + +```sh +sudo mv go /usr/local/go +sudo ln -s /usr/local/go/bin/go /usr/local/bin/go +sudo ln -s /usr/local/go/bin/godoc /usr/local/bin/godoc +sudo ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt +``` + +Note: Find any golang source version at [Go Website](https://golang.org/dl/) + +### Setup your GOPATH +The $GOPATH environment variable specifies the location of your workspace. It defaults to a directory named `go` inside your home directory, so $HOME/go on Unix. + +Create your workspace directory with it's respective inner folders: + +```sh +mkdir -p $HOME/go +mkdir -p $HOME/go/bin +mkdir -p $HOME/go/src +mkdir -p $HOME/go/pkg +``` + +Setup $GOPATH variable, add it to ~/.bashrc. After editing, run `source ~/.bashrc` or open a new tab. + +```sh +export GOROOT=/usr/local/go +export GOPATH=$HOME/go +export GOBIN=$GOPATH/bin +export PATH=$PATH:$GOBIN +``` + +## Test your Go installation +Create and run the hello.go application described here: https://golang.org/doc/install#testing to check if your Go installation is working. diff --git a/vendor/github.com/skycoin/skycoin/INTEGRATION.md b/vendor/github.com/skycoin/skycoin/INTEGRATION.md new file mode 100644 index 0000000000..4570897581 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/INTEGRATION.md @@ -0,0 +1,349 @@ +# Skycoin Exchange Integration + +A Skycoin node offers a REST API on port 6420 (when running from source; if you are using the releases downloaded from the website, the port is randomized) + +A CLI tool is provided in `cmd/skycoin-cli/skycoin-cli.go`. This tool communicates over the REST API. + +The API interfaces do not support authentication or encryption so they should only be used over localhost. + +If your application is written in Go, you can use these client libraries to interface with the node: + +* [Skycoin REST API Client Godoc](https://godoc.org/github.com/skycoin/skycoin/src/api#Client) +* [Skycoin CLI Godoc](https://godoc.org/github.com/skycoin/skycoin/src/cli) + +*Note*: The CLI interface will be deprecated and replaced with a better one in the future. + +The wallet APIs in the REST API operate on wallets loaded from and saved to `~/.skycoin/wallets`. +Use the CLI tool to perform seed generation and transaction signing outside of the Skycoin node. + +The Skycoin node's wallet APIs can be enabled from the command line. +`-enable-all-api-sets` will enable all of the APIs which includes the wallet APIs, +or for more control it can specified in a list of API sets, e.g. `-enable-api-sets=READ,STATUS,WALLET`. +See the [REST API](src/api/README.md) for information on API sets. + +For a node used to support another application, +it is recommended to use the REST API for blockchain queries and disable the wallet APIs, +and to use the CLI tool for wallet operations (seed and address generation, transaction signing). + + + +- [Running the skycoin node](#running-the-skycoin-node) +- [API Documentation](#api-documentation) + - [Wallet REST API](#wallet-rest-api) + - [Skycoin command line interface](#skycoin-command-line-interface) + - [Skycoin REST API Client Documentation](#skycoin-rest-api-client-documentation) + - [Skycoin Go Library Documentation](#skycoin-go-library-documentation) + - [libskycoin Documentation](#libskycoin-documentation) +- [Implementation guidelines](#implementation-guidelines) + - [Scanning deposits](#scanning-deposits) + - [Using the CLI](#using-the-cli) + - [Using the REST API](#using-the-rest-api) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application) + - [Sending coins](#sending-coins) + - [General principles](#general-principles) + - [Using the CLI](#using-the-cli-1) + - [Using the REST API](#using-the-rest-api-1) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-1) + - [Coinhours](#coinhours) + - [REST API](#rest-api) + - [CLI](#cli) + - [Verifying addresses](#verifying-addresses) + - [Using the CLI](#using-the-cli-2) + - [Using the REST API](#using-the-rest-api-2) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-2) + - [Using skycoin as a library in other applications](#using-skycoin-as-a-library-in-other-applications) + - [Checking Skycoin node connections](#checking-skycoin-node-connections) + - [Using the CLI](#using-the-cli-3) + - [Using the REST API](#using-the-rest-api-3) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-3) + - [Checking Skycoin node status](#checking-skycoin-node-status) + - [Using the CLI](#using-the-cli-4) + - [Using the REST API](#using-the-rest-api-4) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-4) +- [xpub wallets](#xpub-wallets) + - [Create a bip44 HD wallet](#create-a-bip44-hd-wallet) + - [Using the CLI](#using-the-cli-5) + - [Using the REST API](#using-the-rest-api-5) + - [Export an xpub key from a bip44 wallet](#export-an-xpub-key-from-a-bip44-wallet) + - [Using the CLI](#using-the-cli-6) + - [Using the REST API](#using-the-rest-api-6) + - [Create an xpub wallet](#create-an-xpub-wallet) + - [Using the CLI](#using-the-cli-7) + - [Using the REST API](#using-the-rest-api-7) + + + +## Running the skycoin node + +For integrations, the skycoin node should be run from source with `./run-daemon.sh`. This requires go1.10+ to be installed. + +## API Documentation + +### Wallet REST API + +[Wallet REST API](src/api/README.md). + +### Skycoin command line interface + +[CLI command API](cmd/skycoin-cli/README.md). + +### Skycoin REST API Client Documentation + +[Skycoin REST API Client](https://godoc.org/github.com/skycoin/skycoin/src/api#Client) + +### Skycoin Go Library Documentation + +[Skycoin Godoc](https://godoc.org/github.com/skycoin/skycoin) + +### libskycoin Documentation + +`libskycoin` provides a C library for Skycoin's cryptographic operations. +This allows python, ruby, C#, Java, etc applications to perform operations +such as transaction signing and address verification, without using the Skycoin daemon API +or calling the CLI tool from the shell. + +[libskycoin documentation](https://github.com/skycoin/libskycoin) + +## Implementation guidelines + +### Scanning deposits + +There are multiple approaches to scanning for deposits, depending on your implementation. + +One option is to watch for incoming blocks and check them for deposits made to a list of known deposit addresses. +Another option is to check the unspent outputs for a list of known deposit addresses. + +#### Using the CLI + +To scan the blockchain, use `skycoin-cli lastBlocks` or `skycoin-cli blocks`. These will return block data as JSON +and new unspent outputs sent to an address can be detected. + +To check address outputs, use `skycoin-cli addressOutputs`. If you only want the balance, you can use `skycoin-cli addressBalance`. + +#### Using the REST API + +To scan the blockchain, call `GET /api/v1/last_blocks?num=` or `GET /api/v1/blocks?start=&end=`. There will return block data as JSON +and new unspent outputs sent to an address can be detected. + +To check address outputs, call `GET /api/v1/outputs?addrs=`. If you only want the balance, you can call `GET /api/v1/balance?addrs=`. + +* [`GET /api/v1/last_blocks` docs](src/api/README.md#get-last-n-blocks) +* [`GET /api/v1/blocks` docs](src/api/README.md#get-blocks-in-specific-range) +* [`GET /api/v1/outputs` docs](src/api/README.md#get-unspent-output-set-of-address-or-hash) +* [`GET /api/v1/balance` docs](src/api/README.md#get-balance-of-addresses) + +#### Using skycoin as a library in a Go application + +We recommend using the [Skycoin REST API Client](https://godoc.org/github.com/skycoin/skycoin/src/api#Client). + +### Sending coins + +#### General principles + +After each spend, wait for the transaction to confirm before trying to spend again. + +For higher throughput, combine multiple spends into one transaction. + +Skycoin uses "coin hours" to ratelimit transactions. +The total number of coinhours in a transaction's outputs must be 50% or less than the number of coinhours in a transaction's inputs, +or else the transaction is invalid and will not be accepted. A transaction must have at least 1 input with at least 1 coin hour. +Sending too many transactions in quick succession will use up all available coinhours. +Coinhours are earned at a rate of 1 coinhour per coin per hour, calculated per second. +This means that 3600 coins will earn 1 coinhour per second. +However, coinhours are only updated when a new block is published to the blockchain. +New blocks are published every 10 seconds, but only if there are pending transactions in the network. + +To avoid running out of coinhours in situations where the application may frequently send, +the sender should batch sends into a single transaction and send them on a +30 second to 1 minute interval. + +There are other strategies to minimize the likelihood of running out of coinhours, such +as splitting up balances into many unspent outputs and having a large balance which generates +coinhours quickly. + +#### Using the CLI + +When sending coins from the CLI tool, a wallet file local to the caller is used. +The CLI tool allows you to specify the wallet file on disk to use for operations. + +See [CLI command API](cmd/skycoin-cli/README.md) for documentation of the CLI interface. + +To perform a send, the preferred method follows these steps in a loop: + +* `skycoin-cli createRawTransaction $WALLET_FILE -m '[{"addr:"$addr1,"coins:"$coins1"}, ...]` - `-m` flag is send-to-many +* `skycoin-cli broadcastTransaction` - returns `txid` +* `skycoin-cli transaction $txid` - repeat this command until `"status"` is `"confirmed"` + +That is, create a raw transaction, broadcast it, and wait for it to confirm. + +#### Using the REST API + +The wallet APIs must be enabled with `-enable-api-sets=WALLET,READ`. + +Create a transaction with [POST /wallet/transaction](https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#create-transaction), +then inject it to the network with [POST /injectTransaction](https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#inject-raw-transaction). + +When using `POST /wallet/transaction`, a wallet file local to the skycoin node is used. +The wallet file is specified by wallet ID, and all wallet files are in the +configured data directory (which is `$HOME/.skycoin/wallets` by default). + +#### Using skycoin as a library in a Go application + +If your application is written in Go, you can interface with the CLI library +directly, see [Skycoin CLI Godoc](https://godoc.org/github.com/skycoin/skycoin/src/cli). + +A REST API client is also available: [Skycoin REST API Client Godoc](https://godoc.org/github.com/skycoin/skycoin/src/api#Client). + +#### Coinhours + +Transaction fees in skycoin is paid in coinhours and is currently set to `50%`, +every transaction created burns `50%` of the total coinhours in all the input +unspents. + +You need a minimum of `1` of coinhour to create a transaction. + +Coinhours are generated at a rate of `1 coinsecond` per `second` +which are then converted to `coinhours`, `1` coinhour = `3600` coinseconds. + +> Note: Coinhours don't have decimals and only show up in whole numbers. + +##### REST API + +When using the REST API, the coin hours sent to the destination and change can be controlled. +The 50% burn fee is still required. + +See the [POST /wallet/transaction](https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#create-transaction) +documentation for more information on how to control the coin hours. + +We recommend sending at least 1 coin hour to each destination, otherwise the receiver will have to +wait for another coin hour to accumulate before they can make another transaction. + +##### CLI + +When using the CLI the amount of coinhours sent to the receiver is capped to +the number of coins they receive with a minimum of `1` coinhour for transactions +with `<1` skycoin being sent. + +The coinhours left after burning `50%` and sending to receivers are sent to the change address. + +For eg. If an address has `10` skycoins and `50` coinhours and only `1` unspent. +If we send `5` skycoins to another address then that address will receive +`5` skycoins and `5` coinhours, `26` coinhours will be burned. +The sending address will be left with `5` skycoins and `19` coinhours which +will then be sent to the change address. + + +### Verifying addresses + +#### Using the CLI + +```sh +skycoin-cli verifyAddress $addr +``` + +#### Using the REST API + +Not directly supported, but API calls that have an address argument will return `400 Bad Request` if they receive an invalid address. + +#### Using skycoin as a library in a Go application + +https://godoc.org/github.com/skycoin/skycoin/src/cipher#DecodeBase58Address + +```go +if _, err := cipher.DecodeBase58Address(address); err != nil { + fmt.Println("Invalid address:", err) + return +} +``` + +#### Using skycoin as a library in other applications + +Address validation is available through a C wrapper, `libskycoin`. + +See the [libskycoin documentation](/lib/cgo/README.md) for usage instructions. + +### Checking Skycoin node connections + +#### Using the CLI + +Not implemented + +#### Using the REST API + +* `GET /api/v1/network/connections` + +#### Using skycoin as a library in a Go application + +Use the [Skycoin REST API Client](https://godoc.org/github.com/skycoin/skycoin/src/api#Client) + +### Checking Skycoin node status + +#### Using the CLI + +```sh +skycoin-cli status +``` + +#### Using the REST API + +A method similar to `skycoin-cli status` is not implemented, but these endpoints can be used: + +* `GET /api/v1/health` +* `GET /api/v1/version` +* `GET /api/v1/blockchain/metadata` +* `GET /api/v1/blockchain/progress` + +#### Using skycoin as a library in a Go application + +Use the [Skycoin CLI package](https://godoc.org/github.com/skycoin/skycoin/src/cli) + +## xpub wallets + +You can create a wallet from an `xpub` key, which allows you to generate new +addresses without exposing secret keys. You can use any `xpub` key from an +existing Bitcoin or Ethereum HD wallet you may already have, or you can create +a new HD wallet in Skycoin. + +To create an xpub wallet from scratch: + +1. Create a bip44 wallet +2. Export an xpub key from the bip44 wallet +3. Create the xpub wallet + +If you already have an xpub key, you can skip to step 3. + +### Create a bip44 HD wallet + +#### Using the CLI + +```sh +skycoin-cli bip44-wallet.wlt -t bip44 +``` + +#### Using the REST API + +* `POST /api/v1/wallet/create` + +### Export an xpub key from a bip44 wallet + +#### Using the CLI + +```sh +skycoin-cli walletKeyExport bip44-wallet.wlt -k xpub --path "0/0" +``` + +#### Using the REST API + +Not possible + +### Create an xpub wallet + +#### Using the CLI + +```sh +skycoin-cli walletCreate xpub-wallet.wlt -t xpub --xpub $MY_XPUB_KEY +``` + +#### Using the REST API + +* `POST /api/v1/wallet/create` diff --git a/vendor/github.com/skycoin/skycoin/Makefile b/vendor/github.com/skycoin/skycoin/Makefile new file mode 100644 index 0000000000..8c04e3af39 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/Makefile @@ -0,0 +1,243 @@ +.DEFAULT_GOAL := help +.PHONY: run-client run-daemon run-help +.PHONY: test test-386 test-amd64 +.PHONY: check check-newcoin +.PHONY: run-integration-test-live +.PHONY: run-integration-test-live-disable-csrf +.PHONY: run-integration-test-live-disable-networking +.PHONY: run-integration-test-live-cover +.PHONY: run-integration-test-live-cover-disable-csrf +.PHONY: run-integration-test-live-cover-disable-networking +.PHONY: integration-tests-stable +.PHONY: integration-test-stable +.PHONY: integration-test-stable-disable-csrf +.PHONY: integration-test-stable-disable-wallet-api +.PHONY: integration-test-stable-enable-seed-api +.PHONY: integration-test-stable-disable-gui +.PHONY: integration-test-stable-db-no-unconfirmed +.PHONY: integration-test-stable-auth +.PHONY: integration-test-live integration-test-live-wallet +.PHONY: install-linters format release clean-release clean-coverage +.PHONY: install-deps-ui build-ui build-ui-travis help newcoin merge-coverage +.PHONY: generate update-golden-files +.PHONY: fuzz-base58 fuzz-encoder +.PHONY: check-lang check-lang-es check-lang-zh + +COIN ?= skycoin + +# Static files directory +GUI_STATIC_DIR = src/gui/static + +# Electron files directory +ELECTRON_DIR = electron + +# Platform specific checks +OSNAME = $(TRAVIS_OS_NAME) + +run-client: ## Run skycoin with desktop client configuration. To add arguments, do 'make ARGS="--foo" run'. + ./run-client.sh ${ARGS} + +run-daemon: ## Run skycoin with server daemon configuration. To add arguments, do 'make ARGS="--foo" run'. + ./run-daemon.sh ${ARGS} + +run-help: ## Show skycoin node help + @go run cmd/$(COIN)/$(COIN).go --help + +run-integration-test-live: ## Run the skycoin node configured for live integration tests + ./ci-scripts/run-live-integration-test-node.sh + +run-integration-test-live-disable-csrf: ## Run the skycoin node configured for live integration tests with CSRF disabled + ./ci-scripts/run-live-integration-test-node.sh -disable-csrf + +run-integration-test-live-disable-networking: ## Run the skycoin node configured for live integration tests with networking disabled + ./ci-scripts/run-live-integration-test-node.sh -disable-networking + +run-integration-test-live-cover: ## Run the skycoin node configured for live integration tests with coverage + ./ci-scripts/run-live-integration-test-node-cover.sh + +run-integration-test-live-cover-disable-csrf: ## Run the skycoin node configured for live integration tests with CSRF disabled and with coverage + ./ci-scripts/run-live-integration-test-node-cover.sh -disable-csrf + +run-integration-test-live-cover-disable-networking: ## Run the skycoin node configured for live integration tests with networking disabled and with coverage + ./ci-scripts/run-live-integration-test-node-cover.sh -disable-networking + +test: ## Run tests for Skycoin + @mkdir -p coverage/ + COIN=$(COIN) go test -coverpkg="github.com/$(COIN)/$(COIN)/..." -coverprofile=coverage/go-test-cmd.coverage.out -timeout=5m ./cmd/... + COIN=$(COIN) go test -coverpkg="github.com/$(COIN)/$(COIN)/..." -coverprofile=coverage/go-test-src.coverage.out -timeout=5m ./src/... + +test-386: ## Run tests for Skycoin with GOARCH=386 + GOARCH=386 COIN=$(COIN) go test ./cmd/... -timeout=5m + GOARCH=386 COIN=$(COIN) go test ./src/... -timeout=5m + +test-amd64: ## Run tests for Skycoin with GOARCH=amd64 + GOARCH=amd64 COIN=$(COIN) go test ./cmd/... -timeout=5m + GOARCH=amd64 COIN=$(COIN) go test ./src/... -timeout=5m + +lint: ## Run linters. Use make install-linters first. + GO111MODULE=off vendorcheck ./... + golangci-lint run -c .golangci.yml ./... + @# The govet version in golangci-lint is out of date and has spurious warnings, run it separately + go vet -all ./... + +check-newcoin: newcoin ## Check that make newcoin succeeds and no templated files are changed. + @if [ "$(shell git diff ./cmd/skycoin/skycoin.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make newcoin' ; exit 2 ; fi + @if [ "$(shell git diff ./cmd/skycoin/skycoin_test.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make newcoin' ; exit 2 ; fi + @if [ "$(shell git diff ./src/params/params.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make newcoin' ; exit 2 ; fi + +check: lint clean-coverage test test-386 integration-tests-stable check-newcoin ## Run tests and linters + +integration-tests-stable: integration-test-stable \ + integration-test-stable-disable-wallet-api \ + integration-test-stable-enable-seed-api \ + integration-test-stable-disable-gui \ + integration-test-stable-auth \ + integration-test-stable-disable-csrf ## Run all stable integration tests + +integration-test-stable: ## Run stable integration tests use CSRF, with header check disabled + COIN=$(COIN) ./ci-scripts/integration-test-stable.sh -c -x -n enable-csrf-header-check + +integration-test-stable-disable-csrf: ## Run stable integration tests with CSRF disabled + COIN=$(COIN) ./ci-scripts/integration-test-stable.sh -n disable-csrf + +integration-test-stable-disable-wallet-api: ## Run disable wallet api integration tests + COIN=$(COIN) ./ci-scripts/integration-test-disable-wallet-api.sh + +integration-test-stable-enable-seed-api: ## Run enable seed api integration test + COIN=$(COIN) ./ci-scripts/integration-test-enable-seed-api.sh + +integration-test-stable-disable-gui: ## Run tests with the GUI disabled + COIN=$(COIN) ./ci-scripts/integration-test-disable-gui.sh + +integration-test-stable-db-no-unconfirmed: ## Run stable tests against the stable database that has no unconfirmed transactions + COIN=$(COIN) ./ci-scripts/integration-test-stable.sh -d -n no-unconfirmed + +integration-test-stable-auth: ## Run stable tests with HTTP Basic auth enabled + COIN=$(COIN) ./ci-scripts/integration-test-auth.sh + +integration-test-live: ## Run live integration tests + COIN=$(COIN) ./ci-scripts/integration-test-live.sh -c + +integration-test-live-wallet: ## Run live integration tests with wallet + COIN=$(COIN) ./ci-scripts/integration-test-live.sh -w + +integration-test-live-enable-header-check: ## Run live integration tests against a node with header check enabled + COIN=$(COIN) ./ci-scripts/integration-test-live.sh + +integration-test-live-disable-csrf: ## Run live integration tests against a node with CSRF disabled + COIN=$(COIN) ./ci-scripts/integration-test-live.sh + +integration-test-live-disable-networking: ## Run live integration tests against a node with networking disabled (requires wallet) + COIN=$(COIN) ./ci-scripts/integration-test-live.sh -c -k + +install-linters: ## Install linters + # Turn off go module when install the vendoercheck, otherwise the installation + # will pollute the go.mod file. + GO111MODULE=off go get -u github.com/FiloSottile/vendorcheck + # For some reason this install method is not recommended, see https://github.com/golangci/golangci-lint#install + # However, they suggest `curl ... | bash` which we should not do + # go get -u github.com/golangci/golangci-lint/cmd/golangci-lint + # Change to use go get -u with version when go is v1.12+ + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(shell go env GOPATH)/bin v1.21.0 + +format: ## Formats the code. Must have goimports installed (use make install-linters). + goimports -w -local github.com/skycoin/skycoin ./cmd + goimports -w -local github.com/skycoin/skycoin ./src + +install-deps-ui: ## Install the UI dependencies + cd $(GUI_STATIC_DIR) && npm ci + +lint-ui: ## Lint the UI code + cd $(GUI_STATIC_DIR) && npm run lint + +check-lang-es: ## Check the Spanish translation + cd $(GUI_STATIC_DIR)/src/assets/i18n &&node check.js es + +check-lang-zh: ## Check the Chinese translation + cd $(GUI_STATIC_DIR)/src/assets/i18n &&node check.js zh + +check-lang: check-lang-es \ + check-lang-zh + +test-ui: ## Run UI tests + cd $(GUI_STATIC_DIR) && npm run test + +test-ui-e2e: ## Run UI e2e tests + ./ci-scripts/ui-e2e.sh + +build-ui: ## Builds the UI + cd $(GUI_STATIC_DIR) && npm run build + +build-ui-travis: ## Builds the UI for travis + cd $(GUI_STATIC_DIR) && npm run build-travis + +release: ## Build electron, standalone and daemon apps. Use osarch=${osarch} to specify the platform. Example: 'make release osarch=darwin/amd64', multiple platform can be supported in this way: 'make release osarch="darwin/amd64 windows/amd64"'. Supported architectures are: darwin/amd64 windows/amd64 windows/386 linux/amd64 linux/arm, the builds are located in electron/release folder. + cd $(ELECTRON_DIR) && ./build.sh ${osarch} + @echo release files are in the folder of electron/release + +release-standalone: ## Build standalone apps. Use osarch=${osarch} to specify the platform. Example: 'make release-standalone osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-standalone-release.sh ${osarch} + @echo release files are in the folder of electron/release + +release-electron: ## Build electron apps. Use osarch=${osarch} to specify the platform. Example: 'make release-electron osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-electron-release.sh ${osarch} + @echo release files are in the folder of electron/release + +release-daemon: ## Build daemon apps. Use osarch=${osarch} to specify the platform. Example: 'make release-daemon osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-daemon-release.sh ${osarch} + @echo release files are in the folder of electron/release + +release-cli: ## Build CLI apps. Use osarch=${osarch} to specify the platform. Example: 'make release-cli osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-cli-release.sh ${osarch} + @echo release files are in the folder of electron/release + +clean-release: ## Remove all electron build artifacts + rm -rf $(ELECTRON_DIR)/release + rm -rf $(ELECTRON_DIR)/.gox_output + rm -rf $(ELECTRON_DIR)/.daemon_output + rm -rf $(ELECTRON_DIR)/.cli_output + rm -rf $(ELECTRON_DIR)/.standalone_output + rm -rf $(ELECTRON_DIR)/.electron_output + +clean-coverage: ## Remove coverage output files + rm -rf ./coverage/ + +newcoin: ## Rebuild cmd/$COIN/$COIN.go file from the template. Call like "make newcoin COIN=foo". + go run cmd/newcoin/newcoin.go createcoin --coin $(COIN) + +generate: ## Generate test interface mocks and struct encoders + go generate ./src/... + # mockery can't generate the UnspentPooler mock in package visor, patch it + mv ./src/visor/blockdb/mock_unspent_pooler_test.go ./src/visor/mock_unspent_pooler_test.go + sed -i "" -e 's/package blockdb/package visor/g' ./src/visor/mock_unspent_pooler_test.go + sed -i "" -e 's/AddressHashes/blockdb.AddressHashes/g' ./src/visor/mock_unspent_pooler_test.go + goimports -w -local github.com/skycoin/skycoin ./src/visor/mock_unspent_pooler_test.go + +install-generators: ## Install tools used by go generate + go get github.com/vektra/mockery/.../ + go get github.com/skycoin/skyencoder/cmd/skyencoder + +update-golden-files: ## Run integration tests in update mode + ./ci-scripts/integration-test-stable.sh -u >/dev/null 2>&1 || true + ./ci-scripts/integration-test-stable.sh -c -x -u >/dev/null 2>&1 || true + ./ci-scripts/integration-test-stable.sh -d -u >/dev/null 2>&1 || true + ./ci-scripts/integration-test-stable.sh -c -x -d -u >/dev/null 2>&1 || true + +merge-coverage: ## Merge coverage files and create HTML coverage output. gocovmerge is required, install with `go get github.com/wadey/gocovmerge` + @echo "To install gocovmerge do:" + @echo "go get github.com/wadey/gocovmerge" + gocovmerge coverage/*.coverage.out > coverage/all-coverage.merged.out + go tool cover -html coverage/all-coverage.merged.out -o coverage/all-coverage.html + @echo "Total coverage HTML file generated at coverage/all-coverage.html" + @echo "Open coverage/all-coverage.html in your browser to view" + +fuzz-base58: ## Fuzz the base58 package. Requires https://github.com/dvyukov/go-fuzz + go-fuzz-build github.com/skycoin/skycoin/src/cipher/base58/internal + go-fuzz -bin=base58fuzz-fuzz.zip -workdir=src/cipher/base58/internal + +fuzz-encoder: ## Fuzz the encoder package. Requires https://github.com/dvyukov/go-fuzz + go-fuzz-build github.com/skycoin/skycoin/src/cipher/encoder/internal + go-fuzz -bin=encoderfuzz-fuzz.zip -workdir=src/cipher/encoder/internal + +help: + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/vendor/github.com/skycoin/skycoin/README.md b/vendor/github.com/skycoin/skycoin/README.md new file mode 100644 index 0000000000..19ea5362cc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/README.md @@ -0,0 +1,842 @@ +![skycoin logo](https://user-images.githubusercontent.com/26845312/32426705-d95cb988-c281-11e7-9463-a3fce8076a72.png) + +# Skycoin + +[![Go](https://github.com/skycoin/skycoin/workflows/Go/badge.svg)](https://github.com/skycoin/skycoin/actions) +[![GoDoc](https://godoc.org/github.com/skycoin/skycoin?status.svg)](https://godoc.org/github.com/skycoin/skycoin) +[![Go Report Card](https://goreportcard.com/badge/github.com/skycoin/skycoin)](https://goreportcard.com/report/github.com/skycoin/skycoin) + +Skycoin is a next-generation cryptocurrency. + +Skycoin was written from scratch and designed over four years to realize the +ideal of Bitcoin and represents the apex of cryptocurrency design. +Skycoin is not designed to add features to Bitcoin, +but rather improves Bitcoin by increasing simplicity, +security and stripping out everything non-essential. + +Some people have hyped the Skycoin Project as leading into "Bitcoin 3.0". +The coin itself is not "Bitcoin 3.0", +but is rather "Bitcoin 1.0". Bitcoin is a prototype crypto-coin. +Skycoin was designed to be what Bitcoin would look like if it were built from +scratch, to remedy the rough edges in the Bitcoin design. + +- no duplicate coin-base outputs +- enforced checks for hash collisions +- simple deterministic wallets +- no transaction malleability +- no signature malleability +- removal of the scripting language +- CoinJoin and normal transactions are indistinguishable +- elimination of edge-cases that prevent independent node implementations +- <=10 second transaction times +- elimination of the need for mining to achieve blockchain consensus + +## Links + +* [skycoin.com](https://www.skycoin.com) +* [Skycoin Blog](https://www.skycoin.com/blog) +* [Skycoin Docs](https://www.skycoin.com/docs) +* [Skycoin Blockchain Explorer](https://explorer.skycoin.com) +* [Skycoin Development Telegram Channel](https://t.me/skycoindev) +* [Skycoin Github Wiki](https://github.com/skycoin/skycoin/wiki) + +## Table of Contents + + + +- [Changelog](#changelog) +- [Installation](#installation) + - [Go 1.14+ Installation and Setup](#go-114-installation-and-setup) + - [Go get skycoin](#go-get-skycoin) + - [Run Skycoin from the command line](#run-skycoin-from-the-command-line) + - [Show Skycoin node options](#show-skycoin-node-options) + - [Run Skycoin with options](#run-skycoin-with-options) + - [Docker image](#docker-image) + - [Building your own images](#building-your-own-images) + - [Development image](#development-image) +- [API Documentation](#api-documentation) + - [REST API](#rest-api) + - [Skycoin command line interface](#skycoin-command-line-interface) +- [Integrating Skycoin with your application](#integrating-skycoin-with-your-application) +- [Contributing a node to the network](#contributing-a-node-to-the-network) +- [Creating a new coin](#creating-a-new-coin) +- [Daemon CLI Options](#daemon-cli-options) +- [URI Specification](#uri-specification) +- [Wire protocol user agent](#wire-protocol-user-agent) +- [Offline transaction signing](#offline-transaction-signing) +- [Deploy a public Skycoin API node with HTTPS](#deploy-a-public-skycoin-api-node-with-https) +- [Development](#development) + - [Modules](#modules) + - [Client libraries](#client-libraries) + - [Running Tests](#running-tests) + - [Running Integration Tests](#running-integration-tests) + - [Stable Integration Tests](#stable-integration-tests) + - [Live Integration Tests](#live-integration-tests) + - [Debugging Integration Tests](#debugging-integration-tests) + - [Update golden files in integration testdata](#update-golden-files-in-integration-testdata) + - [Test coverage](#test-coverage) + - [Test coverage for the live node](#test-coverage-for-the-live-node) + - [Formatting](#formatting) + - [Code Linting](#code-linting) + - [Profiling](#profiling) + - [Fuzzing](#fuzzing) + - [base58](#base58) + - [encoder](#encoder) + - [Dependencies](#dependencies) + - [Rules](#rules) + - [Management](#management) + - [Configuration Modes](#configuration-modes) + - [Development Desktop Client Mode](#development-desktop-client-mode) + - [Server Daemon Mode](#server-daemon-mode) + - [Electron Desktop Client Mode](#electron-desktop-client-mode) + - [Standalone Desktop Client Mode](#standalone-desktop-client-mode) + - [Wallet GUI Development](#wallet-gui-development) + - [Translations](#translations) + - [Releases](#releases) + - [Update the version](#update-the-version) + - [Check the translations](#check-the-translations) + - [Pre-release testing](#pre-release-testing) + - [Creating release builds](#creating-release-builds) + - [Release signing](#release-signing) +- [Responsible Disclosure](#responsible-disclosure) + + + +## Changelog + +[CHANGELOG.md](CHANGELOG.md) + +## Installation + +Skycoin supports go1.14+. + +### Go 1.14+ Installation and Setup + +[Golang 1.14+ Installation/Setup](./INSTALLATION.md) + +### Go get skycoin + +```sh +$ go get github.com/skycoin/skycoin/cmd/... +``` + +This will download `github.com/skycoin/skycoin` to `$GOPATH/src/github.com/skycoin/skycoin`. + +You can also clone the repo directly with `git clone https://github.com/skycoin/skycoin`, +but it must be cloned to this path: `$GOPATH/src/github.com/skycoin/skycoin`. + +### Run Skycoin from the command line + +```sh +$ cd $GOPATH/src/github.com/skycoin/skycoin +$ make run-client +``` + +### Show Skycoin node options + +```sh +$ cd $GOPATH/src/github.com/skycoin/skycoin +$ make run-help +``` + +### Run Skycoin with options + +Example: + +```sh +$ cd $GOPATH/src/github.com/skycoin/skycoin +$ make ARGS="--launch-browser=false -data-dir=/custom/path" run +``` + +### Docker image + +This is the quickest way to start using Skycoin using Docker. + +```sh +$ docker volume create skycoin-data +$ docker volume create skycoin-wallet +$ docker run -ti --rm \ + -v skycoin-data:/data/.skycoin \ + -v skycoin-wallet:/wallet \ + -p 6000:6000 \ + -p 6420:6420 \ + skycoin/skycoin +``` + +This image has a `skycoin` user for the skycoin daemon to run, with UID and GID 10000. +When you mount the volumes, the container will change their owner, so you +must be aware that if you are mounting an existing host folder any content you +have there will be own by 10000. + +The container will run with some default options, but you can change them +by just appending flags at the end of the `docker run` command. The following +example will show you the available options. + +```sh +$ docker run --rm skycoin/skycoin -help +``` + +Access the API: [http://localhost:6420/version](http://localhost:6420/version). + +### Building your own images + +[Building your own images](docker/images/mainnet/README.md). + +### Development image + +The [skycoin/skycoindev-cli docker image](docker/images/dev-cli/README.md) is provided in order to make +easy to start developing Skycoin. It comes with the compiler, linters, debugger +and the vim editor among other tools. + +The [skycoin/skycoindev-dind docker image](docker/images/dev-docker/README.md) comes with docker installed +and all tools available on `skycoin/skycoindev-cli:develop` docker image. + +Also, the [skycoin/skycoindev-vscode docker image](docker/images/dev-vscode/README.md) is provided +to facilitate the setup of the development process with [Visual Studio Code](https://code.visualstudio.com) +and useful tools included in `skycoin/skycoindev-cli`. + +## API Documentation + +### REST API + +[REST API](src/api/README.md). + +### Skycoin command line interface + +[CLI command API](cmd/skycoin-cli/README.md). + +## Integrating Skycoin with your application + +[Skycoin Integration Documentation](INTEGRATION.md) + +## Contributing a node to the network + +Add your node's `ip:port` to the [peers.txt](peers.txt) file. +This file will be periodically uploaded to https://downloads.skycoin.com/blockchain/peers.txt +and used to seed client with peers. + +*Note*: Do not add Skywire nodes to `peers.txt`. +Only add Skycoin nodes with high uptime and a static IP address (such as a Skycoin node hosted on a VPS). + +## Creating a new coin + +See the [newcoin tool README](./cmd/newcoin/README.md) + +## Daemon CLI Options + +See the [Skycoin Daemon CLI options](./cmd/skycoin/README.md) + +## URI Specification + +Skycoin URIs obey the same rules as specified in Bitcoin's [BIP21](https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki). +They use the same fields, except with the addition of an optional `hours` parameter, specifying the coin hours. + +Example Skycoin URIs: + +* `skycoin:2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY` +* `skycoin:2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY?amount=123.456&hours=70` +* `skycoin:2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY?amount=123.456&hours=70&label=friend&message=Birthday%20Gift` + +Additonally, if no `skycoin:` prefix is present when parsing, the string may be treated as an address: + +* `2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY` + +However, do not use this URI in QR codes displayed to the user, because the address can't be disambiguated from other Skyfiber coins. + +## Wire protocol user agent + +[Wire protocol user agent description](https://github.com/skycoin/skycoin/wiki/Wire-protocol-user-agent) + +## Offline transaction signing + +Before doing the offline transaction signing, we need to have the unsigned transaction created. Using the `skycoin-cli` tool to create an unsigned transaction in hot wallet, and copy the hex encoded transaction to the computer where the cold wallet is installed. Then use the `skycoin-cli` tool to sign it offline. + +### Create an unsigned transaction + +The `skycoin-cli` tool replys on the APIs of the `skycoin node`, hence we have to start the node before running the tool. + + Go to the project root and run: + +```bash +$ ./run-client.sh -launch-browser=false +``` + +Once the node is started, we could use the following command to create an unsigned transaction. + +```bash +$ skycoin-cli createRawTransactionV2 $WALLET_NAME $RECIPIENT_ADDRESS $AMOUNT --unsign +``` + +> Note: Don't forget the `--unsign` flag, otherwise it would try to sign the transaction. + +
+ View Output + +``` +b700000000e6b869f570e2bfebff1b4d7e7c9e86885dbc34d6de988da6ff998e7acd7e6e14010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000007531184ad0afeebbff2049b855e0921329cb1cb74d769ac57c057c9c8bd2b6810100000000ed5ea2ca4fe9b4560409b50c5bf7cb39b6c5ff6e50690f00000000000000000000000000 +``` + +
+ +Copy and save the generated transaction string. We will sign it with a cold wallet offline in the next section. + +### Sign the transaction + +The `skycoin node` needs to have the most recently `DB` so that the user would not lose much coin hours when signing the transaction. We could copy the full synchronized `data.db` from the hot wallet to the computer where the cold wallet is installed. And place it in `$HOME/.skycoin/data.db`. Then start the node with the network disabled. + +```bash +$ ./run-client.sh -launch-browser=false -disable-networking +``` + +Run the following command to sign the transaction: + +```bash +$ skycoin-cli signTransaction $RAW_TRANSACTION +``` + +The `$RAW_TRANSACTION` is the transaction string that we generated in the hot wallet. + +If the cold wallet is encrypted, you will be prompted to enter the password to sign the transaction. + +
+ View Output + +``` +b700000000e6b869f570e2bfebff1b4d7e7c9e86885dbc34d6de988da6ff998e7acd7e6e14010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000007531184ad0afeebbff2049b855e0921329cb1cb74d769ac57c057c9c8bd2b6810100000000ed5ea2ca4fe9b4560409b50c5bf7cb39b6c5ff6e50690f00000000000000000000000000 +``` + +
+ +Once the transaction is signed, we could copy and save the signed transaction string and broadcast it in the hot wallet. + +```bash +$ skycoin-cli broadcastTransaction $SIGNED_RAW_TRANSACTION +``` + +A transaction id would be returned and you can check it in the [explorer](https://explorer.skycoin.com). + +## Deploy a public Skycoin API node with HTTPS + +We recommend using [caddy server](https://caddyserver.com/) to deploy a public Skycoin API node on a +Linux server. The public API node should have the `HTTPS` support, which could be handled automatically +by the `caddy server`. But we need to have a domain and create a DNS record to bind the server ip address +to it. + +Suppose we're going to deploy a Skycoin API node on `apitest.skycoin.com`, and we have already bound +the server's IP to it. Follow the steps below to complete the deployment. + +### Install and run a skycoin api node + +```bash +# Create a skycoin folder so that the files could be isolated +$ mkdir $HOME/skycoin && cd $HOME/skycoin +# Download the skycoin binary file +$ wget https://downloads.skycoin.com/wallet/skycoin-0.26.0-gui-standalone-linux-x64.tar.gz +$ tar -zxvf skycoin-0.26.0-gui-standalone-linux-x64.tar.gz +$ cd skycoin-0.26.0-gui-standalone-linux-x64 +$ ./skycoin -web-interface-port=6420 -host-whitelist=$DOMAIN_NAME -enable-api-sets="READ,TXN" +``` + +> Note: we should running the `skycoin` node with `-host-whitelist` flag, otherwise it would +> throw `403 Forbidden` error. + +### Install the caddy server + +```bash +# Create a caddy folder +$ mkdir $HOME/caddy && cd $HOME/caddy +# Download the caddy server binary file +$ wget https://github.com/caddyserver/caddy/releases/download/v1.0.4/caddy_v1.0.4_linux_amd64.tar.gz +$ tar -zxvf caddy_v1.0.4_linux_amd64.tar.gz +$ cd caddy_v1.0.4_linux_amd64 +``` + +The `caddy` tool would be exist in the folder, let's create a `Caddyfile` to define the reverse proxy +rules now. + +```bash +cat <Caddyfile +apitest.skycoin.com { + proxy / localhost:6420 { + transparent + } +} +EOF +``` + +Then run the caddy server + +```bash +$ ./caddy +``` + +You will be prompted to enter an email address to receive the notifications from let's Encrypt. +That's all about the deployment, check the https://apitest.skycoin.com/api/v1/version to see if +the Skycoin API node is working correctly. + +## Development + +We have two branches: `master` and `develop`. + +`develop` is the default branch and will have the latest code. + +`master` will always be equal to the current stable release on the website, and should correspond with the latest release tag. + +### Modules + +* `api` - REST API interface +* `cipher` - cryptographic library (key generation, addresses, hashes) +* `cipher/base58` - Base58 encoding +* `cipher/encoder` - reflect-based deterministic runtime binary encoder +* `cipher/encrypt` - at-rest data encryption (chacha20poly1305+scrypt) +* `cipher/go-bip39` - BIP-39 seed generation +* `cli` - CLI library +* `coin` - blockchain data structures (blocks, transactions, unspent outputs) +* `daemon` - top-level application manager, combining all components (networking, database, wallets) +* `daemon/gnet` - networking library +* `daemon/pex` - peer management +* `params` - configurable transaction verification parameters +* `readable` - JSON-encodable representations of internal structures +* `skycoin` - core application initialization and configuration +* `testutil` - testing utility methods +* `transaction` - methods for creating transactions +* `util` - miscellaneous utilities +* `visor` - top-level blockchain database layer +* `visor/blockdb` - low-level blockchain database layer +* `visor/historydb` - low-level blockchain database layer for historical blockchain metadata +* `wallet` - wallet file management + +### Client libraries + +Skycoin implements client libraries which export core functionality for usage from +other programming languages. + +* [libskycoin C client library and SWIG interface](https://github.com/skycoin/libskycoin) +* [skycoin-lite: Javascript and mobile bindings](https://github.com/skycoin/skycoin-lite) + +### Running Tests + +```sh +$ make test +``` + +### Running Integration Tests + +There are integration tests for the CLI and HTTP API interfaces. They have two +run modes, "stable" and "live". + +The stable integration tests will use a skycoin daemon +whose blockchain is synced to a specific point and has networking disabled so that the internal +state does not change. + +The live integration tests should be run against a synced or syncing node with networking enabled. + +#### Stable Integration Tests + +```sh +$ make integration-test-stable +``` + +or + +```sh +$ ./ci-scripts/integration-test-stable.sh -v -w +``` + +The `-w` option, run wallet integrations tests. + +The `-v` option, show verbose logs. + +#### Live Integration Tests + +The live integration tests run against a live runnning skycoin node, so before running the test, we +need to start a skycoin node: + +```sh +$ ./run-daemon.sh +``` + +After the skycoin node is up, run the following command to start the live tests: + +```sh +$ make integration-test-live +``` + +The above command will run all tests except the wallet-related tests. To run wallet tests, we +need to manually specify a wallet file, and it must have at least `2 coins` and `256 coinhours`, +it also must have been loaded by the node. + +We can specify the wallet by setting two environment variables: + +* `API_WALLET_ID`, which is the filename (without path), that is loaded by the daemon to test against. + This is the `"id"` field in API requests. It is used by the API integration tests. + The wallet directory that the daemon uses can be controlled with the `-wallet-dir` option. +* `CLI_WALLET_FILE`, which is the filename (with path), to be used by the CLI integration tests + +If the wallet is encrypted, also set `WALLET_PASSWORD`. + +Example of running the daemon with settings for integration tests: + +```sh +$ export API_WALLET_ID="$valid_wallet_filename" +$ export CLI_WALLET_FILE="$HOME/.skycoin/wallets/$valid_wallet_filename" +$ export WALLET_PASSWORD="$wallet_password" +$ make run-integration-test-live +``` + +Then run the tests with the following command: + +```sh +$ make integration-test-live-wallet +``` + +There are two other live integration test modes for CSRF disabled and networking disabled. + +To run the CSRF disabled tests: + +```sh +$ export API_WALLET_ID="$valid_wallet_filename" +$ export CLI_WALLET_FILE="$HOME/.skycoin/wallets/$valid_wallet_filename" +$ export WALLET_PASSWORD="$wallet_password" +$ make run-integration-test-live-disable-csrf +``` + +```sh +$ make integration-test-live-disable-csrf +``` + +To run the networking disabled tests, which require a live wallet: + +```sh +$ export API_WALLET_ID="$valid_wallet_filename" +$ export CLI_WALLET_FILE="$HOME/.skycoin/wallets/$valid_wallet_filename" +$ export WALLET_PASSWORD="$wallet_password" +$ make run-integration-test-live-disable-networking +``` + +Then run the tests with the following command: + +```sh +$ make integration-test-live-wallet +``` + +#### Debugging Integration Tests + +Run specific test case: + +It's annoying and a waste of time to run all tests to see if the test we real care +is working correctly. There's an option: `-r`, which can be used to run specific test case. +For example: if we only want to test `TestStableAddressBalance` and see the result, we can run: + +```sh +$ ./ci-scripts/integration-test-stable.sh -v -r TestStableAddressBalance +``` + +#### Update golden files in integration testdata + +Golden files are expected data responses from the CLI or HTTP API saved to disk. +When the tests are run, their output is compared to the golden files. + +To update golden files, use the provided `make` command: + +```sh +$ make update-golden-files +``` + +We can also update a specific test case's golden file with the `-r` option. +For example: +```sh +$ ./ci-scripts/integration-test-stable.sh -v -u -r TestStableAddressBalance +``` + +### Test coverage + +Coverage is automatically generated for `make test` and integration tests run against a stable node. +This includes integration test coverage. The coverage output files are placed in `coverage/`. + +To merge coverage from all tests into a single HTML file for viewing: + +```sh +$ make check +$ make merge-coverage +``` + +Then open `coverage/all-coverage.html` in the browser. + +#### Test coverage for the live node + +Some tests can only be run with a live node, for example wallet spending tests. +To generate coverage for this, build and run the skycoin node in test mode before running the live integration tests. + +In one shell: + +```sh +$ make run-integration-test-live-cover +``` + +In another shell: + +```sh +$ make integration-test-live +``` + +After the tests have run, CTRL-C to exit the process from the first shell. +A coverage file will be generated at `coverage/skycoin-live.coverage.out`. + +Merge the coverage with `make merge-coverage` then open the `coverage/all-coverage.html` file to view it, +or generate the HTML coverage in isolation with `go tool cover -html` + +### Formatting + +All `.go` source files should be formatted `goimports`. You can do this with: + +```sh +$ make format +``` + +### Code Linting + +Install prerequisites: + +```sh +$ make install-linters +``` + +Run linters: + +```sh +$ make lint +``` + +### Profiling + +A full CPU profile of the program from start to finish can be obtained by running the node with the `-profile-cpu` flag. +Once the node terminates, a profile file is written to `-profile-cpu-file` (defaults to `cpu.prof`). +This profile can be analyzed with + +```sh +$ go tool pprof cpu.prof +``` + +The HTTP interface for obtaining more profiling data or obtaining data while running can be enabled with `-http-prof`. +The HTTP profiling interface can be controlled with `-http-prof-host` and listens on `localhost:6060` by default. + +See https://golang.org/pkg/net/http/pprof/ for guidance on using the HTTP profiler. + +Some useful examples include: + +```sh +$ go tool pprof http://localhost:6060/debug/pprof/profile?seconds=10 +$ go tool pprof http://localhost:6060/debug/pprof/heap +``` + +A web page interface is provided by http/pprof at http://localhost:6060/debug/pprof/. + +### Fuzzing + +Fuzz tests are run with [go-fuzz](https://github.com/dvyukov/go-fuzz). +[Follow the instructions on the go-fuzz page](https://github.com/dvyukov/go-fuzz) to install it. + +Fuzz tests are written for the following packages: + +#### base58 + +To fuzz the `cipher/base58` package, + +```sh +$ make fuzz-base58 +``` + +#### encoder + +To fuzz the `cipher/encoder` package, + +```sh +$ make fuzz-encoder +``` + +### Dependencies + +#### Rules + +Dependencies must not require `cgo`. This means dependencies cannot be wrappers around C libraries. +Requiring `cgo` breaks cross compilation and interferes with repeatable (deterministic) builds. + +Critical cryptographic dependencies used by code in package `cipher` are archived inside the `cipher` folder, +rather than in the `vendor` folder. This prevents a user of the `cipher` package from accidentally using a +different version of the `cipher` dependencies than were developed, which could have catastrophic but hidden problems. + +#### Management + +Dependencies are managed with [go modules](https://github.com/golang/go/wiki/Modules). + +We still use the `vendor` folder to store our dependencies in case any of the them are +removed from the internet in the future. + +> When the main module contains a top-level vendor directory and its go.mod file specifies go 1.14 or higher, +> the go command now defaults to -mod=vendor for operations that accept that flag. + + +### Configuration Modes +There are 4 configuration modes in which you can run a skycoin node: +- Development Desktop Daemon +- Server Daemon +- Electron Desktop Client +- Standalone Desktop Client + +#### Development Desktop Client Mode +This mode is configured via `run-client.sh` +```bash +$ ./run-client.sh +``` + +#### Server Daemon Mode +The default settings for a skycoin node are chosen for `Server Daemon`, which is typically run from source. +This mode is usually preferred to be run with security options, though `-disable-csrf` is normal for server daemon mode, it is left enabled by default. + +```bash +$ ./run-daemon.sh +``` + +To disable CSRF: + +```bash +$ ./run-daemon.sh -disable-csrf +``` + +#### Electron Desktop Client Mode +This mode configures itself via electron-main.js + +#### Standalone Desktop Client Mode +This mode is configured by compiling with `STANDALONE_CLIENT` build tag. +The configuration is handled in `cmd/skycoin/skycoin.go` + +### Wallet GUI Development + +The compiled wallet source should be checked in to the repo, so that others do not need to install node to run the software. + +Instructions for doing this: + +[Wallet GUI Development README](src/gui/static/README.md) + +#### Translations + +You can find information about how to work with translation files in the [Translations README](./src/gui/static/src/assets/i18n/README.md). + +### Releases + +#### Update the version + +0. If the `master` branch has commits that are not in `develop` (e.g. due to a hotfix applied to `master`), merge `master` into `develop` +0. Make sure the translations are up to date. See the [i18n README](./src/gui/static/src/assets/i18n/README.md) for instructions on how to update translations and how to check if they are up to date. +0. Compile the `src/gui/static/dist/` to make sure that it is up to date (see [Wallet GUI Development README](src/gui/static/README.md)) +0. Update version strings to the new version in the following files: `electron/package-lock.json`, `electron/package.json`, `electron/skycoin/current-skycoin.json`, `src/cli/cli.go`, `src/gui/static/src/current-skycoin.json`, `src/cli/integration/testdata/status*.golden`, `template/coin.template`, `README.md` files . +0. If changes require a new database verification on the next upgrade, update `src/skycoin/skycoin.go`'s `DBVerifyCheckpointVersion` value +0. Update `CHANGELOG.md`: move the "unreleased" changes to the version and add the date +0. Update the files in https://github.com/skycoin/repo-info by following the [metadata update procedure](https://github.com/skycoin/repo-info/#updating-skycoin-repository-metadate), +0. Merge these changes to `develop` +0. Follow the steps in [pre-release testing](#pre-release-testing) +0. Make a PR merging `develop` into `master` +0. Review the PR and merge it +0. Tag the `master` branch with the version number. Version tags start with `v`, e.g. `v0.20.0`. + Sign the tag. If you have your GPG key in github, creating a release on the Github website will automatically tag the release. + It can be tagged from the command line with `git tag -as v0.20.0 $COMMIT_ID`, but Github will not recognize it as a "release". +0. Make sure that the client runs properly from the `master` branch +0. Release builds are created and uploaded by travis. To do it manually, checkout the `master` branch and follow the [create release builds](electron/README.md) instructions. + +If there are problems discovered after merging to `master`, start over, and increment the 3rd version number. +For example, `v0.20.0` becomes `v0.20.1`, for minor fixes. + +#### Check the translations + +Run `make check-lang` to check if the translation files of the UI are updated. If there is any error running +that command, one or more translation files may need to be updated. For more information, check the +[translations](#translations) section. + +#### Pre-release testing + +Performs these actions before releasing: + +* `make check` +* `make integration-test-live` +* `make integration-test-live-disable-networking` (requires node run with `-disable-networking`) +* `make integration-test-live-disable-csrf` (requires node run with `-disable-csrf`) +* `make intergration-test-live-wallet` (see [live integration tests](#live-integration-tests)) 6 times: with an unencrypted and encrypted wallet for each wallet type: `deterministic`, `bip44` and `collection` +* `go run cmd/skycoin-cli/skycoin-cli.go checkdb` against a fully synced database +* `go run cmd/skycoin-cli/skycoin-cli.go checkDBDecoding` against a fully synced database +* On all OSes, make sure that the client runs properly from the command line (`./run-client.sh` and `./run-daemon.sh`) +* Build the releases and make sure that the Electron client runs properly on Windows, Linux and macOS. + * Use a clean data directory with no wallets or database to sync from scratch and verify the wallet setup wizard. + * Load a test wallet with nonzero balance from seed to confirm wallet loading works + * Send coins to another wallet to confirm spending works + * Restart the client, confirm that it reloads properly +* For both the Android and iOS mobile wallets, configure the node url to be https://staging.node.skycoin.com + and test all operations to ensure it will work with the new node version. + +#### Creating release builds + +[Create Release builds](electron/README.md). + +#### Release signing + +Releases are signed with this PGP key: + +`0x913BBD5206B19620` + +The fingerprint for this key is: + +``` +pub ed25519 2019-09-17 [SC] [expires: 2023-09-16] + 98F934F04F9334B81DFA3398913BBD5206B19620 +uid [ultimate] iketheadore skycoin +sub cv25519 2019-09-17 [E] [expires: 2023-09-16] +``` + +Keybase.io account: https://keybase.io/iketheadore + +Follow the [Tor Project's instructions for verifying signatures](https://www.torproject.org/docs/verifying-signatures.html.en). + +If you can't or don't want to import the keys from a keyserver, the signing key is available in the repo: [iketheadore.asc](iketheadore.asc). + +Releases and their signatures can be found on the [releases page](https://github.com/skycoin/skycoin/releases). + +Instructions for generating a PGP key, publishing it, signing the tags and binaries: +https://gist.github.com/iketheadore/6485585ce2d22231c2cb3cbc77e1d7b7 + +## Responsible Disclosure + +Security flaws in skycoin source or infrastructure can be sent to security@skycoin.com. +Bounties are available for accepted critical bug reports. + +PGP Key for signing: + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEXYCYPxYJKwYBBAHaRw8BAQdAeDPi3n9xLv5xGsxbcbwZjfV4h772W+GPZ3Mz +RS17STm0L2lrZXRoZWFkb3JlIHNreWNvaW4gPGx1eGFpcmxha2VAcHJvdG9ubWFp +bC5jb20+iJYEExYIAD4WIQSY+TTwT5M0uB36M5iRO71SBrGWIAUCXYCYPwIbAwUJ +B4TOAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCRO71SBrGWID0NAP0VRiNA +2Kq2uakPMqV29HY39DVhc9QgxJfMIwXWtFxKAwEAn0NqGRV/iKXNf+qxqAtMWa5X +F2S36hkEfDHO5W44DwC4OARdgJg/EgorBgEEAZdVAQUBAQdAeiEz/tUmCgOA67Rq +ANmHmX2vrdZp/SfJ9KOI2ANCCm8DAQgHiH4EGBYIACYWIQSY+TTwT5M0uB36M5iR +O71SBrGWIAUCXYCYPwIbDAUJB4TOAAAKCRCRO71SBrGWIJOJAQDTaqxpcLtAw5kH +Hp2jWvUnLudIONeqeUTCmkLJhcNv1wD+PFJZWMKD1btIG4pkXRW9YoA7M7t5by5O +x5I+LywZNww= +=p6Gq +-----END PGP PUBLIC KEY BLOCK----- +``` + + +Key ID: [0x913BBD5206B19620](https://pgp.mit.edu/pks/lookup?search=0x913BBD5206B19620&op=index) + +The fingerprint for this key is: + +``` +pub ed25519 2019-09-17 [SC] [expires: 2023-09-16] + 98F934F04F9334B81DFA3398913BBD5206B19620 +uid [ultimate] iketheadore skycoin +sub cv25519 2019-09-17 [E] [expires: 2023-09-16] +``` + +Keybase.io account: https://keybase.io/iketheadore diff --git a/vendor/github.com/skycoin/skycoin/cmd/newcoin/commands/root.go b/vendor/github.com/skycoin/skycoin/cmd/newcoin/commands/root.go new file mode 100644 index 0000000000..f62250d107 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/cmd/newcoin/commands/root.go @@ -0,0 +1,237 @@ +// package commands cmd/newcoin/commands/root.go +/* +newcoin generates a new coin cmd from a toml configuration file +*/ +package commands + +import ( + "fmt" + "os" + "path/filepath" + "regexp" + "strings" + "text/template" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/fiber" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/useragent" +) + +const ( + // Version is the CLI version + Version = "0.2" +) + +var ( + log = logging.MustGetLogger("newcoin") + coinName string + templateDir string + coinTemplateFile string + commandTemplateFile string + coinTestTemplateFile string + paramsTemplateFile string + configDir string + configFile string +) + +func init() { + createCoinCmd.Flags().SortFlags = false + createCoinCmd.Flags().StringVarP(&coinName, "coin", "c", "skycoin", "name of the coin to create") + createCoinCmd.Flags().StringVarP(&templateDir, "template-dir", "d", "./template", "template directory path") + createCoinCmd.Flags().StringVarP(&coinTemplateFile, "coin-template-file", "e", "coin.template", "coin template file (importable)") + createCoinCmd.Flags().StringVarP(&commandTemplateFile, "command-template-file", "f", "command.template", "command template file (executable)") + createCoinCmd.Flags().StringVarP(&coinTestTemplateFile, "coin-test-template-file", "g", "coin_test.template", "coin test template file") + createCoinCmd.Flags().StringVarP(¶msTemplateFile, "params-template-file", "i", "params.template", "params template file") + createCoinCmd.Flags().StringVarP(&configDir, "config-dir", "j", "./", "config directory path") + createCoinCmd.Flags().StringVarP(&configFile, "config-file", "k", "fiber.toml", "config file path") + RootCmd.AddCommand(createCoinCmd) +} + +// rootCmd represents the base command for the application +var RootCmd = &cobra.Command{ + Use: "newcoin", + Short: "newcoin is a helper tool for creating new fiber coins", + Long: ` + ┌┐┌┌─┐┬ ┬┌─┐┌─┐┬┌┐┌ + │││├┤ ││││ │ │││││ + ┘└┘└─┘└┴┘└─┘└─┘┴┘└┘ +newcoin is a helper tool for creating new fiber coins`, +} + +var createCoinCmd = &cobra.Command{ + Use: "createcoin", + Short: "Create a new coin from a template file", + RunE: func(cmd *cobra.Command, args []string) error { + if err := validateCoinName(coinName); err != nil { + return err + } + if _, err := os.Stat(filepath.Join(templateDir, coinTemplateFile)); os.IsNotExist(err) { + return err + } + if _, err := os.Stat(filepath.Join(templateDir, coinTestTemplateFile)); os.IsNotExist(err) { + return err + } + if _, err := os.Stat(filepath.Join(templateDir, paramsTemplateFile)); os.IsNotExist(err) { + return err + } + configFilepath := filepath.Join(configDir, configFile) + if _, err := os.Stat(configFilepath); os.IsNotExist(err) { + return err + } + config, err := fiber.NewConfig(configFile, configDir) + if err != nil { + log.Errorf("failed to create new fiber coin config") + return err + } + coinDir := fmt.Sprintf("./cmd/%s", coinName) + err = os.MkdirAll(coinDir, 0750) + if err != nil { + log.Errorf("failed to create new coin directory %s", coinDir) + return err + } + commandsDir := fmt.Sprintf("./cmd/%s/commands", coinName) + err = os.MkdirAll(commandsDir, 0750) + if err != nil { + log.Errorf("failed to create new coin directory %s", coinDir) + return err + } + coinFilePath := fmt.Sprintf("./cmd/%[1]s/%[1]s.go", coinName) + coinFile, err := os.Create(coinFilePath) + if err != nil { + log.Errorf("failed to create new coin file %s", coinFilePath) + return err + } + defer coinFile.Close() + commandFilePath := fmt.Sprintf("./cmd/%[1]s/commands/root.go", coinName) + commandFile, err := os.Create(commandFilePath) + if err != nil { + log.Errorf("failed to create new coin file %s", coinFilePath) + return err + } + defer commandFile.Close() + coinTestFilePath := fmt.Sprintf("./cmd/%[1]s/commands/%[1]s_test.go", coinName) + coinTestFile, err := os.Create(coinTestFilePath) + if err != nil { + log.Errorf("failed to create new coin test file %s", coinTestFilePath) + return err + } + defer coinTestFile.Close() + paramsFilePath := "./src/params/params.go" + paramsFile, err := os.Create(paramsFilePath) + if err != nil { + log.Errorf("failed to create new file %s", paramsFilePath) + return err + } + defer paramsFile.Close() + err = os.Chdir(templateDir) + if err != nil { + log.Errorf("failed to change directory to %s", templateDir) + return err + } + templateFiles := []string{ + coinTemplateFile, + commandTemplateFile, + coinTestTemplateFile, + paramsTemplateFile, + } + t := template.New(coinTemplateFile) + t, err = t.ParseFiles(templateFiles...) + if err != nil { + log.Errorf("failed to parse template files: %v", templateFiles) + return err + } + config.Node.CoinName = coinName + config.Node.CoinAscii = asciiFont(coinName) + config.Node.DataDirectory = "$HOME/." + coinName + err = t.ExecuteTemplate(commandFile, coinTemplateFile, config.Node) + if err != nil { + log.Error("failed to parse coin template variables") + return err + } + err = t.ExecuteTemplate(coinFile, commandTemplateFile, config.Node) + if err != nil { + log.Error("failed to parse command template variables") + return err + } + if _, err := coinFile.WriteString(helpTemplate); err != nil { + log.Error("failed to append help constant to command") + return err + } + err = t.ExecuteTemplate(coinTestFile, coinTestTemplateFile, nil) + if err != nil { + log.Error("failed to parse coin test template variables") + return err + } + err = t.ExecuteTemplate(paramsFile, paramsTemplateFile, config.Params) + if err != nil { + log.Error("failed to parse params template variables") + return err + } + return nil + }, +} + +func validateCoinName(s string) error { + x := regexp.MustCompile(fmt.Sprintf(`^%s$`, useragent.NamePattern)) + if !x.MatchString(s) { + return fmt.Errorf("invalid coin name. must only contain the characters %s", useragent.NamePattern) + } + return nil +} + +var boxFont = map[rune][]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': {"┌─┐", "┌─┘", "└─┘"}, +} + +// ConvertToBoxFont converts a lowercase string to box drawing characters. +func asciiFont(input string) string { + var output [3]string + + for _, char := range input { + if row, ok := boxFont[char]; ok { + for i := 0; i < len(row); i++ { + output[i] += row[i] + } + } + } + + return strings.Join(output[:], "\n") +} + +const helpTemplate = ` +const help = "{{if .HasAvailableSubCommands}}{{end}} {{if gt (len .Aliases) 0}}\r\n\r\n" + + "{{.NameAndAliases}}{{end}}{{if .HasAvailableSubCommands}}" + + "Available Commands:{{range .Commands}} {{if and (ne .Name \"completion\") .IsAvailableCommand}}\r\n " + + "{{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}}\r\n\r\n" + + "Flags:\r\n" + + "{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}}\r\n\r\n" + + "Global Flags:\r\n" + + "{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}\r\n\r\n" +` diff --git a/vendor/github.com/skycoin/skycoin/cmd/skycoin-cli/commands/root.go b/vendor/github.com/skycoin/skycoin/cmd/skycoin-cli/commands/root.go new file mode 100644 index 0000000000..1cf2537108 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/cmd/skycoin-cli/commands/root.go @@ -0,0 +1,57 @@ +// package commands cmd/skywire-cli/commands/root.go +/* +cli is a command line client for interacting with a skycoin node and offline wallet management +*/ +package commands + +import ( + "fmt" + "os" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/cli" + "github.com/skycoin/skycoin/src/util/logging" + + "github.com/spf13/cobra" + + // register the supported wallets + _ "github.com/skycoin/skycoin/src/wallet/bip44wallet" + _ "github.com/skycoin/skycoin/src/wallet/collection" + _ "github.com/skycoin/skycoin/src/wallet/deterministic" + _ "github.com/skycoin/skycoin/src/wallet/xpubwallet" +) + +func init() { + logging.SetLevel(logrus.WarnLevel) + cfg, err := cli.LoadConfig() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + skyCLI, err := cli.NewCLI(cfg) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + RootCmd = skyCLI + RootCmd.Use = "cli" + RootCmd.Short = "The skycoin command line interface" + RootCmd.Long = ` + ┌─┐┬┌─┬ ┬┌─┐┌─┐┬┌┐┌ ┌─┐┬ ┬ + └─┐├┴┐└┬┘│ │ │││││───│ │ │ + └─┘┴ ┴ ┴ └─┘└─┘┴┘└┘ └─┘┴─┘┴ +The skycoin command line interface` + +} + +// RootCmd represents the base command for the application +var RootCmd = &cobra.Command{ + Use: "cli", + Short: "The skycoin command line interface", + Long: ` + ┌─┐┬┌─┬ ┬┌─┐┌─┐┬┌┐┌ ┌─┐┬ ┬ + └─┐├┴┐└┬┘│ │ │││││───│ │ │ + └─┘┴ ┴ ┴ └─┘└─┘┴┘└┘ └─┘┴─┘┴ +The skycoin command line interface`, +} diff --git a/vendor/github.com/skycoin/skycoin/cmd/skycoin-wallet/commands/root.go b/vendor/github.com/skycoin/skycoin/cmd/skycoin-wallet/commands/root.go new file mode 100644 index 0000000000..3b43fe1e0f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/cmd/skycoin-wallet/commands/root.go @@ -0,0 +1,50 @@ +/* +skycoin daemon, cli, & newcoin +*/ +package commands + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + + "github.com/spf13/cobra" + + newcoin "github.com/skycoin/skycoin/cmd/newcoin/commands" + cli "github.com/skycoin/skycoin/cmd/skycoin-cli/commands" + skycoin "github.com/skycoin/skycoin/cmd/skycoin/commands" +) + +func init() { + + RootCmd.AddCommand( + skycoin.RootCmd, + cli.RootCmd, + newcoin.RootCmd, + ) + skycoin.RootCmd.Use = "daemon" +} + +// RootCmd contains every daemon, cli, & newcoin +var RootCmd = &cobra.Command{ + Use: func() string { + return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] + }(), + Long: ` + ┌─┐┬┌─┬ ┬┌─┐┌─┐┬┌┐┌ + └─┐├┴┐└┬┘│ │ │││││ + └─┘┴ ┴ ┴ └─┘└─┘┴┘└┘`, + SilenceErrors: true, + SilenceUsage: true, + DisableSuggestions: true, + DisableFlagsInUseLine: true, +} + +// Execute executes root CLI command. +func Execute() { + if err := RootCmd.Execute(); err != nil { + log.Fatal("Failed to execute command: ", err) + } +} diff --git a/vendor/github.com/skycoin/skycoin/cmd/skycoin/commands/root.go b/vendor/github.com/skycoin/skycoin/cmd/skycoin/commands/root.go new file mode 100644 index 0000000000..d18fa91a1f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/cmd/skycoin/commands/root.go @@ -0,0 +1,140 @@ +/* +skycoin daemon +*/ +package commands + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +import ( + _ "net/http/pprof" + "os" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/fiber" + "github.com/skycoin/skycoin/src/readable" + "github.com/skycoin/skycoin/src/skycoin" + "github.com/skycoin/skycoin/src/util/logging" + + // register the supported wallets + _ "github.com/skycoin/skycoin/src/wallet/bip44wallet" + _ "github.com/skycoin/skycoin/src/wallet/collection" + _ "github.com/skycoin/skycoin/src/wallet/deterministic" + _ "github.com/skycoin/skycoin/src/wallet/xpubwallet" +) + +var ( + // Version of the node. Can be set by -ldflags + Version = "0.28.0" + // Commit ID. Can be set by -ldflags + Commit = "" + // Branch name. Can be set by -ldflags + Branch = "" + // ConfigMode (possible values are "", "STANDALONE_CLIENT"). + // This is used to change the default configuration. + // Can be set by -ldflags + ConfigMode = "" + + logger = logging.MustGetLogger("main") + + // CoinName name of coin + CoinName = "skycoin" + + // GenesisSignatureStr hex string of genesis signature + GenesisSignatureStr = "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700" + // GenesisAddressStr genesis address string + GenesisAddressStr = "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6" + // BlockchainPubkeyStr pubic key string + BlockchainPubkeyStr = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" + // BlockchainSeckeyStr empty private key string + BlockchainSeckeyStr = "" + + // GenesisTimestamp genesis block create unix time + GenesisTimestamp uint64 = 1426562704 + // GenesisCoinVolume represents the coin capacity + GenesisCoinVolume uint64 = 100000000000000 + + // DefaultConnections the default trust node addresses + DefaultConnections = []string{ + "139.162.121.185:6000", + "172.104.164.147:6000", + "139.162.248.183:6000", + "45.56.109.228:6000", + "173.230.130.174:6000", + "172.104.99.241:6000", + "172.104.57.147:6000", + } + + nodeConfig = skycoin.NewNodeConfig(ConfigMode, fiber.NodeConfig{ + CoinName: CoinName, + GenesisSignatureStr: GenesisSignatureStr, + GenesisAddressStr: GenesisAddressStr, + GenesisCoinVolume: GenesisCoinVolume, + GenesisTimestamp: GenesisTimestamp, + BlockchainPubkeyStr: BlockchainPubkeyStr, + BlockchainSeckeyStr: BlockchainSeckeyStr, + DefaultConnections: DefaultConnections, + PeerListURL: "https://downloads.skycoin.com/blockchain/peers.txt", + Port: 6000, + WebInterfacePort: 6420, + DataDirectory: "$HOME/.skycoin", + + UnconfirmedBurnFactor: 10, + UnconfirmedMaxTransactionSize: 32768, + UnconfirmedMaxDropletPrecision: 3, + CreateBlockBurnFactor: 10, + CreateBlockMaxTransactionSize: 32768, + CreateBlockMaxDropletPrecision: 3, + MaxBlockTransactionsSize: 32768, + + DisplayName: "Skycoin", + Ticker: "SKY", + CoinHoursName: "Coin Hours", + CoinHoursNameSingular: "Coin Hour", + CoinHoursTicker: "SCH", + QrURIPrefix: "skycoin", + ExplorerURL: "https://explorer.skycoin.com", + VersionURL: "https://version.skycoin.com/skycoin/version.txt", + Bip44Coin: 8000, + }) +) + +func init() { + nodeConfig.RegisterFlags(RootCmd) +} + +// RootCmd is the root command +var RootCmd = &cobra.Command{ + Use: "skycoin", + Short: "skycoin wallet", + Long: ` +┌─┐┬┌─┬ ┬┌─┐┌─┐┬┌┐┌ +└─┐├┴┐└┬┘│ │ │││││ +└─┘┴ ┴ ┴ └─┘└─┘┴┘└┘ + skycoin wallet`, + Run: func(cmd *cobra.Command, args []string) { + // create a new fiber coin instance + coin := skycoin.NewCoin(skycoin.Config{ + Node: nodeConfig, + Build: readable.BuildInfo{ + Version: Version, + Commit: Commit, + Branch: Branch, + }, + }, logger) + + // parse config values + if err := coin.ParseConfig(); err != nil { + logger.Error(err) + os.Exit(1) + } + + // run fiber coin node + if err := coin.Run(); err != nil { + os.Exit(1) + } + }, +} diff --git a/vendor/github.com/skycoin/skycoin/docker_launcher.sh b/vendor/github.com/skycoin/skycoin/docker_launcher.sh new file mode 100644 index 0000000000..c87c321d74 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/docker_launcher.sh @@ -0,0 +1,16 @@ +#!/bin/sh +COMMAND="skycoin --data-dir $DATA_DIR --wallet-dir $WALLET_DIR $@" + +adduser -D -u 10000 skycoin + +if [[ \! -d $DATA_DIR ]]; then + mkdir -p $DATA_DIR +fi +if [[ \! -d $WALLET_DIR ]]; then + mkdir -p $WALLET_DIR +fi + +chown -R skycoin:skycoin $( realpath $DATA_DIR ) +chown -R skycoin:skycoin $( realpath $WALLET_DIR ) + +su skycoin -c "$COMMAND" diff --git a/vendor/github.com/skycoin/skycoin/fiber.toml b/vendor/github.com/skycoin/skycoin/fiber.toml new file mode 100644 index 0000000000..360940d907 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/fiber.toml @@ -0,0 +1,148 @@ +# fiber configuration +# Defaults are shown, commented out +# Some values have no defaults and must be filled in +[node] +genesis_signature_str = "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700" +genesis_address_str = "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6" +blockchain_pubkey_str = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +blockchain_seckey_str = "" +genesis_timestamp = 1426562704 +# genesis_coin_volume = 100e12 +default_connections = [ + "139.162.121.185:6000", + "172.104.164.147:6000", + "139.162.248.183:6000", + "45.56.109.228:6000", + "173.230.130.174:6000", + "172.104.99.241:6000", + "172.104.57.147:6000", +] +peer_list_url = "https://downloads.skycoin.com/blockchain/peers.txt" +# port = 6000 +# web_interface_port = 6420 +# unconfirmed_burn_factor = 10 +# unconfirmed_max_transaction_size = 32 * 1024 +# unconfirmed_max_decimals = 3 +# create_block_burn_factor = 10 +# create_block_max_transaction_size = 32 * 1024 +# create_block_max_decimals = 3 +# max_block_transactions_size = 32 * 1024 +# display_name = "Skycoin" +# ticker = "SKY" +# coin_hours_display_name = "Coin Hours" +# coin_hours_display_name_singular = "Coin Hour" +# coin_hours_ticker = "SCH" +# qr_uri_prefix = "skycoin" +# explorer_url = "https://explorer.skycoin.com" +# bip44_coin = 8000 + +[params] +# max_coin_supply = 1e8 +# initial_unlocked_count = 25 +# unlock_address_rate = 5 +# unlock_time_interval = 60 * 60 * 24 * 365 +# user_max_decimals = 3 +# user_max_transaction_size = 32 * 1024 +# user_burn_factor = 10 +distribution_addresses = [ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", +] diff --git a/vendor/github.com/skycoin/skycoin/iketheadore.asc b/vendor/github.com/skycoin/skycoin/iketheadore.asc new file mode 100644 index 0000000000..e92bb2cb4b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/iketheadore.asc @@ -0,0 +1,14 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEXYCYPxYJKwYBBAHaRw8BAQdAeDPi3n9xLv5xGsxbcbwZjfV4h772W+GPZ3Mz +RS17STm0L2lrZXRoZWFkb3JlIHNreWNvaW4gPGx1eGFpcmxha2VAcHJvdG9ubWFp +bC5jb20+iJYEExYIAD4WIQSY+TTwT5M0uB36M5iRO71SBrGWIAUCXYCYPwIbAwUJ +B4TOAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCRO71SBrGWID0NAP0VRiNA +2Kq2uakPMqV29HY39DVhc9QgxJfMIwXWtFxKAwEAn0NqGRV/iKXNf+qxqAtMWa5X +F2S36hkEfDHO5W44DwC4OARdgJg/EgorBgEEAZdVAQUBAQdAeiEz/tUmCgOA67Rq +ANmHmX2vrdZp/SfJ9KOI2ANCCm8DAQgHiH4EGBYIACYWIQSY+TTwT5M0uB36M5iR +O71SBrGWIAUCXYCYPwIbDAUJB4TOAAAKCRCRO71SBrGWIJOJAQDTaqxpcLtAw5kH +Hp2jWvUnLudIONeqeUTCmkLJhcNv1wD+PFJZWMKD1btIG4pkXRW9YoA7M7t5by5O +x5I+LywZNww= +=p6Gq +-----END PGP PUBLIC KEY BLOCK----- diff --git a/vendor/github.com/skycoin/skycoin/peers.txt b/vendor/github.com/skycoin/skycoin/peers.txt new file mode 100644 index 0000000000..36d1834cbd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/peers.txt @@ -0,0 +1,7 @@ +139.162.121.185:6000 +172.104.164.147:6000 +139.162.248.183:6000 +45.56.109.228:6000 +173.230.130.174:6000 +172.104.99.241:6000 +172.104.57.147:6000 diff --git a/vendor/github.com/skycoin/skycoin/run-client.sh b/vendor/github.com/skycoin/skycoin/run-client.sh new file mode 100644 index 0000000000..35f1af3a15 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/run-client.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# Runs skycoin in desktop client configuration + +set -x + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +echo "skycoin binary dir:" "$DIR" +pushd "$DIR" >/dev/null + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="${GOLDFLAGS} -X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +GORUNFLAGS=${GORUNFLAGS:-} + +GO111MODULE=off go run -ldflags "${GOLDFLAGS}" $GORUNFLAGS ./cmd/skycoin/... \ + -gui-dir="${DIR}/src/gui/static/" \ + -launch-browser=true \ + -enable-all-api-sets=true \ + -enable-gui=true \ + -log-level=debug \ + $@ + +popd >/dev/null diff --git a/vendor/github.com/skycoin/skycoin/run-daemon.sh b/vendor/github.com/skycoin/skycoin/run-daemon.sh new file mode 100644 index 0000000000..54c1f81ed0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/run-daemon.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +# Runs skycoin in daemon mode configuration + +set -x + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +echo "skycoin binary dir:" "$DIR" +pushd "$DIR" >/dev/null + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +GORUNFLAGS=${GORUNFLAGS:-} + +go run -ldflags "${GOLDFLAGS}" $GORUNFLAGS ./cmd/skycoin/... \ + -enable-gui=false \ + -launch-browser=false \ + -log-level=debug \ + $@ + +popd >/dev/null diff --git a/vendor/github.com/skycoin/skycoin/skycoin.go b/vendor/github.com/skycoin/skycoin/skycoin.go new file mode 100644 index 0000000000..6dd7b193ef --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/skycoin.go @@ -0,0 +1,47 @@ +// Package skycoin github.com/skycoin/skycoin/skycoin.go +// +package skycoin + +import ( + "embed" +) + +/* +Embedded Files +*/ + +// GuiFiles is the embedded gui sources +// +//go:embed src/gui/static/dist/* +var GuiFiles embed.FS + + +/* +//TODO: embed files for use with newcoin + +// FiberToml is the embedded fiber.toml default node configuraion file +//go:embed fiber.toml +//var FiberToml []byte + +// CoinTemplate is embedded template/coin.template +//go:embed template/coin.template +//var CoinTemplate []byte + +// CoinTemplate is embedded template/coin_test.template +//go:embed template/coin_test.template +//var CoinTestTemplate []byte + +// CommandTemplate is embedded template/command.template +//go:embed template/command.template +//var CommandTemplate []byte + +// ParamsTemplate is embedded template/params.template +//go:embed template/params.template +//var ParamsTemplate []byte + +//TODO: embed default peers + +// PeersTxt is the embedded fiber.toml default node configuraion file +//go:embed peers.txt +//var PeersTxt []byte +*/ diff --git a/vendor/github.com/skycoin/skycoin/src/api/README.md b/vendor/github.com/skycoin/skycoin/src/api/README.md new file mode 100644 index 0000000000..8b6625e199 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/README.md @@ -0,0 +1,4570 @@ +# REST API Documentation + +API default service port is `6420`. However, if running the desktop or standalone releases from the website, the port is randomized by default. + +A REST API implemented in Go is available, +see [Skycoin REST API Client Godoc](https://godoc.org/github.com/skycoin/skycoin/src/api#Client). + +The API has two versions, `/api/v1` and `/api/v2`. + + + +- [API Version 1](#api-version-1) +- [API Version 2](#api-version-2) +- [API Sets](#api-sets) +- [Authentication](#authentication) +- [CSRF](#csrf) + - [Get current csrf token](#get-current-csrf-token) +- [General system checks](#general-system-checks) + - [Health check](#health-check) + - [Version info](#version-info) +- [Simple query APIs](#simple-query-apis) + - [Get balance of addresses](#get-balance-of-addresses) + - [Get unspent output set of address or hash](#get-unspent-output-set-of-address-or-hash) + - [Verify an address](#verify-an-address) +- [Wallet APIs](#wallet-apis) + - [Get wallet](#get-wallet) + - [Get unconfirmed transactions of a wallet](#get-unconfirmed-transactions-of-a-wallet) + - [Get wallets](#get-wallets) + - [Get wallet folder name](#get-wallet-folder-name) + - [Generate wallet seed](#generate-wallet-seed) + - [Verify wallet Seed](#verify-wallet-seed) + - [Create wallet](#create-wallet) + - [Generate new address in wallet](#generate-new-address-in-wallet) + - [Scan addresses in wallet](#scan-addresses-in-wallet) + - [Change wallet label](#change-wallet-label) + - [Get wallet balance](#get-wallet-balance) + - [Create transaction](#create-transaction) + - [Sign transaction](#sign-transaction) + - [Unload wallet](#unload-wallet) + - [Encrypt wallet](#encrypt-wallet) + - [Decrypt wallet](#decrypt-wallet) + - [Get wallet seed](#get-wallet-seed) + - [Recover encrypted wallet by seed](#recover-encrypted-wallet-by-seed) +- [Key-value storage APIs](#key-value-storage-apis) + - [Get all storage values](#get-all-storage-values) + - [Add value to storage](#add-value-to-storage) + - [Remove value from storage](#remove-value-from-storage) +- [Transaction APIs](#transaction-apis) + - [Get unconfirmed transactions](#get-unconfirmed-transactions) + - [Create transaction from unspent outputs or addresses](#create-transaction-from-unspent-outputs-or-addresses) + - [Get transaction info by id](#get-transaction-info-by-id) + - [Get raw transaction by id](#get-raw-transaction-by-id) + - [Inject raw transaction](#inject-raw-transaction) + - [Get transactions for addresses](#get-transactions-for-addresses) + - [Get transactions with pagination](#get-transactions-with-pagination) + - [Resend unconfirmed transactions](#resend-unconfirmed-transactions) + - [Verify encoded transaction](#verify-encoded-transaction) +- [Block APIs](#block-apis) + - [Get blockchain metadata](#get-blockchain-metadata) + - [Get blockchain progress](#get-blockchain-progress) + - [Get block by hash or seq](#get-block-by-hash-or-seq) + - [Get blocks in specific range](#get-blocks-in-specific-range) + - [Get last N blocks](#get-last-n-blocks) +- [Uxout APIs](#uxout-apis) + - [Get uxout](#get-uxout) + - [Get historical unspent outputs for an address](#get-historical-unspent-outputs-for-an-address) +- [Coin supply related information](#coin-supply-related-information) + - [Coin supply](#coin-supply) + - [Richlist show top N addresses by uxouts](#richlist-show-top-n-addresses-by-uxouts) + - [Count unique addresses](#count-unique-addresses) +- [Network status](#network-status) + - [Get information for a specific connection](#get-information-for-a-specific-connection) + - [Get a list of all connections](#get-a-list-of-all-connections) + - [Get a list of all default connections](#get-a-list-of-all-default-connections) + - [Get a list of all trusted connections](#get-a-list-of-all-trusted-connections) + - [Get a list of all connections discovered through peer exchange](#get-a-list-of-all-connections-discovered-through-peer-exchange) + - [Disconnect a peer](#disconnect-a-peer) +- [Migrating from the unversioned API](#migrating-from-the-unversioned-api) +- [Migrating from the JSONRPC API](#migrating-from-the-jsonrpc-api) +- [Migrating from /api/v1/spend](#migrating-from-apiv1spend) +- [Migration from /api/v1/explorer/address](#migration-from-apiv1exploreraddress) + + + +## API Version 1 + +`/api/v1` endpoints have no standard format. Most of them accept formdata in POST requests, +but a few accept `application/json` instead. Most of them return JSON but one or two +return a plaintext string. + +All endpoints will set an appropriate HTTP status code, using `200` for success and codes greater than or equal to `400` for error. + +`/api/v1` endpoints guarantee backwards compatibility. + +## API Version 2 + +*Note: API Version 2 is under development, and not stable. The guidelines here are subject to change.* + +`/api/v2` endpoints have a standard format. + +All `/api/v2` `POST` endpoints accept only `application/json` and return `application/json`. + +All `/api/v2` `GET` requires accept data in the query string. +In the future we may have choose to have `GET` requests also accept `POST` with a JSON body, +to support requests with a large query body, such as when requesting data for a large number +of addresses or transactions. + +`/api/v2` responses are always JSON. If there is an error, the JSON object will +look like this: + +```json +{ + "error": { + "code": 400, + "message": "bad arguments" + } +} +``` + +Response data will be included in a `"data"` field, which will always be a JSON object (not an array). + +Some endpoints may return both `"error"` and `"data"`. This will be noted in the documentation for that endpoint. + +All responses will set an appropriate HTTP status code indicating an error, and it will be equal to the value of `response["error"]["code"]`. + +Since `/api/v2` is still under development, there are no guarantees for backwards compatibility. +However, any changes to the API will be recorded in the [changelog](../../CHANGELOG.md). + +Under some circumstances an error response body may not be valid JSON. +Any client consuming the API should accomodate this and conditionally parse JSON for non-`200` responses. + +## API Sets + +API endpoints are grouped into "sets" which can be toggled with the command line parameters +`-enable-api-sets`, `-disable-api-sets` and `-enable-all-api-sets`. + +These API sets are: + +* `READ` - All query-related endpoints, they do not modify the state of the program +* `STATUS` - A subset of `READ`, these endpoints report the application, network or blockchain status +* `TXN` - Enables `/api/v1/injectTransaction` and `/api/v1/resendUnconfirmedTxns` without enabling wallet endpoints +* `WALLET` - These endpoints operate on local wallet files +* `NET_CTRL` - The `/api/v1/network/connection/disconnect` method, intended for network administration endpoints +* `INSECURE_WALLET_SEED` - This is the `/api/v1/wallet/seed` endpoint, used to decrypt and return the seed from an encrypted wallet. It is only intended for use by the desktop client. +* `STORAGE` - This is the `/api/v2/data` endpoint, used to interact with the key-value storage. + +## Authentication + +Authentication can be enabled with the `-web-interface-username` and `-web-interface-password` options. +The username and password should be provided in an `Authorization: Basic` header. + +Authentication can only be enabled when using HTTPS with `-web-interface-https`, unless `-web-interface-plaintext-auth` is enabled. + +## CSRF + +All `POST`, `PUT` and `DELETE` requests require a CSRF token, obtained with a `GET /api/v1/csrf` call. +The token must be placed in the `X-CSRF-Token` header. A token is only valid +for 30 seconds and it is expected that the client obtains a new CSRF token +for each request. Requesting a CSRF token invalidates any previous CSRF token. + +A request rejected for invalid or expired CSRF will respond with `403 Forbidden - invalid CSRF token` +as the response body. + +### Get current csrf token + +API sets: any + +``` +URI: /api/v1/csrf +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/csrf +``` + +Result: + +```json +{ + "csrf_token": "klSgXoMOFTvEnt8KptBvHjhlFnW0OIkzyFVn4i8frDvIus9iLsFukqA9sM9Rxf3pLZHRLr82vBQxTq50vbYA8g" +} +``` + +## General system checks + +### Health check + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/health +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/health +``` + +Response: + +```json +{ + "blockchain": { + "head": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "unspents": 38171, + "unconfirmed": 1, + "time_since_last_block": "4m46s" + }, + "version": { + "version": "0.25.0", + "commit": "8798b5ee43c7ce43b9b75d57a1a6cd2c1295cd1e", + "branch": "develop" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.25.0", + "open_connections": 8, + "outgoing_connections": 5, + "incoming_connections": 3, + "uptime": "6m30.629057248s", + "csrf_enabled": true, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": true, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 1542443907, + "fiber": { + "name": "skycoin", + "display_name": "Skycoin", + "ticker": "SKY", + "coin_hours_display_name": "Coin Hours", + "coin_hours_display_name_singular": "Coin Hour", + "coin_hours_ticker": "SCH", + "explorer_url": "https://explorer.skycoin.com", + "bip44_coin": 8000 + } +} +``` + +### Version info + +API sets: any + +``` +URI: /api/v1/version +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/version +``` + +Result: + +```json +{ + "version": "0.20.0", + "commit": "cc733e9922d85c359f5f183d3a3a6e42c73ccb16", + "branch": "develop" +} +``` + + + +## Simple query APIs + +### Get balance of addresses + +API sets: `READ` + +``` +URI: /api/v1/balance +Method: GET, POST +Args: + addrs: comma-separated list of addresses. must contain at least one address +``` + +Returns the cumulative and individual balances of one or more addresses. +The `POST` method can be used if many addresses need to be queried. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/balance?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq,2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6 +``` + +Result: + +```json +{ + "confirmed": { + "coins": 21000000, + "hours": 142744 + }, + "predicted": { + "coins": 21000000, + "hours": 142744 + }, + "addresses": { + "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + }, + "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD": { + "confirmed": { + "coins": 9000000, + "hours": 88075 + }, + "predicted": { + "coins": 9000000, + "hours": 88075 + } + }, + "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq": { + "confirmed": { + "coins": 12000000, + "hours": 54669 + }, + "predicted": { + "coins": 12000000, + "hours": 54669 + } + } + } +} +``` + +### Get unspent output set of address or hash + +API sets: `READ` + +``` +URI: /api/v1/outputs +Method: GET, POST +Args: + addrs: address list, joined with "," + hashes: hash list, joined with "," +``` + +Addrs and hashes cannot be combined. + +In the response, `"head_outputs"` are outputs in the current unspent output set, +`"outgoing_outputs"` are head outputs that are being spent by an unconfirmed transaction, +and `"incoming_outputs"` are outputs that will be created by an unconfirmed transaction. + +The current head block header is returned as `"head"`. + +The `POST` method can be used if many addresses or hashes need to be queried. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/outputs?addrs=6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY +``` + +or + +```sh +curl http://127.0.0.1:6420/api/v1/outputs?hashes=7669ff7350d2c70a88093431a7b30d3e69dda2319dcb048aa80fa0d19e12ebe0 +``` + +Result: + +```json +{ + "head": { + "seq": 58891, + "block_hash": "d9ca9442febd8788de0a3093158943beca228017bf8c9c9b8529a382fad8d991", + "previous_block_hash": "098ea5c6e12370c38529ef7c7c38779f83d05f707affb747022eee77332ba510", + "timestamp": 1537580414, + "fee": 2165, + "version": 0, + "tx_body_hash": "c488835c85ccb153a6d42b39aaae01c3e30d16de33de282f4b3f6fa1ccf6f7eb", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "head_outputs": [ + { + "hash": "7669ff7350d2c70a88093431a7b30d3e69dda2319dcb048aa80fa0d19e12ebe0", + "block_seq": 22, + "time": 1494275011, + "src_tx": "b51e1933f286c4f03d73e8966186bafb25f64053db8514327291e690ae8aafa5", + "address": "6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY", + "coins": "2.000000", + "hours": 633, + "calculated_hours": 10023 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} +``` + +### Verify an address + +API sets: `READ` + +``` +URI: /api/v2/address/verify +Method: POST +Content-Type: application/json +Args: {"address": "
"} +``` + +Parses and validates a Skycoin address. Returns the address version in the response. + +Error responses: + +* `400 Bad Request`: The request body is not valid JSON or the address is missing from the request body +* `422 Unprocessable Entity`: The address is invalid + +Example for a valid address: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/address/verify \ + -H 'Content-Type: application/json' \ + -d '{"address":"2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2"}' +``` + +Result: + +```json +{ + "data": { + "version": 0 + } +} +``` + +Example for an invalid address: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/address/verify \ + -H 'Content-Type: application/json' \ + -d '{"address":"2aTnQe3ZupkG6k8S81brNC3JycGV2Em71F2"}' +``` + +Result: + +```json +{ + "error": { + "message": "Invalid checksum", + "code": 422 + } +} +``` + +## Wallet APIs + +### Get wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet +Method: GET +Args: + id: Wallet ID [required] +``` + +Example ("deterministic" wallet): + +```sh +curl http://127.0.0.1:6420/api/v1/wallet?id=2017_11_25_e5fb.wlt +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + }, + { + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3" + } + ] +} +``` + +Example ("bip44" wallet): + +```sh +curl http://127.0.0.1:6420/api/v1/wallet?id=2017_11_25_e5fb.wlt +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "bip44", + "version": "0.3", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false, + "bip44_coin": 8000 + }, + "entries": [ + { + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0, + "change": 0 + }, + { + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3", + "child_number": 1, + "change": 0 + }, + { + "address": "8C5icxR9zdkYTZZTVV3cCX7QoK4EkLuK4p", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0, + "change": 1 + } + ] +} +``` + + +### Get unconfirmed transactions of a wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/transactions +Method: GET +Args: + id: Wallet ID + verbose: [bool] include verbose transaction input data +``` + +Returns all unconfirmed transactions for all addresses in a given wallet + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are based upon the current system time, and are approximately +equal to the hours the output would have if it become confirmed immediately. + + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/transactions?id=2017_11_25_e5fb.wlt +``` + +Result: + +```json +{ + "transactions": [ + { + "transaction": { + "length": 317, + "type": 0, + "txid": "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + "inner_hash": "5d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a", + "sigs": [ + "464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f600", + "1155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c9101" + ], + "inputs": [ + "782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad", + "2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db91" + ], + "outputs": [ + { + "uxid": "bd302ef776efa8548183b89f21e90649f21b90fe2d2e90ecc1b880f2d995f226", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 247538 + }, + { + "uxid": "31058b6bfb30bfd441aec00929e75782bce47c8a75787ba519dbb268f89d2c4b", + "dst": "2awsJ2CR5H6QXCF2hwDjcvcAH9SgyfxCxgz", + "coins": "1.000000", + "hours": 247538 + } + ] + }, + "received": "2018-03-16T18:03:57.139109904+05:30", + "checked": "2018-03-16T18:03:57.139109904+05:30", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } + ] +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/transactions?id=2017_11_25_e5fb.wlt&verbose=1 +``` + +Result: + +```json +{ + "transactions": [ + { + "transaction": { + "length": 317, + "type": 0, + "txid": "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + "inner_hash": "5d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a", + "sigs": [ + "464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f600", + "1155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c9101" + ], + "fee": 495076, + "inputs": [ + { + "uxid": "782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad", + "owner": "8C5icxR9zdkYTZZTVV3cCX7QoK4EkLuK4p", + "coins": "997.000000", + "hours": 880000, + "calculated_hours": 990000 + }, + { + "uxid": "2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db91", + "owner": "23A1EWMZopUFLCwtXMe2CU9xTCbi5Gth643", + "coins": "2.000000", + "hours": 10, + "calculated_hours": 152 + } + ], + "outputs": [ + { + "uxid": "bd302ef776efa8548183b89f21e90649f21b90fe2d2e90ecc1b880f2d995f226", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 247538 + }, + { + "uxid": "31058b6bfb30bfd441aec00929e75782bce47c8a75787ba519dbb268f89d2c4b", + "dst": "2awsJ2CR5H6QXCF2hwDjcvcAH9SgyfxCxgz", + "coins": "1.000000", + "hours": 247538 + } + ] + }, + "received": "2018-03-16T18:03:57.139109904+05:30", + "checked": "2018-03-16T18:03:57.139109904+05:30", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } + ] +} +``` + +### Get wallets + +API sets: `WALLET` + +``` +URI: /api/v1/wallets +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallets +``` + +Result: + +```json +[ + { + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "8C5icxR9zdkYTZZTVV3cCX7QoK4EkLuK4p", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + }, + { + "address": "23A1EWMZopUFLCwtXMe2CU9xTCbi5Gth643", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3" + } + ] + } +] +``` + +### Get wallet folder name + +API sets: `WALLET` + +``` +URI: /api/v1/wallets/folderName +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallets/folderName +``` + +Result: + +```json +{ + "address": "/Users/user/.skycoin/wallets" +} +``` + +### Generate wallet seed + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/newSeed +Method: GET +Args: + entropy: seed entropy [optional] + can either be 128 or 256; 128 = 12 word seed, 256 = 24 word seed + default: 128 +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/newSeed +``` + +Result: + +```json +{ + "seed": "helmet van actor peanut differ icon trial glare member cancel marble rack" +} +``` + +### Verify wallet Seed + +API sets: `WALLET` + +``` +URI: /api/v2/wallet/seed/verify +Method: POST +Args: + seed: seed to be verified +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/seed/verify \ + -H 'Content-type: application/json' \ + -d '{ "seed": "nut wife logic sample addict shop before tobacco crisp bleak lawsuit affair" }' +``` + +Result: + +```json +{ + "data": {} +} +``` + +Example (wrong bip39 seed): + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/seed/verify \ + -H 'Content-type: application/json' \ + -d '{ "seed": "wrong seed" }' +``` + +Result: + +```json +{ + "error": { + "message": "Mnemonic must have 12, 15, 18, 21 or 24 words", + "code": 422 + } +} +``` + +### Create wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/create +Method: POST +Args: + seed: wallet seed [required] + seed-passphrase: wallet seed passphrase [optional, bip44 type wallet only] + type: wallet type [required, one of "deterministic", "bip44" or "xpub"] + bip44-coin: BIP44 coin type [optional, defaults to 8000 (skycoin's coin type), only valid if type is "bip44"] + xpub: xpub key [required for xpub wallets] + label: wallet label [required] + scan: the number of addresses to scan ahead for balances [optional, must be > 0] + encrypt: encrypt wallet [optional, bool value] + password: wallet password [optional, must be provided if encrypt is true] +``` + +Example (deterministic): + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/create \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'seed=$seed' \ + -d 'type=deterministic' \ + -d 'label=$label' \ + -d 'scan=5' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_05_09_d554.wlt", + "label": "test", + "type": "deterministic", + "version": "0.3", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "y2JeYS4RS8L9GYM7UKdjLRyZanKHXumFoH", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + } + ] +} +``` + +Example (bip44): + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/create \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'seed=$seed' \ + -d 'seed-passphrase=$seed' \ + -d 'type=bip44' \ + -d 'label=$label' \ + -d 'scan=5' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_05_09_d554.wlt", + "label": "test", + "type": "bip44", + "version": "0.3", + "crypto_type": "scrypt-chacha20poly1305", + "timestamp": 1511640884, + "encrypted": true, + "bip44_coin": 8000 + }, + "entries": [ + { + "address": "y2JeYS4RS8L9GYM7UKdjLRyZanKHXumFoH", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0, + "change": 0 + } + ] +} +``` + +Example (xpub): + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/create \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'type=xpub' \ + -d 'xpub=xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8' \ + -d 'label=$label' \ + -d 'scan=5' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_05_09_d554.wlt", + "label": "test", + "type": "bip44", + "version": "0.4", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false, + "xpub": "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8" + }, + "entries": [ + { + "address": "y2JeYS4RS8L9GYM7UKdjLRyZanKHXumFoH", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0 + } + ] +} +``` + +### Generate new address in wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/newAddress +Method: POST +Args: + id: wallet file name + num: the number you want to generate + password: wallet password +``` + +For `bip44` type wallets, the new addresses will be generated on the `external` chain (`change=0`). + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/newAddress \ + -H 'Content-Type: x-www-form-urlencoded' \ + -d 'id=2017_05_09_d554.wlt' \ + -d 'num=2' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "addresses": [ + "TDdQmMgbEVTwLe8EAiH2AoRc4SjoEFKrHB" + ] +} +``` + +### Scan addresses in wallet + +API sets: `WALLET` + +This API would scan wallet addresses ahead to search for addresses that currently have unspent outputs (coins) associated with them. + +``` +URI: /api/v1/wallet/scan +Method: POST +Args: + id: wallet file name + num: the number you want to scan ahaed [optional(default to 20), must be > 0 if provided] + password: wallet password +``` + +The return value is a list of `new` generated addresses after scanning. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/scan \ +-F id=test.wlt \ +-F num=10 \ +-F password="${password}" +``` + +Result: + +```json +{ + "addresses": [ + "TDdQmMgbEVTwLe8EAiH2AoRc4SjoEFKrHB" + ] +} +``` + +### Change wallet label + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/update +Method: POST +Args: + id: wallet file name + label: wallet label +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/update \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'id=$id' \ + -d 'label=$label' +``` + +Result: + +```json +"success" +``` + +### Get wallet balance + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/balance +Method: GET +Args: + id: wallet file name +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/balance?id=2018_03_07_3088.wlt +``` + +Result: + +```json +{ + "confirmed": { + "coins": 210400000, + "hours": 1873147 + }, + "predicted": { + "coins": 210400000, + "hours": 1873147 + }, + "addresses": { + "AXrFisGovRhRHipsbGahs4u2hXX7pDRT5p": { + "confirmed": { + "coins": 1250000, + "hours": 941185 + }, + "predicted": { + "coins": 1250000, + "hours": 941185 + } + }, + "AtNorKBpCgkSRL7zES7aAQyNjqjqPp2QJU": { + "confirmed": { + "coins": 1150000, + "hours": 61534 + }, + "predicted": { + "coins": 1150000, + "hours": 61534 + } + }, + "VUv9ehMZWmDvwWV36BQ3eL1ujb4MQ5TGyK": { + "confirmed": { + "coins": 208000000, + "hours": 870428 + }, + "predicted": { + "coins": 208000000, + "hours": 870428 + } + }, + "j4mbF1fTe8jgXbrRARZSBjDpD1hMGSe1E4": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + }, + "uyqBPcRCWucHXs18e9VZyNEeuNsD5tFDhy": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} +``` + +### Create transaction + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/transaction +Method: POST +Content-Type: application/json +Args: JSON body, see examples +``` + +Creates a transaction, returning the transaction preview and the encoded, serialized transaction. +The `encoded_transaction` can be provided to `POST /api/v1/injectTransaction` to broadcast it to the network +if the transaction is fully signed. + +The request body includes: + +* An optional change address +* A wallet to spend from with the optional ability to restrict which addresses or which unspent outputs in the wallet to use +* A list of destinations with address and coins specified, as well as optionally specifying hours +* A configuration for how destination hours are distributed, either manual or automatic +* Additional options + +`change_address` is optional. If not provided and the wallet is a `deterministic` type +wallet, then the change address will default to an address from one of the +unspent outputs being spent as a transaction input. If the wallet is a `bip44` type +wallet, then a new, unused change address will be created. + +Example request body with manual hours selection type, unencrypted wallet and all wallet addresses may spend: + +```json +{ + "hours_selection": { + "type": "manual" + }, + "wallet_id": "foo.wlt", + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032", + "hours": "7" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2", + "hours": "0" + }], + "unsigned": false, + "ignore_unconfirmed": false +} +``` + +Example request body with auto hours selection type, encrypted wallet, specified spending addresses: + +```json +{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "wallet_id": "foo.wlt", + "password": "foobar", + "addresses": ["2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc"], + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2" + }], + "unsigned": false, + "ignore_unconfirmed": false +} +``` + +Example request body with manual hours selection type, unencrypted wallet and spending specific unspent outputs: + +```json +{ + "hours_selection": { + "type": "manual" + }, + "wallet_id": "foo.wlt", + "unspents": ["519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85"], + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032", + "hours": "7" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2", + "hours": "0" + }], + "unsigned": false, + "ignore_unconfirmed": false +} +``` + + +The `hours_selection` field has two types: `manual` or `auto`. + +If `manual`, all destination hours must be specified. + +If `auto`, the `mode` field must be set. The only valid value for `mode` is `"share"`. +For the `"share"` mode, `share_factor` must also be set. This must be a decimal value greater than or equal to 0 and less than or equal to 1. +In the auto share mode, the remaining hours after the fee are shared between the destination addresses as a whole, +and the change address. Amongst the destination addresses, the shared hours are distributed proportionally. + +When using the `auto` `"share"` `mode`, if there are remaining coin hours as change, +but no coins are available as change from the wallet (which are needed to retain the coin hours as change), +the `share_factor` will switch to `1.0` so that extra coin hours are distributed to the outputs +instead of being burned as an additional fee. +For the `manual` mode, if there are leftover coin hours but no coins to make change with, +the leftover coin hours will be burned in addition to the required fee. + +All objects in `to` must be unique; a single transaction cannot create multiple outputs with the same `address`, `coins` and `hours`. + +For example, this is a valid value for `to`, if `hours_selection.type` is `"manual"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "1" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "2" +}] +``` + +But this is an invalid value for `to`, if `hours_selection.type` is `"manual"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "1" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "1" +}] +``` + +And this is a valid value for `to`, if `hours_selection.type` is `"auto"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.201" +}] +``` + +But this is an invalid value for `to`, if `hours_selection.type` is `"auto"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2" +}] +``` + +To control which addresses to spend from, specify `addresses`. +A subset of the unspent outputs associated with these addresses will be chosen for spending, +based upon an internal selection algorithm. + +To control which unspent outputs to spend from, specify `unspents`. +A subset of these unspent outputs will be chosen for spending, +based upon an internal selection algorithm. + +`addresses` and `unspents` cannot be combined. + +If neither `addresses` nor `unspents` are specified, +then all outputs associated with all addresses in the wallet may be chosen from to spend with. + +`change_address` is optional. +If set, it is not required to be an address in the wallet. +If not set, it will default to one of the addresses associated with the unspent outputs being spent in the transaction. + +`ignore_unconfirmed` is optional and defaults to `false`. +When `false`, the API will return an error if any of the unspent outputs +associated with the wallet addresses or the wallet outputs appear as spent in +a transaction in the unconfirmed transaction pool. +When `true`, the API will ignore unspent outputs that appear as spent in +a transaction in the unconfirmed transaction pool when building the transaction, +but not return an error. + +`unsigned` is optional and defaults to `false`. +When `true`, the transaction will not be signed by the wallet. +An unsigned transaction will be returned. +The `"txid"` value of the `"transaction"` object will need to be updated +after signing the transaction. +The unsigned `encoded_transaction` can be sent to `POST /api/v2/wallet/transaction/sign` for signing. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/transaction -H 'content-type: application/json' -d '{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "wallet_id": "foo.wlt", + "change_address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "to": [{ + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1" + }, { + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.99" + }] +}' +``` + +Result: + +```json +{ + "transaction": { + "length": 257, + "type": 0, + "txid": "5f060918d2da468a784ff440fbba80674c829caca355a27ae067f465d0a5e43e", + "inner_hash": "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + "fee": "437691", + "sigs": [ + "6120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100" + ], + "inputs": [ + { + "uxid": "7068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b", + "address": "g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", + "coins": "10.000000", + "hours": "853667", + "calculated_hours": "862290", + "timestamp": 1524242826, + "block": 23575, + "txid": "ccfbb51e94cb58a619a82502bc986fb028f632df299ce189c2ff2932574a03e7" + } + ], + "outputs": [ + { + "uxid": "519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1.000000", + "hours": "22253" + }, + { + "uxid": "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.990000", + "hours": "200046" + }, + { + "uxid": "fdeb3f77408f39e50a8e3b6803ce2347aac2eba8118c494424f9fa4959bab507", + "address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "0.010000", + "hours": "222300" + } + ] + }, + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" +} +``` + + +### Sign transaction + +API sets: `WALLET` + +``` +URI: /api/v2/wallet/transaction/sign +Method: POST +Content-Type: application/json +Args: JSON body, see examples +``` + +Signs an unsigned transaction, returning the transaction with updated signatures and the encoded, serialized transaction. +The transaction must spendable to be signed. If the inputs of the transaction are not in the unspent pool, signing fails. + +Specific transaction inputs may be signed by specifying `sign_indexes`, otherwise all transaction inputs will be signed. +`sign_indexes` is an array of positional indexes for the transaction's signature array. Indexes start at 0. + +Signing an input that is already signed in the transaction is an error. + +The `encoded_transaction` can be provided to `POST /api/v1/injectTransaction` to broadcast it to the network, if the transaction is fully signed. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/transaction/sign -H 'content-type: application/json' -d '{ + "wallet_id": "foo.wlt", + "password": "password", + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" +}' +``` + +Example with `sign_indexes`: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/transaction/sign -H 'content-type: application/json' -d '{ + "wallet_id": "foo.wlt", + "password": "password", + "sign_indexes": [1, 2], + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" +}' +``` + +Result: + +```json +{ + "data": { + "transaction": { + "length": 257, + "type": 0, + "txid": "5f060918d2da468a784ff440fbba80674c829caca355a27ae067f465d0a5e43e", + "inner_hash": "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + "fee": "437691", + "sigs": [ + "6120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100" + ], + "inputs": [ + { + "uxid": "7068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b", + "address": "g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", + "coins": "10.000000", + "hours": "853667", + "calculated_hours": "862290", + "timestamp": 1524242826, + "block": 23575, + "txid": "ccfbb51e94cb58a619a82502bc986fb028f632df299ce189c2ff2932574a03e7" + } + ], + "outputs": [ + { + "uxid": "519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1.000000", + "hours": "22253" + }, + { + "uxid": "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.990000", + "hours": "200046" + }, + { + "uxid": "fdeb3f77408f39e50a8e3b6803ce2347aac2eba8118c494424f9fa4959bab507", + "address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "0.010000", + "hours": "222300" + } + ] + }, + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" + } +} +``` + + +### Unload wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/unload +Method: POST +Args: + id: wallet file name +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/unload \ + -H 'Content-Type: x-www-form-urlencoded' \ + -d 'id=2017_05_09_d554.wlt' +``` + +### Encrypt wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/encrypt +Method: POST +Args: + id: wallet id + password: wallet password +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/encrypt \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'id=test.wlt' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "test.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "scrypt-chacha20poly1305", + "timestamp": 1521083044, + "encrypted": true + }, + "entries": [ + { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + } + ] +} +``` + +### Decrypt wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/decrypt +Method: POST +Args: + id: wallet id + password: wallet password +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/decrypt \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'id=test.wlt' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "test.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1521083044, + "encrypted": false + }, + "entries": [ + { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "public_key": "032a1218cbafc8a93233f363c19c667cf02d42fa5a8a07c0d6feca79e82d72753d" + } + ] +} +``` + +### Get wallet seed + +API sets: `INSECURE_WALLET_SEED` + +``` +URI: /api/v1/wallet/seed +Method: POST +Args: + id: wallet id + password: wallet password +``` + +This endpoint only works for encrypted wallets. +If the wallet is unencrypted, the seed will not be returned. + +If the wallet is of type `bip44` and has a seed passphrase, it will be included +in the response. Otherwise, the seed passphrase will be missing. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/seed \ + -H 'Content-type: application/x-www-form-urlencoded' \ + -d 'id=test.wlt' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "seed": "your wallet seed", + "seed_passphrase": "your optional wallet seed-passphrase" +} +``` + +### Recover encrypted wallet by seed + +API sets: `INSECURE_WALLET_SEED` + +``` +URI: /api/v2/wallet/recover +Method: POST +Args: + id: wallet id + seed: wallet seed + seed passphrase: wallet seed passphrase (bip44 wallets only) + password: [optional] password to encrypt the recovered wallet with +``` + +Recovers an encrypted wallet by providing the wallet seed and optional seed passphrase. + +Example: + +```sh +curl -X POST http://127.0.0.1/api/v2/wallet/recover + -H 'Content-Type: application/json' \ + -d '{"id":"2017_11_25_e5fb.wlt","seed":"your wallet seed","seed_passphrase":"your seed passphrase"}' +``` + +Result: + +```json +{ + "data": { + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + }, + { + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3" + } + ] + } +} +``` + +## Key-value storage APIs + +Endpoints interact with the key-value storage. Each request require the `type` argument to +be passed. + +Currently allowed types: + +* `txid`: used for transaction notes +* `client`: used for generic client data, instead of using e.g. LocalStorage in the browser + +### Get all storage values + +API sets: `STORAGE` + +``` +Method: GET +URI: /api/v2/data +Args: + type: storage type + key [string]: key of the specific value to get +``` + +If key is passed, only the specific value will be returned from the storage. +Otherwise the whole dataset will be returned. + +If the key does not exist, a 404 error is returned. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v2/data?type=txid +``` + +Result: + +```json +{ + "data": { + "key1": "value", + "key2": "{\"key\":\"value\"}" + } +} +``` + +Example (key): + +```sh +curl http://127.0.0.1:6420/api/v2/data?type=txid&key=key1 +``` + +Result: + +```json +{ + "data": "value" +} +``` + +### Add value to storage + +API sets: `STORAGE` + +``` +Method: POST +URI: /api/v2/data +Args: JSON Body, see examples +``` + +Sets one or more values by key. Existing values will be overwritten. + +Example request body: + +```json +{ + "type": "txid", + "key": "key1", + "val": "val1" +} +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/data -H 'Content-Type: application/json' -d '{ + "type": "txid", + "key": "key1", + "val": "val1" +}' +``` + +Result: + +```json +{} +``` + +### Remove value from storage + +API sets: `STORAGE` + +``` +Method: DELETE +URI: /api/v2/data +Args: + type: storage type + key: key of the specific value to get +``` + +Deletes a value by key. Returns a 404 error if the key does not exist. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v2/data?type=txid&key=key1 +``` + +Result: + +```json +{} +``` + +## Transaction APIs + +### Get unconfirmed transactions + +API sets: `READ` + +``` +URI: /api/v1/pendingTxs +Method: GET +Args: + verbose [bool] include verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are calculated based upon the current system time, and provide an approximate +coin hour value of the output if it were to be confirmed at that instant. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/pendingTxs +``` + +Result: + +```json +[ + { + "transaction": { + "length": 317, + "type": 0, + "txid": "89578005d8730fe1789288ee7dea036160a9bd43234fb673baa6abd91289a48b", + "inner_hash": "cac977eee019832245724aa643ceff451b9d8b24612b2f6a58177c79e8a4c26f", + "sigs": [ + "3f084a0c750731dd985d3137200f9b5fc3de06069e62edea0cdd3a91d88e56b95aff5104a3e797ab4d6d417861af0c343efb0fff2e5ba9e7cf88ab714e10f38101", + "e9a8aa8860d189daf0b1dbfd2a4cc309fc0c7250fa81113aa7258f9603d19727793c1b7533131605db64752aeb9c1f4465198bb1d8dd597213d6406a0a81ed3701" + ], + "inputs": [ + "bb89d4ed40d0e6e3a82c12e70b01a4bc240d2cd4f252cfac88235abe61bd3ad0", + "170d6fd7be1d722a1969cb3f7d45cdf4d978129c3433915dbaf098d4f075bbfc" + ], + "outputs": [ + { + "uxid": "ec9cf2f6052bab24ec57847c72cfb377c06958a9e04a077d07b6dd5bf23ec106", + "dst": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "coins": "60.000000", + "hours": 2458 + }, + { + "uxid": "be40210601829ba8653bac1d6ecc4049955d97fb490a48c310fd912280422bd9", + "dst": "2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc", + "coins": "1.000000", + "hours": 2458 + } + ] + }, + "received": "2017-05-09T10:11:57.14303834+02:00", + "checked": "2017-05-09T10:19:58.801315452+02:00", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } +] +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/pendingTxs?verbose=1 +``` + +Result: + +```json +[ + { + "transaction": { + "length": 220, + "type": 0, + "txid": "d455564dcf1fb666c3846cf579ff33e21c203e2923938c6563fe7fcb8573ba44", + "inner_hash": "4e73155db8ed04a3bd2b953218efcc9122ebfbf4c55f08f50d1563e48eacf71d", + "fee": 12855964, + "sigs": [ + "17330c256a50e2117ddccf51f1980fc14380f0f9476432196ade3043668759847b97e1b209961458745684d9239541f79d9ca9255582864d30a540017ab84f2b01" + ], + "inputs": [ + { + "uxid": "27e7bc48ceca4d47e806a87100a8a98592b7618702e1cd479bf4c190462a6d09", + "owner": "23MjQipM9YsPKkYiuaBmf6m7fD54wrzHxpd", + "coins": "7815.000000", + "hours": 279089, + "calculated_hours": 13101146 + } + ], + "outputs": [ + { + "uxid": "4b4ebf62acbaece798d0dfc92fcea85768a2874dad8a9b8eb5454288deae468c", + "dst": "23MjQipM9YsPKkYiuaBmf6m7fD54wrzHxpd", + "coins": "586.000000", + "hours": 122591 + }, + { + "uxid": "781cfb134d5fdad48f3c937dfcfc66b169a305adc8abdfe92a0ec94c564913f2", + "dst": "2ehrG4VKLRuvBNWYz3U7tS75QWvzyWR89Dg", + "coins": "7229.000000", + "hours": 122591 + } + ] + }, + "received": "2018-06-20T14:14:52.415702671+08:00", + "checked": "2018-08-26T19:47:45.328131142+08:00", + "announced": "2018-08-26T19:51:47.356083569+08:00", + "is_valid": true + } +] +``` + +### Create transaction from unspent outputs or addresses + +API sets: `TXN` + +``` +URI: /api/v2/transaction +Method: POST +Args: JSON Body, see examples +``` + +Creates an unsigned transaction from a pool of unspent outputs or addresses. +`addresses` and `unspents` cannot be combined, and at least one must have elements in their array. + +The transaction will choose unspent outputs from the provided pool to construct a transaction +that satisfies the requested outputs in the `to` field. Not all unspent outputs will necessarily be used +in the transaction. + +If `ignore_unconfirmed` is true, the transaction will not use any outputs which are being spent by an unconfirmed transaction. +If `ignore_unconfirmed` is false, the endpoint returns an error if any unspent output is spent by an unconfirmed transaction. + +`change_address` is optional. If not provided then the change address will +default to an address from one of the +unspent outputs being spent as a transaction input. + +Refer to `POST /api/v1/wallet/transaction` for creating a transaction from a specific wallet. + +`POST /api/v2/wallet/transaction/sign` can be used to sign the transaction with a wallet, +but `POST /api/v1/wallet/transaction` can create and sign a transaction with a wallet in one operation instead. +Otherwise, sign the transaction separately from the API. + +The transaction must be fully valid and spendable (except for the lack of signatures) or else an error is returned. + +Example request body with manual hours selection type, spending from specific addresses, ignoring unconfirmed unspent outputs: + +```json +{ + "hours_selection": { + "type": "manual" + }, + "addresses": ["g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS"], + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032", + "hours": "7" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2", + "hours": "0" + }], + "ignore_unconfirmed": false +} +``` + +Example request body with auto hours selection type, spending specific uxouts: + +```json +{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "unspents": ["519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85"], + "change_address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "to": [{ + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1" + }, { + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.99" + }] +} +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/transaction -H 'Content-Type: application/json' -d '{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "addresses": ["g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp"], + "change_address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "to": [{ + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1" + }, { + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.99" + }] +}' +``` + +Result: + +```json +{ + "data": { + "transaction": { + "length": 257, + "type": 0, + "txid": "5f060918d2da468a784ff440fbba80674c829caca355a27ae067f465d0a5e43e", + "inner_hash": "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + "fee": "437691", + "sigs": [ + "6120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100" + ], + "inputs": [ + { + "uxid": "7068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b", + "address": "g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", + "coins": "10.000000", + "hours": "853667", + "calculated_hours": "862290", + "timestamp": 1524242826, + "block": 23575, + "txid": "ccfbb51e94cb58a619a82502bc986fb028f632df299ce189c2ff2932574a03e7" + } + ], + "outputs": [ + { + "uxid": "519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1.000000", + "hours": "22253" + }, + { + "uxid": "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.990000", + "hours": "200046" + }, + { + "uxid": "fdeb3f77408f39e50a8e3b6803ce2347aac2eba8118c494424f9fa4959bab507", + "address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "0.010000", + "hours": "222300" + } + ] + }, + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" + } +} +``` + +### Get transaction info by id + +API sets: `READ` + +``` +URI: /api/v1/transaction +Method: GET +Args: + txid: transaction id + verbose: [bool] include verbose transaction input data + encoded: [bool] return the transaction as hex-encoded serialized bytes +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +If the transaction is confirmed, the calculated hours are the hours the transaction had in the block in which it was executed.. +If the transaction is unconfirmed, the calculated hours are based upon the current system time, and are approximately +equal to the hours the output would have if it become confirmed immediately. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/transaction?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3 +``` + +Result: + +```json +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 1, + "block_seq": 1178 + }, + "txn": { + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "timestamp": 1494275231, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191" + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/transaction?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3&verbose=1 +``` + +Result: + +```json +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53107, + "block_seq": 1178 + }, + "time": 1494275231, + "txn": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53107, + "block_seq": 1178 + }, + "timestamp": 1494275231, + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "fee": 6523, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454, + "calculated_hours": 7454 + } + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } +} +``` + +Example (encoded): + +```sh +curl http://127.0.0.1:6420/api/v1/transaction?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3&encoded=1 +``` + +Result: + +```json +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53267, + "block_seq": 1178 + }, + "time": 1494275231, + "encoded_transaction": "b700000000075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e010000009b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00010000005287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191010000000010722f061aa262381dce35193d43eceb112373c300127a0000000000a303000000000000" +} +``` + +### Get raw transaction by id + +API sets: `READ` + +``` +URI: /api/v1/rawtx +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/rawtx?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3 +``` + +Result: + +```json +"b700000000075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e010000009b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00010000005287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191010000000010722f061aa262381dce35193d43eceb112373c300127a0000000000a303000000000000" +``` + +### Inject raw transaction + +API sets: `TXN`, `WALLET` + +``` +URI: /api/v1/injectTransaction +Method: POST +Content-Type: application/json +Body: {"rawtx": "hex-encoded serialized transaction string"} +Errors: + 400 - Bad input + 500 - Other + 503 - Network unavailable (transaction failed to broadcast) +``` + +Broadcasts a hex-encoded, serialized transaction to the network. +Transactions are serialized with the `encoder` package. +See [`coin.Transaction.Serialize`](https://godoc.org/github.com/skycoin/skycoin/src/coin#Transaction.Serialize). + +If there are no available connections, the API responds with a `503 Service Unavailable` error. + +Note that in some circumstances the transaction can fail to broadcast but this endpoint will still return successfully. +This can happen if the node's network has recently become unavailable but its connections have not timed out yet. + +The recommended way to handle transaction injections from your system is to inject the transaction then wait +for the transaction to be confirmed. Transactions typically confirm quickly, so if it is not confirmed after some +timeout such as 1 minute, the application can continue to retry the broadcast with `/api/v1/resendUnconfirmedTxns`. +Broadcast only fails without an error if the node's peers disconnect or timeout after the broadcast was initiated, +which is a network problem that may recover, so rebroadcasting with `/api/v1/resendUnconfirmedTxns` will resolve it, +or else the network is unavailable. + +`POST /api/v1/transaction` accepts an `ignore_unconfirmed` option to allow transactions to be created without waiting +for unconfirmed transactions to confirm. + +Any unconfirmed transactions found in the database at startup are resent. So, if the network broadcast failed but +the transaction was saved to the database, when you restart the client, it will resend. + +It is safe to retry the injection after a `503` failure. + +To disable the network broadcast, add `"no_broadcast": true` to the JSON request body. +The transaction will be added to the local transaction pool but not be broadcast at the same time. +Note that transactions from the pool are periodically announced, so this transaction will still +be announced eventually if the daemon continues running with connectivity for enough time. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/injectTransaction -H 'content-type: application/json' -d '{ + "rawtx":"dc0000000008b507528697b11340f5a3fcccbff031c487bad59d26c2bdaea0cd8a0199a1720100000017f36c9d8bce784df96a2d6848f1b7a8f5c890986846b7c53489eb310090b91143c98fd233830055b5959f60030b3ca08d95f22f6b96ba8c20e548d62b342b5e0001000000ec9cf2f6052bab24ec57847c72cfb377c06958a9e04a077d07b6dd5bf23ec106020000000072116096fe2207d857d18565e848b403807cd825c044840300000000330100000000000000575e472f8c5295e8fa644e9bc5e06ec10351c65f40420f000000000066020000000000000" +}' +``` + +Result: + +```json +"3615fc23cc12a5cb9190878a2151d1cf54129ff0cd90e5fc4f4e7debebad6868" +``` + +Example, without broadcasting the transaction: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/injectTransaction -H 'content-type: application/json' -d '{ + "rawtx":"dc0000000008b507528697b11340f5a3fcccbff031c487bad59d26c2bdaea0cd8a0199a1720100000017f36c9d8bce784df96a2d6848f1b7a8f5c890986846b7c53489eb310090b91143c98fd233830055b5959f60030b3ca08d95f22f6b96ba8c20e548d62b342b5e0001000000ec9cf2f6052bab24ec57847c72cfb377c06958a9e04a077d07b6dd5bf23ec106020000000072116096fe2207d857d18565e848b403807cd825c044840300000000330100000000000000575e472f8c5295e8fa644e9bc5e06ec10351c65f40420f000000000066020000000000000", + "no_broadcast": true +}' +``` + +Result: + +```json +"3615fc23cc12a5cb9190878a2151d1cf54129ff0cd90e5fc4f4e7debebad6868" +``` + + +### Get transactions for addresses + +API sets: `READ` + +``` +URI: /api/v1/transactions +Method: GET, POST +Args: + addrs: Comma separated addresses [optional, returns all transactions if no address is provided] + confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] + verbose: [bool] include verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +If the transaction is confirmed, the calculated hours are the hours the transaction had in the block in which it was executed. +If the transaction is unconfirmed, the calculated hours are based upon the current system time, and are approximately +equal to the hours the output would have if it become confirmed immediately. + +The `"time"` field at the top level of each object in the response array indicates either the confirmed timestamp of a confirmed +transaction or the last received timestamp of an unconfirmed transaction. + +The `POST` method can be used if many addresses need to be queried. + +To get confirmed transactions for one or more addresses: + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY&confirmed=1 +``` + +To get unconfirmed transactions for one or more addresses: + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY&confirmed=0 +``` + +To get both confirmed and unconfirmed transactions for one or more addresses: + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY +``` + +Result: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10492, + "block_seq": 1177 + }, + "time": 1494275011, + "txn": { + "length": 317, + "type": 0, + "txid": "b09cd3a8baef6a449848f50a1b97943006ca92747d4e485d0647a3ea74550eca", + "inner_hash": "2cb370051c92521a04ba5357e229d8ffa90d9d1741ea223b44dd60a1483ee0e5", + "timestamp": 1494275011, + "sigs": [ + "a55155ca15f73f0762f79c15917949a936658cff668647daf82a174eed95703a02622881f9cf6c7495536676f931b2d91d389a9e7b034232b3a1519c8da6fb8800", + "cc7d7cbd6f31adabd9bde2c0deaa9277c0f3cf807a4ec97e11872817091dc3705841a6adb74acb625ee20ab6d3525350b8663566003276073d94c3bfe22fe48e01" + ], + "inputs": [ + "4f4b0078a9cd19b3395e54b3f42af6adc997f77f04e0ca54016c67c4f2384e3c", + "36f4871646b6564b2f1ab72bd768a67579a1e0242bc68bcbcf1779bc75b3dddd" + ], + "outputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454 + }, + { + "uxid": "a1268e9bd2033b49b44afa765d20876467254f51e5515626780467267a65c563", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "1.000000", + "hours": 7454 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10491, + "block_seq": 1178 + }, + "time": 1494275231, + "txn": { + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "timestamp": 1494275231, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191" + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 8730, + "block_seq": 2939 + }, + "time": 1505205561, + "txn": { + "length": 474, + "type": 0, + "txid": "b45e571988bc07bd0b623c999655fa878fb9bdd24c8cd24fde179bf4b26ae7b7", + "inner_hash": "393804eca6afadc05db80cfb9e1024ef5761231c70705c406301bad33161f8bf", + "timestamp": 1505205561, + "sigs": [ + "fb9dd021cdff51ab56891cca0fd1600877f6e0691136dbe3f8324c3f4f7ee5bc624ded4954c1d70d8cb776ce3454d8f195bbb252e48b0f2cd388f5a733697d9301", + "0639e61ba87a61f10b0e0114008ddd4e7090d9397370de28da27b7852b231b8e66c36d10fe3424c9b23a41266fd2c50f169233009713b332d6a48ce9c128ccef01", + "055afe17222aab66c48c8e08e03a406bf2b8719f5221ec54c8e678078033bcd56b66bbc46a866f2be5e3f9ca454e3fbc2021630d0430b72e18c24d02df03c03100", + "8cf56fb96e11d49bea728cb35ba5953fbc640817fac01b82e62a959ef8d4c3105298f2a6ea127bb07552abd905a667b58f6c79717e9f05258079de08d91f10a500" + ], + "inputs": [ + "dea9266aa7b687f4391e92f04436407c51a834274a5a33bc8bcf3189732e82e3", + "e811bdce52ddac0d952d2546fdca8d1ac4e0ad32f170d3d73b724fb37c802652", + "e94ccdbc07cc62fb41140b4daa7969438c749837c0808acf20dde113bdf1876b", + "534afc496a7aee2ec55c71d85abfc27f35d16c56506f663b24d8ee4815583b6e" + ], + "outputs": [ + { + "uxid": "732e129fc1630aba3f06d833ce0a7a25f05dae5df3e7a135b5f82e99222e8c28", + "dst": "2hAjmdPP9R3um9JhKczeVdJUVugY6SPJBDm", + "coins": "6.000000", + "hours": 204 + } + ] + } + } +] +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT&verbose=1 +``` + +Result: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53207, + "block_seq": 1131 + }, + "time": 1494192581, + "txn": { + "timestamp": 1494192581, + "length": 220, + "type": 0, + "txid": "b785dc57a9b53dbf0390213480dd9dffc32356fb79b82fa622a2607894bfab98", + "inner_hash": "5279e944502d6bdaff25af7b7fb7c6e503c62ae70a01084031e1cb563afe2e2c", + "fee": 317021, + "sigs": [ + "f8cd208acc6674de79fa1192e5177325cda871c26707242dbd6fb9df245bf34b2fbc3dfe32e61eefa0543934556cb073bdeab6e555d7bfe6b7220f1ae575613d01" + ], + "inputs": [ + { + "uxid": "004d3ef83af64c542701b923ec5c727734de9d88837bcea37a2927a569dd3f0d", + "owner": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "904.000000", + "hours": 14, + "calculated_hours": 422693 + } + ], + "outputs": [ + { + "uxid": "4047c5cbbaf0ed927caa1391d5456d58e0857ef188f2eec8ee987a30b3f53aed", + "dst": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "903.000000", + "hours": 52836 + }, + { + "uxid": "4f4b0078a9cd19b3395e54b3f42af6adc997f77f04e0ca54016c67c4f2384e3c", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "1.000000", + "hours": 52836 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53206, + "block_seq": 1132 + }, + "time": 1494192731, + "txn": { + "timestamp": 1494192731, + "length": 220, + "type": 0, + "txid": "dc39c39bea82e5b56a1a77ce8485d9b06fda694e04ddf63af1273351c87dd077", + "inner_hash": "b8f36a57212a68f4b3ecf9d699f286dafcdb624551e07c35a983832ffd37326c", + "fee": 39628, + "sigs": [ + "1005adda19efe31b5cd85caa85b4a42599263f649103fd26761f2261f3ee00460d9693c45406d782b0e04613aa412a5ef6b275c2a665a9f13167912da91777a700" + ], + "inputs": [ + { + "uxid": "4047c5cbbaf0ed927caa1391d5456d58e0857ef188f2eec8ee987a30b3f53aed", + "owner": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "903.000000", + "hours": 52836, + "calculated_hours": 52836 + } + ], + "outputs": [ + { + "uxid": "a6662ea872dabee2fae96a4561d67728d16cb3da372d4b7bbc74a18f2bc3fecf", + "dst": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "895.000000", + "hours": 6604 + }, + { + "uxid": "36f4871646b6564b2f1ab72bd768a67579a1e0242bc68bcbcf1779bc75b3dddd", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 6604 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53161, + "block_seq": 1177 + }, + "time": 1494275011, + "txn": { + "timestamp": 1494275011, + "length": 317, + "type": 0, + "txid": "b09cd3a8baef6a449848f50a1b97943006ca92747d4e485d0647a3ea74550eca", + "inner_hash": "2cb370051c92521a04ba5357e229d8ffa90d9d1741ea223b44dd60a1483ee0e5", + "fee": 44726, + "sigs": [ + "a55155ca15f73f0762f79c15917949a936658cff668647daf82a174eed95703a02622881f9cf6c7495536676f931b2d91d389a9e7b034232b3a1519c8da6fb8800", + "cc7d7cbd6f31adabd9bde2c0deaa9277c0f3cf807a4ec97e11872817091dc3705841a6adb74acb625ee20ab6d3525350b8663566003276073d94c3bfe22fe48e01" + ], + "inputs": [ + { + "uxid": "4f4b0078a9cd19b3395e54b3f42af6adc997f77f04e0ca54016c67c4f2384e3c", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "1.000000", + "hours": 52836, + "calculated_hours": 52857 + }, + { + "uxid": "36f4871646b6564b2f1ab72bd768a67579a1e0242bc68bcbcf1779bc75b3dddd", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 6604, + "calculated_hours": 6777 + } + ], + "outputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454 + }, + { + "uxid": "a1268e9bd2033b49b44afa765d20876467254f51e5515626780467267a65c563", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "1.000000", + "hours": 7454 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53160, + "block_seq": 1178 + }, + "time": 1494275231, + "txn": { + "timestamp": 1494275231, + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "fee": 6523, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454, + "calculated_hours": 7454 + } + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } + } +] +``` + +### Get transactions with pagination + +``` +URI: /api/v2/transactions +Method: GET +Args: + addrs: Comma separated addresses [optional, returns all transactions if no address is provided] + confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] + verbose: [bool] include verbose transaction input data + page: Page number [optional, default to 1, must be greater than 0] + limit: The transactions number per page [optional, default to 10, maximum to 100] + sort: Sort the transactions by block seq [optional, default to asc, must be 'asc' or 'desc'] +``` + +This API is almost the same as the `v1` version, except that it would not return all transactions by default and has +pagination supported. If there are unconfirmed transactions, they will be appended after the confirmed transactions. + +If no argument is provided, the first 10 transactions will be returned. The response would have a `page_info` field which +includes `total pages`, `page size`, and `current page`. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v2/transaction?page=1024&limit=2 +``` + +
+ View Output + +```json +{ + "data": { + "page_info": { + "total_pages": 66530, + "page_size": 2, + "current_page": 1024 + }, + "txns": [ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128216, + "block_seq": 2016 + }, + "time": 1500130512, + "txn": { + "timestamp": 1500130512, + "length": 414, + "type": 0, + "txid": "f0a3c01325f3e8f09255d49b490c804b929d668fcb70ea814e1a9868b608cfdb", + "inner_hash": "85a298977f5fa338b7a73359c51b83787130b4f3db4a8425a1c54e45e317499d", + "sigs": [ + "25333b9a283691cb189e1d2ade7dd6eeb6a275be820ff031af9b877b56330f1546a875a528bab2e559236141a644f2248a19ee5fcc86b2271f9dc60fb296f3f701", + "e21fdae15af052f9b842bc062ab8a2ed42baf61fe11c60255555c0fc86b99abc659269dd907472091d392d31b3c1ad24e11176ee6a9e27da1fc57e2d8ddbd04d00", + "5e4aa1cfca62e0a0aac1c646c3917a96bb6d1c7b8cde2e255d01730eb9d436b446cd5a09dfec097d28f5e7038a05e7172e7d5ddfe4558b1f9e3c25367051ff4f00" + ], + "inputs": [ + "5d83e6df94ca78079c8689e700dcabdab2de959fe9f803b36fec34b47b07d025", + "ba1ba491090065d943ce3990b62c5d94f363bbdf37043032d79046af3687ef4c", + "cdce197632464ee9c46d48cb21c959772b8bf2aa04239399353988b937b6e149" + ], + "outputs": [ + { + "uxid": "d19549c470bb6d217bb8095df9ef14346ee8f86730208a4247420307fadbb0f0", + "dst": "WSJoAtC4XcjAxTHAFLKU6MNthhpSDX7i1z", + "coins": "3908.000000", + "hours": 1070530 + }, + { + "uxid": "1742af80ec06a3ef2123a371c6f5e82c275d881e7444f8a921818bc98032fff4", + "dst": "2f9JhZJ147v9D4KxnJwbj8i5iNxqeKL3xNh", + "coins": "50.000000", + "hours": 1070530 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128215, + "block_seq": 2017 + }, + "time": 1500130612, + "txn": { + "timestamp": 1500130612, + "length": 414, + "type": 0, + "txid": "7dc9ae6524abe9108fdc744f210b94274a9c9fdd3da16eaea1aa88037792c27d", + "inner_hash": "752142fcd1cc4b9bad972611a9e64108d91b7642e1eb6b65ac92360a0c9c6bfc", + "sigs": [ + "07973d43d4782ee96af70fa0ee4c73f667b035ade8770d55524b91e6d762a73b7bb6e24358c929609dd91c0140e51fa4f55952b45638bae699e522f4009c8f0c01", + "6d8cd2ebabcb511b1772546c898fa456bfeffefcba69aea0f6c285cda38014c015bb664f66ce0d840c71f66403782e5b6b9fd2688a212eb2e3d275aebee5856b00", + "4844a246eff8b59f177f9a4a43815b1fa8a3168c18d63b50c75773ee51c0b9c047ce59431871ba9fdb7df8827c9a2b175424f22cc6cf02a784b805b50574cc7000" + ], + "inputs": [ + "8754b0d917f6690d5e88dd0950bdcb8e09d96ffb14b76964da923f5dc8969e0c", + "8fe7df28494563a5b47abbe737c095da461235a2529dda2a1119a19965293c8b", + "421ec170519fab890e3410af5ba4cf33f71fa57d786d5d39f71b7a96ed898094" + ], + "outputs": [ + { + "uxid": "fceb40fd9e8895c050fc165d861ebcbe87789eeb89809879a662fdac854bf84e", + "dst": "2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy", + "coins": "37659.000000", + "hours": 93972 + }, + { + "uxid": "eb8c8677da0200be7a405f2e3497db9beaa6288734d85acc5488d573ce2b8399", + "dst": "fXZv5X2NXhWYShoE8jazbh5UWYVCFgUXdW", + "coins": "25000.000000", + "hours": 187945 + } + ] + } + } + ] + } +} +``` +
+ +### Resend unconfirmed transactions + +API sets: `TXN`, `WALLET` + +``` +URI: /api/v1/resendUnconfirmedTxns +Method: POST +``` + +Example: + +```sh +curl -X POST 'http://127.0.0.1:6420/api/v1/resendUnconfirmedTxns' +``` + +Result: + +```json +{ + "txids":[ + "b45e571988bc07bd0b623c999655fa878fb9bdd24c8cd24fde179bf4b26ae7b7", + "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3" + ] +} +``` + +### Verify encoded transaction + +API sets: `READ` + +``` +URI: /api/v2/transaction/verify +Method: POST +Content-Type: application/json +Args: {"unsigned": false, "encoded_transaction": ""} +``` + +If the transaction can be parsed, passes validation and has not been spent, returns `200 OK` with the decoded transaction data, +and the `"confirmed"` field will be `false`. + +If the transaction is structurally valid, passes validation but has been spent, returns `422 Unprocessable Entity` with the decoded transaction data, +and the `"confirmed"` field will be `true`. The `"error"` `"message"` will be `"transaction has been spent"`. + +`"unsigned"` may be specified in the request. If `true`, the transaction will report an error if it is fully signed. +It will not report an error if the transaction is missing at least one signature, and the remainder of the transaction is valid. +In the response, if the transaction has any unsigned inputs, the `"unsigned"` field will be `true`. +If the request did not specify `"unsigned"` or specified it as `false`, the response will return an error for an unsigned transaction. + +If the transaction can be parsed but does not pass validation, returns `422 Unprocessable Entity` with the decoded transaction data. +The `"error"` object will be included in the response with the reason why. +If the transaction's inputs cannot be found in the unspent pool nor in the historical archive of unspents, +the transaction `"inputs"` metadata will be absent and only `"uxid"` will be present. + +If the transaction can not be parsed, returns `400 Bad Request` and the `"error"` object will be included in the response with the reason why. + +Example of valid transaction that has not been spent: + +```sh +curl -X POST -H 'Content-Type: application/json' http://127.0.0.1:6420/api/v2/transaction/verify \ +-d '{"encoded_transaction": "dc000000004fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074010000007635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df1581000100000019ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d02000000003f0555073e17ea6e45283f0f1115b520d0698d03a086010000000000010000000000000000b90dc595d102c48d3281b47428670210415f585200f22b0000000000ff01000000000000"}' +``` + +Result: + +```json +{ + "data": { + "unsigned": false, + "confirmed": false, + "transaction": { + "length": 220, + "type": 0, + "txid": "82b5fcb182e3d70c285e59332af6b02bf11d8acc0b1407d7d82b82e9eeed94c0", + "inner_hash": "4fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074", + "fee": "1042", + "sigs": [ + "7635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df158100" + ], + "inputs": [ + { + "uxid": "19ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.980000", + "hours": "985", + "calculated_hours": "1554", + "timestamp": 1527080354, + "block": 30074, + "txid": "94204347ef52d90b3c5d6c31a3fced56ae3f74fd8f1f5576931aeb60847f0e59" + } + ], + "outputs": [ + { + "uxid": "b0911a5fc4dfe4524cdb82f6db9c705f4849af42fcd487a3c4abb2d17573d234", + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "coins": "0.100000", + "hours": "1" + }, + { + "uxid": "a492e6b85a434866be40da7e287bfcf14efce9803ff2fcd9d865c4046e81712a", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.880000", + "hours": "511" + } + ] + } + } +} +``` + +Example of valid transaction that *has* been spent: + +```sh +curl -X POST -H 'Content-Type: application/json' http://127.0.0.1:6420/api/v2/transaction/verify \ +-d '{"encoded_transaction": "dc000000004fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074010000007635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df1581000100000019ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d02000000003f0555073e17ea6e45283f0f1115b520d0698d03a086010000000000010000000000000000b90dc595d102c48d3281b47428670210415f585200f22b0000000000ff01000000000000"}' +``` + +Result: + +```json +{ + "error": { + "message": "transaction has been spent", + "code": 422 + }, + "data": { + "unsigned": false, + "confirmed": true, + "transaction": { + "length": 220, + "type": 0, + "txid": "82b5fcb182e3d70c285e59332af6b02bf11d8acc0b1407d7d82b82e9eeed94c0", + "inner_hash": "4fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074", + "fee": "1042", + "sigs": [ + "7635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df158100" + ], + "inputs": [ + { + "uxid": "19ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.980000", + "hours": "985", + "calculated_hours": "1554", + "timestamp": 1527080354, + "block": 30074, + "txid": "94204347ef52d90b3c5d6c31a3fced56ae3f74fd8f1f5576931aeb60847f0e59" + } + ], + "outputs": [ + { + "uxid": "b0911a5fc4dfe4524cdb82f6db9c705f4849af42fcd487a3c4abb2d17573d234", + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "coins": "0.100000", + "hours": "1" + }, + { + "uxid": "a492e6b85a434866be40da7e287bfcf14efce9803ff2fcd9d865c4046e81712a", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.880000", + "hours": "511" + } + ] + } + } +} +``` + +Example of valid, unsigned transaction that has not been spent, with the unsigned parameter set to true in the request: + +```sh +curl -X POST -H 'Content-Type: application/json' http://127.0.0.1:6420/api/v2/transaction/verify \ +-d '{"unsigned": true, "encoded_transaction": "dc000000004fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074010000007635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df1581000100000019ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d02000000003f0555073e17ea6e45283f0f1115b520d0698d03a086010000000000010000000000000000b90dc595d102c48d3281b47428670210415f585200f22b0000000000ff01000000000000"}' +``` + +Result: + +```json +{ + "data": { + "unsigned": true, + "confirmed": false, + "transaction": { + "length": 220, + "type": 0, + "txid": "82b5fcb182e3d70c285e59332af6b02bf11d8acc0b1407d7d82b82e9eeed94c0", + "inner_hash": "4fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074", + "fee": "1042", + "sigs": [ + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "inputs": [ + { + "uxid": "19ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.980000", + "hours": "985", + "calculated_hours": "1554", + "timestamp": 1527080354, + "block": 30074, + "txid": "94204347ef52d90b3c5d6c31a3fced56ae3f74fd8f1f5576931aeb60847f0e59" + } + ], + "outputs": [ + { + "uxid": "b0911a5fc4dfe4524cdb82f6db9c705f4849af42fcd487a3c4abb2d17573d234", + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "coins": "0.100000", + "hours": "1" + }, + { + "uxid": "a492e6b85a434866be40da7e287bfcf14efce9803ff2fcd9d865c4046e81712a", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.880000", + "hours": "511" + } + ] + } + } +} +``` + + +## Block APIs + +### Get blockchain metadata + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/blockchain/metadata +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/blockchain/metadata +``` + +Result: + +```json +{ + "head": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "unspents": 38171, + "unconfirmed": 1 +} +``` + +### Get blockchain progress + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/blockchain/progress +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/blockchain/progress +``` + +Result: + +```json +{ + "current": 2760, + "highest": 2760, + "peers": [ + { + "address": "35.157.164.126:6000", + "height": 2760 + }, + { + "address": "63.142.253.76:6000", + "height": 2760 + } + ] +} +``` + +### Get block by hash or seq + +API sets: `READ` + +``` +URI: /api/v1/block +Method: GET +Args: + hash: get block by hash + seq: get block by sequence number + verbose: [bool] return verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are the hours the transaction had in the block in which it was executed. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/block?hash=6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30 +``` + +or + +```sh +curl http://127.0.0.1:6420/api/v1/block?seq=2760 +``` + +Result: + +```json +{ + "header": { + "seq": 2760, + "block_hash": "6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30", + "previous_block_hash": "eaccd527ef263573c29000dbfb3c782ee175153c63f42abb671588b7071e877f", + "timestamp": 1504220821, + "fee": 196130, + "version": 0, + "tx_body_hash": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "ux_hash": "366af6bd80cfce79ce1ef63b45fb3ae8d9a6afc92a8590f14e18220884bd9d22" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "inner_hash": "312e5dd55e06be5f9a0ee43a00d447f2fea47a7f1fb9669ecb477d2768ab04fd", + "sigs": [ + "f0d0eb337e3440af6e8f0c105037ec205f36c83770d26a9e3a0fb4b7ec1a2be64764f4e31cbaf6629933c971613d10d58e6acb592704a7d511f19836441f09fb00" + ], + "inputs": [ + "e7594379c9a6bb111205cbfa6fac908cac1d136e207960eb0429f15fde09ac8c" + ], + "outputs": [ + { + "uxid": "840d0ee483c1dc085e6518e1928c68979af61188b809fc74da9fca982e6a61ba", + "dst": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "998.000000", + "hours": 35390 + }, + { + "uxid": "38177c437ff42f29dc8d682e2f7c278f2203b6b02f42b1a88f9eb6c2392a7f70", + "dst": "2YHKP9yH7baLvkum3U6HCBiJjnAUCLS5Z9U", + "coins": "2.000000", + "hours": 70780 + } + ] + } + ] + }, + "size": 220 +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/block?hash=6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30&verbose=1 +``` + +or + +```sh +curl http://127.0.0.1:6420/api/v1/block?seq=2760&verbose=1 +``` + +Result: + +```json +{ + "header": { + "seq": 2760, + "block_hash": "6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30", + "previous_block_hash": "eaccd527ef263573c29000dbfb3c782ee175153c63f42abb671588b7071e877f", + "timestamp": 1504220821, + "fee": 196130, + "version": 0, + "tx_body_hash": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "ux_hash": "366af6bd80cfce79ce1ef63b45fb3ae8d9a6afc92a8590f14e18220884bd9d22" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "inner_hash": "312e5dd55e06be5f9a0ee43a00d447f2fea47a7f1fb9669ecb477d2768ab04fd", + "fee": 196130, + "sigs": [ + "f0d0eb337e3440af6e8f0c105037ec205f36c83770d26a9e3a0fb4b7ec1a2be64764f4e31cbaf6629933c971613d10d58e6acb592704a7d511f19836441f09fb00" + ], + "inputs": [ + { + "uxid": "e7594379c9a6bb111205cbfa6fac908cac1d136e207960eb0429f15fde09ac8c", + "owner": "kbbzyrUKNVJsJDGFLAjVT5neVcx5SQjFx5", + "coins": "1000.000000", + "hours": 283123, + "calculated_hours": 302300 + } + ], + "outputs": [ + { + "uxid": "840d0ee483c1dc085e6518e1928c68979af61188b809fc74da9fca982e6a61ba", + "dst": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "998.000000", + "hours": 35390 + }, + { + "uxid": "38177c437ff42f29dc8d682e2f7c278f2203b6b02f42b1a88f9eb6c2392a7f70", + "dst": "2YHKP9yH7baLvkum3U6HCBiJjnAUCLS5Z9U", + "coins": "2.000000", + "hours": 70780 + } + ] + } + ] + }, + "size": 220 +} +``` + + +### Get blocks in specific range + +API sets: `READ` + +``` +URI: /api/v1/blocks +Method: GET, POST +Args: + start: start seq + end: end seq + seqs: comma-separated list of block seqs + verbose: [bool] return verbose transaction input data +``` + +This endpoint has two modes: range and seqs. +The `seqs` parameter cannot be combined with `start`, `end`. + +If `start` and/or `end` are provided, returns blocks in the range [`start`, `end`]. +Both start and end sequences are included in the returned array of blocks. + +If `seqs` is provided, returns blocks matching the specified sequences. +`seqs` must not contain any duplicate values. +If a block does not exist for any of the given sequence numbers, a `404` error is returned. + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are the hours the transaction had in the block in which it was executed. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/blocks?start=101&end=102 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 101, + "block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "previous_block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "timestamp": 1429274666, + "fee": 720335, + "version": 0, + "tx_body_hash": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "ux_hash": "348989599d30d3adfaaea98577963caa419ab0276279296e7d194a9cbb8cad04" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 102, + "block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "previous_block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "timestamp": 1429274686, + "fee": 710046, + "version": 0, + "tx_body_hash": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "ux_hash": "f7512b0718f392c7503f86e69175efd7835ea4c3dd3f71ff65c7ad8873a6a9e8" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + ] + }, + "size": 183 + } + ] +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/blocks?start=101&end=102&verbose=1 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 101, + "block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "previous_block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "timestamp": 1429274666, + "fee": 720335, + "version": 0, + "tx_body_hash": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "ux_hash": "348989599d30d3adfaaea98577963caa419ab0276279296e7d194a9cbb8cad04" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 102, + "block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "previous_block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "timestamp": 1429274686, + "fee": 710046, + "version": 0, + "tx_body_hash": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "ux_hash": "f7512b0718f392c7503f86e69175efd7835ea4c3dd3f71ff65c7ad8873a6a9e8" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "fee": 710046, + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54, + "calculated_hours": 811481 + } + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + ] + }, + "size": 183 + } + ] +} +``` + +Example (seqs): + +```sh +curl http://127.0.0.1:6420/api/v1/blocks?seqs=3,5,7 +``` + +```json +{ + "blocks": [ + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} +``` + + +### Get last N blocks + +API sets: `READ` + +``` +URI: /api/v1/last_blocks +Method: GET +Args: + num: number of most recent blocks to return + verbose: [bool] return verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are the hours the transaction had in the block in which it was executed. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/last_blocks?num=2 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 58893, + "block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "previous_block_hash": "1f042ed976c0cb150ea6b71c9608d65b519e4bc1c507eba9f1146e443a856c2d", + "timestamp": 1537581594, + "fee": 970389, + "version": 0, + "tx_body_hash": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "ux_hash": "bf35652af199779bc40cbeb339e8a782ff70673b07779e5c5621d37dfe13b42b" + }, + "body": { + "txns": [ + { + "length": 377, + "type": 0, + "txid": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "inner_hash": "a25232405bcef0c007bb2d7d3520f2a389e17e11125c252ab6c00168ec52c08d", + "sigs": [ + "2ff7390c3b66c6b0fbb2b4c59c8e218291d4cbb82a836bb577c7264677f4a8320f6f3ad72d804e3014728baa214c223ecced8725b64be96fe3b51332ad1eda4201", + "9e7c715f897b3c987c00ee8c6b14e4b90bb3e4e11d003b481f82042b1795b3c75eaa3d563cd0358cdabdab77cfdbead7323323cf73e781f9c1a8cf6d9b4f8ac100", + "5c9748314f2fe0cd442df5ebb8f211087111d22e9463355bf9eee583d44df1bd36addb510eb470cb5dafba0732615f8533072f80ae05fc728c91ce373ada1e7b00" + ], + "inputs": [ + "5f634c825b2a53103758024b3cb8578b17d56d422539e23c26b91ea397161703", + "16ac52084ffdac2e9169b9e057d44630dec23d18cfb90b9437d28220a3dc585d", + "8d3263890d32382e182b86f8772c7685a8f253ed475c05f7d530e9296f692bc9" + ], + "outputs": [ + { + "uxid": "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "26.913000", + "hours": 970388 + } + ] + } + ] + }, + "size": 377 + }, + { + "header": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "body": { + "txns": [ + { + "length": 257, + "type": 0, + "txid": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "inner_hash": "f7dbd09f7e9f65d87003984640f1977fb9eec95b07ef6275a1ec6261065e68d7", + "sigs": [ + "af5329e77213f34446a0ff41d249fd25bc1dae913390871df359b9bd587c95a10b625a74a3477a05cc7537cb532253b12c03349ead5be066b8e0009e79462b9501" + ], + "inputs": [ + "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7" + ], + "outputs": [ + { + "uxid": "235811602fc96cf8b5b031edb88ee1606830aa641c06e0986681552d8728ec07", + "dst": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "873da4edc01c0b5184e1f26c4c3471dd407d08e9ab36b018ab93874e7392320b", + "dst": "2XBMMDMqTTYmqs2rfjEwYDz8ABd38y9B8r7", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "42a6f0127f61e1d7bca8e9680027eddcecad772250c5634a03e56a8b1cf5a816", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.913000", + "hours": 485192 + } + ] + } + ] + }, + "size": 257 + } + ] +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/last_blocks?num=2&verbose=1 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 58893, + "block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "previous_block_hash": "1f042ed976c0cb150ea6b71c9608d65b519e4bc1c507eba9f1146e443a856c2d", + "timestamp": 1537581594, + "fee": 970389, + "version": 0, + "tx_body_hash": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "ux_hash": "bf35652af199779bc40cbeb339e8a782ff70673b07779e5c5621d37dfe13b42b" + }, + "body": { + "txns": [ + { + "length": 377, + "type": 0, + "txid": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "inner_hash": "a25232405bcef0c007bb2d7d3520f2a389e17e11125c252ab6c00168ec52c08d", + "fee": 970389, + "sigs": [ + "2ff7390c3b66c6b0fbb2b4c59c8e218291d4cbb82a836bb577c7264677f4a8320f6f3ad72d804e3014728baa214c223ecced8725b64be96fe3b51332ad1eda4201", + "9e7c715f897b3c987c00ee8c6b14e4b90bb3e4e11d003b481f82042b1795b3c75eaa3d563cd0358cdabdab77cfdbead7323323cf73e781f9c1a8cf6d9b4f8ac100", + "5c9748314f2fe0cd442df5ebb8f211087111d22e9463355bf9eee583d44df1bd36addb510eb470cb5dafba0732615f8533072f80ae05fc728c91ce373ada1e7b00" + ], + "inputs": [ + { + "uxid": "5f634c825b2a53103758024b3cb8578b17d56d422539e23c26b91ea397161703", + "owner": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.910000", + "hours": 7745, + "calculated_hours": 17458 + }, + { + "uxid": "16ac52084ffdac2e9169b9e057d44630dec23d18cfb90b9437d28220a3dc585d", + "owner": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "1.000000", + "hours": 1915246, + "calculated_hours": 1915573 + }, + { + "uxid": "8d3263890d32382e182b86f8772c7685a8f253ed475c05f7d530e9296f692bc9", + "owner": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.003000", + "hours": 7745, + "calculated_hours": 7746 + } + ], + "outputs": [ + { + "uxid": "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "26.913000", + "hours": 970388 + } + ] + } + ] + }, + "size": 377 + }, + { + "header": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "body": { + "txns": [ + { + "length": 257, + "type": 0, + "txid": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "inner_hash": "f7dbd09f7e9f65d87003984640f1977fb9eec95b07ef6275a1ec6261065e68d7", + "fee": 485194, + "sigs": [ + "af5329e77213f34446a0ff41d249fd25bc1dae913390871df359b9bd587c95a10b625a74a3477a05cc7537cb532253b12c03349ead5be066b8e0009e79462b9501" + ], + "inputs": [ + { + "uxid": "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7", + "owner": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "26.913000", + "hours": 970388, + "calculated_hours": 970388 + } + ], + "outputs": [ + { + "uxid": "235811602fc96cf8b5b031edb88ee1606830aa641c06e0986681552d8728ec07", + "dst": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "873da4edc01c0b5184e1f26c4c3471dd407d08e9ab36b018ab93874e7392320b", + "dst": "2XBMMDMqTTYmqs2rfjEwYDz8ABd38y9B8r7", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "42a6f0127f61e1d7bca8e9680027eddcecad772250c5634a03e56a8b1cf5a816", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.913000", + "hours": 485192 + } + ] + } + ] + }, + "size": 257 + } + ] +} +``` + +## Uxout APIs + +### Get uxout + +API sets: `READ` + +``` +URI: /api/v1/uxout +Method: GET +Args: + uxid +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/uxout?uxid=8b64d9b058e10472b9457fd2d05a1d89cbbbd78ce1d97b16587d43379271bed1 +``` + +Result: + +```json +{ + "uxid": "8b64d9b058e10472b9457fd2d05a1d89cbbbd78ce1d97b16587d43379271bed1", + "time": 1502870712, + "src_block_seq": 2545, + "src_tx": "ded9e671510ab300a4ea3ee126fe8e2d50b995021e2db4589c6fb4ac000fe7bb", + "owner_address": "c9zyTYwgR4n89KyzknpmGaaDarUCPEs9mV", + "coins": 2000000, + "hours": 5039, + "spent_block_seq": 2556, + "spent_tx": "b51e1933f286c4f03d73e8966186bafb25f64053db8514327291e690ae8aafa5" +} +``` + +### Get historical unspent outputs for an address + +API sets: `READ` + +``` +URI: /api/v1/address_uxouts +Method: GET +Args: + address +``` + +Returns the historical, spent outputs of a given address. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/address_uxouts?address=6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY +``` + +Result: + +```json +[ + { + "uxid": "7669ff7350d2c70a88093431a7b30d3e69dda2319dcb048aa80fa0d19e12ebe0", + "time": 1502936862, + "src_block_seq": 2556, + "src_tx": "b51e1933f286c4f03d73e8966186bafb25f64053db8514327291e690ae8aafa5", + "owner_address": "6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY", + "coins": 2000000, + "hours": 633, + "spent_block_seq": 0, + "spent_tx": "0000000000000000000000000000000000000000000000000000000000000000" + } +] +``` + +## Coin supply related information + +### Coin supply + +API sets: `READ` + +``` +URI: /api/v1/coinSupply +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/coinSupply +``` + +Result: + +```json +{ + "current_supply": "7187500.000000", + "total_supply": "25000000.000000", + "max_supply": "100000000.000000", + "current_coinhour_supply": "23499025077", + "total_coinhour_supply": "93679828577", + "unlocked_distribution_addresses": [ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm" + ], + "locked_distribution_addresses": [ + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm" + ] +} +``` + +### Richlist show top N addresses by uxouts + +API sets: `READ` + +``` +URI: /api/v1/richlist +Method: GET +Args: + n: top N addresses, [default 20, returns all if <= 0]. + include-distribution: include distribution addresses or not, default false. +``` + +Example: + +```sh +curl "http://127.0.0.1:6420/api/v1/richlist?n=4&include-distribution=true" +``` + +Result: + +```json +{ + "richlist": [ + { + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "locked": true + } + ] +} +``` + +### Count the addresses that currently have unspent outputs (coins) + +API sets: `READ` + +``` +URI: /api/v1/addresscount +Method: GET +``` + +Example: + +```sh +curl "http://127.0.0.1:6420/api/v1/addresscount" +``` + +Result: + +```json +{ + "count": 10103 +} +``` + +## Network status + +### Get information for a specific connection + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connection +Method: GET +Args: + addr: ip:port address of a known connection +``` + +Connection `"state"` value can be `"pending"`, `"connected"` or `"introduced"`. + +* The `"pending"` state is prior to connection establishment. +* The `"connected"` state is after connection establishment, but before the introduction handshake has completed. +* The `"introduced"` state is after the introduction handshake has completed. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connection?addr=176.9.84.75:6000' +``` + +Result: + +```json +{ + "id": 109548, + "address": "176.9.84.75:6000", + "last_sent": 1520675817, + "last_received": 1520675817, + "connected_at": 1520675700, + "outgoing": false, + "state": "introduced", + "mirror": 719118746, + "height": 181, + "listen_port": 6000, + "user_agent": "skycoin:0.25.0", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + } +} +``` + +### Get a list of all connections + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connections +Method: GET +Args: + states: [optional] comma-separated list of connection states ("pending", "connected" or "introduced"). Defaults to "connected,introduced" + direction: [optional] "outgoing" or "incoming". If not provided, both are included. +``` + +Connection `"state"` value can be `"pending"`, `"connected"` or `"introduced"`. + +* The `"pending"` state is prior to connection establishment. +* The `"connected"` state is after connection establishment, but before the introduction handshake has completed. +* The `"introduced"` state is after the introduction handshake has completed. + +By default, both incoming and outgoing connections in the `"connected"` or `"introduced"` state are returned. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connections' +``` + +Result: + +```json +{ + "connections": [ + { + "id": 99107, + "address": "139.162.161.41:20002", + "last_sent": 1520675750, + "last_received": 1520675750, + "connected_at": 1520675500, + "outgoing": false, + "state": "introduced", + "mirror": 1338939619, + "listen_port": 20002, + "height": 180, + "user_agent": "skycoin:0.25.0", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + } + }, + { + "id": 109548, + "address": "176.9.84.75:6000", + "last_sent": 1520675751, + "last_received": 1520675751, + "connected_at": 1520675751, + "state": "connected", + "outgoing": true, + "mirror": 0, + "listen_port": 6000, + "height": 0, + "user_agent": "", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 0, + "max_transaction_size": 0, + "max_decimals": 0 + } + }, + { + "id": 99115, + "address": "185.120.34.60:6000", + "last_sent": 1520675754, + "last_received": 1520675754, + "connected_at": 1520673013, + "outgoing": false, + "state": "introduced", + "mirror": 1931713869, + "listen_port": 6000, + "height": 180, + "user_agent": "", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 0, + "max_transaction_size": 0, + "max_decimals": 0 + } + } + ] +} +``` + + +### Get a list of all default connections + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/defaultConnections +Method: GET +``` + +Returns addresses in the default hardcoded list of peers. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/defaultConnections' +``` + +Result: + +```json +[ + "104.237.142.206:6000", + "118.178.135.93:6000", + "139.162.7.132:6000", + "172.104.85.6:6000", + "176.58.126.224:6000", + "47.88.33.156:6000" +] +``` + +### Get a list of all trusted connections + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connections/trust +Method: GET +``` + +Returns addresses marked as trusted in the peerlist. +This is typically equal to the list of addresses in the default hardcoded list of peers. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connections/trust' +``` + +Result: + +```json +[ + "104.237.142.206:6000", + "118.178.135.93:6000", + "139.162.7.132:6000", + "172.104.85.6:6000", + "176.58.126.224:6000", + "47.88.33.156:6000" +] +``` + +### Get a list of all connections discovered through peer exchange + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connections/exchange +Method: GET +``` + +Returns addresses from the peerlist that are known to have an open port. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connections/exchange' +``` + +Result: + +```json +[ + "104.237.142.206:6000", + "116.62.220.158:7200", + "118.237.210.163:6000", + "139.162.161.41:20000", + "139.162.161.41:20001", + "139.162.161.41:20002", + "139.162.33.154:6000", + "139.162.7.132:6000", + "155.94.137.34:6000", + "164.132.108.92:6000", + "165.227.199.63:6000", + "172.104.145.6:6000", + "172.104.52.230:7200", + "172.104.85.6:6000", + "173.212.205.184:6000", + "173.249.30.221:6000", + "176.58.126.224:6000", + "176.9.84.75:6000", + "185.120.34.60:6000", + "35.201.160.163:6000", + "47.88.33.156:6000" +] +``` + +### Disconnect a peer + +API sets: `NET_CTRL` + +``` +URI: /api/v1/network/connection/disconnect +Method: POST +Args: + id: ID of the connection + +Returns 404 if the connection is not found. +``` + +Disconnects a peer by ID. + +Example: + +```sh +curl -X POST 'http://127.0.0.1:6420/api/v1/network/connection/disconnect?id=999' +``` + +Result: + +```json +{} +``` + +## Migrating from the unversioned API + +The unversioned API are the API endpoints without an `/api` prefix. +These endpoints are all prefixed with `/api/v1` now. + +`-enable-unversioned-api` was added as an option to assist migration to `/api/v1` +but this option was removed in v0.26.0. + +To migrate from the unversioned API, add `/api/v1` to all endpoints that you call +that do not have an `/api` prefix already. + +For example, `/block` would become `/api/v1/block`. + +## Migrating from the JSONRPC API + +The JSONRPC-2.0 RPC API was deprecated in v0.25.0 and removed in v0.26.0. + +Anyone still using this can follow this guide to migrate to the REST API: + +* `get_status` is replaced by `/api/v1/blockchain/metadata` and `/api/v1/health` +* `get_lastblocks` is replaced by `/api/v1/last_blocks` +* `get_blocks` is replaced by `/api/v1/blocks` +* `get_outputs` is replaced by `/api/v1/outputs` +* `inject_transaction` is replaced by `/api/v1/injectTransaction` +* `get_transaction` is replaced by `/api/v1/transaction` + +## Migrating from /api/v1/spend + +The `POST /api/v1/spend` endpoint is deprecated and will be removed in v0.26.0. + +To migrate from it, use [`POST /api/v1/wallet/transaction`](#create-transaction) followed by [`POST /api/v1/injectTransaction`](#inject-raw-transaction). +Do not create another transaction before injecting the created transaction, otherwise you might create two conflicting transactions. + +`POST /api/v1/wallet/transaction` has more options for creating the transaction than the `/api/v1/spend` endpoint. +To replicate the same behavior as `/api/v1/spend`, use the following request body template: + +```json +{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "wallet": { + "id": "$wallet_id", + "password": "$password" + }, + "to": [{ + "address": "$dst", + "coins": "$coins" + }] +} +``` + +You must use a string for `"coins"` instead of an integer measured in "droplets" (the smallest unit of currency in Skycoin, 1/1000000 of a skycoin). +For example, if you sent 1 Skycoin with `/api/v1/spend` you would have specified the `coins` field as `1000000`. +Now, you would specify it as `"1"`. + +Some examples: + +* 123.456 coins: before `123456000`, now `"123.456"` +* 0.1 coins: before `100000`, now `"0.1"` +* 1 coin: before `1000000`, now `"1"` + +Extra zeros on the `"coins"` string are ok, for example `"1"` is the same as `"1.0"` or `"1.000000"`. + +Only provide `"password"` if the wallet is encrypted. Note that decryption can take a few seconds, and this can impact +throughput. + +The request header `Content-Type` must be `application/json`. + +The response to `POST /api/v1/wallet/transaction` will include a verbose decoded transaction with details +and the hex-encoded binary transaction in the `"encoded_transaction"` field. +Use the value of `"encoded_transaction"` as the `"rawtx"` value in the request to `/api/v1/injectTransaction`. + +## Migration from /api/v1/explorer/address + +The `GET /api/v1/explorer/address` was deprecated in v0.25.0 and removed in v0.26.0. + +To migrate from it, use [`GET /api/v1/transactions?verbose=1`](#get-transactions-for-addresses). + +`/api/v1/explorer/address` accepted a single `address` query parameter. `/api/v1/transactions` uses an `addrs` query parameter and +accepts multiple addresses at once. + +The response data is the same but the structure is slightly different. Compare the follow two example responses: + +`/api/v1/explorer/address?address=WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC`: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 38076, + "block_seq": 15493 + }, + "timestamp": 1518878675, + "length": 183, + "type": 0, + "txid": "6d8e2f8b436a2f38d604b3aa1196ef2176779c5e11e33fbdd09f993fe659c39f", + "inner_hash": "8da7c64dcedeeb6aa1e0d21fb84a0028dcd68e6801f1a3cc0224fdd50682046f", + "fee": 126249, + "sigs": [ + "c60e43980497daad59b4c72a2eac053b1584f960c57a5e6ac8337118dccfcee4045da3f60d9be674867862a13fdd87af90f4b85cbf39913bde13674e0a039b7800" + ], + "inputs": [ + { + "uxid": "349b06e5707f633fd2d8f048b687b40462d875d968b246831434fb5ab5dcac38", + "owner": "WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC", + "coins": "125.000000", + "hours": 34596, + "calculated_hours": 178174 + } + ], + "outputs": [ + { + "uxid": "5b4a79c7de2e9099e083bbc8096619ae76ba6fbe34875c61bbe2d3bfa6b18b99", + "dst": "2NfNKsaGJEndpSajJ6TsKJfsdDjW2gFsjXg", + "coins": "125.000000", + "hours": 51925 + } + ] + } +] +``` + +`/api/v1/transactions?verbose=1&addrs=WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC`: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 57564, + "block_seq": 7498 + }, + "time": 1514743602, + "txn": { + "timestamp": 1514743602, + "length": 220, + "type": 0, + "txid": "df5bcef198fe6e96d496c30482730f895cabc1d55b338afe5633b0c2889d02f9", + "inner_hash": "4677ff9b9b56485495a45693cc09f8496199929fccb52091d32f2d3cf2ee8a41", + "fee": 69193, + "sigs": [ + "8e1f6f621a11f737ac2031be975d4b2fc17bf9f17a0da0a2fe219ee018011ab506e2ad0367be302a8d859cc355c552313389cd0aa9fa98dc7d2085a52f11ef5a00" + ], + "inputs": [ + { + "uxid": "2374201ff29f1c024ccfc6c53160e741d06720562853ad3613c121acd8389031", + "owner": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "162768.000000", + "hours": 485, + "calculated_hours": 138385 + } + ], + "outputs": [ + { + "uxid": "63f299fc85fe6fc34d392718eee55909837c7231b6ffd93e5a9a844c4375b313", + "dst": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "162643.000000", + "hours": 34596 + }, + { + "uxid": "349b06e5707f633fd2d8f048b687b40462d875d968b246831434fb5ab5dcac38", + "dst": "WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC", + "coins": "125.000000", + "hours": 34596 + } + ] + } + } +] +``` + +The transaction data is wrapped in a `"txn"` field. A `"time"` field is present at the top level. This `"time"` field +is either the confirmation timestamp of a confirmed transaction or the last received time of an unconfirmed transaction. diff --git a/vendor/github.com/skycoin/skycoin/src/api/address.go b/vendor/github.com/skycoin/skycoin/src/api/address.go new file mode 100644 index 0000000000..82c75daeae --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/address.go @@ -0,0 +1,56 @@ +package api + +import ( + "encoding/json" + "net/http" + + "github.com/skycoin/skycoin/src/cipher" +) + +// VerifyAddressRequest is the request data for POST /api/v2/address/verify +type VerifyAddressRequest struct { + Address string `json:"address"` +} + +// VerifyAddressResponse is returned by POST /api/v2/address/verify +type VerifyAddressResponse struct { + Version byte `json:"version"` +} + +// addressVerifyHandler verifies a Skycoin address +// Method: POST +// URI: /api/v2/address/verify +func addressVerifyHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifyAddressRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.Address == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "address is required") + writeHTTPResponse(w, resp) + return + } + + addr, err := cipher.DecodeBase58Address(req.Address) + + if err != nil { + resp := NewHTTPErrorResponse(http.StatusUnprocessableEntity, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: VerifyAddressResponse{ + Version: addr.Version, + }, + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/blockchain.go b/vendor/github.com/skycoin/skycoin/src/api/blockchain.go new file mode 100644 index 0000000000..25ca4cd160 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/blockchain.go @@ -0,0 +1,404 @@ +package api + +// APIs for blockchain related information + +import ( + "errors" + "fmt" + "net/http" + "strconv" + "strings" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/readable" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/visor" +) + +// blockchainMetadataHandler returns the blockchain metadata +// Method: GET +// URI: /api/v1/blockchain/metadata +func blockchainMetadataHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + visorMetadata, err := gateway.GetBlockchainMetadata() + if err != nil { + err = fmt.Errorf("gateway.GetBlockchainMetadata failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + // This can happen if the node is shut down at the right moment, guard against a panic + if visorMetadata == nil { + err = errors.New("gateway.GetBlockchainMetadata metadata is nil") + wh.Error500(w, err.Error()) + return + } + + metadata := readable.NewBlockchainMetadata(*visorMetadata) + + wh.SendJSONOr500(logger, w, metadata) + } +} + +// blockchainProgressHandler returns the blockchain sync progress +// Method: GET +// URI: /api/v1/blockchain/progress +func blockchainProgressHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + headSeq, _, err := gateway.HeadBkSeq() + if err != nil { + err = fmt.Errorf("gateway.HeadBkSeq failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + progress := gateway.GetBlockchainProgress(headSeq) + + // This can happen if the node is shut down at the right moment, guard against a panic + if progress == nil { + err = errors.New("gateway.GetBlockchainProgress progress is nil") + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, readable.NewBlockchainProgress(progress)) + } +} + +func parseBoolFlag(v string) (bool, error) { + if v == "" { + return false, nil + } + + return strconv.ParseBool(v) +} + +// blockHandler returns a block by hash or seq +// Method: GET +// URI: /api/v1/block +// Args: +// +// hash [transaction hash string] +// seq [int] +// Note: only one of hash or seq is allowed +func blockHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + hash := r.FormValue("hash") + seq := r.FormValue("seq") + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + switch { + case hash == "" && seq == "": + wh.Error400(w, "should specify one filter, hash or seq") + return + case hash != "" && seq != "": + wh.Error400(w, "should only specify one filter, hash or seq") + return + } + + var h cipher.SHA256 + if hash != "" { + var err error + h, err = cipher.SHA256FromHex(hash) + if err != nil { + wh.Error400(w, err.Error()) + return + } + } + + var uSeq uint64 + if seq != "" { + var err error + uSeq, err = strconv.ParseUint(seq, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid seq value %q", seq)) + return + } + } + + if verbose { + var b *coin.SignedBlock + var inputs [][]visor.TransactionInput + + switch { + case hash != "": + b, inputs, err = gateway.GetSignedBlockByHashVerbose(h) + case seq != "": + b, inputs, err = gateway.GetSignedBlockBySeqVerbose(uSeq) + } + + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if b == nil { + wh.Error404(w, "") + return + } + + rb, err := readable.NewBlockVerbose(b.Block, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + return + } + + var b *coin.SignedBlock + switch { + case hash != "": + b, err = gateway.GetSignedBlockByHash(h) + case seq != "": + b, err = gateway.GetSignedBlockBySeq(uSeq) + } + + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if b == nil { + wh.Error404(w, "") + return + } + + rb, err := readable.NewBlock(b.Block) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } +} + +// blocksHandler returns blocks between a start and end point, +// or an explicit list of sequences. +// If using start and end, the block sequences include both the start and end point. +// Explicit sequences cannot be combined with start and end. +// Method: GET, POST +// URI: /api/v1/blocks +// Args: +// +// start [int] +// end [int] +// seqs [comma separated list of ints] +// verbose [bool] +func blocksHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + sStart := r.FormValue("start") + sEnd := r.FormValue("end") + sSeqs := r.FormValue("seqs") + + if sSeqs != "" && (sStart != "" || sEnd != "") { + wh.Error400(w, "seqs cannot be used with start or end") + return + } + + if sSeqs == "" && sStart == "" && sEnd == "" { + wh.Error400(w, "At least one of seqs or start or end are required") + return + } + + var start uint64 + var end uint64 + var seqs []uint64 + + if sStart != "" { + var err error + start, err = strconv.ParseUint(sStart, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid start value %q", sStart)) + return + } + } + + if sEnd != "" { + var err error + end, err = strconv.ParseUint(sEnd, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid end value %q", sEnd)) + return + } + } + + if sSeqs != "" { + ssSeqs := strings.Split(sSeqs, ",") + seqs = make([]uint64, len(ssSeqs)) + seqsMap := make(map[uint64]struct{}, len(ssSeqs)) + for i, s := range ssSeqs { + x, err := strconv.ParseUint(s, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid sequence %q at seqs[%d]", s, i)) + return + } + + if _, ok := seqsMap[x]; ok { + wh.Error400(w, fmt.Sprintf("Duplicate sequence %d at seqs[%d]", x, i)) + return + } + seqsMap[x] = struct{}{} + + seqs[i] = x + } + } + + if verbose { + var blocks []coin.SignedBlock + var inputs [][][]visor.TransactionInput + var err error + + if len(seqs) > 0 { + blocks, inputs, err = gateway.GetBlocksVerbose(seqs) + } else { + blocks, inputs, err = gateway.GetBlocksInRangeVerbose(start, end) + } + + if err != nil { + switch err.(type) { + case visor.ErrBlockNotExist: + wh.Error404(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + return + } + + rb, err := readable.NewBlocksVerbose(blocks, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } else { + var blocks []coin.SignedBlock + var err error + + if len(seqs) > 0 { + blocks, err = gateway.GetBlocks(seqs) + } else { + blocks, err = gateway.GetBlocksInRange(start, end) + } + + if err != nil { + switch err.(type) { + case visor.ErrBlockNotExist: + wh.Error404(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + return + } + + rb, err := readable.NewBlocks(blocks) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } + } +} + +// lastBlocksHandler returns the most recent N blocks on the blockchain +// Method: GET +// URI: /api/v1/last_blocks +// Args: +// +// num [int] +// verbose [bool] +func lastBlocksHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + num := r.FormValue("num") + n, err := strconv.ParseUint(num, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid num value %q", num)) + return + } + + maxLBC := gateway.DaemonConfig().MaxLastBlocksCount + if n > maxLBC { + wh.Error400(w, fmt.Sprintf("num: %q must < %d", num, maxLBC)) + return + } + + if verbose { + blocks, inputs, err := gateway.GetLastBlocksVerbose(n) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rb, err := readable.NewBlocksVerbose(blocks, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + return + } + + blocks, err := gateway.GetLastBlocks(n) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rb, err := readable.NewBlocks(blocks) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/client.go b/vendor/github.com/skycoin/skycoin/src/api/client.go new file mode 100644 index 0000000000..3c04011b2b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/client.go @@ -0,0 +1,1468 @@ +package api + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "net/url" + "strings" + "time" + + "github.com/skycoin/skycoin/src/cipher/bip44" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/kvstorage" + "github.com/skycoin/skycoin/src/readable" + "github.com/skycoin/skycoin/src/wallet" +) + +const ( + dialTimeout = 60 * time.Second + httpClientTimeout = 120 * time.Second + tlsHandshakeTimeout = 60 * time.Second + + // ContentTypeJSON json content type header + ContentTypeJSON = "application/json" + // ContentTypeForm form data content type header + ContentTypeForm = "application/x-www-form-urlencoded" +) + +// ClientError is used for non-200 API responses +type ClientError struct { + Status string + StatusCode int + Message string +} + +// NewClientError creates a ClientError +func NewClientError(status string, statusCode int, message string) ClientError { + return ClientError{ + Status: status, + StatusCode: statusCode, + Message: strings.TrimRight(message, "\n"), + } +} + +func (e ClientError) Error() string { + return e.Message +} + +// ReceivedHTTPResponse parsed a HTTPResponse received by the Client, for the V2 API +type ReceivedHTTPResponse struct { + Error *HTTPError `json:"error,omitempty"` + Data json.RawMessage `json:"data"` +} + +// Client provides an interface to a remote node's HTTP API +type Client struct { + HTTPClient *http.Client + Addr string + Username string + Password string +} + +// NewClient creates a Client +func NewClient(addr string) *Client { + transport := &http.Transport{ + Dial: (&net.Dialer{ + Timeout: dialTimeout, + }).Dial, + TLSHandshakeTimeout: tlsHandshakeTimeout, + } + httpClient := &http.Client{ + Transport: transport, + Timeout: httpClientTimeout, + } + addr = strings.TrimRight(addr, "/") + addr += "/" + + return &Client{ + Addr: addr, + HTTPClient: httpClient, + } +} + +// SetAuth configures the Client's request authentication +func (c *Client) SetAuth(username, password string) { + c.Username = username + c.Password = password +} + +func (c *Client) applyAuth(req *http.Request) { + if c.Username == "" && c.Password == "" { + return + } + + req.SetBasicAuth(c.Username, c.Password) +} + +// GetV2 makes a GET request to an endpoint and unmarshals the response to respObj. +// If the response is not 200 OK, returns an error +func (c *Client) GetV2(endpoint string, respObj interface{}) (bool, error) { + return c.requestV2(http.MethodGet, endpoint, nil, respObj) +} + +// Get makes a GET request to an endpoint and unmarshals the response to obj. +// If the response is not 200 OK, returns an error +func (c *Client) Get(endpoint string, obj interface{}) error { + resp, err := c.get(endpoint) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + return NewClientError(resp.Status, resp.StatusCode, string(body)) + } + + if obj == nil { + return nil + } + + d := json.NewDecoder(resp.Body) + d.DisallowUnknownFields() + return d.Decode(obj) +} + +// get makes a GET request to an endpoint. Caller must close response body. +func (c *Client) get(endpoint string) (*http.Response, error) { + return c.makeRequestWithoutBody(endpoint, http.MethodGet) +} + +// makeRequestWithoutBody makes a `method` request to an endpoint. Caller must close response body. +func (c *Client) makeRequestWithoutBody(endpoint, method string) (*http.Response, error) { + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(method, endpoint, nil) + if err != nil { + return nil, err + } + + c.applyAuth(req) + + return c.HTTPClient.Do(req) +} + +// DeleteV2 makes a DELETE request to an endpoint with body of json data, +// and parses the standard JSON response. +func (c *Client) DeleteV2(endpoint string, respObj interface{}) (bool, error) { + return c.requestV2(http.MethodDelete, endpoint, nil, respObj) +} + +// PostForm makes a POST request to an endpoint with body of ContentTypeForm formated data. +func (c *Client) PostForm(endpoint string, body io.Reader, obj interface{}) error { + return c.Post(endpoint, ContentTypeForm, body, obj) +} + +// PostJSON makes a POST request to an endpoint with body of json data. +func (c *Client) PostJSON(endpoint string, reqObj, respObj interface{}) error { + body, err := json.Marshal(reqObj) + if err != nil { + return err + } + + return c.Post(endpoint, ContentTypeJSON, bytes.NewReader(body), respObj) +} + +// Post makes a POST request to an endpoint. +func (c *Client) Post(endpoint string, contentType string, body io.Reader, obj interface{}) error { + csrf, err := c.CSRF() + if err != nil { + return err + } + + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(http.MethodPost, endpoint, body) + if err != nil { + return err + } + + c.applyAuth(req) + + if csrf != "" { + req.Header.Set(CSRFHeaderName, csrf) + } + + req.Header.Set("Content-Type", contentType) + + resp, err := c.HTTPClient.Do(req) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + return NewClientError(resp.Status, resp.StatusCode, string(body)) + } + + if obj == nil { + return nil + } + + decoder := json.NewDecoder(resp.Body) + decoder.DisallowUnknownFields() + return decoder.Decode(obj) +} + +// PostJSONV2 makes a POST request to an endpoint with body of json data, +// and parses the standard JSON response. +func (c *Client) PostJSONV2(endpoint string, reqObj, respObj interface{}) (bool, error) { + body, err := json.Marshal(reqObj) + if err != nil { + return false, err + } + + return c.requestV2(http.MethodPost, endpoint, bytes.NewReader(body), respObj) +} + +func (c *Client) requestV2(method, endpoint string, body io.Reader, respObj interface{}) (bool, error) { + csrf, err := c.CSRF() + if err != nil { + return false, err + } + + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(method, endpoint, body) + if err != nil { + return false, err + } + + c.applyAuth(req) + + if csrf != "" { + req.Header.Set(CSRFHeaderName, csrf) + } + + switch method { + case http.MethodPost: + req.Header.Set("Content-Type", ContentTypeJSON) + } + + req.Header.Set("Accept", ContentTypeJSON) + + resp, err := c.HTTPClient.Do(req) + if err != nil { + return false, err + } + + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return false, err + } + + decoder := json.NewDecoder(bytes.NewReader(respBody)) + decoder.DisallowUnknownFields() + + var wrapObj ReceivedHTTPResponse + if err := decoder.Decode(&wrapObj); err != nil { + // In some cases, the server can send an error response in a non-JSON format, + // such as a 404 when the endpoint is not registered, or if a 500 error + // occurs in the go HTTP stack, outside of the application's control. + // If this happens, treat the entire response body as the error message. + if resp.StatusCode != http.StatusOK { + return false, NewClientError(resp.Status, resp.StatusCode, string(respBody)) + } + + return false, err + } + + // The JSON decoder stops at the end of the first valid JSON object. + // Check that there is no trailing data after the end of the first valid JSON object. + // This could occur if an endpoint mistakenly wrote an object twice, for example. + // This line returns the decoder's underlying read buffer. Read(nil) will return io.EOF + // if the buffer was completely consumed. + if _, err := decoder.Buffered().Read(nil); err != io.EOF { + return false, NewClientError(resp.Status, resp.StatusCode, "Response has additional bytes after the first JSON object: "+string(respBody)) + } + + var rspErr error + if resp.StatusCode != http.StatusOK { + rspErr = NewClientError(resp.Status, resp.StatusCode, wrapObj.Error.Message) + } + + if wrapObj.Data == nil { + return false, rspErr + } + + decoder = json.NewDecoder(bytes.NewReader(wrapObj.Data)) + decoder.DisallowUnknownFields() + + if err := decoder.Decode(respObj); err != nil { + return false, err + } + + return true, rspErr +} + +// CSRF returns a CSRF token. If CSRF is disabled on the node, returns an empty string and nil error. +func (c *Client) CSRF() (string, error) { + resp, err := c.get("/api/v1/csrf") + if err != nil { + return "", err + } + + defer resp.Body.Close() + + switch resp.StatusCode { + case http.StatusOK: + case http.StatusNotFound: + // CSRF is disabled on the node + return "", nil + default: + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + return "", NewClientError(resp.Status, resp.StatusCode, string(body)) + } + + d := json.NewDecoder(resp.Body) + d.DisallowUnknownFields() + + var m map[string]string + if err := d.Decode(&m); err != nil { + return "", err + } + + token, ok := m["csrf_token"] + if !ok { + return "", errors.New("csrf_token not found in response") + } + + return token, nil +} + +// Version makes a request to GET /api/v1/version +func (c *Client) Version() (*readable.BuildInfo, error) { + var bi readable.BuildInfo + if err := c.Get("/api/v1/version", &bi); err != nil { + return nil, err + } + return &bi, nil +} + +// Outputs makes a request to GET /api/v1/outputs +func (c *Client) Outputs() (*readable.UnspentOutputsSummary, error) { + var o readable.UnspentOutputsSummary + if err := c.Get("/api/v1/outputs", &o); err != nil { + return nil, err + } + return &o, nil +} + +// OutputsForAddresses makes a request to POST /api/v1/outputs?addrs=xxx +func (c *Client) OutputsForAddresses(addrs []string) (*readable.UnspentOutputsSummary, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + + endpoint := "/api/v1/outputs" + + var o readable.UnspentOutputsSummary + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &o); err != nil { + return nil, err + } + return &o, nil +} + +// OutputsForHashes makes a request to POST /api/v1/outputs?hashes=zzz +func (c *Client) OutputsForHashes(hashes []string) (*readable.UnspentOutputsSummary, error) { + v := url.Values{} + v.Add("hashes", strings.Join(hashes, ",")) + endpoint := "/api/v1/outputs" + + var o readable.UnspentOutputsSummary + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &o); err != nil { + return nil, err + } + return &o, nil +} + +// CoinSupply makes a request to GET /api/v1/coinSupply +func (c *Client) CoinSupply() (*CoinSupply, error) { + var cs CoinSupply + if err := c.Get("/api/v1/coinSupply", &cs); err != nil { + return nil, err + } + return &cs, nil +} + +// BlockByHash makes a request to GET /api/v1/block?hash=xxx +func (c *Client) BlockByHash(hash string) (*readable.Block, error) { + v := url.Values{} + v.Add("hash", hash) + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.Block + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockByHashVerbose makes a request to GET /api/v1/block?hash=xxx&verbose=1 +func (c *Client) BlockByHashVerbose(hash string) (*readable.BlockVerbose, error) { + v := url.Values{} + v.Add("hash", hash) + v.Add("verbose", "1") + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.BlockVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockBySeq makes a request to GET /api/v1/block?seq=xxx +func (c *Client) BlockBySeq(seq uint64) (*readable.Block, error) { + v := url.Values{} + v.Add("seq", fmt.Sprint(seq)) + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.Block + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockBySeqVerbose makes a request to GET /api/v1/block?seq=xxx&verbose=1 +func (c *Client) BlockBySeqVerbose(seq uint64) (*readable.BlockVerbose, error) { + v := url.Values{} + v.Add("seq", fmt.Sprint(seq)) + v.Add("verbose", "1") + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.BlockVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// Blocks makes a request to POST /api/v1/blocks?seqs= +func (c *Client) Blocks(seqs []uint64) (*readable.Blocks, error) { + sSeqs := make([]string, len(seqs)) + for i, x := range seqs { + sSeqs[i] = fmt.Sprint(x) + } + + v := url.Values{} + v.Add("seqs", strings.Join(sSeqs, ",")) + endpoint := "/api/v1/blocks" + + var b readable.Blocks + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlocksVerbose makes a request to POST /api/v1/blocks?verbose=1&seqs= +func (c *Client) BlocksVerbose(seqs []uint64) (*readable.BlocksVerbose, error) { + sSeqs := make([]string, len(seqs)) + for i, x := range seqs { + sSeqs[i] = fmt.Sprint(x) + } + + v := url.Values{} + v.Add("seqs", strings.Join(sSeqs, ",")) + v.Add("verbose", "1") + endpoint := "/api/v1/blocks" + + var b readable.BlocksVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlocksInRange makes a request to GET /api/v1/blocks?start=&end= +func (c *Client) BlocksInRange(start, end uint64) (*readable.Blocks, error) { + v := url.Values{} + v.Add("start", fmt.Sprint(start)) + v.Add("end", fmt.Sprint(end)) + endpoint := "/api/v1/blocks?" + v.Encode() + + var b readable.Blocks + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlocksInRangeVerbose makes a request to GET /api/v1/blocks?verbose=1&start=&end= +func (c *Client) BlocksInRangeVerbose(start, end uint64) (*readable.BlocksVerbose, error) { + v := url.Values{} + v.Add("start", fmt.Sprint(start)) + v.Add("end", fmt.Sprint(end)) + v.Add("verbose", "1") + endpoint := "/api/v1/blocks?" + v.Encode() + + var b readable.BlocksVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// LastBlocks makes a request to GET /api/v1/last_blocks +func (c *Client) LastBlocks(n uint64) (*readable.Blocks, error) { + v := url.Values{} + v.Add("num", fmt.Sprint(n)) + endpoint := "/api/v1/last_blocks?" + v.Encode() + + var b readable.Blocks + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// LastBlocksVerbose makes a request to GET /api/v1/last_blocks?verbose=1 +func (c *Client) LastBlocksVerbose(n uint64) (*readable.BlocksVerbose, error) { + v := url.Values{} + v.Add("num", fmt.Sprint(n)) + v.Add("verbose", "1") + endpoint := "/api/v1/last_blocks?" + v.Encode() + + var b readable.BlocksVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockchainMetadata makes a request to GET /api/v1/blockchain/metadata +func (c *Client) BlockchainMetadata() (*readable.BlockchainMetadata, error) { + var b readable.BlockchainMetadata + if err := c.Get("/api/v1/blockchain/metadata", &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockchainProgress makes a request to GET /api/v1/blockchain/progress +func (c *Client) BlockchainProgress() (*readable.BlockchainProgress, error) { + var b readable.BlockchainProgress + if err := c.Get("/api/v1/blockchain/progress", &b); err != nil { + return nil, err + } + return &b, nil +} + +// Balance makes a request to POST /api/v1/balance?addrs=xxx +func (c *Client) Balance(addrs []string) (*BalanceResponse, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/balance" + + var b BalanceResponse + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &b); err != nil { + return nil, err + } + return &b, nil +} + +// UxOut makes a request to GET /api/v1/uxout?uxid=xxx +func (c *Client) UxOut(uxID string) (*readable.SpentOutput, error) { + v := url.Values{} + v.Add("uxid", uxID) + endpoint := "/api/v1/uxout?" + v.Encode() + + var b readable.SpentOutput + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// AddressUxOuts makes a request to GET /api/v1/address_uxouts +func (c *Client) AddressUxOuts(addr string) ([]readable.SpentOutput, error) { + v := url.Values{} + v.Add("address", addr) + endpoint := "/api/v1/address_uxouts?" + v.Encode() + + var b []readable.SpentOutput + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return b, nil +} + +// Wallet makes a request to GET /api/v1/wallet +func (c *Client) Wallet(id string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet?" + v.Encode() + + var wr WalletResponse + if err := c.Get(endpoint, &wr); err != nil { + return nil, err + } + + return &wr, nil +} + +// Wallets makes a request to GET /api/v1/wallets +func (c *Client) Wallets() ([]WalletResponse, error) { + var wrs []WalletResponse + if err := c.Get("/api/v1/wallets", &wrs); err != nil { + return nil, err + } + + return wrs, nil +} + +// CreateWalletOptions are the options for creating a wallet +type CreateWalletOptions struct { + Type string + Seed string + SeedPassphrase string + Label string + Password string + ScanN uint64 + XPub string + Encrypt bool + Bip44Coin *bip44.CoinType + CollectionPrivateKeys string +} + +// CreateWallet makes a request to POST /api/v1/wallet/create and creates a wallet. +// If scanN is <= 0, the scan number defaults to 1 +func (c *Client) CreateWallet(o CreateWalletOptions) (*WalletResponse, error) { + v := url.Values{} + v.Add("type", o.Type) + v.Add("seed", o.Seed) + v.Add("label", o.Label) + v.Add("encrypt", fmt.Sprint(o.Encrypt)) + + if o.Password != "" { + v.Add("password", o.Password) + } + + if o.ScanN > 0 { + v.Add("scan", fmt.Sprint(o.ScanN)) + } + + if o.SeedPassphrase != "" { + v.Add("seed-passphrase", o.SeedPassphrase) + } + + if o.Bip44Coin != nil { + v.Add("bip44-coin", fmt.Sprintf("%d", *o.Bip44Coin)) + } + + if o.XPub != "" { + v.Add("xpub", o.XPub) + } + + if o.CollectionPrivateKeys != "" { + v.Add("private-keys", o.CollectionPrivateKeys) + } + + var w WalletResponse + if err := c.PostForm("/api/v1/wallet/create", strings.NewReader(v.Encode()), &w); err != nil { + return nil, err + } + return &w, nil +} + +// CreateWalletTemp makes a request to POST /api/v1/wallet/createTemp and creates a +// temporary wallet. +// If scanN is <= 0, the scan number defaults to 1 +func (c *Client) CreateWalletTemp(o CreateWalletOptions) (*WalletResponse, error) { + v := url.Values{} + v.Add("type", o.Type) + v.Add("seed", o.Seed) + v.Add("label", o.Label) + + if o.ScanN > 0 { + v.Add("scan", fmt.Sprint(o.ScanN)) + } + + if o.Bip44Coin != nil { + v.Add("bip44-coin", fmt.Sprintf("%d", *o.Bip44Coin)) + } + + if o.XPub != "" { + v.Add("xpub", o.XPub) + } + + if o.CollectionPrivateKeys != "" { + v.Add("private-keys", o.CollectionPrivateKeys) + } + + var w WalletResponse + if err := c.PostForm("/api/v1/wallet/createTemp", strings.NewReader(v.Encode()), &w); err != nil { + return nil, err + } + return &w, nil +} + +// NewWalletAddress makes a request to POST /api/v1/wallet/newAddress +// if n is <= 0, defaults to 1 +func (c *Client) NewWalletAddress(id string, password string, options ...wallet.Option) ([]string, error) { + v := url.Values{} + v.Add("id", id) + if len(password) > 0 { + v.Add("password", password) + } + + var opts wallet.AdvancedOptions + for _, f := range options { + f(&opts) + } + + if opts.GenerateN > 0 { + v.Add("num", fmt.Sprint(opts.GenerateN)) + } + + if len(opts.PrivateKeys) > 0 { + keys := make([]string, 0, len(opts.PrivateKeys)) + for _, k := range opts.PrivateKeys { + keys = append(keys, k.Hex()) + } + v.Add("private-keys", strings.Join(keys, ",")) + } + + var obj struct { + Addresses []string `json:"addresses"` + } + if err := c.PostForm("/api/v1/wallet/newAddress", strings.NewReader(v.Encode()), &obj); err != nil { + return nil, err + } + return obj.Addresses, nil +} + +// ScanWalletAddresses makes a request to POST /api/v1/wallet/scan +// if n is <= 0, defaults to 20 +func (c *Client) ScanWalletAddresses(id string, n int, password string) ([]string, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + if n > 0 { + v.Add("num", fmt.Sprint(n)) + } + + var obj struct { + Addresses []string `json:"addresses"` + } + if err := c.PostForm("/api/v1/wallet/scan", strings.NewReader(v.Encode()), &obj); err != nil { + return nil, err + } + return obj.Addresses, nil +} + +// WalletBalance makes a request to GET /api/v1/wallet/balance +func (c *Client) WalletBalance(id string) (*BalanceResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet/balance?" + v.Encode() + + var b BalanceResponse + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// CreateTransactionRequest is sent to /api/v2/transaction +type CreateTransactionRequest struct { + IgnoreUnconfirmed bool `json:"ignore_unconfirmed"` + HoursSelection HoursSelection `json:"hours_selection"` + ChangeAddress *string `json:"change_address,omitempty"` + To []Receiver `json:"to"` + UxOuts []string `json:"unspents,omitempty"` + Addresses []string `json:"addresses,omitempty"` +} + +// HoursSelection defines options for hours distribution +type HoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor string `json:"share_factor,omitempty"` +} + +// Receiver specifies a spend destination +type Receiver struct { + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours,omitempty"` +} + +// WalletCreateTransactionRequest is sent to /api/v1/wallet/transaction +type WalletCreateTransactionRequest struct { + Unsigned bool `json:"unsigned"` + WalletID string `json:"wallet_id"` + Password string `json:"password"` + CreateTransactionRequest +} + +// WalletCreateTransaction makes a request to POST /api/v1/wallet/transaction +func (c *Client) WalletCreateTransaction(req WalletCreateTransactionRequest) (*CreateTransactionResponse, error) { + var r CreateTransactionResponse + endpoint := "/api/v1/wallet/transaction" + if err := c.PostJSON(endpoint, req, &r); err != nil { + return nil, err + } + + return &r, nil +} + +// WalletSignTransaction makes a request to POST /api/v2/wallet/transaction/sign +func (c *Client) WalletSignTransaction(req WalletSignTransactionRequest) (*CreateTransactionResponse, error) { + var r CreateTransactionResponse + endpoint := "/api/v2/wallet/transaction/sign" + ok, err := c.PostJSONV2(endpoint, req, &r) + if ok { + return &r, err + } + return nil, err +} + +// CreateTransaction makes a request to POST /api/v2/transaction +func (c *Client) CreateTransaction(req CreateTransactionRequest) (*CreateTransactionResponse, error) { + var r CreateTransactionResponse + endpoint := "/api/v2/transaction" + ok, err := c.PostJSONV2(endpoint, req, &r) + if ok { + return &r, err + } + return nil, err +} + +// WalletUnconfirmedTransactions makes a request to GET /api/v1/wallet/transactions +func (c *Client) WalletUnconfirmedTransactions(id string) (*UnconfirmedTxnsResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet/transactions?" + v.Encode() + + var utx *UnconfirmedTxnsResponse + if err := c.Get(endpoint, &utx); err != nil { + return nil, err + } + return utx, nil +} + +// WalletUnconfirmedTransactionsVerbose makes a request to GET /api/v1/wallet/transactions&verbose=1 +func (c *Client) WalletUnconfirmedTransactionsVerbose(id string) (*UnconfirmedTxnsVerboseResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("verbose", "1") + endpoint := "/api/v1/wallet/transactions?" + v.Encode() + + var utx *UnconfirmedTxnsVerboseResponse + if err := c.Get(endpoint, &utx); err != nil { + return nil, err + } + return utx, nil +} + +// UpdateWallet makes a request to POST /api/v1/wallet/update +func (c *Client) UpdateWallet(id, label string) error { + v := url.Values{} + v.Add("id", id) + v.Add("label", label) + + return c.PostForm("/api/v1/wallet/update", strings.NewReader(v.Encode()), nil) +} + +// WalletFolderName makes a request to GET /api/v1/wallets/folderName +func (c *Client) WalletFolderName() (*WalletFolder, error) { + var w WalletFolder + if err := c.Get("/api/v1/wallets/folderName", &w); err != nil { + return nil, err + } + return &w, nil +} + +// NewSeed makes a request to GET /api/v1/wallet/newSeed +// entropy must be 128 or 256 +func (c *Client) NewSeed(entropy int) (string, error) { + v := url.Values{} + v.Add("entropy", fmt.Sprint(entropy)) + endpoint := "/api/v1/wallet/newSeed?" + v.Encode() + + var r struct { + Seed string `json:"seed"` + } + if err := c.Get(endpoint, &r); err != nil { + return "", err + } + return r.Seed, nil +} + +// VerifySeed verifies whether the given seed is a valid bip39 mnemonic or not +func (c *Client) VerifySeed(seed string) (bool, error) { + ok, err := c.PostJSONV2("/api/v2/wallet/seed/verify", VerifySeedRequest{ + Seed: seed, + }, &struct{}{}) + if err != nil { + return false, err + } + return ok, nil +} + +// WalletSeed makes a request to POST /api/v1/wallet/seed +func (c *Client) WalletSeed(id string, password string) (*WalletSeedResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + + var r WalletSeedResponse + if err := c.PostForm("/api/v1/wallet/seed", strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + + return &r, nil +} + +// NetworkConnection makes a request to GET /api/v1/network/connection +func (c *Client) NetworkConnection(addr string) (*readable.Connection, error) { + v := url.Values{} + v.Add("addr", addr) + endpoint := "/api/v1/network/connection?" + v.Encode() + + var dc readable.Connection + if err := c.Get(endpoint, &dc); err != nil { + return nil, err + } + return &dc, nil +} + +// NetworkConnectionsFilter filters for network connections +type NetworkConnectionsFilter struct { + States []daemon.ConnectionState // "pending", "connected" and "introduced" + Direction string // "incoming" or "outgoing" +} + +// NetworkConnections makes a request to GET /api/v1/network/connections. +// Connections can be filtered by state and direction. By default, "connected" and "introduced" connections +// of both directions are returned. +func (c *Client) NetworkConnections(filters *NetworkConnectionsFilter) (*Connections, error) { + v := url.Values{} + if filters != nil { + if len(filters.States) != 0 { + states := make([]string, len(filters.States)) + for i, s := range filters.States { + states[i] = string(s) + } + v.Add("states", strings.Join(states, ",")) + } + if filters.Direction != "" { + v.Add("direction", filters.Direction) + } + } + endpoint := "/api/v1/network/connections?" + v.Encode() + + var dc Connections + if err := c.Get(endpoint, &dc); err != nil { + return nil, err + } + return &dc, nil +} + +// NetworkDefaultPeers makes a request to GET /api/v1/network/defaultConnections +func (c *Client) NetworkDefaultPeers() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/defaultConnections", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// NetworkTrustedPeers makes a request to GET /api/v1/network/connections/trust +func (c *Client) NetworkTrustedPeers() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/connections/trust", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// NetworkExchangedPeers makes a request to GET /api/v1/network/connections/exchange +func (c *Client) NetworkExchangedPeers() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/connections/exchange", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// PendingTransactions makes a request to GET /api/v1/pendingTxs +func (c *Client) PendingTransactions() ([]readable.UnconfirmedTransactions, error) { + var v []readable.UnconfirmedTransactions + if err := c.Get("/api/v1/pendingTxs", &v); err != nil { + return nil, err + } + return v, nil +} + +// PendingTransactionsVerbose makes a request to GET /api/v1/pendingTxs?verbose=1 +func (c *Client) PendingTransactionsVerbose() ([]readable.UnconfirmedTransactionVerbose, error) { + var v []readable.UnconfirmedTransactionVerbose + if err := c.Get("/api/v1/pendingTxs?verbose=1", &v); err != nil { + return nil, err + } + return v, nil +} + +// Transaction makes a request to GET /api/v1/transaction +func (c *Client) Transaction(txid string) (*readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("txid", txid) + endpoint := "/api/v1/transaction?" + v.Encode() + + var r readable.TransactionWithStatus + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// TransactionVerbose makes a request to GET /api/v1/transaction?verbose=1 +func (c *Client) TransactionVerbose(txid string) (*readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("txid", txid) + v.Add("verbose", "1") + endpoint := "/api/v1/transaction?" + v.Encode() + + var r readable.TransactionWithStatusVerbose + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// TransactionEncoded makes a request to GET /api/v1/transaction?encoded=1 +func (c *Client) TransactionEncoded(txid string) (*TransactionEncodedResponse, error) { + v := url.Values{} + v.Add("txid", txid) + v.Add("encoded", "1") + endpoint := "/api/v1/transaction?" + v.Encode() + + var r TransactionEncodedResponse + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// Transactions makes a request to POST /api/v1/transactions +func (c *Client) Transactions(addrs []string) ([]readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatus + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// ConfirmedTransactions makes a request to POST /api/v1/transactions?confirmed=true +func (c *Client) ConfirmedTransactions(addrs []string) ([]readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "true") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatus + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// UnconfirmedTransactions makes a request to POST /api/v1/transactions?confirmed=false +func (c *Client) UnconfirmedTransactions(addrs []string) ([]readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "false") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatus + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// TransactionsVerbose makes a request to POST /api/v1/transactions?verbose=1 +func (c *Client) TransactionsVerbose(addrs []string) ([]readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("verbose", "1") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatusVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// ConfirmedTransactionsVerbose makes a request to POST /api/v1/transactions?confirmed=true&verbose=1 +func (c *Client) ConfirmedTransactionsVerbose(addrs []string) ([]readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "true") + v.Add("verbose", "1") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatusVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// UnconfirmedTransactionsVerbose makes a request to POST /api/v1/transactions?confirmed=false&verbose=1 +func (c *Client) UnconfirmedTransactionsVerbose(addrs []string) ([]readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "false") + v.Add("verbose", "1") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatusVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// GetTransactionsNum makes a GET request to /api/v1/transactions/num +func (c *Client) GetTransactionsNum() (uint64, error) { + var r struct { + TxnsNum uint64 `json:"txns_num"` + } + if err := c.Get("api/v1/transactions/num", &r); err != nil { + return 0, err + } + + return r.TxnsNum, nil +} + +// InjectTransaction makes a request to POST /api/v1/injectTransaction. +func (c *Client) InjectTransaction(txn *coin.Transaction) (string, error) { + rawTxn, err := txn.SerializeHex() + if err != nil { + return "", err + } + return c.InjectEncodedTransaction(rawTxn) +} + +// InjectTransactionNoBroadcast makes a request to POST /api/v1/injectTransaction +// but does not broadcast the transaction. +func (c *Client) InjectTransactionNoBroadcast(txn *coin.Transaction) (string, error) { + rawTxn, err := txn.SerializeHex() + if err != nil { + return "", err + } + return c.InjectEncodedTransactionNoBroadcast(rawTxn) +} + +// InjectEncodedTransaction makes a request to POST /api/v1/injectTransaction. +// rawTxn is a hex-encoded, serialized transaction +func (c *Client) InjectEncodedTransaction(rawTxn string) (string, error) { + return c.injectEncodedTransaction(rawTxn, false) +} + +// InjectEncodedTransactionNoBroadcast makes a request to POST /api/v1/injectTransaction +// but does not broadcast the transaction. +// rawTxn is a hex-encoded, serialized transaction +func (c *Client) InjectEncodedTransactionNoBroadcast(rawTxn string) (string, error) { + return c.injectEncodedTransaction(rawTxn, true) +} + +func (c *Client) injectEncodedTransaction(rawTxn string, noBroadcast bool) (string, error) { + v := InjectTransactionRequest{ + RawTxn: rawTxn, + NoBroadcast: noBroadcast, + } + + var txid string + if err := c.PostJSON("/api/v1/injectTransaction", v, &txid); err != nil { + return "", err + } + return txid, nil +} + +// ResendUnconfirmedTransactions makes a request to POST /api/v1/resendUnconfirmedTxns +func (c *Client) ResendUnconfirmedTransactions() (*ResendResult, error) { + endpoint := "/api/v1/resendUnconfirmedTxns" + var r ResendResult + if err := c.PostForm(endpoint, strings.NewReader(""), &r); err != nil { + return nil, err + } + return &r, nil +} + +// RawTransaction makes a request to GET /api/v1/rawtx +func (c *Client) RawTransaction(txid string) (string, error) { + v := url.Values{} + v.Add("txid", txid) + endpoint := "/api/v1/rawtx?" + v.Encode() + + var rawTxn string + if err := c.Get(endpoint, &rawTxn); err != nil { + return "", err + } + return rawTxn, nil +} + +// VerifyTransaction makes a request to POST /api/v2/transaction/verify. +func (c *Client) VerifyTransaction(req VerifyTransactionRequest) (*VerifyTransactionResponse, error) { + var rsp VerifyTransactionResponse + ok, err := c.PostJSONV2("/api/v2/transaction/verify", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// VerifyAddress makes a request to POST /api/v2/address/verify +// The API may respond with an error but include data useful for processing, +// so both return values may be non-nil. +func (c *Client) VerifyAddress(addr string) (*VerifyAddressResponse, error) { + req := VerifyAddressRequest{ + Address: addr, + } + + var rsp VerifyAddressResponse + ok, err := c.PostJSONV2("/api/v2/address/verify", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// RichlistParams are arguments to the /richlist endpoint +type RichlistParams struct { + N int + IncludeDistribution bool +} + +// Richlist makes a request to GET /api/v1/richlist +func (c *Client) Richlist(params *RichlistParams) (*Richlist, error) { + endpoint := "/api/v1/richlist" + + if params != nil { + v := url.Values{} + v.Add("n", fmt.Sprint(params.N)) + v.Add("include-distribution", fmt.Sprint(params.IncludeDistribution)) + endpoint = "/api/v1/richlist?" + v.Encode() + } + + var r Richlist + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// AddressCount makes a request to GET /api/v1/addresscount +func (c *Client) AddressCount() (uint64, error) { + var r struct { + Count uint64 `json:"count"` + } + if err := c.Get("/api/v1/addresscount", &r); err != nil { + return 0, err + } + return r.Count, nil + +} + +// UnloadWallet makes a request to POST /api/v1/wallet/unload +func (c *Client) UnloadWallet(id string) error { + v := url.Values{} + v.Add("id", id) + return c.PostForm("/api/v1/wallet/unload", strings.NewReader(v.Encode()), nil) +} + +// Health makes a request to GET /api/v1/health +func (c *Client) Health() (*HealthResponse, error) { + var r HealthResponse + if err := c.Get("/api/v1/health", &r); err != nil { + return nil, err + } + + return &r, nil +} + +// EncryptWallet makes a request to POST /api/v1/wallet/encrypt to encrypt a specific wallet with the given password +func (c *Client) EncryptWallet(id, password string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + var wlt WalletResponse + if err := c.PostForm("/api/v1/wallet/encrypt", strings.NewReader(v.Encode()), &wlt); err != nil { + return nil, err + } + + return &wlt, nil +} + +// DecryptWallet makes a request to POST /api/v1/wallet/decrypt to decrypt a wallet +func (c *Client) DecryptWallet(id, password string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + var wlt WalletResponse + if err := c.PostForm("/api/v1/wallet/decrypt", strings.NewReader(v.Encode()), &wlt); err != nil { + return nil, err + } + + return &wlt, nil +} + +// RecoverWallet makes a request to POST /api/v2/wallet/recover to recover an encrypted wallet by seed. +// The password argument is optional, if provided, the recovered wallet will be encrypted with this password, +// otherwise the recovered wallet will be unencrypted. +func (c *Client) RecoverWallet(req WalletRecoverRequest) (*WalletResponse, error) { + var rsp WalletResponse + ok, err := c.PostJSONV2("/api/v2/wallet/recover", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// Disconnect disconnect a connections by ID +func (c *Client) Disconnect(id uint64) error { + v := url.Values{} + v.Add("id", fmt.Sprint(id)) + + var obj struct{} + return c.PostForm("/api/v1/network/connection/disconnect", strings.NewReader(v.Encode()), &obj) +} + +// GetAllStorageValues makes a GET request to /api/v2/data to get all the values from the storage of +// `storageType` type +func (c *Client) GetAllStorageValues(storageType kvstorage.Type) (map[string]string, error) { + var values map[string]string + ok, err := c.GetV2(fmt.Sprintf("/api/v2/data?type=%s", storageType), &values) + if !ok { + return nil, err + } + + return values, err +} + +// GetStorageValue makes a GET request to /api/v2/data to get the value associated with `key` from storage +// of `storageType` type +func (c *Client) GetStorageValue(storageType kvstorage.Type, key string) (string, error) { + var value string + ok, err := c.GetV2(fmt.Sprintf("/api/v2/data?type=%s&key=%s", storageType, key), &value) + if !ok { + return "", err + } + + return value, err +} + +// AddStorageValue make a POST request to /api/v2/data to add a value with the key to the storage +// of `storageType` type +func (c *Client) AddStorageValue(storageType kvstorage.Type, key, val string) error { + _, err := c.PostJSONV2("/api/v2/data", StorageRequest{ + StorageType: storageType, + Key: key, + Val: val, + }, nil) + + return err +} + +// RemoveStorageValue makes a DELETE request to /api/v2/data to remove a value associated with the `key` +// from the storage of `storageType` type +func (c *Client) RemoveStorageValue(storageType kvstorage.Type, key string) error { + _, err := c.DeleteV2(fmt.Sprintf("/api/v2/data?type=%s&key=%s", storageType, key), nil) + + return err +} + +// RequestArg is the general data type for sending request +type RequestArg struct { + Key string + Value string +} + +// TransactionsWithStatusV2 represents transactions result with page info +type TransactionsWithStatusV2 struct { + PageInfo readable.PageInfo `json:"page_info"` + Txns []readable.TransactionWithStatus `json:"txns"` +} + +// TransactionsWithStatusVerboseV2 represents verbose transactions result with page info +type TransactionsWithStatusVerboseV2 struct { + PageInfo readable.PageInfo `json:"page_info"` + Txns []readable.TransactionWithStatusVerbose `json:"txns"` +} + +// TransactionsV2 make a GET request to /api/v2/transaction to get transactions with no verbose. +func (c *Client) TransactionsV2(args ...RequestArg) (*TransactionsWithStatusV2, error) { + kvs := make([]string, len(args)) + for i, arg := range args { + kvs[i] = fmt.Sprintf("%s=%s", arg.Key, arg.Value) + if strings.Contains(arg.Key, "verbose") { + return nil, errors.New("arguments should not include 'verbose'") + } + } + + endpoint := fmt.Sprintf("/api/v2/transactions?%s", strings.Join(kvs, "&")) + + var obj TransactionsWithStatusV2 + _, err := c.GetV2(endpoint, &obj) + if err != nil { + return nil, err + } + return &obj, nil +} + +// TransactionsVerboseV2 make a GET request to /api/v2/transaction to get transactions with no verbose. +func (c *Client) TransactionsVerboseV2(args ...RequestArg) (*TransactionsWithStatusVerboseV2, error) { + kvs := make([]string, len(args)) + for i, arg := range args { + kvs[i] = fmt.Sprintf("%s=%s", arg.Key, arg.Value) + } + + endpoint := fmt.Sprintf("/api/v2/transactions?verbose=true&%s", strings.Join(kvs, "&")) + + var obj TransactionsWithStatusVerboseV2 + _, err := c.GetV2(endpoint, &obj) + if err != nil { + return nil, err + } + return &obj, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/csrf.go b/vendor/github.com/skycoin/skycoin/src/api/csrf.go new file mode 100644 index 0000000000..6a6bf337be --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/csrf.go @@ -0,0 +1,166 @@ +package api + +import ( + "net/http" + "time" + + "crypto/hmac" + "crypto/sha256" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "strings" + + "github.com/skycoin/skycoin/src/cipher" + wh "github.com/skycoin/skycoin/src/util/http" +) + +const ( + // CSRFHeaderName is the name of the CSRF header + CSRFHeaderName = "X-CSRF-Token" + + // CSRFMaxAge is the lifetime of a CSRF token in seconds + CSRFMaxAge = time.Second * 30 + + csrfSecretLength = 64 + + csrfNonceLength = 64 +) + +var ( + // ErrCSRFInvalid is returned when the the CSRF token is in invalid format + ErrCSRFInvalid = errors.New("invalid CSRF token") + // ErrCSRFInvalidSignature is returned when the signature of the csrf token is invalid + ErrCSRFInvalidSignature = errors.New("invalid CSRF token signature") + // ErrCSRFExpired is returned when the csrf token has expired + ErrCSRFExpired = errors.New("csrf token expired") +) + +var csrfSecretKey []byte + +func init() { + csrfSecretKey = cipher.RandByte(csrfSecretLength) +} + +// CSRFToken csrf token +type CSRFToken struct { + Nonce []byte + ExpiresAt time.Time +} + +// newCSRFToken generates a new CSRF Token +func newCSRFToken() (string, error) { + return newCSRFTokenWithTime(time.Now().Add(CSRFMaxAge)) +} + +func newCSRFTokenWithTime(expiresAt time.Time) (string, error) { + token := &CSRFToken{ + Nonce: cipher.RandByte(csrfNonceLength), + ExpiresAt: expiresAt, + } + + tokenJSON, err := json.Marshal(token) + if err != nil { + return "", err + } + + h := hmac.New(sha256.New, csrfSecretKey) + _, err = h.Write([]byte(tokenJSON)) + if err != nil { + return "", err + } + + sig := base64.RawURLEncoding.EncodeToString(h.Sum(nil)) + + signingString := base64.RawURLEncoding.EncodeToString(tokenJSON) + + return strings.Join([]string{signingString, sig}, "."), nil +} + +// verifyCSRFToken checks validity of the given token +func verifyCSRFToken(headerToken string) error { + tokenParts := strings.Split(headerToken, ".") + if len(tokenParts) != 2 { + return ErrCSRFInvalid + } + + signingString, err := base64.RawURLEncoding.DecodeString(tokenParts[0]) + if err != nil { + return err + } + + h := hmac.New(sha256.New, csrfSecretKey) + _, err = h.Write([]byte(signingString)) + if err != nil { + return err + } + + sig := base64.RawURLEncoding.EncodeToString(h.Sum(nil)) + + if sig != tokenParts[1] { + return ErrCSRFInvalidSignature + } + + var csrfToken CSRFToken + err = json.Unmarshal(signingString, &csrfToken) + if err != nil { + return err + } + + if time.Now().After(csrfToken.ExpiresAt) { + return ErrCSRFExpired + } + + return nil +} + +// Creates a new CSRF token. Previous CSRF tokens are invalidated by this call. +// URI: /api/v1/csrf +// Method: GET +// Response: +// +// csrf_token: CSRF token to use in POST requests +func getCSRFToken(disabled bool) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + if disabled { + logger.Warning("CSRF check disabled") + wh.Error404(w, "") + return + } + + // generate a new token + csrfToken, err := newCSRFToken() + if err != nil { + logger.Error(err) + wh.Error500(w, fmt.Sprintf("Failed to create a csrf token: %v", err)) + return + } + + wh.SendJSONOr500(logger, w, &map[string]string{"csrf_token": csrfToken}) + } +} + +// CSRFCheck verifies X-CSRF-Token header value +func CSRFCheck(apiVersion string, disabled bool, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !disabled { + switch r.Method { + case http.MethodPost, http.MethodPut, http.MethodDelete: + token := r.Header.Get(CSRFHeaderName) + if err := verifyCSRFToken(token); err != nil { + logger.Errorf("CSRF token invalid: %v", err) + writeError(w, apiVersion, http.StatusForbidden, err.Error()) + return + } + } + } + + handler.ServeHTTP(w, r) + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/explorer.go b/vendor/github.com/skycoin/skycoin/src/api/explorer.go new file mode 100644 index 0000000000..fc31f49b00 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/explorer.go @@ -0,0 +1,243 @@ +package api + +import ( + "fmt" + "net/http" + "strconv" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/readable" + "github.com/skycoin/skycoin/src/util/droplet" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/util/mathutil" +) + +// CoinSupply records the coin supply info +type CoinSupply struct { + // Coins distributed beyond the project: + CurrentSupply string `json:"current_supply"` + // TotalSupply is CurrentSupply plus coins held by the distribution addresses that are spendable + TotalSupply string `json:"total_supply"` + // MaxSupply is the maximum number of coins to be distributed ever + MaxSupply string `json:"max_supply"` + // CurrentCoinHourSupply is coins hours in non distribution addresses + CurrentCoinHourSupply string `json:"current_coinhour_supply"` + // TotalCoinHourSupply is coin hours in all addresses including unlocked distribution addresses + TotalCoinHourSupply string `json:"total_coinhour_supply"` + // Distribution addresses which count towards total supply + UnlockedAddresses []string `json:"unlocked_distribution_addresses"` + // Distribution addresses which are locked and do not count towards total supply + LockedAddresses []string `json:"locked_distribution_addresses"` +} + +func newAddrSet(addrs []cipher.Address) map[cipher.Address]struct{} { + s := make(map[cipher.Address]struct{}, len(addrs)) + for _, a := range addrs { + s[a] = struct{}{} + } + return s +} + +// coinSupplyHandler returns coin distribution supply stats +// Method: GET +// URI: /api/v1/coinSupply +func coinSupplyHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + allUnspents, err := gateway.GetUnspentOutputsSummary(nil) + if err != nil { + err = fmt.Errorf("gateway.GetUnspentOutputsSummary failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + dist := gateway.VisorConfig().Distribution + + unlockedAddrs := dist.UnlockedAddressesDecoded() + // Search map of unlocked addresses, used to filter unspents + unlockedAddrSet := newAddrSet(unlockedAddrs) + + var unlockedSupply uint64 + // check confirmed unspents only + for _, u := range allUnspents.Confirmed { + // check if address is an unlocked distribution address + if _, ok := unlockedAddrSet[u.Body.Address]; ok { + var err error + unlockedSupply, err = mathutil.AddUint64(unlockedSupply, u.Body.Coins) + if err != nil { + err = fmt.Errorf("uint64 overflow while adding up unlocked supply coins: %v", err) + wh.Error500(w, err.Error()) + return + } + } + } + + // "total supply" is the number of coins unlocked. + // Each distribution address was allocated distribution.AddressInitialBalance coins. + totalSupply := uint64(len(unlockedAddrs)) * dist.AddressInitialBalance() + totalSupply *= droplet.Multiplier + + // "current supply" is the number of coins distributed from the unlocked pool + currentSupply := totalSupply - unlockedSupply + + currentSupplyStr, err := droplet.ToString(currentSupply) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return + } + + totalSupplyStr, err := droplet.ToString(totalSupply) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return + } + + maxSupplyStr, err := droplet.ToString(dist.MaxCoinSupply * droplet.Multiplier) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return + } + + // locked distribution addresses + lockedAddrs := dist.LockedAddressesDecoded() + lockedAddrSet := newAddrSet(lockedAddrs) + + // get total coins hours which excludes locked distribution addresses + var totalCoinHours uint64 + for _, out := range allUnspents.Confirmed { + if _, ok := lockedAddrSet[out.Body.Address]; !ok { + var err error + totalCoinHours, err = mathutil.AddUint64(totalCoinHours, out.CalculatedHours) + if err != nil { + err = fmt.Errorf("uint64 overflow while adding up total coin hours: %v", err) + wh.Error500(w, err.Error()) + return + } + } + } + + // get current coin hours which excludes all distribution addresses + var currentCoinHours uint64 + for _, out := range allUnspents.Confirmed { + // check if address not in locked distribution addresses + if _, ok := lockedAddrSet[out.Body.Address]; !ok { + // check if address not in unlocked distribution addresses + if _, ok := unlockedAddrSet[out.Body.Address]; !ok { + currentCoinHours += out.CalculatedHours + } + } + } + + if err != nil { + err = fmt.Errorf("Failed to get total coinhours: %v", err) + wh.Error500(w, err.Error()) + return + } + + cs := CoinSupply{ + CurrentSupply: currentSupplyStr, + TotalSupply: totalSupplyStr, + MaxSupply: maxSupplyStr, + CurrentCoinHourSupply: strconv.FormatUint(currentCoinHours, 10), + TotalCoinHourSupply: strconv.FormatUint(totalCoinHours, 10), + UnlockedAddresses: dist.UnlockedAddresses(), + LockedAddresses: dist.LockedAddresses(), + } + + wh.SendJSONOr500(logger, w, cs) + } +} + +// Richlist contains top address balances +type Richlist struct { + Richlist []readable.RichlistBalance `json:"richlist"` +} + +// richlistHandler returns the top skycoin holders +// Method: GET +// URI: /richlist?n=${number}&include-distribution=${bool} +// Args: +// +// n [int, number of results to include] +// include-distribution [bool, include the distribution addresses in the richlist] +func richlistHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + var topn int + topnStr := r.FormValue("n") + if topnStr == "" { + topn = 20 + } else { + var err error + topn, err = strconv.Atoi(topnStr) + if err != nil { + wh.Error400(w, "invalid n") + return + } + } + + var includeDistribution bool + includeDistributionStr := r.FormValue("include-distribution") + if includeDistributionStr == "" { + includeDistribution = false + } else { + var err error + includeDistribution, err = strconv.ParseBool(includeDistributionStr) + if err != nil { + wh.Error400(w, "invalid include-distribution") + return + } + } + + richlist, err := gateway.GetRichlist(includeDistribution) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if topn > 0 && topn < len(richlist) { + richlist = richlist[:topn] + } + + readableRichlist, err := readable.NewRichlistBalances(richlist) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, Richlist{ + Richlist: readableRichlist, + }) + } +} + +// addressCountHandler returns the total number of unique address that have coins +// Method: GET +// URI: /addresscount +func addressCountHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addrCount, err := gateway.AddressCount() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, &map[string]uint64{"count": addrCount}) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/gateway.go b/vendor/github.com/skycoin/skycoin/src/api/gateway.go new file mode 100644 index 0000000000..277dba1b91 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/gateway.go @@ -0,0 +1,122 @@ +package api + +import ( + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/kvstorage" + "github.com/skycoin/skycoin/src/transaction" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" +) + +// Gateway bundles daemon.Daemon, Visor, wallet.Service and kvstorage.Manager into a single object +type Gateway struct { + *daemon.Daemon + *visor.Visor + *wallet.Service + *kvstorage.Manager +} + +// NewGateway creates a Gateway +func NewGateway(d *daemon.Daemon, v *visor.Visor, w *wallet.Service, m *kvstorage.Manager) *Gateway { + return &Gateway{ + Daemon: d, + Visor: v, + Service: w, + Manager: m, + } +} + +//go:generate mockery -name Gatewayer -case underscore -inpkg -testonly + +// Gatewayer interface for Gateway methods +type Gatewayer interface { + Daemoner + Visorer + Walleter + Storer +} + +// Daemoner interface for daemon.Daemon methods used by the API +type Daemoner interface { + DaemonConfig() daemon.DaemonConfig + GetConnection(addr string) (*daemon.Connection, error) + GetConnections(f func(c daemon.Connection) bool) ([]daemon.Connection, error) + DisconnectByGnetID(gnetID uint64) error + GetDefaultConnections() []string + GetTrustConnections() []string + GetExchgConnection() []string + GetBlockchainProgress(headSeq uint64) *daemon.BlockchainProgress + InjectBroadcastTransaction(txn coin.Transaction) error + InjectTransaction(txn coin.Transaction) error +} + +// Visorer interface for visor.Visor methods used by the API +type Visorer interface { + VisorConfig() visor.Config + StartedAt() time.Time + HeadBkSeq() (uint64, bool, error) + GetBlockchainMetadata() (*visor.BlockchainMetadata, error) + ResendUnconfirmedTxns() ([]cipher.SHA256, error) + GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockByHashVerbose(hash cipher.SHA256) (*coin.SignedBlock, [][]visor.TransactionInput, error) + GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) + GetSignedBlockBySeqVerbose(seq uint64) (*coin.SignedBlock, [][]visor.TransactionInput, error) + GetBlocks(seqs []uint64) ([]coin.SignedBlock, error) + GetBlocksVerbose(seqs []uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) + GetBlocksInRange(start, end uint64) ([]coin.SignedBlock, error) + GetBlocksInRangeVerbose(start, end uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) + GetLastBlocks(num uint64) ([]coin.SignedBlock, error) + GetLastBlocksVerbose(num uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) + GetUnspentOutputsSummary(filters []visor.OutputsFilter) (*visor.UnspentOutputsSummary, error) + GetBalanceOfAddresses(addrs []cipher.Address) ([]wallet.BalancePair, error) + VerifyTxnVerbose(txn *coin.Transaction, signed transaction.TxnSignedFlag) ([]visor.TransactionInput, bool, error) + AddressCount() (uint64, error) + GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, uint64, error) + GetSpentOutputsForAddresses(addr []cipher.Address) ([][]historydb.UxOut, uint64, error) + GetRichlist(includeDistribution bool) (visor.Richlist, error) + GetAllUnconfirmedTransactions() ([]visor.UnconfirmedTransaction, error) + GetAllUnconfirmedTransactionsVerbose() ([]visor.UnconfirmedTransaction, [][]visor.TransactionInput, error) + GetTransaction(txid cipher.SHA256) (*visor.Transaction, error) + GetTransactionWithInputs(txid cipher.SHA256) (*visor.Transaction, []visor.TransactionInput, error) + GetTransactions(flts []visor.TxFilter, order visor.SortOrder, page *visor.PageIndex) ([]visor.Transaction, uint64, error) + GetTransactionsWithInputs(flts []visor.TxFilter, order visor.SortOrder, page *visor.PageIndex) ([]visor.Transaction, [][]visor.TransactionInput, uint64, error) + GetTransactionsNum() (uint64, error) + GetWalletUnconfirmedTransactions(wltID string) ([]visor.UnconfirmedTransaction, error) + GetWalletUnconfirmedTransactionsVerbose(wltID string) ([]visor.UnconfirmedTransaction, [][]visor.TransactionInput, error) + GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalances, error) + CreateTransaction(p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) + WalletCreateTransaction(wltID string, p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) + WalletCreateTransactionSigned(wltID string, password []byte, p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) + WalletSignTransaction(wltID string, password []byte, txn *coin.Transaction, signIndexes []int) (*coin.Transaction, []visor.TransactionInput, error) + ScanWalletAddresses(wltID string, password []byte, num uint64) ([]cipher.Address, error) + TransactionsFinder() wallet.TransactionsFinder +} + +// Walleter interface for wallet.Service methods used by the API +type Walleter interface { + UnloadWallet(wltID string) error + EncryptWallet(wltID string, password []byte) (wallet.Wallet, error) + DecryptWallet(wltID string, password []byte) (wallet.Wallet, error) + GetWalletSeed(wltID string, password []byte) (string, string, error) + CreateWallet(wltName string, options wallet.Options) (wallet.Wallet, error) + RecoverWallet(wltID, seed, seedPassphrase string, password []byte) (wallet.Wallet, error) + NewAddresses(wltID string, password []byte, options ...wallet.Option) ([]cipher.Address, error) + ScanAddresses(wltID string, password []byte, n uint64, tf wallet.TransactionsFinder) ([]cipher.Address, error) + GetWallet(wltID string) (wallet.Wallet, error) + GetWallets() (wallet.Wallets, error) + UpdateWalletLabel(wltID, label string) error + WalletDir() (string, error) +} + +// Storer interface for kvstorage.Manager methods used by the API +type Storer interface { + GetStorageValue(storageType kvstorage.Type, key string) (string, error) + GetAllStorageValues(storageType kvstorage.Type) (map[string]string, error) + AddStorageValue(storageType kvstorage.Type, key, val string) error + RemoveStorageValue(storageType kvstorage.Type, key string) error +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/health.go b/vendor/github.com/skycoin/skycoin/src/api/health.go new file mode 100644 index 0000000000..f64c07cba0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/health.go @@ -0,0 +1,118 @@ +package api + +import ( + "fmt" + "net/http" + "time" + + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/readable" + wh "github.com/skycoin/skycoin/src/util/http" +) + +// BlockchainMetadata extends visor.BlockchainMetadata to include the time since the last block +type BlockchainMetadata struct { + readable.BlockchainMetadata + TimeSinceLastBlock wh.Duration `json:"time_since_last_block"` +} + +// HealthResponse is returned by the /health endpoint +type HealthResponse struct { + BlockchainMetadata BlockchainMetadata `json:"blockchain"` + Version readable.BuildInfo `json:"version"` + CoinName string `json:"coin"` + DaemonUserAgent string `json:"user_agent"` + OpenConnections int `json:"open_connections"` + OutgoingConnections int `json:"outgoing_connections"` + IncomingConnections int `json:"incoming_connections"` + Uptime wh.Duration `json:"uptime"` + CSRFEnabled bool `json:"csrf_enabled"` + HeaderCheckEnabled bool `json:"header_check_enabled"` + CSPEnabled bool `json:"csp_enabled"` + WalletAPIEnabled bool `json:"wallet_api_enabled"` + GUIEnabled bool `json:"gui_enabled"` + BlockPublisher bool `json:"block_publisher"` + UserVerifyTxn readable.VerifyTxn `json:"user_verify_transaction"` + UnconfirmedVerifyTxn readable.VerifyTxn `json:"unconfirmed_verify_transaction"` + StartedAt int64 `json:"started_at"` + Fiber readable.FiberConfig `json:"fiber"` +} + +func getHealthData(c muxConfig, gateway Gatewayer) (*HealthResponse, error) { + metadata, err := gateway.GetBlockchainMetadata() + if err != nil { + return nil, fmt.Errorf("gateway.GetBlockchainMetadata failed: %v", err) + } + + conns, err := gateway.GetConnections(func(c daemon.Connection) bool { + return c.State != daemon.ConnectionStatePending + }) + if err != nil { + return nil, fmt.Errorf("gateway.GetConnections failed: %v", err) + } + + outgoingConns := 0 + incomingConns := 0 + for _, c := range conns { + if c.Outgoing { + outgoingConns++ + } else { + incomingConns++ + } + } + + elapsedBlockTime := time.Now().UTC().Unix() - int64(metadata.HeadBlock.Head.Time) + timeSinceLastBlock := time.Second * time.Duration(elapsedBlockTime) + + _, walletAPIEnabled := c.enabledAPISets[EndpointsWallet] + + userAgent, err := c.health.DaemonUserAgent.Build() + if err != nil { + return nil, err + } + + return &HealthResponse{ + BlockchainMetadata: BlockchainMetadata{ + BlockchainMetadata: readable.NewBlockchainMetadata(*metadata), + TimeSinceLastBlock: wh.FromDuration(timeSinceLastBlock), + }, + Version: c.health.BuildInfo, + CoinName: c.health.Fiber.Name, + Fiber: c.health.Fiber, + DaemonUserAgent: userAgent, + OpenConnections: len(conns), + OutgoingConnections: outgoingConns, + IncomingConnections: incomingConns, + CSRFEnabled: !c.disableCSRF, + HeaderCheckEnabled: !c.disableHeaderCheck, + CSPEnabled: !c.disableCSP, + GUIEnabled: c.enableGUI, + BlockPublisher: c.health.BlockPublisher, + WalletAPIEnabled: walletAPIEnabled, + UserVerifyTxn: readable.NewVerifyTxn(params.UserVerifyTxn), + UnconfirmedVerifyTxn: readable.NewVerifyTxn(gateway.DaemonConfig().UnconfirmedVerifyTxn), + Uptime: wh.FromDuration(time.Since(gateway.StartedAt())), + StartedAt: gateway.StartedAt().Unix(), + }, nil +} + +// healthHandler returns node health data +// URI: /api/v1/health +// Method: GET +func healthHandler(c muxConfig, gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + health, err := getHealthData(c, gateway) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, health) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/http.go b/vendor/github.com/skycoin/skycoin/src/api/http.go new file mode 100644 index 0000000000..b35411e96c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/http.go @@ -0,0 +1,790 @@ +/* +Package api implements the REST API interface +*/ +package api + +import ( + "crypto/tls" + "encoding/json" + "errors" + "fmt" + + // "io/ioutil" + "io/fs" + "net" + "net/http" + "path/filepath" + "strings" + "time" + "unicode" + + "github.com/rs/cors" + + "github.com/skycoin/skycoin/src/util/gziphandler" + + "github.com/skycoin/skycoin" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/readable" + "github.com/skycoin/skycoin/src/util/file" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/useragent" + "github.com/skycoin/skycoin/src/visor" +) + +var ( + logger = logging.MustGetLogger("api") +) + +const ( + resourceDir = "dist/" + devDir = "dev/" + indexPage = "index.html" + + apiVersion1 = "v1" + apiVersion2 = "v2" + + defaultReadTimeout = time.Second * 10 + defaultWriteTimeout = time.Second * 60 + defaultIdleTimeout = time.Second * 120 + + // EndpointsRead endpoints with no side-effects and no changes in node state + EndpointsRead = "READ" + // EndpointsStatus endpoints offer (meta,runtime)data to dashboard and monitoring clients + EndpointsStatus = "STATUS" + // EndpointsTransaction endpoints export operations on transactions that modify node state + EndpointsTransaction = "TXN" + // EndpointsWallet endpoints implement wallet interface + EndpointsWallet = "WALLET" + // EndpointsInsecureWalletSeed endpoints implement wallet interface + EndpointsInsecureWalletSeed = "INSECURE_WALLET_SEED" + // EndpointsNetCtrl endpoints for managing network connections + EndpointsNetCtrl = "NET_CTRL" + // EndpointsStorage endpoints implement interface for key-value storage for arbitrary data + EndpointsStorage = "STORAGE" +) + +// Server exposes an HTTP API +type Server struct { + server *http.Server + listener net.Listener + done chan struct{} +} + +// Config configures Server +type Config struct { + StaticDir string + DisableCSRF bool + DisableHeaderCheck bool + DisableCSP bool + EnableGUI bool + ReadTimeout time.Duration + WriteTimeout time.Duration + IdleTimeout time.Duration + Health HealthConfig + HostWhitelist []string + EnabledAPISets map[string]struct{} + Username string + Password string +} + +// HealthConfig configuration data exposed in /health +type HealthConfig struct { + BuildInfo readable.BuildInfo + Fiber readable.FiberConfig + DaemonUserAgent useragent.Data + BlockPublisher bool +} + +type muxConfig struct { + host string + appLoc string + enableGUI bool + disableCSRF bool + disableHeaderCheck bool + disableCSP bool + enabledAPISets map[string]struct{} + hostWhitelist []string + username string + password string + health HealthConfig +} + +// HTTPResponse represents the http response struct +type HTTPResponse struct { + Error *HTTPError `json:"error,omitempty"` + Data interface{} `json:"data,omitempty"` +} + +// HTTPError is included in an HTTPResponse +type HTTPError struct { + Message string `json:"message"` + Code int `json:"code"` +} + +// NewHTTPErrorResponse returns an HTTPResponse with the Error field populated +func NewHTTPErrorResponse(code int, msg string) HTTPResponse { + if msg == "" { + msg = http.StatusText(code) + } + + return HTTPResponse{ + Error: &HTTPError{ + Code: code, + Message: msg, + }, + } +} + +func writeError400Response(w http.ResponseWriter, msg string) { + writeHTTPResponse(w, NewHTTPErrorResponse(http.StatusBadRequest, msg)) +} + +func writeError405Response(w http.ResponseWriter) { + writeHTTPResponse(w, NewHTTPErrorResponse(http.StatusMethodNotAllowed, "")) +} + +func writeError500Response(w http.ResponseWriter, msg string) { + writeHTTPResponse(w, NewHTTPErrorResponse(http.StatusInternalServerError, msg)) +} + +func writeHTTPResponse(w http.ResponseWriter, resp HTTPResponse) { + out, err := json.MarshalIndent(resp, "", " ") + if err != nil { + wh.Error500(w, "json.MarshalIndent failed") + return + } + + w.Header().Add("Content-Type", ContentTypeJSON) + + if resp.Error == nil { + w.WriteHeader(http.StatusOK) + } else { + if resp.Error.Code < 400 || resp.Error.Code >= 600 { + logger.Critical().Errorf("writeHTTPResponse invalid error status code: %d", resp.Error.Code) + w.WriteHeader(http.StatusInternalServerError) + } else { + w.WriteHeader(resp.Error.Code) + } + } + + if _, err := w.Write(out); err != nil { + logger.WithError(err).Error("http Write failed") + } +} + +func create(host string, c Config, gateway Gatewayer) (*Server, error) { + var appLoc string + if c.EnableGUI { + var err error + appLoc, err = file.DetermineResourcePath(c.StaticDir, resourceDir, devDir) + if err != nil { + return nil, err + } + logger.Infof("Web resources directory: %s", appLoc) + } + + // var appHandler http.Handler + // if c.EnableGUI { + // appHandler = http.FileServer(http.FS(skycoin.GuiFiles)) + // } + + if c.DisableCSRF { + logger.Warning("CSRF check disabled") + } + + if c.DisableHeaderCheck { + logger.Warning("Header check disabled") + } + + if c.ReadTimeout == 0 { + c.ReadTimeout = defaultReadTimeout + } + if c.WriteTimeout == 0 { + c.WriteTimeout = defaultWriteTimeout + } + if c.IdleTimeout == 0 { + c.IdleTimeout = defaultIdleTimeout + } + + mc := muxConfig{ + host: host, + appLoc: appLoc, + enableGUI: c.EnableGUI, + disableCSRF: c.DisableCSRF, + disableHeaderCheck: c.DisableHeaderCheck, + disableCSP: c.DisableCSP, + health: c.Health, + enabledAPISets: c.EnabledAPISets, + hostWhitelist: c.HostWhitelist, + username: c.Username, + password: c.Password, + } + + srvMux := newServerMux(mc, gateway) + + // if c.EnableGUI { + // srvMux.Handle("/", appHandler) + // } + + srv := &http.Server{ + Handler: srvMux, + ReadTimeout: c.ReadTimeout, + WriteTimeout: c.WriteTimeout, + IdleTimeout: c.IdleTimeout, + // MaxHeaderBytes: http.DefaultMaxHeaderBytes, // adjust this to allow longer GET queries + } + + return &Server{ + server: srv, + done: make(chan struct{}), + }, nil +} + +// Create creates a new Server instance that listens on HTTP +func Create(host string, c Config, gateway Gatewayer) (*Server, error) { + logger.Warning("HTTPS not in use!") + + listener, err := net.Listen("tcp", host) + if err != nil { + return nil, err + } + + // If the host did not specify a port, allowing the kernel to assign one, + // we need to get the assigned address to know the full hostname + host = listener.Addr().String() + + s, err := create(host, c, gateway) + if err != nil { + if s != nil { + if closeErr := s.listener.Close(); closeErr != nil { + logger.WithError(err).Warning("s.listener.Close() error") + } + } + return nil, err + } + + s.listener = listener + + return s, nil +} + +// CreateHTTPS creates a new Server instance that listens on HTTPS +func CreateHTTPS(host string, c Config, gateway Gatewayer, certFile, keyFile string) (*Server, error) { + cert, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + return nil, err + } + + logger.Infof("Using %s for the certificate", certFile) + logger.Infof("Using %s for the key", keyFile) + + listener, err := tls.Listen("tcp", host, &tls.Config{ + Certificates: []tls.Certificate{cert}, + }) + if err != nil { + return nil, err + } + + // If the host did not specify a port, allowing the kernel to assign one, + // we need to get the assigned address to know the full hostname + host = listener.Addr().String() + + s, err := create(host, c, gateway) + if err != nil { + if s != nil { + if closeErr := s.listener.Close(); closeErr != nil { + logger.WithError(err).Warning("s.listener.Close() error") + } + } + return nil, err + } + + s.listener = listener + + return s, nil +} + +// Addr returns the listening address of the Server +func (s *Server) Addr() string { + if s == nil || s.listener == nil { + return "" + } + return s.listener.Addr().String() +} + +// Serve serves the web interface on the configured host +func (s *Server) Serve() error { + logger.Infof("Starting web interface on %s", s.listener.Addr()) + defer logger.Info("Web interface closed") + defer close(s.done) + + if err := s.server.Serve(s.listener); err != nil { + if err != http.ErrServerClosed { + return err + } + } + return nil +} + +// Shutdown closes the HTTP service. This can only be called after Serve or ServeHTTPS has been called. +func (s *Server) Shutdown() { + if s == nil { + return + } + + logger.Info("Shutting down web interface") + defer logger.Info("Web interface shut down") + if err := s.listener.Close(); err != nil { + logger.WithError(err).Warning("s.listener.Close() error") + } + <-s.done +} + +// newServerMux creates an http.ServeMux with handlers registered +func newServerMux(c muxConfig, gateway Gatewayer) *http.ServeMux { + mux := http.NewServeMux() + + allowedOrigins := []string{fmt.Sprintf("http://%s", c.host)} + for _, s := range c.hostWhitelist { + allowedOrigins = append(allowedOrigins, fmt.Sprintf("http://%s", s)) + } + + corsHandler := cors.New(cors.Options{ + AllowedOrigins: allowedOrigins, + Debug: false, + AllowedMethods: []string{http.MethodGet, http.MethodPost}, + AllowedHeaders: []string{"Origin", "Accept", "Content-Type", "X-Requested-With", CSRFHeaderName}, + AllowCredentials: false, // credentials are not used, but it would be safe to enable if necessary + OptionsPassthrough: false, + }) + + headerCheck := func(apiVersion, host string, hostWhitelist []string, handler http.Handler) http.Handler { + handler = originRefererCheck(apiVersion, host, hostWhitelist, handler) + handler = hostCheck(apiVersion, host, hostWhitelist, handler) + return handler + } + + forMethodAPISets := func(apiVersion string, f http.Handler, methodsAPISets map[string][]string) http.Handler { + if len(methodsAPISets) == 0 { + logger.Panic("methodsAPISets should not be empty") + } + + switch apiVersion { + case apiVersion1, apiVersion2: + default: + logger.Panicf("Invalid API version %q", apiVersion) + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + apiSets := methodsAPISets[r.Method] + + // If no API sets are specified for a given method, return 405 Method Not Allowed + if len(apiSets) == 0 { + switch apiVersion { + case apiVersion1: + wh.Error405(w) + case apiVersion2: + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + } + return + } + + for _, k := range apiSets { + if _, ok := c.enabledAPISets[k]; ok { + f.ServeHTTP(w, r) + return + } + } + + switch apiVersion { + case apiVersion1: + wh.Error403(w, "Endpoint is disabled") + case apiVersion2: + resp := NewHTTPErrorResponse(http.StatusForbidden, "Endpoint is disabled") + writeHTTPResponse(w, resp) + } + }) + } + + webHandlerWithOptionals := func(apiVersion, endpoint string, handlerFunc http.Handler, checkCSRF, checkHeaders bool) { + handler := wh.ElapsedHandler(logger, handlerFunc) + + handler = corsHandler.Handler(handler) + + if checkCSRF { + handler = CSRFCheck(apiVersion, c.disableCSRF, handler) + } + + if checkHeaders { + handler = headerCheck(apiVersion, c.host, c.hostWhitelist, handler) + } + + if apiVersion == apiVersion2 { + handler = ContentTypeJSONRequired(handler) + } + + handler = basicAuth(apiVersion, c.username, c.password, "skycoin daemon", handler) + handler = gziphandler.New(handler) + mux.Handle(endpoint, handler) + } + + webHandler := func(apiVersion, endpoint string, handler http.Handler, methodAPISets map[string][]string) { + // methodAPISets can be nil to ignore the concept of API sets for an endpoint. It will always be enabled. + // Explicitly check nil, caller should not pass empty initialized map + if methodAPISets != nil { + handler = forMethodAPISets(apiVersion, handler, methodAPISets) + } + + webHandlerWithOptionals(apiVersion, endpoint, handler, true, !c.disableHeaderCheck) + } + + webHandlerV1 := func(endpoint string, handler http.Handler, methodAPISets map[string][]string) { + webHandler(apiVersion1, "/api/v1"+endpoint, handler, methodAPISets) + } + + webHandlerV2 := func(endpoint string, handler http.Handler, methodAPISets map[string][]string) { + webHandler(apiVersion2, "/api/v2"+endpoint, handler, methodAPISets) + } + + indexHandler := newIndexHandler(c.appLoc, c.enableGUI) + if !c.disableCSP { + indexHandler = CSPHandler(indexHandler, ContentSecurityPolicy) + } + webHandler(apiVersion1, "/", indexHandler, nil) + + /* + if c.enableGUI { + fileInfos, err := ioutil.ReadDir(c.appLoc) + if err != nil { + logger.WithError(err).Panicf("ioutil.ReadDir(%s) failed", c.appLoc) + } + + fs := http.FileServer(http.Dir(c.appLoc)) + if !c.disableCSP { + fs = CSPHandler(fs, ContentSecurityPolicy) + } + + for _, fileInfo := range fileInfos { + route := fmt.Sprintf("/%s", fileInfo.Name()) + if fileInfo.IsDir() { + route = route + "/" + } + + webHandler(apiVersion1, route, fs, nil) + } + } + */ + + if c.enableGUI { + // Use the embedded dist directory as the root for the file server + distDir, err := fs.Sub(skycoin.GuiFiles, "src/gui/static/dist") + if err != nil { + logger.WithError(err).Panic("Failed to access embedded dist directory") + } + + // Read files in the embedded dist directory + fileInfos, err := fs.ReadDir(distDir, ".") + if err != nil { + logger.WithError(err).Panic("Failed to read embedded dist directory") + } + + // Create the file server from the embedded dist directory + fs := http.FileServer(http.FS(distDir)) + if !c.disableCSP { + fs = CSPHandler(fs, ContentSecurityPolicy) + } + + // Set up routes for each file and directory + for _, fileInfo := range fileInfos { + route := fmt.Sprintf("/%s", fileInfo.Name()) + if fileInfo.IsDir() { + route = route + "/" + } + webHandler(apiVersion1, route, fs, nil) + } + + logger.Infof("Serving embedded GUI from src/gui/static/dist/") + } + + // get the current CSRF token + csrfHandlerV1 := func(endpoint string, handler http.Handler) { + webHandlerWithOptionals(apiVersion1, "/api/v1"+endpoint, handler, false, !c.disableHeaderCheck) + } + csrfHandlerV1("/csrf", getCSRFToken(c.disableCSRF)) // csrf is always available, regardless of the API set + + // Status endpoints + webHandlerV1("/version", versionHandler(c.health.BuildInfo), nil) // version is always available, regardless of the API set + webHandlerV1("/health", healthHandler(c, gateway), map[string][]string{ + http.MethodGet: {EndpointsRead, EndpointsStatus}, + }) + + // Wallet endpoints + webHandlerV1("/wallet", walletHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsWallet}, + }) + webHandlerV1("/wallet/create", walletCreateHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + webHandlerV1("/wallet/createTemp", walletCreateTempHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + webHandlerV1("/wallet/newAddress", walletNewAddressesHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + webHandlerV1("/wallet/scan", walletScanAddressesHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + webHandlerV1("/wallet/balance", walletBalanceHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsWallet}, + }) + webHandlerV1("/wallet/transaction", walletCreateTransactionHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + webHandlerV2("/wallet/transaction/sign", walletSignTransactionHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + webHandlerV1("/wallet/transactions", walletTransactionsHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsWallet}, + }) + webHandlerV1("/wallet/update", walletUpdateHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + webHandlerV1("/wallets", walletsHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsWallet}, + }) + webHandlerV1("/wallets/folderName", walletFolderHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsWallet}, + }) + webHandlerV1("/wallet/newSeed", newSeedHandler(), map[string][]string{ + http.MethodGet: {EndpointsWallet}, + }) + webHandlerV1("/wallet/seed", walletSeedHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsInsecureWalletSeed}, + }) + webHandlerV2("/wallet/seed/verify", http.HandlerFunc(walletVerifySeedHandler), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + + webHandlerV1("/wallet/unload", walletUnloadHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + webHandlerV1("/wallet/encrypt", walletEncryptHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + webHandlerV1("/wallet/decrypt", walletDecryptHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + webHandlerV2("/wallet/recover", walletRecoverHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsWallet}, + }) + + // Blockchain interface + webHandlerV1("/blockchain/metadata", blockchainMetadataHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/blockchain/progress", blockchainProgressHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/block", blockHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + webHandlerV1("/blocks", blocksHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + http.MethodPost: {EndpointsRead}, + }) + webHandlerV1("/last_blocks", lastBlocksHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + + // Network stats endpoints + webHandlerV1("/network/connection", connectionHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/connections", connectionsHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/defaultConnections", defaultConnectionsHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/connections/trust", trustConnectionsHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/connections/exchange", exchgConnectionsHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead, EndpointsStatus}, + }) + + // Network admin endpoints + webHandlerV1("/network/connection/disconnect", disconnectHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsNetCtrl}, + }) + + // Transaction related endpoints + webHandlerV1("/pendingTxs", pendingTxnsHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + webHandlerV1("/transaction", transactionHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + webHandlerV2("/transaction", transactionHandlerV2(gateway), map[string][]string{ + // http.MethodGet: []string{EndpointsRead}, + http.MethodPost: {EndpointsTransaction}, + }) + webHandlerV2("/transaction/verify", verifyTxnHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsRead}, + }) + webHandlerV1("/transactions", transactionsHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + http.MethodPost: {EndpointsRead}, + }) + webHandlerV1("/transactions/num", transactionsNumHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + + webHandlerV2("/transactions", transactionsHandlerV2(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + webHandlerV1("/injectTransaction", injectTransactionHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsTransaction, EndpointsWallet}, + }) + webHandlerV1("/resendUnconfirmedTxns", resendUnconfirmedTxnsHandler(gateway), map[string][]string{ + http.MethodPost: {EndpointsTransaction, EndpointsWallet}, + }) + webHandlerV1("/rawtx", rawTxnHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + + // Unspent output related endpoints + webHandlerV1("/outputs", outputsHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + http.MethodPost: {EndpointsRead}, + }) + webHandlerV1("/balance", balanceHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + http.MethodPost: {EndpointsRead}, + }) + webHandlerV1("/uxout", uxOutHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + webHandlerV1("/address_uxouts", addrUxOutsHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + + // Address related endpoints + webHandlerV2("/address/verify", http.HandlerFunc(addressVerifyHandler), map[string][]string{ + http.MethodPost: {EndpointsRead}, + }) + + // Explorer endpoints + webHandlerV1("/coinSupply", coinSupplyHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + webHandlerV1("/richlist", richlistHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + webHandlerV1("/addresscount", addressCountHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsRead}, + }) + + // Storage endpoint + webHandlerV2("/data", storageHandler(gateway), map[string][]string{ + http.MethodGet: {EndpointsStorage}, + http.MethodPost: {EndpointsStorage}, + http.MethodDelete: {EndpointsStorage}, + }) + + return mux +} + +// newIndexHandler returns a http.Handler for index.html, where index.html is in appLoc +func newIndexHandler(appLoc string, enableGUI bool) http.Handler { + // Serves the main page + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !enableGUI { + wh.Error404(w, "") + return + } + + if r.URL.Path != "/" { + wh.Error404(w, "") + return + } + + if r.URL.Path == "/" { + page := filepath.Join(appLoc, indexPage) + logger.Debugf("Serving index page: %s", page) + http.ServeFile(w, r, page) + } + }) +} + +// splitCommaString splits a string separated by commas or whitespace into tokens +// and returns an array of unique tokens split from that string +func splitCommaString(s string) []string { + words := strings.FieldsFunc(s, func(r rune) bool { + return r == ',' || unicode.IsSpace(r) + }) + + // Deduplicate + var dedupWords []string + wordsMap := make(map[string]struct{}) + for _, w := range words { + if _, ok := wordsMap[w]; !ok { + dedupWords = append(dedupWords, w) + } + wordsMap[w] = struct{}{} + } + + return dedupWords +} + +// parseAddressesFromStr parses comma-separated addresses string into []cipher.Address +func parseAddressesFromStr(s string) ([]cipher.Address, error) { + addrsStr := splitCommaString(s) + + addrs := make([]cipher.Address, len(addrsStr)) + for i, s := range addrsStr { + a, err := cipher.DecodeBase58Address(s) + if err != nil { + return nil, fmt.Errorf("address %q is invalid: %v", s, err) + } + + addrs[i] = a + } + + return addrs, nil +} + +func parseSortOrderFromStr(s string) (visor.SortOrder, error) { + if s == "" { + return visor.AscOrder, nil + } + + s = strings.ToUpper(strings.TrimSpace(s)) + switch s { + case "ASC": + return visor.AscOrder, nil + case "DESC": + return visor.DescOrder, nil + default: + return visor.UnknownOrder, errors.New("Unknown sort order") + } +} + +// parseAddressesFromStr parses comma-separated hashes string into []cipher.SHA256 +func parseHashesFromStr(s string) ([]cipher.SHA256, error) { + hashesStr := splitCommaString(s) + + hashes := make([]cipher.SHA256, len(hashesStr)) + for i, s := range hashesStr { + h, err := cipher.SHA256FromHex(s) + if err != nil { + return nil, fmt.Errorf("SHA256 hash %q is invalid: %v", s, err) + } + + hashes[i] = h + } + + return hashes, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/middleware.go b/vendor/github.com/skycoin/skycoin/src/api/middleware.go new file mode 100644 index 0000000000..e92c56d4d2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/middleware.go @@ -0,0 +1,208 @@ +package api + +import ( + "crypto/subtle" + "fmt" + "net/http" + "net/url" + "strings" + + "github.com/skycoin/skycoin/src/cipher" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/util/iputil" +) + +// ContentSecurityPolicy represents the value of content-security-policy +// header in http response +const ContentSecurityPolicy = "default-src 'self'" + + "; connect-src 'self' https://api.coinpaprika.com https://swaplab.cc https://version.skycoin.com https://downloads.skycoin.com http://127.0.0.1:9510" + + "; img-src 'self' 'unsafe-inline' data:" + + "; style-src 'self' 'unsafe-inline'" + + "; object-src 'none'" + + "; form-action 'none'" + + "; frame-ancestors 'none'" + + "; block-all-mixed-content" + + "; base-uri 'self'" + +// CSPHandler sets the Content-Security-Policy header +func CSPHandler(handler http.Handler, policy string) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Security-Policy", policy) + handler.ServeHTTP(w, r) + }) +} + +// ContentTypeJSONRequired enforces Content-Type: application/json in a POST request. +// Return 415 Unsupported Media Type if the Content-Type is not application/json, +// in the V2 error format. +func ContentTypeJSONRequired(handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodPost { + contentType := r.Header.Get("Content-Type") + if !isContentTypeJSON(contentType) { + resp := NewHTTPErrorResponse(http.StatusUnsupportedMediaType, "") + writeHTTPResponse(w, resp) + return + } + } + + handler.ServeHTTP(w, r) + }) +} + +// isContentTypeJSON returns true if the content type is application/json, +// allowing the content-type string to include extra parameters like charset=utf-8, +// for example `Content-Type: application/json; charset=utf-8` will return true. +func isContentTypeJSON(contentType string) bool { + return contentType == ContentTypeJSON || strings.HasPrefix(contentType, ContentTypeJSON+";") +} + +// HostCheck checks that the request's Host header is 127.0.0.1:$port or localhost:$port +// if the HTTP interface host is also a localhost address. +// This prevents DNS rebinding attacks, where an attacker uses a DNS rebinding service +// to bypass CORS checks. +// If the HTTP interface host is not a localhost address, +// the Host header is not checked. This is considered a public interface. +// If the Host header is not set, it is not checked. +// All major browsers send the Host header as required by the HTTP spec. +// hostWhitelist allows additional Host header values to be accepted. +func HostCheck(host string, hostWhitelist []string, handler http.Handler) http.Handler { + return hostCheck(apiVersion1, host, hostWhitelist, handler) +} + +func hostCheck(apiVersion, host string, hostWhitelist []string, handler http.Handler) http.Handler { + addr := host + var port uint16 + if strings.Contains(host, ":") { + var err error + addr, port, err = iputil.SplitAddr(host) + if err != nil { + logger.Panic(err) + } + } + + isLocalhost := iputil.IsLocalhost(addr) + + if isLocalhost && port == 0 { + logger.Panic("localhost with no port specified is unsupported") + } + + hostWhitelistMap := make(map[string]struct{}, len(hostWhitelist)+2) + for _, k := range hostWhitelist { + hostWhitelistMap[k] = struct{}{} + } + hostWhitelistMap[fmt.Sprintf("127.0.0.1:%d", port)] = struct{}{} + hostWhitelistMap[fmt.Sprintf("localhost:%d", port)] = struct{}{} + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // NOTE: The "Host" header is not in http.Request.Header, it's put in the http.Request.Host field + _, isWhitelisted := hostWhitelistMap[r.Host] + if isLocalhost && r.Host != "" && !isWhitelisted { + logger.Critical().Errorf("Detected DNS rebind attempt - configured-host=%s header-host=%s", host, r.Host) + writeError(w, apiVersion, http.StatusForbidden, "Invalid Host") + return + } + + handler.ServeHTTP(w, r) + }) +} + +// OriginRefererCheck checks the Origin header if present, falling back on Referer. +// The Origin or Referer hostname must match the configured host. +// If neither are present, the request is allowed. All major browsers will set +// at least one of these values. If neither are set, assume it is a request +// from curl/wget. +func OriginRefererCheck(host string, hostWhitelist []string, handler http.Handler) http.Handler { + return originRefererCheck(apiVersion1, host, hostWhitelist, handler) +} + +func originRefererCheck(apiVersion, host string, hostWhitelist []string, handler http.Handler) http.Handler { + hostWhitelistMap := make(map[string]struct{}, len(hostWhitelist)+2) + for _, k := range hostWhitelist { + hostWhitelistMap[k] = struct{}{} + } + + if addr, port, _ := iputil.SplitAddr(host); iputil.IsLocalhost(addr) { //nolint:errcheck + hostWhitelistMap[fmt.Sprintf("127.0.0.1:%d", port)] = struct{}{} + hostWhitelistMap[fmt.Sprintf("localhost:%d", port)] = struct{}{} + } else { + hostWhitelistMap[host] = struct{}{} + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + origin := r.Header.Get("Origin") + referer := r.Header.Get("Referer") + toCheck := origin + toCheckHeader := "Origin" + if toCheck == "" { + toCheck = referer + toCheckHeader = "Referer" + } + + if toCheck != "" { + u, err := url.Parse(toCheck) + if err != nil { + logger.Critical().Errorf("Invalid URL in %s header: %s %v", toCheckHeader, toCheck, err) + writeError(w, apiVersion, http.StatusForbidden, "Invalid URL in Origin or Referer header") + return + } + + if _, isWhitelisted := hostWhitelistMap[u.Host]; !isWhitelisted { + logger.Critical().Errorf("%s header value %s does not match host and is not whitelisted", toCheckHeader, toCheck) + writeError(w, apiVersion, http.StatusForbidden, "Invalid Origin or Referer") + return + } + } + + handler.ServeHTTP(w, r) + }) +} + +func basicAuth(apiVersion, username, password, realm string, f http.Handler) http.HandlerFunc { + needsAuth := username != "" || password != "" + usernamePasswordHash := cipher.SumSHA256(append([]byte(username), []byte(password)...)) + authHeader := fmt.Sprintf("Basic realm=%q", realm) + + return func(w http.ResponseWriter, r *http.Request) { + user, pass, ok := r.BasicAuth() + + if needsAuth { + if !ok { + w.Header().Set("WWW-Authenticate", authHeader) + writeError(w, apiVersion, http.StatusUnauthorized, "") + return + } + + userPassHash := cipher.SumSHA256(append([]byte(user), []byte(pass)...)) + + if subtle.ConstantTimeCompare(userPassHash[:], usernamePasswordHash[:]) != 1 { + w.Header().Set("WWW-Authenticate", authHeader) + writeError(w, apiVersion, http.StatusUnauthorized, "") + return + } + } else { + // If auth is not configured but the request provides auth, reject + // This will avoid a mistake where the daemon is not configured with auth, + // but the client is, and does not realize the daemon is not configured with auth + // because all requests are accepted + if user != "" || pass != "" { + w.Header().Set("WWW-Authenticate", authHeader) + writeError(w, apiVersion, http.StatusUnauthorized, "") + return + } + } + + f.ServeHTTP(w, r) + } +} + +func writeError(w http.ResponseWriter, apiVersion string, code int, msg string) { + switch apiVersion { + case apiVersion1: + wh.ErrorXXX(w, code, msg) + case apiVersion2: + writeHTTPResponse(w, NewHTTPErrorResponse(code, msg)) + default: + wh.Error500(w, "Invalid internal API version") + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/network.go b/vendor/github.com/skycoin/skycoin/src/api/network.go new file mode 100644 index 0000000000..c586e485c3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/network.go @@ -0,0 +1,231 @@ +package api + +// APIs for network-related information + +import ( + "fmt" + "net/http" + "sort" + "strconv" + "strings" + + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/readable" + wh "github.com/skycoin/skycoin/src/util/http" +) + +// connectionHandler returns a specific connection +// URI: /api/v1/network/connections +// Method: GET +// Args: +// +// addr - An IP:Port string +func connectionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr := r.FormValue("addr") + if addr == "" { + wh.Error400(w, "addr is required") + return + } + + c, err := gateway.GetConnection(addr) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if c == nil { + wh.Error404(w, "") + return + } + + wh.SendJSONOr500(logger, w, readable.NewConnection(c)) + } +} + +// Connections wraps []Connection +type Connections struct { + Connections []readable.Connection `json:"connections"` +} + +// NewConnections copies []daemon.Connection to a struct with json tags +func NewConnections(dconns []daemon.Connection) Connections { + conns := make([]readable.Connection, len(dconns)) + for i, dc := range dconns { + conns[i] = readable.NewConnection(&dc) + } + + return Connections{ + Connections: conns, + } +} + +// connectionsHandler returns all outgoing connections +// URI: /api/v1/network/connections +// Method: GET +// Args: +// +// states: [optional] comma-separated list of connection states ("pending", "connected" or "introduced"). Defaults to "connected,introduced" +// direction: [optional] "outgoing" or "incoming". If not provided, both are included. +func connectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + formStates := r.FormValue("states") + statesMap := make(map[daemon.ConnectionState]struct{}, 3) + if formStates != "" { + states := strings.Split(formStates, ",") + for _, s := range states { + switch daemon.ConnectionState(s) { + case daemon.ConnectionStatePending, + daemon.ConnectionStateConnected, + daemon.ConnectionStateIntroduced: + statesMap[daemon.ConnectionState(s)] = struct{}{} + default: + wh.Error400(w, fmt.Sprintf("Invalid state in states. Valid states are %q, %q or %q", daemon.ConnectionStatePending, daemon.ConnectionStateConnected, daemon.ConnectionStateIntroduced)) + return + } + } + } + + // "connected" and "introduced" are the defaults, if not specified + if len(statesMap) == 0 { + statesMap[daemon.ConnectionStateConnected] = struct{}{} + statesMap[daemon.ConnectionStateIntroduced] = struct{}{} + } + + direction := r.FormValue("direction") + switch direction { + case "incoming", "outgoing", "": + default: + wh.Error400(w, "Invalid direction. Valid directions are \"outgoing\" or \"incoming\"") + return + } + + conns, err := gateway.GetConnections(func(c daemon.Connection) bool { + switch direction { + case "outgoing": + if !c.Outgoing { + return false + } + case "incoming": + if c.Outgoing { + return false + } + } + + if _, ok := statesMap[c.State]; !ok { + return false + } + + return true + }) + + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, NewConnections(conns)) + } +} + +// defaultConnectionsHandler returns the list of default hardcoded bootstrap addresses. +// They are not necessarily connected to. +// URI: /api/v1/network/defaultConnections +// Method: GET +func defaultConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetDefaultConnections() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +// trustConnectionsHandler returns all trusted connections +// In the default configuration, these will be a subset of the default hardcoded bootstrap addresses +// URI: /api/v1/network/trust +// Method: GET +func trustConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetTrustConnections() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +// exchgConnectionsHandler returns all connections found through peer exchange +// URI: /api/v1/network/exchange +// Method: GET +func exchgConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetExchgConnection() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +// disconnectHandler disconnects a connection by ID or address +// URI: /api/v1/network/connection/disconnect +// Method: POST +// Args: +// +// id: ID of the connection +func disconnectHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + formID := r.FormValue("id") + if formID == "" { + wh.Error400(w, "id is required") + return + } + + id, err := strconv.ParseUint(formID, 10, 64) + if err != nil || id == 0 { // gnet IDs are non-zero + wh.Error400(w, "invalid id") + return + } + + if err := gateway.DisconnectByGnetID(uint64(id)); err != nil { + switch err { + case daemon.ErrConnectionNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, struct{}{}) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/outputs.go b/vendor/github.com/skycoin/skycoin/src/api/outputs.go new file mode 100644 index 0000000000..906829b0d6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/outputs.go @@ -0,0 +1,79 @@ +package api + +import ( + "fmt" + "net/http" + + "github.com/skycoin/skycoin/src/readable" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/visor" +) + +// outputsHandler returns UxOuts filtered by a set of addresses or a set of hashes +// URI: /api/v1/outputs +// Method: GET, POST +// Args: +// +// addrs: comma-separated list of addresses +// hashes: comma-separated list of uxout hashes +// +// If neither addrs nor hashes are specificed, return all unspent outputs. +// If only one filter is specified, then return outputs match the filter. +// Both filters cannot be specified. +func outputsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + addrStr := r.FormValue("addrs") + hashStr := r.FormValue("hashes") + + if addrStr != "" && hashStr != "" { + wh.Error400(w, "addrs and hashes cannot be specified together") + return + } + + var filters []visor.OutputsFilter + + if addrStr != "" { + addrs, err := parseAddressesFromStr(addrStr) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if len(addrs) > 0 { + filters = append(filters, visor.FbyAddresses(addrs)) + } + } + + if hashStr != "" { + hashes, err := parseHashesFromStr(hashStr) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if len(hashes) > 0 { + filters = append(filters, visor.FbyHashes(hashes)) + } + } + + summary, err := gateway.GetUnspentOutputsSummary(filters) + if err != nil { + err = fmt.Errorf("gateway.GetUnspentOutputsSummary failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + rSummary, err := readable.NewUnspentOutputsSummary(summary) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rSummary) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/spend.go b/vendor/github.com/skycoin/skycoin/src/api/spend.go new file mode 100644 index 0000000000..3fd3a2ae84 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/spend.go @@ -0,0 +1,748 @@ +package api + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "strconv" + + "github.com/shopspring/decimal" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/transaction" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/fee" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/util/mathutil" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/wallet" +) + +// CreateTransactionResponse is returned by /wallet/transaction +type CreateTransactionResponse struct { + Transaction CreatedTransaction `json:"transaction"` + EncodedTransaction string `json:"encoded_transaction"` +} + +// NewCreateTransactionResponse creates a CreateTransactionResponse +func NewCreateTransactionResponse(txn *coin.Transaction, inputs []visor.TransactionInput) (*CreateTransactionResponse, error) { + cTxn, err := NewCreatedTransaction(txn, inputs) + if err != nil { + return nil, err + } + + txnHex, err := txn.SerializeHex() + if err != nil { + return nil, err + } + + return &CreateTransactionResponse{ + Transaction: *cTxn, + EncodedTransaction: txnHex, + }, nil +} + +// CreatedTransaction represents a transaction created by /wallet/transaction +type CreatedTransaction struct { + Length uint32 `json:"length"` + Type uint8 `json:"type"` + TxID string `json:"txid"` + InnerHash string `json:"inner_hash"` + Fee string `json:"fee"` + + Sigs []string `json:"sigs"` + In []CreatedTransactionInput `json:"inputs"` + Out []CreatedTransactionOutput `json:"outputs"` +} + +// NewCreatedTransaction returns a CreatedTransaction +func NewCreatedTransaction(txn *coin.Transaction, inputs []visor.TransactionInput) (*CreatedTransaction, error) { + if len(txn.In) != len(inputs) { + return nil, errors.New("len(txn.In) != len(inputs)") + } + + var outputHours uint64 + for _, o := range txn.Out { + var err error + outputHours, err = mathutil.AddUint64(outputHours, o.Hours) + if err != nil { + return nil, err + } + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = mathutil.AddUint64(inputHours, i.CalculatedHours) + if err != nil { + return nil, err + } + } + + if inputHours < outputHours { + return nil, errors.New("inputHours unexpectedly less than output hours") + } + + fee := inputHours - outputHours + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + txID := txn.Hash() + out := make([]CreatedTransactionOutput, len(txn.Out)) + for i, o := range txn.Out { + co, err := NewCreatedTransactionOutput(o, txID) + if err != nil { + return nil, err + } + out[i] = *co + } + + in := make([]CreatedTransactionInput, len(inputs)) + for i, o := range inputs { + ci, err := NewCreatedTransactionInput(o) + if err != nil { + return nil, err + } + in[i] = *ci + } + + return &CreatedTransaction{ + Length: txn.Length, + Type: txn.Type, + TxID: txID.Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fmt.Sprint(fee), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} + +// ToTransaction converts a CreatedTransaction back to a coin.Transaction +func (r *CreatedTransaction) ToTransaction() (*coin.Transaction, error) { + t := coin.Transaction{} + + t.Length = r.Length + t.Type = r.Type + + var err error + t.InnerHash, err = cipher.SHA256FromHex(r.InnerHash) + if err != nil { + return nil, err + } + + sigs := make([]cipher.Sig, len(r.Sigs)) + for i, s := range r.Sigs { + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return nil, err + } + } + + t.Sigs = sigs + + in := make([]cipher.SHA256, len(r.In)) + for i, n := range r.In { + in[i], err = cipher.SHA256FromHex(n.UxID) + if err != nil { + return nil, err + } + } + + t.In = in + + out := make([]coin.TransactionOutput, len(r.Out)) + for i, o := range r.Out { + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return nil, err + } + + coins, err := droplet.FromString(o.Coins) + if err != nil { + return nil, err + } + + hours, err := strconv.ParseUint(o.Hours, 10, 64) + if err != nil { + return nil, err + } + + out[i] = coin.TransactionOutput{ + Address: addr, + Coins: coins, + Hours: hours, + } + } + + t.Out = out + + hash, err := cipher.SHA256FromHex(r.TxID) + if err != nil { + return nil, err + } + + if t.Hash() != hash { + return nil, fmt.Errorf("readable.Transaction.Hash %s does not match parsed transaction hash %s", t.Hash().Hex(), hash.Hex()) + } + + return &t, nil +} + +// CreatedTransactionOutput is a transaction output +type CreatedTransactionOutput struct { + UxID string `json:"uxid"` + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours"` +} + +// NewCreatedTransactionOutput creates CreatedTransactionOutput +func NewCreatedTransactionOutput(out coin.TransactionOutput, txid cipher.SHA256) (*CreatedTransactionOutput, error) { + coins, err := droplet.ToString(out.Coins) + if err != nil { + return nil, err + } + + return &CreatedTransactionOutput{ + UxID: out.UxID(txid).Hex(), + Address: out.Address.String(), + Coins: coins, + Hours: fmt.Sprint(out.Hours), + }, nil +} + +// CreatedTransactionInput is a verbose transaction input +type CreatedTransactionInput struct { + UxID string `json:"uxid"` + Address string `json:"address,omitempty"` + Coins string `json:"coins,omitempty"` + Hours string `json:"hours,omitempty"` + CalculatedHours string `json:"calculated_hours,omitempty"` + Time uint64 `json:"timestamp,omitempty"` + Block uint64 `json:"block,omitempty"` + TxID string `json:"txid,omitempty"` +} + +// NewCreatedTransactionInput creates CreatedTransactionInput +func NewCreatedTransactionInput(out visor.TransactionInput) (*CreatedTransactionInput, error) { + coins, err := droplet.ToString(out.UxOut.Body.Coins) + if err != nil { + return nil, err + } + + if out.UxOut.Body.SrcTransaction.Null() { + return nil, errors.New("NewCreatedTransactionInput UxOut.SrcTransaction is not initialized") + } + + addr := out.UxOut.Body.Address.String() + hours := fmt.Sprint(out.UxOut.Body.Hours) + calculatedHours := fmt.Sprint(out.CalculatedHours) + txID := out.UxOut.Body.SrcTransaction.Hex() + + return &CreatedTransactionInput{ + UxID: out.UxOut.Hash().Hex(), + Address: addr, + Coins: coins, + Hours: hours, + CalculatedHours: calculatedHours, + Time: out.UxOut.Head.Time, + Block: out.UxOut.Head.BkSeq, + TxID: txID, + }, nil +} + +// createTransactionRequest is sent to POST /api/v2/transaction +type createTransactionRequest struct { + IgnoreUnconfirmed bool `json:"ignore_unconfirmed"` + HoursSelection hoursSelection `json:"hours_selection"` + ChangeAddress *wh.Address `json:"change_address,omitempty"` + To []receiver `json:"to"` + UxOuts []wh.SHA256 `json:"unspents,omitempty"` + Addresses []wh.Address `json:"addresses,omitempty"` +} + +// hoursSelection defines options for hours distribution +type hoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor *decimal.Decimal `json:"share_factor,omitempty"` +} + +// receiver specifies a spend destination +type receiver struct { + Address wh.Address `json:"address"` + Coins wh.Coins `json:"coins"` + Hours *wh.Hours `json:"hours,omitempty"` +} + +// Validate validates createTransactionRequest data +func (r createTransactionRequest) Validate() error { + if r.ChangeAddress != nil && r.ChangeAddress.Null() { + return errors.New("change_address must not be the null address") + } + + switch r.HoursSelection.Type { + case transaction.HoursSelectionTypeAuto: + for i, to := range r.To { + if to.Hours != nil { + return fmt.Errorf("to[%d].hours must not be specified for auto hours_selection.mode", i) + } + } + + switch r.HoursSelection.Mode { + case transaction.HoursSelectionModeShare: + case "": + return errors.New("missing hours_selection.mode") + default: + return errors.New("invalid hours_selection.mode") + } + + case transaction.HoursSelectionTypeManual: + for i, to := range r.To { + if to.Hours == nil { + return fmt.Errorf("to[%d].hours must be specified for manual hours_selection.mode", i) + } + } + + if r.HoursSelection.Mode != "" { + return errors.New("hours_selection.mode cannot be used for manual hours_selection.type") + } + + case "": + return errors.New("missing hours_selection.type") + default: + return errors.New("invalid hours_selection.type") + } + + if r.HoursSelection.ShareFactor == nil { + if r.HoursSelection.Mode == transaction.HoursSelectionModeShare { + return errors.New("missing hours_selection.share_factor when hours_selection.mode is share") + } + } else { + if r.HoursSelection.Mode != transaction.HoursSelectionModeShare { + return errors.New("hours_selection.share_factor can only be used when hours_selection.mode is share") + } + + switch { + case r.HoursSelection.ShareFactor.LessThan(decimal.New(0, 0)): + return errors.New("hours_selection.share_factor cannot be negative") + case r.HoursSelection.ShareFactor.GreaterThan(decimal.New(1, 0)): + return errors.New("hours_selection.share_factor cannot be more than 1") + } + } + + if len(r.UxOuts) != 0 && len(r.Addresses) != 0 { + return errors.New("unspents and addresses cannot be combined") + } + + addressMap := make(map[cipher.Address]struct{}, len(r.Addresses)) + for i, a := range r.Addresses { + if a.Null() { + return fmt.Errorf("addresses[%d] is empty", i) + } + + if _, ok := addressMap[a.Address]; ok { + return errors.New("addresses contains duplicate values") + } + + addressMap[a.Address] = struct{}{} + } + + // Check for duplicate spending uxouts + uxouts := make(map[cipher.SHA256]struct{}, len(r.UxOuts)) + for _, o := range r.UxOuts { + if _, ok := uxouts[o.SHA256]; ok { + return errors.New("unspents contains duplicate values") + } + + uxouts[o.SHA256] = struct{}{} + } + + if len(r.To) == 0 { + return errors.New("to is empty") + } + + for i, to := range r.To { + if to.Address.Null() { + return fmt.Errorf("to[%d].address is empty", i) + } + + if to.Coins == 0 { + return fmt.Errorf("to[%d].coins must not be zero", i) + } + + if to.Coins.Value()%params.UserVerifyTxn.MaxDropletDivisor() != 0 { + return fmt.Errorf("to[%d].coins has too many decimal places", i) + } + } + + // Check for duplicate created outputs, a transaction can't have outputs with + // the same (address, coins, hours) + // Auto mode would distribute hours to the outputs and could hypothetically + // avoid assigning duplicate hours in many cases, but the complexity for doing + // so is very high, so also reject duplicate (address, coins) for auto mode. + outputs := make(map[coin.TransactionOutput]struct{}, len(r.To)) + for _, to := range r.To { + var hours uint64 + if to.Hours != nil { + hours = to.Hours.Value() + } + + txo := coin.TransactionOutput{ + Address: to.Address.Address, + Coins: to.Coins.Value(), + Hours: hours, + } + + if _, ok := outputs[txo]; ok { + return errors.New("to contains duplicate values") + } + + outputs[txo] = struct{}{} + } + + return nil +} + +// TransactionParams converts createTransactionRequest to transaction.Params +func (r createTransactionRequest) TransactionParams() transaction.Params { + to := make([]coin.TransactionOutput, len(r.To)) + for i, t := range r.To { + var hours uint64 + if t.Hours != nil { + hours = t.Hours.Value() + } + + to[i] = coin.TransactionOutput{ + Address: t.Address.Address, + Coins: t.Coins.Value(), + Hours: hours, + } + } + + var changeAddress *cipher.Address + if r.ChangeAddress != nil { + changeAddress = &r.ChangeAddress.Address + } + + return transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: r.HoursSelection.Type, + Mode: r.HoursSelection.Mode, + ShareFactor: r.HoursSelection.ShareFactor, + }, + ChangeAddress: changeAddress, + To: to, + } +} + +func (r createTransactionRequest) VisorParams() visor.CreateTransactionParams { + return visor.CreateTransactionParams{ + IgnoreUnconfirmed: r.IgnoreUnconfirmed, + Addresses: r.addresses(), + UxOuts: r.uxOuts(), + } +} + +func (r createTransactionRequest) addresses() []cipher.Address { + if len(r.Addresses) == 0 { + return nil + } + addresses := make([]cipher.Address, len(r.Addresses)) + for i, a := range r.Addresses { + addresses[i] = a.Address + } + return addresses +} + +func (r createTransactionRequest) uxOuts() []cipher.SHA256 { + if len(r.UxOuts) == 0 { + return nil + } + uxouts := make([]cipher.SHA256, len(r.UxOuts)) + for i, o := range r.UxOuts { + uxouts[i] = o.SHA256 + } + return uxouts +} + +// transactionHandlerV2 creates a transaction from provided outputs and parameters +// Method: POST +// URI: /api/v2/transaction +// Args: JSON body +func transactionHandlerV2(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req createTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if err := req.Validate(); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + // Check that addresses or unspents are not empty + // This is not checked in Validate() because POST /api/v1/wallet/transaction + // allows both to be empty + if len(req.Addresses) == 0 && len(req.UxOuts) == 0 { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "one of addresses or unspents must not be empty") + writeHTTPResponse(w, resp) + return + } + + txn, inputs, err := gateway.CreateTransaction(req.TransactionParams(), req.VisorParams()) + if err != nil { + var resp HTTPResponse + switch err.(type) { + case blockdb.ErrUnspentNotExist, transaction.Error, visor.UserError, wallet.Error: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + default: + switch err { + case fee.ErrTxnNoFee, fee.ErrTxnInsufficientCoinHours: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + } + writeHTTPResponse(w, resp) + return + } + + txnResp, err := NewCreateTransactionResponse(txn, inputs) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, fmt.Sprintf("NewCreateTransactionResponse failed: %v", err)) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: txnResp, + }) + } +} + +// walletCreateTransactionRequest is sent to POST /api/v1/wallet/transaction +type walletCreateTransactionRequest struct { + Unsigned bool `json:"unsigned"` + WalletID string `json:"wallet_id"` + Password string `json:"password"` + createTransactionRequest +} + +// Validate validates walletCreateTransactionRequest data +func (r walletCreateTransactionRequest) Validate() error { + if r.WalletID == "" { + return errors.New("missing wallet_id") + } + + if r.Unsigned && len(r.Password) != 0 { + return errors.New("password must not be used for unsigned transactions") + } + + return r.createTransactionRequest.Validate() +} + +// walletCreateTransactionHandler creates a transaction +// Method: POST +// URI: /api/v1/wallet/transaction +// Args: JSON body +func walletCreateTransactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + if !isContentTypeJSON(r.Header.Get("Content-Type")) { + wh.Error415(w) + return + } + + var req walletCreateTransactionRequest + err := json.NewDecoder(r.Body).Decode(&req) + if err != nil { + logger.WithError(err).Error("Invalid create transaction request") + wh.Error400(w, err.Error()) + return + } + + if err := req.Validate(); err != nil { + logger.WithError(err).Error("Invalid create transaction request") + wh.Error400(w, err.Error()) + return + } + + var txn *coin.Transaction + var inputs []visor.TransactionInput + if req.Unsigned { + txn, inputs, err = gateway.WalletCreateTransaction(req.WalletID, req.TransactionParams(), req.VisorParams()) + } else { + txn, inputs, err = gateway.WalletCreateTransactionSigned(req.WalletID, []byte(req.Password), req.TransactionParams(), req.VisorParams()) + } + if err != nil { + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, err.Error()) + default: + wh.Error400(w, err.Error()) + } + case blockdb.ErrUnspentNotExist, + transaction.Error, + visor.UserError: + wh.Error400(w, err.Error()) + default: + switch err { + case fee.ErrTxnNoFee, + fee.ErrTxnInsufficientCoinHours: + wh.Error400(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + } + return + } + + txnResp, err := NewCreateTransactionResponse(txn, inputs) + if err != nil { + err = fmt.Errorf("NewCreateTransactionResponse failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txnResp) + } +} + +// WalletSignTransactionRequest is the request body object for /api/v2/wallet/transaction/sign +type WalletSignTransactionRequest struct { + WalletID string `json:"wallet_id"` + Password string `json:"password"` + EncodedTransaction string `json:"encoded_transaction"` + SignIndexes []int `json:"sign_indexes"` +} + +// walletSignTransactionHandler signs an unsigned transaction +// Method: POST +// URI: /api/v2/wallet/transaction/sign +// Args: JSON body +func walletSignTransactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req WalletSignTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.WalletID == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "wallet_id is required") + writeHTTPResponse(w, resp) + return + } + + if req.EncodedTransaction == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "encoded_transaction is required") + writeHTTPResponse(w, resp) + return + } + + txn, err := decodeTxn(req.EncodedTransaction) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, fmt.Sprintf("Decode transaction failed: %v", err)) + writeHTTPResponse(w, resp) + return + } + + // Check that number of sign_indexes does not exceed number of inputs + if len(req.SignIndexes) > len(txn.In) { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "Too many values in sign_indexes") + writeHTTPResponse(w, resp) + return + } + + // Check that values in sign_indexes are in the range of txn inputs + for _, i := range req.SignIndexes { + if i < 0 || i >= len(txn.In) { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "Value in sign_indexes exceeds range of transaction inputs array") + writeHTTPResponse(w, resp) + return + } + } + + // Check for duplicate values in sign_indexes + signIndexesMap := make(map[int]struct{}, len(req.SignIndexes)) + for _, i := range req.SignIndexes { + if _, ok := signIndexesMap[i]; ok { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "Duplicate value in sign_indexes") + writeHTTPResponse(w, resp) + return + } + signIndexesMap[i] = struct{}{} + } + + signedTxn, inputs, err := gateway.WalletSignTransaction(req.WalletID, []byte(req.Password), txn, req.SignIndexes) + if err != nil { + var resp HTTPResponse + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletNotExist: + resp = NewHTTPErrorResponse(http.StatusNotFound, err.Error()) + case wallet.ErrWalletAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, err.Error()) + default: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + } + case transaction.ErrTxnViolatesSoftConstraint, + transaction.ErrTxnViolatesHardConstraint, + transaction.ErrTxnViolatesUserConstraint, + blockdb.ErrUnspentNotExist: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + txnResp, err := NewCreateTransactionResponse(signedTxn, inputs) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: txnResp, + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/storage.go b/vendor/github.com/skycoin/skycoin/src/api/storage.go new file mode 100644 index 0000000000..768fd38293 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/storage.go @@ -0,0 +1,194 @@ +package api + +import ( + "encoding/json" + "net/http" + + "github.com/skycoin/skycoin/src/kvstorage" +) + +// Dispatches /data endpoint. +// Method: GET, POST, DELETE +// URI: /api/v2/data +func storageHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodGet: + getStorageValuesHandler(w, r, gateway) + case http.MethodPost: + addStorageValueHandler(w, r, gateway) + case http.MethodDelete: + removeStorageValueHandler(w, r, gateway) + default: + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + } + } +} + +// serves GET requests for /data enpdoint +func getStorageValuesHandler(w http.ResponseWriter, r *http.Request, gateway Gatewayer) { + storageType := r.FormValue("type") + if storageType == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "type is required") + writeHTTPResponse(w, resp) + return + } + + key := r.FormValue("key") + + if key == "" { + getAllStorageValuesHandler(w, gateway, kvstorage.Type(storageType)) + } else { + getStorageValueHandler(w, gateway, kvstorage.Type(storageType), key) + } +} + +// Returns all existing storage values of a given storage type. +// Args: +// +// type: storage type to get values from +func getAllStorageValuesHandler(w http.ResponseWriter, gateway Gatewayer, storageType kvstorage.Type) { + data, err := gateway.GetAllStorageValues(kvstorage.Type(storageType)) + if err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: data, + }) +} + +// Returns value from storage of a given type by key. +// Args: +// +// key: key for a value to be retrieved +func getStorageValueHandler(w http.ResponseWriter, gateway Gatewayer, storageType kvstorage.Type, key string) { + val, err := gateway.GetStorageValue(storageType, key) + if err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + case kvstorage.ErrNoSuchKey: + resp = NewHTTPErrorResponse(http.StatusNotFound, "") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: val, + }) +} + +// StorageRequest is the request data for POST /api/v2/data +type StorageRequest struct { + StorageType kvstorage.Type `json:"type"` + Key string `json:"key"` + Val string `json:"val"` +} + +// Adds the value to the storage of a given type +// Args: +// +// type: storage type +// key: key +// val: value +func addStorageValueHandler(w http.ResponseWriter, r *http.Request, gateway Gatewayer) { + var req StorageRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.StorageType == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "type is required") + writeHTTPResponse(w, resp) + return + } + + if req.Key == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "key is required") + writeHTTPResponse(w, resp) + return + } + + if err := gateway.AddStorageValue(req.StorageType, req.Key, req.Val); err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{}) +} + +// Removes the value by key from the storage of a given type +// Args: +// +// type: storage type +// key: key +func removeStorageValueHandler(w http.ResponseWriter, r *http.Request, gateway Gatewayer) { + storageType := r.FormValue("type") + if storageType == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "type is required") + writeHTTPResponse(w, resp) + return + } + + key := r.FormValue("key") + if key == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "key is required") + writeHTTPResponse(w, resp) + return + } + + if err := gateway.RemoveStorageValue(kvstorage.Type(storageType), key); err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + case kvstorage.ErrNoSuchKey: + resp = NewHTTPErrorResponse(http.StatusNotFound, "") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{}) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/transaction.go b/vendor/github.com/skycoin/skycoin/src/api/transaction.go new file mode 100644 index 0000000000..be2df88c66 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/transaction.go @@ -0,0 +1,857 @@ +package api + +import ( + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "net/http" + "sort" + "strconv" + "strings" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/readable" + "github.com/skycoin/skycoin/src/transaction" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/util/mathutil" + "github.com/skycoin/skycoin/src/visor" +) + +// pendingTxnsHandler returns pending (unconfirmed) transactions +// Method: GET +// URI: /api/v1/pendingTxs +// Args: +// +// verbose: [bool] include verbose transaction input data +func pendingTxnsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + if verbose { + txns, inputs, err := gateway.GetAllUnconfirmedTransactionsVerbose() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + vb, err := readable.NewUnconfirmedTransactionsVerbose(txns, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, vb) + } else { + txns, err := gateway.GetAllUnconfirmedTransactions() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + ret, err := readable.NewUnconfirmedTransactions(txns) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, ret) + } + } +} + +// TransactionEncodedResponse represents the data struct of the response to /api/v1/transaction?encoded=1 +type TransactionEncodedResponse struct { + Status readable.TransactionStatus `json:"status"` + Time uint64 `json:"time"` + EncodedTransaction string `json:"encoded_transaction"` +} + +// transactionHandler returns a transaction identified by its txid hash +// Method: GET +// URI: /api/v1/transaction +// Args: +// +// txid: transaction hash +// verbose: [bool] include verbose transaction input data +// encoded: [bool] return as a raw encoded transaction +func transactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + txid := r.FormValue("txid") + if txid == "" { + wh.Error400(w, "txid is empty") + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + encoded, err := parseBoolFlag(r.FormValue("encoded")) + if err != nil { + wh.Error400(w, "Invalid value for encoded") + return + } + + if verbose && encoded { + wh.Error400(w, "verbose and encoded cannot be combined") + return + } + + h, err := cipher.SHA256FromHex(txid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if verbose { + txn, inputs, err := gateway.GetTransactionWithInputs(h) + if err != nil { + wh.Error500(w, err.Error()) + return + } + if txn == nil { + wh.Error404(w, "") + return + } + + rTxn, err := readable.NewTransactionWithStatusVerbose(txn, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rTxn) + return + } + + txn, err := gateway.GetTransaction(h) + if err != nil { + wh.Error500(w, err.Error()) + return + } + if txn == nil { + wh.Error404(w, "") + return + } + + if encoded { + txnHex, err := txn.Transaction.SerializeHex() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, TransactionEncodedResponse{ + EncodedTransaction: txnHex, + Status: readable.NewTransactionStatus(txn.Status), + Time: txn.Time, + }) + return + } + + rTxn, err := readable.NewTransactionWithStatus(txn) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rTxn) + } +} + +// TransactionsWithStatus array of transaction results +type TransactionsWithStatus struct { + Transactions []readable.TransactionWithStatus `json:"txns"` +} + +// Sort sorts transactions chronologically, using txid for tiebreaking +func (r TransactionsWithStatus) Sort() { + sort.Slice(r.Transactions, func(i, j int) bool { + a := r.Transactions[i] + b := r.Transactions[j] + + if a.Time == b.Time { + return strings.Compare(a.Transaction.Hash, b.Transaction.Hash) < 0 + } + + return a.Time < b.Time + }) +} + +// NewTransactionsWithStatus converts []Transaction to TransactionsWithStatus +func NewTransactionsWithStatus(txns []visor.Transaction) (*TransactionsWithStatus, error) { + txnRlts := make([]readable.TransactionWithStatus, 0, len(txns)) + for _, txn := range txns { + rTxn, err := readable.NewTransactionWithStatus(&txn) + if err != nil { + return nil, err + } + txnRlts = append(txnRlts, *rTxn) + } + + return &TransactionsWithStatus{ + Transactions: txnRlts, + }, nil +} + +// TransactionsWithStatusVerbose array of transaction results +type TransactionsWithStatusVerbose struct { + Transactions []readable.TransactionWithStatusVerbose `json:"txns"` +} + +// Sort sorts transactions chronologically, using txid for tiebreaking +func (r TransactionsWithStatusVerbose) Sort() { + sort.Slice(r.Transactions, func(i, j int) bool { + a := r.Transactions[i] + b := r.Transactions[j] + + if a.Time == b.Time { + return strings.Compare(a.Transaction.Hash, b.Transaction.Hash) < 0 + } + + return a.Time < b.Time + }) +} + +// NewTransactionsWithStatusVerbose converts []Transaction to []TransactionsWithStatusVerbose +func NewTransactionsWithStatusVerbose(txns []visor.Transaction, inputs [][]visor.TransactionInput) (*TransactionsWithStatusVerbose, error) { + if len(txns) != len(inputs) { + return nil, errors.New("NewTransactionsWithStatusVerbose: len(txns) != len(inputs)") + } + + txnRlts := make([]readable.TransactionWithStatusVerbose, len(txns)) + for i, txn := range txns { + rTxn, err := readable.NewTransactionWithStatusVerbose(&txn, inputs[i]) + if err != nil { + return nil, err + } + txnRlts[i] = *rTxn + } + + return &TransactionsWithStatusVerbose{ + Transactions: txnRlts, + }, nil +} + +// Returns transactions that match the filters. +// Method: GET, POST +// URI: /api/v1/transactions +// Args: +// +// addrs: Comma separated addresses [optional, returns all transactions if no address provided] +// confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] +// verbose: [bool] include verbose transaction input data +func transactionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + // Gets 'addrs' parameter value + addrs, err := parseAddressesFromStr(r.FormValue("addrs")) + if err != nil { + wh.Error400(w, fmt.Sprintf("parse parameter: 'addrs' failed: %v", err)) + return + } + + // Initialize transaction filters + flts := []visor.TxFilter{visor.NewAddrsFilter(addrs)} + + // Gets the 'confirmed' parameter value + confirmedStr := r.FormValue("confirmed") + if confirmedStr != "" { + confirmed, err := strconv.ParseBool(confirmedStr) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid 'confirmed' value: %v", err)) + return + } + + flts = append(flts, visor.NewConfirmedTxFilter(confirmed)) + } + + if verbose { + txns, inputs, _, err := gateway.GetTransactionsWithInputs(flts, visor.AscOrder, nil) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns, err := NewTransactionsWithStatusVerbose(txns, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns.Sort() + + wh.SendJSONOr500(logger, w, rTxns.Transactions) + } else { + txns, _, err := gateway.GetTransactions(flts, visor.AscOrder, nil) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns, err := NewTransactionsWithStatus(txns) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns.Sort() + + wh.SendJSONOr500(logger, w, rTxns.Transactions) + } + } +} + +// Returns total transactions number +// Method: GET +// URI: /api/v1/transactions/num +func transactionsNumHandler(gateway Gatewayer) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + writeError405Response(w) + return + } + num, err := gateway.GetTransactionsNum() + if err != nil { + writeError500Response(w, err.Error()) + return + } + + var rsp = struct { + TxnsTotalNum uint64 `json:"txns_num"` + }{ + num, + } + + wh.SendJSONOr500(logger, w, rsp) + }) +} + +// Returns transactions that match the filters. +// Method: GET +// URI: /api/v2/transactions +// Args: +// +// addrs: Comma separated addresses [optional, returns all transactions if no address provided] +// confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] +// verbose: [bool] include verbose transaction input data +// page: Page number +// limit: the number of transactions per page [optional, default to 10, must be <= 100] +// sort: Sort the transactions by block seq. [optional, must be desc or asc]; if not provided, return +// in asc order. +func transactionsHandlerV2(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + writeError405Response(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + writeError400Response(w, "invalid value for verbose") + return + } + + // Gets 'addrs' parameter value + addrs, err := parseAddressesFromStr(r.FormValue("addrs")) + if err != nil { + writeError400Response(w, fmt.Sprintf("parse parameter: 'addrs' failed: %v", err)) + return + } + + // Initialize transaction filters + var flts []visor.TxFilter + if len(addrs) > 0 { + flts = append(flts, visor.NewAddrsFilter(addrs)) + } + + // Gets the 'confirmed' parameter value + confirmedStr := r.FormValue("confirmed") + if confirmedStr != "" { + confirmed, err := strconv.ParseBool(confirmedStr) + if err != nil { + writeError400Response(w, fmt.Sprintf("invalid 'confirmed' value: %v", err)) + return + } + + flts = append(flts, visor.NewConfirmedTxFilter(confirmed)) + } + + order, err := parseSortOrderFromStr(r.FormValue("sort")) + if err != nil { + writeError400Response(w, fmt.Sprintf("invalid 'sort' value: %v", err)) + return + } + + var pageSize = visor.DefaultTxnPageSize + pageSizeStr := r.FormValue("limit") + if pageSizeStr != "" { + var err error + pageSize, err = strconv.ParseUint(pageSizeStr, 10, 64) + if err != nil { + writeError400Response(w, fmt.Sprintf("invalid 'limit' value: %v", err)) + return + } + } + + var pageIndex *visor.PageIndex + var currentPage = uint64(1) + pageStr := r.FormValue("page") + if pageStr != "" { + currentPage, err = strconv.ParseUint(pageStr, 10, 64) + if err != nil { + writeError400Response(w, fmt.Sprintf("invalid 'page' value: %v", err)) + return + } + } + + pageIndex, err = visor.NewPageIndex(pageSize, currentPage) + if err != nil { + writeError400Response(w, err.Error()) + return + } + + var resp HTTPResponse + if verbose { + txns, inputs, pages, err := gateway.GetTransactionsWithInputs(flts, order, pageIndex) + if err != nil { + writeError500Response(w, err.Error()) + return + } + + rTxns, err := NewTransactionsWithStatusVerbose(txns, inputs) + if err != nil { + writeError500Response(w, err.Error()) + return + } + + resp.Data = struct { + PageInfo readable.PageInfo `json:"page_info"` + Txns []readable.TransactionWithStatusVerbose `json:"txns"` + }{ + PageInfo: readable.PageInfo{ + TotalPages: pages, + PageSize: pageSize, + CurrentPage: currentPage, + }, + Txns: rTxns.Transactions, + } + writeHTTPResponse(w, resp) + } else { + txns, pages, err := gateway.GetTransactions(flts, order, pageIndex) + if err != nil { + writeError500Response(w, err.Error()) + return + } + + rTxns, err := NewTransactionsWithStatus(txns) + if err != nil { + writeError500Response(w, err.Error()) + return + } + + resp.Data = struct { + PageInfo readable.PageInfo `json:"page_info"` + Txns []readable.TransactionWithStatus `json:"txns"` + }{ + PageInfo: readable.PageInfo{ + TotalPages: pages, + PageSize: pageSize, + CurrentPage: currentPage, + }, + Txns: rTxns.Transactions, + } + writeHTTPResponse(w, resp) + } + } +} + +// InjectTransactionRequest is sent to POST /api/v1/injectTransaction +type InjectTransactionRequest struct { + RawTxn string `json:"rawtx"` + NoBroadcast bool `json:"no_broadcast,omitempty"` +} + +// URI: /api/v1/injectTransaction +// Method: POST +// Content-Type: application/json +// Body: {"rawtx": ""} +// Response: +// +// 200 - ok, returns the transaction hash in hex as string +// 400 - bad transaction +// 500 - other error +// 503 - network unavailable for broadcasting transaction +func injectTransactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + var v InjectTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&v); err != nil { + wh.Error400(w, err.Error()) + return + } + + if v.RawTxn == "" { + wh.Error400(w, "rawtx is required") + return + } + + txn, err := coin.DeserializeTransactionHex(v.RawTxn) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if v.NoBroadcast { + if err := gateway.InjectTransaction(txn); err != nil { + switch err.(type) { + case transaction.ErrTxnViolatesUserConstraint, + transaction.ErrTxnViolatesHardConstraint, + transaction.ErrTxnViolatesSoftConstraint: + wh.Error400(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + return + } + } else { + if err := gateway.InjectBroadcastTransaction(txn); err != nil { + switch err.(type) { + case transaction.ErrTxnViolatesUserConstraint, + transaction.ErrTxnViolatesHardConstraint, + transaction.ErrTxnViolatesSoftConstraint: + wh.Error400(w, err.Error()) + default: + if daemon.IsBroadcastFailure(err) { + wh.Error503(w, err.Error()) + } else { + wh.Error500(w, err.Error()) + } + } + return + } + } + + wh.SendJSONOr500(logger, w, txn.Hash().Hex()) + } +} + +// ResendResult the result of rebroadcasting transaction +type ResendResult struct { + Txids []string `json:"txids"` +} + +// NewResendResult creates a ResendResult from a list of transaction ID hashes +func NewResendResult(hashes []cipher.SHA256) ResendResult { + txids := make([]string, len(hashes)) + for i, h := range hashes { + txids[i] = h.Hex() + } + return ResendResult{ + Txids: txids, + } +} + +// URI: /api/v1/resendUnconfirmedTxns +// Method: POST +// Broadcasts all unconfirmed transactions from the unconfirmed transaction pool +// Response: +// +// 200 - ok, returns the transaction hashes that were resent +// 405 - method not POST +// 500 - other error +// 503 - network unavailable for broadcasting transaction +func resendUnconfirmedTxnsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + hashes, err := gateway.ResendUnconfirmedTxns() + if err != nil { + if daemon.IsBroadcastFailure(err) { + wh.Error503(w, err.Error()) + } else { + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, NewResendResult(hashes)) + } +} + +// URI: /api/v1/rawtx +// Method: GET +// Args: +// +// txid: transaction ID hash +// +// Returns the hex-encoded byte serialization of a transaction. +// The transaction may be confirmed or unconfirmed. +func rawTxnHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + txid := r.FormValue("txid") + if txid == "" { + wh.Error400(w, "txid is empty") + return + } + + h, err := cipher.SHA256FromHex(txid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + txn, err := gateway.GetTransaction(h) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if txn == nil { + wh.Error404(w, "") + return + } + + txnHex, err := txn.Transaction.SerializeHex() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txnHex) + } +} + +// VerifyTransactionRequest represents the data struct of the request for /api/v2/transaction/verify +type VerifyTransactionRequest struct { + Unsigned bool `json:"unsigned"` + EncodedTransaction string `json:"encoded_transaction"` +} + +// VerifyTransactionResponse the response data struct for /api/v2/transaction/verify +type VerifyTransactionResponse struct { + Unsigned bool `json:"unsigned"` + Confirmed bool `json:"confirmed"` + Transaction CreatedTransaction `json:"transaction"` +} + +// Decode and verify an encoded transaction +// Method: POST +// URI: /api/v2/transaction/verify +func verifyTxnHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifyTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.EncodedTransaction == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "encoded_transaction is required") + writeHTTPResponse(w, resp) + return + } + + txn, err := decodeTxn(req.EncodedTransaction) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, fmt.Sprintf("decode transaction failed: %v", err)) + writeHTTPResponse(w, resp) + return + } + + signed := transaction.TxnSigned + if req.Unsigned { + signed = transaction.TxnUnsigned + } + + var resp HTTPResponse + inputs, isTxnConfirmed, err := gateway.VerifyTxnVerbose(txn, signed) + if err != nil { + switch err.(type) { + case transaction.ErrTxnViolatesSoftConstraint, + transaction.ErrTxnViolatesHardConstraint, + transaction.ErrTxnViolatesUserConstraint: + resp.Error = &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: err.Error(), + } + default: + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + } + + verifyTxnResp := VerifyTransactionResponse{ + Confirmed: isTxnConfirmed, + Unsigned: !txn.IsFullySigned(), + } + + if len(inputs) != len(txn.In) { + inputs = nil + } + verboseTxn, err := newCreatedTransactionFuzzy(txn, inputs) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + + verifyTxnResp.Transaction = *verboseTxn + + resp.Data = verifyTxnResp + + if isTxnConfirmed && resp.Error == nil { + resp.Error = &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: "transaction has been spent", + } + } + + writeHTTPResponse(w, resp) + } +} + +func decodeTxn(encodedTxn string) (*coin.Transaction, error) { + var txn coin.Transaction + b, err := hex.DecodeString(encodedTxn) + if err != nil { + return nil, err + } + + txn, err = coin.DeserializeTransaction(b) + if err != nil { + return nil, err + } + + return &txn, nil +} + +// newCreatedTransactionFuzzy creates a CreatedTransaction but accommodates possibly invalid txn input +func newCreatedTransactionFuzzy(txn *coin.Transaction, inputs []visor.TransactionInput) (*CreatedTransaction, error) { + if len(txn.In) != len(inputs) && len(inputs) != 0 { + return nil, errors.New("len(txn.In) != len(inputs)") + } + + var outputHours uint64 + var feeInvalid bool + for _, o := range txn.Out { + var err error + outputHours, err = mathutil.AddUint64(outputHours, o.Hours) + if err != nil { + feeInvalid = true + } + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = mathutil.AddUint64(inputHours, i.CalculatedHours) + if err != nil { + feeInvalid = true + } + } + + if inputHours < outputHours { + feeInvalid = true + } + + var fee uint64 + if !feeInvalid { + fee = inputHours - outputHours + } + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + txID := txn.Hash() + out := make([]CreatedTransactionOutput, len(txn.Out)) + for i, o := range txn.Out { + co, err := NewCreatedTransactionOutput(o, txID) + if err != nil { + logger.WithError(err).Error("NewCreatedTransactionOutput failed") + continue + } + out[i] = *co + } + + in := make([]CreatedTransactionInput, len(txn.In)) + if len(inputs) == 0 { + for i, h := range txn.In { + in[i] = CreatedTransactionInput{ + UxID: h.Hex(), + } + } + } else { + for i, o := range inputs { + ci, err := NewCreatedTransactionInput(o) + if err != nil { + logger.WithError(err).Error("NewCreatedTransactionInput failed") + continue + } + in[i] = *ci + } + } + + return &CreatedTransaction{ + Length: txn.Length, + Type: txn.Type, + TxID: txID.Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fmt.Sprint(fee), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/uxout.go b/vendor/github.com/skycoin/skycoin/src/api/uxout.go new file mode 100644 index 0000000000..a6fd82963e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/uxout.go @@ -0,0 +1,102 @@ +package api + +import ( + "net/http" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/readable" + wh "github.com/skycoin/skycoin/src/util/http" +) + +// URI: /api/v1/uxout +// Method: GET +// Args: +// +// uxid: unspent output ID hash +// +// Returns an unspent output by ID +func uxOutHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + uxid := r.FormValue("uxid") + if uxid == "" { + wh.Error400(w, "uxid is empty") + return + } + + id, err := cipher.SHA256FromHex(uxid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + uxout, headTime, err := gateway.GetUxOutByID(id) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if uxout == nil { + wh.Error404(w, "") + return + } + + out, err := readable.NewSpentOutput(uxout, headTime) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, *out) + } +} + +// URI: /api/v1/address_uxouts +// Method: GET +// Args: +// +// address +// +// Returns the historical, spent outputs associated with an address +func addrUxOutsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr := r.FormValue("address") + if addr == "" { + wh.Error400(w, "address is empty") + return + } + + cipherAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + uxs, headTime, err := gateway.GetSpentOutputsForAddresses([]cipher.Address{cipherAddr}) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + ret := make([]readable.SpentOutput, 0) + for _, u := range uxs { + out, err := readable.NewSpentOutputs(u, headTime) + if err != nil { + wh.Error400(w, err.Error()) + return + } + ret = append(ret, out...) + } + + wh.SendJSONOr500(logger, w, ret) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/version.go b/vendor/github.com/skycoin/skycoin/src/api/version.go new file mode 100644 index 0000000000..86c2a9a0f7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/version.go @@ -0,0 +1,22 @@ +package api + +import ( + "net/http" + + "github.com/skycoin/skycoin/src/readable" + wh "github.com/skycoin/skycoin/src/util/http" +) + +// versionHandler returns the application version info +// URI: /api/v1/version +// Method: GET +func versionHandler(bi readable.BuildInfo) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wh.SendJSONOr500(logger, w, bi) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/wallet.go b/vendor/github.com/skycoin/skycoin/src/api/wallet.go new file mode 100644 index 0000000000..46321a19f4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/wallet.go @@ -0,0 +1,1191 @@ +package api + +// APIs for wallet-related information + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "sort" + "strconv" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/bip39" + "github.com/skycoin/skycoin/src/cipher/bip44" + "github.com/skycoin/skycoin/src/readable" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/wallet" +) + +// UnconfirmedTxnsResponse contains unconfirmed transaction data +type UnconfirmedTxnsResponse struct { + Transactions []readable.UnconfirmedTransactions `json:"transactions"` +} + +// UnconfirmedTxnsVerboseResponse contains verbose unconfirmed transaction data +type UnconfirmedTxnsVerboseResponse struct { + Transactions []readable.UnconfirmedTransactionVerbose `json:"transactions"` +} + +// BalanceResponse address balance summary struct +type BalanceResponse struct { + readable.BalancePair + Addresses readable.AddressBalances `json:"addresses"` +} + +// WalletResponse wallet response struct for http apis +type WalletResponse struct { + Meta readable.WalletMeta `json:"meta"` + Entries []readable.WalletEntry `json:"entries"` +} + +// NewWalletResponse creates WalletResponse struct from wallet.Wallet +func NewWalletResponse(w wallet.Wallet) (*WalletResponse, error) { + var wr WalletResponse + + wr.Meta.Coin = w.Coin() + wr.Meta.Filename = w.Filename() + wr.Meta.Label = w.Label() + wr.Meta.Type = w.Type() + wr.Meta.Version = w.Version() + wr.Meta.CryptoType = w.CryptoType() + wr.Meta.Encrypted = w.IsEncrypted() + wr.Meta.Timestamp = w.Timestamp() + wr.Meta.Temp = w.IsTemp() + + var options []wallet.Option + switch w.Type() { + case wallet.WalletTypeBip44: + bip44Coin := w.Bip44Coin() + if bip44Coin == nil { + return nil, errors.New("Wallet has no Bip44Coin meta data") + } + wr.Meta.Bip44Coin = bip44Coin + + // get entries on both external and change chains + options = append(options, wallet.OptionExternal(), wallet.OptionChange()) + case wallet.WalletTypeXPub: + wr.Meta.XPub = w.XPub() + } + + entries, err := w.GetEntries(options...) + if err != nil { + return nil, fmt.Errorf("failed to get wallet entries: %v", err) + } + wr.Entries = make([]readable.WalletEntry, len(entries)) + + for i, e := range entries { + wr.Entries[i] = readable.WalletEntry{ + Address: e.Address.String(), + Public: e.Public.Hex(), + } + + switch w.Type() { + // Copy these values to another ref to avoid having a pointer + // to an element of Entry which could affect GC of the Entry, + // which could cause retention/copying of secret data in the Entry. + // This is speculative. I don't know if this matters to the go runtime + case wallet.WalletTypeBip44: + childNumber := e.ChildNumber + wr.Entries[i].ChildNumber = &childNumber + change := e.Change + wr.Entries[i].Change = &change + case wallet.WalletTypeXPub: + childNumber := e.ChildNumber + wr.Entries[i].ChildNumber = &childNumber + } + } + + return &wr, nil +} + +// Returns the wallet's balance, both confirmed and predicted. The predicted +// balance is the confirmed balance minus the pending spends. +// URI: /api/v1/wallet/balance +// Method: GET +// Args: +// +// id: wallet id [required] +func walletBalanceHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + walletBalance, addressBalances, err := gateway.GetWalletBalance(wltID) + if err != nil { + logger.Errorf("Get wallet balance failed: id: %v, err: %v", wltID, err) + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, BalanceResponse{ + BalancePair: readable.NewBalancePair(walletBalance), + Addresses: readable.NewAddressBalances(addressBalances), + }) + } +} + +// Returns the balance of one or more addresses, both confirmed and predicted. The predicted +// balance is the confirmed balance minus the pending spends. +// URI: /api/v1s/balance +// Method: GET, POST +// Args: +// +// addrs: command separated list of addresses [required] +func balanceHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + addrsParam := r.FormValue("addrs") + addrs, err := parseAddressesFromStr(addrsParam) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if len(addrs) == 0 { + wh.Error400(w, "addrs is required") + return + } + + bals, err := gateway.GetBalanceOfAddresses(addrs) + if err != nil { + err = fmt.Errorf("gateway.GetBalanceOfAddresses failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + // create map of address to balance + addressBalances := make(readable.AddressBalances, len(addrs)) + for idx, addr := range addrs { + addressBalances[addr.String()] = readable.NewBalancePair(bals[idx]) + } + + var balance wallet.BalancePair + for _, bal := range bals { + var err error + balance.Confirmed, err = balance.Confirmed.Add(bal.Confirmed) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + balance.Predicted, err = balance.Predicted.Add(bal.Predicted) + if err != nil { + wh.Error500(w, err.Error()) + return + } + } + + wh.SendJSONOr500(logger, w, BalanceResponse{ + BalancePair: readable.NewBalancePair(balance), + Addresses: addressBalances, + }) + } +} + +// Loads wallet from seed, will scan ahead N address and +// load addresses till the last one that have coins. +// URI: /api/v1/wallet/create +// Method: POST +// Args: +// +// seed: wallet seed [required] +// seed-passphrase: wallet seed passphrase [optional, bip44 type wallet only] +// type: wallet type [required, one of "deterministic", "bip44" or "xpub"] +// bip44-coin: BIP44 coin type [optional, defaults to 8000 (skycoin's coin type), only valid if type is "bip44"] +// xpub: xpub key [required for xpub wallets] +// label: wallet label [required] +// scan: the number of addresses to scan ahead for balances [optional, must be > 0] +// encrypt: bool value, whether encrypt the wallet [optional] +// password: password for encrypting wallet [optional, must be provided if "encrypt" is set] +// private-keys: private keys for generating addresses for collection wallets.[optional, multiple keys must be joined with commas] +func walletCreateHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + walletType := r.FormValue("type") + if walletType == "" { + wh.Error400(w, "missing type") + return + } + + seed := r.FormValue("seed") + label := r.FormValue("label") + password := r.FormValue("password") + + defer func() { + password = "" + }() + + var encrypt bool + encryptStr := r.FormValue("encrypt") + if encryptStr != "" { + var err error + encrypt, err = strconv.ParseBool(encryptStr) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid encrypt value: %v", err)) + return + } + } + + if encrypt && len(password) == 0 { + wh.Error400(w, "missing password") + return + } + + if !encrypt && len(password) > 0 { + wh.Error400(w, "encrypt must be true as password is provided") + return + } + + scanNStr := r.FormValue("scan") + var scanN uint64 + if scanNStr != "" { + var err error + scanN, err = strconv.ParseUint(scanNStr, 10, 64) + if err != nil { + wh.Error400(w, "invalid scan value") + return + } + } + + var bip44Coin *bip44.CoinType + bip44CoinStr := r.FormValue("bip44-coin") + if bip44CoinStr != "" { + if walletType != wallet.WalletTypeBip44 { + wh.Error400(w, "bip44-coin is only valid for bip44 type wallets") + return + } + + bip44CoinInt, err := strconv.ParseUint(bip44CoinStr, 10, 32) + if err != nil { + wh.Error400(w, "invalid bip44-coin value") + return + } + + c := bip44.CoinType(bip44CoinInt) + bip44Coin = &c + } + + secKeys, err := wallet.ParsePrivateKeys(r.FormValue("private-keys")) + if err != nil { + wh.Error400(w, "invalid collection private keys") + return + } + defer func() { + for i := range secKeys { + secKeys[i] = cipher.SecKey{} + } + }() + + wlt, err := gateway.CreateWallet("", wallet.Options{ + Seed: seed, + Label: label, + Encrypt: encrypt, + Password: []byte(password), + ScanN: scanN, + Type: walletType, + SeedPassphrase: r.FormValue("seed-passphrase"), + Bip44Coin: bip44Coin, + XPub: r.FormValue("xpub"), + TF: gateway.TransactionsFinder(), + CollectionPrivateKeys: secKeys, + }) + if err != nil { + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + return + default: + wh.Error400(w, err.Error()) + return + } + default: + wh.Error500(w, err.Error()) + return + } + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Note: The wallet will not be saved to disk +// Loads wallet from seed temporary in memory, will scan ahead N address and +// load addresses till the last one that have coins. +// URI: /api/v1/wallet/createTemp +// Method: POST +// Args: +// +// seed: wallet seed [required] +// type: wallet type [required, one of "deterministic", "bip44" or "xpub"] +// bip44-coin: BIP44 coin type [optional, defaults to 8000 (skycoin's coin type), only valid if type is "bip44"] +// xpub: xpub key [required for xpub wallets] +// label: wallet label [required] +// scan: the number of addresses to scan ahead for balances [optional, must be > 0] +// private-keys: private keys for generating addresses for collection wallets.[optional, multiple keys must be joined with commas] +func walletCreateTempHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + walletType := r.FormValue("type") + if walletType == "" { + wh.Error400(w, "missing type") + return + } + + seed := r.FormValue("seed") + label := r.FormValue("label") + + scanNStr := r.FormValue("scan") + var scanN uint64 + if scanNStr != "" { + var err error + scanN, err = strconv.ParseUint(scanNStr, 10, 64) + if err != nil { + wh.Error400(w, "invalid scan value") + return + } + } + + var bip44Coin *bip44.CoinType + bip44CoinStr := r.FormValue("bip44-coin") + if bip44CoinStr != "" { + if walletType != wallet.WalletTypeBip44 { + wh.Error400(w, "bip44-coin is only valid for bip44 type wallets") + return + } + + bip44CoinInt, err := strconv.ParseUint(bip44CoinStr, 10, 32) + if err != nil { + wh.Error400(w, "invalid bip44-coin value") + return + } + + c := bip44.CoinType(bip44CoinInt) + bip44Coin = &c + } + + secKeys, err := wallet.ParsePrivateKeys(r.FormValue("private-keys")) + if err != nil { + wh.Error400(w, "invalid collection private keys") + return + } + defer func() { + for i := range secKeys { + secKeys[i] = cipher.SecKey{} + } + }() + + wlt, err := gateway.CreateWallet("", wallet.Options{ + Temp: true, + Seed: seed, + Label: label, + ScanN: scanN, + Type: walletType, + Bip44Coin: bip44Coin, + XPub: r.FormValue("xpub"), + TF: gateway.TransactionsFinder(), + CollectionPrivateKeys: secKeys, + }) + if err != nil { + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + return + default: + wh.Error400(w, err.Error()) + return + } + default: + wh.Error500(w, err.Error()) + return + } + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Genreates new addresses +// URI: /api/v1/wallet/newAddress +// Method: POST +// Args: +// +// id: wallet id [required] +// num: number of address need to create [optional, if not set the default value is 1] +// password: wallet password [optional, must be provided if the wallet is encrypted] +func walletNewAddressesHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + var opts []wallet.Option + // Compute the number of addresses to create, default is 1 + num := r.FormValue("num") + if num != "" { + n, err := strconv.ParseUint(num, 10, 64) + if err != nil { + wh.Error400(w, "invalid num value") + return + } + opts = append(opts, wallet.OptionGenerateN(n)) + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + privateKeys, err := wallet.ParsePrivateKeys(r.FormValue("private-keys")) + if err != nil { + wh.Error400(w, "invalid private keys") + return + } + if len(privateKeys) > 0 { + opts = append(opts, wallet.OptionCollectionPrivateKeys(privateKeys)) + } + + addrs, err := gateway.NewAddresses(wltID, []byte(password), opts...) + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error400(w, err.Error()) + } + return + } + + var rlt = struct { + Addresses []string `json:"addresses"` + }{} + + for _, a := range addrs { + rlt.Addresses = append(rlt.Addresses, a.String()) + } + + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Scan addresses to find balances +// URI: /api/v1/wallet/scan +// Method: POST +// Args: +// +// id: wallet id [required] +// num: the number of addresses to scan ahead for balance [optional, must be > 0, default to 20] +// password: wallet password [optional, must be provided is the wallet is encrypted] +func walletScanAddressesHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + // Get the number of address to scan + num := r.FormValue("num") + var n uint64 = 20 + if num != "" { + var err error + n, err = strconv.ParseUint(num, 10, 64) + if err != nil { + wh.Error400(w, "invalid num value") + return + } + if n <= 0 { + wh.Error400(w, "invalid num value, must be > 0") + return + } + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + addrs, err := gateway.ScanWalletAddresses(wltID, []byte(password), n) + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error400(w, err.Error()) + } + return + } + + var rlt = struct { + Addresses []string `json:"addresses"` + }{} + + for _, a := range addrs { + rlt.Addresses = append(rlt.Addresses, a.String()) + } + + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Update wallet label +// URI: /api/v1/wallet/update +// Method: POST +// Args: +// +// id: wallet id [required] +// label: the label the wallet will be updated to [required] +func walletUpdateHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + // Update wallet + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + label := r.FormValue("label") + if label == "" { + wh.Error400(w, "missing label") + return + } + + if err := gateway.UpdateWalletLabel(wltID, label); err != nil { + logger.Errorf("update wallet label failed: %v", err) + + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, "success") + } +} + +// Returns a wallet by id +// URI: /api/v1/wallet +// Method: GET +// Args: +// +// id: wallet id [required] +func walletHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, fmt.Sprintf("missing wallet id")) + return + } + + wlt, err := gateway.GetWallet(wltID) + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error400(w, err.Error()) + } + return + } + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// walletTransactionsHandler returns all unconfirmed transactions for all addresses in a given wallet +// URI: /api/v1/wallet/transactions +// Method: GET +// Args: +// +// id: wallet id [required] +// verbose: [bool] include verbose transaction input data +func walletTransactionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + handleWalletError := func(err error) { + switch err { + case nil: + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + } + + if verbose { + txns, inputs, err := gateway.GetWalletUnconfirmedTransactionsVerbose(wltID) + if err != nil { + logger.Errorf("get wallet unconfirmed transactions verbose failed: %v", err) + handleWalletError(err) + return + } + + vb := make([]readable.UnconfirmedTransactionVerbose, len(txns)) + for i, txn := range txns { + v, err := readable.NewUnconfirmedTransactionVerbose(&txn, inputs[i]) + if err != nil { + wh.Error500(w, err.Error()) + return + } + vb[i] = *v + } + + wh.SendJSONOr500(logger, w, UnconfirmedTxnsVerboseResponse{ + Transactions: vb, + }) + } else { + txns, err := gateway.GetWalletUnconfirmedTransactions(wltID) + if err != nil { + logger.Errorf("get wallet unconfirmed transactions failed: %v", err) + handleWalletError(err) + return + } + + unconfirmedTxns, err := readable.NewUnconfirmedTransactions(txns) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, UnconfirmedTxnsResponse{ + Transactions: unconfirmedTxns, + }) + } + } +} + +// Returns all loaded wallets +// URI: /api/v1/wallets +// Method: GET +func walletsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wlts, err := gateway.GetWallets() + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wrs := make([]*WalletResponse, 0, len(wlts)) + for _, wlt := range wlts { + wr, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wrs = append(wrs, wr) + } + + sort.Slice(wrs, func(i, j int) bool { + return wrs[i].Meta.Timestamp < wrs[j].Meta.Timestamp + }) + + wh.SendJSONOr500(logger, w, wrs) + } +} + +// WalletFolder struct +type WalletFolder struct { + Address string `json:"address"` +} + +// Returns the wallet directory path +// URI: /api/v1/wallets/folderName +// Method: GET +func walletFolderHandler(s Walleter) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr, err := s.WalletDir() + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + ret := WalletFolder{ + Address: addr, + } + wh.SendJSONOr500(logger, w, ret) + } +} + +// Generates wallet seed +// URI: /api/v1/wallet/newSeed +// Method: GET +// Args: +// +// entropy: entropy bitsize [optional, default value of 128 will be used if not set] +func newSeedHandler() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + entropyValue := r.FormValue("entropy") + if entropyValue == "" { + entropyValue = "128" + } + + entropyBits, err := strconv.Atoi(entropyValue) + if err != nil { + wh.Error400(w, "invalid entropy") + return + } + + // Entropy bit size can either be 128 or 256 + if entropyBits != 128 && entropyBits != 256 { + wh.Error400(w, "entropy length must be 128 or 256") + return + } + + entropy, err := bip39.NewEntropy(entropyBits) + if err != nil { + err = fmt.Errorf("bip39.NewEntropy failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + mnemonic, err := bip39.NewMnemonic(entropy) + if err != nil { + err = fmt.Errorf("bip39.NewDefaultMnemonic failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + var rlt = struct { + Seed string `json:"seed"` + }{ + mnemonic, + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// WalletSeedResponse is returned by /api/v1/wallet/seed +type WalletSeedResponse struct { + Seed string `json:"seed"` + SeedPassphrase string `json:"seed_passphrase,omitempty"` +} + +// Returns seed and seed passphrase of wallet of given id +// URI: /api/v1/wallet/seed +// Method: POST +// Args: +// +// id: wallet id +// password: wallet password +func walletSeedHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + seed, seedPassphrase, err := gateway.GetWalletSeed(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrMissingPassword, + wallet.ErrWalletNotEncrypted, + wallet.ErrInvalidPassword: + wh.Error400(w, err.Error()) + case wallet.ErrWalletAPIDisabled, wallet.ErrSeedAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + v := WalletSeedResponse{ + Seed: seed, + SeedPassphrase: seedPassphrase, + } + + wh.SendJSONOr500(logger, w, v) + } +} + +// VerifySeedRequest is the request data for POST /api/v2/wallet/seed/verify +type VerifySeedRequest struct { + Seed string `json:"seed"` +} + +// walletVerifySeedHandler verifies a wallet seed +// Method: POST +// URI: /api/v2/wallet/seed/verify +func walletVerifySeedHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifySeedRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.Seed == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "seed is required") + writeHTTPResponse(w, resp) + return + } + + if err := bip39.ValidateMnemonic(req.Seed); err != nil { + resp := NewHTTPErrorResponse(http.StatusUnprocessableEntity, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{Data: struct{}{}}) +} + +// Unloads wallet from the wallet service +// URI: /api/v1/wallet/unload +// Method: POST +// Args: +// +// id: wallet id +func walletUnloadHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + if err := gateway.UnloadWallet(id); err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + } + } +} + +// Encrypts wallet +// URI: /api/v1/wallet/encrypt +// Method: POST +// Args: +// +// id: wallet id +// password: wallet password +func walletEncryptHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + wlt, err := gateway.EncryptWallet(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrWalletEncrypted, + wallet.ErrMissingPassword, + wallet.ErrEncryptTempWallet, + wallet.ErrInvalidPassword: + wh.Error400(w, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + // Make sure the sensitive data are wiped + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Decrypts wallet +// URI: /api/v1/wallet/decrypt +// Method: POST +// Args: +// +// id: wallet id +// password: wallet password +func walletDecryptHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + wlt, err := gateway.DecryptWallet(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrMissingPassword, + wallet.ErrWalletNotEncrypted, + wallet.ErrInvalidPassword: + wh.Error400(w, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// WalletRecoverRequest is the request data for POST /api/v2/wallet/recover +type WalletRecoverRequest struct { + ID string `json:"id"` + Seed string `json:"seed"` + SeedPassphrase string `json:"seed_passphrase"` + Password string `json:"password"` +} + +// URI: /api/v2/wallet/recover +// Method: POST +// Args: +// +// id: wallet id +// seed: wallet seed +// password: [optional] new password +// +// Recovers an encrypted wallet by providing the seed. +// The first address will be generated from seed and compared to the first address +// of the specified wallet. If they match, the wallet will be regenerated +// with an optional password. +// If the wallet is not encrypted, an error is returned. +func walletRecoverHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req WalletRecoverRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.ID == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "id is required") + writeHTTPResponse(w, resp) + return + } + + if req.Seed == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "seed is required") + writeHTTPResponse(w, resp) + return + } + + var password []byte + if req.Password != "" { + password = []byte(req.Password) + } + + defer func() { + req.Seed = "" + req.SeedPassphrase = "" + req.Password = "" + password = nil + }() + + wlt, err := gateway.RecoverWallet(req.ID, req.Seed, req.SeedPassphrase, password) + if err != nil { + var resp HTTPResponse + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletNotExist: + resp = NewHTTPErrorResponse(http.StatusNotFound, "") + case wallet.ErrWalletAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + default: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + } + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: rlt, + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58_old.go b/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58_old.go index ffa4bca5c9..cd051e0ff3 100644 --- a/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58_old.go +++ b/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58_old.go @@ -11,7 +11,7 @@ import ( "math/big" ) -//alphabet used by Bitcoins +// alphabet used by Bitcoins var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" var ( @@ -26,7 +26,7 @@ var ( // oldBase58 type to hold the oldBase58 string type oldBase58 string -//reverse alphabet used for quckly converting base58 strings into numbers +// reverse alphabet used for quckly converting base58 strings into numbers var revalp = map[string]int{ "1": 0, "2": 1, "3": 2, "4": 3, "5": 4, "6": 5, "7": 6, "8": 7, "9": 8, "A": 9, "B": 10, "C": 11, "D": 12, "E": 13, "F": 14, "G": 15, "H": 16, "J": 17, "K": 18, "L": 19, @@ -76,7 +76,7 @@ func (b oldBase58) ToInt() (int, error) { return answer, nil } -//ToHex converts base58 to hex bytes +// ToHex converts base58 to hex bytes func (b oldBase58) ToHex() ([]byte, error) { value, err := b.ToBig() //convert to big.Int if err != nil { diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip32/LICENSE b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/LICENSE new file mode 100644 index 0000000000..23d5c3efc5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2017 Tyler Smith +Copyright (c) 2019 Skycoin Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip32/README.md b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/README.md new file mode 100644 index 0000000000..c148686238 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/README.md @@ -0,0 +1,102 @@ +# go-bip32 + +An implementation of the BIP32 spec for Hierarchical Deterministic Bitcoin addresses as a simple Go library. The semantics of derived keys are up to the user. +[BIP43](https://github.com/bitcoin/bips/blob/master/bip-0043.mediawiki) and [BIP44](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) are good schemes to implement with this library. +An additional library for either or both of those on top of this library should be developed. + +Modified for use in Skycoin, derived from https://github.com/tyler-smith/go-bip32 + +## Example + +It's very unlikely, but possible, that a given index does not produce a valid +private key. Error checking is skipped in this example for brevity but should be +handled in real code. In such a case, an error of type `Error` is returned and it's +method `ImpossibleChild()` will return true. + +An example for handling this: + +```go +func tryNewPrivateKeyFromPath() (*bip32.PrivateKey, error) { + k, err := bip32.NewPrivateKeyFromPath([]byte("abc123"), "m/1'/1'/0/1") + if err != nil { + if bip32.IsImpossibleChildError(err) { + fmt.Println("Child number 1 generated an invalid key, use the next child number") + } + return err + } + + return k, nil +} +``` + +Any valid private key will have a valid public key so that `PrivateKey.PublicKey()` +method never returns an error. + +```go +package main + +import ( + "github.com/skycoin/skycoin/src/cipher/bip32" + "github.com/skycoin/skycoin/src/cipher/bip39" + "fmt" + "log" +) + +// Example address creation for a fictitious company ComputerVoice Inc. where +// each department has their own wallet to manage +func main(){ + // Generate a mnemonic to determine all keys from. Don't lose it. + mnemonic := bip39.MustNewDefaultMnemonic() + + // Derivce a seed from the mnemonic + seed, err := bip39.NewSeed(mnemonic, "") + if err != nil { + log.Fatalln("Error generating seed:", err) + } + + // Create master private key from seed + computerVoiceMasterKey, err := bip32.NewMasterKey(seed) + if err != nil { + log.Fatalln("NewMasterKey failed:", err) + } + + // Map departments to keys + // There is a very small chance a given child index is invalid (less than 1 in 2^127) + // If so your real program should handle this by skipping the index + departmentKeys := map[string]*bip32.Key{} + departmentKeys["Sales"], err = computerVoiceMasterKey.NewChildKey(0) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + departmentKeys["Marketing"], err = computerVoiceMasterKey.NewChildKey(1) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + departmentKeys["Engineering"], err = computerVoiceMasterKey.NewChildKey(2) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + departmentKeys["Customer Support"], err = computerVoiceMasterKey.NewChildKey(3) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + + // Create public keys for record keeping, auditors, payroll, etc + departmentAuditKeys := map[string]*bip32.Key{} + departmentAuditKeys["Sales"] = departmentKeys["Sales"].PublicKey() + departmentAuditKeys["Marketing"] = departmentKeys["Marketing"].PublicKey() + departmentAuditKeys["Engineering"] = departmentKeys["Engineering"].PublicKey() + departmentAuditKeys["Customer Support"] = departmentKeys["Customer Support"].PublicKey() + + // Print public keys + for department, pubKey := range departmentAuditKeys { + fmt.Println(department, pubKey) + } +} +``` + +## Thanks + +The developers at [Factom](https://www.factom.com/) have contributed a lot to this library and have made many great improvements to it. Please check out their project(s) and give them a thanks if you use this library. + +Thanks to [bartekn](https://github.com/bartekn) from Stellar for some important bug catches. diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip32/bip32.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/bip32.go new file mode 100644 index 0000000000..37dc2ed169 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/bip32.go @@ -0,0 +1,653 @@ +/* +Package bip32 implements the bip32 spec https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki +*/ +package bip32 + +import ( + "bytes" + "crypto/hmac" + "crypto/sha512" + "encoding/binary" + "errors" + "fmt" + "log" + + "github.com/skycoin/skycoin/src/cipher/base58" +) + +const ( + // FirstHardenedChild is the index of the firxt "hardened" child key as per the + // bip32 spec + FirstHardenedChild = uint32(0x80000000) + + // masterKey is the "Key" value specified by bip32 for the master key + masterKey = "Bitcoin seed" +) + +// Error wraps bip32 errors +type Error struct { + error + impossibleChild bool +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + log.Panic("NewError called with nil error") + } + return Error{ + error: err, + } +} + +// ImpossibleChild returns true if this error indicates +// that a given child number cannot produce a valid key. +// If the caller receives this error, they should skip this child and go to the next number. +// The probability of this happening is less than 1 in 2^127. +func (err Error) ImpossibleChild() bool { + return err.impossibleChild +} + +// NewImpossibleChildError creates an Error flagged as an ImpossibleChild error +func NewImpossibleChildError(err error, childNumber uint32) error { + if err == nil { + log.Panic("NewImpossibleChildError called with nil error") + } + return Error{ + error: fmt.Errorf("childNumber=%d %v", childNumber, err), + impossibleChild: true, + } +} + +// IsImpossibleChildError returns true if the error is an ImpossibleChild Error +func IsImpossibleChildError(err error) bool { + if err == nil { + return false + } + + switch t := err.(type) { + case Error: + return t.ImpossibleChild() + default: + return false + } +} + +var ( + // PrivateWalletVersion is the version flag for serialized private keys ("xpriv") + PrivateWalletVersion = []byte{0x04, 0x88, 0xAD, 0xE4} + + // PublicWalletVersion is the version flag for serialized public keys ("xpub") + PublicWalletVersion = []byte{0x04, 0x88, 0xB2, 0x1E} + + // ErrSerializedKeyWrongSize is returned when trying to deserialize a key that + // has an incorrect length + ErrSerializedKeyWrongSize = NewError(errors.New("Serialized keys should be exactly 82 bytes")) + + // ErrHardenedChildPublicKey is returned when trying to create a harded child + // of the public key + ErrHardenedChildPublicKey = NewError(errors.New("Can't create hardened child for public key")) + + // ErrInvalidChecksum is returned when deserializing a key with an incorrect checksum + ErrInvalidChecksum = NewError(errors.New("Checksum doesn't match")) + + // ErrDerivedInvalidPrivateKey is returned when an invalid private key was derived + ErrDerivedInvalidPrivateKey = NewError(errors.New("Derived invalid private key")) + + // ErrDerivedInvalidPublicKey is returned when an invalid public key was derived + ErrDerivedInvalidPublicKey = NewError(errors.New("Derived invalid public key")) + + // ErrInvalidPrivateKeyVersion is returned when a deserializing a private key without the 'xprv' prefix + ErrInvalidPrivateKeyVersion = NewError(errors.New("Invalid private key version")) + + // ErrInvalidPublicKeyVersion is returned when a deserializing a public key without the 'xpub' prefix + ErrInvalidPublicKeyVersion = NewError(errors.New("Invalid public key version")) + + // ErrInvalidSeedLength is returned when generating a master key with an invalid number of seed bits + ErrInvalidSeedLength = NewError(errors.New("Invalid master key seed length")) + + // ErrDeserializePrivateFromPublic attempted to deserialize a private key from an encoded public key + ErrDeserializePrivateFromPublic = NewError(errors.New("Cannot deserialize a private key from a public key")) + + // ErrInvalidKeyVersion is returned if the key version is not 'xpub' or 'xprv' + ErrInvalidKeyVersion = NewError(errors.New("Invalid key version")) + + // ErrInvalidFingerprint is returned if a deserialized key has an invalid fingerprint + ErrInvalidFingerprint = NewError(errors.New("Invalid key fingerprint")) + + // ErrInvalidChildNumber is returned if a deserialized key has an invalid child number + ErrInvalidChildNumber = NewError(errors.New("Invalid key child number")) + + // ErrInvalidPrivateKey is returned if a deserialized xprv key's private key is invalid + ErrInvalidPrivateKey = NewError(errors.New("Invalid private key")) + + // ErrInvalidPublicKey is returned if a deserialized xpub key's public key is invalid + ErrInvalidPublicKey = NewError(errors.New("Invalid public key")) + + // ErrMaxDepthReached maximum allowed depth (255) reached for child key + ErrMaxDepthReached = NewError(errors.New("Maximum child depth reached")) +) + +// key represents a bip32 extended key +type key struct { + Version []byte // 4 bytes + Depth byte // 1 bytes + ParentFingerprint []byte // 4 bytes + childNumber []byte // 4 bytes + ChainCode []byte // 32 bytes + Key []byte // 33 bytes for public keys; 32 bytes for private keys +} + +func (k key) ChildNumber() uint32 { + return binary.BigEndian.Uint32(k.childNumber) +} + +func (k key) clone() key { + newK := key{} + newK.Depth = k.Depth + newK.Version = append(newK.Version, k.Version...) + newK.ParentFingerprint = append(newK.ParentFingerprint, k.ParentFingerprint...) + newK.childNumber = append(newK.childNumber, k.childNumber...) + newK.ChainCode = append(newK.ChainCode, k.ChainCode...) + newK.Key = append(newK.Key, k.Key...) + return newK +} + +// PrivateKey represents a bip32 extended private key +type PrivateKey struct { + key +} + +// Clone returns a copy of the private key +func (k PrivateKey) Clone() PrivateKey { + return PrivateKey{key: k.clone()} +} + +// PublicKey represents a bip32 extended public key +type PublicKey struct { + key +} + +// Clone returns a copy of the public key +func (k PublicKey) Clone() PublicKey { + return PublicKey{key: k.clone()} +} + +// NewMasterKey creates a new master extended key from a seed. +// Seed should be between 128 and 512 bits; 256 bits are recommended. +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#master-key-generation +func NewMasterKey(seed []byte) (*PrivateKey, error) { + if len(seed) < 16 || len(seed) > 64 { + return nil, ErrInvalidSeedLength + } + + return newMasterKey(seed) +} + +func newMasterKey(seed []byte) (*PrivateKey, error) { + // Generate key and chaincode + hmac := hmac.New(sha512.New, []byte(masterKey)) + if _, err := hmac.Write(seed); err != nil { + log.Panic(err) + } + intermediary := hmac.Sum(nil) + + // Split it into our key and chain code + keyBytes := intermediary[:32] + chainCode := intermediary[32:] + + // Validate key + if err := validatePrivateKey(keyBytes); err != nil { + return nil, err + } + + // Create the key struct + key := &PrivateKey{ + key: key{ + Version: PrivateWalletVersion, + ChainCode: chainCode, + Key: keyBytes, + Depth: 0x0, + childNumber: []byte{0x00, 0x00, 0x00, 0x00}, + ParentFingerprint: []byte{0x00, 0x00, 0x00, 0x00}, + }, + } + + return key, nil +} + +// NewPrivateKeyFromPath returns a private key at a given bip32 path. +// The path must be a full path starting with m/, and the initial seed +// must be provided. +// This method can return an ImpossibleChild error. +func NewPrivateKeyFromPath(seed []byte, p string) (*PrivateKey, error) { + path, err := ParsePath(p) + if err != nil { + return nil, err + } + + k, err := NewMasterKey(seed) + if err != nil { + return nil, err + } + + if len(path.Elements) > 1 { + return k.DeriveSubpath(path.Elements[1:]) + } + + return k, nil +} + +// DeriveSubpath derives a PrivateKey at at bip32 subpath, e.g. `0'/1'/0`. +// The nodes argument must not be empty. +// This method can return an ImpossibleChild error. +func (k *PrivateKey) DeriveSubpath(nodes []PathNode) (*PrivateKey, error) { + if len(nodes) == 0 { + return nil, errors.New("Path nodes array empty when deriving a bip32 subpath") + } + + ck, err := k.newPrivateChildKeyFromPathNode(nodes[0]) + if err != nil { + return nil, err + } + + for _, e := range nodes[1:] { + ck, err = ck.newPrivateChildKeyFromPathNode(e) + if err != nil { + return nil, err + } + } + + return ck, nil +} + +func (k *PrivateKey) newPrivateChildKeyFromPathNode(n PathNode) (*PrivateKey, error) { + if n.Master { + return nil, errors.New("PathNode is Master at a non-zero depth") + } + + return k.NewPrivateChildKey(n.ChildNumber) +} + +// PublicKey returns the public version of key or return a copy +// The 'Neuter' function from the bip32 spec, N((k, c) -> (K, c). +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#private-parent-key--public-child-key +func (k *PrivateKey) PublicKey() *PublicKey { + pubKey, err := publicKeyForPrivateKey(k.Key) + if err != nil { + log.Panicf("PrivateKey.PublicKey failed: %v", err) + } + return &PublicKey{ + key: key{ + Version: PublicWalletVersion, + Key: pubKey, + Depth: k.Depth, + childNumber: k.childNumber, + ChainCode: k.ChainCode, + ParentFingerprint: k.ParentFingerprint, + }, + } +} + +// Fingerprint returns the key fingerprint +func (k *PrivateKey) Fingerprint() []byte { + // "Extended keys can be identified by the Hash160 (RIPEMD160 after SHA256) + // of the serialized ECDSA public key K, ignoring the chain code." + return k.PublicKey().Fingerprint() +} + +// Identifier returns the key ID +func (k *PrivateKey) Identifier() []byte { + return k.PublicKey().Identifier() +} + +// Fingerprint returns the key fingerprint +func (k *PublicKey) Fingerprint() []byte { + return fingerprint(k.Key) +} + +// Identifier returns the key ID +func (k *PublicKey) Identifier() []byte { + return identifier(k.Key) +} + +func identifier(key []byte) []byte { + // "Extended keys can be identified by the Hash160 (RIPEMD160 after SHA256) + // of the serialized ECDSA public key K, ignoring the chain code." + + // ripemd160(sha256(key)) + return hash160(key) +} + +func fingerprint(key []byte) []byte { + id := identifier(key) + // "The first 32 bits of the identifier are called the key fingerprint." + return id[:4] +} + +// NewPrivateChildKey derives a private child key from a given parent as outlined by bip32, CDKpriv(). +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#private-parent-key--private-child-key +// This method can return an ImpossibleChild error. +func (k *PrivateKey) NewPrivateChildKey(childIdx uint32) (*PrivateKey, error) { + if k.Depth == 0xFF { + return nil, ErrMaxDepthReached + } + + intermediary := k.ckdPrivHMAC(childIdx) + + iL := intermediary[:32] // used for computing the next key + chainCode := intermediary[32:] // iR + + // ki = parse256(IL) + kpar (mod n) + // In case parse256(IL) ≥ n or ki = 0, the resulting key is invalid + newKey, err := addPrivateKeys(iL, k.Key) + if err != nil { + return nil, NewImpossibleChildError(err, childIdx) + } + + return &PrivateKey{ + key: key{ + Version: PrivateWalletVersion, + childNumber: uint32Bytes(childIdx), + ChainCode: chainCode, + Depth: k.Depth + 1, + Key: newKey, + ParentFingerprint: k.Fingerprint(), + }, + }, nil +} + +// NewPublicChildKey derives a public child key from an extended public key, N(CKDpriv()). +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#private-parent-key--public-child-key +// This method can return an ImpossibleChild error. +func (k *PrivateKey) NewPublicChildKey(childIdx uint32) (*PublicKey, error) { + k2, err := k.NewPrivateChildKey(childIdx) + if err != nil { + return nil, err + } + return k2.PublicKey(), nil +} + +// NewPublicChildKey derives a public child key from an extended public key, CKDpub(). +// Hardened child keys cannot be derived; the value of childIdx must be less than 2^31. +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#public-parent-key--public-child-key +// This method can return an ImpossibleChild error. +func (k *PublicKey) NewPublicChildKey(childIdx uint32) (*PublicKey, error) { + if k.Depth == 0xFF { + return nil, ErrMaxDepthReached + } + + // CKDPub step 1 + intermediary, err := k.ckdPubHMAC(childIdx) + if err != nil { + return nil, err + } + + // CKDPub step 2 + iL := intermediary[:32] // used for computing the next key + + // CKDPub step 3: Ki = point(parse256(IL)) + Kpar + // CKDPub step 5: In case parse256(IL) ≥ n or Ki is the point at infinity, the resulting key is invalid + keyBytes, err := publicKeyForPrivateKey(iL) + if err != nil { + return nil, NewImpossibleChildError(err, childIdx) + } + + // CKDPub step 4 + chainCode := intermediary[32:] // iR + + newKey, err := addPublicKeys(keyBytes[:], k.Key) + if err != nil { + return nil, err + } + + // Create child Key with data common to all both scenarios + return &PublicKey{ + key: key{ + Version: PublicWalletVersion, + childNumber: uint32Bytes(childIdx), + ChainCode: chainCode, + Depth: k.Depth + 1, + Key: newKey, + ParentFingerprint: k.Fingerprint(), + }, + }, nil +} + +// ckdPrivHMAC computes the first step of the CKDPriv function, which computes an HMAC +func (k *key) ckdPrivHMAC(childIdx uint32) []byte { + // Get intermediary to create key and chaincode. + // Hardened children are based on the private key. + // Non-hardened children are based on the public key. + + var data []byte + if childIdx >= FirstHardenedChild { + // Hardened child + // I = HMAC-SHA512(Key = cpar, Data = 0x00 || ser256(kpar) || ser32(i)) + // 0x00 || ser256(kpar) + data = append([]byte{0x0}, k.Key...) + } else { + // Non-hardened child + // I = HMAC-SHA512(Key = cpar, Data = serP(point(kpar)) || ser32(i)) + // The equation below is "convert private key to compressed public key" + // serP(point(kpar)) + var err error + data, err = publicKeyForPrivateKey(k.Key) + if err != nil { + log.Panic(err) + } + } + + // Append the child index as big-endian serialized bytes + // || ser32(i) + childIndexBytes := uint32Bytes(childIdx) + data = append(data, childIndexBytes...) + + // HMAC-SHA512(Key = cpar, Data) + hmac := hmac.New(sha512.New, k.ChainCode) + if _, err := hmac.Write(data); err != nil { + log.Panic(err) + } + + return hmac.Sum(nil) +} + +// ckdPubHMAC computes the first step of the CKDPub function, which computes an HMAC +func (k *key) ckdPubHMAC(childIdx uint32) ([]byte, error) { + // Get intermediary to create key and chaincode. + // Hardened children are based on the private key. + // Non-hardened children are based on the public key. + + if childIdx >= FirstHardenedChild { + // Public keys can't derive hardened child keys + return nil, ErrHardenedChildPublicKey + } + + // I = HMAC-SHA512(Key = cpar, Data = serP(Kpar) || ser32(i)) + + // serP(Kpar) + data := make([]byte, len(k.Key)) + copy(data, k.Key) + + // ser32(i) + childIndexBytes := uint32Bytes(childIdx) + + // serP(Kpar) || ser32(i) + data = append(data, childIndexBytes...) + + // HMAC-SHA512(Key = cpar, Data = serP(Kpar) || ser32(i)) + hmac := hmac.New(sha512.New, k.ChainCode) + if _, err := hmac.Write(data); err != nil { + log.Panic(err) + } + + return hmac.Sum(nil), nil +} + +// Serialize a Key to a 78 byte byte slice +func (k *PrivateKey) Serialize() []byte { + // Private keys should be prepended with a single null byte + return k.serialize(append([]byte{0x0}, k.Key...)) +} + +// Serialize a Key to a 78 byte byte slice +func (k *PublicKey) Serialize() []byte { + return k.serialize(k.Key) +} + +// serialize a Key to a 78 byte byte slice +func (k *key) serialize(key []byte) []byte { + n := len(k.Version) + n++ // k.Depth + n += len(k.ParentFingerprint) + n += len(k.childNumber) + n += len(k.ChainCode) + n += len(key) + + buffer := &bytes.Buffer{} + buffer.Grow(n) + + // Write fields to buffer in order + buffer.Write(k.Version) + buffer.WriteByte(k.Depth) + buffer.Write(k.ParentFingerprint) + buffer.Write(k.childNumber) + buffer.Write(k.ChainCode) + buffer.Write(key) + + // Append the standard doublesha256 checksum + return addChecksumToBytes(buffer.Bytes()) +} + +// String encodes the Key in the standard Bitcoin base58 encoding +func (k *PrivateKey) String() string { + return base58.Encode(k.Serialize()) +} + +// String encodes the Key in the standard Bitcoin base58 encoding +func (k *PublicKey) String() string { + return base58.Encode(k.Serialize()) +} + +// DeserializeEncodedPrivateKey deserializes a base58 xprv key to a PrivateKey +func DeserializeEncodedPrivateKey(xprv string) (*PrivateKey, error) { + b, err := base58.Decode(xprv) + if err != nil { + return nil, err + } + return DeserializePrivateKey(b) +} + +// DeserializePrivateKey deserializes the []byte serialization of a PrivateKey +func DeserializePrivateKey(data []byte) (*PrivateKey, error) { + k, err := deserialize(data, true) + if err != nil { + return nil, err + } + + if len(k.Key) != 32 { + log.Panic("DeserializePrivateKey expected 32 bytes key length") + } + if !bytes.Equal(k.Version, PrivateWalletVersion) { + log.Panic("DeserializePrivateKey expected xprv prefix") + } + + return &PrivateKey{ + key: *k, + }, nil +} + +// DeserializeEncodedPublicKey deserializes a base58 xpub key to a PublicKey +func DeserializeEncodedPublicKey(xpub string) (*PublicKey, error) { + b, err := base58.Decode(xpub) + if err != nil { + return nil, err + } + return DeserializePublicKey(b) +} + +// DeserializePublicKey deserializes the []byte serialization of a PublicKey +func DeserializePublicKey(data []byte) (*PublicKey, error) { + k, err := deserialize(data, false) + if err != nil { + return nil, err + } + + if len(k.Key) != 33 { + log.Panic("DeserializePublicKey expected 33 bytes key length") + } + if !bytes.Equal(k.Version, PublicWalletVersion) { + log.Panic("DeserializePublicKey expected xpub prefix") + } + + return &PublicKey{ + key: *k, + }, nil +} + +// deserialize a byte slice into a Key. +// If the Key.Key length is 32 bytes it is a private key, otherwise it is a public key. +func deserialize(data []byte, wantPrivate bool) (*key, error) { + if len(data) != 82 { + return nil, ErrSerializedKeyWrongSize + } + + // Validate checksum + cs1 := checksum(data[0 : len(data)-4]) + cs2 := data[len(data)-4:] + if !bytes.Equal(cs1, cs2) { + return nil, ErrInvalidChecksum + } + + k := &key{} + k.Version = data[0:4] + k.Depth = data[4] + k.ParentFingerprint = data[5:9] + k.childNumber = data[9:13] + k.ChainCode = data[13:45] + + isPrivate := bytes.Equal(k.Version, PrivateWalletVersion) + isPublic := bytes.Equal(k.Version, PublicWalletVersion) + + if !isPrivate && !isPublic { + return nil, ErrInvalidKeyVersion + } + + if wantPrivate && !isPrivate { + return nil, ErrInvalidPrivateKeyVersion + } + + if !wantPrivate && !isPublic { + return nil, ErrInvalidPublicKeyVersion + } + + // Master keys (depth=0) have an empty fingerprint and a ChildNumber of 0 + if k.Depth == 0 { + var emptyBytes [4]byte + if !bytes.Equal(k.ParentFingerprint, emptyBytes[:]) { + return nil, ErrInvalidFingerprint + } + + if k.ChildNumber() != 0 { + return nil, ErrInvalidChildNumber + } + } + + // Private keys must have a 0 byte prefix padding + if isPrivate { + if data[45] != 0 { + return nil, ErrInvalidPrivateKey + } + k.Key = data[46:78] + if err := validatePrivateKey(k.Key); err != nil { + return nil, ErrInvalidPrivateKey + } + } else { + k.Key = data[45:78] + if err := validatePublicKey(k.Key); err != nil { + return nil, ErrInvalidPublicKey + } + } + + return k, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip32/path.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/path.go new file mode 100644 index 0000000000..d95e6af3af --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/path.go @@ -0,0 +1,108 @@ +package bip32 + +import ( + "errors" + "log" + "strconv" + "strings" +) + +// Path represents a parsed HD wallet path +type Path struct { + Elements []PathNode +} + +// PathNode is an element of an HD wallet path +type PathNode struct { + Master bool + ChildNumber uint32 +} + +// Hardened returns true if this path node is hardened +func (p PathNode) Hardened() bool { + return p.ChildNumber >= FirstHardenedChild +} + +var ( + // ErrPathNoMaster HD wallet path does not start with m + ErrPathNoMaster = errors.New("Path must start with m") + // ErrPathChildMaster HD wallet path contains m in a child node + ErrPathChildMaster = errors.New("Path contains m as a child node") + // ErrPathNodeNotNumber HD wallet path node is not a valid uint32 number + ErrPathNodeNotNumber = errors.New("Path node is not a valid uint32 number") + // ErrPathNodeNumberTooLarge HD wallet path node is >= 2^31 + ErrPathNodeNumberTooLarge = errors.New("Path node must be less than 2^31") +) + +// ParsePath parses a bip32 HD wallet path. The path must start with m/. +func ParsePath(p string) (*Path, error) { + pts := strings.Split(p, "/") + + path := &Path{ + Elements: []PathNode{ + { + Master: true, + ChildNumber: 0, + }, + }, + } + + for i, x := range pts { + if i == 0 { + if x != "m" { + return nil, ErrPathNoMaster + } + // Path.Elements already initialized with master node + continue + } else if x == "m" { + return nil, ErrPathChildMaster + } + + n, err := parseNode(x) + if err != nil { + return nil, err + } + + path.Elements = append(path.Elements, n) + } + + return path, nil +} + +func parseNode(x string) (PathNode, error) { + // Hardened nodes have an apostrophe ' appended + hardened := false + if strings.HasSuffix(x, "'") { + hardened = true + x = x[:len(x)-1] + } + + // Node element (minus a single trailing apostrophe) must be a valid uint32 number + n, err := strconv.ParseUint(x, 10, 32) + if err != nil { + return PathNode{}, ErrPathNodeNotNumber + } + + // Node number must be <2^31. If hardened, 2^31 will be added to it + if n >= uint64(FirstHardenedChild) { + return PathNode{}, ErrPathNodeNumberTooLarge + } + + nn := uint32(n) + + // Add 2^31 to the base number for hardened nodes + if hardened { + nnn := nn + FirstHardenedChild + + // Sanity check + if nnn < nn { + log.Panic("Unexpected overflow of path number when adjusting hardened child number") + } + nn = nnn + } + + return PathNode{ + Master: false, + ChildNumber: nn, + }, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip32/utils.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/utils.go new file mode 100644 index 0000000000..a836bd3095 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/utils.go @@ -0,0 +1,171 @@ +package bip32 + +import ( + "crypto/sha256" + "encoding/binary" + "fmt" + "log" + "math/big" + + "github.com/skycoin/skycoin/src/cipher/ripemd160" + secp256k1 "github.com/skycoin/skycoin/src/cipher/secp256k1-go" + secp256k1go "github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2" +) + +// +// Hashes +// + +func hashSHA256(data []byte) []byte { + h := sha256.New() + h.Write(data) //nolint:errcheck + return h.Sum(nil) +} + +func hashDoubleSHA256(data []byte) []byte { + hash1 := hashSHA256(data) + hash2 := hashSHA256(hash1) + return hash2 +} + +func hashRipemd160(data []byte) []byte { + h := ripemd160.New() + h.Write(data) //nolint:errcheck + return h.Sum(nil) +} + +func hash160(data []byte) []byte { + hash1 := hashSHA256(data) + hash2 := hashRipemd160(hash1) + return hash2 +} + +// +// Checksum +// + +func checksum(data []byte) []byte { + hash := hashDoubleSHA256(data) + return hash[:4] +} + +func addChecksumToBytes(data []byte) []byte { + checksum := checksum(data) + return append(data, checksum...) +} + +// +// Keys +// + +// publicKeyForPrivateKey converts a private key to a public key. +// Equivalent to `serP(point(k))` in the bip32 spec +func publicKeyForPrivateKey(key []byte) ([]byte, error) { + // From bip32: If parse256(IL) ≥ n, fail + if err := validatePrivateKey(key); err != nil { + return nil, err + } + + b := secp256k1.PubkeyFromSeckey(key) + if b == nil { + log.Panic("publicKeyForPrivateKey: invalid private key") + } + + // From bip32: If Ki == 0 fail + if err := validatePublicKey(b); err != nil { + return nil, err + } + + return b, nil +} + +func addPublicKeys(key, keyPar []byte) ([]byte, error) { + if code := secp256k1.VerifyPubkey(key); code != 1 { + return nil, fmt.Errorf("addPublicKeys: key is invalid, secp256k1.VerifyPubkey error code %d", code) + } + if code := secp256k1.VerifyPubkey(keyPar); code != 1 { + return nil, fmt.Errorf("addPublicKeys: keyPar is invalid, secp256k1.VerifyPubkey error code %d", code) + } + + // expandPublicKey + var pk1, pk2 secp256k1go.XY + if err := pk1.ParsePubkey(key); err != nil { + log.Panicf("addPublicKeys: invalid pubkey1: %v", err) + } + if err := pk2.ParsePubkey(keyPar); err != nil { + log.Panicf("addPublicKeys: invalid pubkey1: %v", err) + } + + // add public keys + pk1.AddXY(&pk2) + + // compress + newKey := pk1.Bytes() + + if code := secp256k1.VerifyPubkey(newKey); code != 1 { + return nil, fmt.Errorf("addPublicKeys: newKey is invalid, secp256k1.VerifyPubkey error code %d", code) + } + + return newKey, nil +} + +// addPrivateKeys computes the CKDPriv equation `parse256(IL) + kpar (mod n)` +// and verifies the result +func addPrivateKeys(key, keyPar []byte) ([]byte, error) { + // From bip32: If parse256(IL) ≥ n, fail + if code := secp256k1.VerifySeckey(key); code != 1 { + return nil, fmt.Errorf("addPrivateKeys: key is invalid, secp256k1.VerifySeckey error code %d", code) + } + if code := secp256k1.VerifySeckey(keyPar); code != 1 { + return nil, fmt.Errorf("addPrivateKeys: keyPar is invalid, secp256k1.VerifySeckey error code %d", code) + } + + var keyInt big.Int + var keyParInt big.Int + keyInt.SetBytes(key) + keyParInt.SetBytes(keyPar) + + // Computes this CKDPriv equation: + // parse256(IL) + kpar (mod n) + keyInt.Add(&keyInt, &keyParInt) + keyInt.Mod(&keyInt, &secp256k1go.TheCurve.Order.Int) + + newKey := secp256k1go.LeftPadBytes(keyInt.Bytes(), 32) + + // From bip32: If ki == 0 fail + if code := secp256k1.VerifySeckey(newKey); code != 1 { + return nil, fmt.Errorf("addPrivateKeys: newKey is invalid, secp256k1.VerifySeckey error code %d", code) + } + + return newKey, nil +} + +// validatePrivateKey verifies that the secret key is not zero and that it is inside the curve +// Corresponds to bip32 spec constraints `parse256(IL) < n && ki != 0` +func validatePrivateKey(key []byte) error { + // VerifySeckey checks that the key is > 0 and inside the curve + if secp256k1.VerifySeckey(key) != 1 { + return ErrDerivedInvalidPrivateKey + } + + return nil +} + +func validatePublicKey(key []byte) error { + if secp256k1.VerifyPubkey(key) != 1 { + return ErrDerivedInvalidPublicKey + } + + return nil +} + +// +// Numerical +// + +// uint32Bytes serializes a uint32 as bytes in big-endian form +func uint32Bytes(i uint32) []byte { + bytes := make([]byte, 4) + binary.BigEndian.PutUint32(bytes, i) + return bytes +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/LICENSE b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/LICENSE new file mode 100644 index 0000000000..1dc11de829 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018 Tyler Smith and contributors +Copyright (c) 2018-2019 Skycoin Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/README.md b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/README.md new file mode 100644 index 0000000000..6f5ca0fa07 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/README.md @@ -0,0 +1,43 @@ +# bip39 +[![Documentation](https://godoc.org/github.com/skycoin/skycoin/src/cipher/bip39?status.svg)](http://godoc.org/github.com/skycoin/skycoin/src/cipher/bip39) + +A golang implementation of the BIP0039 spec for mnemonic seeds. + +Forked from https://github.com/tyler-smith/go-bip39 to manually vendor the code in the `cipher/` path +and to make some structural modifications. + +## Example + +```go +package main + +import ( + "github.com/skycoin/skycoin/src/cipher/bip39" + "github.com/tyler-smith/go-bip32" + "fmt" +) + +func main(){ + // Generate a mnemonic for memorization or user-friendly seeds + entropy, _ := bip39.NewEntropy(256) + mnemonic, _ := bip39.NewMnemonic(entropy) + + // Generate a Bip32 HD wallet for the mnemonic and a user supplied password + seed := bip39.NewSeed(mnemonic, "Secret Passphrase") + + masterKey, _ := bip32.NewMasterKey(seed) + publicKey := masterKey.PublicKey() + + // Display mnemonic and keys + fmt.Println("Mnemonic: ", mnemonic) + fmt.Println("Master private key: ", masterKey) + fmt.Println("Master public key: ", publicKey) +} +``` + +## Credits + +Wordlists are from the [bip39 spec](https://github.com/bitcoin/bips/tree/master/bip-0039). + +Test vectors are from the standard Python BIP0039 implementation from the +Trezor team: [https://github.com/trezor/python-mnemonic](https://github.com/trezor/python-mnemonic) diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/bip39.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/bip39.go new file mode 100644 index 0000000000..cd19b40e67 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/bip39.go @@ -0,0 +1,408 @@ +// Package bip39 is the Golang implementation of the BIP39 spec. +// +// The official BIP39 spec can be found at +// https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki +package bip39 + +import ( + "bytes" + "crypto/sha256" + "crypto/sha512" + "encoding/binary" + "errors" + "fmt" + "math/big" + "strings" + "sync" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/bip39/wordlists" + + "github.com/skycoin/skycoin/src/cipher/pbkdf2" +) + +var ( + // Some bitwise operands for working with big.Ints + last11BitsMask = big.NewInt(2047) + shift11BitsMask = big.NewInt(2048) + bigOne = big.NewInt(1) + bigTwo = big.NewInt(2) + + // used to isolate the checksum bits from the entropy+checksum byte array + wordLengthChecksumMasksMapping = map[int]*big.Int{ + 12: big.NewInt(15), + 15: big.NewInt(31), + 18: big.NewInt(63), + 21: big.NewInt(127), + 24: big.NewInt(255), + } + // used to use only the desired x of 8 available checksum bits. + // 256 bit (word length 24) requires all 8 bits of the checksum, + // and thus no shifting is needed for it (we would get a divByZero crash if we did) + wordLengthChecksumShiftMapping = map[int]*big.Int{ + 12: big.NewInt(16), + 15: big.NewInt(8), + 18: big.NewInt(4), + 21: big.NewInt(2), + } + + // wordList is the set of words to use + wordList []string + + // wordMap is a reverse lookup map for wordList + wordMap map[string]int + + // wordListMutex is held when changing wordList + // TODO -- make wordList non-global + wordListMutex sync.Mutex +) + +var ( + // ErrInvalidEntropyLength is returned when trying to use an entropy set with + // an invalid size. + ErrInvalidEntropyLength = errors.New("Entropy length must be [128, 256] and a multiple of 32") + + // ErrChecksumIncorrect is returned when entropy has the incorrect checksum. + ErrChecksumIncorrect = errors.New("Mnemonic checksum incorrect") + + // ErrSurroundingWhitespace is returned if a mnemonic sentence has extra whitespace around it + ErrSurroundingWhitespace = errors.New("Mnemonic has extra whitespace around it") + + // ErrInvalidSeparator is returned if the words in a mnemonic sentence are not separated by a single ASCII space + ErrInvalidSeparator = errors.New("Mnemonic must be separated by single spaces") + + // ErrUnknownWord is returned if a mnemonic sentence contains an unrecognized word + ErrUnknownWord = errors.New("Mnemonic contains an unrecognized word") + + // ErrInvalidNumberOfWords is returned if a mnemonic sentence does not have 12, 15, 18, 21 or 24 words + ErrInvalidNumberOfWords = errors.New("Mnemonic must have 12, 15, 18, 21 or 24 words") +) + +func init() { + setWordList(wordlists.English) +} + +// setWordList sets the list of words to use for mnemonics. Currently the list +// that is set is used package-wide. +func setWordList(list []string) { + wordListMutex.Lock() + defer wordListMutex.Unlock() + wordList = list + wordMap = map[string]int{} + for i, v := range wordList { + wordMap[v] = i + } +} + +// getWordList gets the list of words to use for mnemonics. +func getWordList() []string { + wordListMutex.Lock() + defer wordListMutex.Unlock() + return wordList +} + +// getWordIndex gets word index in wordMap. +func getWordIndex(word string) (int, bool) { + wordListMutex.Lock() + defer wordListMutex.Unlock() + idx, ok := wordMap[word] + return idx, ok +} + +// DefaultMnemonicEntropyBitSize is the default bit size for NewDefaultMnemonic's entropy +// TODO -- make 24 word seeds default? (256 bits entropy - recommended for HD wallets) +const DefaultMnemonicEntropyBitSize = 128 + +// NewDefaultMnemonic returns a generated mnemonic using entropy with bitSize 128 +func NewDefaultMnemonic() (string, error) { + entropy, err := NewEntropy(DefaultMnemonicEntropyBitSize) + if err != nil { + return "", err + } + + return NewMnemonic(entropy) +} + +// MustNewDefaultMnemonic returns a generated mnemonic using entropy with bitSize 128 and panics if there is an error +func MustNewDefaultMnemonic() string { + seed, err := NewDefaultMnemonic() + if err != nil { + panic(err) + } + return seed +} + +// NewEntropy will create random entropy bytes +// so long as the requested size bitSize is an appropriate size. +// +// bitSize has to be a multiple of 32 and be within the inclusive range of {128, 256} +func NewEntropy(bitSize int) ([]byte, error) { + err := validateEntropyBitSize(bitSize) + if err != nil { + return nil, err + } + + entropy := cipher.RandByte(bitSize / 8) + return entropy, err +} + +// EntropyFromMnemonic takes a mnemonic generated by this library, +// and returns the input entropy used to generate the given mnemonic. +// An error is returned if the given mnemonic is invalid. +func EntropyFromMnemonic(mnemonic string) ([]byte, error) { + words, err := splitMnemonicWords(mnemonic) + if err != nil { + return nil, err + } + + // Decode the words into a big.Int. + b := big.NewInt(0) + for _, v := range words { + index, found := wordMap[v] + if !found { + // This should have been caught by splitMnemonicWords() + panic(fmt.Sprintf("word %q not found in reverse map", v)) + } + var wordBytes [2]byte + binary.BigEndian.PutUint16(wordBytes[:], uint16(index)) + b = b.Mul(b, shift11BitsMask) + b = b.Or(b, big.NewInt(0).SetBytes(wordBytes[:])) + } + + // Build and add the checksum to the big.Int. + checksum := big.NewInt(0) + checksumMask := wordLengthChecksumMasksMapping[len(words)] + checksum = checksum.And(b, checksumMask) + + b.Div(b, big.NewInt(0).Add(checksumMask, bigOne)) + + // The entropy is the underlying bytes of the big.Int. Any upper bytes of + // all 0's are not returned so we pad the beginning of the slice with empty + // bytes if necessary. + entropy := b.Bytes() + entropy = padByteSlice(entropy, len(words)/3*4) + + // Generate the checksum and compare with the one we got from the mnemonic. + entropyChecksumBytes := computeChecksum(entropy) + entropyChecksum := big.NewInt(int64(entropyChecksumBytes[0])) + if l := len(words); l != 24 { + checksumShift := wordLengthChecksumShiftMapping[l] + entropyChecksum.Div(entropyChecksum, checksumShift) + } + + if checksum.Cmp(entropyChecksum) != 0 { + return nil, ErrChecksumIncorrect + } + + return entropy, nil +} + +// NewMnemonic will return a string consisting of the mnemonic words for +// the given entropy. +// If the provide entropy is invalid, an error will be returned. +func NewMnemonic(entropy []byte) (string, error) { + // Compute some lengths for convenience. + entropyBitLength := len(entropy) * 8 + checksumBitLength := entropyBitLength / 32 + sentenceLength := (entropyBitLength + checksumBitLength) / 11 + + // Validate that the requested size is supported. + err := validateEntropyBitSize(entropyBitLength) + if err != nil { + return "", err + } + + // Add checksum to entropy. + entropy = addChecksum(entropy) + + // Break entropy up into sentenceLength chunks of 11 bits. + // For each word AND mask the rightmost 11 bits and find the word at that index. + // Then bitshift entropy 11 bits right and repeat. + // Add to the last empty slot so we can work with LSBs instead of MSB. + + // Entropy as an int so we can bitmask without worrying about bytes slices. + entropyInt := new(big.Int).SetBytes(entropy) + + // Slice to hold words in. + words := make([]string, sentenceLength) + + // Throw away big.Int for AND masking. + word := big.NewInt(0) + + for i := sentenceLength - 1; i >= 0; i-- { + // Get 11 right most bits and bitshift 11 to the right for next time. + word.And(entropyInt, last11BitsMask) + entropyInt.Div(entropyInt, shift11BitsMask) + + // Get the bytes representing the 11 bits as a 2 byte slice. + wordBytes := padByteSlice(word.Bytes(), 2) + + // Convert bytes to an index and add that word to the list. + words[i] = wordList[binary.BigEndian.Uint16(wordBytes)] + } + + return strings.Join(words, " "), nil +} + +// NewSeed creates a hashed seed output given the mnemonic string and a password. +// An error is returned if the mnemonic is not valid. +func NewSeed(mnemonic string, password string) ([]byte, error) { + if err := ValidateMnemonic(mnemonic); err != nil { + return nil, err + } + + return newSeed(mnemonic, password), nil +} + +// newSeed creates a hashed seed output given a provided string and password. +// No checking is performed to validate that the string provided is a valid mnemonic. +func newSeed(mnemonic, password string) []byte { + return pbkdf2.Key([]byte(mnemonic), []byte("mnemonic"+password), 2048, 64, sha512.New) +} + +// ValidateMnemonic returns an error if a mnemonic is invalid. It can be invalid +// for these reasons: +// - Number of words not a multiple of 3 and not at least 12 or at most 24 words +// - Words are not separated by exactly one ascii space +// - Mnemonic string has leading or trailing whitespace +// - Any word is not present in the wordlist +// - The mnemonic checksum is incorrect +// Note: this only works on ascii wordlists. Japanese, Chinese etc are not supported yet. +func ValidateMnemonic(mnemonic string) error { + words, err := splitMnemonicWords(mnemonic) + if err != nil { + return err + } + + if !isMnemonicChecksumValid(words) { + return ErrChecksumIncorrect + } + + return nil +} + +// splitMnemonicWords attempts to verify that the provided mnemonic is valid. +// Validity is determined by both the number of words being appropriate, +// and that all the words in the mnemonic are present in the word list. +func splitMnemonicWords(mnemonic string) ([]string, error) { + // Make sure no leading/trailing whitespace + if mnemonic != strings.TrimSpace(mnemonic) { + return nil, ErrSurroundingWhitespace + } + + // Create a list of all the words in the mnemonic sentence + words := strings.Split(mnemonic, " ") + + // Detect duplicate whitespace + for _, w := range words { + if w == "" { + return nil, ErrInvalidSeparator + } + } + + numOfWords := len(words) + + // The number of words should be 12, 15, 18, 21 or 24 + if numOfWords%3 != 0 || numOfWords < 12 || numOfWords > 24 { + return nil, ErrInvalidNumberOfWords + } + + // Check if all words belong in the wordlist + for _, word := range words { + if _, ok := wordMap[word]; !ok { + return nil, ErrUnknownWord + } + } + + return words, nil +} + +// isMnemonicChecksumValid validates the checksum value of a mnemonic +func isMnemonicChecksumValid(words []string) bool { + if len(words)%3 != 0 || len(words) < 12 || len(words) > 24 { + panic("invalid number of words") // caller should validate words before passing to this function + } + + var ( + entropyBitSize = len(words) * 11 + checksumBitSize = entropyBitSize % 32 + fullByteSize = (entropyBitSize-checksumBitSize)/8 + 1 + checksumByteSize = fullByteSize - (fullByteSize % 4) + ) + + // Convert word indices to a big.Int representing the entropy. + checksummedEntropy := big.NewInt(0) + modulo := big.NewInt(2048) + for _, v := range words { + index := big.NewInt(int64(wordMap[v])) + checksummedEntropy.Mul(checksummedEntropy, modulo) + checksummedEntropy.Add(checksummedEntropy, index) + } + + // Calculate the unchecksummed entropy so we can validate that the checksum is + // correct. + checksumModulo := big.NewInt(0).Exp(bigTwo, big.NewInt(int64(checksumBitSize)), nil) + rawEntropy := big.NewInt(0).Div(checksummedEntropy, checksumModulo) + + // Convert big.Ints to byte padded byte slices. + rawEntropyBytes := padByteSlice(rawEntropy.Bytes(), checksumByteSize) + checksummedEntropyBytes := padByteSlice(checksummedEntropy.Bytes(), fullByteSize) + + // Validate that the checksum is correct. + newChecksummedEntropyBytes := padByteSlice(addChecksum(rawEntropyBytes), fullByteSize) + return bytes.Equal(checksummedEntropyBytes, newChecksummedEntropyBytes) +} + +// Appends to data the first (len(data) / 32)bits of the result of sha256(data) +// Currently only supports data up to 32 bytes +func addChecksum(data []byte) []byte { + // Get first byte of sha256 + hash := computeChecksum(data) + firstChecksumByte := hash[0] + + // len() is in bytes so we divide by 4 + checksumBitLength := uint(len(data) / 4) + + // For each bit of check sum we want we shift the data one the left + // and then set the (new) right most bit equal to checksum bit at that index + // staring from the left + dataBigInt := new(big.Int).SetBytes(data) + for i := uint(0); i < checksumBitLength; i++ { + // Bitshift 1 left + dataBigInt.Mul(dataBigInt, bigTwo) + + // Set rightmost bit if leftmost checksum bit is set + if uint8(firstChecksumByte&(1<<(7-i))) > 0 { + dataBigInt.Or(dataBigInt, bigOne) + } + } + + return dataBigInt.Bytes() +} + +func computeChecksum(data []byte) []byte { + hasher := sha256.New() + hasher.Write(data) //nolint:errcheck + return hasher.Sum(nil) +} + +// validateEntropyBitSize ensures that entropy is the correct size for being a +// mnemonic. +func validateEntropyBitSize(bitSize int) error { + if (bitSize%32) != 0 || bitSize < 128 || bitSize > 256 { + return ErrInvalidEntropyLength + } + return nil +} + +// padByteSlice returns a byte slice of the given size with contents of the +// given slice left padded and any empty spaces filled with 0's. +func padByteSlice(slice []byte, length int) []byte { + offset := length - len(slice) + if offset <= 0 { + return slice + } + newSlice := make([]byte, length) + copy(newSlice[offset:], slice) + return newSlice +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/chinese_simplified.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/chinese_simplified.go new file mode 100644 index 0000000000..0ee2972704 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/chinese_simplified.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_simplified.txt + // $ crc32 chinese_simplified.txt + // e3721bbf + checksum := crc32.ChecksumIEEE([]byte(chineseSimplified)) + if fmt.Sprintf("%x", checksum) != "e3721bbf" { + panic("chineseSimplified checksum invalid") + } +} + +// ChineseSimplified is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_simplified.txt +var ChineseSimplified = strings.Split(strings.TrimSpace(chineseSimplified), "\n") +var chineseSimplified = `的 +一 +是 +在 +不 +了 +有 +和 +人 +这 +中 +大 +为 +上 +个 +国 +我 +以 +要 +他 +时 +来 +用 +们 +生 +到 +作 +地 +于 +出 +就 +分 +对 +成 +会 +可 +主 +发 +年 +动 +同 +工 +也 +能 +下 +过 +子 +说 +产 +种 +面 +而 +方 +后 +多 +定 +行 +学 +法 +所 +民 +得 +经 +十 +三 +之 +进 +着 +等 +部 +度 +家 +电 +力 +里 +如 +水 +化 +高 +自 +二 +理 +起 +小 +物 +现 +实 +加 +量 +都 +两 +体 +制 +机 +当 +使 +点 +从 +业 +本 +去 +把 +性 +好 +应 +开 +它 +合 +还 +因 +由 +其 +些 +然 +前 +外 +天 +政 +四 +日 +那 +社 +义 +事 +平 +形 +相 +全 +表 +间 +样 +与 +关 +各 +重 +新 +线 +内 +数 +正 +心 +反 +你 +明 +看 +原 +又 +么 +利 +比 +或 +但 +质 +气 +第 +向 +道 +命 +此 +变 +条 +只 +没 +结 +解 +问 +意 +建 +月 +公 +无 +系 +军 +很 +情 +者 +最 +立 +代 +想 +已 +通 +并 +提 +直 +题 +党 +程 +展 +五 +果 +料 +象 +员 +革 +位 +入 +常 +文 +总 +次 +品 +式 +活 +设 +及 +管 +特 +件 +长 +求 +老 +头 +基 +资 +边 +流 +路 +级 +少 +图 +山 +统 +接 +知 +较 +将 +组 +见 +计 +别 +她 +手 +角 +期 +根 +论 +运 +农 +指 +几 +九 +区 +强 +放 +决 +西 +被 +干 +做 +必 +战 +先 +回 +则 +任 +取 +据 +处 +队 +南 +给 +色 +光 +门 +即 +保 +治 +北 +造 +百 +规 +热 +领 +七 +海 +口 +东 +导 +器 +压 +志 +世 +金 +增 +争 +济 +阶 +油 +思 +术 +极 +交 +受 +联 +什 +认 +六 +共 +权 +收 +证 +改 +清 +美 +再 +采 +转 +更 +单 +风 +切 +打 +白 +教 +速 +花 +带 +安 +场 +身 +车 +例 +真 +务 +具 +万 +每 +目 +至 +达 +走 +积 +示 +议 +声 +报 +斗 +完 +类 +八 +离 +华 +名 +确 +才 +科 +张 +信 +马 +节 +话 +米 +整 +空 +元 +况 +今 +集 +温 +传 +土 +许 +步 +群 +广 +石 +记 +需 +段 +研 +界 +拉 +林 +律 +叫 +且 +究 +观 +越 +织 +装 +影 +算 +低 +持 +音 +众 +书 +布 +复 +容 +儿 +须 +际 +商 +非 +验 +连 +断 +深 +难 +近 +矿 +千 +周 +委 +素 +技 +备 +半 +办 +青 +省 +列 +习 +响 +约 +支 +般 +史 +感 +劳 +便 +团 +往 +酸 +历 +市 +克 +何 +除 +消 +构 +府 +称 +太 +准 +精 +值 +号 +率 +族 +维 +划 +选 +标 +写 +存 +候 +毛 +亲 +快 +效 +斯 +院 +查 +江 +型 +眼 +王 +按 +格 +养 +易 +置 +派 +层 +片 +始 +却 +专 +状 +育 +厂 +京 +识 +适 +属 +圆 +包 +火 +住 +调 +满 +县 +局 +照 +参 +红 +细 +引 +听 +该 +铁 +价 +严 +首 +底 +液 +官 +德 +随 +病 +苏 +失 +尔 +死 +讲 +配 +女 +黄 +推 +显 +谈 +罪 +神 +艺 +呢 +席 +含 +企 +望 +密 +批 +营 +项 +防 +举 +球 +英 +氧 +势 +告 +李 +台 +落 +木 +帮 +轮 +破 +亚 +师 +围 +注 +远 +字 +材 +排 +供 +河 +态 +封 +另 +施 +减 +树 +溶 +怎 +止 +案 +言 +士 +均 +武 +固 +叶 +鱼 +波 +视 +仅 +费 +紧 +爱 +左 +章 +早 +朝 +害 +续 +轻 +服 +试 +食 +充 +兵 +源 +判 +护 +司 +足 +某 +练 +差 +致 +板 +田 +降 +黑 +犯 +负 +击 +范 +继 +兴 +似 +余 +坚 +曲 +输 +修 +故 +城 +夫 +够 +送 +笔 +船 +占 +右 +财 +吃 +富 +春 +职 +觉 +汉 +画 +功 +巴 +跟 +虽 +杂 +飞 +检 +吸 +助 +升 +阳 +互 +初 +创 +抗 +考 +投 +坏 +策 +古 +径 +换 +未 +跑 +留 +钢 +曾 +端 +责 +站 +简 +述 +钱 +副 +尽 +帝 +射 +草 +冲 +承 +独 +令 +限 +阿 +宣 +环 +双 +请 +超 +微 +让 +控 +州 +良 +轴 +找 +否 +纪 +益 +依 +优 +顶 +础 +载 +倒 +房 +突 +坐 +粉 +敌 +略 +客 +袁 +冷 +胜 +绝 +析 +块 +剂 +测 +丝 +协 +诉 +念 +陈 +仍 +罗 +盐 +友 +洋 +错 +苦 +夜 +刑 +移 +频 +逐 +靠 +混 +母 +短 +皮 +终 +聚 +汽 +村 +云 +哪 +既 +距 +卫 +停 +烈 +央 +察 +烧 +迅 +境 +若 +印 +洲 +刻 +括 +激 +孔 +搞 +甚 +室 +待 +核 +校 +散 +侵 +吧 +甲 +游 +久 +菜 +味 +旧 +模 +湖 +货 +损 +预 +阻 +毫 +普 +稳 +乙 +妈 +植 +息 +扩 +银 +语 +挥 +酒 +守 +拿 +序 +纸 +医 +缺 +雨 +吗 +针 +刘 +啊 +急 +唱 +误 +训 +愿 +审 +附 +获 +茶 +鲜 +粮 +斤 +孩 +脱 +硫 +肥 +善 +龙 +演 +父 +渐 +血 +欢 +械 +掌 +歌 +沙 +刚 +攻 +谓 +盾 +讨 +晚 +粒 +乱 +燃 +矛 +乎 +杀 +药 +宁 +鲁 +贵 +钟 +煤 +读 +班 +伯 +香 +介 +迫 +句 +丰 +培 +握 +兰 +担 +弦 +蛋 +沉 +假 +穿 +执 +答 +乐 +谁 +顺 +烟 +缩 +征 +脸 +喜 +松 +脚 +困 +异 +免 +背 +星 +福 +买 +染 +井 +概 +慢 +怕 +磁 +倍 +祖 +皇 +促 +静 +补 +评 +翻 +肉 +践 +尼 +衣 +宽 +扬 +棉 +希 +伤 +操 +垂 +秋 +宜 +氢 +套 +督 +振 +架 +亮 +末 +宪 +庆 +编 +牛 +触 +映 +雷 +销 +诗 +座 +居 +抓 +裂 +胞 +呼 +娘 +景 +威 +绿 +晶 +厚 +盟 +衡 +鸡 +孙 +延 +危 +胶 +屋 +乡 +临 +陆 +顾 +掉 +呀 +灯 +岁 +措 +束 +耐 +剧 +玉 +赵 +跳 +哥 +季 +课 +凯 +胡 +额 +款 +绍 +卷 +齐 +伟 +蒸 +殖 +永 +宗 +苗 +川 +炉 +岩 +弱 +零 +杨 +奏 +沿 +露 +杆 +探 +滑 +镇 +饭 +浓 +航 +怀 +赶 +库 +夺 +伊 +灵 +税 +途 +灭 +赛 +归 +召 +鼓 +播 +盘 +裁 +险 +康 +唯 +录 +菌 +纯 +借 +糖 +盖 +横 +符 +私 +努 +堂 +域 +枪 +润 +幅 +哈 +竟 +熟 +虫 +泽 +脑 +壤 +碳 +欧 +遍 +侧 +寨 +敢 +彻 +虑 +斜 +薄 +庭 +纳 +弹 +饲 +伸 +折 +麦 +湿 +暗 +荷 +瓦 +塞 +床 +筑 +恶 +户 +访 +塔 +奇 +透 +梁 +刀 +旋 +迹 +卡 +氯 +遇 +份 +毒 +泥 +退 +洗 +摆 +灰 +彩 +卖 +耗 +夏 +择 +忙 +铜 +献 +硬 +予 +繁 +圈 +雪 +函 +亦 +抽 +篇 +阵 +阴 +丁 +尺 +追 +堆 +雄 +迎 +泛 +爸 +楼 +避 +谋 +吨 +野 +猪 +旗 +累 +偏 +典 +馆 +索 +秦 +脂 +潮 +爷 +豆 +忽 +托 +惊 +塑 +遗 +愈 +朱 +替 +纤 +粗 +倾 +尚 +痛 +楚 +谢 +奋 +购 +磨 +君 +池 +旁 +碎 +骨 +监 +捕 +弟 +暴 +割 +贯 +殊 +释 +词 +亡 +壁 +顿 +宝 +午 +尘 +闻 +揭 +炮 +残 +冬 +桥 +妇 +警 +综 +招 +吴 +付 +浮 +遭 +徐 +您 +摇 +谷 +赞 +箱 +隔 +订 +男 +吹 +园 +纷 +唐 +败 +宋 +玻 +巨 +耕 +坦 +荣 +闭 +湾 +键 +凡 +驻 +锅 +救 +恩 +剥 +凝 +碱 +齿 +截 +炼 +麻 +纺 +禁 +废 +盛 +版 +缓 +净 +睛 +昌 +婚 +涉 +筒 +嘴 +插 +岸 +朗 +庄 +街 +藏 +姑 +贸 +腐 +奴 +啦 +惯 +乘 +伙 +恢 +匀 +纱 +扎 +辩 +耳 +彪 +臣 +亿 +璃 +抵 +脉 +秀 +萨 +俄 +网 +舞 +店 +喷 +纵 +寸 +汗 +挂 +洪 +贺 +闪 +柬 +爆 +烯 +津 +稻 +墙 +软 +勇 +像 +滚 +厘 +蒙 +芳 +肯 +坡 +柱 +荡 +腿 +仪 +旅 +尾 +轧 +冰 +贡 +登 +黎 +削 +钻 +勒 +逃 +障 +氨 +郭 +峰 +币 +港 +伏 +轨 +亩 +毕 +擦 +莫 +刺 +浪 +秘 +援 +株 +健 +售 +股 +岛 +甘 +泡 +睡 +童 +铸 +汤 +阀 +休 +汇 +舍 +牧 +绕 +炸 +哲 +磷 +绩 +朋 +淡 +尖 +启 +陷 +柴 +呈 +徒 +颜 +泪 +稍 +忘 +泵 +蓝 +拖 +洞 +授 +镜 +辛 +壮 +锋 +贫 +虚 +弯 +摩 +泰 +幼 +廷 +尊 +窗 +纲 +弄 +隶 +疑 +氏 +宫 +姐 +震 +瑞 +怪 +尤 +琴 +循 +描 +膜 +违 +夹 +腰 +缘 +珠 +穷 +森 +枝 +竹 +沟 +催 +绳 +忆 +邦 +剩 +幸 +浆 +栏 +拥 +牙 +贮 +礼 +滤 +钠 +纹 +罢 +拍 +咱 +喊 +袖 +埃 +勤 +罚 +焦 +潜 +伍 +墨 +欲 +缝 +姓 +刊 +饱 +仿 +奖 +铝 +鬼 +丽 +跨 +默 +挖 +链 +扫 +喝 +袋 +炭 +污 +幕 +诸 +弧 +励 +梅 +奶 +洁 +灾 +舟 +鉴 +苯 +讼 +抱 +毁 +懂 +寒 +智 +埔 +寄 +届 +跃 +渡 +挑 +丹 +艰 +贝 +碰 +拔 +爹 +戴 +码 +梦 +芽 +熔 +赤 +渔 +哭 +敬 +颗 +奔 +铅 +仲 +虎 +稀 +妹 +乏 +珍 +申 +桌 +遵 +允 +隆 +螺 +仓 +魏 +锐 +晓 +氮 +兼 +隐 +碍 +赫 +拨 +忠 +肃 +缸 +牵 +抢 +博 +巧 +壳 +兄 +杜 +讯 +诚 +碧 +祥 +柯 +页 +巡 +矩 +悲 +灌 +龄 +伦 +票 +寻 +桂 +铺 +圣 +恐 +恰 +郑 +趣 +抬 +荒 +腾 +贴 +柔 +滴 +猛 +阔 +辆 +妻 +填 +撤 +储 +签 +闹 +扰 +紫 +砂 +递 +戏 +吊 +陶 +伐 +喂 +疗 +瓶 +婆 +抚 +臂 +摸 +忍 +虾 +蜡 +邻 +胸 +巩 +挤 +偶 +弃 +槽 +劲 +乳 +邓 +吉 +仁 +烂 +砖 +租 +乌 +舰 +伴 +瓜 +浅 +丙 +暂 +燥 +橡 +柳 +迷 +暖 +牌 +秧 +胆 +详 +簧 +踏 +瓷 +谱 +呆 +宾 +糊 +洛 +辉 +愤 +竞 +隙 +怒 +粘 +乃 +绪 +肩 +籍 +敏 +涂 +熙 +皆 +侦 +悬 +掘 +享 +纠 +醒 +狂 +锁 +淀 +恨 +牲 +霸 +爬 +赏 +逆 +玩 +陵 +祝 +秒 +浙 +貌 +役 +彼 +悉 +鸭 +趋 +凤 +晨 +畜 +辈 +秩 +卵 +署 +梯 +炎 +滩 +棋 +驱 +筛 +峡 +冒 +啥 +寿 +译 +浸 +泉 +帽 +迟 +硅 +疆 +贷 +漏 +稿 +冠 +嫩 +胁 +芯 +牢 +叛 +蚀 +奥 +鸣 +岭 +羊 +凭 +串 +塘 +绘 +酵 +融 +盆 +锡 +庙 +筹 +冻 +辅 +摄 +袭 +筋 +拒 +僚 +旱 +钾 +鸟 +漆 +沈 +眉 +疏 +添 +棒 +穗 +硝 +韩 +逼 +扭 +侨 +凉 +挺 +碗 +栽 +炒 +杯 +患 +馏 +劝 +豪 +辽 +勃 +鸿 +旦 +吏 +拜 +狗 +埋 +辊 +掩 +饮 +搬 +骂 +辞 +勾 +扣 +估 +蒋 +绒 +雾 +丈 +朵 +姆 +拟 +宇 +辑 +陕 +雕 +偿 +蓄 +崇 +剪 +倡 +厅 +咬 +驶 +薯 +刷 +斥 +番 +赋 +奉 +佛 +浇 +漫 +曼 +扇 +钙 +桃 +扶 +仔 +返 +俗 +亏 +腔 +鞋 +棱 +覆 +框 +悄 +叔 +撞 +骗 +勘 +旺 +沸 +孤 +吐 +孟 +渠 +屈 +疾 +妙 +惜 +仰 +狠 +胀 +谐 +抛 +霉 +桑 +岗 +嘛 +衰 +盗 +渗 +脏 +赖 +涌 +甜 +曹 +阅 +肌 +哩 +厉 +烃 +纬 +毅 +昨 +伪 +症 +煮 +叹 +钉 +搭 +茎 +笼 +酷 +偷 +弓 +锥 +恒 +杰 +坑 +鼻 +翼 +纶 +叙 +狱 +逮 +罐 +络 +棚 +抑 +膨 +蔬 +寺 +骤 +穆 +冶 +枯 +册 +尸 +凸 +绅 +坯 +牺 +焰 +轰 +欣 +晋 +瘦 +御 +锭 +锦 +丧 +旬 +锻 +垄 +搜 +扑 +邀 +亭 +酯 +迈 +舒 +脆 +酶 +闲 +忧 +酚 +顽 +羽 +涨 +卸 +仗 +陪 +辟 +惩 +杭 +姚 +肚 +捉 +飘 +漂 +昆 +欺 +吾 +郎 +烷 +汁 +呵 +饰 +萧 +雅 +邮 +迁 +燕 +撒 +姻 +赴 +宴 +烦 +债 +帐 +斑 +铃 +旨 +醇 +董 +饼 +雏 +姿 +拌 +傅 +腹 +妥 +揉 +贤 +拆 +歪 +葡 +胺 +丢 +浩 +徽 +昂 +垫 +挡 +览 +贪 +慰 +缴 +汪 +慌 +冯 +诺 +姜 +谊 +凶 +劣 +诬 +耀 +昏 +躺 +盈 +骑 +乔 +溪 +丛 +卢 +抹 +闷 +咨 +刮 +驾 +缆 +悟 +摘 +铒 +掷 +颇 +幻 +柄 +惠 +惨 +佳 +仇 +腊 +窝 +涤 +剑 +瞧 +堡 +泼 +葱 +罩 +霍 +捞 +胎 +苍 +滨 +俩 +捅 +湘 +砍 +霞 +邵 +萄 +疯 +淮 +遂 +熊 +粪 +烘 +宿 +档 +戈 +驳 +嫂 +裕 +徙 +箭 +捐 +肠 +撑 +晒 +辨 +殿 +莲 +摊 +搅 +酱 +屏 +疫 +哀 +蔡 +堵 +沫 +皱 +畅 +叠 +阁 +莱 +敲 +辖 +钩 +痕 +坝 +巷 +饿 +祸 +丘 +玄 +溜 +曰 +逻 +彭 +尝 +卿 +妨 +艇 +吞 +韦 +怨 +矮 +歇 +` diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/chinese_traditional.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/chinese_traditional.go new file mode 100644 index 0000000000..83812cee5f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/chinese_traditional.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_traditional.txt + // $ crc32 chinese_traditional.txt + // 3c20b443 + checksum := crc32.ChecksumIEEE([]byte(chineseTraditional)) + if fmt.Sprintf("%x", checksum) != "3c20b443" { + panic("chineseTraditional checksum invalid") + } +} + +// ChineseTraditional is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_traditional.txt +var ChineseTraditional = strings.Split(strings.TrimSpace(chineseTraditional), "\n") +var chineseTraditional = `的 +一 +是 +在 +不 +了 +有 +和 +人 +這 +中 +大 +為 +上 +個 +國 +我 +以 +要 +他 +時 +來 +用 +們 +生 +到 +作 +地 +於 +出 +就 +分 +對 +成 +會 +可 +主 +發 +年 +動 +同 +工 +也 +能 +下 +過 +子 +說 +產 +種 +面 +而 +方 +後 +多 +定 +行 +學 +法 +所 +民 +得 +經 +十 +三 +之 +進 +著 +等 +部 +度 +家 +電 +力 +裡 +如 +水 +化 +高 +自 +二 +理 +起 +小 +物 +現 +實 +加 +量 +都 +兩 +體 +制 +機 +當 +使 +點 +從 +業 +本 +去 +把 +性 +好 +應 +開 +它 +合 +還 +因 +由 +其 +些 +然 +前 +外 +天 +政 +四 +日 +那 +社 +義 +事 +平 +形 +相 +全 +表 +間 +樣 +與 +關 +各 +重 +新 +線 +內 +數 +正 +心 +反 +你 +明 +看 +原 +又 +麼 +利 +比 +或 +但 +質 +氣 +第 +向 +道 +命 +此 +變 +條 +只 +沒 +結 +解 +問 +意 +建 +月 +公 +無 +系 +軍 +很 +情 +者 +最 +立 +代 +想 +已 +通 +並 +提 +直 +題 +黨 +程 +展 +五 +果 +料 +象 +員 +革 +位 +入 +常 +文 +總 +次 +品 +式 +活 +設 +及 +管 +特 +件 +長 +求 +老 +頭 +基 +資 +邊 +流 +路 +級 +少 +圖 +山 +統 +接 +知 +較 +將 +組 +見 +計 +別 +她 +手 +角 +期 +根 +論 +運 +農 +指 +幾 +九 +區 +強 +放 +決 +西 +被 +幹 +做 +必 +戰 +先 +回 +則 +任 +取 +據 +處 +隊 +南 +給 +色 +光 +門 +即 +保 +治 +北 +造 +百 +規 +熱 +領 +七 +海 +口 +東 +導 +器 +壓 +志 +世 +金 +增 +爭 +濟 +階 +油 +思 +術 +極 +交 +受 +聯 +什 +認 +六 +共 +權 +收 +證 +改 +清 +美 +再 +採 +轉 +更 +單 +風 +切 +打 +白 +教 +速 +花 +帶 +安 +場 +身 +車 +例 +真 +務 +具 +萬 +每 +目 +至 +達 +走 +積 +示 +議 +聲 +報 +鬥 +完 +類 +八 +離 +華 +名 +確 +才 +科 +張 +信 +馬 +節 +話 +米 +整 +空 +元 +況 +今 +集 +溫 +傳 +土 +許 +步 +群 +廣 +石 +記 +需 +段 +研 +界 +拉 +林 +律 +叫 +且 +究 +觀 +越 +織 +裝 +影 +算 +低 +持 +音 +眾 +書 +布 +复 +容 +兒 +須 +際 +商 +非 +驗 +連 +斷 +深 +難 +近 +礦 +千 +週 +委 +素 +技 +備 +半 +辦 +青 +省 +列 +習 +響 +約 +支 +般 +史 +感 +勞 +便 +團 +往 +酸 +歷 +市 +克 +何 +除 +消 +構 +府 +稱 +太 +準 +精 +值 +號 +率 +族 +維 +劃 +選 +標 +寫 +存 +候 +毛 +親 +快 +效 +斯 +院 +查 +江 +型 +眼 +王 +按 +格 +養 +易 +置 +派 +層 +片 +始 +卻 +專 +狀 +育 +廠 +京 +識 +適 +屬 +圓 +包 +火 +住 +調 +滿 +縣 +局 +照 +參 +紅 +細 +引 +聽 +該 +鐵 +價 +嚴 +首 +底 +液 +官 +德 +隨 +病 +蘇 +失 +爾 +死 +講 +配 +女 +黃 +推 +顯 +談 +罪 +神 +藝 +呢 +席 +含 +企 +望 +密 +批 +營 +項 +防 +舉 +球 +英 +氧 +勢 +告 +李 +台 +落 +木 +幫 +輪 +破 +亞 +師 +圍 +注 +遠 +字 +材 +排 +供 +河 +態 +封 +另 +施 +減 +樹 +溶 +怎 +止 +案 +言 +士 +均 +武 +固 +葉 +魚 +波 +視 +僅 +費 +緊 +愛 +左 +章 +早 +朝 +害 +續 +輕 +服 +試 +食 +充 +兵 +源 +判 +護 +司 +足 +某 +練 +差 +致 +板 +田 +降 +黑 +犯 +負 +擊 +范 +繼 +興 +似 +餘 +堅 +曲 +輸 +修 +故 +城 +夫 +夠 +送 +筆 +船 +佔 +右 +財 +吃 +富 +春 +職 +覺 +漢 +畫 +功 +巴 +跟 +雖 +雜 +飛 +檢 +吸 +助 +昇 +陽 +互 +初 +創 +抗 +考 +投 +壞 +策 +古 +徑 +換 +未 +跑 +留 +鋼 +曾 +端 +責 +站 +簡 +述 +錢 +副 +盡 +帝 +射 +草 +衝 +承 +獨 +令 +限 +阿 +宣 +環 +雙 +請 +超 +微 +讓 +控 +州 +良 +軸 +找 +否 +紀 +益 +依 +優 +頂 +礎 +載 +倒 +房 +突 +坐 +粉 +敵 +略 +客 +袁 +冷 +勝 +絕 +析 +塊 +劑 +測 +絲 +協 +訴 +念 +陳 +仍 +羅 +鹽 +友 +洋 +錯 +苦 +夜 +刑 +移 +頻 +逐 +靠 +混 +母 +短 +皮 +終 +聚 +汽 +村 +雲 +哪 +既 +距 +衛 +停 +烈 +央 +察 +燒 +迅 +境 +若 +印 +洲 +刻 +括 +激 +孔 +搞 +甚 +室 +待 +核 +校 +散 +侵 +吧 +甲 +遊 +久 +菜 +味 +舊 +模 +湖 +貨 +損 +預 +阻 +毫 +普 +穩 +乙 +媽 +植 +息 +擴 +銀 +語 +揮 +酒 +守 +拿 +序 +紙 +醫 +缺 +雨 +嗎 +針 +劉 +啊 +急 +唱 +誤 +訓 +願 +審 +附 +獲 +茶 +鮮 +糧 +斤 +孩 +脫 +硫 +肥 +善 +龍 +演 +父 +漸 +血 +歡 +械 +掌 +歌 +沙 +剛 +攻 +謂 +盾 +討 +晚 +粒 +亂 +燃 +矛 +乎 +殺 +藥 +寧 +魯 +貴 +鐘 +煤 +讀 +班 +伯 +香 +介 +迫 +句 +豐 +培 +握 +蘭 +擔 +弦 +蛋 +沉 +假 +穿 +執 +答 +樂 +誰 +順 +煙 +縮 +徵 +臉 +喜 +松 +腳 +困 +異 +免 +背 +星 +福 +買 +染 +井 +概 +慢 +怕 +磁 +倍 +祖 +皇 +促 +靜 +補 +評 +翻 +肉 +踐 +尼 +衣 +寬 +揚 +棉 +希 +傷 +操 +垂 +秋 +宜 +氫 +套 +督 +振 +架 +亮 +末 +憲 +慶 +編 +牛 +觸 +映 +雷 +銷 +詩 +座 +居 +抓 +裂 +胞 +呼 +娘 +景 +威 +綠 +晶 +厚 +盟 +衡 +雞 +孫 +延 +危 +膠 +屋 +鄉 +臨 +陸 +顧 +掉 +呀 +燈 +歲 +措 +束 +耐 +劇 +玉 +趙 +跳 +哥 +季 +課 +凱 +胡 +額 +款 +紹 +卷 +齊 +偉 +蒸 +殖 +永 +宗 +苗 +川 +爐 +岩 +弱 +零 +楊 +奏 +沿 +露 +桿 +探 +滑 +鎮 +飯 +濃 +航 +懷 +趕 +庫 +奪 +伊 +靈 +稅 +途 +滅 +賽 +歸 +召 +鼓 +播 +盤 +裁 +險 +康 +唯 +錄 +菌 +純 +借 +糖 +蓋 +橫 +符 +私 +努 +堂 +域 +槍 +潤 +幅 +哈 +竟 +熟 +蟲 +澤 +腦 +壤 +碳 +歐 +遍 +側 +寨 +敢 +徹 +慮 +斜 +薄 +庭 +納 +彈 +飼 +伸 +折 +麥 +濕 +暗 +荷 +瓦 +塞 +床 +築 +惡 +戶 +訪 +塔 +奇 +透 +梁 +刀 +旋 +跡 +卡 +氯 +遇 +份 +毒 +泥 +退 +洗 +擺 +灰 +彩 +賣 +耗 +夏 +擇 +忙 +銅 +獻 +硬 +予 +繁 +圈 +雪 +函 +亦 +抽 +篇 +陣 +陰 +丁 +尺 +追 +堆 +雄 +迎 +泛 +爸 +樓 +避 +謀 +噸 +野 +豬 +旗 +累 +偏 +典 +館 +索 +秦 +脂 +潮 +爺 +豆 +忽 +托 +驚 +塑 +遺 +愈 +朱 +替 +纖 +粗 +傾 +尚 +痛 +楚 +謝 +奮 +購 +磨 +君 +池 +旁 +碎 +骨 +監 +捕 +弟 +暴 +割 +貫 +殊 +釋 +詞 +亡 +壁 +頓 +寶 +午 +塵 +聞 +揭 +炮 +殘 +冬 +橋 +婦 +警 +綜 +招 +吳 +付 +浮 +遭 +徐 +您 +搖 +谷 +贊 +箱 +隔 +訂 +男 +吹 +園 +紛 +唐 +敗 +宋 +玻 +巨 +耕 +坦 +榮 +閉 +灣 +鍵 +凡 +駐 +鍋 +救 +恩 +剝 +凝 +鹼 +齒 +截 +煉 +麻 +紡 +禁 +廢 +盛 +版 +緩 +淨 +睛 +昌 +婚 +涉 +筒 +嘴 +插 +岸 +朗 +莊 +街 +藏 +姑 +貿 +腐 +奴 +啦 +慣 +乘 +夥 +恢 +勻 +紗 +扎 +辯 +耳 +彪 +臣 +億 +璃 +抵 +脈 +秀 +薩 +俄 +網 +舞 +店 +噴 +縱 +寸 +汗 +掛 +洪 +賀 +閃 +柬 +爆 +烯 +津 +稻 +牆 +軟 +勇 +像 +滾 +厘 +蒙 +芳 +肯 +坡 +柱 +盪 +腿 +儀 +旅 +尾 +軋 +冰 +貢 +登 +黎 +削 +鑽 +勒 +逃 +障 +氨 +郭 +峰 +幣 +港 +伏 +軌 +畝 +畢 +擦 +莫 +刺 +浪 +秘 +援 +株 +健 +售 +股 +島 +甘 +泡 +睡 +童 +鑄 +湯 +閥 +休 +匯 +舍 +牧 +繞 +炸 +哲 +磷 +績 +朋 +淡 +尖 +啟 +陷 +柴 +呈 +徒 +顏 +淚 +稍 +忘 +泵 +藍 +拖 +洞 +授 +鏡 +辛 +壯 +鋒 +貧 +虛 +彎 +摩 +泰 +幼 +廷 +尊 +窗 +綱 +弄 +隸 +疑 +氏 +宮 +姐 +震 +瑞 +怪 +尤 +琴 +循 +描 +膜 +違 +夾 +腰 +緣 +珠 +窮 +森 +枝 +竹 +溝 +催 +繩 +憶 +邦 +剩 +幸 +漿 +欄 +擁 +牙 +貯 +禮 +濾 +鈉 +紋 +罷 +拍 +咱 +喊 +袖 +埃 +勤 +罰 +焦 +潛 +伍 +墨 +欲 +縫 +姓 +刊 +飽 +仿 +獎 +鋁 +鬼 +麗 +跨 +默 +挖 +鏈 +掃 +喝 +袋 +炭 +污 +幕 +諸 +弧 +勵 +梅 +奶 +潔 +災 +舟 +鑑 +苯 +訟 +抱 +毀 +懂 +寒 +智 +埔 +寄 +屆 +躍 +渡 +挑 +丹 +艱 +貝 +碰 +拔 +爹 +戴 +碼 +夢 +芽 +熔 +赤 +漁 +哭 +敬 +顆 +奔 +鉛 +仲 +虎 +稀 +妹 +乏 +珍 +申 +桌 +遵 +允 +隆 +螺 +倉 +魏 +銳 +曉 +氮 +兼 +隱 +礙 +赫 +撥 +忠 +肅 +缸 +牽 +搶 +博 +巧 +殼 +兄 +杜 +訊 +誠 +碧 +祥 +柯 +頁 +巡 +矩 +悲 +灌 +齡 +倫 +票 +尋 +桂 +鋪 +聖 +恐 +恰 +鄭 +趣 +抬 +荒 +騰 +貼 +柔 +滴 +猛 +闊 +輛 +妻 +填 +撤 +儲 +簽 +鬧 +擾 +紫 +砂 +遞 +戲 +吊 +陶 +伐 +餵 +療 +瓶 +婆 +撫 +臂 +摸 +忍 +蝦 +蠟 +鄰 +胸 +鞏 +擠 +偶 +棄 +槽 +勁 +乳 +鄧 +吉 +仁 +爛 +磚 +租 +烏 +艦 +伴 +瓜 +淺 +丙 +暫 +燥 +橡 +柳 +迷 +暖 +牌 +秧 +膽 +詳 +簧 +踏 +瓷 +譜 +呆 +賓 +糊 +洛 +輝 +憤 +競 +隙 +怒 +粘 +乃 +緒 +肩 +籍 +敏 +塗 +熙 +皆 +偵 +懸 +掘 +享 +糾 +醒 +狂 +鎖 +淀 +恨 +牲 +霸 +爬 +賞 +逆 +玩 +陵 +祝 +秒 +浙 +貌 +役 +彼 +悉 +鴨 +趨 +鳳 +晨 +畜 +輩 +秩 +卵 +署 +梯 +炎 +灘 +棋 +驅 +篩 +峽 +冒 +啥 +壽 +譯 +浸 +泉 +帽 +遲 +矽 +疆 +貸 +漏 +稿 +冠 +嫩 +脅 +芯 +牢 +叛 +蝕 +奧 +鳴 +嶺 +羊 +憑 +串 +塘 +繪 +酵 +融 +盆 +錫 +廟 +籌 +凍 +輔 +攝 +襲 +筋 +拒 +僚 +旱 +鉀 +鳥 +漆 +沈 +眉 +疏 +添 +棒 +穗 +硝 +韓 +逼 +扭 +僑 +涼 +挺 +碗 +栽 +炒 +杯 +患 +餾 +勸 +豪 +遼 +勃 +鴻 +旦 +吏 +拜 +狗 +埋 +輥 +掩 +飲 +搬 +罵 +辭 +勾 +扣 +估 +蔣 +絨 +霧 +丈 +朵 +姆 +擬 +宇 +輯 +陝 +雕 +償 +蓄 +崇 +剪 +倡 +廳 +咬 +駛 +薯 +刷 +斥 +番 +賦 +奉 +佛 +澆 +漫 +曼 +扇 +鈣 +桃 +扶 +仔 +返 +俗 +虧 +腔 +鞋 +棱 +覆 +框 +悄 +叔 +撞 +騙 +勘 +旺 +沸 +孤 +吐 +孟 +渠 +屈 +疾 +妙 +惜 +仰 +狠 +脹 +諧 +拋 +黴 +桑 +崗 +嘛 +衰 +盜 +滲 +臟 +賴 +湧 +甜 +曹 +閱 +肌 +哩 +厲 +烴 +緯 +毅 +昨 +偽 +症 +煮 +嘆 +釘 +搭 +莖 +籠 +酷 +偷 +弓 +錐 +恆 +傑 +坑 +鼻 +翼 +綸 +敘 +獄 +逮 +罐 +絡 +棚 +抑 +膨 +蔬 +寺 +驟 +穆 +冶 +枯 +冊 +屍 +凸 +紳 +坯 +犧 +焰 +轟 +欣 +晉 +瘦 +禦 +錠 +錦 +喪 +旬 +鍛 +壟 +搜 +撲 +邀 +亭 +酯 +邁 +舒 +脆 +酶 +閒 +憂 +酚 +頑 +羽 +漲 +卸 +仗 +陪 +闢 +懲 +杭 +姚 +肚 +捉 +飄 +漂 +昆 +欺 +吾 +郎 +烷 +汁 +呵 +飾 +蕭 +雅 +郵 +遷 +燕 +撒 +姻 +赴 +宴 +煩 +債 +帳 +斑 +鈴 +旨 +醇 +董 +餅 +雛 +姿 +拌 +傅 +腹 +妥 +揉 +賢 +拆 +歪 +葡 +胺 +丟 +浩 +徽 +昂 +墊 +擋 +覽 +貪 +慰 +繳 +汪 +慌 +馮 +諾 +姜 +誼 +兇 +劣 +誣 +耀 +昏 +躺 +盈 +騎 +喬 +溪 +叢 +盧 +抹 +悶 +諮 +刮 +駕 +纜 +悟 +摘 +鉺 +擲 +頗 +幻 +柄 +惠 +慘 +佳 +仇 +臘 +窩 +滌 +劍 +瞧 +堡 +潑 +蔥 +罩 +霍 +撈 +胎 +蒼 +濱 +倆 +捅 +湘 +砍 +霞 +邵 +萄 +瘋 +淮 +遂 +熊 +糞 +烘 +宿 +檔 +戈 +駁 +嫂 +裕 +徙 +箭 +捐 +腸 +撐 +曬 +辨 +殿 +蓮 +攤 +攪 +醬 +屏 +疫 +哀 +蔡 +堵 +沫 +皺 +暢 +疊 +閣 +萊 +敲 +轄 +鉤 +痕 +壩 +巷 +餓 +禍 +丘 +玄 +溜 +曰 +邏 +彭 +嘗 +卿 +妨 +艇 +吞 +韋 +怨 +矮 +歇 +` diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/english.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/english.go new file mode 100644 index 0000000000..f69e8a4736 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/english.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt + // $ crc32 english.txt + // c1dbd296 + checksum := crc32.ChecksumIEEE([]byte(english)) + if fmt.Sprintf("%x", checksum) != "c1dbd296" { + panic("english checksum invalid") + } +} + +// English is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt +var English = strings.Split(strings.TrimSpace(english), "\n") +var english = `abandon +ability +able +about +above +absent +absorb +abstract +absurd +abuse +access +accident +account +accuse +achieve +acid +acoustic +acquire +across +act +action +actor +actress +actual +adapt +add +addict +address +adjust +admit +adult +advance +advice +aerobic +affair +afford +afraid +again +age +agent +agree +ahead +aim +air +airport +aisle +alarm +album +alcohol +alert +alien +all +alley +allow +almost +alone +alpha +already +also +alter +always +amateur +amazing +among +amount +amused +analyst +anchor +ancient +anger +angle +angry +animal +ankle +announce +annual +another +answer +antenna +antique +anxiety +any +apart +apology +appear +apple +approve +april +arch +arctic +area +arena +argue +arm +armed +armor +army +around +arrange +arrest +arrive +arrow +art +artefact +artist +artwork +ask +aspect +assault +asset +assist +assume +asthma +athlete +atom +attack +attend +attitude +attract +auction +audit +august +aunt +author +auto +autumn +average +avocado +avoid +awake +aware +away +awesome +awful +awkward +axis +baby +bachelor +bacon +badge +bag +balance +balcony +ball +bamboo +banana +banner +bar +barely +bargain +barrel +base +basic +basket +battle +beach +bean +beauty +because +become +beef +before +begin +behave +behind +believe +below +belt +bench +benefit +best +betray +better +between +beyond +bicycle +bid +bike +bind +biology +bird +birth +bitter +black +blade +blame +blanket +blast +bleak +bless +blind +blood +blossom +blouse +blue +blur +blush +board +boat +body +boil +bomb +bone +bonus +book +boost +border +boring +borrow +boss +bottom +bounce +box +boy +bracket +brain +brand +brass +brave +bread +breeze +brick +bridge +brief +bright +bring +brisk +broccoli +broken +bronze +broom +brother +brown +brush +bubble +buddy +budget +buffalo +build +bulb +bulk +bullet +bundle +bunker +burden +burger +burst +bus +business +busy +butter +buyer +buzz +cabbage +cabin +cable +cactus +cage +cake +call +calm +camera +camp +can +canal +cancel +candy +cannon +canoe +canvas +canyon +capable +capital +captain +car +carbon +card +cargo +carpet +carry +cart +case +cash +casino +castle +casual +cat +catalog +catch +category +cattle +caught +cause +caution +cave +ceiling +celery +cement +census +century +cereal +certain +chair +chalk +champion +change +chaos +chapter +charge +chase +chat +cheap +check +cheese +chef +cherry +chest +chicken +chief +child +chimney +choice +choose +chronic +chuckle +chunk +churn +cigar +cinnamon +circle +citizen +city +civil +claim +clap +clarify +claw +clay +clean +clerk +clever +click +client +cliff +climb +clinic +clip +clock +clog +close +cloth +cloud +clown +club +clump +cluster +clutch +coach +coast +coconut +code +coffee +coil +coin +collect +color +column +combine +come +comfort +comic +common +company +concert +conduct +confirm +congress +connect +consider +control +convince +cook +cool +copper +copy +coral +core +corn +correct +cost +cotton +couch +country +couple +course +cousin +cover +coyote +crack +cradle +craft +cram +crane +crash +crater +crawl +crazy +cream +credit +creek +crew +cricket +crime +crisp +critic +crop +cross +crouch +crowd +crucial +cruel +cruise +crumble +crunch +crush +cry +crystal +cube +culture +cup +cupboard +curious +current +curtain +curve +cushion +custom +cute +cycle +dad +damage +damp +dance +danger +daring +dash +daughter +dawn +day +deal +debate +debris +decade +december +decide +decline +decorate +decrease +deer +defense +define +defy +degree +delay +deliver +demand +demise +denial +dentist +deny +depart +depend +deposit +depth +deputy +derive +describe +desert +design +desk +despair +destroy +detail +detect +develop +device +devote +diagram +dial +diamond +diary +dice +diesel +diet +differ +digital +dignity +dilemma +dinner +dinosaur +direct +dirt +disagree +discover +disease +dish +dismiss +disorder +display +distance +divert +divide +divorce +dizzy +doctor +document +dog +doll +dolphin +domain +donate +donkey +donor +door +dose +double +dove +draft +dragon +drama +drastic +draw +dream +dress +drift +drill +drink +drip +drive +drop +drum +dry +duck +dumb +dune +during +dust +dutch +duty +dwarf +dynamic +eager +eagle +early +earn +earth +easily +east +easy +echo +ecology +economy +edge +edit +educate +effort +egg +eight +either +elbow +elder +electric +elegant +element +elephant +elevator +elite +else +embark +embody +embrace +emerge +emotion +employ +empower +empty +enable +enact +end +endless +endorse +enemy +energy +enforce +engage +engine +enhance +enjoy +enlist +enough +enrich +enroll +ensure +enter +entire +entry +envelope +episode +equal +equip +era +erase +erode +erosion +error +erupt +escape +essay +essence +estate +eternal +ethics +evidence +evil +evoke +evolve +exact +example +excess +exchange +excite +exclude +excuse +execute +exercise +exhaust +exhibit +exile +exist +exit +exotic +expand +expect +expire +explain +expose +express +extend +extra +eye +eyebrow +fabric +face +faculty +fade +faint +faith +fall +false +fame +family +famous +fan +fancy +fantasy +farm +fashion +fat +fatal +father +fatigue +fault +favorite +feature +february +federal +fee +feed +feel +female +fence +festival +fetch +fever +few +fiber +fiction +field +figure +file +film +filter +final +find +fine +finger +finish +fire +firm +first +fiscal +fish +fit +fitness +fix +flag +flame +flash +flat +flavor +flee +flight +flip +float +flock +floor +flower +fluid +flush +fly +foam +focus +fog +foil +fold +follow +food +foot +force +forest +forget +fork +fortune +forum +forward +fossil +foster +found +fox +fragile +frame +frequent +fresh +friend +fringe +frog +front +frost +frown +frozen +fruit +fuel +fun +funny +furnace +fury +future +gadget +gain +galaxy +gallery +game +gap +garage +garbage +garden +garlic +garment +gas +gasp +gate +gather +gauge +gaze +general +genius +genre +gentle +genuine +gesture +ghost +giant +gift +giggle +ginger +giraffe +girl +give +glad +glance +glare +glass +glide +glimpse +globe +gloom +glory +glove +glow +glue +goat +goddess +gold +good +goose +gorilla +gospel +gossip +govern +gown +grab +grace +grain +grant +grape +grass +gravity +great +green +grid +grief +grit +grocery +group +grow +grunt +guard +guess +guide +guilt +guitar +gun +gym +habit +hair +half +hammer +hamster +hand +happy +harbor +hard +harsh +harvest +hat +have +hawk +hazard +head +health +heart +heavy +hedgehog +height +hello +helmet +help +hen +hero +hidden +high +hill +hint +hip +hire +history +hobby +hockey +hold +hole +holiday +hollow +home +honey +hood +hope +horn +horror +horse +hospital +host +hotel +hour +hover +hub +huge +human +humble +humor +hundred +hungry +hunt +hurdle +hurry +hurt +husband +hybrid +ice +icon +idea +identify +idle +ignore +ill +illegal +illness +image +imitate +immense +immune +impact +impose +improve +impulse +inch +include +income +increase +index +indicate +indoor +industry +infant +inflict +inform +inhale +inherit +initial +inject +injury +inmate +inner +innocent +input +inquiry +insane +insect +inside +inspire +install +intact +interest +into +invest +invite +involve +iron +island +isolate +issue +item +ivory +jacket +jaguar +jar +jazz +jealous +jeans +jelly +jewel +job +join +joke +journey +joy +judge +juice +jump +jungle +junior +junk +just +kangaroo +keen +keep +ketchup +key +kick +kid +kidney +kind +kingdom +kiss +kit +kitchen +kite +kitten +kiwi +knee +knife +knock +know +lab +label +labor +ladder +lady +lake +lamp +language +laptop +large +later +latin +laugh +laundry +lava +law +lawn +lawsuit +layer +lazy +leader +leaf +learn +leave +lecture +left +leg +legal +legend +leisure +lemon +lend +length +lens +leopard +lesson +letter +level +liar +liberty +library +license +life +lift +light +like +limb +limit +link +lion +liquid +list +little +live +lizard +load +loan +lobster +local +lock +logic +lonely +long +loop +lottery +loud +lounge +love +loyal +lucky +luggage +lumber +lunar +lunch +luxury +lyrics +machine +mad +magic +magnet +maid +mail +main +major +make +mammal +man +manage +mandate +mango +mansion +manual +maple +marble +march +margin +marine +market +marriage +mask +mass +master +match +material +math +matrix +matter +maximum +maze +meadow +mean +measure +meat +mechanic +medal +media +melody +melt +member +memory +mention +menu +mercy +merge +merit +merry +mesh +message +metal +method +middle +midnight +milk +million +mimic +mind +minimum +minor +minute +miracle +mirror +misery +miss +mistake +mix +mixed +mixture +mobile +model +modify +mom +moment +monitor +monkey +monster +month +moon +moral +more +morning +mosquito +mother +motion +motor +mountain +mouse +move +movie +much +muffin +mule +multiply +muscle +museum +mushroom +music +must +mutual +myself +mystery +myth +naive +name +napkin +narrow +nasty +nation +nature +near +neck +need +negative +neglect +neither +nephew +nerve +nest +net +network +neutral +never +news +next +nice +night +noble +noise +nominee +noodle +normal +north +nose +notable +note +nothing +notice +novel +now +nuclear +number +nurse +nut +oak +obey +object +oblige +obscure +observe +obtain +obvious +occur +ocean +october +odor +off +offer +office +often +oil +okay +old +olive +olympic +omit +once +one +onion +online +only +open +opera +opinion +oppose +option +orange +orbit +orchard +order +ordinary +organ +orient +original +orphan +ostrich +other +outdoor +outer +output +outside +oval +oven +over +own +owner +oxygen +oyster +ozone +pact +paddle +page +pair +palace +palm +panda +panel +panic +panther +paper +parade +parent +park +parrot +party +pass +patch +path +patient +patrol +pattern +pause +pave +payment +peace +peanut +pear +peasant +pelican +pen +penalty +pencil +people +pepper +perfect +permit +person +pet +phone +photo +phrase +physical +piano +picnic +picture +piece +pig +pigeon +pill +pilot +pink +pioneer +pipe +pistol +pitch +pizza +place +planet +plastic +plate +play +please +pledge +pluck +plug +plunge +poem +poet +point +polar +pole +police +pond +pony +pool +popular +portion +position +possible +post +potato +pottery +poverty +powder +power +practice +praise +predict +prefer +prepare +present +pretty +prevent +price +pride +primary +print +priority +prison +private +prize +problem +process +produce +profit +program +project +promote +proof +property +prosper +protect +proud +provide +public +pudding +pull +pulp +pulse +pumpkin +punch +pupil +puppy +purchase +purity +purpose +purse +push +put +puzzle +pyramid +quality +quantum +quarter +question +quick +quit +quiz +quote +rabbit +raccoon +race +rack +radar +radio +rail +rain +raise +rally +ramp +ranch +random +range +rapid +rare +rate +rather +raven +raw +razor +ready +real +reason +rebel +rebuild +recall +receive +recipe +record +recycle +reduce +reflect +reform +refuse +region +regret +regular +reject +relax +release +relief +rely +remain +remember +remind +remove +render +renew +rent +reopen +repair +repeat +replace +report +require +rescue +resemble +resist +resource +response +result +retire +retreat +return +reunion +reveal +review +reward +rhythm +rib +ribbon +rice +rich +ride +ridge +rifle +right +rigid +ring +riot +ripple +risk +ritual +rival +river +road +roast +robot +robust +rocket +romance +roof +rookie +room +rose +rotate +rough +round +route +royal +rubber +rude +rug +rule +run +runway +rural +sad +saddle +sadness +safe +sail +salad +salmon +salon +salt +salute +same +sample +sand +satisfy +satoshi +sauce +sausage +save +say +scale +scan +scare +scatter +scene +scheme +school +science +scissors +scorpion +scout +scrap +screen +script +scrub +sea +search +season +seat +second +secret +section +security +seed +seek +segment +select +sell +seminar +senior +sense +sentence +series +service +session +settle +setup +seven +shadow +shaft +shallow +share +shed +shell +sheriff +shield +shift +shine +ship +shiver +shock +shoe +shoot +shop +short +shoulder +shove +shrimp +shrug +shuffle +shy +sibling +sick +side +siege +sight +sign +silent +silk +silly +silver +similar +simple +since +sing +siren +sister +situate +six +size +skate +sketch +ski +skill +skin +skirt +skull +slab +slam +sleep +slender +slice +slide +slight +slim +slogan +slot +slow +slush +small +smart +smile +smoke +smooth +snack +snake +snap +sniff +snow +soap +soccer +social +sock +soda +soft +solar +soldier +solid +solution +solve +someone +song +soon +sorry +sort +soul +sound +soup +source +south +space +spare +spatial +spawn +speak +special +speed +spell +spend +sphere +spice +spider +spike +spin +spirit +split +spoil +sponsor +spoon +sport +spot +spray +spread +spring +spy +square +squeeze +squirrel +stable +stadium +staff +stage +stairs +stamp +stand +start +state +stay +steak +steel +stem +step +stereo +stick +still +sting +stock +stomach +stone +stool +story +stove +strategy +street +strike +strong +struggle +student +stuff +stumble +style +subject +submit +subway +success +such +sudden +suffer +sugar +suggest +suit +summer +sun +sunny +sunset +super +supply +supreme +sure +surface +surge +surprise +surround +survey +suspect +sustain +swallow +swamp +swap +swarm +swear +sweet +swift +swim +swing +switch +sword +symbol +symptom +syrup +system +table +tackle +tag +tail +talent +talk +tank +tape +target +task +taste +tattoo +taxi +teach +team +tell +ten +tenant +tennis +tent +term +test +text +thank +that +theme +then +theory +there +they +thing +this +thought +three +thrive +throw +thumb +thunder +ticket +tide +tiger +tilt +timber +time +tiny +tip +tired +tissue +title +toast +tobacco +today +toddler +toe +together +toilet +token +tomato +tomorrow +tone +tongue +tonight +tool +tooth +top +topic +topple +torch +tornado +tortoise +toss +total +tourist +toward +tower +town +toy +track +trade +traffic +tragic +train +transfer +trap +trash +travel +tray +treat +tree +trend +trial +tribe +trick +trigger +trim +trip +trophy +trouble +truck +true +truly +trumpet +trust +truth +try +tube +tuition +tumble +tuna +tunnel +turkey +turn +turtle +twelve +twenty +twice +twin +twist +two +type +typical +ugly +umbrella +unable +unaware +uncle +uncover +under +undo +unfair +unfold +unhappy +uniform +unique +unit +universe +unknown +unlock +until +unusual +unveil +update +upgrade +uphold +upon +upper +upset +urban +urge +usage +use +used +useful +useless +usual +utility +vacant +vacuum +vague +valid +valley +valve +van +vanish +vapor +various +vast +vault +vehicle +velvet +vendor +venture +venue +verb +verify +version +very +vessel +veteran +viable +vibrant +vicious +victory +video +view +village +vintage +violin +virtual +virus +visa +visit +visual +vital +vivid +vocal +voice +void +volcano +volume +vote +voyage +wage +wagon +wait +walk +wall +walnut +want +warfare +warm +warrior +wash +wasp +waste +water +wave +way +wealth +weapon +wear +weasel +weather +web +wedding +weekend +weird +welcome +west +wet +whale +what +wheat +wheel +when +where +whip +whisper +wide +width +wife +wild +will +win +window +wine +wing +wink +winner +winter +wire +wisdom +wise +wish +witness +wolf +woman +wonder +wood +wool +word +work +world +worry +worth +wrap +wreck +wrestle +wrist +write +wrong +yard +year +yellow +you +young +youth +zebra +zero +zone +zoo +` diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/french.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/french.go new file mode 100644 index 0000000000..1ae685d3ad --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/french.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/french.txt + // $ crc32 french.txt + // 3e56b216 + checksum := crc32.ChecksumIEEE([]byte(french)) + if fmt.Sprintf("%x", checksum) != "3e56b216" { + panic("french checksum invalid") + } +} + +// French is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/french.txt +var French = strings.Split(strings.TrimSpace(french), "\n") +var french = `abaisser +abandon +abdiquer +abeille +abolir +aborder +aboutir +aboyer +abrasif +abreuver +abriter +abroger +abrupt +absence +absolu +absurde +abusif +abyssal +académie +acajou +acarien +accabler +accepter +acclamer +accolade +accroche +accuser +acerbe +achat +acheter +aciduler +acier +acompte +acquérir +acronyme +acteur +actif +actuel +adepte +adéquat +adhésif +adjectif +adjuger +admettre +admirer +adopter +adorer +adoucir +adresse +adroit +adulte +adverbe +aérer +aéronef +affaire +affecter +affiche +affreux +affubler +agacer +agencer +agile +agiter +agrafer +agréable +agrume +aider +aiguille +ailier +aimable +aisance +ajouter +ajuster +alarmer +alchimie +alerte +algèbre +algue +aliéner +aliment +alléger +alliage +allouer +allumer +alourdir +alpaga +altesse +alvéole +amateur +ambigu +ambre +aménager +amertume +amidon +amiral +amorcer +amour +amovible +amphibie +ampleur +amusant +analyse +anaphore +anarchie +anatomie +ancien +anéantir +angle +angoisse +anguleux +animal +annexer +annonce +annuel +anodin +anomalie +anonyme +anormal +antenne +antidote +anxieux +apaiser +apéritif +aplanir +apologie +appareil +appeler +apporter +appuyer +aquarium +aqueduc +arbitre +arbuste +ardeur +ardoise +argent +arlequin +armature +armement +armoire +armure +arpenter +arracher +arriver +arroser +arsenic +artériel +article +aspect +asphalte +aspirer +assaut +asservir +assiette +associer +assurer +asticot +astre +astuce +atelier +atome +atrium +atroce +attaque +attentif +attirer +attraper +aubaine +auberge +audace +audible +augurer +aurore +automne +autruche +avaler +avancer +avarice +avenir +averse +aveugle +aviateur +avide +avion +aviser +avoine +avouer +avril +axial +axiome +badge +bafouer +bagage +baguette +baignade +balancer +balcon +baleine +balisage +bambin +bancaire +bandage +banlieue +bannière +banquier +barbier +baril +baron +barque +barrage +bassin +bastion +bataille +bateau +batterie +baudrier +bavarder +belette +bélier +belote +bénéfice +berceau +berger +berline +bermuda +besace +besogne +bétail +beurre +biberon +bicycle +bidule +bijou +bilan +bilingue +billard +binaire +biologie +biopsie +biotype +biscuit +bison +bistouri +bitume +bizarre +blafard +blague +blanchir +blessant +blinder +blond +bloquer +blouson +bobard +bobine +boire +boiser +bolide +bonbon +bondir +bonheur +bonifier +bonus +bordure +borne +botte +boucle +boueux +bougie +boulon +bouquin +bourse +boussole +boutique +boxeur +branche +brasier +brave +brebis +brèche +breuvage +bricoler +brigade +brillant +brioche +brique +brochure +broder +bronzer +brousse +broyeur +brume +brusque +brutal +bruyant +buffle +buisson +bulletin +bureau +burin +bustier +butiner +butoir +buvable +buvette +cabanon +cabine +cachette +cadeau +cadre +caféine +caillou +caisson +calculer +calepin +calibre +calmer +calomnie +calvaire +camarade +caméra +camion +campagne +canal +caneton +canon +cantine +canular +capable +caporal +caprice +capsule +capter +capuche +carabine +carbone +caresser +caribou +carnage +carotte +carreau +carton +cascade +casier +casque +cassure +causer +caution +cavalier +caverne +caviar +cédille +ceinture +céleste +cellule +cendrier +censurer +central +cercle +cérébral +cerise +cerner +cerveau +cesser +chagrin +chaise +chaleur +chambre +chance +chapitre +charbon +chasseur +chaton +chausson +chavirer +chemise +chenille +chéquier +chercher +cheval +chien +chiffre +chignon +chimère +chiot +chlorure +chocolat +choisir +chose +chouette +chrome +chute +cigare +cigogne +cimenter +cinéma +cintrer +circuler +cirer +cirque +citerne +citoyen +citron +civil +clairon +clameur +claquer +classe +clavier +client +cligner +climat +clivage +cloche +clonage +cloporte +cobalt +cobra +cocasse +cocotier +coder +codifier +coffre +cogner +cohésion +coiffer +coincer +colère +colibri +colline +colmater +colonel +combat +comédie +commande +compact +concert +conduire +confier +congeler +connoter +consonne +contact +convexe +copain +copie +corail +corbeau +cordage +corniche +corpus +correct +cortège +cosmique +costume +coton +coude +coupure +courage +couteau +couvrir +coyote +crabe +crainte +cravate +crayon +créature +créditer +crémeux +creuser +crevette +cribler +crier +cristal +critère +croire +croquer +crotale +crucial +cruel +crypter +cubique +cueillir +cuillère +cuisine +cuivre +culminer +cultiver +cumuler +cupide +curatif +curseur +cyanure +cycle +cylindre +cynique +daigner +damier +danger +danseur +dauphin +débattre +débiter +déborder +débrider +débutant +décaler +décembre +déchirer +décider +déclarer +décorer +décrire +décupler +dédale +déductif +déesse +défensif +défiler +défrayer +dégager +dégivrer +déglutir +dégrafer +déjeuner +délice +déloger +demander +demeurer +démolir +dénicher +dénouer +dentelle +dénuder +départ +dépenser +déphaser +déplacer +déposer +déranger +dérober +désastre +descente +désert +désigner +désobéir +dessiner +destrier +détacher +détester +détourer +détresse +devancer +devenir +deviner +devoir +diable +dialogue +diamant +dicter +différer +digérer +digital +digne +diluer +dimanche +diminuer +dioxyde +directif +diriger +discuter +disposer +dissiper +distance +divertir +diviser +docile +docteur +dogme +doigt +domaine +domicile +dompter +donateur +donjon +donner +dopamine +dortoir +dorure +dosage +doseur +dossier +dotation +douanier +double +douceur +douter +doyen +dragon +draper +dresser +dribbler +droiture +duperie +duplexe +durable +durcir +dynastie +éblouir +écarter +écharpe +échelle +éclairer +éclipse +éclore +écluse +école +économie +écorce +écouter +écraser +écrémer +écrivain +écrou +écume +écureuil +édifier +éduquer +effacer +effectif +effigie +effort +effrayer +effusion +égaliser +égarer +éjecter +élaborer +élargir +électron +élégant +éléphant +élève +éligible +élitisme +éloge +élucider +éluder +emballer +embellir +embryon +émeraude +émission +emmener +émotion +émouvoir +empereur +employer +emporter +emprise +émulsion +encadrer +enchère +enclave +encoche +endiguer +endosser +endroit +enduire +énergie +enfance +enfermer +enfouir +engager +engin +englober +énigme +enjamber +enjeu +enlever +ennemi +ennuyeux +enrichir +enrobage +enseigne +entasser +entendre +entier +entourer +entraver +énumérer +envahir +enviable +envoyer +enzyme +éolien +épaissir +épargne +épatant +épaule +épicerie +épidémie +épier +épilogue +épine +épisode +épitaphe +époque +épreuve +éprouver +épuisant +équerre +équipe +ériger +érosion +erreur +éruption +escalier +espadon +espèce +espiègle +espoir +esprit +esquiver +essayer +essence +essieu +essorer +estime +estomac +estrade +étagère +étaler +étanche +étatique +éteindre +étendoir +éternel +éthanol +éthique +ethnie +étirer +étoffer +étoile +étonnant +étourdir +étrange +étroit +étude +euphorie +évaluer +évasion +éventail +évidence +éviter +évolutif +évoquer +exact +exagérer +exaucer +exceller +excitant +exclusif +excuse +exécuter +exemple +exercer +exhaler +exhorter +exigence +exiler +exister +exotique +expédier +explorer +exposer +exprimer +exquis +extensif +extraire +exulter +fable +fabuleux +facette +facile +facture +faiblir +falaise +fameux +famille +farceur +farfelu +farine +farouche +fasciner +fatal +fatigue +faucon +fautif +faveur +favori +fébrile +féconder +fédérer +félin +femme +fémur +fendoir +féodal +fermer +féroce +ferveur +festival +feuille +feutre +février +fiasco +ficeler +fictif +fidèle +figure +filature +filetage +filière +filleul +filmer +filou +filtrer +financer +finir +fiole +firme +fissure +fixer +flairer +flamme +flasque +flatteur +fléau +flèche +fleur +flexion +flocon +flore +fluctuer +fluide +fluvial +folie +fonderie +fongible +fontaine +forcer +forgeron +formuler +fortune +fossile +foudre +fougère +fouiller +foulure +fourmi +fragile +fraise +franchir +frapper +frayeur +frégate +freiner +frelon +frémir +frénésie +frère +friable +friction +frisson +frivole +froid +fromage +frontal +frotter +fruit +fugitif +fuite +fureur +furieux +furtif +fusion +futur +gagner +galaxie +galerie +gambader +garantir +gardien +garnir +garrigue +gazelle +gazon +géant +gélatine +gélule +gendarme +général +génie +genou +gentil +géologie +géomètre +géranium +germe +gestuel +geyser +gibier +gicler +girafe +givre +glace +glaive +glisser +globe +gloire +glorieux +golfeur +gomme +gonfler +gorge +gorille +goudron +gouffre +goulot +goupille +gourmand +goutte +graduel +graffiti +graine +grand +grappin +gratuit +gravir +grenat +griffure +griller +grimper +grogner +gronder +grotte +groupe +gruger +grutier +gruyère +guépard +guerrier +guide +guimauve +guitare +gustatif +gymnaste +gyrostat +habitude +hachoir +halte +hameau +hangar +hanneton +haricot +harmonie +harpon +hasard +hélium +hématome +herbe +hérisson +hermine +héron +hésiter +heureux +hiberner +hibou +hilarant +histoire +hiver +homard +hommage +homogène +honneur +honorer +honteux +horde +horizon +horloge +hormone +horrible +houleux +housse +hublot +huileux +humain +humble +humide +humour +hurler +hydromel +hygiène +hymne +hypnose +idylle +ignorer +iguane +illicite +illusion +image +imbiber +imiter +immense +immobile +immuable +impact +impérial +implorer +imposer +imprimer +imputer +incarner +incendie +incident +incliner +incolore +indexer +indice +inductif +inédit +ineptie +inexact +infini +infliger +informer +infusion +ingérer +inhaler +inhiber +injecter +injure +innocent +inoculer +inonder +inscrire +insecte +insigne +insolite +inspirer +instinct +insulter +intact +intense +intime +intrigue +intuitif +inutile +invasion +inventer +inviter +invoquer +ironique +irradier +irréel +irriter +isoler +ivoire +ivresse +jaguar +jaillir +jambe +janvier +jardin +jauger +jaune +javelot +jetable +jeton +jeudi +jeunesse +joindre +joncher +jongler +joueur +jouissif +journal +jovial +joyau +joyeux +jubiler +jugement +junior +jupon +juriste +justice +juteux +juvénile +kayak +kimono +kiosque +label +labial +labourer +lacérer +lactose +lagune +laine +laisser +laitier +lambeau +lamelle +lampe +lanceur +langage +lanterne +lapin +largeur +larme +laurier +lavabo +lavoir +lecture +légal +léger +légume +lessive +lettre +levier +lexique +lézard +liasse +libérer +libre +licence +licorne +liège +lièvre +ligature +ligoter +ligue +limer +limite +limonade +limpide +linéaire +lingot +lionceau +liquide +lisière +lister +lithium +litige +littoral +livreur +logique +lointain +loisir +lombric +loterie +louer +lourd +loutre +louve +loyal +lubie +lucide +lucratif +lueur +lugubre +luisant +lumière +lunaire +lundi +luron +lutter +luxueux +machine +magasin +magenta +magique +maigre +maillon +maintien +mairie +maison +majorer +malaxer +maléfice +malheur +malice +mallette +mammouth +mandater +maniable +manquant +manteau +manuel +marathon +marbre +marchand +mardi +maritime +marqueur +marron +marteler +mascotte +massif +matériel +matière +matraque +maudire +maussade +mauve +maximal +méchant +méconnu +médaille +médecin +méditer +méduse +meilleur +mélange +mélodie +membre +mémoire +menacer +mener +menhir +mensonge +mentor +mercredi +mérite +merle +messager +mesure +métal +météore +méthode +métier +meuble +miauler +microbe +miette +mignon +migrer +milieu +million +mimique +mince +minéral +minimal +minorer +minute +miracle +miroiter +missile +mixte +mobile +moderne +moelleux +mondial +moniteur +monnaie +monotone +monstre +montagne +monument +moqueur +morceau +morsure +mortier +moteur +motif +mouche +moufle +moulin +mousson +mouton +mouvant +multiple +munition +muraille +murène +murmure +muscle +muséum +musicien +mutation +muter +mutuel +myriade +myrtille +mystère +mythique +nageur +nappe +narquois +narrer +natation +nation +nature +naufrage +nautique +navire +nébuleux +nectar +néfaste +négation +négliger +négocier +neige +nerveux +nettoyer +neurone +neutron +neveu +niche +nickel +nitrate +niveau +noble +nocif +nocturne +noirceur +noisette +nomade +nombreux +nommer +normatif +notable +notifier +notoire +nourrir +nouveau +novateur +novembre +novice +nuage +nuancer +nuire +nuisible +numéro +nuptial +nuque +nutritif +obéir +objectif +obliger +obscur +observer +obstacle +obtenir +obturer +occasion +occuper +océan +octobre +octroyer +octupler +oculaire +odeur +odorant +offenser +officier +offrir +ogive +oiseau +oisillon +olfactif +olivier +ombrage +omettre +onctueux +onduler +onéreux +onirique +opale +opaque +opérer +opinion +opportun +opprimer +opter +optique +orageux +orange +orbite +ordonner +oreille +organe +orgueil +orifice +ornement +orque +ortie +osciller +osmose +ossature +otarie +ouragan +ourson +outil +outrager +ouvrage +ovation +oxyde +oxygène +ozone +paisible +palace +palmarès +palourde +palper +panache +panda +pangolin +paniquer +panneau +panorama +pantalon +papaye +papier +papoter +papyrus +paradoxe +parcelle +paresse +parfumer +parler +parole +parrain +parsemer +partager +parure +parvenir +passion +pastèque +paternel +patience +patron +pavillon +pavoiser +payer +paysage +peigne +peintre +pelage +pélican +pelle +pelouse +peluche +pendule +pénétrer +pénible +pensif +pénurie +pépite +péplum +perdrix +perforer +période +permuter +perplexe +persil +perte +peser +pétale +petit +pétrir +peuple +pharaon +phobie +phoque +photon +phrase +physique +piano +pictural +pièce +pierre +pieuvre +pilote +pinceau +pipette +piquer +pirogue +piscine +piston +pivoter +pixel +pizza +placard +plafond +plaisir +planer +plaque +plastron +plateau +pleurer +plexus +pliage +plomb +plonger +pluie +plumage +pochette +poésie +poète +pointe +poirier +poisson +poivre +polaire +policier +pollen +polygone +pommade +pompier +ponctuel +pondérer +poney +portique +position +posséder +posture +potager +poteau +potion +pouce +poulain +poumon +pourpre +poussin +pouvoir +prairie +pratique +précieux +prédire +préfixe +prélude +prénom +présence +prétexte +prévoir +primitif +prince +prison +priver +problème +procéder +prodige +profond +progrès +proie +projeter +prologue +promener +propre +prospère +protéger +prouesse +proverbe +prudence +pruneau +psychose +public +puceron +puiser +pulpe +pulsar +punaise +punitif +pupitre +purifier +puzzle +pyramide +quasar +querelle +question +quiétude +quitter +quotient +racine +raconter +radieux +ragondin +raideur +raisin +ralentir +rallonge +ramasser +rapide +rasage +ratisser +ravager +ravin +rayonner +réactif +réagir +réaliser +réanimer +recevoir +réciter +réclamer +récolter +recruter +reculer +recycler +rédiger +redouter +refaire +réflexe +réformer +refrain +refuge +régalien +région +réglage +régulier +réitérer +rejeter +rejouer +relatif +relever +relief +remarque +remède +remise +remonter +remplir +remuer +renard +renfort +renifler +renoncer +rentrer +renvoi +replier +reporter +reprise +reptile +requin +réserve +résineux +résoudre +respect +rester +résultat +rétablir +retenir +réticule +retomber +retracer +réunion +réussir +revanche +revivre +révolte +révulsif +richesse +rideau +rieur +rigide +rigoler +rincer +riposter +risible +risque +rituel +rival +rivière +rocheux +romance +rompre +ronce +rondin +roseau +rosier +rotatif +rotor +rotule +rouge +rouille +rouleau +routine +royaume +ruban +rubis +ruche +ruelle +rugueux +ruiner +ruisseau +ruser +rustique +rythme +sabler +saboter +sabre +sacoche +safari +sagesse +saisir +salade +salive +salon +saluer +samedi +sanction +sanglier +sarcasme +sardine +saturer +saugrenu +saumon +sauter +sauvage +savant +savonner +scalpel +scandale +scélérat +scénario +sceptre +schéma +science +scinder +score +scrutin +sculpter +séance +sécable +sécher +secouer +sécréter +sédatif +séduire +seigneur +séjour +sélectif +semaine +sembler +semence +séminal +sénateur +sensible +sentence +séparer +séquence +serein +sergent +sérieux +serrure +sérum +service +sésame +sévir +sevrage +sextuple +sidéral +siècle +siéger +siffler +sigle +signal +silence +silicium +simple +sincère +sinistre +siphon +sirop +sismique +situer +skier +social +socle +sodium +soigneux +soldat +soleil +solitude +soluble +sombre +sommeil +somnoler +sonde +songeur +sonnette +sonore +sorcier +sortir +sosie +sottise +soucieux +soudure +souffle +soulever +soupape +source +soutirer +souvenir +spacieux +spatial +spécial +sphère +spiral +stable +station +sternum +stimulus +stipuler +strict +studieux +stupeur +styliste +sublime +substrat +subtil +subvenir +succès +sucre +suffixe +suggérer +suiveur +sulfate +superbe +supplier +surface +suricate +surmener +surprise +sursaut +survie +suspect +syllabe +symbole +symétrie +synapse +syntaxe +système +tabac +tablier +tactile +tailler +talent +talisman +talonner +tambour +tamiser +tangible +tapis +taquiner +tarder +tarif +tartine +tasse +tatami +tatouage +taupe +taureau +taxer +témoin +temporel +tenaille +tendre +teneur +tenir +tension +terminer +terne +terrible +tétine +texte +thème +théorie +thérapie +thorax +tibia +tiède +timide +tirelire +tiroir +tissu +titane +titre +tituber +toboggan +tolérant +tomate +tonique +tonneau +toponyme +torche +tordre +tornade +torpille +torrent +torse +tortue +totem +toucher +tournage +tousser +toxine +traction +trafic +tragique +trahir +train +trancher +travail +trèfle +tremper +trésor +treuil +triage +tribunal +tricoter +trilogie +triomphe +tripler +triturer +trivial +trombone +tronc +tropical +troupeau +tuile +tulipe +tumulte +tunnel +turbine +tuteur +tutoyer +tuyau +tympan +typhon +typique +tyran +ubuesque +ultime +ultrason +unanime +unifier +union +unique +unitaire +univers +uranium +urbain +urticant +usage +usine +usuel +usure +utile +utopie +vacarme +vaccin +vagabond +vague +vaillant +vaincre +vaisseau +valable +valise +vallon +valve +vampire +vanille +vapeur +varier +vaseux +vassal +vaste +vecteur +vedette +végétal +véhicule +veinard +véloce +vendredi +vénérer +venger +venimeux +ventouse +verdure +vérin +vernir +verrou +verser +vertu +veston +vétéran +vétuste +vexant +vexer +viaduc +viande +victoire +vidange +vidéo +vignette +vigueur +vilain +village +vinaigre +violon +vipère +virement +virtuose +virus +visage +viseur +vision +visqueux +visuel +vital +vitesse +viticole +vitrine +vivace +vivipare +vocation +voguer +voile +voisin +voiture +volaille +volcan +voltiger +volume +vorace +vortex +voter +vouloir +voyage +voyelle +wagon +xénon +yacht +zèbre +zénith +zeste +zoologie +` diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/italian.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/italian.go new file mode 100644 index 0000000000..32cd2cf6d8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/italian.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/italian.txt + // $ crc32 italian.txt + // 2fc7d07e + checksum := crc32.ChecksumIEEE([]byte(italian)) + if fmt.Sprintf("%x", checksum) != "2fc7d07e" { + panic("italian checksum invalid") + } +} + +// Italian is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/italian.txt +var Italian = strings.Split(strings.TrimSpace(italian), "\n") +var italian = `abaco +abbaglio +abbinato +abete +abisso +abolire +abrasivo +abrogato +accadere +accenno +accusato +acetone +achille +acido +acqua +acre +acrilico +acrobata +acuto +adagio +addebito +addome +adeguato +aderire +adipe +adottare +adulare +affabile +affetto +affisso +affranto +aforisma +afoso +africano +agave +agente +agevole +aggancio +agire +agitare +agonismo +agricolo +agrumeto +aguzzo +alabarda +alato +albatro +alberato +albo +albume +alce +alcolico +alettone +alfa +algebra +aliante +alibi +alimento +allagato +allegro +allievo +allodola +allusivo +almeno +alogeno +alpaca +alpestre +altalena +alterno +alticcio +altrove +alunno +alveolo +alzare +amalgama +amanita +amarena +ambito +ambrato +ameba +america +ametista +amico +ammasso +ammenda +ammirare +ammonito +amore +ampio +ampliare +amuleto +anacardo +anagrafe +analista +anarchia +anatra +anca +ancella +ancora +andare +andrea +anello +angelo +angolare +angusto +anima +annegare +annidato +anno +annuncio +anonimo +anticipo +anzi +apatico +apertura +apode +apparire +appetito +appoggio +approdo +appunto +aprile +arabica +arachide +aragosta +araldica +arancio +aratura +arazzo +arbitro +archivio +ardito +arenile +argento +argine +arguto +aria +armonia +arnese +arredato +arringa +arrosto +arsenico +arso +artefice +arzillo +asciutto +ascolto +asepsi +asettico +asfalto +asino +asola +aspirato +aspro +assaggio +asse +assoluto +assurdo +asta +astenuto +astice +astratto +atavico +ateismo +atomico +atono +attesa +attivare +attorno +attrito +attuale +ausilio +austria +autista +autonomo +autunno +avanzato +avere +avvenire +avviso +avvolgere +azione +azoto +azzimo +azzurro +babele +baccano +bacino +baco +badessa +badilata +bagnato +baita +balcone +baldo +balena +ballata +balzano +bambino +bandire +baraonda +barbaro +barca +baritono +barlume +barocco +basilico +basso +batosta +battuto +baule +bava +bavosa +becco +beffa +belgio +belva +benda +benevole +benigno +benzina +bere +berlina +beta +bibita +bici +bidone +bifido +biga +bilancia +bimbo +binocolo +biologo +bipede +bipolare +birbante +birra +biscotto +bisesto +bisnonno +bisonte +bisturi +bizzarro +blando +blatta +bollito +bonifico +bordo +bosco +botanico +bottino +bozzolo +braccio +bradipo +brama +branca +bravura +bretella +brevetto +brezza +briglia +brillante +brindare +broccolo +brodo +bronzina +brullo +bruno +bubbone +buca +budino +buffone +buio +bulbo +buono +burlone +burrasca +bussola +busta +cadetto +caduco +calamaro +calcolo +calesse +calibro +calmo +caloria +cambusa +camerata +camicia +cammino +camola +campale +canapa +candela +cane +canino +canotto +cantina +capace +capello +capitolo +capogiro +cappero +capra +capsula +carapace +carcassa +cardo +carisma +carovana +carretto +cartolina +casaccio +cascata +caserma +caso +cassone +castello +casuale +catasta +catena +catrame +cauto +cavillo +cedibile +cedrata +cefalo +celebre +cellulare +cena +cenone +centesimo +ceramica +cercare +certo +cerume +cervello +cesoia +cespo +ceto +chela +chiaro +chicca +chiedere +chimera +china +chirurgo +chitarra +ciao +ciclismo +cifrare +cigno +cilindro +ciottolo +circa +cirrosi +citrico +cittadino +ciuffo +civetta +civile +classico +clinica +cloro +cocco +codardo +codice +coerente +cognome +collare +colmato +colore +colposo +coltivato +colza +coma +cometa +commando +comodo +computer +comune +conciso +condurre +conferma +congelare +coniuge +connesso +conoscere +consumo +continuo +convegno +coperto +copione +coppia +copricapo +corazza +cordata +coricato +cornice +corolla +corpo +corredo +corsia +cortese +cosmico +costante +cottura +covato +cratere +cravatta +creato +credere +cremoso +crescita +creta +criceto +crinale +crisi +critico +croce +cronaca +crostata +cruciale +crusca +cucire +cuculo +cugino +cullato +cupola +curatore +cursore +curvo +cuscino +custode +dado +daino +dalmata +damerino +daniela +dannoso +danzare +datato +davanti +davvero +debutto +decennio +deciso +declino +decollo +decreto +dedicato +definito +deforme +degno +delegare +delfino +delirio +delta +demenza +denotato +dentro +deposito +derapata +derivare +deroga +descritto +deserto +desiderio +desumere +detersivo +devoto +diametro +dicembre +diedro +difeso +diffuso +digerire +digitale +diluvio +dinamico +dinnanzi +dipinto +diploma +dipolo +diradare +dire +dirotto +dirupo +disagio +discreto +disfare +disgelo +disposto +distanza +disumano +dito +divano +divelto +dividere +divorato +doblone +docente +doganale +dogma +dolce +domato +domenica +dominare +dondolo +dono +dormire +dote +dottore +dovuto +dozzina +drago +druido +dubbio +dubitare +ducale +duna +duomo +duplice +duraturo +ebano +eccesso +ecco +eclissi +economia +edera +edicola +edile +editoria +educare +egemonia +egli +egoismo +egregio +elaborato +elargire +elegante +elencato +eletto +elevare +elfico +elica +elmo +elsa +eluso +emanato +emblema +emesso +emiro +emotivo +emozione +empirico +emulo +endemico +enduro +energia +enfasi +enoteca +entrare +enzima +epatite +epilogo +episodio +epocale +eppure +equatore +erario +erba +erboso +erede +eremita +erigere +ermetico +eroe +erosivo +errante +esagono +esame +esanime +esaudire +esca +esempio +esercito +esibito +esigente +esistere +esito +esofago +esortato +esoso +espanso +espresso +essenza +esso +esteso +estimare +estonia +estroso +esultare +etilico +etnico +etrusco +etto +euclideo +europa +evaso +evidenza +evitato +evoluto +evviva +fabbrica +faccenda +fachiro +falco +famiglia +fanale +fanfara +fango +fantasma +fare +farfalla +farinoso +farmaco +fascia +fastoso +fasullo +faticare +fato +favoloso +febbre +fecola +fede +fegato +felpa +feltro +femmina +fendere +fenomeno +fermento +ferro +fertile +fessura +festivo +fetta +feudo +fiaba +fiducia +fifa +figurato +filo +finanza +finestra +finire +fiore +fiscale +fisico +fiume +flacone +flamenco +flebo +flemma +florido +fluente +fluoro +fobico +focaccia +focoso +foderato +foglio +folata +folclore +folgore +fondente +fonetico +fonia +fontana +forbito +forchetta +foresta +formica +fornaio +foro +fortezza +forzare +fosfato +fosso +fracasso +frana +frassino +fratello +freccetta +frenata +fresco +frigo +frollino +fronde +frugale +frutta +fucilata +fucsia +fuggente +fulmine +fulvo +fumante +fumetto +fumoso +fune +funzione +fuoco +furbo +furgone +furore +fuso +futile +gabbiano +gaffe +galateo +gallina +galoppo +gambero +gamma +garanzia +garbo +garofano +garzone +gasdotto +gasolio +gastrico +gatto +gaudio +gazebo +gazzella +geco +gelatina +gelso +gemello +gemmato +gene +genitore +gennaio +genotipo +gergo +ghepardo +ghiaccio +ghisa +giallo +gilda +ginepro +giocare +gioiello +giorno +giove +girato +girone +gittata +giudizio +giurato +giusto +globulo +glutine +gnomo +gobba +golf +gomito +gommone +gonfio +gonna +governo +gracile +grado +grafico +grammo +grande +grattare +gravoso +grazia +greca +gregge +grifone +grigio +grinza +grotta +gruppo +guadagno +guaio +guanto +guardare +gufo +guidare +ibernato +icona +identico +idillio +idolo +idra +idrico +idrogeno +igiene +ignaro +ignorato +ilare +illeso +illogico +illudere +imballo +imbevuto +imbocco +imbuto +immane +immerso +immolato +impacco +impeto +impiego +importo +impronta +inalare +inarcare +inattivo +incanto +incendio +inchino +incisivo +incluso +incontro +incrocio +incubo +indagine +india +indole +inedito +infatti +infilare +inflitto +ingaggio +ingegno +inglese +ingordo +ingrosso +innesco +inodore +inoltrare +inondato +insano +insetto +insieme +insonnia +insulina +intasato +intero +intonaco +intuito +inumidire +invalido +invece +invito +iperbole +ipnotico +ipotesi +ippica +iride +irlanda +ironico +irrigato +irrorare +isolato +isotopo +isterico +istituto +istrice +italia +iterare +labbro +labirinto +lacca +lacerato +lacrima +lacuna +laddove +lago +lampo +lancetta +lanterna +lardoso +larga +laringe +lastra +latenza +latino +lattuga +lavagna +lavoro +legale +leggero +lembo +lentezza +lenza +leone +lepre +lesivo +lessato +lesto +letterale +leva +levigato +libero +lido +lievito +lilla +limatura +limitare +limpido +lineare +lingua +liquido +lira +lirica +lisca +lite +litigio +livrea +locanda +lode +logica +lombare +londra +longevo +loquace +lorenzo +loto +lotteria +luce +lucidato +lumaca +luminoso +lungo +lupo +luppolo +lusinga +lusso +lutto +macabro +macchina +macero +macinato +madama +magico +maglia +magnete +magro +maiolica +malafede +malgrado +malinteso +malsano +malto +malumore +mana +mancia +mandorla +mangiare +manifesto +mannaro +manovra +mansarda +mantide +manubrio +mappa +maratona +marcire +maretta +marmo +marsupio +maschera +massaia +mastino +materasso +matricola +mattone +maturo +mazurca +meandro +meccanico +mecenate +medesimo +meditare +mega +melassa +melis +melodia +meninge +meno +mensola +mercurio +merenda +merlo +meschino +mese +messere +mestolo +metallo +metodo +mettere +miagolare +mica +micelio +michele +microbo +midollo +miele +migliore +milano +milite +mimosa +minerale +mini +minore +mirino +mirtillo +miscela +missiva +misto +misurare +mitezza +mitigare +mitra +mittente +mnemonico +modello +modifica +modulo +mogano +mogio +mole +molosso +monastero +monco +mondina +monetario +monile +monotono +monsone +montato +monviso +mora +mordere +morsicato +mostro +motivato +motosega +motto +movenza +movimento +mozzo +mucca +mucosa +muffa +mughetto +mugnaio +mulatto +mulinello +multiplo +mummia +munto +muovere +murale +musa +muscolo +musica +mutevole +muto +nababbo +nafta +nanometro +narciso +narice +narrato +nascere +nastrare +naturale +nautica +naviglio +nebulosa +necrosi +negativo +negozio +nemmeno +neofita +neretto +nervo +nessuno +nettuno +neutrale +neve +nevrotico +nicchia +ninfa +nitido +nobile +nocivo +nodo +nome +nomina +nordico +normale +norvegese +nostrano +notare +notizia +notturno +novella +nucleo +nulla +numero +nuovo +nutrire +nuvola +nuziale +oasi +obbedire +obbligo +obelisco +oblio +obolo +obsoleto +occasione +occhio +occidente +occorrere +occultare +ocra +oculato +odierno +odorare +offerta +offrire +offuscato +oggetto +oggi +ognuno +olandese +olfatto +oliato +oliva +ologramma +oltre +omaggio +ombelico +ombra +omega +omissione +ondoso +onere +onice +onnivoro +onorevole +onta +operato +opinione +opposto +oracolo +orafo +ordine +orecchino +orefice +orfano +organico +origine +orizzonte +orma +ormeggio +ornativo +orologio +orrendo +orribile +ortensia +ortica +orzata +orzo +osare +oscurare +osmosi +ospedale +ospite +ossa +ossidare +ostacolo +oste +otite +otre +ottagono +ottimo +ottobre +ovale +ovest +ovino +oviparo +ovocito +ovunque +ovviare +ozio +pacchetto +pace +pacifico +padella +padrone +paese +paga +pagina +palazzina +palesare +pallido +palo +palude +pandoro +pannello +paolo +paonazzo +paprica +parabola +parcella +parere +pargolo +pari +parlato +parola +partire +parvenza +parziale +passivo +pasticca +patacca +patologia +pattume +pavone +peccato +pedalare +pedonale +peggio +peloso +penare +pendice +penisola +pennuto +penombra +pensare +pentola +pepe +pepita +perbene +percorso +perdonato +perforare +pergamena +periodo +permesso +perno +perplesso +persuaso +pertugio +pervaso +pesatore +pesista +peso +pestifero +petalo +pettine +petulante +pezzo +piacere +pianta +piattino +piccino +picozza +piega +pietra +piffero +pigiama +pigolio +pigro +pila +pilifero +pillola +pilota +pimpante +pineta +pinna +pinolo +pioggia +piombo +piramide +piretico +pirite +pirolisi +pitone +pizzico +placebo +planare +plasma +platano +plenario +pochezza +poderoso +podismo +poesia +poggiare +polenta +poligono +pollice +polmonite +polpetta +polso +poltrona +polvere +pomice +pomodoro +ponte +popoloso +porfido +poroso +porpora +porre +portata +posa +positivo +possesso +postulato +potassio +potere +pranzo +prassi +pratica +precluso +predica +prefisso +pregiato +prelievo +premere +prenotare +preparato +presenza +pretesto +prevalso +prima +principe +privato +problema +procura +produrre +profumo +progetto +prolunga +promessa +pronome +proposta +proroga +proteso +prova +prudente +prugna +prurito +psiche +pubblico +pudica +pugilato +pugno +pulce +pulito +pulsante +puntare +pupazzo +pupilla +puro +quadro +qualcosa +quasi +querela +quota +raccolto +raddoppio +radicale +radunato +raffica +ragazzo +ragione +ragno +ramarro +ramingo +ramo +randagio +rantolare +rapato +rapina +rappreso +rasatura +raschiato +rasente +rassegna +rastrello +rata +ravveduto +reale +recepire +recinto +recluta +recondito +recupero +reddito +redimere +regalato +registro +regola +regresso +relazione +remare +remoto +renna +replica +reprimere +reputare +resa +residente +responso +restauro +rete +retina +retorica +rettifica +revocato +riassunto +ribadire +ribelle +ribrezzo +ricarica +ricco +ricevere +riciclato +ricordo +ricreduto +ridicolo +ridurre +rifasare +riflesso +riforma +rifugio +rigare +rigettato +righello +rilassato +rilevato +rimanere +rimbalzo +rimedio +rimorchio +rinascita +rincaro +rinforzo +rinnovo +rinomato +rinsavito +rintocco +rinuncia +rinvenire +riparato +ripetuto +ripieno +riportare +ripresa +ripulire +risata +rischio +riserva +risibile +riso +rispetto +ristoro +risultato +risvolto +ritardo +ritegno +ritmico +ritrovo +riunione +riva +riverso +rivincita +rivolto +rizoma +roba +robotico +robusto +roccia +roco +rodaggio +rodere +roditore +rogito +rollio +romantico +rompere +ronzio +rosolare +rospo +rotante +rotondo +rotula +rovescio +rubizzo +rubrica +ruga +rullino +rumine +rumoroso +ruolo +rupe +russare +rustico +sabato +sabbiare +sabotato +sagoma +salasso +saldatura +salgemma +salivare +salmone +salone +saltare +saluto +salvo +sapere +sapido +saporito +saraceno +sarcasmo +sarto +sassoso +satellite +satira +satollo +saturno +savana +savio +saziato +sbadiglio +sbalzo +sbancato +sbarra +sbattere +sbavare +sbendare +sbirciare +sbloccato +sbocciato +sbrinare +sbruffone +sbuffare +scabroso +scadenza +scala +scambiare +scandalo +scapola +scarso +scatenare +scavato +scelto +scenico +scettro +scheda +schiena +sciarpa +scienza +scindere +scippo +sciroppo +scivolo +sclerare +scodella +scolpito +scomparto +sconforto +scoprire +scorta +scossone +scozzese +scriba +scrollare +scrutinio +scuderia +scultore +scuola +scuro +scusare +sdebitare +sdoganare +seccatura +secondo +sedano +seggiola +segnalato +segregato +seguito +selciato +selettivo +sella +selvaggio +semaforo +sembrare +seme +seminato +sempre +senso +sentire +sepolto +sequenza +serata +serbato +sereno +serio +serpente +serraglio +servire +sestina +setola +settimana +sfacelo +sfaldare +sfamato +sfarzoso +sfaticato +sfera +sfida +sfilato +sfinge +sfocato +sfoderare +sfogo +sfoltire +sforzato +sfratto +sfruttato +sfuggito +sfumare +sfuso +sgabello +sgarbato +sgonfiare +sgorbio +sgrassato +sguardo +sibilo +siccome +sierra +sigla +signore +silenzio +sillaba +simbolo +simpatico +simulato +sinfonia +singolo +sinistro +sino +sintesi +sinusoide +sipario +sisma +sistole +situato +slitta +slogatura +sloveno +smarrito +smemorato +smentito +smeraldo +smilzo +smontare +smottato +smussato +snellire +snervato +snodo +sobbalzo +sobrio +soccorso +sociale +sodale +soffitto +sogno +soldato +solenne +solido +sollazzo +solo +solubile +solvente +somatico +somma +sonda +sonetto +sonnifero +sopire +soppeso +sopra +sorgere +sorpasso +sorriso +sorso +sorteggio +sorvolato +sospiro +sosta +sottile +spada +spalla +spargere +spatola +spavento +spazzola +specie +spedire +spegnere +spelatura +speranza +spessore +spettrale +spezzato +spia +spigoloso +spillato +spinoso +spirale +splendido +sportivo +sposo +spranga +sprecare +spronato +spruzzo +spuntino +squillo +sradicare +srotolato +stabile +stacco +staffa +stagnare +stampato +stantio +starnuto +stasera +statuto +stelo +steppa +sterzo +stiletto +stima +stirpe +stivale +stizzoso +stonato +storico +strappo +stregato +stridulo +strozzare +strutto +stuccare +stufo +stupendo +subentro +succoso +sudore +suggerito +sugo +sultano +suonare +superbo +supporto +surgelato +surrogato +sussurro +sutura +svagare +svedese +sveglio +svelare +svenuto +svezia +sviluppo +svista +svizzera +svolta +svuotare +tabacco +tabulato +tacciare +taciturno +tale +talismano +tampone +tannino +tara +tardivo +targato +tariffa +tarpare +tartaruga +tasto +tattico +taverna +tavolata +tazza +teca +tecnico +telefono +temerario +tempo +temuto +tendone +tenero +tensione +tentacolo +teorema +terme +terrazzo +terzetto +tesi +tesserato +testato +tetro +tettoia +tifare +tigella +timbro +tinto +tipico +tipografo +tiraggio +tiro +titanio +titolo +titubante +tizio +tizzone +toccare +tollerare +tolto +tombola +tomo +tonfo +tonsilla +topazio +topologia +toppa +torba +tornare +torrone +tortora +toscano +tossire +tostatura +totano +trabocco +trachea +trafila +tragedia +tralcio +tramonto +transito +trapano +trarre +trasloco +trattato +trave +treccia +tremolio +trespolo +tributo +tricheco +trifoglio +trillo +trincea +trio +tristezza +triturato +trivella +tromba +trono +troppo +trottola +trovare +truccato +tubatura +tuffato +tulipano +tumulto +tunisia +turbare +turchino +tuta +tutela +ubicato +uccello +uccisore +udire +uditivo +uffa +ufficio +uguale +ulisse +ultimato +umano +umile +umorismo +uncinetto +ungere +ungherese +unicorno +unificato +unisono +unitario +unte +uovo +upupa +uragano +urgenza +urlo +usanza +usato +uscito +usignolo +usuraio +utensile +utilizzo +utopia +vacante +vaccinato +vagabondo +vagliato +valanga +valgo +valico +valletta +valoroso +valutare +valvola +vampata +vangare +vanitoso +vano +vantaggio +vanvera +vapore +varano +varcato +variante +vasca +vedetta +vedova +veduto +vegetale +veicolo +velcro +velina +velluto +veloce +venato +vendemmia +vento +verace +verbale +vergogna +verifica +vero +verruca +verticale +vescica +vessillo +vestale +veterano +vetrina +vetusto +viandante +vibrante +vicenda +vichingo +vicinanza +vidimare +vigilia +vigneto +vigore +vile +villano +vimini +vincitore +viola +vipera +virgola +virologo +virulento +viscoso +visione +vispo +vissuto +visura +vita +vitello +vittima +vivanda +vivido +viziare +voce +voga +volatile +volere +volpe +voragine +vulcano +zampogna +zanna +zappato +zattera +zavorra +zefiro +zelante +zelo +zenzero +zerbino +zibetto +zinco +zircone +zitto +zolla +zotico +zucchero +zufolo +zulu +zuppa +` diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/japanese.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/japanese.go new file mode 100644 index 0000000000..23a76a3431 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/japanese.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/japanese.txt + // $ crc32 japanese.txt + // 0acc1419 + checksum := crc32.ChecksumIEEE([]byte(japanese)) + if fmt.Sprintf("%x", checksum) != "acc1419" { + panic(fmt.Sprintf("japanese checksum invalid: %x", checksum)) + } +} + +// Japanese is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/japanese.txt +var Japanese = strings.Split(strings.TrimSpace(japanese), "\n") +var japanese = `あいこくしん +あいさつ +あいだ +あおぞら +あかちゃん +あきる +あけがた +あける +あこがれる +あさい +あさひ +あしあと +あじわう +あずかる +あずき +あそぶ +あたえる +あたためる +あたりまえ +あたる +あつい +あつかう +あっしゅく +あつまり +あつめる +あてな +あてはまる +あひる +あぶら +あぶる +あふれる +あまい +あまど +あまやかす +あまり +あみもの +あめりか +あやまる +あゆむ +あらいぐま +あらし +あらすじ +あらためる +あらゆる +あらわす +ありがとう +あわせる +あわてる +あんい +あんがい +あんこ +あんぜん +あんてい +あんない +あんまり +いいだす +いおん +いがい +いがく +いきおい +いきなり +いきもの +いきる +いくじ +いくぶん +いけばな +いけん +いこう +いこく +いこつ +いさましい +いさん +いしき +いじゅう +いじょう +いじわる +いずみ +いずれ +いせい +いせえび +いせかい +いせき +いぜん +いそうろう +いそがしい +いだい +いだく +いたずら +いたみ +いたりあ +いちおう +いちじ +いちど +いちば +いちぶ +いちりゅう +いつか +いっしゅん +いっせい +いっそう +いったん +いっち +いってい +いっぽう +いてざ +いてん +いどう +いとこ +いない +いなか +いねむり +いのち +いのる +いはつ +いばる +いはん +いびき +いひん +いふく +いへん +いほう +いみん +いもうと +いもたれ +いもり +いやがる +いやす +いよかん +いよく +いらい +いらすと +いりぐち +いりょう +いれい +いれもの +いれる +いろえんぴつ +いわい +いわう +いわかん +いわば +いわゆる +いんげんまめ +いんさつ +いんしょう +いんよう +うえき +うえる +うおざ +うがい +うかぶ +うかべる +うきわ +うくらいな +うくれれ +うけたまわる +うけつけ +うけとる +うけもつ +うける +うごかす +うごく +うこん +うさぎ +うしなう +うしろがみ +うすい +うすぎ +うすぐらい +うすめる +うせつ +うちあわせ +うちがわ +うちき +うちゅう +うっかり +うつくしい +うったえる +うつる +うどん +うなぎ +うなじ +うなずく +うなる +うねる +うのう +うぶげ +うぶごえ +うまれる +うめる +うもう +うやまう +うよく +うらがえす +うらぐち +うらない +うりあげ +うりきれ +うるさい +うれしい +うれゆき +うれる +うろこ +うわき +うわさ +うんこう +うんちん +うんてん +うんどう +えいえん +えいが +えいきょう +えいご +えいせい +えいぶん +えいよう +えいわ +えおり +えがお +えがく +えきたい +えくせる +えしゃく +えすて +えつらん +えのぐ +えほうまき +えほん +えまき +えもじ +えもの +えらい +えらぶ +えりあ +えんえん +えんかい +えんぎ +えんげき +えんしゅう +えんぜつ +えんそく +えんちょう +えんとつ +おいかける +おいこす +おいしい +おいつく +おうえん +おうさま +おうじ +おうせつ +おうたい +おうふく +おうべい +おうよう +おえる +おおい +おおう +おおどおり +おおや +おおよそ +おかえり +おかず +おがむ +おかわり +おぎなう +おきる +おくさま +おくじょう +おくりがな +おくる +おくれる +おこす +おこなう +おこる +おさえる +おさない +おさめる +おしいれ +おしえる +おじぎ +おじさん +おしゃれ +おそらく +おそわる +おたがい +おたく +おだやか +おちつく +おっと +おつり +おでかけ +おとしもの +おとなしい +おどり +おどろかす +おばさん +おまいり +おめでとう +おもいで +おもう +おもたい +おもちゃ +おやつ +おやゆび +およぼす +おらんだ +おろす +おんがく +おんけい +おんしゃ +おんせん +おんだん +おんちゅう +おんどけい +かあつ +かいが +がいき +がいけん +がいこう +かいさつ +かいしゃ +かいすいよく +かいぜん +かいぞうど +かいつう +かいてん +かいとう +かいふく +がいへき +かいほう +かいよう +がいらい +かいわ +かえる +かおり +かかえる +かがく +かがし +かがみ +かくご +かくとく +かざる +がぞう +かたい +かたち +がちょう +がっきゅう +がっこう +がっさん +がっしょう +かなざわし +かのう +がはく +かぶか +かほう +かほご +かまう +かまぼこ +かめれおん +かゆい +かようび +からい +かるい +かろう +かわく +かわら +がんか +かんけい +かんこう +かんしゃ +かんそう +かんたん +かんち +がんばる +きあい +きあつ +きいろ +ぎいん +きうい +きうん +きえる +きおう +きおく +きおち +きおん +きかい +きかく +きかんしゃ +ききて +きくばり +きくらげ +きけんせい +きこう +きこえる +きこく +きさい +きさく +きさま +きさらぎ +ぎじかがく +ぎしき +ぎじたいけん +ぎじにってい +ぎじゅつしゃ +きすう +きせい +きせき +きせつ +きそう +きぞく +きぞん +きたえる +きちょう +きつえん +ぎっちり +きつつき +きつね +きてい +きどう +きどく +きない +きなが +きなこ +きぬごし +きねん +きのう +きのした +きはく +きびしい +きひん +きふく +きぶん +きぼう +きほん +きまる +きみつ +きむずかしい +きめる +きもだめし +きもち +きもの +きゃく +きやく +ぎゅうにく +きよう +きょうりゅう +きらい +きらく +きりん +きれい +きれつ +きろく +ぎろん +きわめる +ぎんいろ +きんかくじ +きんじょ +きんようび +ぐあい +くいず +くうかん +くうき +くうぐん +くうこう +ぐうせい +くうそう +ぐうたら +くうふく +くうぼ +くかん +くきょう +くげん +ぐこう +くさい +くさき +くさばな +くさる +くしゃみ +くしょう +くすのき +くすりゆび +くせげ +くせん +ぐたいてき +くださる +くたびれる +くちこみ +くちさき +くつした +ぐっすり +くつろぐ +くとうてん +くどく +くなん +くねくね +くのう +くふう +くみあわせ +くみたてる +くめる +くやくしょ +くらす +くらべる +くるま +くれる +くろう +くわしい +ぐんかん +ぐんしょく +ぐんたい +ぐんて +けあな +けいかく +けいけん +けいこ +けいさつ +げいじゅつ +けいたい +げいのうじん +けいれき +けいろ +けおとす +けおりもの +げきか +げきげん +げきだん +げきちん +げきとつ +げきは +げきやく +げこう +げこくじょう +げざい +けさき +げざん +けしき +けしごむ +けしょう +げすと +けたば +けちゃっぷ +けちらす +けつあつ +けつい +けつえき +けっこん +けつじょ +けっせき +けってい +けつまつ +げつようび +げつれい +けつろん +げどく +けとばす +けとる +けなげ +けなす +けなみ +けぬき +げねつ +けねん +けはい +げひん +けぶかい +げぼく +けまり +けみかる +けむし +けむり +けもの +けらい +けろけろ +けわしい +けんい +けんえつ +けんお +けんか +げんき +けんげん +けんこう +けんさく +けんしゅう +けんすう +げんそう +けんちく +けんてい +けんとう +けんない +けんにん +げんぶつ +けんま +けんみん +けんめい +けんらん +けんり +こあくま +こいぬ +こいびと +ごうい +こうえん +こうおん +こうかん +ごうきゅう +ごうけい +こうこう +こうさい +こうじ +こうすい +ごうせい +こうそく +こうたい +こうちゃ +こうつう +こうてい +こうどう +こうない +こうはい +ごうほう +ごうまん +こうもく +こうりつ +こえる +こおり +ごかい +ごがつ +ごかん +こくご +こくさい +こくとう +こくない +こくはく +こぐま +こけい +こける +ここのか +こころ +こさめ +こしつ +こすう +こせい +こせき +こぜん +こそだて +こたい +こたえる +こたつ +こちょう +こっか +こつこつ +こつばん +こつぶ +こてい +こてん +ことがら +ことし +ことば +ことり +こなごな +こねこね +このまま +このみ +このよ +ごはん +こひつじ +こふう +こふん +こぼれる +ごまあぶら +こまかい +ごますり +こまつな +こまる +こむぎこ +こもじ +こもち +こもの +こもん +こやく +こやま +こゆう +こゆび +こよい +こよう +こりる +これくしょん +ころっけ +こわもて +こわれる +こんいん +こんかい +こんき +こんしゅう +こんすい +こんだて +こんとん +こんなん +こんびに +こんぽん +こんまけ +こんや +こんれい +こんわく +ざいえき +さいかい +さいきん +ざいげん +ざいこ +さいしょ +さいせい +ざいたく +ざいちゅう +さいてき +ざいりょう +さうな +さかいし +さがす +さかな +さかみち +さがる +さぎょう +さくし +さくひん +さくら +さこく +さこつ +さずかる +ざせき +さたん +さつえい +ざつおん +ざっか +ざつがく +さっきょく +ざっし +さつじん +ざっそう +さつたば +さつまいも +さてい +さといも +さとう +さとおや +さとし +さとる +さのう +さばく +さびしい +さべつ +さほう +さほど +さます +さみしい +さみだれ +さむけ +さめる +さやえんどう +さゆう +さよう +さよく +さらだ +ざるそば +さわやか +さわる +さんいん +さんか +さんきゃく +さんこう +さんさい +ざんしょ +さんすう +さんせい +さんそ +さんち +さんま +さんみ +さんらん +しあい +しあげ +しあさって +しあわせ +しいく +しいん +しうち +しえい +しおけ +しかい +しかく +じかん +しごと +しすう +じだい +したうけ +したぎ +したて +したみ +しちょう +しちりん +しっかり +しつじ +しつもん +してい +してき +してつ +じてん +じどう +しなぎれ +しなもの +しなん +しねま +しねん +しのぐ +しのぶ +しはい +しばかり +しはつ +しはらい +しはん +しひょう +しふく +じぶん +しへい +しほう +しほん +しまう +しまる +しみん +しむける +じむしょ +しめい +しめる +しもん +しゃいん +しゃうん +しゃおん +じゃがいも +しやくしょ +しゃくほう +しゃけん +しゃこ +しゃざい +しゃしん +しゃせん +しゃそう +しゃたい +しゃちょう +しゃっきん +じゃま +しゃりん +しゃれい +じゆう +じゅうしょ +しゅくはく +じゅしん +しゅっせき +しゅみ +しゅらば +じゅんばん +しょうかい +しょくたく +しょっけん +しょどう +しょもつ +しらせる +しらべる +しんか +しんこう +じんじゃ +しんせいじ +しんちく +しんりん +すあげ +すあし +すあな +ずあん +すいえい +すいか +すいとう +ずいぶん +すいようび +すうがく +すうじつ +すうせん +すおどり +すきま +すくう +すくない +すける +すごい +すこし +ずさん +すずしい +すすむ +すすめる +すっかり +ずっしり +ずっと +すてき +すてる +すねる +すのこ +すはだ +すばらしい +ずひょう +ずぶぬれ +すぶり +すふれ +すべて +すべる +ずほう +すぼん +すまい +すめし +すもう +すやき +すらすら +するめ +すれちがう +すろっと +すわる +すんぜん +すんぽう +せあぶら +せいかつ +せいげん +せいじ +せいよう +せおう +せかいかん +せきにん +せきむ +せきゆ +せきらんうん +せけん +せこう +せすじ +せたい +せたけ +せっかく +せっきゃく +ぜっく +せっけん +せっこつ +せっさたくま +せつぞく +せつだん +せつでん +せっぱん +せつび +せつぶん +せつめい +せつりつ +せなか +せのび +せはば +せびろ +せぼね +せまい +せまる +せめる +せもたれ +せりふ +ぜんあく +せんい +せんえい +せんか +せんきょ +せんく +せんげん +ぜんご +せんさい +せんしゅ +せんすい +せんせい +せんぞ +せんたく +せんちょう +せんてい +せんとう +せんぬき +せんねん +せんぱい +ぜんぶ +ぜんぽう +せんむ +せんめんじょ +せんもん +せんやく +せんゆう +せんよう +ぜんら +ぜんりゃく +せんれい +せんろ +そあく +そいとげる +そいね +そうがんきょう +そうき +そうご +そうしん +そうだん +そうなん +そうび +そうめん +そうり +そえもの +そえん +そがい +そげき +そこう +そこそこ +そざい +そしな +そせい +そせん +そそぐ +そだてる +そつう +そつえん +そっかん +そつぎょう +そっけつ +そっこう +そっせん +そっと +そとがわ +そとづら +そなえる +そなた +そふぼ +そぼく +そぼろ +そまつ +そまる +そむく +そむりえ +そめる +そもそも +そよかぜ +そらまめ +そろう +そんかい +そんけい +そんざい +そんしつ +そんぞく +そんちょう +ぞんび +ぞんぶん +そんみん +たあい +たいいん +たいうん +たいえき +たいおう +だいがく +たいき +たいぐう +たいけん +たいこ +たいざい +だいじょうぶ +だいすき +たいせつ +たいそう +だいたい +たいちょう +たいてい +だいどころ +たいない +たいねつ +たいのう +たいはん +だいひょう +たいふう +たいへん +たいほ +たいまつばな +たいみんぐ +たいむ +たいめん +たいやき +たいよう +たいら +たいりょく +たいる +たいわん +たうえ +たえる +たおす +たおる +たおれる +たかい +たかね +たきび +たくさん +たこく +たこやき +たさい +たしざん +だじゃれ +たすける +たずさわる +たそがれ +たたかう +たたく +ただしい +たたみ +たちばな +だっかい +だっきゃく +だっこ +だっしゅつ +だったい +たてる +たとえる +たなばた +たにん +たぬき +たのしみ +たはつ +たぶん +たべる +たぼう +たまご +たまる +だむる +ためいき +ためす +ためる +たもつ +たやすい +たよる +たらす +たりきほんがん +たりょう +たりる +たると +たれる +たれんと +たろっと +たわむれる +だんあつ +たんい +たんおん +たんか +たんき +たんけん +たんご +たんさん +たんじょうび +だんせい +たんそく +たんたい +だんち +たんてい +たんとう +だんな +たんにん +だんねつ +たんのう +たんぴん +だんぼう +たんまつ +たんめい +だんれつ +だんろ +だんわ +ちあい +ちあん +ちいき +ちいさい +ちえん +ちかい +ちから +ちきゅう +ちきん +ちけいず +ちけん +ちこく +ちさい +ちしき +ちしりょう +ちせい +ちそう +ちたい +ちたん +ちちおや +ちつじょ +ちてき +ちてん +ちぬき +ちぬり +ちのう +ちひょう +ちへいせん +ちほう +ちまた +ちみつ +ちみどろ +ちめいど +ちゃんこなべ +ちゅうい +ちゆりょく +ちょうし +ちょさくけん +ちらし +ちらみ +ちりがみ +ちりょう +ちるど +ちわわ +ちんたい +ちんもく +ついか +ついたち +つうか +つうじょう +つうはん +つうわ +つかう +つかれる +つくね +つくる +つけね +つける +つごう +つたえる +つづく +つつじ +つつむ +つとめる +つながる +つなみ +つねづね +つのる +つぶす +つまらない +つまる +つみき +つめたい +つもり +つもる +つよい +つるぼ +つるみく +つわもの +つわり +てあし +てあて +てあみ +ていおん +ていか +ていき +ていけい +ていこく +ていさつ +ていし +ていせい +ていたい +ていど +ていねい +ていひょう +ていへん +ていぼう +てうち +ておくれ +てきとう +てくび +でこぼこ +てさぎょう +てさげ +てすり +てそう +てちがい +てちょう +てつがく +てつづき +でっぱ +てつぼう +てつや +でぬかえ +てぬき +てぬぐい +てのひら +てはい +てぶくろ +てふだ +てほどき +てほん +てまえ +てまきずし +てみじか +てみやげ +てらす +てれび +てわけ +てわたし +でんあつ +てんいん +てんかい +てんき +てんぐ +てんけん +てんごく +てんさい +てんし +てんすう +でんち +てんてき +てんとう +てんない +てんぷら +てんぼうだい +てんめつ +てんらんかい +でんりょく +でんわ +どあい +といれ +どうかん +とうきゅう +どうぐ +とうし +とうむぎ +とおい +とおか +とおく +とおす +とおる +とかい +とかす +ときおり +ときどき +とくい +とくしゅう +とくてん +とくに +とくべつ +とけい +とける +とこや +とさか +としょかん +とそう +とたん +とちゅう +とっきゅう +とっくん +とつぜん +とつにゅう +とどける +ととのえる +とない +となえる +となり +とのさま +とばす +どぶがわ +とほう +とまる +とめる +ともだち +ともる +どようび +とらえる +とんかつ +どんぶり +ないかく +ないこう +ないしょ +ないす +ないせん +ないそう +なおす +ながい +なくす +なげる +なこうど +なさけ +なたでここ +なっとう +なつやすみ +ななおし +なにごと +なにもの +なにわ +なのか +なふだ +なまいき +なまえ +なまみ +なみだ +なめらか +なめる +なやむ +ならう +ならび +ならぶ +なれる +なわとび +なわばり +にあう +にいがた +にうけ +におい +にかい +にがて +にきび +にくしみ +にくまん +にげる +にさんかたんそ +にしき +にせもの +にちじょう +にちようび +にっか +にっき +にっけい +にっこう +にっさん +にっしょく +にっすう +にっせき +にってい +になう +にほん +にまめ +にもつ +にやり +にゅういん +にりんしゃ +にわとり +にんい +にんか +にんき +にんげん +にんしき +にんずう +にんそう +にんたい +にんち +にんてい +にんにく +にんぷ +にんまり +にんむ +にんめい +にんよう +ぬいくぎ +ぬかす +ぬぐいとる +ぬぐう +ぬくもり +ぬすむ +ぬまえび +ぬめり +ぬらす +ぬんちゃく +ねあげ +ねいき +ねいる +ねいろ +ねぐせ +ねくたい +ねくら +ねこぜ +ねこむ +ねさげ +ねすごす +ねそべる +ねだん +ねつい +ねっしん +ねつぞう +ねったいぎょ +ねぶそく +ねふだ +ねぼう +ねほりはほり +ねまき +ねまわし +ねみみ +ねむい +ねむたい +ねもと +ねらう +ねわざ +ねんいり +ねんおし +ねんかん +ねんきん +ねんぐ +ねんざ +ねんし +ねんちゃく +ねんど +ねんぴ +ねんぶつ +ねんまつ +ねんりょう +ねんれい +のいず +のおづま +のがす +のきなみ +のこぎり +のこす +のこる +のせる +のぞく +のぞむ +のたまう +のちほど +のっく +のばす +のはら +のべる +のぼる +のみもの +のやま +のらいぬ +のらねこ +のりもの +のりゆき +のれん +のんき +ばあい +はあく +ばあさん +ばいか +ばいく +はいけん +はいご +はいしん +はいすい +はいせん +はいそう +はいち +ばいばい +はいれつ +はえる +はおる +はかい +ばかり +はかる +はくしゅ +はけん +はこぶ +はさみ +はさん +はしご +ばしょ +はしる +はせる +ぱそこん +はそん +はたん +はちみつ +はつおん +はっかく +はづき +はっきり +はっくつ +はっけん +はっこう +はっさん +はっしん +はったつ +はっちゅう +はってん +はっぴょう +はっぽう +はなす +はなび +はにかむ +はぶらし +はみがき +はむかう +はめつ +はやい +はやし +はらう +はろうぃん +はわい +はんい +はんえい +はんおん +はんかく +はんきょう +ばんぐみ +はんこ +はんしゃ +はんすう +はんだん +ぱんち +ぱんつ +はんてい +はんとし +はんのう +はんぱ +はんぶん +はんぺん +はんぼうき +はんめい +はんらん +はんろん +ひいき +ひうん +ひえる +ひかく +ひかり +ひかる +ひかん +ひくい +ひけつ +ひこうき +ひこく +ひさい +ひさしぶり +ひさん +びじゅつかん +ひしょ +ひそか +ひそむ +ひたむき +ひだり +ひたる +ひつぎ +ひっこし +ひっし +ひつじゅひん +ひっす +ひつぜん +ぴったり +ぴっちり +ひつよう +ひてい +ひとごみ +ひなまつり +ひなん +ひねる +ひはん +ひびく +ひひょう +ひほう +ひまわり +ひまん +ひみつ +ひめい +ひめじし +ひやけ +ひやす +ひよう +びょうき +ひらがな +ひらく +ひりつ +ひりょう +ひるま +ひるやすみ +ひれい +ひろい +ひろう +ひろき +ひろゆき +ひんかく +ひんけつ +ひんこん +ひんしゅ +ひんそう +ぴんち +ひんぱん +びんぼう +ふあん +ふいうち +ふうけい +ふうせん +ぷうたろう +ふうとう +ふうふ +ふえる +ふおん +ふかい +ふきん +ふくざつ +ふくぶくろ +ふこう +ふさい +ふしぎ +ふじみ +ふすま +ふせい +ふせぐ +ふそく +ぶたにく +ふたん +ふちょう +ふつう +ふつか +ふっかつ +ふっき +ふっこく +ぶどう +ふとる +ふとん +ふのう +ふはい +ふひょう +ふへん +ふまん +ふみん +ふめつ +ふめん +ふよう +ふりこ +ふりる +ふるい +ふんいき +ぶんがく +ぶんぐ +ふんしつ +ぶんせき +ふんそう +ぶんぽう +へいあん +へいおん +へいがい +へいき +へいげん +へいこう +へいさ +へいしゃ +へいせつ +へいそ +へいたく +へいてん +へいねつ +へいわ +へきが +へこむ +べにいろ +べにしょうが +へらす +へんかん +べんきょう +べんごし +へんさい +へんたい +べんり +ほあん +ほいく +ぼうぎょ +ほうこく +ほうそう +ほうほう +ほうもん +ほうりつ +ほえる +ほおん +ほかん +ほきょう +ぼきん +ほくろ +ほけつ +ほけん +ほこう +ほこる +ほしい +ほしつ +ほしゅ +ほしょう +ほせい +ほそい +ほそく +ほたて +ほたる +ぽちぶくろ +ほっきょく +ほっさ +ほったん +ほとんど +ほめる +ほんい +ほんき +ほんけ +ほんしつ +ほんやく +まいにち +まかい +まかせる +まがる +まける +まこと +まさつ +まじめ +ますく +まぜる +まつり +まとめ +まなぶ +まぬけ +まねく +まほう +まもる +まゆげ +まよう +まろやか +まわす +まわり +まわる +まんが +まんきつ +まんぞく +まんなか +みいら +みうち +みえる +みがく +みかた +みかん +みけん +みこん +みじかい +みすい +みすえる +みせる +みっか +みつかる +みつける +みてい +みとめる +みなと +みなみかさい +みねらる +みのう +みのがす +みほん +みもと +みやげ +みらい +みりょく +みわく +みんか +みんぞく +むいか +むえき +むえん +むかい +むかう +むかえ +むかし +むぎちゃ +むける +むげん +むさぼる +むしあつい +むしば +むじゅん +むしろ +むすう +むすこ +むすぶ +むすめ +むせる +むせん +むちゅう +むなしい +むのう +むやみ +むよう +むらさき +むりょう +むろん +めいあん +めいうん +めいえん +めいかく +めいきょく +めいさい +めいし +めいそう +めいぶつ +めいれい +めいわく +めぐまれる +めざす +めした +めずらしい +めだつ +めまい +めやす +めんきょ +めんせき +めんどう +もうしあげる +もうどうけん +もえる +もくし +もくてき +もくようび +もちろん +もどる +もらう +もんく +もんだい +やおや +やける +やさい +やさしい +やすい +やすたろう +やすみ +やせる +やそう +やたい +やちん +やっと +やっぱり +やぶる +やめる +ややこしい +やよい +やわらかい +ゆうき +ゆうびんきょく +ゆうべ +ゆうめい +ゆけつ +ゆしゅつ +ゆせん +ゆそう +ゆたか +ゆちゃく +ゆでる +ゆにゅう +ゆびわ +ゆらい +ゆれる +ようい +ようか +ようきゅう +ようじ +ようす +ようちえん +よかぜ +よかん +よきん +よくせい +よくぼう +よけい +よごれる +よさん +よしゅう +よそう +よそく +よっか +よてい +よどがわく +よねつ +よやく +よゆう +よろこぶ +よろしい +らいう +らくがき +らくご +らくさつ +らくだ +らしんばん +らせん +らぞく +らたい +らっか +られつ +りえき +りかい +りきさく +りきせつ +りくぐん +りくつ +りけん +りこう +りせい +りそう +りそく +りてん +りねん +りゆう +りゅうがく +りよう +りょうり +りょかん +りょくちゃ +りょこう +りりく +りれき +りろん +りんご +るいけい +るいさい +るいじ +るいせき +るすばん +るりがわら +れいかん +れいぎ +れいせい +れいぞうこ +れいとう +れいぼう +れきし +れきだい +れんあい +れんけい +れんこん +れんさい +れんしゅう +れんぞく +れんらく +ろうか +ろうご +ろうじん +ろうそく +ろくが +ろこつ +ろじうら +ろしゅつ +ろせん +ろてん +ろめん +ろれつ +ろんぎ +ろんぱ +ろんぶん +ろんり +わかす +わかめ +わかやま +わかれる +わしつ +わじまし +わすれもの +わらう +われる +` diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/korean.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/korean.go new file mode 100644 index 0000000000..1d31775633 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/korean.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/korean.txt + // $ crc32 korean.txt + // 4ef461eb + checksum := crc32.ChecksumIEEE([]byte(korean)) + if fmt.Sprintf("%x", checksum) != "4ef461eb" { + panic("korean checksum invalid") + } +} + +// Korean is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/korean.txt +var Korean = strings.Split(strings.TrimSpace(korean), "\n") +var korean = `가격 +가끔 +가난 +가능 +가득 +가르침 +가뭄 +가방 +가상 +가슴 +가운데 +가을 +가이드 +가입 +가장 +가정 +가족 +가죽 +각오 +각자 +간격 +간부 +간섭 +간장 +간접 +간판 +갈등 +갈비 +갈색 +갈증 +감각 +감기 +감소 +감수성 +감자 +감정 +갑자기 +강남 +강당 +강도 +강력히 +강변 +강북 +강사 +강수량 +강아지 +강원도 +강의 +강제 +강조 +같이 +개구리 +개나리 +개방 +개별 +개선 +개성 +개인 +객관적 +거실 +거액 +거울 +거짓 +거품 +걱정 +건강 +건물 +건설 +건조 +건축 +걸음 +검사 +검토 +게시판 +게임 +겨울 +견해 +결과 +결국 +결론 +결석 +결승 +결심 +결정 +결혼 +경계 +경고 +경기 +경력 +경복궁 +경비 +경상도 +경영 +경우 +경쟁 +경제 +경주 +경찰 +경치 +경향 +경험 +계곡 +계단 +계란 +계산 +계속 +계약 +계절 +계층 +계획 +고객 +고구려 +고궁 +고급 +고등학생 +고무신 +고민 +고양이 +고장 +고전 +고집 +고춧가루 +고통 +고향 +곡식 +골목 +골짜기 +골프 +공간 +공개 +공격 +공군 +공급 +공기 +공동 +공무원 +공부 +공사 +공식 +공업 +공연 +공원 +공장 +공짜 +공책 +공통 +공포 +공항 +공휴일 +과목 +과일 +과장 +과정 +과학 +관객 +관계 +관광 +관념 +관람 +관련 +관리 +관습 +관심 +관점 +관찰 +광경 +광고 +광장 +광주 +괴로움 +굉장히 +교과서 +교문 +교복 +교실 +교양 +교육 +교장 +교직 +교통 +교환 +교훈 +구경 +구름 +구멍 +구별 +구분 +구석 +구성 +구속 +구역 +구입 +구청 +구체적 +국가 +국기 +국내 +국립 +국물 +국민 +국수 +국어 +국왕 +국적 +국제 +국회 +군대 +군사 +군인 +궁극적 +권리 +권위 +권투 +귀국 +귀신 +규정 +규칙 +균형 +그날 +그냥 +그늘 +그러나 +그룹 +그릇 +그림 +그제서야 +그토록 +극복 +극히 +근거 +근교 +근래 +근로 +근무 +근본 +근원 +근육 +근처 +글씨 +글자 +금강산 +금고 +금년 +금메달 +금액 +금연 +금요일 +금지 +긍정적 +기간 +기관 +기념 +기능 +기독교 +기둥 +기록 +기름 +기법 +기본 +기분 +기쁨 +기숙사 +기술 +기억 +기업 +기온 +기운 +기원 +기적 +기준 +기침 +기혼 +기획 +긴급 +긴장 +길이 +김밥 +김치 +김포공항 +깍두기 +깜빡 +깨달음 +깨소금 +껍질 +꼭대기 +꽃잎 +나들이 +나란히 +나머지 +나물 +나침반 +나흘 +낙엽 +난방 +날개 +날씨 +날짜 +남녀 +남대문 +남매 +남산 +남자 +남편 +남학생 +낭비 +낱말 +내년 +내용 +내일 +냄비 +냄새 +냇물 +냉동 +냉면 +냉방 +냉장고 +넥타이 +넷째 +노동 +노란색 +노력 +노인 +녹음 +녹차 +녹화 +논리 +논문 +논쟁 +놀이 +농구 +농담 +농민 +농부 +농업 +농장 +농촌 +높이 +눈동자 +눈물 +눈썹 +뉴욕 +느낌 +늑대 +능동적 +능력 +다방 +다양성 +다음 +다이어트 +다행 +단계 +단골 +단독 +단맛 +단순 +단어 +단위 +단점 +단체 +단추 +단편 +단풍 +달걀 +달러 +달력 +달리 +닭고기 +담당 +담배 +담요 +담임 +답변 +답장 +당근 +당분간 +당연히 +당장 +대규모 +대낮 +대단히 +대답 +대도시 +대략 +대량 +대륙 +대문 +대부분 +대신 +대응 +대장 +대전 +대접 +대중 +대책 +대출 +대충 +대통령 +대학 +대한민국 +대합실 +대형 +덩어리 +데이트 +도대체 +도덕 +도둑 +도망 +도서관 +도심 +도움 +도입 +도자기 +도저히 +도전 +도중 +도착 +독감 +독립 +독서 +독일 +독창적 +동화책 +뒷모습 +뒷산 +딸아이 +마누라 +마늘 +마당 +마라톤 +마련 +마무리 +마사지 +마약 +마요네즈 +마을 +마음 +마이크 +마중 +마지막 +마찬가지 +마찰 +마흔 +막걸리 +막내 +막상 +만남 +만두 +만세 +만약 +만일 +만점 +만족 +만화 +많이 +말기 +말씀 +말투 +맘대로 +망원경 +매년 +매달 +매력 +매번 +매스컴 +매일 +매장 +맥주 +먹이 +먼저 +먼지 +멀리 +메일 +며느리 +며칠 +면담 +멸치 +명단 +명령 +명예 +명의 +명절 +명칭 +명함 +모금 +모니터 +모델 +모든 +모범 +모습 +모양 +모임 +모조리 +모집 +모퉁이 +목걸이 +목록 +목사 +목소리 +목숨 +목적 +목표 +몰래 +몸매 +몸무게 +몸살 +몸속 +몸짓 +몸통 +몹시 +무관심 +무궁화 +무더위 +무덤 +무릎 +무슨 +무엇 +무역 +무용 +무조건 +무지개 +무척 +문구 +문득 +문법 +문서 +문제 +문학 +문화 +물가 +물건 +물결 +물고기 +물론 +물리학 +물음 +물질 +물체 +미국 +미디어 +미사일 +미술 +미역 +미용실 +미움 +미인 +미팅 +미혼 +민간 +민족 +민주 +믿음 +밀가루 +밀리미터 +밑바닥 +바가지 +바구니 +바나나 +바늘 +바닥 +바닷가 +바람 +바이러스 +바탕 +박물관 +박사 +박수 +반대 +반드시 +반말 +반발 +반성 +반응 +반장 +반죽 +반지 +반찬 +받침 +발가락 +발걸음 +발견 +발달 +발레 +발목 +발바닥 +발생 +발음 +발자국 +발전 +발톱 +발표 +밤하늘 +밥그릇 +밥맛 +밥상 +밥솥 +방금 +방면 +방문 +방바닥 +방법 +방송 +방식 +방안 +방울 +방지 +방학 +방해 +방향 +배경 +배꼽 +배달 +배드민턴 +백두산 +백색 +백성 +백인 +백제 +백화점 +버릇 +버섯 +버튼 +번개 +번역 +번지 +번호 +벌금 +벌레 +벌써 +범위 +범인 +범죄 +법률 +법원 +법적 +법칙 +베이징 +벨트 +변경 +변동 +변명 +변신 +변호사 +변화 +별도 +별명 +별일 +병실 +병아리 +병원 +보관 +보너스 +보라색 +보람 +보름 +보상 +보안 +보자기 +보장 +보전 +보존 +보통 +보편적 +보험 +복도 +복사 +복숭아 +복습 +볶음 +본격적 +본래 +본부 +본사 +본성 +본인 +본질 +볼펜 +봉사 +봉지 +봉투 +부근 +부끄러움 +부담 +부동산 +부문 +부분 +부산 +부상 +부엌 +부인 +부작용 +부장 +부정 +부족 +부지런히 +부친 +부탁 +부품 +부회장 +북부 +북한 +분노 +분량 +분리 +분명 +분석 +분야 +분위기 +분필 +분홍색 +불고기 +불과 +불교 +불꽃 +불만 +불법 +불빛 +불안 +불이익 +불행 +브랜드 +비극 +비난 +비닐 +비둘기 +비디오 +비로소 +비만 +비명 +비밀 +비바람 +비빔밥 +비상 +비용 +비율 +비중 +비타민 +비판 +빌딩 +빗물 +빗방울 +빗줄기 +빛깔 +빨간색 +빨래 +빨리 +사건 +사계절 +사나이 +사냥 +사람 +사랑 +사립 +사모님 +사물 +사방 +사상 +사생활 +사설 +사슴 +사실 +사업 +사용 +사월 +사장 +사전 +사진 +사촌 +사춘기 +사탕 +사투리 +사흘 +산길 +산부인과 +산업 +산책 +살림 +살인 +살짝 +삼계탕 +삼국 +삼십 +삼월 +삼촌 +상관 +상금 +상대 +상류 +상반기 +상상 +상식 +상업 +상인 +상자 +상점 +상처 +상추 +상태 +상표 +상품 +상황 +새벽 +색깔 +색연필 +생각 +생명 +생물 +생방송 +생산 +생선 +생신 +생일 +생활 +서랍 +서른 +서명 +서민 +서비스 +서양 +서울 +서적 +서점 +서쪽 +서클 +석사 +석유 +선거 +선물 +선배 +선생 +선수 +선원 +선장 +선전 +선택 +선풍기 +설거지 +설날 +설렁탕 +설명 +설문 +설사 +설악산 +설치 +설탕 +섭씨 +성공 +성당 +성명 +성별 +성인 +성장 +성적 +성질 +성함 +세금 +세미나 +세상 +세월 +세종대왕 +세탁 +센터 +센티미터 +셋째 +소규모 +소극적 +소금 +소나기 +소년 +소득 +소망 +소문 +소설 +소속 +소아과 +소용 +소원 +소음 +소중히 +소지품 +소질 +소풍 +소형 +속담 +속도 +속옷 +손가락 +손길 +손녀 +손님 +손등 +손목 +손뼉 +손실 +손질 +손톱 +손해 +솔직히 +솜씨 +송아지 +송이 +송편 +쇠고기 +쇼핑 +수건 +수년 +수단 +수돗물 +수동적 +수면 +수명 +수박 +수상 +수석 +수술 +수시로 +수업 +수염 +수영 +수입 +수준 +수집 +수출 +수컷 +수필 +수학 +수험생 +수화기 +숙녀 +숙소 +숙제 +순간 +순서 +순수 +순식간 +순위 +숟가락 +술병 +술집 +숫자 +스님 +스물 +스스로 +스승 +스웨터 +스위치 +스케이트 +스튜디오 +스트레스 +스포츠 +슬쩍 +슬픔 +습관 +습기 +승객 +승리 +승부 +승용차 +승진 +시각 +시간 +시골 +시금치 +시나리오 +시댁 +시리즈 +시멘트 +시민 +시부모 +시선 +시설 +시스템 +시아버지 +시어머니 +시월 +시인 +시일 +시작 +시장 +시절 +시점 +시중 +시즌 +시집 +시청 +시합 +시험 +식구 +식기 +식당 +식량 +식료품 +식물 +식빵 +식사 +식생활 +식초 +식탁 +식품 +신고 +신규 +신념 +신문 +신발 +신비 +신사 +신세 +신용 +신제품 +신청 +신체 +신화 +실감 +실내 +실력 +실례 +실망 +실수 +실습 +실시 +실장 +실정 +실질적 +실천 +실체 +실컷 +실태 +실패 +실험 +실현 +심리 +심부름 +심사 +심장 +심정 +심판 +쌍둥이 +씨름 +씨앗 +아가씨 +아나운서 +아드님 +아들 +아쉬움 +아스팔트 +아시아 +아울러 +아저씨 +아줌마 +아직 +아침 +아파트 +아프리카 +아픔 +아홉 +아흔 +악기 +악몽 +악수 +안개 +안경 +안과 +안내 +안녕 +안동 +안방 +안부 +안주 +알루미늄 +알코올 +암시 +암컷 +압력 +앞날 +앞문 +애인 +애정 +액수 +앨범 +야간 +야단 +야옹 +약간 +약국 +약속 +약수 +약점 +약품 +약혼녀 +양념 +양력 +양말 +양배추 +양주 +양파 +어둠 +어려움 +어른 +어젯밤 +어쨌든 +어쩌다가 +어쩐지 +언니 +언덕 +언론 +언어 +얼굴 +얼른 +얼음 +얼핏 +엄마 +업무 +업종 +업체 +엉덩이 +엉망 +엉터리 +엊그제 +에너지 +에어컨 +엔진 +여건 +여고생 +여관 +여군 +여권 +여대생 +여덟 +여동생 +여든 +여론 +여름 +여섯 +여성 +여왕 +여인 +여전히 +여직원 +여학생 +여행 +역사 +역시 +역할 +연결 +연구 +연극 +연기 +연락 +연설 +연세 +연속 +연습 +연애 +연예인 +연인 +연장 +연주 +연출 +연필 +연합 +연휴 +열기 +열매 +열쇠 +열심히 +열정 +열차 +열흘 +염려 +엽서 +영국 +영남 +영상 +영양 +영역 +영웅 +영원히 +영하 +영향 +영혼 +영화 +옆구리 +옆방 +옆집 +예감 +예금 +예방 +예산 +예상 +예선 +예술 +예습 +예식장 +예약 +예전 +예절 +예정 +예컨대 +옛날 +오늘 +오락 +오랫동안 +오렌지 +오로지 +오른발 +오븐 +오십 +오염 +오월 +오전 +오직 +오징어 +오페라 +오피스텔 +오히려 +옥상 +옥수수 +온갖 +온라인 +온몸 +온종일 +온통 +올가을 +올림픽 +올해 +옷차림 +와이셔츠 +와인 +완성 +완전 +왕비 +왕자 +왜냐하면 +왠지 +외갓집 +외국 +외로움 +외삼촌 +외출 +외침 +외할머니 +왼발 +왼손 +왼쪽 +요금 +요일 +요즘 +요청 +용기 +용서 +용어 +우산 +우선 +우승 +우연히 +우정 +우체국 +우편 +운동 +운명 +운반 +운전 +운행 +울산 +울음 +움직임 +웃어른 +웃음 +워낙 +원고 +원래 +원서 +원숭이 +원인 +원장 +원피스 +월급 +월드컵 +월세 +월요일 +웨이터 +위반 +위법 +위성 +위원 +위험 +위협 +윗사람 +유난히 +유럽 +유명 +유물 +유산 +유적 +유치원 +유학 +유행 +유형 +육군 +육상 +육십 +육체 +은행 +음력 +음료 +음반 +음성 +음식 +음악 +음주 +의견 +의논 +의문 +의복 +의식 +의심 +의외로 +의욕 +의원 +의학 +이것 +이곳 +이념 +이놈 +이달 +이대로 +이동 +이렇게 +이력서 +이론적 +이름 +이민 +이발소 +이별 +이불 +이빨 +이상 +이성 +이슬 +이야기 +이용 +이웃 +이월 +이윽고 +이익 +이전 +이중 +이튿날 +이틀 +이혼 +인간 +인격 +인공 +인구 +인근 +인기 +인도 +인류 +인물 +인생 +인쇄 +인연 +인원 +인재 +인종 +인천 +인체 +인터넷 +인하 +인형 +일곱 +일기 +일단 +일대 +일등 +일반 +일본 +일부 +일상 +일생 +일손 +일요일 +일월 +일정 +일종 +일주일 +일찍 +일체 +일치 +일행 +일회용 +임금 +임무 +입대 +입력 +입맛 +입사 +입술 +입시 +입원 +입장 +입학 +자가용 +자격 +자극 +자동 +자랑 +자부심 +자식 +자신 +자연 +자원 +자율 +자전거 +자정 +자존심 +자판 +작가 +작년 +작성 +작업 +작용 +작은딸 +작품 +잔디 +잔뜩 +잔치 +잘못 +잠깐 +잠수함 +잠시 +잠옷 +잠자리 +잡지 +장관 +장군 +장기간 +장래 +장례 +장르 +장마 +장면 +장모 +장미 +장비 +장사 +장소 +장식 +장애인 +장인 +장점 +장차 +장학금 +재능 +재빨리 +재산 +재생 +재작년 +재정 +재채기 +재판 +재학 +재활용 +저것 +저고리 +저곳 +저녁 +저런 +저렇게 +저번 +저울 +저절로 +저축 +적극 +적당히 +적성 +적용 +적응 +전개 +전공 +전기 +전달 +전라도 +전망 +전문 +전반 +전부 +전세 +전시 +전용 +전자 +전쟁 +전주 +전철 +전체 +전통 +전혀 +전후 +절대 +절망 +절반 +절약 +절차 +점검 +점수 +점심 +점원 +점점 +점차 +접근 +접시 +접촉 +젓가락 +정거장 +정도 +정류장 +정리 +정말 +정면 +정문 +정반대 +정보 +정부 +정비 +정상 +정성 +정오 +정원 +정장 +정지 +정치 +정확히 +제공 +제과점 +제대로 +제목 +제발 +제법 +제삿날 +제안 +제일 +제작 +제주도 +제출 +제품 +제한 +조각 +조건 +조금 +조깅 +조명 +조미료 +조상 +조선 +조용히 +조절 +조정 +조직 +존댓말 +존재 +졸업 +졸음 +종교 +종로 +종류 +종소리 +종업원 +종종 +종합 +좌석 +죄인 +주관적 +주름 +주말 +주머니 +주먹 +주문 +주민 +주방 +주변 +주식 +주인 +주일 +주장 +주전자 +주택 +준비 +줄거리 +줄기 +줄무늬 +중간 +중계방송 +중국 +중년 +중단 +중독 +중반 +중부 +중세 +중소기업 +중순 +중앙 +중요 +중학교 +즉석 +즉시 +즐거움 +증가 +증거 +증권 +증상 +증세 +지각 +지갑 +지경 +지극히 +지금 +지급 +지능 +지름길 +지리산 +지방 +지붕 +지식 +지역 +지우개 +지원 +지적 +지점 +지진 +지출 +직선 +직업 +직원 +직장 +진급 +진동 +진로 +진료 +진리 +진짜 +진찰 +진출 +진통 +진행 +질문 +질병 +질서 +짐작 +집단 +집안 +집중 +짜증 +찌꺼기 +차남 +차라리 +차량 +차림 +차별 +차선 +차츰 +착각 +찬물 +찬성 +참가 +참기름 +참새 +참석 +참여 +참외 +참조 +찻잔 +창가 +창고 +창구 +창문 +창밖 +창작 +창조 +채널 +채점 +책가방 +책방 +책상 +책임 +챔피언 +처벌 +처음 +천국 +천둥 +천장 +천재 +천천히 +철도 +철저히 +철학 +첫날 +첫째 +청년 +청바지 +청소 +청춘 +체계 +체력 +체온 +체육 +체중 +체험 +초등학생 +초반 +초밥 +초상화 +초순 +초여름 +초원 +초저녁 +초점 +초청 +초콜릿 +촛불 +총각 +총리 +총장 +촬영 +최근 +최상 +최선 +최신 +최악 +최종 +추석 +추억 +추진 +추천 +추측 +축구 +축소 +축제 +축하 +출근 +출발 +출산 +출신 +출연 +출입 +출장 +출판 +충격 +충고 +충돌 +충분히 +충청도 +취업 +취직 +취향 +치약 +친구 +친척 +칠십 +칠월 +칠판 +침대 +침묵 +침실 +칫솔 +칭찬 +카메라 +카운터 +칼국수 +캐릭터 +캠퍼스 +캠페인 +커튼 +컨디션 +컬러 +컴퓨터 +코끼리 +코미디 +콘서트 +콜라 +콤플렉스 +콩나물 +쾌감 +쿠데타 +크림 +큰길 +큰딸 +큰소리 +큰아들 +큰어머니 +큰일 +큰절 +클래식 +클럽 +킬로 +타입 +타자기 +탁구 +탁자 +탄생 +태권도 +태양 +태풍 +택시 +탤런트 +터널 +터미널 +테니스 +테스트 +테이블 +텔레비전 +토론 +토마토 +토요일 +통계 +통과 +통로 +통신 +통역 +통일 +통장 +통제 +통증 +통합 +통화 +퇴근 +퇴원 +퇴직금 +튀김 +트럭 +특급 +특별 +특성 +특수 +특징 +특히 +튼튼히 +티셔츠 +파란색 +파일 +파출소 +판결 +판단 +판매 +판사 +팔십 +팔월 +팝송 +패션 +팩스 +팩시밀리 +팬티 +퍼센트 +페인트 +편견 +편의 +편지 +편히 +평가 +평균 +평생 +평소 +평양 +평일 +평화 +포스터 +포인트 +포장 +포함 +표면 +표정 +표준 +표현 +품목 +품질 +풍경 +풍속 +풍습 +프랑스 +프린터 +플라스틱 +피곤 +피망 +피아노 +필름 +필수 +필요 +필자 +필통 +핑계 +하느님 +하늘 +하드웨어 +하룻밤 +하반기 +하숙집 +하순 +하여튼 +하지만 +하천 +하품 +하필 +학과 +학교 +학급 +학기 +학년 +학력 +학번 +학부모 +학비 +학생 +학술 +학습 +학용품 +학원 +학위 +학자 +학점 +한계 +한글 +한꺼번에 +한낮 +한눈 +한동안 +한때 +한라산 +한마디 +한문 +한번 +한복 +한식 +한여름 +한쪽 +할머니 +할아버지 +할인 +함께 +함부로 +합격 +합리적 +항공 +항구 +항상 +항의 +해결 +해군 +해답 +해당 +해물 +해석 +해설 +해수욕장 +해안 +핵심 +핸드백 +햄버거 +햇볕 +햇살 +행동 +행복 +행사 +행운 +행위 +향기 +향상 +향수 +허락 +허용 +헬기 +현관 +현금 +현대 +현상 +현실 +현장 +현재 +현지 +혈액 +협력 +형부 +형사 +형수 +형식 +형제 +형태 +형편 +혜택 +호기심 +호남 +호랑이 +호박 +호텔 +호흡 +혹시 +홀로 +홈페이지 +홍보 +홍수 +홍차 +화면 +화분 +화살 +화요일 +화장 +화학 +확보 +확인 +확장 +확정 +환갑 +환경 +환영 +환율 +환자 +활기 +활동 +활발히 +활용 +활짝 +회견 +회관 +회복 +회색 +회원 +회장 +회전 +횟수 +횡단보도 +효율적 +후반 +후춧가루 +훈련 +훨씬 +휴식 +휴일 +흉내 +흐름 +흑백 +흑인 +흔적 +흔히 +흥미 +흥분 +희곡 +희망 +희생 +흰색 +힘껏 +` diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/spanish.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/spanish.go new file mode 100644 index 0000000000..ad76da976c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/wordlists/spanish.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/spanish.txt + // $ crc32 spanish.txt + // 266e4f3d + checksum := crc32.ChecksumIEEE([]byte(spanish)) + if fmt.Sprintf("%x", checksum) != "266e4f3d" { + panic("spanish checksum invalid") + } +} + +// Spanish is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/spanish.txt +var Spanish = strings.Split(strings.TrimSpace(spanish), "\n") +var spanish = `ábaco +abdomen +abeja +abierto +abogado +abono +aborto +abrazo +abrir +abuelo +abuso +acabar +academia +acceso +acción +aceite +acelga +acento +aceptar +ácido +aclarar +acné +acoger +acoso +activo +acto +actriz +actuar +acudir +acuerdo +acusar +adicto +admitir +adoptar +adorno +aduana +adulto +aéreo +afectar +afición +afinar +afirmar +ágil +agitar +agonía +agosto +agotar +agregar +agrio +agua +agudo +águila +aguja +ahogo +ahorro +aire +aislar +ajedrez +ajeno +ajuste +alacrán +alambre +alarma +alba +álbum +alcalde +aldea +alegre +alejar +alerta +aleta +alfiler +alga +algodón +aliado +aliento +alivio +alma +almeja +almíbar +altar +alteza +altivo +alto +altura +alumno +alzar +amable +amante +amapola +amargo +amasar +ámbar +ámbito +ameno +amigo +amistad +amor +amparo +amplio +ancho +anciano +ancla +andar +andén +anemia +ángulo +anillo +ánimo +anís +anotar +antena +antiguo +antojo +anual +anular +anuncio +añadir +añejo +año +apagar +aparato +apetito +apio +aplicar +apodo +aporte +apoyo +aprender +aprobar +apuesta +apuro +arado +araña +arar +árbitro +árbol +arbusto +archivo +arco +arder +ardilla +arduo +área +árido +aries +armonía +arnés +aroma +arpa +arpón +arreglo +arroz +arruga +arte +artista +asa +asado +asalto +ascenso +asegurar +aseo +asesor +asiento +asilo +asistir +asno +asombro +áspero +astilla +astro +astuto +asumir +asunto +atajo +ataque +atar +atento +ateo +ático +atleta +átomo +atraer +atroz +atún +audaz +audio +auge +aula +aumento +ausente +autor +aval +avance +avaro +ave +avellana +avena +avestruz +avión +aviso +ayer +ayuda +ayuno +azafrán +azar +azote +azúcar +azufre +azul +baba +babor +bache +bahía +baile +bajar +balanza +balcón +balde +bambú +banco +banda +baño +barba +barco +barniz +barro +báscula +bastón +basura +batalla +batería +batir +batuta +baúl +bazar +bebé +bebida +bello +besar +beso +bestia +bicho +bien +bingo +blanco +bloque +blusa +boa +bobina +bobo +boca +bocina +boda +bodega +boina +bola +bolero +bolsa +bomba +bondad +bonito +bono +bonsái +borde +borrar +bosque +bote +botín +bóveda +bozal +bravo +brazo +brecha +breve +brillo +brinco +brisa +broca +broma +bronce +brote +bruja +brusco +bruto +buceo +bucle +bueno +buey +bufanda +bufón +búho +buitre +bulto +burbuja +burla +burro +buscar +butaca +buzón +caballo +cabeza +cabina +cabra +cacao +cadáver +cadena +caer +café +caída +caimán +caja +cajón +cal +calamar +calcio +caldo +calidad +calle +calma +calor +calvo +cama +cambio +camello +camino +campo +cáncer +candil +canela +canguro +canica +canto +caña +cañón +caoba +caos +capaz +capitán +capote +captar +capucha +cara +carbón +cárcel +careta +carga +cariño +carne +carpeta +carro +carta +casa +casco +casero +caspa +castor +catorce +catre +caudal +causa +cazo +cebolla +ceder +cedro +celda +célebre +celoso +célula +cemento +ceniza +centro +cerca +cerdo +cereza +cero +cerrar +certeza +césped +cetro +chacal +chaleco +champú +chancla +chapa +charla +chico +chiste +chivo +choque +choza +chuleta +chupar +ciclón +ciego +cielo +cien +cierto +cifra +cigarro +cima +cinco +cine +cinta +ciprés +circo +ciruela +cisne +cita +ciudad +clamor +clan +claro +clase +clave +cliente +clima +clínica +cobre +cocción +cochino +cocina +coco +código +codo +cofre +coger +cohete +cojín +cojo +cola +colcha +colegio +colgar +colina +collar +colmo +columna +combate +comer +comida +cómodo +compra +conde +conejo +conga +conocer +consejo +contar +copa +copia +corazón +corbata +corcho +cordón +corona +correr +coser +cosmos +costa +cráneo +cráter +crear +crecer +creído +crema +cría +crimen +cripta +crisis +cromo +crónica +croqueta +crudo +cruz +cuadro +cuarto +cuatro +cubo +cubrir +cuchara +cuello +cuento +cuerda +cuesta +cueva +cuidar +culebra +culpa +culto +cumbre +cumplir +cuna +cuneta +cuota +cupón +cúpula +curar +curioso +curso +curva +cutis +dama +danza +dar +dardo +dátil +deber +débil +década +decir +dedo +defensa +definir +dejar +delfín +delgado +delito +demora +denso +dental +deporte +derecho +derrota +desayuno +deseo +desfile +desnudo +destino +desvío +detalle +detener +deuda +día +diablo +diadema +diamante +diana +diario +dibujo +dictar +diente +dieta +diez +difícil +digno +dilema +diluir +dinero +directo +dirigir +disco +diseño +disfraz +diva +divino +doble +doce +dolor +domingo +don +donar +dorado +dormir +dorso +dos +dosis +dragón +droga +ducha +duda +duelo +dueño +dulce +dúo +duque +durar +dureza +duro +ébano +ebrio +echar +eco +ecuador +edad +edición +edificio +editor +educar +efecto +eficaz +eje +ejemplo +elefante +elegir +elemento +elevar +elipse +élite +elixir +elogio +eludir +embudo +emitir +emoción +empate +empeño +empleo +empresa +enano +encargo +enchufe +encía +enemigo +enero +enfado +enfermo +engaño +enigma +enlace +enorme +enredo +ensayo +enseñar +entero +entrar +envase +envío +época +equipo +erizo +escala +escena +escolar +escribir +escudo +esencia +esfera +esfuerzo +espada +espejo +espía +esposa +espuma +esquí +estar +este +estilo +estufa +etapa +eterno +ética +etnia +evadir +evaluar +evento +evitar +exacto +examen +exceso +excusa +exento +exigir +exilio +existir +éxito +experto +explicar +exponer +extremo +fábrica +fábula +fachada +fácil +factor +faena +faja +falda +fallo +falso +faltar +fama +familia +famoso +faraón +farmacia +farol +farsa +fase +fatiga +fauna +favor +fax +febrero +fecha +feliz +feo +feria +feroz +fértil +fervor +festín +fiable +fianza +fiar +fibra +ficción +ficha +fideo +fiebre +fiel +fiera +fiesta +figura +fijar +fijo +fila +filete +filial +filtro +fin +finca +fingir +finito +firma +flaco +flauta +flecha +flor +flota +fluir +flujo +flúor +fobia +foca +fogata +fogón +folio +folleto +fondo +forma +forro +fortuna +forzar +fosa +foto +fracaso +frágil +franja +frase +fraude +freír +freno +fresa +frío +frito +fruta +fuego +fuente +fuerza +fuga +fumar +función +funda +furgón +furia +fusil +fútbol +futuro +gacela +gafas +gaita +gajo +gala +galería +gallo +gamba +ganar +gancho +ganga +ganso +garaje +garza +gasolina +gastar +gato +gavilán +gemelo +gemir +gen +género +genio +gente +geranio +gerente +germen +gesto +gigante +gimnasio +girar +giro +glaciar +globo +gloria +gol +golfo +goloso +golpe +goma +gordo +gorila +gorra +gota +goteo +gozar +grada +gráfico +grano +grasa +gratis +grave +grieta +grillo +gripe +gris +grito +grosor +grúa +grueso +grumo +grupo +guante +guapo +guardia +guerra +guía +guiño +guion +guiso +guitarra +gusano +gustar +haber +hábil +hablar +hacer +hacha +hada +hallar +hamaca +harina +haz +hazaña +hebilla +hebra +hecho +helado +helio +hembra +herir +hermano +héroe +hervir +hielo +hierro +hígado +higiene +hijo +himno +historia +hocico +hogar +hoguera +hoja +hombre +hongo +honor +honra +hora +hormiga +horno +hostil +hoyo +hueco +huelga +huerta +hueso +huevo +huida +huir +humano +húmedo +humilde +humo +hundir +huracán +hurto +icono +ideal +idioma +ídolo +iglesia +iglú +igual +ilegal +ilusión +imagen +imán +imitar +impar +imperio +imponer +impulso +incapaz +índice +inerte +infiel +informe +ingenio +inicio +inmenso +inmune +innato +insecto +instante +interés +íntimo +intuir +inútil +invierno +ira +iris +ironía +isla +islote +jabalí +jabón +jamón +jarabe +jardín +jarra +jaula +jazmín +jefe +jeringa +jinete +jornada +joroba +joven +joya +juerga +jueves +juez +jugador +jugo +juguete +juicio +junco +jungla +junio +juntar +júpiter +jurar +justo +juvenil +juzgar +kilo +koala +labio +lacio +lacra +lado +ladrón +lagarto +lágrima +laguna +laico +lamer +lámina +lámpara +lana +lancha +langosta +lanza +lápiz +largo +larva +lástima +lata +látex +latir +laurel +lavar +lazo +leal +lección +leche +lector +leer +legión +legumbre +lejano +lengua +lento +leña +león +leopardo +lesión +letal +letra +leve +leyenda +libertad +libro +licor +líder +lidiar +lienzo +liga +ligero +lima +límite +limón +limpio +lince +lindo +línea +lingote +lino +linterna +líquido +liso +lista +litera +litio +litro +llaga +llama +llanto +llave +llegar +llenar +llevar +llorar +llover +lluvia +lobo +loción +loco +locura +lógica +logro +lombriz +lomo +lonja +lote +lucha +lucir +lugar +lujo +luna +lunes +lupa +lustro +luto +luz +maceta +macho +madera +madre +maduro +maestro +mafia +magia +mago +maíz +maldad +maleta +malla +malo +mamá +mambo +mamut +manco +mando +manejar +manga +maniquí +manjar +mano +manso +manta +mañana +mapa +máquina +mar +marco +marea +marfil +margen +marido +mármol +marrón +martes +marzo +masa +máscara +masivo +matar +materia +matiz +matriz +máximo +mayor +mazorca +mecha +medalla +medio +médula +mejilla +mejor +melena +melón +memoria +menor +mensaje +mente +menú +mercado +merengue +mérito +mes +mesón +meta +meter +método +metro +mezcla +miedo +miel +miembro +miga +mil +milagro +militar +millón +mimo +mina +minero +mínimo +minuto +miope +mirar +misa +miseria +misil +mismo +mitad +mito +mochila +moción +moda +modelo +moho +mojar +molde +moler +molino +momento +momia +monarca +moneda +monja +monto +moño +morada +morder +moreno +morir +morro +morsa +mortal +mosca +mostrar +motivo +mover +móvil +mozo +mucho +mudar +mueble +muela +muerte +muestra +mugre +mujer +mula +muleta +multa +mundo +muñeca +mural +muro +músculo +museo +musgo +música +muslo +nácar +nación +nadar +naipe +naranja +nariz +narrar +nasal +natal +nativo +natural +náusea +naval +nave +navidad +necio +néctar +negar +negocio +negro +neón +nervio +neto +neutro +nevar +nevera +nicho +nido +niebla +nieto +niñez +niño +nítido +nivel +nobleza +noche +nómina +noria +norma +norte +nota +noticia +novato +novela +novio +nube +nuca +núcleo +nudillo +nudo +nuera +nueve +nuez +nulo +número +nutria +oasis +obeso +obispo +objeto +obra +obrero +observar +obtener +obvio +oca +ocaso +océano +ochenta +ocho +ocio +ocre +octavo +octubre +oculto +ocupar +ocurrir +odiar +odio +odisea +oeste +ofensa +oferta +oficio +ofrecer +ogro +oído +oír +ojo +ola +oleada +olfato +olivo +olla +olmo +olor +olvido +ombligo +onda +onza +opaco +opción +ópera +opinar +oponer +optar +óptica +opuesto +oración +orador +oral +órbita +orca +orden +oreja +órgano +orgía +orgullo +oriente +origen +orilla +oro +orquesta +oruga +osadía +oscuro +osezno +oso +ostra +otoño +otro +oveja +óvulo +óxido +oxígeno +oyente +ozono +pacto +padre +paella +página +pago +país +pájaro +palabra +palco +paleta +pálido +palma +paloma +palpar +pan +panal +pánico +pantera +pañuelo +papá +papel +papilla +paquete +parar +parcela +pared +parir +paro +párpado +parque +párrafo +parte +pasar +paseo +pasión +paso +pasta +pata +patio +patria +pausa +pauta +pavo +payaso +peatón +pecado +pecera +pecho +pedal +pedir +pegar +peine +pelar +peldaño +pelea +peligro +pellejo +pelo +peluca +pena +pensar +peñón +peón +peor +pepino +pequeño +pera +percha +perder +pereza +perfil +perico +perla +permiso +perro +persona +pesa +pesca +pésimo +pestaña +pétalo +petróleo +pez +pezuña +picar +pichón +pie +piedra +pierna +pieza +pijama +pilar +piloto +pimienta +pino +pintor +pinza +piña +piojo +pipa +pirata +pisar +piscina +piso +pista +pitón +pizca +placa +plan +plata +playa +plaza +pleito +pleno +plomo +pluma +plural +pobre +poco +poder +podio +poema +poesía +poeta +polen +policía +pollo +polvo +pomada +pomelo +pomo +pompa +poner +porción +portal +posada +poseer +posible +poste +potencia +potro +pozo +prado +precoz +pregunta +premio +prensa +preso +previo +primo +príncipe +prisión +privar +proa +probar +proceso +producto +proeza +profesor +programa +prole +promesa +pronto +propio +próximo +prueba +público +puchero +pudor +pueblo +puerta +puesto +pulga +pulir +pulmón +pulpo +pulso +puma +punto +puñal +puño +pupa +pupila +puré +quedar +queja +quemar +querer +queso +quieto +química +quince +quitar +rábano +rabia +rabo +ración +radical +raíz +rama +rampa +rancho +rango +rapaz +rápido +rapto +rasgo +raspa +rato +rayo +raza +razón +reacción +realidad +rebaño +rebote +recaer +receta +rechazo +recoger +recreo +recto +recurso +red +redondo +reducir +reflejo +reforma +refrán +refugio +regalo +regir +regla +regreso +rehén +reino +reír +reja +relato +relevo +relieve +relleno +reloj +remar +remedio +remo +rencor +rendir +renta +reparto +repetir +reposo +reptil +res +rescate +resina +respeto +resto +resumen +retiro +retorno +retrato +reunir +revés +revista +rey +rezar +rico +riego +rienda +riesgo +rifa +rígido +rigor +rincón +riñón +río +riqueza +risa +ritmo +rito +rizo +roble +roce +rociar +rodar +rodeo +rodilla +roer +rojizo +rojo +romero +romper +ron +ronco +ronda +ropa +ropero +rosa +rosca +rostro +rotar +rubí +rubor +rudo +rueda +rugir +ruido +ruina +ruleta +rulo +rumbo +rumor +ruptura +ruta +rutina +sábado +saber +sabio +sable +sacar +sagaz +sagrado +sala +saldo +salero +salir +salmón +salón +salsa +salto +salud +salvar +samba +sanción +sandía +sanear +sangre +sanidad +sano +santo +sapo +saque +sardina +sartén +sastre +satán +sauna +saxofón +sección +seco +secreto +secta +sed +seguir +seis +sello +selva +semana +semilla +senda +sensor +señal +señor +separar +sepia +sequía +ser +serie +sermón +servir +sesenta +sesión +seta +setenta +severo +sexo +sexto +sidra +siesta +siete +siglo +signo +sílaba +silbar +silencio +silla +símbolo +simio +sirena +sistema +sitio +situar +sobre +socio +sodio +sol +solapa +soldado +soledad +sólido +soltar +solución +sombra +sondeo +sonido +sonoro +sonrisa +sopa +soplar +soporte +sordo +sorpresa +sorteo +sostén +sótano +suave +subir +suceso +sudor +suegra +suelo +sueño +suerte +sufrir +sujeto +sultán +sumar +superar +suplir +suponer +supremo +sur +surco +sureño +surgir +susto +sutil +tabaco +tabique +tabla +tabú +taco +tacto +tajo +talar +talco +talento +talla +talón +tamaño +tambor +tango +tanque +tapa +tapete +tapia +tapón +taquilla +tarde +tarea +tarifa +tarjeta +tarot +tarro +tarta +tatuaje +tauro +taza +tazón +teatro +techo +tecla +técnica +tejado +tejer +tejido +tela +teléfono +tema +temor +templo +tenaz +tender +tener +tenis +tenso +teoría +terapia +terco +término +ternura +terror +tesis +tesoro +testigo +tetera +texto +tez +tibio +tiburón +tiempo +tienda +tierra +tieso +tigre +tijera +tilde +timbre +tímido +timo +tinta +tío +típico +tipo +tira +tirón +titán +títere +título +tiza +toalla +tobillo +tocar +tocino +todo +toga +toldo +tomar +tono +tonto +topar +tope +toque +tórax +torero +tormenta +torneo +toro +torpedo +torre +torso +tortuga +tos +tosco +toser +tóxico +trabajo +tractor +traer +tráfico +trago +traje +tramo +trance +trato +trauma +trazar +trébol +tregua +treinta +tren +trepar +tres +tribu +trigo +tripa +triste +triunfo +trofeo +trompa +tronco +tropa +trote +trozo +truco +trueno +trufa +tubería +tubo +tuerto +tumba +tumor +túnel +túnica +turbina +turismo +turno +tutor +ubicar +úlcera +umbral +unidad +unir +universo +uno +untar +uña +urbano +urbe +urgente +urna +usar +usuario +útil +utopía +uva +vaca +vacío +vacuna +vagar +vago +vaina +vajilla +vale +válido +valle +valor +válvula +vampiro +vara +variar +varón +vaso +vecino +vector +vehículo +veinte +vejez +vela +velero +veloz +vena +vencer +venda +veneno +vengar +venir +venta +venus +ver +verano +verbo +verde +vereda +verja +verso +verter +vía +viaje +vibrar +vicio +víctima +vida +vídeo +vidrio +viejo +viernes +vigor +vil +villa +vinagre +vino +viñedo +violín +viral +virgo +virtud +visor +víspera +vista +vitamina +viudo +vivaz +vivero +vivir +vivo +volcán +volumen +volver +voraz +votar +voto +voz +vuelo +vulgar +yacer +yate +yegua +yema +yerno +yeso +yodo +yoga +yogur +zafiro +zanja +zapato +zarza +zona +zorro +zumo +zurdo +` diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip44/bip44.go b/vendor/github.com/skycoin/skycoin/src/cipher/bip44/bip44.go new file mode 100644 index 0000000000..801a455cfe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip44/bip44.go @@ -0,0 +1,103 @@ +/* +Package bip44 implements the bip44 spec https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki +*/ +package bip44 + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher/bip32" +) + +// Bip44's bip32 path: m / purpose' / coin_type' / account' / change / address_index + +var ( + // ErrInvalidCoinType coin_type is >= 0x80000000 + ErrInvalidCoinType = errors.New("invalid bip44 coin type") + + // ErrInvalidAccount account is >= 0x80000000 + ErrInvalidAccount = errors.New("bip44 account index must be < 0x80000000") +) + +// CoinType is the coin_type part of the bip44 path +type CoinType uint32 + +const ( + // CoinTypeBitcoin is the coin_type for Bitcoin + CoinTypeBitcoin CoinType = 0 + // CoinTypeBitcoinTestnet is the coin_type for Skycoin + CoinTypeBitcoinTestnet CoinType = 1 + // CoinTypeSkycoin is the coin_type for Skycoin + CoinTypeSkycoin CoinType = 8000 + + // ExternalChainIndex is the index of the external chain + ExternalChainIndex uint32 = 0 + // ChangeChainIndex is the index of the change chain + ChangeChainIndex uint32 = 1 +) + +// Coin is a bip32 node at the `coin_type` level of a bip44 path +type Coin struct { + *bip32.PrivateKey +} + +// NewCoin creates a bip32 node at the `coin_type` level of a bip44 path +func NewCoin(seed []byte, coinType CoinType) (*Coin, error) { + if uint32(coinType) >= bip32.FirstHardenedChild { + return nil, ErrInvalidCoinType + } + + path := fmt.Sprintf("m/44'/%d'", coinType) + pk, err := bip32.NewPrivateKeyFromPath(seed, path) + if err != nil { + return nil, err + } + + return &Coin{ + pk, + }, nil +} + +// Account creates a bip32 node at the `account'` level of the bip44 path. +// The account number should be as it would appear in the path string, without +// the apostrophe that indicates hardening +func (c *Coin) Account(account uint32) (*Account, error) { + if account >= bip32.FirstHardenedChild { + return nil, ErrInvalidAccount + } + + pk, err := c.NewPrivateChildKey(account + bip32.FirstHardenedChild) + if err != nil { + return nil, err + } + + return &Account{ + pk, + }, nil +} + +// Account is a bip32 node at the `account` level of a bip44 path +type Account struct { + *bip32.PrivateKey +} + +// External returns the external chain node, to be used for receiving coins +func (a *Account) External() (*bip32.PrivateKey, error) { + return a.NewPrivateChildKey(ExternalChainIndex) +} + +// Change returns the change chain node, to be used for change addresses +func (a *Account) Change() (*bip32.PrivateKey, error) { + return a.NewPrivateChildKey(ChangeChainIndex) +} + +// Clone clones the account +func (a *Account) Clone() Account { + na := Account{} + if a.PrivateKey != nil { + key := a.PrivateKey.Clone() + na.PrivateKey = &key + } + return na +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go new file mode 100644 index 0000000000..b3a33ae659 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go @@ -0,0 +1,83 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package chacha20poly1305 implements the ChaCha20-Poly1305 AEAD as specified in RFC 7539. +package chacha20poly1305 // import "github.com/skycoin/skycoin/src/cipher/chacha20poly1305" + +import ( + "crypto/cipher" + "errors" +) + +const ( + // KeySize is the size of the key used by this AEAD, in bytes. + KeySize = 32 + // NonceSize is the size of the nonce used with this AEAD, in bytes. + NonceSize = 12 +) + +type chacha20poly1305 struct { + key [32]byte +} + +// New returns a ChaCha20-Poly1305 AEAD that uses the given, 256-bit key. +func New(key []byte) (cipher.AEAD, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20poly1305: bad key length") + } + ret := new(chacha20poly1305) + copy(ret.key[:], key) + return ret, nil +} + +func (c *chacha20poly1305) NonceSize() int { + return NonceSize +} + +func (c *chacha20poly1305) Overhead() int { + return 16 +} + +func (c *chacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte { + if len(nonce) != NonceSize { + panic("chacha20poly1305: bad nonce length passed to Seal") + } + + if uint64(len(plaintext)) > (1<<38)-64 { + panic("chacha20poly1305: plaintext too large") + } + + return c.seal(dst, nonce, plaintext, additionalData) +} + +var errOpen = errors.New("chacha20poly1305: message authentication failed") + +func (c *chacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + if len(nonce) != NonceSize { + panic("chacha20poly1305: bad nonce length passed to Open") + } + if len(ciphertext) < 16 { + return nil, errOpen + } + if uint64(len(ciphertext)) > (1<<38)-48 { + panic("chacha20poly1305: ciphertext too large") + } + + return c.open(dst, nonce, ciphertext, additionalData) +} + +// sliceForAppend takes a slice and a requested number of bytes. It returns a +// slice with the contents of the given slice followed by that many bytes and a +// second slice that aliases into it and contains only the extra bytes. If the +// original slice has sufficient capacity then no allocation is performed. +func sliceForAppend(in []byte, n int) (head, tail []byte) { + if total := len(in) + n; cap(in) >= total { + head = in[:total] + } else { + head = make([]byte, total) + copy(head, in) + } + tail = head[len(in):] + return +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go new file mode 100644 index 0000000000..17950cdc18 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go @@ -0,0 +1,128 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.7 && amd64 && !gccgo && !appengine +// +build go1.7,amd64,!gccgo,!appengine + +package chacha20poly1305 + +import "encoding/binary" + +//go:noescape +func chacha20Poly1305Open(dst []byte, key []uint32, src, ad []byte) bool + +//go:noescape +func chacha20Poly1305Seal(dst []byte, key []uint32, src, ad []byte) + +// cpuid is implemented in chacha20poly1305_amd64.s. +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) + +// xgetbv with ecx = 0 is implemented in chacha20poly1305_amd64.s. +func xgetbv() (eax, edx uint32) + +var ( + useASM bool + useAVX2 bool +) + +func init() { + detectCPUFeatures() +} + +// detectCPUFeatures is used to detect if cpu instructions +// used by the functions implemented in assembler in +// chacha20poly1305_amd64.s are supported. +func detectCPUFeatures() { + maxID, _, _, _ := cpuid(0, 0) + if maxID < 1 { + return + } + + _, _, ecx1, _ := cpuid(1, 0) + + haveSSSE3 := isSet(9, ecx1) + useASM = haveSSSE3 + + haveOSXSAVE := isSet(27, ecx1) + + osSupportsAVX := false + // For XGETBV, OSXSAVE bit is required and sufficient. + if haveOSXSAVE { + eax, _ := xgetbv() + // Check if XMM and YMM registers have OS support. + osSupportsAVX = isSet(1, eax) && isSet(2, eax) + } + haveAVX := isSet(28, ecx1) && osSupportsAVX + + if maxID < 7 { + return + } + + _, ebx7, _, _ := cpuid(7, 0) + haveAVX2 := isSet(5, ebx7) && haveAVX + haveBMI2 := isSet(8, ebx7) + + useAVX2 = haveAVX2 && haveBMI2 +} + +// isSet checks if bit at bitpos is set in value. +func isSet(bitpos uint, value uint32) bool { + return value&(1<+0x00(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+0x04(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+0x08(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+0x0c(SB)/4, $0x6b206574 +DATA ·chacha20Constants<>+0x10(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+0x14(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+0x18(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+0x1c(SB)/4, $0x6b206574 +// <<< 16 with PSHUFB +DATA ·rol16<>+0x00(SB)/8, $0x0504070601000302 +DATA ·rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A +DATA ·rol16<>+0x10(SB)/8, $0x0504070601000302 +DATA ·rol16<>+0x18(SB)/8, $0x0D0C0F0E09080B0A +// <<< 8 with PSHUFB +DATA ·rol8<>+0x00(SB)/8, $0x0605040702010003 +DATA ·rol8<>+0x08(SB)/8, $0x0E0D0C0F0A09080B +DATA ·rol8<>+0x10(SB)/8, $0x0605040702010003 +DATA ·rol8<>+0x18(SB)/8, $0x0E0D0C0F0A09080B + +DATA ·avx2InitMask<>+0x00(SB)/8, $0x0 +DATA ·avx2InitMask<>+0x08(SB)/8, $0x0 +DATA ·avx2InitMask<>+0x10(SB)/8, $0x1 +DATA ·avx2InitMask<>+0x18(SB)/8, $0x0 + +DATA ·avx2IncMask<>+0x00(SB)/8, $0x2 +DATA ·avx2IncMask<>+0x08(SB)/8, $0x0 +DATA ·avx2IncMask<>+0x10(SB)/8, $0x2 +DATA ·avx2IncMask<>+0x18(SB)/8, $0x0 +// Poly1305 key clamp +DATA ·polyClampMask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·polyClampMask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +DATA ·polyClampMask<>+0x10(SB)/8, $0xFFFFFFFFFFFFFFFF +DATA ·polyClampMask<>+0x18(SB)/8, $0xFFFFFFFFFFFFFFFF + +DATA ·sseIncMask<>+0x00(SB)/8, $0x1 +DATA ·sseIncMask<>+0x08(SB)/8, $0x0 +// To load/store the last < 16 bytes in a buffer +DATA ·andMask<>+0x00(SB)/8, $0x00000000000000ff +DATA ·andMask<>+0x08(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x10(SB)/8, $0x000000000000ffff +DATA ·andMask<>+0x18(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x20(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+0x28(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x30(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+0x38(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x40(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+0x48(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x50(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+0x58(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x60(SB)/8, $0x00ffffffffffffff +DATA ·andMask<>+0x68(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x70(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x78(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x80(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x88(SB)/8, $0x00000000000000ff +DATA ·andMask<>+0x90(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x98(SB)/8, $0x000000000000ffff +DATA ·andMask<>+0xa0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xa8(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+0xb0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xb8(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+0xc0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xc8(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+0xd0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xd8(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+0xe0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xe8(SB)/8, $0x00ffffffffffffff + +GLOBL ·chacha20Constants<>(SB), (NOPTR+RODATA), $32 +GLOBL ·rol16<>(SB), (NOPTR+RODATA), $32 +GLOBL ·rol8<>(SB), (NOPTR+RODATA), $32 +GLOBL ·sseIncMask<>(SB), (NOPTR+RODATA), $16 +GLOBL ·avx2IncMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·avx2InitMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·polyClampMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·andMask<>(SB), (NOPTR+RODATA), $240 +// No PALIGNR in Go ASM yet (but VPALIGNR is present). +#define shiftB0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X3, X3 +#define shiftB1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x04 // PALIGNR $4, X4, X4 +#define shiftB2Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X5, X5 +#define shiftB3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X13, X13 +#define shiftC0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X6, X6 +#define shiftC1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x08 // PALIGNR $8, X7, X7 +#define shiftC2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc0; BYTE $0x08 // PALIGNR $8, X8, X8 +#define shiftC3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X14, X14 +#define shiftD0Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x0c // PALIGNR $12, X9, X9 +#define shiftD1Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x0c // PALIGNR $12, X10, X10 +#define shiftD2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X11, X11 +#define shiftD3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x0c // PALIGNR $12, X15, X15 +#define shiftB0Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X3, X3 +#define shiftB1Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x0c // PALIGNR $12, X4, X4 +#define shiftB2Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X5, X5 +#define shiftB3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X13, X13 +#define shiftC0Right shiftC0Left +#define shiftC1Right shiftC1Left +#define shiftC2Right shiftC2Left +#define shiftC3Right shiftC3Left +#define shiftD0Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x04 // PALIGNR $4, X9, X9 +#define shiftD1Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x04 // PALIGNR $4, X10, X10 +#define shiftD2Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X11, X11 +#define shiftD3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x04 // PALIGNR $4, X15, X15 +// Some macros +#define chachaQR(A, B, C, D, T) \ + PADDD B, A; PXOR A, D; PSHUFB ·rol16<>(SB), D \ + PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $12, T; PSRLL $20, B; PXOR T, B \ + PADDD B, A; PXOR A, D; PSHUFB ·rol8<>(SB), D \ + PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $7, T; PSRLL $25, B; PXOR T, B + +#define chachaQR_AVX2(A, B, C, D, T) \ + VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol16<>(SB), D, D \ + VPADDD D, C, C; VPXOR C, B, B; VPSLLD $12, B, T; VPSRLD $20, B, B; VPXOR T, B, B \ + VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol8<>(SB), D, D \ + VPADDD D, C, C; VPXOR C, B, B; VPSLLD $7, B, T; VPSRLD $25, B, B; VPXOR T, B, B + +#define polyAdd(S) ADDQ S, acc0; ADCQ 8+S, acc1; ADCQ $1, acc2 +#define polyMulStage1 MOVQ (0*8)(BP), AX; MOVQ AX, t2; MULQ acc0; MOVQ AX, t0; MOVQ DX, t1; MOVQ (0*8)(BP), AX; MULQ acc1; IMULQ acc2, t2; ADDQ AX, t1; ADCQ DX, t2 +#define polyMulStage2 MOVQ (1*8)(BP), AX; MOVQ AX, t3; MULQ acc0; ADDQ AX, t1; ADCQ $0, DX; MOVQ DX, acc0; MOVQ (1*8)(BP), AX; MULQ acc1; ADDQ AX, t2; ADCQ $0, DX +#define polyMulStage3 IMULQ acc2, t3; ADDQ acc0, t2; ADCQ DX, t3 +#define polyMulReduceStage MOVQ t0, acc0; MOVQ t1, acc1; MOVQ t2, acc2; ANDQ $3, acc2; MOVQ t2, t0; ANDQ $-4, t0; MOVQ t3, t1; SHRQ $2, t2:t3; SHRQ $2, t3; ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $0, acc2; ADDQ t2, acc0; ADCQ t3, acc1; ADCQ $0, acc2 + +#define polyMulStage1_AVX2 MOVQ (0*8)(BP), DX; MOVQ DX, t2; MULXQ acc0, t0, t1; IMULQ acc2, t2; MULXQ acc1, AX, DX; ADDQ AX, t1; ADCQ DX, t2 +#define polyMulStage2_AVX2 MOVQ (1*8)(BP), DX; MULXQ acc0, acc0, AX; ADDQ acc0, t1; MULXQ acc1, acc1, t3; ADCQ acc1, t2; ADCQ $0, t3 +#define polyMulStage3_AVX2 IMULQ acc2, DX; ADDQ AX, t2; ADCQ DX, t3 + +#define polyMul polyMulStage1; polyMulStage2; polyMulStage3; polyMulReduceStage +#define polyMulAVX2 polyMulStage1_AVX2; polyMulStage2_AVX2; polyMulStage3_AVX2; polyMulReduceStage +// ---------------------------------------------------------------------------- +TEXT polyHashADInternal<>(SB), NOSPLIT, $0 + // adp points to beginning of additional data + // itr2 holds ad length + XORQ acc0, acc0 + XORQ acc1, acc1 + XORQ acc2, acc2 + CMPQ itr2, $13 + JNE hashADLoop + +openFastTLSAD: + // Special treatment for the TLS case of 13 bytes + MOVQ (adp), acc0 + MOVQ 5(adp), acc1 + SHRQ $24, acc1 + MOVQ $1, acc2 + polyMul + RET + +hashADLoop: + // Hash in 16 byte chunks + CMPQ itr2, $16 + JB hashADTail + polyAdd(0(adp)) + LEAQ (1*16)(adp), adp + SUBQ $16, itr2 + polyMul + JMP hashADLoop + +hashADTail: + CMPQ itr2, $0 + JE hashADDone + + // Hash last < 16 byte tail + XORQ t0, t0 + XORQ t1, t1 + XORQ t2, t2 + ADDQ itr2, adp + +hashADTailLoop: + SHLQ $8, t1:t0 + SHLQ $8, t0 + MOVB -1(adp), t2 + XORQ t2, t0 + DECQ adp + DECQ itr2 + JNE hashADTailLoop + +hashADTailFinish: + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + // Finished AD +hashADDone: + RET + +// ---------------------------------------------------------------------------- +// func chacha20Poly1305Open(dst, key, src, ad []byte) bool +TEXT ·chacha20Poly1305Open(SB), 0, $288-97 + // For aligned stack access + MOVQ SP, BP + ADDQ $32, BP + ANDQ $-32, BP + MOVQ dst+0(FP), oup + MOVQ key+24(FP), keyp + MOVQ src+48(FP), inp + MOVQ src_len+56(FP), inl + MOVQ ad+72(FP), adp + + // Check for AVX2 support + CMPB ·useAVX2(SB), $1 + JE chacha20Poly1305Open_AVX2 + + // Special optimization, for very short buffers + CMPQ inl, $128 + JBE openSSE128 // About 16% faster + + // For long buffers, prepare the poly key first + MOVOU ·chacha20Constants<>(SB), A0 + MOVOU (1*16)(keyp), B0 + MOVOU (2*16)(keyp), C0 + MOVOU (3*16)(keyp), D0 + MOVO D0, T1 + + // Store state on stack for future use + MOVO B0, state1Store + MOVO C0, state2Store + MOVO D0, ctr3Store + MOVQ $10, itr2 + +openSSEPreparePolyKey: + chachaQR(A0, B0, C0, D0, T0) + shiftB0Left; shiftC0Left; shiftD0Left + chachaQR(A0, B0, C0, D0, T0) + shiftB0Right; shiftC0Right; shiftD0Right + DECQ itr2 + JNE openSSEPreparePolyKey + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVO A0, rStore; MOVO B0, sStore + + // Hash AAD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openSSEMainLoop: + CMPQ inl, $256 + JB openSSEMainLoopDone + + // Load state, increment counter blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + + // There are 10 ChaCha20 iterations of 2QR each, so for 6 iterations we hash 2 blocks, and for the remaining 4 only 1 block - for a total of 16 + MOVQ $4, itr1 + MOVQ inp, itr2 + +openSSEInternalLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyAdd(0(itr2)) + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + LEAQ (2*8)(itr2), itr2 + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + polyMulStage3 + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr1 + JGE openSSEInternalLoop + + polyAdd(0(itr2)) + polyMul + LEAQ (2*8)(itr2), itr2 + + CMPQ itr1, $-6 + JG openSSEInternalLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + + // Load - xor - store + MOVO D3, tmpStore + MOVOU (0*16)(inp), D3; PXOR D3, A0; MOVOU A0, (0*16)(oup) + MOVOU (1*16)(inp), D3; PXOR D3, B0; MOVOU B0, (1*16)(oup) + MOVOU (2*16)(inp), D3; PXOR D3, C0; MOVOU C0, (2*16)(oup) + MOVOU (3*16)(inp), D3; PXOR D3, D0; MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), D0; PXOR D0, A1; MOVOU A1, (4*16)(oup) + MOVOU (5*16)(inp), D0; PXOR D0, B1; MOVOU B1, (5*16)(oup) + MOVOU (6*16)(inp), D0; PXOR D0, C1; MOVOU C1, (6*16)(oup) + MOVOU (7*16)(inp), D0; PXOR D0, D1; MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), D0; PXOR D0, A2; MOVOU A2, (8*16)(oup) + MOVOU (9*16)(inp), D0; PXOR D0, B2; MOVOU B2, (9*16)(oup) + MOVOU (10*16)(inp), D0; PXOR D0, C2; MOVOU C2, (10*16)(oup) + MOVOU (11*16)(inp), D0; PXOR D0, D2; MOVOU D2, (11*16)(oup) + MOVOU (12*16)(inp), D0; PXOR D0, A3; MOVOU A3, (12*16)(oup) + MOVOU (13*16)(inp), D0; PXOR D0, B3; MOVOU B3, (13*16)(oup) + MOVOU (14*16)(inp), D0; PXOR D0, C3; MOVOU C3, (14*16)(oup) + MOVOU (15*16)(inp), D0; PXOR tmpStore, D0; MOVOU D0, (15*16)(oup) + LEAQ 256(inp), inp + LEAQ 256(oup), oup + SUBQ $256, inl + JMP openSSEMainLoop + +openSSEMainLoopDone: + // Handle the various tail sizes efficiently + TESTQ inl, inl + JE openSSEFinalize + CMPQ inl, $64 + JBE openSSETail64 + CMPQ inl, $128 + JBE openSSETail128 + CMPQ inl, $192 + JBE openSSETail192 + JMP openSSETail256 + +openSSEFinalize: + // Hash in the PT, AAD lengths + ADDQ ad_len+80(FP), acc0; ADCQ src_len+56(FP), acc1; ADCQ $1, acc2 + polyMul + + // Final reduce + MOVQ acc0, t0 + MOVQ acc1, t1 + MOVQ acc2, t2 + SUBQ $-5, acc0 + SBBQ $-1, acc1 + SBBQ $3, acc2 + CMOVQCS t0, acc0 + CMOVQCS t1, acc1 + CMOVQCS t2, acc2 + + // Add in the "s" part of the key + ADDQ 0+sStore, acc0 + ADCQ 8+sStore, acc1 + + // Finally, constant time compare to the tag at the end of the message + XORQ AX, AX + MOVQ $1, DX + XORQ (0*8)(inp), acc0 + XORQ (1*8)(inp), acc1 + ORQ acc1, acc0 + CMOVQEQ DX, AX + + // Return true iff tags are equal + MOVB AX, ret+96(FP) + RET + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 129 bytes +openSSE128: + // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks + MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 + MOVQ $10, itr2 + +openSSE128InnerCipherLoop: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftB1Left; shiftB2Left + shiftC0Left; shiftC1Left; shiftC2Left + shiftD0Left; shiftD1Left; shiftD2Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftB1Right; shiftB2Right + shiftC0Right; shiftC1Right; shiftC2Right + shiftD0Right; shiftD1Right; shiftD2Right + DECQ itr2 + JNE openSSE128InnerCipherLoop + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 + PADDL T2, C1; PADDL T2, C2 + PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVOU A0, rStore; MOVOU B0, sStore + + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openSSE128Open: + CMPQ inl, $16 + JB openSSETail16 + SUBQ $16, inl + + // Load for hashing + polyAdd(0(inp)) + + // Load for decryption + MOVOU (inp), T0; PXOR T0, A1; MOVOU A1, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + polyMul + + // Shift the stream "left" + MOVO B1, A1 + MOVO C1, B1 + MOVO D1, C1 + MOVO A2, D1 + MOVO B2, A2 + MOVO C2, B2 + MOVO D2, C2 + JMP openSSE128Open + +openSSETail16: + TESTQ inl, inl + JE openSSEFinalize + + // We can safely load the CT from the end, because it is padded with the MAC + MOVQ inl, itr2 + SHLQ $4, itr2 + LEAQ ·andMask<>(SB), t0 + MOVOU (inp), T0 + ADDQ inl, inp + PAND -16(t0)(itr2*1), T0 + MOVO T0, 0+tmpStore + MOVQ T0, t0 + MOVQ 8+tmpStore, t1 + PXOR A1, T0 + + // We can only store one byte at a time, since plaintext can be shorter than 16 bytes +openSSETail16Store: + MOVQ T0, t3 + MOVB t3, (oup) + PSRLDQ $1, T0 + INCQ oup + DECQ inl + JNE openSSETail16Store + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + JMP openSSEFinalize + +// ---------------------------------------------------------------------------- +// Special optimization for the last 64 bytes of ciphertext +openSSETail64: + // Need to decrypt up to 64 bytes - prepare single block + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + XORQ itr2, itr2 + MOVQ inl, itr1 + CMPQ itr1, $16 + JB openSSETail64LoopB + +openSSETail64LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + SUBQ $16, itr1 + +openSSETail64LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0) + shiftB0Left; shiftC0Left; shiftD0Left + chachaQR(A0, B0, C0, D0, T0) + shiftB0Right; shiftC0Right; shiftD0Right + + CMPQ itr1, $16 + JAE openSSETail64LoopA + + CMPQ itr2, $160 + JNE openSSETail64LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0; PADDL state2Store, C0; PADDL ctr0Store, D0 + +openSSETail64DecLoop: + CMPQ inl, $16 + JB openSSETail64DecLoopDone + SUBQ $16, inl + MOVOU (inp), T0 + PXOR T0, A0 + MOVOU A0, (oup) + LEAQ 16(inp), inp + LEAQ 16(oup), oup + MOVO B0, A0 + MOVO C0, B0 + MOVO D0, C0 + JMP openSSETail64DecLoop + +openSSETail64DecLoopDone: + MOVO A0, A1 + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +openSSETail128: + // Need to decrypt up to 128 bytes - prepare two blocks + MOVO ·chacha20Constants<>(SB), A1; MOVO state1Store, B1; MOVO state2Store, C1; MOVO ctr3Store, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr0Store + MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr1Store + XORQ itr2, itr2 + MOVQ inl, itr1 + ANDQ $-16, itr1 + +openSSETail128LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + +openSSETail128LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + + CMPQ itr2, itr1 + JB openSSETail128LoopA + + CMPQ itr2, $160 + JNE openSSETail128LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B0; PADDL state1Store, B1 + PADDL state2Store, C0; PADDL state2Store, C1 + PADDL ctr1Store, D0; PADDL ctr0Store, D1 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) + + SUBQ $64, inl + LEAQ 64(inp), inp + LEAQ 64(oup), oup + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 192 bytes of ciphertext +openSSETail192: + // Need to decrypt up to 192 bytes - prepare three blocks + MOVO ·chacha20Constants<>(SB), A2; MOVO state1Store, B2; MOVO state2Store, C2; MOVO ctr3Store, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr0Store + MOVO A2, A1; MOVO B2, B1; MOVO C2, C1; MOVO D2, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr2Store + + MOVQ inl, itr1 + MOVQ $160, itr2 + CMPQ itr1, $160 + CMOVQGT itr2, itr1 + ANDQ $-16, itr1 + XORQ itr2, itr2 + +openSSLTail192LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + +openSSLTail192LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + shiftB2Left; shiftC2Left; shiftD2Left + + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + shiftB2Right; shiftC2Right; shiftD2Right + + CMPQ itr2, itr1 + JB openSSLTail192LoopA + + CMPQ itr2, $160 + JNE openSSLTail192LoopB + + CMPQ inl, $176 + JB openSSLTail192Store + + polyAdd(160(inp)) + polyMul + + CMPQ inl, $192 + JB openSSLTail192Store + + polyAdd(176(inp)) + polyMul + +openSSLTail192Store: + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 + PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 + PADDL ctr2Store, D0; PADDL ctr1Store, D1; PADDL ctr0Store, D2 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A2; PXOR T1, B2; PXOR T2, C2; PXOR T3, D2 + MOVOU A2, (0*16)(oup); MOVOU B2, (1*16)(oup); MOVOU C2, (2*16)(oup); MOVOU D2, (3*16)(oup) + + MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + + SUBQ $128, inl + LEAQ 128(inp), inp + LEAQ 128(oup), oup + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +openSSETail256: + // Need to decrypt up to 256 bytes - prepare four blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + XORQ itr2, itr2 + +openSSETail256Loop: + // This loop inteleaves 8 ChaCha quarter rounds with 1 poly multiplication + polyAdd(0(inp)(itr2*1)) + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulStage3 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + ADDQ $2*8, itr2 + CMPQ itr2, $160 + JB openSSETail256Loop + MOVQ inl, itr1 + ANDQ $-16, itr1 + +openSSETail256HashLoop: + polyAdd(0(inp)(itr2*1)) + polyMul + ADDQ $2*8, itr2 + CMPQ itr2, itr1 + JB openSSETail256HashLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + MOVO D3, tmpStore + + // Load - xor - store + MOVOU (0*16)(inp), D3; PXOR D3, A0 + MOVOU (1*16)(inp), D3; PXOR D3, B0 + MOVOU (2*16)(inp), D3; PXOR D3, C0 + MOVOU (3*16)(inp), D3; PXOR D3, D0 + MOVOU A0, (0*16)(oup) + MOVOU B0, (1*16)(oup) + MOVOU C0, (2*16)(oup) + MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) + LEAQ 192(inp), inp + LEAQ 192(oup), oup + SUBQ $192, inl + MOVO A3, A0 + MOVO B3, B0 + MOVO C3, C0 + MOVO tmpStore, D0 + + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// ------------------------- AVX2 Code ---------------------------------------- +chacha20Poly1305Open_AVX2: + VZEROUPPER + VMOVDQU ·chacha20Constants<>(SB), AA0 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 + BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 + VPADDD ·avx2InitMask<>(SB), DD0, DD0 + + // Special optimization, for very short buffers + CMPQ inl, $192 + JBE openAVX2192 + CMPQ inl, $320 + JBE openAVX2320 + + // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream + VMOVDQA BB0, state1StoreAVX2 + VMOVDQA CC0, state2StoreAVX2 + VMOVDQA DD0, ctr3StoreAVX2 + MOVQ $10, itr2 + +openAVX2PreparePolyKey: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + DECQ itr2 + JNE openAVX2PreparePolyKey + + VPADDD ·chacha20Constants<>(SB), AA0, AA0 + VPADDD state1StoreAVX2, BB0, BB0 + VPADDD state2StoreAVX2, CC0, CC0 + VPADDD ctr3StoreAVX2, DD0, DD0 + + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for the first 64 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + + // Hash AD + first 64 bytes + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +openAVX2InitialHash64: + polyAdd(0(inp)(itr1*1)) + polyMulAVX2 + ADDQ $16, itr1 + CMPQ itr1, $64 + JNE openAVX2InitialHash64 + + // Decrypt the first 64 bytes + VPXOR (0*32)(inp), AA0, AA0 + VPXOR (1*32)(inp), BB0, BB0 + VMOVDQU AA0, (0*32)(oup) + VMOVDQU BB0, (1*32)(oup) + LEAQ (2*32)(inp), inp + LEAQ (2*32)(oup), oup + SUBQ $64, inl + +openAVX2MainLoop: + CMPQ inl, $512 + JB openAVX2MainLoopDone + + // Load state, increment counter blocks, store the incremented counters + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + XORQ itr1, itr1 + +openAVX2InternalLoop: + // Lets just say this spaghetti loop interleaves 2 quarter rounds with 3 poly multiplications + // Effectively per 512 bytes of stream we hash 480 bytes of ciphertext + polyAdd(0*8(inp)(itr1*1)) + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage1_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulStage2_AVX2 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyMulStage3_AVX2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + polyAdd(2*8(inp)(itr1*1)) + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage1_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage2_AVX2 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage3_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulReduceStage + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(4*8(inp)(itr1*1)) + LEAQ (6*8)(itr1), itr1 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage1_AVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + polyMulStage2_AVX2 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage3_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + CMPQ itr1, $480 + JNE openAVX2InternalLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + + // We only hashed 480 of the 512 bytes available - hash the remaining 32 here + polyAdd(480(inp)) + polyMulAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + // and here + polyAdd(496(inp)) + polyMulAVX2 + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 + VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) + LEAQ (32*16)(inp), inp + LEAQ (32*16)(oup), oup + SUBQ $(32*16), inl + JMP openAVX2MainLoop + +openAVX2MainLoopDone: + // Handle the various tail sizes efficiently + TESTQ inl, inl + JE openSSEFinalize + CMPQ inl, $128 + JBE openAVX2Tail128 + CMPQ inl, $256 + JBE openAVX2Tail256 + CMPQ inl, $384 + JBE openAVX2Tail384 + JMP openAVX2Tail512 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 193 bytes +openAVX2192: + // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks + VMOVDQA AA0, AA1 + VMOVDQA BB0, BB1 + VMOVDQA CC0, CC1 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2 + VMOVDQA BB0, BB2 + VMOVDQA CC0, CC2 + VMOVDQA DD0, DD2 + VMOVDQA DD1, TT3 + MOVQ $10, itr2 + +openAVX2192InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr2 + JNE openAVX2192InnerCipherLoop + VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 + VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 + VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 + VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 192 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + +openAVX2ShortOpen: + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openAVX2ShortOpenLoop: + CMPQ inl, $32 + JB openAVX2ShortTail32 + SUBQ $32, inl + + // Load for hashing + polyAdd(0*8(inp)) + polyMulAVX2 + polyAdd(2*8(inp)) + polyMulAVX2 + + // Load for decryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + LEAQ (1*32)(oup), oup + + // Shift stream left + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + VMOVDQA AA1, DD0 + VMOVDQA BB1, AA1 + VMOVDQA CC1, BB1 + VMOVDQA DD1, CC1 + VMOVDQA AA2, DD1 + VMOVDQA BB2, AA2 + JMP openAVX2ShortOpenLoop + +openAVX2ShortTail32: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB openAVX2ShortDone + + SUBQ $16, inl + + // Load for hashing + polyAdd(0*8(inp)) + polyMulAVX2 + + // Load for decryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +openAVX2ShortDone: + VZEROUPPER + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 321 bytes +openAVX2320: + // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks + VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 + MOVQ $10, itr2 + +openAVX2320InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr2 + JNE openAVX2320InnerCipherLoop + + VMOVDQA ·chacha20Constants<>(SB), TT0 + VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 + VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 + VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 + VMOVDQA ·avx2IncMask<>(SB), TT0 + VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD2, DD2 + + // Clamp and store poly key + VPERM2I128 $0x02, AA0, BB0, TT0 + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 320 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x02, AA2, BB2, CC1 + VPERM2I128 $0x02, CC2, DD2, DD1 + VPERM2I128 $0x13, AA2, BB2, AA2 + VPERM2I128 $0x13, CC2, DD2, BB2 + JMP openAVX2ShortOpen + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +openAVX2Tail128: + // Need to decrypt up to 128 bytes - prepare two blocks + VMOVDQA ·chacha20Constants<>(SB), AA1 + VMOVDQA state1StoreAVX2, BB1 + VMOVDQA state2StoreAVX2, CC1 + VMOVDQA ctr3StoreAVX2, DD1 + VPADDD ·avx2IncMask<>(SB), DD1, DD1 + VMOVDQA DD1, DD0 + + XORQ itr2, itr2 + MOVQ inl, itr1 + ANDQ $-16, itr1 + TESTQ itr1, itr1 + JE openAVX2Tail128LoopB + +openAVX2Tail128LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMulAVX2 + +openAVX2Tail128LoopB: + ADDQ $16, itr2 + chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD1, DD1, DD1 + CMPQ itr2, itr1 + JB openAVX2Tail128LoopA + CMPQ itr2, $160 + JNE openAVX2Tail128LoopB + + VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC1, CC1 + VPADDD DD0, DD1, DD1 + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + +openAVX2TailLoop: + CMPQ inl, $32 + JB openAVX2Tail + SUBQ $32, inl + + // Load for decryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + LEAQ (1*32)(oup), oup + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + JMP openAVX2TailLoop + +openAVX2Tail: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB openAVX2TailDone + SUBQ $16, inl + + // Load for decryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +openAVX2TailDone: + VZEROUPPER + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +openAVX2Tail256: + // Need to decrypt up to 256 bytes - prepare four blocks + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA DD0, TT1 + VMOVDQA DD1, TT2 + + // Compute the number of iterations that will hash data + MOVQ inl, tmpStoreAVX2 + MOVQ inl, itr1 + SUBQ $128, itr1 + SHRQ $4, itr1 + MOVQ $10, itr2 + CMPQ itr1, $10 + CMOVQGT itr2, itr1 + MOVQ inp, inl + XORQ itr2, itr2 + +openAVX2Tail256LoopA: + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + + // Perform ChaCha rounds, while hashing the remaining input +openAVX2Tail256LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + INCQ itr2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + CMPQ itr2, itr1 + JB openAVX2Tail256LoopA + + CMPQ itr2, $10 + JNE openAVX2Tail256LoopB + + MOVQ inl, itr2 + SUBQ inp, inl + MOVQ inl, itr1 + MOVQ tmpStoreAVX2, inl + + // Hash the remainder of data (if any) +openAVX2Tail256Hash: + ADDQ $16, itr1 + CMPQ itr1, inl + JGT openAVX2Tail256HashEnd + polyAdd (0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + JMP openAVX2Tail256Hash + +// Store 128 bytes safely, then go to store loop +openAVX2Tail256HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, AA2; VPERM2I128 $0x02, CC0, DD0, BB2; VPERM2I128 $0x13, AA0, BB0, CC2; VPERM2I128 $0x13, CC0, DD0, DD2 + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + + VPXOR (0*32)(inp), AA2, AA2; VPXOR (1*32)(inp), BB2, BB2; VPXOR (2*32)(inp), CC2, CC2; VPXOR (3*32)(inp), DD2, DD2 + VMOVDQU AA2, (0*32)(oup); VMOVDQU BB2, (1*32)(oup); VMOVDQU CC2, (2*32)(oup); VMOVDQU DD2, (3*32)(oup) + LEAQ (4*32)(inp), inp + LEAQ (4*32)(oup), oup + SUBQ $4*32, inl + + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 384 bytes of ciphertext +openAVX2Tail384: + // Need to decrypt up to 384 bytes - prepare six blocks + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA DD0, ctr0StoreAVX2 + VMOVDQA DD1, ctr1StoreAVX2 + VMOVDQA DD2, ctr2StoreAVX2 + + // Compute the number of iterations that will hash two blocks of data + MOVQ inl, tmpStoreAVX2 + MOVQ inl, itr1 + SUBQ $256, itr1 + SHRQ $4, itr1 + ADDQ $6, itr1 + MOVQ $10, itr2 + CMPQ itr1, $10 + CMOVQGT itr2, itr1 + MOVQ inp, inl + XORQ itr2, itr2 + + // Perform ChaCha rounds, while hashing the remaining input +openAVX2Tail384LoopB: + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + +openAVX2Tail384LoopA: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + INCQ itr2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + + CMPQ itr2, itr1 + JB openAVX2Tail384LoopB + + CMPQ itr2, $10 + JNE openAVX2Tail384LoopA + + MOVQ inl, itr2 + SUBQ inp, inl + MOVQ inl, itr1 + MOVQ tmpStoreAVX2, inl + +openAVX2Tail384Hash: + ADDQ $16, itr1 + CMPQ itr1, inl + JGT openAVX2Tail384HashEnd + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + JMP openAVX2Tail384Hash + +// Store 256 bytes safely, then go to store loop +openAVX2Tail384HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2 + VPERM2I128 $0x02, AA0, BB0, TT0; VPERM2I128 $0x02, CC0, DD0, TT1; VPERM2I128 $0x13, AA0, BB0, TT2; VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, TT0; VPERM2I128 $0x02, CC1, DD1, TT1; VPERM2I128 $0x13, AA1, BB1, TT2; VPERM2I128 $0x13, CC1, DD1, TT3 + VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 + VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + LEAQ (8*32)(inp), inp + LEAQ (8*32)(oup), oup + SUBQ $8*32, inl + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 512 bytes of ciphertext +openAVX2Tail512: + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + XORQ itr1, itr1 + MOVQ inp, itr2 + +openAVX2Tail512LoopB: + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ (2*8)(itr2), itr2 + +openAVX2Tail512LoopA: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyAdd(0*8(itr2)) + polyMulAVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(2*8(itr2)) + polyMulAVX2 + LEAQ (4*8)(itr2), itr2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + INCQ itr1 + CMPQ itr1, $4 + JLT openAVX2Tail512LoopB + + CMPQ itr1, $10 + JNE openAVX2Tail512LoopA + + MOVQ inl, itr1 + SUBQ $384, itr1 + ANDQ $-16, itr1 + +openAVX2Tail512HashLoop: + TESTQ itr1, itr1 + JE openAVX2Tail512HashEnd + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + SUBQ $16, itr1 + JMP openAVX2Tail512HashLoop + +openAVX2Tail512HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + + LEAQ (12*32)(inp), inp + LEAQ (12*32)(oup), oup + SUBQ $12*32, inl + + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// func chacha20Poly1305Seal(dst, key, src, ad []byte) +TEXT ·chacha20Poly1305Seal(SB), 0, $288-96 + // For aligned stack access + MOVQ SP, BP + ADDQ $32, BP + ANDQ $-32, BP + MOVQ dst+0(FP), oup + MOVQ key+24(FP), keyp + MOVQ src+48(FP), inp + MOVQ src_len+56(FP), inl + MOVQ ad+72(FP), adp + + CMPB ·useAVX2(SB), $1 + JE chacha20Poly1305Seal_AVX2 + + // Special optimization, for very short buffers + CMPQ inl, $128 + JBE sealSSE128 // About 15% faster + + // In the seal case - prepare the poly key + 3 blocks of stream in the first iteration + MOVOU ·chacha20Constants<>(SB), A0 + MOVOU (1*16)(keyp), B0 + MOVOU (2*16)(keyp), C0 + MOVOU (3*16)(keyp), D0 + + // Store state on stack for future use + MOVO B0, state1Store + MOVO C0, state2Store + + // Load state, increment counter blocks + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + MOVQ $10, itr2 + +sealSSEIntroLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr2 + JNE sealSSEIntroLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVO A0, rStore + MOVO B0, sStore + + // Hash AAD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (4*16)(oup); MOVOU B2, (5*16)(oup); MOVOU C2, (6*16)(oup); MOVOU D2, (7*16)(oup) + + MOVQ $128, itr1 + SUBQ $128, inl + LEAQ 128(inp), inp + + MOVO A3, A1; MOVO B3, B1; MOVO C3, C1; MOVO D3, D1 + + CMPQ inl, $64 + JBE sealSSE128SealHash + + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 + MOVOU A3, (8*16)(oup); MOVOU B3, (9*16)(oup); MOVOU C3, (10*16)(oup); MOVOU D3, (11*16)(oup) + + ADDQ $64, itr1 + SUBQ $64, inl + LEAQ 64(inp), inp + + MOVQ $2, itr1 + MOVQ $8, itr2 + + CMPQ inl, $64 + JBE sealSSETail64 + CMPQ inl, $128 + JBE sealSSETail128 + CMPQ inl, $192 + JBE sealSSETail192 + +sealSSEMainLoop: + // Load state, increment counter blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + +sealSSEInnerLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyAdd(0(oup)) + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + LEAQ (2*8)(oup), oup + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + polyMulStage3 + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr2 + JGE sealSSEInnerLoop + polyAdd(0(oup)) + polyMul + LEAQ (2*8)(oup), oup + DECQ itr1 + JG sealSSEInnerLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + MOVO D3, tmpStore + + // Load - xor - store + MOVOU (0*16)(inp), D3; PXOR D3, A0 + MOVOU (1*16)(inp), D3; PXOR D3, B0 + MOVOU (2*16)(inp), D3; PXOR D3, C0 + MOVOU (3*16)(inp), D3; PXOR D3, D0 + MOVOU A0, (0*16)(oup) + MOVOU B0, (1*16)(oup) + MOVOU C0, (2*16)(oup) + MOVOU D0, (3*16)(oup) + MOVO tmpStore, D3 + + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) + ADDQ $192, inp + MOVQ $192, itr1 + SUBQ $192, inl + MOVO A3, A1 + MOVO B3, B1 + MOVO C3, C1 + MOVO D3, D1 + CMPQ inl, $64 + JBE sealSSE128SealHash + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 + MOVOU A3, (12*16)(oup); MOVOU B3, (13*16)(oup); MOVOU C3, (14*16)(oup); MOVOU D3, (15*16)(oup) + LEAQ 64(inp), inp + SUBQ $64, inl + MOVQ $6, itr1 + MOVQ $4, itr2 + CMPQ inl, $192 + JG sealSSEMainLoop + + MOVQ inl, itr1 + TESTQ inl, inl + JE sealSSE128SealHash + MOVQ $6, itr1 + CMPQ inl, $64 + JBE sealSSETail64 + CMPQ inl, $128 + JBE sealSSETail128 + JMP sealSSETail192 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 64 bytes of plaintext +sealSSETail64: + // Need to encrypt up to 64 bytes - prepare single block, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A1 + MOVO state1Store, B1 + MOVO state2Store, C1 + MOVO ctr3Store, D1 + PADDL ·sseIncMask<>(SB), D1 + MOVO D1, ctr0Store + +sealSSETail64LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail64LoopB: + chachaQR(A1, B1, C1, D1, T1) + shiftB1Left; shiftC1Left; shiftD1Left + chachaQR(A1, B1, C1, D1, T1) + shiftB1Right; shiftC1Right; shiftD1Right + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + + DECQ itr1 + JG sealSSETail64LoopA + + DECQ itr2 + JGE sealSSETail64LoopB + PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B1 + PADDL state2Store, C1 + PADDL ctr0Store, D1 + + JMP sealSSE128Seal + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of plaintext +sealSSETail128: + // Need to encrypt up to 128 bytes - prepare two blocks, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + +sealSSETail128LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail128LoopB: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + + DECQ itr1 + JG sealSSETail128LoopA + + DECQ itr2 + JGE sealSSETail128LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B0; PADDL state1Store, B1 + PADDL state2Store, C0; PADDL state2Store, C1 + PADDL ctr0Store, D0; PADDL ctr1Store, D1 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 + MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) + + MOVQ $64, itr1 + LEAQ 64(inp), inp + SUBQ $64, inl + + JMP sealSSE128SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 192 bytes of plaintext +sealSSETail192: + // Need to encrypt up to 192 bytes - prepare three blocks, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr2Store + +sealSSETail192LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail192LoopB: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + shiftB2Left; shiftC2Left; shiftD2Left + + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + shiftB2Right; shiftC2Right; shiftD2Right + + DECQ itr1 + JG sealSSETail192LoopA + + DECQ itr2 + JGE sealSSETail192LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 + PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 + PADDL ctr0Store, D0; PADDL ctr1Store, D1; PADDL ctr2Store, D2 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 + MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + + MOVO A2, A1 + MOVO B2, B1 + MOVO C2, C1 + MOVO D2, D1 + MOVQ $128, itr1 + LEAQ 128(inp), inp + SUBQ $128, inl + + JMP sealSSE128SealHash + +// ---------------------------------------------------------------------------- +// Special seal optimization for buffers smaller than 129 bytes +sealSSE128: + // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks + MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 + MOVQ $10, itr2 + +sealSSE128InnerCipherLoop: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftB1Left; shiftB2Left + shiftC0Left; shiftC1Left; shiftC2Left + shiftD0Left; shiftD1Left; shiftD2Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftB1Right; shiftB2Right + shiftC0Right; shiftC1Right; shiftC2Right + shiftD0Right; shiftD1Right; shiftD2Right + DECQ itr2 + JNE sealSSE128InnerCipherLoop + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 + PADDL T2, C1; PADDL T2, C2 + PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 + PAND ·polyClampMask<>(SB), A0 + MOVOU A0, rStore + MOVOU B0, sStore + + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +sealSSE128SealHash: + // itr1 holds the number of bytes encrypted but not yet hashed + CMPQ itr1, $16 + JB sealSSE128Seal + polyAdd(0(oup)) + polyMul + + SUBQ $16, itr1 + ADDQ $16, oup + + JMP sealSSE128SealHash + +sealSSE128Seal: + CMPQ inl, $16 + JB sealSSETail + SUBQ $16, inl + + // Load for decryption + MOVOU (inp), T0 + PXOR T0, A1 + MOVOU A1, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + + // Extract for hashing + MOVQ A1, t0 + PSRLDQ $8, A1 + MOVQ A1, t1 + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + // Shift the stream "left" + MOVO B1, A1 + MOVO C1, B1 + MOVO D1, C1 + MOVO A2, D1 + MOVO B2, A2 + MOVO C2, B2 + MOVO D2, C2 + JMP sealSSE128Seal + +sealSSETail: + TESTQ inl, inl + JE sealSSEFinalize + + // We can only load the PT one byte at a time to avoid read after end of buffer + MOVQ inl, itr2 + SHLQ $4, itr2 + LEAQ ·andMask<>(SB), t0 + MOVQ inl, itr1 + LEAQ -1(inp)(inl*1), inp + XORQ t2, t2 + XORQ t3, t3 + XORQ AX, AX + +sealSSETailLoadLoop: + SHLQ $8, t2, t3 + SHLQ $8, t2 + MOVB (inp), AX + XORQ AX, t2 + LEAQ -1(inp), inp + DECQ itr1 + JNE sealSSETailLoadLoop + MOVQ t2, 0+tmpStore + MOVQ t3, 8+tmpStore + PXOR 0+tmpStore, A1 + MOVOU A1, (oup) + MOVOU -16(t0)(itr2*1), T0 + PAND T0, A1 + MOVQ A1, t0 + PSRLDQ $8, A1 + MOVQ A1, t1 + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + ADDQ inl, oup + +sealSSEFinalize: + // Hash in the buffer lengths + ADDQ ad_len+80(FP), acc0 + ADCQ src_len+56(FP), acc1 + ADCQ $1, acc2 + polyMul + + // Final reduce + MOVQ acc0, t0 + MOVQ acc1, t1 + MOVQ acc2, t2 + SUBQ $-5, acc0 + SBBQ $-1, acc1 + SBBQ $3, acc2 + CMOVQCS t0, acc0 + CMOVQCS t1, acc1 + CMOVQCS t2, acc2 + + // Add in the "s" part of the key + ADDQ 0+sStore, acc0 + ADCQ 8+sStore, acc1 + + // Finally store the tag at the end of the message + MOVQ acc0, (0*8)(oup) + MOVQ acc1, (1*8)(oup) + RET + +// ---------------------------------------------------------------------------- +// ------------------------- AVX2 Code ---------------------------------------- +chacha20Poly1305Seal_AVX2: + VZEROUPPER + VMOVDQU ·chacha20Constants<>(SB), AA0 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 + BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 + VPADDD ·avx2InitMask<>(SB), DD0, DD0 + + // Special optimizations, for very short buffers + CMPQ inl, $192 + JBE seal192AVX2 // 33% faster + CMPQ inl, $320 + JBE seal320AVX2 // 17% faster + + // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream + VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3; VMOVDQA BB0, state1StoreAVX2 + VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3; VMOVDQA CC0, state2StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD0, DD1; VMOVDQA DD0, ctr0StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD1, DD2; VMOVDQA DD1, ctr1StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD2, DD3; VMOVDQA DD2, ctr2StoreAVX2 + VMOVDQA DD3, ctr3StoreAVX2 + MOVQ $10, itr2 + +sealAVX2IntroLoop: + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 + VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 + VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 + VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 + VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 + DECQ itr2 + JNE sealAVX2IntroLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + + VPERM2I128 $0x13, CC0, DD0, CC0 // Stream bytes 96 - 127 + VPERM2I128 $0x02, AA0, BB0, DD0 // The Poly1305 key + VPERM2I128 $0x13, AA0, BB0, AA0 // Stream bytes 64 - 95 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), DD0, DD0 + VMOVDQA DD0, rsStoreAVX2 + + // Hash AD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + + // Can store at least 320 bytes + VPXOR (0*32)(inp), AA0, AA0 + VPXOR (1*32)(inp), CC0, CC0 + VMOVDQU AA0, (0*32)(oup) + VMOVDQU CC0, (1*32)(oup) + + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (2*32)(inp), AA0, AA0; VPXOR (3*32)(inp), BB0, BB0; VPXOR (4*32)(inp), CC0, CC0; VPXOR (5*32)(inp), DD0, DD0 + VMOVDQU AA0, (2*32)(oup); VMOVDQU BB0, (3*32)(oup); VMOVDQU CC0, (4*32)(oup); VMOVDQU DD0, (5*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (6*32)(inp), AA0, AA0; VPXOR (7*32)(inp), BB0, BB0; VPXOR (8*32)(inp), CC0, CC0; VPXOR (9*32)(inp), DD0, DD0 + VMOVDQU AA0, (6*32)(oup); VMOVDQU BB0, (7*32)(oup); VMOVDQU CC0, (8*32)(oup); VMOVDQU DD0, (9*32)(oup) + + MOVQ $320, itr1 + SUBQ $320, inl + LEAQ 320(inp), inp + + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, CC3, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, CC3, DD3, DD0 + CMPQ inl, $128 + JBE sealAVX2SealHash + + VPXOR (0*32)(inp), AA0, AA0; VPXOR (1*32)(inp), BB0, BB0; VPXOR (2*32)(inp), CC0, CC0; VPXOR (3*32)(inp), DD0, DD0 + VMOVDQU AA0, (10*32)(oup); VMOVDQU BB0, (11*32)(oup); VMOVDQU CC0, (12*32)(oup); VMOVDQU DD0, (13*32)(oup) + SUBQ $128, inl + LEAQ 128(inp), inp + + MOVQ $8, itr1 + MOVQ $2, itr2 + + CMPQ inl, $128 + JBE sealAVX2Tail128 + CMPQ inl, $256 + JBE sealAVX2Tail256 + CMPQ inl, $384 + JBE sealAVX2Tail384 + CMPQ inl, $512 + JBE sealAVX2Tail512 + + // We have 448 bytes to hash, but main loop hashes 512 bytes at a time - perform some rounds, before the main loop + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 + VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 + VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 + VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 + VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + + SUBQ $16, oup // Adjust the pointer + MOVQ $9, itr1 + JMP sealAVX2InternalLoopStart + +sealAVX2MainLoop: + // Load state, increment counter blocks, store the incremented counters + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + MOVQ $10, itr1 + +sealAVX2InternalLoop: + polyAdd(0*8(oup)) + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage1_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulStage2_AVX2 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyMulStage3_AVX2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + +sealAVX2InternalLoopStart: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + polyAdd(2*8(oup)) + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage1_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage2_AVX2 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage3_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulReduceStage + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(4*8(oup)) + LEAQ (6*8)(oup), oup + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage1_AVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + polyMulStage2_AVX2 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage3_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + DECQ itr1 + JNE sealAVX2InternalLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + + // We only hashed 480 of the 512 bytes available - hash the remaining 32 here + polyAdd(0*8(oup)) + polyMulAVX2 + LEAQ (4*8)(oup), oup + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + // and here + polyAdd(-2*8(oup)) + polyMulAVX2 + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 + VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) + LEAQ (32*16)(inp), inp + SUBQ $(32*16), inl + CMPQ inl, $512 + JG sealAVX2MainLoop + + // Tail can only hash 480 bytes + polyAdd(0*8(oup)) + polyMulAVX2 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ 32(oup), oup + + MOVQ $10, itr1 + MOVQ $0, itr2 + CMPQ inl, $128 + JBE sealAVX2Tail128 + CMPQ inl, $256 + JBE sealAVX2Tail256 + CMPQ inl, $384 + JBE sealAVX2Tail384 + JMP sealAVX2Tail512 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 193 bytes +seal192AVX2: + // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks + VMOVDQA AA0, AA1 + VMOVDQA BB0, BB1 + VMOVDQA CC0, CC1 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2 + VMOVDQA BB0, BB2 + VMOVDQA CC0, CC2 + VMOVDQA DD0, DD2 + VMOVDQA DD1, TT3 + MOVQ $10, itr2 + +sealAVX2192InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr2 + JNE sealAVX2192InnerCipherLoop + VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 + VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 + VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 + VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 192 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + +sealAVX2ShortSeal: + // Hash aad + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +sealAVX2SealHash: + // itr1 holds the number of bytes encrypted but not yet hashed + CMPQ itr1, $16 + JB sealAVX2ShortSealLoop + polyAdd(0(oup)) + polyMul + SUBQ $16, itr1 + ADDQ $16, oup + JMP sealAVX2SealHash + +sealAVX2ShortSealLoop: + CMPQ inl, $32 + JB sealAVX2ShortTail32 + SUBQ $32, inl + + // Load for encryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + + // Now can hash + polyAdd(0*8(oup)) + polyMulAVX2 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ (1*32)(oup), oup + + // Shift stream left + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + VMOVDQA AA1, DD0 + VMOVDQA BB1, AA1 + VMOVDQA CC1, BB1 + VMOVDQA DD1, CC1 + VMOVDQA AA2, DD1 + VMOVDQA BB2, AA2 + JMP sealAVX2ShortSealLoop + +sealAVX2ShortTail32: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB sealAVX2ShortDone + + SUBQ $16, inl + + // Load for encryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + + // Hash + polyAdd(0*8(oup)) + polyMulAVX2 + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +sealAVX2ShortDone: + VZEROUPPER + JMP sealSSETail + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 321 bytes +seal320AVX2: + // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks + VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 + MOVQ $10, itr2 + +sealAVX2320InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr2 + JNE sealAVX2320InnerCipherLoop + + VMOVDQA ·chacha20Constants<>(SB), TT0 + VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 + VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 + VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 + VMOVDQA ·avx2IncMask<>(SB), TT0 + VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD2, DD2 + + // Clamp and store poly key + VPERM2I128 $0x02, AA0, BB0, TT0 + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 320 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x02, AA2, BB2, CC1 + VPERM2I128 $0x02, CC2, DD2, DD1 + VPERM2I128 $0x13, AA2, BB2, AA2 + VPERM2I128 $0x13, CC2, DD2, BB2 + JMP sealAVX2ShortSeal + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +sealAVX2Tail128: + // Need to decrypt up to 128 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0 + VMOVDQA state1StoreAVX2, BB0 + VMOVDQA state2StoreAVX2, CC0 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VMOVDQA DD0, DD1 + +sealAVX2Tail128LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail128LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0 + VPALIGNR $8, CC0, CC0, CC0 + VPALIGNR $12, DD0, DD0, DD0 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0 + VPALIGNR $8, CC0, CC0, CC0 + VPALIGNR $4, DD0, DD0, DD0 + DECQ itr1 + JG sealAVX2Tail128LoopA + DECQ itr2 + JGE sealAVX2Tail128LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA1 + VPADDD state1StoreAVX2, BB0, BB1 + VPADDD state2StoreAVX2, CC0, CC1 + VPADDD DD1, DD0, DD1 + + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + JMP sealAVX2ShortSealLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +sealAVX2Tail256: + // Need to decrypt up to 256 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA ·chacha20Constants<>(SB), AA1 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA state1StoreAVX2, BB1 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA state2StoreAVX2, CC1 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA DD0, TT1 + VMOVDQA DD1, TT2 + +sealAVX2Tail256LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail256LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr1 + JG sealAVX2Tail256LoopA + DECQ itr2 + JGE sealAVX2Tail256LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + VPERM2I128 $0x02, CC0, DD0, TT1 + VPERM2I128 $0x13, AA0, BB0, TT2 + VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + MOVQ $128, itr1 + LEAQ 128(inp), inp + SUBQ $128, inl + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + + JMP sealAVX2SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 384 bytes of ciphertext +sealAVX2Tail384: + // Need to decrypt up to 384 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA DD0, TT1; VMOVDQA DD1, TT2; VMOVDQA DD2, TT3 + +sealAVX2Tail384LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail384LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr1 + JG sealAVX2Tail384LoopA + DECQ itr2 + JGE sealAVX2Tail384LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1; VPADDD TT3, DD2, DD2 + VPERM2I128 $0x02, AA0, BB0, TT0 + VPERM2I128 $0x02, CC0, DD0, TT1 + VPERM2I128 $0x13, AA0, BB0, TT2 + VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, TT0 + VPERM2I128 $0x02, CC1, DD1, TT1 + VPERM2I128 $0x13, AA1, BB1, TT2 + VPERM2I128 $0x13, CC1, DD1, TT3 + VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 + VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) + MOVQ $256, itr1 + LEAQ 256(inp), inp + SUBQ $256, inl + VPERM2I128 $0x02, AA2, BB2, AA0 + VPERM2I128 $0x02, CC2, DD2, BB0 + VPERM2I128 $0x13, AA2, BB2, CC0 + VPERM2I128 $0x13, CC2, DD2, DD0 + + JMP sealAVX2SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 512 bytes of ciphertext +sealAVX2Tail512: + // Need to decrypt up to 512 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + +sealAVX2Tail512LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail512LoopB: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyAdd(0*8(oup)) + polyMulAVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ (4*8)(oup), oup + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + + DECQ itr1 + JG sealAVX2Tail512LoopA + DECQ itr2 + JGE sealAVX2Tail512LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3 + VPXOR (0*32)(inp), CC3, CC3 + VMOVDQU CC3, (0*32)(oup) + VPERM2I128 $0x02, CC0, DD0, CC3 + VPXOR (1*32)(inp), CC3, CC3 + VMOVDQU CC3, (1*32)(oup) + VPERM2I128 $0x13, AA0, BB0, CC3 + VPXOR (2*32)(inp), CC3, CC3 + VMOVDQU CC3, (2*32)(oup) + VPERM2I128 $0x13, CC0, DD0, CC3 + VPXOR (3*32)(inp), CC3, CC3 + VMOVDQU CC3, (3*32)(oup) + + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + VPERM2I128 $0x02, AA2, BB2, AA0 + VPERM2I128 $0x02, CC2, DD2, BB0 + VPERM2I128 $0x13, AA2, BB2, CC0 + VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + + MOVQ $384, itr1 + LEAQ 384(inp), inp + SUBQ $384, inl + VPERM2I128 $0x02, AA3, BB3, AA0 + VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0 + VPERM2I128 $0x13, AA3, BB3, CC0 + VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + + JMP sealAVX2SealHash + +// func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) +TEXT ·cpuid(SB), NOSPLIT, $0-24 + MOVL eaxArg+0(FP), AX + MOVL ecxArg+4(FP), CX + CPUID + MOVL AX, eax+8(FP) + MOVL BX, ebx+12(FP) + MOVL CX, ecx+16(FP) + MOVL DX, edx+20(FP) + RET + +// func xgetbv() (eax, edx uint32) +TEXT ·xgetbv(SB),NOSPLIT,$0-8 + MOVL $0, CX + XGETBV + MOVL AX, eax+0(FP) + MOVL DX, edx+4(FP) + RET diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go new file mode 100644 index 0000000000..6b6d99bdbf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go @@ -0,0 +1,70 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package chacha20poly1305 + +import ( + "encoding/binary" + + "github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20" + "github.com/skycoin/skycoin/src/cipher/poly1305" +) + +func roundTo16(n int) int { + return 16 * ((n + 15) / 16) +} + +func (c *chacha20poly1305) sealGeneric(dst, nonce, plaintext, additionalData []byte) []byte { + var counter [16]byte + copy(counter[4:], nonce) + + var polyKey [32]byte + chacha20.XORKeyStream(polyKey[:], polyKey[:], &counter, &c.key) + + ret, out := sliceForAppend(dst, len(plaintext)+poly1305.TagSize) + counter[0] = 1 + chacha20.XORKeyStream(out, plaintext, &counter, &c.key) + + polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(plaintext))+8+8) + copy(polyInput, additionalData) + copy(polyInput[roundTo16(len(additionalData)):], out[:len(plaintext)]) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData))) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(plaintext))) + + var tag [poly1305.TagSize]byte + poly1305.Sum(&tag, polyInput, &polyKey) + copy(out[len(plaintext):], tag[:]) + + return ret +} + +func (c *chacha20poly1305) openGeneric(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + var tag [poly1305.TagSize]byte + copy(tag[:], ciphertext[len(ciphertext)-16:]) + ciphertext = ciphertext[:len(ciphertext)-16] + + var counter [16]byte + copy(counter[4:], nonce) + + var polyKey [32]byte + chacha20.XORKeyStream(polyKey[:], polyKey[:], &counter, &c.key) + + polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(ciphertext))+8+8) + copy(polyInput, additionalData) + copy(polyInput[roundTo16(len(additionalData)):], ciphertext) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData))) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(ciphertext))) + + ret, out := sliceForAppend(dst, len(ciphertext)) + if !poly1305.Verify(&tag, polyInput, &polyKey) { + for i := range out { + out[i] = 0 + } + return nil, errOpen + } + + counter[0] = 1 + chacha20.XORKeyStream(out, ciphertext, &counter, &c.key) + return ret, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go new file mode 100644 index 0000000000..0014b4cc18 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go @@ -0,0 +1,16 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !amd64 || !go1.7 || gccgo || appengine +// +build !amd64 !go1.7 gccgo appengine + +package chacha20poly1305 + +func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte { + return c.sealGeneric(dst, nonce, plaintext, additionalData) +} + +func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + return c.openGeneric(dst, nonce, ciphertext, additionalData) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go new file mode 100644 index 0000000000..b017a73190 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go @@ -0,0 +1,199 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package chacha20 implements the core ChaCha20 function as specified in https://tools.ietf.org/html/rfc7539#section-2.3. +package chacha20 + +import "encoding/binary" + +const rounds = 20 + +// core applies the ChaCha20 core function to 16-byte input in, 32-byte key k, +// and 16-byte constant c, and puts the result into 64-byte array out. +func core(out *[64]byte, in *[16]byte, k *[32]byte) { + j0 := uint32(0x61707865) + j1 := uint32(0x3320646e) + j2 := uint32(0x79622d32) + j3 := uint32(0x6b206574) + j4 := binary.LittleEndian.Uint32(k[0:4]) + j5 := binary.LittleEndian.Uint32(k[4:8]) + j6 := binary.LittleEndian.Uint32(k[8:12]) + j7 := binary.LittleEndian.Uint32(k[12:16]) + j8 := binary.LittleEndian.Uint32(k[16:20]) + j9 := binary.LittleEndian.Uint32(k[20:24]) + j10 := binary.LittleEndian.Uint32(k[24:28]) + j11 := binary.LittleEndian.Uint32(k[28:32]) + j12 := binary.LittleEndian.Uint32(in[0:4]) + j13 := binary.LittleEndian.Uint32(in[4:8]) + j14 := binary.LittleEndian.Uint32(in[8:12]) + j15 := binary.LittleEndian.Uint32(in[12:16]) + + x0, x1, x2, x3, x4, x5, x6, x7 := j0, j1, j2, j3, j4, j5, j6, j7 + x8, x9, x10, x11, x12, x13, x14, x15 := j8, j9, j10, j11, j12, j13, j14, j15 + + for i := 0; i < rounds; i += 2 { + x0 += x4 + x12 ^= x0 + x12 = (x12 << 16) | (x12 >> (16)) + x8 += x12 + x4 ^= x8 + x4 = (x4 << 12) | (x4 >> (20)) + x0 += x4 + x12 ^= x0 + x12 = (x12 << 8) | (x12 >> (24)) + x8 += x12 + x4 ^= x8 + x4 = (x4 << 7) | (x4 >> (25)) + x1 += x5 + x13 ^= x1 + x13 = (x13 << 16) | (x13 >> 16) + x9 += x13 + x5 ^= x9 + x5 = (x5 << 12) | (x5 >> 20) + x1 += x5 + x13 ^= x1 + x13 = (x13 << 8) | (x13 >> 24) + x9 += x13 + x5 ^= x9 + x5 = (x5 << 7) | (x5 >> 25) + x2 += x6 + x14 ^= x2 + x14 = (x14 << 16) | (x14 >> 16) + x10 += x14 + x6 ^= x10 + x6 = (x6 << 12) | (x6 >> 20) + x2 += x6 + x14 ^= x2 + x14 = (x14 << 8) | (x14 >> 24) + x10 += x14 + x6 ^= x10 + x6 = (x6 << 7) | (x6 >> 25) + x3 += x7 + x15 ^= x3 + x15 = (x15 << 16) | (x15 >> 16) + x11 += x15 + x7 ^= x11 + x7 = (x7 << 12) | (x7 >> 20) + x3 += x7 + x15 ^= x3 + x15 = (x15 << 8) | (x15 >> 24) + x11 += x15 + x7 ^= x11 + x7 = (x7 << 7) | (x7 >> 25) + x0 += x5 + x15 ^= x0 + x15 = (x15 << 16) | (x15 >> 16) + x10 += x15 + x5 ^= x10 + x5 = (x5 << 12) | (x5 >> 20) + x0 += x5 + x15 ^= x0 + x15 = (x15 << 8) | (x15 >> 24) + x10 += x15 + x5 ^= x10 + x5 = (x5 << 7) | (x5 >> 25) + x1 += x6 + x12 ^= x1 + x12 = (x12 << 16) | (x12 >> 16) + x11 += x12 + x6 ^= x11 + x6 = (x6 << 12) | (x6 >> 20) + x1 += x6 + x12 ^= x1 + x12 = (x12 << 8) | (x12 >> 24) + x11 += x12 + x6 ^= x11 + x6 = (x6 << 7) | (x6 >> 25) + x2 += x7 + x13 ^= x2 + x13 = (x13 << 16) | (x13 >> 16) + x8 += x13 + x7 ^= x8 + x7 = (x7 << 12) | (x7 >> 20) + x2 += x7 + x13 ^= x2 + x13 = (x13 << 8) | (x13 >> 24) + x8 += x13 + x7 ^= x8 + x7 = (x7 << 7) | (x7 >> 25) + x3 += x4 + x14 ^= x3 + x14 = (x14 << 16) | (x14 >> 16) + x9 += x14 + x4 ^= x9 + x4 = (x4 << 12) | (x4 >> 20) + x3 += x4 + x14 ^= x3 + x14 = (x14 << 8) | (x14 >> 24) + x9 += x14 + x4 ^= x9 + x4 = (x4 << 7) | (x4 >> 25) + } + + x0 += j0 + x1 += j1 + x2 += j2 + x3 += j3 + x4 += j4 + x5 += j5 + x6 += j6 + x7 += j7 + x8 += j8 + x9 += j9 + x10 += j10 + x11 += j11 + x12 += j12 + x13 += j13 + x14 += j14 + x15 += j15 + + binary.LittleEndian.PutUint32(out[0:4], x0) + binary.LittleEndian.PutUint32(out[4:8], x1) + binary.LittleEndian.PutUint32(out[8:12], x2) + binary.LittleEndian.PutUint32(out[12:16], x3) + binary.LittleEndian.PutUint32(out[16:20], x4) + binary.LittleEndian.PutUint32(out[20:24], x5) + binary.LittleEndian.PutUint32(out[24:28], x6) + binary.LittleEndian.PutUint32(out[28:32], x7) + binary.LittleEndian.PutUint32(out[32:36], x8) + binary.LittleEndian.PutUint32(out[36:40], x9) + binary.LittleEndian.PutUint32(out[40:44], x10) + binary.LittleEndian.PutUint32(out[44:48], x11) + binary.LittleEndian.PutUint32(out[48:52], x12) + binary.LittleEndian.PutUint32(out[52:56], x13) + binary.LittleEndian.PutUint32(out[56:60], x14) + binary.LittleEndian.PutUint32(out[60:64], x15) +} + +// XORKeyStream crypts bytes from in to out using the given key and counters. +// In and out may be the same slice but otherwise should not overlap. Counter +// contains the raw ChaCha20 counter bytes (i.e. block counter followed by +// nonce). +func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { + var block [64]byte + var counterCopy [16]byte + copy(counterCopy[:], counter[:]) + + for len(in) >= 64 { + core(&block, &counterCopy, key) + for i, x := range block { + out[i] = in[i] ^ x + } + u := uint32(1) + for i := 0; i < 4; i++ { + u += uint32(counterCopy[i]) + counterCopy[i] = byte(u) + u >>= 8 + } + in = in[64:] + out = out[64:] + } + + if len(in) > 0 { + core(&block, &counterCopy, key) + for i, v := range in { + out[i] = v ^ block[i] + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/crypto.go b/vendor/github.com/skycoin/skycoin/src/cipher/crypto.go index 53bce1fe73..60c24fa9f6 100644 --- a/vendor/github.com/skycoin/skycoin/src/cipher/crypto.go +++ b/vendor/github.com/skycoin/skycoin/src/cipher/crypto.go @@ -270,7 +270,7 @@ func (sk SecKey) Null() bool { return sk == SecKey{} } -//ECDH generates a shared secret +// ECDH generates a shared secret // A: pub1,sec1 // B: pub2,sec2 // person A sends their public key pub1 diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/crypto/crypto.go b/vendor/github.com/skycoin/skycoin/src/cipher/crypto/crypto.go new file mode 100644 index 0000000000..3db8c5ee04 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/crypto/crypto.go @@ -0,0 +1,86 @@ +package crypto + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher/encrypt" +) + +// Cryptor wraps the Encrypt and Decrypt method +type Cryptor interface { + Encrypt(data, password []byte) ([]byte, error) + Decrypt(data, password []byte) ([]byte, error) +} + +// CryptoType represents the type of crypto name +type CryptoType string + +// CryptoTypeFromString converts string to CryptoType +func CryptoTypeFromString(s string) (CryptoType, error) { + switch CryptoType(s) { + case CryptoTypeSha256Xor: + return CryptoTypeSha256Xor, nil + case CryptoTypeScryptChacha20poly1305: + return CryptoTypeScryptChacha20poly1305, nil + case CryptoTypeScryptChacha20poly1305Insecure: + return CryptoTypeScryptChacha20poly1305Insecure, nil + default: + return "", errors.New("unknown crypto type") + } +} + +// Crypto types +const ( + // CryptoTypeSha256Xor uses the SHA256-XOR encryption method (unsafe - no key derivation) + CryptoTypeSha256Xor = CryptoType("sha256-xor") + // CryptoTypeScryptChacha20poly1305 uses chacha20poly1305 + scrypt key derivation (use this) + CryptoTypeScryptChacha20poly1305 = CryptoType("scrypt-chacha20poly1305") + // CryptoTypeScryptChacha20poly1305Insecure uses chacha20poly1305 + scrypt key derivation with a weak work factor (unsafe) + CryptoTypeScryptChacha20poly1305Insecure = CryptoType("scrypt-chacha20poly1305-insecure") + + // DefaultCryptoType is the default CryptoType used + DefaultCryptoType = CryptoTypeScryptChacha20poly1305 +) + +// cryptoTable records all supported wallet crypto methods +// If want to support new crypto methods, register here. +var cryptoTable = map[CryptoType]Cryptor{ + CryptoTypeSha256Xor: encrypt.DefaultSha256Xor, + CryptoTypeScryptChacha20poly1305: encrypt.DefaultScryptChacha20poly1305, + CryptoTypeScryptChacha20poly1305Insecure: encrypt.ScryptChacha20poly1305{ + N: 1 << 15, + R: encrypt.ScryptR, + P: encrypt.ScryptP, + KeyLen: encrypt.ScryptKeyLen, + }, +} + +// GetCrypto gets crypto of given type +func GetCrypto(cryptoType CryptoType) (Cryptor, error) { + c, ok := cryptoTable[cryptoType] + if !ok { + return nil, fmt.Errorf("can not find crypto %v in crypto table", cryptoType) + } + + return c, nil +} + +// Types returns all supported crypto types +func Types() []CryptoType { + return []CryptoType{ + CryptoTypeSha256Xor, + CryptoTypeScryptChacha20poly1305, + CryptoTypeScryptChacha20poly1305Insecure, + DefaultCryptoType, + } +} + +// TypesInsecure returns the CryptoTypeScryptChacha21poly1305Insecure, it +// would be used in testing to speed up the tests. +func TypesInsecure() []CryptoType { + return []CryptoType{ + CryptoTypeSha256Xor, + CryptoTypeScryptChacha20poly1305Insecure, + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/encoder/README.md b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/README.md new file mode 100644 index 0000000000..3aa1c31ad5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/README.md @@ -0,0 +1,8 @@ +encoder +======= + +[![GoDoc](http://godoc.org/github.com//skycoin/skycoin/src/cipher/encoder?status.png)](http://godoc.org/github.com/skycoin/skycoin/src/cipher/encoder) + +[Godoc generated documentation](https://godoc.org/github.com/skycoin/skycoin/src/cipher/encoder) + +Binary struct encoder for Go. Fork of go's pkg encoding/binary. diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/encoder/encoder.go b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/encoder.go new file mode 100644 index 0000000000..da17043bfe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/encoder.go @@ -0,0 +1,1027 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package encoder binary implements translation between struct data and byte sequences +// +// Fields can be ignored with the struct tag `enc:"-"` . +// Unexported struct fields are ignored by default . +// +// Fields can be skipped if empty with the struct tag `enc:",omitempty"` +// Note the comma, which follows package json's conventions. +// Only Slice, Map and String types recognize the omitempty tag. +// When omitempty is set, the no data will be written if the value is empty. +// If the value is empty and omitempty is not set, then a length prefix with value 0 would be written. +// omitempty can only be used for the last field in the struct +// +// Encoding of maps is supported, but note that the use of them results in non-deterministic output. +// If determinism is required, do not use map. +// +// A length restriction to certain fields can be applied when decoding. +// Use the tag `,maxlen=` on a struct field to apply this restriction. +// `maxlen` works for string and slice types. The length is interpreted as the length +// of the string or the number of elements in the slice. +// Note that maxlen does not affect serialization; it may serialize objects which could fail deserialization. +// Callers should check their length restricted values manually prior to serialization. +package encoder + +import ( + "errors" + "fmt" + "log" + "math" + "reflect" + "strconv" + "strings" +) + +var ( + // ErrBufferUnderflow bytes in input buffer not enough to deserialize expected type + ErrBufferUnderflow = errors.New("Not enough buffer data to deserialize") + // ErrBufferOverflow bytes in output buffer not enough to serialize expected type + ErrBufferOverflow = errors.New("Not enough buffer data to serialize") + // ErrInvalidOmitEmpty field tagged with omitempty and it's not last one in struct + ErrInvalidOmitEmpty = errors.New("omitempty only supported for the final field in the struct") + // ErrRemainingBytes bytes remain in buffer after deserializing object + ErrRemainingBytes = errors.New("Bytes remain in buffer after deserializing object") + // ErrMaxLenExceeded a specified maximum length was exceeded when serializing or deserializing a variable length field + ErrMaxLenExceeded = errors.New("Maximum length exceeded for variable length field") + // ErrMapDuplicateKeys encountered duplicate map keys while decoding a map + ErrMapDuplicateKeys = errors.New("Duplicate keys encountered while decoding a map") + // ErrInvalidBool is returned if the decoder encounters a value other than 0 or 1 for a bool type field + ErrInvalidBool = errors.New("Invalid value for bool type") +) + +// SerializeUint32 serializes a uint32 +func SerializeUint32(x uint32) []byte { + var b [4]byte + lePutUint32(b[:], x) + return b[:] +} + +// DeserializeUint32 serializes a uint32 +func DeserializeUint32(buf []byte) (uint32, uint64, error) { + if len(buf) < 4 { + return 0, 0, ErrBufferUnderflow + } + return leUint32(buf[:4]), 4, nil +} + +// SerializeAtomic encodes an integer or boolean contained in `data` to bytes. +// Panics if `data` is not an integer or boolean type. +func SerializeAtomic(data interface{}) []byte { + var b [8]byte + + switch v := data.(type) { + case bool: + if v { + b[0] = 1 + } else { + b[0] = 0 + } + return b[:1] + case int8: + b[0] = byte(v) + return b[:1] + case uint8: + b[0] = v + return b[:1] + case int16: + lePutUint16(b[:2], uint16(v)) + return b[:2] + case uint16: + lePutUint16(b[:2], v) + return b[:2] + case int32: + lePutUint32(b[:4], uint32(v)) + return b[:4] + case uint32: + lePutUint32(b[:4], v) + return b[:4] + case int64: + lePutUint64(b[:8], uint64(v)) + return b[:8] + case uint64: + lePutUint64(b[:8], v) + return b[:8] + default: + log.Panic("SerializeAtomic unhandled type") + return nil + } +} + +// DeserializeAtomic deserializes `in` buffer into `data` +// parameter. Panics if `data` is not an integer or boolean type. +// Returns the number of bytes read. +func DeserializeAtomic(in []byte, data interface{}) (uint64, error) { + switch v := data.(type) { + case *bool: + if len(in) < 1 { + return 0, ErrBufferUnderflow + } + if in[0] == 0 { + *v = false + } else { + *v = true + } + return 1, nil + case *int8: + if len(in) < 1 { + return 0, ErrBufferUnderflow + } + *v = int8(in[0]) + return 1, nil + case *uint8: + if len(in) < 1 { + return 0, ErrBufferUnderflow + } + *v = in[0] + return 1, nil + case *int16: + if len(in) < 2 { + return 0, ErrBufferUnderflow + } + *v = int16(leUint16(in[:2])) + return 2, nil + case *uint16: + if len(in) < 2 { + return 0, ErrBufferUnderflow + } + *v = leUint16(in[:2]) + return 2, nil + case *int32: + if len(in) < 4 { + return 0, ErrBufferUnderflow + } + *v = int32(leUint32(in[:4])) + return 4, nil + case *uint32: + if len(in) < 4 { + return 0, ErrBufferUnderflow + } + *v = leUint32(in[:4]) + return 4, nil + case *int64: + if len(in) < 8 { + return 0, ErrBufferUnderflow + } + *v = int64(leUint64(in[:8])) + return 8, nil + case *uint64: + if len(in) < 8 { + return 0, ErrBufferUnderflow + } + *v = leUint64(in[:8]) + return 8, nil + default: + log.Panic("DeserializeAtomic unhandled type") + return 0, nil + } +} + +// SerializeString serializes a string to []byte +func SerializeString(s string) []byte { + v := reflect.ValueOf(s) + size := datasizeWrite(v) + buf := make([]byte, size) + e := &Encoder{ + Buffer: buf, + } + e.value(v) + return buf +} + +// DeserializeString deserializes a string from []byte, returning the string and the number of bytes read +func DeserializeString(in []byte, maxlen int) (string, uint64, error) { + var s string + v := reflect.ValueOf(&s) + v = v.Elem() + + inlen := len(in) + d1 := &Decoder{ + Buffer: make([]byte, inlen), + } + copy(d1.Buffer, in) + + err := d1.value(v, maxlen) + if err != nil { + return "", 0, err + } + + return s, uint64(inlen - len(d1.Buffer)), nil +} + +// DeserializeRaw deserializes `in` buffer into return +// parameter. If `data` is not a Pointer or Map type an error +// is returned. If `in` buffer can't be deserialized, +// an error message is returned. +// Returns number of bytes read if no error. +func DeserializeRaw(in []byte, data interface{}) (uint64, error) { + v := reflect.ValueOf(data) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + case reflect.Map: + default: + return 0, fmt.Errorf("DeserializeRaw value must be a ptr, is %s", v.Kind().String()) + } + + inlen := len(in) + d1 := &Decoder{ + Buffer: make([]byte, inlen), + } + copy(d1.Buffer, in) + + if err := d1.value(v, 0); err != nil { + return 0, err + } + + return uint64(inlen - len(d1.Buffer)), nil +} + +// DeserializeRawExact deserializes `in` buffer into return +// parameter. If `data` is not a Pointer or Map type an error +// is returned. If `in` buffer can't be deserialized, +// an error message is returned. +// Returns number of bytes read if no error. +// If the number of bytes read does not equal the length of the input buffer, +// ErrRemainingBytes is returned. +func DeserializeRawExact(in []byte, data interface{}) error { + n, err := DeserializeRaw(in, data) + if err != nil { + return err + } + if n != uint64(len(in)) { + return ErrRemainingBytes + } + return nil +} + +// DeserializeRawToValue deserializes `in` buffer into +// `dst`'s type and returns the number of bytes used and +// the value of the buffer. If `data` is not either a +// Pointer type an error is returned. +// If `in` buffer can't be deserialized, the number of bytes read and an error message are returned. +func DeserializeRawToValue(in []byte, v reflect.Value) (uint64, error) { + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + case reflect.Map: + default: + return 0, fmt.Errorf("DeserializeRawToValue value must be a ptr, is %s", v.Kind().String()) + } + + inlen := len(in) + d1 := &Decoder{ + Buffer: make([]byte, inlen), + } + copy(d1.Buffer, in) + + err := d1.value(v, 0) + if err != nil { + return 0, err + } + + return uint64(inlen - len(d1.Buffer)), nil +} + +// Serialize returns serialized basic type-based `data` +// parameter. Encoding is reflect-based. Panics if `data` is not serializable. +func Serialize(data interface{}) []byte { + v := reflect.Indirect(reflect.ValueOf(data)) + size := datasizeWrite(v) + buf := make([]byte, size) + e := &Encoder{ + Buffer: buf, + } + e.value(v) + return buf +} + +// Size returns how many bytes would it take to encode the +// value v, which must be a fixed-size value (struct) or a +// slice of fixed-size values, or a pointer to such data. +// Reflect-based encoding is used. +func Size(v interface{}) uint64 { + return datasizeWrite(reflect.Indirect(reflect.ValueOf(v))) +} + +// isEmpty returns true if a value is "empty". +// Only supports Slice, Map and String. +// All other values are never considered empty. +func isEmpty(v reflect.Value) bool { + t := v.Type() + switch t.Kind() { + case reflect.String: + return v.Len() == 0 + case reflect.Map: + return v.IsNil() || v.Len() == 0 + case reflect.Slice: + return v.IsNil() || v.Len() == 0 + default: + return false + } +} + +// datasizeWrite returns the number of bytes the actual data represented by v occupies in memory. +// For compound structures, it sums the sizes of the elements. Thus, for instance, for a slice +// it returns the length of the slice times the element size and does not count the memory +// occupied by the header. +func datasizeWrite(v reflect.Value) uint64 { + t := v.Type() + switch t.Kind() { + case reflect.Interface: + return datasizeWrite(v.Elem()) + + case reflect.Array: + // Arrays are a fixed size, so the length is not written + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8, reflect.Int8: + return uint64(v.Len()) + case reflect.Uint16, reflect.Int16: + return uint64(v.Len()) * 2 + case reflect.Uint32, reflect.Int32, reflect.Float32: + return uint64(v.Len()) * 4 + case reflect.Uint64, reflect.Int64, reflect.Float64: + return uint64(v.Len()) * 8 + default: + size := uint64(0) + for i := 0; i < v.Len(); i++ { + elem := v.Index(i) + s := datasizeWrite(elem) + size += s + } + return size + } + + case reflect.Slice: + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8, reflect.Int8: + return 4 + uint64(v.Len()) + case reflect.Uint16, reflect.Int16: + return 4 + uint64(v.Len())*2 + case reflect.Uint32, reflect.Int32, reflect.Float32: + return 4 + uint64(v.Len())*4 + case reflect.Uint64, reflect.Int64, reflect.Float64: + return 4 + uint64(v.Len())*8 + default: + size := uint64(0) + for i := 0; i < v.Len(); i++ { + elem := v.Index(i) + s := datasizeWrite(elem) + size += s + } + return 4 + size + } + + case reflect.Map: + // length prefix + size := uint64(4) + for _, key := range v.MapKeys() { + s := datasizeWrite(key) + size += s + elem := v.MapIndex(key) + s = datasizeWrite(elem) + size += s + } + return size + + case reflect.Struct: + sum := uint64(0) + nFields := t.NumField() + for i, n := 0, nFields; i < n; i++ { + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag := ff.Tag.Get("enc") + omitempty := TagOmitempty(tag) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if len(tag) > 0 && tag[0] == '-' { + continue + } + + fv := v.Field(i) + if !omitempty || !isEmpty(fv) { + s := datasizeWrite(fv) + sum += s + } + } + return sum + + case reflect.Bool: + return 1 + + case reflect.String: + return 4 + uint64(v.Len()) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Float32, reflect.Float64: + return uint64(t.Size()) + + default: + log.Panicf("invalid type %s", t.String()) + return 0 + } +} + +// TagOmitempty returns true if the tag specifies omitempty +func TagOmitempty(tag string) bool { + return strings.Contains(tag, ",omitempty") +} + +func tagName(tag string) string { //nolint:deadcode,megacheck + commaIndex := strings.Index(tag, ",") + if commaIndex == -1 { + return tag + } + + return tag[:commaIndex] +} + +// TagMaxLen returns the maxlen value tagged on a struct. Returns 0 if no tag is present. +func TagMaxLen(tag string) int { + maxlenIndex := strings.Index(tag, ",maxlen=") + if maxlenIndex == -1 { + return 0 + } + + maxlenRem := tag[maxlenIndex+len(",maxlen="):] + commaIndex := strings.Index(maxlenRem, ",") + if commaIndex != -1 { + maxlenRem = maxlenRem[:commaIndex] + } + + maxlen, err := strconv.Atoi(maxlenRem) + if err != nil { + panic("maxlen must be a number") + } + + return maxlen +} + +/* + Internals +*/ + +func leUint16(b []byte) uint16 { return uint16(b[0]) | uint16(b[1])<<8 } + +func lePutUint16(b []byte, v uint16) { + b[0] = byte(v) + b[1] = byte(v >> 8) +} + +func leUint32(b []byte) uint32 { + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 +} + +func lePutUint32(b []byte, v uint32) { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) +} + +func leUint64(b []byte) uint64 { + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 +} + +func lePutUint64(b []byte, v uint64) { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + b[4] = byte(v >> 32) + b[5] = byte(v >> 40) + b[6] = byte(v >> 48) + b[7] = byte(v >> 56) +} + +// Decoder decodes an object from the skycoin binary encoding format +type Decoder struct { + Buffer []byte +} + +// Encoder encodes an object to the skycoin binary encoding format +type Encoder struct { + Buffer []byte +} + +// Bool decodes bool +func (d *Decoder) Bool() (bool, error) { + if len(d.Buffer) < 1 { + return false, ErrBufferUnderflow + } + x := d.Buffer[0] + d.Buffer = d.Buffer[1:] // advance slice + + switch x { + case 0: + return false, nil + case 1: + return true, nil + default: + return false, ErrInvalidBool + } +} + +// Bool encodes bool +func (e *Encoder) Bool(x bool) { + if x { + e.Buffer[0] = 1 + } else { + e.Buffer[0] = 0 + } + e.Buffer = e.Buffer[1:] +} + +// Uint8 decodes uint8 +func (d *Decoder) Uint8() (uint8, error) { + if len(d.Buffer) < 1 { + return 0, ErrBufferUnderflow + } + + x := d.Buffer[0] + d.Buffer = d.Buffer[1:] // advance slice + return x, nil +} + +// Uint8 encodes uint8 +func (e *Encoder) Uint8(x uint8) { + e.Buffer[0] = x + e.Buffer = e.Buffer[1:] +} + +// Uint16 decodes uint16 +func (d *Decoder) Uint16() (uint16, error) { + if len(d.Buffer) < 2 { + return 0, ErrBufferUnderflow + } + + x := leUint16(d.Buffer[0:2]) + d.Buffer = d.Buffer[2:] + return x, nil +} + +// Uint16 encodes uint16 +func (e *Encoder) Uint16(x uint16) { + lePutUint16(e.Buffer[0:2], x) + e.Buffer = e.Buffer[2:] +} + +// Uint32 decodes a Uint32 +func (d *Decoder) Uint32() (uint32, error) { + if len(d.Buffer) < 4 { + return 0, ErrBufferUnderflow + } + + x := leUint32(d.Buffer[0:4]) + d.Buffer = d.Buffer[4:] + return x, nil +} + +// Uint32 encodes a Uint32 +func (e *Encoder) Uint32(x uint32) { + lePutUint32(e.Buffer[0:4], x) + e.Buffer = e.Buffer[4:] +} + +// Uint64 decodes uint64 +func (d *Decoder) Uint64() (uint64, error) { + if len(d.Buffer) < 8 { + return 0, ErrBufferUnderflow + } + + x := leUint64(d.Buffer[0:8]) + d.Buffer = d.Buffer[8:] + return x, nil +} + +// Uint64 encodes uint64 +func (e *Encoder) Uint64(x uint64) { + lePutUint64(e.Buffer[0:8], x) + e.Buffer = e.Buffer[8:] +} + +// ByteSlice encodes []byte +func (e *Encoder) ByteSlice(x []byte) { + e.Uint32(uint32(len(x))) + e.CopyBytes(x) +} + +// CopyBytes copies bytes to the buffer, without a length prefix +func (e *Encoder) CopyBytes(x []byte) { + if len(x) == 0 { + return + } + copy(e.Buffer, x) + e.Buffer = e.Buffer[len(x):] +} + +// Int8 decodes int8 +func (d *Decoder) Int8() (int8, error) { + u, err := d.Uint8() + if err != nil { + return 0, err + } + + return int8(u), nil +} + +// Int8 encodes int8 +func (e *Encoder) Int8(x int8) { + e.Uint8(uint8(x)) +} + +// Int16 decodes int16 +func (d *Decoder) Int16() (int16, error) { + u, err := d.Uint16() + if err != nil { + return 0, err + } + + return int16(u), nil +} + +// Int16 encodes int16 +func (e *Encoder) Int16(x int16) { + e.Uint16(uint16(x)) +} + +// Int32 decodes int32 +func (d *Decoder) Int32() (int32, error) { + u, err := d.Uint32() + if err != nil { + return 0, err + } + + return int32(u), nil +} + +// Int32 encodes int32 +func (e *Encoder) Int32(x int32) { + e.Uint32(uint32(x)) +} + +// Int64 decodes int64 +func (d *Decoder) Int64() (int64, error) { + u, err := d.Uint64() + if err != nil { + return 0, err + } + + return int64(u), nil +} + +// Int64 encodes int64 +func (e *Encoder) Int64(x int64) { + e.Uint64(uint64(x)) +} + +func (d *Decoder) value(v reflect.Value, maxlen int) error { + kind := v.Kind() + switch kind { + case reflect.Array: + + t := v.Type() + elem := t.Elem() + + // Arrays are a fixed size, so the length is not written + length := v.Len() + + switch elem.Kind() { + case reflect.Uint8: + if length > len(d.Buffer) { + return ErrBufferUnderflow + } + + reflect.Copy(v, reflect.ValueOf(d.Buffer[:length])) + d.Buffer = d.Buffer[length:] + default: + for i := 0; i < length; i++ { + if err := d.value(v.Index(i), 0); err != nil { + return err + } + } + } + + case reflect.Map: + ul, err := d.Uint32() + if err != nil { + return err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return ErrBufferUnderflow + } + + if length == 0 { + return nil + } + + t := v.Type() + key := t.Key() + elem := t.Elem() + + if v.IsNil() { + v.Set(reflect.Indirect(reflect.MakeMap(t))) + } + + for i := 0; i < length; i++ { + keyv := reflect.Indirect(reflect.New(key)) + elemv := reflect.Indirect(reflect.New(elem)) + if err := d.value(keyv, 0); err != nil { + return err + } + if err := d.value(elemv, 0); err != nil { + return err + } + v.SetMapIndex(keyv, elemv) + } + + if v.Len() != length { + return ErrMapDuplicateKeys + } + + case reflect.Slice: + ul, err := d.Uint32() + if err != nil { + return err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return ErrBufferUnderflow + } + + if length == 0 { + return nil + } + + if maxlen > 0 && length > maxlen { + return ErrMaxLenExceeded + } + + t := v.Type() + elem := t.Elem() + + switch elem.Kind() { + case reflect.Uint8: + v.SetBytes(d.Buffer[:length]) + d.Buffer = d.Buffer[length:] + default: + elemvs := reflect.MakeSlice(t, length, length) + for i := 0; i < length; i++ { + elemv := reflect.Indirect(elemvs.Index(i)) + if err := d.value(elemv, 0); err != nil { + return err + } + } + v.Set(elemvs) + } + + case reflect.Struct: + t := v.Type() + nFields := v.NumField() + for i := 0; i < nFields; i++ { + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag := ff.Tag.Get("enc") + omitempty := TagOmitempty(tag) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if len(tag) > 0 && tag[0] == '-' { + continue + } + + fv := v.Field(i) + if fv.CanSet() && ff.Name != "_" { + maxlen := TagMaxLen(tag) + + if err := d.value(fv, maxlen); err != nil { + if err == ErrMaxLenExceeded { + return err + } + + // omitempty fields at the end of the buffer are ignored if missing + if !omitempty || len(d.Buffer) != 0 { + return err + } + } + } + } + + case reflect.String: + ul, err := d.Uint32() + if err != nil { + return err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return ErrBufferUnderflow + } + + if maxlen > 0 && length > maxlen { + return ErrMaxLenExceeded + } + + v.SetString(string(d.Buffer[:length])) + d.Buffer = d.Buffer[length:] + + case reflect.Bool: + b, err := d.Bool() + if err != nil { + return err + } + v.SetBool(b) + case reflect.Int8: + i, err := d.Int8() + if err != nil { + return err + } + v.SetInt(int64(i)) + case reflect.Int16: + i, err := d.Int16() + if err != nil { + return err + } + v.SetInt(int64(i)) + case reflect.Int32: + i, err := d.Int32() + if err != nil { + return err + } + v.SetInt(int64(i)) + case reflect.Int64: + i, err := d.Int64() + if err != nil { + return err + } + v.SetInt(i) + + case reflect.Uint8: + u, err := d.Uint8() + if err != nil { + return err + } + v.SetUint(uint64(u)) + case reflect.Uint16: + u, err := d.Uint16() + if err != nil { + return err + } + v.SetUint(uint64(u)) + case reflect.Uint32: + u, err := d.Uint32() + if err != nil { + return err + } + v.SetUint(uint64(u)) + case reflect.Uint64: + u, err := d.Uint64() + if err != nil { + return err + } + v.SetUint(u) + + case reflect.Float32: + u, err := d.Uint32() + if err != nil { + return err + } + v.SetFloat(float64(math.Float32frombits(u))) + case reflect.Float64: + u, err := d.Uint64() + if err != nil { + return err + } + v.SetFloat(math.Float64frombits(u)) + + default: + log.Panicf("Decode error: kind %s not handled", v.Kind().String()) + } + + return nil +} + +func (e *Encoder) value(v reflect.Value) { + switch v.Kind() { + case reflect.Interface: + e.value(v.Elem()) + + case reflect.Array: + // Arrays are a fixed size, so the length is not written + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8: + reflect.Copy(reflect.ValueOf(e.Buffer), v) + e.Buffer = e.Buffer[v.Len():] + default: + for i := 0; i < v.Len(); i++ { + e.value(v.Index(i)) + } + } + + case reflect.Slice: + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8: + e.ByteSlice(v.Bytes()) + default: + e.Uint32(uint32(v.Len())) + for i := 0; i < v.Len(); i++ { + e.value(v.Index(i)) + } + } + + case reflect.Map: + e.Uint32(uint32(v.Len())) + for _, key := range v.MapKeys() { + e.value(key) + e.value(v.MapIndex(key)) + } + + case reflect.Struct: + t := v.Type() + nFields := v.NumField() + for i := 0; i < nFields; i++ { + // see comment for corresponding code in Decoder.value() + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag := ff.Tag.Get("enc") + omitempty := TagOmitempty(tag) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if len(tag) > 0 && tag[0] == '-' { + continue + } + + fv := v.Field(i) + if !(omitempty && isEmpty(fv)) && (fv.CanSet() || ff.Name != "_") { + e.value(fv) + } + } + + case reflect.Bool: + e.Bool(v.Bool()) + + case reflect.String: + e.ByteSlice([]byte(v.String())) + + case reflect.Int8: + e.Int8(int8(v.Int())) + case reflect.Int16: + e.Int16(int16(v.Int())) + case reflect.Int32: + e.Int32(int32(v.Int())) + case reflect.Int64: + e.Int64(v.Int()) + + case reflect.Uint8: + e.Uint8(uint8(v.Uint())) + case reflect.Uint16: + e.Uint16(uint16(v.Uint())) + case reflect.Uint32: + e.Uint32(uint32(v.Uint())) + case reflect.Uint64: + e.Uint64(v.Uint()) + + case reflect.Float32: + e.Uint32(math.Float32bits(float32(v.Float()))) + case reflect.Float64: + e.Uint64(math.Float64bits(v.Float())) + + default: + log.Panicf("Encoding unhandled type %s", v.Type().Name()) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go b/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go new file mode 100644 index 0000000000..7fe6238e9c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go @@ -0,0 +1,171 @@ +/* +Package encrypt provides encryption methods. + +Encryption methods provided: + +* chacha20-poly1305 with scrypt key derivation +* sha256xor with sha256 key derivation + +The latter is insecure due to the insecure key derivation so should not be used. +The keys are easily brute forced. + +These methods are design for long-term (3-5 years) encryption of disk-persisted data. +They are not designed for network traffic encryption. +*/ +package encrypt + +import ( + "encoding/base64" + "encoding/binary" + "encoding/json" + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/chacha20poly1305" + "github.com/skycoin/skycoin/src/cipher/scrypt" +) + +const ( + scryptChacha20MetaLengthSize = 2 // meta data length field size in bytes + scryptChacha20SaltSize = 32 // salt bytes number +) + +// Default scrypt paramenters +const ( + // ScryptN: scrypt N paramenter. 1<<20 is the recommended value for file encryption, it takes about 3 seconds in 2.9 GHz Intel core i7. + ScryptN = 1 << 20 + // ScryptR: scrypt r paramenter. Cache line size have not significantly increased since 2009, 8 should still be optimal for r. + ScryptR = 8 + // ScryptP: scrypt p paramenter. The parallel difficulty, 1 is still optimal. + ScryptP = 1 + // ScryptKeyLen: The length of returned byte slice that can be used as cryptographic key. + ScryptKeyLen = 32 +) + +// DefaultScryptChacha20poly1305 default ScryptChacha20poly1305 encryptor +var DefaultScryptChacha20poly1305 = ScryptChacha20poly1305{ + N: ScryptN, + R: ScryptR, + P: ScryptP, + KeyLen: ScryptKeyLen, +} + +// ScryptChacha20poly1305 provides methods for encryption/decryption with scrypt and chacha20poly1305 +type ScryptChacha20poly1305 struct { + N int + R int + P int + KeyLen int +} + +type meta struct { + N int `json:"n"` + R int `json:"r"` + P int `json:"p"` + KeyLen int `json:"keyLen"` + Salt []byte `json:"salt"` + Nonce []byte `json:"nonce"` +} + +// Encrypt encrypts data with password, +// 1. Scrypt derives the key from password +// 2. Chacha20poly1305 generates AEAD from the derived key +// 4. Puts scrypt paramenters, salt and nonce into metadata, json serialize it and get the serialized metadata length +// 5. AEAD.Seal encrypts the data, and use [length][metadata] as additional data +// 6. Final format: base64([[length][metadata]][ciphertext]), length is 2 bytes. +func (s ScryptChacha20poly1305) Encrypt(data, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, errors.New("missing password") + } + + // Scyrpt derives key from password + salt := cipher.RandByte(scryptChacha20SaltSize) + dk, err := scrypt.Key(password, salt, s.N, s.R, s.P, s.KeyLen) + if err != nil { + return nil, err + } + + // Prepare metadata + m := meta{ + N: s.N, + R: s.R, + P: s.P, + KeyLen: s.KeyLen, + Salt: salt, + Nonce: cipher.RandByte(chacha20poly1305.NonceSize), + } + // json serialize the metadata + ms, err := json.Marshal(m) + if err != nil { + return nil, err + } + + if len(ms) > math.MaxUint16 { + return nil, errors.New("metadata length beyond the math.MaxUint16") + } + + length := make([]byte, scryptChacha20MetaLengthSize) + binary.LittleEndian.PutUint16(length, uint16(len(ms))) + + // Additional data for AEAD + ad := append(length, ms...) + aead, err := chacha20poly1305.New(dk) + if err != nil { + return nil, err + } + + ciphertext := aead.Seal(nil, m.Nonce, data, ad) + + // Base64 encode the [[length][metadata]][ciphertext] + rawData := append(ad, ciphertext...) + enc := base64.StdEncoding + buf := make([]byte, enc.EncodedLen(len(rawData))) + enc.Encode(buf, rawData) + return buf, nil +} + +// Decrypt decrypts the data with password +// 1. Base64 decodes the data +// 2. Reads the first [metaLengthSize] bytes data to get the metadata length, and reads out the metadata. +// 3. Scrypt derives key from password and paramenters in metadata +// 4. Chacha20poly1305 geneates AEAD +// 5. AEAD decrypts ciphertext with nonce in metadata and [length][metadata] as additional data. +func (s ScryptChacha20poly1305) Decrypt(data, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, errors.New("missing password") + } + + enc := base64.StdEncoding + encData := make([]byte, enc.DecodedLen(len(data))) + n, err := enc.Decode(encData, data) + if err != nil { + return nil, err + } + encData = encData[:n] + + length := binary.LittleEndian.Uint16(encData[:scryptChacha20MetaLengthSize]) + if int(scryptChacha20MetaLengthSize+length) > len(encData) { + return nil, errors.New("invalid metadata length") + } + + var m meta + if err := json.Unmarshal(encData[scryptChacha20MetaLengthSize:scryptChacha20MetaLengthSize+length], &m); err != nil { + return nil, err + } + + ad := encData[:scryptChacha20MetaLengthSize+length] + // Scrypt derives key + dk, err := scrypt.Key(password, m.Salt, m.N, m.R, m.P, m.KeyLen) + if err != nil { + return nil, err + } + + // Geneates AEAD + aead, err := chacha20poly1305.New(dk) + if err != nil { + return nil, err + } + + return aead.Open(nil, m.Nonce, encData[scryptChacha20MetaLengthSize+length:], ad) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/sha256xor.go b/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/sha256xor.go new file mode 100644 index 0000000000..7a9af96f5a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/sha256xor.go @@ -0,0 +1,261 @@ +package encrypt + +import ( + "bytes" + "encoding/base64" + "encoding/binary" + "errors" + "fmt" + "io" + "math" + + "github.com/skycoin/skycoin/src/cipher" + secp256k1 "github.com/skycoin/skycoin/src/cipher/secp256k1-go" +) + +const ( + // Data size of each block + sha256XorBlockSize = 32 // 32 bytes + // Nonce data size + sha256XorNonceSize = 32 // 32 bytes + // Checksum data size + sha256XorChecksumSize = 32 // 32 bytes + // Data length size + sha256XorDataLengthSize = 4 // 4 bytes + +) + +// Error definition +var ( + ErrMissingPassword = errors.New("missing password") + ErrDataTooLarge = errors.New("data length overflowed, it must <= math.MaxUint32(4294967295)") + ErrInvalidChecksumLength = errors.New("invalid checksum length") + ErrInvalidChecksum = errors.New("invalid data, checksum is not matched") + ErrInvalidNonceLength = errors.New("invalid nonce length") + ErrInvalidBlockSize = errors.New("invalid block size, must be multiple of 32 bytes") + ErrReadDataHashFailed = errors.New("read data hash failed: read length != 32") + ErrInvalidPassword = errors.New("invalid password") + ErrReadDataLengthFailed = errors.New("read data length failed") + ErrInvalidDataLength = errors.New("invalid data length") +) + +// DefaultSha256Xor default sha256xor encryptor +var DefaultSha256Xor = Sha256Xor{} + +// Sha256Xor provides methods to do encryption and decryption +type Sha256Xor struct{} + +// Encrypt encrypts the data with password +// +// 1> Add 32 bits length prefix to indicate the length of data. +// 2> Pad the length + data to 32 bytes with nulls at end +// 2> SHA256() and prefix the hash. +// 3> Split the whole data(hash+length+data+padding) into 256 bits(32 bytes) blocks +// 4> Each block is encrypted by XORing the unencrypted block with SHA256(SHA256(password), SHA256(index, SHA256(nonce)) +// - index is 0 for the first block of 32 bytes, 1 for the second block of 32 bytes, 2 for third block +// +// 5> Prefix nonce and SHA256 the nonce with blocks to get checksum, and prefix the checksum +// 6> Finally, the data format is: base64() +func (s Sha256Xor) Encrypt(data []byte, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, ErrMissingPassword + } + + if uint(len(data)) > math.MaxUint32 { + return nil, ErrDataTooLarge + } + + // Sets data length prefix + dataLenBytes := make([]byte, sha256XorDataLengthSize) + binary.LittleEndian.PutUint32(dataLenBytes, uint32(len(data))) + + // Prefixes data with length + ldata := append(dataLenBytes, data...) + + // Pads length + data with null to 32 bytes + l := len(ldata) // hash + length + data + n := l / sha256XorBlockSize + m := l % sha256XorBlockSize + if m > 0 { + paddingNull := make([]byte, sha256XorBlockSize-m) + ldata = append(ldata, paddingNull...) + n++ + } + + // Hash(length+data+padding) + dataHash := cipher.SumSHA256(ldata) + + // Initialize blocks with data hash + blocks := []cipher.SHA256{dataHash} + for i := 0; i < n; i++ { + var b cipher.SHA256 + copy(b[:], ldata[i*sha256XorBlockSize:(i+1)*sha256XorBlockSize]) + blocks = append(blocks, b) + } + + // Generates a nonce + nonce := cipher.RandByte(sha256XorNonceSize) + // Hash the nonce + hashNonce := cipher.SumSHA256(nonce) + // Derives key by secp256k1 hashing password + key := secp256k1.Secp256k1Hash(password) + + var encryptedData []byte + // Encodes the blocks + for i := range blocks { + // Hash(password, hash(index, hash(nonce))) + h := hashKeyIndexNonce(key, int64(i), hashNonce) + encryptedHash := blocks[i].Xor(h) + encryptedData = append(encryptedData, encryptedHash[:]...) + } + + // Prefix the nonce + nonceAndDataBytes := append(nonce, encryptedData...) + // Calculates the checksum + checkSum := cipher.SumSHA256(nonceAndDataBytes) + + finalData := append(checkSum[:], nonceAndDataBytes...) + + // Base64 encodes the data + enc := base64.StdEncoding + buf := make([]byte, enc.EncodedLen(len(finalData))) + enc.Encode(buf, finalData) + return buf, nil +} + +// Decrypt decrypts the data +func (s Sha256Xor) Decrypt(data []byte, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, ErrMissingPassword + } + + // Base64 decodes data + enc := base64.StdEncoding + encData := make([]byte, enc.DecodedLen(len(data))) + n, err := enc.Decode(encData, data) + if err != nil { + return nil, err + } + + encData = encData[:n] + + // Derives key by secp256k1 hashing password + key := secp256k1.Secp256k1Hash(password) + + buf := bytes.NewBuffer(encData) + + // Gets checksum + var checkSum cipher.SHA256 + n, err = buf.Read(checkSum[:]) + if err != nil { + return nil, err + } + + if n != sha256XorChecksumSize { + return nil, ErrInvalidChecksumLength + } + + // Checks the checksum + csh := cipher.SumSHA256(buf.Bytes()) + if csh != checkSum { + return nil, ErrInvalidChecksum + } + + // Gets the nonce + nonce := make([]byte, sha256XorNonceSize) + n, err = buf.Read(nonce) + if err != nil { + return nil, err + } + + if n != sha256XorNonceSize { + return nil, ErrInvalidNonceLength + } + + var decodeData []byte + hashNonce := cipher.SumSHA256(nonce) + i := 0 + for { + var block cipher.SHA256 + n, err := buf.Read(block[:]) + if err == io.EOF { + break + } + + if n != sha256XorBlockSize { + return nil, ErrInvalidBlockSize + } + + // Decodes the block + dataHash := block.Xor(hashKeyIndexNonce(key, int64(i), hashNonce)) + decodeData = append(decodeData, dataHash[:]...) + i++ + } + + buf = bytes.NewBuffer(decodeData) + + // Gets the hash + var dataHash cipher.SHA256 + n, err = buf.Read(dataHash[:]) + if err != nil { + return nil, fmt.Errorf("read data hash failed: %v", err) + } + + if n != 32 { + return nil, ErrReadDataHashFailed + } + + // Checks the hash + if dataHash != cipher.SumSHA256(buf.Bytes()) { + return nil, ErrInvalidPassword + } + + // Reads out the data length + dataLenBytes := make([]byte, sha256XorDataLengthSize) + n, err = buf.Read(dataLenBytes) + if err != nil { + return nil, err + } + + if n != sha256XorDataLengthSize { + return nil, ErrReadDataLengthFailed + } + + l := binary.LittleEndian.Uint32(dataLenBytes) + + if uint64(buf.Len()) > math.MaxUint32 { + return nil, ErrDataTooLarge + } + + if l > uint32(buf.Len()) { + return nil, ErrInvalidDataLength + } + + // Reads out the raw data + rawData := make([]byte, l) + n, err = buf.Read(rawData) + if err != nil { + return nil, err + } + + if uint32(n) != l { + return nil, fmt.Errorf("read data failed, expect %d bytes, but get %d bytes", l, n) + } + + return rawData, nil +} + +// hash(password, hash(index, hash(nonce))) +func hashKeyIndexNonce(key []byte, index int64, nonceHash cipher.SHA256) cipher.SHA256 { + // convert index to 256bit number + indexBytes := make([]byte, 32) + binary.PutVarint(indexBytes, index) + + // hash(index, nonceHash) + indexNonceHash := cipher.SumSHA256(append(indexBytes, nonceHash[:]...)) + + // hash(hash(password), indexNonceHash) + var keyHash cipher.SHA256 + copy(keyHash[:], key[:]) + return cipher.AddSHA256(keyHash, indexNonceHash) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/pbkdf2/pbkdf2.go b/vendor/github.com/skycoin/skycoin/src/cipher/pbkdf2/pbkdf2.go new file mode 100644 index 0000000000..4cdaca7dfc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/pbkdf2/pbkdf2.go @@ -0,0 +1,77 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package pbkdf2 implements the key derivation function PBKDF2 as defined in RFC +2898 / PKCS #5 v2.0. + +A key derivation function is useful when encrypting data based on a password +or any other not-fully-random data. It uses a pseudorandom function to derive +a secure encryption key based on the password. + +While v2.0 of the standard defines only one pseudorandom function to use, +HMAC-SHA1, the drafted v2.1 specification allows use of all five FIPS Approved +Hash Functions SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512 for HMAC. To +choose, you can pass the `New` functions from the different SHA packages to +pbkdf2.Key. +*/ +package pbkdf2 // import "github.com/skycoin/skycoin/src/cipher/pbkdf2" + +import ( + "crypto/hmac" + "hash" +) + +// Key derives a key from the password, salt and iteration count, returning a +// []byte of length keylen that can be used as cryptographic key. The key is +// derived based on the method described as PBKDF2 with the HMAC variant using +// the supplied hash function. +// +// For example, to use a HMAC-SHA-1 based PBKDF2 key derivation function, you +// can get a derived key for e.g. AES-256 (which needs a 32-byte key) by +// doing: +// +// dk := pbkdf2.Key([]byte("some password"), salt, 4096, 32, sha1.New) +// +// Remember to get a good random salt. At least 8 bytes is recommended by the +// RFC. +// +// Using a higher iteration count will increase the cost of an exhaustive +// search but will also make derivation proportionally slower. +func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { + prf := hmac.New(h, password) + hashLen := prf.Size() + numBlocks := (keyLen + hashLen - 1) / hashLen + + var buf [4]byte + dk := make([]byte, 0, numBlocks*hashLen) + U := make([]byte, hashLen) + for block := 1; block <= numBlocks; block++ { + // N.B.: || means concatenation, ^ means XOR + // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter + // U_1 = PRF(password, salt || uint(i)) + prf.Reset() + prf.Write(salt) //nolint:errcheck,gosec + buf[0] = byte(block >> 24) + buf[1] = byte(block >> 16) + buf[2] = byte(block >> 8) + buf[3] = byte(block) + prf.Write(buf[:4]) //nolint:errcheck,gosec + dk = prf.Sum(dk) + T := dk[len(dk)-hashLen:] + copy(U, T) + + // U_n = PRF(password, U_(n-1)) + for n := 2; n <= iter; n++ { + prf.Reset() + prf.Write(U) //nolint:errcheck,gosec + U = U[:0] + U = prf.Sum(U) + for x := range U { + T[x] ^= U[x] + } + } + } + return dk[:keyLen] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/poly1305.go b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/poly1305.go new file mode 100644 index 0000000000..e7a594571a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/poly1305.go @@ -0,0 +1,32 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package poly1305 implements Poly1305 one-time message authentication code as specified in http://cr.yp.to/mac/poly1305-20050329.pdf. + +Poly1305 is a fast, one-time authentication function. It is infeasible for an +attacker to generate an authenticator for a message without the key. However, a +key must only be used for a single message. Authenticating two different +messages with the same key allows an attacker to forge authenticators for other +messages with the same key. + +Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was +used with a fixed key in order to generate one-time keys from an nonce. +However, in this package AES isn't used and the one-time key is specified +directly. +*/ +package poly1305 // import "github.com/skycoin/skycoin/src/cipher/poly1305" + +import "crypto/subtle" + +// TagSize is the size, in bytes, of a poly1305 authenticator. +const TagSize = 16 + +// Verify returns true if mac is a valid authenticator for m with the given +// key. +func Verify(mac *[16]byte, m []byte, key *[32]byte) bool { + var tmp [16]byte + Sum(&tmp, m, key) + return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1 +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.go b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.go new file mode 100644 index 0000000000..92b304e26a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.go @@ -0,0 +1,24 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build amd64 && !gccgo && !appengine +// +build amd64,!gccgo,!appengine + +package poly1305 + +// This function is implemented in sum_amd64.s +// +//go:noescape +func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]byte) + +// Sum generates an authenticator for m using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + var mPtr *byte + if len(m) > 0 { + mPtr = &m[0] + } + poly1305(out, mPtr, uint64(len(m)), key) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.s b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.s new file mode 100644 index 0000000000..2edae63828 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.s @@ -0,0 +1,125 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,!gccgo,!appengine + +#include "textflag.h" + +#define POLY1305_ADD(msg, h0, h1, h2) \ + ADDQ 0(msg), h0; \ + ADCQ 8(msg), h1; \ + ADCQ $1, h2; \ + LEAQ 16(msg), msg + +#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \ + MOVQ r0, AX; \ + MULQ h0; \ + MOVQ AX, t0; \ + MOVQ DX, t1; \ + MOVQ r0, AX; \ + MULQ h1; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ r0, t2; \ + IMULQ h2, t2; \ + ADDQ DX, t2; \ + \ + MOVQ r1, AX; \ + MULQ h0; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ DX, h0; \ + MOVQ r1, t3; \ + IMULQ h2, t3; \ + MOVQ r1, AX; \ + MULQ h1; \ + ADDQ AX, t2; \ + ADCQ DX, t3; \ + ADDQ h0, t2; \ + ADCQ $0, t3; \ + \ + MOVQ t0, h0; \ + MOVQ t1, h1; \ + MOVQ t2, h2; \ + ANDQ $3, h2; \ + MOVQ t2, t0; \ + ANDQ $0xFFFFFFFFFFFFFFFC, t0; \ + ADDQ t0, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2; \ + SHRQ $2, t3, t2; \ + SHRQ $2, t3; \ + ADDQ t2, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2 + +DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +GLOBL ·poly1305Mask<>(SB), RODATA, $16 + +// func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]key) +TEXT ·poly1305(SB), $0-32 + MOVQ out+0(FP), DI + MOVQ m+8(FP), SI + MOVQ mlen+16(FP), R15 + MOVQ key+24(FP), AX + + MOVQ 0(AX), R11 + MOVQ 8(AX), R12 + ANDQ ·poly1305Mask<>(SB), R11 // r0 + ANDQ ·poly1305Mask<>+8(SB), R12 // r1 + XORQ R8, R8 // h0 + XORQ R9, R9 // h1 + XORQ R10, R10 // h2 + + CMPQ R15, $16 + JB bytes_between_0_and_15 + +loop: + POLY1305_ADD(SI, R8, R9, R10) + +multiply: + POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14) + SUBQ $16, R15 + CMPQ R15, $16 + JAE loop + +bytes_between_0_and_15: + TESTQ R15, R15 + JZ done + MOVQ $1, BX + XORQ CX, CX + XORQ R13, R13 + ADDQ R15, SI + +flush_buffer: + SHLQ $8, BX, CX + SHLQ $8, BX + MOVB -1(SI), R13 + XORQ R13, BX + DECQ SI + DECQ R15 + JNZ flush_buffer + + ADDQ BX, R8 + ADCQ CX, R9 + ADCQ $0, R10 + MOVQ $16, R15 + JMP multiply + +done: + MOVQ R8, AX + MOVQ R9, BX + SUBQ $0xFFFFFFFFFFFFFFFB, AX + SBBQ $0xFFFFFFFFFFFFFFFF, BX + SBBQ $3, R10 + CMOVQCS R8, AX + CMOVQCS R9, BX + MOVQ key+24(FP), R8 + ADDQ 16(R8), AX + ADCQ 24(R8), BX + + MOVQ AX, 0(DI) + MOVQ BX, 8(DI) + RET diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.go b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.go new file mode 100644 index 0000000000..6618d19adf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.go @@ -0,0 +1,24 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build arm && !gccgo && !appengine && !nacl +// +build arm,!gccgo,!appengine,!nacl + +package poly1305 + +// This function is implemented in sum_arm.s +// +//go:noescape +func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte) + +// Sum generates an authenticator for m using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + var mPtr *byte + if len(m) > 0 { + mPtr = &m[0] + } + poly1305_auth_armv6(out, mPtr, uint32(len(m)), key) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.s b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.s new file mode 100644 index 0000000000..f70b4ac484 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.s @@ -0,0 +1,427 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,!gccgo,!appengine,!nacl + +#include "textflag.h" + +// This code was translated into a form compatible with 5a from the public +// domain source by Andrew Moon: github.com/floodyberry/poly1305-opt/blob/master/app/extensions/poly1305. + +DATA ·poly1305_init_constants_armv6<>+0x00(SB)/4, $0x3ffffff +DATA ·poly1305_init_constants_armv6<>+0x04(SB)/4, $0x3ffff03 +DATA ·poly1305_init_constants_armv6<>+0x08(SB)/4, $0x3ffc0ff +DATA ·poly1305_init_constants_armv6<>+0x0c(SB)/4, $0x3f03fff +DATA ·poly1305_init_constants_armv6<>+0x10(SB)/4, $0x00fffff +GLOBL ·poly1305_init_constants_armv6<>(SB), 8, $20 + +// Warning: the linker may use R11 to synthesize certain instructions. Please +// take care and verify that no synthetic instructions use it. + +TEXT poly1305_init_ext_armv6<>(SB), NOSPLIT, $0 + // Needs 16 bytes of stack and 64 bytes of space pointed to by R0. (It + // might look like it's only 60 bytes of space but the final four bytes + // will be written by another function.) We need to skip over four + // bytes of stack because that's saving the value of 'g'. + ADD $4, R13, R8 + MOVM.IB [R4-R7], (R8) + MOVM.IA.W (R1), [R2-R5] + MOVW $·poly1305_init_constants_armv6<>(SB), R7 + MOVW R2, R8 + MOVW R2>>26, R9 + MOVW R3>>20, g + MOVW R4>>14, R11 + MOVW R5>>8, R12 + ORR R3<<6, R9, R9 + ORR R4<<12, g, g + ORR R5<<18, R11, R11 + MOVM.IA (R7), [R2-R6] + AND R8, R2, R2 + AND R9, R3, R3 + AND g, R4, R4 + AND R11, R5, R5 + AND R12, R6, R6 + MOVM.IA.W [R2-R6], (R0) + EOR R2, R2, R2 + EOR R3, R3, R3 + EOR R4, R4, R4 + EOR R5, R5, R5 + EOR R6, R6, R6 + MOVM.IA.W [R2-R6], (R0) + MOVM.IA.W (R1), [R2-R5] + MOVM.IA [R2-R6], (R0) + ADD $20, R13, R0 + MOVM.DA (R0), [R4-R7] + RET + +#define MOVW_UNALIGNED(Rsrc, Rdst, Rtmp, offset) \ + MOVBU (offset+0)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+0)(Rdst); \ + MOVBU (offset+1)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+1)(Rdst); \ + MOVBU (offset+2)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+2)(Rdst); \ + MOVBU (offset+3)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+3)(Rdst) + +TEXT poly1305_blocks_armv6<>(SB), NOSPLIT, $0 + // Needs 24 bytes of stack for saved registers and then 88 bytes of + // scratch space after that. We assume that 24 bytes at (R13) have + // already been used: four bytes for the link register saved in the + // prelude of poly1305_auth_armv6, four bytes for saving the value of g + // in that function and 16 bytes of scratch space used around + // poly1305_finish_ext_armv6_skip1. + ADD $24, R13, R12 + MOVM.IB [R4-R8, R14], (R12) + MOVW R0, 88(R13) + MOVW R1, 92(R13) + MOVW R2, 96(R13) + MOVW R1, R14 + MOVW R2, R12 + MOVW 56(R0), R8 + WORD $0xe1180008 // TST R8, R8 not working see issue 5921 + EOR R6, R6, R6 + MOVW.EQ $(1<<24), R6 + MOVW R6, 84(R13) + ADD $116, R13, g + MOVM.IA (R0), [R0-R9] + MOVM.IA [R0-R4], (g) + CMP $16, R12 + BLO poly1305_blocks_armv6_done + +poly1305_blocks_armv6_mainloop: + WORD $0xe31e0003 // TST R14, #3 not working see issue 5921 + BEQ poly1305_blocks_armv6_mainloop_aligned + ADD $100, R13, g + MOVW_UNALIGNED(R14, g, R0, 0) + MOVW_UNALIGNED(R14, g, R0, 4) + MOVW_UNALIGNED(R14, g, R0, 8) + MOVW_UNALIGNED(R14, g, R0, 12) + MOVM.IA (g), [R0-R3] + ADD $16, R14 + B poly1305_blocks_armv6_mainloop_loaded + +poly1305_blocks_armv6_mainloop_aligned: + MOVM.IA.W (R14), [R0-R3] + +poly1305_blocks_armv6_mainloop_loaded: + MOVW R0>>26, g + MOVW R1>>20, R11 + MOVW R2>>14, R12 + MOVW R14, 92(R13) + MOVW R3>>8, R4 + ORR R1<<6, g, g + ORR R2<<12, R11, R11 + ORR R3<<18, R12, R12 + BIC $0xfc000000, R0, R0 + BIC $0xfc000000, g, g + MOVW 84(R13), R3 + BIC $0xfc000000, R11, R11 + BIC $0xfc000000, R12, R12 + ADD R0, R5, R5 + ADD g, R6, R6 + ORR R3, R4, R4 + ADD R11, R7, R7 + ADD $116, R13, R14 + ADD R12, R8, R8 + ADD R4, R9, R9 + MOVM.IA (R14), [R0-R4] + MULLU R4, R5, (R11, g) + MULLU R3, R5, (R14, R12) + MULALU R3, R6, (R11, g) + MULALU R2, R6, (R14, R12) + MULALU R2, R7, (R11, g) + MULALU R1, R7, (R14, R12) + ADD R4<<2, R4, R4 + ADD R3<<2, R3, R3 + MULALU R1, R8, (R11, g) + MULALU R0, R8, (R14, R12) + MULALU R0, R9, (R11, g) + MULALU R4, R9, (R14, R12) + MOVW g, 76(R13) + MOVW R11, 80(R13) + MOVW R12, 68(R13) + MOVW R14, 72(R13) + MULLU R2, R5, (R11, g) + MULLU R1, R5, (R14, R12) + MULALU R1, R6, (R11, g) + MULALU R0, R6, (R14, R12) + MULALU R0, R7, (R11, g) + MULALU R4, R7, (R14, R12) + ADD R2<<2, R2, R2 + ADD R1<<2, R1, R1 + MULALU R4, R8, (R11, g) + MULALU R3, R8, (R14, R12) + MULALU R3, R9, (R11, g) + MULALU R2, R9, (R14, R12) + MOVW g, 60(R13) + MOVW R11, 64(R13) + MOVW R12, 52(R13) + MOVW R14, 56(R13) + MULLU R0, R5, (R11, g) + MULALU R4, R6, (R11, g) + MULALU R3, R7, (R11, g) + MULALU R2, R8, (R11, g) + MULALU R1, R9, (R11, g) + ADD $52, R13, R0 + MOVM.IA (R0), [R0-R7] + MOVW g>>26, R12 + MOVW R4>>26, R14 + ORR R11<<6, R12, R12 + ORR R5<<6, R14, R14 + BIC $0xfc000000, g, g + BIC $0xfc000000, R4, R4 + ADD.S R12, R0, R0 + ADC $0, R1, R1 + ADD.S R14, R6, R6 + ADC $0, R7, R7 + MOVW R0>>26, R12 + MOVW R6>>26, R14 + ORR R1<<6, R12, R12 + ORR R7<<6, R14, R14 + BIC $0xfc000000, R0, R0 + BIC $0xfc000000, R6, R6 + ADD R14<<2, R14, R14 + ADD.S R12, R2, R2 + ADC $0, R3, R3 + ADD R14, g, g + MOVW R2>>26, R12 + MOVW g>>26, R14 + ORR R3<<6, R12, R12 + BIC $0xfc000000, g, R5 + BIC $0xfc000000, R2, R7 + ADD R12, R4, R4 + ADD R14, R0, R0 + MOVW R4>>26, R12 + BIC $0xfc000000, R4, R8 + ADD R12, R6, R9 + MOVW 96(R13), R12 + MOVW 92(R13), R14 + MOVW R0, R6 + CMP $32, R12 + SUB $16, R12, R12 + MOVW R12, 96(R13) + BHS poly1305_blocks_armv6_mainloop + +poly1305_blocks_armv6_done: + MOVW 88(R13), R12 + MOVW R5, 20(R12) + MOVW R6, 24(R12) + MOVW R7, 28(R12) + MOVW R8, 32(R12) + MOVW R9, 36(R12) + ADD $48, R13, R0 + MOVM.DA (R0), [R4-R8, R14] + RET + +#define MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) \ + MOVBU.P 1(Rsrc), Rtmp; \ + MOVBU.P Rtmp, 1(Rdst); \ + MOVBU.P 1(Rsrc), Rtmp; \ + MOVBU.P Rtmp, 1(Rdst) + +#define MOVWP_UNALIGNED(Rsrc, Rdst, Rtmp) \ + MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp); \ + MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) + +// func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]key) +TEXT ·poly1305_auth_armv6(SB), $196-16 + // The value 196, just above, is the sum of 64 (the size of the context + // structure) and 132 (the amount of stack needed). + // + // At this point, the stack pointer (R13) has been moved down. It + // points to the saved link register and there's 196 bytes of free + // space above it. + // + // The stack for this function looks like: + // + // +--------------------- + // | + // | 64 bytes of context structure + // | + // +--------------------- + // | + // | 112 bytes for poly1305_blocks_armv6 + // | + // +--------------------- + // | 16 bytes of final block, constructed at + // | poly1305_finish_ext_armv6_skip8 + // +--------------------- + // | four bytes of saved 'g' + // +--------------------- + // | lr, saved by prelude <- R13 points here + // +--------------------- + MOVW g, 4(R13) + + MOVW out+0(FP), R4 + MOVW m+4(FP), R5 + MOVW mlen+8(FP), R6 + MOVW key+12(FP), R7 + + ADD $136, R13, R0 // 136 = 4 + 4 + 16 + 112 + MOVW R7, R1 + + // poly1305_init_ext_armv6 will write to the stack from R13+4, but + // that's ok because none of the other values have been written yet. + BL poly1305_init_ext_armv6<>(SB) + BIC.S $15, R6, R2 + BEQ poly1305_auth_armv6_noblocks + ADD $136, R13, R0 + MOVW R5, R1 + ADD R2, R5, R5 + SUB R2, R6, R6 + BL poly1305_blocks_armv6<>(SB) + +poly1305_auth_armv6_noblocks: + ADD $136, R13, R0 + MOVW R5, R1 + MOVW R6, R2 + MOVW R4, R3 + + MOVW R0, R5 + MOVW R1, R6 + MOVW R2, R7 + MOVW R3, R8 + AND.S R2, R2, R2 + BEQ poly1305_finish_ext_armv6_noremaining + EOR R0, R0 + ADD $8, R13, R9 // 8 = offset to 16 byte scratch space + MOVW R0, (R9) + MOVW R0, 4(R9) + MOVW R0, 8(R9) + MOVW R0, 12(R9) + WORD $0xe3110003 // TST R1, #3 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_aligned + WORD $0xe3120008 // TST R2, #8 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip8 + MOVWP_UNALIGNED(R1, R9, g) + MOVWP_UNALIGNED(R1, R9, g) + +poly1305_finish_ext_armv6_skip8: + WORD $0xe3120004 // TST $4, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip4 + MOVWP_UNALIGNED(R1, R9, g) + +poly1305_finish_ext_armv6_skip4: + WORD $0xe3120002 // TST $2, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip2 + MOVHUP_UNALIGNED(R1, R9, g) + B poly1305_finish_ext_armv6_skip2 + +poly1305_finish_ext_armv6_aligned: + WORD $0xe3120008 // TST R2, #8 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip8_aligned + MOVM.IA.W (R1), [g-R11] + MOVM.IA.W [g-R11], (R9) + +poly1305_finish_ext_armv6_skip8_aligned: + WORD $0xe3120004 // TST $4, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip4_aligned + MOVW.P 4(R1), g + MOVW.P g, 4(R9) + +poly1305_finish_ext_armv6_skip4_aligned: + WORD $0xe3120002 // TST $2, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip2 + MOVHU.P 2(R1), g + MOVH.P g, 2(R9) + +poly1305_finish_ext_armv6_skip2: + WORD $0xe3120001 // TST $1, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip1 + MOVBU.P 1(R1), g + MOVBU.P g, 1(R9) + +poly1305_finish_ext_armv6_skip1: + MOVW $1, R11 + MOVBU R11, 0(R9) + MOVW R11, 56(R5) + MOVW R5, R0 + ADD $8, R13, R1 + MOVW $16, R2 + BL poly1305_blocks_armv6<>(SB) + +poly1305_finish_ext_armv6_noremaining: + MOVW 20(R5), R0 + MOVW 24(R5), R1 + MOVW 28(R5), R2 + MOVW 32(R5), R3 + MOVW 36(R5), R4 + MOVW R4>>26, R12 + BIC $0xfc000000, R4, R4 + ADD R12<<2, R12, R12 + ADD R12, R0, R0 + MOVW R0>>26, R12 + BIC $0xfc000000, R0, R0 + ADD R12, R1, R1 + MOVW R1>>26, R12 + BIC $0xfc000000, R1, R1 + ADD R12, R2, R2 + MOVW R2>>26, R12 + BIC $0xfc000000, R2, R2 + ADD R12, R3, R3 + MOVW R3>>26, R12 + BIC $0xfc000000, R3, R3 + ADD R12, R4, R4 + ADD $5, R0, R6 + MOVW R6>>26, R12 + BIC $0xfc000000, R6, R6 + ADD R12, R1, R7 + MOVW R7>>26, R12 + BIC $0xfc000000, R7, R7 + ADD R12, R2, g + MOVW g>>26, R12 + BIC $0xfc000000, g, g + ADD R12, R3, R11 + MOVW $-(1<<26), R12 + ADD R11>>26, R12, R12 + BIC $0xfc000000, R11, R11 + ADD R12, R4, R9 + MOVW R9>>31, R12 + SUB $1, R12 + AND R12, R6, R6 + AND R12, R7, R7 + AND R12, g, g + AND R12, R11, R11 + AND R12, R9, R9 + MVN R12, R12 + AND R12, R0, R0 + AND R12, R1, R1 + AND R12, R2, R2 + AND R12, R3, R3 + AND R12, R4, R4 + ORR R6, R0, R0 + ORR R7, R1, R1 + ORR g, R2, R2 + ORR R11, R3, R3 + ORR R9, R4, R4 + ORR R1<<26, R0, R0 + MOVW R1>>6, R1 + ORR R2<<20, R1, R1 + MOVW R2>>12, R2 + ORR R3<<14, R2, R2 + MOVW R3>>18, R3 + ORR R4<<8, R3, R3 + MOVW 40(R5), R6 + MOVW 44(R5), R7 + MOVW 48(R5), g + MOVW 52(R5), R11 + ADD.S R6, R0, R0 + ADC.S R7, R1, R1 + ADC.S g, R2, R2 + ADC.S R11, R3, R3 + MOVM.IA [R0-R3], (R8) + MOVW R5, R12 + EOR R0, R0, R0 + EOR R1, R1, R1 + EOR R2, R2, R2 + EOR R3, R3, R3 + EOR R4, R4, R4 + EOR R5, R5, R5 + EOR R6, R6, R6 + EOR R7, R7, R7 + MOVM.IA.W [R0-R7], (R12) + MOVM.IA [R0-R7], (R12) + MOVW 4(R13), g + RET diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_ref.go b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_ref.go new file mode 100644 index 0000000000..da952cb6b4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_ref.go @@ -0,0 +1,142 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (!amd64 && !arm) || gccgo || appengine || nacl +// +build !amd64,!arm gccgo appengine nacl + +package poly1305 + +import "encoding/binary" + +// Sum generates an authenticator for msg using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) { + var ( + h0, h1, h2, h3, h4 uint32 // the hash accumulators + r0, r1, r2, r3, r4 uint64 // the r part of the key + ) + + r0 = uint64(binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff) + r1 = uint64((binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03) + r2 = uint64((binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff) + r3 = uint64((binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff) + r4 = uint64((binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff) + + R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5 + + for len(msg) >= TagSize { + // h += msg + h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | (1 << 24) + + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) + + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff + + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff + + msg = msg[TagSize:] + } + + if len(msg) > 0 { + var block [TagSize]byte + off := copy(block[:], msg) + block[off] = 0x01 + + // h += msg + h0 += binary.LittleEndian.Uint32(block[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(block[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(block[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(block[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(block[12:]) >> 8) + + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) + + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff + + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff + } + + // h %= p reduction + h2 += h1 >> 26 + h1 &= 0x3ffffff + h3 += h2 >> 26 + h2 &= 0x3ffffff + h4 += h3 >> 26 + h3 &= 0x3ffffff + h0 += 5 * (h4 >> 26) + h4 &= 0x3ffffff + h1 += h0 >> 26 + h0 &= 0x3ffffff + + // h - p + t0 := h0 + 5 + t1 := h1 + (t0 >> 26) + t2 := h2 + (t1 >> 26) + t3 := h3 + (t2 >> 26) + t4 := h4 + (t3 >> 26) - (1 << 26) + t0 &= 0x3ffffff + t1 &= 0x3ffffff + t2 &= 0x3ffffff + t3 &= 0x3ffffff + + // select h if h < p else h - p + t_mask := (t4 >> 31) - 1 + h_mask := ^t_mask + h0 = (h0 & h_mask) | (t0 & t_mask) + h1 = (h1 & h_mask) | (t1 & t_mask) + h2 = (h2 & h_mask) | (t2 & t_mask) + h3 = (h3 & h_mask) | (t3 & t_mask) + h4 = (h4 & h_mask) | (t4 & t_mask) + + // h %= 2^128 + h0 |= h1 << 26 + h1 = ((h1 >> 6) | (h2 << 20)) + h2 = ((h2 >> 12) | (h3 << 14)) + h3 = ((h3 >> 18) | (h4 << 8)) + + // s: the s part of the key + // tag = (h + s) % (2^128) + t := uint64(h0) + uint64(binary.LittleEndian.Uint32(key[16:])) + h0 = uint32(t) + t = uint64(h1) + uint64(binary.LittleEndian.Uint32(key[20:])) + (t >> 32) + h1 = uint32(t) + t = uint64(h2) + uint64(binary.LittleEndian.Uint32(key[24:])) + (t >> 32) + h2 = uint32(t) + t = uint64(h3) + uint64(binary.LittleEndian.Uint32(key[28:])) + (t >> 32) + h3 = uint32(t) + + binary.LittleEndian.PutUint32(out[0:], h0) + binary.LittleEndian.PutUint32(out[4:], h1) + binary.LittleEndian.PutUint32(out[8:], h2) + binary.LittleEndian.PutUint32(out[12:], h3) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/scrypt/scrypt.go b/vendor/github.com/skycoin/skycoin/src/cipher/scrypt/scrypt.go new file mode 100644 index 0000000000..867de33049 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/scrypt/scrypt.go @@ -0,0 +1,243 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package scrypt implements the scrypt key derivation function as defined in +// Colin Percival's paper "Stronger Key Derivation via Sequential Memory-Hard +// Functions" (http://www.tarsnap.com/scrypt/scrypt.pdf). +package scrypt // import "github.com/skycoin/skycoin/src/cipher/scrypt" + +import ( + "crypto/sha256" + "errors" + + "github.com/skycoin/skycoin/src/cipher/pbkdf2" +) + +const maxInt = int(^uint(0) >> 1) + +// blockCopy copies n numbers from src into dst. +func blockCopy(dst, src []uint32, n int) { + copy(dst, src[:n]) +} + +// blockXOR XORs numbers from dst with n numbers from src. +func blockXOR(dst, src []uint32, n int) { + for i, v := range src[:n] { + dst[i] ^= v + } +} + +// salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in, +// and puts the result into both both tmp and out. +func salsaXOR(tmp *[16]uint32, in, out []uint32) { + w0 := tmp[0] ^ in[0] + w1 := tmp[1] ^ in[1] + w2 := tmp[2] ^ in[2] + w3 := tmp[3] ^ in[3] + w4 := tmp[4] ^ in[4] + w5 := tmp[5] ^ in[5] + w6 := tmp[6] ^ in[6] + w7 := tmp[7] ^ in[7] + w8 := tmp[8] ^ in[8] + w9 := tmp[9] ^ in[9] + w10 := tmp[10] ^ in[10] + w11 := tmp[11] ^ in[11] + w12 := tmp[12] ^ in[12] + w13 := tmp[13] ^ in[13] + w14 := tmp[14] ^ in[14] + w15 := tmp[15] ^ in[15] + + x0, x1, x2, x3, x4, x5, x6, x7, x8 := w0, w1, w2, w3, w4, w5, w6, w7, w8 + x9, x10, x11, x12, x13, x14, x15 := w9, w10, w11, w12, w13, w14, w15 + + for i := 0; i < 8; i += 2 { + u := x0 + x12 + x4 ^= u<<7 | u>>(32-7) + u = x4 + x0 + x8 ^= u<<9 | u>>(32-9) + u = x8 + x4 + x12 ^= u<<13 | u>>(32-13) + u = x12 + x8 + x0 ^= u<<18 | u>>(32-18) + + u = x5 + x1 + x9 ^= u<<7 | u>>(32-7) + u = x9 + x5 + x13 ^= u<<9 | u>>(32-9) + u = x13 + x9 + x1 ^= u<<13 | u>>(32-13) + u = x1 + x13 + x5 ^= u<<18 | u>>(32-18) + + u = x10 + x6 + x14 ^= u<<7 | u>>(32-7) + u = x14 + x10 + x2 ^= u<<9 | u>>(32-9) + u = x2 + x14 + x6 ^= u<<13 | u>>(32-13) + u = x6 + x2 + x10 ^= u<<18 | u>>(32-18) + + u = x15 + x11 + x3 ^= u<<7 | u>>(32-7) + u = x3 + x15 + x7 ^= u<<9 | u>>(32-9) + u = x7 + x3 + x11 ^= u<<13 | u>>(32-13) + u = x11 + x7 + x15 ^= u<<18 | u>>(32-18) + + u = x0 + x3 + x1 ^= u<<7 | u>>(32-7) + u = x1 + x0 + x2 ^= u<<9 | u>>(32-9) + u = x2 + x1 + x3 ^= u<<13 | u>>(32-13) + u = x3 + x2 + x0 ^= u<<18 | u>>(32-18) + + u = x5 + x4 + x6 ^= u<<7 | u>>(32-7) + u = x6 + x5 + x7 ^= u<<9 | u>>(32-9) + u = x7 + x6 + x4 ^= u<<13 | u>>(32-13) + u = x4 + x7 + x5 ^= u<<18 | u>>(32-18) + + u = x10 + x9 + x11 ^= u<<7 | u>>(32-7) + u = x11 + x10 + x8 ^= u<<9 | u>>(32-9) + u = x8 + x11 + x9 ^= u<<13 | u>>(32-13) + u = x9 + x8 + x10 ^= u<<18 | u>>(32-18) + + u = x15 + x14 + x12 ^= u<<7 | u>>(32-7) + u = x12 + x15 + x13 ^= u<<9 | u>>(32-9) + u = x13 + x12 + x14 ^= u<<13 | u>>(32-13) + u = x14 + x13 + x15 ^= u<<18 | u>>(32-18) + } + x0 += w0 + x1 += w1 + x2 += w2 + x3 += w3 + x4 += w4 + x5 += w5 + x6 += w6 + x7 += w7 + x8 += w8 + x9 += w9 + x10 += w10 + x11 += w11 + x12 += w12 + x13 += w13 + x14 += w14 + x15 += w15 + + out[0], tmp[0] = x0, x0 + out[1], tmp[1] = x1, x1 + out[2], tmp[2] = x2, x2 + out[3], tmp[3] = x3, x3 + out[4], tmp[4] = x4, x4 + out[5], tmp[5] = x5, x5 + out[6], tmp[6] = x6, x6 + out[7], tmp[7] = x7, x7 + out[8], tmp[8] = x8, x8 + out[9], tmp[9] = x9, x9 + out[10], tmp[10] = x10, x10 + out[11], tmp[11] = x11, x11 + out[12], tmp[12] = x12, x12 + out[13], tmp[13] = x13, x13 + out[14], tmp[14] = x14, x14 + out[15], tmp[15] = x15, x15 +} + +func blockMix(tmp *[16]uint32, in, out []uint32, r int) { + blockCopy(tmp[:], in[(2*r-1)*16:], 16) + for i := 0; i < 2*r; i += 2 { + salsaXOR(tmp, in[i*16:], out[i*8:]) + salsaXOR(tmp, in[i*16+16:], out[i*8+r*16:]) + } +} + +func integer(b []uint32, r int) uint64 { + j := (2*r - 1) * 16 + return uint64(b[j]) | uint64(b[j+1])<<32 +} + +func smix(b []byte, r, N int, v, xy []uint32) { + var tmp [16]uint32 + x := xy + y := xy[32*r:] + + j := 0 + for i := 0; i < 32*r; i++ { + x[i] = uint32(b[j]) | uint32(b[j+1])<<8 | uint32(b[j+2])<<16 | uint32(b[j+3])<<24 + j += 4 + } + for i := 0; i < N; i += 2 { + blockCopy(v[i*(32*r):], x, 32*r) + blockMix(&tmp, x, y, r) + + blockCopy(v[(i+1)*(32*r):], y, 32*r) + blockMix(&tmp, y, x, r) + } + for i := 0; i < N; i += 2 { + j := int(integer(x, r) & uint64(N-1)) + blockXOR(x, v[j*(32*r):], 32*r) + blockMix(&tmp, x, y, r) + + j = int(integer(y, r) & uint64(N-1)) + blockXOR(y, v[j*(32*r):], 32*r) + blockMix(&tmp, y, x, r) + } + j = 0 + for _, v := range x[:32*r] { + b[j+0] = byte(v >> 0) + b[j+1] = byte(v >> 8) + b[j+2] = byte(v >> 16) + b[j+3] = byte(v >> 24) + j += 4 + } +} + +// Key derives a key from the password, salt, and cost parameters, returning +// a byte slice of length keyLen that can be used as cryptographic key. +// +// N is a CPU/memory cost parameter, which must be a power of two greater than 1. +// r and p must satisfy r * p < 2³⁰. If the parameters do not satisfy the +// limits, the function returns a nil byte slice and an error. +// +// For example, you can get a derived key for e.g. AES-256 (which needs a +// 32-byte key) by doing: +// +// dk, err := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32) +// +// The recommended parameters for interactive logins as of 2009 are N=16384, +// r=8, p=1. They should be increased as memory latency and CPU parallelism +// increases. Remember to get a good random salt. +func Key(password, salt []byte, N, r, p, keyLen int) ([]byte, error) { + if N <= 1 || N&(N-1) != 0 { + return nil, errors.New("scrypt: N must be > 1 and a power of 2") + } + if uint64(r)*uint64(p) >= 1<<30 || r > maxInt/128/p || r > maxInt/256 || N > maxInt/128/r { + return nil, errors.New("scrypt: parameters are too large") + } + + xy := make([]uint32, 64*r) + v := make([]uint32, 32*N*r) + b := pbkdf2.Key(password, salt, 1, p*128*r, sha256.New) + + for i := 0; i < p; i++ { + smix(b[i*128*r:], r, N, v, xy) + } + + return pbkdf2.Key(password, b, 1, keyLen, sha256.New), nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go index 1cbb4ae335..db8f044ee2 100644 --- a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go @@ -22,8 +22,8 @@ func initConstants() { 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41}) TheCurve.halfOrder.SetBytes([]byte{ - 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, - 0X5D, 0X57, 0X6E, 0X73, 0X57, 0XA4, 0X50, 0X1D, 0XDF, 0XE9, 0X2F, 0X46, 0X68, 0X1B, 0X20, 0XA0}) + 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x5D, 0x57, 0x6E, 0x73, 0x57, 0xA4, 0x50, 0x1D, 0xDF, 0xE9, 0x2F, 0x46, 0x68, 0x1B, 0x20, 0xA0}) TheCurve.p.SetBytes([]byte{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go index a6f9d6c893..afdd64efa4 100644 --- a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go @@ -86,7 +86,7 @@ func (xy XY) Bytes() []byte { } // BytesUncompressed returns serialized key in uncompressed format "<04> " -//65 bytes +// 65 bytes func (xy *XY) BytesUncompressed() (raw []byte) { xy.X.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 xy.Y.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 diff --git a/vendor/github.com/skycoin/skycoin/src/cli/add_private_key.go b/vendor/github.com/skycoin/skycoin/src/cli/add_private_key.go new file mode 100644 index 0000000000..e07ec9ce53 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/add_private_key.go @@ -0,0 +1,140 @@ +package cli + +import ( + "fmt" + "io/ioutil" + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/wallet" + "github.com/skycoin/skycoin/src/wallet/collection" +) + +func addPrivateKeyCmd() *cobra.Command { + // TODO -- allow private key to be entered privately, same as the password can be + addPrivateKeyCmd := &cobra.Command{ + Short: "Add a private key to wallet", + Use: "addPrivateKey [wallet] [private key]", + Long: `Add a private key to wallet. + + This method only works on "collection" type wallets. + Use "skycoin-cli walletCreate -t collection" to create a "collection" type wallet. + + Use caution when using this from your shell. The private key will be recorded + if your shell's history file, unless you disable the shell history. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered from the + history log. If you do not include the "-p" option you will be prompted to + enter your password after you enter your command.`, + SilenceUsage: true, + Args: cobra.ExactArgs(2), + DisableFlagsInUseLine: true, + RunE: func(c *cobra.Command, args []string) error { + walletFile := args[0] + skStr := args[1] + + password, err := c.Flags().GetString("password") + if err != nil { + return err + } + pr := NewPasswordReader([]byte(password)) + + err = AddPrivateKeyToFile(walletFile, skStr, pr) + + switch err.(type) { + case nil: + fmt.Println("success") + return nil + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + }, + } + + addPrivateKeyCmd.Flags().StringP("password", "p", "", "wallet password") + + return addPrivateKeyCmd +} + +// AddPrivateKey adds a private key to a wallet.Wallet. Caller should save the wallet afterwards +func AddPrivateKey(wlt *collection.Wallet, key string) error { + sk, err := cipher.SecKeyFromHex(key) + if err != nil { + return fmt.Errorf("invalid private key: %s, must be a hex string of length 64", key) + } + + pk, err := cipher.PubKeyFromSecKey(sk) + if err != nil { + return err + } + + addr := wallet.AddressConstructor(wlt.Meta)(pk) + + entry := wallet.Entry{ + Address: addr, + Public: pk, + Secret: sk, + } + + return wlt.AddEntry(entry) +} + +// AddPrivateKeyToFile adds a private key to a wallet based on filename. +// Will save the wallet after modifying. +func AddPrivateKeyToFile(walletFile, key string, pr PasswordReader) error { + data, err := ioutil.ReadFile(walletFile) + if err != nil { + return WalletLoadError{err} + } + + wlt := &collection.Wallet{} + if err := wlt.Deserialize(data); err != nil { + return WalletLoadError{err} + } + + if wlt.Type() != collection.WalletType { + return fmt.Errorf("only %q type wallets can have keypairs added manually", collection.WalletType) + } + + if pr == nil && wlt.IsEncrypted() { + return wallet.ErrMissingPassword + } + + addKey := func(w *collection.Wallet, key string) error { + return AddPrivateKey(w, key) + } + + if wlt.IsEncrypted() { + addKey = func(w *collection.Wallet, key string) error { + password, err := pr.Password() + if err != nil { + return err + } + + return wallet.GuardUpdate(w, password, func(wlt wallet.Wallet) error { + return AddPrivateKey(wlt.(*collection.Wallet), key) + }) + } + } + + if err := addKey(wlt, key); err != nil { + return err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return err + } + + if err := wallet.Save(wlt, dir); err != nil { + return WalletSaveError{err} + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/address_gen.go b/vendor/github.com/skycoin/skycoin/src/cli/address_gen.go new file mode 100644 index 0000000000..71ebf9c50e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/address_gen.go @@ -0,0 +1,342 @@ +package cli + +import ( + "errors" + "fmt" + "os" + "strings" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/bip39" + "github.com/skycoin/skycoin/src/cipher/crypto" + "github.com/skycoin/skycoin/src/wallet" +) + +func addressGenCmd() *cobra.Command { + addressGenCmd := &cobra.Command{ + Short: "Generate skycoin or bitcoin addresses", + Use: "addressGen", + Long: `Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, _ []string) error { + numAddresses, err := c.Flags().GetInt("num") + if err != nil { + return err + } + if numAddresses <= 0 { + return errors.New("num must be > 0") + } + + coinName, err := c.Flags().GetString("coin") + if err != nil { + return err + } + + coinType, err := wallet.ResolveCoinType(coinName) + if err != nil { + return err + } + + encrypt, err := c.Flags().GetBool("encrypt") + if err != nil { + return err + } + + mode, err := c.Flags().GetString("mode") + if err != nil { + return nil + } + + // default label + label, err := c.Flags().GetString("label") + if err != nil { + return nil + } + if label == "" { + label = "default" + } + + hideSecrets, err := c.Flags().GetBool("hide-secrets") + if err != nil { + return nil + } + + seed, err := resolveSeed(c) + if err != nil { + return err + } + + var password []byte + if encrypt { + switch strings.ToLower(mode) { + case "json", "wallet": + default: + return errors.New("Encrypt flag requires -mode to be json") + } + + var err error + password, err = PasswordFromTerm{}.Password() + if err != nil { + return err + } + } + + w, err := wallet.NewWallet(wallet.NewWalletFilename(), label, seed, wallet.Options{ + Coin: coinType, + Encrypt: encrypt, + Password: password, + CryptoType: crypto.DefaultCryptoType, + GenerateN: uint64(numAddresses), + Type: wallet.WalletTypeDeterministic, + }) + if err != nil { + return err + } + + if hideSecrets { + w.Erase() + } + + //rw := w.ToReadable() + + switch strings.ToLower(mode) { + case "json", "wallet": + output, err := w.Serialize() + if err != nil { + return err + } + + fmt.Println(string(output)) + case "addrs", "addresses": + es, err := w.GetEntries() + if err != nil { + return err + } + for _, e := range es { + fmt.Println(e.Address) + } + case "secrets": + if hideSecrets { + return errors.New("secrets mode selected but hideSecrets enabled") + } + es, err := w.GetEntries() + if err != nil { + return err + } + + for _, e := range es { + switch coinType { + case wallet.CoinTypeSkycoin: + fmt.Println(e.Secret.Hex()) + case wallet.CoinTypeBitcoin: + fmt.Println(cipher.BitcoinWalletImportFormatFromSeckey(e.Secret)) + } + } + default: + return errors.New("invalid mode") + } + + return nil + }, + } + + addressGenCmd.Flags().IntP("num", "n", 1, "Number of addresses to generate") + addressGenCmd.Flags().StringP("coin", "c", "skycoin", "Coin type. Must be skycoin or bitcoin. If bitcoin, secret keys are in Wallet Import Format instead of hex.") + addressGenCmd.Flags().StringP("label", "l", "", "Wallet label to use when printing or writing a wallet file") + addressGenCmd.Flags().Bool("hex", false, "Use hex(sha256sum(rand(1024))) (CSPRNG-generated) as the seed if not seed is not provided") + addressGenCmd.Flags().StringP("seed", "s", "", "Seed for deterministic key generation. Will use bip39 as the seed if not provided.") + addressGenCmd.Flags().BoolP("strict-seed", `t`, false, "Seed should be a valid bip39 mnemonic seed.") + addressGenCmd.Flags().IntP("entropy", "e", 128, "Entropy of the autogenerated bip39 seed, when the seed is not provided. Can be 128 or 256") + addressGenCmd.Flags().BoolP("hide-secrets", "i", false, "Hide the secret key and seed from the output when printing a JSON wallet file") + addressGenCmd.Flags().StringP("mode", "m", "wallet", "Output mode. Options are wallet (prints a full JSON wallet), addresses (prints addresses in plain text), secrets (prints secret keys in plain text)") + addressGenCmd.Flags().BoolP("encrypt", "x", false, "Encrypt the wallet when printing a JSON wallet") + + return addressGenCmd +} + +func resolveSeed(c *cobra.Command) (string, error) { + entropy, err := c.Flags().GetInt("entropy") + if err != nil { + return "", nil + } + + switch entropy { + case 128, 256: + default: + return "", errors.New("entropy must be 128 or 256") + } + + seed, err := c.Flags().GetString("seed") + if err != nil { + return "", nil + } + + strictSeed, err := c.Flags().GetBool("strict-seed") + if err != nil { + return "", nil + } + + if seed != "" { + if strictSeed { + if err := bip39.ValidateMnemonic(seed); err != nil { + return "", fmt.Errorf("seed is not a valid bip39 seed: %v", err) + } + } + + return seed, nil + } + + useHex, err := c.Flags().GetBool("hex") + if err != nil { + return "", nil + } + + if useHex { + seed = cipher.SumSHA256(cipher.RandByte(1024)).Hex() + } else { + e, err := bip39.NewEntropy(entropy) + if err != nil { + return "", err + } + + seed, err = bip39.NewMnemonic(e) + if err != nil { + return "", err + } + } + + return seed, nil +} + +func fiberAddressGenCmd() *cobra.Command { + fiberAddressGenCmd := &cobra.Command{ + Use: "fiberAddressGen", + Short: "Generate addresses and seeds for a new fiber coin", + Long: `Addresses are written in a format that can be copied into fiber.toml + for configuring distribution addresses. Addresses along with their seeds are written to a csv file, + these seeds can be imported into the wallet to access distribution coins.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) (err error) { + if len(args) > 0 { + return errors.New("this command does not take any positional arguments") + } + + fiberNumAddresses, err := c.Flags().GetInt("num") + if err != nil { + return nil + } + + entropy, err := c.Flags().GetInt("entropy") + if err != nil { + return nil + } + + addrsFilename, err := c.Flags().GetString("addrs-file") + if err != nil { + return nil + } + + seedsFilename, err := c.Flags().GetString("seeds-file") + if err != nil { + return nil + } + + overwrite, err := c.Flags().GetBool("overwrite") + if err != nil { + return nil + } + + if fiberNumAddresses < 1 { + return errors.New("num must be > 0") + } + + switch entropy { + case 128, 256: + default: + return errors.New("entropy must be 128 or 256") + } + + addrs := make([]cipher.Address, fiberNumAddresses) + seeds := make([]string, fiberNumAddresses) + + for i := 0; i < fiberNumAddresses; i++ { + e, err := bip39.NewEntropy(entropy) + if err != nil { + return err + } + + seed, err := bip39.NewMnemonic(e) + if err != nil { + return err + } + + _, seckey, err := cipher.GenerateDeterministicKeyPair([]byte(seed)) + if err != nil { + return err + } + addr := cipher.MustAddressFromSecKey(seckey) + + seeds[i] = seed + addrs[i] = addr + } + + _, err = os.Stat(addrsFilename) + if err != nil { + if !os.IsNotExist(err) { + return err + } + } else if !overwrite { + return fmt.Errorf("-addrs-file %q already exists. Use -overwrite to force writing", addrsFilename) + } + + _, err = os.Stat(seedsFilename) + if err != nil { + if !os.IsNotExist(err) { + return err + } + } else if !overwrite { + return fmt.Errorf("-seeds-file %q already exists. Use -overwrite to force writing", seedsFilename) + } + + addrsF, err := os.Create(addrsFilename) + if err != nil { + return err + } + defer addrsF.Close() + + seedsF, err := os.Create(seedsFilename) + if err != nil { + return err + } + defer seedsF.Close() + + for i, a := range addrs { + if _, err := fmt.Fprintf(addrsF, "\"%s\",\n", a); err != nil { + return err + } + if _, err := fmt.Fprintf(seedsF, "\"%s\",\"%s\"\n", a, seeds[i]); err != nil { + return err + } + } + + if err := addrsF.Sync(); err != nil { + return err + } + + return seedsF.Sync() + }, + } + + fiberAddressGenCmd.Flags().IntP("num", "n", 100, "Number of addresses to generate") + fiberAddressGenCmd.Flags().IntP("entropy", "e", 128, "Entropy of the autogenerated bip39 seeds. Can be 128 or 256") + fiberAddressGenCmd.Flags().StringP("addrs-file", "a", "addresses.txt", "Output file for the generated addresses in fiber.toml format") + fiberAddressGenCmd.Flags().StringP("seeds-file", "s", "seeds.csv", "Output file for the generated addresses and seeds in a csv") + fiberAddressGenCmd.Flags().BoolP("overwrite", "o", false, "Allow overwriting any existing addrs-file or seeds-file") + + return fiberAddressGenCmd +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/addresscount.go b/vendor/github.com/skycoin/skycoin/src/cli/addresscount.go new file mode 100644 index 0000000000..92769127d9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/addresscount.go @@ -0,0 +1,26 @@ +package cli + +import ( + "github.com/spf13/cobra" +) + +func addresscountCmd() *cobra.Command { + return &cobra.Command{ + Short: "Get the count of addresses with unspent outputs (coins)", + Long: "Returns the count of all addresses that currently have unspent outputs (coins) associated with them.", + Use: "addresscount", + Args: cobra.NoArgs, + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getAddresscount, + } +} + +func getAddresscount(_ *cobra.Command, _ []string) error { + addresscount, err := apiClient.AddressCount() + if err != nil { + return err + } + + return printJSON(addresscount) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/blocks.go b/vendor/github.com/skycoin/skycoin/src/cli/blocks.go new file mode 100644 index 0000000000..8015304d5f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/blocks.go @@ -0,0 +1,49 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" +) + +func blocksCmd() *cobra.Command { + blocksCmd := &cobra.Command{ + Short: "Lists the content of a single block or a range of blocks", + Use: "blocks [starting block or single block seq] [ending block seq]", + Args: cobra.RangeArgs(1, 2), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getBlocks, + } + + return blocksCmd +} + +func getBlocks(_ *cobra.Command, args []string) error { + var start, end string + start = args[0] + + if len(args) == 1 { + end = start + } else { + end = args[1] + } + + s, err := strconv.ParseUint(start, 10, 64) + if err != nil { + return fmt.Errorf("invalid block seq: %v, must be unsigned integer", start) + } + + e, err := strconv.ParseUint(end, 10, 64) + if err != nil { + return fmt.Errorf("invalid block seq: %v, must be unsigned integer", end) + } + + rlt, err := apiClient.BlocksInRange(s, e) + if err != nil { + return err + } + + return printJSON(rlt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/broadcast_rawtx.go b/vendor/github.com/skycoin/skycoin/src/cli/broadcast_rawtx.go new file mode 100644 index 0000000000..8ad1a6be1f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/broadcast_rawtx.go @@ -0,0 +1,29 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func broadcastTxCmd() *cobra.Command { + return &cobra.Command{ + Short: "Broadcast a raw transaction to the network", + Use: "broadcastTransaction [raw transaction]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: func(_ *cobra.Command, args []string) error { + rawtx := args[0] + + txid, err := apiClient.InjectEncodedTransaction(rawtx) + if err != nil { + return err + } + + fmt.Println(txid) + return nil + }, + } + +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/check_balance.go b/vendor/github.com/skycoin/skycoin/src/cli/check_balance.go new file mode 100644 index 0000000000..facd578402 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/check_balance.go @@ -0,0 +1,258 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/readable" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/wallet" +) + +// Balance represents an coin and hours balance +type Balance struct { + Coins string `json:"coins"` + Hours string `json:"hours"` +} + +// AddressBalances represents an address's balance +type AddressBalances struct { + Confirmed Balance `json:"confirmed"` + Spendable Balance `json:"spendable"` + Expected Balance `json:"expected"` + Address string `json:"address"` +} + +// BalanceResult represents an set of addresses' balances +type BalanceResult struct { + Confirmed Balance `json:"confirmed"` + Spendable Balance `json:"spendable"` + Expected Balance `json:"expected"` + Addresses []AddressBalances `json:"addresses"` +} + +func walletBalanceCmd() *cobra.Command { + return &cobra.Command{ + Short: "Check the balance of a wallet", + Use: "walletBalance [wallet]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + RunE: checkWltBalance, + } +} + +func addressBalanceCmd() *cobra.Command { + return &cobra.Command{ + Short: "Check the balance of specific addresses", + Use: "addressBalance [addresses]", + Long: `Check balance of specific addresses, join multiple addresses with space. + example: addressBalance "$addr1 $addr2 $addr3"`, + Args: cobra.MinimumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: addrBalance, + } +} + +func checkWltBalance(c *cobra.Command, args []string) error { + w := args[0] + balRlt, err := CheckWalletBalance(apiClient, w) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + return printJSON(balRlt) +} + +func addrBalance(_ *cobra.Command, args []string) error { + numArgs := len(args) + + addrs := make([]string, numArgs) + + var err error + for i := 0; i < numArgs; i++ { + addrs[i] = args[i] + if _, err = cipher.DecodeBase58Address(addrs[i]); err != nil { + return fmt.Errorf("invalid address: %v, err: %v", addrs[i], err) + } + } + + balRlt, err := GetBalanceOfAddresses(apiClient, addrs) + if err != nil { + return err + } + + return printJSON(balRlt) +} + +// PUBLIC + +// CheckWalletBalance returns the total and individual balances of addresses in a wallet file +func CheckWalletBalance(c GetOutputser, id string) (*BalanceResult, error) { + wlt, err := apiClient.Wallet(id) + if err != nil { + return nil, err + } + + var addrs []string + for _, e := range wlt.Entries { + addrs = append(addrs, e.Address) + } + + return GetBalanceOfAddresses(c, addrs) +} + +// GetBalanceOfAddresses returns the total and individual balances of a set of addresses +func GetBalanceOfAddresses(c GetOutputser, addrs []string) (*BalanceResult, error) { + outs, err := c.OutputsForAddresses(addrs) + if err != nil { + return nil, err + } + + return getBalanceOfAddresses(outs, addrs) +} + +func getBalanceOfAddresses(outs *readable.UnspentOutputsSummary, addrs []string) (*BalanceResult, error) { + addrsMap := make(map[string]struct{}, len(addrs)) + for _, a := range addrs { + addrsMap[a] = struct{}{} + } + + addrBalances := make(map[string]struct { + confirmed, spendable, expected wallet.Balance + }, len(addrs)) + + // Count confirmed balances + for _, o := range outs.HeadOutputs { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.confirmed.Coins += amt + b.confirmed.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + // Count spendable balances + for _, o := range outs.SpendableOutputs() { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.spendable.Coins += amt + b.spendable.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + // Count predicted balances + for _, o := range outs.ExpectedOutputs() { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.expected.Coins += amt + b.expected.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + toBalance := func(b wallet.Balance) (Balance, error) { + coins, err := droplet.ToString(b.Coins) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: coins, + Hours: strconv.FormatUint(b.Hours, 10), + }, nil + } + + var totalConfirmed, totalSpendable, totalExpected wallet.Balance + balRlt := &BalanceResult{ + Addresses: make([]AddressBalances, len(addrs)), + } + + for i, a := range addrs { + b := addrBalances[a] + var err error + + balRlt.Addresses[i].Address = a + + totalConfirmed, err = totalConfirmed.Add(b.confirmed) + if err != nil { + return nil, err + } + + totalSpendable, err = totalSpendable.Add(b.spendable) + if err != nil { + return nil, err + } + + totalExpected, err = totalExpected.Add(b.expected) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Confirmed, err = toBalance(b.confirmed) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Spendable, err = toBalance(b.spendable) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Expected, err = toBalance(b.expected) + if err != nil { + return nil, err + } + } + + var err error + balRlt.Confirmed, err = toBalance(totalConfirmed) + if err != nil { + return nil, err + } + + balRlt.Spendable, err = toBalance(totalSpendable) + if err != nil { + return nil, err + } + + balRlt.Expected, err = toBalance(totalExpected) + if err != nil { + return nil, err + } + + return balRlt, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/checkdb.go b/vendor/github.com/skycoin/skycoin/src/cli/checkdb.go new file mode 100644 index 0000000000..070f7b50d9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/checkdb.go @@ -0,0 +1,141 @@ +package cli + +import ( + "fmt" + "os" + "time" + + "github.com/boltdb/bolt" + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/apputil" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +const ( + blockchainPubkey = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +) + +// wrapDB calls dbutil.WrapDB and disables all logging +func wrapDB(db *bolt.DB) *dbutil.DB { + wdb := dbutil.WrapDB(db) + wdb.ViewLog = false + wdb.ViewTrace = false + wdb.UpdateLog = false + wdb.UpdateTrace = false + wdb.DurationLog = false + return wdb +} + +func checkDBCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify the database", + Use: "checkdb [db path]", + Long: `Checks if the given database file contains valid skycoin blockchain data. + If no argument is specificed, the default data.db in $HOME/.$COIN/ will be checked.`, + Args: cobra.MaximumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: checkDB, + } +} + +func checkDB(_ *cobra.Command, args []string) error { + // get db path + dbPath := "" + if len(args) > 0 { + dbPath = args[0] + } + dbPath, err := resolveDBPath(cliConfig, dbPath) + if err != nil { + return err + } + + // check if this file exists + if _, err := os.Stat(dbPath); os.IsNotExist(err) { + return fmt.Errorf("db file: %v does not exist", dbPath) + } + + db, err := bolt.Open(dbPath, 0600, &bolt.Options{ + Timeout: 5 * time.Second, + ReadOnly: true, + }) + + if err != nil { + return fmt.Errorf("open db failed: %v", err) + } + pubkey, err := cipher.PubKeyFromHex(blockchainPubkey) + if err != nil { + return fmt.Errorf("decode blockchain pubkey failed: %v", err) + } + + go func() { + apputil.CatchInterrupt(quitChan) + }() + + if err := visor.CheckDatabase(wrapDB(db), pubkey, quitChan); err != nil { + if err == visor.ErrVerifyStopped { + return nil + } + return fmt.Errorf("checkdb failed: %v", err) + } + + fmt.Println("check db success") + return nil +} + +func checkDBEncodingCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify the database data encoding", + Use: "checkDBDecoding [db path]", + Long: `Verify the generated binary encoders match the dynamic encoders for database data. + If no argument is specificed, the default data.db in $HOME/.$COIN/ will be checked.`, + Args: cobra.MaximumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: checkDBDecoding, + } +} + +func checkDBDecoding(_ *cobra.Command, args []string) error { + // get db path + dbPath := "" + if len(args) > 0 { + dbPath = args[0] + } + dbPath, err := resolveDBPath(cliConfig, dbPath) + if err != nil { + return err + } + + // check if this file exists + if _, err := os.Stat(dbPath); os.IsNotExist(err) { + return fmt.Errorf("db file: %v does not exist", dbPath) + } + + db, err := bolt.Open(dbPath, 0600, &bolt.Options{ + Timeout: 5 * time.Second, + ReadOnly: true, + }) + + if err != nil { + return fmt.Errorf("open db failed: %v", err) + } + + go func() { + apputil.CatchInterrupt(quitChan) + }() + + if err := visor.VerifyDBSkyencoderSafe(wrapDB(db), quitChan); err != nil { + if err == visor.ErrVerifyStopped { + return nil + } + return fmt.Errorf("checkDBDecoding failed: %v", err) + } + + fmt.Println("check db decoding success") + return nil + +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/cli.go b/vendor/github.com/skycoin/skycoin/src/cli/cli.go new file mode 100644 index 0000000000..ecbea9d00a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/cli.go @@ -0,0 +1,323 @@ +/* +Package cli implements the CLI cmd's methods. + +Includes methods for manipulating wallets files and interacting with the +REST API to query a skycoin node's status. +*/ +package cli + +import ( + "encoding/json" + "errors" + "flag" + "fmt" + "net/url" + "path/filepath" + "syscall" + + "os" + + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "golang.org/x/crypto/ssh/terminal" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/util/file" + "github.com/skycoin/skycoin/src/wallet" +) + +var ( + // Version is the CLI Version + Version = "0.27.1" +) + +const ( + walletExt = "." + wallet.WalletExt + defaultCoin = "skycoin" + defaultRPCAddress = "http://127.0.0.1:6420" + defaultDataDir = "$HOME/.$COIN/" +) + +var ( + envVarsHelp = fmt.Sprintf(`ENVIRONMENT VARIABLES: + RPC_ADDR: Address of RPC node. Must be in scheme://host format. Default "%s" + RPC_USER: Username for RPC API, if enabled in the RPC. + RPC_PASS: Password for RPC API, if enabled in the RPC. + COIN: Name of the coin. Default "%s" + DATA_DIR: Directory where everything is stored. Default "%s"`, defaultRPCAddress, defaultCoin, defaultDataDir) + + helpTemplate = fmt.Sprintf(`USAGE:{{if .Runnable}} + {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} + {{.CommandPath}} [command] [flags] [arguments...]{{end}}{{with (or .Long .Short)}} + +DESCRIPTION: + {{. | trimTrailingWhitespaces}}{{end}}{{if .HasExample}} + +EXAMPLES: +{{.Example}}{{end}}{{if .HasAvailableSubCommands}} + +COMMANDS:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}} + {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} + +FLAGS: +{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} + +GLOBAL FLAGS: +{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}} + +Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} + {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} + +Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} + +%s +`, envVarsHelp) + + // ErrWalletName is returned if the wallet file name is invalid + ErrWalletName = fmt.Errorf("error wallet file name, must have %s extension", walletExt) + // ErrAddress is returned if an address is invalid + ErrAddress = errors.New("invalid address") + // ErrJSONMarshal is returned if JSON marshaling failed + ErrJSONMarshal = errors.New("json marshal failed") +) + +var ( + cliConfig Config + apiClient *api.Client + quitChan = make(chan struct{}) +) + +// Config cli's configuration struct +type Config struct { + DataDir string `json:"data_directory"` + Coin string `json:"coin"` + RPCAddress string `json:"rpc_address"` + RPCUsername string `json:"-"` + RPCPassword string `json:"-"` +} + +// LoadConfig loads config from environment, prior to parsing CLI flags +func LoadConfig() (Config, error) { + // get coin name from env + coin := os.Getenv("COIN") + if coin == "" { + coin = defaultCoin + } + + // get rpc address from env + rpcAddr := os.Getenv("RPC_ADDR") + if rpcAddr == "" { + rpcAddr = defaultRPCAddress + } + + if _, err := url.Parse(rpcAddr); err != nil { + return Config{}, errors.New("RPC_ADDR must be in scheme://host format") + } + + rpcUser := os.Getenv("RPC_USER") + rpcPass := os.Getenv("RPC_PASS") + + home := file.UserHome() + + // get data dir dir from env + dataDir := os.Getenv("DATA_DIR") + if dataDir == "" { + dataDir = filepath.Join(home, fmt.Sprintf(".%s", coin)) + } + + if os.Getenv("WALLET_DIR") != "" { + return Config{}, errors.New("the envvar WALLET_DIR is no longer recognized by the CLI tool. Please review the updated CLI docs to learn how to specify the wallet file for your desired action") + } + if os.Getenv("WALLET_NAME") != "" { + return Config{}, errors.New("the envvar WALLET_NAME is no longer recognized by the CLI tool. Please review the updated CLI docs to learn how to specify the wallet file for your desired action") + } + + return Config{ + DataDir: dataDir, + Coin: coin, + RPCAddress: rpcAddr, + RPCUsername: rpcUser, + RPCPassword: rpcPass, + }, nil +} + +// FullDBPath returns the joined data directory and db file name path +func (c Config) FullDBPath() string { + return filepath.Join(c.DataDir, "data.db") +} + +func resolveDBPath(cfg Config, db string) (string, error) { + if db == "" { + db = cfg.FullDBPath() + } + + // If db is only the basename, use the default data dir + if filepath.Base(db) == db { + db = filepath.Join(cfg.DataDir, db) + } + + absDB, err := filepath.Abs(db) + if err != nil { + return "", fmt.Errorf("Invalid data path %s: %v", db, err) + } + return absDB, nil +} + +// NewCLI creates a cli instance +func NewCLI(cfg Config) (*cobra.Command, error) { + apiClient = api.NewClient(cfg.RPCAddress) + apiClient.SetAuth(cfg.RPCUsername, cfg.RPCPassword) + + cliConfig = cfg + + skyCLI := &cobra.Command{ + Short: fmt.Sprintf("The %s command line interface", cfg.Coin), + Use: fmt.Sprintf("%s-cli", cfg.Coin), + } + + commands := []*cobra.Command{ + addPrivateKeyCmd(), + addressBalanceCmd(), + addressGenCmd(), + fiberAddressGenCmd(), + addressOutputsCmd(), + blocksCmd(), + broadcastTxCmd(), + checkDBCmd(), + checkDBEncodingCmd(), + createRawTxnCmd(), + createRawTxnV2Cmd(), + signTxnCmd(), + decodeRawTxnCmd(), + encodeJSONTxnCmd(), + decryptWalletCmd(), + encryptWalletCmd(), + lastBlocksCmd(), + listAddressesCmd(), + listWalletsCmd(), + sendCmd(), + showConfigCmd(), + showSeedCmd(), + statusCmd(), + transactionCmd(), + verifyTransactionCmd(), + verifyAddressCmd(), + versionCmd(), + walletCreateCmd(), + walletCreateTempCmd(), + walletAddAddressesCmd(), + walletScanAddressesCmd(), + walletKeyExportCmd(), + walletBalanceCmd(), + walletHisCmd(), + walletOutputsCmd(), + richlistCmd(), + addressTransactionsCmd(), + pendingTransactionsCmd(), + addresscountCmd(), + distributeGenesisCmd(), + } + + skyCLI.Version = Version + skyCLI.SuggestionsMinimumDistance = 1 + skyCLI.SilenceUsage = true + skyCLI.AddCommand(commands...) + + skyCLI.SetHelpTemplate(helpTemplate) + skyCLI.SetUsageTemplate(helpTemplate) + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + + return skyCLI, nil +} + +func printHelp(c *cobra.Command) { + c.Printf("See '%s %s --help'\n", c.Parent().Name(), c.Name()) +} + +func formatJSON(obj interface{}) ([]byte, error) { + d, err := json.MarshalIndent(obj, "", " ") + if err != nil { + return nil, ErrJSONMarshal + } + return d, nil +} + +func printJSON(obj interface{}) error { + d, err := formatJSON(obj) + if err != nil { + return err + } + + fmt.Println(string(d)) + + return nil +} + +// readPasswordFromTerminal promotes user to enter password and read it. +func readPasswordFromTerminal() ([]byte, error) { + // Promotes to enter the wallet password + fmt.Fprint(os.Stdout, "enter password:") + bp, err := terminal.ReadPassword(int(syscall.Stdin)) //nolint:unconvert + if err != nil { + return nil, err + } + fmt.Fprintln(os.Stdout, "") + return bp, nil +} + +// PUBLIC + +// WalletLoadError is returned if a wallet could not be loaded +type WalletLoadError struct { + error +} + +func (e WalletLoadError) Error() string { + return fmt.Sprintf("Load wallet failed: %v", e.error) +} + +// WalletSaveError is returned if a wallet could not be saved +type WalletSaveError struct { + error +} + +func (e WalletSaveError) Error() string { + return fmt.Sprintf("Save wallet failed: %v", e.error) +} + +// PasswordReader is an interface for getting password +type PasswordReader interface { + Password() ([]byte, error) +} + +// PasswordFromBytes represents an implementation of PasswordReader, +// which reads password from the bytes itself. +type PasswordFromBytes []byte + +// Password implements the PasswordReader's Password method +func (p PasswordFromBytes) Password() ([]byte, error) { + return p, nil +} + +// PasswordFromTerm reads password from terminal +type PasswordFromTerm struct{} + +// Password implements the PasswordReader's Password method +func (p PasswordFromTerm) Password() ([]byte, error) { + v, err := readPasswordFromTerminal() + if err != nil { + return nil, err + } + + return v, nil +} + +// NewPasswordReader creats a PasswordReader instance, +// reads password from the input bytes first, if it's empty, then read from terminal. +func NewPasswordReader(p []byte) PasswordReader { + if len(p) != 0 { + return PasswordFromBytes(p) + } + + return PasswordFromTerm{} +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/create_rawtx.go b/vendor/github.com/skycoin/skycoin/src/cli/create_rawtx.go new file mode 100644 index 0000000000..06641e96db --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/create_rawtx.go @@ -0,0 +1,1011 @@ +package cli + +import ( + "encoding/csv" + "encoding/json" + "errors" + "fmt" + "os" + "strings" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/readable" + "github.com/skycoin/skycoin/src/transaction" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/util/mathutil" + "github.com/skycoin/skycoin/src/wallet" +) + +var ( + // ErrTemporaryInsufficientBalance is returned if a wallet does not have enough balance for a spend, but will have enough after unconfirmed transactions confirm + ErrTemporaryInsufficientBalance = errors.New("balance is not sufficient. Balance will be sufficient after unconfirmed transactions confirm") +) + +// SendAmount represents an amount to send to an address +type SendAmount struct { + Addr string + Coins uint64 +} + +type sendAmountJSON struct { + Addr string `json:"addr"` + Coins string `json:"coins"` +} + +func createRawTxnCmd() *cobra.Command { + createRawTxnCmd := &cobra.Command{ + Short: "Create a raw transaction that can be broadcast to the network later", + Use: "createRawTransaction [wallet] [to address] [amount]", + Long: `Create a raw transaction that can be broadcast to the network later. + + Note: The [amount] argument is the coins you will spend, with decimal formatting, e.g. 1, 1.001 or 1.000000. + + The [to address] and [amount] arguments can be replaced with the --many/-m or the --csv option. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + Args: cobra.MinimumNArgs(1), + RunE: func(c *cobra.Command, args []string) error { + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + txn, err := createRawTxnCmdHandler(c, args) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + rawTxn, err := txn.SerializeHex() + if err != nil { + return err + } + + if jsonOutput { + return printJSON(struct { + RawTx string `json:"rawtx"` + }{ + RawTx: rawTxn, + }) + } + + fmt.Println(rawTxn) + + return nil + }, + } + + createRawTxnCmd.Flags().StringP("from-address", "a", "", "From address in wallet") + createRawTxnCmd.Flags().StringP("change-address", "c", "", `Specify the change address. +Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets).`) + createRawTxnCmd.Flags().StringP("many", "m", "", `use JSON string to set multiple receive addresses and coins, +example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]'`) + createRawTxnCmd.Flags().StringP("password", "p", "", "Wallet password") + createRawTxnCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + createRawTxnCmd.Flags().String("csv", "", "CSV file containing addresses and amounts to send") + + return createRawTxnCmd +} + +func createRawTxnV2Cmd() *cobra.Command { + createRawTxnCmd := &cobra.Command{ + Short: "Create a raw transaction that can be broadcast to the network later", + Use: "createRawTransactionV2 [wallet] [to address] [amount]", + Long: `Create a raw transaction that can be broadcast to the network later. + + Note: The [amount] argument is the coins you will spend, with decimal formatting, e.g. 1, 1.001 or 1.000000. + + The [to address] and [amount] arguments can be replaced with the --csv option., + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + Args: cobra.MinimumNArgs(1), + RunE: func(c *cobra.Command, args []string) error { + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + req, err := makeWalletCreateTxnRequest(c, args) + if err != nil { + return err + } + + rsp, err := apiClient.WalletCreateTransaction(*req) + if err != nil { + return err + } + + if jsonOutput { + return printJSON(rsp) + } + + fmt.Println(rsp.EncodedTransaction) + + return nil + }, + } + + createRawTxnCmd.Flags().StringP("from-address", "a", "", "From address in wallet") + createRawTxnCmd.Flags().StringP("change-address", "c", "", `Specify the change address. + Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets).`) + createRawTxnCmd.Flags().String("csv", "", "CSV file containing addresses and amounts to send") + createRawTxnCmd.Flags().StringP("password", "p", "", "Wallet password") + createRawTxnCmd.Flags().BoolP("unsign", "", false, "Do not sign the transaction") + createRawTxnCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + + createRawTxnCmd.Flags().BoolP("ignore-unconfirmed", "", false, "Ignore unconfirmed transactions") + createRawTxnCmd.Flags().StringP("hours-selection-type", "", transaction.HoursSelectionTypeAuto, "Hours selection type") + createRawTxnCmd.Flags().StringP("hours-selection-mode", "", transaction.HoursSelectionModeShare, "Hours selection mode") + createRawTxnCmd.Flags().StringP("hours-selection-share-factor", "", "0.5", "Hour selection share factor") + + return createRawTxnCmd +} + +func makeWalletCreateTxnRequest(c *cobra.Command, args []string) (*api.WalletCreateTransactionRequest, error) { + unsign, err := c.Flags().GetBool("unsign") + if err != nil { + return nil, err + } + + walletFile := args[0] + w, err := apiClient.Wallet(walletFile) + if err != nil { + return nil, err + } + + wltAddr, err := fromWalletOrAddress(c, walletFile) + if err != nil { + return nil, err + } + + var addrs []string + if wltAddr.Address != "" { + addrs = append(addrs, wltAddr.Address) + } else { + for _, e := range w.Entries { + addrs = append(addrs, e.Address) + } + } + + ctr, err := makeCreateTransactionRequest(c, args, addrs) + if err != nil { + return nil, err + } + + req := api.WalletCreateTransactionRequest{ + Unsigned: unsign, + WalletID: w.Meta.Filename, + CreateTransactionRequest: *ctr, + } + + if w.Meta.Encrypted && !unsign { + p, err := getPassword(c) + if err != nil { + return nil, err + } + defer func() { + p = nil + }() + req.Password = string(p) + } + return &req, nil +} + +func getPassword(c *cobra.Command) ([]byte, error) { + p, err := c.Flags().GetString("password") + if err != nil { + return nil, err + } + defer func() { + p = "" + }() + + return NewPasswordReader([]byte(p)).Password() +} + +func makeCreateTransactionRequest(c *cobra.Command, args []string, fromAddrs []string) (*api.CreateTransactionRequest, error) { + hoursSelection, err := getHoursSelection(c) + if err != nil { + return nil, err + } + + iu, err := c.Flags().GetBool("ignore-unconfirmed") + if err != nil { + return nil, err + } + + var changeAddr *string + ca, err := c.Flags().GetString("change-address") + if err != nil { + return nil, err + } + if ca != "" { + changeAddr = &ca + } + + to, err := getToAddressesV2(c, args[1:]) + if err != nil { + return nil, err + } + + return &api.CreateTransactionRequest{ + IgnoreUnconfirmed: iu, + HoursSelection: *hoursSelection, + ChangeAddress: changeAddr, + Addresses: fromAddrs, + To: to, + }, nil +} + +func getToAddressesV2(c *cobra.Command, args []string) ([]api.Receiver, error) { + csvFile, err := c.Flags().GetString("csv") + if err != nil { + return nil, err + } + + if csvFile != "" { + fields, err := openCSV(csvFile) + if err != nil { + return nil, err + } + return parseReceiversFromCSV(fields) + } + + if len(args) < 2 { + return nil, fmt.Errorf("requires at least 2 arg(s), only received %d", len(args)) + } + + toAddr := args[0] + if _, err := cipher.DecodeBase58Address(toAddr); err != nil { + return nil, err + } + + coins := args[1] + if _, err := droplet.FromString(coins); err != nil { + return nil, err + } + + return []api.Receiver{{ + Address: toAddr, + Coins: coins, + }}, nil +} +func getHoursSelection(c *cobra.Command) (*api.HoursSelection, error) { + hst, err := c.Flags().GetString("hours-selection-type") + if err != nil { + return nil, err + } + + hsm, err := c.Flags().GetString("hours-selection-mode") + if err != nil { + return nil, err + } + + sf, err := c.Flags().GetString("hours-selection-share-factor") + if err != nil { + return nil, err + } + + return &api.HoursSelection{ + Type: hst, + Mode: hsm, + ShareFactor: sf, + }, nil +} + +type walletAddress struct { + Wallet string + Address string +} + +func fromWalletOrAddress(c *cobra.Command, walletFile string) (walletAddress, error) { + address, err := c.Flags().GetString("from-address") + if err != nil { + return walletAddress{}, err + } + + wltAddr := walletAddress{ + Wallet: walletFile, + } + + wltAddr.Address = address + if wltAddr.Address == "" { + return wltAddr, nil + } + + if _, err := cipher.DecodeBase58Address(wltAddr.Address); err != nil { + return walletAddress{}, fmt.Errorf("invalid address: %s", wltAddr.Address) + } + + return wltAddr, nil +} + +func getChangeAddress(wltAddr walletAddress, chgAddr string) (string, error) { + if chgAddr == "" { + switch { + case wltAddr.Address != "": + // use the from address as change address + chgAddr = wltAddr.Address + case wltAddr.Wallet != "": + // get the default wallet's coin base address + wlt, err := wallet.Load(wltAddr.Wallet) + if err != nil { + return "", WalletLoadError{err} + } + es, err := wlt.GetEntries() + if err != nil { + return "", err + } + + if len(es) > 0 { + chgAddr = es[0].Address.String() + } else { + return "", errors.New("no change address was found") + } + default: + return "", errors.New("wallet file, from address and change address are empty") + } + } + + // validate the address + _, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return "", fmt.Errorf("invalid change address: %s", chgAddr) + } + + return chgAddr, nil +} + +func getToAddresses(c *cobra.Command, args []string) ([]SendAmount, error) { + csvFile, err := c.Flags().GetString("csv") + if err != nil { + return nil, err + } + many, err := c.Flags().GetString("many") + if err != nil { + return nil, err + } + + if csvFile != "" && many != "" { + return nil, errors.New("-csv and -m cannot be combined") + } + + if many != "" { + return parseSendAmountsFromJSON(many) + } else if csvFile != "" { + fields, err := openCSV(csvFile) + if err != nil { + return nil, err + } + return parseSendAmountsFromCSV(fields) + } + + if len(args) < 2 { + return nil, fmt.Errorf("requires at least 2 arg(s), only received %d", len(args)) + } + + toAddr := args[0] + + if _, err := cipher.DecodeBase58Address(toAddr); err != nil { + return nil, err + } + + amt, err := getAmount(args) + if err != nil { + return nil, err + } + + return []SendAmount{{ + Addr: toAddr, + Coins: amt, + }}, nil +} + +func openCSV(csvFile string) ([][]string, error) { + f, err := os.Open(csvFile) + if err != nil { + return nil, err + } + defer f.Close() + + r := csv.NewReader(f) + return r.ReadAll() +} + +func parseSendAmountsFromCSV(fields [][]string) ([]SendAmount, error) { + var sends []SendAmount + var errs []error + for i, f := range fields { + addr := f[0] + + addr = strings.TrimSpace(addr) + + if _, err := cipher.DecodeBase58Address(addr); err != nil { + err = fmt.Errorf("[row %d] Invalid address %s: %v", i, addr, err) + errs = append(errs, err) + continue + } + + coins, err := droplet.FromString(f[1]) + if err != nil { + err = fmt.Errorf("[row %d] Invalid amount %s: %v", i, f[1], err) + errs = append(errs, err) + continue + } + + sends = append(sends, SendAmount{ + Addr: addr, + Coins: coins, + }) + } + + if len(errs) > 0 { + errMsgs := make([]string, len(errs)) + for i, err := range errs { + errMsgs[i] = err.Error() + } + + errMsg := strings.Join(errMsgs, "\n") + + return nil, errors.New(errMsg) + } + + return sends, nil +} + +func parseReceiversFromCSV(fields [][]string) ([]api.Receiver, error) { + var sends []api.Receiver + var errs []error + for i, f := range fields { + addr := f[0] + + addr = strings.TrimSpace(addr) + + if _, err := cipher.DecodeBase58Address(addr); err != nil { + err = fmt.Errorf("[row %d] Invalid address %s: %v", i, addr, err) + errs = append(errs, err) + continue + } + + _, err := droplet.FromString(f[1]) + if err != nil { + err = fmt.Errorf("[row %d] Invalid amount %s: %v", i, f[1], err) + errs = append(errs, err) + continue + } + + sends = append(sends, api.Receiver{ + Address: addr, + Coins: f[1], + }) + } + + if len(errs) > 0 { + errMsgs := make([]string, len(errs)) + for i, err := range errs { + errMsgs[i] = err.Error() + } + + errMsg := strings.Join(errMsgs, "\n") + + return nil, errors.New(errMsg) + } + + return sends, nil +} + +func parseSendAmountsFromJSON(m string) ([]SendAmount, error) { + sas := []sendAmountJSON{} + + if err := json.NewDecoder(strings.NewReader(m)).Decode(&sas); err != nil { + return nil, fmt.Errorf("invalid -m flag string, err: %v", err) + } + + sendAmts := make([]SendAmount, 0, len(sas)) + + for _, sa := range sas { + amt, err := droplet.FromString(sa.Coins) + if err != nil { + return nil, fmt.Errorf("invalid coins value in -m flag string: %v", err) + } + + sendAmts = append(sendAmts, SendAmount{ + Addr: sa.Addr, + Coins: amt, + }) + } + + return sendAmts, nil +} + +func getAmount(args []string) (uint64, error) { + amount := args[1] + amt, err := droplet.FromString(amount) + if err != nil { + return 0, fmt.Errorf("invalid amount: %v", err) + } + + return amt, nil +} + +// createRawTxnArgs are encapsulated arguments for creating a transaction +type createRawTxnArgs struct { + WalletID string + Address string + ChangeAddress string + SendAmounts []SendAmount + Password PasswordReader +} + +func parseCreateRawTxnArgs(c *cobra.Command, args []string) (*createRawTxnArgs, error) { + wltAddr, err := fromWalletOrAddress(c, args[0]) + if err != nil { + return nil, err + } + + changeAddress, err := c.Flags().GetString("change-address") + if err != nil { + return nil, err + } + chgAddr, err := getChangeAddress(wltAddr, changeAddress) + if err != nil { + return nil, err + } + + toAddrs, err := getToAddresses(c, args[1:]) + if err != nil { + return nil, err + } + if err := validateSendAmounts(toAddrs); err != nil { + return nil, err + } + + password, err := c.Flags().GetString("password") + if err != nil { + return nil, err + } + pr := NewPasswordReader([]byte(password)) + + return &createRawTxnArgs{ + WalletID: wltAddr.Wallet, + Address: wltAddr.Address, + ChangeAddress: chgAddr, + SendAmounts: toAddrs, + Password: pr, + }, nil +} + +func createRawTxnCmdHandler(c *cobra.Command, args []string) (*coin.Transaction, error) { + parsedArgs, err := parseCreateRawTxnArgs(c, args) + if err != nil { + return nil, err + } + + // TODO -- load distribution params from config? Need to allow fiber chains to be used easily + // There's too many distribution parameters to put them in command line, but we could read them from a file. + // We could also have multiple hardcoded known distribution parameters for fiber coins, in the source, + // but this wouldn't work for new fiber coins that hadn't been hardcoded yet. + if parsedArgs.Address == "" { + return CreateRawTxnFromWallet(apiClient, parsedArgs.WalletID, + parsedArgs.ChangeAddress, parsedArgs.SendAmounts, + parsedArgs.Password, params.MainNetDistribution) + } + + return CreateRawTxnFromAddress(apiClient, parsedArgs.Address, + parsedArgs.WalletID, parsedArgs.ChangeAddress, parsedArgs.SendAmounts, + parsedArgs.Password, params.MainNetDistribution) +} + +func validateSendAmounts(toAddrs []SendAmount) error { + for _, arg := range toAddrs { + // validate to address + _, err := cipher.DecodeBase58Address(arg.Addr) + if err != nil { + return ErrAddress + } + + if arg.Coins == 0 { + return errors.New("Cannot send 0 coins") + } + } + + if len(toAddrs) == 0 { + return errors.New("No destination addresses") + } + + return nil +} + +// PUBLIC + +// CreateRawTxnFromWallet creates a transaction from any address or combination of addresses in a wallet +func CreateRawTxnFromWallet(c GetOutputser, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader, distParams params.Distribution) (*coin.Transaction, error) { + // check change address + cAddr, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return nil, ErrAddress + } + + // check if the change address is in wallet. + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + if _, err := wlt.GetEntry(cAddr); err != nil { + if err == wallet.ErrEntryNotFound { + return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) + } + return nil, err + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + var password []byte + if wlt.IsEncrypted() { + var err error + password, err = pr.Password() + if err != nil { + return nil, err + } + } + + // get all address in the wallet + totalAddrs, err := wlt.GetAddresses() + if err != nil { + return nil, err + } + + addrStrArray := make([]string, len(totalAddrs)) + for i, a := range totalAddrs { + addrStrArray[i] = a.String() + } + + return CreateRawTxn(c, wlt, addrStrArray, chgAddr, toAddrs, password, distParams) +} + +// CreateRawTxnFromAddress creates a transaction from a specific address in a wallet +func CreateRawTxnFromAddress(c GetOutputser, addr, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader, distParams params.Distribution) (*coin.Transaction, error) { + // check if the address is in the default wallet. + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + srcAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + return nil, ErrAddress + } + + if _, err := wlt.GetEntry(srcAddr); err != nil { + if err == wallet.ErrEntryNotFound { + return nil, fmt.Errorf("%v address is not in wallet", addr) + } + return nil, err + } + + // validate change address + cAddr, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return nil, ErrAddress + } + + if _, err := wlt.GetEntry(cAddr); err != nil { + if err == wallet.ErrEntryNotFound { + return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) + } + return nil, err + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + var password []byte + if wlt.IsEncrypted() { + var err error + password, err = pr.Password() + if err != nil { + return nil, err + } + } + + return CreateRawTxn(c, wlt, []string{addr}, chgAddr, toAddrs, password, distParams) +} + +// GetOutputser implements unspent output querying +type GetOutputser interface { + OutputsForAddresses([]string) (*readable.UnspentOutputsSummary, error) +} + +// CreateRawTxn creates a transaction from a set of addresses contained in a loaded wallet.Wallet +func CreateRawTxn(c GetOutputser, wlt wallet.Wallet, inAddrs []string, chgAddr string, toAddrs []SendAmount, password []byte, distParams params.Distribution) (*coin.Transaction, error) { + if err := validateSendAmounts(toAddrs); err != nil { + return nil, err + } + + // Get unspent outputs of those addresses + outputs, err := c.OutputsForAddresses(inAddrs) + if err != nil { + return nil, err + } + + inUxs, err := outputs.SpendableOutputs().ToUxArray() + if err != nil { + return nil, err + } + + txn, err := createRawTxn(outputs, wlt, chgAddr, toAddrs, password) + if err != nil { + return nil, err + } + + // filter out unspents which are not used in transaction + var inUxsFiltered coin.UxArray + for _, h := range txn.In { + for _, u := range inUxs { + if h == u.Hash() { + inUxsFiltered = append(inUxsFiltered, u) + } + } + } + + head, err := outputs.Head.ToCoinBlockHeader() + if err != nil { + return nil, err + } + + if err := transaction.VerifySingleTxnSoftConstraints(*txn, head.Time, inUxsFiltered, distParams, params.UserVerifyTxn); err != nil { + return nil, err + } + if err := transaction.VerifySingleTxnHardConstraints(*txn, head, inUxsFiltered, transaction.TxnSigned); err != nil { + return nil, err + } + if err := transaction.VerifySingleTxnUserConstraints(*txn); err != nil { + return nil, err + } + + return txn, nil +} + +func createRawTxn(uxouts *readable.UnspentOutputsSummary, wlt wallet.Wallet, chgAddr string, toAddrs []SendAmount, password []byte) (*coin.Transaction, error) { + // Calculate total required coins + var totalCoins uint64 + for _, arg := range toAddrs { + var err error + totalCoins, err = mathutil.AddUint64(totalCoins, arg.Coins) + if err != nil { + return nil, err + } + } + + spendOutputs, err := chooseSpends(uxouts, totalCoins) + if err != nil { + return nil, err + } + + txOuts, err := makeChangeOut(spendOutputs, chgAddr, toAddrs) + if err != nil { + return nil, err + } + + f := func(w wallet.Wallet) (*coin.Transaction, error) { + keys, err := getKeys(w, spendOutputs) + if err != nil { + return nil, err + } + + return NewTransaction(spendOutputs, keys, txOuts) + } + + makeTxn := func() (*coin.Transaction, error) { + return f(wlt) + } + + if wlt.IsEncrypted() { + makeTxn = func() (*coin.Transaction, error) { + var tx *coin.Transaction + if err := wallet.GuardView(wlt, password, func(w wallet.Wallet) error { + var err error + tx, err = f(w) + return err + }); err != nil { + return nil, err + } + + return tx, nil + } + } + + return makeTxn() +} + +func chooseSpends(uxouts *readable.UnspentOutputsSummary, coins uint64) ([]transaction.UxBalance, error) { + // Convert spendable unspent outputs to []transaction.UxBalance + spendableOutputs, err := readable.OutputsToUxBalances(uxouts.SpendableOutputs()) + if err != nil { + return nil, err + } + + // Choose which unspent outputs to spend + // Use the MinimizeUxOuts strategy, since this is most likely used by + // application that may need to send frequently. + // Using fewer UxOuts will leave more available for other transactions, + // instead of waiting for confirmation. + outs, err := transaction.ChooseSpendsMinimizeUxOuts(spendableOutputs, coins, 0) + if err != nil { + // If there is not enough balance in the spendable outputs, + // see if there is enough balance when including incoming outputs + if err == transaction.ErrInsufficientBalance { + expectedOutputs, otherErr := readable.OutputsToUxBalances(uxouts.ExpectedOutputs()) + if otherErr != nil { + return nil, otherErr + } + + if _, otherErr := transaction.ChooseSpendsMinimizeUxOuts(expectedOutputs, coins, 0); otherErr != nil { + return nil, err + } + + return nil, ErrTemporaryInsufficientBalance + } + + return nil, err + } + + return outs, nil +} + +func makeChangeOut(outs []transaction.UxBalance, chgAddr string, toAddrs []SendAmount) ([]coin.TransactionOutput, error) { + var totalInCoins, totalInHours, totalOutCoins uint64 + + for _, o := range outs { + totalInCoins += o.Coins + totalInHours += o.Hours + } + + if totalInHours == 0 { + return nil, fee.ErrTxnNoFee + } + + for _, to := range toAddrs { + totalOutCoins += to.Coins + } + + if totalInCoins < totalOutCoins { + return nil, transaction.ErrInsufficientBalance + } + + outAddrs := []coin.TransactionOutput{} + changeAmount := totalInCoins - totalOutCoins + + haveChange := changeAmount > 0 + nAddrs := uint64(len(toAddrs)) + changeHours, addrHours, totalOutHours := transaction.DistributeSpendHours(totalInHours, nAddrs, haveChange) + + if err := fee.VerifyTransactionFeeForHours(totalOutHours, totalInHours-totalOutHours, params.UserVerifyTxn.BurnFactor); err != nil { + return nil, err + } + + for i, to := range toAddrs { + // check if changeHours > 0, we do not need to cap addrHours when changeHours is zero + // changeHours is zero when there is no change left or all the coinhours were used in fees + // 1) if there is no change then the remaining coinhours are evenly distributed among the destination addresses + // 2) if all the coinhours are burned in fees then all addrHours are zero by default + if changeHours > 0 { + // the coinhours are capped to a maximum of incoming coins for the address + // if incoming coins < 1 then the cap is set to 1 coinhour + + spendCoinsAmt := to.Coins / 1e6 + if spendCoinsAmt == 0 { + spendCoinsAmt = 1 + } + + // allow addrHours to be less than the incoming coins of the address but not more + if addrHours[i] > spendCoinsAmt { + // cap the addrHours, move the difference to changeHours + changeHours += addrHours[i] - spendCoinsAmt + addrHours[i] = spendCoinsAmt + } + } + + outAddrs = append(outAddrs, mustMakeUtxoOutput(to.Addr, to.Coins, addrHours[i])) + } + + if haveChange { + outAddrs = append(outAddrs, mustMakeUtxoOutput(chgAddr, changeAmount, changeHours)) + } + + return outAddrs, nil +} + +func mustMakeUtxoOutput(addr string, coins, hours uint64) coin.TransactionOutput { + uo := coin.TransactionOutput{} + uo.Address = cipher.MustDecodeBase58Address(addr) + uo.Coins = coins + uo.Hours = hours + return uo +} + +func getKeys(wlt wallet.Wallet, outs []transaction.UxBalance) ([]cipher.SecKey, error) { + keys := make([]cipher.SecKey, len(outs)) + for i, o := range outs { + entry, err := wlt.GetEntry(o.Address) + if err != nil { + if err == wallet.ErrEntryNotFound { + return nil, fmt.Errorf("%v is not in wallet", o.Address.String()) + } + return nil, err + } + keys[i] = entry.Secret + } + return keys, nil +} + +// NewTransaction creates a transaction. The transaction should be validated against hard and soft constraints before transmission. +func NewTransaction(utxos []transaction.UxBalance, keys []cipher.SecKey, outs []coin.TransactionOutput) (*coin.Transaction, error) { + txn := coin.Transaction{} + for _, u := range utxos { + if err := txn.PushInput(u.Hash); err != nil { + return nil, err + } + } + + for _, o := range outs { + if err := txn.PushOutput(o.Address, o.Coins, o.Hours); err != nil { + return nil, err + } + } + + txn.SignInputs(keys) + + err := txn.UpdateHeader() + if err != nil { + return nil, err + } + + return &txn, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/decrypt_wallet.go b/vendor/github.com/skycoin/skycoin/src/cli/decrypt_wallet.go new file mode 100644 index 0000000000..903e293c26 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/decrypt_wallet.go @@ -0,0 +1,60 @@ +package cli + +import ( + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/wallet" +) + +func decryptWalletCmd() *cobra.Command { + decryptWalletCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "decryptWallet [wallet]", + Short: "Decrypt a wallet", + Long: `Decrypt an encrypted wallet. The decrypted wallet will be written + on the filesystem in place of the encrypted wallet. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + w := args[0] + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + + return decryptWallet(w, pr) + }, + } + + decryptWalletCmd.Flags().StringP("password", "p", "", "wallet password") + + return decryptWalletCmd +} + +func decryptWallet(id string, pr PasswordReader) error { + wlt, err := apiClient.Wallet(id) + if err != nil { + return err + } + + if !wlt.Meta.Encrypted { + return wallet.ErrWalletNotEncrypted + } + + if pr == nil { + return wallet.ErrMissingPassword + } + + pwd, err := pr.Password() + if err != nil { + return err + } + + wlt, err = apiClient.DecryptWallet(id, string(pwd)) + if err != nil { + return err + } + + return printJSON(wlt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/distribute_genesis.go b/vendor/github.com/skycoin/skycoin/src/cli/distribute_genesis.go new file mode 100644 index 0000000000..dcf6b5fa51 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/distribute_genesis.go @@ -0,0 +1,147 @@ +package cli + +import ( + "errors" + "fmt" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/util/droplet" +) + +func distributeGenesisCmd() *cobra.Command { + cmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "distributeGenesis [genesis address secret key]", + Short: "Distributes the genesis block coins into the configured distribution addresses", + Long: `Distributes the genesis block coins into the configured distribution addresses. + + The genesis block contains a single transaction with a single output that creates all coins + in existence. Skycoin expects the second block to be a "distribution" transaction, where + the genesis coins are split into N distribution addresses, each holding an equal amount. + + RPC_ADDR must be set, to communicate with a running Skycoin node.`, + RunE: distributeGenesisHandler, + } + + cmd.Flags().StringP("genesis-seckey", "s", "", "Genesis address secret key") + + return cmd +} + +func distributeGenesisHandler(c *cobra.Command, args []string) error { + sk, err := cipher.SecKeyFromHex(args[0]) + if err != nil { + return errors.New("invalid genesis secret key") + } + + // Obtain the genesis uxid from the node + uxID, err := getGenesisUxID() + if err != nil { + return err + } + + txn, err := createDistributionTransaction(uxID, sk, params.MainNetDistribution) + if err != nil { + return err + } + + health, err := apiClient.Health() + if err != nil { + return err + } + + // If the node is a block publisher node, we can skip the broadcast and + // avoid any broadcast related errors. Otherwise, InjectTransaction would + // require that the block publisher node be connected to another peer. + // Otherwise, inject the transaction normally, which requires the node + // to be connected to peers, or else an error is returned. + // This allows the user to use this command against a block publisher node + // during setup, or against a local node, after setting up a block publisher + // node elsewhere. + if health.BlockPublisher { + if _, err := apiClient.InjectTransactionNoBroadcast(txn); err != nil { + return err + } + } else { + if _, err := apiClient.InjectTransaction(txn); err != nil { + return err + } + } + + return nil +} + +func getGenesisUxID() (string, error) { + // Check that the only block is the genesis block + bm, err := apiClient.BlockchainMetadata() + if err != nil { + return "", err + } + if bm.Head.BkSeq != 0 { + return "", errors.New("genesis output has already been distributed") + } + + b, err := apiClient.BlockBySeq(0) + if err != nil { + return "", err + } + + // Sanity checks + if len(b.Body.Transactions) != 1 { + return "", errors.New("genesis block has multiple transactions") + } + if len(b.Body.Transactions[0].Out) != 1 { + return "", errors.New("genesis block has multiple outputs") + } + + return b.Body.Transactions[0].Out[0].Hash, nil +} + +func createDistributionTransaction(uxID string, genesisSecKey cipher.SecKey, p params.Distribution) (*coin.Transaction, error) { + // Sanity check + addrs := p.AddressesDecoded() + if p.MaxCoinSupply%uint64(len(addrs)) != 0 { + return nil, errors.New("the number of distribution addresses must divide MaxCoinSupply exactly") + } + + var txn coin.Transaction + + output, err := cipher.SHA256FromHex(uxID) + if err != nil { + return nil, fmt.Errorf("invalid uxid") + } + + if err := txn.PushInput(output); err != nil { + return nil, err + } + + coins := (p.MaxCoinSupply / uint64(len(addrs))) * droplet.Multiplier + hours := uint64(1000) + + for _, addr := range addrs { + if err := txn.PushOutput(addr, coins, hours); err != nil { + return nil, err + } + } + + seckeys := make([]cipher.SecKey, 1) + seckey := genesisSecKey.Hex() + seckeys[0] = cipher.MustSecKeyFromHex(seckey) + txn.SignInputs([]cipher.SecKey{ + genesisSecKey, + }) + + if err := txn.UpdateHeader(); err != nil { + return nil, err + } + + if err := txn.Verify(); err != nil { + return nil, err + } + + return &txn, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/encrypt_wallet.go b/vendor/github.com/skycoin/skycoin/src/cli/encrypt_wallet.go new file mode 100644 index 0000000000..b2b9a36dce --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/encrypt_wallet.go @@ -0,0 +1,63 @@ +package cli + +import ( + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/wallet" +) + +func encryptWalletCmd() *cobra.Command { + encryptWalletCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Short: "Encrypt wallet", + Use: "encryptWallet [wallet]", + Long: `Encrypt a decrypted wallet. The encrypted wallet file + will be written on the filesystem in place of the decrypted wallet. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + w := args[0] + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + + return encryptWallet(w, pr) + }, + } + + encryptWalletCmd.Flags().StringP("password", "p", "", "wallet password") + return encryptWalletCmd +} + +func encryptWallet(id string, pr PasswordReader) error { + wlt, err := apiClient.Wallet(id) + if err != nil { + return err + } + + if wlt.Meta.Encrypted { + return wallet.ErrWalletEncrypted + } + + if wlt.Meta.Temp { + return wallet.ErrEncryptTempWallet + } + + if pr == nil { + return wallet.ErrMissingPassword + } + + pwd, err := pr.Password() + if err != nil { + return err + } + + wlt, err = apiClient.EncryptWallet(id, string(pwd)) + if err != nil { + return err + } + + return printJSON(wlt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/generate_addrs.go b/vendor/github.com/skycoin/skycoin/src/cli/generate_addrs.go new file mode 100644 index 0000000000..c76da748ed --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/generate_addrs.go @@ -0,0 +1,208 @@ +package cli + +import ( + "errors" + "fmt" + "path/filepath" + "strings" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/wallet" +) + +func walletAddAddressesCmd() *cobra.Command { + walletAddAddressesCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "walletAddAddresses [wallet]", + Short: "Generate additional addresses for a deterministic, bip44 or xpub wallet", + Long: `Generate additional addresses for a deterministic, bip44 or xpub wallet. + Addresses are generated according to the wallet type's generation mechanism. + + Warning: if you generate long (over 20) sequences of empty addresses and use + a later address this can cause the wallet history scanner to miss your addresses, + if you load the wallet from seed elsewhere. In that case, you'll have to manually + generate addresses to cover the gap of unused addresses in the sequence. + + BIP44 wallets generate their addresses on the external (0'/0) chain. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered from the + history log. If you do not include the "-p" option you will be prompted to + enter your password after you enter your command.`, + RunE: generateAddrs, + } + + walletAddAddressesCmd.Flags().Uint64P("num", "n", 1, "Number of addresses to generate") + walletAddAddressesCmd.Flags().StringP("password", "p", "", "wallet password") + walletAddAddressesCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format") + walletAddAddressesCmd.Flags().StringP("private-keys", "", "", "wallet private keys for collection wallet") + + return walletAddAddressesCmd +} + +func generateAddrs(c *cobra.Command, args []string) error { + // get number of address that are need to be generated. + var opts []wallet.Option + jsonFmt, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + wltID := args[0] + + // get the wallet to check if it is encrypted + wlt, err := apiClient.Wallet(wltID) + if err != nil { + return err + } + + switch wlt.Meta.Type { + case wallet.WalletTypeCollection: + s, err := c.Flags().GetString("private-keys") + if err != nil { + return err + } + privateKeys, err := wallet.ParsePrivateKeys(s) + if err != nil { + return err + } + opts = append(opts, wallet.OptionCollectionPrivateKeys(privateKeys)) + default: + num, err := c.Flags().GetUint64("num") + if err != nil { + return err + } + + if num == 0 { + return errors.New("-n must > 0") + } + + opts = append(opts, wallet.OptionGenerateN(num)) + } + + var pwd []byte + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + if wlt.Meta.Encrypted && wlt.Meta.Type != wallet.WalletTypeBip44 { + pwd, err = pr.Password() + if err != nil { + return err + } + } + + addrs, err := apiClient.NewWalletAddress(wltID, string(pwd), opts...) + if err != nil { + return err + } + + if jsonFmt { + s, err := FormatAddressesAsJSON(addrs) + if err != nil { + return err + } + fmt.Println(s) + } else { + fmt.Println(FormatAddressesAsJoinedArray(addrs)) + } + + return nil +} + +// GenerateAddressesInFile generates addresses in given wallet file +func GenerateAddressesInFile(walletFile string, num uint64, pr PasswordReader) ([]cipher.Addresser, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + genAddrsInWallet := func(w wallet.Wallet, n uint64) ([]cipher.Addresser, error) { + return w.GenerateAddresses(wallet.OptionGenerateN(n)) + } + + if wlt.IsEncrypted() { + genAddrsInWallet = func(w wallet.Wallet, n uint64) ([]cipher.Addresser, error) { + password, err := pr.Password() + if err != nil { + return nil, err + } + + var addrs []cipher.Addresser + if err := wallet.GuardUpdate(w, password, func(wlt wallet.Wallet) error { + var err error + addrs, err = wlt.GenerateAddresses(wallet.OptionGenerateN(n)) + return err + }); err != nil { + return nil, err + } + + return addrs, nil + } + } + + addrs, err := genAddrsInWallet(wlt, num) + if err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + if err := wallet.Save(wlt, dir); err != nil { + return nil, WalletSaveError{err} + } + + return addrs, nil +} + +// FormatAddressesAsJSON converts []cipher.Address to strings and formats the array into a standard JSON object wrapper +func FormatAddressesAsJSON(addrs []string) (string, error) { + d, err := formatJSON(struct { + Addresses []string `json:"addresses"` + }{ + Addresses: addrs, + }) + + if err != nil { + return "", err + } + + return string(d), nil +} + +// FormatAddressesAsJoinedArray converts []cipher.Address to strings and concatenates them with a comma +func FormatAddressesAsJoinedArray(addrs []string) string { + return strings.Join(addrs, ",") +} + +// AddressesToStrings converts []cipher.Address to []string +func AddressesToStrings(addrs []cipher.Addresser) []string { + if addrs == nil { + return nil + } + + addrsStr := make([]string, len(addrs)) + for i, a := range addrs { + addrsStr[i] = a.String() + } + + return addrsStr +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/generate_wallet.go b/vendor/github.com/skycoin/skycoin/src/cli/generate_wallet.go new file mode 100644 index 0000000000..ed2563b276 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/generate_wallet.go @@ -0,0 +1,523 @@ +package cli + +import ( + "encoding/hex" + "errors" + "fmt" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/bip39" + "github.com/skycoin/skycoin/src/cipher/bip44" + secp256k1 "github.com/skycoin/skycoin/src/cipher/secp256k1-go" + "github.com/skycoin/skycoin/src/wallet" +) + +const ( + // AlphaNumericSeedLength is the size of generated alphanumeric seeds, in bytes + AlphaNumericSeedLength = 64 +) + +func walletCreateCmd() *cobra.Command { + walletCreateCmd := &cobra.Command{ + Use: "walletCreate [label]", + Short: "Create a new wallet", + Long: `Create a new wallet. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered + from the history log. If you do not include the "-p" option you will + be prompted to enter your password after you enter your command. + + All results are returned in JSON format in addition to being written to the specified filename.`, + SilenceUsage: true, + RunE: generateWalletHandler, + } + + walletCreateCmd.Flags().StringP("label", "l", "", "Wallet label used to identify your wallet") + walletCreateCmd.Flags().BoolP("random", "r", false, "A random alpha numeric seed will be generated.") + walletCreateCmd.Flags().BoolP("mnemonic", "m", false, "A mnemonic seed consisting of 12 dictionary words will be generated") + walletCreateCmd.Flags().Uint64P("wordcount", "w", 12, "Number of seed words to use for mnemonic. Must be 12, 15, 18, 21 or 24") + walletCreateCmd.Flags().StringP("seed", "s", "", "Your seed") + walletCreateCmd.Flags().StringP("seed-passphrase", "", "", "Seed passphrase (bip44 wallets only)") + walletCreateCmd.Flags().Uint32P("bip44-coin", "", uint32(bip44.CoinTypeSkycoin), "BIP44 coin type") + walletCreateCmd.Flags().Uint64P("num", "n", 1, `Number of addresses to generate.`) + walletCreateCmd.Flags().Uint64P("scan", "", 1, `Number of addresses to scan ahead for balances.`) + walletCreateCmd.Flags().StringP("type", "t", wallet.WalletTypeDeterministic, "Wallet type. Types are \"collection\", \"deterministic\", \"bip44\" or \"xpub\"") + walletCreateCmd.Flags().BoolP("encrypt", "e", true, "Create encrypted wallet.") + walletCreateCmd.Flags().StringP("password", "p", "", "Wallet password") + walletCreateCmd.Flags().StringP("xpub", "", "", "xpub key for \"xpub\" type wallets") + walletCreateCmd.Flags().StringP("private-keys", "", "", "Collection private keys") + + return walletCreateCmd +} + +func generateWalletHandler(c *cobra.Command, _ []string) error { + label, err := c.Flags().GetString("label") + if err != nil { + return err + } + + if label == "" { + return errors.New("label must not be empty") + } + + scan, err := c.Flags().GetUint64("scan") + if err != nil { + return err + } + if scan == 0 { + return errors.New("scan must be > 0") + } + + // get number of address that are need to be generated + num, err := c.Flags().GetUint64("num") + if err != nil { + return err + } + if num == 0 { + return errors.New("-n must > 0") + } + + // set scan number to 1 when generate num is greater than scan number to avoid + // unnecessary addresses scanning. + if num >= scan { + scan = 1 + } + + s := c.Flag("seed").Value.String() + random, err := c.Flags().GetBool("random") + if err != nil { + return err + } + + mnemonic, err := c.Flags().GetBool("mnemonic") + if err != nil { + return err + } + + wordCount, err := c.Flags().GetUint64("wordcount") + if err != nil { + return err + } + + if !mnemonic && c.Flags().Changed("wordcount") { + return errors.New("-m must also be set when using -wordcount") + } + + encrypt, err := c.Flags().GetBool("encrypt") + if err != nil { + return err + } + + walletType, err := c.Flags().GetString("type") + if err != nil { + return err + } + if !wallet.IsValidWalletType(walletType) { + return wallet.ErrInvalidWalletType + } + + var bip44Coin *bip44.CoinType + if c.Flags().Changed("bip44-coin") { + bip44CoinInt, err := c.Flags().GetUint32("bip44-coin") + if err != nil { + return err + } + + c := bip44.CoinType(bip44CoinInt) + bip44Coin = &c + } + + xpub, err := c.Flags().GetString("xpub") + if err != nil { + return err + } + + var ( + sd string + collectionPrivateKeys string + ) + switch walletType { + case wallet.WalletTypeBip44: + var err error + sd, err = parseBip44WalletSeedOptions(s, random, mnemonic, wordCount) + if err != nil { + return err + } + + case wallet.WalletTypeDeterministic: + var err error + sd, err = parseDeterministicWalletSeedOptions(s, random, mnemonic, wordCount) + if err != nil { + return err + } + + case wallet.WalletTypeCollection: + if s != "" || random || mnemonic { + return fmt.Errorf("%q type wallets do not use seeds", walletType) + } + if c.Flags().Changed("num") { + return fmt.Errorf("%q type wallets do not support address generation", walletType) + } + num = 0 + + // try to get private keys + var err error + collectionPrivateKeys, err = c.Flags().GetString("private-keys") + if err != nil { + return err + } + _, err = wallet.ParsePrivateKeys(collectionPrivateKeys) + if err != nil { + return wallet.ErrInvalidPrivateKeys + } + + case wallet.WalletTypeXPub: + // xpub wallet does not support encryption + encrypt = false + if s != "" || random || mnemonic { + return fmt.Errorf("%q type wallets do not use seeds", walletType) + } + + default: + return fmt.Errorf("unhandled wallet type %q", walletType) + } + + seedPassphrase, err := c.Flags().GetString("seed-passphrase") + if err != nil { + return err + } + + var password []byte + if encrypt { + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + var err error + password, err = pr.Password() + if err != nil { + return err + } + } + + opts := api.CreateWalletOptions{ + Label: label, + Seed: sd, + SeedPassphrase: seedPassphrase, + Encrypt: encrypt, + Password: string(password), + Type: walletType, + Bip44Coin: bip44Coin, + ScanN: scan, + XPub: xpub, + CollectionPrivateKeys: collectionPrivateKeys, + } + + wlt, err := apiClient.CreateWallet(opts) + if err != nil { + return err + } + + id := wlt.Meta.Filename + + // check the address num + addrN := len(wlt.Entries) + if walletType == wallet.WalletTypeBip44 { + for _, e := range wlt.Entries { + if *e.Change == 1 { + addrN-- + } + } + } + + n := num - uint64(addrN) + if n > 0 { + _, err := apiClient.NewWalletAddress(id, string(password), wallet.OptionGenerateN(n)) + if err != nil { + return err + } + } + + wlt, err = apiClient.Wallet(id) + if err != nil { + return err + } + + return printJSON(wlt) +} + +func walletCreateTempCmd() *cobra.Command { + walletCreateTempCmd := &cobra.Command{ + Use: "walletCreateTemp", + Short: "Create a new temporary wallet", + Long: `Create a new temporary wallet. + + All results are returned in JSON format in addition to being written to the specified filename.`, + SilenceUsage: true, + RunE: generateWalletTempHandler, + } + + walletCreateTempCmd.Flags().StringP("label", "l", "", "Wallet label used to identify your wallet") + walletCreateTempCmd.Flags().BoolP("random", "r", false, "A random alpha numeric seed will be generated.") + walletCreateTempCmd.Flags().BoolP("mnemonic", "m", false, "A mnemonic seed consisting of 12 dictionary words will be generated") + walletCreateTempCmd.Flags().Uint64P("wordcount", "w", 12, "Number of seed words to use for mnemonic. Must be 12, 15, 18, 21 or 24") + walletCreateTempCmd.Flags().StringP("seed", "s", "", "Your seed") + walletCreateTempCmd.Flags().Uint32P("bip44-coin", "", uint32(bip44.CoinTypeSkycoin), "BIP44 coin type") + walletCreateTempCmd.Flags().Uint64P("num", "n", 1, `Number of addresses to generate.`) + walletCreateTempCmd.Flags().Uint64P("scan", "", 1, `Number of addresses to scan ahead for balances.`) + walletCreateTempCmd.Flags().StringP("type", "t", wallet.WalletTypeDeterministic, "Wallet type. Types are \"collection\", \"deterministic\", \"bip44\" or \"xpub\"") + walletCreateTempCmd.Flags().StringP("xpub", "", "", "xpub key for \"xpub\" type wallets") + walletCreateTempCmd.Flags().StringP("private-keys", "", "", "Collection private keys") + + return walletCreateTempCmd +} + +func generateWalletTempHandler(c *cobra.Command, _ []string) error { + label, err := c.Flags().GetString("label") + if err != nil { + return err + } + + if label == "" { + return errors.New("label must not be empty") + } + + scan, err := c.Flags().GetUint64("scan") + if err != nil { + return err + } + if scan == 0 { + return errors.New("scan must be > 0") + } + + // get number of address that are need to be generated + num, err := c.Flags().GetUint64("num") + if err != nil { + return err + } + if num == 0 { + return errors.New("-n must > 0") + } + + // set scan number as 1 when generate num is greater than scan number to avoid + // unnecessary addresses scanning for API. + if num >= scan { + scan = 1 + } + + s := c.Flag("seed").Value.String() + random, err := c.Flags().GetBool("random") + if err != nil { + return err + } + + mnemonic, err := c.Flags().GetBool("mnemonic") + if err != nil { + return err + } + + wordCount, err := c.Flags().GetUint64("wordcount") + if err != nil { + return err + } + + if !mnemonic && c.Flags().Changed("wordcount") { + return errors.New("-m must also be set when using -wordcount") + } + + walletType, err := c.Flags().GetString("type") + if err != nil { + return err + } + if !wallet.IsValidWalletType(walletType) { + return wallet.ErrInvalidWalletType + } + + var bip44Coin *bip44.CoinType + if c.Flags().Changed("bip44-coin") { + bip44CoinInt, err := c.Flags().GetUint32("bip44-coin") + if err != nil { + return err + } + + c := bip44.CoinType(bip44CoinInt) + bip44Coin = &c + } + + xpub, err := c.Flags().GetString("xpub") + if err != nil { + return err + } + + var ( + sd string + collectionPrivateKeys string + ) + + switch walletType { + case wallet.WalletTypeBip44: + var err error + sd, err = parseBip44WalletSeedOptions(s, random, mnemonic, wordCount) + if err != nil { + return err + } + + case wallet.WalletTypeDeterministic: + var err error + sd, err = parseDeterministicWalletSeedOptions(s, random, mnemonic, wordCount) + if err != nil { + return err + } + + case wallet.WalletTypeCollection: + if s != "" || random || mnemonic { + return fmt.Errorf("%q type wallets do not use seeds", walletType) + } + if c.Flags().Changed("num") { + return fmt.Errorf("%q type wallets do not support address generation", walletType) + } + num = 0 + + var err error + collectionPrivateKeys, err = c.Flags().GetString("private-keys") + if err != nil { + return err + } + case wallet.WalletTypeXPub: + if s != "" || random || mnemonic { + return fmt.Errorf("%q type wallets do not use seeds", walletType) + } + + default: + return fmt.Errorf("unhandled wallet type %q", walletType) + } + + opts := api.CreateWalletOptions{ + Label: label, + Seed: sd, + Type: walletType, + Bip44Coin: bip44Coin, + ScanN: scan, + XPub: xpub, + CollectionPrivateKeys: collectionPrivateKeys, + } + + wlt, err := apiClient.CreateWalletTemp(opts) + if err != nil { + return err + } + + id := wlt.Meta.Filename + + // check the address num + addrN := len(wlt.Entries) + if walletType == wallet.WalletTypeBip44 { + for _, e := range wlt.Entries { + if *e.Change == 1 { + addrN-- + } + } + } + + n := num - uint64(addrN) + if n > 0 { + _, err := apiClient.NewWalletAddress(id, "", wallet.OptionGenerateN(n)) + if err != nil { + return err + } + } + + wlt, err = apiClient.Wallet(id) + if err != nil { + return err + } + + return printJSON(wlt) +} + +// wordCountToEntropy maps a mnemonic word count to its entropy size in bits +func wordCountToEntropy(wc uint64) (int, error) { + switch wc { + case 12: + return 128, nil + case 15: + return 160, nil + case 18: + return 192, nil + case 21: + return 224, nil + case 24: + return 256, nil + default: + return 0, errors.New("word count must be 12, 15, 18, 21 or 24") + } +} + +func newMnemomic(wc uint64) (string, error) { + entropySize, err := wordCountToEntropy(wc) + if err != nil { + return "", err + } + e, err := bip39.NewEntropy(entropySize) + if err != nil { + return "", err + } + return bip39.NewMnemonic(e) +} + +func parseBip44WalletSeedOptions(s string, r, m bool, wc uint64) (string, error) { + if s != "" && (r || m) { + return "", errors.New("-r and -m can't be used with -s") + } + + if r { + return "", errors.New("-r can't be used for bip44 wallets") + } + + if m || s == "" { + var err error + s, err = newMnemomic(wc) + if err != nil { + return "", err + } + } + + if err := bip39.ValidateMnemonic(s); err != nil { + return "", fmt.Errorf("seed must be a valid bip39 mnemonic: %v", err) + } + + return s, nil +} + +func parseDeterministicWalletSeedOptions(s string, r, m bool, wc uint64) (string, error) { + if s != "" { + // 111, 101, 110 + if r || m { + return "", errors.New("seed already specified, must not use -r or -m again") + } + // 100 + return s, nil + } + + // 011 + if r && m { + return "", errors.New("for -r and -m, only one option can be used") + } + + // 010 + if r { + return MakeAlphanumericSeed(), nil + } + + // 001, 000 + return newMnemomic(wc) +} + +// PUBLIC + +// MakeAlphanumericSeed creates a random seed with AlphaNumericSeedLength bytes and hex encodes it +func MakeAlphanumericSeed() string { + seedRaw := cipher.SumSHA256(secp256k1.RandByte(AlphaNumericSeedLength)) + return hex.EncodeToString(seedRaw[:]) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/last_blocks.go b/vendor/github.com/skycoin/skycoin/src/cli/last_blocks.go new file mode 100644 index 0000000000..947d8f8263 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/last_blocks.go @@ -0,0 +1,37 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" +) + +func lastBlocksCmd() *cobra.Command { + return &cobra.Command{ + Short: "Displays the content of the most recently N generated blocks", + Use: "lastBlocks [numberOfBlocks]", + Args: cobra.MaximumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getLastBlocks, + } +} + +func getLastBlocks(_ *cobra.Command, args []string) error { + n := uint64(1) + if len(args) > 0 { + var err error + n, err = strconv.ParseUint(args[0], 10, 64) + if err != nil { + return fmt.Errorf("invalid block number, %s", err) + } + } + + blocks, err := apiClient.LastBlocks(n) + if err != nil { + return err + } + + return printJSON(blocks) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/list_addrs.go b/vendor/github.com/skycoin/skycoin/src/cli/list_addrs.go new file mode 100644 index 0000000000..a53cbebe35 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/list_addrs.go @@ -0,0 +1,47 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func listAddressesCmd() *cobra.Command { + return &cobra.Command{ + Short: "Lists all addresses in a given wallet", + Use: "listAddresses [wallet]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: listAddresses, + } +} + +func listAddresses(_ *cobra.Command, args []string) error { + addrs, err := getWalletAddresses(args[0]) + if err != nil { + return err + } + + s, err := FormatAddressesAsJSON(addrs) + if err != nil { + return err + } + + fmt.Println(s) + + return nil +} + +func getWalletAddresses(id string) ([]string, error) { + wlt, err := apiClient.Wallet(id) + if err != nil { + return nil, err + } + + var addrs []string + for _, e := range wlt.Entries { + addrs = append(addrs, e.Address) + } + return addrs, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/list_wallets.go b/vendor/github.com/skycoin/skycoin/src/cli/list_wallets.go new file mode 100644 index 0000000000..03f51419a1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/list_wallets.go @@ -0,0 +1,56 @@ +package cli + +import ( + "github.com/spf13/cobra" +) + +// WalletEntry represents an entry in a wallet file +type WalletEntry struct { + Name string `json:"name"` + Label string `json:"label"` + AddressNum int `json:"address_num"` +} + +func listWalletsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Lists all wallets stored in the wallet directory", + Use: "listWallets", + Long: `Lists all wallets stored in the wallet directory. + + The [wallet dir] argument is optional. If not provided, defaults to $DATA_DIR/wallets`, + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.MaximumNArgs(0), + RunE: listWallets, + } +} + +func listWallets(_ *cobra.Command, _ []string) error { + fdn, err := apiClient.WalletFolderName() + if err != nil { + return err + } + + var wlts = struct { + Directory string `json:"directory"` + Wallets []WalletEntry `json:"wallets"` + }{ + Directory: fdn.Address, + Wallets: []WalletEntry{}, + } + + wltsRsp, err := apiClient.Wallets() + if err != nil { + return err + } + + for _, w := range wltsRsp { + wlts.Wallets = append(wlts.Wallets, WalletEntry{ + Name: w.Meta.Filename, + Label: w.Meta.Label, + AddressNum: len(w.Entries), + }) + } + + return printJSON(wlts) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/outputs.go b/vendor/github.com/skycoin/skycoin/src/cli/outputs.go new file mode 100644 index 0000000000..445fddafac --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/outputs.go @@ -0,0 +1,76 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/readable" +) + +func walletOutputsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Display outputs of specific wallet", + Use: "walletOutputs [wallet]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: getWalletOutputsCmd, + } +} + +func addressOutputsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Display outputs of specific addresses", + Use: "addressOutputs [address list]", + Long: `Display outputs of specific addresses, join multiple addresses with space, + example: addressOutputs $addr1 $addr2 $addr3`, + Args: cobra.MinimumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getAddressOutputsCmd, + } +} + +// OutputsResult the output json format +type OutputsResult struct { + Outputs readable.UnspentOutputsSummary `json:"outputs"` +} + +func getWalletOutputsCmd(_ *cobra.Command, args []string) error { + addrs, err := getWalletAddresses(args[0]) + if err != nil { + return err + } + + outputs, err := apiClient.OutputsForAddresses(addrs) + if err != nil { + return err + } + + return printJSON(OutputsResult{ + Outputs: *outputs, + }) +} + +func getAddressOutputsCmd(_ *cobra.Command, args []string) error { + addrs := make([]string, len(args)) + + var err error + for i := 0; i < len(args); i++ { + addrs[i] = args[i] + if _, err = cipher.DecodeBase58Address(addrs[i]); err != nil { + return fmt.Errorf("invalid address: %v, err: %v", addrs[i], err) + } + } + + outputs, err := apiClient.OutputsForAddresses(addrs) + if err != nil { + return err + } + + return printJSON(OutputsResult{ + Outputs: *outputs, + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/richlist.go b/vendor/github.com/skycoin/skycoin/src/cli/richlist.go new file mode 100644 index 0000000000..71ffeb73f1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/richlist.go @@ -0,0 +1,58 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/api" +) + +func richlistCmd() *cobra.Command { + return &cobra.Command{ + Short: "Get skycoin richlist", + Long: "Returns top N address (default 20) balances (based on unspent outputs). Optionally include distribution addresses (exluded by default).", + Use: "richlist [top N addresses (20 default)] [include distribution addresses (false default)]", + Args: cobra.MaximumNArgs(2), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getRichlist, + } +} + +func getRichlist(_ *cobra.Command, args []string) error { + // default values + num := "20" + dist := "false" + + switch len(args) { + case 1: + num = args[0] + case 2: + num = args[0] + dist = args[1] + } + + n, err := strconv.Atoi(num) + if err != nil { + return fmt.Errorf("invalid number of addresses, %s", err) + } + + d, err := strconv.ParseBool(dist) + if err != nil { + return fmt.Errorf("invalid (bool) flag for include distribution addresses, %s", err) + } + + params := &api.RichlistParams{ + N: n, + IncludeDistribution: d, + } + + richlist, err := apiClient.Richlist(params) + if err != nil { + return err + } + + return printJSON(richlist) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/scan_addrs.go b/vendor/github.com/skycoin/skycoin/src/cli/scan_addrs.go new file mode 100644 index 0000000000..a5bd1c34a6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/scan_addrs.go @@ -0,0 +1,110 @@ +package cli + +import ( + "errors" + "fmt" + "os" + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/wallet" +) + +func walletScanAddressesCmd() *cobra.Command { + walletScanAddressesCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "walletScanAddresses [wallet]", + Short: "Scan addresses ahead for deterministic, bip44 or xpub wallet", + Long: `Scan addresses ahead for deterministic, bip44 or xpub wallet. + + The argument of [wallet] could be a wallet file name or a fullpath of the wallet + file. For example, both foo.wlt and $HOME/.skycoin/wallets/foo.wlt could be resolved. + + Warning: if you generate long (over 20) sequences of empty addresses and use + a later address this can cause the wallet history scanner to miss your addresses, + if you load the wallet from seed elsewhere. In that case, you'll have to manually + generate addresses to cover the gap of unused addresses in the sequence. + + BIP44 wallets generate their addresses on the external (0'/0) chain. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered from the + history log. If you do not include the "-p" option you will be prompted to + enter your password after you enter your command.`, + RunE: runScanAddresses, + SilenceUsage: true, + } + + walletScanAddressesCmd.Flags().Uint64P("num", "n", 20, "Number of addresses to scan ahead") + walletScanAddressesCmd.Flags().StringP("password", "p", "", "wallet password") + walletScanAddressesCmd.Flags().BoolP("json", "j", false, "Returns the results in json format") + + return walletScanAddressesCmd +} + +func runScanAddresses(c *cobra.Command, args []string) error { + // get the number of addresses to scan ahead + num, err := c.Flags().GetUint64("num") + if err != nil { + return err + } + + if num == 0 { + return errors.New("--num or -n must be > 0") + } + + jsonFmt, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + wltFile := args[0] + dir, id := filepath.Split(wltFile) + if dir != "" { + if _, err := os.Stat(wltFile); os.IsNotExist(err) { + return fmt.Errorf("wallet file %s does not exist", wltFile) + } + } + + rsp, err := apiClient.Wallet(id) + if err != nil { + return err + } + + var password []byte + // bip44 can add new addresses without unlocking. + if rsp.Meta.Type != wallet.WalletTypeBip44 { + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + if rsp.Meta.Encrypted { + var err error + password, err = pr.Password() + if err != nil { + return err + } + defer func() { + password = []byte("") + }() + } + } + + addrs, err := apiClient.ScanWalletAddresses(id, int(num), string(password)) + if err != nil { + return err + } + + if jsonFmt { + var obj = struct { + Addresses []string `json:"addresses"` + }{ + Addresses: addrs, + } + + return printJSON(obj) + } + + for _, addr := range addrs { + fmt.Println(addr) + } + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/send.go b/vendor/github.com/skycoin/skycoin/src/cli/send.go new file mode 100644 index 0000000000..a4a90578d9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/send.go @@ -0,0 +1,67 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func sendCmd() *cobra.Command { + sendCmd := &cobra.Command{ + Args: cobra.MinimumNArgs(1), + Short: "Send skycoin from a wallet or an address to a recipient address", + Use: "send [wallet] [to address] [amount]", + Long: `Send skycoin from a wallet or an address to a recipient address. + + Note: the [amount] argument is the coins you will spend, 1 coins = 1e6 droplets. + + The [to address] and [amount] arguments can be replaced with the --many/-m option. + + If you are sending from a wallet without specifying an address, + the transaction will use one or more of the addresses within the wallet. + + Use caution when using the “-p” command. If you have command history enabled + your wallet encryption password can be recovered from the history log. + If you do not include the “-p” option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + rawTxn, err := createRawTxnCmdHandler(c, args) + if err != nil { + printHelp(c) + return err + } + + txid, err := apiClient.InjectTransaction(rawTxn) + if err != nil { + return err + } + + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + if jsonOutput { + return printJSON(struct { + Txid string `json:"txid"` + }{ + Txid: txid, + }) + } + + fmt.Printf("txid:%s\n", txid) + return nil + }, + } + + sendCmd.Flags().StringP("from-address", "a", "", "From address in wallet") + sendCmd.Flags().StringP("change-address", "c", "", `Specify the change address. +Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets).`) + sendCmd.Flags().StringP("many", "m", "", `use JSON string to set multiple receive addresses and coins, +example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]'`) + sendCmd.Flags().StringP("password", "p", "", "Wallet password") + sendCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + sendCmd.Flags().String("csv", "", "CSV file containing addresses and amounts to send") + + return sendCmd +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/show_seed.go b/vendor/github.com/skycoin/skycoin/src/cli/show_seed.go new file mode 100644 index 0000000000..dcd8db3eb2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/show_seed.go @@ -0,0 +1,91 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func showSeedCmd() *cobra.Command { + showSeedCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "showSeed [wallet]", + Short: "Show wallet seed and seed passphrase", + Long: `Print the seed and seed passphrase from a wallet. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + w := args[0] + + password, err := c.Flags().GetString("password") + if err != nil { + return err + } + + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(password)) + seed, seedPassphrase, err := getSeed(w, pr) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + if jsonOutput { + v := struct { + Seed string `json:"seed"` + SeedPassphrase string `json:"seed_passphrase,omitempty"` + }{ + Seed: seed, + SeedPassphrase: seedPassphrase, + } + + return printJSON(v) + } + + fmt.Println(seed) + if seedPassphrase != "" { + fmt.Println(seedPassphrase) + } + return nil + }, + } + + showSeedCmd.Flags().StringP("password", "p", "", "Wallet password") + showSeedCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + + return showSeedCmd +} + +func getSeed(walletID string, pr PasswordReader) (string, string, error) { + wlt, err := apiClient.Wallet(walletID) + if err != nil { + return "", "", err + } + + var pwd []byte + if wlt.Meta.Encrypted { + pwd, err = pr.Password() + if err != nil { + return "", "", err + } + } + + sr, err := apiClient.WalletSeed(walletID, string(pwd)) + if err != nil { + return "", "", err + } + + return sr.Seed, sr.SeedPassphrase, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/status.go b/vendor/github.com/skycoin/skycoin/src/cli/status.go new file mode 100644 index 0000000000..fd93d202d5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/status.go @@ -0,0 +1,52 @@ +package cli + +import ( + cobra "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/api" +) + +// StatusResult is printed by cli status command +type StatusResult struct { + Status api.HealthResponse `json:"status"` + Config ConfigStatus `json:"cli_config"` +} + +// ConfigStatus contains the configuration parameters loaded by the cli +type ConfigStatus struct { + RPCAddress string `json:"webrpc_address"` +} + +func statusCmd() *cobra.Command { + return &cobra.Command{ + Use: "status", + Short: "Check the status of current Skycoin node", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.NoArgs, + RunE: func(_ *cobra.Command, _ []string) error { + status, err := apiClient.Health() + if err != nil { + return err + } + + return printJSON(StatusResult{ + Status: *status, + Config: ConfigStatus{ + RPCAddress: cliConfig.RPCAddress, + }, + }) + }, + } +} + +func showConfigCmd() *cobra.Command { + return &cobra.Command{ + Use: "showConfig", + Short: "Show cli configuration", + DisableFlagsInUseLine: true, + RunE: func(_ *cobra.Command, _ []string) error { + return printJSON(cliConfig) + }, + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/transaction.go b/vendor/github.com/skycoin/skycoin/src/cli/transaction.go new file mode 100644 index 0000000000..08596ffab3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/transaction.go @@ -0,0 +1,405 @@ +package cli + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "strconv" + + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/wallet" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/readable" + + "github.com/spf13/cobra" +) + +// TxnResult wraps readable.TransactionWithStatus +type TxnResult struct { + Transaction *readable.TransactionWithStatus `json:"transaction"` +} + +func transactionCmd() *cobra.Command { + return &cobra.Command{ + Short: "Show detail info of specific transaction", + Use: "transaction [transaction id]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + txid := args[0] + if txid == "" { + return errors.New("txid is empty") + } + + // validate the txid + _, err := cipher.SHA256FromHex(txid) + if err != nil { + return errors.New("invalid txid") + } + + txn, err := apiClient.Transaction(txid) + if err != nil { + return err + } + + return printJSON(TxnResult{ + Transaction: txn, + }) + }, + } +} + +func decodeRawTxnCmd() *cobra.Command { + return &cobra.Command{ + Short: "Decode raw transaction", + Use: "decodeRawTransaction [raw transaction]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + txn, err := coin.DeserializeTransactionHex(args[0]) + if err != nil { + return fmt.Errorf("invalid raw transaction: %v", err) + } + + // Assume the transaction is not malformed and if it has no inputs + // that it is the genesis block's transaction + isGenesis := len(txn.In) == 0 + rTxn, err := readable.NewTransaction(txn, isGenesis) + if err != nil { + return err + } + + return printJSON(rTxn) + }, + } +} + +func encodeJSONTxnCmd() *cobra.Command { + cmd := &cobra.Command{ + Short: "Encode JSON transaction", + Use: "encodeJsonTransaction [file path or -]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: func(c *cobra.Command, args []string) error { + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + jsonFilePath := args[0] + var jsonFile *os.File + if jsonFilePath == "-" { + jsonFile = os.Stdin + err = nil + jsonFilePath = "" + } else { + jsonFile, err = os.Open(jsonFilePath) + } + if err != nil { + return fmt.Errorf("open file failed %s: %v", jsonFilePath, err) + } + var rTxn readable.Transaction + err = json.NewDecoder(jsonFile).Decode(&rTxn) + if err != nil { + return fmt.Errorf("invalid JSON transaction: %v", err) + } + + // fixHashes recomputes the txn hashes + // the recomputation of hash is needed when txn info for e.g. the sig is changed + fixHashes, err := c.Flags().GetBool("fix") + if err != nil { + return err + } + + if fixHashes { + err = recomputeHashes(&rTxn) + if err != nil { + return err + } + } + + txn, err := readableToCreatedTransaction(&rTxn).ToTransaction() + if err != nil { + return err + } + rawTxn, err := txn.SerializeHex() + if err != nil { + return err + } + if jsonOutput { + return printJSON(struct { + RawTx string `json:"rawtx"` + }{ + RawTx: rawTxn, + }) + } + fmt.Println(rawTxn) + return nil + }, + } + cmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + cmd.Flags().BoolP("fix", "f", false, "Recompute transaction inner and outer hashes") + return cmd +} + +func readableToCreatedTransaction(rTxn *readable.Transaction) *api.CreatedTransaction { + inputs := make([]api.CreatedTransactionInput, len(rTxn.In)) + outputs := make([]api.CreatedTransactionOutput, len(rTxn.Out)) + for i, rIn := range rTxn.In { + inputs[i] = api.CreatedTransactionInput{ + UxID: rIn, + } + } + for i, rOut := range rTxn.Out { + outputs[i] = api.CreatedTransactionOutput{ + UxID: rOut.Hash, + Address: rOut.Address, + Coins: rOut.Coins, + Hours: strconv.FormatUint(rOut.Hours, 10), + } + } + cTxn := api.CreatedTransaction{ + Length: rTxn.Length, + Type: rTxn.Type, + TxID: rTxn.Hash, + InnerHash: rTxn.InnerHash, + Fee: "", + Sigs: rTxn.Sigs[:], + In: inputs, + Out: outputs, + } + return &cTxn +} + +func recomputeHashes(rTxn *readable.Transaction) error { + t := coin.Transaction{} + + t.Length = rTxn.Length + t.Type = rTxn.Type + + var err error + + sigs := make([]cipher.Sig, len(rTxn.Sigs)) + for i, s := range rTxn.Sigs { + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return err + } + } + + t.Sigs = sigs + + in := make([]cipher.SHA256, len(rTxn.In)) + for i, UxID := range rTxn.In { + in[i], err = cipher.SHA256FromHex(UxID) + if err != nil { + return err + } + } + + t.In = in + + out := make([]coin.TransactionOutput, len(rTxn.Out)) + for i, o := range rTxn.Out { + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return err + } + + coins, err := droplet.FromString(o.Coins) + if err != nil { + return err + } + + out[i] = coin.TransactionOutput{ + Address: addr, + Coins: coins, + Hours: o.Hours, + } + } + + t.Out = out + + // recompute inner hash + rTxn.InnerHash = t.HashInner().Hex() + t.InnerHash, err = cipher.SHA256FromHex(rTxn.InnerHash) + if err != nil { + return err + } + + // recompute txid + rTxn.Hash = t.Hash().Hex() + + return nil +} + +func addressTransactionsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Show detail for transaction associated with one or more specified addresses", + Use: "addressTransactions [address list]", + Long: `Display transactions for specific addresses, separate multiple addresses with a space, + example: addressTransactions addr1 addr2 addr3`, + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getAddressTransactionsCmd, + } +} + +func getAddressTransactionsCmd(c *cobra.Command, args []string) error { + // Build the list of addresses from the command line arguments + addrs := make([]string, len(args)) + var err error + for i := 0; i < len(args); i++ { + addrs[i] = args[i] + if _, err = cipher.DecodeBase58Address(addrs[i]); err != nil { + return fmt.Errorf("invalid address: %v, err: %v", addrs[i], err) + } + } + + // If one or more addresses have been provided, request their transactions - otherwise report an error + if len(addrs) > 0 { + outputs, err := apiClient.TransactionsVerbose(addrs) + if err != nil { + return err + } + + return printJSON(outputs) + } + + return fmt.Errorf("at least one address must be specified. Example: %s addr1 addr2 addr3", c.Name()) +} + +func verifyTransactionCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify if the specific transaction is spendable", + Use: "verifyTransaction [encoded transaction]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.MaximumNArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + encodedTxn := args[0] + if encodedTxn == "" { + return errors.New("transaction is empty") + } + + _, err := apiClient.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: encodedTxn, + }) + if err != nil { + return err + } + + fmt.Println("transaction is spendable") + + return nil + }, + } +} + +func pendingTransactionsCmd() *cobra.Command { + pendingTxnsCmd := &cobra.Command{ + Short: "Get all unconfirmed transactions", + Use: "pendingTransactions", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.NoArgs, + RunE: func(c *cobra.Command, _ []string) error { + isVerbose, err := c.Flags().GetBool("verbose") + if err != nil { + return err + } + + if isVerbose { + pendingTxns, err := apiClient.PendingTransactionsVerbose() + if err != nil { + return err + } + + return printJSON(pendingTxns) + } + + pendingTxns, err := apiClient.PendingTransactions() + if err != nil { + return err + } + + return printJSON(pendingTxns) + }, + } + + pendingTxnsCmd.Flags().BoolP("verbose", "v", false, + `Require the transaction inputs to include the owner address, coins, hours and calculated hours. + The hours are the original hours the output was created with. + The calculated hours are calculated based upon the current system time, and provide an approximate + coin hour value of the output if it were to be confirmed at that instant.`) + + return pendingTxnsCmd +} + +func signTxnCmd() *cobra.Command { + signTxnCmd := &cobra.Command{ + Short: "Sign an unsigned transaction with specific wallet", + Use: "signTransaction [wallet] [raw transaction]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(2), + RunE: func(c *cobra.Command, args []string) error { + id := args[0] + rawTxn := args[1] + + // Decode the raw transaction to see if the transaction already signed + txn, err := coin.DeserializeTransactionHex(rawTxn) + if err != nil { + return err + } + + emptySig := cipher.Sig{} + if len(txn.Sigs) > 0 && txn.Sigs[0] != emptySig { + return fmt.Errorf("Transaction already signed") + } + + // Check if wallet is encrypted + req := api.WalletSignTransactionRequest{ + WalletID: id, + EncodedTransaction: rawTxn, + } + + // Load wallet to check if the wallet is encrypted + w, err := wallet.Load(id) + if err != nil { + return err + } + + // Read wallet password from terminal if it is encrypted + if w.IsEncrypted() { + v, err := readPasswordFromTerminal() + if err != nil { + return err + } + req.Password = string(v) + defer func() { + // Wipe out the password from memory + v = []byte{} + req.Password = "" + }() + } + + // Send transaction signing request + signedTxn, err := apiClient.WalletSignTransaction(req) + if err != nil { + return err + } + + return printJSON(signedTxn) + }, + } + + return signTxnCmd +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/verify_address.go b/vendor/github.com/skycoin/skycoin/src/cli/verify_address.go new file mode 100644 index 0000000000..72cba32dc8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/verify_address.go @@ -0,0 +1,21 @@ +package cli + +import ( + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/cipher" +) + +func verifyAddressCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify a skycoin address", + Use: "verifyAddress [skycoin address]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: func(_ *cobra.Command, args []string) error { + _, err := cipher.DecodeBase58Address(args[0]) + return err + }, + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/version.go b/vendor/github.com/skycoin/skycoin/src/cli/version.go new file mode 100644 index 0000000000..7cb5af1757 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/version.go @@ -0,0 +1,50 @@ +package cli + +import ( + "fmt" + "reflect" + + "github.com/spf13/cobra" +) + +func versionCmd() *cobra.Command { + versionCmd := &cobra.Command{ + Use: "version", + Short: "List the current version of Skycoin components", + Args: cobra.NoArgs, + SilenceUsage: true, + RunE: func(c *cobra.Command, _ []string) error { + var ver = struct { + Skycoin string `json:"skycoin"` + Cli string `json:"cli"` + RPC string `json:"rpc"` + Wallet string `json:"wallet"` + }{ + Version, + Version, + Version, + Version, + } + + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + if jsonOutput { + return printJSON(ver) + } + + v := reflect.ValueOf(ver) + t := reflect.TypeOf(ver) + for i := 0; i < v.NumField(); i++ { + fmt.Printf("%s:%v\n", t.Field(i).Tag.Get("json"), v.Field(i).Interface()) + } + + return nil + }, + } + + versionCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format") + + return versionCmd +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/wallet_history.go b/vendor/github.com/skycoin/skycoin/src/cli/wallet_history.go new file mode 100644 index 0000000000..6963ece9d8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/wallet_history.go @@ -0,0 +1,229 @@ +package cli + +import ( + "errors" + "fmt" + + "time" + + "sort" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/readable" + "github.com/skycoin/skycoin/src/util/droplet" +) + +// AddrHistory represents a transactional event for an address +type AddrHistory struct { + BlockSeq uint64 `json:"-"` + Txid string `json:"txid"` + Address string `json:"address"` + Amount string `json:"amount"` + Timestamp time.Time `json:"timestamp"` + Status int `json:"status"` + + coins uint64 +} + +type byTime []AddrHistory + +func (obt byTime) Less(i, j int) bool { + return obt[i].Timestamp.Unix() < obt[j].Timestamp.Unix() +} + +func (obt byTime) Swap(i, j int) { + obt[i], obt[j] = obt[j], obt[i] +} + +func (obt byTime) Len() int { + return len(obt) +} + +func walletHisCmd() *cobra.Command { + walletHisCmd := &cobra.Command{ + Short: "Display the transaction history of specific wallet. Requires skycoin node rpc.", + Use: "walletHistory [wallet]", + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: walletHistoryAction, + } + + return walletHisCmd +} + +func walletHistoryAction(_ *cobra.Command, args []string) error { + addrs, err := getWalletAddresses(args[0]) + if err != nil { + return err + } + + if len(addrs) == 0 { + return errors.New("Wallet is empty") + } + + // Get all the addresses' historical uxouts + var totalAddrHis []AddrHistory + for _, addr := range addrs { + uxouts, err := apiClient.AddressUxOuts(addr) + if err != nil { + return err + } + + addrHis, err := makeAddrHisArray(apiClient, addr, uxouts) + if err != nil { + return err + } + totalAddrHis = append(totalAddrHis, addrHis...) + } + + // Sort the uxouts by time ascending + sort.Sort(byTime(totalAddrHis)) + + return printJSON(totalAddrHis) +} + +func makeAddrHisArray(c *api.Client, addr string, uxOuts []readable.SpentOutput) ([]AddrHistory, error) { + if len(uxOuts) == 0 { + return nil, nil + } + + var addrHis, spentHis, realHis []AddrHistory + var spentBlkSeqMap = map[uint64]bool{} + + for _, u := range uxOuts { + amount, err := droplet.ToString(u.Coins) + if err != nil { + return nil, err + } + + addrHis = append(addrHis, AddrHistory{ + BlockSeq: u.SrcBkSeq, + Txid: u.SrcTx, + Address: addr, + Amount: amount, + Timestamp: time.Unix(int64(u.Time), 0).UTC(), + Status: 1, + coins: u.Coins, + }) + + // the SpentBlockSeq will be 0 if the uxout has not been spent yet. + if u.SpentBlockSeq != 0 { + spentBlkSeqMap[u.SpentBlockSeq] = true + spentHis = append(spentHis, AddrHistory{ + BlockSeq: u.SpentBlockSeq, + Address: addr, + Txid: u.SpentTxnID, + Amount: "-" + amount, + Status: 1, + coins: u.Coins, + }) + } + } + + if len(spentBlkSeqMap) > 0 { + spentBlkSeq := make([]uint64, 0, len(spentBlkSeqMap)) + for seq := range spentBlkSeqMap { + spentBlkSeq = append(spentBlkSeq, seq) + } + + getBlkTime, err := createBlkTimeFinder(c, spentBlkSeq) + if err != nil { + return nil, err + } + + for i, his := range spentHis { + spentHis[i].Timestamp = time.Unix(getBlkTime(his.BlockSeq), 0).UTC() + } + } + + type historyRecord struct { + received []AddrHistory + spent []AddrHistory + } + + // merge history in the same transaction. + hisMap := map[string]historyRecord{} + for _, his := range addrHis { + hr := hisMap[his.Txid] + hr.received = append(hr.received, his) + hisMap[his.Txid] = hr + } + for _, his := range spentHis { + hr := hisMap[his.Txid] + hr.spent = append(hr.spent, his) + hisMap[his.Txid] = hr + } + + for txid, hs := range hisMap { + var receivedCoins, spentCoins, coins uint64 + for _, h := range hs.received { + receivedCoins += h.coins + } + for _, h := range hs.spent { + spentCoins += h.coins + } + + isNegative := spentCoins > receivedCoins + + if spentCoins > receivedCoins { + coins = spentCoins - receivedCoins + } else { + coins = receivedCoins - spentCoins + } + + amount, err := droplet.ToString(coins) + if err != nil { + return nil, err + } + + if isNegative { + amount = "-" + amount + } + + var his AddrHistory + if len(hs.received) > 0 { + his = hs.received[0] + } else { + his = hs.spent[0] + } + + realHis = append(realHis, AddrHistory{ + BlockSeq: his.BlockSeq, + Txid: txid, + Address: addr, + Amount: amount, + Timestamp: his.Timestamp, + Status: 1, + }) + } + + return realHis, nil +} + +func createBlkTimeFinder(c *api.Client, ss []uint64) (func(uint64) int64, error) { + // get spent blocks + blocks := make([]*readable.Block, 0, len(ss)) + for _, s := range ss { + block, err := c.BlockBySeq(s) + if err != nil { + return nil, err + } + + blocks = append(blocks, block) + } + + if len(blocks) == 0 { + return nil, fmt.Errorf("found no block") + } + + return func(seq uint64) int64 { + for _, b := range blocks { + if seq == b.Head.BkSeq { + return int64(b.Head.Time) + } + } + panic("block not found") + }, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/wallet_key_export.go b/vendor/github.com/skycoin/skycoin/src/cli/wallet_key_export.go new file mode 100644 index 0000000000..7a063fa1e9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/wallet_key_export.go @@ -0,0 +1,180 @@ +package cli + +import ( + "errors" + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/bip32" + "github.com/skycoin/skycoin/src/cipher/bip39" + "github.com/skycoin/skycoin/src/cipher/bip44" + "github.com/skycoin/skycoin/src/wallet" +) + +func walletKeyExportCmd() *cobra.Command { + walletKeyExportCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + RunE: walletKeyExportHandler, + Use: "walletKeyExport [wallet]", + Short: "Export a specific key from an HD wallet", + Long: `This command prints the xpub or xprv key for a given + HDNode in a bip44 wallet. The HDNode path is specified with --path. + This path is the portion of the bip44 path. + + Please make sure that the node has wallet seed API enabled (--enable-api-sets="INSECURE_WALLET_SEED"). + + Example: -k xpub --path=0 prints the account 0 xpub + Example: -k xpub --path=0/0 prints the account 0, external chain xpub + Example: -k xprv --path=0/1 prints the account 0, change chain xprv + Example: -k pub --path=0/0/9 prints the account 0, external chain child 9 public key + Example: -k prv --path=0/1/8 prints the account 0, change chain child 8 private key + + The bip32 path node apostrophe is implicit for the first element of the path. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered + from the history log. If you do not include the "-p" option you will + be prompted to enter your password after you enter your command.`, + } + + walletKeyExportCmd.Flags().StringP("key", "k", "xpub", "key type (\"xpub\", \"xprv\", \"pub\", \"prv\")") + walletKeyExportCmd.Flags().StringP("path", "", "0/0", "bip44 account'/change subpath") + walletKeyExportCmd.Flags().StringP("password", "p", "", "wallet password") + + return walletKeyExportCmd +} + +func walletKeyExportHandler(c *cobra.Command, args []string) error { + keyType, err := c.Flags().GetString("key") + if err != nil { + return err + } + if err := validateKeyType(keyType); err != nil { + return err + } + + id := args[0] + wlt, err := apiClient.Wallet(id) + if err != nil { + return err + } + + if wlt.Meta.Type != wallet.WalletTypeBip44 { + return errors.New("unsupported wallet type for key export command") + } + + var password []byte + if wlt.Meta.Encrypted { + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + var err error + password, err = pr.Password() + if err != nil { + return err + } + } + rsp, err := apiClient.WalletSeed(id, string(password)) + if err != nil { + return err + } + + seed, err := bip39.NewSeed(rsp.Seed, rsp.SeedPassphrase) + if err != nil { + return err + } + + coin, err := bip44.NewCoin(seed, *wlt.Meta.Bip44Coin) + if err != nil { + return err + } + + path, err := c.Flags().GetString("path") + if err != nil { + return err + } + + nodes, err := parsePath(path) + if err != nil { + return err + } + if len(nodes) > 3 { + return errors.New("path can have at most 3 elements") + } + + acct, err := coin.Account(nodes[0]) + if err != nil { + return err + } + + if len(nodes) == 1 { + return printKey(keyType, acct.PrivateKey) + } + + change, err := acct.NewPrivateChildKey(nodes[1]) + if err != nil { + return err + } + + if len(nodes) == 2 { + return printKey(keyType, change) + } + + child, err := change.NewPrivateChildKey(nodes[2]) + if err != nil { + return err + } + + if len(nodes) == 3 { + return printKey(keyType, child) + } + + return nil +} + +func validateKeyType(kt string) error { + switch kt { + case "xpub", "xprv", "pub", "prv": + default: + return errors.New("key must be \"xpub\", \"xprv\", \"pub\" or \"prv\"") + } + + return nil +} + +func printKey(kt string, k *bip32.PrivateKey) error { + if err := validateKeyType(kt); err != nil { + return err + } + + switch kt { + case "xpub": + fmt.Println(k.PublicKey().String()) + case "xprv": + fmt.Println(k.String()) + case "pub": + fmt.Println(cipher.MustNewPubKey(k.PublicKey().Key).Hex()) + case "prv": + fmt.Println(cipher.MustNewSecKey(k.Key).Hex()) + default: + panic("unhandled key type") + } + + return nil +} + +func parsePath(p string) ([]uint32, error) { + pts := strings.Split(p, "/") + idx := make([]uint32, len(pts)) + for i, c := range pts { + x, err := strconv.ParseUint(c, 10, 32) + if err != nil { + return nil, fmt.Errorf("invalid path node number %q at position %d", c, i) + } + idx[i] = uint32(x) + } + + return idx, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/block.go b/vendor/github.com/skycoin/skycoin/src/coin/block.go new file mode 100644 index 0000000000..006dd12352 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/block.go @@ -0,0 +1,236 @@ +/* +Package coin defines the core blockchain datastructures. + +This package should not have any dependencies except for go stdlib and cipher. +*/ +package coin + +import ( + "fmt" + "log" + + "github.com/skycoin/skycoin/src/cipher" +) + +//go:generate skyencoder -struct BlockHeader -unexported +//go:generate skyencoder -struct BlockBody -unexported + +// MaxBlockTransactions is the maximum number of transactions in a block (see the maxlen struct tag value applied to BlockBody.Transactions) +const MaxBlockTransactions = 65535 + +// Block represents the block struct +type Block struct { + Head BlockHeader + Body BlockBody +} + +// HashPair including current block hash and previous block hash. +type HashPair struct { + Hash cipher.SHA256 + PrevHash cipher.SHA256 +} + +// BlockHeader records the block header +type BlockHeader struct { + Version uint32 + + Time uint64 + BkSeq uint64 // Increment every block + Fee uint64 // Fee in block + + PrevHash cipher.SHA256 // Hash of header of previous block + BodyHash cipher.SHA256 // Hash of transaction block + + UxHash cipher.SHA256 // XOR of sha256 of elements in unspent output set +} + +// BlockBody represents the block body +type BlockBody struct { + Transactions Transactions `enc:",maxlen=65535"` +} + +// SignedBlock signed block +type SignedBlock struct { + Block + Sig cipher.Sig +} + +// VerifySignature verifies that the block is signed by pubkey +func (b SignedBlock) VerifySignature(pubkey cipher.PubKey) error { + return cipher.VerifyPubKeySignedHash(pubkey, b.Sig, b.HashHeader()) +} + +// NewBlock creates new block. +func NewBlock(prev Block, currentTime uint64, uxHash cipher.SHA256, txns Transactions, calc FeeCalculator) (*Block, error) { + if len(txns) == 0 { + return nil, fmt.Errorf("Refusing to create block with no transactions") + } + + fee, err := txns.Fees(calc) + if err != nil { + // This should have been caught earlier + return nil, fmt.Errorf("Invalid transaction fees: %v", err) + } + + body := BlockBody{txns} + head := NewBlockHeader(prev.Head, uxHash, currentTime, fee, body) + return &Block{ + Head: head, + Body: body, + }, nil +} + +// NewGenesisBlock creates genesis block +func NewGenesisBlock(genesisAddr cipher.Address, genesisCoins, timestamp uint64) (*Block, error) { + txn := Transaction{} + if err := txn.PushOutput(genesisAddr, genesisCoins, genesisCoins); err != nil { + return nil, err + } + body := BlockBody{Transactions: Transactions{txn}} + prevHash := cipher.SHA256{} + bodyHash := body.Hash() + head := BlockHeader{ + Time: timestamp, + BodyHash: bodyHash, + PrevHash: prevHash, + BkSeq: 0, + Version: 0, + Fee: 0, + UxHash: cipher.SHA256{}, + } + b := &Block{ + Head: head, + Body: body, + } + + return b, nil +} + +// HashHeader return hash of block head. +func (b Block) HashHeader() cipher.SHA256 { + return b.Head.Hash() +} + +// Time return the head time of the block. +func (b Block) Time() uint64 { + return b.Head.Time +} + +// Seq return the head seq of the block. +func (b Block) Seq() uint64 { + return b.Head.BkSeq +} + +// Size returns the size of the Block's Transactions, in bytes +func (b Block) Size() (uint32, error) { + return b.Body.Size() +} + +// NewBlockHeader creates block header +func NewBlockHeader(prev BlockHeader, uxHash cipher.SHA256, currentTime, fee uint64, body BlockBody) BlockHeader { + if currentTime <= prev.Time { + log.Panic("Time can only move forward") + } + bodyHash := body.Hash() + prevHash := prev.Hash() + return BlockHeader{ + BodyHash: bodyHash, + Version: prev.Version, + PrevHash: prevHash, + Time: currentTime, + BkSeq: prev.BkSeq + 1, + Fee: fee, + UxHash: uxHash, + } +} + +// Hash return hash of block header +func (bh *BlockHeader) Hash() cipher.SHA256 { + return cipher.SumSHA256(bh.Bytes()) +} + +// Bytes serialize the blockheader and return the byte value. +func (bh *BlockHeader) Bytes() []byte { + buf, err := encodeBlockHeader(bh) + if err != nil { + log.Panicf("encodeBlockHeader failed: %v", err) + } + return buf +} + +// Hash returns the merkle hash of contained transactions +func (bb BlockBody) Hash() cipher.SHA256 { + hashes := make([]cipher.SHA256, len(bb.Transactions)) + for i := range bb.Transactions { + hashes[i] = bb.Transactions[i].Hash() + } + // Merkle hash of transactions + return cipher.Merkle(hashes) +} + +// Size returns the size of Transactions, in bytes +func (bb BlockBody) Size() (uint32, error) { + // We can't use length of self.Bytes() because it has a length prefix + // Need only the sum of transaction sizes + return bb.Transactions.Size() +} + +// Bytes serialize block body, and return the byte value. +func (bb *BlockBody) Bytes() []byte { + buf, err := encodeBlockBody(bb) + if err != nil { + log.Panicf("encodeBlockBody failed: %v", err) + } + return buf +} + +// CreateUnspents creates the expected outputs for a transaction. +func CreateUnspents(bh BlockHeader, txn Transaction) UxArray { + var h cipher.SHA256 + // The genesis block uses the null hash as the SrcTransaction [FIXME hardfork] + if bh.BkSeq != 0 { + h = txn.Hash() + } + uxo := make(UxArray, len(txn.Out)) + for i := range txn.Out { + uxo[i] = UxOut{ + Head: UxHead{ + Time: bh.Time, + BkSeq: bh.BkSeq, + }, + Body: UxBody{ + SrcTransaction: h, + Address: txn.Out[i].Address, + Coins: txn.Out[i].Coins, + Hours: txn.Out[i].Hours, + }, + } + } + return uxo +} + +// CreateUnspent creates single unspent output +func CreateUnspent(bh BlockHeader, txn Transaction, outIndex int) (UxOut, error) { + if outIndex < 0 || outIndex >= len(txn.Out) { + return UxOut{}, fmt.Errorf("Transaction out index overflows transaction outputs") + } + + var h cipher.SHA256 + // The genesis block uses the null hash as the SrcTransaction [FIXME hardfork] + if bh.BkSeq != 0 { + h = txn.Hash() + } + + return UxOut{ + Head: UxHead{ + Time: bh.Time, + BkSeq: bh.BkSeq, + }, + Body: UxBody{ + SrcTransaction: h, + Address: txn.Out[outIndex].Address, + Coins: txn.Out[outIndex].Coins, + Hours: txn.Out[outIndex].Hours, + }, + }, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/block_body_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/coin/block_body_skyencoder.go new file mode 100644 index 0000000000..7a98caa990 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/block_body_skyencoder.go @@ -0,0 +1,407 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// encodeSizeBlockBody computes the size of an encoded object of type BlockBody +func encodeSizeBlockBody(obj *BlockBody) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + for _, x1 := range obj.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + return i0 +} + +// encodeBlockBody encodes an object of type BlockBody to a buffer allocated to the exact size +// required to encode the object. +func encodeBlockBody(obj *BlockBody) ([]byte, error) { + n := encodeSizeBlockBody(obj) + buf := make([]byte, n) + + if err := encodeBlockBodyToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeBlockBodyToBuffer encodes an object of type BlockBody to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeBlockBodyToBuffer(buf []byte, obj *BlockBody) error { + if uint64(len(buf)) < encodeSizeBlockBody(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + return nil +} + +// decodeBlockBody decodes an object of type BlockBody from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeBlockBody(buf []byte, obj *BlockBody) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]Transaction, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Transactions[z1].Length = i + } + + { + // obj.Transactions[z1].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Type = i + } + + { + // obj.Transactions[z1].InnerHash + if len(d.Buffer) < len(obj.Transactions[z1].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].InnerHash[:], d.Buffer[:len(obj.Transactions[z1].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].InnerHash):] + } + + { + // obj.Transactions[z1].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Sigs = make([]cipher.Sig, length) + + for z3 := range obj.Transactions[z1].Sigs { + { + // obj.Transactions[z1].Sigs[z3] + if len(d.Buffer) < len(obj.Transactions[z1].Sigs[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Sigs[z3][:], d.Buffer[:len(obj.Transactions[z1].Sigs[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Sigs[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].In = make([]cipher.SHA256, length) + + for z3 := range obj.Transactions[z1].In { + { + // obj.Transactions[z1].In[z3] + if len(d.Buffer) < len(obj.Transactions[z1].In[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].In[z3][:], d.Buffer[:len(obj.Transactions[z1].In[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].In[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Out = make([]TransactionOutput, length) + + for z3 := range obj.Transactions[z1].Out { + { + // obj.Transactions[z1].Out[z3].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Address.Version = i + } + + { + // obj.Transactions[z1].Out[z3].Address.Key + if len(d.Buffer) < len(obj.Transactions[z1].Out[z3].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Out[z3].Address.Key[:], d.Buffer[:len(obj.Transactions[z1].Out[z3].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Out[z3].Address.Key):] + } + + { + // obj.Transactions[z1].Out[z3].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Coins = i + } + + { + // obj.Transactions[z1].Out[z3].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Hours = i + } + + } + } + } + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeBlockBodyExact decodes an object of type BlockBody from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeBlockBodyExact(buf []byte, obj *BlockBody) error { + if n, err := decodeBlockBody(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/block_header_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/coin/block_header_skyencoder.go new file mode 100644 index 0000000000..1fb3df5c81 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/block_header_skyencoder.go @@ -0,0 +1,168 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package coin + +import "github.com/skycoin/skycoin/src/cipher/encoder" + +// encodeSizeBlockHeader computes the size of an encoded object of type BlockHeader +func encodeSizeBlockHeader(obj *BlockHeader) uint64 { + i0 := uint64(0) + + // obj.Version + i0 += 4 + + // obj.Time + i0 += 8 + + // obj.BkSeq + i0 += 8 + + // obj.Fee + i0 += 8 + + // obj.PrevHash + i0 += 32 + + // obj.BodyHash + i0 += 32 + + // obj.UxHash + i0 += 32 + + return i0 +} + +// encodeBlockHeader encodes an object of type BlockHeader to a buffer allocated to the exact size +// required to encode the object. +func encodeBlockHeader(obj *BlockHeader) ([]byte, error) { + n := encodeSizeBlockHeader(obj) + buf := make([]byte, n) + + if err := encodeBlockHeaderToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeBlockHeaderToBuffer encodes an object of type BlockHeader to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeBlockHeaderToBuffer(buf []byte, obj *BlockHeader) error { + if uint64(len(buf)) < encodeSizeBlockHeader(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Version + e.Uint32(obj.Version) + + // obj.Time + e.Uint64(obj.Time) + + // obj.BkSeq + e.Uint64(obj.BkSeq) + + // obj.Fee + e.Uint64(obj.Fee) + + // obj.PrevHash + e.CopyBytes(obj.PrevHash[:]) + + // obj.BodyHash + e.CopyBytes(obj.BodyHash[:]) + + // obj.UxHash + e.CopyBytes(obj.UxHash[:]) + + return nil +} + +// decodeBlockHeader decodes an object of type BlockHeader from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeBlockHeader(buf []byte, obj *BlockHeader) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Version = i + } + + { + // obj.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Time = i + } + + { + // obj.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.BkSeq = i + } + + { + // obj.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Fee = i + } + + { + // obj.PrevHash + if len(d.Buffer) < len(obj.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.PrevHash[:], d.Buffer[:len(obj.PrevHash)]) + d.Buffer = d.Buffer[len(obj.PrevHash):] + } + + { + // obj.BodyHash + if len(d.Buffer) < len(obj.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.BodyHash[:], d.Buffer[:len(obj.BodyHash)]) + d.Buffer = d.Buffer[len(obj.BodyHash):] + } + + { + // obj.UxHash + if len(d.Buffer) < len(obj.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.UxHash[:], d.Buffer[:len(obj.UxHash)]) + d.Buffer = d.Buffer[len(obj.UxHash):] + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeBlockHeaderExact decodes an object of type BlockHeader from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeBlockHeaderExact(buf []byte, obj *BlockHeader) error { + if n, err := decodeBlockHeader(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/outputs.go b/vendor/github.com/skycoin/skycoin/src/coin/outputs.go new file mode 100644 index 0000000000..db2c26b9bc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/outputs.go @@ -0,0 +1,327 @@ +package coin + +import ( + "bytes" + "errors" + "fmt" + "log" + "sort" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/mathutil" +) + +/* + Unspent Outputs +*/ + +/* +- hash must only depend on factors known to sender +-- hash cannot depend on block executed +-- hash cannot depend on sequence number +-- hash may depend on nonce + +- hash must depend only on factors known to sender +-- needed to minimize divergence during block chain forks +- it should be difficult to create outputs with duplicate ids + +- Uxhash cannot depend on time or block it was created +- time is still needed for +*/ + +/* + For each transaction, keep track of + - order created + - order spent (for rollbacks) +*/ + +//go:generate skyencoder -struct UxHead -unexported +//go:generate skyencoder -struct UxBody -unexported + +// UxOut represents uxout +type UxOut struct { + Head UxHead + Body UxBody //hashed part + //Meta UxMeta +} + +// UxHead metadata (not hashed) +type UxHead struct { + Time uint64 //time of block it was created in + BkSeq uint64 //block it was created in, used to calculate depth + // SpSeq uint64 //block it was spent in +} + +// UxBody uxbody +type UxBody struct { + SrcTransaction cipher.SHA256 // Inner Hash of Transaction + Address cipher.Address // Address of receiver + Coins uint64 // Number of coins + Hours uint64 // Coin hours +} + +// Hash returns the hash of UxBody +func (uo *UxOut) Hash() cipher.SHA256 { + return uo.Body.Hash() +} + +// SnapshotHash returns hash of UxBody + UxHead +func (uo *UxOut) SnapshotHash() cipher.SHA256 { + n1 := encodeSizeUxBody(&uo.Body) + n2 := encodeSizeUxHead(&uo.Head) + buf := make([]byte, n1+n2) + + if err := encodeUxBodyToBuffer(buf[:n1], &uo.Body); err != nil { + log.Panicf("encodeUxBodyToBuffer failed: %v", err) + } + if err := encodeUxHeadToBuffer(buf[n1:], &uo.Head); err != nil { + log.Panicf("encodeUxHeadToBuffer failed: %v", err) + } + + return cipher.SumSHA256(buf) +} + +// Hash returns hash of uxbody +func (ub *UxBody) Hash() cipher.SHA256 { + buf, err := encodeUxBody(ub) + if err != nil { + log.Panicf("encodeUxBody failed: %v", err) + } + return cipher.SumSHA256(buf) +} + +/* + Make independent of block rate? + Then need creation time of output + Creation time of transaction cant be hashed +*/ + +// ErrAddEarnedCoinHoursAdditionOverflow is returned by UxOut.CoinHours() if during the addition of base coin +// hours to additional earned coin hours, the value would overflow a uint64. +// Callers may choose to ignore this errors and use 0 as the coinhours value instead. +// This affects one existing spent output, spent in block 13277. +var ErrAddEarnedCoinHoursAdditionOverflow = errors.New("UxOut.CoinHours addition of earned coin hours overflow") + +// CoinHours Calculate coinhour balance of output. t is the current unix utc time. +func (uo *UxOut) CoinHours(t uint64) (uint64, error) { + if t < uo.Head.Time { + log.Printf("Calculating coin hours with t < head time") + return uo.Body.Hours, nil + } + + seconds := t - uo.Head.Time // number of seconds + + // Calculate whole coin seconds + wholeCoins := uo.Body.Coins / 1e6 + wholeCoinSeconds, err := mathutil.MultUint64(seconds, wholeCoins) + if err != nil { + err := fmt.Errorf("UxOut.CoinHours: Calculating whole coin seconds overflows uint64 seconds=%d coins=%d uxid=%s", seconds, wholeCoins, uo.Hash().Hex()) + log.Printf("%v", err) + return 0, err + } + + // Calculate remainder droplet seconds + remainderDroplets := uo.Body.Coins % 1e6 + dropletSeconds, err := mathutil.MultUint64(seconds, remainderDroplets) + if err != nil { + err := fmt.Errorf("UxOut.CoinHours: Calculating droplet seconds overflows uint64 seconds=%d droplets=%d uxid=%s", seconds, remainderDroplets, uo.Hash().Hex()) + log.Printf("%v", err) + return 0, err + } + + // Add coinSeconds and seconds earned by droplets, rounded off + coinSeconds := wholeCoinSeconds + dropletSeconds/1e6 + + coinHours := coinSeconds / 3600 // coin hours + totalHours, err := mathutil.AddUint64(uo.Body.Hours, coinHours) // starting+earned + if err != nil { + log.Printf("%v uxid=%s", ErrAddEarnedCoinHoursAdditionOverflow, uo.Hash().Hex()) + return 0, ErrAddEarnedCoinHoursAdditionOverflow + } + return totalHours, nil +} + +// UxHashSet set mapping from UxHash to a placeholder value +type UxHashSet map[cipher.SHA256]struct{} + +// UxArray Array of Outputs +// Used by unspent output pool, spent tests +type UxArray []UxOut + +// Hashes returns Array of hashes for the Ux in the UxArray +func (ua UxArray) Hashes() []cipher.SHA256 { + hashes := make([]cipher.SHA256, len(ua)) + for i, ux := range ua { + hashes[i] = ux.Hash() + } + return hashes +} + +// HasDupes checks the UxArray for outputs which have the same hash +func (ua UxArray) HasDupes() bool { + m := make(UxHashSet, len(ua)) + for i := range ua { + h := ua[i].Hash() + if _, ok := m[h]; ok { + return true + } + m[h] = struct{}{} + } + return false +} + +// Set returns the UxArray as a hash to struct{} map to be used as a set. +// Should only be used for membership detection +func (ua UxArray) Set() UxHashSet { + m := make(UxHashSet, len(ua)) + for i := range ua { + m[ua[i].Hash()] = struct{}{} + } + return m +} + +// Sort sorts UxArray +func (ua UxArray) Sort() { + sort.Sort(ua) +} + +// Len returns length of UxArray +func (ua UxArray) Len() int { + return len(ua) +} + +// Less checks if UxArray[i] < UxArray[j] +func (ua UxArray) Less(i, j int) bool { + hash1 := ua[i].Hash() + hash2 := ua[j].Hash() + return bytes.Compare(hash1[:], hash2[:]) < 0 +} + +// Swap swaps value of UxArray[i] and UxArray[j] +func (ua UxArray) Swap(i, j int) { + ua[i], ua[j] = ua[j], ua[i] +} + +// Coins returns the total coins +func (ua UxArray) Coins() (uint64, error) { + var coins uint64 + for _, ux := range ua { + var err error + coins, err = mathutil.AddUint64(coins, ux.Body.Coins) + if err != nil { + return 0, errors.New("UxArray.Coins addition overflow") + } + } + + return coins, nil +} + +// CoinHours returns the total coin hours +func (ua UxArray) CoinHours(headTime uint64) (uint64, error) { + var hours uint64 + for _, ux := range ua { + uxHours, err := ux.CoinHours(headTime) + if err != nil { + return 0, err + } + + hours, err = mathutil.AddUint64(hours, uxHours) + if err != nil { + return 0, errors.New("UxArray.CoinHours addition overflow") + } + } + return hours, nil +} + +// AddressUxOuts maps address with uxarray +type AddressUxOuts map[cipher.Address]UxArray + +// NewAddressUxOuts creates address uxouts map +func NewAddressUxOuts(uxs UxArray) AddressUxOuts { + uxo := make(AddressUxOuts) + for _, ux := range uxs { + uxo[ux.Body.Address] = append(uxo[ux.Body.Address], ux) + } + return uxo +} + +// Keys returns the Address keys +func (auo AddressUxOuts) Keys() []cipher.Address { + addrs := make([]cipher.Address, len(auo)) + i := 0 + for k := range auo { + addrs[i] = k + i++ + } + return addrs +} + +// Flatten converts an AddressUxOuts map to a UxArray +func (auo AddressUxOuts) Flatten() UxArray { + oxs := make(UxArray, 0, len(auo)) + for _, uxs := range auo { + for i := range uxs { + oxs = append(oxs, uxs[i]) + } + } + return oxs +} + +// Sub returns a new set of unspents, with unspents found in other removed. +// No address's unspent set will be empty +// Depreciate this: only visor uses it +func (auo AddressUxOuts) Sub(other AddressUxOuts) AddressUxOuts { + ox := make(AddressUxOuts, len(auo)) + for a, uxs := range auo { + if suxs, ok := other[a]; ok { + ouxs := uxs.Sub(suxs) + if len(ouxs) > 0 { + ox[a] = ouxs + } + } else { + ox[a] = uxs + } + } + return ox +} + +// Add returns a new unspents, with merged unspents +func (auo AddressUxOuts) Add(other AddressUxOuts) AddressUxOuts { + ox := make(AddressUxOuts, len(auo)) + for a, o := range auo { + ox[a] = o + } + + for a, uxs := range other { + if suxs, ok := ox[a]; ok { + ox[a] = suxs.Add(uxs) + } else { + ox[a] = uxs + } + } + return ox +} + +// Sub returns a new UxArray with elements in other removed from self +// Deprecate +func (ua UxArray) Sub(other UxArray) UxArray { + uxa := make(UxArray, 0) + m := other.Set() + for i := range ua { + if _, ok := m[ua[i].Hash()]; !ok { + uxa = append(uxa, ua[i]) + } + } + return uxa +} + +// Add returns a new UxArray with merged elements +func (ua UxArray) Add(other UxArray) UxArray { + m := ua.Set() + for i := range other { + if _, ok := m[other[i].Hash()]; !ok { + ua = append(ua, other[i]) + } + } + return ua +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/transaction_inputs_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/coin/transaction_inputs_skyencoder.go new file mode 100644 index 0000000000..ae7daca9ba --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/transaction_inputs_skyencoder.go @@ -0,0 +1,135 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// encodeSizeTransactionInputs computes the size of an encoded object of type transactionInputs +func encodeSizeTransactionInputs(obj *transactionInputs) uint64 { + i0 := uint64(0) + + // obj.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.In)) * i1 + } + + return i0 +} + +// encodeTransactionInputs encodes an object of type transactionInputs to a buffer allocated to the exact size +// required to encode the object. +func encodeTransactionInputs(obj *transactionInputs) ([]byte, error) { + n := encodeSizeTransactionInputs(obj) + buf := make([]byte, n) + + if err := encodeTransactionInputsToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionInputsToBuffer encodes an object of type transactionInputs to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionInputsToBuffer(buf []byte, obj *transactionInputs) error { + if uint64(len(buf)) < encodeSizeTransactionInputs(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.In maxlen check + if len(obj.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.In length check + if uint64(len(obj.In)) > math.MaxUint32 { + return errors.New("obj.In length exceeds math.MaxUint32") + } + + // obj.In length + e.Uint32(uint32(len(obj.In))) + + // obj.In + for _, x := range obj.In { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeTransactionInputs decodes an object of type transactionInputs from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransactionInputs(buf []byte, obj *transactionInputs) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.In = make([]cipher.SHA256, length) + + for z1 := range obj.In { + { + // obj.In[z1] + if len(d.Buffer) < len(obj.In[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.In[z1][:], d.Buffer[:len(obj.In[z1])]) + d.Buffer = d.Buffer[len(obj.In[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionInputsExact decodes an object of type transactionInputs from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionInputsExact(buf []byte, obj *transactionInputs) error { + if n, err := decodeTransactionInputs(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/transaction_outputs_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/coin/transaction_outputs_skyencoder.go new file mode 100644 index 0000000000..8ddacd4aee --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/transaction_outputs_skyencoder.go @@ -0,0 +1,179 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// encodeSizeTransactionOutputs computes the size of an encoded object of type transactionOutputs +func encodeSizeTransactionOutputs(obj *transactionOutputs) uint64 { + i0 := uint64(0) + + // obj.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Out)) * i1 + } + + return i0 +} + +// encodeTransactionOutputs encodes an object of type transactionOutputs to a buffer allocated to the exact size +// required to encode the object. +func encodeTransactionOutputs(obj *transactionOutputs) ([]byte, error) { + n := encodeSizeTransactionOutputs(obj) + buf := make([]byte, n) + + if err := encodeTransactionOutputsToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionOutputsToBuffer encodes an object of type transactionOutputs to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionOutputsToBuffer(buf []byte, obj *transactionOutputs) error { + if uint64(len(buf)) < encodeSizeTransactionOutputs(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Out maxlen check + if len(obj.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Out length check + if uint64(len(obj.Out)) > math.MaxUint32 { + return errors.New("obj.Out length exceeds math.MaxUint32") + } + + // obj.Out length + e.Uint32(uint32(len(obj.Out))) + + // obj.Out + for _, x := range obj.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + return nil +} + +// decodeTransactionOutputs decodes an object of type transactionOutputs from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransactionOutputs(buf []byte, obj *transactionOutputs) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Out = make([]TransactionOutput, length) + + for z1 := range obj.Out { + { + // obj.Out[z1].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out[z1].Address.Version = i + } + + { + // obj.Out[z1].Address.Key + if len(d.Buffer) < len(obj.Out[z1].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out[z1].Address.Key[:], d.Buffer[:len(obj.Out[z1].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out[z1].Address.Key):] + } + + { + // obj.Out[z1].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Coins = i + } + + { + // obj.Out[z1].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionOutputsExact decodes an object of type transactionOutputs from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionOutputsExact(buf []byte, obj *transactionOutputs) error { + if n, err := decodeTransactionOutputs(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/transaction_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/coin/transaction_skyencoder.go new file mode 100644 index 0000000000..33d4d53df3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/transaction_skyencoder.go @@ -0,0 +1,357 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// encodeSizeTransaction computes the size of an encoded object of type Transaction +func encodeSizeTransaction(obj *Transaction) uint64 { + i0 := uint64(0) + + // obj.Length + i0 += 4 + + // obj.Type + i0++ + + // obj.InnerHash + i0 += 32 + + // obj.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 65 + + i0 += uint64(len(obj.Sigs)) * i1 + } + + // obj.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.In)) * i1 + } + + // obj.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Out)) * i1 + } + + return i0 +} + +// encodeTransaction encodes an object of type Transaction to a buffer allocated to the exact size +// required to encode the object. +func encodeTransaction(obj *Transaction) ([]byte, error) { + n := encodeSizeTransaction(obj) + buf := make([]byte, n) + + if err := encodeTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionToBuffer encodes an object of type Transaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionToBuffer(buf []byte, obj *Transaction) error { + if uint64(len(buf)) < encodeSizeTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Length + e.Uint32(obj.Length) + + // obj.Type + e.Uint8(obj.Type) + + // obj.InnerHash + e.CopyBytes(obj.InnerHash[:]) + + // obj.Sigs maxlen check + if len(obj.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Sigs length check + if uint64(len(obj.Sigs)) > math.MaxUint32 { + return errors.New("obj.Sigs length exceeds math.MaxUint32") + } + + // obj.Sigs length + e.Uint32(uint32(len(obj.Sigs))) + + // obj.Sigs + for _, x := range obj.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.In maxlen check + if len(obj.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.In length check + if uint64(len(obj.In)) > math.MaxUint32 { + return errors.New("obj.In length exceeds math.MaxUint32") + } + + // obj.In length + e.Uint32(uint32(len(obj.In))) + + // obj.In + for _, x := range obj.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Out maxlen check + if len(obj.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Out length check + if uint64(len(obj.Out)) > math.MaxUint32 { + return errors.New("obj.Out length exceeds math.MaxUint32") + } + + // obj.Out length + e.Uint32(uint32(len(obj.Out))) + + // obj.Out + for _, x := range obj.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + return nil +} + +// decodeTransaction decodes an object of type Transaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransaction(buf []byte, obj *Transaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Length = i + } + + { + // obj.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Type = i + } + + { + // obj.InnerHash + if len(d.Buffer) < len(obj.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.InnerHash[:], d.Buffer[:len(obj.InnerHash)]) + d.Buffer = d.Buffer[len(obj.InnerHash):] + } + + { + // obj.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Sigs = make([]cipher.Sig, length) + + for z1 := range obj.Sigs { + { + // obj.Sigs[z1] + if len(d.Buffer) < len(obj.Sigs[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sigs[z1][:], d.Buffer[:len(obj.Sigs[z1])]) + d.Buffer = d.Buffer[len(obj.Sigs[z1]):] + } + + } + } + } + + { + // obj.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.In = make([]cipher.SHA256, length) + + for z1 := range obj.In { + { + // obj.In[z1] + if len(d.Buffer) < len(obj.In[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.In[z1][:], d.Buffer[:len(obj.In[z1])]) + d.Buffer = d.Buffer[len(obj.In[z1]):] + } + + } + } + } + + { + // obj.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Out = make([]TransactionOutput, length) + + for z1 := range obj.Out { + { + // obj.Out[z1].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out[z1].Address.Version = i + } + + { + // obj.Out[z1].Address.Key + if len(d.Buffer) < len(obj.Out[z1].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out[z1].Address.Key[:], d.Buffer[:len(obj.Out[z1].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out[z1].Address.Key):] + } + + { + // obj.Out[z1].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Coins = i + } + + { + // obj.Out[z1].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionExact decodes an object of type Transaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionExact(buf []byte, obj *Transaction) error { + if n, err := decodeTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/transactions.go b/vendor/github.com/skycoin/skycoin/src/coin/transactions.go new file mode 100644 index 0000000000..49f1f66384 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/transactions.go @@ -0,0 +1,788 @@ +package coin + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "log" + "math" + "sort" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/mathutil" +) + +var ( + // DebugLevel1 checks for extremely unlikely conditions (10e-40) + DebugLevel1 = true + // DebugLevel2 enable checks for impossible conditions + DebugLevel2 = true +) + +//go:generate skyencoder -struct Transaction -unexported +//go:generate skyencoder -struct transactionInputs +//go:generate skyencoder -struct transactionOutputs + +type transactionInputs struct { + In []cipher.SHA256 `enc:",maxlen=65535"` +} + +type transactionOutputs struct { + Out []TransactionOutput `enc:",maxlen=65535"` +} + +/* +Transaction with N inputs, M ouputs is +- 32 bytes constant +- 32+65 bytes per input +- 21+8+8 bytes per output + +Skycoin Transactions are +- 97 bytes per input + 37 bytes per output + 37 bytes +Bitcoin Transactions are +- 180 bytes per input + 34 bytes per output + 10 bytes + +Sigs is the array of signatures +- the Nth signature is the authorization to spend the Nth output consumed in transaction +- the hash signed is SHA256sum of transaction inner hash and the hash of output being spent + +The inner hash is SHA256 hash of the serialization of Input and Output array +The outer hash is the hash of the whole transaction serialization +*/ + +// Transaction transaction struct +type Transaction struct { + Length uint32 // length prefix + Type uint8 // transaction type + InnerHash cipher.SHA256 // inner hash SHA256 of In[],Out[] + + Sigs []cipher.Sig `enc:",maxlen=65535"` // list of signatures, 64+1 bytes each + In []cipher.SHA256 `enc:",maxlen=65535"` // ouputs being spent + Out []TransactionOutput `enc:",maxlen=65535"` // ouputs being created +} + +// TransactionOutput hash output/name is function of Hash +type TransactionOutput struct { + Address cipher.Address // address to send to + Coins uint64 // amount to be sent in coins + Hours uint64 // amount to be sent in coin hours +} + +// Verify attempts to determine if the transaction is well formed. +// Verify cannot check transaction signatures, it needs the address from unspents +// Verify cannot check if outputs being spent exist +// Verify cannot check if the transaction would create or destroy coins +// or if the inputs have the required coin base +func (txn *Transaction) Verify() error { + return txn.verify(true) +} + +// VerifyUnsigned attempts to determine if the transaction is well formed, +// but requires the transaction to have at least one null signature. +// Verify cannot check transaction signatures, it needs the address from unspents +// Verify cannot check if outputs being spent exist +// Verify cannot check if the transaction would create or destroy coins +// or if the inputs have the required coin base +func (txn *Transaction) VerifyUnsigned() error { + return txn.verify(false) +} + +func (txn *Transaction) verify(signed bool) error { + if len(txn.In) == 0 { + return errors.New("No inputs") + } + if len(txn.Out) == 0 { + return errors.New("No outputs") + } + + // Check signature index fields + if len(txn.Sigs) != len(txn.In) { + return errors.New("Invalid number of signatures") + } + if len(txn.Sigs) > math.MaxUint16 { + return errors.New("Too many signatures and inputs") + } + + if len(txn.Out) > math.MaxUint16 { + return errors.New("Too many ouptuts") + } + + // Check duplicate inputs + uxOuts := make(map[cipher.SHA256]struct{}, len(txn.In)) + for i := range txn.In { + uxOuts[txn.In[i]] = struct{}{} + } + if len(uxOuts) != len(txn.In) { + return errors.New("Duplicate spend") + } + + if txn.Type != 0 { + return errors.New("transaction type invalid") + } + + // Prevent zero coin outputs + // Artificial restriction to prevent spam + for _, txo := range txn.Out { + if txo.Coins == 0 { + return errors.New("Zero coin output") + } + } + + // Check output coin integer overflow + coins := uint64(0) + for _, to := range txn.Out { + var err error + coins, err = mathutil.AddUint64(coins, to.Coins) + if err != nil { + return errors.New("Output coins overflow") + } + } + + // Check that Size and Hash can be computed + txnSize, txnHash, err := txn.SizeHash() + if err != nil { + return err + } + + // Check txn Size set correctly + if txn.Length != txnSize { + return errors.New("Incorrect transaction length") + } + + // Check for duplicate potential outputs + outputs := make(map[cipher.SHA256]struct{}, len(txn.Out)) + uxb := UxBody{ + SrcTransaction: txnHash, + } + for _, to := range txn.Out { + uxb.Coins = to.Coins + uxb.Hours = to.Hours + uxb.Address = to.Address + outputs[uxb.Hash()] = struct{}{} + } + if len(outputs) != len(txn.Out) { + return errors.New("Duplicate output in transaction") + } + + // Check inner hash + innerHash, err := txn.hashInner() + if err != nil { + return fmt.Errorf("HashInner failed: %v", err) + } + + if innerHash != txn.InnerHash { + return errors.New("InnerHash does not match computed hash") + } + + // Validate signatures + for i, sig := range txn.Sigs { + if sig.Null() { + // Check that signed transactions do not have any null signatures + if signed { + return errors.New("Unsigned input in transaction") + } + // Ignore null signatures if the transaction is unsigned + continue + } + + hash := cipher.AddSHA256(txn.InnerHash, txn.In[i]) + if err := cipher.VerifySignatureRecoverPubKey(sig, hash); err != nil { + return err + } + } + + // Check that unsigned transactions have at least one non-null signature + if !signed { + if !txn.hasNullSignature() { + return errors.New("Unsigned transaction must contain a null signature") + } + } + + return nil +} + +func (txn Transaction) verifyInputSignaturesPrelude(uxIn UxArray) error { + if len(txn.In) != len(uxIn) { + return errors.New("txn.In != uxIn") + } + if len(txn.In) != len(txn.Sigs) { + return errors.New("txn.In != txn.Sigs") + } + if txn.InnerHash != txn.HashInner() { + return errors.New("Invalid Tx Inner Hash") + } + for i := range txn.In { + if txn.In[i] != uxIn[i].Hash() { + return errors.New("Ux hash mismatch") + } + } + return nil +} + +// VerifyInputSignatures verifies the inputs and signatures +func (txn Transaction) VerifyInputSignatures(uxIn UxArray) error { + if err := txn.verifyInputSignaturesPrelude(uxIn); err != nil { + if DebugLevel2 { + log.Panic(err) + } + return err + } + + // Check signatures against unspent address + for i := range txn.In { + if txn.Sigs[i].Null() { + return errors.New("Unsigned input in transaction") + } + + hash := cipher.AddSHA256(txn.InnerHash, txn.In[i]) // use inner hash, not outer hash + err := cipher.VerifyAddressSignedHash(uxIn[i].Body.Address, txn.Sigs[i], hash) + if err != nil { + return errors.New("Signature not valid for output being spent") + } + } + + return nil +} + +// VerifyPartialInputSignatures verifies the inputs and signatures for signatures that are not null +func (txn Transaction) VerifyPartialInputSignatures(uxIn UxArray) error { + if err := txn.verifyInputSignaturesPrelude(uxIn); err != nil { + if DebugLevel2 { + log.Panic(err) + } + return err + } + + // Check signatures against unspent address for signatures that are not null + for i := range txn.In { + if txn.Sigs[i].Null() { + continue + } + hash := cipher.AddSHA256(txn.InnerHash, txn.In[i]) // use inner hash, not outer hash + err := cipher.VerifyAddressSignedHash(uxIn[i].Body.Address, txn.Sigs[i], hash) + if err != nil { + return errors.New("Signature not valid for output being spent") + } + } + + return nil +} + +// PushInput adds a unspent output hash to the inputs of a Transaction. +func (txn *Transaction) PushInput(uxOut cipher.SHA256) error { + if len(txn.In) >= math.MaxUint16 { + return errors.New("Max transaction inputs reached") + } + txn.In = append(txn.In, uxOut) + return nil +} + +// UxID compute transaction output id +func (txOut TransactionOutput) UxID(txID cipher.SHA256) cipher.SHA256 { + var x UxBody + x.Coins = txOut.Coins + x.Hours = txOut.Hours + x.Address = txOut.Address + x.SrcTransaction = txID + return x.Hash() +} + +// PushOutput Adds a TransactionOutput, sending coins & hours to an Address +func (txn *Transaction) PushOutput(dst cipher.Address, coins, hours uint64) error { + if len(txn.Out) >= math.MaxUint16 { + return errors.New("Max transaction outputs reached") + } + txn.Out = append(txn.Out, TransactionOutput{ + Address: dst, + Coins: coins, + Hours: hours, + }) + return nil +} + +// SignInput signs a specific input in the transaction. +// InnerHash should already be set to a valid value. +// Returns an error if the input is already signed +func (txn *Transaction) SignInput(key cipher.SecKey, index int) error { + if index < 0 || index >= len(txn.In) { + return errors.New("Signature index out of range") + } + + if len(txn.Sigs) == 0 { + txn.Sigs = make([]cipher.Sig, len(txn.In)) + } + if len(txn.In) != len(txn.Sigs) { + return errors.New("Number of signatures does not match number of inputs") + } + + if !txn.Sigs[index].Null() { + return errors.New("Input already signed") + } + + h := cipher.AddSHA256(txn.InnerHash, txn.In[index]) + txn.Sigs[index] = cipher.MustSignHash(h, key) + + return nil +} + +// SignInputs signs all inputs in the transaction +func (txn *Transaction) SignInputs(keys []cipher.SecKey) { + if len(keys) != len(txn.In) { + log.Panic("Invalid number of keys") + } + if len(keys) > math.MaxUint16 { + log.Panic("Too many keys") + } + if len(keys) == 0 { + log.Panic("No keys") + } + if len(txn.Sigs) > 0 && txn.hasNonNullSignature() { + log.Panic("Transaction has been signed") + } + + txn.InnerHash = txn.HashInner() // update hash + + sigs := make([]cipher.Sig, len(txn.In)) + for i, k := range keys { + h := cipher.AddSHA256(txn.InnerHash, txn.In[i]) // hash to sign + sigs[i] = cipher.MustSignHash(h, k) + } + txn.Sigs = sigs +} + +// Size returns the encoded byte size of the transaction +func (txn *Transaction) Size() (uint32, error) { + buf, err := txn.Serialize() + if err != nil { + return 0, err + } + return mathutil.IntToUint32(len(buf)) +} + +// IsFullyUnsigned returns true if the transaction is not signed for any input. +// Unsigned transactions have a full signature array, but the signatures are null. +// Returns true if the signatures array is empty. +func (txn *Transaction) IsFullyUnsigned() bool { + for _, s := range txn.Sigs { + if !s.Null() { + return false + } + } + + return true +} + +// IsFullySigned returns true if the transaction is fully signed. +// Returns true if the signatures array is empty. +func (txn *Transaction) IsFullySigned() bool { + if len(txn.Sigs) == 0 { + return false + } + + for _, s := range txn.Sigs { + if s.Null() { + return false + } + } + + return true +} + +// hasNonNullSignature returns true if the transaction has at least one non-null signature +func (txn *Transaction) hasNonNullSignature() bool { + for _, s := range txn.Sigs { + if !s.Null() { + return true + } + } + + return false +} + +// hasNullSignature returns true if the transaction has at least one null signature +func (txn *Transaction) hasNullSignature() bool { + for _, s := range txn.Sigs { + if s.Null() { + return true + } + } + + return false +} + +// Hash an entire Transaction struct, including the TransactionHeader +func (txn *Transaction) Hash() cipher.SHA256 { + b, err := txn.Serialize() + if err != nil { + log.Panicf("Hash: txn.Serialize failed: %v", err) + } + return cipher.SumSHA256(b) +} + +// SizeHash returns the encoded size and the hash of it (avoids duplicate encoding) +func (txn *Transaction) SizeHash() (uint32, cipher.SHA256, error) { + b, err := txn.Serialize() + if err != nil { + return 0, cipher.SHA256{}, err + } + s, err := mathutil.IntToUint32(len(b)) + if err != nil { + return 0, cipher.SHA256{}, err + } + return s, cipher.SumSHA256(b), nil +} + +// UpdateHeader saves the txn body hash to TransactionHeader.Hash +func (txn *Transaction) UpdateHeader() error { + s, err := txn.Size() + if err != nil { + return err + } + txn.Length = s + txn.Type = byte(0x00) + txn.InnerHash = txn.HashInner() + return nil +} + +// HashInner hashes only the Transaction Inputs & Outputs +// This is what is signed +// Client hashes the inner hash with hash of output being spent and signs it with private key +func (txn *Transaction) HashInner() cipher.SHA256 { + h, err := txn.hashInner() + if err != nil { + log.Panicf("hashInner failed: %v", err) + } + return h +} + +func (txn *Transaction) hashInner() (cipher.SHA256, error) { + txnInputs := &transactionInputs{ + In: txn.In, + } + txnOutputs := &transactionOutputs{ + Out: txn.Out, + } + n1 := encodeSizeTransactionInputs(txnInputs) + n2 := encodeSizeTransactionOutputs(txnOutputs) + buf := make([]byte, n1+n2) + + if err := encodeTransactionInputsToBuffer(buf[:n1], txnInputs); err != nil { + return cipher.SHA256{}, fmt.Errorf("encodeTransactionInputsToBuffer failed: %v", err) + } + + if err := encodeTransactionOutputsToBuffer(buf[n1:], txnOutputs); err != nil { + return cipher.SHA256{}, fmt.Errorf("encodeTransactionOutputsToBuffer failed: %v", err) + } + + return cipher.SumSHA256(buf), nil +} + +// MustSerialize serializes the transaction to bytes, panics on error. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) MustSerialize() []byte { + b, err := encodeTransaction(txn) + if err != nil { + log.Panicf("encodeTransaction failed: %v", err) + } + return b +} + +// Serialize serializes the transaction to bytes. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) Serialize() ([]byte, error) { + return encodeTransaction(txn) +} + +// MustSerializeHex serializes the transaction to a hex string, panics on error. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) MustSerializeHex() string { + return hex.EncodeToString(txn.MustSerialize()) +} + +// SerializeHex serializes the transaction to a hex string. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) SerializeHex() (string, error) { + b, err := txn.Serialize() + if err != nil { + return "", err + } + return hex.EncodeToString(b), nil +} + +// MustDeserializeTransaction deserializes a transaction, panics on error +func MustDeserializeTransaction(b []byte) Transaction { + txn, err := DeserializeTransaction(b) + if err != nil { + log.Panicf("Failed to deserialize transaction: %v", err) + } + return txn +} + +// DeserializeTransaction deserializes a transaction +func DeserializeTransaction(b []byte) (Transaction, error) { + txn := Transaction{} + if err := decodeTransactionExact(b, &txn); err != nil { + return Transaction{}, fmt.Errorf("Invalid transaction: %v", err) + } + return txn, nil +} + +// MustDeserializeTransactionHex deserializes a transaction hex string, panics on error +func MustDeserializeTransactionHex(s string) Transaction { + txn, err := DeserializeTransactionHex(s) + if err != nil { + log.Panicf("Failed to deserialize transaction: %v", err) + } + return txn +} + +// DeserializeTransactionHex deserializes a transaction hex string +func DeserializeTransactionHex(s string) (Transaction, error) { + b, err := hex.DecodeString(s) + if err != nil { + return Transaction{}, err + } + return DeserializeTransaction(b) +} + +// OutputHours returns the coin hours sent as outputs. This does not include the fee. +func (txn *Transaction) OutputHours() (uint64, error) { + hours := uint64(0) + for i := range txn.Out { + var err error + hours, err = mathutil.AddUint64(hours, txn.Out[i].Hours) + if err != nil { + return 0, errors.New("Transaction output hours overflow") + } + } + return hours, nil +} + +// Transactions transaction slice +type Transactions []Transaction + +// Fees calculates all the fees in Transactions +func (txns Transactions) Fees(calc FeeCalculator) (uint64, error) { + total := uint64(0) + for i := range txns { + fee, err := calc(&txns[i]) + if err != nil { + return 0, err + } + + total, err = mathutil.AddUint64(total, fee) + if err != nil { + return 0, errors.New("Transactions fee totals overflow") + } + } + return total, nil +} + +// Hashes caculate transactions hashes +func (txns Transactions) Hashes() []cipher.SHA256 { + hashes := make([]cipher.SHA256, len(txns)) + for i := range txns { + hashes[i] = txns[i].Hash() + } + return hashes +} + +// Size returns the sum of contained Transactions' sizes. It is not the size if +// serialized, since that would have a length prefix. +func (txns Transactions) Size() (uint32, error) { + var size uint32 + for i := range txns { + s, err := txns[i].Size() + if err != nil { + return 0, err + } + + size, err = mathutil.AddUint32(size, s) + if err != nil { + return 0, err + } + } + + return size, nil +} + +// TruncateBytesTo returns the first n transactions whose total size is less than or equal to size +func (txns Transactions) TruncateBytesTo(size uint32) (Transactions, error) { + var total uint32 + for i := range txns { + pending, err := txns[i].Size() + if err != nil { + return nil, err + } + + pendingTotal, err := mathutil.AddUint32(total, pending) + if err != nil { + return txns[:i], nil + } + + if pendingTotal > size { + return txns[:i], nil + } + + total = pendingTotal + } + + return txns, nil +} + +// SortableTransactions allows sorting transactions by fee & hash +type SortableTransactions struct { + Transactions Transactions + Fees []uint64 + Hashes []cipher.SHA256 +} + +// FeeCalculator given a transaction, return its fee or an error if the fee cannot be calculated +type FeeCalculator func(*Transaction) (uint64, error) + +// SortTransactions returns transactions sorted by fee per kB, and sorted by lowest hash if tied. +// Transactions that fail in fee computation are excluded +func SortTransactions(txns Transactions, feeCalc FeeCalculator) (Transactions, error) { + sorted, err := NewSortableTransactions(txns, feeCalc) + if err != nil { + return nil, err + } + sorted.Sort() + return sorted.Transactions, nil +} + +// NewSortableTransactions returns an array of txns that can be sorted by fee. +// On creation, fees are calculated, and if any txns have invalid fee, there are removed from consideration +func NewSortableTransactions(txns Transactions, feeCalc FeeCalculator) (*SortableTransactions, error) { + newTxns := make(Transactions, len(txns)) + fees := make([]uint64, len(txns)) + hashes := make([]cipher.SHA256, len(txns)) + j := 0 + for i := range txns { + fee, err := feeCalc(&txns[i]) + if err != nil { + continue + } + + size, hash, err := txns[i].SizeHash() + if err != nil { + return nil, err + } + + // Calculate fee priority based on fee per kb + feeKB, err := mathutil.MultUint64(fee, 1024) + + // If the fee * 1024 would exceed math.MaxUint64, set it to math.MaxUint64 so that + // this transaction can still be processed + if err != nil { + feeKB = math.MaxUint64 + } + + newTxns[j] = txns[i] + hashes[j] = hash + fees[j] = feeKB / uint64(size) + j++ + } + + return &SortableTransactions{ + Transactions: newTxns[:j], + Fees: fees[:j], + Hashes: hashes[:j], + }, nil +} + +// Sort sorts by tx fee, and then by hash if fee equal +func (txns SortableTransactions) Sort() { + sort.Sort(txns) +} + +// Len returns length of transactions +func (txns SortableTransactions) Len() int { + return len(txns.Transactions) +} + +// Less default sorting is fees descending, hash ascending if fees equal +func (txns SortableTransactions) Less(i, j int) bool { + if txns.Fees[i] == txns.Fees[j] { + // If fees match, hashes are sorted ascending + return bytes.Compare(txns.Hashes[i][:], txns.Hashes[j][:]) < 0 + } + // Fees are sorted descending + return txns.Fees[i] > txns.Fees[j] +} + +// Swap swaps txns +func (txns SortableTransactions) Swap(i, j int) { + txns.Transactions[i], txns.Transactions[j] = txns.Transactions[j], txns.Transactions[i] + txns.Fees[i], txns.Fees[j] = txns.Fees[j], txns.Fees[i] + txns.Hashes[i], txns.Hashes[j] = txns.Hashes[j], txns.Hashes[i] +} + +// VerifyTransactionCoinsSpending checks that coins are not destroyed or created by the transaction +func VerifyTransactionCoinsSpending(uxIn UxArray, uxOut UxArray) error { + coinsIn := uint64(0) + for i := range uxIn { + var err error + coinsIn, err = mathutil.AddUint64(coinsIn, uxIn[i].Body.Coins) + if err != nil { + return errors.New("Transaction input coins overflow") + } + } + + coinsOut := uint64(0) + for i := range uxOut { + var err error + coinsOut, err = mathutil.AddUint64(coinsOut, uxOut[i].Body.Coins) + if err != nil { + return errors.New("Transaction output coins overflow") + } + } + + if coinsIn < coinsOut { + return errors.New("Insufficient coins") + } + if coinsIn > coinsOut { + return errors.New("Transactions may not destroy coins") + } + + return nil +} + +// VerifyTransactionHoursSpending checks that hours are not created by the transaction +func VerifyTransactionHoursSpending(headTime uint64, uxIn UxArray, uxOut UxArray) error { + hoursIn := uint64(0) + for i := range uxIn { + uxHours, err := uxIn[i].CoinHours(headTime) + if err != nil { + // If the error was specifically an overflow when adding the + // earned coin hours to the base coin hours, treat the uxHours as 0. + // Block 13277 spends an input which overflows in this way, + // so the block will not sync if an error is returned. + if err == ErrAddEarnedCoinHoursAdditionOverflow { + uxHours = 0 + } else { + return err + } + } + + hoursIn, err = mathutil.AddUint64(hoursIn, uxHours) + if err != nil { + return errors.New("Transaction input hours overflow") + } + } + + hoursOut := uint64(0) + for i := range uxOut { + // NOTE: addition of hours is not checked for overflow here because + // this would invalidate existing blocks which had overflowed hours. + // Hours overflow checks are handled as a "soft" constraint in the network + // until those blocks are repaired. + hoursOut += uxOut[i].Body.Hours + } + + if hoursIn < hoursOut { + return errors.New("Insufficient coin hours") + } + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/ux_body_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/coin/ux_body_skyencoder.go new file mode 100644 index 0000000000..af5fba4c01 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/ux_body_skyencoder.go @@ -0,0 +1,138 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package coin + +import "github.com/skycoin/skycoin/src/cipher/encoder" + +// encodeSizeUxBody computes the size of an encoded object of type UxBody +func encodeSizeUxBody(obj *UxBody) uint64 { + i0 := uint64(0) + + // obj.SrcTransaction + i0 += 32 + + // obj.Address.Version + i0++ + + // obj.Address.Key + i0 += 20 + + // obj.Coins + i0 += 8 + + // obj.Hours + i0 += 8 + + return i0 +} + +// encodeUxBody encodes an object of type UxBody to a buffer allocated to the exact size +// required to encode the object. +func encodeUxBody(obj *UxBody) ([]byte, error) { + n := encodeSizeUxBody(obj) + buf := make([]byte, n) + + if err := encodeUxBodyToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxBodyToBuffer encodes an object of type UxBody to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxBodyToBuffer(buf []byte, obj *UxBody) error { + if uint64(len(buf)) < encodeSizeUxBody(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.SrcTransaction + e.CopyBytes(obj.SrcTransaction[:]) + + // obj.Address.Version + e.Uint8(obj.Address.Version) + + // obj.Address.Key + e.CopyBytes(obj.Address.Key[:]) + + // obj.Coins + e.Uint64(obj.Coins) + + // obj.Hours + e.Uint64(obj.Hours) + + return nil +} + +// decodeUxBody decodes an object of type UxBody from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxBody(buf []byte, obj *UxBody) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.SrcTransaction + if len(d.Buffer) < len(obj.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.SrcTransaction[:], d.Buffer[:len(obj.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.SrcTransaction):] + } + + { + // obj.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Address.Version = i + } + + { + // obj.Address.Key + if len(d.Buffer) < len(obj.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Address.Key[:], d.Buffer[:len(obj.Address.Key)]) + d.Buffer = d.Buffer[len(obj.Address.Key):] + } + + { + // obj.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Coins = i + } + + { + // obj.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Hours = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxBodyExact decodes an object of type UxBody from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxBodyExact(buf []byte, obj *UxBody) error { + if n, err := decodeUxBody(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/ux_head_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/coin/ux_head_skyencoder.go new file mode 100644 index 0000000000..97547af3d7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/ux_head_skyencoder.go @@ -0,0 +1,93 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package coin + +import "github.com/skycoin/skycoin/src/cipher/encoder" + +// encodeSizeUxHead computes the size of an encoded object of type UxHead +func encodeSizeUxHead(obj *UxHead) uint64 { + i0 := uint64(0) + + // obj.Time + i0 += 8 + + // obj.BkSeq + i0 += 8 + + return i0 +} + +// encodeUxHead encodes an object of type UxHead to a buffer allocated to the exact size +// required to encode the object. +func encodeUxHead(obj *UxHead) ([]byte, error) { + n := encodeSizeUxHead(obj) + buf := make([]byte, n) + + if err := encodeUxHeadToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxHeadToBuffer encodes an object of type UxHead to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxHeadToBuffer(buf []byte, obj *UxHead) error { + if uint64(len(buf)) < encodeSizeUxHead(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Time + e.Uint64(obj.Time) + + // obj.BkSeq + e.Uint64(obj.BkSeq) + + return nil +} + +// decodeUxHead decodes an object of type UxHead from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxHead(buf []byte, obj *UxHead) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Time = i + } + + { + // obj.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.BkSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxHeadExact decodes an object of type UxHead from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxHeadExact(buf []byte, obj *UxHead) error { + if n, err := decodeUxHead(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/announce_blocks_message_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/announce_blocks_message_skyencoder.go new file mode 100644 index 0000000000..1a24adfedb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/announce_blocks_message_skyencoder.go @@ -0,0 +1,78 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import "github.com/skycoin/skycoin/src/cipher/encoder" + +// encodeSizeAnnounceBlocksMessage computes the size of an encoded object of type AnnounceBlocksMessage +func encodeSizeAnnounceBlocksMessage(obj *AnnounceBlocksMessage) uint64 { + i0 := uint64(0) + + // obj.MaxBkSeq + i0 += 8 + + return i0 +} + +// encodeAnnounceBlocksMessage encodes an object of type AnnounceBlocksMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeAnnounceBlocksMessage(obj *AnnounceBlocksMessage) ([]byte, error) { + n := encodeSizeAnnounceBlocksMessage(obj) + buf := make([]byte, n) + + if err := encodeAnnounceBlocksMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeAnnounceBlocksMessageToBuffer encodes an object of type AnnounceBlocksMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeAnnounceBlocksMessageToBuffer(buf []byte, obj *AnnounceBlocksMessage) error { + if uint64(len(buf)) < encodeSizeAnnounceBlocksMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.MaxBkSeq + e.Uint64(obj.MaxBkSeq) + + return nil +} + +// decodeAnnounceBlocksMessage decodes an object of type AnnounceBlocksMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeAnnounceBlocksMessage(buf []byte, obj *AnnounceBlocksMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.MaxBkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.MaxBkSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeAnnounceBlocksMessageExact decodes an object of type AnnounceBlocksMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeAnnounceBlocksMessageExact(buf []byte, obj *AnnounceBlocksMessage) error { + if n, err := decodeAnnounceBlocksMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/announce_txns_message_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/announce_txns_message_skyencoder.go new file mode 100644 index 0000000000..826b5a812a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/announce_txns_message_skyencoder.go @@ -0,0 +1,135 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// encodeSizeAnnounceTxnsMessage computes the size of an encoded object of type AnnounceTxnsMessage +func encodeSizeAnnounceTxnsMessage(obj *AnnounceTxnsMessage) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Transactions)) * i1 + } + + return i0 +} + +// encodeAnnounceTxnsMessage encodes an object of type AnnounceTxnsMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeAnnounceTxnsMessage(obj *AnnounceTxnsMessage) ([]byte, error) { + n := encodeSizeAnnounceTxnsMessage(obj) + buf := make([]byte, n) + + if err := encodeAnnounceTxnsMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeAnnounceTxnsMessageToBuffer encodes an object of type AnnounceTxnsMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeAnnounceTxnsMessageToBuffer(buf []byte, obj *AnnounceTxnsMessage) error { + if uint64(len(buf)) < encodeSizeAnnounceTxnsMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 256 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeAnnounceTxnsMessage decodes an object of type AnnounceTxnsMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeAnnounceTxnsMessage(buf []byte, obj *AnnounceTxnsMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 256 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]cipher.SHA256, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1] + if len(d.Buffer) < len(obj.Transactions[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1][:], d.Buffer[:len(obj.Transactions[z1])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeAnnounceTxnsMessageExact decodes an object of type AnnounceTxnsMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeAnnounceTxnsMessageExact(buf []byte, obj *AnnounceTxnsMessage) error { + if n, err := decodeAnnounceTxnsMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/announced_txns.go b/vendor/github.com/skycoin/skycoin/src/daemon/announced_txns.go new file mode 100644 index 0000000000..b6ca110f6e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/announced_txns.go @@ -0,0 +1,44 @@ +package daemon + +import ( + "sync" + "time" + + "github.com/skycoin/skycoin/src/cipher" +) + +type announcedTxnsCache struct { + sync.Mutex + cache map[cipher.SHA256]int64 +} + +func newAnnouncedTxnsCache() *announcedTxnsCache { + return &announcedTxnsCache{ + cache: make(map[cipher.SHA256]int64), + } +} + +func (c *announcedTxnsCache) add(txns []cipher.SHA256) { + c.Lock() + defer c.Unlock() + + t := time.Now().UTC().UnixNano() + for _, txn := range txns { + c.cache[txn] = t + } +} + +func (c *announcedTxnsCache) flush() map[cipher.SHA256]int64 { + c.Lock() + defer c.Unlock() + + if len(c.cache) == 0 { + return nil + } + + cache := c.cache + + c.cache = make(map[cipher.SHA256]int64) + + return cache +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/connections.go b/vendor/github.com/skycoin/skycoin/src/daemon/connections.go new file mode 100644 index 0000000000..cdb5735e70 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/connections.go @@ -0,0 +1,554 @@ +package daemon + +import ( + "errors" + "fmt" + "sync" + "time" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/util/iputil" + "github.com/skycoin/skycoin/src/util/useragent" +) + +// ConnectionState connection state in the state machine +// Connections have three states: "pending", "connected" and "introduced" +// A connection in the "pending" state has been selected to establish a TCP connection, +// but the connection has not been established yet. +// Only outgoing connections will ever be in the "pending" state; +// incoming connections begin at the "connected" state. +// A connection in the "connected" state has established a TCP connection, +// but has not completed the introduction handshake. +// A connection in the "introduced" state has completed the introduction handshake. +type ConnectionState string + +const ( + // ConnectionStatePending prior to establishing a connection + ConnectionStatePending ConnectionState = "pending" + // ConnectionStateConnected connected, but not introduced + ConnectionStateConnected ConnectionState = "connected" + // ConnectionStateIntroduced connection has introduced itself + ConnectionStateIntroduced ConnectionState = "introduced" +) + +var ( + // ErrConnectionNotExist connection does not exist when performing an operation that requires it to exist + ErrConnectionNotExist = errors.New("Connection does not exist") + // ErrConnectionExists connection exists in Connections + ErrConnectionExists = errors.New("Connection exists") + // ErrConnectionIPMirrorExists connection exists for a given base IP and mirror + ErrConnectionIPMirrorExists = errors.New("Connection exists with this base IP and mirror") + // ErrConnectionStateNotConnected connect state is not "connected" + ErrConnectionStateNotConnected = errors.New("Connection state is not \"connected\"") + // ErrConnectionGnetIDMismatch gnet ID in argument does not match gnet ID on record + ErrConnectionGnetIDMismatch = errors.New("Connection gnet ID does not match") + // ErrConnectionAlreadyIntroduced attempted to make invalid state transition from introduced state + ErrConnectionAlreadyIntroduced = errors.New("Connection is already in introduced state") + // ErrConnectionAlreadyConnected attempted to make invalid state transition from connected state + ErrConnectionAlreadyConnected = errors.New("Connection is already in connected state") + // ErrInvalidGnetID invalid gnet ID value used as argument + ErrInvalidGnetID = errors.New("Invalid gnet ID") +) + +// ConnectionDetails connection data managed by daemon +type ConnectionDetails struct { + State ConnectionState + Outgoing bool + ConnectedAt time.Time + Mirror uint32 + ListenPort uint16 + ProtocolVersion int32 + Height uint64 + UserAgent useragent.Data + UnconfirmedVerifyTxn params.VerifyTxn + GenesisHash cipher.SHA256 +} + +// HasIntroduced returns true if the connection has introduced +func (c ConnectionDetails) HasIntroduced() bool { + switch c.State { + case ConnectionStateIntroduced: + return true + default: + return false + } +} + +type connection struct { + Addr string + ConnectionDetails + gnetID uint64 +} + +// ListenAddr returns the addr that connection listens on, if available +func (c *connection) ListenAddr() string { + if c.ListenPort == 0 { + return "" + } + + ip, _, err := iputil.SplitAddr(c.Addr) + if err != nil { + logger.Critical().WithError(err).WithField("addr", c.Addr).Error("connection.ListenAddr addr could not be split") + return "" + } + + return fmt.Sprintf("%s:%d", ip, c.ListenPort) +} + +// Connections manages a collection of Connection +type Connections struct { + conns map[string]*connection + mirrors map[uint32]map[string]uint16 + ipCounts map[string]int + gnetIDs map[uint64]string + listenAddrs map[string][]string + sync.Mutex +} + +// NewConnections creates Connections +func NewConnections() *Connections { + return &Connections{ + conns: make(map[string]*connection, 32), + mirrors: make(map[uint32]map[string]uint16, 32), + ipCounts: make(map[string]int, 32), + gnetIDs: make(map[uint64]string, 32), + listenAddrs: make(map[string][]string, 32), + } +} + +// pending adds a new pending outgoing connection +func (c *Connections) pending(addr string) (*connection, error) { + c.Lock() + defer c.Unlock() + + ip, port, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithField("addr", addr).WithError(err).Error("Connections.pending called with invalid addr") + return nil, err + } + + if _, ok := c.conns[addr]; ok { + return nil, ErrConnectionExists + } + + c.ipCounts[ip]++ + + conn := &connection{ + Addr: addr, + ConnectionDetails: ConnectionDetails{ + State: ConnectionStatePending, + Outgoing: true, + ListenPort: port, + }, + } + + c.conns[addr] = conn + c.listenAddrs[addr] = append(c.listenAddrs[addr], addr) + + logger.WithField("addr", addr).Debug("Connections.pending") + + return c.conns[addr], nil +} + +// connected the connection has connected +func (c *Connections) connected(addr string, gnetID uint64) (*connection, error) { + c.Lock() + defer c.Unlock() + + fields := logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + } + + if gnetID == 0 { + logger.Critical().WithFields(fields).WithError(ErrInvalidGnetID).Error("Connections.connected called with invalid gnetID") + return nil, ErrInvalidGnetID + } + + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithFields(fields).WithError(err).Error("Connections.connected called with invalid addr") + return nil, err + } + + conn := c.conns[addr] + + if conn == nil { + c.ipCounts[ip]++ + + conn = &connection{ + Addr: addr, + } + + c.conns[addr] = conn + } else { + fields := logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + "state": conn.State, + "outgoing": conn.Outgoing, + "connGnetID": conn.gnetID, + } + + switch conn.State { + case ConnectionStatePending: + case ConnectionStateConnected: + logger.Critical().WithFields(fields).Error("Connections.connected called on already connected connection") + return nil, ErrConnectionAlreadyConnected + case ConnectionStateIntroduced: + logger.Critical().WithFields(fields).Error("Connections.connected called on already introduced connection") + return nil, ErrConnectionAlreadyIntroduced + default: + logger.WithFields(fields).Panic("Connection state invalid") + } + } + + c.gnetIDs[gnetID] = addr + conn.gnetID = gnetID + conn.ConnectedAt = time.Now().UTC() + conn.State = ConnectionStateConnected + + fields["outgoing"] = conn.Outgoing + + logger.WithFields(fields).Debug("Connections.connected") + + return conn, nil +} + +// introduced the connection has introduced itself +func (c *Connections) introduced(addr string, gnetID uint64, m *IntroductionMessage) (*connection, error) { + c.Lock() + defer c.Unlock() + + fields := logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + } + + if gnetID == 0 { + logger.Critical().WithFields(fields).WithError(ErrInvalidGnetID).Error("Connections.introduced called with invalid gnetID") + return nil, ErrInvalidGnetID + } + + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithFields(fields).WithError(err).Error("Connections.introduced called with invalid addr") + return nil, err + } + + conn := c.conns[addr] + if conn == nil { + return nil, ErrConnectionNotExist + } + + fields["outgoing"] = conn.Outgoing + + errorFields := logrus.Fields{ + "state": conn.State, + "connGnetID": conn.gnetID, + } + + switch conn.State { + case ConnectionStatePending: + logger.Critical().WithFields(fields).WithFields(errorFields).Error("Connections.introduced called on pending connection") + return nil, ErrConnectionStateNotConnected + case ConnectionStateConnected: + if gnetID != conn.gnetID { + logger.Critical().WithFields(fields).WithFields(errorFields).Error("Connections.introduced called with different gnet ID") + return nil, ErrConnectionGnetIDMismatch + } + case ConnectionStateIntroduced: + logger.Critical().WithFields(fields).WithFields(errorFields).Error("Connections.introduced called on already introduced connection") + return nil, ErrConnectionAlreadyIntroduced + default: + logger.WithFields(fields).WithFields(errorFields).Panic("invalid connection state") + } + + if err := c.canUpdateMirror(ip, m.Mirror); err != nil { + logger.WithFields(fields).WithFields(errorFields).WithField("mirror", m.Mirror).WithError(err).Debug("canUpdateMirror failed") + return nil, err + } + + // For outgoing connections, which are created by pending, + // the listen port is set from the addr's port number. + // Since we are connecting to it, it is presumed to be that peer's open listening port. + // A misbehaving peer could report a different ListenPort in their IntroductionMessage, + // but it shouldn't affect our records. + if conn.Outgoing && conn.ListenPort != m.ListenPort { + logger.Critical().WithFields(fields).WithFields(logrus.Fields{ + "connListenPort": conn.ListenPort, + "introListenPort": m.ListenPort, + }).Warning("Outgoing connection's ListenPort does not match reported IntroductionMessage ListenPort") + } + + listenPort := conn.ListenPort + if !conn.Outgoing { + listenPort = m.ListenPort + } + + if err := c.updateMirror(ip, m.Mirror, listenPort); err != nil { + logger.WithFields(fields).WithField("mirror", m.Mirror).WithError(err).Panic("updateMirror failed, but shouldn't") + } + + conn.State = ConnectionStateIntroduced + conn.Mirror = m.Mirror + conn.ProtocolVersion = m.ProtocolVersion + conn.ListenPort = listenPort + conn.UserAgent = m.UserAgent + conn.UnconfirmedVerifyTxn = m.UnconfirmedVerifyTxn + conn.GenesisHash = m.GenesisHash + + if !conn.Outgoing { + listenAddr := conn.ListenAddr() + c.listenAddrs[listenAddr] = append(c.listenAddrs[listenAddr], addr) + } + + logger.WithFields(fields).Debug("Connections.introduced") + + return conn, nil +} + +// get returns a connection by address +func (c *Connections) get(addr string) *connection { + c.Lock() + defer c.Unlock() + + return c.conns[addr] +} + +func (c *Connections) getByListenAddr(listenAddr string) []*connection { + c.Lock() + defer c.Unlock() + + addrs := c.listenAddrs[listenAddr] + if len(addrs) == 0 { + return nil + } + + conns := make([]*connection, len(addrs)) + for i, a := range addrs { + conns[i] = c.conns[a] + } + + return conns +} + +func (c *Connections) getByGnetID(gnetID uint64) *connection { + c.Lock() + defer c.Unlock() + + if gnetID == 0 { + return nil + } + + addr := c.gnetIDs[gnetID] + if addr == "" { + return nil + } + + return c.conns[addr] +} + +// modify modifies a connection. +// It is unsafe to modify the Mirror value with this method +func (c *Connections) modify(addr string, gnetID uint64, f func(c *ConnectionDetails)) error { + conn := c.conns[addr] + if conn == nil { + return ErrConnectionNotExist + } + + if conn.gnetID != gnetID { + return ErrConnectionGnetIDMismatch + } + + // copy and modify + cd := conn.ConnectionDetails + + f(&cd) + + // compare to original + if cd.Mirror != conn.ConnectionDetails.Mirror { + logger.WithFields(logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + }).Panic("Connections.modify connection Mirror was changed") + } + + if cd.ListenPort != conn.ConnectionDetails.ListenPort { + logger.WithFields(logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + }).Panic("Connections.modify connection ListenPort was changed") + } + + conn.ConnectionDetails = cd + + return nil +} + +// SetHeight sets the height for a connection +func (c *Connections) SetHeight(addr string, gnetID uint64, height uint64) error { + c.Lock() + defer c.Unlock() + + return c.modify(addr, gnetID, func(c *ConnectionDetails) { + c.Height = height + }) +} + +func (c *Connections) updateMirror(ip string, mirror uint32, port uint16) error { + x := c.mirrors[mirror] + if x == nil { + x = make(map[string]uint16, 2) + } + + if _, ok := x[ip]; ok { + return ErrConnectionIPMirrorExists + } + + x[ip] = port + c.mirrors[mirror] = x + + return nil +} + +// canUpdateMirror returns false if a connection already exists with the same base IP and mirror value. +// This prevents duplicate connections to/from a single client. +func (c *Connections) canUpdateMirror(ip string, mirror uint32) error { + x := c.mirrors[mirror] + if x == nil { + return nil + } + + if _, ok := x[ip]; ok { + return ErrConnectionIPMirrorExists + } + + return nil +} + +// IPCount returns the number of connections for a given base IP (without port) +func (c *Connections) IPCount(ip string) int { + c.Lock() + defer c.Unlock() + return c.ipCounts[ip] +} + +// Len returns number of connections +func (c *Connections) Len() int { + c.Lock() + defer c.Unlock() + return len(c.conns) +} + +// OutgoingLen returns number of outgoing connections +func (c *Connections) OutgoingLen() int { + c.Lock() + defer c.Unlock() + n := 0 + for _, conn := range c.conns { + if conn.Outgoing { + n++ + } + } + return n +} + +// PendingLen returns the number of status pending connections +func (c *Connections) PendingLen() int { + c.Lock() + defer c.Unlock() + n := 0 + for _, conn := range c.conns { + if conn.State == ConnectionStatePending { + n++ + } + } + return n +} + +// remove removes connection. Returns an error if the addr is invalid. +// If a connection with this address does not exist, nothing happens. +func (c *Connections) remove(addr string, gnetID uint64) error { + c.Lock() + defer c.Unlock() + + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithError(err).Error("Connections.remove called with invalid addr") + return err + } + + conn := c.conns[addr] + if conn == nil { + return ErrConnectionNotExist + } + + fields := logrus.Fields{ + "addr": addr, + "connGnetID": conn.gnetID, + "gnetID": gnetID, + "listenPort": conn.ListenPort, + } + + if conn.gnetID != gnetID { + logger.Critical().WithFields(fields).Warning("Connections.remove gnetID does not match") + return ErrConnectionGnetIDMismatch + } + + x, ok := c.mirrors[conn.Mirror] + if ok { + if x[ip] != conn.ListenPort { + logger.Critical().WithFields(fields).Warning("Indexed IP+Mirror value found but the ListenPort doesn't match") + } + + delete(x, ip) + } + + if len(x) == 0 { + delete(c.mirrors, conn.Mirror) + } + + if c.ipCounts[ip] > 0 { + c.ipCounts[ip]-- + } else { + logger.Critical().WithFields(fields).Warning("ipCount was already 0 when removing existing address") + } + + listenAddr := conn.ListenAddr() + if listenAddr != "" { + addrs := c.listenAddrs[listenAddr] + for i, a := range addrs { + if a == conn.Addr { + addrs = append(addrs[:i], addrs[i+1:]...) + break + } + } + if len(addrs) == 0 { + delete(c.listenAddrs, listenAddr) + } else { + c.listenAddrs[listenAddr] = addrs + } + } + + delete(c.gnetIDs, conn.gnetID) + delete(c.conns, addr) + + return nil +} + +// all returns a copy of all connections +func (c *Connections) all() []connection { + c.Lock() + defer c.Unlock() + + conns := make([]connection, 0, len(c.conns)) + for _, c := range c.conns { + conns = append(conns, *c) + } + + return conns +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/daemon.go b/vendor/github.com/skycoin/skycoin/src/daemon/daemon.go new file mode 100644 index 0000000000..2502fe4785 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/daemon.go @@ -0,0 +1,1787 @@ +/* +Package daemon controls the networking layer of the skycoin daemon +*/ +package daemon + +import ( + "errors" + "fmt" + "math/rand" + "reflect" + "sort" + "strings" + "sync" + "time" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/transaction" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon/gnet" + "github.com/skycoin/skycoin/src/daemon/pex" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/util/elapse" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/util/iputil" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/useragent" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // ErrNetworkingDisabled is returned if networking is disabled + ErrNetworkingDisabled = errors.New("Networking is disabled") + // ErrNoPeerAcceptsTxn is returned if no peer will propagate a transaction broadcasted with BroadcastUserTransaction + ErrNoPeerAcceptsTxn = errors.New("No peer will propagate this transaction") + + logger = logging.MustGetLogger("daemon") +) + +// IsBroadcastFailure returns true if an error indicates that a broadcast operation failed +func IsBroadcastFailure(err error) bool { + switch err { + case ErrNetworkingDisabled, + gnet.ErrPoolEmpty, + gnet.ErrNoMatchingConnections, + gnet.ErrNoReachableConnections, + gnet.ErrNoAddresses: + return true + default: + return false + } +} + +const ( + daemonRunDurationThreshold = time.Millisecond * 200 +) + +// Config subsystem configurations +type Config struct { + Daemon DaemonConfig + Messages MessagesConfig + Pool PoolConfig + Pex pex.Config +} + +// NewConfig returns a Config with defaults set +func NewConfig() Config { + return Config{ + Daemon: NewDaemonConfig(), + Pool: NewPoolConfig(), + Pex: pex.NewConfig(), + Messages: NewMessagesConfig(), + } +} + +// preprocess preprocess for config +func (cfg *Config) preprocess() (Config, error) { + config := *cfg + if config.Daemon.LocalhostOnly { + if config.Daemon.Address == "" { + local, err := iputil.LocalhostIP() + if err != nil { + logger.WithError(err).Panic("Failed to obtain localhost IP") + } + config.Daemon.Address = local + } else { + if !iputil.IsLocalhost(config.Daemon.Address) { + logger.WithField("addr", config.Daemon.Address).Panic("Invalid address for localhost-only") + } + } + config.Pex.AllowLocalhost = true + } + config.Pool.port = config.Daemon.Port + config.Pool.address = config.Daemon.Address + + if config.Daemon.DisableNetworking { + logger.Info("Networking is disabled") + config.Pex.Disabled = true + config.Daemon.DisableIncomingConnections = true + config.Daemon.DisableOutgoingConnections = true + } else { + if config.Daemon.DisableIncomingConnections { + logger.Info("Incoming connections are disabled.") + } + if config.Daemon.DisableOutgoingConnections { + logger.Info("Outgoing connections are disabled.") + } + } + + if config.Daemon.MaxConnections < config.Daemon.MaxOutgoingConnections { + return Config{}, errors.New("MaxOutgoingConnections cannot be more than MaxConnections") + } + + if config.Daemon.MaxPendingConnections > config.Daemon.MaxOutgoingConnections { + config.Daemon.MaxPendingConnections = config.Daemon.MaxOutgoingConnections + } + + // MaxOutgoingMessageLength must be able to fit a GiveBlocksMessage with at least one maximum-sized block, + // otherwise it cannot send certain blocks. + // Blocks are the largest object sent over the network, so MaxBlockTransactionsSize is used as an upper limit + maxSizeGBM := maxSizeGiveBlocksMessage(config.Daemon.MaxBlockTransactionsSize) + if config.Daemon.MaxOutgoingMessageLength < maxSizeGBM { + return Config{}, fmt.Errorf("MaxOutgoingMessageLength must be >= %d", maxSizeGBM) + } + + userAgent, err := config.Daemon.UserAgent.Build() + if err != nil { + return Config{}, err + } + if userAgent == "" { + return Config{}, errors.New("user agent is required") + } + config.Daemon.userAgent = userAgent + + return config, nil +} + +// maxSizeGiveBlocksMessage return the encoded size of a GiveBlocksMessage +// with a single signed block of the largest possible size +func maxSizeGiveBlocksMessage(maxBlockSize uint32) uint64 { + size := uint64(4) // message type prefix + size += encodeSizeGiveBlocksMessage(&GiveBlocksMessage{}) // size of an empty GiveBlocksMessage + size += encodeSizeSignedBlock(&coin.SignedBlock{}) // size of an empty SignedBlock + size += uint64(maxBlockSize) // maximum size of all transactions in a block + return size +} + +// DaemonConfig configuration for the Daemon +type DaemonConfig struct { //nolint:golint + // Protocol version. TODO -- manage version better + ProtocolVersion int32 + // Minimum accepted protocol version + MinProtocolVersion int32 + // IP Address to serve on. Leave empty for automatic assignment + Address string + // BlockchainPubkey blockchain pubkey string + BlockchainPubkey cipher.PubKey + // GenesisHash genesis block hash + GenesisHash cipher.SHA256 + // TCP/UDP port for connections + Port int + // Directory where application data is stored + DataDirectory string + // How often to check and initiate an outgoing connection to a trusted connection if needed + OutgoingTrustedRate time.Duration + // How often to check and initiate an outgoing connection if needed + OutgoingRate time.Duration + // Maximum number of connections + MaxConnections int + // Number of outgoing connections to maintain + MaxOutgoingConnections int + // Maximum number of connections to try at once + MaxPendingConnections int + // How long to wait for a version packet + IntroductionWait time.Duration + // How often to check for peers that have decided to stop communicating + CullInvalidRate time.Duration + // How often to update the database with transaction announcement timestamps + FlushAnnouncedTxnsRate time.Duration + // How many connections are allowed from the same base IP + IPCountsMax int + // Disable all networking activity + DisableNetworking bool + // Don't make outgoing connections + DisableOutgoingConnections bool + // Don't allow incoming connections + DisableIncomingConnections bool + // Run on localhost and only connect to localhost peers + LocalhostOnly bool + // Log ping and pong messages + LogPings bool + // How often to request blocks from peers + BlocksRequestRate time.Duration + // How often to announce our blocks to peers + BlocksAnnounceRate time.Duration + // How many blocks to request in a GetBlocksMessage + GetBlocksRequestCount uint64 + // Maximum number of blocks to respond with to a GetBlocksMessage + MaxGetBlocksResponseCount uint64 + // Max announce txns hash number + MaxTxnAnnounceNum int + // How often new blocks are created by the signing node, in seconds + BlockCreationInterval uint64 + // How often to check the unconfirmed pool for transactions that become valid + UnconfirmedRefreshRate time.Duration + // How often to remove transactions that become permanently invalid from the unconfirmed pool + UnconfirmedRemoveInvalidRate time.Duration + // Default "trusted" peers + DefaultConnections []string + // User agent (sent in introduction messages) + UserAgent useragent.Data + userAgent string // parsed from UserAgent in preprocess() + // Transaction verification parameters for unconfirmed transactions + UnconfirmedVerifyTxn params.VerifyTxn + // Random nonce value for detecting self-connection in introduction messages + Mirror uint32 + // Maximum size of incoming messages + MaxIncomingMessageLength uint64 + // Maximum size of incoming messages + MaxOutgoingMessageLength uint64 + // Maximum total size of transactions in a block + MaxBlockTransactionsSize uint32 + // Maximum number of blocks to response on /api/v1/last_blocks API + MaxLastBlocksCount uint64 +} + +// NewDaemonConfig creates daemon config +func NewDaemonConfig() DaemonConfig { + return DaemonConfig{ + ProtocolVersion: 2, + MinProtocolVersion: 2, + Address: "", + Port: 6677, + OutgoingRate: time.Second * 5, + OutgoingTrustedRate: time.Millisecond * 100, + MaxConnections: 128, + MaxOutgoingConnections: 8, + MaxPendingConnections: 8, + IntroductionWait: time.Second * 30, + CullInvalidRate: time.Second * 3, + FlushAnnouncedTxnsRate: time.Second * 3, + IPCountsMax: 3, + DisableNetworking: false, + DisableOutgoingConnections: false, + DisableIncomingConnections: false, + LocalhostOnly: false, + LogPings: true, + BlocksRequestRate: time.Second * 60, + BlocksAnnounceRate: time.Second * 60, + GetBlocksRequestCount: 20, + MaxGetBlocksResponseCount: 20, + MaxTxnAnnounceNum: 16, + BlockCreationInterval: 10, + UnconfirmedRefreshRate: time.Minute, + UnconfirmedRemoveInvalidRate: time.Minute, + Mirror: rand.New(rand.NewSource(time.Now().UTC().UnixNano())).Uint32(), + UnconfirmedVerifyTxn: params.UserVerifyTxn, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + MaxBlockTransactionsSize: 32768, + } +} + +//go:generate mockery -name daemoner -case underscore -inpkg -testonly + +// daemoner Daemon interface +type daemoner interface { + Disconnect(addr string, r gnet.DisconnectReason) error + DaemonConfig() DaemonConfig + sendMessage(addr string, msg gnet.Message) error + broadcastMessage(msg gnet.Message) ([]uint64, error) + disconnectNow(addr string, r gnet.DisconnectReason) error + addPeers(addrs []string) int + recordPeerHeight(addr string, gnetID, height uint64) + getSignedBlocksSince(seq, count uint64) ([]coin.SignedBlock, error) + headBkSeq() (uint64, bool, error) + executeSignedBlock(b coin.SignedBlock) error + filterKnownUnconfirmed(txns []cipher.SHA256) ([]cipher.SHA256, error) + getKnownUnconfirmed(txns []cipher.SHA256) (coin.Transactions, error) + requestBlocksFromAddr(addr string) error + announceAllValidTxns() error + pexConfig() pex.Config + injectTransaction(txn coin.Transaction) (bool, *transaction.ErrTxnViolatesSoftConstraint, error) + recordMessageEvent(m asyncMessage, c *gnet.MessageContext) error + connectionIntroduced(addr string, gnetID uint64, m *IntroductionMessage) (*connection, error) + sendRandomPeers(addr string) error +} + +// Daemon stateful properties of the daemon +type Daemon struct { + // Daemon configuration + config DaemonConfig + + // Components + Messages *Messages + pool *Pool + pex *pex.Pex + visor *visor.Visor + + // Cache of announced transactions that are flushed to the database periodically + announcedTxns *announcedTxnsCache + // Cache of connection metadata + connections *Connections + // connect, disconnect, message, error events channel + events chan interface{} + // quit channel + quit chan struct{} + // done channel + done chan struct{} +} + +// New returns a Daemon with primitives allocated +func New(config Config, v *visor.Visor) (*Daemon, error) { + config, err := config.preprocess() + if err != nil { + return nil, err + } + + pex, err := pex.New(config.Pex) + if err != nil { + return nil, err + } + + messages := NewMessages(config.Messages) + messages.Config.Register() + + d := &Daemon{ + config: config.Daemon, + Messages: messages, + pex: pex, + visor: v, + + announcedTxns: newAnnouncedTxnsCache(), + connections: NewConnections(), + events: make(chan interface{}, config.Pool.EventChannelSize), + quit: make(chan struct{}), + done: make(chan struct{}), + } + + d.pool, err = NewPool(config.Pool, d) + if err != nil { + return nil, err + } + + return d, nil +} + +// ConnectEvent generated when a client connects +type ConnectEvent struct { + GnetID uint64 + Addr string + Solicited bool +} + +// DisconnectEvent generated when a connection terminated +type DisconnectEvent struct { + GnetID uint64 + Addr string + Reason gnet.DisconnectReason +} + +// ConnectFailureEvent represent a failure to connect/dial a connection, with context +type ConnectFailureEvent struct { + Addr string + Solicited bool + Error error +} + +// messageEvent encapsulates a deserialized message from the network +type messageEvent struct { + Message asyncMessage + Context *gnet.MessageContext +} + +// Shutdown terminates all subsystems safely +func (dm *Daemon) Shutdown() { + defer logger.Info("Daemon shutdown complete") + + // close daemon run loop first to avoid creating new connection after + // the connection pool is shutdown. + logger.Info("Stopping the daemon run loop") + close(dm.quit) + + logger.Info("Shutting down Pool") + dm.pool.Shutdown() + + logger.Info("Shutting down Pex") + dm.pex.Shutdown() + + <-dm.done +} + +// Run main loop for peer/connection management +func (dm *Daemon) Run() error { + defer logger.Info("Daemon closed") + defer close(dm.done) + + logger.Infof("Daemon UserAgent is %s", dm.config.userAgent) + logger.Infof("Daemon unconfirmed BurnFactor is %d", dm.config.UnconfirmedVerifyTxn.BurnFactor) + logger.Infof("Daemon unconfirmed MaxTransactionSize is %d", dm.config.UnconfirmedVerifyTxn.MaxTransactionSize) + logger.Infof("Daemon unconfirmed MaxDropletPrecision is %d", dm.config.UnconfirmedVerifyTxn.MaxDropletPrecision) + + errC := make(chan error, 5) + var wg sync.WaitGroup + wg.Add(1) + go dm.startPex(&wg, errC) + wg.Add(1) + go dm.startConnPool(&wg, errC) + + blockInterval := time.Duration(dm.config.BlockCreationInterval) + blockCreationTicker := time.NewTicker(time.Second * blockInterval) + if !dm.visor.Config.IsBlockPublisher { + blockCreationTicker.Stop() + } + + blocksRequestTicker := time.NewTicker(dm.config.BlocksRequestRate) + defer blocksRequestTicker.Stop() + blocksAnnounceTicker := time.NewTicker(dm.config.BlocksAnnounceRate) + defer blocksAnnounceTicker.Stop() + + flushAnnouncedTxnsTicker := time.NewTicker(dm.config.FlushAnnouncedTxnsRate) + defer flushAnnouncedTxnsTicker.Stop() + + // Try to connect to limited trusted public peers + if !dm.config.DisableOutgoingConnections { + wg.Add(1) + go func() { + defer wg.Done() + if err := dm.maybeConnectToTrustedPeer(); err != nil { + logger.WithError(err).Error("Try to connect to trusted peer failed") + } + }() + } + + var setupErr error + elapser := elapse.NewElapser(daemonRunDurationThreshold, logger) + wg.Add(1) + go dm.startMessageSendResultProcess(&wg) + wg.Add(1) + go dm.startUnconfirmedTxnsProcess(&wg) + +loop: + for { + elapser.CheckForDone() + select { + case <-dm.quit: + break loop + + case r := <-dm.events: + elapser.Register("dm.event") + if dm.config.DisableNetworking { + logger.Critical().Error("Networking is disabled, there should be no events") + } else { + dm.handleEvent(r) + } + + case <-flushAnnouncedTxnsTicker.C: + elapser.Register("flushAnnouncedTxnsTicker") + txns := dm.announcedTxns.flush() + + if err := dm.visor.SetTransactionsAnnounced(txns); err != nil { + logger.WithError(err).Error("Failed to set unconfirmed txn announce time") + } + + case <-blockCreationTicker.C: + // Create blocks, if block publisher + elapser.Register("blockCreationTicker.C") + if dm.visor.Config.IsBlockPublisher { + sb, err := dm.createAndPublishBlock() + if err != nil { + logger.WithError(err).Error("Failed to create and publish block") + continue + } + + // Not a critical error, but we want it visible in logs + head := sb.Block.Head + logger.Critical().WithFields(logrus.Fields{ + "version": head.Version, + "seq": head.BkSeq, + "time": head.Time, + }).Info("Created and published a new block") + } + + case <-blocksRequestTicker.C: + elapser.Register("blocksRequestTicker") + if err := dm.requestBlocks(); err != nil { + logger.WithError(err).Warning("requestBlocks failed") + } + + case <-blocksAnnounceTicker.C: + elapser.Register("blocksAnnounceTicker") + if err := dm.announceBlocks(); err != nil { + logger.WithError(err).Warning("announceBlocks failed") + } + + case setupErr = <-errC: + logger.WithError(setupErr).Error("read from errc") + break loop + } + } + + if setupErr != nil { + return setupErr + } + + wg.Wait() + + return nil +} + +func (dm *Daemon) startPex(wg *sync.WaitGroup, errC chan error) { + defer wg.Done() + go func() { + if err := dm.pex.Run(); err != nil { + logger.WithError(err).Error("daemon.Pex.Run failed") + errC <- err + } + }() + + elapser := elapse.NewElapser(daemonRunDurationThreshold, logger) + requestPeersTicker := time.NewTicker(dm.pex.Config.RequestRate) + defer requestPeersTicker.Stop() + + for { + select { + case <-dm.quit: + return + case <-requestPeersTicker.C: + // Request peers via PEX + elapser.Register("requestPeersTicker") + if dm.pex.Config.Disabled { + continue + } + + if dm.pex.IsFull() { + continue + } + + m := NewGetPeersMessage() + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Error("Broadcast GetPeersMessage failed") + continue + } + } + } +} + +func (dm *Daemon) startConnPool(wg *sync.WaitGroup, errC chan error) { + defer wg.Done() + go func() { + if dm.config.DisableIncomingConnections { + if err := dm.pool.RunOffline(); err != nil { + logger.WithError(err).Error("daemon.Pool.RunOffline failed") + errC <- err + } + } else { + if err := dm.pool.Run(); err != nil { + logger.WithError(err).Error("daemon.Pool.Run failed") + errC <- err + } + } + }() + + elapser := elapse.NewElapser(daemonRunDurationThreshold, logger) + + idleCheckTicker := time.NewTicker(dm.pool.Config.IdleCheckRate) + defer idleCheckTicker.Stop() + cullInvalidTicker := time.NewTicker(dm.config.CullInvalidRate) + defer cullInvalidTicker.Stop() + clearStaleConnectionsTicker := time.NewTicker(dm.pool.Config.ClearStaleRate) + defer clearStaleConnectionsTicker.Stop() + + // outgoingTrustedConnectionsTicker is used to maintain at least two connections to trusted peers. + // This may be configured at a very frequent rate, so if no trusted connections could be reached, + // there could be a lot of churn. + // The additional outgoingTrustedConnectionsTicker parameters are used to + // skip ticks of the outgoingTrustedConnectionsTicker in the event of total failure. + // outgoingTrustedConnectionsTickerSkipDuration is the minimum time to wait between + // ticks in the event of total failure. + outgoingTrustedConnectionsTicker := time.NewTicker(dm.config.OutgoingTrustedRate) + defer outgoingTrustedConnectionsTicker.Stop() + outgoingTrustedConnectionsTickerSkipDuration := time.Second * 5 + outgoingTrustedConnectionsTickerSkip := false + var outgoingTrustedConnectionsTickerSkipStart time.Time + + outgoingConnectionsTicker := time.NewTicker(dm.config.OutgoingRate) + defer outgoingConnectionsTicker.Stop() + for { + select { + case <-dm.quit: + return + case <-outgoingConnectionsTicker.C: + // Fill up our outgoing connections + elapser.Register("outgoingConnectionsTicker") + dm.connectToRandomPeer() + + case <-outgoingTrustedConnectionsTicker.C: + // Try to maintain at least one trusted connection + elapser.Register("outgoingTrustedConnectionsTicker") + // If connecting to a trusted peer totally fails, make sure to wait longer between further attempts + if outgoingTrustedConnectionsTickerSkip { + if time.Since(outgoingTrustedConnectionsTickerSkipStart) < outgoingTrustedConnectionsTickerSkipDuration { + continue + } + } + + if err := dm.maybeConnectToTrustedPeer(); err != nil && err != ErrNetworkingDisabled { + logger.Critical().WithError(err).Error("maybeConnectToTrustedPeer") + outgoingTrustedConnectionsTickerSkip = true + outgoingTrustedConnectionsTickerSkipStart = time.Now() + } else { + outgoingTrustedConnectionsTickerSkip = false + } + + case <-idleCheckTicker.C: + // Sends pings as needed + elapser.Register("idleCheckTicker") + if !dm.config.DisableNetworking { + dm.pool.sendPings() + } + case <-cullInvalidTicker.C: + // Remove connections that failed to complete the handshake + elapser.Register("cullInvalidTicker") + if !dm.config.DisableNetworking { + dm.cullInvalidConnections() + } + + case <-clearStaleConnectionsTicker.C: + // Remove connections that haven't said anything in a while + elapser.Register("clearStaleConnectionsTicker") + if !dm.config.DisableNetworking { + conns, err := dm.pool.getStaleConnections() + if err != nil { + logger.WithError(err).Error("getStaleConnections failed") + continue + } + + for _, addr := range conns { + if err := dm.Disconnect(addr, ErrDisconnectIdle); err != nil { + logger.WithError(err).WithField("addr", addr).Error("Disconnect") + } + } + } + } + } +} + +// Process SendResults in a separate goroutine, otherwise SendResults +// will fill up much faster than can be processed by the daemon run loop +// dm.handleMessageSendResult must take care not to perform any operation +// that would violate thread safety, since it is not serialized by the daemon run loop +func (dm *Daemon) startMessageSendResultProcess(wg *sync.WaitGroup) { + defer wg.Done() + elapser := elapse.NewElapser(daemonRunDurationThreshold, logger) + for { + elapser.CheckForDone() + select { + case <-dm.quit: + return + + case r := <-dm.pool.Pool.SendResults: + // Process message sending results + elapser.Register("dm.Pool.Pool.SendResults") + if dm.config.DisableNetworking { + logger.Error("There should be nothing in SendResults") + return + } + dm.handleMessageSendResult(r) + } + } +} + +func (dm *Daemon) startUnconfirmedTxnsProcess(wg *sync.WaitGroup) { + unconfirmedRefreshTicker := time.NewTicker(dm.config.UnconfirmedRefreshRate) + defer unconfirmedRefreshTicker.Stop() + unconfirmedRemoveInvalidTicker := time.NewTicker(dm.config.UnconfirmedRemoveInvalidRate) + defer unconfirmedRemoveInvalidTicker.Stop() + elapser := elapse.NewElapser(daemonRunDurationThreshold, logger) + defer wg.Done() + for { + select { + case <-dm.quit: + return + case <-unconfirmedRefreshTicker.C: + elapser.Register("unconfirmedRefreshTicker") + // Get the transactions that turn to valid + validTxns, err := dm.visor.RefreshUnconfirmed() + if err != nil { + logger.WithError(err).Error("dm.Visor.RefreshUnconfirmed failed") + continue + } + // Announce these transactions + if err := dm.announceTxnHashes(validTxns); err != nil { + logger.WithError(err).Warning("announceTxnHashes failed") + } + case <-unconfirmedRemoveInvalidTicker.C: + elapser.Register("unconfirmedRemoveInvalidTicker") + // Remove transactions that become invalid (violating hard constraints) + removedTxns, err := dm.visor.RemoveInvalidUnconfirmed() + if err != nil { + logger.WithError(err).Error("dm.Visor.RemoveInvalidUnconfirmed failed") + continue + } + if len(removedTxns) > 0 { + logger.Infof("Remove %d txns from pool that began violating hard constraints", len(removedTxns)) + } + } + } +} + +// Connects to a given peer. Returns an error if no connection attempt was +// made. If the connection attempt itself fails, the error is sent to +// the connectionErrors channel. +func (dm *Daemon) connectToPeer(p pex.Peer) error { + if dm.config.DisableOutgoingConnections { + return errors.New("Outgoing connections disabled") + } + + a, _, err := iputil.SplitAddr(p.Addr) + if err != nil { + logger.Critical().WithField("addr", p.Addr).WithError(err).Warning("PEX gave us an invalid peer") + return errors.New("Invalid peer") + } + + if dm.config.LocalhostOnly && !iputil.IsLocalhost(a) { + return errors.New("Not localhost") + } + + if c := dm.connections.get(p.Addr); c != nil { + return errors.New("Already connected to this peer") + } + + cnt := dm.connections.IPCount(a) + if !dm.config.LocalhostOnly && cnt != 0 { + return errors.New("Already connected to a peer with this base IP") + } + + logger.WithField("addr", p.Addr).Debug("Establishing outgoing connection") + + if _, err := dm.connections.pending(p.Addr); err != nil { + logger.Critical().WithError(err).WithField("addr", p.Addr).Error("dm.connections.pending failed") + return err + } + + go func() { + if err := dm.pool.Pool.Connect(p.Addr); err != nil { + dm.events <- ConnectFailureEvent{ + Addr: p.Addr, + Solicited: true, + Error: err, + } + } + }() + return nil +} + +// maybeConnectToTrustedPeer tries to connect to limited number of trusted peer +func (dm *Daemon) maybeConnectToTrustedPeer() error { + if dm.config.DisableOutgoingConnections { + return ErrNetworkingDisabled + } + + if dm.pool.IsMaxOutgoingDefaultConnectionsReached() { + return nil + } + + var triedPeers int + peers := dm.pex.Trusted() + for _, p := range peers { + if err := dm.connectToPeer(p); err != nil { + logger.WithError(err).WithField("addr", p.Addr).Warning("maybeConnectToTrustedPeer: connectToPeer failed") + continue + } + triedPeers++ + if triedPeers >= dm.maxDefaultOutgoingConnections() { + break + } + } + + if triedPeers == 0 { + return errors.New("Could not connect to any trusted peer") + } + + return nil +} + +func (dm Daemon) maxDefaultOutgoingConnections() int { + return dm.pool.Config.MaxDefaultPeerOutgoingConnections +} + +// connectToRandomPeer attempts to connect to a random peer. If it fails, the peer is removed. +func (dm *Daemon) connectToRandomPeer() { + if dm.config.DisableOutgoingConnections { + return + } + if dm.connections.OutgoingLen() >= dm.config.MaxOutgoingConnections { + return + } + if dm.connections.PendingLen() >= dm.config.MaxPendingConnections { + return + } + if dm.connections.Len() >= dm.config.MaxConnections { + return + } + + // Make a connection to a random (public) peer + peers := dm.pex.Random(dm.config.MaxOutgoingConnections - dm.connections.OutgoingLen()) + for _, p := range peers { + if err := dm.connectToPeer(p); err != nil { + logger.WithError(err).WithField("addr", p.Addr).Warning("connectToPeer failed") + } + } + + // TODO -- don't reset if not needed? + if len(peers) == 0 { + dm.pex.ResetAllRetryTimes() + } +} + +// Removes connections who haven't sent a version after connecting +func (dm *Daemon) cullInvalidConnections() { + now := time.Now().UTC() + for _, c := range dm.connections.all() { + if c.State != ConnectionStateConnected { + continue + } + + if c.ConnectedAt.Add(dm.config.IntroductionWait).Before(now) { + logger.WithField("addr", c.Addr).Info("Disconnecting peer for not sending a version") + if err := dm.Disconnect(c.Addr, ErrDisconnectIntroductionTimeout); err != nil { + logger.WithError(err).WithField("addr", c.Addr).Error("Disconnect") + } + } + } +} + +func (dm *Daemon) isTrustedPeer(addr string) bool { + peer, ok := dm.pex.GetPeer(addr) + if !ok { + return false + } + + return peer.Trusted +} + +// recordMessageEvent records an asyncMessage to the messageEvent chan. Do not access +// messageEvent directly. +func (dm *Daemon) recordMessageEvent(m asyncMessage, c *gnet.MessageContext) error { + dm.events <- messageEvent{ + Message: m, + Context: c, + } + return nil +} + +func (dm *Daemon) handleEvent(e interface{}) { + switch x := e.(type) { + case messageEvent: + dm.onMessageEvent(x) + case ConnectEvent: + dm.onConnectEvent(x) + case DisconnectEvent: + dm.onDisconnectEvent(x) + case ConnectFailureEvent: + dm.onConnectFailure(x) + default: + logger.WithFields(logrus.Fields{ + "type": fmt.Sprintf("%T", e), + "value": fmt.Sprintf("%+v", e), + }).Panic("Invalid object in events queue") + } +} + +func (dm *Daemon) onMessageEvent(e messageEvent) { + // If the connection does not exist or the gnet ID is different, abort message processing + // This can occur because messageEvents for a given connection may occur + // after that connection has disconnected. + c := dm.connections.get(e.Context.Addr) + if c == nil { + logger.WithFields(logrus.Fields{ + "addr": e.Context.Addr, + "messageType": fmt.Sprintf("%T", e.Message), + }).Info("onMessageEvent no connection found") + return + } + + if c.gnetID != e.Context.ConnID { + logger.WithFields(logrus.Fields{ + "addr": e.Context.Addr, + "connGnetID": c.gnetID, + "contextGnetID": e.Context.ConnID, + "messageType": fmt.Sprintf("%T", e.Message), + }).Info("onMessageEvent connection gnetID does not match") + return + } + + // The first message received must be INTR, DISC or GIVP + if !c.HasIntroduced() { + switch e.Message.(type) { + case *IntroductionMessage, *DisconnectMessage, *GivePeersMessage: + default: + logger.WithFields(logrus.Fields{ + "addr": e.Context.Addr, + "messageType": fmt.Sprintf("%T", e.Message), + }).Info("needsIntro but first message is not INTR, DISC or GIVP") + if err := dm.Disconnect(e.Context.Addr, ErrDisconnectNoIntroduction); err != nil { + logger.WithError(err).WithField("addr", e.Context.Addr).Error("Disconnect") + } + return + } + } + + e.Message.process(dm) +} + +func (dm *Daemon) onConnectEvent(e ConnectEvent) { + fields := logrus.Fields{ + "addr": e.Addr, + "outgoing": e.Solicited, + "gnetID": e.GnetID, + } + logger.WithFields(fields).Info("onConnectEvent") + + // Update the connections state machine first + c, err := dm.connections.connected(e.Addr, e.GnetID) + if err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("connections.Connected failed") + if err := dm.Disconnect(e.Addr, ErrDisconnectUnexpectedError); err != nil { + logger.WithError(err).WithFields(fields).Error("Disconnect") + } + return + } + + // The connection should already be known as outgoing/solicited due to an earlier connections.pending call. + // If they do not match, there is e.Addr flaw in the concept or implementation of the state machine. + if c.Outgoing != e.Solicited { + logger.Critical().WithFields(fields).Warning("Connection.Outgoing does not match ConnectEvent.Solicited state") + } + + if dm.ipCountMaxed(e.Addr) { + logger.WithFields(fields).Info("Max connections for this IP address reached, disconnecting") + if err := dm.Disconnect(e.Addr, ErrDisconnectIPLimitReached); err != nil { + logger.WithError(err).WithFields(fields).Error("Disconnect") + } + return + } + + logger.WithFields(fields).Debug("Sending introduction message") + + if err := dm.sendMessage(e.Addr, NewIntroductionMessage( + dm.config.Mirror, + dm.config.ProtocolVersion, + dm.pool.Pool.Config.Port, + dm.config.BlockchainPubkey, + dm.config.userAgent, + dm.config.UnconfirmedVerifyTxn, + dm.config.GenesisHash, + )); err != nil { + logger.WithFields(fields).WithError(err).Error("Send IntroductionMessage failed") + return + } +} + +func (dm *Daemon) onDisconnectEvent(e DisconnectEvent) { + fields := logrus.Fields{ + "addr": e.Addr, + "reason": e.Reason, + "gnetID": e.GnetID, + } + logger.WithFields(fields).Info("onDisconnectEvent") + + if err := dm.connections.remove(e.Addr, e.GnetID); err != nil { + logger.WithError(err).WithFields(fields).Error("connections.Remove failed") + return + } + + // TODO -- blacklist peer for certain reasons, not just remove + switch e.Reason { + case ErrDisconnectIntroductionTimeout, + ErrDisconnectBlockchainPubkeyNotMatched, + ErrDisconnectInvalidExtraData, + ErrDisconnectInvalidUserAgent: + if !dm.isTrustedPeer(e.Addr) { + dm.pex.RemovePeer(e.Addr) + } + case ErrDisconnectNoIntroduction, + ErrDisconnectVersionNotSupported, + ErrDisconnectSelf: + dm.pex.IncreaseRetryTimes(e.Addr) + default: + switch e.Reason.Error() { + case "read failed: EOF": + dm.pex.IncreaseRetryTimes(e.Addr) + } + } +} + +func (dm *Daemon) onConnectFailure(c ConnectFailureEvent) { + // Remove the pending connection from connections and update the retry times in pex + logger.WithField("addr", c.Addr).WithError(c.Error).Debug("onConnectFailure") + + // onConnectFailure should only trigger for "pending" connections which have gnet ID 0; + // connections in any other state will have a nonzero gnet ID. + // if the connection is in a different state, the gnet ID will not match, the connection + // won't be removed and we'll receive an error. + // If this happens, it is a bug, and the connections state may be corrupted. + if err := dm.connections.remove(c.Addr, 0); err != nil { + logger.Critical().WithField("addr", c.Addr).WithError(err).Error("connections.remove") + } + + if strings.HasSuffix(c.Error.Error(), "connect: connection refused") { + dm.pex.IncreaseRetryTimes(c.Addr) + } +} + +// onGnetDisconnect triggered when a gnet.Connection terminates +func (dm *Daemon) onGnetDisconnect(addr string, gnetID uint64, reason gnet.DisconnectReason) { + dm.events <- DisconnectEvent{ + GnetID: gnetID, + Addr: addr, + Reason: reason, + } +} + +// onGnetConnect Triggered when a gnet.Connection connects +func (dm *Daemon) onGnetConnect(addr string, gnetID uint64, solicited bool) { + dm.events <- ConnectEvent{ + GnetID: gnetID, + Addr: addr, + Solicited: solicited, + } +} + +// onGnetConnectFailure triggered when a gnet.Connection fails to connect +func (dm *Daemon) onGnetConnectFailure(addr string, solicited bool, err error) { + dm.events <- ConnectFailureEvent{ + Addr: addr, + Solicited: solicited, + Error: err, + } +} + +// Returns whether the ipCount maximum has been reached. +// Always false when using LocalhostOnly config. +func (dm *Daemon) ipCountMaxed(addr string) bool { + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithField("addr", addr).Error("ipCountMaxed called with invalid addr") + return true + } + + return !dm.config.LocalhostOnly && dm.connections.IPCount(ip) >= dm.config.IPCountsMax +} + +// When an async message send finishes, its result is handled by this. +// This method must take care to perform only thread-safe actions, since it is called +// outside of the daemon run loop +func (dm *Daemon) handleMessageSendResult(r gnet.SendResult) { + if r.Error != nil { + var lg logrus.FieldLogger + if r.Error == gnet.ErrMsgExceedsMaxLen { + lg = logger.Critical() + } else { + lg = logger + } + + lg.WithError(r.Error).WithFields(logrus.Fields{ + "addr": r.Addr, + "msgType": reflect.TypeOf(r.Message), + }).Warning("Failed to send message") + return + } + + if m, ok := r.Message.(SendingTxnsMessage); ok { + dm.announcedTxns.add(m.GetFiltered()) + } + + if m, ok := r.Message.(*DisconnectMessage); ok { + if err := dm.disconnectNow(r.Addr, m.reason); err != nil { + logger.WithError(err).WithField("addr", r.Addr).Warning("disconnectNow") + } + } +} + +// requestBlocks sends a GetBlocksMessage to all connections +func (dm *Daemon) requestBlocks() error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot request blocks, there is no head block") + } + + m := NewGetBlocksMessage(headSeq, dm.config.GetBlocksRequestCount) + + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Debug("Broadcast GetBlocksMessage failed") + return err + } + + return nil +} + +// announceBlocks sends an AnnounceBlocksMessage to all connections +func (dm *Daemon) announceBlocks() error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot announce blocks, there is no head block") + } + + m := NewAnnounceBlocksMessage(headSeq) + + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Debug("Broadcast AnnounceBlocksMessage failed") + return err + } + + return nil +} + +// createAndPublishBlock creates a block from unconfirmed transactions and sends it to the network. +// Will panic if not running as a block publisher. +// Will not create a block if outgoing connections are disabled. +// If the block was created but the broadcast failed, the error will be non-nil but the +// SignedBlock value will not be empty. +// TODO -- refactor this method -- it should either always create a block and maybe broadcast it, +// or use a database transaction to rollback block publishing if broadcast failed (however, this will cause a slow DB write) +func (dm *Daemon) createAndPublishBlock() (*coin.SignedBlock, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + sb, err := dm.visor.CreateAndExecuteBlock() + if err != nil { + return nil, err + } + + err = dm.broadcastBlock(sb) + + return &sb, err +} + +// ResendUnconfirmedTxns resends all unconfirmed transactions and returns the hashes that were successfully rebroadcast. +// It does not return an error if broadcasting fails. +func (dm *Daemon) ResendUnconfirmedTxns() ([]cipher.SHA256, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + txns, err := dm.visor.GetAllUnconfirmedTransactions() + if err != nil { + return nil, err + } + + var txids []cipher.SHA256 + for i := range txns { + txnHash := txns[i].Transaction.Hash() + logger.WithField("txid", txnHash.Hex()).Debug("Rebroadcast transaction") + if _, err := dm.BroadcastTransaction(txns[i].Transaction); err == nil { + txids = append(txids, txnHash) + } + } + + return txids, nil +} + +// BroadcastTransaction broadcasts a single transaction to all peers. +func (dm *Daemon) BroadcastTransaction(txn coin.Transaction) ([]uint64, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + m := NewGiveTxnsMessage(coin.Transactions{txn}, dm.config.MaxOutgoingMessageLength) + if len(m.Transactions) != 1 { + logger.Critical().Error("NewGiveTxnsMessage truncated its only transaction") + } + + ids, err := dm.broadcastMessage(m) + if err != nil { + logger.WithError(err).Error("Broadcast GiveTxnsMessage failed") + return nil, err + } + + logger.Debugf("BroadcastTransaction to %d conns", len(ids)) + + return ids, nil +} + +// BroadcastUserTransaction broadcasts a single transaction to all peers. +// Returns an error if no peers that would propagate the transaction could be reached. +func (dm *Daemon) BroadcastUserTransaction(txn coin.Transaction, head *coin.SignedBlock, inputs coin.UxArray) error { + ids, err := dm.BroadcastTransaction(txn) + if err != nil { + return err + } + + accepts, err := checkBroadcastTxnRecipients(dm.connections, ids, txn, head, inputs) + if err != nil { + logger.WithError(err).Error("BroadcastUserTransaction") + return err + } + + logger.Debugf("BroadcastUserTransaction transaction propagated by %d/%d conns", accepts, len(ids)) + + return nil +} + +// checkBroadcastTxnRecipients checks whether or not the recipients of a txn broadcast would accept the transaction as valid, +// based upon their reported txn verification parameters. +// If no recipient would accept the txn, an error is returned. +// The number of recipients that claim to accept the transaction is returned. +func checkBroadcastTxnRecipients(connections *Connections, ids []uint64, txn coin.Transaction, head *coin.SignedBlock, inputs coin.UxArray) (int, error) { + // Check if the connections will accept our transaction as valid. + // Clients v24 and earlier do not propagate soft-invalid transactions. + // Clients v24 and earlier do not advertise a user agent. + // Clients v24 and earlier do not advertise their transaction verification parameters, + // but will use defaults of BurnFactor=2, MaxTransactionSize=32768, MaxDropletPrecision=3. + // If none of the connections will propagate our transaction, return an error. + accepts := 0 + + for _, id := range ids { + c := connections.getByGnetID(id) + if c == nil { + continue + } + + if !c.HasIntroduced() { + continue + } + + // If the peer has not set their user agent, they are v24 or earlier. + // v24 and earlier will not propagate a transaction that does not pass soft-validation. + // Check if our transaction would pass their soft-validation, using the hardcoded defaults + // that are used by v24 and earlier. + if c.UserAgent.Empty() { + if err := verifyUserTxnAgainstPeer(txn, head, inputs, params.VerifyTxn{ + BurnFactor: 2, + MaxTransactionSize: 32 * 1024, + MaxDropletPrecision: 3, + }); err != nil { + logger.WithFields(logrus.Fields{ + "addr": c.Addr, + "gnetID": c.gnetID, + }).Debug("Peer will not propagate this transaction") + continue + } + } + + accepts++ + } + + if accepts == 0 { + return 0, ErrNoPeerAcceptsTxn + } + + return accepts, nil +} + +// verifyUserTxnAgainstPeer returns an error if a user-created transaction would not pass soft-validation +// according to a peer's reported verification parameters +func verifyUserTxnAgainstPeer(txn coin.Transaction, head *coin.SignedBlock, inputs coin.UxArray, verifyParams params.VerifyTxn) error { + // Check the droplet precision + for _, o := range txn.Out { + if err := params.DropletPrecisionCheck(verifyParams.MaxDropletPrecision, o.Coins); err != nil { + return err + } + } + + // Check the txn size + txnSize, err := txn.Size() + if err != nil { + logger.Critical().WithError(err).Error("txn.Size failed unexpectedly") + return err + } + + if txnSize > verifyParams.MaxTransactionSize { + return transaction.ErrTxnExceedsMaxBlockSize + } + + // Check the coinhour burn fee + f, err := fee.TransactionFee(&txn, head.Time(), inputs) + if err != nil { + return err + } + + if err := fee.VerifyTransactionFee(&txn, f, verifyParams.BurnFactor); err != nil { + return err + } + + return nil +} + +// Disconnect sends a DisconnectMessage to a peer. After the DisconnectMessage is sent, the peer is disconnected. +// This allows all pending messages to be sent. Any message queued after a DisconnectMessage is unlikely to be sent +// to the peer (but possible). +func (dm *Daemon) Disconnect(addr string, r gnet.DisconnectReason) error { + logger.WithFields(logrus.Fields{ + "addr": addr, + "reason": r, + }).Debug("Sending DisconnectMessage") + return dm.sendMessage(addr, NewDisconnectMessage(r)) +} + +// Implements private daemoner interface methods: + +// requestBlocksFromAddr sends a GetBlocksMessage to one connected address +func (dm *Daemon) requestBlocksFromAddr(addr string) error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot request blocks from addr, there is no head block") + } + + m := NewGetBlocksMessage(headSeq, dm.config.GetBlocksRequestCount) + return dm.sendMessage(addr, m) +} + +// broadcastBlock sends a signed block to all connections +func (dm *Daemon) broadcastBlock(sb coin.SignedBlock) error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + m := NewGiveBlocksMessage([]coin.SignedBlock{sb}, dm.config.MaxOutgoingMessageLength) + if len(m.Blocks) != 1 { + logger.Critical().Error("NewGiveBlocksMessage truncated its only block") + } + + _, err := dm.broadcastMessage(m) + return err +} + +// DaemonConfig returns the daemon config +func (dm *Daemon) DaemonConfig() DaemonConfig { + return dm.config +} + +// connectionIntroduced transfers a connection to the "introduced" state in the connections state machine +// and updates other state +func (dm *Daemon) connectionIntroduced(addr string, gnetID uint64, m *IntroductionMessage) (*connection, error) { + c, err := dm.connections.introduced(addr, gnetID, m) + if err != nil { + return nil, err + } + + listenAddr := c.ListenAddr() + + fields := logrus.Fields{ + "addr": addr, + "gnetID": m.c.ConnID, + "connGnetID": c.gnetID, + "listenPort": m.ListenPort, + "listenAddr": listenAddr, + } + + if c.Outgoing { + // For successful outgoing connections, mark the peer as having an incoming port in the pex peerlist + // The peer should already be in the peerlist, since we use the peerlist to choose an outgoing connection to make + if err := dm.pex.SetHasIncomingPort(listenAddr, true); err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("pex.SetHasIncomingPort failed") + return nil, err + } + } else { + // For successful incoming connections, add the peer to the peer list, with their self-reported listen port + if err := dm.pex.AddPeer(listenAddr); err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("pex.AddPeer failed") + return nil, err + } + } + + if err := dm.pex.SetUserAgent(listenAddr, c.UserAgent); err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("pex.SetUserAgent failed") + return nil, err + } + + dm.pex.ResetRetryTimes(listenAddr) + + return c, nil +} + +// sendRandomPeers sends a random sample of peers to another peer +func (dm *Daemon) sendRandomPeers(addr string) error { + peers := dm.pex.RandomExchangeable(dm.pex.Config.ReplyCount) + if len(peers) == 0 { + logger.Debug("sendRandomPeers: no peers to send in reply") + return errors.New("No peers available") + } + + m := NewGivePeersMessage(peers, dm.config.MaxOutgoingMessageLength) + + return dm.sendMessage(addr, m) +} + +// announceAllValidTxns broadcasts valid unconfirmed transactions +func (dm *Daemon) announceAllValidTxns() error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + // Get valid unconfirmed transaction hashes + hashes, err := dm.visor.GetAllValidUnconfirmedTxHashes() + if err != nil { + return err + } + + return dm.announceTxnHashes(hashes) +} + +// announceTxnHashes announces transaction hashes, splitting them into chunks if they exceed MaxTxnAnnounceNum +func (dm *Daemon) announceTxnHashes(hashes []cipher.SHA256) error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + // Divide hashes into multiple sets of max size + hashesSet := divideHashes(hashes, dm.config.MaxTxnAnnounceNum) + + for _, hs := range hashesSet { + m := NewAnnounceTxnsMessage(hs, dm.config.MaxOutgoingMessageLength) + if len(m.Transactions) != len(hs) { + logger.Critical().Error("NewAnnounceTxnsMessage truncated hashes that were already split up") + } + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Debug("Broadcast AnnounceTxnsMessage failed") + return err + } + } + + return nil +} + +func divideHashes(hashes []cipher.SHA256, n int) [][]cipher.SHA256 { + if len(hashes) == 0 { + return [][]cipher.SHA256{} + } + + var j int + var hashesArray [][]cipher.SHA256 + + if len(hashes) > n { + for i := range hashes { + if len(hashes[j:i]) == n { + hs := make([]cipher.SHA256, n) + copy(hs, hashes[j:i]) + hashesArray = append(hashesArray, hs) + j = i + } + } + } + + hs := make([]cipher.SHA256, len(hashes)-j) + copy(hs, hashes[j:]) + hashesArray = append(hashesArray, hs) + return hashesArray +} + +// sendMessage sends a Message to a Connection and pushes the result onto the SendResults channel. +func (dm *Daemon) sendMessage(addr string, msg gnet.Message) error { + return dm.pool.Pool.SendMessage(addr, msg) +} + +// broadcastMessage sends a Message to all introduced connections in the Pool. +// Returns the gnet IDs of connections that broadcast succeeded for. +// Note that a connection could still fail to receive the message under certain network conditions, +// there is no guarantee that a message was broadcast. +func (dm *Daemon) broadcastMessage(msg gnet.Message) ([]uint64, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + conns := dm.connections.all() + var addrs []string + for _, c := range conns { + if c.HasIntroduced() { + addrs = append(addrs, c.Addr) + } + } + + return dm.pool.Pool.BroadcastMessage(msg, addrs) +} + +// disconnectNow disconnects from a peer immediately without sending a DisconnectMessage. Any pending messages +// will not be sent to the peer. +func (dm *Daemon) disconnectNow(addr string, r gnet.DisconnectReason) error { + return dm.pool.Pool.Disconnect(addr, r) +} + +// pexConfig returns the pex config +func (dm *Daemon) pexConfig() pex.Config { + return dm.pex.Config +} + +// addPeers adds peers to the pex +func (dm *Daemon) addPeers(addrs []string) int { + return dm.pex.AddPeers(addrs) +} + +// recordPeerHeight records the height of specific peer +func (dm *Daemon) recordPeerHeight(addr string, gnetID, height uint64) { + if err := dm.connections.SetHeight(addr, gnetID, height); err != nil { + logger.Critical().WithError(err).WithField("addr", addr).Error("connections.SetHeight failed") + } +} + +// getSignedBlocksSince returns N signed blocks since given seq +func (dm *Daemon) getSignedBlocksSince(seq, count uint64) ([]coin.SignedBlock, error) { + return dm.visor.GetSignedBlocksSince(seq, count) +} + +// headBkSeq returns the head block sequence +func (dm *Daemon) headBkSeq() (uint64, bool, error) { + return dm.visor.HeadBkSeq() +} + +// executeSignedBlock executes the signed block +func (dm *Daemon) executeSignedBlock(b coin.SignedBlock) error { + return dm.visor.ExecuteSignedBlock(b) +} + +// filterKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (dm *Daemon) filterKnownUnconfirmed(txns []cipher.SHA256) ([]cipher.SHA256, error) { + return dm.visor.FilterKnownUnconfirmed(txns) +} + +// getKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (dm *Daemon) getKnownUnconfirmed(txns []cipher.SHA256) (coin.Transactions, error) { + return dm.visor.GetKnownUnconfirmed(txns) +} + +// injectTransaction records a coin.Transaction to the UnconfirmedTxnPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard constraints, it is rejected, and error will not be nil. +// If the transaction only violates soft constraints, it is still injected, and the soft constraint violation is returned. +func (dm *Daemon) injectTransaction(txn coin.Transaction) (bool, *transaction.ErrTxnViolatesSoftConstraint, error) { + return dm.visor.InjectForeignTransaction(txn) +} + +/* Connection management API */ + +// Connection a connection's state within the daemon +type Connection struct { + Addr string + Pex pex.Peer + Gnet GnetConnectionDetails + ConnectionDetails +} + +// GnetConnectionDetails connection data from gnet +type GnetConnectionDetails struct { + ID uint64 + LastSent time.Time + LastReceived time.Time +} + +func newConnection(dc *connection, gc *gnet.Connection, pp *pex.Peer) Connection { + c := Connection{} + + if dc != nil { + c.Addr = dc.Addr + c.ConnectionDetails = dc.ConnectionDetails + } + + if gc != nil { + c.Gnet = GnetConnectionDetails{ + ID: gc.ID, + LastSent: gc.LastSent, + LastReceived: gc.LastReceived, + } + } + + if pp != nil { + c.Pex = *pp + } + + return c +} + +// newConnection creates a Connection from daemon.connection, gnet.Connection and pex.Peer +func (dm *Daemon) newConnection(c *connection) (*Connection, error) { + if c == nil { + return nil, nil + } + + gc, err := dm.pool.Pool.GetConnection(c.Addr) + if err != nil { + return nil, err + } + + var pp *pex.Peer + listenAddr := c.ListenAddr() + if listenAddr != "" { + p, ok := dm.pex.GetPeer(listenAddr) + if ok { + pp = &p + } + } + + cc := newConnection(c, gc, pp) + return &cc, nil +} + +// GetConnections returns solicited (outgoing) connections +func (dm *Daemon) GetConnections(f func(c Connection) bool) ([]Connection, error) { + if dm.pool.Pool == nil { + return nil, nil + } + + cs := dm.connections.all() + + conns := make([]Connection, 0) + + for _, c := range cs { + cc, err := dm.newConnection(&c) + if err != nil { + return nil, err + } + + ccc := *cc + + if !f(ccc) { + continue + } + + conns = append(conns, ccc) + } + + // Sort connnections by IP address + sort.Slice(conns, func(i, j int) bool { + return strings.Compare(conns[i].Addr, conns[j].Addr) < 0 + }) + + return conns, nil +} + +// GetDefaultConnections returns the default hardcoded connection addresses +func (dm *Daemon) GetDefaultConnections() []string { + conns := make([]string, len(dm.config.DefaultConnections)) + copy(conns[:], dm.config.DefaultConnections[:]) + return conns +} + +// GetConnection returns a *Connection of specific address +func (dm *Daemon) GetConnection(addr string) (*Connection, error) { + c := dm.connections.get(addr) + if c == nil { + return nil, nil + } + + return dm.newConnection(c) +} + +// DisconnectByGnetID disconnects a connection by gnet ID +func (dm *Daemon) DisconnectByGnetID(gnetID uint64) error { + c := dm.connections.getByGnetID(gnetID) + if c == nil { + return ErrConnectionNotExist + } + + return dm.Disconnect(c.Addr, ErrDisconnectRequestedByOperator) +} + +// GetTrustConnections returns all trusted connections +func (dm *Daemon) GetTrustConnections() []string { + return dm.pex.AllTrusted().ToAddrs() +} + +// GetExchgConnection returns all connections to peers found through peer exchange +func (dm *Daemon) GetExchgConnection() []string { + return dm.pex.RandomExchangeable(0).ToAddrs() +} + +/* Peer Blockchain Status API */ + +// BlockchainProgress is the current blockchain syncing status +type BlockchainProgress struct { + // Our current blockchain length + Current uint64 + // Our best guess at true blockchain length + Highest uint64 + // Individual blockchain length reports from peers + Peers []PeerBlockchainHeight +} + +// newBlockchainProgress creates BlockchainProgress from the local head blockchain sequence number +// and a list of remote peers +func newBlockchainProgress(headSeq uint64, conns []connection) *BlockchainProgress { + peers := newPeerBlockchainHeights(conns) + + return &BlockchainProgress{ + Current: headSeq, + Highest: EstimateBlockchainHeight(headSeq, peers), + Peers: peers, + } +} + +// PeerBlockchainHeight records blockchain height for an address +type PeerBlockchainHeight struct { + Address string + Height uint64 +} + +func newPeerBlockchainHeights(conns []connection) []PeerBlockchainHeight { + peers := make([]PeerBlockchainHeight, 0, len(conns)) + for _, c := range conns { + if c.State != ConnectionStatePending { + peers = append(peers, PeerBlockchainHeight{ + Address: c.Addr, + Height: c.Height, + }) + } + } + return peers +} + +// EstimateBlockchainHeight estimates the blockchain sync height. +// The highest height reported amongst all peers, and including the node itself, is returned. +func EstimateBlockchainHeight(headSeq uint64, peers []PeerBlockchainHeight) uint64 { + for _, c := range peers { + if c.Height > headSeq { + headSeq = c.Height + } + } + return headSeq +} + +// GetBlockchainProgress returns a *BlockchainProgress +func (dm *Daemon) GetBlockchainProgress(headSeq uint64) *BlockchainProgress { + conns := dm.connections.all() + return newBlockchainProgress(headSeq, conns) +} + +// InjectBroadcastTransaction injects transaction to the unconfirmed pool and broadcasts it. +// If the transaction violates either hard or soft constraints, it is neither injected nor broadcast. +// If the broadcast fails (due to no connections), the transaction is not injected. +// However, the broadcast may fail in practice, without returning an error, +// so this is not foolproof. +// This method is to be used by user-initiated transaction injections. +// For transactions received over the network, use daemon.injectTransaction and check the result to +// decide on repropagation. +func (dm *Daemon) InjectBroadcastTransaction(txn coin.Transaction) error { + return dm.visor.WithUpdateTx("daemon.InjectBroadcastTransaction", func(tx *dbutil.Tx) error { + _, head, inputs, err := dm.visor.InjectUserTransactionTx(tx, txn) + if err != nil { + logger.WithError(err).Error("InjectUserTransactionTx failed") + return err + } + + if err := dm.BroadcastUserTransaction(txn, head, inputs); err != nil { + logger.WithError(err).Error("BroadcastUserTransaction failed") + return err + } + + return nil + }) +} + +// InjectTransaction injects transaction to the unconfirmed pool but does not broadcast it. +// If the transaction violates either hard or soft constraints, it is not injected. +// This method is to be used by user-initiated transaction injections. +// For transactions received over the network, use daemon.injectTransaction and check the result to +// decide on repropagation. +func (dm *Daemon) InjectTransaction(txn coin.Transaction) error { + _, _, _, err := dm.visor.InjectUserTransaction(txn) + return err +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/disconnect_message_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/disconnect_message_skyencoder.go new file mode 100644 index 0000000000..53d79bf9bb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/disconnect_message_skyencoder.go @@ -0,0 +1,118 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// encodeSizeDisconnectMessage computes the size of an encoded object of type DisconnectMessage +func encodeSizeDisconnectMessage(obj *DisconnectMessage) uint64 { + i0 := uint64(0) + + // obj.ReasonCode + i0 += 2 + + // obj.Reserved + i0 += 4 + uint64(len(obj.Reserved)) + + return i0 +} + +// encodeDisconnectMessage encodes an object of type DisconnectMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeDisconnectMessage(obj *DisconnectMessage) ([]byte, error) { + n := encodeSizeDisconnectMessage(obj) + buf := make([]byte, n) + + if err := encodeDisconnectMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeDisconnectMessageToBuffer encodes an object of type DisconnectMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeDisconnectMessageToBuffer(buf []byte, obj *DisconnectMessage) error { + if uint64(len(buf)) < encodeSizeDisconnectMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.ReasonCode + e.Uint16(obj.ReasonCode) + + // obj.Reserved length check + if uint64(len(obj.Reserved)) > math.MaxUint32 { + return errors.New("obj.Reserved length exceeds math.MaxUint32") + } + + // obj.Reserved length + e.Uint32(uint32(len(obj.Reserved))) + + // obj.Reserved copy + e.CopyBytes(obj.Reserved) + + return nil +} + +// decodeDisconnectMessage decodes an object of type DisconnectMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeDisconnectMessage(buf []byte, obj *DisconnectMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.ReasonCode + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.ReasonCode = i + } + + { + // obj.Reserved + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Reserved = make([]byte, length) + + copy(obj.Reserved[:], d.Buffer[:length]) + d.Buffer = d.Buffer[length:] + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeDisconnectMessageExact decodes an object of type DisconnectMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeDisconnectMessageExact(buf []byte, obj *DisconnectMessage) error { + if n, err := decodeDisconnectMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/errors.go b/vendor/github.com/skycoin/skycoin/src/daemon/errors.go new file mode 100644 index 0000000000..8e228d48f9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/errors.go @@ -0,0 +1,112 @@ +package daemon + +import ( + "errors" + + "github.com/skycoin/skycoin/src/daemon/gnet" +) + +var ( + // ErrDisconnectVersionNotSupported version is below minimum supported version + ErrDisconnectVersionNotSupported gnet.DisconnectReason = errors.New("Version is below minimum supported version") + // ErrDisconnectIntroductionTimeout timeout + ErrDisconnectIntroductionTimeout gnet.DisconnectReason = errors.New("Introduction timeout") + // ErrDisconnectIsBlacklisted is blacklisted + ErrDisconnectIsBlacklisted gnet.DisconnectReason = errors.New("Blacklisted") + // ErrDisconnectSelf self connnect + ErrDisconnectSelf gnet.DisconnectReason = errors.New("Self connect") + // ErrDisconnectConnectedTwice connect twice + ErrDisconnectConnectedTwice gnet.DisconnectReason = errors.New("Already connected") + // ErrDisconnectIdle idle + ErrDisconnectIdle gnet.DisconnectReason = errors.New("Idle") + // ErrDisconnectNoIntroduction no introduction + ErrDisconnectNoIntroduction gnet.DisconnectReason = errors.New("First message was not an Introduction") + // ErrDisconnectIPLimitReached ip limit reached + ErrDisconnectIPLimitReached gnet.DisconnectReason = errors.New("Maximum number of connections for this IP was reached") + // ErrDisconnectUnexpectedError this is returned when a seemingly impossible error is encountered, e.g. net.Conn.Addr() returns an invalid ip:port + ErrDisconnectUnexpectedError gnet.DisconnectReason = errors.New("Unexpected error") + // ErrDisconnectMaxOutgoingConnectionsReached is returned when connection pool size is greater than the maximum allowed + ErrDisconnectMaxOutgoingConnectionsReached gnet.DisconnectReason = errors.New("Maximum outgoing connections was reached") + // ErrDisconnectBlockchainPubkeyNotMatched is returned when the blockchain pubkey in introduction does not match + ErrDisconnectBlockchainPubkeyNotMatched gnet.DisconnectReason = errors.New("Blockchain pubkey does not match") + // ErrDisconnectBlockchainPubkeyNotProvided is returned when the blockchain pubkey in introduction is not provided + ErrDisconnectBlockchainPubkeyNotProvided gnet.DisconnectReason = errors.New("Blockchain pubkey is not provided") + // ErrDisconnectInvalidExtraData is returned when extra field can't be parsed + ErrDisconnectInvalidExtraData gnet.DisconnectReason = errors.New("Invalid extra data in message") + // ErrDisconnectReceivedDisconnect received a DisconnectMessage + ErrDisconnectReceivedDisconnect gnet.DisconnectReason = errors.New("Received DisconnectMessage") + // ErrDisconnectInvalidUserAgent is returned if the peer provides an invalid user agent + ErrDisconnectInvalidUserAgent gnet.DisconnectReason = errors.New("Invalid user agent") + // ErrDisconnectRequestedByOperator the operator of the node requested a disconnect + ErrDisconnectRequestedByOperator gnet.DisconnectReason = errors.New("Disconnect requested by the node operator") + // ErrDisconnectPeerlistFull the peerlist is full + ErrDisconnectPeerlistFull gnet.DisconnectReason = errors.New("Peerlist is full") + // ErrDisconnectInvalidBurnFactor invalid burn factor in introduction message + ErrDisconnectInvalidBurnFactor gnet.DisconnectReason = errors.New("Invalid burn factor in introduction message") + // ErrDisconnectInvalidMaxTransactionSize invalid max transaction size in introduction message + ErrDisconnectInvalidMaxTransactionSize gnet.DisconnectReason = errors.New("Invalid max transaction size in introduction message") + // ErrDisconnectInvalidMaxDropletPrecision invalid max droplet precision in introduction message + ErrDisconnectInvalidMaxDropletPrecision gnet.DisconnectReason = errors.New("Invalid max droplet precision in introduction message") + + // ErrDisconnectUnknownReason used when mapping an unknown reason code to an error. Is not sent over the network. + ErrDisconnectUnknownReason gnet.DisconnectReason = errors.New("Unknown DisconnectReason") + + disconnectReasonCodes = map[gnet.DisconnectReason]uint16{ + ErrDisconnectUnknownReason: 0, + + ErrDisconnectVersionNotSupported: 1, + ErrDisconnectIntroductionTimeout: 2, + ErrDisconnectIsBlacklisted: 3, + ErrDisconnectSelf: 4, + ErrDisconnectConnectedTwice: 5, + ErrDisconnectIdle: 6, + ErrDisconnectNoIntroduction: 7, + ErrDisconnectIPLimitReached: 8, + ErrDisconnectUnexpectedError: 9, + ErrDisconnectMaxOutgoingConnectionsReached: 10, + ErrDisconnectBlockchainPubkeyNotMatched: 11, + ErrDisconnectInvalidExtraData: 12, + ErrDisconnectReceivedDisconnect: 13, + ErrDisconnectInvalidUserAgent: 14, + ErrDisconnectRequestedByOperator: 15, + ErrDisconnectPeerlistFull: 16, + ErrDisconnectInvalidBurnFactor: 17, + ErrDisconnectInvalidMaxTransactionSize: 18, + ErrDisconnectInvalidMaxDropletPrecision: 19, + + // gnet codes are registered here, but they are not sent in a DISC + // message by gnet. Only daemon sends a DISC packet. + // If gnet chooses to disconnect it will not send a DISC packet. + gnet.ErrDisconnectSetReadDeadlineFailed: 1001, + gnet.ErrDisconnectInvalidMessageLength: 1002, + gnet.ErrDisconnectMalformedMessage: 1003, + gnet.ErrDisconnectUnknownMessage: 1004, + gnet.ErrDisconnectShutdown: 1005, + gnet.ErrDisconnectMessageDecodeUnderflow: 1006, + gnet.ErrDisconnectTruncatedMessageID: 1007, + } + + disconnectCodeReasons map[uint16]gnet.DisconnectReason +) + +func init() { + disconnectCodeReasons = make(map[uint16]gnet.DisconnectReason, len(disconnectReasonCodes)) + + for r, c := range disconnectReasonCodes { + disconnectCodeReasons[c] = r + } +} + +// DisconnectReasonToCode maps a gnet.DisconnectReason to a 16-byte code +func DisconnectReasonToCode(r gnet.DisconnectReason) uint16 { + return disconnectReasonCodes[r] +} + +// DisconnectCodeToReason maps a disconnect code to a gnet.DisconnectReason +func DisconnectCodeToReason(c uint16) gnet.DisconnectReason { + r, ok := disconnectCodeReasons[c] + if !ok { + return ErrDisconnectUnknownReason + } + return r +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/get_blocks_message_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/get_blocks_message_skyencoder.go new file mode 100644 index 0000000000..b07c856bb1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/get_blocks_message_skyencoder.go @@ -0,0 +1,93 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import "github.com/skycoin/skycoin/src/cipher/encoder" + +// encodeSizeGetBlocksMessage computes the size of an encoded object of type GetBlocksMessage +func encodeSizeGetBlocksMessage(obj *GetBlocksMessage) uint64 { + i0 := uint64(0) + + // obj.LastBlock + i0 += 8 + + // obj.RequestedBlocks + i0 += 8 + + return i0 +} + +// encodeGetBlocksMessage encodes an object of type GetBlocksMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGetBlocksMessage(obj *GetBlocksMessage) ([]byte, error) { + n := encodeSizeGetBlocksMessage(obj) + buf := make([]byte, n) + + if err := encodeGetBlocksMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGetBlocksMessageToBuffer encodes an object of type GetBlocksMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGetBlocksMessageToBuffer(buf []byte, obj *GetBlocksMessage) error { + if uint64(len(buf)) < encodeSizeGetBlocksMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.LastBlock + e.Uint64(obj.LastBlock) + + // obj.RequestedBlocks + e.Uint64(obj.RequestedBlocks) + + return nil +} + +// decodeGetBlocksMessage decodes an object of type GetBlocksMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGetBlocksMessage(buf []byte, obj *GetBlocksMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.LastBlock + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.LastBlock = i + } + + { + // obj.RequestedBlocks + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.RequestedBlocks = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGetBlocksMessageExact decodes an object of type GetBlocksMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGetBlocksMessageExact(buf []byte, obj *GetBlocksMessage) error { + if n, err := decodeGetBlocksMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/get_txns_message_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/get_txns_message_skyencoder.go new file mode 100644 index 0000000000..1d023a63a5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/get_txns_message_skyencoder.go @@ -0,0 +1,135 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// encodeSizeGetTxnsMessage computes the size of an encoded object of type GetTxnsMessage +func encodeSizeGetTxnsMessage(obj *GetTxnsMessage) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Transactions)) * i1 + } + + return i0 +} + +// encodeGetTxnsMessage encodes an object of type GetTxnsMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGetTxnsMessage(obj *GetTxnsMessage) ([]byte, error) { + n := encodeSizeGetTxnsMessage(obj) + buf := make([]byte, n) + + if err := encodeGetTxnsMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGetTxnsMessageToBuffer encodes an object of type GetTxnsMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGetTxnsMessageToBuffer(buf []byte, obj *GetTxnsMessage) error { + if uint64(len(buf)) < encodeSizeGetTxnsMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 256 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeGetTxnsMessage decodes an object of type GetTxnsMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGetTxnsMessage(buf []byte, obj *GetTxnsMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 256 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]cipher.SHA256, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1] + if len(d.Buffer) < len(obj.Transactions[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1][:], d.Buffer[:len(obj.Transactions[z1])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGetTxnsMessageExact decodes an object of type GetTxnsMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGetTxnsMessageExact(buf []byte, obj *GetTxnsMessage) error { + if n, err := decodeGetTxnsMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/give_blocks_message_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/give_blocks_message_skyencoder.go new file mode 100644 index 0000000000..620542256b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/give_blocks_message_skyencoder.go @@ -0,0 +1,579 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" +) + +// encodeSizeGiveBlocksMessage computes the size of an encoded object of type GiveBlocksMessage +func encodeSizeGiveBlocksMessage(obj *GiveBlocksMessage) uint64 { + i0 := uint64(0) + + // obj.Blocks + i0 += 4 + for _, x1 := range obj.Blocks { + i1 := uint64(0) + + // x1.Block.Head.Version + i1 += 4 + + // x1.Block.Head.Time + i1 += 8 + + // x1.Block.Head.BkSeq + i1 += 8 + + // x1.Block.Head.Fee + i1 += 8 + + // x1.Block.Head.PrevHash + i1 += 32 + + // x1.Block.Head.BodyHash + i1 += 32 + + // x1.Block.Head.UxHash + i1 += 32 + + // x1.Block.Body.Transactions + i1 += 4 + for _, x2 := range x1.Block.Body.Transactions { + i2 := uint64(0) + + // x2.Length + i2 += 4 + + // x2.Type + i2++ + + // x2.InnerHash + i2 += 32 + + // x2.Sigs + i2 += 4 + { + i3 := uint64(0) + + // x3 + i3 += 65 + + i2 += uint64(len(x2.Sigs)) * i3 + } + + // x2.In + i2 += 4 + { + i3 := uint64(0) + + // x3 + i3 += 32 + + i2 += uint64(len(x2.In)) * i3 + } + + // x2.Out + i2 += 4 + { + i3 := uint64(0) + + // x3.Address.Version + i3++ + + // x3.Address.Key + i3 += 20 + + // x3.Coins + i3 += 8 + + // x3.Hours + i3 += 8 + + i2 += uint64(len(x2.Out)) * i3 + } + + i1 += i2 + } + + // x1.Sig + i1 += 65 + + i0 += i1 + } + + return i0 +} + +// encodeGiveBlocksMessage encodes an object of type GiveBlocksMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGiveBlocksMessage(obj *GiveBlocksMessage) ([]byte, error) { + n := encodeSizeGiveBlocksMessage(obj) + buf := make([]byte, n) + + if err := encodeGiveBlocksMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGiveBlocksMessageToBuffer encodes an object of type GiveBlocksMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGiveBlocksMessageToBuffer(buf []byte, obj *GiveBlocksMessage) error { + if uint64(len(buf)) < encodeSizeGiveBlocksMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Blocks maxlen check + if len(obj.Blocks) > 128 { + return encoder.ErrMaxLenExceeded + } + + // obj.Blocks length check + if uint64(len(obj.Blocks)) > math.MaxUint32 { + return errors.New("obj.Blocks length exceeds math.MaxUint32") + } + + // obj.Blocks length + e.Uint32(uint32(len(obj.Blocks))) + + // obj.Blocks + for _, x := range obj.Blocks { + + // x.Block.Head.Version + e.Uint32(x.Block.Head.Version) + + // x.Block.Head.Time + e.Uint64(x.Block.Head.Time) + + // x.Block.Head.BkSeq + e.Uint64(x.Block.Head.BkSeq) + + // x.Block.Head.Fee + e.Uint64(x.Block.Head.Fee) + + // x.Block.Head.PrevHash + e.CopyBytes(x.Block.Head.PrevHash[:]) + + // x.Block.Head.BodyHash + e.CopyBytes(x.Block.Head.BodyHash[:]) + + // x.Block.Head.UxHash + e.CopyBytes(x.Block.Head.UxHash[:]) + + // x.Block.Body.Transactions maxlen check + if len(x.Block.Body.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Block.Body.Transactions length check + if uint64(len(x.Block.Body.Transactions)) > math.MaxUint32 { + return errors.New("x.Block.Body.Transactions length exceeds math.MaxUint32") + } + + // x.Block.Body.Transactions length + e.Uint32(uint32(len(x.Block.Body.Transactions))) + + // x.Block.Body.Transactions + for _, x := range x.Block.Body.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + // x.Sig + e.CopyBytes(x.Sig[:]) + + } + + return nil +} + +// decodeGiveBlocksMessage decodes an object of type GiveBlocksMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGiveBlocksMessage(buf []byte, obj *GiveBlocksMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Blocks + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 128 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks = make([]coin.SignedBlock, length) + + for z1 := range obj.Blocks { + { + // obj.Blocks[z1].Block.Head.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.Version = i + } + + { + // obj.Blocks[z1].Block.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.Time = i + } + + { + // obj.Blocks[z1].Block.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.BkSeq = i + } + + { + // obj.Blocks[z1].Block.Head.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.Fee = i + } + + { + // obj.Blocks[z1].Block.Head.PrevHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Head.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Head.PrevHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Head.PrevHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Head.PrevHash):] + } + + { + // obj.Blocks[z1].Block.Head.BodyHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Head.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Head.BodyHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Head.BodyHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Head.BodyHash):] + } + + { + // obj.Blocks[z1].Block.Head.UxHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Head.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Head.UxHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Head.UxHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Head.UxHash):] + } + + { + // obj.Blocks[z1].Block.Body.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions = make([]coin.Transaction, length) + + for z5 := range obj.Blocks[z1].Block.Body.Transactions { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Length = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Type = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash):] + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions[z5].Sigs = make([]cipher.Sig, length) + + for z7 := range obj.Blocks[z1].Block.Body.Transactions[z5].Sigs { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7] + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7][:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7])]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7]):] + } + + } + } + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions[z5].In = make([]cipher.SHA256, length) + + for z7 := range obj.Blocks[z1].Block.Body.Transactions[z5].In { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].In[z7] + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7][:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7])]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7]):] + } + + } + } + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions[z5].Out = make([]coin.TransactionOutput, length) + + for z7 := range obj.Blocks[z1].Block.Body.Transactions[z5].Out { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Version = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key[:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key):] + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Coins = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Hours = i + } + + } + } + } + } + } + } + + { + // obj.Blocks[z1].Sig + if len(d.Buffer) < len(obj.Blocks[z1].Sig) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Sig[:], d.Buffer[:len(obj.Blocks[z1].Sig)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Sig):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGiveBlocksMessageExact decodes an object of type GiveBlocksMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGiveBlocksMessageExact(buf []byte, obj *GiveBlocksMessage) error { + if n, err := decodeGiveBlocksMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/give_peers_message_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/give_peers_message_skyencoder.go new file mode 100644 index 0000000000..f27a314276 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/give_peers_message_skyencoder.go @@ -0,0 +1,149 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// encodeSizeGivePeersMessage computes the size of an encoded object of type GivePeersMessage +func encodeSizeGivePeersMessage(obj *GivePeersMessage) uint64 { + i0 := uint64(0) + + // obj.Peers + i0 += 4 + { + i1 := uint64(0) + + // x1.IP + i1 += 4 + + // x1.Port + i1 += 2 + + i0 += uint64(len(obj.Peers)) * i1 + } + + return i0 +} + +// encodeGivePeersMessage encodes an object of type GivePeersMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGivePeersMessage(obj *GivePeersMessage) ([]byte, error) { + n := encodeSizeGivePeersMessage(obj) + buf := make([]byte, n) + + if err := encodeGivePeersMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGivePeersMessageToBuffer encodes an object of type GivePeersMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGivePeersMessageToBuffer(buf []byte, obj *GivePeersMessage) error { + if uint64(len(buf)) < encodeSizeGivePeersMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Peers maxlen check + if len(obj.Peers) > 512 { + return encoder.ErrMaxLenExceeded + } + + // obj.Peers length check + if uint64(len(obj.Peers)) > math.MaxUint32 { + return errors.New("obj.Peers length exceeds math.MaxUint32") + } + + // obj.Peers length + e.Uint32(uint32(len(obj.Peers))) + + // obj.Peers + for _, x := range obj.Peers { + + // x.IP + e.Uint32(x.IP) + + // x.Port + e.Uint16(x.Port) + + } + + return nil +} + +// decodeGivePeersMessage decodes an object of type GivePeersMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGivePeersMessage(buf []byte, obj *GivePeersMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Peers + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 512 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Peers = make([]IPAddr, length) + + for z1 := range obj.Peers { + { + // obj.Peers[z1].IP + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Peers[z1].IP = i + } + + { + // obj.Peers[z1].Port + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.Peers[z1].Port = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGivePeersMessageExact decodes an object of type GivePeersMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGivePeersMessageExact(buf []byte, obj *GivePeersMessage) error { + if n, err := decodeGivePeersMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/give_txns_message_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/give_txns_message_skyencoder.go new file mode 100644 index 0000000000..21f6a0128a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/give_txns_message_skyencoder.go @@ -0,0 +1,408 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" +) + +// encodeSizeGiveTxnsMessage computes the size of an encoded object of type GiveTxnsMessage +func encodeSizeGiveTxnsMessage(obj *GiveTxnsMessage) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + for _, x1 := range obj.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + return i0 +} + +// encodeGiveTxnsMessage encodes an object of type GiveTxnsMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGiveTxnsMessage(obj *GiveTxnsMessage) ([]byte, error) { + n := encodeSizeGiveTxnsMessage(obj) + buf := make([]byte, n) + + if err := encodeGiveTxnsMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGiveTxnsMessageToBuffer encodes an object of type GiveTxnsMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGiveTxnsMessageToBuffer(buf []byte, obj *GiveTxnsMessage) error { + if uint64(len(buf)) < encodeSizeGiveTxnsMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 256 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + return nil +} + +// decodeGiveTxnsMessage decodes an object of type GiveTxnsMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGiveTxnsMessage(buf []byte, obj *GiveTxnsMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 256 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]coin.Transaction, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Transactions[z1].Length = i + } + + { + // obj.Transactions[z1].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Type = i + } + + { + // obj.Transactions[z1].InnerHash + if len(d.Buffer) < len(obj.Transactions[z1].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].InnerHash[:], d.Buffer[:len(obj.Transactions[z1].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].InnerHash):] + } + + { + // obj.Transactions[z1].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Sigs = make([]cipher.Sig, length) + + for z3 := range obj.Transactions[z1].Sigs { + { + // obj.Transactions[z1].Sigs[z3] + if len(d.Buffer) < len(obj.Transactions[z1].Sigs[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Sigs[z3][:], d.Buffer[:len(obj.Transactions[z1].Sigs[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Sigs[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].In = make([]cipher.SHA256, length) + + for z3 := range obj.Transactions[z1].In { + { + // obj.Transactions[z1].In[z3] + if len(d.Buffer) < len(obj.Transactions[z1].In[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].In[z3][:], d.Buffer[:len(obj.Transactions[z1].In[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].In[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Out = make([]coin.TransactionOutput, length) + + for z3 := range obj.Transactions[z1].Out { + { + // obj.Transactions[z1].Out[z3].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Address.Version = i + } + + { + // obj.Transactions[z1].Out[z3].Address.Key + if len(d.Buffer) < len(obj.Transactions[z1].Out[z3].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Out[z3].Address.Key[:], d.Buffer[:len(obj.Transactions[z1].Out[z3].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Out[z3].Address.Key):] + } + + { + // obj.Transactions[z1].Out[z3].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Coins = i + } + + { + // obj.Transactions[z1].Out[z3].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Hours = i + } + + } + } + } + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGiveTxnsMessageExact decodes an object of type GiveTxnsMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGiveTxnsMessageExact(buf []byte, obj *GiveTxnsMessage) error { + if n, err := decodeGiveTxnsMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gnet/README.md b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/README.md new file mode 100644 index 0000000000..df43774257 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/README.md @@ -0,0 +1,7 @@ +gnet +==== + +[![GoDoc](http://godoc.org/github.com//skycoin/gnet?status.png)](http://godoc.org/github.com/skycoin/gnet) + +[Godoc generated documentation](https://godoc.org/github.com/skycoin/gnet) + diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gnet/dispatcher.go b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/dispatcher.go new file mode 100644 index 0000000000..c11c0a32dc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/dispatcher.go @@ -0,0 +1,209 @@ +package gnet + +import ( + "errors" + "fmt" + "math" + "net" + "reflect" + "time" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/util/mathutil" +) + +var ( + // ErrMsgExceedsMaxLen is returned if trying to send a message that exceeds the configured max length + ErrMsgExceedsMaxLen = errors.New("Message exceeds max message length") +) + +// SendResult result of a single message send +type SendResult struct { + Addr string + Message Message + Error error +} + +func newSendResult(addr string, m Message, err error) SendResult { + return SendResult{ + Addr: addr, + Message: m, + Error: err, + } +} + +// Serializes a Message over a net.Conn +func sendMessage(conn net.Conn, msg Message, timeout time.Duration, maxMsgLength int) error { + m, err := EncodeMessage(msg) + if err != nil { + return err + } + if len(m) > maxMsgLength { + return ErrMsgExceedsMaxLen + } + return sendByteMessage(conn, m, timeout) +} + +// msgIDStringSafe formats msgID bytes to a string that is safe for logging (e.g. not impacted by ascii control chars) +func msgIDStringSafe(msgID [4]byte) string { + x := fmt.Sprintf("%q", msgID) + return x[1 : len(x)-1] // trim quotes that are added by %q formatting +} + +// Event handler that is called after a Connection sends a complete message +func convertToMessage(id uint64, msg []byte, debugPrint bool) (Message, error) { + msgID := [4]byte{} + if len(msg) < len(msgID) { + logger.WithError(ErrDisconnectTruncatedMessageID).WithField("connID", id).Warning() + return nil, ErrDisconnectTruncatedMessageID + } + + copy(msgID[:], msg[:len(msgID)]) + + if debugPrint { + logger.WithField("msgID", msgIDStringSafe(msgID)).Debug("Received message") + } + + msg = msg[len(msgID):] + t, ok := MessageIDReverseMap[msgID] + if !ok { + logger.WithError(ErrDisconnectUnknownMessage).WithFields(logrus.Fields{ + "msgID": msgIDStringSafe(msgID), + "connID": id, + }).Warning() + return nil, ErrDisconnectUnknownMessage + } + + if debugPrint { + logger.WithFields(logrus.Fields{ + "connID": id, + "messageType": fmt.Sprintf("%v", t), + }).Debugf("convertToMessage") + } + + v := reflect.New(t) + m, ok := (v.Interface()).(Message) + if !ok { + // This occurs only when the user registers an interface that does not + // match the Message interface. They should have known about this + // earlier via a call to VerifyMessages + logger.Panic("Message obtained from map does not match Message interface") + return nil, errors.New("MessageIdMaps contain non-Message") + } + + used, err := deserializeMessage(msg, v) + if err != nil { + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "connID": id, + "messageType": fmt.Sprintf("%v", t), + }).Warning("deserializeMessage failed") + return nil, ErrDisconnectMalformedMessage + } + + if used != uint64(len(msg)) { + logger.WithError(ErrDisconnectMessageDecodeUnderflow).WithFields(logrus.Fields{ + "connID": id, + "messageType": fmt.Sprintf("%v", t), + }).Warning() + return nil, ErrDisconnectMessageDecodeUnderflow + } + + return m, nil +} + +// Wraps Serializer.Decode and traps panics as an error +func deserializeMessage(msg []byte, v reflect.Value) (n uint64, err error) { + defer func() { + if r := recover(); r != nil { + logger.Critical().Warningf("Recovering from deserializer panic: %v", r) + switch x := r.(type) { + case string: + err = errors.New(x) + case error: + err = x + default: + err = errors.New("Message deserialization failed") + } + } + }() + + iface := v.Interface() + x, ok := iface.(Serializer) + if !ok { + return 0, errors.New("deserializeMessage object does not have Serializer interface") + } + + return x.Decode(msg) +} + +// EncodeMessage packs a Message into []byte containing length, id and data +func EncodeMessage(msg Serializer) ([]byte, error) { + t := reflect.ValueOf(msg).Elem().Type() + + // Lookup message ID + msgID, succ := MessageIDMap[t] + if !succ { + logger.Panicf("Attempted to serialize message struct not in MessageIDMap: %v", msg) + } + if uint64(len(msgID)) > math.MaxUint32 { + return nil, errors.New("Message ID length exceeds math.MaxUint32") + } + + // Compute size of encoded Message object + bMsgLen := msg.EncodeSize() + if bMsgLen > math.MaxUint32 { + return nil, errors.New("Message length exceeds math.MaxUint32") + } + + // Compute message + message ID length + bLen, err := mathutil.AddUint32(uint32(bMsgLen), uint32(len(msgID))) + if err != nil { + return nil, err + } + + // Serialize total message length + bLenPrefix := encoder.SerializeUint32(bLen) + if uint64(len(bLenPrefix)) > math.MaxUint32 { + return nil, errors.New("Message length prefix length exceeds math.MaxUint32") + } + + mLen, err := mathutil.AddUint32(bLen, uint32(len(bLenPrefix))) + if err != nil { + return nil, err + } + + // Allocate message bytes + m := make([]byte, mLen) + + // Write the total message length to the buffer + copy(m[:], bLenPrefix[:]) + + // Write the message ID to the buffer + copy(m[len(bLenPrefix):], msgID[:]) + + // Encode the message into the message buffer + if err := msg.Encode(m[len(bLenPrefix)+len(msgID):]); err != nil { + return nil, err + } + + return m, nil +} + +// Sends []byte over a net.Conn +var sendByteMessage = func(conn net.Conn, msg []byte, timeout time.Duration) error { + deadline := time.Time{} + if timeout != 0 { + deadline = time.Now().Add(timeout) + } + if err := conn.SetWriteDeadline(deadline); err != nil { + return err + } + if _, err := conn.Write(msg); err != nil { + return &WriteError{ + Err: err, + } + } + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gnet/message.go b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/message.go new file mode 100644 index 0000000000..a67aa39da2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/message.go @@ -0,0 +1,140 @@ +package gnet + +import ( + "reflect" +) + +const messagePrefixLength = 4 + +// MessagePrefix message prefix identifies a message +type MessagePrefix [messagePrefixLength]byte + +// MessagePrefixFromString creates MessagePrefix from string +func MessagePrefixFromString(prefix string) MessagePrefix { + if len(prefix) == 0 || len(prefix) > 4 { + logger.Panicf("Invalid prefix %s", prefix) + } + p := MessagePrefix{} + for i, c := range prefix { + p[i] = byte(c) + } + for i := len(prefix); i < 4; i++ { + p[i] = 0x00 + } + return p +} + +// Serializer serialization interface +type Serializer interface { + EncodeSize() uint64 + Encode([]byte) error + Decode([]byte) (uint64, error) +} + +// Handler message handler interface +type Handler interface { + // State is user-defined application state that is attached to the Dispatcher. + // If a non-nil error is returned, the connection will be disconnected. + Handle(context *MessageContext, state interface{}) error +} + +// Message message interface +type Message interface { + Handler + Serializer +} + +// MessageContext message context +type MessageContext struct { + ConnID uint64 // connection message was received from + Addr string +} + +// NewMessageContext creates MessageContext +func NewMessageContext(conn *Connection) *MessageContext { + if conn.Conn != nil { + return &MessageContext{ConnID: conn.ID, Addr: conn.Addr()} + } + return &MessageContext{ConnID: conn.ID} +} + +// MessageIDMap maps message types to their ids +var MessageIDMap = make(map[reflect.Type]MessagePrefix) + +// MessageIDReverseMap maps message ids to their types +var MessageIDReverseMap = make(map[MessagePrefix]reflect.Type) + +var registeredMsgsCount = 0 + +// RegisterMessage registers a message struct for recognition by the message handlers. +func RegisterMessage(prefix MessagePrefix, msg interface{}) { + t := reflect.TypeOf(msg) + id := MessagePrefix{} + copy(id[:], prefix[:]) + _, exists := MessageIDReverseMap[id] + if exists { + logger.Panicf("Attempted to register message prefix %s twice", string(id[:])) + } + _, exists = MessageIDMap[t] + if exists { + logger.Panicf("Attempts to register message type %v twice", t) + } + MessageIDMap[t] = id + MessageIDReverseMap[id] = t + + registeredMsgsCount++ +} + +// VerifyMessages calls logger.Panic if message registration violates sanity checks +func VerifyMessages() { + if registeredMsgsCount != len(MessageIDMap) { + logger.Panic("MessageIDMap was altered without using RegisterMessage") + } + if registeredMsgsCount != len(MessageIDReverseMap) { + logger.Panic("MessageIDReverseMap was altered without using RegisterMessage") + } + + for t, k := range MessageIDMap { + // No empty prefixes allowed + if k[0] == 0x00 { + logger.Panic("No empty message prefixes allowed") + } + // No non-null bytes allowed after a nul byte + hasEmpty := false + for _, b := range k { + if b == 0x00 { + hasEmpty = true + } else if hasEmpty { + logger.Panic("No non-null bytes allowed after a nul byte") + } + } + // All characters must be non-whitespace printable ascii chars/digits + // No punctation + for _, b := range k { + if !((b >= '0' && b <= '9') || (b >= 'A' && b <= 'Z') || + (b >= 'a' && b <= 'z') || b == 0x00) { + logger.Panicf("Invalid prefix byte %v", b) + } + } + + // Confirm that all registered messages support the Message interface + // This should only be untrue if the user modified the message map + // directly + mptr := reflect.PtrTo(t) + if !mptr.Implements(reflect.TypeOf((*Message)(nil)).Elem()) { + logger.Panicf("Invalid message at ID %s: Message must implement the gnet.Message interface", string(k[:])) + } + } + if len(MessageIDMap) != len(MessageIDReverseMap) { + logger.Panic("MessageIdMap mismatch") + } + // No empty prefixes + // All prefixes must be 0 padded +} + +// EraseMessages wipes all recorded message types +func EraseMessages() { + MessageIDMap = make(map[reflect.Type]MessagePrefix) + MessageIDReverseMap = make(map[MessagePrefix]reflect.Type) + registeredMsgsCount = 0 +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gnet/pool.go b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/pool.go new file mode 100644 index 0000000000..99ca2008ed --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/pool.go @@ -0,0 +1,1076 @@ +/* +Package gnet is the core networking library +*/ +package gnet + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "net" + "reflect" + "sync" + "time" + + "io" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/daemon/strand" + "github.com/skycoin/skycoin/src/util/elapse" + "github.com/skycoin/skycoin/src/util/logging" +) + +// DisconnectReason is passed to ConnectionPool's DisconnectCallback +type DisconnectReason error + +const ( + receiveMessageDurationThreshold = 500 * time.Millisecond + readLoopDurationThreshold = 10 * time.Second + sendInMsgChanDurationThreshold = 5 * time.Second + sendLoopDurationThreshold = 500 * time.Millisecond +) + +var ( + // ErrDisconnectSetReadDeadlineFailed set read deadline failed + ErrDisconnectSetReadDeadlineFailed DisconnectReason = errors.New("SetReadDeadline failed") + // ErrDisconnectInvalidMessageLength invalid message length + ErrDisconnectInvalidMessageLength DisconnectReason = errors.New("Invalid message length") + // ErrDisconnectMalformedMessage malformed message + ErrDisconnectMalformedMessage DisconnectReason = errors.New("Malformed message body") + // ErrDisconnectUnknownMessage unknown message + ErrDisconnectUnknownMessage DisconnectReason = errors.New("Unknown message ID") + // ErrDisconnectShutdown shutting down the client + ErrDisconnectShutdown DisconnectReason = errors.New("Shutdown") + // ErrDisconnectMessageDecodeUnderflow message data did not fully decode to a message object + ErrDisconnectMessageDecodeUnderflow DisconnectReason = errors.New("Message data did not fully decode to a message object") + // ErrDisconnectTruncatedMessageID message data was too short to contain a message ID + ErrDisconnectTruncatedMessageID DisconnectReason = errors.New("Message data was too short to contain a message ID") + + // ErrConnectionPoolClosed error message indicates the connection pool is closed + ErrConnectionPoolClosed = errors.New("Connection pool is closed") + // ErrWriteQueueFull write queue is full + ErrWriteQueueFull = errors.New("Write queue full") + // ErrNoReachableConnections when broadcasting a message, no connections were available to send a message to + ErrNoReachableConnections = errors.New("All pool connections are unreachable at this time") + // ErrNoMatchingConnections when broadcasting a message, no connections were found for the provided addresses + ErrNoMatchingConnections = errors.New("No connections found for broadcast addresses") + // ErrPoolEmpty when broadcasting a message, the connection pool was empty + ErrPoolEmpty = errors.New("Connection pool is empty after filtering connections") + // ErrConnectionExists connection exists + ErrConnectionExists = errors.New("Connection exists") + // ErrMaxIncomingConnectionsReached max incoming connections reached + ErrMaxIncomingConnectionsReached = errors.New("Max incoming connections reached") + // ErrMaxOutgoingConnectionsReached max outgoing connections reached + ErrMaxOutgoingConnectionsReached = errors.New("Max outgoing connections reached") + // ErrMaxOutgoingDefaultConnectionsReached max outgoing default connections reached + ErrMaxOutgoingDefaultConnectionsReached = errors.New("Max outgoing default connections reached") + // ErrNoAddresses no addresses were provided to BroadcastMessage + ErrNoAddresses = errors.New("No addresses provided") + + // Logger + logger = logging.MustGetLogger("gnet") +) + +// ReadError connection read error +type ReadError struct { + Err error +} + +func (e ReadError) Error() string { + return fmt.Sprintf("read failed: %v", e.Err) +} + +// WriteError connection read error +type WriteError struct { + Err error +} + +func (e WriteError) Error() string { + return fmt.Sprintf("write failed: %v", e.Err) +} + +// Config gnet config +type Config struct { + // Address to listen on. Leave empty for arbitrary assignment + Address string + // Port to listen on. Set to 0 for arbitrary assignment + Port uint16 + // Maximum total connections. Must be >= MaxOutgoingConnections + MaxIncomingConnections. + MaxConnections int + // Maximum outgoing connections + MaxOutgoingConnections int + // Maximum incoming connections + MaxIncomingConnections int + // Maximum allowed default outgoing connection number + MaxDefaultPeerOutgoingConnections int + // Messages greater than length are rejected and the sender disconnected + MaxIncomingMessageLength int + // Messages greater than length are not sent and an error is reported in a SendResult + MaxOutgoingMessageLength int + // Timeout is the timeout for dialing new connections. Use a + // timeout of 0 to ignore timeout. + DialTimeout time.Duration + // Timeout for reading from a connection. Set to 0 to default to the + // system's timeout + ReadTimeout time.Duration + // Timeout for writing to a connection. Set to 0 to default to the + // system's timeout + WriteTimeout time.Duration + // Message sent event buffers + SendResultsSize int + // Individual connections' send queue size. This should be increased + // if send volume per connection is high, so as not to block + ConnectionWriteQueueSize int + // Triggered on client disconnect + DisconnectCallback DisconnectCallback + // Triggered on client connect + ConnectCallback ConnectCallback + // Triggered on client connect failure + ConnectFailureCallback ConnectFailureCallback + // Print debug logs + DebugPrint bool + // Default "trusted" peers + DefaultConnections []string + // Default connections map + defaultConnections map[string]struct{} +} + +// NewConfig returns a Config with defaults set +func NewConfig() Config { + return Config{ + Address: "", + Port: 0, + MaxConnections: 128, + MaxOutgoingConnections: 8, + MaxIncomingConnections: 120, + MaxDefaultPeerOutgoingConnections: 2, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + DialTimeout: time.Second * 30, + ReadTimeout: time.Second * 30, + WriteTimeout: time.Second * 30, + SendResultsSize: 2048, + ConnectionWriteQueueSize: 128, + DisconnectCallback: nil, + ConnectCallback: nil, + DebugPrint: false, + defaultConnections: make(map[string]struct{}), + } +} + +const ( + // Byte size of the length prefix in message, sizeof(int32) + messageLengthPrefixSize = 4 +) + +// Connection is stored by the ConnectionPool +type Connection struct { + // Key in ConnectionPool.Pool + ID uint64 + // TCP connection + Conn net.Conn + // Message buffer + Buffer *bytes.Buffer + // Reference back to ConnectionPool container + ConnectionPool *ConnectionPool + // Last time a message was fully parsed and handled + LastReceived time.Time + // Last time a message was sent to the connection + LastSent time.Time + // Message send queue. + WriteQueue chan Message + Solicited bool +} + +// NewConnection creates a new Connection tied to a ConnectionPool +func NewConnection(pool *ConnectionPool, id uint64, conn net.Conn, writeQueueSize int, solicited bool) *Connection { + return &Connection{ + ID: id, + Conn: conn, + Buffer: &bytes.Buffer{}, + ConnectionPool: pool, + LastReceived: Now(), + LastSent: Now(), + WriteQueue: make(chan Message, writeQueueSize), + Solicited: solicited, + } +} + +// Addr returns remote address +func (conn *Connection) Addr() string { + return conn.Conn.RemoteAddr().String() +} + +// String returns connection address +func (conn *Connection) String() string { + return conn.Addr() +} + +// Close close the connection and write queue +func (conn *Connection) Close() error { + err := conn.Conn.Close() + close(conn.WriteQueue) + conn.Buffer = &bytes.Buffer{} + return err +} + +// DisconnectCallback triggered on client disconnect +type DisconnectCallback func(addr string, id uint64, reason DisconnectReason) + +// ConnectCallback triggered on client connect +type ConnectCallback func(addr string, id uint64, solicited bool) + +// ConnectFailureCallback trigger on client connect failure +type ConnectFailureCallback func(addr string, solicited bool, err error) + +// ConnectionPool connection pool +type ConnectionPool struct { + // Configuration parameters + Config Config + // Channel for async message sending + SendResults chan SendResult + // All connections, indexed by ConnId + pool map[uint64]*Connection + // All connections, indexed by address + addresses map[string]*Connection + // connected default peer connections + defaultOutgoingConnections map[string]struct{} + // connected outgoing connections + outgoingConnections map[string]struct{} + // connected incoming connections + incomingConnections map[string]struct{} + // User-defined state to be passed into message handlers + messageState interface{} + // Connection ID counter + connID uint64 + // Listening connection + listener net.Listener + listenerLock sync.Mutex + // operations channel + reqC chan strand.Request + // quit channel + quit chan struct{} + done chan struct{} + strandDone chan struct{} + wg sync.WaitGroup +} + +// NewConnectionPool creates a new ConnectionPool that will listen on +// Config.Port upon StartListen. State is an application defined object that +// will be passed to a Message's Handle(). +func NewConnectionPool(c Config, state interface{}) (*ConnectionPool, error) { + for _, p := range c.DefaultConnections { + c.defaultConnections[p] = struct{}{} + } + if c.MaxConnections < c.MaxOutgoingConnections+c.MaxIncomingConnections { + return nil, errors.New("MaxConnections must be >= MaxOutgoingConnections + MaxIncomingConnections") + } + + return &ConnectionPool{ + Config: c, + pool: make(map[uint64]*Connection), + addresses: make(map[string]*Connection), + defaultOutgoingConnections: make(map[string]struct{}), + outgoingConnections: make(map[string]struct{}), + incomingConnections: make(map[string]struct{}), + SendResults: make(chan SendResult, c.SendResultsSize), + messageState: state, + quit: make(chan struct{}), + done: make(chan struct{}), + strandDone: make(chan struct{}), + reqC: make(chan strand.Request), + }, nil +} + +// Run starts the connection pool +func (pool *ConnectionPool) Run() error { + defer close(pool.done) + defer logger.Info("Connection pool closed") + + // The strand processing goroutine must be started before any error can be + // returned from Run(), otherwise the Shutdown() call will block if an error occurred + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + pool.processStrand() + }() + + // start the connection accept loop + addr := fmt.Sprintf("%s:%v", pool.Config.Address, pool.Config.Port) + logger.Infof("Listening for connections on %s...", addr) + + ln, err := net.Listen("tcp", addr) + if err != nil { + return err + } + + pool.listenerLock.Lock() + pool.listener = ln + pool.listenerLock.Unlock() + +loop: + for { + conn, err := ln.Accept() + if err != nil { + // When Accept() returns with a non-nil error, we check the quit + // channel to see if we should continue or quit + select { + case <-pool.quit: + break loop + default: + // without the default case the select will block. + logger.Error(err.Error()) + continue + } + } + + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + if err := pool.handleConnection(conn, false); err != nil { + logger.WithFields(logrus.Fields{ + "addr": conn.RemoteAddr(), + "outgoing": false, + }).WithError(err).Error("pool.handleConnection") + } + }() + } + pool.wg.Wait() + return nil +} + +// RunOffline runs the pool in offline mode. No connections will be accepted, +// but strand requests are processed. +func (pool *ConnectionPool) RunOffline() error { + defer close(pool.done) + pool.processStrand() + return nil +} + +func (pool *ConnectionPool) processStrand() { + defer close(pool.strandDone) + for { + select { + case <-pool.quit: + return + case req := <-pool.reqC: + if err := req.Func(); err != nil { + logger.WithField("operation", req.Name).WithError(err).Error("strand req.Func failed") + } + } + } +} + +// Shutdown gracefully shutdown the connection pool +func (pool *ConnectionPool) Shutdown() { + logger.Info("ConnectionPool.Shutdown called") + close(pool.quit) + logger.Info("ConnectionPool.Shutdown closed pool.quit") + + // Wait for all strand() calls to finish + logger.Info("ConnectionPool.Shutdown waiting for strandDone") + <-pool.strandDone + + logger.Info("ConnectionPool.Shutdown closing the listener") + + // Close to listener to prevent new connections + pool.listenerLock.Lock() + if pool.listener != nil { + if err := pool.listener.Close(); err != nil { + logger.WithError(err).Warning("pool.listener.Close error") + } + } + pool.listener = nil + pool.listenerLock.Unlock() + + logger.Info("ConnectionPool.Shutdown disconnecting all connections") + + // In readData, reader.Read() sometimes blocks instead of returning an error when the + // listener is closed. + // Directly close all connections before closing the listener. + // TODO -- could conn.Close() block too? + pool.disconnectAll() + + if len(pool.pool) != 0 { + logger.Critical().Warning("pool.pool is not empty after calling pool.disconnectAll()") + } + if len(pool.addresses) != 0 { + logger.Critical().Warning("pool.addresses is not empty after calling pool.disconnectAll()") + } + + logger.Info("ConnectionPool.Shutdown waiting for done") + + <-pool.done +} + +// strand ensures all read and write action of pool's member variable are in one thread +func (pool *ConnectionPool) strand(name string, f func() error) error { + name = fmt.Sprintf("daemon.gnet.ConnectionPool.%s", name) + return strand.Strand(logger, pool.reqC, name, f, pool.quit, ErrConnectionPoolClosed) +} + +// ListeningAddress returns the address on which the ConnectionPool listens on +func (pool *ConnectionPool) ListeningAddress() (net.Addr, error) { + if pool.listener == nil { + return nil, errors.New("Not listening, call StartListen first") + } + return pool.listener.Addr(), nil +} + +func (pool *ConnectionPool) canConnect(a string, solicited bool) error { + if pool.isConnExist(a) { + return ErrConnectionExists + } + + if solicited { + if _, ok := pool.Config.defaultConnections[a]; ok && pool.IsMaxOutgoingDefaultConnectionsReached() { + return ErrMaxOutgoingDefaultConnectionsReached + } else if pool.isMaxOutgoingConnectionsReached() { + return ErrMaxOutgoingConnectionsReached + } + } else if pool.isMaxIncomingConnectionsReached() { + return ErrMaxIncomingConnectionsReached + } + + return nil +} + +// newConnection creates a new Connection around a net.Conn. Trying to make a connection +// to an address that is already connected will failed. +func (pool *ConnectionPool) newConnection(conn net.Conn, solicited bool) (*Connection, error) { + a := conn.RemoteAddr().String() + + if err := pool.canConnect(a, solicited); err != nil { + return nil, err + } + + if solicited { + pool.outgoingConnections[a] = struct{}{} + + if _, ok := pool.Config.defaultConnections[a]; ok { + pool.defaultOutgoingConnections[a] = struct{}{} + l := len(pool.defaultOutgoingConnections) + logger.WithField("addr", a).Debugf("%d/%d outgoing default connections in use", l, pool.Config.MaxDefaultPeerOutgoingConnections) + } + } else { + pool.incomingConnections[a] = struct{}{} + } + + // ID must start at 1; in case connID overflows back to 0, force it to 1 + pool.connID++ + if pool.connID == 0 { + pool.connID = 1 + } + + nc := NewConnection(pool, pool.connID, conn, pool.Config.ConnectionWriteQueueSize, solicited) + + pool.pool[nc.ID] = nc + pool.addresses[a] = nc + + return nc, nil +} + +// Creates a Connection and begins its read and write loop +func (pool *ConnectionPool) handleConnection(conn net.Conn, solicited bool) error { + defer logger.WithField("addr", conn.RemoteAddr()).Debug("Connection closed") + addr := conn.RemoteAddr().String() + + c, err := func() (c *Connection, err error) { + // TODO -- when limits in newConnection() are reached, should we allow the peer + // to be added anyway, so that we can disconnect it normally and send a disconnect packet? + // It would have to allowed to complete the handshake, otherwise the DISC packet will be ignored + // Or we would have to permit a DISC packet before an INTR + // But the read/write loop would still need to be started + // A ConnectEvent would need to be triggered, or else the DisconnectEvent gnet ID will not match the + // pending connection's zero gnet ID. + defer func() { + if err != nil { + if closeErr := conn.Close(); closeErr != nil { + logger.WithError(closeErr).WithField("addr", addr).Error("handleConnection conn.Close") + } + } + }() + + err = pool.strand("handleConnection", func() error { + var err error + c, err = pool.newConnection(conn, solicited) + if err != nil { + return err + } + + if pool.Config.ConnectCallback != nil { + pool.Config.ConnectCallback(c.Addr(), c.ID, solicited) + } + + return nil + }) + + return + }() + + // TODO -- this error is not fully propagated back to a caller of Connect() so the daemon state + // can get stuck in pending + if err != nil { + logger.WithError(err).WithField("addr", conn.RemoteAddr()).Debug("handleConnection: newConnection failed") + if pool.Config.ConnectFailureCallback != nil { + pool.Config.ConnectFailureCallback(addr, solicited, err) + } + return err + } + + msgC := make(chan []byte, 32) + + type methodErr struct { + method string + err error + } + errC := make(chan methodErr, 3) + + var wg sync.WaitGroup + wg.Add(1) + qc := make(chan struct{}) + go func() { + defer wg.Done() + if err := pool.readLoop(c, msgC, qc); err != nil { + errC <- methodErr{ + method: "readLoop", + err: err, + } + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + if err := pool.sendLoop(c, pool.Config.WriteTimeout, pool.Config.MaxOutgoingMessageLength, qc); err != nil { + errC <- methodErr{ + method: "sendLoop", + err: err, + } + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + elapser := elapse.NewElapser(receiveMessageDurationThreshold, logger) + defer elapser.CheckForDone() + + for msg := range msgC { + elapser.Register(fmt.Sprintf("pool.receiveMessage address=%s", addr)) + if err := pool.receiveMessage(c, msg); err != nil { + errC <- methodErr{ + method: "receiveMessage", + err: err, + } + return + } + elapser.CheckForDone() + } + }() + + select { + case <-pool.quit: + if err := conn.Close(); err != nil { + logger.WithError(err).WithField("addr", addr).Error("conn.Close") + } + case mErr := <-errC: + err = mErr.err + logger.WithError(mErr.err).WithFields(logrus.Fields{ + "addr": addr, + "method": mErr.method, + }).Error("handleConnection failure") + + // This Disconnect does not send a DISC packet because it is inside gnet. + // A DISC packet is not useful at this point, because the error is most likely + // that the connection is unreachable. + // However, it may also be that the connection sent data that could not be deserialized + // to a message. + if err := pool.Disconnect(c.Addr(), mErr.err); err != nil { + logger.WithError(err).WithField("addr", addr).Error("Disconnect") + } + } + close(qc) + + wg.Wait() + + return err +} + +func (pool *ConnectionPool) readLoop(conn *Connection, msgChan chan []byte, qc chan struct{}) error { + defer close(msgChan) + // read data from connection + reader := bufio.NewReader(conn.Conn) + buf := make([]byte, 1024) + + elapser := elapse.NewElapser(readLoopDurationThreshold, logger) + sendInMsgChanElapser := elapse.NewElapser(sendInMsgChanDurationThreshold, logger) + + defer elapser.CheckForDone() + defer sendInMsgChanElapser.CheckForDone() + + for { + elapser.Register(fmt.Sprintf("readLoop addr=%s", conn.Addr())) + deadline := time.Time{} + if pool.Config.ReadTimeout != 0 { + deadline = time.Now().Add(pool.Config.ReadTimeout) + } + if err := conn.Conn.SetReadDeadline(deadline); err != nil { + return ErrDisconnectSetReadDeadlineFailed + } + data, err := readData(reader, buf) + if err != nil { + return err + } + + if data == nil { + continue + } + + // write data to buffer + if _, err := conn.Buffer.Write(data); err != nil { + return err + } + // decode data + datas, err := decodeData(conn.Buffer, pool.Config.MaxIncomingMessageLength) + if err != nil { + return err + } + for _, d := range datas { + // use select to avoid the goroutine leak, + // because if msgChan has no receiver this goroutine will leak + select { + case <-qc: + return nil + case <-pool.quit: + return nil + case msgChan <- d: + default: + return errors.New("readLoop msgChan is closed or full") + } + } + sendInMsgChanElapser.CheckForDone() + } +} + +func (pool *ConnectionPool) sendLoop(conn *Connection, timeout time.Duration, maxMsgLength int, qc chan struct{}) error { + elapser := elapse.NewElapser(sendLoopDurationThreshold, logger) + defer elapser.CheckForDone() + + for { + elapser.CheckForDone() + select { + case <-pool.quit: + return nil + case <-qc: + return nil + case m := <-conn.WriteQueue: + elapser.Register(fmt.Sprintf("conn.WriteQueue address=%s", conn.Addr())) + if m == nil { + continue + } + + err := sendMessage(conn.Conn, m, timeout, maxMsgLength) + + // Update last sent before writing to SendResult, + // this allows a write to SendResult to be used as a sync marker, + // since no further action in this block will happen after the write. + if err == nil { + if err := pool.updateLastSent(conn.Addr(), Now()); err != nil { + logger.WithField("addr", conn.Addr()).WithError(err).Warning("updateLastSent failed") + } + } + + sr := newSendResult(conn.Addr(), m, err) + select { + case <-qc: + return nil + case pool.SendResults <- sr: + default: + logger.WithField("addr", conn.Addr()).Warning("SendResults queue full") + } + + if err != nil { + return err + } + } + } +} + +func readData(reader io.Reader, buf []byte) ([]byte, error) { + c, err := reader.Read(buf) + if err != nil { + return nil, &ReadError{ + Err: err, + } + } + if c == 0 { + return nil, nil + } + data := make([]byte, c) + copy(data, buf) + return data, nil +} + +// decode data from buffer. +func decodeData(buf *bytes.Buffer, maxMsgLength int) ([][]byte, error) { + dataArray := [][]byte{} + for buf.Len() > messageLengthPrefixSize { + prefix := buf.Bytes()[:messageLengthPrefixSize] + // decode message length + tmpLength, _, err := encoder.DeserializeUint32(prefix) + if err != nil { + // encoder.DeserializeAtomic should only return an error if there wasn't + // enough data in buf to read the integer, but the prefix buf length + // is already ensured to be long enough + logger.Panicf("encoder.DeserializeUint32 failed unexpectedly: %v", err) + } + + length := int(tmpLength) + + // Disconnect if we received an invalid length + if length < messagePrefixLength { + logger.WithFields(logrus.Fields{ + "length": length, + "messagePrefixLength": messagePrefixLength, + }).Warningf("decodeData: length < messagePrefixLength") + return [][]byte{}, ErrDisconnectInvalidMessageLength + } + + if length > maxMsgLength { + logger.WithFields(logrus.Fields{ + "length": length, + "maxMsgLength": maxMsgLength, + }).Warning("decodeData: length > maxMsgLength") + return [][]byte{}, ErrDisconnectInvalidMessageLength + } + + if buf.Len()-messageLengthPrefixSize < length { + return [][]byte{}, nil + } + + buf.Next(messageLengthPrefixSize) // strip the length prefix + data := make([]byte, length) + _, err = buf.Read(data) + if err != nil { + return [][]byte{}, err + } + + dataArray = append(dataArray, data) + } + return dataArray, nil +} + +// isConnExist check if the connection of address does exist +func (pool *ConnectionPool) isConnExist(addr string) bool { + _, ok := pool.addresses[addr] + return ok +} + +func (pool *ConnectionPool) isMaxIncomingConnectionsReached() bool { + return len(pool.incomingConnections) >= pool.Config.MaxIncomingConnections +} + +func (pool *ConnectionPool) isMaxOutgoingConnectionsReached() bool { + return len(pool.outgoingConnections) >= pool.Config.MaxOutgoingConnections +} + +// IsMaxOutgoingDefaultConnectionsReached checks whether the max outgoing default connections reached +func (pool *ConnectionPool) IsMaxOutgoingDefaultConnectionsReached() bool { + return len(pool.defaultOutgoingConnections) >= pool.Config.MaxDefaultPeerOutgoingConnections +} + +func (pool *ConnectionPool) updateLastSent(addr string, t time.Time) error { + return pool.strand("updateLastSent", func() error { + if conn, ok := pool.addresses[addr]; ok { + conn.LastSent = t + } + return nil + }) +} + +func (pool *ConnectionPool) updateLastRecv(addr string, t time.Time) error { + return pool.strand("updateLastRecv", func() error { + if conn, ok := pool.addresses[addr]; ok { + conn.LastReceived = t + } + return nil + }) +} + +// GetConnection returns a connection copy if exist +func (pool *ConnectionPool) GetConnection(addr string) (*Connection, error) { + var conn *Connection + if err := pool.strand("GetConnection", func() error { + if c, ok := pool.addresses[addr]; ok { + // copy connection + cc := *c + conn = &cc + } + return nil + }); err != nil { + return nil, err + } + + return conn, nil +} + +// Connect to an address +func (pool *ConnectionPool) Connect(address string) error { + if err := pool.strand("canConnect", func() error { + return pool.canConnect(address, true) + }); err != nil { + return err + } + + logger.WithField("addr", address).Debugf("Making TCP connection") + conn, err := net.DialTimeout("tcp", address, pool.Config.DialTimeout) + if err != nil { + return err + } + + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + if err := pool.handleConnection(conn, true); err != nil { + logger.WithFields(logrus.Fields{ + "addr": conn.RemoteAddr(), + "outgoing": true, + }).WithError(err).Error("pool.handleConnection") + } + }() + return nil +} + +// Disconnect removes a connection from the pool by address and invokes DisconnectCallback +func (pool *ConnectionPool) Disconnect(addr string, r DisconnectReason) error { + return pool.strand("Disconnect", func() error { + logger.WithFields(logrus.Fields{ + "addr": addr, + "reason": r, + }).Debug("Disconnecting") + + // checks if the address is default node address + isDefaultOutgoingConn := false + if _, ok := pool.Config.defaultConnections[addr]; ok { + if _, ok := pool.outgoingConnections[addr]; ok { + isDefaultOutgoingConn = true + } + } + + conn := pool.disconnect(addr, r) + + if conn == nil { + return errors.New("Disconnect: connection does not exist") + } + + if isDefaultOutgoingConn { + l := len(pool.defaultOutgoingConnections) + logger.Debugf("%d/%d default connections in use", l, pool.Config.MaxDefaultPeerOutgoingConnections) + } + + if pool.Config.DisconnectCallback != nil { + pool.Config.DisconnectCallback(addr, conn.ID, r) + } + + return nil + }) +} + +func (pool *ConnectionPool) disconnect(addr string, r DisconnectReason) *Connection { + conn, ok := pool.addresses[addr] + if !ok { + return nil + } + + fields := logrus.Fields{ + "addr": addr, + "id": conn.ID, + } + + delete(pool.pool, conn.ID) + delete(pool.addresses, addr) + delete(pool.defaultOutgoingConnections, addr) + delete(pool.outgoingConnections, addr) + delete(pool.incomingConnections, addr) + if err := conn.Close(); err != nil { + logger.WithError(err).WithFields(fields).Error("conn.Close") + } + + logger.WithFields(fields).WithField("reason", r).Debug("Closed connection and removed from pool") + + return conn +} + +// disconnectAll disconnects all connections. Only safe to call in Shutdown() +func (pool *ConnectionPool) disconnectAll() { + for _, conn := range pool.pool { + addr := conn.Addr() + pool.disconnect(addr, ErrDisconnectShutdown) + } +} + +// GetConnections returns an copy of pool connections +func (pool *ConnectionPool) GetConnections() ([]Connection, error) { + conns := []Connection{} + if err := pool.strand("GetConnections", func() error { + for _, conn := range pool.pool { + conns = append(conns, *conn) + } + return nil + }); err != nil { + return nil, err + } + return conns, nil +} + +// Size returns the pool size +func (pool *ConnectionPool) Size() (l int, err error) { + err = pool.strand("Size", func() error { + l = len(pool.pool) + return nil + }) + return +} + +// SendMessage sends a Message to a Connection +func (pool *ConnectionPool) SendMessage(addr string, msg Message) error { + if pool.Config.DebugPrint { + logger.WithField("msgType", reflect.TypeOf(msg)).Debug("SendMessage") + } + + return pool.strand("SendMessage", func() error { + if conn, ok := pool.addresses[addr]; ok { + select { + case conn.WriteQueue <- msg: + default: + logger.Critical().WithField("addr", addr).Info("Write queue full") + return ErrWriteQueueFull + } + } else { + return fmt.Errorf("Tried to send %T to %s, but we are not connected", msg, addr) + } + return nil + }) +} + +// BroadcastMessage sends a Message to all connections specified in addrs. +// If a connection does not exist for a given address, it is skipped. +// If no messages were written to any connection, an error is returned. +// Returns the gnet IDs of connections that the message was queued for sending to. +// Note that actual sending can still fail later, if the connection drops before the message is sent. +func (pool *ConnectionPool) BroadcastMessage(msg Message, addrs []string) ([]uint64, error) { + if pool.Config.DebugPrint { + logger.WithField("msgType", reflect.TypeOf(msg)).Debug("BroadcastMessage") + } + + if len(addrs) == 0 { + return nil, ErrNoAddresses + } + + queuedConns := make([]uint64, 0, len(addrs)) + + if err := pool.strand("BroadcastMessage", func() error { + if len(pool.pool) == 0 { + return ErrPoolEmpty + } + + fullWriteQueue := 0 + foundConns := 0 + + for _, addr := range addrs { + if conn, ok := pool.addresses[addr]; ok { + foundConns++ + select { + case conn.WriteQueue <- msg: + queuedConns = append(queuedConns, conn.ID) + default: + logger.Critical().WithFields(logrus.Fields{ + "addr": conn.Addr(), + "id": conn.ID, + }).Info("Write queue full") + fullWriteQueue++ + } + } + } + + if foundConns == 0 { + return ErrNoMatchingConnections + } + + if fullWriteQueue == foundConns { + return ErrNoReachableConnections + } + + return nil + }); err != nil { + return nil, err + } + + return queuedConns, nil +} + +// Unpacks incoming bytes to a Message and calls the message handler. If +// the bytes cannot be converted to a Message, the error is returned as the +// first return value. Otherwise, error will be nil and DisconnectReason will +// be the value returned from the message handler. +func (pool *ConnectionPool) receiveMessage(c *Connection, msg []byte) error { + m, err := convertToMessage(c.ID, msg, pool.Config.DebugPrint) + if err != nil { + return err + } + if err := pool.updateLastRecv(c.Addr(), Now()); err != nil { + return err + } + return m.Handle(NewMessageContext(c), pool.messageState) +} + +// SendPings sends a ping if our last message sent was over pingRate ago +func (pool *ConnectionPool) SendPings(rate time.Duration, msg Message) error { + now := time.Now().UTC() + var addrs []string + if err := pool.strand("SendPings", func() error { + for _, conn := range pool.pool { + if conn.LastSent.Add(rate).Before(now) { + addrs = append(addrs, conn.Addr()) + } + } + return nil + }); err != nil { + return err + } + + for _, a := range addrs { + if err := pool.SendMessage(a, msg); err != nil { + return err + } + } + + return nil +} + +// GetStaleConnections returns connections that have been idle for longer than idleLimit +func (pool *ConnectionPool) GetStaleConnections(idleLimit time.Duration) ([]string, error) { + now := Now() + var idleConns []string + if err := pool.strand("GetStaleConnections", func() error { + for _, conn := range pool.pool { + if conn.LastReceived.Add(idleLimit).Before(now) { + idleConns = append(idleConns, conn.Addr()) + } + } + return nil + }); err != nil { + return nil, err + } + + return idleConns, nil +} + +// Now returns the current UTC time +func Now() time.Time { + return time.Now().UTC() +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/introduction_message_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/introduction_message_skyencoder.go new file mode 100644 index 0000000000..61d0ce6635 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/introduction_message_skyencoder.go @@ -0,0 +1,162 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// encodeSizeIntroductionMessage computes the size of an encoded object of type IntroductionMessage +func encodeSizeIntroductionMessage(obj *IntroductionMessage) uint64 { + i0 := uint64(0) + + // obj.Mirror + i0 += 4 + + // obj.ListenPort + i0 += 2 + + // obj.ProtocolVersion + i0 += 4 + + // omitempty + if len(obj.Extra) != 0 { + + // obj.Extra + i0 += 4 + uint64(len(obj.Extra)) + + } + + return i0 +} + +// encodeIntroductionMessage encodes an object of type IntroductionMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeIntroductionMessage(obj *IntroductionMessage) ([]byte, error) { + n := encodeSizeIntroductionMessage(obj) + buf := make([]byte, n) + + if err := encodeIntroductionMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeIntroductionMessageToBuffer encodes an object of type IntroductionMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeIntroductionMessageToBuffer(buf []byte, obj *IntroductionMessage) error { + if uint64(len(buf)) < encodeSizeIntroductionMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Mirror + e.Uint32(obj.Mirror) + + // obj.ListenPort + e.Uint16(obj.ListenPort) + + // obj.ProtocolVersion + e.Int32(obj.ProtocolVersion) + + // omitempty + if len(obj.Extra) != 0 { + + // obj.Extra length check + if uint64(len(obj.Extra)) > math.MaxUint32 { + return errors.New("obj.Extra length exceeds math.MaxUint32") + } + + // obj.Extra length + e.Uint32(uint32(len(obj.Extra))) + + // obj.Extra copy + e.CopyBytes(obj.Extra) + + } + + return nil +} + +// decodeIntroductionMessage decodes an object of type IntroductionMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeIntroductionMessage(buf []byte, obj *IntroductionMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Mirror + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Mirror = i + } + + { + // obj.ListenPort + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.ListenPort = i + } + + { + // obj.ProtocolVersion + i, err := d.Int32() + if err != nil { + return 0, err + } + obj.ProtocolVersion = i + } + + { + // obj.Extra + + if len(d.Buffer) == 0 { + return uint64(len(buf) - len(d.Buffer)), nil + } + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Extra = make([]byte, length) + + copy(obj.Extra[:], d.Buffer[:length]) + d.Buffer = d.Buffer[length:] + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeIntroductionMessageExact decodes an object of type IntroductionMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeIntroductionMessageExact(buf []byte, obj *IntroductionMessage) error { + if n, err := decodeIntroductionMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/ip_addr_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/ip_addr_skyencoder.go new file mode 100644 index 0000000000..73f6dbaf26 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/ip_addr_skyencoder.go @@ -0,0 +1,93 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import "github.com/skycoin/skycoin/src/cipher/encoder" + +// encodeSizeIPAddr computes the size of an encoded object of type IPAddr +func encodeSizeIPAddr(obj *IPAddr) uint64 { + i0 := uint64(0) + + // obj.IP + i0 += 4 + + // obj.Port + i0 += 2 + + return i0 +} + +// encodeIPAddr encodes an object of type IPAddr to a buffer allocated to the exact size +// required to encode the object. +func encodeIPAddr(obj *IPAddr) ([]byte, error) { + n := encodeSizeIPAddr(obj) + buf := make([]byte, n) + + if err := encodeIPAddrToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeIPAddrToBuffer encodes an object of type IPAddr to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeIPAddrToBuffer(buf []byte, obj *IPAddr) error { + if uint64(len(buf)) < encodeSizeIPAddr(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.IP + e.Uint32(obj.IP) + + // obj.Port + e.Uint16(obj.Port) + + return nil +} + +// decodeIPAddr decodes an object of type IPAddr from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeIPAddr(buf []byte, obj *IPAddr) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.IP + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.IP = i + } + + { + // obj.Port + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.Port = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeIPAddrExact decodes an object of type IPAddr from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeIPAddrExact(buf []byte, obj *IPAddr) error { + if n, err := decodeIPAddr(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/messages.go b/vendor/github.com/skycoin/skycoin/src/daemon/messages.go new file mode 100644 index 0000000000..1a146566af --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/messages.go @@ -0,0 +1,1390 @@ +package daemon + +import ( + "encoding/binary" + "errors" + "fmt" + "net" + "strings" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon/gnet" + "github.com/skycoin/skycoin/src/daemon/pex" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/util/iputil" + "github.com/skycoin/skycoin/src/util/useragent" +) + +// Message represent a packet to be serialized over the network by +// the gnet encoder. +// They must implement the gnet.Message interface +// All concurrent daemon write operations are synchronized by the daemon's +// DaemonLoop(). +// Message do this by caching the gnet.MessageContext received in Handle() +// and placing itself on the messageEvent channel. +// When the message is retrieved from the messageEvent channel, its process() +// method is called. + +// MessageConfig config contains a gnet.Message's 4byte prefix and a +// reference interface +type MessageConfig struct { + Prefix gnet.MessagePrefix + Message interface{} +} + +// NewMessageConfig creates message config +func NewMessageConfig(prefix string, m interface{}) MessageConfig { + return MessageConfig{ + Message: m, + Prefix: gnet.MessagePrefixFromString(prefix), + } +} + +//go:generate skyencoder -unexported -struct IntroductionMessage +//go:generate skyencoder -unexported -struct GivePeersMessage +//go:generate skyencoder -unexported -struct GetBlocksMessage +//go:generate skyencoder -unexported -struct GiveBlocksMessage +//go:generate skyencoder -unexported -struct AnnounceBlocksMessage +//go:generate skyencoder -unexported -struct GetTxnsMessage +//go:generate skyencoder -unexported -struct GiveTxnsMessage +//go:generate skyencoder -unexported -struct AnnounceTxnsMessage +//go:generate skyencoder -unexported -struct DisconnectMessage +//go:generate skyencoder -unexported -struct IPAddr +//go:generate skyencoder -unexported -output-path . -package daemon -struct SignedBlock github.com/skycoin/skycoin/src/coin +//go:generate skyencoder -unexported -output-path . -package daemon -struct Transaction github.com/skycoin/skycoin/src/coin + +// Creates and populates the message configs +func getMessageConfigs() []MessageConfig { + return []MessageConfig{ + NewMessageConfig("INTR", IntroductionMessage{}), + NewMessageConfig("GETP", GetPeersMessage{}), + NewMessageConfig("GIVP", GivePeersMessage{}), + NewMessageConfig("PING", PingMessage{}), + NewMessageConfig("PONG", PongMessage{}), + NewMessageConfig("GETB", GetBlocksMessage{}), + NewMessageConfig("GIVB", GiveBlocksMessage{}), + NewMessageConfig("ANNB", AnnounceBlocksMessage{}), + NewMessageConfig("GETT", GetTxnsMessage{}), + NewMessageConfig("GIVT", GiveTxnsMessage{}), + NewMessageConfig("ANNT", AnnounceTxnsMessage{}), + NewMessageConfig("DISC", DisconnectMessage{}), + } +} + +// MessagesConfig slice of MessageConfig +type MessagesConfig struct { + // Message ID prefices + Messages []MessageConfig +} + +// NewMessagesConfig creates messages config +func NewMessagesConfig() MessagesConfig { + return MessagesConfig{ + Messages: getMessageConfigs(), + } +} + +// Register registers our Messages with gnet +func (msc *MessagesConfig) Register() { + for _, mc := range msc.Messages { + gnet.RegisterMessage(mc.Prefix, mc.Message) + } + gnet.VerifyMessages() +} + +// Messages messages struct +type Messages struct { + Config MessagesConfig +} + +// NewMessages creates Messages +func NewMessages(c MessagesConfig) *Messages { + return &Messages{ + Config: c, + } +} + +// IPAddr compact representation of IP:Port +type IPAddr struct { + IP uint32 + Port uint16 +} + +// NewIPAddr returns an IPAddr from an ip:port string. +func NewIPAddr(addr string) (ipaddr IPAddr, err error) { + ips, port, err := iputil.SplitAddr(addr) + if err != nil { + return + } + + // TODO -- support ipv6 + ipb := net.ParseIP(ips).To4() + if ipb == nil { + err = errors.New("Ignoring IPv6 address") + return + } + + ip := binary.BigEndian.Uint32(ipb) + ipaddr.IP = ip + ipaddr.Port = port + return +} + +// String returns IPAddr as "ip:port" +func (ipa IPAddr) String() string { + ipb := make([]byte, 4) + binary.BigEndian.PutUint32(ipb, ipa.IP) + return fmt.Sprintf("%s:%d", net.IP(ipb).String(), ipa.Port) +} + +// asyncMessage messages that perform an action when received must implement this interface. +// process() is called after the message is pulled off of messageEvent channel. +// Messages should place themselves on the messageEvent channel in their +// Handle() method required by gnet. +type asyncMessage interface { + process(d daemoner) +} + +// GetPeersMessage sent to request peers +type GetPeersMessage struct { + addr string `enc:"-"` +} + +// NewGetPeersMessage creates GetPeersMessage +func NewGetPeersMessage() *GetPeersMessage { + return &GetPeersMessage{} +} + +// EncodeSize implements gnet.Serializer +func (gpm *GetPeersMessage) EncodeSize() uint64 { + return 0 +} + +// Encode implements gnet.Serializer +func (gpm *GetPeersMessage) Encode(buf []byte) error { + return nil +} + +// Decode implements gnet.Serializer +func (gpm *GetPeersMessage) Decode(buf []byte) (uint64, error) { + return 0, nil +} + +// Handle handles message +func (gpm *GetPeersMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gpm.addr = mc.Addr + return daemon.(daemoner).recordMessageEvent(gpm, mc) +} + +// process Notifies the Pex instance that peers were requested +func (gpm *GetPeersMessage) process(d daemoner) { + if d.pexConfig().Disabled { + return + } + + if err := d.sendRandomPeers(gpm.addr); err != nil { + logger.WithField("addr", gpm.addr).WithError(err).Error("SendRandomPeers failed") + } +} + +// GivePeersMessage sent in response to GetPeersMessage +type GivePeersMessage struct { + Peers []IPAddr `enc:",maxlen=512"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGivePeersMessage []*pex.Peer is converted to []IPAddr for binary transmission +// If the size of the message would exceed maxMsgLength, the IPAddr slice is truncated. +func NewGivePeersMessage(peers []pex.Peer, maxMsgLength uint64) *GivePeersMessage { + if len(peers) > 512 { + peers = peers[:512] + } + + ipaddrs := make([]IPAddr, 0, len(peers)) + for _, ps := range peers { + ipaddr, err := NewIPAddr(ps.Addr) + if err != nil { + logger.WithError(err).WithField("addr", ps.Addr).Warning("GivePeersMessage skipping invalid address") + continue + } + ipaddrs = append(ipaddrs, ipaddr) + } + + m := &GivePeersMessage{ + Peers: ipaddrs, + } + truncateGivePeersMessage(m, maxMsgLength) + return m +} + +// truncateGivePeersMessage truncates the blocks in GivePeersMessage to fit inside of MaxOutgoingMessageLength +func truncateGivePeersMessage(m *GivePeersMessage, maxMsgLength uint64) { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return + } + + // Measure the size of an empty message + var mm GivePeersMessage + size := mm.EncodeSize() + + // Measure the size of the peers, advancing the slice index until it reaches capacity + index := -1 + for i, ip := range m.Peers { + x := encodeSizeIPAddr(&ip) + if size+x > maxMsgLength { + break + } + size += x + index = i + } + + m.Peers = m.Peers[:index+1] + + if len(m.Peers) == 0 { + logger.Critical().Error("truncateGivePeersMessage truncated peers to an empty slice") + } +} + +// EncodeSize implements gnet.Serializer +func (gpm *GivePeersMessage) EncodeSize() uint64 { + return encodeSizeGivePeersMessage(gpm) +} + +// Encode implements gnet.Serializer +func (gpm *GivePeersMessage) Encode(buf []byte) error { + return encodeGivePeersMessageToBuffer(buf, gpm) +} + +// Decode implements gnet.Serializer +func (gpm *GivePeersMessage) Decode(buf []byte) (uint64, error) { + return decodeGivePeersMessage(buf, gpm) +} + +// GetPeers is required by the pex.GivePeersMessage interface. +// It returns the peers contained in the message as an array of "ip:port" +// strings. +func (gpm *GivePeersMessage) GetPeers() []string { + peers := make([]string, len(gpm.Peers)) + for i, ipaddr := range gpm.Peers { + peers[i] = ipaddr.String() + } + return peers +} + +// Handle handle message +func (gpm *GivePeersMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gpm.c = mc + return daemon.(daemoner).recordMessageEvent(gpm, mc) +} + +// process Notifies the Pex instance that peers were received +func (gpm *GivePeersMessage) process(d daemoner) { + if d.pexConfig().Disabled { + return + } + + peers := gpm.GetPeers() + + if len(peers) == 0 { + return + } + + // Cap the number of peers printed in the log to prevent log spam abuse + peersToFmt := peers + if len(peersToFmt) > 30 { + peersToFmt = peersToFmt[:30] + } + peersStr := strings.Join(peersToFmt, ", ") + if len(peers) != len(peersToFmt) { + peersStr += fmt.Sprintf(" and %d more", len(peers)-len(peersToFmt)) + } + + logger.WithFields(logrus.Fields{ + "addr": gpm.c.Addr, + "gnetID": gpm.c.ConnID, + "peers": peersStr, + "count": len(peers), + }).Debug("Received peers via PEX") + + d.addPeers(peers) +} + +// IntroductionMessage is sent on first connect by both parties +type IntroductionMessage struct { + c *gnet.MessageContext `enc:"-"` + UserAgent useragent.Data `enc:"-"` + UnconfirmedVerifyTxn params.VerifyTxn `enc:"-"` + GenesisHash cipher.SHA256 `enc:"-"` + + // Mirror is a random value generated on client startup that is used to identify self-connections + Mirror uint32 + // ListenPort is the port that this client is listening on + ListenPort uint16 + // Protocol version + ProtocolVersion int32 + + // Extra is extra bytes added to the struct to accommodate multiple versions of this packet. + // Currently it contains the blockchain pubkey and user agent but will accept a client that does not provide it. + // If any of this data is provided, it must include a valid blockchain pubkey and a valid user agent string (maxlen=256). + // Contents of extra: + // ExtraByte uint32 // length prefix of []byte + // Pubkey cipher.Pubkey // blockchain pubkey + // BurnFactor uint32 // burn factor for announced txns + // MaxTxnSize uint32 // max txn size for announced txns + // MaxDropletPrecision uint8 // maximum number of decimal places for announced txns + // UserAgent string `enc:",maxlen=256"` + // GenesisHash cipher.SHA256 // genesis block hash + Extra []byte `enc:",omitempty"` +} + +// NewIntroductionMessage creates introduction message +func NewIntroductionMessage(mirror uint32, version int32, port uint16, pubkey cipher.PubKey, userAgent string, verifyParams params.VerifyTxn, genesisHash cipher.SHA256) *IntroductionMessage { + return &IntroductionMessage{ + Mirror: mirror, + ProtocolVersion: version, + ListenPort: port, + Extra: newIntroductionMessageExtra(pubkey, userAgent, verifyParams, genesisHash), + } +} + +func newIntroductionMessageExtra(pubkey cipher.PubKey, userAgent string, verifyParams params.VerifyTxn, genesisHash cipher.SHA256) []byte { + if len(userAgent) > useragent.MaxLen { + logger.WithFields(logrus.Fields{ + "userAgent": userAgent, + "maxLen": useragent.MaxLen, + }).Panic("user agent exceeds max len") + } + if userAgent == "" { + logger.Panic("user agent is required") + } + useragent.MustParse(userAgent) + + if err := verifyParams.Validate(); err != nil { + logger.Panic(err) + } + + userAgentSerialized := encoder.SerializeString(userAgent) + verifyParamsSerialized := encoder.Serialize(verifyParams) + + extra := make([]byte, len(pubkey)+len(userAgentSerialized)+len(verifyParamsSerialized)+len(genesisHash)) + + copy(extra[:len(pubkey)], pubkey[:]) + i := len(pubkey) + copy(extra[i:], verifyParamsSerialized) + i += len(verifyParamsSerialized) + copy(extra[i:], userAgentSerialized) + i += len(userAgentSerialized) + copy(extra[i:i+len(genesisHash)], genesisHash[:]) + + return extra +} + +// EncodeSize implements gnet.Serializer +func (intro *IntroductionMessage) EncodeSize() uint64 { + return encodeSizeIntroductionMessage(intro) +} + +// Encode implements gnet.Serializer +func (intro *IntroductionMessage) Encode(buf []byte) error { + return encodeIntroductionMessageToBuffer(buf, intro) +} + +// Decode implements gnet.Serializer +func (intro *IntroductionMessage) Decode(buf []byte) (uint64, error) { + return decodeIntroductionMessage(buf, intro) +} + +// Handle records message event in daemon +func (intro *IntroductionMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + intro.c = mc + return daemon.(daemoner).recordMessageEvent(intro, mc) +} + +// process an event queued by Handle() +func (intro *IntroductionMessage) process(d daemoner) { + addr := intro.c.Addr + + fields := logrus.Fields{ + "addr": addr, + "gnetID": intro.c.ConnID, + "listenPort": intro.ListenPort, + } + + logger.WithFields(fields).Debug("IntroductionMessage.process") + + if err := intro.Verify(d.DaemonConfig(), logrus.Fields{ + "addr": addr, + "gnetID": intro.c.ConnID, + }); err != nil { + if err := d.Disconnect(addr, err); err != nil { + logger.WithError(err).WithFields(fields).Warning("Disconnect") + } + return + } + + if _, err := d.connectionIntroduced(addr, intro.c.ConnID, intro); err != nil { + logger.WithError(err).WithFields(fields).Warning("connectionIntroduced failed") + var reason gnet.DisconnectReason + switch err { + // It is hypothetically possible that a message would get processed after + // a disconnect event for a given connection. + // In this case, drop the packet. + // Do not perform a disconnect, since this would operate on the new connection. + // This should be prevented by an earlier check in daemon.onMessageEvent() + case ErrConnectionGnetIDMismatch, ErrConnectionStateNotConnected, ErrConnectionAlreadyIntroduced: + logger.Critical().WithError(err).WithFields(fields).Warning("IntroductionMessage.process connection state out of order") + return + case ErrConnectionNotExist: + return + case ErrConnectionIPMirrorExists: + reason = ErrDisconnectConnectedTwice + case pex.ErrPeerlistFull: + reason = ErrDisconnectPeerlistFull + // Send more peers before disconnecting + logger.WithFields(fields).Debug("Sending peers before disconnecting due to peer list full") + if err := d.sendRandomPeers(addr); err != nil { + logger.WithError(err).WithFields(fields).Warning("sendRandomPeers failed") + } + default: + reason = ErrDisconnectUnexpectedError + } + + if err := d.Disconnect(addr, reason); err != nil { + logger.WithError(err).WithFields(fields).Warning("Disconnect") + } + + return + } + + // Request blocks immediately after they're confirmed + if err := d.requestBlocksFromAddr(addr); err != nil { + logger.WithError(err).WithFields(fields).Warning("requestBlocksFromAddr") + } else { + logger.WithFields(fields).Debug("Requested blocks") + } + + // Announce unconfirmed txns + if err := d.announceAllValidTxns(); err != nil { + logger.WithError(err).Warning("announceAllValidTxns failed") + } +} + +// Verify checks if the introduction message is valid returning the appropriate error +func (intro *IntroductionMessage) Verify(dc DaemonConfig, logFields logrus.Fields) error { + // Disconnect if this is a self connection (we have the same mirror value) + if intro.Mirror == dc.Mirror { + logger.WithFields(logFields).WithField("mirror", intro.Mirror).Info("Remote mirror value matches ours") + return ErrDisconnectSelf + } + + // Disconnect if peer version is not within the supported range + if intro.ProtocolVersion < dc.MinProtocolVersion { + logger.WithFields(logFields).WithFields(logrus.Fields{ + "protocolVersion": intro.ProtocolVersion, + "minProtocolVersion": dc.MinProtocolVersion, + }).Info("protocol version below minimum supported protocol version") + return ErrDisconnectVersionNotSupported + } + + logger.WithFields(logFields).WithField("protocolVersion", intro.ProtocolVersion).Debug("Peer protocol version accepted") + + // v24 does not send blockchain pubkey or user agent + // v25 sends blockchain pubkey and user agent + // v24 and v25 check the blockchain pubkey and user agent, would accept message with no Pubkey and user agent + // v26 would check the blockchain pubkey and reject if not matched or not provided, and parses a user agent + // v26 adds genesis hash + // v27 would require and check the genesis hash + extraLen := len(intro.Extra) + if extraLen == 0 { + logger.WithFields(logFields).Warning("Blockchain pubkey is not provided") + return ErrDisconnectBlockchainPubkeyNotProvided + } + + var bcPubKey cipher.PubKey + if extraLen < len(bcPubKey) { + logger.WithFields(logFields).Warning("Extra data length does not meet the minimum requirement") + return ErrDisconnectInvalidExtraData + } + copy(bcPubKey[:], intro.Extra[:len(bcPubKey)]) + + if dc.BlockchainPubkey != bcPubKey { + logger.WithFields(logFields).WithFields(logrus.Fields{ + "pubkey": bcPubKey.Hex(), + "daemonPubkey": dc.BlockchainPubkey.Hex(), + }).Warning("Blockchain pubkey does not match") + return ErrDisconnectBlockchainPubkeyNotMatched + } + + i := len(bcPubKey) + if extraLen < i+9 { + logger.WithFields(logFields).Warning("IntroductionMessage transaction verification parameters could not be deserialized: not enough data") + return ErrDisconnectInvalidExtraData + } + if err := encoder.DeserializeRawExact(intro.Extra[i:i+9], &intro.UnconfirmedVerifyTxn); err != nil { + // This should not occur due to the previous length check + logger.Critical().WithError(err).WithFields(logFields).Warning("unconfirmedVerifyTxn params could not be deserialized") + return ErrDisconnectInvalidExtraData + } + i += 9 + + if err := intro.UnconfirmedVerifyTxn.Validate(); err != nil { + logger.WithError(err).WithFields(logFields).WithFields(logrus.Fields{ + "burnFactor": intro.UnconfirmedVerifyTxn.BurnFactor, + "maxTransactionSize": intro.UnconfirmedVerifyTxn.MaxTransactionSize, + "maxDropletPrecision": intro.UnconfirmedVerifyTxn.MaxDropletPrecision, + }).Warning("Invalid unconfirmedVerifyTxn params") + switch err { + case params.ErrInvalidBurnFactor: + return ErrDisconnectInvalidBurnFactor + case params.ErrInvalidMaxTransactionSize: + return ErrDisconnectInvalidMaxTransactionSize + case params.ErrInvalidMaxDropletPrecision: + return ErrDisconnectInvalidMaxDropletPrecision + default: + return ErrDisconnectUnexpectedError + } + } + + userAgentSerialized := intro.Extra[i:] + userAgent, userAgentLen, err := encoder.DeserializeString(userAgentSerialized, useragent.MaxLen) + if err != nil { + logger.WithError(err).WithFields(logFields).Warning("Extra data user agent string could not be deserialized") + return ErrDisconnectInvalidExtraData + } + + intro.UserAgent, err = useragent.Parse(useragent.Sanitize(userAgent)) + if err != nil { + logger.WithError(err).WithFields(logFields).WithField("userAgent", userAgent).Warning("User agent is invalid") + return ErrDisconnectInvalidUserAgent + } + i += int(userAgentLen) + + remainingLen := extraLen - i + if remainingLen > 0 && remainingLen < len(intro.GenesisHash) { + logger.WithFields(logFields).Warning("Extra data genesis hash could not be deserialized: not enough data") + return ErrDisconnectInvalidExtraData + } + copy(intro.GenesisHash[:], intro.Extra[i:]) + + return nil +} + +// PingMessage Sent to keep a connection alive. A PongMessage is sent in reply. +type PingMessage struct { + c *gnet.MessageContext `enc:"-"` +} + +// EncodeSize implements gnet.Serializer +func (ping *PingMessage) EncodeSize() uint64 { + return 0 +} + +// Encode implements gnet.Serializer +func (ping *PingMessage) Encode(buf []byte) error { + return nil +} + +// Decode implements gnet.Serializer +func (ping *PingMessage) Decode(buf []byte) (uint64, error) { + return 0, nil +} + +// Handle implements the Messager interface +func (ping *PingMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + ping.c = mc + return daemon.(daemoner).recordMessageEvent(ping, mc) +} + +// process Sends a PongMessage to the sender of PingMessage +func (ping *PingMessage) process(d daemoner) { + fields := logrus.Fields{ + "addr": ping.c.Addr, + "gnetID": ping.c.ConnID, + } + + if d.DaemonConfig().LogPings { + logger.WithFields(fields).Debug("Replying to ping") + } + if err := d.sendMessage(ping.c.Addr, &PongMessage{}); err != nil { + logger.WithFields(fields).WithError(err).Error("Send PongMessage failed") + } +} + +// PongMessage Sent in reply to a PingMessage. No action is taken when this is received. +type PongMessage struct { +} + +// EncodeSize implements gnet.Serializer +func (pong *PongMessage) EncodeSize() uint64 { + return 0 +} + +// Encode implements gnet.Serializer +func (pong *PongMessage) Encode(buf []byte) error { + return nil +} + +// Decode implements gnet.Serializer +func (pong *PongMessage) Decode(buf []byte) (uint64, error) { + return 0, nil +} + +// Handle handles message +func (pong *PongMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + // There is nothing to do; gnet updates Connection.LastMessage internally + // when this is received + if daemon.(daemoner).DaemonConfig().LogPings { + logger.WithFields(logrus.Fields{ + "addr": mc.Addr, + "gnetID": mc.ConnID, + }).Debug("Received pong") + } + return nil +} + +// DisconnectMessage sent to a peer before disconnecting, indicating the reason for disconnect +type DisconnectMessage struct { + c *gnet.MessageContext `enc:"-"` + reason gnet.DisconnectReason `enc:"-"` + + // Error code + ReasonCode uint16 + + // Reserved for future use + Reserved []byte +} + +// NewDisconnectMessage creates message sent to reject previously received message +func NewDisconnectMessage(reason gnet.DisconnectReason) *DisconnectMessage { + return &DisconnectMessage{ + reason: reason, + ReasonCode: DisconnectReasonToCode(reason), + Reserved: nil, + } +} + +// EncodeSize implements gnet.Serializer +func (dm *DisconnectMessage) EncodeSize() uint64 { + return encodeSizeDisconnectMessage(dm) +} + +// Encode implements gnet.Serializer +func (dm *DisconnectMessage) Encode(buf []byte) error { + return encodeDisconnectMessageToBuffer(buf, dm) +} + +// Decode implements gnet.Serializer +func (dm *DisconnectMessage) Decode(buf []byte) (uint64, error) { + return decodeDisconnectMessage(buf, dm) +} + +// Handle an event queued by Handle() +func (dm *DisconnectMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + dm.c = mc + return daemon.(daemoner).recordMessageEvent(dm, mc) +} + +// process disconnect message by reflexively disconnecting +func (dm *DisconnectMessage) process(d daemoner) { + logger.WithFields(logrus.Fields{ + "addr": dm.c.Addr, + "gnetID": dm.c.ConnID, + "code": dm.ReasonCode, + "reason": DisconnectCodeToReason(dm.ReasonCode), + }).Infof("DisconnectMessage received") + + if err := d.disconnectNow(dm.c.Addr, ErrDisconnectReceivedDisconnect); err != nil { + logger.WithError(err).WithField("addr", dm.c.Addr).Warning("disconnectNow") + } +} + +// GetBlocksMessage sent to request blocks since LastBlock +type GetBlocksMessage struct { + LastBlock uint64 + RequestedBlocks uint64 + c *gnet.MessageContext `enc:"-"` +} + +// NewGetBlocksMessage creates GetBlocksMessage +func NewGetBlocksMessage(lastBlock, requestedBlocks uint64) *GetBlocksMessage { + return &GetBlocksMessage{ + LastBlock: lastBlock, + RequestedBlocks: requestedBlocks, + } +} + +// EncodeSize implements gnet.Serializer +func (gbm *GetBlocksMessage) EncodeSize() uint64 { + return encodeSizeGetBlocksMessage(gbm) +} + +// Encode implements gnet.Serializer +func (gbm *GetBlocksMessage) Encode(buf []byte) error { + return encodeGetBlocksMessageToBuffer(buf, gbm) +} + +// Decode implements gnet.Serializer +func (gbm *GetBlocksMessage) Decode(buf []byte) (uint64, error) { + return decodeGetBlocksMessage(buf, gbm) +} + +// Handle handles message +func (gbm *GetBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gbm.c = mc + return daemon.(daemoner).recordMessageEvent(gbm, mc) +} + +// process should send number to be requested, with request +func (gbm *GetBlocksMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": gbm.c.Addr, + "gnetID": gbm.c.ConnID, + } + + // Record this as this peer's highest block + d.recordPeerHeight(gbm.c.Addr, gbm.c.ConnID, gbm.LastBlock) + + // Cap the number of requested blocks (TODO - necessary since we have size limits enforced later?) + requestedBlocks := gbm.RequestedBlocks + if requestedBlocks > dc.MaxGetBlocksResponseCount { + logger.WithFields(logrus.Fields{ + "requestedBlocks": requestedBlocks, + "maxRequestedBlocks": dc.MaxGetBlocksResponseCount, + }).WithFields(fields).Debug("GetBlocksMessage.RequestedBlocks value exceeds configured limit, reducing") + requestedBlocks = dc.MaxGetBlocksResponseCount + } + + // Fetch and return signed blocks since LastBlock + blocks, err := d.getSignedBlocksSince(gbm.LastBlock, requestedBlocks) + if err != nil { + logger.WithFields(fields).WithError(err).Error("getSignedBlocksSince failed") + return + } + + if len(blocks) == 0 { + return + } + + logger.WithFields(fields).Debugf("GetBlocksMessage: replying with %d blocks after block %d", len(blocks), gbm.LastBlock) + + m := NewGiveBlocksMessage(blocks, dc.MaxOutgoingMessageLength) + if len(m.Blocks) != len(blocks) { + logger.WithField("startBlockSeq", blocks[0].Head.BkSeq).WithFields(fields).Warningf("NewGiveBlocksMessage truncated %d blocks to %d blocks", len(blocks), len(m.Blocks)) + } + + if err := d.sendMessage(gbm.c.Addr, m); err != nil { + logger.WithFields(fields).WithError(err).Error("Send GiveBlocksMessage failed") + } +} + +// GiveBlocksMessage sent in response to GetBlocksMessage, or unsolicited +type GiveBlocksMessage struct { + Blocks []coin.SignedBlock `enc:",maxlen=128"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGiveBlocksMessage creates GiveBlocksMessage. +// If the size of message would exceed maxMsgLength, the block slice is truncated. +func NewGiveBlocksMessage(blocks []coin.SignedBlock, maxMsgLength uint64) *GiveBlocksMessage { + if len(blocks) > 128 { + blocks = blocks[:128] + } + m := &GiveBlocksMessage{ + Blocks: blocks, + } + truncateGiveBlocksMessage(m, maxMsgLength) + return m +} + +// truncateGiveBlocksMessage truncates the blocks in GiveBlocksMessage to fit inside of MaxOutgoingMessageLength +func truncateGiveBlocksMessage(m *GiveBlocksMessage, maxMsgLength uint64) { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return + } + + // Measure the size of an empty message + var mm GiveBlocksMessage + size := mm.EncodeSize() + + // Measure the size of the blocks, advancing the slice index until it reaches capacity + index := -1 + for i, b := range m.Blocks { + x := encodeSizeSignedBlock(&b) + if size+x > maxMsgLength { + break + } + size += x + index = i + } + + m.Blocks = m.Blocks[:index+1] + + if len(m.Blocks) == 0 { + logger.Critical().Error("truncateGiveBlocksMessage truncated blocks to an empty slice") + } +} + +// EncodeSize implements gnet.Serializer +func (m *GiveBlocksMessage) EncodeSize() uint64 { + return encodeSizeGiveBlocksMessage(m) +} + +// Encode implements gnet.Serializer +func (m *GiveBlocksMessage) Encode(buf []byte) error { + return encodeGiveBlocksMessageToBuffer(buf, m) +} + +// Decode implements gnet.Serializer +func (m *GiveBlocksMessage) Decode(buf []byte) (uint64, error) { + return decodeGiveBlocksMessage(buf, m) +} + +// Handle handle message +func (m *GiveBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + m.c = mc + return daemon.(daemoner).recordMessageEvent(m, mc) +} + +// process process message +func (m *GiveBlocksMessage) process(d daemoner) { + if d.DaemonConfig().DisableNetworking { + logger.Critical().Info("Visor disabled, ignoring GiveBlocksMessage") + return + } + + // These DB queries are not performed in a transaction for performance reasons. + // It is not necessary that the blocks be executed together in a single transaction. + + processed := 0 + maxSeq, ok, err := d.headBkSeq() + if err != nil { + logger.WithError(err).Error("d.headBkSeq failed") + return + } + if !ok { + logger.Error("No HeadBkSeq found, cannot execute blocks") + return + } + + for _, b := range m.Blocks { + // To minimize waste when receiving multiple responses from peers + // we only break out of the loop if the block itself is invalid. + // E.g. if we request 20 blocks since 0 from 2 peers, and one peer + // replies with 15 and the other 20, if we did not do this check and + // the reply with 15 was received first, we would toss the one with 20 + // even though we could process it at the time. + if b.Seq() <= maxSeq { + continue + } + + err := d.executeSignedBlock(b) + if err == nil { + logger.Critical().WithField("seq", b.Block.Head.BkSeq).Info("Added new block") + processed++ + } else { + logger.Critical().WithError(err).WithField("seq", b.Block.Head.BkSeq).Error("Failed to execute received block") + // Blocks must be received in order, so if one fails its assumed + // the rest are failing + break + } + } + if processed == 0 { + return + } + + headBkSeq, ok, err := d.headBkSeq() + if err != nil { + logger.WithError(err).Error("d.headBkSeq failed") + return + } + if !ok { + logger.Error("No HeadBkSeq found after executing blocks, will not announce blocks") + return + } + + if headBkSeq < maxSeq { + logger.Critical().Warning("HeadBkSeq decreased after executing blocks") + } else if headBkSeq-maxSeq != uint64(processed) { + logger.Critical().Warning("HeadBkSeq increased by %d but we processed %s blocks", headBkSeq-maxSeq, processed) + } + + // Announce our new blocks to peers + abm := NewAnnounceBlocksMessage(headBkSeq) + if _, err := d.broadcastMessage(abm); err != nil { + logger.WithError(err).Warning("Broadcast AnnounceBlocksMessage failed") + } + + // Request more blocks + gbm := NewGetBlocksMessage(headBkSeq, d.DaemonConfig().GetBlocksRequestCount) + if _, err := d.broadcastMessage(gbm); err != nil { + logger.WithError(err).Warning("Broadcast GetBlocksMessage failed") + } +} + +// AnnounceBlocksMessage tells a peer our highest known BkSeq. The receiving peer can choose +// to send GetBlocksMessage in response +type AnnounceBlocksMessage struct { + MaxBkSeq uint64 + c *gnet.MessageContext `enc:"-"` +} + +// NewAnnounceBlocksMessage creates message +func NewAnnounceBlocksMessage(seq uint64) *AnnounceBlocksMessage { + return &AnnounceBlocksMessage{ + MaxBkSeq: seq, + } +} + +// EncodeSize implements gnet.Serializer +func (abm *AnnounceBlocksMessage) EncodeSize() uint64 { + return encodeSizeAnnounceBlocksMessage(abm) +} + +// Encode implements gnet.Serializer +func (abm *AnnounceBlocksMessage) Encode(buf []byte) error { + return encodeAnnounceBlocksMessageToBuffer(buf, abm) +} + +// Decode implements gnet.Serializer +func (abm *AnnounceBlocksMessage) Decode(buf []byte) (uint64, error) { + return decodeAnnounceBlocksMessage(buf, abm) +} + +// Handle handles message +func (abm *AnnounceBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + abm.c = mc + return daemon.(daemoner).recordMessageEvent(abm, mc) +} + +// process process message +func (abm *AnnounceBlocksMessage) process(d daemoner) { + if d.DaemonConfig().DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": abm.c.Addr, + "gnetID": abm.c.ConnID, + } + + headBkSeq, ok, err := d.headBkSeq() + if err != nil { + logger.WithError(err).Error("AnnounceBlocksMessage d.headBkSeq failed") + return + } + if !ok { + logger.Error("AnnounceBlocksMessage no head block, cannot process AnnounceBlocksMessage") + return + } + + if headBkSeq >= abm.MaxBkSeq { + return + } + + // TODO: Should this be block get request for current sequence? + // If client is not caught up, won't attempt to get block + m := NewGetBlocksMessage(headBkSeq, d.DaemonConfig().GetBlocksRequestCount) + if err := d.sendMessage(abm.c.Addr, m); err != nil { + logger.WithError(err).WithFields(fields).Error("Send GetBlocksMessage") + } +} + +// SendingTxnsMessage send transaction message interface +type SendingTxnsMessage interface { + GetFiltered() []cipher.SHA256 +} + +// AnnounceTxnsMessage tells a peer that we have these transactions +type AnnounceTxnsMessage struct { + Transactions []cipher.SHA256 `enc:",maxlen=256"` + c *gnet.MessageContext `enc:"-"` +} + +// NewAnnounceTxnsMessage creates announce txns message. +// If the size of the message would exceed maxMsgLength, the hashes slice is truncated. +func NewAnnounceTxnsMessage(txns []cipher.SHA256, maxMsgLength uint64) *AnnounceTxnsMessage { + if len(txns) > 256 { + txns = txns[:256] + } + m := &AnnounceTxnsMessage{ + Transactions: txns, + } + hashes := truncateAnnounceTxnsHashes(m, maxMsgLength) + m.Transactions = hashes + return m +} + +// truncateAnnounceTxnsHashes truncates the hashes in AnnounceTxnsMessage to fit inside of MaxOutgoingMessageLength +func truncateAnnounceTxnsHashes(m *AnnounceTxnsMessage, maxMsgLength uint64) []cipher.SHA256 { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return m.Transactions + } + + // Measure the size of an empty message + var mm AnnounceTxnsMessage + size := mm.EncodeSize() + + if maxMsgLength < size { + logger.Panic("maxMsgLength must be <= 4 + sizeof(empty AnnounceTxnsMessage)") + } + + maxMsgLength -= size + + hashes := truncateSHA256Slice(m.Transactions, maxMsgLength) + + if len(hashes) == 0 { + logger.Critical().Error("truncateAnnounceTxnsHashes truncated hashes to an empty slice") + } + + return hashes +} + +func truncateSHA256Slice(hashes []cipher.SHA256, maxLength uint64) []cipher.SHA256 { + if len(hashes) == 0 { + return hashes + } + + size := len(hashes[0]) + + n := maxLength / uint64(size) + + if n > uint64(len(hashes)) { + return hashes + } + + return hashes[:n] +} + +// EncodeSize implements gnet.Serializer +func (atm *AnnounceTxnsMessage) EncodeSize() uint64 { + return encodeSizeAnnounceTxnsMessage(atm) +} + +// Encode implements gnet.Serializer +func (atm *AnnounceTxnsMessage) Encode(buf []byte) error { + return encodeAnnounceTxnsMessageToBuffer(buf, atm) +} + +// Decode implements gnet.Serializer +func (atm *AnnounceTxnsMessage) Decode(buf []byte) (uint64, error) { + return decodeAnnounceTxnsMessage(buf, atm) +} + +// GetFiltered returns txns +func (atm *AnnounceTxnsMessage) GetFiltered() []cipher.SHA256 { + return atm.Transactions +} + +// Handle handle message +func (atm *AnnounceTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + atm.c = mc + return daemon.(daemoner).recordMessageEvent(atm, mc) +} + +// process process message +func (atm *AnnounceTxnsMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": atm.c.Addr, + "gnetID": atm.c.ConnID, + } + + unknown, err := d.filterKnownUnconfirmed(atm.Transactions) + if err != nil { + logger.WithError(err).Error("AnnounceTxnsMessage d.filterKnownUnconfirmed failed") + return + } + + if len(unknown) == 0 { + return + } + + m := NewGetTxnsMessage(unknown, dc.MaxOutgoingMessageLength) + if len(m.Transactions) != len(unknown) { + logger.Warningf("NewGetTxnsMessage truncated %d hashes to %d hashes", len(unknown), len(m.Transactions)) + } + + if err := d.sendMessage(atm.c.Addr, m); err != nil { + logger.WithFields(fields).WithError(err).Error("Send GetTxnsMessage failed") + } +} + +// GetTxnsMessage request transactions of given hash +type GetTxnsMessage struct { + Transactions []cipher.SHA256 `enc:",maxlen=256"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGetTxnsMessage creates GetTxnsMessage. +// If the size of the message would exceed maxMsgLength, the hashes slice is truncated. +func NewGetTxnsMessage(txns []cipher.SHA256, maxMsgLength uint64) *GetTxnsMessage { + if len(txns) > 256 { + txns = txns[:256] + } + m := &GetTxnsMessage{ + Transactions: txns, + } + hashes := truncateGetTxnsHashes(m, maxMsgLength) + m.Transactions = hashes + return m +} + +// truncateGetTxnsHashes truncates the hashes in GetTxnsMessage to fit inside of MaxOutgoingMessageLength +func truncateGetTxnsHashes(m *GetTxnsMessage, maxMsgLength uint64) []cipher.SHA256 { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return m.Transactions + } + + // Measure the size of an empty message + var mm GetTxnsMessage + size := mm.EncodeSize() + + if maxMsgLength < size { + logger.Panic("maxMsgLength must be <= 4 + sizeof(empty GetTxnsMessage)") + } + + maxMsgLength -= size + + hashes := truncateSHA256Slice(m.Transactions, maxMsgLength) + + if len(hashes) == 0 { + logger.Critical().Error("truncateGetTxnsHashes truncated hashes to an empty slice") + } + + return hashes +} + +// EncodeSize implements gnet.Serializer +func (gtm *GetTxnsMessage) EncodeSize() uint64 { + return encodeSizeGetTxnsMessage(gtm) +} + +// Encode implements gnet.Serializer +func (gtm *GetTxnsMessage) Encode(buf []byte) error { + return encodeGetTxnsMessageToBuffer(buf, gtm) +} + +// Decode implements gnet.Serializer +func (gtm *GetTxnsMessage) Decode(buf []byte) (uint64, error) { + return decodeGetTxnsMessage(buf, gtm) +} + +// Handle handle message +func (gtm *GetTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gtm.c = mc + return daemon.(daemoner).recordMessageEvent(gtm, mc) +} + +// process process message +func (gtm *GetTxnsMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": gtm.c.Addr, + "gnetID": gtm.c.ConnID, + } + + // Locate all txns from the unconfirmed pool + known, err := d.getKnownUnconfirmed(gtm.Transactions) + if err != nil { + logger.WithError(err).Error("GetTxnsMessage d.getKnownUnconfirmed failed") + return + } + if len(known) == 0 { + return + } + + // Reply to sender with GiveTxnsMessage + m := NewGiveTxnsMessage(known, dc.MaxOutgoingMessageLength) + if len(m.Transactions) != len(known) { + logger.Warningf("NewGiveTxnsMessage truncated %d hashes to %d hashes", len(known), len(m.Transactions)) + } + + if err := d.sendMessage(gtm.c.Addr, m); err != nil { + logger.WithError(err).WithFields(fields).Error("Send GiveTxnsMessage") + } +} + +// GiveTxnsMessage tells the transaction of given hashes +type GiveTxnsMessage struct { + Transactions []coin.Transaction `enc:",maxlen=256"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGiveTxnsMessage creates GiveTxnsMessage. +// If the size of the message would exceed maxMsgLength, the transactions slice is truncated. +func NewGiveTxnsMessage(txns []coin.Transaction, maxMsgLength uint64) *GiveTxnsMessage { + if len(txns) > 256 { + txns = txns[:256] + } + m := &GiveTxnsMessage{ + Transactions: txns, + } + truncateGiveTxnsMessage(m, maxMsgLength) + return m +} + +// truncateGiveTxnsMessage truncates the transactions in GiveTxnsMessage to fit inside of MaxOutgoingMessageLength +func truncateGiveTxnsMessage(m *GiveTxnsMessage, maxMsgLength uint64) { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return + } + + // Measure the size of an empty message + var mm GiveTxnsMessage + size := mm.EncodeSize() + + // Measure the size of the txns, advancing the slice index until it reaches capacity + index := -1 + for i, txn := range m.Transactions { + x := encodeSizeTransaction(&txn) + if size+x > maxMsgLength { + break + } + size += x + index = i + } + + m.Transactions = m.Transactions[:index+1] + + if len(m.Transactions) == 0 { + logger.Critical().Error("truncateGiveTxnsMessage truncated txns to an empty slice") + } +} + +// EncodeSize implements gnet.Serializer +func (gtm *GiveTxnsMessage) EncodeSize() uint64 { + return encodeSizeGiveTxnsMessage(gtm) +} + +// Encode implements gnet.Serializer +func (gtm *GiveTxnsMessage) Encode(buf []byte) error { + return encodeGiveTxnsMessageToBuffer(buf, gtm) +} + +// Decode implements gnet.Serializer +func (gtm *GiveTxnsMessage) Decode(buf []byte) (uint64, error) { + return decodeGiveTxnsMessage(buf, gtm) +} + +// GetFiltered returns transactions hashes +func (gtm *GiveTxnsMessage) GetFiltered() []cipher.SHA256 { + return coin.Transactions(gtm.Transactions).Hashes() +} + +// Handle handle message +func (gtm *GiveTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gtm.c = mc + return daemon.(daemoner).recordMessageEvent(gtm, mc) +} + +// process process message +func (gtm *GiveTxnsMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + hashes := make([]cipher.SHA256, 0, len(gtm.Transactions)) + // Update unconfirmed pool with these transactions + for _, txn := range gtm.Transactions { + // Only announce transactions that are new to us, so that peers can't spam relays + // It is not necessary to inject all of the transactions inside a database transaction, + // since each is independent + known, softErr, err := d.injectTransaction(txn) + if err != nil { + logger.WithError(err).WithField("txid", txn.Hash().Hex()).Warning("Failed to record transaction") + continue + } else if softErr != nil { + logger.WithError(softErr).WithField("txid", txn.Hash().Hex()).Warning("Transaction soft violation") + // Allow soft txn violations to rebroadcast + } else if known { + logger.WithField("txid", txn.Hash().Hex()).Debug("Duplicate transaction") + continue + } + + hashes = append(hashes, txn.Hash()) + } + + if len(hashes) == 0 { + return + } + + // Announce these transactions to peers + m := NewAnnounceTxnsMessage(hashes, dc.MaxOutgoingMessageLength) + if len(m.Transactions) != len(hashes) { + logger.Warningf("NewAnnounceTxnsMessage truncated %d hashes to %d hashes", len(hashes), len(m.Transactions)) + } + + if ids, err := d.broadcastMessage(m); err != nil { + logger.WithError(err).Warning("Broadcast AnnounceTxnsMessage failed") + } else { + logger.Debugf("Announced %d transactions to %d peers", len(hashes), len(ids)) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/pex/README.md b/vendor/github.com/skycoin/skycoin/src/daemon/pex/README.md new file mode 100644 index 0000000000..ffaf675a01 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/pex/README.md @@ -0,0 +1,8 @@ +pex +=== + +Tools for implementing peer exchange (PEX) with Go + +[![GoDoc](http://godoc.org/github.com//skycoin/pex?status.png)](http://godoc.org/github.com/skycoin/skycoin/src/daemon/pex) + +[Godoc generated documentation](http://godoc.org/github.com/skycoin/skycoin/src/daemon/pex) diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/pex/peerlist.go b/vendor/github.com/skycoin/skycoin/src/daemon/pex/peerlist.go new file mode 100644 index 0000000000..1fcc48c30e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/pex/peerlist.go @@ -0,0 +1,396 @@ +package pex + +import ( + "encoding/json" + "fmt" + "io" + "math/rand" + "os" + "time" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/util/file" + "github.com/skycoin/skycoin/src/util/useragent" +) + +// Peers peer list +type Peers []Peer + +// ToAddrs returns the address list +func (ps Peers) ToAddrs() []string { + addrs := make([]string, 0, len(ps)) + for _, p := range ps { + addrs = append(addrs, p.Addr) + } + return addrs +} + +// peerlist is a map of addresses to *PeerStates +type peerlist struct { + peers map[string]*Peer +} + +func newPeerlist() peerlist { + return peerlist{ + peers: make(map[string]*Peer), + } +} + +// Filter peers filter +type Filter func(peer Peer) bool + +// loadCachedPeersFile loads peers from the cached peers.json file +func loadCachedPeersFile(path string) (map[string]*Peer, error) { + peersJSON := make(map[string]PeerJSON) + err := file.LoadJSON(path, &peersJSON) + + if os.IsNotExist(err) { + logger.WithField("path", path).Info("File does not exist") + return nil, nil + } else if err == io.EOF { + logger.WithField("path", path).Error("Corrupt or empty file") + return nil, nil + } + + if err != nil { + logger.WithField("path", path).WithError(err).Error("Failed to load peers file") + return nil, err + } + + peers := make(map[string]*Peer, len(peersJSON)) + for addr, peerJSON := range peersJSON { + fields := logrus.Fields{ + "addr": addr, + "path": path, + } + + a, err := validateAddress(addr, true) + + if err != nil { + logger.WithError(err).WithFields(fields).Error("Invalid address in peers JSON file") + continue + } + + peer, err := newPeerFromJSON(peerJSON) + if err != nil { + logger.WithError(err).WithFields(fields).Error("newPeerFromJSON failed") + continue + } + + if a != peer.Addr { + fields["peerAddr"] = peer.Addr + logger.WithFields(fields).Error("Address key does not match Peer.Addr") + continue + } + + peers[a] = peer + } + + return peers, nil +} + +func (pl *peerlist) setPeers(peers []Peer) { + for _, p := range peers { + np := p + pl.peers[p.Addr] = &np + } +} + +func (pl *peerlist) hasPeer(addr string) bool { + p, ok := pl.peers[addr] + return ok && p != nil +} + +func (pl *peerlist) addPeer(addr string) { + if p, ok := pl.peers[addr]; ok && p != nil { + p.Seen() + return + } + + peer := NewPeer(addr) + pl.peers[addr] = peer +} + +func (pl *peerlist) addPeers(addrs []string) { + for _, addr := range addrs { + pl.addPeer(addr) + } +} + +func (pl *peerlist) seen(addr string) { + if p, ok := pl.peers[addr]; ok && p != nil { + p.Seen() + } +} + +// getCanTryPeers returns all peers that are triable(retried times blew exponential backoff times) +// and are able to pass the filters. +func (pl *peerlist) getCanTryPeers(flts []Filter) Peers { + ps := make(Peers, 0) + flts = append([]Filter{canTry}, flts...) +loop: + for _, p := range pl.peers { + for i := range flts { + if !flts[i](*p) { + continue loop + } + } + + ps = append(ps, *p) + } + + return ps +} + +// getPeers returns all peers that can pass the filters. +func (pl *peerlist) getPeers(flts []Filter) Peers { + ps := make(Peers, 0) +loop: + for _, p := range pl.peers { + for i := range flts { + if !flts[i](*p) { + continue loop + } + } + + ps = append(ps, *p) + } + + return ps +} + +func isTrusted(p Peer) bool { + return p.Trusted +} + +func hasIncomingPort(p Peer) bool { + return p.HasIncomingPort +} + +func canTry(p Peer) bool { + return p.CanTry() +} + +// isExchangeable filters exchangeable peers +var isExchangeable = []Filter{hasIncomingPort} + +// removePeer removes peer +func (pl *peerlist) removePeer(addr string) { + delete(pl.peers, addr) +} + +// setTrusted sets peer as trusted peer +func (pl *peerlist) setTrusted(addr string, trusted bool) error { + if p, ok := pl.peers[addr]; ok { + p.Trusted = trusted + return nil + } + + return fmt.Errorf("set peer.Trusted failed: %v does not exist in peer list", addr) +} + +// setAllUntrusted unsets the trusted field on all peers +func (pl *peerlist) setAllUntrusted() { + for _, p := range pl.peers { + p.Trusted = false + } +} + +// setHasIncomingPort marks the peer's port as being publicly accessible +func (pl *peerlist) setHasIncomingPort(addr string, hasIncomingPort bool) error { + if p, ok := pl.peers[addr]; ok { + p.HasIncomingPort = hasIncomingPort + p.Seen() + return nil + } + + return fmt.Errorf("set peer.HasIncomingPort failed: %v does not exist in peer list", addr) +} + +// setUserAgent sets a peer's user agent +func (pl *peerlist) setUserAgent(addr string, userAgent useragent.Data) error { + if p, ok := pl.peers[addr]; ok { + p.UserAgent = userAgent + p.Seen() + return nil + } + + return fmt.Errorf("set peer.UserAgent failed: %v does not exist in peer list", addr) +} + +// len returns number of peers +func (pl *peerlist) len() int { + return len(pl.peers) +} + +// getPeer returns peer for a given address +func (pl *peerlist) getPeer(addr string) (Peer, bool) { + p, ok := pl.peers[addr] + if ok { + return *p, true + } + return Peer{}, false +} + +// clearOld removes public, untrusted peers that haven't been seen in timeAgo seconds +func (pl *peerlist) clearOld(timeAgo time.Duration) { + t := time.Now().UTC() + for addr, peer := range pl.peers { + lastSeen := time.Unix(peer.LastSeen, 0) + if !peer.Trusted && t.Sub(lastSeen) > timeAgo { + delete(pl.peers, addr) + } + } +} + +// Returns n random peers, or all of the peers, whichever is lower. +// If count is 0, all of the peers are returned, shuffled. +func (pl *peerlist) random(count int, flts []Filter) Peers { + keys := pl.getCanTryPeers(flts).ToAddrs() + if len(keys) == 0 { + return Peers{} + } + + max := count + if max == 0 || max > len(keys) { + max = len(keys) + } + + ps := make(Peers, max) + perm := rand.Perm(len(keys)) + for i, j := range perm[:max] { + ps[i] = *pl.peers[keys[j]] + } + return ps +} + +// save saves known peers to disk as a newline delimited list of addresses to +// +func (pl *peerlist) save(fn string) error { + // filter the peers that has retrytime > MaxPeerRetryTimes + peers := make(map[string]PeerJSON) + for k, p := range pl.peers { + if p.RetryTimes <= MaxPeerRetryTimes { + peers[k] = newPeerJSON(*p) + } + } + + if err := file.SaveJSON(fn, peers, 0600); err != nil { + return fmt.Errorf("save peer list failed: %s", err) + } + return nil +} + +// increaseRetryTimes increases retry times +func (pl *peerlist) increaseRetryTimes(addr string) { + if p, ok := pl.peers[addr]; ok { + p.IncreaseRetryTimes() + p.Seen() + } +} + +// resetRetryTimes reset retry times +func (pl *peerlist) resetRetryTimes(addr string) { + if p, ok := pl.peers[addr]; ok { + p.ResetRetryTimes() + p.Seen() + } +} + +// resetAllRetryTimes reset all peers' retry times +func (pl *peerlist) resetAllRetryTimes() { + logger.Info("Reset all peer's retry times") + for _, p := range pl.peers { + p.ResetRetryTimes() + } +} + +func (pl *peerlist) findOldestUntrustedPeer() *Peer { + var oldest *Peer + + for _, p := range pl.peers { + if p.Trusted { + continue + } + + if oldest == nil || p.LastSeen < oldest.LastSeen { + oldest = p + } + } + + if oldest != nil { + p := *oldest + return &p + } + + return nil +} + +// PeerJSON is for saving and loading peers to disk. Some fields are strange, +// to be backwards compatible due to variable name changes +type PeerJSON struct { + Addr string // An address of the form ip:port + // Unix timestamp when this peer was last seen. + // This could be a time.Time string or an int64 timestamp + LastSeen interface{} + Private bool // Whether it should omitted from public requests + Trusted bool // Whether this peer is trusted + HasIncomePort *bool `json:"HasIncomePort,omitempty"` // Whether this peer has incoming port [DEPRECATED] + HasIncomingPort *bool // Whether this peer has incoming port + UserAgent useragent.Data +} + +// newPeerJSON returns a PeerJSON from a Peer +func newPeerJSON(p Peer) PeerJSON { + return PeerJSON{ + Addr: p.Addr, + LastSeen: p.LastSeen, + Trusted: p.Trusted, + HasIncomingPort: &p.HasIncomingPort, + UserAgent: p.UserAgent, + } +} + +// newPeerFromJSON converts a PeerJSON to a Peer +func newPeerFromJSON(p PeerJSON) (*Peer, error) { + hasIncomingPort := false + if p.HasIncomingPort != nil { + hasIncomingPort = *p.HasIncomingPort + } else if p.HasIncomePort != nil { + hasIncomingPort = *p.HasIncomePort + } + + // LastSeen could be a RFC3339Nano timestamp or an int64 unix timestamp + var lastSeen int64 + switch p.LastSeen.(type) { + case string: + lastSeenTime, err := time.Parse(time.RFC3339Nano, p.LastSeen.(string)) + if err != nil { + return nil, err + } + lastSeen = lastSeenTime.Unix() + case json.Number: + lastSeenNum := p.LastSeen.(json.Number) + var err error + lastSeen, err = lastSeenNum.Int64() + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("Invalid type %T for LastSeen field", p.LastSeen) + } + + addr, err := validateAddress(p.Addr, true) + if err != nil { + return nil, err + } + + return &Peer{ + Addr: addr, + LastSeen: lastSeen, + Trusted: p.Trusted, + HasIncomingPort: hasIncomingPort, + UserAgent: p.UserAgent, + }, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/pex/pex.go b/vendor/github.com/skycoin/skycoin/src/daemon/pex/pex.go new file mode 100644 index 0000000000..1a9e1c0544 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/pex/pex.go @@ -0,0 +1,738 @@ +// Package pex is a toolkit for implementing a peer exchange system +package pex + +import ( + "errors" + "fmt" + "io/ioutil" + "math" + "math/rand" + "net" + "net/http" + "os" + "path/filepath" + "regexp" + "strconv" + "strings" + "sync" + "time" + + "github.com/cenkalti/backoff" + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/useragent" +) + +//TODO: +// - keep track of last time the peer was connected to +// - last time peer was connected to is more important than "seen" +// - peer "seen" means something else than use here +// - save last time connected to, use 0 for never +// - only transmit peers that have active or recent connections + +const ( + // DefaultPeerListURL is the default URL to download remote peers list from, if enabled + DefaultPeerListURL = "https://downloads.skycoin.com/blockchain/peers.txt" + // PeerCacheFilename filename for disk-cached peers + PeerCacheFilename = "peers.json" + // oldPeerCacheFilename previous filename for disk-cached peers. The cache loader will fall back onto this filename if it can't load peers.json + oldPeerCacheFilename = "peers.txt" + // MaxPeerRetryTimes is the maximum number of times to retry a peer + MaxPeerRetryTimes = 10 +) + +var ( + // ErrPeerlistFull is returned when the Pex is at a maximum + ErrPeerlistFull = errors.New("Peer list full") + // ErrInvalidAddress is returned when an address appears malformed + ErrInvalidAddress = errors.New("Invalid address") + // ErrNoLocalhost is returned if a localhost addresses are not allowed + ErrNoLocalhost = errors.New("Localhost address is not allowed") + // ErrNotExternalIP is returned if an IP address is not a global unicast address + ErrNotExternalIP = errors.New("IP is not a valid external IP") + // ErrPortTooLow is returned if a port is less than 1024 + ErrPortTooLow = errors.New("Port must be >= 1024") + // ErrBlacklistedAddress returned when attempting to add a blacklisted peer + ErrBlacklistedAddress = errors.New("Blacklisted address") + + // Logging. See http://godoc.org/github.com/op/go-logging for + // instructions on how to include this log's output + logger = logging.MustGetLogger("pex") + // Default rng + rnum = rand.New(rand.NewSource(time.Now().Unix())) + // For removing inadvertent whitespace from addresses + whitespaceFilter = regexp.MustCompile(`\s`) +) + +// validateAddress returns a sanitized address if valid, otherwise an error +func validateAddress(ipPort string, allowLocalhost bool) (string, error) { + ipPort = whitespaceFilter.ReplaceAllString(ipPort, "") + pts := strings.Split(ipPort, ":") + if len(pts) != 2 { + return "", ErrInvalidAddress + } + + ip := net.ParseIP(pts[0]) + if ip == nil { + return "", ErrInvalidAddress + } else if ip.IsLoopback() { + if !allowLocalhost { + return "", ErrNoLocalhost + } + } else if !ip.IsGlobalUnicast() { + return "", ErrNotExternalIP + } + + port, err := strconv.ParseUint(pts[1], 10, 16) + if err != nil { + return "", ErrInvalidAddress + } + + if port < 1024 { + return "", ErrPortTooLow + } + + return ipPort, nil +} + +// Peer represents a known peer +type Peer struct { + Addr string // An address of the form ip:port + LastSeen int64 // Unix timestamp when this peer was last seen + Trusted bool // Whether this peer is trusted + HasIncomingPort bool // Whether this peer has accessible public port + UserAgent useragent.Data // Peer's last reported user agent + RetryTimes int `json:"-"` // records the retry times +} + +// NewPeer returns a *Peer initialized by an address string of the form ip:port +func NewPeer(address string) *Peer { + p := &Peer{ + Addr: address, + Trusted: false, + } + p.Seen() + return p +} + +// Seen marks the peer as seen +func (peer *Peer) Seen() { + peer.LastSeen = time.Now().UTC().Unix() +} + +// IncreaseRetryTimes adds the retry times +func (peer *Peer) IncreaseRetryTimes() { + peer.RetryTimes++ + logger.WithFields(logrus.Fields{ + "addr": peer.Addr, + "retryTimes": peer.RetryTimes, + }).Debug("Increase retry times") +} + +// ResetRetryTimes resets the retry time +func (peer *Peer) ResetRetryTimes() { + peer.RetryTimes = 0 +} + +// CanTry returns whether this peer is triable base on the exponential backoff algorithm +func (peer *Peer) CanTry() bool { + // Exponential backoff + mod := (math.Exp2(float64(peer.RetryTimes)) - 1) * 5 + if mod == 0 { + return true + } + + // Random time elapsed + now := time.Now().UTC().Unix() + t := rnum.Int63n(int64(mod)) + return now-peer.LastSeen > t +} + +// String returns the peer address +func (peer *Peer) String() string { + return peer.Addr +} + +// Config pex config +type Config struct { + // Folder where peers database should be saved + DataDirectory string + // Maximum number of peers to keep account of in the PeerList + Max int + // Cull peers after they havent been seen in this much time + Expiration time.Duration + // Cull expired peers on this interval + CullRate time.Duration + // clear old peers on this interval + ClearOldRate time.Duration + // How often to clear expired blacklist entries + UpdateBlacklistRate time.Duration + // How often to request peers via PEX + RequestRate time.Duration + // How many peers to send back in response to a peers request + ReplyCount int + // Localhost peers are allowed in the peerlist + AllowLocalhost bool + // Disable exchanging of peers. Peers are still loaded from disk + Disabled bool + // Whether the network is disabled + NetworkDisabled bool + // Download peers list from remote host + DownloadPeerList bool + // Download peers list from this URL + PeerListURL string + // Set all peers as untrusted (even if loaded from DefaultConnections) + DisableTrustedPeers bool + // Load peers from this file on disk. NOTE: this is different from the peers file cache in the data directory + CustomPeersFile string + // Default "trusted" connections + DefaultConnections []string +} + +// NewConfig creates default pex config. +func NewConfig() Config { + return Config{ + DataDirectory: "./", + Max: 65535, + Expiration: time.Hour * 24 * 7, + CullRate: time.Minute * 10, + ClearOldRate: time.Minute * 10, + UpdateBlacklistRate: time.Minute, + RequestRate: time.Minute, + ReplyCount: 30, + AllowLocalhost: false, + Disabled: false, + NetworkDisabled: false, + DownloadPeerList: false, + PeerListURL: DefaultPeerListURL, + DisableTrustedPeers: false, + CustomPeersFile: "", + } +} + +// Pex manages a set of known peers and controls peer acquisition +type Pex struct { + sync.RWMutex + // All known peers + peerlist peerlist + Config Config + quit chan struct{} + done chan struct{} +} + +// New creates pex +func New(cfg Config) (*Pex, error) { + pex := &Pex{ + Config: cfg, + peerlist: newPeerlist(), + quit: make(chan struct{}), + done: make(chan struct{}), + } + + // Load peers from disk + if err := pex.loadCache(); err != nil { + logger.Critical().WithError(err).Error("pex.loadCache failed") + return nil, err + } + + // Unset trusted status from any existing peers, regenerate + // them from the DefaultConnections + pex.setAllUntrusted() + + // Load default hardcoded peers, mark them as trusted + for _, addr := range cfg.DefaultConnections { + // Default peers will mark as trusted peers. + if err := pex.AddPeer(addr); err != nil { + logger.Critical().WithError(err).Error("Add default peer failed") + return nil, err + } + if err := pex.setTrusted(addr); err != nil { + logger.Critical().WithError(err).Error("pex.setTrusted for default peer failed") + return nil, err + } + } + + if cfg.DisableTrustedPeers { + // Unset trusted status from any existing peers + pex.setAllUntrusted() + } + + // Add custom peers + if cfg.CustomPeersFile != "" { + if err := pex.loadCustom(cfg.CustomPeersFile); err != nil { + logger.Critical().WithError(err).WithField("file", cfg.CustomPeersFile).Error("Failed to load custom peers file") + return nil, err + } + } + + // Save peers to disk + if err := pex.save(); err != nil { + return nil, err + } + + // Download peers from remote peers list if networking is enabled + if pex.Config.DownloadPeerList && !pex.Config.NetworkDisabled { + go func() { + if err := pex.downloadPeers(); err != nil { + logger.WithError(err).Error("Failed to download peers list") + } + }() + } + + return pex, nil +} + +// Run starts the pex service +func (px *Pex) Run() error { + logger.Info("Pex.Run started") + defer logger.Info("Pex.Run stopped") + defer close(px.done) + + defer func() { + // Save the peerlist + logger.Info("Save peerlist") + if err := px.save(); err != nil { + logger.WithError(err).Error("Save peerlist failed") + } + }() + + clearOldTicker := time.NewTicker(px.Config.ClearOldRate) + + for { + select { + case <-clearOldTicker.C: + // Remove peers we haven't seen in a while + if !px.Config.Disabled && !px.Config.NetworkDisabled { + func() { + px.Lock() + defer px.Unlock() + px.peerlist.clearOld(px.Config.Expiration) + }() + } + case <-px.quit: + return nil + } + } +} + +// Shutdown notifies the pex service to exist +func (px *Pex) Shutdown() { + logger.Info("Shutting down pex") + defer logger.Info("Pex shutdown") + close(px.quit) + <-px.done +} + +func (px *Pex) downloadPeers() error { + body, err := backoffDownloadText(px.Config.PeerListURL) + if err != nil { + logger.WithError(err).WithField("url", px.Config.PeerListURL).Error("Failed to download peers") + return err + } + + peers := parseRemotePeerList(body) + logger.WithField("url", px.Config.PeerListURL).Infof("Downloaded peers list, got %d peers", len(peers)) + + n := px.AddPeers(peers) + logger.WithField("url", px.Config.PeerListURL).Infof("Added %d/%d peers from downloaded peers list", n, len(peers)) + + return nil +} + +func (px *Pex) loadCache() error { + px.Lock() + defer px.Unlock() + + fp := filepath.Join(px.Config.DataDirectory, PeerCacheFilename) + peers, err := loadCachedPeersFile(fp) + + if err != nil { + return err + } + + // If the PeerCacheFilename peers.json file does not exist, try to load the old peers.txt file + if peers == nil { + logger.Infof("Peer cache %s not found, falling back on %s", PeerCacheFilename, oldPeerCacheFilename) + + fp := filepath.Join(px.Config.DataDirectory, oldPeerCacheFilename) + peers, err = loadCachedPeersFile(fp) + if err != nil { + return err + } + + if peers == nil { + logger.Infof("Fallback peer cache %s not found", oldPeerCacheFilename) + return nil + } + } + + // remove invalid peers and limit the max number of peers to pex.Config.Max + var validPeers []Peer + for addr, p := range peers { + if _, err := validateAddress(addr, px.Config.AllowLocalhost); err != nil { + logger.WithError(err).Error("Invalid peer address") + continue + } + + validPeers = append(validPeers, *p) + if px.Config.Max > 0 && len(validPeers) >= px.Config.Max { + break + } + } + + px.peerlist.setPeers(validPeers) + return nil +} + +func (px *Pex) loadCustom(fn string) error { + px.Lock() + defer px.Unlock() + + f, err := os.Open(fn) + if err != nil { + return err + } + + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return err + } + + peers, err := parseLocalPeerList(string(data), px.Config.AllowLocalhost) + if err != nil { + return err + } + + logger.Infof("Loaded %d peers from %s", len(peers), fn) + + px.peerlist.addPeers(peers) + return nil +} + +// SavePeers persists the peerlist +func (px *Pex) save() error { + px.Lock() + defer px.Unlock() + + fn := filepath.Join(px.Config.DataDirectory, PeerCacheFilename) + return px.peerlist.save(fn) +} + +// AddPeer adds a peer to the peer list, given an address. If the peer list is +// full, it will try to remove an old peer to make room. +// If no room can be made, ErrPeerlistFull is returned +func (px *Pex) AddPeer(addr string) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + if px.peerlist.hasPeer(cleanAddr) { + px.peerlist.seen(cleanAddr) + return nil + } + + if px.isFull() { + oldestPeer := px.peerlist.findOldestUntrustedPeer() + if oldestPeer == nil || time.Now().UTC().Unix()-oldestPeer.LastSeen < 60*60*24 { + return ErrPeerlistFull + } + + px.peerlist.removePeer(oldestPeer.Addr) + + if px.isFull() { + // This can happen if the node is run with a peers.json file that has more peers + // than the max peerlist size, then the peers.json file isn't truncated to the max peerlist size. + // It is not an error. + // The max is a soft limit; exceeding the max will not crash the program. + logger.Critical().Error("AddPeer: after removing the worst peer, the peerlist was still full") + } + } + + px.peerlist.addPeer(cleanAddr) + return nil +} + +// AddPeers add multiple peers at once. Any errors will be logged, but not returned +// Returns the number of peers that were added without error. Note that +// adding a duplicate peer will not cause an error. +func (px *Pex) AddPeers(addrs []string) int { + px.Lock() + defer px.Unlock() + + if px.Config.Max > 0 && px.peerlist.len() >= px.Config.Max { + logger.Warning("Add peers failed, peer list is full") + return 0 + } + + // validate the addresses + var validAddrs []string + for _, addr := range addrs { + a, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithField("addr", addr).WithError(err).Info("Add peers sees an invalid address") + continue + } + validAddrs = append(validAddrs, a) + } + addrs = validAddrs + + // Shuffle the addresses before capping them + rand.Shuffle(len(addrs), func(i, j int) { + addrs[i], addrs[j] = addrs[j], addrs[i] + }) + + if px.Config.Max > 0 { + rcap := px.Config.Max - px.peerlist.len() + if len(addrs) > rcap { + addrs = addrs[:rcap] + } + } + + px.peerlist.addPeers(addrs) + return len(addrs) +} + +// setTrusted marks a peer as a default peer by setting its trusted flag to true +func (px *Pex) setTrusted(addr string) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + return px.peerlist.setTrusted(cleanAddr, true) +} + +// setAllUntrusted unsets the trusted field on all peers +func (px *Pex) setAllUntrusted() { + px.Lock() + defer px.Unlock() + + px.peerlist.setAllUntrusted() +} + +// SetHasIncomingPort sets if the peer has public port +func (px *Pex) SetHasIncomingPort(addr string, hasPublicPort bool) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + return px.peerlist.setHasIncomingPort(cleanAddr, hasPublicPort) +} + +// SetUserAgent sets the peer's user agent +func (px *Pex) SetUserAgent(addr string, userAgent useragent.Data) error { + px.Lock() + defer px.Unlock() + + if !userAgent.Empty() { + if _, err := userAgent.Build(); err != nil { + return err + } + } + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + return px.peerlist.setUserAgent(cleanAddr, userAgent) +} + +// RemovePeer removes peer +func (px *Pex) RemovePeer(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.removePeer(addr) +} + +// GetPeer returns peer of given address +func (px *Pex) GetPeer(addr string) (Peer, bool) { + px.RLock() + defer px.RUnlock() + return px.peerlist.getPeer(addr) +} + +// AllTrusted returns all trusted peers +func (px *Pex) AllTrusted() Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.getPeers([]Filter{isTrusted}) +} + +// Trusted returns trusted triable peers +func (px *Pex) Trusted() Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.getCanTryPeers([]Filter{isTrusted}) +} + +// Random returns N random untrusted peers +func (px *Pex) Random(n int) Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.random(n, []Filter{func(p Peer) bool { + return !p.Trusted + }}) +} + +// RandomExchangeable returns N random exchangeable peers +func (px *Pex) RandomExchangeable(n int) Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.random(n, isExchangeable) +} + +// IncreaseRetryTimes increases retry times +func (px *Pex) IncreaseRetryTimes(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.increaseRetryTimes(addr) +} + +// ResetRetryTimes reset retry times +func (px *Pex) ResetRetryTimes(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.resetRetryTimes(addr) +} + +// ResetAllRetryTimes reset all peers' retry times +func (px *Pex) ResetAllRetryTimes() { + px.Lock() + defer px.Unlock() + px.peerlist.resetAllRetryTimes() +} + +// IsFull returns whether the peer list is full +func (px *Pex) IsFull() bool { + px.RLock() + defer px.RUnlock() + return px.isFull() +} + +func (px *Pex) isFull() bool { + return px.Config.Max > 0 && px.peerlist.len() >= px.Config.Max +} + +// downloadText downloads a text format file from url. +// Returns the raw response body as a string. +// TODO -- move to util, add backoff options +func downloadText(url string) (string, error) { + resp, err := http.Get(url) //nolint:gosec + if err != nil { + return "", err + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + return string(body), nil +} + +func backoffDownloadText(url string) (string, error) { + var body string + + b := backoff.NewExponentialBackOff() + + notify := func(err error, wait time.Duration) { + logger.WithError(err).WithField("waitTime", wait).Error("waiting to retry downloadText") + } + + operation := func() error { + logger.WithField("url", url).Info("Trying to download peers list") + var err error + body, err = downloadText(url) + return err + } + + if err := backoff.RetryNotify(operation, b, notify); err != nil { + logger.WithField("url", url).WithError(err).Info("Gave up downloading peers list") + return "", err + } + + logger.WithField("url", url).Info("Peers list downloaded") + + return body, nil +} + +// parseRemotePeerList parses a remote peers.txt file +// The peers list format is newline separated list of ip:port strings +// Any lines that don't parse to an ip:port are skipped, otherwise they return an error +// Localhost ip:port addresses are ignored +// NOTE: this does not parse the cached peers.json file in the data directory, which is a JSON file +// and is loaded by loadCachedPeersFile +func parseRemotePeerList(body string) []string { + var peers []string + for _, addr := range strings.Split(body, "\n") { + addr = whitespaceFilter.ReplaceAllString(addr, "") + if addr == "" { + continue + } + + // Never allow localhost addresses from the remote peers list + a, err := validateAddress(addr, false) + if err != nil { + err = fmt.Errorf("Peers list has invalid address %s: %v", addr, err) + logger.WithError(err).Error() + continue + } + + peers = append(peers, a) + } + + return peers +} + +// parseLocalPeerList parses a local peers.txt file +// The peers list format is newline separated list of ip:port strings +// Empty lines and lines that begin with # are treated as comment lines +// Otherwise, the line is parsed as an ip:port +// If the line fails to parse, an error is returned +// Localhost addresses are allowed if allowLocalhost is true +// NOTE: this does not parse the cached peers.json file in the data directory, which is a JSON file +// and is loaded by loadCachedPeersFile +func parseLocalPeerList(body string, allowLocalhost bool) ([]string, error) { + var peers []string + for _, addr := range strings.Split(body, "\n") { + addr = whitespaceFilter.ReplaceAllString(addr, "") + if addr == "" { + continue + } + + if strings.HasPrefix(addr, "#") { + continue + } + + a, err := validateAddress(addr, allowLocalhost) + if err != nil { + err = fmt.Errorf("Peers list has invalid address %s: %v", addr, err) + logger.WithError(err).Error() + return nil, err + } + + peers = append(peers, a) + } + + return peers, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/pool.go b/vendor/github.com/skycoin/skycoin/src/daemon/pool.go new file mode 100644 index 0000000000..36d37a5fa9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/pool.go @@ -0,0 +1,133 @@ +package daemon + +import ( + "time" + + "github.com/skycoin/skycoin/src/daemon/gnet" +) + +// PoolConfig pool config +type PoolConfig struct { + // Timeout when trying to connect to new peers through the pool + DialTimeout time.Duration + // How often to process message buffers and generate events + MessageHandlingRate time.Duration + // How long to wait before sending another ping + PingRate time.Duration + // How long a connection can idle before considered stale + IdleLimit time.Duration + // How often to check for needed pings + IdleCheckRate time.Duration + // How often to check for stale connections + ClearStaleRate time.Duration + // Buffer size for gnet.ConnectionPool's network Read events + EventChannelSize int + // Maximum number of connections + MaxConnections int + // Maximum number of outgoing connections + MaxOutgoingConnections int + // Maximum number of incoming connections + MaxIncomingConnections int + // Maximum number of outgoing connections to peers in the DefaultConnections list to maintain + MaxDefaultPeerOutgoingConnections int + // Default "trusted" peers + DefaultConnections []string + // Maximum length of incoming messages in bytes + MaxIncomingMessageLength int + // Maximum length of outgoing messages in bytes + MaxOutgoingMessageLength int + // These should be assigned by the controlling daemon + address string + port int +} + +// NewPoolConfig creates pool config +func NewPoolConfig() PoolConfig { + return PoolConfig{ + port: 6677, + address: "", + DialTimeout: time.Second * 30, + MessageHandlingRate: time.Millisecond * 50, + PingRate: 5 * time.Second, + IdleLimit: 60 * time.Second, + IdleCheckRate: 1 * time.Second, + ClearStaleRate: 1 * time.Second, + EventChannelSize: 4096, + MaxConnections: 128, + MaxOutgoingConnections: 8, + MaxIncomingConnections: 120, + MaxDefaultPeerOutgoingConnections: 2, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + } +} + +// Pool maintains config and pool +type Pool struct { + Config PoolConfig + Pool *gnet.ConnectionPool +} + +// NewPool creates pool +func NewPool(cfg PoolConfig, d *Daemon) (*Pool, error) { + gnetCfg := gnet.NewConfig() + gnetCfg.DialTimeout = cfg.DialTimeout + gnetCfg.Port = uint16(cfg.port) + gnetCfg.Address = cfg.address + gnetCfg.ConnectCallback = d.onGnetConnect + gnetCfg.DisconnectCallback = d.onGnetDisconnect + gnetCfg.ConnectFailureCallback = d.onGnetConnectFailure + gnetCfg.MaxConnections = cfg.MaxConnections + gnetCfg.MaxOutgoingConnections = cfg.MaxOutgoingConnections + gnetCfg.MaxIncomingConnections = cfg.MaxIncomingConnections + gnetCfg.MaxDefaultPeerOutgoingConnections = cfg.MaxDefaultPeerOutgoingConnections + gnetCfg.DefaultConnections = cfg.DefaultConnections + gnetCfg.MaxIncomingMessageLength = cfg.MaxIncomingMessageLength + gnetCfg.MaxOutgoingMessageLength = cfg.MaxOutgoingMessageLength + + pool, err := gnet.NewConnectionPool(gnetCfg, d) + if err != nil { + return nil, err + } + + return &Pool{ + Config: cfg, + Pool: pool, + }, nil +} + +// Shutdown closes all connections and stops listening +func (pool *Pool) Shutdown() { + if pool == nil { + return + } + pool.Pool.Shutdown() +} + +// Run starts listening on the configured Port +func (pool *Pool) Run() error { + logger.Infof("daemon.Pool listening on port %d", pool.Config.port) + return pool.Pool.Run() +} + +// RunOffline runs the pool without a listener. This is necessary to process strand requests. +func (pool *Pool) RunOffline() error { + return pool.Pool.RunOffline() +} + +// sendPings send a ping if our last message sent was over pingRate ago +func (pool *Pool) sendPings() { + if err := pool.Pool.SendPings(pool.Config.PingRate, &PingMessage{}); err != nil { + logger.WithError(err).Error("sendPings failed") + } +} + +// getStaleConnections returns connections that have been idle for longer than idleLimit +func (pool *Pool) getStaleConnections() ([]string, error) { + return pool.Pool.GetStaleConnections(pool.Config.IdleLimit) +} + +// IsMaxOutgoingDefaultConnectionsReached returns whether max outgoing default connections reached +func (pool *Pool) IsMaxOutgoingDefaultConnectionsReached() bool { + return pool.Pool.IsMaxOutgoingDefaultConnectionsReached() +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/signed_block_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/signed_block_skyencoder.go new file mode 100644 index 0000000000..3cc4c5222b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/signed_block_skyencoder.go @@ -0,0 +1,528 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" +) + +// encodeSizeSignedBlock computes the size of an encoded object of type SignedBlock +func encodeSizeSignedBlock(obj *coin.SignedBlock) uint64 { + i0 := uint64(0) + + // obj.Block.Head.Version + i0 += 4 + + // obj.Block.Head.Time + i0 += 8 + + // obj.Block.Head.BkSeq + i0 += 8 + + // obj.Block.Head.Fee + i0 += 8 + + // obj.Block.Head.PrevHash + i0 += 32 + + // obj.Block.Head.BodyHash + i0 += 32 + + // obj.Block.Head.UxHash + i0 += 32 + + // obj.Block.Body.Transactions + i0 += 4 + for _, x1 := range obj.Block.Body.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + // obj.Sig + i0 += 65 + + return i0 +} + +// encodeSignedBlock encodes an object of type SignedBlock to a buffer allocated to the exact size +// required to encode the object. +func encodeSignedBlock(obj *coin.SignedBlock) ([]byte, error) { + n := encodeSizeSignedBlock(obj) + buf := make([]byte, n) + + if err := encodeSignedBlockToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeSignedBlockToBuffer encodes an object of type SignedBlock to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeSignedBlockToBuffer(buf []byte, obj *coin.SignedBlock) error { + if uint64(len(buf)) < encodeSizeSignedBlock(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Block.Head.Version + e.Uint32(obj.Block.Head.Version) + + // obj.Block.Head.Time + e.Uint64(obj.Block.Head.Time) + + // obj.Block.Head.BkSeq + e.Uint64(obj.Block.Head.BkSeq) + + // obj.Block.Head.Fee + e.Uint64(obj.Block.Head.Fee) + + // obj.Block.Head.PrevHash + e.CopyBytes(obj.Block.Head.PrevHash[:]) + + // obj.Block.Head.BodyHash + e.CopyBytes(obj.Block.Head.BodyHash[:]) + + // obj.Block.Head.UxHash + e.CopyBytes(obj.Block.Head.UxHash[:]) + + // obj.Block.Body.Transactions maxlen check + if len(obj.Block.Body.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Block.Body.Transactions length check + if uint64(len(obj.Block.Body.Transactions)) > math.MaxUint32 { + return errors.New("obj.Block.Body.Transactions length exceeds math.MaxUint32") + } + + // obj.Block.Body.Transactions length + e.Uint32(uint32(len(obj.Block.Body.Transactions))) + + // obj.Block.Body.Transactions + for _, x := range obj.Block.Body.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + // obj.Sig + e.CopyBytes(obj.Sig[:]) + + return nil +} + +// decodeSignedBlock decodes an object of type SignedBlock from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeSignedBlock(buf []byte, obj *coin.SignedBlock) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Block.Head.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Block.Head.Version = i + } + + { + // obj.Block.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Head.Time = i + } + + { + // obj.Block.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Head.BkSeq = i + } + + { + // obj.Block.Head.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Head.Fee = i + } + + { + // obj.Block.Head.PrevHash + if len(d.Buffer) < len(obj.Block.Head.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Head.PrevHash[:], d.Buffer[:len(obj.Block.Head.PrevHash)]) + d.Buffer = d.Buffer[len(obj.Block.Head.PrevHash):] + } + + { + // obj.Block.Head.BodyHash + if len(d.Buffer) < len(obj.Block.Head.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Head.BodyHash[:], d.Buffer[:len(obj.Block.Head.BodyHash)]) + d.Buffer = d.Buffer[len(obj.Block.Head.BodyHash):] + } + + { + // obj.Block.Head.UxHash + if len(d.Buffer) < len(obj.Block.Head.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Head.UxHash[:], d.Buffer[:len(obj.Block.Head.UxHash)]) + d.Buffer = d.Buffer[len(obj.Block.Head.UxHash):] + } + + { + // obj.Block.Body.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions = make([]coin.Transaction, length) + + for z3 := range obj.Block.Body.Transactions { + { + // obj.Block.Body.Transactions[z3].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Length = i + } + + { + // obj.Block.Body.Transactions[z3].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Type = i + } + + { + // obj.Block.Body.Transactions[z3].InnerHash + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].InnerHash[:], d.Buffer[:len(obj.Block.Body.Transactions[z3].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].InnerHash):] + } + + { + // obj.Block.Body.Transactions[z3].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions[z3].Sigs = make([]cipher.Sig, length) + + for z5 := range obj.Block.Body.Transactions[z3].Sigs { + { + // obj.Block.Body.Transactions[z3].Sigs[z5] + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].Sigs[z5]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].Sigs[z5][:], d.Buffer[:len(obj.Block.Body.Transactions[z3].Sigs[z5])]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].Sigs[z5]):] + } + + } + } + } + + { + // obj.Block.Body.Transactions[z3].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions[z3].In = make([]cipher.SHA256, length) + + for z5 := range obj.Block.Body.Transactions[z3].In { + { + // obj.Block.Body.Transactions[z3].In[z5] + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].In[z5]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].In[z5][:], d.Buffer[:len(obj.Block.Body.Transactions[z3].In[z5])]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].In[z5]):] + } + + } + } + } + + { + // obj.Block.Body.Transactions[z3].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions[z3].Out = make([]coin.TransactionOutput, length) + + for z5 := range obj.Block.Body.Transactions[z3].Out { + { + // obj.Block.Body.Transactions[z3].Out[z5].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Out[z5].Address.Version = i + } + + { + // obj.Block.Body.Transactions[z3].Out[z5].Address.Key + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].Out[z5].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].Out[z5].Address.Key[:], d.Buffer[:len(obj.Block.Body.Transactions[z3].Out[z5].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].Out[z5].Address.Key):] + } + + { + // obj.Block.Body.Transactions[z3].Out[z5].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Out[z5].Coins = i + } + + { + // obj.Block.Body.Transactions[z3].Out[z5].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Out[z5].Hours = i + } + + } + } + } + } + } + } + + { + // obj.Sig + if len(d.Buffer) < len(obj.Sig) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sig[:], d.Buffer[:len(obj.Sig)]) + d.Buffer = d.Buffer[len(obj.Sig):] + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeSignedBlockExact decodes an object of type SignedBlock from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeSignedBlockExact(buf []byte, obj *coin.SignedBlock) error { + if n, err := decodeSignedBlock(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/strand/strand.go b/vendor/github.com/skycoin/skycoin/src/daemon/strand/strand.go new file mode 100644 index 0000000000..629960f2b4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/strand/strand.go @@ -0,0 +1,135 @@ +/* +Package strand is a utility for linearizing method calls, similar to locking. + +The strand method is functionally similar to a lock, but operates on a queue +of method calls. +*/ +package strand + +import ( + "time" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/util/logging" +) + +const ( + // logDurationThreshold is how long to wait before reporting a function call's time + logDurationThreshold = time.Millisecond * 100 + // writeWait is how long to wait to write to a request channel before logging the delay + logQueueRequestWaitThreshold = time.Second * 1 +) + +var ( + // Debug enables debug logging + Debug = false +) + +// Request is sent to the channel provided to Strand +type Request struct { + Name string + Func func() error +} + +// Strand linearizes concurrent method calls through a single channel, +// to avoid concurrency issues when conflicting methods are called from +// multiple goroutines. +// Methods passed to Strand() will block until completed. +// Strand accepts a quit channel and will return quitErr if the quit +// channel closes. +func Strand(logger *logging.Logger, c chan Request, name string, f func() error, quit chan struct{}, quitErr error) error { + if Debug { + logger.WithField("operation", name).Debug("Strand precall") + } + + done := make(chan struct{}) + var err error + + req := Request{ + Name: name, + Func: func() error { + defer close(done) + + // TODO: record time statistics in a data structure and expose stats via an API + // logger.Debugf("%s begin", name) + + t := time.Now() + + // Log function duration at an exponential time interval, + // this will notify us of any long running functions to look at. + go func() { + threshold := logDurationThreshold + t := time.NewTimer(threshold) + defer t.Stop() + + for { + t0 := time.Now() + select { + case <-quit: + return + case <-done: + return + case <-t.C: + logger.WithFields(logrus.Fields{ + "operation": name, + "threshold": threshold, + }).Warning("Strand operation exceeded threshold") + threshold *= 10 + t.Reset(threshold) + } + t1 := time.Now() + logger.WithField("elapsed", t1.Sub(t0)).Info() + } + }() + + if Debug { + logger.WithField("operation", name).Debug("Stranding") + } + + err = f() + + // Notify us if the function call took too long + elapsed := time.Since(t) + if elapsed > logDurationThreshold { + logger.WithFields(logrus.Fields{ + "operation": name, + "elapsed": elapsed, + }).Warning() + } else if Debug { + logger.WithFields(logrus.Fields{ + "operation": name, + "elapsed": elapsed, + }).Debug() + } + + return err + }, + } + + // Log a message if waiting too long to write due to a full queue + t := time.Now() +loop: + for { + select { + case <-quit: + return quitErr + case c <- req: + break loop + case <-time.After(logQueueRequestWaitThreshold): + logger.Warningf("Waited %s while trying to write %s to the strand request channel", time.Since(t), req.Name) + } + } + + t = time.Now() + for { + select { + case <-quit: + return quitErr + case <-done: + return err + case <-time.After(logQueueRequestWaitThreshold): + logger.Warningf("Waited %s while waiting for %s to be done or quit", time.Since(t), req.Name) + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/transaction_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/daemon/transaction_skyencoder.go new file mode 100644 index 0000000000..53281f8a9a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/transaction_skyencoder.go @@ -0,0 +1,358 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" +) + +// encodeSizeTransaction computes the size of an encoded object of type Transaction +func encodeSizeTransaction(obj *coin.Transaction) uint64 { + i0 := uint64(0) + + // obj.Length + i0 += 4 + + // obj.Type + i0++ + + // obj.InnerHash + i0 += 32 + + // obj.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 65 + + i0 += uint64(len(obj.Sigs)) * i1 + } + + // obj.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.In)) * i1 + } + + // obj.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Out)) * i1 + } + + return i0 +} + +// encodeTransaction encodes an object of type Transaction to a buffer allocated to the exact size +// required to encode the object. +func encodeTransaction(obj *coin.Transaction) ([]byte, error) { + n := encodeSizeTransaction(obj) + buf := make([]byte, n) + + if err := encodeTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionToBuffer encodes an object of type Transaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionToBuffer(buf []byte, obj *coin.Transaction) error { + if uint64(len(buf)) < encodeSizeTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Length + e.Uint32(obj.Length) + + // obj.Type + e.Uint8(obj.Type) + + // obj.InnerHash + e.CopyBytes(obj.InnerHash[:]) + + // obj.Sigs maxlen check + if len(obj.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Sigs length check + if uint64(len(obj.Sigs)) > math.MaxUint32 { + return errors.New("obj.Sigs length exceeds math.MaxUint32") + } + + // obj.Sigs length + e.Uint32(uint32(len(obj.Sigs))) + + // obj.Sigs + for _, x := range obj.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.In maxlen check + if len(obj.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.In length check + if uint64(len(obj.In)) > math.MaxUint32 { + return errors.New("obj.In length exceeds math.MaxUint32") + } + + // obj.In length + e.Uint32(uint32(len(obj.In))) + + // obj.In + for _, x := range obj.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Out maxlen check + if len(obj.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Out length check + if uint64(len(obj.Out)) > math.MaxUint32 { + return errors.New("obj.Out length exceeds math.MaxUint32") + } + + // obj.Out length + e.Uint32(uint32(len(obj.Out))) + + // obj.Out + for _, x := range obj.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + return nil +} + +// decodeTransaction decodes an object of type Transaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransaction(buf []byte, obj *coin.Transaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Length = i + } + + { + // obj.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Type = i + } + + { + // obj.InnerHash + if len(d.Buffer) < len(obj.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.InnerHash[:], d.Buffer[:len(obj.InnerHash)]) + d.Buffer = d.Buffer[len(obj.InnerHash):] + } + + { + // obj.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Sigs = make([]cipher.Sig, length) + + for z1 := range obj.Sigs { + { + // obj.Sigs[z1] + if len(d.Buffer) < len(obj.Sigs[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sigs[z1][:], d.Buffer[:len(obj.Sigs[z1])]) + d.Buffer = d.Buffer[len(obj.Sigs[z1]):] + } + + } + } + } + + { + // obj.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.In = make([]cipher.SHA256, length) + + for z1 := range obj.In { + { + // obj.In[z1] + if len(d.Buffer) < len(obj.In[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.In[z1][:], d.Buffer[:len(obj.In[z1])]) + d.Buffer = d.Buffer[len(obj.In[z1]):] + } + + } + } + } + + { + // obj.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Out = make([]coin.TransactionOutput, length) + + for z1 := range obj.Out { + { + // obj.Out[z1].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out[z1].Address.Version = i + } + + { + // obj.Out[z1].Address.Key + if len(d.Buffer) < len(obj.Out[z1].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out[z1].Address.Key[:], d.Buffer[:len(obj.Out[z1].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out[z1].Address.Key):] + } + + { + // obj.Out[z1].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Coins = i + } + + { + // obj.Out[z1].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionExact decodes an object of type Transaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionExact(buf []byte, obj *coin.Transaction) error { + if n, err := decodeTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/fiber/config.go b/vendor/github.com/skycoin/skycoin/src/fiber/config.go new file mode 100644 index 0000000000..992ac96599 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/fiber/config.go @@ -0,0 +1,182 @@ +/* +Package fiber provides configuration definitions and utilities for managing fiber coins +*/ +package fiber + +import ( + "fmt" + "strings" + + "github.com/spf13/viper" + + "github.com/skycoin/skycoin/src/cipher/bip44" +) + +// Config records fiber coin parameters +type Config struct { + Node NodeConfig `mapstructure:"node"` + Params ParamsConfig `mapstructure:"params"` +} + +// NodeConfig configures the default CLI options for the skycoin node. +// These parameters are loaded via cmd/skycoin/skycoin.go into src/skycoin/skycoin.go. +type NodeConfig struct { + // Port is the default port that the wire protocol communicates over + Port int `mapstructure:"port"` + // WebInterfacePort is the default port that the web/gui interface serves on + WebInterfacePort int `mapstructure:"web_interface_port"` + // GenesisSignatureStr is a hex-encoded signature of the genesis block input + GenesisSignatureStr string `mapstructure:"genesis_signature_str"` + // GenesisAddressStr is the skycoin address that the genesis coins were sent to in the genesis block + GenesisAddressStr string `mapstructure:"genesis_address_str"` + // BlockchainPubkeyStr is a hex-encoded public key used to validate published blocks + BlockchainPubkeyStr string `mapstructure:"blockchain_pubkey_str"` + // BlockchainSeckey is a hex-encoded secret key required for block publishing. + // It must correspond to BlockchainPubkeyStr + BlockchainSeckeyStr string `mapstructure:"blockchain_seckey_str"` + // GenesisTimestamp is the timestamp of the genesis block + GenesisTimestamp uint64 `mapstructure:"genesis_timestamp"` + // GenesisCoinVolume is the total number of coins in the genesis block + GenesisCoinVolume uint64 `mapstructure:"genesis_coin_volume"` + // DefaultConnections are the default "trusted" connections a node will try to connect to for bootstrapping + DefaultConnections []string `mapstructure:"default_connections"` + // PeerlistURL is a URL pointing to a newline-separated list of ip:ports that are used for bootstrapping (but they are not "trusted") + PeerListURL string `mapstructure:"peer_list_url"` + + // UnconfirmedBurnFactor is the burn factor to apply when verifying unconfirmed transactions + UnconfirmedBurnFactor uint32 `mapstructure:"unconfirmed_burn_factor"` + // UnconfirmedMaxTransactionSize is the maximum size of an unconfirmed transaction + UnconfirmedMaxTransactionSize uint32 `mapstructure:"unconfirmed_max_transaction_size"` + // UnconfirmedMaxDropletPrecision is the maximum number of decimals allowed in an unconfirmed transaction + UnconfirmedMaxDropletPrecision uint8 `mapstructure:"unconfirmed_max_decimals"` + // CreateBlockBurnFactor is the burn factor to apply to transactions when publishing blocks + CreateBlockBurnFactor uint32 `mapstructure:"create_block_burn_factor"` + // CreateBlockMaxTransactionSize is the maximum size of an transaction when publishing blocks + CreateBlockMaxTransactionSize uint32 `mapstructure:"create_block_max_transaction_size"` + // CreateBlockMaxDropletPrecision is the maximum number of decimals allowed in a transaction when publishing blocks + CreateBlockMaxDropletPrecision uint8 `mapstructure:"create_block_max_decimals"` + // MaxBlockTransactionsSize is the maximum total size of transactions in a block when publishing a block + MaxBlockTransactionsSize uint32 `mapstructure:"max_block_transactions_size"` + + // DisplayName is the display name of the coin in the wallet e.g. Skycoin + DisplayName string `mapstructure:"display_name"` + // Ticker is the coin's price ticker, e.g. SKY + Ticker string `mapstructure:"ticker"` + // CoinHoursName is the name of the coinhour asset type, e.g. Coin Hours + CoinHoursName string `mapstructure:"coin_hours_display_name"` + // CoinHoursNameSingular is the singular form of the name of the coinhour asset type, e.g. Coin Hour + CoinHoursNameSingular string `mapstructure:"coin_hours_display_name_singular"` + // CoinHoursTicker is the name of the coinhour asset type's price ticker, e.g. SCH (Skycoin Coin Hours) + CoinHoursTicker string `mapstructure:"coin_hours_ticker"` + // QrURIPrefix is the prefix name of a QR url, e.g. skycoin:[address], the skycoin is the prefix. + QrURIPrefix string `mapstructure:"qr_uri_prefix"` + // ExplorerURL is the URL of the public explorer + ExplorerURL string `mapstructure:"explorer_url"` + // VersionURL is the URL for wallet to check the latest version number + VersionURL string `mapstructure:"version_url"` + // Bip44Coin is the default "coin" value of the bip44 path + Bip44Coin bip44.CoinType `mapstructure:"bip44_coin"` + + // These fields are set by cmd/newcoin and are not configured in the fiber.toml file + CoinName string + // Ascii Font rendering of CoinName + CoinAscii string + DataDirectory string +} + +// ParamsConfig are the parameters used to generate params/params.go. +// These parameters are exposed in an importable package `params` because they +// may need to be imported by libraries that would not know the node's configured CLI options. +type ParamsConfig struct { + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 `mapstructure:"max_coin_supply"` + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 `mapstructure:"initial_unlocked_count"` + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 `mapstructure:"unlock_address_rate"` + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds. + // Once the InitialUnlockedCount is exhausted, UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 `mapstructure:"unlock_time_interval"` + // UserMaxDropletPrecision represents the decimal precision of droplets + UserMaxDropletPrecision uint64 `mapstructure:"user_max_decimals"` + // UserMaxTransactionSize is max size of a user-created transaction (typically equal to the max size of a block) + UserMaxTransactionSize int `mapstructure:"user_max_transaction_size"` + // DistributionAddresses are addresses that received coins from the genesis address in the first block, + // used to calculate current and max supply and do distribution timelocking + DistributionAddresses []string `mapstructure:"distribution_addresses"` + // UserBurnFactor inverse fraction of coinhours that must be burned, this value is used when creating transactions + UserBurnFactor uint64 `mapstructure:"user_burn_factor"` +} + +// NewConfig loads blockchain config parameters from a config file +// default file is: fiber.toml in the project root +// JSON, toml or yaml file can be used (toml preferred). +func NewConfig(configName, appDir string) (Config, error) { + // set viper parameters + // check that file is of supported type + confNameSplit := strings.Split(configName, ".") + fileType := confNameSplit[len(confNameSplit)-1] + switch fileType { + case "toml", "json", "yaml", "yml": + viper.SetConfigType(confNameSplit[len(confNameSplit)-1]) + default: + return Config{}, fmt.Errorf("invalid blockchain config file type: %s", fileType) + } + + configName = configName[:len(configName)-(len(fileType)+1)] + viper.SetConfigName(configName) + + viper.AddConfigPath(appDir) + viper.AddConfigPath(".") + + // set defaults + setDefaults() + + params := Config{} + + if err := viper.ReadInConfig(); err != nil { + return params, err + } + + if err := viper.Unmarshal(¶ms); err != nil { + return params, err + } + + return params, nil +} + +func setDefaults() { + // node defaults + viper.SetDefault("node.genesis_coin_volume", 100e12) + viper.SetDefault("node.port", 6000) + viper.SetDefault("node.web_interface_port", 6420) + viper.SetDefault("node.unconfirmed_burn_factor", 10) + viper.SetDefault("node.unconfirmed_max_transaction_size", 32*1024) + viper.SetDefault("node.unconfirmed_max_decimals", 3) + viper.SetDefault("node.create_block_burn_factor", 10) + viper.SetDefault("node.create_block_max_transaction_size", 32*1024) + viper.SetDefault("node.create_block_max_decimals", 3) + viper.SetDefault("node.max_block_transactions_size", 32*1024) + viper.SetDefault("node.display_name", "Skycoin") + viper.SetDefault("node.ticker", "SKY") + viper.SetDefault("node.coin_hours_display_name", "Coin Hours") + viper.SetDefault("node.coin_hours_display_name_singular", "Coin Hour") + viper.SetDefault("node.coin_hours_ticker", "SCH") + viper.SetDefault("node.qr_uri_prefix", "skycoin") + viper.SetDefault("node.explorer_url", "https://explorer.skycoin.com") + viper.SetDefault("node.version_url", "https://version.skycoin.com/skycoin/version.txt") + viper.SetDefault("node.bip44_coin", bip44.CoinTypeSkycoin) + + // build defaults + viper.SetDefault("build.commit", "") + viper.SetDefault("build.branch", "") + + // params defaults + viper.SetDefault("params.max_coin_supply", 1e8) + viper.SetDefault("params.initial_unlocked_count", 25) + viper.SetDefault("params.unlock_address_rate", 5) + viper.SetDefault("params.unlock_time_interval", 60*60*24*365) + viper.SetDefault("params.user_max_decimals", 3) + viper.SetDefault("params.user_burn_factor", 10) + viper.SetDefault("params.user_max_transaction_size", 32*1024) +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/0.d5967d50848818a3b5b3.chunk.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/0.d5967d50848818a3b5b3.chunk.js new file mode 100644 index 0000000000..228c54dad7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/0.d5967d50848818a3b5b3.chunk.js @@ -0,0 +1 @@ +webpackJsonp([0],{dXVM:function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Loading...",new:"New",load:"Load"},errors:{error:"Error","fetch-version":"Unable to fetch latest release version from Github","incorrect-password":"Incorrect password","error-decrypting":"Error decrypting the wallet","api-disabled":"API disabled","no-wallet":"Wallet does not exist","no-outputs":"No unspent outputs","window-size":"The window is too narrow for the content"},title:{language:"Select Language",wallets:"Wallets",send:"Send",history:"History","buy-coin":"Buy Skycoin",network:"Networking",blockchain:"Blockchain",outputs:"Outputs",transactions:"Transactions","pending-txs":"Pending Transactions",backup:"Backup Wallet",explorer:"Skycoin Explorer",seed:"Wallet Seed",qrcode:"QR Code",reset:"Reset Password",exchange:"Exchange","select-address":"Select Address","order-history":"Order history"},header:{"syncing-blocks":"Syncing blocks",update1:"Wallet update",update2:"available.",synchronizing:"The wallet is synchronizing. Data you see may not be updated.","pending-txs1":"There are some","pending-txs2":"pending transactions.","pending-txs3":"Data you see may not be updated.",errors:{"no-connections":"No connections active, your client is not connected to any other nodes!","no-backend1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend2":"Telegram.","no-backend3":"",csrf:"Security vulnerability: CSRF is not working, please exit immediately."}},password:{title:"Enter Password",label:"Password","confirm-label":"Confirm password",button:"Proceed","reset-link":"I forgot my password"},buy:{"deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address",generate:"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.",send:"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!",receive:"Receive Sky","receive-desc":"After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},wizard:{"wallet-desc":'If you don\'t have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to "Load Wallet" and enter your seed.',"encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a hardware wallet?","finish-button":"Finish","back-button":"Back",confirm:{title:"Safeguard your seed!",desc:"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!",checkbox:"It\u2019s safe, I swear.",button:"Continue"}},wallet:{"new-address":"New Address","new-addresses":"New Addresses","show-empty":"Show Empty","hide-empty":"Hide Empty",encrypt:"Encrypt Wallet",decrypt:"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.",delete:"Delete Wallet",edit:"Edit Wallet",add:"Add Wallet",load:"Load Wallet","encryption-enabled":"Encryption enabled","encryption-disabled":"Encryption disabled","hw-security-warning":'Possible security risk. Access the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected for more information.',wallet:"Wallet","hardware-wallet":"Hardware Wallet","delete-confirmation":'WARNING: The wallet "{{ name }}" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list). Do you want to continue?',"delete-confirmation-check":"Yeah, I want to delete the wallet.","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the hardware wallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?",new:{"create-title":"Create Wallet","load-title":"Load Wallet","encrypt-title":"Encrypt Wallet","name-label":"Name","seed-label":"Seed","confirm-seed-label":"Confirm seed","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","create-button":"Create","load-button":"Load","cancel-button":"Cancel","12-words":"12 words","24-words":"24 words","generate-12-seed":"Generate 12 word seed","generate-24-seed":"Generate 24 word seed",encrypt:"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","unconventional-seed-title":"Possible error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed."},rename:{title:"Rename Wallet","name-label":"Name","cancel-button":"Cancel","rename-button":"Rename"},"add-addresses":{title:"Select quantity","name-quantity":"How many addresses to create","cancel-button":"Cancel","create-button":"Create"},address:{show:"Press to show",copy:"Copy","copy-address":"Copy address",copied:"Copied!",confirm:"Confirm address",outputs:"Unspent outputs",history:"History"}},send:{"synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","notes-label":"Notes","wallet-label":"Wallet","addresses-label":"Addresses","invalid-amount":"Please enter a valid amount","addresses-help":"Limit the addresses from where the coins and hours could be sent","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown","all-outputs":"All the outputs of the selected addresses","available-msg-part1":"With your current selection you can send up to","available-msg-part2":"and","available-msg-part3":"(at least","available-msg-part4":"must be used for the transaction fee).","change-address-label":"Custom change address","change-address-select":"Select","change-address-help":'Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the "Select" link to choose an address from one of your wallets',"destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins","destinations-help2":"Destination addresses, their coins and coin hours","hours-allocation-label":"Automatic coin hours allocation","options-label":"Options","value-label":"Coin hours share factor","value-help":"The higher the value, the more coin hours will be sent to outputs","preview-button":"Preview","send-button":"Send","back-button":"Back",simple:"Simple",advanced:"Advanced","select-wallet":"Select Wallet"},reset:{"wallet-label":"Wallet","seed-label":"Wallet seed","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","reset-button":"Reset"},tx:{transaction:"Transaction","confirm-transaction":"Confirm Transaction",from:"From",to:"To",date:"Date",status:"Status",coins:"Coins",hours:"Hours",id:"Tx ID","show-more":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned",inputs:"Inputs",outputs:"Outputs",confirmed:"Confirmed",pending:"Pending","current-rate":"Calculated at the current rate"},backup:{"wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.",desc:"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","close-button":"Close",wallet:"Wallet Label",filename:"Filename",seed:"Seed","show-seed":"Show seed","no-wallets":"No encrypted wallets"},blockchain:{blocks:"Number of blocks",time:"Timestamp of last block",hash:"Hash of last block","current-supply":"Current SKY supply","total-supply":"Total SKY supply","current-coinhour-supply":"Current Coin Hours supply","total-coinhour-supply":"Total Coin Hours supply"},network:{peer:"Peer",source:"Source","block-height":"Block height","block-height-short":"Block","last-seen":"Last seen","last-received":"Last received","last-sent":"Last sent",in:"Incoming",out:"Outgoing",sources:{default:"Default peer",exchange:"Peer exchange"}},"pending-txs":{timestamp:"Timestamp",txid:"Transaction ID",none:"No pending transactions",my:"Mine",all:"All"},history:{"tx-detail":"Transaction Detail",moving:"Internally moving",moved:"Internally moved",sending:"Sending",sent:"Sent",received:"Received",receiving:"Receiving",pending:"Pending","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)",filter:"Active filter: ",filters:"Active filters: ","all-addresses":"All addresses"},teller:{done:"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin",unknown:"Unknown"},confirmation:{"header-text":"Confirmation","confirm-button":"Yes","cancel-button":"No",close:"Close"},service:{api:{"server-error":"Server error"},wallet:{"not-enough-hours":"Not enough available Coin Hours to perform the transaction!"}},"hardware-wallet":{general:{"default-wallet-name":"New hardware wallet","error-disconnected":"Unable to perform the operation. The hardware wallet is not connected.","simple-error":"Error, Unable to perform the operation.","generic-error":"Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.","generic-error-internet":"Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.","error-incorrect-wallet":"Unable to perform the operation. The connected hardware wallet is different from the expected one.","error-incorrect-pin":"Unable to perform the operation. The PIN you have entered is not correct.",confirm:"Please, confirm the operation in the hardware wallet.","confirm-and-more":"Please, confirm the operation in the hardware wallet and follow the instructions.",close:"Close",cancel:"Cancel",continue:"Continue",completed:"Operation completed successfully.",refused:"The operation failed or was canceled."},errors:{"too-many-inputs":"The transaction has too many inputs and can not be processed. Please contact technical support.","too-many-outputs":"The transaction has too many outputs and can not be processed. Please contact technical support."},"security-warning":{title:"Security warning",text:'The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected and solve the security problems before continuing.',check:"I understand the risks and want to continue",continue:"Continue",cancel:"Cancel"},options:{connecting:"Connecting...",disconnected:"No hardware wallet detected. Please connect a hardware wallet to use this option.","unconfigured-detected-title":"Unconfigured hardware wallet","unconfigured-detected":'A seedless hardware wallet has been detected. Select "Configure automatically" if you want to configure it as a brand new wallet and start using it immediately, or select "Restore backup" if you want to configure it with a previously created seed backup and thus be able to access your funds again.',"configured-detected":"Hardware wallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security warnings","security-warning-title":"Security warning","backup-warning":'You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the "Create a backup" option.',"pin-warning":'The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the "Create PIN code" option.',options:"Options:","configure-automatically":"Configure automatically","restore-backup":"Restore backup","create-backup":"Create a backup",wipe:"Wipe the device","confirm-seed":"Confirm seed","create-pin":"Create PIN code","change-pin":"Change PIN code","forgotten-pin1":"If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking","forgotten-pin2":"here."},"generate-seed":{text:"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.",configuring:"Configuring..."},"restore-seed":{text:"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.",warning:"WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.","error-wrong-word":"Error: The retyped word does not match the one requested by the hardware wallet.","error-invalid-seed":"Error: The seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: The seed is valid but does not match the one in the device."},added:{title:"New Hardware Wallet",configuring:"New hardware wallet detected. Configuring...",done:"Done",added1:"The connected hardware wallet has been added to the wallets list with the following name:",added2:"Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish."},wipe:{warning:"WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete":"Also remove from the wallets list"},"create-backup":{warning:'WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the "seed") will be able access the wallet balance, so extreme caution is advised.',instructions:"Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly."},"seed-word":{title:"Enter word",info1:"Enter the word indicated in the device",info2:"You will be asked to enter the words of your backup seed in random order, plus a few additional words.",word:"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. Two PINs you have entered do not match."},"enter-pin":{title:"Enter PIN","title-change-current":"Enter the current PIN","title-change-new":"Enter the new PIN","title-change-confirm":"Confirm the new PIN",instructions:"The PIN layout is displayed on the hardware wallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction.","instructions-change":"Please enter a hard-to-guess PIN of between 4 and 8 numbers.",help:"Need help?"},"pin-help":{title:"Help",part1:"When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.",part2:'To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is "23" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.',part3:'If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is "23", you can not simply type "23" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet.'},"create-tx":{title:"Create transaction"},"confirm-address":{title:"Confirm address",instructions:"Please confirm on the hardware wallet if the address is:","short-confirmation":"Address confirmed.",confirmation:'Address confirmed. For security, you can re-show the address in the hardware wallet using the "Confirm address" option, in the menu that you can display by pressing the button at the right of the address balance.'}},"time-from-now":{"few-seconds":"a few seconds ago",minute:"one minute ago",minutes:"{{time}} minutes ago",hour:"one hour ago",hours:"{{time}} hours ago",day:"one day ago",days:"{{time}} days ago"},exchange:{"you-send":"You send","you-get":"You get (approx.)","to-address":"To {{coin}} address",price:"Exchange rate","time-15":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-1":"I agree with","agree-2":"Terms of Use","agree-3":"and","agree-4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal",history:"Order history","order-not-found":"Order not found",status:"Status",exchanging:"Exchanging {{from}} for {{to}}",select:"Select",offline:"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later.","invalid-address":"Invalid address.",statuses:{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.",complete:"Exchange completed!","complete-info":"The funds have been successfully sent to your address.",error:"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{address:"Address",date:"Date"},details:{"exchange-addr":"Exchange address","exchange-addr-tag":"Payment ID or Destination Tag which must be used for the transaction","tx-id":"Transaction ID","order-id":"Order ID","initial-price":"Initial exchange rate","error-msg":"Error message",details:"Details","start-date":"Start date",back:"Back","back-alert":'The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the "Order history" button'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.7e4369252841c80f4cac.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.7e4369252841c80f4cac.js new file mode 100644 index 0000000000..38ab05f3cf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.7e4369252841c80f4cac.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{amrp:function(e){e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Loading...","done-title":"Done","warning-title":"Warning","error-title":"Error","changes-made":"The changes have been made.","back-button":"Back","create-button":"Create","load-button":"Load","cancel-button":"Cancel","continue-button":"Continue","close-button":"Close","generic-confirmation-check":"I understand the risks and want to continue","copied":"The text has been copied to the clipboard."},"errors":{"window-size":"The window is too narrow for the content."},"language":{"title":"Select Language"},"header":{"syncing-blocks":"Syncing blocks","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"Wallet update","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"available.","synchronizing":"The wallet is synchronizing. Data you see may not be updated.","pending-txs-part1":"There are some","pending-txs-part2":"pending transactions.","pending-txs-part3":"Data you see may not be updated.","no-connections":"No connections active, your client is not connected to any other nodes!","no-backend-part1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Security vulnerability: CSRF is not working, please exit immediately."}},"password":{"title":"Enter Password","password-label":"Password","password-error-info":"You must enter a password.","confirm-password-label":"Confirm password","confirm-error-info":"The two passwords must match.","proceed-button":"Proceed","reset-link":"I forgot my password","incorrect-password-error":"Incorrect password.","decrypting-error":"Error decrypting the wallet."},"buy":{"title-and-button":"Buy","deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address","generate":"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you\'d like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.","send":"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!","receive":"Receive Sky","receive-desc":"After receiving your Bitcoin, we\'ll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},"wizard":{"create-title":"Create Wallet","create-desc":"If you don\'t have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \\"Load\\" and enter your seed.","encrypt-title":"Encrypt Wallet","encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a Skywallet?","new-button":"New","load-button":"Load","finish-button":"Finish","confirm":{"title":"Safeguard Your Seed!","desc":"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!","checkbox":"It\u2019s safe, I swear."}},"wallet":{"title-and-button":"Wallets","show-empty-button":"Show Empty","hide-empty-button":"Hide Empty","encrypt-button":"Encrypt Wallet","decrypt-button":"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.","delete-button":"Delete Wallet","edit-button":"Rename","add-button":"Add Wallet","load-button":"Load Wallet","hardware-wallet-button":"Skywallet","encryption-enabled":"Encryption enabled.","encryption-disabled":"Encryption disabled.","warning-hw-security":"Possible security risk. Access the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list) while the device is connected for more information.","wallet-table-label":"Wallet","hardware-wallet-table-label":"Skywallet","delete-confirmation":"WARNING: The wallet \\"{{ name }}\\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list). Do you want to continue?","delete-confirmation-check":"Yeah, I want to delete the wallet","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?","new":{"create-title":"Create Wallet","load-title":"Load Wallet","name-label":"Name","name-error-info":"You must enter a name.","words-number-label":"How many words the seed has","seed-label":"Seed","seed-error-info":"You must enter a seed.","confirm-seed-label":"Confirm seed","confirm-seed-error-info":"The two seeds must match.","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","12-words":"12 words","24-words":"24 words","generate-12-help":"Generate a 12 word seed.","generate-24-help":"Generate a 24 word seed.","encrypt-check":"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","seed-checking-error":"It was not possible to verify the validity of the seed.","unconventional-seed-title":"Possible Error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed","synchronizing-warning-text":"The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \\"Scan Addresses\\" function or add them again manually.","wallet-created":"The wallet has been added to the list.","seed":{"enter-seed":"Press here to enter the seed","change-seed":"Press to change","confirm-seed":"Press here to confirm the seed","confirmed-seed":"Seed confirmed","use-custom":"Enter the seed manually","use-normal":"Enter the seed using the recommended method","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","incorrect-word-error":"The word you have entered does not match the requested one.","invalid-seed-error":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","word-error-info":"You must enter a word.","new-seed-info":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-info":"Please be sure to enter the correct words in the correct order."}},"rename":{"title":"Rename Wallet","name-label":"Name","label-error-info":"You must enter a name.","rename-button":"Rename"},"address-options":{"title":"Addresses","new":"New Addresses","scan":"Scan Addresses","scan-help":"Use this option to make the system find already used addresses from this wallet which are missing from the list."},"scan-addresses":{"done-with-new-addresses":"The list has been updated.","done-without-new-addresses":"No new addresses were found."},"add-addresses":{"title":"Select Quantity","quantity-label":"How many addresses to create","quantity-error-info":"You must enter a value between 1 and 100.","error":"There was an unexpected error. Please try again."},"address":{"show":"Press to show","copy":"Copy","copy-address":"Copy address","copied":"Copied!","confirm":"Confirm address","outputs":"Unspent outputs","history":"History"}},"qr":{"title":"QR Code","data-label":"QR data","address-label":"Address","request-link":"Request specific amount","amount-label":"Requested amount","hours-label":"Requested hours","message-label":"Message","invalid":"(invalid value)"},"send":{"title-and-button":"Send","unsigned-button":"Unsigned","signed-button":"Signed","unsigned-confirmation":"The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?","synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.","wallet-label":"Wallet","wallet-error-info":"You must select a wallet.","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins-link":"send all","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","addresses-label":"Addresses","addresses-error-info":"You must enter at least one valid address.","no-wallet-selected-error":"There are no coins to send.","no-coins-left-error":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent.","addresses-manual-help":"List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.","outputs-error":"There was an error trying to get the outputs. Please make sure you have entered valid addresses.","all-outputs":"All the outputs of the selected addresses","enter-addresses-for-outputs":"Valid addresses must be entered first","enter-wallet-for-outputs-and-addresses":"A valid wallet must be selected first","invalid-addresses-for-outputs":"No outputs available","available-funds-msg-part1":"With your current selection you can send up to","available-funds-msg-part2":"and","available-funds-msg-part3":"(at least","available-funds-msg-part4":"must be used as transaction fee for sending all the coins or hours).","change-address-label":"Custom change address","change-address-error-info":"The change address is not valid.","change-address-select-from-list-link":"Select","change-address-help":"Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the \\"Select\\" link to choose an address from one of your wallets.","specific-hours":"Hours to send:","remove-specific-hours-info":"Remove.","remove-specific-hours-confirmation":"Are you sure you want to remove the specific amount of hours to send?","destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins.","destinations-help2":"Destination addresses, their coins and hours.","destination-tools-title":"Destination Tools","hours-allocation-check":"Use automatic {{ coinHoursName }} allocation","options-link":"Options","coin-hours-options-link":"Hours options","hours-share-factor-label":"{{ coinHoursName }} share factor","hours-share-factor-help":"This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.","close-hours-share-factor-alert":"The option will be resetted to the default value. Are you sure you want to continue?","preview-button":"Preview","send-button":"Send","show-button":"Show","simple-form-button":"Simple","advanced-form-button":"Advanced","select-wallet":"Select wallet","saving-note-error":"The transaction was successfully sent, but it was not possible to save the note.","sent":"Transaction successfully sent.","total-to-send":"Total:","invalid-address-error":"The destination address is not valid.","one-invalid-address-error":"One of the destination addresses is not valid.","various-invalid-addresses-error":"Some destination addresses are not valid.","all-addresses-invalid-error":"The destination addresses are not valid.","invalid-addresses-error":"Please make sure the address is valid.","address-error-info":"Please enter a valid address.","invalid-value-error-info":"Invalid value.","insufficient-funds-error-info":"The entered value is greater than the available balance.","sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","advanced-sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","sending-all-hours-waning":"You selected to send all the hours. Are you sure you want to continue?","high-hours-share-waning":"Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?","advanced-high-hours-share-waning":"Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?","fill-with-link":{"title":"Use a Transaction Link","link-info":"Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.","link-label":"Transaction link","link-error-info":"You must enter a valid transaction link.","process-button":"Process","invalid-link-error":"The contents of the transaction link are not valid.","invalid-link-hours-error":"The transaction link contains an invalid amount of hours.","data-overwritten-alert":"Some data you have entered will be overwritten. Are you sure you want to continue?","confirmation":"The form has been updated with the data obtained from the transaction link."},"known-node-errors":{"null-change-address-error":"The null address can\'t be used as the custom change address. Please enter a valid address.","to-required-error":"You must provide a destination address for sending coins. Please enter a valid address.","zero-coins-error":"It\'s not possible to send zero coins. Please enter a valid amount.","null-destination-error":"The null address can\'t be used as destination. Please enter a valid address.","duplicate-destination-error":"There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.","hours-in-automatic-mode-error":"Specific hour amounts can\'t be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-needed-error":"The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.","invalid-hours-allocation-mode-error":"Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-not-needed-error":"The hour allocation mode can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-hours-mode-error":"Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.","share-factor-needed-error":"The hours share factor is needed. Please try with different values and contact support if the problem is not solved.","share-factor-not-needed-error":"The hours share factor can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-share-factor-error":"Invalid share factor. Please try with different values and contact support if the problem is not solved.","change-equal-to-destination-error":"The transaction can\'t be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.","repeated-wallet":"A wallet for the specified seed already exists."},"bulk-send":{"title":"Bulk Send","indications":"To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \\"xyz\\" address, type \\"xyz,10,5\\"; if you want the hours to be calculated automatically, type \\"xyz,10\\". Decimal values must be separated with a dot.","data-error-info":"You must enter a value.","process-button":"Process","no-data-error":"There is no text to process.","inconsistent-data-error":"If you set how many hours you want to send to a destination, you must do so for all destinations.","invalid-data-error":"The entered text has an invalid format."}},"select-address":{"title":"Select Address","no-addresses":"There are no confirmed addresses on this wallet."},"offline-transactions":{"loading-problem":"Error trying to get the necessary data","wallet-error-info":"You must select a wallet.","tx-error-info":"You must enter a valid transaction text.","copy-tx":{"signed-title":"Signed Transaction","unsigned-title":"Unsigned Transaction","text-unsigned":"This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \\"Sign Transaction\\" option.","text-signed":"This is the signed transaction. You can send it to the network using the \\"Broadcast Transaction\\" option.","input-label":"Transaction text","copy-button":"Copy","reset-confirmation":"Do you want the the form to be cleaned, so you can create another transaction?","reset-done":"The form has been cleaned."},"sign-tx":{"title":"Sign Transaction","text":"Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.","wallet-label":"Wallet","select-wallet":"Select wallet","input-label":"Transaction text","sign-button":"Sign","signed":"The transaction has been signed."},"broadcast-tx":{"title":"Broadcast Transaction","text":"Use this form to send a signed transaction to the network.","input-label":"Transaction text","send-button":"Send","sent":"The transaction has been sent."}},"reset":{"title":"Reset Password","wallet-label":"Wallet","seed-label":"Wallet seed","seed-error-info":"You must enter a seed.","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","confirm-error-info":"The two passwords must match.","reset-button":"Reset","done":"Password successfully changed."},"tx":{"transaction-title":"Transaction","confirm-transaction-title":"Confirm Transaction","from-small-label":"From:","to-small-label":"To:","date-small-label":"Date:","status-small-label":"Status:","coins-small-label":"Coins:","hours-small-label":"Hours:","id-small-label":"Tx ID:","note-small-label":"Note:","without-note":"Without note","show-more-link":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned","inputs-title":"Inputs","outputs-title":"Outputs","confirmed-transaction":"Confirmed","pending-transaction":"Pending","current-rate-help":"Calculated at the current rate."},"edit-note":{"title":"Edit Note","change-button":"Change"},"backup":{"title":"Backup Wallet","wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.","desc":"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","wallet-table-label":"Wallet name","filename-table-label":"Filename","save-addresses-button":"Save Addresses","show-seed-button":"Show Seed","no-wallets":"There are no wallets","unencrypted-info":"For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.","hw-wallet-info":"For getting the seed of a Skywallet, please use the \\"Skywallet\\" option at the bottom of the wallets page.","not-compatible-error":"Your web browser is not compatible with this function.","seed-modal-window":{"title":"Wallet Seed","seed-label":"Seed"}},"blockchain":{"title":"Blockchain","blocks-label":"Number of blocks","time-label":"Timestamp of last block","hash-label":"Hash of last block","current-supply-label":"Current {{ coinName }} supply","total-supply-label":"Total {{ coinName }} supply","current-coinhour-supply-label":"Current {{ coinHoursName }} supply","total-coinhour-supply-label":"Total {{ coinHoursName }} supply"},"network":{"title":"Networking","peer-small-table-label":"Peer","source-small-table-label":"Source","block-height-small-table-label":"Block height","block-height-short-small-table-label":"Block","last-seen-small-table-label":"Last seen","last-received-help":"Last received.","last-sent-help":"Last sent.","in-help":"Incoming.","out-help":"Outgoing.","sources":{"default":"Default peer","exchange":"Peer exchange"}},"pending-txs":{"title":"Pending Transactions","timestamp-table-label":"Timestamp","txid-table-label":"Transaction ID","none":"No pending transactions","my-transactions-button":"Mine","all-transactions-button":"All"},"outputs":{"title":"Outputs","error-no-outputs":"No unspent outputs"},"history":{"title-and-button":"History","tx-detail-title":"Transaction Detail","moving":"Internally moving {{ coinName }}","moved":"Internally moved {{ coinName }}","sending":"Sending {{ coinName }}","sent":"Sent {{ coinName }}","received":"Received {{ coinName }}","receiving":"Receiving {{ coinName }}","pending-indication":"Pending","transaction-note-small-label":"Note:","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)","filter":"Active filter: ","filters":"Active filters: ","all-addresses":"All addresses","view-all":"View all {{ number }} transactions"},"teller":{"done":"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin","unknown":"Unknown"},"confirmation":{"default-title":"Confirmation","yes-button":"Yes","no-button":"No"},"service":{"api":{"no-internet-error":"You do not have a internet connection or the node has stopped working.","incorrect-password-error":"Incorrect password.","unknown-error":"It was not possible to perform the operation.","api-disabled-error":"API disabled."}},"hardware-wallet":{"general":{"default-wallet-name":"New Skywallet","confirm":"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.","follow":"Please follow the instructions displayed on the Skywallet.","completed":"Operation completed successfully.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},"errors":{"generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","disconnected":"Unable to perform the operation. The Skywallet is not connected.","incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.","refused":"The operation failed or was canceled.","too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ","timeout":"The operation was canceled due to inactivity. Please try again.","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{"title":"Security Warning","text":"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.","link":"Open the Skywallet options window."},"options":{"connecting":"Connecting...","disconnected":"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":"A seedless Skywallet has been detected. Select \\"Configure Automatically\\" if you want to configure it as a brand new wallet and start using it. Select \\"Restore Backup\\" if you want to configure the Skywallet with a previously created seed backup.","configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security Warnings","security-warning-title":"Security Warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":"The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \\"Update Firmware\\" option.","backup-warning":"You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \\"Create a Backup\\" option.","pin-warning":"The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \\"Create PIN Code\\" option.","options":"Options:","update-firmware":"Update Firmware","configure-automatically":"Configure Automatically","restore-backup":"Restore Backup","create-backup":"Create a Backup","wipe":"Wipe the Device","confirm-seed":"Confirm Seed","create-pin":"Create PIN Code","change-pin":"Change PIN Code","delete-pin":"Delete PIN Code","forgotten-pin-part1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin-part2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{"title":"Outdated Firmware","text":"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.","update":"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.","follow":"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.","timeout":"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.","finished":"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{"text":"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.","configuring":"Configuring..."},"restore-seed":{"text":"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.","warning":"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: the retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: the seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: the seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},"added":{"title":"New Skywallet","configuring":"New Skywallet detected. Configuring...","done":"Done","added1":"The connected Skywallet has been added to the wallets list with the following name:","added2":"Now you can check the balance and the addresses of the Skywallet even when it is not connected.","added-error-info":"You must enter a name.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device."},"wipe":{"warning":"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete-check":"Also remove from the wallets list"},"create-backup":{"warning":"WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \\"seed\\") will be able access the wallet funds, so extreme caution is advised.","instructions":"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{"title":"Enter Word","enter-word":"Enter the word shown on the device","info":"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.","word-label":"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{"warning":"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties."},"enter-pin":{"title":"Enter PIN","title-change-current":"Enter the Current PIN","title-change-new":"Enter the New PIN","title-change-confirm":"Confirm the New PIN","instructions-generic":"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.","help":"Need help?"},"pin-help":{"title":"Help","part1":"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.","part2":"To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \\"23\\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.","part3":"If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \\"23\\", you can not simply type \\"23\\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \\"7\\" and \\"5\\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet."},"create-tx":{"title":"Create Transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","separator-for-coins-and-hours":"and","separator-to-destination":"to"},"confirm-address":{"title":"Confirm Address","instructions":"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.","confirmation":"Address confirmed. For security, you can re-show the address in the Skywallet using the \\"Confirm address\\" option, in the menu that you can display by pressing the button at the right of the address balance."}},"time-from-now":{"few-seconds":"a few seconds ago","minute":"one minute ago","minutes":"{{time}} minutes ago","hour":"one hour ago","hours":"{{time}} hours ago","day":"one day ago","days":"{{time}} days ago"},"exchange":{"title-and-button":"Buy {{ coinName }}","label-you-send":"You send","label-you-get":"You get (approx.)","label-to-address":"To {{coin}} address","label-price":"Exchange rate","label-stimate-transaction-time":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-part1":"I agree with the","agree-part2":"Terms of Use","agree-part3":"and the","agree-part4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal","history":"Order history","order-not-found":"Order not found","label-status":"Status","exchanging":"Exchanging {{from}} for {{to}}","destination-select-from-list-link":"Select","unavailable":"The exchange service is not available in the portable version","offline":"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later","invalid-address-error":"Invalid address.","from-coin-error-info":"You must select a coin.","invalid-value-error-info":"Invalid value.","address-error-info":"Please enter a valid address.","statuses":{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.","complete":"Exchange completed!","complete-info":"The funds have been successfully sent to your address.","error":"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{"title":"Order History","address":"Address:","date":"Date:"},"details":{"exchange-addr-label":"Exchange address (valid for this exchange operation only)","exchange-addr-tag-label":"Payment ID or Destination Tag which must be used for the transaction","tx-id-label":"Transaction ID","order-id-label":"Order ID","initial-price-label":"Initial exchange rate","error-msg-label":"Error message","details-link":"Details","start-date-label":"Start date","back-alert":"The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \\"Order history\\" button"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.bf6ae8acc706c3217da3.chunk.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.bf6ae8acc706c3217da3.chunk.js new file mode 100644 index 0000000000..8d077f5c64 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.bf6ae8acc706c3217da3.chunk.js @@ -0,0 +1 @@ +webpackJsonp([1],{ODm5:function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"\u5e01\u65f6",usd:"\u7f8e\u5143",loading:"\u52a0\u8f7d\u4e2d...",new:"\u65b0",load:"\u52a0\u8f7d"},errors:{error:"\u9519\u8bef","fetch-version":"\u65e0\u6cd5\u4eceGithub\u83b7\u53d6\u6700\u65b0\u7248\u672c","incorrect-password":"\u5bc6\u7801\u9519\u8bef","error-decrypting":"\u89e3\u5bc6\u94b1\u5305\u65f6\u51fa\u9519","api-disabled":"API\u7981\u7528","no-wallet":"\u65e0\u53ef\u652f\u4ed8\u94b1\u5305","no-outputs":"\u65e0\u672a\u4ea4\u6613\u8f93\u51fa","window-size":"\u7a97\u53e3\u592a\u7a84\uff0c\u5185\u5bb9\u653e\u4e0d\u4e0b"},title:{language:"\u9009\u62e9\u8bed\u8a00",wallets:"\u94b1\u5305",send:"\u53d1\u9001",history:"\u5386\u53f2","buy-coin":"\u4e70 Skycoin",network:"\u7f51\u7edc",blockchain:"\u533a\u5757\u94fe",outputs:"\u672a\u4ea4\u6613\u8f93\u51fa",transactions:"\u4ea4\u6613","pending-txs":"\u5f85\u5904\u7406\u4ea4\u6613",backup:"\u5907\u4efd\u94b1\u5305",explorer:"Skycoin Explorer",seed:"\u94b1\u5305\u79cd\u5b50",qrcode:"QR\u4ee3\u7801",reset:"\u91cd\u7f6e\u5bc6\u7801",exchange:"\u4ea4\u6613","select-address":"\u9009\u62e9\u5730\u5740","order-history":"\u8ba2\u5355\u5386\u53f2"},header:{"syncing-blocks":"\u533a\u5757\u540c\u6b65\u4e2d",update1:"\u94b1\u5305\u66f4\u65b0",update2:"\u53ef\u83b7\u53d6",synchronizing:"\u94b1\u5305\u6b63\u5728\u540c\u6b65\u3002\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002","pending-txs1":"\u8fd9\u91cc\u6709\u4e00\u4e9b","pending-txs2":"\u5f85\u5904\u7406\u4ea4\u6613.","pending-txs3":"\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002",errors:{"no-connections":"\u6ca1\u6709\u8fde\u63a5\uff0c\u4f60\u7684\u5ba2\u6237\u7aef\u6ca1\u6709\u8fde\u63a5\u5230\u4efb\u4f55\u5176\u4ed6\u8282\u70b9","no-backend1":"\u4e0d\u80fd\u5230\u8fbe\u540e\u7aef\u3002\u8bf7\u91cd\u65b0\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\u6216\u5bfb\u6c42\u6211\u4eec\u7684\u5e2e\u52a9","no-backend2":"Telegram","no-backend3":"",csrf:"\u5b89\u5168\u6f0f\u6d1e: CSRF\u672a\u5de5\u4f5c\uff0c\u8bf7\u7acb\u5373\u9000\u51fa\u3002"}},password:{title:"\u8f93\u5165\u5bc6\u7801",label:"\u5bc6\u7801","confirm-label":"\u786e\u8ba4\u5bc6\u7801",button:"\u7ee7\u7eed","reset-link":"\u6211\u5fd8\u8bb0\u4e86\u5bc6\u7801"},buy:{"deposit-address":"\u9009\u62e9\u4e00\u4e2a\u5730\u5740\u6765\u751f\u6210BTC\u5145\u503c\u94fe\u63a5\uff0c\u7528\u4e8e:","select-address":"\u9009\u62e9\u5730\u5740",generate:"\u751f\u6210","deposit-location":"\u5145\u503c\u4f4d\u7f6e","deposit-location-desc":"\u9009\u62e9\u4e00\u4e2a\u94b1\u5305\uff0c\u4ee5\u5728\u6211\u4eec\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\u5145\u503cSkycoin\u5230\u8be5\u94b1\u5305","make-choice":"\u505a\u9009\u62e9","wallets-desc":"\u6bcf\u5f53\u9009\u62e9\u4e00\u4e2a\u65b0\u7684\u94b1\u5305\u548c\u5730\u5740\uff0c\u4e00\u4e2a\u65b0\u7684BTC\u5730\u5740\u5c06\u4f1a\u751f\u6210\u3002\u4e00\u4e2a\u72ec\u7acb\u7684Skycoin\u5730\u5740\u6700\u591a\u53ef\u7ed1\u5b9a5\u4e2aBTC\u5730\u5740\u3002",send:"\u53d1\u9001Bitcoin","send-desc":"\u53d1\u9001Bitcoin\u81f3\u5982\u4e0b\u5730\u5740\u3002\u4e00\u65e6\u6536\u5230\uff0c\u6211\u4eec\u5c06\u4f1a\u6309\u5f53\u524d\u6c47\u7387: {{ rate }} SKY/BTC\u5145\u503cSkycoin\u5230\u9009\u4e2d\u94b1\u5305\u7684\u4e00\u4e2a\u65b0\u5730\u5740\u3002","fraction-warning":"\u8bf7\u6309SKY/BTC\u6c47\u7387\u7684\u500d\u6570\u53d1\u9001BTC! Skycoin\u662f\u4ee5\u6574\u6570\u53d1\u9001; SKY\u7684\u5c0f\u6570\u4f4d\u5c06\u4e0d\u4f1a\u53d1\u9001",receive:"\u63a5\u6536Sky","receive-desc":"\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\uff0c\u6211\u4eec\u5c06\u53d1\u9001Skycoin\u7ed9\u4f60\u3002\u4f60\u53ef\u80fd\u9700\u898120\u5206\u949f\u5230\u4e00\u4e2a\u5c0f\u65f6\u624d\u80fd\u6536\u5230\u8fd9\u4e9bSKY\u3002","status-button":"\u72b6\u6001:","check-status-button":"\u67e5\u770b\u72b6\u6001","new-order-button":"\u65b0\u8ba2\u5355"},wizard:{"wallet-desc":'\u5982\u679c\u4f60\u6ca1\u6709Skycoin\u94b1\u5305\uff0c\u8bf7\u4f7f\u7528\u751f\u6210\u7684\u79cd\u5b50\u6765\u521b\u5efa\u4e00\u4e2a\u65b0\u94b1\u5305\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u6709\u4e00\u4e2a\u94b1\u5305\uff0c\u5207\u6362\u5230"\u52a0\u8f7d\u94b1\u5305"\u5e76\u8f93\u5165\u4f60\u7684\u79cd\u5b50\u3002',"encrypt-desc":"\u901a\u8fc7\u52a0\u5bc6\u6765\u589e\u52a0\u94b1\u5305\u7684\u5b89\u5168\u6027\u3002\u8f93\u5165\u5bc6\u7801\u540e\uff0c\u4f60\u7684\u94b1\u5305\u4f1a\u88ab\u52a0\u5bc6\u3002\u53ea\u6709\u8f93\u5165\u5bc6\u7801\u624d\u53ef\u4ee5\u8bbf\u95ee\u7684\u94b1\u5305\u6216\u79fb\u52a8\u8d44\u91d1\u3002","hardware-wallet-link":"\u4f7f\u7528\u786c\u4ef6\u94b1\u5305\uff1f","finish-button":"\u5b8c\u6210","back-button":"\u540e\u9000",confirm:{title:"\u4fdd\u62a4\u4f60\u7684\u79cd\u5b50!",desc:"\u8bf7\u786e\u4fdd\u4f60\u5df2\u7ecf\u5199\u4e0b\u4f60\u7684\u79cd\u5b50\u5e76\u5c06\u5b83\u50a8\u5b58\u5728\u4e86\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u6062\u590d\u4f60\u7684Skycoin\u94b1\u5305",checkbox:"\u5b83\u5f88\u5b89\u5168\uff0c\u6211\u53d1\u8a93\u3002",button:"\u7ee7\u7eed"}},wallet:{"new-address":"\u65b0\u5730\u5740","new-addresses":"\u65b0\u5730\u5740","show-empty":"\u5c55\u793a\u7a7a\u5730\u5740","hide-empty":"\u9690\u85cf\u7a7a\u5730\u5740",encrypt:"\u52a0\u5bc6\u94b1\u5305",decrypt:"\u89e3\u5bc6\u94b1\u5305","decrypt-warning":"\u8b66\u544a: \u51fa\u4e8e\u5b89\u5168\u8003\u8651\uff0c\u5efa\u8bae\u5c06\u94b1\u5305\u52a0\u5bc6\u3002\u5efa\u8bae\u8c28\u614e\u4e00\u70b9\u3002",delete:"\u5220\u9664\u94b1\u5305",edit:"\u7f16\u8f91\u94b1\u5305",add:"\u6dfb\u52a0\u94b1\u5305",load:"\u52a0\u8f7d\u94b1\u5305","encryption-enabled":"\u52a0\u5bc6\u5df2\u542f\u7528","encryption-disabled":"\u52a0\u5bc6\u5df2\u7981\u7528","hw-security-warning":'\u53ef\u80fd\u7684\u5b89\u5168\u98ce\u9669\u3002\u5f53\u786c\u4ef6\u8bbe\u5907\u5df2\u8fde\u63a5\u65f6(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684"\u786c\u4ef6\u94b1\u5305"\u6309\u94ae)\u8bbf\u95ee\u786c\u4ef6\u94b1\u5305\u9009\u9879\u4ee5\u83b7\u53d6\u66f4\u591a\u4fe1\u606f',wallet:"\u94b1\u5305","hardware-wallet":"\u786c\u4ef6\u94b1\u5305","delete-confirmation":'\u8b66\u544a: \u94b1\u5305"{{ name }}"\u5c06\u4ece\u5217\u8868\u4e2d\u5220\u9664\u3002\u82e5\u60f3\u91cd\u65b0\u6dfb\u52a0\uff0c\u9700\u91cd\u65b0\u8fde\u63a5\u8bbe\u5907\u5e76\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u7684\u9009\u9879\u5217\u8868(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684"\u786c\u4ef6\u94b1\u5305"\u6309\u94ae)\u3002\u4f60\u60f3\u7ee7\u7eed\u5417\uff1f',"delete-confirmation-check":"\u662f\u7684\uff0c\u6211\u60f3\u8981\u5220\u9664\u94b1\u5305\u3002","max-hardware-wallets-error":"\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u91cc\u7684\u5730\u5740\u5df2\u7ecf\u8fbe\u5230\u5141\u8bb8\u7684\u6700\u5927\u503c\u3002","add-many-confirmation":"\u8b66\u544a: \u5982\u679c\u4f60\u5728\u4e0d\u4f7f\u7528\u524d\u4e00\u4e2a\u5730\u5740\u7684\u60c5\u51b5\u4e0b\u6dfb\u52a0\u592a\u591a\u5730\u5740\uff0c\u6216\u8005\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662f\u6700\u540e\u4e00\u4e2a\u5730\u5740\u800c\u4e0d\u662f\u7b2c\u4e00\u4e2a\u5730\u5740\uff0c\u90a3\u4e48\u5982\u679c\u4f60\u5c1d\u8bd5\u4f7f\u7528\u79cd\u5b50\u6062\u590d\u94b1\u5305\uff0c\u6709\u4e9b\u5730\u5740\u5c06\u53ef\u80fd\u65e0\u6cd5\u81ea\u52a8\u6062\u590d\uff08\u4f60\u5fc5\u987b\u624b\u52a8\u6dfb\u52a0\u5b83\u4eec\uff09\u3002 \u4f60\u60f3\u7ee7\u7eed\u5417\uff1f",new:{"create-title":"\u521b\u5efa\u94b1\u5305","load-title":"\u52a0\u8f7d\u94b1\u5305","encrypt-title":"\u52a0\u5bc6\u94b1\u5305","name-label":"\u540d\u79f0","seed-label":"\u79cd\u5b50","confirm-seed-label":"\u786e\u8ba4\u79cd\u5b50","seed-warning":"\u8bb0\u4f4f\u79cd\u5b50! \u628a\u5b83\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002 \u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u4f60\u7684\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u627e\u56de\u4f60\u7684\u94b1\u5305!","create-button":"\u521b\u5efa","load-button":"\u52a0\u8f7d","cancel-button":"\u5220\u9664","12-words":"12\u5b57","24-words":"24\u5b57","generate-12-seed":"\u751f\u621012\u5b57\u79cd\u5b50","generate-24-seed":"\u751f\u621024\u5b57\u79cd\u5b50",encrypt:"\u52a0\u5bc6\u94b1\u5305","encrypt-warning":"\u6211\u4eec\u5efa\u8bae\u4f60\u4e3a\u6bcf\u4e2a\u94b1\u5305\u8bbe\u7f6e\u4e00\u4e2a\u72ec\u7acb\u7684\u5bc6\u7801\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u5bc6\u7801\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u79cd\u5b50\u91cd\u7f6e\u94b1\u5305\u3002\u5728\u52a0\u5bc6\u4f60\u7684\u94b1\u5305\u4e4b\u524d\uff0c\u786e\u4fdd\u4f60\u7684\u79cd\u5b50\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002","unconventional-seed-title":"\u53ef\u80fd\u9519\u8bef","unconventional-seed-text":"\u4f60\u5f15\u8fdb\u4e86\u4e00\u79cd\u975e\u4f20\u7edf\u7684\u79cd\u5b50\u3002\u5982\u679c\u4f60\u51fa\u4e8e\u4efb\u4f55\u7279\u6b8a\u539f\u56e0\u8fd9\u6837\u505a\uff0c\u4f60\u53ef\u4ee5\u7ee7\u7eed(\u53ea\u63a8\u8350\u9ad8\u7ea7\u7528\u6237)\u3002\u4f46\u662f\uff0c\u5982\u679c\u4f60\u6253\u7b97\u4f7f\u7528\u666e\u901a\u7684\u7cfb\u7edf\u79cd\u5b50\uff0c\u5219\u5fc5\u987b\u5220\u9664\u6240\u6709\u9644\u52a0\u6587\u672c\u548c\u7279\u6b8a\u5b57\u7b26\u3002","unconventional-seed-check":"\u7ee7\u7eed\u4f7f\u7528\u975e\u4f20\u7edf\u79cd\u5b50\u3002"},rename:{title:"\u91cd\u547d\u540d\u94b1\u5305","name-label":"\u547d\u540d","cancel-button":"\u53d6\u6d88","rename-button":"\u91cd\u547d\u540d"},"add-addresses":{title:"\u9009\u62e9\u6570\u91cf","name-quantity":"\u521b\u5efa\u591a\u5c11\u5730\u5740","cancel-button":"\u53d6\u6d88","create-button":"\u521b\u5efa"},address:{show:"\u70b9\u51fb\u663e\u793a",copy:"\u590d\u5236","copy-address":"\u590d\u5236\u5730\u5740",copied:"\u5df2\u590d\u5236!",confirm:"\u786e\u8ba4\u5730\u5740",outputs:"\u672a\u4ea4\u6613\u8f93\u51fa",history:"\u5386\u53f2"}},send:{"synchronizing-warning":"\u94b1\u5305\u4ecd\u5728\u540c\u6b65\u6570\u636e\uff0c\u6240\u4ee5\u663e\u793a\u7684\u4f59\u989d\u53ef\u80fd\u4e0d\u6b63\u786e\u3002\u4f60\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f","from-label":"\u53d1\u9001\u81ea","to-label":"\u53d1\u9001\u81f3","amount-label":"\u603b\u989d","notes-label":"\u6807\u6ce8","wallet-label":"\u94b1\u5305","addresses-label":"\u5730\u5740","invalid-amount":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u6570\u503c","addresses-help":"\u9650\u5b9a\u6e90\u53d1\u9001\u5730\u5740","all-addresses":"\u6240\u6709\u5730\u5740(\u6240\u9009\u94b1\u5305\u7684)","outputs-label":"\u672a\u4ea4\u6613\u8f93\u51fa","outputs-help":"\u9650\u5b9a\u672a\u4ea4\u6613\u8f93\u51fa","all-outputs":"\u6240\u6709\u672a\u4ea4\u6613\u8f93\u51fa(\u6240\u9009\u5730\u5740\u7684)","available-msg-part1":"\u6839\u636e\u4f60\u5f53\u524d\u7684\u9009\u62e9\uff0c\u4f60\u6700\u591a\u53ef\u4ee5\u53d1\u9001","available-msg-part2":"\u548c","available-msg-part3":"(\u81f3\u5c11","available-msg-part4":"\u5c06\u4f5c\u4e3a\u5fc5\u987b\u7684\u4ea4\u6613\u624b\u7eed\u8d39)\u3002","change-address-label":"\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740","change-address-select":"\u9009\u62e9","change-address-help":'\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740\u3002\u5982\u679c\u4e0d\u63d0\u4f9b\uff0c\u94b1\u5305\u5c06\u4f1a\u81ea\u52a8\u9009\u62e9\u3002\u70b9\u51fb"\u9009\u62e9" \u6765\u9009\u62e9\u4e00\u4e2a\u5730\u5740',"destinations-label":"\u76ee\u6807\u5730\u5740","destinations-help1":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01","destinations-help2":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01\u4ee5\u53ca\u5e01\u65f6","hours-allocation-label":"\u81ea\u52a8\u5206\u914d\u5e01\u65f6","options-label":"\u9009\u9879","value-label":"\u5e01\u65f6\u5206\u53d1\u56e0\u5b50","value-help":"\u5206\u53d1\u56e0\u5b50\u503c\u8d8a\u9ad8\uff0c\u8d8a\u591a\u5e01\u65f6\u5c06\u88ab\u53d1\u9001","preview-button":"\u9884\u89c8","send-button":"\u53d1\u9001","back-button":"\u540e\u9000",simple:"\u7b80\u6613",advanced:"\u9ad8\u7ea7\u7684","select-wallet":"\u9009\u62e9\u94b1\u5305"},reset:{"wallet-label":"\u94b1\u5305","seed-label":"\u94b1\u5305\u79cd\u5b50","password-label":"\u65b0\u5bc6\u7801 (\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u94b1\u5305\u52a0\u5bc6\uff0c\u8bf7\u5c06\u5bc6\u7801\u7559\u7a7a)","confirm-label":"\u786e\u8ba4\u65b0\u5bc6\u7801","reset-button":"\u91cd\u7f6e"},tx:{transaction:"\u4ea4\u6613","confirm-transaction":"\u786e\u8ba4\u4ea4\u6613",from:"\u6765\u81ea",to:"\u5230",date:"\u65e5\u671f",status:"\u72b6\u6001",coins:"\u5e01",hours:"\u5e01\u65f6",id:"\u4ea4\u6613ID","show-more":"\u5c55\u793a\u66f4\u591a","hours-moved":"\u5df2\u8f6c\u79fb","hours-sent":"\u5df2\u53d1\u9001","hours-received":"\u5df2\u63a5\u6536","hours-burned":"\u5df2\u71c3\u70e7",inputs:"\u8f93\u5165",outputs:"\u8f93\u51fa",confirmed:"\u5df2\u786e\u8ba4",pending:"\u5f85\u5904\u7406","current-rate":"\u6309\u5f53\u524d\u6c47\u7387\u8ba1\u7b97"},backup:{"wallet-directory":"\u94b1\u5305\u76ee\u5f55:","seed-warning":"\u5728\u7eb8\u4e0a\u5907\u4efd\u4f60\u7684\u79cd\u5b50\uff0c\u5e76\u4fdd\u5b58\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u53ea\u8981\u6709\u79cd\u5b50\uff0c\u4f60\u5c31\u53ef\u4ee5\u627e\u56de\u4f60\u7684\u5e01\u3002",desc:"\u4f7f\u7528\u4e0b\u8868\u4ece\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u5f97\u5230\u79cd\u5b50\u3002
\u4e3a\u4e86\u4ece\u672a\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u83b7\u5f97\u79cd\u5b50\uff0c\u6253\u5f00\u4e0a\u9762\u7684\u6587\u4ef6\u5939,\u5728\u6587\u672c\u7f16\u8f91\u5668\u4e2d\u6253\u5f00.wlt\u6587\u4ef6\u5e76\u6062\u590d\u79cd\u5b50\u3002","close-button":"Close",wallet:"\u94b1\u5305",filename:"\u6587\u4ef6\u540d",seed:"\u79cd\u5b50","show-seed":"\u663e\u793a\u79cd\u5b50","no-wallets":"\u672a\u52a0\u5bc6\u94b1\u5305"},blockchain:{blocks:"\u533a\u5757\u6570\u91cf",time:"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u65f6\u95f4\u6233",hash:"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u54c8\u5e0c\u503c","current-supply":"\u76ee\u524dSKY\u4f9b\u5e94\u91cf","total-supply":"SKY\u7684\u603b\u4f9b\u5e94\u91cf","current-coinhour-supply":"\u76ee\u524d\u5e01\u65f6\u4f9b\u5e94\u91cf","total-coinhour-supply":"\u5e01\u65f6\u603b\u4f9b\u5e94\u91cf"},network:{peer:"\u8282\u70b9",source:"\u8282\u70b9\u6765\u6e90","block-height":"\u533a\u5757\u9ad8\u5ea6","block-height-short":"\u533a\u5757","last-seen":"\u4e0a\u4e00\u6b21\u51fa\u73b0","last-received":"\u4e0a\u4e00\u6b21\u63a5\u6536","last-sent":"\u4e0a\u4e00\u6b21\u53d1\u9001",in:"\u8fdb\u6765\u7684",out:"\u51fa\u53bb\u7684",sources:{default:"\u9ed8\u8ba4\u8282\u70b9",exchange:"\u4ea4\u6362\u8282\u70b9"}},"pending-txs":{timestamp:"\u65f6\u95f4\u6233",txid:"\u4ea4\u6613ID",none:"\u65e0\u5f85\u5904\u7406\u4ea4\u6613",my:"\u6211\u7684",all:"\u5168\u90e8"},history:{"tx-detail":"\u4ea4\u6613\u660e\u7ec6",moving:"\u5185\u90e8\u8f6c\u8d26\u4e2d",moved:"\u5df2\u5185\u90e8\u8f6c\u8d26",sending:"\u53d1\u9001\u4e2d",sent:"\u5df2\u53d1\u9001",received:"\u5df2\u63a5\u6536",receiving:"\u63a5\u6536\u4e2d",pending:"\u5f85\u5904\u7406","no-txs":"\u4f60\u6ca1\u6709\u5386\u53f2\u4ea4\u6613","no-txs-filter":"\u6ca1\u6709\u4e0e\u5f53\u524d\u7b5b\u9009\u6761\u4ef6\u5339\u914d\u7684\u4ea4\u6613","no-filter":"\u672a\u7ecf\u7b5b\u9009 (\u70b9\u51fb\u9009\u62e9\u94b1\u5305/\u5730\u5740)",filter:"\u5df2\u7b5b\u9009: ",filters:"\u5df2\u7b5b\u9009: ","all-addresses":"\u6240\u6709\u5730\u5740"},teller:{done:"\u5b8c\u6210","waiting-confirm":"\u7b49\u5f85\u786e\u8ba4","waiting-deposit":"\u7b49\u5f85\u6bd4\u7279\u5e01\u5145\u503c","waiting-send":"\u7b49\u5f85\u53d1\u9001Skycoin",unknown:"\u672a\u77e5"},confirmation:{"header-text":"\u786e\u8ba4","confirm-button":"\u662f","cancel-button":"\u5426",close:"\u5173\u95ed"},service:{api:{"server-error":"\u670d\u52a1\u5668\u9519\u8bef"},wallet:{"not-enough-hours":"\u6ca1\u6709\u8db3\u591f\u7684\u5e01\u65f6\u6765\u6267\u884c\u4ea4\u6613"}},"hardware-wallet":{general:{"default-wallet-name":"\u65b0\u786c\u4ef6\u94b1\u5305","error-disconnected":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786c\u4ef6\u94b1\u5305\u672a\u8fde\u63a5\u3002","simple-error":"\u9519\u8bef\uff0c\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002","generic-error":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786e\u4fdd\u4f60\u5df2\u7ecf\u8fde\u63a5\u4e86\u4e00\u4e2a\u6709\u6548\u7684\u786c\u4ef6\u94b1\u5305\uff0c\u5e76\u4e14\u5b83\u6ca1\u6709\u5728\u7b49\u5f85\u8f93\u5165\u3002","generic-error-internet":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786e\u4fdd\u4f60\u5df2\u7ecf\u8fde\u63a5\u4e86\u4e00\u4e2a\u6709\u6548\u7684\u786c\u4ef6\u94b1\u5305\uff0c\u5b83\u4e0d\u5728\u7b49\u5f85\u8f93\u5165\uff0c\u5e76\u4e14\u4f60\u5df2\u7ecf\u8fde\u63a5\u5230\u7f51\u7edc/\u8282\u70b9","error-incorrect-wallet":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u6240\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u4e0e\u9884\u671f\u4e0d\u540c\u3002","error-incorrect-pin":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684\u5bc6\u7801\u4e0d\u6b63\u786e\u3002",confirm:"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u3002","confirm-and-more":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u5e76\u6309\u9075\u5faa\u6307\u793a\u3002",close:"\u5173\u95ed",cancel:"\u53d6\u6d88",continue:"\u7ee7\u7eed",completed:"\u64cd\u4f5c\u5b8c\u6210\u3002",refused:"\u64cd\u4f5c\u5931\u8d25\u6216\u88ab\u53d6\u6d88\u3002"},errors:{"too-many-inputs":"\u6b64\u7b14\u4ea4\u6613\u6709\u592a\u591a\u7684\u8f93\u5165\uff0c\u65e0\u6cd5\u5904\u7406\u3002\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301\u3002","too-many-outputs":"\u6b64\u7b14\u4ea4\u6613\u6709\u592a\u591a\u7684\u8f93\u51fa\uff0c\u65e0\u6cd5\u5904\u7406\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301\u3002"},"security-warning":{title:"\u5b89\u5168\u8b66\u544a",text:'\u4e0a\u6b21\u8fde\u63a5\u6b64\u786c\u4ef6\u94b1\u5305\u65f6\uff0c\u53d1\u73b0\u4e00\u4e2a\u6216\u591a\u4e2a\u5b89\u5168\u8b66\u544a\u3002\u6211\u4eec\u5efa\u8bae\u4f60\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u9009\u9879(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684"\u786c\u4ef6\u94b1\u5305"\u6309\u94ae)\u5e76\u4fdd\u6301\u8bbe\u5907\u5df2\u8fde\u63a5\uff0c\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u89e3\u51b3\u5b89\u5168\u95ee\u9898',check:"\u6211\u660e\u767d\u5176\u4e2d\u7684\u98ce\u9669\uff0c\u5e76\u5e0c\u671b\u7ee7\u7eed\u4e0b\u53bb",continue:"\u7ee7\u7eed",cancel:"\u53d6\u6d88"},options:{connecting:"\u8fde\u63a5...",disconnected:"\u6ca1\u6709\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8bf7\u8fde\u63a5\u786c\u4ef6\u94b1\u5305\u540e\u4f7f\u7528\u6b64\u9009\u9879\u3002","unconfigured-detected-title":"\u672a\u914d\u7f6e\u7684\u786c\u4ef6\u94b1\u5305","unconfigured-detected":'\u68c0\u6d4b\u5230\u65e0\u79cd\u5b50\u7684\u786c\u4ef6\u94b1\u5305\u3002\u9009\u62e9"\u81ea\u52a8\u914d\u7f6e"\u5982\u679c\u4f60\u60f3\u5c06\u5176\u914d\u7f6e\u4e3a\u5168\u65b0\u7684\u94b1\u5305\u5e76\u7acb\u5373\u5f00\u59cb\u4f7f\u7528\u5b83\uff0c\u6216\u9009\u62e9"\u6062\u590d\u5907\u4efd"\u5982\u679c\u4f60\u60f3\u4f7f\u7528\u5148\u524d\u521b\u5efa\u7684\u5907\u4efd\u79cd\u5b50\u5bf9\u5176\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u80fd\u591f\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u4ea7\u3002',"configured-detected":"\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8be5\u8bbe\u5907\u5728\u94b1\u5305\u5217\u8868\u4e2d\u88ab\u8bc6\u522b\u4e3a:","security-warnings-title":"\u5b89\u5168\u8b66\u544a","security-warning-title":"\u5b89\u5168\u8b66\u544a","backup-warning":'\u4f60\u5e94\u8be5\u5907\u4efd\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\uff0c\u5426\u5219\u4e07\u4e00\u51fa\u73b0\u95ee\u9898\uff0c\u4f60\u53ef\u80fd\u5c06\u65e0\u6cd5\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\uff0c\u8981\u505a\u5230\u8fd9\u4e00\u70b9\u3002\u9009\u62e9"\u521b\u5efa\u4e00\u4e2a\u5907\u4efd"\u9009\u9879\u3002',"pin-warning":'\u5f53\u524d\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u672a\u8bbe\u7f6e\u5bc6\u7801\u3002\u5bc6\u7801\u53ef\u4fdd\u62a4\u786c\u4ef6\u94b1\u5305\uff0c\u4ee5\u9632\u4e22\u5931\u3001\u76d7\u7a83\u548c\u9ed1\u5ba2\u5165\u4fb5\u3002\u8981\u521b\u5efa\u4e00\u4e2a\u5bc6\u7801\uff0c\u9009\u62e9"\u521b\u5efaPIN\u7801"\u9009\u9879\u3002',options:"\u9009\u9879:","configure-automatically":"\u81ea\u52a8\u914d\u7f6e","restore-backup":"\u6062\u590d\u5907\u4efd","create-backup":"\u521b\u5efa\u5907\u4efd",wipe:"\u5220\u9664\u8bbe\u5907","confirm-seed":"\u786e\u8ba4\u79cd\u5b50","create-pin":"\u521b\u5efa\u5bc6\u7801","change-pin":"\u66f4\u6539\u5bc6\u7801","forgotten-pin1":"\u5982\u679c\u4f60\u56e0\u4e3a\u5fd8\u8bb0\u5bc6\u7801\u800c\u65e0\u6cd5\u8fdb\u5165\u94b1\u5305\uff0c\u4f60\u53ef\u4ee5\u5220\u9664\u786c\u4ef6\u94b1\u5305\uff0c\u7136\u540e\u901a\u8fc7\u79cd\u5b50","forgotten-pin2":"\u6062\u590d"},"generate-seed":{text:"\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u4f60\u53ef\u4ee5\u9009\u62e9\u751f\u6210\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002\u79cd\u5b50\u662f\u4e00\u4e2a\u5355\u8bcd\u5217\u8868\uff0c\u51fa\u73b0\u95ee\u9898\u540e\u53ef\u4ee5\u7528\u6765\u6062\u590d\u8bbf\u95ee\u4f60\u7684\u5e01\u3002\u6240\u6709\u9009\u9879\u90fd\u662f\u5b89\u5168\u7684\uff0c\u5982\u679c\u4f60\u6ca1\u6709\u7279\u6b8a\u539f\u56e0\u5fc5\u987b\u9009\u62e9\u67d0\u4e00\u9879\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u9ed8\u8ba4\u503c\u3002",configuring:"\u914d\u7f6e..."},"restore-seed":{text:"\u5728\u7ee7\u7eed\u524d\uff0c\u8bf7\u9009\u62e9\u4f60\u60f3\u8981\u6062\u590d\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u91cf\u3002","check-text":"\u4f60\u53ef\u4ee5\u4f7f\u7528\u6b64\u9009\u9879\u8f93\u5165\u79cd\u5b50\uff0c\u5e76\u68c0\u67e5\u5b83\u662f\u5426\u4e0e\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4e00\u81f4\u3002\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u9009\u62e9\u4f60\u60f3\u8981\u68c0\u67e5\u7684\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002",warning:"\u8b66\u544a: \u4e3a\u4e86\u907f\u514d\u53ef\u80fd\u51fa\u73b0\u7684\u95ee\u9898\uff0c\u8bf7\u4ec5\u4f7f\u7528\u540c\u4e00\u54c1\u724c/\u578b\u53f7\u7684\u786c\u4ef6\u94b1\u5305\u521b\u5efa\u79cd\u5b50\u3002","error-wrong-word":"\u9519\u8bef: \u91cd\u65b0\u952e\u5165\u7684\u5355\u8bcd\u4e0e\u786c\u4ef6\u94b1\u5305\u6240\u8bf7\u6c42\u7684\u4e0d\u5339\u914d\u3002","error-invalid-seed":"\u9519\u8bef: \u79cd\u5b50\u65e0\u6548\u3002\u8bf7\u52a1\u5fc5\u6309\u6b63\u786e\u7684\u987a\u5e8f\u8f93\u5165\u6b63\u786e\u7684\u5355\u8bcd\u3002","error-wrong-seed":"\u9519\u8bef: \u79cd\u5b50\u662f\u6709\u6548\u7684\uff0c\u4f46\u4e0e\u8bbe\u5907\u4e2d\u7684\u79cd\u5b50\u4e0d\u5339\u914d\u3002"},added:{title:"\u65b0\u786c\u4ef6\u94b1\u5305",configuring:"\u68c0\u6d4b\u5230\u65b0\u7684\u786c\u4ef6\u94b1\u5305\u3002\u914d\u7f6e...",done:"\u5df2\u5b8c\u6210",added1:"\u5df2\u8fde\u63a5\u7684\u786c\u4ef6\u7684\u94b1\u5305\u5df2\u7ecf\u7528\u5982\u4e0b\u540d\u5b57\u88ab\u6dfb\u52a0\u5230\u94b1\u5305\u5217\u8868:",added2:"\u73b0\u5728\u4f60\u53ef\u4ee5\u67e5\u770b\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4f59\u989d\u548c\u5730\u5740\u4e86\uff0c\u5373\u4f7f\u786c\u4ef6\u94b1\u5305\u5e76\u672a\u8fde\u63a5\u3002\u6b64\u5916\u5982\u679c\u4f60\u613f\u610f\uff0c\u4f60\u8fd8\u53ef\u4ee5\u66f4\u6539\u94b1\u5305\u540d\u79f0\u6216\u4ece\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u5220\u9664\u3002"},wipe:{warning:"\u8b66\u544a: \u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u6240\u6709\u6570\u636e\u5c06\u88ab\u5220\u9664\u3002\u5982\u679c\u6ca1\u6709\u5907\u4efd\uff0c\u4f60\u5c06\u65e0\u6cd5\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\u3002","confirm-delete":"\u8fd8\u662f\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u4e2d\u5220\u9664"},"create-backup":{warning:'\u8b66\u544a: \u4f60\u53ea\u80fd\u4f7f\u7528\u6b64\u9009\u9879\u5907\u4efd\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\u4e00\u6b21\u3002\u5982\u679c\u4f60\u51b3\u5b9a\u7ee7\u7eed\uff0c\u4f60\u5c06\u4e0d\u5f97\u4e0d\u5199\u4e0b\u4e00\u7ec4\u5355\u8bcd(\u5efa\u8bae\u5199\u5728\u7eb8\u4e0a\uff0c\u800c\u4e0d\u662f\u7535\u8111\u4e0a)\uff0c\u8fd9\u4e9b\u5355\u8bcd\u5c06\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\uff0c\u5e76\u5c06\u5176\u5b58\u50a8\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u4efb\u4f55\u53ef\u4ee5\u8bbf\u95ee\u5355\u8bcd\u5217\u8868("\u79cd\u5b50")\u7684\u4eba\u90fd\u53ef\u4ee5\u8bbf\u95ee\u94b1\u5305\u4f59\u989d\uff0c\u56e0\u6b64\u5efa\u8bae\u8bf7\u683c\u5916\u8c28\u614e\u3002',instructions:"\u5199\u4e0b\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u7684\u5355\u8bcd\u5217\u8868\u3002\u4e00\u5b9a\u8981\u6309\u987a\u5e8f\u5e76\u628a\u6bcf\u4e2a\u5355\u8bcd\u90fd\u5199\u5bf9\u3002"},"seed-word":{title:"\u8f93\u5165\u5b57",info1:"\u8f93\u5165\u8bbe\u5907\u4e2d\u663e\u793a\u7684\u5b57",info2:"\u4f60\u5c06\u88ab\u8981\u6c42\u4ee5\u968f\u673a\u7684\u987a\u5e8f\u8f93\u5165\u4f60\u5907\u4efd\u7684\u79cd\u5b50\uff0c\u52a0\u4e0a\u4e00\u4e9b\u989d\u5916\u7684\u5b57\u3002",word:"\u8981\u6c42\u7684\u5b57","error-invalid-word":"\u8f93\u5165\u5b57\u65e0\u6548\u3002","error-loading-words":"\u6b63\u5728\u52a0\u8f7d\u5b57\u5217\u8868\u3002\u8bf7\u7a0d\u7b49\u3002"},"change-pin":{"pin-mismatch":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684\u4e24\u4e2a\u5bc6\u7801\u4e0d\u5339\u914d"},"enter-pin":{title:"\u8f93\u5165\u5bc6\u7801","title-change-current":"\u8f93\u5165\u5f53\u524d\u5bc6\u7801","title-change-new":"\u8f93\u5165\u65b0\u7684\u5bc6\u7801","title-change-confirm":"\u786e\u8ba4\u65b0\u7684\u5bc6\u7801",instructions:" \u5bc6\u7801\u5df2\u663e\u793a\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\u3002","instructions-tx":"\u8fdb\u5165\u5bc6\u7801\u4ee5\u786e\u8ba4\u5e76\u7b7e\u7f72\u4ea4\u6613\u3002","instructions-change":"\u8bf7\u8f93\u5165\u4e00\u4e2a4\u52308\u4e2a\u6570\u5b57\u4e4b\u95f4\u7684\u96be\u4ee5\u88ab\u731c\u4e2d\u7684\u5bc6\u7801\u3002",help:"\u9700\u8981\u5e2e\u52a9\uff1f"},"pin-help":{title:"\u5e2e\u52a9",part1:"\u5f53\u9700\u8981\u8f93\u5165\u5bc6\u7801\u624d\u80fd\u7ee7\u7eed\u65f6\uff0c\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4f1a\u663e\u793a\u4e00\u4e2a\u77e9\u9635\uff0c\u77e9\u9635\u75319\u4e2a\u968f\u673a\u6392\u5217\u7684\u5757\u7ec4\u6210(\u6bcf\u6b21\u987a\u5e8f\u90fd\u4f1a\u6539\u53d8)\uff0c\u4f60\u5c06\u88ab\u8981\u6c42\u5728\u8f6f\u4ef6\u94b1\u5305\u4e2d\u8f93\u5165\u5bc6\u7801\uff0c\u4f7f\u7528\u4e00\u4e2a\u77e9\u9635\uff0c\u6b64\u77e9\u9635\u5305\u542b9\u4e2a\u6309\u94ae\uff0c\u53ea\u663e\u793a\u7b26\u53f7#\u3002",part2:'\u8981\u8f93\u5165\u5bc6\u7801\uff0c\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u4ee5\u6570\u5b57\u77e9\u9635\u67e5\u770b\u5bc6\u7801\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u76f8\u5e94\u6309\u94ae\u3002\u4f8b\u5982\uff0c\u5982\u679c\u5bc6\u7801\u4e3a"23"\u4e14\u6570\u5b572\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u5de6\u4e0a\u89d2\uff0c\u6570\u5b573\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u6b63\u4e2d\u95f4\uff0c\u5219\u6309\u987a\u5e8f\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u5de6\u4e0a\u89d2\u548c\u4e2d\u95f4\u6309\u94ae\u3002',part3:'\u5982\u679c\u4f60\u613f\u610f\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528\u952e\u76d8\u4e0a\u7684\u5c0f\u952e\u76d8\u8f93\u5165\u5bc6\u7801\u3002\u4f46\u662f\uff0c\u5982\u4e4b\u524d\u793a\u4f8b\u6240\u793a\uff0c\u5982\u679c\u5bc6\u7801\u662f"23"\uff0c\u4f60\u4e0d\u80fd\u7b80\u5355\u5730\u7528\u5c0f\u952e\u76d8\u952e\u5165"23"\uff0c\u800c\u662f\u5fc5\u987b\u9009\u62e9\u70b9\u51fb\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a2\u548c3\u5bf9\u5e94\u4f4d\u7f6e\u7684\u503c\u3002'},"create-tx":{title:"\u521b\u5efa\u4ea4\u6613"},"confirm-address":{title:"\u786e\u8ba4\u5730\u5740",instructions:"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u786e\u8ba4\uff0c\u5982\u679c\u5730\u5740\u4e3a:","short-confirmation":"\u5730\u5740\u5df2\u786e\u8ba4",confirmation:'\u5730\u5740\u5df2\u786e\u8ba4\u3002\u4e3a\u4e86\u5b89\u5168, \u9009\u62e9 "\u786e\u8ba4\u5730\u5740" \u9009\u9879\u53ef\u4ee5\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u518d\u6b21\u663e\u793a\u5730\u5740\uff0c\u5728\u83dc\u5355\u4e2d\u53ef\u70b9\u51fb\u5730\u5740\u4f59\u989d\u53f3\u4fa7\u7684\u6309\u94ae\u663e\u793a\u3002'}},"time-from-now":{"few-seconds":"\u51e0\u79d2\u949f\u4e4b\u524d",minute:"\u4e00\u5206\u949f\u4e4b\u524d",minutes:"{{time}} \u5206\u949f\u4e4b\u524d",hour:"\u4e00\u5c0f\u65f6\u4e4b\u524d",hours:"{{time}} \u5c0f\u65f6\u4e4b\u524d",day:"\u4e00\u5929\u4e4b\u524d",days:"{{time}} \u5929\u4e4b\u524d"},exchange:{"you-send":"\u4f60\u53d1\u9001","you-get":"\u4f60\u6536\u5230 (\u5927\u7ea6)","to-address":"\u5230 {{coin}} \u5730\u5740",price:"\u4ea4\u6613\u6c47\u7387","time-15":"\u4ea4\u6613\u65f6\u95f4","exchange-button":"\u4ea4\u6613","min-amount":"\u6700\u5c0f\u6570\u989d:","max-amount":"\u6700\u5927\u6570\u989d:","agree-1":"\u6211\u540c\u610f","agree-2":"\u4f7f\u7528\u6761\u6b3e","agree-3":"\u548c","agree-4":"\u9690\u79c1\u653f\u7b56","powered-by":"\u6280\u672f\u652f\u6301","need-help":"\u9700\u8981\u5e2e\u52a9?","support-portal":"\u5e2e\u52a9\u5165\u53e3",history:"\u8ba2\u5355\u5386\u53f2","order-not-found":"\u8ba2\u5355\u672a\u627e\u5230",status:"\u72b6\u6001",exchanging:"{{from}}\u4ea4\u6613{{to}}",select:"\u9009\u62e9",offline:"\u4ea4\u6613\u6682\u65f6\u4e0b\u7ebf","problem-connecting":"\u672a\u80fd\u8fde\u63a5\u5230\u670d\u52a1\u5668\u3002\u8bf7\u68c0\u67e5\u4f60\u7684\u7f51\u7edc\u8fde\u63a5\u5e76\u7a0d\u540e\u518d\u8bd5\u3002","invalid-address":"\u65e0\u6548\u5730\u5740\u3002",statuses:{"user-waiting":"\u7b49\u5f85\u5145\u503c\u3002\u8bf7\u5c06{{amount}} {{from}}\u53d1\u9001\u5230\u4e0b\u9762\u663e\u793a\u7684\u4ea4\u6613\u5730\u5740","user-waiting-info":"\u7cfb\u7edf\u6b63\u5728\u7b49\u5f85\u4f60\u5145\u503c\u5230\u4ea4\u6613\u5730\u5740\u3002\u4ea4\u6613\u5c06\u5728\u7cfb\u7edf\u68c0\u6d4b\u5230\u4f60\u7684\u5145\u503c\u5e76\u5728\u533a\u5757\u94fe\u4e2d\u786e\u8ba4\u540e\u5f00\u59cb\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u5145\u503c\uff0c\u5e94\u8be5\u5f88\u5feb\u5c31\u4f1a\u68c0\u6d4b\u5230\u3002","market-waiting-confirmations":"\u7b49\u5f85\u94fe\u4e0a\u4ea4\u6613\u786e\u8ba4","market-waiting-confirmations-info":"\u5df2\u7ecf\u68c0\u6d4b\u5230\u5145\u503c\uff0c\u7b49\u5f85\u533a\u5757\u94fe\u4e2d\u88ab\u786e\u8ba4\u3002","market-confirmed":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u63a5\u53d7","market-confirmed-info":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u7ecf\u5728\u533a\u5757\u94fe\u4e0a\u786e\u8ba4\u3002\u51c6\u5907\u9a6c\u4e0a\u6267\u884c\u5151\u6362\u3002","market-exchanged":"\u5b8c\u6210{{from}}\u5230{{to}}\u7684\u5151\u6362","market-exchanged-info":"\u5151\u6362\u5df2\u7ecf\u5b8c\u6210\u3002\u8d44\u91d1\u5c06\u5f88\u5feb\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740\u3002","market-withdraw-waiting":"\u6b63\u5728\u53d1\u9001{{to}}\u5230\u4f60\u7684\u5730\u5740","market-withdraw-waiting-info":"\u53d1\u9001{{to}}\u5230\u4f60\u5730\u5740\u7684\u8fdb\u7a0b\u5df2\u542f\u52a8",complete:"\u4ea4\u6613\u5df2\u5b8c\u6210!","complete-info":"\u8d44\u91d1\u5df2\u7ecf\u6210\u529f\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740\u3002",error:"\u53d1\u751f\u9519\u8bef","error-info":"\u8fd0\u8f6c\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u4f60\u53ef\u4ee5\u5728\u4e0b\u9762\u627e\u5230\u66f4\u591a\u4fe1\u606f\u3002\u5982\u679c\u4f60\u9700\u8981\u5e2e\u52a9\uff0c\u8bf7\u4fdd\u5b58\u4e0b\u9762\u663e\u793a\u7684\u6240\u6709\u6570\u636e\u5e76\u4f7f\u7528\u9875\u9762\u53f3\u4e0b\u89d2\u7684\u5e2e\u52a9\u94fe\u63a5\u6765\u8054\u7cfb\u6280\u672f\u652f\u6301\u3002"},"history-window":{address:"\u5730\u5740",date:"\u65e5\u671f"},details:{"exchange-addr":"\u4ea4\u6613\u5730\u5740","exchange-addr-tag":"\u652f\u4ed8ID\u6216\u4ea4\u6613\u5fc5\u987b\u7528\u5230\u7684\u76ee\u6807\u6807\u7b7e","tx-id":"\u4ea4\u6613ID","order-id":"\u8ba2\u5355ID","initial-price":"\u521d\u59cb\u6c47\u7387","error-msg":"\u9519\u8bef\u4fe1\u606f ",details:"\u8be6\u60c5","start-date":"\u5f00\u59cb\u65e5\u671f",back:"\u8fd4\u56de","back-alert":'\u64cd\u4f5c\u6b63\u5728\u6267\u884c\u3002\u4f60\u771f\u7684\u60f3\u8981\u8fd4\u56de\u5230\u8868\u683c\u5417\uff1f\u4f60\u53ef\u4ee5\u901a\u8fc7\u70b9\u51fb"\u8ba2\u5355\u5386\u53f2"\u518d\u6b21\u770b\u5230\u6267\u884c\u8fc7\u7a0b'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.fff400d64f7210ba95bd.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.fff400d64f7210ba95bd.js new file mode 100644 index 0000000000..e40a94f8a1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/1.fff400d64f7210ba95bd.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{amrp:function(e){e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Loading...","done-title":"Done","warning-title":"Warning","error-title":"Error","changes-made":"The changes have been made.","back-button":"Back","create-button":"Create","load-button":"Load","cancel-button":"Cancel","continue-button":"Continue","close-button":"Close","generic-confirmation-check":"I understand the risks and want to continue","copied":"The text has been copied to the clipboard."},"errors":{"window-size":"The window is too narrow for the content."},"language":{"title":"Select Language"},"header":{"syncing-blocks":"Syncing blocks","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"Wallet update","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"available.","synchronizing":"The wallet is synchronizing. Data you see may not be updated.","pending-txs-part1":"There are some","pending-txs-part2":"pending transactions.","pending-txs-part3":"Data you see may not be updated.","no-connections":"No connections active, your client is not connected to any other nodes!","no-backend-part1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Security vulnerability: CSRF is not working, please exit immediately."}},"password":{"title":"Enter Password","password-label":"Password","password-error-info":"You must enter a password.","confirm-password-label":"Confirm password","confirm-error-info":"The two passwords must match.","proceed-button":"Proceed","reset-link":"I forgot my password","incorrect-password-error":"Incorrect password.","decrypting-error":"Error decrypting the wallet."},"buy":{"title-and-button":"Buy","deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address","generate":"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you\'d like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.","send":"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!","receive":"Receive Sky","receive-desc":"After receiving your Bitcoin, we\'ll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},"wizard":{"create-title":"Create Wallet","create-desc":"If you don\'t have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \\"Load\\" and enter your seed.","encrypt-title":"Encrypt Wallet","encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a Skywallet?","new-button":"New","load-button":"Load","finish-button":"Finish","confirm":{"title":"Safeguard Your Seed!","desc":"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!","checkbox":"It\u2019s safe, I swear."}},"wallet":{"title-and-button":"Wallets","show-empty-button":"Show Empty","hide-empty-button":"Hide Empty","encrypt-button":"Encrypt Wallet","decrypt-button":"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.","delete-button":"Delete Wallet","rename-button":"Rename","add-button":"New Wallet","load-button":"Load Wallet","hardware-wallet-button":"Skywallet","encryption-enabled":"Encryption enabled.","encryption-disabled":"Encryption disabled.","warning-hw-security":"Possible security risk. Access the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list) while the device is connected for more information.","wallet-table-label":"Wallet","hardware-wallet-table-label":"Skywallet","delete-confirmation":"WARNING: The wallet \\"{{ name }}\\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list). Do you want to continue?","delete-confirmation-check":"Yeah, I want to delete the wallet","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?","busy-error":"Please wait for the previous operation to be completed.","new":{"create-title":"Create Wallet","load-title":"Load Wallet","name-label":"Name","name-error-info":"You must enter a name.","words-number-label":"How many words the seed has","seed-label":"Seed","seed-error-info":"You must enter a seed.","confirm-seed-label":"Confirm seed","confirm-seed-error-info":"The two seeds must match.","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","12-words":"12 words","24-words":"24 words","generate-12-help":"Generate a 12 word seed.","generate-24-help":"Generate a 24 word seed.","encrypt-check":"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","seed-checking-error":"It was not possible to verify the validity of the seed.","unconventional-seed-title":"Possible Error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed","synchronizing-warning-text":"The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \\"Scan Addresses\\" function or add them again manually.","wallet-created":"The wallet has been added to the list.","seed":{"enter-seed":"Press here to enter the seed","change-seed":"Press to change","confirm-seed":"Press here to confirm the seed","confirmed-seed":"Seed confirmed","use-custom":"Enter the seed manually","use-normal":"Enter the seed using the recommended method","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","incorrect-word-error":"The word you have entered does not match the requested one.","invalid-seed-error":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","word-error-info":"You must enter a word.","new-seed-info":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-info":"Please be sure to enter the correct words in the correct order."}},"rename":{"title":"Rename Wallet","name-label":"Name","label-error-info":"You must enter a name.","rename-button":"Rename"},"address-options":{"title":"Addresses","new":"New Addresses","scan":"Scan Addresses","scan-help":"Use this option to make the system find already used addresses from this wallet which are missing from the list."},"scan-addresses":{"done-with-new-addresses":"The list has been updated.","done-without-new-addresses":"No new addresses were found."},"add-addresses":{"title":"Select Quantity","quantity-label":"How many addresses to create","quantity-error-info":"You must enter a value between 1 and 100.","error":"There was an unexpected error. Please try again."},"address":{"show":"Press to show","copy":"Copy","copy-address":"Copy address","copied":"Copied!","confirm":"Confirm address","outputs":"Unspent outputs","history":"History"}},"qr":{"title":"QR Code","data-label":"QR data","address-label":"Address","request-link":"Request specific amount","amount-label":"Requested amount","hours-label":"Requested hours","message-label":"Message","invalid":"(invalid value)"},"send":{"title-and-button":"Send","unsigned-button":"Unsigned","signed-button":"Signed","unsigned-confirmation":"The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?","synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.","wallet-label":"Wallet","wallet-error-info":"You must select a wallet.","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins-link":"send all","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","addresses-label":"Addresses","addresses-error-info":"You must enter at least one valid address.","no-wallet-selected-error":"There are no coins to send.","no-coins-left-error":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent.","addresses-manual-help":"List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.","outputs-error":"There was an error trying to get the outputs. Please make sure you have entered valid addresses.","all-outputs":"All the outputs of the selected addresses","enter-addresses-for-outputs":"Valid addresses must be entered first","enter-wallet-for-outputs-and-addresses":"A valid wallet must be selected first","invalid-addresses-for-outputs":"No outputs available","available-funds-msg-part1":"With your current selection you can send up to","available-funds-msg-part2":"and","available-funds-msg-part3":"(at least","available-funds-msg-part4":"must be used as transaction fee for sending all the coins or hours).","change-address-label":"Custom change address","change-address-error-info":"The change address is not valid.","change-address-select-from-list-link":"Select","change-address-help":"Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the \\"Select\\" link to choose an address from one of your wallets.","specific-hours":"Hours to send:","remove-specific-hours-info":"Remove.","remove-specific-hours-confirmation":"Are you sure you want to remove the specific amount of hours to send?","destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins.","destinations-help2":"Destination addresses, their coins and hours.","destination-tools-title":"Destination Tools","hours-allocation-check":"Use automatic {{ coinHoursName }} allocation","options-link":"Options","coin-hours-options-link":"Hours options","hours-share-factor-label":"{{ coinHoursName }} share factor","hours-share-factor-help":"This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.","close-hours-share-factor-alert":"The option will be resetted to the default value. Are you sure you want to continue?","preview-button":"Preview","send-button":"Send","show-button":"Show","simple-form-button":"Simple","advanced-form-button":"Advanced","select-wallet":"Select wallet","saving-note-error":"The transaction was successfully sent, but it was not possible to save the note.","sent":"Transaction successfully sent.","total-to-send":"Total:","invalid-address-error":"The destination address is not valid.","one-invalid-address-error":"One of the destination addresses is not valid.","various-invalid-addresses-error":"Some destination addresses are not valid.","all-addresses-invalid-error":"The destination addresses are not valid.","invalid-addresses-error":"Please make sure the address is valid.","address-error-info":"Please enter a valid address.","invalid-value-error-info":"Invalid value.","insufficient-funds-error-info":"The entered value is greater than the available balance.","sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","advanced-sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","sending-all-hours-waning":"You selected to send all the hours. Are you sure you want to continue?","high-hours-share-waning":"Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?","advanced-high-hours-share-waning":"Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?","fill-with-link":{"title":"Use a Transaction Link","link-info":"Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.","link-label":"Transaction link","link-error-info":"You must enter a valid transaction link.","process-button":"Process","invalid-link-error":"The contents of the transaction link are not valid.","invalid-link-hours-error":"The transaction link contains an invalid amount of hours.","data-overwritten-alert":"Some data you have entered will be overwritten. Are you sure you want to continue?","confirmation":"The form has been updated with the data obtained from the transaction link."},"known-node-errors":{"null-change-address-error":"The null address can\'t be used as the custom change address. Please enter a valid address.","to-required-error":"You must provide a destination address for sending coins. Please enter a valid address.","zero-coins-error":"It\'s not possible to send zero coins. Please enter a valid amount.","null-destination-error":"The null address can\'t be used as destination. Please enter a valid address.","duplicate-destination-error":"There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.","hours-in-automatic-mode-error":"Specific hour amounts can\'t be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-needed-error":"The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.","invalid-hours-allocation-mode-error":"Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-not-needed-error":"The hour allocation mode can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-hours-mode-error":"Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.","share-factor-needed-error":"The hours share factor is needed. Please try with different values and contact support if the problem is not solved.","share-factor-not-needed-error":"The hours share factor can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-share-factor-error":"Invalid share factor. Please try with different values and contact support if the problem is not solved.","change-equal-to-destination-error":"The transaction can\'t be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.","repeated-wallet":"A wallet for the specified seed already exists."},"bulk-send":{"title":"Bulk Send","indications":"To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \\"xyz\\" address, type \\"xyz,10,5\\"; if you want the hours to be calculated automatically, type \\"xyz,10\\". Decimal values must be separated with a dot.","data-error-info":"You must enter a value.","process-button":"Process","no-data-error":"There is no text to process.","inconsistent-data-error":"If you set how many hours you want to send to a destination, you must do so for all destinations.","invalid-data-error":"The entered text has an invalid format."}},"select-address":{"title":"Select Address","no-addresses":"There are no confirmed addresses on this wallet."},"offline-transactions":{"loading-problem":"Error trying to get the necessary data","wallet-error-info":"You must select a wallet.","tx-error-info":"You must enter a valid transaction text.","copy-tx":{"signed-title":"Signed Transaction","unsigned-title":"Unsigned Transaction","text-unsigned":"This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \\"Sign Transaction\\" option.","text-signed":"This is the signed transaction. You can send it to the network using the \\"Broadcast Transaction\\" option.","input-label":"Transaction text","copy-button":"Copy","reset-confirmation":"Do you want the the form to be cleaned, so you can create another transaction?","reset-done":"The form has been cleaned."},"sign-tx":{"title":"Sign Transaction","text":"Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.","wallet-label":"Wallet","select-wallet":"Select wallet","input-label":"Transaction text","sign-button":"Sign","signed":"The transaction has been signed."},"broadcast-tx":{"title":"Broadcast Transaction","text":"Use this form to send a signed transaction to the network.","input-label":"Transaction text","send-button":"Send","sent":"The transaction has been sent."}},"reset":{"title":"Reset Password","wallet-label":"Wallet","seed-label":"Wallet seed","seed-error-info":"You must enter a seed.","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","confirm-error-info":"The two passwords must match.","reset-button":"Reset","done":"Password successfully changed."},"tx":{"transaction-title":"Transaction","confirm-transaction-title":"Confirm Transaction","from-small-label":"From:","to-small-label":"To:","date-small-label":"Date:","status-small-label":"Status:","coins-small-label":"Coins:","hours-small-label":"Hours:","id-small-label":"Tx ID:","note-small-label":"Note:","without-note":"Without note","show-more-link":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned","inputs-title":"Inputs","outputs-title":"Outputs","confirmed-transaction":"Confirmed","pending-transaction":"Pending","current-rate-help":"Calculated at the current rate."},"edit-note":{"title":"Edit Note","change-button":"Change"},"backup":{"title":"Backup Wallet","wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.","desc":"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","wallet-table-label":"Wallet name","filename-table-label":"Filename","save-addresses-button":"Save Addresses","show-seed-button":"Show Seed","no-wallets":"There are no wallets","unencrypted-info":"For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.","hw-wallet-info":"For getting the seed of a Skywallet, please use the \\"Skywallet\\" option at the bottom of the wallets page.","not-compatible-error":"Your web browser is not compatible with this function.","seed-modal-window":{"title":"Wallet Seed","seed-label":"Seed"}},"blockchain":{"title":"Blockchain","blocks-label":"Number of blocks","time-label":"Timestamp of last block","hash-label":"Hash of last block","current-supply-label":"Current {{ coinName }} supply","total-supply-label":"Total {{ coinName }} supply","current-coinhour-supply-label":"Current {{ coinHoursName }} supply","total-coinhour-supply-label":"Total {{ coinHoursName }} supply"},"network":{"title":"Networking","error-no-connections":"No connections","peer-small-table-label":"Peer","source-small-table-label":"Source","block-height-small-table-label":"Block height","block-height-short-small-table-label":"Block","last-seen-small-table-label":"Last seen","last-received-help":"Last received.","last-sent-help":"Last sent.","in-help":"Incoming.","out-help":"Outgoing.","sources":{"default":"Default peer","exchange":"Peer exchange"}},"pending-txs":{"title":"Pending Transactions","timestamp-table-label":"Timestamp","txid-table-label":"Transaction ID","none":"No pending transactions","my-transactions-button":"Mine","all-transactions-button":"All"},"outputs":{"title":"Outputs","error-no-outputs":"No unspent outputs"},"history":{"title-and-button":"History","tx-detail-title":"Transaction Detail","moving":"Internally moving {{ coinName }}","moved":"Internally moved {{ coinName }}","sending":"Sending {{ coinName }}","sent":"Sent {{ coinName }}","received":"Received {{ coinName }}","receiving":"Receiving {{ coinName }}","pending-indication":"Pending","transaction-note-small-label":"Note:","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)","filter":"Active filter: ","filters":"Active filters: ","all-addresses":"All addresses","view-all":"View all {{ number }} transactions"},"teller":{"done":"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin","unknown":"Unknown"},"confirmation":{"default-title":"Confirmation","yes-button":"Yes","no-button":"No"},"service":{"api":{"no-internet-error":"You do not have a internet connection or the node has stopped working.","incorrect-password-error":"Incorrect password.","unknown-error":"It was not possible to perform the operation.","api-disabled-error":"API disabled."}},"force-skywallet-wipe":{"title":"Forced Skywallet Wipe","operation-warning":"This option is designed only as a last resort for cases where the device cannot be used with the normal options. All data on the device will be erased, so you will need your seed to recover the funds.","proceed-button":"Proceed"},"hardware-wallet":{"general":{"default-wallet-name":"New Skywallet","confirm":"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.","follow":"Please follow the instructions displayed on the Skywallet.","completed":"Operation completed successfully.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},"errors":{"generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","disconnected":"Unable to perform the operation. The Skywallet is not connected.","incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.","refused":"The operation was canceled.","too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ","timeout":"The operation was canceled due to inactivity. Please try again.","timeout-with-configurable-link":"The operation was canceled due to inactivity. Please try again. If this issue prevents the device from being usable, you can use the following option:","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{"title":"Security Warning","text":"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.","link":"Open the Skywallet options window."},"options":{"connecting":"Connecting...","disconnected":"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":"A seedless Skywallet has been detected. Select \\"Configure Automatically\\" if you want to configure it as a brand new wallet and start using it. Select \\"Restore Backup\\" if you want to configure the Skywallet with a previously created seed backup.","configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security Warnings","security-warning-title":"Security Warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":"The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \\"Update Firmware\\" option.","backup-warning":"You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \\"Create a Backup\\" option.","pin-warning":"The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \\"Create PIN Code\\" option.","options":"Options:","update-firmware":"Update Firmware","configure-automatically":"Configure Automatically","restore-backup":"Restore Backup","create-backup":"Create a Backup","wipe":"Wipe the Device","confirm-seed":"Confirm Seed","create-pin":"Create PIN Code","change-pin":"Change PIN Code","delete-pin":"Delete PIN Code","forgotten-pin-part1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin-part2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{"title":"Outdated Firmware","text":"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.","update":"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.","follow":"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.","timeout":"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.","finished":"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{"text":"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.","configuring":"Configuring..."},"restore-seed":{"text":"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.","warning":"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: the retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: the seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: the seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},"added":{"title":"New Skywallet","configuring":"New Skywallet detected. Configuring...","done":"Done","added1":"The connected Skywallet has been added to the wallets list with the following name:","added2":"Now you can check the balance and the addresses of the Skywallet even when it is not connected.","added-error-info":"You must enter a name.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device."},"wipe":{"warning":"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete-check":"Also remove from the wallets list"},"create-backup":{"warning":"WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \\"seed\\") will be able access the wallet funds, so extreme caution is advised.","instructions":"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{"title":"Enter Word","enter-word":"Enter the word shown on the device","info":"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.","word-label":"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{"warning":"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties."},"enter-pin":{"title":"Enter PIN","title-change-current":"Enter the Current PIN","title-change-new":"Enter the New PIN","title-change-confirm":"Confirm the New PIN","instructions-generic":"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.","help":"Need help?"},"pin-help":{"title":"Help","part1":"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.","part2":"To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \\"23\\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.","part3":"If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \\"23\\", you can not simply type \\"23\\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \\"7\\" and \\"5\\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet."},"create-tx":{"title":"Create Transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","separator-for-coins-and-hours":"and","separator-to-destination":"to"},"confirm-address":{"title":"Confirm Address","instructions":"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.","confirmation":"Address confirmed. For security, you can re-show the address in the Skywallet using the \\"Confirm address\\" option, in the menu that you can display by pressing the button at the right of the address balance."}},"time-from-now":{"few-seconds":"a few seconds ago","minute":"one minute ago","minutes":"{{time}} minutes ago","hour":"one hour ago","hours":"{{time}} hours ago","day":"one day ago","days":"{{time}} days ago"},"exchange":{"title-and-button":"Buy {{ coinName }}","label-you-send":"You send","label-you-get":"You get (approx.)","label-to-address":"To {{coin}} address","label-price":"Exchange rate","label-stimate-transaction-time":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-part1":"I agree with the","agree-part2":"Terms of Use","agree-part3":"and the","agree-part4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal","history":"Order history","order-not-found":"Order not found","label-status":"Status","exchanging":"Exchanging {{from}} for {{to}}","destination-select-from-list-link":"Select","unavailable":"The exchange service is not available in the portable version","offline":"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later","invalid-address-error":"Invalid address.","from-coin-error-info":"You must select a coin.","invalid-value-error-info":"Invalid value.","address-error-info":"Please enter a valid address.","statuses":{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.","complete":"Exchange completed!","complete-info":"The funds have been successfully sent to your address.","error":"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{"title":"Order History","address":"Address:","date":"Date:"},"details":{"exchange-addr-label":"Exchange address (valid for this exchange operation only)","exchange-addr-tag-label":"Payment ID or Destination Tag which must be used for the transaction","tx-id-label":"Transaction ID","order-id-label":"Order ID","initial-price-label":"Initial exchange rate","error-msg-label":"Error message","details-link":"Details","start-date-label":"Start date","back-alert":"The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \\"Order history\\" button"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/11.020fa0852ac300d8fd70.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/11.020fa0852ac300d8fd70.js new file mode 100644 index 0000000000..29a906f5c4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/11.020fa0852ac300d8fd70.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{zJtG:function(e){e.exports=JSON.parse('{"list":["abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual","adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange","arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become","beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray","better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush","board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss","bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call","calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino","castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle","citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client","cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine","come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider","control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle","craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal","debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama","drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody","embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless","endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape","essay","essence","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit","exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure","file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock","floor","flower","fluid","flush","fly","foam","focus","fog","foil","fold","follow","food","foot","force","forest","forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile","frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen","fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy","gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp","gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture","ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance","glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue","goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown","grab","grace","grain","grant","grape","grass","gravity","great","green","grid","grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt","guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy","harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health","heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden","high","hill","hint","hip","hire","history","hobby","hockey","hold","hole","holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital","host","hotel","hour","hover","hub","huge","human","humble","humor","hundred","hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea","identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune","impact","impose","improve","impulse","inch","include","income","increase","index","indicate","indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury","inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install","intact","interest","into","invest","invite","involve","iron","island","isolate","issue","item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel","job","join","joke","journey","joy","judge","juice","jump","jungle","junior","junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney","kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife","knock","know","lab","label","labor","ladder","lady","lake","lamp","language","laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit","layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal","legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level","liar","liberty","library","license","life","lift","light","like","limb","limit","link","lion","liquid","list","little","live","lizard","load","loan","lobster","local","lock","logic","lonely","long","loop","lottery","loud","lounge","love","loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad","magic","magnet","maid","mail","main","major","make","mammal","man","manage","mandate","mango","mansion","manual","maple","marble","march","margin","marine","market","marriage","mask","mass","master","match","material","math","matrix","matter","maximum","maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt","member","memory","mention","menu","mercy","merge","merit","merry","mesh","message","metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor","minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile","model","modify","mom","moment","monitor","monkey","monster","month","moon","moral","more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie","much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual","myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature","near","neck","need","negative","neglect","neither","nephew","nerve","nest","net","network","neutral","never","news","next","nice","night","noble","noise","nominee","noodle","normal","north","nose","notable","note","nothing","notice","novel","now","nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe","obtain","obvious","occur","ocean","october","odor","off","offer","office","often","oil","okay","old","olive","olympic","omit","once","one","onion","online","only","open","opera","opinion","oppose","option","orange","orbit","orchard","order","ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output","outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact","paddle","page","pair","palace","palm","panda","panel","panic","panther","paper","parade","parent","park","parrot","party","pass","patch","path","patient","patrol","pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen","penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo","phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot","pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate","play","please","pledge","pluck","plug","plunge","poem","poet","point","polar","pole","police","pond","pony","pool","popular","portion","position","possible","post","potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare","present","pretty","prevent","price","pride","primary","print","priority","prison","private","prize","problem","process","produce","profit","program","project","promote","proof","property","prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin","punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle","pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit","raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp","ranch","random","range","rapid","rare","rate","rather","raven","raw","razor","ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle","reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release","relief","rely","remain","remember","remind","remove","render","renew","rent","reopen","repair","repeat","replace","report","require","rescue","resemble","resist","resource","response","result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib","ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot","ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket","romance","roof","rookie","room","rose","rotate","rough","round","route","royal","rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness","safe","sail","salad","salmon","salon","salt","salute","same","sample","sand","satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter","scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script","scrub","sea","search","season","seat","second","secret","section","security","seed","seek","segment","select","sell","seminar","senior","sense","sentence","series","service","session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell","sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop","short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side","siege","sight","sign","silent","silk","silly","silver","similar","simple","since","sing","siren","sister","situate","six","size","skate","sketch","ski","skill","skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight","slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth","snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda","soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry","sort","soul","sound","soup","source","south","space","spare","spatial","spawn","speak","special","speed","spell","spend","sphere","spice","spider","spike","spin","spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring","spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp","stand","start","state","stay","steak","steel","stem","step","stereo","stick","still","sting","stock","stomach","stone","stool","story","stove","strategy","street","strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway","success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny","sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey","suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim","swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag","tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi","teach","team","tell","ten","tenant","tennis","tent","term","test","text","thank","that","theme","then","theory","there","they","thing","this","thought","three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber","time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler","toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool","tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist","toward","tower","town","toy","track","trade","traffic","tragic","train","transfer","trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick","trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust","truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle","twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella","unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform","unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade","uphold","upon","upper","upset","urban","urge","usage","use","used","useful","useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van","vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue","verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory","video","view","village","vintage","violin","virtual","virus","visa","visit","visual","vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage","wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash","wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather","web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat","wheel","when","where","whip","whisper","wide","width","wife","wild","will","win","window","wine","wing","wink","winner","winter","wire","wisdom","wise","wish","witness","wolf","woman","wonder","wood","wool","word","work","world","worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year","yellow","you","young","youth","zebra","zero","zone","zoo"]}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/11.254b5afd8c604835170d.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/11.254b5afd8c604835170d.js new file mode 100644 index 0000000000..29a906f5c4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/11.254b5afd8c604835170d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{zJtG:function(e){e.exports=JSON.parse('{"list":["abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual","adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange","arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become","beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray","better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush","board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss","bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call","calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino","castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle","citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client","cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine","come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider","control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle","craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal","debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama","drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody","embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless","endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape","essay","essence","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit","exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure","file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock","floor","flower","fluid","flush","fly","foam","focus","fog","foil","fold","follow","food","foot","force","forest","forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile","frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen","fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy","gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp","gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture","ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance","glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue","goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown","grab","grace","grain","grant","grape","grass","gravity","great","green","grid","grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt","guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy","harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health","heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden","high","hill","hint","hip","hire","history","hobby","hockey","hold","hole","holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital","host","hotel","hour","hover","hub","huge","human","humble","humor","hundred","hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea","identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune","impact","impose","improve","impulse","inch","include","income","increase","index","indicate","indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury","inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install","intact","interest","into","invest","invite","involve","iron","island","isolate","issue","item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel","job","join","joke","journey","joy","judge","juice","jump","jungle","junior","junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney","kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife","knock","know","lab","label","labor","ladder","lady","lake","lamp","language","laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit","layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal","legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level","liar","liberty","library","license","life","lift","light","like","limb","limit","link","lion","liquid","list","little","live","lizard","load","loan","lobster","local","lock","logic","lonely","long","loop","lottery","loud","lounge","love","loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad","magic","magnet","maid","mail","main","major","make","mammal","man","manage","mandate","mango","mansion","manual","maple","marble","march","margin","marine","market","marriage","mask","mass","master","match","material","math","matrix","matter","maximum","maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt","member","memory","mention","menu","mercy","merge","merit","merry","mesh","message","metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor","minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile","model","modify","mom","moment","monitor","monkey","monster","month","moon","moral","more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie","much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual","myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature","near","neck","need","negative","neglect","neither","nephew","nerve","nest","net","network","neutral","never","news","next","nice","night","noble","noise","nominee","noodle","normal","north","nose","notable","note","nothing","notice","novel","now","nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe","obtain","obvious","occur","ocean","october","odor","off","offer","office","often","oil","okay","old","olive","olympic","omit","once","one","onion","online","only","open","opera","opinion","oppose","option","orange","orbit","orchard","order","ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output","outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact","paddle","page","pair","palace","palm","panda","panel","panic","panther","paper","parade","parent","park","parrot","party","pass","patch","path","patient","patrol","pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen","penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo","phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot","pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate","play","please","pledge","pluck","plug","plunge","poem","poet","point","polar","pole","police","pond","pony","pool","popular","portion","position","possible","post","potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare","present","pretty","prevent","price","pride","primary","print","priority","prison","private","prize","problem","process","produce","profit","program","project","promote","proof","property","prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin","punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle","pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit","raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp","ranch","random","range","rapid","rare","rate","rather","raven","raw","razor","ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle","reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release","relief","rely","remain","remember","remind","remove","render","renew","rent","reopen","repair","repeat","replace","report","require","rescue","resemble","resist","resource","response","result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib","ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot","ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket","romance","roof","rookie","room","rose","rotate","rough","round","route","royal","rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness","safe","sail","salad","salmon","salon","salt","salute","same","sample","sand","satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter","scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script","scrub","sea","search","season","seat","second","secret","section","security","seed","seek","segment","select","sell","seminar","senior","sense","sentence","series","service","session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell","sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop","short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side","siege","sight","sign","silent","silk","silly","silver","similar","simple","since","sing","siren","sister","situate","six","size","skate","sketch","ski","skill","skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight","slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth","snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda","soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry","sort","soul","sound","soup","source","south","space","spare","spatial","spawn","speak","special","speed","spell","spend","sphere","spice","spider","spike","spin","spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring","spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp","stand","start","state","stay","steak","steel","stem","step","stereo","stick","still","sting","stock","stomach","stone","stool","story","stove","strategy","street","strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway","success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny","sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey","suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim","swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag","tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi","teach","team","tell","ten","tenant","tennis","tent","term","test","text","thank","that","theme","then","theory","there","they","thing","this","thought","three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber","time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler","toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool","tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist","toward","tower","town","toy","track","trade","traffic","tragic","train","transfer","trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick","trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust","truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle","twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella","unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform","unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade","uphold","upon","upper","upset","urban","urge","usage","use","used","useful","useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van","vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue","verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory","video","view","village","vintage","violin","virtual","virus","visa","visit","visual","vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage","wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash","wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather","web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat","wheel","when","where","whip","whisper","wide","width","wife","wild","will","win","window","wine","wing","wink","winner","winter","wire","wisdom","wise","wish","witness","wolf","woman","wonder","wood","wool","word","work","world","worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year","yellow","you","young","youth","zebra","zero","zone","zoo"]}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/118.c125ed41f2fd9967c716.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/118.c125ed41f2fd9967c716.js new file mode 100644 index 0000000000..27b0488109 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/118.c125ed41f2fd9967c716.js @@ -0,0 +1 @@ +(self.webpackChunkdesktopwallet=self.webpackChunkdesktopwallet||[]).push([[118],{3118:function(e){"use strict";e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Loading...","done-title":"Done","warning-title":"Warning","error-title":"Error","changes-made":"The changes have been made.","back-button":"Back","create-button":"Create","load-button":"Load","cancel-button":"Cancel","continue-button":"Continue","close-button":"Close","generic-confirmation-check":"I understand the risks and want to continue","copied":"The text has been copied to the clipboard."},"errors":{"window-size":"The window is too narrow for the content."},"language":{"title":"Select Language"},"header":{"syncing-blocks":"Syncing blocks","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"Wallet update","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"available.","synchronizing":"The wallet is synchronizing. Data you see may not be updated.","pending-txs-part1":"There are some","pending-txs-part2":"pending transactions.","pending-txs-part3":"Data you see may not be updated.","no-connections":"No connections active, your client is not connected to any other nodes!","no-backend-part1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Security vulnerability: CSRF is not working, please exit immediately."}},"password":{"title":"Enter Password","password-label":"Password","password-error-info":"You must enter a password.","confirm-password-label":"Confirm password","confirm-error-info":"The two passwords must match.","proceed-button":"Proceed","reset-link":"I forgot my password","incorrect-password-error":"Incorrect password.","decrypting-error":"Error decrypting the wallet."},"buy":{"title-and-button":"Buy","deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address","generate":"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you\'d like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.","send":"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!","receive":"Receive Sky","receive-desc":"After receiving your Bitcoin, we\'ll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},"wizard":{"create-title":"Create Wallet","create-desc":"If you don\'t have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \\"Load\\" and enter your seed.","encrypt-title":"Encrypt Wallet","encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","finish-temporal-title":"Ready","finish-temporal-desc":"Please click \\"Finish\\" button to create the wallet. Remember that it will be deleted after closing the wallet software.","hardware-wallet-link":"Using a Skywallet?","new-button":"New","load-button":"Load","finish-button":"Finish","confirm":{"title":"Safeguard Your Seed!","desc":"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!","checkbox":"It\u2019s safe, I swear."}},"wallet":{"title-and-button":"Wallets","show-empty-button":"Show Empty","hide-empty-button":"Hide Empty","encrypt-button":"Encrypt Wallet","decrypt-button":"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.","delete-button":"Delete Wallet","rename-button":"Rename","add-button":"New Wallet","load-button":"Load Wallet","hardware-wallet-button":"Skywallet","encryption-enabled":"Encryption enabled.","encryption-disabled":"Encryption disabled.","temporal":"Temporal wallet.","warning-hw-security":"Possible security risk. Access the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list) while the device is connected for more information.","wallet-table-label":"Wallet","hardware-wallet-table-label":"Skywallet","delete-confirmation":"WARNING: The wallet \\"{{ name }}\\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list). Do you want to continue?","delete-confirmation-check":"Yeah, I want to delete the wallet","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?","busy-error":"Please wait for the previous operation to be completed.","new":{"create-title":"Create Wallet","load-title":"Load Wallet","name-label":"Name","name-error-info":"You must enter a name.","words-number-label":"How many words the seed has","seed-label":"Seed","seed-error-info":"You must enter a seed.","confirm-seed-label":"Confirm seed","confirm-seed-error-info":"The two seeds must match.","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","12-words":"12 words","24-words":"24 words","generate-12-help":"Generate a 12 word seed.","generate-24-help":"Generate a 24 word seed.","encrypt-check":"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","advanced-options-link":"Advanced options","close-advanced-error":"It is not possible to close the options because you have made changes to the values.","temporal-check":"Load temporarily","temporal-info":"If you use this option, the wallet will be loaded temporarily, which means that it will be deleted as soon as you close the wallet software.","temporal-warning":"The wallet will be deleted just after closing the wallet software and won\'t have a password. You will needed the seed to recover access to the funds. Are you sure you want to continue?","seed-checking-error":"It was not possible to verify the validity of the seed.","unconventional-seed-title":"Possible Error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed","synchronizing-warning-text":"The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \\"Scan Addresses\\" function or add them again manually.","wallet-created":"The wallet has been added to the list.","seed":{"enter-seed":"Press here to enter the seed","change-seed":"Press to change","confirm-seed":"Press here to confirm the seed","confirmed-seed":"Seed confirmed","use-custom":"Enter the seed manually","use-normal":"Enter the seed using the recommended method","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","incorrect-word-error":"The word you have entered does not match the requested one.","invalid-seed-error":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","word-error-info":"You must enter a word.","new-seed-info":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-info":"Please be sure to enter the correct words in the correct order."}},"rename":{"title":"Rename Wallet","name-label":"Name","label-error-info":"You must enter a name.","rename-button":"Rename"},"address-options":{"title":"Addresses","new":"New Addresses","scan":"Scan Addresses","scan-help":"Use this option to make the system find already used addresses from this wallet which are missing from the list."},"scan-addresses":{"done-with-new-addresses":"The list has been updated.","done-without-new-addresses":"No new addresses were found."},"add-addresses":{"title":"Select Quantity","quantity-label":"How many addresses to create","quantity-error-info":"You must enter a value between 1 and 100.","error":"There was an unexpected error. Please try again."},"address":{"show":"Press to show","copy":"Copy","copy-address":"Copy address","copied":"Copied!","confirm":"Confirm address","outputs":"Unspent outputs","history":"History"}},"qr":{"title":"QR Code","data-label":"QR data","address-label":"Address","request-link":"Request specific amount","amount-label":"Requested amount","hours-label":"Requested hours","message-label":"Message","invalid":"(invalid value)"},"send":{"title-and-button":"Send","unsigned-button":"Unsigned","signed-button":"Signed","unsigned-confirmation":"The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?","synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.","wallet-label":"Wallet","wallet-error-info":"You must select a wallet.","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins-link":"send all","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","addresses-label":"Addresses","addresses-error-info":"You must enter at least one valid address.","no-wallet-selected-error":"There are no coins to send.","no-coins-left-error":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent.","addresses-manual-help":"List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.","outputs-error":"There was an error trying to get the outputs. Please make sure you have entered valid addresses.","all-outputs":"All the outputs of the selected addresses","enter-addresses-for-outputs":"Valid addresses must be entered first","enter-wallet-for-outputs-and-addresses":"A valid wallet must be selected first","invalid-addresses-for-outputs":"No outputs available","available-funds-msg-part1":"With your current selection you can send up to","available-funds-msg-part2":"and","available-funds-msg-part3":"(at least","available-funds-msg-part4":"must be used as transaction fee for sending all the coins or hours).","change-address-label":"Custom change address","change-address-error-info":"The change address is not valid.","change-address-select-from-list-link":"Select","change-address-help":"Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the \\"Select\\" link to choose an address from one of your wallets.","specific-hours":"Hours to send:","remove-specific-hours-info":"Remove.","remove-specific-hours-confirmation":"Are you sure you want to remove the specific amount of hours to send?","destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins.","destinations-help2":"Destination addresses, their coins and hours.","destination-tools-title":"Destination Tools","hours-allocation-check":"Use automatic {{ coinHoursName }} allocation","options-link":"Options","coin-hours-options-link":"Hours options","hours-share-factor-label":"{{ coinHoursName }} share factor","hours-share-factor-help":"This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.","close-hours-share-factor-alert":"The option will be resetted to the default value. Are you sure you want to continue?","preview-button":"Preview","send-button":"Send","show-button":"Show","simple-form-button":"Simple","advanced-form-button":"Advanced","select-wallet":"Select wallet","saving-note-error":"The transaction was successfully sent, but it was not possible to save the note.","sent":"Transaction successfully sent.","total-to-send":"Total:","invalid-address-error":"The destination address is not valid.","one-invalid-address-error":"One of the destination addresses is not valid.","various-invalid-addresses-error":"Some destination addresses are not valid.","all-addresses-invalid-error":"The destination addresses are not valid.","invalid-addresses-error":"Please make sure the address is valid.","address-error-info":"Please enter a valid address.","invalid-value-error-info":"Invalid value.","insufficient-funds-error-info":"The entered value is greater than the available balance.","sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","advanced-sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","sending-all-hours-waning":"You selected to send all the hours. Are you sure you want to continue?","high-hours-share-waning":"Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?","advanced-high-hours-share-waning":"Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?","fill-with-link":{"title":"Use a Transaction Link","link-info":"Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.","link-label":"Transaction link","link-error-info":"You must enter a valid transaction link.","process-button":"Process","invalid-link-error":"The contents of the transaction link are not valid.","invalid-link-hours-error":"The transaction link contains an invalid amount of hours.","data-overwritten-alert":"Some data you have entered will be overwritten. Are you sure you want to continue?","confirmation":"The form has been updated with the data obtained from the transaction link."},"known-node-errors":{"null-change-address-error":"The null address can\'t be used as the custom change address. Please enter a valid address.","to-required-error":"You must provide a destination address for sending coins. Please enter a valid address.","zero-coins-error":"It\'s not possible to send zero coins. Please enter a valid amount.","null-destination-error":"The null address can\'t be used as destination. Please enter a valid address.","duplicate-destination-error":"There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.","hours-in-automatic-mode-error":"Specific hour amounts can\'t be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-needed-error":"The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.","invalid-hours-allocation-mode-error":"Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-not-needed-error":"The hour allocation mode can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-hours-mode-error":"Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.","share-factor-needed-error":"The hours share factor is needed. Please try with different values and contact support if the problem is not solved.","share-factor-not-needed-error":"The hours share factor can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-share-factor-error":"Invalid share factor. Please try with different values and contact support if the problem is not solved.","change-equal-to-destination-error":"The transaction can\'t be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.","repeated-wallet":"A wallet for the specified seed already exists."},"bulk-send":{"title":"Bulk Send","indications":"To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \\"xyz\\" address, type \\"xyz,10,5\\"; if you want the hours to be calculated automatically, type \\"xyz,10\\". Decimal values must be separated with a dot.","data-error-info":"You must enter a value.","process-button":"Process","no-data-error":"There is no text to process.","inconsistent-data-error":"If you set how many hours you want to send to a destination, you must do so for all destinations.","invalid-data-error":"The entered text has an invalid format."}},"select-address":{"title":"Select Address","no-addresses":"There are no confirmed addresses on this wallet."},"offline-transactions":{"loading-problem":"Error trying to get the necessary data","wallet-error-info":"You must select a wallet.","tx-error-info":"You must enter a valid transaction text.","copy-tx":{"signed-title":"Signed Transaction","unsigned-title":"Unsigned Transaction","text-unsigned":"This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \\"Sign Transaction\\" option.","text-signed":"This is the signed transaction. You can send it to the network using the \\"Broadcast Transaction\\" option.","input-label":"Transaction text","copy-button":"Copy","reset-confirmation":"Do you want the the form to be cleaned, so you can create another transaction?","reset-done":"The form has been cleaned."},"sign-tx":{"title":"Sign Transaction","text":"Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.","wallet-label":"Wallet","select-wallet":"Select wallet","input-label":"Transaction text","sign-button":"Sign","signed":"The transaction has been signed."},"broadcast-tx":{"title":"Broadcast Transaction","text":"Use this form to send a signed transaction to the network.","input-label":"Transaction text","send-button":"Send","sent":"The transaction has been sent."}},"reset":{"title":"Reset Password","wallet-label":"Wallet","seed-label":"Wallet seed","seed-error-info":"You must enter a seed.","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","confirm-error-info":"The two passwords must match.","reset-button":"Reset","done":"Password successfully changed."},"tx":{"transaction-title":"Transaction","confirm-transaction-title":"Confirm Transaction","from-small-label":"From:","to-small-label":"To:","date-small-label":"Date:","status-small-label":"Status:","coins-small-label":"Coins:","hours-small-label":"Hours:","id-small-label":"Tx ID:","note-small-label":"Note:","without-note":"Without note","show-more-link":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned","inputs-title":"Inputs","outputs-title":"Outputs","confirmed-transaction":"Confirmed","pending-transaction":"Pending","current-rate-help":"Calculated at the current rate."},"edit-note":{"title":"Edit Note","change-button":"Change"},"backup":{"title":"Backup Wallet","wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.","desc":"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","wallet-table-label":"Wallet name","filename-table-label":"Filename","save-addresses-button":"Save Addresses","show-seed-button":"Show Seed","no-wallets":"There are no wallets","unencrypted-info":"For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.","hw-wallet-info":"For getting the seed of a Skywallet, please use the \\"Skywallet\\" option at the bottom of the wallets page.","not-compatible-error":"Your web browser is not compatible with this function.","seed-modal-window":{"title":"Wallet Seed","seed-label":"Seed"}},"blockchain":{"title":"Blockchain","blocks-label":"Number of blocks","time-label":"Timestamp of last block","hash-label":"Hash of last block","current-supply-label":"Current {{ coinName }} supply","total-supply-label":"Total {{ coinName }} supply","current-coinhour-supply-label":"Current {{ coinHoursName }} supply","total-coinhour-supply-label":"Total {{ coinHoursName }} supply"},"network":{"title":"Networking","error-no-connections":"No connections","peer-small-table-label":"Peer","source-small-table-label":"Source","block-height-small-table-label":"Block height","block-height-short-small-table-label":"Block","last-seen-small-table-label":"Last seen","last-received-help":"Last received.","last-sent-help":"Last sent.","in-help":"Incoming.","out-help":"Outgoing.","sources":{"default":"Default peer","exchange":"Peer exchange"}},"pending-txs":{"title":"Pending Transactions","timestamp-table-label":"Timestamp","txid-table-label":"Transaction ID","none":"No pending transactions","my-transactions-button":"Mine","all-transactions-button":"All"},"outputs":{"title":"Outputs","error-no-outputs":"No unspent outputs"},"history":{"title-and-button":"History","tx-detail-title":"Transaction Detail","moving":"Internally moving {{ coinName }}","moved":"Internally moved {{ coinName }}","sending":"Sending {{ coinName }}","sent":"Sent {{ coinName }}","received":"Received {{ coinName }}","receiving":"Receiving {{ coinName }}","pending-indication":"Pending","transaction-note-small-label":"Note:","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)","filter":"Active filter: ","filters":"Active filters: ","all-addresses":"All addresses","view-all":"View all {{ number }} transactions"},"teller":{"done":"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin","unknown":"Unknown"},"confirmation":{"default-title":"Confirmation","yes-button":"Yes","no-button":"No"},"service":{"api":{"no-internet-error":"You do not have a internet connection or the node has stopped working.","incorrect-password-error":"Incorrect password.","unknown-error":"It was not possible to perform the operation.","api-disabled-error":"API disabled."}},"force-skywallet-wipe":{"title":"Forced Skywallet Wipe","operation-warning":"This option is designed only as a last resort for cases where the device cannot be used with the normal options. All data on the device will be erased, so you will need your seed to recover the funds.","proceed-button":"Proceed"},"hardware-wallet":{"general":{"default-wallet-name":"New Skywallet","confirm":"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.","follow":"Please follow the instructions displayed on the Skywallet.","completed":"Operation completed successfully.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},"errors":{"generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","disconnected":"Unable to perform the operation. The Skywallet is not connected.","incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.","refused":"The operation was canceled.","too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ","timeout":"The operation was canceled due to inactivity. Please try again.","timeout-with-configurable-link":"The operation was canceled due to inactivity. Please try again. If this issue prevents the device from being usable, you can use the following option:","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{"title":"Security Warning","text":"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.","link":"Open the Skywallet options window."},"options":{"connecting":"Connecting...","disconnected":"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":"A seedless Skywallet has been detected. Select \\"Configure Automatically\\" if you want to configure it as a brand new wallet and start using it. Select \\"Restore Backup\\" if you want to configure the Skywallet with a previously created seed backup.","configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security Warnings","security-warning-title":"Security Warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":"The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \\"Update Firmware\\" option.","backup-warning":"You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \\"Create a Backup\\" option.","pin-warning":"The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \\"Create PIN Code\\" option.","options":"Options:","update-firmware":"Update Firmware","configure-automatically":"Configure Automatically","restore-backup":"Restore Backup","create-backup":"Create a Backup","wipe":"Wipe the Device","confirm-seed":"Confirm Seed","create-pin":"Create PIN Code","change-pin":"Change PIN Code","delete-pin":"Delete PIN Code","forgotten-pin-part1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin-part2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{"title":"Outdated Firmware","text":"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.","update":"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.","follow":"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.","timeout":"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.","finished":"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{"text":"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.","configuring":"Configuring..."},"restore-seed":{"text":"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.","warning":"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: the retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: the seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: the seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},"added":{"title":"New Skywallet","configuring":"New Skywallet detected. Configuring...","done":"Done","added1":"The connected Skywallet has been added to the wallets list with the following name:","added2":"Now you can check the balance and the addresses of the Skywallet even when it is not connected.","added-error-info":"You must enter a name.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device."},"wipe":{"warning":"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete-check":"Also remove from the wallets list"},"create-backup":{"warning":"WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \\"seed\\") will be able access the wallet funds, so extreme caution is advised.","instructions":"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{"title":"Enter Word","enter-word":"Enter the word shown on the device","info":"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.","word-label":"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{"warning":"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties."},"enter-pin":{"title":"Enter PIN","title-change-current":"Enter the Current PIN","title-change-new":"Enter the New PIN","title-change-confirm":"Confirm the New PIN","instructions-generic":"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.","help":"Need help?"},"pin-help":{"title":"Help","part1":"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.","part2":"To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \\"23\\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.","part3":"If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \\"23\\", you can not simply type \\"23\\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \\"7\\" and \\"5\\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet."},"create-tx":{"title":"Create Transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","separator-for-coins-and-hours":"and","separator-to-destination":"to"},"confirm-address":{"title":"Confirm Address","instructions":"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.","confirmation":"Address confirmed. For security, you can re-show the address in the Skywallet using the \\"Confirm address\\" option, in the menu that you can display by pressing the button at the right of the address balance."}},"time-from-now":{"few-seconds":"a few seconds ago","minute":"one minute ago","minutes":"{{time}} minutes ago","hour":"one hour ago","hours":"{{time}} hours ago","day":"one day ago","days":"{{time}} days ago"},"exchange":{"title-and-button":"Buy {{ coinName }}","label-you-send":"You send","label-you-get":"You get (approx.)","label-to-address":"To {{coin}} address","label-price":"Exchange rate","label-stimate-transaction-time":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-part1":"I agree with the","agree-part2":"Terms of Use","agree-part3":"and the","agree-part4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal","history":"Order history","order-not-found":"Order not found","label-status":"Status","exchanging":"Exchanging {{from}} for {{to}}","destination-select-from-list-link":"Select","unavailable":"The exchange service is not available in the portable version","offline":"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later","invalid-address-error":"Invalid address.","from-coin-error-info":"You must select a coin.","invalid-value-error-info":"Invalid value.","address-error-info":"Please enter a valid address.","statuses":{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.","complete":"Exchange completed!","complete-info":"The funds have been successfully sent to your address.","error":"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{"title":"Order History","address":"Address:","date":"Date:"},"details":{"exchange-addr-label":"Exchange address (valid for this exchange operation only)","exchange-addr-tag-label":"Payment ID or Destination Tag which must be used for the transaction","tx-id-label":"Transaction ID","order-id-label":"Order ID","initial-price-label":"Initial exchange rate","error-msg-label":"Error message","details-link":"Details","start-date-label":"Start date","back-alert":"The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \\"Order history\\" button"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.af5e2fa6c65ff6f39739.chunk.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.af5e2fa6c65ff6f39739.chunk.js new file mode 100644 index 0000000000..1c8cc19dd9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.af5e2fa6c65ff6f39739.chunk.js @@ -0,0 +1 @@ +webpackJsonp([2],{"P+VX":function(e,n){e.exports={common:{"coin-id":"SKY","coin-hours":"CH",loading:"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...",new:"\u041d\u043e\u0432\u044b\u0439",load:"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c"},errors:{"fetch-version":"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441 Github","incorrect-password":"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c","api-disabled":"API \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d","no-wallet":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","no-outputs":"\u041d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432"},title:{wallets:"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u0438",send:"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c",history:"\u0418\u0441\u0442\u043e\u0440\u0438\u044f","buy-coin":"\u041a\u0443\u043f\u0438\u0442\u044c Skycoin",network:"\u0421\u0435\u0442\u044c",blockchain:"\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d",outputs:"\u0412\u044b\u0445\u043e\u0434\u044b (Outputs)",transactions:"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","pending-txs":"\u041d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",backup:"\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435",explorer:"Skycoin \u044d\u043a\u0441\u043f\u043b\u043e\u0440\u0435\u0440",seed:"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f",qrcode:"QR-\u043a\u043e\u0434"},header:{"syncing-blocks":"\u0418\u0434\u0451\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432...",update1:"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430",update2:"\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e.","pending-txs1":"\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","pending-txs2":"\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.","pending-txs3":"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0442\u044c\u044e.",errors:{"no-connections":"\u041d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u0432\u0430\u0448 \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0437\u043b\u0430\u043c!","no-backend1":"\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443. \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u0435\u044c \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435","no-backend2":"\u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c\u0435.","no-backend3":"",csrf:"\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438: CSRF \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442."}},password:{title:"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c",label:"\u041f\u0430\u0440\u043e\u043b\u044c","confirm-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c",button:"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"},buy:{"deposit-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430:","select-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441",generate:"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c","deposit-location":"\u0410\u0434\u0440\u0435\u0441 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f","deposit-location-desc":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f Skycoin, \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430.","make-choice":"\u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0432\u044b\u0431\u043e\u0440","wallets-desc":"\u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0430\u0434\u0440\u0435\u0441\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430. \u041e\u0434\u0438\u043d \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d \u043a \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0430\u0434\u0440\u0435\u0441\u043e\u0432.",send:"\u041f\u043e\u0448\u043b\u0438\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443","send-desc":"\u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0432\u0430\u043c\u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u043d\u0438\u0436\u0435. \u041f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 {{ rate }} Skycoin/Selected Coin.","fraction-warning":"\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.",receive:"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Skycoin","receive-desc":"\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u0430\u0432\u0430\u043b\u044e\u0442\u044b, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u043d\u0435\u0439, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u043b\u0430\u0442\u044b \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u0438.","status-button":"\u0421\u0442\u0430\u0442\u0443\u0441:","check-status-button":"\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441","new-order-button":"\u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u043a\u0430\u0437",refresh:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c","available-now":"\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e:","choose-preference":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b. \u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b.",choose:"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u043b\u044e\u0431\u0438\u043c\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u0443 ;)","send-coin":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","send-coin-text-1":"\u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043d\u0438\u0436\u0435. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u043d\u0430 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0435, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u043f\u043e \u043a\u0443\u0440\u0441\u0443"},wizard:{"wallet-desc":'\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 Skycoin, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0444\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0444\u0440\u0430\u0437\u0430 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430" \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u0444\u0440\u0430\u0437\u0443.',"encrypt-desc":"\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0442\u0438, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0435\u0433\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u0435.","finish-button":"\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434",confirm:{title:"\u0414\u0435\u0440\u0436\u0438\u0442\u0435 \u0441\u0432\u043e\u044e \u0444\u0440\u0430\u0437\u0443 \u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435!",desc:"\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0444\u0440\u0430\u0437\u0443 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0435\u0451 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u041f\u0440\u0438 \u0443\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0443 Skycoin!",checkbox:"\u041a\u043b\u044f\u043d\u0443\u0441\u044c. \u042f \u0437\u0430\u043f\u0438\u0441\u0430\u043b.",button:"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"}},wallet:{"new-address":"\u041d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441","show-empty":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435","hide-empty":"\u0421\u043a\u0440\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435",encrypt:"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a",decrypt:"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a",edit:"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0432\u043e\u0430\u0442\u044c",add:"\u041d\u043e\u0432\u044b\u0439 \u043a\u043e\u0448\u0435\u043b\u0451\u043a",load:"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","encryption-enabled":"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d","encryption-disabled":"\u0411\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f",wallet:"\u041a\u043e\u0448\u0435\u043b\u0451\u043a",new:{"create-title":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","load-title":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","encrypt-title":"\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","name-label":"\u0418\u043c\u044f \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","seed-label":"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f","confirm-seed-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443","seed-warning":"\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0430 \u0444\u0440\u0430\u0437\u0443 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0432 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0432 \u0434\u0430\u043b\u0438 \u043e\u0442 \u0447\u0443\u0436\u0438\u0445 \u0433\u043b\u0430\u0437. \u041f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Skycoin \u043a\u043e\u0448\u0435\u043b\u0451\u043a!","create-button":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c","load-button":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","12-words":"12 \u0441\u043b\u043e\u0432","24-words":"24 \u0441\u043b\u043e\u0432\u0430","generate-12-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 12 \u0441\u043b\u043e\u0432","generate-24-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 24 \u0441\u043b\u043e\u0432",encrypt:"\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435","encrypt-warning":"\u041c\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0448\u0438 \u043a\u0430\u0448\u0435\u043b\u044c\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f. \u0422\u0430\u043a \u0436\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0444\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435."},rename:{title:"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","name-label":"\u0418\u043c\u044f","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","rename-button":"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c"},address:{copy:"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c","copy-address":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441",copied:"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e!",outputs:"\u041d\u0435\u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u044b\u0435 \u0432\u044b\u0445\u043e\u0434\u044b (Unspent Outputs)"}},send:{"from-label":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441","to-label":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430","amount-label":"\u0421\u0443\u043c\u043c\u0430","notes-label":"\u0417\u0430\u043c\u0435\u0442\u043a\u0438","wallet-label":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a","addresses-label":"\u0410\u0434\u0440\u0435\u0441","addresses-help":"\u0410\u0434\u0440\u0435\u0441 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","change-address-label":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430","change-address-help":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0441\u0434\u0430\u0447\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u043d\u0435 \u0443\u043a\u0430\u0436\u0438\u0442\u0435, \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438","destinations-label":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439","destinations-help1":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0441\u0443\u043c\u043c\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","destinations-help2":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439, \u0441\u0443\u043c\u043c\u0430 Skycoin & CH \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","hours-allocation-label":"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u044b (CH)","options-label":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","value-label":"\u0424\u0430\u043a\u0442\u043e\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0447\u0430\u0441\u043e\u0432 (CH)","value-help":"\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0430\u043a\u0442\u043e\u0440, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 CH \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439","preview-button":"\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440","send-button":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434",simple:"\u041e\u0431\u044b\u0447\u043d\u044b\u0439",advanced:"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439"},tx:{transaction:"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f","confirm-transaction":"\u041f\u043e\u0434\u0442\u0435\u0440\u0434\u0438\u0442\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e",from:"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c",to:"\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c",date:"\u0414\u0430\u0442\u0430",status:"\u0421\u0442\u0430\u0442\u0443\u0441",coins:"\u0421\u0443\u043c\u043c\u0430",hours:"\u0427\u0430\u0441\u044b",id:"TX ID","show-more":"\u0418\u043d\u0444\u043e","hours-sent":"\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c","hours-burned":"\u0441\u0436\u0438\u0433\u0430\u0435\u043c",inputs:"\u0412\u0445\u043e\u0434\u044b",outputs:"\u0412\u044b\u0445\u043e\u0434\u044b",confirmed:"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430",pending:"\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435","current-rate":"\u041f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043a\u0443\u0440\u0441\u0443"},backup:{"wallet-directory":"\u041f\u0430\u043f\u043a\u0430 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430:","seed-warning":"\u0414\u0415\u0420\u0416\u0418\u0422\u0415 \u0424\u0420\u0410\u0417\u0423 \u0412\u041e\u0421\u0422\u0410\u041d\u041e\u0412\u041b\u0415\u041d\u0418\u042f \u0412 \u041d\u0410\u0414\u0401\u0416\u041d\u041e\u041c \u041c\u0415\u0421\u0422\u0415. \u041d\u0410 \u0411\u0423\u041c\u0410\u0413\u0415. \u041e\u0424\u0424\u041b\u0410\u0419\u041d. \u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u043c\u043e\u0433 \u0435\u0451 \u043f\u043e\u0434\u0433\u043b\u044f\u0434\u0435\u0442\u044c - \u0432\u0430\u0448\u044b \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.",desc:"\u0418\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0438\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0440\u0430\u0437\u044b \u0434\u043b\u044f \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432.
\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0444\u0440\u0430\u0437 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\u0445 \u0431\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0438 \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u043d\u0435\u0439 \u0444\u0430\u0439\u043b\u044b \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c .wlt. \u0424\u0440\u0430\u0437\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0438\u0445. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043b\u044e\u0431\u043e\u0433\u043e (\u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e) \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430","close-button":"\u0417\u0430\u043a\u0440\u044b\u0442\u044c",wallet:"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430",filename:"\u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430",seed:"\u0424\u0440\u0430\u0437\u0430","show-seed":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443","no-wallets":"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432 \u0441 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u0442"},blockchain:{blocks:"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432",time:"\u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430",hash:"\u0425\u044d\u0448 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430","current-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","current-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442"},network:{peer:"\u041f\u0438\u0440 (Peer)",source:"\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a","block-height":"\u0412\u044b\u0441\u043e\u0442\u0430 \u0431\u043b\u043e\u043a\u0430","last-seen":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a","last-received":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b\u0439","last-sent":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b\u0439",in:"\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0435",out:"\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435",sources:{default:"\u041f\u0438\u0440 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",exchange:"\u041e\u0431\u043c\u0435\u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438"}},"pending-txs":{timestamp:"\u041c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438",txid:"ID \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",none:"\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0442\u0440\u0430\u043d\u0430\u0437\u043a\u0446\u0438\u0439 \u0436\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439",my:"\u041c\u043e\u0439",all:"\u0412\u0441\u0435"},history:{"tx-detail":"\u0414\u0435\u0442\u0430\u043b\u0438 \u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",sending:"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c",sent:"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e",received:"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e",receiving:"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c",pending:"\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f","no-txs":"\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439"},teller:{done:"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e","waiting-confirm":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439","waiting-deposit":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0434\u0435\u043f\u043e\u0437\u0438\u0442","waiting-send":"\u041f\u043e\u0441\u044b\u043b\u0430\u0435\u043c Skycoin",unknown:"\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e"}}}}); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.e99a3fcb8d9c8f814e72.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.e99a3fcb8d9c8f814e72.js new file mode 100644 index 0000000000..cf051341b4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.e99a3fcb8d9c8f814e72.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{"ZF/7":function(e){e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Cargando...","done-title":"Listo","warning-title":"Advertencia","error-title":"Error","changes-made":"Los cambios se han hecho.","back-button":"Volver","create-button":"Crear","load-button":"Cargar","cancel-button":"Cancelar","continue-button":"Continuar","close-button":"Cerrar","generic-confirmation-check":"Entiendo los riesgos y deseo continuar","copied":"El texto ha sido copiado al portapapeles."},"errors":{"window-size":"La ventana es demasiado estrecha para el contenido."},"language":{"title":"Seleccionar Lenguaje"},"header":{"syncing-blocks":"Sincronizando bloques","explorer-link":"Explorador de {{ coinName }}","warnings":{"update-part1":"La actualizaci\xf3n","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"est\xe1 disponible.","synchronizing":"La billetera est\xe1 sincronizando. Los datos mostrados pueden estar desactualizados.","pending-txs-part1":"Hay una o m\xe1s","pending-txs-part2":"transacciones pendientes.","pending-txs-part3":"Los datos mostrados pueden estar desactualizados.","no-connections":"Sin conexiones activas, \xa1el cliente no est\xe1 conectado a otros nodos!","no-backend-part1":"Sin acceso al servidor. Por favor, reinicie la aplicaci\xf3n y/o cont\xe1ctenos v\xeda","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Vulnerabilidad de seguridad: CSRF no funciona. Por favor, salga de inmediato."}},"password":{"title":"Introduzca Su Contrase\xf1a","password-label":"Contrase\xf1a","password-error-info":"Debe ingresar una contrase\xf1a.","confirm-password-label":"Confirmar contrase\xf1a","confirm-error-info":"Las dos contrase\xf1as deben coincidir.","proceed-button":"Proceder","reset-link":"He olvidado mi contrase\xf1a","incorrect-password-error":"Contrase\xf1a incorrecta.","decrypting-error":"Error al desencriptar la billetera"},"buy":{"title-and-button":"Comprar","deposit-address":"Seleccione una direcci\xf3n para la cual generar un enlace de dep\xf3sito BTC:","select-address":"Seleccione una direcci\xf3n","generate":"Generar","deposit-location":"Localizaci\xf3n de Dep\xf3sito","deposit-location-desc":"Seleccione la billetera en la que desea que le depositemos sus Skycoins despu\xe9s de recibir los Bitcoins.","make-choice":"Realice una selecci\xf3n","wallets-desc":"Una nueva direcci\xf3n BTC es generada cada vez que se selecciona una nueva billetera y direcci\xf3n. Una \xfanica direcci\xf3n de Skycoin puede tener asignadas hasta 5 direcciones BTC.","send":"Enviar Bitcoins","send-desc":"Env\xede Bitcoins a la direcci\xf3n abajo indicada. Al recibirlos, le depositaremos los Skycoins en una nueva direcci\xf3n en la billetera seleccionada m\xe1s arriba, a la tasa de cambio actual de {{ rate }} SKY/BTC.","fraction-warning":"\xa1Env\xede s\xf3lo m\xfaltiplos de la tasa SKY/BTC! Los Skycoins son enviados en n\xfameros enteros, \xa1no se env\xedan fracciones de SKY!","receive":"Recibir SKY","receive-desc":"Despu\xe9s de recibir los Bitcoins, le enviaremos sus Skycoins. El tiempo de espera para recibir sus SKY puede ser de entre 20 minutos y una hora.","status-button":"Estatus:","check-status-button":"Revisar Estatus","new-order-button":"Nueva Orden"},"wizard":{"create-title":"Crear Billetera","create-desc":"Si no tiene una billetera de {{ coinName }}, use la semilla generada autom\xe1ticamente para crear una nueva. Si ya tiene una billetera, seleccione \\"Cargar\\" e introduzca su semilla.","encrypt-title":"Encriptar Billetera","encrypt-desc":"Incremente la seguridad de su billetera encript\xe1ndola. Al introducir una contrase\xf1a m\xe1s abajo, su billetera ser\xe1 encriptada. S\xf3lo quien tenga la contrase\xf1a podr\xe1 acceder a la billetera y retirar fondos.","hardware-wallet-link":"\xbfUtilizando una Skywallet?","new-button":"Nueva","load-button":"Cargar","finish-button":"Finalizar","confirm":{"title":"\xa1Resguarde Su Semilla!","desc":"Queremos asegurarnos de que ha anotado su semilla y la ha almacenado en un lugar seguro. \xa1Si olvida su semilla, NO podr\xe1 recuperar su billetera!","checkbox":"Est\xe1 segura, lo garantizo."}},"wallet":{"title-and-button":"Billeteras","show-empty-button":"Mostrar Vac\xedas","hide-empty-button":"Ocultar Vac\xedas","encrypt-button":"Encriptar Billetera","decrypt-button":"Desencriptar Billetera","decrypt-warning":"Advertencia: por razones de seguridad, no se recomienda mantener las carteras desencriptadas. Se aconseja precauci\xf3n.","delete-button":"Borrar Billetera","edit-button":"Renombrar","add-button":"Agregar Billetera","load-button":"Cargar Billetera","hardware-wallet-button":"Skywallet","encryption-enabled":"Encriptado habilitado.","encryption-disabled":"Encriptado deshabilitado.","warning-hw-security":"Posible riesgo de seguridad. Acceda a las opciones de la Skywallet (presionando el bot\xf3n \\"Skywallet\\" debajo de la lista de billeteras) mientras el dispositivo est\xe1 conectado, para m\xe1s informaci\xf3n.","wallet-table-label":"Billetera","hardware-wallet-table-label":"Skywallet","delete-confirmation":"ADVERTENCIA: la billetera \\"{{ name }}\\" ser\xe1 removida de la lista. Para agregarla nuevamente, deber\xe1 volver a conectar el dispositivo y abrir las opciones de la Skywallet (presionando el bot\xf3n \\"Skywallet\\" debajo de la lista de las billeteras). \xbfDesea continuar?","delete-confirmation-check":"S\xed, quiero borrar la billetera","max-hardware-wallets-error":"Ya ha alcanzado el n\xfamero m\xe1ximo de direcciones que se puede agregar a la Skywallet.","add-many-confirmation":"ADVERTENCIA: si agrega demasiadas direcciones sin usar las anteriores o si usa las \xfaltimas y no las primeras, es posible que algunas direcciones no se recuperen autom\xe1ticamente si intenta restaurar la billetera con la semilla (tendr\xe1 que agregarlas manualmente). \xbfDesea continuar?","new":{"create-title":"Crear Billetera","load-title":"Cargar Billetera","name-label":"Nombre","name-error-info":"Debe ingresar un nombre.","words-number-label":"Cuantas palabras tiene la semilla","seed-label":"Semilla","seed-error-info":"Debe ingresar una semilla.","confirm-seed-label":"Confirmar semilla","confirm-seed-error-info":"Las dos semillas deben coincidir.","seed-warning":"\xa1Recuerde esta semilla! Mant\xe9ngala en un lugar seguro. \xa1Si olvida su semilla, no podr\xe1 recuperar la billetera!","12-words":"12 palabras","24-words":"24 palabras","generate-12-help":"Generar una semilla de 12 palabras.","generate-24-help":"Generar una semilla de 24 palabras.","encrypt-check":"Encriptar billetera","encrypt-warning":"Le sugerimos que encripte con una contrase\xf1a cada una de sus billeteras. Si olvida su contrase\xf1a, puede restaurarla con la semilla. Aseg\xfarese de guardar su semilla en un lugar seguro antes de encriptar la billetera.","seed-checking-error":"No fue posible verificar la validez de la semilla.","unconventional-seed-title":"Posible Error","unconventional-seed-text":"Usted introdujo una semilla no convencional. Si lo hizo por alguna raz\xf3n en especial, puede continuar (s\xf3lo recomendable para usuarios avanzados). Sin embargo, si su intenci\xf3n es utilizar una semilla normal del sistema, usted debe borrar los textos y/o caracteres especiales adicionales.","unconventional-seed-check":"Continuar con la semilla no convencional","synchronizing-warning-text":"La billetera todav\xeda est\xe1 sincronizando los datos y la operaci\xf3n podr\xeda no restaurar todas las direcciones. Si algunas direcciones no son restauradas, usted deber\xe1 esperar a que la billetera est\xe9 totalmente sincronizada y usar la opci\xf3n \\"Escanear Direcciones\\" o agregarlas nuevamente de forma manual.","wallet-created":"La billetera ha sido agregada a la lista.","seed":{"enter-seed":"Presione aqu\xed para ingresar la semilla","change-seed":"Presione para cambiar","confirm-seed":"Presione aqu\xed para confirmar la semilla","confirmed-seed":"Semilla confirmada","use-custom":"Ingresar la semilla manualmente","use-normal":"Ingresar la semilla usando el m\xe9todo recomendado","custom-seed-warning-text":"Esta opci\xf3n solo es recomendada para usuarios avanzados. Cometer errores con la semilla puede hacer que pierda el acceso a los fondos en caso de que surja alg\xfan problema.","custom-seed-warning-text-recovering":"Para evitar posibles problemas, esta opci\xf3n solo debe usarse si desea recuperar una semilla no convencional.","incorrect-word-error":"La palabra que ha ingresado no coincide con la que se ha solicitado.","invalid-seed-error":"La semilla que ha ingresado no es v\xe1lida. Por favor, vuelva a intentarlo.","enter-word":"Ingrese la palabra n\xfamero {{number}}","word-error-info":"Debe ingresar una palabra.","new-seed-info":"Usted debe ingresar las palabras de la semilla que fue generada por el sistema, para confirmarla.","recover-seed-info":"Por favor, aseg\xfarese de ingresar las palabras correctas en el orden correcto."}},"rename":{"title":"Renombrar Billetera","name-label":"Nombre","label-error-info":"Debe ingresar un nombre.","rename-button":"Renombrar"},"address-options":{"title":"Direcciones","new":"Nuevas Direcciones","scan":"Escanear Direcciones","scan-help":"Use esta opci\xf3n para hacer que el sistema encuentre direcciones ya usadas de esta billetera que faltan en la lista."},"scan-addresses":{"done-with-new-addresses":"La lista ha sido actualizada.","done-without-new-addresses":"No se encontraron nuevas direcciones."},"add-addresses":{"title":"Seleccionar Cantidad","quantity-label":"Cantidad de direcciones a crear","quantity-error-info":"Debe ingresar un valor entre 1 y 100.","error":"Hubo un error inesperado. Por favor, int\xe9ntelo de nuevo."},"address":{"show":"Presione para mostrar","copy":"Copiar","copy-address":"Copiar direcci\xf3n","copied":"\xa1Copiado!","confirm":"Confirmar direcci\xf3n","outputs":"Salidas no gastadas","history":"Historial"}},"qr":{"title":"C\xf3digo QR","data-label":"Datos del c\xf3digo QR","address-label":"Direcci\xf3n","request-link":"Solicitar monto espec\xedfico","amount-label":"Monto solicitado","hours-label":"Horas solicitadas","message-label":"Mensaje","invalid":"(valor inv\xe1lido)"},"send":{"title-and-button":"Enviar","unsigned-button":"Sin firmar","signed-button":"Firmada","unsigned-confirmation":"El formulario de transacciones sin firmar no permite enviar transacciones normalmente, sino que simplemente crea el texto de la transacci\xf3n, el cual debe ser firmado antes de que pueda ser enviado a la red. Esto es \xfatil para crear transacciones que ser\xe1n firmadas en un equipo que siempre est\xe1 fuera de l\xednea, por razones de seguridad. \xbfDesea continuar?","synchronizing-warning":"La billetera todav\xeda est\xe1 sincronizando los datos, por lo que el saldo que se muestra puede ser incorrecto. \xbfSeguro de que desea continuar?","from-label":"Enviar desde","to-label":"Enviar a","amount-label":"Cantidad","personal-note-label":"Nota personal","personal-note-help":"Use este campo para agregar un texto que le permita identificar la transacci\xf3n en el futuro. Este texto se guarda localmente, por lo que solo ser\xe1 visible desde esta computadora.","wallet-label":"Billetera","wallet-error-info":"Debe seleccionar una billetera.","invalid-amount":"Por favor introduzca una cantidad v\xe1lida","convert-confirmation":"\xbfTambi\xe9n desea que la cantidad introducida se convierta de {{from}} a {{to}}?","convert-confirmation-plural":"\xbfTambi\xe9n desea que las cantidades introducidas se conviertan de {{from}} a {{to}}?","send-all-available-coins-link":"enviar todo","precision-error-warning":"Se detect\xf3 un error de precisi\xf3n durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","invaid-amount-warning":"Se detect\xf3 un valor inv\xe1lido durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","precision-errors-warning":"Se detectaron errores de precisi\xf3n durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","invaid-amounts-warning":"Se detectaron valores inv\xe1lidos durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","multiple-problems-warning":"Algunos valores no se convirtieron por ser inv\xe1lidos o podr\xedan haberse convertido con errores de precisi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","addresses-label":"Direcciones","addresses-error-info":"Debe ingresar al menos una direcci\xf3n v\xe1lida.","no-wallet-selected-error":"No hay monedas para enviar.","no-coins-left-error":"No hay monedas restantes para enviar.","addresses-help":"Limite las direcciones desde donde se podr\xedan enviar las monedas y las horas.","addresses-manual-help":"Lista de las direcciones desde las cuales se enviar\xe1n las monedas, separadas por comas. Todas las direcciones deben pertenecer a la misma billetera o no podr\xe1 firmar la transacci\xf3n con la billetera de escritorio.","all-addresses":"Todas las direcciones de la billetera seleccionada","outputs-label":"Salidas no gastadas","outputs-help":"Limite las salidas no gastadas desde donde se podr\xedan enviar las monedas y las horas. Solo se muestran las salidas de las direcciones seleccionadas.","outputs-error":"Hubo un error al intentar obtener las salidas. Por favor aseg\xfarese de haber ingresado direcciones v\xe1lidas.","all-outputs":"Todas las salidas no gastadas de las direcciones seleccionadas","enter-addresses-for-outputs":"Debe ingresar direcciones v\xe1lidas primero","enter-wallet-for-outputs-and-addresses":"Debe seleccionar una billetera v\xe1lida primero","invalid-addresses-for-outputs":"No hay salidas disponibles","available-funds-msg-part1":"Con su selecci\xf3n actual puede enviar hasta","available-funds-msg-part2":"y","available-funds-msg-part3":"(al menos","available-funds-msg-part4":"deben ser utilizadas como tarifa de transacci\xf3n para enviar todas las monedas u horas).","change-address-label":"Direcci\xf3n de retorno personalizada","change-address-error-info":"La direcci\xf3n de retorno no es v\xe1lida.","change-address-select-from-list-link":"Seleccionar","change-address-help":"Direcci\xf3n para recibir el cambio. Si no se proporciona, ser\xe1 elegida autom\xe1ticamente. Haga clic en el enlace \\"Seleccionar\\" para elegir una direcci\xf3n de una de sus billeteras.","specific-hours":"Horas a enviar:","remove-specific-hours-info":"Remover.","remove-specific-hours-confirmation":"\xbfSeguro que desea eliminar la cantidad espec\xedfica de horas a enviar?","destinations-label":"Destinos","destinations-help1":"Direcciones de destino y sus monedas.","destinations-help2":"Direcciones de destino, sus monedas y horas.","destination-tools-title":"Herramientas de destino","hours-allocation-check":"Usar una distribuci\xf3n autom\xe1tica de {{ coinHoursName }}","options-link":"Opciones","coin-hours-options-link":"Opciones de horas","hours-share-factor-label":"Factor de distribuci\xf3n de {{ coinHoursName }}","hours-share-factor-help":"Este control permite seleccionar el porcentaje de {{ coinHoursName }} que ser\xe1n enviadas. de Mientras mayor sea el valor, m\xe1s {{ coinHoursName }} se enviar\xe1n y menos ser\xe1n retenidas.","close-hours-share-factor-alert":"La opci\xf3n se restablecer\xe1 al valor predeterminado. Seguro que desea continuar?","preview-button":"Preview","send-button":"Enviar","show-button":"Mostrar","simple-form-button":"Simple","advanced-form-button":"Advanzado","select-wallet":"Seleccionar billetera","saving-note-error":"La transacci\xf3n se envi\xf3 correctamente, pero no fue posible guardar la nota.","sent":"La transacci\xf3n se envi\xf3 correctamente.","total-to-send":"Total:","invalid-address-error":"La direcci\xf3n de destino no es v\xe1lida.","one-invalid-address-error":"Una de las direcciones de destino no es v\xe1lida.","various-invalid-addresses-error":"Algunas direcciones de destino no son v\xe1lidas.","all-addresses-invalid-error":"Las direcciones de destino no son v\xe1lidas.","invalid-addresses-error":"Por favor aseg\xfarese de que la direcci\xf3n sea v\xe1lida.","address-error-info":"Por favor introduzca una direcci\xf3n v\xe1lida.","invalid-value-error-info":"Valor inv\xe1lido.","insufficient-funds-error-info":"El valor ingresado es mayor que el saldo disponible.","sending-all-hours-with-coins-waning":"Al enviar todas las monedas, todas las horas de la billetera seleccionada ser\xe1n enviadas o quemadas. Si desea retener horas, no debe enviar todas las monedas. \xbfSeguro que desea continuar?","advanced-sending-all-hours-with-coins-waning":"Al enviar todas las monedas, todas las horas de la(s) fuente(s) seleccionada(s) ser\xe1n enviadas o quemadas. Si desea retener horas, no debe enviar todas las monedas. \xbfSeguro que desea continuar?","sending-all-hours-waning":"Usted seleccion\xf3 enviar todas las horas. \xbfSeguro que desea continuar?","high-hours-share-waning":"Su selecci\xf3n puede resultar en el env\xedo de todas las horas de la billetera seleccionada. \xbfSeguro que desea continuar?","advanced-high-hours-share-waning":"Su selecci\xf3n puede resultar en el env\xedo de todas las horas de la(s) fuente(s) seleccionada(s). \xbfSeguro que desea continuar?","fill-with-link":{"title":"Utilizar un link de transacci\xf3n","link-info":"Aqu\xed puede ingresar un link que se le hubiese enviado solicitando monedas. El formulario se rellenar\xe1 con los datos obtenidos del link.","link-label":"Link de transacci\xf3n","link-error-info":"Debe ingresar un link de transacci\xf3n v\xe1lido.","process-button":"Procesar","invalid-link-error":"El contenido del link de transacci\xf3n no es v\xe1lido.","invalid-link-hours-error":"El link de transacci\xf3n contiene una cantidad de horas no v\xe1lida.","data-overwritten-alert":"Se sobrescribir\xe1n algunos datos que ha introducido. Seguro de que desea continuar?","confirmation":"El formulario se ha actualizado con los datos obtenidos del link de transacci\xf3n."},"known-node-errors":{"null-change-address-error":"La direcci\xf3n nula no se puede utilizar como direcci\xf3n de retorno personalizada. Por favor introduzca una direcci\xf3n v\xe1lida.","to-required-error":"Debe proporcionar una direcci\xf3n de destino para enviar monedas. Por favor introduzca una direcci\xf3n v\xe1lida.","zero-coins-error":"No es posible enviar cero monedas. Por favor introduzca una cantidad v\xe1lida.","null-destination-error":"La direcci\xf3n nula no se puede utilizar como direcci\xf3n de destino. Por favor introduzca una direcci\xf3n v\xe1lida.","duplicate-destination-error":"Hay destinos duplicados. Por favor no repita la misma direcci\xf3n y cantidad en m\xe1s de un destino.","hours-in-automatic-mode-error":"No se pueden especificar cantidades de horas mientras se usa la distribuci\xf3n autom\xe1tica de horas. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","hours-allocation-mode-needed-error":"Se requiere el modo de asignaci\xf3n de horas. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","invalid-hours-allocation-mode-error":"Modo de asignaci\xf3n de horas no v\xe1lido. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","hours-allocation-mode-not-needed-error":"El modo de asignaci\xf3n de horas no se puede especificar mientras se usa la distribuci\xf3n de horas manual. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","invalid-hours-mode-error":"M\xe9todo de distribuci\xf3n de horas no v\xe1lido. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","share-factor-needed-error":"Se necesita el factor de distribuci\xf3n de horas. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","share-factor-not-needed-error":"El factor de distribuci\xf3n de horas no puede ser especificado mientras se usa la distribuci\xf3n de horas manual. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","invalid-share-factor-error":"Factor de distribuci\xf3n de horas inv+alido. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","change-equal-to-destination-error":"No es posible crear la transacci\xf3n debido a que se regresar\xeda una cantidad repetida de monedas a la misma direcci\xf3n de destino. Por favor int\xe9ntelo nuevamente con valores diferentes.","repeated-wallet":"Una billetera para la semilla indicada ya existe."},"bulk-send":{"title":"Env\xedo Masivo","indications":"Para enviar a m\xfaltiples destinos de forma r\xe1pida, escriba cada direcci\xf3n, cantidad de monedas y cantidad de horas (opcional) en una l\xednea, separadas por una coma. Ejemplo: si desea enviar 10 monedas y 5 horas a la direcci\xf3n \\"xyz\\", escriba \\"xyz,10,5\\"; si desea que las horas se calculen autom\xe1ticamente, escriba \\"xyz,10\\". Los valores decimales se deben separar con un punto.","data-error-info":"Debe ingresar un valor.","process-button":"Procesar","no-data-error":"No hay texto para procesar.","inconsistent-data-error":"Si establece cu\xe1ntas horas desea enviar a un destino, debe hacerlo para todos los destinos.","invalid-data-error":"El texto ingresado tiene un formato inv\xe1lido."}},"select-address":{"title":"Seleccionar Direcci\xf3n","no-addresses":"No hay direcciones confirmadas en esta billetera."},"offline-transactions":{"loading-problem":"Error al intentar obtener los datos necesarios","wallet-error-info":"Debe seleccionar una billetera.","tx-error-info":"Debe ingresar un texto de transacci\xf3n v\xe1lido.","copy-tx":{"signed-title":"Transacci\xf3n Firmada","unsigned-title":"Transacci\xf3n Sin Firmar","text-unsigned":"Esta es la transacci\xf3n sin firmar que se ha creado con los datos que ha ingresado. Por favor copie el texto para poder firmarlo con la opci\xf3n \\"Firmar transacci\xf3n\\".","text-signed":"Esta es la transacci\xf3n firmada. Puede enviarla a la red utilizando la opci\xf3n \\"Transmitir Transacci\xf3n\\".","input-label":"Texto de la transacci\xf3n","copy-button":"Copiar","reset-confirmation":"\xbfDesea que se limpie el formulario, de forma que pueda crear otra transacci\xf3n?","reset-done":"El formulario ha sido limpiado."},"sign-tx":{"title":"Firmar Transacci\xf3n","text":"Use este formulario para firmar una transacci\xf3n. Para que la operaci\xf3n funcione correctamente debe seleccionar la billetera que incluye todas las entradas/direcciones utilizadas para enviar monedas en la transacci\xf3n.","wallet-label":"Billetera","select-wallet":"Seleccione una billetera","input-label":"Texto de la transacci\xf3n","sign-button":"Firmar","signed":"La transacci\xf3n ha sido firmada."},"broadcast-tx":{"title":"Transmitir Transacci\xf3n","text":"Use este formulario para enviar una transacci\xf3n firmada a la red.","input-label":"Texto de la transacci\xf3n","send-button":"Enviar","sent":"La transacci\xf3n ha sido enviada."}},"reset":{"title":"Restablecer Contrase\xf1a","wallet-label":"Billetera","seed-label":"Semilla de la billetera","seed-error-info":"Debe ingresar una semilla.","password-label":"Nueva contrase\xf1a (deje en blanco si desea que la billetera no est\xe9 encriptada)","confirm-label":"Confirme la contrase\xf1a","confirm-error-info":"Las dos contrase\xf1as deben coincidir.","reset-button":"Restablecer","done":"Contrase\xf1a cambiada correctamente."},"tx":{"transaction-title":"Transacci\xf3n","confirm-transaction-title":"Confirmar Transacci\xf3n","from-small-label":"Desde:","to-small-label":"A:","date-small-label":"Fecha:","status-small-label":"Estatus:","coins-small-label":"Monedas:","hours-small-label":"Horas:","id-small-label":"Tx ID:","note-small-label":"Nota:","without-note":"Sin nota","show-more-link":"Mostrar m\xe1s","hours-moved":"movida(s)","hours-sent":"enviada(s)","hours-received":"recibida(s)","hours-burned":"quemada(s)","inputs-title":"Entradas","outputs-title":"Salidas","confirmed-transaction":"Confirmada","pending-transaction":"Pendiente","current-rate-help":"Calculado a la tasa actual."},"edit-note":{"title":"Editar Nota","change-button":"Cambiar"},"backup":{"title":"Respaldar Billetera","wallet-directory":"Directorio de la Billetera:","seed-warning":"RESPALDE SU SEMILLA. EN PAPEL. EN UN LUGAR SEGURO. Mientras tenga su semilla, podr\xe1 recuperar las monedas.","desc":"Use la tabla de m\xe1s abajo para obtener las semillas de sus billeteras encriptadas.
Para obtener las semillas de las billeteras no encriptadas, abra el directorio de m\xe1s arriba, abra los archivos .wlt en un editor de texto y recupere las semillas.","wallet-table-label":"Nombre de la billetera","filename-table-label":"Archivo","save-addresses-button":"Guardar Direcciones","show-seed-button":"Mostrar semilla","no-wallets":"No hay billeteras","unencrypted-info":"Por razones de seguridad, no es posible mostrar las semillas de las billeteras sin encriptar. Para obtener la semilla, por favor encripte la billetera con una contrase\xf1a o siga las instrucciones en la parte superior de esta p\xe1gina.","hw-wallet-info":"Para obtener la semilla de una Skywallet, por favor use la opci\xf3n \\"Skywallet\\" de la parte inferior de la p\xe1gina de billeteras.","not-compatible-error":"Su navegador web no es compatible con esta funci\xf3n.","seed-modal-window":{"title":"Semilla de la Billetera","seed-label":"Semilla"}},"blockchain":{"title":"Blockchain","blocks-label":"Cantidad de bloques","time-label":"Fecha del \xfaltimo bloque","hash-label":"Hash del \xfaltimo bloque","current-supply-label":"Suministro de {{ coinName }} actual","total-supply-label":"Suministro de {{ coinName }} total","current-coinhour-supply-label":"Suministro de {{ coinHoursName }} actual","total-coinhour-supply-label":"Suministro de {{ coinHoursName }} total"},"network":{"title":"Red","peer-small-table-label":"Par","source-small-table-label":"Fuente","block-height-small-table-label":"Altura del bloque","block-height-short-small-table-label":"Bloque","last-seen-small-table-label":"\xdaltima vez visto","last-received-help":"\xdaltima recepci\xf3n.","last-sent-help":"\xdaltimo env\xedo.","in-help":"Entrante.","out-help":"Saliente.","sources":{"default":"Par por defecto","exchange":"Intercambio de pares"}},"pending-txs":{"title":"Transacciones Pendientes","timestamp-table-label":"Fecha","txid-table-label":"ID de la transacci\xf3n","none":"Actualmente no hay transacciones pendientes","my-transactions-button":"M\xedas","all-transactions-button":"Todas"},"outputs":{"title":"Salidas","error-no-outputs":"No hay salidas no gastadas"},"history":{"title-and-button":"Historial","tx-detail-title":"Detalles de la Transacci\xf3n","moving":"Moviendo {{ coinName }} internamente","moved":"{{ coinName }} movido internamente","sending":"Enviando {{ coinName }}","sent":"{{ coinName }} enviado","received":"{{ coinName }} recibido","receiving":"Recibiendo {{ coinName }}","pending-indication":"Pendiente","transaction-note-small-label":"Nota:","no-txs":"Usted no tiene historial de transacciones","no-txs-filter":"No hay transacciones que coincidan con los criterios de filtro actuales","no-filter":"Sin filtros activos (presione para seleccionar billeteras/direcciones)","filter":"Filtro activo: ","filters":"Filtros activos: ","all-addresses":"Todas las direcciones","view-all":"Ver todas las {{ number }} transacciones"},"teller":{"done":"Completado","waiting-confirm":"Esperando confirmaci\xf3n","waiting-deposit":"Esperando dep\xf3sito de Bitcoins","waiting-send":"Esperando para env\xedar Skycoins","unknown":"Desconocido"},"confirmation":{"default-title":"Confirmaci\xf3n","yes-button":"S\xed","no-button":"No"},"service":{"api":{"no-internet-error":"No cuenta con conexi\xf3n a Internet o el nodo ha dejado de funcionar.","incorrect-password-error":"Contrase\xf1a incorrecta.","unknown-error":"No fue posible realizar la operaci\xf3n.","api-disabled-error":"API deshabilitada."}},"hardware-wallet":{"general":{"default-wallet-name":"Nueva Skywallet","confirm":"Por favor, confirme la operaci\xf3n en la Skywallet.","confirm-and-more":"Por favor confirme la operaci\xf3n en la Skywallet y siga las instrucciones.","follow":"Por favor siga las instrucciones mostradas en la Skywallet.","completed":"La operaci\xf3n se realiz\xf3 con \xe9xito.","name-updated":"El nombre utilizado para identificar esta Skywallet en la lista de billeteras se ha actualizado para que coincida con el que se muestra en el dispositivo."},"errors":{"generic-error":"No se puede realizar la operaci\xf3n. Aseg\xfarese de haber conectado una Skywallet v\xe1lida y de que no est\xe9 esperando por alguna confirmaci\xf3n o respuesta.","disconnected":"No se puede realizar la operaci\xf3n. La Skywallet no est\xe1 conectada.","incorrect-wallet":"No se puede realizar la operaci\xf3n. La Skywallet conectada es diferente a la esperada.","incorrect-pin":"No se puede realizar la operaci\xf3n. El PIN que ha introducido no es correcto.","refused":"La operaci\xf3n fall\xf3 o fue cancelada.","too-many-inputs-outputs":"La transacci\xf3n tiene demasiadas entradas o salidas para la Skywallet. Por favor vuelva a intentarlo creando varias transacciones m\xe1s peque\xf1as, cada una con un n\xfamero menor de destinatarios (si la transacci\xf3n actual tiene muchos) o monedas.","daemon-connection":"Problema para conectarse al Skywallet Daemon, por favor aseg\xfarese de que se est\xe9 ejecutando e int\xe9ntelo nuevamente. Usted puede descargarlo desde www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problema para conectarse al Skywallet Daemon, por favor aseg\xfarese de que se est\xe9 ejecutando e int\xe9ntelo nuevamente. Usted puede descargarlo desde ","timeout":"La operaci\xf3n se cancel\xf3 por inactividad. Por favor int\xe9ntelo de nuevo.","invalid-address-generated":"Hubo un problema con el generador de direcciones y la operaci\xf3n tuvo que ser cancelada.","invalid-address":"Direcci\xf3n inv\xe1lida.","not-in-bootloader-mode":"Para usar esta opci\xf3n la Skywallet debe estar en modo bootloader."},"security-warning":{"title":"Advertencia de Seguridad","text":"La \xfaltima vez que se conect\xf3 esta Skywallet, se encontraron una o m\xe1s advertencias de seguridad. Le recomendamos que abra las opciones de Skywallet (presionando el enlace de m\xe1s abajo) mientras el dispositivo est\xe1 conectado y resuelva los problemas de seguridad antes de continuar.","link":"Abrir la ventana de opciones de Skywallet."},"options":{"connecting":"Conectando...","disconnected":"Skywallet no detectada. Por favor, conecte una Skywallet para usar esta opci\xf3n.","unconfigured-detected-title":"Skywallet No Configurada","unconfigured-detected":"Se ha detectado una Skywallet sin semilla. Seleccione \\"Configurar Autom\xe1ticamente\\" si desea configurarla como una billetera nueva y comenzar a usarla. Seleccione \\"Restaurar Copia de Seguridad\\" si desea configurar la Skywallet con la copia de seguridad de una semilla creada anteriormente.","configured-detected":"Skywallet detectada. El dispositivo se identifica en la lista de billeteras como:","security-warnings-title":"Advertencias de Seguridad","security-warning-title":"Advertencia de Seguridad","unchecked-version-warning":"No fue posible verificar si el firmware de su Skywallet est\xe1 actualizado. Esto podr\xeda deberse a problemas con su conexi\xf3n a Internet o a que el servicio est\xe9 en mantenimiento.","outdated-version-warning":"El firmware de su Skywallet est\xe1 desactualizado. Le recomendamos que lo actualice lo antes posible para garantizar la seguridad. Para hacer esto, seleccione la opci\xf3n \\"Actualizar Firmware\\".","backup-warning":"Debe hacer una copia de seguridad de la semilla de su Skywallet o podr\xeda perder acceso a los fondos en caso de problemas. Para hacer esto, seleccione la opci\xf3n \\"Crear Copia de Seguridad\\".","pin-warning":"La Skywallet conectada no tiene un PIN. El c\xf3digo PIN protege la Skywallet de accesos no autorizados. Para crear un c\xf3digo PIN, seleccione la opci\xf3n \\"Crear C\xf3digo PIN\\".","options":"Opciones:","update-firmware":"Actualizar Firmware","configure-automatically":"Configurar Autom\xe1ticamente","restore-backup":"Restaurar Copia de Seguridad","create-backup":"Crear Copia de Seguridad","wipe":"Borrar el Dispositivo","confirm-seed":"Confirmar la Semilla","create-pin":"Crear C\xf3digo PIN","change-pin":"Cambiar el C\xf3digo PIN","delete-pin":"Borrar el C\xf3digo PIN","forgotten-pin-part1":"Si no puede acceder a la billetera porque ha olvidado el PIN, puede borrar la Skywallet y luego restaurarla con la semilla haciendo clic","forgotten-pin-part2":"aqu\xed.","firmware-version":"Versi\xf3n del firmware del dispositivo:"},"update-firmware-warning":{"title":"Firmware Desactualizado","text":"ADVERTENCIA: el firmware de su Skywallet est\xe1 desactualizado. Para mantenerse seguro se le recomienda actualizarlo.","update":"Actualizar"},"update-firmware":{"title-connecting":"Conectando...","title-update":"Actualizar Firmware","title-install":"Instalar Firmware","text-downloading":"Comprobando el dispositivo y descargando archivos...","text-bootloader":"ADVERTENCIA: si ya ha configurado este dispositivo, antes de continuar debe tener una copia de seguridad de su semilla o podr\xeda perder permanentemente el acceso a los fondos.","text-not-bootloader":"Para actualizar el firmware de su Skywallet debe conectarla en modo bootloader (con\xe9ctela al computador mientras presiona los dos botones f\xedsicos del dispositivo). ADVERTENCIA: si ya ha configurado este dispositivo, antes de continuar debe tener una copia de seguridad de su semilla o podr\xeda perder permanentemente el acceso a los fondos.","text-no-firmware":"Le damos la bienvenida. La Skywallet conectada actualmente no tiene un firmware instalado. Ahora se instalar\xe1 un firmware para que pueda comenzar a usar el dispositivo. NOTA: si ya ha configurado este dispositivo y desea recuperar los fondos, necesitar\xe1 la semilla.","follow":"La actualizaci\xf3n del firmware se envi\xf3 a la Skywallet. Por favor contin\xfae el proceso en el dispositivo.","connection-error":"No fue posible descargar el firmware. Esto podr\xeda deberse a problemas con su conexi\xf3n a Internet o a que el servicio est\xe9 en mantenimiento.","timeout":"La operaci\xf3n se cancel\xf3 por inactividad. Por favor desconecte el dispositivo, vuelva a conectarlo e intente nuevamente.","finished":"Su dispositivo ha sido configurado correctamente. Por favor descon\xe9ctelo antes de continuar."},"generate-seed":{"text":"Antes de continuar puede seleccionar el n\xfamero de palabras que desea que tenga la semilla. La semilla es una lista de palabras que se pueden usar para recuperar el acceso a las monedas en caso de problemas. Ambos valores son seguros, por lo que si no tiene una raz\xf3n especial para seleccionar uno u otro, puede dejar el valor predeterminado.","configuring":"Configurando..."},"restore-seed":{"text":"Antes de continuar, por favor seleccione la cantidad de palabras de la semilla que desea recuperar.","check-text":"Puede usar esta opci\xf3n para ingresar una semilla y verificar si es igual a la de la Skywallet. Antes de comenzar, seleccione el n\xfamero de palabras de la semilla que desea verificar.","warning":"ADVERTENCIA: para evitar posibles problemas, use solo semillas creadas con una Skywallet.","error-wrong-word":"Error: la palabra introducida no coincide con la solicitada por la Skywallet.","error-invalid-seed":"Error: la semilla no es v\xe1lida. Por favor aseg\xfarese de ingresar las palabras correctas en el orden correcto.","error-wrong-seed":"Error: la semilla es v\xe1lida pero no coincide con la del dispositivo.","correct-seed":"La semilla es v\xe1lida y coincide con la del dispositivo."},"added":{"title":"Nueva Skywallet","configuring":"Nueva Skywallet detectada. Configurando...","done":"Hecho","added1":"La Skywallet conectada se ha agregado a la lista de billeteras con el siguiente nombre:","added2":"Ahora puede consultar el saldo y las direcciones de la Skywallet incluso cuando no est\xe1 conectada.","added-error-info":"Debe ingresar un nombre.","characters-warning":"Si utiliza caracteres no comunes en el idioma ingl\xe9s, es posible que el nombre no se muestre correctamente en el dispositivo."},"wipe":{"warning":"ADVERTENCIA: Todos los datos en la Skywallet ser\xe1n eliminados. Si no tiene una copia de seguridad, no podr\xe1 volver a acceder a sus fondos.","confirm-delete-check":"Quitar tambi\xe9n de la lista de billeteras"},"create-backup":{"warning":"ADVERTENCIA: Solo puede usar esta opci\xf3n para hacer una copia de seguridad de la semilla de su Skywallet una vez. Si decide continuar, tendr\xe1 que escribir un grupo de palabras (en papel, nunca en una computadora) que aparecer\xe1n en la pantalla de la Skywallet y almacenar la lista en un lugar seguro. Cualquier persona con acceso a la lista de palabras (la \\"semilla\\") podr\xe1 acceder a los fondos de la billetera, por lo que se recomienda extremar las precauciones.","instructions":"Escriba la lista de palabras que aparecen en la pantalla de la Skywallet. Aseg\xfarese de respetar el orden y escribir cada palabra correctamente."},"seed-word":{"title":"Ingresar Palabra","enter-word":"Introduzca la palabra indicada en el dispositivo","info":"Se le pedir\xe1 que ingrese las palabras de su semilla de respaldo en orden aleatorio. Adicionalmente, algunas palabras adicionales aleatorias podr\xedan serle solicitadas.","word-label":"Palabra solicitada","error-invalid-word":"La palabra introducida no es v\xe1lida.","error-loading-words":"Cargando la lista de palabras. Por favor espere."},"change-pin":{"pin-mismatch":"No se puede realizar la operaci\xf3n. Los dos PIN que ha introducido no coinciden."},"remove-pin":{"warning":"ADVERTENCIA: No se recomienda eliminar el c\xf3digo PIN de su Skywallet, ya que ser\xe1 vulnerable a ser utilizada por terceros no autorizados."},"enter-pin":{"title":"Ingresar PIN","title-change-current":"Ingrese el PIN Actual","title-change-new":"Ingrese el Nuevo PIN","title-change-confirm":"Confirme el Nuevo PIN","instructions-generic":"El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la Skywallet.","instructions-tx":"Introduzca el PIN para confirmar y firmar la transacci\xf3n. El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la Skywallet.","instructions-change":"Por favor ingrese un PIN dif\xedcil de adivinar de entre 4 y 8 n\xfameros. El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la Skywallet.","help":"\xbfNecesita ayuda?"},"pin-help":{"title":"Ayuda","part1":"Cuando sea necesario ingresar el PIN para continuar, la pantalla de la Skywallet mostrar\xe1 una matriz de 9 casillas con n\xfameros en orden aleatorio (el orden cambia cada vez) y se le pedir\xe1 que ingrese el PIN en la billetera de software usando una matriz de 9 botones que simplemente muestran el s\xedmbolo #.","part2":"Para ingresar el PIN, mire la posici\xf3n de los n\xfameros del PIN en la matriz de n\xfameros en la pantalla de la Skywallet y presione los botones correspondientes en la billetera de software. Por ejemplo, si el PIN es \\"23\\", el n\xfamero 2 est\xe1 en la esquina superior izquierda y el n\xfamero 3 en el centro de la matriz de n\xfameros de la Skywallet, presione los botones superior izquierdo y central, en ese orden, en la billetera de software.","part3":"Si lo desea, tambi\xe9n puede usar el teclado num\xe9rico para ingresar el PIN. Sin embargo, como en el ejemplo anterior, si el PIN es \\"23\\", no puede simplemente escribir \\"23\\" con el teclado num\xe9rico, sino que deber\xe1 presionar las teclas que est\xe1n en la posici\xf3n donde est\xe1n los n\xfameros 2 y 3 en la pantalla de la Skywallet."},"create-tx":{"title":"Crear Transacci\xf3n","upper-text":"Por favor confirme la operaci\xf3n en la Skywallet despu\xe9s de verificar si los siguientes datos coinciden EXACTAMENTE con la transacci\xf3n que desea enviar y con los que muestra la Skywallet:","lower-text":"Si alg\xfan dato no corresponde a lo que muestra la Skywallet o la transacci\xf3n que desea enviar, cancele la operaci\xf3n en su Skywallet.","separator-for-coins-and-hours":"y","separator-to-destination":"a"},"confirm-address":{"title":"Confirmar Direcci\xf3n","instructions":"Por favor confirme en la Skywallet si la direcci\xf3n es:","short-confirmation":"Direcci\xf3n confirmada.","confirmation":"Direcci\xf3n confirmada. Por seguridad, puede volver a mostrar la direcci\xf3n en la Skywallet usando la opci\xf3n \\"Confirmar direcci\xf3n\\", en el men\xfa que puede mostrar presionando el bot\xf3n a la derecha del balance de la direccion."}},"time-from-now":{"few-seconds":"hace pocos segundos","minute":"hace un minuto","minutes":"hace {{time}} minutos","hour":"hace una hora","hours":"hace {{time}} horas","day":"hace un d\xeda","days":"hace {{time}} d\xedas"},"exchange":{"title-and-button":"Comprar {{ coinName }}","label-you-send":"Usted env\xeda","label-you-get":"Usted recibe (aprox.)","label-to-address":"A la direcci\xf3n de {{coin}}","label-price":"Tasa de cambio","label-stimate-transaction-time":"Duraci\xf3n del intercambio","exchange-button":"Intercambiar","min-amount":"Monto minimo:","max-amount":"Monto maximo:","agree-part1":"Acepto los","agree-part2":"T\xe9rminos de Uso","agree-part3":"y la ","agree-part4":"Pol\xedtica de Privacidad","powered-by":"Manejado por","need-help":"\xbfNecesita ayuda?","support-portal":"Portal de soporte","history":"Historial de \xf3rdenes","order-not-found":"Orden no encontrada","label-status":"Estado","exchanging":"Intercambiando {{from}} por {{to}}","destination-select-from-list-link":"Seleccionar","unavailable":"El servicio de intercambio no est\xe1 disponible en la versi\xf3n portable.","offline":"El servicio est\xe1 temporalmente offline","problem-connecting":"No se puede conectar con el servicio. Por favor compruebe su conexi\xf3n a Internet y vuelva a intentarlo m\xe1s tarde.","invalid-address-error":"Direcci\xf3n inv\xe1lida.","from-coin-error-info":"Debe seleccionar una moneda.","invalid-value-error-info":"Valor inv\xe1lido.","address-error-info":"Por favor introduzca una direcci\xf3n v\xe1lida.","statuses":{"user-waiting":"Esperando el deposito. Por favor env\xede {{amount}} {{from}} a la direcci\xf3n de intercambio indicada m\xe1s abajo","user-waiting-info":"El sistema est\xe1 a la espera de que usted realice el dep\xf3sito en la direcci\xf3n de intercambio. El proceso de intercambio comenzar\xe1 despu\xe9s de que se detecte el dep\xf3sito y sea confirmado en la cadena de bloques. Si ya ha realizado el dep\xf3sito, deber\xeda ser detectado en breve.","market-waiting-confirmations":"Esperando las confirmaciones de la transacci\xf3n","market-waiting-confirmations-info":"El dep\xf3sito ya ha sido detectado y el sistema est\xe1 esperando que sea confirmado en la cadena de bloques.","market-confirmed":"Transacci\xf3n aceptada","market-confirmed-info":"La transacci\xf3n ya ha sido confirmada en la cadena de bloques. Haciendo los preparativos para realizar el intercambio pronto.","market-exchanged":"{{from}} intercambiado por {{to}}","market-exchanged-info":"El intercambio se ha realizado. Los fondos ser\xe1n transferidos a su direcci\xf3n en un momento.","market-withdraw-waiting":"Enviando {{to}} a su direcci\xf3n","market-withdraw-waiting-info":"Se ha iniciado el proceso para enviar las monedas a su direcci\xf3n.","complete":"\xa1Intercambio completado!","complete-info":"Los fondos han sido enviados con \xe9xito a su direcci\xf3n.","error":"Se produjo un error","error-info":"Hubo un error en la operaci\xf3n, puede encontrar m\xe1s informaci\xf3n m\xe1s abajo. Si necesita ayuda, por favor guarde todos los datos de operaci\xf3n que se muestran m\xe1s abajo y comun\xedquese con soporte t\xe9cnico utilizando el enlace que se encuentra en la parte inferior derecha de esta p\xe1gina.","user-deposit-timeout":"Orden cancelada por inactividad","user-deposit-timeout-info":"El sistema ha cancelado la orden porque no se detect\xf3 ning\xfan dep\xf3sito, por favor abra una nueva orden. Si necesita ayuda, por favor guarde todos los datos de operaci\xf3n que se muestran m\xe1s abajo y comun\xedquese con soporte t\xe9cnico utilizando el enlace que se encuentra en la parte inferior derecha de esta p\xe1gina."},"history-window":{"title":"Historial de \xd3rdenes","address":"Direcci\xf3n:","date":"Fecha:"},"details":{"exchange-addr-label":"Direcci\xf3n de intercambio (v\xe1lida solo para esta operaci\xf3n de intercambio)","exchange-addr-tag-label":"Payment ID o Destination Tag que debe usarse para la transacci\xf3n","tx-id-label":"ID de la transacci\xf3n","order-id-label":"ID de la orden","initial-price-label":"Tasa de cambio inicial","error-msg-label":"Mensaje de error","details-link":"Detalles","start-date-label":"Fecha de inicio","back-alert":"La operaci\xf3n a\xfan est\xe1 en progreso. \xbfRealmente desea volver al formulario? Puede ver el progreso de esta operaci\xf3n nuevamente presionando el bot\xf3n \\"Historial de pedidos\\""}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.ffa4899fe52b74655a98.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.ffa4899fe52b74655a98.js new file mode 100644 index 0000000000..d96b6fae89 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/2.ffa4899fe52b74655a98.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{"ZF/7":function(e){e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Cargando...","done-title":"Listo","warning-title":"Advertencia","error-title":"Error","changes-made":"Los cambios se han hecho.","back-button":"Volver","create-button":"Crear","load-button":"Cargar","cancel-button":"Cancelar","continue-button":"Continuar","close-button":"Cerrar","generic-confirmation-check":"Entiendo los riesgos y deseo continuar","copied":"El texto ha sido copiado al portapapeles."},"errors":{"window-size":"La ventana es demasiado estrecha para el contenido."},"language":{"title":"Seleccionar Lenguaje"},"header":{"syncing-blocks":"Sincronizando bloques","explorer-link":"Explorador de {{ coinName }}","warnings":{"update-part1":"La actualizaci\xf3n","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"est\xe1 disponible.","synchronizing":"La billetera est\xe1 sincronizando. Los datos mostrados pueden estar desactualizados.","pending-txs-part1":"Hay una o m\xe1s","pending-txs-part2":"transacciones pendientes.","pending-txs-part3":"Los datos mostrados pueden estar desactualizados.","no-connections":"Sin conexiones activas, \xa1el cliente no est\xe1 conectado a otros nodos!","no-backend-part1":"Sin acceso al servidor. Por favor, reinicie la aplicaci\xf3n y/o cont\xe1ctenos v\xeda","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Vulnerabilidad de seguridad: CSRF no funciona. Por favor, salga de inmediato."}},"password":{"title":"Introduzca Su Contrase\xf1a","password-label":"Contrase\xf1a","password-error-info":"Debe ingresar una contrase\xf1a.","confirm-password-label":"Confirmar contrase\xf1a","confirm-error-info":"Las dos contrase\xf1as deben coincidir.","proceed-button":"Proceder","reset-link":"He olvidado mi contrase\xf1a","incorrect-password-error":"Contrase\xf1a incorrecta.","decrypting-error":"Error al desencriptar la billetera"},"buy":{"title-and-button":"Comprar","deposit-address":"Seleccione una direcci\xf3n para la cual generar un enlace de dep\xf3sito BTC:","select-address":"Seleccione una direcci\xf3n","generate":"Generar","deposit-location":"Localizaci\xf3n de Dep\xf3sito","deposit-location-desc":"Seleccione la billetera en la que desea que le depositemos sus Skycoins despu\xe9s de recibir los Bitcoins.","make-choice":"Realice una selecci\xf3n","wallets-desc":"Una nueva direcci\xf3n BTC es generada cada vez que se selecciona una nueva billetera y direcci\xf3n. Una \xfanica direcci\xf3n de Skycoin puede tener asignadas hasta 5 direcciones BTC.","send":"Enviar Bitcoins","send-desc":"Env\xede Bitcoins a la direcci\xf3n abajo indicada. Al recibirlos, le depositaremos los Skycoins en una nueva direcci\xf3n en la billetera seleccionada m\xe1s arriba, a la tasa de cambio actual de {{ rate }} SKY/BTC.","fraction-warning":"\xa1Env\xede s\xf3lo m\xfaltiplos de la tasa SKY/BTC! Los Skycoins son enviados en n\xfameros enteros, \xa1no se env\xedan fracciones de SKY!","receive":"Recibir SKY","receive-desc":"Despu\xe9s de recibir los Bitcoins, le enviaremos sus Skycoins. El tiempo de espera para recibir sus SKY puede ser de entre 20 minutos y una hora.","status-button":"Estatus:","check-status-button":"Revisar Estatus","new-order-button":"Nueva Orden"},"wizard":{"create-title":"Crear Billetera","create-desc":"Si no tiene una billetera de {{ coinName }}, use la semilla generada autom\xe1ticamente para crear una nueva. Si ya tiene una billetera, seleccione \\"Cargar\\" e introduzca su semilla.","encrypt-title":"Encriptar Billetera","encrypt-desc":"Incremente la seguridad de su billetera encript\xe1ndola. Al introducir una contrase\xf1a m\xe1s abajo, su billetera ser\xe1 encriptada. S\xf3lo quien tenga la contrase\xf1a podr\xe1 acceder a la billetera y retirar fondos.","hardware-wallet-link":"\xbfUtilizando una Skywallet?","new-button":"Nueva","load-button":"Cargar","finish-button":"Finalizar","confirm":{"title":"\xa1Resguarde Su Semilla!","desc":"Queremos asegurarnos de que ha anotado su semilla y la ha almacenado en un lugar seguro. \xa1Si olvida su semilla, NO podr\xe1 recuperar su billetera!","checkbox":"Est\xe1 segura, lo garantizo."}},"wallet":{"title-and-button":"Billeteras","show-empty-button":"Mostrar Vac\xedas","hide-empty-button":"Ocultar Vac\xedas","encrypt-button":"Encriptar Billetera","decrypt-button":"Desencriptar Billetera","decrypt-warning":"Advertencia: por razones de seguridad, no se recomienda mantener las carteras desencriptadas. Se aconseja precauci\xf3n.","delete-button":"Borrar Billetera","rename-button":"Renombrar","add-button":"Nueva Billetera","load-button":"Cargar Billetera","hardware-wallet-button":"Skywallet","encryption-enabled":"Encriptado habilitado.","encryption-disabled":"Encriptado deshabilitado.","warning-hw-security":"Posible riesgo de seguridad. Acceda a las opciones de la Skywallet (presionando el bot\xf3n \\"Skywallet\\" debajo de la lista de billeteras) mientras el dispositivo est\xe1 conectado, para m\xe1s informaci\xf3n.","wallet-table-label":"Billetera","hardware-wallet-table-label":"Skywallet","delete-confirmation":"ADVERTENCIA: la billetera \\"{{ name }}\\" ser\xe1 removida de la lista. Para agregarla nuevamente, deber\xe1 volver a conectar el dispositivo y abrir las opciones de la Skywallet (presionando el bot\xf3n \\"Skywallet\\" debajo de la lista de las billeteras). \xbfDesea continuar?","delete-confirmation-check":"S\xed, quiero borrar la billetera","max-hardware-wallets-error":"Ya ha alcanzado el n\xfamero m\xe1ximo de direcciones que se puede agregar a la Skywallet.","add-many-confirmation":"ADVERTENCIA: si agrega demasiadas direcciones sin usar las anteriores o si usa las \xfaltimas y no las primeras, es posible que algunas direcciones no se recuperen autom\xe1ticamente si intenta restaurar la billetera con la semilla (tendr\xe1 que agregarlas manualmente). \xbfDesea continuar?","busy-error":"Por favor espere a que se complete la operaci\xf3n anterior.","new":{"create-title":"Crear Billetera","load-title":"Cargar Billetera","name-label":"Nombre","name-error-info":"Debe ingresar un nombre.","words-number-label":"Cuantas palabras tiene la semilla","seed-label":"Semilla","seed-error-info":"Debe ingresar una semilla.","confirm-seed-label":"Confirmar semilla","confirm-seed-error-info":"Las dos semillas deben coincidir.","seed-warning":"\xa1Recuerde esta semilla! Mant\xe9ngala en un lugar seguro. \xa1Si olvida su semilla, no podr\xe1 recuperar la billetera!","12-words":"12 palabras","24-words":"24 palabras","generate-12-help":"Generar una semilla de 12 palabras.","generate-24-help":"Generar una semilla de 24 palabras.","encrypt-check":"Encriptar billetera","encrypt-warning":"Le sugerimos que encripte con una contrase\xf1a cada una de sus billeteras. Si olvida su contrase\xf1a, puede restaurarla con la semilla. Aseg\xfarese de guardar su semilla en un lugar seguro antes de encriptar la billetera.","seed-checking-error":"No fue posible verificar la validez de la semilla.","unconventional-seed-title":"Posible Error","unconventional-seed-text":"Usted introdujo una semilla no convencional. Si lo hizo por alguna raz\xf3n en especial, puede continuar (s\xf3lo recomendable para usuarios avanzados). Sin embargo, si su intenci\xf3n es utilizar una semilla normal del sistema, usted debe borrar los textos y/o caracteres especiales adicionales.","unconventional-seed-check":"Continuar con la semilla no convencional","synchronizing-warning-text":"La billetera todav\xeda est\xe1 sincronizando los datos y la operaci\xf3n podr\xeda no restaurar todas las direcciones. Si algunas direcciones no son restauradas, usted deber\xe1 esperar a que la billetera est\xe9 totalmente sincronizada y usar la opci\xf3n \\"Escanear Direcciones\\" o agregarlas nuevamente de forma manual.","wallet-created":"La billetera ha sido agregada a la lista.","seed":{"enter-seed":"Presione aqu\xed para ingresar la semilla","change-seed":"Presione para cambiar","confirm-seed":"Presione aqu\xed para confirmar la semilla","confirmed-seed":"Semilla confirmada","use-custom":"Ingresar la semilla manualmente","use-normal":"Ingresar la semilla usando el m\xe9todo recomendado","custom-seed-warning-text":"Esta opci\xf3n solo es recomendada para usuarios avanzados. Cometer errores con la semilla puede hacer que pierda el acceso a los fondos en caso de que surja alg\xfan problema.","custom-seed-warning-text-recovering":"Para evitar posibles problemas, esta opci\xf3n solo debe usarse si desea recuperar una semilla no convencional.","incorrect-word-error":"La palabra que ha ingresado no coincide con la que se ha solicitado.","invalid-seed-error":"La semilla que ha ingresado no es v\xe1lida. Por favor, vuelva a intentarlo.","enter-word":"Ingrese la palabra n\xfamero {{number}}","word-error-info":"Debe ingresar una palabra.","new-seed-info":"Usted debe ingresar las palabras de la semilla que fue generada por el sistema, para confirmarla.","recover-seed-info":"Por favor, aseg\xfarese de ingresar las palabras correctas en el orden correcto."}},"rename":{"title":"Renombrar Billetera","name-label":"Nombre","label-error-info":"Debe ingresar un nombre.","rename-button":"Renombrar"},"address-options":{"title":"Direcciones","new":"Nuevas Direcciones","scan":"Escanear Direcciones","scan-help":"Use esta opci\xf3n para hacer que el sistema encuentre direcciones ya usadas de esta billetera que faltan en la lista."},"scan-addresses":{"done-with-new-addresses":"La lista ha sido actualizada.","done-without-new-addresses":"No se encontraron nuevas direcciones."},"add-addresses":{"title":"Seleccionar Cantidad","quantity-label":"Cantidad de direcciones a crear","quantity-error-info":"Debe ingresar un valor entre 1 y 100.","error":"Hubo un error inesperado. Por favor, int\xe9ntelo de nuevo."},"address":{"show":"Presione para mostrar","copy":"Copiar","copy-address":"Copiar direcci\xf3n","copied":"\xa1Copiado!","confirm":"Confirmar direcci\xf3n","outputs":"Salidas no gastadas","history":"Historial"}},"qr":{"title":"C\xf3digo QR","data-label":"Datos del c\xf3digo QR","address-label":"Direcci\xf3n","request-link":"Solicitar monto espec\xedfico","amount-label":"Monto solicitado","hours-label":"Horas solicitadas","message-label":"Mensaje","invalid":"(valor inv\xe1lido)"},"send":{"title-and-button":"Enviar","unsigned-button":"Sin firmar","signed-button":"Firmada","unsigned-confirmation":"El formulario de transacciones sin firmar no permite enviar transacciones normalmente, sino que simplemente crea el texto de la transacci\xf3n, el cual debe ser firmado antes de que pueda ser enviado a la red. Esto es \xfatil para crear transacciones que ser\xe1n firmadas en un equipo que siempre est\xe1 fuera de l\xednea, por razones de seguridad. \xbfDesea continuar?","synchronizing-warning":"La billetera todav\xeda est\xe1 sincronizando los datos, por lo que el saldo que se muestra puede ser incorrecto. \xbfSeguro de que desea continuar?","from-label":"Enviar desde","to-label":"Enviar a","amount-label":"Cantidad","personal-note-label":"Nota personal","personal-note-help":"Use este campo para agregar un texto que le permita identificar la transacci\xf3n en el futuro. Este texto se guarda localmente, por lo que solo ser\xe1 visible desde esta computadora.","wallet-label":"Billetera","wallet-error-info":"Debe seleccionar una billetera.","invalid-amount":"Por favor introduzca una cantidad v\xe1lida","convert-confirmation":"\xbfTambi\xe9n desea que la cantidad introducida se convierta de {{from}} a {{to}}?","convert-confirmation-plural":"\xbfTambi\xe9n desea que las cantidades introducidas se conviertan de {{from}} a {{to}}?","send-all-available-coins-link":"enviar todo","precision-error-warning":"Se detect\xf3 un error de precisi\xf3n durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","invaid-amount-warning":"Se detect\xf3 un valor inv\xe1lido durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","precision-errors-warning":"Se detectaron errores de precisi\xf3n durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","invaid-amounts-warning":"Se detectaron valores inv\xe1lidos durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","multiple-problems-warning":"Algunos valores no se convirtieron por ser inv\xe1lidos o podr\xedan haberse convertido con errores de precisi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","addresses-label":"Direcciones","addresses-error-info":"Debe ingresar al menos una direcci\xf3n v\xe1lida.","no-wallet-selected-error":"No hay monedas para enviar.","no-coins-left-error":"No hay monedas restantes para enviar.","addresses-help":"Limite las direcciones desde donde se podr\xedan enviar las monedas y las horas.","addresses-manual-help":"Lista de las direcciones desde las cuales se enviar\xe1n las monedas, separadas por comas. Todas las direcciones deben pertenecer a la misma billetera o no podr\xe1 firmar la transacci\xf3n con la billetera de escritorio.","all-addresses":"Todas las direcciones de la billetera seleccionada","outputs-label":"Salidas no gastadas","outputs-help":"Limite las salidas no gastadas desde donde se podr\xedan enviar las monedas y las horas. Solo se muestran las salidas de las direcciones seleccionadas.","outputs-error":"Hubo un error al intentar obtener las salidas. Por favor aseg\xfarese de haber ingresado direcciones v\xe1lidas.","all-outputs":"Todas las salidas no gastadas de las direcciones seleccionadas","enter-addresses-for-outputs":"Debe ingresar direcciones v\xe1lidas primero","enter-wallet-for-outputs-and-addresses":"Debe seleccionar una billetera v\xe1lida primero","invalid-addresses-for-outputs":"No hay salidas disponibles","available-funds-msg-part1":"Con su selecci\xf3n actual puede enviar hasta","available-funds-msg-part2":"y","available-funds-msg-part3":"(al menos","available-funds-msg-part4":"deben ser utilizadas como tarifa de transacci\xf3n para enviar todas las monedas u horas).","change-address-label":"Direcci\xf3n de retorno personalizada","change-address-error-info":"La direcci\xf3n de retorno no es v\xe1lida.","change-address-select-from-list-link":"Seleccionar","change-address-help":"Direcci\xf3n para recibir el cambio. Si no se proporciona, ser\xe1 elegida autom\xe1ticamente. Haga clic en el enlace \\"Seleccionar\\" para elegir una direcci\xf3n de una de sus billeteras.","specific-hours":"Horas a enviar:","remove-specific-hours-info":"Remover.","remove-specific-hours-confirmation":"\xbfSeguro que desea eliminar la cantidad espec\xedfica de horas a enviar?","destinations-label":"Destinos","destinations-help1":"Direcciones de destino y sus monedas.","destinations-help2":"Direcciones de destino, sus monedas y horas.","destination-tools-title":"Herramientas de destino","hours-allocation-check":"Usar una distribuci\xf3n autom\xe1tica de {{ coinHoursName }}","options-link":"Opciones","coin-hours-options-link":"Opciones de horas","hours-share-factor-label":"Factor de distribuci\xf3n de {{ coinHoursName }}","hours-share-factor-help":"Este control permite seleccionar el porcentaje de {{ coinHoursName }} que ser\xe1n enviadas. de Mientras mayor sea el valor, m\xe1s {{ coinHoursName }} se enviar\xe1n y menos ser\xe1n retenidas.","close-hours-share-factor-alert":"La opci\xf3n se restablecer\xe1 al valor predeterminado. Seguro que desea continuar?","preview-button":"Preview","send-button":"Enviar","show-button":"Mostrar","simple-form-button":"Simple","advanced-form-button":"Advanzado","select-wallet":"Seleccionar billetera","saving-note-error":"La transacci\xf3n se envi\xf3 correctamente, pero no fue posible guardar la nota.","sent":"La transacci\xf3n se envi\xf3 correctamente.","total-to-send":"Total:","invalid-address-error":"La direcci\xf3n de destino no es v\xe1lida.","one-invalid-address-error":"Una de las direcciones de destino no es v\xe1lida.","various-invalid-addresses-error":"Algunas direcciones de destino no son v\xe1lidas.","all-addresses-invalid-error":"Las direcciones de destino no son v\xe1lidas.","invalid-addresses-error":"Por favor aseg\xfarese de que la direcci\xf3n sea v\xe1lida.","address-error-info":"Por favor introduzca una direcci\xf3n v\xe1lida.","invalid-value-error-info":"Valor inv\xe1lido.","insufficient-funds-error-info":"El valor ingresado es mayor que el saldo disponible.","sending-all-hours-with-coins-waning":"Al enviar todas las monedas, todas las horas de la billetera seleccionada ser\xe1n enviadas o quemadas. Si desea retener horas, no debe enviar todas las monedas. \xbfSeguro que desea continuar?","advanced-sending-all-hours-with-coins-waning":"Al enviar todas las monedas, todas las horas de la(s) fuente(s) seleccionada(s) ser\xe1n enviadas o quemadas. Si desea retener horas, no debe enviar todas las monedas. \xbfSeguro que desea continuar?","sending-all-hours-waning":"Usted seleccion\xf3 enviar todas las horas. \xbfSeguro que desea continuar?","high-hours-share-waning":"Su selecci\xf3n puede resultar en el env\xedo de todas las horas de la billetera seleccionada. \xbfSeguro que desea continuar?","advanced-high-hours-share-waning":"Su selecci\xf3n puede resultar en el env\xedo de todas las horas de la(s) fuente(s) seleccionada(s). \xbfSeguro que desea continuar?","fill-with-link":{"title":"Utilizar un link de transacci\xf3n","link-info":"Aqu\xed puede ingresar un link que se le hubiese enviado solicitando monedas. El formulario se rellenar\xe1 con los datos obtenidos del link.","link-label":"Link de transacci\xf3n","link-error-info":"Debe ingresar un link de transacci\xf3n v\xe1lido.","process-button":"Procesar","invalid-link-error":"El contenido del link de transacci\xf3n no es v\xe1lido.","invalid-link-hours-error":"El link de transacci\xf3n contiene una cantidad de horas no v\xe1lida.","data-overwritten-alert":"Se sobrescribir\xe1n algunos datos que ha introducido. Seguro de que desea continuar?","confirmation":"El formulario se ha actualizado con los datos obtenidos del link de transacci\xf3n."},"known-node-errors":{"null-change-address-error":"La direcci\xf3n nula no se puede utilizar como direcci\xf3n de retorno personalizada. Por favor introduzca una direcci\xf3n v\xe1lida.","to-required-error":"Debe proporcionar una direcci\xf3n de destino para enviar monedas. Por favor introduzca una direcci\xf3n v\xe1lida.","zero-coins-error":"No es posible enviar cero monedas. Por favor introduzca una cantidad v\xe1lida.","null-destination-error":"La direcci\xf3n nula no se puede utilizar como direcci\xf3n de destino. Por favor introduzca una direcci\xf3n v\xe1lida.","duplicate-destination-error":"Hay destinos duplicados. Por favor no repita la misma direcci\xf3n y cantidad en m\xe1s de un destino.","hours-in-automatic-mode-error":"No se pueden especificar cantidades de horas mientras se usa la distribuci\xf3n autom\xe1tica de horas. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","hours-allocation-mode-needed-error":"Se requiere el modo de asignaci\xf3n de horas. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","invalid-hours-allocation-mode-error":"Modo de asignaci\xf3n de horas no v\xe1lido. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","hours-allocation-mode-not-needed-error":"El modo de asignaci\xf3n de horas no se puede especificar mientras se usa la distribuci\xf3n de horas manual. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","invalid-hours-mode-error":"M\xe9todo de distribuci\xf3n de horas no v\xe1lido. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","share-factor-needed-error":"Se necesita el factor de distribuci\xf3n de horas. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","share-factor-not-needed-error":"El factor de distribuci\xf3n de horas no puede ser especificado mientras se usa la distribuci\xf3n de horas manual. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","invalid-share-factor-error":"Factor de distribuci\xf3n de horas inv+alido. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","change-equal-to-destination-error":"No es posible crear la transacci\xf3n debido a que se regresar\xeda una cantidad repetida de monedas a la misma direcci\xf3n de destino. Por favor int\xe9ntelo nuevamente con valores diferentes.","repeated-wallet":"Una billetera para la semilla indicada ya existe."},"bulk-send":{"title":"Env\xedo Masivo","indications":"Para enviar a m\xfaltiples destinos de forma r\xe1pida, escriba cada direcci\xf3n, cantidad de monedas y cantidad de horas (opcional) en una l\xednea, separadas por una coma. Ejemplo: si desea enviar 10 monedas y 5 horas a la direcci\xf3n \\"xyz\\", escriba \\"xyz,10,5\\"; si desea que las horas se calculen autom\xe1ticamente, escriba \\"xyz,10\\". Los valores decimales se deben separar con un punto.","data-error-info":"Debe ingresar un valor.","process-button":"Procesar","no-data-error":"No hay texto para procesar.","inconsistent-data-error":"Si establece cu\xe1ntas horas desea enviar a un destino, debe hacerlo para todos los destinos.","invalid-data-error":"El texto ingresado tiene un formato inv\xe1lido."}},"select-address":{"title":"Seleccionar Direcci\xf3n","no-addresses":"No hay direcciones confirmadas en esta billetera."},"offline-transactions":{"loading-problem":"Error al intentar obtener los datos necesarios","wallet-error-info":"Debe seleccionar una billetera.","tx-error-info":"Debe ingresar un texto de transacci\xf3n v\xe1lido.","copy-tx":{"signed-title":"Transacci\xf3n Firmada","unsigned-title":"Transacci\xf3n Sin Firmar","text-unsigned":"Esta es la transacci\xf3n sin firmar que se ha creado con los datos que ha ingresado. Por favor copie el texto para poder firmarlo con la opci\xf3n \\"Firmar transacci\xf3n\\".","text-signed":"Esta es la transacci\xf3n firmada. Puede enviarla a la red utilizando la opci\xf3n \\"Transmitir Transacci\xf3n\\".","input-label":"Texto de la transacci\xf3n","copy-button":"Copiar","reset-confirmation":"\xbfDesea que se limpie el formulario, de forma que pueda crear otra transacci\xf3n?","reset-done":"El formulario ha sido limpiado."},"sign-tx":{"title":"Firmar Transacci\xf3n","text":"Use este formulario para firmar una transacci\xf3n. Para que la operaci\xf3n funcione correctamente debe seleccionar la billetera que incluye todas las entradas/direcciones utilizadas para enviar monedas en la transacci\xf3n.","wallet-label":"Billetera","select-wallet":"Seleccione una billetera","input-label":"Texto de la transacci\xf3n","sign-button":"Firmar","signed":"La transacci\xf3n ha sido firmada."},"broadcast-tx":{"title":"Transmitir Transacci\xf3n","text":"Use este formulario para enviar una transacci\xf3n firmada a la red.","input-label":"Texto de la transacci\xf3n","send-button":"Enviar","sent":"La transacci\xf3n ha sido enviada."}},"reset":{"title":"Restablecer Contrase\xf1a","wallet-label":"Billetera","seed-label":"Semilla de la billetera","seed-error-info":"Debe ingresar una semilla.","password-label":"Nueva contrase\xf1a (deje en blanco si desea que la billetera no est\xe9 encriptada)","confirm-label":"Confirme la contrase\xf1a","confirm-error-info":"Las dos contrase\xf1as deben coincidir.","reset-button":"Restablecer","done":"Contrase\xf1a cambiada correctamente."},"tx":{"transaction-title":"Transacci\xf3n","confirm-transaction-title":"Confirmar Transacci\xf3n","from-small-label":"Desde:","to-small-label":"A:","date-small-label":"Fecha:","status-small-label":"Estatus:","coins-small-label":"Monedas:","hours-small-label":"Horas:","id-small-label":"Tx ID:","note-small-label":"Nota:","without-note":"Sin nota","show-more-link":"Mostrar m\xe1s","hours-moved":"movida(s)","hours-sent":"enviada(s)","hours-received":"recibida(s)","hours-burned":"quemada(s)","inputs-title":"Entradas","outputs-title":"Salidas","confirmed-transaction":"Confirmada","pending-transaction":"Pendiente","current-rate-help":"Calculado a la tasa actual."},"edit-note":{"title":"Editar Nota","change-button":"Cambiar"},"backup":{"title":"Respaldar Billetera","wallet-directory":"Directorio de la Billetera:","seed-warning":"RESPALDE SU SEMILLA. EN PAPEL. EN UN LUGAR SEGURO. Mientras tenga su semilla, podr\xe1 recuperar las monedas.","desc":"Use la tabla de m\xe1s abajo para obtener las semillas de sus billeteras encriptadas.
Para obtener las semillas de las billeteras no encriptadas, abra el directorio de m\xe1s arriba, abra los archivos .wlt en un editor de texto y recupere las semillas.","wallet-table-label":"Nombre de la billetera","filename-table-label":"Archivo","save-addresses-button":"Guardar Direcciones","show-seed-button":"Mostrar semilla","no-wallets":"No hay billeteras","unencrypted-info":"Por razones de seguridad, no es posible mostrar las semillas de las billeteras sin encriptar. Para obtener la semilla, por favor encripte la billetera con una contrase\xf1a o siga las instrucciones en la parte superior de esta p\xe1gina.","hw-wallet-info":"Para obtener la semilla de una Skywallet, por favor use la opci\xf3n \\"Skywallet\\" de la parte inferior de la p\xe1gina de billeteras.","not-compatible-error":"Su navegador web no es compatible con esta funci\xf3n.","seed-modal-window":{"title":"Semilla de la Billetera","seed-label":"Semilla"}},"blockchain":{"title":"Blockchain","blocks-label":"Cantidad de bloques","time-label":"Fecha del \xfaltimo bloque","hash-label":"Hash del \xfaltimo bloque","current-supply-label":"Suministro de {{ coinName }} actual","total-supply-label":"Suministro de {{ coinName }} total","current-coinhour-supply-label":"Suministro de {{ coinHoursName }} actual","total-coinhour-supply-label":"Suministro de {{ coinHoursName }} total"},"network":{"title":"Red","error-no-connections":"Sin conexiones","peer-small-table-label":"Par","source-small-table-label":"Fuente","block-height-small-table-label":"Altura del bloque","block-height-short-small-table-label":"Bloque","last-seen-small-table-label":"\xdaltima vez visto","last-received-help":"\xdaltima recepci\xf3n.","last-sent-help":"\xdaltimo env\xedo.","in-help":"Entrante.","out-help":"Saliente.","sources":{"default":"Par por defecto","exchange":"Intercambio de pares"}},"pending-txs":{"title":"Transacciones Pendientes","timestamp-table-label":"Fecha","txid-table-label":"ID de la transacci\xf3n","none":"Actualmente no hay transacciones pendientes","my-transactions-button":"M\xedas","all-transactions-button":"Todas"},"outputs":{"title":"Salidas","error-no-outputs":"No hay salidas no gastadas"},"history":{"title-and-button":"Historial","tx-detail-title":"Detalles de la Transacci\xf3n","moving":"Moviendo {{ coinName }} internamente","moved":"{{ coinName }} movido internamente","sending":"Enviando {{ coinName }}","sent":"{{ coinName }} enviado","received":"{{ coinName }} recibido","receiving":"Recibiendo {{ coinName }}","pending-indication":"Pendiente","transaction-note-small-label":"Nota:","no-txs":"Usted no tiene historial de transacciones","no-txs-filter":"No hay transacciones que coincidan con los criterios de filtro actuales","no-filter":"Sin filtros activos (presione para seleccionar billeteras/direcciones)","filter":"Filtro activo: ","filters":"Filtros activos: ","all-addresses":"Todas las direcciones","view-all":"Ver todas las {{ number }} transacciones"},"teller":{"done":"Completado","waiting-confirm":"Esperando confirmaci\xf3n","waiting-deposit":"Esperando dep\xf3sito de Bitcoins","waiting-send":"Esperando para env\xedar Skycoins","unknown":"Desconocido"},"confirmation":{"default-title":"Confirmaci\xf3n","yes-button":"S\xed","no-button":"No"},"service":{"api":{"no-internet-error":"No cuenta con conexi\xf3n a Internet o el nodo ha dejado de funcionar.","incorrect-password-error":"Contrase\xf1a incorrecta.","unknown-error":"No fue posible realizar la operaci\xf3n.","api-disabled-error":"API deshabilitada."}},"force-skywallet-wipe":{"title":"Borrado Forzado de Skywallet","operation-warning":"Esta opci\xf3n est\xe1 dise\xf1ada s\xf3lo como \xfaltimo recurso para los casos en los que el dispositivo no se puede utilizar con las opciones normales. Se borrar\xe1n todos los datos del dispositivo, por lo que necesitar\xe1 la semilla para recuperar los fondos.","proceed-button":"Proceder"},"hardware-wallet":{"general":{"default-wallet-name":"Nueva Skywallet","confirm":"Por favor, confirme la operaci\xf3n en la Skywallet.","confirm-and-more":"Por favor confirme la operaci\xf3n en la Skywallet y siga las instrucciones.","follow":"Por favor siga las instrucciones mostradas en la Skywallet.","completed":"La operaci\xf3n se realiz\xf3 con \xe9xito.","name-updated":"El nombre utilizado para identificar esta Skywallet en la lista de billeteras se ha actualizado para que coincida con el que se muestra en el dispositivo."},"errors":{"generic-error":"No se puede realizar la operaci\xf3n. Aseg\xfarese de haber conectado una Skywallet v\xe1lida y de que no est\xe9 esperando por alguna confirmaci\xf3n o respuesta.","disconnected":"No se puede realizar la operaci\xf3n. La Skywallet no est\xe1 conectada.","incorrect-wallet":"No se puede realizar la operaci\xf3n. La Skywallet conectada es diferente a la esperada.","incorrect-pin":"No se puede realizar la operaci\xf3n. El PIN que ha introducido no es correcto.","refused":"La operaci\xf3n fue cancelada.","too-many-inputs-outputs":"La transacci\xf3n tiene demasiadas entradas o salidas para la Skywallet. Por favor vuelva a intentarlo creando varias transacciones m\xe1s peque\xf1as, cada una con un n\xfamero menor de destinatarios (si la transacci\xf3n actual tiene muchos) o monedas.","daemon-connection":"Problema para conectarse al Skywallet Daemon, por favor aseg\xfarese de que se est\xe9 ejecutando e int\xe9ntelo nuevamente. Usted puede descargarlo desde www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problema para conectarse al Skywallet Daemon, por favor aseg\xfarese de que se est\xe9 ejecutando e int\xe9ntelo nuevamente. Usted puede descargarlo desde ","timeout":"La operaci\xf3n se cancel\xf3 por inactividad. Por favor int\xe9ntelo de nuevo.","timeout-with-configurable-link":"La operaci\xf3n se cancel\xf3 por inactividad. Por favor int\xe9ntelo de nuevo. Si este problema impide que el dispositivo sea utilizable, puede utilizar la siguiente opci\xf3n:","invalid-address-generated":"Hubo un problema con el generador de direcciones y la operaci\xf3n tuvo que ser cancelada.","invalid-address":"Direcci\xf3n inv\xe1lida.","not-in-bootloader-mode":"Para usar esta opci\xf3n la Skywallet debe estar en modo bootloader."},"security-warning":{"title":"Advertencia de Seguridad","text":"La \xfaltima vez que se conect\xf3 esta Skywallet, se encontraron una o m\xe1s advertencias de seguridad. Le recomendamos que abra las opciones de Skywallet (presionando el enlace de m\xe1s abajo) mientras el dispositivo est\xe1 conectado y resuelva los problemas de seguridad antes de continuar.","link":"Abrir la ventana de opciones de Skywallet."},"options":{"connecting":"Conectando...","disconnected":"Skywallet no detectada. Por favor, conecte una Skywallet para usar esta opci\xf3n.","unconfigured-detected-title":"Skywallet No Configurada","unconfigured-detected":"Se ha detectado una Skywallet sin semilla. Seleccione \\"Configurar Autom\xe1ticamente\\" si desea configurarla como una billetera nueva y comenzar a usarla. Seleccione \\"Restaurar Copia de Seguridad\\" si desea configurar la Skywallet con la copia de seguridad de una semilla creada anteriormente.","configured-detected":"Skywallet detectada. El dispositivo se identifica en la lista de billeteras como:","security-warnings-title":"Advertencias de Seguridad","security-warning-title":"Advertencia de Seguridad","unchecked-version-warning":"No fue posible verificar si el firmware de su Skywallet est\xe1 actualizado. Esto podr\xeda deberse a problemas con su conexi\xf3n a Internet o a que el servicio est\xe9 en mantenimiento.","outdated-version-warning":"El firmware de su Skywallet est\xe1 desactualizado. Le recomendamos que lo actualice lo antes posible para garantizar la seguridad. Para hacer esto, seleccione la opci\xf3n \\"Actualizar Firmware\\".","backup-warning":"Debe hacer una copia de seguridad de la semilla de su Skywallet o podr\xeda perder acceso a los fondos en caso de problemas. Para hacer esto, seleccione la opci\xf3n \\"Crear Copia de Seguridad\\".","pin-warning":"La Skywallet conectada no tiene un PIN. El c\xf3digo PIN protege la Skywallet de accesos no autorizados. Para crear un c\xf3digo PIN, seleccione la opci\xf3n \\"Crear C\xf3digo PIN\\".","options":"Opciones:","update-firmware":"Actualizar Firmware","configure-automatically":"Configurar Autom\xe1ticamente","restore-backup":"Restaurar Copia de Seguridad","create-backup":"Crear Copia de Seguridad","wipe":"Borrar el Dispositivo","confirm-seed":"Confirmar la Semilla","create-pin":"Crear C\xf3digo PIN","change-pin":"Cambiar el C\xf3digo PIN","delete-pin":"Borrar el C\xf3digo PIN","forgotten-pin-part1":"Si no puede acceder a la billetera porque ha olvidado el PIN, puede borrar la Skywallet y luego restaurarla con la semilla haciendo clic","forgotten-pin-part2":"aqu\xed.","firmware-version":"Versi\xf3n del firmware del dispositivo:"},"update-firmware-warning":{"title":"Firmware Desactualizado","text":"ADVERTENCIA: el firmware de su Skywallet est\xe1 desactualizado. Para mantenerse seguro se le recomienda actualizarlo.","update":"Actualizar"},"update-firmware":{"title-connecting":"Conectando...","title-update":"Actualizar Firmware","title-install":"Instalar Firmware","text-downloading":"Comprobando el dispositivo y descargando archivos...","text-bootloader":"ADVERTENCIA: si ya ha configurado este dispositivo, antes de continuar debe tener una copia de seguridad de su semilla o podr\xeda perder permanentemente el acceso a los fondos.","text-not-bootloader":"Para actualizar el firmware de su Skywallet debe conectarla en modo bootloader (con\xe9ctela al computador mientras presiona los dos botones f\xedsicos del dispositivo). ADVERTENCIA: si ya ha configurado este dispositivo, antes de continuar debe tener una copia de seguridad de su semilla o podr\xeda perder permanentemente el acceso a los fondos.","text-no-firmware":"Le damos la bienvenida. La Skywallet conectada actualmente no tiene un firmware instalado. Ahora se instalar\xe1 un firmware para que pueda comenzar a usar el dispositivo. NOTA: si ya ha configurado este dispositivo y desea recuperar los fondos, necesitar\xe1 la semilla.","follow":"La actualizaci\xf3n del firmware se envi\xf3 a la Skywallet. Por favor contin\xfae el proceso en el dispositivo.","connection-error":"No fue posible descargar el firmware. Esto podr\xeda deberse a problemas con su conexi\xf3n a Internet o a que el servicio est\xe9 en mantenimiento.","timeout":"La operaci\xf3n se cancel\xf3 por inactividad. Por favor desconecte el dispositivo, vuelva a conectarlo e intente nuevamente.","finished":"Su dispositivo ha sido configurado correctamente. Por favor descon\xe9ctelo antes de continuar."},"generate-seed":{"text":"Antes de continuar puede seleccionar el n\xfamero de palabras que desea que tenga la semilla. La semilla es una lista de palabras que se pueden usar para recuperar el acceso a las monedas en caso de problemas. Ambos valores son seguros, por lo que si no tiene una raz\xf3n especial para seleccionar uno u otro, puede dejar el valor predeterminado.","configuring":"Configurando..."},"restore-seed":{"text":"Antes de continuar, por favor seleccione la cantidad de palabras de la semilla que desea recuperar.","check-text":"Puede usar esta opci\xf3n para ingresar una semilla y verificar si es igual a la de la Skywallet. Antes de comenzar, seleccione el n\xfamero de palabras de la semilla que desea verificar.","warning":"ADVERTENCIA: para evitar posibles problemas, use solo semillas creadas con una Skywallet.","error-wrong-word":"Error: la palabra introducida no coincide con la solicitada por la Skywallet.","error-invalid-seed":"Error: la semilla no es v\xe1lida. Por favor aseg\xfarese de ingresar las palabras correctas en el orden correcto.","error-wrong-seed":"Error: la semilla es v\xe1lida pero no coincide con la del dispositivo.","correct-seed":"La semilla es v\xe1lida y coincide con la del dispositivo."},"added":{"title":"Nueva Skywallet","configuring":"Nueva Skywallet detectada. Configurando...","done":"Hecho","added1":"La Skywallet conectada se ha agregado a la lista de billeteras con el siguiente nombre:","added2":"Ahora puede consultar el saldo y las direcciones de la Skywallet incluso cuando no est\xe1 conectada.","added-error-info":"Debe ingresar un nombre.","characters-warning":"Si utiliza caracteres no comunes en el idioma ingl\xe9s, es posible que el nombre no se muestre correctamente en el dispositivo."},"wipe":{"warning":"ADVERTENCIA: Todos los datos en la Skywallet ser\xe1n eliminados. Si no tiene una copia de seguridad, no podr\xe1 volver a acceder a sus fondos.","confirm-delete-check":"Quitar tambi\xe9n de la lista de billeteras"},"create-backup":{"warning":"ADVERTENCIA: Solo puede usar esta opci\xf3n para hacer una copia de seguridad de la semilla de su Skywallet una vez. Si decide continuar, tendr\xe1 que escribir un grupo de palabras (en papel, nunca en una computadora) que aparecer\xe1n en la pantalla de la Skywallet y almacenar la lista en un lugar seguro. Cualquier persona con acceso a la lista de palabras (la \\"semilla\\") podr\xe1 acceder a los fondos de la billetera, por lo que se recomienda extremar las precauciones.","instructions":"Escriba la lista de palabras que aparecen en la pantalla de la Skywallet. Aseg\xfarese de respetar el orden y escribir cada palabra correctamente."},"seed-word":{"title":"Ingresar Palabra","enter-word":"Introduzca la palabra indicada en el dispositivo","info":"Se le pedir\xe1 que ingrese las palabras de su semilla de respaldo en orden aleatorio. Adicionalmente, algunas palabras adicionales aleatorias podr\xedan serle solicitadas.","word-label":"Palabra solicitada","error-invalid-word":"La palabra introducida no es v\xe1lida.","error-loading-words":"Cargando la lista de palabras. Por favor espere."},"change-pin":{"pin-mismatch":"No se puede realizar la operaci\xf3n. Los dos PIN que ha introducido no coinciden."},"remove-pin":{"warning":"ADVERTENCIA: No se recomienda eliminar el c\xf3digo PIN de su Skywallet, ya que ser\xe1 vulnerable a ser utilizada por terceros no autorizados."},"enter-pin":{"title":"Ingresar PIN","title-change-current":"Ingrese el PIN Actual","title-change-new":"Ingrese el Nuevo PIN","title-change-confirm":"Confirme el Nuevo PIN","instructions-generic":"El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la Skywallet.","instructions-tx":"Introduzca el PIN para confirmar y firmar la transacci\xf3n. El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la Skywallet.","instructions-change":"Por favor ingrese un PIN dif\xedcil de adivinar de entre 4 y 8 n\xfameros. El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la Skywallet.","help":"\xbfNecesita ayuda?"},"pin-help":{"title":"Ayuda","part1":"Cuando sea necesario ingresar el PIN para continuar, la pantalla de la Skywallet mostrar\xe1 una matriz de 9 casillas con n\xfameros en orden aleatorio (el orden cambia cada vez) y se le pedir\xe1 que ingrese el PIN en la billetera de software usando una matriz de 9 botones que simplemente muestran el s\xedmbolo #.","part2":"Para ingresar el PIN, mire la posici\xf3n de los n\xfameros del PIN en la matriz de n\xfameros en la pantalla de la Skywallet y presione los botones correspondientes en la billetera de software. Por ejemplo, si el PIN es \\"23\\", el n\xfamero 2 est\xe1 en la esquina superior izquierda y el n\xfamero 3 en el centro de la matriz de n\xfameros de la Skywallet, presione los botones superior izquierdo y central, en ese orden, en la billetera de software.","part3":"Si lo desea, tambi\xe9n puede usar el teclado num\xe9rico para ingresar el PIN. Sin embargo, como en el ejemplo anterior, si el PIN es \\"23\\", no puede simplemente escribir \\"23\\" con el teclado num\xe9rico, sino que deber\xe1 presionar las teclas que est\xe1n en la posici\xf3n donde est\xe1n los n\xfameros 2 y 3 en la pantalla de la Skywallet."},"create-tx":{"title":"Crear Transacci\xf3n","upper-text":"Por favor confirme la operaci\xf3n en la Skywallet despu\xe9s de verificar si los siguientes datos coinciden EXACTAMENTE con la transacci\xf3n que desea enviar y con los que muestra la Skywallet:","lower-text":"Si alg\xfan dato no corresponde a lo que muestra la Skywallet o la transacci\xf3n que desea enviar, cancele la operaci\xf3n en su Skywallet.","separator-for-coins-and-hours":"y","separator-to-destination":"a"},"confirm-address":{"title":"Confirmar Direcci\xf3n","instructions":"Por favor confirme en la Skywallet si la direcci\xf3n es:","short-confirmation":"Direcci\xf3n confirmada.","confirmation":"Direcci\xf3n confirmada. Por seguridad, puede volver a mostrar la direcci\xf3n en la Skywallet usando la opci\xf3n \\"Confirmar direcci\xf3n\\", en el men\xfa que puede mostrar presionando el bot\xf3n a la derecha del balance de la direccion."}},"time-from-now":{"few-seconds":"hace pocos segundos","minute":"hace un minuto","minutes":"hace {{time}} minutos","hour":"hace una hora","hours":"hace {{time}} horas","day":"hace un d\xeda","days":"hace {{time}} d\xedas"},"exchange":{"title-and-button":"Comprar {{ coinName }}","label-you-send":"Usted env\xeda","label-you-get":"Usted recibe (aprox.)","label-to-address":"A la direcci\xf3n de {{coin}}","label-price":"Tasa de cambio","label-stimate-transaction-time":"Duraci\xf3n del intercambio","exchange-button":"Intercambiar","min-amount":"Monto minimo:","max-amount":"Monto maximo:","agree-part1":"Acepto los","agree-part2":"T\xe9rminos de Uso","agree-part3":"y la ","agree-part4":"Pol\xedtica de Privacidad","powered-by":"Manejado por","need-help":"\xbfNecesita ayuda?","support-portal":"Portal de soporte","history":"Historial de \xf3rdenes","order-not-found":"Orden no encontrada","label-status":"Estado","exchanging":"Intercambiando {{from}} por {{to}}","destination-select-from-list-link":"Seleccionar","unavailable":"El servicio de intercambio no est\xe1 disponible en la versi\xf3n portable.","offline":"El servicio est\xe1 temporalmente offline","problem-connecting":"No se puede conectar con el servicio. Por favor compruebe su conexi\xf3n a Internet y vuelva a intentarlo m\xe1s tarde.","invalid-address-error":"Direcci\xf3n inv\xe1lida.","from-coin-error-info":"Debe seleccionar una moneda.","invalid-value-error-info":"Valor inv\xe1lido.","address-error-info":"Por favor introduzca una direcci\xf3n v\xe1lida.","statuses":{"user-waiting":"Esperando el deposito. Por favor env\xede {{amount}} {{from}} a la direcci\xf3n de intercambio indicada m\xe1s abajo","user-waiting-info":"El sistema est\xe1 a la espera de que usted realice el dep\xf3sito en la direcci\xf3n de intercambio. El proceso de intercambio comenzar\xe1 despu\xe9s de que se detecte el dep\xf3sito y sea confirmado en la cadena de bloques. Si ya ha realizado el dep\xf3sito, deber\xeda ser detectado en breve.","market-waiting-confirmations":"Esperando las confirmaciones de la transacci\xf3n","market-waiting-confirmations-info":"El dep\xf3sito ya ha sido detectado y el sistema est\xe1 esperando que sea confirmado en la cadena de bloques.","market-confirmed":"Transacci\xf3n aceptada","market-confirmed-info":"La transacci\xf3n ya ha sido confirmada en la cadena de bloques. Haciendo los preparativos para realizar el intercambio pronto.","market-exchanged":"{{from}} intercambiado por {{to}}","market-exchanged-info":"El intercambio se ha realizado. Los fondos ser\xe1n transferidos a su direcci\xf3n en un momento.","market-withdraw-waiting":"Enviando {{to}} a su direcci\xf3n","market-withdraw-waiting-info":"Se ha iniciado el proceso para enviar las monedas a su direcci\xf3n.","complete":"\xa1Intercambio completado!","complete-info":"Los fondos han sido enviados con \xe9xito a su direcci\xf3n.","error":"Se produjo un error","error-info":"Hubo un error en la operaci\xf3n, puede encontrar m\xe1s informaci\xf3n m\xe1s abajo. Si necesita ayuda, por favor guarde todos los datos de operaci\xf3n que se muestran m\xe1s abajo y comun\xedquese con soporte t\xe9cnico utilizando el enlace que se encuentra en la parte inferior derecha de esta p\xe1gina.","user-deposit-timeout":"Orden cancelada por inactividad","user-deposit-timeout-info":"El sistema ha cancelado la orden porque no se detect\xf3 ning\xfan dep\xf3sito, por favor abra una nueva orden. Si necesita ayuda, por favor guarde todos los datos de operaci\xf3n que se muestran m\xe1s abajo y comun\xedquese con soporte t\xe9cnico utilizando el enlace que se encuentra en la parte inferior derecha de esta p\xe1gina."},"history-window":{"title":"Historial de \xd3rdenes","address":"Direcci\xf3n:","date":"Fecha:"},"details":{"exchange-addr-label":"Direcci\xf3n de intercambio (v\xe1lida solo para esta operaci\xf3n de intercambio)","exchange-addr-tag-label":"Payment ID o Destination Tag que debe usarse para la transacci\xf3n","tx-id-label":"ID de la transacci\xf3n","order-id-label":"ID de la orden","initial-price-label":"Tasa de cambio inicial","error-msg-label":"Mensaje de error","details-link":"Detalles","start-date-label":"Fecha de inicio","back-alert":"La operaci\xf3n a\xfan est\xe1 en progreso. \xbfRealmente desea volver al formulario? Puede ver el progreso de esta operaci\xf3n nuevamente presionando el bot\xf3n \\"Historial de pedidos\\""}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.48d5cf3cd51fcbe131a5.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.48d5cf3cd51fcbe131a5.js new file mode 100644 index 0000000000..e2cc039dc9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.48d5cf3cd51fcbe131a5.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{bIFx:function(e){e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Loading...","done-title":"Done","warning-title":"Warning","error-title":"Error","changes-made":"The changes have been made.","back-button":"Back","create-button":"Create","load-button":"Load","cancel-button":"Cancel","continue-button":"Continue","close-button":"Close","generic-confirmation-check":"I understand the risks and want to continue","copied":"The text has been copied to the clipboard."},"errors":{"window-size":"The window is too narrow for the content."},"language":{"title":"Select Language"},"header":{"syncing-blocks":"Syncing blocks","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"Wallet update","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"available.","synchronizing":"The wallet is synchronizing. Data you see may not be updated.","pending-txs-part1":"There are some","pending-txs-part2":"pending transactions.","pending-txs-part3":"Data you see may not be updated.","no-connections":"No connections active, your client is not connected to any other nodes!","no-backend-part1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Security vulnerability: CSRF is not working, please exit immediately."}},"password":{"title":"Enter Password","password-label":"Password","password-error-info":"You must enter a password.","confirm-password-label":"Confirm password","confirm-error-info":"The two passwords must match.","proceed-button":"Proceed","reset-link":"I forgot my password","incorrect-password-error":"Incorrect password.","decrypting-error":"Error decrypting the wallet."},"buy":{"title-and-button":"Buy","deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address","generate":"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you\'d like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.","send":"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!","receive":"Receive Sky","receive-desc":"After receiving your Bitcoin, we\'ll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},"wizard":{"create-title":"Create Wallet","create-desc":"If you don\'t have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \\"Load\\" and enter your seed.","encrypt-title":"Encrypt Wallet","encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a Skywallet?","new-button":"New","load-button":"Load","finish-button":"Finish","confirm":{"title":"Safeguard Your Seed!","desc":"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!","checkbox":"It\u2019s safe, I swear."}},"wallet":{"title-and-button":"Wallets","show-empty-button":"Show Empty","hide-empty-button":"Hide Empty","encrypt-button":"Encrypt Wallet","decrypt-button":"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.","delete-button":"Delete Wallet","edit-button":"Rename","add-button":"Add Wallet","load-button":"Load Wallet","hardware-wallet-button":"Skywallet","encryption-enabled":"Encryption enabled.","encryption-disabled":"Encryption disabled.","warning-hw-security":"Possible security risk. Access the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list) while the device is connected for more information.","wallet-table-label":"Wallet","hardware-wallet-table-label":"Skywallet","delete-confirmation":"WARNING: The wallet \\"{{ name }}\\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list). Do you want to continue?","delete-confirmation-check":"Yeah, I want to delete the wallet","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?","new":{"create-title":"Create Wallet","load-title":"Load Wallet","name-label":"Name","name-error-info":"You must enter a name.","words-number-label":"How many words the seed has","seed-label":"Seed","seed-error-info":"You must enter a seed.","confirm-seed-label":"Confirm seed","confirm-seed-error-info":"The two seeds must match.","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","12-words":"12 words","24-words":"24 words","generate-12-help":"Generate a 12 word seed.","generate-24-help":"Generate a 24 word seed.","encrypt-check":"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","seed-checking-error":"It was not possible to verify the validity of the seed.","unconventional-seed-title":"Possible Error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed","synchronizing-warning-text":"The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \\"Scan Addresses\\" function or add them again manually.","wallet-created":"The wallet has been added to the list.","seed":{"enter-seed":"Press here to enter the seed","change-seed":"Press to change","confirm-seed":"Press here to confirm the seed","confirmed-seed":"Seed confirmed","use-custom":"Enter the seed manually","use-normal":"Enter the seed using the recommended method","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","incorrect-word-error":"The word you have entered does not match the requested one.","invalid-seed-error":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","word-error-info":"You must enter a word.","new-seed-info":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-info":"Please be sure to enter the correct words in the correct order."}},"rename":{"title":"Rename Wallet","name-label":"Name","label-error-info":"You must enter a name.","rename-button":"Rename"},"address-options":{"title":"Addresses","new":"New Addresses","scan":"Scan Addresses","scan-help":"Use this option to make the system find already used addresses from this wallet which are missing from the list."},"scan-addresses":{"done-with-new-addresses":"The list has been updated.","done-without-new-addresses":"No new addresses were found."},"add-addresses":{"title":"Select Quantity","quantity-label":"How many addresses to create","quantity-error-info":"You must enter a value between 1 and 100.","error":"There was an unexpected error. Please try again."},"address":{"show":"Press to show","copy":"Copy","copy-address":"Copy address","copied":"Copied!","confirm":"Confirm address","outputs":"Unspent outputs","history":"History"}},"qr":{"title":"QR Code","data-label":"QR data","address-label":"Address","request-link":"Request specific amount","amount-label":"Requested amount","hours-label":"Requested hours","message-label":"Message","invalid":"(invalid value)"},"send":{"title-and-button":"Send","unsigned-button":"Unsigned","signed-button":"Signed","unsigned-confirmation":"The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?","synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.","wallet-label":"Wallet","wallet-error-info":"You must select a wallet.","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins-link":"send all","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","addresses-label":"Addresses","addresses-error-info":"You must enter at least one valid address.","no-wallet-selected-error":"There are no coins to send.","no-coins-left-error":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent.","addresses-manual-help":"List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.","outputs-error":"There was an error trying to get the outputs. Please make sure you have entered valid addresses.","all-outputs":"All the outputs of the selected addresses","enter-addresses-for-outputs":"Valid addresses must be entered first","enter-wallet-for-outputs-and-addresses":"A valid wallet must be selected first","invalid-addresses-for-outputs":"No outputs available","available-funds-msg-part1":"With your current selection you can send up to","available-funds-msg-part2":"and","available-funds-msg-part3":"(at least","available-funds-msg-part4":"must be used as transaction fee for sending all the coins or hours).","change-address-label":"Custom change address","change-address-error-info":"The change address is not valid.","change-address-select-from-list-link":"Select","change-address-help":"Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the \\"Select\\" link to choose an address from one of your wallets.","specific-hours":"Hours to send:","remove-specific-hours-info":"Remove.","remove-specific-hours-confirmation":"Are you sure you want to remove the specific amount of hours to send?","destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins.","destinations-help2":"Destination addresses, their coins and hours.","destination-tools-title":"Destination Tools","hours-allocation-check":"Use automatic {{ coinHoursName }} allocation","options-link":"Options","coin-hours-options-link":"Hours options","hours-share-factor-label":"{{ coinHoursName }} share factor","hours-share-factor-help":"This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.","close-hours-share-factor-alert":"The option will be resetted to the default value. Are you sure you want to continue?","preview-button":"Preview","send-button":"Send","show-button":"Show","simple-form-button":"Simple","advanced-form-button":"Advanced","select-wallet":"Select wallet","saving-note-error":"The transaction was successfully sent, but it was not possible to save the note.","sent":"Transaction successfully sent.","total-to-send":"Total:","invalid-address-error":"The destination address is not valid.","one-invalid-address-error":"One of the destination addresses is not valid.","various-invalid-addresses-error":"Some destination addresses are not valid.","all-addresses-invalid-error":"The destination addresses are not valid.","invalid-addresses-error":"Please make sure the address is valid.","address-error-info":"Please enter a valid address.","invalid-value-error-info":"Invalid value.","insufficient-funds-error-info":"The entered value is greater than the available balance.","sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","advanced-sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","sending-all-hours-waning":"You selected to send all the hours. Are you sure you want to continue?","high-hours-share-waning":"Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?","advanced-high-hours-share-waning":"Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?","fill-with-link":{"title":"Use a Transaction Link","link-info":"Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.","link-label":"Transaction link","link-error-info":"You must enter a valid transaction link.","process-button":"Process","invalid-link-error":"The contents of the transaction link are not valid.","invalid-link-hours-error":"The transaction link contains an invalid amount of hours.","data-overwritten-alert":"Some data you have entered will be overwritten. Are you sure you want to continue?","confirmation":"The form has been updated with the data obtained from the transaction link."},"known-node-errors":{"null-change-address-error":"The null address can\'t be used as the custom change address. Please enter a valid address.","to-required-error":"You must provide a destination address for sending coins. Please enter a valid address.","zero-coins-error":"It\'s not possible to send zero coins. Please enter a valid amount.","null-destination-error":"The null address can\'t be used as destination. Please enter a valid address.","duplicate-destination-error":"There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.","hours-in-automatic-mode-error":"Specific hour amounts can\'t be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-needed-error":"The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.","invalid-hours-allocation-mode-error":"Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-not-needed-error":"The hour allocation mode can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-hours-mode-error":"Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.","share-factor-needed-error":"The hours share factor is needed. Please try with different values and contact support if the problem is not solved.","share-factor-not-needed-error":"The hours share factor can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-share-factor-error":"Invalid share factor. Please try with different values and contact support if the problem is not solved.","change-equal-to-destination-error":"The transaction can\'t be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.","repeated-wallet":"A wallet for the specified seed already exists."},"bulk-send":{"title":"Bulk Send","indications":"To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \\"xyz\\" address, type \\"xyz,10,5\\"; if you want the hours to be calculated automatically, type \\"xyz,10\\". Decimal values must be separated with a dot.","data-error-info":"You must enter a value.","process-button":"Process","no-data-error":"There is no text to process.","inconsistent-data-error":"If you set how many hours you want to send to a destination, you must do so for all destinations.","invalid-data-error":"The entered text has an invalid format."}},"select-address":{"title":"Select Address","no-addresses":"There are no confirmed addresses on this wallet."},"offline-transactions":{"loading-problem":"Error trying to get the necessary data","wallet-error-info":"You must select a wallet.","tx-error-info":"You must enter a valid transaction text.","copy-tx":{"signed-title":"Signed Transaction","unsigned-title":"Unsigned Transaction","text-unsigned":"This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \\"Sign Transaction\\" option.","text-signed":"This is the signed transaction. You can send it to the network using the \\"Broadcast Transaction\\" option.","input-label":"Transaction text","copy-button":"Copy","reset-confirmation":"Do you want the the form to be cleaned, so you can create another transaction?","reset-done":"The form has been cleaned."},"sign-tx":{"title":"Sign Transaction","text":"Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.","wallet-label":"Wallet","select-wallet":"Select wallet","input-label":"Transaction text","sign-button":"Sign","signed":"The transaction has been signed."},"broadcast-tx":{"title":"Broadcast Transaction","text":"Use this form to send a signed transaction to the network.","input-label":"Transaction text","send-button":"Send","sent":"The transaction has been sent."}},"reset":{"title":"Reset Password","wallet-label":"Wallet","seed-label":"Wallet seed","seed-error-info":"You must enter a seed.","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","confirm-error-info":"The two passwords must match.","reset-button":"Reset","done":"Password successfully changed."},"tx":{"transaction-title":"Transaction","confirm-transaction-title":"Confirm Transaction","from-small-label":"From:","to-small-label":"To:","date-small-label":"Date:","status-small-label":"Status:","coins-small-label":"Coins:","hours-small-label":"Hours:","id-small-label":"Tx ID:","note-small-label":"Note:","without-note":"Without note","show-more-link":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned","inputs-title":"Inputs","outputs-title":"Outputs","confirmed-transaction":"Confirmed","pending-transaction":"Pending","current-rate-help":"Calculated at the current rate."},"edit-note":{"title":"Edit Note","change-button":"Change"},"backup":{"title":"Backup Wallet","wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.","desc":"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","wallet-table-label":"Wallet name","filename-table-label":"Filename","save-addresses-button":"Save Addresses","show-seed-button":"Show Seed","no-wallets":"There are no wallets","unencrypted-info":"For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.","hw-wallet-info":"For getting the seed of a Skywallet, please use the \\"Skywallet\\" option at the bottom of the wallets page.","not-compatible-error":"Your web browser is not compatible with this function.","seed-modal-window":{"title":"Wallet Seed","seed-label":"Seed"}},"blockchain":{"title":"Blockchain","blocks-label":"Number of blocks","time-label":"Timestamp of last block","hash-label":"Hash of last block","current-supply-label":"Current {{ coinName }} supply","total-supply-label":"Total {{ coinName }} supply","current-coinhour-supply-label":"Current {{ coinHoursName }} supply","total-coinhour-supply-label":"Total {{ coinHoursName }} supply"},"network":{"title":"Networking","peer-small-table-label":"Peer","source-small-table-label":"Source","block-height-small-table-label":"Block height","block-height-short-small-table-label":"Block","last-seen-small-table-label":"Last seen","last-received-help":"Last received.","last-sent-help":"Last sent.","in-help":"Incoming.","out-help":"Outgoing.","sources":{"default":"Default peer","exchange":"Peer exchange"}},"pending-txs":{"title":"Pending Transactions","timestamp-table-label":"Timestamp","txid-table-label":"Transaction ID","none":"No pending transactions","my-transactions-button":"Mine","all-transactions-button":"All"},"outputs":{"title":"Outputs","error-no-outputs":"No unspent outputs"},"history":{"title-and-button":"History","tx-detail-title":"Transaction Detail","moving":"Internally moving {{ coinName }}","moved":"Internally moved {{ coinName }}","sending":"Sending {{ coinName }}","sent":"Sent {{ coinName }}","received":"Received {{ coinName }}","receiving":"Receiving {{ coinName }}","pending-indication":"Pending","transaction-note-small-label":"Note:","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)","filter":"Active filter: ","filters":"Active filters: ","all-addresses":"All addresses","view-all":"View all {{ number }} transactions"},"teller":{"done":"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin","unknown":"Unknown"},"confirmation":{"default-title":"Confirmation","yes-button":"Yes","no-button":"No"},"service":{"api":{"no-internet-error":"You do not have a internet connection or the node has stopped working.","incorrect-password-error":"Incorrect password.","unknown-error":"It was not possible to perform the operation.","api-disabled-error":"API disabled."}},"hardware-wallet":{"general":{"default-wallet-name":"New Skywallet","confirm":"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.","follow":"Please follow the instructions displayed on the Skywallet.","completed":"Operation completed successfully.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},"errors":{"generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","disconnected":"Unable to perform the operation. The Skywallet is not connected.","incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.","refused":"The operation failed or was canceled.","too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ","timeout":"The operation was canceled due to inactivity. Please try again.","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{"title":"Security Warning","text":"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.","link":"Open the Skywallet options window."},"options":{"connecting":"Connecting...","disconnected":"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":"A seedless Skywallet has been detected. Select \\"Configure Automatically\\" if you want to configure it as a brand new wallet and start using it. Select \\"Restore Backup\\" if you want to configure the Skywallet with a previously created seed backup.","configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security Warnings","security-warning-title":"Security Warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":"The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \\"Update Firmware\\" option.","backup-warning":"You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \\"Create a Backup\\" option.","pin-warning":"The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \\"Create PIN Code\\" option.","options":"Options:","update-firmware":"Update Firmware","configure-automatically":"Configure Automatically","restore-backup":"Restore Backup","create-backup":"Create a Backup","wipe":"Wipe the Device","confirm-seed":"Confirm Seed","create-pin":"Create PIN Code","change-pin":"Change PIN Code","delete-pin":"Delete PIN Code","forgotten-pin-part1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin-part2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{"title":"Outdated Firmware","text":"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.","update":"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.","follow":"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.","timeout":"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.","finished":"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{"text":"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.","configuring":"Configuring..."},"restore-seed":{"text":"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.","warning":"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: the retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: the seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: the seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},"added":{"title":"New Skywallet","configuring":"New Skywallet detected. Configuring...","done":"Done","added1":"The connected Skywallet has been added to the wallets list with the following name:","added2":"Now you can check the balance and the addresses of the Skywallet even when it is not connected.","added-error-info":"You must enter a name.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device."},"wipe":{"warning":"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete-check":"Also remove from the wallets list"},"create-backup":{"warning":"WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \\"seed\\") will be able access the wallet funds, so extreme caution is advised.","instructions":"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{"title":"Enter Word","enter-word":"Enter the word shown on the device","info":"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.","word-label":"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{"warning":"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties."},"enter-pin":{"title":"Enter PIN","title-change-current":"Enter the Current PIN","title-change-new":"Enter the New PIN","title-change-confirm":"Confirm the New PIN","instructions-generic":"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.","help":"Need help?"},"pin-help":{"title":"Help","part1":"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.","part2":"To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \\"23\\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.","part3":"If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \\"23\\", you can not simply type \\"23\\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \\"7\\" and \\"5\\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet."},"create-tx":{"title":"Create Transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","separator-for-coins-and-hours":"and","separator-to-destination":"to"},"confirm-address":{"title":"Confirm Address","instructions":"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.","confirmation":"Address confirmed. For security, you can re-show the address in the Skywallet using the \\"Confirm address\\" option, in the menu that you can display by pressing the button at the right of the address balance."}},"time-from-now":{"few-seconds":"a few seconds ago","minute":"one minute ago","minutes":"{{time}} minutes ago","hour":"one hour ago","hours":"{{time}} hours ago","day":"one day ago","days":"{{time}} days ago"},"exchange":{"title-and-button":"Buy {{ coinName }}","label-you-send":"You send","label-you-get":"You get (approx.)","label-to-address":"To {{coin}} address","label-price":"Exchange rate","label-stimate-transaction-time":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-part1":"I agree with the","agree-part2":"Terms of Use","agree-part3":"and the","agree-part4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal","history":"Order history","order-not-found":"Order not found","label-status":"Status","exchanging":"Exchanging {{from}} for {{to}}","destination-select-from-list-link":"Select","unavailable":"The exchange service is not available in the portable version","offline":"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later","invalid-address-error":"Invalid address.","from-coin-error-info":"You must select a coin.","invalid-value-error-info":"Invalid value.","address-error-info":"Please enter a valid address.","statuses":{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.","complete":"Exchange completed!","complete-info":"The funds have been successfully sent to your address.","error":"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{"title":"Order History","address":"Address:","date":"Date:"},"details":{"exchange-addr-label":"Exchange address (valid for this exchange operation only)","exchange-addr-tag-label":"Payment ID or Destination Tag which must be used for the transaction","tx-id-label":"Transaction ID","order-id-label":"Order ID","initial-price-label":"Initial exchange rate","error-msg-label":"Error message","details-link":"Details","start-date-label":"Start date","back-alert":"The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \\"Order history\\" button"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.94cd60a03904447d91d6.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.94cd60a03904447d91d6.js new file mode 100644 index 0000000000..3c39ddeb06 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.94cd60a03904447d91d6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{bIFx:function(e){e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Loading...","done-title":"Done","warning-title":"Warning","error-title":"Error","changes-made":"The changes have been made.","back-button":"Back","create-button":"Create","load-button":"Load","cancel-button":"Cancel","continue-button":"Continue","close-button":"Close","generic-confirmation-check":"I understand the risks and want to continue","copied":"The text has been copied to the clipboard."},"errors":{"window-size":"The window is too narrow for the content."},"language":{"title":"Select Language"},"header":{"syncing-blocks":"Syncing blocks","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"Wallet update","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"available.","synchronizing":"The wallet is synchronizing. Data you see may not be updated.","pending-txs-part1":"There are some","pending-txs-part2":"pending transactions.","pending-txs-part3":"Data you see may not be updated.","no-connections":"No connections active, your client is not connected to any other nodes!","no-backend-part1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Security vulnerability: CSRF is not working, please exit immediately."}},"password":{"title":"Enter Password","password-label":"Password","password-error-info":"You must enter a password.","confirm-password-label":"Confirm password","confirm-error-info":"The two passwords must match.","proceed-button":"Proceed","reset-link":"I forgot my password","incorrect-password-error":"Incorrect password.","decrypting-error":"Error decrypting the wallet."},"buy":{"title-and-button":"Buy","deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address","generate":"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you\'d like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.","send":"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!","receive":"Receive Sky","receive-desc":"After receiving your Bitcoin, we\'ll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},"wizard":{"create-title":"Create Wallet","create-desc":"If you don\'t have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \\"Load\\" and enter your seed.","encrypt-title":"Encrypt Wallet","encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a Skywallet?","new-button":"New","load-button":"Load","finish-button":"Finish","confirm":{"title":"Safeguard Your Seed!","desc":"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!","checkbox":"It\u2019s safe, I swear."}},"wallet":{"title-and-button":"Wallets","show-empty-button":"Show Empty","hide-empty-button":"Hide Empty","encrypt-button":"Encrypt Wallet","decrypt-button":"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.","delete-button":"Delete Wallet","rename-button":"Rename","add-button":"New Wallet","load-button":"Load Wallet","hardware-wallet-button":"Skywallet","encryption-enabled":"Encryption enabled.","encryption-disabled":"Encryption disabled.","warning-hw-security":"Possible security risk. Access the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list) while the device is connected for more information.","wallet-table-label":"Wallet","hardware-wallet-table-label":"Skywallet","delete-confirmation":"WARNING: The wallet \\"{{ name }}\\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list). Do you want to continue?","delete-confirmation-check":"Yeah, I want to delete the wallet","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?","busy-error":"Please wait for the previous operation to be completed.","new":{"create-title":"Create Wallet","load-title":"Load Wallet","name-label":"Name","name-error-info":"You must enter a name.","words-number-label":"How many words the seed has","seed-label":"Seed","seed-error-info":"You must enter a seed.","confirm-seed-label":"Confirm seed","confirm-seed-error-info":"The two seeds must match.","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","12-words":"12 words","24-words":"24 words","generate-12-help":"Generate a 12 word seed.","generate-24-help":"Generate a 24 word seed.","encrypt-check":"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","seed-checking-error":"It was not possible to verify the validity of the seed.","unconventional-seed-title":"Possible Error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed","synchronizing-warning-text":"The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \\"Scan Addresses\\" function or add them again manually.","wallet-created":"The wallet has been added to the list.","seed":{"enter-seed":"Press here to enter the seed","change-seed":"Press to change","confirm-seed":"Press here to confirm the seed","confirmed-seed":"Seed confirmed","use-custom":"Enter the seed manually","use-normal":"Enter the seed using the recommended method","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","incorrect-word-error":"The word you have entered does not match the requested one.","invalid-seed-error":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","word-error-info":"You must enter a word.","new-seed-info":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-info":"Please be sure to enter the correct words in the correct order."}},"rename":{"title":"Rename Wallet","name-label":"Name","label-error-info":"You must enter a name.","rename-button":"Rename"},"address-options":{"title":"Addresses","new":"New Addresses","scan":"Scan Addresses","scan-help":"Use this option to make the system find already used addresses from this wallet which are missing from the list."},"scan-addresses":{"done-with-new-addresses":"The list has been updated.","done-without-new-addresses":"No new addresses were found."},"add-addresses":{"title":"Select Quantity","quantity-label":"How many addresses to create","quantity-error-info":"You must enter a value between 1 and 100.","error":"There was an unexpected error. Please try again."},"address":{"show":"Press to show","copy":"Copy","copy-address":"Copy address","copied":"Copied!","confirm":"Confirm address","outputs":"Unspent outputs","history":"History"}},"qr":{"title":"QR Code","data-label":"QR data","address-label":"Address","request-link":"Request specific amount","amount-label":"Requested amount","hours-label":"Requested hours","message-label":"Message","invalid":"(invalid value)"},"send":{"title-and-button":"Send","unsigned-button":"Unsigned","signed-button":"Signed","unsigned-confirmation":"The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?","synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.","wallet-label":"Wallet","wallet-error-info":"You must select a wallet.","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins-link":"send all","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","addresses-label":"Addresses","addresses-error-info":"You must enter at least one valid address.","no-wallet-selected-error":"There are no coins to send.","no-coins-left-error":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent.","addresses-manual-help":"List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.","outputs-error":"There was an error trying to get the outputs. Please make sure you have entered valid addresses.","all-outputs":"All the outputs of the selected addresses","enter-addresses-for-outputs":"Valid addresses must be entered first","enter-wallet-for-outputs-and-addresses":"A valid wallet must be selected first","invalid-addresses-for-outputs":"No outputs available","available-funds-msg-part1":"With your current selection you can send up to","available-funds-msg-part2":"and","available-funds-msg-part3":"(at least","available-funds-msg-part4":"must be used as transaction fee for sending all the coins or hours).","change-address-label":"Custom change address","change-address-error-info":"The change address is not valid.","change-address-select-from-list-link":"Select","change-address-help":"Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the \\"Select\\" link to choose an address from one of your wallets.","specific-hours":"Hours to send:","remove-specific-hours-info":"Remove.","remove-specific-hours-confirmation":"Are you sure you want to remove the specific amount of hours to send?","destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins.","destinations-help2":"Destination addresses, their coins and hours.","destination-tools-title":"Destination Tools","hours-allocation-check":"Use automatic {{ coinHoursName }} allocation","options-link":"Options","coin-hours-options-link":"Hours options","hours-share-factor-label":"{{ coinHoursName }} share factor","hours-share-factor-help":"This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.","close-hours-share-factor-alert":"The option will be resetted to the default value. Are you sure you want to continue?","preview-button":"Preview","send-button":"Send","show-button":"Show","simple-form-button":"Simple","advanced-form-button":"Advanced","select-wallet":"Select wallet","saving-note-error":"The transaction was successfully sent, but it was not possible to save the note.","sent":"Transaction successfully sent.","total-to-send":"Total:","invalid-address-error":"The destination address is not valid.","one-invalid-address-error":"One of the destination addresses is not valid.","various-invalid-addresses-error":"Some destination addresses are not valid.","all-addresses-invalid-error":"The destination addresses are not valid.","invalid-addresses-error":"Please make sure the address is valid.","address-error-info":"Please enter a valid address.","invalid-value-error-info":"Invalid value.","insufficient-funds-error-info":"The entered value is greater than the available balance.","sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","advanced-sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","sending-all-hours-waning":"You selected to send all the hours. Are you sure you want to continue?","high-hours-share-waning":"Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?","advanced-high-hours-share-waning":"Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?","fill-with-link":{"title":"Use a Transaction Link","link-info":"Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.","link-label":"Transaction link","link-error-info":"You must enter a valid transaction link.","process-button":"Process","invalid-link-error":"The contents of the transaction link are not valid.","invalid-link-hours-error":"The transaction link contains an invalid amount of hours.","data-overwritten-alert":"Some data you have entered will be overwritten. Are you sure you want to continue?","confirmation":"The form has been updated with the data obtained from the transaction link."},"known-node-errors":{"null-change-address-error":"The null address can\'t be used as the custom change address. Please enter a valid address.","to-required-error":"You must provide a destination address for sending coins. Please enter a valid address.","zero-coins-error":"It\'s not possible to send zero coins. Please enter a valid amount.","null-destination-error":"The null address can\'t be used as destination. Please enter a valid address.","duplicate-destination-error":"There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.","hours-in-automatic-mode-error":"Specific hour amounts can\'t be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-needed-error":"The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.","invalid-hours-allocation-mode-error":"Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-not-needed-error":"The hour allocation mode can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-hours-mode-error":"Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.","share-factor-needed-error":"The hours share factor is needed. Please try with different values and contact support if the problem is not solved.","share-factor-not-needed-error":"The hours share factor can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-share-factor-error":"Invalid share factor. Please try with different values and contact support if the problem is not solved.","change-equal-to-destination-error":"The transaction can\'t be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.","repeated-wallet":"A wallet for the specified seed already exists."},"bulk-send":{"title":"Bulk Send","indications":"To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \\"xyz\\" address, type \\"xyz,10,5\\"; if you want the hours to be calculated automatically, type \\"xyz,10\\". Decimal values must be separated with a dot.","data-error-info":"You must enter a value.","process-button":"Process","no-data-error":"There is no text to process.","inconsistent-data-error":"If you set how many hours you want to send to a destination, you must do so for all destinations.","invalid-data-error":"The entered text has an invalid format."}},"select-address":{"title":"Select Address","no-addresses":"There are no confirmed addresses on this wallet."},"offline-transactions":{"loading-problem":"Error trying to get the necessary data","wallet-error-info":"You must select a wallet.","tx-error-info":"You must enter a valid transaction text.","copy-tx":{"signed-title":"Signed Transaction","unsigned-title":"Unsigned Transaction","text-unsigned":"This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \\"Sign Transaction\\" option.","text-signed":"This is the signed transaction. You can send it to the network using the \\"Broadcast Transaction\\" option.","input-label":"Transaction text","copy-button":"Copy","reset-confirmation":"Do you want the the form to be cleaned, so you can create another transaction?","reset-done":"The form has been cleaned."},"sign-tx":{"title":"Sign Transaction","text":"Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.","wallet-label":"Wallet","select-wallet":"Select wallet","input-label":"Transaction text","sign-button":"Sign","signed":"The transaction has been signed."},"broadcast-tx":{"title":"Broadcast Transaction","text":"Use this form to send a signed transaction to the network.","input-label":"Transaction text","send-button":"Send","sent":"The transaction has been sent."}},"reset":{"title":"Reset Password","wallet-label":"Wallet","seed-label":"Wallet seed","seed-error-info":"You must enter a seed.","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","confirm-error-info":"The two passwords must match.","reset-button":"Reset","done":"Password successfully changed."},"tx":{"transaction-title":"Transaction","confirm-transaction-title":"Confirm Transaction","from-small-label":"From:","to-small-label":"To:","date-small-label":"Date:","status-small-label":"Status:","coins-small-label":"Coins:","hours-small-label":"Hours:","id-small-label":"Tx ID:","note-small-label":"Note:","without-note":"Without note","show-more-link":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned","inputs-title":"Inputs","outputs-title":"Outputs","confirmed-transaction":"Confirmed","pending-transaction":"Pending","current-rate-help":"Calculated at the current rate."},"edit-note":{"title":"Edit Note","change-button":"Change"},"backup":{"title":"Backup Wallet","wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.","desc":"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","wallet-table-label":"Wallet name","filename-table-label":"Filename","save-addresses-button":"Save Addresses","show-seed-button":"Show Seed","no-wallets":"There are no wallets","unencrypted-info":"For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.","hw-wallet-info":"For getting the seed of a Skywallet, please use the \\"Skywallet\\" option at the bottom of the wallets page.","not-compatible-error":"Your web browser is not compatible with this function.","seed-modal-window":{"title":"Wallet Seed","seed-label":"Seed"}},"blockchain":{"title":"Blockchain","blocks-label":"Number of blocks","time-label":"Timestamp of last block","hash-label":"Hash of last block","current-supply-label":"Current {{ coinName }} supply","total-supply-label":"Total {{ coinName }} supply","current-coinhour-supply-label":"Current {{ coinHoursName }} supply","total-coinhour-supply-label":"Total {{ coinHoursName }} supply"},"network":{"title":"Networking","error-no-connections":"No connections","peer-small-table-label":"Peer","source-small-table-label":"Source","block-height-small-table-label":"Block height","block-height-short-small-table-label":"Block","last-seen-small-table-label":"Last seen","last-received-help":"Last received.","last-sent-help":"Last sent.","in-help":"Incoming.","out-help":"Outgoing.","sources":{"default":"Default peer","exchange":"Peer exchange"}},"pending-txs":{"title":"Pending Transactions","timestamp-table-label":"Timestamp","txid-table-label":"Transaction ID","none":"No pending transactions","my-transactions-button":"Mine","all-transactions-button":"All"},"outputs":{"title":"Outputs","error-no-outputs":"No unspent outputs"},"history":{"title-and-button":"History","tx-detail-title":"Transaction Detail","moving":"Internally moving {{ coinName }}","moved":"Internally moved {{ coinName }}","sending":"Sending {{ coinName }}","sent":"Sent {{ coinName }}","received":"Received {{ coinName }}","receiving":"Receiving {{ coinName }}","pending-indication":"Pending","transaction-note-small-label":"Note:","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)","filter":"Active filter: ","filters":"Active filters: ","all-addresses":"All addresses","view-all":"View all {{ number }} transactions"},"teller":{"done":"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin","unknown":"Unknown"},"confirmation":{"default-title":"Confirmation","yes-button":"Yes","no-button":"No"},"service":{"api":{"no-internet-error":"You do not have a internet connection or the node has stopped working.","incorrect-password-error":"Incorrect password.","unknown-error":"It was not possible to perform the operation.","api-disabled-error":"API disabled."}},"force-skywallet-wipe":{"title":"Forced Skywallet Wipe","operation-warning":"This option is designed only as a last resort for cases where the device cannot be used with the normal options. All data on the device will be erased, so you will need your seed to recover the funds.","proceed-button":"Proceed"},"hardware-wallet":{"general":{"default-wallet-name":"New Skywallet","confirm":"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.","follow":"Please follow the instructions displayed on the Skywallet.","completed":"Operation completed successfully.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},"errors":{"generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","disconnected":"Unable to perform the operation. The Skywallet is not connected.","incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.","refused":"The operation was canceled.","too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ","timeout":"The operation was canceled due to inactivity. Please try again.","timeout-with-configurable-link":"The operation was canceled due to inactivity. Please try again. If this issue prevents the device from being usable, you can use the following option:","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{"title":"Security Warning","text":"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.","link":"Open the Skywallet options window."},"options":{"connecting":"Connecting...","disconnected":"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":"A seedless Skywallet has been detected. Select \\"Configure Automatically\\" if you want to configure it as a brand new wallet and start using it. Select \\"Restore Backup\\" if you want to configure the Skywallet with a previously created seed backup.","configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security Warnings","security-warning-title":"Security Warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":"The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \\"Update Firmware\\" option.","backup-warning":"You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \\"Create a Backup\\" option.","pin-warning":"The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \\"Create PIN Code\\" option.","options":"Options:","update-firmware":"Update Firmware","configure-automatically":"Configure Automatically","restore-backup":"Restore Backup","create-backup":"Create a Backup","wipe":"Wipe the Device","confirm-seed":"Confirm Seed","create-pin":"Create PIN Code","change-pin":"Change PIN Code","delete-pin":"Delete PIN Code","forgotten-pin-part1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin-part2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{"title":"Outdated Firmware","text":"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.","update":"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.","follow":"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.","timeout":"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.","finished":"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{"text":"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.","configuring":"Configuring..."},"restore-seed":{"text":"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.","warning":"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: the retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: the seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: the seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},"added":{"title":"New Skywallet","configuring":"New Skywallet detected. Configuring...","done":"Done","added1":"The connected Skywallet has been added to the wallets list with the following name:","added2":"Now you can check the balance and the addresses of the Skywallet even when it is not connected.","added-error-info":"You must enter a name.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device."},"wipe":{"warning":"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete-check":"Also remove from the wallets list"},"create-backup":{"warning":"WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \\"seed\\") will be able access the wallet funds, so extreme caution is advised.","instructions":"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{"title":"Enter Word","enter-word":"Enter the word shown on the device","info":"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.","word-label":"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{"warning":"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties."},"enter-pin":{"title":"Enter PIN","title-change-current":"Enter the Current PIN","title-change-new":"Enter the New PIN","title-change-confirm":"Confirm the New PIN","instructions-generic":"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.","help":"Need help?"},"pin-help":{"title":"Help","part1":"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.","part2":"To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \\"23\\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.","part3":"If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \\"23\\", you can not simply type \\"23\\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \\"7\\" and \\"5\\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet."},"create-tx":{"title":"Create Transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","separator-for-coins-and-hours":"and","separator-to-destination":"to"},"confirm-address":{"title":"Confirm Address","instructions":"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.","confirmation":"Address confirmed. For security, you can re-show the address in the Skywallet using the \\"Confirm address\\" option, in the menu that you can display by pressing the button at the right of the address balance."}},"time-from-now":{"few-seconds":"a few seconds ago","minute":"one minute ago","minutes":"{{time}} minutes ago","hour":"one hour ago","hours":"{{time}} hours ago","day":"one day ago","days":"{{time}} days ago"},"exchange":{"title-and-button":"Buy {{ coinName }}","label-you-send":"You send","label-you-get":"You get (approx.)","label-to-address":"To {{coin}} address","label-price":"Exchange rate","label-stimate-transaction-time":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-part1":"I agree with the","agree-part2":"Terms of Use","agree-part3":"and the","agree-part4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal","history":"Order history","order-not-found":"Order not found","label-status":"Status","exchanging":"Exchanging {{from}} for {{to}}","destination-select-from-list-link":"Select","unavailable":"The exchange service is not available in the portable version","offline":"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later","invalid-address-error":"Invalid address.","from-coin-error-info":"You must select a coin.","invalid-value-error-info":"Invalid value.","address-error-info":"Please enter a valid address.","statuses":{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.","complete":"Exchange completed!","complete-info":"The funds have been successfully sent to your address.","error":"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{"title":"Order History","address":"Address:","date":"Date:"},"details":{"exchange-addr-label":"Exchange address (valid for this exchange operation only)","exchange-addr-tag-label":"Payment ID or Destination Tag which must be used for the transaction","tx-id-label":"Transaction ID","order-id-label":"Order ID","initial-price-label":"Initial exchange rate","error-msg-label":"Error message","details-link":"Details","start-date-label":"Start date","back-alert":"The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \\"Order history\\" button"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.b1328f7fc5fe260edda4.chunk.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.b1328f7fc5fe260edda4.chunk.js new file mode 100644 index 0000000000..73fef9233e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3.b1328f7fc5fe260edda4.chunk.js @@ -0,0 +1 @@ +webpackJsonp([3],{"0v8u":function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Loading...",new:"New",load:"Load"},errors:{error:"Error","fetch-version":"Unable to fetch latest release version from Github","incorrect-password":"Incorrect password","error-decrypting":"Error decrypting the wallet","api-disabled":"API disabled","no-wallet":"Wallet does not exist","no-outputs":"No unspent outputs","window-size":"The window is too narrow for the content"},title:{language:"Select Language",wallets:"Wallets",send:"Send",history:"History","buy-coin":"Buy Skycoin",network:"Networking",blockchain:"Blockchain",outputs:"Outputs",transactions:"Transactions","pending-txs":"Pending Transactions",backup:"Backup Wallet",explorer:"Skycoin Explorer",seed:"Wallet Seed",qrcode:"QR Code",reset:"Reset Password",exchange:"Exchange","select-address":"Select Address","order-history":"Order history"},header:{"syncing-blocks":"Syncing blocks",update1:"Wallet update",update2:"available.",synchronizing:"The wallet is synchronizing. Data you see may not be updated.","pending-txs1":"There are some","pending-txs2":"pending transactions.","pending-txs3":"Data you see may not be updated.",errors:{"no-connections":"No connections active, your client is not connected to any other nodes!","no-backend1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend2":"Telegram.","no-backend3":"",csrf:"Security vulnerability: CSRF is not working, please exit immediately."}},password:{title:"Enter Password",label:"Password","confirm-label":"Confirm password",button:"Proceed","reset-link":"I forgot my password"},buy:{"deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address",generate:"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.",send:"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!",receive:"Receive Sky","receive-desc":"After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},wizard:{"wallet-desc":'If you don\'t have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to "Load Wallet" and enter your seed.',"encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a hardware wallet?","finish-button":"Finish","back-button":"Back",confirm:{title:"Safeguard your seed!",desc:"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!",checkbox:"It\u2019s safe, I swear.",button:"Continue"}},wallet:{"new-address":"New Address","new-addresses":"New Addresses","show-empty":"Show Empty","hide-empty":"Hide Empty",encrypt:"Encrypt Wallet",decrypt:"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.",delete:"Delete Wallet",edit:"Edit Wallet",add:"Add Wallet",load:"Load Wallet","encryption-enabled":"Encryption enabled","encryption-disabled":"Encryption disabled","hw-security-warning":'Possible security risk. Access the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected for more information.',wallet:"Wallet","hardware-wallet":"Hardware Wallet","delete-confirmation":'WARNING: The wallet "{{ name }}" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list). Do you want to continue?',"delete-confirmation-check":"Yeah, I want to delete the wallet.","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the hardware wallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?",new:{"create-title":"Create Wallet","load-title":"Load Wallet","encrypt-title":"Encrypt Wallet","name-label":"Name","seed-label":"Seed","confirm-seed-label":"Confirm seed","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","create-button":"Create","load-button":"Load","cancel-button":"Cancel","12-words":"12 words","24-words":"24 words","generate-12-seed":"Generate 12 word seed","generate-24-seed":"Generate 24 word seed",encrypt:"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","unconventional-seed-title":"Possible error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed."},rename:{title:"Rename Wallet","name-label":"Name","cancel-button":"Cancel","rename-button":"Rename"},"add-addresses":{title:"Select quantity","name-quantity":"How many addresses to create","cancel-button":"Cancel","create-button":"Create"},address:{show:"Press to show",copy:"Copy","copy-address":"Copy address",copied:"Copied!",confirm:"Confirm address",outputs:"Unspent outputs",history:"History"}},send:{"synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","notes-label":"Notes","wallet-label":"Wallet","addresses-label":"Addresses","invalid-amount":"Please enter a valid amount","addresses-help":"Limit the addresses from where the coins and hours could be sent","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown","all-outputs":"All the outputs of the selected addresses","available-msg-part1":"With your current selection you can send up to","available-msg-part2":"and","available-msg-part3":"(at least","available-msg-part4":"must be used for the transaction fee).","change-address-label":"Custom change address","change-address-select":"Select","change-address-help":'Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the "Select" link to choose an address from one of your wallets',"destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins","destinations-help2":"Destination addresses, their coins and coin hours","hours-allocation-label":"Automatic coin hours allocation","options-label":"Options","value-label":"Coin hours share factor","value-help":"The higher the value, the more coin hours will be sent to outputs","preview-button":"Preview","send-button":"Send","back-button":"Back",simple:"Simple",advanced:"Advanced","select-wallet":"Select Wallet"},reset:{"wallet-label":"Wallet","seed-label":"Wallet seed","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","reset-button":"Reset"},tx:{transaction:"Transaction","confirm-transaction":"Confirm Transaction",from:"From",to:"To",date:"Date",status:"Status",coins:"Coins",hours:"Hours",id:"Tx ID","show-more":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned",inputs:"Inputs",outputs:"Outputs",confirmed:"Confirmed",pending:"Pending","current-rate":"Calculated at the current rate"},backup:{"wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.",desc:"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","close-button":"Close",wallet:"Wallet Label",filename:"Filename",seed:"Seed","show-seed":"Show seed","no-wallets":"No encrypted wallets"},blockchain:{blocks:"Number of blocks",time:"Timestamp of last block",hash:"Hash of last block","current-supply":"Current SKY supply","total-supply":"Total SKY supply","current-coinhour-supply":"Current Coin Hours supply","total-coinhour-supply":"Total Coin Hours supply"},network:{peer:"Peer",source:"Source","block-height":"Block height","block-height-short":"Block","last-seen":"Last seen","last-received":"Last received","last-sent":"Last sent",in:"Incoming",out:"Outgoing",sources:{default:"Default peer",exchange:"Peer exchange"}},"pending-txs":{timestamp:"Timestamp",txid:"Transaction ID",none:"No pending transactions",my:"Mine",all:"All"},history:{"tx-detail":"Transaction Detail",moving:"Internally moving",moved:"Internally moved",sending:"Sending",sent:"Sent",received:"Received",receiving:"Receiving",pending:"Pending","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)",filter:"Active filter: ",filters:"Active filters: ","all-addresses":"All addresses"},teller:{done:"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin",unknown:"Unknown"},confirmation:{"header-text":"Confirmation","confirm-button":"Yes","cancel-button":"No",close:"Close"},service:{api:{"server-error":"Server error"},wallet:{"not-enough-hours":"Not enough available Coin Hours to perform the transaction!"}},"hardware-wallet":{general:{"default-wallet-name":"New hardware wallet","error-disconnected":"Unable to perform the operation. The hardware wallet is not connected.","simple-error":"Error, Unable to perform the operation.","generic-error":"Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.","generic-error-internet":"Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.","error-incorrect-wallet":"Unable to perform the operation. The connected hardware wallet is different from the expected one.","error-incorrect-pin":"Unable to perform the operation. The PIN you have entered is not correct.",confirm:"Please, confirm the operation in the hardware wallet.","confirm-and-more":"Please, confirm the operation in the hardware wallet and follow the instructions.",close:"Close",cancel:"Cancel",continue:"Continue",completed:"Operation completed successfully.",refused:"The operation failed or was canceled."},errors:{"too-many-inputs":"The transaction has too many inputs and can not be processed. Please contact technical support.","too-many-outputs":"The transaction has too many outputs and can not be processed. Please contact technical support."},"security-warning":{title:"Security warning",text:'The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected and solve the security problems before continuing.',check:"I understand the risks and want to continue",continue:"Continue",cancel:"Cancel"},options:{connecting:"Connecting...",disconnected:"No hardware wallet detected. Please connect a hardware wallet to use this option.","unconfigured-detected-title":"Unconfigured hardware wallet","unconfigured-detected":'A seedless hardware wallet has been detected. Select "Configure automatically" if you want to configure it as a brand new wallet and start using it immediately, or select "Restore backup" if you want to configure it with a previously created seed backup and thus be able to access your funds again.',"configured-detected":"Hardware wallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security warnings","security-warning-title":"Security warning","backup-warning":'You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the "Create a backup" option.',"pin-warning":'The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the "Create PIN code" option.',options:"Options:","configure-automatically":"Configure automatically","restore-backup":"Restore backup","create-backup":"Create a backup",wipe:"Wipe the device","confirm-seed":"Confirm seed","create-pin":"Create PIN code","change-pin":"Change PIN code","forgotten-pin1":"If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking","forgotten-pin2":"here."},"generate-seed":{text:"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.",configuring:"Configuring..."},"restore-seed":{text:"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.",warning:"WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.","error-wrong-word":"Error: The retyped word does not match the one requested by the hardware wallet.","error-invalid-seed":"Error: The seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: The seed is valid but does not match the one in the device."},added:{title:"New Hardware Wallet",configuring:"New hardware wallet detected. Configuring...",done:"Done",added1:"The connected hardware wallet has been added to the wallets list with the following name:",added2:"Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish."},wipe:{warning:"WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete":"Also remove from the wallets list"},"create-backup":{warning:'WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the "seed") will be able access the wallet balance, so extreme caution is advised.',instructions:"Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly."},"seed-word":{title:"Enter word",info1:"Enter the word indicated in the device",info2:"You will be asked to enter the words of your backup seed in random order, plus a few additional words.",word:"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. Two PINs you have entered do not match."},"enter-pin":{title:"Enter PIN","title-change-current":"Enter the current PIN","title-change-new":"Enter the new PIN","title-change-confirm":"Confirm the new PIN",instructions:"The PIN layout is displayed on the hardware wallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction.","instructions-change":"Please enter a hard-to-guess PIN of between 4 and 8 numbers.",help:"Need help?"},"pin-help":{title:"Help",part1:"When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.",part2:'To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is "23" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.',part3:'If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is "23", you can not simply type "23" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet.'},"create-tx":{title:"Create transaction"},"confirm-address":{title:"Confirm address",instructions:"Please confirm on the hardware wallet if the address is:","short-confirmation":"Address confirmed.",confirmation:'Address confirmed. For security, you can re-show the address in the hardware wallet using the "Confirm address" option, in the menu that you can display by pressing the button at the right of the address balance.'}},"time-from-now":{"few-seconds":"a few seconds ago",minute:"one minute ago",minutes:"{{time}} minutes ago",hour:"one hour ago",hours:"{{time}} hours ago",day:"one day ago",days:"{{time}} days ago"},exchange:{"you-send":"You send","you-get":"You get (approx.)","to-address":"To {{coin}} address",price:"Exchange rate","time-15":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-1":"I agree with","agree-2":"Terms of Use","agree-3":"and","agree-4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal",history:"Order history","order-not-found":"Order not found",status:"Status",exchanging:"Exchanging {{from}} for {{to}}",select:"Select",offline:"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later.","invalid-address":"Invalid address.",statuses:{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.",complete:"Exchange completed!","complete-info":"The funds have been successfully sent to your address.",error:"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{address:"Address",date:"Date"},details:{"exchange-addr":"Exchange address","exchange-addr-tag":"Payment ID or Destination Tag which must be used for the transaction","tx-id":"Transaction ID","order-id":"Order ID","initial-price":"Initial exchange rate","error-msg":"Error message",details:"Details","start-date":"Start date",back:"Back","back-alert":'The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the "Order history" button'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3rdpartylicenses.txt b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3rdpartylicenses.txt new file mode 100644 index 0000000000..84bd26e015 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3rdpartylicenses.txt @@ -0,0 +1,294 @@ +@angular-devkit/build-angular +MIT +The MIT License + +Copyright (c) 2017 Google, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +@babel/runtime +MIT +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +base-x +MIT +The MIT License (MIT) + +Copyright (c) 2018 base-x contributors +Copyright (c) 2014-2018 The Bitcoin Core developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +base64-js +MIT +The MIT License (MIT) + +Copyright (c) 2014 Jameson Little + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +bignumber.js +MIT +The MIT Licence. + +Copyright (c) 2018 Michael Mclaughlin + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +buffer +MIT +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh, and other contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +core-js +MIT +Copyright (c) 2014-2021 Denis Pushkarev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +font-awesome +(OFL-1.1 AND MIT) + +ieee754 +BSD-3-Clause +Copyright 2008 Fair Oaks Labs, Inc. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +moment +MIT +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + +regenerator-runtime +MIT +MIT License + +Copyright (c) 2014-present, Facebook, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +safe-buffer +MIT +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +zone.js +MIT +The MIT License + +Copyright (c) 2010-2020 Google LLC. https://angular.io/license + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.044e43d2fce319e7ba13.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.044e43d2fce319e7ba13.js new file mode 100644 index 0000000000..6dd3b551a0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.044e43d2fce319e7ba13.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{"3Al/":function(e){e.exports=JSON.parse('{"common":{"coin-id":"SKY","coin-hours":"CH","loading":"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...","new":"\u041d\u043e\u0432\u044b\u0439","load":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c"},"errors":{"fetch-version":"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441 Github","incorrect-password":"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c","api-disabled":"API \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d","no-wallet":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","no-outputs":"\u041d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432"},"title":{"wallets":"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u0438","send":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","history":"\u0418\u0441\u0442\u043e\u0440\u0438\u044f","buy-coin":"\u041a\u0443\u043f\u0438\u0442\u044c Skycoin","network":"\u0421\u0435\u0442\u044c","blockchain":"\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d","outputs":"\u0412\u044b\u0445\u043e\u0434\u044b (Outputs)","transactions":"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","pending-txs":"\u041d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","backup":"\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","explorer":"Skycoin \u044d\u043a\u0441\u043f\u043b\u043e\u0440\u0435\u0440","seed":"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f","qrcode":"QR-\u043a\u043e\u0434"},"header":{"syncing-blocks":"\u0418\u0434\u0451\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432...","update1":"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","update2":"\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e.","pending-txs1":"\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","pending-txs2":"\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.","pending-txs3":"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0442\u044c\u044e.","errors":{"no-connections":"\u041d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u0432\u0430\u0448 \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0437\u043b\u0430\u043c!","no-backend1":"\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443. \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u0435\u044c \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435","no-backend2":"\u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c\u0435.","no-backend3":"","csrf":"\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438: CSRF \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442."}},"password":{"title":"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c","label":"\u041f\u0430\u0440\u043e\u043b\u044c","confirm-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c","button":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"},"buy":{"deposit-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430:","select-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441","generate":"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c","deposit-location":"\u0410\u0434\u0440\u0435\u0441 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f","deposit-location-desc":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f Skycoin, \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430.","make-choice":"\u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0432\u044b\u0431\u043e\u0440","wallets-desc":"\u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0430\u0434\u0440\u0435\u0441\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430. \u041e\u0434\u0438\u043d \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d \u043a \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0430\u0434\u0440\u0435\u0441\u043e\u0432.","send":"\u041f\u043e\u0448\u043b\u0438\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443","send-desc":"\u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0432\u0430\u043c\u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u043d\u0438\u0436\u0435. \u041f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 {{ rate }} Skycoin/Selected Coin.","fraction-warning":"\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.","receive":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Skycoin","receive-desc":"\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u0430\u0432\u0430\u043b\u044e\u0442\u044b, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u043d\u0435\u0439, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u043b\u0430\u0442\u044b \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u0438.","status-button":"\u0421\u0442\u0430\u0442\u0443\u0441:","check-status-button":"\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441","new-order-button":"\u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u043a\u0430\u0437","refresh":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c","available-now":"\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e:","choose-preference":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b. \u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b.","choose":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u043b\u044e\u0431\u0438\u043c\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u0443 ;)","send-coin":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","send-coin-text-1":"\u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043d\u0438\u0436\u0435. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u043d\u0430 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0435, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u043f\u043e \u043a\u0443\u0440\u0441\u0443"},"wizard":{"wallet-desc":"\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 Skycoin, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0444\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0444\u0440\u0430\u0437\u0430 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \\"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\\" \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u0444\u0440\u0430\u0437\u0443.","encrypt-desc":"\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0442\u0438, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0435\u0433\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u0435.","finish-button":"\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434","confirm":{"title":"\u0414\u0435\u0440\u0436\u0438\u0442\u0435 \u0441\u0432\u043e\u044e \u0444\u0440\u0430\u0437\u0443 \u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435!","desc":"\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0444\u0440\u0430\u0437\u0443 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0435\u0451 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u041f\u0440\u0438 \u0443\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0443 Skycoin!","checkbox":"\u041a\u043b\u044f\u043d\u0443\u0441\u044c. \u042f \u0437\u0430\u043f\u0438\u0441\u0430\u043b.","button":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"}},"wallet":{"new-address":"\u041d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441","show-empty":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435","hide-empty":"\u0421\u043a\u0440\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435","encrypt":"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","decrypt":"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","edit":"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0432\u043e\u0430\u0442\u044c","add":"\u041d\u043e\u0432\u044b\u0439 \u043a\u043e\u0448\u0435\u043b\u0451\u043a","load":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","encryption-enabled":"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d","encryption-disabled":"\u0411\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f","wallet":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a","new":{"create-title":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","load-title":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","encrypt-title":"\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","name-label":"\u0418\u043c\u044f \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","seed-label":"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f","confirm-seed-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443","seed-warning":"\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0430 \u0444\u0440\u0430\u0437\u0443 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0432 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0432 \u0434\u0430\u043b\u0438 \u043e\u0442 \u0447\u0443\u0436\u0438\u0445 \u0433\u043b\u0430\u0437. \u041f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Skycoin \u043a\u043e\u0448\u0435\u043b\u0451\u043a!","create-button":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c","load-button":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","12-words":"12 \u0441\u043b\u043e\u0432","24-words":"24 \u0441\u043b\u043e\u0432\u0430","generate-12-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 12 \u0441\u043b\u043e\u0432","generate-24-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 24 \u0441\u043b\u043e\u0432","encrypt":"\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435","encrypt-warning":"\u041c\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0448\u0438 \u043a\u0430\u0448\u0435\u043b\u044c\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f. \u0422\u0430\u043a \u0436\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0444\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435."},"rename":{"title":"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","name-label":"\u0418\u043c\u044f","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","rename-button":"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c"},"address":{"copy":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c","copy-address":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441","copied":"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e!","outputs":"\u041d\u0435\u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u044b\u0435 \u0432\u044b\u0445\u043e\u0434\u044b (Unspent Outputs)"}},"send":{"from-label":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441","to-label":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430","amount-label":"\u0421\u0443\u043c\u043c\u0430","notes-label":"\u0417\u0430\u043c\u0435\u0442\u043a\u0438","wallet-label":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a","addresses-label":"\u0410\u0434\u0440\u0435\u0441","addresses-help":"\u0410\u0434\u0440\u0435\u0441 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","change-address-label":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430","change-address-help":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0441\u0434\u0430\u0447\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u043d\u0435 \u0443\u043a\u0430\u0436\u0438\u0442\u0435, \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438","destinations-label":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439","destinations-help1":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0441\u0443\u043c\u043c\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","destinations-help2":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439, \u0441\u0443\u043c\u043c\u0430 Skycoin & CH \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","hours-allocation-label":"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u044b (CH)","options-label":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","value-label":"\u0424\u0430\u043a\u0442\u043e\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0447\u0430\u0441\u043e\u0432 (CH)","value-help":"\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0430\u043a\u0442\u043e\u0440, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 CH \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439","preview-button":"\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440","send-button":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434","simple":"\u041e\u0431\u044b\u0447\u043d\u044b\u0439","advanced":"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439"},"tx":{"transaction":"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f","confirm-transaction":"\u041f\u043e\u0434\u0442\u0435\u0440\u0434\u0438\u0442\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e","from":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c","to":"\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c","date":"\u0414\u0430\u0442\u0430","status":"\u0421\u0442\u0430\u0442\u0443\u0441","coins":"\u0421\u0443\u043c\u043c\u0430","hours":"\u0427\u0430\u0441\u044b","id":"TX ID","show-more":"\u0418\u043d\u0444\u043e","hours-sent":"\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c","hours-burned":"\u0441\u0436\u0438\u0433\u0430\u0435\u043c","inputs":"\u0412\u0445\u043e\u0434\u044b","outputs":"\u0412\u044b\u0445\u043e\u0434\u044b","confirmed":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430","pending":"\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435","current-rate":"\u041f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043a\u0443\u0440\u0441\u0443"},"backup":{"wallet-directory":"\u041f\u0430\u043f\u043a\u0430 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430:","seed-warning":"\u0414\u0415\u0420\u0416\u0418\u0422\u0415 \u0424\u0420\u0410\u0417\u0423 \u0412\u041e\u0421\u0422\u0410\u041d\u041e\u0412\u041b\u0415\u041d\u0418\u042f \u0412 \u041d\u0410\u0414\u0401\u0416\u041d\u041e\u041c \u041c\u0415\u0421\u0422\u0415. \u041d\u0410 \u0411\u0423\u041c\u0410\u0413\u0415. \u041e\u0424\u0424\u041b\u0410\u0419\u041d. \u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u043c\u043e\u0433 \u0435\u0451 \u043f\u043e\u0434\u0433\u043b\u044f\u0434\u0435\u0442\u044c - \u0432\u0430\u0448\u044b \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.","desc":"\u0418\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0438\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0440\u0430\u0437\u044b \u0434\u043b\u044f \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432.
\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0444\u0440\u0430\u0437 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\u0445 \u0431\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0438 \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u043d\u0435\u0439 \u0444\u0430\u0439\u043b\u044b \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c .wlt. \u0424\u0440\u0430\u0437\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0438\u0445. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043b\u044e\u0431\u043e\u0433\u043e (\u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e) \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430","close-button":"\u0417\u0430\u043a\u0440\u044b\u0442\u044c","wallet":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","filename":"\u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430","seed":"\u0424\u0440\u0430\u0437\u0430","show-seed":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443","no-wallets":"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432 \u0441 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u0442"},"blockchain":{"blocks":"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432","time":"\u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430","hash":"\u0425\u044d\u0448 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430","current-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","current-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442"},"network":{"peer":"\u041f\u0438\u0440 (Peer)","source":"\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a","block-height":"\u0412\u044b\u0441\u043e\u0442\u0430 \u0431\u043b\u043e\u043a\u0430","last-seen":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a","last-received":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b\u0439","last-sent":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b\u0439","in":"\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0435","out":"\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435","sources":{"default":"\u041f\u0438\u0440 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e","exchange":"\u041e\u0431\u043c\u0435\u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438"}},"pending-txs":{"timestamp":"\u041c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438","txid":"ID \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","none":"\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0442\u0440\u0430\u043d\u0430\u0437\u043a\u0446\u0438\u0439 \u0436\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439","my":"\u041c\u043e\u0439","all":"\u0412\u0441\u0435"},"history":{"tx-detail":"\u0414\u0435\u0442\u0430\u043b\u0438 \u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","sending":"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c","sent":"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e","received":"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e","receiving":"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c","pending":"\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f","no-txs":"\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439"},"teller":{"done":"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e","waiting-confirm":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439","waiting-deposit":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0434\u0435\u043f\u043e\u0437\u0438\u0442","waiting-send":"\u041f\u043e\u0441\u044b\u043b\u0430\u0435\u043c Skycoin","unknown":"\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e"}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.6fa8f54aba27f0eba2c9.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.6fa8f54aba27f0eba2c9.js new file mode 100644 index 0000000000..6dd3b551a0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.6fa8f54aba27f0eba2c9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{"3Al/":function(e){e.exports=JSON.parse('{"common":{"coin-id":"SKY","coin-hours":"CH","loading":"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...","new":"\u041d\u043e\u0432\u044b\u0439","load":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c"},"errors":{"fetch-version":"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441 Github","incorrect-password":"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c","api-disabled":"API \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d","no-wallet":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","no-outputs":"\u041d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432"},"title":{"wallets":"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u0438","send":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","history":"\u0418\u0441\u0442\u043e\u0440\u0438\u044f","buy-coin":"\u041a\u0443\u043f\u0438\u0442\u044c Skycoin","network":"\u0421\u0435\u0442\u044c","blockchain":"\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d","outputs":"\u0412\u044b\u0445\u043e\u0434\u044b (Outputs)","transactions":"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","pending-txs":"\u041d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","backup":"\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","explorer":"Skycoin \u044d\u043a\u0441\u043f\u043b\u043e\u0440\u0435\u0440","seed":"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f","qrcode":"QR-\u043a\u043e\u0434"},"header":{"syncing-blocks":"\u0418\u0434\u0451\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432...","update1":"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","update2":"\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e.","pending-txs1":"\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","pending-txs2":"\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.","pending-txs3":"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0442\u044c\u044e.","errors":{"no-connections":"\u041d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u0432\u0430\u0448 \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0437\u043b\u0430\u043c!","no-backend1":"\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443. \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u0435\u044c \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435","no-backend2":"\u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c\u0435.","no-backend3":"","csrf":"\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438: CSRF \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442."}},"password":{"title":"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c","label":"\u041f\u0430\u0440\u043e\u043b\u044c","confirm-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c","button":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"},"buy":{"deposit-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430:","select-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441","generate":"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c","deposit-location":"\u0410\u0434\u0440\u0435\u0441 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f","deposit-location-desc":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f Skycoin, \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430.","make-choice":"\u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0432\u044b\u0431\u043e\u0440","wallets-desc":"\u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0430\u0434\u0440\u0435\u0441\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430. \u041e\u0434\u0438\u043d \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d \u043a \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0430\u0434\u0440\u0435\u0441\u043e\u0432.","send":"\u041f\u043e\u0448\u043b\u0438\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443","send-desc":"\u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0432\u0430\u043c\u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u043d\u0438\u0436\u0435. \u041f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 {{ rate }} Skycoin/Selected Coin.","fraction-warning":"\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.","receive":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Skycoin","receive-desc":"\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u0430\u0432\u0430\u043b\u044e\u0442\u044b, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u043d\u0435\u0439, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u043b\u0430\u0442\u044b \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u0438.","status-button":"\u0421\u0442\u0430\u0442\u0443\u0441:","check-status-button":"\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441","new-order-button":"\u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u043a\u0430\u0437","refresh":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c","available-now":"\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e:","choose-preference":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b. \u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b.","choose":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u043b\u044e\u0431\u0438\u043c\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u0443 ;)","send-coin":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","send-coin-text-1":"\u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043d\u0438\u0436\u0435. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u043d\u0430 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0435, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u043f\u043e \u043a\u0443\u0440\u0441\u0443"},"wizard":{"wallet-desc":"\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 Skycoin, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0444\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0444\u0440\u0430\u0437\u0430 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \\"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\\" \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u0444\u0440\u0430\u0437\u0443.","encrypt-desc":"\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0442\u0438, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0435\u0433\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u0435.","finish-button":"\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434","confirm":{"title":"\u0414\u0435\u0440\u0436\u0438\u0442\u0435 \u0441\u0432\u043e\u044e \u0444\u0440\u0430\u0437\u0443 \u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435!","desc":"\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0444\u0440\u0430\u0437\u0443 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0435\u0451 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u041f\u0440\u0438 \u0443\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0443 Skycoin!","checkbox":"\u041a\u043b\u044f\u043d\u0443\u0441\u044c. \u042f \u0437\u0430\u043f\u0438\u0441\u0430\u043b.","button":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"}},"wallet":{"new-address":"\u041d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441","show-empty":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435","hide-empty":"\u0421\u043a\u0440\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435","encrypt":"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","decrypt":"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","edit":"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0432\u043e\u0430\u0442\u044c","add":"\u041d\u043e\u0432\u044b\u0439 \u043a\u043e\u0448\u0435\u043b\u0451\u043a","load":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","encryption-enabled":"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d","encryption-disabled":"\u0411\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f","wallet":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a","new":{"create-title":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","load-title":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","encrypt-title":"\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","name-label":"\u0418\u043c\u044f \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","seed-label":"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f","confirm-seed-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443","seed-warning":"\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0430 \u0444\u0440\u0430\u0437\u0443 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0432 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0432 \u0434\u0430\u043b\u0438 \u043e\u0442 \u0447\u0443\u0436\u0438\u0445 \u0433\u043b\u0430\u0437. \u041f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Skycoin \u043a\u043e\u0448\u0435\u043b\u0451\u043a!","create-button":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c","load-button":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","12-words":"12 \u0441\u043b\u043e\u0432","24-words":"24 \u0441\u043b\u043e\u0432\u0430","generate-12-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 12 \u0441\u043b\u043e\u0432","generate-24-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 24 \u0441\u043b\u043e\u0432","encrypt":"\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435","encrypt-warning":"\u041c\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0448\u0438 \u043a\u0430\u0448\u0435\u043b\u044c\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f. \u0422\u0430\u043a \u0436\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0444\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435."},"rename":{"title":"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","name-label":"\u0418\u043c\u044f","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","rename-button":"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c"},"address":{"copy":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c","copy-address":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441","copied":"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e!","outputs":"\u041d\u0435\u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u044b\u0435 \u0432\u044b\u0445\u043e\u0434\u044b (Unspent Outputs)"}},"send":{"from-label":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441","to-label":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430","amount-label":"\u0421\u0443\u043c\u043c\u0430","notes-label":"\u0417\u0430\u043c\u0435\u0442\u043a\u0438","wallet-label":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a","addresses-label":"\u0410\u0434\u0440\u0435\u0441","addresses-help":"\u0410\u0434\u0440\u0435\u0441 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","change-address-label":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430","change-address-help":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0441\u0434\u0430\u0447\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u043d\u0435 \u0443\u043a\u0430\u0436\u0438\u0442\u0435, \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438","destinations-label":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439","destinations-help1":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0441\u0443\u043c\u043c\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","destinations-help2":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439, \u0441\u0443\u043c\u043c\u0430 Skycoin & CH \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","hours-allocation-label":"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u044b (CH)","options-label":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","value-label":"\u0424\u0430\u043a\u0442\u043e\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0447\u0430\u0441\u043e\u0432 (CH)","value-help":"\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0430\u043a\u0442\u043e\u0440, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 CH \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439","preview-button":"\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440","send-button":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434","simple":"\u041e\u0431\u044b\u0447\u043d\u044b\u0439","advanced":"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439"},"tx":{"transaction":"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f","confirm-transaction":"\u041f\u043e\u0434\u0442\u0435\u0440\u0434\u0438\u0442\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e","from":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c","to":"\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c","date":"\u0414\u0430\u0442\u0430","status":"\u0421\u0442\u0430\u0442\u0443\u0441","coins":"\u0421\u0443\u043c\u043c\u0430","hours":"\u0427\u0430\u0441\u044b","id":"TX ID","show-more":"\u0418\u043d\u0444\u043e","hours-sent":"\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c","hours-burned":"\u0441\u0436\u0438\u0433\u0430\u0435\u043c","inputs":"\u0412\u0445\u043e\u0434\u044b","outputs":"\u0412\u044b\u0445\u043e\u0434\u044b","confirmed":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430","pending":"\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435","current-rate":"\u041f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043a\u0443\u0440\u0441\u0443"},"backup":{"wallet-directory":"\u041f\u0430\u043f\u043a\u0430 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430:","seed-warning":"\u0414\u0415\u0420\u0416\u0418\u0422\u0415 \u0424\u0420\u0410\u0417\u0423 \u0412\u041e\u0421\u0422\u0410\u041d\u041e\u0412\u041b\u0415\u041d\u0418\u042f \u0412 \u041d\u0410\u0414\u0401\u0416\u041d\u041e\u041c \u041c\u0415\u0421\u0422\u0415. \u041d\u0410 \u0411\u0423\u041c\u0410\u0413\u0415. \u041e\u0424\u0424\u041b\u0410\u0419\u041d. \u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u043c\u043e\u0433 \u0435\u0451 \u043f\u043e\u0434\u0433\u043b\u044f\u0434\u0435\u0442\u044c - \u0432\u0430\u0448\u044b \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.","desc":"\u0418\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0438\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0440\u0430\u0437\u044b \u0434\u043b\u044f \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432.
\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0444\u0440\u0430\u0437 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\u0445 \u0431\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0438 \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u043d\u0435\u0439 \u0444\u0430\u0439\u043b\u044b \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c .wlt. \u0424\u0440\u0430\u0437\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0438\u0445. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043b\u044e\u0431\u043e\u0433\u043e (\u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e) \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430","close-button":"\u0417\u0430\u043a\u0440\u044b\u0442\u044c","wallet":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","filename":"\u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430","seed":"\u0424\u0440\u0430\u0437\u0430","show-seed":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443","no-wallets":"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432 \u0441 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u0442"},"blockchain":{"blocks":"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432","time":"\u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430","hash":"\u0425\u044d\u0448 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430","current-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","current-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442"},"network":{"peer":"\u041f\u0438\u0440 (Peer)","source":"\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a","block-height":"\u0412\u044b\u0441\u043e\u0442\u0430 \u0431\u043b\u043e\u043a\u0430","last-seen":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a","last-received":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b\u0439","last-sent":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b\u0439","in":"\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0435","out":"\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435","sources":{"default":"\u041f\u0438\u0440 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e","exchange":"\u041e\u0431\u043c\u0435\u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438"}},"pending-txs":{"timestamp":"\u041c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438","txid":"ID \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","none":"\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0442\u0440\u0430\u043d\u0430\u0437\u043a\u0446\u0438\u0439 \u0436\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439","my":"\u041c\u043e\u0439","all":"\u0412\u0441\u0435"},"history":{"tx-detail":"\u0414\u0435\u0442\u0430\u043b\u0438 \u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","sending":"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c","sent":"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e","received":"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e","receiving":"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c","pending":"\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f","no-txs":"\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439"},"teller":{"done":"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e","waiting-confirm":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439","waiting-deposit":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0434\u0435\u043f\u043e\u0437\u0438\u0442","waiting-send":"\u041f\u043e\u0441\u044b\u043b\u0430\u0435\u043c Skycoin","unknown":"\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e"}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.7f8f58ff3f30291666bf.chunk.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.7f8f58ff3f30291666bf.chunk.js new file mode 100644 index 0000000000..c615150420 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/4.7f8f58ff3f30291666bf.chunk.js @@ -0,0 +1 @@ +webpackJsonp([4],{"/YBz":function(e,a){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Cargando...",new:"Nueva",load:"Cargar"},errors:{error:"Error","fetch-version":"No ha sido posible verificar la \xfaltima versi\xf3n desde Github","incorrect-password":"Contrase\xf1a incorrecta","error-decrypting":"Error al desencriptar la billetera","api-disabled":"API desabilitada","no-wallet":"La billetera no existe","no-outputs":"No hay salidas no gastadas","window-size":"La ventana es demasiado estrecha para el contenido"},title:{language:"Seleccionar Lenguaje",wallets:"Billeteras",send:"Enviar",history:"Historial","buy-coin":"Comprar Skycoins",network:"Red",blockchain:"Blockchain",outputs:"Salidas",transactions:"Transacciones","pending-txs":"Transacciones Pendientes",backup:"Respaldar Billetera",explorer:"Explorador de Skycoin",seed:"Semilla de la Billetera",qrcode:"C\xf3digo QR",reset:"Restablecer contrase\xf1a",exchange:"Intercambiar","select-address":"Seleccionar Direcci\xf3n","order-history":"Historial de \xf3rdenes"},header:{"syncing-blocks":"Sincronizando bloques",update1:"La actualizaci\xf3n",update2:"est\xe1 disponible.",synchronizing:"El nodo est\xe1 sincronizando. Los datos mostrados pueden estar desactualizados.","pending-txs1":"Hay una o m\xe1s","pending-txs2":"transacciones pendientes.","pending-txs3":"Los datos mostrados pueden estar desactualizados.",errors:{"no-connections":"Sin conexiones activas, \xa1el cliente no est\xe1 conectado a otros nodos!","no-backend1":"Sin acceso al servidor. Por favor, reinicie la aplicaci\xf3n y/o cont\xe1ctenos v\xeda","no-backend2":"Telegram.","no-backend3":"",csrf:"Vulnerabilidad de seguridad: CSRF no funciona. Por favor, salga de inmediato."}},password:{title:"Introduzca Su Contrase\xf1a",label:"Contrase\xf1a","confirm-label":"Confirmar contrase\xf1a",button:"Continuar","reset-link":"He olvidado mi contrase\xf1a"},buy:{"deposit-address":"Seleccione una direcci\xf3n para la cual generar un enlace de dep\xf3sito BTC:","select-address":"Seleccione una direcci\xf3n",generate:"Generar","deposit-location":"Localizaci\xf3n de Dep\xf3sito","deposit-location-desc":"Seleccione la billetera en la que desea que le depositemos sus Skycoins despu\xe9s de recibir los Bitcoins.","make-choice":"Realice una selecci\xf3n","wallets-desc":"Una nueva direcci\xf3n BTC es generada cada vez que se selecciona una nueva billetera y direcci\xf3n. Una \xfanica direcci\xf3n de Skycoin puede tener asignadas hasta 5 direcciones BTC.",send:"Enviar Bitcoins","send-desc":"Env\xede Bitcoins a la direcci\xf3n abajo indicada. Al recibirlos, le depositaremos los Skycoins en una nueva direcci\xf3n en la billetera seleccionada m\xe1s arriba, a la tasa de cambio actual de {{ rate }} SKY/BTC.","fraction-warning":"\xa1Env\xede s\xf3lo m\xfaltiplos de la tasa SKY/BTC! Los Skycoins son enviados en n\xfameros enteros, \xa1no se env\xedan fracciones de SKY!",receive:"Recibir SKY","receive-desc":"Despu\xe9s de recibir los Bitcoins, le enviaremos sus Skycoins. El tiempo de espera para recibir sus SKY puede ser de entre 20 minutos y una hora.","status-button":"Estatus:","check-status-button":"Revisar Estatus","new-order-button":"Nueva Orden"},wizard:{"wallet-desc":'Si no tiene una billetera, use la semilla generada autom\xe1ticamente para crear una nueva. Si ya tiene una billetera, seleccione "Cargar" e introduzca su semilla.',"encrypt-desc":"Incremente la seguridad de su billetera encript\xe1ndola. Al introducir una contrase\xf1a m\xe1s abajo, su billetera ser\xe1 encriptada. S\xf3lo quien tenga la contrase\xf1a podr\xe1 acceder a la billetera y retirar fondos.","hardware-wallet-link":"\xbfUtilizando una billetera de hardware?","finish-button":"Finalizar","back-button":"Volver",confirm:{title:"\xa1Resguarde su semilla!",desc:"Queremos asegurarnos de que ha anotado su semilla y la ha almacenado en un lugar seguro. \xa1Si olvida su semilla, NO podr\xe1 recuperar su billetera!",checkbox:"Est\xe1 segura, lo garantizo.",button:"Continuar"}},wallet:{"new-address":"Nueva Direcci\xf3n","new-addresses":"Nuevas Direcciones","show-empty":"Mostrar Vac\xedas","hide-empty":"Ocultar Vac\xedas",encrypt:"Encriptar Billetera",decrypt:"Desencriptar Billetera","decrypt-warning":"Advertencia: por razones de seguridad, no se recomienda mantener las carteras desencriptadas. Se aconseja precauci\xf3n.",delete:"Borrar Billetera",edit:"Editar Billetera",add:"Agregar Billetera",load:"Cargar Billetera","encryption-enabled":"Encriptado habilitado","encryption-disabled":"Encriptado deshabilitado","hw-security-warning":'Posible riesgo de seguridad. Acceda a las opciones de la billetera de hardware (presionando el bot\xf3n "Billetera de Hardware" debajo de la lista de billeteras) mientras el dispositivo est\xe1 conectado, para m\xe1s informaci\xf3n.',wallet:"Billetera","hardware-wallet":"Billetera de Hardware","delete-confirmation":'ADVERTENCIA: la billetera "{{ name }}" ser\xe1 removida de la lista. Para agregarla nuevamente, deber\xe1 volver a conectar el dispositivo y abrir las opciones de la billetera del hardware (presionando el bot\xf3n "Billetera de hardware" debajo de la lista de las billeteras). \xbfDesea continuar?',"delete-confirmation-check":"S\xed, quiero borrar la billetera.","max-hardware-wallets-error":"Ya ha alcanzado el n\xfamero m\xe1ximo de direcciones que se puede agregar a la billetera de hardware.","add-many-confirmation":"ADVERTENCIA: si agrega demasiadas direcciones sin usar las anteriores o si usa las \xfaltimas y no las primeras, es posible que algunas direcciones no se recuperen autom\xe1ticamente si intenta restaurar la billetera con la semilla (tendr\xe1 que agregarlas manualmente). \xbfDesea continuar?",new:{"create-title":"Crear Billetera","load-title":"Cargar Billetera","encrypt-title":"Encriptar la billetera","name-label":"Nombre","seed-label":"Semilla","confirm-seed-label":"Confirmar semilla","seed-warning":"\xa1Recuerde esta semilla! Mant\xe9ngala en un lugar seguro. \xa1Si olvida su semilla, no podr\xe1 recuperar la billetera!","create-button":"Crear","load-button":"Cargar","cancel-button":"Cancelar","12-words":"12 palabras","24-words":"24 palabras","generate-12-seed":"Generar una semilla de 12 palabras","generate-24-seed":"Generar una semilla de 24 palabras",encrypt:"Encriptar billetera","encrypt-warning":"Le sugerimos que encripte con una contrase\xf1a cada una de sus billeteras. Si olvida su contrase\xf1a, puede restaurarla con la semilla. Aseg\xfarese de guardar su semilla en un lugar seguro antes de encriptar la billetera.","unconventional-seed-title":"Posible error","unconventional-seed-text":"Usted introdujo una semilla no convencional. Si lo hizo por alguna raz\xf3n en especial, puede continuar (s\xf3lo recomendable para usuarios avanzados). Sin embargo, si su intenci\xf3n es utilizar una semilla normal del sistema, usted debe borrar los textos y/o caracteres especiales adicionales.","unconventional-seed-check":"Continuar con la semilla no convencional."},rename:{title:"Renombrar Billetera","name-label":"Nombre","cancel-button":"Cancelar","rename-button":"Renombrar"},"add-addresses":{title:"Seleccionar cantidad","name-quantity":"Cantidad de direcciones a crear","cancel-button":"Cancelar","create-button":"Crear"},address:{show:"Presione para mostrar",copy:"Copiar","copy-address":"Copiar Direcci\xf3n",copied:"\xa1Copiado!",confirm:"Confirmar Direcci\xf3n",outputs:"Salidas No Gastadas",history:"Historial"}},send:{"synchronizing-warning":"La billetera todav\xeda est\xe1 sincronizando los datos, por lo que el saldo que se muestra puede ser incorrecto. \xbfSeguro de que desea continuar?","from-label":"Enviar desde","to-label":"Enviar a","amount-label":"Cantidad","notes-label":"Notas","wallet-label":"Billetera","addresses-label":"Direcci\xf3n","invalid-amount":"Por favor introduzca una cantidad v\xe1lida","addresses-help":"Limite las direcciones desde donde se podr\xedan enviar las monedas y las horas","all-addresses":"Todas las direcciones de la billetera seleccionada","outputs-label":"Salidas no gastadas","outputs-help":"Limite las salidas no gastadas desde donde se podr\xedan enviar las monedas y las horas. Solo se muestran las salidas de las direcciones seleccionadas.","all-outputs":"Todas las salidas no gastadas de las direcciones seleccionadas","available-msg-part1":"Con su selecci\xf3n actual puede enviar hasta","available-msg-part2":"y","available-msg-part3":"(al menos","available-msg-part4":"deben ser utilizadas para la tarifa de transacci\xf3n).","change-address-label":"Direcci\xf3n de retorno personalizada","change-address-select":"Seleccionar","change-address-help":'Direcci\xf3n para recibir el cambio. Si no se proporciona, ser\xe1 elegida autom\xe1ticamente. Haga clic en el enlace "Seleccionar" para elegir una direcci\xf3n de una de sus billeteras',"destinations-label":"Destinos","destinations-help1":"Direcciones de destino y sus monedas","destinations-help2":"Direcciones de destino, sus monedas y coin hours","hours-allocation-label":"Distribuci\xf3n autom\xe1tica de coin hours","options-label":"Opciones","value-label":"Factor de distribuci\xf3n de las coin hours","value-help":"Mientras mayor sea el valor, m\xe1s coin hours se enviar\xe1n a las salidas","preview-button":"Preview","send-button":"Enviar","back-button":"Volver",simple:"Simple",advanced:"Advanzado","select-wallet":"Seleccionar Billetera"},reset:{"wallet-label":"Billetera","seed-label":"Semilla de la billetera","password-label":"Nueva contrase\xf1a (deje en blanco si desea que la billetera no est\xe9 encriptada)","confirm-label":"Confirme la contrase\xf1a","reset-button":"Restaurar"},tx:{transaction:"Transacci\xf3n","confirm-transaction":"Confirmar Transacci\xf3n",from:"Desde",to:"A",date:"Fecha",status:"Estatus",coins:"Monedas",hours:"Horas",id:"Tx ID","show-more":"Mostrar m\xe1s","hours-moved":"movida(s)","hours-sent":"enviada(s)","hours-received":"recibida(s)","hours-burned":"quemada(s)",inputs:"Entradas",outputs:"Salidas",confirmed:"Confirmada",pending:"Pendiente","current-rate":"Calculado a la tasa actual"},backup:{"wallet-directory":"Directorio de la Billetera:","seed-warning":"RESPALDE SU SEMILLA. EN PAPEL. EN UN LUGAR SEGURO. Mientras tenga su semilla, podr\xe1 recuperar las monedas.",desc:"Use la tabla de m\xe1s abajo para obtener las semillas de sus billeteras encriptadas.
Para obtener las semillas de las billeteras no encriptadas, abra el directorio de m\xe1s arriba, abra los archivos .wlt en un editor de texto y recupere las semillas.","close-button":"Cerrar",wallet:"Nombre de la Billetera",filename:"Archivo",seed:"Semilla","show-seed":"Mostrar semilla","no-wallets":"No hay billeteras encriptadas"},blockchain:{blocks:"Cantidad de bloques",time:"Fecha del \xfaltimo bloque",hash:"Hash del \xfaltimo bloque","current-supply":"Suministro de SKY actual","total-supply":"Suministro de SKY total","current-coinhour-supply":"Suministro de Coin Hours actual","total-coinhour-supply":"Suministro de Coin Hours total"},network:{peer:"Par",source:"Fuente","block-height":"Altura del bloque","block-height-short":"Bloque","last-seen":"\xdaltima vez visto","last-received":"\xdaltima recepci\xf3n","last-sent":"\xdaltimo env\xedo",in:"Entrante",out:"Saliente",sources:{default:"Par por defecto",exchange:"Intercambio de pares"}},"pending-txs":{timestamp:"Fecha",txid:"ID de la transacci\xf3n",none:"Actualmente no hay transacciones pendientes",my:"M\xedas",all:"Todas"},history:{"tx-detail":"Detalles de la Transacci\xf3n",moving:"Moviendo internamente",moved:"Movida internamente",sending:"Enviando",sent:"Enviada",received:"Recibida",receiving:"Recibiendo",pending:"Pendiente","no-txs":"Usted no tiene historial de transacciones","no-txs-filter":"No hay transacciones que coincidan con los criterios de filtro actuales","no-filter":"Sin filtros activos (Presione para seleccionar billeteras/direcciones)",filter:"Filtro activo: ",filters:"Filtros activo: ","all-addresses":"Todas las direcciones"},teller:{done:"Completado","waiting-confirm":"Esperando confirmaci\xf3n","waiting-deposit":"Esperando dep\xf3sito de Bitcoins","waiting-send":"Esperando para env\xedar Skycoins",unknown:"Desconocido"},confirmation:{"header-text":"Confirmaci\xf3n","confirm-button":"S\xed","cancel-button":"No",close:"Cerrar"},service:{api:{"server-error":"Error de servidor"},wallet:{"not-enough-hours":"\xa1No cuenta con suficientes Coin Hours para realizar la operaci\xf3n!"}},"hardware-wallet":{general:{"default-wallet-name":"Nueva billetera de hardware","error-disconnected":"No se puede realizar la operaci\xf3n. La billetera de hardware no est\xe1 conectada.","simple-error":"Error, no se puede realizar la operaci\xf3n.","generic-error":"No se puede realizar la operaci\xf3n. Aseg\xfarese de haber conectado una billetera de hardware v\xe1lida y de que no est\xe9 esperando por alguna confirmaci\xf3n o respuesta.","generic-error-internet":"No se puede realizar la operaci\xf3n. Aseg\xfarese de haber conectado una billetera de hardware v\xe1lida que no est\xe9 esperando por alguna confirmaci\xf3n o respuesta y de que su equipo cuente con conexi\xf3n a internet y al nodo.","error-incorrect-wallet":"No se puede realizar la operaci\xf3n. La billetera de hardware conectada es diferente a la esperada.","error-incorrect-pin":"No se puede realizar la operaci\xf3n. El PIN que ha introducido no es correcto.",confirm:"Por favor, confirme la operaci\xf3n en la billetera de hardware.","confirm-and-more":"Por favor, confirme la operaci\xf3n en la billetera de hardware y siga las instrucciones.",close:"Cerrar",cancel:"Cancelar",continue:"Continuar",completed:"La operaci\xf3n se realiz\xf3 con \xe9xito.",refused:"La operaci\xf3n fall\xf3 o fue cancelada."},errors:{"too-many-inputs":"La transacci\xf3n tiene demasiadas entradas y no se puede procesar. Por favor, p\xf3ngase en contacto con el soporte t\xe9cnico.","too-many-outputs":"La transacci\xf3n tiene demasiadas salidas y no se puede procesar. Por favor, p\xf3ngase en contacto con el soporte t\xe9cnico."},"security-warning":{title:"Advertencia de seguridad",text:'La \xfaltima vez que se conect\xf3 esta billetera de hardware, se encontraron una o m\xe1s advertencias de seguridad. Le recomendamos que abra las opciones de billetera de hardware (presionando el bot\xf3n "Billetera de hardware" debajo de la lista de billeteras) mientras el dispositivo est\xe1 conectado y resuelva los problemas de seguridad antes de continuar.',check:"Entiendo los riesgos y deseo continuar.",continue:"Continuar",cancel:"Cancelar"},options:{connecting:"Conectando...",disconnected:"Billetera de hardware no detectada. Por favor, conecte una billetera de hardware para usar esta opci\xf3n.","unconfigured-detected-title":"Billetera de hardware no configurada","unconfigured-detected":'Se ha detectado una billetera de hardware sin semilla. Seleccione "Configurar autom\xe1ticamente" si desea configurarla como una billetera nueva y comenzar a usarla inmediatamente, o seleccione "Restaurar una copia de seguridad" si desea configurarla con la copia de seguridad de una semilla creada anteriormente y as\xed poder acceder a sus fondos de nuevo.',"configured-detected":"Billetera de hardware detectada. El dispositivo se identifica en la lista de billeteras como:","security-warnings-title":"Advertencias de seguridad","security-warning-title":"Advertencia de seguridad","backup-warning":'Debe hacer una copia de seguridad de la semilla de la billetera de hardware o podr\xeda perder acceso a los fondos en caso de problemas. Para hacer esto, seleccione la opci\xf3n "Crear copia de seguridad".',"pin-warning":'La billetera de hardware conectada no tiene un PIN. El c\xf3digo PIN protege la billetera de hardware en caso de p\xe9rdida, robo y pirateo. Para crear un c\xf3digo PIN, seleccione la opci\xf3n "Crear c\xf3digo PIN".',options:"Opciones:","configure-automatically":"Configurar autom\xe1ticamente","restore-backup":"Restaurar una copia de seguridad","create-backup":"Crear copia de seguridad",wipe:"Borrar el dispositivo","confirm-seed":"Confirmar la semilla","create-pin":"Crear c\xf3digo PIN","change-pin":"Cambiar el c\xf3digo PIN","forgotten-pin1":"Si no puede acceder a la billetera porque ha olvidado el PIN, puede borrar la billetera del hardware y luego restaurarla con la semilla haciendo clic","forgotten-pin2":"aqu\xed."},"generate-seed":{text:"Antes de continuar, puede seleccionar el n\xfamero de palabras que desea que tenga la semilla. La semilla es una lista de palabras que se pueden usar para recuperar el acceso a las monedas en caso de problemas. Ambos valores son seguros, por lo que si no tiene una raz\xf3n especial para seleccionar uno u otro, puede dejar el valor predeterminado.",configuring:"Configurando..."},"restore-seed":{text:"Antes de continuar, por favor seleccione la cantidad de palabras de la semilla que desea recuperar.","check-text":"Puede usar esta opci\xf3n para ingresar una semilla y verificar si es igual a la de la billetera de hardware. Antes de comenzar, seleccione el n\xfamero de palabras de la semilla que desea verificar.",warning:"ADVERTENCIA: para evitar posibles problemas, use solo semillas creadas con una billetera de hardware de la misma marca/modelo.","error-wrong-word":"Error: la palabra introducida no coincide con la solicitada por la billetera de hardware.","error-invalid-seed":"Error: La semilla no es v\xe1lida. Por favor, aseg\xfarese de ingresar las palabras correctas en el orden correcto.","error-wrong-seed":"Error: la semilla es v\xe1lida pero no coincide con la del dispositivo."},added:{title:"Nueva Billetera de Hardware",configuring:"Nueva billetera de hardware detectada. Configurando...",done:"Hecho",added1:"La billetera de hardware conectada se ha agregado a la lista de billeteras con el siguiente nombre:",added2:"Ahora puede consultar el saldo y las direcciones de la billetera de hardware incluso cuando no est\xe1 conectada. Adem\xe1s, puede cambiar el nombre de la billetera o eliminarla de la lista de billeteras, si lo desea."},wipe:{warning:"ADVERTENCIA: Todos los datos en la billetera de hardware ser\xe1n eliminados. Si no tiene una copia de seguridad, no podr\xe1 volver a acceder a sus fondos.","confirm-delete":"Quitar tambi\xe9n de la lista de billeteras."},"create-backup":{warning:'ADVERTENCIA: Solo puede usar esta opci\xf3n para hacer una copia de seguridad de la semilla de su billetera de hardware una vez. Si decide continuar, tendr\xe1 que escribir un grupo de palabras (se recomienda hacerlo en papel y no en una computadora) que aparecer\xe1n en la pantalla de la billetera de hardware y almacenar la lista en un lugar seguro. Cualquier persona con acceso a la lista de palabras (la "semilla") podr\xe1 acceder a los fondos de la cartera, por lo que se recomienda extremar las precauciones.',instructions:"Escriba la lista de palabras que aparecen en la pantalla de la billetera de hardware. Aseg\xfarate de respetar el orden y escribir cada palabra correctamente."},"seed-word":{title:"Ingresar palabra",info1:"Introduzca la palabra indicada en el dispositivo",info2:"Se le pedir\xe1 que ingrese las palabras de su semilla de respaldo en orden aleatorio, m\xe1s algunas palabras adicionales.",word:"Palabra solicitada","error-invalid-word":"La palabra introducida no es v\xe1lida.","error-loading-words":"Cargando la lista de palabras. Por favor espere."},"change-pin":{"pin-mismatch":"No se puede realizar la operaci\xf3n. Los dos PIN que ha introducido no coinciden."},"enter-pin":{title:"Ingresar PIN","title-change-current":"Ingrese el PIN actual","title-change-new":"Ingrese el nuevo PIN","title-change-confirm":"Confirme el nuevo PIN",instructions:"El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la billetera de hardware.","instructions-tx":"Introduzca el PIN para confirmar y firmar la transacci\xf3n.","instructions-change":"Ingrese un PIN dif\xedcil de adivinar de entre 4 y 8 n\xfameros.",help:"\xbfNecesita ayuda?"},"pin-help":{title:"Ayuda",part1:"Cuando sea necesario ingresar el PIN para continuar, la pantalla de la billetera del hardware mostrar\xe1 una matriz de 9 casillas con n\xfameros en orden aleatorio (el orden cambia cada vez) y se le pedir\xe1 que ingrese el PIN en la billetera de software usando una matriz de 9 botones que simplemente muestran el s\xedmbolo #.",part2:'Para ingresar el PIN, mire la posici\xf3n de los n\xfameros del PIN en la matriz de n\xfameros en la pantalla de la billetera de hardware y presione los botones correspondientes en la billetera de software. Por ejemplo, si el PIN es "23", el n\xfamero 2 est\xe1 en la esquina superior izquierda y el n\xfamero 3 en el centro de la matriz de n\xfameros de billetera de hardware, presione los botones superior izquierdo y central, en ese orden, en la billetera de software.',part3:'Si lo desea, tambi\xe9n puede usar el teclado num\xe9rico para ingresar el PIN. Sin embargo, como en el ejemplo anterior, si el PIN es "23", no puede simplemente escribir "23" con el teclado num\xe9rico, sino que deber\xe1 presionar las teclas que est\xe1n en la posici\xf3n donde est\xe1n los n\xfameros 2 y 3 en la pantalla de la billetera de hardware.'},"create-tx":{title:"Crear transacci\xf3n"},"confirm-address":{title:"Confirmar direcci\xf3n",instructions:"Por favor confirme en la billetera de hardware si la direcci\xf3n es:","short-confirmation":"Direcci\xf3n confirmada.",confirmation:'Direcci\xf3n confirmada. Por seguridad, puede volver a mostrar la direcci\xf3n en la billetera de hardware usando la opci\xf3n "Confirmar direcci\xf3n", en el men\xfa que puede mostrar presionando el bot\xf3n a la derecha del balance de la direccion.'}},"time-from-now":{"few-seconds":"hace pocos segundos",minute:"hace un minuto",minutes:"hace {{time}} minutos",hour:"hace una hora",hours:"hace {{time}} horas",day:"hace un d\xeda",days:"hace {{time}} d\xedas"},exchange:{"you-send":"Usted env\xeda","you-get":"Usted recibe (aprox.)","to-address":"A la direcci\xf3n de {{coin}}",price:"Tasa de cambio","time-15":"Duraci\xf3n del intercambio","exchange-button":"Intercambiar","min-amount":"Monto minimo:","max-amount":"Monto maximo:","agree-1":"Acepto los","agree-2":"T\xe9rminos de Uso","agree-3":"y la ","agree-4":"Pol\xedtica de Privacidad","powered-by":"Manejado por","need-help":"\xbfNecesita ayuda?","support-portal":"Portal de soporte",history:"Historial de \xf3rdenes","order-not-found":"Orden no encontrada",status:"Estado",exchanging:"Intercambiando {{from}} por {{to}}",select:"Seleccionar",offline:"El servicio est\xe1 temporalmente offline","problem-connecting":"No se puede conectar con el servicio. Por favor, compruebe su conexi\xf3n a Internet y vuelva a intentarlo m\xe1s tarde.","invalid-address":"Direcci\xf3n inv\xe1lida.",statuses:{"user-waiting":"Esperando el deposito. Por favor, env\xede {{amount}} {{from}} a la direcci\xf3n de intercambio indicada m\xe1s abajo","user-waiting-info":"El sistema est\xe1 a la espera de que realice el dep\xf3sito en la direcci\xf3n de intercambio. El proceso de intercambio comenzar\xe1 despu\xe9s de que se detecte el dep\xf3sito y sea confirmado en la cadena de bloques. Si ya ha realizado el dep\xf3sito, deber\xeda ser detectado en breve.","market-waiting-confirmations":"Esperando las confirmaciones de la transacci\xf3n","market-waiting-confirmations-info":"El dep\xf3sito ya ha sido detectado y el sistema est\xe1 esperando que sea confirmado en la cadena de bloques.","market-confirmed":"Transacci\xf3n aceptada","market-confirmed-info":"La transacci\xf3n ya ha sido confirmada en la cadena de bloques. Haciendo los preparativos para realizar el intercambio pronto.","market-exchanged":"{{from}} intercambiado por {{to}}","market-exchanged-info":"El intercambio se ha realizado. Los fondos ser\xe1n transferidos a su direcci\xf3n en un momento.","market-withdraw-waiting":"Enviando {{to}} a su direcci\xf3n","market-withdraw-waiting-info":"Se ha iniciado el proceso para enviar las monedas a su direcci\xf3n.",complete:"\xa1Intercambio completado!","complete-info":"Los fondos han sido enviados con \xe9xito a su direcci\xf3n.",error:"Se produjo un error","error-info":"Hubo un error en la operaci\xf3n, puede encontrar m\xe1s informaci\xf3n m\xe1s abajo. Si necesita ayuda, por favor guarde todos los datos de operaci\xf3n que se muestran m\xe1s abajo y comun\xedquese con soporte t\xe9cnico utilizando el enlace que se encuentra en la parte inferior derecha de esta p\xe1gina."},"history-window":{address:"Direcci\xf3n",date:"Fecha"},details:{"exchange-addr":"Direcci\xf3n de intercambio","exchange-addr-tag":"Payment ID o Destination Tag que debe usarse para la transacci\xf3n","tx-id":"ID de la transacci\xf3n","order-id":"ID de la orden","initial-price":"Tasa de cambio inicial","error-msg":"Mensaje de error",details:"Detalles","start-date":"Fecha de inicio",back:"Volver","back-alert":'La operaci\xf3n a\xfan est\xe1 en progreso. \xbfRealmente desea volver al formulario? Puede ver el progreso de esta operaci\xf3n nuevamente presionando el bot\xf3n "Historial de pedidos"'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/403.bf84efb5e25e9ed81d23.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/403.bf84efb5e25e9ed81d23.js new file mode 100644 index 0000000000..02bd86a7d9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/403.bf84efb5e25e9ed81d23.js @@ -0,0 +1 @@ +(self.webpackChunkdesktopwallet=self.webpackChunkdesktopwallet||[]).push([[403],{74403:function(e){"use strict";e.exports=JSON.parse('{"list":["abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual","adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange","arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become","beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray","better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush","board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss","bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call","calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino","castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle","citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client","cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine","come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider","control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle","craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal","debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama","drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody","embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless","endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape","essay","essence","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit","exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure","file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock","floor","flower","fluid","flush","fly","foam","focus","fog","foil","fold","follow","food","foot","force","forest","forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile","frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen","fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy","gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp","gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture","ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance","glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue","goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown","grab","grace","grain","grant","grape","grass","gravity","great","green","grid","grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt","guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy","harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health","heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden","high","hill","hint","hip","hire","history","hobby","hockey","hold","hole","holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital","host","hotel","hour","hover","hub","huge","human","humble","humor","hundred","hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea","identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune","impact","impose","improve","impulse","inch","include","income","increase","index","indicate","indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury","inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install","intact","interest","into","invest","invite","involve","iron","island","isolate","issue","item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel","job","join","joke","journey","joy","judge","juice","jump","jungle","junior","junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney","kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife","knock","know","lab","label","labor","ladder","lady","lake","lamp","language","laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit","layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal","legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level","liar","liberty","library","license","life","lift","light","like","limb","limit","link","lion","liquid","list","little","live","lizard","load","loan","lobster","local","lock","logic","lonely","long","loop","lottery","loud","lounge","love","loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad","magic","magnet","maid","mail","main","major","make","mammal","man","manage","mandate","mango","mansion","manual","maple","marble","march","margin","marine","market","marriage","mask","mass","master","match","material","math","matrix","matter","maximum","maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt","member","memory","mention","menu","mercy","merge","merit","merry","mesh","message","metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor","minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile","model","modify","mom","moment","monitor","monkey","monster","month","moon","moral","more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie","much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual","myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature","near","neck","need","negative","neglect","neither","nephew","nerve","nest","net","network","neutral","never","news","next","nice","night","noble","noise","nominee","noodle","normal","north","nose","notable","note","nothing","notice","novel","now","nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe","obtain","obvious","occur","ocean","october","odor","off","offer","office","often","oil","okay","old","olive","olympic","omit","once","one","onion","online","only","open","opera","opinion","oppose","option","orange","orbit","orchard","order","ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output","outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact","paddle","page","pair","palace","palm","panda","panel","panic","panther","paper","parade","parent","park","parrot","party","pass","patch","path","patient","patrol","pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen","penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo","phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot","pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate","play","please","pledge","pluck","plug","plunge","poem","poet","point","polar","pole","police","pond","pony","pool","popular","portion","position","possible","post","potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare","present","pretty","prevent","price","pride","primary","print","priority","prison","private","prize","problem","process","produce","profit","program","project","promote","proof","property","prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin","punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle","pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit","raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp","ranch","random","range","rapid","rare","rate","rather","raven","raw","razor","ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle","reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release","relief","rely","remain","remember","remind","remove","render","renew","rent","reopen","repair","repeat","replace","report","require","rescue","resemble","resist","resource","response","result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib","ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot","ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket","romance","roof","rookie","room","rose","rotate","rough","round","route","royal","rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness","safe","sail","salad","salmon","salon","salt","salute","same","sample","sand","satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter","scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script","scrub","sea","search","season","seat","second","secret","section","security","seed","seek","segment","select","sell","seminar","senior","sense","sentence","series","service","session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell","sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop","short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side","siege","sight","sign","silent","silk","silly","silver","similar","simple","since","sing","siren","sister","situate","six","size","skate","sketch","ski","skill","skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight","slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth","snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda","soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry","sort","soul","sound","soup","source","south","space","spare","spatial","spawn","speak","special","speed","spell","spend","sphere","spice","spider","spike","spin","spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring","spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp","stand","start","state","stay","steak","steel","stem","step","stereo","stick","still","sting","stock","stomach","stone","stool","story","stove","strategy","street","strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway","success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny","sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey","suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim","swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag","tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi","teach","team","tell","ten","tenant","tennis","tent","term","test","text","thank","that","theme","then","theory","there","they","thing","this","thought","three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber","time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler","toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool","tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist","toward","tower","town","toy","track","trade","traffic","tragic","train","transfer","trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick","trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust","truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle","twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella","unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform","unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade","uphold","upon","upper","upset","urban","urge","usage","use","used","useful","useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van","vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue","verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory","video","view","village","vintage","violin","virtual","virus","visa","visit","visual","vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage","wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash","wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather","web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat","wheel","when","where","whip","whisper","wide","width","wife","wild","will","win","window","wine","wing","wink","winner","winter","wire","wisdom","wise","wish","witness","wolf","woman","wonder","wood","wool","word","work","world","worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year","yellow","you","young","youth","zebra","zero","zone","zoo"]}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/478.20842158e3db8ad2787f.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/478.20842158e3db8ad2787f.js new file mode 100644 index 0000000000..6274bd57ac --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/478.20842158e3db8ad2787f.js @@ -0,0 +1 @@ +(self.webpackChunkdesktopwallet=self.webpackChunkdesktopwallet||[]).push([[478],{32478:function(e){"use strict";e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Loading...","done-title":"Done","warning-title":"Warning","error-title":"Error","changes-made":"The changes have been made.","back-button":"Back","create-button":"Create","load-button":"Load","cancel-button":"Cancel","continue-button":"Continue","close-button":"Close","generic-confirmation-check":"I understand the risks and want to continue","copied":"The text has been copied to the clipboard."},"errors":{"window-size":"The window is too narrow for the content."},"language":{"title":"Select Language"},"header":{"syncing-blocks":"Syncing blocks","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"Wallet update","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"available.","synchronizing":"The wallet is synchronizing. Data you see may not be updated.","pending-txs-part1":"There are some","pending-txs-part2":"pending transactions.","pending-txs-part3":"Data you see may not be updated.","no-connections":"No connections active, your client is not connected to any other nodes!","no-backend-part1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Security vulnerability: CSRF is not working, please exit immediately."}},"password":{"title":"Enter Password","password-label":"Password","password-error-info":"You must enter a password.","confirm-password-label":"Confirm password","confirm-error-info":"The two passwords must match.","proceed-button":"Proceed","reset-link":"I forgot my password","incorrect-password-error":"Incorrect password.","decrypting-error":"Error decrypting the wallet."},"buy":{"title-and-button":"Buy","deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address","generate":"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you\'d like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.","send":"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!","receive":"Receive Sky","receive-desc":"After receiving your Bitcoin, we\'ll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},"wizard":{"create-title":"Create Wallet","create-desc":"If you don\'t have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \\"Load\\" and enter your seed.","encrypt-title":"Encrypt Wallet","encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","finish-temporal-title":"Ready","finish-temporal-desc":"Please click \\"Finish\\" button to create the wallet. Remember that it will be deleted after closing the wallet software.","hardware-wallet-link":"Using a Skywallet?","new-button":"New","load-button":"Load","finish-button":"Finish","confirm":{"title":"Safeguard Your Seed!","desc":"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!","checkbox":"It\u2019s safe, I swear."}},"wallet":{"title-and-button":"Wallets","show-empty-button":"Show Empty","hide-empty-button":"Hide Empty","encrypt-button":"Encrypt Wallet","decrypt-button":"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.","delete-button":"Delete Wallet","rename-button":"Rename","add-button":"New Wallet","load-button":"Load Wallet","hardware-wallet-button":"Skywallet","encryption-enabled":"Encryption enabled.","encryption-disabled":"Encryption disabled.","temporal":"Temporal wallet.","warning-hw-security":"Possible security risk. Access the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list) while the device is connected for more information.","wallet-table-label":"Wallet","hardware-wallet-table-label":"Skywallet","delete-confirmation":"WARNING: The wallet \\"{{ name }}\\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list). Do you want to continue?","delete-confirmation-check":"Yeah, I want to delete the wallet","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?","busy-error":"Please wait for the previous operation to be completed.","new":{"create-title":"Create Wallet","load-title":"Load Wallet","name-label":"Name","name-error-info":"You must enter a name.","words-number-label":"How many words the seed has","seed-label":"Seed","seed-error-info":"You must enter a seed.","confirm-seed-label":"Confirm seed","confirm-seed-error-info":"The two seeds must match.","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","12-words":"12 words","24-words":"24 words","generate-12-help":"Generate a 12 word seed.","generate-24-help":"Generate a 24 word seed.","encrypt-check":"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","advanced-options-link":"Advanced options","close-advanced-error":"It is not possible to close the options because you have made changes to the values.","temporal-check":"Load temporarily","temporal-info":"If you use this option, the wallet will be loaded temporarily, which means that it will be deleted as soon as you close the wallet software.","temporal-warning":"The wallet will be deleted just after closing the wallet software and won\'t have a password. You will needed the seed to recover access to the funds. Are you sure you want to continue?","seed-checking-error":"It was not possible to verify the validity of the seed.","unconventional-seed-title":"Possible Error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed","synchronizing-warning-text":"The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \\"Scan Addresses\\" function or add them again manually.","wallet-created":"The wallet has been added to the list.","seed":{"enter-seed":"Press here to enter the seed","change-seed":"Press to change","confirm-seed":"Press here to confirm the seed","confirmed-seed":"Seed confirmed","use-custom":"Enter the seed manually","use-normal":"Enter the seed using the recommended method","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","incorrect-word-error":"The word you have entered does not match the requested one.","invalid-seed-error":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","word-error-info":"You must enter a word.","new-seed-info":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-info":"Please be sure to enter the correct words in the correct order."}},"rename":{"title":"Rename Wallet","name-label":"Name","label-error-info":"You must enter a name.","rename-button":"Rename"},"address-options":{"title":"Addresses","new":"New Addresses","scan":"Scan Addresses","scan-help":"Use this option to make the system find already used addresses from this wallet which are missing from the list."},"scan-addresses":{"done-with-new-addresses":"The list has been updated.","done-without-new-addresses":"No new addresses were found."},"add-addresses":{"title":"Select Quantity","quantity-label":"How many addresses to create","quantity-error-info":"You must enter a value between 1 and 100.","error":"There was an unexpected error. Please try again."},"address":{"show":"Press to show","copy":"Copy","copy-address":"Copy address","copied":"Copied!","confirm":"Confirm address","outputs":"Unspent outputs","history":"History"}},"qr":{"title":"QR Code","data-label":"QR data","address-label":"Address","request-link":"Request specific amount","amount-label":"Requested amount","hours-label":"Requested hours","message-label":"Message","invalid":"(invalid value)"},"send":{"title-and-button":"Send","unsigned-button":"Unsigned","signed-button":"Signed","unsigned-confirmation":"The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?","synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.","wallet-label":"Wallet","wallet-error-info":"You must select a wallet.","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins-link":"send all","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","addresses-label":"Addresses","addresses-error-info":"You must enter at least one valid address.","no-wallet-selected-error":"There are no coins to send.","no-coins-left-error":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent.","addresses-manual-help":"List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.","outputs-error":"There was an error trying to get the outputs. Please make sure you have entered valid addresses.","all-outputs":"All the outputs of the selected addresses","enter-addresses-for-outputs":"Valid addresses must be entered first","enter-wallet-for-outputs-and-addresses":"A valid wallet must be selected first","invalid-addresses-for-outputs":"No outputs available","available-funds-msg-part1":"With your current selection you can send up to","available-funds-msg-part2":"and","available-funds-msg-part3":"(at least","available-funds-msg-part4":"must be used as transaction fee for sending all the coins or hours).","change-address-label":"Custom change address","change-address-error-info":"The change address is not valid.","change-address-select-from-list-link":"Select","change-address-help":"Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the \\"Select\\" link to choose an address from one of your wallets.","specific-hours":"Hours to send:","remove-specific-hours-info":"Remove.","remove-specific-hours-confirmation":"Are you sure you want to remove the specific amount of hours to send?","destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins.","destinations-help2":"Destination addresses, their coins and hours.","destination-tools-title":"Destination Tools","hours-allocation-check":"Use automatic {{ coinHoursName }} allocation","options-link":"Options","coin-hours-options-link":"Hours options","hours-share-factor-label":"{{ coinHoursName }} share factor","hours-share-factor-help":"This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.","close-hours-share-factor-alert":"The option will be resetted to the default value. Are you sure you want to continue?","preview-button":"Preview","send-button":"Send","show-button":"Show","simple-form-button":"Simple","advanced-form-button":"Advanced","select-wallet":"Select wallet","saving-note-error":"The transaction was successfully sent, but it was not possible to save the note.","sent":"Transaction successfully sent.","total-to-send":"Total:","invalid-address-error":"The destination address is not valid.","one-invalid-address-error":"One of the destination addresses is not valid.","various-invalid-addresses-error":"Some destination addresses are not valid.","all-addresses-invalid-error":"The destination addresses are not valid.","invalid-addresses-error":"Please make sure the address is valid.","address-error-info":"Please enter a valid address.","invalid-value-error-info":"Invalid value.","insufficient-funds-error-info":"The entered value is greater than the available balance.","sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","advanced-sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","sending-all-hours-waning":"You selected to send all the hours. Are you sure you want to continue?","high-hours-share-waning":"Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?","advanced-high-hours-share-waning":"Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?","fill-with-link":{"title":"Use a Transaction Link","link-info":"Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.","link-label":"Transaction link","link-error-info":"You must enter a valid transaction link.","process-button":"Process","invalid-link-error":"The contents of the transaction link are not valid.","invalid-link-hours-error":"The transaction link contains an invalid amount of hours.","data-overwritten-alert":"Some data you have entered will be overwritten. Are you sure you want to continue?","confirmation":"The form has been updated with the data obtained from the transaction link."},"known-node-errors":{"null-change-address-error":"The null address can\'t be used as the custom change address. Please enter a valid address.","to-required-error":"You must provide a destination address for sending coins. Please enter a valid address.","zero-coins-error":"It\'s not possible to send zero coins. Please enter a valid amount.","null-destination-error":"The null address can\'t be used as destination. Please enter a valid address.","duplicate-destination-error":"There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.","hours-in-automatic-mode-error":"Specific hour amounts can\'t be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-needed-error":"The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.","invalid-hours-allocation-mode-error":"Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-not-needed-error":"The hour allocation mode can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-hours-mode-error":"Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.","share-factor-needed-error":"The hours share factor is needed. Please try with different values and contact support if the problem is not solved.","share-factor-not-needed-error":"The hours share factor can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-share-factor-error":"Invalid share factor. Please try with different values and contact support if the problem is not solved.","change-equal-to-destination-error":"The transaction can\'t be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.","repeated-wallet":"A wallet for the specified seed already exists."},"bulk-send":{"title":"Bulk Send","indications":"To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \\"xyz\\" address, type \\"xyz,10,5\\"; if you want the hours to be calculated automatically, type \\"xyz,10\\". Decimal values must be separated with a dot.","data-error-info":"You must enter a value.","process-button":"Process","no-data-error":"There is no text to process.","inconsistent-data-error":"If you set how many hours you want to send to a destination, you must do so for all destinations.","invalid-data-error":"The entered text has an invalid format."}},"select-address":{"title":"Select Address","no-addresses":"There are no confirmed addresses on this wallet."},"offline-transactions":{"loading-problem":"Error trying to get the necessary data","wallet-error-info":"You must select a wallet.","tx-error-info":"You must enter a valid transaction text.","copy-tx":{"signed-title":"Signed Transaction","unsigned-title":"Unsigned Transaction","text-unsigned":"This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \\"Sign Transaction\\" option.","text-signed":"This is the signed transaction. You can send it to the network using the \\"Broadcast Transaction\\" option.","input-label":"Transaction text","copy-button":"Copy","reset-confirmation":"Do you want the the form to be cleaned, so you can create another transaction?","reset-done":"The form has been cleaned."},"sign-tx":{"title":"Sign Transaction","text":"Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.","wallet-label":"Wallet","select-wallet":"Select wallet","input-label":"Transaction text","sign-button":"Sign","signed":"The transaction has been signed."},"broadcast-tx":{"title":"Broadcast Transaction","text":"Use this form to send a signed transaction to the network.","input-label":"Transaction text","send-button":"Send","sent":"The transaction has been sent."}},"reset":{"title":"Reset Password","wallet-label":"Wallet","seed-label":"Wallet seed","seed-error-info":"You must enter a seed.","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","confirm-error-info":"The two passwords must match.","reset-button":"Reset","done":"Password successfully changed."},"tx":{"transaction-title":"Transaction","confirm-transaction-title":"Confirm Transaction","from-small-label":"From:","to-small-label":"To:","date-small-label":"Date:","status-small-label":"Status:","coins-small-label":"Coins:","hours-small-label":"Hours:","id-small-label":"Tx ID:","note-small-label":"Note:","without-note":"Without note","show-more-link":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned","inputs-title":"Inputs","outputs-title":"Outputs","confirmed-transaction":"Confirmed","pending-transaction":"Pending","current-rate-help":"Calculated at the current rate."},"edit-note":{"title":"Edit Note","change-button":"Change"},"backup":{"title":"Backup Wallet","wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.","desc":"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","wallet-table-label":"Wallet name","filename-table-label":"Filename","save-addresses-button":"Save Addresses","show-seed-button":"Show Seed","no-wallets":"There are no wallets","unencrypted-info":"For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.","hw-wallet-info":"For getting the seed of a Skywallet, please use the \\"Skywallet\\" option at the bottom of the wallets page.","not-compatible-error":"Your web browser is not compatible with this function.","seed-modal-window":{"title":"Wallet Seed","seed-label":"Seed"}},"blockchain":{"title":"Blockchain","blocks-label":"Number of blocks","time-label":"Timestamp of last block","hash-label":"Hash of last block","current-supply-label":"Current {{ coinName }} supply","total-supply-label":"Total {{ coinName }} supply","current-coinhour-supply-label":"Current {{ coinHoursName }} supply","total-coinhour-supply-label":"Total {{ coinHoursName }} supply"},"network":{"title":"Networking","error-no-connections":"No connections","peer-small-table-label":"Peer","source-small-table-label":"Source","block-height-small-table-label":"Block height","block-height-short-small-table-label":"Block","last-seen-small-table-label":"Last seen","last-received-help":"Last received.","last-sent-help":"Last sent.","in-help":"Incoming.","out-help":"Outgoing.","sources":{"default":"Default peer","exchange":"Peer exchange"}},"pending-txs":{"title":"Pending Transactions","timestamp-table-label":"Timestamp","txid-table-label":"Transaction ID","none":"No pending transactions","my-transactions-button":"Mine","all-transactions-button":"All"},"outputs":{"title":"Outputs","error-no-outputs":"No unspent outputs"},"history":{"title-and-button":"History","tx-detail-title":"Transaction Detail","moving":"Internally moving {{ coinName }}","moved":"Internally moved {{ coinName }}","sending":"Sending {{ coinName }}","sent":"Sent {{ coinName }}","received":"Received {{ coinName }}","receiving":"Receiving {{ coinName }}","pending-indication":"Pending","transaction-note-small-label":"Note:","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)","filter":"Active filter: ","filters":"Active filters: ","all-addresses":"All addresses","view-all":"View all {{ number }} transactions"},"teller":{"done":"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin","unknown":"Unknown"},"confirmation":{"default-title":"Confirmation","yes-button":"Yes","no-button":"No"},"service":{"api":{"no-internet-error":"You do not have a internet connection or the node has stopped working.","incorrect-password-error":"Incorrect password.","unknown-error":"It was not possible to perform the operation.","api-disabled-error":"API disabled."}},"force-skywallet-wipe":{"title":"Forced Skywallet Wipe","operation-warning":"This option is designed only as a last resort for cases where the device cannot be used with the normal options. All data on the device will be erased, so you will need your seed to recover the funds.","proceed-button":"Proceed"},"hardware-wallet":{"general":{"default-wallet-name":"New Skywallet","confirm":"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.","follow":"Please follow the instructions displayed on the Skywallet.","completed":"Operation completed successfully.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},"errors":{"generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","disconnected":"Unable to perform the operation. The Skywallet is not connected.","incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.","refused":"The operation was canceled.","too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ","timeout":"The operation was canceled due to inactivity. Please try again.","timeout-with-configurable-link":"The operation was canceled due to inactivity. Please try again. If this issue prevents the device from being usable, you can use the following option:","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{"title":"Security Warning","text":"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.","link":"Open the Skywallet options window."},"options":{"connecting":"Connecting...","disconnected":"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":"A seedless Skywallet has been detected. Select \\"Configure Automatically\\" if you want to configure it as a brand new wallet and start using it. Select \\"Restore Backup\\" if you want to configure the Skywallet with a previously created seed backup.","configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security Warnings","security-warning-title":"Security Warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":"The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \\"Update Firmware\\" option.","backup-warning":"You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \\"Create a Backup\\" option.","pin-warning":"The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \\"Create PIN Code\\" option.","options":"Options:","update-firmware":"Update Firmware","configure-automatically":"Configure Automatically","restore-backup":"Restore Backup","create-backup":"Create a Backup","wipe":"Wipe the Device","confirm-seed":"Confirm Seed","create-pin":"Create PIN Code","change-pin":"Change PIN Code","delete-pin":"Delete PIN Code","forgotten-pin-part1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin-part2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{"title":"Outdated Firmware","text":"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.","update":"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.","follow":"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.","timeout":"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.","finished":"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{"text":"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.","configuring":"Configuring..."},"restore-seed":{"text":"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.","warning":"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: the retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: the seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: the seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},"added":{"title":"New Skywallet","configuring":"New Skywallet detected. Configuring...","done":"Done","added1":"The connected Skywallet has been added to the wallets list with the following name:","added2":"Now you can check the balance and the addresses of the Skywallet even when it is not connected.","added-error-info":"You must enter a name.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device."},"wipe":{"warning":"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete-check":"Also remove from the wallets list"},"create-backup":{"warning":"WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \\"seed\\") will be able access the wallet funds, so extreme caution is advised.","instructions":"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{"title":"Enter Word","enter-word":"Enter the word shown on the device","info":"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.","word-label":"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{"warning":"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties."},"enter-pin":{"title":"Enter PIN","title-change-current":"Enter the Current PIN","title-change-new":"Enter the New PIN","title-change-confirm":"Confirm the New PIN","instructions-generic":"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.","help":"Need help?"},"pin-help":{"title":"Help","part1":"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.","part2":"To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \\"23\\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.","part3":"If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \\"23\\", you can not simply type \\"23\\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \\"7\\" and \\"5\\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet."},"create-tx":{"title":"Create Transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","separator-for-coins-and-hours":"and","separator-to-destination":"to"},"confirm-address":{"title":"Confirm Address","instructions":"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.","confirmation":"Address confirmed. For security, you can re-show the address in the Skywallet using the \\"Confirm address\\" option, in the menu that you can display by pressing the button at the right of the address balance."}},"time-from-now":{"few-seconds":"a few seconds ago","minute":"one minute ago","minutes":"{{time}} minutes ago","hour":"one hour ago","hours":"{{time}} hours ago","day":"one day ago","days":"{{time}} days ago"},"exchange":{"title-and-button":"Buy {{ coinName }}","label-you-send":"You send","label-you-get":"You get (approx.)","label-to-address":"To {{coin}} address","label-price":"Exchange rate","label-stimate-transaction-time":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-part1":"I agree with the","agree-part2":"Terms of Use","agree-part3":"and the","agree-part4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal","history":"Order history","order-not-found":"Order not found","label-status":"Status","exchanging":"Exchanging {{from}} for {{to}}","destination-select-from-list-link":"Select","unavailable":"The exchange service is not available in the portable version","offline":"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later","invalid-address-error":"Invalid address.","from-coin-error-info":"You must select a coin.","invalid-value-error-info":"Invalid value.","address-error-info":"Please enter a valid address.","statuses":{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.","complete":"Exchange completed!","complete-info":"The funds have been successfully sent to your address.","error":"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{"title":"Order History","address":"Address:","date":"Date:"},"details":{"exchange-addr-label":"Exchange address (valid for this exchange operation only)","exchange-addr-tag-label":"Payment ID or Destination Tag which must be used for the transaction","tx-id-label":"Transaction ID","order-id-label":"Order ID","initial-price-label":"Initial exchange rate","error-msg-label":"Error message","details-link":"Details","start-date-label":"Start date","back-alert":"The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \\"Order history\\" button"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.2e4f5db4750af0606fed.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.2e4f5db4750af0606fed.js new file mode 100644 index 0000000000..72ecff49ea --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.2e4f5db4750af0606fed.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{"+dwz":function(e){e.exports=JSON.parse('{"common":{"usd":"\u7f8e\u5143","loading":"\u52a0\u8f7d\u4e2d...","done-title":"\u5b8c\u6210","warning-title":"\u8b66\u544a","error-title":"\u9519\u8bef","changes-made":"\u4fee\u6539\u5df2\u5b8c\u6210","back-button":"\u540e\u9000","create-button":"\u521b\u5efa","load-button":"\u52a0\u8f7d","cancel-button":"\u53d6\u6d88","continue-button":"\u7ee7\u7eed","close-button":"\u5173\u95ed","generic-confirmation-check":"\u6211\u5df2\u4e86\u89e3\u98ce\u9669\uff0c\u8bf7\u7ee7\u7eed","copied":"\u6587\u672c\u5df2\u590d\u5236\u5230\u526a\u8d34\u677f"},"errors":{"window-size":"\u7a97\u53e3\u592a\u7a84\uff0c\u5185\u5bb9\u653e\u4e0d\u4e0b"},"language":{"title":"\u9009\u62e9\u8bed\u8a00"},"header":{"syncing-blocks":"\u533a\u5757\u540c\u6b65\u4e2d","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"\u94b1\u5305\u66f4\u65b0","update-part2":"\u672a\u4f7f\u7528","update-part3":"\u53ef\u83b7\u53d6","synchronizing":"\u94b1\u5305\u6b63\u5728\u540c\u6b65\u3002\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002","pending-txs-part1":"\u8fd9\u91cc\u6709\u4e00\u4e9b","pending-txs-part2":"\u5f85\u5904\u7406\u4ea4\u6613\u3002","pending-txs-part3":"\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002","no-connections":"\u6ca1\u6709\u8fde\u63a5\uff0c\u4f60\u7684\u5ba2\u6237\u7aef\u6ca1\u6709\u8fde\u63a5\u5230\u4efb\u4f55\u5176\u4ed6\u8282\u70b9","no-backend-part1":"\u4e0d\u80fd\u5230\u8fbe\u540e\u7aef\u3002\u8bf7\u91cd\u65b0\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\u6216\u5bfb\u6c42\u6211\u4eec\u7684\u5e2e\u52a9","no-backend-part2":"Telegram","no-backend-part3":"","csrf":"\u5b89\u5168\u6f0f\u6d1e: CSRF\u672a\u5de5\u4f5c\uff0c\u8bf7\u7acb\u5373\u9000\u51fa\u3002"}},"password":{"title":"\u8f93\u5165\u5bc6\u7801","password-label":"\u5bc6\u7801","password-error-info":"\u8bf7\u8f93\u5165\u5bc6\u7801","confirm-password-label":"\u786e\u8ba4\u5bc6\u7801","confirm-error-info":"\u4e24\u6b21\u5bc6\u7801\u5fc5\u987b\u5339\u914d","proceed-button":"\u7ee7\u7eed","reset-link":"\u6211\u5fd8\u8bb0\u4e86\u5bc6\u7801","incorrect-password-error":"\u5bc6\u7801\u4e0d\u6b63\u786e\u3002","decrypting-error":"\u94b1\u5305\u89e3\u5bc6\u5931\u8d25\u3002"},"buy":{"title-and-button":"\u8d2d\u4e70","deposit-address":"\u9009\u62e9\u4e00\u4e2a\u5730\u5740\u6765\u751f\u6210BTC\u5145\u503c\u94fe\u63a5\uff0c\u7528\u4e8e:","select-address":"\u9009\u62e9\u5730\u5740","generate":"\u751f\u6210","deposit-location":"\u5145\u503c\u4f4d\u7f6e","deposit-location-desc":"\u9009\u62e9\u4e00\u4e2a\u94b1\u5305\uff0c\u4ee5\u5728\u6211\u4eec\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\u5145\u503cSkycoin\u5230\u8be5\u94b1\u5305","make-choice":"\u505a\u9009\u62e9","wallets-desc":"\u6bcf\u5f53\u9009\u62e9\u4e00\u4e2a\u65b0\u7684\u94b1\u5305\u548c\u5730\u5740\uff0c\u4e00\u4e2a\u65b0\u7684BTC\u5730\u5740\u5c06\u4f1a\u751f\u6210\u3002\u4e00\u4e2a\u72ec\u7acb\u7684Skycoin\u5730\u5740\u6700\u591a\u53ef\u7ed1\u5b9a5\u4e2aBTC\u5730\u5740\u3002","send":"\u53d1\u9001Bitcoin","send-desc":"\u53d1\u9001Bitcoin\u81f3\u5982\u4e0b\u5730\u5740\u3002\u4e00\u65e6\u6536\u5230\uff0c\u6211\u4eec\u5c06\u4f1a\u6309\u5f53\u524d\u6c47\u7387: {{ rate }} SKY/BTC\u5145\u503cSkycoin\u5230\u9009\u4e2d\u94b1\u5305\u7684\u4e00\u4e2a\u65b0\u5730\u5740\u3002","fraction-warning":"\u8bf7\u6309SKY/BTC\u6c47\u7387\u7684\u500d\u6570\u53d1\u9001BTC! Skycoin\u662f\u4ee5\u6574\u6570\u53d1\u9001; SKY\u7684\u5c0f\u6570\u4f4d\u5c06\u4e0d\u4f1a\u53d1\u9001","receive":"\u63a5\u6536Sky","receive-desc":"\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\uff0c\u6211\u4eec\u5c06\u53d1\u9001Skycoin\u7ed9\u4f60\u3002\u4f60\u53ef\u80fd\u9700\u898120\u5206\u949f\u5230\u4e00\u4e2a\u5c0f\u65f6\u624d\u80fd\u6536\u5230\u8fd9\u4e9bSKY\u3002","status-button":"\u72b6\u6001:","check-status-button":"\u67e5\u770b\u72b6\u6001","new-order-button":"\u65b0\u8ba2\u5355"},"wizard":{"create-title":"\u521b\u5efa\u94b1\u5305","create-desc":"\u5982\u679c\u4f60\u6ca1\u6709{{ coinName }}\u94b1\u5305\uff0c\u8bf7\u4f7f\u7528\u751f\u6210\u7684\u79cd\u5b50\u6765\u521b\u5efa\u4e00\u4e2a\u65b0\u94b1\u5305\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u6709\u4e00\u4e2a\u94b1\u5305\uff0c\u5207\u6362\u5230\\"\u52a0\u8f7d\u94b1\u5305\\"\u5e76\u8f93\u5165\u4f60\u7684\u79cd\u5b50\u3002","encrypt-title":"\u52a0\u5bc6\u94b1\u5305","encrypt-desc":"\u901a\u8fc7\u52a0\u5bc6\u6765\u589e\u52a0\u94b1\u5305\u7684\u5b89\u5168\u6027\u3002\u8f93\u5165\u5bc6\u7801\u540e\uff0c\u4f60\u7684\u94b1\u5305\u4f1a\u88ab\u52a0\u5bc6\u3002\u53ea\u6709\u8f93\u5165\u5bc6\u7801\u624d\u53ef\u4ee5\u8bbf\u95ee\u7684\u94b1\u5305\u6216\u79fb\u52a8\u8d44\u91d1\u3002","hardware-wallet-link":"\u4f7f\u7528\u786c\u4ef6\u94b1\u5305\uff1f","new-button":"\u65b0\u5efa","load-button":"\u52a0\u8f7d","finish-button":"\u5b8c\u6210","confirm":{"title":"\u4fdd\u62a4\u4f60\u7684\u79cd\u5b50!","desc":"\u8bf7\u786e\u4fdd\u4f60\u5df2\u7ecf\u5199\u4e0b\u4f60\u7684\u79cd\u5b50\u5e76\u5c06\u5b83\u50a8\u5b58\u5728\u4e86\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u6062\u590d\u4f60\u7684Skycoin\u94b1\u5305","checkbox":"\u5b83\u5f88\u5b89\u5168\uff0c\u6211\u53d1\u8a93\u3002"}},"wallet":{"title-and-button":"\u94b1\u5305","show-empty-button":"\u663e\u793a\u7a7a\u5730\u5740","hide-empty-button":"\u9690\u85cf\u7a7a\u5730\u5740","encrypt-button":"\u52a0\u5bc6\u94b1\u5305","decrypt-button":"\u89e3\u5bc6\u94b1\u5305","decrypt-warning":"\u8b66\u544a: \u51fa\u4e8e\u5b89\u5168\u8003\u8651\uff0c\u5efa\u8bae\u5c06\u94b1\u5305\u52a0\u5bc6\u3002\u5efa\u8bae\u8c28\u614e\u4e00\u70b9\u3002","delete-button":"\u5220\u9664\u94b1\u5305","rename-button":"\u4fee\u6539\u94b1\u5305\u540d\u79f0","add-button":"\u6dfb\u52a0\u94b1\u5305","load-button":"\u52a0\u8f7d\u94b1\u5305","hardware-wallet-button":"\u786c\u4ef6\u94b1\u5305","encryption-enabled":"\u52a0\u5bc6\u5df2\u542f\u7528","encryption-disabled":"\u52a0\u5bc6\u5df2\u7981\u7528","warning-hw-security":"\u53ef\u80fd\u7684\u5b89\u5168\u98ce\u9669\u3002\u5f53\u786c\u4ef6\u8bbe\u5907\u5df2\u8fde\u63a5\u65f6(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u6309\u94ae)\u8bbf\u95ee\u786c\u4ef6\u94b1\u5305\u9009\u9879\u4ee5\u83b7\u53d6\u66f4\u591a\u4fe1\u606f","wallet-table-label":"\u94b1\u5305","hardware-wallet-table-label":"\u786c\u4ef6\u94b1\u5305","delete-confirmation":"\u8b66\u544a: \u94b1\u5305\\"{{ name }}\\"\u5c06\u4ece\u5217\u8868\u4e2d\u5220\u9664\u3002\u82e5\u60f3\u91cd\u65b0\u6dfb\u52a0\uff0c\u9700\u91cd\u65b0\u8fde\u63a5\u8bbe\u5907\u5e76\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u7684\u9009\u9879\u5217\u8868(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u6309\u94ae)\u3002\u4f60\u60f3\u7ee7\u7eed\u5417\uff1f","delete-confirmation-check":"\u662f\u7684\uff0c\u6211\u60f3\u8981\u5220\u9664\u94b1\u5305\u3002","max-hardware-wallets-error":"\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u91cc\u7684\u5730\u5740\u5df2\u7ecf\u8fbe\u5230\u5141\u8bb8\u7684\u6700\u5927\u503c\u3002","add-many-confirmation":"\u8b66\u544a: \u5982\u679c\u4f60\u5728\u4e0d\u4f7f\u7528\u524d\u4e00\u4e2a\u5730\u5740\u7684\u60c5\u51b5\u4e0b\u6dfb\u52a0\u592a\u591a\u5730\u5740\uff0c\u6216\u8005\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662f\u6700\u540e\u4e00\u4e2a\u5730\u5740\u800c\u4e0d\u662f\u7b2c\u4e00\u4e2a\u5730\u5740\uff0c\u90a3\u4e48\u5982\u679c\u4f60\u5c1d\u8bd5\u4f7f\u7528\u79cd\u5b50\u6062\u590d\u94b1\u5305\uff0c\u6709\u4e9b\u5730\u5740\u5c06\u53ef\u80fd\u65e0\u6cd5\u81ea\u52a8\u6062\u590d\uff08\u4f60\u5fc5\u987b\u624b\u52a8\u6dfb\u52a0\u5b83\u4eec\uff09\u3002 \u4f60\u60f3\u7ee7\u7eed\u5417\uff1f","busy-error":"\u8bf7\u7b49\u5f85\u4e0a\u4e00\u64cd\u4f5c\u5b8c\u6210\u3002","new":{"create-title":"\u521b\u5efa\u94b1\u5305","load-title":"\u52a0\u8f7d\u94b1\u5305","name-label":"\u540d\u79f0","name-error-info":"\u8bf7\u8f93\u5165\u94b1\u5305\u540d","words-number-label":"\u79cd\u5b50\u6709\u591a\u5c11\u5b57","seed-label":"\u79cd\u5b50","seed-error-info":"\u8bf7\u8f93\u5165\u79cd\u5b50","confirm-seed-label":"\u786e\u8ba4\u79cd\u5b50","confirm-seed-error-info":"\u79cd\u5b50\u4e0d\u5339\u914d","seed-warning":"\u8bb0\u4f4f\u79cd\u5b50! \u628a\u5b83\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002 \u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u4f60\u7684\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u627e\u56de\u4f60\u7684\u94b1\u5305!","12-words":"12\u5b57","24-words":"24\u5b57","generate-12-help":"\u751f\u621012\u5b57\u79cd\u5b50","generate-24-help":"\u751f\u621024\u5b57\u79cd\u5b50","encrypt-check":"\u52a0\u5bc6\u94b1\u5305","encrypt-warning":"\u6211\u4eec\u5efa\u8bae\u4f60\u4e3a\u6bcf\u4e2a\u94b1\u5305\u8bbe\u7f6e\u4e00\u4e2a\u72ec\u7acb\u7684\u5bc6\u7801\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u5bc6\u7801\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u79cd\u5b50\u91cd\u7f6e\u94b1\u5305\u3002\u5728\u52a0\u5bc6\u4f60\u7684\u94b1\u5305\u4e4b\u524d\uff0c\u786e\u4fdd\u4f60\u7684\u79cd\u5b50\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002","seed-checking-error":"\u65e0\u6cd5\u9a8c\u8bc1\u79cd\u5b50\u7684\u6548\u6027","unconventional-seed-title":"\u53ef\u80fd\u9519\u8bef","unconventional-seed-text":"\u4f60\u5f15\u8fdb\u4e86\u4e00\u79cd\u975e\u4f20\u7edf\u7684\u79cd\u5b50\u3002\u5982\u679c\u4f60\u51fa\u4e8e\u4efb\u4f55\u7279\u6b8a\u539f\u56e0\u8fd9\u6837\u505a\uff0c\u4f60\u53ef\u4ee5\u7ee7\u7eed(\u53ea\u63a8\u8350\u9ad8\u7ea7\u7528\u6237)\u3002\u4f46\u662f\uff0c\u5982\u679c\u4f60\u6253\u7b97\u4f7f\u7528\u666e\u901a\u7684\u7cfb\u7edf\u79cd\u5b50\uff0c\u5219\u5fc5\u987b\u5220\u9664\u6240\u6709\u9644\u52a0\u6587\u672c\u548c\u7279\u6b8a\u5b57\u7b26\u3002","unconventional-seed-check":"\u7ee7\u7eed\u4f7f\u7528\u975e\u4f20\u7edf\u79cd\u5b50\u3002","synchronizing-warning-text":"\u94b1\u5305\u6b63\u5728\u540c\u6b65\u4e2d\uff0c\u5f53\u524d\u64cd\u4f5c\u65e0\u6cd5\u53ef\u80fd\u65e0\u6cd5\u6062\u590d\u6240\u6709\u5730\u5740\u3002\u5982\u6709\u672a\u6062\u590d\u5730\u5740\uff0c\u8bf7\u540c\u6b65\u5b8c\u6210\u540e\u4f7f\u7528\\"\u626b\u63cf\u5730\u5740\\"\u529f\u80fd\u6216\u624b\u52a8\u91cd\u65b0\u6dfb\u52a0","wallet-created":"\u94b1\u5305\u5df2\u6dfb\u52a0\u5230\u5217\u8868","seed":{"enter-seed":"\u70b9\u51fb\u6b64\u5904\u8f93\u5165\u79cd\u5b50","change-seed":"\u70b9\u51fb\u4fee\u6539","confirm-seed":"\u70b9\u51fb\u6b64\u5904\u786e\u8ba4\u79cd\u5b50","confirmed-seed":"\u79cd\u5b50\u5df2\u786e\u8ba4","use-custom":"\u624b\u52a8\u8f93\u5165\u79cd\u5b50","use-normal":"\u4f7f\u7528\u63a8\u8350\u65b9\u5f0f\u8f93\u5165\u79cd\u5b50","custom-seed-warning-text":"\u4ec5\u5efa\u8bae\u9ad8\u7ea7\u7528\u6237\u4f7f\u7528\u3002\u4e00\u65e6\u8f93\u5165\u79cd\u5b50\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u5931\u8bef\uff0c\u4f60\u6709\u53ef\u80fd\u4f1a\u6c38\u4e45\u5931\u53bb\u8d44\u4ea7","custom-seed-warning-text-recovering":"\u4e3a\u907f\u514d\u51fa\u73b0\u95ee\u9898\uff0c\u8be5\u9009\u9879\u8bf7\u4ec5\u7528\u4e8e\u6062\u590d\u975e\u4f20\u7edf\u79cd\u5b50","incorrect-word-error":"\u8f93\u5165\u7684\u5b57\u4e0d\u5339\u914d\u3002","invalid-seed-error":"\u8f93\u5165\u7684\u79cd\u5b50\u65e0\u6548\uff0c\u8bf7\u91cd\u8bd5\u3002","enter-word":"\u8f93\u5165\u7b2c#{{number}}\u4e2a\u5b57","word-error-info":"\u8bf7\u8f93\u5165\u5b57","new-seed-info":"\u8bf7\u8f93\u5165\u7cfb\u7edf\u751f\u6210\u7684\u79cd\u5b50\u4ee5\u786e\u8ba4","recover-seed-info":"\u8bf7\u786e\u8ba4\u6309\u6b63\u786e\u7684\u987a\u5e8f\u8f93\u5165\u79cd\u5b50"}},"rename":{"title":"\u91cd\u547d\u540d\u94b1\u5305","name-label":"\u547d\u540d","label-error-info":"\u8bf7\u8f93\u5165\u94b1\u5305\u540d","rename-button":"\u91cd\u547d\u540d"},"address-options":{"title":"\u5730\u5740","new":"\u65b0\u5efa\u5730\u5740","scan":"\u626b\u63cf\u5730\u5740","scan-help":"\u4f7f\u7528\u8be5\u9009\u9879\u626b\u63cf\u94b1\u5305\u4e2d\u4f7f\u7528\u8fc7\u4f46\u672a\u52a0\u8f7d\u51fa\u7684\u5730\u5740"},"scan-addresses":{"done-with-new-addresses":"\u94b1\u5305\u5730\u5740\u5df2\u66f4\u65b0\u3002","done-without-new-addresses":"\u672a\u53d1\u73b0\u65b0\u5730\u5740\u3002"},"add-addresses":{"title":"\u9009\u62e9\u6570\u91cf","quantity-label":"\u521b\u5efa\u591a\u5c11\u5730\u5740","quantity-error-info":"\u8bf7\u8f93\u5165\u6570\u503c\u57281\u5230100\u4e4b\u95f4","error":"\u51fa\u73b0\u5f02\u5e38\u9519\u8bef\uff0c\u8bf7\u91cd\u8bd5\u3002"},"address":{"show":"\u70b9\u51fb\u663e\u793a","copy":"\u590d\u5236","copy-address":"\u590d\u5236\u5730\u5740","copied":"\u5df2\u590d\u5236!","confirm":"\u786e\u8ba4\u5730\u5740","outputs":"\u672a\u4ea4\u6613\u8f93\u51fa","history":"\u5386\u53f2"}},"qr":{"title":"\u4e8c\u7ef4\u7801","data-label":"QR \u6570\u636e","address-label":"\u5730\u5740","request-link":"\u8bf7\u6c42\u6307\u5b9a\u91d1\u989d","amount-label":"\u8bf7\u6c42\u7684\u91d1\u989d","hours-label":"\u8bf7\u6c42\u7684\u5e01\u65f6","message-label":"\u6d88\u606f","invalid":"(\u65e0\u6548\u503c)"},"send":{"title-and-button":"\u53d1\u9001","unsigned-button":"\u65e0\u7b7e\u540d","signed-button":"\u7b7e\u540d","unsigned-confirmation":"\u65e0\u7b7e\u540dTransactions\u9009\u9879\u65e0\u53d1\u9001\u529f\u80fd\uff0c\u5904\u4e8e\u5b89\u5168\u8003\u8651\uff0c\u53ef\u4ee5\u4f7f\u7528\u8be5\u9009\u9879\u521b\u5efa\u65e0\u7b7e\u540d\u7684Transactions\uff0c\u5e76\u5728\u5b89\u5168\u7684\u975e\u8054\u7f51\u8bbe\u5907\u4e0a\u5b8c\u6210\u7b7e\u540d","synchronizing-warning":"\u94b1\u5305\u4ecd\u5728\u540c\u6b65\u6570\u636e\uff0c\u6240\u4ee5\u663e\u793a\u7684\u4f59\u989d\u53ef\u80fd\u4e0d\u6b63\u786e\u3002\u4f60\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f","from-label":"\u53d1\u9001\u81ea","to-label":"\u53d1\u9001\u81f3","amount-label":"\u603b\u989d","personal-note-label":"\u65e5\u5fd7","personal-note-help":"\u6587\u672c\u8bb0\u5f55\u7528\u4e8e\u5c06\u6765\u67e5\u627e\u76f8\u5173\u4ea4\u6613\u8bb0\u5f55\u3002\u6587\u672c\u5185\u5bb9\u662f\u672c\u5730\u5b58\u50a8\uff0c\u56e0\u6b64\u53ea\u80fd\u5728\u5f53\u524d\u8bbe\u5907\u53ef\u89c1","wallet-label":"\u94b1\u5305","wallet-error-info":"\u8bf7\u9009\u62e9\u4e00\u4e2a\u94b1\u5305","invalid-amount":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u6570\u503c","convert-confirmation":"\u662f\u5426\u9700\u8981\u5c06\u6570\u989d\u4ece{{from}}\u8f6c\u6362\u4e3a{{to}}?","convert-confirmation-plural":"\u662f\u5426\u9700\u8981\u5c06\u6570\u989d\u4ece{{from}}\u8f6c\u6362\u4e3a{{to}}?","send-all-available-coins-link":"\u53d1\u9001\u6240\u6709","precision-error-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u4e00\u4e2a\u7cbe\u5ea6\u95ee\u9898\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","invaid-amount-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u4e00\u4e2a\u65e0\u6548\u503c\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","precision-errors-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u7cbe\u5ea6\u95ee\u9898\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","invaid-amounts-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u65e0\u6548\u503c\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","multiple-problems-warning":"\u56e0\u4e3a\u65e0\u6548\u503c\u6216\u7cbe\u5ea6\u95ee\u9898\uff0c\u6709\u4e9b\u503c\u8f6c\u6362\u5931\u8d25\uff0c\u4eb2\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","addresses-label":"\u5730\u5740","addresses-error-info":"\u8bf7\u81f3\u5c11\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u5730\u5740","no-wallet-selected-error":"\u6ca1\u6709\u5e01\u53ef\u53d1\u9001","no-coins-left-error":"\u6ca1\u6709\u5269\u4f59\u5e01\u53ef\u53d1\u9001","addresses-help":"\u9650\u5b9a\u6e90\u53d1\u9001\u5730\u5740","addresses-manual-help":"\u6e90\u53d1\u9001\u5730\u5740\u5217\u8868\uff0c\u4ee5\u9017\u53f7\u9694\u5f00\u3002\u6240\u6709\u5730\u5740\u5fc5\u987b\u5c5e\u4e8e\u7edf\u4e00\u94b1\u5305\uff0c\u5426\u5219\u5c06\u4f1a\u7b7e\u540d\u5931\u8d25","all-addresses":"\u6240\u6709\u5730\u5740(\u6240\u9009\u94b1\u5305\u7684)","outputs-label":"\u672a\u4ea4\u6613\u8f93\u51fa","outputs-help":"\u9650\u5b9a\u672a\u4ea4\u6613\u8f93\u51fa","outputs-error":"\u83b7\u53d6\u4ea4\u6613\u8f93\u51fa\u5931\u8d25\u3002\u8bf7\u786e\u4fdd\u8f93\u5165\u7684\u662f\u6709\u6548\u5730\u5740","all-outputs":"\u6240\u6709\u672a\u4ea4\u6613\u8f93\u51fa(\u6240\u9009\u5730\u5740\u7684)","enter-addresses-for-outputs":"\u8bf7\u5148\u8f93\u5165\u6709\u6548\u7684\u5730\u5740","enter-wallet-for-outputs-and-addresses":"\u8bf7\u9009\u62e9\u4e00\u4e2a\u6709\u6548\u7684\u94b1\u5305","invalid-addresses-for-outputs":"\u6ca1\u6709\u6709\u6548\u7684\u672a\u4ea4\u6613\u8f93\u51fa","available-funds-msg-part1":"\u6839\u636e\u4f60\u5f53\u524d\u7684\u9009\u62e9\uff0c\u4f60\u6700\u591a\u53ef\u4ee5\u53d1\u9001","available-funds-msg-part2":"\u548c","available-funds-msg-part3":"(\u81f3\u5c11","available-funds-msg-part4":"\u5c06\u4f5c\u4e3a\u5fc5\u987b\u7684\u4ea4\u6613\u624b\u7eed\u8d39)\u3002","change-address-label":"\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740","change-address-error-info":"\u627e\u96f6\u5730\u5740\u65e0\u6548","change-address-select-from-list-link":"\u9009\u62e9","change-address-help":"\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740\u3002\u5982\u679c\u4e0d\u63d0\u4f9b\uff0c\u94b1\u5305\u5c06\u4f1a\u81ea\u52a8\u9009\u62e9\u3002\u70b9\u51fb\\"\u9009\u62e9\\" \u6765\u9009\u62e9\u4e00\u4e2a\u5730\u5740","specific-hours":"\u53d1\u9001\u5e01\u65f6:","remove-specific-hours-info":"\u5220\u9664.","remove-specific-hours-confirmation":"\u4f60\u786e\u5b9a\u5220\u9664\u5c06\u53d1\u9001\u7684\u6307\u5b9a\u6570\u989d\u7684\u5e01\u65f6\u5417?","destinations-label":"\u76ee\u6807\u5730\u5740","destinations-help1":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01","destinations-help2":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01\u4ee5\u53ca\u5e01\u65f6","destination-tools-title":"\u76ee\u6807\u5730\u5740\u5de5\u5177","hours-allocation-check":"\u81ea\u52a8\u5206\u914d\u5e01\u65f6{{ coinHoursName }}","options-link":"\u9009\u9879","coin-hours-options-link":"\u5e01\u65f6\u9009\u9879","hours-share-factor-label":"\u5e01\u65f6\u5206\u53d1\u56e0\u5b50","hours-share-factor-help":"\u5206\u53d1\u56e0\u5b50\u503c(\u767e\u5206\u6bd4)\u8d8a\u9ad8\uff0c\u8d8a\u591a{{ coinHoursName }}\u5c06\u88ab\u53d1\u9001","close-hours-share-factor-alert":"\u91cd\u7f6e\u9009\u9879\uff0c\u4f60\u786e\u5b9a\u9700\u8981\u7ee7\u7eed\u5417","preview-button":"\u9884\u89c8","send-button":"\u53d1\u9001","show-button":"\u663e\u793a","simple-form-button":"\u7b80\u6613","advanced-form-button":"\u9ad8\u7ea7\u7684","select-wallet":"\u9009\u62e9\u94b1\u5305","saving-note-error":"\u4ea4\u6613\u5df2\u6210\u529f\u53d1\u9001\uff0c\u4f46\u662f\u65e5\u5fd7\u5b58\u50a8\u5931\u8d25","sent":"\u4ea4\u6613\u53d1\u9001\u6210\u529f","total-to-send":"\u603b\u5171:","invalid-address-error":"\u76ee\u6807\u5730\u5740\u65e0\u6548","one-invalid-address-error":"\u6709\u4e00\u4e2a\u76ee\u6807\u5730\u5740\u65e0\u6548","various-invalid-addresses-error":"\u90e8\u5206\u76ee\u6807\u5730\u5740\u65e0\u6548","all-addresses-invalid-error":"\u6240\u6709\u76ee\u6807\u5730\u5740\u5747\u65e0\u6548","invalid-addresses-error":"\u8bf7\u786e\u4fdd\u5730\u5740\u662f\u6709\u6548\u7684","address-error-info":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","invalid-value-error-info":"\u65e0\u6548\u503c","insufficient-funds-error-info":"\u5f53\u524d\u8f93\u5165\u503c\u8d85\u8fc7\u53ef\u7528\u4f59\u989d\u3002","sending-all-hours-with-coins-waning":"\u5982\u679c\u53d1\u9001\u6240\u6709\u5e01\uff0c\u5f53\u524d\u94b1\u5305\u4e2d\u6240\u6709\u5e01\u65f6\u5c06\u4f1a\u53d1\u9001\u6216\u9500\u6bc1\u3002\u5982\u679c\u4f60\u60f3\u4fdd\u7559\u5e01\u65f6\uff0c\u8bf7\u4e0d\u8981\u53d1\u9001\u6240\u6709\u5e01\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","advanced-sending-all-hours-with-coins-waning":"\u5982\u679c\u53d1\u9001\u6240\u6709\u5e01, \u5f53\u524d\u9009\u62e9\u6e90\u7684\u6240\u6709\u5e01\u65f6\u5c06\u4f1a\u88ab\u53d1\u9001\u6216\u6216\u9500\u6bc1. \u5982\u679c\u4f60\u60f3\u4fdd\u7559\u5e01\u65f6\uff0c\u8bf7\u4e0d\u8981\u53d1\u9001\u6240\u6709\u5e01\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","sending-all-hours-waning":"\u4f60\u9009\u62e9\u53d1\u9001\u6240\u6709\u5e01\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","high-hours-share-waning":"\u4f60\u7684\u9009\u62e9\u53ef\u80fd\u4f1a\u53d1\u9001\u94b1\u5305\u4e2d\u6240\u6709\u5e01\u65f6\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","advanced-high-hours-share-waning":"\u4f60\u7684\u9009\u62e9\u53ef\u80fd\u4f1a\u53d1\u9001\u9009\u62e9\u6e90\u4e2d\u7684\u6240\u6709\u5e01\u65f6\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","fill-with-link":{"title":"\u4f7f\u7528\u4ea4\u6613\u94fe\u63a5","link-info":"\u5728\u6b64\u8f93\u5165\u4ea4\u6613\u94fe\u63a5\u3002\u4ea4\u6613\u6570\u636e\u5c06\u4ece\u94fe\u63a5\u4e2d\u83b7\u53d6\u5e76\u586b\u5145\u5230\u8868\u5355\u3002","link-label":"\u4ea4\u6613\u94fe\u63a5","link-error-info":"\u8bf7\u8f93\u5165\u6709\u6548\u7684\u94fe\u63a5","process-button":"\u6267\u884c","invalid-link-error":"\u94fe\u63a5\u4e2d\u7684\u5185\u5bb9\u65e0\u6548","invalid-link-hours-error":"\u4ea4\u6613\u94fe\u63a5\u4e2d\u5305\u542b\u65e0\u6548\u7684\u5e01\u65f6\u6570","data-overwritten-alert":"\u90e8\u5206\u4e4b\u524d\u8f93\u5165\u7684\u6570\u636e\u5c06\u4f1a\u88ab\u8986\u5199\u3002\u4f60\u786e\u5b9a\u8981\u7ee7\u7eed\u5417?","confirmation":"\u8868\u5355\u5df2\u6839\u636e\u4ea4\u6613\u94fe\u63a5\u4e2d\u7684\u6570\u636e\u66f4\u65b0\u3002"},"known-node-errors":{"null-change-address-error":"\u65e0\u6cd5\u4f7f\u7528\u7a7a\u5730\u5740\u4f5c\u4e3a\u627e\u96f6\u5730\u5740\u3002\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","to-required-error":"\u4f60\u9700\u8981\u63d0\u4f9b\u4e00\u4e2a\u6709\u6548\u7684\u76ee\u6807\u5730\u5740\u7528\u4e8e\u53d1\u9001\u5e01\u3002\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","zero-coins-error":"\u65e0\u6cd5\u53d1\u90010\u4e2a\u5e01\u3002\u8bf7\u8f93\u5165\u6709\u6548\u503c","null-destination-error":"\u65e0\u6cd5\u4f7f\u7528\u7a7a\u5730\u5740\u4f5c\u4e3a\u76ee\u6807\u5730\u5740\u3002\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","duplicate-destination-error":"\u76ee\u6807\u5730\u5740\u91cd\u590d\u3002\u8bf7\u4e0d\u8981\u5728\u4e00\u4e2a\u4ea4\u6613\u4e2d\u53d1\u9001\u76f8\u540c\u6570\u503c\u7684\u5e01\u5230\u540c\u4e00\u76ee\u6807\u5730\u5740\u591a\u6b21","hours-in-automatic-mode-error":"\u81ea\u52a8\u5206\u53d1\u5e01\u65f6\u6a21\u5f0f\u65e0\u6cd5\u6307\u5b9a\u5177\u4f53\u5e01\u65f6\u3002\u8bf7\u91cd\u8bd5\u5176\u4ed6\u503c\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","hours-allocation-mode-needed-error":"\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\u672a\u6307\u5b9a\u3002\u8bf7\u8bbe\u7f6e\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","invalid-hours-allocation-mode-error":"\u65e0\u6548\u7684\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\u3002\u8bf7\u4f7f\u7528\u4e0d\u540c\u6a21\u5f0f\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","hours-allocation-mode-not-needed-error":"\u624b\u52a8\u5206\u53d1\u5e01\u65f6\u6a21\u5f0f\u65e0\u6cd5\u6307\u5b9a\u5e01\u65f6\u5206\u914d\u6a21\u5f0f\u3002\u8bf7\u4f7f\u7528\u5176\u4ed6\u503c\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","invalid-hours-mode-error":"\u65e0\u6548\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\u3002\u8bf7\u4f7f\u7528\u6709\u6548\u503c\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","share-factor-needed-error":"\u9700\u8981\u8bbe\u7f6e\u5e01\u65f6\u5206\u53d1\u56e0\u5b50\u3002\u8bf7\u8bbe\u7f6e\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","share-factor-not-needed-error":"\u5df2\u542f\u52a8\u624b\u52a8\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\uff0c\u5e01\u65f6\u5206\u53d1\u56e0\u5b50\u65e0\u6cd5\u8bbe\u7f6e\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","invalid-share-factor-error":"\u65e0\u6548\u7684\u5e01\u65f6\u5206\u53d1\u56e0\u5b50\u3002\u8bf7\u4f7f\u7528\u6b63\u786e\u7684\u503c\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","change-equal-to-destination-error":"\u4ea4\u6613\u65e0\u6cd5\u521b\u5efa\uff0c\u8bf7\u4e0d\u8981\u5728\u4e00\u4e2a\u4ea4\u6613\u4e2d\u53d1\u9001\u76f8\u540c\u6570\u503c\u7684\u5e01\u5230\u540c\u4e00\u76ee\u6807\u5730\u5740\u591a\u6b21","repeated-wallet":"\u6307\u5b9a\u79cd\u5b50\u7684\u94b1\u5305\u5df2\u5b58\u5728"},"bulk-send":{"title":"\u6279\u91cf\u53d1\u9001","indications":"\u5feb\u6377\u65b9\u5f0f\u53d1\u9001\u5230\u591a\u4e2a\u5730\u5740\uff0c\u5728\u4e00\u884c\u4e2d\u952e\u5165\u6bcf\u4e2a\u5730\u5740,\u5e01\u6570,\u5e01\u65f6(\u53ef\u9009)\uff0c\u5e76\u7528\u9017\u53f7\u9694\u5f00\u3002\u793a\u4f8b: \u5982\u679c\u4f60\u53d1\u900110\u4e2a\u5e01,5\u5e01\u65f6\u5230\\"xyz\\"\u5730\u5740\uff0c\u8bf7\u952e\u5165\\"xyz,10,5\\"; \u5982\u679c\u60f3\u81ea\u52a8\u8ba1\u7b97\u5e01\u65f6\uff0c\u53ef\u4ee5\u952e\u5165\\"xy,10\\"\u3002\u5c0f\u6570\u503c\u5fc5\u987b\u4ee5\u5c0f\u6570\u70b9\u9694\u5f00\u3002","data-error-info":"\u8bf7\u8f93\u5165\u503c","process-button":"\u5904\u7406","no-data-error":"\u65e0\u6570\u636e\u53ef\u5904\u7406","inconsistent-data-error":"\u5982\u679c\u4f60\u60f3\u8981\u53d1\u9001\u6307\u5b9a\u5e01\u65f6\u6570\uff0c\u6240\u6709\u5730\u5740\u5747\u9700\u6307\u5b9a\u5e01\u65f6\u3002","invalid-data-error":"\u952e\u5165\u6570\u636e\u683c\u5f0f\u8bef\u3002"}},"select-address":{"title":"\u9009\u62e9\u5730\u5740","no-addresses":"\u8be5\u94b1\u5305\u4e2d\u65e0\u786e\u8ba4\u7684\u5730\u5740\u3002"},"offline-transactions":{"loading-problem":"\u5c1d\u8bd5\u83b7\u53d6\u5fc5\u8981\u6570\u636e\u65f6\u5931\u8d25","wallet-error-info":"\u8bf7\u9009\u62e9\u4e00\u4e2a\u94b1\u5305\u3002","tx-error-info":"\u8bf7\u8f93\u5165\u6709\u6548\u7684\u4ea4\u6613\u6587\u672c\u3002","copy-tx":{"signed-title":"\u5df2\u7b7e\u540d\u7684\u4ea4\u6613","unsigned-title":"\u672a\u7b7e\u540d\u7684\u4ea4\u6613","text-unsigned":"\u8fd9\u662f\u4f7f\u7528\u4f60\u8f93\u5165\u7684\u6570\u636e\u521b\u5efa\u7684\u672a\u7b7e\u540d\u7684\u4ea4\u6613\u3002\u8bf7\u62f7\u8d1d\u5e76\u9009\u62e9\\"\u7b7e\u540d\u4ea4\u6613\\"\u9009\u9879\u5bf9\u5176\u8fdb\u884c\u7b7e\u540d","text-signed":"\u8fd9\u662f\u5df2\u7b7e\u540d\u7684\u4ea4\u6613\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\\"\u5e7f\u64ad\u4ea4\u6613\\"\u9009\u9879\u5c06\u5176\u53d1\u9001\u5230\u7f51\u7edc\u4e2d","input-label":"\u4ea4\u6613\u672c\u6587","copy-button":"\u62f7\u8d1d","reset-confirmation":"\u4f60\u662f\u5426\u8981\u6e05\u7406\u8868\u5355\uff0c\u4ee5\u4fbf\u5e76\u521b\u5efa\u65b0\u7684\u4ea4\u6613?","reset-done":"\u8868\u5355\u5df2\u6e05\u7406\u3002"},"sign-tx":{"title":"\u7b7e\u540d\u4ea4\u6613","text":"\u4f7f\u7528\u8be5\u8868\u5355\u5bf9\u4ea4\u6613\u7b7e\u540d\u3002\u4e3a\u4e86\u4f7f\u64cd\u4f5c\u6b63\u5e38\u8fdb\u884c\uff0c\u60a8\u5fc5\u987b\u9009\u62e9\u5305\u542b\u6240\u6709\u7528\u4e8e\u5728\u4ea4\u6613\u4e2d\u53d1\u9001\u5e01\u7684\u8f93\u5165/\u5730\u5740\u7684\u94b1\u5305\u3002","wallet-label":"\u94b1\u5305","select-wallet":"\u9009\u62e9\u94b1\u5305","input-label":"\u4ea4\u6613\u6587\u672c","sign-button":"\u7b7e\u540d","signed":"\u4ea4\u6613\u7b7e\u540d\u5b8c\u6210"},"broadcast-tx":{"title":"\u5e7f\u64ad\u4ea4\u6613","text":"\u4f7f\u7528\u8be5\u8868\u5355\u53d1\u9001\u5df2\u7b7e\u540d\u7684\u4ea4\u6613\u5230\u7f51\u7edc\u3002","input-label":"\u4ea4\u6613\u6587\u672c","send-button":"\u53d1\u9001","sent":"\u4ea4\u6613\u5df2\u53d1\u9001\u3002"}},"reset":{"title":"\u91cd\u7f6e\u5bc6\u7801","wallet-label":"\u94b1\u5305","seed-label":"\u94b1\u5305\u79cd\u5b50","seed-error-info":"\u8bf7\u8f93\u5165\u79cd\u5b50","password-label":"\u65b0\u5bc6\u7801 (\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u94b1\u5305\u52a0\u5bc6\uff0c\u8bf7\u5c06\u5bc6\u7801\u7559\u7a7a)","confirm-label":"\u786e\u8ba4\u65b0\u5bc6\u7801","confirm-error-info":"\u4e24\u4e2a\u5bc6\u7801\u5fc5\u987b\u5339\u914d\u3002","reset-button":"\u91cd\u7f6e","done":"\u5bc6\u7801\u5df2\u6210\u529f\u91cd\u7f6e\u3002"},"tx":{"transaction-title":"\u4ea4\u6613","confirm-transaction-title":"\u786e\u8ba4\u4ea4\u6613","from-small-label":"\u6765\u81ea","to-small-label":"\u5230","date-small-label":"\u65e5\u671f","status-small-label":"\u72b6\u6001","coins-small-label":"\u5e01","hours-small-label":"\u5e01\u65f6","id-small-label":"\u4ea4\u6613ID","note-small-label":"\u65e5\u5fd7","without-note":"\u65e0\u65e5\u5fd7","show-more-link":"\u5c55\u793a\u66f4\u591a","hours-moved":"\u5df2\u8f6c\u79fb","hours-sent":"\u5df2\u53d1\u9001","hours-received":"\u5df2\u63a5\u6536","hours-burned":"\u5df2\u71c3\u70e7","inputs-title":"\u8f93\u5165","outputs-title":"\u8f93\u51fa","confirmed-transaction":"\u5df2\u786e\u8ba4","pending-transaction":"\u5f85\u5904\u7406","current-rate-help":"\u6309\u5f53\u524d\u6c47\u7387\u8ba1\u7b97"},"edit-note":{"title":"\u7f16\u8f91\u65e5\u5fd7","change-button":"\u4fee\u6539"},"backup":{"title":"\u5907\u4efd\u94b1\u5305","wallet-directory":"\u94b1\u5305\u76ee\u5f55:","seed-warning":"\u5728\u7eb8\u4e0a\u5907\u4efd\u4f60\u7684\u79cd\u5b50\uff0c\u5e76\u4fdd\u5b58\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u53ea\u8981\u6709\u79cd\u5b50\uff0c\u4f60\u5c31\u53ef\u4ee5\u627e\u56de\u4f60\u7684\u5e01\u3002","desc":"\u4f7f\u7528\u4e0b\u8868\u4ece\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u5f97\u5230\u79cd\u5b50\u3002
\u4e3a\u4e86\u4ece\u672a\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u83b7\u5f97\u79cd\u5b50\uff0c\u6253\u5f00\u4e0a\u9762\u7684\u6587\u4ef6\u5939,\u5728\u6587\u672c\u7f16\u8f91\u5668\u4e2d\u6253\u5f00.wlt\u6587\u4ef6\u5e76\u6062\u590d\u79cd\u5b50\u3002","wallet-table-label":"\u94b1\u5305\u540d","filename-table-label":"\u6587\u4ef6\u540d","save-addresses-button":"\u4fdd\u5b58\u5730\u5740","show-seed-button":"\u663e\u793a\u79cd\u5b50","no-wallets":"\u6ca1\u6709\u94b1\u5305","unencrypted-info":"\u51fa\u4e8e\u5b89\u5168\u539f\u56e0\uff0c\u65e0\u6cd5\u663e\u793a\u672a\u52a0\u5bc6\u94b1\u5305\u7684\u79cd\u5b50\u3002\u8981\u83b7\u5f97\u79cd\u5b50\uff0c\u8bf7\u4f7f\u7528\u5bc6\u7801\u5bf9\u94b1\u5305\u8fdb\u884c\u52a0\u5bc6\uff0c\u6216\u6309\u7167\u672c\u9875\u9876\u90e8\u663e\u793a\u7684\u8bf4\u660e\u8fdb\u884c\u64cd\u4f5c\u3002","hw-wallet-info":"\u8981\u83b7\u53d6\u786c\u4ef6\u94b1\u5305\u7684\u79cd\u5b50\uff0c\u8bf7\u4f7f\u7528\u94b1\u5305\u9875\u9762\u5e95\u90e8\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u9009\u9879\u3002","not-compatible-error":"\u4f60\u7684\u7f51\u9875\u6d4f\u89c8\u5668\u4e0e\u6b64\u529f\u80fd\u4e0d\u517c\u5bb9\u3002","seed-modal-window":{"title":"\u94b1\u5305\u79cd\u5b50","seed-label":"\u79cd\u5b50"}},"blockchain":{"title":"\u533a\u5757\u94fe","blocks-label":"\u533a\u5757\u6570\u91cf","time-label":"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u65f6\u95f4\u6233","hash-label":"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u54c8\u5e0c\u503c","current-supply-label":"\u76ee\u524d{{ coinName }}\u4f9b\u5e94\u91cf","total-supply-label":"{{ coinName }}\u7684\u603b\u4f9b\u5e94\u91cf","current-coinhour-supply-label":"\u76ee\u524d{{ coinHoursName }}\u4f9b\u5e94\u91cf","total-coinhour-supply-label":"{{ coinHoursName }}\u603b\u4f9b\u5e94\u91cf"},"network":{"title":"\u7f51\u7edc","error-no-connections":"\u65e0\u8fde\u63a5","peer-small-table-label":"\u8282\u70b9","source-small-table-label":"\u8282\u70b9\u6765\u6e90","block-height-small-table-label":"\u533a\u5757\u9ad8\u5ea6","block-height-short-small-table-label":"\u533a\u5757","last-seen-small-table-label":"\u4e0a\u4e00\u6b21\u51fa\u73b0","last-received-help":"\u4e0a\u4e00\u6b21\u63a5\u6536","last-sent-help":"\u4e0a\u4e00\u6b21\u53d1\u9001","in-help":"\u8fdb\u6765\u7684","out-help":"\u51fa\u53bb\u7684","sources":{"default":"\u9ed8\u8ba4\u8282\u70b9","exchange":"\u4ea4\u6362\u8282\u70b9"}},"pending-txs":{"title":"\u5f85\u5904\u7406\u4ea4\u6613","timestamp-table-label":"\u65f6\u95f4\u6233","txid-table-label":"\u4ea4\u6613ID","none":"\u65e0\u5f85\u5904\u7406\u4ea4\u6613","my-transactions-button":"\u6211\u7684","all-transactions-button":"\u5168\u90e8"},"outputs":{"title":"\u4ea4\u6613\u8f93\u51fa","error-no-outputs":"\u65e0\u53ef\u7528\u4ea4\u6613\u8f93\u51fa"},"history":{"title-and-button":"\u5386\u53f2","tx-detail-title":"\u4ea4\u6613\u660e\u7ec6","moving":"\u5185\u90e8\u8f6c\u8d26\u4e2d","moved":"\u5df2\u5185\u90e8\u8f6c\u8d26","sending":"\u53d1\u9001\u4e2d","sent":"\u5df2\u53d1\u9001","received":"\u5df2\u63a5\u6536","receiving":"\u63a5\u6536\u4e2d","pending-indication":"\u5f85\u5904\u7406","transaction-note-small-label":"\u65e5\u5fd7:","no-txs":"\u4f60\u6ca1\u6709\u5386\u53f2\u4ea4\u6613","no-txs-filter":"\u6ca1\u6709\u4e0e\u5f53\u524d\u7b5b\u9009\u6761\u4ef6\u5339\u914d\u7684\u4ea4\u6613","no-filter":"\u672a\u7ecf\u7b5b\u9009 (\u70b9\u51fb\u9009\u62e9\u94b1\u5305/\u5730\u5740)","filter":"\u5df2\u7b5b\u9009: ","filters":"\u5df2\u7b5b\u9009: ","all-addresses":"\u6240\u6709\u5730\u5740","view-all":"\u67e5\u770b\u6240\u6709{{ number }}\u6761\u8bb0\u5f55"},"teller":{"done":"\u5b8c\u6210","waiting-confirm":"\u7b49\u5f85\u786e\u8ba4","waiting-deposit":"\u7b49\u5f85\u6bd4\u7279\u5e01\u5145\u503c","waiting-send":"\u7b49\u5f85\u53d1\u9001Skycoin","unknown":"\u672a\u77e5"},"confirmation":{"default-title":"\u786e\u8ba4","yes-button":"\u662f","no-button":"\u5426"},"service":{"api":{"no-internet-error":"\u4f60\u6ca1\u6709\u4e92\u8054\u7f51\u8fde\u63a5\u6216\u8282\u70b9\u5df2\u505c\u6b62\u5de5\u4f5c\u3002","incorrect-password-error":"\u5bc6\u7801\u9519\u8bef\u3002","unknown-error":"\u65e0\u6cd5\u6267\u884c\u5f53\u524d\u64cd\u4f5c\u3002","api-disabled-error":"API\u5df2\u7981\u7528\u3002"}},"force-skywallet-wipe":{"title":"\u5f3a\u5236\u6e05\u9664\u786c\u4ef6\u94b1\u5305","operation-warning":"\u8b66\u544a: \u6b64\u9009\u9879\u4ec5\u5728\u65e0\u6cd5\u5c06\u8bbe\u5907\u4e0e\u5e38\u89c4\u9009\u9879\u4e00\u8d77\u4f7f\u7528\u7684\u60c5\u51b5\u4e0b\u7528\u4f5c\u6700\u540e\u7684\u9009\u62e9\u3002 \u8bbe\u5907\u4e0a\u7684\u6240\u6709\u6570\u636e\u90fd\u5c06\u88ab\u5220\u9664\uff0c\u56e0\u6b64\u60a8\u5c06\u9700\u8981\u79cd\u5b50\u624d\u80fd\u6062\u590d\u8d44\u91d1\u3002","proceed-button":"\u6267\u884c"},"hardware-wallet":{"general":{"default-wallet-name":"\u65b0\u786c\u4ef6\u94b1\u5305","confirm":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u3002","confirm-and-more":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u5e76\u6309\u9075\u5faa\u6307\u793a\u3002","follow":"\u8bf7\u6309\u7167\u786c\u4ef6\u94b1\u5305\u4e0a\u663e\u793a\u7684\u8bf4\u660e\u8fdb\u884c\u64cd\u4f5c\u3002","completed":"\u64cd\u4f5c\u5b8c\u6210\u3002","name-updated":"\u7528\u4e8e\u5728\u94b1\u5305\u5217\u8868\u4e2d\u6807\u8bc6\u6b64\u786c\u4ef6\u94b1\u5305\u7684\u540d\u79f0\u5df2\u66f4\u65b0\uff0c\u4ee5\u5339\u914d\u8bbe\u5907\u4e0a\u663e\u793a\u7684\u540d\u79f0\u3002"},"errors":{"generic-error":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786e\u4fdd\u4f60\u5df2\u7ecf\u8fde\u63a5\u4e86\u4e00\u4e2a\u6709\u6548\u7684\u786c\u4ef6\u94b1\u5305\uff0c\u5e76\u4e14\u5b83\u6ca1\u6709\u5728\u7b49\u5f85\u8f93\u5165\u3002","disconnected":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786c\u4ef6\u94b1\u5305\u672a\u8fde\u63a5\u3002","incorrect-wallet":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u4e0e\u9884\u671f\u7684\u4e0d\u540c\u3002","incorrect-pin":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684PIN\u7801\u4e0d\u6b63\u786e\u3002","refused":"\u64cd\u4f5c\u5931\u8d25\u6216\u88ab\u53d6\u6d88\u3002","too-many-inputs-outputs":"\u4ea4\u6613\u4e2d\u786c\u4ef6\u94b1\u5305\u7684\u8f93\u5165\u6216\u8f93\u51fa\u8fc7\u591a\u3002\u8bf7\u5c1d\u8bd5\u521b\u5efa\u591a\u4e2a\u8f83\u5c0f\u7684\u4ea4\u6613\uff0c\u6bcf\u4e2a\u4ea4\u6613\u4fdd\u8bc1\u8f83\u5c0f\u6570\u91cf\u7684\u6536\u4ef6\u4eba.","daemon-connection":"\u8fde\u63a5\u5230\u786c\u4ef6\u94b1\u5305\u5b88\u62a4\u7a0b\u5e8f\u65f6\u51fa\u73b0\u95ee\u9898\uff0c\u8bf7\u786e\u4fdd\u5176\u6b63\u5728\u8fd0\u884c\uff0c\u7136\u540e\u91cd\u8bd5\u3002\u4f60\u53ef\u4ee5\u4ecewww.skycoin.com/downloads\u4e0b\u8f7d","daemon-connection-with-configurable-link":"\u8fde\u63a5\u5230\u786c\u4ef6\u94b1\u5305\u5b88\u62a4\u7a0b\u5e8f\u65f6\u51fa\u73b0\u95ee\u9898\uff0c\u8bf7\u786e\u4fdd\u5176\u6b63\u5728\u8fd0\u884c\uff0c\u7136\u540e\u91cd\u8bd5\u3002\u4e0b\u8f7d","timeout":"\u7531\u4e8e\u4e0d\u6d3b\u52a8\uff0c\u64cd\u4f5c\u88ab\u53d6\u6d88\u3002 \u8bf7\u518d\u8bd5\u4e00\u6b21\u3002","timeout-with-configurable-link":"\u7531\u4e8e\u4e0d\u6d3b\u52a8\uff0c\u64cd\u4f5c\u88ab\u53d6\u6d88\u3002 \u8bf7\u518d\u8bd5\u4e00\u6b21\u3002 \u5982\u679c\u6b64\u95ee\u9898\u5bfc\u81f4\u8bbe\u5907\u65e0\u6cd5\u4f7f\u7528\uff0c\u5219\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u9009\u9879\uff1a","invalid-address-generated":"\u5730\u5740\u751f\u6210\u5668\u5b58\u5728\u95ee\u9898\uff0c\u5fc5\u987b\u53d6\u6d88\u8be5\u64cd\u4f5c.","invalid-address":"\u65e0\u6548\u5730\u5740.","not-in-bootloader-mode":"\u4f7f\u7528\u8be5\u9009\u9879\uff0c\u786c\u4ef6\u94b1\u5305\u5fc5\u987b\u8fdb\u5165bootloader\u6a21\u5f0f."},"security-warning":{"title":"\u5b89\u5168\u8b66\u544a","text":"\u4e0a\u6b21\u8fde\u63a5\u6b64\u786c\u4ef6\u94b1\u5305\u65f6\uff0c\u53d1\u73b0\u4e00\u4e2a\u6216\u591a\u4e2a\u5b89\u5168\u8b66\u544a\u3002\u6211\u4eec\u5efa\u8bae\u4f60\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u9009\u9879(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u6309\u94ae)\u5e76\u4fdd\u6301\u8bbe\u5907\u5df2\u8fde\u63a5\uff0c\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u89e3\u51b3\u5b89\u5168\u95ee\u9898","link":"\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u9009\u9879\u7a97\u53e3."},"options":{"connecting":"\u8fde\u63a5...","disconnected":"\u6ca1\u6709\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8bf7\u8fde\u63a5\u786c\u4ef6\u94b1\u5305\u540e\u4f7f\u7528\u6b64\u9009\u9879\u3002","unconfigured-detected-title":"\u672a\u914d\u7f6e\u7684\u786c\u4ef6\u94b1\u5305","unconfigured-detected":"\u68c0\u6d4b\u5230\u65e0\u79cd\u5b50\u7684\u786c\u4ef6\u94b1\u5305\u3002\u9009\u62e9\\"\u81ea\u52a8\u914d\u7f6e\\"\u5982\u679c\u4f60\u60f3\u5c06\u5176\u914d\u7f6e\u4e3a\u5168\u65b0\u7684\u94b1\u5305\u5e76\u7acb\u5373\u5f00\u59cb\u4f7f\u7528\u5b83\uff0c\u6216\u9009\u62e9\\"\u6062\u590d\u5907\u4efd\\"\u5982\u679c\u4f60\u60f3\u4f7f\u7528\u5148\u524d\u521b\u5efa\u7684\u5907\u4efd\u79cd\u5b50\u5bf9\u5176\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u80fd\u591f\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u4ea7\u3002","configured-detected":"\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8be5\u8bbe\u5907\u5728\u94b1\u5305\u5217\u8868\u4e2d\u88ab\u8bc6\u522b\u4e3a:","security-warnings-title":"\u5b89\u5168\u8b66\u544a","security-warning-title":"\u5b89\u5168\u8b66\u544a","unchecked-version-warning":"\u65e0\u6cd5\u68c0\u6d4b\u786c\u4ef6\u94b1\u5305\u56fa\u4ef6\u662f\u5426\u6700\u65b0\u7248\u672c\u3002\u53ef\u80fd\u539f\u56e0\u662f\u7f51\u7edc\u5b58\u5728\u95ee\u9898\u6216\u8005\u670d\u52a1\u5904\u4e8e\u7ef4\u62a4\u72b6\u6001.","outdated-version-warning":"\u786c\u4ef6\u94b1\u5305\u56fa\u4ef6\u7248\u672c\u8fc7\u4f4e\u3002\u4e3a\u4e86\u94b1\u5305\u5b89\u5168\uff0c\u5efa\u8bae\u70b9\u51fb\\"\u66f4\u65b0\u56fa\u4ef6\\"\uff0c\u5c3d\u5feb\u5347\u7ea7","backup-warning":"\u4f60\u5e94\u8be5\u5907\u4efd\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\uff0c\u5426\u5219\u4e07\u4e00\u51fa\u73b0\u95ee\u9898\uff0c\u4f60\u53ef\u80fd\u5c06\u65e0\u6cd5\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\uff0c\u8981\u505a\u5230\u8fd9\u4e00\u70b9\u3002\u9009\u62e9\\"\u521b\u5efa\u4e00\u4e2a\u5907\u4efd\\"\u9009\u9879\u3002","pin-warning":"\u5f53\u524d\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u672a\u8bbe\u7f6e\u5bc6\u7801\u3002\u5bc6\u7801\u53ef\u4fdd\u62a4\u786c\u4ef6\u94b1\u5305\uff0c\u4ee5\u9632\u4e22\u5931\u3001\u76d7\u7a83\u548c\u9ed1\u5ba2\u5165\u4fb5\u3002\u8981\u521b\u5efa\u4e00\u4e2a\u5bc6\u7801\uff0c\u9009\u62e9\\"\u521b\u5efaPIN\u7801\\"\u9009\u9879\u3002","options":"\u9009\u9879:","update-firmware":"\u66f4\u65b0\u56fa\u4ef6","configure-automatically":"\u81ea\u52a8\u914d\u7f6e","restore-backup":"\u6062\u590d\u5907\u4efd","create-backup":"\u521b\u5efa\u5907\u4efd","wipe":"\u5220\u9664\u8bbe\u5907","confirm-seed":"\u786e\u8ba4\u79cd\u5b50","create-pin":"\u521b\u5efa\u5bc6\u7801","change-pin":"\u66f4\u6539\u5bc6\u7801","delete-pin":"\u5220\u9664\u5bc6\u7801","forgotten-pin-part1":"\u5982\u679c\u4f60\u56e0\u4e3a\u5fd8\u8bb0\u5bc6\u7801\u800c\u65e0\u6cd5\u8fdb\u5165\u94b1\u5305\uff0c\u4f60\u53ef\u4ee5\u5220\u9664\u786c\u4ef6\u94b1\u5305\uff0c\u7136\u540e\u901a\u8fc7\u79cd\u5b50","forgotten-pin-part2":"\u6062\u590d","firmware-version":"\u56fa\u4ef6\u7248\u672c:"},"update-firmware-warning":{"title":"\u56fa\u4ef6\u7248\u672c\u8fc7\u4f4e","text":"\u8b66\u544a: \u5f53\u524d\u786c\u4ef6\u94b1\u5305\u7684\u56fa\u4ef6\u7248\u672c\u8fc7\u4f4e\u3002\u4e3a\u4e86\u5b89\u5168\uff0c\u5efa\u8bae\u66f4\u65b0.","update":"\u66f4\u65b0"},"update-firmware":{"title-connecting":"\u8fde\u63a5\u4e2d...","title-update":"\u66f4\u65b0\u56fa\u4ef6","title-install":"\u5b89\u88c5\u56fa\u4ef6","text-downloading":"\u68c0\u6d4b\u8bbe\u5907\u5e76\u4e0b\u8f7d\u6587\u4ef6...","text-bootloader":"\u8b66\u544a: \u5982\u679c\u4f60\u5df2\u914d\u7f6e\u8fc7\u6539\u8bbe\u5907\uff0c\u7ee7\u7eed\u4e4b\u524d\uff0c\u8bf7\u52a1\u5fc5\u786e\u4fdd\u4f60\u5df2\u5c06\u79cd\u5b50\u5907\u4efd\uff0c\u5426\u5219\u4f60\u7684\u8d44\u4ea7\u53ef\u80fd\u4f1a\u6c38\u4e45\u4e22\u5931","text-not-bootloader":"\u66f4\u65b0\u786c\u4ef6\u94b1\u5305\uff0c\u8bf7\u4ee5bootloader\u6a21\u5f0f\u8fde\u63a5\u8bbe\u5907(\u6309\u4e0b\u8bbe\u5907\u7684\u4e24\u4e2a\u7269\u7406\u6309\u94ae\u7684\u540c\u4e8b\u5c06\u5176\u8fde\u63a5\u5230\u8ba1\u7b97\u673a)","text-no-firmware":"\u6b22\u8fce\u3002\u5f53\u524d\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u5c1a\u672a\u5b89\u88c5\u56fa\u4ef6\u3002\u73b0\u5728\u5c06\u5b89\u88c5\u56fa\u4ef6\uff0c\u4ee5\u4fbf\u4f60\u5f00\u59cb\u4f7f\u7528\u8be5\u8bbe\u5907\u3002\u6ce8\u610f: \u5982\u679c\u4f60\u5df2\u914d\u7f6e\u8fc7\u6539\u8bbe\u5907\u5e76\u60f3\u8981\u6062\u590d\u8d44\u4ea7\uff0c\u4f60\u9700\u8981\u79cd\u5b50.","follow":"\u66f4\u65b0\u56fa\u4ef6\u5df2\u53d1\u9001\u81f3\u786c\u4ef6\u94b1\u5305\u3002\u8bf7\u5728\u8bbe\u5907\u4e0a\u7ee7\u7eed.","connection-error":"\u65e0\u6cd5\u4e0b\u8f7d\u56fa\u4ef6\u3002\u53ef\u80fd\u662f\u7f51\u7edc\u8fde\u63a5\u95ee\u9898\u6216\u8005\u670d\u52a1\u5904\u4e8e\u7ef4\u62a4\u72b6\u6001.","timeout":"\u7531\u4e8e\u4e0d\u6d3b\u52a8\uff0c\u64cd\u4f5c\u88ab\u53d6\u6d88\u3002\u8bf7\u65ad\u5f00\u8bbe\u5907\u8fde\u63a5\uff0c\u5e76\u5728\u91cd\u65b0\u8fde\u63a5\u540e\u91cd\u8bd5.","finished":"\u8bbe\u5907\u914d\u7f6e\u6210\u529f\u3002\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u8bf7\u62d4\u9664\u8bbe\u5907."},"generate-seed":{"text":"\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u4f60\u53ef\u4ee5\u9009\u62e9\u751f\u6210\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002\u79cd\u5b50\u662f\u4e00\u4e2a\u5355\u8bcd\u5217\u8868\uff0c\u51fa\u73b0\u95ee\u9898\u540e\u53ef\u4ee5\u7528\u6765\u6062\u590d\u8bbf\u95ee\u4f60\u7684\u5e01\u3002\u6240\u6709\u9009\u9879\u90fd\u662f\u5b89\u5168\u7684\uff0c\u5982\u679c\u4f60\u6ca1\u6709\u7279\u6b8a\u539f\u56e0\u5fc5\u987b\u9009\u62e9\u67d0\u4e00\u9879\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u9ed8\u8ba4\u503c\u3002","configuring":"\u914d\u7f6e..."},"restore-seed":{"text":"\u5728\u7ee7\u7eed\u524d\uff0c\u8bf7\u9009\u62e9\u4f60\u60f3\u8981\u6062\u590d\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u91cf\u3002","check-text":"\u4f60\u53ef\u4ee5\u4f7f\u7528\u6b64\u9009\u9879\u8f93\u5165\u79cd\u5b50\uff0c\u5e76\u68c0\u67e5\u5b83\u662f\u5426\u4e0e\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4e00\u81f4\u3002\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u9009\u62e9\u4f60\u60f3\u8981\u68c0\u67e5\u7684\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002","warning":"\u8b66\u544a: \u4e3a\u4e86\u907f\u514d\u53ef\u80fd\u51fa\u73b0\u7684\u95ee\u9898\uff0c\u8bf7\u4ec5\u4f7f\u7528\u540c\u4e00\u54c1\u724c/\u578b\u53f7\u7684\u786c\u4ef6\u94b1\u5305\u521b\u5efa\u79cd\u5b50\u3002","error-wrong-word":"\u9519\u8bef: \u91cd\u65b0\u952e\u5165\u7684\u5355\u8bcd\u4e0e\u786c\u4ef6\u94b1\u5305\u6240\u8bf7\u6c42\u7684\u4e0d\u5339\u914d\u3002","error-invalid-seed":"\u9519\u8bef: \u79cd\u5b50\u65e0\u6548\u3002\u8bf7\u52a1\u5fc5\u6309\u6b63\u786e\u7684\u987a\u5e8f\u8f93\u5165\u6b63\u786e\u7684\u5355\u8bcd\u3002","error-wrong-seed":"\u9519\u8bef: \u79cd\u5b50\u662f\u6709\u6548\u7684\uff0c\u4f46\u4e0e\u8bbe\u5907\u4e2d\u7684\u79cd\u5b50\u4e0d\u5339\u914d\u3002","correct-seed":"\u79cd\u5b50\u6709\u6548\u5e76\u4e0e\u8bbe\u5907\u4e2d\u7684\u5339\u914d."},"added":{"title":"\u65b0\u786c\u4ef6\u94b1\u5305","configuring":"\u68c0\u6d4b\u5230\u65b0\u7684\u786c\u4ef6\u94b1\u5305\u3002\u914d\u7f6e...","done":"\u5df2\u5b8c\u6210","added1":"\u5df2\u8fde\u63a5\u7684\u786c\u4ef6\u7684\u94b1\u5305\u5df2\u7ecf\u7528\u5982\u4e0b\u540d\u5b57\u88ab\u6dfb\u52a0\u5230\u94b1\u5305\u5217\u8868:","added2":"\u73b0\u5728\u4f60\u53ef\u4ee5\u67e5\u770b\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4f59\u989d\u548c\u5730\u5740\u4e86\uff0c\u5373\u4f7f\u786c\u4ef6\u94b1\u5305\u5e76\u672a\u8fde\u63a5\u3002\u6b64\u5916\u5982\u679c\u4f60\u613f\u610f\uff0c\u4f60\u8fd8\u53ef\u4ee5\u66f4\u6539\u94b1\u5305\u540d\u79f0\u6216\u4ece\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u5220\u9664\u3002","added-error-info":"\u4f60\u5fc5\u987b\u586b\u5199\u4e00\u4e2a\u540d\u79f0.","characters-warning":"\u5982\u679c\u4f60\u4f7f\u7528\u975e\u6807\u51c6\u82f1\u8bed\u5b57\u7b26\uff0c\u5b83\u53ef\u80fd\u65e0\u6cd5\u6b63\u786e\u7684\u663e\u793a\u5728\u8bbe\u5907\u4e0a."},"wipe":{"warning":"\u8b66\u544a: \u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u6240\u6709\u6570\u636e\u5c06\u88ab\u5220\u9664\u3002\u5982\u679c\u6ca1\u6709\u5907\u4efd\uff0c\u4f60\u5c06\u65e0\u6cd5\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\u3002","confirm-delete-check":"\u8fd8\u662f\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u4e2d\u5220\u9664"},"create-backup":{"warning":"\u8b66\u544a: \u4f60\u53ea\u80fd\u4f7f\u7528\u6b64\u9009\u9879\u5907\u4efd\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\u4e00\u6b21\u3002\u5982\u679c\u4f60\u51b3\u5b9a\u7ee7\u7eed\uff0c\u4f60\u5c06\u4e0d\u5f97\u4e0d\u5199\u4e0b\u4e00\u7ec4\u5355\u8bcd(\u5efa\u8bae\u5199\u5728\u7eb8\u4e0a\uff0c\u800c\u4e0d\u662f\u7535\u8111\u4e0a)\uff0c\u8fd9\u4e9b\u5355\u8bcd\u5c06\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\uff0c\u5e76\u5c06\u5176\u5b58\u50a8\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u4efb\u4f55\u53ef\u4ee5\u8bbf\u95ee\u5355\u8bcd\u5217\u8868(\\"\u79cd\u5b50\\")\u7684\u4eba\u90fd\u53ef\u4ee5\u8bbf\u95ee\u94b1\u5305\u4f59\u989d\uff0c\u56e0\u6b64\u5efa\u8bae\u8bf7\u683c\u5916\u8c28\u614e\u3002","instructions":"\u5199\u4e0b\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u7684\u5355\u8bcd\u5217\u8868\u3002\u4e00\u5b9a\u8981\u6309\u987a\u5e8f\u5e76\u628a\u6bcf\u4e2a\u5355\u8bcd\u90fd\u5199\u5bf9\u3002"},"seed-word":{"title":"\u8f93\u5165\u5b57","enter-word":"\u8f93\u5165\u8bbe\u5907\u4e2d\u663e\u793a\u7684\u5b57","info":"\u4f60\u5c06\u88ab\u8981\u6c42\u4ee5\u968f\u673a\u7684\u987a\u5e8f\u8f93\u5165\u4f60\u5907\u4efd\u7684\u79cd\u5b50\uff0c\u52a0\u4e0a\u4e00\u4e9b\u989d\u5916\u7684\u5b57\u3002","word-label":"\u8981\u6c42\u7684\u5b57","error-invalid-word":"\u8f93\u5165\u5b57\u65e0\u6548\u3002","error-loading-words":"\u6b63\u5728\u52a0\u8f7d\u5b57\u5217\u8868\u3002\u8bf7\u7a0d\u7b49\u3002"},"change-pin":{"pin-mismatch":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684\u4e24\u4e2a\u5bc6\u7801\u4e0d\u5339\u914d"},"remove-pin":{"warning":"\u8b66\u544a: \u4e0d\u5efa\u8bae\u4ece\u786c\u4ef6\u94b1\u5305\u4e2d\u5220\u9664\u5bc6\u7801\uff0c\u56e0\u4e3a\u5b83\u5c06\u5f88\u5bb9\u6613\u88ab\u672a\u7ecf\u6388\u6743\u7684\u5404\u65b9\u4f7f\u7528\u3002"},"enter-pin":{"title":"\u8f93\u5165\u5bc6\u7801","title-change-current":"\u8f93\u5165\u5f53\u524d\u5bc6\u7801","title-change-new":"\u8f93\u5165\u65b0\u7684\u5bc6\u7801","title-change-confirm":"\u786e\u8ba4\u65b0\u7684\u5bc6\u7801","instructions-generic":" \u5bc6\u7801\u5df2\u663e\u793a\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\u3002","instructions-tx":"\u8fdb\u5165\u5bc6\u7801\u4ee5\u786e\u8ba4\u5e76\u7b7e\u7f72\u4ea4\u6613\u3002","instructions-change":"\u8bf7\u8f93\u5165\u4e00\u4e2a4\u52308\u4e2a\u6570\u5b57\u4e4b\u95f4\u7684\u96be\u4ee5\u88ab\u731c\u4e2d\u7684\u5bc6\u7801\u3002","help":"\u9700\u8981\u5e2e\u52a9\uff1f"},"pin-help":{"title":"\u5e2e\u52a9","part1":"\u5f53\u9700\u8981\u8f93\u5165\u5bc6\u7801\u624d\u80fd\u7ee7\u7eed\u65f6\uff0c\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4f1a\u663e\u793a\u4e00\u4e2a\u77e9\u9635\uff0c\u77e9\u9635\u75319\u4e2a\u968f\u673a\u6392\u5217\u7684\u5757\u7ec4\u6210(\u6bcf\u6b21\u987a\u5e8f\u90fd\u4f1a\u6539\u53d8)\uff0c\u4f60\u5c06\u88ab\u8981\u6c42\u5728\u8f6f\u4ef6\u94b1\u5305\u4e2d\u8f93\u5165\u5bc6\u7801\uff0c\u4f7f\u7528\u4e00\u4e2a\u77e9\u9635\uff0c\u6b64\u77e9\u9635\u5305\u542b9\u4e2a\u6309\u94ae\uff0c\u53ea\u663e\u793a\u7b26\u53f7#\u3002","part2":"\u8981\u8f93\u5165\u5bc6\u7801\uff0c\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u4ee5\u6570\u5b57\u77e9\u9635\u67e5\u770b\u5bc6\u7801\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u76f8\u5e94\u6309\u94ae\u3002\u4f8b\u5982\uff0c\u5982\u679c\u5bc6\u7801\u4e3a\\"23\\"\u4e14\u6570\u5b572\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u5de6\u4e0a\u89d2\uff0c\u6570\u5b573\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u6b63\u4e2d\u95f4\uff0c\u5219\u6309\u987a\u5e8f\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u5de6\u4e0a\u89d2\u548c\u4e2d\u95f4\u6309\u94ae\u3002","part3":"\u5982\u679c\u4f60\u613f\u610f\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528\u952e\u76d8\u4e0a\u7684\u5c0f\u952e\u76d8\u8f93\u5165\u5bc6\u7801\u3002\u4f46\u662f\uff0c\u5982\u4e4b\u524d\u793a\u4f8b\u6240\u793a\uff0c\u5982\u679c\u5bc6\u7801\u662f\\"23\\"\uff0c\u4f60\u4e0d\u80fd\u7b80\u5355\u5730\u7528\u5c0f\u952e\u76d8\u952e\u5165\\"23\\"\uff0c\u800c\u662f\u5fc5\u987b\u9009\u62e9\u70b9\u51fb\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a2\u548c3\u5bf9\u5e94\u4f4d\u7f6e\u7684\u503c\u3002"},"create-tx":{"title":"\u521b\u5efa\u4ea4\u6613","upper-text":"\u8bf7\u786e\u8ba4\u4ee5\u4e0b\u6570\u636e\u662f\u5426\u4e0e\u4f60\u8981\u53d1\u9001\u7684\u4ea4\u6613\u4ee5\u53ca\u786c\u4ef6\u94b1\u5305\u663e\u793a\u7684\u4ea4\u6613\u5b8c\u5168\u5339\u914d\uff0c\u7136\u540e\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c:","lower-text":"\u5982\u679c\u4efb\u4f55\u6570\u636e\u4e0e\u786c\u4ef6\u94b1\u5305\u663e\u793a\u7684\u5185\u5bb9\u6216\u60a8\u5e0c\u671b\u53d1\u9001\u7684\u4ea4\u6613\u4e0d\u7b26\uff0c\u8bf7\u53d6\u6d88\u786c\u4ef6\u94b1\u5305\u4e0a\u7684\u64cd\u4f5c.","separator-for-coins-and-hours":"\u548c","separator-to-destination":"\u81f3"},"confirm-address":{"title":"\u786e\u8ba4\u5730\u5740","instructions":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u786e\u8ba4\uff0c\u5982\u679c\u5730\u5740\u4e3a:","short-confirmation":"\u5730\u5740\u5df2\u786e\u8ba4","confirmation":"\u5730\u5740\u5df2\u786e\u8ba4\u3002\u4e3a\u4e86\u5b89\u5168\uff0c\u9009\u62e9 \\"\u786e\u8ba4\u5730\u5740\\" \u9009\u9879\u53ef\u4ee5\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u518d\u6b21\u663e\u793a\u5730\u5740\uff0c\u5728\u83dc\u5355\u4e2d\u53ef\u70b9\u51fb\u5730\u5740\u4f59\u989d\u53f3\u4fa7\u7684\u6309\u94ae\u663e\u793a\u3002"}},"time-from-now":{"few-seconds":"\u51e0\u79d2\u949f\u4e4b\u524d","minute":"\u4e00\u5206\u949f\u4e4b\u524d","minutes":"{{time}} \u5206\u949f\u4e4b\u524d","hour":"\u4e00\u5c0f\u65f6\u4e4b\u524d","hours":"{{time}} \u5c0f\u65f6\u4e4b\u524d","day":"\u4e00\u5929\u4e4b\u524d","days":"{{time}} \u5929\u4e4b\u524d"},"exchange":{"title-and-button":"\u4e70 {{ coinName }}","label-you-send":"\u4f60\u53d1\u9001","label-you-get":"\u4f60\u6536\u5230 (\u5927\u7ea6)","label-to-address":"\u5230 {{coin}} \u5730\u5740","label-price":"\u4ea4\u6613\u6c47\u7387","label-stimate-transaction-time":"\u4ea4\u6613\u65f6\u95f4","exchange-button":"\u4ea4\u6613","min-amount":"\u6700\u5c0f\u6570\u989d:","max-amount":"\u6700\u5927\u6570\u989d:","agree-part1":"\u6211\u540c\u610f","agree-part2":"\u4f7f\u7528\u6761\u6b3e","agree-part3":"\u548c","agree-part4":"\u9690\u79c1\u653f\u7b56","powered-by":"\u6280\u672f\u652f\u6301","need-help":"\u9700\u8981\u5e2e\u52a9?","support-portal":"\u5e2e\u52a9\u5165\u53e3","history":"\u8ba2\u5355\u5386\u53f2","order-not-found":"\u8ba2\u5355\u672a\u627e\u5230","label-status":"\u72b6\u6001","exchanging":"{{from}}\u4ea4\u6613{{to}}","destination-select-from-list-link":"\u9009\u62e9","unavailable":"\u7f51\u9875\u7248\u672c\u6682\u4e0d\u63d0\u4f9b\u4ea4\u6613\u670d\u52a1","offline":"\u4ea4\u6613\u6682\u65f6\u4e0b\u7ebf","problem-connecting":"\u672a\u80fd\u8fde\u63a5\u5230\u670d\u52a1\u5668\u3002\u8bf7\u68c0\u67e5\u4f60\u7684\u7f51\u7edc\u8fde\u63a5\u5e76\u7a0d\u540e\u518d\u8bd5\u3002","invalid-address-error":"\u65e0\u6548\u5730\u5740.","from-coin-error-info":"\u8bf7\u9009\u62e9\u5e01","invalid-value-error-info":"\u65e0\u6548\u7684\u503c.","address-error-info":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740.","statuses":{"user-waiting":"\u7b49\u5f85\u5145\u503c\u3002\u8bf7\u5c06{{amount}} {{from}}\u53d1\u9001\u5230\u4e0b\u9762\u663e\u793a\u7684\u4ea4\u6613\u5730\u5740","user-waiting-info":"\u7cfb\u7edf\u6b63\u5728\u7b49\u5f85\u4f60\u5145\u503c\u5230\u4ea4\u6613\u5730\u5740\u3002\u4ea4\u6613\u5c06\u5728\u7cfb\u7edf\u68c0\u6d4b\u5230\u4f60\u7684\u5145\u503c\u5e76\u5728\u533a\u5757\u94fe\u4e2d\u786e\u8ba4\u540e\u5f00\u59cb\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u5145\u503c\uff0c\u5e94\u8be5\u5f88\u5feb\u5c31\u4f1a\u68c0\u6d4b\u5230\u3002","market-waiting-confirmations":"\u7b49\u5f85\u94fe\u4e0a\u4ea4\u6613\u786e\u8ba4","market-waiting-confirmations-info":"\u5df2\u7ecf\u68c0\u6d4b\u5230\u5145\u503c\uff0c\u7b49\u5f85\u533a\u5757\u94fe\u4e2d\u88ab\u786e\u8ba4\u3002","market-confirmed":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u63a5\u53d7","market-confirmed-info":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u7ecf\u5728\u533a\u5757\u94fe\u4e0a\u786e\u8ba4\u3002\u51c6\u5907\u9a6c\u4e0a\u6267\u884c\u5151\u6362\u3002","market-exchanged":"\u5b8c\u6210{{from}}\u5230{{to}}\u7684\u5151\u6362","market-exchanged-info":"\u5151\u6362\u5df2\u7ecf\u5b8c\u6210\u3002\u8d44\u91d1\u5c06\u5f88\u5feb\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740\u3002","market-withdraw-waiting":"\u6b63\u5728\u53d1\u9001{{to}}\u5230\u4f60\u7684\u5730\u5740","market-withdraw-waiting-info":"\u53d1\u9001{{to}}\u5230\u4f60\u5730\u5740\u7684\u8fdb\u7a0b\u5df2\u542f\u52a8","complete":"\u4ea4\u6613\u5df2\u5b8c\u6210!","complete-info":"\u8d44\u91d1\u5df2\u7ecf\u6210\u529f\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740.","error":"\u53d1\u751f\u9519\u8bef","error-info":"\u8fd0\u8f6c\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u4f60\u53ef\u4ee5\u5728\u4e0b\u9762\u627e\u5230\u66f4\u591a\u4fe1\u606f\u3002\u5982\u679c\u4f60\u9700\u8981\u5e2e\u52a9\uff0c\u8bf7\u4fdd\u5b58\u4e0b\u9762\u663e\u793a\u7684\u6240\u6709\u6570\u636e\u5e76\u4f7f\u7528\u9875\u9762\u53f3\u4e0b\u89d2\u7684\u5e2e\u52a9\u94fe\u63a5\u6765\u8054\u7cfb\u6280\u672f\u652f\u6301.","user-deposit-timeout":"\u7531\u4e8e\u65e0\u6d3b\u52a8\uff0c\u8ba2\u5355\u88ab\u53d6\u6d88.","user-deposit-timeout-info":"\u7cfb\u7edf\u672a\u68c0\u6d4b\u5230\u5145\u503c\uff0c\u8ba2\u5355\u5df2\u53d6\u6d88\uff0c\u8bf7\u91cd\u65b0\u4e0b\u5355\u3002\u5982\u679c\u9700\u8981\u5e2e\u52a9\uff0c\u8bf7\u4fdd\u5b58\u4e0b\u9762\u663e\u793a\u7684\u6240\u6709\u64cd\u4f5c\u6570\u636e\uff0c\u5e76\u4f7f\u7528\u672c\u9875\u53f3\u4e0b\u65b9\u7684\u94fe\u63a5\u4e0e\u6280\u672f\u652f\u6301\u8054\u7cfb."},"history-window":{"title":"\u8ba2\u5355\u5386\u53f2","address":"\u5730\u5740:","date":"\u65e5\u671f:"},"details":{"exchange-addr-label":"\u4ea4\u6613\u5730\u5740","exchange-addr-tag-label":"\u652f\u4ed8ID\u6216\u4ea4\u6613\u5fc5\u987b\u7528\u5230\u7684\u76ee\u6807\u6807\u7b7e","tx-id-label":"\u4ea4\u6613ID","order-id-label":"\u8ba2\u5355ID","initial-price-label":"\u521d\u59cb\u6c47\u7387","error-msg-label":"\u9519\u8bef\u4fe1\u606f ","details-link":"\u8be6\u60c5","start-date-label":"\u5f00\u59cb\u65e5\u671f","back-alert":"\u64cd\u4f5c\u6b63\u5728\u6267\u884c\u3002\u4f60\u771f\u7684\u60f3\u8981\u8fd4\u56de\u5230\u8868\u683c\u5417\uff1f\u4f60\u53ef\u4ee5\u901a\u8fc7\u70b9\u51fb\\"\u8ba2\u5355\u5386\u53f2\\"\u518d\u6b21\u770b\u5230\u6267\u884c\u8fc7\u7a0b"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.63460ae96b986f20f8dc.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.63460ae96b986f20f8dc.js new file mode 100644 index 0000000000..9c334e6617 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.63460ae96b986f20f8dc.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{"+dwz":function(e){e.exports=JSON.parse('{"common":{"usd":"\u7f8e\u5143","loading":"\u52a0\u8f7d\u4e2d...","done-title":"\u5b8c\u6210","warning-title":"\u8b66\u544a","error-title":"\u9519\u8bef","changes-made":"\u4fee\u6539\u5df2\u5b8c\u6210","back-button":"\u540e\u9000","create-button":"\u521b\u5efa","load-button":"\u52a0\u8f7d","cancel-button":"\u53d6\u6d88","continue-button":"\u7ee7\u7eed","close-button":"\u5173\u95ed","generic-confirmation-check":"\u6211\u5df2\u4e86\u89e3\u98ce\u9669\uff0c\u8bf7\u7ee7\u7eed","copied":"\u6587\u672c\u5df2\u590d\u5236\u5230\u526a\u8d34\u677f"},"errors":{"window-size":"\u7a97\u53e3\u592a\u7a84\uff0c\u5185\u5bb9\u653e\u4e0d\u4e0b"},"language":{"title":"\u9009\u62e9\u8bed\u8a00"},"header":{"syncing-blocks":"\u533a\u5757\u540c\u6b65\u4e2d","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"\u94b1\u5305\u66f4\u65b0","update-part2":"\u672a\u4f7f\u7528","update-part3":"\u53ef\u83b7\u53d6","synchronizing":"\u94b1\u5305\u6b63\u5728\u540c\u6b65\u3002\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002","pending-txs-part1":"\u8fd9\u91cc\u6709\u4e00\u4e9b","pending-txs-part2":"\u5f85\u5904\u7406\u4ea4\u6613\u3002","pending-txs-part3":"\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002","no-connections":"\u6ca1\u6709\u8fde\u63a5\uff0c\u4f60\u7684\u5ba2\u6237\u7aef\u6ca1\u6709\u8fde\u63a5\u5230\u4efb\u4f55\u5176\u4ed6\u8282\u70b9","no-backend-part1":"\u4e0d\u80fd\u5230\u8fbe\u540e\u7aef\u3002\u8bf7\u91cd\u65b0\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\u6216\u5bfb\u6c42\u6211\u4eec\u7684\u5e2e\u52a9","no-backend-part2":"Telegram","no-backend-part3":"","csrf":"\u5b89\u5168\u6f0f\u6d1e: CSRF\u672a\u5de5\u4f5c\uff0c\u8bf7\u7acb\u5373\u9000\u51fa\u3002"}},"password":{"title":"\u8f93\u5165\u5bc6\u7801","password-label":"\u5bc6\u7801","password-error-info":"\u8bf7\u8f93\u5165\u5bc6\u7801","confirm-password-label":"\u786e\u8ba4\u5bc6\u7801","confirm-error-info":"\u4e24\u6b21\u5bc6\u7801\u5fc5\u987b\u5339\u914d","proceed-button":"\u7ee7\u7eed","reset-link":"\u6211\u5fd8\u8bb0\u4e86\u5bc6\u7801","incorrect-password-error":"\u5bc6\u7801\u4e0d\u6b63\u786e\u3002","decrypting-error":"\u94b1\u5305\u89e3\u5bc6\u5931\u8d25\u3002"},"buy":{"title-and-button":"\u8d2d\u4e70","deposit-address":"\u9009\u62e9\u4e00\u4e2a\u5730\u5740\u6765\u751f\u6210BTC\u5145\u503c\u94fe\u63a5\uff0c\u7528\u4e8e:","select-address":"\u9009\u62e9\u5730\u5740","generate":"\u751f\u6210","deposit-location":"\u5145\u503c\u4f4d\u7f6e","deposit-location-desc":"\u9009\u62e9\u4e00\u4e2a\u94b1\u5305\uff0c\u4ee5\u5728\u6211\u4eec\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\u5145\u503cSkycoin\u5230\u8be5\u94b1\u5305","make-choice":"\u505a\u9009\u62e9","wallets-desc":"\u6bcf\u5f53\u9009\u62e9\u4e00\u4e2a\u65b0\u7684\u94b1\u5305\u548c\u5730\u5740\uff0c\u4e00\u4e2a\u65b0\u7684BTC\u5730\u5740\u5c06\u4f1a\u751f\u6210\u3002\u4e00\u4e2a\u72ec\u7acb\u7684Skycoin\u5730\u5740\u6700\u591a\u53ef\u7ed1\u5b9a5\u4e2aBTC\u5730\u5740\u3002","send":"\u53d1\u9001Bitcoin","send-desc":"\u53d1\u9001Bitcoin\u81f3\u5982\u4e0b\u5730\u5740\u3002\u4e00\u65e6\u6536\u5230\uff0c\u6211\u4eec\u5c06\u4f1a\u6309\u5f53\u524d\u6c47\u7387: {{ rate }} SKY/BTC\u5145\u503cSkycoin\u5230\u9009\u4e2d\u94b1\u5305\u7684\u4e00\u4e2a\u65b0\u5730\u5740\u3002","fraction-warning":"\u8bf7\u6309SKY/BTC\u6c47\u7387\u7684\u500d\u6570\u53d1\u9001BTC! Skycoin\u662f\u4ee5\u6574\u6570\u53d1\u9001; SKY\u7684\u5c0f\u6570\u4f4d\u5c06\u4e0d\u4f1a\u53d1\u9001","receive":"\u63a5\u6536Sky","receive-desc":"\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\uff0c\u6211\u4eec\u5c06\u53d1\u9001Skycoin\u7ed9\u4f60\u3002\u4f60\u53ef\u80fd\u9700\u898120\u5206\u949f\u5230\u4e00\u4e2a\u5c0f\u65f6\u624d\u80fd\u6536\u5230\u8fd9\u4e9bSKY\u3002","status-button":"\u72b6\u6001:","check-status-button":"\u67e5\u770b\u72b6\u6001","new-order-button":"\u65b0\u8ba2\u5355"},"wizard":{"create-title":"\u521b\u5efa\u94b1\u5305","create-desc":"\u5982\u679c\u4f60\u6ca1\u6709{{ coinName }}\u94b1\u5305\uff0c\u8bf7\u4f7f\u7528\u751f\u6210\u7684\u79cd\u5b50\u6765\u521b\u5efa\u4e00\u4e2a\u65b0\u94b1\u5305\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u6709\u4e00\u4e2a\u94b1\u5305\uff0c\u5207\u6362\u5230\\"\u52a0\u8f7d\u94b1\u5305\\"\u5e76\u8f93\u5165\u4f60\u7684\u79cd\u5b50\u3002","encrypt-title":"\u52a0\u5bc6\u94b1\u5305","encrypt-desc":"\u901a\u8fc7\u52a0\u5bc6\u6765\u589e\u52a0\u94b1\u5305\u7684\u5b89\u5168\u6027\u3002\u8f93\u5165\u5bc6\u7801\u540e\uff0c\u4f60\u7684\u94b1\u5305\u4f1a\u88ab\u52a0\u5bc6\u3002\u53ea\u6709\u8f93\u5165\u5bc6\u7801\u624d\u53ef\u4ee5\u8bbf\u95ee\u7684\u94b1\u5305\u6216\u79fb\u52a8\u8d44\u91d1\u3002","hardware-wallet-link":"\u4f7f\u7528\u786c\u4ef6\u94b1\u5305\uff1f","new-button":"\u65b0\u5efa","load-button":"\u52a0\u8f7d","finish-button":"\u5b8c\u6210","confirm":{"title":"\u4fdd\u62a4\u4f60\u7684\u79cd\u5b50!","desc":"\u8bf7\u786e\u4fdd\u4f60\u5df2\u7ecf\u5199\u4e0b\u4f60\u7684\u79cd\u5b50\u5e76\u5c06\u5b83\u50a8\u5b58\u5728\u4e86\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u6062\u590d\u4f60\u7684Skycoin\u94b1\u5305","checkbox":"\u5b83\u5f88\u5b89\u5168\uff0c\u6211\u53d1\u8a93\u3002"}},"wallet":{"title-and-button":"\u94b1\u5305","show-empty-button":"\u663e\u793a\u7a7a\u5730\u5740","hide-empty-button":"\u9690\u85cf\u7a7a\u5730\u5740","encrypt-button":"\u52a0\u5bc6\u94b1\u5305","decrypt-button":"\u89e3\u5bc6\u94b1\u5305","decrypt-warning":"\u8b66\u544a: \u51fa\u4e8e\u5b89\u5168\u8003\u8651\uff0c\u5efa\u8bae\u5c06\u94b1\u5305\u52a0\u5bc6\u3002\u5efa\u8bae\u8c28\u614e\u4e00\u70b9\u3002","delete-button":"\u5220\u9664\u94b1\u5305","edit-button":"\u7f16\u8f91\u94b1\u5305","add-button":"\u6dfb\u52a0\u94b1\u5305","load-button":"\u52a0\u8f7d\u94b1\u5305","hardware-wallet-button":"\u786c\u4ef6\u94b1\u5305","encryption-enabled":"\u52a0\u5bc6\u5df2\u542f\u7528","encryption-disabled":"\u52a0\u5bc6\u5df2\u7981\u7528","warning-hw-security":"\u53ef\u80fd\u7684\u5b89\u5168\u98ce\u9669\u3002\u5f53\u786c\u4ef6\u8bbe\u5907\u5df2\u8fde\u63a5\u65f6(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u6309\u94ae)\u8bbf\u95ee\u786c\u4ef6\u94b1\u5305\u9009\u9879\u4ee5\u83b7\u53d6\u66f4\u591a\u4fe1\u606f","wallet-table-label":"\u94b1\u5305","hardware-wallet-table-label":"\u786c\u4ef6\u94b1\u5305","delete-confirmation":"\u8b66\u544a: \u94b1\u5305\\"{{ name }}\\"\u5c06\u4ece\u5217\u8868\u4e2d\u5220\u9664\u3002\u82e5\u60f3\u91cd\u65b0\u6dfb\u52a0\uff0c\u9700\u91cd\u65b0\u8fde\u63a5\u8bbe\u5907\u5e76\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u7684\u9009\u9879\u5217\u8868(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u6309\u94ae)\u3002\u4f60\u60f3\u7ee7\u7eed\u5417\uff1f","delete-confirmation-check":"\u662f\u7684\uff0c\u6211\u60f3\u8981\u5220\u9664\u94b1\u5305\u3002","max-hardware-wallets-error":"\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u91cc\u7684\u5730\u5740\u5df2\u7ecf\u8fbe\u5230\u5141\u8bb8\u7684\u6700\u5927\u503c\u3002","add-many-confirmation":"\u8b66\u544a: \u5982\u679c\u4f60\u5728\u4e0d\u4f7f\u7528\u524d\u4e00\u4e2a\u5730\u5740\u7684\u60c5\u51b5\u4e0b\u6dfb\u52a0\u592a\u591a\u5730\u5740\uff0c\u6216\u8005\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662f\u6700\u540e\u4e00\u4e2a\u5730\u5740\u800c\u4e0d\u662f\u7b2c\u4e00\u4e2a\u5730\u5740\uff0c\u90a3\u4e48\u5982\u679c\u4f60\u5c1d\u8bd5\u4f7f\u7528\u79cd\u5b50\u6062\u590d\u94b1\u5305\uff0c\u6709\u4e9b\u5730\u5740\u5c06\u53ef\u80fd\u65e0\u6cd5\u81ea\u52a8\u6062\u590d\uff08\u4f60\u5fc5\u987b\u624b\u52a8\u6dfb\u52a0\u5b83\u4eec\uff09\u3002 \u4f60\u60f3\u7ee7\u7eed\u5417\uff1f","new":{"create-title":"\u521b\u5efa\u94b1\u5305","load-title":"\u52a0\u8f7d\u94b1\u5305","name-label":"\u540d\u79f0","name-error-info":"\u8bf7\u8f93\u5165\u94b1\u5305\u540d","words-number-label":"\u79cd\u5b50\u6709\u591a\u5c11\u5b57","seed-label":"\u79cd\u5b50","seed-error-info":"\u8bf7\u8f93\u5165\u79cd\u5b50","confirm-seed-label":"\u786e\u8ba4\u79cd\u5b50","confirm-seed-error-info":"\u79cd\u5b50\u4e0d\u5339\u914d","seed-warning":"\u8bb0\u4f4f\u79cd\u5b50! \u628a\u5b83\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002 \u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u4f60\u7684\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u627e\u56de\u4f60\u7684\u94b1\u5305!","12-words":"12\u5b57","24-words":"24\u5b57","generate-12-help":"\u751f\u621012\u5b57\u79cd\u5b50","generate-24-help":"\u751f\u621024\u5b57\u79cd\u5b50","encrypt-check":"\u52a0\u5bc6\u94b1\u5305","encrypt-warning":"\u6211\u4eec\u5efa\u8bae\u4f60\u4e3a\u6bcf\u4e2a\u94b1\u5305\u8bbe\u7f6e\u4e00\u4e2a\u72ec\u7acb\u7684\u5bc6\u7801\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u5bc6\u7801\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u79cd\u5b50\u91cd\u7f6e\u94b1\u5305\u3002\u5728\u52a0\u5bc6\u4f60\u7684\u94b1\u5305\u4e4b\u524d\uff0c\u786e\u4fdd\u4f60\u7684\u79cd\u5b50\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002","seed-checking-error":"\u65e0\u6cd5\u9a8c\u8bc1\u79cd\u5b50\u7684\u6548\u6027","unconventional-seed-title":"\u53ef\u80fd\u9519\u8bef","unconventional-seed-text":"\u4f60\u5f15\u8fdb\u4e86\u4e00\u79cd\u975e\u4f20\u7edf\u7684\u79cd\u5b50\u3002\u5982\u679c\u4f60\u51fa\u4e8e\u4efb\u4f55\u7279\u6b8a\u539f\u56e0\u8fd9\u6837\u505a\uff0c\u4f60\u53ef\u4ee5\u7ee7\u7eed(\u53ea\u63a8\u8350\u9ad8\u7ea7\u7528\u6237)\u3002\u4f46\u662f\uff0c\u5982\u679c\u4f60\u6253\u7b97\u4f7f\u7528\u666e\u901a\u7684\u7cfb\u7edf\u79cd\u5b50\uff0c\u5219\u5fc5\u987b\u5220\u9664\u6240\u6709\u9644\u52a0\u6587\u672c\u548c\u7279\u6b8a\u5b57\u7b26\u3002","unconventional-seed-check":"\u7ee7\u7eed\u4f7f\u7528\u975e\u4f20\u7edf\u79cd\u5b50\u3002","synchronizing-warning-text":"\u94b1\u5305\u6b63\u5728\u540c\u6b65\u4e2d\uff0c\u5f53\u524d\u64cd\u4f5c\u65e0\u6cd5\u53ef\u80fd\u65e0\u6cd5\u6062\u590d\u6240\u6709\u5730\u5740\u3002\u5982\u6709\u672a\u6062\u590d\u5730\u5740\uff0c\u8bf7\u540c\u6b65\u5b8c\u6210\u540e\u4f7f\u7528\\"\u626b\u63cf\u5730\u5740\\"\u529f\u80fd\u6216\u624b\u52a8\u91cd\u65b0\u6dfb\u52a0","wallet-created":"\u94b1\u5305\u5df2\u6dfb\u52a0\u5230\u5217\u8868","seed":{"enter-seed":"\u70b9\u51fb\u6b64\u5904\u8f93\u5165\u79cd\u5b50","change-seed":"\u70b9\u51fb\u4fee\u6539","confirm-seed":"\u70b9\u51fb\u6b64\u5904\u786e\u8ba4\u79cd\u5b50","confirmed-seed":"\u79cd\u5b50\u5df2\u786e\u8ba4","use-custom":"\u624b\u52a8\u8f93\u5165\u79cd\u5b50","use-normal":"\u4f7f\u7528\u63a8\u8350\u65b9\u5f0f\u8f93\u5165\u79cd\u5b50","custom-seed-warning-text":"\u4ec5\u5efa\u8bae\u9ad8\u7ea7\u7528\u6237\u4f7f\u7528\u3002\u4e00\u65e6\u8f93\u5165\u79cd\u5b50\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u5931\u8bef\uff0c\u4f60\u6709\u53ef\u80fd\u4f1a\u6c38\u4e45\u5931\u53bb\u8d44\u4ea7","custom-seed-warning-text-recovering":"\u4e3a\u907f\u514d\u51fa\u73b0\u95ee\u9898\uff0c\u8be5\u9009\u9879\u8bf7\u4ec5\u7528\u4e8e\u6062\u590d\u975e\u4f20\u7edf\u79cd\u5b50","incorrect-word-error":"\u8f93\u5165\u7684\u5b57\u4e0d\u5339\u914d\u3002","invalid-seed-error":"\u8f93\u5165\u7684\u79cd\u5b50\u65e0\u6548\uff0c\u8bf7\u91cd\u8bd5\u3002","enter-word":"\u8f93\u5165\u7b2c#{{number}}\u4e2a\u5b57","word-error-info":"\u8bf7\u8f93\u5165\u5b57","new-seed-info":"\u8bf7\u8f93\u5165\u7cfb\u7edf\u751f\u6210\u7684\u79cd\u5b50\u4ee5\u786e\u8ba4","recover-seed-info":"\u8bf7\u786e\u8ba4\u6309\u6b63\u786e\u7684\u987a\u5e8f\u8f93\u5165\u79cd\u5b50"}},"rename":{"title":"\u91cd\u547d\u540d\u94b1\u5305","name-label":"\u547d\u540d","label-error-info":"\u8bf7\u8f93\u5165\u94b1\u5305\u540d","rename-button":"\u91cd\u547d\u540d"},"address-options":{"title":"\u5730\u5740","new":"\u65b0\u5efa\u5730\u5740","scan":"\u626b\u63cf\u5730\u5740","scan-help":"\u4f7f\u7528\u8be5\u9009\u9879\u626b\u63cf\u94b1\u5305\u4e2d\u4f7f\u7528\u8fc7\u4f46\u672a\u52a0\u8f7d\u51fa\u7684\u5730\u5740"},"scan-addresses":{"done-with-new-addresses":"\u94b1\u5305\u5730\u5740\u5df2\u66f4\u65b0\u3002","done-without-new-addresses":"\u672a\u53d1\u73b0\u65b0\u5730\u5740\u3002"},"add-addresses":{"title":"\u9009\u62e9\u6570\u91cf","quantity-label":"\u521b\u5efa\u591a\u5c11\u5730\u5740","quantity-error-info":"\u8bf7\u8f93\u5165\u6570\u503c\u57281\u5230100\u4e4b\u95f4","error":"\u51fa\u73b0\u5f02\u5e38\u9519\u8bef\uff0c\u8bf7\u91cd\u8bd5\u3002"},"address":{"show":"\u70b9\u51fb\u663e\u793a","copy":"\u590d\u5236","copy-address":"\u590d\u5236\u5730\u5740","copied":"\u5df2\u590d\u5236!","confirm":"\u786e\u8ba4\u5730\u5740","outputs":"\u672a\u4ea4\u6613\u8f93\u51fa","history":"\u5386\u53f2"}},"qr":{"title":"\u4e8c\u7ef4\u7801","data-label":"QR \u6570\u636e","address-label":"\u5730\u5740","request-link":"\u8bf7\u6c42\u6307\u5b9a\u91d1\u989d","amount-label":"\u8bf7\u6c42\u7684\u91d1\u989d","hours-label":"\u8bf7\u6c42\u7684\u5e01\u65f6","message-label":"\u6d88\u606f","invalid":"(\u65e0\u6548\u503c)"},"send":{"title-and-button":"\u53d1\u9001","unsigned-button":"\u65e0\u7b7e\u540d","signed-button":"\u7b7e\u540d","unsigned-confirmation":"\u65e0\u7b7e\u540dTransactions\u9009\u9879\u65e0\u53d1\u9001\u529f\u80fd\uff0c\u5904\u4e8e\u5b89\u5168\u8003\u8651\uff0c\u53ef\u4ee5\u4f7f\u7528\u8be5\u9009\u9879\u521b\u5efa\u65e0\u7b7e\u540d\u7684Transactions\uff0c\u5e76\u5728\u5b89\u5168\u7684\u975e\u8054\u7f51\u8bbe\u5907\u4e0a\u5b8c\u6210\u7b7e\u540d","synchronizing-warning":"\u94b1\u5305\u4ecd\u5728\u540c\u6b65\u6570\u636e\uff0c\u6240\u4ee5\u663e\u793a\u7684\u4f59\u989d\u53ef\u80fd\u4e0d\u6b63\u786e\u3002\u4f60\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f","from-label":"\u53d1\u9001\u81ea","to-label":"\u53d1\u9001\u81f3","amount-label":"\u603b\u989d","personal-note-label":"\u65e5\u5fd7","personal-note-help":"\u6587\u672c\u8bb0\u5f55\u7528\u4e8e\u5c06\u6765\u67e5\u627e\u76f8\u5173\u4ea4\u6613\u8bb0\u5f55\u3002\u6587\u672c\u5185\u5bb9\u662f\u672c\u5730\u5b58\u50a8\uff0c\u56e0\u6b64\u53ea\u80fd\u5728\u5f53\u524d\u8bbe\u5907\u53ef\u89c1","wallet-label":"\u94b1\u5305","wallet-error-info":"\u8bf7\u9009\u62e9\u4e00\u4e2a\u94b1\u5305","invalid-amount":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u6570\u503c","convert-confirmation":"\u662f\u5426\u9700\u8981\u5c06\u6570\u989d\u4ece{{from}}\u8f6c\u6362\u4e3a{{to}}?","convert-confirmation-plural":"\u662f\u5426\u9700\u8981\u5c06\u6570\u989d\u4ece{{from}}\u8f6c\u6362\u4e3a{{to}}?","send-all-available-coins-link":"\u53d1\u9001\u6240\u6709","precision-error-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u4e00\u4e2a\u7cbe\u5ea6\u95ee\u9898\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","invaid-amount-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u4e00\u4e2a\u65e0\u6548\u503c\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","precision-errors-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u7cbe\u5ea6\u95ee\u9898\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","invaid-amounts-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u65e0\u6548\u503c\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","multiple-problems-warning":"\u56e0\u4e3a\u65e0\u6548\u503c\u6216\u7cbe\u5ea6\u95ee\u9898\uff0c\u6709\u4e9b\u503c\u8f6c\u6362\u5931\u8d25\uff0c\u4eb2\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","addresses-label":"\u5730\u5740","addresses-error-info":"\u8bf7\u81f3\u5c11\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u5730\u5740","no-wallet-selected-error":"\u6ca1\u6709\u5e01\u53ef\u53d1\u9001","no-coins-left-error":"\u6ca1\u6709\u5269\u4f59\u5e01\u53ef\u53d1\u9001","addresses-help":"\u9650\u5b9a\u6e90\u53d1\u9001\u5730\u5740","addresses-manual-help":"\u6e90\u53d1\u9001\u5730\u5740\u5217\u8868\uff0c\u4ee5\u9017\u53f7\u9694\u5f00\u3002\u6240\u6709\u5730\u5740\u5fc5\u987b\u5c5e\u4e8e\u7edf\u4e00\u94b1\u5305\uff0c\u5426\u5219\u5c06\u4f1a\u7b7e\u540d\u5931\u8d25","all-addresses":"\u6240\u6709\u5730\u5740(\u6240\u9009\u94b1\u5305\u7684)","outputs-label":"\u672a\u4ea4\u6613\u8f93\u51fa","outputs-help":"\u9650\u5b9a\u672a\u4ea4\u6613\u8f93\u51fa","outputs-error":"\u83b7\u53d6\u4ea4\u6613\u8f93\u51fa\u5931\u8d25\u3002\u8bf7\u786e\u4fdd\u8f93\u5165\u7684\u662f\u6709\u6548\u5730\u5740","all-outputs":"\u6240\u6709\u672a\u4ea4\u6613\u8f93\u51fa(\u6240\u9009\u5730\u5740\u7684)","enter-addresses-for-outputs":"\u8bf7\u5148\u8f93\u5165\u6709\u6548\u7684\u5730\u5740","enter-wallet-for-outputs-and-addresses":"\u8bf7\u9009\u62e9\u4e00\u4e2a\u6709\u6548\u7684\u94b1\u5305","invalid-addresses-for-outputs":"\u6ca1\u6709\u6709\u6548\u7684\u672a\u4ea4\u6613\u8f93\u51fa","available-funds-msg-part1":"\u6839\u636e\u4f60\u5f53\u524d\u7684\u9009\u62e9\uff0c\u4f60\u6700\u591a\u53ef\u4ee5\u53d1\u9001","available-funds-msg-part2":"\u548c","available-funds-msg-part3":"(\u81f3\u5c11","available-funds-msg-part4":"\u5c06\u4f5c\u4e3a\u5fc5\u987b\u7684\u4ea4\u6613\u624b\u7eed\u8d39)\u3002","change-address-label":"\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740","change-address-error-info":"\u627e\u96f6\u5730\u5740\u65e0\u6548","change-address-select-from-list-link":"\u9009\u62e9","change-address-help":"\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740\u3002\u5982\u679c\u4e0d\u63d0\u4f9b\uff0c\u94b1\u5305\u5c06\u4f1a\u81ea\u52a8\u9009\u62e9\u3002\u70b9\u51fb\\"\u9009\u62e9\\" \u6765\u9009\u62e9\u4e00\u4e2a\u5730\u5740","specific-hours":"\u53d1\u9001\u5e01\u65f6:","remove-specific-hours-info":"\u5220\u9664.","remove-specific-hours-confirmation":"\u4f60\u786e\u5b9a\u5220\u9664\u5c06\u53d1\u9001\u7684\u6307\u5b9a\u6570\u989d\u7684\u5e01\u65f6\u5417?","destinations-label":"\u76ee\u6807\u5730\u5740","destinations-help1":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01","destinations-help2":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01\u4ee5\u53ca\u5e01\u65f6","destination-tools-title":"\u76ee\u6807\u5730\u5740\u5de5\u5177","hours-allocation-check":"\u81ea\u52a8\u5206\u914d\u5e01\u65f6{{ coinHoursName }}","options-link":"\u9009\u9879","coin-hours-options-link":"\u5e01\u65f6\u9009\u9879","hours-share-factor-label":"\u5e01\u65f6\u5206\u53d1\u56e0\u5b50","hours-share-factor-help":"\u5206\u53d1\u56e0\u5b50\u503c(\u767e\u5206\u6bd4)\u8d8a\u9ad8\uff0c\u8d8a\u591a{{ coinHoursName }}\u5c06\u88ab\u53d1\u9001","close-hours-share-factor-alert":"\u91cd\u7f6e\u9009\u9879\uff0c\u4f60\u786e\u5b9a\u9700\u8981\u7ee7\u7eed\u5417","preview-button":"\u9884\u89c8","send-button":"\u53d1\u9001","show-button":"\u663e\u793a","simple-form-button":"\u7b80\u6613","advanced-form-button":"\u9ad8\u7ea7\u7684","select-wallet":"\u9009\u62e9\u94b1\u5305","saving-note-error":"\u4ea4\u6613\u5df2\u6210\u529f\u53d1\u9001\uff0c\u4f46\u662f\u65e5\u5fd7\u5b58\u50a8\u5931\u8d25","sent":"\u4ea4\u6613\u53d1\u9001\u6210\u529f","total-to-send":"\u603b\u5171:","invalid-address-error":"\u76ee\u6807\u5730\u5740\u65e0\u6548","one-invalid-address-error":"\u6709\u4e00\u4e2a\u76ee\u6807\u5730\u5740\u65e0\u6548","various-invalid-addresses-error":"\u90e8\u5206\u76ee\u6807\u5730\u5740\u65e0\u6548","all-addresses-invalid-error":"\u6240\u6709\u76ee\u6807\u5730\u5740\u5747\u65e0\u6548","invalid-addresses-error":"\u8bf7\u786e\u4fdd\u5730\u5740\u662f\u6709\u6548\u7684","address-error-info":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","invalid-value-error-info":"\u65e0\u6548\u503c","insufficient-funds-error-info":"\u5f53\u524d\u8f93\u5165\u503c\u8d85\u8fc7\u53ef\u7528\u4f59\u989d\u3002","sending-all-hours-with-coins-waning":"\u5982\u679c\u53d1\u9001\u6240\u6709\u5e01\uff0c\u5f53\u524d\u94b1\u5305\u4e2d\u6240\u6709\u5e01\u65f6\u5c06\u4f1a\u53d1\u9001\u6216\u9500\u6bc1\u3002\u5982\u679c\u4f60\u60f3\u4fdd\u7559\u5e01\u65f6\uff0c\u8bf7\u4e0d\u8981\u53d1\u9001\u6240\u6709\u5e01\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","advanced-sending-all-hours-with-coins-waning":"\u5982\u679c\u53d1\u9001\u6240\u6709\u5e01, \u5f53\u524d\u9009\u62e9\u6e90\u7684\u6240\u6709\u5e01\u65f6\u5c06\u4f1a\u88ab\u53d1\u9001\u6216\u6216\u9500\u6bc1. \u5982\u679c\u4f60\u60f3\u4fdd\u7559\u5e01\u65f6\uff0c\u8bf7\u4e0d\u8981\u53d1\u9001\u6240\u6709\u5e01\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","sending-all-hours-waning":"\u4f60\u9009\u62e9\u53d1\u9001\u6240\u6709\u5e01\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","high-hours-share-waning":"\u4f60\u7684\u9009\u62e9\u53ef\u80fd\u4f1a\u53d1\u9001\u94b1\u5305\u4e2d\u6240\u6709\u5e01\u65f6\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","advanced-high-hours-share-waning":"\u4f60\u7684\u9009\u62e9\u53ef\u80fd\u4f1a\u53d1\u9001\u9009\u62e9\u6e90\u4e2d\u7684\u6240\u6709\u5e01\u65f6\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","fill-with-link":{"title":"\u4f7f\u7528\u4ea4\u6613\u94fe\u63a5","link-info":"\u5728\u6b64\u8f93\u5165\u4ea4\u6613\u94fe\u63a5\u3002\u4ea4\u6613\u6570\u636e\u5c06\u4ece\u94fe\u63a5\u4e2d\u83b7\u53d6\u5e76\u586b\u5145\u5230\u8868\u5355\u3002","link-label":"\u4ea4\u6613\u94fe\u63a5","link-error-info":"\u8bf7\u8f93\u5165\u6709\u6548\u7684\u94fe\u63a5","process-button":"\u6267\u884c","invalid-link-error":"\u94fe\u63a5\u4e2d\u7684\u5185\u5bb9\u65e0\u6548","invalid-link-hours-error":"\u4ea4\u6613\u94fe\u63a5\u4e2d\u5305\u542b\u65e0\u6548\u7684\u5e01\u65f6\u6570","data-overwritten-alert":"\u90e8\u5206\u4e4b\u524d\u8f93\u5165\u7684\u6570\u636e\u5c06\u4f1a\u88ab\u8986\u5199\u3002\u4f60\u786e\u5b9a\u8981\u7ee7\u7eed\u5417?","confirmation":"\u8868\u5355\u5df2\u6839\u636e\u4ea4\u6613\u94fe\u63a5\u4e2d\u7684\u6570\u636e\u66f4\u65b0\u3002"},"known-node-errors":{"null-change-address-error":"\u65e0\u6cd5\u4f7f\u7528\u7a7a\u5730\u5740\u4f5c\u4e3a\u627e\u96f6\u5730\u5740\u3002\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","to-required-error":"\u4f60\u9700\u8981\u63d0\u4f9b\u4e00\u4e2a\u6709\u6548\u7684\u76ee\u6807\u5730\u5740\u7528\u4e8e\u53d1\u9001\u5e01\u3002\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","zero-coins-error":"\u65e0\u6cd5\u53d1\u90010\u4e2a\u5e01\u3002\u8bf7\u8f93\u5165\u6709\u6548\u503c","null-destination-error":"\u65e0\u6cd5\u4f7f\u7528\u7a7a\u5730\u5740\u4f5c\u4e3a\u76ee\u6807\u5730\u5740\u3002\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","duplicate-destination-error":"\u76ee\u6807\u5730\u5740\u91cd\u590d\u3002\u8bf7\u4e0d\u8981\u5728\u4e00\u4e2a\u4ea4\u6613\u4e2d\u53d1\u9001\u76f8\u540c\u6570\u503c\u7684\u5e01\u5230\u540c\u4e00\u76ee\u6807\u5730\u5740\u591a\u6b21","hours-in-automatic-mode-error":"\u81ea\u52a8\u5206\u53d1\u5e01\u65f6\u6a21\u5f0f\u65e0\u6cd5\u6307\u5b9a\u5177\u4f53\u5e01\u65f6\u3002\u8bf7\u91cd\u8bd5\u5176\u4ed6\u503c\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","hours-allocation-mode-needed-error":"\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\u672a\u6307\u5b9a\u3002\u8bf7\u8bbe\u7f6e\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","invalid-hours-allocation-mode-error":"\u65e0\u6548\u7684\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\u3002\u8bf7\u4f7f\u7528\u4e0d\u540c\u6a21\u5f0f\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","hours-allocation-mode-not-needed-error":"\u624b\u52a8\u5206\u53d1\u5e01\u65f6\u6a21\u5f0f\u65e0\u6cd5\u6307\u5b9a\u5e01\u65f6\u5206\u914d\u6a21\u5f0f\u3002\u8bf7\u4f7f\u7528\u5176\u4ed6\u503c\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","invalid-hours-mode-error":"\u65e0\u6548\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\u3002\u8bf7\u4f7f\u7528\u6709\u6548\u503c\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","share-factor-needed-error":"\u9700\u8981\u8bbe\u7f6e\u5e01\u65f6\u5206\u53d1\u56e0\u5b50\u3002\u8bf7\u8bbe\u7f6e\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","share-factor-not-needed-error":"\u5df2\u542f\u52a8\u624b\u52a8\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\uff0c\u5e01\u65f6\u5206\u53d1\u56e0\u5b50\u65e0\u6cd5\u8bbe\u7f6e\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","invalid-share-factor-error":"\u65e0\u6548\u7684\u5e01\u65f6\u5206\u53d1\u56e0\u5b50\u3002\u8bf7\u4f7f\u7528\u6b63\u786e\u7684\u503c\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","change-equal-to-destination-error":"\u4ea4\u6613\u65e0\u6cd5\u521b\u5efa\uff0c\u8bf7\u4e0d\u8981\u5728\u4e00\u4e2a\u4ea4\u6613\u4e2d\u53d1\u9001\u76f8\u540c\u6570\u503c\u7684\u5e01\u5230\u540c\u4e00\u76ee\u6807\u5730\u5740\u591a\u6b21","repeated-wallet":"\u6307\u5b9a\u79cd\u5b50\u7684\u94b1\u5305\u5df2\u5b58\u5728"},"bulk-send":{"title":"\u6279\u91cf\u53d1\u9001","indications":"\u5feb\u6377\u65b9\u5f0f\u53d1\u9001\u5230\u591a\u4e2a\u5730\u5740\uff0c\u5728\u4e00\u884c\u4e2d\u952e\u5165\u6bcf\u4e2a\u5730\u5740,\u5e01\u6570,\u5e01\u65f6(\u53ef\u9009)\uff0c\u5e76\u7528\u9017\u53f7\u9694\u5f00\u3002\u793a\u4f8b: \u5982\u679c\u4f60\u53d1\u900110\u4e2a\u5e01,5\u5e01\u65f6\u5230\\"xyz\\"\u5730\u5740\uff0c\u8bf7\u952e\u5165\\"xyz,10,5\\"; \u5982\u679c\u60f3\u81ea\u52a8\u8ba1\u7b97\u5e01\u65f6\uff0c\u53ef\u4ee5\u952e\u5165\\"xy,10\\"\u3002\u5c0f\u6570\u503c\u5fc5\u987b\u4ee5\u5c0f\u6570\u70b9\u9694\u5f00\u3002","data-error-info":"\u8bf7\u8f93\u5165\u503c","process-button":"\u5904\u7406","no-data-error":"\u65e0\u6570\u636e\u53ef\u5904\u7406","inconsistent-data-error":"\u5982\u679c\u4f60\u60f3\u8981\u53d1\u9001\u6307\u5b9a\u5e01\u65f6\u6570\uff0c\u6240\u6709\u5730\u5740\u5747\u9700\u6307\u5b9a\u5e01\u65f6\u3002","invalid-data-error":"\u952e\u5165\u6570\u636e\u683c\u5f0f\u8bef\u3002"}},"select-address":{"title":"\u9009\u62e9\u5730\u5740","no-addresses":"\u8be5\u94b1\u5305\u4e2d\u65e0\u786e\u8ba4\u7684\u5730\u5740\u3002"},"offline-transactions":{"loading-problem":"\u5c1d\u8bd5\u83b7\u53d6\u5fc5\u8981\u6570\u636e\u65f6\u5931\u8d25","wallet-error-info":"\u8bf7\u9009\u62e9\u4e00\u4e2a\u94b1\u5305\u3002","tx-error-info":"\u8bf7\u8f93\u5165\u6709\u6548\u7684\u4ea4\u6613\u6587\u672c\u3002","copy-tx":{"signed-title":"\u5df2\u7b7e\u540d\u7684\u4ea4\u6613","unsigned-title":"\u672a\u7b7e\u540d\u7684\u4ea4\u6613","text-unsigned":"\u8fd9\u662f\u4f7f\u7528\u4f60\u8f93\u5165\u7684\u6570\u636e\u521b\u5efa\u7684\u672a\u7b7e\u540d\u7684\u4ea4\u6613\u3002\u8bf7\u62f7\u8d1d\u5e76\u9009\u62e9\\"\u7b7e\u540d\u4ea4\u6613\\"\u9009\u9879\u5bf9\u5176\u8fdb\u884c\u7b7e\u540d","text-signed":"\u8fd9\u662f\u5df2\u7b7e\u540d\u7684\u4ea4\u6613\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\\"\u5e7f\u64ad\u4ea4\u6613\\"\u9009\u9879\u5c06\u5176\u53d1\u9001\u5230\u7f51\u7edc\u4e2d","input-label":"\u4ea4\u6613\u672c\u6587","copy-button":"\u62f7\u8d1d","reset-confirmation":"\u4f60\u662f\u5426\u8981\u6e05\u7406\u8868\u5355\uff0c\u4ee5\u4fbf\u5e76\u521b\u5efa\u65b0\u7684\u4ea4\u6613?","reset-done":"\u8868\u5355\u5df2\u6e05\u7406\u3002"},"sign-tx":{"title":"\u7b7e\u540d\u4ea4\u6613","text":"\u4f7f\u7528\u8be5\u8868\u5355\u5bf9\u4ea4\u6613\u7b7e\u540d\u3002\u4e3a\u4e86\u4f7f\u64cd\u4f5c\u6b63\u5e38\u8fdb\u884c\uff0c\u60a8\u5fc5\u987b\u9009\u62e9\u5305\u542b\u6240\u6709\u7528\u4e8e\u5728\u4ea4\u6613\u4e2d\u53d1\u9001\u5e01\u7684\u8f93\u5165/\u5730\u5740\u7684\u94b1\u5305\u3002","wallet-label":"\u94b1\u5305","select-wallet":"\u9009\u62e9\u94b1\u5305","input-label":"\u4ea4\u6613\u6587\u672c","sign-button":"\u7b7e\u540d","signed":"\u4ea4\u6613\u7b7e\u540d\u5b8c\u6210"},"broadcast-tx":{"title":"\u5e7f\u64ad\u4ea4\u6613","text":"\u4f7f\u7528\u8be5\u8868\u5355\u53d1\u9001\u5df2\u7b7e\u540d\u7684\u4ea4\u6613\u5230\u7f51\u7edc\u3002","input-label":"\u4ea4\u6613\u6587\u672c","send-button":"\u53d1\u9001","sent":"\u4ea4\u6613\u5df2\u53d1\u9001\u3002"}},"reset":{"title":"\u91cd\u7f6e\u5bc6\u7801","wallet-label":"\u94b1\u5305","seed-label":"\u94b1\u5305\u79cd\u5b50","seed-error-info":"\u8bf7\u8f93\u5165\u79cd\u5b50","password-label":"\u65b0\u5bc6\u7801 (\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u94b1\u5305\u52a0\u5bc6\uff0c\u8bf7\u5c06\u5bc6\u7801\u7559\u7a7a)","confirm-label":"\u786e\u8ba4\u65b0\u5bc6\u7801","confirm-error-info":"\u4e24\u4e2a\u5bc6\u7801\u5fc5\u987b\u5339\u914d\u3002","reset-button":"\u91cd\u7f6e","done":"\u5bc6\u7801\u5df2\u6210\u529f\u91cd\u7f6e\u3002"},"tx":{"transaction-title":"\u4ea4\u6613","confirm-transaction-title":"\u786e\u8ba4\u4ea4\u6613","from-small-label":"\u6765\u81ea","to-small-label":"\u5230","date-small-label":"\u65e5\u671f","status-small-label":"\u72b6\u6001","coins-small-label":"\u5e01","hours-small-label":"\u5e01\u65f6","id-small-label":"\u4ea4\u6613ID","note-small-label":"\u65e5\u5fd7","without-note":"\u65e0\u65e5\u5fd7","show-more-link":"\u5c55\u793a\u66f4\u591a","hours-moved":"\u5df2\u8f6c\u79fb","hours-sent":"\u5df2\u53d1\u9001","hours-received":"\u5df2\u63a5\u6536","hours-burned":"\u5df2\u71c3\u70e7","inputs-title":"\u8f93\u5165","outputs-title":"\u8f93\u51fa","confirmed-transaction":"\u5df2\u786e\u8ba4","pending-transaction":"\u5f85\u5904\u7406","current-rate-help":"\u6309\u5f53\u524d\u6c47\u7387\u8ba1\u7b97"},"edit-note":{"title":"\u7f16\u8f91\u65e5\u5fd7","change-button":"\u4fee\u6539"},"backup":{"title":"\u5907\u4efd\u94b1\u5305","wallet-directory":"\u94b1\u5305\u76ee\u5f55:","seed-warning":"\u5728\u7eb8\u4e0a\u5907\u4efd\u4f60\u7684\u79cd\u5b50\uff0c\u5e76\u4fdd\u5b58\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u53ea\u8981\u6709\u79cd\u5b50\uff0c\u4f60\u5c31\u53ef\u4ee5\u627e\u56de\u4f60\u7684\u5e01\u3002","desc":"\u4f7f\u7528\u4e0b\u8868\u4ece\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u5f97\u5230\u79cd\u5b50\u3002
\u4e3a\u4e86\u4ece\u672a\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u83b7\u5f97\u79cd\u5b50\uff0c\u6253\u5f00\u4e0a\u9762\u7684\u6587\u4ef6\u5939,\u5728\u6587\u672c\u7f16\u8f91\u5668\u4e2d\u6253\u5f00.wlt\u6587\u4ef6\u5e76\u6062\u590d\u79cd\u5b50\u3002","wallet-table-label":"\u94b1\u5305\u540d","filename-table-label":"\u6587\u4ef6\u540d","save-addresses-button":"\u4fdd\u5b58\u5730\u5740","show-seed-button":"\u663e\u793a\u79cd\u5b50","no-wallets":"\u6ca1\u6709\u94b1\u5305","unencrypted-info":"\u51fa\u4e8e\u5b89\u5168\u539f\u56e0\uff0c\u65e0\u6cd5\u663e\u793a\u672a\u52a0\u5bc6\u94b1\u5305\u7684\u79cd\u5b50\u3002\u8981\u83b7\u5f97\u79cd\u5b50\uff0c\u8bf7\u4f7f\u7528\u5bc6\u7801\u5bf9\u94b1\u5305\u8fdb\u884c\u52a0\u5bc6\uff0c\u6216\u6309\u7167\u672c\u9875\u9876\u90e8\u663e\u793a\u7684\u8bf4\u660e\u8fdb\u884c\u64cd\u4f5c\u3002","hw-wallet-info":"\u8981\u83b7\u53d6\u786c\u4ef6\u94b1\u5305\u7684\u79cd\u5b50\uff0c\u8bf7\u4f7f\u7528\u94b1\u5305\u9875\u9762\u5e95\u90e8\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u9009\u9879\u3002","not-compatible-error":"\u4f60\u7684\u7f51\u9875\u6d4f\u89c8\u5668\u4e0e\u6b64\u529f\u80fd\u4e0d\u517c\u5bb9\u3002","seed-modal-window":{"title":"\u94b1\u5305\u79cd\u5b50","seed-label":"\u79cd\u5b50"}},"blockchain":{"title":"\u533a\u5757\u94fe","blocks-label":"\u533a\u5757\u6570\u91cf","time-label":"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u65f6\u95f4\u6233","hash-label":"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u54c8\u5e0c\u503c","current-supply-label":"\u76ee\u524d{{ coinName }}\u4f9b\u5e94\u91cf","total-supply-label":"{{ coinName }}\u7684\u603b\u4f9b\u5e94\u91cf","current-coinhour-supply-label":"\u76ee\u524d{{ coinHoursName }}\u4f9b\u5e94\u91cf","total-coinhour-supply-label":"{{ coinHoursName }}\u603b\u4f9b\u5e94\u91cf"},"network":{"title":"\u7f51\u7edc","peer-small-table-label":"\u8282\u70b9","source-small-table-label":"\u8282\u70b9\u6765\u6e90","block-height-small-table-label":"\u533a\u5757\u9ad8\u5ea6","block-height-short-small-table-label":"\u533a\u5757","last-seen-small-table-label":"\u4e0a\u4e00\u6b21\u51fa\u73b0","last-received-help":"\u4e0a\u4e00\u6b21\u63a5\u6536","last-sent-help":"\u4e0a\u4e00\u6b21\u53d1\u9001","in-help":"\u8fdb\u6765\u7684","out-help":"\u51fa\u53bb\u7684","sources":{"default":"\u9ed8\u8ba4\u8282\u70b9","exchange":"\u4ea4\u6362\u8282\u70b9"}},"pending-txs":{"title":"\u5f85\u5904\u7406\u4ea4\u6613","timestamp-table-label":"\u65f6\u95f4\u6233","txid-table-label":"\u4ea4\u6613ID","none":"\u65e0\u5f85\u5904\u7406\u4ea4\u6613","my-transactions-button":"\u6211\u7684","all-transactions-button":"\u5168\u90e8"},"outputs":{"title":"\u4ea4\u6613\u8f93\u51fa","error-no-outputs":"\u65e0\u53ef\u7528\u4ea4\u6613\u8f93\u51fa"},"history":{"title-and-button":"\u5386\u53f2","tx-detail-title":"\u4ea4\u6613\u660e\u7ec6","moving":"\u5185\u90e8\u8f6c\u8d26\u4e2d","moved":"\u5df2\u5185\u90e8\u8f6c\u8d26","sending":"\u53d1\u9001\u4e2d","sent":"\u5df2\u53d1\u9001","received":"\u5df2\u63a5\u6536","receiving":"\u63a5\u6536\u4e2d","pending-indication":"\u5f85\u5904\u7406","transaction-note-small-label":"\u65e5\u5fd7:","no-txs":"\u4f60\u6ca1\u6709\u5386\u53f2\u4ea4\u6613","no-txs-filter":"\u6ca1\u6709\u4e0e\u5f53\u524d\u7b5b\u9009\u6761\u4ef6\u5339\u914d\u7684\u4ea4\u6613","no-filter":"\u672a\u7ecf\u7b5b\u9009 (\u70b9\u51fb\u9009\u62e9\u94b1\u5305/\u5730\u5740)","filter":"\u5df2\u7b5b\u9009: ","filters":"\u5df2\u7b5b\u9009: ","all-addresses":"\u6240\u6709\u5730\u5740","view-all":"\u67e5\u770b\u6240\u6709{{ number }}\u6761\u8bb0\u5f55"},"teller":{"done":"\u5b8c\u6210","waiting-confirm":"\u7b49\u5f85\u786e\u8ba4","waiting-deposit":"\u7b49\u5f85\u6bd4\u7279\u5e01\u5145\u503c","waiting-send":"\u7b49\u5f85\u53d1\u9001Skycoin","unknown":"\u672a\u77e5"},"confirmation":{"default-title":"\u786e\u8ba4","yes-button":"\u662f","no-button":"\u5426"},"service":{"api":{"no-internet-error":"\u4f60\u6ca1\u6709\u4e92\u8054\u7f51\u8fde\u63a5\u6216\u8282\u70b9\u5df2\u505c\u6b62\u5de5\u4f5c\u3002","incorrect-password-error":"\u5bc6\u7801\u9519\u8bef\u3002","unknown-error":"\u65e0\u6cd5\u6267\u884c\u5f53\u524d\u64cd\u4f5c\u3002","api-disabled-error":"API\u5df2\u7981\u7528\u3002"}},"hardware-wallet":{"general":{"default-wallet-name":"\u65b0\u786c\u4ef6\u94b1\u5305","confirm":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u3002","confirm-and-more":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u5e76\u6309\u9075\u5faa\u6307\u793a\u3002","follow":"\u8bf7\u6309\u7167\u786c\u4ef6\u94b1\u5305\u4e0a\u663e\u793a\u7684\u8bf4\u660e\u8fdb\u884c\u64cd\u4f5c\u3002","completed":"\u64cd\u4f5c\u5b8c\u6210\u3002","name-updated":"\u7528\u4e8e\u5728\u94b1\u5305\u5217\u8868\u4e2d\u6807\u8bc6\u6b64\u786c\u4ef6\u94b1\u5305\u7684\u540d\u79f0\u5df2\u66f4\u65b0\uff0c\u4ee5\u5339\u914d\u8bbe\u5907\u4e0a\u663e\u793a\u7684\u540d\u79f0\u3002"},"errors":{"generic-error":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786e\u4fdd\u4f60\u5df2\u7ecf\u8fde\u63a5\u4e86\u4e00\u4e2a\u6709\u6548\u7684\u786c\u4ef6\u94b1\u5305\uff0c\u5e76\u4e14\u5b83\u6ca1\u6709\u5728\u7b49\u5f85\u8f93\u5165\u3002","disconnected":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786c\u4ef6\u94b1\u5305\u672a\u8fde\u63a5\u3002","incorrect-wallet":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u4e0e\u9884\u671f\u7684\u4e0d\u540c\u3002","incorrect-pin":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684PIN\u7801\u4e0d\u6b63\u786e\u3002","refused":"\u64cd\u4f5c\u5931\u8d25\u6216\u88ab\u53d6\u6d88\u3002","too-many-inputs-outputs":"\u4ea4\u6613\u4e2d\u786c\u4ef6\u94b1\u5305\u7684\u8f93\u5165\u6216\u8f93\u51fa\u8fc7\u591a\u3002\u8bf7\u5c1d\u8bd5\u521b\u5efa\u591a\u4e2a\u8f83\u5c0f\u7684\u4ea4\u6613\uff0c\u6bcf\u4e2a\u4ea4\u6613\u4fdd\u8bc1\u8f83\u5c0f\u6570\u91cf\u7684\u6536\u4ef6\u4eba.","daemon-connection":"\u8fde\u63a5\u5230\u786c\u4ef6\u94b1\u5305\u5b88\u62a4\u7a0b\u5e8f\u65f6\u51fa\u73b0\u95ee\u9898\uff0c\u8bf7\u786e\u4fdd\u5176\u6b63\u5728\u8fd0\u884c\uff0c\u7136\u540e\u91cd\u8bd5\u3002\u4f60\u53ef\u4ee5\u4ecewww.skycoin.com/downloads\u4e0b\u8f7d","daemon-connection-with-configurable-link":"\u8fde\u63a5\u5230\u786c\u4ef6\u94b1\u5305\u5b88\u62a4\u7a0b\u5e8f\u65f6\u51fa\u73b0\u95ee\u9898\uff0c\u8bf7\u786e\u4fdd\u5176\u6b63\u5728\u8fd0\u884c\uff0c\u7136\u540e\u91cd\u8bd5\u3002\u4e0b\u8f7d","timeout":"\u7531\u4e8e\u4e0d\u6d3b\u52a8\uff0c\u64cd\u4f5c\u88ab\u53d6\u6d88\u3002 \u8bf7\u518d\u8bd5\u4e00\u6b21\u3002","invalid-address-generated":"\u5730\u5740\u751f\u6210\u5668\u5b58\u5728\u95ee\u9898\uff0c\u5fc5\u987b\u53d6\u6d88\u8be5\u64cd\u4f5c.","invalid-address":"\u65e0\u6548\u5730\u5740.","not-in-bootloader-mode":"\u4f7f\u7528\u8be5\u9009\u9879\uff0c\u786c\u4ef6\u94b1\u5305\u5fc5\u987b\u8fdb\u5165bootloader\u6a21\u5f0f."},"security-warning":{"title":"\u5b89\u5168\u8b66\u544a","text":"\u4e0a\u6b21\u8fde\u63a5\u6b64\u786c\u4ef6\u94b1\u5305\u65f6\uff0c\u53d1\u73b0\u4e00\u4e2a\u6216\u591a\u4e2a\u5b89\u5168\u8b66\u544a\u3002\u6211\u4eec\u5efa\u8bae\u4f60\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u9009\u9879(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u6309\u94ae)\u5e76\u4fdd\u6301\u8bbe\u5907\u5df2\u8fde\u63a5\uff0c\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u89e3\u51b3\u5b89\u5168\u95ee\u9898","link":"\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u9009\u9879\u7a97\u53e3."},"options":{"connecting":"\u8fde\u63a5...","disconnected":"\u6ca1\u6709\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8bf7\u8fde\u63a5\u786c\u4ef6\u94b1\u5305\u540e\u4f7f\u7528\u6b64\u9009\u9879\u3002","unconfigured-detected-title":"\u672a\u914d\u7f6e\u7684\u786c\u4ef6\u94b1\u5305","unconfigured-detected":"\u68c0\u6d4b\u5230\u65e0\u79cd\u5b50\u7684\u786c\u4ef6\u94b1\u5305\u3002\u9009\u62e9\\"\u81ea\u52a8\u914d\u7f6e\\"\u5982\u679c\u4f60\u60f3\u5c06\u5176\u914d\u7f6e\u4e3a\u5168\u65b0\u7684\u94b1\u5305\u5e76\u7acb\u5373\u5f00\u59cb\u4f7f\u7528\u5b83\uff0c\u6216\u9009\u62e9\\"\u6062\u590d\u5907\u4efd\\"\u5982\u679c\u4f60\u60f3\u4f7f\u7528\u5148\u524d\u521b\u5efa\u7684\u5907\u4efd\u79cd\u5b50\u5bf9\u5176\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u80fd\u591f\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u4ea7\u3002","configured-detected":"\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8be5\u8bbe\u5907\u5728\u94b1\u5305\u5217\u8868\u4e2d\u88ab\u8bc6\u522b\u4e3a:","security-warnings-title":"\u5b89\u5168\u8b66\u544a","security-warning-title":"\u5b89\u5168\u8b66\u544a","unchecked-version-warning":"\u65e0\u6cd5\u68c0\u6d4b\u786c\u4ef6\u94b1\u5305\u56fa\u4ef6\u662f\u5426\u6700\u65b0\u7248\u672c\u3002\u53ef\u80fd\u539f\u56e0\u662f\u7f51\u7edc\u5b58\u5728\u95ee\u9898\u6216\u8005\u670d\u52a1\u5904\u4e8e\u7ef4\u62a4\u72b6\u6001.","outdated-version-warning":"\u786c\u4ef6\u94b1\u5305\u56fa\u4ef6\u7248\u672c\u8fc7\u4f4e\u3002\u4e3a\u4e86\u94b1\u5305\u5b89\u5168\uff0c\u5efa\u8bae\u70b9\u51fb\\"\u66f4\u65b0\u56fa\u4ef6\\"\uff0c\u5c3d\u5feb\u5347\u7ea7","backup-warning":"\u4f60\u5e94\u8be5\u5907\u4efd\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\uff0c\u5426\u5219\u4e07\u4e00\u51fa\u73b0\u95ee\u9898\uff0c\u4f60\u53ef\u80fd\u5c06\u65e0\u6cd5\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\uff0c\u8981\u505a\u5230\u8fd9\u4e00\u70b9\u3002\u9009\u62e9\\"\u521b\u5efa\u4e00\u4e2a\u5907\u4efd\\"\u9009\u9879\u3002","pin-warning":"\u5f53\u524d\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u672a\u8bbe\u7f6e\u5bc6\u7801\u3002\u5bc6\u7801\u53ef\u4fdd\u62a4\u786c\u4ef6\u94b1\u5305\uff0c\u4ee5\u9632\u4e22\u5931\u3001\u76d7\u7a83\u548c\u9ed1\u5ba2\u5165\u4fb5\u3002\u8981\u521b\u5efa\u4e00\u4e2a\u5bc6\u7801\uff0c\u9009\u62e9\\"\u521b\u5efaPIN\u7801\\"\u9009\u9879\u3002","options":"\u9009\u9879:","update-firmware":"\u66f4\u65b0\u56fa\u4ef6","configure-automatically":"\u81ea\u52a8\u914d\u7f6e","restore-backup":"\u6062\u590d\u5907\u4efd","create-backup":"\u521b\u5efa\u5907\u4efd","wipe":"\u5220\u9664\u8bbe\u5907","confirm-seed":"\u786e\u8ba4\u79cd\u5b50","create-pin":"\u521b\u5efa\u5bc6\u7801","change-pin":"\u66f4\u6539\u5bc6\u7801","delete-pin":"\u5220\u9664\u5bc6\u7801","forgotten-pin-part1":"\u5982\u679c\u4f60\u56e0\u4e3a\u5fd8\u8bb0\u5bc6\u7801\u800c\u65e0\u6cd5\u8fdb\u5165\u94b1\u5305\uff0c\u4f60\u53ef\u4ee5\u5220\u9664\u786c\u4ef6\u94b1\u5305\uff0c\u7136\u540e\u901a\u8fc7\u79cd\u5b50","forgotten-pin-part2":"\u6062\u590d","firmware-version":"\u56fa\u4ef6\u7248\u672c:"},"update-firmware-warning":{"title":"\u56fa\u4ef6\u7248\u672c\u8fc7\u4f4e","text":"\u8b66\u544a: \u5f53\u524d\u786c\u4ef6\u94b1\u5305\u7684\u56fa\u4ef6\u7248\u672c\u8fc7\u4f4e\u3002\u4e3a\u4e86\u5b89\u5168\uff0c\u5efa\u8bae\u66f4\u65b0.","update":"\u66f4\u65b0"},"update-firmware":{"title-connecting":"\u8fde\u63a5\u4e2d...","title-update":"\u66f4\u65b0\u56fa\u4ef6","title-install":"\u5b89\u88c5\u56fa\u4ef6","text-downloading":"\u68c0\u6d4b\u8bbe\u5907\u5e76\u4e0b\u8f7d\u6587\u4ef6...","text-bootloader":"\u8b66\u544a: \u5982\u679c\u4f60\u5df2\u914d\u7f6e\u8fc7\u6539\u8bbe\u5907\uff0c\u7ee7\u7eed\u4e4b\u524d\uff0c\u8bf7\u52a1\u5fc5\u786e\u4fdd\u4f60\u5df2\u5c06\u79cd\u5b50\u5907\u4efd\uff0c\u5426\u5219\u4f60\u7684\u8d44\u4ea7\u53ef\u80fd\u4f1a\u6c38\u4e45\u4e22\u5931","text-not-bootloader":"\u66f4\u65b0\u786c\u4ef6\u94b1\u5305\uff0c\u8bf7\u4ee5bootloader\u6a21\u5f0f\u8fde\u63a5\u8bbe\u5907(\u6309\u4e0b\u8bbe\u5907\u7684\u4e24\u4e2a\u7269\u7406\u6309\u94ae\u7684\u540c\u4e8b\u5c06\u5176\u8fde\u63a5\u5230\u8ba1\u7b97\u673a)","text-no-firmware":"\u6b22\u8fce\u3002\u5f53\u524d\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u5c1a\u672a\u5b89\u88c5\u56fa\u4ef6\u3002\u73b0\u5728\u5c06\u5b89\u88c5\u56fa\u4ef6\uff0c\u4ee5\u4fbf\u4f60\u5f00\u59cb\u4f7f\u7528\u8be5\u8bbe\u5907\u3002\u6ce8\u610f: \u5982\u679c\u4f60\u5df2\u914d\u7f6e\u8fc7\u6539\u8bbe\u5907\u5e76\u60f3\u8981\u6062\u590d\u8d44\u4ea7\uff0c\u4f60\u9700\u8981\u79cd\u5b50.","follow":"\u66f4\u65b0\u56fa\u4ef6\u5df2\u53d1\u9001\u81f3\u786c\u4ef6\u94b1\u5305\u3002\u8bf7\u5728\u8bbe\u5907\u4e0a\u7ee7\u7eed.","connection-error":"\u65e0\u6cd5\u4e0b\u8f7d\u56fa\u4ef6\u3002\u53ef\u80fd\u662f\u7f51\u7edc\u8fde\u63a5\u95ee\u9898\u6216\u8005\u670d\u52a1\u5904\u4e8e\u7ef4\u62a4\u72b6\u6001.","timeout":"\u7531\u4e8e\u4e0d\u6d3b\u52a8\uff0c\u64cd\u4f5c\u88ab\u53d6\u6d88\u3002\u8bf7\u65ad\u5f00\u8bbe\u5907\u8fde\u63a5\uff0c\u5e76\u5728\u91cd\u65b0\u8fde\u63a5\u540e\u91cd\u8bd5.","finished":"\u8bbe\u5907\u914d\u7f6e\u6210\u529f\u3002\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u8bf7\u62d4\u9664\u8bbe\u5907."},"generate-seed":{"text":"\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u4f60\u53ef\u4ee5\u9009\u62e9\u751f\u6210\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002\u79cd\u5b50\u662f\u4e00\u4e2a\u5355\u8bcd\u5217\u8868\uff0c\u51fa\u73b0\u95ee\u9898\u540e\u53ef\u4ee5\u7528\u6765\u6062\u590d\u8bbf\u95ee\u4f60\u7684\u5e01\u3002\u6240\u6709\u9009\u9879\u90fd\u662f\u5b89\u5168\u7684\uff0c\u5982\u679c\u4f60\u6ca1\u6709\u7279\u6b8a\u539f\u56e0\u5fc5\u987b\u9009\u62e9\u67d0\u4e00\u9879\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u9ed8\u8ba4\u503c\u3002","configuring":"\u914d\u7f6e..."},"restore-seed":{"text":"\u5728\u7ee7\u7eed\u524d\uff0c\u8bf7\u9009\u62e9\u4f60\u60f3\u8981\u6062\u590d\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u91cf\u3002","check-text":"\u4f60\u53ef\u4ee5\u4f7f\u7528\u6b64\u9009\u9879\u8f93\u5165\u79cd\u5b50\uff0c\u5e76\u68c0\u67e5\u5b83\u662f\u5426\u4e0e\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4e00\u81f4\u3002\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u9009\u62e9\u4f60\u60f3\u8981\u68c0\u67e5\u7684\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002","warning":"\u8b66\u544a: \u4e3a\u4e86\u907f\u514d\u53ef\u80fd\u51fa\u73b0\u7684\u95ee\u9898\uff0c\u8bf7\u4ec5\u4f7f\u7528\u540c\u4e00\u54c1\u724c/\u578b\u53f7\u7684\u786c\u4ef6\u94b1\u5305\u521b\u5efa\u79cd\u5b50\u3002","error-wrong-word":"\u9519\u8bef: \u91cd\u65b0\u952e\u5165\u7684\u5355\u8bcd\u4e0e\u786c\u4ef6\u94b1\u5305\u6240\u8bf7\u6c42\u7684\u4e0d\u5339\u914d\u3002","error-invalid-seed":"\u9519\u8bef: \u79cd\u5b50\u65e0\u6548\u3002\u8bf7\u52a1\u5fc5\u6309\u6b63\u786e\u7684\u987a\u5e8f\u8f93\u5165\u6b63\u786e\u7684\u5355\u8bcd\u3002","error-wrong-seed":"\u9519\u8bef: \u79cd\u5b50\u662f\u6709\u6548\u7684\uff0c\u4f46\u4e0e\u8bbe\u5907\u4e2d\u7684\u79cd\u5b50\u4e0d\u5339\u914d\u3002","correct-seed":"\u79cd\u5b50\u6709\u6548\u5e76\u4e0e\u8bbe\u5907\u4e2d\u7684\u5339\u914d."},"added":{"title":"\u65b0\u786c\u4ef6\u94b1\u5305","configuring":"\u68c0\u6d4b\u5230\u65b0\u7684\u786c\u4ef6\u94b1\u5305\u3002\u914d\u7f6e...","done":"\u5df2\u5b8c\u6210","added1":"\u5df2\u8fde\u63a5\u7684\u786c\u4ef6\u7684\u94b1\u5305\u5df2\u7ecf\u7528\u5982\u4e0b\u540d\u5b57\u88ab\u6dfb\u52a0\u5230\u94b1\u5305\u5217\u8868:","added2":"\u73b0\u5728\u4f60\u53ef\u4ee5\u67e5\u770b\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4f59\u989d\u548c\u5730\u5740\u4e86\uff0c\u5373\u4f7f\u786c\u4ef6\u94b1\u5305\u5e76\u672a\u8fde\u63a5\u3002\u6b64\u5916\u5982\u679c\u4f60\u613f\u610f\uff0c\u4f60\u8fd8\u53ef\u4ee5\u66f4\u6539\u94b1\u5305\u540d\u79f0\u6216\u4ece\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u5220\u9664\u3002","added-error-info":"\u4f60\u5fc5\u987b\u586b\u5199\u4e00\u4e2a\u540d\u79f0.","characters-warning":"\u5982\u679c\u4f60\u4f7f\u7528\u975e\u6807\u51c6\u82f1\u8bed\u5b57\u7b26\uff0c\u5b83\u53ef\u80fd\u65e0\u6cd5\u6b63\u786e\u7684\u663e\u793a\u5728\u8bbe\u5907\u4e0a."},"wipe":{"warning":"\u8b66\u544a: \u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u6240\u6709\u6570\u636e\u5c06\u88ab\u5220\u9664\u3002\u5982\u679c\u6ca1\u6709\u5907\u4efd\uff0c\u4f60\u5c06\u65e0\u6cd5\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\u3002","confirm-delete-check":"\u8fd8\u662f\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u4e2d\u5220\u9664"},"create-backup":{"warning":"\u8b66\u544a: \u4f60\u53ea\u80fd\u4f7f\u7528\u6b64\u9009\u9879\u5907\u4efd\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\u4e00\u6b21\u3002\u5982\u679c\u4f60\u51b3\u5b9a\u7ee7\u7eed\uff0c\u4f60\u5c06\u4e0d\u5f97\u4e0d\u5199\u4e0b\u4e00\u7ec4\u5355\u8bcd(\u5efa\u8bae\u5199\u5728\u7eb8\u4e0a\uff0c\u800c\u4e0d\u662f\u7535\u8111\u4e0a)\uff0c\u8fd9\u4e9b\u5355\u8bcd\u5c06\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\uff0c\u5e76\u5c06\u5176\u5b58\u50a8\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u4efb\u4f55\u53ef\u4ee5\u8bbf\u95ee\u5355\u8bcd\u5217\u8868(\\"\u79cd\u5b50\\")\u7684\u4eba\u90fd\u53ef\u4ee5\u8bbf\u95ee\u94b1\u5305\u4f59\u989d\uff0c\u56e0\u6b64\u5efa\u8bae\u8bf7\u683c\u5916\u8c28\u614e\u3002","instructions":"\u5199\u4e0b\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u7684\u5355\u8bcd\u5217\u8868\u3002\u4e00\u5b9a\u8981\u6309\u987a\u5e8f\u5e76\u628a\u6bcf\u4e2a\u5355\u8bcd\u90fd\u5199\u5bf9\u3002"},"seed-word":{"title":"\u8f93\u5165\u5b57","enter-word":"\u8f93\u5165\u8bbe\u5907\u4e2d\u663e\u793a\u7684\u5b57","info":"\u4f60\u5c06\u88ab\u8981\u6c42\u4ee5\u968f\u673a\u7684\u987a\u5e8f\u8f93\u5165\u4f60\u5907\u4efd\u7684\u79cd\u5b50\uff0c\u52a0\u4e0a\u4e00\u4e9b\u989d\u5916\u7684\u5b57\u3002","word-label":"\u8981\u6c42\u7684\u5b57","error-invalid-word":"\u8f93\u5165\u5b57\u65e0\u6548\u3002","error-loading-words":"\u6b63\u5728\u52a0\u8f7d\u5b57\u5217\u8868\u3002\u8bf7\u7a0d\u7b49\u3002"},"change-pin":{"pin-mismatch":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684\u4e24\u4e2a\u5bc6\u7801\u4e0d\u5339\u914d"},"remove-pin":{"warning":"\u8b66\u544a: \u4e0d\u5efa\u8bae\u4ece\u786c\u4ef6\u94b1\u5305\u4e2d\u5220\u9664\u5bc6\u7801\uff0c\u56e0\u4e3a\u5b83\u5c06\u5f88\u5bb9\u6613\u88ab\u672a\u7ecf\u6388\u6743\u7684\u5404\u65b9\u4f7f\u7528\u3002"},"enter-pin":{"title":"\u8f93\u5165\u5bc6\u7801","title-change-current":"\u8f93\u5165\u5f53\u524d\u5bc6\u7801","title-change-new":"\u8f93\u5165\u65b0\u7684\u5bc6\u7801","title-change-confirm":"\u786e\u8ba4\u65b0\u7684\u5bc6\u7801","instructions-generic":" \u5bc6\u7801\u5df2\u663e\u793a\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\u3002","instructions-tx":"\u8fdb\u5165\u5bc6\u7801\u4ee5\u786e\u8ba4\u5e76\u7b7e\u7f72\u4ea4\u6613\u3002","instructions-change":"\u8bf7\u8f93\u5165\u4e00\u4e2a4\u52308\u4e2a\u6570\u5b57\u4e4b\u95f4\u7684\u96be\u4ee5\u88ab\u731c\u4e2d\u7684\u5bc6\u7801\u3002","help":"\u9700\u8981\u5e2e\u52a9\uff1f"},"pin-help":{"title":"\u5e2e\u52a9","part1":"\u5f53\u9700\u8981\u8f93\u5165\u5bc6\u7801\u624d\u80fd\u7ee7\u7eed\u65f6\uff0c\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4f1a\u663e\u793a\u4e00\u4e2a\u77e9\u9635\uff0c\u77e9\u9635\u75319\u4e2a\u968f\u673a\u6392\u5217\u7684\u5757\u7ec4\u6210(\u6bcf\u6b21\u987a\u5e8f\u90fd\u4f1a\u6539\u53d8)\uff0c\u4f60\u5c06\u88ab\u8981\u6c42\u5728\u8f6f\u4ef6\u94b1\u5305\u4e2d\u8f93\u5165\u5bc6\u7801\uff0c\u4f7f\u7528\u4e00\u4e2a\u77e9\u9635\uff0c\u6b64\u77e9\u9635\u5305\u542b9\u4e2a\u6309\u94ae\uff0c\u53ea\u663e\u793a\u7b26\u53f7#\u3002","part2":"\u8981\u8f93\u5165\u5bc6\u7801\uff0c\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u4ee5\u6570\u5b57\u77e9\u9635\u67e5\u770b\u5bc6\u7801\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u76f8\u5e94\u6309\u94ae\u3002\u4f8b\u5982\uff0c\u5982\u679c\u5bc6\u7801\u4e3a\\"23\\"\u4e14\u6570\u5b572\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u5de6\u4e0a\u89d2\uff0c\u6570\u5b573\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u6b63\u4e2d\u95f4\uff0c\u5219\u6309\u987a\u5e8f\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u5de6\u4e0a\u89d2\u548c\u4e2d\u95f4\u6309\u94ae\u3002","part3":"\u5982\u679c\u4f60\u613f\u610f\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528\u952e\u76d8\u4e0a\u7684\u5c0f\u952e\u76d8\u8f93\u5165\u5bc6\u7801\u3002\u4f46\u662f\uff0c\u5982\u4e4b\u524d\u793a\u4f8b\u6240\u793a\uff0c\u5982\u679c\u5bc6\u7801\u662f\\"23\\"\uff0c\u4f60\u4e0d\u80fd\u7b80\u5355\u5730\u7528\u5c0f\u952e\u76d8\u952e\u5165\\"23\\"\uff0c\u800c\u662f\u5fc5\u987b\u9009\u62e9\u70b9\u51fb\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a2\u548c3\u5bf9\u5e94\u4f4d\u7f6e\u7684\u503c\u3002"},"create-tx":{"title":"\u521b\u5efa\u4ea4\u6613","upper-text":"\u8bf7\u786e\u8ba4\u4ee5\u4e0b\u6570\u636e\u662f\u5426\u4e0e\u4f60\u8981\u53d1\u9001\u7684\u4ea4\u6613\u4ee5\u53ca\u786c\u4ef6\u94b1\u5305\u663e\u793a\u7684\u4ea4\u6613\u5b8c\u5168\u5339\u914d\uff0c\u7136\u540e\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c:","lower-text":"\u5982\u679c\u4efb\u4f55\u6570\u636e\u4e0e\u786c\u4ef6\u94b1\u5305\u663e\u793a\u7684\u5185\u5bb9\u6216\u60a8\u5e0c\u671b\u53d1\u9001\u7684\u4ea4\u6613\u4e0d\u7b26\uff0c\u8bf7\u53d6\u6d88\u786c\u4ef6\u94b1\u5305\u4e0a\u7684\u64cd\u4f5c.","separator-for-coins-and-hours":"\u548c","separator-to-destination":"\u81f3"},"confirm-address":{"title":"\u786e\u8ba4\u5730\u5740","instructions":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u786e\u8ba4\uff0c\u5982\u679c\u5730\u5740\u4e3a:","short-confirmation":"\u5730\u5740\u5df2\u786e\u8ba4","confirmation":"\u5730\u5740\u5df2\u786e\u8ba4\u3002\u4e3a\u4e86\u5b89\u5168\uff0c\u9009\u62e9 \\"\u786e\u8ba4\u5730\u5740\\" \u9009\u9879\u53ef\u4ee5\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u518d\u6b21\u663e\u793a\u5730\u5740\uff0c\u5728\u83dc\u5355\u4e2d\u53ef\u70b9\u51fb\u5730\u5740\u4f59\u989d\u53f3\u4fa7\u7684\u6309\u94ae\u663e\u793a\u3002"}},"time-from-now":{"few-seconds":"\u51e0\u79d2\u949f\u4e4b\u524d","minute":"\u4e00\u5206\u949f\u4e4b\u524d","minutes":"{{time}} \u5206\u949f\u4e4b\u524d","hour":"\u4e00\u5c0f\u65f6\u4e4b\u524d","hours":"{{time}} \u5c0f\u65f6\u4e4b\u524d","day":"\u4e00\u5929\u4e4b\u524d","days":"{{time}} \u5929\u4e4b\u524d"},"exchange":{"title-and-button":"\u4e70 {{ coinName }}","label-you-send":"\u4f60\u53d1\u9001","label-you-get":"\u4f60\u6536\u5230 (\u5927\u7ea6)","label-to-address":"\u5230 {{coin}} \u5730\u5740","label-price":"\u4ea4\u6613\u6c47\u7387","label-stimate-transaction-time":"\u4ea4\u6613\u65f6\u95f4","exchange-button":"\u4ea4\u6613","min-amount":"\u6700\u5c0f\u6570\u989d:","max-amount":"\u6700\u5927\u6570\u989d:","agree-part1":"\u6211\u540c\u610f","agree-part2":"\u4f7f\u7528\u6761\u6b3e","agree-part3":"\u548c","agree-part4":"\u9690\u79c1\u653f\u7b56","powered-by":"\u6280\u672f\u652f\u6301","need-help":"\u9700\u8981\u5e2e\u52a9?","support-portal":"\u5e2e\u52a9\u5165\u53e3","history":"\u8ba2\u5355\u5386\u53f2","order-not-found":"\u8ba2\u5355\u672a\u627e\u5230","label-status":"\u72b6\u6001","exchanging":"{{from}}\u4ea4\u6613{{to}}","destination-select-from-list-link":"\u9009\u62e9","unavailable":"\u7f51\u9875\u7248\u672c\u6682\u4e0d\u63d0\u4f9b\u4ea4\u6613\u670d\u52a1","offline":"\u4ea4\u6613\u6682\u65f6\u4e0b\u7ebf","problem-connecting":"\u672a\u80fd\u8fde\u63a5\u5230\u670d\u52a1\u5668\u3002\u8bf7\u68c0\u67e5\u4f60\u7684\u7f51\u7edc\u8fde\u63a5\u5e76\u7a0d\u540e\u518d\u8bd5\u3002","invalid-address-error":"\u65e0\u6548\u5730\u5740.","from-coin-error-info":"\u8bf7\u9009\u62e9\u5e01","invalid-value-error-info":"\u65e0\u6548\u7684\u503c.","address-error-info":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740.","statuses":{"user-waiting":"\u7b49\u5f85\u5145\u503c\u3002\u8bf7\u5c06{{amount}} {{from}}\u53d1\u9001\u5230\u4e0b\u9762\u663e\u793a\u7684\u4ea4\u6613\u5730\u5740","user-waiting-info":"\u7cfb\u7edf\u6b63\u5728\u7b49\u5f85\u4f60\u5145\u503c\u5230\u4ea4\u6613\u5730\u5740\u3002\u4ea4\u6613\u5c06\u5728\u7cfb\u7edf\u68c0\u6d4b\u5230\u4f60\u7684\u5145\u503c\u5e76\u5728\u533a\u5757\u94fe\u4e2d\u786e\u8ba4\u540e\u5f00\u59cb\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u5145\u503c\uff0c\u5e94\u8be5\u5f88\u5feb\u5c31\u4f1a\u68c0\u6d4b\u5230\u3002","market-waiting-confirmations":"\u7b49\u5f85\u94fe\u4e0a\u4ea4\u6613\u786e\u8ba4","market-waiting-confirmations-info":"\u5df2\u7ecf\u68c0\u6d4b\u5230\u5145\u503c\uff0c\u7b49\u5f85\u533a\u5757\u94fe\u4e2d\u88ab\u786e\u8ba4\u3002","market-confirmed":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u63a5\u53d7","market-confirmed-info":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u7ecf\u5728\u533a\u5757\u94fe\u4e0a\u786e\u8ba4\u3002\u51c6\u5907\u9a6c\u4e0a\u6267\u884c\u5151\u6362\u3002","market-exchanged":"\u5b8c\u6210{{from}}\u5230{{to}}\u7684\u5151\u6362","market-exchanged-info":"\u5151\u6362\u5df2\u7ecf\u5b8c\u6210\u3002\u8d44\u91d1\u5c06\u5f88\u5feb\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740\u3002","market-withdraw-waiting":"\u6b63\u5728\u53d1\u9001{{to}}\u5230\u4f60\u7684\u5730\u5740","market-withdraw-waiting-info":"\u53d1\u9001{{to}}\u5230\u4f60\u5730\u5740\u7684\u8fdb\u7a0b\u5df2\u542f\u52a8","complete":"\u4ea4\u6613\u5df2\u5b8c\u6210!","complete-info":"\u8d44\u91d1\u5df2\u7ecf\u6210\u529f\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740.","error":"\u53d1\u751f\u9519\u8bef","error-info":"\u8fd0\u8f6c\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u4f60\u53ef\u4ee5\u5728\u4e0b\u9762\u627e\u5230\u66f4\u591a\u4fe1\u606f\u3002\u5982\u679c\u4f60\u9700\u8981\u5e2e\u52a9\uff0c\u8bf7\u4fdd\u5b58\u4e0b\u9762\u663e\u793a\u7684\u6240\u6709\u6570\u636e\u5e76\u4f7f\u7528\u9875\u9762\u53f3\u4e0b\u89d2\u7684\u5e2e\u52a9\u94fe\u63a5\u6765\u8054\u7cfb\u6280\u672f\u652f\u6301.","user-deposit-timeout":"\u7531\u4e8e\u65e0\u6d3b\u52a8\uff0c\u8ba2\u5355\u88ab\u53d6\u6d88.","user-deposit-timeout-info":"\u7cfb\u7edf\u672a\u68c0\u6d4b\u5230\u5145\u503c\uff0c\u8ba2\u5355\u5df2\u53d6\u6d88\uff0c\u8bf7\u91cd\u65b0\u4e0b\u5355\u3002\u5982\u679c\u9700\u8981\u5e2e\u52a9\uff0c\u8bf7\u4fdd\u5b58\u4e0b\u9762\u663e\u793a\u7684\u6240\u6709\u64cd\u4f5c\u6570\u636e\uff0c\u5e76\u4f7f\u7528\u672c\u9875\u53f3\u4e0b\u65b9\u7684\u94fe\u63a5\u4e0e\u6280\u672f\u652f\u6301\u8054\u7cfb."},"history-window":{"title":"\u8ba2\u5355\u5386\u53f2","address":"\u5730\u5740:","date":"\u65e5\u671f:"},"details":{"exchange-addr-label":"\u4ea4\u6613\u5730\u5740","exchange-addr-tag-label":"\u652f\u4ed8ID\u6216\u4ea4\u6613\u5fc5\u987b\u7528\u5230\u7684\u76ee\u6807\u6807\u7b7e","tx-id-label":"\u4ea4\u6613ID","order-id-label":"\u8ba2\u5355ID","initial-price-label":"\u521d\u59cb\u6c47\u7387","error-msg-label":"\u9519\u8bef\u4fe1\u606f ","details-link":"\u8be6\u60c5","start-date-label":"\u5f00\u59cb\u65e5\u671f","back-alert":"\u64cd\u4f5c\u6b63\u5728\u6267\u884c\u3002\u4f60\u771f\u7684\u60f3\u8981\u8fd4\u56de\u5230\u8868\u683c\u5417\uff1f\u4f60\u53ef\u4ee5\u901a\u8fc7\u70b9\u51fb\\"\u8ba2\u5355\u5386\u53f2\\"\u518d\u6b21\u770b\u5230\u6267\u884c\u8fc7\u7a0b"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.a2cdc3b5d1d15440fa16.chunk.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.a2cdc3b5d1d15440fa16.chunk.js new file mode 100644 index 0000000000..ebd2ddab8c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/5.a2cdc3b5d1d15440fa16.chunk.js @@ -0,0 +1 @@ +webpackJsonp([5],{TKku:function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Loading...",new:"New",load:"Load",success:"Success",warning:"Warning","changes-made":"The changes have been made."},errors:{error:"Error","fetch-version":"Unable to fetch latest release version from Github","incorrect-password":"Incorrect password","error-decrypting":"Error decrypting the wallet","api-disabled":"API disabled","no-wallet":"Wallet does not exist","no-outputs":"No unspent outputs","window-size":"The window is too narrow for the content"},title:{language:"Select Language",wallets:"Wallets",send:"Send",history:"History","buy-coin":"Buy Skycoin",network:"Networking",blockchain:"Blockchain",outputs:"Outputs",transactions:"Transactions","pending-txs":"Pending Transactions",backup:"Backup Wallet",explorer:"Skycoin Explorer",seed:"Wallet Seed",reset:"Reset Password",exchange:"Exchange","select-address":"Select Address","order-history":"Order history"},header:{"syncing-blocks":"Syncing blocks",update1:"Wallet update",update2:"available.",synchronizing:"The wallet is synchronizing. Data you see may not be updated.","pending-txs1":"There are some","pending-txs2":"pending transactions.","pending-txs3":"Data you see may not be updated.",errors:{"no-connections":"No connections active, your client is not connected to any other nodes!","no-backend1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend2":"Telegram.","no-backend3":"",csrf:"Security vulnerability: CSRF is not working, please exit immediately."}},password:{title:"Enter Password",label:"Password","confirm-label":"Confirm password",button:"Proceed","reset-link":"I forgot my password"},buy:{"deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address",generate:"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.",send:"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!",receive:"Receive Sky","receive-desc":"After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},wizard:{"wallet-desc":'If you don\'t have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to "Load Wallet" and enter your seed.',"encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a Skywallet?","finish-button":"Finish","back-button":"Back",confirm:{title:"Safeguard your seed!",desc:"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!",checkbox:"It\u2019s safe, I swear.",button:"Continue"}},wallet:{"new-address":"New Address","new-addresses":"New Addresses","show-empty":"Show Empty","hide-empty":"Hide Empty",encrypt:"Encrypt Wallet",decrypt:"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.",delete:"Delete Wallet",edit:"Edit Wallet",add:"Add Wallet",load:"Load Wallet","encryption-enabled":"Encryption enabled","encryption-disabled":"Encryption disabled","hw-security-warning":'Possible security risk. Access the Skywallet options (by pressing the "Skywallet" button below the wallets list) while the device is connected for more information.',wallet:"Wallet","hardware-wallet":"Skywallet","delete-confirmation":'WARNING: The wallet "{{ name }}" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the "Skywallet" button below the wallets list). Do you want to continue?',"delete-confirmation-check":"Yeah, I want to delete the wallet.","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?",new:{"create-title":"Create Wallet","load-title":"Load Wallet","encrypt-title":"Encrypt Wallet","name-label":"Name","words-number":"How many word the seed has","seed-label":"Seed","confirm-seed-label":"Confirm seed","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","create-button":"Create","load-button":"Load","cancel-button":"Cancel","12-words":"12 words","24-words":"24 words","generate-12-seed":"Generate 12 word seed","generate-24-seed":"Generate 24 word seed",encrypt:"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","unconventional-seed-title":"Possible error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed.","synchronizing-warning-title":"Warning","synchronizing-warning-text":"The wallet is still synchronizing and some addresses may not be restored. If some addresses are not restored, please wait for the wallet to be fully synchronized and add them again manually.","synchronizing-warning-continue":"Continue","synchronizing-warning-cancel":"Cancel","wallet-created":"The wallet has been added to the list.",seed:{"enter-seed":"Press here to enter your seed.","change-seed":"Press to change","confirm-seed":"Press here to confirm your seed.","confirmed-seed":"Seed confirmed.","use-custom-seed":"Press here if you want to enter the seed manually.","use-normal-seed":"Press here if you want to enter the seed using the recommended method.","custom-seed-warning-title":"Warning","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","custom-seed-warning-check":"I understand the risks and want to continue","custom-seed-warning-cancel":"Cancel","custom-seed-warning-continue":"Continue","incorrect-word":"The word you have entered does not match the requested one.","invalid-seed":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","new-seed-help":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-help":"Please be sure to enter the correct words in the correct order."}},rename:{title:"Rename Wallet","name-label":"Name","cancel-button":"Cancel","rename-button":"Rename"},"add-addresses":{title:"Select quantity","name-quantity":"How many addresses to create","cancel-button":"Cancel","create-button":"Create",error:"There was an unexpected error. Please try again."},address:{show:"Press to show",copy:"Copy","copy-address":"Copy address",copied:"Copied!",confirm:"Confirm address",outputs:"Unspent outputs",history:"History"}},qr:{title:"QR Code","title-read-only":"QR Code",data:"QR Data:",address:"Address:","request-link":"Request specific amount",amount:"Request amount:",hours:"Request hours:",message:"Message:",invalid:"(invalid value)",copied:"The text has been copied to the clipboard."},send:{"synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer","wallet-label":"Wallet","addresses-label":"Addresses","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins":"send all","no-wallet-selected":"You must select a wallet first.","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","no-coins-left":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown","all-outputs":"All the outputs of the selected addresses","available-msg-part1":"With your current selection you can send up to","available-msg-part2":"and","available-msg-part3":"(at least","available-msg-part4":"must be used for the transaction fee).","change-address-label":"Custom change address","change-address-select":"Select","change-address-help":'Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the "Select" link to choose an address from one of your wallets',"destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins","destinations-help2":"Destination addresses, their coins and coin hours","hours-allocation-label":"Automatic coin hours allocation","options-label":"Options","value-label":"Coin hours share factor","value-help":"The higher the value, the more coin hours will be sent to the recipients and less will be retained","preview-button":"Preview","send-button":"Send","back-button":"Back",simple:"Simple",advanced:"Advanced","select-wallet":"Select Wallet","error-saving-note":"The transaction was successfully sent, but it was not possible to save the note.",sent:"Transaction successfully sent.",total:"Total:","bulk-send":{title:"Bulk Send",indications:'To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the "xyz" address, type "xyz,10,5"; if you want the hours to be calculated automatically, type "xyz,10". Decimal values must be separated with a dot.',process:"Process","error-no-data":"There is no text to process.","error-inconsistent-data":"If you set how many hours you want to send to a destinations, you must do so for all destinations.","error-invalid-data":"The entered text has an invalid format."}},reset:{"wallet-label":"Wallet","seed-label":"Wallet seed","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","reset-button":"Reset",done:"Password successfully changed."},tx:{transaction:"Transaction","confirm-transaction":"Confirm Transaction",from:"From",to:"To",date:"Date",status:"Status",coins:"Coins",hours:"Hours",id:"Tx ID",note:"Note","without-note":"Without note","show-more":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned",inputs:"Inputs",outputs:"Outputs",confirmed:"Confirmed",pending:"Pending","current-rate":"Calculated at the current rate"},"edit-note":{title:"Edit note","cancel-button":"Cancel","change-button":"Change"},backup:{"wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.",desc:"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","close-button":"Close",wallet:"Wallet Label",filename:"Filename",seed:"Seed","show-seed":"Show seed","no-wallets":"No encrypted wallets"},blockchain:{blocks:"Number of blocks",time:"Timestamp of last block",hash:"Hash of last block","current-supply":"Current SKY supply","total-supply":"Total SKY supply","current-coinhour-supply":"Current Coin Hours supply","total-coinhour-supply":"Total Coin Hours supply"},network:{peer:"Peer",source:"Source","block-height":"Block height","block-height-short":"Block","last-seen":"Last seen","last-received":"Last received","last-sent":"Last sent",in:"Incoming",out:"Outgoing",sources:{default:"Default peer",exchange:"Peer exchange"}},"pending-txs":{timestamp:"Timestamp",txid:"Transaction ID",none:"No pending transactions",my:"Mine",all:"All"},history:{"tx-detail":"Transaction Detail",moving:"Internally moving",moved:"Internally moved",sending:"Sending",sent:"Sent",received:"Received",receiving:"Receiving",pending:"Pending",note:"Note","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)",filter:"Active filter: ",filters:"Active filters: ","all-addresses":"All addresses"},teller:{done:"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin",unknown:"Unknown"},confirmation:{"header-text":"Confirmation","confirm-button":"Yes","cancel-button":"No",close:"Close"},service:{api:{"server-error":"Server error"},wallet:{"not-enough-hours":"Not enough available Coin Hours to perform the transaction!"}},"hardware-wallet":{general:{"default-wallet-name":"New Skywallet","error-disconnected":"Unable to perform the operation. The Skywallet is not connected.","simple-error":"Error. Unable to perform the operation.","generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","generic-error-internet":"Unable to perform the operation. Make sure you have connected a valid Skywallet that is not waiting for input and that you have a connection to the internet/node.","error-incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","error-incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.",confirm:"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.",follow:"Please follow the instructions displayed on the Skywallet.",close:"Close",cancel:"Cancel",continue:"Continue",completed:"Operation completed successfully.",refused:"The operation failed or was canceled.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},errors:{"too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet service.",timeout:"The operation was canceled due to inactivity. Please try again.","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{title:"Security warning",text:"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.",link:"Open the Skywallet options window.",check:"I understand the risks and want to continue",continue:"Continue",cancel:"Cancel"},options:{connecting:"Connecting...",disconnected:"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":'A seedless Skywallet has been detected. Select "Configure automatically" if you want to configure it as a brand new wallet and start using it. Select "Restore backup" if you want to configure the Skywallet with a previously created seed backup.',"configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security warnings","security-warning-title":"Security warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":'The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the "Update firmware" option.',"backup-warning":'You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the "Create a backup" option.',"pin-warning":'The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the "Create PIN code" option.',options:"Options:","update-firmware":"Update firmware","configure-automatically":"Configure automatically","restore-backup":"Restore backup","create-backup":"Create a backup",wipe:"Wipe the device","confirm-seed":"Confirm seed","create-pin":"Create PIN code","change-pin":"Change PIN code","delete-pin":"Delete PIN code","forgotten-pin1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{title:"Outdated Firmware",text:"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.",cancel:"Cancel",update:"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.",check:"I understand the risks and want to continue",follow:"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.",timeout:"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.",finished:"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{text:"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.",configuring:"Configuring..."},"restore-seed":{text:"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.",warning:"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: The retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: The seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: The seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},added:{title:"New Skywallet",configuring:"New Skywallet detected. Configuring...",done:"Done",added1:"The connected Skywallet has been added to the wallets list with the following name:",added2:"Now you can check the balance and the addresses of the Skywallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device.",ok:"Ok"},wipe:{warning:"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete":"Also remove from the wallets list"},"create-backup":{warning:'WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the "seed") will be able access the wallet funds, so extreme caution is advised.',instructions:"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{title:"Enter word",info1:"Enter the word shown on the device",info2:"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.",word:"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{warning:"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties in case of loss or theft.",check:"I understand the risks and want to continue"},"enter-pin":{title:"Enter PIN","title-change-current":"Enter the current PIN","title-change-new":"Enter the new PIN","title-change-confirm":"Confirm the new PIN",instructions:"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers.",help:"Need help?"},"pin-help":{title:"Help",part1:"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.",part2:'To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is "23" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.',part3:'If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is "23", you can not simply type "23" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the "7" and "5" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet.'},"create-tx":{title:"Create transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","send-p1":"and","send-p2":"to"},"confirm-address":{title:"Confirm address",instructions:"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.",confirmation:'Address confirmed. For security, you can re-show the address in the Skywallet using the "Confirm address" option, in the menu that you can display by pressing the button at the right of the address balance.'}},"time-from-now":{"few-seconds":"a few seconds ago",minute:"one minute ago",minutes:"{{time}} minutes ago",hour:"one hour ago",hours:"{{time}} hours ago",day:"one day ago",days:"{{time}} days ago"},exchange:{"you-send":"You send","you-get":"You get (approx.)","to-address":"To {{coin}} address",price:"Exchange rate","time-15":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-1":"I agree with","agree-2":"Terms of Use","agree-3":"and","agree-4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal",history:"Order history","order-not-found":"Order not found",status:"Status",exchanging:"Exchanging {{from}} for {{to}}",select:"Select",offline:"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later.","invalid-address":"Invalid address.",statuses:{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.",complete:"Exchange completed!","complete-info":"The funds have been successfully sent to your address.",error:"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{address:"Address",date:"Date"},details:{"exchange-addr":"Exchange address (valid for this exchange operation only)","exchange-addr-tag":"Payment ID or Destination Tag which must be used for the transaction","tx-id":"Transaction ID","order-id":"Order ID","initial-price":"Initial exchange rate","error-msg":"Error message",details:"Details","start-date":"Start date",back:"Back","back-alert":'The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the "Order history" button'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/526.f76257ac8fde4c59c131.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/526.f76257ac8fde4c59c131.js new file mode 100644 index 0000000000..e24ab3008e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/526.f76257ac8fde4c59c131.js @@ -0,0 +1 @@ +(self.webpackChunkdesktopwallet=self.webpackChunkdesktopwallet||[]).push([[526],{61526:function(e){"use strict";e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Loading...","done-title":"Done","warning-title":"Warning","error-title":"Error","changes-made":"The changes have been made.","back-button":"Back","create-button":"Create","load-button":"Load","cancel-button":"Cancel","continue-button":"Continue","close-button":"Close","generic-confirmation-check":"I understand the risks and want to continue","copied":"The text has been copied to the clipboard."},"errors":{"window-size":"The window is too narrow for the content."},"language":{"title":"Select Language"},"header":{"syncing-blocks":"Syncing blocks","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"Wallet update","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"available.","synchronizing":"The wallet is synchronizing. Data you see may not be updated.","pending-txs-part1":"There are some","pending-txs-part2":"pending transactions.","pending-txs-part3":"Data you see may not be updated.","no-connections":"No connections active, your client is not connected to any other nodes!","no-backend-part1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Security vulnerability: CSRF is not working, please exit immediately."}},"password":{"title":"Enter Password","password-label":"Password","password-error-info":"You must enter a password.","confirm-password-label":"Confirm password","confirm-error-info":"The two passwords must match.","proceed-button":"Proceed","reset-link":"I forgot my password","incorrect-password-error":"Incorrect password.","decrypting-error":"Error decrypting the wallet."},"buy":{"title-and-button":"Buy","deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address","generate":"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you\'d like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.","send":"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!","receive":"Receive Sky","receive-desc":"After receiving your Bitcoin, we\'ll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},"wizard":{"create-title":"Create Wallet","create-desc":"If you don\'t have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \\"Load\\" and enter your seed.","encrypt-title":"Encrypt Wallet","encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","finish-temporal-title":"Ready","finish-temporal-desc":"Please click \\"Finish\\" button to create the wallet. Remember that it will be deleted after closing the wallet software.","hardware-wallet-link":"Using a Skywallet?","new-button":"New","load-button":"Load","finish-button":"Finish","confirm":{"title":"Safeguard Your Seed!","desc":"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!","checkbox":"It\u2019s safe, I swear."}},"wallet":{"title-and-button":"Wallets","show-empty-button":"Show Empty","hide-empty-button":"Hide Empty","encrypt-button":"Encrypt Wallet","decrypt-button":"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.","delete-button":"Delete Wallet","rename-button":"Rename","add-button":"New Wallet","load-button":"Load Wallet","hardware-wallet-button":"Skywallet","encryption-enabled":"Encryption enabled.","encryption-disabled":"Encryption disabled.","temporal":"Temporal wallet.","warning-hw-security":"Possible security risk. Access the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list) while the device is connected for more information.","wallet-table-label":"Wallet","hardware-wallet-table-label":"Skywallet","delete-confirmation":"WARNING: The wallet \\"{{ name }}\\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list). Do you want to continue?","delete-confirmation-check":"Yeah, I want to delete the wallet","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?","busy-error":"Please wait for the previous operation to be completed.","new":{"create-title":"Create Wallet","load-title":"Load Wallet","name-label":"Name","name-error-info":"You must enter a name.","words-number-label":"How many words the seed has","seed-label":"Seed","seed-error-info":"You must enter a seed.","confirm-seed-label":"Confirm seed","confirm-seed-error-info":"The two seeds must match.","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","12-words":"12 words","24-words":"24 words","generate-12-help":"Generate a 12 word seed.","generate-24-help":"Generate a 24 word seed.","encrypt-check":"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","advanced-options-link":"Advanced options","close-advanced-error":"It is not possible to close the options because you have made changes to the values.","temporal-check":"Load temporarily","temporal-info":"If you use this option, the wallet will be loaded temporarily, which means that it will be deleted as soon as you close the wallet software.","temporal-warning":"The wallet will be deleted just after closing the wallet software and won\'t have a password. You will needed the seed to recover access to the funds. Are you sure you want to continue?","seed-checking-error":"It was not possible to verify the validity of the seed.","unconventional-seed-title":"Possible Error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed","synchronizing-warning-text":"The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \\"Scan Addresses\\" function or add them again manually.","wallet-created":"The wallet has been added to the list.","seed":{"enter-seed":"Press here to enter the seed","change-seed":"Press to change","confirm-seed":"Press here to confirm the seed","confirmed-seed":"Seed confirmed","use-custom":"Enter the seed manually","use-normal":"Enter the seed using the recommended method","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","incorrect-word-error":"The word you have entered does not match the requested one.","invalid-seed-error":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","word-error-info":"You must enter a word.","new-seed-info":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-info":"Please be sure to enter the correct words in the correct order."}},"rename":{"title":"Rename Wallet","name-label":"Name","label-error-info":"You must enter a name.","rename-button":"Rename"},"address-options":{"title":"Addresses","new":"New Addresses","scan":"Scan Addresses","scan-help":"Use this option to make the system find already used addresses from this wallet which are missing from the list."},"scan-addresses":{"done-with-new-addresses":"The list has been updated.","done-without-new-addresses":"No new addresses were found."},"add-addresses":{"title":"Select Quantity","quantity-label":"How many addresses to create","quantity-error-info":"You must enter a value between 1 and 100.","error":"There was an unexpected error. Please try again."},"address":{"show":"Press to show","copy":"Copy","copy-address":"Copy address","copied":"Copied!","confirm":"Confirm address","outputs":"Unspent outputs","history":"History"}},"qr":{"title":"QR Code","data-label":"QR data","address-label":"Address","request-link":"Request specific amount","amount-label":"Requested amount","hours-label":"Requested hours","message-label":"Message","invalid":"(invalid value)"},"send":{"title-and-button":"Send","unsigned-button":"Unsigned","signed-button":"Signed","unsigned-confirmation":"The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?","synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.","wallet-label":"Wallet","wallet-error-info":"You must select a wallet.","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins-link":"send all","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","addresses-label":"Addresses","addresses-error-info":"You must enter at least one valid address.","no-wallet-selected-error":"There are no coins to send.","no-coins-left-error":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent.","addresses-manual-help":"List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.","outputs-error":"There was an error trying to get the outputs. Please make sure you have entered valid addresses.","all-outputs":"All the outputs of the selected addresses","enter-addresses-for-outputs":"Valid addresses must be entered first","enter-wallet-for-outputs-and-addresses":"A valid wallet must be selected first","invalid-addresses-for-outputs":"No outputs available","available-funds-msg-part1":"With your current selection you can send up to","available-funds-msg-part2":"and","available-funds-msg-part3":"(at least","available-funds-msg-part4":"must be used as transaction fee for sending all the coins or hours).","change-address-label":"Custom change address","change-address-error-info":"The change address is not valid.","change-address-select-from-list-link":"Select","change-address-help":"Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the \\"Select\\" link to choose an address from one of your wallets.","specific-hours":"Hours to send:","remove-specific-hours-info":"Remove.","remove-specific-hours-confirmation":"Are you sure you want to remove the specific amount of hours to send?","destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins.","destinations-help2":"Destination addresses, their coins and hours.","destination-tools-title":"Destination Tools","hours-allocation-check":"Use automatic {{ coinHoursName }} allocation","options-link":"Options","coin-hours-options-link":"Hours options","hours-share-factor-label":"{{ coinHoursName }} share factor","hours-share-factor-help":"This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.","close-hours-share-factor-alert":"The option will be resetted to the default value. Are you sure you want to continue?","preview-button":"Preview","send-button":"Send","show-button":"Show","simple-form-button":"Simple","advanced-form-button":"Advanced","select-wallet":"Select wallet","saving-note-error":"The transaction was successfully sent, but it was not possible to save the note.","sent":"Transaction successfully sent.","total-to-send":"Total:","invalid-address-error":"The destination address is not valid.","one-invalid-address-error":"One of the destination addresses is not valid.","various-invalid-addresses-error":"Some destination addresses are not valid.","all-addresses-invalid-error":"The destination addresses are not valid.","invalid-addresses-error":"Please make sure the address is valid.","address-error-info":"Please enter a valid address.","invalid-value-error-info":"Invalid value.","insufficient-funds-error-info":"The entered value is greater than the available balance.","sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","advanced-sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","sending-all-hours-waning":"You selected to send all the hours. Are you sure you want to continue?","high-hours-share-waning":"Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?","advanced-high-hours-share-waning":"Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?","fill-with-link":{"title":"Use a Transaction Link","link-info":"Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.","link-label":"Transaction link","link-error-info":"You must enter a valid transaction link.","process-button":"Process","invalid-link-error":"The contents of the transaction link are not valid.","invalid-link-hours-error":"The transaction link contains an invalid amount of hours.","data-overwritten-alert":"Some data you have entered will be overwritten. Are you sure you want to continue?","confirmation":"The form has been updated with the data obtained from the transaction link."},"known-node-errors":{"null-change-address-error":"The null address can\'t be used as the custom change address. Please enter a valid address.","to-required-error":"You must provide a destination address for sending coins. Please enter a valid address.","zero-coins-error":"It\'s not possible to send zero coins. Please enter a valid amount.","null-destination-error":"The null address can\'t be used as destination. Please enter a valid address.","duplicate-destination-error":"There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.","hours-in-automatic-mode-error":"Specific hour amounts can\'t be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-needed-error":"The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.","invalid-hours-allocation-mode-error":"Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-not-needed-error":"The hour allocation mode can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-hours-mode-error":"Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.","share-factor-needed-error":"The hours share factor is needed. Please try with different values and contact support if the problem is not solved.","share-factor-not-needed-error":"The hours share factor can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-share-factor-error":"Invalid share factor. Please try with different values and contact support if the problem is not solved.","change-equal-to-destination-error":"The transaction can\'t be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.","repeated-wallet":"A wallet for the specified seed already exists."},"bulk-send":{"title":"Bulk Send","indications":"To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \\"xyz\\" address, type \\"xyz,10,5\\"; if you want the hours to be calculated automatically, type \\"xyz,10\\". Decimal values must be separated with a dot.","data-error-info":"You must enter a value.","process-button":"Process","no-data-error":"There is no text to process.","inconsistent-data-error":"If you set how many hours you want to send to a destination, you must do so for all destinations.","invalid-data-error":"The entered text has an invalid format."}},"select-address":{"title":"Select Address","no-addresses":"There are no confirmed addresses on this wallet."},"offline-transactions":{"loading-problem":"Error trying to get the necessary data","wallet-error-info":"You must select a wallet.","tx-error-info":"You must enter a valid transaction text.","copy-tx":{"signed-title":"Signed Transaction","unsigned-title":"Unsigned Transaction","text-unsigned":"This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \\"Sign Transaction\\" option.","text-signed":"This is the signed transaction. You can send it to the network using the \\"Broadcast Transaction\\" option.","input-label":"Transaction text","copy-button":"Copy","reset-confirmation":"Do you want the the form to be cleaned, so you can create another transaction?","reset-done":"The form has been cleaned."},"sign-tx":{"title":"Sign Transaction","text":"Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.","wallet-label":"Wallet","select-wallet":"Select wallet","input-label":"Transaction text","sign-button":"Sign","signed":"The transaction has been signed."},"broadcast-tx":{"title":"Broadcast Transaction","text":"Use this form to send a signed transaction to the network.","input-label":"Transaction text","send-button":"Send","sent":"The transaction has been sent."}},"reset":{"title":"Reset Password","wallet-label":"Wallet","seed-label":"Wallet seed","seed-error-info":"You must enter a seed.","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","confirm-error-info":"The two passwords must match.","reset-button":"Reset","done":"Password successfully changed."},"tx":{"transaction-title":"Transaction","confirm-transaction-title":"Confirm Transaction","from-small-label":"From:","to-small-label":"To:","date-small-label":"Date:","status-small-label":"Status:","coins-small-label":"Coins:","hours-small-label":"Hours:","id-small-label":"Tx ID:","note-small-label":"Note:","without-note":"Without note","show-more-link":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned","inputs-title":"Inputs","outputs-title":"Outputs","confirmed-transaction":"Confirmed","pending-transaction":"Pending","current-rate-help":"Calculated at the current rate."},"edit-note":{"title":"Edit Note","change-button":"Change"},"backup":{"title":"Backup Wallet","wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.","desc":"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","wallet-table-label":"Wallet name","filename-table-label":"Filename","save-addresses-button":"Save Addresses","show-seed-button":"Show Seed","no-wallets":"There are no wallets","unencrypted-info":"For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.","hw-wallet-info":"For getting the seed of a Skywallet, please use the \\"Skywallet\\" option at the bottom of the wallets page.","not-compatible-error":"Your web browser is not compatible with this function.","seed-modal-window":{"title":"Wallet Seed","seed-label":"Seed"}},"blockchain":{"title":"Blockchain","blocks-label":"Number of blocks","time-label":"Timestamp of last block","hash-label":"Hash of last block","current-supply-label":"Current {{ coinName }} supply","total-supply-label":"Total {{ coinName }} supply","current-coinhour-supply-label":"Current {{ coinHoursName }} supply","total-coinhour-supply-label":"Total {{ coinHoursName }} supply"},"network":{"title":"Networking","error-no-connections":"No connections","peer-small-table-label":"Peer","source-small-table-label":"Source","block-height-small-table-label":"Block height","block-height-short-small-table-label":"Block","last-seen-small-table-label":"Last seen","last-received-help":"Last received.","last-sent-help":"Last sent.","in-help":"Incoming.","out-help":"Outgoing.","sources":{"default":"Default peer","exchange":"Peer exchange"}},"pending-txs":{"title":"Pending Transactions","timestamp-table-label":"Timestamp","txid-table-label":"Transaction ID","none":"No pending transactions","my-transactions-button":"Mine","all-transactions-button":"All"},"outputs":{"title":"Outputs","error-no-outputs":"No unspent outputs"},"history":{"title-and-button":"History","tx-detail-title":"Transaction Detail","moving":"Internally moving {{ coinName }}","moved":"Internally moved {{ coinName }}","sending":"Sending {{ coinName }}","sent":"Sent {{ coinName }}","received":"Received {{ coinName }}","receiving":"Receiving {{ coinName }}","pending-indication":"Pending","transaction-note-small-label":"Note:","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)","filter":"Active filter: ","filters":"Active filters: ","all-addresses":"All addresses","view-all":"View all {{ number }} transactions"},"teller":{"done":"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin","unknown":"Unknown"},"confirmation":{"default-title":"Confirmation","yes-button":"Yes","no-button":"No"},"service":{"api":{"no-internet-error":"You do not have a internet connection or the node has stopped working.","incorrect-password-error":"Incorrect password.","unknown-error":"It was not possible to perform the operation.","api-disabled-error":"API disabled."}},"force-skywallet-wipe":{"title":"Forced Skywallet Wipe","operation-warning":"This option is designed only as a last resort for cases where the device cannot be used with the normal options. All data on the device will be erased, so you will need your seed to recover the funds.","proceed-button":"Proceed"},"hardware-wallet":{"general":{"default-wallet-name":"New Skywallet","confirm":"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.","follow":"Please follow the instructions displayed on the Skywallet.","completed":"Operation completed successfully.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},"errors":{"generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","disconnected":"Unable to perform the operation. The Skywallet is not connected.","incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.","refused":"The operation was canceled.","too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ","timeout":"The operation was canceled due to inactivity. Please try again.","timeout-with-configurable-link":"The operation was canceled due to inactivity. Please try again. If this issue prevents the device from being usable, you can use the following option:","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{"title":"Security Warning","text":"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.","link":"Open the Skywallet options window."},"options":{"connecting":"Connecting...","disconnected":"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":"A seedless Skywallet has been detected. Select \\"Configure Automatically\\" if you want to configure it as a brand new wallet and start using it. Select \\"Restore Backup\\" if you want to configure the Skywallet with a previously created seed backup.","configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security Warnings","security-warning-title":"Security Warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":"The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \\"Update Firmware\\" option.","backup-warning":"You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \\"Create a Backup\\" option.","pin-warning":"The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \\"Create PIN Code\\" option.","options":"Options:","update-firmware":"Update Firmware","configure-automatically":"Configure Automatically","restore-backup":"Restore Backup","create-backup":"Create a Backup","wipe":"Wipe the Device","confirm-seed":"Confirm Seed","create-pin":"Create PIN Code","change-pin":"Change PIN Code","delete-pin":"Delete PIN Code","forgotten-pin-part1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin-part2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{"title":"Outdated Firmware","text":"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.","update":"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.","follow":"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.","timeout":"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.","finished":"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{"text":"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.","configuring":"Configuring..."},"restore-seed":{"text":"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.","warning":"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: the retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: the seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: the seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},"added":{"title":"New Skywallet","configuring":"New Skywallet detected. Configuring...","done":"Done","added1":"The connected Skywallet has been added to the wallets list with the following name:","added2":"Now you can check the balance and the addresses of the Skywallet even when it is not connected.","added-error-info":"You must enter a name.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device."},"wipe":{"warning":"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete-check":"Also remove from the wallets list"},"create-backup":{"warning":"WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \\"seed\\") will be able access the wallet funds, so extreme caution is advised.","instructions":"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{"title":"Enter Word","enter-word":"Enter the word shown on the device","info":"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.","word-label":"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{"warning":"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties."},"enter-pin":{"title":"Enter PIN","title-change-current":"Enter the Current PIN","title-change-new":"Enter the New PIN","title-change-confirm":"Confirm the New PIN","instructions-generic":"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.","help":"Need help?"},"pin-help":{"title":"Help","part1":"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.","part2":"To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \\"23\\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.","part3":"If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \\"23\\", you can not simply type \\"23\\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \\"7\\" and \\"5\\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet."},"create-tx":{"title":"Create Transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","separator-for-coins-and-hours":"and","separator-to-destination":"to"},"confirm-address":{"title":"Confirm Address","instructions":"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.","confirmation":"Address confirmed. For security, you can re-show the address in the Skywallet using the \\"Confirm address\\" option, in the menu that you can display by pressing the button at the right of the address balance."}},"time-from-now":{"few-seconds":"a few seconds ago","minute":"one minute ago","minutes":"{{time}} minutes ago","hour":"one hour ago","hours":"{{time}} hours ago","day":"one day ago","days":"{{time}} days ago"},"exchange":{"title-and-button":"Buy {{ coinName }}","label-you-send":"You send","label-you-get":"You get (approx.)","label-to-address":"To {{coin}} address","label-price":"Exchange rate","label-stimate-transaction-time":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-part1":"I agree with the","agree-part2":"Terms of Use","agree-part3":"and the","agree-part4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal","history":"Order history","order-not-found":"Order not found","label-status":"Status","exchanging":"Exchanging {{from}} for {{to}}","destination-select-from-list-link":"Select","unavailable":"The exchange service is not available in the portable version","offline":"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later","invalid-address-error":"Invalid address.","from-coin-error-info":"You must select a coin.","invalid-value-error-info":"Invalid value.","address-error-info":"Please enter a valid address.","statuses":{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.","complete":"Exchange completed!","complete-info":"The funds have been successfully sent to your address.","error":"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{"title":"Order History","address":"Address:","date":"Date:"},"details":{"exchange-addr-label":"Exchange address (valid for this exchange operation only)","exchange-addr-tag-label":"Payment ID or Destination Tag which must be used for the transaction","tx-id-label":"Transaction ID","order-id-label":"Order ID","initial-price-label":"Initial exchange rate","error-msg-label":"Error message","details-link":"Details","start-date-label":"Start date","back-alert":"The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \\"Order history\\" button"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.86e4e580e25082578bb8.chunk.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.86e4e580e25082578bb8.chunk.js new file mode 100644 index 0000000000..cae7ef3219 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.86e4e580e25082578bb8.chunk.js @@ -0,0 +1 @@ +webpackJsonp([6],{flj1:function(e,a){e.exports={list:["abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual","adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange","arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become","beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray","better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush","board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss","bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call","calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino","castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle","citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client","cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine","come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider","control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle","craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal","debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama","drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody","embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless","endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape","essay","essence","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit","exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure","file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock","floor","flower","fluid","flush","fly","foam","focus","fog","foil","fold","follow","food","foot","force","forest","forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile","frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen","fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy","gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp","gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture","ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance","glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue","goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown","grab","grace","grain","grant","grape","grass","gravity","great","green","grid","grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt","guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy","harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health","heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden","high","hill","hint","hip","hire","history","hobby","hockey","hold","hole","holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital","host","hotel","hour","hover","hub","huge","human","humble","humor","hundred","hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea","identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune","impact","impose","improve","impulse","inch","include","income","increase","index","indicate","indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury","inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install","intact","interest","into","invest","invite","involve","iron","island","isolate","issue","item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel","job","join","joke","journey","joy","judge","juice","jump","jungle","junior","junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney","kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife","knock","know","lab","label","labor","ladder","lady","lake","lamp","language","laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit","layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal","legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level","liar","liberty","library","license","life","lift","light","like","limb","limit","link","lion","liquid","list","little","live","lizard","load","loan","lobster","local","lock","logic","lonely","long","loop","lottery","loud","lounge","love","loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad","magic","magnet","maid","mail","main","major","make","mammal","man","manage","mandate","mango","mansion","manual","maple","marble","march","margin","marine","market","marriage","mask","mass","master","match","material","math","matrix","matter","maximum","maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt","member","memory","mention","menu","mercy","merge","merit","merry","mesh","message","metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor","minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile","model","modify","mom","moment","monitor","monkey","monster","month","moon","moral","more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie","much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual","myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature","near","neck","need","negative","neglect","neither","nephew","nerve","nest","net","network","neutral","never","news","next","nice","night","noble","noise","nominee","noodle","normal","north","nose","notable","note","nothing","notice","novel","now","nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe","obtain","obvious","occur","ocean","october","odor","off","offer","office","often","oil","okay","old","olive","olympic","omit","once","one","onion","online","only","open","opera","opinion","oppose","option","orange","orbit","orchard","order","ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output","outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact","paddle","page","pair","palace","palm","panda","panel","panic","panther","paper","parade","parent","park","parrot","party","pass","patch","path","patient","patrol","pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen","penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo","phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot","pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate","play","please","pledge","pluck","plug","plunge","poem","poet","point","polar","pole","police","pond","pony","pool","popular","portion","position","possible","post","potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare","present","pretty","prevent","price","pride","primary","print","priority","prison","private","prize","problem","process","produce","profit","program","project","promote","proof","property","prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin","punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle","pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit","raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp","ranch","random","range","rapid","rare","rate","rather","raven","raw","razor","ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle","reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release","relief","rely","remain","remember","remind","remove","render","renew","rent","reopen","repair","repeat","replace","report","require","rescue","resemble","resist","resource","response","result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib","ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot","ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket","romance","roof","rookie","room","rose","rotate","rough","round","route","royal","rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness","safe","sail","salad","salmon","salon","salt","salute","same","sample","sand","satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter","scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script","scrub","sea","search","season","seat","second","secret","section","security","seed","seek","segment","select","sell","seminar","senior","sense","sentence","series","service","session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell","sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop","short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side","siege","sight","sign","silent","silk","silly","silver","similar","simple","since","sing","siren","sister","situate","six","size","skate","sketch","ski","skill","skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight","slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth","snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda","soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry","sort","soul","sound","soup","source","south","space","spare","spatial","spawn","speak","special","speed","spell","spend","sphere","spice","spider","spike","spin","spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring","spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp","stand","start","state","stay","steak","steel","stem","step","stereo","stick","still","sting","stock","stomach","stone","stool","story","stove","strategy","street","strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway","success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny","sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey","suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim","swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag","tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi","teach","team","tell","ten","tenant","tennis","tent","term","test","text","thank","that","theme","then","theory","there","they","thing","this","thought","three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber","time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler","toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool","tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist","toward","tower","town","toy","track","trade","traffic","tragic","train","transfer","trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick","trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust","truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle","twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella","unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform","unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade","uphold","upon","upper","upset","urban","urge","usage","use","used","useful","useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van","vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue","verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory","video","view","village","vintage","violin","virtual","virus","visa","visit","visual","vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage","wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash","wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather","web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat","wheel","when","where","whip","whisper","wide","width","wife","wild","will","win","window","wine","wing","wink","winner","winter","wire","wisdom","wise","wish","witness","wolf","woman","wonder","wood","wool","word","work","world","worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year","yellow","you","young","youth","zebra","zero","zone","zoo"]}}}); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.ba3a26d3a7fe46a61514.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.ba3a26d3a7fe46a61514.js new file mode 100644 index 0000000000..bfe7ff388c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.ba3a26d3a7fe46a61514.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{mJbx:function(e){e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Loading...","done-title":"Done","warning-title":"Warning","error-title":"Error","changes-made":"The changes have been made.","back-button":"Back","create-button":"Create","load-button":"Load","cancel-button":"Cancel","continue-button":"Continue","close-button":"Close","generic-confirmation-check":"I understand the risks and want to continue","copied":"The text has been copied to the clipboard."},"errors":{"window-size":"The window is too narrow for the content."},"language":{"title":"Select Language"},"header":{"syncing-blocks":"Syncing blocks","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"Wallet update","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"available.","synchronizing":"The wallet is synchronizing. Data you see may not be updated.","pending-txs-part1":"There are some","pending-txs-part2":"pending transactions.","pending-txs-part3":"Data you see may not be updated.","no-connections":"No connections active, your client is not connected to any other nodes!","no-backend-part1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Security vulnerability: CSRF is not working, please exit immediately."}},"password":{"title":"Enter Password","password-label":"Password","password-error-info":"You must enter a password.","confirm-password-label":"Confirm password","confirm-error-info":"The two passwords must match.","proceed-button":"Proceed","reset-link":"I forgot my password","incorrect-password-error":"Incorrect password.","decrypting-error":"Error decrypting the wallet."},"buy":{"title-and-button":"Buy","deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address","generate":"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you\'d like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.","send":"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!","receive":"Receive Sky","receive-desc":"After receiving your Bitcoin, we\'ll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},"wizard":{"create-title":"Create Wallet","create-desc":"If you don\'t have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \\"Load\\" and enter your seed.","encrypt-title":"Encrypt Wallet","encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a Skywallet?","new-button":"New","load-button":"Load","finish-button":"Finish","confirm":{"title":"Safeguard Your Seed!","desc":"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!","checkbox":"It\u2019s safe, I swear."}},"wallet":{"title-and-button":"Wallets","show-empty-button":"Show Empty","hide-empty-button":"Hide Empty","encrypt-button":"Encrypt Wallet","decrypt-button":"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.","delete-button":"Delete Wallet","edit-button":"Rename","add-button":"Add Wallet","load-button":"Load Wallet","hardware-wallet-button":"Skywallet","encryption-enabled":"Encryption enabled.","encryption-disabled":"Encryption disabled.","warning-hw-security":"Possible security risk. Access the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list) while the device is connected for more information.","wallet-table-label":"Wallet","hardware-wallet-table-label":"Skywallet","delete-confirmation":"WARNING: The wallet \\"{{ name }}\\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list). Do you want to continue?","delete-confirmation-check":"Yeah, I want to delete the wallet","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?","new":{"create-title":"Create Wallet","load-title":"Load Wallet","name-label":"Name","name-error-info":"You must enter a name.","words-number-label":"How many words the seed has","seed-label":"Seed","seed-error-info":"You must enter a seed.","confirm-seed-label":"Confirm seed","confirm-seed-error-info":"The two seeds must match.","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","12-words":"12 words","24-words":"24 words","generate-12-help":"Generate a 12 word seed.","generate-24-help":"Generate a 24 word seed.","encrypt-check":"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","seed-checking-error":"It was not possible to verify the validity of the seed.","unconventional-seed-title":"Possible Error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed","synchronizing-warning-text":"The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \\"Scan Addresses\\" function or add them again manually.","wallet-created":"The wallet has been added to the list.","seed":{"enter-seed":"Press here to enter the seed","change-seed":"Press to change","confirm-seed":"Press here to confirm the seed","confirmed-seed":"Seed confirmed","use-custom":"Enter the seed manually","use-normal":"Enter the seed using the recommended method","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","incorrect-word-error":"The word you have entered does not match the requested one.","invalid-seed-error":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","word-error-info":"You must enter a word.","new-seed-info":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-info":"Please be sure to enter the correct words in the correct order."}},"rename":{"title":"Rename Wallet","name-label":"Name","label-error-info":"You must enter a name.","rename-button":"Rename"},"address-options":{"title":"Addresses","new":"New Addresses","scan":"Scan Addresses","scan-help":"Use this option to make the system find already used addresses from this wallet which are missing from the list."},"scan-addresses":{"done-with-new-addresses":"The list has been updated.","done-without-new-addresses":"No new addresses were found."},"add-addresses":{"title":"Select Quantity","quantity-label":"How many addresses to create","quantity-error-info":"You must enter a value between 1 and 100.","error":"There was an unexpected error. Please try again."},"address":{"show":"Press to show","copy":"Copy","copy-address":"Copy address","copied":"Copied!","confirm":"Confirm address","outputs":"Unspent outputs","history":"History"}},"qr":{"title":"QR Code","data-label":"QR data","address-label":"Address","request-link":"Request specific amount","amount-label":"Requested amount","hours-label":"Requested hours","message-label":"Message","invalid":"(invalid value)"},"send":{"title-and-button":"Send","unsigned-button":"Unsigned","signed-button":"Signed","unsigned-confirmation":"The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?","synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.","wallet-label":"Wallet","wallet-error-info":"You must select a wallet.","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins-link":"send all","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","addresses-label":"Addresses","addresses-error-info":"You must enter at least one valid address.","no-wallet-selected-error":"There are no coins to send.","no-coins-left-error":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent.","addresses-manual-help":"List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.","outputs-error":"There was an error trying to get the outputs. Please make sure you have entered valid addresses.","all-outputs":"All the outputs of the selected addresses","enter-addresses-for-outputs":"Valid addresses must be entered first","enter-wallet-for-outputs-and-addresses":"A valid wallet must be selected first","invalid-addresses-for-outputs":"No outputs available","available-funds-msg-part1":"With your current selection you can send up to","available-funds-msg-part2":"and","available-funds-msg-part3":"(at least","available-funds-msg-part4":"must be used as transaction fee for sending all the coins or hours).","change-address-label":"Custom change address","change-address-error-info":"The change address is not valid.","change-address-select-from-list-link":"Select","change-address-help":"Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the \\"Select\\" link to choose an address from one of your wallets.","specific-hours":"Hours to send:","remove-specific-hours-info":"Remove.","remove-specific-hours-confirmation":"Are you sure you want to remove the specific amount of hours to send?","destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins.","destinations-help2":"Destination addresses, their coins and hours.","destination-tools-title":"Destination Tools","hours-allocation-check":"Use automatic {{ coinHoursName }} allocation","options-link":"Options","coin-hours-options-link":"Hours options","hours-share-factor-label":"{{ coinHoursName }} share factor","hours-share-factor-help":"This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.","close-hours-share-factor-alert":"The option will be resetted to the default value. Are you sure you want to continue?","preview-button":"Preview","send-button":"Send","show-button":"Show","simple-form-button":"Simple","advanced-form-button":"Advanced","select-wallet":"Select wallet","saving-note-error":"The transaction was successfully sent, but it was not possible to save the note.","sent":"Transaction successfully sent.","total-to-send":"Total:","invalid-address-error":"The destination address is not valid.","one-invalid-address-error":"One of the destination addresses is not valid.","various-invalid-addresses-error":"Some destination addresses are not valid.","all-addresses-invalid-error":"The destination addresses are not valid.","invalid-addresses-error":"Please make sure the address is valid.","address-error-info":"Please enter a valid address.","invalid-value-error-info":"Invalid value.","insufficient-funds-error-info":"The entered value is greater than the available balance.","sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","advanced-sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","sending-all-hours-waning":"You selected to send all the hours. Are you sure you want to continue?","high-hours-share-waning":"Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?","advanced-high-hours-share-waning":"Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?","fill-with-link":{"title":"Use a Transaction Link","link-info":"Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.","link-label":"Transaction link","link-error-info":"You must enter a valid transaction link.","process-button":"Process","invalid-link-error":"The contents of the transaction link are not valid.","invalid-link-hours-error":"The transaction link contains an invalid amount of hours.","data-overwritten-alert":"Some data you have entered will be overwritten. Are you sure you want to continue?","confirmation":"The form has been updated with the data obtained from the transaction link."},"known-node-errors":{"null-change-address-error":"The null address can\'t be used as the custom change address. Please enter a valid address.","to-required-error":"You must provide a destination address for sending coins. Please enter a valid address.","zero-coins-error":"It\'s not possible to send zero coins. Please enter a valid amount.","null-destination-error":"The null address can\'t be used as destination. Please enter a valid address.","duplicate-destination-error":"There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.","hours-in-automatic-mode-error":"Specific hour amounts can\'t be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-needed-error":"The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.","invalid-hours-allocation-mode-error":"Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-not-needed-error":"The hour allocation mode can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-hours-mode-error":"Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.","share-factor-needed-error":"The hours share factor is needed. Please try with different values and contact support if the problem is not solved.","share-factor-not-needed-error":"The hours share factor can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-share-factor-error":"Invalid share factor. Please try with different values and contact support if the problem is not solved.","change-equal-to-destination-error":"The transaction can\'t be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.","repeated-wallet":"A wallet for the specified seed already exists."},"bulk-send":{"title":"Bulk Send","indications":"To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \\"xyz\\" address, type \\"xyz,10,5\\"; if you want the hours to be calculated automatically, type \\"xyz,10\\". Decimal values must be separated with a dot.","data-error-info":"You must enter a value.","process-button":"Process","no-data-error":"There is no text to process.","inconsistent-data-error":"If you set how many hours you want to send to a destination, you must do so for all destinations.","invalid-data-error":"The entered text has an invalid format."}},"select-address":{"title":"Select Address","no-addresses":"There are no confirmed addresses on this wallet."},"offline-transactions":{"loading-problem":"Error trying to get the necessary data","wallet-error-info":"You must select a wallet.","tx-error-info":"You must enter a valid transaction text.","copy-tx":{"signed-title":"Signed Transaction","unsigned-title":"Unsigned Transaction","text-unsigned":"This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \\"Sign Transaction\\" option.","text-signed":"This is the signed transaction. You can send it to the network using the \\"Broadcast Transaction\\" option.","input-label":"Transaction text","copy-button":"Copy","reset-confirmation":"Do you want the the form to be cleaned, so you can create another transaction?","reset-done":"The form has been cleaned."},"sign-tx":{"title":"Sign Transaction","text":"Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.","wallet-label":"Wallet","select-wallet":"Select wallet","input-label":"Transaction text","sign-button":"Sign","signed":"The transaction has been signed."},"broadcast-tx":{"title":"Broadcast Transaction","text":"Use this form to send a signed transaction to the network.","input-label":"Transaction text","send-button":"Send","sent":"The transaction has been sent."}},"reset":{"title":"Reset Password","wallet-label":"Wallet","seed-label":"Wallet seed","seed-error-info":"You must enter a seed.","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","confirm-error-info":"The two passwords must match.","reset-button":"Reset","done":"Password successfully changed."},"tx":{"transaction-title":"Transaction","confirm-transaction-title":"Confirm Transaction","from-small-label":"From:","to-small-label":"To:","date-small-label":"Date:","status-small-label":"Status:","coins-small-label":"Coins:","hours-small-label":"Hours:","id-small-label":"Tx ID:","note-small-label":"Note:","without-note":"Without note","show-more-link":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned","inputs-title":"Inputs","outputs-title":"Outputs","confirmed-transaction":"Confirmed","pending-transaction":"Pending","current-rate-help":"Calculated at the current rate."},"edit-note":{"title":"Edit Note","change-button":"Change"},"backup":{"title":"Backup Wallet","wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.","desc":"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","wallet-table-label":"Wallet name","filename-table-label":"Filename","save-addresses-button":"Save Addresses","show-seed-button":"Show Seed","no-wallets":"There are no wallets","unencrypted-info":"For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.","hw-wallet-info":"For getting the seed of a Skywallet, please use the \\"Skywallet\\" option at the bottom of the wallets page.","not-compatible-error":"Your web browser is not compatible with this function.","seed-modal-window":{"title":"Wallet Seed","seed-label":"Seed"}},"blockchain":{"title":"Blockchain","blocks-label":"Number of blocks","time-label":"Timestamp of last block","hash-label":"Hash of last block","current-supply-label":"Current {{ coinName }} supply","total-supply-label":"Total {{ coinName }} supply","current-coinhour-supply-label":"Current {{ coinHoursName }} supply","total-coinhour-supply-label":"Total {{ coinHoursName }} supply"},"network":{"title":"Networking","peer-small-table-label":"Peer","source-small-table-label":"Source","block-height-small-table-label":"Block height","block-height-short-small-table-label":"Block","last-seen-small-table-label":"Last seen","last-received-help":"Last received.","last-sent-help":"Last sent.","in-help":"Incoming.","out-help":"Outgoing.","sources":{"default":"Default peer","exchange":"Peer exchange"}},"pending-txs":{"title":"Pending Transactions","timestamp-table-label":"Timestamp","txid-table-label":"Transaction ID","none":"No pending transactions","my-transactions-button":"Mine","all-transactions-button":"All"},"outputs":{"title":"Outputs","error-no-outputs":"No unspent outputs"},"history":{"title-and-button":"History","tx-detail-title":"Transaction Detail","moving":"Internally moving {{ coinName }}","moved":"Internally moved {{ coinName }}","sending":"Sending {{ coinName }}","sent":"Sent {{ coinName }}","received":"Received {{ coinName }}","receiving":"Receiving {{ coinName }}","pending-indication":"Pending","transaction-note-small-label":"Note:","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)","filter":"Active filter: ","filters":"Active filters: ","all-addresses":"All addresses","view-all":"View all {{ number }} transactions"},"teller":{"done":"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin","unknown":"Unknown"},"confirmation":{"default-title":"Confirmation","yes-button":"Yes","no-button":"No"},"service":{"api":{"no-internet-error":"You do not have a internet connection or the node has stopped working.","incorrect-password-error":"Incorrect password.","unknown-error":"It was not possible to perform the operation.","api-disabled-error":"API disabled."}},"hardware-wallet":{"general":{"default-wallet-name":"New Skywallet","confirm":"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.","follow":"Please follow the instructions displayed on the Skywallet.","completed":"Operation completed successfully.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},"errors":{"generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","disconnected":"Unable to perform the operation. The Skywallet is not connected.","incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.","refused":"The operation failed or was canceled.","too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ","timeout":"The operation was canceled due to inactivity. Please try again.","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{"title":"Security Warning","text":"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.","link":"Open the Skywallet options window."},"options":{"connecting":"Connecting...","disconnected":"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":"A seedless Skywallet has been detected. Select \\"Configure Automatically\\" if you want to configure it as a brand new wallet and start using it. Select \\"Restore Backup\\" if you want to configure the Skywallet with a previously created seed backup.","configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security Warnings","security-warning-title":"Security Warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":"The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \\"Update Firmware\\" option.","backup-warning":"You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \\"Create a Backup\\" option.","pin-warning":"The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \\"Create PIN Code\\" option.","options":"Options:","update-firmware":"Update Firmware","configure-automatically":"Configure Automatically","restore-backup":"Restore Backup","create-backup":"Create a Backup","wipe":"Wipe the Device","confirm-seed":"Confirm Seed","create-pin":"Create PIN Code","change-pin":"Change PIN Code","delete-pin":"Delete PIN Code","forgotten-pin-part1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin-part2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{"title":"Outdated Firmware","text":"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.","update":"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.","follow":"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.","timeout":"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.","finished":"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{"text":"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.","configuring":"Configuring..."},"restore-seed":{"text":"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.","warning":"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: the retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: the seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: the seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},"added":{"title":"New Skywallet","configuring":"New Skywallet detected. Configuring...","done":"Done","added1":"The connected Skywallet has been added to the wallets list with the following name:","added2":"Now you can check the balance and the addresses of the Skywallet even when it is not connected.","added-error-info":"You must enter a name.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device."},"wipe":{"warning":"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete-check":"Also remove from the wallets list"},"create-backup":{"warning":"WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \\"seed\\") will be able access the wallet funds, so extreme caution is advised.","instructions":"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{"title":"Enter Word","enter-word":"Enter the word shown on the device","info":"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.","word-label":"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{"warning":"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties."},"enter-pin":{"title":"Enter PIN","title-change-current":"Enter the Current PIN","title-change-new":"Enter the New PIN","title-change-confirm":"Confirm the New PIN","instructions-generic":"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.","help":"Need help?"},"pin-help":{"title":"Help","part1":"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.","part2":"To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \\"23\\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.","part3":"If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \\"23\\", you can not simply type \\"23\\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \\"7\\" and \\"5\\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet."},"create-tx":{"title":"Create Transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","separator-for-coins-and-hours":"and","separator-to-destination":"to"},"confirm-address":{"title":"Confirm Address","instructions":"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.","confirmation":"Address confirmed. For security, you can re-show the address in the Skywallet using the \\"Confirm address\\" option, in the menu that you can display by pressing the button at the right of the address balance."}},"time-from-now":{"few-seconds":"a few seconds ago","minute":"one minute ago","minutes":"{{time}} minutes ago","hour":"one hour ago","hours":"{{time}} hours ago","day":"one day ago","days":"{{time}} days ago"},"exchange":{"title-and-button":"Buy {{ coinName }}","label-you-send":"You send","label-you-get":"You get (approx.)","label-to-address":"To {{coin}} address","label-price":"Exchange rate","label-stimate-transaction-time":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-part1":"I agree with the","agree-part2":"Terms of Use","agree-part3":"and the","agree-part4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal","history":"Order history","order-not-found":"Order not found","label-status":"Status","exchanging":"Exchanging {{from}} for {{to}}","destination-select-from-list-link":"Select","unavailable":"The exchange service is not available in the portable version","offline":"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later","invalid-address-error":"Invalid address.","from-coin-error-info":"You must select a coin.","invalid-value-error-info":"Invalid value.","address-error-info":"Please enter a valid address.","statuses":{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.","complete":"Exchange completed!","complete-info":"The funds have been successfully sent to your address.","error":"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{"title":"Order History","address":"Address:","date":"Date:"},"details":{"exchange-addr-label":"Exchange address (valid for this exchange operation only)","exchange-addr-tag-label":"Payment ID or Destination Tag which must be used for the transaction","tx-id-label":"Transaction ID","order-id-label":"Order ID","initial-price-label":"Initial exchange rate","error-msg-label":"Error message","details-link":"Details","start-date-label":"Start date","back-alert":"The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \\"Order history\\" button"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.ecbc64c3f043e17d66b5.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.ecbc64c3f043e17d66b5.js new file mode 100644 index 0000000000..16084c3b43 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/6.ecbc64c3f043e17d66b5.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{mJbx:function(e){e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Loading...","done-title":"Done","warning-title":"Warning","error-title":"Error","changes-made":"The changes have been made.","back-button":"Back","create-button":"Create","load-button":"Load","cancel-button":"Cancel","continue-button":"Continue","close-button":"Close","generic-confirmation-check":"I understand the risks and want to continue","copied":"The text has been copied to the clipboard."},"errors":{"window-size":"The window is too narrow for the content."},"language":{"title":"Select Language"},"header":{"syncing-blocks":"Syncing blocks","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"Wallet update","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"available.","synchronizing":"The wallet is synchronizing. Data you see may not be updated.","pending-txs-part1":"There are some","pending-txs-part2":"pending transactions.","pending-txs-part3":"Data you see may not be updated.","no-connections":"No connections active, your client is not connected to any other nodes!","no-backend-part1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Security vulnerability: CSRF is not working, please exit immediately."}},"password":{"title":"Enter Password","password-label":"Password","password-error-info":"You must enter a password.","confirm-password-label":"Confirm password","confirm-error-info":"The two passwords must match.","proceed-button":"Proceed","reset-link":"I forgot my password","incorrect-password-error":"Incorrect password.","decrypting-error":"Error decrypting the wallet."},"buy":{"title-and-button":"Buy","deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address","generate":"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you\'d like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.","send":"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!","receive":"Receive Sky","receive-desc":"After receiving your Bitcoin, we\'ll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},"wizard":{"create-title":"Create Wallet","create-desc":"If you don\'t have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \\"Load\\" and enter your seed.","encrypt-title":"Encrypt Wallet","encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a Skywallet?","new-button":"New","load-button":"Load","finish-button":"Finish","confirm":{"title":"Safeguard Your Seed!","desc":"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!","checkbox":"It\u2019s safe, I swear."}},"wallet":{"title-and-button":"Wallets","show-empty-button":"Show Empty","hide-empty-button":"Hide Empty","encrypt-button":"Encrypt Wallet","decrypt-button":"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.","delete-button":"Delete Wallet","rename-button":"Rename","add-button":"New Wallet","load-button":"Load Wallet","hardware-wallet-button":"Skywallet","encryption-enabled":"Encryption enabled.","encryption-disabled":"Encryption disabled.","warning-hw-security":"Possible security risk. Access the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list) while the device is connected for more information.","wallet-table-label":"Wallet","hardware-wallet-table-label":"Skywallet","delete-confirmation":"WARNING: The wallet \\"{{ name }}\\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \\"Skywallet\\" button below the wallets list). Do you want to continue?","delete-confirmation-check":"Yeah, I want to delete the wallet","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?","busy-error":"Please wait for the previous operation to be completed.","new":{"create-title":"Create Wallet","load-title":"Load Wallet","name-label":"Name","name-error-info":"You must enter a name.","words-number-label":"How many words the seed has","seed-label":"Seed","seed-error-info":"You must enter a seed.","confirm-seed-label":"Confirm seed","confirm-seed-error-info":"The two seeds must match.","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","12-words":"12 words","24-words":"24 words","generate-12-help":"Generate a 12 word seed.","generate-24-help":"Generate a 24 word seed.","encrypt-check":"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","seed-checking-error":"It was not possible to verify the validity of the seed.","unconventional-seed-title":"Possible Error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed","synchronizing-warning-text":"The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \\"Scan Addresses\\" function or add them again manually.","wallet-created":"The wallet has been added to the list.","seed":{"enter-seed":"Press here to enter the seed","change-seed":"Press to change","confirm-seed":"Press here to confirm the seed","confirmed-seed":"Seed confirmed","use-custom":"Enter the seed manually","use-normal":"Enter the seed using the recommended method","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","incorrect-word-error":"The word you have entered does not match the requested one.","invalid-seed-error":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","word-error-info":"You must enter a word.","new-seed-info":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-info":"Please be sure to enter the correct words in the correct order."}},"rename":{"title":"Rename Wallet","name-label":"Name","label-error-info":"You must enter a name.","rename-button":"Rename"},"address-options":{"title":"Addresses","new":"New Addresses","scan":"Scan Addresses","scan-help":"Use this option to make the system find already used addresses from this wallet which are missing from the list."},"scan-addresses":{"done-with-new-addresses":"The list has been updated.","done-without-new-addresses":"No new addresses were found."},"add-addresses":{"title":"Select Quantity","quantity-label":"How many addresses to create","quantity-error-info":"You must enter a value between 1 and 100.","error":"There was an unexpected error. Please try again."},"address":{"show":"Press to show","copy":"Copy","copy-address":"Copy address","copied":"Copied!","confirm":"Confirm address","outputs":"Unspent outputs","history":"History"}},"qr":{"title":"QR Code","data-label":"QR data","address-label":"Address","request-link":"Request specific amount","amount-label":"Requested amount","hours-label":"Requested hours","message-label":"Message","invalid":"(invalid value)"},"send":{"title-and-button":"Send","unsigned-button":"Unsigned","signed-button":"Signed","unsigned-confirmation":"The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?","synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.","wallet-label":"Wallet","wallet-error-info":"You must select a wallet.","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins-link":"send all","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","addresses-label":"Addresses","addresses-error-info":"You must enter at least one valid address.","no-wallet-selected-error":"There are no coins to send.","no-coins-left-error":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent.","addresses-manual-help":"List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.","outputs-error":"There was an error trying to get the outputs. Please make sure you have entered valid addresses.","all-outputs":"All the outputs of the selected addresses","enter-addresses-for-outputs":"Valid addresses must be entered first","enter-wallet-for-outputs-and-addresses":"A valid wallet must be selected first","invalid-addresses-for-outputs":"No outputs available","available-funds-msg-part1":"With your current selection you can send up to","available-funds-msg-part2":"and","available-funds-msg-part3":"(at least","available-funds-msg-part4":"must be used as transaction fee for sending all the coins or hours).","change-address-label":"Custom change address","change-address-error-info":"The change address is not valid.","change-address-select-from-list-link":"Select","change-address-help":"Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the \\"Select\\" link to choose an address from one of your wallets.","specific-hours":"Hours to send:","remove-specific-hours-info":"Remove.","remove-specific-hours-confirmation":"Are you sure you want to remove the specific amount of hours to send?","destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins.","destinations-help2":"Destination addresses, their coins and hours.","destination-tools-title":"Destination Tools","hours-allocation-check":"Use automatic {{ coinHoursName }} allocation","options-link":"Options","coin-hours-options-link":"Hours options","hours-share-factor-label":"{{ coinHoursName }} share factor","hours-share-factor-help":"This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.","close-hours-share-factor-alert":"The option will be resetted to the default value. Are you sure you want to continue?","preview-button":"Preview","send-button":"Send","show-button":"Show","simple-form-button":"Simple","advanced-form-button":"Advanced","select-wallet":"Select wallet","saving-note-error":"The transaction was successfully sent, but it was not possible to save the note.","sent":"Transaction successfully sent.","total-to-send":"Total:","invalid-address-error":"The destination address is not valid.","one-invalid-address-error":"One of the destination addresses is not valid.","various-invalid-addresses-error":"Some destination addresses are not valid.","all-addresses-invalid-error":"The destination addresses are not valid.","invalid-addresses-error":"Please make sure the address is valid.","address-error-info":"Please enter a valid address.","invalid-value-error-info":"Invalid value.","insufficient-funds-error-info":"The entered value is greater than the available balance.","sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","advanced-sending-all-hours-with-coins-waning":"By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?","sending-all-hours-waning":"You selected to send all the hours. Are you sure you want to continue?","high-hours-share-waning":"Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?","advanced-high-hours-share-waning":"Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?","fill-with-link":{"title":"Use a Transaction Link","link-info":"Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.","link-label":"Transaction link","link-error-info":"You must enter a valid transaction link.","process-button":"Process","invalid-link-error":"The contents of the transaction link are not valid.","invalid-link-hours-error":"The transaction link contains an invalid amount of hours.","data-overwritten-alert":"Some data you have entered will be overwritten. Are you sure you want to continue?","confirmation":"The form has been updated with the data obtained from the transaction link."},"known-node-errors":{"null-change-address-error":"The null address can\'t be used as the custom change address. Please enter a valid address.","to-required-error":"You must provide a destination address for sending coins. Please enter a valid address.","zero-coins-error":"It\'s not possible to send zero coins. Please enter a valid amount.","null-destination-error":"The null address can\'t be used as destination. Please enter a valid address.","duplicate-destination-error":"There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.","hours-in-automatic-mode-error":"Specific hour amounts can\'t be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-needed-error":"The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.","invalid-hours-allocation-mode-error":"Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.","hours-allocation-mode-not-needed-error":"The hour allocation mode can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-hours-mode-error":"Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.","share-factor-needed-error":"The hours share factor is needed. Please try with different values and contact support if the problem is not solved.","share-factor-not-needed-error":"The hours share factor can\'t be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.","invalid-share-factor-error":"Invalid share factor. Please try with different values and contact support if the problem is not solved.","change-equal-to-destination-error":"The transaction can\'t be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.","repeated-wallet":"A wallet for the specified seed already exists."},"bulk-send":{"title":"Bulk Send","indications":"To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \\"xyz\\" address, type \\"xyz,10,5\\"; if you want the hours to be calculated automatically, type \\"xyz,10\\". Decimal values must be separated with a dot.","data-error-info":"You must enter a value.","process-button":"Process","no-data-error":"There is no text to process.","inconsistent-data-error":"If you set how many hours you want to send to a destination, you must do so for all destinations.","invalid-data-error":"The entered text has an invalid format."}},"select-address":{"title":"Select Address","no-addresses":"There are no confirmed addresses on this wallet."},"offline-transactions":{"loading-problem":"Error trying to get the necessary data","wallet-error-info":"You must select a wallet.","tx-error-info":"You must enter a valid transaction text.","copy-tx":{"signed-title":"Signed Transaction","unsigned-title":"Unsigned Transaction","text-unsigned":"This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \\"Sign Transaction\\" option.","text-signed":"This is the signed transaction. You can send it to the network using the \\"Broadcast Transaction\\" option.","input-label":"Transaction text","copy-button":"Copy","reset-confirmation":"Do you want the the form to be cleaned, so you can create another transaction?","reset-done":"The form has been cleaned."},"sign-tx":{"title":"Sign Transaction","text":"Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.","wallet-label":"Wallet","select-wallet":"Select wallet","input-label":"Transaction text","sign-button":"Sign","signed":"The transaction has been signed."},"broadcast-tx":{"title":"Broadcast Transaction","text":"Use this form to send a signed transaction to the network.","input-label":"Transaction text","send-button":"Send","sent":"The transaction has been sent."}},"reset":{"title":"Reset Password","wallet-label":"Wallet","seed-label":"Wallet seed","seed-error-info":"You must enter a seed.","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","confirm-error-info":"The two passwords must match.","reset-button":"Reset","done":"Password successfully changed."},"tx":{"transaction-title":"Transaction","confirm-transaction-title":"Confirm Transaction","from-small-label":"From:","to-small-label":"To:","date-small-label":"Date:","status-small-label":"Status:","coins-small-label":"Coins:","hours-small-label":"Hours:","id-small-label":"Tx ID:","note-small-label":"Note:","without-note":"Without note","show-more-link":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned","inputs-title":"Inputs","outputs-title":"Outputs","confirmed-transaction":"Confirmed","pending-transaction":"Pending","current-rate-help":"Calculated at the current rate."},"edit-note":{"title":"Edit Note","change-button":"Change"},"backup":{"title":"Backup Wallet","wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.","desc":"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","wallet-table-label":"Wallet name","filename-table-label":"Filename","save-addresses-button":"Save Addresses","show-seed-button":"Show Seed","no-wallets":"There are no wallets","unencrypted-info":"For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.","hw-wallet-info":"For getting the seed of a Skywallet, please use the \\"Skywallet\\" option at the bottom of the wallets page.","not-compatible-error":"Your web browser is not compatible with this function.","seed-modal-window":{"title":"Wallet Seed","seed-label":"Seed"}},"blockchain":{"title":"Blockchain","blocks-label":"Number of blocks","time-label":"Timestamp of last block","hash-label":"Hash of last block","current-supply-label":"Current {{ coinName }} supply","total-supply-label":"Total {{ coinName }} supply","current-coinhour-supply-label":"Current {{ coinHoursName }} supply","total-coinhour-supply-label":"Total {{ coinHoursName }} supply"},"network":{"title":"Networking","error-no-connections":"No connections","peer-small-table-label":"Peer","source-small-table-label":"Source","block-height-small-table-label":"Block height","block-height-short-small-table-label":"Block","last-seen-small-table-label":"Last seen","last-received-help":"Last received.","last-sent-help":"Last sent.","in-help":"Incoming.","out-help":"Outgoing.","sources":{"default":"Default peer","exchange":"Peer exchange"}},"pending-txs":{"title":"Pending Transactions","timestamp-table-label":"Timestamp","txid-table-label":"Transaction ID","none":"No pending transactions","my-transactions-button":"Mine","all-transactions-button":"All"},"outputs":{"title":"Outputs","error-no-outputs":"No unspent outputs"},"history":{"title-and-button":"History","tx-detail-title":"Transaction Detail","moving":"Internally moving {{ coinName }}","moved":"Internally moved {{ coinName }}","sending":"Sending {{ coinName }}","sent":"Sent {{ coinName }}","received":"Received {{ coinName }}","receiving":"Receiving {{ coinName }}","pending-indication":"Pending","transaction-note-small-label":"Note:","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)","filter":"Active filter: ","filters":"Active filters: ","all-addresses":"All addresses","view-all":"View all {{ number }} transactions"},"teller":{"done":"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin","unknown":"Unknown"},"confirmation":{"default-title":"Confirmation","yes-button":"Yes","no-button":"No"},"service":{"api":{"no-internet-error":"You do not have a internet connection or the node has stopped working.","incorrect-password-error":"Incorrect password.","unknown-error":"It was not possible to perform the operation.","api-disabled-error":"API disabled."}},"force-skywallet-wipe":{"title":"Forced Skywallet Wipe","operation-warning":"This option is designed only as a last resort for cases where the device cannot be used with the normal options. All data on the device will be erased, so you will need your seed to recover the funds.","proceed-button":"Proceed"},"hardware-wallet":{"general":{"default-wallet-name":"New Skywallet","confirm":"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.","follow":"Please follow the instructions displayed on the Skywallet.","completed":"Operation completed successfully.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},"errors":{"generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","disconnected":"Unable to perform the operation. The Skywallet is not connected.","incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.","refused":"The operation was canceled.","too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ","timeout":"The operation was canceled due to inactivity. Please try again.","timeout-with-configurable-link":"The operation was canceled due to inactivity. Please try again. If this issue prevents the device from being usable, you can use the following option:","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{"title":"Security Warning","text":"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.","link":"Open the Skywallet options window."},"options":{"connecting":"Connecting...","disconnected":"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":"A seedless Skywallet has been detected. Select \\"Configure Automatically\\" if you want to configure it as a brand new wallet and start using it. Select \\"Restore Backup\\" if you want to configure the Skywallet with a previously created seed backup.","configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security Warnings","security-warning-title":"Security Warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":"The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \\"Update Firmware\\" option.","backup-warning":"You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \\"Create a Backup\\" option.","pin-warning":"The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \\"Create PIN Code\\" option.","options":"Options:","update-firmware":"Update Firmware","configure-automatically":"Configure Automatically","restore-backup":"Restore Backup","create-backup":"Create a Backup","wipe":"Wipe the Device","confirm-seed":"Confirm Seed","create-pin":"Create PIN Code","change-pin":"Change PIN Code","delete-pin":"Delete PIN Code","forgotten-pin-part1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin-part2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{"title":"Outdated Firmware","text":"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.","update":"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.","follow":"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.","timeout":"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.","finished":"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{"text":"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.","configuring":"Configuring..."},"restore-seed":{"text":"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.","warning":"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: the retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: the seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: the seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},"added":{"title":"New Skywallet","configuring":"New Skywallet detected. Configuring...","done":"Done","added1":"The connected Skywallet has been added to the wallets list with the following name:","added2":"Now you can check the balance and the addresses of the Skywallet even when it is not connected.","added-error-info":"You must enter a name.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device."},"wipe":{"warning":"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete-check":"Also remove from the wallets list"},"create-backup":{"warning":"WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \\"seed\\") will be able access the wallet funds, so extreme caution is advised.","instructions":"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{"title":"Enter Word","enter-word":"Enter the word shown on the device","info":"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.","word-label":"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{"warning":"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties."},"enter-pin":{"title":"Enter PIN","title-change-current":"Enter the Current PIN","title-change-new":"Enter the New PIN","title-change-confirm":"Confirm the New PIN","instructions-generic":"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.","help":"Need help?"},"pin-help":{"title":"Help","part1":"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.","part2":"To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \\"23\\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.","part3":"If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \\"23\\", you can not simply type \\"23\\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \\"7\\" and \\"5\\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet."},"create-tx":{"title":"Create Transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","separator-for-coins-and-hours":"and","separator-to-destination":"to"},"confirm-address":{"title":"Confirm Address","instructions":"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.","confirmation":"Address confirmed. For security, you can re-show the address in the Skywallet using the \\"Confirm address\\" option, in the menu that you can display by pressing the button at the right of the address balance."}},"time-from-now":{"few-seconds":"a few seconds ago","minute":"one minute ago","minutes":"{{time}} minutes ago","hour":"one hour ago","hours":"{{time}} hours ago","day":"one day ago","days":"{{time}} days ago"},"exchange":{"title-and-button":"Buy {{ coinName }}","label-you-send":"You send","label-you-get":"You get (approx.)","label-to-address":"To {{coin}} address","label-price":"Exchange rate","label-stimate-transaction-time":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-part1":"I agree with the","agree-part2":"Terms of Use","agree-part3":"and the","agree-part4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal","history":"Order history","order-not-found":"Order not found","label-status":"Status","exchanging":"Exchanging {{from}} for {{to}}","destination-select-from-list-link":"Select","unavailable":"The exchange service is not available in the portable version","offline":"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later","invalid-address-error":"Invalid address.","from-coin-error-info":"You must select a coin.","invalid-value-error-info":"Invalid value.","address-error-info":"Please enter a valid address.","statuses":{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.","complete":"Exchange completed!","complete-info":"The funds have been successfully sent to your address.","error":"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{"title":"Order History","address":"Address:","date":"Date:"},"details":{"exchange-addr-label":"Exchange address (valid for this exchange operation only)","exchange-addr-tag-label":"Payment ID or Destination Tag which must be used for the transaction","tx-id-label":"Transaction ID","order-id-label":"Order ID","initial-price-label":"Initial exchange rate","error-msg-label":"Error message","details-link":"Details","start-date-label":"Start date","back-alert":"The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \\"Order history\\" button"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/736.fa2bb87eeea79bc4242a.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/736.fa2bb87eeea79bc4242a.js new file mode 100644 index 0000000000..1ae129407c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/736.fa2bb87eeea79bc4242a.js @@ -0,0 +1 @@ +(self.webpackChunkdesktopwallet=self.webpackChunkdesktopwallet||[]).push([[736],{12736:function(e){"use strict";e.exports=JSON.parse('{"common":{"usd":"\u7f8e\u5143","loading":"\u52a0\u8f7d\u4e2d...","done-title":"\u5b8c\u6210","warning-title":"\u8b66\u544a","error-title":"\u9519\u8bef","changes-made":"\u4fee\u6539\u5df2\u5b8c\u6210","back-button":"\u540e\u9000","create-button":"\u521b\u5efa","load-button":"\u52a0\u8f7d","cancel-button":"\u53d6\u6d88","continue-button":"\u7ee7\u7eed","close-button":"\u5173\u95ed","generic-confirmation-check":"\u6211\u5df2\u4e86\u89e3\u98ce\u9669\uff0c\u8bf7\u7ee7\u7eed","copied":"\u6587\u672c\u5df2\u590d\u5236\u5230\u526a\u8d34\u677f"},"errors":{"window-size":"\u7a97\u53e3\u592a\u7a84\uff0c\u5185\u5bb9\u653e\u4e0d\u4e0b"},"language":{"title":"\u9009\u62e9\u8bed\u8a00"},"header":{"syncing-blocks":"\u533a\u5757\u540c\u6b65\u4e2d","explorer-link":"{{ coinName }} Explorer","warnings":{"update-part1":"\u94b1\u5305\u66f4\u65b0","update-part2":"\u672a\u4f7f\u7528","update-part3":"\u53ef\u83b7\u53d6","synchronizing":"\u94b1\u5305\u6b63\u5728\u540c\u6b65\u3002\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002","pending-txs-part1":"\u8fd9\u91cc\u6709\u4e00\u4e9b","pending-txs-part2":"\u5f85\u5904\u7406\u4ea4\u6613\u3002","pending-txs-part3":"\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002","no-connections":"\u6ca1\u6709\u8fde\u63a5\uff0c\u4f60\u7684\u5ba2\u6237\u7aef\u6ca1\u6709\u8fde\u63a5\u5230\u4efb\u4f55\u5176\u4ed6\u8282\u70b9","no-backend-part1":"\u4e0d\u80fd\u5230\u8fbe\u540e\u7aef\u3002\u8bf7\u91cd\u65b0\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\u6216\u5bfb\u6c42\u6211\u4eec\u7684\u5e2e\u52a9","no-backend-part2":"Telegram","no-backend-part3":"","csrf":"\u5b89\u5168\u6f0f\u6d1e: CSRF\u672a\u5de5\u4f5c\uff0c\u8bf7\u7acb\u5373\u9000\u51fa\u3002"}},"password":{"title":"\u8f93\u5165\u5bc6\u7801","password-label":"\u5bc6\u7801","password-error-info":"\u8bf7\u8f93\u5165\u5bc6\u7801","confirm-password-label":"\u786e\u8ba4\u5bc6\u7801","confirm-error-info":"\u4e24\u6b21\u5bc6\u7801\u5fc5\u987b\u5339\u914d","proceed-button":"\u7ee7\u7eed","reset-link":"\u6211\u5fd8\u8bb0\u4e86\u5bc6\u7801","incorrect-password-error":"\u5bc6\u7801\u4e0d\u6b63\u786e\u3002","decrypting-error":"\u94b1\u5305\u89e3\u5bc6\u5931\u8d25\u3002"},"buy":{"title-and-button":"\u8d2d\u4e70","deposit-address":"\u9009\u62e9\u4e00\u4e2a\u5730\u5740\u6765\u751f\u6210BTC\u5145\u503c\u94fe\u63a5\uff0c\u7528\u4e8e:","select-address":"\u9009\u62e9\u5730\u5740","generate":"\u751f\u6210","deposit-location":"\u5145\u503c\u4f4d\u7f6e","deposit-location-desc":"\u9009\u62e9\u4e00\u4e2a\u94b1\u5305\uff0c\u4ee5\u5728\u6211\u4eec\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\u5145\u503cSkycoin\u5230\u8be5\u94b1\u5305","make-choice":"\u505a\u9009\u62e9","wallets-desc":"\u6bcf\u5f53\u9009\u62e9\u4e00\u4e2a\u65b0\u7684\u94b1\u5305\u548c\u5730\u5740\uff0c\u4e00\u4e2a\u65b0\u7684BTC\u5730\u5740\u5c06\u4f1a\u751f\u6210\u3002\u4e00\u4e2a\u72ec\u7acb\u7684Skycoin\u5730\u5740\u6700\u591a\u53ef\u7ed1\u5b9a5\u4e2aBTC\u5730\u5740\u3002","send":"\u53d1\u9001Bitcoin","send-desc":"\u53d1\u9001Bitcoin\u81f3\u5982\u4e0b\u5730\u5740\u3002\u4e00\u65e6\u6536\u5230\uff0c\u6211\u4eec\u5c06\u4f1a\u6309\u5f53\u524d\u6c47\u7387: {{ rate }} SKY/BTC\u5145\u503cSkycoin\u5230\u9009\u4e2d\u94b1\u5305\u7684\u4e00\u4e2a\u65b0\u5730\u5740\u3002","fraction-warning":"\u8bf7\u6309SKY/BTC\u6c47\u7387\u7684\u500d\u6570\u53d1\u9001BTC! Skycoin\u662f\u4ee5\u6574\u6570\u53d1\u9001; SKY\u7684\u5c0f\u6570\u4f4d\u5c06\u4e0d\u4f1a\u53d1\u9001","receive":"\u63a5\u6536Sky","receive-desc":"\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\uff0c\u6211\u4eec\u5c06\u53d1\u9001Skycoin\u7ed9\u4f60\u3002\u4f60\u53ef\u80fd\u9700\u898120\u5206\u949f\u5230\u4e00\u4e2a\u5c0f\u65f6\u624d\u80fd\u6536\u5230\u8fd9\u4e9bSKY\u3002","status-button":"\u72b6\u6001:","check-status-button":"\u67e5\u770b\u72b6\u6001","new-order-button":"\u65b0\u8ba2\u5355"},"wizard":{"create-title":"\u521b\u5efa\u94b1\u5305","create-desc":"\u5982\u679c\u4f60\u6ca1\u6709{{ coinName }}\u94b1\u5305\uff0c\u8bf7\u4f7f\u7528\u751f\u6210\u7684\u79cd\u5b50\u6765\u521b\u5efa\u4e00\u4e2a\u65b0\u94b1\u5305\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u6709\u4e00\u4e2a\u94b1\u5305\uff0c\u5207\u6362\u5230\\"\u52a0\u8f7d\u94b1\u5305\\"\u5e76\u8f93\u5165\u4f60\u7684\u79cd\u5b50\u3002","encrypt-title":"\u52a0\u5bc6\u94b1\u5305","encrypt-desc":"\u901a\u8fc7\u52a0\u5bc6\u6765\u589e\u52a0\u94b1\u5305\u7684\u5b89\u5168\u6027\u3002\u8f93\u5165\u5bc6\u7801\u540e\uff0c\u4f60\u7684\u94b1\u5305\u4f1a\u88ab\u52a0\u5bc6\u3002\u53ea\u6709\u8f93\u5165\u5bc6\u7801\u624d\u53ef\u4ee5\u8bbf\u95ee\u7684\u94b1\u5305\u6216\u79fb\u52a8\u8d44\u91d1\u3002","finish-temporal-title":"\u51c6\u5907\u5c31\u7eea","finish-temporal-desc":"\u8bf7\u70b9\u51fb \\"\u5b8c\u6210\\" \u6309\u94ae\u521b\u5efa\u4e34\u65f6\u94b1\u5305. \u6ce8\u610f, \u91cd\u542f\u94b1\u5305\u540e\u4e34\u65f6\u94b1\u5305\u5c06\u4f1a\u88ab\u5220\u9664\u3002","hardware-wallet-link":"\u4f7f\u7528\u786c\u4ef6\u94b1\u5305\uff1f","new-button":"\u65b0\u5efa","load-button":"\u52a0\u8f7d","finish-button":"\u5b8c\u6210","confirm":{"title":"\u4fdd\u62a4\u4f60\u7684\u79cd\u5b50!","desc":"\u8bf7\u786e\u4fdd\u4f60\u5df2\u7ecf\u5199\u4e0b\u4f60\u7684\u79cd\u5b50\u5e76\u5c06\u5b83\u50a8\u5b58\u5728\u4e86\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u6062\u590d\u4f60\u7684Skycoin\u94b1\u5305","checkbox":"\u5b83\u5f88\u5b89\u5168\uff0c\u6211\u53d1\u8a93\u3002"}},"wallet":{"title-and-button":"\u94b1\u5305","show-empty-button":"\u663e\u793a\u7a7a\u5730\u5740","hide-empty-button":"\u9690\u85cf\u7a7a\u5730\u5740","encrypt-button":"\u52a0\u5bc6\u94b1\u5305","decrypt-button":"\u89e3\u5bc6\u94b1\u5305","decrypt-warning":"\u8b66\u544a: \u51fa\u4e8e\u5b89\u5168\u8003\u8651\uff0c\u5efa\u8bae\u5c06\u94b1\u5305\u52a0\u5bc6\u3002\u5efa\u8bae\u8c28\u614e\u4e00\u70b9\u3002","delete-button":"\u5220\u9664\u94b1\u5305","rename-button":"\u4fee\u6539\u94b1\u5305\u540d\u79f0","add-button":"\u6dfb\u52a0\u94b1\u5305","load-button":"\u52a0\u8f7d\u94b1\u5305","hardware-wallet-button":"\u786c\u4ef6\u94b1\u5305","encryption-enabled":"\u52a0\u5bc6\u5df2\u542f\u7528","encryption-disabled":"\u52a0\u5bc6\u5df2\u7981\u7528","temporal":"\u4e34\u65f6\u94b1\u5305","warning-hw-security":"\u53ef\u80fd\u7684\u5b89\u5168\u98ce\u9669\u3002\u5f53\u786c\u4ef6\u8bbe\u5907\u5df2\u8fde\u63a5\u65f6(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u6309\u94ae)\u8bbf\u95ee\u786c\u4ef6\u94b1\u5305\u9009\u9879\u4ee5\u83b7\u53d6\u66f4\u591a\u4fe1\u606f","wallet-table-label":"\u94b1\u5305","hardware-wallet-table-label":"\u786c\u4ef6\u94b1\u5305","delete-confirmation":"\u8b66\u544a: \u94b1\u5305\\"{{ name }}\\"\u5c06\u4ece\u5217\u8868\u4e2d\u5220\u9664\u3002\u82e5\u60f3\u91cd\u65b0\u6dfb\u52a0\uff0c\u9700\u91cd\u65b0\u8fde\u63a5\u8bbe\u5907\u5e76\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u7684\u9009\u9879\u5217\u8868(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u6309\u94ae)\u3002\u4f60\u60f3\u7ee7\u7eed\u5417\uff1f","delete-confirmation-check":"\u662f\u7684\uff0c\u6211\u60f3\u8981\u5220\u9664\u94b1\u5305\u3002","max-hardware-wallets-error":"\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u91cc\u7684\u5730\u5740\u5df2\u7ecf\u8fbe\u5230\u5141\u8bb8\u7684\u6700\u5927\u503c\u3002","add-many-confirmation":"\u8b66\u544a: \u5982\u679c\u4f60\u5728\u4e0d\u4f7f\u7528\u524d\u4e00\u4e2a\u5730\u5740\u7684\u60c5\u51b5\u4e0b\u6dfb\u52a0\u592a\u591a\u5730\u5740\uff0c\u6216\u8005\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662f\u6700\u540e\u4e00\u4e2a\u5730\u5740\u800c\u4e0d\u662f\u7b2c\u4e00\u4e2a\u5730\u5740\uff0c\u90a3\u4e48\u5982\u679c\u4f60\u5c1d\u8bd5\u4f7f\u7528\u79cd\u5b50\u6062\u590d\u94b1\u5305\uff0c\u6709\u4e9b\u5730\u5740\u5c06\u53ef\u80fd\u65e0\u6cd5\u81ea\u52a8\u6062\u590d\uff08\u4f60\u5fc5\u987b\u624b\u52a8\u6dfb\u52a0\u5b83\u4eec\uff09\u3002 \u4f60\u60f3\u7ee7\u7eed\u5417\uff1f","busy-error":"\u8bf7\u7b49\u5f85\u4e0a\u4e00\u64cd\u4f5c\u5b8c\u6210\u3002","new":{"create-title":"\u521b\u5efa\u94b1\u5305","load-title":"\u52a0\u8f7d\u94b1\u5305","name-label":"\u540d\u79f0","name-error-info":"\u8bf7\u8f93\u5165\u94b1\u5305\u540d","words-number-label":"\u79cd\u5b50\u6709\u591a\u5c11\u5b57","seed-label":"\u79cd\u5b50","seed-error-info":"\u8bf7\u8f93\u5165\u79cd\u5b50","confirm-seed-label":"\u786e\u8ba4\u79cd\u5b50","confirm-seed-error-info":"\u79cd\u5b50\u4e0d\u5339\u914d","seed-warning":"\u8bb0\u4f4f\u79cd\u5b50! \u628a\u5b83\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002 \u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u4f60\u7684\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u627e\u56de\u4f60\u7684\u94b1\u5305!","12-words":"12\u5b57","24-words":"24\u5b57","generate-12-help":"\u751f\u621012\u5b57\u79cd\u5b50","generate-24-help":"\u751f\u621024\u5b57\u79cd\u5b50","encrypt-check":"\u52a0\u5bc6\u94b1\u5305","encrypt-warning":"\u6211\u4eec\u5efa\u8bae\u4f60\u4e3a\u6bcf\u4e2a\u94b1\u5305\u8bbe\u7f6e\u4e00\u4e2a\u72ec\u7acb\u7684\u5bc6\u7801\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u5bc6\u7801\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u79cd\u5b50\u91cd\u7f6e\u94b1\u5305\u3002\u5728\u52a0\u5bc6\u4f60\u7684\u94b1\u5305\u4e4b\u524d\uff0c\u786e\u4fdd\u4f60\u7684\u79cd\u5b50\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002","advanced-options-link":"\u9ad8\u7ea7\u9009\u9879","close-advanced-error":"\u65e0\u6cd5\u5173\u95ed\u9009\u9879\uff0c\u56e0\u4e3a\u4f60\u5df2\u7ecf\u5bf9\u503c\u8fdb\u884c\u4e86\u6539\u53d8\u3002","temporal-check":"\u52a0\u8f7d\u4e34\u65f6\u94b1\u5305","temporal-info":"\u5982\u679c\u60a8\u4f7f\u7528\u6b64\u9009\u9879\uff0c\u94b1\u5305\u5c06\u88ab\u4e34\u65f6\u52a0\u8f7d\uff0c\u8fd9\u610f\u5473\u7740\u4e00\u65e6\u5173\u95ed\u94b1\u5305\u8f6f\u4ef6\uff0c\u5b83\u5c31\u4f1a\u88ab\u5220\u9664\u3002","temporal-warning":"\u5173\u95ed\u94b1\u5305\u8f6f\u4ef6\u540e\uff0c\u94b1\u5305\u5c06\u88ab\u5220\u9664\uff0c\u4e0d\u4f1a\u6709\u5bc6\u7801\u3002 \u4f60\u5c06\u9700\u8981\u79cd\u5b50\u6765\u6062\u590d\u5bf9\u8d44\u91d1\u7684\u8bbf\u95ee\u3002 \u4f60\u786e\u5b9a\u4f60\u8981\u7ee7\u7eed\u5417\uff1f","seed-checking-error":"\u65e0\u6cd5\u9a8c\u8bc1\u79cd\u5b50\u7684\u6548\u6027","unconventional-seed-title":"\u53ef\u80fd\u9519\u8bef","unconventional-seed-text":"\u4f60\u5f15\u8fdb\u4e86\u4e00\u79cd\u975e\u4f20\u7edf\u7684\u79cd\u5b50\u3002\u5982\u679c\u4f60\u51fa\u4e8e\u4efb\u4f55\u7279\u6b8a\u539f\u56e0\u8fd9\u6837\u505a\uff0c\u4f60\u53ef\u4ee5\u7ee7\u7eed(\u53ea\u63a8\u8350\u9ad8\u7ea7\u7528\u6237)\u3002\u4f46\u662f\uff0c\u5982\u679c\u4f60\u6253\u7b97\u4f7f\u7528\u666e\u901a\u7684\u7cfb\u7edf\u79cd\u5b50\uff0c\u5219\u5fc5\u987b\u5220\u9664\u6240\u6709\u9644\u52a0\u6587\u672c\u548c\u7279\u6b8a\u5b57\u7b26\u3002","unconventional-seed-check":"\u7ee7\u7eed\u4f7f\u7528\u975e\u4f20\u7edf\u79cd\u5b50\u3002","synchronizing-warning-text":"\u94b1\u5305\u6b63\u5728\u540c\u6b65\u4e2d\uff0c\u5f53\u524d\u64cd\u4f5c\u65e0\u6cd5\u53ef\u80fd\u65e0\u6cd5\u6062\u590d\u6240\u6709\u5730\u5740\u3002\u5982\u6709\u672a\u6062\u590d\u5730\u5740\uff0c\u8bf7\u540c\u6b65\u5b8c\u6210\u540e\u4f7f\u7528\\"\u626b\u63cf\u5730\u5740\\"\u529f\u80fd\u6216\u624b\u52a8\u91cd\u65b0\u6dfb\u52a0","wallet-created":"\u94b1\u5305\u5df2\u6dfb\u52a0\u5230\u5217\u8868","seed":{"enter-seed":"\u70b9\u51fb\u6b64\u5904\u8f93\u5165\u79cd\u5b50","change-seed":"\u70b9\u51fb\u4fee\u6539","confirm-seed":"\u70b9\u51fb\u6b64\u5904\u786e\u8ba4\u79cd\u5b50","confirmed-seed":"\u79cd\u5b50\u5df2\u786e\u8ba4","use-custom":"\u624b\u52a8\u8f93\u5165\u79cd\u5b50","use-normal":"\u4f7f\u7528\u63a8\u8350\u65b9\u5f0f\u8f93\u5165\u79cd\u5b50","custom-seed-warning-text":"\u4ec5\u5efa\u8bae\u9ad8\u7ea7\u7528\u6237\u4f7f\u7528\u3002\u4e00\u65e6\u8f93\u5165\u79cd\u5b50\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u5931\u8bef\uff0c\u4f60\u6709\u53ef\u80fd\u4f1a\u6c38\u4e45\u5931\u53bb\u8d44\u4ea7","custom-seed-warning-text-recovering":"\u4e3a\u907f\u514d\u51fa\u73b0\u95ee\u9898\uff0c\u8be5\u9009\u9879\u8bf7\u4ec5\u7528\u4e8e\u6062\u590d\u975e\u4f20\u7edf\u79cd\u5b50","incorrect-word-error":"\u8f93\u5165\u7684\u5b57\u4e0d\u5339\u914d\u3002","invalid-seed-error":"\u8f93\u5165\u7684\u79cd\u5b50\u65e0\u6548\uff0c\u8bf7\u91cd\u8bd5\u3002","enter-word":"\u8f93\u5165\u7b2c#{{number}}\u4e2a\u5b57","word-error-info":"\u8bf7\u8f93\u5165\u5b57","new-seed-info":"\u8bf7\u8f93\u5165\u7cfb\u7edf\u751f\u6210\u7684\u79cd\u5b50\u4ee5\u786e\u8ba4","recover-seed-info":"\u8bf7\u786e\u8ba4\u6309\u6b63\u786e\u7684\u987a\u5e8f\u8f93\u5165\u79cd\u5b50"}},"rename":{"title":"\u91cd\u547d\u540d\u94b1\u5305","name-label":"\u547d\u540d","label-error-info":"\u8bf7\u8f93\u5165\u94b1\u5305\u540d","rename-button":"\u91cd\u547d\u540d"},"address-options":{"title":"\u5730\u5740","new":"\u65b0\u5efa\u5730\u5740","scan":"\u626b\u63cf\u5730\u5740","scan-help":"\u4f7f\u7528\u8be5\u9009\u9879\u626b\u63cf\u94b1\u5305\u4e2d\u4f7f\u7528\u8fc7\u4f46\u672a\u52a0\u8f7d\u51fa\u7684\u5730\u5740"},"scan-addresses":{"done-with-new-addresses":"\u94b1\u5305\u5730\u5740\u5df2\u66f4\u65b0\u3002","done-without-new-addresses":"\u672a\u53d1\u73b0\u65b0\u5730\u5740\u3002"},"add-addresses":{"title":"\u9009\u62e9\u6570\u91cf","quantity-label":"\u521b\u5efa\u591a\u5c11\u5730\u5740","quantity-error-info":"\u8bf7\u8f93\u5165\u6570\u503c\u57281\u5230100\u4e4b\u95f4","error":"\u51fa\u73b0\u5f02\u5e38\u9519\u8bef\uff0c\u8bf7\u91cd\u8bd5\u3002"},"address":{"show":"\u70b9\u51fb\u663e\u793a","copy":"\u590d\u5236","copy-address":"\u590d\u5236\u5730\u5740","copied":"\u5df2\u590d\u5236!","confirm":"\u786e\u8ba4\u5730\u5740","outputs":"\u672a\u4ea4\u6613\u8f93\u51fa","history":"\u5386\u53f2"}},"qr":{"title":"\u4e8c\u7ef4\u7801","data-label":"QR \u6570\u636e","address-label":"\u5730\u5740","request-link":"\u8bf7\u6c42\u6307\u5b9a\u91d1\u989d","amount-label":"\u8bf7\u6c42\u7684\u91d1\u989d","hours-label":"\u8bf7\u6c42\u7684\u5e01\u65f6","message-label":"\u6d88\u606f","invalid":"(\u65e0\u6548\u503c)"},"send":{"title-and-button":"\u53d1\u9001","unsigned-button":"\u65e0\u7b7e\u540d","signed-button":"\u7b7e\u540d","unsigned-confirmation":"\u65e0\u7b7e\u540dTransactions\u9009\u9879\u65e0\u53d1\u9001\u529f\u80fd\uff0c\u5904\u4e8e\u5b89\u5168\u8003\u8651\uff0c\u53ef\u4ee5\u4f7f\u7528\u8be5\u9009\u9879\u521b\u5efa\u65e0\u7b7e\u540d\u7684Transactions\uff0c\u5e76\u5728\u5b89\u5168\u7684\u975e\u8054\u7f51\u8bbe\u5907\u4e0a\u5b8c\u6210\u7b7e\u540d","synchronizing-warning":"\u94b1\u5305\u4ecd\u5728\u540c\u6b65\u6570\u636e\uff0c\u6240\u4ee5\u663e\u793a\u7684\u4f59\u989d\u53ef\u80fd\u4e0d\u6b63\u786e\u3002\u4f60\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f","from-label":"\u53d1\u9001\u81ea","to-label":"\u53d1\u9001\u81f3","amount-label":"\u603b\u989d","personal-note-label":"\u65e5\u5fd7","personal-note-help":"\u6587\u672c\u8bb0\u5f55\u7528\u4e8e\u5c06\u6765\u67e5\u627e\u76f8\u5173\u4ea4\u6613\u8bb0\u5f55\u3002\u6587\u672c\u5185\u5bb9\u662f\u672c\u5730\u5b58\u50a8\uff0c\u56e0\u6b64\u53ea\u80fd\u5728\u5f53\u524d\u8bbe\u5907\u53ef\u89c1","wallet-label":"\u94b1\u5305","wallet-error-info":"\u8bf7\u9009\u62e9\u4e00\u4e2a\u94b1\u5305","invalid-amount":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u6570\u503c","convert-confirmation":"\u662f\u5426\u9700\u8981\u5c06\u6570\u989d\u4ece{{from}}\u8f6c\u6362\u4e3a{{to}}?","convert-confirmation-plural":"\u662f\u5426\u9700\u8981\u5c06\u6570\u989d\u4ece{{from}}\u8f6c\u6362\u4e3a{{to}}?","send-all-available-coins-link":"\u53d1\u9001\u6240\u6709","precision-error-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u4e00\u4e2a\u7cbe\u5ea6\u95ee\u9898\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","invaid-amount-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u4e00\u4e2a\u65e0\u6548\u503c\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","precision-errors-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u7cbe\u5ea6\u95ee\u9898\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","invaid-amounts-warning":"\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u5230\u65e0\u6548\u503c\uff0c\u8bf7\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","multiple-problems-warning":"\u56e0\u4e3a\u65e0\u6548\u503c\u6216\u7cbe\u5ea6\u95ee\u9898\uff0c\u6709\u4e9b\u503c\u8f6c\u6362\u5931\u8d25\uff0c\u4eb2\u68c0\u67e5\u53d1\u9001\u7684\u6570\u989d","addresses-label":"\u5730\u5740","addresses-error-info":"\u8bf7\u81f3\u5c11\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u5730\u5740","no-wallet-selected-error":"\u6ca1\u6709\u5e01\u53ef\u53d1\u9001","no-coins-left-error":"\u6ca1\u6709\u5269\u4f59\u5e01\u53ef\u53d1\u9001","addresses-help":"\u9650\u5b9a\u6e90\u53d1\u9001\u5730\u5740","addresses-manual-help":"\u6e90\u53d1\u9001\u5730\u5740\u5217\u8868\uff0c\u4ee5\u9017\u53f7\u9694\u5f00\u3002\u6240\u6709\u5730\u5740\u5fc5\u987b\u5c5e\u4e8e\u7edf\u4e00\u94b1\u5305\uff0c\u5426\u5219\u5c06\u4f1a\u7b7e\u540d\u5931\u8d25","all-addresses":"\u6240\u6709\u5730\u5740(\u6240\u9009\u94b1\u5305\u7684)","outputs-label":"\u672a\u4ea4\u6613\u8f93\u51fa","outputs-help":"\u9650\u5b9a\u672a\u4ea4\u6613\u8f93\u51fa","outputs-error":"\u83b7\u53d6\u4ea4\u6613\u8f93\u51fa\u5931\u8d25\u3002\u8bf7\u786e\u4fdd\u8f93\u5165\u7684\u662f\u6709\u6548\u5730\u5740","all-outputs":"\u6240\u6709\u672a\u4ea4\u6613\u8f93\u51fa(\u6240\u9009\u5730\u5740\u7684)","enter-addresses-for-outputs":"\u8bf7\u5148\u8f93\u5165\u6709\u6548\u7684\u5730\u5740","enter-wallet-for-outputs-and-addresses":"\u8bf7\u9009\u62e9\u4e00\u4e2a\u6709\u6548\u7684\u94b1\u5305","invalid-addresses-for-outputs":"\u6ca1\u6709\u6709\u6548\u7684\u672a\u4ea4\u6613\u8f93\u51fa","available-funds-msg-part1":"\u6839\u636e\u4f60\u5f53\u524d\u7684\u9009\u62e9\uff0c\u4f60\u6700\u591a\u53ef\u4ee5\u53d1\u9001","available-funds-msg-part2":"\u548c","available-funds-msg-part3":"(\u81f3\u5c11","available-funds-msg-part4":"\u5c06\u4f5c\u4e3a\u5fc5\u987b\u7684\u4ea4\u6613\u624b\u7eed\u8d39)\u3002","change-address-label":"\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740","change-address-error-info":"\u627e\u96f6\u5730\u5740\u65e0\u6548","change-address-select-from-list-link":"\u9009\u62e9","change-address-help":"\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740\u3002\u5982\u679c\u4e0d\u63d0\u4f9b\uff0c\u94b1\u5305\u5c06\u4f1a\u81ea\u52a8\u9009\u62e9\u3002\u70b9\u51fb\\"\u9009\u62e9\\" \u6765\u9009\u62e9\u4e00\u4e2a\u5730\u5740","specific-hours":"\u53d1\u9001\u5e01\u65f6:","remove-specific-hours-info":"\u5220\u9664.","remove-specific-hours-confirmation":"\u4f60\u786e\u5b9a\u5220\u9664\u5c06\u53d1\u9001\u7684\u6307\u5b9a\u6570\u989d\u7684\u5e01\u65f6\u5417?","destinations-label":"\u76ee\u6807\u5730\u5740","destinations-help1":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01","destinations-help2":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01\u4ee5\u53ca\u5e01\u65f6","destination-tools-title":"\u76ee\u6807\u5730\u5740\u5de5\u5177","hours-allocation-check":"\u81ea\u52a8\u5206\u914d\u5e01\u65f6{{ coinHoursName }}","options-link":"\u9009\u9879","coin-hours-options-link":"\u5e01\u65f6\u9009\u9879","hours-share-factor-label":"\u5e01\u65f6\u5206\u53d1\u56e0\u5b50","hours-share-factor-help":"\u5206\u53d1\u56e0\u5b50\u503c(\u767e\u5206\u6bd4)\u8d8a\u9ad8\uff0c\u8d8a\u591a{{ coinHoursName }}\u5c06\u88ab\u53d1\u9001","close-hours-share-factor-alert":"\u91cd\u7f6e\u9009\u9879\uff0c\u4f60\u786e\u5b9a\u9700\u8981\u7ee7\u7eed\u5417","preview-button":"\u9884\u89c8","send-button":"\u53d1\u9001","show-button":"\u663e\u793a","simple-form-button":"\u7b80\u6613","advanced-form-button":"\u9ad8\u7ea7\u7684","select-wallet":"\u9009\u62e9\u94b1\u5305","saving-note-error":"\u4ea4\u6613\u5df2\u6210\u529f\u53d1\u9001\uff0c\u4f46\u662f\u65e5\u5fd7\u5b58\u50a8\u5931\u8d25","sent":"\u4ea4\u6613\u53d1\u9001\u6210\u529f","total-to-send":"\u603b\u5171:","invalid-address-error":"\u76ee\u6807\u5730\u5740\u65e0\u6548","one-invalid-address-error":"\u6709\u4e00\u4e2a\u76ee\u6807\u5730\u5740\u65e0\u6548","various-invalid-addresses-error":"\u90e8\u5206\u76ee\u6807\u5730\u5740\u65e0\u6548","all-addresses-invalid-error":"\u6240\u6709\u76ee\u6807\u5730\u5740\u5747\u65e0\u6548","invalid-addresses-error":"\u8bf7\u786e\u4fdd\u5730\u5740\u662f\u6709\u6548\u7684","address-error-info":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","invalid-value-error-info":"\u65e0\u6548\u503c","insufficient-funds-error-info":"\u5f53\u524d\u8f93\u5165\u503c\u8d85\u8fc7\u53ef\u7528\u4f59\u989d\u3002","sending-all-hours-with-coins-waning":"\u5982\u679c\u53d1\u9001\u6240\u6709\u5e01\uff0c\u5f53\u524d\u94b1\u5305\u4e2d\u6240\u6709\u5e01\u65f6\u5c06\u4f1a\u53d1\u9001\u6216\u9500\u6bc1\u3002\u5982\u679c\u4f60\u60f3\u4fdd\u7559\u5e01\u65f6\uff0c\u8bf7\u4e0d\u8981\u53d1\u9001\u6240\u6709\u5e01\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","advanced-sending-all-hours-with-coins-waning":"\u5982\u679c\u53d1\u9001\u6240\u6709\u5e01, \u5f53\u524d\u9009\u62e9\u6e90\u7684\u6240\u6709\u5e01\u65f6\u5c06\u4f1a\u88ab\u53d1\u9001\u6216\u6216\u9500\u6bc1. \u5982\u679c\u4f60\u60f3\u4fdd\u7559\u5e01\u65f6\uff0c\u8bf7\u4e0d\u8981\u53d1\u9001\u6240\u6709\u5e01\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","sending-all-hours-waning":"\u4f60\u9009\u62e9\u53d1\u9001\u6240\u6709\u5e01\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","high-hours-share-waning":"\u4f60\u7684\u9009\u62e9\u53ef\u80fd\u4f1a\u53d1\u9001\u94b1\u5305\u4e2d\u6240\u6709\u5e01\u65f6\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","advanced-high-hours-share-waning":"\u4f60\u7684\u9009\u62e9\u53ef\u80fd\u4f1a\u53d1\u9001\u9009\u62e9\u6e90\u4e2d\u7684\u6240\u6709\u5e01\u65f6\u3002\u4f60\u786e\u5b9a\u7ee7\u7eed\u5417?","fill-with-link":{"title":"\u4f7f\u7528\u4ea4\u6613\u94fe\u63a5","link-info":"\u5728\u6b64\u8f93\u5165\u4ea4\u6613\u94fe\u63a5\u3002\u4ea4\u6613\u6570\u636e\u5c06\u4ece\u94fe\u63a5\u4e2d\u83b7\u53d6\u5e76\u586b\u5145\u5230\u8868\u5355\u3002","link-label":"\u4ea4\u6613\u94fe\u63a5","link-error-info":"\u8bf7\u8f93\u5165\u6709\u6548\u7684\u94fe\u63a5","process-button":"\u6267\u884c","invalid-link-error":"\u94fe\u63a5\u4e2d\u7684\u5185\u5bb9\u65e0\u6548","invalid-link-hours-error":"\u4ea4\u6613\u94fe\u63a5\u4e2d\u5305\u542b\u65e0\u6548\u7684\u5e01\u65f6\u6570","data-overwritten-alert":"\u90e8\u5206\u4e4b\u524d\u8f93\u5165\u7684\u6570\u636e\u5c06\u4f1a\u88ab\u8986\u5199\u3002\u4f60\u786e\u5b9a\u8981\u7ee7\u7eed\u5417?","confirmation":"\u8868\u5355\u5df2\u6839\u636e\u4ea4\u6613\u94fe\u63a5\u4e2d\u7684\u6570\u636e\u66f4\u65b0\u3002"},"known-node-errors":{"null-change-address-error":"\u65e0\u6cd5\u4f7f\u7528\u7a7a\u5730\u5740\u4f5c\u4e3a\u627e\u96f6\u5730\u5740\u3002\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","to-required-error":"\u4f60\u9700\u8981\u63d0\u4f9b\u4e00\u4e2a\u6709\u6548\u7684\u76ee\u6807\u5730\u5740\u7528\u4e8e\u53d1\u9001\u5e01\u3002\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","zero-coins-error":"\u65e0\u6cd5\u53d1\u90010\u4e2a\u5e01\u3002\u8bf7\u8f93\u5165\u6709\u6548\u503c","null-destination-error":"\u65e0\u6cd5\u4f7f\u7528\u7a7a\u5730\u5740\u4f5c\u4e3a\u76ee\u6807\u5730\u5740\u3002\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740","duplicate-destination-error":"\u76ee\u6807\u5730\u5740\u91cd\u590d\u3002\u8bf7\u4e0d\u8981\u5728\u4e00\u4e2a\u4ea4\u6613\u4e2d\u53d1\u9001\u76f8\u540c\u6570\u503c\u7684\u5e01\u5230\u540c\u4e00\u76ee\u6807\u5730\u5740\u591a\u6b21","hours-in-automatic-mode-error":"\u81ea\u52a8\u5206\u53d1\u5e01\u65f6\u6a21\u5f0f\u65e0\u6cd5\u6307\u5b9a\u5177\u4f53\u5e01\u65f6\u3002\u8bf7\u91cd\u8bd5\u5176\u4ed6\u503c\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","hours-allocation-mode-needed-error":"\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\u672a\u6307\u5b9a\u3002\u8bf7\u8bbe\u7f6e\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","invalid-hours-allocation-mode-error":"\u65e0\u6548\u7684\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\u3002\u8bf7\u4f7f\u7528\u4e0d\u540c\u6a21\u5f0f\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","hours-allocation-mode-not-needed-error":"\u624b\u52a8\u5206\u53d1\u5e01\u65f6\u6a21\u5f0f\u65e0\u6cd5\u6307\u5b9a\u5e01\u65f6\u5206\u914d\u6a21\u5f0f\u3002\u8bf7\u4f7f\u7528\u5176\u4ed6\u503c\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","invalid-hours-mode-error":"\u65e0\u6548\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\u3002\u8bf7\u4f7f\u7528\u6709\u6548\u503c\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","share-factor-needed-error":"\u9700\u8981\u8bbe\u7f6e\u5e01\u65f6\u5206\u53d1\u56e0\u5b50\u3002\u8bf7\u8bbe\u7f6e\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","share-factor-not-needed-error":"\u5df2\u542f\u52a8\u624b\u52a8\u5e01\u65f6\u5206\u53d1\u6a21\u5f0f\uff0c\u5e01\u65f6\u5206\u53d1\u56e0\u5b50\u65e0\u6cd5\u8bbe\u7f6e\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","invalid-share-factor-error":"\u65e0\u6548\u7684\u5e01\u65f6\u5206\u53d1\u56e0\u5b50\u3002\u8bf7\u4f7f\u7528\u6b63\u786e\u7684\u503c\u5e76\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u65e0\u6cd5\u89e3\u51b3\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301","change-equal-to-destination-error":"\u4ea4\u6613\u65e0\u6cd5\u521b\u5efa\uff0c\u8bf7\u4e0d\u8981\u5728\u4e00\u4e2a\u4ea4\u6613\u4e2d\u53d1\u9001\u76f8\u540c\u6570\u503c\u7684\u5e01\u5230\u540c\u4e00\u76ee\u6807\u5730\u5740\u591a\u6b21","repeated-wallet":"\u6307\u5b9a\u79cd\u5b50\u7684\u94b1\u5305\u5df2\u5b58\u5728"},"bulk-send":{"title":"\u6279\u91cf\u53d1\u9001","indications":"\u5feb\u6377\u65b9\u5f0f\u53d1\u9001\u5230\u591a\u4e2a\u5730\u5740\uff0c\u5728\u4e00\u884c\u4e2d\u952e\u5165\u6bcf\u4e2a\u5730\u5740,\u5e01\u6570,\u5e01\u65f6(\u53ef\u9009)\uff0c\u5e76\u7528\u9017\u53f7\u9694\u5f00\u3002\u793a\u4f8b: \u5982\u679c\u4f60\u53d1\u900110\u4e2a\u5e01,5\u5e01\u65f6\u5230\\"xyz\\"\u5730\u5740\uff0c\u8bf7\u952e\u5165\\"xyz,10,5\\"; \u5982\u679c\u60f3\u81ea\u52a8\u8ba1\u7b97\u5e01\u65f6\uff0c\u53ef\u4ee5\u952e\u5165\\"xy,10\\"\u3002\u5c0f\u6570\u503c\u5fc5\u987b\u4ee5\u5c0f\u6570\u70b9\u9694\u5f00\u3002","data-error-info":"\u8bf7\u8f93\u5165\u503c","process-button":"\u5904\u7406","no-data-error":"\u65e0\u6570\u636e\u53ef\u5904\u7406","inconsistent-data-error":"\u5982\u679c\u4f60\u60f3\u8981\u53d1\u9001\u6307\u5b9a\u5e01\u65f6\u6570\uff0c\u6240\u6709\u5730\u5740\u5747\u9700\u6307\u5b9a\u5e01\u65f6\u3002","invalid-data-error":"\u952e\u5165\u6570\u636e\u683c\u5f0f\u8bef\u3002"}},"select-address":{"title":"\u9009\u62e9\u5730\u5740","no-addresses":"\u8be5\u94b1\u5305\u4e2d\u65e0\u786e\u8ba4\u7684\u5730\u5740\u3002"},"offline-transactions":{"loading-problem":"\u5c1d\u8bd5\u83b7\u53d6\u5fc5\u8981\u6570\u636e\u65f6\u5931\u8d25","wallet-error-info":"\u8bf7\u9009\u62e9\u4e00\u4e2a\u94b1\u5305\u3002","tx-error-info":"\u8bf7\u8f93\u5165\u6709\u6548\u7684\u4ea4\u6613\u6587\u672c\u3002","copy-tx":{"signed-title":"\u5df2\u7b7e\u540d\u7684\u4ea4\u6613","unsigned-title":"\u672a\u7b7e\u540d\u7684\u4ea4\u6613","text-unsigned":"\u8fd9\u662f\u4f7f\u7528\u4f60\u8f93\u5165\u7684\u6570\u636e\u521b\u5efa\u7684\u672a\u7b7e\u540d\u7684\u4ea4\u6613\u3002\u8bf7\u62f7\u8d1d\u5e76\u9009\u62e9\\"\u7b7e\u540d\u4ea4\u6613\\"\u9009\u9879\u5bf9\u5176\u8fdb\u884c\u7b7e\u540d","text-signed":"\u8fd9\u662f\u5df2\u7b7e\u540d\u7684\u4ea4\u6613\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\\"\u5e7f\u64ad\u4ea4\u6613\\"\u9009\u9879\u5c06\u5176\u53d1\u9001\u5230\u7f51\u7edc\u4e2d","input-label":"\u4ea4\u6613\u672c\u6587","copy-button":"\u62f7\u8d1d","reset-confirmation":"\u4f60\u662f\u5426\u8981\u6e05\u7406\u8868\u5355\uff0c\u4ee5\u4fbf\u5e76\u521b\u5efa\u65b0\u7684\u4ea4\u6613?","reset-done":"\u8868\u5355\u5df2\u6e05\u7406\u3002"},"sign-tx":{"title":"\u7b7e\u540d\u4ea4\u6613","text":"\u4f7f\u7528\u8be5\u8868\u5355\u5bf9\u4ea4\u6613\u7b7e\u540d\u3002\u4e3a\u4e86\u4f7f\u64cd\u4f5c\u6b63\u5e38\u8fdb\u884c\uff0c\u60a8\u5fc5\u987b\u9009\u62e9\u5305\u542b\u6240\u6709\u7528\u4e8e\u5728\u4ea4\u6613\u4e2d\u53d1\u9001\u5e01\u7684\u8f93\u5165/\u5730\u5740\u7684\u94b1\u5305\u3002","wallet-label":"\u94b1\u5305","select-wallet":"\u9009\u62e9\u94b1\u5305","input-label":"\u4ea4\u6613\u6587\u672c","sign-button":"\u7b7e\u540d","signed":"\u4ea4\u6613\u7b7e\u540d\u5b8c\u6210"},"broadcast-tx":{"title":"\u5e7f\u64ad\u4ea4\u6613","text":"\u4f7f\u7528\u8be5\u8868\u5355\u53d1\u9001\u5df2\u7b7e\u540d\u7684\u4ea4\u6613\u5230\u7f51\u7edc\u3002","input-label":"\u4ea4\u6613\u6587\u672c","send-button":"\u53d1\u9001","sent":"\u4ea4\u6613\u5df2\u53d1\u9001\u3002"}},"reset":{"title":"\u91cd\u7f6e\u5bc6\u7801","wallet-label":"\u94b1\u5305","seed-label":"\u94b1\u5305\u79cd\u5b50","seed-error-info":"\u8bf7\u8f93\u5165\u79cd\u5b50","password-label":"\u65b0\u5bc6\u7801 (\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u94b1\u5305\u52a0\u5bc6\uff0c\u8bf7\u5c06\u5bc6\u7801\u7559\u7a7a)","confirm-label":"\u786e\u8ba4\u65b0\u5bc6\u7801","confirm-error-info":"\u4e24\u4e2a\u5bc6\u7801\u5fc5\u987b\u5339\u914d\u3002","reset-button":"\u91cd\u7f6e","done":"\u5bc6\u7801\u5df2\u6210\u529f\u91cd\u7f6e\u3002"},"tx":{"transaction-title":"\u4ea4\u6613","confirm-transaction-title":"\u786e\u8ba4\u4ea4\u6613","from-small-label":"\u6765\u81ea","to-small-label":"\u5230","date-small-label":"\u65e5\u671f","status-small-label":"\u72b6\u6001","coins-small-label":"\u5e01","hours-small-label":"\u5e01\u65f6","id-small-label":"\u4ea4\u6613ID","note-small-label":"\u65e5\u5fd7","without-note":"\u65e0\u65e5\u5fd7","show-more-link":"\u5c55\u793a\u66f4\u591a","hours-moved":"\u5df2\u8f6c\u79fb","hours-sent":"\u5df2\u53d1\u9001","hours-received":"\u5df2\u63a5\u6536","hours-burned":"\u5df2\u71c3\u70e7","inputs-title":"\u8f93\u5165","outputs-title":"\u8f93\u51fa","confirmed-transaction":"\u5df2\u786e\u8ba4","pending-transaction":"\u5f85\u5904\u7406","current-rate-help":"\u6309\u5f53\u524d\u6c47\u7387\u8ba1\u7b97"},"edit-note":{"title":"\u7f16\u8f91\u65e5\u5fd7","change-button":"\u4fee\u6539"},"backup":{"title":"\u5907\u4efd\u94b1\u5305","wallet-directory":"\u94b1\u5305\u76ee\u5f55:","seed-warning":"\u5728\u7eb8\u4e0a\u5907\u4efd\u4f60\u7684\u79cd\u5b50\uff0c\u5e76\u4fdd\u5b58\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u53ea\u8981\u6709\u79cd\u5b50\uff0c\u4f60\u5c31\u53ef\u4ee5\u627e\u56de\u4f60\u7684\u5e01\u3002","desc":"\u4f7f\u7528\u4e0b\u8868\u4ece\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u5f97\u5230\u79cd\u5b50\u3002
\u4e3a\u4e86\u4ece\u672a\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u83b7\u5f97\u79cd\u5b50\uff0c\u6253\u5f00\u4e0a\u9762\u7684\u6587\u4ef6\u5939,\u5728\u6587\u672c\u7f16\u8f91\u5668\u4e2d\u6253\u5f00.wlt\u6587\u4ef6\u5e76\u6062\u590d\u79cd\u5b50\u3002","wallet-table-label":"\u94b1\u5305\u540d","filename-table-label":"\u6587\u4ef6\u540d","save-addresses-button":"\u4fdd\u5b58\u5730\u5740","show-seed-button":"\u663e\u793a\u79cd\u5b50","no-wallets":"\u6ca1\u6709\u94b1\u5305","unencrypted-info":"\u51fa\u4e8e\u5b89\u5168\u539f\u56e0\uff0c\u65e0\u6cd5\u663e\u793a\u672a\u52a0\u5bc6\u94b1\u5305\u7684\u79cd\u5b50\u3002\u8981\u83b7\u5f97\u79cd\u5b50\uff0c\u8bf7\u4f7f\u7528\u5bc6\u7801\u5bf9\u94b1\u5305\u8fdb\u884c\u52a0\u5bc6\uff0c\u6216\u6309\u7167\u672c\u9875\u9876\u90e8\u663e\u793a\u7684\u8bf4\u660e\u8fdb\u884c\u64cd\u4f5c\u3002","hw-wallet-info":"\u8981\u83b7\u53d6\u786c\u4ef6\u94b1\u5305\u7684\u79cd\u5b50\uff0c\u8bf7\u4f7f\u7528\u94b1\u5305\u9875\u9762\u5e95\u90e8\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u9009\u9879\u3002","not-compatible-error":"\u4f60\u7684\u7f51\u9875\u6d4f\u89c8\u5668\u4e0e\u6b64\u529f\u80fd\u4e0d\u517c\u5bb9\u3002","seed-modal-window":{"title":"\u94b1\u5305\u79cd\u5b50","seed-label":"\u79cd\u5b50"}},"blockchain":{"title":"\u533a\u5757\u94fe","blocks-label":"\u533a\u5757\u6570\u91cf","time-label":"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u65f6\u95f4\u6233","hash-label":"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u54c8\u5e0c\u503c","current-supply-label":"\u76ee\u524d{{ coinName }}\u4f9b\u5e94\u91cf","total-supply-label":"{{ coinName }}\u7684\u603b\u4f9b\u5e94\u91cf","current-coinhour-supply-label":"\u76ee\u524d{{ coinHoursName }}\u4f9b\u5e94\u91cf","total-coinhour-supply-label":"{{ coinHoursName }}\u603b\u4f9b\u5e94\u91cf"},"network":{"title":"\u7f51\u7edc","error-no-connections":"\u65e0\u8fde\u63a5","peer-small-table-label":"\u8282\u70b9","source-small-table-label":"\u8282\u70b9\u6765\u6e90","block-height-small-table-label":"\u533a\u5757\u9ad8\u5ea6","block-height-short-small-table-label":"\u533a\u5757","last-seen-small-table-label":"\u4e0a\u4e00\u6b21\u51fa\u73b0","last-received-help":"\u4e0a\u4e00\u6b21\u63a5\u6536","last-sent-help":"\u4e0a\u4e00\u6b21\u53d1\u9001","in-help":"\u8fdb\u6765\u7684","out-help":"\u51fa\u53bb\u7684","sources":{"default":"\u9ed8\u8ba4\u8282\u70b9","exchange":"\u4ea4\u6362\u8282\u70b9"}},"pending-txs":{"title":"\u5f85\u5904\u7406\u4ea4\u6613","timestamp-table-label":"\u65f6\u95f4\u6233","txid-table-label":"\u4ea4\u6613ID","none":"\u65e0\u5f85\u5904\u7406\u4ea4\u6613","my-transactions-button":"\u6211\u7684","all-transactions-button":"\u5168\u90e8"},"outputs":{"title":"\u4ea4\u6613\u8f93\u51fa","error-no-outputs":"\u65e0\u53ef\u7528\u4ea4\u6613\u8f93\u51fa"},"history":{"title-and-button":"\u5386\u53f2","tx-detail-title":"\u4ea4\u6613\u660e\u7ec6","moving":"\u5185\u90e8\u8f6c\u8d26\u4e2d","moved":"\u5df2\u5185\u90e8\u8f6c\u8d26","sending":"\u53d1\u9001\u4e2d","sent":"\u5df2\u53d1\u9001","received":"\u5df2\u63a5\u6536","receiving":"\u63a5\u6536\u4e2d","pending-indication":"\u5f85\u5904\u7406","transaction-note-small-label":"\u65e5\u5fd7:","no-txs":"\u4f60\u6ca1\u6709\u5386\u53f2\u4ea4\u6613","no-txs-filter":"\u6ca1\u6709\u4e0e\u5f53\u524d\u7b5b\u9009\u6761\u4ef6\u5339\u914d\u7684\u4ea4\u6613","no-filter":"\u672a\u7ecf\u7b5b\u9009 (\u70b9\u51fb\u9009\u62e9\u94b1\u5305/\u5730\u5740)","filter":"\u5df2\u7b5b\u9009: ","filters":"\u5df2\u7b5b\u9009: ","all-addresses":"\u6240\u6709\u5730\u5740","view-all":"\u67e5\u770b\u6240\u6709{{ number }}\u6761\u8bb0\u5f55"},"teller":{"done":"\u5b8c\u6210","waiting-confirm":"\u7b49\u5f85\u786e\u8ba4","waiting-deposit":"\u7b49\u5f85\u6bd4\u7279\u5e01\u5145\u503c","waiting-send":"\u7b49\u5f85\u53d1\u9001Skycoin","unknown":"\u672a\u77e5"},"confirmation":{"default-title":"\u786e\u8ba4","yes-button":"\u662f","no-button":"\u5426"},"service":{"api":{"no-internet-error":"\u4f60\u6ca1\u6709\u4e92\u8054\u7f51\u8fde\u63a5\u6216\u8282\u70b9\u5df2\u505c\u6b62\u5de5\u4f5c\u3002","incorrect-password-error":"\u5bc6\u7801\u9519\u8bef\u3002","unknown-error":"\u65e0\u6cd5\u6267\u884c\u5f53\u524d\u64cd\u4f5c\u3002","api-disabled-error":"API\u5df2\u7981\u7528\u3002"}},"force-skywallet-wipe":{"title":"\u5f3a\u5236\u6e05\u9664\u786c\u4ef6\u94b1\u5305","operation-warning":"\u8b66\u544a: \u6b64\u9009\u9879\u4ec5\u5728\u65e0\u6cd5\u5c06\u8bbe\u5907\u4e0e\u5e38\u89c4\u9009\u9879\u4e00\u8d77\u4f7f\u7528\u7684\u60c5\u51b5\u4e0b\u7528\u4f5c\u6700\u540e\u7684\u9009\u62e9\u3002 \u8bbe\u5907\u4e0a\u7684\u6240\u6709\u6570\u636e\u90fd\u5c06\u88ab\u5220\u9664\uff0c\u56e0\u6b64\u60a8\u5c06\u9700\u8981\u79cd\u5b50\u624d\u80fd\u6062\u590d\u8d44\u91d1\u3002","proceed-button":"\u6267\u884c"},"hardware-wallet":{"general":{"default-wallet-name":"\u65b0\u786c\u4ef6\u94b1\u5305","confirm":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u3002","confirm-and-more":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u5e76\u6309\u9075\u5faa\u6307\u793a\u3002","follow":"\u8bf7\u6309\u7167\u786c\u4ef6\u94b1\u5305\u4e0a\u663e\u793a\u7684\u8bf4\u660e\u8fdb\u884c\u64cd\u4f5c\u3002","completed":"\u64cd\u4f5c\u5b8c\u6210\u3002","name-updated":"\u7528\u4e8e\u5728\u94b1\u5305\u5217\u8868\u4e2d\u6807\u8bc6\u6b64\u786c\u4ef6\u94b1\u5305\u7684\u540d\u79f0\u5df2\u66f4\u65b0\uff0c\u4ee5\u5339\u914d\u8bbe\u5907\u4e0a\u663e\u793a\u7684\u540d\u79f0\u3002"},"errors":{"generic-error":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786e\u4fdd\u4f60\u5df2\u7ecf\u8fde\u63a5\u4e86\u4e00\u4e2a\u6709\u6548\u7684\u786c\u4ef6\u94b1\u5305\uff0c\u5e76\u4e14\u5b83\u6ca1\u6709\u5728\u7b49\u5f85\u8f93\u5165\u3002","disconnected":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786c\u4ef6\u94b1\u5305\u672a\u8fde\u63a5\u3002","incorrect-wallet":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u4e0e\u9884\u671f\u7684\u4e0d\u540c\u3002","incorrect-pin":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684PIN\u7801\u4e0d\u6b63\u786e\u3002","refused":"\u64cd\u4f5c\u5931\u8d25\u6216\u88ab\u53d6\u6d88\u3002","too-many-inputs-outputs":"\u4ea4\u6613\u4e2d\u786c\u4ef6\u94b1\u5305\u7684\u8f93\u5165\u6216\u8f93\u51fa\u8fc7\u591a\u3002\u8bf7\u5c1d\u8bd5\u521b\u5efa\u591a\u4e2a\u8f83\u5c0f\u7684\u4ea4\u6613\uff0c\u6bcf\u4e2a\u4ea4\u6613\u4fdd\u8bc1\u8f83\u5c0f\u6570\u91cf\u7684\u6536\u4ef6\u4eba.","daemon-connection":"\u8fde\u63a5\u5230\u786c\u4ef6\u94b1\u5305\u5b88\u62a4\u7a0b\u5e8f\u65f6\u51fa\u73b0\u95ee\u9898\uff0c\u8bf7\u786e\u4fdd\u5176\u6b63\u5728\u8fd0\u884c\uff0c\u7136\u540e\u91cd\u8bd5\u3002\u4f60\u53ef\u4ee5\u4ecewww.skycoin.com/downloads\u4e0b\u8f7d","daemon-connection-with-configurable-link":"\u8fde\u63a5\u5230\u786c\u4ef6\u94b1\u5305\u5b88\u62a4\u7a0b\u5e8f\u65f6\u51fa\u73b0\u95ee\u9898\uff0c\u8bf7\u786e\u4fdd\u5176\u6b63\u5728\u8fd0\u884c\uff0c\u7136\u540e\u91cd\u8bd5\u3002\u4e0b\u8f7d","timeout":"\u7531\u4e8e\u4e0d\u6d3b\u52a8\uff0c\u64cd\u4f5c\u88ab\u53d6\u6d88\u3002 \u8bf7\u518d\u8bd5\u4e00\u6b21\u3002","timeout-with-configurable-link":"\u7531\u4e8e\u4e0d\u6d3b\u52a8\uff0c\u64cd\u4f5c\u88ab\u53d6\u6d88\u3002 \u8bf7\u518d\u8bd5\u4e00\u6b21\u3002 \u5982\u679c\u6b64\u95ee\u9898\u5bfc\u81f4\u8bbe\u5907\u65e0\u6cd5\u4f7f\u7528\uff0c\u5219\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u9009\u9879\uff1a","invalid-address-generated":"\u5730\u5740\u751f\u6210\u5668\u5b58\u5728\u95ee\u9898\uff0c\u5fc5\u987b\u53d6\u6d88\u8be5\u64cd\u4f5c.","invalid-address":"\u65e0\u6548\u5730\u5740.","not-in-bootloader-mode":"\u4f7f\u7528\u8be5\u9009\u9879\uff0c\u786c\u4ef6\u94b1\u5305\u5fc5\u987b\u8fdb\u5165bootloader\u6a21\u5f0f."},"security-warning":{"title":"\u5b89\u5168\u8b66\u544a","text":"\u4e0a\u6b21\u8fde\u63a5\u6b64\u786c\u4ef6\u94b1\u5305\u65f6\uff0c\u53d1\u73b0\u4e00\u4e2a\u6216\u591a\u4e2a\u5b89\u5168\u8b66\u544a\u3002\u6211\u4eec\u5efa\u8bae\u4f60\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u9009\u9879(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684\\"\u786c\u4ef6\u94b1\u5305\\"\u6309\u94ae)\u5e76\u4fdd\u6301\u8bbe\u5907\u5df2\u8fde\u63a5\uff0c\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u89e3\u51b3\u5b89\u5168\u95ee\u9898","link":"\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u9009\u9879\u7a97\u53e3."},"options":{"connecting":"\u8fde\u63a5...","disconnected":"\u6ca1\u6709\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8bf7\u8fde\u63a5\u786c\u4ef6\u94b1\u5305\u540e\u4f7f\u7528\u6b64\u9009\u9879\u3002","unconfigured-detected-title":"\u672a\u914d\u7f6e\u7684\u786c\u4ef6\u94b1\u5305","unconfigured-detected":"\u68c0\u6d4b\u5230\u65e0\u79cd\u5b50\u7684\u786c\u4ef6\u94b1\u5305\u3002\u9009\u62e9\\"\u81ea\u52a8\u914d\u7f6e\\"\u5982\u679c\u4f60\u60f3\u5c06\u5176\u914d\u7f6e\u4e3a\u5168\u65b0\u7684\u94b1\u5305\u5e76\u7acb\u5373\u5f00\u59cb\u4f7f\u7528\u5b83\uff0c\u6216\u9009\u62e9\\"\u6062\u590d\u5907\u4efd\\"\u5982\u679c\u4f60\u60f3\u4f7f\u7528\u5148\u524d\u521b\u5efa\u7684\u5907\u4efd\u79cd\u5b50\u5bf9\u5176\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u80fd\u591f\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u4ea7\u3002","configured-detected":"\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8be5\u8bbe\u5907\u5728\u94b1\u5305\u5217\u8868\u4e2d\u88ab\u8bc6\u522b\u4e3a:","security-warnings-title":"\u5b89\u5168\u8b66\u544a","security-warning-title":"\u5b89\u5168\u8b66\u544a","unchecked-version-warning":"\u65e0\u6cd5\u68c0\u6d4b\u786c\u4ef6\u94b1\u5305\u56fa\u4ef6\u662f\u5426\u6700\u65b0\u7248\u672c\u3002\u53ef\u80fd\u539f\u56e0\u662f\u7f51\u7edc\u5b58\u5728\u95ee\u9898\u6216\u8005\u670d\u52a1\u5904\u4e8e\u7ef4\u62a4\u72b6\u6001.","outdated-version-warning":"\u786c\u4ef6\u94b1\u5305\u56fa\u4ef6\u7248\u672c\u8fc7\u4f4e\u3002\u4e3a\u4e86\u94b1\u5305\u5b89\u5168\uff0c\u5efa\u8bae\u70b9\u51fb\\"\u66f4\u65b0\u56fa\u4ef6\\"\uff0c\u5c3d\u5feb\u5347\u7ea7","backup-warning":"\u4f60\u5e94\u8be5\u5907\u4efd\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\uff0c\u5426\u5219\u4e07\u4e00\u51fa\u73b0\u95ee\u9898\uff0c\u4f60\u53ef\u80fd\u5c06\u65e0\u6cd5\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\uff0c\u8981\u505a\u5230\u8fd9\u4e00\u70b9\u3002\u9009\u62e9\\"\u521b\u5efa\u4e00\u4e2a\u5907\u4efd\\"\u9009\u9879\u3002","pin-warning":"\u5f53\u524d\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u672a\u8bbe\u7f6e\u5bc6\u7801\u3002\u5bc6\u7801\u53ef\u4fdd\u62a4\u786c\u4ef6\u94b1\u5305\uff0c\u4ee5\u9632\u4e22\u5931\u3001\u76d7\u7a83\u548c\u9ed1\u5ba2\u5165\u4fb5\u3002\u8981\u521b\u5efa\u4e00\u4e2a\u5bc6\u7801\uff0c\u9009\u62e9\\"\u521b\u5efaPIN\u7801\\"\u9009\u9879\u3002","options":"\u9009\u9879:","update-firmware":"\u66f4\u65b0\u56fa\u4ef6","configure-automatically":"\u81ea\u52a8\u914d\u7f6e","restore-backup":"\u6062\u590d\u5907\u4efd","create-backup":"\u521b\u5efa\u5907\u4efd","wipe":"\u5220\u9664\u8bbe\u5907","confirm-seed":"\u786e\u8ba4\u79cd\u5b50","create-pin":"\u521b\u5efa\u5bc6\u7801","change-pin":"\u66f4\u6539\u5bc6\u7801","delete-pin":"\u5220\u9664\u5bc6\u7801","forgotten-pin-part1":"\u5982\u679c\u4f60\u56e0\u4e3a\u5fd8\u8bb0\u5bc6\u7801\u800c\u65e0\u6cd5\u8fdb\u5165\u94b1\u5305\uff0c\u4f60\u53ef\u4ee5\u5220\u9664\u786c\u4ef6\u94b1\u5305\uff0c\u7136\u540e\u901a\u8fc7\u79cd\u5b50","forgotten-pin-part2":"\u6062\u590d","firmware-version":"\u56fa\u4ef6\u7248\u672c:"},"update-firmware-warning":{"title":"\u56fa\u4ef6\u7248\u672c\u8fc7\u4f4e","text":"\u8b66\u544a: \u5f53\u524d\u786c\u4ef6\u94b1\u5305\u7684\u56fa\u4ef6\u7248\u672c\u8fc7\u4f4e\u3002\u4e3a\u4e86\u5b89\u5168\uff0c\u5efa\u8bae\u66f4\u65b0.","update":"\u66f4\u65b0"},"update-firmware":{"title-connecting":"\u8fde\u63a5\u4e2d...","title-update":"\u66f4\u65b0\u56fa\u4ef6","title-install":"\u5b89\u88c5\u56fa\u4ef6","text-downloading":"\u68c0\u6d4b\u8bbe\u5907\u5e76\u4e0b\u8f7d\u6587\u4ef6...","text-bootloader":"\u8b66\u544a: \u5982\u679c\u4f60\u5df2\u914d\u7f6e\u8fc7\u6539\u8bbe\u5907\uff0c\u7ee7\u7eed\u4e4b\u524d\uff0c\u8bf7\u52a1\u5fc5\u786e\u4fdd\u4f60\u5df2\u5c06\u79cd\u5b50\u5907\u4efd\uff0c\u5426\u5219\u4f60\u7684\u8d44\u4ea7\u53ef\u80fd\u4f1a\u6c38\u4e45\u4e22\u5931","text-not-bootloader":"\u66f4\u65b0\u786c\u4ef6\u94b1\u5305\uff0c\u8bf7\u4ee5bootloader\u6a21\u5f0f\u8fde\u63a5\u8bbe\u5907(\u6309\u4e0b\u8bbe\u5907\u7684\u4e24\u4e2a\u7269\u7406\u6309\u94ae\u7684\u540c\u4e8b\u5c06\u5176\u8fde\u63a5\u5230\u8ba1\u7b97\u673a)","text-no-firmware":"\u6b22\u8fce\u3002\u5f53\u524d\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u5c1a\u672a\u5b89\u88c5\u56fa\u4ef6\u3002\u73b0\u5728\u5c06\u5b89\u88c5\u56fa\u4ef6\uff0c\u4ee5\u4fbf\u4f60\u5f00\u59cb\u4f7f\u7528\u8be5\u8bbe\u5907\u3002\u6ce8\u610f: \u5982\u679c\u4f60\u5df2\u914d\u7f6e\u8fc7\u6539\u8bbe\u5907\u5e76\u60f3\u8981\u6062\u590d\u8d44\u4ea7\uff0c\u4f60\u9700\u8981\u79cd\u5b50.","follow":"\u66f4\u65b0\u56fa\u4ef6\u5df2\u53d1\u9001\u81f3\u786c\u4ef6\u94b1\u5305\u3002\u8bf7\u5728\u8bbe\u5907\u4e0a\u7ee7\u7eed.","connection-error":"\u65e0\u6cd5\u4e0b\u8f7d\u56fa\u4ef6\u3002\u53ef\u80fd\u662f\u7f51\u7edc\u8fde\u63a5\u95ee\u9898\u6216\u8005\u670d\u52a1\u5904\u4e8e\u7ef4\u62a4\u72b6\u6001.","timeout":"\u7531\u4e8e\u4e0d\u6d3b\u52a8\uff0c\u64cd\u4f5c\u88ab\u53d6\u6d88\u3002\u8bf7\u65ad\u5f00\u8bbe\u5907\u8fde\u63a5\uff0c\u5e76\u5728\u91cd\u65b0\u8fde\u63a5\u540e\u91cd\u8bd5.","finished":"\u8bbe\u5907\u914d\u7f6e\u6210\u529f\u3002\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u8bf7\u62d4\u9664\u8bbe\u5907."},"generate-seed":{"text":"\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u4f60\u53ef\u4ee5\u9009\u62e9\u751f\u6210\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002\u79cd\u5b50\u662f\u4e00\u4e2a\u5355\u8bcd\u5217\u8868\uff0c\u51fa\u73b0\u95ee\u9898\u540e\u53ef\u4ee5\u7528\u6765\u6062\u590d\u8bbf\u95ee\u4f60\u7684\u5e01\u3002\u6240\u6709\u9009\u9879\u90fd\u662f\u5b89\u5168\u7684\uff0c\u5982\u679c\u4f60\u6ca1\u6709\u7279\u6b8a\u539f\u56e0\u5fc5\u987b\u9009\u62e9\u67d0\u4e00\u9879\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u9ed8\u8ba4\u503c\u3002","configuring":"\u914d\u7f6e..."},"restore-seed":{"text":"\u5728\u7ee7\u7eed\u524d\uff0c\u8bf7\u9009\u62e9\u4f60\u60f3\u8981\u6062\u590d\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u91cf\u3002","check-text":"\u4f60\u53ef\u4ee5\u4f7f\u7528\u6b64\u9009\u9879\u8f93\u5165\u79cd\u5b50\uff0c\u5e76\u68c0\u67e5\u5b83\u662f\u5426\u4e0e\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4e00\u81f4\u3002\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u9009\u62e9\u4f60\u60f3\u8981\u68c0\u67e5\u7684\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002","warning":"\u8b66\u544a: \u4e3a\u4e86\u907f\u514d\u53ef\u80fd\u51fa\u73b0\u7684\u95ee\u9898\uff0c\u8bf7\u4ec5\u4f7f\u7528\u540c\u4e00\u54c1\u724c/\u578b\u53f7\u7684\u786c\u4ef6\u94b1\u5305\u521b\u5efa\u79cd\u5b50\u3002","error-wrong-word":"\u9519\u8bef: \u91cd\u65b0\u952e\u5165\u7684\u5355\u8bcd\u4e0e\u786c\u4ef6\u94b1\u5305\u6240\u8bf7\u6c42\u7684\u4e0d\u5339\u914d\u3002","error-invalid-seed":"\u9519\u8bef: \u79cd\u5b50\u65e0\u6548\u3002\u8bf7\u52a1\u5fc5\u6309\u6b63\u786e\u7684\u987a\u5e8f\u8f93\u5165\u6b63\u786e\u7684\u5355\u8bcd\u3002","error-wrong-seed":"\u9519\u8bef: \u79cd\u5b50\u662f\u6709\u6548\u7684\uff0c\u4f46\u4e0e\u8bbe\u5907\u4e2d\u7684\u79cd\u5b50\u4e0d\u5339\u914d\u3002","correct-seed":"\u79cd\u5b50\u6709\u6548\u5e76\u4e0e\u8bbe\u5907\u4e2d\u7684\u5339\u914d."},"added":{"title":"\u65b0\u786c\u4ef6\u94b1\u5305","configuring":"\u68c0\u6d4b\u5230\u65b0\u7684\u786c\u4ef6\u94b1\u5305\u3002\u914d\u7f6e...","done":"\u5df2\u5b8c\u6210","added1":"\u5df2\u8fde\u63a5\u7684\u786c\u4ef6\u7684\u94b1\u5305\u5df2\u7ecf\u7528\u5982\u4e0b\u540d\u5b57\u88ab\u6dfb\u52a0\u5230\u94b1\u5305\u5217\u8868:","added2":"\u73b0\u5728\u4f60\u53ef\u4ee5\u67e5\u770b\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4f59\u989d\u548c\u5730\u5740\u4e86\uff0c\u5373\u4f7f\u786c\u4ef6\u94b1\u5305\u5e76\u672a\u8fde\u63a5\u3002\u6b64\u5916\u5982\u679c\u4f60\u613f\u610f\uff0c\u4f60\u8fd8\u53ef\u4ee5\u66f4\u6539\u94b1\u5305\u540d\u79f0\u6216\u4ece\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u5220\u9664\u3002","added-error-info":"\u4f60\u5fc5\u987b\u586b\u5199\u4e00\u4e2a\u540d\u79f0.","characters-warning":"\u5982\u679c\u4f60\u4f7f\u7528\u975e\u6807\u51c6\u82f1\u8bed\u5b57\u7b26\uff0c\u5b83\u53ef\u80fd\u65e0\u6cd5\u6b63\u786e\u7684\u663e\u793a\u5728\u8bbe\u5907\u4e0a."},"wipe":{"warning":"\u8b66\u544a: \u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u6240\u6709\u6570\u636e\u5c06\u88ab\u5220\u9664\u3002\u5982\u679c\u6ca1\u6709\u5907\u4efd\uff0c\u4f60\u5c06\u65e0\u6cd5\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\u3002","confirm-delete-check":"\u8fd8\u662f\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u4e2d\u5220\u9664"},"create-backup":{"warning":"\u8b66\u544a: \u4f60\u53ea\u80fd\u4f7f\u7528\u6b64\u9009\u9879\u5907\u4efd\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\u4e00\u6b21\u3002\u5982\u679c\u4f60\u51b3\u5b9a\u7ee7\u7eed\uff0c\u4f60\u5c06\u4e0d\u5f97\u4e0d\u5199\u4e0b\u4e00\u7ec4\u5355\u8bcd(\u5efa\u8bae\u5199\u5728\u7eb8\u4e0a\uff0c\u800c\u4e0d\u662f\u7535\u8111\u4e0a)\uff0c\u8fd9\u4e9b\u5355\u8bcd\u5c06\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\uff0c\u5e76\u5c06\u5176\u5b58\u50a8\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u4efb\u4f55\u53ef\u4ee5\u8bbf\u95ee\u5355\u8bcd\u5217\u8868(\\"\u79cd\u5b50\\")\u7684\u4eba\u90fd\u53ef\u4ee5\u8bbf\u95ee\u94b1\u5305\u4f59\u989d\uff0c\u56e0\u6b64\u5efa\u8bae\u8bf7\u683c\u5916\u8c28\u614e\u3002","instructions":"\u5199\u4e0b\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u7684\u5355\u8bcd\u5217\u8868\u3002\u4e00\u5b9a\u8981\u6309\u987a\u5e8f\u5e76\u628a\u6bcf\u4e2a\u5355\u8bcd\u90fd\u5199\u5bf9\u3002"},"seed-word":{"title":"\u8f93\u5165\u5b57","enter-word":"\u8f93\u5165\u8bbe\u5907\u4e2d\u663e\u793a\u7684\u5b57","info":"\u4f60\u5c06\u88ab\u8981\u6c42\u4ee5\u968f\u673a\u7684\u987a\u5e8f\u8f93\u5165\u4f60\u5907\u4efd\u7684\u79cd\u5b50\uff0c\u52a0\u4e0a\u4e00\u4e9b\u989d\u5916\u7684\u5b57\u3002","word-label":"\u8981\u6c42\u7684\u5b57","error-invalid-word":"\u8f93\u5165\u5b57\u65e0\u6548\u3002","error-loading-words":"\u6b63\u5728\u52a0\u8f7d\u5b57\u5217\u8868\u3002\u8bf7\u7a0d\u7b49\u3002"},"change-pin":{"pin-mismatch":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684\u4e24\u4e2a\u5bc6\u7801\u4e0d\u5339\u914d"},"remove-pin":{"warning":"\u8b66\u544a: \u4e0d\u5efa\u8bae\u4ece\u786c\u4ef6\u94b1\u5305\u4e2d\u5220\u9664\u5bc6\u7801\uff0c\u56e0\u4e3a\u5b83\u5c06\u5f88\u5bb9\u6613\u88ab\u672a\u7ecf\u6388\u6743\u7684\u5404\u65b9\u4f7f\u7528\u3002"},"enter-pin":{"title":"\u8f93\u5165\u5bc6\u7801","title-change-current":"\u8f93\u5165\u5f53\u524d\u5bc6\u7801","title-change-new":"\u8f93\u5165\u65b0\u7684\u5bc6\u7801","title-change-confirm":"\u786e\u8ba4\u65b0\u7684\u5bc6\u7801","instructions-generic":" \u5bc6\u7801\u5df2\u663e\u793a\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\u3002","instructions-tx":"\u8fdb\u5165\u5bc6\u7801\u4ee5\u786e\u8ba4\u5e76\u7b7e\u7f72\u4ea4\u6613\u3002","instructions-change":"\u8bf7\u8f93\u5165\u4e00\u4e2a4\u52308\u4e2a\u6570\u5b57\u4e4b\u95f4\u7684\u96be\u4ee5\u88ab\u731c\u4e2d\u7684\u5bc6\u7801\u3002","help":"\u9700\u8981\u5e2e\u52a9\uff1f"},"pin-help":{"title":"\u5e2e\u52a9","part1":"\u5f53\u9700\u8981\u8f93\u5165\u5bc6\u7801\u624d\u80fd\u7ee7\u7eed\u65f6\uff0c\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4f1a\u663e\u793a\u4e00\u4e2a\u77e9\u9635\uff0c\u77e9\u9635\u75319\u4e2a\u968f\u673a\u6392\u5217\u7684\u5757\u7ec4\u6210(\u6bcf\u6b21\u987a\u5e8f\u90fd\u4f1a\u6539\u53d8)\uff0c\u4f60\u5c06\u88ab\u8981\u6c42\u5728\u8f6f\u4ef6\u94b1\u5305\u4e2d\u8f93\u5165\u5bc6\u7801\uff0c\u4f7f\u7528\u4e00\u4e2a\u77e9\u9635\uff0c\u6b64\u77e9\u9635\u5305\u542b9\u4e2a\u6309\u94ae\uff0c\u53ea\u663e\u793a\u7b26\u53f7#\u3002","part2":"\u8981\u8f93\u5165\u5bc6\u7801\uff0c\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u4ee5\u6570\u5b57\u77e9\u9635\u67e5\u770b\u5bc6\u7801\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u76f8\u5e94\u6309\u94ae\u3002\u4f8b\u5982\uff0c\u5982\u679c\u5bc6\u7801\u4e3a\\"23\\"\u4e14\u6570\u5b572\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u5de6\u4e0a\u89d2\uff0c\u6570\u5b573\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u6b63\u4e2d\u95f4\uff0c\u5219\u6309\u987a\u5e8f\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u5de6\u4e0a\u89d2\u548c\u4e2d\u95f4\u6309\u94ae\u3002","part3":"\u5982\u679c\u4f60\u613f\u610f\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528\u952e\u76d8\u4e0a\u7684\u5c0f\u952e\u76d8\u8f93\u5165\u5bc6\u7801\u3002\u4f46\u662f\uff0c\u5982\u4e4b\u524d\u793a\u4f8b\u6240\u793a\uff0c\u5982\u679c\u5bc6\u7801\u662f\\"23\\"\uff0c\u4f60\u4e0d\u80fd\u7b80\u5355\u5730\u7528\u5c0f\u952e\u76d8\u952e\u5165\\"23\\"\uff0c\u800c\u662f\u5fc5\u987b\u9009\u62e9\u70b9\u51fb\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a2\u548c3\u5bf9\u5e94\u4f4d\u7f6e\u7684\u503c\u3002"},"create-tx":{"title":"\u521b\u5efa\u4ea4\u6613","upper-text":"\u8bf7\u786e\u8ba4\u4ee5\u4e0b\u6570\u636e\u662f\u5426\u4e0e\u4f60\u8981\u53d1\u9001\u7684\u4ea4\u6613\u4ee5\u53ca\u786c\u4ef6\u94b1\u5305\u663e\u793a\u7684\u4ea4\u6613\u5b8c\u5168\u5339\u914d\uff0c\u7136\u540e\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c:","lower-text":"\u5982\u679c\u4efb\u4f55\u6570\u636e\u4e0e\u786c\u4ef6\u94b1\u5305\u663e\u793a\u7684\u5185\u5bb9\u6216\u60a8\u5e0c\u671b\u53d1\u9001\u7684\u4ea4\u6613\u4e0d\u7b26\uff0c\u8bf7\u53d6\u6d88\u786c\u4ef6\u94b1\u5305\u4e0a\u7684\u64cd\u4f5c.","separator-for-coins-and-hours":"\u548c","separator-to-destination":"\u81f3"},"confirm-address":{"title":"\u786e\u8ba4\u5730\u5740","instructions":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u786e\u8ba4\uff0c\u5982\u679c\u5730\u5740\u4e3a:","short-confirmation":"\u5730\u5740\u5df2\u786e\u8ba4","confirmation":"\u5730\u5740\u5df2\u786e\u8ba4\u3002\u4e3a\u4e86\u5b89\u5168\uff0c\u9009\u62e9 \\"\u786e\u8ba4\u5730\u5740\\" \u9009\u9879\u53ef\u4ee5\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u518d\u6b21\u663e\u793a\u5730\u5740\uff0c\u5728\u83dc\u5355\u4e2d\u53ef\u70b9\u51fb\u5730\u5740\u4f59\u989d\u53f3\u4fa7\u7684\u6309\u94ae\u663e\u793a\u3002"}},"time-from-now":{"few-seconds":"\u51e0\u79d2\u949f\u4e4b\u524d","minute":"\u4e00\u5206\u949f\u4e4b\u524d","minutes":"{{time}} \u5206\u949f\u4e4b\u524d","hour":"\u4e00\u5c0f\u65f6\u4e4b\u524d","hours":"{{time}} \u5c0f\u65f6\u4e4b\u524d","day":"\u4e00\u5929\u4e4b\u524d","days":"{{time}} \u5929\u4e4b\u524d"},"exchange":{"title-and-button":"\u4e70 {{ coinName }}","label-you-send":"\u4f60\u53d1\u9001","label-you-get":"\u4f60\u6536\u5230 (\u5927\u7ea6)","label-to-address":"\u5230 {{coin}} \u5730\u5740","label-price":"\u4ea4\u6613\u6c47\u7387","label-stimate-transaction-time":"\u4ea4\u6613\u65f6\u95f4","exchange-button":"\u4ea4\u6613","min-amount":"\u6700\u5c0f\u6570\u989d:","max-amount":"\u6700\u5927\u6570\u989d:","agree-part1":"\u6211\u540c\u610f","agree-part2":"\u4f7f\u7528\u6761\u6b3e","agree-part3":"\u548c","agree-part4":"\u9690\u79c1\u653f\u7b56","powered-by":"\u6280\u672f\u652f\u6301","need-help":"\u9700\u8981\u5e2e\u52a9?","support-portal":"\u5e2e\u52a9\u5165\u53e3","history":"\u8ba2\u5355\u5386\u53f2","order-not-found":"\u8ba2\u5355\u672a\u627e\u5230","label-status":"\u72b6\u6001","exchanging":"{{from}}\u4ea4\u6613{{to}}","destination-select-from-list-link":"\u9009\u62e9","unavailable":"\u7f51\u9875\u7248\u672c\u6682\u4e0d\u63d0\u4f9b\u4ea4\u6613\u670d\u52a1","offline":"\u4ea4\u6613\u6682\u65f6\u4e0b\u7ebf","problem-connecting":"\u672a\u80fd\u8fde\u63a5\u5230\u670d\u52a1\u5668\u3002\u8bf7\u68c0\u67e5\u4f60\u7684\u7f51\u7edc\u8fde\u63a5\u5e76\u7a0d\u540e\u518d\u8bd5\u3002","invalid-address-error":"\u65e0\u6548\u5730\u5740.","from-coin-error-info":"\u8bf7\u9009\u62e9\u5e01","invalid-value-error-info":"\u65e0\u6548\u7684\u503c.","address-error-info":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u5730\u5740.","statuses":{"user-waiting":"\u7b49\u5f85\u5145\u503c\u3002\u8bf7\u5c06{{amount}} {{from}}\u53d1\u9001\u5230\u4e0b\u9762\u663e\u793a\u7684\u4ea4\u6613\u5730\u5740","user-waiting-info":"\u7cfb\u7edf\u6b63\u5728\u7b49\u5f85\u4f60\u5145\u503c\u5230\u4ea4\u6613\u5730\u5740\u3002\u4ea4\u6613\u5c06\u5728\u7cfb\u7edf\u68c0\u6d4b\u5230\u4f60\u7684\u5145\u503c\u5e76\u5728\u533a\u5757\u94fe\u4e2d\u786e\u8ba4\u540e\u5f00\u59cb\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u5145\u503c\uff0c\u5e94\u8be5\u5f88\u5feb\u5c31\u4f1a\u68c0\u6d4b\u5230\u3002","market-waiting-confirmations":"\u7b49\u5f85\u94fe\u4e0a\u4ea4\u6613\u786e\u8ba4","market-waiting-confirmations-info":"\u5df2\u7ecf\u68c0\u6d4b\u5230\u5145\u503c\uff0c\u7b49\u5f85\u533a\u5757\u94fe\u4e2d\u88ab\u786e\u8ba4\u3002","market-confirmed":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u63a5\u53d7","market-confirmed-info":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u7ecf\u5728\u533a\u5757\u94fe\u4e0a\u786e\u8ba4\u3002\u51c6\u5907\u9a6c\u4e0a\u6267\u884c\u5151\u6362\u3002","market-exchanged":"\u5b8c\u6210{{from}}\u5230{{to}}\u7684\u5151\u6362","market-exchanged-info":"\u5151\u6362\u5df2\u7ecf\u5b8c\u6210\u3002\u8d44\u91d1\u5c06\u5f88\u5feb\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740\u3002","market-withdraw-waiting":"\u6b63\u5728\u53d1\u9001{{to}}\u5230\u4f60\u7684\u5730\u5740","market-withdraw-waiting-info":"\u53d1\u9001{{to}}\u5230\u4f60\u5730\u5740\u7684\u8fdb\u7a0b\u5df2\u542f\u52a8","complete":"\u4ea4\u6613\u5df2\u5b8c\u6210!","complete-info":"\u8d44\u91d1\u5df2\u7ecf\u6210\u529f\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740.","error":"\u53d1\u751f\u9519\u8bef","error-info":"\u8fd0\u8f6c\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u4f60\u53ef\u4ee5\u5728\u4e0b\u9762\u627e\u5230\u66f4\u591a\u4fe1\u606f\u3002\u5982\u679c\u4f60\u9700\u8981\u5e2e\u52a9\uff0c\u8bf7\u4fdd\u5b58\u4e0b\u9762\u663e\u793a\u7684\u6240\u6709\u6570\u636e\u5e76\u4f7f\u7528\u9875\u9762\u53f3\u4e0b\u89d2\u7684\u5e2e\u52a9\u94fe\u63a5\u6765\u8054\u7cfb\u6280\u672f\u652f\u6301.","user-deposit-timeout":"\u7531\u4e8e\u65e0\u6d3b\u52a8\uff0c\u8ba2\u5355\u88ab\u53d6\u6d88.","user-deposit-timeout-info":"\u7cfb\u7edf\u672a\u68c0\u6d4b\u5230\u5145\u503c\uff0c\u8ba2\u5355\u5df2\u53d6\u6d88\uff0c\u8bf7\u91cd\u65b0\u4e0b\u5355\u3002\u5982\u679c\u9700\u8981\u5e2e\u52a9\uff0c\u8bf7\u4fdd\u5b58\u4e0b\u9762\u663e\u793a\u7684\u6240\u6709\u64cd\u4f5c\u6570\u636e\uff0c\u5e76\u4f7f\u7528\u672c\u9875\u53f3\u4e0b\u65b9\u7684\u94fe\u63a5\u4e0e\u6280\u672f\u652f\u6301\u8054\u7cfb."},"history-window":{"title":"\u8ba2\u5355\u5386\u53f2","address":"\u5730\u5740:","date":"\u65e5\u671f:"},"details":{"exchange-addr-label":"\u4ea4\u6613\u5730\u5740","exchange-addr-tag-label":"\u652f\u4ed8ID\u6216\u4ea4\u6613\u5fc5\u987b\u7528\u5230\u7684\u76ee\u6807\u6807\u7b7e","tx-id-label":"\u4ea4\u6613ID","order-id-label":"\u8ba2\u5355ID","initial-price-label":"\u521d\u59cb\u6c47\u7387","error-msg-label":"\u9519\u8bef\u4fe1\u606f ","details-link":"\u8be6\u60c5","start-date-label":"\u5f00\u59cb\u65e5\u671f","back-alert":"\u64cd\u4f5c\u6b63\u5728\u6267\u884c\u3002\u4f60\u771f\u7684\u60f3\u8981\u8fd4\u56de\u5230\u8868\u683c\u5417\uff1f\u4f60\u53ef\u4ee5\u901a\u8fc7\u70b9\u51fb\\"\u8ba2\u5355\u5386\u53f2\\"\u518d\u6b21\u770b\u5230\u6267\u884c\u8fc7\u7a0b"}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/813.1a1a8e09f2bd06a481f1.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/813.1a1a8e09f2bd06a481f1.js new file mode 100644 index 0000000000..591769b8f9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/813.1a1a8e09f2bd06a481f1.js @@ -0,0 +1 @@ +(self.webpackChunkdesktopwallet=self.webpackChunkdesktopwallet||[]).push([[813],{61813:function(e){"use strict";e.exports=JSON.parse('{"common":{"coin-id":"SKY","coin-hours":"CH","loading":"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...","new":"\u041d\u043e\u0432\u044b\u0439","load":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c"},"errors":{"fetch-version":"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441 Github","incorrect-password":"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c","api-disabled":"API \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d","no-wallet":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","no-outputs":"\u041d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432"},"title":{"wallets":"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u0438","send":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","history":"\u0418\u0441\u0442\u043e\u0440\u0438\u044f","buy-coin":"\u041a\u0443\u043f\u0438\u0442\u044c Skycoin","network":"\u0421\u0435\u0442\u044c","blockchain":"\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d","outputs":"\u0412\u044b\u0445\u043e\u0434\u044b (Outputs)","transactions":"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","pending-txs":"\u041d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","backup":"\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","explorer":"Skycoin \u044d\u043a\u0441\u043f\u043b\u043e\u0440\u0435\u0440","seed":"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f","qrcode":"QR-\u043a\u043e\u0434"},"header":{"syncing-blocks":"\u0418\u0434\u0451\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432...","update1":"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","update2":"\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e.","pending-txs1":"\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","pending-txs2":"\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.","pending-txs3":"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0442\u044c\u044e.","errors":{"no-connections":"\u041d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u0432\u0430\u0448 \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0437\u043b\u0430\u043c!","no-backend1":"\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443. \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u0435\u044c \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435","no-backend2":"\u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c\u0435.","no-backend3":"","csrf":"\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438: CSRF \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442."}},"password":{"title":"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c","label":"\u041f\u0430\u0440\u043e\u043b\u044c","confirm-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c","button":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"},"buy":{"deposit-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430:","select-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441","generate":"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c","deposit-location":"\u0410\u0434\u0440\u0435\u0441 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f","deposit-location-desc":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f Skycoin, \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430.","make-choice":"\u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0432\u044b\u0431\u043e\u0440","wallets-desc":"\u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0430\u0434\u0440\u0435\u0441\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430. \u041e\u0434\u0438\u043d \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d \u043a \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0430\u0434\u0440\u0435\u0441\u043e\u0432.","send":"\u041f\u043e\u0448\u043b\u0438\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443","send-desc":"\u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0432\u0430\u043c\u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u043d\u0438\u0436\u0435. \u041f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 {{ rate }} Skycoin/Selected Coin.","fraction-warning":"\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.","receive":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Skycoin","receive-desc":"\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u0430\u0432\u0430\u043b\u044e\u0442\u044b, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u043d\u0435\u0439, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u043b\u0430\u0442\u044b \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u0438.","status-button":"\u0421\u0442\u0430\u0442\u0443\u0441:","check-status-button":"\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441","new-order-button":"\u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u043a\u0430\u0437","refresh":"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c","available-now":"\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e:","choose-preference":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b. \u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b.","choose":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u043b\u044e\u0431\u0438\u043c\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u0443 ;)","send-coin":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","send-coin-text-1":"\u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043d\u0438\u0436\u0435. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u043d\u0430 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0435, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u043f\u043e \u043a\u0443\u0440\u0441\u0443"},"wizard":{"wallet-desc":"\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 Skycoin, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0444\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0444\u0440\u0430\u0437\u0430 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \\"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\\" \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u0444\u0440\u0430\u0437\u0443.","encrypt-desc":"\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0442\u0438, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0435\u0433\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u0435.","finish-button":"\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434","confirm":{"title":"\u0414\u0435\u0440\u0436\u0438\u0442\u0435 \u0441\u0432\u043e\u044e \u0444\u0440\u0430\u0437\u0443 \u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435!","desc":"\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0444\u0440\u0430\u0437\u0443 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0435\u0451 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u041f\u0440\u0438 \u0443\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0443 Skycoin!","checkbox":"\u041a\u043b\u044f\u043d\u0443\u0441\u044c. \u042f \u0437\u0430\u043f\u0438\u0441\u0430\u043b.","button":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"}},"wallet":{"new-address":"\u041d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441","show-empty":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435","hide-empty":"\u0421\u043a\u0440\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435","encrypt":"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","decrypt":"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","edit":"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0432\u043e\u0430\u0442\u044c","add":"\u041d\u043e\u0432\u044b\u0439 \u043a\u043e\u0448\u0435\u043b\u0451\u043a","load":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","encryption-enabled":"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d","encryption-disabled":"\u0411\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f","wallet":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a","new":{"create-title":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","load-title":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","encrypt-title":"\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","name-label":"\u0418\u043c\u044f \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","seed-label":"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f","confirm-seed-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443","seed-warning":"\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0430 \u0444\u0440\u0430\u0437\u0443 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0432 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0432 \u0434\u0430\u043b\u0438 \u043e\u0442 \u0447\u0443\u0436\u0438\u0445 \u0433\u043b\u0430\u0437. \u041f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Skycoin \u043a\u043e\u0448\u0435\u043b\u0451\u043a!","create-button":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c","load-button":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","12-words":"12 \u0441\u043b\u043e\u0432","24-words":"24 \u0441\u043b\u043e\u0432\u0430","generate-12-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 12 \u0441\u043b\u043e\u0432","generate-24-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 24 \u0441\u043b\u043e\u0432","encrypt":"\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435","encrypt-warning":"\u041c\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0448\u0438 \u043a\u0430\u0448\u0435\u043b\u044c\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f. \u0422\u0430\u043a \u0436\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0444\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435."},"rename":{"title":"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","name-label":"\u0418\u043c\u044f","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","rename-button":"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c"},"address":{"copy":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c","copy-address":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441","copied":"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e!","outputs":"\u041d\u0435\u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u044b\u0435 \u0432\u044b\u0445\u043e\u0434\u044b (Unspent Outputs)"}},"send":{"from-label":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441","to-label":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430","amount-label":"\u0421\u0443\u043c\u043c\u0430","notes-label":"\u0417\u0430\u043c\u0435\u0442\u043a\u0438","wallet-label":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a","addresses-label":"\u0410\u0434\u0440\u0435\u0441","addresses-help":"\u0410\u0434\u0440\u0435\u0441 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","change-address-label":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430","change-address-help":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0441\u0434\u0430\u0447\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u043d\u0435 \u0443\u043a\u0430\u0436\u0438\u0442\u0435, \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438","destinations-label":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439","destinations-help1":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0441\u0443\u043c\u043c\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","destinations-help2":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439, \u0441\u0443\u043c\u043c\u0430 Skycoin & CH \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","hours-allocation-label":"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u044b (CH)","options-label":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","value-label":"\u0424\u0430\u043a\u0442\u043e\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0447\u0430\u0441\u043e\u0432 (CH)","value-help":"\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0430\u043a\u0442\u043e\u0440, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 CH \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439","preview-button":"\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440","send-button":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434","simple":"\u041e\u0431\u044b\u0447\u043d\u044b\u0439","advanced":"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439"},"tx":{"transaction":"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f","confirm-transaction":"\u041f\u043e\u0434\u0442\u0435\u0440\u0434\u0438\u0442\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e","from":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c","to":"\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c","date":"\u0414\u0430\u0442\u0430","status":"\u0421\u0442\u0430\u0442\u0443\u0441","coins":"\u0421\u0443\u043c\u043c\u0430","hours":"\u0427\u0430\u0441\u044b","id":"TX ID","show-more":"\u0418\u043d\u0444\u043e","hours-sent":"\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c","hours-burned":"\u0441\u0436\u0438\u0433\u0430\u0435\u043c","inputs":"\u0412\u0445\u043e\u0434\u044b","outputs":"\u0412\u044b\u0445\u043e\u0434\u044b","confirmed":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430","pending":"\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435","current-rate":"\u041f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043a\u0443\u0440\u0441\u0443"},"backup":{"wallet-directory":"\u041f\u0430\u043f\u043a\u0430 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430:","seed-warning":"\u0414\u0415\u0420\u0416\u0418\u0422\u0415 \u0424\u0420\u0410\u0417\u0423 \u0412\u041e\u0421\u0422\u0410\u041d\u041e\u0412\u041b\u0415\u041d\u0418\u042f \u0412 \u041d\u0410\u0414\u0401\u0416\u041d\u041e\u041c \u041c\u0415\u0421\u0422\u0415. \u041d\u0410 \u0411\u0423\u041c\u0410\u0413\u0415. \u041e\u0424\u0424\u041b\u0410\u0419\u041d. \u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u043c\u043e\u0433 \u0435\u0451 \u043f\u043e\u0434\u0433\u043b\u044f\u0434\u0435\u0442\u044c - \u0432\u0430\u0448\u044b \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.","desc":"\u0418\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0438\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0440\u0430\u0437\u044b \u0434\u043b\u044f \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432.
\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0444\u0440\u0430\u0437 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\u0445 \u0431\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0438 \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u043d\u0435\u0439 \u0444\u0430\u0439\u043b\u044b \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c .wlt. \u0424\u0440\u0430\u0437\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0438\u0445. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043b\u044e\u0431\u043e\u0433\u043e (\u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e) \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430","close-button":"\u0417\u0430\u043a\u0440\u044b\u0442\u044c","wallet":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","filename":"\u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430","seed":"\u0424\u0440\u0430\u0437\u0430","show-seed":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443","no-wallets":"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432 \u0441 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u0442"},"blockchain":{"blocks":"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432","time":"\u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430","hash":"\u0425\u044d\u0448 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430","current-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","current-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442"},"network":{"peer":"\u041f\u0438\u0440 (Peer)","source":"\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a","block-height":"\u0412\u044b\u0441\u043e\u0442\u0430 \u0431\u043b\u043e\u043a\u0430","last-seen":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a","last-received":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b\u0439","last-sent":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b\u0439","in":"\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0435","out":"\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435","sources":{"default":"\u041f\u0438\u0440 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e","exchange":"\u041e\u0431\u043c\u0435\u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438"}},"pending-txs":{"timestamp":"\u041c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438","txid":"ID \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","none":"\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0442\u0440\u0430\u043d\u0430\u0437\u043a\u0446\u0438\u0439 \u0436\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439","my":"\u041c\u043e\u0439","all":"\u0412\u0441\u0435"},"history":{"tx-detail":"\u0414\u0435\u0442\u0430\u043b\u0438 \u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","sending":"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c","sent":"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e","received":"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e","receiving":"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c","pending":"\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f","no-txs":"\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439"},"teller":{"done":"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e","waiting-confirm":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439","waiting-deposit":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0434\u0435\u043f\u043e\u0437\u0438\u0442","waiting-send":"\u041f\u043e\u0441\u044b\u043b\u0430\u0435\u043c Skycoin","unknown":"\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e"}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/875.b9a2a5c7c242dbc194f6.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/875.b9a2a5c7c242dbc194f6.js new file mode 100644 index 0000000000..675fa3f429 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/875.b9a2a5c7c242dbc194f6.js @@ -0,0 +1 @@ +(self.webpackChunkdesktopwallet=self.webpackChunkdesktopwallet||[]).push([[875],{79875:function(e){"use strict";e.exports=JSON.parse('{"common":{"usd":"USD","loading":"Cargando...","done-title":"Listo","warning-title":"Advertencia","error-title":"Error","changes-made":"Los cambios se han hecho.","back-button":"Volver","create-button":"Crear","load-button":"Cargar","cancel-button":"Cancelar","continue-button":"Continuar","close-button":"Cerrar","generic-confirmation-check":"Entiendo los riesgos y deseo continuar","copied":"El texto ha sido copiado al portapapeles."},"errors":{"window-size":"La ventana es demasiado estrecha para el contenido."},"language":{"title":"Seleccionar Lenguaje"},"header":{"syncing-blocks":"Sincronizando bloques","explorer-link":"Explorador de {{ coinName }}","warnings":{"update-part1":"La actualizaci\xf3n","update-part2":"Not used. The code adds the versi\xf3n number of the lastest update here.","update-part3":"est\xe1 disponible.","synchronizing":"La billetera est\xe1 sincronizando. Los datos mostrados pueden estar desactualizados.","pending-txs-part1":"Hay una o m\xe1s","pending-txs-part2":"transacciones pendientes.","pending-txs-part3":"Los datos mostrados pueden estar desactualizados.","no-connections":"Sin conexiones activas, \xa1el cliente no est\xe1 conectado a otros nodos!","no-backend-part1":"Sin acceso al servidor. Por favor, reinicie la aplicaci\xf3n y/o cont\xe1ctenos v\xeda","no-backend-part2":"Telegram.","no-backend-part3":"","csrf":"Vulnerabilidad de seguridad: CSRF no funciona. Por favor, salga de inmediato."}},"password":{"title":"Introduzca Su Contrase\xf1a","password-label":"Contrase\xf1a","password-error-info":"Debe ingresar una contrase\xf1a.","confirm-password-label":"Confirmar contrase\xf1a","confirm-error-info":"Las dos contrase\xf1as deben coincidir.","proceed-button":"Proceder","reset-link":"He olvidado mi contrase\xf1a","incorrect-password-error":"Contrase\xf1a incorrecta.","decrypting-error":"Error al desencriptar la billetera"},"buy":{"title-and-button":"Comprar","deposit-address":"Seleccione una direcci\xf3n para la cual generar un enlace de dep\xf3sito BTC:","select-address":"Seleccione una direcci\xf3n","generate":"Generar","deposit-location":"Localizaci\xf3n de Dep\xf3sito","deposit-location-desc":"Seleccione la billetera en la que desea que le depositemos sus Skycoins despu\xe9s de recibir los Bitcoins.","make-choice":"Realice una selecci\xf3n","wallets-desc":"Una nueva direcci\xf3n BTC es generada cada vez que se selecciona una nueva billetera y direcci\xf3n. Una \xfanica direcci\xf3n de Skycoin puede tener asignadas hasta 5 direcciones BTC.","send":"Enviar Bitcoins","send-desc":"Env\xede Bitcoins a la direcci\xf3n abajo indicada. Al recibirlos, le depositaremos los Skycoins en una nueva direcci\xf3n en la billetera seleccionada m\xe1s arriba, a la tasa de cambio actual de {{ rate }} SKY/BTC.","fraction-warning":"\xa1Env\xede s\xf3lo m\xfaltiplos de la tasa SKY/BTC! Los Skycoins son enviados en n\xfameros enteros, \xa1no se env\xedan fracciones de SKY!","receive":"Recibir SKY","receive-desc":"Despu\xe9s de recibir los Bitcoins, le enviaremos sus Skycoins. El tiempo de espera para recibir sus SKY puede ser de entre 20 minutos y una hora.","status-button":"Estatus:","check-status-button":"Revisar Estatus","new-order-button":"Nueva Orden"},"wizard":{"create-title":"Crear Billetera","create-desc":"Si no tiene una billetera de {{ coinName }}, use la semilla generada autom\xe1ticamente para crear una nueva. Si ya tiene una billetera, seleccione \\"Cargar\\" e introduzca su semilla.","encrypt-title":"Encriptar Billetera","encrypt-desc":"Incremente la seguridad de su billetera encript\xe1ndola. Al introducir una contrase\xf1a m\xe1s abajo, su billetera ser\xe1 encriptada. S\xf3lo quien tenga la contrase\xf1a podr\xe1 acceder a la billetera y retirar fondos.","finish-temporal-title":"Listo","finish-temporal-desc":"Por favor presione el bot\xf3n \\"Finalizar\\" para crear la billetera. Recuerde que la billetera ser\xe1 borrada al cerrar el software de billetera.","hardware-wallet-link":"\xbfUtilizando una Skywallet?","new-button":"Nueva","load-button":"Cargar","finish-button":"Finalizar","confirm":{"title":"\xa1Resguarde Su Semilla!","desc":"Queremos asegurarnos de que ha anotado su semilla y la ha almacenado en un lugar seguro. \xa1Si olvida su semilla, NO podr\xe1 recuperar su billetera!","checkbox":"Est\xe1 segura, lo garantizo."}},"wallet":{"title-and-button":"Billeteras","show-empty-button":"Mostrar Vac\xedas","hide-empty-button":"Ocultar Vac\xedas","encrypt-button":"Encriptar Billetera","decrypt-button":"Desencriptar Billetera","decrypt-warning":"Advertencia: por razones de seguridad, no se recomienda mantener las carteras desencriptadas. Se aconseja precauci\xf3n.","delete-button":"Borrar Billetera","rename-button":"Renombrar","add-button":"Nueva Billetera","load-button":"Cargar Billetera","hardware-wallet-button":"Skywallet","encryption-enabled":"Encriptado habilitado.","encryption-disabled":"Encriptado deshabilitado.","temporal":"Billetera temporal.","warning-hw-security":"Posible riesgo de seguridad. Acceda a las opciones de la Skywallet (presionando el bot\xf3n \\"Skywallet\\" debajo de la lista de billeteras) mientras el dispositivo est\xe1 conectado, para m\xe1s informaci\xf3n.","wallet-table-label":"Billetera","hardware-wallet-table-label":"Skywallet","delete-confirmation":"ADVERTENCIA: la billetera \\"{{ name }}\\" ser\xe1 removida de la lista. Para agregarla nuevamente, deber\xe1 volver a conectar el dispositivo y abrir las opciones de la Skywallet (presionando el bot\xf3n \\"Skywallet\\" debajo de la lista de las billeteras). \xbfDesea continuar?","delete-confirmation-check":"S\xed, quiero borrar la billetera","max-hardware-wallets-error":"Ya ha alcanzado el n\xfamero m\xe1ximo de direcciones que se puede agregar a la Skywallet.","add-many-confirmation":"ADVERTENCIA: si agrega demasiadas direcciones sin usar las anteriores o si usa las \xfaltimas y no las primeras, es posible que algunas direcciones no se recuperen autom\xe1ticamente si intenta restaurar la billetera con la semilla (tendr\xe1 que agregarlas manualmente). \xbfDesea continuar?","busy-error":"Por favor espere a que se complete la operaci\xf3n anterior.","new":{"create-title":"Crear Billetera","load-title":"Cargar Billetera","name-label":"Nombre","name-error-info":"Debe ingresar un nombre.","words-number-label":"Cuantas palabras tiene la semilla","seed-label":"Semilla","seed-error-info":"Debe ingresar una semilla.","confirm-seed-label":"Confirmar semilla","confirm-seed-error-info":"Las dos semillas deben coincidir.","seed-warning":"\xa1Recuerde esta semilla! Mant\xe9ngala en un lugar seguro. \xa1Si olvida su semilla, no podr\xe1 recuperar la billetera!","12-words":"12 palabras","24-words":"24 palabras","generate-12-help":"Generar una semilla de 12 palabras.","generate-24-help":"Generar una semilla de 24 palabras.","encrypt-check":"Encriptar billetera","encrypt-warning":"Le sugerimos que encripte con una contrase\xf1a cada una de sus billeteras. Si olvida su contrase\xf1a, puede restaurarla con la semilla. Aseg\xfarese de guardar su semilla en un lugar seguro antes de encriptar la billetera.","advanced-options-link":"Opciones avanzadas","close-advanced-error":"No es posible cerrar las opciones porque ha realizado cambios en los valores.","temporal-check":"Cargar temporalmente.","temporal-info":"Si usa esta opci\xf3n, la billetera ser\xe1 cargada temporalmente, lo que significa que ser\xe1 borrada aopenas cierre el software de billetera.","temporal-warning":"La billetera ser\xe1 borrada apenas al cerrar el software de billetera y no tendr\xe1 password. Usted necesitar\xe1 la semilla para recuperar el acceso a los fondos. \xbfSeguro que desea continuar?","seed-checking-error":"No fue posible verificar la validez de la semilla.","unconventional-seed-title":"Posible Error","unconventional-seed-text":"Usted introdujo una semilla no convencional. Si lo hizo por alguna raz\xf3n en especial, puede continuar (s\xf3lo recomendable para usuarios avanzados). Sin embargo, si su intenci\xf3n es utilizar una semilla normal del sistema, usted debe borrar los textos y/o caracteres especiales adicionales.","unconventional-seed-check":"Continuar con la semilla no convencional","synchronizing-warning-text":"La billetera todav\xeda est\xe1 sincronizando los datos y la operaci\xf3n podr\xeda no restaurar todas las direcciones. Si algunas direcciones no son restauradas, usted deber\xe1 esperar a que la billetera est\xe9 totalmente sincronizada y usar la opci\xf3n \\"Escanear Direcciones\\" o agregarlas nuevamente de forma manual.","wallet-created":"La billetera ha sido agregada a la lista.","seed":{"enter-seed":"Presione aqu\xed para ingresar la semilla","change-seed":"Presione para cambiar","confirm-seed":"Presione aqu\xed para confirmar la semilla","confirmed-seed":"Semilla confirmada","use-custom":"Ingresar la semilla manualmente","use-normal":"Ingresar la semilla usando el m\xe9todo recomendado","custom-seed-warning-text":"Esta opci\xf3n solo es recomendada para usuarios avanzados. Cometer errores con la semilla puede hacer que pierda el acceso a los fondos en caso de que surja alg\xfan problema.","custom-seed-warning-text-recovering":"Para evitar posibles problemas, esta opci\xf3n solo debe usarse si desea recuperar una semilla no convencional.","incorrect-word-error":"La palabra que ha ingresado no coincide con la que se ha solicitado.","invalid-seed-error":"La semilla que ha ingresado no es v\xe1lida. Por favor, vuelva a intentarlo.","enter-word":"Ingrese la palabra n\xfamero {{number}}","word-error-info":"Debe ingresar una palabra.","new-seed-info":"Usted debe ingresar las palabras de la semilla que fue generada por el sistema, para confirmarla.","recover-seed-info":"Por favor, aseg\xfarese de ingresar las palabras correctas en el orden correcto."}},"rename":{"title":"Renombrar Billetera","name-label":"Nombre","label-error-info":"Debe ingresar un nombre.","rename-button":"Renombrar"},"address-options":{"title":"Direcciones","new":"Nuevas Direcciones","scan":"Escanear Direcciones","scan-help":"Use esta opci\xf3n para hacer que el sistema encuentre direcciones ya usadas de esta billetera que faltan en la lista."},"scan-addresses":{"done-with-new-addresses":"La lista ha sido actualizada.","done-without-new-addresses":"No se encontraron nuevas direcciones."},"add-addresses":{"title":"Seleccionar Cantidad","quantity-label":"Cantidad de direcciones a crear","quantity-error-info":"Debe ingresar un valor entre 1 y 100.","error":"Hubo un error inesperado. Por favor, int\xe9ntelo de nuevo."},"address":{"show":"Presione para mostrar","copy":"Copiar","copy-address":"Copiar direcci\xf3n","copied":"\xa1Copiado!","confirm":"Confirmar direcci\xf3n","outputs":"Salidas no gastadas","history":"Historial"}},"qr":{"title":"C\xf3digo QR","data-label":"Datos del c\xf3digo QR","address-label":"Direcci\xf3n","request-link":"Solicitar monto espec\xedfico","amount-label":"Monto solicitado","hours-label":"Horas solicitadas","message-label":"Mensaje","invalid":"(valor inv\xe1lido)"},"send":{"title-and-button":"Enviar","unsigned-button":"Sin firmar","signed-button":"Firmada","unsigned-confirmation":"El formulario de transacciones sin firmar no permite enviar transacciones normalmente, sino que simplemente crea el texto de la transacci\xf3n, el cual debe ser firmado antes de que pueda ser enviado a la red. Esto es \xfatil para crear transacciones que ser\xe1n firmadas en un equipo que siempre est\xe1 fuera de l\xednea, por razones de seguridad. \xbfDesea continuar?","synchronizing-warning":"La billetera todav\xeda est\xe1 sincronizando los datos, por lo que el saldo que se muestra puede ser incorrecto. \xbfSeguro de que desea continuar?","from-label":"Enviar desde","to-label":"Enviar a","amount-label":"Cantidad","personal-note-label":"Nota personal","personal-note-help":"Use este campo para agregar un texto que le permita identificar la transacci\xf3n en el futuro. Este texto se guarda localmente, por lo que solo ser\xe1 visible desde esta computadora.","wallet-label":"Billetera","wallet-error-info":"Debe seleccionar una billetera.","invalid-amount":"Por favor introduzca una cantidad v\xe1lida","convert-confirmation":"\xbfTambi\xe9n desea que la cantidad introducida se convierta de {{from}} a {{to}}?","convert-confirmation-plural":"\xbfTambi\xe9n desea que las cantidades introducidas se conviertan de {{from}} a {{to}}?","send-all-available-coins-link":"enviar todo","precision-error-warning":"Se detect\xf3 un error de precisi\xf3n durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","invaid-amount-warning":"Se detect\xf3 un valor inv\xe1lido durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","precision-errors-warning":"Se detectaron errores de precisi\xf3n durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","invaid-amounts-warning":"Se detectaron valores inv\xe1lidos durante la conversi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","multiple-problems-warning":"Algunos valores no se convirtieron por ser inv\xe1lidos o podr\xedan haberse convertido con errores de precisi\xf3n. Por favor verifique la cantidad que se enviar\xe1.","addresses-label":"Direcciones","addresses-error-info":"Debe ingresar al menos una direcci\xf3n v\xe1lida.","no-wallet-selected-error":"No hay monedas para enviar.","no-coins-left-error":"No hay monedas restantes para enviar.","addresses-help":"Limite las direcciones desde donde se podr\xedan enviar las monedas y las horas.","addresses-manual-help":"Lista de las direcciones desde las cuales se enviar\xe1n las monedas, separadas por comas. Todas las direcciones deben pertenecer a la misma billetera o no podr\xe1 firmar la transacci\xf3n con la billetera de escritorio.","all-addresses":"Todas las direcciones de la billetera seleccionada","outputs-label":"Salidas no gastadas","outputs-help":"Limite las salidas no gastadas desde donde se podr\xedan enviar las monedas y las horas. Solo se muestran las salidas de las direcciones seleccionadas.","outputs-error":"Hubo un error al intentar obtener las salidas. Por favor aseg\xfarese de haber ingresado direcciones v\xe1lidas.","all-outputs":"Todas las salidas no gastadas de las direcciones seleccionadas","enter-addresses-for-outputs":"Debe ingresar direcciones v\xe1lidas primero","enter-wallet-for-outputs-and-addresses":"Debe seleccionar una billetera v\xe1lida primero","invalid-addresses-for-outputs":"No hay salidas disponibles","available-funds-msg-part1":"Con su selecci\xf3n actual puede enviar hasta","available-funds-msg-part2":"y","available-funds-msg-part3":"(al menos","available-funds-msg-part4":"deben ser utilizadas como tarifa de transacci\xf3n para enviar todas las monedas u horas).","change-address-label":"Direcci\xf3n de retorno personalizada","change-address-error-info":"La direcci\xf3n de retorno no es v\xe1lida.","change-address-select-from-list-link":"Seleccionar","change-address-help":"Direcci\xf3n para recibir el cambio. Si no se proporciona, ser\xe1 elegida autom\xe1ticamente. Haga clic en el enlace \\"Seleccionar\\" para elegir una direcci\xf3n de una de sus billeteras.","specific-hours":"Horas a enviar:","remove-specific-hours-info":"Remover.","remove-specific-hours-confirmation":"\xbfSeguro que desea eliminar la cantidad espec\xedfica de horas a enviar?","destinations-label":"Destinos","destinations-help1":"Direcciones de destino y sus monedas.","destinations-help2":"Direcciones de destino, sus monedas y horas.","destination-tools-title":"Herramientas de destino","hours-allocation-check":"Usar una distribuci\xf3n autom\xe1tica de {{ coinHoursName }}","options-link":"Opciones","coin-hours-options-link":"Opciones de horas","hours-share-factor-label":"Factor de distribuci\xf3n de {{ coinHoursName }}","hours-share-factor-help":"Este control permite seleccionar el porcentaje de {{ coinHoursName }} que ser\xe1n enviadas. de Mientras mayor sea el valor, m\xe1s {{ coinHoursName }} se enviar\xe1n y menos ser\xe1n retenidas.","close-hours-share-factor-alert":"La opci\xf3n se restablecer\xe1 al valor predeterminado. \xbfSeguro que desea continuar?","preview-button":"Preview","send-button":"Enviar","show-button":"Mostrar","simple-form-button":"Simple","advanced-form-button":"Advanzado","select-wallet":"Seleccionar billetera","saving-note-error":"La transacci\xf3n se envi\xf3 correctamente, pero no fue posible guardar la nota.","sent":"La transacci\xf3n se envi\xf3 correctamente.","total-to-send":"Total:","invalid-address-error":"La direcci\xf3n de destino no es v\xe1lida.","one-invalid-address-error":"Una de las direcciones de destino no es v\xe1lida.","various-invalid-addresses-error":"Algunas direcciones de destino no son v\xe1lidas.","all-addresses-invalid-error":"Las direcciones de destino no son v\xe1lidas.","invalid-addresses-error":"Por favor aseg\xfarese de que la direcci\xf3n sea v\xe1lida.","address-error-info":"Por favor introduzca una direcci\xf3n v\xe1lida.","invalid-value-error-info":"Valor inv\xe1lido.","insufficient-funds-error-info":"El valor ingresado es mayor que el saldo disponible.","sending-all-hours-with-coins-waning":"Al enviar todas las monedas, todas las horas de la billetera seleccionada ser\xe1n enviadas o quemadas. Si desea retener horas, no debe enviar todas las monedas. \xbfSeguro que desea continuar?","advanced-sending-all-hours-with-coins-waning":"Al enviar todas las monedas, todas las horas de la(s) fuente(s) seleccionada(s) ser\xe1n enviadas o quemadas. Si desea retener horas, no debe enviar todas las monedas. \xbfSeguro que desea continuar?","sending-all-hours-waning":"Usted seleccion\xf3 enviar todas las horas. \xbfSeguro que desea continuar?","high-hours-share-waning":"Su selecci\xf3n puede resultar en el env\xedo de todas las horas de la billetera seleccionada. \xbfSeguro que desea continuar?","advanced-high-hours-share-waning":"Su selecci\xf3n puede resultar en el env\xedo de todas las horas de la(s) fuente(s) seleccionada(s). \xbfSeguro que desea continuar?","fill-with-link":{"title":"Utilizar un link de transacci\xf3n","link-info":"Aqu\xed puede ingresar un link que se le hubiese enviado solicitando monedas. El formulario se rellenar\xe1 con los datos obtenidos del link.","link-label":"Link de transacci\xf3n","link-error-info":"Debe ingresar un link de transacci\xf3n v\xe1lido.","process-button":"Procesar","invalid-link-error":"El contenido del link de transacci\xf3n no es v\xe1lido.","invalid-link-hours-error":"El link de transacci\xf3n contiene una cantidad de horas no v\xe1lida.","data-overwritten-alert":"Se sobrescribir\xe1n algunos datos que ha introducido. Seguro de que desea continuar?","confirmation":"El formulario se ha actualizado con los datos obtenidos del link de transacci\xf3n."},"known-node-errors":{"null-change-address-error":"La direcci\xf3n nula no se puede utilizar como direcci\xf3n de retorno personalizada. Por favor introduzca una direcci\xf3n v\xe1lida.","to-required-error":"Debe proporcionar una direcci\xf3n de destino para enviar monedas. Por favor introduzca una direcci\xf3n v\xe1lida.","zero-coins-error":"No es posible enviar cero monedas. Por favor introduzca una cantidad v\xe1lida.","null-destination-error":"La direcci\xf3n nula no se puede utilizar como direcci\xf3n de destino. Por favor introduzca una direcci\xf3n v\xe1lida.","duplicate-destination-error":"Hay destinos duplicados. Por favor no repita la misma direcci\xf3n y cantidad en m\xe1s de un destino.","hours-in-automatic-mode-error":"No se pueden especificar cantidades de horas mientras se usa la distribuci\xf3n autom\xe1tica de horas. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","hours-allocation-mode-needed-error":"Se requiere el modo de asignaci\xf3n de horas. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","invalid-hours-allocation-mode-error":"Modo de asignaci\xf3n de horas no v\xe1lido. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","hours-allocation-mode-not-needed-error":"El modo de asignaci\xf3n de horas no se puede especificar mientras se usa la distribuci\xf3n de horas manual. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","invalid-hours-mode-error":"M\xe9todo de distribuci\xf3n de horas no v\xe1lido. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","share-factor-needed-error":"Se necesita el factor de distribuci\xf3n de horas. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","share-factor-not-needed-error":"El factor de distribuci\xf3n de horas no puede ser especificado mientras se usa la distribuci\xf3n de horas manual. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","invalid-share-factor-error":"Factor de distribuci\xf3n de horas inv+alido. Por favor pruebe con valores diferentes y p\xf3ngase en contacto con el servicio de soporte si el problema no se resuelve.","change-equal-to-destination-error":"No es posible crear la transacci\xf3n debido a que se regresar\xeda una cantidad repetida de monedas a la misma direcci\xf3n de destino. Por favor int\xe9ntelo nuevamente con valores diferentes.","repeated-wallet":"Una billetera para la semilla indicada ya existe."},"bulk-send":{"title":"Env\xedo Masivo","indications":"Para enviar a m\xfaltiples destinos de forma r\xe1pida, escriba cada direcci\xf3n, cantidad de monedas y cantidad de horas (opcional) en una l\xednea, separadas por una coma. Ejemplo: si desea enviar 10 monedas y 5 horas a la direcci\xf3n \\"xyz\\", escriba \\"xyz,10,5\\"; si desea que las horas se calculen autom\xe1ticamente, escriba \\"xyz,10\\". Los valores decimales se deben separar con un punto.","data-error-info":"Debe ingresar un valor.","process-button":"Procesar","no-data-error":"No hay texto para procesar.","inconsistent-data-error":"Si establece cu\xe1ntas horas desea enviar a un destino, debe hacerlo para todos los destinos.","invalid-data-error":"El texto ingresado tiene un formato inv\xe1lido."}},"select-address":{"title":"Seleccionar Direcci\xf3n","no-addresses":"No hay direcciones confirmadas en esta billetera."},"offline-transactions":{"loading-problem":"Error al intentar obtener los datos necesarios","wallet-error-info":"Debe seleccionar una billetera.","tx-error-info":"Debe ingresar un texto de transacci\xf3n v\xe1lido.","copy-tx":{"signed-title":"Transacci\xf3n Firmada","unsigned-title":"Transacci\xf3n Sin Firmar","text-unsigned":"Esta es la transacci\xf3n sin firmar que se ha creado con los datos que ha ingresado. Por favor copie el texto para poder firmarlo con la opci\xf3n \\"Firmar transacci\xf3n\\".","text-signed":"Esta es la transacci\xf3n firmada. Puede enviarla a la red utilizando la opci\xf3n \\"Transmitir Transacci\xf3n\\".","input-label":"Texto de la transacci\xf3n","copy-button":"Copiar","reset-confirmation":"\xbfDesea que se limpie el formulario, de forma que pueda crear otra transacci\xf3n?","reset-done":"El formulario ha sido limpiado."},"sign-tx":{"title":"Firmar Transacci\xf3n","text":"Use este formulario para firmar una transacci\xf3n. Para que la operaci\xf3n funcione correctamente debe seleccionar la billetera que incluye todas las entradas/direcciones utilizadas para enviar monedas en la transacci\xf3n.","wallet-label":"Billetera","select-wallet":"Seleccione una billetera","input-label":"Texto de la transacci\xf3n","sign-button":"Firmar","signed":"La transacci\xf3n ha sido firmada."},"broadcast-tx":{"title":"Transmitir Transacci\xf3n","text":"Use este formulario para enviar una transacci\xf3n firmada a la red.","input-label":"Texto de la transacci\xf3n","send-button":"Enviar","sent":"La transacci\xf3n ha sido enviada."}},"reset":{"title":"Restablecer Contrase\xf1a","wallet-label":"Billetera","seed-label":"Semilla de la billetera","seed-error-info":"Debe ingresar una semilla.","password-label":"Nueva contrase\xf1a (deje en blanco si desea que la billetera no est\xe9 encriptada)","confirm-label":"Confirme la contrase\xf1a","confirm-error-info":"Las dos contrase\xf1as deben coincidir.","reset-button":"Restablecer","done":"Contrase\xf1a cambiada correctamente."},"tx":{"transaction-title":"Transacci\xf3n","confirm-transaction-title":"Confirmar Transacci\xf3n","from-small-label":"Desde:","to-small-label":"A:","date-small-label":"Fecha:","status-small-label":"Estatus:","coins-small-label":"Monedas:","hours-small-label":"Horas:","id-small-label":"Tx ID:","note-small-label":"Nota:","without-note":"Sin nota","show-more-link":"Mostrar m\xe1s","hours-moved":"movida(s)","hours-sent":"enviada(s)","hours-received":"recibida(s)","hours-burned":"quemada(s)","inputs-title":"Entradas","outputs-title":"Salidas","confirmed-transaction":"Confirmada","pending-transaction":"Pendiente","current-rate-help":"Calculado a la tasa actual."},"edit-note":{"title":"Editar Nota","change-button":"Cambiar"},"backup":{"title":"Respaldar Billetera","wallet-directory":"Directorio de la Billetera:","seed-warning":"RESPALDE SU SEMILLA. EN PAPEL. EN UN LUGAR SEGURO. Mientras tenga su semilla, podr\xe1 recuperar las monedas.","desc":"Use la tabla de m\xe1s abajo para obtener las semillas de sus billeteras encriptadas.
Para obtener las semillas de las billeteras no encriptadas, abra el directorio de m\xe1s arriba, abra los archivos .wlt en un editor de texto y recupere las semillas.","wallet-table-label":"Nombre de la billetera","filename-table-label":"Archivo","save-addresses-button":"Guardar Direcciones","show-seed-button":"Mostrar semilla","no-wallets":"No hay billeteras","unencrypted-info":"Por razones de seguridad, no es posible mostrar las semillas de las billeteras sin encriptar. Para obtener la semilla, por favor encripte la billetera con una contrase\xf1a o siga las instrucciones en la parte superior de esta p\xe1gina.","hw-wallet-info":"Para obtener la semilla de una Skywallet, por favor use la opci\xf3n \\"Skywallet\\" de la parte inferior de la p\xe1gina de billeteras.","not-compatible-error":"Su navegador web no es compatible con esta funci\xf3n.","seed-modal-window":{"title":"Semilla de la Billetera","seed-label":"Semilla"}},"blockchain":{"title":"Blockchain","blocks-label":"Cantidad de bloques","time-label":"Fecha del \xfaltimo bloque","hash-label":"Hash del \xfaltimo bloque","current-supply-label":"Suministro de {{ coinName }} actual","total-supply-label":"Suministro de {{ coinName }} total","current-coinhour-supply-label":"Suministro de {{ coinHoursName }} actual","total-coinhour-supply-label":"Suministro de {{ coinHoursName }} total"},"network":{"title":"Red","error-no-connections":"Sin conexiones","peer-small-table-label":"Par","source-small-table-label":"Fuente","block-height-small-table-label":"Altura del bloque","block-height-short-small-table-label":"Bloque","last-seen-small-table-label":"\xdaltima vez visto","last-received-help":"\xdaltima recepci\xf3n.","last-sent-help":"\xdaltimo env\xedo.","in-help":"Entrante.","out-help":"Saliente.","sources":{"default":"Par por defecto","exchange":"Intercambio de pares"}},"pending-txs":{"title":"Transacciones Pendientes","timestamp-table-label":"Fecha","txid-table-label":"ID de la transacci\xf3n","none":"Actualmente no hay transacciones pendientes","my-transactions-button":"M\xedas","all-transactions-button":"Todas"},"outputs":{"title":"Salidas","error-no-outputs":"No hay salidas no gastadas"},"history":{"title-and-button":"Historial","tx-detail-title":"Detalles de la Transacci\xf3n","moving":"Moviendo {{ coinName }} internamente","moved":"{{ coinName }} movido internamente","sending":"Enviando {{ coinName }}","sent":"{{ coinName }} enviado","received":"{{ coinName }} recibido","receiving":"Recibiendo {{ coinName }}","pending-indication":"Pendiente","transaction-note-small-label":"Nota:","no-txs":"Usted no tiene historial de transacciones","no-txs-filter":"No hay transacciones que coincidan con los criterios de filtro actuales","no-filter":"Sin filtros activos (presione para seleccionar billeteras/direcciones)","filter":"Filtro activo: ","filters":"Filtros activos: ","all-addresses":"Todas las direcciones","view-all":"Ver todas las {{ number }} transacciones"},"teller":{"done":"Completado","waiting-confirm":"Esperando confirmaci\xf3n","waiting-deposit":"Esperando dep\xf3sito de Bitcoins","waiting-send":"Esperando para env\xedar Skycoins","unknown":"Desconocido"},"confirmation":{"default-title":"Confirmaci\xf3n","yes-button":"S\xed","no-button":"No"},"service":{"api":{"no-internet-error":"No cuenta con conexi\xf3n a Internet o el nodo ha dejado de funcionar.","incorrect-password-error":"Contrase\xf1a incorrecta.","unknown-error":"No fue posible realizar la operaci\xf3n.","api-disabled-error":"API deshabilitada."}},"force-skywallet-wipe":{"title":"Borrado Forzado de Skywallet","operation-warning":"Esta opci\xf3n est\xe1 dise\xf1ada s\xf3lo como \xfaltimo recurso para los casos en los que el dispositivo no se puede utilizar con las opciones normales. Se borrar\xe1n todos los datos del dispositivo, por lo que necesitar\xe1 la semilla para recuperar los fondos.","proceed-button":"Proceder"},"hardware-wallet":{"general":{"default-wallet-name":"Nueva Skywallet","confirm":"Por favor, confirme la operaci\xf3n en la Skywallet.","confirm-and-more":"Por favor confirme la operaci\xf3n en la Skywallet y siga las instrucciones.","follow":"Por favor siga las instrucciones mostradas en la Skywallet.","completed":"La operaci\xf3n se realiz\xf3 con \xe9xito.","name-updated":"El nombre utilizado para identificar esta Skywallet en la lista de billeteras se ha actualizado para que coincida con el que se muestra en el dispositivo."},"errors":{"generic-error":"No se puede realizar la operaci\xf3n. Aseg\xfarese de haber conectado una Skywallet v\xe1lida y de que no est\xe9 esperando por alguna confirmaci\xf3n o respuesta.","disconnected":"No se puede realizar la operaci\xf3n. La Skywallet no est\xe1 conectada.","incorrect-wallet":"No se puede realizar la operaci\xf3n. La Skywallet conectada es diferente a la esperada.","incorrect-pin":"No se puede realizar la operaci\xf3n. El PIN que ha introducido no es correcto.","refused":"La operaci\xf3n fue cancelada.","too-many-inputs-outputs":"La transacci\xf3n tiene demasiadas entradas o salidas para la Skywallet. Por favor vuelva a intentarlo creando varias transacciones m\xe1s peque\xf1as, cada una con un n\xfamero menor de destinatarios (si la transacci\xf3n actual tiene muchos) o monedas.","daemon-connection":"Problema para conectarse al Skywallet Daemon, por favor aseg\xfarese de que se est\xe9 ejecutando e int\xe9ntelo nuevamente. Usted puede descargarlo desde www.skycoin.com/downloads","daemon-connection-with-configurable-link":"Problema para conectarse al Skywallet Daemon, por favor aseg\xfarese de que se est\xe9 ejecutando e int\xe9ntelo nuevamente. Usted puede descargarlo desde ","timeout":"La operaci\xf3n se cancel\xf3 por inactividad. Por favor int\xe9ntelo de nuevo.","timeout-with-configurable-link":"La operaci\xf3n se cancel\xf3 por inactividad. Por favor int\xe9ntelo de nuevo. Si este problema impide que el dispositivo sea utilizable, puede utilizar la siguiente opci\xf3n:","invalid-address-generated":"Hubo un problema con el generador de direcciones y la operaci\xf3n tuvo que ser cancelada.","invalid-address":"Direcci\xf3n inv\xe1lida.","not-in-bootloader-mode":"Para usar esta opci\xf3n la Skywallet debe estar en modo bootloader."},"security-warning":{"title":"Advertencia de Seguridad","text":"La \xfaltima vez que se conect\xf3 esta Skywallet, se encontraron una o m\xe1s advertencias de seguridad. Le recomendamos que abra las opciones de Skywallet (presionando el enlace de m\xe1s abajo) mientras el dispositivo est\xe1 conectado y resuelva los problemas de seguridad antes de continuar.","link":"Abrir la ventana de opciones de Skywallet."},"options":{"connecting":"Conectando...","disconnected":"Skywallet no detectada. Por favor, conecte una Skywallet para usar esta opci\xf3n.","unconfigured-detected-title":"Skywallet No Configurada","unconfigured-detected":"Se ha detectado una Skywallet sin semilla. Seleccione \\"Configurar Autom\xe1ticamente\\" si desea configurarla como una billetera nueva y comenzar a usarla. Seleccione \\"Restaurar Copia de Seguridad\\" si desea configurar la Skywallet con la copia de seguridad de una semilla creada anteriormente.","configured-detected":"Skywallet detectada. El dispositivo se identifica en la lista de billeteras como:","security-warnings-title":"Advertencias de Seguridad","security-warning-title":"Advertencia de Seguridad","unchecked-version-warning":"No fue posible verificar si el firmware de su Skywallet est\xe1 actualizado. Esto podr\xeda deberse a problemas con su conexi\xf3n a Internet o a que el servicio est\xe9 en mantenimiento.","outdated-version-warning":"El firmware de su Skywallet est\xe1 desactualizado. Le recomendamos que lo actualice lo antes posible para garantizar la seguridad. Para hacer esto, seleccione la opci\xf3n \\"Actualizar Firmware\\".","backup-warning":"Debe hacer una copia de seguridad de la semilla de su Skywallet o podr\xeda perder acceso a los fondos en caso de problemas. Para hacer esto, seleccione la opci\xf3n \\"Crear Copia de Seguridad\\".","pin-warning":"La Skywallet conectada no tiene un PIN. El c\xf3digo PIN protege la Skywallet de accesos no autorizados. Para crear un c\xf3digo PIN, seleccione la opci\xf3n \\"Crear C\xf3digo PIN\\".","options":"Opciones:","update-firmware":"Actualizar Firmware","configure-automatically":"Configurar Autom\xe1ticamente","restore-backup":"Restaurar Copia de Seguridad","create-backup":"Crear Copia de Seguridad","wipe":"Borrar el Dispositivo","confirm-seed":"Confirmar la Semilla","create-pin":"Crear C\xf3digo PIN","change-pin":"Cambiar el C\xf3digo PIN","delete-pin":"Borrar el C\xf3digo PIN","forgotten-pin-part1":"Si no puede acceder a la billetera porque ha olvidado el PIN, puede borrar la Skywallet y luego restaurarla con la semilla haciendo clic","forgotten-pin-part2":"aqu\xed.","firmware-version":"Versi\xf3n del firmware del dispositivo:"},"update-firmware-warning":{"title":"Firmware Desactualizado","text":"ADVERTENCIA: el firmware de su Skywallet est\xe1 desactualizado. Para mantenerse seguro se le recomienda actualizarlo.","update":"Actualizar"},"update-firmware":{"title-connecting":"Conectando...","title-update":"Actualizar Firmware","title-install":"Instalar Firmware","text-downloading":"Comprobando el dispositivo y descargando archivos...","text-bootloader":"ADVERTENCIA: si ya ha configurado este dispositivo, antes de continuar debe tener una copia de seguridad de su semilla o podr\xeda perder permanentemente el acceso a los fondos.","text-not-bootloader":"Para actualizar el firmware de su Skywallet debe conectarla en modo bootloader (con\xe9ctela al computador mientras presiona los dos botones f\xedsicos del dispositivo). ADVERTENCIA: si ya ha configurado este dispositivo, antes de continuar debe tener una copia de seguridad de su semilla o podr\xeda perder permanentemente el acceso a los fondos.","text-no-firmware":"Le damos la bienvenida. La Skywallet conectada actualmente no tiene un firmware instalado. Ahora se instalar\xe1 un firmware para que pueda comenzar a usar el dispositivo. NOTA: si ya ha configurado este dispositivo y desea recuperar los fondos, necesitar\xe1 la semilla.","follow":"La actualizaci\xf3n del firmware se envi\xf3 a la Skywallet. Por favor contin\xfae el proceso en el dispositivo.","connection-error":"No fue posible descargar el firmware. Esto podr\xeda deberse a problemas con su conexi\xf3n a Internet o a que el servicio est\xe9 en mantenimiento.","timeout":"La operaci\xf3n se cancel\xf3 por inactividad. Por favor desconecte el dispositivo, vuelva a conectarlo e intente nuevamente.","finished":"Su dispositivo ha sido configurado correctamente. Por favor descon\xe9ctelo antes de continuar."},"generate-seed":{"text":"Antes de continuar puede seleccionar el n\xfamero de palabras que desea que tenga la semilla. La semilla es una lista de palabras que se pueden usar para recuperar el acceso a las monedas en caso de problemas. Ambos valores son seguros, por lo que si no tiene una raz\xf3n especial para seleccionar uno u otro, puede dejar el valor predeterminado.","configuring":"Configurando..."},"restore-seed":{"text":"Antes de continuar, por favor seleccione la cantidad de palabras de la semilla que desea recuperar.","check-text":"Puede usar esta opci\xf3n para ingresar una semilla y verificar si es igual a la de la Skywallet. Antes de comenzar, seleccione el n\xfamero de palabras de la semilla que desea verificar.","warning":"ADVERTENCIA: para evitar posibles problemas, use solo semillas creadas con una Skywallet.","error-wrong-word":"Error: la palabra introducida no coincide con la solicitada por la Skywallet.","error-invalid-seed":"Error: la semilla no es v\xe1lida. Por favor aseg\xfarese de ingresar las palabras correctas en el orden correcto.","error-wrong-seed":"Error: la semilla es v\xe1lida pero no coincide con la del dispositivo.","correct-seed":"La semilla es v\xe1lida y coincide con la del dispositivo."},"added":{"title":"Nueva Skywallet","configuring":"Nueva Skywallet detectada. Configurando...","done":"Hecho","added1":"La Skywallet conectada se ha agregado a la lista de billeteras con el siguiente nombre:","added2":"Ahora puede consultar el saldo y las direcciones de la Skywallet incluso cuando no est\xe1 conectada.","added-error-info":"Debe ingresar un nombre.","characters-warning":"Si utiliza caracteres no comunes en el idioma ingl\xe9s, es posible que el nombre no se muestre correctamente en el dispositivo."},"wipe":{"warning":"ADVERTENCIA: Todos los datos en la Skywallet ser\xe1n eliminados. Si no tiene una copia de seguridad, no podr\xe1 volver a acceder a sus fondos.","confirm-delete-check":"Quitar tambi\xe9n de la lista de billeteras"},"create-backup":{"warning":"ADVERTENCIA: Solo puede usar esta opci\xf3n para hacer una copia de seguridad de la semilla de su Skywallet una vez. Si decide continuar, tendr\xe1 que escribir un grupo de palabras (en papel, nunca en una computadora) que aparecer\xe1n en la pantalla de la Skywallet y almacenar la lista en un lugar seguro. Cualquier persona con acceso a la lista de palabras (la \\"semilla\\") podr\xe1 acceder a los fondos de la billetera, por lo que se recomienda extremar las precauciones.","instructions":"Escriba la lista de palabras que aparecen en la pantalla de la Skywallet. Aseg\xfarese de respetar el orden y escribir cada palabra correctamente."},"seed-word":{"title":"Ingresar Palabra","enter-word":"Introduzca la palabra indicada en el dispositivo","info":"Se le pedir\xe1 que ingrese las palabras de su semilla de respaldo en orden aleatorio. Adicionalmente, algunas palabras adicionales aleatorias podr\xedan serle solicitadas.","word-label":"Palabra solicitada","error-invalid-word":"La palabra introducida no es v\xe1lida.","error-loading-words":"Cargando la lista de palabras. Por favor espere."},"change-pin":{"pin-mismatch":"No se puede realizar la operaci\xf3n. Los dos PIN que ha introducido no coinciden."},"remove-pin":{"warning":"ADVERTENCIA: No se recomienda eliminar el c\xf3digo PIN de su Skywallet, ya que ser\xe1 vulnerable a ser utilizada por terceros no autorizados."},"enter-pin":{"title":"Ingresar PIN","title-change-current":"Ingrese el PIN Actual","title-change-new":"Ingrese el Nuevo PIN","title-change-confirm":"Confirme el Nuevo PIN","instructions-generic":"El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la Skywallet.","instructions-tx":"Introduzca el PIN para confirmar y firmar la transacci\xf3n. El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la Skywallet.","instructions-change":"Por favor ingrese un PIN dif\xedcil de adivinar de entre 4 y 8 n\xfameros. El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la Skywallet.","help":"\xbfNecesita ayuda?"},"pin-help":{"title":"Ayuda","part1":"Cuando sea necesario ingresar el PIN para continuar, la pantalla de la Skywallet mostrar\xe1 una matriz de 9 casillas con n\xfameros en orden aleatorio (el orden cambia cada vez) y se le pedir\xe1 que ingrese el PIN en la billetera de software usando una matriz de 9 botones que simplemente muestran el s\xedmbolo #.","part2":"Para ingresar el PIN, mire la posici\xf3n de los n\xfameros del PIN en la matriz de n\xfameros en la pantalla de la Skywallet y presione los botones correspondientes en la billetera de software. Por ejemplo, si el PIN es \\"23\\", el n\xfamero 2 est\xe1 en la esquina superior izquierda y el n\xfamero 3 en el centro de la matriz de n\xfameros de la Skywallet, presione los botones superior izquierdo y central, en ese orden, en la billetera de software.","part3":"Si lo desea, tambi\xe9n puede usar el teclado num\xe9rico para ingresar el PIN. Sin embargo, como en el ejemplo anterior, si el PIN es \\"23\\", no puede simplemente escribir \\"23\\" con el teclado num\xe9rico, sino que deber\xe1 presionar las teclas que est\xe1n en la posici\xf3n donde est\xe1n los n\xfameros 2 y 3 en la pantalla de la Skywallet."},"create-tx":{"title":"Crear Transacci\xf3n","upper-text":"Por favor confirme la operaci\xf3n en la Skywallet despu\xe9s de verificar si los siguientes datos coinciden EXACTAMENTE con la transacci\xf3n que desea enviar y con los que muestra la Skywallet:","lower-text":"Si alg\xfan dato no corresponde a lo que muestra la Skywallet o la transacci\xf3n que desea enviar, cancele la operaci\xf3n en su Skywallet.","separator-for-coins-and-hours":"y","separator-to-destination":"a"},"confirm-address":{"title":"Confirmar Direcci\xf3n","instructions":"Por favor confirme en la Skywallet si la direcci\xf3n es:","short-confirmation":"Direcci\xf3n confirmada.","confirmation":"Direcci\xf3n confirmada. Por seguridad, puede volver a mostrar la direcci\xf3n en la Skywallet usando la opci\xf3n \\"Confirmar direcci\xf3n\\", en el men\xfa que puede mostrar presionando el bot\xf3n a la derecha del balance de la direccion."}},"time-from-now":{"few-seconds":"hace pocos segundos","minute":"hace un minuto","minutes":"hace {{time}} minutos","hour":"hace una hora","hours":"hace {{time}} horas","day":"hace un d\xeda","days":"hace {{time}} d\xedas"},"exchange":{"title-and-button":"Comprar {{ coinName }}","label-you-send":"Usted env\xeda","label-you-get":"Usted recibe (aprox.)","label-to-address":"A la direcci\xf3n de {{coin}}","label-price":"Tasa de cambio","label-stimate-transaction-time":"Duraci\xf3n del intercambio","exchange-button":"Intercambiar","min-amount":"Monto minimo:","max-amount":"Monto maximo:","agree-part1":"Acepto los","agree-part2":"T\xe9rminos de Uso","agree-part3":"y la ","agree-part4":"Pol\xedtica de Privacidad","powered-by":"Manejado por","need-help":"\xbfNecesita ayuda?","support-portal":"Portal de soporte","history":"Historial de \xf3rdenes","order-not-found":"Orden no encontrada","label-status":"Estado","exchanging":"Intercambiando {{from}} por {{to}}","destination-select-from-list-link":"Seleccionar","unavailable":"El servicio de intercambio no est\xe1 disponible en la versi\xf3n portable.","offline":"El servicio est\xe1 temporalmente offline","problem-connecting":"No se puede conectar con el servicio. Por favor compruebe su conexi\xf3n a Internet y vuelva a intentarlo m\xe1s tarde.","invalid-address-error":"Direcci\xf3n inv\xe1lida.","from-coin-error-info":"Debe seleccionar una moneda.","invalid-value-error-info":"Valor inv\xe1lido.","address-error-info":"Por favor introduzca una direcci\xf3n v\xe1lida.","statuses":{"user-waiting":"Esperando el deposito. Por favor env\xede {{amount}} {{from}} a la direcci\xf3n de intercambio indicada m\xe1s abajo","user-waiting-info":"El sistema est\xe1 a la espera de que usted realice el dep\xf3sito en la direcci\xf3n de intercambio. El proceso de intercambio comenzar\xe1 despu\xe9s de que se detecte el dep\xf3sito y sea confirmado en la cadena de bloques. Si ya ha realizado el dep\xf3sito, deber\xeda ser detectado en breve.","market-waiting-confirmations":"Esperando las confirmaciones de la transacci\xf3n","market-waiting-confirmations-info":"El dep\xf3sito ya ha sido detectado y el sistema est\xe1 esperando que sea confirmado en la cadena de bloques.","market-confirmed":"Transacci\xf3n aceptada","market-confirmed-info":"La transacci\xf3n ya ha sido confirmada en la cadena de bloques. Haciendo los preparativos para realizar el intercambio pronto.","market-exchanged":"{{from}} intercambiado por {{to}}","market-exchanged-info":"El intercambio se ha realizado. Los fondos ser\xe1n transferidos a su direcci\xf3n en un momento.","market-withdraw-waiting":"Enviando {{to}} a su direcci\xf3n","market-withdraw-waiting-info":"Se ha iniciado el proceso para enviar las monedas a su direcci\xf3n.","complete":"\xa1Intercambio completado!","complete-info":"Los fondos han sido enviados con \xe9xito a su direcci\xf3n.","error":"Se produjo un error","error-info":"Hubo un error en la operaci\xf3n, puede encontrar m\xe1s informaci\xf3n m\xe1s abajo. Si necesita ayuda, por favor guarde todos los datos de operaci\xf3n que se muestran m\xe1s abajo y comun\xedquese con soporte t\xe9cnico utilizando el enlace que se encuentra en la parte inferior derecha de esta p\xe1gina.","user-deposit-timeout":"Orden cancelada por inactividad","user-deposit-timeout-info":"El sistema ha cancelado la orden porque no se detect\xf3 ning\xfan dep\xf3sito, por favor abra una nueva orden. Si necesita ayuda, por favor guarde todos los datos de operaci\xf3n que se muestran m\xe1s abajo y comun\xedquese con soporte t\xe9cnico utilizando el enlace que se encuentra en la parte inferior derecha de esta p\xe1gina."},"history-window":{"title":"Historial de \xd3rdenes","address":"Direcci\xf3n:","date":"Fecha:"},"details":{"exchange-addr-label":"Direcci\xf3n de intercambio (v\xe1lida solo para esta operaci\xf3n de intercambio)","exchange-addr-tag-label":"Payment ID o Destination Tag que debe usarse para la transacci\xf3n","tx-id-label":"ID de la transacci\xf3n","order-id-label":"ID de la orden","initial-price-label":"Tasa de cambio inicial","error-msg-label":"Mensaje de error","details-link":"Detalles","start-date-label":"Fecha de inicio","back-alert":"La operaci\xf3n a\xfan est\xe1 en progreso. \xbfRealmente desea volver al formulario? Puede ver el progreso de esta operaci\xf3n nuevamente presionando el bot\xf3n \\"Historial de pedidos\\""}}}')}}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff new file mode 100644 index 0000000000000000000000000000000000000000..b648a3eea2d16b6ce783906d6b7d5f251b9eb56c GIT binary patch literal 57620 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

wF7DI|Kx|V1sBQ9FYs>m5C)C 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 BJ$(QG literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.4674f8ded773cb03e824.eot b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.4674f8ded773cb03e824.eot new file mode 100644 index 0000000000000000000000000000000000000000..70508ebabc9992e64f1314f866b2d7ab90438c58 GIT binary patch literal 143258 zcmeFad3;;dnKyoqti`)5$yc%^Tb3=$a&*1Kl4UuYqioJ%CnO|N7M40831EdRkc1F6 zmC_Kl5Ei)mw$t5k8E|9iKTcyj8v|KtH&n}d9;mLZWk)#?a z%2Qv4^pwgabx3W}RO~x&PS5{*jz~gPs=yBQ>+M~&bWi)gluDYm=jr8z^B44LnY2=3 z|4@qS#)ZqzS~*(vyZi7wj_a<4DMcs^BV#fAOw{3z6x5JRi8=lJ(nv z|7pjlBo*BvNqWr%yLY-I6Pqtd#)EjSy>R_y+fSX63h+Kbr|`lpS8TrIm8#n$$u?DD zyS}(+)B272cW=G``BC{@7vYAsQv)bd9#Z2)m+aiLEx7sLaD76O3=eGCcES38?_G<$ zjd$VtzDw5c*{=0U@8S7HNblOZ{*p~qw;!J)v0IzbUx&7DyKLv0AHM&z#BO_4l7iDY zESToaTYs_P_OBUd{!uCsJ^R+LAAAk(OX7GcqmeYczS)jP_Q*|pDkA|K=!ZQ)HUFoj zI|Xk@hovfhn-VgfDvS=JpB9*OP}1RcKiiD!h1ugDrE2N=eC)zAHjYsACjH{l)KjOj zrE7V;@@wFd6g)FgLP{gj(bfNfpCT!eEQPTT<1fOu;P_Qcit%TZiqa{lDV-(xp3dk^ zdY|5n;3+*9X~eUbl;BV4ssSk}mHH?194VIw&M0@vOO{%YR-B2uVg4+P)<&eu@hpa; z$es3duJC%&TQPp6NCBRQ0MI#jKgKsoDd9}K)q^uCm40+5#^0elrSY7oWpszioRxj9 zNcGurC?%y((@_56O0NkNGR3C9h zfv{&mna40LT!ujeFV5m_)D!^%v(==NwA>Q5h)E8c|ZOry{PBq{D}&a zTs^48;wp@`(Ype2V%$<`be|yN1MU-SD7ApHfKnW9P<<&M+AAoX$`SccTEb;I(mj#C zXbrtD-c_$D2T@1bi;~o9#`6&Os1!wVXVd0dKu;+T37f$Fa$X~_hZ?7=`HHDc=lb&LzFK{q4eTCx)ya3@S-v#+#~3g;3!HFu#kEFVX2irr+$;c zr3e=Eg!a^ebv%{0t4N*5f$q|tYA5bT_>syHrBe;441opI9(ALdirUhfqBgXryyzV@ zhoI!;SVXz3!$!28>LfwnqO_tVl$sz+<4)9;_Eam{(-VoOruSy^w?vtu2K1i#hXnY6 z|3e;%LtP8OOlfK{etX$E&CMLdr*!}>XxQSUz7HZ7K~Pp){i!hwv2X+ zP8(f0x?}Xk(Z3&kdGy2gE_pBU-hJ==^u1T#d-J_tzIW`{#$zuZ`=?{CzhC%%)%)G= zkG}uO2bK@oKA8Do*N2yW_^act;|q@e!|`7o|IP9DKKl3sJ5hc@J~92oiW8TeICA1= zA4?zWKQ?}>jP*lylOSwB}Q{n4L{{&e(}_ZGZ&5G6l| zlHYjmo%cqMH645L*efX6@P6_8_V>T@{;~Ie|AG9$)DK%foc7^QkCz{JAAeab`J+!x zl$@vB^U1hFPSBa~* z?v1+F>;9?k)w+x87S_$Fn^7043)HpLH9J3a9&q03yxFb`$79{_5)Sdirzr0 z|NDO=0ZW?EY{4^egv^b87x?lu9BC`VwjSGFY~_+Pio+=36Xe~|YOxV+jXJQ^<9;iS zZfuP>@5GVP5$<*22)T5$1Lrev3}Bc%>3st>yvNqyh_UxRBz3k9M?1D|oL`LNcd(%h(r?~JIq!dhbL8>4fLkt<=9*}zYa&F zI}R9W0GH#a`|*Fk`SUm;Ep3_?aQuzfG=GQVdt%d|tsi|XHqDQ5L>*6nc4*KiCjg5R zC`0oWj?f2Apstz`9MShDrsEuNJh2qp3Y?>TCjg@pm*M;)9Cu+m0(1k6PM{tqeui_v z^91?<#YqLgyN@;4^fd$p-}xpL0EP_j zp_=^1kdH)L{!e|FcdtOJ(;Etlic3oKZhrM?nN)79Fqtitvei~qZFkhvI_q5Z4emxy zllQCN`tNB&~{ClPAFsAO1?vWmlhNY*a7o?Y@*QB?k zUr5KKlhS9>pO}UfGc&WZ2IgaaHl597OW4_LJG+}5W+yZinsu6|G_PnrEzlHH7ECX= zrQj{CM%$(x)IO$tQ&*^)tGh;bSoaIvC;C!-r#`G-qu;APq<_btHB2|`HQa4T8IBbe z7TOEj3O5(-EPSN!4@C_{^NY3=T~~BR(VInI6gL%bC_Y&HVo6KMXzAS2r^_xXd%av! zzN-9Cd8+&~qt@7LJlA-W@hRhp3Twsr71vd~Tyfk~Z1S5{nRc2UFuh`~F)uRjH6Jh! zn^Weu&7WDEmTt>t%R`pWDle)$Q29dT+j6noFYl9|lHZj-x7w{e)@auqbZqFjuj8eTQGc<&)4#-jssAbe$v{=WA6ORH5;zbz9C$NuqO-Dd zZs&&1`#XOY)C8M?bA#sxuL<52d?fgJS9#aeu0>rtyPoL!NvJ&385#&(8afbqJ@o7D zif(`R`Q7`wpYHyA+SF<5rd>L1|FlP@y*^!<-ZFjj^e3jjHT}yO%`>*n7@G0ojAJuP zXKtLid*=R`ch7um=1*q6J!|T$MYA@}IymddthalLd;C4u^c?DWwdeEMO|v)8etPz= z!< zySMkQ-luwhy->f{ z@?~E`-~7JKeK+;}q;Ispw7;$Y?EWqN@%}^oBmKW!>RdW=>2*tATKeU(-ep6}-aM=P ztms(}o%QSGJ#j+I#R-{(EeYXDW&1b*5vUFwJ%Knw-uY7D(@v6a9uSTjO z=SS{~yd3#$bVGDsG!^}Pb@A#&tM6I;#OmW~O4oF**}Ue^nwQsnv9@XL;MzOZKC$+- zb<#TXy2f>vt{YnS%(@fj*w0yZ&ZXzvf6m+I>d)P9?tSOJdhVC!b)C2UynD`j{ruAN zr=LG~{v+p)d`M&h7r~L)%~9{>2X8j+r~Q?|5Lx>z7tt zy5!RPF8$!LhRX&od*HI?FMIj2cP~3}S!QSB&aRz{cCOpGbLYODckg_0=dqn%?rPlC zzia2NgS(#C_0q0)c73v2ySrw0=kA@mpW6M-<(kV|F5iCnBbR@$$G&ILp20nj?Kysh z|B8#Q7{21my)*aj-g{{8D|?J?PJ#-kC(@n#1F<_{d(coyT88t>lb}}|JR@X`n%WZ zud`pb`?}Y^q5Z~^Zyfx_>(>`v@4tTY^$%Tt?3?y)F8}7xH-EOzx372K_I(fSduiV% zH?-Wa=!WZVc;<%B_qXlezW>GjpWj$>WBA7NZ`^m|{Wqp=JaJR>rad>^f78g#g*Q*V z`MR5r-2CY+b8p#m%Llg>-`aEQ;H|^AetN)nVB>-N4!nJv_O`a$&c1E%wwrEy=b+}G z|6uRI4F~T!`24}Q4`yz!xxMH1!P^ht{?hHo?l9lcd&l4%!*?9Nv+&OTJ1@QSkvreL zYx-T+-*w+z&)jt)QIqIT>`fdx2_Y~eU_nss7d~k2oz5Vyb@4f%tSMNQ3U-^AK_ieuK zj{DyJPUm;}zq9u{4}9mf@BHEZ=>0#tKl5GxcQ=0bk?+2BsQl2@Lq9w8#rKwf@22m) z`n}8pJrC@C;GqZJebD^iss|4~_{@VN5B}+)s)v?6bkRfCJ@m*!BM*J~@P>yUc=*kS zGmp%FWa}e`9{Jg$_D5Gey5-Sp9vyo0sYieI=qHakAM1YX?8mk|cGqLiJof9y^^Z3` z-u?Jhk3aVKm&4}{-!%N%@aM_qI`N_FYZhUgz zlSiKX(^D@!b^QAc-|zqaecylgaP#50hp#&P)Zur3;QT?)53c{gLr+&e-Tm~|r(b;f z%OCdsaL*6#_~Dz+6hCwQGp|3Zf41k@OP_t_*)NYwKeFY>V@JMxZqIWsKKIGW{}!`z@+w>PaCw-zxscm*S$OQ=>iQ- zr5_Z~Z5`cy+Ms7&&U_jo&A<8srhv&CFu6_pFWZ=c5Jr<8g6@`Uydi7xxs~vyW z02`=9vOyX2cXc*3=qt_Hw?hHhEn|D(mQ9;(*|d^plR}2R2rf6>!W=v=OI#rfNCDYG z*jTnM(5uwC7#xgOV`OYB9gRj5CCn0;7}CRn!%|3JBGtjVNa;~?DlibNV{&~k6zuGx z&2Oz`P9_@y)Fc)O`@&)0HLaO=Yq+Dbrm`da<5krS)hCs382>9;ZMN2{0xL?4<&~A? z#*!6*w8;*|j_RkvirS0Ts;$&#Ta9u!%>K<>T52w}Ebs1K-d)Js%w*gsHD8Py-OK+y z3qUREA4dICpbkbZ!%JOMSLD&f^Xc+?10u^{XDDbhc=d9n)!!BDZ1T$P%52hjskyAo z{0F|jQC_}%`=RYiZ+GsjUwzf;C0#yVtf-HZ*D8tU+m{baW4Ajmn-c67ls?@vd8=8Wq&aME9 zmllPK%F3`Sbt%d&e!_3z>NP;tlo>HsSDTq^Eh;T7iqg(n5-yo|HDouPk|;65Ui1a* zVl0Vz5^aU9%21_x)QjjQi$tTRq^K{-!ehxKi)MyFi&a>cNDgWhumspb+i5ip$K#Pm zWLVUV7aCSZ6vd~+sj~crk7}WT%`VQ4vN+Ck$kS$Un`}%zawK(x#p7`%#VJh?X_9Ih zOUUH*hW>~YNAUQR6i1T0aioQPwHzafx5jG-*<^PCat(S6-e7`XCZH1ap^W|+ z1Kew=9yUV|nA;h$(O9zpnJW!m8gXvf8-imj(!0q~XY31R50OYb9EpZE_4=pOIqHLb zOc_7LeY8~rn=YsoXq1uT9YAkDi`p1E0Ye$&XciOnsgmtz>st*7LL)5X>uPEkbV@a`*Ra91V zo?hM$t}iy0mt0?BG`^8nGSP=Hr@7VeOu`gmVIWJnCI$Q z1C@VF#x{egUgk87B_c{BqQs~GL6f3PLFUy=ru&gdO1%$SRUOHsebpvL>{qC0n7NG3=9|vqWvKAX@?#Gl zs0{`SAtCU8T!y)!aZ~Ti){AGhe%iRn%o*~xT4(ldYRvqs@l!fsaaE?#fM~~9oF#a@ z3Ck2l90mQFj6mubVZIEkpm?g5O?{b_n+SWx%M62IRPnNs!}u|uT0|bbF97G_aud-% zRfv2ZTW)SaD0Lk_k3zV@G=^saX=_56Nb8K^Bxd$7I4TeFxn(T$;nRGJS1Qu6PAXuGE+9sb5yoNVp99PCTrqmOi0WCpZ+N|7I z;ISDX=;g^xAXmd6cbWg6)8z_QUVivb=Bg@lX4qUsTu4!pRCp)TY;9avZ3Z0zHDZVX z&|%!gFzyn(tU7R4&}a|%7fEnkVzhTo9_)nS7U-I+WbVwlmo?SaHq|aCIqZ}~f*T9_ zKtU4~R=eF=@d}>RHm&B*kb+4?rD9BE$At#`f#i=gB1WM75?dBs?MxfRp;J9=HP-oAVgI^HKKBJlvtYh_=K*TWD;M2ZPfV8$)NN zpJfmRNnp&S(NG%5i%8}^`s^tQnioloG*a+WdC5DF7)^-#ss%TeEC7^&MDvhJOH_>n z0%VBlnu;%78eiIX)oN%53!n%b+RhS=4UVH592-Dtn${`awW&4qG_&LW9XsytuV3kM zo$WfCV417CWT`jR$EhMzYf%@$mjz!lLK_>W_e2we5av7+@EdwTa%3dx8;KH=RQYw9 zj~GS4$VpC+((=nNNEN`1dc?qt>tD96POpI^wWjQVGLQsE5-;_7o}3W)U4z};V1LN( zuWRyL)9d&5`gKhnr{B*SbG2X!lGqz=@*hB|&MuE0srqS--(^=wo*B6zs zbY`DpzLw`UeZdF6D=q3neu&gyH$x870sACNAY}5o8!HXLSR@vUFjp4~$1=mQD|b7d z0Nx~!7MdE;W>Y4jgM-k_D2dPosBS3^J13XID|^8+ygF#SK`8JfNqVsh zTA9?k2NGqAXG*p0oLFSjCKj2|K4+EHRT5;KL6%(CIu`40A>FjxUdm)Q-X~E;(4%#p*SnrW8f`g%A8fJ=Cse4(H;zr z@fQAF`NjJ$MsCYCFDqZU$Nq#>ZHp?Os`4El1zwB*vZzePMV5@pV`F11nnS&KDuwRE zKX7oO!ke=d6o3v@OH%}G^~#X((T`2;d`*eemVB&dL8Xr?Lh&=GNCQyN@h~p5BPLDM zadlFI)WP0j|BRk4l`5gHLH+P>8bek9U7(!>Y;LdH;I;(}7I%m(zwXF2SN|Y$-%6j! zJ>adpq|*DN3;cmi{>K^|&owx%+t&7n&Q7WU4ozh^z&{ z60)%r$?lOzCLW2<88md3;t;9^BRM6Jhz-L)CKita-?e#kzY{SDkQF_Z0sm|UNP%m* z8;lIh&>E`55dtt&;WmgyfFe==oM7}$jm;`U?>2z@7%&n~(w$*KvKQ+#T8*Yi zQ&6BSC}`H`4O(0jX*GHr4EpSaL95lQt(2Pz?%KF87VGTqzo=gUzj@K1(P=e`R;w#O z0!3>n)0XKq8m48sYNL9tDb<$*d-cXrNAE`PqA2H4;7*g;=am*pH%e0I43!N1`8GrS zKds4bKS4-g`i5HOMwT2HAPo?v-3F<9(tpeYlSbpq zg2_;!0ni9!g#6l3w073y_MV|z{$$XU=>i^&2AyA6fTB@8AYsG- zEj6KzIt}5+;}anH>jGBLZnS6^V+8<8Q8|(q5?D~_@?tbfQ>N8v$|k~P60ZF1V}ZEZ zX+qS*v7mPHna097G!|?^=E7L$?~KL%vaxX6X#!eqtjn;pT`t|6H`Y5L1)OQL|JPvt z8DZlrA%sFdX$x>r>BQeY00L(MBJe^pfu#IxBjDM|z|M__PHEAf9S;RWBF-=#f@i>= zFAW;wY2!hwW15o5BVt0E&p05o1x$?N+>m%~aw|xt7k-8m=lh7AVo>t3%BgGv?;%c9 zP^njNKd5q{tk)o!iL9o;;MB-UzFAm=2xwP%8qsm;E@V%>`tbvL!QH)V!}dFSEsb9bLx-cmMq)!eeb=O&;$ye0bt z^gWaZVFh*PHVPGU^CiDzlig4rgQ4Pg0&gMQ@isgH6UFt)kliDb-p(Qugua|#kMtQU zm-xK0XOiZ@%{cYJdKQ5ysA_N|%#tlcf%zhuTyXQfT-8YeVlR_HM8&l+=rg1{P&*{} zO}rr+SqjFx^{6Yc-Zdwa9)=r-kE;^b(10s!_4$N~D8{f$BSCi5ArIKUNyEh-!6G}9 zL69NE1fi>nds%T(BO#}->t?tB@sFx008LmCqdCr>_3BTUU&p<4cGZP9uVr^T1t8W8GOpu3bh2=&X*GGcZf{@iFLotCH#~acc++DMo z9{LarsColSZ(TvYmKC2kJ?*n2`WojH{n8q}qMvfG-Qx_*R%Xwh!_IzaZ=q7SKE59N z%xzA3{G;~9y1?vf@J^tCzw~f>I}~fe*_@9C))N|Zr|B=;8fva4+@WC$1NCWY3wlS@ ziKw?pZ$TU@Q5Qi!h`y*~kNiE8)n+1mEa?b399{cd3K2i0+&q?}C7^XFK|SK}K2Gl} zPv(=6n~A{D_#?k^3L}WO#VwzvA*E6&8rx!YK#iC*Bu>xc4Dd)z9AmL?cyccJyoYcI zK4kJll6H6+C6!PmVl`@|U^w%^{SL#3O2LH>azfiEw=?84As;D`fbNu+3E2mP{YC@Z z3a~mr^wF)$4w!lt-sKt};1auew-uwB<$SS(E6~RBAW;ov0e#c6%_AH$u@-|~b80tZUb#xTYg;edhL+#RSZSw|K4xdRj(@4;w> zZ7)c@L1cus0-V#ex=p@@)fB2K%)W{eg&zh#GGgP$&#_CUGtqPkb}gT8I1P`00)3VD zBUlvfO}faC@fj2^jJl>!*BaPNthP{>&B`q_eJwy+i8_SB2FCyqQ68Is^k*vW0WlnF&L zTNp|pyfJO1u4=tmAJpqFW(^nXabnh2yGs2mY@BP<8LPydjT=RpDxtk}L+e-Gg2OG&~u?LMYv_!?&qpB;L{E z>|x1{9nU@N$k<3Y!o43_vRhUxE-&#_5?s#6rN!k%V2JTYS>+Q`xLhTg!!saU18;~yTRHZQgAAz}rkMinjPRAvd)?l(UVDz8#E0|EKiHm8A=P$mt zxu&MM=E|J0i{dg8t}3Uq%JoY;scBxFZ}ZBa8X!y%8Blg^Jh zqa_6J3sHdMN08$P#0xhpgA>O}d;9tAMP-f6RynL7q=MQVwLUv(v&V`@#?kekn2LE6+P2VN~fk* z^AYxIZlAW_!)@8(d^10Pk?%7v=RL?z%EtKBW^wPd^OyM@vA>6(i+x5MXw0g7g1k(? zbBsRQIEH7r1xwN|ub1H}k12z~S_fv94d9`?MBG^!$(QI!h4C>0)Rb-5U{WUeoMim6 zqI3kVCb_5#T18~6sFca%cY@oU`Z8Qvlu6;ak^-urjw0S71&yH$G(BMOlFJd)1xyJ# z9NbO51O+MA$7Mv4M~^*IFF4w@I_eq^|)DX0MoEksO^l@8}w zS2UTe_incL|Es|-3xpWB)HH#zioBT)CJ3oRaS@uqF)pq2V)@5o;mBN0shOC3u7gSEvjotuI{N@-aE@|5=Hd<#<6w4u~ zF9`HFZgRgN*Qi8J0<$^kPUpXq!)Gmd&OHzdLX#?y%nU1erGpP-(h7s=I#)8mDInFd zpMv+7P(IvOBQ#a72Yyua$}+aArn$6m#8lnQHhktE0>yqZb4$$>z1{S??t=gInV-i8 z{a48l6eAFX9F>+DK!@j|hBm@a0}zzQT-XculmmbBuj^Uqpyb)8Gz)Zu1+cahd@wIj~zs1@#=??DLFHkd0r zsy(I|?xwoBwyw6bY@V76rZ1V+s;jK4yL!zmf1P(q@1|e6wMFncxQqINcJORT3PTP` zVYJ)8%i7Uj5P<@ywE;duun;hR;W0OVmB;+*!a}#p*J9M`jV(Uct~JZo+{0byWcl&N zB^qb{R^L1Q&i;rH4Qpyk+b)_QMY8rKtge6m;NUrZ&i;QFf}_10f}?SQNQruArE@R_ zABOLqbT$XkDbgCjZHViuwwpkcAKEYw$<`%K5D|HGad~<1UfQ`+3!L5ecRQ!ITmvGq zt}c>Hrpt@}nI8Rfv5_8jJ7=}DIO{;6NY4;)6I@4RkhVOqu7DeHDT4&3Z1m69AtsHh zWh^#=fmm(gJ5(F_VCFaIoTxYGfZH@q$5kSp|4xkCU#~m!tM9F6ErHocN4^<#KoEA=bY_v zT$dHp7jiOGC}!p21t-EXbS(U`(Qkr&7oZ;!z~eZVRe?E;S#G07MKqF>MILafJGfi` zN)_AEqbNNsCwp32dKA{aVgCG%%*l@V^EWJT3^-D_hlhNB7j7+}$BN6PWNjrf^k1@R z8Nk!Wqo&AJL{djN1N$aRo%MPW%&H&!l@d9xY%U@p5$-uR%_Xgw(MY7J9X>wLBJ_V4 zIFteoQFN@zfdtM|fHUQa{A>mcN(@UHp^SqQTwY11;W~~)B61`uV;_a#5u}DAS6E?D zC2X?aqdr0c!dZ%O5#<>m{RA=Uvor@)o-o=(JZDzoJFPxPEq2Q}#TBNKUBwj@#h$jt z?{g}s)``ik(u#^wS4Bx5CF(0Sx)4}sJu@FZ5e^XIhfXh3 z@`fT)Dl28Pd2VyFwYD}wng&A%d2WooD0f<{)m3wwVjgSVSx~bJXw`-+%8?*WZq^`ax8Em)JJX)PQ!v26Ng~sMbxP$*aQc%j6qP~w~;snI|FXeMhv*nSat67!b(D^jbE} z<#JJbRQ*JQkw~_+P(4>t#sx8z0!xs^V4ud+fILM-j-8UygM+6VF*RsU1oR|{Tt#$` ztT&*45tSAU2q%KdD3~0LUTjk$Ly?RWAu}Z};pp<^ZN{zB_rj8FP7{zYP?0C`TL<#} zCC<#CuO4_O5b~n;LZVW04tW`{9C0vua5-=zxd2opQQOhr+R7ewOwU}6Qp)SukFC2K zq8fu{J2RQ8D`uEd&7}=>A7svPOou0G#8O(HIayu0+jUkeW813WW+Am2icDAZ-5kA08RRP-=$HB1_ClS_||GS^?IFC%NNnzgp) z#-Gmo?hZ$@-C?P8uqjuq=~?^iPjB4u-S;dGd$YrVvdK0>cA^qs2d9%kC~9(mCE~s~ z{t@|$Bd3L7j7yS-MHDfl0AX7^P4kQ)b~Nhaq)y=C7!N0nrYFf-Ia!^eZztF*RehX^ zye{EEve|4-s)4eEXF_)+ogcND948y%wnLD9G$}t|_9R8OMkfT#T6mqKfNxk5?W9#( zV4t(pd+ROe5wzBmAI(FQrQUD5gf&&3lD@ucNpuNQibVs9YZ1&Z8H-uMni<`tCDEVHgVhoeip>p&|xm1-W^I zB7`TB1fXHiND<-(g!F{svRe1$nQg9MhH%1fpvXhayz%>ul@OqM{VXL9DSg%>)s5BF zjUVy7Df5M#P@fz8>N}z@cswn-obVLX1u!6i#Pk)q#0=I0N@-&W--z#iK3Oa~mZ=`QDB}1rUg$dM+_Nc(w>4)m$!*Em)B^WuHuxZ zxX@8&ao5z8=yiofMyq4$G~bkhV5h#PzNUF*h%ud^ytrnDsjRBR?JqG`7@4WWu+!62 z*i>dH`d^Kug$`$(v)S8dsxn&}XNDSr3wpec`bEWs2$9k)mW`DKB~u%XjSUVftITrO2A45}9-qYHfs5i8S%OR60#FcVJlI0SB1hC*%U6oe9WxF<>OO zJ^|xMpCjiVML!_qE+98j$N|Owk*fno7HjG0X^BQ1UauoMIGoAg5Y66VvDs^8Pk|gb zCGPW0#ept!ctmlhGWFEoXse8H9q4b*i-FH4dHZQ}K(ppV(ctZ20YAI3KecRXPxo4r z-@0pYggKX{mNw7nte77qyo*VQ>Sr==TJn(FoqJ!$pri9KBWMxX4!E8?PGw^wmMjnR zeFgu*pjF9~YGo#b%;#H!BO?=-);x-P5dLA|=Rq7CpCFgMXoq>}{fPuzL|;GWlGS_; zijbWs9kp0ZX=FBsh68#LPhkB5;J;72w9;Xl_wLJhXEpboRZ zK}AzwTuLH^Bpk+Pq`5Mx9OlMX(A@Yq$))*=B>yFWy*#o9{y8HU` zWy>blrk2XrxQ!$pYib`GYhOpWhc)!rZ$Lu`qrkCXa|F>u@D4PHlEpi1e$(3So~g@H z{j))p=T~&jX~swjp^iDZEgQ#N;4TP+0+Z<(gdw)7^^)dGTC4VK%V`MLwzTYG*38K; z%elkB`2M(icRr5kAq}`tFYb7NBk(JUCUhrXbnrCF$&@H~Y)qw}LcGeOpW!TT$&(W? zdkDA{2>p3EaSj&~&DD8g;%-QZKQFCNrNoL-H%W;qoG7-Yh%6A8IR>fABnM^z+A#a% zjAF0^fkcxvVk{D|hQk0yo=O$1HtmW=;8tVB@Q7ENeRk6rfpg4crxBF1xtVB|63@Gw z)v|h+A877q0Nyaw`bGuO6`qle%u;nqsl;B{ANw@UFtGOR-I zUVB5Z42NFIo9S~jQn6_sP4roW89z|c#%K9Bw)^cf;}>9_&)JyolPl*Je{DIYjdL&H z2ofSos=>h5~dBDm|i$WLB|5zTta?_%+ zyqElWMs7g~Vcg4LZJ0R#sttJ+lUabuAmm{OTkg0LMhxHZwXx*83w)P(c}oNxi!Co_byW-7|NJP)^BhKgNfu57ca7&3+eI1e ziXkh&Isu(EhI$gO5}GuRQpnOiGGUR65g1CdP7%R!L8-}9dLQlF(KP1u!0xJ;N;5wq zBOY5=YNCh(s-v2(j%=T^8JJZd&q6q!=NR#){5&Ivb{`r&Ekib*ALJ6^f8fp&>$WVf zUMx8|gTM9t9Goa(6#iL0r#Rm~3s3Dt_iR4kI*gDMTv(f~sIs!bY;4|;SJ~eiWfF3!mVpq)UdRQrnww{xd+uI&18Kh- z{({f+324mQY`iA)It!!;E5)k5ydNaAX`2p7L>^PSyeQU}m@15gpxT<-| zuQRVYJIH`5!pPU zj9>BDi7w1c9qeODejzMEW`W)Z@t|+;s=T789Lq33>u;9BE6n?*W2K_w9bYf3v7_x7aFh3m19eG zdLQwACM{~|4sTg=^|lpVOIEL3vCZ6Fyre7EUBCM3H7lU8I?pe()F1%vpRBwHa z9Shii@2YV)Wf(QpBu`L8u^=9^pwNeagfMe)cL_!MLArQM`9Ga5~umqnUfoDS2}Ua(V{ZXF)5-HH*F# z$FGP)hMeMKzLOLcnIDhL6&c9+h(ZKy$37)yFo|f51}|aQr4* z&M)^rEcGi(`>JvXzw_Hx%_9N46uJOE1#xnHu5Dc*9a>8P*T7I{8{RI_R(8(M>sI&p zKXcG*)Ygz_jNZdmwzTLfTqUb}oDNr=2e)tf`4m5}cDjS+rF!%N6rt9QK5wnd;p|ym z;;PWm&Hp>=^xx4JIhvotb8d?>V0{7_%{Cmpv>FF^RfM!w61t%;MF?}T=F>16&WH=H zBMO^{2IH}wVIFgoA^v6Ku=we^66u0$(J53FF5kJ75Vb4Cx=3kMyg4x*UC|gC| z(VUD*^G6^LFbeo3#QZMh^xu=0#P`WI!BikGiHFr>m zxLtlS?bjDzjB+&u5pM_>ii5b(iEk(hvC(4x1_WH_{B(D0h(F^`8EP>!NEQGJt?fZNO#wD`!4+4Wmt3}oq5;{vSKzp3S@OKhuaZg7 zYBkn^{LOqOKiNjetb;fr()5T-QafmavyhZ%^&DP%p5l0?(P}gi5rr9?4udq0g}|8g z@+wwqvC()Ftq@geHC4mrDNe~2k`34x;i0yuPkzjXgH{$elefV3XX`j25@f~X%84+K z_;}@@N2bnPKfspYBeOpNaS1+Nz6#r)Et_oX4NcyFlXp~a_%5PfNfqZ zJFOgCSg?n{mHA`Mit>$j7P|Bc*!JS${YCcTQ&Ms94MmRPPG{>CpY3UPvZEy>Mp?dx z&krxLVx6B7eu_8Q{tITTzXfS;C@w}UroDK7FcPSl?PBj_7LH0Og_0KGu1 zAz~E_A@~D$ta-MYBp||!<8EVzYO|G^|MUH)r2Y3ZCaRV>#g7NaA9wLO%p9=nXVU)f zW=@GJFvgFL>_ZMqRX!CoC2RfTel@|R$7jl0La>F&_)8KNk)@AaODoCIFE<>eIOiF; z`6T4sKEu$r2;n9`27enipfT3CiswRyFpHHh7SXSk?e*@7Ex$s0vnEJM!@tj5@{U& zpNThAPel{=jQI@AuYzJv2Jif6$-@89(LGHbP~(c9YA>TPsYTg&wN7JWtQteZgjqJ?E; zg)!PW+v<*XpU=8<+M@DOtevLQ6_*%G%Zs$SZq2NvE>gE$<%JPS8YwJy*_?IIh|p$H z|My_&#QYkIRRY2r3gGI8i3a%5Tgn`Z91B-|QQxYtH+KH2wdGp&UTNm|634;|Sy&Ku-(z@u!k`Vtfr}^T9`^? z@}8Tk=ako2YVcn^r`p_7?x=J)Dr?GGhQX#GHIvLteU|1l4h|c2jUo({GsGNusrL*F zvs4UCEKPkvG>ps8buF&0mY%*-(sr2qr|FZT7x)a+QcOcFbMc|o(=zJ<28(MyNE7jN zKXegVccPX2w$R1UY;wYIJQ)vN)zQstd^T23q{vpVB~`k8?C{moI;`IIjR!XJXjK+* z*UCP~t`x!wW$JeB&t<8r)=s~m#$!9Ht#{+b-u7iYK6UL{_Y9M#x`V>vMD!{&s1gJN z*&Aq#CqVxZQAU&#stXq~V4D$;q5i-<=#4;OU^VC$&Vy{gg}}5xuOIMmVJ%M_aKYk# z>{zg%gB4TA-6%og=uv{)D1}~SKBv1>9=_%k}#(_mSpsnfqmIgvHqCSb({khzH@3AQ1H6Kwxq_KCJ#@RpdC( z2=Yf5^-rPxxxC2Ukw3pHgmpk>OY=x#atCFM4$=Whrle^iq(PAY#oa47Cwn1u+#pFa zw5jKo>~)Oll0;-Z*+w!W;sh6vMrljKY!b(o;=YtLp9~hKz(u%hFi|H>Z^65Q$$WSR zCrROOfeJ=;zW;n%7Q(A^7QVR%xC!Tx0Y{R($h=JFMEdEP+C|rNRL|*J-BcDq*Yun= zMwVx42ii1DJN`?H+VgYxTeJ5`9v>FoB(#V(Yutx~R-(KwkWEIEmg!bB`vqNFu}} zN`kvUN^*(f3{UV+UQZk(!vxsV+E4=i+~Pv`Kmn3On}~)Gd4|~k3%L4CsaAf|1pqp!XXCO3Fx6Qg?aE2bNYpE3Km=HZHl}xxm8@H`cj<& z*(3Uiq+*qv((oZXq`Jh>J?I=1k6MY}UxsT`Cc%U7hG0N2VW^D`$9$MkooJ(bl%9@M zN4kfK_&7x;EaRO^mC4aTl?npBNfp0%g@FWsBogB`{z3a_&;QXVe)X5~E)|B<9$rsW zlg2sK6M{Y;Hw1BdPWPxC1ZO%|@A0w2kwBpz!J7;z{6ZiCmPi(D5tUUb7PTFB#0Z+u z4B~_MKQm9Kd8-spLJ}#Tg^Keq&kI2%9G+NB7CLzfU=}cn(*ViM`ONWjJ_nX~H|3*l zJg;m%adAXmR3jC0zB(_OpX$M;u1K1f7YsMt9GX%|1R#|Bvu(_)6V;996-TfcDn)tG zadO4bPVzU!*_AxDn8%WG3p*rmteGfm?IfDg8njR$nXBB4H4wt2XLPrshDc ziu!QpT?j;6-qJWztIHg9T(RuRyC@%MT;qJX9HS3o8jY)Gs_CmM*Y4Psj;;n%?Fzu4|8q%>#n@U?ZFE6$i?Lq=*?pp(J zms4^0jwXAIy@+Tgc)-MZh1|~O)xp^la%#4-ZpSoFd$6x&AyW#Tn_jLgWCt^^I=Wqb z!G^Ad-!+y!-&fIfCGsLY0~ta#%*L5mXvI1UU$KtjOy1ZWkbS$R+V)jV-Noe#>4s^U zbQm)#N#6=jk}Julj|dnsvN&A>Fg$R%;}!w|(pd^YBPE)~C;}Q15rZfg8Mbo5|DVW{ zC>42wkaaFktRsLJDMkS_JX7LTDJ&I8nIa+qI1~pCl>k~a*08}*!M-IZ9rTX*d?QPi z;2-(vp+5~k_CA!&FFRL@M!h;x`D`0_+jAZ-VVX?v2wPAe9QSh*BanFfAK?`!3jaZV zi&@}QHP>wAdtNT-!YQ;_&<7dv5wxZJwh-0hkO)DapmS_E(s?ky?DSyR>kT)VWN5@; zpG=%mG%{+fY{7pxY>lR@QERakN;t)TiuG+_j)5K~^kuG-K@@Y}i8 zb}@PP?nDxXX>RYVrlnruIL)pFk&6XVV{~dMj=YhK&H5(lEN~@!T!0_d=o)pLGtZJ4 zWxpu9pAYJ9@cj?+qIhneQeVG*e7IZe|1u$(M~&H}IB?Q@pzG8_<^@yC4{{UXDglzo zDIWHuA`4hk+@`DyTVpYJJ>%Ia3If_7o3wI60briMxcRS-Lk?$o2(3XTg$(sD$O|&T zXY>=9cy@!D}ba`+=;>^1SO9`K&k7+ z7+354*T(V3Ft#YZljfF@{hufcnI~fio{MvxC_OY3kB=yvrh*c&FlZRj)OwJgdUPAj zmzOAh6}(sjdKKq3o;rNPSfaH}VXN~tv|-H!V1^sB%^{NTWe2gmBffe87cIr?Ki;5QOFeRD?f;}jB_`bGhtg%`|wagg4IIynsL7tO%z!M|TIsZ1_u z=e-)`FF`NOFEb1ns ze#TN>S8fiw$b`rqhb%YMWDwTF$|cn^7T4?R3_4*xTJ#Y)YM3NFDg5UNKfw0i^+p9@CJ4D~ZSTVwQ?BzhjgJ&9h`%KlDIR(Q`C(M(bKy>W&`mcv&^h zD>BUdG?SbQViAo5*umaO-zUrR1;j+rbPy~1&Xno1TQXz8zPVH7{?_Shn6F@#uVr>$ zuw${#J9V+>BbC0J`FuW6CyG#k>w>D5gWCZ0cZuKaY&8^6AYuWBR}vlW4tQ$difzjK zMu`TQi@ND(y%vf9_ZmE>*D-yob6bm(nJ3jWajSD{i*w1u>gMv)Q>>_mk2qWC^h{YS z91X`Nw;mDZvEhk15*-zOB2k4U;1=2N9RT=Y5B1lZnNKNr zNBL8*Z&83XOqt$VSKnlJ&F`qQxxDRwx#UydJaWwacK~g zF8_Ue1B!n&1;UJ)32g9b=&^Yj0YQZ9C-Nel2^J02_n7y6l*u_KW^~RFi)@AS^G{eU zHk-wogsG#tVcn#Ha&<1@F^`~&ppIZM0a_RCv=S%;-51TRZApeu@LK5Y*;(VXqA)dp z;zLCI0oA{f^j-_ZNInZY{|Eqy@M&65A7mMvKwf{7vg53tHOlN3dlTdp0&pS$P6g3V zxoQ3K?aJz&me~p>?oq4?=JhHJwL%9_^rtA3=uEvdMQY=`W^w_BYz1H%hyO6BUdnV^ ztm2<7PT@6S@jaDan;jjmP-;S{39312hYtx{F6$!8em8vq`p>fLzFo;@T9%Hd0(X(Ihaqaj=nE5h4=8rwFIWxWnP) z8}=pWgv^!*B_ho!EX!dbJx|J$bi`bA2<&=U8^l-Vn&gHT1YuFWkT9rgAeAFu^8bf1 z254-O{z-lbtQSI72ro7+H{eJs(qcwE&iFP_*}&`_TD2h_i^cgKhRHO-!RQCji$wqx zOwWO%bp$jc9EG(fGs1lYToV!chz~W0XMNNZ^Gfr)f!l&zc^+F<>feHZ&KvRdD2>> zWV4|ej%q*V`}by`SU{6J;HoD){~W?PywX^FJA2HdB^>=}Vv^5FJvvPLaQ12_N4H>0 zqTAvh?v){tO1(q(^CRTQPV#rKldJ_50NsX&>b)Pa&~e=12LY#~bTeDbZl*NQe2|DO zMiS?S$N65Qc~1H!z6JA5N<(&Ho8dX0!Gj_jD(5+r6QSp{tPRTHFFz-;puUKsFXE8y zB?h;GC?=J8tDh3|LqS?fCreS7`W>Yk0plW}BhZ{En<0);sP0b4<8Sa2_*xb8F^wyA zopE*U7HJGVP&zC)=kW$Ye@mxGkzutbzOrBB=tex8kqom{+e%CO5@+K?CF{K4a=PT^0(7*k^@Oz6|@odOrqp8YU(*>KpY8{e4(#R zDH*h77<33E8(LWy@8#a5(df>_w-<2Ek|m&%xQqCv?htqk=qA>C%kh~QUmJlrPoB&m zeBW-en@-XJJC2vRdV)ITco)7pn$Nu4lergyp5b2@QxrK51Bh;h!4p!v-2tpS3fe)G zI7|PzcF&~_OgcpVSydL20H5bY<_Ru^1xV>7FE*lB`GlWpOaumH#+P65%UvXWk$7Tc zgo0ZpKN9KSbc1-vVH&}hO0thp!%}YFfPB(bfKH)kCYtQw9vfP{n$gD$Q?pkOv5z00 zGm!ZWeP4AG+g3O*hvyMP9u%8Kbdq=s6gBG8$$W-wAH6rqKaM&~@-$pqaN)=(zR8~9 zcUaVpFio0UC4;_De!_Z-{17`uWW4gUJR_-<+-A9()TSiuc)s{pDV!ASNrX=gk)p>2 ztu9_y(XS+*{#VQa(V`4D@cUQL6=jL&5^4H^vysCFoC1;$CYdlET?k=_R$Zkb^)5*&qz}lY@DWHjsu0qMACmYmBcFft z7W@r_h4eUe?7%m2rg-)V5$i&`o45`k#l;idrx;BmWGNUrRonjfsNp6C8bXjlCdhur z`7#QXYi46T4*sDOKzAL9APBmLKrU9n{3agGUc+pB^)fpNhN213;Q%`wU`I4$4E%ol zn|~Jd%V1XFbjYo>qgG{dO(6E;TPOU3)@3yBC~#qez1nQ5Zm+P}Dt=gDwN}7)K4R+v8t+ZzO5qj22T^H00jbEW#HQw*F!m6$G;Xso!MNW%mcFloU+@7UA@3#QVBb0%d^#?%J_jzXX0ykFIkPW$Rk zR_hYq+ac&B@_-5MM5rX}18@?sB;ZMQAjwQIv7qY|nBex(WQc%GOmG~XBM-}SXvczl z5@g#$oqPBCAM@|!xvb_c8afQUnioZ{SGI5EhA@lJGw`2po*1h!l|ln{YoL z&m0(gAwe^;(*Ae|yXtid$>je)Rr!1*%#tFlM7Wqh$0CD;<>iHO3QWJ8clr{mH6qI( z9~>jGL`X7SR+y$l>B6$tIFH-VROzUxY-+O9)>xV#5DG;U^AQObz(pZP5?yc*)=60| zs@4V+jp#5GQ2yo536z-KL7sf`TwV`u;81x%TnrEH<3F44F)5SGA_-N0Z5)Sh&`&WLec@2Z6HgR=t zfCF?JwjIzYXg;Lwe&t$LaikM+Jx`Zih6>}ErdT8*Oxxw5l_^X{EcG(h*nt%(^r(CJ zIQ#`XXijKu&HL5T*Q5)jZM5pDi1V=d>Fa@5rYeggDztRj`|5Kq(gbi%jjva)4U^Ml zudUhq$p=mS!5U~yvNCINamnWV9th(`3AP~i7M_Ie^xp}$Gg~%@v|O! zp)bGF+>}X#ZpUfo;;CE4ufuefpfpQ(1{?Tuf|W{71gyw^J_R$(rb%<8#nMu6xbvh< z+@sFfSrf-AYo&U$H2@@)DkLc4NT)(+QcCp=60tSeX9N`$I&@@CwUwf+*oRSLs&(cl zkDXI+`UE8^J&zAhP6#Z0EH2a?uGwTCC3rg*^IO;hcB`${DCMi9Ev7;vK(R$9Oj8NkCJ9r~=rE4)Duf z-Z25bhg3+?H=&_h{g6Y@YMsmBI0%3YsTT}n_hXJ`H#^ulHOm>n0$)m;sWF$9St?3q z;s%6u{ln;!i}~vU;$r_C-6_LYC_cwy!e3)?1tSQS74bYr|2K7S0@&DD-;3&#EXlhp z%aSbFmSoG8JUZUSwk*$hY@f`Y@g%cFp2=jvStbx0$b@D{NC=4Sh9p4QJha>kgtVm8 zg3`-v=t2u>N@*c1g<`)hw|(i}H-3e_zS7>y?N#pY_y5k3WREA%SK#)|SVz*4biVI= z%YXm>{up&rzB(5QUBOJ4G6T-aY31!If2`}2vkn?Td$Zct)D~!IZb$2Nh(p4Oe+-2b z7B)V-Q+}xz@kiv$SzP6b5dN*HwnjHWECNgNfkUtl_1xL?U;ueF6VOEuz{`0CNZxlj z?gd4-GSlWB=Cvmi@Us z6?&>%HESd%(`HYso=}@wd1T$#*V=w<6|316^D^r7at5J|O_)T?&r_k$+*MO2Bh~yf z^3`4PHIga(e`gDlM)mq)d6=?z7czxvuKT|MN23;_OPLDlFMxts7YQg+Af@oNAj(lI)MkEh6%Sa`C2UDGn|DxTc?VJs|CEQt>-e6s z5B(UBj3J*Oo>r29ndlP+-WQwcOEc+A{hG(~`I*ln*QflapzX=YUSF5`5Z>~n=dV)H z>oHwJH< zIUfAwub&t>ka*=&b?TYA>3cl?k#GOe$xk9<-nSDn6n}{9} zZ|3U-ha5V{`U@<_^a3P(+GQY{i}xu5tU%Gw%YRLCFz(fEzaG)Vl)tUr5vr)(+nQ%k zvV@jF^L}(|+n3R7LENX&!d1YIlliqvMtb7(!^M}k5c~1^LmC%FP7{q0`U-Rwd}lq+ zZ?9@#l&UR`{I(O`*bGO*rcrha3`+lgz0vig>ZRE$J9J1_C%8x2{grEV%U=IlC#whL z2SsLOydX^?JBB>M4hI`8tXQUUEY5#kJ3F_>Ib#xM zt+ki3o^36|e&&*twLn-Gp)Qb#)hmP(56kgv&Fj?@_s<_L$ZWH!+%RL=mj)Y-FD?o6n0NZM?8I zxUMX)jEIiqWy4sOfh+0#R6^XIQ7#n=`ju>aik?IRs`KYVw`NP9wJCQP(x$A=a$a#8a*ZS>k(tXu63N_X!T-dfn*|xGadY};tDuZY{U?vc8m<1*3f$ELmcGyFC zWX-fypu@vJnprHb7r6zj`(m6v?c3IU2_>_+F<9{S`+|dJE5Zry3tB#6oh#S)eq)2x zQq+}>33+MtL-TBXjcQE8HOEGqltIO`jh{nb>#wruCRes5mRQl6V8OdB#L_9G6NAUq zP2&w{;5w<0P)3FIjdSIq&?W0reh=N1_3&>UH|{}w&&1Q9JrEJ2aX?#Kjq{UPxUx6% z%+~ewy$i=D4(Qy^tz$sjytcboWBCKs2--T3jLpo8jpy3)0h=8cq%A@0xK?S~dJ=NW zlUN({e(D@MP;UMgWD%lA$m2=4piS)$w)Y9K`4|x}(Cd2pLl2dIR~1T(vO(mwJqLRH z{=dbLS7Soxmk+_~g*~YPFez>~@&!ntU~A+?qoX%e5QeS237f+2k%o()Ri$Gas&0m| z*jzJMFL~HBSFz6|ULCQCK=7O(;+grTO#_o}k&IlvA7h0PFp04oz z{=^+XC~9kQM|bykMy&oYf6qhjlhq%QA}oRoLB_n>y8+sPTp;!=W0jJy`p5W^CSpWk zz$!GBnV2=*Lx?;(sAJ=G06p#k8w#6kL%Leu)YuVhZ5rup^|goE+dI7Bwq|#0gH<16 z@pq)#ExtBiOKVeSe`l*3(DdGpWM{O)-3IF;`tos%)y?Qjkp3fuQAwj<7lsNpVV1Sc z0mi}$BUhM2Ko_LtSF*}zs%!Lyyp45D5pPqlsrjwvuJe0UXKQQQU|VZzry3medpvb@ z9*=);&$O@3-#)m<`@meZduS%!=Jt5pZC&$dzv{Q(K8ffxboB-nl8g$eT4eD9sb`&) z9T-5yW%^8$yxT+z0K<>YLVf?B#dn9gmhc@-vAbqJ0%(nGW z%;Q$=k=UVORO^MSW#=_QG`AR|DQo5f`;|&#wY?p>r6(d^SdmgGg^REnO6-g57-Wd8%fg-_BwOautM*R81;<*s z_H5Ox4PB=S+Vz0Wiu^tuLCvZHa-3>+vekYG;ZBHj*}f9(1wxxbbv(Rcv)|*`uSW#Z zi9IS-OpsPCA(By&!PEEY7Bx@QOTp&B4sVwiFEvhtUx?^klwfqQ1~_`@Ap>8o_P;ux z*&19@?s`49J3<#$b{Z985+N`JPHS<;@#L5CotRH-`UvO|;MrelbhUp|uQy#yItN(` z`aD22&_}It0Ixw?Gb$2h7+ps4oWWR5tM458V0tUv7P=#gPgCzj3C=amAlD-f79~e! zS$Vx6h5*RA`m0phM!|B$dOBD2(F=im74oVr^WhC7VT#jL zIk+hDQLR2pO`(rA1Y7s|L9}-rW1-Cl6nv|O1j`foscWk2PS8Kb%N4QPA=6o?13EW? z!C4X$6?(~>g}wc|vIZ>!*UVZNZ8|grh^ebH7qq<$_5yT+`ERfnD6n2=wosS1OV=|n z<5^IdOUD-Os7263ikre+D`R0{`&I@roWdT^erk9vRiGD!%d|2|Gz6Jba9X}C4PU`^XdpG_1^C(*$OhFC{ zd%QSKc)Tgg!|X+I3zT3*3JLIM@gfvX<9#*+0V+L}dtGc`bpGDa{`kcFYq~v#XV(Ss zKmV4eJGRSngPc(}>NonE1F?zuTVniRKu)iuhUX?eDjw>*T;>h9;KXZ2`Mr17e2;S6 zZiioeU3~{y0(PoxDe%&RhRBF1BwC6)O)_mDP-2_1ic!poI@&=GBs$t&V24Fi8e~5W zZvF7^KzppuG#l!j$)291v%bMJ`(h}4QHk-`%Le^K%KYM0}M6P z{q?kZ>jnmTXWCVrODR{K+UavlGv=U56RGReqADSa5D^)091y9}_8?JO&LL_z4T?mJ zbXxN^Ganj>jXV<@iM>_Etyn1Z;6y%?#wk?*KG~b_7JsqdmC0~t-iSAM6$y=?0=a?M9+2hIYNhwtjm5946J6(SFqf6F=h>09Rg@aI`7NarE7%vS z`0WaQi+vH$4X#3wxQyfi6hFh&Iaap)Nn=U2Akyz9HqT(P zS8ME6^a<^uEA;)-m7VN_vvjZV0GkhWK+y!jA%dEdkek>!9W|Up=S!qTX_PNcFrJUh6D1f9i?6Qo$dKY%N?(w3FgFXIVP2}Ox7#*MJ9eT% z`9s_Mn-!m^<(P(-#G(%R+5Y|)h#nZZPi*=33HIQOyw*5`W%(H2;GcYqoNsxzPhbc4 zi4A^6&U~TvSo5i@3mnv6slUPsq_?F_I3c|Nvsf3%K+7W71ocOB`U3K3F{((j*6;;s zw+yk=vGl`OZw0Pe&nh2}XPS@UZ*ehxNBj@fm%EJeXAox$5Y`tRaYG#gU~$|ywx|#I z_Oa&00w0TuDvn>Mw(?XLBf^duaj3-zjQNZa&n)5{4_rUC|FSj~Q{$@DcoP_5j4de9 zl1@5fy9zw)ORkx zX&*=gI@R-cmA@K(`ufDZ*({dlrPV~BWmlph7+eb98)!iZmSKz)Ws?$Y945G93wC}F z#t!?wR(|xNJ9f9+_+&!&fZYTsAov+^ijJAm7YK+8(s}~jc)>K60xf_sLh}W7qA?ik zXdK2Hse3|xT#YY7yp_#uYzwmOt3NO6Tf7$&s#l`$3{)E5t}W)eVOJ1%xfzr*wPtj?nF5yU=UZF?7LyJ&;#)#gUfiq?l2!r~13QFl*v zQkD&E7vR;($_i568jXZuB)(fC$0q>OQQr72PaDQkEs-ZltgKlK+e^rrwZ6M%jA%C~ zC+uRZH6H}7>I9#WC?RhU42$x*Q)IUC44)=O!_Ls$tfXre_^N;{N+j+>t$pyxRF8B$Czk zzX6n0s45pCL@8X!#^#aGPdec9keKY=P)aMn(r3TdK9%Yo6?`^&#cKuv+Va%{!Mp)K zqTpHLuW~UHvKa0k+PhJxoD{DOX{b#HShW*gJ+wkhX4W**1HMB$fh_S8(NNTn%WQ3} zfP@9wrKn?H)gse$YsZP!3>l{##>iMSR;xF$x?vQrJw6>0tx#Dn0tpTxfF*PF5K%-0 zigkepxdlso55gK^7@h4{NS(j2WtdzwYd1j5BAahvwa_lafP_hs9^1lE@u|YBa_-S9 zB1cpTZJvWe@X=qi>qArC*SWu4B7wv5Ai-5g8zZ%#i#3^*42bQk2WT>mXBgE72#oX={Hn&ZS6y7%~V!lIY~e zYDND2L>j>^e5gX+zIKRdrc7Qm5Rwcd3)TW9Y7v;^dIj890sIBAUv!>8O_W<=1act{ z+rc>MY^YLx1MmokCoCGl7_*;N-=ywj*VU%-I zZqH4!_efv<5Wl5W&tV69!uCqv3XD&cSP^U@JLdn@60ojrK0Xa=5TM*pQ6gBB22@aj z>N@t^5mF56N`)&o`3X1^% zS6ZKCOh50jcIU`?sO%Jk4OVstV-7h!{HT{e$jp7ZRgIMzWLl4RctMPvDKMOI$PCVdCqlq{%t2#JKC`^>lpV0 z93kxHBZLYxn|FAy*Oe^a} zSL>eF>}lmew`2ZL3C1(?Mt*n8WDEET=*)kQ&5i6=7^b{5^}BS%F3%w=e}J` zBpB{cs|tbN=sD$j_)*8xRq6JRE_TU|VI$52wdN=|(HM9t_$cg7w*8t$-yGR@76xv3 zptWE#K7~+A5pj0pR7P-|K~Ha=~#o?8I4+ zV)dcv>D;N^Mxv{CZpbi(=FXo#RsO$jyz#~-o_JEdX8I%3)1C2_A>;K!Lx;}aa_DpT zVBZr@JV8DFtm7p)AO6+m|ahsjDHG}>^%kQ;0Q|>gkLPjJzz`HJn15 zd9?ZSmHa%kIY3LYPid=ilE!0LXIde#S1`( z9ZVO}&n_%XP2o|pqkAY+!MaRd2+J6*PiEBHHMLt2TB%&IQA6rhH-y)C<9)HF0)cFF(im{Mya5~hRL3d)==2%Y9aBzcoztrt8XE%jt@UpAP;>hpzk64z*W+nT zdg_}4nPz`)Cez+rzW##8F#me0-|us^PG&nB+=;g4_9L(A?B28M)vwNmU2d1lN#}~w z<7#j>H8u_S>e9`Pv9PDXRZC8*1A|vu+Fu2;6=w*;T^?VyxH*v^&IYh+HpH* zAa4%F>m6?o6d3oXcz;{(&h<7W1Ji!@V91Y~^}5@-JKFWl2AV&b=?otmHJV!dnUQED(cnx)8(o<(e_JY} zdc&?dmrJ>>x>cW#_lh<=EzO;BuN`hztSvLpj%>Y-`o`0}VRsY!b`8S;cR#od=U>;b z-2@-AYk^xFY=G`COV0r>pedCs)GA?VWEkms^158Ct@TSpPL|r!&t~_-lHbK7I0HV&;ozbt4wbB;p-s=LY){V|x!|^TDt5?V3A>FuJ#OO(pI>v3G3d=GgWB zr(qnA#k2eOj>Ylm*^YREE-v^vY&t=?kQH4Rg+Sae@+BD8ap(bWLNT6+6y!zg;PR6} zRiGX}=5)UQVzcXwiP+rxoz8c^(bar$E_Mv;sZR2Z);(<@)9((=)wPvEZ5|WsYObTL z{AqQXOiI00Qj;{j4T2^TM*vzmtP(on6p*wU?c9#cMMzQ7-@6X=1Y-{1HCjgy_J9{C zEzjuFLO~$e5H$>S)_f87S!>U$tvZegr7|0aaY3@kX?MhfCtdsi4`m{Via|kea3N3y zH5ZEO>rnm>mq4=*X28g-{ls6)sEVz8R^yW7=7?a4?H6MHI zu~w8^R%{Ej_uqo8$rvEOr>Gaub1z=g3xZzT7_Djgx=ESf1Bde!rlNI*SGfuLsPwID`5Gj**<;M$I;B2GRLg?&ZaqouHX;nE}M_w#RF(6J3p_M z#W|8N9zvJY0=|Hg-!hEX;VXKss{5DTDBAmi^V{8D)u4#tN_MKMXh<+3K&2hUV&d6a zl>*UN(Dal6-VlWTxe2?Ewi^HzJB^_9E#^-MiA%?(R8w15R~sz{U2Us{CG&Z_*=Xxx z8bezbB<$*SbY>9iw9+5B3puE}9aBL3h0zr&4O*#=?qs|!vGU+lLna7b&|A&nWc#u+ z;T292hJ{e_a>86cm`yJ!R0x9Q%BsN7rDo{W1xPjY-?lCoxQc*j>1w0HcjcBtBljS= zKvxJefE`*i004|F-POi@%^N^<7!Yt@rT=G-B_2d7wn!ZEJ)l53&2RP z;e6F~eqfk~k_n?|LCH-Jo~+FKUX$_QnyJp|mYm7$)B3CLx*H|))QT8wF|8o0vKGI) z#h8lgdEry*Rlj8I2RrWzc`D4OadDqvy(7J50(P@eP8Dm+EMoy5#6#`J;dPnJoAC5D zI*T%kah&bP+wy;prDG4ztC!*RE%R3j1++z34L9I)KsS$or|w28+w(TUS+qsg;nKxQ zv1G@m(2qXySXN&JbfaOc(L8LRNS#0WMyaoQFxzv=RsS*`T>3;2Ul1MwJZPA}mGSnw z_ANzFw6tuOHLa1eiG9vV zgD?zRV@1r&O;9Yq*fEHZOpz4i(Dr+RyMX2Kq-7(X1>fU#f-0B&#$b03F6LuXbB4K! z1V}6chF62F8s@K{rJnA=lyv3II3r39ICZ$KM#n8jJ;hunRJts zLTDT7=h_1;pf5@21ui@`*AGsmo@JSl7e$9#7U$^d`GX_BE+t8*^5Fw!uE_PBxF;=7 zx^aDQ9V~LM-oc1~(ttASrP$NQW9(Dllb;MAkxJfgU;_W|VCw@9v<6j&l`}*h@+YwA zHo*#_^<3?8naCkG&h~t>o~v=}*h)ilX7OiRTTAd@mpu4u_dJiPGpLVZ`r2?-&ftkM zm&Sa4LFS%V16f9&Z1?J?g$mjlJbdo(aE>Z_>r`S1D20m#F*gKM?w<2=bLVFdjb;ut zH}9(t1$?^_L-WJ_uK}-nZYXws7H$!Bs|4CC;Kb0}6ZrP*`P+BDbs67oZ{FA3yenZ0 z`+;;({q###T~FF*-~_>V=(qvU7{)BwR;}vJVTYg~da-&m&QG<^DB zAS~h`I84gl8uSJs8khwW;zH0nsCEwwEDa3oR^ZyhyYl&6!caM-j#WEvL;zwY3*;etq!7wfd2RXnz=Baq zM&hegVP#gPD!(GhqwT}boCC<%iw zAW7G*8fM{Z_oCe-SBQ@PDqw9?S~8ZGFH2mP=Y@%6a^eN6iGK(8N32%F2&xyrc_Cj1 zT)=FA2^bu_Be@@X!iMix})P=mYbTAAggKUnuUe+*%|L|{$#=^18+8VYH zN|LN*FC`MeU?OoTn_0QUfTl|;_&Edx?e|)R1WF78tx-Z^fG|0c71f?ZWi>e=bs&oS zBv@3fOe9ODsm#)40=uUsaUByxR^vdy13CZ`NDj7bO7`#;IvU=SDwR_2Zv0TPR7w`T z_xG%>_FSBQq-%8*Vi0-Yyy&$=0f&c*mD2Dtn6C**1NcWo3FiVhaajFi*U9Bl@c=fE9Ndt}3slofs>6M-Kvpt7=p~_dI29y|f8^h_pUcgN}}rEVyAoW}qtT7w|7J z>mbtpqJu#NL`yGU31vVW@p-87LfZqhzpz1ae$pZ`pzy{N$|YDF8%PRbA;GesskBG+ zspH|p=X-l^ITAizjQF(})!xZhjQI0^@a$gqO*gssp51-8FDmf@$Zvu9fb2WZHf>pf z2p)*K&Fxa!-l(G*At8&4LJ6DD*M>Y+$uXzw&x?U`$z5!~eQ-w}F3x<3u1o*OCg{%fdz zN>pFOuEWx_va({z5@B7&2iCUsNGe=0n@{$j4i`?^LcAK3T4pQ3bo3tJl>EQ4TtRdaR-RLc^;j zQ;D`V6N;1J>}=a;>vS?M^hzok*c%8OHKOWZ`H{9@unm{qVl!lJ0OT5n6*cIc%+b~W z>xf0Gw8%|!9uyE7_sMRki-a*9kO%SI4vz{A#ZltpbMbg0)_-?^`u~A9`5z|dP9lEx)9K9>lzawc^_}6BNk*`L;NrAKXLyF{N0bcCtrFN zIy|H4v*@WMIe0P31F|&5vW6k1ZJvu&?`Mpa?kEkDIrX4~Gs0GsV*e5lB%wP6{ZWJ~ zV&lg9h9MtH=wkEo@{BM1ydYIRMTkwnK}P*cBm*C;Lt&fNVVa%MFJk&@nwkWStRT?= z1QL5W$k$`*@{xdY|1(toh`Z+oLx)al z#1eI1rlrB{ej=1~xuK&pHfEoOip-$Yn*DCqiNlz1?OmO`3`qoeEQ`yc0s(df5$}AT z&u?y1h<{i-hw_Z}*=t`%nv&m?HFxdSYO~{5w<{L#6l0-1FZLx3CpW?AYgr}D)s*+( zLy_^rdC}=rleoe(yk4%ey}U-^L^@vn!s{YO#$}x1)?6W)$6;}J?-ZjF5z;hn0VtX$ zFWz_R)O{CKUijwy3s;UGzan#O+t`Up3hfm4kwu^+c0jTN_W*r4yj3-t0rCXS0DH&4 zrHr>trV6r>tO$QZ?QPDXI7TWu^np|q{}=&f>B5ZQLz`Yp9xGv`aph}E9o89TLKq3; zK}uu4Cek|I%0uJ>ECUj1{Dbuf|7bVRFH!OgBnP4?v;OQC&^_hb@*B;+4Dfx%Mu>M@ z8w1=DR7`SbANNG8JIsnd0P?X;1bSUZpO*>%l=3+=AnSSyefMc z^I+9BB8Q>Gj~xu?VT{5dlZHz(uYwRI7mJu+l zW&n-F6JNoWE4Yej<%QN#S3|{dWu)cfB*QzfW+7ln=yU_Fhe29J1XWng#@`ov z-}_>}*X)nPkB>COBj(4?M9w9#*vEHD1jp%-6_GRUd%PX~DlJHRe2hUK(CE1Rj%swg4 zU(K(O_VBR@TeHXmdLLA52LCD@JquFvgXrnmLiYP<>JtCS{X^N2<1RL@9cm}h5M^L; zxltvIxp3~}xt|*A>l^F4MZ{s#giSKiUJUdM4D(RhmLN z8zfChBeoS6hat+R7}y6(TMpi`?>5yxRCtX`jw}Cj_7Bz$1aXGS1Qi6JaTv3hva_x%m+VbLL*AtWnFC8+`^6tK8Dv}|6P>C3 zK)&I!az&J53481*j2B}-;jBSek>e@fd*0(y>*a@irU_+$cxpPAkFjBt@8PHbg0<9S z>_aA{PmMT5=993Q<)|O|*nRIY6A9G41_{ms)Lt@SkjyhM;G2BC0U|BqXJ6M#DYf0& z*T{AWcCr7D~i;Dbsqnt$cG zbd*JtL}b&E_#7h>w4wyRqYG3|R;^Uyu=sx#ngXlMD@Q?@K@@}pjyuxRQCk!KRT!`e zAk<)uSSt9f&RK%B^Cj|0Y@1>Uw)l2<*sqs)h9&~hM{_hOKF6u&3q;F6>*T>U*$RAf6Uh!$8zuWBZZfSr@*4=OFKY53z9< z^_{Vy`UrV&q<$#YSwD=&P)sb5A$+1^Yv&vxu>nPCNf*R4adnMD%h9%56wbviP1{DG z-(Ri2w=bQ!57wWcFW57GWTa)-7`|Ru^j$qh@RPpl?;dpq`zDO6nR%*^d0q?VTlPg0 zr3*-H6&rAENP-oH{t=!n9z) zElxWYyy7^jQepR8eD>>w-Lvtz6E&}Ke%l%SDer}L6I++V^&z{9EX~*ju252KdOhK5 z3ab2dne5bZW~49MHv(U)D#UW-#WmC$?%VAwm7Kf#tU!dS-pUxZ9K9Tfp+bpN%c=GQ zYpzA$BpF{3?RDl_s%v3&<*5bHUPr&5>Pp%{pEzY`iT)0BAV8EXbVhk>%ur}X;*jbIX3b;RaA=TxV)dj!dRmf5{IPn~Xgy8KEyP=ZA2JE@M-#y$ zuD+(r;I1#OSv?F-b$_+Qf?7xpmK-+(@-{QP7?G7n$bz&JlP8kyYfoZ?==dl+Z z55|5@KgqrSaB_|8+Q_TucSU2POF^wZ_+ZTbQxDp&a0=sIQ@2kbPcbM=UW%!_JW2lw z4jQ(v7deaw|EE@v*|+#*h1^Ev?5z>j5xLgtfeg2lrlzHF{#mX{IYmsu`v;3`*e5@$^Gi8Q%@ zu`l2i*Sp3?g#F!(hbc7^3M>o?(+n=OV(CbE2QuW8Av%)I7M10u$tDy(Yx!w2!w1FK z@Yixg>Y_Z?9NC9;>^WHM?CaUrsXSX&Gkrb%+kJ8!jqvb6IdxEuG8c>19){$FT-G`6p)6hCbQ`1Kg$AjxR9UsQ^?nM7M zZ^R!*^c_V#M&gi!p=vW5Xg`}iC=8SZuo-n9aKhCX6%NI z7ae#d*QE_izRMbx;>?5KvWl9L-!Z;$L#%`s%CT`nY-=B+&wxP5kpNUXq3S@TWPA!( zLyyZEY9M9uCv}BP8o(M@W)azbFFIoKO1}RfzK{Qyd3?WGr;)K(e_Hvz6llB?-{-!e z|MbsfeZ*-6wJq_s4?hQ)rdO=(VT4;??_u?FNvfPkFAvD^le6WG+2QuxiGzvV?d88# z85A;ArndLU@$4|Nh8Bj0{kz-RcKgeJoX;b#lKk41(TE4iEFoxE@D=)lIm&;Ktw8%+l2NmuR+ekI-;2?iH;H#Yw4u2ZW1)UI1^ecjXg zv#0MKe|R#IIhR@79qEkFI6&K#_VIW{&%(Ki{Knk{+r#7(gZjA7H8M(ufumT%sv9nT zjT7 zc+c2(28ujf_(_{|?{H0VEB1K4)lf+LV7pY?8(gYNQ z)jR&igW=&|tKc4#8}zzv z5Piz_O*8bCzFs?jhtw!^bdJWL8NBzhP?HU`_wmnv&1Vr|q zLg`EFRFvpJmJR-TRS<-(gp20sMqcIt7Ow2zbg+CyU3Pkl8c`9EW;9XYO9^@ym!=0j zfgV#`{!N9(ZC!U07K1o6Cuk(NKba9&IknYR* z(c4EGTKZib9UbR=Gc&&3jk6;ovyIPg^I44Ex_h*tuK7O?c3d3nc%5(GKHu(B{NgE& ziHjDp*j!ES+s=Z%( zM39sj9h%RaojZ9EVQM>c014tL)TM{T?c&LWoyVZs2fYUNq7P#0vOUYNJ8xM7{+I00 z2Sc&odG=+6hxkxp=YAC%eW8%AvARAQ=^AH@+ZNxFHBX!qhvR_kksd~-4rsqz8i`G_ z3Q6hAXR=^_a#IOX60j+nOVsx~o-D#1yL*~PUNO>~h~RbB|M_E)){@#$~i!ohO$gf%sfV5NP0~M#4pM1@a>%xvN%2Ck!yF zuig1>Rg=!`pdC{Cl(n1;eoSwuW%i^WvBDJsIS9)^{71O2_DHEWidG11u!@KUouZms z&TCq>RQgn*^VeQ22!6g=z1Aj*AV9DJ*o)=;!lguBux;0r09B|$ z2vI>n{*`KpVO3tR`e*xpEB(_~WB*FkOCi~Z{d3e_3Tq}08Lo(Z+)B&g05y0L7C=J6 zWXB6qbfTRG8a>oj)Jg7&`xdg+6O6~GyklNCJiaU5)tg;VM&%{W%bJ*V%!(Y`3_1Z1 zRy7R_5pZ6C{PAW1=7{FPq7pFkRZu2XabhBx@TEq--336w@y^crhEL#K0cY>=G{z$+ zsWLHfXe<+t^&kMI5bFZa;CQQN$mRZoKBGT%dJ;bO7TJYW)(60cu>Nxr#li$>3S3z# zYH8S=f~`og(cRh16vxMpPNzl(#`2kU{h}~FzF8=gCdLoX+}b+SvOkj@7%h~qApfG~ z{RE+&v6i%qyou=HM)6&EVM#(l6jTRmx=1>-zX}E+6LyIW&Y2uGkr}m&6asMbttE10 zT~YSlg#DAK)f`#9It`?uLefW?Hywc>jY!(S?D3hjl5da$ffj~c{_8dvN49*&EDYSNE?|c^p5d;%=6PS(hfr# z;9P?mxjDgjsQlWqfLm%U@$g;H1f#rS;J;1}Z*MKj2g+=1FRyQG6p^NaLdXTQSGBKL zlz}$En%El42?eDP?j_szR6KaFc<8fR_FWYpz7e*y94azmJ(7iRBZP7j*mu+=IE9wk zRXis;FcGJ)B@sFbL*%tM5O5h@Ubk2_)T8HE|191MIQQlTqkv*V@y4OiU@UlZtyFRy z(g8yEw1uv_f)j-Oz$iBeQ4pVC$!MT*Z#h#ym?pW$iuxP%vC8#4 zyj%>?scvr?%Xq*Gojs<0X>20o$Kzu@wc2{eni}(!|J(3q`eJIgoc52seDJ-4eSJ%H zgD-pC{$>+%r?IqFuoEGNie$^Q!L4z#C{IzbeB%1mXsWQ#)pWG8IZ}QAQ3{2jxy-wpqn`fNRJ2&=Ty1jK zUl0ML#Ie+J)q153>XZmIue1U|XG4;l=f} zKZ$EMQBw}o_BF&-a@A&nUQF0Z3TdcA^M;yt1$;|ET#2n@V$A_dW-67R@r6yqViXH# ziFSVSCdPLB0mhp3p-{U-9P+Rh!^krQk6I3}ym1*L=k0egLH=K0$ zxWWMy@+HS6$L2zJT^`)$0Vk{L@0{=UbR=6_y&a{cgxM2*Lr0>{)!a4EI8xttHg8O% zzwzZTO4)WKyS)nWN0`B>ZWcR5Rhh+04E$vRQw~c@AQpH?fx34sI9_ z2zEOz9lFIuYw@*8Bf6e8`>KNZBI*TIudi!rw?jax=JWk4YIO6OXlAGD(N1i_u2o{( zmF#+|$z+eVl|U`FMPXWuwjojAf zFiA;Gi7W7!S}-s58u4WRp&Xwz&8eoCGuAX^mcN@ozKB1XKmr^KzQfOrWBI*>r(?0F z3r}6*gj{+`#+fld9|bKWZlimXJ3qbDx^c4838vY*dx?Xps+$EnGk&O zoE&>W3A`x}GQWZ@2w_}75C^AL%v-y64{S8~niHKydUw;IiE?J|5mT*AY+L((I?nc z0zniC1+}v{Da14KRoGU==z#%%5%F_r_sp)L`Jg}gClBD}l{4B|?_pMMcqoc8g6Y92 z+-1c7>Ho^xFTX$9>BJC3nhk6Wd;QQSLm3cQKv;$1D4QTDu+0_}PjvjKa1?w3Odxa% zt~}E$qBww{v9@ev*1$pyfAsRAX(Ciht(zwDe@(L>j?9S+L%1S-2^K({m!5OtkF$N| z05Fdg`R~N+))EHtHIjhgL`x9$CsqMld_g_cJu`LS+@q;|YVp_y<<(vB&CF-ZOI`a? zkDfa)HS>`V%Jbd4epM!7tQc1mgATN#Yh@!KHpNZQGut@ngkQmgU!jEl;QLZFQFf81 zZyklmxD{0CMaRo!Tj2UteTSG1;4%a77I^(J1>j*n3%aS$=e@5ye*Bf*&l{)iyYC8K zs5PAUe0j0{;b$HeSy}5~br^rCq&|Rft0Y1%!+sA2d8A?t4emYTeSc}uoWJ+|-ZMWZ zJwNL`vv(0FNC0=JfB)Vy6Z$U5Tk@jU&>jV%)o$H^$9e``z>rdi`_q}left*cWq+?T zzZ6NRD#CL!7lkU^Iz5G) zNIaFFoylK66FYkTo+GpBmDkT4ofx@e5$6{VADWDrCk|Gx`2^^Pj&1?fSimno5PLTN zT6}XY_7$zCi7g!_gf2lg*K`tdXh8)N3dN!YP+meveWQRX1Ojj191P)**4s5q;T5|g z73pgp8EH;7505nWMN-j~%nhMfr~{BcYYokTa4ZxK2j_y}1%K4r-|vmkP}7T;VElxS zh`$#+)mRO++)4Auoh|%&F#Nfwzo}_{zNtx4JwX$zv7|N_AKTxvilkr1N-q{g0|!IqKdp`9ut#?MT~@;OV@a+x7-U zA_}Afb`EW$Xl?!I+jvZ|2;C&Yi{vGoC3DaRWf9rMQ&qlu|8yba{nhFHx$^q-LrmZr zK>Rr9z-C*2IGY`cDR~a}@5MR$50uv7C^#KhPugahq!(WZIa(R88ctb_h5P6s(Q6hm zHpYuayNTf6ojeDg+Bz_8zDF)?0MaMW&!-=!tvcVZ-P_hM&cvQ457qLJj$PLp8!URH8Jvsl^H3Yj4g!fe$-;@WiitpCrTo*+>u`n^ z5Xyb^;IHA7HBE{!ROm}J7Ujo{C1v}0YTCtogp*fIxy=;p?2tb`Hq-J)Eq!9iev2Ic z^E)oUiKKl%>$`e;@0D;4o$LDh_~gPnRF_3?Y2zW!e;ynk3<>eVND&1~=Ywny;UcKE zM7U=d$bc&`F%0!#cmjF)i_xMH3>wSh$C`XpG<;3R#$g^n;G}IMdmd{```s*UG`GXm zK|64Dl^?lrgf;r?29VOSxLVki%k3(Jc5DW7rQ0b<-&qF&{ymUxAeLFycImyoKEj4T z+vL{3u~p&ou0|)63XfCn=GFa?#kY1o51{_?9~=ICUBB}sUvzZtJAv97H_;*2i24 zEiQ&ukUO;;S`-DMfVZrX$>;Jq&#jpH8*B1y+?$QD$r|6FN!s5@NK4#6k)GEd zKTW39Xa#bxO_Sr$CUz4k#?H3GS{CBZ7&FG2+3&;HUl0PYUBNBH?jwF6P;!a|Q|f+E zJe!&QKlHtt*DoCDkEWUuM~)s*hOt!6EE%J_cdJVhB6}-<2aGu#Zlzy;G}_qR+|m-o zQ+H!@DIMRtH=Yi`q(d4~m3Jy!#14x6@+&Wu*S;o^>FcB5+NtvZO`bT+b*$z7BIpD? z^vsEqkN{%c*i5Fv=o)z$B#x4A{6)>x-X@G>#kwZ-G2Iv9fJpB4RF!#Jk|$~&NIUj8 zzF;1oFR#sCFIRojxkXiXAA1_^&oBs@=OC%-t3?M0q3u10k z4%t);c&l_=WtTEjO9G#*-ViQt{&|y=6)af^wz{7*zhjIlb}+cAJS#6WLO7fYeD%hGu-rnplx;-!MEg26V!fhD-rS z(y_PuqxZNiNV9j29mp;Q8lbQ>G{a74-n0vP-8~)c*Hz)nFdnwf?}6L}9R|1Jg)Ju+ zWOBi#QQBN&q$}cWi|@a;aP#TYi>Jg_sKEP&g!jX1OOJ=BIfVI#ekaRU5=^zUjIamP z^O%D8*gr5npgs_Yh(Z&%?4)cF?d-VhbpBNP&ksbR0|U{)=p1g0E*Xy=QB=`Is<&&FgWSHGR-Bo>;)`h?Hx!%%Iv@JjvQN-%u!Q z!Ii9S&`i{{x8Lz>u*kXcXh7ZV*Uk!!6Q`^hhxv*^< zu(Cp8NKbe~i<25(Y47&Fr~wh~ekK$i9tmGJGK@>Vrltc=q5}_w!^6Y+5iV_MRNHh* z(4{3WuNF6_605r0P)097qebAub{geIkwjhY-To1S zOvvf&_ZC=?6Z~E4+gy{C_$Yfd)~>uQOO5NfO5gN)zUtT5Ut(FPy~@u^wE3261tc^b zH(}|A#JqJ3cykE!BS4aJyfyj2Pw(6J(+?!yee&{!mUq6h<-%pQ&%V=s&AcgE8o~^O zK|l{gAN&-*I~hE3d;j_a$+zkY{PNf>bM=b{E?hpTFSGR;4ID>(4Ii#Du>Csyw;u_r zfo&ICte?B(mufHQ#$7nni%v#C)AMkUmMnhm&vq2%t}-KeeX zi*&}ie9hhQwzi&Vq}$gPO19P=?K#z|fyJDT$L^XTlGy*)^GKi9fAeT_s6G`8t(|G= zZftC>Ywip;wSpdo{l1p2`sVN-0&aEvco@G2HfqCKx#GY)odNXZPuW4IKdFDY<*_xUnhe5Q$oySfRJnF$j%IB)(k z;(3+h^5x4|f2PboV@;aqCAQ=L8B5OWr3%aLC7-owkxZzgLYK4aLGA{zZv&>P#1}fe z=*Zfd0qdcL)B??4I7q1%-2be2JA9PVhrOtvdt6qEy5jU_U}$v=V_ z9nI(_SA#*MH9jCpI>d5&S7MBJ*i*R?)#s_yjIu}iQ%{eob2pw-AC!yyl$gKnIn3xA!H9>Gju+J4(cJAfUg;fCPbTZ5~iwn{6D}v66=r{niX1N(-7!!$Q2@OhF>wKGcFGS0r#nk&*$4N9JsUVPIa{F&Mpmu zTLuK~{U7eSI3C?sxa)M{^y%I+iQ0C!ek~7lt&C_>d%I0W;4&srLCnQ1?Rx!LM7!!n z0giKL*Yj*uOTgx);P2{&kE6K+nw5J?3VrYj;qK(*J$p@$%~`@&RA!U`ZRj-6J4DUKTci@ z^fsJTzvhei%1?bWlLZj(!^g{ii?5H~f8ub?-w_Y=jG%Al8WJ7%pBNfUbav03tsNI_ z>yYsW0YyJ-8NnWr9L}+Se|B%Ua4_Vn8IV`lGw|hQe)M$BaJ->11H@&cMSa~_hw<=2 zcTG9QSrv^MGv#dr{q|xQQgA*}Rf3n63z7k2V$u|a#ClC2Sxb`UXSyg1o)O1q1{Z@* zW?ytncGtIg6VZ4qngH7Kb+YZtKQB*tMffquW*IyX(xg@?G|Z;1+dt5a?U*OpVeS~;jyKi}4RvZ%cPBp4&r#K(lz!03WCE7six!PaH zSP5D)c0@y>NDuoikI3)a>KH_p0`eY~)lm6cQt!Qze_AkC4F0jtKPtV4vEHWmY_vWV zfZn{tqiW-aTxBnqBd0_<6qP9*Zw`xuO&xFcCNc@Hf(Iop)>{I;5H!U8T)+l9I|G&b z+7x;cro?GSf!ZzGn&vfnz+`kySat0CRlQh=F)cl&971a!xkg87#+ZE}ege3Zonvj= zvjfnwY>pvT6B&hnmT-HTO~HKZTeOB?Roq8kh4jxDHv7ZM{o8zsaZIhWN6~KxU|{>^ zuW{3e?ObV)RjARz;&;EpI5gD*lz6UYe2-zAdG-h?SQ$-yv9tk{<;{M-7TER$}i6Xyp;FA63#(Fld;;kcSBY z08x4B-CY+B=kwVG-~D*R<&C;!*ZAQJ=3?Gl$i`v^7qY!wsDLMDxECQXT3FN`?0Bh? z3NLR?)L#)}U;-A;r^5EdpuJ|--ua>OW_Dr!Sn&Ap-g69STy?>*Jin0LeZ4z9c70W^ zUdN7rH(C%Ax6S=TAzNE&2e~PUtLyAA-%I1ZG>R-6^rx*5NYs;AMXUkUiXx=4y!P`r zE8njZxg0TGIa%cP&o)*Nn!;Z~G%Rn9D*x8s(~iu1oRaVey-v)=eRld(~-$f*aW{#L_dit@&L~(h5FVx zKHbjYq}~KxQ2X!_^GzE+8FZttAUvV>p8~0iD>OcFbqOj{VeY%gz^I?hTOw z0^VNbpjYhes!c%i+|NZ~Ieo=5}}7$fZ$`M0iR>Wl^G zj0N z6u@Fs!PmalTw4QVwH1zyZEs$B0UHM_D37j5(9xoRvQ*^?j#Qjp1DofG9o%+CLHEWD5?><)WyWFPArR8vFGcd9gju{Dq{)%G@@< z&i~($JIh=;S^1#hOrZ@^-ff6I7*prtFFGEI-~8BPvB&V6uVU|$=VIVaY8l%LV;;P*!O#3Jpr!6lq znh};BToPj$ApPTVwhcc38E1?vR^2OeU;A1vhKfq0)FKO_cteKeJ^bY>c#a6MFY zPmLpl-QiQVB?w};*mBh9sZX666f*F9M@vgb%QrrC>QgE&wBS0tZRx<6la6dc=fupT zw-tN0ne<2PS6^?dcvHIhgC&eQbi~W8#0{g#)G?iatBAoy1VA)Zc4K=Ti1f$2(q~XI=^A+pI`6~F zSXLVv0`-JtLD1lZ6b9iEAT`KZ(-xE8KHW~k;848#_NG=6Ed(SM3*QiX#|@{u<3n@6 zes6zSy#`k;XnAK!eHk>mo$WB1l`{@&ke9p@mClgv<%I*Enk6%u)m<--zhZCn>&i%$K;xF%!S7QVHKRY%sbxhu1jkQ>NUdt$Lmeqo28H{C_ z1X}7o(gBTUfM81jk@O>^y~9JgP79Tr*1iBaB8D`{Fh>__HjqG|cUdYrC?-LA-5vo4 zK}+#{CDgVq)eh)!TQ3E=s5q(>MAs4V{>)2fSCqa z!8mK%?+<1xuF?c;s|J;}t%V3J6Pyqm_1z{8YJMmIw9`BYPJAfOLt;Yc-jj0XH|5NW z4tb*tOBkxsP};Gu3YA{utlAA?15{B6u#<4qvp|DIQLpO&5LgBw!Y$EACKAaUkXBS% zM>p!(CNZ#mEnQu`O}$<3$z;^BZm8N0?*|@BP&k?*JM7-OC9@Um3ml=={;ry1xt#sC z#SHJV&*Edu2W2|aGPmF#!O#FCKIyTRMA;aE91s@{gp9;O+bw%(a+{6~%_86X^=HjR z=NTvj=ZB-Yb=c^p<3li=ot;~BojECUM_H;QGYvHnC6%z?lk3ao`ntKim`AyuB4*j; zD1eVZS_4HF>pWoBAe#UuX~NZO14a^_16BOiu*UMl8qBMv{K7&hpI<U>hZq$J2&tz9L|5VKYWwp9`0qz(R2UE7*(15JWE)wX8ZD+0;& z!OhGqHSVes>uVdEwN9$v!uG259RuGRgAVPg7C>@~*s-~>VU-_;B#-IB{zkb6*h}*z zc(9P#!h-5*Xc58&_ATZ3N$7UJ2ZG7Z+T0*j4|4?e^UqD zgz`S1*0%jL513fhQuBL&xomv9atW+bTb|Hy-4VzXNt_$gH6;cn5R8|ECmfZ^JPgcB zdOBdfMA_f;RL~iDcFiW{8zU~)-7eR7cgyLP zJ&hf+iNtJ2(&Fj0RIqCQ4~%9WkSEe zm9)P1C*H9xQ;egyTDdX=^3p93M-g?)csh(Ue>*%LK; zo}@rx?KL?dKeKf);s-Rz>e5<7@TH^tYulgOA=JOxK8AUxXn(s0Rr=EgJrFE;0PKXA zQ7lCXu`^yNigGoCu)5e54~2bgsD2oV`)>K97}&QV3jbOgP{rHYeEi}qs#$^}w!sSv zUw|*#>5!OeTh4^6Ay!eW9vBX?s#uL30~O35_@oAXxsV6ru-6Xt+E&fI(g6@LFqt4z zCw9E6kN^ra|gLbomd6VI6dd9T%Oxrg#t>qXEn&_;x{lXF>CHK;SdiANiBdh`6C!cFJ~kJL4o>4^-~VH8C`JLUKmto30J+-c56>23 z#}Y8#Zj?J;$L&!xtWGX6kFB&1WFy#Bx2xig7aFuX;&4>%p( zf&(Md0RB284FcW*>;$S7OyWu9OG& z>aMHnb~ZFQ@z&Mu@;d9+Zr@+us*3;Y1dUx03?$N6ZKtfYQdUyCD+(C=P@F$Gp!8-& zYa&~cyEh62t5?On^pAueqX?qJGYMOFyU_9KQrjUx1$pqj2(2LN5Ukf1` z_D>bOrTj%TbDrx~+nxDa&gYI^Qa9-HcJC-M%6D*$LRY{x!2Zvx?}EOgFOV?-Rq9Ft zoz#mg*VUz^{L=Kt^ZH2u)bA?)18lQ*DF~#sVy-E*m zT57wvyGCtLD;M{49R!F%t>Pf}Z_CLol4VM}pIC`{u~e{l;5QP}UvE~ev^1=vp14A} z769txH{pN>fof<*QBazEO;~+P_}nOQTxm}>z;o9nGNhM2)SMrIgO&gAM^*k)W^-E) zGqLkOmC$w-+Exs;R{N#$V$Hkn+OB3DBSC$59nrLukP@u73BM|QG%zVbh?YieB5k`N z?HwbzSKKq=A(ZrU8hwCoR(#cP(yXsHlf$n<(d0Gl3f0G&LPn#ApYQExYU)6mRo!}F zU*v34)7i+r!ZHj3rUpfoV=U4RVM7iKr|e`4P1V&NSuuU@l; z!_sR5-fDALR6VHjS5jMW)(U^^_%q2JxH9Z@8+8rYps(IpzlcY`pKYi!+}>fOuKm%o z$T}FBYfQQuj(Gu#?U`<9n67ULy1d64+(~b@_gWud4Qbh=1PqKLjuVg*Ces$MJ2YGv z^Pw(aFQjmcD-ZnPcnZy{5RT|SWCh$UjzIb%EvRaoh(xw5VHZ`xT^DnC23nduPWL_} z1hq8`;7px6p|1T=ic4P0JK{Hr{!@p$v(7W=cKRCKX^&^n>-9N36P~(G_q9IwdaYEn zDn=U4nZuID=|zAK3%#@*v6lG@j#}OIsqtTAIrjY%vB6OgaT>t#=B8Xol|b$XV_jkZ z%jZwdi%y7Zd$122>R~jaF%dN?%8sarRMF`=6-jS)aB#K;6VWs_V1oVn;7R2@Ie5#h z4+9VJAz&pwU3Ngaqk!jz?F$?q?bvb;eNkx1eur?QrBI%_7 z@QHPc?*2*})G>6-61~9@iTD9z{$$FVO#{3q2iI>HY6c=;uLd}PnuLsi`x1$){rAGw zXeQKeK%C8LiC6UF>53v?X^5-C9nq*RHV8ug<RCYd0OJhngSp`JqcsXD#xUwUA0p+pam`b%peze%Sv%KtCupQcX;31c6FJF7 zL9hL~S}Ak}4BUNzb+b?oF#`@#Mu~YN&yG3SWCf!83I@SZ>KQ)g*Tg|GE? z{nSw2K*dbo`SaccIEZ}5n^5!Cm$<(F|K0y8pOT820oi@rfv|=$z*yjhZBe+GLG{3l z5j59K9Wbn51I0f?E*IoMRe~CpJtnpvB8?pG8R}d%A<@si6@?W;(c3wZw#6fELXyg=Y&Kgk7IzT6%bQbERHO{! zGgDgLGa>I$?oA+mjd(0r=e97lqxzA?Y|s?56GENVLOMYtm1!*PtcX0x#zB*bEAN2H zNja&4QpIQt7nRx_qH5Qm>rYRO&drU&6NrDC z0OJ9H$D#Zk4l?x)ElXQ?G>F{;vI90%MJRyPQ)`%|r=AKfW(vA09G)N)BQ9_SS1oUn z?IX8<)kH9sLC9C6mHL{{5nzeR>aA)AoK&vr4))sTl;hGRl)j>?qP=rD(hd_Hf@Jb& z5Z+A0J+dh+Q^TnV@8%|(qXj|pJIZs7$nL91iD^X8P_~D^pDu04MRF@S%%_Il4i?P& z{ugy`0v~5p?+?#8=b0_ZOgfXjNs~$1CT)^#Nz;wercn0EQfaLSOedL1GR|gX@B4X|&*!CN zp0hpYIm>VVon_1)s9NIoM~*%p@vjj9|JWs-W{(j&ZoTwUTtjwiT}Q{)q~))<(a-zH z*tc0NJ1)f76=?;|WTI;I|HWN}UVPW=6DqgyW0V~~6?OLV699^qKeJANOPFxY0tORE z(Wfnbyy}N5qu_$V|G*X#s66yg!IvJvyv_nzi6zv@;nCzM^D2kB!8-Bn_HU)y&%I+; z|BjZ+o0m;3nZkM5-GN3h}!f8ME!tt#A6}a6Ix2_buuopF-pIo{$ zd4BUnyR?gCX8bh&?wIei@in5u@wqy--~W5}_Rv-|2^w<%Giz1_7kwo|SouZ!(+(t3?5i} z${lB)|9nUz>RvjpJC1nTmaiOYS~RaQGJoaD`MdRE=96qIE60q!vsrwLc4M9z1wuCj z?<>v4xY6z4!KV%$+#!Z(T1a89{WZtPW_VFfdZ5{+V@!))(oM>Lhr5bpr zWQX8)xOQICa!fMNchL4a<06LXAzWH@FMpQl8JdNY_gnZo+xERvXB`5pd>WLSwt1jN zk)V*Az^~Pb%}PoyD;N~B+9n1w7`DI9z*(&OAwJE60GUQ8?WLot_vn!wv$MKyz!He3`uL-^^NfAlU0Bv^{rhb1CUp_53% zX^DDaiCL-v5IclCV&zc)9iOm}0AXRfhQ&}X*gzU3|Go!tHM(Y*fZ-jO^Fx|n8+fMu z3v}v)v_ap`126~2{(t1IOCwWJUf^9#s9g^VFM$Ko;z@ZpE>9m$H7KxE8?6uA*yL|` zD|#x_mZ}9j!N@F83Eb4=4|qpfLUO6kcMuM1#}|G?&kk?^(lqp2@?o$;o~5$@X#B(CK&eb33*ku$oOmIDu4a?{JEt(RrJ*b-WK#HL*A<3YHy9dRrxNf-=TjiGJvhe z_2E+202=BO@^O&~{J7?iVix{`npX7X!c+?tk*QeHqankw7m!=>Omx_G%@)5oIOCk` z)&Rfz@lHd>1uZ*{cNRK_kGzp*l^ueGRG(RZJMo$tc+k|^29F~=L2A*G@-XkCz_GA* z>zipeXp^Ssy-?p=v6rXAz5vnfoITHIyCwjs$TNlzG4h|LBSlegh-c4IN`fK8NyJet zrBrdpCK9Jz4UI4bG`1~*Td1YI8(%qj`DX4FA3y;d--$9G!y!tbIxRKJaP1k_{dBgr zo0~P@BI@()-g0^(aXK!;wfjt2hyKkf?tNH{WuJBWYNI-U5BMW@cQ;`L0?0LJXv0D{ zaKx)mTiCd}uQ}1&xBFG0QzqM|mNfS@v@LJ^uY)U?x~KvE!chnH|@znkj`?ei(PT9L61}Fn)n^ z0C4ms~ov!Z^}L;{92P)85#Xn0D@9653X+S1Wk_T!lE zkizmC{3oz$2p7_0ncji9-!Xl+eKS~d)j7Av3e*IKVC?hN8jI;JGz&31jB_n?8h(x* z86Jk*b3&Pk)_&5ZqReDuC&*3EC><{4(eIbW>R+r;nboE)n!8*_!7=ckII!dJjvae; z?&Pi{9ROrkj=x>4%9A?;O5>WU11yYUm`lo!90$TAJl!@eb`(qP z)+<*u7aIA-$;UW{+&(x><{%qaXf3=wb-)cB!dGNgZxA2xJ*H)z%c1)n6sL(&{!Mr;gf>}5Lm2ZSf;gHG}$|Dn|Pi%B>6G2`J-$0yk6zpA zUL6eYI&)KhP5)Zo^4eWzp47Xku3n$Z%{|YY?}f05F8qYU^`4Y0F2|O%$@SX(BH!?hw01jHNG=QD(#kn;8FbnQ*5SWas;enFJLu@{qj zIws*)>h6rx)$7$TXYblRw0-@C3%Wdq_e3V=c{=MleDpRg*|B5&_6s%)_Gmwob3YpG zAkdaOajkT{Q;bSXww0XG0#q@)iT5ip^w{e?2dJ~;IUG*IY|gt>xK=j z_&Y-*W8X~AR;|gKgS-x$)H?s9ljgUczj+r{<_qk0vKPZ~bqi@vX`L!1HEnI8CB5DQ zd-*0@UTh5N4gqio0?FS`PahcWt#7V}5Y<~-=847v)|r8Yt?QebI%^w)Y|FyGmOG_? zs1+3Yj}6T;e3En(gVF#va(KsZ>6SLS9x8bUM?MhXzI?Tsh-)talLNO#}8^ z^<8otFCotNV&>#=orR_E(eKZ5p}_^5VLA3YkeY+X`vi8uAGdl)GYz-{5&P@_-#lTp z1GGp(Is9@q?ix>t-A#!9cAN?uIoY@R`nV&$FEYJ55;=&!9g#?1BqFLC8iwiu4S~A8 znMfqE8yUNISNF}(>}$`zfjQ%y0Z>5Gw+($f{$nxzI3rXHu?rk}IXq0WkV*GIl$jMf zho3s4eNu=HV*xb80^sTp=;*gVN6k&ja6}GuNc@j|m_gCwCh+%dzp|^Ne$UdAE(-*d z)fhN>r#N_Y&l63NsT}@^dQYvyd4bs7iN7_v z!XJ17fh)IP*5zH*(Yt5Y(%W-^qnEQvv3Y)@)!EoyRdb;)()P~k>)Wkob)7TNQ2EKIbsye^`tEyl?kzj2rKz0LR9B`7u|J z_W^$xDNY5rGYmd7lK_ourF6|nvH_?44fpj$cH^jmvwI^pZ=S{sVJ~IhOpU*KIHDI? z?DW^nU<`-R=ULDK%4&LL0QTvX+fH!i8CI}rqlVr+23_xPxyO`kboc>%Z?Lc#X_;0* z2a%tCd;4We+n=%z89uCIchi_)n{Pm`E^=)b9~B?eG${-yZRR@2MP_3|W7u|(zzV`6 zXSC@+3~k*S+qyN4EeAVyrgrQQJ9g~2jw!LNqKau(?i!{@%Z#!%lIB77Su8W%c_bE6|EaQ8$yAW zy70+~^r>jrN{=vn)2IQ*$>CY7tIN<;ySM_#t)VU2yv%*eUVLRS z-oSx{;5Mee9zixQ>wz`_2s#o)B8(y>etnr>T-8gh_Nn5X9%9GbF zl|jE>$m*KllKF$xRqHL)Iq<*t^pZsCUN_p8?SC979#-MXTxs%P!mo|Roq3%ouhWR+)m z^ZfbE%c|TSe@|1BXl`0!WwCoxd8@5R#NzRDT4rnj&Ko-gWe%Ri4|In<3Mp|hXvp@< zH}3x<{w~@mmTx?|PiqHj_HVrWkNCT2($Gn!_7x$4j!DX@z1g>en7Jl zXwe5iv)W)U#ZG*f;et4)91a(Pa3hXuH_j^T^(*3n*Gz}Ft!|zO*W8MG-e4CKN}L5( zXb6_EKJd$4Z29`Izuvm6rk2^F_E&VB&d7nb)eyp#47Hw5Cw{&Vz!ZnCoB6!I2xj7>^}`+XaF`ZujyT-V$^zoBzYZzB*AcA|9y!x*Z` z(0qNw`pjZ%QpC>0eh72(yPLn)+!heZ)6vtr^eo&wuxEbgN6z`{lwGOc+ctanIXFSy zA$^8DO!Ygkfet@M^zB864nr6$-Ob568qJB^-~xK@Lpc{H+UW>OWIz1lUS=*OCOhDS z^0r1yFU-t4jvUcv&*&{cu%_b_*WTWP{DC8*#4kvTLFIYMJCBNoD%LZE1F3p~xM|$B zX>G2n&yl1XFKk0pb<(b|s$bOS=XKJT!3lEa_ z0e(y0pkIN~2KIpR6Wz!8LTlhoU-G;qHEri5eb2KytpCft$g5J`=Oey5y{T6%@pdig z^4@7`uLjTD0iNmDQH<{Ij2?&qB}}ck1INoP0ggprEz+IvFs0AK+~@xw^cF6)ndy6e z^3Qwz3@;Iv;zZq04Ozm#ha?S$-fu(1)s0msMXngovXeA@={LuW^1 z4;rSo8*Ao*)5mSTv(}3=w#1H3w`T* zmTlU!>@R)WE?lh#LQzZifI;YmmVkRH}{ zVy&##Q#7h>hWO;_zUZRvznZ;ahu3yrdP(=01E=fzTCq2b`gE_>XZrMdic?+ZV7}YE z9`Hr*H4p}H(VlJq8U6&(+7ax!2ARE_W}x2o>( zzPin7d$qTxTGfXdt2(Q~b(Zo}*SM8c7xs54y&d#T`u9C$;V+{OT*&8{=M7oCK2cRA ze7*I(;l}DE)r}r0g!CYIf!_Wwtv8l}48ak%MyFt&r0WoP%MQ(3=ph5)1^yX%q0wnM z?)(_;#Sr%%&=(jS!G&Z8IW3_#Ipjg}x?$Ky=(jeqKP=n0O9I>0c$h1n9+D{>Z0C%N zcxcn6h5h{tBaubH;3GWscPGr)1E=G5gF~CT2CrVZc;T+dqPk^u59-r|Z`7yuqREhU z9l6rz@y>dR9?aDW%#sTpIZ$L8%izrbK4@z-p324zuGZoot!LOejeCwD*v|HK&)>7B ze>3(Og2>peEh2`{-es|4&mP|IbM%W$qjl3;=Jf2_ebjZ5ni3#HtDF*I=6*zQY@szb@Q94;KzCsNYt<;M&Lqdhx~XHGStq zhKGkEci>K~mb%V)ZS}98U%zctC~&Qq)N28c{%y_K5sr-j#?3$no8dUPz^k!OovJW7 z2y9fv80^H@tWLI~r3ZbqjgE;U^FuzhO`=-4)>Gw)F~p>pz#$l7jhd%3#aLI1*yeFl zaB_RrN*P0#2k?oQ@{!E>)EXhqVIpA6nJ>5YpX$}%O$$Mhy*%G~t&xi%DxxvC+@kvI z+SeVv^`!pS_xJ6*vcIoy9hRf4%ignYgW2}GXW7Pn(bs?ZuKvE0&s)20-P(6&*KNc% zN_ql(%3Pzdu%WmY@}ki0h}q+Mf7^!4jC~6U$I2y+NEbQ1FviIhaExJSI%tUDTybf~ zu}^ViaN)ZawLH)&yj5P$#bEOdSmM-xCy#y;Z#(+Ug##^z=6lrYqts^)ev7>RTMsk* z@Lv3Ko}4iujOcR;y1GgGAS&ZmpCzD==^<=l%`1M}g&2m{dd=CJM(fYnBE*(+>PI)7 zy#_v+o>RiFzh27gUmxBw-POJ7%yoTOZriu+%vIf8OS}4l!C+q(q()84`asJLL;vAw z_br6g#cwzIseZFOB)2mvmIyTg9s0;NS^w%8p*VfFFYKPYys0pr<7p_o^^$qRq4RrxI zU$%5E8XR1-c*SD`s6!2UgVRji4$+9U`;Co_J&V@QTVHolU(LtsLcs+-U(>u5)wQQr zTb(ua9lad^(SjbFIk@s}IN5P!)-V=;G~$6iQ{HrmUx{CVE``wVWz^1$!nd}E@+*Cy zUfhL)tw=b45cr}IML#wR2z}R`c~#-$0!Z+geW!G=%1d+usvvaW7bL zY3qz$2lbZOfZy%Dp|P)Tp>ltq^<-=oZVW7#AF8Sv8od<42OFMXK`g>pYR+#z4eM6Vh>3mXy7FD{sWMqdEPrM zo%-M*eIYxYdt5gQ4_om>p>xjGM+&`p`Lgz9_W!RgKV9excEpiU_-Z$EQ z+H2<~VDG|-vWjKd2ChY&1ihuNjNFL42ojF~L^+l1-~hi2T+|w{|tRH8l2a>}}W-9_pME2W)S~yw8fS>rrrlS9x)88N4BDJ$QhytsYzh z$;itYC=6V^X=Q%Z6{}Wx8X^NHZ{93UAGu)NJ3FrL5L*W#4W3oV%CFpXHL^a5JfCOX zBONzj@eO5fW9y?0o%4>-wXNu2_>f+VatNIQ$5w%}W7-}2`XF}5noV~*XLy?)4(ack z*?GXM@rO67w^!fBMjQJuv-V_uR5ylOmQE3qo50jdyf*H|Ptc)mPIp zNRJoV0$L5qu1!EV_Xl>ME|_Nk1xOrhTnrUPd&ZzCX~U3~XJG<@*3?+Ph!VJpgpW>vP9s#%BYyMB2A6a+@+08otBhVXH#gwnzJ@sqN7K@st-7N zoj&8}FpkE1)y5S9vW8f((FvT>yx6;9^X3)a#m&ANA0pk&D>tpwu~vO@5{^*9|Ck2Q zdD4PeTmD=^I`3#54(=_c90c&_G0FzzA#mEJ&iWn@!-e8fjeYheb8MUKXzR6>Sxa#q zP|vazXV;6hht7x}+M)5z+^}<6Q)frt;?~y1eI5Ocm-h9o|7-m8GMYr)(>^N&gorB; z_>c4tskp%CGwsXT+dGzZw0CU#%(nLSirAN#&XjiKp+tGi$e0cec&UH#R2#y6(LjQZ z8l$c4yY4eCsDXtu3kN6R7{iup!g$Ltw+bKT_!+*$@gohx%8G`PcGfT$a&9)m>i*>$ zVNV|JGmE{&Ri}JOHqRr|ZmC%eb@L4xuDSBq(B@g}ly8S5+>O2e%U!3yE(yJ$RxDh* zhP#jk^;RAo)!Tm&Z>l2_m;J$%T|{7#N=P3i#bkY_M=VwD2He%RRJ!Y4)8&y%@Rat` zPb9|wSO41Fp*g&uu72JEYg%8mD6WpI@Yl39bS?J>TI)sUazyHdi5>l(@u1^aJbf;} zAsm`BuhSjZceQc6xSreaamV*#uS3GRGkDgEKFe}D$KW9<*oU1xg514NUIxkz7UCLi zn4CQFr7sD+CYb{&;LOx;ZRVOQoi1>_8Q-=sQJZ5ah~Y|S?29sXTF`j6ZFHsCmd4lO za|og~q<&!goM*$Fl1{Yzh4S|VARb!etu+Cw=Cp>$(9+e-*Lzf;raI6#&=?S*CLHx1 zsBUVW`#fG6%giaavZ*={tZr&5EAAxW5cz;GitG-ba-Y^18LDf(&JsRfAmG~_^zynN z^Ve4j2EA`{Qu(aN;arw%TeP;ga2Hk+?w~9xN7^;hvw5d=bjI4b*#e2e3_f^tr?@B( z+p;AVsPb~Qyx*bw6MUi%YkMeTOJL?w(4kdWafx-ogFUowz+T5ayG9SBlDcrMa|auy zQ7b}#AAtPA#k>|B^hr!^-n?c(Z|{OoW7E9O_I?~$x3PV3WYwa1O_3hGuj%OC`M9q1 zz~KWAZGK(fhTcfSywLofwyxItrtQHEi~9Q)4Mv(m?T^N!`vy zdtE3kvD9>o>Ri@Xo)&A8braEM-XX3}O4SV|@!8pdBjQ4xPCGBLTi7&jL9f$DuKE$( z-3u1B)i*iK913n&xN_y90W=WZ>0QwNRkU)L4J_$%=2T3Nx4UP}+D5GOfmQ++7pyOI zG6;B~BE7y-Pd)nUt=Z1b?AGYEP)kF@wkVdccXc&IPd#<~l)=GMF1)tY<5s@bYqfmT z2l?o*zCS@9oV5^JBfC~eZxhcVz*8Sduom0W8@1WjJh|Jfd#JN5^bPLo<=Ls&?LeuSNMW$ zKCfT;7YSJ-tp!WHmh!rV!~w=iM5Jo8taf+yI!j#;8d26;Puc30V?7()a^3b@{0*Y3 zF<9@ms=aMN0ppRi7$+F`YJF~~vY@vg(Y-_v>wQP;Fwd9$xE+>|%fD-fm20W!x5Jhz zC<=DijqrQzFl1cuG$b!!`BCR?{F$(Tjr?{y%o9;&?XYrfckx_$mbYAOVy7L(iC^Ms zJM4i~?PHKnGOny^zbofTy2f1-t^#zE0knD*EZ-6A1sZ2-N7Qfd1oXVDr-HnRMawOl~|8 z8CbqDvLRC06eO%$Hn0qxMA3g%`!QYEsr#BoZ`sEPKE`IQ!oP^iwKI{+Co}2Ds^u$J ztwMZm&84APHg_zX_UVyYRvZ~ZDE|A$)#x1vj*gW5sBi032|Q2`DBZZb4`&_=zo-)M z&AGN>pW^9&i!(7PXG6B#h8CTR9mD5?Gj4~Zdm*^;PS3{U8O#^0q79^tI2;k3qDw3ki^O8lEqcTfu@v{(^of4440_B8 zu~MuO17c9D7DHlS|O`1uD#TIdjI8|&Fr-{?W8RATFmN;9SBescG ziF3ty;(T#|*e+fzE`+Uhr+AInC0;8o60Z{%i%Z0%A}V%^m>3bGA}$hQOpJ>OkraEd zz%C`GL|SA-R$L}>A}UVc#AA?_6K6nBYtiMz$S#XaIZ;$HDy@jmf> zaUXnN_lpmT2gHZOgRoOPBt9%Y0^j+^#K*-a#3#k4uz&qw@fq=m_^fzTd`^5`d_g=W zz6isQxEW2e7q{yYRSN6$%xlAsXE96SKN)E_D zxmpg%HFB+7C)djj@+7%Yo-8-X&2m_7k*CO0MC*LpclOK@x z%MZ#2p zR;wYkMy*xr)Oxi+ouoFZlhr1*Sq-Z#>J)XV+Nw@dr>is6nd&TcwmL^`Q?F9zs`J$O z>H@W0y;@zUcBq}|HENf7t-46PPF<`nQJ1Qy+O1-0M2+H{zJwZ6<7z@B)gCpeQff-2 zRYqmiWh$rgs-ULTUbRnMuJ)@d)a%ui>J93R>P>1!y;)tQu2$Emx2S8?Th(>ydUb<( zo4Qfmq;6JkSGTBJ)oto_^$vAF9aMLyJJmbYUFu!xZuM?;k9v=~SG`xgPrYB=r#_(W zS07Xls1K*!FREGf zCH1)avigeps`{Gxy84FtH}y^RE%k)@wt7;1M}1d)PkmqgyZV7Tte#T;p?;`-q<*Y^ zqMlYiRXvbj;eoHE=yR_QkG@8Esy23e3sv;vZ}2b3;r>y)|zL9tguyQ z)k7d_w3@7DtHqjcwOVaB@TuMEup(Bc)nzTT7U6uSZmY*yVlB0Ltv;(CHh|^U3Tvgc z${Mf+t<~0$wZ>X&t+Uo!8?2M8jn>K5CTp`bY;Cblu}-zNTBlj3TW45jT4z~jTjyBY ztXEm*TIX5kTNhZ{tyfzYT05+r)@!U?)@!Yctk+o=TbEduT2X7a6|+XHQ7djGtTAic zny`}A9&6G{SyNWp%2-+JGAn20t%5ae?X~t#f#x*7ep6*4wNbt(&Zyt+!jZShrfYS+`s7unt%Utvjqct#?{?S?{v$ zw%%>sW4*_^*Ltt@KI{F~ebxu8`>hXJ4_F_v9<&Zw4_P0!K4N{;`q*)KVAP$+{lvT7cd|&ok2qw$c&A-r!sq!iRx5xBp1u=kD^%tCp?nLOy-NRsp))j zv?iU{7tJM7iC8|752iDPXfh4CFOe@K;_hs0I-jW1ztPcTZZwsMjwMs6M7+Kt%^r!W zY$}HDVTksHb+F=Aq|_F`cN^zfs*bcPyiCCe^Jfi3~Q&5dJKQTQvmP+{ZlgVr}ow&RZ(4lNDu{W8S&U^CdOy-J&l`mwn z{`~YvAz4VF$N6crcRC%9=J^}gn~WziQG2|6IyM@cs&N7w-|D@Y)bvy$8qe%YJK?G6 zLZZq}M-jgroX)C!i4i#w59BksLUaV9lgduSys>1CO|G)1Ji2OSF*vx=@1zd-P0x_+ zga%jo?6jd8!doE&c)+On$C4w7Tr|EnXNNGWf#TpY;E$mJg^%`6-q%N!5A^qPph+j8}d%m(&29*OTkaT6AML;+K&A43z3<@1Sx-R5jE9R|#%jmP)asn18$*9>eTU z=YUW8V{AsSn4}wP0f;dfdLsF5wF#zTBZ-u61TddYSE3!kRyY??opPsccOuGaA!_ zM-VJU(q2%Ae2mRSOQIvwBO|FqU0K+nQ=W7Nt(bCWCx9~{elCWR(S6CWB)=4}TO8H- zHBO98ttRn_8jud;fqj$ckS^AkFJQt)fkH&k6s9f@Dwk-eNam+iRWTtg?u##HZTb!Enl$4Qn7KbO9jLEr0&suiNvIr zKd7xHj@k=}XdZE*%DyN7Dw9hV_SeKlM}Z*tZY(zyD39c;?HIYV&Am~k!4T&(x*Jd6 z%OpE{6Ll4-CM_@$D`05ZRbXv{69ew$#)&aw)2URAlgdc76Ui6iwN7|CJ(&h4@sFgY z6NOBsFi}?wVWQJ%3|b-{E~Ukjc_MDStXLk@2XF%rAJO(761Zq=x{xW4Q+NoL@Y`B?7JWPChP z$T!%yN7N`0lKS#ghmKSv<}w9MLTl}kPP{4)_7C9#y>13+C}1S>(foek(o{4a+aCum zOf}?_<7x0qHj#F(=<4W5EY~+TwK!uK6(dQZJEm;o+_Hus*B_G%NU58f$WgV^G{x3m zcWNx9L^&k2}i6Kjl zIz6M75hXXkG&w!f;@1cu1ynCyk(i#If+(0Mwmut!K<{+rvT4XhP9O77LY!CggLh8|ShZe$e$Ir`=iKd+HgOVq5Y<1i}Hl5aQ=WCK_n4Q79KphJ~ zCt{=}$UQnQo};uw2&}bJK!h>LnY2>^0usiC&8fCakZ(D4gZ&pWRZzLc6Vbx{Y@$Y! za9bqv>jueh zVatMPx7K5-48~IQgshO6j@Rg4Thgd9kvQI@GCCbEa#%>NjDkp1n~;{{?U$#snhA40 ziZ4){NJLGJXADRJbT*GDSVbB=W0H}R;vpl6KqJ@(CeI9r-H_M$Q{ruqm8Y^q|LS-m zKS|MQDmGf{gsBE+_T>?GxY0-kTCx=f3G-4thD1#TIS%xzwx3a|#gGqm$vP)sG*jJ^ zxoIQ@^>fN;auAx6IGqg_Q;ITLsSt!;s5zsPfnuQvs3En*SPpV$E?rZMLj(^NBU-%m zq+lh;WJBfwY=HumpxRz#r(kS?cF-Og&lIpEx8FSlB{vb!B5)L7mdhmLH71tS55N8; zzL-J`appb1d5pdnP)F+Q%O@bvLvr##TYvZfJF*6IDi(h)zt8RA)2$04~Wi03cvX7*WVTiCnGL+Bm^RM+{I} z29ZHC3Yoko7AIBrLw$r?8%q~ziy>2@DmD$%f!22ekezZG6Ueu#b<7}|Plw4NO(0!U zCJ?PEj|`MY2FoL>%OgYOku~L!wTNUOsYapwj6(uq;4tfi}qpNKK)}4nl2C z7odOYbTEuuF`R*HVCW7oYIGW6N&#iZLltTJprS!P0CO<3x5}`nR3e=RvVlQ^@KaOG zLYdLJLoSnwW}&kbny6J2W6?Me9Xz&>@Q>zzm#fx9*ZXv6Fgjo{U}8hj)h4huI%EP+ z;ms>!P@97Km7;bS&`~r3LUJr+Vve|0t@HA*apj=EBqm~LXgpDXT9UU&x@j`Yz+{sM zIsp)u@#w0`=s;~TH=Dv3t(p@b2o&>ShRgUs(|`ccRZd{Q2@HBnmJ?s?1cscz8Yi&U z39NGh>jQSZ>tU*x&Ij!nY#y*S?SmCYf3$q!YV0(yim90M_820Ge3hLw5eL0BZ_?%$ zvcm-=f#@d3U<@(2doi1YG^l*JL=}GX6Ivzkn;?MRXNS^I3zJzN#PN8N`~!hx8quWY z3tkgQd+}vWE%Y;8#fO1CAA%?Xr6kI=^ zT5#E4ix9+U;8r3}obn-_pH8Ru*Ow7OSYR@fv~M(yHP?>2ufhY?s)v>}<&<@eE!Z|ll z$l+BcG#VRA*k#asn1b^YO?FNO7Sc4x)F|c+8avz^x>9Hk5Nk|$j0`Sc&_;+cxr(#fNSR9LHU;wc{Vk4m4U_yd6(55hD zn9{sm52$Ry83i!gNf1Z-gYW`C(;MAy7X;L$oxWs~S6mUZE2fRx?g;o^fdm+Bs5LEv zi7Q zQit*KAv+2=GV4Y&MibSb;R!egh=;Xw5XGi}s{qnOdfJ~yUJ3}DsMo^^5gtZ+167bs zVZzOkt9SuP>_Itz=BCrymEklXKt5k=j#n#0Q!rQ;TWl*eHCJTdTY%__Z)M>Qa@tds z*y~I<$yXv#V1qpd(A}hGX$!woEgGsZKQMt8U_1j-+HhjUve|r<_G3XgggwOsITBiX zXq*$b8x$x@p3d4aP%=98AnE~RQ*P}nslo4FNNrJ4-hdO)q?gKDK2Z(vghB%RQ+X#0 z5g%+E3cs;k)s}*A9>5R5S*T(m!*QT^B1lH#%_Sg&5&wD+|d3jNT5x{ykC)3EP-ALAN29`(YUz)fUol zJfkg$NB}DXSx*&$l}UbM7l0U83ndT`7uyROMI$KYnsGRF_S-?S^q`}JLh^viMNLiR zE%r3%SQY_lAjl-?FszgsX6rV_PvE#?VdFIA03jd{leS7_s<0zd+DBwZv}ZK#g-MaR zQ_xYO&@W7ef*%9w6s)J{K>|kb{pryFe}F5-tXrdF*<1$Qn?ja0LQZF4mrc|ZU{xSo zkSYYoLABK-0qeSdF9iY;Id~yKA!ueP_~<5KLqnjz)ObL{U|fROS7<&a#Yi9V1r-_4 zy+NVl^b_W%f!y;ea#N5ch=UM`aBWM@Qmv&l5Xt=&HNXepRIKxgFZne*(2dtr3^@%49f_qU8}*6> z5F{AL(^1$y=^TfFwj$Y1#7cx%&d(p11yf_yI%JI7)r0Y<79KHE0pq1gjsO}8`)d)y zLIuz~IJ5w^jdS707|KWG6886*Q-Dn@#|j#ksZSP`%GFU z?FBMvgAz811|bzQ7%T-LoyWD6#^k_nQ%Ho$vW;!5?wAye zURfILXTVjM7byP2?F`mV9zC74DBJrS0UurhBk5zd=)QnJJr3E0a;SS`I+-Fz#yrG> zK&dp$#S`E@5LC#T;Zw35w6+RKS17~;3gh6j1wEVdWIY#~wW z1nlnk=vQXHVKM-j18*Y!nTTE>GKvVadREV30Vkp@OK|;yiDt7@^|9o^P!BrbEUq*N z6z$O@X<^aWlt`qwGv14xfgqa#ozh&ymf!)Z+pMxhqQN?4dFW+P;;y-H>FLtfY)F8Qn>4JK2- zP#;Ja20I?FvZUcAT5RcB!E+poUtT?1aOM_AYfxE zKW?J5#pZkO)~A8 z7|S$d*2?laBM)RMea^fw5uZwydSue_T2v@C0xKYLoRna(Qaxj3Q5v#qi@7wwKoTv+ zwNz%2?E3fuj9L#u8iQC#qXT(_bh;{JM%{%BJm;|c!)pv4Oq!|*ZQdAoNc@ow93m6qO1e^v z@@aK357JGM<_C%)Y77DN2=WZL0sJ00tnz|+2uKXHG*%;MCJ>W#G6s~+5iSMOHYBXy zOT%)5FdAu!&~-#{3z9UFNq9_QP<?0Q=1n-tb5?sF@v~7As%j#Ivf!=|HxD%XZ_{}smvL)6U z66+!*%q29R^J=Xa_FG3gwn&q0<%r^cwK3Z0WfMU=T!28ymg*IC_*|3?QD|}#m13fe9UqnBc79oqyG1lGQRv%(OdEp>KSTj#2DBemrc z>tR7)_a$htf}RZQ8Ql*fl{Z7bIz;6x)|GHY7#4Y;8T%kzr?H5UYa_ApjT#jxKoDSr z5rJx#ff$m5=L|l$ac$jX^&X?ARckMo7I1R35rYY5Qq_s+92Vg1pTf$5>T%9^I!`R9 zw@tMb$X{bqPR-Rrwq8n@hvgPSAGB9HVX7cW`*VhCzYRGU0`29t8w@Cuu28q#?*>QZ-spv`uJGfZ+_^YJ=lt-c7mW;z+&6aH#0?XV;9W~TixV(H`i#OhoG%l^UnAPsirreb zxt_!>u3_w2`iS@?_TOy9UY2{XN90B9!`Os<57%O^!4v8Qtk&tA*Ylj`@7}O?iFcECyLZfc zh4*If`@9c(zv+G2`+M(EU(na?TkhNBJJ)xyZ^Bpbz0r5Aybotb@Rs8i{I=rk)PO63 zU$!`)Q$qM%h`$hat_M+y`CW*2y2A2<=+lYbZ9y&dsJ9LO=IfCN>pJEkJtXhPxBj

zBF2UY~<*yK)hktFDhgLmLwR&b)BS$xY zcQ{k5yVLa(oPxpDEI^zkc%xApzQJ;w@gUwIbS^~AFQY{f{AV1iflQp9s4g zN4^(C8$0DoDDy8`Cf|oL|7wPQVz=aY%T#KQ8I$p0sBB7d#tz8sFq#$LWj zk7ucM1`-Kb9e~(B;(5Hjb2dWi^Joj<&p;TVwhN^Vj7=i-c)jj&EfCis&p-jj2jSva zxgs)E@m?MBJ2afLHNQX}dm6Ue#Bn3cbmFXyA6DcA&~DBT=}AOh3Eoj^3tHgRi2b!S zdK?L(4XA-QL)__hjUlJJjXcpK%s=^G$cdm1QX$R;C_q z+IZ_DVc6jm|ACxRpUT=Tp9621JFjh^SwFJV%_tCS8~GjCp?MLpCWyb{n2Kto6IPr) z5>p8`e*m{UW^UyKQcGh+ii7(U)%%cIYGorJj#TGkNIeFd<%@Q`rhWDZh#QgGrSXxR zl4FK?#o0(LwauYKd-Unth9cP|x+9qK+%(c-wfI@Db_UBKXhp<|ywyaW9s zMFzcfeH3xi&RTqLvHTt4z#o($Uk$mUh?gipw|W%udH4e9KA>A%uTS!9LLBXqzr{%w zPK)|=xE49{eapQ%@{hp->}`*vgR-8--=?rYZ1te4$2 z?k@K__qpy7_g?pP?z`L%xgT>s30dVg?w4>?!q3oiLO5gx^syT~;aG4k>d_xV$Lr8$ zj@d6TkE9#qCzK&NH6D^$5t9s#k!SqsxaEutIma98Dlu=)JDfFr zORuOsCWqfa8^pmA)Q0POPLSgh?>Iq@SKNMr9FMr|1UYVT>j`o!`6zO_Ff#_8OIX+` z?$qyaz6e9)--OJ1S6F=kIqaF?hkV-nRx~1~d_+kjyY+bgCvqz1!NzXUFz21(xQqHZ zIfim_er^W8a%SAoRyfjiNH70BXP^#kcn0Z}UuVlgq6xgEygcD)fe6e=CB(GIziaM9 z`I6jVfqoCCBk0r);2U|7BTql8xk)9(`XtgcM?={KIuw=*!6(A_*9w|Im<-FmA*BLK z#M?D@G0<&z+LcJDz;tm7xPdbspo;Ppa0Bx#%2MwH2k6jmG|2x!m^xbvu=Z1$Gf>uO zmVX6jFyGw?-taS=4zdm>Z`^>>Eq)ATdJ#@;*n^W39>6IEzr=|G5$LBEW2gO{*!lil zXsABy5Ff^_?aQ&3`XSK&XRN=u>)p%Ur@Jo&^}pGDKWP6`?%#Vno_5a~&opXCetBG6Sg`p)!S=-cf} z`7ZZe<-5^$(08xzL2*CMWg{P;yg*E(R6~wwBy4J`l-doAqn`RS%5$uF19U)Bq{Vnv z=oUJi)C1H@HUZ*UFCocjNBkNo{9J1G5K3xDK^`?sQeg4`r*_t3xXtZ=NyGhEOF8yc zv_rfH<%;wh^-$8Cr{|IKz3DNymwZs?wBnZ%0KuvO|hw2L&FW5gEO z?L^}hjSb{v18ZfCXS}p&9UydUAH`~c~I4Z>FZXDOcx!?`2W)8^X7C7Ug z-j5h<5yV6Gl{~_cXd~jah*75@Mjs<(s4pRp-{M$sPDrmfOCh9mtDE$@>M|JVNzC{XVI6k&3z=DZXc5 zi5Oyf7gldYo-+fKyGSefJ+UU|P!YCf6oxbIh;Ob(%hMY}s!k zG4w>-qw6Wb4c|d2@$O^NwM+rqVKv&yIxA_&XLS7rGYt(SUUrJ}kzN|Z zqNXZ7j&!G;5q%~lXFsegoo-}Ug9ipG-i-9)P&qXVK3KvE14Cig)kt+plj~_sTu@VF z?+7`Bbk0yjyb7tM782VDY46fCl*Wa%b-H*js#CAYBMo?q=DKEl2-h6H4 z7B?Q1(kz4nt{V9hJm>HQ^)94on8ACtTq@2(TB((WAHNA{rPdgV`c}=yIRgfoBjWu! z#q^r8e;Bt}_=;_-LMwdY!Lk$|QoQ1UvJ~E{;T8{-rD**{T!a)u&8P{G^1Kl#PKz{c z68AwuD5rSW+HsB^S}CWr#9*w3E$WLpMmr6q_s=56kuwl{m(H_iL>|>KN`inDagHrf z5K}*`!+JK9)M0HWl4*qPk(QU)E>wuaDterN7~vqm?*^XgAIZ zx&`O?JchG(o`<2o5$D=$!dWzNoF#J&wAlAqAG02_p0J*REb|-rX|#aUnxjE%Fj}Co zZq_1htblL%7p2(#PT7Z2BE)Urier@G}*-I8PLqFuh$F7q(T z{PVWA%C~?@lYRPf)bQr$XmNn!dNlq)wh4;S%JN2U2e*-txOfPSdnYT&(jWD68dsa)6LQb{9^8GEPsR)@G2yGM!4Bs09F zeOT%P74;BSXuk=IQ;<$brM6_GA4*4Ixd?Rom=PA&Ahpy7zCq}{PM2l7%sdh=7O49) zg2F0;La2#ykHvAhOploM$?vo%n~JM=V^*Q1EB z^^~_F%A-r#^Q83YpePd-mul(aB|{a zoMiYB@lBi;_&1#C*Ne0FcH*48t8lK}gRtB^iSy*1moGzi3qnTadHiNx2sMsmXC%@R z9pZdqq~*ua&hql46XY6%hVBwHh|eHpG2)cEsjsqTYC?oFLZ(|h{4Yvak~#tB%g8Q4 zgtZKaUu~ffpT%?THz-#)UwGu7=38iE@R;{G%Y;<6@5H&5cob#kej9U(p0>%0kw>mT zd?NKBRdBShrARZ{1?f?Rjwf@#6xM01kwzMV=BR3Px~b366kxfP`8nlDVKCC_Q%L8S zla53%E7YYRW6A4*8Kv}_u@Y3p@2Io_fzp*eb?6GoHIVpYlBE`HffN2AS2~ZQeMn z6z}jp1RKTE-j{q;uurV@9*}n^Pla%*q_D)>$myu z^FQqWhX05D=ln0>YRX{M{HjG&%f&K`7iW=uCj4*&IgW&5GTvq$8>`q zrX2G-al$fXNvAf$$BqBDysox6b(Qy_sM)yop_GyF4echCHy&?#XY4T-PiUy54raJA zX&hsu8r1*5(F7s)L~ZALfNepDD=$;tCUQd7vwTh&`V+MMNw~0 zsK<<|gI~wgqe3V_Uc;J5bIG|X=rl^uR#jPo6qet|NXTjA8~8R-lCkQNPcCMS;%j)@ zjFcHSY7Gv}U!)EoY#^0hBw}h%?(bX|_zx$|aL=>USnxAnWF`C<-X z)>!htj3*(5{iSz_^)zGbiTR!KZFmyu%$ReAjYnHcIpV8$r@Tish})c4Y`61RuaT~c zb~~K0&apMLW=@{qnwRp~wP#czx>@0XiH&bO9pZMaO6t4;+g;c;$ zIcOZ>3v&YVs$E}zL|E2;xeT*c zgduSuVns?Is9BZ9;BAl#`6m7DPa@3L0E)!-AtM@`{k#qVTU0GVw9ZjW>&JS`-LA`B zH@ohGR`mqdC%hYLUi~hdL7&CB^4GflOJf`L8OIt#KC_skr@o?Lnlgj& z9FUWOQ>#xSoz%x@tj4NBF7qcq6Vtd7hZ;QjMZ0RzspLPTS&MXkn&m9!-^fHvrIj({ z`aROPnu8LC-3Hv@L8~IyjF4Vp4UG7Aox(Sar=n9lh4C$wX;n>#Q=VYGTp#k7juXbU zEFif0#L!bhe8}}8;^w=CLp5t@oH=3jZiG4Gv^)&zFl~hq@dLXIsEGWc4(lFbeJ(wZ zkbKo0&~7O~G~ud+?YKGO7FhJY2H))~@J4pwj)AR^>*F}<{~Dav|32utkK$bYC&dpH zam?6fi!g$okakczLQ7OTxEsGl>x6+%jv4c5%ji~|gJbg@`+)I&bA?BF{krG4k%Kgv zd4V#0h;`nK9F75Ji**;*E{YhSft;4!9W(0GlIMvZVcy9Xj0VQJrUbfG<9)@~#g8$g zrljp{!!3rKLBlKYmTE)1%pWFp+xhl4)mITWwoJ}(t!uTNZ>W5|_z%R*7Yq#j5Lo8K zTjg@hpXPS7C0Pf#OGFGJzr05V@>xII-6~e;)|Gn9 z)cN?Q^%q5{>qOtb5qafbraWu+Sakuy>2;&p<;Wc8gBeHnPvVp23|d-MD`w zj#X`U!7h-{@X@X7A$K69(TIlkz`+6#2)l)ZVA#&L-$)n z3N_Bnrw&B83X3GhYHlw17+NnTHTA0;Il^nL7y<37cuRc^w1yaA@VON?*W3#&;qPJ* z?uto+GCYhsQI6s+l2hQvxfb_ud__Ksn=RU5&AAAx5O2dx4Bu4G;huwb+&!=pcLLmi z)A}E?erWv>YY-Q?H@Yu`Rp%P_-R@7hpK$-u{Wt8D==N;%Z1+rfuJqi3RVa^mp71>5 zdCBX8b!WME*n7Trw>RsZ@!o=UC?D~D9(yL9@;-}Q6R-FrE?jJsYeAKag^yah8Bt;{ zS7P#)qi$$8DMMIp0xXrvlm8eE)U10nSVEeB_vA?$pE#4O+w7WPeNI_wFr1-3;;+)m z$S;xul&y4>XJRf&UpAImQar=E%ojIQl;Ii{QaJMdB877Op;*SIStwzAV8xY?>K>h< z@di*uiQIU`$~j*eWeB6}1^FUpoRCOLL>$9vGkLBa(Q^CgoV6Wtuvmg)#8w)~swip8 zvnomybr;<)y<0$@T~UG~YI;l=K~r+n!4^3)QL2Ml0$MNEpj;`R<;c0IZ=eL)Se|R> zG%t<7-10H3^kHqSc$ajS?IKT{hwrXO3rlV0 zs#-#mmJ_7Wg-iYAd)&POX+pN+Jxz@Ir!pkIAzk0ITu8RIIZEZkU2cb^>$Ds)Av%HhL88# zIb0D|!N&k4&O5A+5KkQEh>(v3(L;^_@ujHgyPneTkdGLcF(b^DZ>gxw$fl$i5pf!F zSg*lfVxO6ZFl1nA$&8h^x>cTDOlQjo9X+Omka2sAB3#yq!aV> zDp5I%)Kcw)T3C$bP(>=o0$f>SkXnuh8pb78k(6p64TJqno>7r%TQ%i5kgQ8(Nj<}I zbw!$9pC$(?(l`_I<(rX4OeZyUtN_2&<+x&&5Yb7^O>zGLzhPjD(rByrO+`6vg%SU$ z>!Yp5%sorqj5J3srAHUKgm^}CPcvV722~GINU`dHS;nfj4E(eWBg)ak$ckU3)e;>umW~Et){)p0UOW#OjTnXA zh+pckZiQNmu#KnUS*R-O^W_+B0lN(=RzHthwtgvJ!M#^)xVLH}?w{HTFHj1S z!wl|%x()X|EyvgzYR6s>3pldII#0_2>C$3x1ZkWr&Sr^garO;%kV@Zv5zW11su7x?Urjadyq_%*!>NbL7|texXyW*J-Ag z`10lcBw<2!p(X>Ha z25dD{9{gG4Z2Tm=ZqQ*p%JOj=|3a=WA*4MQ@+O^z-pIWO5x%?RdC;~%gXN8QViz5D z5h>lC`M}`a@Z)~W^#j+-xLI;FZh1^&HTnJ6Q}i>ePpHT3foICyxU=sD+_m=*?#%lJ z?!o&8W`KN#HX!z@1hb?|q_Uh3jGFxVKP_33w!-qOD1YKQ?NO6o!&siUlpaZZlTdl0 z)=|rTQO^oTkW#d zmhsM(t-Fw4(Rs&hnfwIuD!*y8EZTVgfIM32%G*mQr0@AJx=u3f7UtWy{F{LnSSY*9BMrL<}1Ksqm#32NMmRx zT}Z)A-ytOqMJ&X~E-)Ja~VF@iWu3Lkd80~ldeO<;$M_`T+4 zPT%%xnCIIs1G4J?0pxtkal>ldb*1YTwGuPV-Wv-ce<|y-#q4v3dseUUPQksX@5B9~ zf5-aAbAe~~VCTjQxa)Bp?p3@7>mHv_FXGleu7J1__uS1|&$wOgh7y+^QH z<0VfR>mSbbq&(L_N1pXO?Rmvp?_G)24`a}c@A7`i`=s|b(1_>z2Cy^ZQk)@hgT40Q z$G#VQNB#5sUH;Ynt^N!Baeu*omH!t1J^lx={^4=|ll~uL1;iiyf3Nb$X7F=|e^Tz% zz9fti$B)oMosQ7Pr}mS}7HHr9`VC|E2Su0j|5xRUYvAPD?ed%p&L`Iv5ras1xh{ci z<1A1H!yK!1C{NnXlMOi2gi2!pAlEavPubMwP3k?!X9)+!489YKDpR%erqVEPEk_utN_N!%N6-BQjKT2MQui{#3J_GzyfuAjweqgAh#op*@|Dz z^Rc}sYn%KmN;y)D(S`|86?z`VFH@|GSZCyVBh9eioC8oyb+WGOU(B6atKqsB8eI%~; zBcBjM2r%@Kk}==Vd`8|jW%;G|&D=mwksn4qtj){|aj=YHyFP&2W4}%* zk~V=S^t%oxoC9O>I~6t0$yK!ZIQ=#nAfdsYNkw_v$t~*EdQ2j~i2IOxY^xmE;)BSg z49Y$l4+Uu%u@W3s{2kA^bjL_rAy=Iu|Kht`LB)A9oYkyjZIz!vE$q9IqbWBVOC2

>ZEe9(2a)H%nxT*EDQjsKd0mH@Uqd-)!=S}EB=(l&mFCXKxwJ)_I!pL# z>-plp?e|Q-nP0R>$y>|nbSN?LwFQ<)?!k4&wNn1%9^6t6A=Bu5A;~?s|EIBYkFl$$ z)&LkKaIKL7#!e&#oG@407hDZtN%_-k0jRcT>$dsb$}jCQm!c^7R)_l~RwdTy^W zp59D%XR@VO6`QH;shlZWDz65s9qpGePtd%6j0R6-(7%+RS!&r>7FD3pTJhvs(4Wx- zaV2R-zgsp;MH;*71j{%}>*^Or&juc_^*_$NA1yihgV#k#{$)XO=5M4J_isTuNA;(>r^jhVx_G;aHBQLw+~HX?iFBz*>y>gR%;9 z{ULuqZ!LS+zZl<=JPD`E$1-U#TJW57t9x6|Y0do8dQQ5}U#Mr+2Dy4)sw2tg_vzVo zIh+1>(MA<7hZo`#b9_=yjJBzf5@}sk+#xBkS2v)1Pv0S<(;`xxQX0OG>#T3G_S>bc zk5(5wk0-xDxWY!_AAFLj2^lSGJe-lr(W+*t8)w^jgpu$$wW6)Q}vY>6f|3_3PSiX$NUYdq^i~7wH`RBK3+%>-;Mk2{g{Au?5-7 zfUls-6!Fs7z$F~=YvHyPK~;^TSXS=8X}z=LpXoUET6c1ix0`%OC# z(PG3RqF&@Q|Ek`OG~SjKqrRpVS4aG&Xs>#(oH%rQ>ug|nD%OEUY>%|H^QT%duRZubPQDqGf*uQn0S z3nSG06|;N6+i#+$45y;Aqa`32LBy%ey~>v>uBgDsfO}3b?zTZ*5w9e=yIL}}+_txP zN)U7+lm#_U4d0P0LN2C^*>F~TM7k&A|_^P*hM z^V*l*=xJ29*yI?OtYvpYYzOCRrNaDJhHPQw&rj`4V!a@lVzU@4&W#c_(sejH$<>*~ zFQZ(=;=WEd<;<6)dD^|E(>C+vVL$H2!z9U;72%$+M`sGBPdY=tQU8E$LpVHnST`YT zkYD|)$#3XX!Kpo~dbagE+w%u`)Wh0uUNz+|oh5jA%HiH=I!Cay_j=uJu&Z~x_pQE0 z-^qQ8`quZ|rIQ1D`~K4RcK@{gllvF;ukF91|B?PZ{p0=r8t5OGJ#gy4;(@gTw+!4n z@WjC0f$@PiYQA=CZBA`|ZCP!7ZENk`+K+2{YA@IRUVE$FQ$MzTVtrnHLH*MDy87n& zw)*z^;~q^NbxJ7VB^Uy`6zyiVhtarMUn|&VT?_5VhY@&vEW;a(zSTdIgRA#D~<1l z)YFQE3-tezPaD^vj8&8LtT2@GkZL2fn4Rs6Vn5hyp(Esbd++PPQf+oaz($tE6KcE3 zs$Cv;+XHSXj*lY;*aF{!g)9RZ>il58-^#RF%Ib#3REh)rmW- z8WA=Ez8NwZF2_>BavF7ZLar^tyK%^q8XxNh=HNuu%IE@%6JBkEFRD&;OuSo^GRk=W z$5^L2Kg!U;(DaP3v`at9rc6>`R@kjNrAVtrh4ev>V^^5pe~s$E*X%f8&1U{8MQsAP za%JrRwup$)lUYBbT4Q*sbB#?RB#TINC0ksr%5>F1Px=mfe{C()`5kuBPnEO>16@wJ zX(Y|!J(ZX7Ug3hk33u$SR<4j*AgpuVOc@LH*dNq`R5p7a+%=V@iZ{s(v8;Wxe)WI6%w|}mvMN@S^!E>_Y)rM-?KN6$ zW#cJ3qKcPRyvg^-7b)WtsS)*;e^4d4#|~e~|4k*xV6d8K~4pzI;zF<4vyuVJ;Ind`tU_&Fi$i*;EcIM{rIhPx?3`5xKm ziMEOZg7U5QUJ~DZUr?w!+ddXed05c=HCB$AO}|o5xYnd`_QOJgGFHa3J z3Ubq$a2yuIeoAsQTp^2}S*BCm#Ui~EgR&jYhQCkm=GB9%sqSXImpIyO(mQLB?`E8$ zce5_cv;Mt&IK}{n&L}R>8(LymIWLWHZuIZyS2g?R0VmEA38G4CvLP<8aXe)$`vCq!=q_JwQ=KqxEYWt$2 z{vk;<)Acq3q-l&2gzF{Msu%(XF9~jZjYNWGuzW||*&T2^4`Q3mus+HJ!($tNoG&cn zk3NRNqvBYkE_4n~rT=|hFvEz+Wbu>lYrz;RX8{_1O5}Fd5xI))X!?%`)~1X&)^LMh z6)c8pOZDgx&-iOm3gmHX=6+BRv=!1S%8u~WScmmN)+uJ@xlg4%TE&sVvn>d%w06E% zoNX9n91WcU$nWgVH~l4gXVgdzc~gEs@9jQ&{IXadPZ60s%iSV=Z{gAr(MfXF*Wz=u zA^a*mrxsy@p4q36d~n|o&yq#i^sDtmjhTK(PuSCqaCIz|{0v_gCoB6bT&chMn!8P> zoIV!6Jf>`z#ma+P=Wh}XSS|o-Z`Oro=r>p3&@>T`gTg!b%(?uM@Zl%wvu(HjR^Nwi zhaGprG{uV_S60d?ikGwK!V8=6x&?l_rZs z-^GVPPnrIXc9G}2KAdD)7R$^y4oMcHyY5^1oBJRp&RR1Euq%5id{fW(O6&!)+Ysqi zHOx-FRZqEpFhNW`QE9OxmPLC>Pe5C{iQ(o_JG1=E!V}Mj8&$^KE$7K3mE~%Tcy1!j z-($YSqTtn0-dBq;yI&d6uesOV zVcoULw~UX_%kV?xzEyvWD48=mNMp0O7!zJe4G7> zu~Lv&SjDC%(IPDj`)R62Z{)$iwTc;d&QeEe6Be-ZM*Va_sKpIeSfpdhQA7*1a}z(R zcN-P-KdcN`w3z5f|KOk#^^RmuCrRAx(m82dA1qT=HG>^v_7I3>ErC zp>VfsBJ;tpW|3>iw5%;mvY0#!8tw7LDgJUv5%XZP_XY(BC*ixQ(NPk(OFBbXIj@m$ zLs_Bv)AjvhC3X8X?-N9WPEdYN>6Grjr*!R=o7owfq*{;YU->^;76-4ndsF=T>W}uN Hzx)3OGG_Ot literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.5e7382c63da0098d634a.ttf b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.5e7382c63da0098d634a.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7015564ad166a3e9d88c82f17829f0cc01ebe29a GIT binary patch literal 128180 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 ohyj3!`#ee%L;DTjx@8!5k5~VH0QmdE^#A|> literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.83bebaf37c09c7e1c3ee.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.83bebaf37c09c7e1c3ee.woff new file mode 100644 index 0000000000000000000000000000000000000000..b648a3eea2d16b6ce783906d6b7d5f251b9eb56c GIT binary patch literal 57620 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

wF7DI|Kx|V1sBQ9FYs>m5C)C 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 BJ$(QG literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7015564ad166a3e9d88c82f17829f0cc01ebe29a GIT binary patch literal 128180 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 ohyj3!`#ee%L;DTjx@8!5k5~VH0QmdE^#A|> literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.cff684e59ffb052d72cb.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.cff684e59ffb052d72cb.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 zcmV(qLaH4god-Bm<8i3y&NC1Rw>1dIum|RgzJoZ2Lrs zpu7QWyVk0GD*tRm1RDn#*n?jf3b-+JGsXb`o^K4<|9?_)Fopu#Ks7Vl-V09HrK0t1 z8~Zi}2F+TgDCMZDV{d4SjNq*5tBjvq-#O>6QvbMhde0G@=1>WT6AD?FYHu0ikega; z>#mApX-iw$(w6QH48JEw30FN{_sf5mTE?Y}D*r#_=EX+*uo1&#?f0LDsnA_;;~H3% zLxCTdVy;vtIwBs?ZoLX9$L7>X+VkW~9@$mBGp(v>Ob<@a910>RNex5OognF)o!ohs!So!2}}rZG)$IL^H=v$DKWnv|V>w-8hao zagH}G<;94Yj2XA;q^>=(%^d5(wx|WmmDKWTsi$hebmD*KGM53NIwPkx<@V<0<%C7b zQ3^@BU!oKcp8vnvoo~GfclBBJR-x#20u3VxJj}9%>0o@O93))a-xfrYnDq0!ZvFug z2s1C_1qdS{Adq{*5`qetJRqzDWxe|t4%kYf;$S)Id$m@mtr~kQIgrpbIo%ngDG9Rlp690_YS-ueT}jfMY{APPG@P%2ZPKjR9shqiV}7sVy`{ z0|v~by%6)`bN^R5>(}h9YWLPb5@~{z33et(!V?KjfUCMN+JyUgbh%bvyWiYeEilYv zi~`^ZS;_XKB%r!`_DxmpW=zm#clXua=#r zyBzKU6?hrq`2FqYh3EGz-A>NUzmpIT-6)K?&8GByd21|V|7bvg!|BpeQ1st7wQTh- zQdcdVvYfJt&avMWwy4fU>HOx+`yM_%esITg3*GE!fRiZVmevY}oC5z04;aqMhA1a; zL?6fzWl+*xE=q@(%PXC`>ngkGT$C>PuGS2 zZMmoLz0@IMc!&`)-1+7gPM72-eaBTw3Bd$mgjNV4gjN`nH#1**`<)+suX~vNnf1TB z?-~)&A|fJ6lqlsWCF0$$<@bLWLYYoFm#RV#0YwCT(`sH#fB6Slu3Fk^)pc*Gb)>IA zA-nI+4%<7Hwb-gv1XP@;u(M8*lcE1V4=X{;sOny%uTMRy_2PC! z7{p5Dv!l%*wV%8i(2MD6gJlN%4&434HC}YXtI+FlpM2Q4twt9{w4nYk-Ut6sX_!U( zf5p8!Pb^S%XdmFTu)gR}ULZPet=Kq%!{2oe>a8+P9c|k+c5U&T=RM7PKPX{+gg8WD zcvK@9+BEZA%{-(WIlKIIx9ZJzTCd^eDb97y@S?eA8A}MIL0DyBc>*xs@VLlRMZ$!V z*_w0VR}+_wyl`f46CWl~wnU<)8ZMIrq4CpItF2O_PJL~xq{TWP>h#qhIf|qKq5@Py zOf*ialDL3Mh$@ggs9p88P69INp;4&7&|YJ=&rEHqHF*oSItB5^TW5bbp6o(tNs-m%p#=hv(v3e?@xGt4L@*mnkUuN1rcwH9`shV5aEL7P2Qm0@9^aoCsw zXw0bi+yZXLdsnfDJzNC^5eL>TQI=m`1$~pl50)}o0j`}UaMwC-DDA5ZM2gtJv9`#F zEmGetQw|sTW>ag!tJvy=00=9g58EndtD<+y_eEf}SX1xjIGVj`iMKXRPy5W1U~3G^ zK4OeNuAEuF$*U%xo(=c5&?9-QZ@ScsXjc)?3YNPJJ>fl4(sS;}cGz$d$Bg)JSvi^a ziIc6L~Q{p3eaB%`>}#A@9Z*mFo8CfPSY^|77lWWN%)u*A;1STVU;>cpnu zg#4PI>d?IC=Hws;eZX{JR2G-x?XYB2chll@H7~lfYzJJf*Uer7RVb8gJ++DjE&!Kz z_LhqMui9$*((F6D+scmcfr4^bAjH$Xp|AI)_15ChduX}M3NNbF1(>g+1_CA(;B3!V-e!$D0dUfTrzVUEotZ~*77 z>|yGpeoF{UPMy^44)+;PQrG@$-5j5*y6yzAt|d*6PQpNrAcPW&z-~Uru8;d>X{2aj zbXZ3}*WZZK?O&mt_A3m6Vu!btFb(R(Z-odMIM z(19nDmri#pXLuC#A%lZqHMQG+q}94|-N&;sq;a~GPUoXiay~M}=Oa>dK0Jk0)~RTh zc$oqS%BYH^!pN`H%L`NlH*0*K$mqmhSi;1$=K|{J`-}xT*!zuo)f@*$Ri!9^HE|v? zTP4vdk5Xy}1F4tJ(GL(YvO3O3t8J~d;bUQT1&3$9Kb=Xk(a{~U{5UG?unZZUc}{gQQsqJ61_3;8oGz zvwSBh-0e7KY~}sLDgSns*y?FkAyix=GRR92d0OozDk{~fK8&zUarRT!-)PzJuIAaP zM6Z(7R7;LjRYW8z-l0?xP+|C<6`L&&hL&ADqkcPyxwG_ginOiU3u2(cUDMCBWtQNtVMIvbWf`JE}N2#&>_ zJX#qhD>w~f#fT)CcSGx13LX$S+8B;38K9WoT2s(I)941yT%WikbWo99ImmQBV ztE(#dY?UpBMvv@HP)Np)4g@^W5Ea0~LLIJs+nSY7eEL0gY}I}zJAS|0&G_W zU8kF!I2(?}NgFWyTcpJBfauVXI_%_>c)4u?!-d>pO=s~(@5Rx1A)_7DULSYbmP72$Zvs)fbSr%m**3Yt(l?H!! zu$CN_mimVx3RHE7Z=i+J)6vMAvgjO!ilJInGtnM^Fq8e0t6`KzBe1>bPDU_W$~aCR zDe*)y8pJ55dq?{KGKpcs+n0&dLm43QSt@4j)(`zog*BoqnO+?dQ7?dfS6jm_S8-Z; zeiYw@B;R-7XN+cjO5M9bji6Y5;?dE*q_e(gA7MI|LK!5dY{%FmCCN-Ci${#(~c;tbMD&yxPU;C8R}K8q zJ&wdifFbqb;e!DaOw-Y$X(xxc=ABVv|2C|f=D_{Hm+iVJb+$~05@+%B;Mt`$TRO?y z(P+~_G#kvN>9tU4Cr54RJRb*;2^FfF-{5dDXWT<}gXXGCn-TQikijC_u^yq!+8u-u z!NF(Ir3wplRSpV)zB7V#;*u^Mf&0332w=lhbRa&0@$B83+sYbK?5FQ*ok=#k=||Qm z2gZsJC(v1#rgZc z19f{^wZtKbAT59cyQ?ArtYY{P@NW2`%LCvz@%ki1M4e8xgg%6?$IIh>$`chl2kM@C z9SUic=t4ZUk39qBJfJ#&5?6jD+g|#8dZ6Qt5YH8V&6U-1>f?y#8LIUeyTc8~-(*&V z_Xch(({a1Q{u8Ocm^?=%G5R|5XsIeeWUp;ONWjEWFlCV)>JC&Rd${j;#*q@LzcmM^ z&+-gR6)90fgb(xOdH|QU9!%~QtRKMOTz*O;rOsp~w(Ye*QEH0tldl4bK7EI%UpmL5 z>|oM?RoYutouF2q8;1=#f_Kp*I0EiAutdUP>N(Edar6z<_2^itR<^RFGeq)@fAAw{ zjy4j-_!$BuvC$EqP7pkxWZ6$_Jpye`Jr$s+qb^eYfdtV7dG zCqa0s`U+IJ_r*1OUR=_oa_wd#2nmv_T##B2*ybQndTDe}mMVOqfD>LO?%23Qr=+W* zARrGSEg*=GWGs4t^*mq>*%E0-uU*(yzDfRZoT==)pNQQ&%Qy!HOIBNtk(+0kV%6i8 zW3r#wt9f*9x?2_b&cX^qQ9hgx6haH=A5jQ%kxDozvxTLGz(_SU0(_L|R8c|Wc~vIt zCBnhsc*Oy2c3sG&z}B*;_m-7L{Imu7Y88qg!s$TsNN#x$oq}{&X_S_JU#Q3zWb255 zyx6?fjw57$^Kwr8o-5i%2zV81-8A;IwGq7UKmQ7Qy-PplG13YvBF}1CwaW$#H%;D9 z|M8O|TkMDSBlX)8sCJyO!4~IBX!VzI>8b^)haoSpsi9&@tD^2Lh zjp;dMoTN7CY|BoV)KhiW9EotZuXA~1V6Z{j8MTN;_ym&(X5bPJctim|Y8yw4H=hkQ zoa+@aATev1c(O$tg?l`XTbiV?4}m$vG?mf!l+6a~vTm2rYd02+@b)Q^yx{`;GgK)f zbetX=D5(*%n*vAk-VV}CQZZDX|0t&P`fWrI?Jbq}5>#J<7)@RMp5BhoqO>1EfQ^^_ zEB0RMCVI{^M!X(U-1|)=E<5S8Q9mm_)-pJZyP+n6GW3FteIiS1~Uy`1(4k>UP4MK_f6xnc}9F!LN?3W zszgNPMSPo|C~*2T!lNOsvFxV-(csidQ9hNA;rMlgq0`~on?7nC*|hyVFqU-N{!trN zb=SKh8opbyJPiF&U80?10+Z-j&r$~Ah7aB`0{wLiE>Xu#ZyObtMcVe?7t&MiU(NMM zEvs4%^jb+kJA#Z+3p5&3K=b-a5Un-T+;7Y|#5{}!Xs_OBnDkjNvl?>%{~cC1oVtja5cJ> zvfF$UXfN6T%8n|(Q)=!EFuf(Zm7+e2Un_N4SV?6*lB2Mo3@35kY`jQh=Cu;fbd}}M z>cI*6$h2_gep`7^G-Ua8{LX*M(K95hi9VAvCvAw~Ir3q6Jn;yAV#d|vtf zKTA|RQr0~Byh1P2wE1n!vcZ0rJ@p|7Ukh8rqMXw_1|=I7$NQmWQLC%Kod8r;=+Eg# zj4603+$d62>wbpcJ2OFIpRmi(|At1y6Ch=` zWixz6#Up*Ry4F<~z6UPC4_h!Nic6jQHa}35l>Ny^r|}A0EdjuN1OF+g;!X$?)#eMf zv2i;%`g#17iyxX)ML!GlGsk9UJ@+FT;)qn#a~l*AE2rVo$s#oG8SV(9g~c&a9C8cQ z*0D$iAsICl!qIDIdGT0LLIcH&NN&Qu(O@0lS)zpiPx8P^zP0os7i7AjfP?D`N^F&H1`6~fV&Ya-zEdJ?xR%)rTtI_eQ!Y=>n{<>VB0>C`(xi1kup)<*g!{n7ztmjYOjo&h&;)MoHjZT^8w>!pEaJ3VkAbB;h# zAM~aTCUHHl))b}WX#k*Jy5x1rc1q?1Uy5lMGPoBhX!8}`2X3#nlYk_xkCM8z2lS}i z;kAxeiv=n{2(hrNm*|t3k9$s)8twAz=ea6RtFqlx@_19-I8kMY6LrfTzXlZ55HLdjAaym*Aj=%}JQ(7N zdQgnOkg$a9VUA*I+(=oQl}egbZ?PU>n$YB@yZgc6(eZ8XcwifV=~N&`r1qY_Su`!&wF9kjcN0wax&z1<&Joo z&relZLOg!Mag!nD4m~#`4S_U1@x7d%s3T@=pwBkCmg#7sEQnD$_StN0G7+1OIxLIj zL1m0wX6xFHs0$Vd4~oKheXxPioGi*qRxL-W4!?!Z$?`nl5lEBPb;9wp8wz>}<7iOG zRaXAc-`DabkCRG;_Q{A(3r_2SE_FUs-gQz_&p4)GaC0R$v; zHW#pB1a&xQY4*-=596p><>FFSBB%9o$VeRYW;wY8&`=ey_p2?^xv8h>5# ziS$0$L(h>iH1g7(Rr9!phk2T^D5!Ysv=JVFMiQhTmWT7FdoE^bg{`WrA-0?bCguCc z)+&pA%)jT$mfOQ(7gFT*egSH4h0|ZQQY9Lr!z&JT*a_Y7EBckGLe6UQe+jaEwypeu zDuDQMmNJi-z^bXy=v7d;5SP=;~;mYReD|mCa-PFO`W**hXnrDuM*9z=44a_wHrYwmCv;h zitB=~4JwR(%a+>iWj3Rle3r@5^r~TLr*-OXbErAanzU%(P|^MH<1kI7O9g=>yu%nW zgCXqo1=ZU0y`eMz83Ni9W(=;PkJ!; zhb?T9Ta3A#^SIV0afQW}M?3{Ew#k#l$v~b&yMZ9bc#O>Bq{9xS`zCZMd1F(~@;(?3 zVKk>|Y=5;cIXE;Z0^Y5HN%Y>wBOD5&_z_M9qv=fhBB=u3lP4{Ct^ottBbzSgCzIfC zfW+r2s34YTemf(+`c+S*;?6l+FEz1W< zNDp!E$-T0U0*_V&gX4 z=-L!+9~!B)F?q!>A-FPbHrH^p!MV9G_5;P*e=lDo+agKa!fn~vC5?Y^zu`r$(JO-$ zmQoWG^qR*d%$*=Tv&BJs2WD?Ymo4oE7k*`@O)B|yVQm)S$N0i9(%#t9Z9P=k&+cGD z@BL5iHsVt=*(vcvI0$Vpv=5_gbhO7lPrC={OLZJz2ze}MOC=#C$OT_G0hqXS5n!b2 znbLpsNsyBLrMJa`4z^;u07}7Unp=Vme+gOMp*qP+B74E86-sGtola0xF`6amcPREL zCW*U4I7Jj9DtX&=M84-(+av=t+jZTS_9+tx86GZ~+WSGAfm!P#Mzon3;r9ug8DG+% zO|1WI*de|r=HL1sWmLB#l6}pP^{a0(!3M|Ow^$*NgiN*&LFsP4{rKm|(g=;L?ZWSp zS$;v%5y7d(GKe40io^!jPlbIE0-@bx*u~ROUJD$@Q;E7`>~_3?#XLSs`K1k1qm># zdoR$x-ne2(rk_STcg1yAQj9e70T#Tm0yet%VBCBB<4|9pCMLfo*_YyuG>rb^T96V) zA;B6EWyyk84kglED?HAQif4q$V@c|R4eX3JnB!o!ao4=@GV2XGjfI;*rblgiZq2zK zJM3<#gfl(LTqkxh)nous7HvNtmNV=z&kBeIcP>Y+dkWk}9m9x}O&^-vlLYGfwZIlT zBFDn4o8to0Hq$BF%0Jpc!(a_^zUJ0$*{Rc{`qVl#s@u+XkzdSDNo7kYu3w`|*{9)| zWJ|+OlOrB_j2!92qR68W{;7vU4x+=e$(rLQiH@vICkPpw7Nd5}hrCnu8YbZxCD-~IWP+V_2@NeOsD;HUl1jS1$S>nc8y-M5d zq^x3o%BJCYL(@lBoOqNooY=7rJmjzw{{7wg2mkiR{^H;M@vr~ncP}31E8XHgUVQmI zz0xH&yZnkLZu8@w_qzA|5>I{NT|VKBp84M2_`!?cb834V`aGH5+4z_Bk18sl=D6NkS?9kh(F^T!w|)D@@6}#s8^LgHaVR87VGv zoiI2E&MaArAB~#P8fUrQKPsllRKMTV)ng;cEi9He8YH_KViME6C`T_rc{1&+7wao; zAY+b#0IoHEM;QdBA!im$Hv5?<>yObp=zt}E&1-X+qEc7}X@?H>IzN#umx=3V+C4bz znzd%Kh}I>@ZKWCKk-lQsL9%SghbSMU_sg^YS>q+8iQnv5dX&s{plBtaOj9CFO@Xu|?- zI^ydEBRye*MekXZpRrI6Y%_x259?fL4eAm`RGiK-hnACsKBjI$fUMmHoI%ZhW;X#D zkNl1>+lYO{TUZRB6e789#9Cw|sfE~pj_nnDNhoDgX_oVrlpqs*EP2U>o73UpfB2p! zPeA!O@UmZ-dd+qCaDW*wk$7bro*W;_bJ_e5cFQX#6J?R8#Cjj0ar#$&)?D63RpB1B7SDc7-^~ud0rNG zJg#Q4**a;xhYSf*ybNPp$MD3P``44bCs(^uie#SEinLjU38;mLnjD3(2b?%<60~j; z4krsIT{td)z1EGEc^2A8Kso;}xqx08yKGKQtEX5?ZnpFp zN$WmtXw7tMr#+_@a?APUPkCQkC%JuL*INu0@Gs}GS zz~WHW=|qzw3*eNxPY_s&oH~2=&;?vNK)71VB}~&Cm^e zkvUey1JZQbQ09`KjB7Wvp(=5G>yr@znJ*NzPHngivxy~=ecYT5!LgeW0sd%D?mKCV z7hGS#fxnb%XM}m+(VY;P2D?}>A;7&FB)-hfM@;liNfkNVk)Lmj1={Eq4fz22)WMFy zVnh1y$8BB#T3W}UCvT9HlHrT^=a)6Z15}lGFv}1dT=XWZkVy0si{*%1QZQRl4_~aj zm+h2x+z^C6Jm-_PSTs2oglg*b=)tZP(vpt!j;{nRR32-KC1M0CcByya@=0*w|Cw0tXGc(ypyyfDb&??i;x=3A&8EPcL z5)wYiMWLe=v9LK_$`nG$OZ7cA4Z(#lS2iJJEK06w`&%_D3Y@YjsS0R`XJbRL7Ck2M zH zur6XsRqqatNcGga1;{^^P5vee7SfpNAq&h~X}W;Ri;5A6O~zrANM|BMS+Im2@BP+D z%ZMYojQZl)*7$p@=x31u7TD>kSHTcX1fm$zL?TB71ZR;TBx>x$dlLQ^kn~fl?-aF! z`E8hMt$~wXyEy6RDaS(FBLG@!ng#^O84)odnPHcZ^_)!BI-*BRYOjKCP{%8YUnXL#(bEhEVjVocy0+$4giL%QWNz z#)fD@_-w19Iq3pIB84<`f3V-6S+I-Emy1vkS zed}i5k}mAseHYHBVpc%{1(;!(z37Z7N<+djmc&Afvu0nv+AjdaIOza@o&-|KB%6GS zA@rkSsrT&41-|ivJ@&?iOy&J^`8fPlo2$N{o~$1&`iq;}S-qy;hSfRd9n$|K4c}af zOF`DfED@PVX5m%q9-m^r`2Xx*=YK(+sg6<0)Ra0(9jT5`hpWR>S5ynC4^ymCHF^c)C{AK=P{n>mmEh{mh`is8199a%S zfSvFGyay|w18rzQ6B!4uGX942gqnz7i52+=tN=U}CS{NcEmW3eck3;9Mk3GH9KuP1!-`d} zx$CY=?z?ZcJuDOWGM>L&@Or#MdI7~7ctME7pOB;GAqC?f44C*QGhx0J5o3acny|+l z2S_hLbmHZ(bGiu$o)-hGjQ2Wn>h!U(O+zeeeG ziDKx%ycH?=7%cY*IOIjD1Eb_MNa5v-;KiYZx5kjc^2Yg+5;bChK7={3$*TvhCZE6y z?*5R>n^9si6CoY|O6s6l))<3=IW<1O#kc}!`5AC(WX^3(Wf&i#vP0_<6WahPQRnNH zz9#n;l&SX{N2vc(#W(M&VLSLhhmue#o-O7!X>2JaUN|B^pdN+Wmh7;qrK)r1a!t!d z%OnsWWA_40VNj`>U= z*{9D-O=LDvP0prTJVvwO+n8uGFxu1*_`1QxCC|UVTWe($8OWV-`C;tqOmJ3ct~3%S zwaUcb1o5*=qFfC-NAYB0Qx*m%&8c=iX7dXK}>+m=5jZ!RE}EoCX9FBMT*GXyiG} zy+^c&-{8TUY2`2gP{N-m(UnKtIY#18WRXM`U+*LI$a&7$m$*^S$f{&#)HcL>VuJ`q zDKEPqUPNsHBV5RVRINrM-3*^0I4~qHW@XKi^{z>UmJAK(^Jef!FDzx0{;qYKd*{Ei z**UiBlrp#v9PZ7$8to!xjNm?y z#=##A>CYm`E^Wp{dPD}vfc2P9hqDTfJjva+m;t!eKRpwvGCot!u2oUb2{n^1{3NNn z5HqtNYqoX8ZQ1FDt;FH_l~Xc^Qkm164d~i!`G#If!_k=PQyv*$mK~C*xkOWK$V+}B zorCnUWoP53UHoK_s!FL1+)?1>&fSMoVgP8BYY`x<6q+Uv?vpyPFV~}D?EK`@1|2Ts z;&V?2oWENNn+zr@D;X@@@bX)Vq@%gHT;m-xf~8l9h9_>5&_|@Tk@}qU7uIAD)IzZ&o1q-=^)TEI%%J9$*>f|0sH189)7Y>Jz zD!*4~@fIf3jABrks&;$>2nE_XOyp%P7X~=%4y;6=jr&uc)$!Wq7*n1?XPj-{-5MDg z5oCD8)sqKP+3+MpRG~h82sg6g@sKN!BFSB>3B;gsjAR$TP}IcO-%Zqt!(OX4!k)?` z-@=Ba6?hb)fqQYSzYz~BkxN?!5q7joL52-Jt#8(cdq-;B3_F3fDs8XJRqGHjR>c9U z|7v-l)LF^5Fjm<55S1Mc1N;?H#+jsPwPws3b3{cJ!Hr!+AZfu#sG_Z6hC{rCG91N+ z0yUQNuSui4@1m*?<(UzlOZJ53mW+7xvn_ln8tI0WqTzM)h*SjC*JqVPg*yYr%KQLk zJzRT6mY&L0y?cL>gDOt$HGZ~VKcct-o=uB@a>{y?u0|U=ew0-TM?+GQl?<^3Zt#0_ z7q?rBnXquJ5tY_i=Nc+^l56iEbe5>`9U+ld32*XRk+J1dfx?Y%wpqeg2{z`lSg23ex^!%#s?!GAnIq(Lw5*4Z7H^EPg4A;38F1p3J`y?kX~zJ;h>^kctt(g zvrrNZ=CyuxXIv>)rC-fngI)PqFpdxz#XP~cH-d_z@>&W@jkb``gAV3kXG=Dw=_vz9 zZ7jic4})4A!B7mDbMQqNW_;#;d3K4X^*XoPpRWl|pagH<#q)eQ6f>3?a-(E{c`L^@ zeTZJoC_Ax-cE`R)J%WN;JPVG3j=qu6?%2V>?74YwRxuGlfwYJsFx6WOK1OuW=HxIZ z!gCv{qA%KUC4<&Dr{1k$Wm@aeb97!3QQk6@v>S|xrXR=VJUDPZU?E8&JeG-MLVY_e zKJ=ilBfVh~5tBvViC%z(%+&J))`*(`v{c19;yP__*t_vFqMhg2R>?^w;F}}Mm!gcu zBmqX|gcqQ7xB^O{)Tq#rZwlmgZvJJrbp|T?!v{lN=)|ltVn?M*^q53^!-u9;Y{Tj- zvyy?zG0(c<0FR|t<=~aeDA9)GIsT`!^14{9S=KxvHlBLQM&{DLXEp%S{XqOv+ z3&?kYq6e?!aWDMkm*l~L90;MR#(?`~ag8ZHp}Rt~Vo*a7_t8#khfML8F6cCKVi|m} zx0%vHr^L{vo6HWE<1kGzft_#Bah@0h+IS8ARG#k1rb#AMvD7WO_&SjU-cWqBqGMYC zH#FWYxz)Q^Vb-lpV`}beCQQ&3=JVU z(QY<<(cxiaE%4v>o$`a8$}c}TD;}M0+h|Jx1d%TkoYp@Xz%5oj^_`cvI9DFPlAKeP z;ZC}0eD_VF94VFQp681>|0m~(C0C5Agop7Q36!t@tK$o42Uh5WR$xo<)BQMSAP@v3 zE!o^^A_aVM8FdN*oJK30!%oww1E2X&aJyzVesU_pwLMEZ$JUYE7h&qARSjfeh@6HD z_I*ysIBH~PK;H?G1WzV;j5U#vn8S2MC5%lbI^IJ$Tz^sY7(?luiIh*~} zRm8;18%=XpSC#xcUM85I>&>zcVdeQ{t`JqZk|UY~0YSpH*<54$w@;?xZaWR(2t##5 z?ST;km9Rm8$_>B-#Ol&++g+n<@d=X1o(&iG(SNq6y8fe;_Aw3uu z5?O*i+$1!Mg$x;_+3AkD-f&%WuO%X}XJI8EQxx4xAvR<|>+)eEi~VA)L}$VL&c5i; zbI4}n&~~|K4XboR>8OJN8YIazy$Z1Q0#6AVEikTKi;TTu^qZK+b2fw2`u3B4cn)`S z21dx%>I4^%-`cj`zqQy_8u(Rt8Z)Xvg@K~)ec+n6iR*i+NCuXNsZ6*)InxdXCgrq&r&U@x zHHgbWwKOuX3kBhIc#&x*B(jA`F-t+YCAqhb>}&5t^rD`JwQmE|@vj2aKD$FJoD1dZ`dF(VW+itjz$JeQo7^(R@P_JpSvJ`o)D{wmEp1IlR zb)hj(+qKnvH=(kCp-hxorT*Y#oafM#R1)RwFk}HXO$m8y$sVKp*&KhSdGg=AEEKUE z1um(aw;A=&t(jTR*q=Usqj5G0-k*M%%?I zRg!8Y+sTN?>xG!J7$ckV`1_tc9lM_OM-4!G1N7OhXypv%%DLd_M)F7b2-1vM4#$WR z)nIMS37clL-e@O4>NO%;YAX|7BM7E01D2?FBX*w1v7M-`BWwKRG_8hR6M<+OmG>i& zh+bNFDYm%WT_#t9%Jk34(PEUk!e+dYgEgTJu8Y;W(?%1zdpF$xr}j1;BFn`(sGRz~ z4$7ZSwL2Mq1M|SC_};n!ONYpgFqL#S;0HICtpT1$+m9}Z=&Ob4amp{RZHtc6t04wn z7YJW(@$|F!%yZd}mSaur{t|n02tC$VAVu!AKif<3%z38}HSBZ|K)Aru z7Le1aT%`)>$V+2Ds+FMKw~vsJ&;Mk&c^LKP&Qa)5_+oZ(v=gRw{d4e9~7gqC;o>5>LC%)%II@g0hACrYboe z>X))#ci5Kdja7A@P$EuZZE5P{O7IxwJV@7CZ>l2P@v6+yygk`<>71%glj?W>bjgDj zia}hL8*I~0`V{A%kUL71tQ+vR=h6*hF=_;X-SzZ#J8t(G^lil=fKWY|CFad6YYTk|p#z~PUi>8ZJSEEcKMTzgAb z%=|D(c8I4d%2}gb@N<}QpwnDtkeZ~PN)S}Y?l4o*ZO5`DRS7fpu|>z~CF9Swj)|+y zMjx;6?r2uw{%%(;*siEJ)n=W-;pXmVCR$9|^w3dfO7TxuA$OCOCiBlz%5{}v2n!(u ziVOt)-s+~3#KVJ1Qzxex;K{_elQ!wJCrO&2KRso-iH+370hb0qE}z+O`--3Oa|x( z*j)#W=!KI-pjP1Pqww1K5V74tt%&SuM!Z%ERhVX~LMVaWHsoSzvPgqsqI0w6bSj;r zZz+XT4yeSnqP`dUuDBGxZH-Iw5E#kXNcc+TDlqCBL37N?SzIqThjNSixD7KO6Phhv z53oUf-yTQDdHR`covILW_*5D^dqzFazS(m*GW3+?9+}rfq2&u5HXeo5)L!f*Fk_Yka%AAL;&p*AQ~$jy@wH?zO54wbo%8x^i-BH< z*mJ+_8IN}_g4R_u2>hH>xiW^;G-$@#;x!onYEg8|@Ls0&p>vEzt2^~N*ggk@$GXG(BJn1& z=XP*@7zrFr(@S`;on;e4Za%C8qJRPx93V8^<{0RJcpzPOl+K!RuZ5}03q=4ne14Vy zuAIFIbJdOaxDSd>$UjIUV)6v=pUPRBzrq-%Ua| z&2AS~m9tL6F}Xyfijs0G8nPqK6C9{=#g!#*b$M1k7^wj2rJPfFn=>%($zfiDcs;J9 z&6K@Fe6D<;_9iP-OD-XtT`6zY3?$c{9}a6}9wr5m0u~7dNwA_hIGivLwvb$BaDoMB zaE59j-H9Z<60bbE zYcVn*H`d~3+jrSLeSuA79mg^;)kv}-vvHzZ-tnxp+KPGkz~^kY^38dQQ}mzVpAfGv zz?X1r5iqu&fUk{<^DrQnBy=*fOQvr{n9LN9 zAjOD4f}j58N#?+D`UZFr3zmgI6{?nvFPL@#{=>OoV4;m(qAknxa9V8%4{*kIAf`Y! z2lq%BNabvRZfGB`Wu^5uT_r5=44biTBBPln_V>eNJ235W-}Rl@gfZG9Weog+#@T%e zb&u5U#3eM*gn0PxV@vf~J^cr#$UI1GgoE@k0pa{o5i&2?_4L|`AyB)b9s=o#>3A%8 z3Z)Kaqz{_yRI)sDjVyPXcxDsu8u!6ZQ+A2ZW-et+9a5zXG@30TTVoE)D?M#+Mn6Bk-B~xkM zx@jFEZ0oRNv~i@ES_R@!-f{p$(Rwg1!;J~u`52k;IRe^dh+lgS30B%5`wTL`t-p2bbGSGX$ zB1+;X${@sw*$q{Iq;uv0AbdzU_9&m0f*_0rgXoovy9kEfw<({7@oU;E;7O!j)jF#7 z@)*bQp{KEsEz=GItvK-n)(8P*OnQLd>PpJ(I{q9mKFIu*jR)nDl#kSFV)=lO`c9s| zLF^h?0Ri|xXG!JlP36X3NV0HxG+Yq@`N#@PP(c^t1g0Al%fjG7H5@zD(Tpk9Kyi+~ z;0v+|!6!7)m&j?Sb}0ZrkWBe`6+IHf zN485}Zm4hAtrri>28&MoEC2lHzXh`~yj;2-q+y5XKMZ6T_;=XCOvg>)&z@Tb@^LR& z$U*=5a&!A;;mS;*E$L2xMB$szLPOy_ELHv~t>4h+ULMuCS08dZYp1hvhx;p4Xh}pM zSsKQH^wClcK3XrvH=-X5$x!yyN8@?h+)PAuW^th{9BFHr7y8%=&wpFCC{Fj5XtYI^06aj$ zzan1`;>^_y)=1*DB>dWaC|O6-Itf(SfJooDW|Eg#BN+Cs6S49v4FphO5&19_G6QfJ}Uo?Ae)un^!B&l4r3j zCI2R5GITlXY{{|{R%&5sPJi>V7Ej;xC&xp^x}oz28skSFi2LVuxOucbW9x7+(_~yT zt`3a_k{q>g7|$6E|I+^V&oQi5rA4!dy!qsW6YN_|gXL7fm6nmM9|D(bx09dr>4g12 zJTVq^?RjeG;Eb%EKr~ArVXO=vYWhF;JqiaIl4y?zp0)VZ)Okd0(BW&IAuiYe7K%(A zlkgOI?QfFQ#R{p5*^-YjNao(0YR~>7r#^W*-}$=w>k>pSy8S zB`+13in3N6J5CA&TA&*Wt(somOfuw(ybe6i8TQ*$ha9v16nt&oJiH7i7|4>jnYE_9 zcV!4_gy6YXh*dLjLo(D0g7rC+>*nD9Jvaen^F&JifTmWXtH!zhg)(GSh#s#hQ(p*Y z2dIyhR}W^r3>(xN<1UgH9!KW`Y^-s9P7hR;l#TS7*y|h_7$Vb_F(Ep+BVdbUCVJtu zS))e=Lh0{!HPqLMCsx%>FtVidm7)_HoGAKeWeI2}%1s9jBasgA(}w_Rr~3vLA6{q+ zp&8RE2@Aa>&pDb<5UBz+v6*Or5pCej6GQQ8c1yO15%`U^NEi@O&d~bieFzBZC=v|+ znk2$Pq^xyR4_khMheN8(mU8r){Hi+-UQ80`R41Ceo*0(|l@N6eDxwC?@4iU7F|tRA z>c}oor4=&57YNz9YdsH3Zsw12rGeOT(E7RRsVX+1;UpXChZI*}Xm<1@8y zpYgXx_?1gLlwC8`lU%>`(s=UVF(W#40Y9TUlcbH>HSL5KlZ}Vy;cBT4kbRP?KLC}X zUfS*ZY3*3R&r0&`D9xQ0cfod( z(iOs>BLNGGySU$w#l)!~u8C(MJjVv8ps^!Wu8rgg=gcTQOa#aP_fh`KaIjhgXpl$d zJz}c3Nz>^O0|Ev~NwCa53ecOxWpaEs(%Rej?k7=&bm_bV3bt*gt*wYOJe+)rIA!KY z5MJnT`cG=$Pw5Cfm&Eua;(#S&amkVeR5**`dgrai_u+9eE76Ikk=N2%A37@J26vJw74snDcfdts?q@V8A&H?Oqf8s)0LJx=jdRr#VcaTyNu9x668<{?~i~+Kj4Jw=2GrRs`U(k!L zleTfgC4t2+z0tSnE8;Qp;ICVcAA(lzFaMyyQ%_vs`uULHBsxe1)ou|hs5q6cMBStz zux5R2nk5b*7Q%#+mNnrwFKM4`KL(6(dAp?_F{hIq;jPibe;+z7e69C-Nf$yge%Gx!Q;4oR+i6z9IO56#jYmJg~w!tXYOtAhn>- zS~j85N})+EoZrsj~8n$!+DDDJVAePvNww!1=AaL_k2Pv ziCd~QAoOL^6VYZ&vLjAs!2Ad>GWpciq>L)a9q-K`f?{iv)A$lwgtA7Fg^t3gMHkp8 zo_rj0GHzWf&4)UH9(HTMdWsP6Kr<)B-fV5P`l+;xWTmbVHgQD)t~Xd%Jfk^7m9XG; zG~I$i8WzJu0zTgf@Iu+$OhbZ4XeQNsFA-%m4U$BWWwyyeEGBoqp_yH}%<8NQ-)gCS zqLQ>B+srDU?rcQl1PJY>FiglXg5H!SH}nz>2N`NdX|6mh?NXl?Ff0VyW_ zdsP)rXV#Lb^lkcd9wBG7$*du7^k?4>YJ6Uc=~|1C^{T6hc3q5lf~I3e-s$4-m!|6h zI71nqgkIgij-CHl=OR-pqXUs|uR)D1d7Eg(Cb&iYu_^AmcYJhmYK%Vh@F4q08=pft8G&9YAcV|wiaBHc6l?^rmVX@T)B<|6>cmKOLf zhcGBj4&yf4w{1u8K`_nrgnX3WBX*x{ui|s+@nqN+(pno=?76u($(Wl9CT7r4VL=2t zs{YzB$W3iP;E(W%Gmu?Ob0>_Y{XFlZ z0lKTm64t#Ff&hZ$r}WzlGCvD!_YtIEsK29(8UG^ihwx_jrs&)MUxQLc$)G!v76Mgr zO_40r!46|^rebORQr|qkIuDa1`*xM>IHuj(sgG{|_Ff+8jpFK-mx)wR4`rMU@{ z-TEZ_g1q+}o3-WWsP~W;3uc4(!cC+}B0khoPm!l!8HuP4W(<3z&%vt0-!50B;pd@; zY7ih4z%E>5VD!-W)9^zbm+*Ew4(!zI8(8ZiwMU8-jxKY%QvG)F6DWW8zPCu|K6MpM zqNnw@M=@K&{_^Gzwb)Z8GSp*%am3gxnPH7i;BDZMLQg)bk$uk%sM$zngm9)=s~d8C zCTh50uGtAIopRtn`#zG3J)|#GgABsTyne3NQVk3H#SSB`O?x9rIe?R^U`}?d|}2o z!`pipFNdbr4xDfaL1lw;W^Hmqj_JAs)4Y6BYpCMfJ>JbM64gpmgk+It~1 zv~c!&P>U#U8jgWw#i?+FyuxOPvh0(X^(VaFan}=qxv>gWB?HQeHzn8dL)5U_mgK8| zb}!WW7uIvQ?j)MEgPJyV+TJvc#W!(ruza1@3S^ZS$O}#b z>C2in`#NyTPg*RQ;*nxDuBxJ0tD-Dt%7Uf@FsHERTB`?nMxN8BLp5QD+x!NBxI#?3 z&3Y{ol#?eP6wvj|?$ZV&^pik#Hye9qkY^^RmIz~GxgO1hgQLAe$n9L0T_j(Ac~6&} zR$IPl(9LhTHh|m-LEu!tW+13R3n6p7ApuRZRliSazh1XiR{f{xq2i=qx@0AeRo(hZ z3e!N%pYN1;Ux{~9PM9De0?N=&wrXH`CY*y0MTvUQmOVSd?y>(RGJ>JyeL@btxn*Hg$DY&;|YGl;?IA+Vu6z{6{bmriLYpTh& zA2wJIeMEMRmzp1_<%>15uXkzZ=ee)`6$#yIz>cgkdGef{pXzx5nYxW% zV3RvGWeOYvHV_SCkS+0+@ZS3`?B-AN#M7?b$xL?_uN^H1zl7}O&t=~1K?D8TUV?bT zRf6>8V-g>2H*T98y&c8w%gI!lD{JJy8C1J4ohfyQVKM5|yXsJLO2(!3x0tRjCK@fW zA0F>_$=E&{Y3@YPkRPH+F>Wj;DSRi7O zwXEip1<7`=t1OOUQ6@t8#*r5yC`RMlX%Juq;!>dF3Hpt zGtN%>p$E!KcaxKv@x14M2d{i*dT4(}0_%scN+o=DmH7)D^XON}c<`;f(AADu+2Ij3 z8{V0glW%XaZCiqW0@$2^*q@rv`ECfm9463B2amlMrK5mM9%$Fhx9OpMAMoV|-Z#;- zVO3|nS0$lkYn%RZl&+G`HIm=vFTi0V>lFec8L@?JO5=`(GEKWm(mleOMSU&@?XMGG z&y>7(j7+17KDs!|O%5HEy@IjiIfX|3SCc?0r11<3W*H;PtaIh1&PyP_{-}mOzVJ;r zgq*@`{8zFL(q!t%pH9QH**M$W8F}xB0)Wl<>C{j}we!B55Hjj;nGlff>0--%)UlnA~G!b_e2Kfo7%a8u8|?? z^~Q(;nyv&wR$auw3zQR89i>c)p*n|ux&*25vsEThVuT2LB}(cZEoyGcO~yg!abO<9 z_u7vT#eF>G&b$n*u8@WsOUZc|Sv!3Btw%&SD!=I!5w3^)=2+=RNvKZ=5PiK|wQ$tb ztHZBE{XQb5T^FZr+8L94uvFm14h|I$NTE!+@q1f@i0!!-vyh>qos!)V!n(_MFz;NC z2UWGE>o=KHE6S)#N6*dwo;VD{5*eLU1GDR4VEpOpK-iMU#h_3NcqpejT+jHzZOac5 z@(c8XDl83>9+Dd`f4mvfeb4KP@i<~>M2{22o1j#^10yYBW{iF^8XX{Ck^v3OcnOtI zqk3~Y_m@(|vsuzHp9CtwKu1&Nb2q-Vzt3XCgPzgRMfbzGG*_rP>U1Vwk5b?Js`oYf zAjmd?3D&gJex~jZauZo-FE*Nr?qW()sV&h2=Y~kLxge9U2_nS~_NFF!jHo1Q9}UZP zRB?kf9t{I%aqzrYeM^C4st=eiu7;HpWwy)hu~=1sal%Fud)(!0!=i$jSYj}61XZa% zgVu!$mAxJs+HE{&5^^I^$z7zjRk8ipGE*qLA)1&0-9W5jiC-KQIAr6T6I&5yjcwY8 zrknqn3*PIhWS{2ed&l<-Aa~@45xVm+W*gi;>=btK#Pi>j?JH3n z90h9x;HLQ+S|4S01Yt5ydrteAETBBrwkI%)lZezeiT^M{whhxt`g)4MBkNmG-~x26 z$FC8hskrOX86gW&cN0A|-J#a#etBGV@`3R?t*p+|?;Zn9wPOqWO^(6kEIF4!+y(~q zTh7*nPpmG85*gR}xGOoilAI;++>py|<4#k;-E|=x!5!5Ecs`WDB(e`)6a^KK4Z?(x zi=>iEL0nDaPHHvkdDKo->2gf|Q|v3=@IqzD3F=juZUp&!cRp;zXj9N{&f;xjveyj} z)wf6JMdRg(FHga{3vUe@FIxjgPsiUF(*9q{-7KRI488qa4 zKsEIb$Lqx-l5oeULf6CQs>$e3s*zVFG*7qfA*%YT#I05XVH2<}Z}S|3?bATTM|q;j zjddfqz>F<$X2o+?24*f7*c51GqQ=Ol^Q3XOq=u#%T|&$RYH$gt36(@WC;-5ix>2O6 z3D!)EOD)A%Z5Vd(Z=MHxG)Zvu81YV8o>l$bqyD*8qyjc!s0DpOmC7;@f|2^7PS)iu zcxZJiDm|%b%3=ItXP`QenJ+O?n*-|5CCBuTv;c?yX}4K(mPNCIEwO6f-i4s=n!PTl z5UuTiEU3HGOP;INlD}W}NH$tz`g~Xq>4Cd_;!yTZFQrd;MKcZxmS?5Z_a zsFADQQqk|KsFzp7n0{qdze7Bx+p1bzdCv)14VVdDAz`yd6VnK=)w2N>+s8N>|x$=^aH`%R*7hN3mNyco5$ zbY5)tKWOl5{>;<%0Ld>T1Detp9(b?w?w1kug(Uz5I7s=Us zNZc$xRC0tIrU&T<29ZtXBDRL%8PP%|9y;~sJxE2-sPTEsE1#uE@w|LVrDz(5@j+5w zR1e#V#4;eLCq$P(_Q}JfOz;JQ1@N4!mB4*Hz(H11v4(x~x}MkYxA5L`{{D)>Wmk1C zl?doC>`f`Kgf($NH@q!;07)dvKOv5r;pfeHqYduV@|I0HQ3zzUK9yByawTWG?LHMY zm%XBtJD)ql`1LY8}uMSt1DTI21lAtuC{@H-^Q8I3!amqt+ej#YCt_$ zbbO}E|B^5CI=#GY$_6g<@f+N|7h(PcVgle zhIgozn@ax;?LY{@UpF_DZ7R19j2rLac9;4v#B{En_)aa1Gt4SToS9^@7Fxt=VTx_l zvLnMjouF}3VQzfJUg7^_hSdC=g>|0qj{@rgZL=&2fEjg&X6}gPg^12wQ6@|}Ry@~9 z5`0$yQ;u%5+7oYRFIfYC8df1-)SA1ndA?NoMt&cuIu$kLFtgt~zL=t2Z7X({tz+6~ zkRCgfX|J``_4K!AzHt`58Y|vY?XBrk!Q_XdeY2~5jXB@2_Yqg9{E5T5zwT?6#ZyTw2 ziHen(2^$xO-}UI>a2n?F<5Kav^}>~r<(YNqUjie#UlS8}u5qT;GQBc8oH5=-ePR&jD) zq|+@cwyms-s;7^YfxMZ;I0qV<^H7=(BNvdo<*yKYW}Rz&EUVw-CaR60*49%SaphlW zxU$t5lK8K9Y)i`a`Gnr+&mjHnAs-A*smu)fn04EaQuADpZwudkQg^a;7LQi2)JLvr!l!Jr!}x(KGR6 zk|(8_7A)9)espRwGh4_NXS4Ytg}Bo|I--HY;vfS_d;>zZL>a#UGI&jZA6BrD{Y39J zY_}#Fn*Cp$iDI0~)Jw=jdON*zrq!7!)F!hHK&NAFoV!u{9Lyj0m&Nyuyg94>vvs3G z)@*aXM5FE(m2b5RzVb8|Kp43a{?|hxhZhzEB+TDW$TfNCTl;(82}hg?(Ko(^i|+zk z4%!}edeyN?Zq22=_#4s=#^2Skfu$errQXgVMczJRJDq4L{*9PbwXVb_Ts!%ippADM z*-UMb+ZPIhQLe~qlbLijpXH;uNt|S72Qssn996FY&Px|o8B>M8(XZ-|GjqVz|0wIv zcye$8>xZ-FM)nY8DWhkn`R=E%IaA6IXY2r@q*odZ&TYd8tmCVQ;r~e}b>eZZ$6Hu> zUuD>hyvo)R z@;cW6XyByP2OrK6mNtK!GEkGvg~W<~n2SVSc?UZfC(mu;2A#B!p#V1e8mjTfk?xT@}O_t zc7nEcNEq_BxBLA;sN~NtldDSM#|qtDoewK_T^>0-;x(DxqTl&npPo zGsxd9AbnlctxHAUa#}_SQT$Z{6CqQas0RX^0@=L{3N( zd^i_Tn;z~c({HB-cAkXSPIk-b&c^c}sX80Zi#-4$D5W@H z4|cPd!)Vb2ZTXqsIp<73(P*YVVozo39jAPxpwM*B@=D5~mH%qqTHDmrI6?|Muv)Q( zT;&(B>=MgbFnWAe;=%6uw}-uZ#q#o|;DA}uDZA-kKHuR+g$0}?Rx3wciE7_)+c_Z1 z^;W(zBc(k(;%x1>?nq}_+lh`rp?9-?_UZhhbvJcPWYbntZp(kfTFJ8foEk8% zJjKRTmWkBeY-)YanFWobHRqP-)Vl)X95*Mok{e{{s~ti0!=lhOw+nkXuHbnIDEWJl zgg!~|;EF?F|~Ud1XcPhGmZ_E4#a^_-l+Su$ZkB**c`hEcj3XVo1C9VsnMF{-{$Oaz|R685$kF z;x@7CZPu>n$RH{xD4aibL5k29LjraMM7**mIwU4AC@9c$Shi}pgo4`Y=6?s?8yHGK zzcUX@Ws#%KdlVTBza8xgkVUS~k6s}Q3=B{Q1OahTfrEiTIQoOV z`=3>>yZ{sZ1A%`j(NB1D8DvZL%f6UiD;RC-pBK>qV-y-{QU;P8qik5jHrW^jrBh_! zGjtRcWf9akUa8h){z1QjSJTz(^Xxc%kD#>Z%}U4>nxmG4xl|f;$H2vY zBfeWk7SotrL{`+#Vk?Fk@2@*wcYznEDGGYWZ$E`*v4}n2$qX+d5#Z%ss~FtUd#W}J z(^2>6HfEQy_uWX|2zidYtbiy({(RVmnF%FZ;FBW(@oe+wg1a^V^QH&<(@tuP;yCV< zBp(v{HUeXK4s%e*_)8oe?S96HXe1)C*nJ5>RZfQc95XX$e_9u@~zh+CHz3wSde7zZ{N|EuABWP#q)bReLAQ2`=o& zwQrpf82+YL~3idhN9O^kKVlyRi*+@ZZ~@9&K<89 ze+U*pyXkBh<9Y9%-6MQRb(L4_1r|B4%VoEBVW$&!4G#l9J{CuDb^(E*Z{G{(Y)=o2 z*(V5aR0%*9+lYDW#5N3xvG>|J%(B9zlpMyG72TviMF>SrighUb->@l0Fy`wDaHNi_ zPBKwhociG3GiP`0_Ho^3!HGEx$5n715xetcZ`hRU8+*GrO#7hQe-H*_MIm$+Gi zHCh?0(Tp%Gd&5k_^c(=Gdie=tw>zJ$2?pfZXz%*;_3O*Pf7i;7eD z;OmUe_aQ>XVeDO0$#uBm+?W4}8ET+#JLBhwwj6$39Ya+jBCX%-`_~NanH_y4)H7Ay z8tDxD>A(M_CQ`jE;h&q^3l%**;;GXCxzrT3jJj8zH))zfsp*ERk%ie=>-$XMtGkNK zuU%dY!sWi?wJiq@w5DC)Ssqb`ij-D zU%fQ_(;!PHHK)}#rzO!-{&9hIy|=w{(S2$m$QV%&fZh$e^{1Z{KmQC=S1D+_6caxf_Oxx@@E3#aA*K0|T5V;|?qkZ2ZJTvjqh!E8=2H zONVTOtHRJeRPigiq@5-l4RM4frmYPigI4~6&RQ~m^l&L%@W~XAO|7(|v zA9NO_f|r~1z-!Wc7u5kl44%6n!Ywg6LB|t~NMSCx|IGkD@CQkcQsei=(u{Of?Wt8k zeL>5l_pdEAo;Mf%5P$(ey+LcvTg>OrgJ{vp5x-mP7yI4AmObkNsUvmSTcZ@)XNY4j z!H}e~QJGuH=L2Ih_clQO{c!5;_OG6PTAaEsczz&K! zDvS2ZVG8Vh-ZN*0hx?jOn%xd?b<6(!Eo%)eErwUd-+F7jWY@`)yS|JOGp91e7`X@( z1p$42EpQQWTw8u|*yMe5vD>a27Fw>$B0o0{dQ!R`##}TwXvQ2iqlX`l4og297XA3! zMGWRKpiP!qjCm(<*l#BccZ*ESv(H24tW z{kkKN#Y_0Q*arU5aH2DKHw|v2TYHAKJ4BUPp-|laie@rxlCAh}PHT-ygF|S>Zl`w0 z|6;=ato$2_`sQXsAm9+=VG#EuZ{957!>LJ%V~*V2wsze?ce>!^?tOK2eMCkmBIB>! zxS?cOQ4bQ&Z$IB>GKZJB*<{QeUp%){{Ks4j7!eq27qDPo#2kj3aMV4qchrGwb0ENp zq9}4s5w02#bwU4^?<1QhT|bsTJ|e1OvQ)_zUwx{+Dpc|%dFq!n=tzoQU$ETdO-US1 zNGY!B4_RK@yBL;OR2}s3p0h}m7X1|U^Vd-FR2PtUV>f4#EBL8N8NyXwHY!63{f#=^ z)t0L|PRk|q74{`?+I}91C?MyW;DQ79+`*mqX37PY+PS%PwRa4wTbN}kx_pq-5TJ+< z;=?!CgJk@-m;N#j@<6a#qIL>YTkW=!&34-k^beCa3Rk#bvtEg0g96IWK+C2wI>YBY zu$H*VzQu0mEyQe=h4zv1RUAEzD}eoprTybC%j~;L(9u+vv<~bQV9lLpA;($Lzt|c*q<9Ff4g1h~b!i zEAjvODGE2{-a%i%eEPVwPd5I=(#PKtabSPoX8ry!#3A*FBHHpBMbR6yW~jH@j;Kj0 zJDsO>a7`JXo_#mfubHB3y(F{scbhYap}-IVldB*^l)Eh+FMd?~Cj=}A4&)FBCSZ2$ zuCHHXL6*#s`jO0V`F=ZTA{SFt6mJ&SGk`ET}>{?Sa-Is{&}EW$fY^*63~_zK3;U@lBw`_nSDyE zs}uL_tvjza%WLH7Q$sTa=wO{yDOypv{Ml#MM{1OsNH}1>v5N&m5u6$8Q1IL#(F!`) zkZpvtMi+{JQ>!APBc5QbDs@Ul9D)e!DLgFX)?f76J#;?@^v0k^ zjEtV~u3F`VmMxwu9(>RhS}|>-yQeXXR|cg8{6$N4JKz1~zGY)IEj5I|%(LSs;Re>4 zT!^Z)*G*%)Dk>|w9L39e;WhjAYjNu^14qCbD^zE#$oO+LXn&0RLID95Q=#fL1A^+; zs>Js;ZdZMAr;*#HZ*SJLW3)bmX|8EnZQ!`Ztx7IkO}UDlk1OZKK+m)g(WgoYLdJS; zr_FiG%3uAGLCJ?``{SG&vQwV+0D&gRgw-XPmAECBC4yujbeWgX=!S>E3~st-1PmnO zZBxtktP^Mn$z3K7<@*9BYC?73Eyw5RbFHRE9nuAtwYQfAFMVafa^~x?{vL?b#wKz@ zi>aS}`rXRGR&M2g*N8^x74P%{j&QY&-KJ3atDlnr{;4O6{#&M)4TjSugQr|RcaSIp z9On2L5s5qtiBiFcGc&Nc9P%|6u7SGs(NXs9C<}<7RGJ`B6q(!&@xsv^zaf_zryLWO z?FcW}O9A4<1e%DM3Er`Dkb{3#s(Erisrh)CL%ebQ^F|hoiI9a3hez$e$R_8=`jL_K zKD|lQ=x2b>jiNvi=2Q5j6D>ggezv|c=+AB6?S{JzW&pmM~{YdsoP8)0}o6lOdUNkuAK7wCtd2u z(ec+0mhYV(9r^EnM@D^KSWtUDYUPIV_D^L;kNW+beextIAzzY?s^^stE5QUHc{qKv zL|&_-;FQT|9(?yvgP-MU|GZpDl<~`U1(~xG?L`3!pU$TMUNs|rv?ESNmp*Ge?`UtCIz1cnm+$RHX5mqJJ`TayimjWv=!4{C)^cUPhB*Liho&0T(W zfK?B$t1b1g!oPH2e{0d|u5h+5dwq6gclYt`?#i63b=HTut!zswnlnx2jheB20?W>m zC&Dz7cBEWeRDVD6UB_g~3rp2h%2L0`sbXF|FPWFkN{W-WbpGEIk>->XtDcQc^LJE~CQbg3&E$mOh@8X%<=3(#AT8Jdenv=YXU_eI72xcZnt(2L z5n;r>F{Ii_TEV(+De;vS6^Lqkl$e%3X0-{ZFVg{iMq0~Tg zNu+$F;YD#6K#5lpp(+c?p$mfrj9r`Og(>$YmWG7333q+65} z2@dRWfUda#FOk+2xU zKzxn^H6j@QhR=#zxakqmG6IRQqnyVfdc@xg>t2+Pk|||T7G{oN1j|3itJ)R|G#_hz zhmWKMR09%b4y4r0f0aM`7@J=pj*hC=G5Px*dkj*QD$2Z=NKI+RsfdclmAWf^y${q) zDJKU9ry?V!h6X2rRq9UzrjY%Zh~F`iA61KXyOaENk1I8`#N|REasvw+Ug? zNAbO51sIj?)7R9PYxGhUvV|68B1}S!SJp^DcU~fsDN_thHAw5yyv58eCIr`a*MyxRQy+~4P(?9iCF?6jJf{xsaXN#vH$(sdqV z+NwtBHkG1XHrp6`N^!oXrX98OuH9lmU4qO)wFx{e6vXtDb;0hy{|t#B2&@}n1Zc6q z37CNT;LAcoUYhhuNI+>`;1w+3rhqhPSGu-LRuM1#XQ5%+$`?km^3$GK5gPsTPm5gv zD+3P1uJ|c7PyhEDS^&pk&M&frC5#)n0W^m={|w8rEW;tLUwcji_@P%5-gKJgWf=Pf z=c>1535f8BlT_8vZ)M>s@s>KcYnJ}FdC7`Dn`;{5imR(%R>!z~9(h&d-07bu06gXv z*1R+D>50_|4Qbmf*Hf!q$yF{*`*pc?Y8oNWXVY}o_6Qy<2w(3LbRV$by;73pUAVfN zM+~yMY|uljf)y6j(&)z1J~4b!&5P6S$^oJWdxYs_X4^zL!?>*q#4gw-wdgDH_ciTYJ2vn&d&8Cow^;TSPPkW(zoJ4XH8eUU1w zq*7l|+|~KZPvf%^T5^$^)cd2pP|X@Hspj!~9?Y#c^aRrRbhPZ+A+NOhcBLgJtEjme z+Hy(fgr~|tGLJzjxbj16EmUCQnLa+`_t&? z(Uh3^d0SFYRg;o}hWE4T6JJ2Ok|@>TdFADKs%>|-=DZq&zYr3T&%E|@bo^x{Wk zW9`Q$#cGzfzk2(NtOs?Ux2`(a}4aYQ(hIiIXCh9?LiQMND=dF!Lu=n zUQsipnZyejTLGHGN)3yMMt(9EuQWdhZ92!tJ8}KafjVqx<_uWp(_tl1GU8&>X%6f_ z0y9T)0q=c=kv;JX<*lAk!{+v{Qi&rQ0Z;=5^9&2i2hL0%Jc5V!kI-j2PSGNL%CQXU z5O_{v#RKTtPauTyol63o17q_pm!a{Ay;RlxyeIgd>$5ZpyXe+p@ZJ0{S5S0#8F*!i!3x z9UEI4xa?lT7TN@h|v^nOk z_!Wzeoc$(p2z;{$yzN_%=psVv_D36HP@ZqBRdCr|XB)PLlsPWjOZS2E1d~Bc2~Q9~ zY>{`f2rK!gxz@D+C~v|ivfwavAg+^ zqsXaObpC5@>3q6RDyd3YrKYm)re-qjsEj(AmR&CGljci%r7uf~n9oUp5R3w2Ase@s zNZ^Lqjueu2N!TwgN`eksN^-_}lx#{~`HRA*m|%{#-9RMQWa_9e<=$}rdQ$}iJw)(i zqHMuh#@UK%Sx+ z*@EmB--BkW#`vDs+rz^)22(Sl&5s)4onBkGl7S1Ta3i8xs(VOnzL5)8goi04B;m}0 zK>-Wsc8aDmES3z(jcbQcyo_As<`694AN*;^Ai_JMz@FQ}Y^YU}Y9_4I7-;sdEo8uP zT_Fo)!kL;i0Z}5~vH22rJr*pswOy*K4+xUX{@g+mB%M{NA|f@B5&u0i`$T``QjpX? z{r|93#8%Y{t|`BKik8QE^<+iOYh3!~_v66K0z-M!%n83_d1N^=k)iE5XW)W+U{~vC z8ES)*A#Vyy_U|mLfSR;law@sjRSI66yAu+kZIy!LpM^PTr5a2h&oG>RpDmrmfE2mLG|#O`%vwv0?*CA>VB$jBRSh@_~G zXv)6|h%%K*EeMN#Hbx1%t}k47v~1mx^R@J=_D|Ly`LwK3b=P+3^vbxVXELT~2YS!9 zP0M|q|F5SajUI+QB>OLiU`%(@RQ-fW^WN%_k5QoT#fn4y3teyigx`;?$cmYJYrnWa zM^heTL6AzRG0o(AH3#^}!XZWyY`ej@>+2B0TJ_e2F_DXm{s?PLAqiC&C?qnSrl~0) zCrR@Jv+Va-LhvH;T8rdjJz=Lq28vEyQy0dC5sIIe*~qX{s^uJo^wv;7`^lB|L^ma zm5q75Z@k{y`}!MR?^szGkrAM=K?mzxKTlgRF$%%#H(E=%)xQyocKAutSiTeAo!Hct ztm@9}JyqTNXkt%x=P#;$2s`tDSVW?B@js4S+{YiNi25CXI28mc1oK>&+xQEMvz5jv z5AtZIkPae2{?D&Sf5(yQ068nJk4*#s3AJ9uvaecXb@zinIemdEelzzht+71%Oj*WQ zZ{jSca*vDW=a__gj$g%8i&$iekqDDNT4)ENE z(dP~b(O2K6b*Ba!c_(s$(IOJ_XE;k#QI|ffucVYudrjTaLA`5}M#`rWv-7gkM#g{< z$GBgJTT60Sx2FCvSknDoyfqF)OJ96KPJ6{T_G02U|)b`xA8m#Rsn~exLdM;@oX@IjGC61K7=jxutXV1mf65p|>{l9FgV!UaWt3ZzuQ zvi)8$?6h>>C^A11sZT_PfS!+n-Dt5aB}5Pqhr8bp8RDTZwYJ?;YVG0iqZAh>CTm{| zkE;G+(jKuQK>}jkKnXn)6cbMfg2vRcqZDTKw(jDX70w!aLl^L#rN(5~aH?*>;=!^h zJPTzZ#LHn~#Lh&dY1+ujCMgCpafF(b(E#tsC1V=U^1n5QU>E1vMf;2cKDSElJ+b(r z4EI`{N{bA~3QRiu48HGx0DBcD9W`cacVaRWhSGDc1_sBf7atgO`8~YY&c_wkbD9G~ zTl`7Lb+@K{U3@e1>s{7YHsVc(dQR75#arxOij1$@wfTa#;15Sfe>akWBiwzx8+)75 zbtX&PXUde@x9=NH3Qk3Hb0{@9Y52bK3z?$)OxoS3RyTG_!zv+a0SQkCUTZv)<*fVO z&)pD%j`|Z18f;hWPe1WlhWo6)1Sf4Ci<}Om?MQlAoEjD_i6}$is6*oKP+LA{#OVC4gWg90XsI zBYJ%x?6+*ewNqL)#w<87RWbg8u`5+#2Hs)4=-iHC%^1M~V+`>T3TBBDrVO%@Ce>u} zrLF*=@|`r#nmH{$N)ev35!GNv2XFD$=np>>MKd)KcE)k>s932M2$!hx+*+fW+Qs6BMJ-%@Tx z$ENGlC=PTDgBWc)Xbhh<3qNDEm8D^n4BHmDHkML@RUBv@GDfAGE=j3WZzODw!<`)R z=bW|9svgtO;eI<+Te~i4FX^vW^AgL2%HsSdo3;jNwUXOvjQ_R0-M%?* zWf#V33+V`ujo*N5&kPLIBYt5*n5V+>eZ!sqxz~tu9Hpg{n2aLE|f zpeCFDCz2sN!^ePS&{ixH#X))x-xDz8;V^dEcQT}LTVr7K8RCR-lD+&h7_G}%h|BPn z-#fE|)#X{Aw|TSD6Gw`M6URp^eJ)9hMm3yMr9HliHlfW|!GL(d_N1o3U{$H~2GA>- z1O?U}*_O)2Rfgu~16;FVjim{C=|q`Q#zsp_K5w{*LBvXP_@_%bnsLUy58TyW+-wDW zl;Q4VE3EvFr9$$nVz^}s+(KvgkRzgsq9OwG+BNUd%DljtwO(BpyQ!ry_Pd7IR$mN{ z!FREZFG=|sYbY~8)|i;t7)|?o$}`gmHu3bvXiXzkdPEF1YF1Cb;+FD368YWk?;L&& zT$P^{9X#CA*x)hVbk?;y?OJUu(r*Y`TR%@X(_|Q$SsIM>dkD6h6|~|St!4x@QmfU9 zIwn#Ur5E&3GHanCQWL2c)QFDMymAhl3&g~X-d0NIoFkN2jG33yFEgfUyzp#s!u(0T zIiU(IzInV$nA>mU)X0{GyyxzoOEJuf2b{BpidOqo+A10pudnMb8LvDx4tnLcT>Bw7 z>RbGmlFH4Wj=wZ@Z0_i|XP2*I5r4n>q1rp%3!9kD@kMy!yU_Ld;B|P@ge`P2?fcq%YtOG zJZV?JeJAc+vHP!s=9=&oZ@es96Ko07Ca0&w2Ddc2GaGha)WxPh`7)LAWD=rd{_yIW zp0r>{wtWwSE>^`ZTNbF1t_*ApxKB7k@BV8~+v@!>tMi%Bo2jR--BtSkS4tA%eizHr z{%|_!6k4&X+x)c#%b)v@LXFwVlz8k> zFSTC%_0tcWR2!qs8Fm911@rTHS_9X7FWI+GB&yZ*J!{n!`T5-1RpouYsk3R@oH;#+TA~h2j6#408&*ihkIr;L~0jSSvSNt6A5WA6G0J zf(8ZP90poNVv%4CY=p%eCnr282cxVNaFNWitQ+AF!qb9Zl%|Y3k#kX7%XtJONI=qr zxcSf=;SP|}rGAcZF4se|7A0~k$8mES9wbUF!L1(beUEWq;+TPxa-4~=;1S1Iz?QyAC zB(E}wRyR-?H!=E9oN#NWxk%ZkfxJoxHZxRQH_?OW!&-2N3zblwc!b52q?woTY!912 z8gs?)5+3h1TM1s$1^fE@*wq$vFJq58tfp%NqAfrU zkbkAnO>N#>T+9_c@iU@0EzXD#MATHAVoss+%y}$t59gjcJv}pX%&IM3<-RsFM><}2 z4$mPBk=*62`tnT|W*zr%XilLmV1&o&7TD$To;hQ&c(owhn4Hc!w+EdpT23_&7HX_* z*4u#GV#IJyMP2g_-iOG@+eaP--D9|9m^C;JiQ{eFw$IxZ+Dx0iIE<{O;)@E|?CgF; z%#AU>4jUI>+rJH>!TF9Q8SRRZWq!j4nn~Vn9-y{Ck6k?NWxXI97oBzIH>W&HQ~B=1 zrgRhYv_e$O8vTBn^d@i`soIx5SK(P6*?2tjP0TynR57%m{G+oI^KAT5JRlNY`>rNf zp7Bt3<@4RfjU$Y}Fd^Ihd}ViKEFiC@rh`NtVMb?V9cD3$4`)4G+54>_eYxA-Fvre^{)m?{5IPk~0^1-;DDMp-JD`YJd3Y7oL0W+Ou-s zp_|}&i-g1TbBl4FgH~Wf6pR5vI|Z8U1ozHTa20D>gVarUowlILH44s>D^_U6DN;qi zgtwWRUXOzL?yc6SD$!+C2XAQ=U08tiiGXPaGsxPzGb0<3VJ20UDx_*s-QZ$=;vdoJ zmWLV-X1*m4iIU4QXJ{z0@Q8@Ghdrd4VpCBN?7dz+4IktNC|EzPp9A^@?`SPBIr z>=jgv^^V9$SXRN|XzFa_uRfAHGbWjCl z)pC6qI=^0#;`5~_{N>TtgB08GTZ*9T(FOWBaaTco5QHd81${tCG4@sa4Z}#CRG)#t zMq;;)HQXv#R}}eT=i^S<)Tce9ku@Cj!|0FS6BCx?irj-n{_x`-sPH=neh~4vv7`fzc@uz za7K{=cq@!R1OVMMA-eQ}0k;nCPc4d0CbHNv9}&r-*M8H^EHD^XeN)T2u+h~exMA>2 z^aRopms;OIr$@x~>zELY9I+G`Qq<_bzDFPRk^;Zf`Q(#}(PKVKs5i9MH|Bp%+1ff* zIp(mld{)1K_1{e6IlaEU`Pj^)dBMoqt|Ajg2EOsR$1&F$Y@o*i*2e>KjB|_9nBRSs zOXW)OLTy{TjBIAzZ@lie+Zo~EWud!9GSlC?3#;!g1G{1gr|$QiFe=*zPRq*OU!<9& zWMd-E4G=aC-oAbHsmlGn^6K_n(mCKEu|xmpqa(v)xX-siAAPU;8Vxz58-HwTR0giu zfOS`Owo)ahysj<5Rf0qyMwZsG|FIA}0*&QXPHvTpn8U(1_y29$I3+uZL>i1cyk<31 zl+2xsyDx3*V=MQw$t4%#nB?M%@sfFo$g|=v7AG@t7fU4cxndDjM1M-+V0Q<5;=Zl& zlyf_3P|uF+WoMSr|0;dUh^rPq`S3IrKCJ!-0B$izLAsj8nGD;caT}K8lM0`&uCB7u zM-N36u$X9{-k;{_RgXNfiiQuv4sXo!1<%LyK6e6dze&xcjM`eh&MZNIBgHEpuMd~m zR{VVZ$Futfz+|QniF&cH-|9dP&8O6yevbN7gEdunLttd>*v6j1^XBIJ_4H!HUH&7k z8T<6pg$p)1{hMlC8FW`w7BVSI{3;)=p=iK0kENH!8;VWw>5s+2Swlk8{EhqS{OPlo>~5R;(YknKK{gg4KpdQbhpCDdqeC`g)3Tf)l;i6OUe`p& zOycQ=>0DZ7!-SXXD!>Js$F{LO(Z328q7vU#2Kou`RKrwm7}fLt*bCb7&)hkRD=|k#*R@R2r zVE`EafLkIxyzU93C|vT-2G%HOc*HB(m^b_=fQ-j#1qmz>17{2jVxa~D&ar6F8X0h# z9BFvoTAwzqa|`+9Uw-NJ%kZ!lP7LBq!xD%(?S=Mt;a%4)(}1@l$V{_(@r%I)wot3Fd8BV61&t-t+Y0-VY8&Ea8v)W|SI>z#PVgW&|$ z)&cUbO`e{O`Xqodzbhgwx(CF*V=p98A27? z!dy_xz9{@6Np>DQSYF<@uw_fE@z+paem?bZ-^*YEnn3>Uu{V?3u?NFwl2#5>El(^% zd5#UF2lgftvdfQI)bb~f z+S1<6^Cr6k$YTelhc+oYqfFt7dObA_9o04 zO-1h1-J3}T#3#(x6xY{@)ICGG-G`mdc_u8a?oDoR+&a!e^gc5~bjhg7Vn3H|q&M9a zSlWDZv2|VuGNXQEEA_-yWF@@*w&A|sX*OOX3rR|8k8mvT$=Z7TOPyn5U8rv7&N}&` zK0#RB9i^E<9bR&QjiRC$=5vATHu7MP+|sk(jtnc(6@bCXmYbaRfhzb*8JZ3`~3rQ|ZFhb>bWoXqCZe7f&j`y+qpNYRKLIm^Bc*{mCV zr8MChSNIl!$Ac$0!uR2er)*QNtWT}BJCsD}6a-7cb5-_z7mhyAV|Q|0L3dR*haiuU zDTyhO9gYOlrrl&|`Ck#Ajlq>ehhQ@EJPfVb>CqjGoE4J(Z(3_lj>v}QeqX!4-uP&& zt}^kS)PdB1#vADNn(RBD(OegcCo=!QX+K5U4+{-(2HDGv#p!?hdsi{=qdv2Fo02H^ z$1KDI#Q1jx9#!TT4%V69kZ+&=tMjx$-y@yT+ut7T`YCFhJ7Y4~@t+|BZ|ua*`jK=jrQQ>24%on~_0koZU`rW>1mr3EBQYW334w=o2m2uioq5-;SS%RP+q{q^Z zqV?CfamNeW8G+HCc_BG4`2|y8!uZo_TM3DI_lDG`!Nt$dFHFxKoE4{Pr~FGxogFb9 z9b(=3FX+AiOpzD3MSK|BUMAnHK>kGolg2FhXBC5s{+5B4mzzA|_1FC)GkwdPrZ|m9 zoX%b!Irjc==7Nk556hPYWbKKTjmg4mcHGH;*HPJ5^^8{DKZm9!sXu)FkHIaJ1=yxW zb_Kt5inm>w0vG&(oj6nOW(ZTwix?)|D-ja;OJ!)BnP50Hu^U2*uF*WB>bZ34)Fme= zcL8%=Ik`kmny02_9;~ZdPEDEWsklUS2C*=nb(xWXIlT z?bZ;xy?@jC?8*(Tb@Xh`$<1#JN}QV#bF3fuL>jQ7GkO8~8s zC{w60&8*iun>u^NjcCTGl>J6FjBu@;Br8g~oPPX2i!NPkGU@9x8BBfV*QqHg+-fjb z!>Mssv713mEREh1s~7aTCp-SQIz_t6us(Lr$eMcKR7Jtz6%E33`zF>mYmzV|7eppk z9E`;b)|{wXQuR#OA!I^_!Y(28`AsGNjsy99Sc>e|N-{H@TbvQxrV017UsRFip^*6R zOv+XpSv0&Uv#wlO^HDSjGZ_8R>a66i*8yMnNdOYGp7kEBut>*x&5rAu$>$IF{u>{t z?b3k8fQGDIje?R*QHz2i;Jp9tG~Z!pRq3R`htxngtiex6PqwA`i%qpi;6wDA<^AH zNaxdqBxS7)sj2TDmhYav(6CXW+^{@j^&JS2o8cS$bjr~7r|P-x*G?4 z)t|9y>KLX(?YKQ%RpcpB`JHjj^5yVR*fyA*jyarurPbz2hGF>ce5?Ghq$l}L>(VW1 zB4eShD;bVaUa$U4Y7}lMywXC{5wStB5j(y}pGu#^jiA=3b_I?8+14I_3WiZ#=JnO1 z9{;3VUqt>V5pKG%WL|=>0Ho*W%zZxm8+2E$WUQCnTUVmHP<7I;D`}z=i$9(CKx?%9_NLT5?=Y5Rg^M(G^ z>~bZX4CHcMRlji;yTnnTS`w&3bnA^^M;~mV^}Gz^=?wDJeRUego}S5w;s;Tl)fuJk;5B&17iHYrvAtFzw|sO%PfwnY(|ZX&69Vs7K5#ITwTZypI7=^wG-?hL!}%gHyhKWqQ& zvv@t<(Y4_Fy%tMctV#6ks8SGBSAGKnj_qFfeO7Y!?&gHi=*Ljlm@XswXyWH500+lE z+S=d8^X26v>ddZIY`JIuN-Qa81;@V=kCjxE!Y#FCM}F(`KdDN7(m(9o!b~bPk&dVo zWlEGIl9Npp*f-sVv4UJ(Czjk2}p2pjX^ws&1QK9*{s-QbQi@i^``0U zongk22RX>8wFkjNZTRp+#G`BmU9##Rk?b7%VhZ=IVEs%uDxqDlra^9wmSK#S15b!& zg~wxMLj5Tkf&(CGxR^bQiC#p3MA7@;1AX4H|8h^Yczz{s?P6HMvdmL1`R2~@;JztK zzQuL>e^>=F4iKTkQp9dVM)>CM5@`=@&9+KI-hCqphY5=~;A27>dO=-!#-qz5X+r^_w>MH*9EV zj`ZJ^)_(;k49gN$q;T6Y-;1qs)i3;e41^a6T^e-sZ_;LaMad$dTX6Io?YfK-&4r+3 z@!EuX;uuSGuq>FYGq0<&O9adx04^h4g5i`Oc~Rg5m3c?d-YGa??`pRoEd8P=fV6VX zHM3UsBO@q<-^1Q?gz?(lJv7#};aRsjqZEv{P0TONB>6ek=n=LIz-ac~FOZ9u-X(b;H2t*BmM$YHhBDQ>t zKHlPm){Cy&S^wgT_1u!dp6UEYjC|ooHRQG8uI{cvjm|l@K^-T}mBy(XCSM$o8z49} zB!Q#jTvz#{sZ{i*CG9Y_s_WKkmPb@}nI)1&#a)FTt%0cVZb0hYsQay`oJ-0pD_>c( zabwX+z4yF~{H80WwQ$m&pZ~F8okBgMj&}}a4msnYO0jOkKYpg#*Tor3;x1)>tGlt( z7rWBUGgb}^a#?<7Gg9?VZ9_wXN_SJ2=*~LT?>B9JF6x?rd!+Zj!)tw8d|UbsV2aJi(m9@ z2735}Q#%f1edZ1FZfh<2-NBn~8IT*39gwY1NJ*dZyXNoyr8Y5=Z&Izhd!s&+ol|he zZY>A=^1gK?DrNcH8TpA$iaa-oh@@yIzFlltKT&ihJkZ1lOtDW*BY9+1H0ik14D?cv5~2V09Gfn=+c`pPOHFyWLVZBT4r1x2DwEZ#yrJ^ z{sRDpS*H@Pi>VCGbtz3&B|ZaoFzw#%;i73>}8!_{yV(CDNmlObGv5H4t z@#Mp_Sd$UFGjeB=CT_wVv+-$1> z@wZlvYh&oGo4^TI-xvv}yuVX@UiNRR6tO=4316&Y{Mg&t&V_4-BpF?Vks2T+I0;!u zsI{9VVzRch_IDRCEMWvBFxM+z9PG2wZsZ1Xo1*$MHfKD;)UopXGTIp9DC076^GQ~| zq!c=j@Or;f{@*2F@JPzzhyKHX=f|zOyY5GVw^@#f#Hkn>siNqziLCe6R^}M`rBZRu znt4BKB1@>r$=3xCZ$cumwUtdtnCwj9J>L<~p@}i2|r{-hEHX#xV3C zdP&UuhtvPXtgjDGazKEjIdW&EXKj#qqqFxmPnnBRBAwr|7Enc~mUu7cOs2tzXUf;Kn4}EWx2zfOwklUnPi>X0y4H={T0nJr zVz2K8Lihch{eL`Drt0>M!G;hxpnPW)2VwhsrjgsX&&XxYZx={E;?N!!AJ(3TaS2J1 zjmnmoa{2 z=<}02=uWx*&uI+%$=x$U<5o zY6pz0lX^6r7v+gHl$~M?1bzPlw6LLaW(FYz8dfsrX~D=dBJ;=yG~@a$1C2dIqL;WL zZ+ZGJ-X^9t7riw;{?B^!bfP)ppOvyGCQ3Ha53LfUsd>gF`7_V3JZCOIW;6fFGaTu7 zF?4%#mW(}?3$&b{lANx|Z-EeFEo;X6ZZ*c_F4c>=MmKW13&W&zmzlgbc-|;fm_0D- z^|kqmPHRX~D`z8tBuFp~$P}6zoU1ZIfrx&lEJr*uFZ`*3iuM%#N)gb*9+9R(*4FlNDV1kAi;@ z?(_lrfx1QHLExj}U7Vfk(8qR{Mo-Y@I+ZeaDOV|NZ_mx4B7$Fr40wCzIMdC)53=mG z*C(&L?=QC@4D@<}iQa5J_0f2Ru7(-sc|A@p82ST%sOTR*WR$ZkGl%9F@XqZd?t50Y zb=IuqADx=&Rf4CdDp-t~nC9_$;743T#pr6#F>0BvXnKORfFhZPxvRxay5RZN7yk5JD5! z7++@w1qfZcvh0&jdU>8@@4p|$s35@7*GeNL2(YIt#!fyRWZ9txfK#eKtqt#Y510Y= za0$1;Czf?_%xw!h0wX;~%jFEsV7fgGh~x(8e4~c(FaTtuZBPap%|OZL83&KnB5TV^ zxhL0fWs|rRnL)9iu=@m0kgB~Yq|(npm9r9#ki|DS7aW&vOhAPUxgGe8A+=7WAdnU} z_(y8nvJ!Ay$&mp~hDE&$_w+dv)_bFuX@I@#&VSlvN}>!px$zmdCOCFt zLfpGoG?jbLtgMT-_CvN==VyiT4DXKYx`XA|K8bg?eE9bZEhyM6{wa&hL@)me>Lz*e+j$~5+xz@QNgz_VYJ&UGEn0fP(u{kN=EDXA|= z54@WpXSDWfZe|-;{hEe`HAVIHMfnN>LJut_8gnVJt2jL+ic`~-buGRYkmzy<#yFF` z{4YEvID(Z_YQm4PC^q+?K8l*uOj0N{>PImG{Y%SRup}U%=@$G9KD38DBL-vo-$iY- zlB`b^SsQJOByn7Y42|ihU0*0X8)LOFs8V;R$?BL0TG=q?7pK5QkBM^1*w5I3ek0>D ziUKDv<>j+!wlpaAtKxTjo7bQ4(y=1f&ZM{B)0J#^YfIS#o`5|~THk$pzq*0mnG|o! zZTj|9e?s%*u}8;tCB1$0%cTwm+~ANq)aP%b5sQa!H_$~4jn#WcJCqaIa5IBG9OrR~ z(}rFc`O(%NBnv;%!{PXG@6MfLUiahJgJm%09iZ0a^777q-*CI6x%ogdIY2IHwi(HD zFevNa_Ro}=MZrax(YcZ7@r|X)nWs>&ws2p1ipG?f9S?}wSk{W z4h1RC{5~r4QB6^Jc-ZQ*K^pP5Ed@E1#f?#c<(oKy=!pl!pmHNAl@Nn&s(b;>%!26D^t+QEK zvt#j)DAnkzYpY1?s#Vt#^SHdNKN8)U^}pmbc<1K*vfjY1r3E_UG5xthgsxs;K?HvH z2LHCD6>AGC*H)C)xmfC`%!X_Nlu?)kC&JhPl*CGFCtdu6%?&M|t6L$sad>7;raUNm zXLxeNBavhM{m>;7pbn^x`dTVAN1&GN+L`Ap@Vn{gr|a*K^HG8<>IP3`=)Ag&pQ?1} zJ830R(jod!;~w7_5YR>5C|rqF$JO}EJ8uYCZPXO?H(bz=jW-^hLJpoVpEH5r2D+j3 zSM)^`k{y%L=;jY63949hk*L%JMx;wZ zV8!sH;yOV#^gXgFCE(cTw$=rQLQwGaVg`m&3oz$}pb}it6)Y#MZ$ut)_mM;Uan|Q; z3t938F?I0a47VRQc1Ns5n*jsVO-N8X%**d8jTL<-v zivS|WSkXii2lc_8updl2nl_R)ng*-GTE^*3`NMs#wEwmE^Z%6fr;9T>9!c_mCC@Am zR%}%g<$PM_;~9*r=WZ-Mz$MdCf{3&DfURHD6B8Yg*(XM2pZfn75Hl~|ugtet@^TmM zzh7N%N;qXt9OXC}S8E}ylW?rR8Z=;+8H4us3u;lNO8T$b5DqL%hC z^TY2x$gpiSy6bI))`YO6g$1F%ErAJcIG}W546}Mi0 zoEoDPoN?Ao{G1YUU_3HMXTCV>a;cc8@%PX+apkjMd0Jd}6DN35k@)#3hU(XBcGsp& zA_(eyEjM*V|8WvRt;$wiGR&$n+E-jIv&hlNeWAA;3PkR?ww;X(m9Ui6KP-vr|jhagjl0e(;u{$2!=rz1!tBH~>f?YQ&rbmD-AZ6fuTe>Q&gx^=#b z+sm`=$+1(IyS$QFsjlr?U;J@EZU8r-gxJTq@9Xf2`{6u5`i+Z(m)w>b<#elMh=guf8g0zF+W-JBEqeNcpd)Mmvq=OW*wL zqLebnS!o^>|H}$2xDK6xj!q<%jl{QZq9H@+`zkKO)kROGYUOlA2? zIzfJfDsJ%Br0LYUw7@jAw2x9Jr@yIY)OEb4@x^JYRkS-(suQ~xrKB;q zvEb%cNzGN~rUl59lB$y$$CK0FSs$pCjR^1iIB}@wm7cOG*B8C$Q?}V=KC$m z<%i3vK#u=EU--K*oB~f}Cjfr*ZiY|!cTfEwvh<*Js#4sXS3u{2>{A~sn$M0R72K0s zI8=ie-=(pm!l60v`mL)1?}Fk74?P)@_S0yx*Ft1}$PujNPeEhOtqs+|UoAO!paBmz z*n{$p_B$VZ?Ft_}lTexwO1rz%1oDary!i5l`)~&L!`;!B2Zfl!H~At2ul!5 zJtDgq!>XA@S&H=0GMf|VQoQ~R|2PtL>2&#Y+mF!JmkS7lqZ_pjoAU$dNwWS zO0&X7VwQs2n$}0Yk_JKk{XF_Lm2E1g- z=Y1U)uQPzwSV370dXs0>&JDEr2;vonwvYkBlul3`ii69q0_!e{e-?M>97SlbAw$}h zFYsJp(r}zPkg5@$##sP=NVtJHxpD=^`y*_VdTY?LV9LcfvSFi9HxV`3U@BCC$RK8d zW_R;e$^~E#Y`G9^+{!X>+}=dMj*K`=-QmMv8l3MaSe7-8&=_qt@VNx&WlZQ90BNV;w2nz>o8@6tD9MJe=-*!~dmG*n_gj{LQXkF8{(2#7 zl`Mu2K0vGu_IMVyTK6nM`|~X7t7%zw{45S^`BM>I`Au`Z^)XaGU3J#Q0JRO!Pk)1< zse0?JvmQFC3r*Kcd-b95dg!6H1ufiv<8{p2JL+eUybi6-Y;6tLguk^_$$0h1VylXhhE_c(^)D@3!>j9uBbt==Bc(c(rftQ_by<(>>?a QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot new file mode 100644 index 0000000000000000000000000000000000000000..70508ebabc9992e64f1314f866b2d7ab90438c58 GIT binary patch literal 143258 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 Hzx)3OGG_Ot literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff new file mode 100644 index 0000000000000000000000000000000000000000..780de6d66c1664caf60348cb4ef6a2cdec9eeff2 GIT binary patch literal 29700 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%0Dw-qHHSKZKL}#_NX?L%i&vk0~KDoH*f7~ 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 E0$VFRIRF3v literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..72a32ab2c209f238afa10adcd38e13e7584d1294 GIT binary patch literal 19940 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 P0ssI2pez7L`~(01d$TWj literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff new file mode 100644 index 0000000000000000000000000000000000000000..20ec4ab2d7429a9428d9086278817ae2b1f05f7f GIT binary patch literal 30876 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..642a2d44187c82a7328e39249658068fd455717d GIT binary patch literal 20320 zcmV)XK&`)bPew8T0RR9108d~54*&oF0U&Gu08an_0RR9100000000000000000000 z0000#Mn+Uk92zzofs_~=i&zF=0EaFS2nvGQK!S${3y4qv0X7081CbU4AO(Xq2c0$> zTJafB=l;w{jY@A;{c%jg-*G0>&7E>PqLhdIM8P;_irYbmit@iK`~Uy{|JxkQ~^mRKb>St80JT}H&JR#{4M5VLO^xpz6>7$KzLP&r+r*6G7G=VPYSsgaV12#e@q*PpV9I~x%VPm$0kw(wrigF;v z{Ya5+f18=+M8k3mA4R;U8VNo-NxiB7Tp{gD@j{z&>eDuxvU)%^Ij9wP?1XuG6_RkK znS>W1S%_NpgIBbVDpCLyzv_TD-iSTf^(*)Dr}|d~Aglzp5N}Kue(&N^`+1b*d88(L z*=hJd@~!WXJmJ>Rf+>Bn|5IBA*e%#%La~o9*%Q9!{fjzP_x&D$2pP_!r zojC;)5DO8o8*M@X1q1`J0YwFjLX2WMoH2XGTsaqR(?zp(uHOCTuXR83Yx$cl`u=q) zp5Y1?xWEtmM9g~xUCWYhP_RVRUf9enR=k80JCJQ5K;z-lvn|~1BZPRikB+$Ss zSL1)l3Nyx>XMgE@wM}tvb#I9|>>_rNEw^BU*eP2EnR1XRrwqBz4r{WsOu`%*EK%LC*L%HvpFtHa z6V#)gpal?s!elnEhsr?#4}FBP-xL5Klyu<~A|or2m&nPRdC1!WbB@MVI=p5W|^(|g- zsPnI?xdN_~eQ~6xYfUdtSGtmy-Ti9WGTpKe|KkJ1|9~iiq6#U?7JWrD?NhlfT|pNJ zf;3H$RKHRyCCgX3?37Zr*2;7@rqs8)q;9?~%ba1$o-xBR)?rM>#IN=`n@ylgbgdTM zg~4SI4x#vOx$Gpz{rQg8l-avWsh-l6M@WG%8Xmr1<{N#-(yQurjOYO;*i|m>46(Xr z^yS+vIpq0yoS#!3#|UEt)PSfyazaKM*+RICyA~x14e-K+d?BJWjlJCN6v^4M@+p9* z3Z%+1@@r(3i1mekPo%vcR=9EVoj6ld5#0@=n&|9w_udvMy-$WxL?noagb+dy@B3}o z)C-AgfODbt^XOroyMkOQOn7{o;b(05+mCeT&$YXGggg@vFlg`CZ}l1e-LWQZ+P*s7K)I~t&(ON~&~ z^|Pfy0t^T!OixT|eLw#g5DV6#1I*H7AHflIfc&T6^LTDfttH=e1g%0#O^)JDEP0Kw z;h#!_f7C&(P7D)sRf{sZRr@v5IJS)DxHy&_@M;BVC3uB*_)-5ccE;fdrGGk&VX$R&1`Y-nw2-=Eb?XAjlvjcX#fgvksyVD959TC|C$7vk--^d|iPy z&T)_D(RHm*uRoiK1wqf~4?WRyt@;_an^zCAA;OK)EC4x$%mV`iFI!mJW4`hbx$efD zb-15ZDX&05DeXwvt#syR{v{}m4QGAq6p(#G5Si}xt_S1UgNoXgl>}kVJW(m1ACm*b z={y(ZZxocf4c~)*xr#YgWDlb5O;j(>57?b`eZ{<}$_1G~2B9aQ2#$J+FF@1PuO1F4 z6@djJnGc~=^=7tdj2)|UE^7N2jIJ52_K}|JMLp@i`_*xW`iI_=2k8>-5obIj3PU9? zAHP89n^^jVi#=Lry$v?nWOLmT93!4}%8TTs*WRX)>$=6uFI#hIUJ8oQrS?OaP~Ozg zpfi{(c5;>+^z#{p89ISP$b|B_Mvunn_j%wTk(7j`K&hm(Bt6pWylo>5k-X_1;M_|I z8BP*&Nx9?>NNEsFQlqrG^uW_bW+p3>oyp1MX7V!mnSxAVJBl*JnUYLtM$43C^h|lC zqL(U5RT+Q1>$?XVLYq_%YOYed37&74ceHooy;VdzV!H8R1Ve>s{vH>zPr*$IbDn2aM)_L=uP;GjbeJ6exvO|-Pj7zZ2v8fX)&B9y`+q9vBa zB_yS!Wn|^#6%>_}RaDi~H8i!fb#(Rg4GfKpP0BRP%q=XfymcK+)A z-&mVg>~P}Z#ZM)Twbr@~n`P^lj0WepW7l5n$ z9mwGcL=somUG`+XeEb3>R2vo%6%&_`l#-S?kZXv>+K3XR+;&A(O+6aDX!fH$>#TO$ z>@^)YhN~Fm?&Dsbbl|jpMku||%n0)x)_Nv3y&gMX1L8%2_LWresitW0(@6|YT*k44 zl3)8odY;l!_60aI$Aq+=NVL?QbP1bWIfZkH_a_4>xqXSFR`lh0#K)T37K@8(HNb_| z#QDha&5{GrDy`W5lY4CEZYU{-PO5>ruI~#eUtF9Ev&Z%1mfC&sG%@RXJIBB}|J&R* zk7Uu(JWjv^RREPiRmB_l3jRu<#-Ir;7P2F|vL^>}C`WRvPPUo4)t&D3phrCkUyHR| ztF_(^kAN5nQe?BQ`fI0;z z7=@x35C;-K6388TLw^{qMyv5^vYM`Di}~7OZ5dPr)j=Il7uG}dVFT0%H3rR4a#1bn zMYC$xUZj`lb$XLNlR!MA7rZ5d8B%bHk95Qv7&M(&A0CQ1>5&&PETe;5z4i>xHCTUetdx{6<0iFpY=l0O$ff~oiv(n{eE06FL)=fHsjaUr-!z7(C; z^`^zG-MRPR(NlR&01yO*z`8UM7kC0O2`L#l1try_)-~V&005kGE`$XvU;zRG0$L!C zqOz*Grgn5fH+rdWU}$8#`dbTLTf9)9S6S82u9L)25RDyk9c$QPN9>Tgl*e@_>#a{S zo`>+l$1f0}y@*&$LQ3Y|EV&#HmZ(A~4#qCZ>!?UoO}#eCO``4S%&Xm&y|5n!WtfhP zO~#oyZOIfpG&*Agp1ei7#Y@;#_6E1RKQ?^{=gSLQTBY?CgFs#jhJaNR$uLJu4I@VV z`Wh5nn8rKbyfd4mQO?1+J{n_OLQ4bc*5ZiwEy zR{{P^pb$K|21{tAMyw1kGOsydrqL;n)+3#RE1RQq6 z(R!?KQcgMTOq|6z=Us5oC6`@s(`|R$bDlRDXN?wNa0&xi*MhS zTlLgrRq{MndX=gLlpHyf)ny&Y!puy(aOfTNcLzo`W!AJ(R5VS~G%d|d)yp1x?X%y( zui_Y`?w6N{_yE0Js-DYbS$0KbS$1)Vh?px^u3U(TElAOTJ_$q;S9MeK27d{~5itoV znQm6j^3;lR1<%Yx%7wY*dA(YYW05lz`T;Ykc2T<^$&I;Ole>xAr#`m*oa2i?HB)a( ztF*p}nh9uX?r`0@88)yLcCd#79EB5{;i6pO26uSCQ+UB!_`p~BEgvFa z^|T4}5wv(Y5s{H_kri$X>LK}ANx6^$zf866h`7ZX=3E*3I2t~g}zxDqfWLU^M| zqJc|8GJzBtQgLN3enx}QXvmF?Mw78gDA0n^(Sa@KL>Ib6kLVSBqF)S%K`|tT z#Wpdr_+uA#V-$NZhP~K_{WySe9K<1YSWT!&bp%J%F&xJUoWv=d!CA{Wi_&u5a>3@3 z&E;{0t7D35W18!6gPU=S+wmJSafjcz%ROfKgZn(-A&+>>6P_~1JkR1!p2q@TIaWjyv$R&_&$dz>0s7Z5Mw6?CT?G>q5W*jS?nZQb9Cb4ocbH^S$ zZ|uYK#{s;M#=@|O#-gy8#^SJq#*(m<#?r8i# zof-matXAD@wq645==^xkG()fDG;4l-q(a8o=0zYTAtfWHproQ^U}9!rW#ia0@7AF0 zFrwm;(z5c3%Bt#`+PeCNY22#dj-7&`#gqC3#+(K28Ro>=0}U`TD@svg?6b<5uUzCW z<2v0eo)MR=1lN<+bW{E(N&lX%U$g8faSKwM1vqzR9oWvSGm+<;nUhiGnzh6u7jlT6 zkh2}ohU<|o%!*$+Uo&p(Kh=!Q0!Hzs*gnpdLdU_Q;HFwpMVwTk!6;kW!q~|{Uc+f> zO_gTiJjKtN?_v_{7&4lBTO=DwE-99U7XwTE6CuI+i0A3WZ^3_u(TQjc*^mv{P-jsq zN7d@lSiMt+c>AY`d=1qHV{)tu4I>R>vK82z+@cdpS*7)y7+am6QQ&B5i!wNCYsmRn zkb%g>9)*)0jugq8i|n<1=h~jS7iC(m5@lU)t7@o2=dAQykYj21$_vA3(Xuc+QZcM2 zW(&Z!@y=Wvzf=A4IJ&JzA4@pwz1Q(mn*TgwaU9R&#qiUkvjy_8dxPH=%oc0MqGQpq zsL$}2Pe88b8w)6oC7az#ZEDPy^Pi%fEs>88^Tk+$dQ)hOVHsBJMrSs6&ZvhFLc=&- zMN=+WpV__Am4BRi^2+O%SJ#(I)@+6H+BGKohRb|)VQH1t@5wFf{T2egJ9_`0SiW4D zxux;1uI)dzkrVPzvZB0SW^opv(GOI>pU6OoTa<8#gf^qbYSn4bu2UaNxNAe}DC=#o z(I%VA)@V2Bf*>#iHqtuTlsyDu5>hg93Q8(!1}0_}RyGb^{xJZ33JHsdmRO8SNJ>e| z$VOg@%Bt#`+R>?XqbGd>LnGsRe#r|uqIrDX6P$v;5NKs!oC&1j#`E&aMo#ikkYX*N zDpIS>xJ~U+>s2vO4Bs(|GKS5HjHgg(bVfB%cAcE}rPV@Pr1c{EY}z_&3KIwCHD0D= zz`AYNNRDR$K7yTJp%lT8z#~)85XO>>HHq^C`vFZxdfkFhz-%-;htxR_kTR4(CB`~b z^weqZRrarQpz02(nG4r;+cn5~ZVzC4W5M0ToDMLpI1(VH`Te2RrCO-gJTdJHeW17~ErlT(doRX6 zuMt9Zh&gmq)}V`10fCKp&}i$ZVB9_ximFn!NFMN8ZJ)qunXv(u{b11Ag#<`wIjFmq zBJ+bgXnA^#5_hl%#@U4JfAGs8i;Ya|oZtqL*ybOp4Afseuz%kMJteK zNfn4H73+&YdC>r=sH_b-TONP{cKw<9j@SD=e7X-7;|rg9c^F_+JcWlg*br; z@9lYr#z5GZsXf+AEpdrhR+w*#G@uW@aFS|AJZf>33PK9cPb9%1@lRC{=7m|3K{$T$ z{JcOV9naDVbW094++LIvmV>><)z&jO!hyjagr|g&i3kjWNzMWBN2Xvj$&7E|kd4%a zH3R7ItCu9i3zaF_l8(gCG_Tv%11@^}f!MV@Xh6Y81?S-HA7W`J-`0jh(3Fw!A{q=1 z-}&Y(Z^?KUndltQtuil=;Q^uw&oyx*>cN^ykS^*l*CWVaah3lfYW@IKOcQhMCrH;L z%~g3p7L`E{k;D+9(n6eEd-|`xto;Nr&g@O1+|0ARTVfqSxx$TKgfERHrUQ)@vLh55 zZMPg-oh6khBU&Iq<}pk=^K_g@Da&wF(+)0g=KMNB+jxR(WISACBLL^5uOO52e!hUN z7#T1=u#4l0mj~%FNRTF|9^-?vzO4!6sfsZ1lEHKWmR*S!1fIhH=pb(yST7@oVEqr; zo+>4B9fQO}cQ8Pc@PNv#?Q0&%`K74y{bnDF5Zayg zP1wB`X(x)ITe+%9B1z_`C7}_NU>_!7sciRqLv4xZ2AJ955{rz*jQue{<0S-1zerS3 zqxdh2RvCUGxScNEun!$2Orf`3cAQ5}`~Kud0cZ>sz~Ko*5*eUS0f0tlFacuO#G>6N zUC$4~C{EHWFNzWXs=8@`t{+C&hkbyrX}6vFP`=UFiNcNyg<1}%Ocu%RLV4*06BAO_ z&Otd)wq&5|0*V_BP4h|_{$aC%Lvx~1UVPYsghou1O17YXSq_^j3bZwTwok{?YkgJW@-3I9V4IINKy%aS#EKP=nK5N;*Us5Qr=%WY7-%|N zMp?JgohFC8Y|4QeXvMFJ%y8#5-cNrM0{%gEBv)!Q_jqy4hGAM^Pd}8)>UZKozS=n` z2WT9NWLKb^sPu^!A)bSBfH?I&#%8H<=vpoPw8MV&LpNsWd>;04(P&E<*PH&g2R7Y% zv^CNQpuzbEI5flBjAb7k;BY(VxgvivNf0y8@GWRvlCeO!3m$blD8PrXz$-Q%fabuH zCoLF1U93?%F_aAii(TSUOza(DrJ`bcc|5(US3TUAVMNPp^HCeHZ+e_Kl+k(tB!&s~ zRFTy*obJTDX_vVDzeL0PCywP4lqe)bsL?J}mtNT{1M=By#b%kM#7ZlbT4z7aLC4fP z>AqGEJ!5-e&@98jP7GVX^M%&*t@dXAC(kj~#cl^g{`R;X@OdxW1?R2X2j6<@1bpwk zQ}Da*p#AY5JR8=T{>bQbTr$)d9Wv~hoJCe=dA2!F0SYtJ{y!3Gy!~WvI+HAW{1?ja zi8p)h|NEj4*e-3V1YB3|{corKYmRh-5Ncjg)NecnU;$V*=R?S33bkiv@)# zVtELED;$n^f+qqM3l~qGVwD9 z6d?Zpo2d*$tH=~9sko9#E2})|^B*i0Ql&5hX;Pf>ps~djUuvjP8YAL3t#op#zB|R3 z>Nz<1d^HME5)*2la&4}?PX$xfbW-0CRe@?{fA+kE7F%k$l~((!zo{Zhg97yVWm%%K z`#tDkk9ypbo;KHf&!`eSECGxTtLV$T4+S%mi?#G)uTEP(x3B#jXuN|R>TnZHcBD7G z?f+A^^?UET(&yItrP03h;vkm(J5Bw48v3_y{dYkBpPK&aW1nsVqS@RLE=+NScQTqM zh@}z#``m=f#3zs?TMmgLWwtt9cnLMuT3hXPw56_k>aDN-wl+}t%ceqmR47PBQObe> zhrLFqF$kk=S2Vg|s#Ee6>IKP2hz$ zW(mB>R{pIUs8I8tr25MeK&M(?pDJhG0DXSv0cxTKL98m=vhHp${ynp5zY*U#yR1la2dEPo7>;ie*rLH7nmshtdlBVX_J!cs!vv2kKT-a zkAY)MFenV>WqiOPOEL8m`)4$y1r+#qzrCOUqe<G60T$^Ql&|k zAroM)CY!YA(r=qxcG_)^QDgQwV83w(9d^isNk<)b%n7HQbk12y=gU=yPhjA4ij>Iz1xUY6$9)f*B1<2X5Q?=`~s&N za4CO<8_mJep~Le?ALo=9oxi(5D}{C)wrJC%7vQuZ!v?)0j#H31HcQ3$>*MeuBT%z1avG^7kX=NvOmpm3*$xi~0!*>d^M?R49!TnZCa0~9gOE_`^25}e`)kVykJKx#=_=pcn5)RXpsB3aeO zCf~pFo7CgD&d89O(rt9KQZ!5`KYkkIZiKLL5{JJGm23%Qo%c?FBOyN!(w9*6{)0;) zRxmqs`+VO zB^rkpyevK(R|i)hy^`dtS;Vs_K^m3~bCUou6Hy0&ESox91<;`flz6Ss-e6}&i`xt) zDn`OGcRQ1{49yG%B~QcSIwLoBXpKBKzTUCB;>WfcjK@&iT_Xsu;a114|8h$U zJtfhz^2E#oFuQH~gln{l25og^1bKaL(IHZ*6a^`J7zA!-g2@J;n{^^R2<|r%KpIA5 zFIep`UscN1$RZiHc#>OrdU&N<5!flxwp{ntdcR-S%>a&_ur8Rud#fr+RWS%9kOOG8 z78$Bc&w98fGP&S;DGvAQF#!|w5h;_GqgTw*=JyDF9?3qE%-}djsrXoB)5cqpX#%Su zf+4HhQk2m&#UZN-UyZ#mUJf5mSEF}Ufl7<5FUzFbUrXZi#Pc_Qhk<;4MrvvTg;mLy z7d?axK^VS1dv64BXc{b<06hpwyh@KAxZU^rrhXWjRRn|07{NfAkE`@LrQo^XI@egO zcORaY@)+^%rL`t9|8m%%WwOhKZ|XDIf?!7Mh1<^K{gdBUdeMvxTZx)7vY2Dmi-`Zk z-It+@M8IEHrfZXyiE0oL1U#ot$b-m8QwgR5dl(BOIKsvWraEO)f|wBsMW4_VB(z+M z5VC}j3p;LkOhcV$J`QQ;wlaj!n`RTG>mKbdP(Z)Z!)vW1;la-VK8*l?tMtA+kS#~p z=TvAajcVO`&v=jDK!FTHi=sCCc;kOlp2g6J05pORDga3 z5;Cd7#wF1$Gr$%MoY^p=1Fli$t3`xlvp;<%!D+}ufi6YXL>4{DYp-!<)DGlnW?&JZ z?(}RnGcxl^RMYdyh+MK93{VCN#68&YsCynVx_W!PzSkOIpUGuGBM=y2G}5Fcx?|qk zovZL)nB0#T&Jv5u0UQ}Y=BM9zzc#hIcI-INF~qEiz8gQU0)R7o%|ed`S#Xw90zsYO z+^ms3clvt`uU>6iyJ`2511H8?dnD@rz9HyI>*tmwNOCi33V&YwT@7}W!56O%x$QXi zgI*+>-o*~7>Z`~sVj04m4AT$FHiU)p$F)}N;}Gm(?UP9jgthxx3GQuVp2qEHfS1Mu zoBAiz3JY>kYUR9eFdv^#kmwW$-AO@>@OJ!*T?62cWM|VL%`>m9AsSf=gATgr1Uh{F zLh*yVuk60nNrUZu%n!k^{vHwJWw1M@eRRO+nZvI8mA!;ITqkmb82?8Kfy6MA7==X~L6 zEPVvLel1vqk2M(7@Ka^HcCCE1O1yL)ge2O@!uvzWjk>_!v!Y-G%$gE1*vA-*Nez^l zmcl0P>(0&^HGNJgHo=k7yT(NdwbID6>U~-kkh@!>&YU(e*RZVw%SzuiSGhp=)aCYD z>ekUq^BDr!jNgK9+hoy(OV+GJA)#b@`1EFg@tm6M^qD~)^N`Uh_(#aA?LjC4R-emA z`ZyB9v`_i%wjD4Zv#!(ChuRq-P5@Km)p75pgy;8pR9X>sZ8&KqMbo?(-n@OvfQme* zsxUOdg5v@kE#7>_mwUzKyDpLT{ptYMeAf^>f4ia)xwon89`1&jE|1ktRE}2*yz;-iO9_vfKmge2 z62tnu^X6vf&Wo1v#K)pLu2AK=Id{jaOgca-XF^tN4bJ*gOtzQWUwL?XE)AYe?>Q`VVy=2#QcLMKfQa3z|9PAG7>Gzhswfp3JTV zqE1k|tJaJ|oEzjL23jZTK8;<;c7oNU3Rh;dDbqlpy#Ht6(wf$t{y)K5BVFEOl?0YT!%Ik-yjW$* zkND<&7v(CC=8s`xi+_q0%YtEAKdnN_u{Bcou@lFy{_oZ`#ezHb7jE zX*ctXch^%I+|BWGyBV5V=tCa$EM`{@AwWX0gEw3nc3gCfYGywf26gypkr^kGOH!H+ zDb#tB*wu1!Y=gLj{T+V)(sZ8y&)lWmBv2Scpu$~$sX2awY{1Gb3|vs)q0~h}tU>AY zBa@Je-MWt4Shi?4|5Z|)R&XwGGUP8g2lJ%oLGer6Q2k+LkhE`&mDaTG^y>!@l1b4^ z<#$RI2A(3UdFQ^RzO#2#xto`j$x06`1u}Ng?}mYsk@wNbNU3=;3N1-jPU(?4Wc>V$ z8d!1U=Pe1#RtGo{#!Z7@9F5l^QqtIi_YBiQJL%gwQlrvBhgN*3aeqGQIycEXBk?HM z=6GY$GD3qCEdRM#u#8UXgd1EqVqur86D|h#iS!4f0XFjBaUr-e8lIWkmz@gO&`Y`u zrjYW0YEL30EbE5BEk;eKR0ox6B;ViA@eje8Z{P&#b3vZ0KmInk4g+z3x1xJ*uvO#{ zxf)7rsCGQ_L9fvii5ta9OV~;`?p)^BOaHsv)dR&vGsNJ0n`fg=0Evq}BF?&@JOE3~ z>M9ZXdQxzP1>3H}uS*Vbp(m@oH^4oyT5W#SaGTt436KGGhX}@n&6Hw?b;>G0Wl&Pp z9Lhpy`gT~LQu*DN$R%c`ZHP#aajG@ERR#qJ&J8&e3L-j7 z%Q+i}|9o|IlO=WSc9;SB#9GOW)lLtP2zhpPDh-{%xMgs{vL7@!Vfm!gFs-KgXv1-n zOV6j`QE4-iw#d$#xsrx;krg751`;8|Fga-?u;lY4pZ1pe4b`2=TyjJb ze_+(vON)LYnaL{=1YANCFSG!B39JBFQW}fDwO4tabwAn zEb`Bdh4hBpBMVtL#i6ZcsB0xFi8lZ#c(8&t<4N+eAdr)&NqAeKJ_138qfT6-C89`b zuvIRH?c`q4jOi2yC?G;mX1tl0qF(ydUMWyge5OD<3~nJjQN$$UhvLHkH4i=(JMecq zGO6IO%6GDw)L~|)10gCN)?TZP?|*2gtBzI9NYh-?eHq(_y$&cMxyM%rGzafjCt}oU zu@%;P=;+7*`jqI45*~oZL2Kbm2&_}}r6v@u%BTqs@OGyC-;|_^K$3o3#2s_MlV1tP zBZQg&xgDELvkYLkkRu@Yla&8k=|{m8=mn4lxAU2wBM_yS*x(Tc=ifeYY2DU*I$@6# zeKKwTn`wg`Bta>Yun+xApF=c^XlMxmU*Lep0Pl|Bav1LY@HyTP3^qeS$n)OSE5WWq zeLSI0_UtM%?R}gQF#}q4%I7E4e6(tm8G3q@(vaF|RCy_Ob!C}3eud$~u4tHuD?lo) zxQ!y?C$r|+;u)1IwPdsDPr$k3%_fFD*ax7DJK0_VW1`Y~=H&5^m+)aEdxgc%5S9!# zgC`kpf&_uGia(#!a*XZ^l4@~xJ?zc~=Q`pCK<7TF5fajrA!YtdoL9bk$XA4|FvDq< z+A#U@%-`RuE`p?S5+EHd=%*PRNG*hG=8QO#zzIMSA>(i&s0}`mx=|bH9ZGnTCgVjrAo9;_n_CKYE)g_`ST{}ZlrewhGFv8=~7bux9 z$+WF6m1$;ZBxcCSVuf0~-DcjkH)fkzX0ajRCvRU`V;-vvI8LArK6I(?W$Md~0Vrlg zFQ6Jxr@&Fy^eq`xvr%QbK9N-PcMn{5m0myICq+g%GY5Mz4CKE&^U|$M4q(on35P;&vw*wPzWy;1G@9I+QQ}QD08s}T*>hh%D@+A;y zyyfg{V)WYtb4!13#86oV8cxM*b-pud&oH-|JaB9dX@hu^p)~~#1y|V=^?K(~0qwXx zJ~gQbI&jE^d9YC(00hLLFg^LQzt`TG#a~-SnrB6I25##>N^$ z1sjwUiMLyU$X*LcE$@UPsc=72Olsldln<9k(UN?9NmT}A@tOpADRH69OeeCZ6E2Qs zM|1Xx@s7!puytT!8N7&%ILJxVraDHr+L|U`6!P$i^JkTpb09F0x58op5**jCAX{MW zSQ9JJG-8!VV(Fr68k_YWr-*l-3Q%F7tN|vG$5+0jsR9m*L7Q=&Q+yPA(!_ zn0it8>5-Jwv~YX~y*RsjEIG=J=Ia;uQgMav_`9aQFRlu1#n?Fi)dV%u97b|>-e>ua z2n9bVVaK!+pwA}v@ul(A$$euZtaCQ$DlqA6cf#b1dPK-Fy@CsK3z-yQJ|NR4Ehh>r zCnjN%Npw%43xUGEt|4qX;Nq#t@l?RDS@#!VQ{yFNBRDbBz;X;DScwfw1N_f<=ZK)R zUgoD?;?Ni>$crGv{z?N$^N6bR{PZfNBHaSq`B346jI2nG<<^#R1UWe;j{l92p3!BP znt~V%?!C2x7qAwMjctz*M~FuHi)m8w%YxwlZ`cGdm;qkIa4+XLUB=+>B0_o)JW{4p zMk^4~3e*k-Y6nS|annwY8U;8}9^vP1oL@BE*F7xMEl?bTC@JJ3r2k>_XZ2F+Hl^ea z^c0f|LxG9%=%2}us)n@O!Ja3b3V}T)cC2&3*o%$Z?@i&Ed6B|BeJFHaA7UsF5)jfy zx{LwQKs^C$`J5;%<0j@ysA*LH$MM3BHW9zMDv=bHQ~gH)YgAUtm^s@ykP$=DCz$j#`UOTz&U*fCb?tCxBCKCZ~mKX z!Jr&t5RuEI#FYx^t`6h_$9fR(2Spx_J#C*&McjN~WZHnX=q^!j_x~%}|94foxigI6 zX4$&5U^ib1Ie0n$J2)e`DlR`SDHLu>3;!ju25Bc|<|j_S~QcfsWCuQqEf0!?+`Tkym9gD9Na1Vo+jI&L#|@HLp0| zn7mn$FHYaLJ7M?LG6J#TnI7=+e8_s36Y_Y-c2@?@P|~ZbQ?vTF33n?=2^m;k**S1? zs&h96u-;n`){k;Vt*1t%#oM-epx%7-pU8tEA5y&Bx$X17BeS?GJ3pqV^;VKs4t;x@ zCR0Po4m(FgxBgTa(F1lWr!ym?{Zo8=I8X0oKMNUofVcI-EAWJ9v%ch@vaMDYIO|*M z4d*CI1dRzvH`V{1lRK-j2SL8_D?)lUo1n-hoCPRlAX6{iA|fG@kgA;wFN`Qx5I36k z2b1G?yDIm#)?ke5Jc z_<@kdKL0NM{qg$;v?ESdfGMSSy&qoT7jURyi{#_fM^G->xt4*DqI4M}Yjz0f-+*xg zqP7u%C>|~w8AcR?@S@wwVo77$7$184=3VO$`gx!}V;9HZ%88BJDeRBO45xo9sR3gc)HP5bDHGNa@p%0X;X*2D7SgQLOQNG z6O}&ha!@oUXY-;oKG~9bB|zFc^O7~VU4NM{d4rtuQJ-7pmm;^(>q#pdTjZS9(`R7x z*nR8!@|tORMAgAgfbPBYxS(iG#`{jp44|jd`I5l6t~{~E*XbA;LDtaed#YnNM8DEV z&jjavBU{PXvS&nur#~~+-(5)^PBhXl$!%}p@A`tr{;N-=&ipo5xT{fnTkfj4Oz%IP ze_EHWz_4L<_TEl%_MA+5g^mJ#5h-s&Q6~_Z)N`k)56|<`onnd7SXu(b$u|}1p?B@7 zfnMQ_lbP;pQaLNG5NwtpBv1WWqD-bm1EOpbT(ZfyS#I1s2A7N(H}T-M;r1x7wnV*! z__*2n>;n=4e~GTmb@|P4yXNW>EP(G^4asnyA(sH%4Q;cS;}Q(_8*+h&IodLMVD)G5 zd}~B=LGzyL3(a4_t+}3Cw|mZ5wvIQY+JKL9x(o#BHB2(0%g{&NhD*T1*JpfftQ!&j z5n=G+BU+3EN|cpd6E=jU&&Y(5=xV}XNLmRa&Ta`&)M>wIg za~9Rcux7gW$NJ}_20ypI_3{OWDNGHC0a8N5D?PZ|**gIw&ERH?^5)rpM@N62JQ6u4 zP%Z5^(&G4p(&7aA4~V^k2Z1agkpw_TgxQ8OH#Ea?^pm1g=G_L}@a&{uavG1~?-3dA z?F5kijj2OW(#D~l$=_s?YFqGHT3|h!_UEGR^SdSuGv1w8rwG+$`UL8ftrzc0Z}`{S zd|Qr=Zq5Z$?|;-rv{FFY7bXY;Ne|ojd?S1Vub^6iR2yVX0l-Tx=LP;7d`tQTa+n%# z_MGJI;u}ry!V^RLdHP9OjoqygCOTMMGzgsWXHW?-gG4VAw9#1vY%3BL*%L?*>%}cL zkmAEopmn-Ux`PX#FKVW*DR3o^g%{==8ffUE3dG8Om_(p;A1M=>|EkE?59u1&h0K_= zatgu)7HTu=K_YuPOoFtVr{v2<>I>VEZm|Qzq4d+5LW4qtSq}e$t0>boGt4%eyb?Y( zGBY!pz)cKg2Log$mUUG#q#xe~Sw9Nbp+-PS$xzZnE7g6tVn*|LBt2t0wBy)Wj|pQ0 zlb!$eHirxhi0W@o@77^^25x`6;=_{ClF}P?7)}kK zw0+UfQm~PsAApbc#$u%|O41`-KEoP`lSs zx$b+e&V<>}yAe;_7T%Bj}(ORJHd@8 zAlJ>*Pef=hlHQM(_S>`=a@_m^+k6y~RVhd7oOjs&Tpj2wX8aPn>g8H+mFDB?ae1Rp zBF!f&n?@XxkbNzx^SyrtCe+oXSk@$kP=fJ^}Et1@cW$!I=>k7wpZWd}zurUf0ClN4g^omkWmfAJCM{k{V zyLfGb2h%Mtc=om_N!H|gt8mLS|Gbf{Vo`@eAllw9K^#SAJJ}_t+4Vc5_y)(*12b$_ z1J8)ZyGBXboS)Vov*D9mnKv4A%Xy!oWJ__tC28%ZAE8ElT9I(NBr&;xiYs$7l7sDAiVEP4 z!mKL81YuA((o@1S?tHF4a#oVBNA%i2Zb)Kcbz)*jE_~2-(0HYZ(ek6y$Xsn7vqb*k ziy$|LCBk%%>xlzgf+<8Vzh{UaaI@7y4c@aNho#9pW?5` z7fd%#H)m16Fk23nG#->6WVZ2$Hg(;3Ojr;yII90S{d>t$=uu}-l`n@3pjP|yZSKmj zQG4x^_oVOn7ELm7jx#8jv^@XchaY0pX6)*q&rC>_w;leA#lk# zAo?1BmV;(}#?*@Ah77{lxtz&h54b;WxyIypnLFa#WGkJdzQKw)r?BCa>IOKa*Jc^$ z^HuMNCSAiy!sh{qmED!>ZRRuA2u4oUS_hiO72~PqH@z%`G%Hza>#5^*-0PAz8ng;4K*dp>8P@*!3Evj=u%P5y(2f77^qIV2MZZ*AZtO7 zt4ul(0s2z|Uu!!*9oL2Q<-5-svl~0|Gr-GbV&fR zGWY4NYbr^bpZj~IBIIms;d~fSo zVNA8{oSI2{H80Io6UuDjMSdtnSJ16XOf_+)M%Tegv9y zY_R#m=70-(XhcJgySW#69nCzz)B|-;qkH1&*&lHY9;N-RawqieQ^16<0P`B$eppVh zPrp9_1V>J>xZ@FElgw z2#@yY&`2HW|ITaZG_C1hd1u>{dj%gUrmMJ7*OH0~uxE2knZTMAI5-!-UDfN0a^g*h zCViQKU9M%c;rlo*Nb0pw0XtE0;O~26^R0lD2BlOJ0yg3-yS6xNm64m&qz`W@>${r{*v9pMP5@#{T6GN=g$MyV;PZM4Gq*JKqPVOqtxDdAZG$v zuBD$O@^U8a^cw_3+9eyX4yU^!Qo-JOe*578;(}7F7KsVMWOR5ZOd_!QovLr)mrnR2 zz*va8&I=LhpXv=$l(oL*AuXPF1Gzl#(brN(H*xgJPkjpsD# z^Rg;mt!-^BNW9Tnjq_%8mH~nr#lM6}Ubd9+B4hB^AOk#bLwPwht&c3k1bNta_7|VZ zUpDi2nT|5v={Q_6?(jm!^p^v7@0j+6#PPc_FFTo+-N^v8|5SbbwNh^0jhfrnB0#x( zN>1PC#b!wBn_|4=F;k{R7~_7*_O$ehldSyorwzaMscEH_B=rWO6PLKAjHfD~?(K&$ zN2PiCS(;m<@jaaM=~(g?rvM6-9Aw6iqWa@0RN(U)+vU9-*bT6(^#KkK@$k^_vk2G_ z67j+Vf9|esT=|ZV!9-VIdUSXaAS+X)kNt_xzD#NmKAP;~^TeMHNQZMOi14x?jWyMrPNBV>o?KX8I68wB4!d)C(S~F}7vJDYKaKkJ^_(8{h z=o_f+yWqJ_Jw(K@OV9D<;Rp0gWyn=Xf(Ytfl7$U^vm%3 z|CcQ>vPEj>1HRIdDR4`46Erb;pY%NOsY^P|ZFJ@~o=&O*EmAT++u4CW=l(ckV{MLbCnB*+TT@6uPPui29 ze-*-&eE#mvB7Jpre4m`}wgJEnG#1$Z9giWiI9C7EOCSy4>f-$(;sI^kUDG;ZoRQc~ z6t^Bz)|Ej?{#-D%%;3sgt26M)i7EFe+2#V6#N8+8Uor4+%!9$pP}1U)XNG*4^{gF~ zgm<6$2_?a;XDbO*bfmqqPILRnSaa3tIwhAY7J%m@Mu|8ft+txO4@f7c^ZvYG0{=8p z8r{tmALfi5b;QE&2adq5TwDf+xQ`z(gkngF*JT&$M>8~7a7~RdnysHoN@3vjS2Klw z5hnQ&D{0}rkub^chX>jQaPiSTDCwVmBiRzk{PxPpR;};L5nJQW2t4pm(yuai%jGA; zGKM>SZk2l-1n}-iv=itFwf#C7{CZK9yt{rAdoE0%9t6wF1`1Wikh;SQPv`()VvPW` zM_s1*K)be7))aEm>Dt#72%paL*?jep$TCap=2)S44<@ujp^|E)aDNKxp?6Z<{|J1U zdOH9{^P%ZD`P;yY5zJ&tl!cI_?!(e&q(MlndVC>+>xwA0v2yz%WYym20_w^Kkf^cH zs#+=IJcA?CrM@LvNiR~zc19zr?&YUv6DAST58&@fQ*#498^6sJ+qv{>hN?gCO&9%} zsyWVx+wTm?@|pZ89eqvKFn{y^Pps@b|5~|uetk?H3h{Ko(JYV-W>mr9F-Ksxzm9>I{v*kUy7!;N64##ctlsWXu^!p?wZ}pIer{Ajf>po$g28 zs2#bjJdCr#{x`~Ve&iaPrpHF=i40vi>tbC!&a&cMXUUmUWE#z`F0sE;3!Nk1bFkdo1k5Sr4nO88&%m2W za>|a)#hOd5sqL94b%dDKj3k0>es{vDMhRh~fmu2yd3Yk2Yt)RR)I4qPcywV$9c;H2VJ{go%gql?l^e%@F~CAF7C3KfC5|ux_j}Ie{dlx|6~Q2 z^5Wq3xLNuehc%lwDz#lvjOvjLjKT&9UzMq z+J>QJV>x8~<=+3^cmi-FOkC$v&Uf+3XXPh`Q+c(^8EO{-aG)-#PWO4~RmT>mHfDOO zBu2)aGks#}K==W_c|Tl?8moNyynW1R)Smo#%smHR!*Q3}k$5sIG7u9K$sz}l-B7$(C%Q6{25)`HAT#sJdCVWP{OzSi_FR<`NFpeP%SFK|p5%T5qXjj?5!LITc6k48$$Si94ZWWZU;L zv%2hN7+HLM;NEmV0n(BE5@ZDNb-FP~k5@Bi5|*aICF@RgS0iuNj9pX-AJ?PV8H9BG zpbuJ5wSWJOUyt!ix;wSQF7{_FRSMz^_V42{FKa8Pyvq`Rv46n2?%~k@&@ey=v;(c* zZ(9M0M&XmFPmXwx$5S0{jqG@=PKpnsxdl0t=@p2G%Wo5A- zVk^E{UC0OJO86ikNETCi5{K1QqNvQL$6>)ei?R4Z&_I@|Gv_YhtJv> z(AJ_Z?A(O4p0IBVyaHNAUJ|-A*+3!u zWXH4qSjE;o97%n8&UH+kaqY|__9GRREG+lJ@21y!&J(v_|7n~O_CvPE`7KEAHKBu% zECWN=s{n$)*$XE__gBw*Vi0-<6WBsVENC>1Ji)*;*1gw;_ITc=(DG$H0ANhG&?e)B z9Jk%27BDUCaj=k7^rlA>2MQ#VyT1k|z#y!3^q79qTWS$ztmEgxk95gRLO>hJB zPFMIf=%q`4g`1yzenm^fl;*5*_0L??C-ye>#gV>;XPhL|!MEV`t8PJik*D?Y&%PHbfcj_!)Mfgd)Tt4DWeQ#{B8M6{ z!&gpPp`? zrc_8UZ?^0ke0_tb<2gGX%JDc859w&urf=DF{W~2#R- zK@-t$NT2%-%GKlK`ZbSjsBt-TAx=Tf-rWQqr|^~&l&BpIfVsF?pm(fXV>7l{e!Kga z$+X>{8MRGIxp7bM8b^)}_s#fMX3HmI*xzP#+V^xb?AEjI>=nBGhOhVj#~zwEd~6!( zSEIU24Nrp~(q^#t1~icQ>+*&QxPd5I02mMgdZK=*DCemFAPP`2Jl7PV<+(vMD$Y%m z=KQ%C1^Bw=C@o#pNlJwjpToJPJSOJ`oe4TOQJ4P6wE68B-#R(!@((r<8NLF!@_{km zC!3lPKyL-a1TavP$|RPH4{U;&`xbtgGN|Xq1${UdJaNYZKkyCh>G$fx9<_y|UnO?Y zQt5K0RW+lo&kcvP?1s3yt=$1FTc+Z&tdhshBx{!!Tof35`_FHHu#5wZAN^a&1^xcj ztV6322kf!g9JwCvt!cNF!j$LU*>2ni>pt4;uv>1Jz{A%`;5S)ry6vtRcl_=@+3ve% z)+C|-b$R50hjP61T8linL?p!W?Np#hp<*SNR-fjdPDY zHN&)Qr~mvMTy9T!@?IZ)Fa!#NBakRG2HR&}9(V$g#Kq0S%f~MuC?qT*+T#z1OGrvd z%gD;fD<~={tF&zVc{OznO$ZbQM<7vX47QdL4NoAFWT9U$GK93OOz`x?4V>(`3c6?h>=6i@cypZZR`Tt%NC7 zOQDQZ|3?N)d%&;uE{r3u>LV;rGJ8iHx==)4DcDymkvfQEhlQ0uIv&q3G)Z-ebAPDJq84W; zYKV4;i?%fGf?i%*5Z$hI)Q?ee6+<>PbQ8mFb!}kMTGyN1vBoUeT5KG{(soL_*5)B@ zI-zql$(@(I>*yX4bLaI&RNrn|%jzp(cd?gU!M9rvk&%RZcfuqXGD46C34ATm(kELj zIz!uOA4)P2;3^w;3q3br*tgo+Z}rmUZ?e8h_OPJCDO!WH$6srKrubsTZF{JnyO>(LhE+_9Wkxk=?n|E7${SmpY&SEV~byEe8*=&Xlah1(fxaq4gZ1G6P|lfso8VAZH*Q=_0Y=v69NcCUc*^z87Lh=hyuUBG!*N ztK`H`wyyxU*ihZ^0aDp-Yc@Q3(;&|k=NkFYQ_((i4Mg#WdTpDffiSGzaeoS78VJMc z9a9L?gkklL@{hNH=p0`m@wI;;Oaoz9z2o{6!ZZ+u)hnx2gb+dqA%ro;7-NjF=?D;} zfiSGzF`q)129gE_gI(JyeA+Jo&^t0gNPoClr z^ousS(u`~j?0@2bA6_C55NNeUZgQ%bfzyvqHS321^&h^!fk4fyJxqas;6{Of1U!L& zN+(03oNdib42*yD{`_#*{sV}Hi;?+{^T!wWV-x;>1o8yJ(cH$_{YRhTM}PW9E=Fh9 z=$Eyf(GL$Q3J3^{`v)?{SuxEv2JS!W0yqBT;s1aD#12T>*1*OD2uN1s$DaI&g#&_# z-R$k0oPmJk5P^UoBY=S53+a~2uK%~DKXolYs4dk);CTXq1wH-A0UE`CnD}pAmZEa_ zF8+o9X9DB-F`xvv}P8|&+PzVJs0#w=ZZ*MDbfL}U09jrvPM1Ld+q82ukd z$>dglS04zNjKCC32m%6F^z4HgabP4xBG2Ns8VduKuOFmISnnLZ2! zKwvR2p1Bz)j0XVV$)ZC7QhV&M3mxAEaE>%=a6Kp(7~~xw;F$6ZSHNS844^;jYfT(lY zAN>!QAB}EM38`Med@CHAAI+AgC^E%$LG+*As=0m?7U9ee=S{bPyO?Bu?)Rtr&8E}W zNzTLYi?lGniCcg^(5!w+Cmz~QrM#OUaLxhqfxM8WXCf#w!HU3@`SMA6>era5TlNzn z=jF6i><*>Tb=snL{AX-$>EkPc$*Nsblff}7?#4rB1shXq^WYpm^1IXOtD5FlG2EM% zy`ttdKLFvFdA`3VrGs|=rO(DfG`D`FT~FT+`vHn?6lZ6R{ympAMadaf@0k%lAz_D3 zH4;2`uiT3O)lF~Q7WHJL9++i|`eVsKk*!s@v*4he#YD5YecO1Nx50tAokUh=q`IqQ zrj56=#+5w0i0s$L&BMd$x8&RA&aOIl4=Mk@m879RtXmta3g0XLaDB^<2U(8k@~6;G zeKB*@>O*wddf=ynv@7F)TQsH60^gi+(n5^+U5z{@Iec2qS0so0pj{uVGaFQHL=kZ% za{jqi!jwO}aH1idHVrYuzB`q-w*$b0^6HwLTpw-1@U#v1L7E_v$0 zn6)Qc^Zh38vUhngC*9>g^-X=btFuo8?d!=Vyps8xdJL2fs(mEZ zWl2Z?y~i?NVHd%Jq8GwjicYxZ%xx*`BhiJpXnGji#9qH!oz|8=6;?%gj0d1;UN{^v%f5%-uU_*B-lPw;>PY(jN22SK7%+Ug9(E^b2+sq>9Xl z;d(6BpO7y6F+pBYXDU%ZN*0{;C&NYfBlxG9j6X*d_oY?4i(R48_tiC<=?}ugFhN-0F-zho8zlQn!szp!g zbx(6M;x2{cz4!7Ne3zZAL1x$$PwY7Jy=RK*foD5E<2-a!5eta6@?GToq@%}T?*Z*C zhL=N>w!4qpLD=utwVO1O%Pm{Z;GOX8)mtlM1|FF| zr+}D8;TUyHTQSY(m{OlT?*>*J8e{h1*gHSC@3)|y?{hKjSowFFMxG?W%k@#qlTz^y zj!w!xb^yt;AMk#+4J`O04tyN)*<2;dWe(%nVC3`AmVkMM`Pwrxlh4dI^(Ri(eBLFw z+JmdHXLIiHnA)L*-PdD}tFcF#+HOs~%2>5BRco7;W(}>XXtkVV8`*~Z%27A^&vLBq zD}H$Xg5(v0@yF{2WM?saMYjD>)d#(Y*Ab7}4m3wcNos6t{v=X~ZqXTqRr zF7U0!m#rplTN%&UMBSjdOuok={5_G`Twpk3#K3T4DB*BJjDc{n5Tqz$lmg6wKiPSI zhME6{%NQ~#hY{z16*EPjktB#PQ5GhMaWSWj(U>Oo;T$u?zHlyC9`$jpO~c`&sB`@DT%S=@ueo!mJcLAu);&5sC4T7!HOJA`_Dk35kh_h(v{9FdiZyArT@m{`kW% z?!G)ed`XZc0sOq-1hR=#g*(PsI7Hu~IVAM)J#o~B!j8$_!i0(dlqe>lF=aMN^(67~ zkc{GKh1623Mci{}ARtP8m{pKz3zCem;({Xc-;Fp|%r>E}G8J>Wr$p_6IYl+I@@MLB z{)C4Aq6CLAj8f_*DHy4ujKq>122dD;Cutf6d5rk#7}PRY$23iB8lE*~{y~ZKx#=Tq zLgKITG>2aq#nwArlDek*O!@APa?;6VFwb!Ab}o*cN4W&IPqlkN1uVw>8W)UIz8*1Hqzj<`99y;BEZe}H~* zem4m&Fl;icDA<<52>g|fL-R(?g37^GjZPna9gZI6HpsO91JD38K-*;4w3~bW#uUX= zR8;xR8!1?)efj%jkb7VHE)y&sPCA7|kF+O)bgKLK>{#j{9VPC($iYIeo%(Yj-!|Qx zvKgnPb5vhLij96Fd8;`>GqDP`O1!Fx%^9nI zi;U};tJ(mOt$*MaM?2(Y5C1kWpiF^sKcdo5Oi@Lf04QIue-tA@oR7%l5V4HtWfZ?i zqD(y`xnP|0DCGXntMriaUb*5@!nuUY&e+)?_l`@oGoCA78Sc5mQ~jHS&kE_;z4K9r zYkLl>n59kF`#l zFN1DT!o@K7yqh^9&8AseF6m7sgV&LIOG+(QnjIR|iR>fPKn9EleMy?oY@?Ueie!sq zEt_Q|t3J&}-3&e=t*%Vj!qciJDG#F>F5B%v)&A6H8IH8=%{r;oX6%=8 z?IW9do2oC_?@I%BqddYn0Vj(O=O&({y3y>HQywdw>!jKgS z;otrF^z`y-j)i^jz4<@=^-fz}nZG*yw)CD>K<))t7|`7DDInxPn+PyO0=svGYLPpk zx`R0gNs?fE;F5*C@)~Ak`B&v1Q{NEYYuo6_C9ZQL{Jn(apJv=IqPxT zB0EKK=bTyabz)NT^){M=l6+?OM9Nkzwa{kanj5&ZL z4hd~C-Gqcf^7L1P#z;%_pLfTV53IY&Qq!%5Spr;;I9{UhJwa^xnDKp@aYFiJx(t&? z&uAi8n1sK7Tu_UsNClL-fWV+WrKpHVVYifGyrouAbYqvQOc#|}Rr7w=lTT9%3{`&7 z;h~<_jg#qgx;V1+_xslOHyuf$q-k!`%DUH8(~54*)SWi$NZ-Q;LCIbt&Pf>KAdqiM zFT@>Y*db)-1>kC6g8P@KA|5^CM`r9{v-@Z6r z=eBrw_{d(Hl!W6lprO^j#h5b^9DP3F-->B^6w;l8MJFF2ADs}koug@brOggy+q_1D z_j*6L?Dbl-#?n-doYzspBI*R!=1NWdBU`ej)jX`BR8878cAMi+kYhzh^`JHrEq$}8 z#fH*VM6$9&BM&h;3+e}@EfIR)V>$<{p|Z?dgfK~cArc%cAaV^1{?EL^WoeBYO3y|| zON$$QkM>gqK%4QBKEzLNX}-Q(bhX8Lt=lA*YWo1pP#%lU_7KDm=skBhy-g^F`9d}Y zDiP_-6>0rSqEao^$iQK*!#?2e1QV+BkcKhCd>#mZvcr@njknf%#-@R*#d-VI!cj%C zv9!l?*{x#m{yrABDyCdgwEy|aDRpzzX8|?a#-zbCdCJOTM@LtMzo`5;*lU2JXv^R)=N$N0lwRaPbWSohEHl#eqVI+20PY(a|8JBA zIV|17HuPVGI-t#&qwCOfVLpw^_b@i>;M@JCL^dH;^?4XM1Kq{Q)ALrenvoOx^9M;C zyKThM4exgsd8MIO2oDa^+)8d&Qn>bOK_mF+rww$~K-0Yyn|>a>QZQ*^&S^VwgDN)j&(H3A)jfr58unq+D< zTy?+nS#~wWusb(M7B=FYKI^P?ad8GGG0fNiI zbPCd|TC#xA)Y?dLzL!D_F_A#K;hAbp?a5rQmfTWUWN~NctALZ!_*p)*p>HKGP2Ct# za`j6{S|y20n7(He|Q7D{_;S7p-ih>T2mcIb52vq$6M7XaAN89V_P)xnJ%K!!Pmnt z!bjK1&+mc9OUm!no3CnHR|Qf*-5CFC=DKQYON;Uozy$nW^vLZjvke75pQ~2T&_OcY z7Xuj>kAQ`Lw=bV3A;>ec3|B2lo9^MUbX&fZSo}x0R$NyKK%-G|sPRi<&bVk;Y9<~P zTP(NVWkR|lwldaI`@4tez&eJVd+Kh_UMvd%A!24z#dFfV(iywR1--c~<;p<-1GA^d z6!7b)UmT<)}L!!M!5@-v+kx*VlM<4IXb2}%0Q^;L~MYrEpb+vd~yH8iH}+ZZMl8{nUi}NOx&>kvhek#cqh{ds+U4&V(FN_$!lPr>mt1; zMV;>F_f`g3P*i4e)r~6To9M0St*of6a&-=E=_!2m?EP3Y;52`m!|jfSfXsN`&AsB4u7Q%}cXU2uMRXWh<2oNW6*=>g?ZHn18~NCX z;0+S!Kx_W~vWFf@p=o$zMi8iUURp|h(tWd!(Q!XaH{+@T2Y=m9MOew4pO<+;cwo$q zDJ(*Lpw9aEH|3z~O}o-QmT|&n=4_T`;&TAv$3AUBwB}S2&Fwj>@}eUw?B=2_yx%L!X)?f1KLPw%@D5`I=*tiaF=`kM_y~yY#bAKSwEb+*`cT#=aK!lY{h=E|pC6w6J9`OfK#x+*o#(a&@09#A@<#aF zK0AoMMSh*TPNyZ50pcrrz@-`N8*jovj_T4ub?>Bg9xA4PvApsuoiXRJaJoMM{1bYZ zN8S=z8@Y-3zTuvVq*X;vl#V6MfB*01Xp39eJ5ua1{GGucntkK&l7A{6>7JGGp)Ss8 zFY&-)L2LRb0&lBRd9BVr;;$RJPA};LdNJa9H z{ici_g8$)wK`hf06Vt*Lk`#mabEH|x?9X>j3PDo71MHCn-{V!mL1#C@N zcpo1UuNBY>ik=JlezvebQKERk<*Usz?cu=?8N+W0Dqx164v(H-xJBc>4VuCETu#*i z*lvhEo|JJqXkbw08AdpU5f9dG;cVbvpxJXob4VBB2-+87Q7q3o*A^k3GK8s%+-J42 zu$s!J^+GttsUbPF(Pj-Ka(}V$vC1$N)H${@^*u2SFzZ5}8B#fsE@T#AaAA;XLZdJL z*gxAxU-6pOHE?UY=a$2(nP$jjE{|m<8*jO3IkDWd7}hn)n4GyK+qZ(@;3qJC+Uqk` z$--H7r9HdF#i`D83ccT)ZEF;CFimR%c@Iwnh)6#n2eeVb>*CzQ<+U?*#$R5RD(|n_ z^s{-kmk=Wdc|2L@qZ^CG_>;eESx?^;mOSb1WTsq?F^VrItI`kiTG)nm2_V8;;@%QF zeC=D7#}eZ|RHX3<7E*CIdkY2we47EjL#dBA930+3jl$J)o8)(;#Naqs3nUB{I9vdm zXL`s9{_(FN`g(pU{K4g!+a`d@(XHL6*YLN)d`7y+dKB=p{qKhCVK7C z_utkau>eky@R^8A{gfc|y%uO=*j*|<0r@yp*DgcG0uWA2b_xZfMk+&Kg zeJesy3bTIC)&aYdf-Y2CWP9@EUx0JZ;@7PNw6&>G6}c3#FTU@~XguMR+TQ#K$VrVK z_Gr4bSDAYN<*rCBZ67m~4_*<_bu1aVj0n)jZqcs*viR$Fi&;>Fx;oJW7Y;)Ue#Y;@ z%Vu1_3*Mb?7z%yu9VX|mkyG0tPQ(ii4uWU&cqe%LiLP<{{1eE~?ZsK8>=}G4{R>8X zk9(&@GeZv0zG+D|t8(M|D@|cH$8wu<=#l;tx|eY^d0z+hqscGJR4w+F!u;BCLki?e z^~L5RlgCs&?yWf$N_brMB#o>G8(hzV#OH`)pb7>VZRF@fc&#rM@Lf>IU<_B&98>y)ta#3-=os%#S92wTMvF(HPb zs`7xG$EWZ_GyX=Qne*x>_p;VmIXpL3jHB;3F7$h_2XOq;m|gz`sWriCvwxwH9=wtA za=qDTKR>u!6!l`j_6?(PAn?;26oPCxj8P`#BQ%hUo{i7%-?WYRd_HM3YutVGa1Pwh zR}{nUFV%{d>M1A?#fpO+C92TjkAN0|-iJqys^#GfAEp;3a5u9bb*NQM#?b1Z1$Y5; zH}020s5h9+)LMcLiFey?k3goSan?X7dkO<24T))$Ttl6P99xF6vo_RNsMlmY3a09A zCmLvv9lg2%THXmKR7mrIA6qh^NUJdHVXNoN1dnH*qBhzNPc4Rp5 z5s+_fLpd&8{pMZnoQ!$ut`DV^w65Vj`AX7U2_*-LE^jhSvk>x+MwDsw;b=~ z1mLczRL}*6h}_{(hcsCPD;{GGxvG! zS{M#-y_&0??}U115t2I3u{|)#E!E(8{t{GC>k{X7F|EPdh<`5pG!wT%JAb>oK|`B+ zYJJ{e-EjYeS0E|LZTY^JZIEIjPmzz+OUa8=$?Frq4g(~Uxi_oNeaTofQpg&8|{f<{u1qBTqTC@6{j)2Zr~Q1UL?lk2Tqfz$cBZ{ry*Uq zjx?i^_EO7HjG_BM3g=j~&GQ929&`XI1@olM7c+uF&XLxN&&jOXX1B>6lV&RAsA)YQ8viK*poCaJBO*C#oTQH-<`HZ$9iMNA7#a}B;$EYAp z2Lsw(21z%R4~TxtW^$;VA*uWmA8#X0_mRMepA<8rArSZV<wd;#=&=+runs+YE~H35pzarjQ!B6Xw}w8h=@>j!((5s%*E+4B<&+U+ryOg^+kI( zdMww=JsWlr?W7SGc*aE5DYm?ZqxHtK@Hj3aUjK2d@kv$D6y2$iE5!0bQ4M;oTnZM- zw@o7b@EU(C;YP%27^Kr`pVK4QJa!m++0Sgwn{ycMD{%Q}>_Q#=^UZUoDY>V5NoLn( zpW$touOMfU`BP^(J_Xz1CZg-M735gc4YWvhOE_*p6q^liN%DZJw9x<9dNW_ev%Omg zGS13v<>6(K+D*{1#YRkH?dZ7SE$5gtCAG=xO}-j zJ>0co&AMV#2L8EaM~AhlsL0j8((2+2{5q@sc{`*tLDN9f)^qYuvTnF?e)9Etv$sb# znUS@oPd6nEDS5@5o}7)54|M(2#=0i)32cq~0eT6^S61)Uu^gvxoC+jH0<`;IYK+}AcNRy2)}MdH=t!SR6e1udBFCxxSNdVHM?G3a>8?wJH0tGQC0i&4h4<- zqPnxbnx>$X0+eqpLw!zJk-_akTe=*8Uxvoi19e5i6UO8P!+8~7(6-R;+Z#VD9E#^hvcA?n$aooVL$d9WYCmzkJ-^j8wBMHB`2hof_1N(_he7zFTKjA> zF8n0k3>}Rryu}z&$YglHQmn9FMDU~dxDDOMPs^o*Hg($3&xIa5pP2roD6;0(PUUWC zYcnc&Jz3+d`})amwz!-$KzoIkF*JopLiaHc3}+TNX)-XZc?nk5%WO+K5w zM^e2gZ)!}IUedutZCFosbQTT%JUMt8Q$_!P@GK|8^ums*thA2|8+Gh$v#(Uaq8q_n zy6kK5Sd~{Z5||B8b8<3JPcFSm_$!ebM8pfMcJoDcge#mX`}ROfKd0H@9p-9s%FVb^ht;n zmCiPj&O|F*1!PVIyE^b^+SPA+Qr3t--bRd>=Qg-ZXH{wBQ1jwhbq~@CZ>g$osmgq9 z?0I zD;9sy0sqcTw&M*~#@;e9gr^GoV z7jwsX)QwvT1}vDUD7^TwX@-+xFapJV7miOlk;pMGUtbT8xVLTl3;B)}+A7KMjHm77 z)gFOABR)M+@V^uzt~3?q311vSYY_ZiYfcZ8%^DWgcu14|L3-$lo6*o)(ELKZlROtU z!1?dhaVlZXLnBl@wX?wTffa(OQgG?_)!A2iKW}eud2=Q3Fu<57Tzlb7BX!B&)%tZ* zKA)Uu;{V2iP*80?{cf_Oq^9>%_xk8vE)(uRg(ve;vjDZeTLO+eo81s`hwUpaHPrdeFiorQ`35)?qxZWSOODNiG8_}Y;Wmv@ z{xg1ch(z85E@C4e$SRsYcW2_*c;U)ejqkHL47TZ_3&+sdI3 zs>|Pks(aHdydolXkD9iX&k(`2&=IB-UKg7_xF9W*6)r1~2Urzt;VCEy<;31E$XfI) z#$t#XRK=NqO$Bp@(Gy`rAgB6U&Mr*a@>mQly&3iw0{3lDZcecDP?QErNVgwO8C z;Y1m4jyraKrFKyukR@o`dK7^i1zeW2a|%#U@T$Xv_a6RwGTK{>cPWQmBp72T@6z~f zpYp+@d4mx3J7pPRd2U%0{J=jM5ezNUfVDN+y7`mfOD4w+`q&$00TIl!H?6!+9u`BR zC#PC5+9qu=m&R-X)C=XKRc>oX5FGODsc|S4{jb%YHQ?=Cg z3c#<(LHw2JZ9wmB4SIjpx&}7Be@=%yH%`N4huK`NXouO&CE8Qlh+Vf2op*v)R*nb# zZKl2NQ&5et=XO}_{Y!Uvj~G1MQNRLJ!X*Z}_pkV(uiG2pJ0>i5(#u9ged+pT{14bD zN#SRPzqJ)&=SJ{H*wUxE?tU7VJ6pssWH3wQ-;ku-cazP3A7%B?M8>ov*znej+`}UD zi&kz+KrMToQ5>IV^T@`%hbW*NI1UfYT24I9mvbIEM~JzbU;FTtYo23wjBIT@@!EUk z_w*Ep(>2qcqVZr9QbiU^SvBGNgsOemXsLT_bxmv=Nc$F6Ps^rdTsE?tOzA7=thD*< zJiUGUKQiRB+GkrWJ*(@44+XVN={1(QR^nUhU9V+jdVUVlNN_h#Zf~ zX5|EV4uAQf%`;=nlFtc_T>m!R<>~yk;Z~i)`g@XVU31M9Q%xHcTZ3Kn!a6#BaN$RO z-a$5vB(oFDsK|*)keX+YQdy}>$@@_-XAhfbzd?3|F8bH=ezjGw%J5V0j>4Q$R&U@Y zDj+Rtp10x=bBx zfI*RwuO7#RivHmv&6B6Qbl8lWOOtf?fqDY}pTF9|kPn~BCMIapwh9C=CWFG0iW@In z1b2~li_f^=#udt5Blr`PH_>*KSuKi31a@im6U*V5xvGFsOoZG#EB1uTdl6l8@jLx* z3{vnQXTyVxF1|Eu?pk~z;>QAyaactz5?xpEZr?E8p;PXem}OO(M2JYC7qKA0*{}Y> zuV%@1UER2cQ*#}3O10IG*-z?~m1TYRTVg$B{0G9Pw!#S?^mO`t=u{)oF#5Neao0ob z`J?4Md+Lqotf3Y9qF1FH>GsVs>sIp%)@`S;62Kd3%mBqn0v&q|3dNy^UuN5(Rxz6b z@f6Iz3<3wVQ6z#=f)HtP?fNobRgFYHpYe7rs-J%9rvhii%h<(&h7Q8wemj5py8RS& zbbPNGV7bwDx*J+-Y(ZpF11WDsl2Zd2qOz@>JU+LQlDq(nGYLp|J2<%C)Sr=`Vuyjm3dv%>Dzc| zrxscrLtq^b;<_S-*qy24N6Kz;st=4MvEi=!$OArs`N{cI`vTnWIsIBy4q%Zm6#}E& zoICw}?1^u+PnJ%F{N)Uz{#+wupV{{9T9E*v%<4gkTuQ4qVN73#d-$8)erM5PSqY3- zA!E}=qc{MKaR?kKtpdYOlFp%f5{yg)MYJuH?q5j&qNt9mm$2S?ZSe zqFE;ot;+a^La>^!@~tkRRQ1S1;zT?0!-fb5 zu!Vo~5sajD3$8TjCIt57t41RA(|-`FIn+fuEh$z=X)lNmBtsAHp5_=DG6ETW$+kM`lC0rbc>+nyc42tYW6P-%)@@4trm)#6`O6!9G%nxcR_{ z@^7K2&4v6o(=Q~N8Ucj){bUry8yCH93?0)AFhIv`5O57Yk9Rh~{3f>kaDl@C6a1!x zfRzCT!y)Vq@vG?1Jz~eruaD4t5i)@s0|S#rM)o6k!X(jvg7Hf8i9KaRm~&Ulw!WE* z!qk~^JHTqCG7e(p=OCcNA{~G0nJ^PHw-Q)S2s@(FrYtJNfJctsjk150t^}iJ)M{?+ zXxFw~;^bE)L#P}tGCrj$-bIBq1XjYe<&cZKow!`vj(?F&NzazC1lJQ*4o;}lIfj-)H*lM?+9U@~mK@gwp%Rmew zF((mH1KB`}DrQIj7B)r|@J6DvVvIU;k}S2w)zBx7UTN@5OB(z7>OYlGsX`YjpWb^f zH#vq^Gb3|MJBCIgskue5z%=T=#Q-CZbi4nG_^`jxqbw0yV8S!5_0v|3Tv?y|O873F zqdbj_yWC0FuCpWW=^TV#L*uLdfcLEDVs}jmwWH5I>?wCCh=T4UsX5;g6d$4%3aJuA z7DhD^I+TPzdA@kPhZrs~i?uTE#CnN7kO;UtlbS?k&@`>AqyslgDk&p??kE57kQ5sG zN%&o7|ISi8ffZ}8K9_lb1xwZ$qK7BXg@_xeMj1ou^H?{FjLHk(z_EpH*F1)EKkGr* zQH%xMWonbrH5WYfIUv$uXXrHMxddl?q6!>u#a`qckKy@M%u zhNq?D-)wUp+>>RguHen!dM}zW|Kj8qBFYmjZy00qvfeo26RJW3V~7;Rd*!aHI>1?Y zqnk9nNwnO`@zzk7Q^3~{*>}?0b23vzgYc=Iuu04<@EN;@Jt;RNNqkQm-gRup==tO~ z#kWMRgLaP1E#?ArIKArCJ<;qw-2Ce#bnq7>7+qh&<;y1F?YsDW+fUul|Ip%bP>qFn zPfS7IH0Vnv&0zR#Xu27W7ag9SLpR@d)al{Ia5&LHd^@%-yv7|l+)7p}Pen-Z-m|e# zMF%9%3xNU*bwH)q%tLrYsH9OnDY_Uu%ADkc!VYnWO;wLZ|4Hb6O(=hX#v^RRme|?B z2ZqMr&(wT4#A+#3`iQZ;FAqBvAH-2EPvUM8J{%jw3wL}1Gg+o)FPTh9Ii&ng+w2Lc zxSWavF*UJX3WO1fnwm6B8j@tgtRl&XQ#IK{GUvrab9isTvAGCv1L|l?Hr+wb&b&>} z{yRi2VNpi3(|}{_+7J~pEJdP%sj*hSE80<;c&`NEjBBwT%DvwYvQ{xotHD>FBc<4d zsl5mbK{t&H^Vk4?a?c`xm%z3#nOkONApvJrDK{&VMKo@0J57ppk||EV`!JA`;1%#s zEQI{vm6g*s5pAHx{qC_pi)bK;Gii?s5)pZHpYBGJi=?TfX2QlSRv&VfqzTf| zw&ZhGSNl$LJ#jg_-WdO?qy@dtkGI4z29Skqnxd8ha#zqldIER@e-`#4yuy7vtKQai zv!iFLv=5a2khbtBYn4W_YlRRuk6_x4TO~h)5>6W(9>-Q01z|MN`_~_XKKTxr4R};b z9=Mqma6%NvKk!kD6%LNn{W~H5sgU;|vvqItL9Tm5Tr&Y9xt8SOjcd&e&kK3>MoRI0uL|%HuW{ zy$%IBy@FPA5;HD-feL;$qwnhi1W^bh;GbHB`m6+ zWglrlOl=gAW`Lggk+N$rf~$?h4nrLUC2wBtZv`s!Q-cnKlBaDB%i!nT+-3;+(eWS- z_2A;0(dPb|q^PJ9qzE%92K?q4e$?(UM?I>noj6ns(T{SRnF<8FIc$uj4v@C1sg&Tq ziv2P>@DC3i7lB^eI$zr_*rc_-clfUR2}bHUyrNvKC(N@lpC!6tLM%>e5MK|nRUB2Ixx2THq5_FAXZ+?HcS z!=;QO#WLmQd1YkFaqUNC3u$4k8y;*6w6L>&|aMjE0-V2?{wrg1Dh1aP??YwG z3h_1SpD_(Zr=HglD_O3lbd-x9tzEtnD^;7YeaU!cvKmb0!6|HsQobVX3X@SGa$#x` zk266tfq^34SJpqpEIhZqk-=a;5wt`IZKJ_uKwVK&7qh%Fs`7#vv`PUG+!K7HUc)1SK;9-a@Y2YY_p3gL<1vsStj7UUeUFqS0 z?i0L67nwapmgG-X@Ccimm##A~@<>2cFgiJ1Qu&sNCsGntm1HDhT6rTBew^*qq;%YB zrYK{=1J-vWV!DHOf2%#Y-6I@4WT?>E|LVQ^5-1mz7$(VHvTy(!66!a8=6xx>(`VI! z2tuYO1NjPR9c{yVP^=lnB$X#+u;eAMIzj+;t%*Csm?^h0Q0iQg+a#?QR*!`i*&C5; zsB{b`Mm8et#`6y#-`b~j9^9{74B<%k4POZpXJH$}=#)j-W&bQCOKC?CQk!^~YgUV> zBGz=Vf3q!t=z{yMWkmKuA^9USoO!xM*0hX^TR)y#iS)ieV6~Ha4J{ci19_K@@#(|b zcVbnysguYr+ud65&mqv!b{5y@2*SZv1Nbk`Ycmln0SS9|wFI#K8&ZLbLd-YpC?AyE z9diWD4*vT>h2;iDw_1&xQ>=iFj86LqgwMT`Zx1%IX7}>FK_vv8d6>_13YK|zmGUY z1Vc*mF;HvbjHg&cN$rq<8iyW7J695aKAXm}Ev3zpcu8#HA)gOWpCIM)Q0sv`%Wvk; z1E(*ap{{U8YRJ$YizF2q{j4s0VWY@NJ_;!>Kb=4^XlpJ#jJtjIb2G<)!NDtJ==|eM zrB8sDfGaN;SU5pB=N?qXqsy~AVa66R5+BEaV!k=9?|#S8uMgA$uE%y?gGje9h8g9l zmUf?NE3IhOtzjoYDJ#EQ5IS?G+-_4;7gPEHr)NEQ;12PxTZ*|_Mi|Q+ZgGhUoikNP z?p^IN2A2=p<3!8bYgLE+Ti>Gka~d2H!mrNjWT9DSr4kotWlFqy3RP2Y&2Qz#uOTz3 z3d6&l1f*MNwe(B?jM7r{+{HcGIiMndoK#qW!viVCKPWBC3qK+(G80SPvZ_U6zt|*M zRW=(79sR4zC$WU$YgoRONqn^1PfNLH2~inGb&JF2;ZrQHP3%oo)hPuqiE~K=DiW|A z_mA1e;}j@82Y>5h7S=f63qWtb18MufKB!^@ar4kPob~3RX*Fqb{CBv- zbwe8x2HfZVhl2nk)?trEjB}EBtxzd!@?~db6fU$>Q&AQUwm_xY-DtOy-IX(Ih|Wq) z!l!H>I>|>z7Y$#~pflau4h{}m_~gEB9ZN+{;%;42*U1@EwWh)5}{xQRcfi~vDt@%Yh$laj( z{jtO0;8Q`#H1%Z(mIi2{5oe4HhIudH?~(BkLdK<MgIO6DD2+gjgrpc& zT`dJr{$Cq7c{Z!tPF06~3C)=6WC-P_=^`#ff6KP@Ly2L$_$~A%d4-I!I`6|oApn*@ zMw!r$Ihp@hx3Ey|B}nZ_0L1B=oQw9O@Yf2|&8W5IEF0J;NZ6X3PydN zXMjK>L>+Rt1Td61%cw(kVm-e8QI)VRx8z(V##zSc{}Cr~F_Nc3#D=I65Wf)?AUBDG zG%ciD)&x@SMJ}^wmX@Cn-%g#!*u=u9hR8n?B_B4Ho078k7wXP(6}5WVtKjo#8>q+) zo;sjl*}dm^#jW6zx&wluV;`NwYDsU2_vZ>ZpC-RIT@%d*8ep~`i^}^=6AeNu17U|BSS@I2z+t+jE1 z13Q}@RHmSGaVC0pd4>w+*-O~&gX%^40lcT*MbfA;S=Ga2wfwwu9~?%TZocAAN8g2K z8fqx^ogU>oILhI>UIvmFx4UxRUntQyc0x`7~JCmjMP5o~k1PWoJ~BJyjs zx+`M%s%)u=8yC{+3AGar8}p0d6Vcav1@OGU3i3d8-G7<~mwsQXFI!yxsdF2O=z<)b zfN6)Q7JGfhf6QUY$fam`_#U(Mdy}}sI_ZFydJ}R-I^1ro<D ztGp#>+Z=Th#CHjIoR=r+I()g+wQH!7t+8uiecA7D^_km0-h;hQ_WAtv>vP}WjW|Vj zwI#CqX02s1BiTep%y%+K9d+fUZ{`%?&N2y7ey(MnW35loa)=Vgohgp6a16Nt<_L`8E3*(^H|Oj@Lo7fWe^Jvr5`{eYln_w@cq zJXLF`g)ou#H*`ZE#ZFJL@{&VT(l|?h?2%NIQuMqNjhe8TIvS|yN>$tFo_K3>Ynfu{ z3=8Q=dL?-A;vvcwaVELgoy%0rKAD+RaaFYf`g4#=NXRJdAZN(7q>y!&L$}ruk@lk; zyJSsS(7JabBmYiXPC~8K@nBm1*#h{=V?dkz_#b^{3>&V2TsHHJ6j?jR!xd$GC6vix z_k=nUt{&pSF{LpuIg*7#AA^&3i0bojdu44>3?jX!HTg%rzf2N^ZnGk5_ZW0tIE z%uJ8rn3!eM8E|98^*mPTlxw|KPR#R;j`K{8e!UoKJi2DmZepZIC#~9?uab(>&e(}7 zVbEu}b5*U0(zES{SObmbCtiYQ$C-iiQy&^-wXP_5{^6E*Kp9TW2q~{CQo%fSK8gen zQ$B(ABYFpDh5^g1xNW^U{oUO<(ORcas*p*WEe0a3NwGSDud7-LD#Hgj&EoCasbeE2 zAggI_3v>c-{RIza?bdv{*v?!UHr^3tU|nt_BO^hPMel-jJ55aZ9bb~(ABU~0fA06< zzc9B_r$*3)=474sgIoC=Eo9w@mWn9AHyi69dB6Vg3?z9deP(6(_H!rRd`-tJ=SOsN z?kouh0IJ16&-VS!?Ar4?7qnOJKCP~0ud}8fZhZ`{sxRPR)m&gD$Hu~iUe2{U47Pf? z2#MK-DbB7HrekNB#j|Gkv0}vWkV)f(Y@aRt!z*kmUb8ofZ5oO`PQ@wNd}pcnAR5l~ z{B%A*Y|(oDLhqY;_}tksVxx~tm!A1oo)Hu+oDFFxdo-s|-6GsBp~qs`1T!+))xgG% z%gJMbTqxwvad_Ofw=_YMdXV|P7-jz4Uvra9H$>?-ny7fk@siKozW6gwAd^moF<>-) zQA4*exLg?;d2sWWe_>QPK|L%pX2OBH?zT(&dxU?vVEth}v&;^{!pfi{wr@auA%z|x zH}KE=Gie#^NNAlGsxxB>MyjA4(A9Z9hdoN3f`(bZ#UQh&`x`Zi8`kG~rjb25%kFQ+ z+YAo<0GIuZLKDcep^a#JAA>9a@(4IjLF^nB4TOE4mFVg}D5kqP4ShOfy$I@{i)dhu zzj$x}kx5GtF&uxHc|=>pnO+w$2Q$L`vT6uVP=gd7R(IqKq92GU z?V@<&L#ey;1lNc?OcCGR2Zcyjd86(LOYYx@(*iJagp=DFbo~F**i{DA)oj_|5Zqk? zAwY1q3j_#GAh>gJcXxMpce}W|yGw$*yI$O3_-5X#dGl|6bf0zlboDv4PgnJ>?zPv( z8vMg(0$|FfSvwFx(H!pOd0@PEz1})GCn2-Fs}@7^re4TD-v|1t{QizFF-|bF+YTHi zxa7e$F`0JwhE2T8wyt{sJTkwnFEp-q``CciG8c7A2PvI4BpUss!mEo9J2~FExJA)W zbJI-IvH5Y4tHfStI9CQ1Q&Wq4I9X1MC~t2rB1{99HGZq24pvxBmC&&dSnj9mFRd7R z@`EnaRePls*mAo(Z>SY~bW{D_1#)^C0HYA)Iqvzb7U}xeTr9wQ)GfR33@UZDadvC0 zh#olaG&-zsycEBrtsz@`?3LVl$nq2tdpzC6phz zw~h;Znih+QPOw6lUmv#;ylt$)@`ghFh8Qo|WYH6R$n&EG?wxWd1y7m)G?^RD3G#ux z*|L;6S#$k8+7mOptjgI`?deG-Mz&{~Si4!CK~jrBFA1WA zvF7LBxrt8q;*icOl~byLrv2BEUVT+0fUDfE5fNvy<87OgawtFWy*g{3UhhiD#)+iqL!H4;?U!Le;zSy8_I=C57m%hg+v7w@WK;^@xng} z>OM4+JqG)2Fmq{Afr=+;NL=d;)U#jEF8dju^n(%qt! z6Oa1_w^ce|)GC7bMGS)5)Z?7~hW)xPqqqKjL#v4p0=}v6koAQt;JKJgal>`NCuBz597` z#k{$mfvbQzNhAofY;2IBQ1?|(k%p1?H`>p zb2af^Mn1@P7821C0wxCqb=gn&uO6wZudcT29y>q4R)m) zaI=!L5k03cNON0_5lp;so-&r#CpX9L?mAXORz)G=AmSa;V*OVgshisG+3rT~+00TR za^Fg*C%>!A5LFd0H_(l52(;FJ5kx;3is2Fj>&yuag${XsP-qC>blE((er~2U(R}xb za^~t)t@qVMQZ#{Rs~P$#-D{klkgtkSu6O7nH};!LZv!7npb)66$$s8K!3BaU?3CGi4$pLl<=ej~ly@E`=}IVUBJOC-Z*^+p5Ak+z+U^u0HBr0sX0642b(*YjJjjlGS!-AZ zTz(8Lb~@bag!&&94@dx2tyW7yAqvYh8$c)CHN(w@*1Xo?TpYc5yK}DdE9SY7bL7_< z{`bGUz3lH5&H?eytrO z9daH1Q-mj#5ABz$*r=;7u_h08v%GncJFOJzjggT@)<8S%Hzyn*Gkt>Wi|o#I=or(B zCzuoNvWMymaS-!%LplSkHlZl282N+5&Xuf&|0C#{VDLuPU&ZP1+({s}d4*WCGuAFw z@$FUC|MA}QL0e`$$?>M09tK(ez;YsxB&{m?iXDcCXXb0lGv>AIsMU(E_XYYzu=u6l zS5(>VjhxuQcQ}{bh2oAgCAXnEep24(DTYB~#=h(>QP}u$FV-S~?6a=M?i6&5kd)Y1 z#9@D8I(|vkw})bJ8vfGuchbmci~_EN9~+&PSR0*#wDw|c@du|V&R5`7T`mN;_RDFU zS!wXINdfN_nOC0#`g`o-kT+Fs!sFKw%Qz;9r<6gLNI-cDFy4nppC*>b0G6^M5!)sP zvtMu9fL=ZJhu^fQQ_rQj9>M3*gQ>EbInXk0V{$`7V#5@JT~l&Gr|pI>>&2?OzV*}b zngF4o)yq=+!GWWb@Qt9t*2_~XOk;$b#v|cg^VFpPCH~cqRn>1G4<^4^iod8Uq)~3g0`8{X90Gq$ zF-g2Nt6N|{!e8}jXgR3;ftS&-e9+PlO#BjT)NZAA-BmAqIyRzv+W6sq+mLjR$=cI-GFkcO@vbf_?56~ zIHhWZ#fq5AZ-8F~SBr3cs^&e6-JAtdD?8BwR!v>c4?C#026sqXoCXrs4>V4^UO_+@ zL}|WsT!Xt1V{jpscdTAA2e|4_So-k;o%K&t3-N-ZT`Jkus;;bpX&NIp>AGFqXJ-@n?>Yh{zNi{jV*th*y#x>`rRGvL-x;eT|fH zp{|k+e3dR+gxtO6i+-Kw=JqRo8Pkup-)+dob*Ix~M)i7zZ6xzZ$_tIU0vUL|$^`oHXWB+@5$ho`$Uz<)NiGTfZ6TS{Y9YTHCzP-U5U#?J3b#8BP*)7|Pyu7QTzK4LnPKk|~JNd``J#luFF0g?pGV z<9dgKfry^?M@uI$iurTz4>S>=ULN&#r!dumY77hxi7&fIPJV%w@XYYAAEX;y(>;lH zU${#W83Qy+XlLEKv+;Lt+(Y}GJT)9*(NPWt`#l`}#!(cg$x#Mjt5M4%fuE+_T1QC0 z${!dEx&-1P#Zd;<%8zFoYIO%cB_(eFgb0v2Q4iYB*Mb#lQ@z-NRL=l46Lj> zv^%t{tk)l9#~k=2(TTnG&E<)Ijay~;ablHM%+K$6c`BWi@?c-M_9ZRDV1o-r^bSwCAQ9CUUy$x50wD0<5-DrI{sB_U z1%Yu>L^Jwp=g^1?HscO<0T{cp=dUUv=Gvhk0S-ezq~{+*IQ-q10iK&Jsd6y^4jtfW z^s5aVL$5E_C%7#gk4S4kwcelw{Kmnbr^qdzy|oH@-6l)c2ayxX=r z7Y@cZO5NePv*qKg&VIHNXpce#Wsp>@Ts z+Gl^^tlD#I&*B7&uJ@a%_%?m9qyi50jse(ME30^bHV9tGZd1RinU_eGT+dT5n$Jxb*tm3}Cdm?`C( zDP@+b_|NLF|3p^mo3&vVid4*>HDMQxRN9$!VHfAkS5VvTMuEHB!HSX5`YIz?PqhO`~m3i^5%Q2eDceThg{= zNiW^jBT~{PI5F~_WHxs&fh=@oh}Sdh)-!m*)(*nfoL$xqR(~&Tr6||3sHm3lN>Yu4 zes;h*NTFSBtt)TqWa%iCw#NJOHn+a?w6>|Cl_KfwRU*Bj%%ZS_BYQglS%!$aZVCO= zp*o{_IQXkLG|?cZW+a@suMIRW&66bIx=ixN(bBdJM1>PRgiNcEOtYf6cTyB7ZDeU! z^m~3I)j{tu{P0=`v|y6$43UX2V-pdPT5^u5RL7Ei5oczB4EP5ujRWMp2%Fa`bI~onv(>wc>mX+m|jg5EBD2?0%tt*Pp{0tB|Bqt}& zBgY9bp$-FkpbLITatWaza?|Zr$MpR-FwpX8{p1L73^^N^k0^#4#gGx=u=pE8$O_HQ zKZY=1hAbn9Tr8aw3mqdj6h8dVhf2>+5jwOl-J2dC1AXSE-pz^e{||t`{dG4cMpy{t zKY_uo;j|d`FX6Fl%yHjDr~Adz@FXxPO!dD0iYN&6X1k33_V%}5Anid6^W9{d^w&%N z5hT{XAIGw34R2HbA}S2cXR}TC7Bx*S6a~*sz8exl@gLwb_xIi6n0%qAe}G9Wkv7`L z2g{95574(ZizK(4usCb&R|ZQ?VG+(4p0|!`{kv&w)iJe=!G7W2jaP7a;SdhYJ`Avb z20poQU7-#FJ$`(MZhi=ierTOS{!0^d6GD%V%t-G;)YG6CcAFrGhpZ~g78Z(PM|!XY zNjl;>MbT%QPDcsplS2XY%7-3OoP>#j99Gc#dnXcQWW%iL$&Y-k1oC=Bbo5xALUCGO zA#_}=gd+BeWrtBItZ>+)-avigG9_meN6lvR)sVSF+JlnGuxr%=<}7D>bd~c0LRWC7 z`+3X#>N^tIC(_=-U?pZM0IKi4OFax_jd&ii!WIVOv}rTU=cL8+4fhxQiuyg%Ffjr- zB8^!hK{Wt+xK3-PMKyYDJTb?2Ov@4F*+X${0|ferA1I=uqjFn|vsK;gyMJj(Yq!K0 z!kF+Cn4s#IRq|%@Ai~kba9e8#(*J<;(P)vQ@w1qSm;mMv)WY90q0~%Hm4e)nrVNY6 zJK0(7*9k`dC|Rh|jv|VHfU`0}Xmw~pe8-EE99jGLEoTd^&;x`R*2KpHGm{Dq39fi^ z>_mYG>T4U8fwtfp%(1WD>9)(#Oe2(@rX~%CZE3eehL*{t%avS`m7@!B0R3E&&xch z9ZX(QPTTfHEs1x?$hq!Pj-TuVYD{HR#6np2akJWn!Psu|>*!WM`zZs>LV`JHyS-w< zfc5$DRlDo2I6T78kGByA&x4g~?Jjh?T2Y z-o`Wo-P6FAo@m!sFNMk{v;-U)S3A>qHi?(Ij>YF(3)C;C8_7 z_#a>4ERtm=hs)}du?re)Wv}{|iq8t%d3I`h^P~QWRmvU8w>$mCKY!(Y`Kx)WuJ>y@ zzhLE|Bd9*o9Vk;zsV&_unF>@?QRGx)tnBQxGryfb<}Gbfx+q>3D|=*Hbg7zY{brfH z+fh<+pzx@nn-|3x`TD)$V5S*m*~I23pTRO-8>>K0w^SSOrZ5){m#Ex<)8o#^TuQhu zJqr(;{!>^Msio|=!ODfFW^gN?ujgJ4%wli162lsrX8-5*G!5)-BCMwoaB2MQrTiu9 zr$)fGVJI%5oEO`rSwMgBRnw%%UdZw1eY2W!9M+2%6Ov^zItt^T%Sp3h-h?-y@MEQf zyGP3#^PNg6>YU^+3~zKNO;weh=V`~h$MbV*znei2b?Oy)vsF{4GMLle5^fQ}$#+c$brJE-7iyDolo)Dg zBpaG|^GtJee%C`v!-+fvd4G4>i2;C`g~|v~p+m1a)NspWxpJbj+(@`ZXy@C3-Wj?< zI&vn4M=L!&yH{((k^*7myJP}}bcqc;f$tnu!2T8li*r4;!#i*|Qxs<`26kuL8)WKT z($t7C=bW~KaUH9weY`^O*!$Bv8b5Lu$~*iU^9yD(<{Qlm z>%#$<(d7;KAsJk?$qKI0C4EDFAx(Ie9ef9Z)gGF_>14?3knhOrqN0!w-aVw$@qzE~ z@1!qOT*h(D={V+F06f>J@fhG3>M=!7}*_PHN+Dy(Q#ueWoSH5;uS~ z*=y4Opbt@coWuS?vKi*1xBI3@{j>J6*7!x)L&w(z)8y$3WjyYtvF0WsZNZkZkt*`8 zq^AYB3pc!_#)Y2Y#x)awJJg<4K}Y(7C+XvJ50s7omk&yUp5Py|auG_r*s+{BHCCSc zAa!Ur{jj;g{$Gi21O*&FE0Gqi)JBb^u@^-B1Nh^A%8pgL?U9ueYxHHJt6!^`@zWNb z;+#u8|58`UaQof^FDa>|-`p0GR#55F>Q_y=CJB=u+13hap?E(J$%#@zC5j~J z=Lo0HlacvN5;Thga^NtGQr358RbA0HLT_ye!kG^*-)B)a+PB72i&&nSC7JZ3@1ja$ zDK|?sHLy(ET+(4!IFRe}P*?vkHequ(#xo&gxyD*ne@Ev<9}bk-S*U$zkg4-GcJ|ZK z;ar5e^Yh%apMAx)p=w54MLvhP_j@kB_X2-fL`C_%AT{fXM0Btep99q{xn%8U?Z42? z*v;63zvR5-XJSo8vl6tq$oZp;_2x;`;4!S2GFPig4?V?@{*&9t0 ziXVF32i4!arAcNd>K|ctZ3ly~G*L@*KLY+o~Gw6y~`b;#@#{DY(0D6Ws<4 z@Oimgf72EW?ScV-LGi8fH}0<6hf)MMu&LM99q&=%T%E{=jzsY5p^(WSPC@GzPe_9$~!r&yVm`ZSm!!R4Nc+i_uCKFB5N= zyO1|-_~|EmlE_{@@TAF$;gQyITx(AMm|}+>qiW$<=`T-{Dkqu9RmRVGLpW~UodG*; z+^q>4L4Q~zs0I?WEsr}6bqhX|k!|GVX%)1c1QC~h~ zzzRSLKnTDH!0Cneg;b1-SQs+s(awY*^U1XV0unJ-B0vhy5l!)#f#uvz%ZQGU%9%b& zRGYu401myvQ~(2ksMVpE$CTwA$`;{a$ImV6(VC#yZ;ZhzzwgWvPq6HW#fo-@?KRIX zBLVKLkH3Z|j2@IDAsf^0%i3qjxohEKJ;e^c?6mf!U)+gKe2UI#YY()l!a6^PROZ%6 zg!9A6fybwR8N*mAg8s6he;9*Q%7V_8d0kdtIaDP$ zkY(L+h$}GFkq~YPP=ON}l!jF${B)BqmfdwBgTrskfpapU0y`y6tlg&7 zARcXqY&&g+AMPs|ca0@?k{u2Gf|y%0AHM8N!I{CFWIz^UC@hs)7aKu_L+nJ6eZ33! zf=YMU=3K&S&df3D(XhPBkGr57sH$jO={6H;n{`Ihul%n_XXiNrygdxngr^YhJ^Wzq zb8nbcgmXw|fA{W=O`r3N^_G2at$UXa^Y`mjb2vsH+#ac$TSFTpB9K6?A=f@#U(Fwu zKe!D@)#|XS^iZo+hB@PeV8$(AkMSn3kN<`6!E*lKUVP|Ny#pCFjDNR|4NPqj4wP~@ zMA?8(Fs6i(ywO*k`Cx{ii%4m={t!^s zh)R^pVR%Xg|NZiq-b|`q*xV6lmuncdvNCMl6J}Ky6|F!eS4U~q_;Vtuc!@;kwenD; zt@isF`C9I*)2Nvk>*B;z7IFj5nR-5Y=J>Um>{Ts-LN$o$k)!kQXT{L*jgm6d@Df0x~k7e4`q zI!?AC!A8gHf~o)O3pI0rgl*f!h%V5F-1{#{O27^wcchT0{$kyNU}_VnXy2h8%uNX} z78i8qq-vILHq4Z7-zGfQ=PYCCvrQNgWIG#zTSY20@ma!Be@r>6o4jyjrQ^1l=}lq0u}8~)g8Y{ zV*?L>%KEom^R9z2cY%Lh`h=tS3>JmG_zV_=t@sS)g|+z%=7eSV3}%J-`3z=+8TbsQ zg-Q4fdWA^<20e9sJmIrFs=Ih8vNR~+VF|6J}QT3>}rL0Ak>Y8#98AFQ5or2RcyJi zY8gnSkG%l2f1jXrRLLO%!W7lBHWhPgl-Suz8Ea^LX71>cl!d=G)>WMa8<3NI8`Fy& z3mK{H*Hz;?P!AVLmb1v|JYm=V9Fh#VUFhRNL-sF7S0kUKN+VUCK&d>6L2DQqU)wLC zwp~DHE1$$gBbD)?iBDN$A+eq7qe@MN@;Su1wx3gNJDu+GSJH#19$~2Y*P>V#(QWKd zrLQvRsOcj1gnySs*&5N2Bl11%L^VVs(9lT5En+B1hV%Gr*{GuC`~N0KcMtkPmpJDpj3FDq0n^^2>;K#}?WiQ4Mfz zCqL0^On7`_XRw~W=Tg%@qq3vDb?@{7mMwUCECHRTz1Ji*PVanc{k6TcdA+;{Ni-n| zNzTm}qLEQsm%!I67i6^?{pDJ9SQNPWNqXbIBk;ol3C2$W@c(CG1b4G;s)32PkfMC@ zH=$i%G9WiTZ9r~7Y`|{H>#tAf8bN&szFLYyy{^wv+`{0G_0*dI6Uec zaJEfMWN3S=DxGI&P7d#Rvh+&bc z5Z3-a6UTJ=>Q6kPBgV3bcKO}*R9uvAf@dvT|APzMW>jnY@3w=WpZVTzu0%cWR^H+&Fje>QL^&J-HWp zB`Myxa#qnr`tsKxA^w9Szs92yAqbQ@JR_4wUyk2Zr*GxTkPrW}LU|eh%C%2d`%7Q2 zw;#W6t+pf^ubeg&qnsOgpK`wgicZl`jYe92;LR&aJ~MckzBtuu8%1d}KNC9@cdzT1 zm|vtXaBG`;Bc?pBgIhenqHG!i1}eSjIv_UcCbdXsYr+zTA1vD&-(KjU5 z?tNrQGWD#A#2qP=DA5c~LfU<8NjPkxaZR_3Vf07ATOPU3VWN7KLkU^g!#|QO%DFQj zrSC6PeiBEF_(*+}>zL6c088V*cQXIpdJ9^&V>Sx<9K?T_i zlH5OUL=Hr=i7s@FNA6iDj%B}IGPG!gINpb?Ip#>MF!T8vqKDd_g^*f;gk#LdGc6KHKn#+qyHU-|pAXKSkImd?AD3x4JBr@v!d>jP?%*;7tu+B0t7rzg!^ zVOU!DvM+3&lbvW5R#4cw;E)Z!9qH-HW;;GhHjy5m*1VsW7E+`^&^NsUI_JXeT=C7F zD;yh0qxXxR)qK2;5$o9w^%Ki!Xe85e`6?%wSbdpio-?(}-q)K|-zjTfB7cU`u=_iB z!KKsI_oF@D3mDy>lk)mY4Hh<4I=w?a|YWrxrjL=Dt($^%YdX0{QaAcS} z;Ze^D|J{Eb_z|Q5MR7DyY)^K9fyf-gjhXPrNEYw+s0Ye)NT0s4yBUrAjWbJlaLI=LblOkd`= zapt-S&3j^r%Hi%p7k@cJf^o$G-e+l=VdtZnamdijJvTrh8N2oy=85)lr5;~I6gN>v zxjlVJn&OVUiC~!fEM+U;$xofQtd{kcMnmZqW-MZAL&;MYj`*`4@GE5KsnnKnwV82p zqN$K%Z%bBGc>v3oX%!PwH!n%VEB&Wa%U^grf{enZb*eyMoCp`}S11 z5&T#&1o_{`r_v2?9rh3ZnB&I;KRzUd@(tdU~J_xZ*w_H;i@WWB)Mi_QI%#{@GD#Mns6g6}hC zmAZ5M7V~mbuyyD(3HN(5x1Ntko?`q88?l_J?h_Dos{oUz6x5XbeM(7UR(#3V$)t4e zrpp(NYtm5-`|Bbtb88mgPIk_xd5@emGXX29n~Fy=_Y}6-&L7|Fh9vqLGj*32V*&sK z_|Ies0O0@I0MUH_0AzaqkMDo`|6k)56H}4J!D7P>jJCju)&MgA2&Y4YfC^fW3H;=P zj*tNWWCJ1rPJja;01bu&&mqCiJXLqln|g3^=LS%^^@Elx&Eh_BBaztpBqc_4^KOQ+ zdj0$RtB@2Ol~I;xvkML^T=Sj-ZGcGDV%8QGy(>pmB={E;Gkz_WUI~m`bBIARhFQEU zkQVcj{p`k`c2A*>KPO;zTMQDE9Vkd7!>s9W#Oa^kpQIz^Q-rjF1Y5^`h2d1v*Ksn< zVrf6<**rm14hC;O&d4y`zlGDdZcj)-g$X0ySTrBG~Nd*AvAcwub%H{O;K+Q}37?0ZpBlwn=?i0fK0I)#M)DIcmc zLBwEpP;|O{we+<0>3rwiADpV7A~HM(V7)X#0mi;_AHJm)@G4fa#ZRC5#8!q zVAMJdX9d~l8^u zey&^&<>dZ7@Z&R6;&)sJ^B6C<3z?Ck0tSn#^|wB0;8yf9G%=tqLaY^OOeC4_gi?aB z3uzhy0md8ZRkqEN5-Bgy_Xm0%x#j=nhl{^}n7)zj3DVn7ZsoU)tt35lM4fdTrn0Ey z#Gag7S)CmcDl18d{;qEK7rhTQl+jkO?c%^dCXyKxj3ZC2+uHK>CwF6R(#2~&>K@3T z0K`o>1iEEaIVxAkwh4~$nc%+R_cf+M;FVpU-|i_84*>WF?4_oZkU%vPFxKTyZ_Fy= z48F7DuCdC_kpb0tv#pIlg6E}Ic)mHb*0hKBFrMM_MAj$^iM{YD6kG1MU_fv4YPe7 zL-+gDmxQmn;@3pFBeRl1F0fu<@RrfQ>-mkO?&GuUO#8-6})}Wct_4sA=OM_s8 zk~O}?tXn|#S~w*UJ4ww70Mwr{2MZ4HVh$`1=nVo_gHNu`h42qF-yM3lm@7Tk$3yiN0Ns*lgq%6Z zs4HP@7SriPeF&(7ZzbKca@ijVg`E%1I^ z{jp8fMfY~R%WE_qGS7c5 zE--I3R(Hs-^ZcT%hqgq$T)l8qma}9_wZby9C~UyCxaWQ<(D5T{OrOjRAR1RgZ8gfg z4Vdi}Pw)!UYSKk^DxVmmg$A|k(>Z3q_K)y~X;b?b?x-Lt@F9Lt-R1HwQ<|JqbM7jafb|Ccw zES+#{2V}d1tz)DvVGV?v&wv3ro*M)P|ha8FFtEQQkfcNW7mXT`OSvMWDo5jUl#MGZ@isYY1e2egJ(SIEOKopn|JpRE8 zAq2yqh+v{BiVHU{AOffN1F;Rr;RGeMgRnn9=p8bjqyd!%DUGXWLCKg#yEB3o zm(K@>!Yh?6xQCJS>GoT2yLklgI*AmwyN`fYjXTrErU%pi!AWA6Smy23_;_8ZbgC}6 z6hWonf2kk@Weqy`n-URWo|(u{10a&$%$X1{$!kVGl6qfgXir_#)0h*t6?j!=STXZm z#=u61Efs4;WsW(L$!4`!=Zy_a{Q>^Y zP_{FpvMh1M!%hs0B>9>G7T`#e7MmOk5N8WRuowmgi^Sp75*cGwU@7*+m5O@Pbk>|_ z^ad6zblw))%rL1L8hgK^AR5_FAwJrx=(b$JLs4u>NhT?VBU?aLDHdfFD(%U7h=tAM z%Pu2n-7QxdqZJ*>hM{FN;0;W%DNPvmGn?MQ!*o2N3~#ulh7*lQB~vNuQEB54VdUR_ zPR8A1LB%ZoPee=d4|*W<73G!|7w4E58R?oD8|$1L9WIxPHR5%AKVYK+g9wb-V*jwF zkOz`6ozZAC8_b4MalN;@PwGj#u21*U10qO@3>Vn`2q|EX}~e z#25+XA7(~LH>KEGbNYMC2_(@m=6TWi3*AEKdhOK*fsh zuS?@Q^3(pAcr$2o1Vxjx>d)jxwh3U1Te&!88KE8lUYSFLJ`I!j>2k zi^ZHcWCWwE_n{m&MR!vfxlmGC5huTdu9U0o9UMtb zvggxd^lmcAF0st8nD?}!+I1b(dgJ*#$rE1nWwJ8ycWy4w@_ISzFWMV;*Hc0zc|O`W zC1v?QJLf1*CuW7O2}ZxSy8p^T^2v}ODLvATj2SKXY#(#!voViO85!Y$VzY&IwQhMT55j448#k31w!`LRwCC}4zLB6opy9)8gYu2Pq<t?Bc(u!h%mcwZvs>RtSJ#xg}0cxjoGz~{eN#k3$jXhSLPQ2xA>>AS2QCKNj}>q;*qD$^Ic;Q^)2e7f{vX5-PY-UqR<6lWBM5{B zmlTZ{6?BA@q_o7;-5t`iT@RrrDzL@eq-!#+g-CyviA)NYpiS$sEH1 z4WSc~HFOakJb3)z=jtR9ksmo5q-F1ln&PSJ)DOfJMksXE{^6ezzZkXP>gVf4MP-Ji z#^welL}rA>6#NZe2S*l@4){veNp#o&^og6L^r9kmW@E zLv7AvaWN{ivoSFJ>O9;#Xdi_m=#)R~D@XcTLJYi$k=sknfqkL>>G}G#QucAzU1~`t z{jyU5wTuJ?u%j6`>vURv%F&WJU z|0juW9G%LByGmJUd7-u}L)fBa*($cFwEQNTIq8@Ue6A*o9or$8kz8O+LHkfcd`L!t ztdxr%RxSMVLkK7H!lK|D;wV(IrNEd4S`IC7QZ)$s53)+u(xFv@Fl{@IYrOEQf|Mo6 zO0@s?Txa#g8uFLcWdc=Lr4<5IR5Q!PWJ_iVIUz3 zT2TJxc?<~&`8!5JTRiM!mn>dJV9a>L470Im6e83K<}gr15d=XJPBcWg;s{xD74X1? zMBfkil?RR)@$&Khg{42%KL+PzEW4(^T-`7QZ^dKkM@a<6ji^`DC*hdqRgPp z#n{66n>Sp*JN&IZ_%z98Eyto4X`>)|Pg=EEiC1ua0cq$X2eH;glpCMh6Kf}YGKxYE zg)G^id)zaiB@(LpF){4~=4tBtXhFc8OZ9W_sxULPsO^Guk%hu@qH>vnn0m~lZ_&Lj zH8+g3v8xK_zv$chm3MN0ZWlaidK_r<0Y^>4JX?fD)OfH7H_G9=qMX)`J-fSh^+h zmN@r}3Us8^wxzIE+~5K2;3qn#V7A<2Zo?S!XP zR#d>6hQUnNArENc>-Gb;IiZ+yx3xxfG(begKy-XVVRaPOzd=Da)kG2G)u`K)Q22pl zs(sZpJ{*NTct*3$O}rE^1IRDk0?V`&1^rAoQWTjihgzBiqH8N~VEN67G_TplsU=!; z$YL3ig?^XmsUoHkO;IvXO1~-+dYq8X(FmaqF@!=B{`^pc>$6%Ndf92Q;|h28qmpI9 z$>>L>6=_pA$?%502xbSarG)@1QXX~tP`$LX^(0l@`722@s>kpDLVl`2#fpFE{FsV_ znXO)2oik2W|1nu3d9OxCPYfWQ;wJ71IlgQTOEY13W6ULVyY=y1gBLDt@d*5mx-o5OSQ5LBJl@mM#~x( z#HMm>H;tLc8?B<+n`1#y>uk}OY08|x2Lv^Yc7MC^W1L!8Hz-1!z(Pfc7-0uj|vnbhH znFvM$=M;HiEua{qAl1y@h(n0UzseGXMiD%Fa@wE3D_zD*n{4xe@00da+B#G(`O zLZdx|p$@~CRHobmdY??j)XQV;p`Luh!QYo@^hE#=k}qaJcOW+2E6kUE2yMBQ`?+`pKay$WTdCTkyq zz77)m0rUlR%ZPP(B##2bneP!3zLdhY0FYjv0^@+9hvu`WXsPW7BE@S^BVzC^-f*CY zD(13hM|r8~HfL}Aay2nx?^dY}=WUo2rfzfA1EI|2N>GDUC5B9+NT#F$Q|A{$S`DZ_ zlkJxAOD2T6?9G^bk)VhM*58pOK=gAkMqoKkLlF*+t4LE0=yg0gtdk435J~%b1c2H9 z_|$T2qK0l~oltBSxF{w=9hSH&GGPjU%uWE=EtmjE5sP)7NLYiq{ELQF=)fZoKBJBN zb_p0z7APgruDSDidVC_%+ce`ur&!Z#FTXwZNHc<>F9m|U&Sfef3O#?@vI!>h(dYiB zFbwUi58NJsCQPi!CAw)7uA=`w2jTiU*`nWM zRMYX!^CF)f*Qv2@x46*rgx`=hI2erR7VPbM2FfsED}`W3~M8 z@5GL7s8EKs9}pwb1`OhwQj&lO@?_5x(Xs03oe2t!Qmb%4Y$Cowp~Lc2 z(=4Y3A|TzF`NwqAl*@$6(x=l3rMi4CI=cTk=AoNI{J?Z1sKNA`aKB(q;6hR&;^Q8T zew75->Ga$|JRVar9v=CQvBGI_ppoh{Em$dKnY`ui3j0J*CF8%hLq$(CMO9UI#xs6= zZCv#F-9+aCwEoA3?#LIBa+g_`=b@Q-~l89fiq z*zU)gp-mjeWyY}_heb;L?ga*##qtS1mkiA3I888(23@X?Xw5j& zEB*doY#97|5$d0gZlHhz{P{3kY5)4m4uFpvx`1y^ZvZfu?$4ckVE}?WMhJm$TS$W- z4<4_k@5O7iw%WhT8=1ckm)N-+*L|HTnzU7G;;?}7hQmSIadsMZmLqgls~UgZGHr>N zv47+-=I4y14*PTIX3JlDuLbA~?~C>gYrk!|3ut&*SHkS$OqLyfgd$KnFlW2bu&Sk- zws~S)qkW${{&!VhlYBKhRD(p++gW&7cA0u?EuO~@3PTDb^HBwj1tr2G!lQ%_3dcS5+Q4XA{V)bmhSM^L z&xjEXhPK^XZuCT1?_ze#L0}A1(H|HbdwUL>rxe0-h z8}PkvMR^(<8yxK%u2+jiYjo5KRMM^AQ7T{A!iG<(R2D^|Y;AIyEw+hOl_xb;ruZ#- z36=qO%NexFlGf4|!qg~PdW;6KA8e&EE5}Szv~|^uKYM0h*b0_UPRBOZTU08_avv$_ z<{2HS+D0X+YTAZ9umP^En`Y6cVeDZ|&0=hm$&1)K5C9u60MAqa*Te?s2n~b}=l}rg z6ABA2t;jquOvPCRv`5mj^I;pIK$bbl7@0&59_4&Af{po{6QlRWoNoQ~uuWL0;9D_y zW#fi2La@Tzuoz?(3**#p#hgUmaA9a1(i&vz=5|XUFo+D186-RsU1bh_!_m)I4Z-2= zp(#|wRkWJ`1@C_F!T$Xa*dz@+(u~GrjJ#Y=!d%oEri_TpXXLO~LX1OmppyqWQJWT? zYfRX3uys)CPmW=Y`^PaLm$ad0n)zr7_nFBdMV5pwU=R$mX|}E&r|XkVAc*@dk7ZQy zmds5mFv8krB$}6#oro30))n&cFwz6xZ~ggLjWq%eoVBX8pbh`&%yq{^dZD0yrK8g zgAoZMW^YkU1nL!nX?louFd6q!bgv7X!N@SS@~QF60nJ^+FIdvut;0rDwALVRLE3KWZ;#2EV0IF$NJ>JBVTS9RJ*SW>L38hB-GfEQ zO`yi-zpDvmHi<-)ZU0h6Ql5<6%NGm|ZXokvejkrNyti66o#myMCU>W&O1iE5l>KC< zRA1H9-GDMVw>XW8RlE;;)jyWsyt{hv@Bpm)fHYWpy4MZy2WvQ#e6=Hmn0=afhwzOw z2tyI-(B6%wggnTRegZ@?+hK9Jqk^}L3{ z_ZzbM;Aw(uYhBen|CZlaY4@S|4qe6qclbEATi8ewZzL0#urN&&cGY$c?Q7RFNyj#E z69Y#RF{5n^Bb{tzjmJkNo}c3R5eXXv!|Kh6tN_CNF!=C-1b_^mubiUM2ELX@%W>3) zRQevrl3GO{->IWq;_V59WI|#DDt(7YdhUhS!1}A0I@#-|hEfFUKTq-FRGu!JJ}grr zbD1~ZF?TTdsIhq}N-a5u&b?8Y(vbiO35kKJhZfP|W3@SP#*P-u_5E(qPdIAB3^(i* zB5_!!h zrt$O1>M{>c;CecL&D7RATwMW>wm2yah&}m91Nim4rvB!o^;H^CrvG}Mq;Q~Z)~}zs z^6*H10R}m{I$J?}MpzZQpTT6&#rrl>@*_ys_gD8$!&o$^jF>r~`C>b&t-VRtVM@(q zxD#}@!0bdR^n4-wK;6TN2iHD51auKoW&padHXgAh6QN{mXG+ZJk`AbNc15^oC#E3h z^jC_-I3*+>Mo)wjtJz8)R5}h!6lc3@zK10z)f>yiftM+*-Aaf1_aY6DNGDQf(tZTM zAZkTJ^{_C;k>ced>B%d&2i4;hG%SMF>^?n?Z6ZO)IY%UQKJDF%?xR}{RN{K)(`eYoCdN%^mFFVT2hT|eUcD%;lSB7p#G zTjQSNcgiJ3fO;WyrET}Y;BeBk3du8SDw$=|d<}vNZ~>ExQGS|{W+E%`F#3qQ_bc|^ zR^oVe2Cyq~vUq6RJaB8wm#WMfp|jgK)5?UzXA6gGmd|4#{fcrFV@&fIVGfnF?O_Px zNSldm_h%mzrNdDn2M647amQv8vK3jxv2UmIUF7eU5@DO~^gLzMt2rsNf_y}U)!Bxx zFSXcZu4qlW(pey3o7$c$Nnx}i`MCxp2m50>n!kp{75Tb))QR^?T`bHVZ@pu*nlQoo z`alScJ05VfsciNaLwF?3&{wsbsyCN&0x4+Axv?u6C`N?7jnF`jgX{3@TK%x~vY(mD zM*hYoh(=Baq%61KH|nd5nqTAG;47Ee7jo?e!`dnA56_YpRC=z#Q&JMuJHR?)SiP_$ zy_GU47sz&fO|H|mnQWprI*QYs050MR4*=_zpWALheGNHSYHN2uf&Lz7uZ!NS%bnd0 zgQ%dlyE}D%^l-rXUSY7;$k&lr3cKxYVauynA!#ShQQMU$GmB!X;P;H^=WqZ4IR@CD zNvyT;N-FS#V;!dB#{?mkHSmmM$?zN#gQBIZ9YW+!?nz;5FDNM{rqAun^OB~Yskpv2 zSVrrCu(<3gyLdU->KbLd8)I+=cAr<}vP@>#tH!>n?slgIyaQ0;NAbtTLArR<*((9v zIwmHW4N@o1^)8_{3}#2I1AMV-0K;M;);9iSKDA2Kt2)&59!?<#P+iQUUcZJ>42_33=t>6<6Lkzh>OS3=nFT9-m;XtU;^3{g+ODfDf+X)>B6!$5k=U+vKD|8B+7I-S z>+LSwc^$*6icb!qx`W4RSfb1-11Z$1<}8MoZEe}VnM89v_8*aV=6C!>X28e6=qvNT zkR5Ykl;vhpfA*AN7y~2P!SMjHgpG0$HW+up)f8P9$GmlWi5EsTBPiwY1z9x#NsfLy zlLEoc>#`U_dv+7f1@McrsB?pq*^bwqe&923>c4q)!)7d4Yy-C1-}YFVe>v*EXHjcU zZB_DCpWp5{VeRT5$z(8xuO;T4$$0+ZU^l+W`8j23!Kesb{yh)m)nQh^eFV21+E>_7 z+v_ehWu(6Ebs_7Yh%`mI9kpd-@#0E!y!DokN9E=THNhC~c*aLvfG@rAQnaE2j* z0XJ}dL61Yi<->IZ#zgWvLA-)Q@EjA9Ei!b=FWIBv#nuHbACA&(q-~Bb#ZOf_KJ_^v7eup4s6+kQLtF-Q;=Bul7W;=6k zQN(M=nTJ>KH)i5$J0=GK*N1K~Z5^y0JZ>YJ*&IM&L}IT!SM#O#mv^kx`9Ju2tS<_LUg&Bx=vTh2HL}8)U zE7FFh9@pG`FRHHp-QDIe8 zLk;gP9@=qjuqGt=KXf+OG!!xomQt&45X-z{tD?DOvtfIAl$XsQ%d5!WI0@5N9?49O ztKwN<+i(6dCvdFOuo1?dS&0-Ti5g0R0?kZHGjc%`x?bk}?q73t`!x5Zz3f;aZa*l-TL2y`fc(VtN?f}M-?)c&W|Cm28j5E*7a28^&cOvx?+e z*D1t#Owk-q-b~wl%d4H$v3W@UD-^-g3=EN-VVoO!#MKNGT1j8N6H(I)Sy_%CdoHhvDPV!U zjxb9Phaow8PBm(k_cnDG0VCAeUKJ$HrY?yDeN(~oOmEc8D3d@k<;o6ccBJB@oyc{F%AhQ}FxeAVi2qT@NqncT>}piokFNj{{O>-+2Ln(A#TE(kc))zh^TD7j*lC?G|HOBgu1-R;JBd zA|f4}rALV;zux81@{+DixQS&uHPaeldO@zF?yNUgp~^K|&`s73hT9?+fuesT^m|&V zE7K+vEfB`iX-gq60)aAm>Ft7x3c>m3e(n5~YGt##>G?>(>*1$IHn!7XERTN$irxx8 zQ#ge!-d~=%N}h1V>q5!2TrM_-tXvr_N6sIY544#bZnR71qH$ByeA4U7(TjGFf(O8m z&&Dzct!RxW_I(+jw8x?IW!PolIz0gWPRR1vtcAjBj5aoRUUIPH1X-q*;|rsw)Jq|1 zf!*^!2HgE%Pqeij!;ZNh;|~l}eLls4dZokNz* zW3Ev|ShqvuXL+$_*Q%uYf!7iG<2qf{>YcxZ3+OJr$yi_)PyQ#d{+cCG=so&b_uHzjqG=rdOC( zk_tKSBT#Sao!#kI&TQ}rfI9etL~~P5yt`L3_2nkN1Nwvbh*xAz#k@lr_lg^WvrD$2 z7E3zJQ4#Qni=3@I*sTj5KX4E%qh^(|P}8YMODTU8!+nm@#c+6BMQ_oxp@rq&zRhx0 zoSW=Y2+fUW0gaYUS*nGQSXMR%!s(gk0Xvw6jeJmgrkXdPhf2Dqz7{M@dK7}y-|8^4 zocbTG!ep*c%CM9Ot59O$<8xd-jgl>z8RVpTtZd)}pF+!w-+!eeIw!l*U!1Ht=l8^8 z+6IjIY_3LozcEAQyA+jy6YTh5p#7OoI?$*f)(bYujNky0ywtoj7Qb7_Rypo4 zxoRr^Q=%&vPhtIr6qnSY`etfO!Q#r({l#CwKb?0@EKC!lEEDsNZ+?^5CweFZI9z7b zb}jlENOGUc?D|{x0Iyg61H9e9d2t{5{el>(bn>k#VBNEs5CLiHRLjcN+p0b@8Or~5uh~mX=yw)%Sh&lkUv)GH)r9Es*v>&{iIL5G4l{#g z4d(diQ9}wrxBLfGKqx$%k`{pFyd`rbVC(AJSz0Ss2I$&CS%|PeoZue8z?%*X$-oW|6_W@ z)9XwY9$-#F=CpoELKYa)hn|^D#Y-xN7nz`}gh~aXmrg=D;B`_E&i-cO&(`g}H(#YY z)pBURv0y#-4Q}=aKIanK+h?G_PPI%hjT6C49O++)^e2LpxJK#I?;UD1JkB(qxV{|R z>EE?G>PZ^+h;4xHT{6A1piTr1IEb>&#OI@aM$f@ezv;ntu5kO{3R>p zIuj*)ld@t>%H83`3O#k|N`EI1CNkxKxQHQf>_8h9j#+y%r)g>eD(>;)PV=#3E17>4iU zIlgBR(2MBiL!i)ay8P(ARQW0imIluwq4Z3ZP^;-!do(tx%PYz5aqS??k>w8j4!FHq zy^Q%d4C7bXXm$jrX8VP@Io>UG4sI{nnheYG?fFRxR($1ME&jRstlgNgQw%qXB7DYl zuF-DiFB(WFMtxMR83$zQXtr%-V1FBaWu36ecaLr53@VKwv4$hEc|1hlk|53Sc~ajE z%UQl*K@7sdJTrtdj%C?**x$l;NwhRw+#A|LH%~VYl(VeKPms&2=NX;o;^cQ@;^=l6 z_ag%NJ-r7F8qp8F-X>wRpxD9M0dxCSCCdjVAI#h1Iy4VYCr(grA^YHX>QJQaB;JVs zTNkhxVkH9j@;ZML&?GHlKM;8OOOwbU?en1L0oNiif~|;k{!Kv?x!ypLD^n=@j}-CS z6pi^abVMW|MG?2mh-fe$6Ah3_XmK4R21Q=ac9JMka~RJ9A-GC4w%kK>+2N-rdcV0M zmwINQwu;pfOY0d^hwdUsCEjw=j_C&UY?WZvjsbN~Xlh?+KUeB!AEOBp#$wREG8`# zd|t$*DsprM_WPQ8er!V%5XqYq7!3>i>tDCz#Sp7$;&A4&;(M3Hk(^{XlM6ZOEg++> zLyroc5Bs~^{fz+xdE(jzQ5&Nq^FapXvAC0Xw3gz3Wz8|OKg$sBeJ=bCNDaAJ=iK_=EGi_cuoc#v%AEbYxEgfH>lcO*$*U1LYFHvoKGj9~pDhXK>xU=R@GDZ92aPPPiD}@w zp2e04hoyYF`EghYU(}|1P+wJkrBgc&PFam2*uErW0j>8*5o}!RBldNPZ=Nc=I54ve zwv69RPjbnptCzlsHaV%q^U%K-U?b-0*M=GY#z{F2O8SUcm5xZ&s`TP z3gTl{gBnEq->lb%D(MUd?Y4bD+^#@aE1~;_IoxHwBPI}*WgkPh|GRH+4 zSqHc5nZ+m-SH~hORiHEqn!f1_a$J&d6+cIiP(^w`6VwF;6q7Wh;%N$NBZ)MR=>n+9 z+{hWUag2FZmog%G1c1P06t5nI@zIyjCCmpPLhqgt7_$a}em(lQiG4`W>zI`!spyl( zP+;BA4-$2cGZP6j-y%A8?MJcRc&pJmRzT zp-zYt*YVc=e7~W5MvcfXRs@gNG$BY1P&z|8f_r0Gp}`lT_q~6tW4nqJ$Uu5FRnwuXW+$JO2}LNN65Z++Ewt) zoJIPDKfFG=WI85cT-N{=>!eba1Ay=3JHW3Lh9glR zwLI=Vw~er{krOgx$QF08ZP>YsK(>P&Hb7xez4j7HpC64AGWu>_r_)FwtihQZ~+Ezz8m( zH!@H@G%5|ZrvJs8G`p-xPZ_rf*;Rkr$zo%mm(UqiCOT%GY3UmG-}w4+ypT$WcTLs1 zMK|Dg9&Xb>yR2*~wcM7EpJ{C5%Sa3HoxBtnZ^XsjMFkld?moSMD8w!Al-i)4{_;@R zq94&iW3ZO|_uq0WMMv1<+a?28fVb+|SmHN8Ce|`)Kxt@{wf8*m!Xc(MLF%T-h!EKj zn|LB|gCyOVf{Tk-*1G?5($_}V@Z8;TwkGN??n(~AZ){h)IQ(4!e12?eG#|rds)3PI zU0qri$=8a3LTuJQSy|3%xs#tNsl-k1jOsREO8bLvcAO6N{7glYPUU$vHdJ9eO9B~oUjZD$Z* z9P+@ase>m3P(MX}Xlc|?FPn;3I9mYT`Y2Naa!MNcV;}CRi+rcKXlQNc77Oqd{J5pB zE6UJoE4murluSVg-YwW!EM{lkRhY`* z6QS_U*M=4)0@=lx_@2CJKAFf%B>=iCFVK&~Vyd8osi7KaHIm3|#`O}ULkv!1*es{F zVB#E?gi2%b!tIv8`NXS8hKMS=Km^c>f+lad#VG9gTFw<&+9>}f>u}}9N^S6>XGf;o z*eKu=M|n)f_i0A(e82j{MW-To_ewzDJYnmqVgsT_ba)aL?;k~FNU!kpj%A`Fcu=AP zQjR3Gn#dk3Rw$^DG3RYtk}^fn7!z-1r6cC3Oaje?#XJftJ{-M(i+dFJ#(%VyHpW0)6Dwtxzbp?ei0P8I)Bwq|AMRo%n%%S6Tk?V0AJ6WY^1^J;wz`!=rq*$Thb=#tY`bs9MZ zG~bGK5+>$IS`jfbN5(4waaKPiw~gy9f5H&Qg{As4;I_`sl;L0oi-PQ5f^M#nK%G@b zVu|vt1$EB9TLDMU69oTKykCk0Nj=(ne;e@|I;^ks)(^t9s>)tWDn#%irslQyJ# zvM-<~xe45MKF%CF9ly2zaPcUmT%qwgcx$+lc~LSaeWph5sp?Xbvg+4Ku~ElqQU$)e z01KyqzXr1^=!=`h3~NfhXSUa|pvT^)9aR^GcD8}swHt%k?QnbUhF08+XR@V>4sQ** z7LIo^45KjG`ko0=<(u%0+Iv~Rhbq}~s`sV5vvye*sLIa#Uqm?yGk}Z=GNm9``c}i$ zYH24tN)QOEb{NebHQnJ&?VF|iVo7#nIs3&d9$XN?vZu8dtbPTTuYvSBU{zjUr`rw5 zb3L)rUd>@EpFW?f+9;9ISGzr#;b{~cY6@ITEkF;%o^$? zIqpL@g|8KHt(0w09#MpHl%T~M2*8Tp6j^8^A-DsRCY7UEAa_BrRnS;$+2;z>`q8MH zyt#nwEZ+Khji%_%S~~e`S!p=aqqh)fc9wT_^8b6_4ZB@t2|u+L~-xpM5Hm3R?PcE()NE*u=coD^KCAGELAV{_4Mjd%MF3?E)L zsGf5kc;?xyG+=Zoq0OkcaM~V8Z#Pod{wd|PqoG#T+8@RnW5+Hq7Rlf%L+8D#vavAk zO0B*=9xx)sJ@%uFU(J-5&CfPMduDEG6{?#O0Ww~PzV%)N%N}L*5OlKF7P^K@lLit=*!0K=F|J$Rztp%_ z;wP*~`B!hKP(r%LY*da()a9LfisFq(7@Yh!KjogBoHLtaKc^E%CHv`@husHh$#k>! zf~hh}i{MRR7KG!!9^i!suJ#L*-gUKxWgc@ko@!a?cPL_(FG4{_ER=8lAgOFnSA&0OL?9qB)fan(JJ&!A$RG_iN zX;)HTF%a%m+R0plvL+=)~5{TdQ5i{n%#8S#5O-FxC{P z<3m@zu;c63_0{Ra%?mddM@aL%^lvi7C(kWUu5Zc@-zb*FlTIKkaRF%guCK+`l~wF{ zS0B}Za9ch9(2`%=1*!n6xvb)puFXy^kcIn5>m$rUmAutIO{Z^R#kZ;oACylsQia?w z{YyU{ue{s|L*Gotf4@K7EP`&G7x7y!KG+L72di7g6lHRr*@KouX=*O3t%zeeC&j=# zlv&o^=K4|}7P9Q}@04frexJ#HeK05mL1P)R*KO3!_ETC#^{Yjq+5 zK938i#~>s$(0TRmbPSyN$E_@6U<()Bt1sC#y1yhTIp!E!G7HFFFx#x&)oMz&-5A;- zsqM?FD0Iy=shHtjs%81gN%tnqIZz?H{H_m>e6<4LS8{+GtuYxHeOw&QmwXRC_-OEn z?AFX7AdF&lX$BBN(eVF{U!fE&Ldw7V2IPW6`!p;1{5`K%If*Ua$u$keQAG}p2mmoC zu+9@>2}h|yhIU$@j=Gl6A>!UCx;+Af)IjtR@CHtVvm^FlG4iCZ3GwS*z|nH~VryCx zV*yTOpE2=|`i+hNHog10Um^>uN9mHs*dIL*62{=i4%Q!91Tb)0bDSW!uY+39&b6bT zeJ%E$^rGqV*SO^k%d&O9@9~(B^F;4+d$FWmJMq+P@6W)z zEsirA`_WCq$Db9cl&<6NxSR8JT$+r3TZPB|dNO*@l-kj3Y-g;IP=T!y`RpW9m4lFv zanDcD_F*}>NR!RRluiWy;Wrk#f^uu?M57?=c^Bm1N-!4Hb1sCOXPde0_*^0t#>&8i-;`$Nv3lKVss-6xO$55NbiZmGj!1uS zY>bbMAotOTi(veaoW_`lr2v|KHv3+?qi~8bct~sbNb=t;8iX_{MGyWK|2}lcZ*ZX+ z!2DkUxC}@091EC{co8Q8#Af@|<=~nY3=6({j^r0WYdOmwLG2V{6bAC4HNmhCp*F+_ zp1FPl9psP?97D4zGOaprAFv)-0Wnd)&2LbQMmRKXS2&-6lo3 zhZJ|T98XOG=T046*%w{I&=2w>5a7%oUr_or`83VhLS`TN1lB;VyBZuVr1o+ynk%=r zkUBQ(a)lh>Cy^=(nKKRaWV@qTyWlR6b4JA5m5g*fVrv|7$`n|83_c2~z8A5>LrY!s zQ?>45CzkCv=XyL5p083e-?vBW5-uw?Ec(Q~*qOeq-8z~1tHkmaGM7&gM-T$uhK5Tb zDoujqSVWL77vOk~A1$M*6l{LwJUTH=7tRfdwj|QlC;~vl&%S@eax6=fK>b|0Md2HSD_6W3?Nt&KcdwqEZ{qywrX>`)~BOlET@p|Mta>tNLl9 z-;c<27aN=Y+cyo;ePe7({We>{XM1Gm^F4!Z$P_U$cp^rmREioI^0hXzgOLd)?&XT- z&)`V?B9(L-M%k&vl@kA*xh|dG=CSCSyFO}b(*zdrxMt8$jIOA>j%Oc+Yd5wHO$2Tg3x zTxajwy6G+!YAIZ@Zv&s~VbvBf{XO#=^z9&|Zz(sl>RZdfrDwaOjcwAVnzi#a?g~4S z!NlQresrrs(x{okp5=Se+`UdqI{G;Sz}vKkwVw+0@RJ|bZ4cs-lfsgdd#fxHKGx6I z(+fw0L0Na9>0vUJe+jxIUt*Jl3|)@zigq=*oFWQi10=nsmi{pRU2`8) z|1-1v3KRh9dIf#(x&>Iqa1*XTQHXaXe@R9DiGsBe_yvDb$qOlryR4;xyVWV|g1S1{PJVP32o1B{Wy`?gkxvm9Nf;WIH`N zk9JyabNT&y7ZMX~PAf;#)O)7Zda#iDj*~J77}mdW)DbTyxw`}$C)!;S5a|l8Q@8#Z zcC6BwK!4&{8u3@?1+HSTi^n41tJmlr($80^w#c|QpTx}b|7gv1^nS-;A`eyohX&aH z5e4oeTZie?LEh&}4ZSoc%aHp%KaUq(cM(tWsME5Ijd^U+>lXRgFb8w_M1vZj=U2d0zQ@| z;FycP25zQQMHn^8vEo()N zn>4KOp8qDqMRjQH$~_OF{2`ZXTTNfMY)x#=(1)>On-8I%k@PcGZsUt}JQrTM`!)WE z>j*1r0w$wi>)3w|?g{MGK~@;D0saaDz$cFj(OAW`mbD&Zk%ohnJlcO*q!;Y(^eg5B zdsPFNzy|m$ECAFAHYgKPsT=w$brJ-irKVM5x+;K4;X^X8&z zd;NY)Y7f-UUh7LFIRdU&4&*g#j#*^UTu?mfhdyI|J8G18d8lsQ$&>*uKX->})KDve z)s?6R83M2|aM~Kcarlz85z>Hsn|a0a{ZAPncCcV-y-wy&{eWZ4eIgAB`3x}Gcq@f% zx{$B2y3*nSgGdtj1dK8vSaSHQNiF=RdJGv3jvQ{QLg?o&qDdIH<`NwdXKu(;mLZ3p ziPi}|%|zS7Va|h?mcIf zyXzr-8V;5h33Z75jPnbmh$hD`IoQAyqr>%zz;yq zlYXV@X65Rxvf}^%1(3-cf31+HMF0RHpmD7i*UEv03-qfq4Nse zh9x}|98T|7%-{?D_6-m;irvKU_5btiRqMG$R#|R`AAMt)o90`uMXQxIS>mv}ntkRc z?b>ws%CAm1?l+mTtdZ@M9Q95*=d?4(=Uwo-JWbZR>ar{Hz4FFVg$fiYQOw~B zPGw4!t5BsZ~9CN+aU{?%b36JoJfN*&4LqZ}VVj@9rkmE!~ zJrhiG_`Wi-%7@SO;q&ViHm^atcb(RQ=yOkNr}*SaISdP)n2~S&CF?(rIYv z=ow@%%4Eu1mTWn4d*`>D@;h7suB30-mRYV;nev|S+Ocbo#}>E8tx%y-m1;F=)v4Ez zjh#z}Q4UUHnha}aHm=`*-WoM&wi3AyzgDNNm*p#M!_e~Cey3e_+tULEk395yU!--* z6MEO(aaULS8Z^{b4mgMp>AS&p9ZvgAr{A4%);Z^0aFJP;ZkJqk#X*N0cEnM~99Qpz zlTJD9jI+);k60-#+NE}$cU zBW0O=1xllA>uy|ZR*rbH=sqlVG+T%2Hc;xKc>T(f52p^>wBcF-}nnw1_{_=)V zqUa^j=oQHv<7`gMvoSHuPD=qs^w{Bwm!?d?T&HxdWy+ftV`^B!IwjfTu-v?OMG*=6 z?aYOFHx|MULOIfKWZUxHlswE;*|~zTGMo}szi8BHtc{ncHeJTra7kR#5|sD~{knb$ z^TpmIzfipX>5{GX(Y1YE;`55(wG6*R!w*5fi`n{XzjKM3JILW}AJLcck0oO~2p;S= zFsqUV;KxEbrA?0^?2TSx@wsx}`ECKk53}7NHYl|Z^k`o|20WclFX#oNki%wH9YPk2V z`|#zk=-P%;t4rt7Bsv|Nh7S-m#P(sy6sLR&^iA7z0X2t`Oy8i1oKw>NE@`V8;wxTZob5%q{L_{PaA|fJc-hjkb)a7dj rkl2d43nC&SA|k4)s_FY50MCpE6ms{M0{{R30000q8~`M?UjP6AR*K-V literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff new file mode 100644 index 0000000000000000000000000000000000000000..7cc63b7e1a65d56877efd0cc99b2b0cf54641f7c GIT binary patch literal 31636 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3f438f80ea0b583676e2002f0c2eac5b08cadcd5 GIT binary patch literal 20436 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 P0000003ieb5reY;DTQ() literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..46f89cfbebf51898946b920319600c0d0f66cad4 GIT binary patch literal 19176 zcmY)UQ?M{R(*%kx+qP}nwvA`mwr$(CZQHhO+uHAU{&TT+Csj%2Dw&>1b!y@!FUAA_ z2=E`I&H>>68vr58|C>krpY4D4|1bE(#8hN)u-LF)6>y?7!1Mva=nx^G0w*;BUX`H3 z6#xL)fJlH7&_D=4g9yQM*svuw(bw5%&B1m81WL(~joAiYIno1GSh*F3Mgavf{!SYI z{^q2)MiCg;1)f%XdfZ@P11AOJU?$Ka&aW^w7?eDFwVvjk6D)4q-OlN3_YS3Jd7d$v_|iNRj~xK$RqfAS~iR#uJSRAqkuDKoAj#7iohl-N9F%KtxgK^YO~U zOA5{VzSKLo<+)Sk9=?6QP3L^}0-zMDRb(?Ec9Jy8Qz2f`Bqms-Q1dD)a*68nfvq$) zye&L(?y*et!~`+VVMx;c`J(>wNFm96HWPz$3^@NYx_5hJtTgCcm1vw#t~KTTt{P+$ zV&(l(kdAK=7Z{>;MA9%Ir=KHk$mCQ-pR%(X4%9FJoWP(4_~gdnF#!VkhM%4K0N4tS zg4x$UUM-ALI*%a2ia19O$x|mHrye6tNJvOcNlZ#i{jXX2|2c#XwLY|S7s5L0=aP%- z+JkLV2~P%D%PBq~xUUM$@ESxlxPso-6!@Qf(_1}QAdB1xb0^AU^5HOBE(I@k`wv0K~ezZ8x2`T zbpiR=Em7U{VPT^A`$#;%;0uFc=u-5Q{np&>-L!6{!f3_x*C;xNRph0{SXNTr3{rRg=@F|4T8S$QSteAthp zL4^UGm35KtT*zL?6L8>pXe^%UJ7`WMM~hMfGYUTVDW~{yieN&Ay2zNO6?NT}aIe%Y zPAJc6z4EzCPKe=RpP-`UFE&QA0$yl9r1k^(L(Ls6syfd6#o>BrBuA%o#P*;VQMOih zV?`iIM1c45Cv36{JDN9)e#o6r5jAdY`S~G-EpbojM&fX3QH0}}w?<9=ZQ z1JvavRKo(`?``5U0J!@H02t((f@v)?F8{Lw+cEYE-SI7#00t58H)7%|%F^rO-{7OD z0ef`M^q4)C2abn1@Zpndog(l1k{K288AQp?*hPEzhG*b-v!emlieRZ`wM4N+euXY; zEN4D^Ou;?;_h9=V`k)+9lN71&v7&Ku(`ad>DTkOsW5VrrZsuvtto?EkLSo3y-^kn1 z{B_INCbsFZPO3M<>rOw&<;8uqK4l>1;$zT9oH}OYDEQF!=)s15vMj6Y)9AWBIkOjI zy0Ox}o>J>llvU-rqhTQA0wNP5IdIZW8n=SnywrZAdbsO=feR52XgUBFbZV|4BYS73 z*#&p_8(&J{Ol^PNQ)htVJKj3x6QY3TPm5RHW|G0fH_lg&ZjK{hxFO>KHYS9;8;$Y=Y5+bHYxuDI*80(vJqFyq979H=YA}gSkHe z_uPz7wKrlb=j)6)Jy$!kJ7>+APMqBt(_@>Uvyb&4!qxbVt!HesM!+}VaXVs^_;eUU zEvVhBLFLd}{*biE((GIi7QpC8!COQBIfjvJVE1*$MI>rqk3DER>q_P2VDA_qEg>Z- zo@1`X{%JRav9Uh9JiR@*czM_6%Q%HZ=tog+h%PvoKym<;Ypk)V!4`Ez=m&}tcs!*% z=o2+mz0Yb)Q$4WLqu;geP{BKmXxi!<`I2$y1PXb^!OV4~^Y`rxcvUFjTdtAKdM!_;}jJxs19#GeyfldVu_!2JR0!7)UXoPxw<$=pFUmR8EOSjaC|1#Z~`d zVxq_A*#RlH;BYH9ELoQAnlYt&Af=vCwb41+QtQ-%JtaGD>k7Th(si2e=w|h+3qOR4S82*`(ogN~;lV zqS<20-1>GsTzkFYwm+}9U9t__g%5vU&lAY|I;=d$^EN15cPM+g^=!NM^{)E@U(b*4 zH?sFW*7qy@cSb@>iRqyzwZ81^69i(0k`R#*f{G9i3`rB-kjOY`4uckU2mNlnevOl@ zvl4ZjmS1lkqnyf7A=#WZqIag@3b9ZavGauiG$T&K@ zY;6{c>Mh0(f^0%L?+rG%nzprvf`g;HzLRD+NF&(Lq%9#FEIOLh4=&vp!l|a}Z~J6) zXd+pimPU55g&Yk}4XT!4<9gkOniUALI!4yF(JppW?B>~4mvQTOHFP@T`W51e9>)Cv zTdbWWsFY6ol@PkzXll%Z#&g0vGVruGG$hJ(`m0M-3;&S?gcxSDrpFr~%JeXZ^fK{^ zIgd#Ibqsav>kgA!R>!jGt0UQp?usmh+57z^D2|~b62Ys2?O?2zjpQeUi?y)0z|4S# ztWZcYp;RnIk4dbYdhI(a&ZiRaKh`KzOLan|R4-Zo|BN|3ul%wJz@!rXkFfc42V^qY z3^ruxM#GuVn)TeR2;GgQyZ(YA_B~lJrXxzSbWIIF!RkOLF!kX09Omv*bd*>M)?6tS z{te|y%AO3wONvFwd`Ou?8QX$mG${h%An4``}yVwOR?14M&_!r^VhxOS6Hfh) z5&|exO0`0j3`bNd)rvY;apHwwQ(CQ-wAdo$wA(f>CA%p@t`0CvChOwpR>mVTnM@`d zvQy)ML{uv_>yg(@x$DVXA8@!cV(Rl2b;@B$6D+My28HNCrjQMqY5@KID*;&e#dG}u zbonHC0SOUnayYFCG#MVCNtvB;Y2C@5J{-qHM|f1;E9`3+LFmnZFG0EKeS)p^iGhcm zt*G*bfioVqMbk@OeB{AapfAV`vSHVkE*b|Nexlth3tE0o`%AI`dHTQjzq~`O#K(=4 zt;h9WgWZC~xw2CE-WIRq@l0QNE#3*6QZlC*{n_4nT7zRJNda%wJ_{jf@wtBYxlJ5S zvp4haRI14up%SVWELMxvLe($ZzpZ;#Hz)RdKv)f+qKzm}!w3z+Rl}jx;t^e!l@%%K zIstMu^3`!~Xr7Ku6(!H*m7UM6=XO*E^{A12v7K$5%M;FaAFS>#;!0?CklY7-x8%xG zOL94Dz$FmlfD!(;1>HQQBKWu@ zW>6Hl>Ff1$chqzsdL5iBX5i7*I$g3bkUTOb1j-<+5KxDBe?{5nj$>iS}H??!}NHw#JzL|1XU2j7DYC zSxh!%rV*hv{x6qC<*p6qdV#}YTlaiRaS9+%VQGIt2dIrS$mP~xKw&fj!0W%z9^a zqIqVbT0UGh-0}n3E%+Q-^*!^S1^b6c0`)))M1xHrL{cbW^A?Y_QN`4W{mJ{2bI@tSj@AuYjDV9L73M?$}CQ&M!3P3Z+Ph zh27WqGWxq;zb>E>EX5)<-Q_;kWib`x%og*NTH!LfovWoHnUsYB7)&-M!7x|z z|Mgp8BgiSWYON;Qq0$?Jvt1E2N4lI=qn|PN_nwMVAqsi(-`Gv6wjP1Z(#77%9m&jnu9^&Hb{pVz1 z{Vh{*(xP%-@n+i$zx1Qrin|Fl$8c#wxr(=J2W~Q^ElnKMf4DVAKe2H>KZ}2`rjRX( z_G*PKgh#CD49E@45T5@8DGyn!y=?nVT?!|NW>oh4vV8>I=!+3az2RmNIcWlsw^1Wm zuUl`TmRdH}RlZr&^@5qa-{ma1RDvZ%Vt^vmVnUQ2Tyf^nSH(pB2V=~bOctw!%ARL| zmy`fTQYJ!=WL+C=|iF-8$1dacC>ysV&1 zV+vu+$$o(y!>tWM+%b>Coh+XkI0%}3T2z@ySM2?X+8TkdA#3_M$mkXK1_YA6Jv8?p zAHC0%Um3E4Trhq2h5w$Ozq0P;^ZR{p@UZ{1vg0eJgH+PJR;T}9sRx^M%uX<8t-gP+ z5E-y)GkC-9dy=tA15#si3+#fKQbZ&ZOC(Z!$1vS)!e9;Cqf;G{N^Q1U?&|;0j1f{I zK<(Es8y@A?4l?6i8$RJ0STsfAl=fIMgMsNZ0+Sv>*5Q^g1%#s?QevZXOeHG6#4*QqvnB6-QpC85fPOe4U@YZ z?t%)KUTnasO&ce=I8ml{WaF73_W(w=#^afQ_#Q zr~EVlijNSK!DnIEgGd`zm0}Wo#nAD6oWr!YfB8{6h?0t)wZa-b zFXTdyd!DcHt@iVD3PeZ1uAz#Dq+gD)elG^)tJGGc6cD%T`xn=EF>C=S&s08P`n7Az%Q^ykdlTehllDGkJ7PUv@T zwQ&TJtW2or)S2Woyzmf8tuWj_-mV1GR>Ut}v*Qv*VHcdWv|d@SfaIIT8$w(vj9OAp zGP=j6wEnq+c)cUe@U4Ow)P>OMr`9sgrtTMIxnsU3VZZ~ta15=>wP~0u8WR;Oi~%OK zstmH>o!-eXXQ|?#7K<1vQ%);f_cK5d$<)Fy=))|r%M`^<912?G`}Idi8R@{m@POMw z!~&9s^|x8)Y$M596>7!24jHsY#D&W>p8vB*>#Q$^#8$)-#|WeK$j?fFqI)@WdnCT< zJbQCqV8+A0s+gzHJi5)J-&joaD$A{d_xAuFyvRfnwdWVb9;iV~km3TEpQ@yuUUXaB zMAtCDB9ot%9zw7ddK(;jI0~iD4#39G1M8!z$vGdJ&Mg{B8Ypq53h_qSNKMgxr*+E* z8^$!nqy__CYXAL%=dyg z&x<;b>nu4-jiitV=|Tj&wx*8%bK7iD@LT*=?)Wy?-L# z?tcfls1-<^w`g*8lU}S{c3<9y(bK*D@$1Gvx1L~{Mn@2K_rF z1>B&AEb3W9R<7x`AxIY7vD3b)U>DxolEc(T*qX;y^Ay9FVP6HoWM*8?piSrjZO^7n zonC>eP}7!%vLHuI{(1bcR0FONrsh|_L^`$P0%6~z+x+nrWIQc*Pa<=W%^G!Dr1WMs zCE>nd3D8V~)OAT&c8MG3c@Syn`>7dDl$Y{(2pMJHQ~6RMP9u3>3mr2e4SS$WRfP7&oo1oa&{76?E&V$|iZ>N)Sow4KTUk;++&pS0>)J)Q+1H zVAHO~;f_S>e^;_9oVXQQ6^&9Ul5tuIs{Huecn}$F*L!Uh#yJk^X1sdwf=%1|yZM zS8UdsjW*=Mlg=yv(xlAiSM6>z4VbnF-%CwF-`XKRz7G9$a9FIT@k9SSFJ3SomuEGWfl~#0pV@$mthV?^?}_;r<0_({}~H zgvI{CU|)OS56>JOed>Da!mqF1M)c^o+)5&+^6jrF8?EsMJx^&*xGe)k>q2E5cAENq#< z_SKComK>$+Ms?oV{rLUs|rOM!inKL^Y8x}{T=-d>Sd&Pw6!(AdD<=IZSr4L zs}@OdvbNUu6lmMkjgR+VS)OuG$V#daWuOo)dosRSPx&_faLWH_mNZ>C;b1UnzG))E z^s*b@6xI2DV(aG%f?+f1v!Kb7C|}61rO~5En*>9e=tz{rxbO`pOWXKNx72-k%)J56 z8#C-kO3cuW)6>vVQC3mZRaaKj)>xTaTHD%OT%Qx2s&JwzD=4L@mk@?HYU_1mcP?Gp zNRwVX7b_`N!QCiX)6QW5yk#}V>Ih~jS}&>fWQ?WNI5GpSnFIjv6 zTS(Q4a1~#g@xdKk@*YJJbwd(J9w&TMcO&p&>Oc<|%>`piWAJeXzYmBXk`y3C6pwgg z+4VW4V`{_G3`!VZEj!#)QW6yIc+-vaIJDGIM260FPxhd4u-*OvA|P|q6HOkimrhLxMMjg;VYwhOk;__Ut>P?XxigQu!1xLpWoZ%q*Sm4> zkG2A!C&h6zmI12&W=b?=ls+Vd&Nz)g;{&I+q}BLH?c76DU`lq*GYwUM)vWhmHDW-n z!3J>PEM?*rkluYCI&bgeevsQnY|zndic!Q>-qcM1sQy4e^=!#W_DEN;nk2nYin!+J z9@%(kQz$x#EXa%)=mB!+{8p^-ThawE1C`a%QjpdHsGu_b=(Yh5@ejZne<>|BvPM#d zlHGzm<*0GWXW6sqtEshurW?FcTBJLweP%+e6;zmR>Ibw?oSXYis$-le!8&b!1FO z^!Jok`!m$WHp_|fLB&y~0zd-+-fRfJDes(0dZ-KbxAdp3Fy3>DOD zXxWdl>RA2Z@uj+C!ZOiXqf&sz)~6kH7$uwJt#o|_fpGRR24Xfe!zuWC{R1WWa+WPO62hhW_ZUn})}41QA#nPVXHFeO5!>3!F< zw{q37cHxp8W<*~_G&L5c2=z~ZB7Vfsc)x&v#2~1nb^YR_>{!M9U2oI~0e%m50NUwv|Yb6MT7OjFG(g!h}y@6wx7LZJdw)N}3e{-KGHN8qo9PQck zBfex3fACnq+S}pq^o|T)#aF)m{XFIX>hD)$_J@gd+_xot=F?3;p-&o(Eq*3=CuI?W zE!z&<(5zNR8qwqS+wx^xoY{DQu?X8u)sC+U@17}zqvR*4zjYE?IkET#kv%;0$9VvZ z3G;v+{c*j+btJL2uQ%$zw=JPUd^dQzmyfNZNGNh#(@^6D{2)JroW^W`Y9yZlC^})sF@+ek;j28y) zq@@9@ij@ymQZQl9&hq_2549(7xv(c^{-rg>mmSfuFX#`0LqqgQl=>VjZy6RzO?mj3inZ}muoVtEGuKo`p?mC>Jnx*=T=uAER>H#Vwa2Z(T;9U( z?ZDAPjy8C`SEw9`o6V(-b3p^u!vi%-+s}zQd8gpddJJ znrM=s!Ovv3*~DPn&n|bYA0eO#XZKq>5M13qES;8M1T-D&>I|{ZjA4GPgLOxWS5@nS79U+#?eEn*+Wy>A{lAd7r+QiOlpOXF^?pjY3+=BkusZ z_bU9SeE~GJ3@`0m) zvh5bCb4-n1O?xUQjZj`it00;IMsL@A1||ItgMV%gX7$BUbZ16Y0@Mk$(h zuGb48x&s!WZjKlO6z7s~Db}UKEFKCtFFN}xuNMc$b*9iec08@7AP&XPwy$79$hYiN zGKsKNY&{5`N2XgDM-R$hdW0XNFP%W!dkM{!F3_hk9?4t%=pj6j==1U`(>?6*Qgc^m zrFo0rjE?y?PA{1AvgNH(L(?!-L&^wn(wx6dNLSY5Aso7m3yb`!9Sp9eA2i~9_$74K z>}m!W_XU>=jSfA-FD`$1oi9BwP-OtNL?^H%NI(t^6kuWu z)w4c6s1G{cfkAMlPJ@m2qCI5GPmH*bzBc6EHu%@k2X#5Tg>)7UH$>4Y^3l7UhFlJjo-pl0g6NWaT9+oX>5Se{; zCQ^Ek3c*61%Q!P`vK`!A5LtpKw#Fe8q5miPC~2#G80rcOz{C_CE*~i&bZN0f0d9*- z6CLi{Lw--(Vg%olf1QZ&TzwWk{kTtF)DUbOj$PWK#FTH0w~#b&qF`qGjn`5VPkr~v z2y?QZQdI?YC(;~(6Tb0{Z~KeB$qjIiI( z^*pX}U{XaOOI-)LRm&g71_Bk3fnyQ_oHJKROBFpESJPf)%su1301dtA;UmjrW2u$l zitfovSjJvPFW)2|$lX@Gh{Q%4H5^+P@h_bqH*w}@FdHr^gzX)h>ccdQ&S*hUi=sFK z8WB~$uaAqAS`m|X4JZchmHV#+S;D$bimIBpj;TRBQ?eO8Ey^Ny{*f-chmcV0)?!`T zX=~ZQv#EuvwBGWitCPZp#ak(?KA1{@Wr42MQZq+Fe?RlCkeZEGAMBV!k01!p(m_WT zr1zwP+YOwk=3Cm0K%M#$ZeoRP5e_MvyX}l=?)gc*MQ_u7E?6Ex+A|v~eZ`TP4*hh> zMPBRX-=St>+2&s@&dFMblRa7lE{oB3&x5FL2^QIKWap>FRbCX}XJ*BqpB_U0?_*-l zy`NJ779&ty)ms}kG6LV9RGGKB#ohrAY1lKZG`9GhRm+ygtp&Fig!)hUK=gC{`6cew z_tN$57jDP60>Ky~@U#bvb1=7TmWC^Nt5FuzV+|P~W=NK1*H8lfRIpRFGFi9R8O?y; z&7)h{2b0OD!JyLo(G&ECoCTQ@*(BzX3|_Dl^NvgB_Wa*yQFI| zMztvFD(DU-6_Y@YYZ1fW>WkNBZ8wwBStKxcA_L!C!&5)6@%qGK&XPqW?HU72hFnHD z)$(%-CgVn$jg8Cle>&M@3!6v!8l5-CV}Qxk%qWZ)v#xhXZB?3%{eqxw`UEXK#1K8> zF_`t{^^v!kg#sJXv|ufQ%^AR4g|Q{clnTjl=?_d$7Jv=TRuFWT_hI~ZV#PYk>MGaw zyMOs-9@7BXYtv0G27${Xm*_Pb7sbDw@Ol)T#XWe0%-qNW7%>@^Uv5ql@M_s`RV6?s^?RajOcUVA0>Y#u zo)526_8v#M<g7f&aZXci;g01*&X=om@`uU@#tgpTSI@Q zH4KTV&e^kp^%OjQAo*zq=B`_>?7>M4So;)OFk1$n1@@U9A zJH84nDh4%oj(m0{X-9n?tt*(!$db3l>wEZpT?_45aTi?f4JO`fA14$`%WwM^Ah7BO zP)z07NtlIBCp~QFnGT1zRBb9On(LyrLFS-6mQpm;vLfT9JLA6cj+*n>iABITrU8hZaf)dD9IC5-@VC|1WuOwpv5@@Cb#gDXVdi=4)-;CuW6 z-0te^y3Bkow7a>z8X3*eSR68A7rcl`qDjR|68v+%KOl-TB6n>re+p?TI~c-ZDK!@o zr7&GrrGq(pdqCF<99^Fn3zB-9ZOJhSx8wQI6dmIQW|q@SSAFLQzIy8K>$`U9KAs)nfu03UKe}%eVKfk%4RdDB439T+M zbVbNEs#(m@id~`8z z(cehWks$nS1R-Rify4l5#SYeF>l|A{`U3kX<8-a8Qj47uiOSG_q}OUg9rGx}{=oOd zx5xStGd;DtZ3F41*3vd>XStNgapVDAMKXM9Lv{GJ5V9P!MrDot$6nCSPN1aE|L za*H;LgJR(s{E$bf+4;LSG%bG4$a47l!%?!)pLX8|Ld!`B!`WqtOjSX86ou=V_RK5l zi#OWtt}?+Wh5+c_@(FUI^a7G zv?Bk+f~&65T1`21_#K|oGivAh6xToPK2tv0BfBq<%deygsLy?knNBw z<&g{;Ik&H)thmt2N>Vj3Td=b$V_?tsf+*bUTWmZs%5w4}cL@cZb;-@=vQtim5WJxk zSK^!uJd#r1^Ny(d9Ut&E?=r9<7cKSi&1>kjXTYs>_^DN|lOui-^f+Nc{8V4S$fBn! zg-t7~09Zizoy4^41IJA}CQlUkA9Y^inspk&pwaQdZ`xHC)(VR3k?Lxgw28hJy{r>j zz0UzrhTw#@3HOk9UjSNfgZFyBeH?ug(6Pn$wuv8*8JdZ!MVKw%DlP5Bxn{cxLyryl z#UqQ`CzHh)geCfb6I!r{R1_CbE6XI%S7uU5<>BUE8B$bd(LZB6E5kXv=ktT20T{?g z#2Mswnv>-&6mhNh^ltC#y*$p9=^h(J!t3~Qw*6G;phxD4HOVvc$E6h@t`kqdvNaUR zHb7{|Z**^=%H%-OU`i=7N9@lO;lqX&@zvOfu;d?D8M^X$?JLYiU7ragdeCiMUj&BR z3)P^!H$PJWYne*dISgRy@^1~d6pf;KG`Fix9rhJmTP0W!6P1Xdu^5W~VBqLCyTzPpV}IMsFZixLnXeQ1=1>JS;3J=oo0w!#7$RCz$;^3(ZO$8kl-E1~!eixg=3{ zG`tTZ9cYoJLr$>4ETnAKE$AfCQ+p20OO0EJU+Q=9hS`LEQspUNy4{Z6#4Zp+B*! zq;UzxsBxMQC`48ZxYhO{8urq}i!6gNTnV>)uX7OFmiv(u47A7N&`2^8f#4eL_R70L zOl_2X_Q)vP#j8nnLcWJ&EMQ{hFg9r7!|48IIa?xF6P6w%E7+Z4-&vYi z2ix)FhFy%p?5~r51=MMtN~xB|5kdn1{zlz>0K3s z$hf&d7R!+fk)tL@3_)Ogq9isSik+8dbi^#qkTcAw_j6VTwKm!e=LmL^Ykiy#zY`qN zPYHlsL|g^zEq?`^`%z0!o`Yw(RNH5pbkfsiy}Ip|G`&AK@}0h9Ewk2EWC5lVy}{m= z$wfpLk%RkFiH#pJ0`G zhM03Cg4dlR*f2R$1ss8j=)X#**rWH8Y9EI$wybFP=g^?f!(o7Ok#lMP)bLSMZksmd zbkyl z)fGVGgh;^6eJGA^ar}kcf55HxH+CKEK+qmMcwJZZF5v0I*J@GGOA|8-lq4?p-qJEh zVLotxP|~nAq4QA%9j;~pZ4o0t4>(*3A@3hwy9Rm>!g9^#`dk-FCAA=2vw)xW`G7$4 z<8=LVlmGclR*shAx7NC~XE8=&$Pt~9I~QQ*dR8ihRM(HPXhaYQ9!Kus5cbrpPy4BiyBT%FG%nL!(G@32AWF@g0n0QTz@a%5Ssv` z2IaPdf$0Re#%-1gC;a5>OK} z*DMyS+zOf1w9w>Huqd`uo{O5VjWw3T;jxt#)0iiq5Gx1_9gqBsG9QUThY2#hRLkBM&| zn{d~U{e7qwatVAjY4p+olxdYA_y2O_io=kL>+&RL06Ao@osVA}g4< zl?#!L`FyOGchb^YNiIkdg`^DTIG-X~G~tds5;aiK^z=8stOL(A4p>i%p1Pzb()Q1f zPz~l_9?);*qOPWri zedoF=bwH|yxI$=DGG_=CSu)5Ref_!Nq{@6(l$1Pib}f9Dli*n#CX?5nT+74zcRfdO zbSs}xwhLiV*2KK$DK##FgwY&7-#dKN2IqMEXv{(tFHFBO24Wf>x2HAzhGV|d zDqG@7TQ;26j<*5__hO21cb=Tm%;_GjoRROpi&(bZM7?w*YdMZJ{WXK8Tt*>O5s>XJ zvh~UZKVM{M55KCNr6#kI7J62qe)vv&4v8XkSE~~v0X%@9H|!QZN1MqtuxG+lRC)s6 z#pK1{CT#kpSSaQTM&#uWN+5B^YpVy^jn#ppy?Lgj%Q{;X9{J8GpPf68jO6QQmfdk# z51g>)^_j=_qLKnt1nbt=#7cpo>Sg2dId`z>*mN58+7=^!1xmM2F^L*aHk)=Fns}>3 zMR)QE8&fOChP$D#!0P5J{I*59VyG_Dg%kVRGU?|nJ6w|mzbdo5S&q*~ZGW-s_j=99 ztS*FgirXkWvGynq6?lZARe~0s7r;U!Yn%KA2HqPE59t2i4*-&$f^`*vy7_2^*bSa0 zVT24IQ6Yw80`fP5u6@M5P}GTGNnHvUyMbOud3W*wmK5UjNfsmCE$ z7GnoP;Jlk57^`-7LJqAqrCS})E%KJ#mHFqT-bXwRJ3p1&qmvaW{9lecs65)DVS!X2Th6zHg}!BGqW790kLxvAch!0eioFoD5HHKWlzjc z9HpKiKgK>ml7>wP8r8mMu(#y%>AgT0)SjNKX4ue|dKa7Cvm}XD$E-bCGRKN0uh?e8 z&GUew#ERhkljfQTOOReJ;&Rus_u+7>4aqb)3o-3mQu?|R)6{|4m9;>VwGQgm)!ZBF z?I3ff68fCSIj?rIp_E3(r- zH9uz-Rw<~Nb=sVYh&kZ@GGQxdH3lL0N$^by`e_VHy{4+P(gmenm#Kn=g$^uJ2{uESE51bi(bz*_NE;6oS;K=4CklwopF~flYpN?wSm%? zx>)kv0(-!mUm09gJRmguQ(U1If6+1O?SPd&p) z0+ZviadHFgMtdD?tuCafFD-4Hp=-=u4=kL(MYFf!-R-od0t-qc1&S*1`waNXsS8J} zBWhNMUrI4XlJ!V0B}o{d{Rs@Xds5P)>CEOFD4)635)3yBML^0xj5y2{DK08WIJf--hU3e@t--~S ziJU9#*Yez|Wny%4V{$UWG{OT5V^rst|G(0JWCb!TG(d6Y=|w`-^Ko`$D@q)Nm7^#uayVc>=a2ZoiJj2Cm^!w=-%T zTPi_xS!DkNRK^u_E5&l5VZ*QNJZMCBOZq1&@6#8HAu{bG{bhos6L=y80ZMsN?@j*x zVpDMOLVK7;pAa&i&AI?+bSv=9$6i$88Xn?PJNI5*2DgkN@MQ%&P}Ci?0UDUSuCtU( ztfAjFzHz*5wHnEp2c zS3@M9a#u~zeuAr5Q+iV-j7xZkdG7N}2L|Iv2MU5NBb3xIuR!7V}G z3SdW<6rQN)#*0^-YX(m`02?*^jjxu`O4a}A5D&`!1irplQUYMHA#~gWxS55nTQ_Ts zAe$`Y-qS)I>WY;>^z5rm*lzQs{=B8iIJgLp1txml98`jW{RT68+4nEo_7b<4d9?yS z>Wwy`lA=+Zblmx;d9y>Fb$!LSQUwytLJ^ahE zk>+5yo3xpe$v@#v|K4BYj*m!DDI zcO^S-yQX-`3yL(=a25m8&8Ab^AStJT?&-ZB>tzk9Wn6Ed&Ly=usT@<14}(1r-f0nR zEEZnzXv7zpWP%COG$Xx4CPtb@N;Y=;64`+|6$C=9<*(cL-+rv#%m?(|YG)Y|#aHgu*1OH(nsMm6Y4i$o zgY{=|PJNXfD&wa~@F-rwHsc2urD@YfelVv0Tn>TpdvrEhmcc^|%osR@2#mS@2Uo3$ zg~t;ev=sWe{yz3LWFhM7Xv7Jf>eJ{7kTeilb5t54pS@0PdFHon@jX{mSmg%nps5tx z0vUEwv4PEwRmByC?TT8jI07HxkqYe=5?jt9+rVaJ&LB*Y7`9a2)3<@E$eqm|+JHEZK}WdVI1Dl>Sa zE*|Lnz3Kzh}zTvc_Q*Y59*CCZEYqSjKq=g|fulaMt4e zP?q33URL30=TH>px^#cQBQi$;7bX^Ywu)3eWEa;F_P=X*8HVs`heh z#0sIQ{Hleujp!EZO1HTMh*<;S;H^?|(6g0F z6fq78GrBowa8(vvS2FV|e&hehqPTOG)>N9R#;9s+tq8jnuj;&NMFHZI;tC5!&T#cN z9kd`&f5Q%{@$hC~@N@auKVk2s1|`XhM_o1mWv=l9F!QC)u2_$bdsFcAZoM)1>@sXg zd>4-~HdVj=F9)tBDR_mk_Bkbh6oE+m&H9AqPN4pTif@{pLs3A2OMwdVnE)h zV{9%-stn04OA}jJP>*@jlZ@s37=OIoWId6|T*Fq|UKqLz%$Ew&&pf`T*+yvQNW z8fzqgXHVTZeVJXJC|&rbQ5qRkEBs7jtPQb6LW{RIf&po*|I&tvkask?@yf-zEv9bm1=(#{X(EVP z8hj~&9HbCsLGI;&+A2j!1d#aZE6%~%QmOCdLTJ}qf%WU2YLR?;q_v0EZ+R*xjTCK{ z9D!G8L2FWa`bY?Z2nkvFYgc20wL{9tgSVjuL1{EU(4D4bpLKF;=vXh88uR%DwRrtp z;dU}2pK)eK_o?O0q&F$2d?8`CZ3?I1p*Pe}{8 zxfI~)>z2Y7^eqHXEm28n+I#AY8ebxz5JrFab8GoVLW#R+i_V^%AtKf%vMlKdE*efY zvyZ)5Sni&eLOXq&?YiymS|&A*tU`n{&?(r^>Am(|W;Xj*S0W;OmI!jCX^a7Y0EmFe zUT?;8Jp7fqw9xGhhQOP>rqFqo<7Sf}0YswZ24$$h4O*LsvJ)=V$k)Qj#@b9)$Kpuu*wGhlma51tk*GA3>j^dm~X*VPQy^cVor;twR;o;ea+Rt)rLjh} z8f(>>^pkb!)NAm}3%_MVO@k&arf|{s5OnC$LjpX>fFa4WRjk>tWyhWaM^2o%bjGJ# zxpB9e2Tw>|y!k-!h33Z}2DVQ+FF>Fm!SF(a3PTVsLZm3seeY467_msmD5&Dl&@seg zO2BH&p%SriaPjaZNhTodi?1GgQlu2A(uhIQNl3}SGGvldP|Bi`O)W=m`tsx}P}ris z`$2KLD}f^P6`Mx2HEPs$+yC5i-vfWS<4*&vRcD=g4H~W2WCLx7jXUa?(~g*MMxz-U z{bJS$Cr!0cvrSsS-soK_e~XxDs}FX`=j%b+?J!iYz54ZeS$?~0F=&rY+jKkLPo466 zg@%pTWw$-{LJRu*JMM@HM;$ZixZmhanRdcSrwkZ0WY~yNW5!LGG-cY1S##zsShNIn zNC=Z?M;?0Qu_szQLr6maXJ`&f-gysJsM)9Hy{^Cb>f7J;;~Rh^E2^d&re!;>=QCMs z4wuIl2t{Ivl*oXhT%lB{HCmnCFmMCi$_ml+PqI4D%pjb?fd5va4ZwLzX+eW@G-Q}V zXMIDk+_##KIg~zT3oj?5egzw4Qgl@sOFJOoF)c z7IsX>f&b%KWIO}y;LFio->{5jU6>$|Bi1-QxI^f$kt3BQq(pq-HKS zmlUB$e))ZEE8)zIAakQKRu{?4vNjpc_u~ai2c=Zm*P~>Yva-{as;4>PuDTlcpst-W zNNvs**RLpfN+XvxdP!rhmTYiCwdCdZO>+vau4-Ok^?Ik>ZvRpDht&Bx7|&(?7LP9^ z_)C)Prq_q8Q2S(RyzI?TsXuI4V<+j(eG8I_G930Cke4ny#_VWSXX*LsvydfH$gJZ2 z;8z+iCt*>eULH#xqWcD`lL}8z={9MepQgiI^?fdT<}q(rMVc{9n4sb4rPceSau2J{hpjrRVEtrTNm{z3kN1wN_QVn$}HBA*o86 z$060L9thw{y}U(2si0!V??y2Ft*to99lcy{smp{iAi{+58CK5*5Me_3te!0(CX}yp zysVx*5X#SXJTbB~M3_)M!|GWAB1|ZsVfCy45hj$+uzJ>j2ouU@^lShTCX~;xdbWTF t6Ut{;J^KL>CXB8fK!k}j%&gwUA}ph|5+;<@vj#+%P(H)z*#II;N(I+S+hYI# literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff new file mode 100644 index 0000000000000000000000000000000000000000..40c056ea4cf3e5bcd935eb59735af846be60ccb5 GIT binary patch literal 28472 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 g*)f7qB>Wr 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..08d7a518c350c2869b56a794008792e431ba38e5 GIT binary patch literal 20380 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 L=BmFUX#N5K362DD literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/bip39-word-list.json b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/bip39-word-list.json new file mode 100644 index 0000000000..c495654783 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/bip39-word-list.json @@ -0,0 +1,2049 @@ +{ "list": ["abandon", +"ability", +"able", +"about", +"above", +"absent", +"absorb", +"abstract", +"absurd", +"abuse", +"access", +"accident", +"account", +"accuse", +"achieve", +"acid", +"acoustic", +"acquire", +"across", +"act", +"action", +"actor", +"actress", +"actual", +"adapt", +"add", +"addict", +"address", +"adjust", +"admit", +"adult", +"advance", +"advice", +"aerobic", +"affair", +"afford", +"afraid", +"again", +"age", +"agent", +"agree", +"ahead", +"aim", +"air", +"airport", +"aisle", +"alarm", +"album", +"alcohol", +"alert", +"alien", +"all", +"alley", +"allow", +"almost", +"alone", +"alpha", +"already", +"also", +"alter", +"always", +"amateur", +"amazing", +"among", +"amount", +"amused", +"analyst", +"anchor", +"ancient", +"anger", +"angle", +"angry", +"animal", +"ankle", +"announce", +"annual", +"another", +"answer", +"antenna", +"antique", +"anxiety", +"any", +"apart", +"apology", +"appear", +"apple", +"approve", +"april", +"arch", +"arctic", +"area", +"arena", +"argue", +"arm", +"armed", +"armor", +"army", +"around", +"arrange", +"arrest", +"arrive", +"arrow", +"art", +"artefact", +"artist", +"artwork", +"ask", +"aspect", +"assault", +"asset", +"assist", +"assume", +"asthma", +"athlete", +"atom", +"attack", +"attend", +"attitude", +"attract", +"auction", +"audit", +"august", +"aunt", +"author", +"auto", +"autumn", +"average", +"avocado", +"avoid", +"awake", +"aware", +"away", +"awesome", +"awful", +"awkward", +"axis", +"baby", +"bachelor", +"bacon", +"badge", +"bag", +"balance", +"balcony", +"ball", +"bamboo", +"banana", +"banner", +"bar", +"barely", +"bargain", +"barrel", +"base", +"basic", +"basket", +"battle", +"beach", +"bean", +"beauty", +"because", +"become", +"beef", +"before", +"begin", +"behave", +"behind", +"believe", +"below", +"belt", +"bench", +"benefit", +"best", +"betray", +"better", +"between", +"beyond", +"bicycle", +"bid", +"bike", +"bind", +"biology", +"bird", +"birth", +"bitter", +"black", +"blade", +"blame", +"blanket", +"blast", +"bleak", +"bless", +"blind", +"blood", +"blossom", +"blouse", +"blue", +"blur", +"blush", +"board", +"boat", +"body", +"boil", +"bomb", +"bone", +"bonus", +"book", +"boost", +"border", +"boring", +"borrow", +"boss", +"bottom", +"bounce", +"box", +"boy", +"bracket", +"brain", +"brand", +"brass", +"brave", +"bread", +"breeze", +"brick", +"bridge", +"brief", +"bright", +"bring", +"brisk", +"broccoli", +"broken", +"bronze", +"broom", +"brother", +"brown", +"brush", +"bubble", +"buddy", +"budget", +"buffalo", +"build", +"bulb", +"bulk", +"bullet", +"bundle", +"bunker", +"burden", +"burger", +"burst", +"bus", +"business", +"busy", +"butter", +"buyer", +"buzz", +"cabbage", +"cabin", +"cable", +"cactus", +"cage", +"cake", +"call", +"calm", +"camera", +"camp", +"can", +"canal", +"cancel", +"candy", +"cannon", +"canoe", +"canvas", +"canyon", +"capable", +"capital", +"captain", +"car", +"carbon", +"card", +"cargo", +"carpet", +"carry", +"cart", +"case", +"cash", +"casino", +"castle", +"casual", +"cat", +"catalog", +"catch", +"category", +"cattle", +"caught", +"cause", +"caution", +"cave", +"ceiling", +"celery", +"cement", +"census", +"century", +"cereal", +"certain", +"chair", +"chalk", +"champion", +"change", +"chaos", +"chapter", +"charge", +"chase", +"chat", +"cheap", +"check", +"cheese", +"chef", +"cherry", +"chest", +"chicken", +"chief", +"child", +"chimney", +"choice", +"choose", +"chronic", +"chuckle", +"chunk", +"churn", +"cigar", +"cinnamon", +"circle", +"citizen", +"city", +"civil", +"claim", +"clap", +"clarify", +"claw", +"clay", +"clean", +"clerk", +"clever", +"click", +"client", +"cliff", +"climb", +"clinic", +"clip", +"clock", +"clog", +"close", +"cloth", +"cloud", +"clown", +"club", +"clump", +"cluster", +"clutch", +"coach", +"coast", +"coconut", +"code", +"coffee", +"coil", +"coin", +"collect", +"color", +"column", +"combine", +"come", +"comfort", +"comic", +"common", +"company", +"concert", +"conduct", +"confirm", +"congress", +"connect", +"consider", +"control", +"convince", +"cook", +"cool", +"copper", +"copy", +"coral", +"core", +"corn", +"correct", +"cost", +"cotton", +"couch", +"country", +"couple", +"course", +"cousin", +"cover", +"coyote", +"crack", +"cradle", +"craft", +"cram", +"crane", +"crash", +"crater", +"crawl", +"crazy", +"cream", +"credit", +"creek", +"crew", +"cricket", +"crime", +"crisp", +"critic", +"crop", +"cross", +"crouch", +"crowd", +"crucial", +"cruel", +"cruise", +"crumble", +"crunch", +"crush", +"cry", +"crystal", +"cube", +"culture", +"cup", +"cupboard", +"curious", +"current", +"curtain", +"curve", +"cushion", +"custom", +"cute", +"cycle", +"dad", +"damage", +"damp", +"dance", +"danger", +"daring", +"dash", +"daughter", +"dawn", +"day", +"deal", +"debate", +"debris", +"decade", +"december", +"decide", +"decline", +"decorate", +"decrease", +"deer", +"defense", +"define", +"defy", +"degree", +"delay", +"deliver", +"demand", +"demise", +"denial", +"dentist", +"deny", +"depart", +"depend", +"deposit", +"depth", +"deputy", +"derive", +"describe", +"desert", +"design", +"desk", +"despair", +"destroy", +"detail", +"detect", +"develop", +"device", +"devote", +"diagram", +"dial", +"diamond", +"diary", +"dice", +"diesel", +"diet", +"differ", +"digital", +"dignity", +"dilemma", +"dinner", +"dinosaur", +"direct", +"dirt", +"disagree", +"discover", +"disease", +"dish", +"dismiss", +"disorder", +"display", +"distance", +"divert", +"divide", +"divorce", +"dizzy", +"doctor", +"document", +"dog", +"doll", +"dolphin", +"domain", +"donate", +"donkey", +"donor", +"door", +"dose", +"double", +"dove", +"draft", +"dragon", +"drama", +"drastic", +"draw", +"dream", +"dress", +"drift", +"drill", +"drink", +"drip", +"drive", +"drop", +"drum", +"dry", +"duck", +"dumb", +"dune", +"during", +"dust", +"dutch", +"duty", +"dwarf", +"dynamic", +"eager", +"eagle", +"early", +"earn", +"earth", +"easily", +"east", +"easy", +"echo", +"ecology", +"economy", +"edge", +"edit", +"educate", +"effort", +"egg", +"eight", +"either", +"elbow", +"elder", +"electric", +"elegant", +"element", +"elephant", +"elevator", +"elite", +"else", +"embark", +"embody", +"embrace", +"emerge", +"emotion", +"employ", +"empower", +"empty", +"enable", +"enact", +"end", +"endless", +"endorse", +"enemy", +"energy", +"enforce", +"engage", +"engine", +"enhance", +"enjoy", +"enlist", +"enough", +"enrich", +"enroll", +"ensure", +"enter", +"entire", +"entry", +"envelope", +"episode", +"equal", +"equip", +"era", +"erase", +"erode", +"erosion", +"error", +"erupt", +"escape", +"essay", +"essence", +"estate", +"eternal", +"ethics", +"evidence", +"evil", +"evoke", +"evolve", +"exact", +"example", +"excess", +"exchange", +"excite", +"exclude", +"excuse", +"execute", +"exercise", +"exhaust", +"exhibit", +"exile", +"exist", +"exit", +"exotic", +"expand", +"expect", +"expire", +"explain", +"expose", +"express", +"extend", +"extra", +"eye", +"eyebrow", +"fabric", +"face", +"faculty", +"fade", +"faint", +"faith", +"fall", +"false", +"fame", +"family", +"famous", +"fan", +"fancy", +"fantasy", +"farm", +"fashion", +"fat", +"fatal", +"father", +"fatigue", +"fault", +"favorite", +"feature", +"february", +"federal", +"fee", +"feed", +"feel", +"female", +"fence", +"festival", +"fetch", +"fever", +"few", +"fiber", +"fiction", +"field", +"figure", +"file", +"film", +"filter", +"final", +"find", +"fine", +"finger", +"finish", +"fire", +"firm", +"first", +"fiscal", +"fish", +"fit", +"fitness", +"fix", +"flag", +"flame", +"flash", +"flat", +"flavor", +"flee", +"flight", +"flip", +"float", +"flock", +"floor", +"flower", +"fluid", +"flush", +"fly", +"foam", +"focus", +"fog", +"foil", +"fold", +"follow", +"food", +"foot", +"force", +"forest", +"forget", +"fork", +"fortune", +"forum", +"forward", +"fossil", +"foster", +"found", +"fox", +"fragile", +"frame", +"frequent", +"fresh", +"friend", +"fringe", +"frog", +"front", +"frost", +"frown", +"frozen", +"fruit", +"fuel", +"fun", +"funny", +"furnace", +"fury", +"future", +"gadget", +"gain", +"galaxy", +"gallery", +"game", +"gap", +"garage", +"garbage", +"garden", +"garlic", +"garment", +"gas", +"gasp", +"gate", +"gather", +"gauge", +"gaze", +"general", +"genius", +"genre", +"gentle", +"genuine", +"gesture", +"ghost", +"giant", +"gift", +"giggle", +"ginger", +"giraffe", +"girl", +"give", +"glad", +"glance", +"glare", +"glass", +"glide", +"glimpse", +"globe", +"gloom", +"glory", +"glove", +"glow", +"glue", +"goat", +"goddess", +"gold", +"good", +"goose", +"gorilla", +"gospel", +"gossip", +"govern", +"gown", +"grab", +"grace", +"grain", +"grant", +"grape", +"grass", +"gravity", +"great", +"green", +"grid", +"grief", +"grit", +"grocery", +"group", +"grow", +"grunt", +"guard", +"guess", +"guide", +"guilt", +"guitar", +"gun", +"gym", +"habit", +"hair", +"half", +"hammer", +"hamster", +"hand", +"happy", +"harbor", +"hard", +"harsh", +"harvest", +"hat", +"have", +"hawk", +"hazard", +"head", +"health", +"heart", +"heavy", +"hedgehog", +"height", +"hello", +"helmet", +"help", +"hen", +"hero", +"hidden", +"high", +"hill", +"hint", +"hip", +"hire", +"history", +"hobby", +"hockey", +"hold", +"hole", +"holiday", +"hollow", +"home", +"honey", +"hood", +"hope", +"horn", +"horror", +"horse", +"hospital", +"host", +"hotel", +"hour", +"hover", +"hub", +"huge", +"human", +"humble", +"humor", +"hundred", +"hungry", +"hunt", +"hurdle", +"hurry", +"hurt", +"husband", +"hybrid", +"ice", +"icon", +"idea", +"identify", +"idle", +"ignore", +"ill", +"illegal", +"illness", +"image", +"imitate", +"immense", +"immune", +"impact", +"impose", +"improve", +"impulse", +"inch", +"include", +"income", +"increase", +"index", +"indicate", +"indoor", +"industry", +"infant", +"inflict", +"inform", +"inhale", +"inherit", +"initial", +"inject", +"injury", +"inmate", +"inner", +"innocent", +"input", +"inquiry", +"insane", +"insect", +"inside", +"inspire", +"install", +"intact", +"interest", +"into", +"invest", +"invite", +"involve", +"iron", +"island", +"isolate", +"issue", +"item", +"ivory", +"jacket", +"jaguar", +"jar", +"jazz", +"jealous", +"jeans", +"jelly", +"jewel", +"job", +"join", +"joke", +"journey", +"joy", +"judge", +"juice", +"jump", +"jungle", +"junior", +"junk", +"just", +"kangaroo", +"keen", +"keep", +"ketchup", +"key", +"kick", +"kid", +"kidney", +"kind", +"kingdom", +"kiss", +"kit", +"kitchen", +"kite", +"kitten", +"kiwi", +"knee", +"knife", +"knock", +"know", +"lab", +"label", +"labor", +"ladder", +"lady", +"lake", +"lamp", +"language", +"laptop", +"large", +"later", +"latin", +"laugh", +"laundry", +"lava", +"law", +"lawn", +"lawsuit", +"layer", +"lazy", +"leader", +"leaf", +"learn", +"leave", +"lecture", +"left", +"leg", +"legal", +"legend", +"leisure", +"lemon", +"lend", +"length", +"lens", +"leopard", +"lesson", +"letter", +"level", +"liar", +"liberty", +"library", +"license", +"life", +"lift", +"light", +"like", +"limb", +"limit", +"link", +"lion", +"liquid", +"list", +"little", +"live", +"lizard", +"load", +"loan", +"lobster", +"local", +"lock", +"logic", +"lonely", +"long", +"loop", +"lottery", +"loud", +"lounge", +"love", +"loyal", +"lucky", +"luggage", +"lumber", +"lunar", +"lunch", +"luxury", +"lyrics", +"machine", +"mad", +"magic", +"magnet", +"maid", +"mail", +"main", +"major", +"make", +"mammal", +"man", +"manage", +"mandate", +"mango", +"mansion", +"manual", +"maple", +"marble", +"march", +"margin", +"marine", +"market", +"marriage", +"mask", +"mass", +"master", +"match", +"material", +"math", +"matrix", +"matter", +"maximum", +"maze", +"meadow", +"mean", +"measure", +"meat", +"mechanic", +"medal", +"media", +"melody", +"melt", +"member", +"memory", +"mention", +"menu", +"mercy", +"merge", +"merit", +"merry", +"mesh", +"message", +"metal", +"method", +"middle", +"midnight", +"milk", +"million", +"mimic", +"mind", +"minimum", +"minor", +"minute", +"miracle", +"mirror", +"misery", +"miss", +"mistake", +"mix", +"mixed", +"mixture", +"mobile", +"model", +"modify", +"mom", +"moment", +"monitor", +"monkey", +"monster", +"month", +"moon", +"moral", +"more", +"morning", +"mosquito", +"mother", +"motion", +"motor", +"mountain", +"mouse", +"move", +"movie", +"much", +"muffin", +"mule", +"multiply", +"muscle", +"museum", +"mushroom", +"music", +"must", +"mutual", +"myself", +"mystery", +"myth", +"naive", +"name", +"napkin", +"narrow", +"nasty", +"nation", +"nature", +"near", +"neck", +"need", +"negative", +"neglect", +"neither", +"nephew", +"nerve", +"nest", +"net", +"network", +"neutral", +"never", +"news", +"next", +"nice", +"night", +"noble", +"noise", +"nominee", +"noodle", +"normal", +"north", +"nose", +"notable", +"note", +"nothing", +"notice", +"novel", +"now", +"nuclear", +"number", +"nurse", +"nut", +"oak", +"obey", +"object", +"oblige", +"obscure", +"observe", +"obtain", +"obvious", +"occur", +"ocean", +"october", +"odor", +"off", +"offer", +"office", +"often", +"oil", +"okay", +"old", +"olive", +"olympic", +"omit", +"once", +"one", +"onion", +"online", +"only", +"open", +"opera", +"opinion", +"oppose", +"option", +"orange", +"orbit", +"orchard", +"order", +"ordinary", +"organ", +"orient", +"original", +"orphan", +"ostrich", +"other", +"outdoor", +"outer", +"output", +"outside", +"oval", +"oven", +"over", +"own", +"owner", +"oxygen", +"oyster", +"ozone", +"pact", +"paddle", +"page", +"pair", +"palace", +"palm", +"panda", +"panel", +"panic", +"panther", +"paper", +"parade", +"parent", +"park", +"parrot", +"party", +"pass", +"patch", +"path", +"patient", +"patrol", +"pattern", +"pause", +"pave", +"payment", +"peace", +"peanut", +"pear", +"peasant", +"pelican", +"pen", +"penalty", +"pencil", +"people", +"pepper", +"perfect", +"permit", +"person", +"pet", +"phone", +"photo", +"phrase", +"physical", +"piano", +"picnic", +"picture", +"piece", +"pig", +"pigeon", +"pill", +"pilot", +"pink", +"pioneer", +"pipe", +"pistol", +"pitch", +"pizza", +"place", +"planet", +"plastic", +"plate", +"play", +"please", +"pledge", +"pluck", +"plug", +"plunge", +"poem", +"poet", +"point", +"polar", +"pole", +"police", +"pond", +"pony", +"pool", +"popular", +"portion", +"position", +"possible", +"post", +"potato", +"pottery", +"poverty", +"powder", +"power", +"practice", +"praise", +"predict", +"prefer", +"prepare", +"present", +"pretty", +"prevent", +"price", +"pride", +"primary", +"print", +"priority", +"prison", +"private", +"prize", +"problem", +"process", +"produce", +"profit", +"program", +"project", +"promote", +"proof", +"property", +"prosper", +"protect", +"proud", +"provide", +"public", +"pudding", +"pull", +"pulp", +"pulse", +"pumpkin", +"punch", +"pupil", +"puppy", +"purchase", +"purity", +"purpose", +"purse", +"push", +"put", +"puzzle", +"pyramid", +"quality", +"quantum", +"quarter", +"question", +"quick", +"quit", +"quiz", +"quote", +"rabbit", +"raccoon", +"race", +"rack", +"radar", +"radio", +"rail", +"rain", +"raise", +"rally", +"ramp", +"ranch", +"random", +"range", +"rapid", +"rare", +"rate", +"rather", +"raven", +"raw", +"razor", +"ready", +"real", +"reason", +"rebel", +"rebuild", +"recall", +"receive", +"recipe", +"record", +"recycle", +"reduce", +"reflect", +"reform", +"refuse", +"region", +"regret", +"regular", +"reject", +"relax", +"release", +"relief", +"rely", +"remain", +"remember", +"remind", +"remove", +"render", +"renew", +"rent", +"reopen", +"repair", +"repeat", +"replace", +"report", +"require", +"rescue", +"resemble", +"resist", +"resource", +"response", +"result", +"retire", +"retreat", +"return", +"reunion", +"reveal", +"review", +"reward", +"rhythm", +"rib", +"ribbon", +"rice", +"rich", +"ride", +"ridge", +"rifle", +"right", +"rigid", +"ring", +"riot", +"ripple", +"risk", +"ritual", +"rival", +"river", +"road", +"roast", +"robot", +"robust", +"rocket", +"romance", +"roof", +"rookie", +"room", +"rose", +"rotate", +"rough", +"round", +"route", +"royal", +"rubber", +"rude", +"rug", +"rule", +"run", +"runway", +"rural", +"sad", +"saddle", +"sadness", +"safe", +"sail", +"salad", +"salmon", +"salon", +"salt", +"salute", +"same", +"sample", +"sand", +"satisfy", +"satoshi", +"sauce", +"sausage", +"save", +"say", +"scale", +"scan", +"scare", +"scatter", +"scene", +"scheme", +"school", +"science", +"scissors", +"scorpion", +"scout", +"scrap", +"screen", +"script", +"scrub", +"sea", +"search", +"season", +"seat", +"second", +"secret", +"section", +"security", +"seed", +"seek", +"segment", +"select", +"sell", +"seminar", +"senior", +"sense", +"sentence", +"series", +"service", +"session", +"settle", +"setup", +"seven", +"shadow", +"shaft", +"shallow", +"share", +"shed", +"shell", +"sheriff", +"shield", +"shift", +"shine", +"ship", +"shiver", +"shock", +"shoe", +"shoot", +"shop", +"short", +"shoulder", +"shove", +"shrimp", +"shrug", +"shuffle", +"shy", +"sibling", +"sick", +"side", +"siege", +"sight", +"sign", +"silent", +"silk", +"silly", +"silver", +"similar", +"simple", +"since", +"sing", +"siren", +"sister", +"situate", +"six", +"size", +"skate", +"sketch", +"ski", +"skill", +"skin", +"skirt", +"skull", +"slab", +"slam", +"sleep", +"slender", +"slice", +"slide", +"slight", +"slim", +"slogan", +"slot", +"slow", +"slush", +"small", +"smart", +"smile", +"smoke", +"smooth", +"snack", +"snake", +"snap", +"sniff", +"snow", +"soap", +"soccer", +"social", +"sock", +"soda", +"soft", +"solar", +"soldier", +"solid", +"solution", +"solve", +"someone", +"song", +"soon", +"sorry", +"sort", +"soul", +"sound", +"soup", +"source", +"south", +"space", +"spare", +"spatial", +"spawn", +"speak", +"special", +"speed", +"spell", +"spend", +"sphere", +"spice", +"spider", +"spike", +"spin", +"spirit", +"split", +"spoil", +"sponsor", +"spoon", +"sport", +"spot", +"spray", +"spread", +"spring", +"spy", +"square", +"squeeze", +"squirrel", +"stable", +"stadium", +"staff", +"stage", +"stairs", +"stamp", +"stand", +"start", +"state", +"stay", +"steak", +"steel", +"stem", +"step", +"stereo", +"stick", +"still", +"sting", +"stock", +"stomach", +"stone", +"stool", +"story", +"stove", +"strategy", +"street", +"strike", +"strong", +"struggle", +"student", +"stuff", +"stumble", +"style", +"subject", +"submit", +"subway", +"success", +"such", +"sudden", +"suffer", +"sugar", +"suggest", +"suit", +"summer", +"sun", +"sunny", +"sunset", +"super", +"supply", +"supreme", +"sure", +"surface", +"surge", +"surprise", +"surround", +"survey", +"suspect", +"sustain", +"swallow", +"swamp", +"swap", +"swarm", +"swear", +"sweet", +"swift", +"swim", +"swing", +"switch", +"sword", +"symbol", +"symptom", +"syrup", +"system", +"table", +"tackle", +"tag", +"tail", +"talent", +"talk", +"tank", +"tape", +"target", +"task", +"taste", +"tattoo", +"taxi", +"teach", +"team", +"tell", +"ten", +"tenant", +"tennis", +"tent", +"term", +"test", +"text", +"thank", +"that", +"theme", +"then", +"theory", +"there", +"they", +"thing", +"this", +"thought", +"three", +"thrive", +"throw", +"thumb", +"thunder", +"ticket", +"tide", +"tiger", +"tilt", +"timber", +"time", +"tiny", +"tip", +"tired", +"tissue", +"title", +"toast", +"tobacco", +"today", +"toddler", +"toe", +"together", +"toilet", +"token", +"tomato", +"tomorrow", +"tone", +"tongue", +"tonight", +"tool", +"tooth", +"top", +"topic", +"topple", +"torch", +"tornado", +"tortoise", +"toss", +"total", +"tourist", +"toward", +"tower", +"town", +"toy", +"track", +"trade", +"traffic", +"tragic", +"train", +"transfer", +"trap", +"trash", +"travel", +"tray", +"treat", +"tree", +"trend", +"trial", +"tribe", +"trick", +"trigger", +"trim", +"trip", +"trophy", +"trouble", +"truck", +"true", +"truly", +"trumpet", +"trust", +"truth", +"try", +"tube", +"tuition", +"tumble", +"tuna", +"tunnel", +"turkey", +"turn", +"turtle", +"twelve", +"twenty", +"twice", +"twin", +"twist", +"two", +"type", +"typical", +"ugly", +"umbrella", +"unable", +"unaware", +"uncle", +"uncover", +"under", +"undo", +"unfair", +"unfold", +"unhappy", +"uniform", +"unique", +"unit", +"universe", +"unknown", +"unlock", +"until", +"unusual", +"unveil", +"update", +"upgrade", +"uphold", +"upon", +"upper", +"upset", +"urban", +"urge", +"usage", +"use", +"used", +"useful", +"useless", +"usual", +"utility", +"vacant", +"vacuum", +"vague", +"valid", +"valley", +"valve", +"van", +"vanish", +"vapor", +"various", +"vast", +"vault", +"vehicle", +"velvet", +"vendor", +"venture", +"venue", +"verb", +"verify", +"version", +"very", +"vessel", +"veteran", +"viable", +"vibrant", +"vicious", +"victory", +"video", +"view", +"village", +"vintage", +"violin", +"virtual", +"virus", +"visa", +"visit", +"visual", +"vital", +"vivid", +"vocal", +"voice", +"void", +"volcano", +"volume", +"vote", +"voyage", +"wage", +"wagon", +"wait", +"walk", +"wall", +"walnut", +"want", +"warfare", +"warm", +"warrior", +"wash", +"wasp", +"waste", +"water", +"wave", +"way", +"wealth", +"weapon", +"wear", +"weasel", +"weather", +"web", +"wedding", +"weekend", +"weird", +"welcome", +"west", +"wet", +"whale", +"what", +"wheat", +"wheel", +"when", +"where", +"whip", +"whisper", +"wide", +"width", +"wife", +"wild", +"will", +"win", +"window", +"wine", +"wing", +"wink", +"winner", +"winter", +"wire", +"wisdom", +"wise", +"wish", +"witness", +"wolf", +"woman", +"wonder", +"wood", +"wool", +"word", +"work", +"world", +"worry", +"worth", +"wrap", +"wreck", +"wrestle", +"wrist", +"write", +"wrong", +"yard", +"year", +"yellow", +"you", +"young", +"youth", +"zebra", +"zero", +"zone", +"zoo"] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/error-alert/big-error-icon.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/error-alert/big-error-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbda0c2e5c224f689377d46593bc2cd3e7e0eb1 GIT binary patch literal 1557 zcmV+w2I~2VP)(zt(k|&Ot~Z|Nb<1jlS1>S!vP`-}`UKGO5Qce4 zdPRCpK<_6CAc12qTPJOh`eXh$_R<#V34y$+EI@+B|9gdWgLI*!9@b`%q-O+kPzitp zZW_?m5yNbd9zZq;WZz1F1dcCjq?;CjiwX}w{}RMgs{j(bdAhtTv8!h3+WQ2uQ#wF` z_XAyC7d@iqAUsm<62yyA0HVuscYQYMGa$Vt?S!<4?skWJrlF5W=R&%W!-M-odPpFP z14!_Ec-?YFqq|5oIB#ob9U)=I0&>a*67ei@PP&&RfAlgK&7QE03LnHHsWtG;>w2Mmh9&kxs}3x9>{hy-Puz< zMfSY;aR=lAym1TVr8XwMmj*Zuz@HJ6HR;HHo>~5wK&~R`*YrLv{r*Y1!52PkSqYE5 z?St*`9z5o&jUQmMBpbwFDHA}%y;n+j94{`bQi8zN9rPMWUV%kw5By1)OL4sWQn515 zz~(*0tqku)Du5WZ8k#bQ3^_Ly6|(&drJN+I#AGp!ZWNw}AS($M;fG@g^1lm>ewXt{ z9-^v}%F>r)+aJ+Ud6);TDQe0NW-?6G1#Q?xo04P>Y~s5xyzjZoYKl^}tm{sdkdbM5KifJ19MqWF|T`L;*^3dpx6ZU?x`%(8feB910Mlj1>Eh^L{B~ znHO@~j-^-_9+CaX;2|Z<$7b@Ssi;!c{s$0+wv_iZCu!giys#O0V_?4g(a~_!>8L7@!#5e2tsd0OPy3#sjAv1}L??&o}ghdYGsA zuM4a}-&q7udd1Q6jqZJ@t0GouzM|5o0SW*m4_tB>pw#v*1C*w&r?C3ntpxCEo25~> z?PDGAP3?uL+sqri?}K+DZQ^p zD!+|CD8Trl*9XS6RjQFMzIh;49GnS%w1G1ZCf)nEjnc-PR~Ycxd%pLn13mbu zkpA`6S2> z-(WMd?eN&fH%9liu_p=&PngS}tf`A_hmY~>@@^rA zk40+8`uMw?%AqYY{?mE$mU0hZ91?r#BS3SQ7UH*AFO0ow3hg|EcE~7QAA_6&NH3I9 z)CX~o2(vy4KF5N-{xX6bfzD!w`kU06700000NkvXX Hu0mjfqJicm literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/error-alert/index.html b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/error-alert/index.html new file mode 100644 index 0000000000..fb5bc777a2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/error-alert/index.html @@ -0,0 +1,95 @@ + + + + + + + + +

+ + + + diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..70508ebabc9992e64f1314f866b2d7ab90438c58 GIT binary patch literal 143258 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 Hzx)3OGG_Ot literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap new file mode 100644 index 0000000000..d9f1d259f3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap @@ -0,0 +1 @@ +{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg new file mode 100644 index 0000000000..a449327e22 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg @@ -0,0 +1,2373 @@ + + + + + +Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 + By shyndman +Copyright 2015 Google, Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7015564ad166a3e9d88c82f17829f0cc01ebe29a GIT binary patch literal 128180 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 ohyj3!`#ee%L;DTjx@8!5k5~VH0QmdE^#A|> literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..b648a3eea2d16b6ce783906d6b7d5f251b9eb56c GIT binary patch literal 57620 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

1mNzQMU2hHDR z_q;b{v3|G>@t}H9Q8IF{DdpD5z4{7@rlZhMQtZwcspI%=`21!X&JBKnEU_ra3ENiG zBGqT?iw|rabz-;q8#_I^cs8NUMj)e#vO|h|su`f&71Se0j7HH7zBC@TF%TV@zt6Fb za9Un-f0;b!wu`$6lfD{L0522Wxl4{Vv%% z;*fU@R4t6Szw3loi&#C2t<<)Pe!W?yf_!ZpenGEnGCChsR$TZ&ib3rhb|Bj1vZS>> z_oZgj`Q(bjr0fSqIcliUjgN$nC8!`#^dcmg`*)E&qlI>B!kw*yLP2YfRBiruCzz2# zp2`u2Vwg8x(_;U#7+I=v{4-C@mH59e4=Vci-n=vWxlt5?BLoW;Gx7KSZF!*DbSAEU zK^o@9J8URSQeQE;5*Ux=$)*RQq8h4iUJ&Ll#G>IX)t(HNNRh{L9{2WKp@ONQ@{RQu zge*4H2NTXr;|pLR+aGTKHS(Qyt2z$Z9iSzY373E6`Up8Uc9Y9VG%Kr>QZ$vZy$U?1 z`j8LCUFO@|_lp0e2>oaDKy-}FI*4L@K{zVvdu+=1c-7uQb*4B#-jujjBwBb-YxT#! z7gAv@!B@JsE5>yv$o~8)4!pMa)bk)!TmUPo&qd~B(J^Mnwf}0lPTU_A{$-PP&YQ=N z0R0sfEZw`g{-SD}ejz_C*k^jXY>#nXLOV+hkYN#v>`}x6+EHH#!)E7*Umhh;IE}U^ z5DL457_dP+mZ%giDRI~>^aAkO62WMKyE(Ys-UdUy`5lKu9|3S*$TS z)K)9l9cCRx8ut6>dQgY~>9cxihSkQwdckeEaC%J7bLe|e^aO(+SOOa!B`jBFhj`Ca z*(FO0@vu=Ez6d0D_JCt}JWLaai^J}Z`}+s+W}lM}IeA(H{QdI>%C3P6q^N*NRGuc4 zEK)N(bu@N+0qWnNv8LdEjmsd<3|CMb%3WXrorU}&xK=sT3}dxY}Ognspaazj>Rb#E>+0 zrX#4X0#>7hG4Om+)KLC$&JsqXjBM4Y5&1dMTQ>bu`8Ox5OC_-C!G~&=mH#oP1Iam^L^>J>KR+-q#mc! zJgBo5QvcvW2n2CFP{_i#JK#y5beN|frvcO_-AXaeEMM?Y({hvlymV()1$k&V- zydnrhggx2X=Cjtwc{o0nxv36r|5Z=A3!m5<`pCXu6cNKgY9FsJ^9Igp;R{lIyoTOQ zB;d? zw|4}-bFsUpMVpL^3YX?8J2aCx_J+juyA6+A%-cTSQmGvzf9ZNyc|2V>7GSBpi`{H~ z0o*o5;qvG0*s-!$M~DLev?$R7MK&`qndu@BWglkxRWtLBYfz)|<}q1uTa0gWVhM1d zb})sot@%@mkB_J7J}Kp9Q$U=HNk6v>kFPU0$I%+trTdoYF9h$A@Zo7ZnOzzaReENe zB{!DAPX>6y;4Hl%n_dqhe@m{9EB7ToPke#+y^(gr@zn14?>_wOk#Jp9_qly~S*!N= z%<(X5>nMJp1lNG^R`&D$q@$Nt07c*W)XiaRGq_0)*?s58m@ib#9lWU_Xfkg4@g1aX z6azz^O1+D}>>X5uMD9ve69{0@Nn$+8iJvpc*fshF1`+O%qh&0?K{W(6qV<*;-dosI z^l{7%i{`XIIBrhR+%PzB{$XCnJ8tJbKR*wv#+HQZ7HQtw>$R<#&NF}k<; z9bAM;XE(YDs<9GDmVUVZhXgPTGl?^g6xF7dRKp(z+)cJ#`+ZjoG?mQ#v01r2EN2UI zQ$&&6Fd>GuAa!5Fa$uXeQSOjp`Fx)rlt9V>HFph76YRb3eoSX59J8`w3{pS~-}KeS z)9P4_BI3%ksud`KluI-GJZ`AmdKtA*0?pjwV)3#wu9ay_^*iUA_AEbhoW#{S4o$GX z_L`zck4)`kXW+YUU6f@spWYGH|DmXGN29|V-i5g5#SM!@#kLEshUKLh=OnCMf5CBM zLwWq&W=&#N24=JS{I_)bSK;$o+LItEMGH%<_^Wi}@EOKAvN1o}`5~&sYBt#mt9icF zrq^#uO(Bsy#FL@_O7J19)dD}}|9+YGk2PMp1JG;0*scReA&P`OKTU2>)gt-D(21}) zYbEn|`EXaDy%lFD?f>}pUs+clf^^J9TIa8=7t|Z)8iDxSPnRBiNYy% z-O+c2!<4?b2Hl*~?V@pb@Mrw1m>)4(1+E}r=>JeLB4MPCne8)DLM^FBlFLEx-NKFQ zImR)SS0FoV!3hjeY&UnjecMB=jJ$h7)xneS0nYCSA*dihuCD@X??V4&$}PY&6| z7*)jTtQ5GK-7g-`)OvSVG3q$(xmZ;249TR^-Iz?`B5B{DXDZw5WwBL`91Tjv5xa%; z(%(HLl`{?ijFnD&8MwR`sls5y^9z=WotSAU2NmkZgtL!4kdP>br`IkCC3hNp8QC<+_t;2d7^d@wkd&#CTp$Y7tUnu>u9zTD&W|bAN7!mXh@QT^ zAuRrtGXaQu{crC%AZl;$B|P5nl5H$bLHYJ^H?-FFLS*kFS;5M03;4AX>}f4TiyryY8XRKl~bMTu;9ibthfI*SaNfFY|)U{m2)qHk`-{(mF_p z!eU3=Yb;U=3R>@t=P8@8J?_h{ZuegEmDTYqv>08wdyHpmA{S_Rz%LTw-BH%TYlGm# z=D_~ELOCp+>PY#Kpnt*H`^b@VQw5_G{FQ5EADIEZB*ASx5~t$;={T?wHN?yHDDq`) zkbyijSlwI5;Illl_H*(s~D)2k5YC~y&4rDk`c(r=+DwqsvuO&P?u zQo0m4IzTwV@jifHB+Y{s1hHd;#O-Z|MO?*b4DWmf13S#LApQD6c^GMF!-D7 zjm?xXw&V(o#xV&uc9w<}T(5%zs@r4!+Xt|<%&fNJk6}Wr92wJPVWWYd4;TwornXDn zri@dzVvpPYPORRUV42)_p;E4}DhXLrpEo<)m$XlwjtT_E08hSMk@7K~2n~m0POldH zvf~JE*rVQH#lUl+pe(%L<QY(I~e(PkI=gwpQ+vt?(Q8xQYO`TWIA9?zn{E(EeRblenf-W@Z?5I>X z6dWi^zh+}DYs&n-3@(OfC`|2ejI&*k4{c31zf{oI;-a9<9(oJwDTbKmBDW%q|H+Dj ze}7>~-&YikANz&>`k^;-1>5BSaUGbYBr;CIL?T(;n`56+;*zYWx9;T5zC%?i38wZwFR>|pZ`@X$5;DN}Cp9pRdan`M=zq`b z&hIq;uU2415)c8JDLfSkj#fVXuPkLlnNdpSrw0mG{)0)Ij7~JUts`|gk8MY2C;sS` zrs!CzA=Tl=^I9Gox#LuTL=Xa}>k&Z{OZf3l$!gF8vr+hNa2T}uz&w%iS##hfiRKD%qpO2Q&1-7CbFbE%f#l&@io{w-YA_qDabH+g>9gLEP zh??bp8(vVy{lwGp$+m+M8>k}FaL~zqPmQpV9}a|?47QHg5R5%}7(3CO&rF87Rg?=F zKWWg-ytQ-pje@EbgO7k{mnbvBzhok%!R>X=CMGOi3{ce)!%>yP$wb_sMll3 zZgeXhf6*h%Uk?dvEm|qDEjy_j8k*RXZ>)5RpNMamlZ*NQg0uYXF8aY0JCQ1i;bN8a zpsjQfulMydDn54CmXhA$96Zi?_tv==sCL(+29n>u56f%wH-v@aWf0wg%ftnwim`jM>403zS66SmrhrtKOVr7~v>|uGy zOY;Zaw;vI&QOlas(^gCgJ&lSri2ix_LoY%8wQCyr%d=tQu)eKSttEL_B^%P0>5FBW z{oi{VcJ`01cx!d{Y4Jl-$&pdpl%08`pH0_UV$LY#c|(EN2!55h+cUnQC?x>_{XY#q zS`z-}(ZJf{<#v?m9mW7{~se{RlpnWI$<*7h6*1y8yHCa)7 z;Dij_+SQ48O~s95s=pFXZafcu-tmbT7h2*29rBd7aZJm;7?xL8LWtg-15b~y(Sx1a zVJWuGyrIoDkcMcAoNHfd0v%G?qcGGDbHriHkgtdVwU-7hbCF6KYmE^FK@Vs#VDdJv z;Uy;o8?Bm=K*lm$D=lKEoTY9lszjNh{O^&zCb#6s?754bkb2|GkL`NPLzE4e9BgKF z62Dm*nzmi{JChaQJ#k1>Q7hlF(I^Ag(8t7-!L6kLv)83^(POJLr>eG|`=mM1nBvL{ zm9DXSKf+m{<~Kb8@E-mpG#q%OWQ;Z9N=C$1XMAV&-`pHg+FiX5Pjj?k@d&3;A(kh6 zzN!Uxo6Av}bdV&dvM1zc;nUSYp&pLD77`K_&nxj^C|}6q$Lpdaz6O};FgfB&!|M}5 zi+b9G4J0T07Vu!{W^AoR=zR!W^j(_YtvZ2C$j=Et`VV4css$e_SiEOgvv3H|FVG|d zpyL&at}}VN(5=g!Mf?}Z17y#SsGHOJibM|}{fAI{do1>6WHW}F$W(LTawZ9O0grCYjXhFxa%OotxJo<9to*chIz_t! z@}Xaf2kN*q(9De;u47Brjhn;iWe$^I*!{4I#$;de zL+s_{$27M|)A@euhPbq-66)YW^Wq_n(1WTYI<@l6gPj@^ZOmt#NTV~%9ga_i2$(Q2 z+BnU_ZDEv`UOD*+x(d!8T{L}eErX9col|5#ej7Fvqeb_bIvf)Y-2$qQfsXg_P*XTt z{;@L;U61v7&itZj-a-=(V(mtmRhhXFhuT=sqY)7Zk%(NbveqKGMBYYnDD?avty_*t`>Qpbj{ z;E5uQWA58DbiI#jd=e1xi#U%_u8A38QE6*vMdYL36Tvt1nbOlLdNA((@Jj*x3 zX*x_6s<Lbsw3NjD>}86Y-AWoN~=9$PXgP>!QxrC5&>hJrde%h|%9Ro(JT!_B*%D z33Z;)698;aOW}kO3=b?CsbPG?Eq#15`6H>6VC#2E3b)uA>G)|k*6Nce==O}K+tDTg zWb+HB{*g`&mqD;N(up2-oO6fkqu1o($sHxFsSOp#as|a-B9Q$}KpBm$JXbsPZ~At? zHBOxd;>~K);WtD;IRE7f!wFnx4W9Qe&jdRp{|szm-V;@_cj?ne6XbPRo^Z_liMoS{ zAqn`e#tzJh`|jLhHz|#j{P7_BHACjq_J*>?TbBxpE&(wCIf1&F5j%DD zIM(PCVtMN;XxHhJLMK{+Gk%%mHv3+laD};CMYf1b?+($#Q2lo6bywv|Z5i`IPR2H& zVHoDP_TlfrsjJI!Jphv*vm%@1;`tj6dH4sw+gHKb865UYpYmMy$q1UabhNK5#(FZDV3Q3)mXxB^iOXui;q2$kuNsniL( zxBrO*)9KOHRtaNc9O!}+Cv3SjQlWWUtbD!iKF_N{pl;RNgU>n5sA+fB-6Sf;IRxtY zt!#70ti7$qt!yFq-7xDJ;t+{OH!I`*2WkX8Z0R3oXr2v+z7n_noN@fxy#0c>ZBoyr zanA@BEeW|DKCNmJM;cr!M0(rm-;J$fMJ#(*84p%5h`Peivh?lhX;pzhAAv*D)ugX}2^V41(=gtbI8wGGs72c8r&bdw1lf8i|t;zFIDY5 zoV*`FU;;Kx5lYDp=VOVe^fG8*QcZi6nfBU=URRy)<>&SzI zy6;D&CQT>{P~JmM$O_mhpH)t9%Uj&Cm~kqKZbl@&3;f^|CSx|i+m~Yg>MQ+zr-SYR zKi?pqgiWLMZ0>Z_M6tHHc}4b8%_ccyo59IHdm?g6`}{kLvL^f=TL;k}jJ-Eb(mpzU z#9e*Vqlk(+RWBJpGD#Lh%5B=E)R`J}KH3X;DTlcF$wif-#UKrd$~0pd+hlDyUjoU7 z!Z^Om?8(2`Eq*4nwc+x_T6tDkh7|^}0tIP6bN*3f%YcVOrdVgN5*m0~IWM|s(Zag+ zNr(&zv7;DcNo7FK&3^!eG}E}i8{e67GFbP&m46fcwz(dHsj(M_(8kfthEewJ=c!#K z4EgutDk$Du@UOHdZwc)UPLH{BL`ah&tz_q1AlHJJ6FU7e<%qS4D}ENU3JfVYvyR2D z4SIE`L)d7saH|9+N{X!QDbjWSbII2(fQed6=#*>pc0)58ci&N-N*Ef_;3McC@TM%uT7eY>?S&Ur#kb5Rp#^aW)NRTbZjqwf**G=LZQRqfolz=2xPbY~UL_s)!t}$_81d2~Mk1&2!O)uA_2B;! zA?dWZ6g6zo>Rnk0e+lN^qG(nqnUntJrF7r!FW-mA<8|~xKO8J{ z=*!EUq{1%#t3;V8K%f`*?5jRJd1p+o0Lmo4J<@#uUjoSl%I*1k`K&JB7zim|R=@F! z%w9}fxGlN#+3BX7J8bGM^1Iq1`g=XC&4$mk_chazkTZqF(1nZ)W%?>t$x{x_47UMI@K< z4-iWYO4W;T6uYUl)Ja2>#f;qI#T(pGg48&#TvZ8d2C>l*2zi-s?l7OpF?87LvJ7Ti&2h~i}kIuV}*;^bCdo6 zvZV0dB%1uhMxXE^kH?jh+d8r!_wxY;#xQr~i3pJoV}mnrTAQ~Jqr&C5Q&(p<$@imt zNO!qZ=!!hqf{LaBL-?zid z%p@};I%;Q6?6SYA7~~c18qRGhXXM%uLF%iNHr18E=(l?mOe|m?qG%(5$6xO3PEZ&? z=|VjYH1bN`sS4EDY6hd5_n@VNpPntuU(-(BU^mGzw){qUdW!4qPyMqm<9zd|;hW9m z`f6>!x0i-mzRHcMBkEM+Zzlx97wbJ2asj1c8Ugh<3}@PUocZn{Z28}^36h@yU23AK zW^RxWnS;6!&NB%VABFz_=8Gy!VL8&{G^S#yJ!4QIG%iHh(auR+zjyvuOtyydr;47W zjbjbUs6_dlWE?aL%-YC%?bJlhHy!{Q5ZST7+EYnNDhp6OUlavS$fckxx}Y9+<@J>w zy>$0GAgaZIJVfNq6%5yKOs6)-O*0i5g z&)~c^mKOK(?E2ckvO({P%y*ge`WrXMWma`}S=2C%CO~0wTD7^myYDD)YjJZV^KuFT zxKdt2gLu-XdMe-5XvXs9SC2x$$gX}981_y!I1R>CCkf<1i*KzN_H2&mml2BE$R^ci zEirW!Ny!Z&{Ct?d16Qlm}E=e=YB(X#tVx&L=~t%o4o zkS}is4;l)xM5Vjtj?V1P0QT}zqRl8+OdX0<iLF^AOa$RA24o6f)QT_sw~qA}cT8M;0lZ zKrZ7cO;bugcoDd=mJQ=onP<&6?JBZ^`~`#ggmlGvfM?odL@d&)VPFy)sjQhJB~Yy| zyX!f#7i%m{jNQ|QUxX(hv)LPSaiUa}56-EtRL%a8820Qldf9g!?R8Oe&|vS)Ft=4m zOorv3V>kLL?l^Ql`^biGJ)z+CN1-6&t^9O*R5A=b18@1E@eICU!%y4un9Q3qqd{;b zzAlnZZo)>3Td$Ip^NYM0F{ExQn%sM@p=S~JChX#9QkxxBZy6^uhkv}&aT&_cB%<^V zepXAB2V^sn786bNyae?`FKCc)%O-|_6HCJ_W}GYTEgdYjA+`0EM>U4fJaiqQdZt`= z%GFWemA;u(%s>!sSH&~mNcMKq&G94Kk7CtkRde00=$hFHf4q%L4jvA~6xJftqj=<0 zMdvWCFkTy5AbUKZ4@y&a$nJMA$+EFjb=nLJ+}!T8 zKWgOOb!8vt)^^1+;Q-5;bEbFuM^cx#UX(fA{gG(L^%tdsBsMPJLZFmZZgKbcC_D2x zyJtVQDStm}>LC9py?3Gi-d{>7>gH@8+Mgi^rlDKo|KtJF4 zY)g+KSEKrcjQEW6q3;b7;nF8}Z}|!f@CKqTpyq*08w16%P60#OX0}#8uCy)far{c4 z)1xhP-i+5;5{E^~nsv_Ikk|fr={~TW1LShBq(H_{a`UdbvDVsHZUJsKFhw!ww+60& z7bEqGeD+HKN`RX61Av+Caxj)KYYhL|EFKi1B#;F~p3Ryp=U3ENBE!&`(EWYWb{A0=RwQ?V6)|X3gVlAFJ_7SaUTt zpO6%?&=RmP0zCrHQ+gGyj{wnzB1BHpytOmf3tW_vEXFzweZQ+Tgz*4BT1Z(4J2YAXD8#SJ0rv-0QtkJ0FNbwFY3DU694ZZWknFj=>q_}KKVcS({2Xf>fpCyKC#qIl? zB~1=V{$`r)oU2|8phNN#(J(LrZH^UEzZA{{zyDkm7&=9-%Mh^Gi=+(P*-m^sY^y)mLA;0xc}e#cm25QuV?}1ts4h0Qvg#T}NSX5#7a$ zV|Iy(1jc1fn2}O*iu(OGb>%v_0A#Ja546uh&LyRhjf{0}VvIive3P9sfjmCTcK#Nw zi-@TCoR=#_{?cE#&5ED1KJ%}{j?!UOJ$~n7=1GO^j*GhzEXxKx*nZQ!H!pXU52IXp zm;ZwnIA}hohqT=I0uO`MnU?7<8R3hk8~fi0BEJ3HKwVY^&&j##do*iS#dMF? zEY{mHUm>mh0u(Jf$zC2*oixKdj$EXmA^&>aeRvDaiejbw)YY{$!iBdrQtiuyR$mqx zQ^9yIU4~OU(6DcfBr0L@pAMPO6dMe<$wsyDNqbQ#kMd>gmDRo^At@uuV9;3Ah|H5yv2N_&hL)^<0tqy|UO zTyg1eKHq~boGr6PZzJ0Gq#$_zu4$B9qGicvzr-r-JO}!I@i6BfKOWn>aH7YW zmOO+MH}_5yt5~j= zmYt)8s0GD)(8e2g0hy?@v7GN8y#Q6@e*sE-)5&2kZNev+$xk3=gH*}_WW?dHb#GGqcJGNhQEf+T&4zjs zRKOnHfi;I+J};rF!>V$JS(6#;Hz73Bcf4(7$#BDv`i<<`_53ai&|x3|7Z*)r6s-rY zYJ`9RdEg@4nc~Raif!aWl&;Q4zUsnHE4?wYH!yTNcX2t zgMX@@hLrs(Odou_2%`+TVi3-P5ERD090-+dH4xX}#bjJ~rom~=9t%9|m?$4d$=K`g zduO*3?lG=NB+9we&gHRX)S#4&tRfnT7{5Wnrp>C-ZH)Wek_?9G85|uPB)J+bk)vQn z3CbyKbnV4IC@er*o*}H>=l6<-S8xc`y`ksl=`4�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 iJo)Usyk)(E+JD(Pg(x5`GWOzAUgUGecn6V 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 z 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: this code means "new line". It is just a way to tell +the code that the text after it should be added in a new line. + +# Writing style + +The file contains many different types of texts: buttons, labels, +indications, titles and more. the name of each text can give important +information about what the text is used for and which writing format +should be used. Specifically, many texts have predefined prefixes or +suffixes that indicate what the text is used for and some special +characteristics that the text must follow. The prefixes and suffixes are: + +- **title**: the text if the title of a page or a modal window. Those +text use title format, so each word must start with an uppercase letter +and don't end with period. + +- **button**: the text is used in a small button (like the blue +confirmation buttons shown in most modal windows). Those text indicate +actions and should be kept as short as possible, as the button are small. +Those text use title format, so each word must start with an uppercase +letter and don't end with period. + +- **title-and-button**: the text is a title, but it is also used inside +a button, so it must be treated as a title, but must also be kept as +short as possible. + +- **label**: the text is used to identify a form field (it is shown at +the top of an area in wich the user can enter text or select an option). +Those text don't dont use title format, so normally only the first word +must start with an uppercase letter. Those text don't end with period or +any other spcial character. + +- **check**: the text is used in a check box (a small box which the user +can select to accept something). Those text don't dont use title format, +so normally only the first word must start with an uppercase letter. +Those text don't end with period. + +- **error**, **warning**, **help**, **desc** and **info**: those text are +used to give general information to the user; don't dont use title format, +so normally only the first word must start with an uppercase letter; and +end with period. + +- **confirmation**: the text is used for asking the user to confirm an +action. Those texts normally end with a question which should be answered +with yes/no, continue/cancel or similar options which are added by the +code, so it is important to maintain the nature of the question. + +- **part#**: those text are divided in various parts. The reason for +dividing a text is that the whoole text will be shown in a single line, +but each part will have different properties in the UI. For example, a +part could be a link, or could be in a different color, or the code could +add additional content in the middle of 2 parts. + +- **small-label**: the text is used to identify a data that the code will +add at the right of it. Those text are normally parts of list, just like +this one, so they end with a colon. those text must be kept as short +as possible, as the UI has little space for them. + +- **table-label**: the text is used on the header of a table, to identify +a column. In the case of small-table-label, the text must be kept as short +as possible. Those text don't dont use title format, so normally only the +first word must start with an uppercase letter. + +Not all the text have a prefix o rsuffix from the previous list and +sometimes it is not too easy to identify what each text is for and how +it is used in the code. Because of that, and to avoid having to check the +previous list constantly, it is advisable to follow the following +recommendations: + +- **Respect the capitalization style**: different elements on the +application use a particular capitalization style, so changing +capitalization on the translation file may make the UI look +inconsistent. + +- **Respect the finishing characters**: some texts end with a period and +others with a blank space. Those elements may be important for the +UI, as a way for separating the texts from another text which is added +at the right by the code, so removing the periods and blank spaces at +the end may cause problems to the UI. + +- **Use the contex**t: most of the texts are inside groups with other +related texts, which may give some context. + +# Make a translation available in the application + +Although creating the translation files is the most important step, it is +necessary to make some additional changes before a translation is +available in the application. + +The first thing to do is to add a bitmap in +[src/gui/static/src/assets/img/lang](src/gui/static/src/assets/img/lang), +with the flag that will be used to identify the language. The bitmap +should be a .png file with transparent background and a size of 64x64 +pixels. However, the flag does not have to occupy all the space of the +bitmap, but it should be 64 pixels wide and only 42 pixels high, +centered. Please use as a reference the flags that are already in +the folder. + +After adding the flag, you must modify the +[src/gui/static/src/app/app.config.ts](src/gui/static/src/app/app.config.ts) +file. In particular, you must add a new entry to the `languages` array, +with the data about the language. The object you must add is similar +to this: + +``` +{ + code: 'en', + name: 'English', + iconName: 'en.png' +} +``` + +The properties are: + +- `code`: 2 letter code that was assigned to the language. It must match +the name given to the translation file. + +- `name`: Name of the language. + +- `iconName`: Name of the file with the flag, which was added in the +previous step. + +Please use as a reference the data of the languages that have already +been added to the `languages` array. diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/app1.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/app1.png new file mode 100644 index 0000000000000000000000000000000000000000..67c75016e9de33e7186cae8efe99781d053e8f8b GIT binary patch literal 49616 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

$}pCNRSmuWrj8a`_R;r>bL$YXAGEp_~< z)p|e7U>VaW>yPzrtEejLC@OdiJwq$5lUq$kb+fSm+ndmr-R-DmsNbMw2R;~+Aaf&% ziL2}sa*lNP7uAVpyr}F)qgn#hv=;{HpEDP9nr)8fRyrp&W=nOCke9~*OhX?YL{ zShcS6Qxuv}Z6HWu`yP-sDe*H+&S}s8T_|+cXpC#eM&#gtNPiD45q)sC2gS$>|Is%C6^VwxJk*3Whfxq^*G&6I=YC za(}aaBuu~CS!q#p^cP$;H9(bSonA5a_smsf+pNQG=mxRb<6$E@Lyjfb@%qYqlzoke z83xKv&u8LiYcZ%DtQ{e7u_>|;WY+b5Z(^q*<0&V#tv`Ltn%zClL58qdWyyg3DF}iu z{`3lh+VPJzAqZST4=BB(^#L6um>=TNl`ahX z>$4QISU+9`+T_uK`4&e%x-#Wu*+G#ClqGM#YK?|`;M3OYX4|eXMOJUPF71P8dsk#5 z4JSnx7c*tMZn8ZoCBnT2QS{I1F?G%ftb`tvo^;HdI2H}w0nA|2g2da${l>z=FBe(s zai8bR8>HmkLl6Bu@naqQR?Q9^nE4t;bg`87DT={oi%-qcO8e>2^n1Djwv%u~0A#Z4x>do;kjpAp2rD zf)Of8A$vl()T!?TLkPu^a#!ik*!gOQSL;W2VPS5#zho7(8>3KJRmQu>F|+xHoi1z&S*QC3|a>Yh(yf5zc}w(cJrB%)f2^{3T!YL z%=u*tiS@lc!OwJ|Qvz8S_#N7utQM^xzm>;3N`HGT?Nm(?rQ^Kp_%bPCnWc=WD|J9s zFe7v~9sb!{RSM^14rc8{1+-3YnaPdA2^CnyG#Ta<8IRSd(D|&zW}pjK0<{%M@l1O z)fJpH>NotEwAw8@6_aDddpfwfJN;ZtCE@-NXTq%l5an7^{FLtSk@OP@#$XG_H-ln( z;aKty@)XPvEZA=8@Y*v1^_elvTFLd=6of^J=F^NxYSq!8$%Z!UZx#PVGSPWbnipN^ zI2Rr4^!p*1a;9eDVKCV5b^DJF_w_;J0Fz>OE%;zAZ8d<8knlkf9MY`p{=apR$O2Ep zhR+@DJmMjMdcbS3SNXnwM0ryXzQ96`rf}?|M*LVd)}Olgae}amyT^|h{2ASGQFMfM za2~}F?zl6E15{^WYs7*}R!P41Qh`d{p^45=EM;L57iCIxihgf;xYUOXfLIEniJ*9;NU9M<+Nr`5LTa zW?=!P4HKchys{#_*5CPEa%hGM78X_%-V+`(P#Hh1^B*IGa2$JM!HQQ5AJhq<_wKPZ z9E%nw-u+~?<;UTFte!ctS2guw2!(R_f{u;|2*KZoc7 z3x;q~%4x~4m=(%f-1$g6vzq#RCHdKu0T!RgCg&n?fWlQiv-EQT62u^UG%jR48bpLa zx&1@cTOQ()ttgq&bxo+!a6=eeho)^}rMxGDHcT3}SK;+{6$5T4&j=K3=mDv9Yc|`v z$R$ggh_<{#Ly5$Anhw&cL{RAD=h8cpgQyk}H`*WpycW`76br_j6iMW~OoX0W10K4E zns>C_3qRU(!by|XG1P|!pFTFttrBhrO+9}$g93)yN9P}4D#Oxfq0`|c*)cy zsGG)RlHljY62t2PcYi)X_Su5{!DR*;2Z7}pD5?Uf(+CM$Y8IgY|5~I~F5%^MZ6C?vXrMk9s zg-gL1xY|t6 z32Cr%L;&VVaUx|-2#zU#Vc7AE3UQqKpY&=)2sDUW^OBHJZk|ESq8agS?T~NeP(!Ys zQ#Do0bjLwkBCHGKnM4>#?_v)?ZeVnd-vV)BpXcPj(UQJkpHeGk+2+5*2&;{l+{hyu zzkwY@?yuuR0b+Fp9oL+oUYk_95j4D42`l-EY~5t%ED27al%l5;-`9d2rF5|u(PGbJ z%(vrrqA%<+P{qRBRSfk8Ob%qI-Xd?ugRp%4qV|Z4z0$o5cz7Z*J11u>U-^Zc|80X{ z{6F^UM0Vd6-hbZ)ML{#YjoII})6RTEk2&6oXyDU7xhzOC=`#c=4she^J-h+@YBsFj z*SRC5EQ0#%JmX+pbN~_X@W2&Hvng3rI5EPY^|FuhwWG48#+%S#JO zKVUdU`A`7~VTk;{96jaoQa{TS_RG|s-$_`#ssTLM;=~I2p?(8Rw}_DP;W_L4F^}lV zr7mZ+AvR{&`PcCMk!TZy+l6=H;$TC$g1` zP+a8%DghL1{b=rAc;$zk&~yroXlZJhACC=cR~>*C=Xz zCZjm)=D?qO-l9aJ;%Kk|yrhQ*hLkQ;gq5@BX97$<9NvfD1fGP6I zuIuaAF~uV^AKOXKQQ_?Sz&x1^46YS$8sC(KEWfe@%O>XpPWJaGsxBneP)87C2)t1# zlK5VfJ;b3Py;z@ndyuuW^R}8yQ46{a!yh#U3iFBWfyg4sp8}@Dz|f8W*Z;6n=X*}x zX7_x$rfR!=x%1-9(ZqT!4nEq4+Gzh;KqSV7Gb&v9B!A*g{^vW*y4BA6z@nUTJBhMD z-AV53a@W7WZAOHGu9R+=jVK(dTtcUlE2c^YP+Jo&R6UYUavJP~b8q&rram@|5Q=B5 z`&PG?`GpY2*24>YPlHJ>ZDuQP8Ng;Q3s{-2s7GOu0EPEMH0AU?YBdDj8<@%V<) zKQ31ysKN-19{$WYeik7(fkw`#Tl~9*$c~hpyGm-&+>JKC$Ionw)=YR(X;n%t)BH8p z(s81o_83HSz=~Z+BqCTyFUY#r+J_Q;pAja@BFA2*oTXf3-k?n#SnDKFR){s^QRd_N zRWXNz44PXnsk9KijM3iU<458YWJ|ZKyb4rW41>jBmH?2R)TsL^rHiC- zrtbteFYbxLe3znsMaeA;pO~nZ+=E|Vgqm4;7eBozCna+#jAUgLUKRv)LT(G2*9H~X zL3i%{u31@Cv*ORVaCFjdPpXF!d7mV(FHkJNKmC8X6Z%xBuVdipeM&>Jt&f6EPEG`u z?VbHLB=}lQ!~)Zvq2w#Zp6;l>HyioMi~fJ9R@Gp^Uki!s171eC+%uJXLHKj}dzSq~ zRWIT!lBw#v7ye%uPFH;TKDb|3*=TYw9*XMF37y?!%l|LAs^{8Sg+pPd)k<`L!Ln3p z!>Y0bvj#w#-6ewnLEEG0Jx>89H3(o~BuqP~BKF1}Qi%>6r^vGgBU6)kyvLfXW`;nW zW2T)Iq0YVo92O-=z2!hT$|6U*k$f03cbS;n1k3Vvja5~9Z=NXz9C%3tu$nadY?6v> z{SLnxgJc0rf%(3r+?2(%Pl?CBuwLLH=elCz-#*wbBR7b0 zOO)*MXdV4j4PY9ShH+W3-9B8vI|IZ5_HxJLt|#XeD{berH=S%KyU7lC+fKlAlL)ut++Nz1*IYCS6Sj;|Vsh8!=0)5rgqJ z!hP>-zi|D&>V1zC6cpTcs0gmbSNVmn;j!YTN;;%4mSR??Awpuu@TPo&QLyrq3MM*I zny;tqw>po@i-RoKAGru~Z+>sRbK#fiH9?Rwd*6Rjb% zTMd#M!J*jNzItr(d1SSDetnvH9amN5`f*{J{OpZD5^d9(DkQIHP12yF6%{YOX3zR_ zq#(mOpF$x_G5Gg6Q)51VD30{QGe$i+XJNM9rRxpYwA6tYRgL79Mhz!m*s-|6YKFJ< zIkd!os_QR8|C#z*eU>luH}FsK=SUy6+jvLTlD=QB9?IcKlACp;ubWt1chRqR$PagK zZN0l5PujSg`=4{LuD^&g#X7CYeNaYmlwUCB=<;ix-i)3*waASW?;Vua!f9>F!C?Vp zP^}8Er6!yl?41M1G|J_UK93e50bTB^#kj#Ltk&Y>CXUqjN%1Zyo(zcU zd@lEk0G^z>7f=T9s2$16D;IV7=;~r?i^t7z@kCKjbnmf&BWuUkV+y1tO_&u){GX;E zW%QDNNwd`%bg2YT$+D%vej#z!V! z{sbL2NK8e1tC?jU+)5o@?`Bii!N()~8CB)*X!tj>Wy2AP6o%?8q(ornAvZQZAg}t6 z?^&l4Ts%+<$PkD9^Z~H9< z-R^YpnVx)u8GCRI*G@u(*UdD0S~QO)Wj%kq#9`jh4rsGu z0n#H%uL#AD>Z_B~G_RvhAtun?-J_iC{pBY)l&4RUGm1pWda}AJL!UzRD-6gzTud>Q zRYN3yUL8s36fbS!9DDe@axgNFh8?xa4t?_34K*@5p8p7z#~k~a%*ay^gVE;+i(XXH zyJ_CO9gn;GF7^61maVry+^g5cU#wGgOa$AFQON){n2X=X5V~Lc7{#b-uwQ0L`-_`c=$ks3-e%;Z(L7jX&WC+TrZjPYXHvNP*W(hn=*4>;i3cIz;$ zsri1SPT0BllFrWP6)Ot=Nxx~)JtxUv3fL{#i%bnJli$D6*p-wU0;W7>V{L@P1ZJSL z1rjHwYppPXU3570%hH;D=ul;n*E}^}4N3U_? zqkVRo?0GgjYW$VP7fouKX?(I#-e@rJ4t5Fu##Oe;qcN>=d5P0s70Xa~r~H~>A-Q2B zUozzJz;r4`K~(j0Pe`Z9r+O+pzWFr?Y$AhpnbbWD^N_bb}lxnVo`w#qPhePPT;05qEKsYk{6ZNHEb0s>E}y8#vgHbcPa6<@jC z9mjmV;73W;%Wb6Sk^L8vB=ExlEH}F@ZQ}g2H(!9ZUw#L8`QT`)-G34?-n_d7R}(!( znK7Gjl6zs7!_!=vCilb$;|jv67UC$5)PD|0)~y1yo0R^bIGf-$AWts++%L=4;-zHs zd`@;thfx4`*z4-5+(DDu)U&COTFk#u>FChY3wu`7f~V+oGI232vlNm@IIz z%y1c=fm0#rr-Wqg=J`Zr#$bh^crF4LpdxnvwT8Muf~kG5U0Ix%^XX>s#iH|e&MSn* zggZg62GV@rAB+n-p4Ws0rI7F9qK)ruQ_)p)Ww{QQ+ga5Yj4{(#k?wtnOH5!I`6L))&GfnpvXfCX; zysyf8{CiVh$2=_9u$|%(V>3iFz}VXDYLfYpuSTFXlhN&LHZcd0|b3Mf{s^ zW5G(tr?CWTtFF%E7y?!M_mqdska>pFPCvv*Vx~EI#^<;R7-`em-6ccPIEYcVw5C+v zp@JZrik|#`RkRX+rEQ>In@3agOhq0PeVcHFlugQk=-P4~Cu?KIN=-#q&4VKOsTQk> z%MlzUdAk<;uGs&^w2A*am+`EgeWF>?nK47g`(3{8U%V_`R5;(TH4(U0!0zVZ`Op*w zC}&L>HdBq6WqNVp2xM?^5GTF%8eXFK_PdLpRhyMA*YwFR!koe>nj)r2I#-8z>stgn zN)0c4C4+tvx%94Y-(a64bsWfS$ zIHJmr!0l8M*hmnY^aZ-jftex@I?{yL5M?~Z5N{k)i-#Ke?FVbLTgJZ*rVnnlKHV_{ z;D@KWEg4W3l!a=Cah{dKOXZWPh{m>o``=1gzb8Xbby<9>DmAkMby!HU~9Yzg{>zy{;_)7UhNJYvF{ibGCkKSRHpUgy3gMbJ9T@v6{UfztXUp!zgdFbU zOBQPHcPG^l_i@JQ^L`&EARv+`h`w>vbpY*->3`4O<^}HXS!n+Hp)*&_&Mz-t9SGo~ zg9o|1+>i!1I9wXn>xsCnpGQnM9J;Zc&_K+@D90<9i@s`x$DP`wQV<6U)DK$6;ful; zwasGpF%L2dmiS@&!>0-YFULm9~Xx zF-qbbwn^tj1i?VK;4Ehl+6GN^)b#WV3$#go&-wQD>vWxDW>hk)VcKSJSh35%oQI~| z#~7RH-xN{@)LkJS_i@a8bh*K}7dD^}i(v9Nd5PZSBMiLTNbD^{dJ^Mxwso96v*ih+ zfI`R82+i)Bxc>&d&?n-gf4>_P&_=viRZ~KDvp^()zZ1WO>-cA?t+dR=&%08|b=Ogz z2(D#py!B_@_zyqo+5_hV$vIOTR_lf3G%4kLm zoohFu^C;IpW4_j|G?^5Gu&xy^=G(c&5vQo}XXXnSQZUBQ^|dVrHPJR2!t5K#z-2)% z<}#|Xvqr^JLJSiM%C*YgxDzs?X$oy8j#xlhobUGr+jOa-m1+UZMRk`o1pvdj&WR9u z+f4?&2BWMCZXD2z~z8Odyiaoz+7f#U5rl><5Et3`kO?_n;d)jBk>Kb_m~ zUT&-mb^GVQ!Y$upTgU$5FG9S)EU^UUxfWMwvZaCN#E~-Ncm_}A*f?5mtKxbT&A zZ7nHOTn;NV5IkwMS~%B`H3vY4f;Ec;eYa)(x$>#5%zddJ{toN?hu$nwK_~opgM9foqmn*$d$}|jcg}r~ z;gV931kOxJv5e+&x`J+uw@~ZA>O+^yJhcA#hFc*houH@4GoXnm-o4j??$iyi{0`hZ z_3$b=vUlu>e$ZopR8-rs9h1Mc6YYUa$n(VA`vodmPA)phf`T*eQQCuE=IbPkUJ(5Mr=v|GZu+Wx^x zs!{>mjMK8MW!Y&uOieZUFCu#KL(dFeVain9{Aq_oMQ?(`BE~Q{S$-0nJiUVgMj2ch zCU2!7AqAk$Jfiz$n~QVbXk2h7kpcs1YR#QrmgR>~F2?tr%n+95es2HS0U0UOr?m>R zJ^B&pb2qU>O_CLC#RiVw9MR<-8M{PzO%@x7P<%>-klz73LA05YFYW=q?T22b14Svr z0-f?`gKJogCaJ7Axdc(Vgce!8tfNp)1@~|y_JySK4VMh+f#S@28&j1P9Eot$Vep)~ z|Fvn^#+BiFK-b|A?41f6QSBh3`8YRnI0A(`cP58LY#BQc`B%UADWL#S_YhxTEqzta ze!98T)}}N}dyzjlyI4(K05j*Oq$X41d={wIN7DY6U7>UYR)gHa`*LK>Kiuz8-hrXJ zAz`8BnovI|!TLh;Ecg`yqeb-9<0q!dE2ti5C&>?O0KSl9>Zx##KH=Y`XN2<@x>>7? z+n#QG^$Lwr(~>X*Mpy3@ItlzFP`e$s+VolJx5e_igY3)TTI1VP*+u}R7ED6$tUMdJn8o0{- z>J8EvpozZxKCr5vVKQ=QbAUYnjqy6W9~5ZesJA*0WgVAR!*tPe?iUc(Us>CcM=;9O znLApk;pZQ^0ukhtNi2)3-E!%{;+*a%!b&-xn59 z`JxhPMDvy{xyNPb?!c*_$eYO7J^|D>Xz%fZM+n&}u10{=lc>`fIZRaviOJOH=Jt{; z&toj-Q2}?OF%|s+DJ~My^Y11Bi+EMa71oiOa!u<`y3;n1hH52Y?lmoQfledf=jHr_ zyj{2PeSMBP!6>e&BsO*kmbd#W*~V>UT6a&Z6jn!)V~|R$1!7q$*A!zeENvGWqcL{u z7wHeCwrYy!RyFe|@%dSIfWeAtUM@#US*xn<);P*1W#ne^aoATXHNy8o0c7!PSY4_X zP({&!NiOpXa@F$dz`G>2`uP#3a{nprv{8MLFw6zBdk#WIC}7?qm5Q{0U;0komKGGC z12eQx%95%X`unHFU$4%^bcViJ!XKw_z=^-nC|V}Lxxw*4j2(C4MenPnOVV%j16#;{ zHNF1^dMt{wGOPk{B!>|qc6thzx|JR$+*~ntmWx$zzO-4P}oKKXTyE<<$G2d`vd zAVZwN(z82Op}LrtZ<#sSzn;*p+R4mGkw-Y@Oqt}K&`~rWq-}WhOa564Jj$e3(!8$` zYi%;eTxZi!Fl?m8fD1Ijiy}XgKh4@rqFGgpr@a?`cx88_%(%|07lB&`BwybSWHs;w z{1D0Cjn8=Xg$4T>rIleW^@$o4-!;oQ#Dj=f{-`qb>lVF*_Y|}MH9>?0&yWepyp$KR zo#_^I23D9FvbJlLiol5}U+5pLiS{i^$86cq<}Bt_3AUQdm>j!51~ry`U`r;BS%sMl z^!^2HivF8F7>JHY3hH9WWhuZ^%Cp*e&T+_+3USdG#j1CaL@u<#t{W{XR-3|YX}r0D zx7j1nex5LCKp@fMg)p~(*x-W({zCY+*tGrSuzUTdH$zxK|G&!u-#|GKs#&`ac!B@p z@!w?kpg9h8dx7=>{~V6KnMuax5TWlO9+;>MZtH)uu|xTzpv)n4V&j7q<--6KuRkA?pbn7PT9ILR}gbawp6!SZh>R) zdtbpg6lO^5#tA`$0mo91AuUl#Gu|JS_-%fE{^pp#yKJ)UQuHtq-$8|QjYWD8ltfm+ z%Cd#E12A{q*Oix%NXqoze*^A0&oeCa-|`)1GzP0V@pd+AMfe9WlLRF3=dsAYQ6Si2 zfJMz%n3&oxCpjN4&+nk@kA%FZ$)dB|hNO_2X^CrmkqKdmqJ1A}vt!U59C4{+7eS`I zJ~dCS{kS2Yda0DBY3;R~8BG)f+TDao?YX>G4I?4`)b}*kx_nP;!Tz?^hu=MNN|a0o zaRec&P#v!QaME^qt{q=3>lh3+B`vs``hP*vxX(w49s;jQ%rn0^aL{@Dfbp3S=m1_;)tSbB9CuOLcv8{N5?ToEL>)B8PQl(+EcLE#QIuWO zJLe@(pr*0)HjMS{A`r_M=IZi9m%)+7_*i}kgJJ};ji~mVteUVk$X+Kto^CqnDHE0g z^3!)X0b){y7bbdgIr4x(Jd!@Za3>LWDkynYn0AIK9i}SYE@s!#ZV(y=$8lT1KLhcEQ#n%T^@x>W)&WG zLkd9+XK`^ar%9TYz-;tLcy%VnKkg={+s|ku@QE@O;DZ1a(ETeqJY1jvHXsj)zk`Q^ z@U4K*q<9OMKxqA+memcWJ^RA;m@pZ4iiBeUfhkHkKM1h%@V_(K)PANGn^Cbi6TCfp zU0Y%e{G`2AK1buIC1ClshegIbi)jZWL-$c~Pl@C|n*;v1Or`ZS9$GrJ-&{T5rR$G4 z&%e=-M-wcF7cQ|9eKN}f0_K&;CpEou1E0UWlZt@Gu#w9D3qVPL(9>|UB)U5&$TT8ba5w;k*L;EYMW!o8F6_2>%+rR7h?$}k8;*UG!ZOT=m^A)8f7dO0 zF2ueP*1X)~AV(9<@Xh#+UQ&XV(c%62u+-nNIC^z^ZG0805dKpCdTNkhBZI2d8!_R4xs-5K`#JPtj^|WoA}o7mqXxU zoZGIdL0v&wyEXhZnAOP*dbR?VdvWda0+oF|$c6bNm(AMay$vR~xnc5>5wMKX%-=FL z(cB?CX3H8(5-V;4_!`^TYK}^LY*$bt-`s4J=U@Xa<+nz04th*eUWCngy9bgVKWJv7 zs(POQ?aeMnXwHPH)v9jthsl-?{qd<&E!K63s!-t=jA!0ebX z8^dXtT02t9;?BhFsr!8N*+&3Dsg7hg0)Y@Ycb?ORSbBSkhEbYBj@yylrm?~*j{KVf zv?;~4XYhd?8jU~5nu12cGg6E&UdQ<+>Zb;5nYd4VnX6hUE1GACS$b~hbYSj~l{s{$ zk9evhs9Q{ssx}EIek#1XN>Ch_&7iVP6lFF8sOx3I1xPO65ciUiNp1Hw#8%n{NJG-R zro4O2%91<>w-A1WS5)<&ORi;^cYARy#F=gp*MvdN&t`0KKcQ+53G(!{*!6^4H3^6} zs5&i0S|`}I^`4>=^1vDZqIR(2?F)-(4U1M3j}y@RbYut6fz@^BS3JtPuP6CsKCKTc z+4yT?B&*EsfhAvSl$aZ81&`FgeF*=1@A7p%N@a%4or1V#aaBJX(L8poEr_CfTNmJ6)~l% z4CLWY{UB~(@Ya_ClsK!KYll$BJ$ltbeK=(wiOp>$GVV$ZqL$sUF%=W&lI_&GrwACB zw^@UFJP>0p)66K9DV)>J&)XMZvkc90FYFe9G`c^VLP0tpS zBqkNFUoT_ySIIwTvR|H(ZKrd)fSFg0;>j~52S8%-4c1`?-;mdzj<4%P|7efOb+R{N zP8JR`#g{&sc-ih2WQPdfN{@U{lrj|n{T?h;GbICUcL_Y=Wrk=48fGPtV>Byx>2N&4 zvT7)aPm!SeveLm6I`)&hqo{dy-Xz=Bq&(fw9$L}{fU3INkRiIW^7z(#!n=5yd@z)S zor~*^ZF=K;O6#MXEA^Ar-w2*E?carOk}%@qhmbPm8k3d}lA|crG^5z7WtEH=i@HrA z)qO~)$-24*W0CpZr_~g>_D7E2xe7E$3;!>z48Fr(flB#0lCDOjSv~Opw)DL(4rTEr zax+MxZ0^>2`BKUd+!%6U6wUp2I6rpeF6hNv;r< zP&`WX2*}J!tFfpO!L6J47O|3~SLzF-NM(8T!+>@`V-7OTjDHC_V%U`f8(*Xr=)`Sw zh1)jT43CM}sb&xg6z@4GxA)PYno>CAX<>a}oGX|ljlqd{10uBZ;B%cEsI9y%=hndXNj4P!46Ryq*n!3`k^A2@4 zj#!Jl+#vKkLk_B$e1)KWy*|E8 zkPr|KzU2~sj+Bz&U28iY97x!>_42SUPtF=3V!r5=3T!+|LbruOLLB*^S&6ZyCn#vA zgyK`mmRD5lpy2eN$^x|aM=Y#1SP;p~9i4RTyA-C{fgv^L-d+2C>Z_c#!xA zASD5(Bup>QQn3XVwLn_wY`sy^0g&VS*U zgY3u%RUee3wU!Yt=P}iHP#I2-bSTdzAnoj4tRKaaLf-I%`3D#lnd$2X=6qoGUh>^v zp6-W-KY%K5aBy@yj~k?DdN{|KNgZEfJN#?5JuoRrY&uC#x|AHOx0@GEv1Z<^0j#>l zcv=WpiKf+*;y>^A^YbkvY~8U~+P`9+5pHy>3Z41EUO+a#BC*jhrn@H_Z8Nv+z3Vol z!N$=WLdE;^^!$ZDfNQasBASYdN()%f`{sCsy_{~HN1*PPOgk(A|L+4Q9!WyGoepb; z)T|`j^qq7`@P3|jY=s__3zP~$z4Y;+j0mTX(yHjKv2deQm%W-nS^mlY23X60EQ*w-&b&w@5{yUs z3oiXLD_aG|)XF|i+Nf`&xHcLdAMoES7a`m@>?|UhBW1oZPhXSz zqQcUMIIrZVR{wBVqo2JB?~*fegA%NjQ1;pdlQShi-yVF3m1|Z#`wE=vF3yg+xx|9YHr(Ud=zHq7_R87&(P~Qz8$B&y<4=ops%?XuaChBf7VaW)|xD@b#tvt z&n|YxfR(1st`~IIkqKkZRI`)|M!6N;=&F&{8Hu9154tjkj9st+_drPOL;7JTCKl_G zo%lpV=#Zi6Hi!~^LQHp-^Jj<(($jwN{nJiuj> zs(GSG6$PcAy_A%YS4yGpp{bNP2M*j`6{Z?Y4!U>waVkPy;%;$KY6s^OU2sX54Y>x3 z63gYj@-b#l<;1TMGZ}gw2nsV3m)9RDXSbz^jVB#CW_CEy7;7bn6~V2TsHCTb{n&z5 z4lHVyyD7uQT5`V{EcLpT~i8e0X{grM1C~ zAAxiCL$!0AC+q*bn-(e`nS92PV|sJ6YnlQ9=-L;0EoZW z+5^05F8Cj(Z#Mb2<`J5CYIFKZJ#=p$fg`L5FIfk8{qxyx@BtZ94j@YW__ysJr}Xyj z|2Qm>C{Fl8g?wlOxb9v*`DH8v(!;(8L)YO%^TTYZ5X0VN&8v8;G*16V4>_5R<%8;X z#SL8XOM#B)7jA}?_#TX^Lk)LDR0NDu{fwRt<|E95zhq$J8>aG?w-F;?9S<<(s9NTY zSwNPAZ-Te|-L(+p3L=IbEZ6 z@gdST-Xr(}eq~lSM_>O-jRB~VPF27D`DbX*EI0dqCuP-Dz_{@Jsa+|1o#%Pn>!AJp zv>kNQQI;{2Z(6m^D>+uS?sXOK8E)#MqGATEszWSfPzqnM?e-j0e%fM|LuuB9h%jkL zCLnBYTv<#|wrt_a2GF8m7Vv;`O+_*jW(c-_lU}_*UEH=*LcGiy@>xNKtd%6}#2r$9!I9lNJ(m;h9QN#p7E8h(FSJzK&#qVI1j>8DXyQ0$4{(|J z!Fi1ZJZ5FlL~xweI@AkOF5K1#_dAD}r+xsHja+wv_A#ivp?*m1OS=Z)Z~UeauTuDk zU~rLw#HPxK!i2BJB7YH*52&1n%Q(W3m`f&c^+aIyT>it(@(u&}stn?EA{^nOH~^U_Fm1NrB`uLYS1=j- z|7q;3!=h}Xbx(?d(jgtvDcvC@oilWIcOxMo4blzLFffNLHdM2OA**tqbJUb-2M&n!unzt7t zA-4dyo>Zm6R3F6m2qZ4gUIE^ok5+3)bW%Qjn(2q?GsXcD=s(N)>AEaFl&MTPGa)F5 z4d{Ki`H|a_C{Tib9?5|i?O7|&e))?mXCX{_pkRLsedqT^Qnu6*-PG^ih|M3_4HMkb zA&|{x#9=w!bY(e7wjBqmsWvI>W&?7Gk^VLR4U~7Gbrphgm*23x@GhX{ceHb3k8O-BS|*DT;jGJAq#X2yHUiy;mlIOVTKlm|Ii;t)59i22 zS=l~PgO)RCbAn5)B~(ce`tXNSGT}EO_M>peWZ6ed zjHsYSE2(;KFEO5n9IZ0Dc!_SvCsp;E0mlW=cXU=&6<#mw;RM0Fq#h12Fg?tArN#O` zbZ_y4&s$x zKFwArZ*$i>6w;e?{FYoHYguKp=XE*_s1MMO)x8YB-@!JO%vkxBy$2EpBK6|i}A*P1LiBIlB zY!vw|98li{-O!ql`6FMiX?Co2|;_gp?8I*YV`0-N49Es>bOLp#> zbdL)|mgagU(oK4KO!st=Pu+bq;ScqFZ{BZ-Vv<{ay?37Z3sY8>IBLil7UA7urk^N? zwZ7`YcdK4@Q;d{VQPa}~*|oB}jx`d}zSiM$I~>w-eg6s%>N+EX>=QXEVGNa|=s`xn z#E>M|X9fpdz~|`;FpI&(r8X;Tt!74N@RrAPp?cup2I;K4i}&~yplE92gu|maFM5@y zU~5)BUK9=x%LnxN;Y%r!2CbCqk>g!ha)=?_y5!utU>gXuZkSuix5i4?F=&BC9`RP= znR_c>?a}OY2@VZL5q=W^IL9k)W;^_(R)72ya(g(cqcOi4per}BgKtz* z(^85|GkW7V?%W>EC#7X`n0!=L04 z&WX`bLTgjM+&!T-XJNht;tTlR%s0s)5KJk{4YHQQ1biw>Qr=CR z2!|#E!?*TM;NKU2L% z$x2TepWgfWeT2<&M?z-&FL-D@PN*AQ#!<7c!PmMaHxmW zk{Gm93^JuZsJGbOGbsm9Y>gRC*_&T4#q=9A?$a1`OI{-8eIGabVC+b4@K)_E6(^sJ zt8^>k$o#A5n+dH;YN*^bAQCTceY$V)YBHF*le+9PV2N;_P`!*?v&L>I<3mXWLEjnH zE%{hxdR@NI)D9vK%TocWz;^ywHCiPs0m<<%Qw@btdRQDKk`4+DFhk;Z<59FP}fodylz5Vkr)01b@=_`i)tDVCn zU)Kf^NL4LI)h9dp-I!Q@N^NpV@X@E5XDO!x=c>}v-UM;BEWvKZ?0zH1wFo!^hTnw2 z*5s^WRKN9cIOygdb2iV)ZZ}pUH&ffK(&kclc9-r_t;Fwfa%G|m%aY>UE8|$Gtp$=N zyEJ}aw3b9#CVz2v$p~4b@#@)9^I8nF9BM?Brs>=R(|gI5$R2OyIYyfpr+AONF3E6L zO78DX`v}AD*keOc7a-@`nE=~J5h6qi4fUNN5Lfx?$`qDU%DaeZLDP_XYWf@HV;8~< zuM|vbMRs=BpQm0Cr2R=~HG?7xv>hRrmE2|rIy&X9N(tVp*RjUdu2qqA4k+t<+%m8d z{JZ)7;z0PzQ&RbQA&pt!6T`hqj!yj#+jJTVIsWs4IuD{q(^QNkiwa#-y(;?5iW)ft zMP{HE&{wH<1{fc0^9!vs_$Q!cWfZgO&B_U?@fo=Uelz7*;=#@{X_~L30U46;uz>Id zpu<3^L24O`yl;w`mhX?QVm)m> zHd2}^V=N~c!#}_$;($6$dhW@A_^GB;AzO;Tw8g-|JOl`qOjH%j?%Z%ZR>jx10(th} zHL$uJOh~8BP?d}fi_c#`Yw{5Gj{&YCBiHo~I#QjY>UZC>O}%;o8STN*ZW%QgXd;Rn z_`R#5gMi~fPFu!GY>plEPtLH8$1parD%zLhF%U8D0==BbOd0(R(R$ ztv)zBe}7Xqp1PuJ;n^1U#efrv7%Wo!If34~7am)S`k#E5gbo<83dFm76}Ky`9+$5l zHy6ui{cc8eu;A~ zS6#hbr^WM^$+QJy`flr1J-H$5tmaNMnAkkqe~y70P7kQ&XikiXraF9aQ53DIm0)1D zNruFz0B;S2Oacf{bQ3F44kBTH%{)Y4P)Ce|=>egMBg|-eZBdzp*nWdC(oa{_TtQT+ zD5fESA2Ta~2{?0sZeK&9TMj)*{vp66ZG*5ASQkCp!yIF6YO5%5$<(8lZtmXl6k#@J zUGX(<<>0U)c)4h3qY0+)7nnF_QrhE%M$-IluvIoCE30J_QF+raWMzg4Hp^`7rYF2y z91rxgz$B-qFX=q)-dz8M&wJP*po{$YoK}xT^mQC>dYK~j?5KrgNE)~b5{SdsW%)J8 zJJJP&!1}Kp*b3F2K{)$+M>&&7B2fzyDdB0&UWKCJ0fGt)msjgkffB%wzAdZxjY0X+ z!f#+1u_nO;I9}9(`OUG2q8RK@e1^y}of^?9eWc>h3z1+O?omx^+yqobD)xD2|F2B3 zYx?y@TlkQ^W93H}OB7{hE&-wVU}t?JJ5kPjDUIN`VJ-nltN99`$iSjmmM&K+i@D^O z=Y()?d|yvgiyFi^X3fK=!cRD!dpNB*)|Aw{7`9C6cZ~I@8aSzrAh`Bat~$m5D%FH# zCeAM0D!4Nc#E3qqDNNuuq}pOSGFuANk2vc~3cHbdMB{y>E z5XpaxuE-(fUf^~S8Xg)zm-_d^0aQ%Wji>epRj>kc|I))t{h=bdh{IZnZs#LqX=fhO}?d1d*7pG2}87z=Q<$aYEh6$|63O&~zEVXKogJzg)wReNm3 ztFrtOX1}!m(9f%=xU`q{P9f$s8j^~aZFLWD8YqARD2zw$mC<)964Cj`4qi%N7Lq{u z?O6(*4kGoxA0$$7fD`ZAundKL4W!IEu%1xqo$il8y0TjaQONLh(KjMhqd$ww3;B{O zujDfeYdh8Oi$8v3I9~npJDwANEUAC<`xHLYz*-Kh5!A2ebID2>wCNffEx~o>u+~Xr z*V*mRnC29?!}CF&5d`M13xv=J~B!gk?Zyd;cWUcjs_3>_H#%IySx1LF!B) zNs)6#mD;Leb)5Alfo>K^BS_(&^P+^eVx69@-?8Q6omkG8n*-@pgP^xe(4Ox;9NN;QzA^P3Jk%j4E5j>CHO*sc@zhAkfNbZ3YHqcHaRJi@F9sK(oOPe ztEQxc%vGow+WQ0BBC?wyFp)(2Hxd`XD&rxhKYKoVSGGg)5{iqS z4ntKzE&8~BJ6o|gO*jtr%V`LYwz(hFu?(BENrH~SVo~MzOon^?Ns-a<_BV49K0wGh z?*7i|=@GBdNZ)b>(4!cRFFyddh4hI--w-JKX)v1SMK*r>2A0dGoS_P)!`M(Z%NASa z=#F#Y{!`LBGPj^A;12)B=ZA)wHJxkqM8_a+Nuo44^|6a28izNKR*T*L=H4R|U*e8< zV=5gu>kU-WvJoXBU5D7}1B@&-#NYv+FM-y7vM`5C-RqR3*J(-V^Esw6eLRq0x(G<7 zB1e8YtP7?N>F2a0S5eJ+yckfe)uHNQAhxtzXGcg83?QVonS5tB1UBlt`CU;(BwWG;9tImzxQrd)AJXt7Y z?}fPrLy5(Gy9q!JkRHewe8}3|0Ahz~zxxfc&YtgS`_?sx;RJ%#NS{_6$FzVGD ztzpG~dPRB3fPukD!N&Xn)dkIlS_Zk6h`BZ1TbN7 zH6kyow`k%rFgCc9_Ho3nzSAO{sp598HdiKV=rO>`?w$PVo?@-9$JbXhlz*@P7&RI3 zsz=)j@yBd47olFM0^`qqJ|f*%wfU}wk1Sm4sV_9G5D1Gr%BJZv@3X+Ym33737DyAH z3|E{`yE#V`OEFX`A}Kc~DhPYh9HzpK62Y`IQBpx;nzA*S*89zgy37*H)H~*yxvrCu z>HBzWtyMyCYggrOg3+7#K%S7sf7r61G7{G{KSVqbi@3B?#wBK4X@2!mpy{MR zbF?eN-QL57QORxG(oZ=80PS$6pSAhB39S0sQ}gUv!Lh8%4rBNI>y15=X(Gt13*7$4 z($>Dp7(2+>HtnDJ_umb_K&n8gB%I~Z>)Xl`UBg+1vAykElNs_-u`VSnNjy9a9ffzg zdYd7?G{8GrSz=hdU%K(KRaEjD7&$*C`~ZwU)TB7(lumNBv07{$#D$ z+*diVaVNu?v;AWB{SC{+KhNO2uE#A)cz~K0nfx{G5BB)ZT=?jc;N~W^{MQFvlHrp4 zj>BDcDq1;Po?j-5fpV6CBPbQ}HW)KTW$$q2SCJa&%fC0d((VK3uW^#$q)t(lT>5*> z!bh6Aiq+y?lL{_VT>(_~=DgoeV+F$}+PiU6TxDrEJ+*nqY}}~QJ7mLBNx*a$DBr~w z`4anN$?bB3bMSh56;XO1z0~#nU=*-3f>fOce8%#|8}EU;4EAAzS-CQ^Ft!n-;= zUmZMfO{p8IDJ{A#pn7r(BMm~2Z}(cu*~|AN491kJJV0(Ii++%}lYne)8M=oIGCp+NeBb$Uk-ioG zp+yb}76V`gbJ!DCpkRwV;3xKUcEUPZ)^FA#BciTYBeoJL z_bJN1VLm@e74Z9nroSiI%9Aom`mAOFcv~k0G6D-eFkKdYFo%hML8}vJGv1K4IF~6+ zWNsq^^&x$|NPwyM3@XHh$T+!=rbS;LM|#k9LHc zulw1$SZyMKgHzKV#gnzppw`b^qN`|#`(sM7#-E*9zupi+>6H!kY9Z9W?3*9|r79zNgDPe4{}k2g|9b}ncLQr{h9I|zCDSQ)*C(^)N|6>t+86Pua5j$|h*kR4@aR>< zLM(X0Yd-C??OI3u$%YYF{ijN&H~3%dv}gIj7w8%BZ9-Pr?E8cPgdAPUY2MNk1q$^5 zI&_>Y_FFjM1_iF?nyk?*TB`e>IM&qE6d#a92domC6B6NGQ539m*x9edg%jLp^i4C2 z8Sei8D9k3kR(*cJVqP~TN^Z+BP+7ST{bdNa5}_>AwCT_tEXN+{7U;^d*R^N}zFhxT zcp|*~pp>{fSv-)u#bW)-z%6Z6`EtpF6ub&JV{W;D^aL9V{32yC4isA4Mt5JnehDhO zV4h%`ecmE$=LJa;8POoTy)$PJ2J)OXU7PeLcO&FkzbbH7-^rIB3 zQwU9U_30XW+*ql0zUPD*f%cL=r20C((>P>iN!{g(aHT;9EM&L&4CWu=?U_Ay(a z*w!74uJ$;Q_#PY=T($6iPj3AQDN^uKAyLGH2M{U#l~jK=jm(Lk2RUFQ<;zHi229mR zEQfw0+A)3>G!cX!%2Ay7;Bo^ul7Lu2_ky3VpkK~Om(RWblv6?@_Q<8f!pj!lSxv5# zaabvMWsGY>6N5EZOwXq|DGm=H(3}4v5z||`W5+jCmE0lt3{T?MxnnV>7U>Wk!PLN* z(gF_bUIXC2TNLa2XCTWrbg|PIWSuh<_yh&TQK1cFOxDtYiA=iQw`)N!f@b96uvfv< z+*XBEYC7$ocvCEEQUcodYC%yP6^=qbJOt2QHrtKjO*iKzAITgqe-4~EuP%cvJVThQ zr2QA0OJYX?7J-l1E_c5aS;PFk+d&imv5S5t)7>bqrl{>yu2ow1OMi@aG6-v>0E*QK zkj*Zlih!$t99{CUqr!FJI{yW82Ew|0tInxpNerfY{QsaFcwYe-p`?AR?9qn08@Us~ zRpH(&C9sJ`%(k;~eb09o0nWhU@?SxgXVJ+|eqPn#wI1 z`rtJ#)hOx2hwQTTP;Z64s!)EXc2z5@t1ObpYtjLzyVE56{RE><{N2Kd9pNO{pz1g;NiERAM3<- zQ7!1fYhJKI=!90lz^fPb0O|Lj#cezTA?otAK?y(&HPesjoe*^Ho|HgW=3uX!OTseyZ#@ijW)h1_TO!j9Ghe zomH;YMb14INiW@M`guRmah9*eK%jgHy#sM-5nKNv^Go$oJPnDPldSv~=cN>Sqpeuu z$~ZNphkbQ)EI0cu!N=rRX{jkm6#*UUPN&G{OR4!=_c`u4N1?YPeZ(#w^7Wjx@Ska& zu_}-CSb;g@8zUd$d*@8J#Yqlx$OF?vBS2elVJW>s_!|x9g_^n7SmI3byG^}mAz6`X zSO3JonFfaCs5kl(kuREZ#f}(QDZ^WzSG($uWzWOS*hvfHtv+T#9JeYAb2kPMND?NF zpAQ0Ukfcgh7C1`JmCE^ugiBo)OI(UR$9i`dnSyrv09So}MTxB38+LoiyU78>jx!li zazGxf9HWN+hu3z3^_GUs@u4kKFa=-|(Y(H8ZT8C~?66zL5539AZkFjwH!j`}ZyJxK z)!W{O?3S86C4_+iBco6NEt@zDl~rlc<>yM7Pb@OZS0R0`@2A;W4z0Qj7!A@6BnyeB z_kI)Ds4N+}NgSZ0@u3xc*wnG|l4?`~w0GsgBpgF{%9yb`i2Bm@MIctyI_4;7(ddJ# zB&zfV3cpJJTrk5`%e7hz9;}MM2&E(~MyJlWj=mU0ZMt5MMVSN@kv|C|a4*49K&Xk9 z)Kr$K7OC&1%7Jz|m-cZ)stoi&3Q+Nhr9-cN53o{QqvVUSUotbFuCC?+{e!w3MgbXQ zM72v*^Tl#c02VfF_)X@FQdEtsTje(}m^u8-j*zD;%+exsKDlDvk~dyVh$k=GWE7PS zlRFh?NTj*tlyk09aG~zuS|Bl{&*oBC%RU^@b8izHtRm63(Mg%SI+W;=W}2d=+jZgc zph3%&CDYTJc>7(rk^@7A$>}4%}iUPLW22}`k|Mq)1M6f=5Nxy>C>i;fXfrU2s|Of5)4Bd->d0o)!|Qd!4^ z-uL@a@+{BeacSPwe+WoFeNBZ7jIlTfsuc+^r9b-PGeB~8E=;jH>r%W_yw+|HOAr_) zC7CMn^CLbf%~CrD>g4Z;0^Bhj*53T}+ks5&YtF8N)?UR3Fqc_L<*(vPmOv#?S#nK^ zv|lnVN_N0V-WTULy+K)1xWo-0f17&0J{?f(k{4Zzl9HkXCxjt%Vv4*u zJ2xXMli3R%fF{_eEJ(CDDr8X)+y+Hk3}8;D8E}tg(bMv`31iKNQd?47-_GFq8g~l` z%sER>Wp6Elw-Fu@cC29w<*N01_?_Dh=p(!ke=59+FVwksXK-KF}$iNy!~ zvdRa!W(a*tfkPnbza$0v{uEN(X7Mpvg#)1k z)}T`IbLMs7gjgf~3(JQ_Tc*eb;fufYfF_{nrY1*{|Gdx~qocLRre%(?!8551GaXdw zlm#5q(Zct~CBs8DYDz=wAJE1<=y|&PC#8}2O)~uJ1-%hl*nf|auV05c(KO#Hwpfc{ z1Lt+6OJi;`I=l1Gos1KEK&fuck0O>D(k&|`Dd#mt5A>PoX*ihnr!NctDW0Dp?$?^f z1i+ulAMk=U@o9lL-2P5`2Vdq5lofAN-#6nWw2r!fRx}_BO8wA!a(^(_(&3XqKpFWL zpjgWRx&{5eyESQW})js;(?WA6E+IJ*??|3b6-0Pb5vq|>szIia6osKKOr;D=G|{E7~mntcLT z6ZK~Sb6&#c=&vcd+4M*e3jr_LQSTH0-f`@36_L-zgsDO&TrWsvX48IrR$B z2p2~S(I+On7~sYN`s2L-80cNtP>xI2L(Z#DuuvpRX)vJ{y62`H+gElhj8X?BKQ5+r zzk2>8ybb=?!TTzeo6cd;e}9<~;b)EAjEg|PpX@O+K7c-4$~Xiq}D*On|W~W zl|iB^8Wd7&*Gf#RM-~N6Wg622*u2805Q@FMmQVk?ZL)igcQkj(pvcMI1v{^QMd-DR zlVBr(?6Qzl0?ur)@Qt{~giZwKpMzBA2_^c@7mb*hDpfQT-O&z}w5KkGPxf7Vcb{<4D9;l#g=u4r({s*9TY z8WqV8G%!@u<)_k0rzUM6PnrL;=vI%h32XrA2;j&B28^le;6(86^rZF@Qk4>@N}cmmu!&z`5Pps?t7;|VRL|T02w7!7 za4{@{RdiN3ODdi&g*J>e(_Gl(kBj!AM>>$Ko2E;PoxM?6e9F!?tc*=_l|w*`c**a~ z_F!~dzTB+^5w|?uA3R*ABmEVKt@*LkkUl_vnf}@YecTEwby`n#kj4Oolg5O*6AJAM zv-1K@tN#m5znz$r@z!=Ha(RL~M*vca&_Sz|Xt0OVh0DIEGHwOhiGV%P+#cSTu$6+l z25S(+ERi7AgTkD2#xclaJA7&2AKczBJd1WHO(vr$(9xB5G{B%gq_SAfbTn7BKQm6U zvco89?H8uk#5}D-@9b8ZXP!Ju?52LdNH_{mb=6q>&8>6lSVLB7pko?5C9_l1TEC3H!G=%hIx9dff=+y`p=&C;?KOtG+iY?=q2}*P+Nhq{OP|$|7dKHZl5LsvXw4 zXx#HvWvKak=b==2;q)8_cj$l%nNU=lRm$!m|c<*;6~I-WB>;yj9bcQRkldKm54k3#IZuFgx$L}(T%k$Y~WPi zWfj=_UN{EpmFaX52X6mg48LF#6cK)sg;zjJGi~B0v5iD$QFXr~xcf6v=O=R_wWXBe zvm-sN(lsrT$F>>GhZytVa}4*tJtX?Y_5AZw)W_AX-mEDI=>FQlYs~)aUWLGa2_GH9 zAvz|`lq_VZd%^s;A~B9kenk7l`(`E$N*Nal$~~P8*>)aPMr0vk@DOMg#snlGt%TO= zt3<>Up8#&*jfn|gUuU8=?Ittz(h-&;K5qqL<`BV73QQ)M9xZU8z1yfdKu$}Yt=#By zv*fyBcl#`G5D*Oy<+}}-n~)uE8(SY5FOwHs;gbe{oNuk3F}?8qdck(jJecQ)++GU) z0W9F=^sZEV&NE362|^zG`PNxsH5)M>05Duk%6QZAOU)c7X`F>d6+TWw*|qK9;T``` z@(umx3EpMWILcz90+-A(z!71$lhSHP^CyY+?^`9;AKTs6Qh)79j{#1PUyic+^M!vu zvg$UE4upmh&!z2AAK?NGstvO<-7=f8*6-+}j4{yhbXKcZnzg<-QG*>Z{s$y(3xpizvC;7i*nUg15x6QP3L`)Y5ROpq z@dJQ8luKj!v6SGI(FqCY%D^2>G$p_;dkf_|YEL3q;S3ABDijnKkzn)-sRk?(plI~6 zZt*0ie4ZZ>UOGJhi@={)(EH!-aY1|Mn#6Rz`D)9$}?C;}HLP{?s2;d31fVBCtBwx}nVEy~RYTT{6$)7{j zi*CmE^5W25^L#_o_SX>$&-}Pom!4O)k876#ljR3EX^##q5;iqR7G*o@@&$OKSQ6P^ z)5mXu?D}^@#%Wum6fQD+eYMPv_4w+MAT6cQLE=qE4<;P+s&bU`AM`EKCOgZ+F(gI| zUh78P$d7+ta(H^5cZGerNAE*&!qZAzv%ATB-CR}2ZDr1m!Twrh=7_O)_j&F}v)pe5 zHh*O!myB z9tl4t-v9CSa0?1vY*y`;;cfrXF>@0^2a6QfGdsnK)>Ci1lpYTHIn%UU2K4rm_X>9d zmp=0FmT?wCi7TY#Jn&NOhV>11@6-R#-Z`ezJ6us(n4-uL)_->QZ*2|KBlSTy$;5Wt z8KiCk%d?^M5KgYIDJ@pI_i>D0&UR9=xlYnsUk<9r9l zGa)MT$m#zrpE;8{N<#8pHh*riIkn9>=ElqU$^e)9QIWf3yumH8zy-Ac^=OP{hu3^D z!ieG5hX~L4M}Hj(0^~)fn`&3z(SN?jX6)r;&k{tHn>UU{d&1@0|{ zAy6`s=Y~dudkEn(KzRF9UU|$FesQf0=3C*!psjU1_qt(IR_isajlCBkog<0}3P+5G zF!?U$?TE&SUHKVc1%gxt>jLg?U~iIz_1dOp8k?`Cdk<^Dv4g`5EDOBat*3tOmt3y5 z*K8*lg+~HYesjyzkzrzlHpzke@@_}vGehE?-*JNYo(Q}YY4KAZp;n>{b#$lk+!-uK zTyXbUOEZ&ID~{B4V<)fvL@gv(Jicy+!C*3##D05@A7|z6zOu1?YJ1-wOM5jj-n3Ht zR-!#{$Bfo!`p7C~>Si3GwN@cW&JgpI?Exx{4Xg>}y$}~=)~nWhf~Cd7UViW=UoSEL zId>92jS4rSqbrlzJ*Dv6<7bpBZ>H_1Gv>WP&ea6fNvL=}@Kk|b@BXp*>lhDhe0jj^ zy(DHHn9f39XQ#?8bIciHXjRl>r0P;K zQrQuhoo5@CFRGsc4b&)YOrE2p7G(&Ca1a`ws#a-eA1=%j@9VPSy#}LMvRI=0I4=~4 zqz_}Xh_~rlIn)!SH+J{i7wFP-tl7xKBNKj#*Evjod1!*5wFjb_vXs29-DFPHT#i#} z^iTbvKg;E@0~wIq7|1u*^RCo;cYRH)uGPagT%~=~SrxEBJw|z1TwhqTV!}}RakNd` zXbfLM{S5cXO1!xO9w**`uD5Ajqk?em+WZ6#dZn_yS^sy8axspz%I$b|P#R1n7Ac}1 z>B9zC_x!QSU3GQQ%fVXNA|UEwk8^+p_V{A^&kz zd*wHDtQv50xFlt3hzw_{e#Pq4&FR=)N)wvqyv5ti>tNf(P+h3Q`dnn*RmjU^2Bz z`E~Nvp3bkxgoe@aE2gUcPwWLw%fXrwd(Tt>wwj)E7+>*ni}hfTycyn}3`fe=bf|ln zaG&ZhO9?J%mv~19_YouJC9?Byh0U`nwZs7cNL{W6HO!9S`87&r5EaBv(^~o8GdZWv zi9cBX9`6h>LZb5O(;QC;!>b3MQ#69;3;IRdSyK#-?mo&{VzyN8`uR~S%M9DbB{rF8 zOD&hw$5xo&w~iqYiSgTnx;;9Sy7yy87qi4k_)~1rqA7oo(vG+2QKh|!Md)U!-)-ij zp4$=2+sCI+C0o-ePv9Ifjb1wfU)AKl?pmBqU^%Fq86z>na7EkH&a$|X{duiX46001 zNjm-|LSKDF5AsVAEIog1^k$5QZZB@O{P68QAq=BVvu^&k2uG&5cl4le!dgl6sca=# zF#=BuR8B&ijT%}injO%lL2b4Y`&&&jf)zZx```Uc3zHve%VG`nhXu-M;2=5VQ=PAX zo>HZSAa$-8-We;)KXfGp9KSh_zra@5(t20hFgMtMwXPUp3$$p>DpoAEY>V>d%_2lC z_!E(}s^e4RnRIBf)3zDVz}X3D8qH=up`^ny6i?$6PwBV}wC4+WksxlkBcHA}s8P9= z2)y_D+TY~=c1$@E7VI5oi2JCz`Fjw(14>$q>7uB32sh~wP7ax=hDf+g5{5ViGWu%I z$>r@gMAF5*IQh<79QDgpMONCvA~VAkOi#a@F}>E=GG6pJoIkAarPUvi5@@oyL?bYjY4Yc|@jJzIuCj8s>9ig4<(#69sA!#O^ zENK~~#2Vd2-C>Zr14}qH4JUuUAJ>N??Jl5!LO#}dYRWl6)(4$-3Ibj+cVZn0ikjU7 zs+9OF(J~T#Fdv$MN7Bp?E-JLm5_g9UTpG!#7gd_rL)0ZW4$u9`^V8Q1PW$PLCZpkn z1<0k>jB5st`$cF1jy4Fsy-3x?hC?=l-?R6Agbwzq)d{0>7j~d$(69<1skzSK#@_ zdJokl>?P_+mupiB?g>mo(pI8o|NC|iY7CHwe|nt&R3uWz{{XHo3%$Dy=B+=3!v zy@`fPu|uEH8@Zm@?lI5YPCTc>rfe{oCb%yhp zBVslPYt7=%zWqT5A3xUjP;LRL)lu>7n$O&M7&4@rm5MgGZk!bSb7=6PZXL4fA|XzA zv|!p6a`LoKCO8AQyKvuGX^1Y(X|0L7yKwO>ZXYVo1$)-q~f^ zd!tU7AQbGDo zTmIBmX0jUmq+Qy49Hh-S+QfJLT}B>fA3Z^c(Ut^zux}VyHm5gIx@)=!FTE^9q*PHn zVvy8{WwqJd3yLvqtS?Ml&z+qvT$uWC@qntQUir)cs~WqG&qDfMN$@WWY|=Y>Pey*AHaJk67jf2Vz2ler`w z*_9Fs`*C!Q&~oubKyoSy$RH4)d>!!IzGl98lDI2t?UkNP_g2|R4Lyo=E6LK~?KmTx zf#;fE@G!mL?Z0h(hH7hAI-K@|85!!ww?0OCE}7f1HPd+>J`C_EXQ00Ao!%;OwqZ}? z7h8U^-2LNC^`~neM#x-n*oPLc)!ffy9l>O8P`V~~Rm}w>H&Yi)_lO)CDM9YNr{Qd`! CGLZ8C literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/app2.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/app2.png new file mode 100644 index 0000000000000000000000000000000000000000..6cabfe6818f30d50b26b6611d2e68f41995a8890 GIT binary patch literal 54068 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�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%0Dy1&ClP)S&H5`QBM`l%A|k6^_NA`+ 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�-^X+lO)VVK|jti$KgZyLu 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/check.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/check.js new file mode 100644 index 0000000000..b70f022d71 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/check.js @@ -0,0 +1,230 @@ +'use strict' + +const fs = require('fs'); + +///////////////////////////////////////////// +// Initial configuration +///////////////////////////////////////////// + +console.log('Starting to check the language files.', '\n'); + +// Load the current English file. +if (!fs.existsSync('en.json')) { + exitWithError('Unable to find the English language file.'); +} +let currentData = JSON.parse(fs.readFileSync('en.json', 'utf8')); + +// 2 charaters code of the languages that will be checked. +const langs = []; +// If false, the code will only verify the differences in the elements (ignoring its contents) of the +// base files and the files with the translations. If not, the code will also verify the differences +// in the elements and contents of the base files and the current English file. +let checkFull = false; + +// If a param was send, it must be "all" or the 2 charaters code of the language that must be checked. +// If a param is provided, checkFull is set to true. +if (process.argv.length > 2) { + if (process.argv.length > 3) { + exitWithError('Invalid number of parameters.'); + } + + if (process.argv[2] != 'all') { + if (process.argv[2].length !== 2) { + exitWithError('You can only send as parameter to this script the 2-letter code of one of the language files in this folder, or "all".'); + } + langs.push(process.argv[2]); + } + + checkFull = true; +} + +// If no language code was send as param, the code will check all languages. +if (langs.length === 0) { + let localFiles = fs.readdirSync('./'); + + const langFiles = []; + const langFilesMap = new Map(); + const baseLangFilesMap = new Map(); + localFiles.forEach(file => { + if (file.length === 12 && file.endsWith('_base.json')) { + langs.push(file.substring(0, 2)); + baseLangFilesMap.set(file.substring(0, 2), true); + } + if (file !== 'en.json' && file.length === 7 && file.endsWith('.json')) { + langFiles.push(file.substring(0, 2)); + langFilesMap.set(file.substring(0, 2), true); + } + }); + + langs.forEach(lang => { + if (!langFilesMap.has(lang)) { + exitWithError('The \"' + lang + '_base.json\" base file does not have its corresponding language file.'); + } + }); + + langFiles.forEach(lang => { + if (!baseLangFilesMap.has(lang)) { + exitWithError('The \"' + lang + '.json\" file does not have its corresponding base file.'); + } + }); + + if (langs.length === 0) { + exitWithError('No language files to check.'); + } +} + +console.log('Checking the following languages:'); +langs.forEach(lang => { + console.log(lang); +}); +console.log(''); + +///////////////////////////////////////////// +// Verifications +///////////////////////////////////////////// + +// The following arrays will contain the list of elements with problems. Each element of the +// arrays contains a "lang" property with the language identifier and a "elements" array with +// the path of the problematic elements. + +// Elements that are present in a base file but not in its corresponding translation file. +const baseFileOnly = []; +// Elements that are present in a translation file but not in its corresponding base file. +const translatedFileOnly = []; +// Elements that are present in the English file but not in the currently checked base translation file. +const enOnly = []; +// Elements that are present in the currently checked base translation file but not in the English file. +const translatedOnly = []; +// Elements that have different values in the currently checked base translation file and the English file. +const different = []; + +function addNewLangToArray(array, lang) { + array.push({ + lang: lang, + elements: [] + }); +} + +langs.forEach(lang => { + addNewLangToArray(baseFileOnly, lang); + addNewLangToArray(translatedFileOnly, lang); + addNewLangToArray(enOnly, lang); + addNewLangToArray(translatedOnly, lang); + addNewLangToArray(different, lang); + + // Try to load the translation file and its corresponding base file. + if (!fs.existsSync(lang + '.json')) { + exitWithError('Unable to find the ' + lang + '.json file.'); + } + let translationData = JSON.parse(fs.readFileSync(lang + '.json', 'utf8')); + + if (!fs.existsSync(lang + '_base.json')) { + exitWithError('Unable to find the ' + lang + '_base.json language file.'); + } + let baseTranslationData = JSON.parse(fs.readFileSync(lang + '_base.json', 'utf8')); + + // Check the differences in the elements of the translation file and its base file. + checkElement('', '', baseTranslationData, translationData, baseFileOnly, true); + checkElement('', '', translationData, baseTranslationData, translatedFileOnly, true); + + // Check the differences in the elements and content of the base translation file the English file. + if (checkFull) { + checkElement('', '', currentData, baseTranslationData, enOnly, false); + checkElement('', '', baseTranslationData, currentData, translatedOnly, true); + } +}); + + +// Check recursively if the elements and content of two language objects are the same. +// +// path: path of the currently checked element. As this function works with nested elements, +// the path is the name of all the parents, separated by a dot. +// key: name of the current element. +// fist: first element for the comparation. +// second: second element for the comparation. +// arrayForMissingElements: array in which the list of "fist" elements that are not in "second" +// will be added. +// ignoreDifferences: if false, each time the content of an element in "fist" is different to the +// same element in "second" that element will be added to the "different" array. +function checkElement(path, key, fist, second, arrayForMissingElements, ignoreDifferences) { + let pathPrefix = ''; + if (path.length > 0) { + pathPrefix = '.'; + } + + // This means that, at some point, the code found an element in the "first" branch that is + // not in the "second" branch. + if (second === undefined || second === null) { + arrayForMissingElements[arrayForMissingElements.length - 1].elements.push(path + pathPrefix + key); + return; + } + + if (typeof fist !== 'object') { + // If the current element is a string, compare the contents, but ony if ignoreDifferences + // is true. + if (!ignoreDifferences && fist != second) { + different[different.length - 1].elements.push(path + pathPrefix + key); + } + } else { + // If the current element is an object, check the childs. + Object.keys(fist).forEach(currentKey => { + checkElement(path + pathPrefix + key, currentKey, fist[currentKey], second[currentKey], arrayForMissingElements, ignoreDifferences); + }); + } +} + +///////////////////////////////////////////// +// Results processing +///////////////////////////////////////////// + +// Becomes true if any of the verifications failed. +let failedValidation = false; + +// If "failedValidation" is false, writes to the console the header of the error list +// and updates the value of "failedValidation" to true. +function updateErrorSumary() { + if (!failedValidation) { + failedValidation = true; + console.log('The following problems were found:', '\n'); + } +} + +// Checks all arrays for errors. This loop is for the languages. +for (let i = 0; i < baseFileOnly.length; i++) { + + // This loop if for checking all the arrays. + [baseFileOnly, translatedFileOnly, enOnly, translatedOnly, different].forEach((array, idx) => { + // If the array has elements, it means that errors were found. + if (array[i].elements.length > 0) { + updateErrorSumary(); + + // Show the appropriate error text according to the current array. + if (idx === 0) { + console.log('The \"' + baseFileOnly[i].lang + '_base.json\" base file has elements that are not present in \"' + baseFileOnly[i].lang + '.json\":'); + } else if (idx === 1) { + console.log("\"" + translatedFileOnly[i].lang + '.json\" has elements that are not present in the \"' + baseFileOnly[i].lang + '_base.json\" base file:'); + } else if (idx === 2) { + console.log('The \"en.json\" file has elements that are not present in the \"' + enOnly[i].lang + '_base.json\" base file:'); + } else if (idx === 3) { + console.log('The \"' + translatedOnly[i].lang + '_base.json\" base file has elements that are not present in \"en.json\":'); + } else if (idx === 4) { + console.log('The \"' + different[i].lang + '_base.json\" base file has values that do not match the ones in \"en.json\":'); + } + // Show all the elements with errors. + array[i].elements.forEach(element => console.log(element)); + console.log(''); + } + }); +} + +// If no error was detected, show a success message on the console. If not, exit with an error code. +if (!failedValidation) { + console.log('The verification passed without problems.'); +} else { + process.exit(1); +} + +function exitWithError(errorMessage) { + console.log('Error: ' + errorMessage) + process.exit(1); +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/en.json b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/en.json new file mode 100644 index 0000000000..c3abdbba1a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/en.json @@ -0,0 +1,752 @@ +{ + "common": { + "usd": "USD", + "loading": "Loading...", + "done-title": "Done", + "warning-title": "Warning", + "error-title": "Error", + "changes-made": "The changes have been made.", + "back-button": "Back", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "continue-button": "Continue", + "close-button": "Close", + "generic-confirmation-check": "I understand the risks and want to continue", + "copied": "The text has been copied to the clipboard." + }, + + "errors": { + "window-size": "The window is too narrow for the content." + }, + + "language": { + "title": "Select Language" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "explorer-link": "{{ coinName }} Explorer", + + "warnings": { + "update-part1": "Wallet update", + "update-part2": "Not used. The code adds the versión number of the lastest update here.", + "update-part3": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs-part1": "There are some", + "pending-txs-part2": "pending transactions.", + "pending-txs-part3": "Data you see may not be updated.", + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend-part1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend-part2": "Telegram.", + "no-backend-part3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "password-label": "Password", + "password-error-info": "You must enter a password.", + "confirm-password-label": "Confirm password", + "confirm-error-info": "The two passwords must match.", + "proceed-button": "Proceed", + "reset-link": "I forgot my password", + "incorrect-password-error": "Incorrect password.", + "decrypting-error": "Error decrypting the wallet." + }, + + "buy": { + "title-and-button": "Buy", + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "create-title": "Create Wallet", + "create-desc": "If you don't have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load\" and enter your seed.", + "encrypt-title": "Encrypt Wallet", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "finish-temporal-title": "Ready", + "finish-temporal-desc": "Please click \"Finish\" button to create the wallet. Remember that it will be deleted after closing the wallet software.", + "hardware-wallet-link": "Using a Skywallet?", + "new-button": "New", + "load-button": "Load", + "finish-button": "Finish", + + "confirm": { + "title": "Safeguard Your Seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!", + "checkbox": "It’s safe, I swear." + } + }, + + "wallet": { + "title-and-button": "Wallets", + "show-empty-button": "Show Empty", + "hide-empty-button": "Hide Empty", + "encrypt-button": "Encrypt Wallet", + "decrypt-button": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete-button": "Delete Wallet", + "rename-button": "Rename", + "add-button": "New Wallet", + "load-button": "Load Wallet", + "hardware-wallet-button": "Skywallet", + "encryption-enabled": "Encryption enabled.", + "encryption-disabled": "Encryption disabled.", + "temporal": "Temporal wallet.", + "warning-hw-security": "Possible security risk. Access the Skywallet options (by pressing the \"Skywallet\" button below the wallets list) while the device is connected for more information.", + "wallet-table-label": "Wallet", + "hardware-wallet-table-label": "Skywallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \"Skywallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the Skywallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + "busy-error": "Please wait for the previous operation to be completed.", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "name-label": "Name", + "name-error-info": "You must enter a name.", + "words-number-label": "How many words the seed has", + "seed-label": "Seed", + "seed-error-info": "You must enter a seed.", + "confirm-seed-label": "Confirm seed", + "confirm-seed-error-info": "The two seeds must match.", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-help": "Generate a 12 word seed.", + "generate-24-help": "Generate a 24 word seed.", + "encrypt-check": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "advanced-options-link": "Advanced options", + "close-advanced-error": "It is not possible to close the options because you have made changes to the values.", + "temporal-check": "Load temporarily", + "temporal-info": "If you use this option, the wallet will be loaded temporarily, which means that it will be deleted as soon as you close the wallet software.", + "temporal-warning": "The wallet will be deleted just after closing the wallet software and won't have a password. You will needed the seed to recover access to the funds. Are you sure you want to continue?", + "seed-checking-error": "It was not possible to verify the validity of the seed.", + "unconventional-seed-title": "Possible Error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed", + "synchronizing-warning-text": "The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \"Scan Addresses\" function or add them again manually.", + "wallet-created": "The wallet has been added to the list.", + + "seed": { + "enter-seed": "Press here to enter the seed", + "change-seed": "Press to change", + "confirm-seed": "Press here to confirm the seed", + "confirmed-seed": "Seed confirmed", + "use-custom": "Enter the seed manually", + "use-normal": "Enter the seed using the recommended method", + "custom-seed-warning-text": "This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.", + "custom-seed-warning-text-recovering": "To avoid possible problems, this option should only be used if you want to recover an unconventional seed.", + "incorrect-word-error": "The word you have entered does not match the requested one.", + "invalid-seed-error": "The seed you have entered is not valid. Please try again.", + "enter-word": "Enter the word #{{number}}", + "word-error-info": "You must enter a word.", + "new-seed-info": "You must enter the words of the seed that was generated by the system, to confirm it.", + "recover-seed-info": "Please be sure to enter the correct words in the correct order." + } + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "label-error-info": "You must enter a name.", + "rename-button": "Rename" + }, + + "address-options": { + "title": "Addresses", + "new": "New Addresses", + "scan": "Scan Addresses", + "scan-help": "Use this option to make the system find already used addresses from this wallet which are missing from the list." + }, + + "scan-addresses": { + "done-with-new-addresses": "The list has been updated.", + "done-without-new-addresses": "No new addresses were found." + }, + + "add-addresses": { + "title": "Select Quantity", + "quantity-label": "How many addresses to create", + "quantity-error-info": "You must enter a value between 1 and 100.", + "error": "There was an unexpected error. Please try again." + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "qr": { + "title": "QR Code", + "data-label": "QR data", + "address-label": "Address", + "request-link": "Request specific amount", + "amount-label": "Requested amount", + "hours-label": "Requested hours", + "message-label": "Message", + "invalid": "(invalid value)" + }, + + "send": { + "title-and-button": "Send", + "unsigned-button": "Unsigned", + "signed-button": "Signed", + "unsigned-confirmation": "The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?", + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "personal-note-label": "Personal note", + "personal-note-help": "Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.", + "wallet-label": "Wallet", + "wallet-error-info": "You must select a wallet.", + "invalid-amount": "Please enter a valid amount", + "convert-confirmation": "Do you also want the already introduced amount to be converted from {{from}} to {{to}}?", + "convert-confirmation-plural": "Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?", + "send-all-available-coins-link": "send all", + "precision-error-warning": "A precision error was detected during conversion. Please check the amount that will be sent.", + "invaid-amount-warning": "An invalid value was detected during conversion. Please check the amount that will be sent.", + "precision-errors-warning": "Precision errors were detected during conversion. Please check the amount that will be sent.", + "invaid-amounts-warning": "Invalid values were detected during conversion. Please check the amount that will be sent.", + "multiple-problems-warning": "Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.", + "addresses-label": "Addresses", + "addresses-error-info": "You must enter at least one valid address.", + "no-wallet-selected-error": "There are no coins to send.", + "no-coins-left-error": "There are no coins left to send.", + "addresses-help": "Limit the addresses from where the coins and hours could be sent.", + "addresses-manual-help": "List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.", + "outputs-error": "There was an error trying to get the outputs. Please make sure you have entered valid addresses.", + "all-outputs": "All the outputs of the selected addresses", + "enter-addresses-for-outputs": "Valid addresses must be entered first", + "enter-wallet-for-outputs-and-addresses": "A valid wallet must be selected first", + "invalid-addresses-for-outputs": "No outputs available", + "available-funds-msg-part1": "With your current selection you can send up to", + "available-funds-msg-part2": "and", + "available-funds-msg-part3": "(at least", + "available-funds-msg-part4": "must be used as transaction fee for sending all the coins or hours).", + "change-address-label": "Custom change address", + "change-address-error-info": "The change address is not valid.", + "change-address-select-from-list-link": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets.", + "specific-hours": "Hours to send:", + "remove-specific-hours-info": "Remove.", + "remove-specific-hours-confirmation": "Are you sure you want to remove the specific amount of hours to send?", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins.", + "destinations-help2": "Destination addresses, their coins and hours.", + "destination-tools-title": "Destination Tools", + "hours-allocation-check": "Use automatic {{ coinHoursName }} allocation", + "options-link": "Options", + "coin-hours-options-link": "Hours options", + "hours-share-factor-label": "{{ coinHoursName }} share factor", + "hours-share-factor-help": "This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.", + "close-hours-share-factor-alert": "The option will be resetted to the default value. Are you sure you want to continue?", + "preview-button": "Preview", + "send-button": "Send", + "show-button": "Show", + "simple-form-button": "Simple", + "advanced-form-button": "Advanced", + "select-wallet": "Select wallet", + "saving-note-error": "The transaction was successfully sent, but it was not possible to save the note.", + "sent": "Transaction successfully sent.", + "total-to-send": "Total:", + "invalid-address-error": "The destination address is not valid.", + "one-invalid-address-error": "One of the destination addresses is not valid.", + "various-invalid-addresses-error": "Some destination addresses are not valid.", + "all-addresses-invalid-error": "The destination addresses are not valid.", + "invalid-addresses-error": "Please make sure the address is valid.", + "address-error-info": "Please enter a valid address.", + "invalid-value-error-info": "Invalid value.", + "insufficient-funds-error-info": "The entered value is greater than the available balance.", + "sending-all-hours-with-coins-waning": "By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?", + "advanced-sending-all-hours-with-coins-waning": "By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?", + "sending-all-hours-waning": "You selected to send all the hours. Are you sure you want to continue?", + "high-hours-share-waning": "Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?", + "advanced-high-hours-share-waning": "Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?", + + "fill-with-link": { + "title": "Use a Transaction Link", + "link-info": "Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.", + "link-label": "Transaction link", + "link-error-info": "You must enter a valid transaction link.", + "process-button": "Process", + "invalid-link-error": "The contents of the transaction link are not valid.", + "invalid-link-hours-error": "The transaction link contains an invalid amount of hours.", + "data-overwritten-alert": "Some data you have entered will be overwritten. Are you sure you want to continue?", + "confirmation": "The form has been updated with the data obtained from the transaction link." + }, + + "known-node-errors": { + "null-change-address-error": "The null address can't be used as the custom change address. Please enter a valid address.", + "to-required-error": "You must provide a destination address for sending coins. Please enter a valid address.", + "zero-coins-error": "It's not possible to send zero coins. Please enter a valid amount.", + "null-destination-error": "The null address can't be used as destination. Please enter a valid address.", + "duplicate-destination-error": "There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.", + "hours-in-automatic-mode-error": "Specific hour amounts can't be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.", + "hours-allocation-mode-needed-error": "The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.", + "invalid-hours-allocation-mode-error": "Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.", + "hours-allocation-mode-not-needed-error": "The hour allocation mode can't be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.", + "invalid-hours-mode-error": "Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.", + "share-factor-needed-error": "The hours share factor is needed. Please try with different values and contact support if the problem is not solved.", + "share-factor-not-needed-error": "The hours share factor can't be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.", + "invalid-share-factor-error": "Invalid share factor. Please try with different values and contact support if the problem is not solved.", + "change-equal-to-destination-error": "The transaction can't be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.", + "repeated-wallet": "A wallet for the specified seed already exists." + }, + + "bulk-send": { + "title": "Bulk Send", + "indications": "To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \"xyz\" address, type \"xyz,10,5\"; if you want the hours to be calculated automatically, type \"xyz,10\". Decimal values must be separated with a dot.", + "data-error-info": "You must enter a value.", + "process-button": "Process", + "no-data-error": "There is no text to process.", + "inconsistent-data-error": "If you set how many hours you want to send to a destination, you must do so for all destinations.", + "invalid-data-error": "The entered text has an invalid format." + } + }, + + "select-address": { + "title": "Select Address", + "no-addresses": "There are no confirmed addresses on this wallet." + }, + + "offline-transactions": { + "loading-problem": "Error trying to get the necessary data", + "wallet-error-info": "You must select a wallet.", + "tx-error-info": "You must enter a valid transaction text.", + "copy-tx": { + "signed-title": "Signed Transaction", + "unsigned-title": "Unsigned Transaction", + "text-unsigned": "This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \"Sign Transaction\" option.", + "text-signed": "This is the signed transaction. You can send it to the network using the \"Broadcast Transaction\" option.", + "input-label": "Transaction text", + "copy-button": "Copy", + "reset-confirmation": "Do you want the the form to be cleaned, so you can create another transaction?", + "reset-done": "The form has been cleaned." + }, + + "sign-tx": { + "title": "Sign Transaction", + "text": "Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.", + "wallet-label": "Wallet", + "select-wallet": "Select wallet", + "input-label": "Transaction text", + "sign-button": "Sign", + "signed": "The transaction has been signed." + }, + + "broadcast-tx": { + "title": "Broadcast Transaction", + "text": "Use this form to send a signed transaction to the network.", + "input-label": "Transaction text", + "send-button": "Send", + "sent": "The transaction has been sent." + } + }, + + "reset": { + "title": "Reset Password", + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "seed-error-info": "You must enter a seed.", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "confirm-error-info": "The two passwords must match.", + "reset-button": "Reset", + "done": "Password successfully changed." + }, + + "tx": { + "transaction-title": "Transaction", + "confirm-transaction-title": "Confirm Transaction", + "from-small-label": "From:", + "to-small-label": "To:", + "date-small-label": "Date:", + "status-small-label": "Status:", + "coins-small-label": "Coins:", + "hours-small-label": "Hours:", + "id-small-label": "Tx ID:", + "note-small-label": "Note:", + "without-note": "Without note", + "show-more-link": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs-title": "Inputs", + "outputs-title": "Outputs", + "confirmed-transaction": "Confirmed", + "pending-transaction": "Pending", + "current-rate-help": "Calculated at the current rate." + }, + + "edit-note": { + "title": "Edit Note", + "change-button": "Change" + }, + + "backup": { + "title": "Backup Wallet", + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "wallet-table-label": "Wallet name", + "filename-table-label": "Filename", + "save-addresses-button": "Save Addresses", + "show-seed-button": "Show Seed", + "no-wallets": "There are no wallets", + "unencrypted-info": "For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.", + "hw-wallet-info": "For getting the seed of a Skywallet, please use the \"Skywallet\" option at the bottom of the wallets page.", + "not-compatible-error": "Your web browser is not compatible with this function.", + + "seed-modal-window": { + "title": "Wallet Seed", + "seed-label": "Seed" + } + }, + + "blockchain": { + "title": "Blockchain", + "blocks-label": "Number of blocks", + "time-label": "Timestamp of last block", + "hash-label": "Hash of last block", + "current-supply-label": "Current {{ coinName }} supply", + "total-supply-label": "Total {{ coinName }} supply", + "current-coinhour-supply-label": "Current {{ coinHoursName }} supply", + "total-coinhour-supply-label": "Total {{ coinHoursName }} supply" + }, + + "network": { + "title": "Networking", + "error-no-connections": "No connections", + "peer-small-table-label": "Peer", + "source-small-table-label": "Source", + "block-height-small-table-label": "Block height", + "block-height-short-small-table-label": "Block", + "last-seen-small-table-label": "Last seen", + "last-received-help": "Last received.", + "last-sent-help": "Last sent.", + "in-help": "Incoming.", + "out-help": "Outgoing.", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "title": "Pending Transactions", + "timestamp-table-label": "Timestamp", + "txid-table-label": "Transaction ID", + "none": "No pending transactions", + "my-transactions-button": "Mine", + "all-transactions-button": "All" + }, + + "outputs": { + "title": "Outputs", + "error-no-outputs": "No unspent outputs" + }, + + "history": { + "title-and-button": "History", + "tx-detail-title": "Transaction Detail", + "moving": "Internally moving {{ coinName }}", + "moved": "Internally moved {{ coinName }}", + "sending": "Sending {{ coinName }}", + "sent": "Sent {{ coinName }}", + "received": "Received {{ coinName }}", + "receiving": "Receiving {{ coinName }}", + "pending-indication": "Pending", + "transaction-note-small-label": "Note:", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses", + "view-all": "View all {{ number }} transactions" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "default-title": "Confirmation", + "yes-button": "Yes", + "no-button": "No" + }, + + "service": { + "api" : { + "no-internet-error": "You do not have a internet connection or the node has stopped working.", + "incorrect-password-error": "Incorrect password.", + "unknown-error": "It was not possible to perform the operation.", + "api-disabled-error": "API disabled." + } + }, + + "force-skywallet-wipe": { + "title": "Forced Skywallet Wipe", + "operation-warning": "This option is designed only as a last resort for cases where the device cannot be used with the normal options. All data on the device will be erased, so you will need your seed to recover the funds.", + "proceed-button": "Proceed" + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New Skywallet", + "confirm": "Please confirm the operation on the Skywallet.", + "confirm-and-more": "Please confirm the operation on the Skywallet and follow the instructions displayed.", + "follow": "Please follow the instructions displayed on the Skywallet.", + "completed": "Operation completed successfully.", + "name-updated": "The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device." + }, + "errors": { + "generic-error": "Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.", + "disconnected": "Unable to perform the operation. The Skywallet is not connected.", + "incorrect-wallet": "Unable to perform the operation. The connected Skywallet is different from the expected one.", + "incorrect-pin": "Unable to perform the operation. The PIN you have entered is incorrect.", + "refused": "The operation was canceled.", + "too-many-inputs-outputs": "The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.", + "daemon-connection": "Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads", + "daemon-connection-with-configurable-link": "Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ", + "timeout": "The operation was canceled due to inactivity. Please try again.", + "timeout-with-configurable-link": "The operation was canceled due to inactivity. Please try again. If this issue prevents the device from being usable, you can use the following option:", + "invalid-address-generated": "There was a problem with the address generator and the operation had to be canceled.", + "invalid-address": "Invalid address.", + "not-in-bootloader-mode": "To use this option the Skywallet must be in bootloader mode." + }, + "security-warning" : { + "title": "Security Warning", + "text": "The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.", + "link": "Open the Skywallet options window." + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No Skywallet detected. Please connect a Skywallet to use this option.", + "unconfigured-detected-title": "Unconfigured Skywallet", + "unconfigured-detected": "A seedless Skywallet has been detected. Select \"Configure Automatically\" if you want to configure it as a brand new wallet and start using it. Select \"Restore Backup\" if you want to configure the Skywallet with a previously created seed backup.", + "configured-detected": "Skywallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security Warnings", + "security-warning-title": "Security Warning", + "unchecked-version-warning": "It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.", + "outdated-version-warning": "The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \"Update Firmware\" option.", + "backup-warning": "You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a Backup\" option.", + "pin-warning": "The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \"Create PIN Code\" option.", + "options": "Options:", + "update-firmware": "Update Firmware", + "configure-automatically": "Configure Automatically", + "restore-backup": "Restore Backup", + "create-backup": "Create a Backup", + "wipe": "Wipe the Device", + "confirm-seed": "Confirm Seed", + "create-pin": "Create PIN Code", + "change-pin": "Change PIN Code", + "delete-pin": "Delete PIN Code", + "forgotten-pin-part1": "If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking", + "forgotten-pin-part2": "here.", + "firmware-version": "Device firmware version:" + }, + "update-firmware-warning" : { + "title": "Outdated Firmware", + "text": "WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.", + "update": "Update" + }, + "update-firmware" : { + "title-connecting": "Connecting...", + "title-update": "Update Firmware", + "title-install": "Install Firmware", + "text-downloading": "Checking device and downloading files...", + "text-bootloader": "WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-not-bootloader": "To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-no-firmware": "Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.", + "follow": "The firmware update has been sent to the Skywallet. Please continue the process on the device.", + "connection-error": "It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.", + "timeout": "The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.", + "finished": "Your device has been configured correctly. Please unplug it before continuing." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a Skywallet.", + "error-wrong-word": "Error: the retyped word does not match the one requested by the Skywallet.", + "error-invalid-seed": "Error: the seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: the seed is valid but does not match the one in the device.", + "correct-seed": "The seed is valid and matches the one in the device." + }, + "added" : { + "title": "New Skywallet", + "configuring": "New Skywallet detected. Configuring...", + "done": "Done", + "added1": "The connected Skywallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the Skywallet even when it is not connected.", + "added-error-info": "You must enter a name.", + "characters-warning": "If you use non-standard English characters, the name may not be displayed correctly on the device." + }, + "wipe" : { + "warning": "WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete-check": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet funds, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter Word", + "enter-word": "Enter the word shown on the device", + "info": "You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.", + "word-label": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. The PINs you have entered do not match." + }, + "remove-pin" : { + "warning": "WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties." + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the Current PIN", + "title-change-new": "Enter the New PIN", + "title-change-confirm": "Confirm the New PIN", + "instructions-generic": "The PIN layout is displayed on the Skywallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.", + "instructions-change": "Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol •.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \"7\" and \"5\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet." + }, + "create-tx" : { + "title": "Create Transaction", + "upper-text": "Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:", + "lower-text": "If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.", + "separator-for-coins-and-hours": "and", + "separator-to-destination": "to" + }, + "confirm-address" : { + "title": "Confirm Address", + "instructions": "Please confirm on the Skywallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the Skywallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "title-and-button": "Buy {{ coinName }}", + "label-you-send": "You send", + "label-you-get": "You get (approx.)", + "label-to-address": "To {{coin}} address", + "label-price": "Exchange rate", + "label-stimate-transaction-time": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-part1": "I agree with the", + "agree-part2": "Terms of Use", + "agree-part3": "and the", + "agree-part4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "label-status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "destination-select-from-list-link": "Select", + "unavailable": "The exchange service is not available in the portable version", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later", + "invalid-address-error": "Invalid address.", + "from-coin-error-info": "You must select a coin.", + "invalid-value-error-info": "Invalid value.", + "address-error-info": "Please enter a valid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.", + "user-deposit-timeout": "Order canceled due to inactivity", + "user-deposit-timeout-info": "The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "title": "Order History", + "address": "Address:", + "date": "Date:" + }, + "details": { + "exchange-addr-label": "Exchange address (valid for this exchange operation only)", + "exchange-addr-tag-label": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id-label": "Transaction ID", + "order-id-label": "Order ID", + "initial-price-label": "Initial exchange rate", + "error-msg-label": "Error message", + "details-link": "Details", + "start-date-label": "Start date", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/es.json b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/es.json new file mode 100644 index 0000000000..9673875e30 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/es.json @@ -0,0 +1,752 @@ +{ + "common": { + "usd": "USD", + "loading": "Cargando...", + "done-title": "Listo", + "warning-title": "Advertencia", + "error-title": "Error", + "changes-made": "Los cambios se han hecho.", + "back-button": "Volver", + "create-button": "Crear", + "load-button": "Cargar", + "cancel-button": "Cancelar", + "continue-button": "Continuar", + "close-button": "Cerrar", + "generic-confirmation-check": "Entiendo los riesgos y deseo continuar", + "copied": "El texto ha sido copiado al portapapeles." + }, + + "errors": { + "window-size": "La ventana es demasiado estrecha para el contenido." + }, + + "language": { + "title": "Seleccionar Lenguaje" + }, + + "header": { + "syncing-blocks": "Sincronizando bloques", + "explorer-link": "Explorador de {{ coinName }}", + + "warnings": { + "update-part1": "La actualización", + "update-part2": "Not used. The code adds the versión number of the lastest update here.", + "update-part3": "está disponible.", + "synchronizing": "La billetera está sincronizando. Los datos mostrados pueden estar desactualizados.", + "pending-txs-part1": "Hay una o más", + "pending-txs-part2": "transacciones pendientes.", + "pending-txs-part3": "Los datos mostrados pueden estar desactualizados.", + "no-connections": "Sin conexiones activas, ¡el cliente no está conectado a otros nodos!", + "no-backend-part1": "Sin acceso al servidor. Por favor, reinicie la aplicación y/o contáctenos vía", + "no-backend-part2": "Telegram.", + "no-backend-part3": "", + "csrf": "Vulnerabilidad de seguridad: CSRF no funciona. Por favor, salga de inmediato." + } + }, + + "password": { + "title": "Introduzca Su Contraseña", + "password-label": "Contraseña", + "password-error-info": "Debe ingresar una contraseña.", + "confirm-password-label": "Confirmar contraseña", + "confirm-error-info": "Las dos contraseñas deben coincidir.", + "proceed-button": "Proceder", + "reset-link": "He olvidado mi contraseña", + "incorrect-password-error": "Contraseña incorrecta.", + "decrypting-error": "Error al desencriptar la billetera" + }, + + "buy": { + "title-and-button": "Comprar", + "deposit-address": "Seleccione una dirección para la cual generar un enlace de depósito BTC:", + "select-address": "Seleccione una dirección", + "generate": "Generar", + "deposit-location": "Localización de Depósito", + "deposit-location-desc": "Seleccione la billetera en la que desea que le depositemos sus Skycoins después de recibir los Bitcoins.", + "make-choice": "Realice una selección", + "wallets-desc": "Una nueva dirección BTC es generada cada vez que se selecciona una nueva billetera y dirección. Una única dirección de Skycoin puede tener asignadas hasta 5 direcciones BTC.", + "send": "Enviar Bitcoins", + "send-desc": "Envíe Bitcoins a la dirección abajo indicada. Al recibirlos, le depositaremos los Skycoins en una nueva dirección en la billetera seleccionada más arriba, a la tasa de cambio actual de {{ rate }} SKY/BTC.", + "fraction-warning": "¡Envíe sólo múltiplos de la tasa SKY/BTC! Los Skycoins son enviados en números enteros, ¡no se envían fracciones de SKY!", + "receive": "Recibir SKY", + "receive-desc": "Después de recibir los Bitcoins, le enviaremos sus Skycoins. El tiempo de espera para recibir sus SKY puede ser de entre 20 minutos y una hora.", + "status-button": "Estatus:", + "check-status-button": "Revisar Estatus", + "new-order-button": "Nueva Orden" + }, + + "wizard": { + "create-title": "Crear Billetera", + "create-desc": "Si no tiene una billetera de {{ coinName }}, use la semilla generada automáticamente para crear una nueva. Si ya tiene una billetera, seleccione \"Cargar\" e introduzca su semilla.", + "encrypt-title": "Encriptar Billetera", + "encrypt-desc": "Incremente la seguridad de su billetera encriptándola. Al introducir una contraseña más abajo, su billetera será encriptada. Sólo quien tenga la contraseña podrá acceder a la billetera y retirar fondos.", + "finish-temporal-title": "Listo", + "finish-temporal-desc": "Por favor presione el botón \"Finalizar\" para crear la billetera. Recuerde que la billetera será borrada al cerrar el software de billetera.", + "hardware-wallet-link": "¿Utilizando una Skywallet?", + "new-button": "Nueva", + "load-button": "Cargar", + "finish-button": "Finalizar", + + "confirm": { + "title": "¡Resguarde Su Semilla!", + "desc": "Queremos asegurarnos de que ha anotado su semilla y la ha almacenado en un lugar seguro. ¡Si olvida su semilla, NO podrá recuperar su billetera!", + "checkbox": "Está segura, lo garantizo." + } + }, + + "wallet": { + "title-and-button": "Billeteras", + "show-empty-button": "Mostrar Vacías", + "hide-empty-button": "Ocultar Vacías", + "encrypt-button": "Encriptar Billetera", + "decrypt-button": "Desencriptar Billetera", + "decrypt-warning": "Advertencia: por razones de seguridad, no se recomienda mantener las carteras desencriptadas. Se aconseja precaución.", + "delete-button" : "Borrar Billetera", + "rename-button": "Renombrar", + "add-button": "Nueva Billetera", + "load-button": "Cargar Billetera", + "hardware-wallet-button": "Skywallet", + "encryption-enabled": "Encriptado habilitado.", + "encryption-disabled": "Encriptado deshabilitado.", + "temporal": "Billetera temporal.", + "warning-hw-security": "Posible riesgo de seguridad. Acceda a las opciones de la Skywallet (presionando el botón \"Skywallet\" debajo de la lista de billeteras) mientras el dispositivo está conectado, para más información.", + "wallet-table-label": "Billetera", + "hardware-wallet-table-label": "Skywallet", + "delete-confirmation": "ADVERTENCIA: la billetera \"{{ name }}\" será removida de la lista. Para agregarla nuevamente, deberá volver a conectar el dispositivo y abrir las opciones de la Skywallet (presionando el botón \"Skywallet\" debajo de la lista de las billeteras). ¿Desea continuar?", + "delete-confirmation-check": "Sí, quiero borrar la billetera", + "max-hardware-wallets-error": "Ya ha alcanzado el número máximo de direcciones que se puede agregar a la Skywallet.", + "add-many-confirmation": "ADVERTENCIA: si agrega demasiadas direcciones sin usar las anteriores o si usa las últimas y no las primeras, es posible que algunas direcciones no se recuperen automáticamente si intenta restaurar la billetera con la semilla (tendrá que agregarlas manualmente). ¿Desea continuar?", + "busy-error": "Por favor espere a que se complete la operación anterior.", + + "new": { + "create-title": "Crear Billetera", + "load-title": "Cargar Billetera", + "name-label": "Nombre", + "name-error-info": "Debe ingresar un nombre.", + "words-number-label": "Cuantas palabras tiene la semilla", + "seed-label": "Semilla", + "seed-error-info": "Debe ingresar una semilla.", + "confirm-seed-label": "Confirmar semilla", + "confirm-seed-error-info": "Las dos semillas deben coincidir.", + "seed-warning": "¡Recuerde esta semilla! Manténgala en un lugar seguro. ¡Si olvida su semilla, no podrá recuperar la billetera!", + "12-words": "12 palabras", + "24-words": "24 palabras", + "generate-12-help": "Generar una semilla de 12 palabras.", + "generate-24-help": "Generar una semilla de 24 palabras.", + "encrypt-check": "Encriptar billetera", + "encrypt-warning": "Le sugerimos que encripte con una contraseña cada una de sus billeteras. Si olvida su contraseña, puede restaurarla con la semilla. Asegúrese de guardar su semilla en un lugar seguro antes de encriptar la billetera.", + "advanced-options-link": "Opciones avanzadas", + "close-advanced-error": "No es posible cerrar las opciones porque ha realizado cambios en los valores.", + "temporal-check": "Cargar temporalmente.", + "temporal-info": "Si usa esta opción, la billetera será cargada temporalmente, lo que significa que será borrada aopenas cierre el software de billetera.", + "temporal-warning": "La billetera será borrada apenas al cerrar el software de billetera y no tendrá password. Usted necesitará la semilla para recuperar el acceso a los fondos. ¿Seguro que desea continuar?", + "seed-checking-error": "No fue posible verificar la validez de la semilla.", + "unconventional-seed-title": "Posible Error", + "unconventional-seed-text": "Usted introdujo una semilla no convencional. Si lo hizo por alguna razón en especial, puede continuar (sólo recomendable para usuarios avanzados). Sin embargo, si su intención es utilizar una semilla normal del sistema, usted debe borrar los textos y/o caracteres especiales adicionales.", + "unconventional-seed-check": "Continuar con la semilla no convencional", + "synchronizing-warning-text": "La billetera todavía está sincronizando los datos y la operación podría no restaurar todas las direcciones. Si algunas direcciones no son restauradas, usted deberá esperar a que la billetera esté totalmente sincronizada y usar la opción \"Escanear Direcciones\" o agregarlas nuevamente de forma manual.", + "wallet-created": "La billetera ha sido agregada a la lista.", + + "seed": { + "enter-seed": "Presione aquí para ingresar la semilla", + "change-seed": "Presione para cambiar", + "confirm-seed": "Presione aquí para confirmar la semilla", + "confirmed-seed": "Semilla confirmada", + "use-custom": "Ingresar la semilla manualmente", + "use-normal": "Ingresar la semilla usando el método recomendado", + "custom-seed-warning-text": "Esta opción solo es recomendada para usuarios avanzados. Cometer errores con la semilla puede hacer que pierda el acceso a los fondos en caso de que surja algún problema.", + "custom-seed-warning-text-recovering": "Para evitar posibles problemas, esta opción solo debe usarse si desea recuperar una semilla no convencional.", + "incorrect-word-error": "La palabra que ha ingresado no coincide con la que se ha solicitado.", + "invalid-seed-error": "La semilla que ha ingresado no es válida. Por favor, vuelva a intentarlo.", + "enter-word": "Ingrese la palabra número {{number}}", + "word-error-info": "Debe ingresar una palabra.", + "new-seed-info": "Usted debe ingresar las palabras de la semilla que fue generada por el sistema, para confirmarla.", + "recover-seed-info": "Por favor, asegúrese de ingresar las palabras correctas en el orden correcto." + } + }, + + "rename": { + "title": "Renombrar Billetera", + "name-label": "Nombre", + "label-error-info": "Debe ingresar un nombre.", + "rename-button": "Renombrar" + }, + + "address-options": { + "title": "Direcciones", + "new": "Nuevas Direcciones", + "scan": "Escanear Direcciones", + "scan-help": "Use esta opción para hacer que el sistema encuentre direcciones ya usadas de esta billetera que faltan en la lista." + }, + + "scan-addresses": { + "done-with-new-addresses": "La lista ha sido actualizada.", + "done-without-new-addresses": "No se encontraron nuevas direcciones." + }, + + "add-addresses": { + "title": "Seleccionar Cantidad", + "quantity-label": "Cantidad de direcciones a crear", + "quantity-error-info": "Debe ingresar un valor entre 1 y 100.", + "error": "Hubo un error inesperado. Por favor, inténtelo de nuevo." + }, + + "address": { + "show": "Presione para mostrar", + "copy": "Copiar", + "copy-address": "Copiar dirección", + "copied": "¡Copiado!", + "confirm": "Confirmar dirección", + "outputs": "Salidas no gastadas", + "history": "Historial" + } + }, + + "qr": { + "title": "Código QR", + "data-label": "Datos del código QR", + "address-label": "Dirección", + "request-link": "Solicitar monto específico", + "amount-label": "Monto solicitado", + "hours-label": "Horas solicitadas", + "message-label": "Mensaje", + "invalid": "(valor inválido)" + }, + + "send": { + "title-and-button": "Enviar", + "unsigned-button": "Sin firmar", + "signed-button": "Firmada", + "unsigned-confirmation": "El formulario de transacciones sin firmar no permite enviar transacciones normalmente, sino que simplemente crea el texto de la transacción, el cual debe ser firmado antes de que pueda ser enviado a la red. Esto es útil para crear transacciones que serán firmadas en un equipo que siempre está fuera de línea, por razones de seguridad. ¿Desea continuar?", + "synchronizing-warning": "La billetera todavía está sincronizando los datos, por lo que el saldo que se muestra puede ser incorrecto. ¿Seguro de que desea continuar?", + "from-label": "Enviar desde", + "to-label": "Enviar a", + "amount-label": "Cantidad", + "personal-note-label": "Nota personal", + "personal-note-help": "Use este campo para agregar un texto que le permita identificar la transacción en el futuro. Este texto se guarda localmente, por lo que solo será visible desde esta computadora.", + "wallet-label": "Billetera", + "wallet-error-info": "Debe seleccionar una billetera.", + "invalid-amount": "Por favor introduzca una cantidad válida", + "convert-confirmation": "¿También desea que la cantidad introducida se convierta de {{from}} a {{to}}?", + "convert-confirmation-plural": "¿También desea que las cantidades introducidas se conviertan de {{from}} a {{to}}?", + "send-all-available-coins-link": "enviar todo", + "precision-error-warning": "Se detectó un error de precisión durante la conversión. Por favor verifique la cantidad que se enviará.", + "invaid-amount-warning": "Se detectó un valor inválido durante la conversión. Por favor verifique la cantidad que se enviará.", + "precision-errors-warning": "Se detectaron errores de precisión durante la conversión. Por favor verifique la cantidad que se enviará.", + "invaid-amounts-warning": "Se detectaron valores inválidos durante la conversión. Por favor verifique la cantidad que se enviará.", + "multiple-problems-warning": "Algunos valores no se convirtieron por ser inválidos o podrían haberse convertido con errores de precisión. Por favor verifique la cantidad que se enviará.", + "addresses-label": "Direcciones", + "addresses-error-info": "Debe ingresar al menos una dirección válida.", + "no-wallet-selected-error": "No hay monedas para enviar.", + "no-coins-left-error": "No hay monedas restantes para enviar.", + "addresses-help": "Limite las direcciones desde donde se podrían enviar las monedas y las horas.", + "addresses-manual-help": "Lista de las direcciones desde las cuales se enviarán las monedas, separadas por comas. Todas las direcciones deben pertenecer a la misma billetera o no podrá firmar la transacción con la billetera de escritorio.", + "all-addresses": "Todas las direcciones de la billetera seleccionada", + "outputs-label": "Salidas no gastadas", + "outputs-help": "Limite las salidas no gastadas desde donde se podrían enviar las monedas y las horas. Solo se muestran las salidas de las direcciones seleccionadas.", + "outputs-error": "Hubo un error al intentar obtener las salidas. Por favor asegúrese de haber ingresado direcciones válidas.", + "all-outputs": "Todas las salidas no gastadas de las direcciones seleccionadas", + "enter-addresses-for-outputs": "Debe ingresar direcciones válidas primero", + "enter-wallet-for-outputs-and-addresses": "Debe seleccionar una billetera válida primero", + "invalid-addresses-for-outputs": "No hay salidas disponibles", + "available-funds-msg-part1": "Con su selección actual puede enviar hasta", + "available-funds-msg-part2": "y", + "available-funds-msg-part3": "(al menos", + "available-funds-msg-part4": "deben ser utilizadas como tarifa de transacción para enviar todas las monedas u horas).", + "change-address-label": "Dirección de retorno personalizada", + "change-address-error-info": "La dirección de retorno no es válida.", + "change-address-select-from-list-link": "Seleccionar", + "change-address-help": "Dirección para recibir el cambio. Si no se proporciona, será elegida automáticamente. Haga clic en el enlace \"Seleccionar\" para elegir una dirección de una de sus billeteras.", + "specific-hours": "Horas a enviar:", + "remove-specific-hours-info": "Remover.", + "remove-specific-hours-confirmation": "¿Seguro que desea eliminar la cantidad específica de horas a enviar?", + "destinations-label": "Destinos", + "destinations-help1": "Direcciones de destino y sus monedas.", + "destinations-help2": "Direcciones de destino, sus monedas y horas.", + "destination-tools-title": "Herramientas de destino", + "hours-allocation-check": "Usar una distribución automática de {{ coinHoursName }}", + "options-link": "Opciones", + "coin-hours-options-link": "Opciones de horas", + "hours-share-factor-label": "Factor de distribución de {{ coinHoursName }}", + "hours-share-factor-help": "Este control permite seleccionar el porcentaje de {{ coinHoursName }} que serán enviadas. de Mientras mayor sea el valor, más {{ coinHoursName }} se enviarán y menos serán retenidas.", + "close-hours-share-factor-alert": "La opción se restablecerá al valor predeterminado. ¿Seguro que desea continuar?", + "preview-button": "Preview", + "send-button": "Enviar", + "show-button": "Mostrar", + "simple-form-button": "Simple", + "advanced-form-button": "Advanzado", + "select-wallet": "Seleccionar billetera", + "saving-note-error": "La transacción se envió correctamente, pero no fue posible guardar la nota.", + "sent": "La transacción se envió correctamente.", + "total-to-send": "Total:", + "invalid-address-error": "La dirección de destino no es válida.", + "one-invalid-address-error": "Una de las direcciones de destino no es válida.", + "various-invalid-addresses-error": "Algunas direcciones de destino no son válidas.", + "all-addresses-invalid-error": "Las direcciones de destino no son válidas.", + "invalid-addresses-error": "Por favor asegúrese de que la dirección sea válida.", + "address-error-info": "Por favor introduzca una dirección válida.", + "invalid-value-error-info": "Valor inválido.", + "insufficient-funds-error-info": "El valor ingresado es mayor que el saldo disponible.", + "sending-all-hours-with-coins-waning": "Al enviar todas las monedas, todas las horas de la billetera seleccionada serán enviadas o quemadas. Si desea retener horas, no debe enviar todas las monedas. ¿Seguro que desea continuar?", + "advanced-sending-all-hours-with-coins-waning": "Al enviar todas las monedas, todas las horas de la(s) fuente(s) seleccionada(s) serán enviadas o quemadas. Si desea retener horas, no debe enviar todas las monedas. ¿Seguro que desea continuar?", + "sending-all-hours-waning": "Usted seleccionó enviar todas las horas. ¿Seguro que desea continuar?", + "high-hours-share-waning": "Su selección puede resultar en el envío de todas las horas de la billetera seleccionada. ¿Seguro que desea continuar?", + "advanced-high-hours-share-waning": "Su selección puede resultar en el envío de todas las horas de la(s) fuente(s) seleccionada(s). ¿Seguro que desea continuar?", + + "fill-with-link": { + "title": "Utilizar un link de transacción", + "link-info": "Aquí puede ingresar un link que se le hubiese enviado solicitando monedas. El formulario se rellenará con los datos obtenidos del link.", + "link-label": "Link de transacción", + "link-error-info": "Debe ingresar un link de transacción válido.", + "process-button": "Procesar", + "invalid-link-error": "El contenido del link de transacción no es válido.", + "invalid-link-hours-error": "El link de transacción contiene una cantidad de horas no válida.", + "data-overwritten-alert": "Se sobrescribirán algunos datos que ha introducido. Seguro de que desea continuar?", + "confirmation": "El formulario se ha actualizado con los datos obtenidos del link de transacción." + }, + + "known-node-errors": { + "null-change-address-error": "La dirección nula no se puede utilizar como dirección de retorno personalizada. Por favor introduzca una dirección válida.", + "to-required-error": "Debe proporcionar una dirección de destino para enviar monedas. Por favor introduzca una dirección válida.", + "zero-coins-error": "No es posible enviar cero monedas. Por favor introduzca una cantidad válida.", + "null-destination-error": "La dirección nula no se puede utilizar como dirección de destino. Por favor introduzca una dirección válida.", + "duplicate-destination-error": "Hay destinos duplicados. Por favor no repita la misma dirección y cantidad en más de un destino.", + "hours-in-automatic-mode-error": "No se pueden especificar cantidades de horas mientras se usa la distribución automática de horas. Por favor pruebe con valores diferentes y póngase en contacto con el servicio de soporte si el problema no se resuelve.", + "hours-allocation-mode-needed-error": "Se requiere el modo de asignación de horas. Por favor pruebe con valores diferentes y póngase en contacto con el servicio de soporte si el problema no se resuelve.", + "invalid-hours-allocation-mode-error": "Modo de asignación de horas no válido. Por favor pruebe con valores diferentes y póngase en contacto con el servicio de soporte si el problema no se resuelve.", + "hours-allocation-mode-not-needed-error": "El modo de asignación de horas no se puede especificar mientras se usa la distribución de horas manual. Por favor pruebe con valores diferentes y póngase en contacto con el servicio de soporte si el problema no se resuelve.", + "invalid-hours-mode-error": "Método de distribución de horas no válido. Por favor pruebe con valores diferentes y póngase en contacto con el servicio de soporte si el problema no se resuelve.", + "share-factor-needed-error": "Se necesita el factor de distribución de horas. Por favor pruebe con valores diferentes y póngase en contacto con el servicio de soporte si el problema no se resuelve.", + "share-factor-not-needed-error": "El factor de distribución de horas no puede ser especificado mientras se usa la distribución de horas manual. Por favor pruebe con valores diferentes y póngase en contacto con el servicio de soporte si el problema no se resuelve.", + "invalid-share-factor-error": "Factor de distribución de horas inv+alido. Por favor pruebe con valores diferentes y póngase en contacto con el servicio de soporte si el problema no se resuelve.", + "change-equal-to-destination-error": "No es posible crear la transacción debido a que se regresaría una cantidad repetida de monedas a la misma dirección de destino. Por favor inténtelo nuevamente con valores diferentes.", + "repeated-wallet": "Una billetera para la semilla indicada ya existe." + }, + + "bulk-send": { + "title": "Envío Masivo", + "indications": "Para enviar a múltiples destinos de forma rápida, escriba cada dirección, cantidad de monedas y cantidad de horas (opcional) en una línea, separadas por una coma. Ejemplo: si desea enviar 10 monedas y 5 horas a la dirección \"xyz\", escriba \"xyz,10,5\"; si desea que las horas se calculen automáticamente, escriba \"xyz,10\". Los valores decimales se deben separar con un punto.", + "data-error-info": "Debe ingresar un valor.", + "process-button": "Procesar", + "no-data-error": "No hay texto para procesar.", + "inconsistent-data-error": "Si establece cuántas horas desea enviar a un destino, debe hacerlo para todos los destinos.", + "invalid-data-error": "El texto ingresado tiene un formato inválido." + } + }, + + "select-address": { + "title": "Seleccionar Dirección", + "no-addresses": "No hay direcciones confirmadas en esta billetera." + }, + + "offline-transactions": { + "loading-problem": "Error al intentar obtener los datos necesarios", + "wallet-error-info": "Debe seleccionar una billetera.", + "tx-error-info": "Debe ingresar un texto de transacción válido.", + "copy-tx": { + "signed-title": "Transacción Firmada", + "unsigned-title": "Transacción Sin Firmar", + "text-unsigned": "Esta es la transacción sin firmar que se ha creado con los datos que ha ingresado. Por favor copie el texto para poder firmarlo con la opción \"Firmar transacción\".", + "text-signed": "Esta es la transacción firmada. Puede enviarla a la red utilizando la opción \"Transmitir Transacción\".", + "input-label": "Texto de la transacción", + "copy-button": "Copiar", + "reset-confirmation": "¿Desea que se limpie el formulario, de forma que pueda crear otra transacción?", + "reset-done": "El formulario ha sido limpiado." + }, + + "sign-tx": { + "title": "Firmar Transacción", + "text": "Use este formulario para firmar una transacción. Para que la operación funcione correctamente debe seleccionar la billetera que incluye todas las entradas/direcciones utilizadas para enviar monedas en la transacción.", + "wallet-label": "Billetera", + "select-wallet": "Seleccione una billetera", + "input-label": "Texto de la transacción", + "sign-button": "Firmar", + "signed": "La transacción ha sido firmada." + }, + + "broadcast-tx": { + "title": "Transmitir Transacción", + "text": "Use este formulario para enviar una transacción firmada a la red.", + "input-label": "Texto de la transacción", + "send-button": "Enviar", + "sent": "La transacción ha sido enviada." + } + }, + + "reset": { + "title": "Restablecer Contraseña", + "wallet-label": "Billetera", + "seed-label": "Semilla de la billetera", + "seed-error-info": "Debe ingresar una semilla.", + "password-label": "Nueva contraseña (deje en blanco si desea que la billetera no esté encriptada)", + "confirm-label": "Confirme la contraseña", + "confirm-error-info": "Las dos contraseñas deben coincidir.", + "reset-button": "Restablecer", + "done": "Contraseña cambiada correctamente." + }, + + "tx": { + "transaction-title": "Transacción", + "confirm-transaction-title": "Confirmar Transacción", + "from-small-label": "Desde:", + "to-small-label": "A:", + "date-small-label": "Fecha:", + "status-small-label": "Estatus:", + "coins-small-label": "Monedas:", + "hours-small-label": "Horas:", + "id-small-label": "Tx ID:", + "note-small-label": "Nota:", + "without-note": "Sin nota", + "show-more-link": "Mostrar más", + "hours-moved": "movida(s)", + "hours-sent": "enviada(s)", + "hours-received": "recibida(s)", + "hours-burned": "quemada(s)", + "inputs-title": "Entradas", + "outputs-title": "Salidas", + "confirmed-transaction": "Confirmada", + "pending-transaction": "Pendiente", + "current-rate-help": "Calculado a la tasa actual." + }, + + "edit-note": { + "title": "Editar Nota", + "change-button": "Cambiar" + }, + + "backup": { + "title": "Respaldar Billetera", + "wallet-directory": "Directorio de la Billetera:", + "seed-warning": "RESPALDE SU SEMILLA. EN PAPEL. EN UN LUGAR SEGURO. Mientras tenga su semilla, podrá recuperar las monedas.", + "desc": "Use la tabla de más abajo para obtener las semillas de sus billeteras encriptadas.
Para obtener las semillas de las billeteras no encriptadas, abra el directorio de más arriba, abra los archivos .wlt en un editor de texto y recupere las semillas.", + "wallet-table-label": "Nombre de la billetera", + "filename-table-label": "Archivo", + "save-addresses-button": "Guardar Direcciones", + "show-seed-button": "Mostrar semilla", + "no-wallets": "No hay billeteras", + "unencrypted-info": "Por razones de seguridad, no es posible mostrar las semillas de las billeteras sin encriptar. Para obtener la semilla, por favor encripte la billetera con una contraseña o siga las instrucciones en la parte superior de esta página.", + "hw-wallet-info": "Para obtener la semilla de una Skywallet, por favor use la opción \"Skywallet\" de la parte inferior de la página de billeteras.", + "not-compatible-error": "Su navegador web no es compatible con esta función.", + + "seed-modal-window": { + "title": "Semilla de la Billetera", + "seed-label": "Semilla" + } + }, + + "blockchain": { + "title": "Blockchain", + "blocks-label": "Cantidad de bloques", + "time-label": "Fecha del último bloque", + "hash-label": "Hash del último bloque", + "current-supply-label": "Suministro de {{ coinName }} actual", + "total-supply-label": "Suministro de {{ coinName }} total", + "current-coinhour-supply-label": "Suministro de {{ coinHoursName }} actual", + "total-coinhour-supply-label": "Suministro de {{ coinHoursName }} total" + }, + + "network": { + "title": "Red", + "error-no-connections": "Sin conexiones", + "peer-small-table-label": "Par", + "source-small-table-label": "Fuente", + "block-height-small-table-label": "Altura del bloque", + "block-height-short-small-table-label": "Bloque", + "last-seen-small-table-label": "Última vez visto", + "last-received-help": "Última recepción.", + "last-sent-help": "Último envío.", + "in-help": "Entrante.", + "out-help": "Saliente.", + + "sources": { + "default": "Par por defecto", + "exchange": "Intercambio de pares" + } + }, + + "pending-txs": { + "title": "Transacciones Pendientes", + "timestamp-table-label": "Fecha", + "txid-table-label": "ID de la transacción", + "none": "Actualmente no hay transacciones pendientes", + "my-transactions-button": "Mías", + "all-transactions-button": "Todas" + }, + + "outputs": { + "title": "Salidas", + "error-no-outputs": "No hay salidas no gastadas" + }, + + "history": { + "title-and-button": "Historial", + "tx-detail-title": "Detalles de la Transacción", + "moving": "Moviendo {{ coinName }} internamente", + "moved": "{{ coinName }} movido internamente", + "sending": "Enviando {{ coinName }}", + "sent": "{{ coinName }} enviado", + "received": "{{ coinName }} recibido", + "receiving": "Recibiendo {{ coinName }}", + "pending-indication": "Pendiente", + "transaction-note-small-label": "Nota:", + "no-txs": "Usted no tiene historial de transacciones", + "no-txs-filter": "No hay transacciones que coincidan con los criterios de filtro actuales", + "no-filter": "Sin filtros activos (presione para seleccionar billeteras/direcciones)", + "filter": "Filtro activo: ", + "filters": "Filtros activos: ", + "all-addresses": "Todas las direcciones", + "view-all": "Ver todas las {{ number }} transacciones" + }, + + "teller": { + "done": "Completado", + "waiting-confirm": "Esperando confirmación", + "waiting-deposit": "Esperando depósito de Bitcoins", + "waiting-send": "Esperando para envíar Skycoins", + "unknown": "Desconocido" + }, + + "confirmation" : { + "default-title": "Confirmación", + "yes-button": "Sí", + "no-button": "No" + }, + + "service": { + "api" : { + "no-internet-error": "No cuenta con conexión a Internet o el nodo ha dejado de funcionar.", + "incorrect-password-error": "Contraseña incorrecta.", + "unknown-error": "No fue posible realizar la operación.", + "api-disabled-error": "API deshabilitada." + } + }, + + "force-skywallet-wipe": { + "title": "Borrado Forzado de Skywallet", + "operation-warning": "Esta opción está diseñada sólo como último recurso para los casos en los que el dispositivo no se puede utilizar con las opciones normales. Se borrarán todos los datos del dispositivo, por lo que necesitará la semilla para recuperar los fondos.", + "proceed-button": "Proceder" + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "Nueva Skywallet", + "confirm": "Por favor, confirme la operación en la Skywallet.", + "confirm-and-more": "Por favor confirme la operación en la Skywallet y siga las instrucciones.", + "follow": "Por favor siga las instrucciones mostradas en la Skywallet.", + "completed": "La operación se realizó con éxito.", + "name-updated": "El nombre utilizado para identificar esta Skywallet en la lista de billeteras se ha actualizado para que coincida con el que se muestra en el dispositivo." + }, + "errors": { + "generic-error": "No se puede realizar la operación. Asegúrese de haber conectado una Skywallet válida y de que no esté esperando por alguna confirmación o respuesta.", + "disconnected": "No se puede realizar la operación. La Skywallet no está conectada.", + "incorrect-wallet": "No se puede realizar la operación. La Skywallet conectada es diferente a la esperada.", + "incorrect-pin": "No se puede realizar la operación. El PIN que ha introducido no es correcto.", + "refused": "La operación fue cancelada.", + "too-many-inputs-outputs": "La transacción tiene demasiadas entradas o salidas para la Skywallet. Por favor vuelva a intentarlo creando varias transacciones más pequeñas, cada una con un número menor de destinatarios (si la transacción actual tiene muchos) o monedas.", + "daemon-connection": "Problema para conectarse al Skywallet Daemon, por favor asegúrese de que se esté ejecutando e inténtelo nuevamente. Usted puede descargarlo desde www.skycoin.com/downloads", + "daemon-connection-with-configurable-link": "Problema para conectarse al Skywallet Daemon, por favor asegúrese de que se esté ejecutando e inténtelo nuevamente. Usted puede descargarlo desde ", + "timeout": "La operación se canceló por inactividad. Por favor inténtelo de nuevo.", + "timeout-with-configurable-link": "La operación se canceló por inactividad. Por favor inténtelo de nuevo. Si este problema impide que el dispositivo sea utilizable, puede utilizar la siguiente opción:", + "invalid-address-generated": "Hubo un problema con el generador de direcciones y la operación tuvo que ser cancelada.", + "invalid-address": "Dirección inválida.", + "not-in-bootloader-mode": "Para usar esta opción la Skywallet debe estar en modo bootloader." + }, + "security-warning" : { + "title": "Advertencia de Seguridad", + "text": "La última vez que se conectó esta Skywallet, se encontraron una o más advertencias de seguridad. Le recomendamos que abra las opciones de Skywallet (presionando el enlace de más abajo) mientras el dispositivo está conectado y resuelva los problemas de seguridad antes de continuar.", + "link": "Abrir la ventana de opciones de Skywallet." + }, + "options" : { + "connecting": "Conectando...", + "disconnected": "Skywallet no detectada. Por favor, conecte una Skywallet para usar esta opción.", + "unconfigured-detected-title": "Skywallet No Configurada", + "unconfigured-detected": "Se ha detectado una Skywallet sin semilla. Seleccione \"Configurar Automáticamente\" si desea configurarla como una billetera nueva y comenzar a usarla. Seleccione \"Restaurar Copia de Seguridad\" si desea configurar la Skywallet con la copia de seguridad de una semilla creada anteriormente.", + "configured-detected": "Skywallet detectada. El dispositivo se identifica en la lista de billeteras como:", + "security-warnings-title": "Advertencias de Seguridad", + "security-warning-title": "Advertencia de Seguridad", + "unchecked-version-warning": "No fue posible verificar si el firmware de su Skywallet está actualizado. Esto podría deberse a problemas con su conexión a Internet o a que el servicio esté en mantenimiento.", + "outdated-version-warning": "El firmware de su Skywallet está desactualizado. Le recomendamos que lo actualice lo antes posible para garantizar la seguridad. Para hacer esto, seleccione la opción \"Actualizar Firmware\".", + "backup-warning": "Debe hacer una copia de seguridad de la semilla de su Skywallet o podría perder acceso a los fondos en caso de problemas. Para hacer esto, seleccione la opción \"Crear Copia de Seguridad\".", + "pin-warning": "La Skywallet conectada no tiene un PIN. El código PIN protege la Skywallet de accesos no autorizados. Para crear un código PIN, seleccione la opción \"Crear Código PIN\".", + "options": "Opciones:", + "update-firmware": "Actualizar Firmware", + "configure-automatically": "Configurar Automáticamente", + "restore-backup": "Restaurar Copia de Seguridad", + "create-backup": "Crear Copia de Seguridad", + "wipe": "Borrar el Dispositivo", + "confirm-seed": "Confirmar la Semilla", + "create-pin": "Crear Código PIN", + "change-pin": "Cambiar el Código PIN", + "delete-pin": "Borrar el Código PIN", + "forgotten-pin-part1": "Si no puede acceder a la billetera porque ha olvidado el PIN, puede borrar la Skywallet y luego restaurarla con la semilla haciendo clic", + "forgotten-pin-part2": "aquí.", + "firmware-version": "Versión del firmware del dispositivo:" + }, + "update-firmware-warning" : { + "title": "Firmware Desactualizado", + "text": "ADVERTENCIA: el firmware de su Skywallet está desactualizado. Para mantenerse seguro se le recomienda actualizarlo.", + "update": "Actualizar" + }, + "update-firmware" : { + "title-connecting": "Conectando...", + "title-update": "Actualizar Firmware", + "title-install": "Instalar Firmware", + "text-downloading": "Comprobando el dispositivo y descargando archivos...", + "text-bootloader": "ADVERTENCIA: si ya ha configurado este dispositivo, antes de continuar debe tener una copia de seguridad de su semilla o podría perder permanentemente el acceso a los fondos.", + "text-not-bootloader": "Para actualizar el firmware de su Skywallet debe conectarla en modo bootloader (conéctela al computador mientras presiona los dos botones físicos del dispositivo). ADVERTENCIA: si ya ha configurado este dispositivo, antes de continuar debe tener una copia de seguridad de su semilla o podría perder permanentemente el acceso a los fondos.", + "text-no-firmware": "Le damos la bienvenida. La Skywallet conectada actualmente no tiene un firmware instalado. Ahora se instalará un firmware para que pueda comenzar a usar el dispositivo. NOTA: si ya ha configurado este dispositivo y desea recuperar los fondos, necesitará la semilla.", + "follow": "La actualización del firmware se envió a la Skywallet. Por favor continúe el proceso en el dispositivo.", + "connection-error": "No fue posible descargar el firmware. Esto podría deberse a problemas con su conexión a Internet o a que el servicio esté en mantenimiento.", + "timeout": "La operación se canceló por inactividad. Por favor desconecte el dispositivo, vuelva a conectarlo e intente nuevamente.", + "finished": "Su dispositivo ha sido configurado correctamente. Por favor desconéctelo antes de continuar." + }, + "generate-seed" : { + "text": "Antes de continuar puede seleccionar el número de palabras que desea que tenga la semilla. La semilla es una lista de palabras que se pueden usar para recuperar el acceso a las monedas en caso de problemas. Ambos valores son seguros, por lo que si no tiene una razón especial para seleccionar uno u otro, puede dejar el valor predeterminado.", + "configuring": "Configurando..." + }, + "restore-seed" : { + "text": "Antes de continuar, por favor seleccione la cantidad de palabras de la semilla que desea recuperar.", + "check-text": "Puede usar esta opción para ingresar una semilla y verificar si es igual a la de la Skywallet. Antes de comenzar, seleccione el número de palabras de la semilla que desea verificar.", + "warning" : "ADVERTENCIA: para evitar posibles problemas, use solo semillas creadas con una Skywallet.", + "error-wrong-word": "Error: la palabra introducida no coincide con la solicitada por la Skywallet.", + "error-invalid-seed": "Error: la semilla no es válida. Por favor asegúrese de ingresar las palabras correctas en el orden correcto.", + "error-wrong-seed": "Error: la semilla es válida pero no coincide con la del dispositivo.", + "correct-seed": "La semilla es válida y coincide con la del dispositivo." + }, + "added" : { + "title": "Nueva Skywallet", + "configuring": "Nueva Skywallet detectada. Configurando...", + "done": "Hecho", + "added1": "La Skywallet conectada se ha agregado a la lista de billeteras con el siguiente nombre:", + "added2": "Ahora puede consultar el saldo y las direcciones de la Skywallet incluso cuando no está conectada.", + "added-error-info": "Debe ingresar un nombre.", + "characters-warning": "Si utiliza caracteres no comunes en el idioma inglés, es posible que el nombre no se muestre correctamente en el dispositivo." + }, + "wipe" : { + "warning": "ADVERTENCIA: Todos los datos en la Skywallet serán eliminados. Si no tiene una copia de seguridad, no podrá volver a acceder a sus fondos.", + "confirm-delete-check": "Quitar también de la lista de billeteras" + }, + "create-backup" : { + "warning": "ADVERTENCIA: Solo puede usar esta opción para hacer una copia de seguridad de la semilla de su Skywallet una vez. Si decide continuar, tendrá que escribir un grupo de palabras (en papel, nunca en una computadora) que aparecerán en la pantalla de la Skywallet y almacenar la lista en un lugar seguro. Cualquier persona con acceso a la lista de palabras (la \"semilla\") podrá acceder a los fondos de la billetera, por lo que se recomienda extremar las precauciones.", + "instructions": "Escriba la lista de palabras que aparecen en la pantalla de la Skywallet. Asegúrese de respetar el orden y escribir cada palabra correctamente." + }, + "seed-word" : { + "title": "Ingresar Palabra", + "enter-word": "Introduzca la palabra indicada en el dispositivo", + "info": "Se le pedirá que ingrese las palabras de su semilla de respaldo en orden aleatorio. Adicionalmente, algunas palabras adicionales aleatorias podrían serle solicitadas.", + "word-label": "Palabra solicitada", + "error-invalid-word": "La palabra introducida no es válida.", + "error-loading-words": "Cargando la lista de palabras. Por favor espere." + }, + "change-pin" : { + "pin-mismatch": "No se puede realizar la operación. Los dos PIN que ha introducido no coinciden." + }, + "remove-pin" : { + "warning": "ADVERTENCIA: No se recomienda eliminar el código PIN de su Skywallet, ya que será vulnerable a ser utilizada por terceros no autorizados." + }, + "enter-pin" : { + "title": "Ingresar PIN", + "title-change-current": "Ingrese el PIN Actual", + "title-change-new": "Ingrese el Nuevo PIN", + "title-change-confirm": "Confirme el Nuevo PIN", + "instructions-generic": "El patrón de números del PIN se muestra en la pantalla de la Skywallet.", + "instructions-tx": "Introduzca el PIN para confirmar y firmar la transacción. El patrón de números del PIN se muestra en la pantalla de la Skywallet.", + "instructions-change": "Por favor ingrese un PIN difícil de adivinar de entre 4 y 8 números. El patrón de números del PIN se muestra en la pantalla de la Skywallet.", + "help": "¿Necesita ayuda?" + }, + "pin-help" : { + "title": "Ayuda", + "part1": "Cuando sea necesario ingresar el PIN para continuar, la pantalla de la Skywallet mostrará una matriz de 9 casillas con números en orden aleatorio (el orden cambia cada vez) y se le pedirá que ingrese el PIN en la billetera de software usando una matriz de 9 botones que simplemente muestran el símbolo #.", + "part2": "Para ingresar el PIN, mire la posición de los números del PIN en la matriz de números en la pantalla de la Skywallet y presione los botones correspondientes en la billetera de software. Por ejemplo, si el PIN es \"23\", el número 2 está en la esquina superior izquierda y el número 3 en el centro de la matriz de números de la Skywallet, presione los botones superior izquierdo y central, en ese orden, en la billetera de software.", + "part3": "Si lo desea, también puede usar el teclado numérico para ingresar el PIN. Sin embargo, como en el ejemplo anterior, si el PIN es \"23\", no puede simplemente escribir \"23\" con el teclado numérico, sino que deberá presionar las teclas que están en la posición donde están los números 2 y 3 en la pantalla de la Skywallet." + }, + "create-tx" : { + "title": "Crear Transacción", + "upper-text": "Por favor confirme la operación en la Skywallet después de verificar si los siguientes datos coinciden EXACTAMENTE con la transacción que desea enviar y con los que muestra la Skywallet:", + "lower-text": "Si algún dato no corresponde a lo que muestra la Skywallet o la transacción que desea enviar, cancele la operación en su Skywallet.", + "separator-for-coins-and-hours": "y", + "separator-to-destination": "a" + }, + "confirm-address" : { + "title": "Confirmar Dirección", + "instructions": "Por favor confirme en la Skywallet si la dirección es:", + "short-confirmation": "Dirección confirmada.", + "confirmation": "Dirección confirmada. Por seguridad, puede volver a mostrar la dirección en la Skywallet usando la opción \"Confirmar dirección\", en el menú que puede mostrar presionando el botón a la derecha del balance de la direccion." + } + }, + + "time-from-now": { + "few-seconds": "hace pocos segundos", + "minute": "hace un minuto", + "minutes": "hace {{time}} minutos", + "hour": "hace una hora", + "hours": "hace {{time}} horas", + "day": "hace un día", + "days": "hace {{time}} días" + }, + + "exchange": { + "title-and-button": "Comprar {{ coinName }}", + "label-you-send": "Usted envía", + "label-you-get": "Usted recibe (aprox.)", + "label-to-address": "A la dirección de {{coin}}", + "label-price": "Tasa de cambio", + "label-stimate-transaction-time": "Duración del intercambio", + "exchange-button": "Intercambiar", + "min-amount": "Monto minimo:", + "max-amount": "Monto maximo:", + "agree-part1": "Acepto los", + "agree-part2": "Términos de Uso", + "agree-part3": "y la ", + "agree-part4": "Política de Privacidad", + "powered-by": "Manejado por", + "need-help": "¿Necesita ayuda?", + "support-portal": "Portal de soporte", + "history": "Historial de órdenes", + "order-not-found": "Orden no encontrada", + "label-status": "Estado", + "exchanging": "Intercambiando {{from}} por {{to}}", + "destination-select-from-list-link": "Seleccionar", + "unavailable": "El servicio de intercambio no está disponible en la versión portable.", + "offline": "El servicio está temporalmente offline", + "problem-connecting": "No se puede conectar con el servicio. Por favor compruebe su conexión a Internet y vuelva a intentarlo más tarde.", + "invalid-address-error": "Dirección inválida.", + "from-coin-error-info": "Debe seleccionar una moneda.", + "invalid-value-error-info": "Valor inválido.", + "address-error-info": "Por favor introduzca una dirección válida.", + "statuses": { + "user-waiting": "Esperando el deposito. Por favor envíe {{amount}} {{from}} a la dirección de intercambio indicada más abajo", + "user-waiting-info": "El sistema está a la espera de que usted realice el depósito en la dirección de intercambio. El proceso de intercambio comenzará después de que se detecte el depósito y sea confirmado en la cadena de bloques. Si ya ha realizado el depósito, debería ser detectado en breve.", + "market-waiting-confirmations": "Esperando las confirmaciones de la transacción", + "market-waiting-confirmations-info": "El depósito ya ha sido detectado y el sistema está esperando que sea confirmado en la cadena de bloques.", + "market-confirmed": "Transacción aceptada", + "market-confirmed-info": "La transacción ya ha sido confirmada en la cadena de bloques. Haciendo los preparativos para realizar el intercambio pronto.", + "market-exchanged": "{{from}} intercambiado por {{to}}", + "market-exchanged-info": "El intercambio se ha realizado. Los fondos serán transferidos a su dirección en un momento.", + "market-withdraw-waiting": "Enviando {{to}} a su dirección", + "market-withdraw-waiting-info": "Se ha iniciado el proceso para enviar las monedas a su dirección.", + "complete": "¡Intercambio completado!", + "complete-info": "Los fondos han sido enviados con éxito a su dirección.", + "error": "Se produjo un error", + "error-info": "Hubo un error en la operación, puede encontrar más información más abajo. Si necesita ayuda, por favor guarde todos los datos de operación que se muestran más abajo y comuníquese con soporte técnico utilizando el enlace que se encuentra en la parte inferior derecha de esta página.", + "user-deposit-timeout": "Orden cancelada por inactividad", + "user-deposit-timeout-info": "El sistema ha cancelado la orden porque no se detectó ningún depósito, por favor abra una nueva orden. Si necesita ayuda, por favor guarde todos los datos de operación que se muestran más abajo y comuníquese con soporte técnico utilizando el enlace que se encuentra en la parte inferior derecha de esta página." + }, + "history-window": { + "title": "Historial de Órdenes", + "address": "Dirección:", + "date": "Fecha:" + }, + "details": { + "exchange-addr-label": "Dirección de intercambio (válida solo para esta operación de intercambio)", + "exchange-addr-tag-label": "Payment ID o Destination Tag que debe usarse para la transacción", + "tx-id-label": "ID de la transacción", + "order-id-label": "ID de la orden", + "initial-price-label": "Tasa de cambio inicial", + "error-msg-label": "Mensaje de error", + "details-link": "Detalles", + "start-date-label": "Fecha de inicio", + "back-alert": "La operación aún está en progreso. ¿Realmente desea volver al formulario? Puede ver el progreso de esta operación nuevamente presionando el botón \"Historial de pedidos\"" + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/es_base.json b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/es_base.json new file mode 100644 index 0000000000..c3abdbba1a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/es_base.json @@ -0,0 +1,752 @@ +{ + "common": { + "usd": "USD", + "loading": "Loading...", + "done-title": "Done", + "warning-title": "Warning", + "error-title": "Error", + "changes-made": "The changes have been made.", + "back-button": "Back", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "continue-button": "Continue", + "close-button": "Close", + "generic-confirmation-check": "I understand the risks and want to continue", + "copied": "The text has been copied to the clipboard." + }, + + "errors": { + "window-size": "The window is too narrow for the content." + }, + + "language": { + "title": "Select Language" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "explorer-link": "{{ coinName }} Explorer", + + "warnings": { + "update-part1": "Wallet update", + "update-part2": "Not used. The code adds the versión number of the lastest update here.", + "update-part3": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs-part1": "There are some", + "pending-txs-part2": "pending transactions.", + "pending-txs-part3": "Data you see may not be updated.", + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend-part1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend-part2": "Telegram.", + "no-backend-part3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "password-label": "Password", + "password-error-info": "You must enter a password.", + "confirm-password-label": "Confirm password", + "confirm-error-info": "The two passwords must match.", + "proceed-button": "Proceed", + "reset-link": "I forgot my password", + "incorrect-password-error": "Incorrect password.", + "decrypting-error": "Error decrypting the wallet." + }, + + "buy": { + "title-and-button": "Buy", + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "create-title": "Create Wallet", + "create-desc": "If you don't have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load\" and enter your seed.", + "encrypt-title": "Encrypt Wallet", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "finish-temporal-title": "Ready", + "finish-temporal-desc": "Please click \"Finish\" button to create the wallet. Remember that it will be deleted after closing the wallet software.", + "hardware-wallet-link": "Using a Skywallet?", + "new-button": "New", + "load-button": "Load", + "finish-button": "Finish", + + "confirm": { + "title": "Safeguard Your Seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!", + "checkbox": "It’s safe, I swear." + } + }, + + "wallet": { + "title-and-button": "Wallets", + "show-empty-button": "Show Empty", + "hide-empty-button": "Hide Empty", + "encrypt-button": "Encrypt Wallet", + "decrypt-button": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete-button": "Delete Wallet", + "rename-button": "Rename", + "add-button": "New Wallet", + "load-button": "Load Wallet", + "hardware-wallet-button": "Skywallet", + "encryption-enabled": "Encryption enabled.", + "encryption-disabled": "Encryption disabled.", + "temporal": "Temporal wallet.", + "warning-hw-security": "Possible security risk. Access the Skywallet options (by pressing the \"Skywallet\" button below the wallets list) while the device is connected for more information.", + "wallet-table-label": "Wallet", + "hardware-wallet-table-label": "Skywallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \"Skywallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the Skywallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + "busy-error": "Please wait for the previous operation to be completed.", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "name-label": "Name", + "name-error-info": "You must enter a name.", + "words-number-label": "How many words the seed has", + "seed-label": "Seed", + "seed-error-info": "You must enter a seed.", + "confirm-seed-label": "Confirm seed", + "confirm-seed-error-info": "The two seeds must match.", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-help": "Generate a 12 word seed.", + "generate-24-help": "Generate a 24 word seed.", + "encrypt-check": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "advanced-options-link": "Advanced options", + "close-advanced-error": "It is not possible to close the options because you have made changes to the values.", + "temporal-check": "Load temporarily", + "temporal-info": "If you use this option, the wallet will be loaded temporarily, which means that it will be deleted as soon as you close the wallet software.", + "temporal-warning": "The wallet will be deleted just after closing the wallet software and won't have a password. You will needed the seed to recover access to the funds. Are you sure you want to continue?", + "seed-checking-error": "It was not possible to verify the validity of the seed.", + "unconventional-seed-title": "Possible Error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed", + "synchronizing-warning-text": "The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \"Scan Addresses\" function or add them again manually.", + "wallet-created": "The wallet has been added to the list.", + + "seed": { + "enter-seed": "Press here to enter the seed", + "change-seed": "Press to change", + "confirm-seed": "Press here to confirm the seed", + "confirmed-seed": "Seed confirmed", + "use-custom": "Enter the seed manually", + "use-normal": "Enter the seed using the recommended method", + "custom-seed-warning-text": "This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.", + "custom-seed-warning-text-recovering": "To avoid possible problems, this option should only be used if you want to recover an unconventional seed.", + "incorrect-word-error": "The word you have entered does not match the requested one.", + "invalid-seed-error": "The seed you have entered is not valid. Please try again.", + "enter-word": "Enter the word #{{number}}", + "word-error-info": "You must enter a word.", + "new-seed-info": "You must enter the words of the seed that was generated by the system, to confirm it.", + "recover-seed-info": "Please be sure to enter the correct words in the correct order." + } + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "label-error-info": "You must enter a name.", + "rename-button": "Rename" + }, + + "address-options": { + "title": "Addresses", + "new": "New Addresses", + "scan": "Scan Addresses", + "scan-help": "Use this option to make the system find already used addresses from this wallet which are missing from the list." + }, + + "scan-addresses": { + "done-with-new-addresses": "The list has been updated.", + "done-without-new-addresses": "No new addresses were found." + }, + + "add-addresses": { + "title": "Select Quantity", + "quantity-label": "How many addresses to create", + "quantity-error-info": "You must enter a value between 1 and 100.", + "error": "There was an unexpected error. Please try again." + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "qr": { + "title": "QR Code", + "data-label": "QR data", + "address-label": "Address", + "request-link": "Request specific amount", + "amount-label": "Requested amount", + "hours-label": "Requested hours", + "message-label": "Message", + "invalid": "(invalid value)" + }, + + "send": { + "title-and-button": "Send", + "unsigned-button": "Unsigned", + "signed-button": "Signed", + "unsigned-confirmation": "The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?", + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "personal-note-label": "Personal note", + "personal-note-help": "Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.", + "wallet-label": "Wallet", + "wallet-error-info": "You must select a wallet.", + "invalid-amount": "Please enter a valid amount", + "convert-confirmation": "Do you also want the already introduced amount to be converted from {{from}} to {{to}}?", + "convert-confirmation-plural": "Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?", + "send-all-available-coins-link": "send all", + "precision-error-warning": "A precision error was detected during conversion. Please check the amount that will be sent.", + "invaid-amount-warning": "An invalid value was detected during conversion. Please check the amount that will be sent.", + "precision-errors-warning": "Precision errors were detected during conversion. Please check the amount that will be sent.", + "invaid-amounts-warning": "Invalid values were detected during conversion. Please check the amount that will be sent.", + "multiple-problems-warning": "Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.", + "addresses-label": "Addresses", + "addresses-error-info": "You must enter at least one valid address.", + "no-wallet-selected-error": "There are no coins to send.", + "no-coins-left-error": "There are no coins left to send.", + "addresses-help": "Limit the addresses from where the coins and hours could be sent.", + "addresses-manual-help": "List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.", + "outputs-error": "There was an error trying to get the outputs. Please make sure you have entered valid addresses.", + "all-outputs": "All the outputs of the selected addresses", + "enter-addresses-for-outputs": "Valid addresses must be entered first", + "enter-wallet-for-outputs-and-addresses": "A valid wallet must be selected first", + "invalid-addresses-for-outputs": "No outputs available", + "available-funds-msg-part1": "With your current selection you can send up to", + "available-funds-msg-part2": "and", + "available-funds-msg-part3": "(at least", + "available-funds-msg-part4": "must be used as transaction fee for sending all the coins or hours).", + "change-address-label": "Custom change address", + "change-address-error-info": "The change address is not valid.", + "change-address-select-from-list-link": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets.", + "specific-hours": "Hours to send:", + "remove-specific-hours-info": "Remove.", + "remove-specific-hours-confirmation": "Are you sure you want to remove the specific amount of hours to send?", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins.", + "destinations-help2": "Destination addresses, their coins and hours.", + "destination-tools-title": "Destination Tools", + "hours-allocation-check": "Use automatic {{ coinHoursName }} allocation", + "options-link": "Options", + "coin-hours-options-link": "Hours options", + "hours-share-factor-label": "{{ coinHoursName }} share factor", + "hours-share-factor-help": "This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.", + "close-hours-share-factor-alert": "The option will be resetted to the default value. Are you sure you want to continue?", + "preview-button": "Preview", + "send-button": "Send", + "show-button": "Show", + "simple-form-button": "Simple", + "advanced-form-button": "Advanced", + "select-wallet": "Select wallet", + "saving-note-error": "The transaction was successfully sent, but it was not possible to save the note.", + "sent": "Transaction successfully sent.", + "total-to-send": "Total:", + "invalid-address-error": "The destination address is not valid.", + "one-invalid-address-error": "One of the destination addresses is not valid.", + "various-invalid-addresses-error": "Some destination addresses are not valid.", + "all-addresses-invalid-error": "The destination addresses are not valid.", + "invalid-addresses-error": "Please make sure the address is valid.", + "address-error-info": "Please enter a valid address.", + "invalid-value-error-info": "Invalid value.", + "insufficient-funds-error-info": "The entered value is greater than the available balance.", + "sending-all-hours-with-coins-waning": "By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?", + "advanced-sending-all-hours-with-coins-waning": "By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?", + "sending-all-hours-waning": "You selected to send all the hours. Are you sure you want to continue?", + "high-hours-share-waning": "Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?", + "advanced-high-hours-share-waning": "Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?", + + "fill-with-link": { + "title": "Use a Transaction Link", + "link-info": "Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.", + "link-label": "Transaction link", + "link-error-info": "You must enter a valid transaction link.", + "process-button": "Process", + "invalid-link-error": "The contents of the transaction link are not valid.", + "invalid-link-hours-error": "The transaction link contains an invalid amount of hours.", + "data-overwritten-alert": "Some data you have entered will be overwritten. Are you sure you want to continue?", + "confirmation": "The form has been updated with the data obtained from the transaction link." + }, + + "known-node-errors": { + "null-change-address-error": "The null address can't be used as the custom change address. Please enter a valid address.", + "to-required-error": "You must provide a destination address for sending coins. Please enter a valid address.", + "zero-coins-error": "It's not possible to send zero coins. Please enter a valid amount.", + "null-destination-error": "The null address can't be used as destination. Please enter a valid address.", + "duplicate-destination-error": "There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.", + "hours-in-automatic-mode-error": "Specific hour amounts can't be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.", + "hours-allocation-mode-needed-error": "The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.", + "invalid-hours-allocation-mode-error": "Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.", + "hours-allocation-mode-not-needed-error": "The hour allocation mode can't be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.", + "invalid-hours-mode-error": "Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.", + "share-factor-needed-error": "The hours share factor is needed. Please try with different values and contact support if the problem is not solved.", + "share-factor-not-needed-error": "The hours share factor can't be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.", + "invalid-share-factor-error": "Invalid share factor. Please try with different values and contact support if the problem is not solved.", + "change-equal-to-destination-error": "The transaction can't be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.", + "repeated-wallet": "A wallet for the specified seed already exists." + }, + + "bulk-send": { + "title": "Bulk Send", + "indications": "To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \"xyz\" address, type \"xyz,10,5\"; if you want the hours to be calculated automatically, type \"xyz,10\". Decimal values must be separated with a dot.", + "data-error-info": "You must enter a value.", + "process-button": "Process", + "no-data-error": "There is no text to process.", + "inconsistent-data-error": "If you set how many hours you want to send to a destination, you must do so for all destinations.", + "invalid-data-error": "The entered text has an invalid format." + } + }, + + "select-address": { + "title": "Select Address", + "no-addresses": "There are no confirmed addresses on this wallet." + }, + + "offline-transactions": { + "loading-problem": "Error trying to get the necessary data", + "wallet-error-info": "You must select a wallet.", + "tx-error-info": "You must enter a valid transaction text.", + "copy-tx": { + "signed-title": "Signed Transaction", + "unsigned-title": "Unsigned Transaction", + "text-unsigned": "This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \"Sign Transaction\" option.", + "text-signed": "This is the signed transaction. You can send it to the network using the \"Broadcast Transaction\" option.", + "input-label": "Transaction text", + "copy-button": "Copy", + "reset-confirmation": "Do you want the the form to be cleaned, so you can create another transaction?", + "reset-done": "The form has been cleaned." + }, + + "sign-tx": { + "title": "Sign Transaction", + "text": "Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.", + "wallet-label": "Wallet", + "select-wallet": "Select wallet", + "input-label": "Transaction text", + "sign-button": "Sign", + "signed": "The transaction has been signed." + }, + + "broadcast-tx": { + "title": "Broadcast Transaction", + "text": "Use this form to send a signed transaction to the network.", + "input-label": "Transaction text", + "send-button": "Send", + "sent": "The transaction has been sent." + } + }, + + "reset": { + "title": "Reset Password", + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "seed-error-info": "You must enter a seed.", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "confirm-error-info": "The two passwords must match.", + "reset-button": "Reset", + "done": "Password successfully changed." + }, + + "tx": { + "transaction-title": "Transaction", + "confirm-transaction-title": "Confirm Transaction", + "from-small-label": "From:", + "to-small-label": "To:", + "date-small-label": "Date:", + "status-small-label": "Status:", + "coins-small-label": "Coins:", + "hours-small-label": "Hours:", + "id-small-label": "Tx ID:", + "note-small-label": "Note:", + "without-note": "Without note", + "show-more-link": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs-title": "Inputs", + "outputs-title": "Outputs", + "confirmed-transaction": "Confirmed", + "pending-transaction": "Pending", + "current-rate-help": "Calculated at the current rate." + }, + + "edit-note": { + "title": "Edit Note", + "change-button": "Change" + }, + + "backup": { + "title": "Backup Wallet", + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "wallet-table-label": "Wallet name", + "filename-table-label": "Filename", + "save-addresses-button": "Save Addresses", + "show-seed-button": "Show Seed", + "no-wallets": "There are no wallets", + "unencrypted-info": "For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.", + "hw-wallet-info": "For getting the seed of a Skywallet, please use the \"Skywallet\" option at the bottom of the wallets page.", + "not-compatible-error": "Your web browser is not compatible with this function.", + + "seed-modal-window": { + "title": "Wallet Seed", + "seed-label": "Seed" + } + }, + + "blockchain": { + "title": "Blockchain", + "blocks-label": "Number of blocks", + "time-label": "Timestamp of last block", + "hash-label": "Hash of last block", + "current-supply-label": "Current {{ coinName }} supply", + "total-supply-label": "Total {{ coinName }} supply", + "current-coinhour-supply-label": "Current {{ coinHoursName }} supply", + "total-coinhour-supply-label": "Total {{ coinHoursName }} supply" + }, + + "network": { + "title": "Networking", + "error-no-connections": "No connections", + "peer-small-table-label": "Peer", + "source-small-table-label": "Source", + "block-height-small-table-label": "Block height", + "block-height-short-small-table-label": "Block", + "last-seen-small-table-label": "Last seen", + "last-received-help": "Last received.", + "last-sent-help": "Last sent.", + "in-help": "Incoming.", + "out-help": "Outgoing.", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "title": "Pending Transactions", + "timestamp-table-label": "Timestamp", + "txid-table-label": "Transaction ID", + "none": "No pending transactions", + "my-transactions-button": "Mine", + "all-transactions-button": "All" + }, + + "outputs": { + "title": "Outputs", + "error-no-outputs": "No unspent outputs" + }, + + "history": { + "title-and-button": "History", + "tx-detail-title": "Transaction Detail", + "moving": "Internally moving {{ coinName }}", + "moved": "Internally moved {{ coinName }}", + "sending": "Sending {{ coinName }}", + "sent": "Sent {{ coinName }}", + "received": "Received {{ coinName }}", + "receiving": "Receiving {{ coinName }}", + "pending-indication": "Pending", + "transaction-note-small-label": "Note:", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses", + "view-all": "View all {{ number }} transactions" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "default-title": "Confirmation", + "yes-button": "Yes", + "no-button": "No" + }, + + "service": { + "api" : { + "no-internet-error": "You do not have a internet connection or the node has stopped working.", + "incorrect-password-error": "Incorrect password.", + "unknown-error": "It was not possible to perform the operation.", + "api-disabled-error": "API disabled." + } + }, + + "force-skywallet-wipe": { + "title": "Forced Skywallet Wipe", + "operation-warning": "This option is designed only as a last resort for cases where the device cannot be used with the normal options. All data on the device will be erased, so you will need your seed to recover the funds.", + "proceed-button": "Proceed" + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New Skywallet", + "confirm": "Please confirm the operation on the Skywallet.", + "confirm-and-more": "Please confirm the operation on the Skywallet and follow the instructions displayed.", + "follow": "Please follow the instructions displayed on the Skywallet.", + "completed": "Operation completed successfully.", + "name-updated": "The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device." + }, + "errors": { + "generic-error": "Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.", + "disconnected": "Unable to perform the operation. The Skywallet is not connected.", + "incorrect-wallet": "Unable to perform the operation. The connected Skywallet is different from the expected one.", + "incorrect-pin": "Unable to perform the operation. The PIN you have entered is incorrect.", + "refused": "The operation was canceled.", + "too-many-inputs-outputs": "The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.", + "daemon-connection": "Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads", + "daemon-connection-with-configurable-link": "Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ", + "timeout": "The operation was canceled due to inactivity. Please try again.", + "timeout-with-configurable-link": "The operation was canceled due to inactivity. Please try again. If this issue prevents the device from being usable, you can use the following option:", + "invalid-address-generated": "There was a problem with the address generator and the operation had to be canceled.", + "invalid-address": "Invalid address.", + "not-in-bootloader-mode": "To use this option the Skywallet must be in bootloader mode." + }, + "security-warning" : { + "title": "Security Warning", + "text": "The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.", + "link": "Open the Skywallet options window." + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No Skywallet detected. Please connect a Skywallet to use this option.", + "unconfigured-detected-title": "Unconfigured Skywallet", + "unconfigured-detected": "A seedless Skywallet has been detected. Select \"Configure Automatically\" if you want to configure it as a brand new wallet and start using it. Select \"Restore Backup\" if you want to configure the Skywallet with a previously created seed backup.", + "configured-detected": "Skywallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security Warnings", + "security-warning-title": "Security Warning", + "unchecked-version-warning": "It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.", + "outdated-version-warning": "The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \"Update Firmware\" option.", + "backup-warning": "You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a Backup\" option.", + "pin-warning": "The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \"Create PIN Code\" option.", + "options": "Options:", + "update-firmware": "Update Firmware", + "configure-automatically": "Configure Automatically", + "restore-backup": "Restore Backup", + "create-backup": "Create a Backup", + "wipe": "Wipe the Device", + "confirm-seed": "Confirm Seed", + "create-pin": "Create PIN Code", + "change-pin": "Change PIN Code", + "delete-pin": "Delete PIN Code", + "forgotten-pin-part1": "If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking", + "forgotten-pin-part2": "here.", + "firmware-version": "Device firmware version:" + }, + "update-firmware-warning" : { + "title": "Outdated Firmware", + "text": "WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.", + "update": "Update" + }, + "update-firmware" : { + "title-connecting": "Connecting...", + "title-update": "Update Firmware", + "title-install": "Install Firmware", + "text-downloading": "Checking device and downloading files...", + "text-bootloader": "WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-not-bootloader": "To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-no-firmware": "Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.", + "follow": "The firmware update has been sent to the Skywallet. Please continue the process on the device.", + "connection-error": "It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.", + "timeout": "The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.", + "finished": "Your device has been configured correctly. Please unplug it before continuing." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a Skywallet.", + "error-wrong-word": "Error: the retyped word does not match the one requested by the Skywallet.", + "error-invalid-seed": "Error: the seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: the seed is valid but does not match the one in the device.", + "correct-seed": "The seed is valid and matches the one in the device." + }, + "added" : { + "title": "New Skywallet", + "configuring": "New Skywallet detected. Configuring...", + "done": "Done", + "added1": "The connected Skywallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the Skywallet even when it is not connected.", + "added-error-info": "You must enter a name.", + "characters-warning": "If you use non-standard English characters, the name may not be displayed correctly on the device." + }, + "wipe" : { + "warning": "WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete-check": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet funds, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter Word", + "enter-word": "Enter the word shown on the device", + "info": "You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.", + "word-label": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. The PINs you have entered do not match." + }, + "remove-pin" : { + "warning": "WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties." + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the Current PIN", + "title-change-new": "Enter the New PIN", + "title-change-confirm": "Confirm the New PIN", + "instructions-generic": "The PIN layout is displayed on the Skywallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.", + "instructions-change": "Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol •.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \"7\" and \"5\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet." + }, + "create-tx" : { + "title": "Create Transaction", + "upper-text": "Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:", + "lower-text": "If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.", + "separator-for-coins-and-hours": "and", + "separator-to-destination": "to" + }, + "confirm-address" : { + "title": "Confirm Address", + "instructions": "Please confirm on the Skywallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the Skywallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "title-and-button": "Buy {{ coinName }}", + "label-you-send": "You send", + "label-you-get": "You get (approx.)", + "label-to-address": "To {{coin}} address", + "label-price": "Exchange rate", + "label-stimate-transaction-time": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-part1": "I agree with the", + "agree-part2": "Terms of Use", + "agree-part3": "and the", + "agree-part4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "label-status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "destination-select-from-list-link": "Select", + "unavailable": "The exchange service is not available in the portable version", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later", + "invalid-address-error": "Invalid address.", + "from-coin-error-info": "You must select a coin.", + "invalid-value-error-info": "Invalid value.", + "address-error-info": "Please enter a valid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.", + "user-deposit-timeout": "Order canceled due to inactivity", + "user-deposit-timeout-info": "The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "title": "Order History", + "address": "Address:", + "date": "Date:" + }, + "details": { + "exchange-addr-label": "Exchange address (valid for this exchange operation only)", + "exchange-addr-tag-label": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id-label": "Transaction ID", + "order-id-label": "Order ID", + "initial-price-label": "Initial exchange rate", + "error-msg-label": "Error message", + "details-link": "Details", + "start-date-label": "Start date", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/ru.json b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/ru.json new file mode 100644 index 0000000000..69cd50e51f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/ru.json @@ -0,0 +1,250 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "CH", + "loading": "Загрузка...", + "new": "Новый", + "load": "Импортировать" + }, + + "errors": { + "fetch-version": "Не удалось получить последнюю версию с Github", + "incorrect-password": "Неверный пароль", + "api-disabled": "API выключен", + "no-wallet": "Кошелёк не существует", + "no-outputs": "Не достаточно средств" + }, + + "title": { + "wallets": "Кошельки", + "send": "Отправить", + "history": "История", + "buy-coin": "Купить Skycoin", + "network": "Сеть", + "blockchain": "Блокчейн", + "outputs": "Выходы (Outputs)", + "transactions": "Транзакции", + "pending-txs": "Неподтверждённые транзакции", + "backup": "Резервное копирование", + "explorer": "Skycoin эксплорер", + "seed": "Фраза востановления", + "qrcode": "QR-код" + }, + + "header": { + "syncing-blocks": "Идёт синхронизация блоков...", + "update1": "Обновление кошелька", + "update2": "доступно.", + "pending-txs1": "Существует", + "pending-txs2": "транзакции, требующие подтверждения.", + "pending-txs3": "Информация может быть не актуальной. Убедитесь что у вас присутствует соединение с сетью.", + + "errors": { + "no-connections": "Нет активных соединений, ваш клиент не подключен к другим узлам!", + "no-backend1": "Нет доступа к сервису. Перезапустите приложение или обратитсеь за помощью в нашей группе", + "no-backend2": "в телеграмме.", + "no-backend3": "", + "csrf": "Возможные уязвимости безопасности: CSRF не работает." + } + }, + + "password": { + "title": "Введите пароль", + "label": "Пароль", + "confirm-label": "Подтвердите пароль", + "button": "Продолжить" + }, + + "buy": { + "deposit-address": "Выберите кошелёк для генерации депозитного адреса:", + "select-address": "Выберите адрес", + "generate": "Сгенерировать", + "deposit-location": "Адрес назначения", + "deposit-location-desc": "Выберите кошелёк для получения Skycoin, после успешно отправленного депозита.", + "make-choice": "Сделайте выбор", + "wallets-desc": "При выборе адреса, каждый раз генерируется новый адрес для депозита. Один адрес может быть прикреплён к ограниченному количеству адресов.", + "send": "Пошлите выбранную криптовалюту", + "send-desc": "Отправьте выбранную вами криптовалюту на адрес указаный ниже. По получению и после достаточного подтвержения блоков, вы получите Skycoin на указаный адрес по курсу {{ rate }} Skycoin/Selected Coin.", + "fraction-warning": "Рекомендовано посылать целые значения.", + "receive": "Получить Skycoin", + "receive-desc": "После получения выбранной криптавалюты, вы получите Skycoin. Это может занять от нескольких секунд до нескольких дней, в зависимости от выбранного способа оплаты и загруженности сети.", + "status-button": "Статус:", + "check-status-button": "Проверить статус", + "new-order-button": "Новый заказ", + "refresh": "Обновить", + "available-now": "Доступно:", + "choose-preference": "Выберите способ оплаты. Имейте в виду, что некоторые способы могут быть временно отключены.", + "choose": "Выберите вашу любимую крипту ;)", + "send-coin":"Отправить", + "send-coin-text-1": "на адрес ниже. После достаточного количества подтверждений на блокчейне, вы получите Skycoin на выбранный вами кошелёк по курсу" + }, + + "wizard": { + "wallet-desc": "Если у вас нет кошелька Skycoin, используйте сгенерированную фразу для его создания. Если фраза у вас уже есть, нажмите \"Импортирование кошелька\" и введите вашу фразу.", + "encrypt-desc": "Для большей безопасти, рекомендуем добавить пароль для шифрования. Средства можно будет отправлять только при наличии пароля. Убедитесь, что вы его помните.", + "finish-button": "Закончить", + "back-button": "Назад", + + "confirm": { + "title": "Держите свою фразу в сохраном месте!", + "desc": "Убедитесь, что вы записали фразу востановления и держите её в надёжном месте. При утере фразы вы потеряете доступ к вашему кошельку Skycoin!", + "checkbox": "Клянусь. Я записал.", + "button": "Продолжить" + } + }, + + "wallet": { + "new-address": "Новый адрес", + "show-empty": "Показать пустые", + "hide-empty": "Скрыть пустые", + "encrypt": "Зашифровать кошелёк", + "decrypt": "Расшифровать кошелёк", + "edit": "Редактирвоать", + "add": "Новый кошелёк", + "load": "Импортировать", + "encryption-enabled": "Зашифрован", + "encryption-disabled": "Без шифрования", + "wallet": "Кошелёк", + + "new": { + "create-title": "Создать кошелёк", + "load-title": "Импортировать кошелёк", + "encrypt-title": "Шифровать кошелёк", + "name-label": "Имя кошелька", + "seed-label": "Фраза востановления", + "confirm-seed-label": "Подтвердите фразу", + "seed-warning": "Запомните эта фразу или запишите и держите в надежном месте, в дали от чужих глаз. При потере фразы вы не сможете востановить Skycoin кошелёк!", + "create-button": "Создать", + "load-button": "Импортировать", + "cancel-button": "Отмена", + "12-words": "12 слов", + "24-words": "24 слова", + "generate-12-seed": "Сгенирировать фразу из 12 слов", + "generate-24-seed": "Сгенирировать фразу из 24 слов", + "encrypt": "Включить шифрование", + "encrypt-warning": "Мы рекомендуем шифровать все ваши кашельки при помощи надёжного пароля. Так же убедитесь, что фраза востановления записана и хранится в надёжном месте." + }, + + "rename": { + "title": "Переименование кошелька", + "name-label": "Имя", + "cancel-button": "Отмена", + "rename-button": "Переименовать" + }, + + "address": { + "copy": "Копировать", + "copy-address": "Копировать адрес", + "copied": "Скопировано!", + "outputs": "Непотраченые выходы (Unspent Outputs)" + } + }, + + "send": { + "from-label": "Отправить с", + "to-label": "Получить на", + "amount-label": "Сумма", + "notes-label": "Заметки", + "wallet-label": "Кошелёк", + "addresses-label": "Адрес", + "addresses-help": "Адрес кошелька для отправления", + "change-address-label": "Адрес для получения остатка", + "change-address-help": "Адрес для сдачи. Если вы его не укажите, то он будет выбран автоматически", + "destinations-label": "Адреса получателей", + "destinations-help1": "Адреса получателей и сумма для отправления", + "destinations-help2": "Адреса получателей, сумма Skycoin & CH для отправления", + "hours-allocation-label": "Автоматически подсчитывать часы (CH)", + "options-label": "Дополнительно", + "value-label": "Фактор отправки часов (CH)", + "value-help": "Чем больше фактор, тем больше CH будет отправлено вместе с транзакцией", + "preview-button": "Предпросмотр", + "send-button": "Отправить", + "back-button": "Назад", + "simple": "Обычный", + "advanced": "Продвинутый" + }, + + "tx": { + "transaction": "Транзакция", + "confirm-transaction": "Подтердите транзакцию", + "from": "Отправитель", + "to": "Получатель", + "date": "Дата", + "status": "Статус", + "coins": "Сумма", + "hours": "Часы", + "id": "TX ID", + "show-more": "Инфо", + "hours-sent": "отправляем", + "hours-burned": "сжигаем", + "inputs": "Входы", + "outputs": "Выходы", + "confirmed": "Подтверждена", + "pending": "Ожидание", + "current-rate": "По текущему курсу" + }, + + "backup": { + "wallet-directory": "Папка кошелька:", + "seed-warning": "ДЕРЖИТЕ ФРАЗУ ВОСТАНОВЛЕНИЯ В НАДЁЖНОМ МЕСТЕ. НА БУМАГЕ. ОФФЛАЙН. Если вы держите фразу в надёжном месте, и никто не смог её подглядеть - вашы токены в безопасности.", + "desc": "Из таблицы ниже вы можете получить фразы для ваших зашифрованных кошельков.
Для получения фраз востановления в кошельках без шифрования, откройте папку указаную выше и найдите в ней файлы с разрешением .wlt. Фраза хранится в них. Откройте при помощи любого (надёжного) текстового редактора", + "close-button": "Закрыть", + "wallet": "Название кошелька", + "filename": "Имя файла", + "seed": "Фраза", + "show-seed": "Показать фразу", + "no-wallets": "Кошельков с шифрованием нет" + }, + + "blockchain": { + "blocks": "Количество блоков", + "time": "Время последнего блока", + "hash": "Хэш последнего блока", + "current-supply": "Всего Skycoin в обращении", + "total-supply": "Всего Skycoin существует", + "current-coinhour-supply": "Всего CH в обращении", + "total-coinhour-supply": "Всего CH существует" + }, + + "network": { + "peer": "Пир (Peer)", + "source": "Источник", + "block-height": "Высота блока", + "last-seen": "Последний блок", + "last-received": "Последний полученый", + "last-sent": "Последний отправленый", + "in": "Входящие", + "out": "Исходящие", + + "sources": { + "default": "Пир по-умолчанию", + "exchange": "Обмена пирами" + } + }, + + "pending-txs": { + "timestamp": "Метка времени", + "txid": "ID транзакции", + "none": "Не найдено траназкций ждущих подтверждений", + "my": "Мой", + "all": "Все" + }, + + "history": { + "tx-detail": "Детали о транзакции", + "sending": "Отправляем", + "sent": "Отправлено", + "received": "Получено", + "receiving": "Получаем", + "pending": "Ожидается", + "no-txs": "У вас нет истории транзакций" + }, + + "teller": { + "done": "Завершено", + "waiting-confirm": "Ожидаем подтверждений", + "waiting-deposit": "Ожидаем депозит", + "waiting-send": "Посылаем Skycoin", + "unknown": "Неизвестно" + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/zh.json b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/zh.json new file mode 100644 index 0000000000..791e6ddf2c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/zh.json @@ -0,0 +1,752 @@ +{ + "common": { + "usd": "美元", + "loading": "加载中...", + "done-title": "完成", + "warning-title": "警告", + "error-title": "错误", + "changes-made": "修改已完成", + "back-button": "后退", + "create-button": "创建", + "load-button": "加载", + "cancel-button": "取消", + "continue-button": "继续", + "close-button": "关闭", + "generic-confirmation-check": "我已了解风险,请继续", + "copied": "文本已复制到剪贴板" + }, + + "errors": { + "window-size": "窗口太窄,内容放不下" + }, + + "language": { + "title": "选择语言" + }, + + "header": { + "syncing-blocks": "区块同步中", + "explorer-link": "{{ coinName }} Explorer", + + "warnings": { + "update-part1": "钱包更新", + "update-part2": "未使用", + "update-part3": "可获取", + "synchronizing": "钱包正在同步。你看到的数据可能不是最新的。", + "pending-txs-part1": "这里有一些", + "pending-txs-part2": "待处理交易。", + "pending-txs-part3": "你看到的数据可能不是最新的。", + "no-connections": "没有连接,你的客户端没有连接到任何其他节点", + "no-backend-part1": "不能到达后端。请重新启动应用程序或寻求我们的帮助", + "no-backend-part2": "Telegram", + "no-backend-part3": "", + "csrf": "安全漏洞: CSRF未工作,请立即退出。" + } + }, + + "password": { + "title": "输入密码", + "password-label": "密码", + "password-error-info": "请输入密码", + "confirm-password-label": "确认密码", + "confirm-error-info": "两次密码必须匹配", + "proceed-button": "继续", + "reset-link": "我忘记了密码", + "incorrect-password-error": "密码不正确。", + "decrypting-error": "钱包解密失败。" + }, + + "buy": { + "title-and-button": "购买", + "deposit-address": "选择一个地址来生成BTC充值链接,用于:", + "select-address": "选择地址", + "generate": "生成", + "deposit-location": "充值位置", + "deposit-location-desc": "选择一个钱包,以在我们收到你的比特币后充值Skycoin到该钱包", + "make-choice": "做选择", + "wallets-desc": "每当选择一个新的钱包和地址,一个新的BTC地址将会生成。一个独立的Skycoin地址最多可绑定5个BTC地址。", + "send": "发送Bitcoin", + "send-desc": "发送Bitcoin至如下地址。一旦收到,我们将会按当前汇率: {{ rate }} SKY/BTC充值Skycoin到选中钱包的一个新地址。", + "fraction-warning": "请按SKY/BTC汇率的倍数发送BTC! Skycoin是以整数发送; SKY的小数位将不会发送", + "receive": "接收Sky", + "receive-desc": "收到你的比特币后,我们将发送Skycoin给你。你可能需要20分钟到一个小时才能收到这些SKY。", + "status-button": "状态:", + "check-status-button": "查看状态", + "new-order-button": "新订单" + }, + + "wizard": { + "create-title": "创建钱包", + "create-desc": "如果你没有{{ coinName }}钱包,请使用生成的种子来创建一个新钱包。如果你已经有一个钱包,切换到\"加载钱包\"并输入你的种子。", + "encrypt-title": "加密钱包", + "encrypt-desc": "通过加密来增加钱包的安全性。输入密码后,你的钱包会被加密。只有输入密码才可以访问的钱包或移动资金。", + "finish-temporal-title": "准备就绪", + "finish-temporal-desc": "请点击 \"完成\" 按钮创建临时钱包. 注意, 重启钱包后临时钱包将会被删除。", + "hardware-wallet-link": "使用硬件钱包?", + "new-button": "新建", + "load-button": "加载", + "finish-button": "完成", + + "confirm": { + "title": "保护你的种子!", + "desc": "请确保你已经写下你的种子并将它储存在了一个安全的地方。如果你忘记了种子,你将无法恢复你的Skycoin钱包", + "checkbox": "它很安全,我发誓。" + } + }, + + "wallet": { + "title-and-button": "钱包", + "show-empty-button": "显示空地址", + "hide-empty-button": "隐藏空地址", + "encrypt-button": "加密钱包", + "decrypt-button": "解密钱包", + "decrypt-warning": "警告: 出于安全考虑,建议将钱包加密。建议谨慎一点。", + "delete-button": "删除钱包", + "rename-button": "修改钱包名称", + "add-button": "添加钱包", + "load-button": "加载钱包", + "hardware-wallet-button": "硬件钱包", + "encryption-enabled": "加密已启用", + "encryption-disabled": "加密已禁用", + "temporal": "临时钱包", + "warning-hw-security": "可能的安全风险。当硬件设备已连接时(点击钱包列表下的\"硬件钱包\"按钮)访问硬件钱包选项以获取更多信息", + "wallet-table-label": "钱包", + "hardware-wallet-table-label": "硬件钱包", + "delete-confirmation": "警告: 钱包\"{{ name }}\"将从列表中删除。若想重新添加,需重新连接设备并打开硬件钱包的选项列表(点击钱包列表下的\"硬件钱包\"按钮)。你想继续吗?", + "delete-confirmation-check": "是的,我想要删除钱包。", + "max-hardware-wallets-error": "你的硬件钱包里的地址已经达到允许的最大值。", + "add-many-confirmation": "警告: 如果你在不使用前一个地址的情况下添加太多地址,或者如果你使用的是最后一个地址而不是第一个地址,那么如果你尝试使用种子恢复钱包,有些地址将可能无法自动恢复(你必须手动添加它们)。 你想继续吗?", + "busy-error": "请等待上一操作完成。", + + "new": { + "create-title": "创建钱包", + "load-title": "加载钱包", + "name-label": "名称", + "name-error-info": "请输入钱包名", + "words-number-label": "种子有多少字", + "seed-label": "种子", + "seed-error-info": "请输入种子", + "confirm-seed-label": "确认种子", + "confirm-seed-error-info": "种子不匹配", + "seed-warning": "记住种子! 把它保存在安全的地方。 如果你忘记了你的种子,你将无法找回你的钱包!", + "12-words": "12字", + "24-words": "24字", + "generate-12-help": "生成12字种子", + "generate-24-help": "生成24字种子", + "encrypt-check": "加密钱包", + "encrypt-warning": "我们建议你为每个钱包设置一个独立的密码。如果你忘记密码,你可以通过种子重置钱包。在加密你的钱包之前,确保你的种子保存在安全的地方。", + "advanced-options-link": "高级选项", + "close-advanced-error": "无法关闭选项,因为你已经对值进行了改变。", + "temporal-check": "加载临时钱包", + "temporal-info": "如果您使用此选项,钱包将被临时加载,这意味着一旦关闭钱包软件,它就会被删除。", + "temporal-warning": "关闭钱包软件后,钱包将被删除,不会有密码。 你将需要种子来恢复对资金的访问。 你确定你要继续吗?", + "seed-checking-error": "无法验证种子的效性", + "unconventional-seed-title": "可能错误", + "unconventional-seed-text": "你引进了一种非传统的种子。如果你出于任何特殊原因这样做,你可以继续(只推荐高级用户)。但是,如果你打算使用普通的系统种子,则必须删除所有附加文本和特殊字符。", + "unconventional-seed-check": "继续使用非传统种子。", + "synchronizing-warning-text": "钱包正在同步中,当前操作无法可能无法恢复所有地址。如有未恢复地址,请同步完成后使用\"扫描地址\"功能或手动重新添加", + "wallet-created": "钱包已添加到列表", + + "seed": { + "enter-seed": "点击此处输入种子", + "change-seed": "点击修改", + "confirm-seed": "点击此处确认种子", + "confirmed-seed": "种子已确认", + "use-custom": "手动输入种子", + "use-normal": "使用推荐方式输入种子", + "custom-seed-warning-text": "仅建议高级用户使用。一旦输入种子过程中出现失误,你有可能会永久失去资产", + "custom-seed-warning-text-recovering": "为避免出现问题,该选项请仅用于恢复非传统种子", + "incorrect-word-error": "输入的字不匹配。", + "invalid-seed-error": "输入的种子无效,请重试。", + "enter-word": "输入第#{{number}}个字", + "word-error-info": "请输入字", + "new-seed-info": "请输入系统生成的种子以确认", + "recover-seed-info": "请确认按正确的顺序输入种子" + } + }, + + "rename": { + "title": "重命名钱包", + "name-label": "命名", + "label-error-info": "请输入钱包名", + "rename-button": "重命名" + }, + + "address-options": { + "title": "地址", + "new": "新建地址", + "scan": "扫描地址", + "scan-help": "使用该选项扫描钱包中使用过但未加载出的地址" + }, + + "scan-addresses": { + "done-with-new-addresses": "钱包地址已更新。", + "done-without-new-addresses": "未发现新地址。" + }, + + "add-addresses": { + "title": "选择数量", + "quantity-label": "创建多少地址", + "quantity-error-info": "请输入数值在1到100之间", + "error": "出现异常错误,请重试。" + }, + + "address": { + "show": "点击显示", + "copy": "复制", + "copy-address": "复制地址", + "copied": "已复制!", + "confirm": "确认地址", + "outputs": "未交易输出", + "history": "历史" + } + }, + + "qr": { + "title": "二维码", + "data-label": "QR 数据", + "address-label": "地址", + "request-link": "请求指定金额", + "amount-label": "请求的金额", + "hours-label": "请求的币时", + "message-label": "消息", + "invalid": "(无效值)" + }, + + "send": { + "title-and-button": "发送", + "unsigned-button": "无签名", + "signed-button": "签名", + "unsigned-confirmation": "无签名Transactions选项无发送功能,处于安全考虑,可以使用该选项创建无签名的Transactions,并在安全的非联网设备上完成签名", + "synchronizing-warning":"钱包仍在同步数据,所以显示的余额可能不正确。你确定要继续吗?", + "from-label": "发送自", + "to-label": "发送至", + "amount-label": "总额", + "personal-note-label": "日志", + "personal-note-help": "文本记录用于将来查找相关交易记录。文本内容是本地存储,因此只能在当前设备可见", + "wallet-label": "钱包", + "wallet-error-info": "请选择一个钱包", + "invalid-amount": "请输入一个有效数值", + "convert-confirmation": "是否需要将数额从{{from}}转换为{{to}}?", + "convert-confirmation-plural": "是否需要将数额从{{from}}转换为{{to}}?", + "send-all-available-coins-link": "发送所有", + "precision-error-warning": "转换过程中检测到一个精度问题,请检查发送的数额", + "invaid-amount-warning": "转换过程中检测到一个无效值,请检查发送的数额", + "precision-errors-warning": "转换过程中检测到精度问题,请检查发送的数额", + "invaid-amounts-warning": "转换过程中检测到无效值,请检查发送的数额", + "multiple-problems-warning": "因为无效值或精度问题,有些值转换失败,亲检查发送的数额", + "addresses-label": "地址", + "addresses-error-info": "请至少输入一个有效地址", + "no-wallet-selected-error": "没有币可发送", + "no-coins-left-error": "没有剩余币可发送", + "addresses-help": "限定源发送地址", + "addresses-manual-help": "源发送地址列表,以逗号隔开。所有地址必须属于统一钱包,否则将会签名失败", + "all-addresses": "所有地址(所选钱包的)", + "outputs-label": "未交易输出", + "outputs-help": "限定未交易输出", + "outputs-error": "获取交易输出失败。请确保输入的是有效地址", + "all-outputs": "所有未交易输出(所选地址的)", + "enter-addresses-for-outputs": "请先输入有效的地址", + "enter-wallet-for-outputs-and-addresses": "请选择一个有效的钱包", + "invalid-addresses-for-outputs": "没有有效的未交易输出", + "available-funds-msg-part1": "根据你当前的选择,你最多可以发送", + "available-funds-msg-part2": "和", + "available-funds-msg-part3": "(至少", + "available-funds-msg-part4": "将作为必须的交易手续费)。", + "change-address-label": "自定义找零地址", + "change-address-error-info": "找零地址无效", + "change-address-select-from-list-link": "选择", + "change-address-help": "自定义找零地址。如果不提供,钱包将会自动选择。点击\"选择\" 来选择一个地址", + "specific-hours": "发送币时:", + "remove-specific-hours-info": "删除.", + "remove-specific-hours-confirmation": "你确定删除将发送的指定数额的币时吗?", + "destinations-label": "目标地址", + "destinations-help1": "目标地址和即将发送的币", + "destinations-help2": "目标地址和即将发送的币以及币时", + "destination-tools-title": "目标地址工具", + "hours-allocation-check": "自动分配币时{{ coinHoursName }}", + "options-link": "选项", + "coin-hours-options-link":"币时选项", + "hours-share-factor-label": "币时分发因子", + "hours-share-factor-help": "分发因子值(百分比)越高,越多{{ coinHoursName }}将被发送", + "close-hours-share-factor-alert": "重置选项,你确定需要继续吗", + "preview-button": "预览", + "send-button": "发送", + "show-button": "显示", + "simple-form-button": "简易", + "advanced-form-button": "高级的", + "select-wallet": "选择钱包", + "saving-note-error": "交易已成功发送,但是日志存储失败", + "sent": "交易发送成功", + "total-to-send": "总共:", + "invalid-address-error": "目标地址无效", + "one-invalid-address-error": "有一个目标地址无效", + "various-invalid-addresses-error": "部分目标地址无效", + "all-addresses-invalid-error": "所有目标地址均无效", + "invalid-addresses-error": "请确保地址是有效的", + "address-error-info": "请输入一个有效的地址", + "invalid-value-error-info": "无效值", + "insufficient-funds-error-info": "当前输入值超过可用余额。", + "sending-all-hours-with-coins-waning": "如果发送所有币,当前钱包中所有币时将会发送或销毁。如果你想保留币时,请不要发送所有币。你确定继续吗?", + "advanced-sending-all-hours-with-coins-waning": "如果发送所有币, 当前选择源的所有币时将会被发送或或销毁. 如果你想保留币时,请不要发送所有币。你确定继续吗?", + "sending-all-hours-waning": "你选择发送所有币。你确定继续吗?", + "high-hours-share-waning": "你的选择可能会发送钱包中所有币时。你确定继续吗?", + "advanced-high-hours-share-waning": "你的选择可能会发送选择源中的所有币时。你确定继续吗?", + + "fill-with-link": { + "title": "使用交易链接", + "link-info": "在此输入交易链接。交易数据将从链接中获取并填充到表单。", + "link-label": "交易链接", + "link-error-info": "请输入有效的链接", + "process-button": "执行", + "invalid-link-error": "链接中的内容无效", + "invalid-link-hours-error": "交易链接中包含无效的币时数", + "data-overwritten-alert": "部分之前输入的数据将会被覆写。你确定要继续吗?", + "confirmation": "表单已根据交易链接中的数据更新。" + }, + + "known-node-errors": { + "null-change-address-error": "无法使用空地址作为找零地址。请输入一个有效的地址", + "to-required-error": "你需要提供一个有效的目标地址用于发送币。请输入一个有效的地址", + "zero-coins-error": "无法发送0个币。请输入有效值", + "null-destination-error": "无法使用空地址作为目标地址。请输入一个有效的地址", + "duplicate-destination-error": "目标地址重复。请不要在一个交易中发送相同数值的币到同一目标地址多次", + "hours-in-automatic-mode-error": "自动分发币时模式无法指定具体币时。请重试其他值。如问题无法解决,请联系技术支持", + "hours-allocation-mode-needed-error": "币时分发模式未指定。请设置并重试。如问题无法解决,请联系技术支持", + "invalid-hours-allocation-mode-error": "无效的币时分发模式。请使用不同模式并重试。如问题无法解决,请联系技术支持", + "hours-allocation-mode-not-needed-error": "手动分发币时模式无法指定币时分配模式。请使用其他值并重试。如问题无法解决,请联系技术支持", + "invalid-hours-mode-error": "无效币时分发模式。请使用有效值并重试。如问题无法解决,请联系技术支持", + "share-factor-needed-error": "需要设置币时分发因子。请设置并重试。如问题无法解决,请联系技术支持", + "share-factor-not-needed-error": "已启动手动币时分发模式,币时分发因子无法设置。如问题无法解决,请联系技术支持", + "invalid-share-factor-error": "无效的币时分发因子。请使用正确的值并重试。如问题无法解决,请联系技术支持", + "change-equal-to-destination-error": "交易无法创建,请不要在一个交易中发送相同数值的币到同一目标地址多次", + "repeated-wallet": "指定种子的钱包已存在" + }, + + "bulk-send": { + "title": "批量发送", + "indications": "快捷方式发送到多个地址,在一行中键入每个地址,币数,币时(可选),并用逗号隔开。示例: 如果你发送10个币,5币时到\"xyz\"地址,请键入\"xyz,10,5\"; 如果想自动计算币时,可以键入\"xy,10\"。小数值必须以小数点隔开。", + "data-error-info": "请输入值", + "process-button": "处理", + "no-data-error": "无数据可处理", + "inconsistent-data-error": "如果你想要发送指定币时数,所有地址均需指定币时。", + "invalid-data-error": "键入数据格式误。" + } + }, + + "select-address": { + "title": "选择地址", + "no-addresses": "该钱包中无确认的地址。" + }, + + "offline-transactions": { + "loading-problem": "尝试获取必要数据时失败", + "wallet-error-info": "请选择一个钱包。", + "tx-error-info": "请输入有效的交易文本。", + "copy-tx": { + "signed-title": "已签名的交易", + "unsigned-title": "未签名的交易", + "text-unsigned": "这是使用你输入的数据创建的未签名的交易。请拷贝并选择\"签名交易\"选项对其进行签名", + "text-signed": "这是已签名的交易。你可以通过\"广播交易\"选项将其发送到网络中", + "input-label": "交易本文", + "copy-button": "拷贝", + "reset-confirmation": "你是否要清理表单,以便并创建新的交易?", + "reset-done": "表单已清理。" + }, + + "sign-tx": { + "title": "签名交易", + "text": "使用该表单对交易签名。为了使操作正常进行,您必须选择包含所有用于在交易中发送币的输入/地址的钱包。", + "wallet-label": "钱包", + "select-wallet": "选择钱包", + "input-label": "交易文本", + "sign-button": "签名", + "signed": "交易签名完成" + }, + + "broadcast-tx": { + "title": "广播交易", + "text": "使用该表单发送已签名的交易到网络。", + "input-label": "交易文本", + "send-button": "发送", + "sent": "交易已发送。" + } + }, + + "reset": { + "title": "重置密码", + "wallet-label": "钱包", + "seed-label": "钱包种子", + "seed-error-info": "请输入种子", + "password-label": "新密码 (如果你不希望钱包加密,请将密码留空)", + "confirm-label": "确认新密码", + "confirm-error-info": "两个密码必须匹配。", + "reset-button": "重置", + "done": "密码已成功重置。" + }, + + "tx": { + "transaction-title": "交易", + "confirm-transaction-title": "确认交易", + "from-small-label": "来自", + "to-small-label": "到", + "date-small-label": "日期", + "status-small-label": "状态", + "coins-small-label": "币", + "hours-small-label": "币时", + "id-small-label": "交易ID", + "note-small-label": "日志", + "without-note": "无日志", + "show-more-link": "展示更多", + "hours-moved": "已转移", + "hours-sent": "已发送", + "hours-received": "已接收", + "hours-burned": "已燃烧", + "inputs-title": "输入", + "outputs-title": "输出", + "confirmed-transaction": "已确认", + "pending-transaction": "待处理", + "current-rate-help": "按当前汇率计算" + }, + + "edit-note": { + "title": "编辑日志", + "change-button": "修改" + }, + + "backup": { + "title": "备份钱包", + "wallet-directory": "钱包目录:", + "seed-warning": "在纸上备份你的种子,并保存在一个安全的地方。只要有种子,你就可以找回你的币。", + "desc": "使用下表从加密的钱包中得到种子。
为了从未加密的钱包中获得种子,打开上面的文件夹,在文本编辑器中打开.wlt文件并恢复种子。", + "wallet-table-label": "钱包名", + "filename-table-label": "文件名", + "save-addresses-button": "保存地址", + "show-seed-button": "显示种子", + "no-wallets": "没有钱包", + "unencrypted-info": "出于安全原因,无法显示未加密钱包的种子。要获得种子,请使用密码对钱包进行加密,或按照本页顶部显示的说明进行操作。", + "hw-wallet-info": "要获取硬件钱包的种子,请使用钱包页面底部的\"硬件钱包\"选项。", + "not-compatible-error": "你的网页浏览器与此功能不兼容。", + + "seed-modal-window": { + "title": "钱包种子", + "seed-label": "种子" + } + }, + + "blockchain": { + "title": "区块链", + "blocks-label": "区块数量", + "time-label": "上一个区块的时间戳", + "hash-label": "上一个区块的哈希值", + "current-supply-label": "目前{{ coinName }}供应量", + "total-supply-label": "{{ coinName }}的总供应量", + "current-coinhour-supply-label": "目前{{ coinHoursName }}供应量", + "total-coinhour-supply-label": "{{ coinHoursName }}总供应量" + }, + + "network": { + "title": "网络", + "error-no-connections": "无连接", + "peer-small-table-label": "节点", + "source-small-table-label": "节点来源", + "block-height-small-table-label": "区块高度", + "block-height-short-small-table-label": "区块", + "last-seen-small-table-label": "上一次出现", + "last-received-help": "上一次接收", + "last-sent-help": "上一次发送", + "in-help": "进来的", + "out-help": "出去的", + + "sources": { + "default": "默认节点", + "exchange": "交换节点" + } + }, + + "pending-txs": { + "title": "待处理交易", + "timestamp-table-label": "时间戳", + "txid-table-label": "交易ID", + "none": "无待处理交易", + "my-transactions-button": "我的", + "all-transactions-button": "全部" + }, + + "outputs": { + "title": "交易输出", + "error-no-outputs": "无可用交易输出" + }, + + "history": { + "title-and-button": "历史", + "tx-detail-title": "交易明细", + "moving": "内部转账中", + "moved": "已内部转账", + "sending": "发送中", + "sent": "已发送", + "received": "已接收", + "receiving": "接收中", + "pending-indication": "待处理", + "transaction-note-small-label": "日志:", + "no-txs": "你没有历史交易", + "no-txs-filter": "没有与当前筛选条件匹配的交易", + "no-filter": "未经筛选 (点击选择钱包/地址)", + "filter": "已筛选: ", + "filters": "已筛选: ", + "all-addresses": "所有地址", + "view-all": "查看所有{{ number }}条记录" + }, + + "teller": { + "done": "完成", + "waiting-confirm": "等待确认", + "waiting-deposit": "等待比特币充值", + "waiting-send": "等待发送Skycoin", + "unknown": "未知" + }, + + "confirmation" : { + "default-title": "确认", + "yes-button": "是", + "no-button": "否" + }, + + "service": { + "api" : { + "no-internet-error": "你没有互联网连接或节点已停止工作。", + "incorrect-password-error": "密码错误。", + "unknown-error": "无法执行当前操作。", + "api-disabled-error": "API已禁用。" + } + }, + + "force-skywallet-wipe": { + "title": "强制清除硬件钱包", + "operation-warning": "警告: 此选项仅在无法将设备与常规选项一起使用的情况下用作最后的选择。 设备上的所有数据都将被删除,因此您将需要种子才能恢复资金。", + "proceed-button": "执行" + }, + + "hardware-wallet": { + "general": { + "default-wallet-name": "新硬件钱包", + "confirm": "请在硬件钱包中确认操作。", + "confirm-and-more": "请在硬件钱包中确认操作并按遵循指示。", + "follow": "请按照硬件钱包上显示的说明进行操作。", + "completed": "操作完成。", + "name-updated": "用于在钱包列表中标识此硬件钱包的名称已更新,以匹配设备上显示的名称。" + }, + "errors": { + "generic-error": "无法执行该操作。确保你已经连接了一个有效的硬件钱包,并且它没有在等待输入。", + "disconnected": "无法执行该操作。硬件钱包未连接。", + "incorrect-wallet": "无法执行操作。连接的硬件钱包与预期的不同。", + "incorrect-pin": "无法执行操作。你输入的PIN码不正确。", + "refused": "操作失败或被取消。", + "too-many-inputs-outputs": "交易中硬件钱包的输入或输出过多。请尝试创建多个较小的交易,每个交易保证较小数量的收件人.", + "daemon-connection": "连接到硬件钱包守护程序时出现问题,请确保其正在运行,然后重试。你可以从www.skycoin.com/downloads下载", + "daemon-connection-with-configurable-link": "连接到硬件钱包守护程序时出现问题,请确保其正在运行,然后重试。下载", + "timeout": "由于不活动,操作被取消。 请再试一次。", + "timeout-with-configurable-link": "由于不活动,操作被取消。 请再试一次。 如果此问题导致设备无法使用,则可以使用以下选项:", + "invalid-address-generated": "地址生成器存在问题,必须取消该操作.", + "invalid-address": "无效地址.", + "not-in-bootloader-mode": "使用该选项,硬件钱包必须进入bootloader模式." + }, + "security-warning": { + "title": "安全警告", + "text": "上次连接此硬件钱包时,发现一个或多个安全警告。我们建议你打开硬件钱包选项(点击钱包列表下的\"硬件钱包\"按钮)并保持设备已连接,在继续之前,解决安全问题", + "link": "打开硬件钱包选项窗口." + }, + "options": { + "connecting": "连接...", + "disconnected": "没有检测到硬件钱包。请连接硬件钱包后使用此选项。", + "unconfigured-detected-title": "未配置的硬件钱包", + "unconfigured-detected": "检测到无种子的硬件钱包。选择\"自动配置\"如果你想将其配置为全新的钱包并立即开始使用它,或选择\"恢复备份\"如果你想使用先前创建的备份种子对其进行配置,从而能够再次访问你的资产。", + "configured-detected": "检测到硬件钱包。该设备在钱包列表中被识别为:", + "security-warnings-title": "安全警告", + "security-warning-title": "安全警告", + "unchecked-version-warning": "无法检测硬件钱包固件是否最新版本。可能原因是网络存在问题或者服务处于维护状态.", + "outdated-version-warning": "硬件钱包固件版本过低。为了钱包安全,建议点击\"更新固件\",尽快升级", + "backup-warning": "你应该备份硬件钱包种子,否则万一出现问题,你可能将无法访问你的资金,要做到这一点。选择\"创建一个备份\"选项。", + "pin-warning": "当前连接的硬件钱包未设置密码。密码可保护硬件钱包,以防丢失、盗窃和黑客入侵。要创建一个密码,选择\"创建PIN码\"选项。", + "options": "选项:", + "update-firmware": "更新固件", + "configure-automatically": "自动配置", + "restore-backup": "恢复备份", + "create-backup": "创建备份", + "wipe": "删除设备", + "confirm-seed": "确认种子", + "create-pin": "创建密码", + "change-pin": "更改密码", + "delete-pin": "删除密码", + "forgotten-pin-part1": "如果你因为忘记密码而无法进入钱包,你可以删除硬件钱包,然后通过种子", + "forgotten-pin-part2": "恢复", + "firmware-version": "固件版本:" + }, + "update-firmware-warning": { + "title": "固件版本过低", + "text": "警告: 当前硬件钱包的固件版本过低。为了安全,建议更新.", + "update": "更新" + }, + "update-firmware": { + "title-connecting": "连接中...", + "title-update": "更新固件", + "title-install": "安装固件", + "text-downloading": "检测设备并下载文件...", + "text-bootloader": "警告: 如果你已配置过改设备,继续之前,请务必确保你已将种子备份,否则你的资产可能会永久丢失", + "text-not-bootloader": "更新硬件钱包,请以bootloader模式连接设备(按下设备的两个物理按钮的同事将其连接到计算机)", + "text-no-firmware": "欢迎。当前连接的硬件钱包尚未安装固件。现在将安装固件,以便你开始使用该设备。注意: 如果你已配置过改设备并想要恢复资产,你需要种子.", + "follow": "更新固件已发送至硬件钱包。请在设备上继续.", + "connection-error": "无法下载固件。可能是网络连接问题或者服务处于维护状态.", + "timeout": "由于不活动,操作被取消。请断开设备连接,并在重新连接后重试.", + "finished": "设备配置成功。在继续之前,请拔除设备." + }, + "generate-seed" : { + "text": "在继续之前,你可以选择生成种子的单词数。种子是一个单词列表,出现问题后可以用来恢复访问你的币。所有选项都是安全的,如果你没有特殊原因必须选择某一项,你可以使用默认值。", + "configuring": "配置..." + }, + "restore-seed" : { + "text": "在继续前,请选择你想要恢复种子的单词数量。", + "check-text": "你可以使用此选项输入种子,并检查它是否与硬件钱包中的一致。在开始之前,选择你想要检查的种子的单词数。", + "warning" : "警告: 为了避免可能出现的问题,请仅使用同一品牌/型号的硬件钱包创建种子。", + "error-wrong-word": "错误: 重新键入的单词与硬件钱包所请求的不匹配。", + "error-invalid-seed": "错误: 种子无效。请务必按正确的顺序输入正确的单词。", + "error-wrong-seed": "错误: 种子是有效的,但与设备中的种子不匹配。", + "correct-seed": "种子有效并与设备中的匹配." + }, + "added": { + "title": "新硬件钱包", + "configuring": "检测到新的硬件钱包。配置...", + "done": "已完成", + "added1": "已连接的硬件的钱包已经用如下名字被添加到钱包列表:", + "added2": "现在你可以查看硬件钱包中的余额和地址了,即使硬件钱包并未连接。此外如果你愿意,你还可以更改钱包名称或从将其从钱包列表删除。", + "added-error-info": "你必须填写一个名称.", + "characters-warning": "如果你使用非标准英语字符,它可能无法正确的显示在设备上." + }, + "wipe": { + "warning": "警告: 硬件钱包中的所有数据将被删除。如果没有备份,你将无法再次访问你的资金。", + "confirm-delete-check": "还是将其从钱包列表中删除" + }, + "create-backup": { + "warning": "警告: 你只能使用此选项备份你的硬件钱包种子一次。如果你决定继续,你将不得不写下一组单词(建议写在纸上,而不是电脑上),这些单词将出现在硬件钱包的屏幕上,并将其存储在一个安全的地方。任何可以访问单词列表(\"种子\")的人都可以访问钱包余额,因此建议请格外谨慎。", + "instructions": "写下出现在硬件钱包屏幕上的单词列表。一定要按顺序并把每个单词都写对。" + }, + "seed-word": { + "title": "输入字", + "enter-word": "输入设备中显示的字", + "info": "你将被要求以随机的顺序输入你备份的种子,加上一些额外的字。", + "word-label": "要求的字", + "error-invalid-word": "输入字无效。", + "error-loading-words": "正在加载字列表。请稍等。" + }, + "change-pin" : { + "pin-mismatch":"无法执行操作。你输入的两个密码不匹配" + }, + "remove-pin" : { + "warning": "警告: 不建议从硬件钱包中删除密码,因为它将很容易被未经授权的各方使用。" + }, + "enter-pin" : { + "title": "输入密码", + "title-change-current": "输入当前密码", + "title-change-new": "输入新的密码", + "title-change-confirm": "确认新的密码", + "instructions-generic": " 密码已显示在硬件钱包的屏幕上。", + "instructions-tx": "进入密码以确认并签署交易。", + "instructions-change": "请输入一个4到8个数字之间的难以被猜中的密码。", + "help": "需要帮助?" + }, + "pin-help" : { + "title": "帮助", + "part1": "当需要输入密码才能继续时,硬件钱包屏幕会显示一个矩阵,矩阵由9个随机排列的块组成(每次顺序都会改变),你将被要求在软件钱包中输入密码,使用一个矩阵,此矩阵包含9个按钮,只显示符号#。", + "part2": "要输入密码,请在硬件钱包屏幕上以数字矩阵查看密码的位置,然后点击软件钱包中的相应按钮。例如,如果密码为\"23\"且数字2位于硬件钱包数字矩阵的左上角,数字3位于硬件钱包数字矩阵的正中间,则按顺序点击软件钱包中的左上角和中间按钮。", + "part3": "如果你愿意,还可以使用键盘上的小键盘输入密码。但是,如之前示例所示,如果密码是\"23\",你不能简单地用小键盘键入\"23\",而是必须选择点击硬件钱包屏幕上2和3对应位置的值。" + }, + "create-tx" : { + "title": "创建交易", + "upper-text": "请确认以下数据是否与你要发送的交易以及硬件钱包显示的交易完全匹配,然后在硬件钱包中确认操作:", + "lower-text": "如果任何数据与硬件钱包显示的内容或您希望发送的交易不符,请取消硬件钱包上的操作.", + "separator-for-coins-and-hours": "和", + "separator-to-destination": "至" + }, + "confirm-address" : { + "title": "确认地址", + "instructions": "请在硬件钱包上确认,如果地址为:", + "short-confirmation": "地址已确认", + "confirmation": "地址已确认。为了安全,选择 \"确认地址\" 选项可以在硬件钱包上再次显示地址,在菜单中可点击地址余额右侧的按钮显示。" + } + }, + + "time-from-now": { + "few-seconds": "几秒钟之前", + "minute": "一分钟之前", + "minutes": "{{time}} 分钟之前", + "hour": "一小时之前", + "hours": "{{time}} 小时之前", + "day": "一天之前", + "days": "{{time}} 天之前" + }, + + "exchange": { + "title-and-button": "买 {{ coinName }}", + "label-you-send": "你发送", + "label-you-get": "你收到 (大约)", + "label-to-address": "到 {{coin}} 地址", + "label-price": "交易汇率", + "label-stimate-transaction-time": "交易时间", + "exchange-button": "交易", + "min-amount": "最小数额:", + "max-amount": "最大数额:", + "agree-part1": "我同意", + "agree-part2": "使用条款", + "agree-part3": "和", + "agree-part4": "隐私政策", + "powered-by": "技术支持", + "need-help": "需要帮助?", + "support-portal": "帮助入口", + "history": "订单历史", + "order-not-found": "订单未找到", + "label-status": "状态", + "exchanging": "{{from}}交易{{to}}", + "destination-select-from-list-link": "选择", + "unavailable": "网页版本暂不提供交易服务", + "offline": "交易暂时下线", + "problem-connecting": "未能连接到服务器。请检查你的网络连接并稍后再试。", + "invalid-address-error": "无效地址.", + "from-coin-error-info": "请选择币", + "invalid-value-error-info": "无效的值.", + "address-error-info": "请输入一个有效的地址.", + "statuses": { + "user-waiting": "等待充值。请将{{amount}} {{from}}发送到下面显示的交易地址", + "user-waiting-info": "系统正在等待你充值到交易地址。交易将在系统检测到你的充值并在区块链中确认后开始。如果你已经充值,应该很快就会检测到。", + "market-waiting-confirmations": "等待链上交易确认", + "market-waiting-confirmations-info": "已经检测到充值,等待区块链中被确认。", + "market-confirmed": "链上交易已接受", + "market-confirmed-info": "链上交易已经在区块链上确认。准备马上执行兑换。", + "market-exchanged": "完成{{from}}到{{to}}的兑换", + "market-exchanged-info": "兑换已经完成。资金将很快发送到你的地址。", + "market-withdraw-waiting": "正在发送{{to}}到你的地址", + "market-withdraw-waiting-info": "发送{{to}}到你地址的进程已启动", + "complete": "交易已完成!", + "complete-info": "资金已经成功发送到你的地址.", + "error": "发生错误", + "error-info": "运转过程中出现错误,你可以在下面找到更多信息。如果你需要帮助,请保存下面显示的所有数据并使用页面右下角的帮助链接来联系技术支持.", + "user-deposit-timeout": "由于无活动,订单被取消.", + "user-deposit-timeout-info": "系统未检测到充值,订单已取消,请重新下单。如果需要帮助,请保存下面显示的所有操作数据,并使用本页右下方的链接与技术支持联系." + }, + "history-window": { + "title": "订单历史", + "address": "地址:", + "date": "日期:" + }, + "details": { + "exchange-addr-label": "交易地址", + "exchange-addr-tag-label": "支付ID或交易必须用到的目标标签", + "tx-id-label": "交易ID", + "order-id-label": "订单ID", + "initial-price-label": "初始汇率", + "error-msg-label": "错误信息 ", + "details-link": "详情", + "start-date-label": "开始日期", + "back-alert": "操作正在执行。你真的想要返回到表格吗?你可以通过点击\"订单历史\"再次看到执行过程" + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/zh_base.json b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/zh_base.json new file mode 100644 index 0000000000..c3abdbba1a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/zh_base.json @@ -0,0 +1,752 @@ +{ + "common": { + "usd": "USD", + "loading": "Loading...", + "done-title": "Done", + "warning-title": "Warning", + "error-title": "Error", + "changes-made": "The changes have been made.", + "back-button": "Back", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "continue-button": "Continue", + "close-button": "Close", + "generic-confirmation-check": "I understand the risks and want to continue", + "copied": "The text has been copied to the clipboard." + }, + + "errors": { + "window-size": "The window is too narrow for the content." + }, + + "language": { + "title": "Select Language" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "explorer-link": "{{ coinName }} Explorer", + + "warnings": { + "update-part1": "Wallet update", + "update-part2": "Not used. The code adds the versión number of the lastest update here.", + "update-part3": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs-part1": "There are some", + "pending-txs-part2": "pending transactions.", + "pending-txs-part3": "Data you see may not be updated.", + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend-part1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend-part2": "Telegram.", + "no-backend-part3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "password-label": "Password", + "password-error-info": "You must enter a password.", + "confirm-password-label": "Confirm password", + "confirm-error-info": "The two passwords must match.", + "proceed-button": "Proceed", + "reset-link": "I forgot my password", + "incorrect-password-error": "Incorrect password.", + "decrypting-error": "Error decrypting the wallet." + }, + + "buy": { + "title-and-button": "Buy", + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "create-title": "Create Wallet", + "create-desc": "If you don't have a {{ coinName }} wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load\" and enter your seed.", + "encrypt-title": "Encrypt Wallet", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "finish-temporal-title": "Ready", + "finish-temporal-desc": "Please click \"Finish\" button to create the wallet. Remember that it will be deleted after closing the wallet software.", + "hardware-wallet-link": "Using a Skywallet?", + "new-button": "New", + "load-button": "Load", + "finish-button": "Finish", + + "confirm": { + "title": "Safeguard Your Seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your wallet!", + "checkbox": "It’s safe, I swear." + } + }, + + "wallet": { + "title-and-button": "Wallets", + "show-empty-button": "Show Empty", + "hide-empty-button": "Hide Empty", + "encrypt-button": "Encrypt Wallet", + "decrypt-button": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete-button": "Delete Wallet", + "rename-button": "Rename", + "add-button": "New Wallet", + "load-button": "Load Wallet", + "hardware-wallet-button": "Skywallet", + "encryption-enabled": "Encryption enabled.", + "encryption-disabled": "Encryption disabled.", + "temporal": "Temporal wallet.", + "warning-hw-security": "Possible security risk. Access the Skywallet options (by pressing the \"Skywallet\" button below the wallets list) while the device is connected for more information.", + "wallet-table-label": "Wallet", + "hardware-wallet-table-label": "Skywallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \"Skywallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the Skywallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + "busy-error": "Please wait for the previous operation to be completed.", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "name-label": "Name", + "name-error-info": "You must enter a name.", + "words-number-label": "How many words the seed has", + "seed-label": "Seed", + "seed-error-info": "You must enter a seed.", + "confirm-seed-label": "Confirm seed", + "confirm-seed-error-info": "The two seeds must match.", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-help": "Generate a 12 word seed.", + "generate-24-help": "Generate a 24 word seed.", + "encrypt-check": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "advanced-options-link": "Advanced options", + "close-advanced-error": "It is not possible to close the options because you have made changes to the values.", + "temporal-check": "Load temporarily", + "temporal-info": "If you use this option, the wallet will be loaded temporarily, which means that it will be deleted as soon as you close the wallet software.", + "temporal-warning": "The wallet will be deleted just after closing the wallet software and won't have a password. You will needed the seed to recover access to the funds. Are you sure you want to continue?", + "seed-checking-error": "It was not possible to verify the validity of the seed.", + "unconventional-seed-title": "Possible Error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed", + "synchronizing-warning-text": "The wallet is still synchronizing and the operation could not restore all the addresses. If some addresses are not restored, you will have to wait for the wallet to be fully synchronized and use the \"Scan Addresses\" function or add them again manually.", + "wallet-created": "The wallet has been added to the list.", + + "seed": { + "enter-seed": "Press here to enter the seed", + "change-seed": "Press to change", + "confirm-seed": "Press here to confirm the seed", + "confirmed-seed": "Seed confirmed", + "use-custom": "Enter the seed manually", + "use-normal": "Enter the seed using the recommended method", + "custom-seed-warning-text": "This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.", + "custom-seed-warning-text-recovering": "To avoid possible problems, this option should only be used if you want to recover an unconventional seed.", + "incorrect-word-error": "The word you have entered does not match the requested one.", + "invalid-seed-error": "The seed you have entered is not valid. Please try again.", + "enter-word": "Enter the word #{{number}}", + "word-error-info": "You must enter a word.", + "new-seed-info": "You must enter the words of the seed that was generated by the system, to confirm it.", + "recover-seed-info": "Please be sure to enter the correct words in the correct order." + } + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "label-error-info": "You must enter a name.", + "rename-button": "Rename" + }, + + "address-options": { + "title": "Addresses", + "new": "New Addresses", + "scan": "Scan Addresses", + "scan-help": "Use this option to make the system find already used addresses from this wallet which are missing from the list." + }, + + "scan-addresses": { + "done-with-new-addresses": "The list has been updated.", + "done-without-new-addresses": "No new addresses were found." + }, + + "add-addresses": { + "title": "Select Quantity", + "quantity-label": "How many addresses to create", + "quantity-error-info": "You must enter a value between 1 and 100.", + "error": "There was an unexpected error. Please try again." + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "qr": { + "title": "QR Code", + "data-label": "QR data", + "address-label": "Address", + "request-link": "Request specific amount", + "amount-label": "Requested amount", + "hours-label": "Requested hours", + "message-label": "Message", + "invalid": "(invalid value)" + }, + + "send": { + "title-and-button": "Send", + "unsigned-button": "Unsigned", + "signed-button": "Signed", + "unsigned-confirmation": "The unsigned transactions form does not allow to send transactions normally, but simply creates the text of a transaction, which must be signed before it can be sent to the network. This is useful for creating transactions that will be signed on an always offline device, for security reasons. Are you sure you wish to continue?", + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "personal-note-label": "Personal note", + "personal-note-help": "Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer.", + "wallet-label": "Wallet", + "wallet-error-info": "You must select a wallet.", + "invalid-amount": "Please enter a valid amount", + "convert-confirmation": "Do you also want the already introduced amount to be converted from {{from}} to {{to}}?", + "convert-confirmation-plural": "Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?", + "send-all-available-coins-link": "send all", + "precision-error-warning": "A precision error was detected during conversion. Please check the amount that will be sent.", + "invaid-amount-warning": "An invalid value was detected during conversion. Please check the amount that will be sent.", + "precision-errors-warning": "Precision errors were detected during conversion. Please check the amount that will be sent.", + "invaid-amounts-warning": "Invalid values were detected during conversion. Please check the amount that will be sent.", + "multiple-problems-warning": "Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.", + "addresses-label": "Addresses", + "addresses-error-info": "You must enter at least one valid address.", + "no-wallet-selected-error": "There are no coins to send.", + "no-coins-left-error": "There are no coins left to send.", + "addresses-help": "Limit the addresses from where the coins and hours could be sent.", + "addresses-manual-help": "List of the addresses from which the coins will be sent, comma separated. All addresses must belong to the same wallet or you will not be able to sign the transaction with the desktop wallet.", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown.", + "outputs-error": "There was an error trying to get the outputs. Please make sure you have entered valid addresses.", + "all-outputs": "All the outputs of the selected addresses", + "enter-addresses-for-outputs": "Valid addresses must be entered first", + "enter-wallet-for-outputs-and-addresses": "A valid wallet must be selected first", + "invalid-addresses-for-outputs": "No outputs available", + "available-funds-msg-part1": "With your current selection you can send up to", + "available-funds-msg-part2": "and", + "available-funds-msg-part3": "(at least", + "available-funds-msg-part4": "must be used as transaction fee for sending all the coins or hours).", + "change-address-label": "Custom change address", + "change-address-error-info": "The change address is not valid.", + "change-address-select-from-list-link": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets.", + "specific-hours": "Hours to send:", + "remove-specific-hours-info": "Remove.", + "remove-specific-hours-confirmation": "Are you sure you want to remove the specific amount of hours to send?", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins.", + "destinations-help2": "Destination addresses, their coins and hours.", + "destination-tools-title": "Destination Tools", + "hours-allocation-check": "Use automatic {{ coinHoursName }} allocation", + "options-link": "Options", + "coin-hours-options-link": "Hours options", + "hours-share-factor-label": "{{ coinHoursName }} share factor", + "hours-share-factor-help": "This control allows to select the factor (percentage) of {{ coinHoursName }} that will be send. The higher the value, the more {{ coinHoursName }} will be sent and less will be retained.", + "close-hours-share-factor-alert": "The option will be resetted to the default value. Are you sure you want to continue?", + "preview-button": "Preview", + "send-button": "Send", + "show-button": "Show", + "simple-form-button": "Simple", + "advanced-form-button": "Advanced", + "select-wallet": "Select wallet", + "saving-note-error": "The transaction was successfully sent, but it was not possible to save the note.", + "sent": "Transaction successfully sent.", + "total-to-send": "Total:", + "invalid-address-error": "The destination address is not valid.", + "one-invalid-address-error": "One of the destination addresses is not valid.", + "various-invalid-addresses-error": "Some destination addresses are not valid.", + "all-addresses-invalid-error": "The destination addresses are not valid.", + "invalid-addresses-error": "Please make sure the address is valid.", + "address-error-info": "Please enter a valid address.", + "invalid-value-error-info": "Invalid value.", + "insufficient-funds-error-info": "The entered value is greater than the available balance.", + "sending-all-hours-with-coins-waning": "By sending all the available coins, all the hours in the selected wallet will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?", + "advanced-sending-all-hours-with-coins-waning": "By sending all the available coins, all the hours in the selected source(s) will be sent or burn. If you want to retain hours, you must not send all the coins. Are you sure you want to continue?", + "sending-all-hours-waning": "You selected to send all the hours. Are you sure you want to continue?", + "high-hours-share-waning": "Your selection may result in sending all the hours in the selected wallet. Are you sure you want to continue?", + "advanced-high-hours-share-waning": "Your selection may result in sending all the hours in the selected source(s). Are you sure you want to continue?", + + "fill-with-link": { + "title": "Use a Transaction Link", + "link-info": "Here you can enter a link sent to you requesting coins. The form will be filled in with the data obtained from the link.", + "link-label": "Transaction link", + "link-error-info": "You must enter a valid transaction link.", + "process-button": "Process", + "invalid-link-error": "The contents of the transaction link are not valid.", + "invalid-link-hours-error": "The transaction link contains an invalid amount of hours.", + "data-overwritten-alert": "Some data you have entered will be overwritten. Are you sure you want to continue?", + "confirmation": "The form has been updated with the data obtained from the transaction link." + }, + + "known-node-errors": { + "null-change-address-error": "The null address can't be used as the custom change address. Please enter a valid address.", + "to-required-error": "You must provide a destination address for sending coins. Please enter a valid address.", + "zero-coins-error": "It's not possible to send zero coins. Please enter a valid amount.", + "null-destination-error": "The null address can't be used as destination. Please enter a valid address.", + "duplicate-destination-error": "There are duplicate destinations. Please do not repeat the same address and amount in more than one destination.", + "hours-in-automatic-mode-error": "Specific hour amounts can't be specified while using automatic hour distribution. Please try with different values and contact support if the problem is not solved.", + "hours-allocation-mode-needed-error": "The hour allocation mode is required. Please try with different values and contact support if the problem is not solved.", + "invalid-hours-allocation-mode-error": "Invalid hour allocation mode. Please try with different values and contact support if the problem is not solved.", + "hours-allocation-mode-not-needed-error": "The hour allocation mode can't be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.", + "invalid-hours-mode-error": "Invalid hour distribution method. Please try with different values and contact support if the problem is not solved.", + "share-factor-needed-error": "The hours share factor is needed. Please try with different values and contact support if the problem is not solved.", + "share-factor-not-needed-error": "The hours share factor can't be specified while using manual hour distribution. Please try with different values and contact support if the problem is not solved.", + "invalid-share-factor-error": "Invalid share factor. Please try with different values and contact support if the problem is not solved.", + "change-equal-to-destination-error": "The transaction can't be created because a repeated amount of coins would be returned to the same destination address. Please try again with different values.", + "repeated-wallet": "A wallet for the specified seed already exists." + }, + + "bulk-send": { + "title": "Bulk Send", + "indications": "To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \"xyz\" address, type \"xyz,10,5\"; if you want the hours to be calculated automatically, type \"xyz,10\". Decimal values must be separated with a dot.", + "data-error-info": "You must enter a value.", + "process-button": "Process", + "no-data-error": "There is no text to process.", + "inconsistent-data-error": "If you set how many hours you want to send to a destination, you must do so for all destinations.", + "invalid-data-error": "The entered text has an invalid format." + } + }, + + "select-address": { + "title": "Select Address", + "no-addresses": "There are no confirmed addresses on this wallet." + }, + + "offline-transactions": { + "loading-problem": "Error trying to get the necessary data", + "wallet-error-info": "You must select a wallet.", + "tx-error-info": "You must enter a valid transaction text.", + "copy-tx": { + "signed-title": "Signed Transaction", + "unsigned-title": "Unsigned Transaction", + "text-unsigned": "This is the unsigned transaction that has been created with the data that you have entered. Please copy the text to be able to sign it with the \"Sign Transaction\" option.", + "text-signed": "This is the signed transaction. You can send it to the network using the \"Broadcast Transaction\" option.", + "input-label": "Transaction text", + "copy-button": "Copy", + "reset-confirmation": "Do you want the the form to be cleaned, so you can create another transaction?", + "reset-done": "The form has been cleaned." + }, + + "sign-tx": { + "title": "Sign Transaction", + "text": "Use this form to sign a transaction. For the operation to work correctly, you must select the wallet which includes all the inputs/addresses used to send coins in the transaction.", + "wallet-label": "Wallet", + "select-wallet": "Select wallet", + "input-label": "Transaction text", + "sign-button": "Sign", + "signed": "The transaction has been signed." + }, + + "broadcast-tx": { + "title": "Broadcast Transaction", + "text": "Use this form to send a signed transaction to the network.", + "input-label": "Transaction text", + "send-button": "Send", + "sent": "The transaction has been sent." + } + }, + + "reset": { + "title": "Reset Password", + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "seed-error-info": "You must enter a seed.", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "confirm-error-info": "The two passwords must match.", + "reset-button": "Reset", + "done": "Password successfully changed." + }, + + "tx": { + "transaction-title": "Transaction", + "confirm-transaction-title": "Confirm Transaction", + "from-small-label": "From:", + "to-small-label": "To:", + "date-small-label": "Date:", + "status-small-label": "Status:", + "coins-small-label": "Coins:", + "hours-small-label": "Hours:", + "id-small-label": "Tx ID:", + "note-small-label": "Note:", + "without-note": "Without note", + "show-more-link": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs-title": "Inputs", + "outputs-title": "Outputs", + "confirmed-transaction": "Confirmed", + "pending-transaction": "Pending", + "current-rate-help": "Calculated at the current rate." + }, + + "edit-note": { + "title": "Edit Note", + "change-button": "Change" + }, + + "backup": { + "title": "Backup Wallet", + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "wallet-table-label": "Wallet name", + "filename-table-label": "Filename", + "save-addresses-button": "Save Addresses", + "show-seed-button": "Show Seed", + "no-wallets": "There are no wallets", + "unencrypted-info": "For security reasons, it is not possible to show the seeds of unencrypted wallets. To get the seed, please encrypt the wallet with a password or follow the instruction shown at the top of this page.", + "hw-wallet-info": "For getting the seed of a Skywallet, please use the \"Skywallet\" option at the bottom of the wallets page.", + "not-compatible-error": "Your web browser is not compatible with this function.", + + "seed-modal-window": { + "title": "Wallet Seed", + "seed-label": "Seed" + } + }, + + "blockchain": { + "title": "Blockchain", + "blocks-label": "Number of blocks", + "time-label": "Timestamp of last block", + "hash-label": "Hash of last block", + "current-supply-label": "Current {{ coinName }} supply", + "total-supply-label": "Total {{ coinName }} supply", + "current-coinhour-supply-label": "Current {{ coinHoursName }} supply", + "total-coinhour-supply-label": "Total {{ coinHoursName }} supply" + }, + + "network": { + "title": "Networking", + "error-no-connections": "No connections", + "peer-small-table-label": "Peer", + "source-small-table-label": "Source", + "block-height-small-table-label": "Block height", + "block-height-short-small-table-label": "Block", + "last-seen-small-table-label": "Last seen", + "last-received-help": "Last received.", + "last-sent-help": "Last sent.", + "in-help": "Incoming.", + "out-help": "Outgoing.", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "title": "Pending Transactions", + "timestamp-table-label": "Timestamp", + "txid-table-label": "Transaction ID", + "none": "No pending transactions", + "my-transactions-button": "Mine", + "all-transactions-button": "All" + }, + + "outputs": { + "title": "Outputs", + "error-no-outputs": "No unspent outputs" + }, + + "history": { + "title-and-button": "History", + "tx-detail-title": "Transaction Detail", + "moving": "Internally moving {{ coinName }}", + "moved": "Internally moved {{ coinName }}", + "sending": "Sending {{ coinName }}", + "sent": "Sent {{ coinName }}", + "received": "Received {{ coinName }}", + "receiving": "Receiving {{ coinName }}", + "pending-indication": "Pending", + "transaction-note-small-label": "Note:", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses", + "view-all": "View all {{ number }} transactions" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "default-title": "Confirmation", + "yes-button": "Yes", + "no-button": "No" + }, + + "service": { + "api" : { + "no-internet-error": "You do not have a internet connection or the node has stopped working.", + "incorrect-password-error": "Incorrect password.", + "unknown-error": "It was not possible to perform the operation.", + "api-disabled-error": "API disabled." + } + }, + + "force-skywallet-wipe": { + "title": "Forced Skywallet Wipe", + "operation-warning": "This option is designed only as a last resort for cases where the device cannot be used with the normal options. All data on the device will be erased, so you will need your seed to recover the funds.", + "proceed-button": "Proceed" + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New Skywallet", + "confirm": "Please confirm the operation on the Skywallet.", + "confirm-and-more": "Please confirm the operation on the Skywallet and follow the instructions displayed.", + "follow": "Please follow the instructions displayed on the Skywallet.", + "completed": "Operation completed successfully.", + "name-updated": "The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device." + }, + "errors": { + "generic-error": "Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.", + "disconnected": "Unable to perform the operation. The Skywallet is not connected.", + "incorrect-wallet": "Unable to perform the operation. The connected Skywallet is different from the expected one.", + "incorrect-pin": "Unable to perform the operation. The PIN you have entered is incorrect.", + "refused": "The operation was canceled.", + "too-many-inputs-outputs": "The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.", + "daemon-connection": "Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from www.skycoin.com/downloads", + "daemon-connection-with-configurable-link": "Problem connecting to the Skywallet Daemon, please make sure it is running and try again. You can download it from ", + "timeout": "The operation was canceled due to inactivity. Please try again.", + "timeout-with-configurable-link": "The operation was canceled due to inactivity. Please try again. If this issue prevents the device from being usable, you can use the following option:", + "invalid-address-generated": "There was a problem with the address generator and the operation had to be canceled.", + "invalid-address": "Invalid address.", + "not-in-bootloader-mode": "To use this option the Skywallet must be in bootloader mode." + }, + "security-warning" : { + "title": "Security Warning", + "text": "The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.", + "link": "Open the Skywallet options window." + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No Skywallet detected. Please connect a Skywallet to use this option.", + "unconfigured-detected-title": "Unconfigured Skywallet", + "unconfigured-detected": "A seedless Skywallet has been detected. Select \"Configure Automatically\" if you want to configure it as a brand new wallet and start using it. Select \"Restore Backup\" if you want to configure the Skywallet with a previously created seed backup.", + "configured-detected": "Skywallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security Warnings", + "security-warning-title": "Security Warning", + "unchecked-version-warning": "It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.", + "outdated-version-warning": "The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \"Update Firmware\" option.", + "backup-warning": "You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a Backup\" option.", + "pin-warning": "The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \"Create PIN Code\" option.", + "options": "Options:", + "update-firmware": "Update Firmware", + "configure-automatically": "Configure Automatically", + "restore-backup": "Restore Backup", + "create-backup": "Create a Backup", + "wipe": "Wipe the Device", + "confirm-seed": "Confirm Seed", + "create-pin": "Create PIN Code", + "change-pin": "Change PIN Code", + "delete-pin": "Delete PIN Code", + "forgotten-pin-part1": "If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking", + "forgotten-pin-part2": "here.", + "firmware-version": "Device firmware version:" + }, + "update-firmware-warning" : { + "title": "Outdated Firmware", + "text": "WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.", + "update": "Update" + }, + "update-firmware" : { + "title-connecting": "Connecting...", + "title-update": "Update Firmware", + "title-install": "Install Firmware", + "text-downloading": "Checking device and downloading files...", + "text-bootloader": "WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-not-bootloader": "To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-no-firmware": "Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.", + "follow": "The firmware update has been sent to the Skywallet. Please continue the process on the device.", + "connection-error": "It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.", + "timeout": "The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.", + "finished": "Your device has been configured correctly. Please unplug it before continuing." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a Skywallet.", + "error-wrong-word": "Error: the retyped word does not match the one requested by the Skywallet.", + "error-invalid-seed": "Error: the seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: the seed is valid but does not match the one in the device.", + "correct-seed": "The seed is valid and matches the one in the device." + }, + "added" : { + "title": "New Skywallet", + "configuring": "New Skywallet detected. Configuring...", + "done": "Done", + "added1": "The connected Skywallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the Skywallet even when it is not connected.", + "added-error-info": "You must enter a name.", + "characters-warning": "If you use non-standard English characters, the name may not be displayed correctly on the device." + }, + "wipe" : { + "warning": "WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete-check": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (on paper, never on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet funds, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter Word", + "enter-word": "Enter the word shown on the device", + "info": "You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.", + "word-label": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. The PINs you have entered do not match." + }, + "remove-pin" : { + "warning": "WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties." + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the Current PIN", + "title-change-new": "Enter the New PIN", + "title-change-confirm": "Confirm the New PIN", + "instructions-generic": "The PIN layout is displayed on the Skywallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction. The PIN layout is displayed on the Skywallet screen.", + "instructions-change": "Please enter a secure PIN consisting of 4 to 8 numbers. The PIN layout is displayed on the Skywallet screen.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol •.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \"7\" and \"5\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet." + }, + "create-tx" : { + "title": "Create Transaction", + "upper-text": "Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:", + "lower-text": "If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.", + "separator-for-coins-and-hours": "and", + "separator-to-destination": "to" + }, + "confirm-address" : { + "title": "Confirm Address", + "instructions": "Please confirm on the Skywallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the Skywallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "title-and-button": "Buy {{ coinName }}", + "label-you-send": "You send", + "label-you-get": "You get (approx.)", + "label-to-address": "To {{coin}} address", + "label-price": "Exchange rate", + "label-stimate-transaction-time": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-part1": "I agree with the", + "agree-part2": "Terms of Use", + "agree-part3": "and the", + "agree-part4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "label-status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "destination-select-from-list-link": "Select", + "unavailable": "The exchange service is not available in the portable version", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later", + "invalid-address-error": "Invalid address.", + "from-coin-error-info": "You must select a coin.", + "invalid-value-error-info": "Invalid value.", + "address-error-info": "Please enter a valid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.", + "user-deposit-timeout": "Order canceled due to inactivity", + "user-deposit-timeout-info": "The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "title": "Order History", + "address": "Address:", + "date": "Date:" + }, + "details": { + "exchange-addr-label": "Exchange address (valid for this exchange operation only)", + "exchange-addr-tag-label": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id-label": "Transaction ID", + "order-id-label": "Order ID", + "initial-price-label": "Initial exchange rate", + "error-msg-label": "Error message", + "details-link": "Details", + "start-date-label": "Start date", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/alert-red.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/alert-red.png new file mode 100644 index 0000000000000000000000000000000000000000..17118ad3a46d162e658811b041f7b06b97bbd970 GIT binary patch literal 954 zcmV;r14aCaP)#3fC`m5$uz1JN|BobCWTY;75W&|(-7y*m`MgSv# z5x@vw1TX>^0rJy|a_%8ine8uYesle2mbmbr1<1}egSB8FS79^w3U-0-{#pTlZyUf) z+jpg42WSU-gB$|}fUWd9!9flK-bTBGN0?Y?}=+}YwY3^wO=jrzc3xgs+FR+?^8)rI`9R;oQmx10v5THtJeb>OF zF7AB_?$93!7WiEN33{v4^$}b9I8bK$u2%VrRp9ic029Gj`c2@LYTFJTfETuzzOPov z6yi$(3YqW}^IA@OG1aaIU7`G#+9qZ8XZuwEiR5$W%PgO@wbv{Ex~;7NyraL8M`Yg# zunv^azY5;i+P8u699+Gv?X}txWd$wqn*hb?O#h90e>!^zUS?>kWyYBLyOj7z09pD& z=$~V-v)dZx1C87b>=sq|!f5q(^1J|HF4v7~@If~N(LKs8S#H-{YP^Az}`iY2997C;J~ zgH(F^!GS)dVthiKEh@b#Ku<7>zLdQ7JJ|POQyePmlD_QnRo#dJv?E48bNwEo5 zvTWu#0p#2t0`lVFC4M?(F=mo+Ua#<)08;Fns&e`|7j_pp6uqJ^fp(0S1d!m@o&Fi? zSBcw6Yf<%tB3qpyYYXN4s%-M%sFbv&@Y%+hX?E#|EtMrHoc3T2QJ(9=Q72YF4F{h} zaorlc*ju$Dlv&w6QFieh@Yr(SqE2?^)YIV(#sGQF_XT`(Y4DOXMd-JCDF$40D_!lv z8h#$UJP-rKHd@K2J@J1q@J?o!5pS#jpPPA0%m`ovFaj6>i~vReBY+XW2w(&-0vG}E c(S8Up0E*|H3q@dHIsgCw07*qoM6N<$f)B>7^8f$< literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/big-error-icon.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/big-error-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbda0c2e5c224f689377d46593bc2cd3e7e0eb1 GIT binary patch literal 1557 zcmV+w2I~2VP)(zt(k|&Ot~Z|Nb<1jlS1>S!vP`-}`UKGO5Qce4 zdPRCpK<_6CAc12qTPJOh`eXh$_R<#V34y$+EI@+B|9gdWgLI*!9@b`%q-O+kPzitp zZW_?m5yNbd9zZq;WZz1F1dcCjq?;CjiwX}w{}RMgs{j(bdAhtTv8!h3+WQ2uQ#wF` z_XAyC7d@iqAUsm<62yyA0HVuscYQYMGa$Vt?S!<4?skWJrlF5W=R&%W!-M-odPpFP z14!_Ec-?YFqq|5oIB#ob9U)=I0&>a*67ei@PP&&RfAlgK&7QE03LnHHsWtG;>w2Mmh9&kxs}3x9>{hy-Puz< zMfSY;aR=lAym1TVr8XwMmj*Zuz@HJ6HR;HHo>~5wK&~R`*YrLv{r*Y1!52PkSqYE5 z?St*`9z5o&jUQmMBpbwFDHA}%y;n+j94{`bQi8zN9rPMWUV%kw5By1)OL4sWQn515 zz~(*0tqku)Du5WZ8k#bQ3^_Ly6|(&drJN+I#AGp!ZWNw}AS($M;fG@g^1lm>ewXt{ z9-^v}%F>r)+aJ+Ud6);TDQe0NW-?6G1#Q?xo04P>Y~s5xyzjZoYKl^}tm{sdkdbM5KifJ19MqWF|T`L;*^3dpx6ZU?x`%(8feB910Mlj1>Eh^L{B~ znHO@~j-^-_9+CaX;2|Z<$7b@Ssi;!c{s$0+wv_iZCu!giys#O0V_?4g(a~_!>8L7@!#5e2tsd0OPy3#sjAv1}L??&o}ghdYGsA zuM4a}-&q7udd1Q6jqZJ@t0GouzM|5o0SW*m4_tB>pw#v*1C*w&r?C3ntpxCEo25~> z?PDGAP3?uL+sqri?}K+DZQ^p zD!+|CD8Trl*9XS6RjQFMzIh;49GnS%w1G1ZCf)nEjnc-PR~Ycxd%pLn13mbu zkpA`6S2> z-(WMd?eN&fH%9liu_p=&PngS}tf`A_hmY~>@@^rA zk40+8`uMw?%AqYY{?mE$mU0hZ91?r#BS3SQ7UH*AFO0ow3hg|EcE~7QAA_6&NH3I9 z)CX~o2(vy4KF5N-{xX6bfzD!w`kU06700000NkvXX Hu0mjfqJicm literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..d0404586d3b59d7fc347d2ebce571979adee4daa GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^4nXY0!3HFsFT8LSNO2Z;L>4nJh^c}wqi2xH2cRHh zage(c!@6@aFM%AEbVpxD28NCO+IxoAlA6r8R7@o1kMZ&^HLJ~L&nzyQZJ^`= z1;uItx^K%Se7Sf1kwv7>d4KmyZ=W%FtZg`3vPC#-(Gh;tKKb8YAKpC4u#qKxN(Fb~ zpRd;P^!*MC2?+UdXw(Fso{`TcX(b<8z-`QYc$sQ8ua`{Zlo&m0%L^>#s}*{AD? z^$l@N-=1>BH}(D&+{F^juW~~u$8Msc_lCb-P1*;KT1&2C3GWt~Ar!Ojl!8~mUY*i7 zrbD~_To;=5ZhqF$NxRg$uGqEx)2v?My8SXcv;Q<#NjJu$;*YL*lr87~J#)ppTI04I zVQu?&+|t+kdFn~xdH(xRYY$roKI`bP0l+XkK DE0)`_ literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/close-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/close-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..2f0ec3b6a5aff94d4f5aeb2e9c8e67df124eb001 GIT binary patch literal 584 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9E$svykh8Km+7D9BhG z$B+ufx3ey09dZzGUB6W`D1M2Q_EfLG z|KD$7>kj2{bKH>HG9_g5TD5X>e&gq7U7NpeIDPKTvaPq@?prX!TH`p2gQXh7DMQA9 zKF)?BABHK(ObcX$8J^By(0DGVa_zP0v(GGV%cKt{_Qb7c7u$UE_sgGi{n#g;)Lx{) z#C?k=LdUMaMy}98rtY6X^P|n*e%nqv?QgJ{ZUIO=Hc?o=C6K~!J-Q?2wGWyO+;gWj?Mu1>-aS@T;j z=nBo^(yv&{vVP))l!}F-kMaVTye<^)y6c{^{pR|O6CSpPtvDSxy+vu^VeW&o6t5SZ z$W+=Ruti#g)9CGK37%gE4|6-Ro)EH#|7>~5^VhoHr#aLXWGOzGt-ur$9V>G@y!N{K z7G^>5|8GC@^ItsrZbE&U+^QWPteDqn7R`uF5#7VNW9gynpeAv~&{MaUsa#;avhwZh z2@awMGIE@}7jSw^YPojxud3o{BcP8h?ANV}zP(#zP1v1C2jPGxe7;)S0k2J1u$h%_Sa}zlh9>mD&0xH4_xdxFTSM_y=CEwc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc$WX!DQqR!T z)ZE-iN5ROz&_v(BP~Xs4*U-|+#Kg+LKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$IMft0!ZY(y z^2>`g!FqgstvvIJOA_;vQ$1a5m4K$`WoD*Wxw#oQ8M#=Rn;WkrMZlyTUN%RNfr06W zr;B4q#jQ6pZL>uJMcT@*M{urG+IZoVQ)kD`OMV_&qK+bKL55gJURDCOvR3rXGPEVyq~wT z_`L7U&wDNvN=thXNu z-C0qV|8ru%AC^05OVs{4F}4%c_7X+)!aYh`^mnXs7tnue^XR?BY(|#v-S5=iG)tNMUV80-<_)pn zKbFtz<2ueS=(^=v&O7TZ>yw4SN?da8BK3`G~{I9o|;#E zt`b(KZ|to+I@O!a<BZuVge-&R^uYPXj)@@UGfAEGU zu)bl56h8Jy%&e-Y#{c>hN6~#@J`eB31b$;I5{glMFj4GT#&w?xKI1cA_g=V~!0ooh t^=JK|Nu~*&Qx0QIDp0|7TlO>YFlc-iSc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc$WX!DQqR!T z)ZE-iN5ROz&_v(BP~Xs4*U-|+#Kg+LKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$IMft0!ZY(y z^2>`g!FqgstvvIJOA_;vQ$1a5m4K$`WoD*Wxf!?`89ACcnH#to7#g}-SXdZay1E%z z8d^9znHoE~!SuT1Czs}?=9R$orXch>G&lWj%XPqtMAGio`ou3!*dz!cKJ6@bj?SgR{L z=;SKs%y?Gt+FsFIrABKj17n;780jjcRODN;H+y<%LaPl-P$68r5egHz7)4_c3I{Zox;|5;=&^2U7Xv&?83b|-R6Z!We;oTs^0ZO0qUEgx@sgcouqn=v|_Wvu_dz1=$jpeTx>D2k#e%1gxHl33ayt}sInA7BwY_lDH|jssShnjM6> z90S&NMt5^htzpSkcepll2yz()Z0s#qTonu!cxOIAi0%z=5g#LHLbnFwiMKT84ZhKF zOGlpnBkKK3?I3lXkO|!xP$d3MFMb(8u*ETDsz5q7j!ot;Svdb{7LooC@RM02@bR$0aX*;dvoI)383Y1k^@DP zBkdaCn(bXpu*i<~5RSBGK%G*@xR_w@Ds#SrBkdSaSA0wr6F3I|lT_dS5)5c6KBmkB z7C)fAG_|(NvQ;22GuIKHBwHQ+(UHa5%sQY)32^NGKl+elK(*K=&YOy7I1<(tkqI0L zgJ^>kWUiXm5zoj@0bZ7--#rAPpJpVdL!S6+bBCJ98L+XFvp&9A4%bt{st^A?KPEe; zk$6VVfb7UvJksm7u?ca)6CU{(Ndrci^A(k)DVmtjvUo<$fF53_&J78lny|JB9>g<} zNiZD&2b{8U9TPl>XJiamMvIi>Iy_7*N?c6vD4vlq;OgvV&uelO6FiG&WDLkAz$1R= zURP#92jUqS1F{K_Yc_w(l}DZlyoTsNJR`Fg*w|mlCP5askCwstE5YIsk7->z)7$_a z=|27z{C4|1+MFjQ^cqCba-_B?6wY`N&oti*^-=cJW^`r_ZfcZU84hiHT&R z?e3gD?QB@R0Q4~c{6h%=KMJeMyqZX5< TDLH|r00000NkvXXu0mjfxK(|? literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/edit-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/edit-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..a5cf11e294c5b8bcc7ca298de10ee1b1a5d1f529 GIT binary patch literal 909 zcmV;819JR{P)q}a*iWURs$duREOm@0P!6lyO&aK zz%wUf0E%BI5I49vsXIo1SV}p)29KPC0dc&(QlOS?j>U+$J(II9;EBNvFcE*irwM}^ zP$Pbeb>C2ALhXM9!4&r|Awq0d?Ycpgw+(GASM#N0=XeKnEraVt|SG=X1I- zA%LE#Yx9`lFYCk;)CCGO2sbyy^WfrFoZNsVy+*(b39m5%p080I2`QfYUdk01(pv;H zguTQ-zQgUw2!;KO<5|;n>LMWoaRnCi5&>=6{O>rv#mD&!W|8nmuR~+rnvNDbkASub z@12wvrjdZfO0NsUa0-TWYJh3BH#Gs2deCK8b zc#Qz1U|Fhi5>J#Pp?Wy1u5It(w+V>-o6_0R8v{pl6QDx;nUqVg#G3&a{_~3JeOt{F zmdmvxS|%&kyNV~g8IWaA%+yNV<1dA!lL_^+KzH$k&n6J*JD3kv`Iz0>gs#OC-V6|d zC=5f#<1ofI*MRVl;@^VOBqtx5_XK j!!QiPFbu;m4AaCv4q6|1WvFMd00000NkvXXu0mjf{-uX$ literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/header.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/header.png new file mode 100644 index 0000000000000000000000000000000000000000..d73c27344ce322d412519d63590eea4657214d04 GIT binary patch literal 920348 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

ZAh<`4UBqKKX#{2&)kM&{?Dr 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


c=wDF8K@V3J8V|*;E|zr-&_aOfi#gymnp-L~Jp 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Ɲ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

%Yn@>bLVmm=)1v; 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%0AeO*ddnp$-+| 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

*d2w1)kZrI3As4OcwC5r+ix*&1hk!u(ge^Lv98H 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..854692e1f776aa2423e8807762e76b8bdfcb59fe GIT binary patch literal 1908 zcma)-`#;l*AICo%%VrJf>n@ZXN_vFESB%Xq(=fAK%Vp#eDVIzkTKH08NM8=aI+KLW zHOc*8;pBc4I!tTGj>`~fVn_eMc|RV{_v`U`KOXPL>&I6*-ti(rQdtrJ00h>~nsA^= zKY<=P*xlxSe;f$xmYqiw0O(%&38)P9wBq0hiXvRJ1eimrO9w_g2;+bOfZ8nh4?hS1 zNWiex7-B4Fg*FqRVl4Akft*t^aeqna+)!Z|n3OHo!_)eC(TSK-uYQVzDRV__Ompl^=R#6?>*lv=t0)MnK9=E?iWnCRm1FW zRny2k3+?LfoQ5t7TAUSpUn!da$(t~~w`k&ghbgqdoPK97nWWargMGM}Ugxv)$=c~s z7iWxWzh|?>N^KxjWdH(uPHAJ1`irp^B1>R{7r4csC$^Se2B-2MzSyIQ>PB+WxcMCy zK84xR6Ta>ysAG9Bu6@bT|UoC%uFt9(|!mr=R z;NjZuLn8NZ(%vfs60!{RwPeO>47q!0XcGA&ay?u2xDsftU-T}w!)irwJiv06X!u9V)-Zkvg9&OJbzH&DXckxolF;3$T&d1p&A;r-pF^>m0j3vd|AVIoF z_0<+~YErX9)_{{6}W|Fq7pW;>SS_8lJ${4<*}o z45TR>{8H9t@s7kd!`M5Wfh3C^#KTN?=(gQS5~Or}Jq!H5dKKF>qG+S&Df)A&)JdWW zajKXvIwow#zLs{dj1vPO?fx+@> zac$aGK)umF$IkqSXTlCOGL+W{SBYE-t4Yfqo^}K<)jz&}j}{%$LD}d(j%x47?|1wd zM{?>h)pJo_K16_04AE1X9QN?^o)US?vpHsE+*W1HcLp!IhkhbY)dX%o8MLWQcHpSG zF7)i|h9i1Clae(ofiOhLhwVx+`=sgrOsXb7db~i+%sh;sRva5nJ5l|z5IBRzfEX#7 zz2ae}J`;wFWat>UpxQmtF&b3UlE~sXndj+b(-*gfaN&zZGNmAPJB?ghg&Z~uxh`WC zsIlf8AP!B6griA(k(AutCnf#dk0#PwINFg#V}7=QiyvPhb= zTmRQkh+CWlWKk;m6Rs&hXkueafeCPvj9YEO;IPC|@kOck3BRkLkh)!n<=5U{nRVs< zyN|Rq$byoyL8J6OBw3FKTAkc~77@-xmL-&&NB{}mc*1RPuB@e)v>Q}ySBLkU$3V*~mCYTIgz>*m(0_T*$`gwH4j1Psd zYDW(+aLO-y`Nc#Eq@@v+2zzMF8}#BjMlA|6PH3Wm4SG;gKEEI&*ioKb^kBf?Zn5SY zz;L@oaQJWM>jAU2@+rx`kqo%N<@xRMlstk&j&)ux6;0h}zQvUyzJ^|yecqU+eDMfa zhKS0|k%yj+P|pE)$rLgBibV!QUOB$j;f$ZFRvRe5i2SzYhfY<_Tx zv@3;cqEd4Q4NbH#X`x5DF(p@BxAtN3e^T{Z3-YG3V}8d5W|fXJoy$;bXpp6zjdnfd zsKac}`#Nj~mUxxEYwno)VynATEj3v7Jfe~I-tTmr+6?M>&)pO8gL8+TZhi@^(dc=a z98t;f_Na$2d<=fGk(2Bcm39^o|VBcUmEZhbDz-Wa# z=+WIzBZeJy=av-Rh}$lD8@@5w^yjN()BAaeRt8|-{5Q@~hhsU?qDP+#mPBm@{=&m8r@U%x-3!t?{H}@58QoTDo-SDG_pva4S9Ha|rjjo% zo#jYnTZc^t5(l<5`IAf}zt}fFojH7JBe`(gexY+9_BB5%OXA;j&_RjD?@LsV%sju* Rl~nfg18d`G&9wBT`~y$JZUq1U literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-green.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-green.png new file mode 100644 index 0000000000000000000000000000000000000000..ab020791cd0f5f90a9fe1ed7f10ffc47525c7cd9 GIT binary patch literal 937 zcmV;a16KTrP))k#oggwYK+_4DOwe?KBoic^z!cB{k_qZg&~$<(6C{0Z3o$Q!_G1z96_gZ!xid~QAPHoyDl1tY9 zx36j2*F~jnh%*jb5H0`{-d5425#z-g(RHDYYTn(OZ~@rZenpP2h{sLqySISD1{^s( z-Xb1%XnXe-aJa$5xqhr%t*m|fdd<|rsnIpwL2r0>Z#XodIxyGxt*m`teDC19y=Pzq zHxu%a(Q^VE0;qoE?~e!0eG{>1Y}apEsqx)juz)yhfX2Ep`ZFKX@6-Ql>k_A4D|gM? zUEwBgx77_rDbzyF9p!Ud2!uE~$t`55AzQ*)0%I07N#_p1?FrjEhQ z&mu>VIJLnsN4Nlt+sonZ=en3Ct)A@lupWEYQ?5pLl5`_U{(GB{!AI|NPDYmb6Q=)rr215 zB)&+{evrxbYUhp_z(Z-oy78khq7SGa{0Zl&5&yY>Okb+?B8qB37Srjc7nPS#NHs8An62cCaC+`UMgpTas&?$iv=XwrD$2Q zMab7&@ZITbQWE$F0w4q+2!bF8f*=TjAPB-!L&1T_vTTSyXV~P41sLJ~6tAJXy}-+0 zXXbc+29V!stru_rdY=Fsc$()hR*5=?e*J9YzLr#KM?dZf1rC|5kWuwcg!fdX}j z8ZqrlBYK$tT6GKRJCth90d5cbwhwJcfSI3JHfk9B0ySc~#KGWzp1;r|MHl{mMs+r~ zSNM#nd9RpIk`2tTYCyxv8yw)r*ILhZl=A`QT-3?o)&#Z*pgoVB&LHSCuJ{$I*<{~6 zO!ClpPSALM3U1LPXfB&@1Z*U@Vm9?_NZns*J%J9m0gmsoY@teRSdo@(!DnEAMFX7b z|MBZ+<#F)i?eE;5<1=XCfd+^ga{Oi6vv+sdWvB^cLpZhqixIRICP9@UwQqa}EZwKL zAaxV5l_V)-8NZHV3t%960t$bxiXdlAxuUImH1+;B21q1}jA*3|46Iyq83l(1oCRgm zq|RM&9>ky2;c~gr_TEHK0IL6KrJUPa=m{4mtQic{2}BaF0ZJYF#XNy;&=V+o=9k@} zDhduam<9spe%Z73jr;X?Hn%~Q3B3c#HnySdE^yd@%D_V7=UMxG+3*fEZtuS^f^Ecf zviF<-#{^V5NkNfc&cRZ|W}t&ye0Lhi9yYbz1r8fvz%xb<<-Rnl@++-xph#|13HLmm z3Zb1*P1{k#Yk;-)6@huxEpmd~}%U3?kvM0p#~9 z5!$aTI|XJaM*tgcFOLqoq9=gd9!6-D(02gpdWSgOpET3-pvyJ*N8%!B%8?Ubaf5hT z3r};YJF{=a^9~!`>b~yTO(bsz0+Akz7?26+_46q&zXsSF7lvN4$~~x8ijM)I5NF z|3>R*-|r(IMxY0%qqI-M1V$Ig;JH0-pa%}}akNO926@94ir9kO>!bZR8nXI4UZl{< zEK&+JpT{xz`D1|5<)J>03xXgBf*=TjAP9o+^!N+t3Vf(s*jr@)0000!lvI6;>1s;*b3=DinK$vl=HlH+5aKEREV@QPi+o^Z?91M8ejyF#zIQZMXS6X}? zi}2*7L2HHV?A0UFF6x$sMNbk9eb0Ac>)9*MQ*FP7UD~;S?op2)M!E+XOp{{SuXk*@ zK8G>yjN{{ko(-KpdLE~_?&jM!arHs}BjLq&)?{37H2gGw&6NM&ma6zs#9%Eb7pn@AH&z&01Jk;kIP&)T{<$r^h=jB$QXX)U*{oo^bCy>-7^ikCbia rvHQP%B2cxBjdGNVa+pJpg*n5tbP0l+XkK%N2Kc literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/received-blue.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/received-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..70e025da6e9f2ee636acad534e1d34dbe4240708 GIT binary patch literal 1819 zcmaJ?c~BE)6yG2L1gYBUcyY#770`(K|H7; z6dk2_QEE{cOGQVZS_@)FrIZo0N1TdRzsH2BDX4`5xa7B?-cVPa72a4 zR6?&wC2N+0;k20oF&+jJ0wDrQWIP1JBobi|C=?(lUx4rt5sb*>C@L2Sz|jX{y_rd! zJYE$!>We)op$vvG$@%=;++1F+h)0{#`G`y=;|qj*p%7*@U`w8n!L6{-;^(rUqAY}2 zZ({Vc5p-I_wR8@ngjlApLok>$nm2}xmeEA9DdSsl6CdFT_y&VBt`Thu6Hon5z%5_3z-I#VJ&(!?Z9VB1u>$MYXV2qQhXRPO2q! z1c@RD0*&IyxAOP8Pgw~Yhsi}pE|!TULahviC8!RE5ro2FsgS~85|N5gAtI7WBw~oq zQsg^Z=dD(9iP-*hZr=$E(lh+!ai~hMOJ- zc5)oH#0f_VH+x5WmbHI8raM);@JZ}Y5b7EfxPs`&R@*_NIwPdA;MV|x}k z#`fUeAzA)9D`XF@XS@)JgH=oHD zA-{Ef-F4l-{wLf)jv{W{%YPc(D|P{E`Ezr3 z`^?y)q5ja*_E_#CPKC)H>rbS$bZfKkB^47rOQ;#Z+$q*Ckjf(w_U;=T5B(2G6;F2S z6kYR+R@J=l>&Q>(3+NAV@2q!hohlFg3$}OeoOFX+R$beVb`qyes z-Sz^?`>uR={dr3!2ROf#d!A^?j(OAr14Rwx9fJoh_Uw7?m3DjAac|ooIHM!6)Zgu4 zds0r+9}ADfb?MI(Gz)>Jt?5DA5=yQ#cKNoR@R+xE@sh{Kyo~6Av#OdogBE+a{Bx`o z=-p84vnutL`6akQ>OHgmr?ag<>u0K%xSQKo42NcoUE~SaO|k81tK5DpPp)rI3BK)N z3vKajTjU1u0+TKm-f5_b`pDBS@Ysb+^>v-&S(vS84ab&t3TdhLS5{P$j(W7sdrcG( zXg7UTHhbb^ji2Mo;jI3WrKOWM?D_gqUB^JiBh!FtSyNo}_?p1yhQnKnui<-U6Y8%0 zX2(QF`K|e-mr}Y&$J}d^KAq*jFAQ^nlod6c}{{Y@Sw^slF literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/search-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/search-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..a381073af0e4cb55d6af08c7ad9f3ffb114560aa GIT binary patch literal 1753 zcmaJ?X;2eq7!E|k4OW?=oZBE&uAIb3Bnl*9q9;O zSiEQzL6jCjtJqLQ7!{|~f(KHFB8W!|1;GO1bc2BYDBYRe_x-+kpXWWk=bPOX8~ufy zwX-!2hqL2HaD|u+F};=q>{||P?!?R@lqW{x;S@AWq6TrHa##uie5E866oL|Y_U4;l zFb;?JhD2giEQn&sU?oXniXmy02!_Vtf>&x0i7X970V$XYso2E+D+VF}$=SpNhJYeK zIG_TG(5b8*A zqQrt&fCH;RfI(se$S5=_zziZ$84MD7`rSY6*;DQ>N z8bVMARskkPi4@L2*+i_;_bn)q8CsQQYE0O`$XW?PrjjV8mZk#*g8vUyDrcfKs1W>6 z?|%|&MA-;P7J?c$LoLG&F2&Q73Sn{7pag~0A{b7eo?@&5Mq!NtMgR_Ha%#Ym1V|-^ zvot=F7=eJrS7}g*N(S<|Y$C=&f*?6IQ3j1i59iV892%9%3k~BeWh|p{s9_X3GnB^( zoW^otS%wl+q0?CT2W8DMcVdP#R5fZh+|WA4Nq4U zS-~zEGpi*DtFG?6WZ_h|OJO5)$lJ!Ye8Fody?~}&(PGPCsZT`cz~UUEK>W$vm>hkT ze_q7P6FF5x(JFAlA={>#4rMZ}O42($a@NuWDf_ncUTuylE))5#`L<1ZBT=ef2oQFf zeQX-yD}PQ~@?G7FE*nA!^MUpJ<8wCT7bM?F7(e`k;9@-Mju33~ze=vYPW3aoX>p&{ zpH8vL9Wr`dG9S6pQ72r!3^!<;yUZyAFLE+CsB)7sjy|$UdH(h`5~3wp+^ zj>dJIZz=4;+vf+odJtE&z;$ldNol<|()763&=Q|?T;5dUvM0B?h+ZxnZq8j`jByMz znlF6ZPe3fAuq3>mcr-D0LV4(gU6R$t-6yxT+NXEvqbo&T^`5Q6X{#-?)_2!EbfC;x zv18Qv^&@REO{T!SHlQcc9FD!j7&eH)E$899tOsgWIW%`pnvm_I<^--2YrC ztA}fk+4dFhGx@lJH}CZ4&UBT!$!xW^dk3N7)_>y2F1D3%%fp=qa<2{*1|Ism)ZZqT zSR*@bcKC^J?HloPuWvS0H9D4@k8Cq+8k9%aB_61mAW>pu0fY*&&?p%3K|13GLcjCZpUHxLWgOV-ryZxBW z$Lt>!5^Me-xLaVVX!9G`dg|JcBzi~wy7}YQd)JQWjAfiJ3tGhmy1`9?0pP?1x8_5x z=DNEq=wZdRVbbObvB7fh?}hijU$ejQIt|#R zm^)wW)wXu=_5M5U_&QzQs-3bsuI3xO%eHDSKIG_+w1hE_a_;}y^qB>cgg5w)zZ@bI s%<&|RGJ~igw)5}}xQ~tWjKSO%SG4{|kF*xGm+5E2=S6eRg(c_x3)D!YO8@`> literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-black.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-black.png new file mode 100644 index 0000000000000000000000000000000000000000..f30004ba9f08dc2f8f5d96c45e3309c0ae1d18e3 GIT binary patch literal 2001 zcmaJ?dsGu=79R+5fRa`Us1#+#2o<(Wl9|kqM~M;=u(1Y^heQ!EnVEzblZlhT1QeT< zU8~Dsk!@`k#0U5+)#YWS7O6sAwLTEs7EzEj20#dY=t(?2(Ev4I^UW3UiWwJ z@4n9LN=sSB4R|L2006G~164XZCwN{zU-nyP+BCpUVN8;i$)F63Lr0T78{EOfcT|On+`XV45%lKCaat`)_RTy zng}^B8`B6iHYJ&F`k;s=Gm26&@gg%WC3s7hfbmWltH44sI?!p^Xtm3na^93)8N2oz z3wYp^2xFG>UXapi(m*9elOV>&AY6#RpjgU>F-$B*VnIX*qXHo;fJG22m7%CiCC+Foej7=sGI2;bXL&T?OqX3plr2-)$KoE$Pfb4}$0#3zQW_k?=y^cgB222m(B7%Sn5>yZA#Rd$L z7$kbafD%&ewBO#pEFj^PasK%Z_hd)xXT}pXU$^=`ke~l= zOKe^=_7E>y_+@+^!6ACxpBx)Y+}YS!vbitZ3fIyG%W;X}ULl$wyWG;XugX znul+mzZvCnWiKhouHg92q31`;{V;oC&{S+h?_G|~Q5A^d*PICO+jl?FbljCTsz!n8 zt2>M?`R?+1MTbAxramxttnc&*JW_Vd!*dXTI7r1jJoFzLvd8q zxTEFng`Ee-?>rpm#(uNwN|R5ax+CncSI2&Nh8kb{(z9QUKH2@ayCr_! zTG{ZXe;r+WH)hdc*THk0`Of=5ci!62^uBh5)Jt%yu|GVhJyhH6Q2m)-o{(Bmb~yf24p%np zep?fCY`CXLI$9;~JX#xeW;jK)^n7l_${edjWt-K#_BL&f*&gH!_{)>abC>6BZi<@I zLkDLGMt;>GlDDtETK3?du`S;2u4*jfqD&n1W3I!z8mN3H=pVn=?(Bh194<~&FAA!c9-VEP*#(VvWfpcNuZ3EwaY4aC# zd<=e+eAKJ&sn@oeRb^opZb&LKD%5iY+nmMj$t8`z{LoZ$wW6dc_t_rg31`S>@23;b&t6T|n|@c? ze0}th^!AaWv0bw`sUg5`M||}qJwnW{Dr?@U%B}fjiJMCU+nV>C?0dgUWzV}RJyMu< zI@rslv`1F;)$UNB#sv$vaaXk+s0qIQ=u8fjSKM62K~fjI`-|2?ew_>Ft?8<+NkZ!z z($I5%T{aPzTZl|P%a{}#wLUDx9%T@>OKR2 zdv77pS=n2T>~LWhn_@SV)-C1?Wt6tJf9%5P3hfV?Kcz!()|l(3exvzHO=0-qt@Uwy zCgP{%Jc;}=GkB+}Zbh@)HuCq1k!7UuifppJQC=S6dUZ^eedHYo+&obF{_1P*xjjEw NbyAAzkBRHI{|~aB1mXYy literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-blue.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..4226468c1f7491735505e38409419805b9458fbf GIT binary patch literal 783 zcmV+q1MvKbP)k z*x<@IB|sXkZ|Qg>84bzka0U1Z(5S&T*U%p43fLiOoePhy1(u?yJZ8(me=aSJmo zhW6OxR26msPhz;HmNQI91bPuOm|5l09_|7TuNf*rVh$4-w8wb@G^#2D9vs_4Z>22~ z;xYl6p*`mG=_lOUBbiJQM!@0UyS0a2G)Hca@B%cu_V`Y}O$}GJ7%_6k6QHT(l-gr~ zMB5|2fPHE?_skU0BR8)A&8|JZ!dw;6BlkE04*y>Tm-dL1DaIF|@o$eHkvkm$8s^BI zo`8KAB6r#XG!Y|r9s)EGB6nT__6ZcZFMlIsr=^>Gz;Cfe416N@iTmIXpy+4@z91%U zk^AUACg6eV4f2$xwDY--&xlXg@71xW;h6<1XXhUMCEQ<1O;UT zi9a;>)u{(7jtU6J(C2sR6U?)%2HxNm&$ewa4*_bnC;cj4!MxI|8GfeOUb;R;r!AnC z3o7$Fr!rRq|0NoDlAZwfGVkcSH66_*Z;;XvFqF9(_`-6fcbS_QSHLjaRiENq%KWu| z^xYsJ;|TCCbG3!NAOgGs-1qL6e&Fxy-64rDU{~hq$?e9ncSk966Y&K2MAU$bnlIr6 z1d6C!gb@%SqH=MWfQS*5i}M69L{u)^1u#ccF6;tEil|)J1x)bQ`27fbcSz1%1fxe( zF8l;AMpQ0N2~Yz&+|n{Ha}&n`wz#LhSMS!9gzOfzLZMJ76bc1b{sSfNe%`BgB8mV2 N002ovPDHLkV1jIDQ+NOX literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..59645e7d5ebb20d81c0685d0bbd84f0abc205780 GIT binary patch literal 908 zcmV;719SX|P)3UwZ4IS^#ycqWH0O$cWy8yx?tymgn-GQ zlkl@4Gt=e0)oC)?-BsN)RYf&l(g8vbsWbP~y=STs{eE9Y2X7JmdJn|YNEV+XnOO#= z7I2*q{qud<`t~^Yi=^{JiM}p^#o+fB8SgzUy+KYdLw44b@Fo+PZV;zm5&e7tu6oqn z1}+ZKL|T>aB!MiL-x;p1yt4s$YY9yuS5Y~=g5>Ti^|kaxRN45)I^yr^X_Xs5ZjZ9S z;r(~%4^+jNI1e#kf^ptxni9KB|@C+(#+jVt6YGxGGF`}p2>l9YrS=KWVR;Zg;mZ7#Mafj?*C-A zMq0%xwwAMxkhIqz=T_mH@r90{QdDN^<86qNPAqz#5z}>PYmZTLeCz7qDjsbj>V4AN z8vdfD8=)hxWx2xQbXR+y>!@jrfRn-t=QnQn-~$OM7vVZ;ImNGqy9OZL+8+F-3Eqd#&tN^ zqdee;_g=yk%DUX3C^l-LN@wfH2@S66W>Aobj<+EG>=*^A1HQ#)|IFC%yY5BWN!240 zU1}l=^L|zHv`OQosy(@SaxNVwYQL5cmQc1QRj$g%v?6=z2tp`VkE0&X#!B|&k)o+y z;Y)Fa)UqcZxy-KC7MS5*XlBm}%|(*1#L{87H=)X&WX;I*nR5br>ToNRt4G2_cWbQK zXA?I<>)5lM?mgGfYOD&a6U`Dn+O%v>9g_>4Fq-*de4&=2nJ;P!wH?iTQBA1BXyyy8 zP#@9E7llH7Ml)aJg!1Eocu(`>%W^dHMfGOX0DI~%3JtZn)TJeF6wEe{(aaa(^50nL iQjh28bi1kc)bSV1Ml=rs$aV|>0000;udz#~QIhjmeC;(9fkZU&rFAQB@5cm?K{p=&nbp#i{)}jhF6d=uY1QVcvMfEzV zHO0FC4J_&g*|Ca|<~qCxP+hx8@6;H!s82D|T!)hYE*3Rud|1?2c(cN>Eov-`0(50j zV{uV{K3LRPoC&}a8rq_3i^}JL|FIzRs^Y}iO;H$_R|G$;=^xFa8qT9N#+#zLk>_Kv z>buPi&NiIg6T}GrLHmEHGyXp13=o?P|M)WnLU$ffKnl({4K3ID-tM@Ve1Odl6cA!* z5<+f0h0KaJI13=z?RHcAz@tr8gf5RJcoU!smq!CD+-Z3P5kSIOVOt)&q0vQFm;~^$ zIm$u|hrRsIsqhN zFN60nwB-@}YOoK~c?zB+={uoV?vm#X%49N`OeT{NyaBdwvqx_Cyu$zh002ovPDHLk FV1kUVHttoh>b3aRmg_nxSyLyV7FYEA2rGP6p^0 z#Dt1-OcB(nbBKb9!v&oRN)((DKO!oE!ORa9Q54wJ#e`jfI{z@c z6)8yxjDSx9003a9m#I?eRqlRg_|o47WA1%=38CV&R2r$L9H@-|6ga6PK(!goCQ=C$ zFUaj8qyXTv*_f`Sw3;s@7-?pqZXK4>Y^BivAYJOTqS$(Z0(C^T(IR6GpFYO~jkt`t zny=w#tV+UQTvli!(h8H(vBLG37-ug19F#gGv;i|gp`g=jve+d~8FRv}gx%!YXoES4aMgu?-+9wzP0 zhU+D%s`x2i^hw4vP?S}|W;+}XmV?J4ZP{#CEEcmlTsD^r(HfAwz(S!;$YKxkSWppm z%x1JwM$!VhEuuOykCHKIrjsF<^I98}o zDU@O{qErbyShdAYp%#qr_%_nMr?A}r#Y&Vm0;Nb>I!T&5U65iRDbj8rt)NmlQFSnK zwb6o;4ttclOp{To2%9mVz~gPC8Jx(o#P|UYI+Q>}dcF?AcsLH}MTid43H5wPq!;OM zJ%%GN3^S+j_{D7o$6@u*kqE>BAy+3xAR(ehAs8l5NW>-h5Dtq32p8swghBz6 zO;cpMTj#x2@`&jEbZ_4c27P!pT7-q3CmTID{j5`i0N_2ORw>e*y+dENuRJdgWSq^A zRxHT!yQ3HcR|Pi8e{)W6S{EKXBe*=cc!6R1wUX9?j*!~dJsV4|Y+HP{f9R~xl@J=< zy=Oc-yR79zzh#r)=!w0Le)k#hdI2~ADG&xkI3C0J)%B!qAN%~1=MN%$ zpWggw*0GQ~^R)TVegngY=M*QZz0WqeXe&r)s-}eFD%R^5xRNI$7=N8Y7jG+TuqeTSJ0&bpTgxq}3hSyH;6raK-G-q_4(j z-YhJsXxg<&m0KFI=xp*!jkZd+z*(N_Up2emko-#2$N(jdHLg<0O+bE>bN^lJODV0XrG>AE3%p8#Omr23)gsLv$U z+LkkAWeH0b{v30imZuvl{~Et^eAZ0H{x{`8&)&{IZ#hylGU`=hsC;JHqa59~u$&K! zb^WEdwu(CiDPpnj9~2U5{q;ATUr}-)n4Q06FsJfQX#L6{P7< zw-284_*`GU`d()Huzz!Xc&|@$eBIJAui#x)Q4&UHt^a&o%#Gp*N_lo`6rdqN0bkVfA YfPD?)?J51%828^s9hanPip?th7d~l@Bme*a literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/size-alert.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/size-alert.png new file mode 100644 index 0000000000000000000000000000000000000000..49b639c0d86387563bd2e9296d8607f806487a21 GIT binary patch literal 1132 zcmV-y1e5!TP)e`=!8zOj=4oOrHL0+PA4_!Kx5SW)dRHwFVJ5-mviD4>XHxET(W!5Q* zN-MYDV}IlR9Cvo!&dwhjzhC&WZ`_&Rd-HMjy|=S(eihkl)_{UjB@h5OfI|Qd;1GZV zI0WDT4&V@g12_cW%T=*5j@?X7lAFi}csmhMPT$Gz$*;(Rs3`As^Tp>Ec{P{UkY~ZPs1kzFoM5L7T)t5O zo?3EbhTF3N3%~v2ZJF>Bh~L1^ zlRuHKa(AGB^z*hl;kf2iQ|ZtJnO(%Z=BM#D$Gk{BDY_-KeJu*Jl*8mH5$_JUD#QV^ zirZjnirW~8S&Hde@_>jrPOc9Dc0Jc^YJl5jL=Cudg4`|Q_JjbuN7UcVZ8Cxa9t(H| zpw>;FBaiV^@pcHa5LM?Uo&w$tx^k=!_jpKjVurhgxIGKt5P$PP7}M*eYc zSLr(@jeLqYH6UCES6kf>ut)4*>r4wTh;plC8_F|kwPChY8n+x%mLy|mkaB6kr!7gw zQeI?rE0jj>0n+F#%5&vu8a?HP0?=p4_sA{e?c{ib0mu0qTlk!33&3vBiB)Ru*(>BO zblZ!RDuoG>{koT{WWR2J%XzxW!>ST$?cup-Jfd*bvI>>CZOq80vz~Mls2t#s$9D@M y00(dgzyTZrZ~zBz2*3dx0&oC_06bLv6JP-P0SZw_EPrhP0000*P&qmv zQWX!xqaKKWf=4|gh>qegR7a>*5m3Pci$|@}f_8(T?M&&;?Ee4z=Y8M%-uvI1%~phk zIM622NFPOFVAQMBD_|UmhnHz|La^uTMG(+HLNJOe zXUX+qI6)J-5``mHhDEAZu2AzKFu))1GYSX-EsU!Gqc%~835-H;fLB25Eyqj{7;wQ? z2*FRHqU8!ejG!>UWpKUKEFU(&<1^S?E|2Hq1^BSo943p+Wczxv`2r3{z+wS|4@g8q zp``+)BzQ0uVF|$m9M=n&OoPF|F!(YMbQzP)=ku8?AEu9wH{s!pnRK|y=&i%14KYYy zOpR*vxCYSy7DiP(l8g&MLg}XzwEEAqI&82^M8TLwm7d9Fuq-JJIm+e#@2b^)_Qr4} z{6+775@V4jJECJC2V(~!L0QV@3 z4nho=#{fny7szxNuF|PtnM4Q@EDVhX5^y<0g=hOpf_bw=Y_?P+67zk7#6cV>U&NF8 z^4LRI38GHc!a95i3w^;#hs9djL8~VsOJG!!0z<(lq6G%h7HEdoA{v%&5DN{jMLaB) zNr+)uF83doJ#<8LkY)S1bqV8h^TRr#<58lu%VU!giHT{KNrEDcce@t_g+|UB+dsyp zTHh{8aH-a-GJ<}VP#Gv|w5QSw-NaIq=GxH46lLb*xoBw)_IVp~Hd;C6S;lcYf?T&+92!)06hDHGj|Bx5-Be;T`ka z<84`#@mBWa^(1jR-8?#O!1RnLD~bxedaiLcshb1_j*X@sH-lB?f~}JEe>7!WH00b_ z9s1Mcl$n5ijrCFUywYa4&x=JqNAZ_+myQ^3L*9d8suZ>B9FFQ{LO>kPa?Q+$v zgKHBp`&=%iLTmDHQ;q>hyQndxaC!s1#VI`(!4ydG2Bs9a=5+684* z&AdjB+QNr*i@hE^S`U*k7pkI%=PttlKt)9(|!cc1uQ?O-SbRH}`;f zj%e=cxUT}1u-`qw?ucb}r)N^?JpFgqZ8=lU-~S>!v$J8GU;ni>+fe9(99QpW9@-d9jN%TG`y4U<%e;@15Q DhUep} literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/temporal-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/temporal-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..cb212d4042f5dae0a9401fb56a28db52da406b9b GIT binary patch literal 1914 zcmaJ?dsI_(9KRchCWAmsBtb6&3Bm2&ZNMHf*qi5k%sDU+8QUGqvE9qv#SOw3rUViP z#RqXP8JSW*fPt6Aaz&ABTrXo*~=bh(GevcW8Z<9wbAP!d$<|740i;zCnbAb*T^+I}P zoDx=IQl!wBQidbz%T}v(WhNb8Pftn&6YK)gff*sRpxs<#u?p-$`jlS*dH1LxIyhxQ zn1uAdNo6V5f>IPmz&K_cLkF{2AeYZ%#l>;C?3ExJX2n7<3u18?EWRK%Rsh4`^g}13 z;d+BWB~whtA|)ZckRUJt1lephrj5fy@dAj&=kp<$4YAn_(t=?vwGdi6!(t7e@gPI2 zI^2j6M$`g&JZkgN5<*BPnf{%E8B;1}9b2r^g(6D^*|iwNV#1Kw?8$4&+DfR9e`q|? z+Nv(a5J-hs(Gpxo_QMc9114+t|A9P)BpZPY)s>hL3y~@l(n$?dZ`2Fq?0A^1kiiO> zLdIgrC1Q?5A!WN)QM72Ldut0( z0<{*R7$}uabqkEjG+Oki&AP%<-f6Z7ZrqCK6*y`Jr|KgxK7vDBEZJ=yN2cKNBp&_} zDW4;jieu$`30KbHvgp%T{UdUp#>)Q_3z1|XPjmm(>=_j~L7waE=#s+h@FNy-;&F1c zc~x%?kQ+0aDif>ix9(+&Q`GAgP6h_Pe{rWzSP+v&qp_ckhErhwXw|D%ENMNIE|IU{~TX2rjw5byYvAiVeZ+Ss5PgbSWHc%jyd#u3V!NKW_rhVd{yswX4zyXb#vtkr|QhOxLd@9 z*S#`!q3D(|udbzCd$?iFt&;n1Z_R6BnAD9;qx%Aec75PplF{d*Nz8T%yRQ^G=N1OI zM;#x!c(8vja^FB1PW|x zap`P^FoinG8@Sq3WZ3Ht-}u(S%BVoBS-C#+Xa16(zBs0~W>n`!R!2l!HJqIPLI3gE zk7NSgILq3`&(Cw+%fz;{_wAPMv&DSs9(3+^nn-BRX+Oi1s`3CljgR5 zcdn)ZzpgoNT27*TL+vwXei7oS0-}$>qdVu^w(JdUSoKFIJ~wjzQtM>EHQMmy zc>&u#jucg;IeOFc-%x547SY_uih+GSrAJb#3r2stZ5ra9*~5%281~EP+;He@{pIQ% z;UOp13_ieLfbW(p?=D`D)&ymj{Tkxc0o(|^hS9L-;+RcQ7hJ}zuUm$nr-M*EzrE+1 zj{eLik9r;Oay2`>gMWr(rw^`Fp8oP^m%(|V{rJPdEy2vXnzmpK&%9rhKa!;A%lX$X h&90WHv@eO`4IKaML+id1!Bw8WVXAz!?4%@b`(GGR-Ut8y literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/transactions-black.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/transactions-black.png new file mode 100644 index 0000000000000000000000000000000000000000..413f22350df29eab5124bb33f1dd23a7fa5edebb GIT binary patch literal 1525 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 XX#hyt$(+>h00000NkvXXu0mjfroqmJ literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/wallet-black.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/wallet-black.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb2ec8032483d3a484e978ac9150625e7064dff GIT binary patch literal 1493 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 E0V;W>)c^nh literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js new file mode 100644 index 0000000000..993e88f396 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/customize/header-gradient.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/customize/header-gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..cca8760b5d31ab17319c7cb2a8593d7d661c815c GIT binary patch literal 1744 zcmaJ?ZA=q)82FMoSEm$)e^~+e0q(diCz01#8R8 z48hHiEL+I-VSMt_UYsu4y<|NQV(0u|wqzk$-C8BaEK@mRrf0mhdyY5#AiJb@|9krU ze$VfDo?p|^gKckZD%e(l5ZdJ2=V*uLfb!9(;XYmOz6p=5d`l;Pi0R^kZk9xiUgkK7 zIcfI^vYm8$`%c{;>k!J@O?7ngovs5`4@2wRN{%i>2LO#wojnwAdwe919Vbsvew%jw z2SJNbUYqu?$)$G%n#pczUq4G8>Tm1t^!q#(uhw3V)rG7;K$E;13(+V2oHb%odjdCDEEZgE#Er%($f)A_{Jc9< z<>$&)7#t+$VW|L5F@8*8bRTDWc$*fKF10`hR%!j*@|a*?c*q^V4LZHj(n_Ms_5Z0f zy_(JO?c@u+uO#L=`T`{0PI62S>w(2}l_{kH)@GJ;^9V`klV9}ak;EcKgYZM9@6QsX@NyYQC{m_Q&X+kY_2u8wzL=wEwz?bOKoed zqtR$;Y^tfQu3o`97*7vP`uP>C_XXCnCRVWn9e~OXlBIe{Z!62t*kapOYHclh*W_Eq zde_!sUK5Lh7+hKIOUqsffrFIes&(OI)%>I%9M6KaZ#+r4;1|>2bToE^et+=C{k)DU@e@;B$Dul7j$=`gR zWySA5nZ+ZI^1_6ix>%Ziepg84OvYxS$51+Xx3mm}-;{gGi{z?>vDcB*E6rN~@4uU{BI&X;w-bdaIRlAxk<;r@Dp!c?E(&j#FXs&~ zXG5v@piTS~yr3hi+i*r?D|ppG7qZxi`>L}B*!=8c&r z(j|bFMEyXf7NVFc+$Z-!BZEuBdP!3Xj4_^A+VTBIg-ZGd2qu$&#Zqzv_Pr~bi6gOG z{2OMqS9%7k*dyPDRqTj_VQ0nmt03Wh`=3B_J)0`lWFCr~d1MG5Ar#9^331g>)F=A@ z97_;fgOk}tzK zzA*xEut&upOfCV0A4-=XT$%Y6!skn~u~T4}Y<)zv1wH*}>tEZ?_I<7V$2eQs9A7oP GJM<)` literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/customize/header.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/customize/header.png new file mode 100644 index 0000000000000000000000000000000000000000..d73c27344ce322d412519d63590eea4657214d04 GIT binary patch literal 920348 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

ZAh<`4UBqKKX#{2&)kM&{?Dr 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


c=wDF8K@V3J8V|*;E|zr-&_aOfi#gymnp-L~Jp zUA4dbde#2p7j^<(wqL$nJ23dbjx6SSD2PNLB*bDA9mu?pm7`pF-9GGUwNn(2@H*1l z(R{z1^AeErcnQeoi+An)`AIuJ;|;)b`;tC6=`RAD(NE0^{Yg^#6%{_uDEEA~-y<)- z^nNw?T>AtS41uBoS3&>S?s$1e_KmS1!RuSib$nor17oH~PT0psjJ@hz*<*vg^ap^% zIIltHPwV$Qao>XuaL`Mt+)h9XxzIU9P!7B+`sX;tYXpkIp91mQ9_i!z-RDrJfnm8B^k8I z23g}DwGJNd+Q)Z$?bE?tI~MLv;(u8*2Ll0A`2*c{09XNdY>7@qDlpR)uqAn%iv*~& z9a-)Zu&vzR161F}Fx6L&i5hA=hPktaW02wThYtkh$cD5DOwsl@a^y08~0ab7eVLVcaw7)nR4FUuZM5>WUA9okPkZ-gbAJN?f(V;m`ooM(GKmIGwl5{&rB zIHv1d15BuWHFT;5`&=I>8DNAf{z79u`G^b{$VxP+%DuWN+$x~G5&#b{9<(}7_HtXQ%Nj92PUGK2hL9>Xg91oWhotKR3O&nXL4 zH}sXh^Xnk#kk^w_?vpR->i95js^bUy$^=ws7_uc3hH}!5$D?mEP=-eJ>Z@Ubx4v*x zA1Z-o5mTUg1ysTw_`sQ1U!YY@K7wP;{e?A?27iZD-Q%LocOKf&9xwj5b)b*if6ouu z3HaD94qAIRZ|!)lMK#~0cO?gdq=(YJZy61}==1GYEI5_hT%}rwK_3sCM@-OEH&qqz z<(`U<(r+?c-QiZ)q-eHwc3rsIQAU97eJV>zB&O}cwoUrUZ`u=j)qqMzu8#weSJt&r1aY*Cj5e88_f`5{IJeFO!M zV+T+P5esI<18*eG_0UZUt^n}mcW5cwSIk2e*~r$1cd6iGf&*zdQfOv&0XAa{k{iCo zmOw#hv6LAj8lbUWf)XK{`OFv{yS|MVfc$c;bm`{+{_@*p`|S#PdDsCwWby+8Nq@FaILpHd zCF%qd=tJ?j$xc#1x%*cs0CNxKxdV_}fX~m`r}szg{po2tzc_9O2kbx;J>uy(0nA1WEYCZzxfATmlSb&eG@*~vYcXdI&a?l-mE@OertUgcoo#Sl^Um^+Xqy;AFA&}D4WTwoXs zVS~q4IsLK>`RkE$sqmcpd8v+sc)anw_15*X9@|0ph4YUbu}u(!<`%c1*2_7<$EbVM zwTr~b2;X`Kp5$^2b1UqfpOJTKeoGVS5b%>M-uBDOySN=X0)E_XOfWA3e(r~S<=`Cw zJs!QFGJ)jzd~RBwi**hr2+q!I=St);XJU68se=78GJMB*2fA)2bJ3rWIACGt2q38)Yay#&) zFU{~sr#l_Rxd#tZp9H3<`nW$mB>k&FigX6ailB5F z`p%RQS@*esg7D-+opPnb)wFbbHIAT1_5Brof_i%>A>{5>-?tvtXroEV6cg-2b!7jL zgYVmb9ygNr3}~;kbgX6pIfWbAR>MR9upqg~ri`1ySDm~rAixxVRSMVVV;uZdrob1D zq5evMpDX;EuSPD&viFEsi9n=dewX%1i)2- zpSB*T597p#k{3B<0GUO7jK_27OH1)kR2jR66J6FV0~*!!#oFN22zc_UEBQ;XzS(BZ zui*!~_wC*OouB=8GUv-M&;EO8=SnAs&A0v%{A1@HI`-@{|EG@l!p<^+z>{|f3SWyt z2mQ<%7ghq2RDFvpG7PzBGkv(;>`(|Ffu8uXA9b?0Ovl0iPRK>0zJW3=n((i{bfy(3 zXMw>2Wms@3S+}YV4!SLH-XS4+XbQa8P$N6Uj8EH)r^=tocpBY2hY(w^3MmeNsNevM z$0Hk%BXGcyl>Re~+8`-AOdiFMW8o~u@WYeOEKwiS35<{e=T9#N!=9AuMNQbh(Bg{Q zyU6|ACykr?#i9-W$WJUZS!7bL1vQfTTjLx+6(98Q1GShBkj(M}fDYS4KZDn3rC4)C z9evpEor@y&!d8n=`odg{@r|7+)jxoRyZd3kg{36O`O;U_23e*lu+94H z^;gkvRHY#KMyUZ`4f0ejf4a(tXp6>y7~4i&_#AiFm4<$aw)$FjRKE*X31I#qG5n{J z{ig=X?h8AOw8+=|_rl#x!3&hk=sO=FoAJVS=5yQ%T{b@10EdG@b_~F=>QBVDo&}c~ zOV2%_2yhTUA>hJJKi>NL=f8eyfBHo^F9Tr*;O#KIlzH zJ1G3)f>g-9GDT9CUgEg-YSzjh?c!{@DKZhkG6O- zwSAJ{l0G7^SmPRVW3VT6?C!_;wYYu!=K0Zpz1X3mckE%a%5hE!+v6Cn;}kmlQbE7a zX)X!HOyttfj&Fnr}ON5Hg|%KpdLZMx?Y(_iQEYT z6VQQ~^jA&M-vsEe8+`u$=Cb|+vOor3$>+GoCfkrUMxavj(gI>`d;HWM*GeRDt8F~X z(6S`d!G5kwD8K;ao+m>f5kC;jq#WbV4{_W=eRFf|@nHTU&p#N@&p1kaO+W@?hmP=3 z^oOrZJCAqm{cP7S2sz1d{&LsamwO9Y2I}@5g=);)LJRjd1oZc+sngXSKLszf|D!_L zY`+VrR~m!o4+S;WSj41_^0rV1#vqGw6kiQB4t@I19vggA`bu}6N)2V#7GQE*?OK4# zFUX;}5-ba=jC05!J7sZh2?%7IT{{9p8fs$`PjN_D2YNivk4GKL z1wAb)3fIA_rg+M9-)!!bfR}~#-8E1afOoOl#&m@%JWy>wkL&rS!0joFW3+gIDZUAL zF9!etilkmZk6VQY3J>&U!wAvyjbYHCnNoDm@(&oWfZ)DIWOqj!xlO{8`W2G zPn7QjeA8Gt0Oi|l?96-$usZ`WF9S66mrNhzi5l3;?E|hFrieFyo_!1}#dHl6pV9Tm zP3(E8U0{(Z*Kdr|ZUDl$5#J7JIOW+=O#?C{ViT-e(-G2}5UEcb8diWT-{|?YIFNaiKI{=?KQ~U<$24A|I^REPnHK@#PC~DYceDcTc z8WuKM421}{MSJGdS$HZTKWxO;;cvh%_7Gj%7Nx#9FcE!12ZdS;$6_7n(T@CrJ~&Wi zau!(RBy%D_IRPp!U>91*YSHF5K5F4=UM2cFoAC@TUTBc>qwFVV%o3x z(lXTs4KoH|VUKVkVj<@~GG!zec`O`Z4trylnHDXj1uADEZ@L5i+H$n+ed zzwkKK7*d8<1^?4$v_lf-Rlq;oXpCcyCNCw7kY3t6N9YR;rg5hHVF*xp7GeJ|<^-tl zg^IQrGc}(?&zqbn$GOH5gFt|u@Ed#tnqo{Jbd4nl%{+W$hpO!jUq?VNf?u=w+(9(# zwr`Q6GRFWr`wnPVqU?Y>0Ws5Idl)+8O5qRuuXBxe+C`v|KpD>!jOXYPc#Iv4@ncZV zC#9Ml_$*OT2B!}Xo&1c>&>Qo`yZ&U~d>%gr&G}J?ereoHD@w+YW6pi`c*ePAA)iQU z((vLb&9hXFKHlaGFXv6>ok(pL0af2Jtg+`0x%3l*ndgk1g(6or5~PF~9{AbG%rVa; zg|~vA>3h$oqy2U!T6PHjg&-i0G}QQEZA?#nI9KYS99MvX0C_-$zqf)XRpvm6th~oh z(T!mh{`UaYN1*&N1@^lVdC|RkEK*JgiL_4lrqGM*;jMC4L9ee;&6U1CmG>}(TLBiG za$T;%OHjm0c6V1yz>;!;k|$@Ri)LCx$pv_P8pO15dP1 zFohHJ=qi&>C5iVXd_wie#AR69hEO#^GX^_jJ(!~B1tA-IdzQpdp3+r7d!M*;j{7_Y zpO=$iOf$tZf!izqSOBUFs?Jaz*DLSKJ-FTzj9`*JbAGNH>ssfewIHTf@fEz1*%MDj zZ!po80s2>T)?Yln7f82f`6`*Ov~diG07_Sh1y+hKyRgxSfa2|QfHDWskgMP`&4y6& zwsLQ0L>06890~~mFh#VL@&Nic=&XX$Sp1Ya&t3AUuA~7>*OhIm>Wpc9sWhqzK(*=1 zG2;Od86Sa;g@ti}jkIIq^8JNx{XIQ+ zXz!G>`%mj>3Dg&AWqgO`3%wVVwv`K}zI^Mr;%h!%*jc13%#en1v#QwP(be`f$*4a*=jeB%GgS~gAvJ38&JAz zlVlCM6zCsvyQd(q9#O>NT5Q5Cym-9zZNMy&7An)sGnA04q1Hl+ zThI1mN04OTE04X}S;+SG0re3dcVJ2gdsn>BvnVW|fCFqgxe{_%AR{hz zB*yJu-W7&T*k>MWiv+i2N`BNsci0iPI(x3FTJ3Z^0t}uBvQ2Z&;Bx`i8bsjN;pAP=g1=qCM@&uvG_pxoPw zJr#(nvGl^djv)qKfDI)NfWOL?optcV8}kd@^fmZd+#}IEDnlnO*P(LYK#AiG--R5+ zM{o+Wp=I2e(*$0AyS#0G`R!}_)1SYzKmDrmub18hc;)vLh{*u}2~j`AEF89CGluX{ zf}!X9CXCB28E0dl@iPT|a&#L3dd?`bgS~cgaM(VaDt$P05b*u^aXWi=+z#f<(U6Pa z7*G0*NPH&SQ~~Q}!r@Dm9b8wAF8j#|gh=ERA6u?yJn>-|ZMvmg2}+NL3IzN4u?PzY zq9U|pGk(lP>V!iW8_!AEh@BpHOO4|v_#%1do8&Y8*drz<{z5i=g@k&?Ct1ur!1D1G zI#u^^0aG-Z*J@-x=V55U(fwBzf%K^YcdOn))A)O;{i%Y?f@E{l~R{K$LgRDS5tI4#&ZscN-oa95^}PM^YO- z#SZ%cPp7jPJCfhlo{*Qb= zeaQ9DJHgq(r|SXqbUJe6&=2op;aSztYuC@QT z*=b*ySIEHksnY;1Wjimt;TghukTH~Bf)df^Jy5Sys#ekdo}l_NhQ5zu82gp_CO%#V zV>|v9zU^gxZ`ot0{`CEt(g&_m(QaUuNnVou62MO?{iLk-qL-kj1^P0l*OIp?2mA$& zJkCajp-pLNJ{ggDL67V4J*>hfj71i3s-lg=>67}H&es{`V>~zj{3`i0aDt;PE=N%| zPcmdS1w&I$qcYWJHciOHh+Nr>MJyD|YuZ>~Q7=5iEEs5}ZXAAvT=sautuhNiLPP{D z>~<}lf*-P2v;f8_x!Zv-o_3N0K*pm}`XsETk*7wsQ9u@Tk{7M~86o>!gOA-T1Oe%z zGD@055%78P9ahvLY;mhxdhc!{nCZZn688DIQUn0C(DP#0i)t3F;jEDYOg%1SOvZw{5T(=4bFTP6RM2Kms^OAzK^_ z!6KOC?BVt_0W!i*s`KwmuZke&(*&4kxg#75Y`y_zF z{#MDGozzGRbQJ^$`@*l_qsLfArqA>TbbStOki>i-S(NyrE#z9J=t*&_ZR9>~#1Q(! zCK5GcN{yGN_Tr^e5xGYIOhq{R}OqBhYeoFku$E3E0e*mvMN3YYEE00S{(osKYzw> zObBR?ATjj9sR)iv&=Xv`>u2p%U#kc3Q)kQr7r}OX5k7c&hAi@<&+v23sJ_QJC+E0j zldutba4P7dg0B3S4ySkL(j>HZoT>>w1|EKVXlBdxbNZCH)f?Re{W#wherF9C)uyw2Q@agDyqcJ-OSDLeaoj-&5td$N_?gf%zu=bnS7Jd+e$ zyl^Du1w3e}U7(gneTQ?I{Hbxi)%ERUzSI72vfnNU0_sHb$J^cZ^%e!PQ}cv4zZrW# zS)U9eB05?y(5wL2HqdCymguKg!S(nlntvp~6|2%J827ONUukTYeB?=`dgYtKSbym( z5wve1ZY?0I#zPQHPCZr+mT89?7BK)DZ{s;`5drsFr%d5wDc!)1=I zr}_YPI7jT?W_9o5}q_NV*ufN>FwJ_d`oRTz=+UlFCM2v!e3By39b(G zg;1s(H!aywsfVifZDX1qdb)zrG4AI&IU`sT0PL@b9iWV+UTKkn0}8*=xT%H?rqIP= z-KrG3za1&P3R2OOzKx(5Um>6luF0AG5^TxyYCS8!@@fE9jpMqu7ob=Hvv)Emz9@1H z0Zq@$>MAaF6RMhC>dLydX8`d?;EVi4(DRMutP`?|PG!$U^?4n8fyZ7s;(+2=;-!*A z{k$`}>RmhfeYNZA&bdf|hgx5aSyTZCvz`_b`XVkZKs|4bMN=#oVzCs9GLu9v z#p~-0E|$OuqIfCdFXT|!boU25U)-t1;td>&Di&Y9{iphcamWi!%cg)nfVy`arg3AP7q3}Y=U&^x?i_~V@QV0F?+YOV(Kp)&3^tP8WqQvW6YI2wtC?*eC zPmAgZ5QHru3lrUc>`8iL;*YZ1{WEbk3qqbPH(peh6*?)i5R8SD=_Q~3uqe8_W9LUK z`dD;=ukm8zBfD;#q!(%4iKjyN`pF3Q1Nr0_;ZHb}OCAynz&)ry9O+zlRxH+6fX!9`w>6t)fvAJ%U60;Loy&d<8hHh5s!knQ3#tSM-$w)hFuMAhxaG#;_RfIp3K|P zVf=s*{g3$zdQBmn<Xppp{( z;1+943cIphW$zYdj$)h8HJvJVRI3_1Qj$n^>5Q;yZXUA>6vD1$oa>&AV>rhTVeLT6lvP<&0 zeHU9u&^h2J+NbM9_A&cM@-qyj%P$SdU5Dsn4DqiYnIIZ?dZ0>QD&a$RQ9kH8;AigT zc@vxP(}LINstzuE6LP3yqwTSGsxd-{f3#Doe*3wJl4*I& zRke{gKDhOmM^e}>oda%fZyZ4McLiy%UHXe4AlH%@Q;yTU{dv5l`R>L)%KYJE*3RdQ zBSFBO_H`l7JPjD=UnOwQk{bFXne@X6$ZQE@_Y#c-30zGas3~3mJZT-xKLYf278Gt( zS_gx_5~!CiH-R{h-c zVVynTdpW>5S*xIUN*+*ho$Dj(lT)UjOXkss^C{w0AX@V%RbD_Hm=f31DxV@TeoDrw z@)C@V=>fr!8OTcykj+yt;79bYhIPktb>R*2U%vxzoC9O>YAZT`lfiJ!9W%TDCC_a7 zSgOAQaO|u3OZoB_h^+wqTOCXVTk_~j!*>PL+wM*J|C;^@tV3x$-Y#zfYY2xX3gZc& za-HZX_su<70qw7LZzpg{_A@A=37gjnDEi*m5xvptWE3P#k&=^2h0FRN2aHR-o-<0- z?k@%^pqn=8!4R2CDu~9r{76#d<&BHv`RziPzDg_C;sd+S;gsf)KYGz2dJw|$%p}S&h4@f1 zT`p8qcd$i7NF5f7?n}@PFA>2vsh34oy(!jW_2=MM0*ee}>Lcl+j*Zyo#bB1LL{JN6 z)2W{oumHzGhs79W>p>p<#OmZB*T+Cp_*&2hFg_tOXbFxWE`lm1OBn-QLM(P-VG}&r z#}24fP=y?*egz+lRx!*WG=OJ88)FyAx|Or*g9Vpw17>%Lcb#aFszverLoCGh31Z4N z-v+G3B!Ins29v}%7g)A(dqI5A*dV29bI{GUWs}O)hYBuwd~Bm6!AGBuc z=M(}(Vjj1rOymSpP*L}89}5jS@1!aay5?Ts(^n`QgYf(@g;9asrb^i!BXmHQ_Si_< zwCoewBH$VHeMF0#2;M+N8*?=L0I-0r zKva!GCEG9P^P<5H<`;`?>@rRTa&*NGD{$cgEQC&<4iG?NU#b(){n!Z=eGOm6E<)L= zakO2c8xSGkcynkNM2G(Jr(vBZzgUNk$*(8@}>f zSHj-}-;R#hr8cvEbd1w5jsp4z&bRU^aSo$Qr%Wes5HWYw5mZCRkn`e@p*-_51qlTD zIeoqjUH-*KmK12?BcS0{VCXsSe7s~E3%BFFlXr2Mf{o zSjGmfS@DC#jmC@q&E_-LZ*`5^-+gF5>C4dBjC1`?`(HPYO{b9P7LGv-hG7IJUdro| z$d(dNc))b}pl*CN;O80$0KH7tk~5V$@_%S>pEJGI?%p>&tin&hm{fI8i0IQ=8>?-K zZp>5lG5$XT#NtZWc;c#4$(s*4IPQaf0waa z;pfR)qF(_k0)S=p3d;-CH?1;exL^nnM|}{zifIkN;#cWaxl08bi%r5;m=RD0yix!c zxmUrK`d;JbRWNj!k9GFH)V?9~M^JU+#qMmQx07!uU0LsS^<)Lqr|@f`7?dcMxf{tT zz9csNOH8zvqE0t3R6E>S7|~RxG70^tQ9XLH{CyVDL>bV(%( zGv0uRY%dyJ)E9GSd?AmQ2$1{+V1bwFHV6A+(FRUm{bdU{ef5{!4j76h7BRw6R*Cf- z!5nI_LVOgRzm=-#0i$x)eB^G$LPi5%oVg4+C|VTT3_jF-@95B?kDvenL2Tys zILnd_7GBmOdV5Rq=?{8hF&Mx&fU_T=RU3R^RoGVxeoUm5X-%Nmf7oQXCV{{SUG@jk z;1j(p@D~&77Y<%@#$qviyW|gneWjvzs!&LrZG=|~T*fol@V^Qoa}ZAn8Y`j|!v)6E z4!?Qvfg1EtJOq;-=%d=p#tNvAONwQY*$*m)&*PYl+d)O^mIz+jHhcDIE{VkLk)q#W z&l3#`=O_AT11MJ>e6j1N+DjKUL=Yjyk-k6?{J|GH+t8`AmC%e|oIgWn95>WB?&Cbg zJfjVJS^VE>QGa!H8@B^ru@eZtNWQ)^X+7WW>^Iqf5GH~b@#p|l4)ZjpBj6Jsn&V*x z1_!I#1oEeYBH)GOU znZW!nlLQ1Q@F{H=NRxf69Pd7A{^37-iZ5y`;{3uqk8zAP*)Cks5=aKB4S8{ls-Q&R z1hwFLx$Ghf2wL#L^aPyOj2DpCaRrnt`#~h3KN7$$Y`@``P78;5td!tI9*Nss$&0Uctz$RGEd6rOb%*mUx4a(unRgBX64XJw8??Kjtz4PF@Jbc#Bc|9FN>8 z%rgnSBT@$tGZtBpBw5IH08{>9N22~XSNK+Dwex5R=iopDr28^iy)T0Uu}N zktRj?_!~8XTiNLj%08WUoUdYm4lr%zK;aXta*&xh(AQU$d-?$;kqImCpq0uN@+o&9 zIX*HUwSNy7zK^{THh2lh23jDg4g;Lz0dQp~dEtRo-rEGsqK}dbjLREA5^hXChHSJ}Mx?P!;006w;p*`giKD6w}CAq8{^!paI z)NR0qtb4JTIGUkgp>8?)NREMbkkJ7)0W4^}%S8*V>+8FAb9dYBwZLW3MX)QLmB+)? z)i)M!ys?qRr`2gJSZK=!uN-#Gk;GIW%@?R5>@t}6-673 znR%{(qm@sBSRP^bFZej_d4?5!hyWrx*OU`v&>Ur9>>wgE3E4%D2ckRx8>PE;eM@jfvI&ZCeC_P%EV$b=jctRS zh69*`0CnFIEV(#-IHzQ8p0EQ_P$7r}8M~!oUhyW^)5F7dc6!*(&)>C+lf!m$a?nnW z4jk0Lm!+5E1TmZ|%6FC>S_akl20xll3`J`)fdizXgl5<+EhwJ?mZh@a&?~=rUbxH- zGp-xRRc3!9KkBGR3AU4jPkp}U?5pvxEeWN^{Y;4V99MB+Qtjlb^CKDaz#wvhN*oI) z54-6fZK1FF=24+tnFHVIkB@KBaJ<;J>2vsO8$9}CcxU@DKauV8jmJOw3N1Ny)m-Pe zLJqpXRRE4=0%8%=iXC|L4;jc43uf9Ta0>#8VzN3}U-G%`U=MQ~A8^Yqa*)UK?)-8M z8Q%N7jw6q&#+16xAH+jcpZ#BH_Q>ip1dc*ZO3PQimg$fAtpaa*=7Zb82xRPHe`JgSfJq7;I6j2-@VKvo7o=kb<| zxb^r>ec={u&fSvj9i#Fy^H*~U-yaFaH4|JT){u79!tOZh-h4C!`YUL|+|m$NeXLIAGt0A=&)12pA-Waw>V3Q+I5 zGr+2TRNrgBm@kwoe+}fEdrFdns9qdu3pZ|C1)I=SJ9+8&TSD*iUf-&G6M(koQ{vP- zDPyd646ArjF0e$>SBh?({B>a4^ijtWz}%qH&kx!MJRACB$^2e=Qx4gSB449(%%i$} z7saIvtujQ!BW zqM1cwEO@*Clm8sN(&7QF1oUEQ35#fy7>nwIcS}lf(V&I}Tyl#GG$981Q~w+5n%z6+|K3_CV3x82U1EjyH>$H5JyuoQIo+5t*I>_!ax z0-z(15@U%R6UPCiqwLlw$&4(LftIk%|w| zwIHwnJ#xUwrxmpDt{V7|3r>8s^Qm?ilJJ3(7TETcQV;mKd_$T3$9xMvg=O?J`f6Is zF*-oJmP^Vq%{~rQf=^;CoA&5?1fStaHV3b`1(*dq!2zD(b$@>=zSuoPAb@AbA)OfC zt^R}j;lPmUpeQ zl3tbTI#3qd{wT<2>=0y*GKP3R0$uEqtLOaLF4-A@FznU&5Fbey=Q(5%m@A)@ZTJsw zBGBA?a$Xc?f<&fSe3#4qBEAh0Tc^)&#r#?Wg{xq_aQq63}vPlIbi%hIP@k` zc7I%pywVgfI6c_s!u9!UU{Y?Ddw5CwYj^-?Dj{PNp4Y-U8{euQzDyR;%c5Mm3n$34 z<^VC%N6?edT=km!#Zqk(B3=aeinoqmms1(#L2lokg`q4M=z6F|f!imEUIy5@B7hvOl$f@l}A@X2TJaYSLnWSGJ|fm?f71yi^&ywqNREMNt_yS$0M7vTE^0D<11 zGH?oLs~#{3i)R}!d&legCLq)htOrIZ$n5ScM;8MDQYgLa&>Ozl>3QNdWCd)6v#gzIZIs z*b$7XPmsv6XX!YlT*h~Hb3z_2LRn9y=pG9M3YnAiWn5oL)vhncDn-CAf(Nbf>_3&E zf4FV?JNNBichQdbfSRQ1eSnwCH2eP*95_2a*Il zCx|ccaVseLB?o5OkZ)ko0xt^)aFy=?FY#z$NJbFIpi@1@=+4Iaew#VV4(VLf4|S z7QMwEc4yh2Pqb=Kd+Y{c;YSeg=H^O^MxL?8Li5f#qzU3!1mYv{vw&i8i)04_B^|s2 zo9IWc68e!)c2!=Bb{{UL!4}Q$+(}Eb$ovtDbO`z8GVNp|IGgL_3RW z=X@lXCV~F2=yo46C%G^5+sA-Kh7n}&hq=la7t!1PASm(l1wYq3Bah>lx%bo`>;cOH zm>`XVg8~-3+@^>Yj+nT$K77w~@-7*rFa<1fsSy~v58vPy{7jy9R3G6P`kF@L55VI` z2NFD=m~#S-gXLgGj&aJg&cUh(26!i=QtUPhIR=$&8}_18w2*R6u${^s$P$)YC~vih zztudoFr5o|o9^C>MSkp{@{T2fNg9(|`wzd%3funwr|wUhEK9OHKTK_YHoANG6cHJj zl~XkuWE0KqZvYB~D{i>ph7_R?BH)I*Ccgka3%TF|LLnBw1{)AUEShWrY-CkeR%K>q zWy}%o;e)x2&+M5Q|G)pyb4}m1`<^{B_sD7-cYQjYNskWq>M_0dDqO{w6`>j{eZ5#w zu2{0LbEKopnu2S3@{*;rPiKjKYc%p>z&HSX`cG+21g@{;xI>eW56fs*tUvIhy`=eP zc|u}Mwk;|>d^~R`s{uXXY%q;ACF!vNZ}XMv5?OiTI;8*6M}@+(!v=>>+N1JgjBHv}=K^!twFTS2@H4RXX4y+5sKZ8W(wT(c3u!hnuc=);@8lM;xUw`Ps_~HEXH9-NV8_r>5+1V(4Vj9Fa!N8X7 zKjiTThj`x~yfKRZuylGVo)fEO^;8x25=xL&M4$N!!ge_0gjM_Mp0{k)nE&mTB%Vx~BIo6Nu>yi%0 zx`=8Q^biCc89!-{Hl5JV-w9Z&iCAmIh7c7sQ`aB|31Z&4t_Eb&cbT4oRICPgIQ{-$ zE^!&^SbFp#qbZvLmAfseXO1}le6J}(#6!%k!L_rCJ^W-+}{w+PH+yg2mR zurNS(2io_&a14RP&(Z(ICmWCJszyO~2*BFphAzwVE3vp`FL?vzLmivWE?>uV|_`hEEhWP zvK^Fp$5!jP%LYL=?2c8w#72&CKkBO;t<&sm37r0m(}Al?oc_BkTPwT=kduFiB*jG$M<5Dlf8ZEdcAn{`Hym9$or3agL+Qo)BB*x~I{_~@P=ul<3Ej7-*O+9Q^#*fnI z>~fVwyOn0VV}H`bfoL2v5V#0B1#fnp4Ot#DLJp@3JV;9i?SyJ(}@LE4Wk zR}GP4n==rr0@%eTUKu+T_nKYw12N+@<}Yahga+m5Q~IGgztS;5olonDVPNxXVa5X( zXX)VZNgItR2ao5FkBxCo5L1Sp#GRcK(gyKW?BJa;h@EyeYC|K@iDypE>-N(Z!a`5Q z;e?12ic(JX@CXi+g$^+mkwY1E4zd${VBMAHg9E3h@#W78f0-3Wz-8fO|Lc5gKyxX+ zSgyWYTQBSMy>9*BImR&~8(~ia>VjBp;bP5uNimK4fU!uB>gWMnYGH=;LZD5|;DXo0=18sw^*Bfkr1l7kHEm z2NN-r`H@yJ7;UVZ4zNC|cYDECCY(}~B@USw2kSigs`j&%!hN;|F}tVd~T# zS_ckuJJwJ77QJagDB!WC*znK-h#-)F9KgQu_4d*v?8$aGo6F1iUIE-5-6ry;63y419H1%8Rk+ zVu3e3Y|IZMCe*5wF$G;+Kw@OvTuK7SXPIRvIIYkE21Ahytv>&dfUXH$JDeMaR_|Hq zMWB^yfW8g+dmS65G6OKHKFeFVq;Kdk0MI7hZSofZc(eiDAA)Z})wN@pa`@@Dw<~8Z zD`o+jrB9X-w|v@sribWn1COCt?^=j8P{B+UVnX|WTtu3X(B`{()&(U9p2!uNq~VVG z8#QVAv@`hF)`^>RK;mZ^cvH~NPlIdwIwZ_0>jwb4rcMc2-|0$*djXJ%D{(8IboS9K zy=K4y4nR2H0a7?|t56#Q#?y~4BE;k?^l4_ojLM{K4cs=P<6G(P*uU*e&aIpQLo^Evj3lF}Io^^@Hb0@w8>b>BKG3G; z0eDmVR50_VCy|LW0E*jU-_%h)3wo6^aaDm6%e*rNnHx04BvWqUkkO56fMSw$6BH+> z>dhTDdFDf!4VN|+H8#FCVf7>+kN>*iLH(hbm7v;T#Cw2x7xOVMDLY+WGjRoM@wUdV1!^q&OA9sgo=8 zf{*agF-`(9hNP=)1aBM`%ByX8$_7XsiBo4nR9?3a9o;hJ<8%@KqK2q*`t|($uMnjcquOsfTy;mmLo|)>VPlmPb0w5`3+G z^ogpi4-OUD1Ucg>bca8+GzlK`kLI?Dou&15Pek=}$AL9gPUu@njzhc|*rCg4^ zj*Ix_c(7dCA<~pjh1xbL>6m`7?VwX5ps`Jo7mS1h&{yP<&+Ku%g6*#utURq4vT!O~ zJ4FbzZER-%4nR&PaSD(xv|iY0u%WrQJ&O00G0t&tt*%L5oa?&%n@I4Poq&?hd(5mF z##f{eOBV@u(6#=7XrNW-tsk!u;XG5{NY~Acjj|*8JG-OuaC@_CZ?Bc@t##9YWBVv% z+i|`TyAK(^we8n{eXuv;tc_JgC+yAGa2A8AM&!w<yX;c(-t3@J%$|RBGKw%0J|}&n1U;#@GmFKOY!Lrz&H3%=JdRXdC?q zJ#&|@&ifsRlFb-A)4XSV;kcx1qIMl09s7>~yce)_J`$KYII5{f|Le6a)^lvY=|tu& zIv$-IsL!>AY^{|~HiaWDpC6X;hQEQCv~s46B=e8ET^N8q3XN`IRz2wir&U26f>E5f zAO4)+wPqm1>P{kHNG--i>YHu33qUgkqR%2&^{auQ^4rAD`myOT1gaXvt$i8bjiyEQ0w|W`j1EFTk~Pbe~UMA(4pNbha^Jidlo)m!Ii5 zdJVyceFS(2lAO3zj)Bz;E)}+7TD-RW2J|YEj<^qrN}cOfkdq+k?hW@P7F~57+zp_? zcy|EZM0_wnU8|kC&(gm`bng8@e6r~?S*A>2QMpOe$6u7b0_ZKPHV<^;y#{`=F2Uss zLh|W&C^JY8LK>}2SID8^8{V3pf+?l1VGvi$7#BDbL4YSWnVkG<`4gM1%Gn@MU^*%V z+Vljjw<3`jaAL@5HbsuLk@3xs(ih?Qi*nte)>DDYm%Ib;ylkvpl+BfkqWx#tUb|Gh zT()@s-zYZ9`tO@)HW#$R8$yd?qk$f=`Qe71Hqk=zC~ECcLj*2SyTIor-)NZ**NU0|RG>y$T93c0~SFZA_BR`gNL#uN<_w4uvW7vyk?R9ZHc zc92PVZ)_wd+5;6ESXEe!*vvvhd)PFg-?HkxmlQ4=lz3rzY;>2knF#xd7H-fRQ{BSx zlS<=LgLSA-DYOb9leYL2qMf7IK~<6yn=0uq+Zj*A-t_X1_CfC(nE;mwFE>1KljD@| z!Vv`6p(!1pWh2cam3#<yHSCABwgmxQ)0yj9~iiPr5>9aF<&O&PZjwNyr}$CY#gLbmLLyc#GY zAczPJ{Me$$mkOY9tO~KV9Vv5cvTOVEPj&P`ki^C|SlQ9&J?H(H)9v>l`yUD3cC+biQ_wnS-4Tyz`HbfAEg8F^&fu z5On|2MOj+Rjmpk;IA&N&;AJ~25oOpiY{a^S9l!y=Q`T`jY8~Qj z3Gj@_PqYhLQq~m{`Q#V!B&P;s#iO(IB@VK10CF9{%+bdtF`t-!N+3jyuDR>W8+@}5 zMN7NDMPH8}A%!DKl-4_90zm&$Z-<=n*L3Q4>4vk5aX`OQ4hzN4nDc4ylsX))R{ByqT@@mBh#ZZPIf<*%NSJfb*=Ul zWd5)UtSu&FaqY^}Z~l;m{^5)})1bW6HJtYP8YLpyhMw@kxrZ|})-kBmKE{uDW?Qfs z`V#Cs6fegA`l@aKgcv6Z&(*g0n1|O2;h^B!`i90psCnw`_cyv_8<1vz4k8IkF z?PxRa2gKn?-*Uq8LyF&Zw@ZY8AC+i84yDvx|Mid=tIA*kJHvofrMF} zD#I|5&XAz?xV|m>v7i+}+M&wMJafy7Dwztcep6|18@yTI4gf45VvN(XeID7KdF`5m z6GLy9*w?xoZ%LmpgWoi$GV6&m0K~BjUGvSlTfk_y%ANzzRhd`pIlB%Vg84#R`#!o1 z0leA(5L@S(h?}#3zWhwzQLkGZfT_V9IL?D))3WuXZ}^jJ>(y6|2ccKd(q$S*v^Jk< zUHlA*b1%3jaq2O1AkKq3(%ehNEnt?-pqvTsD;xUk*cve|fSIhRm{~akhVbveBTLl#t{_GK7!J^iS{W#Zrptu@T{yaUzU*{|GkV;fa@1!dwscV zt}m65Zpt^5_Fvkiqq4rKW#hx}_G4jE0;!aejHWVPSv9dl+$0n9M zJluAnCk=J*01r_nCCx&$5&r^wEPj%hHVRf>`1Yp+D0i! z5I^M8Z>~}1+Hse4*S3{bb#tD!q3y^qjllL)y=_a(Cepf9ex$21?l)_qS}EW<^NB#x zP6%?f92~xS2?w7gy$0KPQCzafPmK~u3l9I)VMbgx{-3@+cZ~DO|07qjs#2cT@HI4?@*{+oyxwd!B zqf562C=G8rOH_~UtaJXL!T8LMf(uR})kiIH2GMrJVqtjl7#|KmPC466Vt%C1ms3GY zrgHi*aBEQqUY`_jxWrl`Jv~O?=a#y!A#+~|{54jE zGiXEtee{Q~DyBnLoY=yeLUMh`=i?l-nG8I=%uyj=J|#cK9fCd2JRW5qzQQVe`V1V8 zC&hWX6(^C?wgLPD7bn#E2JePj^(jSPnZ)1Yp0!W0`I(9~F!va%=!&CIB#9qJ#C zON=Xc>TepJW!_H{sG5MAgmg8L%8_u?C4k4MJ6 zZizeX;;~y^y>O*#InGBMV%Q4@9lE;Tt!Jz$le#{HJgt{@jxtAZ{Kt5}j+~scvs^mz zs4$NMYZM7D{>TFjr|9@1H0uTJ*<2raydXcFci?&bKjRc5_K8R7u{Sz$I*)e7S{jeR z<4nehhJ2iE?ic}M3ZATk^psB!s{Z)&M0gWlL(mClpYJiiQbgNfLHjv<>C^k_*OL?8 zD|lfi;Li4rPba>6_s%xNS%@4}OBeCSc?>ggTH~W4@V5xY#7eyXc5+sBc6KE1vYZ?r zNgi`}wLIS_<<-$r`KejFZ9=jIut6hc9=O_aNh}7sG6=mPAh{5uTZFW2Xkd|Px-g`!<|%r|w;I^jq;1&lU+;XITKxmcBbUFaYXIbXkxP!sM=`86)1A3@Y-xLn8TMX_+bPabN zIpE(>*$+B8E12gZdVDC^l~1yp$(D+{cIFTb=>>Q|)}JOxI>au;_>^2tXPoJ~K+E$6 z3{?)yX{x)c(hwLSk_l5;G6Qm4ta7s^Q|l8oPX|!MK{s9xwj*L8|$zG zC*8tvV$puVz26TgF|m1%%{2wS39a*ioBvg%W7DK!V&%Olt7UGK(o$a(70~Bzi=u-8*2~ts5Vu3*jPGB zPdhfMd`=l*t9V~nIP{Q-?l>P{$oo2DoW@v2J~(#XOMpmfJ{(%HVUK>oL5qBlJO(R- zH7Jg_GQsLZPDlHq?T!TK?zyG;fb#%q_dB@mcf_Gz$j?4OPP9!3vK2U%t$I6xa8PR_ z&-hHI1u{Ioa7;ljC1T89meIzl);=B;Bv0EEt?=%zn2R{U#vBJk2K~VaQ?y=H^=2-P$PIJ2(K>%hu+G+2vPG$)w$w3(;>h zwYFbC+oM0I!)X9qK%>7BfX%Fq>T$NvHvVH1H>L8=bsd109WFS8m=_v1cB0ZpirqiL ztD;34C#7I$S+Wnh_yY~HH_lZqW75_#!F7KL72f89o>Zzd`Z!Jk0+uHv)*PB>hm#UK zddirFEaw1gAajCu0`l1A#U%J)1xa;ZGPY88(r6v}D-REkr>OJ%;-76DI*MaA4-t-y zD5nS-KXR(MJLSqy2ly2A=Cm0S!%K4%=?=8gWUeDF%^dGd~FpqF7 z;vBOzWFzF#*NmfBYc9P0AV0>?xoo3xrnW)@-rB~<&RS0C`NW-YPsgXaj*Lx@C2+*! z2&F~v^`pN^k2bf;*4C!@#F!!gj1z3*{!tk=pe-9XjL#?K;NZ}9dhp}{z$gB2 z6mohL$K%%KrUTpd83F@og}~D`_+Cm){kVrsWIVhgT2Gg0aW7 zGx@1KPWJRou?bW)UE^RNPFl*9?&@xXN@M8B?_jV@W5aV@q4~#pAIgEG)mLjSI97^< zu`L6J=BZ(zjH00cWV*+$zeLPz<6LO2K^0if0_HKBT}O>|BGykEy7~2?VM-AB8i0O$ zM;-pWCjfzDM-1du%oZfCKv9Zpae*xF;6}ksNPa0hA=38OaM|`Tb4YzJDkUVUY!Ai z3@NCByKta<3bLOYm_mhiU@UlUDer78qb=arsYe-U1=8HuLvB#o{-L@lb)C|>fsaRg zYwR+`x^Z91lYkdz*Jb6btd{dKTD~Zos|ssZWu(o=_Ga;8z$4ududT&~j^&6OcvNMR z=^J{NMJ$Ql*yhFr@TnZ1stCoooJt8biJSW<3+Dpqc7ty*(RLynij_JxkI<+bTH|vO zuJq_<+lDRxG`>F;KW^f^DWnQo{mWB9uw-EKesRoFR8_(71x(09@Ieyq_| z*K)B3o7WsGxv@5Vg~ZQv;};<21mNZ<9DuPFR6E1Qc8@s52u#sS zZF5TCBF0eIBmujmjjn<51wFkjyNZd|3AkbBj7969bULpRa(rVik1>^bJV_S%r}GcR z`Pd3&{DB6UAiFKHgV#a*Q>)CwkBJM9G0Z#W0M-_1p2 zjWd}OXE?WTc7uzKFtKADd(^bo5!o!9ebS4IS%naXzM&iPZA&^*#hlC|k>#6PIRCLskCwTP&y1~QFJ(V#o z=(jipN850)%P!|txAmiG?AhjoxgYx8?i}&hPH+`f=cQ2k&fy zEy-W!dab^I4tiC<%r@p19@vl%fe>@5a4frF4?afnd{g66$ba>AsT{;|rTY=-7D^2R zRfyqUVs1#hCh()Gs-Utn@Y;~LcLi)Q)Q+L@wv0Hd+ceOoKLmI!knAo0VF-Mil{zZcR5aYV zpAvTwI>wB~rHAVc{HCBQuVv&Nu@T?`~$h8Czx=-2gNfp-7`w{Te$Qt4EXGy~t|%4A(X zBv4Pd0fU7%A^9gC^Uh3#l-U$526rZ?kcue&v1DRfR+bz*9|Ej0I;X*M<(&oZBfHus zZA2EB$+E$}6AaNTzyp+9b?QOl<+$(iO~_^t-)7#q&}T*r)Yws$XI&qf@|pUyw3!w% zcfrnU0m~~K@wt#u}z3catYJF%AfxUhyl&0)GOhW zfVJEk-&z;=@QF>cPiL4|6$B#bLQ(J)jyDTY2M4TzzHIp5Wh>b(fk0U@Kz7_Xu#py~ z0#26DLB#^!0MUm6+g=+KLxT5@Gt*1-9@svH-Sg{$l zJt&7>2RAvW_f}Jq6E&d0wcwrYbfQn5vZ0JsG zzsfu5v^n-yrS&h~YlaML2VQK1p$+NR(CX8TF9rG*$(&$|xymf2%`pd{ixY^^XV$l- zlLx1SN!wW=dd8c_XpI5t%uvwTU~*ngaZWHcacrpnm}B7Le4)3X95I|XOpXPqUDrRWicPrN=^a7AT2}(XCB>*7ilmUJFFLCuQuWU zSt=Xr@gafTosF`yHS#GyP9ND8&_HV*tfibFjJ}DrBic@VtRt01I5}>p1BZIYs7;-e zfLAysWFrxf%5e)+7M(6QcsO0kW1~2Ccm&gSlzmtaXgPfaI^2A!R{3+S2XVc?)?i7z z0n1&M0{Xa3pkiH%;;X;; zhbDk_&_^5VBiZV_93CFIy*s-*9@p>o-&w~M>BD${ANn6299TZOnYqBHqXm3n++Uzx zT`ni5$D-ilKFj5&TTA8O{Hpx_UNdUM2f7>>vw*t$1nk`gfM{Mo7Zw8gk4){yTVWnf zTSvc`ugW@E)MuW0!5nrA0RsTtGnlcMqKgCBjB5ZY+Em$Hp{4KhY18+CmM6L<+=nlH zk$jj6+4c_rTmlW^d*fspa348C`rSuoXcnRqlE-dEWURUYLkvjID4QB{uIQ>FpM?W3 zBr2g-?j-$4BFi&P03XP7;s9OU^*XJ)2o>}ZXTf|No2^C3^rGw&68|%G>G)~#g8oEq>)bG9ZuG`2(4smG4+Zm!tRdMh%zh!H zo6yNnf^;rqz^$_9R^9|;d`R$kOrG<2Hv{+H0RKitFMAWRaxPL2TBaEPj(Xn-9XU-0 z4~a_@pjE3!Iv-jFNl??tBa7!YphF7iWdpL1Sj<^`&9Xt}REe*swLYt?CS|&nbd_)} zxf$o?9(-*kv`MkE&yGOq73}cC8A$!PVr_7AL%oFaubu>?d`0}$SK=ceqjgTDTsO|!^69F*nq|jHK!!lz+D?q{U`NB=F!OC`RE>h>a8g z4?;XnOgpq0Rhy$48T1o6uvJpRX>4MpDnF}by~wkn@uo#MK3%0Ux(JM{M}F|RKH0$L z(`jP{kanP)9S;?XI=zGOAW&Z$avcj&KFo-)ooy_}{-+G22$CgynuPa5<-413{Q2ET zY`o6Tv}uctF&o57@rlR2!yyoxMzs-Mwg($?cqIR*8Y!*oqq9(=w{Lrz}O))s+!3K}1&p3-mJi*1uBzy2Up)wxJ z3h|hzsB=!jzsev@k?lbuFb$NsyaDH%_7Z!%=%1Y>DoaPAkR90U6Jsaz&wdbbrw8pw zo=ChNqo_4)4>s;N9LAh9(pcmp5UeFQQ|J$HaRzN{j69B5Iw%Wg2`8HbG(+QV-H!vW zdu*<-P-q|sBMdO2O2@XYUgZ>c1 z-))v`3UK0)PsfwT0elsZgA&3i^6MgO@I0surl|M3x>zo8Uj-|WA zTCb2%e2R`ai{2jFwiVZDwOeV{VZiMcU-XI7dz{K1i?6QzDrfCO1JZo#20U!LK8i=C z8FxHd&HDoBZ`wpY9;uG^1@fpYCuK?VK`VH1Y7V*R8}EXh_>>^;-m~*;B->yYwa=$B zr8joqlppP9UUD75-snTWljpQwI(T_h_w?ih?d{NvxyCp%Ylck+IEc?q$Nu9KI$*H(x|jOXfx@xw$s~IUT4moC;MET;pl~0I*E1T1ybWyV#DlTYQ)L43^bKVd z#XrRT@VYB56Y6qUFc`vy13$D zVw;`9HuPk9-EM$6cmt+U0ursqZxFy~@#f+uVuRGv@#ef3V%RSek7P@*m?63fDYA!R za#$(hbQZRd6>XRWS+6$Q_OvxS&gqOn9)g(_T@Bm@VTiPfz5$fYs%xR&R|XN?Mn`=H zpk-6bR?0vBKmRAUGMeJ@p3rC0<$D!m(>O!z2U_FhM)@v~Gum-2BPOtz)can`X=M$< z+{)RId~*SB7ct;N%A7Yj?*mipX7Q%{R^#0Q13Y^78aDxiyUGMVX$EB826qydyn94# zwiQpB08qA&YAq6RrW@n6#fGU&1HJM=w6;)bvL4scgUIu#Ho_4&Ds0PLp}?k-J5bkC zrr0O_xHYB>N1%4AUL48uzCY@52vUwCkQ0EUc?9^Zj8-nonw@~!%&hU~Z_!OGU*KEu z=3@;fp#HH5vE$2EB-u(jpbDE6Htylvk`+lyy1$_7i%NA!ctaI9G3U^kSXpA#i=*># zf6r!$SU3GD=$sv}&`)e)A&bot8w}w3MkC}$AO}D!nyNQ)(JN{EtF-k|E}V9;skUsj z*_$`mfG5Vesqz zeB>C%jfwsN_@$ijn!xwiGU34^oE)48ic?Z-=1E`%J6jdAVMnS@(@IX* zg?UM71d8kkN}XLvO|7pX^#VwHzFUW|aq8s$fFI=wP=Ie9YDe1FW$*w`_~@UGu9O>! z3QzTJuj)Jw#bYwzG%Aj0PX6FXU_FTWw9F|-wU_z3u1)=#H}ata;|G2SahqgU$~HGQ z{PlCsb&X)Y;L9V*=ac1f%0{21Q~5a6h+f!CyqNbilrD8&M!WRma3$XS;e;yI2_6I9 z&>Fe1##c($%kK7i+1y$yesq(ut&m{*m?wXfsJ21pCWM&iU;c37AqPnV*fW2qVoZZb zkysd?M|OE6oUe1+@mC!@aUwc&Vm_G2YYhFQ0_FY1TH(NpcQL{b+fvt!b>*3Z@yCF0 z^toSg_)GVgr`KZ#=-Mn@aquM2|CDcx!l~mw9;qxI2am^r87FqktABA|dfvcK^wPj> zV#Tyx9y91;#r>{G>#4TKdv0;KF}A9$WS_O_{L6I_fJ8*L2Z-)E4-Wc|xgma$U$B}2}nw@@e0v4H$%}Zl{ZCy6Pxx7&}6&PcL zaPIL~ZG1F?k8|*dZ8&{tb2tO-q?NAd8)b1)6qzxyh zW6w|4w(TvPfbmE%C-D3zEvFO}I3dC+<^L3xBCsV+Pv* z^as3=dn!5LlkV&sXtGDVt8qj2JgPjA&$|JSj*iOV!J*a(PPi)2F2$5{qL?-(a8eK* z=~vzxcy@MN&c_qmo?2g4X+OH!F?&HPK`%`YrX{(>=oS!k{*L3pCLKM z$wUnp?=Fx$hUnTd>!N(>_MrjZ@Xc61T7e|ag_7&SX&5M)3#t2U;X}7Ec_n{fQ8`Hi zF2G{K@^Twpzpb~)s(4%mr|>f0l(*FY>vbPo!cPrGfd|=46ZfH&mymd~XaL4XS0_XZ zp{#}+zY9YOYeMo&X!Yr%_o2lV458eBmRDSIrh==a6KmsC8@pJmYo~KR2+#>2Thp#- z($4G0G0-I{fJ<4%eHbe1L#ua!^}Yjuo&l)(EO-JC>;4FUGH#O+H)fU~>xtto;TkfJ zA-K8Y&SQYZTy1u4_6QLG8ZT&93DvGcW@GMs>2pbST!HUKy~{J3w#@%}$z9E0b&FP)S%ZFEN~ z@fh%kF92(!v%bFKbiNGRPB1oP3betSHHnF-gHsH#u^B`kE+D20Z56W_Q2SNxb(?Z@ zSDrF9^|=XS$ue6I4H0*nLdytT|07mNS(KCZMNA^vc-hf4K zr>?ceX=K}31&udoF)rXuy|IPkV4Z>*fQC()S*jG<*o4N5_7TU19RAT>{kYCrs2;~b z%4q2v^lzg64ZWirLf0sbQ;wp<#}38`Y=?A)(jUb1yC37ej2i|%ECU^z`}hj*c{x7E z5f~>wyx}IEAWQAlc)nUzdwf$78*IRjAXp}L4TnhZPkofn{$N8+oyy`gX;2E;eTt6g zWM_;F7tR^+qzx)TQjUe}M=C;I#D>UB*(G&?Cov<48auCu`B!n+eB#(hdOIhCLto=$ zppEE2t4P*H@DsWziZRL%P#bD&`QX&NrK+EBa@er}j*!{NdyYt!ghp&iRSJ&{E4;u_ zq&S=)*u-lR6BrEb)pWOkQsKpK23(?&^z@vz6kPteN9m6?cg`}(Or2bKd znkPUXY>qY*2i{Uy<7~BLU6!%J$!R>+8p#C@uccVE^bp@XkbhgxLX7&ifw#UD1r zqtdvKlpu~V5PCyJe-b$H1wM|Tc$7H;?Z;t6OiR#;m&vI9UdNpP-|Sk^wC-@_kKG z+NbJN&q=5j=?QQ5<&LiBs+9UtK z4d-H>YP2IycETYynVeN8H9Ddf zCv_*{@vdBm|Mt#~or&l~J-~0I!g;&RSAo^mckd3&`|;z)J{8DUf*IR6rg(24e@x*7 zr0Hd5-`{8qpPU@onaUhEIXM}J+G^5M=uPG> z>Kd;ib3cR}=mFv!<5`yJHa2vLdw^&?!iZ~8+uorv!&K&Wfd7YtJL&QvWLF+(_qi-@ zMVJA7ng#iwQ#Xzmg@!N5sqs{y&A08Ig+B!iQZ6DLkgj=0{LEt5Ygj`HTqiTtR3aDh z?nY4gZX9P?KZrI^pbR?;((KTQ$#Wv2jd8qOvhgBaPXPL{-*Ecr4&3!P1Xl>l=S6!^ zZAO>MNOPTo27Ca7_hD^lv%p{I+2pXJ;btDmY+X2Qh5r2G=9_Jd_XNU-DXY8+a6YmT zi;KQ=G6p}oDOR~RpOuChHi>RtU{%~mn};_PQI>qEO(zoIjj8gv!9`E(!R7(Y*o44Y znyDM&hJ?+IQT-cnY`UW!dBlDM396_H`Krr+%-nz*B$pdgboJw7kYk;qnA$V6f7{XNFW+o39Z5z!Wx zix+bt97B>J8|znb_AhO)$zf<&q{BIbGnGdPBX4>M1V8DJ!@_ZM8h5z)`>f2oKLI<*DxgzKZNXQ5rtHGmI~V#$)K?a(Wu4Q8|4@KOj3!S*eXx zCx^<9jXDkyoGJ`TI~62FWYJ#=JPN!$S`Qj@7PIq7oc=meI60k27YRT)@r*!YVZ!QY zW*EvG%v_~pu>q&acm$Z36W6>8a7T&l%~9DFOY{OCUC_y(a!#_* zm+l6USYNf(_LC0D7k;qBfs^)ymu;Z5@ue3k5aXa?eM3ctHE64=oPuNSGq*wy^ztgE&<+X-!&pIn{>lzn0_;9-6 zFvB^CBav~G>z0}M!WE8EoM`l|^%h?q+dVuw@@YNRVde&N$l9VJN-I_q6~Qz5;1WB+ zG;K+n)lN>?@c|E?HeBB*J3BkJMLa&sLX z#H=Px2XO`bN7dKJ|;h`|8+-j@>+iw~csTXn5Sp^1d?rGdo*q)I79P^s|`Na-!atyH0W$?M))%*BC-?CS6#|uVWl&fks(P z>n7F{Q?YI>l~$gk2|jg2nmXmdBgXkhIgkG;y;M&DF8KuDM4JaT5SM=R%^&~JreTv4 z4!Y^J^TnGQHqvb7*u=0A)sK`x%~*@s;OiC|1yM=uvC}5=f^a%BY^7|dn=6&IORB5gTp|T z(mmKlpTxZAcqwlAVgIN*7Z2H5Y0LM7tNp5fG4^qoT141hI1=x6f=Aof_}k$jsmw+4 zC=e%Oiya>D^~XUV29tJp{#U1+%IzQ^t~ki=+Ae))3y}JoxgcqYZJTN*z_zG7tRrdF z+X*6meB|SNd}@cqx)#fyOvw^X}7=stjD(ita*I z**d3}a3~pPjoGSkepyb>uFA2-{wXg8bX&!=2F+#_MW=eCcxX_8on=?Gb4^+Ppt8Cm z844q{4+r3Av{tsZ*30(hhQA0rLVj%nwji+n633cx-Jfo!fS440!TZi!Mjkx{jBoH= zsyJw=&<`l6N+kR^fvIu9$ubo(j`-&}!atEP*X=-3Cg&D|+9%dL-soTYFXpw|01mhs zM~tPoMo3yWF(9Tp6m@_DEF5eaTW$lVH)BrWMCSA+nxI3hF{~%i7RE)`Gi(8W zJA>*Nr487GF=Ua-uQC3VV~jC|`KtY@`pX|EQBBP0SnJS%uS|2&5B{uU**EY)9$7`9 z6M5l)i}Ma#)>CW_Puk9V@I1Fv$GZ&UF?UtCNOsa-@*}w$@hGkz)s;=rKj%|8Z53F* zMQi=U!fUtY5&Uv)vA%N;z!<|ee*J}Yr)RK{_`y{A;7CT0A6W;d%HrL5ybl%!Cj4kK z_JXHR^l_4LbuIc)b~rpbwzCiCCF7pQcd^ax&TctAJ@y}yc6XIN5#D%Q9zA$uCm;QL zba+?}k59^~6pMEj%KqwS4GHUp-n{mLcMjq(4`^M0lg=_1<56Jr<;3CmSoc<9jKlNkRw>((@t=PSk;a?)%ah;26%hdQ z`jMfEH4s<(bm<$Al{I)>q`U%#y$xEFWQEaZk@oe-{35biNc20B%>?+|7XG0C8zDcI zIsZeiM%FfnnEBG#6z+utKjN>J&<%QuY|UI5$N;C*!H0T zDxi#za#<8fXSnOQGu(kD`z-b7haL4;k%sZS1Q zAQzq+owOi8X1Pj`ZrNmhNUrhp<9GqMuYN-StJLXM1+xBqUD9N} zEt>&-(pw=3fQINc`m9fK;@fE2DR^Z&Wwm^+ObS~gWcvh+J>39DRmHO| zDr14ue>Rk+@Pe1+1f_LTZzOow38>)Hew33ZJ<&p~Sm`A{27FeQd>W7&bKV2UqiJkL zIsL~6K$gnpI`5{!5g3oyu&Lmtm-hj3qiwwv(Ae^&OPo4#L1#Yhb?t~lJ#-c%jkZ4Z z=7RDIZx-2LapS>;#~U@(K#zmKboD1UhdherlTN~oja_WApdp5JJbD(JWHt{(ri-2rP^2Uyn8$4<@ zISYp$Cr~De$I4$_C=H^9oj1M`KpiJdkYzryzxzX#cDPjM0sS7*(HUowD8!38>!}|* z1!;2Cj}0C?`L(V!#-RX}e``Acjz^coFfG0VbEb4HoKH{wo-XI@BrIWF}j*3g<>$(zu+pL zw8V@PVz&=0qKbC}D4fW_alu@Iuf?cM)z)g4`-HhB zp5QUo+-?CMI*3Qy$wALaqLCeTb~LGMJh_tW%W`yfQ4U#38IyMI(K^xS_o}`V(0~#+ zxZsIB6~S+L<;wB;s`4V|4+`Eqbc`q63uk9ru4#z9~Ti2>uZu>bWsCLZ9 zbOG!@ntt`8n;@ebQ4KiEKxACGgl>RP|7|;XDIa!(uW;>Tqdhnbx#k4G4_VmO<4`s? zBh}#a6|=7I0b(9MWnRLM@#04}sgo$N3Z@lsIQb7yT1RkVsl^@(*nxf=ZLS*~XPF;E zmd=c$YsYEYCB~uWEoDm6i+(Iz{lz$k#-~lSR^^=LWW3YjVS35+7;$^e*t+06;?%qy z-SDi95Q*DL0@=n@u=9?SX6l0c!wS6pgDu(ACEoXkB*NWqf5MlGwj44{b)aY;d$K+SKS|gJl8ZX!J!_#c&wLq z>*3^OI5F~>Zwcti$3ZrwI}Xn6on70^@6=PDGL}xyPVI=@8g2Q#d>R>kH2CP?$j(Ka zgV>e6!X|I__w5|CoMhb4C1gA55{Hcy}7<-C+fk`fgOc7 z0k^leO^4k#MTb42{nZZop}qR=lZ;zio9e^0^6K?V&EFkgYyR=xQu+K%DZf1szPfga zKQbgtG5dEMG#{*I7iK7pF%vRPoFNM#XQ`R0>p{xmXQ+M%zz5fK3&0|L7v=S1K&v0= zzP_z)q%)s3AY^(GXz5w9dbERVZj+&MuZuMe?%?oAoEE^VG=?F%MImWXrrr}x>0Q_4 zF7%;mgkaYAUsS<{)uJSWXfySg4{@(mVUUN)5@m)6mW08&d2O4)>&`GWpeo$c7E>U$ zE9IXp@(~b#8S*0lvOD7r$e5)Y0tZl&iLc?QVxJ<*X2y-Ci^y6FLPE7>4 zb{Ns3>LwX*D@`MVz)I#ZOqw{7(~t!XT?;pgTIE~XDvJvcakq+6uGskmBdAJccK#7a z;|!q=6gFOyTBkr>8(F^t5C0bxK+#oX$;R#=$dmv}FBfGak-{ z+Q!Nw(;bcEuwkqcD!@Z{vK=bKMj|#OqDL)dW5_1Ro7J<}XiqebI4!{@@QMu;{l+E|Ckn%hv8%QjSK}^* zwscA{`bh^UI^i&&iuPhFrVdUCZ>rq{bXFdxgK~CuDS_RtHKjuT$tn?!ESf?=;J_Oi zJK0Q|5PhW1vQH-+ZnhgbSog50nP!@LQFqQfg6d7DbZxHnH4gt}AbJ%(LJKSs@Fl0T zfXo~Kh zv+f5RH8?>S<4bmWv#IsQyUq*i0u45e0@%2((Y1wi`gp7gu!rrWvK+_JccCxkj2|}Z zJid2yGA^elN9E{r9Az4l=nozz`~1-bF_4DhjW)~&VjN%8F~{J|`x2pvIb)qwy|TO} zeAyftm18$fCBaI2#9;JN>0ca?cQ2#*hBg#Ix%;NiZlF>6uuJJ!IV8~sfly}$_>*>)4Uj6W8jE&BQ0 zp!$bx&0Vr6r#b$>jWUqK!()oN%8n>6kF*~L5pu^G2h{noR;@MRpe%(C!*EKJHObd5 z;d_2dGBQ#YgppvgWFuKbD{yJkg7fZZI}Ep=i108aCp@8+hig zG;`T@Iz9D=H_T6bLFPSo+Zt=Mm$imRfa!lu@!{Cx6kj+mgEwGavMqDa^^DQ1Q;2Jk z>|1r`o*|vDBDG#&d+sy%Lic*vkPaK-71x@xa(Hl14&EJ<(dL#v1cF|S2OcBl9f07W zH}Tf?R@sy-aP%DGr~JCNyR9bfrAQJUr?E z)z3n?55%>qa%|g@y5yL5y2d?d`@Kt6R$b`Pl5Dc~hZN8WBw6G40nsn`72t&Tl{f$x zt&X#R1!aJi26tTPG7nGU76+(k)6k>s$4T3k0hKIbeiX7Saqk4ICW?}-9|Kde_0#G! zgr9(Y=1uzhLJmyBEZ%MTedQx#YM|W0D)qXLJZO?GdECNhK)u_cA%Z z)xV}YS|zfYdncDyeOyjKA~bNLoh@Dy+Y_STBK+9OE=!T!0cD_)F zLy(O%jsP|`-gvUc&el+KZa;M1^c`f(W&o&6#;%L*cU-fDgFS^omvPGLZ1|l&aK{VxqiTnc1eylHJ93aaw;QVJbyOP=FcDg;1OUPCfdXc2YKm? zz>CX%hcY(D6Q9(gj&{H~bmMf6am3$kQJdl68#LK~_P`(8hf^;41KhA@^luET${R5% zvm*;WYD%;VG$z>CQfAvpwoiNsY!eCc=~D!vkIJJS3dUsU z5N3oPSvUc4+Nwx_Dk#IjNB>ZOBS&SDf!$mtu=7y3wi7AkgI^%n5rdOKX`2FpL<;DM zzP6J}oK}BWU&=(s9Pm((y?oM48Gj8H#}HrBWzI_;CzSG3Bl58mV9w%&ZLZ(#8GwE5 zsHi-s^Ej#Cwq;)R$d0kbhXBsX(aEX5*g4k5`k1eYj(IoOx!aB=I1zaCGPH=kq>X&6 z21gTZz;PLE!l71A(yj1%1C0ssK|GEfbi)y2JBWr4b>J8P&M%kCSmXWZ^s*d|C*^>5 z0ea!DbBM9yaaGHR#lt|Xe&Ahr)N&G!Ke}xAG$3-~V<6jG8+QKf@KxZ=QQ@&h_@E2( zA^L%J3YNhe`+CgKei}kh9V-_20I1+mrykIJqz~eBFl`oh^9O~sl;Pu7Kfs4_(etRO zPlSE%PZ_r7k<@S)im7-L0XW-mf<^y?OzgzCr<~J$Jcb%&A&*B} zd9;+1YW#7|*GW?b1Q*26BLdOj477bTm*PvoJTgBq|J~g^pKRj>_trLGFlwJv7=QzW@K7}cH{-Buc8+c%nb|2^;_QFxhM@wiQ>vBHw%Sk+J ze|UIkryY+Fb24v5I^&?jdAhZ;RUSQjq`n^;4|>)F*BTBMp z8juaZ`$napEl>I6vpmZ(en`m8l5x^HR-#tV;@8@+LrMCKX3*Xr8liv(nDUlec0T{}s4rG!B$oMXhgAv-67eG4m zSx=%Z@6+_bdVXM-;yG7%FTM*v(`(#ZHsIcO%)+>3-p>yJ)wkJxCNxBMRe2$KiA3Cl zEKWfGc46t}R1dLFH`Q=6QBb}kSHfxia3N@M?If&M2dCMPD$5-@@`+u>4JBnb9u#zA z?wE2MfAy4KIsvCX27)6HhoQ>&(yR8Ly7|3~7l-R6czs=)c3tq;*l=^}m(N>oZKxG; zqr^poZ3tU8pM=qkH%;MPNd~Fn%>(GDt2o~Ohr;yn7Gm#En|0#OXd3ffG0bE$G~Y*Ys(63{Va#v_*~s|q35VPcyHU$+UyqybT zy}1qN*!5SKH4;O-g67t%a+q>Ua&l!_;Pk`6K2!{d-)+-rvj z&~EsNomPM*%Ww=pibR(asxH`@4K_N3GmUmiZ{fO~idD_8|A7n7umPvkzyV7X(jWfj z3s35BD5x#Qz_yB)YK((}asWCz(bOJULM7M>9hAhz`cMDFxTczR5v%>SlS!=;P8;3< zhD~{o-11U=7Z@~(=?CQ5;h}umFZG7bb3^5s564Ti6hH+aX(+doN$vI6(b_Z~$Csv$ zIkj{=_Nkha@u|Ng>i5#AJ@EA@8?8^Aj`CN4)o{O$5jHR=QM_|eZhLW zs`Z_d*CU~zM|==ux$tP@&Q_f6;$#%>wBzKZZC&+8uMh+O;=ZAO)o9x`Br*;pOS*e* z=s#5O2*A!n#6cTs1|?{WF=Tlzsc*0;kE7br1&-t+3!QKxVb`!PPC`!L27TC{mJMqP~*p0_(WhCq1{uiKs&O;(>$Xa_c zKGU4nfE6G2A^jvdV1mzBi?4&n96?`@u?cGhbvV&^Cm&-0#~k(O%wxEwk#3$t@KgYZ z<16Kyg4=Mv(4L?V+31N}M%(1UT>)59%O5Kr#yP}P}o;KvFB5ys^cWyj_PpA zzkTyoZP@gf_|WloS6jL&y+w8kMr_% z`l@~8wnCF9s;XG_%O)~swvGm;1{NqaCq}Pa&ids*n@&i)1oF3q ze<(=1w{5shpR7;1Hogb24e{DL6sT8ha7KZArrR(CecUz=WDI0o#(lW0K7oZm^V@p& z@oL>5P@ap(EF43vBT5- zOp<$pFG>g|aU1Xc73@CHqn*i$iZt9^0h*+{BcD5qYh?-UN% zL!e-1pEkZutDZ0ZE>U)ICOpO9;}|S#V1m!G_~{i$Oe1e zCq7V-jT|@e@$rr|8~ zBSUqwmYX)y3P)-wEqwFUfAdCBqr`?r?KF)5-II@yy*Yu8FP0U@jvPCpLjTyX);6;7 zbs^>aB)$`nyQ{eXo2G`;fwr+}WD}|a^JJ5Ue6`ehAo2Y#`Bq*TtTXi(Nk z1Yim+=?$}ZqIc+jJx1s~x|vS2 zzFbyz?$XCJSUcG+bwz;HgA?43fD|op>5wbG+)#T#NU}g;8ibju}q- zxoveE(srMs(HekVa2^1x5jcZv56S4pxa!b}7~sSoJTMad=P_4xH$bBxZc*+c;i>P( zabq03I;7p;t z(uq86rH!0^V#ChIBv{_DjZfENH#-11eYK)qSSsU-rE+}2>A#C|sQ5^_Mjr`i2V<NU}sK4 z`n`kD>34#2QDX*M#Fz@D{41I`c^qZ59oA&gE$k7FG_SK7YhdEYqK`>qqd4J8+cXAc z15VrVC19LjoQ(7MMDHpehbr&(J3T)2JL%w!9LB&D^1epy$WI4QbOow6-(l5l_jtw@-A8zEnSUH5jk)Yhf)#TQ@toq$iDJS{)G`oTKv zJ&?@WU}Qms1M=;=ee1v}-ZyXF__QLtp9_6_yj=d9S3=bMXDuLjLPK168OZko_5DCO zkUSDE%YRJh>#}G7hVsB&_0IMZhG?@4`(&K568;>vx-X<|_thD^K94)L*JHE~$+zW6 zy5a5ny9CwMX*CVAcmr);Wf^gn_xX_@Do^lrQI!O)Z+%45&r-BP($9sao+OvaEFwn7 z)H6ei(}%>lj&27bB7*khde(yP_vf}#fexI50#MzJ57R`PMO`~TC?G(LQ~z9iomS!l z$XoF{0CUl}6+VE(SpaJraX>~_=iD{4`FZs1MC$YD(+%MOSq{LDeBxwz%cG3}20qZ1 zO#u}{f(2QXKt9Xb)rTayADd^LGPV?2kIO!LU0rU9pneZ#0>MUe$qy0ra3CKoC zn+9zh*4Hky@rhG`;RJ|{r#JUfnSBpw^}lu$3QQ$T5A%DkCYKqg#CLko^MNiI&a=v&DY z7LF(>*loyhY*6Qzd_4ta$A{W8nZ!v++d;OZ9ETKnJ4l5ajv3m7gwWS^QLs}$dbv;4 zK28mVV-J0CBI#c(!zse1nAq>?!Vcchi>K%vTo!oBR68q3HcTyFfwXNaUOBc5HEqX% zf{3HoRWUwk2ai1+o~ zJoenyXfl8mOsfLg!kTib@qnYue{2ygCn~wNRjo`FcB0Q2hr!=ACoMU2C;A1R3600x z^5gL;V}114G(;KvgRfOm+rnNkhdI4UKl9i+j?wysYwby$RP$JeiyWIun& zcYUKg+}pG6*q!;~b&57fC(kLbEin!OV(_sEvS}yx1@tv-;e;RZnbT)uPLxl|7LV!T z$VUkQaZRe<*2>QIu5~#-AD5RefA9&d{Z7idRQJkd{93B z@(Z=^s_gCUczp0>aA=t>YL@!(+|EEdKUdb=R>ssXwyw(m<4>g=OG5XxaIX(lVhYcO zw~$ID4$!87WR>)7-J$@k`Nlm@C*wxY&yBKy0JQmz|3J78O!24<@A&D*afM84E_CVC z=ihZe#|-z?xuvb9T8IxgHPG!-eJIe>?$X%SS>bqyR5_;Wf${uPLkq2bDUUeQLolm6 zb*Knt)gQkAi_VaucY*=>l##k;Xrb4xK1v_`2DJ2wxv!)xzAxy*tac_3$4az32f!?* zXd>=N+VT$!UAr9V$7|n*5wzeVz##lctxJGCi`6U{^F(**DZva)+%_g;6WXR^&!$0# za9YT^4CFg}C5VBHf#gHS(Z=RFcoSw;L=~Zx%a7v*vM$S~V*O+un5)YIFh%PQoB<%B z_&l6Npb?lX2lby@IS2Z5nFki&btiFsSq&`82fT%Fv3pNeJ6Aer7!nz$$tS?dER!dA z4gVZhoKiK9jHv*W$B{xzWPIoaj&xJTT`6Vk20-ABQ=8Q|{TFE*G32j&;*ZCDg~y}6 z8NlH^fE5?ICEf6`!Sn_|n_ZuH;M9q3pt&*kDH`4I`}C8PVRPzDwA-pC2`?NiY?^i9 zQIedUk_PZ&bCk|2HWYa=3O;N`!?^&T*l-3tn;hc`yaB8s9X|-m3p^>P{1|eTgHBL` z;dCtnGM|CGPigQ^wu_S()QKxh1mI!TpuxnUC+!HGp`jqOqTIOkAK;X9WOKmA&Y1cS z9(43eZoEP^X#&<^^BsJA`UHF`;H@M8KV*;%ACyW!RT6s=+gU(i1vs$z<}pj&*>%oo zzX|Vg(x#sG|K;Xh_4GHoCAlA8W8Aq9rKj?2Bss|!Q-*Zdnhm5k!*=dv8#NvolC)d( zY~s)b8?Z?v=0gFr%F4TS`n8=%UF&aLwV6$7RD=TpXG(1JaXQ2XmcGUr#N74QQ#Hof zxTbRe9v%}lwu40ItJ+W_(I?{IO}Y4lLnE97I3wf4T{scKUT#6>P;uV+iD}K}cuMg2 z7g)aH7&GCpBP4%xO^1gHopw82rZjV0b2*)Ve!SIs3LP5b#wI;ZN5xtY^Fe9w6zCsx zHJ~#*pckZ$l)Jr72CnCUVswI$`}X{zj5W@1Xq+6KmgD0yzw3|3e^1ZPRbHJy(wWB= z{n3DRP8NxU{^3AnJThK*#}|$$#+DzOT*G;{;uASIL+se;*8S8=ZNX`*n6ZtW7*26w zElv>9rj2zT+g{OpxGHatC*{?_d3keiR!(pLx;<{0+hz83oW*LSq<=|cD~%tm`&w#? z*s32Gi~Ip5Z0DuR{6LR2VomLi6HHNVJ0nYA$DqmDBXvEsDb- z<9Xyh5|&~fwM1jaDzcc{IEHYt#e9tU9*!-_M5Z73cBkT`OUj1d>hhZShhX~EkCS?A zs%@fO^&`E^37p+3QlH=)X6(?H(TCy>Q`l7Iw3Gg(Pgz4arFS~kbxsH#3mP*xpmIzy zPJB`o+2TpL|L}z#0^`x{I;UH(T}8(j!EwiFGv1FH&OzqaHNMzbSK7=;YH&HpCuBRv zn1jB~R2u>=@0@qcz2JeK)DiPO(O8qm<)pqZ4|*Q8-QM1@BMiPswqw6K*x*MSp*zz& zTjw!V+9OP`87+K>gp#?B{obb$BJ}kni zUQYDkBzt#wpnl?s1Nd-?v=R$Q`<_67>k9h$@%Y_6JOBM55S8ye*mD{?JlK0!#^h)WXv%TGI%;D=1c+Z|cwWH25{Y&5KM>u|EgZ^!8)5g{E)t6tC zr_Y|2Cy$?$ufG1;V|{0L%Xa0piA$QNnCWC$aFx8jp{+R?4gWrSh-dQi&4C zjIrDa2S^iYmD9qV!U2ZziI-`hk9Qjw|2Cq5dW!m?uXmeX6tW#HP}YV)SWwt~boz4w z`n7@f-bLq@7Jxp-R`Qy~v!zw&=4gwbafL2RLIE14atr2@A?w<*wvHIcvO9oD#KYG~ z;w+{8uB-v@;+UEHg6RA0N$BVM(9~t}Hj)lNnzB_~ulo@9JA$Ehwmf{pPT_2Db>d`P z?V9Wzw|adDplw7B`kmLNdq6kwZq^P5StfbJ3gcurx2*)OOb3y*bH&=91em|4|Tm!L3QaDr}h-C*t{S| zB2>wZe3(V_;^{K@1%l(aa49HHn)*CB1b$w`*npI_&4P>U{d9ZuS{xv9ZM2yl^apBgynmCx2wuQ@0hzr*cHe zCX)Kr$rpM>JCN%!ixkC*!bzfZo_5QCGtejDI0pzmQ1&}JzbbDIFYEw(bvW?{K{(Dz9~d0b7b?-1b{at(dBuZT zXCcmJIIk}AK0pHY#J1Ij8qYjNs~+*=k()TM)P7EP!5c1KPmp7d5(9o^j$dkRAj)uu_mx~9~~T)v&nh)c#1y}uJr={ADW0x^Un*rL7 zLo)wp$b8}>F*xa|i&%A6D`j(QB>k9g;w`>rEk-`2sP^&)0z0#jEd-oyySop{yLay# zct0P`KIRMW2jrt5Jg$rlc|`cZgFS!93~sKlfLPH|?0`tJ85$1Rv(1tRrG&RKOq5Hr7|l zPd7{Xzx=8GNkDw<m?NV$Dz%VzK&BD)oOMC~;h@VyVADH{Z; zZ^IFE7{;%m0%GRcZeHDOkWG*fw+SZZb020m;STQr1Xy8zMDUDz9~rd~*%soqZNyoY zK-xHoBxsU1psj0pb?F&=Skw}SxXlyX>=t1FD4wcPCI@+vwE@VBVnVjFy;#l>c`HoO z&0~U)R_J}9p(P2sL6#}+u8>TDWSV6+gxrJ$P_AJP-$nS$ZDR7xxStk4%bd%F+|VT| zDBmvh0C8m%MOmpr?rMQf6#P>L1seFdViJSThO3g12F<7ZM7uOmu+t8FZJfX*u#v;z zC%lMNhl7Q*Vm|tDg_8&8pXpR4y0|c~36yBb_Gtm#wCWz(jz4Z_dHW7!ij~VB2X(q44>K zWTAVb>61_j%UD`qUq3ZDKBQu+VX$Ko9-5uDKB;;NL?IJaOnDOFgDC+6|s6 zWNTD)d!W@AWmC-i{dgA}4#aqe8}!o48$ld_>44A%*LuXJjfPkkbf8W`?1t!U?~ z%HfUubG(ey78uhXJlcuva2U}lY|d#qoJ!ClSH0pskJF-jg?wy0k)ug9M5J*lADtYQ zqr*d=IHSK;R&YczFL@+2#suvM2Vl%i&k5;=PS}Jsh;;P*we?ziQqJ7**KpNt9F5q@ z>gWeD(&&m)4jF42!(Mx|wlUUm4gol%a9qV44xOM!4tD3gemJmr*BuS#Bw(KOS zY;JA{f7!N-_K6Q`GHVhSYIrgx731W`p~%;9<579FoqF-Xt_b(L0!5Ea=|3JT-re0Q z>#HN{kF)LF{yWci^kJ?TB!IRtCXfTKkd7@TWn*n5{E>Cp7{#N|DOZtX#vhq*@UgD> z<0aICs2_CM+S>Lh#<%-#yxw!N5+~*M&UQIGI4nE6JHB=u9Uhgvy{+=}Dev%mRbGDo zsyuxB*w-KP6YRfzTVA|;=?`}>CYS^CJNkozUOPLRc0|8=^R_&B{IKjjcv$}MyWf|c z2fJmYeqT~EWp?SNYfrEhU0o9{nOB$P+4f5L;?-68H}5oC{YMPuY;Bi_Oi7#!652e- znAt=PBu!#_0i`>Jolei`WxrFUxw@nzn% zMP1NOrVVw9yFhgO@%$QD{~?$KS(S0yp1ZbfL44m5b5okgL|)(;pe!2-WVOo`T3Kyf zAK)>sK7qQdADGMYOt=V`o!Xdv;r$gbk1<54%OVO0FR@w@Epq|nhuEYX>P)CG59q6o zxkBP+c}IU6qs8EkCjdW;(3xQN_mu(NfQ2)g)j&H4+j@QmSj>bzZr*J;tw4P%tBu=1 z5qlv)RxAp_Mp1`R66ySWyZayEO(+HuYJT16Tl zt~ZqEgrm-7x~W&%J5L;Zth#pgu{py5$SFXTb*BMqJ*Nc0VG~y!fiU-Ns>->4_lB-M zcE+Z`ds4M$O&f1j35U%x8$;cuVn`)PghAc8|%Cn68rRFWNd0Xe3Yilx>sHXF$p=b z;j}JF*m0J)Ai&58%pE!sEC;Y&*fUD(9}qe?*cZ}tbXuP9EmMf_LqBAv{FL3s@eanI zwPR3mZIl87i>?o6on;x1&3~No;&D4R-#q%8@ASg?c6L7QPOL!dO*yf~3;~`5>!5#j z-nou;MvNtVG6H?96yt{R8p9JOASXU>2u{#XJkp^Dxw0(q2JAkxB zWTTBvsem?9>{z_Pb)V1?Xc(xb35O3CBKjsBZqWzcP@4vB;W$7b4kvH}k8uny_onb; zlWxaIbw-${>6I3~=Ny}P`dMXcMv;$9HtFVJyr_d$oUq9}Ix?0+XB$rRjBj`naQv|; zr`k?C%GF-$>pl~WDw%`kp7cylhpLxxn8+5iA=W}32VN@^ZRXz`U6hym=jHXg^YTh* ze-J`;<`h^5qU+Xv+ft#9rI@FzLmC&d)3Vm-Rnkl0B;pS*OUqJ1b_@Mjf8#xN`FJRx zo-n`*NiiC)A=AWul|jYJ@^0Ou!vxsS&MM8r97AZGMWZu(1UX#Z0F$@AH z*&H9Al!JqJ{s04ys^ToOLzB599_i@Xl+K>x(vhz)#~*oO%%D}QiJUwWjpqtB3i|a>NZ8c(DjLj0}qEc>nO5#M;zlBySP27hkrQH!com1V)#(V;n9)X#ryrR8)IN= zd$Vk9ZTYd-wY7SBPxiXd9NXI6F59X@cW4d|5ABRIj`ZW?srylVgKa&BWLHks`cZEb zu8K2HXdANN!%4f*dVJXyy6x?4&CQK+bbMq-8$#eozxy$9wS##_Iq&V`R3_Jkt!?SP zQ5~!Nmrf`}*5gk&I7X4dW5$d>J}ib>Vrg8~q`kde$sd(3zxcv>@R;wThYxMP*RNie z=g%H%EWGpl#D`mnTo2m>+>ho9Q*2g!=~v{)2)~0c!oB9zZVd{lg9i z2Z!bHkDr%EAMLr{SToMgWdkn*(pi1NIAF~4N41U7O4-rk_Md(wgeC6f zVrIBONWuUl^%J)f!f;$sfJ_s&p{>vSQ2b*;%DyiQ(Pz7c0Nh#i@1w_`3sU!aZ3J4o z{21*L&$usZU`S4@Lk3UC3d+|NWHz+brjKNozJ=V7crEP^RNcJ3w9Io-WoQ{>5*$dp zq^mGkMLog!TG)|yiK*mFNSroSa9=D!KMT5ci^){~^q5*s(}qs&-G!TVic0c+9!R`S z)-8bksdv&krkuirMVK`(L;i|C0z$>D{6JW=754zM*Ux*824Dt#7F$*m8#MCC&mbLy zmJdIkM2d6%0f_?`uf~*Rd4lT`X;BdVZ6qlV@FY>3dE%-18ZQb{_+CA30SN9YBq0^; z(GRjryc-n@z!2>nc-=|l0P;W+=fX_YvXFksbc3iHR}0HA(apUEC+mi~Hqqdd^x!w- z2Ffp+@)ToWGf9R*fGwDA6LFSM%x1;TKb$Ap^67>-9DQv6bW^FDdE@f&4{(&XlTc}& zBE%7RRX+p*LvB)`wKIkd8jikj5O|ZvX%*G;F#$GYI4{_ob3;x!JlJgD@B!Ea`OCy& z5I3;cfd6c4(H#;tUtvIQ)^pIg&+P9%j#o7jMecWe%2vuKEINBK>ljDAzFt+fS4Kh{H~y)+Vo zTEVhvI%VZ%)a_KD9q`Qh1j|7e>jZPQ+*E|FXv^7zanpJ2-1GdQ4rc_;D5dQ*s1Am3sASAs zONU|Lkq$iZ5Dpt)PFV4Q2;_lJd3SO}HemCf&gIZ4TEwXumJ!cQS{zMOD#i{@p~$la zgkxg^r<2R28~QUR2*LsL+QDy*vY(b3+4@{#>U2D@!|v$hyqp|!nrU1PkK**-$#Hf5 zjX7P$hY+gsPj=c+Sl?LoZjEYM!vJc#*;i z9!n%Gt(H+hUr?88klL%%s>)WCR+oC+%XJQ(j7WU0l<^+K^^H;SDLcjl_6JXZ6h>T? z7UB|Q4?DbTM^DkDU8F<&VFz^KtL+oT*eXv~;tY$inD3&iYjYjj*c9`LT0CMM(8vhc z!X=;U1M|!878P$CG|Vl=4PUYqLg=XfF-JKC#$&u8(>h89PA2{c;E!TdXV(uu{NN8i z94PI+6ffo)4jpu){p8`nSV2h66<-UGDSgt>&V0fd$M}U`&@_OJh^t-%Ak(V0-S|TW z>k#dOkJy*3?QQW>o2o4OfxueFW4_17N3u`YmoM`2Ra~5Le&n{w!xEgRM0cN{#d$Rv ziSL^2%ep}Mp?L8%Ut}>a@}x8MN5?0g2Yf9z^@e}+(S_#Xik+@F0CD0$L%%QvIB~bV zxn0gL&&&SXeLMR6WPsWO4o+7boYY|lXaN48MBmd2aIs>nyYcD<)-BTR1KG&VNh#*> z0Io9Fo%aWR{PCxD{BrW|@bF0ar*Z94c>46C^6J&AGTPX*-Fb%~ef{Fa_vPW^kK9&1 zLV`2%%g?_kySuyP+4E=acPx?ih<;uw5B7G;8{R2s-VdZ7?+5(G4n_VzG0{4~M}j8f z;v(ya-vQM2B00iVdXyU4_2R{m_S@ zvJVBV%o=wG=dfihOS2|;9m?QAN?}9^Wcy*bP|z2Uko5rRwtpM_rU0F&aD9s~i=cwW zRNn7rzN3fKb5seg7v@i0;?{7Bh#SyjaVOdyWPjAmb()J&+YZ|011*#(WZZ)+ZNtq1 zLEC0T$~I$7(yz+}Fb5obA} z2i;I*VRAYPdf?r6Q$B@8CV{j zUYr^vuX59oRv8;M8JbNS8woZc-WU_JQP7_r5g*qHwEHFv*3Z# zi;WdG&D^T9VG9B_qbfmXWpkroTm@gOOh+CaL?+-%pEwrbLhF-1;74tfwkZ!h{m6FV z?1-CgbdFOvDxoou)lI3A>SB;WA8e7}n+ZWBQ3#oqN2qjh!L2&fa&kDP$VX9>B_0rU z5sc(M3B3Ss)Kwn*1D`bZLnk{XO&7ucV5KqR$8y!bevhE>=zg4WLBkhV+0^jfv2gyy z35PfNUHd=+C<3FBez)m?tOa*nmq4BM^u-{8s9Y;WsD_aP6>v=UF6Sf zNZzXYVySQvFvbjyM~@#NF=y2*kutu*KK`hQ@KQ!6t3sP+?PUJ=5ni>4zK7Q1T$rR8 zf6T{N2bqsCzG*w{W}YzboK`KTgA?HE(|L6+a&nDRnO<+yM>NrP)%;@)!pC2}Rq)uC zd~8CDa|^IJWlyg^=W!Al=P6DqPKIu7@c{--=qd01DHFICaP)xbWZK z-*>w=NAaG$*RNlB96fyW$S3-+)4{=kad&pMV_i`hk9l)y6Z>$w4n6bKCU81FDTi;> zx4K4+HaC2|I?-CPF$CA%! zQQqOl9~}6)@6)G`Jr6M`>jsWMPV7k?0qw^Qkxtlq@SuG2_179xTavq5zWeS);fv)D z_izYaNxzkHbnve1?QBZ^N_qSGbs5P%JU0DcYqh+4Q_6q+3dZ^``^9^rW6XF#b_MB> z$FkBvn@*rC2gDF$-K_fe1U+mJSEY-f?J4n)$=bK<(_8nPgH04i&w4t6s3l87B)d!lE#6%KmMzZ@0KSjS^(CQ`(GxNtcSsG&`e9J#ep%)TZC$2s;Hw~Y z)OE<|x7 zY1@){;1+&&64#THS;C?w>aiFGDie`N>5hLTPOn8b_7cC=^~WTTC{7Sn{66#-<0&+5 zUjwuy(=P!81so+L)A^@O7hhT>@6&yDq~LH-`Gq!De&iSWsAoeKj|8)MW5Y=vd?XTw zQ-mA;*zj`!Rh@3)*$A*bVUMC(Z_v28WuuB?Avdnt;RQWu0WY=3;b%6|<&wH+#I>x7 z3;2YBa4Dgle=e6UY^1ECH3%?|CLP$4g+N0%Jus8&z|X3R%|?sIp7XDMS?zR1PFm|g zIhzCmy{`EYQtS@$D< zaDbQc;Ig5PckWe3nhN1d``P496nJb5=M5WYoHTa+nI`zyk?1%=I^;68gRRQ+d;O5X zKQ{m9X1RoD01gS94gt}Qa8`;&Ja}{}oCe|4Yvo=$1TXAxKz}xYc66L`I#4v`B~d(A zsxfR)>St(GT5-_pvbIy@mQnSFm_Ae7^%H4Dp)J`MgV_)1TuFz69fV4=A$OTJ!?D?} zPBzim2~)?^nl`O=tWj3$3E+YUkIvzzKuiGA>4~nihcugT+JYX|6<+W+U-U+fY&gru=w~bSjoKiv`w@rD{c3x3e z9cFg0(7!aACJ2YkK6YWnftInzxT8+Sa`4A2s-4z1*3_2E^5X589|Oh#`0gaen2|hO zuy&+lkidtucv?2=ZdPANSN_0qUREW0WjP#lYP!OT^ojA!h=V;J3&9~W+Td}~XlEZR zvH|)Wn=!V1YF2TMrNqVI$y#M6o$8raIB`&taR4siO7hVQp4dN{$2-{Kaon7j{7c@9 z9m>&+=HuM*I21phDpcR#P@*3g&p6oD*Ve_CaVN`Yj;dF}!KijH*Dp93C%!nQcK7zw zXPmC%1RU2kjZMZ5?X}!^#~!EWn1i&#V?^@M1K@FB+K=uY^(V^ExY~wP`FC2O35ASsD z!J9r|er|4Udw%1r!+96>2*6plySwLkdvZEEUUHS3a^>;Cl@e5EV$Sx>1u z7ah7{bNUd+KF+om-@h#1e)mE;m9o9Jqx?a6`QlsYvm={^eI7pCEgwC4T>j>7{zi18 z^4U*5DS!Oq-u*PF?Q`tR96UHY zG99+d{*_tE_V#Z1;>$0}g9jg#XV0FN@4o%c>jVzlk-GO_tZ}S$U|nk&*JAFG=rJCB z-qTw5pZ-zvi-k}2w-Zpjm%*cfDBv=*5!jrai2UL%8<^cvXIPcn2T|A5x21ApRb__m$Jo%~Ltc zjiaBGIfT0~B*O}QUQ;qD5O6Qv>d1nFJ^&E|FKGthwiT)Z^f|Z)t;`l$cGR2Bxqv?1 z4L(Cm6F^>2-$7`VQ983TMc!A|EIn`GcdI@_&?9PT7vVEYRl`svOj}v}RQcUJ04ffU zk9zf>o2K1(8pfMi)IfATa&{7RP#14vP@Lt4n*79ccKoT{AN~M=Fa5GeQqH>op;evh zC*#WNA|4f{UOM6^;&dQ4pQ?45n|NMM&lXYpOmB_=KZ>gb7>Ai(P_H!qaPDyP%pE#T zBRdTskqtTR6-oWNd7>aG{WAnDm2ASPV}qxh_)+gonZmVmDK=_=ip-z(llI0f1X-T( zgb$q^S*{8U)7Cx?2ZvCV<-&3OYS28hQ4wK^AlX<cl7@LfDpRmD^B)Q=%!0~bI^kWkq5OdwSQ?CHh?h=Y%> z`5y7e;hEAr-phObPRgnBC!G2_JJUF0UBc1D={g*CONB4pu507WI|l9i)B1wb7l-uO zBu)wXm(C;=7q;_9pgBpz|Y{v z*gZCsr>(MS{9%AUCTZcH_A$0jPfyC5w{QKJ=c`w5%KrX4e-)SY z0D3#1q&QBchkJW|{~XF9AN_MIDC_ZlhT}!s!g^-rHZD!V%m${+sl`|{|)Bim|wbEUjKx+*)0QS7bkytlin z>&#Mlx>?G9^;IcfpQukcnay~_-r2JlpF#!dSt_D|3ak^v3Y2Gnp5nOxkK~hS00UB% zWwt4HvSH(bem+ zt`MklB>qT%d^cK&g$8XO%%H{Xk`MV+eM27lbCj617h+( z#sK(9V`wWE0A1WWNYW{Of_|QKTShwL9PkDuQujefMlG}ZKy5?HAB2>3S2^>TF39Un zB4@~(*{%VYDKBjRBvNHewxeqpbc;2x|xo0VsI7M?D393>WX6OI2~9Wh{gw}&M!1_v109Cd;^Mw zw5`@uL9WuexcZ$usvzbDnN16u8=MT>%wKBL2sb+rbkhqzoG53d`KH8L&fg}F02?~5%9lrVH9=kFPC!Y8kFJ!=v`jo*xm%$Uesgl!ifQtNse9Fe&$tU@Odl==O3F?Hn?ML?BWZ+;ryGhX%#ISYM+V|P3mJF z;$_}79k`*7`%7BjBqAL+IPeq;4_xb3b@vHD+5m4+x}V%%(M~qRiEl?Bx>x3Wv>{9f4 zA^?sR%$K}EIELx($a5MC90$sj?|9U*7P|2#V4mf8>*$mYos@T(g3A0zFAkm+PFKZ; z6(X;BtvQMlg0Y3Rj4#s2fxrJ4puk5ikTIEX`fH*MHIBYhzsK+3@U(j zK~x-QGktUzWv3@6J~ic!d>n_<4;!*p@y|`mmvGNxjNr9pe#T*;8p8 z5L&rny_22J)QlhAo|ms*kIUCToR>GJoUXIU;7$V+Q;_ptV0i+Nd`(fEiel(s=Lr&2 z#+s(JS+a4tF&@o?KW<0}J;Zv1lXR2!0jhoUEp4K_lUKo{v`sON9L6xEo@at^?1UcR z(9hsA<{9T+hb0$BTG|i5A&c#>Ee>w$MmvO)<(%xoS%iJjk2zP3rS!)B$p2Dm`Oxbz1$WLNTb zh~re#+QA7q#%?$Yi=CP8-W^H@*0W1H&T-aq3J@F8NAAxW0QxL?G~}TsV+N-+f5hQ& zTpVeBzn_q($2QChY{4VK0P~e`&*Q@AB(q3It(nYQjT`qP&ZsJ#b(gjr9vp}d?=s}- z9`^GeUFbW>f)^)R`B=&7+DbW4U(qLT_urLQuU?jKzx~d<9z1wZzWeU`vb(ceo-7x>sSo|M0_0%l^w>|H@8B);Mg36A(bo_V&mp z1o@-K<0pG%b$zpZ`Q;bo$+M@L!|DUsS<7MB*;*~fS|3-|)Xys49<7vj`=$IpUr2MY zLw}Y8`USpqiqMhKVdP!NSQUKzRpq()H))wA|y?lR_uE6S$1DY{Rz4Tnc4gDZ1im7YX@LX!kN%g|45MR zJ4@dO7SMAhN-dZ}dOOS@Ze?bg0A!vE1$QD8V1pLFg&TdMx(2z`787H(l zkZvb6KpJp;t#FhGeW2XPGr}yo7Aj7%0p^k|!ZV>|3M6fo&*4S&t@CIei1%H2%vCEZ z+RB>l7X#!wUQMNL)S?2&n2Vv(z7tdI{_cpUp&NJ9ktTwcoNoBCj2|{?nWhdpJMWa% z&7nWIQBMW>w1JD7@MS|3vg!?nv1&eJ z%2nw1+rhW;V`FQQT4qojn`b4RjXdRSAYMoT##WntoM$-Aw8@Rrb2!07&p&PIpaViT_=OzfDNWq*ZscNDPTBEj z7yRtlp-f}Z4nmb#FX}Oe0#gb5!NYlt)$D6K3q`|5I^O*k&N|wHQ;qkASr@gJlPY87 zacbg-n&4be7}t|!;V^_gP65&<)?G4}C5!h3BHfNh@s2iK+ubJz6??QO9X6@uv`hcc zgFd7k;F<>kIpD*Gw8{(_3(Q-2pJJrk|D!(Xh|QNgvFVY)yw&*AxWwtv1#M(;a9Agg zS>dgK7h^c_=?VIW)0Mnb|K#|r9G;HLkv6o4M|^elq`c!XIi-&k9~>Q*6Vja2JK+Nv zysK{_E|=Av`zXGf6Qf}?>v zZOS%~Ch+3_te>(G_EQKu1b&#EI@%unit~^(cH{(=R4Cu=UzD$2pOjUg0m%b-Z2Jma=CODE?i){z`zB~2j-|7U!R-UVjWsNIE0B=C;T&IzqF zkAjUp=ll4WTTf*fPe|X}- z-UBTiM zyl(hi!fsEDcOd$OIlWXKJ$zLD=C{A~i9b${9%^lR{_(T&-8bKtM;|@(xM4ow1pNCy ze(tfsi9(q2zQfnA-q^|c>gB8Q!>iZjlTV%@!E!=w;PEcOjg77H(W4!|-}If@!g~T& z*OqkM;Z(C?t!ea$dQ4+sy{xJH|MrD=&`_0mUWlu?t6esLo1`BG5JmduB15L9=Xs=R zoS8*nitq!#AfH-z-H3n|mpbwp4?#;0PKJ3j|IpCt*$?Q=;GPBG+!f~0w6X!ouR~}G zS~CNIQVB)SjynU1rVr}n?z%joBlti7zsfU{s21t2WL(U7&4WUq9-y@~(Va z==j%AWv-Ne{x9kyz_)QvEpNknPp}?X`hDfxLO)gA$joNm8|D!At1^$w1eftsD;an! zEG=%ARw8H9U4RR0ACg7ODp@(lsqkH) zuS@co!;7kWiR04`T7!Yu z<*L^hG3x-wKsdiF2e_LBsDKAfyTox`F*uaBPCo{kaa8WV#$S{r9{E+7ohsT`QKsFI zRAz%2o6Jx-oD&wKGByruKG_8DFHn?MBDMs&LFbnZ2JP1-%uWZA(uX}OX+KWOJg5*i z?cA_)6U!!$4L1_WTN~qq<1%93?3)UmBBbLaog=7_8v^6k;ESMfqR!45(T20;+JS-u zJ0q}-^tF>y`laIxKHvguxG1xuRB3=ZL}43=kUZhi81Z3441Tt|Rw#s8*D8kdftY|U z06Ksl_38LAfz$bjuW8LQ=p(TG(7#F0`9zRt;q7h$f6ibJbGD5xq?vcD{C2 zq(ck`QOG}6J0u@xo_JhNWDn`jBYb>KlT9nQYTu!f7)p<5RxY zJ1&POXXV}DaXC01m!pGYZKjXP!QqLWfbrPxu}}J)o*b9>5CLNchY%;na4O-XLq4w# zxGEcKIPa8qThtE5#My}*w0vZM$2@WB;5m1aY!xoU>$tXk7Kb9c1c093sdXPnOEd{c-v7<+yzDYFu6& z#n|xl_pnu8UAbWjtXr`@MqWYkS?@^OX{fZvlY-v`NI$8)>IKop`s4P}qx3JjNF|(c ze8F^mw9&oa5QjplVV*Ri=GWDZaO}Z@I!>iY4mL=9xZ z*L(NhzKt=1Jn3j#$bOgN`T9*fe$5A1&~JBd*N!*dySKNyCwZ}QqZ5wL7cX9v7cXCE zt-Y`#mlJ=C!TtTW(&x}80Z|V%T6)`qeMBP91yfahmjpA6}PFe)6<@|NReTV`H;?`q`&t{|%=lIb9=jd^6@jtK^l@H7?hx$fB4<+%afh z9gSt$h%?mvqP6e8{^Mo&eiG||Pr5VLl|g^s^W-2#C>I3El$F8UP9WCoC`M=J!LMZr zPPYX^koA?mgWKr(0KR#UXu|;Xi^)Sf1Kp79+K|wu{~=+>hH(kM)-m&RWh|LD;RCft zmk4_5;jIn-wB|Li^bic%6hLRE=UYo?Sw8kUlT6V&yX2z zq}zf8z%ph*3Ix!Dd@V~^#2Nbfu@N9pk(&Y_2LR2A}HUDmo~mmJC%LzNIz`&ypSOuo(kyFEpiIZ zfqF2rJTjlc?COXw764-Yg3W&KWw?0uAZ4u-q#Bx=ZvF~|R zE{g7ko)SAVDlKuQsk1`^9<)ccW7CxU0n!diqi>`l*tvsj+CsjT;ZQ*W?F8(U5gwZ@ z^H#XtNQW+Pq#PQT!%=bQDtxiZ&2iL6jC?yDD-Ad)=ej)fB2OI3#U@(_rb&GLL>dJB z=VT5E>ezVEw%{8~a4u06r*CkEv5Dqn9-GOk2mch?&XyN4GoXicCYC$`G}PINg@dPt zI1zMO9d4pke+3`K(nA8I7kw3Np{+cA&R1GVGYT0OoR~rv?2n#yo+)-a>EL+O6YgtN0YGuw&})~+Uch1Ic*Zm%`=duDl&yvGj ziVu6>bXc`>C+8O?XI$|0UK}udiSy`W;`d`69LFiYqr+ou&~fw~s*KZrd_;iqcmysS zeH~!cjb%@iqkL%*Q@>*B{qJ-pPkUo0F`3 zw1$&rs~VfgK(^xwFkUii*j7)6K7k#lUPEVg$ zT;XfVIAJvhmsiWd(NTHz@}+F|#=6FP7I(_d&aNMmrk~s{>BM;BeT#gx_x0=7n(LfO zoY-Ob;)hqhUVrrXNqP3{S^4PEBYzl#wqS3cD3)FXZ1v#5Zu$7r=jGYc=RUcKGw|R3 z;SWB6_|wlm^H_PCk1T6!Y}sy#UaBqrfDz6~$ppZm zZZujedk-F#-~8q`<=4OZb$R*23xB|aYs0&P!}9U-kL>_OZ{A7x!zH@4j6s z|J}a$t_o`+30@0?&p2fLsCjsxM=Id?X(KRaDFlJKz@y0MNo#~CTL_W}UD|X)^2z!k zNV?m?5X>r{2hg-S0{7u_ALz>k`em)H+B$}7TSwf64*+I^4275-wTz#tOK%t%;$Hb0 zm;vM~YNRuhpnOZyAtxk*meKn{3WOhj-D!brKcv#{t;Y<)xLic_tk6K*Cq%k~0lY#P?k+DHuaJBfT(w3raCqq}*gQ2q9V2Yo9=uhjbkb{)+OnxY+GJEd;B&Iis z`>o6}pe_HvkgOf&^t}( zm52zjz>xSM7{q~?j>-9)P}B3KR@diMftK9RURH$zzKclL@}xIyO}m`DAhT>XYMPB< z+|;v;M{iZwxks{=X@N8in?i3?*!;&yK!4c7X&i%G%vGiv-*5mD!;8&aI1&BWS&nC- zU~hFOz~K_MsA!VsTLk@&HxzN396Gl{oy`iE@pvVh-Z=T-O=GQhJ5}e+IP@xq#-|3U zSDKq$@CbHxaFbkV(9s)GCD^pk9AX!k7Tpl9yh8rdw!s@_$}wNm3sFDFiBv5Itc&uZ zL4SgsE|PVf2Vb_AZCzG*+Cil}n{S}Qud&nUp%6}=EQ@mem<~u>DUE?v}aHxqB>`m9nM2^yvy7{-`O=&-xi!HE;Ek?(M#&L=ID0}y7bG|KK{yp+Y(1##m5eO={FwHjT56dk#I0*LyQbg_$ke!c%1m-kv$xc zelMoNWHJuNpPhX?nmx873LD!oRNGF!@?JljB{&0UpPEtI5~ucXX5!4D%+4G&c4>Ld z4niDKYYKi$R=mX2c5>ff1o*J#C}11%$c0y|AG9GJ@$@5+Ypdn-yp(U>oR`0UF)m-c zJ}Iw`=~w!#_TQD{J10Ks8vq|LeLy|HSmr-#n3S@aN6`tY<=R*Ck4adh4U9a z;jHHrJ8j@gv!~_Y;GLb*TpJjRyhl&0)bHp39nRx5JGVTJROXX=;>no7(Tx5$sc0X1 zAiyUoX)`u=n;DZ~BkTr#HMM)RCOhz2A$`$-N3|J)jI$HzcXE6z{IIJGVp>HmOEc0} zoLJMi_faAf#hlNM30d!#eJbm({Jb(Vo?`UK_Hb@aZ6aGZZHu-QD&*_QFJ8VZqs{HI_i(qod;8Ao z?7=)qvEW3^NHbCd9w^?x=%}g6wK;di`>9)QtzX5$) z00VeZp@VsBnmW&KCu;mYFx9piROWjh>TbwbP-w6DQzmNb7GyUU%!40={=jt54>Gg- zK0rUU^p#(n07R$_sgkLd4oS>e{9^(}xUU>^zOS_^&3#Bacn{)ia;lFFGTmzL{1` z7CxGP)`z4h2sj_?*h4QxO7Npf-OMU*qs+~OX~a7>_Qc+7soom{p|I%*eC1S!^N(_H zXtU5vXHbRNDsNuGAZ#@XRxha=82!nth}8|>Qumd_~=Hm2BujZ%yWI~ADIw2L$}G|~`#9jEI; zHYY!D+>yrlWG5hcxb5gs9hA~1KZ-(I?3_B|^dKKciBoIf`P86-+lEsUhoX5_S;BF9 zRc4-)D;URZ4*7NzqO0=Qi~i|OMmis9co0XOaL#!o#tlkt7{7kHy2dqO$`?G0qxfTWRXW5569Sl5J zs!F`ZUf?ukENEN^hkoU~me5-->AA6vvms8i;l$^WP{wS~htn!QV&FfTsIAx%XBxKT zWLlmKMPc`wtFM1AOKM;|OOkW1}%s2edWj%#qR;KGC>2(pX&I z&?P@??{O!au?`>`$EdPyGi|5o^cU+M>kjQ=?!9@l?=`^hB*a-4Bw9-~9;7?6cw`#@ zkA4|zEWCL2gXZRHdG_(g<oJhnuh_mp)!$+cj zXgQ2YY~g+vEwmpGf3!VNN)*R{3%Nx&|areX&svCn$b&=dw8|!wtC0IOjuvKop%^87+W}6}WK04aMgEaIWi3vMFxJTe z+=tTcTIrYwOZy~ZEPBZ%VprDup95Msq*D*z$JQa`wE>t_mNELZHp{vn1K`~RUyc>i zO-?&;9jp#x(EXdSlT%?XP~UIYP}zL}9#cU-y^w9N{(#0k>tUvi*QN<=xdDZH267mH zwz}WWmQ7Qa)8|9jCHrZr4PBea^xM&cO4edHP}YPNrpoWqhJ|oJXhS8si<}|o(^l5? z5#U-It6l>`5{Jq@G)P7_O708yp{+Fc77O8f=$&M4d!4i`t4z0J+E5debFmwu0Xnux zoZ%J#WvW>{n#>ZnxU9IIDYXn}(;c33flJ15BwarUy^7>B6aO}Vur(gcY9DlvLJ~-~ zdDZtx7J`PT--bo`wKN^{iNze-TE-wjfN^U5p!|WtWXHmLo2(@`+BdJ?e<+b7BE?hXe4X=3Qaqc9I@>Wgw76YC@ z`clNZ#_WWVp4{|tqYv1xF3RE>&8JERoz#9UUvBB^LR6+kGp3^pw zr#}Cx4>MT!B4;+jSAv^E%nLoKiYEIVpUUAWr(l$2qXq)g@n9<~kqA30trho_VB z&Fk~>Z@)V!fAk~3F>je~8f98)V%=e_CDx!7Gsa+yS?86>wb(I}Sd%v98T9CI#o?f` zs(PO&*1vP+is)g%sW3ju0uOXt=KYFl15Qn*j34Dz|1odvY?H0SZmV_>+1aOla$e~T z=U1#%AK+(O;fRIC&MKUVeCS|oz1djFQZbK}H<9uy8}^DZ7Y;Jo&M7}m{=I(v)??>vf>S6QbIdKAr%M_K*yvni7QIJX8|oKq zv{Kebp$`r?WMeY~u@>ed$9DWGhCdEKob9xkc>s+cHx*xS2z{WA@yA>~K9ydIS$}X= zZ*OimHm$}aPO1HO@01Vy{Kp#ogDZAK7Iu8Fw^u%T_|W!0I6Uy$oFDhV(aCEL0NMp_ z_km)@%&XV0{rKtA=g&RXS^IEA@xIA7JVq_~yASp}w*am+yswb_pZ@sA^5n@=*=bpA zP^A>hCjaekf9pr9Ih9CR$SvjZ-+kv{y|cURv4Bm`>A~KP$K)4(`l5XN@pJbR zZTjTXXLe%$>wo>P%fm;H%0uaMq;=`#%eUpb7hjeKySsi|myeHds*<_JwT-VV`#!;A zKkgA&erO76aw?q*%l6Ku#|Zee|LEwXJb(7QeDl>;<)V}Ee*@UY4KRC3y zWSn~anf2pxlrrgN_hB2dT(Q%=IDx6 zBIgzs*+Q}aI}bQaNf^Z@p7;8&c{a!f;p~gxQ#fpLI5{L+s8lw?p%9KgHhwq}(ow`*^7dKwWV2+8 zQl>zeH$H&z94Q1H8;@|p(I>>FwjOLslaylXA#j=GqcdrA33=274^F&I>bf_5d`N)tg^e79A7cz{`Jw&T*G=yFBu;)U z`@|SDc2wXHQ5iCk-N~=|_*9PRl!q2P@KqKY#_AxUOadv(V41|$O=CaDM#WR9odSTz zTNAq-IX@y7Be?brCC2l(qn(UJrZIZSM%7kJ(wi@t+Tkm^pPyZn)ALC=JH=6`GOZ`{ zBYooyt2TMeG9Kw=P4Gu5G=G*>*$hUzd|DU%>pa2UIj$Ka`Ch-XvHBnW%oEiE)RT_B zjuUx2uE~4EST{K7)Zzim6`WCzk7XB{?+de%YXUT`{n=j+k^6_*BZOf zXx&{>+uRqjoqini4m0M8Pi)JQex-xbejNilZrRvtJ3MHg*5uLExNNSRmIo^*Wp8<0 zHkNVT#TW+A7rXE%;gcu3<=4OXto-ulKP^B1i%O{a_oQ}terSM zx3+hz1E-g%<3lMp^}*%cfjGYz)4tA`c&Y5~A1i&~Q-6#h)&%5wZBkoKrQf&ylI^H` z^2u}a1&B2z%Qs(r>koJQ(|`I;T@F2T#P9a^%in+gr}97k_y39JnAQ}g0rfHo>%8B+ z_v>G)Z+AMrfXq<-yZ`n#w)a2zC;y)MHFVN+^Xmxy`~Uto(Dqnu_wdT$fkEwmNy z{bzg2t^9zZr8#GL5`kh!> zsa|DQj4{?A>NK8J&sLH(?)Y4I${$^>lw-B`Y_hB}_4oc|`Tlgd{ORDT{J(XJcy_i_ zPIa63O7Xi%<&W}o@-i{<6o@(y9*e+K*^dO-WT`R;A6kdL9QgNTpc9aK5vQL07--Y) z2^tnRpk-}!s(eR1xwUE#+H&J%+xn30`GD&r009IixYz4QF(m#Y23xLJEkE~k;@E}xq@7=_EGMG|1c_=2?beiL- zP%CQG;by)q2Qq&zXc<=+C~`h0CGBc;a-Bl9mvpCFrAhogPOa_|$%_DPSAQ2s;vras zAviVo<{%X!B+TNI__e;5y%iES=>XlZT^IHkJ6#@ds-1mm4}4VMko<_kQHL|4>Oq>eQ*TK@ z6MU;=)uVQ5;^uNg-qgni3^|mM&Jer;B5l#=sk*p<7oPQom+H0Kv6HL@mpL7dKjVUI zU{fc06Vq0eR2xDUv8qHvnv+lyoIu(HvC)rHaM!2I{J5TQLJ!79Y?PsA18*Iyi}L3< zXu@$sfG@$$B<+&mM?M}w<$ZtHNxG}v7O#Aeg&ZrYc4U9ik6~w=ni{_@7e1|}dug-4 z&NkIi&t@%7DnuQQ2sZ3?woyhvuIgx0=+Egt997}4Ovi&Cd##TJljn31Z3dT3v}t_O z4m{BrN3>4YQ+lm^MFUTl*EstE$A}+Q1_wthX_YxvS(HPEQ%yR-gLoV=d1MY}TR2#P zKabp+w_+as#p%mQzj!a1!k9-!&&t(gEL-55;@y3kJKB`9d0ktn&RNZ29_3@aE9(${&K(4f0F5O zQ32;4jz64o%d0%L8hM5QWjJ*=Hnz*o7GHkl1fl3Pb~p{?`KdA2IRGmif$;};Ea|_$ zSX;*zP9bzSIG&U*zB?+v<0BwHOv*cLq`e_e9Z754`4kN?yfwl&8R$RkScc>ivzFvq zZba5Z{VESHY)mQgSM7+!MzjUT0}k47s2v?MzQ!7VtY=y;a4?FN4?M7*;(+x@I@&LO zjC&lP@Ft(qiLs4OXiC4F%h<(pO7kXD`mMbG6+c^3gb7 zSzeX%i!_tyhhphVzry*mVaU2d;jYB)KmpnhcM#&D;{BOt`U)p1CoGYT{+u}U9}+Z9SO*?GiVs`x^;_1rZRz8_R^aQ?>5a3q61Lhu@cvKmJ7c?pnv#o_8<)?svZ{ zj~_pl&g$R_oJPhe_nY7RwQ|elqsI@-7g|n?e)7quHk#ic<57n2k+kbU4!3#{f*a5{#f*PzyDo%`}(!z-~i{*-e=FBmybjPUjzKrmv3Lc zEkF6}xxWJZ?CD2#X476y7xMTrrxekP>lXUNby@9_P3ixC^{@Wh^1I*vLE~?!Jb4`a zWe$&b*0NWxe<%+hJq1@Z>`C{c@$8OqNxqxkJ#}LwqKE&!y}sUnZA6%d7lh=c;UPsGmor zJlQVg*H4zqKl}Ki{LlVksr*O3Tq^(jUtN~}ox=b27p44fl>ZN(UX}mwaVejw!F!so zuTRx($>#6Le9Xi~W46Qtg-plJmb{an(){q*7zsmYnTIt!pQ(pjcPK=TcCn6csDd3 z9MI1V>j4W>AJP~JHcZ9K@*BJwK5j>^KF2eVsIBN0eO9^xw+J1)huyeO=>UD;O^{K~VO#|SNA3&W6ZGW}U<5NEZQl(iLLRzoY z0?4w4!;b=z(dlv@xUZfS|Gr`k*zTS%B^Ui0UbA%SnyH_}A?}fPkT~}-j{%|{VP8)2 zrVoizmsVz5o@pQ_MAk8olRs6i?h6!jb@zonabMX5!KnOX=o(hzK4e2Hq}U{#MV63w z$)>|kCIiq_@smQ@E4}h<)e!hfOB~q_FZ&OeTHqQ)^VLQ#tBprpUA2s=A79+a>u%45 zs?Q6aFW$OgryP1V@QOJdq#d335`&W)&+Cn-gKnZjX5d>9Xems^yg36!n>I+fV^@7{ zR!uJiHjZpg{gDHu!$Bn+BI~V9pzb)>>~k|6dLzQxyW6-SAc-lkHVWdI`KZ^r0X z0r}=fsO8BUdjt>Vi4_vZV5E?R03NNy8OjE%-3&*d-N6$woJVFsVI9Iwi=id>j?0*) z54)&DbZ}sUZ0BO~*G)C_oUk(kk&>qlooSI<#b%N=)b@ZA_ui5AsgF8NLYtaKhGO{n zaZGIt;}KJwPvMY)o?v{^!X-9M?O#4+ZJo&LKYuJugtCLTLMBt(xTYy?NjYkiIZQ^P|6yZBL2 zLfU6iAEl)YZc8}1{4P6A&MC$bXJ?%3XqxKiJHyFAS}_~;bPDnaG<9inbD?EQl1sjZcm*A04Y8~R#&}Mxf$KTPR9USN9@#r-6#=)_< zwJ9ETEGYna3Y61icJisOvOhECL>U`@95Y@sq#GweH4;=dDx3AR8%`P=Cd?!3!rEl# zi)idh&n8n*eMF0H92mxb-Q--wl-MiEB#}}vN58s}Y&tG4b!!vMV?wct=I&g?O zUaq8;dToGr)TyB)gexT0eu%JR3_|_ahFW1+cERbeqL`DIOl)kg-qBd*RJ7*Tc~Re= zS7$DdsE*@At+1rFZ9w}N4_=pHU*(6R$x2ym#;hMv7cOf7<073O-D9iK2m}4My1~gv z^?}M65A-2(1Y0L0Z?6Zc$DYWh-LRui!9p+e^!Pb^r}1*)a@G@g@WBRT@!^?6)!D&( zco1#VIA(`t3a4msvqjxEL{&LMQ7+(Y&M{{CB^;>M0!n_IRC@8aYUc;>~y!D0E`?>I^KiR=;W0~m&TyL*15 zcW?Kh_=U4F;px*Si~(cZace@b9Pz2`SzRg{CRx%gL3M5G?-J8fAEJt zp2gY=puYb7@>f6iX}?F09vc^0+RR*j^5j|htKa;leER8U8u9a={YClN&wo;$e8fBWc5G*yqzPhc;A9@-^TmrF%FllKY5D!{{#btg z^UumxUwo~0J}dk0_8B&A7au=joyl>}_3G7|*X5IsKUVm}{8-ZyhilU2w(Oy`&|_qC zy?ms$aXQlP@6`3;lzw{su6+06MfvL6AIf)c_sf^x{7{Z$+jE?BlCiR?wQEyjeYEM* zlMf$#q<+~cdwZOcjjuKD?rhr*jAw4qWHp7DPXt3six>WW?SLK%vm&(8Y__F-Zf4)@y*S}mU|A${KmH+4$m*s!? z>2moG9$l4Raa4SARlYrujB`5Foo!truKDZ`)=4@Ya2@wA(u<%CPnYs2 zBizQfg%&sI`#dtvvbK(N##smSX)}Hg$oba?i>>lmt4Lannx@|4Lg6}g)P*!J!BAyo z=on?3U_pYm>^?BnIO$hY3C>q#V$3VuH%R7(>I^7L8TE-r?8<9s^Q8L$VBp+Y$2blJYs(wzkX?~P;zE6`t`CWAH9<&K_)mI?4g+e3$3kYzZF%#Cym%cZR$0sJQPX_C0l;BEN-Kb|g35j%yys zJkUcmH5!jGY z$E_i1u<;fOJhkrG=_7iJ&<`>1ui_?{;7u3~9yXn%#m^gj$lX3QRc*C&ZIId1u-|5* zg9T`wyQbQx@8AjGB2RVHv#H|LM%=*YKTHL#3uX?KI*_ix8?q>jvRZ#x^Hx-WjTG&m zo*a6nd~}a=Ed#^0iSnq3G7@pRFY();p9 zQfAvxE}W|@7uYeR*uADS@)_ek^{BStXu}RT(`bJ>P;tuHai_q^9~>1fuW`J`kGksk zQ?PTd=6NJF9ECU!ajwNFK+1f&kl?xq(B#KlumQHtvEzP{J;E7#-EZ-wS{o1(IH={a z&yqHx5o4!Sf3%b|ym6q>*OKW?E$<6F^2wZc`v-of8SfRtIm3pX6I?hO(HHw6#10h& z9IfsW$>BY8IGVy)6JNGn^A}yY&qBp$OMV=Lm^p+~g#PBV4t#lBe6+RcO*lB{jchx> zWD{tS!5H9!A~=NXfR}ERA;*uKD-DDLh!a7R^5*Sv`TG|~<@ev7lrQ&rlrA1oHef?k zq&>E2*p`_}vFn@?U})or#>12!I)Hj?9FOd|%|cjKJ?{hbNiWf=C%U=AI*TLu_=MAd zIGs*?iVlY@|NIdO+0zbC^%-4Yhp>VjtZEy4Xm8Hx7$35g%KRl;*^6t6=Po*-t@NOt zK7$V@_^5)1$FbsgJU%|sfLsu`HgH{_Y_whU`m$2ecUcv)V2|9yG0|5p62 z%FfP~ogl|*+p8a5`RmoRn~$OJ{yQAw^uJGrYi+OtO}u!dpZ7>oyt%RI(_z?sdu!Ws zhBh!3n723==_$rX_C4U9$~LRqAKwsNEvaz;-HLMxr`+1=y4O{l;k;jSN&UfzR2+T@ z-~)^|oQgcQ%9^n?+A=aKa7ho1YKKI5GS z02d$xnuHj#!V1$NN?|K#$qq}_3rF}{_#60@!+vQ+kPM2lfuJQ200|JdxaVHnd&WL} zranDSRbBHum;b+i=Gv9Ddsla#0b1QzIjvl|a^=c=o?JWg$=SI%&jsvGr3`%e*{k+r zB#O4tN9g|0;DG3yNq6tuPUmK3LgQSr(OYzz6 zquQihpFf}8`Q{DnG695a9L z;Gy_v_wK|ePv+9qE0@xjUt$croSr_NPXhyk?ni#mfi}Q=$i*`lY8emA>&$bLlVhff z;gY)fQG*?w%S+2?RyzE2em*S=k6qWW)+=4+A{CA_4-bu`0m+YDsf-Ksj-6VAU8cql8UTJB&Z?Xt z@M`?#H2iM?{P-xef^@KASu25IOI|_CzB1!Sal%pwAoR>GSvlGoj9egSM7Sj&G36N-Kc_aJjz_o|Czz?y2|8Lc+ElI)ZAyP0FkUeYB2_jX-37i7-AB%C`jL@$r_B=37!L9M@Y6B;Lc%5HEh4yk#7pRGTMMBS@ z2Q7SFL2IU)!hTvQNE*qwmw|ZVHQ+ggofY}6tb&RVSQsV# zoOMu;TOmI62OaWp&}awg@^hQe2})p~fCu=>ym+C5Y(yaQjGtu^K$HbIG*yY~AklIp zlRA|}+=ejHjf#%t9?2=H$Cx?n|0<6`iUx%4TUO%3#!$&KjD^U>M<;QFC7YNHFt$CSQD!!?>b@U?>oVzg(W3f9Mzn9gy&=HoMW13-xQBfS2u^ zd~|qibwvyR^|Z8%(Qm~D3=Dr9)!W+QsOGl6GkGMwInKyp8W*%VLWq%%T{OOoqN~ec z{MvvAPzFbNUj(3b;3Ff9Nc6wUD(oFsJ$ZK!2G2co8v`kF5* zh3d~g$YA^I&5$(ag9`oh#rE$Wu z0C`~i`t z-vD}qG0K6!4ls7WVOV4=bMzD=%vtnK@`4=WjA@IaU0uk&Gp(<#Nsif&y|l8LR+g92 z+|#EvcAZh#ovnPa$iTorIWl}!ebntEv!w9}fbQ}XSzp^oos#S5*kGD} zy5OUw7}BC{{`U4_tn085aAqbS>5W{vdUR|weenJVX?$WzeO+$J<&XMmbYvvmy>mx> z+>!bR*wtI|6c`xjQ+-RCBUXIm7IiiVfy*;6g8k;*-=r&7FFV;aDz97e!05E5`Q`kD zbLoqlH`DFgcg6RN^aveFHauFdF#fZvvD6C<`lk_=qgr|u-p-wyP@V647a{$_r8;Ay zqiJ?_E?qc(&TSc=81cM8S>6L6HZ(loi$2iz(a|xk@J~9FwCNh%q#NUNysn%1B@#GH^Kn&WY-`^ zqB(}Vd!TwWS&jA`rZ>h@`p4?l|NXVL^j}^%NdL=;vuU9HNIH5ZJ>^tC8)N~Dr)EHo zX+?_Z+48uW=R=Jb;oR(FAf0&a1A$Z1cpiWku9-e{0?oAQGU0*;+{-|zt0vK0)J;}m zonEs@Mx7U7a46dtBXZ<5y<0;p`fiIw`%rhjaGI&kZoJ23UOmvO09O0barZ#d+gSOfbM~+d5 zgXKS&24z_+I!-6cd5sBfj{8BOMWtVZweWBmR*B#$&W(vI{`CfWO!sJ4LA`nfpGT#< zWh5xPs}_g(cGA9RKsN6T!_c7;LWd1*hqa+XRoHm24~`yNO29D4g4ET>v2>#r=Zipg z*}&mC?ePctk(XJ5t9aqX&yi>!Bns*l1r*q|pRARggt zG!%Un@=9ZIfe{Icadi5)4FuIbXbUj7xDD`6y0DSqAqx%BW^s?M!BXD6MVl#^=~6a$ z#weL}D$}N18D<%m#KMR5o<5;og^^zL4ZW^RvxAN}Pw5UzSzMGAJy9W|wJ9wd|FT0i*1@9N zI2-ll-~~EaN0^7`QDh-mw&x!pNP{NA+}hYmbMq_dHU_|_2kG%fXWBl%;8o^Un2}=f zf&Lt!4|3R~b4Lmvr6pbEF#O>w4o=oFeDcw2#uELdbkX9*Wys=D7yarTJEH9$UGOz0 z`<7sK0xHZi0Ye_`z?et>vKxuf2V^=nG^+e{*aUhB=OV|Nec|wVTGr`G#HAHuxVH>^0wa@7(n*y#eHPcII7qH$M5q zy96=bsk>Y&0RHulucx7*5!H*lsVK<1Ak1Yb&*fnq?Oi?&eD&%@^Mf4u zX6MjQzb{D{=pRZWYV*>P<{EZXZf6vMNcaXtBKeA(x+l--M849mg`pB)$998BUi~Tl!cUf0Bvh62L=#-r0SmXusOG_)_ z=d9@Gosv#2O2~Y>w74LdO2*J(PSE&(e^8F;Fi&MiV%~XI={;N&nr6Ztj4)*}r%>*= zUfv}GOj16(1@|;}Z6D^{%v~L4(#+6N`bQU1`akep!7E4UKNvkqgTi~Xk&=c@o)6h9 zq3%T94S*m}C7lZ31|B{x(&}(Pqz5$Tp9bI+{c<>f@K>Qx!*j~S`wA#E8Z3}*Um3v? zP_x%aHyu(UFJtGF42T}R3*zom;-H3m5xfk3;50*3_lf*kC!BfgWu}|l*Mb)1qK+CG z^~wdGwQGVCNr6Kfffo4BfN|7Ybh7@RH2BpFL>LGksKXURF*)~nLF3gWMCjKTpu%mq zy1K6mjftrVzIGqB0IG;;f^5ZmJ_76p=})6xC*)uw-0W9W8h${X_f0@FzBU7jify`}shjZ_xIZ^}YoEH6SW^NuX@> z0el3X!CR!)gCx=dA}h)UG|CpgcEG6vkMz^>Du7PQ=0-+c89p>y6flbN8gfuVqxweR z7>rYVLqwWz8#vIbg&IJ(N^2^fLFJmsKZ94(r7k@EaT0lWis*&P%ZaML{o?1{cs!!X zRT$k=nhh1kDKoRewi0?GmE#Q;WaVeN#LF%Q#}D)uUumkyMnjj`S6F%6CJb%(0pI~+ zpyFQqsO>Bsk)6M9qcAU@nT$A98sE^}zTrwN{@@>8taIhGHivbCm*-*hh|2hqx z4LqVFqErPx)S-alB&d3`mw7Zh%7Z`O(&}!7)BN&Ixr~=_%)h`d!jwb~!iT3!mU@)a z5JASL7B5_>OPL%QwULOL_$3>RQYc=$0oUV*oc=@2@knpbuW;dsI4|7#Z`ly9cy9&p zn(Jl(mW^N>;oWB;;zfaEE4QyjGK*jw3l*)c6G}2aD#YH#!-847$GqjLYGCf+o^ag{(W3ov@jmBL&o3WlA}%NJce$3 zXi#4+ho23rSro{P-GB79gsL=uXHX8~7lwz~xn&;#zVoy#&F*xkodXOnLM*c6pMRH$ zZj!|P?X8^Sl)P4Ew{_sD0L5A1Nl$YbdHkU-#2>~VqsoW9Y{VoX>i`6pD_XCE0D{1wl_A?;_{NmDKs{vkD$T_20?hku!tcGJ)=(MJ;Kz-SOXV;7Xbd~ z`}z5&mQ{Cmua9?PQ~}pI10H4gqY%ew*-5vvwd1kEjxPvdi0tK?lxho?C}HGdCnMjh z+}PSqOA8C$<;Ue2+(3=dkzHm}Q&YYI8~#?{;6Sh1Ln~0@wlp?2l;-9Z(&`$=TaS0_;dgb@ubt`h zPe1jpJdqYi7m$M@lM@sEb|2rB*DXw7kp@6PwlcA4|}8>NnGZJco#XjlpHAfMA{UIvfyb z&x5amlbf95QD=moS8v4ePfVaW_zWn|-6H29RfQ$y92ZVqWkAWw_<9zc1aeP8gMQ)1 zWoyFCMG9U6h|{L#^ctRrL%ccNjSS%7DKCGnDkxvR??)5gPP0 zpk=);Vubt_@{S~Ypw1>-7prwK@B-%144tN?@wnmTPVc|U=37H~A<25eJHtfY#z2+v z?mrgd%IBru$F}71g$o!`2p5A5jPPG|+Q=h9EN+oiHc$xH1|X%uCVVJ8b0<(T;FnhM zOjGzkyyd6%+8|iu4vu|jsNuZeo}dK{IbLqVufr;kX|N*&-$jo7aK~`6US7Nj!xLe^ zbQN?LlV5x3+A}`k9)y6jQgK^Fh3El-+ zLfJ3F!+BZ*%FprWANUF&jdEO{H$buu3HsWEZ+1T=NUKXSn0v4B+b9iMn@4#8#5DvGUuG%=n0-ZiUUKr>w zJj9MXZehjPf>91bU#AwqVFa}Ck6nM=<<^Gmz5ih#Kf*M_7-eBh#-`(Sa6J+pY zb|KxJ+ei=AyVBfVZ`#o!)l;$+Mo#6uRiiQ26z)}z^KBheMb=sJ_pLLYqlJ6s4CBNl zm^k%^`B^%-FZ~rg<%+D@Q5M)%2^QXM?P5W^s4T`(@O`O(=39=8Zk0ab=p@FucFBNU zWdMc&+8eupktclvUo;J!Cx3T`@q)`^$%Z-a=Hu&x!L-0_&Bj6KVEDBm7(DTY(T({9 zgCKO-4M%z&v!bK&@PKZIuHu-F&`;WpG1EI(sS6y{$6w^ZH#FC{fMavR?TllUJVSbW z`cijKHY}re(1S4w{e)aGxN3GwLqkIrX};*DGc7GGc!wJ8rEYYG zK7a?<#sEaym_KO;?O9!4O9PSvVSt_M6XO%j0n%??qF$n3h~rechT?DE3^ z8qXr6F75PXEzC9fhXp6N=cN9q4`Ii>Fm zA8E{_bZ0|_cs->oPQd8QKaN9Fb$GZc>}_(S<)|x(Fi@wR2G7fD1%c0G8T5fj$8V;2 z8ec#&Zh`y`n6txC#7zejVe{k(gciG*Y848=&pHHK$_y8KrF3#5d;us*piU3^IOi+i zS)oP>IJIM1Ln{&|5+jUH<-rW~I%DZm?!+e~6fYw%gpiTjN;C!NZ3qgVuLAT26B z4ah6`f%XhK35D0lbURAA!rt8#c)ZD=TUy*?bi#Pxl17{`=qO|X(sCf@`H%7&$qHCs zi=$rW>7@`^xgLBH^I|9~Jh&`EiNhO<<@_=j*_8E*p-A`^IiY8R5Jx|>uoQg^eyojI zIO2A-uwY@%juH%o7>e@oV7+qUR1XV03gyKiEU@t0&kK6;`3LU`V>rw&sIZd_F-MXm zFW1MAUraMfUgY7&i@2e92J+?E7#R5i@cqJD%JC9q0~Y`A3vP2bz&sbIam=Y`lJ7Jn z~6~khoRo9Wz!4p5E!jsg)`5Y$I{*scU$C;2RaA=7Ufy@R9tPhQBd@ugWe-^7SGujhYuUahB#au zHrpPrS1LR6+yy*ce)eOPPv(9acl^+)lL%2>ILCt3Ku!;`Y{d+T2+8 z(Lr|faTDg!%2Ha^;+BOehA$St>ss)xZEpA`%dOpQEzqSa(jgYvK4RL*@!fok7b74( z>FhqiAVOba{NwvomYsM7$45rB2xr$H-?+-(fRhZ>25W(QcBRH{77Q}(#MQP$sAlP?aeEA*{(?4XQm{wa;`igC;zy;xh@Omkek z@N_XfSUgA%)_c>!Zl4#gmNU9bmm+t#R+_nY1DMC;q(9UNy^KS;R<`IKaqD0%ms_ql zX?r`yg@n7YO>I&9>=|4(RJa`Dz-*Wi&65~EF`OOx24)OH`=W(za7>o|=;2tlWWmK7 ze7laOa8U^IC7O*2i#fsM&>`4~CJmD#~Z8I4ovM33}=9cLIx zFd%ZV3`Z{MbIPC_7^sJoP3h6{n&&T!uNVi}C5GQWIFLq$hP_LV_RyDnZ*hBbJ1uGaVZgk9|6#63vSEi9 zm+v6s9*rS1$~#R}KRd+M*Vb(;LvHMJV_Y+?Vz(Ic8}j0Y*-viVNYm%erw+zI$)g?P zqZ8@+C)d+p|FGMEZUFcrql4+ugU2>rj*SmnHv#;Z(z)~JJ?`@OqrZ>RD_1Y1ci;U$y!Lv>Bl8nGDmT?u#yK*FHfn;gAN^zA;+uU> z9?zzUiHX$TpLZ#eKR7gyCPqin`HR!(!M&9cZ@PETka>u_HzXb#{xF*rDwCMU+F4+Ea>kZp_)d`>;^p2Cl!vrlHt zD}wbiOfK{X8DOO2`8zIpl;ye0Wg;92$9T&HF7BKHd>?XgX~FGaXJLS%t_S_44!%Li z8;VW^uK#8rT_MoqxAjWl$JE~@2!HX`M|?d zB~4Ji>dAEEGPw+OIDj-W;n=qa&@MtbN<-At)k_I%V*Whx6 z4saT+R`9ZT6?{eXV=#-Vkd9^2e}>SDDH|hrhD56(k&n--P9DZN4n$s*ZH~VTpkPrs z4-n$vS~B$w0se4Jq{|M#lH&my7&SJ2#3Njf=H`*z>;w2nGU6`)E2PSM6xZ;QQI&Jfo^7BF~5CqLN9a0O4>|TAdW* z02k008<9s^NjJ!MFyaM>2ALCC4FZ)r4XXYOv}e#s2%4orc(Z&RQF6(18%lbFQ?LCoL#&OKl!l5KaJip$1fu%ebDSk2VVP?wZl;}4CIqy^l04j1{k z2BB~a31G(vI~n#=onC}h_D~B^zUhPUh&-ohWq<*2UoX>p82>OlvB(lXe8-BHV2-HT zfW&|Er2nE3&13O^;{|}1O~AjpizP1=5ThdG@v`Y#cU3-foPif*9KcJY|5@Iy&M&l- zC#~UEG>EfHrc~B=`OO`fd1}yu4>=$f0kOy>95eyqegW4w%*90yzm(^t*T$?;9+%~j zjap&+1IKbL1~0&AT9`OZeZa0izQM)!|Jd#1ODWX%rfc~kYvH;NM7PujW7OfeXep$A zgD1*~Fa8P5IC4=I$O{qLhWs%|j<@USX zq$3C7?9gbVTrR@`4H;2QmQ~&{1yB|ji$22S(cc&%7=z(_E3x{RHXL>%sunnYudJO@on-W4^^Gi0g#6 z9L8Yf-DemF#Vb3xFaYMASzR`Cus{Zo4Q;_F-7Xvn*tpc6Ws-0IWJe1}8ClHs^g^rG zGQyZ-8Cb9PESqC_LObgNa%XO^&PnF9;&bEm6=uHIF1(b-#*}p3#W0Y`k74qz1O2`panVa7D%T^}38z==FCV4yRN z-GDg70qd6J!Y)hq8+|SxBP#|Sk0Z?&d7jR4MBj*#&zJ@HOJ8BIzzE20Q0NKG#>dt5 z)igId=gSc=4rhJp@KI!7b93E#OP{%&WjtWir_L}Qo;}O%P%al?M_RY_i3>@rZy4M9 z`h=SeID5NWYU`ou!WhWq8Qs>6Z~+973*(0!dB~s!F!P9{tGKN-@1AAcu;UM-%0M3m z?g7gYy@F;Kqxo)U*0~NFuKN0Vedz`lNbpU~M~@y^9*o5&k`cU(O-$J57FL9z=1G_H zcjhqaV{nD%c8xhC#_nCdsYkzHYWKOP8-)%6%ppw57ehElo{M`#X6P zQ|+%3arGU>Z$8d^=gytR(PZW%AudBb$reFT*m(sn% zG&MD5dRAePURl{r51%Zgx8ImnnhHu@v;m!EPT(RUbnnK;pSa&HUA&ZDy>>~oyS>Zr z$>XQiCyoqHjE~s>%$!E~UGauaGG0P2Xb*-lb`TB@4cgG#Avv)#+JX?UgPI+P$g5Af zfx()&$h$v9iyvZ`LnovI@QUmxiR~f5cGlO@`UTOIu9UE?Qye|NA?L6@*)9Tpx`-3SWY6!cvZNO zhx)55&NOgJe<=sxN11>~3uuM&O~8{&VU}lRMObfP`dd{*FzTO z@ErUgS-YIrDVf2MdVdd=_>IG{u`YpB_Zb_XsHtk>n7UlQu{mheJ^CIG($ z?J7CLiAaV>YLR8A+f?H^u0Qd#03zRIs`QtI7ovj@3=s|&%;5xji8ukoYhHMwkrq$3 z2LFWylO|#E@o6XNWH*3FNk5r!oZNsa(gHmLi4+W|;^<8*9`&MR5N|BrOe%^M{c6+8 zu@g^b9>+C9`@!h;kwkmRlMh{&7gT91l=8!rxIDW^7d^s&7EHu5YUUB-wkWSCFKz$^ zH(re4#>Y&R>|J|W810J(jur6@Bn&CuIZ_OPJLGF2$@i<+S;Vd#b_Imd&PEtNg;bf@ z#~4!A4KJHe^M61dSI`cojZCTDW+5)t@RYJJO&O;dmjgfp2mQu6Gmiq zD{x#Y8`VhWyLK39Sd3vz!f>OClm-rEk*9pc!LiKsKa4%TZCZYgV<V&@l&alXHX0fBG%@$EEr^{wEq$zl9c`UVET zb&P<*SzC8mc1d|rSo(tRn_;-~QQA)VTGaYjDFz~pf##drT-jZwaEE;QT8_mnh8TaCsEbq*J z=-R&e5up?32ZtDkbP+~Pk4N>(`s!Aiom-HbPxH%L>Cskqn%fylPxtyXf5BTG#|Bhg zW#}7xzOBkPRrN=4)d6vV)0KwtPh94LP9s-1(zR?9)V#}JR$0=i2i?V>moF|s4vYzw z&ce_ie9{d*6UOmr=HfQ##GZ6v+s76$_%n;qAKXk!KX4(1e+1B65Z?@Cw^RNWV%Ec~ z19`k5EWTUE?mTWA2A|`c9K+4VjBJeH#~;)^%Q)*S{n)NL``m9m?lX=cvZHHjb0Zt8 zrNit{#t0lo&1rw`CuE?x%jtQSC&X#GzgZ~xs2cGDALwO|$Kud%zx9Y6qa5#Myl~^{ z;?kmZ&^m%Vb7vR`GL~&{lFot?`Shq|F2@)}|Jg~1jzb$m4u(L+5%fDdkLUhoP;t|9 zJM@ovfbZjB)M9RW>#bMP^wf-Xn(@cc*46b*8|)Vr7SsIvg5)N7NM`I31V_a@CLTR` zl!gXI#5+IKW%}d|4)*$6pZD)QNEa?nn}@=J%AFO@ed+oK*Ohmn$N@dgW%&l)uit$) zjhAD@q*)gFGdVeyZr!;jS+=L)A&nKOu%>U*@9XdN9O^nROsYR9ljk@LSL_b_xBu?n zrkSZ}8$+3cc~`>deCOVM&qsV0kvU{X`iD`KU5T$>do?Z0FQs4o@^5Wy9U19&y`Ow~ zC;i~Nud3ZNj%W(T(p8{nVHlPxZ!_4(a$@nGxP|p-dWgtZAF*q-hU6=&HaiI*P*J*(l z=@D;+pc!RP!+Rd6EXCX|hxMnXCx>p~>j_X23sk`z4q_$4VY#3e`9P!xE>H!J%LwXp z0nxf2oZSNFTLUJE28c4m&ASr>FHxIBS2q>l)x~s*i+ooXxOJJAsOEGieb- z4`^oa>p-Xoen1Pd)i(fz$)sk8lK8lgMC~H2mJ$%*<~;m5{3598YzU;pod-nvY0!*| zqg|!F_M1WYCL3iP`HB!_DBoOv4K3<8fzl%X8ED3N4t{fTGb-`$YthtI;FlL{$D@3x z%L%9pzAUur6G5Y{uR*gJHAn;ycbfj-0vvRPyej>9P|zDL;6(920wNp;ClE6*6V>(C z6Cvpl*Gont9QeGL)aA)$*0x{K1j+-Z{K+_UhjB>&n#!Drf(VdUxkh>Yarc&mK%|#E z*h*)lNb;TJd~j()Q80Yc^PlXyefrPKnS*fz$IhJlbfe^e|RYlrRAWGZb+k zbJt-!UT`H*Il7LQVt|Ej$S)Sg@p8+{v0sn{(1;h`oSz}*7ASSu5G8JS$%Z%ZS+pYS zd;~Z1PMXWOed1C4x}9pX5-kgA+SkH^GRFo}r7C_K2h3at)&?V1upj=!00qQx2bTtZqbp@Y`HU8mV7 zCLHS}Mn#1&l&}-Z22_0F#!)$^A=7Ns^3GU{+rr@+Pv~~;kG)D)v%b4eFmkZq(}K>1 zT7|*)4mbL5TMIuq8~ZjkeIqJi@92|b(aAz}9mhxUZRFc@m|H6Oo)tTu1 zWJW*neX6dG&cw0F*qMd#ja_ow_~~P~O2^=XK?%cP;By-+=`6VOxBrAIdhFD*@vgT! z^>)V&7>y0}rS(qr)7LDdJ+74IJ{3R2F#uxN;Mg#R0lo#6zh9*VBlAa*Hv>$i(is-I z;(@Zv3nJ*S`$MvZHvND;dgqzq7|a$H=hN)$oEGx)X>t7^&F&1QhdTplagU><)mS!7 zz=|f9bzUQviO_sx9Ol$AZaqenMl$oe)0F4QjPV}hruLb?G?$_)8mAOT&utv%D6PWi zFsPZeyaQ~Pxo}^L=3+F!NPy0u$3juN%MHxxJ05=+R+xuvV3VUI?nf5dBItgSi?Iz4 z7`!$&w$s@Tc5`-1j@j775p%xnhA}A5n|UsDe=CjwnSNx)+sNpM!x#kl4j%fBF>rNl zMRc}QlL!Sx!R( zgNfs&^f`J7&xC7$UoL_`$GAu(`W+bn#2UIF@DbZVz6Zx~;p7VhVIj)U&*9#{taAi=TF2alhmeer#^UGnbBOeiq%neaE~0P>wu5OCQv~ zQ{z+V-S^&2=Pz8y{YgOqW9;0ybLls~em4ydt518ol;&a@X9sCwVnp)Lm|9#(Q>v3Z zWI{PE-WVDjwqcsFy}P%g=Pci9JWN-woKGKpbR!K7kJ&)S+XtT>V1Uuqsp-*l>EhM& z@BZCiqyfpOqodn5?)LX}NRJO}^x{WFzU}wPjnC5P$WZ#uci$3^Luu~m)3h+ZXg%i} zi4&82t1w?y6JXuY7|2Q7SluH&Hc~IUJDsi^PJAsadG{w5(%_iaG5qmE4Tf`cpIzN_s>ij6;WoIyNx0|` zb31W<7<%&Pk&iSpw{c<0)29n*UT#IW+gp4pfcJ*{?m@dWT%>2TsF%!9UDJI>=^tM`O#jEr zM`>L1`1|u*3O^gF@ujaeSaT zT>GR4ex$tsm=QdI;i7!NSD<5vy76On3Yw8#Xg2C44FEs#fk=;d0O^5y8cs7rnUlc` zBvAf&H0nZVZ9ttyIQ%AvDq8u?=+4t08)PD0Tnrc-5P2;Lodzv%>pB|nRcHztya)&b z&+rM9%xGU!!5fxw^vAmK5_O*_FL!DY5Fs9Z6HuQg1@Z+Eu6@A8iBpjyrA*1MdG?#G z;$+u+nO-*LG$2UWZz>RZt|IaxF@VMkFdCZexFvVO#Z z5}ZT5Oxf)TJsUC7p%!Wwe+VD!o_e&H=pe2)%`T;Jbfrsi{LZcp;c>i>9Yykm!||!Sdqrugr%kju z)6Vmu%{eL0@}3^@`nr+Gmm{zNar2Kq;F7SvfMN;$c}gNB{{(L1E)Ud;w3Tr83! z4tTL&(tsK_r%*oEhRf7Tl&^{Cx??K8sFsmvxI4HPklqotc9N(RaPY;8hG|*@$)AUU~c@fIOiiHK5S7b%L8h}C1 zEmIk{A?Hd#g)iM@p~j9i0-i=Fq&(Kp=(COR@;M@x4N-aL2F49Zq0|o^!$IvNP|{dP z5pUCYAsK)Vj9fnIEehOurVX2_n>u}SbCC!0Oy0#OCtkeEjvad%gIyi@at#1EV1P58a4_!W-I)q*-jj8m}+H`ubHIVrBsF)Sk;#GCpn8pt#o_F({*;aP*A!F;C=F>Lk zF%AnZWz=W-<1(Ie$9X645ng4yvr*46jykWcEQx2n0XU>NO*$pwz0%>gzw=g_ z93Qb>PESv!h4}?vsIaxOmG*b{6SwZt77W*oK`J2a$&)8GR*np-d>IEdz!@btg3CoD z>;&xZ??LSDUdH6y(|O5#*fOLI7)?1A%^ZS31|toIo?fSMaZ3IXU}$J8t*x)94+g~d zOuG5S7wOG6-cUR8k07)kC_^pXx%qmON1y>#)M=KstqfX}1*FaP4N z)9Y`%o~CD1rsPALDf;?{pL%S5?+0&bY)~o#^(`(er;l&kNPqALzvsFD_#qE{_^W^a zm+5zZ_xF56-}QV7!*uJ`?eyxkSJQ=yGm`C5 zdi>y#`hPo3jE|>5>p%SAG6Nhv$B>twAs8t&4ncA}**HhPp+_8vM*o?ov(YJYMM%TS z`0g)}Mz=X)jDg*{E}vVWnVY##q)T&}e>7>&I|;A8a$fwhLolUBkDrPryCuh*#-rl; zjW5%M3+KdZPo7Q$AAImp`tgsy=l-DX4awoo?OW-GKYBxT=02L8U9dj$9o8)y71wM? zW-g5#gUmhsz5S_g0G%F?&i1KHu0vvIxB$umye}}nT6RTdpebZSemtv{3$`T%E>V03 zg@dCUST!7JUK{98pX?l_KYQ4o{vV&F^ta2x>=GuG6hok2yZuf>8Hg*;Ozbph#{DW~ zfn05dx@?4-XgNxMH6q6(0<{&%A~q*PS$Y96)PB$aqO741h0X~8ArMa#cn&n*Wx>DyeM_`z@O!KE7lHwb zH)ywLS1S-2Me_K{NzLFPd`jN82UL>RY(S&VZ%JM!0Gc?Usg804xa2k}4s4*At5)%F zK==XR20c2cE?b9zX2}y44x_=)BJV_6K&u`M{2H3$!eIoW87?0D0gTl2#Ummvj);)QUaQ16oQnAa#fbo8u37^5h@6p__(O&nHfxR z-i90`z2tlB6ud?m`N)(k96&Ozp(6g1y&ypzfs$o7p(kY2nScsY9z5#}eshO}pI;dL z6cJ7y_WENKB69YXU>T4vTyFQfQg4NYv%lcdUpKDiT0t7{c1tS@iCRh_{6avA171( zjuvL@@ZhK!yRUY&I?21N4!rAXPm65tG88=)#=N-m;>n9T4pw*}_s%yvj48B*Fh1-m zthZ*z750ucg}DgA#w^-Ey58Kq!$vNrxv+PF!9E z;5h9-CcON6fu}e|Ao74nufycwh;!r=KkxzX-Vl#5^!%cjo2marp6+k@OFE{uShu9! zJ`RkINJgsvu?`m>}<(lU}eF|4!+1Q@>e1x5rkx;%}#&`L8wV<`JP76eg@EAcj?n@d*245zjv}~Bme%>L-EC@+#XGv2mIh6 zC7~$#g|9gf-9?=|U_5c7U--bG^f8C1pLBH5xHuCL4$6pyfbk3*JItk&#n@-V zZdu`bcOBo5lq}g@>K%cqCobtxE$$!pwfe?8F-t?y%eD0l|45O}sP8+^`iCC+8r=ox zj{u87K%cYolp~<@ucf0h)I(Wxnz4Yf0{Yxc%}u7Fpz)K(75&P$1`|iM)&IS{(z*7w zG(0jQnQf=BkuhJk!8m8&LB_icd{a|ta&pp_LQGCf_(t8)(Lo=zWyjXY z@UV~Vq6?i}y`ry5>05j>Mg7gU=RUsvaT**RQGZHTl{R&5GJW*Xb+x4x%B?~AEb%#N%7il{Q*!zZr=U!%iDftOq3ma&J#}mV7GMVFn#gGm+A85b85TA zXU7jEV-r*9-QWDi-}R#^h6D32`gr-``Sj~|-%F#zW11(poCj9UrulgcsN!2G%txJi zPJHqC&2;nD&2;fNcGH1RzqoeW?FjN<9UePs^}y?knt%4cFdyFLEAh1R8`j1Hh+GAeDt$d`kJ3P z=nqo^{EHLeuB@!42M->lhmRhoM-SP7w`4;wea>!44Dd7O#>G231<(4%;*NGclhE#R zyblcx_DgqD8W`+LH$M4Pa#7vVYuY5Uto+1QP-v#aZDT3%k& z7(S97_xOE`@3ww){iFQdLydioov*KN*%*HL(u{O)O1d~{*)TTP$%-)?<2lbHzJtj7 z2s<&uDCqj>XZgWP11z}wye2QdD~J(=nNE-~KQNI;oX-(}!x)4nc;NUnhQ>A*hwO^p z>!Szhzk2;J{myVo_t)CegEeqP*Ux-~i_RIESb8qhxS921XpXl6@@rR@DSn-8P(aPI zs9;&FH;Ul{_@oDb?{Wo^vLpc^x)(yB(Lj!H?Y|7vcweEs(cJ&fK@HvlqXnYrG!Rcg zu)rdmgU7T5q`d^stswfq5aF*%%N=-JfcNY$qDOjjJj07CF?w^c3jFHPocC4vKNX%O z#9O~1vc8piDk#sZ6LhO^F#wj7kdA>cE+o<_4;K(Es2ho258=oUi1gsH9@YY*>yP=0 zviJag;MeIu9S&&50f>hK3a?FU97A26a4T)8>AeWRgD*UVpQ$(UUqr7tza~`Y1+7zP zMi$T_JA)AX7E_|&1ukhpx{=PGNPJmnD)Y=}jr@S9xY-G6ROk?HMK03pt9^*j0r8*Z=fD|`HB$v-GP0ZZ< zo_eG)3H!NxrjSV~#M^+w$V3ZDW_x%u7I=gO;JQxXb2QCF${aA-r2xDW?Nb1^}NI;YL|G^Pqq37U+mS^Pv}EAG;PV z$9-9_W}_0a!r+9F52GL7+S;-a2_w`7-vtvMhAA6VC2Q*EWgi}?pSl562~!>h@Q~Y+ zGt8Ipjq7-B2a7IlWj<_cS1a{0E?ql&w#z%ed|8ARc+`cFBdezWsNTGDfJGFGWt^)L zE@6O01Yy#`1#XVRBXY{}%!@bZst*2x51#5kTP0u;vtXfP-Nn#?>?LQ(HXE=p0AhsZ zC}xp0MiR?WVJ*;i4|bKFjVBmsFr;iN597raK88Tae~Z4@*~nq_j}3tGIj$83yzJxh zH=QtcaP%wkFam;4+{Rs%XGfF2r-?p@kK9l6DLW`JsO7e^n+t;*J0CIRVPwOwhB2(K zr#E$RTvrQRj5{0^#n8i|o8y(F_x7@@tIG>OjCwxWi;+(YV;lb{tGJH@gQIeM1CHH< z?iJ|`vP55)H_oUIx*!&aHV}(n8~;=uXTxMq{(hWyf$1OZq@NiJgaHhE-d#!mDlZn6 z7zPch2Lmt0CfZ9LeK)_j;+sXE%+1@-w0F>!7WW6!{hd)80r@VKk5Y;*BLTfZgItH@ zT!eD1?z6qa#LI49zi@o)ryvjKw~!wlPNI z2U&5eZ@2Uc!yp%Vpa-P;#|w=oj9S)05?g@Fs{(KFggK3b$)&ZGyiZoM`xOt;0S5HyyNbjyP7k^ z3dXEXb}eQZaXV`tyCOAam_r^ve&U^!)Uzu&Ge*J?3p?z>gr0ZSYD{wI(mY3Gj^vsy$OqKXOJ$bIU@$rpx%U5`yz;8Xc3b-OuRl+dQ$wClFyy0GyeDuw`5*lLPty3rO#1Az&phW{ zy?W8SH;h9f8gmKHBlPi;Pd`a~>+gp@{874cbvn(>Ev0++9$0@aUOXrM=x@nP48yZ8 zM3UqChg`V9B}ei6pl_F#Fra0<1z-RDgGU&?rEcOU*;vf6;>VBY((T)~Ed%C4jB;ACuCxX;E`J&J|P_Y;rOxtR&^{804yK46chhAWq6)W6sL zEk?!^yi85aq)$KjB+ZLNqXDp8nl>@AQt}Tbr zIp$py)$@jwTQi&c491xYC<4FUkzdl{-OSH;5WwLbRy6n~>!$Si(%@nGFR!KadxLFh ze(g-U&5l5(DB*jqr4X#prM3Su(2Pe};I#6QUjbv2;g8CaU%V3}8e#BC5FkDB;uHz- zTuq}?Bi$kr0pw_TI`_={Yj6H($PW~dh6tdbuOfaZyYctZ{X z-cTc6y*xYaH1ZU0BJ=G)AskOu^GaOlHIES{>LEH5@>!rYPy&?4OHF>n3yl|}0D{qf_5o<-wES1TvkRWar9aF}&}mG% zC0~7IA7>rYi9OuMzaA=ivzuQ<|C%rK$QU4KqtSCkio3#md^_&3m>WWZT#HRB3N(lyIMT* z5^h6~jYavpUt3%3l)=h zF9aGc;_N8OJb?rMdACxg%eb-;23ax|sZad+=%oH-99|0ahk)>*%|CEJHy&*#Tk35c zL+>zHtN+mlzSDOkz2QizZ@p%xmJNaVyJo(j7N;~8l*lgYXtg*Hw2mv|$L; z0uMtT#s-WREQmSY3r;@f$PK(4x6F=(Glm`;0af0+bm-@fyh98>`jNSTvG3keoZUWr z4~qUm_AKCi?7xG$k9YoYTdIwJqKmE}1Itl;K!1mBSZCBWAan#AWJ4Y@Gkvuu$M@2T z7O}HW=F+1l^EM>y3U}wQJNZ|G8TKHg+7@1qHoAHd(4TDGiUfg zKmq0+{j+gdbFKMRoOW2bn0yb|)1ovgl6+zg^~Foj;DQk8m6XAGhc-y>Ne7{)x-_1| zp5(x>XsSnV`3pMVOVhYiyZlY9-8Rjg?0m|Gy;biZ-4d?{?k{#2@l8h-`qoboL~eW& z52GM+HL}ZwLO0)lyaDS9L~1~qnKb#?X#tvzjRV;I~{zLB@9Cyk8^iKi~f;4qDj zj;I|=KIYCG%KV3s4X}Pz0B;;erJan8$j3wG#F1|R^B24C*p0_G<=725`(!pPE-k5! zez%Wu$cI~4M@NU#%*;&UreOdB(v#WQ^zh+h&(rMEM(+{e=QqDd(^Kax*R1b6!!r+v z2R_(A$1&&+Km5=;%)(%D<&{h6)|a<^w0&CjNy@GdUf3bVxc$Z7yp!I1>s86Rv=OI2 z7cO1$ZocW6^O6TUX`SslFPxuFw{G2$ZXBhtu`)(fhJGCy8t@Mn4<0^A7cNXlXO8^C z1G>a#0Vdcb_}*`%hrII~q^nn^{mft2GizwDC*8ffkfzT~iC)&TYu7Hx?~?lS?YoWi zbbi6}g5NL16mm!2AAIC-r@&GWM;Y1M*ZWG5_X-g zX&kJrtolcdJj`kA8TAFn*#{cs0I9!$=jy|UkJ6VnZ~HmQ7#JTPO>ez*RrL*~KK1*} zFK!C6-StcD)8vHal{@z|pS0V!r=cYoP5S$P+-lA7eqefLJYD~oU4Pw*wP~zwrs0v{ z^v*BdNkhXUiA!L3Uhw_LhYudfosN%sFmTMsLri>(@U{Z@!+7a9_MQV_NXGys~Vg z>m&6yapraCW_cku#&*_ON+4V2t|w0(OaFNG=$YiXTF*39&hxYV6&{K!|p?Nl7ddP;gl+`+&&20w-zC}_{3JRc}bnQ#&Rs&GmfUx-EH;Sbt= zpKJm*zH&jVc!ox}FbLi=ypmAEiOgrSp9f7vo55|VabAFb0+=`ppy#|-H^A+Z-ZOSe z_*vS|R_12|ehC}$D@qn=@EdtG1i5DaD?^LEEfw>xihjG$+@==oCIr3x^yfg0668JkijKpPR{R>Migds@1tIWSm1#g^ z;1_oSw{FAp2$ixYTtFRe0IC-_Z$U6#Iuu>MB*fpp{tFy{mQD#5Cupb??`B>tC76yE?XUFbsYe_F`w>mYl-&x%6R63#v^mQj{k=b^&q(5VxZ@W{gw* zg?)d|!yp^X=-EWkMG%Q0Z@ z=#%3ZFgpQRO#0^D-fn*j3Zn}PZ+83jc~_po9Cu{LpXj;Y)FwXY&-eUnBvRjGBTnAs z3s1<1U1#V(mI3ARg&a6`17W1$reAIi#sGs+5c(Xy_gI!=EF*&xy5YW%4v8*v0po`- z_}*E_V$-{P4$`K^$m7}h^ziXqT9{u>+Zt!waK3iXpYCrDrTaT0X?dSxrRW8HAm-5t zI+}K%Lk2pDHfn`m(DGbPnkF%#l&Allhh7nv{$SX1n!=uEMFV+ZX^wfmx%sYOozBopRce(cb6s5z5MLXOgw=7-hwjkLJ5nl>a4 zX!Uk?ron;!)X~}Pxre!cBi(#IbZu=VVW49!qCeQ3hCWjz21Jh6V&Li#jTndY6NVcf zkyV&Jr zz9qZfe(9>(alyEJQmxRWY0xrkvF`&Q;>7_~b zJ*^9mW5u`c+*3RGo?!l#=HOs|8W|h2K4Yk2EYL<9@VR*7Gdqu^Y6%Kkvf3edkg7{lE7;@s_;np9_NK7dF$) zJ9Fvn*QZ1$^MR2O{h_bkd;dN2l;`}sJyp;D>2uW;8u`FmL1QrAwFm zeLd>UJ6+qQ<9zdOJM~HbEI%>A{4>BjqqL__=WST?j}ToQ<(Mze9Qu&HK1%oRKTMx~ z`nldYcEre%WG*|bZ*`JGEGcoTD?7I z((VpAlN9c9pL4{1P2&MxNoQ>E{`LB`%jw*?=`(-j1 zzMwxC>&)|n885T5Po*#Syz3W(pmEhV;0eX@XCAQ*Y0%{#4D&M&5N6tt+^>xsrT@#D zhv|IRne_9Anj@8#+Ij9|dI}gnD{+(mBB*g%lwt01TIHDbsoJ_GKx-)qfZ}k_!WRPb zifIXoXCiKI@yWn*b4s`b<8||x?(?8gsJLc;M!<_`y#VMd+6AwGje%yoa(NQT2+crp z!xcR6O%w#u`2*8P+K9z9L7mmg0eOnaesXBbBFMZZ1_f_H5U$pUNi~D3+^*z!UqTg zt=jihfO1i<6Pn=Ej0(VM#b2ZWgqwM*@sVYzCz4M^SHL5ka0N9v!T==EEi&rKiKG`b zD+n65gc}8e-$?%|5Hy+~NLkmEj|YVA#UvCEakozpd3CyVmoWL{$wk$X7EpD;R|64> zr%BWibj<^8k?$wuiA*^vjCg@46X0y6aYPu1tRQ8wC1R3=o|E(kzIaQbTxdOhl*?Q;*ZX=aO5NO7z!}zkX}AOpDzrNzrW=? z$M-kncC=dBluvv;1dY|O$-+udU52}XO5+Gh!%zn(pZdej7k6f z!fK<32q|cvvb@-Hi3p1Y(x}Hq2l!CkZ7Op{edUKP>7s9b8+vmLc{h~;%5oPLVDWSk zGlLDCa(SV`Lmh!-puBhY>7Rc^S6^YoVe!Rck{5l9LG1G3J8~SC_D!_J?F&zR#?D8M zr?Pm;22XZHu{%(4z4)`!%->X`9N&b)=%<%xl{Q};5+2`M;^GF5X?ApCa6%q56TMPc zdC@)=khxv7kFZpP9bLl1a77FG29__1IciUb=z#`+jeez1v=&fZ>NCV5y*)m@Ew1q8 z;Eg_^4B^aEHt^Udo&JDJmt`lE>MwX%M^%w{WGv>f2JI~KY?M=8=@QZa@Z4C@js=6; zOITyjSmZ0<#WnIVAE>q#GUCr;UF|h}7h|l0Bi`jv+{dEjFp6@q2)OeYk z2ssLj54}9j*wK*}$QWGso+B6baB&9K zwy?_w+2!whwfp;i9Jk|Wv5%0#7dyX@huRwS0mclwVsoEM!lf>N9}d8yjAiBa=ADJ; z$L7XPdi0ou_FQ`WL?rfF z=T+ugG?j+q8e~^|h^ze>9bk=3IJ=Y&4vi zhQlq*hwZ6fbjA{Wr(wM7^CH+5xAq8GZ(;VZSHRy)?j*g?$-+eX>_P3|e!A|c0 zx_o6OUA{1#&d*HP;LE(RvZCjMctIC@#9e)jEHTQAj*ccSXhApV3U&1fK>i%H#4rU+ zO-f&hp_QtmI)lXa8^2?6b`~!}^`M15Tv?K5OqL1S^K6B6Z z)?s?Ouxg_UhUwQ{znXsh{kKJFCtbUC)p|8IJLm82-MfF^h6|22^5YUZN&gmgGHncS zSFc=_oU*YZ^3f{<8e#a{+SsrjVc6&&8cKugQqvR&Dvo2yTpZzrufQY(Q6F*C*EAK! z2uMghnC73(Sq87YcFjBbMn;CbOA8|v_-Oq;U99lp;)?qPxn#pR$HS$+%8ap6gNA+j z+h2d+areFNzG)*B^@GVg!nZL${q(c+2Y>(XsSoI1X^-f@E4%9cB`bU5Gk5We$ z$DMOK=rf+rfA!Zt_XQ@?)8jTgLz(9js@&V#?z)66#|^)2={N7)N^iY!RdXXk$nzm} zEi5ghA@vh;1ajbqC+41C{qk3ukJ{7k{oYSZ>*mc{?&Ha+Dd{JM|2${%UA^(~v9!9f zX2UAq5@weuJ6(}*p8Io~%#m0^2AVcB_oTG8ww=Db$}0?UH|A)$)Y>G`Q{ZHH<@y7d~(Zu&oSGFj~=OScGKegqJKD_}1Qx?`@=nnc~@$s9$0I&+)Gd6o$wta0Y%$JwU0}5Jhor zuLH#|P~!xU#`rlETG07M0Ik}u;brSkS@Z=6_JC(d(!qiFLQrXhTZ4&Hnfm%=0VZ%1 zX_jj+TdJ`aI3>^OS$FI=06$kk`Ja(PF!_9VAum;X0N2K!Qmx?|w89*92b1nt{JMbt;SYOx_LlCE|Tgn z;HnD2NIwm?0VTr|7;*jagO5lQAb#2;a4O*f&&i7{+DOpqD)CEFC2}@IA|!nv9qp`RlQi_ zh3o)4WOJe}{^ytIjPYgC>3n3Md9Ghl|e(9wEIR(%YMNooErQbRV&BX<=nV{b3PIre<0%C>0@W-tdWwhRZ=qp8sS#jF(XLaZDvq z3ZL~nyT|xe)gi|!_w)AvceS|iQD7|?*a7I>f_n30w;*}@dTDf?;uyMieDMVzuP@(d zQ<$A3-aV%mZWfO$47Ydqc3Qa%149`L+UF7~YhovebuRgI$N@`Em^}fHAn` zZ*gIm3zv;>*${%CUF=Zg7+j`LoR7P+n{Pu4LteVqH#U7!FGqJc#_Qv|dO_dZ<|t1N zuW#<;9e!FMuWQlCH~nzzW?~26#wJJLgs-w|>+BAs+=dp_c~=d5+t7ym>32P6Fp9D$ zC7xA9`sco(pXfhnf_z@&bK0?QJ+*F7Ryw6c6~^8i)?!BbOaD_zhvM86jc(*| zfNF{#F9Nb5CmajC2-_$K9!}|$w2@K)(uhNY<3Xg6;x>>+96BJ8qyVbxcITvq-c!VN zV%>s@3(2P(|1xpcV_t;oxDY7o1-BeWXnjOe*%+x^i6Ghnoh(lmHf_G4i2UFiBLs#n zp_)z@MRDf4IMb4|Ay*4=j#06QjPLdFoj-OEaie2=jGiNgedRbMM=8O}hCXie&ELuM z5iL1(4skTpX<9UUp$ZS;orR-!(~4K`U=`mO`VffuEV82?@i|^;ogiO$>^Nj0j^Po5 z6ZOHbjgb0>3>Z)N0Byzigu$kUkg0JoGUy*+jGyfMLmu$PxSxBvlpa2Q;-kN7Yg=9z zGY+;6yVAp*k@We_M4H2I)Dud8=@z$xHsN2qcq#qmU;Je{f8mnm7v`k4^yh!}t91VS zgy#Qj?1D~j@0s-9{||qz{GIgLYnSxQg|j@jAzRuK^By`wI>%u#3u@Fn`O)K?0nMM;gNdsQAYN~4|fLl4l69A~yuS-m4}V|_f+ znRXA)r2qKxVfx22hv|#?v+3Tt5O@Rux!U|ZFX68O6e+){SZ};shgMS zKziMeH4u$*;XAF+Zs~yVzYREzJ}&qGY6fcv9Q7BB(`Rl#EBBQ;L%5(v5!aD}rXzBV zywf1?YY3WAwxZ!+&<$TM`uZC~$lz2tyttC*@j{mQb*#kwM?fMD#jMl576gHSAP&eU z`)ku~0%$e!iyw6~)m2>rq8tl4uz)&_55!Q7I1u?bPd#!#q!EuW&`hHq{s9$!O9g07 zBi^cf;6+b1m#aZIL8gILCp2dg4&DPIuf_rDcul9cI_U(Qno&VBP93iORu0^z{)prf zJq8kiC|g040U|5XjIKYCUei9cTSzDwjVA&?fm**>7A|mFI?$8{8AzX~N6;XzKds2o zu6m*(98l|Rv_G;Vj2~zbkKqD@|5702=*k9El>`qBh)BtgV1vgh%}{0Lw~vy<%c&Mv z#H$Avf9--N`Z0)AxV-q9o@G~XoENn6i;d~?Hs>V$;q5~I*}29GGH)Sd<+7?&5x+Qt zmNWc6*GWE!x&EWFLn|+8dAWifj<`BRFM#>ADwjF#BM64aA1%mK{~1;dZVwAId4Aw4 zEN0rYcyHt9P+r>fFY~W-q4Q$L;t^83)PaFPfn7zuI7DGC3dxs%D2xG63nAYYjDb)u zvFwz~w+Ca8BVBlbgW+puKO5XIzF`pD&IUeT!oY$3l-|yf*a7ZLP2SnC?0_deO$nx4zEN zT`h!Fe#7{?K8^T#h7jpWUcWw+tu^=U$ zcV)Sgb6=MZ)JMoR@&Uq`Uf%t~&bxf9Rf~8LB*}Uz$m&y4)bZJHMh-dy5YP3S zCuQOYV^nCQ%VF%Is6UXea-^FAbuunR6Z%ez^uVEB8}>4PIlt6v1W{I7ZG>|=hLeyB zEx;!T9omf%6P&+A0{pOuEC`V!NG4@d}M|9yCnpS=N@h(aht@;ODt$;K>@@`Fv zla_aeHTA`bC5`CEK%+-;n{$vu9 z^XCxgD5cZ?xg>eHOj*&(v2(kWwNVoqLLd)3F0(+p!I6va0NVHmcwQD9VvO524m*T* zFal!WM{nBEu`W5uu*k+V*`4e02~CZCrC~H=df47;*IaidZD{UVTiHyD%j-6PtgNov zu-mIX!60DcFLjCn250K$2aQJ$AEt$+#k8k>!hnpf=A(bGkPW{WlIcInI$e%AbJ^b* z+*My5rT$)wE9iZjzr*M6V`{GC`+m$V8Y${$=JPF;TM^EJ<~+6ifFD-QCQXkf%y;8f z*0!WyJ?X92FZuWtV}tMRNG;^Uu?R`;XGhxtY`<9inc=yT|CkzKx#L z*H8xmvH(bb<<-mS*S~%*4G)cK{^)WVQh=ZFvEei~`_$i}o0=N2zEBdJ-adBkcBKzL z_&8m=b|I^@%c;DOu3Wj2{>Oj)|4Tpm!JFxC-uWzDx^&LRf_>o^#-hIV^zLuI^v$;H zoO}1(57V1(UM+TR>Ax8Ed?0;deA72S|HaSK>#x6_Ub}WFEiA03JGbws?pGy`0S}|- zL&VE`?A^th8%g76JD0~WZ!$+<-1U<{|IuoUlv{ePeti8C>m`?Ay#1Y5-A4FeCo7)} z;9GdK6?rTzt)?fB=F+)yW70(o{YSnCWmP(d&a*@IRq=P};EuuFDqY{L3DB>AGl92wu%I~BVr zIZAx_@|4;mI+|zi-@Tt^X1GZ>?_%Ys@MZV;q~tJYgZ{hkzUOBmpLyu+&O2}ED|8Be z_~C&azI+=IS@0t&{PIl5eWhoL%Ex%6AN`CGkJQWj%MUi&M;eR$Dg76(9i?fd{ONr% zrS*Q$Q<+>;4AkKYcy%SOO!e7;Cx?!^OmU>+f>ihbxWx19Qb7FEM)$d0K?IUKeR#q}zRMK9 zg4pMPBj0{AsEpH_%AN|yqD5PIuX?@=fEQQtGQ5!OE+NqD0tkPVcAbDA27zW!`q!r0 z1kkCgs0UU}zY161095J;CWr)Q5e6b2X@OJYHbb2rxIm;u+2FXw7gWLLLm)=^W}b*g zS~C=UvOS9hIHC9jr%}F+hXZQdx=qbM8Y3}4@n_I#8qb5eAmN(N=Rq?r;o>`~&TsaO za16~!4Rrr05kW0ZfN&iLVq$2FVB%zy@CoEd3yAz0r!EutRep;k13a`!uc4l(jIRQX zH2GdQm3WnGx&aZ!M?R><%XGUzg}fkBFzBCvLg*QKflNj)ptPVvzqt%~q{}(z%qBm8 zaEUvp{Fq&vC;LVmSHjWXgh}#01^p-ToRJe1=Jh6*l{3%y$`|vz_GXNVE+P5x!k^!O z)X=iSi8mY;?KXY@^1=6xD7|QzxasiX$O5vAVfb@3s?piRSpk$MCz(p~5m>#MVcxT$ z5ISD)mau#{&g`i^m7z38@-SR+(=A3U-xREuz1aEZn^(2q^f6crbMp83HlSSIX;+MT zdeQYRLHXNCXYsg$QE(R{9Y#O$xkLj4ABH^AFzzW`FV|j#YJs=KH}{lIdArSGxFbzv zS%~IKIC9#i781~8citv6@NJ~ayZFKw$PPb@ck3H@7oT?kvg?mH<=OFP+>C!57EO4< zC?Lx93H)kIm~p+314nK48^>R;d52%UWc#VR)f9yS&gpXl5f3FZcNM?mrv9lUH_3J+WxGr@Ivj85otrbjy8rOO7woR{lRT)0jvzMcM|dW@1BcOcU(ILL~H6ox3` z`6XTpsHg*9&h^M4HRwPihp_)hKIpFci4?{gMok|_^cc!@hAhItHwG09cI@(F(Uy&M zEH($yfEJv?!$Wrc1O2JLJ0I)qkpqw2f4zNqHy{hlxMTw(BK#tsybx3y;7h!)ZW(pJ)K`li%ZLzzc!>do!&vp5mfqSX>rkdf<7?@7ZtyI=Z@yA z4bPw6k!YRGdIHcw`(h?`q+*0%mn{9ucK~^2Jei&Ik0t|ygD%4kDC?7-8yMa4abWs> zV|_Js_Y7*@l`d%RrYn~&rqQu6 z8@YRWyD4ZR{KnR%i1RHs(lXD`1$fGq+08iI2>ciS?l01%%U2|;awJ;+X!rRG)9Is+ zK2BYoy=qsl4Rn+QXKZ{x?VnFio;($eDfbC{1GI(PiT~gK-T&ZSbZ@C?s~Q8lN+C@EpzGWD_4C1$@0p2`uO^1)*B!j z{*KZIAAFcD_}1loGcwQMzxa25Wg{MX|2x0)+cx-hwDSW;uj^nK!wK&M2O8VU8dH4t zk@hja!AqV)rCb8iN+%?4u;$smCVhSSbk2rJj@I(S48|`mGr=H_v3~aH)3h#p^7!$F z%X2)xiym`#p3C!YROs?!&f5CA4Sdk&8^IVnZ+!eo8XOvSS-u5`Uh%!k^U@Q>I+p`+ zdD4@)Md?Mi<^;`~^NVR@WXv+h@OkUjt#t1Ev}BevpRDcWFcw;2nsV z+Y#-_!G;4L*8mknSDYsov;oo@75rU8)D6&>h{$`UdKw-LGLv!^0O99>+A3V;DwjD8 z3Q2?Ol24Ivk>AQieyb|-P&|oWyYNc*rJz-tUrH7)uEfi(R^;VKc2=p%ui^#wM3F$G zPz@)LPJ@#SFrMRIq_mXt*9GX*v(@M_m?QE~1UR)BJ!s9CU;d{x}2 z16~S`9z7-8zzJR>{W%b5{P76GMOp=n z@a78?EW0;e=~HGvN|=7{#ool*JxkXQM(e3TG8r|Qj+T@c<4p)kKxv&iFS zz#Y9=vLl3#`0r^!&kj9b7P7<9VGMg=5Zq0>Hj-fk?j)-YuKaHNS}&UwM7Z;%uHX*nWebr;g)Wy(evj9=d} zBGv;X5N5$)U4%jj!>0`i3iE<*9C&y6OaofH7_*R9&^)nFvEeTKz>)4oeWBMj*qMID zgM+-7$h?uKKxuEm5iWS};N!dchj9|#yt7E|xDO-&#&a327Pom655n_~I60~Wjefxp zhVxNeTu)Dm9ex<@yh9H|ppW$SByJtWpu(c6Up_~FSqRd@|6!npLuav`UzST@b~?Mh)!lBFgL$;dPiQD7Ly#i>(c_U zUv0tg=W^oVP&D$wE${ZpGE_f_KF3h$TXs@{W4Ve?jQ{XR9OE^8-q~HgAEv^{5osWP5R zF(_hHKnERHZTrl5t8!wVV(s0QFHolUEnLpS-X zfaaVfE$q28g&kL$>#ODsJ)4-!yMuN;H*TmOxkO~ZKVZzw&89nA|bwUE!_ z(CpC~=|zW+t#T0!#xZ^@@eb|nP0wvT(ieV^fhIeX=zsc_-Ph;?->~eKo-eMj>yzDY zDQ$=sZU@Fd*)7_a&X1%u&9~>yUGRA0)?JQa@_oDW=P~4{^_~-oc#(^I#>bsox07$t zWhf}U!Fz?vcp4lYlC0a(lP6DnaRa<#Na^jBZVM4!F^mokbA&PzV;;%7uXep7jGf3|fbUgj}zy0&{#v5-~T>}I9SFT)2fBn~gm8Pc8dq*AZX3R0iU%fix@87YLd2(`C zb4eK!0zNM=H9eDFxiTZYWF}#!uz1_wmp&~^C)(0K`{#e8=jC1+9T`hAGt-vggCJc70ovX$s8KgTsttBKK$^yzZc2(_uyrE`kZfFMkjCI zx-WW%>34qjcYLImqru3AzTv&$_T4+4x9{D*msVERyc-U^oS2;Svjl$81N4$Q=|AQ^ zKcnooS-;qQc(t|ik2PMp(%9IrpBWevG2$We^B2yE_PEp89nQOfcZD*R#DC+N zqUQncAsDE+>}7a(#BJvXnwvMjNK@i(aHwDXn`H&i*8tCuv9Y0aFmCf8U^=547QvPd`Z)&Yx2~7_KKZzqhBm_wTANXQj`>HUy$|%m)~2 z<9WpASa_dXU0w06M~v&va37ZU7waNF7W1i-1NYS<$!S5nb@dLVp`Mif>(|tl{kHUr zM=IJW`AW&rQ~%g4o$#y%~46W$YX{Eh>cWH)@#i{V3d||YzUl2*Il}LqmDpfKfGs*yUI3Uv81}0g2 z=|b`Im@1W4b$=tsq>t(0*Wng*92)>nAU&sqA<}ESaKy_SK_jh(z=^!(IM7sgkZTEn zThkz1(;y7g`4I-fr=wJvqb1zHJky%AaIHoJJbRq>^!+>9`OdA0)+i!5RyI8nt1^tjswE4p-v0jx_o#+Kk|T*|5X7J zZkx)-1aF@-Kmo#amAHVwYv7*-MZV!0bQE!&B^}p@0FfARK;hug6IfN)>BPgYb)!H` z+~hkLaru!aI(kfJ9QUc5(*%0a%k)VjPLMw&mofleRA1`I z%EIzfP$J(vc}EDiyo4!Di>ypqzRMI`j65cU;lcz9PntvYvgw^J@WLA~i)E+D_X-4` z_<@o!^l@p49`Q=cj|+@^$}T{AY?#Xb^AR`6gd|?NeN0#{s2qP|*NS%o>IIMmKE^$c zlVK#|*Yh2P^LGIAF260l&qv%l`u3HMAy4Vb%Z9yzC!eFYl*JgxZoo+QH~efg%+5z} zF%Dv^Q=V_&E%6*K{>FA%lfTAJzzy;@MN9Nuj<_5?{FSF*v-QWlD{J- znb03rS^5PbA$LiYH1sIT7zAk}hO;wy7n==e$XZ$PeLv)zrLMp3Gts16p~63Zi%4~O z@htx=b-EsQy+IEHm=?JrjB&q{NX8azM8E$Q6A=Kjb#> zH}|#V&mvNed|%3gvBLPmQa^jgR*^Z!*H{3;A4WeG)g1lpV3%I$TN^zzzA*l)=p8*66+8w? zi@YmHtHX;I$J6VVCemo1`dK==v2&E>w^&R{3Z6fOjQ-*SCZRv2j~#YmK@fkW!FNv9 zALdW88Lz~VFaiSs!=L)Yr5S_r$YLxJVQvJ?yo--EUp%6)>t)Oek2*zXe^0VpTTMHA z+hVUHwRdqTMQ5H3geUEHQ{cx7EYU}A8Lx-ZmtFN8M!=oDGiiMXgW8@J-m7VTVI@78 zTS<>+pL(a%uIgcT(7EX;^>M!qffyB_$z>n(1v`%JKX_mx%>4X<=CZtVkFlF~bn1!0 zysZU3{fZ9o4MOx zOr7ce0#=G(^U7V4A?WQ}o?xZ*0e$#Ud?71T#ZeI31&+tqj>GrK#{vm|$VN5+~|Az_I(@ox-~bw z_Qq>zaxxz;=YN)qo_8wW)7zQGM#s{Zw{Q7-czkovKiX(MV{XsLF3JH9=6WqHXz&P+~VfGzTZ5A`Q=Dr1%To*RUpJel_qalU~$GB%pdpF6KP zcPoAV*-gzI2YznxW9#6c^i%R)QJMb!A?qlgFS-BVe)_GSem4yaj;2pOxgouuPs5|5 zk`LecqYVP_d+**o_uu%$h{j2`FQ?&K&)nebxm0aMX3)h@h#p})Jb!-DvS1u`b@!%y z>GnUoaF~93ur2*dE(no+=6+)^Gix!2=H}u8>Nq~*GWsT<(Ths=)Gi-9z`o)nd(jfLf6Syu_iXTEj$A}Vi!YKfLE51*(p%HjVDEN5I zuC5EH(|{B8wty&Cz^Kh-ThVK#+uW%kw`Mp|?i8E~jL}?IffF^pnA9y^c3SGoHept$;`aYP|3R0)h(xbc|Y!SxK(PP9&sN)d^!Ut*``CfpO=!r5B z4&1K^6i1$(7;5^(H);LBuU%A&YYBl6egT)!AL^rRF}97uAMon|?~G#zc{j#F!F3wA z_&F&D!hv60gM7hllqIZu*P*bJB99lnNCXEWyo@Nl@RNU~RB|q;FzGq!JeN}he1)Cw z2aISz+vG{ZhknNQf)O0+J-94>^zw+YPcKq=;TcXi;9;~-zUzqoH6wTt7yo!l#JJ}j zf$*i5Z#O9nLA-P+>x_2?vfx!*=_Um}B*4Xow!km1a!%79Ug$9p+88FEs=O0U?x-9S z_HkjojCw~P#z3XT&OmmSu=9Xp!Z!F}_#;i>eC&7IKE}N47ek-Q`rA}2G?ix~pVDo> zE!gI~4P9=BEPvxw!h zBZ(mNog7iT*{`up59d(!}`GuD-PaOA8DZ89t6pIr^i>+=f6F##!K6 zUle^%Z7QW;))D&DJEaI82)m7)iR3|Z-wPt>v)fZkb(O_9q`#t_>lUtn_5svyLlyb( zSi;$GfUc6Sa*FffpXr=U>@qrgHXl92Xpnu<@&c54Fjissu@TYu*~rlBSfo*oGTx17 z<5}Uk@I<eVaU3noI}-Daj~LP5B@C9#2Z4(bFMrE#K#R#< zA1A{o!EPzO_lFVCG_;_E4vQm4*2F47tzr1@JJc@pFW^JIW8FO2%k0p z^hUI|LkmgrjbGXapU6cK=>SIkW6OY+uHiN`=k&3l^$^P6GI?7yx75o@qur+qNns* z)`bJ{yyZToe|=lH^h2yz7yK<&&DR)^`!FPHJPeI+*++X?-#Sd|+j$};jU zv7t0IKHwi;E?zos!x%>xue@?Kefrtw>Eii|HYof1pq~Ha$!Qo#cl*=rFTYIZ&hst6 z=(C(p7$1PQe9?pSz58q$9v(>3(^G0whmC<;7%?_Bme?iEr8=IwR337u7jrJ{rt7c1 za#3|_Y%s5Aj4&Q^+jr6`$0LUZ(nlX%cNxYF21*+WRhDOACfsJD;_}j>cdwbvl2x}O z01Y_Qyv;ZI9zTAXZr-|+-r!OWe$N9}a^V|?d=u_Z|McIc?|%1n^-akVL7p3Lzx`(V zSO4md((A9imInLU(|`Z3ucx2<=xQ41>r%hw`M>F_>CPvcg+J=AZ`0UfqC5JQV%{Q-U{2rw*KL5hs)I%odKXqgL!SM`5-_|zP zd<>TIW24-V-QzhXo-qM``?tULaawNneem$1aEC3J>8UB}=Yt1N(vuGpsIKBGHt7+=om~^x)eR=Cv8XO$*j#tJOM#J`wY{bG%PK>2{_a3CzUw_r# z)ns1d`+P_pT{QpFeNHy8yOn2dmZ_Zb;GG@b^dYyUv#St&<-!hj-wllpc}~SR2&hN~ zwRcrxv%S4n{kSLHltQb=$dBh|K62mY-IdV70Gf}y+Z?9(UgJ{ve9w<#yzIDrEM4YX ziWqABzJM0c56q{-gWfUAk24SXHt6Df8t5NVUvz3L@+0iF!hPbmQ*-mZG&6n9eK|2P z>Aw5oi_iUC#mR|r&(HA7(PNCJ_wL-+yV90-(PGr*8HP;23m*7>EzeEf_ZAmdq|f7$ z(@=VF|DLDDvz>kE($HS|r52dNliapg3qi1|;E=1`QlQI>Eqg z#Q7s$fc!V}8Mrx3&Ty3#f$t-hvqU-S4|fPLN&p_2^ytbLkYug#;M~q)OodELvvb*pJ*p($O%87Rob@& zg@+m}gJ=U#;}DK`jRQnp0n@4Cfo{J<0wv<1GW?-DVbYqr&VNdo6Hvzqhik@dR8&wR zKX7Wl;5E`-5~!j>fjtHWJ6UXDxLWe-e^Z^to>LpzItb|@e=5V3b2 zsRl0`iI*_n!((xSA#GnP8VqYTir6@KnD(`JBF+oyo?O1*gCoW43@rXO21E>XWmlfV zwU0rMBY5OvWXwAcF)r@z92yS;1V@xP9=0dGTtCht;s!vBnQFNjr{#*;C0T31u8@!I z(RaLX({Db`hXjNheV%>A9p+D#H#@xuKwl+I7x1s<=z(an@W{_@%2P^GmOQ~RO?+5V z`WZf=LtHQ3HV__@wA#}KNC?CIai|8;zlTR$UV!lrx@w_b{Iekq+F5rP3m5_L?Wmi! zD;!2Q?@+^dq%xHC&N_6Eg|hN7rm@J%#;(rPp>z>YJR9sVV6mWX$LNOPPGwnad$*D3 zviP=v(BDzR$fb1A$_7QzP}s&Y=s7(b6`@JGc@rNwOn%PeyIsatIdC}61+O-Sxi0AB z1tbP797aEX!%qt{j?=La;wUsnwQ~Q7cS#h!DNj2w3b5dI$KWAv%K{!$zQKELJ4OS- zx&7JT#zGe3X!}|C6u<54tW%zFl$rHHHRof^>SO7F%Zq;-Da9*`NgMtK`cqGDHvF-R zliiN+iy;J>lx2~N5f!5aJaQpO-qnd=QCg#UfJLk?1W}xEjGn+ZxFK`eySBQW9z9-6 zx9`oThfkK$>c);2q@G_g+Lfm&kc8_{%%QCI18IcX?_#B z%s@aH1RkLTEMR%ijj_NSMY<97SLqB2Ps}Bq|LDBtA6}F_ekm`xo0g9NgG<>x;ewFE zPBTB^Q8;cB^P>1=c9u3k+{VI#eSUmcPdl5NHZJn9{OB~8c&Mf*FXGgra zt2#)4LwHB{t2-&JY@JEVJ8fxmd*8d5=N4Ae{d;qAPrP$&X>raw_4v--`ExVs%Wlnk zEXEhzUmRiQG6W0@7y~%I$hX`$Qn|dc>IsCgi$E|$xZk9M2YWkdmz~$lqX!&K-c&ni zZN2~oqaZ)Z9PA#cjos<#;+puwAl;@pw=I4D?TcxC;i(M=7cZPoAK&=I#>!>!g^`?{ zOzbE}hiEq{!Vuy{)7jalo;L;tdY#UcN7o@6Z~-puz@YVz-H!8%>OS$I@!dbr?c=)a za6?}h1KdVDIMA27R{#xmA`)QtTGpRuft`aKt>#;wTm-_7sn_4Q=4TUpZioioPa9Ny zTq=YSiesnjjO~%5I{1(F1@8d7@ys~TbMlo}&ZQ4N_}B*2nVGR-=wq%wQadyssa@~> z=7aRsn^z<=3ac!-C;#e|E9uYv^iR_2R$qGM@>sesGi1XZpTy|x?@XV6@z_VNdwbeF zPjLhldCr`l@ptt`hKBuvn5uJI9zA}Xe)yvwdVGHN*%#hr*4^7J&F2T5Tqi*PGmoGP z^H1k(oMMgwu#0(aQ2TgZ>`EU$;K=XQt7&3UZ(W576aF8RbXVT>4nC7$2 zbX|IaynpkXkGx~>_$ano#SA0`3c*x=Yy$9)o_doD_j**l8z~FpA z`bQ<6FH{dkT8_TcPIwp`>=BRC>D;+<>hmwsy?c++$mmE~lRmPOkNUZ3yRUCR&$$lo z4rb@?kAM7@`Y@#%pWHD0(UAf7AG~7l92pt({6Kl0am+1z7KUeQHd-=&@eM+Dd?t?( z%WGmh-MV#KbD_q{kmTQWkp8c4ok>5xca$D(svYh06SE<0LPCmZ4$3Jt#Jq128cAue-VHj zt`LiQ;O7}DeL%#U)1L!X70*B;jX*dvQTc*rCjUl2P?xFGYfw5_fqDWx5(A+?BdN-Z zazKqjke9jRgG%pP_p+)gNM%Z z?ZjFfH4Jzv%rE*Zl#HV?##8uE`jY9EI#lO@WR-1lygVbj%x~tt^o9QBmq__^iQ9pE z!B@KFqqy5mE3+(pESO?Y6c5yKXqn}-1J!Tp6ru06K;bCx89g4)=p{J6gtFL^%!Ong zRT!fa)Q;31cK3M~5p2kDIRx~LLBM3sdM2dtN0KSK0L}B^Uan6SVF1Z~UYNK(6Tl!u zI}}%2&&Y>gj6p0kz-6&yBi>nz1*j)RDt5M!j^mqS*{Effyr2<&2L`R|{GB-SfKd^{ zSH@>CVZ)*5;FHIq1A|nin+8Eq$1y*7hoPL};j_CT8y1PPJB~0k;R*W3&_=$Y>F?^|SFfP+aEZ}mR)E3cb$c1o`RbFTwr{lul8ghZY%LvaqSV&Ww z$VaB|$FXMObTVpEg2ENAsvm_WQxfMcpF-f^2R^gy5G zG4ILm>O8B3VRxFI8ul%uwAV+FCD$GdgCpIkt3!+L{j+IdeJ?F-slhZBeUU~%3%zon z0ZP&MV|Zr3kd2{&ksz1ZC}S4kX%g@?lM2J1LX07zLCbYIn&&{;ZQt{(@+33nUd<|s zyP$wDbfByJ11*wwR?_Ag-{{(P8T89H>xw_q6TmmSgw->ymbr?#*7J%o`NkXH*W!5e z>TY{l**TlmH;>ZV=1y8$T~7}l%%(dJ7t;N^kJ7`3kJ7^8to3{`tmadm8{9t3&e(qM zMAGzT*}8uvm$TA?wXL&hb#+7IL}NqaVz95%w?EHJjd&LleSG=CB^#8Vh=;e{dOQ94 zH@{AoE?+i%Q4-|&hPe=*BfZzJUr!g#Uu@(BAgAaee{)lHa$E1p%4%9zc$ywP;CpR+ z(@bN!gE7{Y9z1$%LlNIH^K(ctU0dHs9Nq6y`{<3TiU!b~?4;h@%HLb$k`a!_PEJi~ z%xNqr?dF$!zim1f5TlF_ZZn>m8E-rf;?%(j)fFhkKEvy~-@PWrE((s$oJXX79G)6?CV7U$Q~?c0yifASyy z%rffi>UBAew2q8$+_u}#V~kOQgZ=6H#~+LSWgokJ^!TYehaGu5$FtF!q)eY(mhAkx zbN5bq_0?;h7X!eh#q3aH4!I$^Kl;g!t)qNzba=Qw^{6ZtPki|$XG7aOj|~p;&B?Rr z{rBHbKluLl(}hdt&98ruP@649#rb>)#yaXB93J#e!mb{6!R}cPp3FW8bmj7u z)IZp(F-O_LvmBq9z*x^b#g9mL@7_)f;W;{?jw*<5dw>9lW<6@+zyjPE9V8fU7R9Ij;Yf zr<@>5L|{B22UXBJ-!HkBF z-V!LzWDEI7{?;M*YvK6kb~GILx!6lXD}3kxUxk*+oHPJ7Mk)}LY7QeDu8!Au&1v{R zbAB^CC#_Z1324Pjgngx$=#N1Bzl`gKt{NzxA={|Xa!NG1=P9~j<^kB0vC&n z3Y;CtcnSwfDQYn7oZ$&B@PT+zc!DPmje_HFq{#;|QVHVg0Z6^1QK!-%nP1phs0AJQ zB*lZmMKJ7?rCgzvNed@d>Ljor^vg4PpLcRKaPUoEPK$HnV(6nD;(A&2&Og(@2UoSW zb;<*$spz49?=At&=Cx#44goo)=+aI(`&{qSmun0Zp* zL;a-%`~ka~FjTsq)ne&!)ae%@mw-5OgZF$4kPHk{7_r#(gQ3XBfEDLuirqOZ_^3NC zsFcQ{O5tn>%Zn@<-!SZHfs(()$4&y#lOQOY4Rsi!z{!R_?-+C$#W7r&Ms^%EX2%-4 z{fOSO*Uy1`8h_11^h|sNdm&$BrO>^G+*s_b2UCyU7cK zre))HB7uP8q_U+$qrXzW~6S3pI4tDM{!)k_)pMXi`O=tI7nh@miKZR3>cVgbuHGCBT;5gr2| zWmsUl{pP(rZEfzRCr_8t{fG1E-u)#lCO6WW(x{h4u;Ub;aoDMa-qgfknw}iiVmix% zn>4A99W%&zpuaQCjC7}-v-@ddr!75NPHA(WaVZgqZ}!p}JUP%O=)W>(r{`zJox(Iy zg-BAjX(%#3Dha_*gt3XN3G)Z5R?ZNef?I>y?s+zV@n*u*mj|R}>awIW=9I|)gYC4l zv6ME~m(#A~cow6q`a{xDQO2F>RO8S!W)aUNVw}%H938bQot=nOdgLE7HusLw+ICx7 z-fc_k91q?*&_aC62DiES#dQ1beEQ<%y>#pD{WL%KDD7@h`a7wrIdSvn)WoE9utPFp_uUsaZ>A@YX49R!_qdT z^#_+5ZS8EQM^8m(pgXN^?4`9Wc37WHchrIZtAFt0w6HX19enGxtEM|KIb~zc-0WOB z&yA(~?7))TO84*wgD{31zJJDUJ|`=kuE_GpKwpD{j-Hztb6W=ohtabJtTBJLcG_h0*kjFTP0M{oZ%W?k~Or zC@FMwrLBz(jl(|oUteEGntMDay6q`;MKONygJvt>@%#E4ucd$aFaKqF^Ub%dC;Sjb zSqy})zIq|u`1te0=PJ1LVgG<1lGwF(kZyeXDE$Y&doAr?G#7pPlKO6Zax?wxXWvb> z6Dhv3yy|>EGxVOpGmEj#JoR*T)`q~>-*`3c?j;+0*s+&85dG_tU3~D))Jsnx0Ob?Pt=&#F)PoIw!s3;uwrx zzx7+cl@{jbJ9i9p7LS(+>5Vq%s~$yJxr4tkC5i#l{epfGmVdrr+43b*KHmh>GyQYvy3soGmBk?e0!5! zntlfr;HkC#=bgKHCh_S3ezZM*e!{x|A3S)FMkgoJj^yx9UOywg+tLS1YD=d|p<|K} z^E~<$du04ud}HLeIW2^ zKf*vAj(h+O)TC`6sLKPzk7!E>{P1h!h}SsH^dr4MLjg&PX)4lyC?g1RK#*~H2kOM) z1B3%gIA+WSZj8!sq~Ri7=SMpJH-Tn43ey%VEpQ zF*`i6gI=WNKMl_iWbhj#U06;&ZyqIhTrL8Q0>u|!E(<1vlthN-YFjn};!~pbRlm}Gu_p@|WFwaibD|@8*$|k~sK8|% zk{{x>6Ozki;bj+Pp$Q6$X5)yC>rj#x2P*3Y1nDFr%S-|I|jbR#r5=P zc3F$Mh4kRjisBn-OAAns5A?|6O}cVK8;*Re?CQnIboG)J{gTz@)~4Iaq8VLVU0W5O zXVS=UUz#3}tTYcTtfzE;MGJkk$;WQhKF^PNU=<*ZCc2@;2`8&)MitLluch}m8v=9N zJtwK{`L=X`bP9nZ9|2OdL7#MjVP~#@y!4nY6lnHm&TQNy~ff^4rta>UvsR znoVEaUQG8ME~h*9AEr+~{=^qE+`4nqpNhX- zf4^;XbSzEJOsPMH)kppAQ|1_MerHF~?Ce~6AlmmI-cQ?`d+D%!D6MYnrY`B_q4b9D z7(RHqmCm0VNt1&e?(eCYb2iR#6!f=#`s4KBhacJafMJ>bW6tIW7l1i(cw{ua_wIXX z=G-}r0rjDH$nwnqDz3M;Gc7JGrlsXojgMX%;6_G<#P^8CN_U!l^w^(+xO(-K^zp|x z(z%&w@0_x+T)NTKDXl^+$~=dDdq>zdyDZln=AsdN41eL@KpZ?qT((nH4ZH3W065OE42w73Hwv%e zi=Fr1`yl=3CqGTMZr_p2_tMZ%zjSNJyBt5g@rkrs{XEpCzV1s8A3U+q^Yu60@NLdPI`Ay)gXs6skcY%EczvM>mod#JFj`Sv)i{1uZsR#Z(Vi% z{QRN~dF;UFk`Vah$nQnz@@>g{X>m18O^=xmc9yf-k!K+~mirlf1JozE+Z9rp>g3ym z91Uk)pP3%jGvy#Xe)K4fj7_Aq&F%D`zSW){FP=#sEvgW&uF%u8im&SOvqnP$A_m21WWPQz^lSY+wE+Cczeh5IV>+>e4n#xBCm z@Upadgx2(GAl`z$AC*dL?o)#zG&5LjK!wOSIU$p9H9SKg;I#B(Fh-z3R$=&cT5+e6 z|2Ba(HTtZC?T8ou+k#qrr_n94I05E`x2;om00ITeesj1PBCqxX>UdN_JaEy*pjp!Z ziXYLI&|C&+jz<{3POl--Rn{E{4WJfGRhI0irY7m|GYL(8oevPN>pdmEksfiN6%$_< zf=1z`F+fXwu10^D4IIX=`?U5+2MJGU9t@0`Qgp z%*0d5SVnRoGy6at1_yi`xbjX^$IC_u3i8s@sW~3S8+rne07OCjLf??XxvauY=8s&F zp^uIEt%gNr{?`DvDYwt5u9}yT^(a(v-rh z91FtQ`Si5t(${upDD6hM97l)PJts^%cK%VHtHvoc(`V12Vz3DX%fiI-OEztg4Dt&F zNX4LL!y0W>Dc-VG27F|gjf9YJMY%ClN`2wPJMEy4Y;@6T&+4T#^Guj>qCwr+6`rA6 zJTtEV>5V*gaH=TBbm$9?Y-XO7?j1=03lMZfBq*YyESyk3_mk-z8&p_K<^FULf%2_R zVZ0L8qL+`i5{4GW%-p^(IAOqI;pR4%e0C?WP-^UyYo`oGvP_$uQY_@MVGjdfrjreL z81jw{a~P*=BvU-!?Az5a8e+7fY#84nz4L6LD_ZO*WH($l-@sFt$Z0fg`qL;^2@s~rB%65(K!~zTo!@hZ%d93`|nGC;G4xTZNbsE zo0}|}7t@{l3+dj2h4grSGp(*}rR{yS1qGyk&6DcZcx1cAfEL1+&W)zaSEkbB_^4=h ziOyD9TU)j9l5c=*ZEdFY%^m4PXBrvqPa{1dB0e81?x)A=;uS_?Jke0MfgpM-r9`3C z9;cya3V=n}AU*cQDOTVpD-7`)gMp~aXnxCvK_X=?gJ#sF@zi#(ldBA4qW))NO|I9p zjH~jBFutLCu(zHzSLVDUkYmDU+q;z=JDeDyDi1mMWu8?@j%cZMD4p30Y%cbp zFZYhx{ms+0jl(p*+nyG72NSlTy)AC-eU#?rchmjHbLq~#`SjuSPtuL+H`2$~-%t1N z-Bb5)!|8aseEG7E0!~bhTDSK0`G(+<>+Ez-t z`yIYe=D^Q5PWQE?FCHwW|K#s~H$9n~wVd9(b~!C9tq3O@$=?6qgY^1qSG}u^AIT6U zhA9l59i4g1fA-mD>6NP&oW_oDAj{XmT$gl}Bg6aB+sBV)MQ`8j=mHVe{XL`8W|l= zfBZ-PI{o-3-_=}R^0Jq%T)C3|*}wP~>Bm3#LHgydZ>G23x|~La@`V%_*?M}~)9mc3 zWOhD%@9kI8*7kwaJb(AI$8+2njlUhuclkSf%pLPfi)ndjDP6n9?!Tk7w78fqUbs+d z%uJ$djO&f{4I2hAy7GNM^7FIfxG@|b{piDw{f$B9QFM%NPd?<7V4Oqj?^Y&X~n8xU!NBy*PH+t*YR)pKBjAGhn$ z2M-?H_jeW1G3pu~8O%n*B3IghPV!v%;De8BEdKtFzL$12HZhp<-OcW9-YK$?k~--# zo+-$SzJK-FRrC7Mho5>kAUhKI(Td%Syle1HK#o(hW6z(GP+QooiP4hO=6?Fm-e^m=pR}bkHF(aPfJ%D&Ppw6#l2L#SHg;GZ-v}c8yc7(%k#difHH&_i^5?awLK-7*u zrT!>dL(q+MqZeHMc+i#d1|t+7sQd9-4vBCLC^*n)1~kj)L2sB>2pEt29XUUA@b#joboQp?9d8`F!U(AHHtF9i4gioN2LxPU%{VVIX7? zn9FA4TI>kK2E?x}cOQyp43fQCT(e6DLm!3) zAM;h5BeTAI!@O`jkPqNv=sOghvyunj4a?(*ov$2shBhCrM<$ek3mYKK4aPz)ci7N^ zZ_B$_*g;79G5qnNc=~{T=5m6?#kF+r{(SoK?p(V6a9Io6EgKj3_9pc5w;e@W3wY0| za{YZB>D=T{x_oic-~MCqid;Dc$HJEzCb@B$Qge#$XJ{-W3SGCnt18?SS^7 z#uY0leni5U&pe~{9x;x@>luxWqk|pw8{@qr9qjL>hpTPr=~h=-;wE9yJ=8*fcXLY% z{Pi@qu$gY&UP=!iFL)Qx^-n(Y4y#9xAEl**Mei_Tr_a>%RGJtcOQREG>bps$^-3o+ zcEl?;tncn}bn>Y$0^!1^*|qMpy?dAr^z5S@XFJcNrA5Bgwv*-_f8p=FaT&n*^Ow@Q zzy4MF@sGdf?~V2J45XpqL5Y1|`bHXM9v z!+3n<)mJ6g4I8L#-MXW((Ipw>aXdWKn--T=HGcDMUL1zcnW^b?;rxYk_3D*$>C$vKS~!bOr>3Q6F2dW z43DKh`r|)J7cX7)&O~@dW#F4OSj7rhJp|y4kM?U^v4ifT^qsd~(Y&sFGKG&JlUslP zyMO-wO|M*jMd5Mvg~sy!Ve0SgOn2@*Nq_dIf1Wbns@qyLtkcPmRh!XCnpB{*(bBU zxPr?(0`k1W+}GyICU^!hN86Y+)bE{TTtLAw>W%eH8<8g_2GY~HW!2T|TWK+1^4(It zyGX6=8i#pKf=Wn3d9_VE?>TUMg6Y1OY;ohuzU3IiJy^t z&k{2h#$Arsa%(h4x9>l=@1yR}<{9DLul-ztF=975HtKkW+<6>B=K1K0bC~-yFYx1A zpZWoVFL{q1aoh1o`tr+L>3iRM+Xh7X7=1)frza;h4n9jWGt$8e(;j=rL%{O0B9^XLLxR-$Vb|=Q;UDeMB&l)I1EU4NOw} zki@ONzxvhRdOpSoJUTio{?AILvuS#ILUZ$8dT{@N zUk1aWL3#y2$y$g>lJ!#XDvvCMMFF#>{{I`kC}+_m0x+j`~@2 z;GIjz6fnR1_e^R%$bPB7?nF{aV}2Ja<`H)S!1<;CjSxU9i1ZiLRp%?5-%GQ;1F^hl zhCC)HP@FrZ1!4_>a~eKT+Jtjf1S%J0ir0V&#n6-wr5eX$kN$n1PO5QNmmXm6w4PA8m$UmHR^ zK<(G*0CAwCnT;H@k9!FNU^BErA}wmiXJ)8tCmeAgXhfNa0}+mNO%re)s4oQ|ew6}& zTYML*Y2eCqMUssNCAk?+OFsc11Z|+itt6-9*#XV@K&!l%UTeIs3Q;!b)IP3;x*o!T zSD?{{q@y2^@5IVA1MMhz&Mtlw3y5&-8&7{)je7G@purd5LfLmx@ty31;oAHfMP;FBAN9bP91B|;iwNr_T;Yb%h-1Mvj&Q41&UEwW4u_Ehv}gMUXgQ zIpIdS7rB&mIP>6zghC1+1_NH+adt)vUBZX}gG^o|#5d^pD80ia&%f;Jg_NCT7>GI* z=Z006v5b-0p&WG{q_g7B-!6lBrDF(#M_y+6$KqcJIlsuo4k*03Z;&7IMz-{y{<GL=Nwh6}|DWP=V>V5loqMSaK$gQeoeQHl+Al7BYZA#3_jB+W~ftwF>H zLK7WC7mz1JplYo02bTDL5yr)R`nJ&UxH03?51G{28KQyH?d;;!+H0gaJj)ZFRYM(cxlf^V>znJq8S4v^k^UQMb}v{Lyui{ zTqfdj>MI)#_qaWKM~mI9w7b3IMJA2#u1E0#f5?MfgsW>i>A|Cgbm!h&x_y5k%|2aM z+HTszAXUaJeZ&Ytr?XyY!QORN3)sGNZn|F!;C|6nKMSlU;uW1?7ZxA4$1s4r*nvVi z28tmqqPsOtAFUjwFIU)6!kA%h$$Hwxe4}8V_vH8|*?V4s6{iWY^hYkEapdAe)W1Z; zJA=f#sY%DkCc>U`6=hDNZ36Q`wx7I^?Zf+m@4S4f01nGdJ&bISHs+FqMa zTN}$-$nSb*9C|`Qk3)W35p9b(?WRM2LzX!~3380>!^53)c&1D92Md3GoKW=`2KCI^ z7rm9Oqcp$Ko*r#>q_y3Sw3RqUsk(O8)BNIw7UQcn=-z#}l;)nyr!Vh6O}B47O1Ey^ zN{^pBNsDvy>B%gHksbHVo@ChD-R=uCh6eh4%yM+NJ>7r84-bc_UGvVqc*Ypn(RPqN zzrU7VneI&odmA>+y!Oh)w7IeCTeEu$85>OLlmmk2BrrOAEy4^{xm%`l14^{rGJywsV9#f`^MDGtzBOZar^e2 zG&(ls?*?{t=3QaXEb6SWp=X-=OyMi3e%-^3oqdNOlu04J7`OWk@ zKmJadn`hVLYMPlIv2muauRFbd?e+9WfBeU3XmBJ=j1Tw`5)f_7?a1w--?7V@P|51AT?eE$6 z^{Ze0D&4(*H$A-nAbtOb-`Bj5e_-I-i+czAHs&rYaJk4O&m)f|D`<1%8(~-^{81F6 zYG2==@aNL>xoPpqG1$E0tnQNs4<1SeGoF7i5OV|cpxQq$&}{<~--g2=$;BnhE6d)2 z%B3_9)ql%NE7k($rrWpfs{JeC6+U=oGfzwIV_eFCG3wA4i%^c|-Qdu0x_jqNx^&@^ z^@&S5mX?=2=bk%%-n-v2ugSX-xisVE&6{aOJYaylc;USIcf`*T?}i&27M=WDuLmm+YLsbm^jH#U&kAuACDuZQl9HacFd%+mpFfoF5o2UA*Lrd&b8m zG+v~DqCp>RmmTBO!w*RGWqxkwXElQ6$s#M_SA{J*`@ zmi}K~@J(pxzhulPh#%j%L<%~*1E6D}X92`e&wxg}P7F9%^dx})y!>W34L2Bg5v|Ct zaA`BmYmmrYb^`niDsZBTCb>KV3H`M3*nois#5~q_=_^M-C5MNV2pd z?(QbN0^&8R5zNowTo&K+rd(qVl5Dj>U+5Wgw}ueEFDzd5dOL{BFFH}^q3N%T~B5mMyWJ`niL=>TzDo>-6b zarp(`!Nx!f8s9b)x^xs1qxk{gq3{+-(a{ZvvhrF?2rmUO08G2kd&YlW9zYm~^ummj z^{0^(_%8z#YOd#b&tFd>n$V^C&By*|tO-U@!r#iUARiGNl_E;BcX1 z*%K}Cn7K?NaKbO;>b{Epa~v>|AQ-?A7C{%GEegAc!q9ek0dKil6qSe^6zKJ8NY-ryPR?YXsgFnK!dPjjVM0AjtXcgp2b223o1p7 zhg^zJ8u=_N0m;w1Oe{O-sE8(I3|ToH!x)aT%G8T#UQ{Zd1)cN4DV+%&I(otLu`g(8 zfrj6vMWN{!k37EVrZn%q1Bai0@pt5uriH!3dI?SY+wuzzxBe=RohxCui(|ZPgv}Q` z$TbXL;K?g8%nw=SD-w|tF2778BaYY^Q-8yKm4g5P|MW>jK~&1?dO>AxM#j&m7;}v2 zzVxfL^v4f0^&v0lVeF%X>Fb4(7(2*NXS$kn3|rtqxPdEZ9L070`Q?#_4X(J6GM3k25otWE>{PGuHOmx=0|+! z9lFzthm^XtpkW6~hs4E>uxyOZs8oOvFdG7MdIofzcy3ExgwgHn*xT1aBKxs(52mtg zB-=B*ptpOWz(SytZ^+qjRt(A-7Z_+!`@BmNeNa)g#TRYZ(3A~S9Ifi^>`EON+q96$ z#@1|9%b@yHhQ8sue$cleN(*_8cDX;RHsWBEdgA4cGz?V8JT3*n$b}|`&KQq4ZB?3e z$K}yO>L3@q+&NJuH!Ps&4N89Yy;{E9Km7#cgbq zjF3Hfw1+V54W7Y;JABJgecK)~Q%1;><6rm%8{+Jv!k< zsPu$gD~AemgEkA^%$xB2?9c*ydne5=tfkqfD_UHxD!iUHv=H4r$n~>Jj>TE_U7b>q zPfA^4du+5TT|Gaj1^=KIxV?S-)-lUONZc|z`{Zd_&;osGd|Zq3{&esDJ@bY!g56)M z>uu@(^WJv)zyIZa`edF;&_#5)^eK*c5r#FMJ*N@&+|E&5=?y!5_n8wFFLU3~o_v1; zK;?Hgl&5@XYtC%jURRJgQ}e@~^0ws;HII56sm$Jvif(H9-Bh~Dc)nDgJQYx!Ft|88 zGO~|odFS&S?D^Lj8J~Xd9!Nd?BdK@vlH@g-b~U#%&+r{n$P#BkekgtqIbyAeRsW>;F(=gEm;Ln1cRoyi_z!-Z9?q_&4?lR{ z>A(Fuzvb`xt*mT%R~KXbwb!ruI3|Xv_0_F(@4=VqiytM9PTzm{San^<^5t0|kLQSY zl&it>3-cb!!$a)IH1{5l*-thG@xuf=NjYZ9Gmbvvc3Xaoc=g(=PTSf!O7H#p*XjE| z_@UgfDo-;D;fN&kWqV_sGXn-+1E<&wcbczcKLR)5gY@`t;-U+duoMU#XaP z(E+AbE-T?8owwe8Q*&qTD)a#TV3#O{w>RE+&253ss^(}6$CoZ%^bb1mERSb%Z%?NU z)6DCB#)v566{8}@kCE`q%xJoG>w%x^dG5>a9_t(H>5bQ4_YYhWhi`61R^#Ino=<~s zKUdKa{iSSvCaFDQo?WY4$n&$`{b73V-A{ZGNM~nT`o%lHPCxq{E^kTc;~Sr;o;T7v z@4S(2$WMG zXvj&kv%Ztybo8(=MB0g3UJ|InWlzEhJp{mswv$);-xicgV;*qa%*pqUq|W~O5CRXV z+Y`{DU9GA;X#jko%wGzrKvV68NUQxCn$t96S_@TYquOXKfZr^QZwO{hf1<;v!!N6( zfdEh+c{qTKlIa(@ugZ_;PzQCIOsUrpb<{K?zs9QpdictV;t?>J;J;PbR`4R+=KP44 zIwMRQPl$&6R_zKPTxoa6s6iW_pm6e=`*CvZ2h{1MXk&1ic5|A-q?txZ^OLUNI$h96 z1BV3hVj6(}kl{>0;OAf#fdWhpfEO(IfnWSO+EDuj0YM-XFpUxj`80sc0FZEv0tFO~ zBqukQseR=||G3?eUZCZ;0IyD~%DF1~)vwzHXtXBP>}8q&K6RT1%E;HE%*Q0@2Ns1q zl##1{-eqA2E{jp6@$fM%@QAb809W~u2d>Nf|GE3KAWM_$&J#PaN8E@T`=0w!`(7v% zKo$Xz1PGE%0xkA3JtNs@OzVSeWG0iD^dyxMPk(sgYdtCj0fB*dE7q=pp0)bYWPNs)%$B!RBzI^WI`oii)@vPu% zZwoc!D9)2`(#cr4N4mnDm3=4#i#QaBHPW#FCa$1i9`KtsG>DViVFiD?MVXwp!s?Qe zA8`ATfp5!RHlT1On1B^|n%E|VNTJ}6?IT$zH3~d_S;y^(sc={@HASl@-12F%PgvSb z<(*ji#{?4=tUS~|>IGX&V~T(22$N`#2{}>_>Xd$hELFfZm4ls$t?kXx zr3rVtP}(JjmNt}mX`)Xa*+wx!xstLp8vzRyZ4LFCXn*60*eX17IW+}W5-(FS(onTV<%qP1(5QS%rT@^ z7z=#TThS$h0?e|6PmJP|!dBVJW>K-LdZHYp!-q~&3h;qK_|uB089Y9Cn^vSLwp?X1hc8nMHVGmNFhSPRbfit>_77{{T>xX9RwP2Ut> zA|gMsN#V3b@1o9a4IbIO4Idsm(~xp{+^fi#FkHMW(R2aQ4CpI(IVbyq8!m%+t`c>{k|DblV-2Z%R?4j&$7k?YE->SAKs*5V} zm!7G{aAh^V@P*IEOD}yv?V&Zk@y&0=@BYqj#<#xpoj85+loeC#Y@(e2NEI=u`NWT2 ze%)iu(@#GZJKM;XwkJqV1J%B@x#L$%&zw3PH*QYH$k2%M;>aP2X>^jV8m0O7|NcAi z`Okko+Bn*%GFtg3xh=2kM0bT3U{TfzSM1!Jy6yYh;3?-tHDhBI7gt5IDf;`nw#=ZMD2sp~ggr;j|Ej*J7eWt8z6=3PhITf6?=ph#R=UXm;Z z9e(-pWxx6kFYLzb?rx7a-gsMW;z=t5Uw!qb@$B=@`o2MS0>1d-i|X_2z)bnj2vqe+ zb_&}Oea0&4l1RQqv?1=9U0Pg>Q>Txq?pEUb`SbD2v(NgQG~C-7UwbR!|18tQiS8B= z;s+*C@bFp&2R7Il%KpZYWq%zU z(O{S1u&~3Rk$AaGx!qvb!-fCzQ~;8F<~6fY%BnG+!?L~4E5L`reGv*c43DtPDS*Fh z8o4gqc@b!dw>eAui)&Lz!hA3PnUc zZDAMkxRZ=H`3kEpFSDBhJ>9J*z^Cxs=4F#4;Urv70+|^SpUcg_ZF2aD=db_hKe#fg zYcG<8>!WCPV=LSf29#=r62!0C;%}E%)n&DGF3G3aH6ywnqanbfx8y(><;6y@h*0Xb#_Fzk0rK8cbDAV zEU?<6qRD1O{%Q|*o^{G}d6z}CNAdFa_sCRxqPN=RNqt{$Med66dwXO%O{e@RZI2gj z9lq-ZcU6<_iYCq7S{Sh4=_$PN~x__-(rb}*kBdpzc@GqluTrTcM8Blx) zHyQbb*Qv=cM_D`hB_5@k{OQg(UZ$07Rln&Nw+wY5(P??^U$?1E7Fli-9;1`e&uvRK ziW&^cGHif}Jvg4=8!agfeNnz9-aeMC2;*Us9$M6u@V(0sqlFG(iLM;vi(B;ERm6ku zTx11FJbuMbDiq}xr};b$eE z{KSzCg&ARvm!WMrEeccFD!uSgrpd4q5e203wxZ3vOYCa*#3zMkXQEda?%uMM#@Y%2211!DhEx3hVNs4qkGdAiF}GY7&x*oI465 zh{Y@M$c!@bdLyr0qAbiiEL}GBHT*1GJ3G44PC}JInWP1~=XrGpHZ>nJGpn((#-kuDY6tAhQoT`kqQTKPw^0CI zm1k$AJ&sNG#lvSO;^<_*`XKpEpilabUfP04^ zIE;0~QC{c~#+XW*_KzyNmIHY-H8Xw+7iFIMN^04F^5C1`42v-T*sSs}rkX$afflHe z2{QJN6}z#wz8G6eH)3Pyc5H2LL~}<~=#nAnM1d<8cpRj;wZr{T6p~!6Ohoa?eW0@W zRxqyY@^FdLYLQTjb!AT)cKK~dWSzp@j+VWR*cFf4dz;F$7ArgLu`08vWE;C(vAk1> zjapl5?x~%%_6kqqfQq*(|Mcvl#(tHnV@&iVBj0I={4~xg&x?!A@zBtg=%TQWICJ{A z#@kA~_2ygg8(;i_m4HW%rlX+HWc<;8QAj$@6UQgx)mL7NYE|t@-vKo@$qTu;7{(*4 zy_3Gt5jUo9#4o+@jK+hGSYBF<^B2y?wd*(4&e}Z|uo^!H;5YHa)T;*3-DGzQ_+qYofQZyk?~mM>F4f=k0jz z*=OT(pL;eq4vdmzS9$gHw8y23HudB%lZD|Y?J7VTF;-re2xE3q7T-P&x5-agGE_G!cUyCkUz zkK?3N1mA~I(HkEhwu0^Lcg{tn(i_7=)i`$SNX*SGdKVpc_;E~_cF&J|B=&d7JU99K z%UyxM)vMQHX>mnuCtXv(4}yFf*a?iHkzIl0&toF+!oxDWE`IguRV)7(QwRD7gtHOX zuV0TRpL{&lKrnSjTjU2B z-+9>I@3EP3@M9D6w8_aa$+@C*V=+3$>%Zx!G2=M(?r(zd`99F*wl+6?KOf^FV<8Im zZq0khgJa9=^g|KIk8KFD?1;6&|=j-aGmpeDsmrgMFNO(@b||HacLX=k!?~y zy8&k?hVr@%B=QOF=Dr`?4fn7-2)h^l{o?M1lf%oV5eiw}6F`9$f9{HJgu@{xIV|mA z$v~^;DY#pf1vt8aPWtZEXB37ySp~w%p=6ogk%&mv$8^Lpls^yvxZvb8cLBaX<#>2_ zARrCqF#68Bu8pBKR1UqZOa`-O*a`v76Ukb;W6=(axgR#`6qZe()2Kg!eJ16D+w4$b(syry=8%(-lCFpOh+Rq(GzI!Ao~D z0YoJ5M5070IYq0ElH%ReP0xWvfbb~4Xz-m%4@eXVy>&o#JxmimrQsN5N+;V3FU5KB zMz|K@tZM8RXc5SH5?;AN4DTj^`{BX0`h7uUeAICiLD>?faH zFIs&^pYmiUi^H`5^zK0a#GUXGAMgha@>RTfQMhHL3BU3~ylv`l>24$~8d^9irlqDP zkxa_HW@b{~#-cVU!cf%swO4R8sm-sFrX#5-EzQYF0y)^Jm3NY*BR@)Kg=Si$Q4vYW z#H4|IU~%7F%XbXQO>LxaeVT+@-1_5(GLV_lGXciUBo+fMlkude+0`No1sc1j*hxg5 z{F*Hp35T76Hd>IedyD(A_%)jyP2A_j#q7M~$0CK-F=+!k@|!mGs{bvLBfI~aT53K9 z>>V}Ddn%XeO6&sgiL9`J%wO^+Eb^d^)A8RTUiq;AkyBX0qfZOcvL!*QAA4x?0s}=@ zy>2A0)YeJQq6~uoB~!(@Ua33krM*pydG4=Ech0eJ=&<4|De|nGQXcFuY!NQG=OeVK zU8unbSP)Upe5VrbwBu53TyFg_ZVD$XjRVxDcZ7=1R<#xQr;aEmM`YPi$3jaa72ocB zD32AB3SyvP%UATNBnZq)X0AhoQJqrE1Xr+RdI7j5#a^Q`b3hw=|up^)3v;%h^T zI_^~DzCDzS$O@$-_d%gpART4nC>nQlVe-*g%4=o27_!0$eq;k_5t(+f`WRV3hdP5N z7V^lz^;*!O-LeyBd2u7=7nkDp>`KfntZT8q6`S;lJ>ja|?z?kIPO5(Wm0(c*(Kr-L zwdfyf=<%WMc=VykIB{%9^`vN}<8DjmZyrR?@+3t{PQT$kunqC?@Y#oy_exy8bSWk# zj>M=I%P5s@F7C#E^R3PJXRk|+;>#tbY;Mo^)E{AvfoX3Ost`7gDp)q-oN{G616^@7 zcJYzCCL5X@>!nTYZ`x*vX%@~ty9#%fgtHk{+N&DZ zH-y{5*Fd~&MU&b-XBKz49-@U^fIFfg>aCs8y0gKTLj0&cch^)m3^ZLTqsqN4e_K`f zN-GZ3Lt^fYJoo$y@$^&A#tY9p7T@^p598$NQ_+@Pzw#Knu()V_D)v4>ANPRV0=Egco* zem5Rf7#tk*U1)#(*MAd_Jo2!2RI%%fA8_c4j14M*?Wdl4D$c!o&h>HX)M<}%D3?$& zz3{?wl1bwAyWjmmJSp7qkv{eHTDk#i69^>}-nH-gw{rQamis;y|OPQuh5<-<3O zM|wIcBeAx=sj{`}yN4Q^wwr+R-?(wpEQY0{+_x@3w>8YDmkUsP5Gai@L z*Va9jGZwQ0jh$^HBf}o=ayJ*$y^D+K!6KAjD2l0@(UDO#eurvBw@uy9SFiC|KDY$Scyv)Ta26DFghkuB`dd9PXav;UfT=e5X(>qex~KH%eu{ z;O_Bx-wIpCPLAnvhatyn8Ov$^jP!OVJ@TZhIm?9T2?vVi;gaS6z#U69mU=B z?OUNwxf)_gZFzZdIUafRq}vcXw~rkiSNpvdW20mKPEm*bgWR=v zC7yZuaq*tYx4pG38asXo93?G;*=;&8Ibr(v8ULA|T)uoM9)9?&=SQ!-`kLDJlfvQ0 zp7vNwVQ~WMw-kXaJf^D- zbCSD(NtBTA(;w=@8}c{+$UEnS{0{&`-AfJ!qVGjJLmpTgp~NCU*|XQhQJPY*4Ea{3 za<<0NAG2TLspPEFN#DtgEGQGo0J3FYFb$s>%6XK?l!53n9GXQ#**^w3j|`3e!+<)^ zJQv_3O6&YGJV0H1V#w(;pIHbEG#j%>v%F7q1Q>W=L_wLOa`q|9gK>>v0QnU0ZWK8# zhnMkwPEcfbprJYds7K!2wo`6Te9KTO%K<3D>W#jPlW7#R8_P+{Dx=&}4nj1EMp_35 z{2T$g4K$r?IlRmVka@|Fc`d_XWdx62KwQRGSk5ZjWhkMgc>Qsh0_tH!BD+f_`wsx= z73g}GZA*U+8>J2q%#g!y7U{4FYow9Aj@BP+79WQULJ4Rm3eUWKj3*OFP6Pf7!Zja2 zfpZ`W#T8`hfE*4$k$2`*kXYbPflGJ;U52Of=*VBQf+><2a-h)*wWioeP?)p|H|@wmAykA3pXTIW^5x(-Vp7Ny@uGubkYCcd zTPZ0Qlj6xAdzBhHHA$2j*eE_!1o7=QiCjf5*DW|KKA5Qb{yzo!crS@$m{2ppPe*8X zWKizynVxsONhZ5H)KLnzl11*lZP656D-&_UiSt1z!vZSV#@!Kp)u$CTl5&hZ0cv z&~8lI^_^&?_5jVIo{MmJvyzy4M5(N>x>8bn!AoifX|e7$DEz#uf{W5AFFQ0*N~2t~ z!jX7nAsphJm-z8+yViDCGeA4hNBIcU8QsXvLZ0` zX;jlzyo(m?wXe4`hI%6g`$;lWV8FX40N(x8nPHC{^r)_4x2*r{XzbFAmhKFNx zY&0%hIPbQ6=FG#EElZ_uytxzqw{Pyn+qXp2$HSD?1!kO6`_8-RirsJ$jOrEy#x#X7 zu8|*pk8L9mZ|4BThK!C^~VnVa;~NBY=1Td@IbygrUvLw%tP!J)`QY-SYNElg0vG z1K!u-y9N)WRh?<{F4e|1FMPGfePqdzXwuX6^zC4L=An;)zTW7cc*Z|;Sn)63cSKvc#AdBEK6R!&CVS?5 z7vA$Pd@3d;N8?Za=uhK!zw*_1=k2%LM?Uw`XJRX{tui1#F{c0Mnr z{n=mor5GFOQ$JL5qM0a-^D6Rja|ECzH!^@%cmm*`vdu4U#J~Hu|1N&#cYimIj`zop zUq2UvgF`WSWZcTdsp+}+?)SbI|I`2UA37h>z5e=}zN>I_Y$T?qZ}|?r_uqTpipI$! zqkaK+pgIsWeWU5`8ZIr^U9~L~r~QND9>1#9VpqGEc5^Dqfbxr-!R-7(PP}|e-LcbB zLs_h^@2YQqs5JZDX+~S@>+NwKD2`@kW~~fk$Mw+gP#XJX_?EJ(Y*svwmRE2|GdDjM zM~)noY>t6M1Q9&D)+nZexPeR-F@!}ynf@lWycRr?CM@vT=33DZ0;L8as0U26yHdV z|N2((soUI0v{7!u7rRs$9~gJiu56V}-%WUU_uRQSdi02RYx0p@?wr%74IKAGa!rES?4`*WF)R$nYI%Bp@$yw zPR)tI_W0WCP4RzvUtD#J)IK;Dh$v;9huy0ryJ}lyMqqmHmh11JH&Pp4$W9 zA^u(ft=#eJphP)cJ+FpLk$1{0*&hS&)nGF;BsUxuRtDH29=t|qNas&lDa@a}5}1ts zVbt_<{c>G3J!?qFx)cav_<%V!2ow7zQ7%+ zNOJ(C5x3l93NZZ~mh;W&%3(mc^_IgQ1R8KjZc!-wKolM#0o>UDWjnhwE};@P+gaE}aDpO0I9>$cW8ia|6z3xrcHb%PKlyy_?d-L z87yp_wpd7$En%YL<88{LSs%0-_)aUl7La6^^>eJ3nLIl_nmZIG8^0!K(b}mn(c&1e z7L~-ca6FQoNu6B$UWuOGZY>Hb(cfQ<{())?4fMv~P*sz^{umnU(J}m(I zgxh1AdwF{0W}?hXaD9Co;nf0BWOO#E;k;{&DA1`6IRW?@2bZ{&eyWI*PADPqy6-CsYS7cFmK?k?u6vmFL zq_`>QDvSjU$2rrkt#k~OU2{GL%&}wgLebU9ZaQ{%H7oB{E!NltmTd0TYH3H=rUkKh zX+_>ykt#omD~`-jw;V@QZL3?MluQ$xY%-usQ2^MQAD|4wOB$3BS@9w~Fw|D+=?TY; z(t`f3$wg8hK>*6oNlLa9Kw1=vC_3^0k#LMx#G!~n;f4YXCD%3zO09JFQI=^{!-9{d z4__#}l9D$W7C3~7pce<^OZna3V=Gzi;DB{E2mM7t_K zc`!!7D@s;&#ql5t3pm=2U)_aojPiH6I>Sl%dGKrUl)0%q^|Pjp>EBc5P0J$=fk?b1`NXmbExko$X1!9(R(Qm8ES- zUtzQYOG4v>_)#6vW{3J(;>dUG)0X^du?IY2kEhUrMvk**^ILgZ_ zlI-N+m>NGa%q}cO#k)!?mP=RbUR=6Wi??n=GmVL?Ed0X@70vjIup#RvsxmPA5vTT< z6p=EFvxKP(2Kay!*B+?f^00}IBhl_WzA|1yOJgPDWw9%oU3Dl~YaUNiS^eV*X`sE& ztGod66sTXqUg8r5u&7l*{vKetT!oFC@OV5Y9l^Mj@8*2emT$)H+DvS(&BY#f^`ZQ0 zPIpE&*R~`E;VLhFz@W{_70tUF-X(=9x3<4-9_VgO?D`h|zS1?*U(I~8=u(bdA#_GF z3P#a@4;1Ik{J13fxi9UliCxv>>O%C5o-#hPw^e@XeV3~$lyG`sFV2p(sNG%GxY`*< zjvR{-~M~Q zBN?(=G2-~~iFoVHx8vxsW9GTPuM)$gnG^_}nY z;}u<9RUgsi=xu+0ZyY^399vuIhY|m{p)r*_+GP(8XznmD;4y-ic`KD}<(0m zYUWbVCJo6@fFX0**nng}9BrB1_2AQfSC&^)PgS+0LDkc8+`f6+y9FTtuk6<2PC?o= zq|>*F`~9x_74QDO0q-Vdryk!aWXf?}uG1g^kDE|;6XWA*-)~v5%6)yqBLgb$tmwA7 z-Q2u&+b;zVsGdH$_)(0HryYJM9Z?W^?o}zSt>D`u0r^J<0eF;`qvsq`@2zT%C^_*6 z5OXY!9`9)2d1@%)FRnDl0)ohuf`v(>?zoHSyTaY@a@hUoWSlY_<}dSg2w3l=e;&^y z5A4*@i6~6^Skch#gh3G8Y|2pgmco@L&kH|>e*lWOB8$2Wl--R$90tfZ*k#iI{^Tj# zpAotEj$R#nEPXIZ` za=ON_!*DV~1-Fh?JjS!f9FJY#)YB7x7|jQSdXntGF4HU1&2E`I3o_JOa$y6w8+prR zk)J`~t{_|*7|HCFznG-nkpc8Fl=CSA=?c3ZpAF#10?KsD;XflBAd~50lTRc49GAln z~s$4*ExV%q*j$T;@^)5A{QI@J9|-p(^Q4d%rTdx7NQ zZ-GmiEKdi>I4{*zy(#Mtw!x9fDe$z#WtUAKbiEg0Sq@%E@?n?Tzc48rAYV<6(ubd5 z7NO7pC&f8lh+fPP<)7Y(ON*bp=;NnpaL5auG9F3=XQX)U>Pt9nBCE-r7LT3~Xwv6} zDQ@nqQd)L%u=B1Bg_=xvcW3nWbXwupH_)raeYXrdB>Fr#AI6~UE8HmlhKBmJFzSyX zP41cC_x1N!+1J}wjeadKs=Z0U$3!~6%t&0dr^gdU?pE?HC`}qU2E@@S?hQl1)^2}N zzIC*7q!fNzqK#c%Dhm^8O77C*w!Dx(vQDz(50g;9lP+PW2SnKU#xAp@?6L9*pehw^ z<%&=5QSn(boiBD6hm^iHEDv6Vn?{*-H(6B z;OB^A-tp!m&YCHw zFqMzVx#^Hr1QJcspr}d8u{%mgrBho|N~Z_cX&fOETA^nJ4+=2vw%pmaqRPipwUA+P z?;S;ob29M*zu5rEPW1-;%rii)C=;Dd{L7!q__ztyDwy z>I=#oswlkj5nJEsr+Oq!YBTKK+%qnDSV<>Cf1->WPo{5D?+!PgltcN-?Rz?9qp&0% zWit0`LBB(b*zSrJOkVhKXJ=}c;L-m5*oydKL1%^I?oM!-Jjy?0iCpv1b@Jqxd}miu zSkvYx*WNC>4!8Y?$IPu|-|Khv+KlYExOsa~i|ozV(1Os4KNLciyDCNF7v0E;BJWUD z4l1Wg>v*s_+nZu^pe2q?qNuOQ^r($D`zWs;h7s=ob&L{qS9Q<5R$M;M9arA(qj zi(+sjucAdLcXlo;ELnEF)m|&|sw&g`%3i#DHDY~-Bj4i9%>w3R(U#z!ZEP@4j51F@ zl869>Krs#uCxD|WLGqJmN zQ}SLFi=;qx$GFlNE&CfvEx+(llGOSxNPYi%hiBd63))#u@}#uXIoXl{yi_5anKo)~Mt9b1wa zefg=!A5xyJ@uMHV7Qgp9UyeWh^S_MI@kuMOC>~;RLsHII+y#5<){GSiZU-r*^p`a1 zGh*lL>7y}yi=AoB@%$4HM^|sZ#~zN&-k83nKD8;DP3m)<@#vWoasH!AapmfbICUaD z(81AVE9li$Km72rm0>4Oob+q2UENiQD%DIGXzv|e)%dG#{6)O*+>=%&qLl05p4*;k zJoLyTJ_7sQzy4ml{PJsliS^da+1T3HisjX{;2z9P^^w_`IrY(%c>jY7@r}Rww(x)8 za`1Zb7k~A$s>AkJTwL;)f$8fXhf*_+vau(riT`ck|s+JD8rj4-y3}-$dqT z{D{X~?ZXexYwp$;1B1OTFLOoiUgnth_~^LGxUK%#?>ZWRXLyyFmCWYm7h+>=!#fB! zHaE-;-(ZlKo2K^C9NgJh)f{tA9hLhj$3{oQ~#i`1f-XgvOR6T$8y27M={@ zMUn3chsBp^-Yfls-~hxIIDCG}#uZ6BprOc}?Sz~x+LbpM5I{UO-xZ)hH55U0yAd+& zvi&jP0SyE)8g`DN-4j+eK*q`V_W_2AjFyw+qLs;DWAIpZ2XOc~EA^#}>uAfdgqWd@ zq(9g|J*{dMmVr0=r*R9Dla#YNKsVcjQJ2}B z`5b0|qP%YF0DigeC;&6!J)unTK_N?^Q4(eMVK`-f5#|<2n0um3#w9G8P@u%Q};pH$nP~PBnAb>mDGH&JNxak98KtN+iZY)dk84785L9ECYeNE;s{jtxVl-hTaM>NfVr)Os(PI5W z#>zMCE==tYNJnq+$iRnO^*M^dlTr$Ks-CoPWH%u7#g2pBoumw6k>{h;GAJg?e4Dn6 z>p=3uO&abv%;nC?%JlNF{G=hh>LM#F*lEemKo&tL_q-G-Z^S4lCOc=CfD zO3Q`&?505RKtAl~U~!2um3B=&rr*VGKOR0&?Wvz5dtOpqT3U;nx0keFn~N(`Gja9$ zj28Q|F~6{;1s%tb)n{mMswcHT4HGJlD^fC57|K6(!x6}iJC8rYB=2gaEhb01d>7bI zKRX!1i*pu}DEWX&XGL;WdezP9`l|0;qYg3L;e|q+F~D^#XcgTBExO@lczD2<>9eC~ zaA3&eLYMeMdG+$8i0S2)sI|j8CIfWnNV4gm>N9G<$&FG=xG5(wtNv+x%1gZ3K^mKh zSD<(GDGz8_u_vQCVV5BF#Un|6VV50&9lg=Cw;D};q(h5b##wd^dPjA8IzB8qP5bn4 zXpZ~)R&rTJF&X98&N$OvG8W}_6^34aGrni zk(gEeU%Y%RzVg-Ijz9dv|1lnU8i zNi;mfu_I$~>GIXMHM8JH7^>B-I665RqoZRQhxXkzuU)$qGjmJ63y|^ZM=!q`4?T3o z$}0NjPk;JTADKOK=9t=Uhx*d37((GfCM94;EARZl1EjFak{OR!u#>L4(jIg3OA1zhsU+nok7M!3$xna!mgKb{_qcb`v)e4~1YGeL zI;1|gwYer)>bs;4O;dtC#Y3Kq+udC)>JDiK9klZ}2+&ly=MHQhyEuDxQaH`N-;mvZ z!^6XI;>1|Y&Mf*z500dIcdzP~j2J(rr>0|WcFsQ(aa8%}(FuJ|+hS;FKB>50iPE5@js+q1LcPvfxCQztx1vc9nuQ#WpS_bNX;^61dp z@4Ouo6O%3n<)k$3V*0bRu;?SMLU%a&8M;5pJQS$oVu=Ru5gyqP~t376D1nWN1}F7V5kKzro-4DNgHy%#4=9#x%m z`baaU61W0_SBH71gp(DQ)Tb6y_wda(g>*;MCq_|3s%MUj^t(;LQ~GhT&G#8z5{<_m zJEQ)w;T`9k+L%!vO0Nft2bGftY6b^~EkFGHn9Gkgy}kV4%k>uBn(wu13}Sx6w;A5k z4{9hP2ifth_IC5;w2yXgYuw?)#@TAbzxk*s*0KO?7Y4{~WR=4n6b?(1{g%C;OuOuE zgdC3W;Ija`_#@-!9G4@qZFgZ?Q|1V{la=raJG+6h`!HzC?=aI?CftXGl?~7s-v|_= zZ~}bNvdMJv8VA6_OOZ2*yHyc?2ek+g)LoXlY|2}rX~>xn=XfFuQ^Li{)n^pq%FJK@ zn9A;)9+TZAnsx)(|4AX&Uj`U!ECWzj|38Dq{Bye%d;$d^2xaL#C_G5I!*FotaG-FP zQ4AR`w}yGu(}?pb^!eKx9=nDJYp7hh6rUaO6#LwBruY0c~&> zrj94$j*FWx+^Q42^}J;AXoIrL9l8hy@<*WD(cujm0PYOnV?{ZZhVLxB@@>T^`&y9=nLgQFj->%&F{mT087bR*o-))#=C_@B=0wDB@FO zim%fy`UuWOycAfn3vgLWVQwoDd=6Jx`IlsvD#R0Gy!CY0s3BPpG1)B91eZmX)3CTA zP=5%vt;L!8R?Tq*9!b5}G)3DfjV4(TU{MQSOz5@XZEtJVqP#V#U2QSYtx0unM~rA8 zG}@;LVSjgw3{+xRW~9GM3!5I<_Bps8)&I&oo1^?;3J7j~R4YO~XGTBlb3ZQfhRg=h~{pDs0EsH>S z$kr((AEL=0;MkZK)re0vax5G0P!Qp^;;`V62T9DQafp*!c$6iD%NG5N<8sL+kb9!6 z*d%SLF2yTcVeOI)y92%GYSsd~h8h#~3oV7+IfSV!O5|y?+$ccHJMyrdQ31|ZKsavi z^us2Oi0l?$w(-lPmMOpcJjVu;0uXQ(mSmA%st_-9oK_}mqlS@|d1_b_TfYCaXlLUz}RLJLN5 zv?rnxKHY;#OmGyZkMpF{Z_&`-0m8 z?En-Q)!$}*b>~=U^0%~T(W&uba=bmphFj&XXd%Dp3-wWy&?k`(FQT#o2YEqicWYOR z&vlOvye7$_96$k>`kd-k^}_DPjm>ReGS4ENT~_QSLZ0k6>gno=_ow&bja$3IXBV^D z9}Q3WLZg=N2BdtH2L&9%JvfA^Z+XWbicJ{v;30#;4jxnw$i?!YlR{i}a|=heQ3^t< zL;lv-R~g*z_jjV!+AT6__q?*+UJ)L+)Eji<=0#l6I!_t01w`IsHFzomywhI2bI|FF zK8bSA@f4;2r*o|SD{smx6n1@^cfJ**XXoF>V${}VVsGVE?4umqPD&q=?@Nvx|7}qo zj659LWfX!k$~~8VzeRm)U2U-~_LQh)XD$5b3FQVDkCcxKL>l#tt<|OI?Vt3I9y{V? z8(FCgO0A;o#HIO&(?=)c>V?0J(Xk0?CSH8z$@s}z=S=6NmwqL__6L6uFMj$ta&SA% zVx!C`?_PWT4e#PZ=`}Yq7srl|tDmHiOq|pKCE)R+W8Pi&z3+a{3i;c&=lvrSM?go0 z`{T&OSaer=z3cAG>7!BY9f%+O_+{@_<%sE%Pdy#|eLd>4;*Mf!?AqGd33jo$ZX|qU z%2@uv`CIYOLle=lc%zUL4{q?i`3{9u66r$yiKs(+xN&9t|5s7OiP*ucX4f_H>*gw#Kt(EbF(yPb(4 zc;^-3ci(-_ye37{P^_(OSs}%aPYkr^qD?c z)8y0ccYbW?2(Aq2uJm~9;LbgMY-3#ETL2Cx8hF(fK5oy<_=ibw&wuctcl4pe<(M(w zA@VpfIg!Q=r%pgw@Uf%t#EJCUt-}f=ctUABG&BNY9hes^sy;yV>&5V2$cOJ5JMh@W z%?rGQ0kkEQpY(mk(Ek2`lvfeIy0RQSw9DDKB93`Px}T5l6m@^&`cxb{HXc(qrlYgF z;$z*%jvcjtFc zKBPhU$sLLGscLsMc2wW}JuR^?SBqCyB%pF<1`>%hw&SK=%8=uMqR#4&{n^eY(~=O92Qhv(>=M>g4iFCdS4qXiIPCXh{GmFYLq&f!2A zCqo&x0D@S;0`+QB;325>@Juq}WY&u%K|zOa6JvXVIvYkLv_NhIk5hyfc$kcuZMCBu z%pa2zU=_{;4Oy6UISkuG3dsHgL>>?jLJ8b&@($5V@Mod>i-gQiQRYv$0}%LGO7tLU z8ga`0q86EXIlQsPaxIsk9F}n#{SOL<;b&Tz7fj)HOO@NLv=nYTH+DwG3`KZu;hsdw z4I1XY01^p-oai3@+!W`WMQhsQ=NB=7J2%Yj_##}D>RehswuiUTBEz8IeH7F-*B}(Mtj?1sIMzV z`a5Ejdx8dVcg5&nSB&BB@3a|I*hp`O?E&LgqF)P|0e;!-;dMD)dgb1`R`29PG2z{8 zT1+r;OgpsnPvZ@IG0Em5<_WCglWl1xqd(q#hJ)~8($4~hF^k0&$`f8B^nGV?=fw%4 zKmts%{Sb$DxIvKSRkS%l`V~GYg8*y{>8!94U_-;8I21xG_$_Ufg9TnovB+l8jjWlP zB*kHx*g}KJIm#0f;zlm{?mBQxM|H$8U3L!oNHKS9v5FJVC=OBnxL{(J9T+~YTQ`~i zJLSNnc9Fo72F%CYGW?T+5b7rxx#@Sz;E=!QW#t+1EW{|Q8FD(|IxdCUU8-kjr?k{H z3p(+rf6%nTkNPSZ78UFaVIjFo9T(wNASxX+*j0wCkz-c4lCK~1P_ zc?TbMfrDZJKd(HpsHSbP5YIamEvtgB#3%{_6oo3wmKJd9J2IOwJGUCsHy7jTjk&mX z<91x1x*a!fEyT?Hl6T&0Z74sNS#nbzJ|fRp!q{TkseTwg(*2S2L3XpM@5$a%x>mJ^ zu8yXtw(rEmXmcE!=nGzwP3^zQiV${wY^<(&_Y=qSP}&g&|Gr;S3(PK*n_ZpJ-kI+2 zq@1~3zys~;*6mx~A;VGZo40NS57TgL627}STjTb8OML$_Dl73$8^usPDjRMW1we63 z3#5-xf9{K|GD(>jyaEhPlNP4sxHv2r5^r=?Fc=i`C=feyIJhq`I)kSIm3vzq!1 z%D$X0;CltTl`SuVs$cW)5^lADrsmyf-j%!|=`kK#?MwCGLdZac{*v;>5JG~&3DD?W zHj*U%EKll}UZXOjK;+18;z8x+MdPi-*k7BC+WJiFZ?47O`mD+%sq(DBPY>lrL733sm5!=9DPQSf*Miyn_AH8U(et}v4;5JV4t7(`(Xa33)+UcI z?8W%_u=+)(tIRx#IrGLJaq1t1)F=Mv&;G*qr=mbheTcHBdM8bCB=_n%uNJ4>#q=SO zh%WV)58it}#wR9}u4YBh(sE7Zz7}J{W6{~&87sU>i_&eN-**}wJAOj_v8_0st3Dw> z)&L4BzewJNBAY&+@&f!_M%WI;4;^ay5M;TXEmQ9C8 zl~8=K<8Xd{IX?K{1G!JcBrnp!w0LEgnZG9<8{C5&mr5mD*Mqrl-_5S}YU3PZQ%49%rv!zZO?6UiMvy z3$t_n;fB}Z*F+6iIo%tZDa^-e!3 zsIJ66@%aZF6nja5%!4awy!VgbvUvbypub1??V29<3+`#I!#AR$q3RE(B%sz@D-Do? zvCD?~I?M(d?F{(KVP!mol7&;$r@?XAF2#8qA|gR4#T_7;G-Yreg*!t|OgL^#BTj~L zMrA$^=ODrT(9CCY*7L@`3rPnH$4TTd8%6p9eN2BENntyTIB3W|7*`NF400lDkh3Wh z$>8uic1{Y|jjcZ!BJIZz@Mm)fa zVLPhic3Cq{hQq=#I8kyM4)Nz+lpAmcd->ByzreRG%TD4mPR4Ka|2&{fw-It&8K-PF z8u69O%tFGDZG~Gd$$1AqS@p28zijF_1(egcKB0vho5+mN;LpK^1D->mh^wQd36lLe zuMGI>;e|~=8874Hc*4zZ#w)@=a2RfI2`X^x0SaCW3Nsy?q{%oyb{BLF8K)69fywYU z^IcD;Fy5$l5{23Jp9JPl;qI3>3!Kb1WMnb%@njHQZKuzny-WrR5*aT|9OdR8GfNg2 z1j%+3nVC*naDs!vsH?3dy1SaAuP}qv))?(Y`PXK9XrMF3`W4pK9wUQt%O36Rh+)~o zz3nlG(y!VP{nhpu(jus@noLy_#GY=BC9>FP(GZlB6HNa7%B?2rcN8`#(d1?YQ~(om z@G&k|c?@F_uUS+2{v|~~#x0`!8fj99u&6~UECQ1(NMl?h>%)_2%gXuQkttP_@KPG` z^^DDm8!reHj`E047(|!=vm?n$CMv3+WuJ=CfQ8H%O)>C@@__P zsj{WlGdY^7Brf~j9(U*|fAg8jnUY|q@})B1Z!ksK%%=DwnK%HWKwQ5|?#!ba7CS}Z znc~B*ldw`P03Jzgp5#)b!vUAWX;XQu{4BXMm_D?XJiD_B(Ubh}iIsd>II(a=DTeYdDg2Ug*|3YPKgh;+6KXNX&cP%rxKE2H6~Jwr zbSV4gW|zI2Z(8<^so9vCnv3f<=d~!CiJP}M-n;7KWbk5TCH(<;BMT@aYu6u(Fl^#c z;Gi<4PEp<{&a$HoG(|;=$noLMm>loWc(N&)tKPBH+12fZABqrU$%33Cy4;OLo1;A3 zF-AKFs1Ia_j9d`~xLsjrkBU#1|Ff&OPm9$#*J)q>AS_3R7N!g9E%BWTyRo#Pwka8< zk`+)_q^0^NN)jY_w>}rD-;OSs9@8?1JR;K8F2C|^6J6RQulY8k>`gK;kCJ0r zK#~fF>{MCi)w~cz-=uw04idV24l+LBu511{J!Mb*&1EmqxAJaRW@jz!7Tn#4*jS3% z)@^m~d#HTpUWeUrTNkMP8VONYroI10Rx;XaADBfkIrAH*-c^g>LI4y%0)8Ry!K z8*$_MO&`1Dh&+!pJ@e@4m|a+omw)`4cOCZhC@)nn&6?eJ>=MTC1I^A}i_$N~!;g-t zk269^MtjXMGCE)e-hSuZIB|U33Px8$VUWYlHeH>F?_5+Palw z2glJnW^;YZ%AoYaTk6;RV0TO70S`5>%W8FPCsvl%V{MiG#G_Q5zJvGr_3M7@;r8uY z@>io<{d!ep=SZ=rJ1-uhxb)E_jb%Gl>M>4F-?*;+-({ZM&jiSRLt`Jxqsx~s$N0o} z@CeA>UQ?X^-~)|I+i~>hxMVTvF#&vzs&aoEN~EzdUH~6c9=+bx##nso=1rN~KDvw? z*geTB#3-wLtX%n11|Gv;SLMp`s+Dh3O2_;ccjAcJ16PRv?oo+%uNbdzGq=tJbL3F9Mo?sih~cvO};JcI!Cd{Et zjL5`FVbu?900rITk;#}CAGXq*Hp7d>r%#`bf&Nslj0@B!3Rm)FnBeFxc`Pg~sg8zJ zA2U`=v%`<^8s#DPP@=fZJKZVI%*<^o&S^{3Q)h*%BKR?dlO5`(8ngI5t*Xuj2K&Uj z#{OmUKxsSgI__<2j#sB5rgjRs=ZY#rJq-R!2pONsET_X?hXbCwfD$8{vVB-O@^*ZK zI|JUb0l+I8hZP2#vRy#1b_68{uy8Ig=b;ZZ{TC zgCD31@;?rMm9hamh7>^9CwK$|D3kg{!y)-Ns4=|EQ+8*Q3)>j~NuitunwU%rQ}Wwc z_z5!PceYVStipl)EyAY6uDsU24M9Vg=vA9@AkG{h-MI(8`I;DTm( z5KNB3lpy0d74U;b<(`;1rcCCWwx zy!f&WevwA`q+|$!|JZiOuwWw&We{N&mLg;`JCxnrvabnRL=QW3I-6raYtF$+bBy-1 z#z-&6^g3*h_Tle{vEG&#mObjQju=Gghq6y*K;eDe?NP0?MsHV#7G&)3YtzJy9c)b4 zBsMJqcQx_kS8yvgP=?5jvd<4cp!m~DiyeB%fC+FGPjbMz_%38YkZ}zZHYv2yBNq6D zP}okcKUP;jgT*p(AWpJCuEr61LEbd-hY6d!v2%Df@L2{H7+&Bj+zKC)VDT^h93~!= zj`~Ywq0DAbCS{%#To@+7gnCyWakAO*#X{Y2C?N>fq@AOqOv00*tH}y6luYTh-K?C1 z?<6arT$Zwd7ufU8uR@`jnowF$`u;AtxqFbEq`6+KP_}%9k6($1%4OsqWdP6RQW-D~ zE6NLGJIlc!5_P#K?{eBY@3gg|ov~1)ZLuqXg%bD7`4}}T2 z*(!r#m7{Wm3)!r|3xCpaIc2J}h>ZsftiZDpFexW#_bjrkIF!4t98`kL2YI_Z;=}pN zPWiU^xL`KyY-`oRo}C~ryV9W?qpsnHwoQI4v{qJEV(R*>xbV?*T#|j`#;g|ji@tA) zd-71a(S9+cgO7cbRFqA0X=7Ftd2Etf;l#lo;VK1c8*;VmY3tNWUvFC+9q)`&$Ez_q z(B`_R?Ncr-L{$db26e&WkKH2d_TZ?y`-^zzUa7p;=koidl_iDm`L$mbtt`mXgC_}x zf3sSYvXDd(z#^30F@wXS{tc$3UF~7NEq-vJ7S~o(hjb;{C2f>;CqqA^ZYhmO>MspR zAu223R-m~Hs*r8$%tJPETkcxGa)edT)T;9BZHi`>Qt|MGXgawDTlnQ$R~+q4yX%C3 zLQkajJNlvtC71ePg02;a@MeXl_+n=u_a5%8 z`<}rj6o!!9+fX^_3mS{q;fPO#T#$D5w~y8#gQZ9&L71L#~=Iq`aH6pd;dl}{`jQwqk%CV(4Uf=d9;LARX5gm zVq~=6e9&BJr;Ig=i|baj^bhhfYPb5DnxgvA*7~LucBvnwasycg^eF&^60fcTE34{@ zJyp}`QvaH|y%5KbjreHjPkfi*NKA|mY7Ci+YHzQ{9(KDOJ3gi{haKq}7Z@8v3nk6q z&`_+bt$5txt~QQ!(%0#4jC%mpO}}M)TwGXmdzhK!af{wKeR@*Nw#Ma4S3HjLDA>-< zo{#!Er5#tn~kJpRJ2MaI?1BS)-kO`bf96Q`di_AFoip)p{Fdjk+{&%oqTkG5D>W9|dcw?$L&TXVVggF!l&yiRv3Ox|FqcGW>ifOmY4B#o8 zjo>sS5N_iA5JZ1>1kiJ*MhNm_GC0$cIS^SuV^G;ow)jQ59*&*EGh2>p{fi{E8`x3a)KOB818c1gTMh=B0#&zndf$y!FlMi zZVRD+M!(=d`zxS~c1X0{<#5|_Bt?C;?aXVA1lq^2*PApC_YUvWc1&!Z^8#@{hu@x zUbrpX9~aTpwjceSO)=Ej9Q~DA4EHp}NKb2wR@-8@za=U8s!cM@3U5(-!~i=1dz!8A z%VwavC3?ErG?CUMPHR~vYh30I|2{S=d0Fvc1xPLJbV6CNlO~C~4(E6x{KB&T*q=-) zCzE0{*hg_hc>_>^ru zw{VjZE!Be+f?imP4w3Q#^_?GfCnaW9_GJE86nIAg^a>onGAiiUPVCkp)dlsAThYiE zIY`bsJ6pc1isNP+ZAJE!+eT$#5$R*u(2#MPmHd)oL?tTtPCT`!t+N|Ry!l?rI}1>b z!?F1E%fLRu$`Qp*`FW)`xwFl}7sDNXq_tmk=to(xiDC@?s6+bCCW=he>6R9)D7jcP zuCA@d(&CbLxooVh$IV+aarw&ixOVMET)uWIuHBf4#pM;HL*dR&EMyFQ`UCZf!aCI_ z#k3OJvZgI5e{7}MS4Hy(jqk+NxRT^2dC8z;s&==<#7I{hAMcEbu}buIvjd4;D!Z|- ze7QiMg*N4+Os;#G9hGNDi$%)2zPhS~dQWsoMznSE;PDTR1J~Opi(BN^!98@TZa69i z{^;0ftgWIbT#ITym(`2s)@GHVJzoAW;@z2@)OKGb=5~9$Y@esM>9&nZ5h#NuP91=9R(i>Jjup)0iu*+=bp0Qkpk};RKCHB zxt#-w6G>5MX6IXThlUBsUG&)zSgVXM=o!CR>1xWuV>`6f|C`!S8fYwqh!u>Y&zMOG z#3w&~@W2S+Rs_|$7dq7^PtrG}+D9A2?kPqWe`fZDj#t#sVkio)D0p)ia zA`EwuH?awyIE6#VI20awj3L5XUyNOqu{!pc#Iu?dq{xf5D1JKIn`3sp7Jb!Y(Ykp) zTDyj0app>#edMut{!`D!zxvw0jxT=k*R4?c_V>OYFFf-&T&X>gf66)?*-mbCIajAc zaESkWoS!f_W(@DHbj0J2Jrpnh`1P2YzF}qc#Y@*>Zeb~^)!yJCniEGS;>7VIv9!Eq z+Rr@xP;Bk&$ICDOSnakF<0E}BGczB9!-H|<+Cm(e=oejf2&!zBk@A!*w$yLd)xV#A z=FxcfgAYx=ySrU|e$$V5z<)*gv+H|ZV?cXnQULKo5D%U7_V&3h8H?eca=;IUZzDU@ z>4W^J0Cegj{=L8cevD5{dK~NO;6Bq<<=GSOfAD^cs*es0j|LBC@bJXQ$Y^|Y@nW1f zc2fB?YaCij{g(Dd`;y_YFWL)tCi1{TlCl1Yhx9E_ZEB2QOd}mfizg;VLMiM%@n#^tc{Ro;(sarf&O=MQEY~MEQ!FU53bsG9b&v`9*)% zIAToM*p0|tg0w>loxame!99*B5&0nqB{WCAYt5BV_cZRM>4+b!h@x--f5%JpRtLf@ zO#wp?cEWc1FQAeg|93PQ3ODV_V={KeDf3PCG)25+Q)2UgzigAP82cQS4PYE0 z(awwf??ej9^dSPS$8AgzQRWN$oF>~106O3#@FfSR1_uhKu$@IgCx0&ZLr|G~M$2%= zpF?xVVJR8}o1GbmE|O*nIb|6yiw@p#8>gJ0i2qpFgFwayOs63s{%kV1J`4AMgy1QJ z_$`~3c*A8^Ur+%DCmO@JXSZMHFI zApWp&d=fY$f68sL<-Bn>`WyMnI0~`7LA;4A8^h)R6sxFRsi&uuUp zPs3#uAH1S`4l9FE9U+r&3QyrKfR%@X^~d-{WX6Gof{&E19b&&ga2f(Bk1+g&aYVv5 zp5kPC5ur(U%7Y0ZO21lETlZt2s}_TmrWn#3bGQd(UsH^s+^fp&Wd~qWjC9L@C-;!% zg9DY;7^-SQ*WIcKb9?kv+M?3Q!huOX3V@_Q+GTPlW95k^c^v6VyZuslO)Dtl@F<7e zERs_plFi_635XW%ylc#5RC!Pam_CX#xl!Vv2+R{??jU1Q>>XCSN~eOe3&lq?g^M^i zn&dp?vBcnC@hE#d$#z(3Gp0$s6>jozIpof9gvn!C{6PUlUc_q}r)(0AmvznTP@r6Q zluu4C@UA(5Wgs@P0tn;0RL&jeue>QY=~Z5EVK?KV?4WFZNmq5iB%So+TURQ{PW-35 zkvd8o6QjI{!F7|u@#ea5IR(%mAGuU6<&8VHIV~h|JQH>+3!O&sa(NdM(vd$Y`x5W| z_?LKeSYdorO&nxg!0kbc9Cny_SD(t`_8~)^J1YOJz!B%<{MGIuR}TQAllK zHr9PC7P+*jY+mfhy`!+r&2{CwulALc1esRKU$oTbp$T8~0oR#q+8KBGW!!Yv-Lh3w~Z?#Blf3{QQ!4^06ahZf+rF<`(1j%)A#`SFhfR zYu9Gt*6d2GXhDl2!N;AEBkcgCk=l-&sSR051=x}5!trdKk{@YyXyK2daz~zR6x@np zp~#EfV?&iVbD|oPqn%pNb!ri<#Iyr{S8B1UGLaKUw0KpL-8kGg)vbl#hGf7IXcVK{ zk_*=cbciN0Wrq^GIygE=TANC@!-3Sco3&Wvxcjb;-m%*UxeN}CM!OdCtvs01)Eci| zsl}@|cCNv4HgcW=Uo!|GX=Z$28Qos2h*jAs&=J<3&viZFU5vOqCu* zW4jj1su*_C)w=rS?-s7yO>OD((22s4@`xAG)_9;nymybtW`Vx0GNS|(vSh%E@BYz% z94!+}vRo#Jf{URD*jNq+4@B`}dLSgf5M(FZJ9uTgNDoo}*pS8s;@uwGse(hQaM5w-4^{fq zV`pMxmT6UTB^;I;cL<|mA3Smw#JF$lkwVXKZ&l+ijV(Ss@>}M>(Sq* zexgJu&`>JjrfI?lyNCIag0=+|WDSfxj5#R!@(wKW<+w8a?*IMYe=Qz={4w*yxc9;P z?|ZBs9v-orE`Ib;oH}(fE?>S9+)p?()N4gQa}RdaDOZ&xjVx{s;>!xodJ{pxic?`A z$jz(&?3U!Q6<$r|DCmU?AH_7vBlYWt&K?nNhm~3!rDY7bed~6tYn=4)UVZ!6Imm+$ zJPZQgd`I|p@Ezl2VX~h*dNht7pU@b)?(ukYgBRv^l&(u%n4M>-KQcb`XsiLsvZIcG z9EM$Y%fSyZ>#J)qIx>{Ii*4%V=Jajjpb%BocR&b>%gb62^Ad2{aY$0Cjvq8g#JI-e zB-9l&sIQIn&ET;ql%TwNOq?Ut5V%(nb7#`p5Bnl+Dz^;^Kl8zJt7utTOpqt2}+@WLL$?Zg$C9 zp8H%Ku@@Z@^yW&$pWIUGVu)3p@>@oI8*tgwYfgYSgW_nr2l0t$47-oX<0o};KLFL* zFr*+4hIBYH6u}2fBkAnN&hcfuGJbY@fRm?;iw%^+_+y^%;LhPC$mxK_xB|*qWYJ_& zW(BwY{kY^Rwjf3j$av8~-WEfoXe7eCq%BU){mD7m(7`@*fB?LuDI57xn>$ z%kCVP@qn`bla?W;!@e6FLi4Uk%7K}78FG9%4tF+mxC}Y042}K_C0u0ao(}zT9%Z`` za$5e}D@{2JJnZZSa3e3uk#QR#BWIvE`+??deqng9@$5k(zkvI=LAiEwxGUDNIAW9yi7dFXLz#X@}*aQ^x z3CmgCaTMV>5=*wz%7|w#df2(54=y`8-1Nk^C#*{2kH3HkN8J=*1;vj;z03tz7TH!f z{FD=yQ18esxjiX1C>%HPW%dl;4y8g^sOvMwBGkAA9;8|{krGOG+kW(RHpM`vCY{w< z40o}suPMfRn?vi4wA)W}Tz2^lRrX@2yB2+w-RQ4qB3fyZyCteUGM(Hn$8ks$2;_wV zsiwuvz9!9ko=Bq@@x5z>q9Z9~STu`AW{=`4DdUvZ3KGSMUzA7uLxGc(iAh0~(jyvd z6p8jjNNM)>n`NL4JO1Nz01HIKmc&RHe9IJz0w1rGVb>SRHIy}F$aJU&E27}BFr>dz zKbCs>1K$PzEF|+$V9J+hXo06V(^5CX2yG^i=)uMuh%jVXG z6-n%pBb)^W3u_c|l!dge3usVQ>fJI-$~$(aZfnuU;(|M&Sjf?youAUsz6nPO$FV#X z-ELFj3*{5L@VJnkcy>fAF0RD#@Ftd;wZmV^TxlvUWv!dcNGkli~d z^XBIlyt8di?wQ#|rBNJaVI>wsYk6rSmb9>1Ufs|FaLfMX)vZ|9f|hmI_O8lBtubz> zyzC~l+=?Gq7(3AWdf1{~jhE!4Ze^Kacp~N7JIYcPSo+JrQrd^;3^mXHFlFN+)eE$rfH{&-_ru(c7a(N8+7x z=i`-EUiWe0SAP6ToIZV0p@$I+Xj^F#Ad^NuLt#8F+k3SmIH>SM{_vXy)80ce%-k`>%6@Pzt*nwlU zXCFG_Jn6&a$2iN_c>Ttd`z2$0M+b^$wI*x+Qhff7qBP`N&XoY%J9qiYwOG^G_Q=C$ ze3bN~k3Nd4*QeE|*#%jN%aSek(2b4``gL3sf9$G;Hdi08E9}~}Yo0R<_V;Q0%7uo?5l$466~!u)*^4m$vuhxAFtfNAOvNQx2K!O|T`KNv49T@BS?$M->o-Iv-Cu~Jjvdu~ zer$trEqy;chfpRc>X=h-T?WcOcw*e;`^k5Ipsy$9=N8po#;nBUM;~So8)~cECCN9J zF%cfqkG&eoBC8brJYBgB5uw% z$Dhoot-&+nMZJ>r2cc)fm~$B9IP3#yimZd6p%)~JCKvs(}9mE+%^T>EV2yAnFEtgGe?Cq zAbt$)6<0teA=_0;nEE1)Tz#%Of*e^unKbT##)D+}F>u;ah9zTixPdw&h5fVS^$UPH zk9GcJa2CbDosIxM5W_{v2Sffjz+w3)%)w<|%6O#`8ghL0H#YwVg>oKugAxwe9GWEa za#$o`<@iRPvmeNA@aPp~dS&-vP^OJLn+(|vT>#v|xF_P4T~Cr7nPvw3@Lr@fWIt(g zSe;M<5MIW+A2iY|r^g0lyE8O|8FJdg@+;xn%H;qEDAB@c^z4?$GXdfS4ln3AJ~#)3G0enhcFpc4M@=7Nc4dj`h`IMC(R&{EaAVq+1i@ zZsB$933o55o%_+(-W0uEEn1kgMn_w7w3-Kj7Kuqg#JnXbi+r3HWu7LFTt;q%3(7Pn zVG)9IB^ie}eR5~zmvNMaxHKt5xr2fxE!FTd;q>HFX_BHMDY}?Y<_RglE<^n3II>yy#lNC*AM;?4=fhk=0Fkf|E5={U*8zFJ+Mkqy)Q70C$W*;p>DPqp6(*iJM#=6u z@=9^wkS~)mA-Rn^1C|-Pm2}qe?rNGLJ-9s zM}S$JvS?+u2kCZE9y)H@N<`B8h%mbfw{df%Gs%NIw}i*yhQ%<-KgxqL3Y%~iS?oxe zo1e3?4rSonLQ?uIYC*VAgmE#tm47G%x#LdZ%ggJgv8+WG;VAPsro|&3E9>09w5|MW zu_JkHZ?n)&_h0QQY!5}aghLoIHi8UWg>Q$;=5UGJHK}@0vvGaV zN|8Gc6|}2vcZI*VEjk(lx;t96;OfxAtTU<|lJVw3@EA;&7J3)-{I$(Bzn+O=mHy%#ma;hlocqIu7M|d>YW?GENAe;u^(&3m!q^+XPtF$>}%%W(!hR;)1KP?($(lc_F|H|(tC&yO{%8WqW09;73Z$6#UrOr$F&cCqVkQ$%EIM% zSUG)iGA56V%iXQMyQ{I`W}G|! zp~sq2Cr`)GBS+$=Z@m>4FJ5(f=Mj$C*~RFU4NpAC@W+4rXX52}eC9LHi^uLbcI=cD zC_L(b0-k=rSc!6-W0j->7?0OhR)U?sc^4x^$i-kxU@Ss$Mjxe|i;MGCh>ed=#7JLf zj2}G_n;TmS+lW@R^>@#m_fD&xYF`{ZHW_dI^sRXEsYhdK>ZZ~+Dcz88w|%S>V0T!L zcv@JPk6De4jBo7dN_W6@x;_BDy-67;d8#fiUAh#X`Sg>b*%}{R0)eS6Ty zjIUk29w$y5k9XgD*E{)m2^JcaN{7bL)wp%*mcI2Z{xN_%^@!u%K+3kRabjj}*5f?N zG!%VnD&ySTyvI!xitOx0CZt0lh7wj&9GYak9pDCN#SXVG#WN1^$jH%SN8DD6D)G?Z z-GM3tkD3699%E5UENRT*yEQa0Xqvh0Ve`5(b<90_Bq5x!nnzCBR5xoYtHG<*(5L;f zD-K|%9cg$ZgE<>V&3Re+?YGWpxT?iN51khNQgDwXNWXBQU4?nzWIV>zLrDM-(cl?mX{A-snPicF^V=AkKQ9zU1 zZC1W|PEr({JU7lQJ>&I^?)U zljF!7Z#``hcNo-h3meEu%Cxf~BD)zI@s}G^nNArBRL3_qz`Lb!gdnHOka2D650wqg z!)P29b_lRs;$Ua1?dMTqZ@7?M86I zI^b(82dU`8t}f#5LWVwnpk6W_?hIx3CjrWYxf?+D0Bw2jmy`UgdH)Bh zJAYv%yNGuk<XU&P=-i zd+`_HIf}9px0grZtT{a-_AGdLnUy;dO2i%3?gqas?{bRD4 zl?@pmKgKmgwYd#uo@frxPT{6i^aU#(GY#AYWL`2@sVQ&DCo9pIZYx-Bj;to-<(|T1 zTLYBRL)UT;UZ%;S2zvOLpr^7X9tlIncoHAv3-76YrAdB~xBgmvM|eV#jY$eVlBCB_ zP$;3$AZ?3yrrxx$QfimU9R*5IWkD^TlrJ>A3(@Q(ekhBT&g^VKfw!I76fEy(aqYHc zSx_#Nd}+5Rap~3FeeWn>rwofM-=k-Dv1?WBmK_kzPwkjC)6tm}OeoQOj9s*#Px~XD zdZewhFyp00b^tD~tfzcXM536qq7kJe%0?86+p)9BQD5k(f9+^-r~Jr!dk5v-o))S~ zL)rIPgd)o}mtQ$crsB^EVaZIq?3q8cZ}DwKYpZyp9@s|Z!;-3 zHFK{Z^`!JD=R%D_d^dRqq0;jWK^e$yJ@`hMr;M9ARX!d9>FgJ-@Kgs)CPvg1(hoek0GOLSV>qNzi+`bn^(5dKvUC?Pq% zOqnEkZaYUQ-PHM@M zaI*+DI3jTJ_(b&e4aQG?`lj1%n`HOyyXRwOc3xO5YTMPAJTew%P8?NJLQ%CGQ#YsL zQ_nx|U3721{dSyt_XCG@s7;IwRpZ9=Ts-s4Gci2UufCIb?9ey*(nq)AZ+`Htc>M7v z%x@m&P_R%I3_Q&*E=FIqH}!2ZOK(rS^Ic@uSetm^2rw_^j*qj`s>KSofA=SU8n3_p zhL0`NZ?`oj&CV@Fo8}d?=_8ZuwA~SnW#jzlM?Z>3AALk|JgTwjW6H`^@?t01hL8HA zkQ*8vjDh}Mk1tfcs~x_?6#W$L_`&A=_b7?vM@EF(Q6Fz9 zKR>=qPv5k1k%vq$^K6Y}tiT(RoRZQirNPPZU&dhWNJLD0cev9Qg(^xuWPbbBOl;^|#P^I{d_6p_ zq;V?!7}y+}+naIjo%a>i6qA#aY8zE`Y1+X;jEs)N`yYJZZyfcA0&sDO-Fp)rzfsnv zxm%js@jXgEs%m^z8pdSCrW-e=l=oi=Ep5wV`n#EM>}K1zT9j65r{nK!@k$h zu2fzMTvimM_L17I|A+=k&q@~x@TRzR>voKd55?LBkJ0VvThtmiZ#Bgq&8RO^IV3Uh zEb&hW1s}<-bNO+&PxO7E;PpWIMt7s3L166INQKsc8)K*f8KBizX!5uW1Ef~=85oR)%_XlZ3wgfKqkq`!4A@&?B|P+0!vWD*O3Y+c&dLKGT1GX`L10EYkoX60wv9`|6mPfjStKEEFly1(q6K&B zZuEE5Vz{zrGtMr*o|+YY6Wv;PYhpCovll~MDW07>y&XHzt@U76nDUg7)U;EI zi5|Q9(hf6}DrC%;iGNS)XP^hp7 z@SxnBg%}i66M4u^ z3zVebLGec*WoNR(;+-;az+P)#tY}Eo72jm zW(5HJvDjo>U{@3iKX(4`=n1=%Dq4VY(L2X2IRd?FIipnMzQ43%%?e-D8M~&~jhK`$ zC?~m+ptJ)}3uG3)gM&l94~s?Zz|e@=`>yiriuUH6c;$LieDkA9L_0lDz}Rl#(8tx@ zy~_@HC)+#qTG$~6s?w;ut_0e#>jh;NbwR_IeAxw9EVf;5)TwvZb*4{(Sru*ChTFL4 zN$ytc5!F#uKH{UsjzrZr@ruaGbCiWB`Dg>t-X|Jc3R9Zxm8hXO++7#0=!vhU_5l(` za~q0O5kW!6E5aR=ziPL2!|bx_;;1wVMiC|)d35wBd58QQD^|YbONeJ?^mBUKQU}IZ=G7 z{OYq!6?P;x$Ik8dBKpRo+B@$4Xi-uR@T|VrEc~v{_IPhg|LH%ElP6Al*PWVJ9ccIc9Q`eYv7?CZ;H$5` z=HsZmpz3ddE5|LxGzJE$@$f@uA)EBL~Pm&A5Up~ys^=-b}jCm;uvSD}Q?A*MShF7j!^Vo6r>?z;tH#Ie78KN|u zm>i9F&%GBXj-T-H*P+4T7#SY%OR_w|gp!TB98vxaD=lHjh_RL9!0dQK0od8W11$Th zzk#@L{=8%{5ZygpvA((<<3}dr+SMzuFt_A8{oL>nB;$0de#_IrGQ^=IzIpSOcp6iA z+)|B4UGoj$$SVA!m{qox5#uCSTN>x!0|l*%k> zK9!+=jQhx{r>E*M-Axm@3b?GytY%1N$w29<#1S~yAbbrnjB`o zAmFci-H)RbX*f(42f-mZiR>(jY=F93f8Ymn+vRjQs~q-sfh;Vb?5=~t5JbJqC7hDe zfFGWKj9TK`(3s}$06B}ien}uVGLn^9#{Pr~z}zf;(QprD>MVd$mSWj1L-rH*i{ihO z=b_o$k2e4}hQ!4e`ars}jVVJ82XZ`y@C;=d8M40|UXBOwm*Va!LU0N?SUC-Dj~a3` zjvn3&Un3R7gpHMO-g_CiW$O<62 zJ&`L6lRW4VpA{?_PypaX4rzj{k{7m*H+u2RZ>voQA&Na#=w(I-#* z=0)y2vBXBw}Le|uP!}O2&sjG;1(?D548IsaTD3+_00kAFOataR{ z-W(w}V1=cO>B-L`89bC-)Pe6!R9beUQ7=jPC3>={EAX*wmtDO^ajhvtv=u zB8YevZ9E?0qqSNUA~QD&85E^%HxgjF>rJJg9in6@>b^zgV^^OQa`kp6BffXl$K4u4 zFt@|3n6=`Sx`RHW1`8|@MRP}WOx@BS#b;O-i*E~56pxWf;{5WO8-+j+B|J$h@)w0GaSFAFTyMBgGImZR+KDz`})0b$E$VAhY@H?YP{j|9_!iLOK$C3}lT{FtOHY?s7%8oik`5FooiF@0! z`xK`VNWLv<)9Hm@@$0UzC)&IgOnXqD)q=m)(XTY@M%)b^(Lixm+gVXqZ#1D~+u5+& z$B5y9_Jo2>_#6?Y`!umLusAy0R2eWoP3sF0)kz8WtmLyHy24T3DD2ot*tE4|nMG@N z)cTI8Og&1gJiSX#H20KOWm4(HZ%ZYbc&Ma(K>og{v14#|O?dE(U-F{OHwmw6P{rJo zT;#6|#^&ww(LVH0w0Bn2@7W33W(B(+P1)U!_V(teYAiZ8wH=cqW3f5&wvPp_u1v@9 z@M!$%OP}#Qfb3fPPygXp zT(%cucfvJ)l9Pr2r+etkakbHE{M9$UrM9^jM~@th(?`er>hIXtq}%!R>r-*{>h+kJ znF}85;J(F5r9F;Mj>VV0_^a{M)6ZFH_~u*ZltGK{%j9mp8`CrK>@%lS);2#N^1~ng zFixF1<*|w}7vLMj_mS}|@2cbeUV!1iSMkZsy_wZ&U);EUJ(kxZIy)-yrC0` z{HWimSuifn&dyrFr=d^%dpB<0yd1r~gH}|HkB!G`ufH0f{p<^}e z2EY&F0!MRE!ZDun3NJed+ZZF%-f8y8jxmez4W-k&@4XkFd+GUTReOBr?Q>ROv2*R{ z(aE@S^=j}C633|Ddi%{786EQuGk}MS7@x_Xqrb6bDZe9T>+U3sHpw5I{J z3zYFKo&#{NEW0{+I0fY?58H5G9*X3n$BtSt=X(+*XcTaa`L1WR$K%J;X1hA|O-vnu zAKTa&%J-b{nIpDy^NYThk~tn}xMP(o7f=ZE!ZB@``3~)nak;m*-$%CnW0q;|Nq#M{ zy1Z&xaGxZ{-+8rf(Lq7X!!t88i{fR&iuUPS%YKEP zzI;t%z#lKP#=gEE9=Dx=3~tv~Da@K&nKEA4d@KxT45LK%gPisOp^@Za$;&KYa+>U} z+c@q4POm>%29{G1PI`>LJ4M(h0MPliLAEZ+><1xv>se(eXGPYuO#C^_K!eBuCZIoL zhQ|QdKqtSMWw@LBZ~!CkE3r5T^q&O8*P9D&;$&}LTJ7nq@(Ss7rcaNY~R zIm`f=SIp0gZ^2#39Fj*<{I9Mtsy+aa`hgJtj&P5B?#aUaB>0Qs{}8&Fm3vlbncqwU zJBK&M13A1A%6JUm*g1WUJG4ueAk%H6Un(0><)Rw3$fuqxBNgFy%dVavBNX_COaq=9 z@(1OvG#?Oh)g9yzd2>Tp8+N z1yPqr0eFibLme;kil=DvO2cFkq=e?Bp8W^G1Oy7-Pvvgbq_wkUFDh-j(brLne(vq- z2$}5|Xs<=)&0P4!gd*6U%l|(6P`#VTTgY@)sU;MH&>0>@-M<)ijxR zIrUv|zLEzrWp@Y_hH?{LP|#V{;*~mJ(Xk7EYG0HSz|OlNLI6 zck_?_>xW@jl!?!@TOqYumyz-)4Rx&`$0dLIw)r6l@k;ODh$3}O&18ihk7&@>SdgV2 zL>pwc7;0E{d?lGcm$m~~;VwBexu4PAS=fuVaI7Fye!LJWF}O{0r&DcT)HF8ivx`h& zZLJDx(n5%r5XlvGYLp@Ipp?pwFnnqoJ8RLYF{7u47acc(`@c9c$AWx)W6jEnni7m^ zG0GwqUaQq!D>+a!bC(w2MH}*w+&GrTZX~kf7$A3o4Gauw!MfFlTqm)hkzHW^N{)dh#hN0yqxX*}fP5 z^*49o|N5<-XzHMkNQSJssifvY;l^$_6l>ynUv16DZ9!1GL|JIXt^Ro&Qs1C@Xe(AY z^MD9r0*vzQRsZzMlUu4B>KRtWXHxzOkG9?-+WT$Fa!FzA?9-UJyCs`?5sz5*3vYW} z_({R*b|D`0Cz^J*y;F|1fkM#=GxCNN`W3tOprLWZ$~%WCj=t5^Yo%cG?xy1X=OV0p|LR+M_>9cqodNt z+1x;X+ors?P`0*oM7w0#raW#fZ^nyfdt$8PgXroz6TkfIa6JCh3-RQ`C*$ki{GNYA z`1`;8#rSXk+3)+c+t0uBSyxpChE0mZuHK*g2KV)6)(U1vijeCyzs&c9@~81pW1&ASHRuf07TfA33=%1vz+ZM><)iWce!MdaE> zbIi=I$Liwc`0|&2)n$F|*~j9-g)3@a+i~jD>G=Qr>7T||zVa21nXB|k?tK$5j`CtM zKen*@adnMdy6K21KLVud2$C#elraY77q0@p@WQ7glOgke_1aZGmT~OF3I8B~Vv%wG zCqMZ~y!hD{{euyA0^Fts2{L?0W z^rKhevBw{e{@xzn@yd@E{6MmzEG}>9@A&!!`3UH9ZxT zu8Lm*-cUQ5m^|Wd6fa1Ram-lt$e8K*fVwtvppCI35Cb0^ALc^g9`QrjktgG|zqgVL zchaJ`JEAe3u^PEEo*|cHYWn^+#jCIWG)}7xbai*d2k(9mC;eE>ioc!ga;Kg3_w~n5 zfAZ5f`_Ng34G#_Zl!J=rKFOn3(Cbql;4z;3BPqK$=|l80Hx zWL%$~iN_y463dG_@q=@l@n2r&8UqPmPT2MVpi8jL)CO_29iA=i#)1j9<>X3>hy&1CB|FAKJg&4!wg`W;Ms>xJI|f2SJ?< zeh3$C+DFEzhaUjqO0u{MsJWOl?UEEwav#SO;BUHsvKj7{U1RuRVU3W>P=-=D?Pg%9 zml6E?m+QXJ$QxxVX91Ms9}wy!sH4Jd-l5r$=l>rm03QT?5oKtgi5CHvgnV}Z834J_ zoe5-jjt9!bapztEABW+W!+}PeGH#hR;SKUCqn7C$7yvR7Vde1qK{;KCcBYd@i8^F_ zpd9`QpiH6+CZ|Y`Jeh}Vm%u@ph~n%#gqL!V-5@r|)=<#$!lX!4auyjD2B=5eA?fB& z&>`OFMLG{?a{41BHy{1GL0#TO+MGf5;>aU&8FF(3d_UGb@@NET1EybwOjHr@WxUK& zaG29`4S1pD*_o83^ z-uAT1uhO<-MPWO~1ND{K*Mg0K)jOhOvv~K;J;iaPjiDJuLRS8fwZCqPBQ`5NtXR;b zt3wk>@R&fRT?fsYG;aAwCCOkr;U`54ilj_G-wViYw6tSzUpSiN3Xgoe@D{N9$GZ^q z^@WD-*+V44g@4i#&f*C}Bs;2@Gy_a};RE_8jdnEYH!b)wJ;e(TWsH?5P(T(ge^NrR zfMS;n9C1G!yzy%`WwRm$eyAc?D`W?-69HK}y&+9d@^NDf{$#^rO2;MY)CFnbc~c7m zE)MrE?^?(Mlm{6C&>$^}Jr**1TBvMWrY?L^tJk7L9W?-w92-^Oav`&8^x&( zv5}RfPX$D&Rw;T_4;NR5Zh((Lc4*2O& z8f2C0gnVf`D3g5EWpit^x56(+Y1vUEn|7*lS$Rnrb3|720y+TIq&jvVnKk`BirbZ&0eJ54TLycC17QJ5S*b~No2 zRoQ6fQ#WpyF82s>#18uGdSRhh72oYmJMmxr@oN0vU**MIq>%bL3wwVHTuuB@IPF4w zQxC*bU23_KA%4kQGHtGLCl>9PU5k=+XiQ~+DylphmGF@}%0b58)c2_pcGhHdYK1Hraiq4TGb!1qN#*I?gM_Q^v*XW7J9g4> zpC4oW=91F13WqXM9@>|9U~t?M&87~OOXJGsqG@}lq4;RpT1)ZVSGYbOwcezNt8L6j zbI)Y#Z_X&4+MwjeSk=6*v6Z|j=eF8b=a8~dnNS|89^k#Hy-UU0Rs6c~YA6+3cmzQC zO9r*dxa2Yy%^d@=zpb*gSEDxbc0})y2<02qlU5d@#);faoTxbI>t)<)xtpBay{XHUi#e)*T<^|wEWx8C|`{4f4z|0KToy&uL0 zAAAu1oB!?qQf(Ini;M4irwd|pM;`67qpK@=)Hdm&v?3m70DT~&R6_k$RlTt#&^E|N<8-1qki0nU6Wt=`@f}fFi!7yM;QIdyAt^oL~f4trsKGL zbNJ4q0HQz9@91zziYP`eU%e7%PMx*_>DWP~p^&MaPFgHK%Zz?Z9qp*c%#y%8)=RdscvYa|4x+-)24)G1=fe_;O)-s;- z4-9xLqzz*udwqVzPnsK1BQrC%ecc3eq1BaD<)F|vc_r`qee0^dCR=g;$)%b*pX9QUT&H#B}e^w2|Yd${`t)h5}guXfee(HzUm zn^t}vKXKf7!xP^|fZcynQ@5;)rA~)OhW&U7vW7NeJTDb<9GEd0h4^#NKj#NuP+VHE zCt7*_!|rm*&RmAN8yOjKUF2^#KO8}u@5!sL{5T$c^zm3(TaHeREhD3Yu`st1|N6E4 z_^+4xM3?bcy@>jkp?|`4qSOF1IhjM_%Fu|A#Bex(OS}gL|B-nB$a&=S0B(|JGIdgo z3>^Y|i!%NvVB>yZGSDjlS(V{X90g{v)WxG>fXjx=dYDWGmy&_^u0X;xF9Onc4hoI( zX<+a$AZg(=$OE}D@R@{kF=QqvXLW!;0mL6xxJGC!C*{DnOa=dq3_VD>J_(e0%zR^) z%lm*(CsQgHecn*cNAQ3Oz|6%bfssgRJ zQ3=Si$hRD2k_6m~c21!5jNpYck;`eZi+I8duTAdgbyPVhOCA)w@E{y_IWaaMw}Wzc zw(ytuHhRV>;|UlvjatIbP)slml&uJ=gOlY!tiY@D&mR!H(kem9D`6+ahF2O8Cn?cc zUIxOMOtL^wq{^%5QFLj6UTxcs-nP9M?AWpLufJXN+F597fscZO zi8vD|D?>0Ymw3@%|2is%xs=?!Fww-#yYsYwB@N7>nBv!C=rF-%qV0(+lT;IIN=mBj z;=vD!sd6&VV|y2sDod&#r;RxV8|!O6YRVBP?^+<8(y;jO zR9tBY15k{y;6S#}N%@HXnq;L3H9V0Ai+mPB9h#VTw6#ZP2fO?_y?|kngW>_amevmc z!rsx@Cj1WLwsp`B(yq9)Qx3%zI|Y?SNt4oxdPiFLX~W1(Kt19v_ys^u$|3mOH{Wij z@UD20AXAq~o;&_@#M#H3u&H?%P5sP1#aA5x)pXWl9P_$*8Ga@kFHZu=~$PY?aP+sgkz}XIJ^Qp|Cd zV`+;h z*gPz$ofmDD+JaBo5aW~EH4EAn(lR!o@KgNGrev+Li+WOhFfP-&QJ?LrZF0Y0%}-V; zUhP=SYb~=Wp4yZSjT9M4o~l=V$Z@VH2BT9&Sh3f=jq<2YYivK{m@m1|VYru%bo76A z1S+4}j)bG~HPfdgM^jK9v3@IRyb!#Dl1_+wj5&%^pX1RF`e4)YwTPZ0FsnA!6HV)L zqQ4$ZT|?0{e>L{IdW}=-Jt;m{MMJVsSWRuLX;t(qTAVYqGG=T`#ww%lF(e*dR~MB3 zlJJHUr@B(#Z4$4@+5_!Y6BcwYWRvCY*9C}p@`jql&g>`bh!u3Pbgf(V9D zm|(vD{qI|8#?H3SfBy6F(1~%kdN!ZtvVHHne-o$AJgGi6Al&pL5xd4XPRdR#9@Tj2 z>1ShZ_Ga9?tub`BIab!2V`1h}Jbb1vj-Nam)RrsxqrxPXiP?iC_1Y>y;d$g`q)Dne~3C|&-p`FL8fd!Q(LSl)ls9va(yW+S?a>ecX@9k4pS@ zuo*nALj2RuJnc3EJ~Y_b*QqiO4fp#9bJ|J0Z$<8n>FIdr>{Hl3FVUm88CL&p+wo4 zG%crOepMXw=Oz#sGjo&3zEp?!uWg59|GUTYkY>y|| zpA+UrWg@umUoQAT8l(VBp&=QfCcKPOOdk>`fX^jfe*?qzZaD0@uChh%;L^5LR+KFWmZ5ud__EhzII}RN)8eS&&wB zl*yL~qX zI(K74>(k!${pjh~5nfG`UD4MUh+SMPj`p_GPPwE+OB3HT!PfFq^ifdp@nj**qLyEa zeP<3~^1~7nG9UZYq>zOU6F`plppf7QCP#YH&N3bW;W+BHipN4Y9Yv%{NJ~0ozpDu- z{IKX}vWv~}QIvN~lC3-uU+CXZa`8cB!b!jK?lIC9$~old$srSG(_=D8>I9V0$|VaN zg(Y|D!LNKQy2KC40xNi6)CrWQ>KS^Ji?FP011vA~3@O5??({C>5TU4WWUqu4@LNp3l>q+kTB!FR_y5G$R&$O?o^|0IX>k_8mxd#im^_3*6OvrjolhaDU=m`05}=UFE)i2z#n|U zA3!{OXP$G~91k?cVdpT*(nU&T!mxYQaiWXzXj=<}w2P3}bT?C5Eab<%N8CHb;>UOT zaetrW&dx$BvBkVE%@@z?L_^_CS=}CGP=>)4`FgQ0{=BPIi!$0I@}ZSLgIKpE_+#gv z;#^AFuG*E7%LzVhqt$ZZHD45fUi?K%w0E*=kh~=WlrOv%t0g>rf#a&)amg{#T8C|v zW#T9)4ro_9o0iYYGDmP1m5=g8Ikdaw`lbw&i~IXJJ3B;MxhkAT4%orxogT`I3*1rS z@d71EJQS()8`|^O@R$~jy~?NNof+IG#w(WHUGM}iow2;KlFBDP3q$%Tb;VIK?ug3D zKiWS#Esvi#kz~xmPenp8g5YU;9<$ssrJD5%kgPG6-|5VO4A`` zNVg>d$XXG|TzxItIz?iQigB=y`4SHADD7K$G=mAS;#HSc4x(U03kE&XX@Tv>HCXks z`;N34r&MsKH6v&cQ9f*NY*_rVyE_driW5x~X+q;@Zxc#X@w8Bo66|uG~_9WaM z9s`*bZ^$tz_L|min?)rOPOoTd98h_hHk1a%YnvA98?zBzBT?Jp!4S!s_RhV9RJi1> z%v3*JYLM4eX0?OPzIf!(Uvj@exsGzNr=umd`3~*uMPHZFv~c)1z5I&$<#G%UkN6(D ziOFG}hY{})w{Fe*-aY>)pv01kq=X=Qb#W6~F?y0oK+GaYw$?iAC zfOGGhbNb=Y(U_gNZ94ve&jkzh-64&Ii;`E(yTMSLv*Y}=*IxB*E!xP7pZRpGZEVH+ zAKaEtW10HQ%GyS(FMkxj`K8at%F1dy_0-dnM|1r6<(K1gpZi?At$gYCU;Ne2#`0R) zS=XU4hA{xXKK$rI$)m-`o#z)8gIAZ?t;gM-$d$1e$uai9D)-=BzH}*`div>@oEVUd zmg4G_E5Y4wCr(Vnt(yz6u(;sw*Oe=mMXx`e|J36eYdFTOKPsz#IMg?nZ}7qr_vJ05 zF+yVqKRWOu+u%UeS2ZxFv67$47Vwvo4Qs2bF@1B|au^;R5idOSLH&}3_LAl_$c@Ki zNJm?s4eY2*cBp;2{jAYX)7*kP_V^Z2r(CxHZ~eV}apDv_ZEK!IKNfvuur1o28_9m} z{r9cFb6pB(3;AAFIOYK~AJ5ohv@wh*8 z>$Z2jvg@At8#H{CiD>emNT>SP*T4SFc;d;Y{TMst^0I40M|v#sB&m znD>F4`o4%i2OzIP*oVQP(V4%-QkKJkUt}2?7;EtU-QlpZWhjR?;*`_nH25*)-UG8m z1Fl2He~^Nd^8vEI9QL4))0TRLgY?Jb%6Vbq2Qr^I9dS86FUkIoZZj-d09tDB=#~DThnGcGig& zc7{wZ#{qJacZSS^afri$E`HoaoRefc#UDubaY&)me{y-j*@$Zr(4s8z$W2hCWjne% zc4Me*JF4yM{M(NH_HEgFG0-K`sfAA4esn3Wvz?trg%V1WxxM|JLb*{WmP#KG@6swh zELLV{hRCGX3P6-06vtn)q@V-X<-=sr6F|kG%wthg79o>g6j~@=$dd^vcbEYv+C0IR zy=%Vm$~8$3V1kMa{7aD*%Fy7Lrg4P?E1DBJo(~F>R*s5b@PlW=%)bEmLs^LO0NJvu z5hWmtfiyWxlL*R!QigJw?~E%RP|_rjyO5jHLL3|U!jFt|K~W$Z#i-@0yxGCT<>FQl zDJ(Cg#2;m=E3C9Q+Y?Wu1K0HmvNCh|WGC(P@SQ~B5!u< zu|TS5;@`z?1cg_4utSSNj<<4bj$=-gA0-&&@-9BnrA*4j!o*HxO6B%MnsD$-ak#UL zvYn076afC6wrL6~7kZF{Lm7djz&01g+L51hS^3H9$0%*d8CiIzABt~<(eqN45v*R`>JRYrxrXBfN5Gx;K#IaGdJt|{ctLm=}C8L5Q zmW_=ywVzG3i5=fhrk1Eh)r!kc8EMzmN{<$BDx3235oi>M%8wT#tJR7YryTL_H168k zs^y+#kHn#k!h&5jLW<#$(Rk?0N$-9_Rx`J5#RnHIMyK*exr}0&g(?eel-Rr!2|ae2 z&_7vFqtvD?up23dCV`&dtt~iVIBfOR!NbN>w$8vd9irJN7^=GesSJ+ zi!Ci`A*}^9yDm3Yx8i^Iwe9$$sovlf1a{_$Kx(rn>QtX1s&Y!k&8jtq4^>h#_bGY@ zCjCpIuCY^-d?k1uP*R(+-K_dR@y_t2MR09f?Sp=fA`zet_n{AMrO_DJtW}VA4`Wo8 zW-A7j3A+I$FDn;mD58P-cz;**$Uny9)-EgdP$s9B?*07b1!?%j2`R-8c^JBG`06B zkL73LbatG1HTbt<+@vR9uV7zNay;d3!DPI|qW}zLux{ zHE~o~zM8_D)~2F1aK`jq&Ry}}QH>f3Nqxo}_gx6{>#*9PEp8=Pt*ikMckV^{jeQ z(dj-)W}qi!w}x4@|C+|2)%aI`@UPWQd*kG(Q&zk%-Y`zncG+3Xbq4ee`Vrp=cF%GI z62%8Q+txR?t$62XJp7^X<5=nVNPkH3NGi5yW-7zf^zG>GVy731Kt!0vZ)nqJ$NIZs zX=5*5f8!_K#n)Ty_3o_?FW!jdHD1cC#=_!`+!{xATViS9mH3_C`W=;HBc6KtN#)cO zKm6ej;)`GWV!ZMC8$Oo$g)e+2mX;Pb zDgl&$jAe|0>?q@h4aOOiUW_Xo)8>(hmF0BzF5~0O?YUT9UXt8+shpj+dvWym@i_nf z2de9)7#p7m9^ar2;F(7}$dfUPZ_AMK<53ds?&BeoP04w4D?O6Ijz*60;-(DzNQJ_Z z^eAmnkny9L^tZ43#}?d|PR{>-IBS3n+~cghV9d>ov2nFQ0JCXMW@G)K|B^lQ9 z1MWvAr_XrVT@L#h!8)e`AmwqdM6;Yl&Jt6Uq7Kv%RR?5z&l3+2Bc*^aH_TF;;V{Y{ z2k!tZCB?~S`Mz*ic1~Q_cZ2)IXP~@%L$kYHJ`wPp@X1-Xff7pISaJZ5a@}7f2@fcz z1+u#wb_g7Zf(_U&@+E18MiQSu0r()L_<6v6^15p@5r-8dhyS9>(2&2gyRTpq+>P}I z1_%JTeE4%1kjtMl$#LcI!x$*1IV}EuK>EAMJo8Y7oL@QL5-{kPT$!ibb8MLW$*-e&QtNx{cEmIFP?RIf6K1xx_(h&5IamM^ z51<%CCLp1(^e#Rv9x&{*Vv$nm?zTdOU))igu$bT%b?Ooz5BQ~iEFlC`lm&OH4cCC9 zfLu=MvyNK|&+UbUGEs!*IAa$08NdgK&yZ-|p-Ua*_JTY2ANaz}4zyI4grfjVd;rKB z%G5V_%Zh)zZQpQ>o1ofgHTs zuca+iv(cnIFB#&0vR%q|4uSiBaYFqRt@7~kGvKhsf$s$|Yo!p9IcM}Uw z0`_X+cN;}iE!w-A3j$iqIO29F=?Be6tTcy$w z^Ya{UoQ=M|e#cErO!}xWN@$L+v4ey5N}JdapN~HJh-uMxDC5eC7OQJ(9?wQcN3@uo zk1<}??Ci86lDeCkx^2Z_SEbE6OyH5@?JRJ6)ZW>3c6Dke{xAP_GyZ&OM2kX6j$vy@ zbBfzUGHOGzRR@$JN%T2mEq+d{iB=xItGKN(axZ^!<{szE`y^g-M1@EZ+Gc zBQ##^vm4afM7dGpp z8+<5Yjr-3k8q^jesz;QMWVN@ha%t?N;cqOd99@zJF*9VoqIRO7W^b~AQ#DIGfl zB|Bx%-qIaUJoKpCO|h}PD=xM@#_jAi`AB+SCw12q+}+kHxjb{GH8$tZN45V%eERv` zc=YVq_}njjHZI+`9e?o`e-Z!aAN^yE58Lra|L%|D*M9Z$@#JF<1yxHmFs7t$m5NRO zkp1>M@2Wqy`F_EQ+MudQ@~QbTnv*9_xD3bwg%$}clLDZ@iS(I;b>B%yUma0f9_$|o z9;{%@hZYY?pg3nN2WMqMKRPOJ-9>4ROU)9*M7|%TOtd&=aYGvy!@kAtz7zzFMVEix~r8R67yKk zk6!EqYingRV~kN#Sy+f(jaBX=D!Y$xN=|gC+cWd=w?F*b_{?WN>o|5MqX^}PMfyIw zfqVP=Vq#qK+t`oqeeZiQb9*NK!9V;xKV~sEKj$C9d}V>;#5hKs4oWtRHQcet-Fhg~ zP%Og3$rC4ioR@n5ImXMk6XoyN$Vhx}{=9czLa$9@o_~~3AK-h$k4&UzCpr(ZeE8vq zu0O_26pS}-@=(WMEGnNh@eLi?mcLPwg{s73{;iwS-jPllLSEb%dF|R&D~Wjt8l@!d z14ZA_V`ElY5_j>^MUVMDp02Tw`sNre<0@l^%PyivCdV{3FM1qq=f@*A({!IRV=Uis z6m)$10EQ)@#karrqd0N=h{pB-$*&rJ^EWTYOD}!akDUCP#kK@G`KNFWOU$TOA zZDmz$a4`A@`kaSpi5QAk%3KkD1k*C;YXD<7aqz#qy6X1btv>ecZ+}0IA3x!HUf+E4 z&G_^S&&RgrzHh(tX7qNB#((?aVEoxiMPofbkf#2c6skCixd<7NVJem~m9h3JN8GUv zfCr^S!(QPSP2TLLz1HDS8ifIf&so;<&u~~`K~7^RGAm?eFYYoAIqrT?%G%C*r2|2x zk;8nPHq*-N0Jt;jgkj^ae1~8sX#ygB|W7uKfvM2-L z(`_=ja`NoX_Q4~-Wy}L`2mKchoIsB7Arisar!-|G_Xs^sTWgZHkGntLXxJ;v*F7uoH zo?R;GB{nTiWKe{#;Pp`x=m{rJOqm3Fw-f&~G0aLblq=B0O*{$} z-_6FvQ8V{+cOS(pltKE({Y@wz0KXm!-GT=IJS)aDv9t0=lWX)Oc_Qjxr41Ia%gy2= zDRb`Zjx+xynmNon#Eb_wX+dw!R40i;fy&4$x47A{#r<&b%n@4_iR6_POJzB6jFvJ1 z?C3%<$)cIvVdfw4D-NX!>FuY^!~@4z`2`$$E{kM{vWf)-lVy1J1l9_IBnOUgGCAfL z6~El0=;OX9UO>fWLBKt3*wh8IQJ$dSVxmvJrd98|^2=?f{$MLf5socfl`{kN%;XHd ztVqSSVhg#bdE}D1`B*2gB22Z@J+ie*f4IAVWNpe7_|sc zrkt<-D~@n#I6WS-v%6&(v(Tk*&_ywe;)%r-4*;yNYhrCR)wj~C^{Vf6nqG4=N2W#1 zM(tex$P>k&WduQ`foBqMj~i_Xg$2izX=4l+v~AijeUUP3Zme1fz~%5PDp6W{m!a_3 z5z4Ms?wCSpNwwhymjx>MQXk|A?$F4Pm4o!z&Wnmi@(m6;20~f@%nB$ z@m^yrK)JT1aj8x9MUz0_{Ai&z;^VQ(#}|!zv8MD4Y{ILdyrro#eyARsxZ_c6i+U!^ z4}Z|Q^Dp;GUsD;a1XMfZi1z-D;@N@c`}b&PqQOHPDCm5YSA6X$jnGgiTj{o=Ja{!& z^@jq^TfR_8?h~f5Yil)i4R+@7SO{(bsYMh*`mgr7wV3eK&UlamK2Y{WTW{i(U3l9l z-cq@1(B@^{&Y|FC-=;N=@b;#@=1er^am?EHiAuJs*Q2R(T=do7H*R}Zq04FcvNK#% z7cNFrMy!-%ONMt5vg^`3D-5Kql~i_(lisPQajmWUNIW_*qVHyFEJ>!FtxeJ0*&M4o z9m;OeFA&k;2*?LU&Sv4(-+bhCU#Vn>_Fu{z~SM3jUn)vU}n-Vq|1E28V}zg@f;SlT1(=p}?wEyW{B5V`&T#!^F?d&82+!eroJn zTv&{SrFkpO*xlIMHx|<~C?wZnbF(>CHq*DWUHxHceK|(Er{mXt?KhOqUOfKzqn6K) zfBZ_k@agAbdg_+?`-S+8-~6)M96x3O{9wg+gp!kSg>M1l){PreapcH^$4C@r$c`?A zv>3LSvwZK{-;2qkN8+)^ABpv~4Ieq?#{?8%i;D{}Kfma4=jhRixOR0a&b@ms&Yn3N z4?l9sw0P|}KR~iDzo2|oKg#R!l`B@XGJf-7`Qp-|$3&EXZS9Qh9N*p0Slbcrz4w8S z4)^tTOJtC}o72-CZ&B)@TpLp!jDfr;OdFsa&`7(nHLm*G zFTRA&oq)_gCMJ%kp3}n`V&2Dn8H4!|lrfevjE;@?XgIqkO;-QDms;&3NhaX&u zZSmc*b}Rm$SD%PKTUB}3NPqwhxRaH`uzN_kxU{EPG323_0#z(3l2jNau05pr4D_ zNZP++6*%B#XBjdX0JkMj1RA#}dl?V7w*s&cJHsJi&Lrhazcq&b)F~A40M3l}F;eBQ z!{YA-_rj&@K)IaG{C*((yU}&>B9i!wm+i(h9)JX8oKFfxp8S9VxV_kQhh+9=@+q7h zfI!B`v1M?0PG0UnzX%|od*pGS=)1$uobUm_0!q&8reQH-X@p$aWgzKca{t7T`N(Bu zbjWro0}qBk#w}-#8z#%V3nwdk4nQMbBb52ciE(3q9GBr9v@(g0@o=|@9G-39Zeb1i z9ujmAa{5f;eo(@{XVP+HS+=o=y@V+XUwL!uzo@dEi%|QOZPs!xEGrrv*p` zIwpe`F4zq;ayHq%;}Dby2+V&jJ8=mYY=WHwDA)qCgo6cH9@rgNV6b>3m=%EBJlxUO zx*dJ(J2BX~9YZMpI&f=&A%9iwUd3x|8!e<&Vk`TcF=SDi6~|5$=aLqAS*apma&9Gq zS1U;|;oT)dM!`^4=7GDb31kN1IpT!kk78IMC^va{(x@~^si#RBe6Wa9*^=@l$qC+^ zSkht=NI3M!UrQmS)W70GkMd|oi(>dgvDmB?fP$Tel`931H|1s_=HtLBgG;CIoF_JU zQ8w@?XWb|t!ksVa%wK}G_O9saM4{K_-4-a`JTbPiF+DB;B*kk@3!8M@76k-K6=?f0 z5a{b);=xH=7E0|fT90TmK}Y6EeklL8V{>~ecC2px9d#7EFR#K`es+@j`)C1 zTPt_RsjjuK=H4x2*(shlB9!Z>-0rgc*%hH==F7PX2Yd`PtoW1+2+unjS&$%O;#ep_ z%g0d#t}kc{pETLj+b)^hsZ!@*IYLu-J6q{>VJ?ox&+Z5oPb^Y-poN_!^IBZb-oEX{ z@v0WW9P6r2ZbXOOp>EsCi2kKasLpy_rt-)rO;$+z=&oeRB9WbiX(w)ClpQ!M@;Ii= zE<1QZ4#)%fK@S<=r~c_5DAK^A-XTNVp{@9MoZ2L5kdu{ul06DOEAmxOEYeVN@)9L? zKKiJx$^aqXe<(cadsprG?5R`HKhSI5JG*+ki)CqPLG{_`i}ZOl_{x>5vAMP3wlgv^ z<`+j<H-D9(PI-<#IWP=gcjwSDmN0YsNb${?Z=;gdn&&EVQ>8L@(~e1xg{FAd(mV?D3zqe zy=33SB7c{~ui9j*+N;JBc6N#(GLITN%-ZM!ic>%EgCQQfg$Es!e4@j2h6h|EEb*bf z&%+@Uz#2kq)wB4ji6;F{#Z-{!p|m5qty?5jzcuxD)o*M;aMR=CK8iTP*ipE>YCg!j z#!*`ohA8z=7Pe>s%@JMY>|KU!Rkc5bbGP2=l=7|!M_i$(M7g}Hyi^vAMm}!L(OF*U zt$D|w%AvZiZLUam72$H+RAEivunVwLeL(rBPMWtCV!ypxIGduUb|YEUHl`yw21Q4* z-xiJbVcAR3w6zqq&c0}td!I0N1N!K&cw!gi?n*RuD&5LW;dMuB@*=YOiD+AiE`I#d zvBIddCr+G=-maEdURC|8Y6jH}mbQ`-aHxMER(Djk?X{?Mw8nl*Pdqm{6^knyaq83~ zarQ)WeCpGmjVB*E9k0KAKK|wh-;V$6pZw?UPygoM{+l>?@??DJ*M7y1XcXN@@>I6P zXUJV2TV`Et@!b#Jjpv_xCN5swh|{O4>fh5;1&MrkgKB9LmCUtEj#-v2;j z&#DzRr%#`XQzuVpd~H&H+4XL={AdI}Hqb{=5cT(U#r(pWUv#BUfWxt2c7vfLLgB~D z!F}SXkMO zw%TU2?46G<|K@K;kG@Bf$2C6mbjSC9@WXigiN~!xdi$-n;#WTRIen+PVns4%r!ifJ zg7ZTFFDkPG|ISqb6+iBg<(dJ%hUfV3!euL;jvqf6pZe5uv8DcULv#=<4;Jym*8J>( zrffBhHz(rtH{RCxFy|x0(5H-K&wZy1)F>2rb#{12?NHUh(NeyrC>HYx0DgdDTs;55 zd5@_)fWn=-jKfF7;^d_2m+$wkABy29I6M9ZhX8?rds+aXxGXwOP44_yyPtRU{3~xVv(lTJ_Uixp$BA1fZ)Mdp-9u?bE3ds0PdxTSEG;kjnehVrv=_!ymiE8=$}7@w8b0M0{Q;ej z1F*JKHrfku+5eCaF*k1BjEByjcmJc@i{8s}+1+U0->`nbt^2pqNFT;~+?qM}yc0NzZ;Dm~gB)1o_gSGJ zvt7h8IKvX;xDNo2YehVYlZ%(Zuk?p7-W5^Pvwj(PE=t;l&M@?|@_VN@U&^6nAVy~) z?*&q~#V*eUI^P#pus{otb0f_jf-;Z**zaA2PZ9^n<>R^s6qX6f0HgN+>C)v>L1&us z^C!huiq}pmdg(ryZJnrc7?6ug*j@u5P{xq!w~ehF_~!*VvrJG2d}b2e4n3xCIA^ge!530u15hZGPVgIW503p8ElD zO0<=;D_;%eml=0X-^p{mGp!2C$uf9kAT4py#lJQbfz)pq zlH2|s$T-VD7{3xYT8@|B=~=hADVM=)&A;Ah%ARseWB?3+c<(8SAkmQZCg|Fc5{a(Uqd+T-s$AyZiPl6Td5|BE zO!`wWe3L@OB$)uEx1kXHl4ZmI%0M;0$KYbGDbnj_k47?sJLY#PhY&ftR1bHJY}}KU zU&56d&S{Bwkf3*uduGb*q0^)&`#k z$m$y?-T-kk4}5`fMO|R*%Z4Mat|R?0l3?7!v(MfDx(*Et+wkK3{WLMa6O2PW*y{}% z+PMfXG@v-M_aL4ZEX(4s7>u!&vDA}dL#L=FRgu3GT2QDQZg2YMrB9lTHQ7H;Jb^xp zdN$apuG3e3FwmA%Zk3mM!Qg{u0kq-0$V7?d`)1fUs@GH^0k zN)yS%bHKDJoy)CoeyPrrL6CREVe(6z(>^i6xJ{|v@wCGWfi&I98v`mvR=h0WLG}#1 zb?bJ_%+A{A#D@Ol$B%Rv-q>dn?^V1k;1~J3&sj#%yt-`2V}gYj2q!%fmdgR%c(bsC zj^$^Z?8)Sa@{^ADOt_ek=5mpi2_*(VvY{M!hH`o{&s$2z-idgb4C0NUI$BxQebia1>s@m0nC)c$a`$)2^m}Sd-F)}jhQ!zOW@{va#cG;%Ii}?ligJaq4P&Cyy zSh_};`}=Du$C4(2=alZ2C&E{*T#94IPM9~Yca?=btB6k-Xrphv`Bq%eM6;m@DJ+4v z)SJsFnE)TJUAr2`jvfzA-t>m`Y9lN+=HM5+V0T&@u`u5q|KuB2;)SKj_#fsEYR0KN z=^_Gu!kF3{oSIxgF7&D%)J}KFcuQ?pahND8Q_-3}LfGri20gVi+6!wrd99z9 z{@XAhI_X!Nc*4=Xc`1A_HEz!l&TGfS@{#G>sXPK|+va-IQvZ~*xt}#@)JQxyfw5zEa z*F=M^yQ>OQ{%UuW8v~^e=HMfX@cF=>O~tL@EjX9h!=8bC{pnB?)mfLyy}Pj{*&+Or zM_qhy5H9s(<*RgzU#br;!`8ow>X>+8k3?6z=-&`c;zv#8!rPF8NEjRNEW{YNd_7wI zhlP7B9=-5z4E1&S5Q>ImU{AFtmYeF!%5ki}5{ny*D%;UttHs=US3Ekk9DS{8(NjAW zUwC{l4jnlZU;p~AxGewlzyGH;5dF{p@~_8_UVJTHdg-P3wO{+SIDKsDo|A$B?pb>K z@+&XLi4#YouQsLeqcOvwluvwwr{~N;WEts?I>y;2q1C*&~h< zt~qD{FWf^155=i7r(&?$<%Q)e{hXee@lwlfjXg9lmO_t>k4L|*9JYZ67xER)UB(H# z-jEfSKe`-mzV(I;O)RBEt^h3C=c5P4-QM2A(Nq;y)UK9SnwIweKJCW( z{3~(z_;c~AUp*Hil37y+$Kr=Sc)?3-ISAs9zVVHC{wrUJ zwOAp5*7Q+F!6=N)70Wda0m17K z-2MH1@zz`K2_FVBWNwnr$bSsme zgFeojJuUuS@d>}pb?FrAYxX|9efxHN@ZS6J<*z*Ntr+m?w)Z?bfoQNNplF~A;E~QU zba=!VMB7Yb^R~xZmV{IN-}uI##F^7)Y^Z$k#h2pqpMTc<1#e7@y-RB=arEFsELTrO zO)qMaEt~53eLd1kgug1;xuLvi&t24;n90YSP3epnJ6F}Gw|6xzOXfEferrQ%Rj02> z!A>RCHY+hJmSF^+QJ-}qLhochSa_)XeD#m_}Oxwj5^Az0>kCw-ALHhr)az z{)3K{@_iX{_yh10<-R;Br{^Bve!pH^Mnc@qw7RusZtuUz z#&(R?G@0$)je%ZGew|)el{Og^xfX#ykp=nDHLRQ#0}7LCM^%`OK-pj*8th>s`Y;}l zhIgbRKIt$DSg?x%4wgU}M;Xl%b|&6%fMs}inxVYe8_{@_N^#ipEE(`H>Pd+gx?RO- zNr~Q;qUQrk^s~pH$rKLKfLZCi*P0YJ^OG_tuD$L|pOA@uQ7)v(!-B~)C9rXbXQ!ha z1uu&7dC*m0E;rs5DDV(L+MXUfrusCI#A6CCE%H_z#oHi%8&mm#On7h+q28rzqS#`< zN@<7#o%~M}5iVlHCn<;u!4Soy0?39e=);iaWyRt-2Q^^4VPeBX&_+K^deUA>cq)ox z;*~QJ9Vq11SGpfR?Ug&|F)!p^jyEZtF#P zpoQhEOvo{IQZ^={Oppjm{Mc03h9=Ur7#Y*Va>FwdPpsheh}sD)eOK+015h~WlekTl znF$%EOipQX&Lo;;hiNnU1x*-N2%tiO}#E;C`*cKlDV8jEZh|i0ih3bTJNU%5b|teK{I~Z zGqtSzG3Zs0!(@Z!;AjU6wOM6Z@k|lVDus&= z$$M~K&*aS#XVJr9A5BgRR-S~jJb7~|h2secBGAweB}3eIR)qr@+gtN;WaGv-%U*_l^oj0~f!>&2u0*|eGy2u`Z_Iba*{Mn#9=;i~ zcPjDZ6Q|zx>O;9K(%X z8v+sI02ehK!-pSSin*1Yc<$*lt}+0l)dwG3_I__7RN*}_*r07G^S zV;;j5V+67lVM~@xz2Nt}{SdPrcxf3Uji1%tz8WX4*wm86(8c#jKkY9MsThB>k zsP2)k8tXLX<0XFS(xv#^v!7GtA&!&L&Ev8=2r_P6;gwk5SkoB5{=Q9nnNnsB(l~qO zTue-infD^uZ6uFhjDhH2>{)pA>NR_Z-kzCty>b`{W2%~r###1AyH`VR-re`ya+fAAAs>`@$DICLf%dj358>1()roKlw@g z!Y_OwzWwbVtG|5Cdm>&qcOky@C*O>L!C}RDMj|$O`DaKvM>>hVUvioy=kS*LqV{R) zE~n}kk3&Ab4Gi?fx4!i~>j__Z{&Vr|@BA>Hc>IYN9qo^gKDus$?aa({Y)UWVWGSfdCRe>_RF^E~Lss#@S}!d>RVRE{_0|oNyWMz2qsv0MUiXL|##(>KQ@Snj z31c|k{7dSOi_P9x*w~31i`}uH=hv5d;#G;W=0+tJG>$Bji1DOXS9DlT?{|OKGjwoU z<`Q8*nQ`}n9QQ#$9B`H6cH-{Dvrpa@>qWTv2bALFY%=61E}kGiTi$g-XIReY69egU zP7eS@Q?oFke}e7f05wfLw15 z&N%$00|?A7hz#WCQiA*nC?{!yGb*k?nO88d)k=7nPd@G4!#F6vT~$+ z&$~=VhJx4N20C8@B(u=<4I#SKeVe{i7FSyaP|{9GW5uo=T;x#%2$B&lJXDAy>(;6?dG0Yh0u5oEGxGnum?4;4)BQHD@5iBDW66HK^$ zx~|HVPR&J;L%AmpChaUE1RF-VV4FTc1^tGZJFYslroXPh(r1EUU&9zQd;Q2z}2W>bgFw<4<3Ig zxeZ-CnbX83A4)-d5NxR)Sb9mBY*3`(>OY1{JP+`4V8W3Uekr=j+Y><1ib1av);HE| zB%{6aC7a0_6DpK=dp#y$*dVC{c;Mx5@Z9wl4AYosPe0!94knDW>x4Ve!H?5tsS^xZv@O~K@t_Ce8n|tY7M*w{*yz{a zh_%&a<6mB0)1)LV%jJ-jZKb<@-My9DNE&Dbw3izR4<|dGOg{Ta;IkA z@`N6`1~hTS5Qw3fQ#s+uw)dK(zP8*hn5aR!c`q7KmfRObr;VVZkvd^%caBTB1_p=H zb6?t@lF1=Un?AGNxJeT;w{5jsd+#YiMR~U{!tJECg-&8)nEHFAR~5># z++tkd01F$vw)F!)X)!vB4>sD-1(7tIFub8>3l%-%U4;MEPMUBcA8eE)U;5Ps`6*xB z`zjeK1_-BQ^`_p@$Si-9f!c~Xj>;!`z~5BiDIdcG@Agt9K#zZzZ0|K7TA=p7_FtwNV0TB_rraaXsAD2n_rE|fkr%Z zvKdP=*Q2*_GM;;C&>n2hf902Aa<~!y-9P(=4ef0gH?4UgF8J)(y#NjN#rAL%-pX5s%Lt1hTWW?L&^({(-s!*U_U#ynK_U{N}~C zZ2V`7hlzs+V{>CIu3Wz6Wu1dV1M$T#|0T7pdR)DBM}4+xPtL`KRms}kc>mI@aBRhe z)1xtW=iOLZn~Hz)Z#*A^jlMX2_MG#0Tk?^ELT09?it#!b8u&zwE$ag#Ox;0X=yRQ2)N>+i<#W5;}I zFg##<9ulOfq&_1U-hmHQi7DR>HytP za;x31c&7);P0LpLl5_!$J(4J<8Cim%k1>^PUP$Wg8j#tN-RR?ZU3c|pd?&r|b#>!u z%+X8er7Q(+#r)b<%r$%Bl{>9iX!gZB3zhiZQYG#*)#p=Dl~_NTHKb-50n^DAxtz|la_P79RNm!OQk9Gxr-3QWB@WyuwAxk@+@Vh$=0c{I`$ zmvTckZ&E;5lWC>?uk_V3dl)1g73x!%IR_fMzm6#a`a4x z>CAx&W8}GS6=eiD{(kjY;N1g793)NFnzQiD(56e_&W3=TUjjTn_V6`BF*5STX!p>d zP|E7GJWI*&qZC8M>+jo)$-ZVx)VJb5eJu`P0PNrLQs9x=cJwN;n+Rz|KgysF1=!va zDHv4>1E3Tb?xms#cT#RRWB_H6HiBZcqlq7rY%62J!w;o2EoH%|#pJ^o>6+?}bOhNu ziV*0Q5>7gd5Ev!kBc3_-&{H|>q3F0tapj9^#*NXC^ezW9>YA2GV%S9KPIS2}ifKQ(F9t_*Gr_C_$mXIC=)NypYrFKJOTFIVQ;oRO^%r~)T{Mq zXkv=8jMB}71*ISUVSwYBPIP7hM7dIVx0xs_9NZ}U7+1-GFdMowSzlXO_ZM>%SIRJ; z2_E^0aF;jpnk$A`djP6jl&6a4pXwic88DzQLBUWAvnadk0s3hB#PL5#1>>eZ9o2E6 z13q!JXOG|0uG7^#ENX)Ck;d^$ZG#CmlXM$R8`)cg<<#l)WG2KmhH26PPf1VPqAvnq zXD=!|12^?swpYl8(y;M+!`^A^L$|rH9;{m2_$6@Q>eFOz!*ur#45~g@ zPNh26KlXB>KXGc};J}bVc3l4x6O%446DfNO4iEd}P|AhZD0S=Q?rLMn8#5jH@$S3t zX(BlozwotRO0=sb5ss%FMqfNpt9@xn`qI*Ju{`9rA_~A>}qEB`3jkz=N-PI8_zHJ(yev${m6;;)P@KY|ew!312 z4ApLJz@yLOG{c^MqN}C**it(6(aNUe74;~hZ3wg>58n~e>OFNW0Zu!tY$~)5JbDJF zMXb_@j+V;mJqJ}+7yyJZ7SOTlEtHOfQhAZn!X%9TrzxT%z&0c25 zUV+qCS8sH!uf?t=#?A-tIt+;%z`-)!=Cad!4?yG)<;BQJS{ToAV~j^ZoD(NFPQZcUtb^$eYxtIAjTiO1ewc04UA`fVGGYa_B|Bt zt(B+@PAT51=*94;eDD~=q6W=+?!xd}n5I;^&fNBx%ivf68NI~v_9(O(~q>6I-n9UdI6##Ha+SXNe#J$@#RPV~eh zPdpW$fAZ0oo?D7P_=9i6;bTYRYrpV(y!+OB@!juzHy(QEAw7TDY@zx9`X;ih4Z5X& zT>9vv7#kmz+&C!y^eXQZXMTP$rl)V&TNWDghm9m-k#E9DQ!1f!n^FK_{M1zpT#2UW zvAn$DEei1P#xRvgH!S7BWER}(|)()#|I{srLIcGAPf0u!5F6s_m%~WqwFbX zd7&_jJ(OQ8i}mJi{Pf41KD-uBKKZ0%X1@@_PY7ZhN1@s&qESa}1yCeT%GMdkKt>7-HXi zH#{GBlfJ5Y(73_)56}3(YWxE9a2g_E&`+Vj#e0mcy&Tx5 zG>dby8e^pobk$>hvnOt@R^q4g-SOUhD}HpVJKpqOuS$e5kY&V5LodcCNsBW=80NVX zV@n!y9tfb2nDjLz+ZQkZn)aN9(E9mfpgj#u7eh|RGr#<o)`Oo z;%2QemyP6YfvdJ*6a}rk%W=gMD-bqZND23Qh2^w@yKmCFgp9OBTXu}Q7vH#@3&5** zgFQPj+SiN&we>jE*wj_`jb@D3H)FVWTZ#jNzmyHpM9xfpF|we%r)*hri$a3;m=u*l zA>|$3Zrf7mt?Wa)0y+G_UwN7ED;%Q%iW&+G@wsBuLwNz8^KiZ_8O3`}^y`0@(j-M4 zqo3l5Up<=Cac_m#^c6~w00k8qG5%qwWI3yOMqDY`cj+wnQv&d1BTo@vnzHeX_emj7 zaTQT_7{dyMEM;RLUQ*0Z;7H5lDH$69o{3{VtIT*b!aExp2@~)6vWs^S$~fgmkz}I8 zQqp8_-D`v+9!4{oMCK#mo?NR|vw@Yb-FRv+0Ymw%X;LycFrept8-6f83!5?CzbPtf!R`a&^`_WbRe#tCx+OAt zacw)s>aAGV>5oSymt$-7QuGcUiO)TLC;eB~?g%o7hof#joDXl~pEstW_$>#wm~^;jI5I;ei+)*-nPasA3I zpR&ry;~N{>apcIPn_7Y_E8UEAUj*L=vf;=!1c95n?)_MV;b{8CTkqRGfG4x{2=z5& z3vuXc>+9?}Dmkfk#=AT7YjNXFRpb3`T)DmC?MXPq0edd8fh`{v7n&NoYVpXaYW&F$ zK8(Nk7rq={|H?7->Hau<=6GDbdMmD7z8dErITy3H?!@KGm*VMXpN*+0mi(vjG0FL~ zB?e>Vy4o`zs_^7PMk8a82OJv0$0&*fzxlYta0~yx_xCZ zE!z?B;Rrd5OvA&^W1P}YPv5b}GN<{Xf4%bRtNtj$xIHvDU_&8tIen1a(b$k^=ED-k z$unn8D1VhvbifDN1LFP0^;@wh`Fs5M35NqS(=+ze8xX!R$#rOEH9@c9(ky@ZI;`6JMW*?|tt_E+33Jcm9HK zOC}U;l)|EOZfmSzk4FxWVk}}jZ?I3Tf}9?KG0Z_Y$~<5pL^Fx?feuL%cy)Y!uQg2;1!XmOxq z0c4O3j{uDeNaWpx9R46s8j+Lgj^`rlG9Z5mBg=Ny1#T|)#Mh57eq|DJcsUKc)F0o& zPxxkn?gzxBZaxN}IioT9;=Y_WkaNmm=52-tknypQ5q9Fp<)sY7`C0O~A7s4wnkx+; ztn>ZP0GZE5%YCV82m@$a;~=cK-Ba#- zEx>66rJyAF6_9&rJ5neAiuk2x(ba(GUs>z;bcxBA1CnOR0deB%aqxeva5 zq4S-d9R$82ygk4a&wj5kmrH{!dGNeX9(S=9MvWZD7t-o4__;G*!ON|NZpyhOC9H49 z%X=rQ>v6cg7E}Grn9`)=peCq;RTMiEqr0r)>plC;+51ll2opNEz*1Bc4kq|`^56lo z#pFqGP!N+LhIka2d!<7;6nz*!c;PSUrkaTe%Uz`%3hcS1U=$7;dyr7j+OZ)I*5ujk>(ZyGPI04Ukt9_b)*8K&0K*})&jKP6^Db+Q5{GnhnIVC@M zpJ-18M)HAP@LFkAIhe>{++jZ=_F$tJUdr0dUX3-~ciDT*8~S^cP6pw$33_jvKY$fv z@q~@%xzd)%mwOBq@CzQp57O|Xj=@1(uCRefzA8V$X>X+QK6|<*I^ch5t8QaTz%Q2z zVA5qTJiX_KvJQWs+gH8I`y06}37~-ql)V=VUXqq@_=G1Lo^Kc*SenLUW(@BT&5pfn zU1*F$e8rQ5QyiIiD9FZI3}oUPnEJX1hSy9W;Va8*AAkHYZ$8iA0b?VhF*KSyC|G_4QRKzmQKQ47 zUit;iCr)T`*~N0H#1r_iriniWXFQEKITYjF^2&-Qk9TJ7#G%6nH+Y|rr`nkAVVQ(zSx^BsVuC(Nza&q`b8<5XCssOh+ zTDL&$JT)h^Pr`Rqce+|WVtBLmOPi%X(3XW;IN0o+Lq*i+)cN(SJ{dJ+uhN5B?`d10 z#emmh?>&r(;0DdM`jg(ZdW2&~_{k1hF?8+f8L>@QRokg_OFrXur!@9_7J^hhMNr+? z6Ho14ogtM$xCpcLYh{Vkj-qQ*Z3J&smf*5{o#nlF9V%lR{C3%@0D0FFJI%Bg97~;9 zvYT)!54AD8@Hm_!)`YizNbhxz>_?um*B|wOM={nFxZNvH9WpIVtl9`D_fFJTbnUC)E76Fx?(`%^TP+1V{!3L96x;_j!o6#$l>w$ z!WX|3Q)46X`a2(bPrJ{5{`2wpV;AB(fBFL-*1^FKPd)Xx`iX6y>UYI>Kyh@Tf8$Bc zy*RFGcPz{=svmU4#ful?!i7h~cMgMSI1WHR!Lyd-{&+K~%G>YCP_S%Y;GJc%t}JI{ zNh`)E4k}sKxP(0Bv{ybH;U#_f$`yZ9U{A^A73xFON)K6S4#h{;mNed1;?CTnu1deQ z8Os~!E}Fdeh{sFKSYF?X<5PVxKYKG4wFc;r^TczKQM;?AG zUVZgd%h#`d^(&HD-LbN&cA)|y#~8ElriQl|=#cx!bUu9Wu_k>GOXZ{aF*dd!J5gQLnQ zF>U$GmN9rRdaRI4#*6Zn%5zP8VVs=QIC1RAF{knAx*CW1Kz8l=wK#wNLcIOXlEF_@j90f@z}&l1rGRvPK=Gv zjZWY(TIFY{Ib!Nh)t7*;{=%2zM?d_j@E?lv=ZtV-q2#s4HYSWY*RNks%i<-Y_~?Wjr|wyT%t30DpJmjHsnEvQjzJV%0p6$n zkX9e4NRk(+Bhm*bN7h}e8Ht8eK0Ye*&hX2pA+E3?7<=#zS}s9k-bT8=yMjL0NxN z$Yu3?zUCW&iBK7S9(nBto#pDJ#rYT4PXRd@+;5jgdHKEwK&8*|47xG@2`H`<-RywQ zf`+sQU^|tdcySL9CsR<4lacY`o;YpDi9Ri4g7!(9^S>XR`@*M9lxs4_|19O$FHgd9 zIJde-k=qx4rlAy`lLJPPnV$oJ&ipM;uzR%AEP!GH#ep$jAat5Vz1i9XT z9A8&U0%+BRTSlS6FwllPBglCD$aBV1hH~8Ez1w$z6K%!8`a>BUl`s?+(hx84ktfn- zCH^i*RGGEl<((cFX+V~vN@0fmN%2OsamDzz9S8d`{B7vB7KiK2n5=KaSYylcMfRNo zxt9^?KgK*8LllMr;$Z#38?P6oLO&FAls9{72~ZUIn$0A`heIg74Gnq+UKA42V5CAx z!h?{*8f=`PJSvKfI#x7Nz8Jd*BP~2Z>9j#c@$pPz|FGmO$XDs)rG)~_mwC!S+BCQ) z`tv<`IZXc?CLk9JSIhta|MW>jK~yfUd=DP|c;lb$DFbl;(<4aup})XEd5e6rp-;&S z-uK0mGmIm`4SuD?5S5Hl;7r7sCjGob7-e6N@H81q2~QIT?kR6BJNYuvfEp%G&DEwR z8QamTNe;^|eWI@>dUyly)gL7kPXaun%vb%OJ1dYt!kfy3*8odaSx&*XK~PIFb6;fHXfiIaGxpA~RTDD1(gy3Rbq%L)&r^e*KOP?waSIF!}TT!qJ1 z@dLvS@A3A7pD4rd2SX`)Dw3~jTo>|93U^6~HosF_0&@PmBQD0f;orK&bVea&Z#yn$ykRne)Ve$@0Y5nA^nc z?2IOji>}wxr%rp4%AQ<*`lo*u-~ayi`;)cUH?r8d*t zSknY^L2ZJ40lVzAz(f!u91|Y+%hEO`cH`rdF*-Kl$qF>OEr~98Pu=>oUGWTqpbgRM zn{n#QN!9PR4FQygy5hvnLr11OS;D&pKCP@Q+Y^$>5qv#z^q4&zIeZ3>6ZpyrrFdUp zY~SA5^n{8fkL*!(_1cvE` z#|tVy#?z_82V-t#&SgJ(?6_!S86QT&K22P^DXrv`59q+C zr}$AF6}~%)r?hJ4tu4v%O|?DBgE5d3g;!YC+lW?kRy63p`YH9`GIc9&@v+6;h2m3% zlaaSY+m>iod0H${?ophr7168uY0l`mfh8g?oH-Mt!^1Jsw-a;g;)iIP80v{TE89_1 z8^E}>ye7G&N%pYh^Yrp|R2Ba4$wn;PdE4c`aPD{JCm!J2+Ih+E_Qp(33dn}%L_8ITti=BY6BgsHzEm}RcL$lf<2j6_}`#-Q@sa741 zqsI@cc~R!@fj1aAXz!dp{`Aw&s2|k|Ife(ZSe?*H?we)%0xf`dT#0_^%4PRwJZh2O zj63vMV1s>M@n%(3Kgb`o&NN;qqCJl#<7zD1^thBt3;*B`wB5Kh6YszKZg2wr8R2KI zy|mPL)gFP!MR<|C@4CF)mJcR;h~S_JWF&?y#zdC9vL7nmgBS$a7nLQsh!}>cVyJSy zkm5tFJkHcKj#T2}Tkk0Tc#LDLa^$3UV4%V%xVf=yy$qu#d+)&?Jlq(oFjC^#%~*!< z5xGs@K#t;d$n&}Lrz97f!9i7nLnHPsXQ}P=>o+|n9XWDX*AeR?tUO@ripL*&JYIVF zrTF4=UyN^m=iBiszx+#jek0DR-%QU=$H?%g$AXI&-}ZRP()aO+F+{2GsE{fwe4}1C zJ=)uBsNU>Nt~l@wSXfwenOF(J_zrK-H;0Gov9`J$-}s|%#DxnN^gAEl{qFa?*XEI< z6LDvDIWAqkY)}2`H*Q*g+Sp8c8FPpShP*RpPNxq`>TrEE;rF%Ajh^;x9a_A?fQo)Z z7>xv-31cvOIl9pZ7#q>$(CaXc!dL2mL$~+{a{TBK8!~q!D;bNo`GBYPYW!-;(3B3Y zgEx|0xwu-zc8TVUV~0MelEMO8H%tBE0tUwT!%(@0eB-H!3z^*B`5Z=e~+YHM*|U@ayZOgNYvieBMl;>aYy z-d0j_P{5%RGE%luj5RTmR%$(fNreqJOri@7l+E~w3?39?24Mtt*${+r0folKCdEVP zLE(oCNcO}_@%TqtaQj*JHts1chCh_jw6rrRqg1nL1r39Q00q%$^@Fus%~w5wA86;N zG+q{_dmlEzz1};m)891!a^;utW&FER;wWP~A3+;`N4RdSOqv*|;T=EEAmFcP5MRj0 zUVN$}c!namt;s7MQ7Ez~bXJ5FZ(I4J2$CMYp;YqK9!~zr=;GrB$T>Rx)@3Nr{TKJ{Pj55T_rvYLhjP)RN~4LSXy~J_sIyRh%7KxYh68O(&e_DD{9k$LQ8CAgkyGXFn)XXM5qCnXI`;N|3=rbjMJYitC%Si z_rz5!m5qBM(k}JFW2mko4O%FBicWmr_%G>L8i{cXBYH*k%g*oKLl9J?=TEoZu>s_+ z?!kvlCxZH&al(_8_2}xYtADBv6l}TJ(-$p_cB+e3OZ}=%r}_p40t}F9;n(C)vy74-U z%>~7;OD)w{#gb(&PnHZM&u!7VExxEt?uxEx-ihcPvH{Bb39iqIca2nY%eRHRI}RT^ z7pD)6#ZbL3?ksJpU+lz4e{ak!??j`I1Fh<@yo%u%@2XnNt!&1K$lZ-v92#AZMoh=r z&Oki=@QIil?eYoM&pi8F2wnW(r?17^Z@v~!KKXP!@zkU7>Z@p^V(t4aZbCT|Az`##C@9*zZ|78ER>6ldCqz|fl$2;%5 z7t=G-8pnI%si&S+Tx3{EYY=WeDiRl#!g4-hAWPsg-cfj|BMWT^lssY&Q5rKRY}2+# zgK-4I;QUf?Vs7KSjXCpktCA7jF*~7Pjk`U#3()p;2o@rNTk067JhdZUd{mt1`h=qhqN_F5LJ{x}o_n%{o= zVjMbj#A8sSzi!V&_C922~vX?*RgUyYYue%XBI zgAX5u**6bEB<+x~2ZJ2)8XBOPF&sj;Vw|KMVpwEMB0t76K9o`mhzC5mS^Cb2_3YKi z_}t&$6K}rxzCB>S^rbJk9$$Oy_4wT9J{Kb+wYYwLPIO;)xo)f8I823hK^wIPpzx!^ z`s0?y1I7{R0;?uTda2QNSly`s(0{^;-i*r+zn zUYIq79hex3(T2wR)rfCh>59MqVNbj~FHC(fHDkROyi@kjH8rjPdN9bM&NL_Qr&pp7VbNsjO)J8MszPc;MM)%;}Y?HKf*p!W(Ab- z?Ss3GI^S^3@rtl=&^_-v@ZAH%$#`>I?la{3k13zg?2|5QQc`N#G__HJvk1E(l&k>iKo!3o=bpTC`kb~1ZYM6lv=#9>%Fe)h_ZcYP z?}cQ{D!sE7Pke!0MRd=|V+pCaL^nPu9(o?GZN^mJS{%juZ(u!+Hr8XJu@M7R&BK(; zOC+VpFqyW3h;c@FqI_WVBdcU+OJ7`39-#+=9)=uWrBrm8Cg{-r;*$(%cn>b#LLaBV zqV#~KNTJE9@am5E82K_-fgz0aqRCTV-Q!_|5{7ZagSr8O5k@j=CsxQvXYLUP9Lhh( z=bdTLl{|=_4Tk{nc;_0_J<2X=GB|#L3*~Fu22(#8ANc|NC9UttQ@@-x8Cp}G*@(ns zgZDeC)4XIEeq!w7JzteKHQ~gwfJqsX2J*!VkFVR55#t7N@tQ*6WnzG$I5;@qy<;%^ z@l_h-k9?tp$q9Ku@s=jl;G;ogK48#eISpUFQG(el9dD^ROQcl3Y`{Z#Smi#bFdqOKdq^m`M~@JPU|RnZTz% z#)**$4+0cv!ZA)_7^F=@5A+g_!cAJ@W#eD2bLb(Q_r&L(U#2&wPaYC@x8Pl;NwgGv z3}P4>@gAhAUEeN~W{4H0)61-p5g#7>>c%q)k$nfA$yDhm4x~DH;2%Niv=iFh}o!I2O zXuDPM1P?(bOw*ct-n@Cs`)ARG=mP+BFbTwyk#sk2O?xjhCMkF-ol`m4V4kH}Tbnzk zF&Qtnz4U63309xv4Mra@OJ2VI#zof=_&BYU6C~5VmT3Y-|H6BPjroc9-h1yyzv3P~ zdRV+jCxl`={B z+0jh5dq9Fz@0HS%4265&K=v1OSyxmnm1XUY%0ioxd}4n=F{8qsgLpS?=$-coTnq`4 zs1A(A6X(vw)Nn1X&aTAdApBFmSnG}h1Dc4p@Fv=h(IMnwJvJnF2L~##xY`@lp51up z*jCKkz7c~XlX3dQWE>pti{mFx#PeVJvR8P&`1(8X>T9pW!w)|c&pz{{WWZH#1+XkR z@Z~RmInJLy=~;W6J^%dYGJhhk$hn(HU^QI>09nw$V5D# zS#mqSxT^7DUE^8u)oGe!A6u%sp++svpQ?&SH{;C1UxZ~ckr*8lU01GqU$;}IPpeF8 zaryF9FPlB9`cf8>%gGRkTtf!4%>vs2KrcoYKFSK^dt?-jv23z>r;|_j17GJ;4moo{ilEW zr*Zb|`Ph<7y(Kxy2c*e~Nq;EfgT^9;G0AE^7%>jj*pE~7g%K8AfcTV!y=J|%STdIa zpaU|-Q3MWkq4F6E7-QiD;}qj+_GZUxkaBVO$NTTR8z)YkjF(@2HJ*F!^YMf4|1iGr z#pmMnS6`2()J9)?@nyBk^FFYIvhacE&9~kZZwI{;n2%U^bF*53wxy=f<|%YgC;n)t zHk3XR(Y;kql5aCJbN)c%kI+i&eF0T2V0f?|>l?fAz3+b4ZSN~z`BGfG_^v-vJ^k#{ zYF8n7f7xRphD(--4-E{Ze8`zUx&t3=0?%`J!C1);U87I!nU6#~V`$@JB;yhvPx-*c zhgMdnEf%hda#R@|ncc24MLOJM|uV;H}HUGRYwu=&jS+Q?*TLIF1W4;`gzk) z#`#&wnaS)(mmghiMINZn6qV8vR8C4fx&UB3+xLn|nhY7KpgW%Vcm4z4l>*!MWy~44 zf6z0K(`8Ebg9p623;RR@_or{G1?-n82=^;!89ouQ`vB=a2DgLvi>E8KNsn?+uE88P z$NM-S9>1JE=L3{+bmAjk`6p;c(G7IDC+SxRT!-g4z7}C^$j|u-P5FH}F5y%%&-n-B zD^R}wG*C`g&NE*-X$JO-m!bSzy5|-_%QZ_y(B#JJApVqjPymnooULxkqXI812{NAI z*=;2SC3O5DodS#7;?F);;W7^0wqGgC(u8{jqRDY3lG|kI>hKJD&OorsSR{WLp+ppU!^p{BBv?%;kf$ob(Z*Pc|ztu zGN|!GfoXxqbgMXwl;kf3D|>?RV{aLIrV&Z>V7P=X;LDpB zc{yr(LvP`*fkjux)6YQJM4Q9FQ@qRX+xZsJQPOf;-MHK?m9CkFL?`7*c!`&36yt7gBy6LH@<*p8n~vqszyVKD26}wFq`n<4a5HWjN%S1ly>58tA3b_ zrDaTb`fb=igYnMFrLHKci#X5(n2)6&hE~#HT!mNQ!XU_G5rrC> zs7)`C79Q6Z^{RW8YqP%-6A$to85yz{pN)U2Bh#)Qv{MIoeH@-To@EHI5s*G zk38~-_}UZizWa_RQh39$_uhpIXQQeK-<2zuVqtOK{7mf)E#B6tjFNiW8K%ri`Cr*Ge~u{G5#r!8`@OjjIG zxiRLYx+y%?gsWHOV>#v6*qGw>#jV>jHe|CG6zz+4I-`m6gwj)n4?nu(`aX5~RLtF( z^M>}&)Z4ooZ@#+{-~I8WsPvAie{#5s#D%)hw`V3|9?Z$kZdC2m~1 z8aJm!m&W{e-gzVDmKNiQM<0(bKKn#0EpNmh{n0lhw|C+T&wU}j`jzL@pWgSf#+z#A z7)G6LIb8 zbPNx(e_%zjV$FMN4h;{bC7v(77(>c;es12fioV?4g}fDWlqud*;H4e&yLRKMpBa~s zp`41!p%OL8kK4DdO8zax;NWrfUB%f7Z+|c}P>(h73GdOd(MEi9bv8~P8@4>y+}w>D zGwU%iqH=Fsjo<(FjkvSY9pi&|A1}v&15nT_|}d(Wo=vwZ=EIgCyobA%V#7&kcl48G8JG2G!*dFJ$)Vo7pOJc|5RKWAC- z7oU4FR@b*A{~wQI$Bx<~kiG4Yx9P)NnYel5X3WjcnMQOCGPM^fd#Fl};aNQgGGb$G zOZ{zAIM&_A`51?H^%gQp?@hOUjJN1+tVY;Wd_F|d_NERV5IuwHyNmJBwHvW388|gw zjeq%cGyZ3j+cCY;7w;_y11^8?MYueK>5qmE2+Zqr>vuUW;j|UMBM_y92k!H) z1jz#s$k=j(@-x4Tq-aOZH3MOpLZ{aaJt0%+uulslEN4={eS#khIZ-DuJa>le2cId^ z2Sd(wzpPDG5uyG5lhC;z|A5izMO&y4N%uJ{ORct4$aMhZ zYtFlPP7+iU_|R4yX{^U&V>9~eOc602X>e2;_TxiQ$sT8(%!_cos)9C^Ar0&R$`%HV?QIMz z$(V;>#)ch51}F1PlzJxBO#Cryfh-N$AWBLd&nZ4eB_@yLgKN3P^Z(o!%24 z+RU?p_N0I+o%p~z6nB=u5)Qb;#MPCryWHDINtoz?ckqk)+h#J%L`ZdufeIXWJf`xp zPt$5}SO(=zUwspe{P?nr=U=VSD`j)Y%X=CF{o;RGGRaqD=yV>?0G-N%C6fvOl_oLC z$c1q&)nD5821Od>H7`$rX6hAO748HyjVz{YAUrqw865Qd{E-cd8fS72G$?Osb$immPY+ zPZ_*#kjjct6JFD1n7C4A;wS#%k(Am&#=(^z#yr|B{KN1~-4YXz84Rk_GX^{+SWG4{ zQW=x#1MkYT$#>d6hzVUwyxLYfpj_-v#XeoMYsw3K(87f7-FM!Nk1l=W3B(hRKjFG! z@{K3kNtO*h{j}RR#(-~r^N%(0`@m&sdlZNVcjlJ7pV5dW^YGe}8@0zpO#~_K@#Dud z`CGRK+))33_m5(tiouXc$*B`3O%rVkPXc7h&6{&^{KS!HuCKYSycd)3k~dfLOjiI} z2%njmb^T0CjJsXpwd#H*#`IKrV?mStalJEdG@0>9np<~e&*<2g>Z~e0x&^o{+(#iSNe|2Ho_z8NPq-@LeP5R*;eFk)xE%5QpWKeO zKAMew)z$W{%A@gYX|*f<@6!)Q45*)C7^vvSt@!9ueN!_OF8z^m>Se(eGXy5N$Gw`J zl8Q=?jdTM2bs-8Mx!S2GqlMVA=8qcW(rC0W>|_O-h?ulK?s znlSQl+AqdAH5}bztQS2S>L29Wqw=#9n8Qn;AA_T4%wk$iaB}$}-7JPybZ?X(!H}J?n5h^QbC@ zCpR1M3RzGF+7v2)iUAvGqBeg0^d~=+3>y(0t8rj_DlR<2{+_O?_}=$_6i+_!WK0Yv z+4h56Mpbd~`fcpE+eubJB7^*1PY$?}H;SZqcxjeSB1+EHAzM zN>o*E*JhWZXXxn|AMTACx9-HF7Y@gjYcnx2RF4m@&c|S*Tlx(rows7S$+iR{in?oc z$B{z~jWf$}Wp*rn^%ozC=bt@jBhT2_q~ut?4}4&sTfEO07ckBtmoRjVj`m9~sTvi| zM;1PyBA<}S*RJ2R@$=ZxqvkR45Pq_BmnN7#roumsQF`VbVG?(4N*m3Vm%OqJ_Ki2+ zaNj*8-uNS(65uJwfgkLjnzl6PHs2UeSVD~v4Fe9|fj*o{av1%LeOZxjjHR52%hK&J z@tqG&R4DN-U%DKRJo<>e8+TN;?%qBx8D@W0Jk42B&W9e1hp)c+iVeH$jYm6r?X}n9 z*=L{iQd-6t4nR3}{CK?l(#!GOb6<$JF21et=&^Y1)z{&)2`|sN`6=OJtGH@T5 zI1rPQV-}UPMdTS{cm_PzFaX2I+&=kuck}kmI3$`lTx9Ctls}kZSXNI|9jc-f6&YWv z^=Pb`iSK>)&y?Spc=Yi{eyXaq_aPsa_;3eK^w1IMW8J;ot{d>9`y{;&58(9i zk@oJ7wYox7a9`86t($up&Hr%e!?9`klzsx;MwK$)82bSsa^Q4^xTG`jkJL{_k`)!&Wt}$ z^)awdRxV5NyDwxWIIrRgbcS)gFJumtATzNIdM*=kKYZo9?w4;F577BshB7YTe)&EK zI?`so8dUUlHS=Egbe9Z8P#btQx5|y`KCpKW!2N1-zr^`H@pI+ocuucB7Wn#Qd>QwC z`1XYyxg)`SfFGbR8Xu`nZ$%xWg z;nC~^0|m+yMMc>GFSO-DM8Jo40?HT$v8t40z96F<;ZVY6g`YA{K${Axx7$_;bTMm zMbTsrLzK=g#pNEtslQ|p(gc*{KFSC0FqRau)CI#K#yn`nKnp`%K6_pz!y$R{ocH9T zY~VH>ieFw5Od8_rR#Eg%b;uq&q$7kng=ctz5yWIDT~k{H2jxulo$8)i%Jm1pQxe&m zOz%Di~7fgK3!* z^+Gu)C(pFgR7bluEMRD3(u)xfuNEe~YsLf7C*bltOx84+z`pe~N9{5^S;+;a{p3lkc= z^9)2{?>%PMTS+Ek1mq@BqjW5rr4K=mH%G!fU!E=??V zgT9Qc7H&k>ruvGP#VUMD@)6oAnpjFsc~8GC(h9%(i}K|o6}*tVvj-!_O6bK{0}qJL znq(U*FoXy%w_WO^O^tD4dxZLBb6LfNcftX4SPs{v3G>dHs)ckIRSi&N zF6p_d_rwEllE1ADJ!8xh9@B>>Bls~o62_RazF?yw#?s36n)t>ZZjvQDvpjEO#d`@t zZ)@p;i2lP4r|8{Fx8nS{hhvHf`%qV0pWBZ9uGOdw494vIPE6v=sIt#3uEwF^?pWLD zixu_5!^1ssd!;KH;^FYvK-5|{R4q-l_o|oJA3r>xw%Z?1KKVKI|3hvMZ@u-Nz1c9J zeC12e+oP9*gI;>+<(QkBm5jLHecuipny`u@wwpE332>qMi^q0&Rn@$-%#y-nU@63% z<5CU3{|A5Qafdz9W~S%k*Z(KK=7W3iOn>vO*S(yT?Gcc!ii>Z*8S5+S zX%AHO;R}*swf=g1D4BI@dLd4oIvUN@`IuYiiP-eBxch+M^}*V9*t?TuZJTl8DTxI44yU?Uj7n2N_V9^B|lc;(KqXCdR5{$c#F z7qCbt4LHzW7{b(q^c->H#+5b>0_Y0gnps{evvYJD`@Dk*NV#WX)vn11yi{ybE z2f)!#{B*F$A$u3HcO?6>`V?A~4}M}?9UU2op<%{>)ZW@{PIS@^xs^yWKW1m{NXOWS zv2hNp!C;<@r*n4}{BepyQ8*2r@nBmG5gi0?@;=GmYu9Juqocw}T;?H2>L{;6&C)f;MG zsyGq8w6bd5n|%;hS20BLVMp>(IN361ZDlRG`!r^&v%yEwKp*-bZGr>6X#0#g=n-70 zNBR=F9rb|z!G}}~k*vgkCyax5NAeL64|WW9e4JXx@Ta)wjZ4c5qI=L|9%FG@^&$RC zK4MIy9f6NLX_qS;=Aw3A6(2Z+WMzFd-jY1w6#o;aPDxa+##moh{LbtB@qc+oWx)t2 zltPonCxOS3bbA-{jxg%F4CHD3Sogg1RS_8~3^bIF0}Am#C9$u4Vjt3Zx&9i&BmUl<(V6jtnT$erv1mN!J18{DFP*66EYMd>r2W;C{G221t^V zfx;>lz(acK)h5u2 zFto$D*8{kXzx)E=8OYD&IQdrhe!O43WJtI)^!u7#D~+S@C%sSMDGq~pYBK`o!?V)3 zxkzm!y#_!}k_hD4Y4pq_$@dyS^1ieZK7;R(dDZ#lSYgqOd>IQq@o~N!J9T~ zW}?b72BvIy!I**an}K}2R6$q5{hquP*M>1Bx;EN@Tl7iiNHk*zk)lL;DcLrx>7JiR zY2QNuG-5bmf2vew;ZqzGFxP?dP0L7=;SxHm%;h9##P|{Ge45R}e?|Ig} zy$l6Roa*(e_<&Ia+AvrNx8m^SmU8ZFaRMA(Nh`4`#S0=ajsWm;djtAf{+i6`fGj)V znl`!a_e6%h%Ak))43O!ju25uAFbQKK#&TJdc=&+f&|Zl}S`=%_fboxVFge(0uA4_J z8)1S)n;d|2YUWv{>PLfNd?z{C~&**J;vOWT7lyd!_g-6O@6_5-h& zT(YkXklIz^o$Jygzv`2Aq<54z*Ae#^kMKeOMy1GNJmp{sctD&?4`t)WB8}B%jcf37jHOcHzdpw{?5fh_^>W#Q= zTS~{W-07RsZdWW3qHe)SJ5T$pC1WvptFX#rJ3jj0qj>Y;8?O7WJpUEf?+t+4PFv>M~sb)dcupB!{y7@z3h>;NL}^X>xQn}8?RlQj~8CQ8F!XiQSVki zs`QBt@ka0d&h^uAgA;Z8`eT=+s^XU_lq&NQ*op{lDZD~EWfG>pyG={B~ciCY(p|Y z6H@XYUlUKEAl_2HskDH2zez2`~A>t*M*{_dxtk6}V z^-~(*_dzA>m8Y4NjeERWS0C)bC|6vO?G&D}@L`McQ4!ls*M)~YwZ)3$h_Bll!mEt% z_S3zW3bU7>nAu|QzlPeEl^YGwf88W<}ezx$I z76O(D!;iH&gk!?nTu?r0i>q_d8aNQKs%L245gt4mo3|BzHR|I>Uu`0REUYR>;hyJ*^+oS%^M?yTedZVT`KRC!~`d#AhX#C>y7vj0cM{JnH zsMJ3)7OP8(arx3!$)>8e31AVUBfJ%Vw9I%FFNbSmnAgPnF&2j~OrhllqX##ubqk?$B0 zuU)-ry#X3nl8h%Bbot;C;b3pThRR*9CB9(TqkLSs;T}Hm!_$t_r$t5v4h@@Mj7%P>~yRmM_R*5za3XKesc&AM#4VHOvIVJQbj0LOC4d5<%j-)ejyFhdKEg{;NXbb znZ^^9k3+)HpU_KKPK+eSIF0caotp7&M(qn+tSF#PPMkPt&p_q`Nk2;c)Ow}bCR@l5 z4iAqWIco1kKJdYRNmP$DOB#D;#sA~SPiWj6jCbF8M`6ox?%_wGN8`k#<`mz%S&e`5 z`_))f-)9RE+BM~a#(SWUCjb|kLW-NNfUkFvq%p7rIesTt|IWzo0aB!PSjOGX^wUBo z5!_Q4vd}$b`1O8ylnY&k9L8ANewh=OA~XItUV8kwL#FSuK&Ij3G4)Qx7zb~in1m4{bI`NdDz`5V6`{tD)C(5*z;}>|#S8nq?GoNyFLynuFAgF{Q zO;Yqw9%1r(-|GSCVBiIiUjjL-42s{zp_?px0i!B+<{Xi~1x^Pk4s_*c1u!7Dag_%y z&u;Y0giUcAkBCUMoS;zJq@nmREqh|pv>WxVW=vL_ak#EY!ca4g3~u=3-$q|cb2m+r zr9ky)^2J_V9;lQi8?VR<@x==aEqu53Ci2cU8L3c;_|o0v#5{!(kE;@?>WGUso0KO# zV;llMN;1YAluwk9JTcYFTq37MLB)_ld;oe-QZOW?z21@m$xC_lo^Xs%KAlbJviBeN z#Iu(o`1B(z<4i`r1@ca>_{6udl9I(dO$e{6i@NpLrqLxo0vmG%#p` zhL;LyQi4)v9v1l%AGpiMWZZ=R@C?Ovb$Qi>MtJALLPR5Rzz<-QBcAv4lX8k-3=hh* z42tEPY6HF9Ug`>+TWS~8Ml~(j?d|a-5Z4g zy6Y94$w=zVRrk= zZG?P?m-)s!%Db)!Jd++KI-Jz#lK`u|F)=<7gZ)z0m6kfkFi6|P0M!(JpNy;t)xa=D zT0GiT?K#54hPuGWXG5SSSoXA4zFz*TG?bX~V0@*}7`QeynOm4&bh@hQ396|JCQC28 z_>zr&pZnaias1eEdk6mL$3Kkco_o%xcM^{SLjJ)&_y?K*-HM+2Se!VNmW*L!XE_u3 z9TGkC{nuZ6&6Bx9hYqW}E2@u%COkvt8*K!9Ou8^Eus0T`=$^lD-rg#BmQW|u9UHsD zOT1Mu@DU$xNG6%mK`A0)=4!Oyb&)?g&QW*eQOGaTo|is11<_B)r%}ulrvMBR}4C!qHcaSd+{u zjDCq0{iiKKkm@_SR2LcpInCG0eObCoj>6lb?+%ym|$G&8;k=(qw(dZo0#^}&)EUj^1(Nc^JG-6Is>*Dc1e=Tk=ZN}t) z(q#~-%`;PmbJc=O_0F*`HkKFdcqQ5p82PE@$TbptH+D&_jF~%}B z;$@c&aGcKE&{&6v!(imR&@;C%Z_jlMK-nA6dj+07>-X?}Y-HG;d0%+$i}Bt&?^?z( zR?ws|Qi6{Yb+2B%9H&p6i4Q*fFixL2;}0)8r^rkUEWmK7O-koSc7iTo!){?z-By3J9wr=&^^C=QsH)eK z7wS82zY~|QT(zemOO$CtEMp#1on5$aN^LOW`i+|!Gw19L$vD~6*h-lg!#D(GTV+B= zvp%43jJ$ZYL-+i`tVG?I>TEaOfB((suAhm=&mM>)N5*67@S#}Hn0Nc;wD>p}bE~~E zHF8HZ@&S`^Tm5+GU~sTjy-(v6AId0?^tArL{^)P?yWhd9RKGpe3l^+L7{)+X$ z@RDts1O19V%t`@hMX%~n-$AFNPB3O-)n<46l|LJZE9?);_#}C+JC8vC zwCg`Zj;}y^a~BAA9Q|k=Jirg)@!XCN4hy3WATkKr5zCM<7jWNr_X5+m9F=4M&qkpe znzC3$H&5~&DB~_CDucs|mqwPaIRPNV`xJE#L7jMkG76xRp7Q&4zNPEW0{h^|kDfvo z`4Ej4euRk?2VB zeF~$MB!G!I_eBEkJ)&yBW}s!l#w$%gm`v5X*5W|58Aof)I6ll0;LRA;B(TARR0?;s z2PK0&(bBRMrzg2^qL`tW+K6UeQI13h^zqe{J?Jp3ZAgK_n+zp`r4NWdmzsMI&=?Fw zpVFbcrF~gy$(ZFlk^=0>XaR&dT=`OF=&@l_)vcCDKnD|vq}$4$QX!O%78MB z!NmKo=^mpDiW174J?+pMm4>gUcnxJ*JYkVC#(Tn0TuGOe@vO{((-Xj=TA7UUMH&O4 zy(gU(dJ+#&G*Rp^Ot2iPREzx_O9a#J~UV|DWRO&82ww+=!R_?66;%$~rPODp8d@BB^JVO0jp> z+&rEh2W_~cM({?U6JR)g@r4)NuAX}GDNiJZheyP})ZUmda?lC*n9z)9BFf~HeUqp+ zfQbsr&M^Anxj=cmd|YW}W^UVShEqIALwzb+{l^oQQ&W39k$vy|_haI~WE?-rfdP0j zV56#AKA?C#>WiF`jN#(=$zq#Com7Tiq zuSIMjV}(?8S5aHQ7}(MTo0Ein%J25FUsqV;i}jASjAtDM#&c$OLwP5;50mUUiQy5? zLQOn5(O4NOz528AWl1{~&K3(T44wW!rZmktIoTYYaL4jwuXho?qku-+Y`6T@-->?3jf#8Gd_IJ2~F8FBgY z70J(996fr>Mt+Q1c$B^K4qFOL3t`Ls665{R!$;irhXy4}Q*A`n(AK(kqeA300uP2lROw29ktiumg*Q@bD%-B-tVP}>) z%gXoabbp*YG8Mo0l|$m)0edyGOcM`eJg08l6it#HeAoc+#$znNkcM0uA0L5bD$8BH z$9fY#WU1=aOM~?fdBv&)Jj*5~4|u6B+czNZ`E4t{WxD?3tq1T-AD2jV`G9<-+h%Y# zp=*fO}#hZtKJTQPKDa7F%d00n)OxpI(yhHs$AW1?b>x4oY5U1 z4Zbk0!$fF>e#%Na#Dm@Azi3=hf9W4N9;@?L;;CnziZiE=#`{;d;?C{2Z8&UI@Pw?# z+U}|7@495~RrIZu6}(-WF?HlAZ&NWn`=Q4wJQC?^eE7;IjHUm#i96P4rX3#ncCkSt-4$&!i#+Zl5#*oN9mmJ>165+Gw&cxwEhiuS8 zk3`Ea(i^UU`^zE3S?FL#&bjeWq;^ass8w>Kv#ZZeuZIDtJc3LuP&(&f<%KD4D?u9G63 z@Jp4@Rbk8u01Nrzz8EobYzG^!;t&ns870w?P>L0aXL~^?$l4b1(ej9^`<4_XJRCI9 zXlOv5VhQj-GmZ^z$5H(T8rxDl@cxrBsfip46ov|}D1Jg9G~}s4TZ$h0=2*Vy;(h8= zUIgZ@COmv`W|E8o-;~mg0R?Y3lnM%zj8EH;ta%iZMJDpfSU6C^F<`L#66FgeFu#Kp z6wka>8t$2xW2niBBolYdrn(z+Gcrb#1gJ%H69EFbZ`6qhu%0fW`IYtybj*@W* zW6h2gB9;nb=pj!lh)PRb5;-4hz$jQr;|4DPPcXVk)pvZ9XuhIadDb)Da5O*m?;#9D z8zqc<_)5$K0cD;10Pu28In95?V^RR`F#e$cqC|2S1BRtGp9RzbbwNGgMYgHQEfXx3 zqr%^;x z#%OQ7-hdjfxMZ9yPKXxJ9^f&PEB2O4lf>`@3k6t(ay)?ci6ZFb)Cy2^{a38$|K@N0R$O@K zLj0A#{FmLfW@qN(cYf#Z$9wNx6uo#Tj>M=Zw`wD5uWU+>=gqb2H&pJH4F!1fV9X>h zjKp|rzzZg~)3>HQxnXHA2dm(@KwE$h)Lr)SfH&}+cU<8M^w19AJKi?%17jge-_D*r ztvWksZ@oHRc`7VvDL3VvnZD_L%{Vcb6Gb`w8otsFpw%B#TAcQbv9YBIJ5bLF_y^aH zM+~a3v+T4_ZIt|ofs9sLw|5`nMf|ALH1TYTma4+kAHDyl@Yslkmm0|+Rnf`AlP~TF zKuz^~UR@QylnV1C;VGZo0YZ&O;Dn=q+YTRjTk8@xj?AlxvbVs>>X?(kr}* z>U=OlA|7}}msJ>sKpQ6&pYg_roop3*hxTARP0JfOXd}rj3@&=^lFX*-Zm%m`b=b|A zr9O^Vo!W+tYMcPfl3Uy)O^^CnMR+I|CMOJix>VF&M4Wyaha{U^U=^lob0v21095;` zAd9zGlxLF36_yU;g{Sx!ELnq%(a`Z!ID4eC^tmM&w#|nZPAP9Hy}}9_yClDMH~5I4 zaYy8}cGgq=sz-Z7Vlc$x5pP0hTwfAd13noUUXcgwZMV53ysP4Y`or9{80xRaBab{2 z=T1$zo|LR{=`BFg!U1S8^|Y?#p2PIWgD^>k2{PjdizDf4tear zz=h%Y$dRL}ry-5OO?$d>*aaT}X|vEXJ#$<2#m7?heg26~8y1VP9fKEo26-c!X{+cH z66&ghMttrIUx;g0uEwp~x1>8XW4-V5ab!sMYwK~~;NiG6y%vW?=3;QZzkC$LpiH?Kr_h`D7>R)x8HOH5_%>sI zAscNN)&QVDU%yy$V-_#aMw~dX9XDs@;)83Ac=TMqc()o8>Qb{S)%f*4tHz?_YL~yP zBtUutmYKzU252NKwUk8f1A#VGPT>0jYdQQLxJ%Fdz)1^KTz#9L3-GjvFn;&TE2rUo zM|yL^{X)OaqUQMb!+SpfPq}#aW8s7FewKU%P9la_HXy(JNQ=7*Y5S_Z;CS2={3)iJ zhFlbiK|Fq)_khiAc(bej(0{Zw=~ks$NnL6GADpE#30 zA22EUwWi9snNlJ&r~O{$pfhc{v+|vkaNNh%l;Qprvjb z^?uhm<)toIQiSIm$|_~Uh{r?<8u^NkvO76BVFOME+MbuLRG2U%!!cLNNgZQ=COwk_ zJP4Su!Ee55vq|~<(xR9Ckd6Z%Fxp{w#mfWZ6^2##jbRXD8RR0-cxG4Hi2}yagXVRrmI)4*%NMf zWY}I1HbTO0r9~mXt;srdJt6*Jl;7D-OV*iu(qEZ)Fgb%ag#B0l)qiP^(SQAK{Eb*$ zS&qN^cmDG@eB@C4)xY{z#XF_b#QV2@^S3prxDlfV#$#TJJ!t_vGAY*`O~{#$Jo4}( z<^epk@vdG~9csd&`l3z2ZzdGxtNVGH9OsE@_U@onZAGl0emda zI(qD=4SLCIv}*Z78v|dcEnpa#xqU+u!%OxYWWOrJCiREs4s}ZVY_6rHW$gL4yu1?c zzWa`sH6J>3FlMIjxIUP?_amEBAOHND@5klqvvF&7)A_L+on@EoLASHJ86)a9|LCJ5 zadCSjLX)(LXpP>gjY>ZJgKi5SRSqxf?Urm*A4>9H_o`38BHqu6qq%1ED81^@o_iQq zFw&_$vqzxE0HNi*pOFpZ0cQ0#4*ei383wuPk^D)IaX^nILHR=qeI3IgP1wc*y=!Sa z0G|-6JkXNH0}O(kDr_XAqfE$arMLH+mj~;43nPc*5uPB_GkIccQ#iD@b}^VLjpRpV zSCiceOK|m`rMJ58c?7Y*KxT9H&<&6Q7h1#1e+k$56MW@GiAUF_JRa z5C>1x#$%g9KIn5AM>dp)`g^RaUqjrsWL!<{ra3R1%8RjPb0I2?38h_AzI=!wtSK7R zC$=!msQhcws(azYvn)ifXz`&TDvR?I|EXVihvBis3Bp_Jswa%Z@QQb;hZW)3?T+Em zMm+!I!?7(sjty2~c7b}`iP6EHm>0=Cz0DY?^~c<@`pV#@+I}@wB|pYTsJ#aGL4?$&;#Bc4w&>*REfU zTeoKHdCL;}u~7^S2V!#Kpbd2Fd&ZL8se=>hTdCjczhxBtdRy`c8ID1ptp+&RdmZDL z`aYgUoCu6exHC7W_?tF#Vw}flxVXT+e{6BEB>MW*FVhl9#*nE)Qv_%M#2JZ>4NSF~nmAUCHtxhe>YCFGyyyGC;D- z=@pJnfShMsWPGA-s3+@H$T4t$M)ARi?B*~P47tdE(qKfzb5fP0GATbLq6~Bu3{)8O zB(`HgX>Q)W<%6vl$7!n^&V>P$4|sT!a{@8(XJ_YaDBe>0ME_$PVJwGdjIrnr@Dv>h zeT#mLo`w!V`7uKFitq4^_WktJ&xou_eDhm>Y$MpNbooBX`mvEQjR{?`xV966Bj;kI zHXBP#wV^Hc_GPP^YJB-iU$U;r-ih$@=JZU=t)Gn32j@J_a|jq8MjKV}Rf++(aeVujC06k#`tuI7AGOku(Vv|ICW8Z_DN*=?O9Sz@-jr-(9E27DZ2PwhAbvX6!R;*=>6w24Rn^*K93j^2^%zR-@xO@@3g?47usp?;qP_kNI3 zxAXmkaG$)b3*`IaT88#J>cBUt@B1SoSBL4xIGCRc$Y}wpuMhwya$q0 zQ@|(WT`~X?IX$IZxaNDH9G)RRcMy^qp~xZpE>(BqmvLms?=qC1+l`vQ{SX4>cY=<` zHsoZ$e((2%oKKm+PYOB1&a|HdXE`lbpnMN>79z*b6$*UPg60+jj!(>-{UMWBCKaF; zwact~G{T=Ts{}bCkmWpbd2)W`=Q16i5^{U|M1mG5)Ak@B-h<*~JOcAA=g&2lr+i<4 zAN7Ym$pdLE&GcMOlEKl4U&65mXNg7zGU%{j51a}kozoM6L7EHi2<6s+la$bh7S*H#$nA*NBdcV zE9FdC_f>nM-pdkTDIZb}y*H93b$I%q5TUeDys9SUJ_tk;8um-Ff=D(}no%q;_W3Xn zlr||FhOSG#wIK`~Hjc7<%0j<$zEi{O|(l9SN`B2t|t?E zZv(9G6ORcClLOufl@&?CQ97ZE<(iz}%R6vVH?$KJV+x7^kY&dhk66CKq+$r;izXUO z8rc&GPZTz$&xcFUCYb#3OkVIQFEh>tEBJQf<_*)!#@58eXoF!A94@!`Mf<~$NjfG{ z;3h50ai|w2DR|joq~w%jHsOZw+zwIHnS4M8OTzG47}R7sdwSCTQ1V$$$3zfb(oT*Y zITmA5{4waU6qWp$m^L+u2QN#9s1GJfAAb0u>xE@u82g})IOeB*cpBckemyvKlKeTv zkx30FR?G&E9tg_7 zo(%$TOs`2h{KAk&Tfln~k3%MAw9IOiB~hYDU5`neWq|6FrMY-6yz}mRs-~SdclNA# zfcFw@1moi5_-OQszgMqZ(qwWvo_PF8@i$_2P7~3Cldj|4%0}#NR^lhG&c>DNOL6lK zOWh?a=vxxGu(VZ?+^THG<)y*+f4--Q`N#xo^7XPeSYK&nn21Wl@FPj4P9T}uN5650 zP}@@*0w?xl#0X;ry$jnDRAItNew4utNwlxw5vTT`iKHqlTFvFC^kUpl`cQn0C(*40+md-Z9DpRA_CTv- z#ExV>V-+%%ycq9PrWOXj?G^D-a;GDID|jp7(FYUEWHG;@27rN& zWyDHb*<6g)2B*YAqxu_0OAK`!BvKvrdml1lSqQ(uqdPvt?W_rHP472VSBrWl8v8~g zmaYk3VN?{~Y!FrZU_U{a*}|a6UWaS*Dh?C<-8g)3BF-M0iZjQ@(Hb62i z!ou4#cl@4@3b$_Fv=<^(xGtH=p%Hi-w|4QaZp6){sTk$rAozw>!x~3(_$caAjmv+V2iZ0Zv_`X*0-U41tWXY%>9G zGoR2!Xus_5#xr}nkxw4GS?bEziBW7veRgY8JQ^MHyE)a%?422V&T;RwY6Hl3-jfek z@al#lnC>}^E2G1s9@nTd@?z;Y;|oS4XtI$@ZTrySBQ6hV)$^&3y^7E zwk@3CQdHRGdcA>%+w2|Z&v;``d+95T864m-G&CGXjvm!G-K%=Sd;YqOX4EIkjWLk& zd6s3Y82GHeh@a?JeDr0XyKJ<8e#Ri$Gkhlx_723;5KlscVA^k%GKfGGhL5JCVZ25X z)IC=6p);MdJazc6+Bsf`bJAhPWBkB@*i~QP0~q6btRcWjYCdxCi! ze$v-lmq=#oiZl+}h{=E@SW!RU5x)o3U({0K`qgW3Yx=f7H1Z)4-2{G7pBO?}b;5@- zYIRuS`ztTM5)VE4NKB|LGCslz@GUNEO2=aSCaw4+nPmq6rDN)}ySo)zYddjseLT(| zmOiO|{l2T$f1{}z;a^8NcW!_?&1Lr<5h-CD^)HwB;b81>yHN_7uPa!gPuEaeH`xcd+zz| z2lv5IPFecUPVZ=+l zPCqx0;vIjAd(Riq3H;*Yp%Q=dity#s`n7ZL+XUPLJeR{dvYY(cN*T+IRGWVY}agGb*Ov~_bI68?2GLHSy=6E^I zgW{HemP%AwY8wYouDDMCIXfWVXH@qC=bLVSHpq0Bh-mlV{0_+P$u!@89FZLWzdZPT z8X&KaOOxsRIC>P15eSL2CqCC)Ch{uPpM&+sBaeRNXr1}-u8h(^V5UDu;HP^_zx+&4 z@!qeQ7$_Y<{Bb-_7t*t?9&8X=Mf_rP)3dJ3a8m@`7vanZ?P0-WgD^eoS7EOrrN#3M zLm;Oi_U^94c<)vmYOKZK{>?Z%+7shL)u?qVo@Qh0g;lS1NwMv*!qO|{mpyAN!cb?_ zhM3o+r89i>Op|Yv34Y{#n`JYPMF9bKUP209vg95`h3Dk0C_JVyDVi86vQceYiXJp`#fXU~ zPf}=;0TN>Y9#QZB10l3PM~c6bjEz#*G035)VMrn`6ibXu*_G&|!&E=;~ zz)79Zj%YahR|E8@|Ug=F*2B*-Hl=L5n9}bdm!8@DIP?J(m9M zfBWB3KHKr1|J}dqiOyg9SO3*yoD<&P`Q6`*ndxcqt8O`wjBIJ2NchN=Wm~j?pdNz(21#gVFD=?o@>ocoF@(eCYOP=5 z5lPCam3^_frO7>>KKh5TAMaet67>W4g7H>`h;i|9dut=!7mx6me&o@|yniF#aKWcv^v?MXvUkkaS_rk}iyzI?~0Jni`7h|4eM@UYo{h4|Sqjuvm z_X=k;qq3>1_+#&Rmg(Z)%)uEL<5U-|?$M}hEt+3yR9Flms{N)9Lu5sDzKih(a(6XG zvFDy-kr{{44MX0_jLVBhA9YjF*xA|?0^|w5jdbWlrLPgKwRz!!Pdj3e`U5wxzx4~jrPTt zo_#Eu;@z;aTw1Sao{bl6f2^op)xu+>e;{rzug8JGZdDD2g!LF7uEgp_pZaMth6m~~ zzq}juUePKV*q3Zv!U^ra`S1Rj_x-fIwTxI7i_*TbjFlJ# z`8a@V;^fg@@i55=YO><35s+zk(lP!ZpTM=eyrwcQ#@y_@_}+}!iKn^hB;}voU*@m3K6O6GQ*@!&j*y7XF&IzNM^~}e?Sfy@dqkK1F;?U;3_fE_#7hpIaVqfg(poYS4Wum-7*p|1hsV&g zu(%Wx<70`Ra9ELYen3x8CEmLDo{hbnj?71|$%6+|ohlw5oa&Otx2A82hL++?_~WSC zu)r7P&r(veP;t^q3xU!jhSbetabdwrb#Kqi_#hW#6b4VcEE#LzA>$6-f_OVpWE_ljBEU8SA809ltuJvJi>rQdeSj|LKovUKlEM6>m`hJqCR!o%&ptp3|@XG7@Lco{aUiW-PBPYMh&m z&D}xKFc23`Y5Y?D2=-n+a!6(&)2&ZSMzZha_!#3VqK&q!S{EbdRc^*bbR+1a-qBAO z!{562rj4>A$`@UTx}aTBUn?toa7;P@%dan9ycmx?_LvQl=yp`s#@4RJP(Il4(TjG) z$IOa!80iPfle*uP+`Dn7BDvCtiJ`4{=biT@Q%}VBWFt0J#={eR@y5+Y{KhMiL29S| zuROh%tZ-2;xsB_NvvDS+FYrkz$d47-_B zc;qYZ1jKV(#mVvg%xw|oX23fE?*P9qUGqKA`K}ELfUSO4u=$fhCI04Rq7E#2GoyKshtV(H{&HfGJA1hK!5wj5|X)oNF0x`{n&0zwd~X^UlHL=LezN0~vQt z43r7)1mcx5DyPqxa=#yr&a|CS#+B1&Msn?h&bTGqxn)vc&Wbn=;NiiLqj3c~pC5=K zM-p&LFDQo@2+Iw@k@PEWbI_h-y5X5WIaxWZod9Sj5@f!73LrT>-;i;Zap(IoI8kxk z?>$g{$MrsO9jrfo)k!}u%lUMqr_P;3;f{Kr^79U8qsVwOS>SBOG zNl3tRaqkN_icqAN)9LDZ)TDtRE6NJDv9E|j7~T?6#vINwo(w48HePK;_vVTwsOxdG zz8QxHH{*~d29u+`(O=hu9*AV}C4`kWnTkTX@-EtUI8| z2S&6XzwqODoPibb7_?!Rfe-f82eG~&j!)`0=Gi2ke$~kBcKTQ-A zx1q`2@aS-?EaB~x4dZ>519;lvnU@X;Npw(uTrpbX#lyrG12aZCPTw6L8@D$kMj`lx zA%OO@w!X%^NE37R|Eo*-CHaH*F8irbPyO|(y%mrX@PH+PuFs)CPu}j_nThMyu4xi^ z*h_#{HBqV6hlH~lIK0&~w!L$?885$nC1&od#nNV)E9Sqk)f)0dVaV1n97_~L)wxWQ?K|zfe@?Gpy8(*4?iYd zyXv2gFCZQ-XluOZ0zS1Dyzu}#wJW?Gwyjp(tG2r(IYb)7)wa@TQ0dZS+&u=~(=KSA z_ACUoBCD-o;Ixb;qUf!t4|w^o{!=7nFVKVHwn!-1pY}9ljF4Qm&zOMWh=VpLsAOb{ ztNuunpj@IiDw4O`>ObA;E2>lWHnb4R^w$I6JFO*Ww6d<=et*9z&eUU}4P`8W<_J)z*{``&aFXHHF6Go%PZ`Cw;ltcnSIMJV0a4#@e2bNjs3Q+$eFa=fN&{aDU7pxOgwS?cpN)+SaM#>64+x+Oik(1)p`&8S66f$=trN@MO{+; zKsU&5+9Pe00QiNjG&grAMn>7A5ZzC&c&$R`k1O_U6(Hvsvl++WS-swG{O}&V0a`Jh zVQ$|-7ZM%TL%^ws=xNye=wfS<^DE2CHh$uPNEsN9F*1*gj##$|ef9rylp zebQAI7MAT9zqGvQ@e)0RF%zR7x&{U^(@EaYAX@xE6a7qdz$eAt@O zlkS7}Kd=YlxW?v{rByHaW~q3kfFRV}oIf*WBk;> zTs)Vcq#dc|n$2w+`l$!@%WM^U(|Sk}E)4x^YdbN&H69Ng-c+By97MfC zdmumW3&i2Qg>(UqUqV`rkO%Vz;RG_?3>jSx?|k10dJh|jLfhB_Wn0%iVD!!}XIel9 zBS4e+mDA*VKNmmlfgDywo8M&vE0E(sWjQ@SNeFj|I*QeXa)M6)mH3Uz%BNsT&NUO6 zpEGb@M7=L{aDtZ3b1qG}ROM21;^JDqzuz^dYeNypCBM({GnAjX2kybs2{}<`;`=4! zT{&)sjxcxBP8_*L%W2E$@;z68^!qWn^9q#0xH!0YXEJzSjt}shX;P&8svIRl3H@Gp zKq7+f$40;%PLV9+N{DklZItBzT}!uj?{ff9j-LtOK3^Y1l%R~t5`b%Z+zSMjU*tSG z!^@E4WY~um=chjw^f~i<50syCdex()6F)uXK58h(>j0zFpFF5=abWRWC{rmY;o(hA zmg46q4!sM|=PEWN_Z!IL3B5SPgWxBMyMA!1*kr;Sp2#`uLI zi}7F^!;5GH17+hGMTZk+H>AK=0WTCQCixgfxX%hJh6t24!T^*#T(^7p0@}y2QD%nV z))dP|9^DgH8A1n2mla)8pm+Ku#T1n_DZlB9CF1sGcAG+Zy z1%cPl#(VN3J#p}gLXpErmiYrsJ}pjl#Ij5H0L`gl5?{b=gPs(A_EiEG%d1#+1Wwnb z;xQQ@Pn5m2wN)#kD8r=3*u{p`c*fbtRVeouMKOj^aO#<*n&87wgR+_TeS@DU!_+O4 zAb_&5EC)p%gV^9;GAL2kcurt2!V_e6X4W)}j*Xh$p}`?5$nXWDWCrquuNWxd1)h>j zaxnJcjX-^nh97$YQ4S^)m<7SZ@)#SlL^I*Em-W@O?27zgs_RN+#n8<}GZ}fQS3F=; ze|n4JooEqnR7SjT@Y3PyItn+Fi+bU0iT4EuTQG59IT#bHg9i`9_{4-Kyw|Vau$Len z4?Ms6`m0i|PseL-z8Qz6ro4X-d<0CV+FNcjv_0@ruj~(mv2$`<6BU)4`sV%L`+I-S z2DiWd*Z+Ea_~A$KAOFYyxA+@><2T~m`E%}f(DxtxhyRhvx~Yl8sLM+o&^{?6?Fa*L z_DI06yrKTUOuz4z7$V<#9&tGlg!eD3z>pcqkfS?$p3t$ zErJJ}Zil`SPxtDZ#zmgO!@(^qujgc5%k&h@WMCMyfy~2<0vH=KQMN%)b>TR)XWdq| z`J+U;?C8v!xWDOzhwxbb?ypoU?QXCb4`Bs`Qx zSIP-9Y}`{{qfYU%+|c`83_ajf+vAGCEhGcC)}qyeS01l6lA&>XF`_mZt&KH}lZq$W zIQWC5x5mq|Vc}>|w@PTQM5VW9=EjQoADb#ueIhD&>A@4MmphW}EKjE1w=o}xG1AzHrs`#WX)_LvMl3hQW92p2UyZqy-5987%DT5qX+~eyhUFfIf>pZu)Nh7tR98W4 z_wDIc8Po^=_P_DB)hFvk%S=CpB=!en%)q#XG0RIb)y5b@Zr;QrdL>vg%*PJ4lwf>k zDdf_U>Pvj)qY+Cxk*nw$oZyN2y4sTVpd~Cw@T&I)Nsy(sVb3VYUPpT9 z!#`-ilMu{FJ|JIGUZAwT0$(&1ZmU1?2BT$qmwo_rvdw~*YU{@bJob9bIsi*j8IKu% z@XF)xFPDVABV=h@>9+y6S3HFdfF;e0flc9oPmJ}9&o^$}^tg#$X*-vgPgM<7$8Mf5txMe6{RMU}FueC)|5nT%omop;`elP6D_ z7XWRKa*-Z>=k~$}RhH3@aO%GL8^&VV$!?348pv`!vWch4e*uqAm5+YI^PSb6IDLq5 zc`0t*xEjY#Jsj6=N1QvVGH(sUKYF7YzkO5WQPq6tqVdo$9|T1^zb`0n=t19hW26|g zL5yr4lN8{aQ7XBj>jr8%v&`=w2t>;H1GLwS2U^@O6jr9Iv*n*3r*L)8^cgK6z9k+UCA+3jYUFLZEl~>{9 z$<+#BIiB!jdhSV2I+AFR@;iP-e%v}OAv|b;L$fnoeyK?fsTkNb&=D?yZaf%VG`N!{ zo%RbJJ>$7x4?sP8k0brIo6)nm5JTO~I5e=M-*!w6b;tNfBL*50vgEJXQ@zR_aO`o@ zCuK#7loS~}Ep~Rd?M;XAihoH76o@AF?8AtG@&s!!5^zc^3fhj84VJljIk9L)N%16G z%3d~@ptLZtr?fnK`7Nwe9>hu6sO-8$N#q1i@`DE6ldlyY0r{bU`aO!Jls@tzUnmAA z@%gHaGR*P}Jl&Xl0NYYxPtFaxHR?Pgjp79Lb9fS~yXcdz5B?a7G=B&Uf4N4hIBM%N}p@hUkF-EaPaRwg>Gc=GcWwl-kXPN zdnlNs!*E6&fe#wEGBM)>R&XQ_(4?S}7yA)0vEj=x-W=edjO_7)(Fa@$a|`y)psaYn z!9Ut1d-Aat9(YiIF^2ljr^q2Afo5Zaj> z*r=_#XW0oTh^qINx^{w2fa)RzP|eEYd-P#SAXSK zUGG#9{3DOcmoMA<=KQ&HngF~T$25tYnVpR%AAihy>rtK1PyhSv-}xPHQvNHy_N(#o zi!bTJ-6sOn+uV z#3Y_DfMtH*U}-i>lv#d6+hf@<1`yIv27ZM1seNIz~&4%@)>FwK!JM+8o``>so zmgoZ@b=^>T3j?4k zB)mk`o@EsFIY9f-_#}xgp-It*7#nz6&pG@t1w~ zU=W2+f5)TGW1q^P2zu5#!X?|f6c6t{P%@s_fIzzSx#;R`#4d+-;PES2U16_4wK;V} zMNxS$%1JiyQKQn+5X~6zlpc>jjC{>G=gnS+>=&qph&4s{^+WIr2TQwmmANEvssaoR zd`M9nO$Ug8XGZVTmsCoPCQ8nPTRdl6_lE@W8xO;66@qbHd~7iu@gV{_X$-5HQMc+b z(BBi2V4ZmH zRqxqnOij7g6Kl;~$=hvlzb97I$NOu&Dhcv*EBe)@cU1N*^^t?)c%}0(XCpX73^sD` z*4X$&OiqkSuJ6PoUd^HfZ>I5y5n7aFGzVbdX-=C`o7I(V0T^fAdi!Gh)^Gl2_Lc(| zWAgmcs??ZuuT`fb5Ld%9UA(c^s@fs4h=U5)UlX~i(Jz{+=VtfG zs1F^B(+78=ruMa|c1Jy7$n#bnk|SH|+rms+Qgx`GQMJ8&b<0bak5D?^?44=Jt7;65^m|$BhS@#CcHH-8HOJm z3c^PWjAZPgn{*X8NE4vt2rX?!_a6szvn!Xcxi8>3&9Z0kA*cDcg&Y7E@)y2si(fX1 z!Wg~dRAx&A-P?Oi|1j$Dj2?pb9l8Si;V=t4+!&vsjFkzDj~FBxlD&+J=#>EI@hY{x zR=c~Z0S{IT#OM${s7>SL8f`#%uyh$3Fj(;+89fv|gz>^&exd=y*#i(hL1)?ncvn1C zI=yFXL8pK&`m#>oRSHh8lH`uxKW ztK4Y}qHgj^kg2IdrUhMw4~ls2Q%E1Cr?}`!i_*dRHNN3_iHA-;ZG?oIb8fX2)qni1{+h2!S-ApGTIIbQjh`;PQH<{;{dy6J?R6rdeB zq{RO=-ZK82pbYt4hW+Av66nNZ*o!Q$)&cxRe;CI1z`l6y10W%OzLua8zi|aATIA%A z1P^*HBP{bA2ImHup&Yjph?>Lmb-(<|d1h!ob0b7BsGN0v&hg6WizJ^7NDO2Ixn|15 z6_BF>d-B%MzhI>>z@89()`Wq$8j!)sK%9(x>79R?Jmg7>jebQ~`bo*(oR8}6T8#Cr#o?h= zOb)c-z)($-ZYeYDX07;4mK(aS)j13#DPlh1R znb?rxhIgNhEmBYj&x&eF%V)r3)I#Y(iLmMa2y43QpI z=__C#<8L&}f+?px|Rvfj{KMm*=(BbuZ7s(8Cvh=)jnD_%KVE zcBJGkJ3fjvSB#E)F^5;&V-RDqf|AYT03aUTA>@H^iug<3>ZD(c~uhzyjf^h zc>`@8Y4{V)Huc48~|A+sb>Om6;P0)V&lb^&N z{Qfs$cm(4phQGS{Np~zSu4q!%kgTYBBFGYTCg*C&_C$b3>>oBeea9yq(gvwF40G_v z{Y!C@0ULg#Ne8^Udi9F%4W@~UIw9>8&rRx+urZc`t8L(A!LqBB=BoP&KlU)A%`Pm? z$F=KM;^4%TjmB(Z@1<6vrJ{B#31r*R2Uj-ZTi<>ydGvM-MYsAmlA%|9&HYlH4PN>1 z2&KZ{@mt?niiMHm#?z_|M^|kib_dvFiHQz1pkL}HDqFhRXs3Vv(4c>mmv(Kh2y8nF zvY}7C8zop-3sOHz`z94}dYGUm+PW0B+p9Rtsg<@ELIgxkJatye$IFd{kG#6XXJPR_ z=ZOpykGn+6E}0-36%n#6Yzi+uTpxXq2K85=?Sqq#B|<8k;X^<$lBsOG!s89X3Im2c z``DC_eQ0;ox2p=@RG7UD`-GPqg=1?&9_3 z?uL>|w%~C{K6uXI-KYFGY{N!7yVWbN?1{43RGB5$`!Ff6a8b5vcCF5b=)rQ7G z0536Nv7WKKx)z+6iWgz6J|KQ-{MtaCt&4U=7G69@d%EDel&A~lz(q^ zJF4(m`EfYP@-l~pwIo|OETqfE!yUD|9@T-pq*MkDSgQ4MpcZ^o+gBB_ioiOZ%0U0z z=Je;laJCi)G%g{Z8IKqv*_MEV8rTC6xkz14Nal}>3`)0PoJsvioDd&UyHllEj#!rL z0|Z~Z__p}7YaVWtxUCtjP*)P{0l0+9D zOQDCl?a{OM+Ed>~Ml!C!1Nsg$FussKG*J#48u{?3_bkh$4CqtnS@8O;i*LmbfA9m< z!KC^}@>)lCLyofL1@&32H=;}JZfImgJZ#yph%t>1WQ>2_5=8mJlUlVqW@k4w?ukyx zv&PU=Xb6q>uSJaXFZrV&<4IR#E9REe7e*h7!JgX|X~RPU(!*9`Zf;g_Qr%*l8yg$Z zn7wS;_>hGTH9pSC_^FIk93QC|Kk%4e7ynpgk@l3NKGMf-bP@PL`PpU!gDw2RD9uN1 z@Y_HyTztqQjOIo?FE4Shi1L&C;lt^|W+RSIbjACZS7T-I!#I2HiMTbl9Y;piVr_RQ zUVL{m{@tt6htNBP7pDU^FPd@zHeM-H>MlR0xzRptnkWPl7osw>!~K-*9{_%>xS%0> zvTLW|zJ&T7DCkT85;Nys$n=zH>5P}-9;_V#_epCgy~|kv8OJ?9SSg}Ar7D6) z$Ip2x+>iQWI*M@OTlpoNXWjE`db33Ei{i&Uki)p6TZtin<4%-J8LFJ#5>Bc`j_*%R(a8v%}eE4O^kxOwLl;d>1&%izPRmP_< zl$$IS+ij4mCJ6W7AyPM3C+Qg}Ns=T~YcIX{msfUa30>tZZ!ql9UYHEUBG6yap_ zoQlxjc*QEe&Xdb6QUDs|Vzxvq_ zAv`_|LlXl?A#ao$8((zw@+1KYqK$u2Bv5crvM@ri*9{5^$^=S;aSD8|AH`*98p<<< zsyuKJ&r459uV)*^gwtOj^>aM^w|5?V6rki_IJEIlalwIi8ww}%@}BT*3~Bn=sD?tR zd*c%t(pX^@PA_*+f9E|_1idJKxqP0GDlYr0up9&s z;!rktfWpj|ck)XIXQZVrD4x_W3a^bz(5pO&L*CHHvdY1MAsbTcwZ#{7@&m8(qui!b z<#xG54tV)tMB+y{d9YKbDau{?u$x8W|pOUE?)DI6(O@kns#Xv<-}Z)CXU}F$TeJmdEmSAEOntruM;) zZi`Vb8JlTyR#cUS_DLH7GVM10=^i>)#2Ze^WP;?4;DwA0#aZfw7X;-Z|3?3S`xHOC z;%GnL`qsDN)alc4=FI7M=k0f5c4j&bA3b8Pz?qrZxO(YI)CcN5-58_TwQD!x#K{xR z8z8U4M~?XLkhE{7+Jx#BBOMvQ4~}5wE@eTHLyME1rDn zNiVy)aN$C{_14?=?8J)`PZi3{5hxAal! zkMuyAgs>El$xEs;fH)X@F=B#`wu2${(9|K<^?>?>jqu$)u2c4E8yy-}JoYtPi%XY2 zP`lcQ^JmUSPhZ9DrBNS0 zVNNe#w`gNBj7MHY^^iObm7nrbM|V1pH%!)v58XS+Q6W(b6^^oVP)7nyoFjShaj-%K>nVma6%LO*_TAzTkIF9NjV9-k zm0jI<9I}5O{Zf5wYe{)28S)91?<#*?z2~9FPoXpZnhl_)7q3OeYk0K2NQ2ZpKb1{* zy?3AZMcs$eX{0Fn8R>Pc4ygciK#RY;iodm}_==0Cpne?wLK#}f65`<@NXyK zxT@bfmv5^nZL2@jm9zRqLu1)aw`A{n4Awc+XxFQ}*-B$gvdFrC|jGu}mz%$SNSNuY3c~4-yBG0ZKJfhhrml|ZRHN{oG z*;JM8*PY#`!pPTdkbIU8sv9z$L`tFJGiQyPfJy#{W_y7YP zv@Vs-^neGsndK{2fGgf!c#b1)`6ybiazIp)y(~*cFJmmlfQqLg;{#(N`@5MH`nV7ycZTZeNAINV$ z&T!xhA9(J}-ErCZIK?L!jDuxN&-Lh7~HWX#0l{-6EcA86cr)2AGx&v=Cb-Bmc?8+qZGO8gP=i?Y{jRLkR8%ie#CsdIN` z-8MEi*bZf0btk=4c@GcPVjkn&=A9Viz!l-{tI=k9VxXaMxw#VuC+kY9@u^>JWN5$! z;t5XlReTP=L6^nw%Yj?yQ~>;=Tzp_d4}m-IXIHw`jCk5#@3(%z2W%DGao~%MqiRFw zJ?N(Nvw{A>Vk{O0kZ2Bp-hkSJu@+s(t3vcj3{<|787c$1@JBZ`;()~AcDH1h<|9M( zN~~-)6uubWUJ;-EKh*u#lk7=$-wB?G%*YU_<<+WmbyX{Lqsak441u2A;ZiJTjkGaa zquCmE=8aF}`~}#TdD++HzOArbKJ1K93_t;bV50@P8(r1aRo$i4)iQ71)R_^Hkr5gD z{e1oBaep@}Z*?_*vE4bDzi|J#IDY)NI(~jG=qEj>37PmMBGQvVe0<^^IQ|ac1R8rC z4}Z)Q&~?*dL7xbJ9Mx_ma|C638Olfu3dr`@!upx#INsyYf&8v;j)s}-xI4{c&p~Y> zYZRgA2S)JNIRz}g^Bjkh-2Uf+3Xmga#3vxg-sLoo2Q%+Z^7sM( z&NA;uP)g7=@S~P*-sE&jW~L2rcwS_|90kJz$R>biet>eA?Dkg)Cua5pcuLwM=g*@J zzf6DmIqt^$@qCu;$DkZFKk4T&@H#@717*iDlmqH ziz>7+cV%*q;sqrcTRE8|@F3(M(4;f=82nk~kZ>RzAe0d=1AZt=5Il$n{Rkh3DJZ}4 z7FC21R#)-I>O2c=`a{@)WeBNkdq8PqJc2Cr@jw@}JD%)bU8wvRi`@F+hu`6!Xh|1E zNSIL^qT)w+k}m`%3wCl!xFrZmC`PHl7Fg`04Ng|fQEtu)g1(q{q)9KU_yE(c@*-W4 zVt!_Rfg3yg01&*%FJTZo`Eu@yH6&0X{E;{K#pI2!Ij{Z-PC|l|AKb`C68am2m+*?6 zazH^tc$8ND$}T}0ejx0zB80=PSq(}4I0J|Bp`1yVGJa}-OI3tMeb?pSH6Kk}bx<>70(ZxL1;CIL)@m^`3B#2?yOF@c@K z)XA^7lk#7bF*vgV6y+`3)B*SlaH$C`p1eUX%1i1$TevB2G17QRn~4gmBw3Zfjf1?S zNMq78H$Ur15DKu>hnm>jzvn!nEafXaf;xwIa~2=MI`x8y1$1#v->08^;<6%7Z1qLa z_r~k5JFma?&2N|&_wL-YpuTc?#pm{MXg3#VaCYA9TQ{w|JuP?F2kMp{YQv2iH>@<| zQWYjj@G>jQ0m5+RAltC7UA-D#`N~(~!o`d6umAPGim!kD>#7S$sSZs)|M}0|XRu;` zt<|KEC&MV|rZi!>eC0}tLnTaQ4LU=i1 z;E?kWYcbYm)tB5^0Z1KiuwCJp6^+U)xRehyg0Pc34r8*O z#(l<+v2prS#xEH%$Kj{TQ2eg+Tm=|U*=}#MI#3u^mZC6L9i)1x;_yLZLW%VI-I&n0 zXhpMp$7Y{BQg-<0x}-`H+`p9*6+7{LtN_CVb!#&}vKj|y34I#Pr_ z+?Sf{>E$ZFaG7fv~0u2FvcKO7#>N+q+KwsS)ohcCO|Hv zJ)l&xQdD7Q)b4O+8*Tnzi>!hCGdDM-b~hfUmX}4-p%uMNjTc;)#fK^tNSt0;)|h!g z<4ZesBu{a^=iSvc_qC!trO!C4d>~IiKXr{pfr6FtX)0aD#VjKdmK_ktb|`wG1(}uh z)b6s1I32S=e&PL;Xz~h1<%#%=AAB_2-xq(?uK9q?8K9fntf*G`cnm*^_F*OFrt2#E zp=5%!xOj0^^|BsQ&9?f5vDn_9h<88Ui+7_H2g<8Q6WUNJNPb+N(34+nlJWe05{&#x zfn?>)4|Y)MQ4=xx?1>vNas#sYc|f0SWW_@y%))viWOvdk(jA3A_GGK;Idxoi4~=%0 zkJ3u+l%mXxPe5NYLQ;m~?}k#u&j8r<2Mv15Px>jtiHQFf2bK75Z;yEQ892@-!eqCy zol*iQ5lbA{^&H1}+%1=2#x*i!DZK2KtQyN&*Qq5=`Db8KoRw`Q1;0796uKdZYM@Q21Pt~p1`p4tor5_H$<~bChS^W#%?Jf+GB9%p4ATVIUY}evhCCYj^DOV^GD*!PU9S z*{cg^zktg}ywp3B4o_~t<5hlymk^E{6Bz_h@Y$^=H?|jHm%Hq28?woY2^58FO&aV* zJq}`etP_huP4pEJnDjG&1Sf1n=te03py)$U0zZ>-6vpw7 z;Ge=~WmbN`k0J~7DQ*I`2eQ45!IJ}~QOb}e6OR2oP2^y=%9Ag!Y}-MY>U5xAlN<^7 z@Bn24f+g8}OizL8*i?i8Oc^Xy}@B#135utAv4m6lSah;J|MtL`;w_T)N;@f2{7K49F9g zQ$QbiXYz#bi$WF}*aD1@3_d1z2;M%6kvb}WlyT;{{9Q7_kyf>(1IgimCz7gXC{j_% zqPRn0c>dfu;ht35-1?WcqS21P!4~mbw{E)Lvb}ao6CjtF@=BV7OJ%PKrfBC2eiE#Q z-bVd{Kl_1|q%Xhxa-2GI%Bu=L{^(=p<;pWxoF9~m^K+ESVs1^B{_1Ry@)^sJHM-M5w;@;-CFr{#pFq@BN;H_>1vB{oxv~*M4jit8o!In0@TAPWZ zgDnk)DC3j{g}_B4{hf&Vl88T4xJRlh>OTj3tb-O)qD`X3A96-wRWb{THH9A>iVtchT=2k=2OLMyKp{Uy zn#1_y_HL}Mv(ifVI0sY7Qipxa$^M4;G!ZKo&cyHhXBXnkxeM;ExCDVqP&n#>%Ou(d zqE{(4)SuLwHPMpZC)5ERs=N``Xu}*6h*F6$5!#v!^>wOKe7tP1U0P|Pvqkw=Q+VVd zve}wc-4a!-#zIztLe9fu^)om5@3r@eF}LS2idATgmndrKQ#pU`^zyP-n4zFsSkxG+ zv5`wPZr;AHewwk2GaJQ!(ZG01dPxQoAKalJBdAzxN1jrMiuj~g%W!gKhX7?l2*ysz z6+7FBkHiP$2;7j5kcFUSb9+a$Fve@#P+IA>c0Twexv$TvYn3N<#y0N|Q2iiZjPqGB z3-5UN*k~TfjvvQUu!6B88c^I>mJ&{Xj8+&QDWm$s2fvR#`Xqk%!ykCuL;32Q=zn&0 zN_M}dQE%eBDupBvp3vjMqzY#A!|9osH?&ZrG-<2jSU!ieIwB&v5hCS;o>C&WBt=WZN#`v3{v=ETHq)n6*%tyvf!}-5Pp~VKCQSm4R2Dj0eUYFBD#L7&WdZ(#rGz_yd_P3wnCVH01C(Eg+i)0$|7y z_w0xB6XAYE$aDdpho_v*FH5f=brh#;mU&VJS8P3>TM#=VoymwMODGT}e6gi>XuqTkl*AxA zNaqCmobP1{X!raJ^Dk)N-G&tnprr^4|rK6gy}d+n-v!*yBZUXs5Kg%i+42fK~UvF z0lwy=5G4-6EjJLd0HsPbV^lzMLFx?R~*p~s~RPIn?IVM;#&y# znLp5HWt@avc#Yy}es0Dq1DGsX@KP8AVuZRJ40 z$JsE%;p;WHP~IGBvWq|E#JP)nWv3j#W%`s(T0NN*b@-D@R_C?%_e5*cTUShKFU8UKS;LA!kw%ZU6*DO=%%hwo+@N`41ZY}u)VeI^bq1vB4T%1${#oo)?9O-Ll0;EeP5H5 zmtT5G>F&ps%a`Kx*)zs-^TtgpX4(2ndaDoC;wL}(as2JS{kL7_rb)O^__6Bp)aex~ zPjP25m3ai92&Ei8`rw23{`bEh|MZ{!Q%~Ifum9|y#karx?fCMSzwAj0lh=R$@Bcu& zQ(e@g6@@Kzok<}RE-Sy4D*R-{5CpJ_lvRiDgB7SK9d6vX9v3fMjI-y?ng&nS)E1b; zz!PX=LhJS;Cc33-B8WTnh=&R0`Z_C2wyXd}Af9f^@oBudp~>Ci zX^C8H4^v*}FC=A@+KIQQYS!?vcWh>CsHY+M;=T~9r(>&&=tVuovniXUNg&Cq8 zT=H z(%p5M!G$7XIOI}f(cOt?%p}E~_~aXhQPv5MfmMa9;3ID+=)_+&R=J57J><*$hnNFa z1g6`i)6K=Asl63LRyvaJi79V?9{S8gGNX`kr`-%$v4~tiTW797`ZA{{HU7^}#rc)F zxO}!1oqi=IDJSKBucOwX@}pncKRAl1#y~7;XdLXs3`#GR^-%paTT$71%huqQSG-nZ zuicRhA^AXUVQ-I*NQ|j!)9McBTgS)wXr*!03T64LAEBt}+ffX06bYm$a47#o}PEy=9>L$SKI z%Q!VqX;rPzL}}V=s!bfK?^XG=d`=u=1S=kuzJRk?8B5)FsxG4V;zJ9~3U`_vADK8~ znEE?4JtMpLA--`u24MQ_a!2thuhiHs_u#KMJ4n(A_v}a zv0bl_%V;-^mSmdlAa32h6+iy-AIGD$HOn{S8k?yR)OE%{wnsA#F~%@iXQd!x82seO zk1^#Bh1-tW&M<^WW30y`<%O}p<0EZFV=a9!t1nT+`Qx5wLT+Iv0`k)P@4xRGfGHE= zQEudoJfHwcN19K+f+Uotd zcH>Tb3t!b1rUkH2=wH*;Ntl_T&WsAhNp!!Vc<{6*a;W?jA(uuJOwA5 zBr4@-+i^TOp_3qoJuwKLB_jFB;Ywa3$YuKf$B?!FLwL@BGbT9hMqW;``&~b-AUxSk zPX6bZRp9Jz3NTHG84$OW9^0NE7SDnIJQ z2qix}xxkLYC}08DOE^c6@jUHOoLsj?^$Ng_pRBnWXA%W zMt;xsB5paH;kZ8_yJ?eq*%=r`mnGBY=>AD@o`AxAged#V#Ol|=VtfTow-w@0Ho1%( zSb#hBZ05Kn`zWk{=!Ltc462^^*)fGh>IF!X8Hguj42*KOpB_)XFnJJql9?|3ki9Qq zaEJmBKiRGPJ1FcZ{xrcMjJIVes02|4cm%NnN$yPC!H-awgfj&aZ5C+ch7j$qy9j1V z8)4fDANgZ?n}y<_&_FmKoF_rWq%fc3XW>c$87qYlvX~&|8&**y@t)isw<*$NGC(#( zxx<170U5w<1)=>C-?Q)xm`>$^B1lS?B-oLE1#+DH#XIFgxn-iJ5MXnDjf?QStBeSa z3;e*88}ah?XcT9BLG}57vir-d@?>Qxm=!N=k?kafiY7TIrM%KWexyrXVOZj8GYTFA zLumCXKIfV9;?mY%cut;q`oe+W*Hd|;P-6lGq`Vi~gY^(UZTsz5K}UIw$&FQdH73YK zd4U@x74_R+`;`w?zpXu5i_P_QHx23r7kyAKP=2whk~8ks*B&|jw8D)tt9Vr)69a^2 zR-nyj0>i36>IIj6+`e;1akwPozzQyePK0ZOY`(g~4=#T=bLx!qva`<(mrO{wMHeL- zs|b{ignI1c0iGP`K{*PKQHg zGyABclsB|+fH@}gQTG7&S<(E%AO6s119Axa+}uJ8 zs*PB^cSCt-Y68HvA{6j$FvhtI6fYp_Ng1DYSL%qhf zOAat^2M58kf)=3OP(IWNCUMlmnHkOmJS9BP(iI)btICSHhB9D$>@YTWEAhwQy%ukO za6Ps*dR~>lN={bB`J6V<&O_X^>P>CHhw2fAvmTDH{CW=$aE4Bjd69M!pU4meFAy0!Ui7e4<4X&bKj(Pt0I7PRG&25pyZO7E~!Wz z4ii0iMDM`6`z?d|F>v9B6X8*Q(YKnZb~G+Bj8i&%Klhm_ar7R>QBQu{<3ZY#N1_`X z^qlIWz%6>c$`C-oN1BOH3Q|Lq5b8lmJYj*d4IgRT zq7HD82xkDYWm0?us*39s?_5N}*y1c`lFAVbOypT=sk*DeG)+~}$eC}xC}Xg#z$hSl z!q*VlaojXs4}VYwek~%?@>F3y*(@9Du=sCA=*>l$JSlkMKdfA zfnv4BE%3=+Vbz|XGCmcR?z+YU@yBC{>Z|Y%akti4G&nC?!p)X)jz-XU#43K2f7BQF zFL#gYC>O2B60al!IB^)F3dI)aBl1F6g-YY1vQt&s@Um8op2BYKcH`##t@y>&?bzID z$NjZUwSDzb>YJ;QGny@p7u8yHdmXQMt5i5YupN`lS`1XK-2;WGs~-{WwrE1(j?$(p z-m{t$r4Vw@zbynU?`pWN!j+DAKg`7(~jnJHBK+hY8;x5z1_C^&(`FG#4K>Dq=eQVKvX|D zngyAHvHwVQVM2XGpAWGpDXV-;RX!+tl^-VgwNgbg8>`Kzg82i1psU0B_Zfh>Od!3Jh|Wt92_wL z4Qv;;te}3EGC^+PhJ08@m2B@P`2__OAIr!K%?}z4ppB3A4nse3r!j*n3KD=Dyy$~@4Zjs zM;gn1@y^?prI063nB|quj77+zjLq;JSpgY{BT9DnP~uZ*_=xMuBzFysZ*ykW*)}rGpAy8^?}>M;^MMon@6#+Gl-?RhRTPF-KKoA?*+*ad*US*%n+9I zj9KZ;I94C$rg~)ObdFy-lMsca_#*m|JzYh_ZVCko-+kx3SX!JHulb;z@A zrx@hb{bx>}w&EDh^Y0xA3JZ_=DqG5)m8Nc&N(=s@5ah@YR$adR?%S3*c6T;i7m+u1 zcems2+90l7eW3nmF78!kW0i6jjULaSl}g0J3zY^?5a)v@6-|P|`?DYq*Rvcc1>{%7 zSXc_PY=0WKk`<4`>Bso-D;}VXBfDkb9slx^4da$=6h~!T*j$GB0m||H$fNxJM1&M6 zIm>Q8KrWfjehTNO0sf;fSW0-xk^QQlRFF^F^ONZq(UWnNfO!8u0#bf_1|V-`6Uek> zx9nc_r}X@uI<+UlxWM$dA`)0nE__~r!r3r#FRBFZquNoJPlV;Ah?M;uUN5}oN-&B; zI6V$iIAY|uIb0cXBRUSLA53tP|B0Z4azihJX-!rGc7lB#-t3nvSLW|1az=RE{kUH? z%l;Y4_LHE%V?M)FndWf`Kjl9%^8?=FW`?pI;QjdX%OHmVcZTd%;K+0t3bzs9kD)N| zHS@Ooj@{_}BZK$SlYyxI$rT1W{+Q(lDEypGe$@}bGs;m=S?r%)9WH~d{Nw;dAmR}2 zc;0hQTGCfH%uk>zH!V7{Avl0}3IAKS@ z=djq*yH`k{*t44^MG}mB6Cz;|tTb^LBJ83F1Xpgz`j^P;!Lci$fbFd){~#Yh4k6q{ zt2{ed#X~v83M~eH1QYBC2`Il1DiAIZyaotP)ucq?0UvqItI-fTQ1T({S>Y#P0)Yg9 z6TyNo2y$702yVIyXazrt5`+?L4FW8d7ulPS%?#Ftr(I!^jj%PQ3#UY zpLl?hXp*n1<7u@eTYQ_XhIwMz%$xKDnD@TRD$(aWn1-sAH-s^-MNh}#B?O!kM7hBK`}ZFh-{Rte1!oj66B1AnmJtBSC-GUq zIID>Uf+TsGnVh!r2PG+jHuRyiMCr$>KX|mWwG;Or+;^RVe{Ag}FDR$HNx8&|J;g7@J5eb;kV#N{o` zZu!E;Y82`=D-Pa!_uXiBJ63EORAA(hvw;5OKmAGk^}qhtt$2OojW>MeAS)nf&x&|LfxdUpupSR+w;Vde8GFlh6peGwcN4jIHJPiZxpoEctR&r~i-L!N19p|RjC13bJDilK*S zEZnjqxJHh8QUtvcR(84Bi67(D0}OIqmlyq8@}_-P^}=dBR?m4Ga`uzy zcUIkrc}ZC)d`?U0G9IytZYV$U!%9QFlfU7S`d5_)VN+jBS}4FURrZ~(+)$b*yl@Ut z;*h|B!Vcx9cIYj`WJY5ctMkk%hO>$$!9%?dP`;tyQ#vRkhpH1WjE)TLqUb{zrPgca z@DVIHbM8>|RZ!5T6?7gup@qCr24r00sQX3Gf**giU6|`}igW!$5a$Rw@BRJ6W95-? z8B&Milj1G(vjVWC@QO!z>b6`yW8>hwMTJt zbuU&QwWHHjdsI1A<1iMdi&e9dD_RZ3t*~;oqqYi5YF5CY%bXBDxaep&Jg@?Zj|_u; zFX}aNs4^1`tl);PX_c6GDEjJ(>()pasLf2s-z(qAwrC%dK;p|UR3@xe@2jqEbdF;6 zVJ|+o+m2scKa87e1LZ?93d&M=t-ip#Q5|PHy3;}-O!>kJ>glkjSD2$P^7r|UHTC^X z6i)}SwYC}`zI7|!y}lOxgSPs>g=mU66wI83$TsMq+Q^u2vYm9`ZNu`17aB`dGfWHJ z0LORq)s}{1d=OzAPkjXnO$hR3Y^-wAc)&*%j%r{mbRcnu=0+dEd3@}mfL_K^>ihow zuKidg*Xwb%U^+wBG6y_WSXK}c59JdWNgo9n%HdoV$TW#LD9V&hkFhD;cnckrrxkXv z3?ydbz0&-%07frRh{WyJUMRj8@ z*4N~=yzIKYFh3jT&rQeT{E|POa+5L&cXmGT0Tu-_A91;KM@=s}9nNk(j02ReuB)&B z-f;0+Di=OFqNHTyEpp?VZ@y_ciw}v&P<+^ikK`MLF|r>#yn6kbKO{013$5z|=h^#oQri#N*AJMX+5XV0Fs3;-Y44&7<*#n$d1UVr;gZF*1L`Aj^l zw&Je)MgI#(O^@hE_5!jMGO`y>ij<%f-0pfnV`t(OZlieR_~p16U}}zINc|E0kRRfJ zm#T?9$eIte=4s9skMz?503%J}Cf?Lk>}f{C?cM$j9RvD4?gO zRN<>TxKgB1_~PL`dyn2_$?lju-~w>V4^WOzy4it(2M?W**Zodp?=7kE-P{#QLl57W#hsp0bOxd6JvRgSkP>SQuqx7En z>IXL<`(w?G4Zw}}BJRljB*t70kY3( zrS$cg)lI(Cf;bAt*H-w%xjT{)94{#ig-mHODM9goAj%e11O)&^T2jcNSV1X=i4cbJ zCMmMU70<#8R0|gm;EA@m5{znq|R-7 zoGplwEM2xSK92vmCQM1#OhP9Uj-=!wU7jq|VMj5Q`Gf)p+X_@??N5 zPn^3)8IwPFN}PrHIa-f|>iwAWjlxWXP(F(nnxt^6F!@J83BRZxD_?pgxE=6c{>y(6r&dnIi!Z$3JhRdbcNAKa$}dX1-JR`d zi~sA79(mgi`DT>{7kRLa3w{$XUBr^M@uE0IdHLYMYJBqX$FZ!5#Pcsa@6`+Mz4M;K zaAu!Z4JsZh7vKEZTk+ycFC|5}XomZg&l_+2G^Rxh_)rjj`2GhH-p`nK?Q5~Kv*B{>bgS{&kG>a|pM6I4l2yfFI+;jpY;O7^0A-Q+ z#ze{!Gx5WR$!j7--bt4~3ksro(3(@{RgaMzn{i9k%M6XFWW z33)RyNBKe;cF@?t`E3=|^@{j6tg<3+EQaElDzE|+$|<(GieF5?fwZbpeD)St^=HJ1 zu28b_4x%+Kl5tHmqbGM(Gr~6}PomG4uP9A*h$2OP&_mfkmc~kWjnW|9@b6w)ZNBUInN+ZbcvpTFU^0l8K^<@+3{=GnK#k=el^H%u^Oamm|D_ zR^`R@QFdiA)gNV+@`KN`5skalfrCLUHunzW&RQp~-`R{0@3rHd8+&noV=o?Ua=C!U zLX|Be4t>PTBp;iERcSRFZ2PT8UG!AP3&o1kJ`&-R4bdY4R1#5F+BKEC$9VCIa~LNZ z<31lyL#D@~T8-6pgV^sJ#-p8ntgiRt_WEJGb#*^JxvTd6@G#bP2hrv-4i4UfA4@W$S3>c2Oa0TDk^Yx8DgQH!YF20Ai&m`GghMB2#Izi(;tpA1;(^fH|NeGryzIu5-t6C#{_hOO*~~=EFWQ5ZH-LA3PKR1OVrY;FXT4*1#a`Fj<^7* z!zzF1W2|9(?}JCQa|BGU%huAa#-%BBTdbl#bRSPM_ih2nYH6jKRd4Rk!P`I7oBDKC zD?$g&k1-JWu8+*9_V2z>K)=B_4<70x3RPs!BejLRN)Ya!Q-*%c@n0E2P715gHFh1PTHr6*b ztPJe7yJ|0@wl|PW&2c52xVs_RCBGbW_w=5&@KUyv0p*Gb9#(pyp#AjPwde@<<;xc} zZtnOa8vNsf8s&>(Rz)B8?%nh4|Huv0D;S!_FKVekRuuJ?*;Qun8f9y*+jjo>K>nWO zhn3|e%X4gdURgdRxvU#&o9Zh*uEb$?EygCeM5r0}D$TeCPG+@Z8umeT12Fz@KDiA@BE1d$L$m6nG8EFysGl`Vn3tA01E^z?aq2HCZaL3FQ zI+y(@4Z_M`wqbvm<^s@@A=@!?eBxz>>lrnY!UW9!V{u0B+5UM?4hKBVFXPTo_TvGv z36$dGvT;2FO70`PWjiJhZUAPkXgRJ-N8zW4YcJdtu5il14Y(PKIN-qFbQ}Xa74GIQ zc#C+W2gvqPVxu5>_ZJ(zSn4do;pY0G2gC33X8_7LZ1=21|CkcuE%YGtqj*B-N9l&b zPyTF?@+v@y({|HDK!Ss}FtMT`KPU!^{962H*6Mdn!21$xg_8rk+XsEm!PuH{h+t+Z$%7S)dccJcm&yT}1!5(Kg4=3dA^>WtA=;@& zUZrOjy+XepD}LmP;*T%n>C3oL2yL=Ztxdo3$JbA2M<`-j2tqR#j39iWkU|*tBtz+g z-`jqeB)}WdjdFyvhfx!knG`AC5|Z=f9egb(U4&HP_a(>yNw`m2f0-;{ay}h`M;2ru z96muSD>PVW4%!h4Rl>su*K6_7bvY3bOXA<1yLVL%gZT97wYYroQatzEvzkD4;?IBd zBjZJ&2bgG}OkWVcGq0eTulC>h&UZ8kxe&AB@4WnJ6DW95L{SfEUjUbjyz;SN0Cse9LCu*XJd1BJ#JpV6MLEzlMm>nKEXR~OGYv5)t9Ohlo@%!q<^5ULl>=% zwn6!^4V#sJ+*ZuZk$at8=ZV!63-b$#qp7?43AQgSuzHX-r*TzDs81QjCpX&hgFn9- zpIo~eyP5zED^n_Ll&Wk+f6PbvT=+qKW{WD@tW>eBNP#w#wzu!xjQ{(;`EhicD-m-G zQJq+d;q*dO#;2n)g>tzTA~>y{qEBZ_mhf6x$GdPb9$EQCwL^(!x1tuxG%Wz6L4$x* zPrgWk6?Jw{+XaQZT`XAA|KlIrsoq(L*L%_3B|p(2wkeNASQ&Cs7)|(uFU@;U9$~>h z;qj#wo`maNG#HFRZVHRP6Q(g6hx&%TCYMa^QN~Qr_b^7u6NJrxhN?L&hy4tIiA$c7=n!MtoOzP2EL~{CjdoIjjEF#f|dJ zq@x&9If(}Qi7qP;yfqp-ffN66XWZphVw6(OC+>YN9NCYdCeu~69V?wmXG;xhUPZ3* z?rbP+(OqSmuG|~k60JUt4{`V(YzPn3h>pQtQUX#q465Lw>botHx?V(Wdsmiqy1~Rqt$XR>5h6QJ$1LjX5ZAy#j?YP<>=f5^_>X>6r`U zRd19d_SUElxoWHl*If_TS!?^Vj1>Amoc)t@L-r0+f@3gIu`{ZFK);72uz8m*9 z`?0&*QJX!A-F7Fo_Xe@E&zZV|=yfy}?f2x~kG=L$+*miXs|0%UNH$9ydwhE(7srbNSmLCXs>U?txvDV8$bUzK3bK-(T2yt8CFS-AtxzK z=u+$f%4tf%{R0Zqp88CUJ)+lVyAf)n6k}DJ%I!$wtaxuFf`Go0xQv;6073rY!z>Co z#!0UVBkyVpD7E;gOH6-!QCm&piPD$j{@$(?VtlaVf+qSr{E#0|@}MLl^U%T37|3v4 z35Ku~x#1ALscv~&FZ8IsTK=NGC{?FdL#|OjkD_1sgEWOm-HH4OkL<-5iV~FZ!Lkr_ zmUPs{8S4m3twd2s7~~(u4bl~J)Q6+AtHt)#UR=F-%Qq$e`Jew;+`sq0G7V4uu*-!S zHMKKnp-r@uH`q(Mj6v`yeLzfS3M0?7G`2B*Lnk*KbAea)kc(;t;z`#Z_Gag1e2fVz zseSy*cti0Uv9-0SvGPnjc)02d*N|hm&|}-X9XPZ3P~~(O%Nox%H`il9V;#I=B|G(C zLU<+{hjI7OgvS4-SJol#unU4S{E!`z9JA;=z5CvKUJc2rK4f&{QRG}!+j7Ykb&2uw z`t|Ga{0lGm_zbW7Wc*V-Pb)MjyCjpOx~E6wZ$+SJN55WdTKU$N#!T2g%gKFq4Zio6Ws=50hFsJ%RcZBm}pk3mj2O2P;!?fT}jSv*g z9Us4A0eImVc{~M-8&gOaXld{nG7cc)1+bU#=5U~rnVm=AxFwGq_lbZGG%`$Aj$@?s z8}^Z(Xa($EFfMzJ!W0khW;k(V+AhfHJQYgez)f=ph@Wvd?E(?@L`Zsw!}xiOF8Z&> zP_~!AafP@1jLIK)O1v)$?z_O5@SMB_IK$K2vS~kAOr%}Yd(J5S0I&He%Fj^7jcGgz zkQrW%mvNQjWXNgec;x_Cd2)Qx$4)PcVv3h?0cZMhc%W?0_=r){O77 zMIUv@R`5Wt9>>8f-szxlW5R<_%2U|05>O+yvWSV&5C5e6^I1UnbMQGzKnZ5P1cdlj zEFu7B`jj`w({pq*#zl*9(B}-DezXrH+<-;{ewX==m3?VDfG6)L1C?%4kfjxU2nT$r z$3&1ofIwIy4FoI{Y4+pmZXxW!XM{Hkg9_^jDWvJw0-m7NU<+s33hOPr2t5*{5H?v6 z!n>7h61@0Y%NJE}BFtsnUQH-L4MiiuAVL&huu*oT6^Dey4?z_HjKiS8$8B(REA==7 z1!WmRTwQi6EhHc|T1|f)MqqUs1#Y%#qF4bpd?QaNciQcAF^0F!DZfnm0eE(BKz&oX zN_(ur`8eajMGJ6*!80q~k`fVR3|nCiy^VBhCn?Afj-dy7GZ2mdvOrD0e4+S5IfP)x z;mv#dZHGnS3qIUgb%@~0%Dkk^h*`WP&9@bnTJjuqq9J|8CCeL)c=BfX`|)1Y7E;f*LkAHpQEHmpe4zObIbu zIvjP>_7s6S$K(VB=-D&p;t&7u58~H;?bm!Z5L=T!_~0YABQEctUcp}}dlXT!G`6pfS$ixBOt*$}hf zOeiblU-d+t9(hNZBI;C@_4vt~@5R6U>Ai@hvk`N8Ci6ufGgkNw>&>XtS?!~G;4P~t z3s6QVDasUP>zyMSxL|@w;RvjROFYX%nIX+j1z?pQWP?Wmyn+iGT`3k!h4%_JdkB>t z410iwc!3Qi9Q}VZ2C=AnOBQSxuD39y%6E0TjRi+euBJqIL zbXNRvZWkZDgmc#+O-D&F!PVf#HrvCF(i450w?|yu zdOPw{-$zDRO;0)3SZ%2K1Ff3;o72im!mc~Rb6 zAD~$L~5i&cfaw;i#y-;b@%QFKMW zM3FcY4cyG1(iANy(Z~}F&h-rCyC?A}AFQxS?L(f_Eh~KGNABz=nVwABuTH6dj#9)giXYFxj8#j<2c)WuIlrAXxz>$=b;1d5u zD`)rd?n}2c?#@ijxXm+G^HGI-b~~I~h&)6bicd0+WRrnpHa^zU_a}uMvQpy3q54OE zoK?MGrvrHSAc>L*CR)h{e^o)?9CXvyCxxSMD4p~}U4(AsPjQKo>ltz(d7`gJ`Ip=s zQGK~wls}Yj6a`=zO=0-x%5A^5Z{CSt{NnBS*-zhyTeohgSlA|xyqI_dDn4w|*TK_6 zf81uJBl$}7T9(s;%*6NuZ{Rg!9^(*so{~SS&yfwFU~YcaVUa@_hZ$=)`%a^wWDZuH zcPu-x%K_Om$&P$fWSmJKusJfMHYS-!{m0@WM|RLnCD|1Ykau{~sB!sCO>)n;F9yS( z^NSfvku$gq3m(kRN~V!JE8(HpW1DbfzO6l4kByD>_|lhN_J=yW2K1pS%iTT7G>z9h zd_3)R53JCHckm2ev^)Dg|9D05Iis47etdkTjz8Kwh>x%D#O9-&P!(5M&?gO5j$`rY zXfkfAUrmb%igt&Yi(9nNHVoOML8k_O>=BSHS&3S>IH-eX$LvuCDt~?)HrG?V*i6E~C2jK6@#mw*5{4a~CrID9625dkyD!33}aW%sf_kll<&FC_vE`L*nP z+%4k(%HcBLMwpzg_-#iD4?j9fAp6@bSx5Gh(#Yl$P)_JrfXpL)?1f3%yx?&nLIHk- z|I>n;2ss{bQpD^BWEwDJ_oMd_k1(+S*voOV9g{ExKSyb*v0`;FaANoehXffv;YKF@ zSb(C}14iy;|6dh;)p&%@X#yvuUv|?2otb}zY#BKSuoEXgxjvME_wrMM%s2D1u!E;C z65uYwL1Y<)#V)Wl@Pup?W4vgT(RtqH-E^L3sxR@icpR|b0PsqixCL)kS1&bhtX+EI8>UGt-A7v z0!~7y>#Y)Dm!q%N2ZbpXV`e365VXWg*MV6Z42!R;~Q)b(&5zz!0?#uEj^VJ z^m~%2v`7b<8ugaq>{tN@Kc>Ye&IKgD;N5R`m5*XNAx9_Ey}y zdDH$VVtA}56+Rx6PSC{}Z_q_KvSN)DeT2n-dUD$ClnE1@y`3Fz1J26Gw6XvNpeCUk z8|KI9Q>O}AsAB0$_WgVJy!sDCCUNAU^3eoH{9@(X*>mTN2S0G69MMJ;RCsXl1YUpq zlMgN;Sz2C*&CM+C#27Ah>t;uG52$tYn~mlajadkREkH zGNWlN8~mjzSN0{8Q1+7k*Y`az4?mo44aDUwI`de7Rge{nhQ;cdQgl6D#E)LT5g&YfTfEtg?x3zd14TB9uB3eP5d|(IO?EX&V+@fBn(-uEsc?F@uIv*rRzXX2r zNmwgj6o~E$obVf^pI?=(%ES32X^lCRv0haA;x%}|(~}2&&}b(GW-DctF;U~1@Qqcb z6kp}7eh0pcY4Sa+v`O7@lVWX86+q>uF$IMzp%@ogy@yiHmzyXJkDc{J5yZze##$w+ zNi8?TMr~TA#?|h=>H+5k%3u8@Ii>u4bFgn8?nKlTwzC!$+?7rR9F?ZqmRILhHKFc4 zN<88$I?-e9LJM>?=Vk7TX3{~~rwO|1oIm(+;SBWgXT>1OEcgUoJ%rJ?VxVkt!4pOd zv7(y#L>TIlQx;I42@lg86dZ)pqkqOQD>W%FgUSHJjA42+AE*Moe1LqVT1vC{SY{{k;E+cnCgT^&J>TjZN7>Q&XrVr&Iu&EFgTADwjXOO z?R56z!S$>0?(6TzkKVo;SFg7I zx{xuJK7nxwnF&Z2yz!BU51Q$NC3w@y!9(Fj#;QrqU_~QML~;&es%Sy6h%Cn0gOrW8 zyDKg-1og-tkQI*nBDYX*eT^5C4dK~Joj&G{Yy4P?)rXJbji3E2zWd$p#m{8!x3^S0 z^YZU%eCWiZ^-i=V)h`PtWd@BIuvZif`QZJSmxn zt=Qwri{cg+b-|08aIiJ_u)8h$qG+f{MoqFUvfRfXedKe0UwZLHv5oqn_8?$&sq-l~ zkW700`c2DHuYT!E${RZak}S%~URH09t37gNB=VYN6X8O3&bvO~6>`m^^-XU#roK_W ztx3k+L99LM#z)sSV@Koq)TDYQ`V8g^)D`vXn@5efQ)xwy@k{mCfT>qM`WY=waP7x< zTy7Z{Rvcbl_)@e*^vCeoX!0)tIBzn+O}i^_(T%98Bs*^T5fId*V9Fqvc~tm2ADOPi z@)VE2RC4_W) z6T-#f=y4UsxYJ4f6*T9(yPU{779O%_e|%}@vhc|1$^7U^C*S<7XCSnk-cmJB?N}D|F06Z40hv(;u4hc<;q!h%l1-~Cm@F_hX?XIP{x6!90tgh z+K+y6SXa!aL5@I}lfubufIH^{lLwlz`$=gZr>zKg zBF$yDli;|2nHK0M@yooGdk(@oUbHLRT!(SMR9xH~6${|N$!aLs9gpXPusBg?{8}J& zJu2Sy?=50f1JPn~Jd)|b&y&%lq_D6_K*z%_Kl`KXlRL^hgnz;-tk3#G`Nsr>a8>}y zpVbDqTQMlRXJQEMN!WE2cQT{{5qh9od>N=)>4swmap=I=yi{x zi-0LRXTAVT&e?WwB*6l+&vs%Ig1xlm7n4bNdNeuLU_dyOR|rv%fUto(E4Xr5A+R9` zF#$oKJ#?B(`1lHpVomwcq=7sk&?Bs%1Yp8N78zKamg0faO1pYG@5T9*8)0~Z11Q=E z!^6Y}+MGwylYmb;ebEfv>FmQanIJuAL1=_lgjMi)ykp{|a0p!F4J8z3DRRaRTQXSL zwZAVRZ!qTVB+Utg%6?4GBqd~;sE9wB_@mq!39;Z;UJ*1=4k3_Qkt087#DoSEsH`&U zihpng!43r)bV3{ageMHp2y@WL_Dd#QYikeV;p&=%(sokhYVyE?P>KJ6gw^{G9!PMM zpo>7P_z3jy0pPL?cu5|vU%PJp&M1!vy$IO|vi%-g#dc#~lPAKWFhU4tdrwz_G#5wM zO~Q04V|X#J0t{Lg<|OW zul#%V`RCnEyxKwKfN~UGK|8dfe0%rZ_qecJ!6J@}`=}hRzASRO#%9VVu65*Y< ze-W>~`c>tF^Ua3dqRr|?R+RWGOW{D-2#useo#H&ejg1W}`$&(86y-s=quleBEG8M^ z1!arE7iB6R2I@?7G$BHf*FLPq$Di)R8*i<}2iI=L>gu-Ak>Alo462i^%S=p%o}6p) zs5q>sVHK4A6^^cs2?p6q^#`317U+2UgRAjB{^@J6Kb(t->QYRdiVCZ%xb%ZBrg4%68 zDPiR=9~oHWo|vfMaxLh?$@we%oX4Zo2M?=^Tgp_?2YSU|S{9fTU=)xhv|KV`#S6m} z_()45QAOjBFU3$qE0}wo7^)v0Q~3{KPjNKS^lCxjG2Lm!vh%BYMOc)7Y}vNbbI=i8 zCPH?$Nz(pRj;x3~*iso57j;-UN4cqwIP8dSChc-MXvc7(71hp`vO|B$D!!h>S2)v; z^8isIu@zYL0tIDtLUnY|R(yqJi*kKNiPI-4oi4ZjiZ>wV1D`6Ux8cGs6pA(F2f9#L zvO;m3?fNROG1X7StHLnKk~&632bb#r#HMl^@|;0qr>kw+NA7@w$X-df7aO2ub< z7$_cn2KNd&y<$V__v9WC_z3-Pbfuz4`OE z;s@XVLHy(=ug9mKd?H@#sZCXUhAkh2r>5s)Lu1+Q&ZAg-_HRY~XjL)_t0_@lr*cGY zf>zQ&P9mLIjYTN;7?V(HaSR6+en1EE1N?3@Yx0{C50WhFbM%B~i;q~!7iBlUIB!KF z+jCJ8vO7pP>JgTXF?Dzv4XXl}8ot#ARm}K0Z;_!idetAK3%%~a; zqFHZwb>7WeH+;Mbnk(+JcoHxvcU6-$1j_00v#^WvFXfg~BGt*O+ zdxq+xk@1kj;MGWGQV#f_&*dhp)~Ea%d|Vd~kww^na{K;%e0X(TUE`MIx~lovSA4do zGc@*w&Da?<`~Mt3p7=rO(iy^_Ko6hLBqvLy&B6J)=oDoak^27GtFU~YKF}-jiWf%Jc_e=KP&T0 zEBt=0HSqgs!ZwDAhdC(TkMx9a9>tRJAH`yQ7>jaS(zAel0>xocAWo@on-pDE5{i)= z+2WFQHt3JZGdW78^TtDfGG8+|qAmK@GkP_`WPcjC42V~}7f^}+=60qdK^a%JA2%~R z&A%KDJCNOh<6%Z1M+*Nql*3Z?$16~_V*>aSF1zLM*&o0!$H&7$+T+(z+#Ci5mfc_` z_E8-CaR73pGK?bnEkO=fj+et_IR5@cfXoBGLOhZwli`<~IUwUK!*TpiAb1jTHq0km z3Wu^in;CLpXA@8uaA=Spy^kQr&$xgxzP}0pFKOqrz5wJXPe3{Tar<$|`N`=5$KCQf zAiKRXPN1-7{?pEKbVJ4gVCL}2c*4t2@^D)#$CsUf4Dh54p+|O^UbZb75Q3QCcr_ac zSz*?Sz;7iV3O)&oOma{Hvh9~}TmW*opZu9HaBh*@ zm7?-02~Cr3Pm-A6TCjy~rDyUbELrGQK7`l#2nnh3uS!_1O8{wUAepL<#mq!CrZm{k zPS#_x!QsobXcUw7x&$5$oMu~Sl`psI_>)3SkNnsk!bE>ekI$Qt8>{qCjN~GtnD~0t z@J+aU1(zTpfe3{ULLFbWIje-P!}LXb(M-ZRVkBEtycI`C*`~U)y&Lm$Ggj!bk_}#P!!28P_jY!z$U#ZT89@mCZ2ds-l(x_w z#YZ2a2pWrLpJU4@f_>r*bfCmSS%t8OQi-^;)3a6xDFFY*NjQ{T^KPw^LaCRLc+mg+>Ho%G14fck-QjY$(XR7h?n`IKRe@d^R9jTiB}hJ?$D0P?dGjp@!Nmnw>%MoPUs~+ zY|W*-C_Ct362j#xtblNRk{>G}*=GC?{=q+pN9!B$$N%Av;(z=1{;t{~ZE+Awi*xZW z{`J3&oy~PCgju0+pfX_sLc8T$DJE1*CRr&w&i0?9u5hy=g-ODU;xJ=O?SvI1oPEYi ze=rg28!F$8ZaiGwQ5)X#7PdikO6Aa!zuJ7T@`Y6-V{%IqN%{yTES~5o1e108dHR{d z16BkoE#;4T-E2$*H#mO(hp)%`H`XQnzUU}mL>_Kl|K_CJM_@g0~HCySwW3c5ybiw&M)%^1aPQJz#tFQvr(sr zBb88YxOlRS#V;7budqJ94`qe%%AGjGg)F|E$o)ud-7B1M2NcGNmVq7$gft*j?@mol z75vDz(x_^3$IjmhH=4@dN+0NSkRp!qAHz{{S-I=0usf3+J{VcA^|tEg?F+~ZbV#y-YJ zE0=`dAI``aW2oq(Z()UDuMG--FNPyYIw#@ltg^M zq(3J-AIdln@JMZ)kCMn?tOTEs9Ee}113y*mo2eb61mhiA;cKs}zDDKExWZ~i#*dop z^xvG%${BUCY8)A;Pu`A?H3qM0e7t?*mT#!=2dV|^ zUa6~Sug1*ObbR$2zZoCA_qNZ2W%X0uWkSDS*SIt_*%JLTl4r$l$rUy6nKGSQSTrA? z9R*#pRgaqbkICtXQ!A1u&Yt(Kh}YkEOG82{7CA0NWA)&Gv$Bt(G1-(1#dy_|JoJpp zfi_Wzy3f(9YFyryEHoLHE}hr7+!5`2iq9?;J_<_CRJx4MDCuT3{#({le0a63bXOld zkX+QUtiV~qeAGaGVl2mQ<*jNM^4=rK2N%v?hzl1lqz_~YgDjgA-k7PH=kbLdBBY1> z3-AHayGE2Aax-JQk9#2v)oae|ym@Cg?yo))9@Vc&+!+r!5`ZH<$VV;q4kqH0!{zwy z*ivjM(KIHif~Z}Z2slJPlE_Hys<6{MX^v%}sV9q`9Or2uo{WIBPKulDsk<0K8Fi9r zAu_#>pom*W1%Z^gdKlXu2f(g5j@;d}Q$Wss>?-`B<}wn$;z04)>2#oWaG;8JAb;GL zllaIRg*~D#B{d2jUKDIk1ju4SF>g;GwLro&-7AuM9*aoi75=phR*yPfai5%seOqen2_R zOni=)-wSY>a&w(5`Psejvom%)3jfcT1rRnvCSz1Ac;d)ts(2nOWFmlqhPFXla+-2e z$D7>fO7-qh772B-QTqX+o1-Obymv8DX-Omir%>&M;|X@SYxo)~fPRA3KW4iAqdqGCb8l88{wO zwee_9R%23Tt*%MFMky}osB7Ye(138k7flp_Y_YVd$vB5hv)YRZu(_^qDEYiKMez`R zJgJ9=MOm_4lr1zqG+X)eQg`|>`IWmNlt0ADtI|+J`H*F$#rwelNnus$P2?O+cglh5-py{fvc2h+)-#@qG095 zxsA=^1}<-rn7dwMT1739K@Pmk%V^@->^A_24i0 zLCJ^mk24ORdFC18z>mDKW%I`ETdpTBKL5O$i9||~3O?w3>#aBAnP;Di^XJaE4uFsP z!NleJKlpxp`*(j=!Yuhq{Gx8|?(WCUn>XUsFTa{-AP@302MYe8%q4tQ{$Xb&O;>4B z)+l;E`sl;>&wk@K@Qt6n@n)PodoC_Y;Ae|3Wyi{fdw1@{=H|B2`jS@?AY8rs-n)qw z;XZfaf>#r=H5g?ef;|HDhWO9++~573zv(aYKY#1zp4h$o;!B=jp;&zXgZJaP=braD zfPdq+e#?2!d;@q#;L3Ty9e?ZqCaV(u;D7pq_{abFADjRG>RdaMR}vNGzsM+0mlm* z9*)P|wT>n(`>~}mKcFpXqFHavXhJC(YivE|21F+DR^|B}ezIzYagHrX2(wI{>Z9}8 zl5&7m8OS-DQ^myf^`E^PKYIPmIBLvCES`%>Ygy9tObq9*c*4%b3&SbS{bQS{^48L% z=tz^eDUr=Yb3*OhD`1%XE1hxG2D)x^7)sCW4_;b+QqpSk9s(3B&m{~v(z#%&4xl8Y zX1TA!oj8cvY=PCQ{$(dG$}iC~(&Xg2<&}l~ln7m-*k!P?Lm2oqU;znTq)a9z)I)|y z^G^Or7#BsxA-fTZ9<+;+*sWN~ejrgin?wKyAC<&=uX0Bjrs!-{bsXiXD*Mq;{aHs16#do4Z(;#{D zl-`8WQyd=kr)ldbxb}q>X6RAfL)mf^8b2#4>+Y7uOI8r-b#F~|L-kjEI!Z`oFNU2R zp)hsMpU>V!G3a_OI|b0*j6lK6GSS|4!4IWXS3P5e-@%^zC*`hsbI2;3dQvbeT&2IG z^cV<4L$4Fnqk}jCcTQEZ0Asq-RiA1(0Nm6K86F$>P)G$)CV0ie{4xT<=m!V$04Ls) zKk;+lkir;20=;`%z3`?ms{4d@y^tSMSCSr<4njE2q&CpY-LXe!&V|C#4@d zQ*OcuKI&9KD`iRAIS*EX^8wRzIwwUs_{$wDUOeinQ2GH02NtEPv3f|^QP+wO6PCTm z2slhI`PSGjx;%a2d_Whx?Z%}=ZEI#S=o1vkPg8L+`YYofy+VAS{1|FMdm zoe}l=v{%VN7UMK4`#2x4F~K%gb}$TLeonGRw{2xry;&2B$78Rag*fk(ae?@B z20ewNeX=63v%l}Y1{sCbZ73nxnp)L!ARJZovwUEK*#oufv6^ban8pU>n?9?jv3+09 z-P?EL!RkZF3G1=f-lsSuOVCGGeVoRu#*>>5DE>ZnO9My=9Tkqn|S`!y@q>Qm=5F0l%IN^%a0Rz7?lMN4DY{G7%Z z)!WIbX3Wn>wwWA@*%{=pNy)f1Z_oYk(@(|k={SG>tZ?sWd>)INw{DBiX(t8}EZcV3 z*|G6xJ+3@+Sxu7ui&dMHS3mZ4_F{hNRNTGaj_Jm(ct2^m0p;sNZA`M)qG(1jqi#cG zz~vuz?%q*XFo?yaCDF%f#B>9&cLoSIGIFQgi7hVC5>JrDu3Wj|Rr!qdW}INumR-?R zIovUev)nI=TV+= zd{BQ-Q=MwWyZwduLFH8J%9}2M)On7q1mp$9pqpI++OqotIY4V+wV5G@&5-kjNkGd4 zDUS|(Qrse_p@h#?cvIlykN$rI1SrrxPEQ62@{S!KQ{rpUQ>onwPgP~%PE28QUj!%) z(W!$d<{C03HbqPPnpC&0sg_N)<~N@I1h;5RW_nPmS^yAwJUq zlQEQ#$|Tn-T$rq-?q3i2fQC#vPSA@RUUWEw8)%@?bVfocUzzH) zq0f|PPK?K7Q;$ZjmgGh&)+Eq1CaN)^$vE3+$2EZYQV*1VdQjf68px|7l)ks8=pCWP z#iBplSviPcgd)dVMF^{bk^u`Cg_j#RZ^vcv7}Zd(z@s=cIeO<*3_Lbd99`|ZxwwiR?J0l9Dj#T)7K zr5Jh;QV}FipE_-tafeTwY3Eg75`0lea)u6yD{j+e1z_TFSP6xo$;BnyT1WYif9gP6 zJo@zGPrPmF`R8Ad(8{WYR2SH$^ZHL;k1xOa91l8@F!6w|@Ow=9_t1WE>%qn&GXFn1x^FJ6n5MLAoxXpZANGE?OYxi~Xsy zXI$S=q@gT@f8?9hiFfYZi}vn*tejf1q7V1IJtj7sCAjG_J9qA!=-!VrXU<9}Z^!-n z_oF%4iZ8wNvh#c6=1ueO%9YC&{QKfD?|1Iri(&9!9w*%FU-HOZ^8y=YoAt6ed< zRXaOUAEOjpR#s-xyk+MgdMmBuMy;VuTcKamM7g5;DGn<$(pgw_P1f$j5B}^&vA(PR z_0*-PXfnTSjfjHuMDhe{L&=AgsJ>ICa6ADyvj^zuwoDL zm?_dfp(LU_R42U(OGzE+-HNwEg&}#y&EdGB(?>H7QvW&fpeW0Op2kBVW#tlzwTk*# z*-aCD3b@r@GFECTqhy7*zmNV}ZVKPu6Z)yB^fnYuG^3bluZx4CPi@ELL*L)tib`F6 zgSPTiS9rx^%jd+Da42m`OZ6*lvsV8DUs(xAJtPl=RXrT`+bRQArpZlt$%-dh^bi05 z|MW>jK~yTzF#Xg~-t})FeJTS>ERuuXDWm)@u)T# za@?X)xzeRT_UD~?=E^4==92uKj{dPSjw+m57O@gl)J63HE_20CX$go&T17hGOYgE- zRsp~uUQuVLdm2ko=2gW%6xmJ({xY6Z7fC~f%el)$bv*$KW#YO-cnFd^t4~!ILgi5% z*3?f?f8~y{5BZC_U*qDJakU|pe`8T~WK;D(W@}z`ZdYMta@HjM293)rT2+T#=V=$a z>hC9Gt|=Mnfa5EsHAbiNS?d!TS2gamCh9Rg$GMTnW&N0(owJMqovi3@w|D&!WO{m5 z<4?~@AwIYwgYE3?S;01;abjn8FDW0I8Z$IbAp@{Am5-KP-w21&Z!+2)^|2bu#>6MK z;xax?NY3L%U_Q#SdVgXEnkV5 z`7x)nr!jGT8wLKMYE(a(tjG>z7RLT|OtUhwGVATr?f!TS#+G9J`hSe&Xa1{b&7QWL zbGUO;qVSg3za+V|8;i3Ibz#F;SVWmBUMi21;tgZNSHJr8m|5Tw4?ajYV!u03F|xIo zOIkPVT&yug^^0+mZQ*V4pPdWr(0Cx(;O6Z+9^)=uxM)Qpz=uF~zaV??(Ux|A z9L5Jh&LX^Y`J!bj+R>rPoZT@T(LuRzObJborc8H`KK_G&Ho^_j`@s#vRrQOk9QC*< zyQo$=L&gE^d9+azLxB*afMZ# zugh%uQGBoTW2-I82{fb$55pPtkbJ=Lv?zf^3iMz4_d*lNRCq$?h~|_fw9=1Ygws1+;-SWE`V5BfLskGPz~Rxj%>%U?%&z*213mjF`($<$d0+9`df!)= zw#MzY+%P*rP8bx6PMaUx%pBGX7v%Sh%NZ&> zM{Xq(z;1y?Pj<_Y-OBDy!(nFWv6~!7x9kRE5g2&MaWMf*{IYvFOosfPP4EIa?|-F0 zBF72%CGZ!B^2;G3Ekl_J8OrZDd=8i4c)V;c!i-+|$?k<;?qG4x9ZjjjN#O;QG2rO_ z$uEVOp|Cr?>^2I!y|AAIcouPwLpjP5!3w;ep#jKlpXXlK$(wsEz2r(q0?pp!K+m^Y5GB_kd~|`0uX>az{xGI5ac}xS;W&I zPF|EDD+i0Rb?gEMtDq0ev z^@pOOD>gIxFL>7!}9WqTu|U~dtp=fltDA{F~2!e2qhVLpK5U~(IDP=_np|5kpJ?_ zFN>!~;-7>_(T7kQFTVJK!h~1n zA(VgXTiXEX&}%48zds!nO*DE;v@}_qP@m!UsB-S8ZqyWp ziA7a?1p+Awwi@Z^kCi6!7LK$v9zW*JR?aHVC@*W8jNM;di|_y0598jAdl8FE5px&S z|FN>~lqTXU4u2#&t8;utnQp+wMGDP1u~JX4LJgP@PZU3G8BM-0~r z!WMlGN-Zjb>sj&|*=5=)6xNd=lj8L{VHr$8rn&LQ=Kgw2_wVa zasppY+u}4~WvHw6g}p>`bm8%KUd}!xHg*Mctyf(fsvIQUn-^Y*C4a^-&g=8}bS@D2 ziyvw0uj-sLq{PJ!%GOF!jTcpw^^xLvoHKC>uL)5FzTu+wGZ<@#c0Ojw-`ir@o~QWA z)KHUDF6SVl{Fw*PDE@mZG^^!VIY&Q-8^fk>nD!&}r?m6XgjMN7p7~|k6c-X0JK??P z8M3`s6J9HZIG0fL`m9~z$&J;b(OuI!TQG%})%P`xv#Rq$m`pszX=q}c)*spRB_^u7 z!|smCo)wBp*E|R3qk{fH;5;z+Lau zDg0o$Gc7y8=n(Ov5urdEMJsTX?9?^qA*Tx(N5CQQhHP=KG}X7TEnDS9J!FM3 zmCTpLU?(qCWE{?iQyrX8KiFj@C^(^yI@?lQ(EyCkMP=j7sC7TqIN$PE)|x!+GvL-9 zZN$>zVl2$HVtnP>5$mr-OJgh_p6YsLW~ba9CnbB)Px5h)EwzlLY8IkIeQ8KOP##uJ zEhg6J2l;^T=A3vl=yOhBKlb+b#oempo`YC>xbAU|V<*7$K;!7}s2&T84fW+H(IK96 z(@G)6JaF@&j9qn_1xNw4z|^-#;K(Rbyq`wOxxI=i1od(XpOB!x4om`VLo>D z*W%)ZS7UNTYG)8H(yzsqa;0mTSf#hG@fxKcmw>RN1O=ws ztHSWHhJGJhoXy))|9jMzU4z;{&%J~B_)h0ce0Zb*pEg8&04dpwNOR{_6SjGe3W>6T?dje1PEX?dD6Boaxu1HVX zjys|Ld`fMhId&A&V&nAq&?e{hP1P$gD_Mj0NtAu+N>~Bdk{he}SnY>$4?A*^nl@gS=GWpB)f`0u_2DXAzasB6b^3)jb zGSa(0j>!-7ss`?+xzT-~I?_{JWVK*d;Wf30uIwGjd?*6jRtQGyp%6Tje2+p9)9%CA z>nV)lv0BhYWy+M6lPl~tOE4;%0*YW|NM`_+;TVn)IH6?y3qg+W8eMuH5mdZnPGjUS z|n|Uli$aB91dEzn8-uvr|uKe1_x9#$NU-Gd{cLut1JmHjlw5n*57KKEi=f zSRX?f$4Ql;fO0T<%i(y#b)ctJoa~qJ%QSCf1u{;9!sTH6P~RQ52yDMm02vuCP`DWi zx7=2Fcju!AC(ycM#N~Bp zK)z72Jq5Xf)qqVs6U7!{2012;ocHH#e=af!CrZOB?IdWGiw(ic3Ish~(ynr1TO5=8 zG(l!aOo6T367Y_o%a&x{ILCC>`5iaQdC?Q zT{h2&&y+dozW3gHUNy?LT*9%fnu|7^Q{iA$BKTRg`AE1%s}tpx>pl5ot2C=2*>?2W zPhRuZFt!%&wGU!(epbA^7q9>HO^2l}YX%#;9Ze?WzbBJ(BT-INCA1zK>_?q`Mw8+0 zfy$5-cG2)nhI}|+f`U*=JEIRAtJKpRT}3oD)Wn2|wsRl{w`a9`*{w`aAnF+Hz{)7$ z;Wq82c)GgwFn;)xH{!-8pDH<}xpYR-^x3FPXktC72^bS`w*G1o77b0X8+sRwngOML zl9giOt0yFc;nEM`cj_vCKDkpm=($p@fXY;-Jbd6teUW{1ZWvDLkLcEUxAKq<%!(Xm z&%x+hEYQOj@{A*oabc%#6I~*S4=^NaMIy=bC>}UXAn^dIJoaqzC|Fu)rx&{uPtoY# zpb;GfZrIhITM?&p(nLU}>I`{HNyx=YKZP^@iUe>Y1brz=7FeH^@HhM{rPmwy z$m$u}Nmpa2m8*)6pW>4zU+lqnieg7hsB~4Ag~K#5E^B73RFsa!RQ1QMhyA@Y4i<_o zE0Bl_Zj^w*iYCSCb;L8(FV3Rl!UrxB;Vi@YobYXnF69eWxiG|hl%LSX*blGii@*tP z>Z<5W=LO16WiWt1j5RI1DP8w>1*8IyDNCwA>7Cr80dZV0$o{ySp!7IcF^2MP2V0V9 z8t}tSWhMgPRSM^*DZcAls&^j0mq$zjHSZ)|dW$v<7{iA*L#arkUJ`}|3w+`ae>AC0*mSXL}`|<4A$>`61QxoNSR383^I2v0} zR=JeoY|3->D7H6uV{3aOCZ{#-k8xI8TVsdn*7&UWPnoBk1JKKu-qYB@kszs);~ZvI z4khIfE3_Fu`U=w*-{^B&d~njleX`lGT)=8P#vhbcTxKFHt`!`|(44Ht)Fj(jC9_Q| zDPQT_LzLb7%KD~Qbx>IejUJ+DA_luRVzPP|i&uU-#ycNHwSO-jY(<>A@~wFA;lC11 z4Y9Np(+$Zji%anv|EvE)?5_Sovc+;-x_CbR^gBON+P%1Z=_S#)tt?H&sZ;ZD*ssUg z3zz+&=x880v&O|h6aFCAXy{#hJCaO2E;+ecn~v5L%$6zoaH#kE8Yj z@#9c-)fMt6-q2p*PW7#KI2LcW zPsN{f&c-HfL&20Kvg*1xa-iQ=c-qd9-3e3xVH{qMyleuh*CQ}3h5b0>V1>U8cP^Op z3<|(Fnd3u`{fZZdl>_|*ki(4#Djd{4-1gI(L2UMRT$FgzH57ltn3W7Mr@7Bm<0xjv z21((kdC{DPs97JSH0G6l6E)3`gc>meg&+Nv3|YiyK32$TnF-n;Q9n?Vvc_BLPrOpk z^Q8?5wG`E?~%?5p3{JCtm!@f^k9j!f)(non)3Yuc6Uu&X+SB9K*q2G^mK z+7m$DAlP<2$BGN6#Q*VDfu#U@W+!3@c*Xs=37q719Pk4`cRc*aECQ)u348=RzjpBxFy4 z*&3m%|>9i#_u|ZrLk)j~ry$T73DJFmVZ|jy}dUA!ouXfwLl^#)npW)(vrFC!2b(SimmwJIXhH2+Xo5 zUfOm8&&UsStJ^26`Wdc>XFy`fJ1g(TWO6&yga$*DGc`@z81xV*C*;R=VU&lQAHyNZ zY%iW*vZhgWLQlTo&PqWPd{CkOlP}HV&`Dn^({7^GTQnfk)XG8-IgmvrM`?0Ed;}-C zY9JaY4=5PeVoG@-KpjYk~s3JZ3MpGQi6x>1S0_1j;KfB5%)OZ2e4c0U&8XC&xt#@yU|tgNh95M!X_i!g!` z@4Gv@LId^C&q|RoulC}M9t1pqFV3s05B;?tr4WK8gFdUs&YU?Nw{G2*0G!U=Ejy4i(LM}d3K2SOm7X=}gf}A~fRuhv`z9Emv zgunLh?Xn)_+u*(5&mHa z;o#f9`*(j7-~RURSYi9)AOF}l|6aL##oN2)yGuN=gCQJ&B<& zwU=<{N6o&XFjj!k#}Fh%b$D~0Nw)AafwpW$)g?`Ect}e9n3#|hlOQ3U(p4<^$qEka ztklciMYn7p4F~S#l~2;~5T|g=ft*G$JSeFI&M9>hwUY zvKgu$WhIzH>D_UQ1byZmyrOSLiN|<{LW~bo9&hSN5eH$6cO*#PMm!W~s@ERJ7#ndz z5j3WEuZ~AyCads3cT(t(XPK%$UbP4P>Q_|rAS&Ujy&aEjkT9xS z_^D4yZ+G4?T+=NI8MXYJA3Ui)4zGXv@d6LUJB_zi#(|%D zq>xxarh5=$Q=k3xjbGZg4 z{jD!_8`l`A$-AT)H3>d0R^k9{6L)AFGw`2KXYH~7WXIhd)>K@|;^jX7+ zxVt%w_1#KbIe#e*gnOgY(wM@L6p}6aZFPsem}*tx(sC`fH}3=&YOKsu;`N{3i(cb$ zEWY%=i>lh<;r6F7J-eW=b8&iRH!dx$#n*oA<#^}kAH>5)yXp?QF|G0G>~sHlv^U<7 zy%pp2W$^;}WGn{Nm1vFcMRR&K_Pbn$F)cZ=7pKmy#Em=a(cilzK7ToCjp=BPiw7zz z#>u^%jo90|6?2QHV{xAImABPJF%D^rQhosB3Y36+Slr#+^BC$?eU{m#t@KPEwbIcX zC}~(di2{`|o)!Llq~oHlxp|&>rJc^)V`V1&QA72CaD2oB6K6j1VFEeAa*N6bdip(- zu?PNWjUPJ@khyD;ulY!9SxWVcT>@>T&ru?qTRW;NX*D9sak3>Um9FZDUTC$9*R1Fs z3~Cyl)c>g8yniqq-`_tUZye6J|5LE^&~B;Ym{?rb3O8j2`W0Pv_$LpC<6}Igf+?K) zhfy3{k3nMn$S(&WctU{Xm?x0^NKAIOWOr7{`-ymj%^-q^!V15pn)D23q-!kacHFs| z+D|QFcB1cFa%XCTm{A?#Oh4+sT0WVUJhDLWF=tda6INT$nSQn@8J06T8@XEz|D!Qyl=^_YnTU?m)8w&(XU;Fcl#x#0DZ z^9vl03r%JJGMtpo2+9ok0syYh#rH)ZrwROJ5J5;Tq^A*uJAhx=4*arrAiL#s08GO0 zlo_Ah|0*D-Re)bh1)P&N91HuT=gHnS%O0ihw&PbykJl&A=D2dOpG@N`$1O#29hMtm z93+RA8-7^vu$y1RTJhFl3x5VLR~`Kzm}0s!#Vp)-M@qs(QD@~J?g*;bH8H?%(Dfw3 z6C@4nN%<$C-%37(LlMYI3EumPV?RAiEC>q@!Wh3E2!zJ5W>h55#Q2niMhSxBnwQxqWfVRVGRLF|6Upoaufkj2r22SKSB^WOa8e`5MKC7 z)jyOV$RH_!3YwXCG6(G|TwfDQZ^M!sTY3?o;6Yy_-;k{{qMS2xdU88rCC1n^*-iW) z7vh79oBZLU^wXEQYRpX@#ozmzUyA?g@BQZz5c{#;?#AL`+LFuaJI?w+S%qMh6@WZ_ z35sbeUCItWRvd{hm;l>|`FhJmA{?lVxxc?_)k{gv-oyaQ0m6g+R`}WOv>7|!c_Cw#Si(-^7`=rfEKej`Wck;Tn#$>H(MIk&# z@yof0Gcz-uJn@x&WBpOEwP)>N3j4LMea(EQe*E-}H@sE&D_{AFm7pk9PpzDa7Pnq2 zE@eSJC^N$Un}73f;vfB^e`FJUNZCevR;q3DfLL9Bv)$gcX zcm<%!rltv#m3!)&Xy4Q$`rMxSJbHnu1Y%ayjIqjs`lf!7dcj2@Os;AZtk@emFMsyK zH{#aKTj{fTYf6Oh%tlNuOWI!2vtXs3&*5rl;)R0GE1@-^u1$ys;uR~aXhWhIeTr8Z z(b8cOWO!>OAUs~3M*|eTq$?pp!eR6M4O!ddx zefy%5y-x@2n6lYwOcZ+e%cCBltw82IHL+hurC+kLMY)?z2uxV zE^1LvCVGXF!cg0%94OPH0SY_S9~66BRx(6cN1iGBy4<;BfVvAk`fm#-3Qd%eRX*6! z$H+cbk4kq-v`~-b&nhr0Gzq5(dT%d|#v7tn@!=avM2$KA0LYoXC<;4@uX@gwVXyKZ zYX}GVqn$CfQ=u4-$cOj{>s`5UmzgVu%NjSCgmWd4;Z`dPaR9u4B3j8J$hZif-FeFH zg=xGhvk^`3JB3c+FpDs*CvtOulHKmbyTeoNSoOj?vJr0NMSX*npsuI_;b9g35p@%} z%D5FtcKRS3QWoGF5o9v1DxS+qVSUb`>j>k%0x7(ey7+^Fa)!^c`<73}BgPMZAd(yX zD)HGG%o%@rgZ4^mMRiDJM}6QTA{vGIQC4nMd;6+J!imxanT=JWdktd$hc_aA_{*bQM>YO=n9WSHBdj#2N{$D zr%o@&`+O8Ue??;Evyz=!(LS1pZb$OV_?((sHx9RN#>K^>c(~V!?Soz{HwUq}FcY&4 z&VcP`yc&;d8)MNpdMJALqB&WMtM{g3<-*saKD8XD<{I(Bv$OHZ2k*q0Gv`J5VeE8{ zqA}5m*`@P}Q;DwHR%>b|YJ&}RFN0_?ZjARNGVjKjb1#aIw^VCHbA3D(X4(GRQ~v5P zz4C%&CN58#jR!a1j%Ou{aI8d4Ma8zkftvlJIPLAz)!5wHkc@O7KJ;Ba$ODXz zC_j)fT9YlRfYMN{P(NcoWDChv$R6}PjNg19MV6Y8+%-Kj=X3e2X!VCzm5{;#xKU40 z2?|P-^FS#u7NO+jV-jUs zB%8v}2?}tf{A`mOGE;8H$gIfT&~88VML8aG3d)iQKT>|EL~^-p(aKj<4b79fAV{rW zwOHB5f!PSK2)nFKq&{$d95f&ZBM@+tFSua^hl6wB3EPO+iaj$uD?e2NLMU5o7eaVO z0R@d&sNi808v-(`7{@r5D^)_7Ri(Y-6_O~=;1A(ZW|EJG4GEJ-L6pg&8?8G$J5#QKKbt&37?(oxfNN)afSiO53(?8i50~dTJlH5S4z5zv{ z11b5+SgQBnbg-gMyUO$9p!@)K%>RZQ&gE+d`SfKIZkij}fC@v7XMFG-+8itSi8j;% zse7aUk=+v}-Zi;!TB;8SnyDNcnx z06&3mcDA1$J_>+e^jJw=q+u42?%kwSCE<5V?7d7^d$NKu3 zx-l-MP%_XbUNQD?w(ic}R_tgDWn7=1X~u@e6^?E25hyCtbm^J+p}3YiL;~Xiiu%KD zPveUE^U7h=yn3-CzmCEvFGuvHODcoqI2gYa+egnuW9odg_c;2b61&?EqI&SqXA_Pq zUUcrNeeH>cO03Kb;^hmWd<>(%zb^T0H*T#};=PUem|1u>n#0{#>nz05$}92wS>WRvBXsrTZb{m^IsEiGS;W}Wk54}2`+FdA`owjKL}S}dIUYSf#HYC>mK z2WFxD1#++@`}TXyM#NF$%E%!)mfvUl&^RoQJw9;jOpge>yx zl`FBZwCr<~kp~FRig;vX&J6DLD=I(r7b+y=JhuZqD4n|t@~OU8L91hF z9>!smu4xRT{5^Iis*NWrER)Qd+Om&(5qP|EpIF$1IL|XkgR)QcO8&g_r{KA+rMRS$ z!V?g8&-1X$@bOEeO`3K{I3Wasc`$MwVpL6IepBtQF`k~uD({ta0g9rwxOh?p%Xx_P z8kb8dj@~I_E}233oS;CSflTw7O~F`v{h$7RvOWz;2+DwSeo6>OrU*5h+4x=Ae6q)5P*nw=%W_~i@o=s}%D7+G-AphE%SgTe5S*us(~$8z4c|%rUog!PKA!AHQ3g{g-$oL)AwJ7z%_kDZG!qkPEpfGNPu%0R5@%<<#h zgAaI^z+gw2SG>z)6$HvUCJ-qsEBa9G$z4LCzYGU{dS{a2GzlY<8-M{T2*FAE3SSH$ zDG!7rK3}#m6_>%r9WoPpLJ~IdhZqKM$j$Gg{0fYc@R+10KgX55=)V}8axnZc+-EEQ zU}6B`opWL6)}a9(1~Ib5L9z&60|`HzBR4o4NYEKt2u5+(MHuc$fIB>jgWjNcLQg-s zvUg?roW27+%5v|3uzHkj=EW%O1{$E4WF7I=12lz9R=ZTBr zvkK7j!<0$63o)||ia}vebU3rZQkO9B?4`MQ`Nd}~bg=@AFYO4BY`H~1Ps%D$!2l{i z$-+e#TrR?fYGA^|1fsZ*y-&toB`5~~tq zQM_HekQ8Fck1w@jar5>~Dzcfra#?a|4Ebi; zF>wIW!VMs=yZgIVcybOP^nG~}6sz`^Pgc||t6SBLHqm8g4N3EqYp*F|LP?Uob0X31zTX}tUCpa`w zO2VOjg$zM?Ty2o;Pum;Y@y1&}i~sniKZ@%&?nGO&qRNaUaTGL6K&MxHsfSnnO`rF+ z-{JHbulB1nSRtcuYy(yuu5i8^+f5}J$n#s6>c@6YWcxWWr}X_Mvq)C{vf&54XdlM!1BOGfZ(A(`&7CJ1uD%F|@YL zv+9__5KsJa{v->aKq8*`NM8J}{1mhi&y@{7XFi2Vh0Hq^OabXR%>tLACHjcKd*P3} z<79lop*-3TPvgN${tkj)w&Ta67fj-L>;#7l0_8Xc5D}c3pnQ>c@~XGd#FKJT_#y3( zy26Cok@W8VD&vF~McUvX4eFHTF}V|8{+4T;XYn3|E;5$*;JWDct#GQ(^aT!wlj&D@ zOk@Vo^GCW4qeuDl3R-q*2r8;0L``)}V_)!!ERR%rTWvcl0T z#N&+Bxv7PC<<%GBmd1rcjR_plg0c^OP=np?sBQOqdusZkNo74bIUR?co#>67i;0_8y7Av#_c3711TRb`AEt~HQE4j*Ye6rT)BMNN3t-sH(O0B?NGY0 zg_^o;Wss^ETXs=Q_a(RbQX}e->MzC1s!S^t_xIhr2#cbUv!9`jkH37_Wi=qO8y`g< zK3tW3Gks(n2aoVmXN8&G%Jmv#{^uRJinc{Hpnk|AzwvQaZPnvOXD;5{UyQ50Y1IJQ zBM}uQw+rF{a<+?1KXxcQaiDDzkF=6w!s9ljSJOo8#0v)jVI9W*$%!AlOL6ST<9Or+ zllB3H0&p0KOyPvLlWO|Q%}QKSeR*c45-&^-;)U6Myfl3j&(95#(ogmalZSDpHHgKg z>TLZerfQspuClPQFUg{OXfm(qZc0v*nc(#s13=<}%ql)dQ|a5lQfSlKPZ^6*#i zAg$_5+yq}9vz;^lYXlK4Lgz3B#X%v-E3yh9NhRTT0JR&@UcBXKz~eL}!$F(uR{V_~ z1u9HF_}WdT9bBH^VkH-bD=VxRo5R|NjkzE!uw(M2{ zzZZ_#k8nVa17OeonI)L^Ck;ImB2SL!aJUstKsEv5I=&#gQ~$Bs1SgLA8R7i`KwMxH z9EY3`knK4myc0M_1b&6|o`8&_oLV_1ut0t)% z<-oiW*6Hf8w@eGfyyKpOXFETt4>=8W;C7RloYeW^rZ6b+=;|F0VUq`c1XBrI7VsI= zm{eeAWnd0RJWXWM#7Tkx69*nE3GpKh!h#%pGBqJcY0Jul3>-|*5HuAJ!IYH`2zwS- z_2*S72!aLetcbDlk<5TX`DR57U+lbP%SC#Yy-#<4*&O)3K-C6c6E^ZDMIV1p}V`ND@CiHoz-> zvZV+7Ab^Eld8U78P7@N`^zKLqQHd_nhPHvj2)`!PR$NI$o*3`PmD4lvr57(MPnGC( z527_W8QkbvpJ;g7trb})iWqzqkFWCxkO+D#sYi*!1rhLs^ZuZiuWbmNgkfdg!hE`z zV|RN;f;;Ez^x{B5Agjj^K$#>E9%Z7xHj6rhNN}?%0Hq6qKP$pm31}st1l;AN<#_3( z7vtRd^S=Cpm3QyG_kMix$tRwG00@hGWq$kTKaW?x{1v$j;;^4qqHS+)MYG-zu5?>4 zf;n4b5vDgbH>^Y?O?ZGGxKRE*T7MLmFI_gja~*;&+}c-{(9PL^S@~yB8Q;BgFP4^< zlz&aeT`mbIr%$h5wE&*Je&S{y3*jh8y$Vg`{oU_<&#U?-!~<`|L6N99-~Ha7T1k5P zv?eBcho|k%eoRia;@sKuRFe4acfT7Se)N%72Fw>{A(9MvV-)~+SS`r}fdjgm&B>UV zory{1A4MeTq11inop&6EZNex45$=Eb#!rK@_)r3FZEcHx9bW*F1i1v%IpRSlicrEb z2|;;RhPLX(-u~`Li3-efzM<+|ZKA5Wpz;tM-~Ey3kRRn}rm5Z>sa#PCrkes$0`hS| z!dj!|GOrBSB0LdeHI=jS>N7hLIt3_z-KN#IaNZEBCM7q=m?kYvP1f4&ZhZXd$MGlM z`C+{E_It7VXeWkjcjGfKZIjhgjm3zmC7VO+;$ci*lJq^Jr=bQi6_xs={H7I8G_nPl zB_b%w+>g~0F44qFqNEU{eM3kxE8>9_MRXKuvpBk6AWTtrc)TqN_NVO0k=}qD3c#!U z5)YkA-X2UGZ|x^71xt09^c+3KC0&$a;8#L25*-4kjU|&NRC)EWf1pqA;Ic^pju8mV z;7Xj6=nkp77yyUPk%F!kzf&!Uxf$A<#*$590-ZD&AnT+VW13I~AO zb%pvYf9hwIw(By4cDY+#10i7#wQ!s`1JzU-Ef! z>zj`xLej6Yf>h~p(=en84mv2M_T$Pkm*d>I%NkFrvAKiNs-@mVS4FOw5AkJEZ%%{GiK&marwf091Mk5G7xp0 zqTYS@>#3Z6m1QKQ<=-1FdR|x=+UECefYrV z6mLoXV*Ex)3H_=4fQ5Rmgc$!-SD~Aa@U(D`MYK72ak2#Mv99*k=}*M9y_tA(XDL4H z&P0cflR$1EiEuXs;fDwAHmHMmje^Kh*a<@u;?;h|8~P zRI?xRjbY5xj?52^@=HoE`Yg3yrH7)-3V1zZa+l3JBS@XGgSmu101}VfK`ykJSdBJ{ zXTIb=%7u$pB#-q~XLu-2ZnkG93UVkP+Xs@pj_5n6TlVK%K>4dqQ&-d3d@Q0!?#R5H z8z}6eqhN>mr!uD=h{keW5`8IuiM<8Qg*!#Wm_n}XR3M}tp%6@b!X=eo3WG9{GT`Ko zen}~%D;xfjayMDek-g~*MC~fAsnE4oFD}1oiL07Cn^95NQ5#Re}4+( zV3_47DNmn8T@DYF{fWbSHZwR(5zrYs2BYx!72z-n>*&cqozH-KIbFcG1m!qI2a((g z4~$V*Mb0>KyzGxzejGVVp&b7>jxw&Y zUxpm#IF#cak5h(RI6w}AnbXR+%kj(Z<#6RN<@d}`pllMRoc=F^94F%_!EvyZlK2-6JJ?KH~*$$08v4sU7bXFQ~8euEU^NG zSDHlW#d#o`#Fxcpft@f!z(fBihddZEz$;#U_aWI#8iXiKPUL5LB)IXW^m%71FgGM$ zI@63-Uw+X_C6qIK0p8o?+?a6-ik$s|qQ*)}rGWy8Gw4v{c_o?zP=9SkfFltoH2x$| zb|pZvRS4P<{uY;(gTuW!>y3E3dz?L0@mJwV38LvM@xZw8XIm^vA_PgFCpa?`OUui# zxUgu&6sr+Q7iHzn_KsJdaYi4CyVEPDqjQjyQE$KdP8_tm@!WIIxy&rw?(YeIE2gJs zOs}_rir-xcvz&`}_DniA4@H!DEV?*1kCl=aE?gM71K{L~HeXgzj%DQ)B~KaMzH>WP zly~SNtbJr)XVnBsOmHQ1@DDx`D4nOs`A6^wB_hJw*2bnLBD1FB8{hb*1nP(J-S7UX z`N`_Kdw1`~(&DlvAhZ60`|7K&`j+LZSFgn%{m~!A3okrx1!_M3<-zJh3vwvtW;vvt z$uRUljmnN~I;;%*rqcT9Pk-vXo)^uO4J!~?#faPV?2H9FRwDN4JA?ziWj;|hmo8rN zLE&CaP~eAOa0TTbm)e{=f6lxH#??l+$&m?cy*@6XvKs&Kd+)2AAVBs#DWawiDoF^P z5Z)sRW+CC!mvyLX;VjL8Lh;3x4+sO{fF#cL?6LJz<&I$5XeC^=aq+v?iEB4+#Sgy! zM*QThU&O5&_oBzDJho;smxlU@xu{H^is8)J2$|KU>|FTKT!?B*ZYTyPnh{f)z^YAE zxQKys1yN>j9-wHZBe3$1ISY0*H7fyW?y}Phk(4L+$`*vs<<#l={ZhOCr9#+-km=>G~&`W2#YD65t<&(^&Gm0rZ~pyPLTJM7K9KZ zrKwlakm<=BxD^hvhMdeT+Zma0_mS7TMl_82p!Z9W?G*TZJ15rNK)3#i1$?a^4zbJeZ4uuYvYt>Y5 z;2D3t9U)YHRevfPv%Lavd@`#2J>i576gTqs3c+-a{I8VMp3j#AF>kn??!3s7zqimbHFns}5AW0vwu zd=yM7XQGP${Rn6aU_>SnB;3M77?(L^iJ9UN%UhKR3k}dooj@sRSK^YEhy{=81Z7?s z&<^D!H>aiiSFM0RIV%s)ScwK=9umWXNqU&VVI;W24_0-HHY@y6Jhvs%MmbA;gx{2{ z!g~^mLX|Tky+ThsCz^slvvGhMy15mbG{^N&PhGi+v=j!Kae=0^7ge0|IIjG<-I5mw zk{dTf6ML)?mF{{}nu|uwYPzcGlN-!;*$4dUYuKZx!1 z+tKX~B`?g!vc~Si%2ITj-%!)uyf_1D$?Xx3Y5Hr?p%J&41- z8>-HC#l?Zfc*!x%i%~iKH&ni7<7n|WqB{GnIGB1h#?&{Dt6q=IJg>2CGG-X-v&WWBOby%r|3s zam8-P5-W?RH7?J2+cn#$QF_#nlT?Q6$e;|7(Ky0|GxLzSFd6qz#IZvEg2rk-OfoJb zyD5@rJPI!E;v8Ln&;_5$hx$riO&yxhSjF)g$O+UX`uju4N9=U)EvtIxEL?w>Z8Ur) zG4Iqxb`)?d3ak8(4c1WlZEZO%kfE?-J2Lq(a%gh9Bq31HPUNb3%c?O|c#*{RVOq+V zm5nH1_6}reqXtqk~i?&|_`cKz<%9t!L6TjfZdN4cE>CAyeX z(Pg5>Zj2vAQ}v3=QtIk+>G5kC%c+lk6vx$p-bc*!H$(9FkzI6KNvZd-lNEr3%EV*m z`Ab4ZSvJddpzIH1Gs6?%iu8V-}IUHu0KZVsldYlH3{piqSI=c=iH<`v+G&0^@$MvZ5 zNp94A{F!ygq+_%j!Z~gdd@Uf#juKC}z2eSFIo^pQ({Utx7>E4SIa`fJ>4VLA zhhu@yw4oqyB!UY)gEamr9~33DCxu^HmB%}Hj}(@0>EK?45dy+9#70~!!M`O3$;m+31EkI#Xz0x+#4 znP=mF_#gj2!dr{;=gxbD94idDkr1UL`Gx*{(Mx{T zAFX>^Zh2K6CR@S1oj99yk9PY>R(Di6LQh@pJ5AfvLlaOsjS;XqOMAO84{5$MJ#+SqZ`4IFyLt1bSN2`McFkLE7v~pMo~q-*nev_L7v=Wo5#`iy{% zn$H%Z{Mi1>m;8{y4)p+KaD=u&1n~^%oy~7(f5T2l32_`w`EEb-kl(X|$9R_)#c1;0wwoEC1BSS$UV02hO%b``yYn z>IAgV)#;V47O-M1SyMcrqN|g$%h?Ji{W*+q!VkZIlXs`5hqUN_3T(JPJ`i1|t@sfJ zYe5&ln33rqEFF*S{8O*9pB`C?V%3xSWV&gepGE-pQ8FPONhWQ2X?F2%VfKS(_Whg;(a2CxD#$CX-9Kpj~6MKMoNF#T4PeN8MI`Rh^ht z5=qGyO4qoczt>j2nlMi33y12yv+N^46c%NUaCjv?{DJ@!i=HAuug33m(52$(9az73rd@WvMDiDet*#cm0om5@rGcFOpja3{Z1C-IUUD+hgT8D`>GhRvtF;j4md4}tcUI&4 znT7c4zy9Ue+T4!seD^=a-p*buFD`pLg^Y=bsrbrQUyL5-DGx8kVeQ2jwr`5pDv$By zs4ady29v)Q{qghBt)2G{fQw6mn6KT9_Qw0_dJm(wdso#>JlVe?`c+R4R>cOj71`^} z^D(~s)tET-?HF7BUrTm45Uyv{&o`oauo;IOOSAh?)cUJYuPAQkkz|Q_v?_bCFtHkw z&03sY7{+X~9ZL)Km}yPN)YNz^&h%qxWy(jGEUr8kvvaMOQdo`@UOE3eu`o9uvx}$X zej(-;FU0J^vR4SsP0z>N+^INq=1NRACS&Q;xtP*;F|(lXvl_=+W0G4YV{T?87FJeb zT5;zji_A~eH6F3r52bjzr~_GLyry1aXWus)bCz#k<2G`@p6nIyGU4daFBVZ1!ki!c?`*)20T`-3Z&Ntv$vo*{<^aL@k4 zEt?t2__LYaa@^x#N`O;2YS}yv)SX<%UC+Q&lPS|GQ=65~r_y}0I*)CId3$r{3gZ7tj#bf25Ox#%=U_~FDv;=)7)$Xum zO31QFSmM|n965e55JQ6rQ<@}+X<@cV-+3yCx1Bgj6QyFmtw+KeTa+{*!p(v!X*fRo zQD@Dd>UKvu1>Q1ly9;u=#7pr5Vm--n>zJ0m?^B2!=Jq2$&exxaopvT&BU1i9>io;ZHc6HOz@d+ZkTKL;Ch35OhHp!tTyD^gVvtpm+!%~PG6}6jB3il$76lnka@LRH z^TqV`ots{*#{`^s2q^%ooz!z4}k|l}$Pu`WVWZ2X`ykShXe|czY~v{LnEKlP0~mZ^)N>B*k*k&w?veQQ;~q z{1;E^7wsh46$czJ!VW51gmcA%8U*LUrZGY``Oz(j>B5C;fs=={2uHTSm%D7j7u|GD zhsjpThJIxS7x^{tPB={5h)*Qwc4EBpp1gbpEPXC*&*O(G0CxAEV!S5YjAP^lWhD7< zQZ?*)c*$c~Uva2JjECf0sPN|YU2okMPSCNXw>qSbYdn-}TvZ*{G)vx0(3BUi!dE}X zScgK+N`)w&H4x^ZG=Hf>$c6+=3L!pOqcG zI2u!*LA|B_#}7VO;p13QnNZzUIiq{?7IpPML$w!gMJ@PdoUBUh_oC96GhcioFst?_ z=Jco?xkRHOzfVbpV`Q}5TC$;dg!r6t2 zE1skkdW;n)A@H9N9+ZjVDGDaikgpYmu6v5FhjVsQy(Nz5N7kTFNltOnc5E6X873cQ zstl!vVw8aP;}IWW4B(0&oc32VAK0DV{%5ji0~$Uc7z%FitJC;>_}N%r4Bur=NW4e*U>D7h-W?GFJE0 zPxd#|FZbeWFV95#Kx1v=>oJ`DYcbrr8Li>A>gTlT)wb~0V(sCk#-6VF_D=No9*RvJ zjXS5KI`^Dd(T?Hie;EDczZHX-Z^S`$Du(q-BCGDnIX4YY*4Fh%c4=L(a;!eqmY=Gp zWQOX&Cox^$je7NwCh+~38sAV>x1(7Jo|B=qB>OH zu(#8WgZ66dY(CWZxD$K3`;xzQVs}R}kH%Z7EaNXS6k|Kbo$yhWGkqD0S>?wq%6!0L zyiH0K#?wI@BBQlgrCafqT!344IrEm{b=^_f9;t45%vW6Ec>8AYP|rxaF8L0*jAK8z zX`fYreTD4^Kj#DU(Ujc`e4O3f-0)5ha3No@BF!?7>XzHH+5+Zd8H&~-chQMAZHV#Q z^91|TPE{_*@$&BeenzR^oXp{rcYG z%c{Q@ru*^i%pfjI4&zj-7jr5)E~BVPhCmjrqWx35MB&dzf4T{1LZ;>%JbJh>;WrN; z2s-5Mi7^G&8Qk z`j-Q6mhe9D{HpMmA%?h_0ht~k(~=+HB(rQU=O^RLz|cWXdd&Grz*Entu86MO*s~wF?Iu6FKXx8jM&WVP<9by%Bwnt^+eUk1t1vt)oK{>}3 z*mdhSN#IKdLOULK^l%Fw3b+x$p=e`Ei4}V0TY^K;Ks=Ob3-fbMi#RBbUViE2*tTse z7~}l8b3VI|ft+outjK%pu}3XD@)a9_l1n^}9Xl4RSOXE;Vh$cW7%#o_l5enMB^kmk z0xUwQFS`)ruxS6-$3GD}c5I7D;escep*K1^lXG_vyh#s}!%mzy;nj!;$p{lXgn{e$@e{t;7Wxt35YAD4ah@W|O}4y(F9}JM zd8$Jw2-()LFgIshC}mNI5zZD`Oiqh<^Tn3vwkB|c5)eQ6sZYhGjhnp<8^hU#tdK+r z2j3CS_wU~yx88cI`S|d|5673k{N-4`UK5MaQI{!7)$#Gsxc1uXe1XTa&pzwCkPh38 znWS+0Ao)R<9Zeq%A7e&z{fJoP;l1mhZt0~CPbt8nraoVEn-s0UU0O}S?^p*(cxP&}o{>4T3y z8&5uQAYM9jB4*~=(M4cZ*$$|l`V2l{pt-Sakrhw_!<$s8INOhveN)jJ+u+-LdqZ6M zF{XGM6n{!_QL+qq6&5$ST5e%Qk^My%N|+jThjuSom9Dq9GI^v=b=Q^p2ezdW-(3Oy zj_83h_ZMUlfAuYHp+ul*0}S1=@XNMAh_AM3r4ld(Pj%b|Oa3&?xNfnNCJ0ChV-!Q)IYtTeG9+jy3{|*K#LtDE*JG(xXF)^ z8=-qsI}?5!xb;IF6GB99(+?i{Rkn)L?yOhQJKI1t`5$27t9ZuMRk;AiSfsR!udcjl zXd9>q4!fp$qcqe-3wKgRS<$QXxOv#)lEy=LX*b5UJoIqMf)y_Kp&Tq|W=p0Ti|A=9 z4e*j-jjQxM)Gx+Zwex6<%8zl70uzYpI+U=@7v&YJ{d#rPQMEmPT4Ze!b=7?Zi&u)#1z+U<51vSUIm?lycNd*JAuh7CcIlIQAo+E4|{7 zPq#~6fup@C&E%2diY6-qMX%euka`=oX_s4Lx#o;8$ z$4{J(U3>S%aBW$Auln$bYea5CqT@`&!i!O99rfy0*R_e)MR)S9SY3Cos))*D{&`Kn z=VN^EM2vM0#mLI@F}!*_h8iP^cQzVJU(;Z6Qgm*QiFLO`v$_~ljm22MVLT=_-5lFC zPQ}jc8)EyG4Y7Iq4H{FXVtistOs$`ay2`(%{=LyqE3S5x<rlU1~HkOu8#lq~Ox|eoTI_G0){zQzA z!q4~%)p+B1V zipE=%YaC~S0+4z+zpxaY6%@DB0ktC41Ge$9vI?aK{(K}GtZ59c)3zjEEG$?~p{y;t z$`6?ed5ud!8XCtqDg?vjElW!8oMZ_;(&a6_GZ$y93`CCM!y7vSIFFYV_99nRj{2_} zu6l}W2(4*l7V@hQ>&LZHURf4Om5`dLck-jK+16kjn{C9mE{<9O`10~ZEOn^U0;SQ= zCTN4y>!Pjj=Q<5OH!OP_#?{|JZh6T~(kZH=@ZbI+CZ_diVg$M`YwKw%B@GKI6G~mE|!j{!sKm zyZ-fN`m-?{cm<2Q92Z%hj|7yV-;IxV!Zgl-(D73`P6M{-C)W`Qz??L0gXd7)bQULwNe#Dbl?`aXM_SY&>Y(5CU@Y$_9=v9_ z;i3?>|8i-F;S`N>N#YW#02xZTG}4Gc0GY!7SC5d^cQ6E}M3b8uiM=)&{%cH*nxkXN z=)PA|j+5O^-ajcrIe-!UKprQO@@*p_Q81hYkeo)}G z1c#yx7)`kGm(UU1D2MWo_-qaFRw=@kgkP|1B@t}8Nlx$x>JUnrrcX8ln*8ON;uP6U z$}+i~F?llq#zSb*#D+jdIVMLEF4#tdV9%Byw)*t92C?!&aP&Ly%klb&=<)DvuYL%; zDLg$%5RD9UHuCpmfZjj7UIuR^DK7Y}vm#4U1Xrl+GWA(gZ2SSiNV7;fU_yt@Mjo|Vwrw4lTG z)lFNr#LYL}=)98;6ijSC=1e+hL?Oi)d8}k3kB1Ju95>x~Q{uJW*}eh~S>^Z4Gta~i z|L_l6=?6{lpB00TKk<0neACU|zM2IWR;D2sKm5qUasU1I8y~zU9EBr-Gm67I?z}^^ zCVbFBIIAl;UxhkyPJ%W!9m6Nu2MRr4jZZv*1_Z6Mr_aXl=tvwte$0H}An^IQ+4#tR z{)ksCzU}@8d{Z(4KXEJ=>48|bjWEGL$w}TeZQQ8I*<2hv_@d8F92*@o{Dq4b<4a%s zLfm`rTVi5Dc@;gJy?F5DgK^dFt30tu`Lq~iVT`))!iz7&?YG^o@;GOuG5N$;5R;ic zHEkvF7L~z_(x9F-hlk_Bx${=qvh8Ses2>0NccNo<0|+&R&R>dGUfiOx=|G2(HJYKW4R;XyD*__Y3MTtl-k*h3&j- z@Q9K1F)+HrbjIjL#Yd4anpPSOjR{tLkmv=MWg2QwtF5F zf{8<^dtw_faJXTO`gHS9w7Je0#^5jw0Kwx+w`^6M!7dNn;ol)j<+N>NjKIDk>#MD|T?VG<4q zl?z*GxhoXnq<|!SMY5m3tf=Fkm_h_2ig+mx0LfOK6GMfAu~6d#J#iN$pa^F5w3TJ5 zCtQN$asrRyxX)h|~G6!c#x%E$Gxm zPn-c&7_ygMQr}2hk{^83YuEK&uoRYP@ue#uc6|~)w`XucM^f;i004$Q6&b{G7j4NM zO{!zgGwH!^-ZARCQr|-vT@?SOR0b$whcp3RjjfZ7*t3omVJ+W4yD)PmE-bd=@R5r# z*Bgy{Z`&GMrdk@4#^QyS&&SJWHpJw}QcP42#o-ezjo(u~E4A90kLA{k&-!bkTpznp z>|cn^0LN*}#+a(X^1wQgs2X3NjA~bPZ1HG}jE+Z~`yymr8OCtN4rBq8eq7wfR^FurJ(4R} zp~qQ|Uac%R6o=k=Dx$!OF&>4HZm!EHf*7lLclxC3F_>y6dDnhLpXYj*J|r${Ou4XF zi6e8v@xts_yu2_G)16V@B<(s&6Hr{Q-d5haMcW0x8D+&F=on`dZa4Mb5sUa3Q3Wl) z7byBhZqOF3qX-kQ;q(JeU}PD;J@hVIleJ!KX!c^W$lWrewxef@-q$y~dRAjh;iG!k zQc9}?9dyG7E8F0c+~%=TKo&zbNh{w7S3RpH1)+D~s1M;{4a$+-5MrU?sV87%yE90% zgxB$D=LO#hvvRgDsqCOh<)?BNv~U&WBRVK?{47tJUia|&OT0?Qb|jpx3%u|nfSg|P zx|EI;n8+I-0feyySiKmI{#r~|%T!-yj#tJ(e7XCtxC_7Rc0d8+rwHpul8v(uKzu!nDuylIF<1z?e$@{> zJ;qtjZrOsj0t-Q#Kss-5_unOuAZ-{Cg9>hXErd~Zc!b#xIE3&NX2qY|gluq-27;qI zNl*(;bZA&mm_3}Vab?^2frrqiciJFf&a)gKvLcTMZ{d{i%i+}(gnK3vD-!Iv@zC#j zaGOr0O+4p`$a3<-U}buE#pV$WSPTpbw}CG6JcVa(4~lpZNAy^j79619WrC36GEfu5 zfS3k91`i8k#*yNHr{}yf@W=vI!M^oVe-_Xc)|CLs7HEqJ8vTIj5>Jo6pds7|SC`2t zf;&N)1p3f-y)$9)Hf5Act&6d4v={sKU2BCIXX&B%nV*{r&Q#+7X#`1xKoI4@8$pl* zo>55g<(Tu?P*zp=vRp8T{2~ybz~fvPE}mFgYI&6!tN2*?#tJvKodU}j=cm5)RP5Qq zw%sA6o0OegeqlwRCS<@Npt7ZB>y|CWiaSj}Bn=M_4SPi&iY~s2qlg-;C0Nd@VHF|t zLo=)N_^QrrcvoF@m6d<<5`qz8*&fW7?K5Z3#Oxe-oE6>~<3mCC+;h*xBab{1ciwrY zX`~*oYLG3oY~^LU3_=2i{G;eRckY5$w(+GEgJ2<2BzP}+HNd7#8=Y6+iRVX%Yi|Lam((uN6?sh%- z+Jj$;&Kv<73gGA#uvb>TkpJi1p>;j!oWWs_{RkyC=5A62zXY4!cXepaI+ET zW)|Z!Uz>}c{P8>D1Mj&b-tpEuWB1PWv0($3z+8x@o_;bu^aW!3q%Xrhe`a9cG^L-|w7NNuo7`#|9_Y(?F`&?bdzmN>RG21YhUWo(-#zcH~Z zDM1=z!m}=7gcW~990}jP4VYU=S-EBO!i^G8N&9wC@x$9=Rc~n0RzC1f832zTkLn?1 z;$}}|{AhVpAM-SY`JHSPuNdp3@CTf94X^rGOlWxJmeGp(3&3pXH>k3BC_eA*?+QG| zNkoKj!UUTqkZDX2oavQA-AYP?2?2eW{Pd1e6`X+j2f8ux;}3Z7QA~~kc!n`6fk0Q7F1x zdHL7ML^(~k00n2o3*#o`%(&SfhXqJ7q^kQ|2~n$Y5U zLtQ~hCO;JxNmK7o=(*C7R;4aWV;^NMdMkqWaS&WcqV|-|IuvYO^;G^`u)}SzX^hv{ zBK{0;z9l%J(Ro)q6mL!+A=wj@r{n5vgXY#-{ zeDRO`^(aiinV+& z^7d-=N%F45K_cjrL-kneWA^ z(-(X&{>bQF_wB`apb~eoS$2bjT4nDFuW|Tb_e>0~ z9FK{qjZqt#ie_als;#5ZY&{ucgQsG{*rbZD5mS|CV^~QJFMKUVI|pK&>fX z9JS%AVt9OSY}>I*W11%Yt7qa}54<6+-@h-;pF0sN%g18@CFb*r>)SRUy@<_3OuCyuKvSla;j^B7CvbU|c*u9gTWVRjnhu)wBwbE=EN(KR+Ao zR?E98ni_vsR+c^XGd8ngi_67^l|FI?mpC9RS+VZELUlkz>3&uQg=M|ou*`&9RIB0U z0f&3Vu~AD}Rb)0LgUHXD4qIDoR;#_%lt4LY))VXth`4{9-o_pRdNVXPfb@vm^1s z{79TzQ9A;6fseN1F$r9z1yh7!WjNY_>%JZngi}8b=DkRtejcx~0nBlWc=o_fkOc9h zJPt%dc-9RK#GavUTr<{<>-6j!Ux|GaD{<|3H};IRtqhz}_^8?sThz@i%2jO`DP!@5wyMODSy8Bx2R_VqRA2n4AL0D&w33f*g+&5L|B2ro4-_B2^sfF%c2abq z_=lHH*8bEF4DvU1kUE6h^@ecjmE7sUtvnR(C?sVizucEl{;mU;+|*5M;=lupX;R$~ zCi5O&9$+948j&>62?Uk&-12+5 zLX^WZ3?}m)a|PR-Px;CCvca!x^7|UQ4<-lo+jvx2`u>;_tdjw@a667(+{+bk1h_8Z zhZ|?Ml`rDh)+1-agIf-DfbO0cpntehgpZ+$7YopOONW`uzrg9i4rQJ35s4uJ;fr{Lg9DTBBRnPnocN&PSFn)BAVgWR zQj;x_Dhr18rNLAFLvzQ5hsov zm%vz$(UGAzeE4W=+OkPP>1a{_iqCoA%*r{0SXL6^&(~+h=DWoFUhdV8dXKU^_IzEyPU;<3s+k z$ErSrhN;OZpd%BXdq7L7^rqM&PqK^tWm}()3i-1DcD9>pYQ?s z+>FYtz5|mxqt{$#Wngc3Ygz>;oZi;US!b$yUe&{jKgt?~2a|3lLz-;4-Pc6B`j4I_ zVeW4vw5Rs1ICV-@o-}3k748Mp*U={M>+=y?UhW4~zlr4^JF;N#;UQXA2A~)p%j&v&nuPo^T4qBMCtg$O|tXO+w5c`oV%%2Bps~Z1d6Z@I(&yL;qVOw@v9 z-PBc|*aF*A9fEumI~uckzLL=W^2^1Ibp*EiIQ-<(Eg~WDgW>db0zb%9V_J-^P4EB^v5_~Q(JZ=FYutmLy1Vas=b@*>T$O=y2R8k}D7?cMyNKFiyEEp-w9 z#CLF|^kplYnxX)`$xrnc*~*GY>VV)#bx^$F<6=W~kM=P()Quldf7@DKikFW}dt6&T zF&0~P?pB|BF?!2~;_QXFc=kj!=DXWsvAZEQjIBhodpO1$ZH;N$V{lyKX5;FZsLw^C zx*Uzc`4|}+i{aWzH0nb!Sv?We#<<{HF+QoWcsVz|-;Zlv= z(U`a~UOqV(Pd;}smgZV9x^ADw!F4g%n~6pojoWYB9_u!2jeXZ$8?y`KcPWPI91~KN z|F+n%d86ct!PqF-wpfoA=lxMfjYkh@n_r|R9Qfm;F1t~X zMp4fRBT&5bJHHMijw7YGIX?#153~_x9CpaYo&7JFns9Gw_F}g$_2|StJ=aaHTJgt) z9#@TaWAkuF^v3&IynWrGtB@c9L6IE)9Eo?!-xF1kvg4=tbfuGK34p)>q;X9y>cK*posh) zwgA79AzDiGipEqI&v!GKg0-+2N4CqRoIJeFa2VV?R3vlEFM6=#=GBZT+!$anyyL$X zS2p;seb09G&+fJFm@Bz$^TUH%o;gqDyk$EZ@}K=NWjBVnz!X_`jiRG)1=G9J#FQib zk7hDcvYpK<`CrMDVQ^#0aj)cu!On$H_Q$M!FS{{{XCY2-uESR{<#aR5T3BFmLy_sf z%0XQKKGy?xC|589=lV$;zZVsgcI39CSGOVD_(8vVne2xUZ&*5M{29j=)a{J{@i(qi&tn)GB^ zF$_v+ChD}!9{ikP8MjNltFupW7zT(Bo-~M9P$sC)ha#SNi-;jXUc!U>9 zC}~!uhj)Z!CIvFULXRg<`d8YZOfR^gg*W-@Jq?UX$9~CJoX+&AUhx$#DFM5pmD{5T z^IJit!kh^F!jX95U-3EJcqe|sKiS~;)VF{a5DXZAEFpiVG~(^-(vs|l&& zC8e&nS0Vh1*X?#Mw(Z;!@BhIciTA$y&&P`|9`vOYx7~JIJoM1RaqYEN$Bj4MWCb7s z9Eu7CJ_cUSenW}Id3yLEd@}K=*ML!88Ds^IvgoCk4tm?juARHQs&3zP`{KxvBT(tf zF^(QNYQ}Ma#zPN26gS^;vz0+yGC??kF=?P&M6gAGWguja#$56T$0BtX#* z_2SUsLvh`;*V*s6=by7ele>z#i;1TJon-Yap?KO@!KE%LVV_9kHv{In$UA5-}+4vn^*y) z3GU!%_@>kGooaq+SDg1p$*}5A?aBR9eL~#<=Z$HyrdG)Vhe7d&9-4Z$N)8^Nd@ApyUZK%fHD#}ht-SXo6j#?J}ny6FRiGoP&l$h+W8Wl z$|oy7y`qyescWLABHnw&5*3`hij%IVdRNUcd(sL;r3;7gP=!c!Mf9*e+Dc8)QGCp# z+*rNY6@A8`U)K$nH6P>@+uKW_LGaW;@{Xd{a;^dOBp9C$sCI7txy-4vDl6(Hv_Lm~ z9ygq;Ar5tyVp(nCma9f%&o++XSdFpKnvVxrS!&0U=xvJL^;5&X!M44)5N&m4XD*Id zVLYNL+^j9drt#Gn85jQtHY+Z-%r1x*3#y8ntkd?HXH|{;sy~f-GZtH2ul(o3CiP`_ zbV}t*TTl_#mZL6SZP|H^vb-2`tyQ(oQH>>s)D6?7>Jm){V^!&o4>i-IU1e8CiKje{ zGa6c{Bl=}X52Ydo`m=J0dd`Pt z;DNES((;SyknrKpwn;ezt(r}hBA#F|(1oGqCYq5gtI=K^j5BKbFP~nF=TG(GrI~7+ zUl~%}(U?w~XBTSp=`4|9n}H?|CQV%u;pHVm!CdUZ3+S|=Kc?{1eeEYji^ z7QhqA7&#DL=5Y8!*|4&Y`2)A`5`wbNa+lr!O}v+%;Hg2BEA5#wOFT~5qu)n9HWC{- z9GqaR#4^rQ?=WeeLsy^54On_8_*lTiv%PgN&@P}(UyaFJhD;iY<(4S2!nw1}0G z^Sd8tgFNWKS@`qr_EflY+*GfiHHGsK4j#L473GY=6Wj8t>nyQIOy0)L14yc)%xT~; zH~f10wQTakl!{e;7uo}HW>NKbWiY1I&zxG;TtUzD(mjfJFXUlC2+Vgw1@dKPE=PlQr91mms#gk2uj1B(z z-RYE&tc{c5%5kz;OHW3#)=fkasA{e-e1w=csY%=1(ws*lbtwR{)HbVw*~ylb;I?Bup+YS z6R)zf+hN5!y$}-szbkTvL+D3 z5dskkIqwe`{0kThz;ucz37Hs)CZ}a#HKmO(tDf}|ozP7u3=a9_uT;*O`BCHrxAUWc zf`N#54hN7Rb=!3Aik}CB6h$`CNQ-owF0c$x0#F>v+`?CBrZYJqb1qMuK5$lLwvzi_)%w;*P=4^lCtY_e?Oj#Z@xTN32Nz!~Epa0s6Rb3drh&9zhv^qt;yuEs1rqWoPlOoG z^!xhPzwU#qS-r+;u&1AXIwq$ky^8MHXP%9zbyHSMp_t<$inqMwEnaztfC@ggLm)I` zxY@NMH!I{&nz5n}7?g6H8wZb;7SmZZY$GLo&Ix3T?w7vwrFiRG-)cb^gA%pk{N(cs*_yF#{YEvLB-CLe^k2L< zBc=;UcfdFD!i!(~wO>=&-4Zw7a+8&jkb?|Juo><_QN`Pt8YHs1EOxB2Wtl$%%Y-J1j`8F-Qn;b~j; zR;S7Nh_2@{)F0xoni3(5i$#tfJ8q>cbg-?ML*v=*GB!RG7cNBnn~xlndsE!F^+=45 z^eElhAAaiT z`0^*t#_ASH>zj5)Ofj+0WS{Me^>H=vG_l}JO)FDqX=?92J4`}8f}tnl;;qju^EP6Y z4?-})FE{6ELhVVo+ygz7h4j5bBNVF8a;r~NpJ9a<{mYI3Vj7J*!Ftu5k;pjT@EicS zNgF(*Nq$%9ePx7%4>SFtggQ)Glm%lIaZr+UR0fn+OYyDDEFzE>f80)fqAu}6?b^ya z%1+~I4`ttg#zPb=qRWb=0zV(t%nxWpVJ8}Vb|m95V~odQjh`sbNS1T^P#iEhWc&pW zeZLu^^zcJ#veFhUdUv=YI^6<>F@JDK_M+m8X49#@g7nE7IU(;W^I`?7_Yz&+YTQx! zTmmvYp>W0@^-Fn`A}jDH1U@7(7P2Z<@Lox&vgolDm!mnT2j(9<*SiWGMH@<=F0@nc z#m7po7Tu-OF~G$WMJ4ulNE?Gp-jyF#`my?7F+{oYNOmbVRy&GMJ{AQ2EzhPlE}r;C zZq8IhL8&+cC`HMG`GcE}Eh;k-qD+*U&qO8->d>J2jpcL7(}?S&+cF>NoHzC3WX}p( z>Y?g~6_26?WwFZ2^@Os~SnidYKEqIcGys&D%9i^dc#RSg-h#V>t+bK5T%A+~D)a7O z)9G8OO+BO>yh@Wk3u2J3KrcQJSB5{>a8uo_Iw)q#pB5`83pzi$`_w zcu2Sh)vvz&?yI~K?YS3@#>S1KFobq1tlVvMX5nht3K& z<~GFsuEy`1;<{^gSUK10Hli(AmG((9Vg>w)>T7qE6>@xFP4y8)Dfl=?xkZyvy=@Ln zXiOegIZ6gl*>T)PZCG`!sJonl$QEKN%V4JZ_pWI1d3eG}Ie2BK>Wq~q@Yc5c{3?#h z!Jo$f*KwChN+X*De92Gl1SKOsK3CE0`i+Q{^;d^?NA zuRJT9zpiLqZg*pGS#@H$8mDFlQus<_<#$3k&i*q!`5nKE|+I} z#j+9Ztfa*NPuZvPQGDu#{0J|*38()6%4gxpfj=b=CejCnvP~4Bh-8jLo>eo&C&H;W zyo1|m>hWqi)g5qi0gd}dy$M9IQ#wAIkc^Xm^(i@@N%5Cpz=>fFVGNXsZNhPh8aqf+ zbkk-On3Q;mCwlo13`~Mc@rV!KF~lQIuG54ic|?5!s z_T%00Ucor+W-YEO;Vg%hO}TND z3l39?gY=av9bVKGhw~7YVKLbcll`(O!O`Pl44U!D# zNVuoXlUMrzk3SCiFxj%JNY5_Ze68<9l}SJ#v}-V-yqH`n{|sJG06q=pxDud7 ztM5?8u}$U3;Ulqa`*vRva^%R-7#|=EEOc2n;C0 zjvPG_cieu56;{M09~ja_S;Y-^(0?AW^8 z(Bz8Sj!o0hPz;HF1Rn&bQB8QxUpN=j)2CyTc)`UN@D(ABi$4(Pxpj}N3vBJB4EUPA zW$Tuhy?8M;Zr3PE`B#FJ0N zp51$#H+Vw$AN|oES!s%b7J3Ln;feBctMF4U@CtbF!e{Ch3RM()dFwBAC-a(zI0s)k z7`NPfi`_52^kQt@xY?^M6HS`bs*Ua3z9s(c?>!dN=OsuF)#5#G79GorF}E-)UeBrg zXH*ZGnzuH+eH+Cw?SLDo4~fo0FTbdUqk4YLp4ho_N9^3O)8UItv++k?JrN)M*wOgC zCp((>jYW)WQlbAC8g)C=%)^roPpDa$QKbQCvZ3;F+m+Bcz`^mX@Q}bxyJRJ77liwyNa^b@Mf@Xk)CCElgXJdBU1t$LMU)@SQ%=LVsoIs|fC~i*ZWNOcq{vpdWP0Ru_oi3J%s)kX zegzIU_)BSHOtV;EJo+Qw1`=?tOF&nY7xL>5N;ScNN2~(64<}nc2`R>XCyv68{5T9a zEC7-%}xgmtK}Qt%qUHig&wa&9g|YVO)=70RT!#~UIitR zW`^$DiG#vGu%?$jUSl&1;L-R91uj3m=SxJKp6KTzkXQ40oKEAVm3hKPs$CRa&Y!~E z|3eewvg#o9O7*>`{)cK==`LxGBR2);N})I?C@nu|ycSL??chUe){`s_mhY)vS0oE` znSie@D7+Sxr5WL3q!$b~>9#fgvl5n-(9{`VQHZjlj*5UR!A;sL7nN?+)qIsoqC5{Q zomUz|n%9pgJ@s2C+S=*zBR+^#D(c5kSk;D=C-RaMUS8=4&kDXc|6Du*-`ns&@uAHh zF2ys(vC6Qs3~#NZLm7w6qr9h&mZM5X0bekwcj2Z|-{c=e;&u*Y4O7mD9{l8acS zB;;vDr^-iuTrxv`eQ}!jna=a0uF1{OC9Hf@c~$t(fD#g#$OAVgt3I)MABC*@A{3si zNc0L!%1mh^f1t<}4Xl#yg2R=OQWQ_9H?ojZdg2Rxu_yeEburMMH!mt3(W5b`M<3@i z4VA7Z|DuhRnxellG9h{>i`5twpKF6lam(IKQPscKTMSf#``+_qAr>#InGOSD5X z#^o;?`uqqX-5qs>FpQNsB&0yoL|$+JRfO^JG2Cu;@E}NI5|^^>G^>;y;O^Nf2dJeXgsx|8f71fKhm`k6f zr2K&df67;MqLjq#e%t_s4V`3C#^V#=^0Ok75EGojFEhZ2QCzw)S?|V%;a=<*Vzu8& z>>OE@-HnZ-T=3D0iH7QbK?k_aH|PP4Xhc>bJn@JmQ+)x>JW_e#=QI4M2YJPx!XS^D zM=sI|&P21kU4GODe>A|az?*IUeEEw0fX7fa)ETg1{6UlQG&#xx@kv95`2}gXo;Xal zXrMQ9UiF@ogg`@|Ea-81t4=2=l2fIJ){Y+1K=B9)MHj66h$?r&g(+xJIe-sCo}k6b zKt-Uwd-Y?HcTB%d>(8`X`71X*l#R-im6d#8upzE2V8Kr_ZHs0;h}7iA0t!|Fk_E2m zLGjJ@e(LR6b)D18gK?@=jT1|iIN2Ihovy^0HmU!y6@V!NuV`KoBq!JB;N^zkau5uo zH|U%1A>A@KxXL(jgQBRTHf!N|2nQ~QmED-^&N#9$y@lsxVMPR6WkdqXaCqa+v}JeB za+&6}aE_bPkZq>|=pYb4Gh7*;<0R*0ZcG_2o3${1mQ1-^zGt&G!@OsMe>wcSF(-#- z9NC>K)|K#-3s?_%z^0u0c`3tVcrW8z8&(*Pu7rULk2QtePs=aKZ6lhfPdT3Jn*6fc z20sMBB8)Y?;J0EAIN1o0yn7X(VELNw zEy2X+QRgUs-y|$SJ8kt*x&=OeO;#t*K%gF6VFU}eM+Xda7jDDIc4sU%#{2^YcLA6A zX_IYC;h#s2%iv}DGg5Wn8HfFVOM@iFvCL~+MI4+3PQ!s)FrFOq^yzi%B28d$E8Jys z$z7>P=+wg@(}*5cCfH`65*%QFGckrQ1#M|iN?+-cP(XH>ke~q6q@p0rU!OBSY!pXu z3}7po{7y}c#cN;t+W1?4`)^qZ#o2Nn_`nCeRrc9uo{7Kq*Z;b4@iiX>605Q>r1|Kh zk9uX-_U+p}P_l}Rm4c+1NY#L+2Vw8Xk>hdn=#hBa+urKSG&r}8n`FQBt*5M*0ngE+ zN3AGg<=(S`dHVwocwl8U+4SkthCw-mKnz}1(XqYt@Ug>j+by?Q(S&eJ7;$*#L2-q_ z{X4(&J63SA-8U=m2q%oK%qX}xe~@=*K^f@nx#H>E{G8!YfPM3ukH%m6@gIx1g#}M+ zfB_!EB!T+S5q`K{lRs&o(6sPT)c<^-HY*Rm@|CZ|X3ig~H{#Ht!|{%Hy~Ag`RBMCr z{BzG+fyh?ejT<&txd|T11LY)kR_>w1M2YtszwsMZ>~RAzO4ntjk6@1A2`qvUWrz}$ zcj9rYGKyOGL!RIz;ihfV=D1=14fZ>5;D8lv;O8Af+NmD)yc(00e<+ioGjA2=>F{wu z_NnPpR&>H|6v_CbOy=-$c*)AkNpAIRSK|NuE8mFC8%OnCjd#C!M|7;LPzw?B;5p|+ zwp+`pKZlj(oa#r!_}I8FnYr#d(X4*yxdYF8Wno8d4n^Ol`gh~LtD`YAu5wz6FMQ*C z{Nl&v;^QyY)U64@m>OPFHn;wI^3G}l34?{;=yt?5A?44jWaQ;O040g~9f`D71h{Xs zLcr4sO{f(o)3126^MqeUe6etAT*=E7BqxbG`(uiCMUnGTAl0kitr8dXPEP>{tto zK$0zoXdmEfyXZ&?Nx@Oj;=jZ7q{$mb;V9vVEYt5dOH6fk@RoyoLkBoK=~&SOMsi$5 z{OPitmo#b9DB~z|3Hjjm$1fACclD(hCMHZSx|*!9BF&0Jx*4N^J~4<)Fm|HE@))hS zz|)@>N+zZzy%qIaUO`$_H4;3EWwjIFtq^5Jj8}+@e(IGb%-;SfKDn5D!>?=^uQFv! zcY&&I_5`c^dG(v?1ocyS>MUxmJsREioZrzMWWfcq_2@&6Z=0zddeH zu5t^w%CgfIFV$yu8FxeGY#qz>g zD{Flr5xIayRYDZg6csr9frIvgYz7PpmJ0b2-#EJv-XTxuF+G$SGKk6~hBrk+@#~!# z@ns-hwSSYw(pHR&j>M*Q%{YAgjK-+Z*s^{yPMx1f#l~#rNv>LIpf2BXtgg%cw>U-F3N`8_O37JB13hX&9 z^^kU&`&05vrto7tb)OGw2%_II26!Q!=DI9e>3cfrFP2sQ=Vm3-U0jM2XIJ9Hg?3D< zIbT>FiX|V9pgPZ(s=DtpdW&uPRs^CDczI9ZtNIs$JUWP4&#~&{pF}-Rd7_tZsh>Hw+>6sF0bBJr zxjYyrtpwDwOv?W~6o3w1iERE<4L7^$>cE1TDWY= z;h-lhC$ko=43lx$5TM6#<(Vr&A6J3Mc@Z2o2CInLH`%WMvB`cI?6ow&Gaj2FBI)2R ztnA%4IX))CWV1F-KOcX}%$4ZQ1~)WgXLp%r*_7j89EK;3Y?n=ruolT$xNO$qD#tIo z%kkIZ%kO$}lzw@X3$lQ*S)18x%TQOSr%2{*s~K5Nr%1$Yv0U)NNt`@MbP~YoaVI4Y zEW$l1=%ue%lK>}MU6lkob*T)S(2XFA#73BDBVFE;Fqztn9@?wv<&l?Rv%hTooKKnZdxm#= z=Uq>3`!)^~I>9jz(3vaT5Qa^iH+X#3kd0vBSH>yh)e181HZppF@dLJ`IF#GTF_BO4 zl2zbxn0|`>)J3Rw4c8icS{g7q8cZ}{atsDi@}^J;Gv3ywcxiA|iUwlvl>_wDCC5n< zFX|Htz%;0e&oU_MAR`UZAYecTmP} z_R1v`toGve-`#t5TM_i~OE1}G`|S%aybw=6^Gv+^&;2>G{pFWmipj|-E2M^ohm{^e zxALX11J6F2&hKlroEAbdxJer~iaiv1`5h(a2bI69ECeTtMOLlddfRPk5-TxtamK;{ zgFOlD$3+Gb%91I*0qjLV9PQ&6xz z^XxNm=N)%Ce+XdQ-b~ZvR_A~Bn@_~qnI+*FiVdT)@zyup63eQ)Y&oON_B6q(tBk1k zD4!9^sF&QPc=6(S)uV%=r5c+zZ&6unj}22B6~8UMd^3(5KBf7?K-_Z6&2jy{t3(~j zj^+5nuPnsB_);$(JJgApMYSc)3#_rifPO;4Ck+__nKY9x(VUjEpu87NoC~FijN2;8 z0Kt2LK|jEXIurdE-=QzS8 z%LWix=&?+;1y{X5SB{b&Jn-WszvBQuE;&s%ZUlac19X{Q3^tF-CiQ(e;F6Pi1D}jt zFiui=N!x3SRB>uJK`Do)>n^sX>>m-OwKDADMy3Z<9gc=eay z`#3p2uqpU9h-tSf{|*xl(MiE@&Yy=6!MH0;eO*uE3}sLHX~F^xMLmE>d3pS03}m9j z80>Jl$rrS`eQH9FB1SMh(c>azH5WVvj(^azLW{Eu)#j}b74y^ht_is&$`#dr4kD*6 zSOy?Xw*4}B_E^pb0caFsz5P|;oVy2e;D^S1#nh|bQB1*(*7*o;kr&;f&GmcXWW>;v z!XXT~Lb3vMa8qy>1)gv$v-)sEd4Us>Avh6zc+#ubEO(&9V&YF3LX+BzSG|cxtW;5B z_E_!Pc2V9zi@ae*`e4cGyD|BrbYlWc7z9YYZa9n>S2rEJpT;+7UlRJQdBKWVFs2UJ$TTW*6r^mzrp z{fPgy;fbihpVfufGFFRM-?A&3LpAm5)U8gOJ9klZuu82Rd#>8)a{$LihhliBsd2F) zxP@3+T=uaY)Hg1QsTT@M>TpecE9d92(uz7rU1Q}9AF|M)a_;Qh{DN25vnr0&eLg!) zf zsrE|0=hc(66Z!iLUDX}7HUo?NfQ_=FEg6e)<>-%gYsJbuO$;KWhmwyEZW?pF(?;*!W;)2qPKDFIRqILN#0O{I8H+_bk5|LeaWb~b zrnRY*z0$brmF?6p$Rtm82#?^+Z}Bh{zv0wK6|6Y&8xq=0L!9%s8rw(OKHm?e-!?rP zhPc>6RM!WPA`}n0sZY>DI^u_uNPGi7^rLX)g*t=ci8_&2{-GGQ8*m~EuU7)fk2g$` zt@Oxd4D{tHdYndK$fKiMNFiO-7}ckm=LboS2EZ!-1&kt)z6TtvmbKDa;ee&p?Xn#u z#kH+=2g?ae3Tg7JI%HryGAQ~?j68_r3rm!a>yGFr#M{yhjbRKBG<6JIj!Rm}AA-PR z8G<$e9e&^kN;{Rgm2{kAp3=nN?;?T^ibpvJlbBg``6LBkK{V+x9ucfJ!kNE8C$y*4 zndFW3MZ8MP>wS8u5~r63ErcVGWq?LY)qNVTn6TRVPkUPxW*}>3Ot2_q(GGO(@&se z$U`}u41$e+e$Q!Q=WyF{AY{9C%Vd~r$~Z8%v&rs^50l}`@0grEhOmt9zqcvVSk619 zoTsusW-Z)Wm~uYXhC82f6oS8vZTVS9%Ys{HD zapp{BBYy`Malk=mWw#!@ooD5*AFY6OeU{r<$1O*OrIXD(aeL6aI;1`xceY6Zm?k26 z5b~(}2zLN^BEY+ZM+@&7So}p?{#md^2=o_xJrbzX3P8bmtFQe01u)s^pcPgRCS{@! z8Nb6N;Q5Ro(*~W;E!#B9Z9n)TH*~>c@&&K3oqysc%eMUlmp$DsdCzXe^++M(^uUt_ zeNU#~rA>yFZG55`_#AAL!hG|w{CyZOUhV_%171&&M&ICez6r+z0gtT#66z#;^4-XT zn}rVzHl#t88I1Kt_KTENa1{ztuK@s%kgJAWW21;%RTeZ*#KoT;t!JQ6*t zkR6*GjoWX(E&d<>_n(V(>!;$^fAv@6?l;~O<6~p-TfhBV@v}esvsMhD4C69>D=I4rZ@lTIxN!cw^UQWt;&+rs6k`^C1rEJDDAyi*@WJ@8 zzwl#LexY1Lsdf19;kf3SYoe|h1}oz5Vq~=4ULV z1IJl`=}YQ>6<}sk=72+y2OP>k_yTV!Kllj_ z%9#A(2P}$0@Sv202K*7ippi>t_U_rMa_L&JxM$BED^^hkGD%}Q*~G+XoSo^$um9#l zv2JoCMut}7=BozdmOEdguA&gS^y5{pY78jnYTUT1_61KxmX*yGgq6;bqsQXtvEy;^ z!UazNU;V0A#kQ^6V}4=Q3h##>`bKQsu{mzKVSikE?QY?zM{BMfAN_hOe)^*;ar}(% zG*s&*)TWrAF!?~jrypdiAa$H3tBDFNvCFw{ngp<_faZyUCF$PPM!fw-e(Hm)=#uS^ z5pt$JQhgNti-Gh`o99&z-K70_l%SO`b}B#uz1V!o7)B;F!xSHMc=?Aw8MjxZi4%0> zLx`-5G5P|K_fkCY`CUmnp8__0$|v4x2%<@TDgy*`(*|w~D>675EVbzP^!XhK1-N%y@w{~Cr)&gI1yQaQUw&d9^l*!71?8#6Jw8MV zP-%#65Wo{?rmvuEy9+-5&onDe;cu5<^N%E6ZpEuJ-A*Tc5pp+SBqF}fNz ztR!TmC$g2w#_daOO_9_E)jfXuLNJt>UgfB|r+8i+hq8qF#K&AEKoZmyH#*9(HYOe` zU&2p4uBZ?3S{%aa;|jZ|uwmg^6n(-;I~ERK?xs4%5f($LmrS5vchgv$IlmH{HZ(oy zt_;@H&(Fr#NG(Q&N8C@JJv$d$wyYBlaZ%+mG*VYF*Mjrw7BuFu?YF5hkuz(NH@N(a zqa7N}TAVwh@nn2Bnv{*oj4>631+Sq#el=DPw!E5-8~Bl#l5E5(yPn2_anW_@ z<0=XeAE%)#a|U3#$V~DAThAqrS$-0)*ugMZ(WClr8A5PuePsm|V~mh_obie`ibpU$ z2T%T1st5Zaf{sm^tr%tv`Ck_EmCRQG*(iOYd^dI0i6 zK2@Ab%p8%`I@LS}Ue6F2vajOL2Op6Q}ilVX+tUE7fSxq4UsZi8gS63m#N7PE$Xc zl2w{=*BW)v*HCqBihpb)Z^WQvHI#$cgMuAUy|XPIB&8qxQ69UMSP^o*>vXz<(Ndn5 z#Gm$RHI~$Ga`xkj=!O+2KW%8Ua-xUa&_vnSiESwVhC6a|&R@i)kycEp84sy0(Df%} zTvDtV1)jp;GQgwYA%8I1=hi7b>JR>u7xe>o_5+vY7#px8KDjJ0vQhlmlm3pjtUr%U z^7EWQHgq|L;8A#^3|Byk205Z5ozY1@pt2>6A};ACI8hFN^pcf-P?i;)CQlY~0+h$V zC^xE$&TY zzpAp}XO>4(-cs3kwI)hid89It)A@8sIZ1=a&F#L4_bM;t(@H>qTt?KfUYuJVh*L`y zZv#HMSc_A7Kf0`T{rxKd0VlC+crT+UGLHcAiU#-`z9ufF9NahZw6v9+{b=7QnQSsX z=rVi}sqe3cEG2$j!i~vUB`onc!T7xZ1g|T)U-aP4NaW7Wj4QumGTv;8=r(0I4E}wz zg~L`U5*AO+3#N=G<0#vh48uDQ@iArEGR|_mweNo%vo?O_3I3U`Y}Tfi!>>fg+V{2Q zN^#3}Hu=3@{smBmwYlu&yBJ_GAk2(j8yA>F`IZ1$%f zyZ#n&5!}JmuhV$z-Qk6yb5R?&uud99XXE$?;B;2TC4U5Uzv9mXSuY6t^lAu*_6J4+ zEFCHWofUU__t#7Ofx}OoCSU3OwLU5Mi0{>Y2;dqld~P5@zQTNSum%w(5=pQoO@wzj zNrybp zN!lI&6b@gQ^ow>+&_TgZzkKijmN-Q|jD#TEglj-VfE<)iE8FP_pYiCIuXj0C8Wc+d zT=C8T&6zQNWdcAoEYW~BZ)}}$^)L>E1$^NPWt|4J^tBm93WI7TuG+iHtNlLop`Y@Z zdTf>bDY-xS$xp`l^B3YLfAViw2{t3adbo)Yp6KK8U@Bq~ofrm4zTQhvwxS4{QV0s5 zhaP&!+dp6P+Shn{>8-ck>aDNOJ^yS>O|J7zuCp^UK6{Y!?>_O#PsR27_Qh*n{c0=O zEQ}~UP@;5Vw@>{?4JMowP(vQc64I8~JnUw`K2_M{uR+senh%Z4I zj^)-$96xb9ZoBn1pLxi+j0j2yH{`b}ftD4PL&HNc)NFb?>@WV}FU8;cdp{R{^s$eL zj#j+x^{NWjGzBa9$lb zp)V$oeuPy#f_K{|lPWa$Vjih&d!mOwd@cA!8M`g>3cDR%yc6o|rPvbBN@G4j_)e}o4&6d=ph8(N;2XLU!~oNZbN*w>_NGqfLC6tipPgc>MC+gr6CKRi$0Z+<&*&wj0=Jx z-;|Bua94+wCW=YXqsP2qHw5_*|GW#LF{Ge+|F(W^_omKxwWxT=wqjNky0fS@(;13_ z^>$ynjiF|OpHlZ$SFJ1fJaAtDvH2} zeOsEbal@$cHW1?@O-+K^F+aO#Ma}3)BSywX;>G8V#kTEJ(Ht6%b3N-iyM3gMI&c` z(TAc)vEl*F$c^knzshPgugH==T;t*g5$<#tt9?{};80+})4akCKChKs=ogX_MtRf& zEPYnrpFiC20cAUNgtTSzWckc1rJWYxD6LQcx-g4$#4o>@62Xaf>N2(~7g+!z8Jy74 zRX+lc;N$$#O3ckK$N8C7oST`C(-)Rw`odz&E_Pymxfe@n!tl=N2m$4(mTcN!QC)mP z;WwgsGc0*yRL`*5HW$)0hMJO*n$gsF-WWYcLlZW+;PC8hqVq6;`tr~1TP zuBcm-8}q0_jt48l?~Llu^dhSOt8r{ePiruaFDYMf`_KHmQ~tgU$(a>0BvU+ikr`fJ z(GYlrxY=AOZpNFFEl0`kWwX{VyFGfA0{Z@iO)&MO{EoYC%i+qX(#ZZr9GL8v>tr@%_za7EnOgwBSaHL95s1aR{qT?}yR)55hR^xMjlrGY%W=vum)g?h zHikx(-`C=}k|CTpm<+#`mi%C{jd>-1%-Z+0=1Os~GY$D!OB3a7J6Xxdukilv2Ea1H z?9K?X`$};6!4w782g&|2{mw4O#pH1O6z{wbm!_(?c!!ZM5=OwJ>=4e@dr6!C1Z^%x#^ zfgczw{iMMsC%{vbmHZi8(!gL~B|#c;GxIcwIS(n^w)-kz6yO=E28L=|!UX62i4Tmr zqJ=|a8AKV=^FYgBV@9C(d4}1FMbwD5oDg5_=Gc)l@3T(DQFP% z0Ie_tKjRTzgz47ud~DdTK5o0?4quY-@Iw#B5B<;&$45Wes#+>({MM!o6UCC!EVE9((MuICu73OpJ}i`VAXA;GaEn)&ls@$cPnU z=P#W1jkMQXeRVwk_~Tv?xL0n3zK#SagbEZ-!-7X3WVIgt7JLdpDbq+f0*gYA6@15! z9hL8Z&z%Dn#n#J*Uyf&U5DTDU&>iH}S=Rwp zlCUC`I?Y*v;AB$FY7F?wL~#3#9V)MzW7DP$KGX1PDwE^KPQ?EG*T)<0zT3*&PkihX z@xqG-g=Z!9U9&abd1o#D!Ji+F9itJC9MEKDNrF9RuW4e)1ly~osBS95w7O3dRJSkr znH87XEu~K7@Ed)L9A>F(gm32k7`iye?c*ryOU*nP!riYIo&`)Qr3|W6NedXlXd3`r zW)ooQWD=Y&b>NkLiTCVZD&I>+et0X~q2xn!F-da%iZG0_sUN+Nu1t~2B^0V^PJ(xP z;1(1w!r2o}JpC&?)NjYJe-YviR1bYFjj^EFiaZQsohGj)30gG)RM(b<78eR2l$Sgl zUGcyV9m456kq&*lGDJ?g^ml4UPJ_uk>B4uHDRK2rL=-dNpnq50NvrErkDQP&p>$J> zp4tVg_oz!f;ZC>v$}KvQl15_yL<`zm6!~z+wodSi2IWY${5ji=m4wVtP*lqg61{~K zB_cGLPbl0thY#9N1PK;p7TaPet19&#rI#j+^)b_8e^$oP?>b%44v)l0D-OMCuA_Xc zh_~|Nq8+tGr?0RIO0VXm(>L9m1K4YcB;lwHiw^j!e0yu?h~g~wwhpp-70m6tFk?k&yot51j?YAbzaO(ZM-zWrDRB_q5u z->9o8p3B&>h2#m>0Z~W&2PX;#WVSl=v}F@txWphGUJc3 zS6Q->&&noefb@h18;8ogqw-l^>1u3h$Hwud#`C27n;09770EY44YuL2Ls@*$UsGds zYjIKIz*MZPwuOS@Hx|-v1nQXTMo0CN6uiPrX|xsA9BM?Z!9^qL)71u`%XEuZCXKgu-=Q`%0mm8tz0TLvjF%3l35@RTTVRUauw#*n0hRGo+50x$G1U$6{C9RB@|!b`DIX%ip(4$Jw|!)18xBxKBE=gFwe zH{Kx)wB{M`qz9aAP&!^=aJv7LJ8cQ3IK+zrgfPdIJ1Gy1LAVP36*yBG;)~ibt4tSB zDl5-RE4^4)h5O&P0`O8|m!86uy}zsZE`X-KFyzQ~0gsi_D%+UL{N%t!O3Z#Xa`a*B zak;zfhbhClkP8pfqbI}l4PnW$>Bp0y|0<$=TRg(busQrPxYPmK6rHNWiHE_R-?1@e zzii4d*f}hx&3krdvo?Mi$6B-2FTZCTIW8vSDC5G;?mrPzMqYMb!K@9+@7Vb%)11v( zf9&sSVDc*guSJyYvR~mgXs#Q6k(J@FG5Nhnv)|#!wv%ukg(I{k&%yvN3t=L+M+Xbe z^-zAcb0x+UVYX!zoe@&8SMmX3njNS|oiZJ>{SY?jkc+VXYCQ%f!i#wBTnWcQ+AjQ{ z(S8!b=zWO)EXh>#yb zFTyCwImy8i)VXzaAP&9!lDB={aKrxi@>jlM<$YuH_Lwb# zH;uBPft6+l555#L7ZLa_`fR{$f}a?l2rg%U9$-=6vAT|nMov#p$4xiiY&y9u7-inb z&`{bwGC%K2FQ6M-@a*$n_`C;K&fk0HnP+_21eaIvb*>}fiU|S&QlbmKN(hlZG=qoL zg5+t(j-7&Id+aGIu2{VWUxDF*3lw0)N05=H2YnCfno!MNoN=D`;>|W*zB+Tm@vr>K zufz_~xpnJi;af6qNguN-uaGqS_#KQ0{*@5;tTP_Iross6L?XOQjf|8z7h|AR#LKJ z(}HKg|5OL5t6eMqPz-{L6_zg^e9>o1rW>X;jYe3Npvz6a7v=`yzkc%Z*gVyY$r15o zwH3|b(b#|EO`cpaK|?{eZQB-KAj56TC>5cH3q_uN_GzzLWi{aNuqJQHABW8&h*GAI zMcL8bnbhssvpa6R<+hlbnvAEOdOE)T^=~L&OYx3(y(@0qe?y!)eKJ1ziBHFg6DI{T z9(Uh39zXl`M!aoTHx8cc#o?1`(=3uf87SJ^R8`MW5V=29dZd{?Bv3-~L#bx|I3O8j ziABF;ufpHmK{iyUBAOFILZyzW?S2A^R`HQ70;7&@yqlOu5#|RHLj{3 zbvzI-$&w2o6mhNxgfmX)@lXv$^PNeV;;4PGm6NTEl}4fbajIB?BTbgXnU9?`{y0p2 zO3h;h{;KAj*5SKS#?tIfN%yJ3L92kFXyG#I<;!y=_27|8~O!pY&yiNr6#r4@iE z2*qd81kQYB+pXYHI%3pblR`}CD2`XBiMKw35w<}y$~Zmd1AJE^tdvWYLWR(pOZjB% z?kqTrl4kp0Dhs6tWrSChMgtm>qA{vt>VKejOlgY;Z2wiA8W>jJ+g4x2w%(B`;T6@S z&$e8aqyhuoEA#HZdV@pqZV8Wg!;vXgM9N?Efg_cxXcrB>8JKb-zto}jjQo|36?@`W zeaM%Upmg+Z4C)B^hmT}gbwZPNK~aHXfpO4A#mx=`(&0&6i`u1v_;BHmUQ`MBpqNShHu9M)SnYD7 zx+VO1>`O`#$$7xLauN@@FY(ZkfD=qMz=IEiLecVv4E~qGGJX(1Rf5lkHi>NK3q1;2 zGCX;W-tD zj!egqQ|Dq@{ugIwVo`EbZ)G9s1ItkxScuWuatsYF#pqx=Mh07cMyty)TwRHYW+y4% zM(eSDqM^D}j}7BPF*VkR@sWB=j5cFb_Si^MPb0=8D~#|AS7W$YjgjV{R%7RQFE)?1gh%y-rlR)5>P@yyBTrj->_=@yOrws%Y4}T7a)x$C^%BJ{H`T&R zm8$C_-Lvba{-|SKm8L%{uHe3K;N}A|IK3KEei#&D$T!H zSsTxI^_0WQb{|-_>F)MVciTJ^YBoifQOIo@e>s@QAPr_b#4~=`f^`?0+Z3Ic+mpiRj1`uY ze#F7A=;Sm2q|S~wvT{4jaEwyWfq;l`YB<8=796Vt^kRH`v4$Sw%Wgly0gUqlz0hCK zosInpW4eoXgX#yrVjxKdK4)HI3fr*q$2MpIlhZ1rz`Ga(Qat&|hD2b}S&9sdf-w(; zBh%tC2d;QeFY=a9%9dZ*pk`2E2|HkERUF_9CMgjHn53}9KM!~b-ikxPSiqDYN+<9! zuzA1(1rUXeLBQxB2up}e0tx~}Iuipx1W%M%ZrgEs~`cJJ9EJS*|VFMT0yxc>UMFmoYBhes@|a})5Q1pf6KH&|%lqKoSV z!^IIO{@9WVKF*M1yAEFtS^b5(!6Ij*U%t5`z*HB^%pPIUkQN z>68I0GEpY7HJ252U--fooNwr#P+Yz=f9qS{ijyZ##lC&ldFA4cZQEUD)D139dHCUn zofi~y@B}`vI+Jt$NE3f>!kbjj)S`=eV*yrfXkj%Ucr1hp9s~b@VM{Q4M6rtU4<#e# zK5`)nc#?vSv!Iq^!={b#OTYfv*gRQ@q1rhKyeqMydU?mIZi`LICo3*!I~`4Usr%q3 zJ+=aG+_>3WoLRZZJC~$zVG4?7E?5~JNo7AWGMs1=?ODjBov<46I`Q^LCJFATuM}S@sU9IDx+}D7Ls;Ui4T)!WVI{xhbP(N-CZ}{4w2x$pJ_%F6Fy|+# zO$N)zioB<85qBvO39I7l^$&9s7Hbsvl* zoK<6Nodu74eXbvTBo6e|G)wQYdJ83ya6t!KT9rmxeI{?=Oc#xiZ{b`)c_Tlz)N;-p z;m}9|@VPclO2SVaQ6Ad!%1=$~V4RZ|+jtdE9Zrhp6>v&OlVy}>R{Wuyu{N z4*5husI;l0(E!JaV3MB*)xTg=7u;V%oA7uWH}wmJA8B!^33UY;6~~vfDATGk=n%5vKuf;_fSpT#E^krKmZn{1MwQvSJA z%9DPD`;0!t!_Byg;hiyw2S4`{LPXtS%;MM&*yl6Ylphowz$QFKk=*<_9`A&U#SkIG zxJ#OTrzlj1p*`c_F^v0>q*O^Jh4FyUw(-cuP$xjBM12v2^1C8>ms@SgGYfJ4-1#_u z>RcQ-b}9}ZJrOS-J{Ct#oQ%`crxkV~W@j%(YjIv_FGgK$v@ZE~xQ4P1g`A#BTV392 zH1yuAikB+uhT6)A`oZy$MvRYfX^S3>->kwMR{3%%7{{V;PBiC9Hiw&5-Zt&0FrKE$ zTCxXqX;5u9$;Y&T#4ijY^dNav|1ww+4XU!xf}(J|!PAS$A<2MpPw8QcFUmkx4YI0m z-AFfvRQIa%>*^0`H5AiqIZphgoKgPK%-ABD$|~(TU~4oVQ{iV%b(Gs_DIW#99Ibp) z80CSY5BbyOM7hYu>X)J3S#gL=Mg7JZIX;f^Nc@&m}ZAj7Pk(!y(b=6oo9kgUfv|DN1NN{>*caU={nW66_2lLtD7_!SI6Imv97P4>SGb>C4kYyI*&_LY$H zo?(iLk?X1Jv)s9@k`nXM}p3Dy$-o+2#t+Z1Z@b<^82ixH}Ug1YPJq&oPyzBEP0T(t#M2Xh4 zC9J?}dPFmEETqZL194H-#b62?U(Owd0VRV1Jl3QV;RgkVy#&dilLlp?6DJLrxRc^9 zJvl515afY4NqEc(!8|}`fiD}}oesx&3vut8-xB+--53AsKmK3heeZp5Y}>Ite)*SwIo|r#w^{IATGpgYI1&ws zCX`YrQs&tb!mYQ($~u&e2UZ1W^WI-~svPoqV%uj(ouf9^$fM418Qbfr1EFR=|Dni(iaA zyY>X<19jRf&Qmgp$J5i(R@y-mLQ&>@`ik3)H{Nqk{MK*%wkIDblTd!~Jagcg*tK)F z@Kvp-v~UjZ6qidYP)uI6cW>Nw+pXs5vEwJa0`t(Jmn_`ge#ag00fd_X81_dTc*Oy*?sed*i+g&Hd#=UCsbD#U16=dWK5u7|8Xq>NZmc>45o9C+@4@^ZT-UmcZkTl9`A zt%hh`j7^(2#_#{ZV`?*tv2ltmZ)!i9{Bkh}T?~^rR#w7WgnrT^AH;|Mlp(@4B#(@Y zTH$!Z4cCh|*O+eV%cGBeGtQhj>-4_cP3H^g6LKXFCX1Ux{xuSZ}4HUKl!Qn0lK*0lJxT5cnx4SC!dq5Cq zJcf})xIFyP1~{4x09MG!O(bUS{NpYj;|3RT@Z&X`9FII2PL^Th20qhI=151DgXwBb zt3wT*@}nQydJIU^QrfgP(qh%6Bk7g*l40@$yHeVW8#1Ovo zn*y92wuve*uP{n!sxOm#YkK)1Eye_pDBP1z)u(i(TwOsLXEiBED-ly-K2@K;2 z8G%3YWbA=Pk70yRzEmXn5mAArNd<^fEx6GY7=BU2sa|{K|Df8XCdFyI7A$AmK_6*? zOcOz`{z6HF;tQowRdG6MODGA+Yef@X^1-Sz6j7Q0`xa&@BK;t%+hkWn16z%q4^|+$ z;!7rIDorwj@(Mp>49g(Gjk2jiBPsHv{Pr573RXCD60bhumB4IkYI|H4g8`-yhyA0`nO?Ls z=^apCI8v*q-yZbX$1Uzv%0;|$k;r-W>^UXP4ZUoo?Z(o=TuiK+P!p(%Kjc?_#RXd; zTt&xueQD)7XK-=rEUUv=ZAd%eyg1q?E2i4*mbd64f5372cyA{bE++kKnS?d0s-iuw zitkM3>#EQG$OOMcDB}dO6XQ%r;}_$FFA;&K!b2Fi@h4kk4jI9W;)l%Y-{%tQwXB@t zL!aB3{*ix34?O*%+6K(qPLe@FqlFrpdSx9Ph-lf`wShFFa*s8b@9% zXq@GiPB*&eV{B_DQ$>Af%yb}K8sZ;i!o1KeAjqxjO&UnEuJy>-1qJ}!%sCJ`S>%~~T8)J=LjN-1X z#HidO^7D{PyBSO??TkyYk?DMUH1!vMxBVn5aYM9a68aiFN$x`tsCPYFTEzL4)ZMK3 zbJ?hEK)=t5glG8aAzdr~oJZx!oJ_bpK0>2@T((7C^F#kb`qW)y8CMU{l;#wvE@W8J z&bIL=71}s9G$z_e!yz(?r$5&*z41#BB~3c`U4kS%XuFgy`SSdRKfRkb=2yxe#(5O| z0ucYy9|;Er1tsHh0p@V0SKy|r%}boY4~9ymE&9&-Dl zADN`APcW?LZ*_WU3ot7H)hEu&9{dwi0Fq9kTa@5YnEamTNOt)ltPKBcCP&UdxMloW zxchkgqjx zINO+vp!}ZgvftWp%$35i%Q&(r`4}mrWl~rVO*zUw-9agA^}T zf@ABw4^y}e=bz$*Cl?xi)JORl7hVMnR^gRk3Rpa;!?|4LaL4QjxD{|&yh6xUrc-{3Q4S7F-C0rbRdqsAW<%nNiB&)gS6SjhjcW3})an4f;{u_%j|lVt2B7 z+#js5p^Z5DPq^R{FTh~omcea14KPld!NPVCR>Wg4wi1ttBz|N7Sc1W0dN4)AV$iYR zV7LNjrdtn#V!gU7p(iQfF#d|Auq6ByIP{(dLZQ$@_83^xfI~duO8_>%oQUl-IA^+G zLlW*f9@rTelj08nA;lXgZklEC!Moxxv5=c>sR(-O)~}cFBB8m$3V~W2JN9ynjSj_K zcfBsQZP_0G{x|-8eDH%GjB{tt`eKkb-SZ|1UNvu(H9pbcl!Oyn5SmfCK@ZzNNPk%m ziWdZ2=LVkWfBpImv2FWSD_Yoox_j4dhn+li(uzIYtQ=!i8iF7Bf59Ju|R)!YoqevqS6pc(KP&zIwF2s}sQ3SZeYsyOk zU8`+ez;f9KcwnbW#8rW99xdT`{p(-vGjU#c{`t7-sy!A^&M6+WO|27N#Racr8zG=f zs2?b0$=kT#cJ165ufCHTc$a;yA2%|?AGYjn*|ODwvuQxMHH`xUh zu@ZB@Wx>imCTy%GJ$(3x^7V|*guHlhMm$>ZWid?hc(~;k0hcYm)DP%}Z@W~lIH!@i zaP;Wm_{KLMjibT=?dw%8xn5!rJjoCEP@>*;>n%?I3t#wRJa^!^xc~mQ#a*v`ZM^i- zi}Bgdea7kRyLMZA;MD{1cl8`S)s1f*5h5lAb?Uj=GM0aec0xifgCv+%B$poO({BdAx(rxP(f1VKmx&PeOb84ID8m#0fTz{kDfkjz=(NQg$Ki%oyp)uF zastM!7Y8KIR6j&__F;S=uBw^SDU4UT@s5S9aO#0s#gkzjD2o7_m4mn$d8QjQS`e6`;0@Hi+QLY)d%9BNb#yU z#zZC-bUmxQlK_5%3$DlmN)|3Rq28p`Sb}piR2-Cep)uLY8I4(_t-K7N>|wPX$~8d9 z8_FkEYC(%8;atSUDmL)@QZMrCJSeVQ!V;DGPzv)3H_^uY(jT}q(NP=iGKrSI%Zoj5 z0)dqnXikg<(ceWA~= zBY!BoIJXX^A2<3|l_$ok)p@a0uqY*0DSxE_Iq+F&X#h<5WsFzh^jO(eS3jjZT6xK; zIh34@VZ~*YpJ-#XoOmLHue+!s6%JP8Nyeexlb*RpzE@C6qEIZ9sN_j;xwV&V z!sMHqbmftz7B#juFRHGH*5;Vl*^Ww0>BC!SqP#?Z;;U@ElMdc&F|*GJ1H;=1uU0yik#;TUAviIoXDt zG7dtpLJXOQUVHlA^a5uY3Pr;}oVn17moN6>w2Do`sg)tD{2Cn_j``Vh>R+3Z4LUJ0 z#D|!U#)egmbwf&aHHK9FtE||R8|580z;c5=;|I+J|CM&yy4XP8QNNGksJ*mkrBSmv zLQT`S-tyQdY86j(fm8WHSxCF1UneVU8(vYHgM7wR@`M70ao_!Q(cX}&a3g0Bo@Fll zJWlE%47U|G!ozriAIb&yDMHTJ2Ync11U`AKJ1@EGY@9fGN@L`4jmIbB#Icic>g2TL zkeS&TKdt2@@k@12^$q1-qmIlgxl{ca7qGaVDc!7eA}v<(yK0FhD1^s#mH+6-NQ{q; z#MlHMDaX7U0)=2!_Sr`HCpgYZM(H=AcRs$MfK6jQ+su)9(`vW;nBVY9c_!~DgynD; z{_q=r5!mMm^s>^66@sc#?rxk1QH>(e3Mc0QB^d3A@(^F$L{tW(A6c<|9_KO0MI>R}aF4>}-Q4U(BuhFMLuWG;2!8k5{q-7d;(%58qUr&~U zR@A;o7vu264#(%oxOfu(k{>JB!RfF9#tJYpE&2&l3aV>nf~dIk+b;t@_!gn2ld%G~ zaLG>m5^qEsJaR^XH_yl&2F|DWc}zzMOYQ}fz=`G`>VIlylof$i0D_+|@>0-6p7f*l z6wd%DLC0};VNzc74xXYcQv^No<4jS8FkdL6@qVtu19$$UR{&xPdTk0C`i2aYpYO>4 zxE2vc{;9SXw!8p=FW9`VHGO!w3D0p1n>|Vz5S zotu;9;!>@%aOPL_cE^(aQYV~vjVY&xyJT`);&`=!9y&+B-N_MFxNQ@TzXlk&5sYn!Qgl@Ivl|;h zQ2*|5i;8MDw!&oGY2y}NEAaFryag=jISj?2qsYJu!OE37OW^PaPL3k)bf%XX=dW;Q zM;1W+u5hB1dCI#@0iW?3hIC7?eS@2hya*?b{W8wt!L7k2xn+t0)P7_U78Qd-Wst9) zZ4EYwrx*qY2FSF$odGEMgN|qkEkYRs34RPJ8bny>AexECdx}H+Bp~JiiFh3e16k-P z!(x)4nFI!eNsO~2`}qUU#rEx6d`m4iv)%RTyJExUEpc{cCLVe4VQ&Gw_r7~9fc(pU z`LE)q|ISbQY`8!8gFmnWj+Iz>HChq~(qN0Qa`MCpr7++x_m4gCgfD#XN<58>)ndgN z4>buP4}}$qv#)&l%M#c%sZw6HY~Jj0L4n3rh&O zQPeZ_bM5wu>ceR4+_@`m+P^=>RQ4~vc+i*391}0rZ&>dMMN%M%0WKI9O{`Pdv7(SX zvEBOl7hZ@v?|5~*?ykEuIXV~r`9J?>HMRlO2EV`!C6_zt89A%Tl7Cg zwA4jrL`48yw_?~Ac&{u{fc*gB6!2|QOc{S!QxT*0mJ!k zJ@jHgrWy;`QqI{G)dvV)E4Apl zHHi=)$YY?Yeu5QY6~Qt-GSOl+pC*a1O1&p7r9*wQvWRGkuQp*hfR$}llnDouUzAYz zd3Bs7@gaYW=d5Puk_&4Wt$>n$Tk+JsNH^6PjXR!@!U_3R*(NF)$s4%pqtR>)T6gq4J5muN(}RvA$p6K?8`@&j)OVT`W-BnrpXW!b{ZbQxSLbE0chu#B3>N_tpzNabYJB8o@& zh=Q>u9#VEITslJG$_+o9NBzU=_JUv-BiZt+{3~B%6Mj=x&I`&z4DeRS3XU6yDa+=l z;)(~VOOin37Gl~3^hnT2+bRn`c1chs)LYTO_@6jOH4{(7Yw7`Ye135?PF!fm!L!|% zp3$Uuz7-AC)7AD;Y}hm@bSU{c8VlA*4q1$;@%1q`KO5X4T&4a~ZqTLlSncDul8?B6 zVMukPrme-Taxh5|I#MN18|&4%$8p9fP4w3SM@0mY(s`$ z{%Fgi@cd-scrw`!9w1|N)D{@yF@}L%g2}QN^uR+DLJCRg(0+M?K7!@;*h`zWhxkeU zsfR8T!o?TaD3Qo)s@EtrM6dDaQN0A7EzfM_^`#xN^OC79#Hmx~C7Ya#qeofYcQTHh zn2zJePsH@e={S4ld|bGAKIUd;HP$aGPpU&Ir&>XuvZ8cIo!u7X6XlX~pnUbL&}4T5 z${aT-J;(>h3MgNZ9r>_1IXNB^lM^0`*`JNZPOpx#z{RD(U1Y{dh7EEn)-@B_$3(X0r}xV8mfL$9#I73r7P5F z>u-XF*8)-|lj1L*^~aGq9j_2u5ih_8uTs4dPL~6HcB(huZpv|RUxrgJbYjGHp(n2^+B{`b4#(v1vL7bL&G2PY zj$4jbhR=3(m!E9PaM_gIHswgN$*&uiY;FnH*<|=4omX^Y zW3Kd`-5A1N!Q>$9{H#TD8LBcscCQ62BPzSIDg5CnodzcJw;w0l*-hogq)sdOVd0js zB|n!*a`s{Ru>BtyDl{Du2EX(qB_D3tF8gwr?7kls9Uyk$=gtxsY~q7UPTU?`(gZ+V zXrfV%(^JRn4%x674`1aCAYT~?cgZf^F?MH|qH_R=?bOls>nCmuuf)T@ZFr1u&kb z!38%+7Qub(?l)MOckI|vZ)-g#8sQ1b zK!n9CtYf3Rg2yNcS@j2ARsz2K@}YR^efK#((3ZFP^04}G65L+>n%Bk)&pq!g9@kxaO&mFN*xOPm0~Bo*tSqFYItNbtNRxb_L}S$= zTV?U%LJ*XD*B7hzSP{rdNWKbtyX*Bg_!10+KUVP}jKWXMfoBiIHKHLaJQ4Cf{pn9z zsmeBBl%((~*AJdthcdq~@Se1N`O3zP#>G4Sz|GIi`%Fg42Ao`e!j00m-F};I=@qDz zf5Q^&QPgqs@98sh@%2X@j@{eWX#%%oB_RSfTfvwdyy{i25?!3pH{?}>+qR`kPN0>Q zpRalKtK+)su8rM$u5y{e%7-6*$jaAKr>2#!K`Vk0j?)3`)C2e(F*Z6HyRA^%Ct9lU z&_fRu=Sx;%eDS^?yxa8FS=mL8vj$}wXgMn9+UW$*AAM-cEP=L^q z!}W?%u@6jG&T9c@C7*&wzsRT_r=nkMfb=4PAH}SdE=-~l=LMAE16Mn9{S2kQg~S* zqzuwWqL?xd+80EE-nluLjAPg$t4fhqn>pSfd_ZZY{H*eENn@tBG>djCC}1fqRx7G662r-!K!l4*zN&td%BXrsb@J*!D|eM{ zYfkx_5Y36ER3=K7G@9$9!Zu5`DSM?pN-_0ytonrS)O+}(bfMphNiI@ZzMybcIEoI^ zhc|-tIgT>vtV(&QyiuO|7Gr3K2ebp1od5-+(NI6|QgzGzRABLp@sR4MdS=>CZaNNS zC@}I%KHPSCnhdYT$@8sv@oYDapYO)(%tEvlE=EHW?~ck-NMfnI;E#HYL0q0-B2+>7 zh{br@YA;6v<*@uX>sHvk5|FxIt21V!oKW^PPN3i;E^QhmG2;f~RicK=GE|pT9^R$l zdZPEjofLXWfs3*$U#8|b@W+Li4C5bf*~eukzYLet^}E^wDhL!y7AJ@x`V?wBlom|1 zjG#EC&3MRHp|B86Ru7}FaC*d&Hy506`!QqWlE%}SnOVte7kzf$v7@Kr@R8$j=m-kG z<8l1xu{d#TI;Kybv9gcL$d;GpqqV$P@Lgr8GA9XWBunrNTDW)zZc=(;uKD6K40)&TF|X;@;9aT~vvZx&<r4sX6)!41_yn{=Aeg7h_9xMtNo@~rUc~H+Yzi>j6>pt&z zWIh)-@G2X(8^L6MUimT2!jTekxT9;bHB@g$RT3zJ4+9}e3zQ0JfE1g=e-AEl^JNm- zLZiYF0{q3yB&IJow}1P0 z;^+R}&w16<|NhJWd;E)k@&AeaH{1{>r>8xzLsO=K2jx-PnvsMWXtiJ@dU8Jf)lsln zpnz_+oNzWEE3UR}-xgapZ;g$cHaZSB*s>Chtv#5pf8*=ERTcw|GiS~?4U{>oSmYeI z&6_vIrcIlzv_k3ksZV_>#wW(jUmlcz+%(A9cPKXhkN^6AsBDw4!ufODHhj(1*TzRb z_R+Zao;O+9_x$tE`D{6qeym^smao06dPKd?4t~H(6q|er=d8k$(nO`urH5d|*?cHt7Zw&{Y-}jbou7}#AA4N<8@8Wnrr=T=0*>|A#e(S5&phM&!6(d9Pd^nKHf)M5n>TrK0?*ifj8Zsl1K#Ny zp!+vK%A^{2sj0K_@`V>(i~|RriGBNSh&yh-tq8dUi^=eFf=7YL>ce-w>jz?Ld@Mfy zg)hg!gU`i1swbQUiTTtM5kLB0BhD=g%cSCijDA3tdn573%9K(f?r!w%v~bG-EIp9B zA6_tm@i{m^0!$pud)-xG=$8w{LphCpd>N;sxCNHJNucyW)YZa6@eEU>McmS>jjKmR zHK9<{?dG&;zAx_4trcu-ZYY#mNOSiTs9%E1t zz(dnU`gkf+2>xl(pxSSmX$Ofph6fgW1w9qv?Xse?qqv#?dO~5s#ADL)_^E!7zPzG7 z7lj_U=zrBeCc@R%Q673w3Z)xx6@(%q7fgq7QT}zo!bjolp~z82*ecBAhLwh#HCNF% zysC)~Q7T@I zLu|zronG09pKFEUK{Itz;jC!nOh0(RB+(aWh?iZZfq#$Nc^lm3t8|3R`4pT#4hWk% zV9`dMA|3g&wOe`RJV4_oKiwt86Aw6pS$t)Sa2H;(I#8WL5`$1k%8(99PQ7>qC-jhC z?6A$-Q7=*T95{G^-3!? zh^3pyxeazOHm)Dnm|Tku8`o)^YR1eA7sI5pWf`kI=4d=bmf_5|Rn=kN%Gw~0jECfh z^igb}l&1dL%jf%fjMX1XrPfkQO*w7BMUjM3i}A+F6Z!|rLXo+=fs441WiX6~;3uAu z%h2Vd-5&5c$!-`cBa~lmFaK9BU2H2#GN^jzY5TdAKrJbMF zN-QqxQGSp?7Uq{cF3-;|+U7jOq?Dq6P`z}Y#VSXNM(L^F;pSu|EN_&1YD0o|84;$c zL7iSzzFEDPo~|CraN?(Tt0>(45}8#T{20qo=#31em3_!5Bcp8T9g>~S^lLV_$fM?! z`|zHJT>zAi->v*h7qG!QWG60Iqy0daw}Fa3=BIwFkQA?237S`irB!jcEZ{)mCFKMx zyh;2;4pZ|{##s5t*nr~4J3@qmJku9?wW!kO_!r8VGyUjCsVAxKq=&KsD^-DykhB-t zah7+1A+V-ARFnovsa3`xstBx9IpuP<%qS;$cDcybubWb$6Fc=UJ}Zwu(owkUB96YX zugl0vQT_x|mf=Znt#O_dh7Heh-{3(}Ux|aC>jXGe z&$CIgLQ-t9g&y2)CxU?(aRGQ44A%I>v>ux!2)OgZd3;rleS*mrYSg+>r_f+erzI!GLJC^{B&j`6AU99j|)A z1jAs=gv0~69(Ry*f631WY4eUdBn&f}YcgTs5CnX+=F2RdpoB>jhE@zJp1;0x!=D67 zzIgeaiG*+%FM=enE9wpHhK5A1Cn?aX{4hv>FNK+C|6AhZ4H)uhI0cx81dvzk^lEoD z@P@%F^TYTEfQcnQf->8|tpO$R8aqYuL{0*d`CQPJCd3*r>b)3gtZLvD4-^MK2BC^3 zS_q~Lrfi`gT?U_Yt{(#i`9^S2o`jG|gAoG>-F-tC>7{TBG{T<*A%uYxhd~$tDG!ba zt_U#jm@_HxWze$FK|J{r7lDjhYgv8uzW2T-e)KQ=Xngk5pO0Vo7rzz@tx*k(-59SN ziNEq!|4RJO`#%tmeEs40NB`&_$3OfB|1aShj9>VLUx>f<6F(8}eES1&>hx*NrP}=! zZVbrSq=St@j#X!@wqt8ay1DJrN=MTs`hm}WoNM>ui!WNC#Y(bmTetbPVa{el`9q$+ z`jxN7Ywvok;~^}f+mCnj z!z)$=vf}UQr=PN-jkLHp1*L04!aV%pra;;|!s3AgPm7j`n46pTia=J%raHp}tr~B> z_f7HeBVUg<-hHjK~z2yZ++`qT_(`L z%Eq_7?QNnfDRv%v{E4{zwp+cu99pOglqGeZRh1}XG59GfF28J^SG_|CxpCtL^933w zCp6hE!Z8_~Tc1Dv@lRNgrX8_0=}TY!ay<3aQ!0x;=WXGbfBx}a{Op$$YgA>(Wg94A zWFdUB%8S(j-CP!WpvfkA$xdZ2f*b~DpB}mUaXgX3LyveW<`d$4^l_F9U?6f3+gFVP zG}L4Lvx>|x;48v_E#l;^*~T7vP{;@|xDlou2c;)ltH8l*#gTZ_21wROWdPTMPR+sY zFBJ$L3Q6(YX9AxxtOvIq@lln?ZnEOZ6UA)Wg$EeHV|&;XjN2^{@W=s$3}B^&Y`cNi z~iZqC4EGG_%E2m36W|EWYvl?Wgg*Y1feVGP|J*7Fo`F@ITc6Ang z4j%0uB^zu&2|2*+xUEIKD=py>)~IM=)m0zp+j4y?ugX~MEL!uXOHg5JlFA64u*F$;d!j{zDnvEGNggOG_=?^H$5w^2l2PF(di?IjDch?{RsQntvRY4R^~;Df zmuC_^uGl;R_g|6~%md0n_>#h0Fn-8@9{GtgMVkUX;WdoXWEG*e2J0_160oIojH7@b ztaM^XvglB?6MHs|#qBrki47ap$NKR`EH7M$vuCEQ{Nh$$l-Tup)A^!2ShY%aW3^&s zAT*HQ&ZWD4mUJ@52thdB%iPg zfE#>=hdAn^Y2_X(I%{=S3O2m@vsNhotN>IUw{llwHF6hc@iC5AUR2{DZIov4%t}-9 zFDXm;5RX#EV~0#CJMor0t9*F30!sC$(^h`OjLr)1Kr64}!Ls@-rDQ&MH7If5m-36! zjS@WGC~N6 zq~X8t*-=TqeN0cgjx~Su9(|GPnc`d41vk7=3Tzv9U+Oo?3+1bLC`5@j36>A*iN0i@i~Ld# zY0J=>(oKBlF&uI90E0~F8^nwHoAL%!3di`EB%&ysHc7t73)m7Ud`hK2UjhA;eg2?> zd#Tln`Gu7@w_J;}?P^Rf55|!t+Qy%C1>m2Q>2tI1NKQ=gYV%5dyk|SR%kQb~C6mMX zq5Zg3$+H{}ljG+1Z09ydST;EfljE!nFTa;fj(eqe82mC!Hl{l{zdarOl<_#Oe%uR| z0_awgYi@D)ryO5yOx{hi_gmn%s&Wq7&! zII%OnvS&8sco>D{35ksujCAcfj9XsrXyq^newROK8!lfzHGrtImgFEm0jr}*%0G3) z2nm8=s4*<7{20t+EX?X*Yl^>4at4iYq3Dwz0w(ZQ8sd*le1=SgqxeI}Mv-Wq3I_Os zo+S7x-L<^%2&=~|kqsOV?}Smmb6dvW^}S@sYrm%kPGtly43?A^c|h}E#b^v%@)4XK zlcfPn=~zja)5id+GFZQ^8qJypLB0aY4-gbCQ&W>7ujh*)NQOa@$a&CNTwJzN1f@{Q z0zwyxucRFDU}=8_Pre8;rvgVB=rO=%k}WKvm=ZnQ_IU7-C*#>5w2CKR-Y~AECi~O~iEx>G-O<#=bap1tSRv4m) z;$~Vd6+uyjf(?4v3cPvqCgIxKBL(D&C` z@jeM(ssqYP>J5^xg&_00zxTWG13&OCE3v4vd`U*2C6BD?LwPhSdf?CU(z1nRR^Xv{ zVmmDY9)k0ePd;fO{D%EEm`3oy7gqJX^BwPq8RgA~VhjK0KL0sis6t+WyXKl}%pd5Z zuH?F4e#%fkGw*X4tLIQ;aXAb8GtJ5mJODPWDrkGvB)AVBJ`^WUp7QyE7%uIgjNl{Z z`J@|oYhICXRCM!&AD*#IiMl#8G-A96iV^74n^XGi<_%+vD=dHmRhJ0m{yPxUPr@c~fcz7iKoXQ*!w$8IH`~B~GuVH%2 zy?Doe?8PTvRHTi1H2LsWP{Q2T%gt-yw4sYqQMpT!zri6uJh91e7~-M%@`Qo+0?vJ+ z{Q7v+#?-f1L6p&8Ys@i-++KAh2g0suw0so;3i@8&jTa|4@WT*M@ZeFn@fb#rK?~jN#Ln|RSh=1^m!t?;C-1+lUAhR z{9$;7rP%sGNtRY;i5}pYF%-rhSv1iADHBw;IZx&VTT?tH&%jx^2AB}j$7J?9AmF0y1@!KR}#=#u43oJ(Qlz(o< z?V?!hEeJ042~HEmk(GW-j1m)3s30~DSb=R-0?eO!4G3@h(YoWUD- z(w>h2h4om4#wt3twn}b5aTBe@h{mwePyCFoWDRdO*1N`9E3}Y@B)51ahAZN->JF>< zL??qZibnXbJd^0HO~{h0gM0$rR`Llq$IF>V$qWPg|pW1 zR@^SU7f-1}oG)mFJ+c%<07>wyB3Px%&8lqE?XAp-F5yIh2;UTiEznr3 z&9WPY@LNa*O}_L;nwD8X zL%o9UqMNcZPh9t@Z^(^g86L@{wD>48+^EKeiDpcVR#oNaVx-=Qp}J(RI$;sR^|aEc z(HPM9oRl=I4yvONgm&7v@Kvj6hXKb-z&9SkkZC!O%r_*PcK;eDc_!OwC19f4^-txG z{E7`uy(N6mul%{q^CCZB{2@aBd@M}z4Q;AoMFXPHhM%{fQnJdo zSNMrORy|TU(2PL|gW@pJiLx+#%(k4VvZ1_?dz?Sv)2N;BDnDRHX01ymV3i;8%+Rph z8WVlCUm>S8BnzPEOK18)Bj@_bEkE0Ow_C9AmsOIKi_iU|t`x?6R@zC4L)qvN9A^=x zG8WriM^p7gsYH2T$e;T~Z2knm3Pu!BDLlE^YEGGgtXfrnur)KS`Asy95;D_UJzAV6a&@`o)NvtrKm3qO^E>oe`zv?^V} z5eNKMxCsuo^9&BbvO5W-V@}&mT5tdZCSU!K60xBdoX$20tV%4ItHVF^|+a`jxwJ7^MN=k*sh`btSD9s?F#O8?-^G;Clu=;H$>En_?XMr)lqv#5*{qFEE1*0vsr{ue zp8W1wpeM&M?&Rzn!q)ngO*w9c#eOA!OgVi#$xnvCWVb4--8|*|V6K#hY?s5XkS&LB1>zhkoB6^t6UdHEeck|{HwoE`>u34wzPm~3A$PT}Wr%KozH9ifRH z+vT7A^Z)*}wE_{-+qEALLp`aHTx*o6^$b{3<=?Pw%-N_xS{Ua@&b5hk1a9 zOkwqnc>#=UU>wd*2{4y&wuz&Gz=kw5`O>dZK#UJd_ox-IZn6^Nqg=KSUP&}RKUXNe zBuwkigGVty`VtNc0SI@Rv?)#=*!T*HP?$|3hXF6WGw>lG_6JW5cuWKk`ZyHX#1w{0 z7AzzvG9+6l(mOQZ#=e9H#p0@jvZ1)^b#I6Z=g<2*m>c)s7(erOJ`{6v7vt~#{BOpA zBl9snR*9+3vvKFG*Tv8M{r}0r-v9PXzvS()KllIqx%h>D@=s!JW+wjL-~anDF*)h; z&`1XXgmlRYU!S4nyuw(~MtB~qG5(^i_sk~@VLZ@_0EjZ`x#yox%F69K;?~=4jgzNN zNYEUyvJ8>nxfh=E>ONL@5f4QV{JrMtYm5`68;UU$RVV~eSWZu$^4Wqd3E(K4SXF@1 zjk9dV#z(DqV#`Ne6HK-XKqJbyw55a6rs_!GL3&VyK#=FlGx-m=-}(lOCM=>6gszvwgWfTx_G=L_;<%QcEMXd4|L_XQa!=kC1Y zPAde-8{4}#Z`$nh0l|ey^)2xfT1oSfM;@_alpAtUxKV!zCx5vd*mjJvlofr@KwQp^ z1TQ>aP#t*s>1Tr5`u6O(D(2@FO!Md{lX*=-1b6hDpA|lCx+6Wd=^}`7*ms+W zj`DQljr)Bu2{;nX(7UQO(6MrTc5XI~96l`A6{r8=i!b8D-x8x@9m z@Zd{v^ym?9x8^)QOyU$NUvBU(^D&2WiH=@XN0Sei zpFH&7!||#+UmZ8z#QBVe<0JpykHlNOr-=LGO998~FP!QIUAIY>vMBmMPa5pf zgP&hWOAnS{X#?q_iJmNTd1WDCf{_3ODL+;) zrjqiz*~@Ac(w2N+g_+u}8nXh(2Ki9mh>b$5#+FKr2PojU+(L4KS2;q9c$&^U6r5xZ zE|Ku`7Udt?ZHFdB4|0Xlf&T;Q&!AQ0q&k9lQoe963rq`>Kgtsny zgBnYnSK5nU@_3legjCHG3FH-d1mjjry@E@SDF9ZHG5+J%5iV{RMlr&8&yBcV>Ew!9 z(Yxe@rF2OLiY9JGZb?pSX?$z7BtNR|g9{}f;}^0d3U#Gmxu7DO@syi*8_Gbl!NZw* zHSs`sWfd`m(r%r0Qfgr6+dZDCuW)%6#(v5pHhe**L;*l%Ef%>AKL;pD@47wv#hZs2k`rzmQ3>KWma^Iw!9WkR2&I_SKr?W^{w49I^y!KqCd ztIC?W6@8{xM#2~47wziX{SH5sKa;BTt%$Wh@OV=HsP-tDgj?<`6F@hLXB4rR%anh3 z6#40=X@-C=;lw`~!I>v|^4M#*6q*bPCJ)OWifct#0Yn{ue$wuU9^R?{Ud1OjX%Xht zu8L!tN(m6x`4=n(KA^ZwCehc2S9|Otn`F9CyecmF_jYvk>A4Qe+wrmtOC5%8+D}&8 zZX9~96y=KkC0eM+uLxJz*^hS~qUW&k zJ8-!jl}*NdB}3dY{g~{|WM(_GMgEKf!OT#9ZUw#=G*dE#+Oa@%edFT_*FlY8M45(<6V9@E3N3Gui(73@#=X3~<1!6SKhQxC-Y%AoV-p5)#1)4o?mg)|SAG zpvYi{(hp@J+f@+u8L*5Wp_ebstO^hz2%EsD^EU26!DykDaEK)x*&aak>il`;B$}Ns z47>nd7Qu$o^KE5Q7~?G5?gMf;C=&m&`GROeel-vzH%P@JUOE2=ele+1eka#AW5?Dh z3ukO;KyhJVLxU2+&C;TTc}2sY6-Nw!3^qIrlxzzgY7YCXmMmZ~5T#XR8uTRauqq0| z!O1EnR{Zg>QVpak+jsmFpOLafq8IDkj+u&Q?kQT%ui z0I38nUdl*ra1kG+9ZID~zximPh}syhfBoycWff%=+lIM8mQ|4`{8%M-*Ijpc)f(`B z@CW}Te&~mO*a{`KB|rA)H)H?)nIS2>}Nk0LkgQ(x6WIvQR=}z=)%CiEM!qm&;u{= zgI8SGvS;@mmjzD_%RJBZge}R`EfkQ@eemEx`>|zuWMnwbo;~BVo80iJ7J#t-=}&)B z?Z;>7W|cyXqnBTcxtDCF8}uZcIj;U3|x7_V1N%8(Yy!hGIeHt-EPxxMh{ z(ZfEEk=u~J^rbJx2Y%!OhM^fh_~6X=N_-wz)>>h{TnDwrdBM^OrXZbfD*GiMD_ zju=lE`W*Bm4k3aw3cgKY4<{y3R<4)&C ze(3!%%=UBjZy)@fh~IrmG1e1{GAjC?jKnfb>K`zDYUJoE*)lAKcN7+wB2Mztld6Eb zKzFGG=eT;upSog0`Kzp*j{X2ELICRH&e8o|`1|9M5+seZN=`;)>~~(v$Z!|Lz}Gb4 zDXNkOC?2<$6m*iR5 z;mKo8oIG(WuhLH|9pO)bp9su5P`1Hffno9uv%IHmvvLR|@m6s)mU^Wbo_Q7v|5q5F z^+uY)=hbi~P@X8VNDRh-zoM~JlSn=isqvGV3}ZBtPbMjaALE$EMNOmxhdP1e7~?M~ z9BKcm*CZy#8Y8ywHuRn2WL7yg^Pvb|XE>TF_O8 z4tS%obzK@%76r=+P!x<5CbAYr?-lW`%ZFSTj^Y)YTY$a#kg^l~q(wYd$B`fMsd_a) z9W(z$17(2Hg)lb^5`fvzO6yQew>|m7PYMEK*peGaymA~zkVmRS3RAlJV+E@+UBJ^) zzyUu+hy0QeOdmHt$VaNPdZ|{Bb>uCYP#D6Qs_GBhQz5UedPvjZ8%(7}%_J^L4zLK0 zx(^RTEN$D_G_M4w7i1XvD;|%r&@9?$XLMt@QE05FjQGZpR@N~VqbyMoiMK2AVA+irTnSj@E)7GqP(E2WZP_`RtYZF8fv2WldPq8FuQ-(a*r?ULrI*$HC;*#7P0J-s zxqZH$WD@WEP#r^-MP72a#(CrdWPxfmt^7lNvGPy-hR;rf?|Sk$NV!0>=*Em;fMnYKV0YSUIc39icR&{7KUI<3DkDkA5#v)Kud-z(})3% z2fqxL-^(~KIZx&If2vHG;I+h;-LGKEQEY#kN6F-{wRQ;(FAU{dbV!#>!EE=!vMFmo z=qPzly>qfX3}v^%5#%f=$hae;lS+aI?@VLTGIhafz_KuavJRon6N|!4JSzqjPw(pH zQalubT=2p66Vj&R#SejWRq((lUc$!~V(>$k!ny4ZeB_yq7&zHp0ig~%)oEGK3ZV7=*yqFA--Jy|6+;qcs z1@U#U8XPKn=FGWRzkZztlys&Hh)^~$;E*o{C%!&83FQSPLt6bb7_4MU+j%9RqO?(b zD}@#oj0+_Qf)VG*G3XHHEEKpLUwBqMVNHT5bYb#f*Ir)sHV$Y(h{K=9gP3rPj*Z1t zSM83OnO1!8N8S_fd;br{Z~x}+#((+bH=|NtAB)0$?DR_1B;0Knd@;s)C*p7Z)KACz z-u?b~=D>mY#b5eYamQ_U#=GD9p7_`Q`hSZTUwAS8;XnL`v3KuYuh!#Bs}*`O45s3$ z1zqT56&gw}pWP-uiU6e?N;vXrJ~L2@&NQ&6!8(5(M)AffFmCbX@)HzID6!uB<~KV% z%*Q|R@woqO_xBZkpZUyZ;&rckorN**aZv%r7p)HG8l2S6kve`skxR zix0&a3Q7cEluu)$BXP|&*IGe^(9A8$gmW7%d4h+m@_YE4$-5JkWt5422(c3j;KRUw-zup3jB=0X{P}Zn@Zifa zJ~0-%ckNX9&8x0=Vq$`=e-fm`ua?@yXFl_J#b1g2`}Zqt&WmZqxpU`zmJv4tdNL&X zxDgm7;d|fvUbUsu!ZT@QCyKRfKKr@P#l82w$wKri84iX=amZF+^0{mG?%1Peeqqt8 zB(`kcY`8Ce=}U3<-FF-RMb$GDnRniiR_2{k{6i}1BS(&?j=bKNiePegfl-xlmqB^6 z#r)){)A72yUK^vTTV*(gX_WjQ{i8pMk)hFe=R4nSUj5GR{f$lVs=x=u}ew-cE4dca~X~6~nCfX@C3N=TR!Q1Jj z@P1Zhn`gNh@UBRnKtMWSDy06(K2W&O)UOCOC+lH`M{%s!%Xx(c^6PNnC1KTrtb|FE zumVQ>A}V<{ZDNj!uVe>S{?se=U*2{-z?iOxtU^Q4K>ZM6R3(-Z)TSvlPjobahOVe9 zFC8YM>YJ6mFZR;dZv~iXBUKqD&zi`ii1PMVCdbfAo?5t-7Govt8HHnuG!$Pv@#QH> zH-Z(8D7BP_DwmXq{?1}j5^AE2pI1E^1w1FdWD&|11tm(a0i~z1Va1!zA+*wti8d?g zVWMat9Q6<%D=822y)85vtHe{E!3Q5jhh-efSv0sFaa%ECGU>Cz5d|t5BrEnPYq>24 zFt+JkXpoBrYNMi2G8C&?RQ5@MC)n1!P{2!p0ShygPDQkJRR-o6A6iY5($5N8E)hX# zN|~DuzmCS+eEam%HfS?Gjt{0Q!xO0QUprBhi<5 zgNJPVveFaUG1O7QogtYV*^R%518l!j!$XEN-3j8BjlbJ~1B-Xrxlbz4r^Z=?lXs^N z9A3o1CR`rMFK#Ztpso{*y6@v@GCW4Mm83?i@-Q0y#4o!Qzks#!jxd!e&D?O%?fQlX z`Qn|2@+|z^27$p+{VwEdRT8tTs)ShGh$zMRg(%O48Ba#^Oc(vLasKe5(06i2V%NO5_DPyZdYHFl5S&rumG9aa$wSP{s#tDf2t zA1qPwu3BLzUdn$Ep3KZ&(0+1A|3dbin2(9yz7m0(vy^im^|K_Klb3oh#WWb4Z5g% zak^)JA;(($N zNf3e~Kokg|s!%?wDzh@PGAq4z&wD%n_s5BwCof)>0ReKf-#a(rMC{nH!|&K9%u3M6 zH{kLrJvW1l2jn<-FT0oRKTs$W#hxS23C-^}fif!KdRY!r4!e>c@0oz!ak8_1vR6jK z#NzUn>34n#1mh^9vOk@o%LO<5^i!`p>LeLxG93me{i$oSclz2#Czu|P=!(JfNTLoe zrB&~MI=|F5PRuc^VcE5T0(*;nLZa#f{f}cf)&(Kx(k|iDC`~_1O;uU%^=ew z8}X)&*J;AcP_i1#D~^N(Uysw35upu@!at{(_e@uICxd}l$=tnjT@qF_Sa4u5E5$fN zY@nYNLrL+6@&aWHgAXgCx_f%85Mm1`3MdpX3@SWqjmWFR^4CEI7Y3CCO%|pQvT#SK zSZjl}_+#MLK+VC>uuXW*RzUzoIYAhNP`;3X?{}qH-?_RVqT?728} z_(*)<1MiQysY`MB{Amd@i_zcL9qYO!M73^+;n}`;;#+?j&+mIC-t*q~$0t7ViFp2n zees!p_wVBW{8K*_Kl09Z#y|Q;|Hw+bJ2_)*V8AQS7&y~Fnra#_xN0yS{m!GlpaFr8 zOEX@0@r78kdW~1l0Vt{%tbv?wWX!k3AMU zckVQgN~F);d+zytE+e)wA31Ww%D4?1)~B-@_wJ1~YuD845BUo?ynu94pUAHaY~^LU zD-V2-HtHqk)a~21FIKHyRbP2WUXn)Wv+57rgNF{r(9p2*dYkgC$LA>$9~ZR{4}v~Q zv9EpY>q^UZmy63v4@y+(HNqAbY_K&7VgJ&l%PvFe3)|2yoIhtp+`h|A#cLFny1-&Whv`73w)F{vLbm zajz)koxCM|lsgak_~3&NDnF=;FFLO&Q+FG56H4b}kAK(sv3vKP*t%s)%5(QmsS5*_ zc_8(N)v`=>KL6*RH?8--?|oKue*Noz8MohlM{Hi*9RKufP4WD(h?mbRV2AoiXfPKP zN!vx2c&YE{rFa0|vl}dcLz&ww-i>hG0Ig2KVTu=z8`r_{Wq@XW^Yl%V74pL<;K;9uYWv zi)S-bX;rlFFZ!)Lip)$apV}4YY%I5QM3dTIMS0*4me3+AnY>fic!y{5kB^a6;fE%% zN`ueTqkQJMWTe1h6(b5urPuEY&#FRo1THgH)g^w#JM>Zpr#L8l7Y$`cS`~+~0tG0y zikg?XaV4);aVVb^uE}x}%0tp6e|Y9r7%y$oyZH2kmaWL7)$vgdl%eVdN@UI&W#u2>xOt$BJ9yA3{4!0`$l<{+Oz`XBi$|c;t9Y7~#j4v& zss#$SxF{35UT9XhQv@i3IKwO{+3=V9yxtWF7e}BB@ro$n;_5a_-K2eC$0Jb2t1R92 zu&b=m_FK8Dr%>{8DGFyDcD7Zbx3j7-w>A2EI-{?K`o18g%M+N*Z}aI&mZ2O|FI@=k(j%MMr4zGUY90?p2laLGt4m5YyI! zoo&6?QINu?SBt3+r2kLzq?D)E)1T|I^5dsv@3G_V8Yvgv6~Z=f{M>i(M|=} z!KEHj#@Ood=qJh5DQ>{D!4{uRx5Fk}z^4B3OLM(s!eH9IoA_W@GOouU2dIaK54kuj zX-YXNKk|{k0@rjw#57KNw^NaC4zGO7V>zDG9hXDS2jWrilos$5*0{M$-#^ zIC`|gt|7|GBz0!~!U&o=ce$lieHj;_g9%0Yij%%TCVCYOZoUl-dI+WRb65r-@HAKi z+k52aFWCsqOgKzi!YN;$72ex<5LOY6&AY;r4c@Mzfrw9-s9 z!UP|j?4H5?;1_P0Mm95;AKVllZ7laea`X19x#ifrr8jo&-k?r?Av)SSVrpu_gE?oh z%}h^w6&c$XSVhK`2b3o$Q4nw@Cs{$&?SYk5S12cVQ0Oq2ppZft0iZ0)N}Q~KK{3Jk zbi_?uZ4#gm`XJ(4&%6C@#rSs)_V^)*2$;m07ZPQ+B)gZ-$qRAJO5C=jm zE4JY8z3+Q(ObPe&xl2l4SNz&P{)h4Wi~HlLC!dZBqa7N^sxhge8&KR=#^$19`atxz zUyEP(#s4-w@{y0l`SWMv*Z$Z4HMVTo5}*F`FT|I=^yT={m%khz{?Lcw7k}{=ofkvH z!!8NZ10M{o2#X6A*wVJH9V8Z3_d7ws^$-*G-oL}cN z@szjZDbTC3+Ol;^yzOefL>uM0ueA zI&thoyz@ui>3o52wlAY(yz8#J;=;uX5>iqh0SzuIK_QBeOxobn0*Qe4oM!U%si&Wc zZCkckIY`>6XBJ{gK)Q*On`%*r5pK~zw}x zO%!g5TC_A_mEiT&uY5U%hlf;VcdOpADnWHdJfLKw9+MUxgf!00q+HlWd+$B>6r4qT z?dxCn1v5+r0EBJ?w(maig!6$sSiO3U)6DsO@D0za!oq5Qe@d3F|In5M0hObJW=J zFatz}DIidW0w>Wa-T`n+Xa>drG3+{)fw)U)C5XT1!wY?}{BTS4GT|mW$V4idiVP>a zG3SuQ0>9p!&de`ewSeg8hSSRRB!pAlne!*!2rruS@5&?76?j;biBp>J6n--FpXgx$ z0eZL?oPwgS~@9%$Ui(lJ;e-S8Ry?Y#Py(VTVa1N@%dMKM&!hN3=~h!X zZWmU(D6&v)G0w9>oebxa3uFY&5~h$z4N5__>pCAur}$!38hOB_Bo*Wa(P&ZnMTfOo zS)sNpH;yF{S56DbGksR}a65msOZh7vS&3Lx-zj@iei0Spi2{&a`s2csB_Hh1#8Na& zlC%ql^fS9_VHI84QdU{yd_5smSWzc`%U_hA(ynr{vPb#qtKls*!)^+hR$5e8?T9=DKYZvTF1gQX9L27<$T+q*1IsP#QJI}knY8<26{pim zM8-vx@#3WTXJtLgL8VRQ;4`7&k9vpfMgEft^2KqgY^n2Ej&l1GSb?Q?{+*91C%2`9 zmLdn&2r_vs!WOUgHqv6* zF?}i^Ia*Bc<&1Co1xHBm1JL%+aJ!Gu15NUyuv;;YoSib!cKa9Z?#wI)>z%T9UgEF1 zpnT?>!di_>JX)ed?W<>@E5r)HfWuW>?`f%(9 z<1{51NbMS#2f4~yhM_4mJ`jLSF32~C@&{$Nb4g)R4EohS@rs0L z6Gy5O3hVqPZv6GG`ry^4`g6Nb+fMnA9`j0A5u)zFH-E&1!hcqEZhB@>bE^56o^Oh| z*`=76slDf_Po|OWMKHf-$a#<<+gEbW;mUrE^lug>+cPdSfb5?kzmtbK9?aA(Z-g@aMtC*9 zHw2joCPabE{Hs7lw-6#|th28Q;AH|0_WbHcKh%8$tL*Rhl3C{&dj`2#7y>7?3%X`_ zv`G+N$#l`MkXo*L#OF50tLV_ttMhaW?m$6I1!i>I3tA~Z7*H@Fz$=|C0*C}*=<=l# z0S3VsdI&<;)u}=vWhJyA4uNc9C49;Kdm!OuA3E-YU*w_EQHM+`gYhtnxCm=&3RmlB ziaYPz;hW9)y35MFiLnW<4D0OZOe?@7&=98uH02xb3~i9+G6{fz6k!P*grWrra0n*| zL-?V{VBo`z)q)61oR5~nSb-wp3xywp6H2JT!Bu`I>sejmGxlV1c?gF`Bd8#ZvHFYy zY#HzvpmF!0OFEVRr_Y>@T|0Niz`*L5o}P+YdrQ3I9q){v`0xkg+uuGMLnBkMw!bw- zrj}y;KrN1r4aRKK`gr0Se-MWbJR5i4cYl2P(|=!Sn2%ro^QA)A}l&~YiBUW_nKX4#Uh%VbbIg{?{)oV#fE4sbC{l3hBRd#GU zML1)X*fHUw93n2he3OoaxmjO2L0+PyL)pcOHok;Y4^XfjI(#Sw2L>%j3|$*?{W^N& zNQ|m%!6$ueg=Pg_O~NtTdh=>MXi*oaAEX%|eZ-gZ5Pks6-kx5c&&cXK!cmvN1HjED z5B%mc16hHGk`H{8Y1IEyr%%Pvqpw(*$cjWRn&E65Rtyp*35{We>VX3Xm4?xH_~ExJ zpAmX1%G0afw%pm-Rj=m=S}4C*N%-LpeAt3X-S$Xl7-}r{> z&{w|lmDscA7N?J`(Bu*Etpwx=6DC&t?NI&ZEW%^QUa|6%x|Yh3m7}v(Xb!3@+1|}+ zLt6pBOB_HR;7FKBXb{KQGq9~@k*I)iXY{0Wcewp;fquBrIX zs?&S-?uoa*?QQYc6W=v2Y?Z!eOT;hVwG^Lyt|_J{YF3XCQbg)!l@?BZimuH-KBW${ zz>(c<_Dy)a7F~0FsKdQPBaIV^uauvzW0-o#&w4%LDfu~k@fhGiV1fe&`O#p9Lp<4pK>M@Vd#F3vOs&sg`T?L7LdSsWoC(p#oe5XJG z>~2f(qj%i=iVtN|(14zAGE_#}pYhYY%TDIE=$$`M*>0)u%T>9NHYQ1I1J=0c$v6aL zuqp;kp|`fGA8=!lQ$_s&XU6%ZrB%2JCoeM4WxxcIt+nJAZVT{&LPvdPOD)n(vP@tV zh&Z?mgKeXtU#V%VV?|k4e=nUPFe{E!INnOkDn9a@vQ>Y@ z3Pra2vO-i-b;ZqulkKyzvbqs=D0|U%zE?S)Z$?c^<7z9Hh|I-ujk5R}r*N>tK9c?pk;J^aoe<=rg0ZV!}?@`|)mR`8|r$KQO* z-3rxanXH}!A8rbLx#6@~su&GStKmffa)9xU;-RVK$O?kpH?E^pXpre#i9`Gs(rVYuWp(MjR zQ4lgoKW@g+s6 zOBTcjACmcSomVuGJLC%~@w`AlvVD1j!n1{yOVAjTS=Gmw%SY3$F3fZ+2)ih{x+Dur zMng76PWBdHnaEu2ZMA5ZA7d>a&(jJ(=%F;^R$#UYC%KpMAzsqJN<-3gJ$;4Ds(dDg zF)i~cZCMsF_bMOK$c@Ry<5&Nt;rb%G#|Ncb4W6`#O>sl-R+R91{#h0@XlzMKm)0p z`j_9aLq5CZFg);`!(`l*%nZEeFxee9pp2&q>H)=WC66+_vi-Fn<6;7hG*+V97zQ98 zGXLc;n7ItG=l6^UG}?K9a(>{S>1O{7<@g$*?DuMTZx~i0wi5A-Clf23#P`KV4ph*( zfdI65vYYH4U~=WuL+4Dr$@K>lK?H-0Mi4vEBCSmT4;)8Zpj0miUz*7 zLCBrXRj!_NC|zVj${KaN4AwZ44Y@MOsCNN$&dws?*+NC!1L^+Y;7h<+zPu3hR z`ODBG>$W>L#vQlc5|b0-(IG)+ba>ca2rwwHP==rkLJ?R0dZ~QkcDJnDLqWj#Oeo*d zDyT|u!G{%edPf1p7f}>3ti0l)2^22Sa45cBsV`Jkon`3rvA?9YL z>jDL5%*}I7hWKG?YF0e5`l_#=%S^bbcqzumMx(dCCmwk40TpW{cJ162Uw!16xMjzN zxHdZ={#dcl6svoCWB=JP%ieuGeKEVFfpuhm^ei5TcfIeU@elroe`rDPbD#VD_>JHE z_4p_M_#ekTci$WT_J8}gR&;&pQ=f`=yyG3_AEg(N2X)Lmz-EOJN-4szMU}G?ckI|6 zciwrIx66V@`t!h?ArIWRV<-P9^Zex(Wh#Qy)WoFEj^mK$sp)Bz>xgff&2-5pR)XP& zuzT+887rP#XH_@(+InFBexC(6GdtsaS zd%CUkqYe;H3jzy@t?DS)*75 zAE6F>R{IerxT!wRDZh^@&WbMxVT&+z3tYBMBVckv9g5M}*{S&A7r(4JI~m)y?T9<> zyfucdU5>$lRdML>ODf}8(d{A$=8N`0d~BoU(vw^F?#a#0Kq}5C?^q2<86(JLzz@aY zv(G*k4?p}+{Q9r|M*PZu|KE8_Fqd|e=>Vxdr2M4qO^cWQ-lT{JXj9+$&UdV^qdubC zLm>w|r@DsH7)2=O0-iW|GTwaOeK9UvZW3O%etq0=+imrFHZnRE2M)YsW#%)_J?q1{{x~*n+8FQpk$1*R2Vagy9{GCw>`(u+Z_=jY`Kf;& z@gI*1c|dhRe@+j9vk9amI&b)K|E9jrV>bXUkzzWW>PmrP01uP`ja!J5XJVFmLcFeD z@-p0L_2YV)fpCSj9=3q|?iDIdi=Na?6@7Yw)Gfn<9Pxv^c}+cdT7e@6GPNiJgU3Rd zAQ7+W6i#>*ep%4>yj_M@c`uOO>;C+v$rtt_Y{6@yC@`9cpj;3yX}go$3OZihrz-4~ zhjf_m3uy9?wr`RTC}o7hWUt@>J)o5dN}IzvFJzEs^Xk*c2S0kR$%~tYIqOe-u@!s@ z`?82lhMIYso_%_eP6XIXx=PlT{DNL&0 z@J;!1 z;xv*Eq9s4CnpAl2tTB&;KRacht9sUQM^>wlzna z#&^yyqpp%|R%nSHati=YR;I|WE(3@j#|hxbxR(@9sf?*zUOifZR3r-PGC&EUwCWdS z6LKkIHVQgc`5|}m;R|J;Z~85*{CmJitA@qyf{)tt8} z4dT!y`I!_qDc>mu62B7;Ij1XRBG<@`f&nzvXB*?CXZgb(;ZK2Hj%^l_H7XZa<|;<=n0pWID3Gc{S@CqVFr?@W=b{cOS+TjUDneo6M3j$2F;Eg=;3Pa(!&YKrX z93>laa*~a)<7U1I=Qt7&&Ur_K!b@pNae&1c(n+>dI25z;^P&X(v7MfqnNxn7n(^S@ z<(Q*UeKh?Nq&QSB6?RT-igFcoC!aZ2Jw3wZcq6Y2B)%fwa-TxF;5DBo&76xggObXL zhjLI5p>V_!w2&e5Dnd+T{h3*A?B-%e*)=Xp+|&C~jLkH~2&(|+YH?}dbzK62cSgwx z=Nhj~3F59JTQ6Ye}2 z8pC8ia0yp7vu7P&7Sd8rYXfAw*Md5|!UV7bBg5WV|03BaKjE&~>oDdBeQq_{tekDiExUemTCPbFu*D0Z+mJ zCh^jFVY)8iPGEKRGU@bis|zd$5q?jD33zokNJv2OmR|f!SAH6Jd?>fWAjCi?y}Mf# z9s;NRhyy{#UpHlP`yB!hU&1-0+B_;E4x?T`5l9?z@b+TyD<+cSt{5B{WK(AFqF*|1 z(xP|ImWuEk(yMqC-NE?QRZ+t z0)Vn*e0)MeQb&wWj>ceLuW<;=YAO^oGc!pU#lSl{I%0(qLKoXD$Hqpiz#&cK+t}!+ z>`l?y-fBhGyap-Ce?jGdauRwd85txer%>>+Dy&aD_r|aNlmBaM*s>{}eB$Z&!j~S4 z$B)cNsH#T4CV4&WoFCW{r-t|nw-{5JFm%@DWA*g2(c3*8?|kQn<5z$6fAAptumA18 zj&FSJk@&Cw+h2~IyLQH({HH&O7hilaKJsHf79albhpl)*>4{>9G$FhIPUINthiP8Fp($I71+&Y`E>YStj+1FX9NgDBBP=5iY<>aV8)gS+FEh z!r3k$y+BSskd<`QCC(kZc=4j&A9&ya@wQ-LiF!mFgkx1Bf;qgPm>eA$b^cJ^i6j!?`tpWITHpO0O;*I7`^P(1n z*^W#KeCM%83s)m;+dah$XA7;6=uSF{n$g8aB0*z`n9@p-au8juBF;ifcJ zP04{Ryh5vXMC@o^hzB;-;_eM>m#@X1foiNDSc=|`N^lRy_X7ElCXMu!j9auV#v}SD zCi|YSD`NV@w1SE9WfIAjN6ywQE&;%-RXvG!Ca(bKC}%X(J#%g$PMn*G3)hm;N}t21xGGAQC%aZqDm>*v zo1Ps@VjVa1E{rMJ3da^*6vXnQP~fkLGx|i=^jcIBn< zqv;a{SxWEo$?gYt+8XI3C?Br{>4UlGQ8toyeUYB*J`+-5lE2DOb&-X+t+h(Dw@G&L z3OO$I;B0A>Jv45Wrs@mrC@CH?P!1?*QrmI%V%HzCN|q~76ruoud*XI-6wZB!-bf9! zFq>6pDO*uf(WpJD8d!O!HtCysC1dhf`R5BrxY@VW@0hgR@{>PMqV(f~Guwc(oQk{U zIhpXBSC9dTNBV>GMps2q@WIhrGnE>DNS7muH_}U=f-K|JW&|U!%ZGwN=>)#oo!WpE zlZu-oagq`+#gpQPK4EbqzX?kj*yi0d$j&ISV2qWPpn4lBaVbn5Bar*}sG9+Q(&_}s z4i5l1PWlN22lSm*LK&!^a+e4FkmFN65WUAG-u0v{vFe)~b)tlysb(DcGmg=p!Xo@| z<|7}VvJ#Pytcr7l3hi5jQwBM&eJnwW#Ni!B@mRK1TcRIG%0JPEQMK;{&4mc%d8dH7 zL70>mlyA9i3qUp-McpnS<+0)sO^!HnZGbP6BK?J2&m)>?%z*~A8b09%69dA{$`A3b zI>9U9;U(D<4oY_`VU;G7$!_oDtlnqE!}Q#;$G6#8%@t4x&Ma90I6l`L!x|!n=UU_H zk`;ib;JyJGonR_Mk=P$9cw=Z!{nLpGENl^(;e{96G4+E0lHaYIlhtmryAxwzk%^n#p}{-2>g-V9d6Yodr8Aem zIy^ZlJa!2?C4)dPItCJb>JPhr*hvLxOU8&>^s_8)=}^zu1?0AJYWMic}^9bawm zOSFGA-9l=;Y@UO^=UwukD;qWv0=m7VCx_&)ELwlJW%xY^z_NT z7!wm?R(!BMf-~Q|9YFMXW~P;A;**ODxQP_@5u{VZq^Bb;U%sd?%ieC8ZceRvWfw{y zlqj%_0t7`5LICOF+&sQ$v8oM7%Be9c{<^w5y#16FS=`c!AH1+Ci<`9i`+J1TDu?D6 z92|(XYu3h&?R(=r?|XOr)i=Kp2M?Z&iRg(*4Q`zh4qv)76MgNq= z)wj?7+|T`7tXj27e9Srz$xG6k^D7G+n4TnxcLsYDVQevGB_S75uoaXu-nMPsBH=ZC zk#=d>e z`+^$;OKz`z_@Rg5;v$PJ)5Z-s1AvdbLTI_m%j9+_|&I< z-inXk`@PS_I`u8@d(V48iboDbyyy27pilTM2-%{NGXf|GlP2nN{RL1ORf%l1f8p&g zI2ULM%v1s~n1z2P8{Y$&zVKY<3wyn+QUVjmEk~JYnKn3PD)||Vq({y)J-|jm5Bj!3 zkVgVK?av>63`GKkbG_cET_a!RaF|RSRIlqSl#=Lpc`$_FIE#9f6^f3h;NAWVdwQ)8 z9hwXS;{$=P_ zKjIDL1WGG-nq%vlTHH4?Cy;Iz8;Mi10Dxg_4g?|ueV`?l6msn zTpT#J7*C#Cju&5=im#uTk7>3jcXcZNP|yiUeWsP5x$tNPF^GC`N~GJa&{ z-c5|1`dVeBqb$gCD3m1Ap)g97nE2>>!B;&ZLjhO10*6WqL2xWX;s;8q+YT!*y4#GX z5X|*n@5pbd=O~bh00pGBP8@zI9QA+-ExF}mYSQY(j8nvKR7a?XauF@JMYSuFE%-nd z%qAZ4Ngq=ZZe7MEpXtBkmlUVqsw|XezK90p9=Q3VxZb%^@l`4sZ&VjrRSi1Y z7++guwy0inldsyW+A8DDg4!AVhR@z6olXtahIA-Cw;SxRL%!1f6oxp(t7Q%IpZ$&M zcc-Orr(Bv_BqvcnRZprKZ&`JS;w0VN%L+fv`s?t=Pd?nWw$*&}3@iA!yd$@7?5)D# z12}HTZ`hGPjDuZujxikt8RbhFFzFXalUH(yx2&+jr1nwH?ibWQaE#4@@*d?3{j!g? zk+~p09+GDTo6<)K*_1yoC@gdQ-Xg1X!b8p@s*o@HVLqZd?p2q{M~ZruRnRi&=PU~n z4xXS*H1^}>bp5fNS?!j1%uqqxbqa8^6d$BhFBA(uY|$o8>~3NT(@g&@+9{S)lZ6p2 zjLh9!u& zt1e+t_{4isnuCvG(EJ$z+Nu4J2l!hF?6Ek}TA(f0(M89yEA2{;!r{(4^Qjq)S+ldt zKKpNGL2~?p#<6L}tEHHjYl`8yN?cpe{4OZ~Po@}d07r8Z06jJE9~_if!2W9S|1}{; zRgM6tKv%!=jYgMQzj&S1Zc zEYmo0EEh9jcn1yq{Qi0&hif!}Mmtc(;mJH_{u}Yjuu|CUmZ6bO25_=phH}_!&uIrQ z+jE>i4!;tuj8n$XkmCUw{Z@n=ATt4!2^Z!HPOlC*KqGzL3%_C@cLM8nfl+wJ9fu+V zEQF*%L{hYxjXFMX)QNdpFJUqcChrI=BIvKmxDl8Rn|HogI^II)VU?cTiQWpmLg29= z>F~m_z#|$An#&wCEj+%iBPio%yHHU0&5Vf-^b(ILe)yB&8|gHNnjQ{HPt=?q22O4j zY-%E`@(mo$*OBSl0a=a6`8P|7UmAAc&+dlDM;4kX3&u>43b-ZE9*(!W1{m&RTIb zFwk#h;-Yx&?;ngQ4J6fO4Jz}qVq-db`}%#U1$p4FsS?Cao;>LlgD3>^R$Agr+b%S) zF(4|gSxu~%O!8G3r6d=Jbab`Hn$_!KWMtS%Ap`?fyTK zi{755_=%5xJpRtdep-UrQhfP~Ux}~(4yB-Tp*yWCL4-)~H6`EEk3P=Zj zY(4Jk?6R_s^5vX4EGaoYzRk&8widE}dMW$0S` z-H(6VIF~L)-16C_7^6bA>Pgk;dWPk9RudIztOJY~Kop9+amm&B`jD0#1cWK-aig8O zmnb3-Gl`(RBw^lk9UpE95AskZtZ_^aJ~X+blEE*C9>+wdhzlo%0qY3><0Lc10TCH) z#!( zm#<#a5I(Ou%9ek&&vAn%w{7=EM`v3M3=XC~l}cOyQ86i=p3>N^^iQka)6bC~tPJD^ zaBrtmI#}iBa?zhJ0}w5g5FA_KZddf!-AmG^=eT)&%ze`3E9nEr=D0W zIgH{3Z;>N6+M}ZQmXK?>3`9H>gO2JDI4BO~XU(y~%}m9TC&a=*E~B2HfD%4uBQDR4 zCfSW`&8om@<*0C*sAtouI-vx_RcTCHSM^>hUjuGDw)2C02GC|GO=u=Qoo35g_D*gz zYVspBGy!(z94@J!t zNxurmnRTovL!nNVGw#Bj&wo?8(nBF7g*)TF6-Ky_&+<3#1-PEc%x=DTLU?IADcd8f zQPsHIA~~7kV~}aNkb{qRDDG++L%nrZ;}tR)H~O}s;G>=LSg|J>>Zh#etEI43{;993 zD*#28{vP_sp{y>0CmxE+tHlJI14upamR&qlXztdX_u!B|rCE8D&$vcDqAyvLoHHl8 z@dzXnS&Z>1Dc!-OdJ_G80;F!nUXCW4-)}T!`q=AqZg{y7 zUd5|UkGh>rAmf+AVh4C%$xireFZ%;!y7(Cv3l4b7w6K7wS0H<@1o<%pCX4@PV>F z_6(WE%}k&iuIvu*p54m$jrNR}^P-&JKqFow6xp<*Um41I&68;Y_~m#pGvqKg%g2@6 z0K1nxbA*`?Ah(Q?yIU@-LX6~EF2Eymf$J@*#jsYHUex* zhujoa(Tae1uQb;z5GQ&n5Fg;3!dx#qJ@x$O>%GE~f8yt^2Of_5@7^9WQ`a=%QT$5N zxeI4w^M*}M$IJ|8kf5MpTV+!ApzuR+z+jgK4CRODCn12S(m;svk1(vFU~481%9`=< z(dg{#liWGyl@urrE?m0k3ouwEVP&EQvB`-EpUuXKF_bIaSrMo(^Ye16wFzg^Um-bo znSqa$f1OIl)a1A)S=0jl8KCh)fI+w#7j1+QRt-M*;6w4&w>}&XK5)N;*IN9O|K}ga zbBE8z+;TNG_P52+A@Pa8BO$i8O+rWo;cPkPn%aC}$hz8a^e!EVj@o4W_{aWU{OAXM zEH-Z35KnyfiTI;G`Xhf$zVF`qy#10bs9*l_mt)(ut#R9Jw=3SaT9`zU!g+V(CqfJP zM}CsuJiKG#my~VIUimnqa=5C=A{T9-T;t3{R=#n03oFLRb5_1_)*D~C5k9#9B?}LH zfzMlmsW+6}zUTMF{cnCi{td*A}lWyK?B)v;OV;ICc88FZK9| zpZJMbziyq~pM7p$?A*D-iqKTf*TYcXdC0%jtC{St@;QKPJ7#4eN^#mG?R$7+IJRxs zoa(t_yAC;S6rd>1PoF*&_uPF?9W!qYW;^o7KK3!E&(QE_JpTBj@n+SRvu96xTQFhw+_K01MUkn^B=h%v|3Aj9 zdv^O09B$x#?&+uFlRxv*rnfM?6l?xX#4t)gv?4h<1r0;qPKZ!k&a|5WVUz4FpieB} zXXY}EGQ9>r>KFCzx(TIZFA!{al4{^R)00`qLrfePX6jMt$#xGvjAwdDc7i7QNpM%0 ztIjzY$+_;I!2q7%f6jLY15>bTXz|ws4yPuh}V-ojj`Ann>7)%(r=X2 zJTtMqzZxIdu^d11)@t0ktrA_O?Yk3GlNvK7RDUnK??F+AGN7}wJ=U(@5IyQ&`Ug4p zQzY5)G&$v!yc`$7@e(s?6AK#ex%pZ-q%mW`eGz>SmjEy^rEkoWY$o4x8fVyoXE8*7 zTpYlvSw7}5(WWg^#(aokvd2oD{DGyXm*XkA+<&ursz-faPfw?-@RY{lYf8fvrRD7T zb1^oe{(pWdy4rhV+m5ZVVcptTzhQmUNK66y4_%69UullNI=&E(obQY?L&zSY)}nlD z70<-GFqO)Jt;9jpt^82LKnqdODo%Z+cn0txb0dAuQr?7E?au5a&Pk)!d~@;)UtM5=!Q5MPr5kvt-`cS|zre;|Ua4te0M8~1{^r$wtU-Ifo zu-pK|kJ1AV)CE2$Tk%u?;lnQ!bs#$O2!GvfheTvt?CG}yY+pd#T;jZJmxI+XJgzxo(*tt687G_BJwv8f zhLzkJ;bu5>cPvDf9m)X;6DNSz>~%Bv9x^#FPzp@1MZF<2$PZhE%P0yUbeN7zck+6n zLt|p#UX0+$kM|_t5Jus7N00?iAy|!9SN>&XB7&^yGo7GU71&>$Go3$QxDlfGg6z&z zUJSZe=4XmSW7eL#a-Uwrvn2NiZX2D*DJLwB_~@N7X|(gbFj!^B;_ z%`wnA8EY%YqqBKD?zs1!_{c|oG9G;J!MHXu8jpPAYjN<yL=Sh$esa#cQNAqe5e>GM`Ewwk3&RZu9BUM87r z&mI~cu`&#W+b{p}f1`YwkYC!ChA>dx&iTR%FPLx6g?rC?-y8d$eZ~`0ZW&H1-O}nV z_+qu_@sr2n;kP~TODw>#_hm zAlEVCgDy%x1a8uL?dmlv{-|eMN`msUrCN!rmxnAQwMy_ufmo|GDG$aJ@0`-R6jzle zV@#&6O{#q6qEqF(Wz)Jid-hyxT0fvP%qbqVvE>vet2hzZl7O`seSQ5t*O8TZ8#ZjR zQhfLBonHOM1RfwCTz-B_+j?0s%ei|ePn~kQwr<^Gr2!yxcL$d)U-2X)xhKIB<=>`F zn`7U;XJhr?VBB%n-M+DT*Nz=7x750GOv+9@C>`Jhr7C>0)i;+hkg>sg)?05= zKF?V(4Id~2*>286;<ImUj4Vc}^;IyeYiSsYM z_BE&JLm&KLTvR{sr+@ax@#$aqWlgMvpr*d{HzQ8Z2p3Y&VV*DIc)#FB*QK&k#DpU_sK@{J;usq|6FFwSzyU|nkP2+I|9l_bm?Y*KXT;ZT}G^Q9- z6qRMQeN8+V!c2+nyzSz{xADqR6A*6B?Wirso3~WsA3U@WKXOMc`n%1Tfx3J}V;OCT zb1dl()~HYISDWGX>o$#JQ|kA)q-SJoB*sR^ywZ*%EBF}1D!}gEZYwZ4JG#_|a1lT{ z=c|T-vWN$>o?U{nJ^N*ohjeDQOd|tDKQ*I%3BG2g+{g0Kj1|j_ZFBOQ()fttpQ9@{ zzZ83aU$^Owj7`OUhCqz{F*ts|)uF%b2<#`KFL}sMD5JL@Jl4 zD-(5u-4rTQ&0r&DCsppsL)95p^ey2hxr|V*GRQC3=O+p(;s<3P0YuMRf@vSD_!C%( z!ggaT_UJ2-`6Lt3Z>r8g(#hcm`3nUkH_9l-`H1UCX_wSbc-MHIWJc@rR};_{9&qHV`n8k$JNl@y+RP#LGHe7SoMI5 z9Z=Mxi1OHM8fn!Z5AsMJi%1u^q!F;Pso*>H%PBqZofJTJGLFX$0?Co|A_udoI4b~I zS?pDBPrbw+T(3Hl#jC^=$DI0L zctuG_I-tSIM~(y_znlmZ@8XxR`G#e91Dr0|7nBAo-}O&Sc}~Wz3>tmPPvtjZ_2+s+ zKSDkU)4Yj}SH0Jpkz;47?G}#05Dhcus>n$OE6#NSO%V z^azhBT-;m-{042xk$hm@ME;;mq%4$blRj|S5kvE} z(v|!osuZ1oG{Y8oqWY*f!6RILjHU2ti#cta_)|E>Zrb3S##mqOHlNP^o13r1tj2lF zh1o@~QlC*5Fgjn0@x_)HS!|2pC03CCP!)jSm&w;t{ey$XD9Y^N?ouwy{QlR0OydWc zluR?HqmkD}zHf$~q0yZ@ArG84a!BRN3{|Vt{fi7;WCunvF9)=L8f!Fvfv%a zen8m{G=?kV0gdk&e9IMGESLXBNUyg5y7RWqE7j%FTzRTZa2NVzBwSHR1prL4=-edg>?1}UyL-EXh4K^lLUt4>1*=j>s?Lm5^Nc~;YS02Z}(HDZ^fVlX>TbO zxk^R2^HUyhmlz093O2QxC$GqWh6P-Po)o_bOBkPs^*is1_kZ96(OnK?m9k^K%~Hn7A`Aps-^yGC3(e1t{_GOG2IE5ip6t4TTK~8iX+f zECx=#Y(i&hYSP;_M@Pnd_7U5sd`@5D*5Uc`hfsh5i!Hq<`&i+HphLVPqv@7ZR!f{b zbwY7S=&N$OZisM z@~NldgCF`(T)xPPzC??M@?jMlH_@VqVnrUS5<9!QqFeQgvdOsA8B7bHvQzGu@b5CD z?x`&>Ddq-UChZ8>1Dunk^rJ`~(u5y;CjF~50Y-G2m>RcISmIPnOpnJk@p$aSDNTme zKC68Sze+yy(WyGh3ekDByVdPjW`QDUr6vh0OG5FBFzds>KFM*x`@b8$UnuK>hTTG@b0z=3k38E9ldLQzz~yp z&Jzp21K^f3FNe=2P=v*ezSFokgJVl73$v4Pc`5K5PF9@AN+zGw3nnt2s1m;d)p^VK zC{s`#ny3J!Ac|Zj7mmA#S6vi)XPKyrvXV~R_{tx}AQKw3H6~0;tmNV>T>7_ZAu+_X zEXF5xHphSS?xuL>9%Wde6JaIzxeHgkIv3?N;{-QPuTy{3-PvyC+UV%G+tIN4uQ81S z^gXOB<`STu?jGM#&Uv7)NGghyILiU@#QBC@k2tCW+OvhrRORY9--V*CHzVvpq#_051T)xB+2xsHUMd50U9$YgR z>({Q=c-O9cX?34AG}0DdJ=hfAInfqhJHzChRev)Q55y_Avo=X4nbBBWmAlH7W~h!? zd9R%EIe&6zOQ>WlE&_4ADBQh+frhupMI&h$tbzM>`fD zvZfEd@Cha~m2QOspyYZ^z0Qjs>}%u{Z>}u45Q$fPMgowG=(jpvBj8>KaKM*|oSV_f zLot#RD7+I!9Fsq!0essDgIy-+;+=5ft0I4|BxiLWv@r>TEQ^ebY;3=bBUwz{GaqW& zT3ez+ZKkV}2L)SITS;O-d(L=4H9Brg0cW74PY(MKj7jw(`m!UKoGd+d6!a92Z-( zwD7@NW)+1F3LNOFSt#+~R#g8{Sb3YPJgm?W-^gKUMV#K12Co8CQnDX4a!U65FgO7a!~HH3qJJXpOw$%oOBBpn(l*~ zfAGahNZJnwi5GBON3mh*NpGs-!iUeCCg@Wq69&m6JZ{(PXv$mt$&}%TyiY4Tuh(&d zaWPUIS!C|11X#HZO+^FEB09A%>Qtgly*7^7&IsvYJ_m0uYyG9XUsU?p4}o#)vDvjHiG%VvXj9af~@01Slm&PG(kS-3(#!Nd=@ z{7%P)o5Fb&pz9>z@RmTRce;FUn=(Frbntp-0F`iD~v!4iU<9KAR3#hebBm4SqXC%L7qzVINE4t-t%I9p?I zb0Bl~Eg1%Ipzw33r_C=RAGlpO;V{se+|#lZj_3*&L?+kPfK z@U|T>J$^#0vQnx!&T68xZOb+fo@1leBq+7T>1$6%XaCx`I#HDXu^fY443ljA67Gx!$(hBdwzbB%%+>A7 z(bZOqYm>?|&D2_&7Gh>rLP_&dZ0?$lHMOhJyfhTsckhn-A9!0l{Lou9S=$)rG(kIj z=uqr?;d$j-H8yYD7|$am>7@GeC9Lp_P4(y zwr$%I{e8Z!)nNgI>c<~{+-1CF>lSaZEdzA}MIblzB6Rr6xB%YaiwC=f83AbkKhtO1 z9uKShpvA)kpOu50kA-44ZUdnZa4lw+*tXN> zm1?XMoS7Pp{()ZAlga2{6+kDq6!K+13C8fuBnEaUi*$?ixcP;LkAM8*t~cZ(Jfft= zpLPKb%3Jb=y2;Jfo0PBQ_H)lY=Q5p~nh~9}YSKb_0WZ9`-`mL9y8YST{oVNFCqJnk zr75Q7#$#%-7Na9)d}u<0e1pnmwY7nP0l!l}ICJpfhaXPDdMTa^WtT_3 z`Awhqch{YFcopb<_q|E=t|s?y#XH{dHn&|?B%pwJ?zw&Op7*>v)xjb>)s3efjZCbW zKm6#Lo>d-j!N^bi_>X&)@9+MH-;GcG%%`HwTh$|O|BdB1I4X-*0xAFzSb4x|-$juileGjbURsy^sR_DLK&k^8`NgmJuZOyAYO8A)cPeoUpEUDfL-F3+P zr>F`f!S|%2<``AZVAY6%$-5&AtZ)%Dk zyHD|^xs)%!Id$fY>iCdX8L_p0`}Q3%*sn2BaOvuh$DVX)5372rv3~73jRQSa3W}1! zNfkJGMc!b~KoV{S*{{*e<-lu+l)+xaRkD}k!)kZGCBQ$^rrfY+{-HBFyWoE3{JHbK z7>PcLKADe4tkPu+866*uBZpt{hb~s{G2pFRvo_XmTo*lU6;D9VUtW%<&vwQizStFy zpV9bDIae2=N&SWEfeK$!aD|mjBN`QywoUkHoMkfEjI5&i&zXH{+&){7kGECXXC~x@ zBA_O^$Ww(J)52~B*)7A&i8uB8io<6q10)tZau#XVO*OnBNAHtC?9#<&(8Te9~NT2zVoA}h!UMS!cvTY6ro)xP2@$p*u z#_CDR7n5?a0+9Sf#^4;birQ0Eb*dWO?KO>Ct-jrtOEt(7@(I$MZN_RrRumzpFovQm zOWT4OTO}_lKHRzN!fl>x6EF0adG!>jAb+rt_k5saT;^Oq`q!+0voa86lj&Z$F1brxODN~9c6 zz*+ewJ3zV}ugj`X0K$OdOq^ud9-xGClgRl4w5SYNiRrQyEzscyo~~bRxZ+CTFQ<>ma#9`iTOZlJbp6EIb%0f?~UiTwUAaA+aA{q#q0c*b#Ns-xx@dmzQ#kmNp~PJ06B*j!<>5ZC04x7+ z)059~MD0npKpC^mdv+d0AoB{D3r&*qm}^M()tJ1%>c2(Fpo?ky@90uBMiyFQBZtc26(h6yy< zc~Topko_C;2{VTS%5(tUvzha=Y%k+B=4mdM%ty|@9NvC%u)7?+5<~V385hX*{Qf;q zMqUB%W^|!m5qX-C=v|NN8zuq_$oR|1ZoFhaxuNhv@X>IQ+z@WCK;HtAOoTxTl7z)y z?zp+r#x6fh1R)-JeT5~;bT$#;?cpyjv1Oq^&vJemb`2QI1x_vq>ULFl@_MM*{iJ_s<*s^uA6?L33$IWL; zeEk=n&}FhPqKSVeXYOe%W3Yfj=pyVf@StP>veE{@BHhT!0Mz7dlW7}ep9i<`@kte5 zN;78;q7-Dc7%SHhPEfR9gYdrMu+hW6pjowbmiZ7IJR2`IogM+JL?YcF})0Q}R@TItP>7w(Z ztBV^V2Q|Ul7XAGL60F-Sn2>I^k3oPk21qwTauP;x!!8V!SE>uD9SWNS6Us4NzOkTz z-(Sg9mIxFmZ#nbIE3}F_M0fyy$|=W*J7o^wR>lPnUWkuym|0jM57<(CZRnccDQ9lA zL+QrDd5@%zuateg{jqBGpqgb8G$-UYrim^WhNN^Z`5dq5shK!)VN~^ET7t3K7+Qp8 zZl|XH%tf`Pd|Rl9UZ(_{signOuSjKN8JOGB09W<7sVhKZy?;GG-Q<@m%>m!07^T~MZ}%(U1~D`7i{=4j~{(s zoH=_<6R_4;v${VniPqP?_Of#TW3xi!a8pW5?p%?|zSO>%L|8EnY#zs@Yq1?~aSb`Hd(wA9>^(-ZG9N2Dy^t zQ2a%*46FiSa>5PMbVXuScKAA^=cV|>$3L#}nvBo<*6+kGe){iQaX}gG_%}^)!rK(} z3gh(IMP0H9A*Db?NpLw^v`sNzTT4?yqHvozJ613 zJcj69?Xq6Dj9E^Q5oHLmS@@77t#ahg{h%BnD;CRymV3vz0+cWU)2Yc}ll!xyYe>ewW|{?)zFx;W=c2996ujK4h67XRsR zXPo0!;i@92%A{zsE=nt8J6x6*RMm=%QU=+k zcjuwUB`O>*_+U>Nm{u){KFUBsnK1kji-7u{D>h+ya_8a(BQqBih2!u7yyR4;V+Z^& zv)c;bjuJcv)<0!Xa?^iObmCsP(O}E(c$@<>mXYb75xNrvUf3$Kdw*6-ww zT->a(rD?XR4s>?bd}d~6XBt;fu#r#5VIJodC1=@Lfv3mH3%C$3Nl}Mlh_Rk1=G9E# zN8miwQ*_YOdFW=P5+5PFqK$Xa@b+KT8R)V7loff+l93pr8Iv%5X^!lC%wsDzatvdt zxAH4N=|Y}jRiNBZ7}ikUi6%u!7LulP+ilfy2>yKh!VMlNPTF=-6sgF?pI4%Z=d8T* zhwj2oe$>YS@=FhNOha}|`d(@T`D8rNMz)(nzEa0BU8!B_u-!Q4q#)Un8iZ~Kp5h=Wo2TCYuwVWqE@F+*42vFeW z`JTh-!HYb%a+f#N;k>F7Kz7Kw&gEdA?OQ0)W6TG-1vY#wV=7rLTil5KDtni;icED00f21;Q{hHfW1s2 zyT49IdH?!?m7{Hh?3Y=2gKWGm$Z@<;+ONiUhBE)J7ZB-`b8pi^`?uD75 zj_IIQ zOkwFr{WV(D(^)hKqk5G9Y2k{vV1+NH4C0!IB!1+laE@Q`dF#`n1Y+d}N;?9XPlQ{6 z&l{|<^<~BaFkj$NOfD-PuOh5=i3Z9trGu~Nifg$^LJsfnH9wl-Luw<9tjy4W;2eiP zR={XbAKb7u-uI#ZDt4|t8|N=A$M$W5asJ#X51L$jz^$iCnzYT%v7#VNPZ-oWH;seH zIk(PVcQr^sn?aSq9pQ|Di!+w+N9aOvg&?$Qb-F|X#U88Nu3Wz4t(qtVJKEb_wB*^u z*hGwukNHa`mn)#$<19i3K%c!w87lvviPC~W^Z2o2v1aW$-}Z_S$1T6OC#4NayB4n$ z?Ck7~(XnBlpR~BtqPVZRDzVLC)tbQ=zBZ(|W}~;KHFoU2U8TP|PF|}?AP7%1n%(u0TW;AK+js1Y&i2l@a`lS0U!FU6*4x)O(`mc%+!vdu2&qd~uU?CDXU{q> zP)H&8qTt~iLGVyiA-uYdDGY)fN;T@DS5gT4by49FEV7;avrt9baOtM4j|f8kQYj$; zJf2L0FyQ8|z5xCx`2gI&;B@v<_Ll_>~uNl9DrsxwxABDhmtzQ99efiTTh9+ZGR z-a6c-G8~HW$#I{LHOrwS)SK}MmGM>O%aG)y_L!c7hN{0NF%du(w8h1UobJOn^ zzVLFj1+g}xOzyeYOlvClB-v#uMc@+oH_?~!m zq+%k6(|bmNamEkPv@iJhDG_dOvM2ZAQNNV3fi{kVfcVG+!sw5op`It86wxv~c|72~ zpv@f4LzppAKg$+u2NMA%VzZ!5bb-!*R)v7pIHYGN2$BHIa zyPzDP-O&dy=JAn+vZ73&1uUq&xr|it$0sJ-2JvGoW0KE=9i=zQ3i|S{t`4Pjhl>TC zN5-dodoUm5%7DMf*1`CCXjkMS=L4QQe=g3PJ{=b>UXJeWj_4a0j4hiud$bbgE?kU@ z^5^4AU*9T?AA>Q_*QN1lIflm7#!qy`pB!wD@0?S)^08C>VLE0+5%3{$o)07i11Rh$ zV?8KoIo8CxAz1krD3lUjlArV_t*)UYz`H6a2;l)nMGjN`Xw0PaESF_3Dk*gbI)LRl z>ML>&E4Iaha=>zxD!SXCct$q#S$6D6CzDJ^6dgC=MTYp4Ca+W!9fK>BaCxU)LC-my zII?`_g20rk;|GU0?2u5&0~)L$(;yt44dDC|Pi{O)yXZI`(;+Nzkw?o`3hXPRk$dY-hEJwzm2uw;d)pPMq+K}O_XsonE zv*ZCx+6)inOCsQlbR^}EUedqZkcE;TyrwkcseEJb16zSp{-mH->1k1tC;udqQRdzz zs`|+#4JePS;32#+51gDgY+d&1KR&K1UX-JzUqn(Lixie{^k-IdDRSuXK%4%m{s=F9 z@L=AN6pi$MC>!~pM;OY1G{Q3qR`Ly5kXw^oA@Ji*VM&V+%!bonz;ziD1!}T8-vs7O z`A3;RHz`O{8KBV0=}7sgP);u8LLX0g6*6vtM;a4ermt|!Ger{I#GiO3fAt{m;6z<* z!J_n&-_%=3P)3tqlLB0^DKh^G zm!AaWM^gAECM^r-pNss6%k?vxpvYwGq1m&mimkmU{}$NlOPkgsvCnqS1)QhearXIA zRdb(8j4Zds$b2=%mfB)?fmMlbNC8+j%YfVW0p#NM8FWR+?7d-V44BiG-Slo0z5gKj zZG<<%e`c{9Cc6Q2MpPyovz>NFo&$x~4PhJYWivygdp1*>zV60DT(|?-{f$7Geh#}5 z9o&FMoRz{iLZe@%1(fp($g}|LJZ1k3*$><@y>fV9rFWik8D$*I4EepBzZr1LxRg6L z@cCVK>Tl7(7|L`rjxDccmH;O^D`Glg&ra|t5|Qonz?kMqR(}=6qIdViycc$V`V=jc zYVuD9JQGd>P#M>8BK$yC_$c4ZCV~@TpdsOQ0l`v~5Sl9L^ibqM-*ggBZX&F_n;q9k zAz_(;kyU!E3S=Us0l|ty1_aK_A#QFDMrnte>ENcgG?+60R;I2g84{)?fSBI&uqMOZ zDLgj?w{%8KT~0;93PWx)RUS6UkMQu3RtCbK_!sS4?!GVH`t~1>9cwPciF3=bV{31m zI(01ix_hIetJ9McCjKbknEWuFw#(ptBGoqQyk3tEb0_zpirfm zQ3dGI!@=d`7je!iOh>coSG2^8+$x%2kVXW`HWll-_NnM^8;;fr`CW}ITerrZTko*K zhYKb+n}(Gpue^LTPM$s$3#yZs&R>ka{+?L3ZbJ+XtP(dGw8it4t5==39B|F#n7pH` z*mk`}Y34jbCaws-C|Lcq93fgln*|7!LlO>>@PUv=^~cUb`N~UA(U$a&Kq_C?8Mb1B z!zvW&59jZ3nTzX_OwK)oAA}?70%rzt+cW-CQ)(xo!wsDssx#auOFd|n5X)*lZg!s3 zGq3i?_TGufN{mmbj?Z3+%U7<((3r|+sTKo01OA#xdunM?KAVQxUdys474vh{%Oy<` zST&%;X~NUmia>|ZnpT}M`Dc>D3OCY#V9Nw-aP?a8I;pxl9&6UEw$OIZJ@;7o_0_L_ zHU7>=KT4L=fm-q9uYAS+tenFSw=&S4*h>5Oz2Oh9869okqif|6#ZMWU#x&}P`%rkC}x7~WH>OO)u=L#NiKF^3pCSS*n9*z6n z{ARC~%s@PcUOo~pzOXO;?kE0kjHrG8`RD&Me(q;}HX(@E`hQi4i>xq0kz>ZhEs0zS ziiFS)l>uzAbv3-pWJ<8EX18S5r&qAG4THR+avzFcT}Q>JFo;Z>c?I>aL}vzwr<}V z+qZ33f8M4#v=GORy%O9=O~0}GmfdO>z3M~x#3IsqFxlSBILqz7!>a2$w{P)5=JahD zuzu$|kNM_q&b#G<)WL%XJn=!1-rC+~g&ZFutW4KCc2Ba2NI*);(D>d61S?X11E?p} zSdrg2t#oIiigXVWs#T)$~^?Ao>|n$>@DiO0c9t?{{i-SNd& zTGjW8UYp`kzsU+8Dvd8GQ`<~RDy0ZERH4%O#V9c(&os9y$h6$`j>3)#R>)!~44e~$ z(b(ckI+`W_SV<*2Z2%l9BN-@~mZP9cC4welY=@jHAQ3;962z@Arq!Ar`?WEOoIS(;WrB_(|e z+j3FFsh)eapJ-VT==Ze3jd9xVqLCDGTji+)(jRALK&4RslLL(k7blOFoi5ukKa(SP@FyRifaH#HAHnBv~|U zA-&Yi>*WnCCrKr+S$iL9`MJ~cc`NuW@s6bc0(UdlnjpSeI4~ft2YAf(ToX7+TPw8Y{ zQ_$y6v8u*8XHzwhjocs}!cZPOfLHjL#}fbi3C~$9+QbLYZqo|M6h=RaAmy{=w`6fR zvcr5(X5@ps>@H3?n;oDEC)Sg4F7p5_pF_!f4A+7+%ftfrA4KN3QhvdY(?MMa$B0Hr z@fZ1ng3!FZFP5RM+~?k4mHed-ZAo@Qs$ zrG^WV&scFjr)NR^j*4IJiyCt!Q_F2}u@ZBNcXF{M#uutFy4V(@tOQ)F#qb;70t}1U z{A&Vv_17j-X8ny4Bkb!;Isj@>DgV}?%z9(8ad$DvQXj}{o`B+!`Ur`&v+rA3IQvyX@ZxWj=v2ex}vvR`vtR?f~|jUm5RaG|FMh zkliseZ$O#XvK;`ok)G>7;oM@)nx4cemRfie(|7!>4>yPUkm!s(QW z-9njO>xxCT#7HP$kU`KwxI%DckT)HLHR%cYDIk|9%%bd&eV#+JHOkBl3B6PCYLJ~9 z7gdFY9&{|YYM4auPD_crD6hd2TH3 zc+3AO-uWXB#KzvCICf?+c5dzPd2}1rZ;tlPHY*GAAk4%hPoB7Z0RaSs#MH!ua68k$ zB{x(>UW?udu;V3@>^57Uzq65P^_!6+w) zhcnnNU%up(6$mD*24qzr2e~uZg9dS-SmL4za4ufD5ZoHPYv)e$hA@KwmsfNk3@$85 zkW?K;iOCk^scFu+(IDva>JUhqV`5@Bnpy{AsrSKHH@GG)c_oGftO~2?G#IJ~+bBn+ zt)e`iSgLuoALsv3UFMYjs{BMPTAJ8GA;C%I$rcnQHcP5YY!7djz#7Xl(cjq|UCpD> z-aHYV?V)^Wjn%8x#MaH5W81D<;+9+XL`Pe@m8IO$d|8vZS2SrGRl3=JGcz?U+7jF~ zsr8Dvo*t#O)vN3%PgZ)M%t86bSz6=`>0FS|M{_{g#aTI&Deovy$#=GhA_TDl#R9WT z@)^N73toirZF=I3vY4KkrdW*cug9WCJScFh%~jQ%cE{h--4p!-1L9frU-gr%;^U(e zszXDfF{w1o$BcweR%~7!ZBiYYjLDg?7#o=sZ%fhL+7z?PonCFpLO-(7O-p51QQNDw zE_>Awf*X0n7uc>2O%f`keL?(k24CV0B^3wlQ{7o0|mqwaJ2 z_Qf;LJQMfde}CMo$v=Sb#zY8w+J=R}72wgw9*?&@{E$}{aRwS~m9|1%N3s6E0}s^0 za{eAGs<`k6$b4lWKY+~ZlTSV6ca(s66(C!Uxv*r}ef-2N&!fWtjAmSAwEy#N{l*Za(xLTPcBp45r7~?^%&YnE! z=fB4;$YV3%aV9P@o_8KVuMF!9t)39sPh*Dg%$rP;WE@NALKXwy7JM)nR!Iq`NT-H3 zA~3(RqQS7$ycoanzDj)R?ZUA?tK25y&`SsX5$5*WZ;$nBSKFOSdr(es)B#)U*RETq z{v)jz(wx{lkPMCwU=q1@^`MhO?BDq2w_?xUJ>I5YpXAD2LxIMKE8ap+`=gJ$=iYmx zSACL`oF9HL6;FCkG+r;jqxsWASQx!oXvk(Ui!8Z#`C6RUc*(~QE(=1TQRl~`mgC^T z!@*@-=gyw9xpl|3dR?FoV;rOXEzs^1h6|w53Zo{C8N+ev)ER$(;2cu=18z)5Y5M&B zmttmeG`4Qr8Jjk(x6+ev7l+&8&tB|^&mE}6#GK@es$>-86XMge6zXS}I0q0ViN*v) z%Gjsg4$(>(FHDUEq}B3P&e#H6MUmUs(#zyt3H6zPB*q{FE3AreSwZF(;SeWimidsy z3ZK@s@jKn{qBKL7JW>6(yo&qMTp`OUecswDlM6nO5y?~B zEU(HQCeG%>1n7FWj>t%}OWaS;?SQu82pk zXj0kGV$;en_%D(yaF!rbG2RyP1uLd7v!cgacD=P#yzrq?@qlB69^o`@(>_{!#$VMR zIoSq`GLVm*$TVripCok@S1sa0{ZU%UMmUsL(1tl>3v!y=7%3Q4>D4I__*u(Cx0tWBAg|l)|7+JaNaoX|C2ge&w=1Zz`@X1F~D^Hc* zaPE9jcq{K@hZf3UWDPG4ApZylo^8lr1R-AXM0ra5ILaSIEa377K>+WrPyE5J=|Cy* z4zLB;wNd|URrXnlgn&L%md4H>+N= zomb8V$}5#;N>|Dk<+}{(B(l42{6*o%mR~CbQ4Fh_W=pWT2J&xlp%U}t&ywbK>c_@d z_2=7vTVrH_6@axETIB53*R25j0YJ*joDY8ufY3?+(bpnOeMWszOHd$}L1y%|Rq345&@ZbBY2*SrG=B-sVd})G-r}XnOmt(o~Vqw1l7od7p^`zFwOY9tEJ= zxdyV?Q4K0py(4Hz$f8sB0od(|Q?zDTrAI*F!!H6KgC;a^=k{QA#HPVYKD`rP9yCMY zH4-aKr^3%hW%x)eb*_&lZWPu4;h{+RVnG_a{!u#Ke*Zh-{qMXldU~5R5t@!Yy9Q(b z3kPG%wrv)sIIj!=0AY%>padj7wl1{sGN2GbAvZicq(Nj}ei|$^(b%+U zv%+-7_}Hi>A(K{|AiR-olq-X4R>$PTv;?$taRN#Ywy`!VPLx(CmDp-ECOZPkg^QOg zY*7AdR<9ASoF6!Cp&@N&>hmDSnQNRa#>yn0m8UdeCmkrQ@^%FTtxFe2V_+aD8BwCK zwKP?~DNlwL`|pXl&by;aewD?Em{a|k)BxGmyc|8v3o$g`61570r5@E0Zc(f#?-4E) zL(DFrByRHJ3C z)$7)JTkw|6+dOgOat`u`;zgj~auf0$8$8OEFbH(%0+FN~rM$sIK!gs$2Bz~*!ZzW&Iz>V~H#8$G4Qg`EN=3GeaO*BN z>CVhfdlldmTYfcJot6O76t$R~YgTzHUq_~u7P+fUbk&-or*kQ$<>xaBD@#guSFlx` zE$d=ab&jv1HMt>BiAUvsM;oi=n7AxUz$Ay}qfK~B3h=jJs5XVtn1jw)LBQ5@(twg{ z+t$s|*|#~yN2g=MI!%5jrd&^V@80FS*s^7_1w9lMANbK9CF|-ynf!l0_qq7UM?T^+ z_Oc&!kvv2>_|u>Kq}{;<{_v0f*owP#>(-gKERdrV&x&x$i*1kjCSd?2A!kXV)IbTF z6@DlMQ8sSau)$$iIfU}B%%_s7xUTa6AOsRWb%L$QC==Kw&6Z2j^7J#$#{F-8Q%p_I z#L1JV;9aLQTm;XI*mw;xHwW=>0~C?n0K~9D1h7vsvRx>d zN1K_H>}9;futp>~dhVbnp{76{>IBfk$}onP%NlDzw@%*vAjkzfwB^fWG4}g_$Bu3O@In+kL=V7EE>!a6JC8mZZ-3j{;?$|Mx^?@G9X`Kw>!uB!{5Z=90=`&e zN}8sfiA6Or10+pbKH#PI6b4)%n`LNpgF=4F0A6;(p2ZnQS=iAro7XJ3Kt1JUeNe9Xoc$>b2`* zWOOJ_9X}RVhsV4^c*mAa(cL3@V&?2nHNLQ~D?WRa3!dPH9S?lO5{Hzx`s${N#sH0- z$wb)%_u!HcJy?;`NEL}x0$o4#;t!~9Cn^w>RIX=5IL9G(3cT({IJtvMH271PD90pE zAqgdgM-GpPf8hol;&6P0o1x$-F@{A>C?dcWXsk~(3SRB3cj741fhX+vyS`$VX&iwY zsFCCa9gRoC1AWsYC?@4doWgBV+Ef;b=TEY(VqPTuYCvh5VA=|AMUwdU>NDzIC9TSXQ)GeEeiW7d7+dSB zw&)uKRvZbJFvxAlk!khbb!8T~mN6xhqWDAJV5|d|@T|T=Ns?FdSqX^ZPXd)M?vNiJ zCHat7mE6V|#whv-oA|J5#IlL`GmqHCsFi(%f<^R^6J2CVvlS}}DQ{&n>4Qp2FN#0< zNK9ABT&{vtR>CKK-t{;)h@U9278df@N*I+L3cH2Ep7Rxj7<@W^NEh=4%0jfQq?0?C z;Mc=or)>Cx57G*b9%yGdBio7Jmyak+mhbXIU*miezus=FyoZ+UMVXS%j1lAy3P9ok zC$&Z7FnCC~t}}KMKc<;zD>k_GU*-eIX-Z{DDDp1VE&TY6g<`l6BJCcNv5%2#U7+p7|>SafqUMbeX`XAmuOhnD(L2 z)I&#~#(Cq(fuktuX~&;>sdA%BL0Rj#^*A1xzGOr^ao(RFjj`PPOFqp>c2-gQyMPsd ztOkTHx(%grW}!JIQ2;Kq#<=D=!;4kflLByL{)eFe%%w!`VwS1rcg!~onb6G$;9eB^ zO(7Tg8)Tp;I6r@zkn=P{&Wd`L$YNfx1G3cpR)9vo{9bl1yOklkHMS(&dCG3NSisL= z%60(!m5L9X%nQ)?4%`gqjp720cAm!cmBXx*{tS&Yv)^mEH`2`S8K3uzTMmzT176{2 zA*}Gjqn^*Q!C*OVzjJGR zzg@fl$C?YH(mc14I%G5IpjroRvqw z#fuk2ry3hKthW$xLK6wjNLs&PgWfrFVlGadI2qmDU5aNR1_pXv-cxM7R61D|2+r*E zO!V~jc%UPGCUse`KnZf<#0g(+0HBarHMlCq#>YH};!hX`KNNnfh?`Yf_)<7FF&2Hj zeKD(aa!$tB$b>HjS=7MCjk4nt(@M|023Zta%ihx3+rdh?i0QW7G1YZ%bTm^h7NV^p zz7`c$b)u>=ZdLuBposLhs3|68+S|IML9`NVSZdQCPFj_7F{65gBC4kM7CEa_k!Yf| zStTYbN>qg0n%-5LqQ71C776V!9c?Xh;%_#(#22Dft*sip{k_qzbgo^uKKgq4qLbBi zef?I%wY7CvX~uw$kVf86KUe`dGBjj?AHj@rM+ha~Qv9h*!6#p7a^SM!3xyy;JAfdL zrv+gBK?kKQrj>n@lQE-woS2*tEreNwAC=Q0s|lB4baFXH$7W(|lKQ(G^K&zr^v_3E zr{Zr;+r|faTFv{2s`BF8Yz*`gH)jhX@I?&vR%1p2%%X&qO7l`Q({5EhmCBMQ1PEKT zmIX}&l)1Ec8Jw?z0G1{k+&nxQXV09D{=q>j%uby+6T5bA)5Li;I=eJE>gtXQs^5F| z>{Tk$mRq)=zw1Zd8UNz{^)KRo{-6G5xjHKx2YJb@)zsDZzUMvm%K#Vu`HNqSx4-@E zs*k<)!wo=bm$%mfi6+}K*p4&ri9Fi`S?$Nl%hq`Q z`F-)g0}p!DBk8q(DE@Ms07_#nQ(3ioRUAC{a_rr^+w{OWf8j!W>s#NBd+xd0D&yzP*@<+uPpCw&a1cL(3mjiiFZ+V!_iWk!VzeBS!t59WxXsL5|FSOr*O6mXA6#)nrsU%Z4)L4 z{Ft!#}v|w9omu~MT^yz&{@zJ&-?W_l`qN@;v_Hhn(|2m zFca@IE43?`gmbw--~3P>DCorRLMq#QPBb43knQN}Qk+VMLLlGQ%cQVl!UK=()CKWX zRuBTzfAt12H~8 ziC~T>`=v@orA&bT_sL8yIi9~Q$jMoW1t*K245f5pB@0rYaU*2361wfcO77+GD}}|( zd;;0O5pt0L;Pc){KSS9ccr~0xc(pKPzRG-Nd)W=hG;Zd%k~^@H8<5>|+AlA5GmGiZcTHB>V|) z;zHtwdj{#y6-Q5Zd)#@?E%B~*zBM{D0Xg!@vA9hWcMj>_eakLoP1=6TK*YH!oV$i_ zhth$qqyyY0sIp~HVbEXDAcjDO@W5n)Nf2LYIlBz^UQPCAW~Z#6IdI^`ShtRgDpp(Q z;XJYlO^)VR*`&!22Qo9<6F2c$`K0u7a4-rH1dt@qXy8-a+*Dj;o956pD?^y%p}=6! zMc`}gY>i<}0J}Q7eS72l%(TjP-rL1`di%WkjPm7TiuMkbi~g9v`73ZyClQXOXC^c; zTvI(@Zd6q(%@ zSLXCAL|5CA;zMz(k|!C}<>+9=obswe0)MSl6I8{Ia*(aj+$_x3bALHj9$jXFTEuGi6q%vXB!DNZE|ClT=c_)ui>Z3?Q;muc6cpp)n zLdiC;YS0QVE*IgF4Cr&?=v{Z+t;tBM@Y&`uAMbzv`{NJ(;1A;MZ+}N@+q%VFSy6?= zW5mDz>}TUsKmYT}(d&RfNxZbZ_q_Yv3X=p^fM3qlyu zCKxr-@>t9P3MWB59YqkoXMz~Kq1mG&R{bUd+K%H9Sn0?7gfUa)V0UP1XrtdED=8b( zl7E_z@FEY+XLNkBv;Bx|_)`izu^j*4zKH+FN0y?s1L6@EE?tRz&pqc$q3*u>&S+J? zb4B&<@Zp!$2UX+NTlZ?r=qeO`*MX>66!GmxziZ|6ZF_cm3otC?VkX_R)03x8#pX?$ zW9`~iPQoQF1`^M`>ht|^LvDnTld}vM9iOmLZf17ID-XGSoAffd<~&mR3M(PhcQQV5 zY=IRYa$|)OADLKr%k7n%ql9_(+y$R^>HbFr!nlMI9mOU`QSc#+k0gw_^fgSn7!#SG z4r+`Kwd{nAL(-2I7`h2quN29!2QVBL74eMImw|7wp(Uj}<`BR@}%Bqy=Cb zCO4s4>0)J(+*DqSU*vz{C6#&VCtb@`WhoP?WcnCw90j(V0bSxGEYZu%`3^20N|7%x zQQG87g8(bp2&Zv9E9P>ZU=llNrK}RYoDuQNL{{x3>?n^D7ER$RX9NW7tVtgk>+ z_?q%Cm#fRC6d(N?iQyf0KxtujCIa0y*Ok{`GLO17T=;^AZTA<~1jpYqsKVtWf-oFSf?$ zB1%EIEujGX)Tvb4;S#e9Ww(^Bo8x5vzc%Cu$`QR5ad0VY%rY}?gvL#vT(SP9p)ol? z<9j`g*=$JX_uvrW_6#{IbJ$D=TpsM@qAc4Rab68Fel~9g zW&hU`rqS=!!ZiA2d)XZ*<21SfuF-pm7Bt+?mxY|vqzu= zunV8Bap3vjWI+7z<&-d9er*MvDEs1%Neevbc3$Buu?kEAE;rp_qSyn^yeo`^v2^JJ ztC~<0O=*;D)kLc`nr0`2BH_%+M`$RF;`LWs22RfOt9C?Xai+*Fb^3Foj?-rVdONUq zRGw9)hc!`^Wqw-GS7T`!B@O8lE@=~gK3h;c_4jwjp1qsmoo|0QR~YdKH-Hq0B=d;~l~4lqObe9c5xNH8UHX9o*2HZbwDfVs#IfJxGMH;(4;+Ng^w` z7!diA1|a;9t&@}KoTNn*z?vX&sC~2Q0+&vV*6xayo~;rZD=HdRUO2@(hq3nI)HM%Pv4E~`xt(C0M) z;h=izqDmwBJ5_a;+FghGdaB~1Ev9GHUYcg2ud7{U&>Z6`yFvMNYI1UIoVKO-mN|E_ zC&nh`qg_H!M;FaZDN(-g<-4_p5J(r(8FP!%F|YdD+1cz>q+FyzTW+g~M+rczKBbOd zy>itP{<*nXO@KP0ySGd~C!kbr7nKynH0y{hoKbezU@d zdV=zqHt^@4|MU2jU-|Fd`Z7?z|MDB(@a@^0OPT$s%f$8Dzx~_s>0kJT8^S=7)q4jI z9*hru-~)9(+5ignKmWoP;^BuMwlbj+*sjYBzIWVlN4)vXZ}xV|q*!2!-;UU_d2WLdqQy-TelquhMaQxAw4uy5(on>$t0MmMCnI)l0I|uJcs%pW(;iP)@z>s3i=mNG zk3ZBE+7BP3U=4nqgcU&DSUmC6Gj4Zx-Eo`wAg{bo^&a1$z%aoYK*GiPOvSeeguY;I>id-lBYWK!d8Ukt87 z5m-|nU5Q7Ix5ZZu)#3$}zm-wcS29gMzWf8Zj1*JZv@6f9VQ-cy<>Zw;UJt)kOt8%5&*hjd$4cFOY4{#NC zw&wyIM8w)ikE04}iq$RYc;6-4U!< zm7}smvWwf2_;!W}Pt4~_6G%FW3Lv3WtdR4zRJEu4aS=ra(Qx^g6?G^8)u>xoNnfnq zOKnztisD2mg51ICJ&vE?cK8-OSutZ}oc^pxsv_w1Qic87C;WLf<XIy(I{g9v~$?}PTbH& z!3QpYLWeNW$8AA%90i?-il^)0Qr=Py=^c}J0pd^+^rX0eGcD2m`&kIJ9AN;&%+zak%ja=bb2{9ZQ|U#>&EJDl9$2rj@QkD+Y^nB2g2o?%lO zjGxCAf%DdNFXgf8tJ4av;*Yimo*vH^gpP*`L^AlDVbG~yOi8A~v& z$Wz)VBXHo#A2f|ia1co!G>bIJKbNuNF7k?UOrTg`ricqRsIPg2D<kFqr>1;v+4su(HZOzoM4to&mYAlrUh(#k)d z16YkoxlJuq)uZ3@tN+xoCZ2D6%5K2!Tz)b%M)GO^PMN_BZ-mAQK*^_4 zEFAs@A-6Ihn{brnNGInDklpip8FE7Wo&E5*MrL7Bup#(9iG(^~3ycV2jylEH#LB=z@ln4$ zSnd`AQ3~>fmK%F<_vIhZ6oI9gXsY$fu5P#5n&KmTt6c-aVwnA|R z8;V3GR;$;nHoq4yT~Zp@rpz{{8HF1OF0Vi-Rjai{XIFbnO-@^J$Jb5m%P(vYQ!@|Zd?ekeK?E=H5`W4di!EH-jUka$3lWYrOuh;Sa}H^2E!$H`?KtXg97kK%x>mTc)K+h=AbKIFE=6pvLI#7!R27I?{*z??aIHg@gW>6M1?&dse{)PTJI%F!dfx%5x}^iSQ+ zv+&>9rMBMD9ve1p@V3N(fqwH(96Z=j?yxe73vRY<*%||btKw^a@inh%1b$&}Q~ZnX z$kI+-k?CScyt$F`P_P-WXW~HiDx2B90<7d!c1!j|B>y$qZ+Q2Z#&aW(y=CxORAnfq z2~eH%IF{3uA*VN68T;hmp{~dpKeFRv_v}$v{dml@OEUGK>`U*Sf)!ns@YG)1(Tq05 z?|iT+e(RH}zukB?#Y=|{#{t!26o0#S?eIsKefwUpg6Yn??u<n`K=mf=&yT3o7IGmKKf{^ zUcFB3q3YGaYu2o@Vw@Fwyu-ul)obI4C!bJVU+>A=V1FNTT3>FmcI|4l<iasAu(rww5 zSgn4bx3AZeRQiTd&fuLGS06CsmHBM1@9gMNK5M*CU)tQnDsA$M@la!u=&f4SXN4ki z0w30>znr_&uqLG~tWQYVM z7dsOGOX{Oyy#a-ROdsmqSgcb|w~@z^clWjd+7i<;A!+br*Tr7~cpBdg1elHu?t z&+x}2U%=r(4&)uV5IY|x+1`ty57|=VU)t`An;uC6DoWMKwBoO?yDbL#I#jOIw^pz2 zN{Wb-wxnQKbTL^mqc-O4oO-}ZO1!jkE3FDl_Kb_H#O=F`Gih6UyFU>5JigX;e`sY4 zZs(E_$tWC2VdWl*K7~W!$2iN*4Z`!Jcfxd9$!A)^Wy^3{_19vBBl0S%q_F$!K)riM zhtk#}ncger#H-VUNu6|Ypm-tADIXbfyb=o52>z#1rIPqn8b_nqo7Z{w7cGk6aTD)%XtG4_~769BsZdh zHjr0dVxVkf3`6;z@`#X05ovtLK(pw7kQ>wd;(FTaZHfA+v^s8@IyU+b^vD|kY%8_p=gWG;MfnN=(e9Ex;2CoOzC2^FfUbQ;RJzBm05`fabXOSO009gGMO3nZsoL{vj7j%B1UN zCSHEtD15)+UIVC5e^XG-7Lt-pgI=gqswBxRd*$PX4kQl?GX<2x;7@#vP{u2HQs;``H9EpQ4ULhfmI<5j6 zr|@?@F2WM8daiVnQ{iV&=c@MS6@Cn43P;eozk<>E@&_TvJ9>IU6o?X@DjZ~uf(@k~ z;StoDTjgF&*}*nn!b_N7a9)N8tNaiEp^DJP@~b82p&(?14T6VwsCI}(H7dgKN<9fQ z>8rQ!xG|VB0f_`*ucaMLj)G~j)YctM^OK4TWr_f$-@?57luiZr*LJ0`2>}P85aCk; zMQeMnChP67eaA)#fP-FTw0+xl-@J*Sg)$C>TRN{I4bli&Y%OH<0TU4Nk1ZKYCQ!JL zRUFVv7;=>@wJ6pIZ^2Cut9?+MFd;z+fZ)c8y(?EQdu0{H!57EziHTUN2@eyTF-=%l zVaTw`pvld@@WVMUTpYn_C|0JycRmY^?Y((*QJ*G2Oy;=IVP0usyD`cU2H1HGj3@|E z{-v}kekH^cNkJZb;R^*~YpW($p|YtUSR+s%46;g&!CC2FJQv-QFU9iQxav)BEVgtZ zl{k)8O@R0=IHzz3mDMJdCBi6WYpP!= zOK!#`i`mLUTF9SjYfXduyyXG-M|nv4m<4x9VCKs%g@+Jrc}732#kQN-g;`IeJ5*NF z)2sk(QvK*qzHxEJqQWapu2_rFugOD2^?OOeV}Eat>n~ebtQ=MyU7V{#dsj_@K}|ve zX9O*(8n-APCA7%i+a`C;=~LT6`ANG*I6*ne78`{0qWL=Ls`J$Q(Xla2g!-&}>sGp% zq%fgbvzCixl)oxhRtB=dl$CQ#qFvX{Ux;<<*E_$cb11CnW7ulT`CrG59gnSBwz&Re zU~=>P3olriN1LHuQNUKyz8)JN(#N;@v^04P`7$?JX3KOcMc?seHi z2f*a~%&&j_>+#TA-x_z^etR50al-9`m4B?hMN!UqpPM#rjP>i*%G?wiHm>(&EoaW0 z)1-eO&YnG|Hh(crpFZo=LMR|S2~-^83eT2YR_ZcYBVXD6hyZ-y!Ueav0|yUUIf>He zi(mRu?A^1+{P_@fJ*jmiz|KPo;Gfp8QSm+h{0pjUedd$PBF4vtmG2vr_T|`KYl_bw z6sEewv@(Xw)RR}Fq|7BF(>r$DaztelDBCgfgF7TJUj@qO*$(7jnVq^rnO;T)%I*N~ zH~1F_9`7KEy?6jQGYLrJS%Tb`U8hy}XA~x0&O1Fhe*ADVo*v?oo$NJ=+!CrNDZb_5 zrg-oArg-81vK$Y(s4H>h+O>H4x#!%r-txfxRso!l(4Gayk_klbmzs&YRYWlc%gq zqt5QwwJWx5-sr9BSFT?3ID>MYuqgMoZ`~Y^J@KU4$aHL2yNZR!v3|{<`i5G(xc?!jJ>8v7*UN{G zs7>;5A$*zBbI4VqJfpTZExtfpjD7r;2h%KTHOPpK~(_sacMN(W>8lKM!0uF^P~Cd`y8{jl0P z9iZZ^wY7`qF1fX+&m4{sji=phUE*QA@_N~;sE5=Cv`JpsFj$E@*38GoZcQNPTH@j) z{g_IGv2Gbzg{``9r7@1W?Di=Ko4m_T-L^^mdT<9<;~1kxQl{{za9kUpFB2!f5=OXk zPWW=t7{VBAfB}u){-8mpg1!xu%`U=jkD}QK&Pqb+ zwP<;}u;OILi1|{yRs`xDzAFe#N)CM=PqXAKZc9x{KNME@DJ_<-67PBLkXP#|qbZeW zfrjgdvQ_2cF&JOU15<8%JakPEURH<^9s@K!cDg8`sdCGF0apIWA9{Humsgf8ECwqG zp${&##Ps!~V^%7zg2-yLar~fRy86c#H!DE(XC)c&OO{G2{pKtm5~8+Ey}*aMw@T|t^m05l z3^|ok*I>Zr=Q$Q$$L@ajtRPFg5;nkab%0pAaKv>J zhKM)iLrO1c(678rG~tM@+mPCW`!e-Ggm4`JKy#VW-cmaQ!F7VV0$ou>X$LaDxbZG= z)XKed*1F_J;d=}4JSMUu{wyZYcsmb0bs5l8|EL(vE0=;y>zPphJvpyObDVKKlk@2; z!0CmSn9*EzM)=OBx&rWr3M4Z_*-qB+{QohyLi{bj4Ox>ai=VpN_rVuIAoF^HmhsAF zcE`-n=uiLA7!UUR0NDhuOsfp3A4&i|Z4C2f_}RT2ZY9WZXUH@g-CqmJ;mYC5@A=8R zWgMW4SN6~LGOR?SF`qGS2w%K7KV;AT`2osy(<&VDY{7A41VPDaz~91{1Ka5angGf_ zh#??BpU%=a*o`1-F+f=8!cjQtM8V}Xcg(2{cv!I=LBNBo-hEIlLLmcevAuV>B0s{= z5hJ*w@Iwi=Btc8Ug9SG_b3W(GbUGX-N<)Ef$iq$k;NwdC5;ipi$(^mONjYOdP&ny~ z8dmn9TokP;`yFLY4LNvBT~VBAC7DJl@t|N5{5%ZKk0w5w+r)d#dEjl$N@G>R)WBe? zCjJ{VX#wW%!q1qC|L)T(P0tk~6ctA0< zYu9cIf7`chvvOnT+7++BUb&S7GNbvGJ%|)oU(F>?I?xLQF5A+@13vUsJIyie6Q5)>s-y z{%J-*_dvI@#3m4ACi!UDZ zMHE~xQ&WBBvKUsu?A*QE3PF@?Ok$`>Z%s@Gy zSYxH%u3fwAM%~me0bPFFbdAECcX*}^Fj=}JcUICukJWi7{r>FppO1I_$d6d*LA;a~ zw5F!H(YqRE46a_g+AEAspFZguerZSC0E{AZjdh*|T%U_V~gVz8H7i zb(i`2^DllS?z`_E^M23frTE67N}Sf5*ON1<2Z8+P#~GDP0VeJMM&VtDmE3@``$`Xx z&2o6`WytT@U%-%e1MS9mZlI?Z(kUY;F65T|vI!7IKprufNm-E)uA|`yj-J9y&V>bo z2mW$AdJ11z3LA#nZD_dp_aAJEfAw+oC#|&nCZAt<>Eg9`=&f(@%DT%}hvLQk`(t2W zAnv&RR)0Y9a9;rR7DX0ynDJ)kwym*k`?lb`O;&(TPfw{%sY4JDy}BY_rqRv^G1VF7 z?ySlUpOZz;1>a(|E1M~=qC zafs`IwlP7Vo|8ldoMJ7LTiaCSuRPp!&vHujW5~{DeP*wP<{6SN}@7 z*^1ANzMQwqYAVLMbVD$GP)+5b!nEAP?e6rYOs0`@B&A5MNy zzxtVe<6paaC1y3g_H?zy?p1TKwNGQ0`txg(O=&ftDxKS^>km`zLSA!q0GdE$zv4%a z>VXFz`T;AQ;YVg2hj(aUFK9utWXFeH7nbD!jSp@D>St+m$yNA-)7WZRN%1*ee9a@c z`UhWhIHH5F#(}P%f*$BpW?MwUEaRWvaWe2ugQ8u^upM0YQ9OF*l^ez-`O z+2?mw`k~;9S;?Fz{4_4kYn-;?k4L!6oS_{4Xx7`+8vVUpUiCN7+o`^~U1K00)8H&A ztN=cQvT6=RE{Z(b1a;R+GZC`_4^#a)mu%#fckBpB?=_DLy*+)B&ln@RtjxY)b)V{E z8!P`LGqtHb)7JTD*42?NDns$dxWrkT+{n*3!kNTb7Nz}UyOn*4*GeAofj#*p#b#A< z1pK4iNPtY2%9AioTT%AZOVaNLKjHAvfokC&%0NKaR9gC#f3CmCUgRZx1w~IaPD+{d z(1wg#(8zq$m4EWL+y+_UXGM?0>Mtp>XpiZ!60nFDo~_6#Xy*^wDP4>MicfqIJ#+yCT;ja4acF!aH%!8q@Td`6n5AVofb2|6rMj_JHc=0wVG90BmxWrvJDt!H9Z zb26EeiWVi{_&loslM--xQ8>$*%_zLv&ELENkc`UDe*r*A{Y?N_l(WfEW{0w4`T0KK zWckp0{e^{hlAyEnd<0XJyiUdBy*-t{nLzcQ5ZSMpy8 z%5-y>Y;UBok{f_qIZT-*&={r>XQeQJ-{nA0W?`&=oX;6}CtzJkCr|tH!vj&=!71GB zpRDzl+^d2_XIO7H*k$1F*8<1%7zi00$aKZ;&KtoD6XlwEF!)D#hQf_OR_}zN!^<6g zpyU%>NG5;9p$^ku+LZQX4JclfB)(XIMVKa(d3E~2M+s=Q(n`E#y|YEq=Lph)BXD`N zk=e}GAC!f2ii30IQ09p@Nrp|FDTpv90Wa7B46mH+f^w0x!gE_sG)d_5d4TY*fjpg4 zC^st}#V6?ye;(*qnMOGAGteVJOr-Yiz1`<+p(sEg7#be(mbfbRb*V%t0`uiJEEqCl`Cuq<`%oE$}epN zUW!)HMs~CCDSB3L$qk{`N;%~vHw1IuBT6t1&}Z8hRg2YftcHPk1Of_%?ZGJe82HH- zl(LnAC)R`AW%=n`LieErGtmPJ$Z5>-42cL z#8x`$EvrGzy$oSzV)s8NVY;vxD4o^JB(%*f#moOy#JlcF2;-Ae z@%Uqp`zG>x@3})xONIZB*ZEHSl%e9~SRQhzb_M<3l@9c_hjcZ#r zZH(vDM{x$$>i#|-adF@!Rv0dMJ2978?LV+Ty1RR#Pvdg`K))t`^J>fKq94xfJ%9F` z;zprUwIYT*^5j|=o>+U#W2|At`l7~~Ii+J%ee#@nL_XoD29HfLIWrf<>(tDY(s$YI zn2!OBque;|V>+rGu}N9EdvGBJIw~{jT>U9y}%@**4ZA(6{H zkO8?E&N8OnId(*Bu=1T%e!V>%F)+{(tNOY$rgcU~XS>HVjxr$)S;2rJ$;!C4b}Io{ zQAb&$VBw=+I&Znfeh#m)wj!{2N2%P6Vp(mJV`NYSdX=AOqQvtSV3dG*+FR2((rjC& zo_7h4?Z8~B#lr_I&e5#Z+Eu5JNz%4p;z4PRQW~cDFpHVTJCuuzL%j1OMG&j|R9z%< zT<;f?62%}V(r#Qm;ADjqw+CBJB!587bwhvPq@qJ{Cz_VI^iLGB=i@}Y)fQ!o-%~rw zk5}SR))YBqEkbtJn1`7!iy$pN(@-XSVb=LZ(Z#$#cqn5?gSm9tld=h(IMwVH{ThERluL?2nMQ(${;ez|Ov)FOZM0M5n8b1Nr%RyTraDQTvX|3G3pYDF z`hh3(E08G21%(L>A1p;jO<-J((r+UZO1zX71*o~)0WEGaG2al>7 zO48hd=6dRCCe@Wp%wunoS&Ol`rkIp{auJ1KOU%ezKp#+K+Yea*NS5>DTyjqRmjNoE zRN8+7klK{8CsodrXTa;sx17b_FXZrzbQ)>$UdAiqH`?=)@iH{NXUJiJjFTS#vmACM z{A`wsE#u{I*^fLg(_6m{x>qnrzieakxu|{z7r<8j44C)L2ayg&s;jR@yNDG_jJ0 zxHynn?+nt4BaxM#I%^+d-_jn-oabjno#JcmP#lwq&lcI|CrzL8{R|oyG!jH*ek_(1 zwu!CASrJGWwt>{T^z=oAi$Ayxn6Jd$o7KaQ1h)$J5B6w)S&BPvzrzC?TQHc^v$Zjw z+cz;aAz_e-LW-7^Jfw#MgBj=;a1pl1Ur#9bBU{89gBB~I5FAkWvBC~qRz*xrO?ooV zY9IzU6ffW+ETYIGtPdYQb=ng+1SteNl!FMHY3vr8R{2bz^=4OX=&l=7s- zlNyEBsLUlDT-bq9WA;2TE#&fw7{Ry9>NscgP9EcdTSoF2tHus*_FNG^>tGslJ@^w$xXSyyWe3SB9=SUbX~vb3u&Cki7Pp zdsEX^I+2g8%ma_@>1>5X5x|PT8S0eUEvt8W#q;IMSFBuSrQfdIyW+7&AG2Z=1s0QD z#(GxHv8DYl{^Bp<&2M@W)u|4okF(2|1hEo_ibh^xva0ThC!dVligWG&>N3h$lx5uT zTV6qz6@9G8W5uhLg95^!lxFMfcfb4HbZ#CMTEGNs*Y4f%AAaxm;@$6hmlX+2)Y8NX zh3Zngbnu`j@vMBjb?;us&E%^LP@`;lsOcyNpLzP}xb3#v+)h|g$+l+NFI$&MBioO^ z`B&ex5)p8n7hTejCK`zzw&K-x=y0R(?YG^owm;wtP3QyYQ@T2oR&{reo)V(!n*%KB zr$UD>&LD^*{x#ArtlaF_0G_jqey@wW2Q{_$RK=gl^bh{A6wTHFa1iB>PpJ*V<%6<%ZFcy z2j22PtXs3nxBI@Z?}ga2cTeotw#AW{MbT83ay?r_4*RYh+r8!d;K4&)!OBM++T5zu zgRx=l8c$LHR?ER2E8U)F3$FSh+Qy#UJAKbTd7J_^2Xefv>waX)_Yl+Vgrw|1TSTNE(MRwK0WAFkG|U+edEqDlQ_J1-v(Hf>rT+qZ3vEnBv_&7de*rMip~{lcXS zaYboGA;^UtM~=Q6V-u4aLn=O^|@zrt+VvN?_(IjVA~so&`I7<=&0Vf8!x zYRfG#rF4^jdv4k3vo_(ImBO5%%drP2)oG`!DDo;F^$qxv0Es zwn8W=$`a^C+R^(mdCpd_Qy@lu%N}l5!KxpUH zdaMS74`fDUI#vks;gXMSj8EX1cJWRed8HxX{z$+FLiohJt_Z@EH!Ht*_i-Y&7m6W0 zq?HGNmg%|UE5_o&9oaNN(FamqDo-m?M+ag#tJ{$Es8v3 z3Y1*PS;)ThZycEef5e;8Pu);B(t`5O$xVt)<|x z^2ZfBg#js>bx7&R{yh0Ttw=7)#btq8D*Kdw!qqSN8O=AMgCh! znJnVI0Q{ZaJpRZTeZl~hq>z=0R!c-b7z3O(0T$|uEz56aKFvQQ4RH?LZC zzmf9W^C>+}j~?o@%S8F_xK)Q1R6eZoV@of6E6P7E^jPq!KXnZf){)WEM|PQ%ozp}< z5tG6#v9)(O#%C)r;gx@!``r{1bFyB{X!03=KE&$#&>`;0~Vs>X)}8ka04zc z5YbC^FQcc?Ko4flbf9oI?QAdni5Gh@Xxtb-v;@L&NC`7u-G^QDjp}z<+}Y8Ino+qB zh7MKlZad%*0DJ~7+@Ob&E_J-{;oEvEoL{AIb@~AQ8i>>}CwKgbQx7=RHodF!$CDL+ zjHU>8NMU^4l^_pKUctwuAk|Kp!e+E+*5q3QL;AWaTm-#Zhr=KMR%S=HioHqB0z@cmt7$?$LrOfzFo8lCTF?N+b}W=5toGx~ zFa$le(Y8rQym0=!g+YWylqD6pfvW3YQslRZ{Zu?p+T)uh~kH|R51qJ$wl z3eC~sF)MFaWjQxJr-5-XW@M6;-payuGO|~tf-=klvC5hF5GvAnjR;E9F*~>5FVkKr zq2hEk5*`Fl%(b-is$4Z$)1=808|sm0GvGR}`1-1{Ms3xys4|*78VeIAqjmX;@)JdB ztNdGIdbuUqRYpzCD3ZxVc&VtY(igX;%2ISl=v8W!=4GGrM78CHWr?=pBMBG?W(X1p zkDT+uS4Wg&>D)jRdo9Y3dGROS3&k;8qY;(}htiJ~A6~ULGw;=W)K&7?mwPDh7QC8| zZNmr|O%mw29hmmQszcQg#fL!7Sy#2{f>#zy&M2RkSpkU9CVWlYtJUS`?BeEWcvE_n z!7a*<+4&hw+Esh2l^B~=mMU*GCs4LmV?dLc&71mSRextZ`_y+dS>ET{Y_DAz@|ltg zqQR=Y?#>?3=lnlzKTMMdCMnb*>LA+@xw$&8>SI!ZP|O*CD26Xzx@5%yla`^OVGGu) zSFiB|7n*EMWu+i>hp-5foC65`#~*(@?!E6m3v~e1g>HoN#yFpkv+*+IddI3lgm#p7 z8Sq0n&lzI*5)5z=Xb}vF|Ji4sjh#Do*bjjp_xv#S zWIC8UfZm-2#u3O)U4RTh%6Qm~hZ}wX@A)w?86Kx(p;IZF*Oubf-dc&z{FGjsHQ5l6 zeNVGeZXq6g;LRQj4j(zH_H#KNc+35&b9uY3dbGkk`pR+l)wC&ZtrA^~jqBIOj_uoG zgX#};Xw!yuR`#kp)PyNL&^~bBklJ{gFWy0Ur=BC8e)<{T=F4_nDE9aD#9ECx+}eHN z!o^stF@+>>1M$us+u|?(@*8pT^cgGB`QU_7?9Myxu+k0%AIiP{{$5{H!$UtcGdt)0 zk8CAx)eH^e6Vvu%^&JPcvtp0*r1U0}Cv77W6Dlm)V*WTr8a8d*p#Ej8R~7Hsz1Qx; z!y`%Ar-+UoJ>m%*{Sp1r;g=7qop$@861E?6qw?V3>gXTnQ-8kb^KeoAdAqfkzSUQ&&3MwU@tpCIv5Eea^LQD9 zXQrm(n)(NnHmu-h3_{sResp$LV`qOYw)7@h?aE|LlS*uQC=epY6hC#DOa>VCqtNY+ zgG}Yc|Bt;t|I#$M?)$*|=DzQhwXa>(YxTYWjg>noLZB#$W6LDXGa7rm$;Z|oFw&V{ z?4w_1&PbL$q~y`a@<@~^QYL7?AOV5^8fc)==(T$9uBB_Q%35;Y-h4B2zMt=XBJ1g7 zb)!K+GlyVD)syi&vB!-Y5jVc?jR?=d1VDz$^I4omk=4xLTknLa+?d--o+N;Up&@xE z4}+5F!H=|fI9)tR%Z1Bt`DD^Wc7EiAUrCQYJZW47`(spYcTgGUi~NWmZuuAt1f<}H zWMn|(KhFI_9s>kKe#BqV_|bE8u+Q`3*l?f5bF1AT;Y5k3v{%Qh?gfXrhM$nSuJ z$TTn0YR0EhjjGEROB1kGPemQPzZ2H-=^-?0;Fmh%UIjEABf*wj;cJQMOzd% z>VYxst8WL9;oI?4{_#V_=t&B@1gt;*rD=pS>N`4T_HH|SR7#jYCo2Fm4+?VSl+l7o4O zbrX53O^D$98Gq$sK0#(z7_|?;9~XUa7C3+|;9pbWyw#U&z_JnD(FpWSze+Gc#^mQ! zWw)r|WN~%Vntuy=2M7cJ#12un-}{>3;WZ(GUbV@kv`uleKcJG+FJ9c?6G*zAbN?c3{ zgTak(b-(idem15a4#RtKEAN+gwl2R!W_H<(%|GjSWEz#3@A%GTYtLruDrORt-VL~in7tb$>k49 zpE5Zw4fp_x-qwM;KABLMfV|D4jY}`6N`j6JfJA-)ZY@Vc1HI4qLul+Ah_q=T&s2)2VNzz?M~y7otsfpBDEU)3IyUelI${tHt#rk316ZoI2_JS$Lt9$FKSb zX&8jAt6I>p822r~nuIJ2YJx-K0y;6FA|xQ(aX|>*qy>O?>C$C~MOz8bVrF{UU?7tx zz!Ab6!T{P+Z0iMdK$D4c#L)U08_65tD9`NdoJzFeuxNKM;UWk!A(JMWX;U}2IAJta zmsQqA%fC!tym;OK&C>Fcgws6BkZnvX9&#bdq1kF%F8~mR5IVUtZypH`YLg8>WaYitT!_wZ!USkhZsPx~(@PIY^X<0SWhc zxNysYK9_r}EH0@%w7^u^6iEGni$9d-s^W_t2(7CCqFoJ_Ws$uGqBj5^i{;f74u{`} z@v(l9rWcL2M!#xmg?x}NbK3O*C55E%iJiv zVND*uLh1}iK>sorig2t49wbfkw88`E6|Ftm3Bv;Dx#ypc;jGe%#kO+9YCJX7F0iUUYV?E^89np`LdK5(H3xHMEPI1 zaNd9-=NJNdzM`^nPGTu58iJgO#x}|G=gzqd-DrhWyiFMD_?qG!I(*ogju$Ro^cF<4 zjac{Z6f6JXNfohMbYc6q;`mYv3>FVsa}>4|TJ&)S+n?f&Q5$Z(|9MS`UQZXp_wAmo zGF0IxEOps>0RAMe)7`e%J$H)_v%kTwZ{q{-C0mJTF zY@?^jjK3H!wyT1g@AYnfJ!jrM=k3J@4jwR{!9$#t$B@I13TWhAx^%@`YyrL)XIPk_ ziO0Em-}=_KV@(BOyYE}?oQxylCoUt|vwKe*I&vs>Pwp`9@dJqqt~?pPkO`a)uvn;bQvO z-d&S%`0zoEH+$5_kNWtES6_S8AUyLd0RE8rBj>G=$Ia_Eg4_84@VPLA1tLF&@Q#)| zM*=X9t}L&_-0XDB&n@_zRr)JqWv}KNZusr%=Il;D2F84~4Rb^VByc`k7dP2!d}Unc z2L=Bipt`VgfFF@2CPqE(-kiSSv6Nnq)%2KRw8X)&c}5Kwi`s+1C~0 zqXQcA`(t8kD8?s-V#nx^FXHIwWy>yF^4*rz+^(H@{+_k(^p2k|a#Nczf6yQEjAVXf zrB49T5iYg$0QCWX`C$*B4|H`r`**$?TIXA-jJy%uJC%(L;ZO8rmyjCHo#r~ z3~Uj;iiu2&A-q8!($&K^$H3r=Tk*r2n3lyTy~1Jer=N2y4}Mv`oZHiH-L~nkdQfMV z5gM9~deqq1{8;PQ&J1pqg}>_U^@H3k3W|Sni|CsAFPDBa6U>ub*pyA5M#GP>oV@%{ zSQ*ALE|s&EpdQYTE@d>>sXUN@&A!x8Md55_jJ%x|^9E(An?eu9S<1SVZ+S>layV^M z!t!@}Sm^K`+aW8XvO%AuEAv#A+u$93&`pMP>u(98SmChAmvjx%nLptAig)C$QmX&}dTiwd$XnA~%FduowWHdaw!s#` zndA7K0A5460cC;Qz73O;p30zq{HUWOVo5^@px;7Ma`9TjKhCi2*Jl745R}^n=cZE> z`j_fY!&c@;002VJ@|aAu=P#(Km_#j@_K(VtZh1)C>Hi35^&>9k`x^48H*?(-x8h&y zx~cos&F$jV!|{$OqeR^gQ{0PN{d;?w_3vVeJErcAspnJt>hbIL_P9UDY%kyK%2n*` z{?zdYmBVyUAcG?L`krun+vueltQ@fTl{gr?;l~S4&G@s5WWMH8VTtQ^J(%KW{zpKN z@dSgr+!);S?cfMtcH>np%G+7vr6+IORan9(ExS2GL|&!MB)id)zv3Yj0OrXrvr%|! z2vSB(3|zLsH`$<>r$ODo9fM^XTZvJvCl3Ztg`xZiE2PLoNE(|Ju&D5oo-!@D03gQt zva$gblsj=Wp*33b(dZi1s%k;`Q$`7k%^9Cp$PLBO-m6JN!lT?bTT2$IEIf|g8{?f* z5?(sv;fEiJQ>RZ`2n5ssoVe%Sdo^Kb!c>_6@$jR}GdFI;wQJWk(NNFSG-Bb7;D{TB zMV)3E3uyp&oH58^jR_EqKyG(LKqOpCajssQihXb*Bu%*dS_V%+DRG$Sy3xiq$bLmrd#>Jy&E|z@&AlG0bLXS6GObCM?cIIKi}P)? zXw(9Y9|i%}1Djx(8$@#Ioss$VGio4cons*SS5e(3r=vMv! zq%BDTY}KI(tE&LA60%j=CDDn+9s(I{(yloCqVFxlZ5z=qL4I`&;c6**CD3n(hXG6n zhWdR8%d)}^^t45%(&h|6i4j_~clnpZt`5$OR3QPZMUP=ER$9>+OH1o9*0(6y-iVp$ zGch-PKHfR?X8g%l{=^^=;4pn>WMoKf&UV#t@f2qiN+?3|QMk=@!h6EqJoxKls+N4Y?xfQ?0K7sD3IyYIf+X9cp=muJteU0zgiZYMtiKohi~ z$R7sAwL1PTt`mbEQ8oLzdY*nAsEa`|lR2K3>E0Nk!RzM7Hp9YxZ zqM-iX{;j$t1;Y6P0KzX)CSrCizV++v@l*FVtW69redoL1jRzk%9{cv} z^_JBaUwko+-+w%IikAT9Fz_dfz*k>=P5iV+e6hno0m(9EQtnHaE*cah_hN7d_+wk} z%O_44fPeJShrN9sAb<;`xFmx!Y5DPjB2N0Uj8XC3S)WJ9ym0oy#W-{7v^7i7uHCNGYtI(*^Q_!xD)WuVUsFTCI}d~mQ&^VGWr0T{DX6!%{i zi(_LW-YU(-D4gSk1{Io?Y}+5`<2Z&^EY8pS98P}p04QXu8FgP;Ty))_AK*ElD18<> zGlnrfQD|jK~&$&Kcqog#Frb{5s&kH2}?STN97e(es&`d zC#65UIIM$g#dF$rB)q#1JT@!Ms zOsQ|SWA?eNHdP+EomE{z@3{L`di@mwkez5T}Sb=%Sv|e0Qtx!zmhg(X6Q2jtrv6yRIpgKreA`A z(AMA|8i8U>);T#$B=E-#zo;W9S@9}mRk>7mb`)`x&VrVM^ODOK4E}9e6L5ZIGv?RY zVo`ov-o&(C6D&6_4P& zN#I2o&3clE24v;o$wclhPX+ifkm|2&+>{>v2x^ShdLvbaNy_M7iYbG_u*Fv+xbx&^ zac}kA)F{iZ-fZ;+oCCx|iw~_q4xpxs1;nRr(__+P4zRD~s{aLl0{)HWV+Ncqu;pnNP>7ubi-E1Rw#L zK?p_|AF$kwmffbc=ve%*SVz-OXccj`6Wd0{ zM#p?E8u3}Uu&tN#k(dMz96V^j1KP926VPx$i%dX8v;>Rx5^(_yr>3qOTzUQVSLL=A z(=*dfpKXi)K?uCi>Fl|)){bIGHIML5v_jZ5@6kM}CkrryMHWpKuGIE!UwA+8TX70axlIEaYBJYEP2y~AvB1DTzOey{0m96CiodoLYpYjdZQ*=OUwA$? zSI)%J!o^sfoz;XZ?n0OsjrbKGjY2f(IsoeA#-!hA4UI5ey7kT$;AIJaI3iTDb(vp7 zp$Q^ROXcn5W*E06ntH0c>P$TVLpwXV)t=l|4IoSy2{aNSv>xy;gYbAyf0u>Kb@eSS zlIiX3h^6Hd?c*#^y) zaOj3+AZPi#$EXajEHywonA=~ul;pJv;GCOZaKEL$&|d*5uT4$4T-l#QkI_+U5Yblf zb8%O1a+^_4#+mOu`>g2?AH4Zi)`@Y6GK@&@{leQSMUTpp-BfY)2b+XSA?=Rsj^;3m zE~7ss3??1rR)s6ye_pdaKHsE`^H#p)gK@rk-SVrMQXfpsuf+D7Uy_cdLovLT&$?aD zr<4^Mkpz2&<{I(lf7}+2+^Ov4ytuFu-+%tuc>K}FHO7v_3>u?vycv%^_L#MUJQWtB z^jN#o2cLfWJKnB}H`_y}rmlK>F2HW~r_7%4i{iuYKJz{E#AA;< zc1-Sy^BT`DUcPEzntlRk$4%cazVL##t<&E)v-7|{&cho}zwcxnP$2 z+}bssRcHFj6c$6fmwpRf7?9Q>oFp&N z?Bb8XcA9d;rZL))Jsl{YQid#O+I-4RD?6{>#em4IITWdu?lgKd$0D5ghubyHPt=|t z2$3V{{P3*uhL1;vdt=AgpvLQ=m>eI7$%!G)SKP8&Kr_w;hK^hq#@qoY-h~z?Kpt|P z!r_MuQ2;-{JVmuk`5|{cr5$LRl-2kqKIPeRgM$8Lf_$Mh zwxcEKOJ|hHqY3Qn_9}iQ?UEk`Fsa-i>uZ`zh2s=+kE(AJeBG9Bq# z_N?T3o&x?sKk_ARDTB*HIMP>{`EizA6h7ufvJzuMbCs>4TPD26Zug1*_FrHl%fM6VvwSH1K&ck&{T4C&#T z@sie66u;wd&`$qKyb_o1Y@e!K4RR*UFyvLr?s_Vo)6gsB1;~Roxs`i8mi4sOpi2UL z*6>sGt!=)vJDPxUgTw%RNh8Wh9%^6Fgq=Z)X!$kQwT6jU0Q_5Ni}_W+KNJTd=DGMo zVOGi8V;ad&Pnn9u(BlIDz|8uV;k!H-k}A)SnSlW+Cirt3TC3P4y?@&@|DqVGS!a`C z<5nj@-EDh#zG2kc`QOg1#4C0^E{5;h#VP*pXJd%Vn0GtB@?OvDhcO=%=ZEoo-*QwA zcGI8Yzh&d64-E!3b$=fIn0I;AAA=oy=z+HxnW_mOk+ zeU!m&*m@y6z+F`~7n3a&fNtaqcqhSXQ^Jn5ZkDdODM5nI|hcd zR3HD+g4SMFPc&M2CZ5ZMTW7!QRekcS48S0up!^xVJGGdlUhQo4RhkGyYfG`or5>t> zw-OVcGO`r}jYKp(prOjt)>2rF{0$C z7EXi(wBr^-7XJv8fO>4jWLt1M;Lhfqx2 zy{);Og%uZpAc7#=L~xb=655A-YE#uO1z09}er4}50BX8v($|b_GBNq%#3-KLEB)w%u@>t`_n=2=}T#+JO9O-rLm|?HdSr>j`A4ew@eGt;GP~ zbIavG=*)8i*=EzLZ-k7tHb7u4KH)hLgzd2H+;l8H?(ZFp)@G0RiC=Wvv|wyk{wyF@ zRqo5NICs|dn4Wqk7H8gywWV{)3m|w_;m|bHVnsZ9^X7GH%goJj8BVBeM^v^>YrMf* zEa=h9L)(q^1kj@_MVP`301B-fFKonjEP~NoMSJ1mg^NCO3$P1dk+_6Mo0LQQ0Vz4O z96@+xWy#<-VMy14n%-%1x2@{QHeT|;u)URAdfDzlhTqSedUe#zR|XW>I`L`Ay~VDZY8tMPL` z`?GOO{T}Th01hkA zR#NYC8e{Oo(5tUaT~(Y8$1m*wJ>8b_Cl7#)i;4&E2Y`Fx#EFU)n{j+s#DDu;g%#T} zBo++{#`~=TVsCxxk2|}J?dov^85)$Qm@2(3Q~b8O7gLX0Oi8mm#C5P*-js!>a`NLa zmCaMRm#nvfIbFRueB~+oJw+_ehp{6o(tKK?Ol>SSSi&rt^QpzfvV`4I>0J_>1&PMKesnu<5xc*D2(zI*nZwPg41-{;$~(J%zm zm>eI~B5BQ9smG7sAFsdmn$JdK>>x3~3JiUabkU}3i5`oKE1sXIFNP))iCkwE=8P-E z0VMbQq&WxC0e|`(3sf#_;=DoTJ^*%Xq!oHf`LTlwMF0dDBLVZ!I;3y06&QcOO@0{5 zEpZ7JlCL#tuvIYH(F=ZklRxqRa!=r0)*JLY>O|;^k$wu5W5e5X0?r6k;kT1ZmA&r z@CrY8i#h~Ud0aqbJsQ$0`z)isu`m#_*!cNdc6l#@g)P#QZAOtF3~e{U<+x;nKkrTh zH{P-MbIUlqWPnVQ1-|HrHVx$Sc3*h_4$0j=(pI+5m8Op6$;2ctb;js$U+fqih@ImA zfC&PQ4i9J!&|IiF+S?1;+4f6$C9`S#EC3%j+$JEGzyy5Hk7v2n7g?v;maB(%_|SfO zkVTLo*fHQU{L~)|HX`>ZeQ(tzp3?W$V)Z??^A^qe&CGwI|bes(+17i7y2 zmj9ONWfIuC6}}j2bDAv*NMD z^r3F5D`mY^4#+Cov=#k%cbX(EnORxzvpMuLE!5ZaCf`Cw{Bh?$w1dL5CutB%qmI&{ zo|rO5;Y&RVEee2$NxEkqDz@I!t+X*|l<`Y0*_8<`H`ApmKgK*rSx8gvw2AX1MrOBV zN?hne7`G|mX;1wlxNE1hw#OxJ+}XhbsK;56$lC0(Nnnq$m3G$hPBc;#+@5kaFi4o> zJr`BZbUWF{d84#J@Ej{aI5F zU&3rpqkI=rzDc*3;zkR=vQF#lP4kET-=7 zkwWo`TM6vZiEj)8Jz;p~kNgPh@Rd>g%)au_WS+zzhT?efgkMD(X5KcHkyj1)4ZC$(u;fvJEg%BRl>JSFIW7gjePw`bSldzUbVzBH^GJ4?cu;#SLp? zaNFinPkl4)yYIM#IVMRaFt!^Z$Z>uU3pYRq?Aht*m|s||wwsi#Bnj4)Ntx}0fCvB- zXj33eAXswXIa&k&f!t6#I5ZgVy#2PfR*?pRDnJa2nu#5`w(NY2!q>L;C(ELNo zA%(*>`;!LcXEB6U7C;~0097NyBU&uZ#3FGNj;$*O0YxGJJQ2(ML0T-B_!T*~aN`3Y z2l$Jy)iS7th8lIvtzJyhsXYP8Z_4THjl$&w$X5Q5%z%BxMm$d{D^w=7M z0M=@WR$Xetwyx;u8;s^gztTl0>=Zo~<*qtPNSnQRA?B~Y6F0BC6jv`i7t>c>i?b)6 zkHy*3F*9{4rscP`ay3@wr$n0>^DZ}BZ?<7mX|baFpak|V<=+FZiu>Anl?4ZZcZq)` z@QY7XM3qazhyHP{U~_pfTB^g!>O#DG=7j1n8>db_7dI}vCZ4zvSI@r^(>Gp@^`(ok zym&q~*RG52=0yn(%xBTfq52)J`=;os7KFfFY^<}8RDawxxm&{Ns<*q*=CrpWdSMHo z%q12Ecn1co;ea+OyhvEIMn8~LX03yUjSw50|V zngPBLWo|AO=I4pzJmFLFqR$fN%$YL=Qzm!rbei;Gz(LME=6-J9o^`*>{;KLJ66Kr~-=8~sAY}%SbrK z^uoDIv3uVx(?(N-%Zt5ZY(!!}M|}4?-;Gax>XYhM-9Df4h38)Ik50Y5I7(xsIvd~~ zA9FK{n)gPkI@`$x5^-S<+ER=q0PUW0H4iWz%&Tr(&@nqbV{r4@wJFj5khoIq9)2f0!#lBpYWi-B5|N7eQG*y0B#m61!J+BTcf+qD+Mz3Va3w-!S^ zYq58z8GD9Wad3D&4v)1A1m3x$E$$d^k3$ok@@tRLzD9JbuG}PVDU8H< ztQBwDnBZAPhX>T7)c&sAk?mxq?1sM#;T)dyaDb=vVELOrq(dN?5>_wxloFKei$PvQ zHcWMA7}ys3R;^_yudczUO-0W1&`3a1_%i& zIjW?MyhS?zo)mcyP!E19TXhX;;a26JKw0_~z%KbZK|TCD-mB33$cg44{+Z8vNb5Wc zAmtxj;R(Ip(l$gsg}8du4hHPRm*!)IgB{@G0vPdFLyUHiAuLbTKvfvhNpPtENtp&& z0J3L$6T>_zKQ38=Rtn62)5~-b&p}6MmPh<#85~F^>7jCHY(Y+1lPubjEWo(I5Bb>q zaJi~}mdBy6<#$bG5PxAvr%I0$0sjmfN|pooBaSbb07R7S`YL^BKn&AXL`slOhVG!U zo8Fb1Wl9;^&wUKz{4xyxJZi9hkyoe3YrYAlKPn%*;`Yecra@{0=DQL%jWNj~awk0D zw%U##B(lBSHuj^XZ>>}0n2+B1F8LaGbn0YPh1HY1ntg{{apxgSdEhgL$2fWASd|I) zEDPUyXYC-lg>tr9Xi>8T8x21|K(#OL75E33hoXR*U1ulwWg$Dx} z=2oD;R0bweUSM5pUP2M5@9$u8cqR!H7f} zcGn-j%ch^;R)jSBGm^=DOPG>f!pq7&f?%c*if^xIbE7kyO0Dp)}gJ}TQz)BbchfFFI-D$O)HyV!(G`(7@ zvDwi}M$zcd!iQUXHDPL|iC9@QsMof^*>nnv@wQ;4v$mkLng$s+V$~ObY;LSXnH|91SR|LK1g-~8q`ycqfS|Gj_TzzS#VA>8q6ZcDSz#Y-0rgmAtPf+d<400h3& zLld623TQS$ctHz+U;eLLxoj|it$eugjWEfrs!WDx2O?myH3^#R+P%xS7y<^M`N71- zLWgo7kgyOz69`Q(7DA+P`pn5Vu>Y{Zp*P=rU155?y%1rT3k_(u1N#rEJPQghfoByy z*oejDMK7A#+dCBp5EucJbD=~>eJ!f~4R5oRpa$QG<|#lnl>fZKrSP(>#p{-UP#Lz^ zaE>I~x&ZnRR7e}mwVTs(mEb~qYLbWb=nvxMO-{WpEz193zlz znqO3&4uC;GPYD2Wb2#PQ(TNbTDfUwaTKV!0myW&g# z+n3|lfAiOTZWesgRNI|+`9%D}FZ_Z*Fo5tBBJ*}lYz*6QhrQ($E(!yH@cbv9e9~^k z;P)?o=Xc^4fAJTs1z7wL2)Td*Ex^C}xzBC6TX59FjlY0w-1=Mmr~}~pzy7`7i(mcK zUv=8}krsSPy;H;Y{#cP-_$+&-%7lZVabSoxc=u;2$f{5d57&FtqU4j?EtmSO`}L zvN0w>=a{<=iqVuT62|oA+XGCA!T}sA9GUsppH?mJF{rl_ENutuo2Cykbh= z?Riwj&NY87t@4Eo@G)Z$o->>AmA}yzKl@Plr~}5J=bn2$9(?fO=Z>QbNIiJ?u+R2Gn-70}l={ZkzhS=HxpUIMAd5@lUA%NP&R@I` zOA8Ac+xpc1hhwki5_ss$nbST4m+_2*XwGM!ebJYNaLXxtTJq;1zl&F4%eWLw5 zJ$)lCU%3*;MVBSb3G`3WSwWjxWA@m%`nwXzAtT2SfB`P2%JE-*`i6eQ<h$QEe5v#4h*XKW-qeV(?W9bHb@24pmM@=YEF81SQDwpp;|0+#ftV=-my!5GXb zzOs1pLRxbrVR-kMX0prTmNUAr>647_h)Lx}Q5L1l!PKAlY~NN2E(2O%mbDbGwSfj_ zyB4dRF}>0j*B9I3;(S|7EpEirT*Q^RR$O0LkDJSz!TnO3Y+F~lE+O)eY>f)}ZJ9}a zd}bp!4`w4R!!-usKz!V(q`6zBgvCvd(^C0WS4TqLle>Q~h9(N{AE70m5xT)V4V|2) z-YEmSQS|MbKP4X$#%Dd7Nb*x$r>lqZ^>nqx*g$*i9PEglqg^pE+7}bUJw68zFgL-p zcF)~t$&nWTFy*Cb0n3nw{6n(7Jr~PcEMY#;o8n{ZTLIuHYoU>*`UgNCTXWIqb6Rre z2SVgBG@JmLsVj3ZwAkV`cc=taFyu@7<41X*zss+9#34T(;$S-D2G!go*h-sk^06GF zcjTp_fl5fX1?lP0AGu*w@)_+S+Zto$SDcbo^hftY!pP)brAi0vrs}K%@p*-{>>Pepdu~c=TFQMs& zU)plB_L%q(`oRB6t0IBp69x^xrq(ys{L?!CRDy=^EOpbPn3Re3=6p|npfK<&`Gd=U z_@MzHw>%{*^>n=|UMe(nJ5x`1PHp2ObHs!26d)e$UTB2zIfAs6>OczF0@w<#x-phi zBqsT-0MwOwZa1V2kjy1|q-`!$UJgsSWYIR|{KDiZ1(G|wLSM;L^%tcM`B7G*XQJU9V}Cui2qO>E54RFQw*BQ{n@4}@X;@IxgGE1cRQ(~UgC=2f z%*w&gVJa;=56l)SbKp&3LEa8a90^8tKqw)7wCb276kq)`e=%et$UbW=KMjmN=gkpi zRfDiWLrsDWgNSnL=$0Ro0D~$cGhkwmWIYLd9lg0-SmkV>@x_*8%B%7`az$GJKoOvU1q#B##Kfc~&klo$Y)t~F^Y#)g0M5R9PUTCX1_1=Hg{{Jz zAvidQrd?ayb@yGdw7BG(R`I8N%S)=C%F8dDJ9q9f@Io3aDo4i0qq)+It5cVKMiqG@ zAVW~LcydTKznnu)CQJly+KKXW{>G3NUTgujz^sRQFDXCjjHVnKef~9EVF3O5`nugr z+=fgTCFAraCdS-$%gec7f}gU?>yDekLkdU;1#Mg|gP;M3tn>i&M#qMO?Khl2`F!)u!y{$ji z5!S>@{CWtz*R&{U0*F(}Sw;m03S`(22!v5DZO z<#*nGCk`Jz6w511(PIAr2A&cx(_YXB8m~)Gr5eKtK z#7}$!1_O$5fd*&iasC$?V(?!v=97VbZ$XF8h%=xzMe7t=5_V){G)}zqk~Lz{4&{c@ z{Ra-l-0X~b98DiCp0F07+KaNn%NWu_AV;$gFb+fa+_`I4{NW$|VLbWqkK3PiDSl{5 z0I=_=G~qC$i3a2AZ@l4KZ@rM0asN`^VT4 zI(A2H9|mMZqwdP(%i`(WstZ8R(Y7u1Ei_IhcjS%7cow>m9%Df{!|~*)Q*q$nA?H1; zA@5(k5OHHoiB(7xeFnigHMHeG!7-(_h1njQK9XT;iIvw9xY!?L2;;Pv7xl>;gWFsq{>Pu*j9>jY7h9}|SG(hx?|skb zRsw`AXzb-|*9RZC-)%=xXgAKHM4OIxH1q&}+1d>V4*={rfh?=OU_e0spMU;E_dkAE zx;k}DJTvGf1YCzN&`#k-Y4Sw_kgcz1i_+a80F4!1NdLLd^O&D`z-@_)QvK6b{gZm`<3XynR<+$^kK>Xs6u~DO|1_1 z&1H>4*2?3@B&7?%(a1ylkbc%L8qvq-qs)0|1ET>wpz)4xj=f;K1U%)OHs(6oz;l<< zq91XlAo)@TOaX&ZqkY|D0P{NWJuX*aS+HAsOKr@!3W$^2Lwh{WVzW(@BQZEY!0NBM)*Dq2gbyUWA%Q0;3m&?|cPtj3OkR_xZZcVsj64!6bb5iS?$ zi1Gf87|`$wfZ!W3-4ZhJx93&fnT+)?r<&>UqZ8F64e+0J7rH62&h`^}3va_%KfYXH(# z_4cGK(JB=`c*`*Il+uEqm>1v$`ytcG4}8a9qMuu|F*qj*cza}3Ch|^Tk^WEsNoatr zH@!kjj~%4Pm)i$G99fn4q?>*QL>y5el&AC2KQvKo>~4bRw+wRzbs;mt6Vd7Ljz8ae z0Q@lY5zgJiF3I?Za6OEL-c3Pzm7%n5AC;G~^G>-9k|_`BPH1TAHHZG2C967-PXW<= zp$FifYy*CJwl4Z;0tTuaK4L~?RmP-GHL9v)T5GBGhm5h-T$N2+j;K+3q{UOlY|5?2 zpk?(<-8^?x2KuVT_Aj(bI&KB zN3A);J0id40%#p-zjd{T+76!LTg6Lo7f@O8<>p;DN+W?pvV~_TYtjJLhC4}y5YOHmuI^v`PR+t!hMh_X>Zj3_g1IXyzeS-JOzY>7_UJW`nj8gheA&#)v5C?-z9NA^%r->@vnfT?# zudGU|At8kcKLs&@QwGB6vCz1#*a}yb3&4fJR#O0}>WlOc{j#iiaHdYjuU+8o24z>d$q%zVoiBM+Q?aD`Dj(@d^=&S}K|92JQG&nV*At#?n@tX2)pstXzm@YdI#yCgSnOACE76>C5rZ zgAaI8|JHZD6QBOnr!D*=9Qg79<~y|Cj!z=UcD0thAu6BXqpEOz_c zFF-sr87^J`B+APe5Rh1;p=pN(1>2`iYhe!^0N%#6K;zsb00b8QfIgQlUUIn*5V02* z=VNea*a9mHAT%!k-%_xn-N9lzwICXdnVD&CsS+V9^s)t&`X+y4rJ`Pz*sr33#k(W3=OkqHNHv87Jw zDt#7l|e4n}L~q!!A};G977HGOD9LLQj61ctUw1cEFBHwk(H zMc--gt3N>7plEYh#a;ITWqV-1_TyVn{ zVEE>gc#8`^PMj(&il4WS1&{vJMZWb1rB3?zW}zw(u@#6u4~l#Z3bj|DtiggKM17|O?D4(&O% z&z8$T=mXS~K1uoRy7Nw_fp!BIZ%{WbF4(Ppg#nmBqY7YnSr0rxei#-W(CN&(?>b%j z8`?~05H6^lh)4ZMALIU>uUiJ1a()`^!387$i*EvG%0|-{tv}lIyv6{)Kny%Af?1o8 zw&U@bX1`lGP?xvgek%?hJmh!Un~O}E>No0+u`(O+)$E7j1B$ zU;R&Wj>d$SUVJHTT)*i!Y$t{!un6tTu)VDLfZOWddh;#u`n>vGzxer#&mZNiPk?9o z#m$@3{t*CR?447mgDvL+1N=BfddYjFH#FGi8|4}2**|gd;rl;YrPQw%9Xv zwZ;9%kNbxUz<}Ha%;GK&=cmwseBB*6|B#<~U3`MYScto~_-SnMn5L(IdZf#bP52d1 z4Fm9!M_Sx!Z2vH1u!0}za-ok_C%YbUOC$?h)mP!xrmZ-zyiNOP}&D7~XC2}lUP6m2H7 zDBIQly4yFRzh@&xdo>SW_pHV4K`s~3GtwR7eeE&aqrAkOoM8nJm}gm)N5zBJsYdBw z7~Jeoh2vf2Pi`m%Kf)+7ulYxxv|EO?hLXRL=ZK;|wlkXLR6O+G^R48HlrPmcWM|M! zkFZ@`?J+*s6+4IfV%J1Z>>ic91MsiMXZ!*r0o(z;Lcew{P!TP2yDz{WGzGlPv72w^ z`rIy@G)MNrhHugCVoo*)h@aYw<3BpPdemm!p6?9!s=qodmDA~H5N7K!nqkE855~|> zkNdpjAs^46Z~q93d{otw`4YY`_^fa9n&qe59-Oq5aeF`@h0#-N!b3G{75iHcc_==? z+zu6O$;)x|VK7GHwf)^*2|Qurv}N?|a>~!zaQdci&_{~Q1}t^UO|j)xHKq;m>Cfwk<1JWUn?2~|gl%u8o3dmP&(WU>AKY*Y?JNj+b#d+x| zhN98W>09(~whAN1Bg1-(kRNit^AnATnm0-V5c8yFF)0?nmX;}PO@0{M3MJ`+RK&D` z=k>30Nn7qb7}}uNWt_3nhT>&?peKMS@iBIAZb>sf(=N1xj&(QEE8(&oavaaHSK;&r zo3QedNj^@0+LQ3fvkK($!5cid5#RMvJnG>eRb)fc+`cO*UhUQ7TWbKeUW?><)RyWi zd7Cfc377oJJm?EjM52u1sHs>gNbmHhahVcO&2|N8%Gm%q%WYV0J|hcJZ4eAw_mF6P5jH~a4`yKd^= z9~7>b;$HXXy~L}V+oiGHjZQ$k5_fxACH(E&c~S;T_qvTK{+PO3vCDfsZaqHl#V&6D zw#NDB4+4xos)X&HuUiAdmLYtJBjfnBcsx$7d|+xG3^3RwjDs*TNvJHr$du8Tw6WU= zj}S$a6j1%kSp&d9L?ulGU<0$5()zL(kz#Nw% zaEq$koR*BjHa1orH1h-yQW|XkV0*6I*dELznMUPcB4TT>CSpK5*F#aAC=&|Eu--yNK z)p-1g$1Ehi_|i-9xnKNTeC<#EB)Hj-g*@9^5d<)3*l~*?=Lw?*05to-UK{z^LlJ* zLf7=H_GBBvri9^sJpeB4T8Kyx*20hTnb4|0C`RjWXlOX*=jNOiuFxizjG<0Myf`1*pPZ zym-M{6$T{b#{#Nvpw|;Oz^~7pk^slH;dSu}+m~r~YdNA3s(+o`s`GDhYla` z1s_L_9I?Pp_;=5oiM#H;J5Id(vNZzlQ@Oba0l(+J|9u0HoSjCQ0VFZBRw*ZK^2S?l z#eS8KwD#@aZ_p7fFxnRlM|cX&DB6;Dj7DMqh4HiXGtK%tVF8EkIC|9Op`QKyXg_HY ztnqc1hP!|GqGEI@G!c2sQ2MV&Nmoxb{^Nf;o8bccb`NvT4|??f&&0vTl(ezQ4^zTb zW{ZPVX!ixDt8Y3#;3B3L{zIF3eoilKXd!Z{dpF|#uFd%3f24P^)E~5XN7PP$dW>0Y zcfIev`^;~qX_ZV_xK~Nqpb@rLW9@F+#xhj=f4aAFa~aTKRcor!brp7rg#Xe$9YAJ(&L z=MIlQT$IC&;h*}%ld)&te)sol*RIC&+=BZd+Jru@jta;W@<1EL{wwM)!y{;dYd)8| z7lxHTmo`B!<~h!-ZHdq6_lz4D`ZyZmj89%byRH?VlYrBLCmHYf0gam)wE)+GoKi5y zvCsruWXyqH#0UJN>}=^L-PA%yYg*CrkJDr!zp$`mn|X=FI$C0-EC3GVLk!By91b`D z?=k*TZqgxbSy^WJ0Tg%}B6Fw8L>SMz3X;G9TOW}da(v9~mdHz4Uw{L^B+^Gauw8an zJ3vxuD<(*VrlH=MoAoe;G|`OV*D%d(iV{P;n=#(A8KeEJ81LPPor4jRgY7Xf*ck)8 zD!=4IO;OR*pVZh>kua8pc=QepsF%O9P0|Cad}AvAtzKIB6>n_+03hykUfB*AuVjpo zzx^;(n9X(bk>9KQp!vv9N9-Q%iQVIR#`%tp{=sX> zF9yQsuS(Nr@LA3w4zxzbNxmTrJYh{iJ-h?_@xu&1&>0QC@;@8n;=s07n_;CsH)4WM4_2ajn?qE4B5 zn#?~nE|Ik;T59}Nz!PPVKkvlVr^}B`N{k8cJ~Em?K9v*Mh4C+cV5qk2%8jkZE+6&K zW7;Mu^sPsIkn;igF@jsbIbYe@$ZY?`t%)WYkLskfAsFR?Cwx;ed`5eiN6-}I8y-j? z*mW(B>I4nl29>?_?Q&(oe>f|Zkb@$ta!xXo=|Lwxn!(g_*Z~w;B)1kRbn0oknSi+PvFnqhC$&@(dyB@Ci zVel{E>h75BELYN~hbg9BwhwFG6K7jy#r-{LZZD8LJ!q8A>V-kY??f)1m=eFlD>mUP zcSn=${sd9vP?Bw+m50Eo;mL0DCoj@*|EvP~Rev;TY1FL7xGGJI)t~gP0oK}h0cfFt zwwjQ0k&n=nmG;7vx5|nm}AurNLxE z-fT$*?9+seW~$BUW(@%gvmp6Xspdgqnis82!A~`*OXU# zcQhm{vPF4ub3AtTPshycvV_3)_{1kZ>2tOa20!+(kH`P~KmT)U1|smStR@J^mPx<@ z1P%ZaG^m)Y(X1$wJ`*GW6d<9`Rus(;40r4px0Vuy1s99=t5>fWcp(pfKW;6&eCe{a zHPH58f(7^~8h;oTDF}lAE^LKmu?R3@VYXVV07R^;h{lS8Dn0Fn@j|b=!-7v=-(ajZ zm!r3*UuD}T5(CY{r1 zoEw#lv;Zs-U?}6N+J^1D06e4x$YY^a@$=jr_zQuRt)%cEzwXXT@MtPuKxck^?+~j4 zCiW|xB_B@ho9ZO25)a-*$Y>M)u~7E8D2={Y6MuJi4yoO4_=e!=n=^6vjyt?4C*A#8 z{J;3p%f7tAH_3?~QiyLeu*ZUAd2z|SB~dzseEDq&eloau3+dUj{sz1QG)9Yrg*-qM z+u+~_E}dZk3(t&?jr$DC^XJY-UvIy8^4!^T<^c>q8)zxJnYU$zUX3#hD&1EQbmu}ftt1|Gz4vBn>NN~3PvM5D+ zlzs;o&!U#g0se>YM=TM8akw6l_Z)(4@S|(^v-s5w-}U&#;8uSy?`IdoH`4)jDFg52 zshKS&^S>Sn>UogQ%I5iV8rNI4i%_M*T&yP&>(&IzLJN4PQi;K*1s zHAa2+yWjITe;*ok8rx>)7n}wc)Nm6oi{r8JG4bvZ^?@VS3}hT+(Z)1R)%Nez+_Jh7 zZ@l$RUP7{CLStP|ELNK0Csntz=P#(>?f#*s%L~_>QV05a;>L|>jWYmMc~nDbPX3q% z%7`29IlmGhfV`QD%0r*AR)`Goz3@~RYv+0Kp0{@LV;f@{<0O|X5!M$%sg90UEvRV# zzL^Vh!Oo90x$T~E;paY2zN*Bk>WG7kW`ZZC?x zz^~Gz?Btuk4}gH=6;%;{0u4?;1QyR;Kr0Sg+e*1i36m`W6x>;`XI`2Q0iL>Y8)^bp zY#Z*<{G0O+X|f<@i+Y}AyBUK$YOCIe(e74^_HM=wjR!mWJ2Wn+O?xC80061sBo3&a z3=kATe;C67qj*OKQ#tIXa^_QovzrQy8-_|iJIi#~xHDVIb{JqR8T%!etqbR8jm^^1-PW5rk zuvM+3XVMg#ZvgWILulUwbpZR)ug5=tBA?_X9_bFhP*Vy{iTOj{#t9G`xgmLrwt}RL zI%%jKz$NqmQ1XxD9+mPTU2sDBC7>PrX;SG=m75J|nxFE+Hav8FMdIWfZt4Kl@XhBA!$$KFhD`-;kufq@|(wFg!v%> z-BPAH9f~^!cMNXu4E_#pKb}mRIwk;Jf7Gs~GrY+7L_GRH=ARU~m4EqBh427^J{MR2 z(?8SU(Wi}h!lm+;3*5n z$rgXMHvNM7Q6vASW;_*7%8$C)=G$3|wz&oPBeTUBw=-e@`n6P^z}=6Tr+9yqy-4pi9{fi-AuMRUCBo%oD$rT^eY zT6$-Ic0hmPm(#lsD%H~flykglawZwv9abMqY5;6#HnmBpav+Vq_!-dCph!Lt6Yx!z z4{c^rQeK;y_r=v1AdWNFW(jr(wnUmd+z^yVi))h{Zxz83<1ZyQy&qil# zHs_R<(g%EONqBDG5sjrcVruGo-2dQ1as0k}>0BO*8Vtd!h3X6h9?6&4gYAUiV zjbGVjr*B$=?v+%+m)>y2nMIL*c=+|*FrM2Q@9|4 zaFhuEkj2#EA{u_VjS+AI+8|^%eXdH=TiQ$`m51~8+}=u?xMuLErkf@?z8f(U_;bA3EvqXjEoY!i?8auF>M;GgDt zGrAowHAGlIZMOA^#XDndbyn_q!!kl2+jrqY+Kh`uHrqJk5Pk&s6i3hxI>%#W{+tBC zF4ynwyYGsZUw+lMaza5rSri78vjf0v&)9ZC&^W;i>Qs^hC=I zpbM=sw$-v7mPMhp=~Py>_W~{eI!*4HG+&~9>VCJfwpAXCz3Kbv*OvCxzux2dZ)=pdZ^I{j&f`-0WD!e^`0bB1;-?g|bFUwPI1jyGrXF{YsjSk?h()pBtR+T8@gtvnpFU_c1MmcF1@j#Gdi_wL)5i+rU$ zuK49P?~~#u7MQ;DNB&$k!dBe}kKb$l$IQ&miN_XVd}2r3b=RG-N9_;)Gah3~6Ba{% zq0DSErd$`!U-ZQw0O5DveP`@doems2Y*3l8hk3)o}U0u z7{lmW%u@iRTnM$ewBWIT?eazYiZI?Hr!=4e^A%cf{8+;|fL^#O3=4Kj&VrmiO3kRDph-JRW@FX*%6%XUyNiv6&t)`GkOFBuyE^9TdjqX4AjbOH3J z7x^%5k|(wSBQ+{%nYNCTv2dfF-CeoGmvmZy64Xb5z3^5T7PX{dZ5!E)?JJ_e+FH(y zsT~6?Qftt4Q~tC`YCfW&#(V@V0isk!Zv>`+bWlZxJI(oAJ8%^z>VGHWzfNurap3`j?~|sK+g6{o7Bo5TkyT( z(6+@$o=|yHyG)--hacx00|%!k{!%@M`#NIxNLTFQ8SRY8vF-%_R6(ERsJR@zq8*7! zyD$sYXp2QOjjpcy|*A|MhM zAd$i-v`Izz5;&o<`EXQ;3vA<%YR?Rl#ZKVaZ=UY}K$5?muWXW{CnRV?9?9$3*YT-x z!(Wf%sv*gX=$S@_&%T%G5uUL8AP>NXD{?FOmbBS=3y%Z%8EA9)+;Cgv;GqBjPRXaD zYXPk22PK^7Rmxu#$$5I5kOSib8hxDq%-Fz~z<5E~7?1t!{-&`*{f9UtZw7dB_*hRrPfLgdg=J zXrJR3Poa;;7R5I`s&S$C@emfXs%#1J>7i__uP7gU=J+Oq?JY1*AK17% zE$CF0L9J=G5*Cx~OS_O@MPJdJHs%j}K$>7_@C84f1M01a<^X>jC&ZbIv;n{#NB%I* zq4CFAeVpxQZBB!NlIxWQ><1vIY*|e@A1aY=xGSy#tt!oBrH$6#>`KdL`Yl@PuN8C4 z>#+p*w*vTwR^VnVYW={aAZlinfizWrNC1J9tiMe#XiSA=<6M0=I0nd*x9I;709YA_ zS2qx_Jlp*~GC#a|KN6Z@^VN3!8*{sO?-vLAgUs#HrElCW{_VmRyM%u~_wD|el6E~z zG27!~a!$MTT~7<+fh=EdYl{DS!n{ueJ2Plh@3#2^acXhs2Mi)xZnX&hMHU+;!s#jR zw(-NAk18xtF*x&wUt;}hB2&2rDTD<;JJ|%)kgvZLVF2WK=Mxam;a61*(q# z$}Ahe%;{4mwgF?TrPnf0*Jx?vMWc#vO3&rce6p=x%B&E`@xy0rM_f)D4V1T`V#MIxlHd^FiJcmrHE zS_=xJxC$FuI5eX#y7YHx@p{b9+>B5E#81Xxe{cN$@Bf?ljo*NSo) z)KZ;`Fv&K})#YV1L03%Qye?r#!u#Z;7dmJFvb7pelJEJsS=Ye=mUzP;m6{E~573fy zp$~!$U>m}JrzYW^E*443SG8b)xY-a7Zm9g?6^SCEb%NJ$F$-~o6TVn*A>{RR=XqQR zOY{x|sEti7s#y}NZde0gqt%oUBEC`xwi&~h0Hz!8U-T&9VevP07T@-aD8Aw}uZkY) zF*q=6VDkQ6|bweF500E9Y8q4$aiHYd+%-IzxXR_y+!f z#{iDmN=`lC4g3xqJYagVZ4fObw1cSe-hF#5kU?V%ZNxc|oR{SOpv6vm=cwMBazjI+ zNA22ekP5I7AP&HqEx~9kv1kXdTby5vFMjEZ2Hyw+|JFe;4CRN%06YHaKmDii6QBKT zdQ=8K$^*c5VE_Jfl%cKYM=zf^5&Pv%JDom#+8TLi_&xOCg9b3}zU!{or~JvcEckp5 zka&ka@jdljF4;lb6)=z6g9*#X!s7a&haNOo0q}=AeXSaGTm}sB==1P9T9Rx(eof_I z5yE8(^x^IGrj5`Jq`v}wLQ4Qa$_iivtzc@-Z>-1V>_8SM&>Nc2-p~Og4Gd;4C}wB8x?SAYpvqXb8>?yvXG}>bJ*^9CDs&GLrH*Ju^F_F@npZ z7`JYbfiT4oHXqm4|Iz##7#eha?zrQy#}*b^n4zJ8*tchQ>_2?OW7FAl=i;);;Dxa= zN$?|E3=o$lQbAlqEy$`*a_sEa_mw;LV738S_PX80+GpIlrR@v^? ztje|=t?HdPjIH>&yt0|&5+ndPxE028p7Tp>DBSpF`~W1K@A@Roog}B)AG51 zLtPy)(Az1VOWxOdIg~>Z-}J}USh5Mf$Q?JDyy74Kkz4XqW!!LzgA=d$$8F_HFO-&Z zqtce&U^vNWEUv3Y_YM*A<6Uh#(AyC^Irne0BPK_>Vh`ZoXm1Slu_YHdF=Z1T%3`fM z=puRp+PDn>MYjC24FC%bq{Bpgi<#gw0i0Rj-uuC%ZJ z`W<8M&E$7Vh+VogntB^(>@jw+#n)gSKThD5V;q`#>+21-2LtZuLGy2MwUy`o`Fm6E={FBZ*wmN@KPf-gje3`g zxkkM6n)&8K-^a1~hH$*g{s;gxCsaf%#sh>*A>c>m-;IHRA#brUKZx8vC=T!C!C=?J z-pR_mAPh+jJS}&zlvtIn%Oc9%?kYLxw#({~^SH%`X2*)=V~ugA~-+|OzO zcsAa8>#g|B|L`~CpZt@5;4E?v6n%R~Tx4jw#UKxBQb5k0-#-loMFXb(T~F_CN2AY6yiATJ6=8$%?7 z1~it?L_Buv4sTy90?O?4thb6%Cj=@0Pbxxr*pB8!(pu9uTJBPO40LA^$kt>o^MF=p zV^CKvC}F{q0wn@_YCRB#g(L!85n{Ng23}*^kGJ-U=Qsncy@M^ZS|IumaAk-fDO%x1 zIDk`r^+$UEzDD?2mu>Ao2@@NQc~u`FNnyl~ToQqBC78?wARC_d`dP{- zo%ZPL8H?qGnHcO7edgx1U>P@1#kSLrJ^nN~^qAWpzGRCnbO0>maCrb= z7Mm=VyShfjn`_bAi?GHe0!v!h&xwC78{7h1eC)Buyv_E77hZ_F#IKYIO*^#np8odJ zJ{Rpc+Y^U|Tpu1~%wHR{ZUD3Z#HfEUgczTg@V5I0A9!FZE(;8Rb-+c==z|_;nsSaH zAR7G+kfCk>&bbwrg*^R+{O`H@?s!UR|I|eCOR19J~;Kc%^VA7bdYoFB{lVN;ct;~pl)Ml}!Zb2zr0 z14=SZp#e?5nbuszwq$@b#)ICTUXLy0MY;O=`!rtlc-$gROY`#TO3NDBEU?QqU&enj zrd+wxKx4NOVG+reV=n&S#|vn0&3C1#EIgih;V)YF#$3%c?)%FtxfNOI)4!OnIbs1| zjRijdA2#0xKQs<9UIMy#?(xJSkwRk#<1B`<74X3QS9wz(+^~5_kGahNh2Bdz(qN9E zj=5OR$9Yq4YQua&-DMjDbi9_+S=L28Z1gPLPTI%3ywXY3sBF$g#|$hozECz_u{ zhx}oWxfodhFfZk=;>Tqwyc_t?{0(2xR|$h0P~)6gm2A*}=G9=Ht zWh2?9tKLl;Kk3f1rA1fymGrDRCcfv%{OC)WH-M4zHgJSLeL`hc9QsQE{#-xOB|*p` z3UILmKPsRhYv7N*jOOx6$_jjYo3S6|qx5JigMYLe`~pw;8$QbVB?rpCvtP8OP-x@g2a< z4nwPXEONWxN60j`X@6*%ENeqMrM73b85au?MkF)+0Qor6Z?&0jKGV;D--a*wV69g(|YS|}g2IUwS)9$)gYvL1_?SJ>8z zmLJ=E=a*Ur`?&ZcHU9wq6qcPsw6F41rK>tCQ4*%Z+DU(SSC*zLMX?PnWIIkFig@EM zH2_FMLCEr69tg(sk@YBpm-i0}zdg;;M=&K$J^bzbG4(LT zy&e`*zPHCKam#y=F}8=@?#4T5*28?DsRiWKpOxEt(x`v%US(=$-Z6aORu!W7l|EGZ zlRc_;g4!*={m*WCu#INDb&r3?7O1hzb_{8dJ_Y;x&HYr$pafb7P~qQ3P| z_BJinS7#$Q2aq~Xoy|K;$bX||!#5fkrRA>LvyUK+rz0Q{fF4`RJ zZ4x?EcDBy0`5YxJF8PIBJk27qLv-ot>UG}`b14@I?|RzVjt(%r4(Kh`0<3PAuq?WD z4jhWvsW)R#3#=Op^RZWp_`Y5MuygUm6OYIDzyGX(F!*9+iL(n?sC1bI2(z>+7ki|D z+39d)nU5qt9~@%;4Zaj8BXi_R&v08WnvVcxzx%ttYk-h#zMM<=y=R~G7G4j1Bp`asDK8cj z0B+L8JQ&gfd<5JBC;}9R2ifXdfF}(6dP8O9yih>D%a^W*K0AZmd_J3UwGsd0i;Y+( zS&BpVAaw>(GRf{@Q&}<|Srz`4X!{<6XL+F?IEl_>_xQICF8vKra25GL&L4F7DpF z$9#6_%4PRO7DuGJYnQ?*jI&TAc;$xrC4D^4p#$7X5Qp1+IfD`nQGh^zFSg%~3=JBb zCLQLWFMs)u3?$FooDrYC6*m=T-~PSv%y*vgxt>?9UWwBuPm6D_`YgXImoCT2(`Vwe z#_j3pS!+A7O`r7Od&&vGaq-f{7*;-Rd&W@8t#=M$XKZJ&%elAkDL=$4sz0y*XG~&D z2KXZ_G^4vUK5=FmKUAVvgj@*~~-Vlv8>5M<$h&MLziq z$jud!q2I9;n|8ubF2*&qrwPJBmU@-`X>C403gyYec*@wxTxFoK`sU$B8|GQc!i6sU z$Yg+^nqP^}n8?HS-Vzt!12+t9ibkO|4OK5(0lC=j3|K)L1}Qa8FxL(Cbw*F8=IFNd z=vS5cdOM>};{@Y|*3+@l@?k7yTtqUQ`aE*t5|0rTZr5OY>>iOl+7-L?j1Qxk4k*_qp6T?DX8Bez3x84R?zh|03tO0^o^gvK>16qx4Yz7wj#4l*We#X@<$J^ zq)q>9TFY1RpVH-c87^w$;Ljk>?nt=>(D zD!=5t^tUtqGHyZI(KM{u6i1un69D6CX(yWUB>i(MFF&A&eqs-{`Et2Ox#(k+Hl%H3 z!(RsawBEB;pvD?&{CRAoEzMn4_OL9k%v54Zpnq~#STqWkl?P|{c{?uv-)bw*_2axh zF8uKMf2sMG;9n~i<-e@_0F*r!q2NNQjBixdq<}t zNwIv&H_u1r|2GCwL;4?<n_*MC-+3NLZ zbdULmY2Pv|x1|`4K`oG)3zy>jg?Fu8^)o;7Gx0mW^E(C={tv(UtMT{${@?elsDOZM z-?Pvrx*>ET_|CLRbFjA=gAraT^wA$ z7AN016L;NpcXjUBIpvwWAhE{n!?_`xkMzcCZ^nKtFgat2?Qm?JVNpRoY&}L(4X_9R z1;GqJ6JU!8b8cq7Drb)YOxhZu+U-Iv*+5#v%^UQfd`nBqG0V2L@o|Sjg9D*31sw?l z5+u}Iip4ok$*0^bOc-d}&Uuec7XdB>&h>SE>1|pF1MI>b5SIKnbFiyR?X9x2U{v!( zyV|37LucSein`2oE3%P)=V! z$iMfVd*fT*{#JbIlb>{3fAgE)aC^a*+{{dWr45TlDOybcn}DH|lRCVv^q>CDcf9qN zGyHs}pz?t(Y{vvh{Jr1%y*Q*Y7hrbFC~a7f^9ca}0nMogKLEImE?+iS%9dl=l6Eg9 z`$kwpj64~0xIq|j7{4+VL0`0mNtXp6{d=EyX+uIWywg}|#BaT@87pX4=YRcC>5-_j z+oU58mEx(HE$xZ-GbQead5R$qeHZ7Vfx>ums|?k<15`Gq`14)-wmPMry1@-ocdy4Q z?sn53xiwZB@jHKYJ$8(@X{_ShJ1t~1K97%$I4CzQA31V|$Dm?LGK`7v001#J?sB_3 z7qawd{LUIOL};8_WGifke+Xc)3-9I)*Z^D!QcP$Z93B~s3+fY$f$%GfE(~EFIDVh` zkZrjv@OstPckSHei)_$Nhi}j}ray2dA^i;yjd6qd1kFLtHhfF`eeT?O186Kv89!MJ zQxABHxx@=*xy{bbc}|&`ne~q@j6*%@1Au-kl*-u5xYFIDdN7BJsJQ?|f{tk9xewFA9Hay z=>Y<+Z76U02eOgdQXVoM8C)se(w#Pjp3b-!|Dc-*T7D!H^CtioeV_DjuG$9&+KzsW zw&KJBAc;eG%Y)w4siF&M*pMKkd?Jj8rdfIZs^M_GN2o8(Tw76Wq1A5W70lIE!$2qUck4A+T3FErTCHt=Op`RNVg0IoS)3>z@ z0hiQQ^f-*7(ejvqi1nEvPO_JE7( zTZ~Og#OY>vDSLu*w7=^IABp$i33w3MAHK3iX**{{Vke)u-tedV%`<97;z9?;CIf^# zq^qzzb;dj{msjw&8V+OPufBiY0FE1@vQEFIs(^^M~f2wE$ZN{diwo-Hb(V`Q3~q@^wDY zCHa#oXCCBTIq;JI^IP;&q4X*nM;`Hk6QBt;S(E;)cb(ox<|FeL&cL}ab=};~4O85= z+ds(E!xytX{s)Dr8#*21Rxvpa-f|-jPyKs)+9gaexbwI}<4~EBPRXMr z84_@{Ak>hoxVfzs%?C8-Hqr14O@>S!{4C?R5(G$vgqT3k03=))tMyG7z`JNJ%TMtb zST_Ojl)i+bSYKAr*)pfF%FkMOPM>nGMPp3~X<|bJYOKyjbPg&>pJs2tF;-`sePd-t z(tE$kx}tZ5!>>yVl4XTuTQZ;s03q~lttbuUs~~I>^<^OQm!r|V9x-?zHhXqPqchJ& z^SOXMLoqi0R1EeFNibfC|N6iBI|exZoB#H|u@+!=Pk;QQ|L*@0f9LO{I}34yP5=&s zZx&dbmF7ztW@o*CL9i%`7T$}Xia!f3CRqecwDbTr00&q!p9`qjBu$;h4HMFT8&pvyc`ca_^|5$kTNzlDq8ib?u+rZ;vtal z+`Zev$L#d9g%`jZ3nF?pB$Tl|mc`JXJ-ZFOKnudRBuyj@CS2zHg;s5*wq${a5CK5f zH?Ut}r>y}1$On)WTD0`^A*^vxh=fV=7=Rgzu>@YB0l(Oiw*FX<;@4&t;%jT-8U0&b zReNyp2)s-`fWP5M^%V=A2$|yDMw|F%vp?3++z9oZMvoO&y?vx(z`Vac^Zht<_?R`y z?z{JRy#3A_%Bv^#?cEp8JoDZ7sh|F7(~E_zg+{$YCl<79Cxc%A1G4;D>~xEFR93f? z>P8!|&6l_jKJ=hLV+3A6004k;o+Lol^v&sb@x_2R$f)9~Zh8j{pr-H| z`LU=?0Wxp6-m_9G1l&Fi)g(95*9<9IalWGw=c!MJ$;HZ6)S4bMe#rU1IT>n@L_{2 z^f~zP<(FUf&BUC$_x3yQ_);6d{ZhU!qUm@1xHTPbXa3*|Ux;7&tAEw}z1>h}Ky$#% z*HvDCJb(;<5@^ddW)?woIrodoOkKNXtuKB|=u#xVho_NCFY)gLP z@h2tdF2_)RUrb-yjC+4O;tIuLK}sO;C49^$oPisD`nJtDpf<-4k6{0{#%r>Y z$E~WmPkTh<-~3>ew0v zpw=PUaoNW8>r-*`j-zfb5-AI)VzVA#>(W*`$}+9<%k9l#6R?`F#c<2;HH~#_JHPv$ zd#nWruM(ag1{k7T#>$XVq1CH#L?*CoVK# ztYFMV7GP{)yDDZ=3p&O%=*8J}(9WQk+*qVDe$q#I*uqI(EF>8V_(2J9kFkJr0lEDX zAe0|YC_8LU^9%hMV34vhXEDzJ90KrBPw38qo-mY+v5ImqZUewGzZ)b} z`MVU4bV!5o5#W?whGr36C&zFuFv+={dY148R74Zfq28p)_)BXUEKmZp3v&XX0@_Ug zBLEdX7g6C^P@C2C2XFuY0_{NnP2xjGUuvN6Xth%|0ByEAvS0_C=0fhX|T7;+Hl+)dud~9k&+{sX22>PC**IZA~!1LdaJ%FlDsG( z;i|~8tR<+i7CXT=@zDk}SF5SO2GjJYb5`H$9y1)7@OsFTvSBDk?h>I0Ne9Y)D_7{7 zWwD(XaD{Fc`X~gMN4p&93v^Qh!+OyA!(P^q!7aZ_nrBv;oBHOg zKW_fzk`LS~u&)VNNLbk_x64nRO)oMPZOOdW4t)FUdxcB+M{^yP%I5w`I0;Vxlo}B1 z?f?q=msM-1)}OvqAM; z{7Tw9<-ORLl2$SGFqo27Ndx2WDiDK7aWBT-mE(K-s?3P*boHn1?}4erlkL}15PdLE z*$qFxr0w#MV21I4TKsJ5@c@;Bsa+kMU)fs@?Q_&D&LBKUz|rK3;fz2}B!1*(fkMXL zIS~q0kz1{v||>fnaApCVu6`VCk*Aa_;ET;NR59zN#SIilgvMboSTO(KTqh z4G>ZjXq(*8F7#P`T<}0zY}xJK84XS1#BFeC3F#^C27ZkmkMrq9rji;}CX;0aFj4Pp z1#T^<_zKZG?D{k`Y3oJlYXLTJI99H|B*A`HJpJ?^#mArgWPJ9spNW6?5C2izeb=%0 z_{W}%-}>#}ipL&%)Qb_o5f%?j4ovX4p}oe$!-9gv1X^-v?99!~R1@a9Cwl~P!Y~n) zZJhvMLqj9hxIkNtMHHYQpu+hJ7Y**P-~%ASaE8;m1e&vF&w26%Fw!)th0dack-VW8 zFpT=KWrA(N*REa7MUMm>+PVmFll|gl=rbakHuSWz7wNkqnf-^gAdk2U?H!YH*cu?-QKRr;tX05hDn;XgC1;w z_QFbeBVbYX1jII@S1W;BcK=M z!$u2^?c)H303&q+h>m6+eDUU+Z@Mh>3HYD90OW{A+ruBZHEtuW-%BjFw(Y!;qnx={cant z+RHhAfHryn!1wPz5Hr)$9#84h9GSr42Tc!n)AUl}g;)5?xn%n_elo_dtggh{Z@g_j z1Dpc*FEu597TWZk14NjplGbKk{HPO#eZP8&I9}GaL(A04*(+R0n=^VeB9d0KL!ZlMNuM+M0lX0QAwJ zfg#t&W4HLezqii-Ch-Ba01SXa=o0{Y^c?^*zzcv}woG&GD~nmiHWvNX{Ly$%efTC_ zY{~-8nb!NMK+v(h>~LsbByOQXs7XWdrwlT zITk5xzR+AEt(^bz2g9PxM%~R9CKZ1G39GG(iVd$)H}h<@5H~2Hbbzs#=Qh^W)|xMS zy3zjAnBRfMpz_ij=6OuvRyEaeE+AQuZpu@7p&zL}_42#Js_5oX*PXC>c*Ul$a`SEZ ze3OvU@vA$F{zzW!=j^|s&e%277CXl}VmIgijdV&TXjlEIQ&)7`&N@;jYxDuuKwHmG z`mVx2_v|}-Q~N9F(uz(2wx0gsE6a~8y|Sjpo`ibeljms^d~Okn}I;t z*0z%jWZo7J0mKjn{sIhh-S{UP9)&J0KmA$sLC!Cr7RFj~4%2uK-)E6CPlJof6WJF4 zKfyWxM}RoF0Rmc^4Dg5Y0S?k104OFZQ`q61)aYC9^d{jz-tUmgSejiibBOY||1 z*}u?@Z}BzZd0++H^iP({Kpv&$Io2dW%KLjBCIEZ$P8iw(KedMZpr^=c+ux!eA}(~{ zLXYOE#x@bQsrJy2A^K`OskHpK>_bhXu*8!MU&$sd&H>~-wFOz{C~v?(#simMHBg0E zGb!h+HhpqL1axSO64kqWPEO z7j<*OqG=LB?~FV27WYpw+$9Me7 z#+0}k#BH!V&|&mZIj3EHYmm!9M32+a9}h5m5TJVS$1Y(!5aEP7arC(SgvDZ@BfOr9 zeg^dPN*H2gmMmzPSX9tWgw_p((}cz^AH?O?T;e)Cf-*Vbr%{zH4xa2ZfRYArRd@e_ zqCwvIwrMc{*r$P)!QDv`4p6eATj3KVG0iOWa-JWP6J=!xmNSzAWuq*BglntO*3qNl zYH`9jfCv*UEy#Muwc4GEM(2RsQv1;5M)+ZnU(-?;H_j+TGi!B5c5iI1-cUWbjDzx# z7xZZJ1hn3FBxWza5EEnL@#6E(#C^vfjL&}dQ}O@#7yrU%czyiIC*$w^y}xI0g@yR6 z7X1iYOxm_ZOD0opE(OS90frFI7B1*vu*KDvz~Ju`LI8l+ipiE>+JwtD5SqAY5&9h1 ze=ugXU;{t`{9%CxPy|>2Sj1UCe6wW>8X$zRLyFUk6ED9UZ2u+wD^pW($3P)x6tZBuC0xO8Y6~$&f`HczFqL0CE$oY37FX1sYEz%@)R3Sd zNyBH57?jE_vZPlY+5>m%qTYlv-PIB-^1LWUXw^5IZN66el!tFIodrD>8J+DC zh~(DME`F2% zc1rMR?@}EW;_kciVh(r~fR1+O>^p!k$`3F>KcHODnP232r~dE+zzF^0>)-f>`ItDg zJ%TzKd4O&73+hT;;L)OKOFfR>p?ayUMuz*XxylW!Xdd3YaXqeFz3Otn0|)l)Ge40B z@t%G5*;v-1;F`j`uJUq84nP2P*})cEJv%2SV|ZjF{_qd}z}m2A1k&Gms3&0y_(#8k zrzkrhApqy4D_0DFig2zk=L-^!K2H0=CJc={7{E|8lek0zEf6#x0Tbc<5{7gDO#lWl z*RM^*ka(+2V>4U#H3Y{0@La^a=M%>Kw6`*|&A5+ydfC{IKYC>QQx8M*R#fo{eY#$5 zp4*xC_?JLLEO}sxJBD`#MeKS8Ka44HNQX4AF;r6TTS-!>)kgf{_+2()Zl~>KHTmVJ7^z(j= z5Af6Lue~Aia@G+CvU9_Dj~BnwGt)l1jxz8g3jGC;k(-3M@P{#WX>rNp5B%4!F^DmZ zaMYLa$md>p3{|bmzMJ!Ks5a5Cjhbdqd`ddXk+rT%%ODrV_P-$5CAX@ zdNCK|n3_Krkv`!W3!#^_QS`9IRuK#i5vKh3Pz-6)p7v8+IB$%48Enz~CS<>k659O;ucc>qu_ z$0^w=UFNe!^r=Vq;1R@K}fH&YfF)nkVyY`e+WOLfE@H_BIe z-Fn9z84EWid(l+1&Hxh0G^Y&rwa3n(4xjzEd!!?Fj&#NFV3+1lfYYQK+ka^<=;wL@ ztXN~K&=inGX)6!>3`+T-4N{IJ9DE5)p%ZA$+M)nExRVy&7}BO*#lRExmwk(eZu!%`Ze#OJJ^YhR=~z{bISX4BCbe*>D{V?xIl?NW<2DwZ{f-AVLji3I&7mFR2;)6{ zn)b$>9|GhDt)YV+)17U-0Dk&z>0RVEu-95E;bqIsKr87fd-4J#+|UPMIr7H&(Vmor zKQ3F+fb-us7%TLSfj*RPR|CUV_~OUJ#XDj0PZ|#(*d?LLI32lRlYoUSJs!05jcuOTKu>Hk*8YpGXhQ%{9jvuTT$Rz=NGJ;vauwcZ z0#XmTQMNY9#Fk;@)#x6MXzG3Wrm}=KN`nhR`gbNRloS&;^+5x1c=S-*ym~g;ddA|! zb6<}~9(y7__2j3l{kL;+XZ#2M!QYI3_z(Vp&(b@5@SuSP1RSO0G!Pa5!q9j_1Bi*Y zXbu3}aoZ;XItxgIQ6@nE5@-eR$AXNTUJ+P!@7<#mBhH;ar#Kzfaw09XM$jSwAmN~T zCUG>L`g+kq)Z$JHt(F!&fGj>EYGT3*Cocq)9}7YjK1_rF6C7-h0fZs^=xCldh}H*S z4_l7`fjR4n#fXJFwILT!plt@I#6oUz$AlJXOVO=-y0xG~z~h%+E>Y;wqLf468xo#4 zL&<`a+bcP#2=NBFL>C0&>0Y43~Cp^2Ef{F>Tk!l1$vPdsLj=*rb=@iRaB)A7}>emxEz*cbcs&}OtR z|8banmx}3(@cdK>NZU ze8C{VLk~UVHXsh^kuDkm%S+7|A0H8&SK{WinV6a9(EWvA>oAuZ0NmYk&)xCWKlu}v zm2c7@EpG`1Koft$E4ah2@D`vR{RN&Q9z4jld9>s>zmH2lIO~k^-+TAnK0gmY5-nOl zO8`E$9#d|>7wYiUuY5JSd-_z@9`%J)pXbN6dB7UVKt5~{eCeeZz4aIEJa`0cJ3zWg z^$p)tEP8RiA$=Fx1Ilp=^7Aje5Ld6{#W&lH`@MLE_93qmCr-HjFDecoCbt}OdoUV) z8d@9kGT)wf2;>=$}$h>PXFX?Q10-8cy)>V-*pN-V5;0+^D) z?fi-%%m+Qi)Zdj>o9azHpry;9E)10YckdOS9Pf_Vxdnr)Y-<`C${X6RT)7^-eR*~q zi7*Y*CV<(OFI|p7fO^p$&1A+s&g=sys~h?fZOvi`jW|FhZja`scgFWKXHI+DG3`ws z$Z?Qcv%6w?X4Yp$J}my>hzIx|uo>-FZW^Y%qybntuYQMt_qcf-ZN>%lEzYZB{F}Nu z6?5uu0A%FB97O+ff0aKPe~d4T-E7Nch-2)fe!gr$bYo!$P?rmMw$A04NP5g)%*8CI z(HI2$Q?)(rGfyoo0$S%8erV)j*j~#x$HEz&g3cU$0L>^feUCAnMLb)SNr$u1&<@!E zIMlp@h85sr8M8Q>utRiYzOvSv`c0qu6WfoyI9FM-y!m5?Og#(=T#oc1lJklfL^k_wNvvIdBYb@U$o07!9}(^+K`S| zm2nt%Xv;U{f?uGwx8%u@Zf-3{=f~n2z=|T~4`Cu=z z4~~RYf8-GS6e08Aas2#-SZ+ez^pgCQV@!F+oo6eC;sO8xki(PKZ1t1;q=@DV!Z|C_MQYYF6H{MGbEE^*K0~ATlLMx0s8GF#&r96O7*7j4sc0X~s z)VJmC@`6BN#577;dGJuz{8(2!#-b)b-wHo0auYXO`qyGbvdfCxc-Ay_tV)hvk$+1z zTjR;kb)jzXW>tPw+x6v}9Wsm^&;b5QS}2U#4H+`eiWJ}3pSVdU%Bq-dTZbV%-tmwz z{oIyG$9$E4l_#$BWs$LJ4+rpHTyRJ3-Wq4r$E?lAcz_K}<<5LY`_k^#)TS-u2Hl&h zT5l+g^`>kd#bJy$xaTm?zXAj8PMXSF4}J_&nO2o9`O)r_fg#MYFnpDD#!v%G6QVbD z;17Jk`F<-(XK|IY`_S^^au2}1R?IE0`2^AspYDa6R+jVE<~OcK*f9|CLlu zd;npd{2K_Sp0YGX>Mwc7uOVS8wdokqSwIm-X{a2TD$^9UMqq_W@J`_QUJ_raI-4m(eUGjU(WMu>(xNJVn7ezufeaCltV%u#$h$_ zY;uXn>OwRm>~fYLRM>1TD&3ay%8A&w3oC4+yGQBjX=>4gMkAAg(oaDYdh)IbX+slx z?`SMdy&64zyW+*?z81%h-WPxMmp&K&%fI?p5;&IQKl@MqllW)SR(UTwlxHWS; z;Z}kR00;{Pzz-(>0=BX6Vj({^HlfKgg(4<%3mOW?f}w9JQGdDA~B(xw%ik4{HsXUy~l4r0b7xIfS zX<)NxgWv3<^k^4ox8kkSDX_EXg%0M~Dl7$~Ov_73FPi%75;v^79XG@;{zaFPQ`QZ& zL&t!=dtyy|=aWuYfXGGEvM{+J{#xXM87+*jU3xu6)uz{`uEfv%{9lRLxtnqI(vA3; zpZm%9#y7qm!$Tvc6YT_OiPj(5lJEqJap(+>F$fmS1x&h&E*$t2M0KN>E)LUlwkm!@~o{f<&X9am&+{1qmO?qI@{1JYR1%6 zZmFG$U;gF4W+3j#vI$mxj+Ljk8sq1asvo(Ug7TD zdsU|nhkNQ<-!gx(poa$3k%zRlWh}qxUAD{T-CruZ&z;mY0^z@ACdf69paG?j_ z8~p^3oipALw#gqL5bzY5!BcD#zW?}f*8@$%cjW%Y>#zHqLV$EGd_YU8Zm271kv`i) z0bS`kv=v|vZAE?1s%7gnbx4lAWmu4)4N4v0U4Td8v*@iG&IueI&c4m!uB9<>aj`pw zv~Y&srl%Y6-#x4GON$gEUC>SLIWCKS&RBDW%3y;Z_O=4?>fw;GDsJ(EZpAo^o)Q&X zQMTS~G7&v;VGhJ|yUF$I?fvQo|Lsr7oQHJkg{b@);{9QN+3Kc0J-Qix>*4j7nCKKg z-!wSh*?H?m*K5~jV%N@zYD`iz(ExCZ+n4#F1g%@PqoU19dk^&YG2Cn!7o*}?0B??H zK+7JGf@2JZHLmU4xy$J?UcrNX^sq*sxX7VE#w1w`pWr8p%1Kgrzhx&1w=3&~#?e2^KXqb~# z2LIPTy_-g|6;eg19*RXEY<-g#RfcBFEvbE$?VjzH`IL9do0Y%8B$d(s>`$7q{hpw4 zmRsL0hv)>U@HPG5eddR>(>*IMQoXs$|C?Pvo{ zaV+gt+O!ITg&Qxa%?IEH-DpohxO}%JA0Vr2pPRS_cvrQ7<~z32^5Y4&^jh0b^lvrS zV^wLbTVq_~f%pYL&S0(bG(anw!$&R7(Nx}q0|>OHpKQwF@s0ELU+VOew*Ico*Ufe} z$C0B)4jB(7m3dD()d#_NW$>v5^}7dpJ&cqdRIv43IVb3+0+WZm@x!AEM<8q$g?AZlG|*mXq=VTtisBm$)_hZpi)?n_#&J1^bROT zeKgsXdKn<}fT=_^K^ky#W8|-IcJ~>5fH0irBR2^H_@lK)&W+ZJ(o`OtHK<98{H!gg zf14Yc3Ak|>nspD#mjBwE!jczxFxenVUx#hR~n)7m0IX9LfIwuq->BCmxwl;2S zT#eRdPjn0)h^1?%l;mW*{@ORAr)x0&=5PGXc>X)zk3W6t>+xUw?f)vyojns@`qKYy zZ66k7o-nIl?x`mr2WKo!&(2x%!i$KGPHV}r@Pn32+TLm;!$gmOMtrml0A=RpXSI-= zQVBP`H5sAN=O-;L`W(QP;sflU-8VQmtoSW2JXs{MC6qJ}iU9m5AMfPBLIxq5ZNj(% z-m&OJa4HL!@(_ON%GKDln+qY@eCs4+Ix{t;?Or-s@`bLn1)^5!KDx^ zWC1VH+yGFeb2BzQwN#n`6S&zw*}&AaG`#K|1;SSJ{;XFWCG01}!i)R~O^@^-D3i z^N57Uw)lz9JQ=4?pRqO}JnFuxr)bW>*Yt&I^!PJ|HY5gMHd~Z2fOdcpUa0G#-#qio zGjZp!V_WHC;7>GL&!4{-KmF4`<$3_t6<*?oYQVpX=g-G4{qkQ|U*7QTrGRPxfX{yK zd*0&v&2N6wJVHKb=>np#eVIPNS$+2%KW^|4P!=sLw7l4=j3y&Ar@ZhW8kXcsodHA{ z2LK+~;!R$@gk^f#^q@bwuT*s@hW>_jAZ_^i>#zHkSTwl+R_lgsr~CHqaeH&HIsIgM zp%D`!{3z0hGnX3ikDrqek20FaVRBNZRCqCm%W0=#7sB$~&L~cLD!$?n4TFVXPj9J5 zE$y9d`pa<7yjcYCdSJ|ZBfQrT7yt6y&Xjog*WXKcxp^&6J@#le;@{i196xdQW(*8= z#^q}_qpO3h^m)DQ{_i^k;6!FLM|r8SEcW{f7(|qS21#4qz$^(4}RShb?;K!@{-#{Jh|<#sP21Q=b78 z0QBOA8*fY2cxvE86eA8}3jLe25g7|u7}K9fgFekWV^ulsfwKEi{VAssN!p8E%u!xI zE4|csL^Da>awjj2wkZCjfnl5>UGgB$q)mbi1|Ic5Yusp4-pe=Tg|5)o3x0DM-~)2b zE&7-6^gO^%+JLYWfxhT?`C*GRSP*lr7<@qaz3i>ZLcZAT?cJiY@^DmkBxn&YqO>&k zElCVq*1YINw$mhSXjf%Id2v^{$T#!Xi{{Jhcv$=abjcuTaBEZ9#3OxeF*(qPokLwQ zIn);8gY7Zg4=n+r66mA70Rvf}o1X9pK$X79lKz-HleDJ3263v~Jm1R{m(p&8#ck`` z<7VZr$5o<@pc~Z^9|Bq-V;TH#T?xgzquQ>b>rXZIK?89be#%lN^TW7J0b}TMq+hjh zZhfs1C9eL_e!j66ck;m21K*gJ)F17ljQEF}!44d$K-Em?fUK2$3_2EBqVTVOG$N?p z;XmkZx|(J(a)*cLFV0_dF#ttf&_CRwFn)ou4`lI!Q*vGVJV|=OB zJ$ZI1G?8t7q~GDkdIxt|&`YjKXVRu!Rcf~t9{Q#qsh&QEk#>-qHS6Rq64)P5%^)8@ z9CXqH7`LT~SJ9H2y>VM>>RU3}D!`t;Z7Uqwm1y>P3$NTtdQJl%P+=M4SJgfS7bTLV zHXmgG#I0<~MH+S|4a%#sQ*Mn9F1z>&9^vu0AWF!~ba5TU$HZ+`pdS}{EOU#m9?tMf z&A*M91@!Yde|*btWmEnwgMjni>RVm(p)tvzC+&%BveloI8SfOq#h?IL5MC(^JIM%| z?FC;c5&P4oj3orDj5}(E_n*R(YG1xT0sucUe=!Ywoc;9nruhA!a6iZpw{*yQTIC&6 zcP}=k?qBTUhPhq5@?dbQ`xjIH_P|lIOZZ~SJGS2yu%0GQiHj+N2R0)ggHH+Lc*R`~ z1a)xzvCV7ch*b?-4$pw&ce#_62Ot@|99GY*m-P2Hw%nWs@iou^sA&RnP=GlPaxxmw z9ae*!re8TIJOduvb$xSiF4{GF2A6JVh*xr&3^!Y{HQ`|^-He+;X3lb&Ew;*@XSAiz zBsT`%_SF0%?OZ1+fBXRYI#|gn&27B)@$Ro;@%zdrtZ1WFugS4YdsQuBYWcJ)XCUvAB|IQJ?Aq< ze&tvHhJ@3O_^to`zmL!V(l1-H=b!xJ-;T-2om&@N0QLb?QCAip7%me4NI)9{V6H4K z_?4aoKuZ%livt8L7CjiQ;P3Cx?VBtj0a*YP(70k-8r!R8XXgy;Fu~8x-n5X!H-Z{~ z2{h-Oav|Ii4+EG4D96@J0L2n6g`Iq-{KR3QdGX?x z7Uo*9d(Wgbz0RFI=cf0s@7R@)$%DX28oX2YwD~ntLJjFErsObjz(fr6vw&UpqL*?5 zyigw&chC?TlSZL6ZOAvm4Rrzh17sx+3!5+zJR!s4z`P6lz-xfg;(6RTKd7TK7e@$t zum-o%H9Cg1cv)4q5I?nZq0Fj(^#m)7jy`cCmyS3=3muE?lPdE-+&F(CMkf!%g|lzR zLk~Y@@bwP>(?Bf0{@@Go%fI}~zJTJ5*WQSaef(pl3+-tEU3B98^2IBn>+aZ7Z3_of z!jC#rFTzr1E(zdy<;02j+Mj;SH}$f8m958UrvY}MEqDI>dDG_MhaZVoUwtLsdFSoe zwQExEuX>Tcu(+%`Y{c1fC*#q_J{xnhtIAt^E1?>|i!F_`Ee1ZJEyx4jd_MzuCHq|(3)@_wN58%Y`*Z8FHRROq=<_V}(5hqcfX3dO(tPfP7vd97KIuz7 z0QIh4zY#CI@S=F|U28{i5eK|~?%cWf^rt^DS+UQ{_Bs{zgNSvjFRc zJORObLIxhpe!3>T!~MyQ-Q3 zm}YELmOi=tA9uYFkKQ{LD_Xp)`3B{o=}-m^X?hz2 zIL&bfX#K(0J9bQZtVEj>&0Ij7+&WC+nLbU%LH4wDOEl*4D8^1MvN`+i*_gR`!)FkZ zHb6M%T2c-)6UW4pl!d;CRx0BI-)yC&?*O0yvI9PrF`V(3J_Y!YU;#$}pskZ&7X@N` zfpQK?DV45?-o@8QM|B^8sVmLgm6lzyHU zm)d&Jq7$%4-vxYd|Ac;wy`sUYwclAZqxl6X64c|N9tJuU&h%0l{o|IxlrfvKdmN{5 zO22%28?g-Wppj{-IMfrGnhv5L{)}%Tkmp$p<>Vo6#-$E^EEQkV?@R^x0X*Ojh?1I4 zim$x!!<~5y@C?uuQveQG>b9ic9;*tgW{QGUdU=#)nD7? zRfZ7*;{~+K6TuebvHtd$9BPjpdL{=Ov170^2KxX~la_g5M*=UUE|!s0W`LWbsa5zH zo14519_c?}$rJi#{8eGKf$0eV_1)K7-REkCdr5vzZWlWxQ(jNJfA_;$J` zB8*x!r`%u}US$ecMEIh)SL71E%g<@+pu2b>Y8!wOI*JphXJTo{Q?`> zi21Tv*JoEN!4~szFT>q!sO<51^;~c?edt z=L+r0W7${k(2stfXYy6wfO+zV4%X(=atvUTZMr_I&u%$x6E-yfp}Eo|9pV#iO>Uxx zyv<7@k;}e@79VZ1Cdrj@y4*R&DrwK7u&?W<$MsO%MIG@XV}ht4+k8hD{o|~_)I8+& z-t}1IL7T5^+q+88ydfJudlObKuAgG-^&$?!%aRI>oM=4{|ThcK@oc+8tB;id}cF$0y$QI2hg;6EGz_rv8p`I&v&-q*u~m zz`=t7#@~8)<=b9zs0I!@c(uZNF_n7;mPHsnTk){*s%#9l2f!T4Y&(6KGSFE_qoDk{ zA>&(n<;E+6ot;twkw~wcm0r$ha+A&ErwPX8mLQ+nbsA8)$rqyO-Ki-pK)|iR6)=#q z_cY5ix&{S|xGzOtxB3X!de`c9VZdpfEtwT5&#X zK{g<>(ewoo)Wqe`L?5js=MNy57nJ}6qAAoXYgM-LYAq^Z2>@->PqCG6{_={@phdTe z(B8ibvp08J3k zI5&_5A%~%((F9mQnk<-z!y*IF46p)0nssoa2%O`bO z2Dlj=v1SW(NdXnXNxWj7YsC0C=h(HpXobrV9uYQdtG-@fDPQs+E+8fOQwMCeferQ# zOPE8$ahJ+718XP`gfElK20D;0HrueEH{NVFMu0^y^9_PpP;rJ0Je0tnjA>s9%8Jid z3VCez6;ExT5u>&D<8D}IA`!X-}#OKL((8U!qB!J$6UKK(2sJky_9m& zwu~X<0|-(KG;b4K*e(sA(^Ow?Z|`#*2l~|qB#r-@=Ns`SrzF|4OPMxdTqQR$Bx8?h zwcPQy`z=$Vc?jJ8Yu{&PQJ_T4t#MjA2TA^R2hcgF^$H zzsZ@b=RH=zGusV$69-s$7@D-Nvl<|@N%>^7Qi_5X3xqyWt{(y+kkIOp-2m1{MaK<1K z0_iaaF(3J?Te$(`;l{$7c?Bs3fW+r&DLvA%Hj~SeG68*(IzuP@QCetXDGc!pXfSpI znxuvZFC{*7Bn`r*1{Y(#@>G2iXko$24?PKZVjBdh$^)%3ot$ql1(dz4-A^vXcBcW6R~M;*ksgTsA$bsOQ*{5Bx?O8nl4A zawA-pi@CTXyF?4R^G#jDpbvB8#(G;UZ?t)<9@~Hy*Juw#P$%PG%9`{w-0VyxDV+1O zaXGM62D*v8^iEuCS^b@DF{<%va-cKD4FGn;$N=Xz0{pdU?o_$NTa?|rsCKZs=%yxg z76t-US4hd+VqS&rcBlST)-Gt4iNB_!9&9xIOIRDZ8T^xB3pnyanhZ~UO>eoF-nDl= z;UD@pVVsBmrEy3lP&CBwAk8g*+EQ)pcRi$G|0*p%ReAhZ`MBiH+ojM`g||<-8w{2( z0xhAJFRU<~atDFO1U=B!KbAsky%#VvxABTE#X|+eLu=Q-k;VZu(F|OQk9~0jVKg1# z@ALftr&^3L33w#{P0F`SDZgu=@&jhEotI10<`dJZw+MwaA60j~Hyw_QxgW|x*v>zZLy^-eg z0!H5edNdm~qHX|vfNci)7;of;jLMHKfOZM?$=yI-hRyT$0Pyq;9YsTrrJ@~vK9|q$ z)Q@+CS08Qq2N~jM>?2)ubJ|Bkq`yW7R$p%M ztpLBdm6kz50Kz4?Evj5Aa%a0Q{U!NX##vJ~xv6dJj_m@La%p^ppY%VS^IavkUt0XZ zlkb%CGd*kqSMN^0a^jt_^&uw&5zS1rr4)0Rvw+6Sm5GlXLpm;YY>3(sr-BILunr$PN=22}p--PXt>A0`T40>UKf)RiBHFOeS^wR6@f2olCZc=Hd1e!n2Je7^Ie9Mk9**^;>#?E96EA1KL7b& zj1Ukm!fKIk3L3?U2Qi3NO1^*{>%K?U%O#T-Bc z_FHei75nz?vj!o835y;tNEDxinh#pG(yOO1r9d?W8)7E$R98ftt#j-F}^bv=VoGPWHc6*nkr*^aDyau0F0sh zENlm4TVqn?#+^1MzufAjg%pRLLnYNAh2d;+FRtJlx{=xz9waUcoR-?w{I7s{`?b7c zRcUrxIAZZZ`%z~Spgq=CFGgGU-dG3xQ{8*i=jau|B_Sb!dXq&feMfa)T#x>-iI_V7 zT5NPo#M10}1#FL>`}v=bXTJN4((8;*e)5y?FaO2A@Fg>c4j=JCn|7dW3NS=lLBG7z zC51I?03?K3+Ji;wUh&e=JCAw`u>scZUJ1&}aqP}xv9z!p@4kC3CMS1TBam%;oQDRW z!1mkIr%%PM-TUI+d+v+xe&_4)E5H2L;?1|-iR1Ti245P=fI-l@eC3L@|0wHrLnzMY zL5RC?{aPG2u>V#XdT2v5;Q%^WbYMsm01{vjK%4k92*4U=p=}3W07H%)J!;yVIel8s zDQ~4EO#n84L^KL7oIf8gzW8F?ea}7CumYID06qc$a%l$|lW6Y&n!=+1GxSjw>Rbka zh9Uiq?e$MT{d9chGoOiXee;{XxB+mUa9of>K8Ft`?z`#g|`b#nV&b`5xtha8BF!ND1d=e#Z@Z^Vrx; zPiYLNJ5%LsfP2S|34>E?jfKBgHHM?P0Z7Nqs~Gr&OF?FC&X~^(+KCr9XAqu18*pW9 z&6m}1n>+jik29XbH;e%*>eF11L*53{nLku;#!Bi(sh~^&^QaW#HvkyG67!w;Q|^q- zfbhOGRpT8qeO?T-DVFtO*~mg^DMz{ESQWs*^v*@KtlX84HQK~q z)CVnmmr8z)<-D`~Fci786Li6Si@thpeLG;~=szwC#_952rO981;M;MM{~gZm`E5Vb zPli{`-;@Eq#F&ptIGK!_`8sVqYI1y=J3ep zDwO-7%9UUqz!KX{(d6SDU~j|Y89d8HJ!^o03hOie945EV17ZQj8`M|%cw9dCh=1lM zm)^AFR@!ByyS&_rd5t&o3kmei&aZf90vG5lF6D6zfPzbG3$|7<ob4W79|WcNjm6(Cir+w;aGksEVFs}K_U4F&{K6)IJcqZo&pYv zJPFWMV4Su3^vxK|yzX=M{O}IlH=+qh#{<|WKQ!x{z8)^=p-mLr;rT(vprXFn;>%D% zxV3f0RK+1}`FZOuWmfs^UcJLhrES={3lGrG3ctC3iB7Z>TY&jtg6+Yy?~2-M#rC?v zKW^+@k`36G=lNl;Roi>zj<%n-09P7+EAr=zzqQR+0{B%~6~*-PIt>f@Qx27jzjjm^ zvTSNnEIjmhe87=!Ss9NuO$UJCG^!tNw7=X)&I!Sf1hLJxKk#(;j{v}r%#Wvm$A6TD z^xOgc^=H2^b+`Aki@Du9_U*!AKCB<38fJUG*ccB2P4Kh0Mbf0f z1jh%02aVn6m_3deIvVosc#ML z>1vO~*{jNTcf5Y$nYb}^IX?T@&sdY|pa1j!DaOXe<8y!I7rY%2VBoGh?~Kv$F$?f4 zpi=NkO*j^I2r}G|3n;-N=*ZzC1`k*ap(T>rCTK4vCM}LcV{1;R+$<=p)wN?sEG;4Y zaLyk$-vR(hIM70et(;{$5sOPe1SWVELV!sKcz|zgqoizv!JP&0!u-P4B8YObXk`&$ z&~A9h<+LW3;!<9p%_RTnndul;ov+`x9s^qNA$+0D!et789e^ul+_>dcu<%1>>8Kug&6#!|F8CZnCRfyfh{ zSKRJ43BdHn4e?*Q@=$qKHo9YcVpq&wIT<&X`=hIEF{ZCyiO+rhuf_Du>3HGgm*bay z>6hYrPk%SgoH-v)eC#pvB8zF-4#UD9T2dCatD@0{fQ}X@b!FktA`O4ePrBpiVJ*s+ z!C#tAR&CtWf^E_4U0$E4vc2*tm`!Ct(csP$TmzsW48aEc;yu@FzHK0 z_yvF~Htv9bmo8tnMjrqq+Es)_GmJ7(cX*Ayh;}6)E;j<>2e4>fR~a!mt|a)!7=b@v z{JUq*#*PUt2U>UdQbP`(zkUq>5>4OvxHfemcJ0~|7q2eF{@sHPGk0x0{_`(Oh-Sf} z1#rsAvI~**PB=U0KfSMbjJNk)h!71;$g_lOG^PhDSUOU`nxeXgp&Z zIqrQ5>{h*%je$JE7toV11q9(oALx`fwlapIZCJI7+=-WTOl@fDMSTIp_>qS)(ITY9 z!~6;@2;{puT;5CDCtqYd(j*V_Uscy)iXVCLU z;j#}S1977^{AvDC8R%Q|T{LwQIO5#PqQ!@nSb~4Zrt~fPRRIYJ@A%?7gMqRQkSX1) z6y=2Glv+;M%9n60_^!DTOOjm|ms&B;_FggH++tI6c+*;cfPwQ1D={m3ak**#MUAPe ztMqxwWad^~{8uD_4$w*Mq#R8X`h#f7+64Ng1|WO}jkDjYSLvIHlzu^*Y7Ei~KkB-* z#ml}mTjh7vR1q}hZ2Kl$$^uW7F-UY}8sZU+ps&F?`NI?bZIbDT zqy`OrbFw}RAZmV-mGsAU8_Hj0Szpsb8<3~UjRvQJsGO<`;9AumsUv;J|LCW#GaPJh zHx#n1+gF*as9-+V55Nx%Kb2vbaRQ(Z;BO^w_nl+QF90Byd#HW9?bpCy-uTNIfb-tw z3xJ5mF@PdvC(kUK7myoj3z)_3*?;Y;GGzhnoUeK^>McLwxxbQz!|9JB;F0o{gI8;7 z`#U<}^iuUD^A7#!BLMIt^O5->Ow|u<>hHzi<_>lnyO`pJsk_(Rw#O-EyI=V(W_z5i z@Kq$f86o&A@k$(QMo>mp8yu>5JQkYtlmTZeB1Z52EVc~c$k)Mf)Qd-Gz4GaD=);2) z?;6?($2z)!}58e!5Q2T@)$_$g%DrY1WCL}oUUk!4UrE2_M?HxHpk zSa39_M^?^7$paGN1_&tOl>H^GWd-Qf_^JgLmw1pSAYs=)w5{c0$)Xj29~XdhODa_Q z4NWu_?%1{~I&Ag~M`P)x!^P^H@{xdxcAvs;HkC({bMMf4pyzZs7``gj~Yb~L{5hhOkHc=z6WPjyz=oF=#2`UTo-Lvn;v7^T% z%*<=zZdu@C5xKCq;EOi^HF|owG~v@`2=t;o0)~VKe)$|5)1uXBie{oJ+qCclXagw1 zk42?5Ae0{qE%M;K0D)WY%AYg=TkS&v>qfK>?uj<> z@!1PEqra~^&YyiJo_z9?-b(uAKm1aB>Zd*vJzd@L2Y>LtT6+z;0s^L>o{LIAF@OVj z3Bi+gO6^L7Sk*(tXzSpd#Lbx8xi9Xz^PYJ5m6ziD`7`m*!w)KrPG6|8XV32F>}rdP z7cUs3Lu+krZrU15_uPG#_-Qe?d;l#_z*uMt=)krtXa$%?IlQ2jU)}JHCLY>30B>Am z0S$2Hp&sxzKpz)wpf$&Bz4zUFuK`6g@i?RJ?z`?%=v(nfgGW`|0+io+`)$+e=pA>M zXV{ASYrpnu_IvtU---(tFB*Ub1Vp3j^Pm5G92LFaJ%2vFtFZ7PT79Xd#8{Yy%Q?v7 z`0?Xz13*ja4Ii?F7|p>4?!Vul9{?d5vVel51;B@)eTY*Ge9v}Hz(oUyGV~?BGw-C* z#Yv8TS@y2Nm-nj3R^%h3hi=>m<~a(FDuB8h%LC8F zIJ1yv8frG;KfGru4o$2YfSQF z3}3|we&M0tUK9 z2L=b6j&EgG9pE%Hz8M3UUnmnihfRH`C*f8A;FK@TMZS~^@PUOeV>-ZKujmRm$Q+pf zo(bm#EJtJ%u!?j@m-GQKSZuSvF7;zEFK>_8<`TV^OGW?^xd4TDfB-pW<#^A#ZP5@A zfOpd5u~DL4{Nb+8akXgh z=7f-k+&Ou_WmCrNuvrH3yJf2PEvJp>)tocj-G~v1g=hhe^@+#SwR*Y$r$~}EVR5b! zsU8Lat28rh>P$C(im=#@r~a4Wl$P=Uuw%^du>g{X;WaLr;N0KT^ebC_RcC`w0Qi7Wsr5(y zG&l%N0Hs6&7k#VDP)WQGmH4mrr45iz*47%n6?SoTEf%>50*$}L)tIrp9P@hS=CN1( z&F+xJ>P$f7I4;0I=1u%YiK|}J)qO;C!A_tLzjQD3%ym!pNeX70aB^pKP>YMDXor+< zd?_Nm&=Zm#Woz(HY=XE)m6>xk0Rk0fT{f5Mqz0aNz>mf!mDfO>{S)}&JGBE7&`Us& zu}tqypEUFhz4cBzkT)8F)So=C{jNCXT*{_G`Qi?}(*nhaI;v~cANZy|7|}>cxGv;J zxqPl4K%Z#MWgY;0X!+&&ew!LE(DG|(tSC47%6&=hl6MURt~7!(02ei`5QcbL8h=`% zq0vZwmIqu8+D9};cGjoYfo>xizgOY(-_LuDQ%Z|*K;fvHT^+Vchx9y_Ve_POiE}G# zbDhON+P9DSvpus$6T|F|I1k#&7 zl^Yp)(nI)>fMqSY6oj(?@&{ORL_L6V%xI+5(UsoJ4uFAeY(tcv22zA01(2tNcZ#Jy z{-q7@uCtFwN{;OS^6%iBHPwMzhuLkg`ZH?0EklvUI>=m-My+afME)UE6cOd zB?jv3*{w9zl%5vD@RIsYYP70+;&p{KpDrycOz&ju8EeIf*Dh-j-XB-ay&hvbcEr#8 z{7=WzPd%+g_)`4L&;D$D;SauGt;Gi)deC&Cy;$U1YffeP|FZX|PnIUvnJ0Gcjks&< zYwlHXt5i)~&1YpMFq^KYmT)s}|9Wo25#D`*EH! zGn1dlUGH+6@E!y9j9_5W{`Udm-z^Q?Xed1J!=P(ol|4^+lhc-s!cIuSxXsHYMpl>y6-V^N*tW8~l+rDL>=-v0&(PXK zaFw>zCU98A&FxD%&^SjZAk;&k$N0#Yhvq0@EjTaw2V+yNptn+KLCd_bx4*B&E&{}D zmkWU$<1O@!HX>R(^f82mXxTA#=l&1)A|-|8f!3%4=<&x9#X|^3zhjOdP27mj#UgxY zVeF?^*6h|?!@PwcrPiqXd|HG8Z1rW4iGa>|Yh1RFv{5q-$P>+X`Y@W0%sE+eoYu1_ zfK2qy_|2Hhxs1#ulsS*Z^aF61$9K}kkFgtn9@kF|??tc7)E;ROj7DO5*Jv$rAs@E> zvF#BJGgnkk&X2H8Pw(UQm3tQaS)d~~>TJC0;T@g>-Yff2UgK3Jkjjuu9`J8B!V+J8 z?)Ya&{;AA`$Aq0SHKxlkudXyNR&cQ? zd%YAh)sp&0staL+LF0*NjCTlb!3*G&R2E}HZpNj6cd!Y+Mkw6f4w!PW&`bZ|F1I(~ ziJsE{5`Tfe9wOMk@JzWH2xm}&w9_3RKYv^-!niCl9Vf@jpm*jn3!e!$@zA~&Jjma4 zL3^8iC>wEkT#FP={Jq1ee}gmPS=*2PE<93v=n`H6jp-!R>zfbt$5HW<@SdEti5ua# zpp7vKJM@|QR-xsGV371gXYM!Pf^rF{OR^(4q2CKME)PU|y?)Xn>#_|Ljj_%scG~^e zX$@j$e-OL-eLX$dW$tz4$A^h@3vjE~w$P9>2Mx-^^j6Ta8`uIQ;RT$^3;ZNuDfm$s z@MJ+GeH+t=bV>DN8(2*?6(Uv3#h8@sn0m6GZ$|bz zeH8rR&bXEOtnsOYldwbBdVFaI457k%EJbLi*~eu-6V2&k zSEg+Hbv-mIG3l~p7@-3LEi;zgl{#4?bR>T+;ozJ;>VqIl?>>92Qd78|9x)men!K%g zUrZA)KAKFdji}kr=l=PYVR`npm5$=}_vJ6fAHiXJQ(S-3VY#t5xY<~BFz<@+(W!E| z2pWa5R}oe!UCIq^m7ga{xxp+Pmby`@pN?j&65AWEN4IoFOiDXmed({Q4e`sr@~hT* z`~2rWZ^r94KKofM0QcexU;KiF2y9LCb}blv9wv1?gaugaU3~XqH0lkzBZ%SB4;9L7 z$Qevb^1WV13(Y0vxi9yUzk-4j;xOTPaVJ_pFo!_HhlE*+qpHKl!5sH8-1YU$Ce;S%_UKj`uTv$RKSkRf# zlbwZ)FG`UcTcoPh8lqyg9~}fNi#A2O;1S_7^v)uPa>L}dgj3R}`71eJKUF5^P-%O6 zk>b%m#1m=3E?VUF#LkVV)Aj0WDnnI|+Eq;T0cDkY=}>fJ4bG&wG7z0!->t{}r{?0# z*I$jD!E8(qH{$Z8Yw@}N>YvDe=(7QT>vNwIO|;?CN8!G4dhaaZllD{7M2{go+e@{I5 zq!&)vAD~>^g8U!;cM>Qw?S|kGfgxqUr0=8k z1!?9OSFUWt{r8>pSoPCaZpG?KB^DNzpdZhoi>2K68S31Am})5kqMS}>^8L?i3!2fy{urI@WAYCJlwKHK*P2EchJ4r5Rj zpiKhph47h=5R9pl0zl>Po;F4p&Ul*pByS^1o#^a{u2GWFXa6^EGov{=eV-5i5ACxc8E!2~8@lKzhpW(*M zkqGOU0}w#6s%)yi&&?;e3XJr z%0wCn>KJdC*U@(J;#gx9_;&jWvO8sjF31ae>a&nVs;9Rhizk?L%LMMr2}nbKr0O%T zoR=2gO3U-Q@=WsvbaY!FmxTvocj6UoLcN@Z9x`Sw&t)Zj$Cta)rcOuTcDoP~A_ncr z%#dg+&1YD7cYXrWv|AC5g*_c`D{%bVt*% z*E@`@&Qxq`A-~%zM`wU=gYYSgALk1Q=kR*)Q@O4li}a+VQ^y(d+cyjiY_0#`{i^_ zTo(Znf+NvcXBa#CdT$M5*MdMjZMFgTZ0@xOz7V7>o~x(0oK;7j2VQd|T$&2x%sG7c zB^oi-WPm@)LiuRZ)PBY*I1`?6x4(EM`6zUHQZ1mVqF(w#OVuBlVG1XtF%IK)B7ON2-gzmAg5j6ynM&lota9;(i%q#e)fyQ6D-M6^S zS3HS@fO>C}mL4^o(-j#hZ`DEcpkfv!OYLNXv4eu=!oLTo!QG%p!;gMRr?4BGuKGA_ zW)OZ5h|4rK$HOa6c=pNw@r-VKOX` z!ya`9j;29hKblsK&tQO=!(g9$98Z?~4tU}bFz7Jq=J&i<@c>sOhFxKpRBrndSat>> z$4{>*9xn{;$wbg*jX(r#3gpR<85wUTH_a;kiUN2LOp}Mx5X0a&Ft73}JFMc6E*Y|A z1OXoxeGnIBkA)S2g=qwROqhDmBy@fXd!VqsjAJ?p><|`GKh7Dn#-ZYC!RqpRTW}{z zl{uA}t-jp+tF)&oDvRpCBzvgE##BRAgnycOm?dFuRUU+cTIy&Opgj2sR@Xw>2i<7e zY~PA#ENj)Wn`+a!p)m5RuBiNI6ecXBbYvg0WvgKgMGF>-%N@iSxh_5@k;y}555L;U zD37*cXIG21(tWXe^UZks&7Z`|%3A#TuYX3&&LF<})vrdQ(uiOA^3kUQRNQ{ zJy`U!P-5Z6!fYs}3+)lkhC;Z5cGB+NZnRo^7KCl@a*@Yu%;-6F@=Uz=!|(gz4BE4* zw&;Na+SatD`U+2`1>;@|$r{_OX7tp&045yF4{4*B!otkkq7;X1Z!BIRxtrHFVt!#> zOv8Z%hX_&j_L7i{i%B*MH-tK9=&?ZC+TONy)Ag&@n|U(uAR-ya?&ksA6vTf~hvsUl|ooT+4~^ z5&`h0IC?3g*>Vt_zUWU2lg4y9zmRP%Kvm_NWa9l*RLl)$uw;DGNBZ53XsS-5>3OxK z;*bf?@h6{%U;5Oi;tPNJ zCn|3_{_*Gjas2Tge?D$pzY))T;2Ggz+H?beKXA#VG`${+^MQp#w{C66Y;#Vy;j#+^ zt?Cu3JVjetT8}55cqVF%YJBbMUy94`Ub5yITY@>W4{bEg7eq+K_H=F=MX1e$YF@ zOay`moe?^sp|`TK8sGTFU&h;Sz2$d=$=v?Cd27=*<)UdyewVLZ^;T?Xqo=k@ZLRK5 zv=#95Q%}WT{qBZTaB0Bo{GmVAYd-V)^02Q>RXrM|MbIE4Otqa7>h;xrHW|P{oW%0M5hOQ z$Yfm5Sm2uu=_mm1*mLGb-aVB3Z6L=7upddsKp_gh!Z1+oJmuvm;19b;GR80FjIpT@ z9*6N9seiHD!J9cxHqp304uuF^i<>3I`R&KA$E^DH`tcL->MO6s>ak_@q1(4@v$a>r z-xcU*jMI!ulb3`{!lVF#us+5?{e=ZHb%FM{h=#W2orM>dBGLYYb673F(jqh+6G5CM z(JflBj;FNI0K^?yr|cGn$vtlqb~#jk{28|xQxR^GrUe-?bH79ofM#K*-Ew^DRw*t~ z0=dvQV=2c%&_5A`Be?VVU&@EEgpV?O3}Rd+PMT|2Tr%h}7AGxa(nnS)2Y65Z2@e4EC#>-xNLk#*O9tm} zV4g^I1E-0vOUHoZI?+o~*G{;herbM7NfIAn1zTx(Coa*bcbZ$-DvL0d2x{+9Id;3{ z*wW&COXjv%E*AeIxw}qeNoe&$=0EpG9@>Ly;qS!s;(8EIj#ypCL$#@Rhv~zZtCTcn z%3eLxBbu8oMV0xRohN04O^T^z)kjXIVZxI?uy4{!%g|S z9HgvpuB)<0ZAEKAYjP7~fxwqC<#dwJ#|0*WX~A?Wy08!r+E<@*ACQS4n~xjAK6I1p z*81zKe++og07MX&(n26LDP&e7C?E0^3W|J$bdI_iz!1oA;E4w$7bY%lE8ZsnH-wG~V}I|A;2ls{f@_RW z32mn6xRWL(Z4U+gFW*kN+=F{?4{k%zPyRvR?~>Nf3Om_T36tM*_#AgKjrZ8~!(f%& zfEivfmH!gNmZ?2)d{P z!kg}`caz7r!?G`o9cTY&b7Uzc!M}VJ5UQiaXngLbB-7IRX#8=Wo9S6Q#a0v ztF1-M9ha{rYnUsS8x0%2(o$6>F};tdD~lUVls8_F%2YL0kFUgHbu&&MUyctv_u)8p z@^rlM=4840Dmr+ks)^;BrWYMIz@*!D#wmb1@XYd;`)VT^f%1 z@v3(;USx6lxm-Cvm=|ZyBm1?hSDm-Nk}D1Z6ALkwKV@N|1XISM*xSI!RC$n>Il_IfH;Nr#ZYCiW|rClx>BD)U|pH6$44J7$D41x6RT?{+3bT)A>NzWc&=<9Gh)@AynR1WCDV5DdJcu+Yi5b7x~=elaTb zdSaK@?yj~#2n_xZ2BOu8FnDEkEv{d?8ZW%?9WV4h{pn9z^A4dHntg16%|Z&?Ngu5x zglcH%A?)R>JT#Zsu8MG*vO(vZoyV43+UjS)3*Y%peDL|_O;c~Z^+sH{@TlGC15nEE z|Kab)Z+zxAw0LNzei1XV&DP`6Zj1)pSgn4mKi|?U$TZ7C{{lA%_5f%g`=f=0HXmp5 zad8J>soS@{^(|}sVSemmAB*pP_q*1{rA`Pt&fI^0y!gW(x_)2!(wE{_fAv?#!oQ;c zPN~=JExt(@$a$A}3vdSdE9WuZci;WdZgt|Puf3x_z9gDnk9{qQ&Yn^~QuW`t8u5Sp zfBYc+?^n)6%+g2Ipc;P;r`6w~TQRC0tlZ79%K|N8SKURn*b-n#@`?8XennJU_2b^* zv?d^RnLFWVm<%facuFNv9)&H8J0Q1}7x6AcQE=X|^Ww!6^PNnMF&<0gU(!N`e)rH+ zFaFP;do@nXjN++hp7%vf=g&XlOFC$4ZcSJ8y8`XO`IQ7f%Z(2wcMChFDd<%ukOjP$ z_;b52A6xiH0#HW$7_%@D!XXI5&VxT1*Vgt^`ytRGK8tqpqE9g{(vL}_NYqV%zi;|f ze8xxo84oS|(^%E%_N?JeevFZ%%?dnU{E*99@*|pX;^GCj+n9Bj$iqAaE z*@pE-I$M@;mzE&EmeNUmHT*$`1vJ8K*Gpw%zCwtQ#%y>KwKI6C^YKUH7JPtkjbPW~ zq*G4w13UskD}+E9zt+xH+mjDB$#Rhv!VI?!eL-m?p;r==Wojc|{doQWr;H2aZ9$~c zf`)KI;78uXg&tW%BiJOBEZiX-(x)BJ_5}Cl(VSE2j`?E}Wu?r7rw*h``hd%!+C&;<#`URcNy@3Bg%`VAr#zOMTc*{V2si*5r zDQHX9^ycSMn51z9-N{awRYda{g};G%rXNF!I~joNZ~Ft_IlIB)65nlyn@smZ!Z<_< zpB}$CZV_~BPjxB$F$B0fZNDV|vp`J0TS_C<4Hv=##HVTqym3aDmo)j{K@bM&T@Pm_ zt4ZCz;VI2Wp@oLvPw80nrgZ!fQ}3xr*c0_kmVvYHXcu4bF=V^1=4Y7*iO>XV_me;g zO|y1q=nFtPU3Oq_86G!@cVe&8(fFkKQ)ASj{59D-ZKW)Hh!0g>eAMORKovSsBXf@o zv{Dtz!7h&Kw8jHWA+Rd?sqilPLA$vkH_k(3Ea8I$!e)4TUqHinqQ5i_C{vlaPvvoj z%F>pp{p3dF`RAQURYB~pKaEh1OB~n1anifv(V)uXHZ4Fm^jqu{pm>*+pibX@sV#h2 zp#E}CpdIO#_@(m*QLRWqK*$4n80cjnUKszr>>>fZv+D&Rv3jZkaX#U|?qN;Af#UT< zHwc4!YL31#N&YDud_QRpWm?ORLZ*My4dbvYMZv(w9f0G{0pi~c5~5^G_&Yh3!}$nb zAWndw*B1hTOK|J5$OOMBfSj=D!QB<0J!#2%0>FE45B|#ldLsQan?DOC!{i?PesS*b zFCu#2;yt}4ke^pF$!hQ_iLgZ=`{BtzBFL+sJoq`Dei&#NneCqa^v)=i({ehpI}Pjz zZ8YkZ#1JvE6ON!thsnZ>hzBiA^qM?5w~u%*Pl@AE92ZOJ$p6q=ebXY^>2vt)6azUk zi5`G*4!L!-A}9GNƝu$nj#4qEVc$bz5ryJ@i1L{J)vanCHHCY$2Zgz{g^JbuHe0_nmn0#UFanz?MO9hc*%0 zX3-)-5QD}MXD|V5=gI&h1>?_6y9hJR-G45w-`Ef;(MITri4vpK9mK-Id|bbNP2s2F z)TwmI0E-uJ!!sD5Z3te|f(tD};9Knl4^U zDGc$bI~s8mfQvYM$g(mX#!8e1SJiCXxQUQbi$c*`C3e-`;0Hkh+J?fN%x*`_k^7A5 z25pzrmx_0^XN?u=AqE-7dSU7Q=u{t6pBToJ`Z`;Ikyrc1Y?yGR39G?P!DyGlO!nHn zc;Mt*ER}A=<-KP7>W9{1d7%=&^4ZVEgXbQKfB!%J2Q3II@#$awbbR5@zF^$__CNV; z3ziTxP*-S!dV2xnjt#ArqqV=Q@S}M9&9~y|XP)%d)1=Lm1PR~`;TOUHgn0O;C457?e*7v<{&~$XqNl{&iLc95z0w_qn-%t z9(?dYZv{r%@jEZP5Ra;Va={J47q$v>Uf|jL?~m_(?|bpvpZlECngr9eAoq)JfBW0k zu(Xf_ce}n95HOxOb6WAr@r}RyMm+M!`B+w2zyHIxKASghdi+5c zY^~0sPPp+fMj_D4?iko8K6O942yzvKL+|8HDjme#z8DvISl}V2JC%*cD(pjkW7+DMN=5Qx zw;bJcq4JH>E8a8E$9N}NE+b}g%jp+}-f15T`BZLbnGcVc(3-aft8IKPop9lB3J*Ow zDcTo<^aNvE0Bu z+{IsX(LCcggRW>@yc`z=s*I)`#&qMI_Cer9o(Ql@f#NcPx{B<+Y)B>#8qH{xBKWf~ zQ1n!(BIM&EiQe&>VmFGyR^OsYCM6?rd2O%2Nr&`2}1MyfdF34f=uIQ$?fVfhPZi6D4Z%9KDYe|%KV3ukxe-NyE|gBz^`!Q;e0){rqCsx z*zK=2(Hu#yOy@O<{}dh(+%a|1UhHnMwx<0M0E!Njj+#Yo8Z(Ba=s_C@1(gZu*q!hS zXZj=mOb}FrLQ^2W^HbQzfM)^3yVFxJ;SU`37UVTY2FK73+L6XLxGc)VThbH-&y<;Y z2vM+>lhw1bR6EDCMK=EEg^Lq|I4$D+ifbv2$c^nT=I>|~RFcB;WC=&xB zLo{(%B+5@inlw1zOmL?vk!w0QwI}2KgU*FZsh6( z+JFeDDwVReEp91|`MDV{ZXP^$AvSJa*P^i@riXp(n^delfNfP;{`i-1#wKK4(>%E%w}1PJj^Be zaoZ$UkWMJ*Fk)n%2tqgpmaT`e(wXf!Guf^gAA(k=-fHhsv2HEL_uNsnqI!xg1k zF@y|ocOOA`yAew>T2M``DJ07d;Rl+QpITB3>2&lCU?5qTG}J$aQ4*uNx!;d&X*nK0 zbr65`!ppJUZN~2P*W=Q~H{&<|$>+Si_7DHy4}H@#X9E7^U;bsh`pT>E)KgDc=zxHW zI@6{wx(ES({KN0X+&q`JRO0x_6V~iY+G^=bH~?*B!NmjT&c%~YJYhk_AOG_j|MxA-MTpXBaT7Hc+}sB8zj^DX>12L>DNdfaePiqU0fNel3ePs>tR;n}-=mK{ z>KlW-EqHd;8i3Fa{%p}jDEN}xo__jiZ~JAdGs0%@!8T{M1f#`;aN|>-`c#qIodBKi zppgmw5V-#J-~3J7FInc0qKes|o|=Lv5I(&C3#64RLC`2rOL^~_PngjT_ zME~RxkBaDIMq^{roK7E1Y}Xjw*4#qb5x%fkPQpLVNKD$|Ny7;39_6j~bk?X`iuo0A z9hHB&xQUM`Y3nXqldX}XytsupZL8!%V-lj>o?j9qAr^GYBAyRK8rS5F8};=-YllrVVL7+Gi3kIe(>6yr+6o4{*&=e4Ks( zjIWAiyXi}F+$62Y8XZk$ZLvI??L$2!%|WHu6>rni0-wI-dCzIcByG=wm?>qq9~R10 z1WREGyE0KJHRlTV;@c`35Gv}A%tX`Tr8p*ofC%s4&B(&_a6I{eBNB$z$WwKo-l?4k zkI5L!T43BR-0=<91r3*b{B-wGU#aE3+fBr$=EpN3Nv=+KSUR4+id(fpFvlwpycciNKZ1I$Cy5+jcp> z&u9Cwg}2z|yU!NizS=?I(iUyS?)-wqtnW77`_`#DqebSN%EkV<`LQ{b03yac| zeOxTNW05?Ym@cw3_0GJCS3r%@uT7;v}) z%XbK$+f4WYy+WdXz<*B@ay5qawWwF8V%WYOH@2(MA5~&+_hwvt^C#9|d+N!jz0I%H z-jAQW^iwmb$B&U4^;;ilZ|@QWCsJy)>t#jdN&!#!)S7x#6WWZ{~NEp7Uv##D0*$Q%BEG; zZqg)MTlG0_8#gwDhvk@^T@;gwHfs8!%VbV+W(Zh>$)x^SgQTN}{Lz$IoS(Nai$ynr z5YEN}4+vQ1=b8$yww5jEolS!Wmz#x%p5_6Q!xXp^CT*K$r9h z+M2}^ZK8jzU*wca+Z)=-+C7hbhkKy%Lwr|^eH90D$cAuy#xMk5bFAR2NA z?a*Q)EDLEgJ@4GGs0>w+0FN+p#m?pV(n61QU7|p0Y+)~KaAT(T|9Rznj{pri`;~%}~bNPPo z{qNfy;RBa-pqa=PUj*LAjvcdhA9Y4Jh$bKIl!rQPZf#iz%EcegfAE7ANFz98n-l_9 z1f2*FN%JVs&K^%ezJNS<5EvX=Uyqkxe%T8w@G=Qp6hwcfpMU@RKTz8&`3B~n{`8et zSzA%xTXp_d-hM4U|K*qC+GZtQ9Gs4xNUdaH1j0W6dL(bXi3UxlEP!$6R|cbU0tC~9 zFJ2ujwf+0TWY|gj`vFR+m^JukDs+I@wkrSObHm65zZ=syV0yJO|T(R90x&|gM`2fftTBo1THVC4R0$CO% zHw__hq7TsKJP2A4;$>kV+shcU$P*e(XYBP%gLz?3f8i!z##r*U@JjKZ0qDmVP~GvP zuk)~I^foq?0UTOjp?K7RG&?N>l6(|9beO8>4dE4aLLh)(&%yx&3^GZZv6c%6(0=iv zRP%wi3(C)zcBve$yYiquXqC}Kq|X++EbwHZMX{jAyyb4HA_ui00ZpI}7KJsAP?XWr1J@3o=v@RZCCOjG~UzSyAlH zyoly`7S5%5C0eA&jB`mymvBN}M8-V}bN%R@^3Xocl<4}24^5sZJLNeP`LS(GTSC(!T+g_Q>sh3q&Y?DOqa!9iN{nEtDK1XhEY~K zr0y@8SLddEsUJTGO`MJ(6$PBp5TpYXFv4dXJ~6NexcRHeBP5A!gvb;bG*V%ylm3f`4DOop&#k>M4#e2pkMELP3 zRk9$;nu0^|bw&d?(SyK`7J{#rNn4m1d@~YYzUckKm0sDqGq?LYM68g3KoVzEx z8Uo=d!aM|hKEqFsg{t7W!#n5s6=(e+)We;3@w~Y0BRCZAOMK4pgAeANv;4@nt2(MU zt}7qP;Uc^yq`By5clD8giC{qR42$DaBHG&c#n(ZvXxQ_ZF!``N=2 z!`Lyo>*wf0Z1s1Wypy2m3@2B>bD-((-WK3{a1Z_gA@|;F{(a#6()fAre=AU=#D(0> z1HkTqt?(W!8=H}MtN154pIc9-d}*kw9>+0AI+R>Z@7vfy%0BWHOODU)ddoX;RDqOyhwjVNdy#7lGcWuWXrgH31(Y zoD;*OS(7iyNo!1Q;6-uMAg=t-$RK|vZiO@B!%TZ9hJ*SbSfTERT12E-L$foQ8H$78 zkD4IV6XQ}k*i|%@lX?)ozh|?g@Q2-&qA0IXN9m)@B}THZg_O!&(u8_ArSv*mN@q`1 zRXr#R^;S5sH^!g$YXX{>&1B4<(;U}O)wO`CXc35@63syT#C(_;v2uMXw2jxH{QN@ z(E=^n1(O8~0x!08!uZY2%!(1{n5jdHg9RZ>9*YMwi&%&vFhNi_H@gr!yIa1I_vQ`G zLsXiJi(*6&q$NQJ3lQLq*WZW-A9~Q5i4Q*XP~5t8)9x(bTJ2WccjmsheC3L@oF0Gd zF)@@WPiy)?3p9@=P8N4;x1)SZ%S$w=Jos9h&Y#-dlb<-q)zy`lSN#w~y?g0h)l+z; zY19sslZ7+dTrkEh)e&aY=Td25#@1>UiQtGWorLS?LD*8OXko7jeoOe>+}c!#ly_ZjRi154TN9_*wAi6FvkLyT4jKeGi-1cW_b{_>aO10VQ+g{MCcxMYO|6~fe) ze)_WLwiC}h^Q_y7+pHgd{0WD9>$Ml-8{hB8m%q6Y`v-IJ2U{nj)KFcicdahs6y328 ziiIWPQ59MgRWc;e-{eGTeRe7|tgXpeJ;uUSjgbN|?$do3i%C<9p?aws|NCEV#RreQ8;?Bkl)OrD zb8{os*0|w%U$ns)iz)A;XZ%s5OP4O2hPgEwnwu0HWpETlgnsw-_f5OjaML*EKCS*o zUj(2hw3Imyk92uV+v>0RVIdA3;m-I*UvmwWN77iMF_X}ZiWheGKadIH4d{lCatVh z2@pQzBVJ~r@v?u0oEK^PU1>lz{Q=vk3qEC{JXx4Wom^M_GcOsh1q~qBqb$S$PeoLR z$@#P3ALp&d=hmuS@&mpp5g!I=?~HQ*f67H#xqO5%ehR;F8nROl3m7#&;SS`uKuVWz zBhS^8pENDhQ8?mlb*JLW)>OQ@c^I#3Ovh_m)A9BW!ay#~(LAg=5=W_l0MCWIrFYrL z3V*pPLHjri{2e&8DcTdi)tu_aVx=GJ&BIuqJ&e_va;(lz#q#WQEHy=&b@5M)N;K=0 zsMOS_3L!8bqOEzUwg=bLFI7?Pro6G@N4?w@#s#>tkJ>M$^ng$zTyl2Su>B^ zZFk%hAGaw!eiQ)RQcl_p9vmT*FTSzxhBit0lLzg}xyV)mpuQ;q(?vGj?kYbtpSFD} z&H$kuf}x}phGtr~U$!tWZTCe(4FQ$rM*I*|X$(f#ga8r&6PND{HI6%d*}?xb;qA>WYrWOIZ%@{8ai>>5*AYr$N`js+ZJ1}HH-+@16J1}9a zO)NSgtTnQg8aGq>qlF&*%S`<{X^$p4^Y&opDSWB?_G4@++B=!@!&`p1p)u!{^!kCS z@J4iMAiLU+sxv{`Pie3up)ElVg3jFMt(mB>XkrQ*_D4`j_<_=~kW&QJ1BD8QyPCpr z5HxaTpW`~7(jSQ@RUtJbJ3Inxc4E1JlwM_lP7+WX)vp*Qx#TXn6+i+-m;_2xbp%zn zA@vhN+!5RPC4=C^%%0=0MVREE7X_p*BmrRI2L4rE@MxNrhl@pnI?hD+!ru>VN`eaK zb?Q9<;61np|G+?xqQCv;z|l1F`+s)YO27k~o}+1cY9 zQ8uSt(IY$QGb<>*FT@~u(jsprWv8c!iV1MkRyye&;gkaCzpwIgwx9-HB^9InR35gj zSx`6B*jkZQ90H7NzpW})qBLx!g`Ub|;h^Fljub|Dx*lvl?(d18RD33+4>2MJPlc(G*9HfqW7tK(3(q#fxnGN>Tk4!f<#q_PUj*&8@`grNfx1wPIFG@AC3`oH==4%r7m) z@ngs1ColcPf`QFj+i~ChXX4b!Q$7a`rV!x@8hczS(x^A0R-cPuzY}|{9hDUg$PlxI za4fWNLm1cYge!MOY{Bb9?&8+2~W^i zM8Mnc_k7_9i##+6(a=Buh|n&@2RMUeTFfC^ha>iO_q_OJ>m`%${(e_w>AIW*fC)=m zlGJ>n351+1`q<`@&qxB>Fl=?D!|kw1Go<2eZD`F{%SLgRmX>2?W>ySl&st(ElKFZI za$cw;l-`qhhR(Lf=~+)yl9R?C&dT%uiS2AML_uJTEG5Q*u6@q=YEQ^B9Y z4WSi;h=g-I#TPwPjz6RD2MsF}RjjLhXAql2~>(t32G?yXQPk~p*)2COrz$D^l2 zKT|j2wRgMm$b}Q}*qKJGA775o{N``P{r8=TFZ}7BdJFicKKVhs8Yhix)3?%PYbswh&Wp4EI2RC2I)n%;uE96$R#Q9fDn6QZlnsG3;h=N0_Xvw%1-d~f zhOmw;#K(^vvv3gM9wyqI2vaN^P}-zVTKT7ExC-8PV z4+0i2-tsHJA3rTl(mA54Bk9r|)m9!9P~%|E!UNjEonEXJ>a@oF|Lq62u4h67C^{H3j2q`QE%@kBEo7ZeBq zcQ>B ze+d5Y=i?5-MQ)d-9DDmM+krE)0@MzB@&9y|2%mWYyd0C51^`hY0StAQw;tLj#mnikg&1u>>Pg<< zmLn%f8GOQ5AhaZobEBMv=`t%GCh^hGM3_KX*vgq{0{>he@}%9dBP3)FOUWfa=z)j# z9Pf603n7HSea$6Kf@9}JIJu*ZMldb~*lm^K>TblVo27XD=5)NeRf@NFt8uekQ5%pJ zbDjE@^H6%0NKjS`y~8^(*UHblB>AdNNpJ%nr}~Zh;=B4$Iqb&FR6mw0!&sS#Sep?K zGFy_p91Am*m~WJ0ram2Wdg?WV&}GpfLg93VTN0)wK}@bI^k!j*N~aM~Q!jN>;pFFG zvA`2}01`%UOSao?{8AOt#O4~M`p8b3*{-xO)D)m0)wxIquz*nk%-i5h*^2j+T(*`MA)Zh_T?UZgn`A`e}mFki_AML6o+A& zv=ScpQAWP)kH@*nO?K#qvSKpuyT1~ia0D#eJh||ycgjK~(i)xpRpKeHQ*eEUUFZ(bR@sxPjdLjQF?-L-fbAqeK3B&wZM_OkYZm zT;TV>W1d&hrZ#RhzcJRit(bfjgksYs)TZb?P6Lze%C44vQrn9b2nR|K0?Iwn!eR6k zi|W(v762-3wDnj!a5gyFhU76+zBwMeF{?o0c{QkhnmAoWCJ=R?obVE30E9F(;BX2&WDy8uFR*2=a1Zhn2g^kS+s}v)xrc z-tng)W%@&tJ@vSHj36qF+84YlfZpy20Pn#)_%9D~ho6MIx&2*%iAjUUIIZ0K^Y}OR z$Qez%V|BQ(MIgHe{TvRX2+OMn8XU8OUM8bET{$=o9yn=$wOfuwJb~OCf>+Yz9|yjw z6+x`UHX0}iwgWSb!}w7@v*rD`h4LotE4l{Nc#TJxl?a*#GcNTp4oeQw{Nt9LC_%m^Szkyme9 zye006V?Ts{vJX0O*x!i~=0VqI8B({y!M>8yWU%*+nF4C%i55%N{B!##ym5svj{~}u z=k!99=FTXbCIsrl`E8_09ofHJ`6DLpH7i(*)ZUr>$5T4X)X&W$tzvZRnxODlF7jN5Jt?2c+6}T63 z^Xpo8F#-0(q%^cR>1xr?5mQr_y{G(D0=FY5Op6w_;Q9n6 z7C|s#Y_EVpIvAvzgJ-ocNBfJ#U{i}+gqSRtx%>mhk;Nv$OU|`|`9f0-Z9h}7%2L;2 za&3LxIO2S({Z2QwZtcaD>o>)ms_leVf7Rzt3m7gE@OdGk8@81|96t9^{o#-WtIAFt zz!_~~)*6~Rpp9`AjzuHbd4qP!VmPLbJsIUHLcXCGu|jJ@{ZFMfuVE4wb6B3Pgj!6g z;$HI?S?KfJQp8-P9UFUtc>KbdIJ4T1^XD(bul)LN#L1J#<11hOYFvE#Vtn-DA60t~ z;;UczYFv2aLj2C}{EqRIw<1z@1X>6JzWUX#jjRM69kXsVs?ko&>ss&Aa$< zTPkVM7I~{87k_Yuo&|ghY)xnTWzsBysqS?;78bA=B_8;I_KX*WK|3jHP9X$9C_wqq z#3CF58_I&<4<rjSb(>d*#xlIClK_IBXVxg2$#z%7(TrTSC$NkxV% z7(6PpBQMH!6s}yk60a!!FMs;eg-Zgq3! z-G~o-;2DQ|=i-}j`SND`-j_FHYj+fNjZuGi<9J+))d)1HYE97y!h~8Jz@Q6{o-0JZ ztUsVDk8;crdi6BmNdP+|9~QrQtWp(k0}&kH?*R-mq(y!?{o);PS=1gX47TKwCna9( zq#x43kIn&*2&)>65ovKE(^`N8S3lunhbyA-TVsBy--&;5?rMDc#B1^FvyaCUPd^v0 zy!@)htp(H2?(V)XTfq*k&?m@(V)3v&8v!wz*J!UI%)1*607KC>^hz4ED|F;-e4;mi zc(_AT&>-QOjk*PBXe~p>l!I{?ZD#1v+Dr5onYmxkcbt|?YnvBz=|}nChG2^H=mYc{ zgd{9J5wM}5$GNaQw$dwa&O<~fz?ppX6Uv7`)LMut4|ytar|&X18!lU}2j!*Q)ZcNSFghn3`wgHKhF>Rsjzw#@B?lT;^42blKRR$3FP2Q2+Q2YSWDPsTEHT{ zVSGlbz}rPlE-8F=2dE40c2Aibf4rlaNnXVDf>Gl(3uovuMgB zv{29=aODS2=a0U6RL9amD{6;>n3?Lve03Nrjgp^54QcbuaxBhHSpYaAR;nShQJ;#s z=&!DEuR2|9W5lTo~=h-Ho>WrqJ{cLIq6%C;c$e3xmk{f;7XGF>* zj)i=|gVtgSSs8&1c$>4X2PFRH@yh`ut63+af zaz-GGunWPU&m&a&;5BV$PVqn!{={SJG4y$$u@X}7Q{*#JTv_x`PUU5wOtPykCJ?tz z;f~uKAP@TqNXteJLrGFE0}lmix#CkHiK`N6%g`&D6y>oim`%HRoHejdy)iouY9jY!VN ziKLO;D?kmZc4p!f_zb^-aUgx9G=vc&#-!q~V$j$Yn}+B#EZasJN|#BJFOWq{WsT4e zv8*-7He0=!>k;Fa zGy&OCq<6WM2Hcpdd=We%H0PO3am$AyPI*?-BJDsGL;TnhI>1yW-wyp z!{R%&SS?^-Qs-)iu~6BIy$&}!)?=iQ)00gtk}p#id!G zC0zEztwCC13&f;p@hQfdEy*lG!DZ5H;0s||m{`j}3=|7L=zv9`-Sr4t(H9PAM;Id( zaBR7;08n|L_9gz?2y1+r!d3sD$(ZjgmeSzNMcVR7wx2(ODvixy&0 z2Db9CP;a+edQaQw(AYs+g)$Aba6vn4YiBpMcRSHj_`zX4Hg0W4t0UU6wx8-~qJ%k; zoANEwC)}ngI0+$?gQ!IpiP=;8!+_DJhHSl4IME9DNel+*5f=tfcptT6YWeY~&K_62 zMeCd|DBAHCdEpJ^Ei-ybo3F)DVnHZ(Ey|~q4qA)N#%w&i7O}T^G4>DF;>q(1adtfd zjkaI=>~C6A^Gjd+QoR1g>+x&9_G`*#6o2)NzY_hd#&7-BZ^a4Wg@rB}JsGyPx2-|R zIgiaoGm*X?1OS|g$5vPbSkFBDwEZ&Va6B1kFXAC|tKU(#pG@1;v| zT6q!=ceJ?>=5QGbbwjYomSeOa5%8c9NqT=*K+6z89%pHC-XK63^8yRsJ^R8l(;>Td7|5i zk1bw_e}3U&oIkf3pZuj?j%yktp{x1Xrs?IOhaR+GkA*iHcg6ullL<{iTeKUuUqhd6 z&!T9PKwCoxv@f)Z;Ee?&;nTd5@J?QgWrSw|&iFqRLA7EtDWm0=*7=VJ-l&<%}+9ais(Oa7$6wqL?BwtHc#Ign!)7`Le$ z7YLwXNS+b%UH zDhmB%==q6!Qhq6G1Z!-EO@6pRH_!+DiVt3FT~^X0>?egu=`aUd_@@9_2ng*m4yCPk z5IuEH<>Sdf9;8DYx0n2wC$o@|^a%s-o*w`|$^uUFM>waYG*a9Hwe`T4GhE#r#ar8G z|4qf4Ta|ccuNoWuMzlxb2S|*5MgL$-M8>>QLNuwqa1VfDVuBsuGdP@6yMO)w8f3n4cV*W8^9;RKm;^d zGn2MM=$G)9Z~*Pt&L1xYO(pE`iaXp(st)C)eR4;qdgd4L$L_jQm-GM@y!k!(!y6G_ zRH8o|)fa>l=*8`<#IRdak8r{jJh;a){%E5jt>h-&1a#`pVR@l_$+K{ik;;L^l`Cjm zU{U}VsWbwm2(keA(R`qV`uL&@1WB;fDk^4AV{Ly}^0wW!#)e^k%G-Kjp?upfXVRe& zh-RS1XP;F^Jo)*IJEh|@JdI^Ck^{*0oJF7Ig$m2W>dp_IaFdzqCI2K4RC~zX&a5xM z6E98&IwW+Cqxc5;tT3Q32mzrDE}uatM05LGO7$s^b#h?&g}@MPVF0aUtXWez(Uh#v zox*`*rw^WaDe#Y*3q;+Wlz*s!eo`7Pq3pO(kM!{wF0*)79KtY0F(wiY?Lg+TBnZ4s zBbpJ72KaZlc3;v#9>mk*7Z+A0WpP=H$3|fimIlhS#u|pW=_mQSUW6k^GE@4=nqJht zO2d6m@02~&nlckK)o~ofHictdMkgR$+SUQ|GtP(D8C1?hIC|u+vRM%8`r)tig(ok+ z!7YwN=fi;hTvdJ`1V>QYsj<`LCVJ)lo&fM3+=KrDfnMoO`uBhwcQTDhH-0=|B&(r# zO@QO1L-9U#mIZq;peJ*}&z2kpw<4S;ox;7CfOtuhrK}#LWwE4tZfh zD4?AOGo{IBBqk3*7z4BOs)+d`?Pb6 zLl%|Pnb}k2;9m~%!>$JbAC9$S5i_ePXemt~5x-lP1^V6|3CkD8A5cR21RO;1OURsa&#U~QxP~Ui4}S2y*w-SHMHx)<)D#EQ_oLpN5zbl6sQtu1 zW3p(Zyev#v6rsIQ)1nXhg2`l|2;<0hQ_gfkFoi}5XAH8yK!6CYSX^3ThDlWK2=~m$ z2)78b)G$gjFC*2FwTL|seWvucH(Sx}wqk2nv{M>bIC%ggNE@4Tf}y0WYH!h7 zc_bQili^OY(T>95kha!ibynykwY`2wP^KUeiSYm}9yXU_YVB#o9%|92JVgsIdu7q3 zQjCLXE@>%6O&Rt@&sFsgZcauMl{0sSQ}tM$X~g}DJF&U7tL*3F=|@k*`eHB6KlE_? z#&3Tv=4O}TJKuRBzVq#G$HzYL(O6$ui|>8^`;;m^`q7WZBNr~DvK;~Z0c!A-uY4t* zd;WQ!!S}|SZ^)(W^C>eBmT)}0(QA|aPC(e#5$#>Qb}g>oxMA&0&TM@B%{SxB>C+Z~ zAuvQ}%bAS`_41ZpgmMV)pjm{J2vrb_kOuV08EFWDX=i8_0Saj#gz>g;y|aCsZOG(- zUYF;)UVq zP{oDoS{x$ehNnj=s~0L$3b0Iw`7 z+t3jn(|+#<2=aJnXCB5t*I9`XFO9uPI}kr;d#Lh4x6m^}3&KICUeF7OgB^cph%wa1 z9~60@(MLS+I#jwA*paTra`Mf>NYWrLfMXSsrY?etBvfMj<%11)p61vBwojHT{!qh* zA%uYl`?$!%^(gWL_$4NbW!%Wu!cT?ELKqLNYS5%v199k0b~L;Frv*8ESiy{&-1c&E zxYQ`g0BC-M2C13S+~j)5O!;9FkAG2^%7dRnQ%0H0cZ9_+1Mdh?{DDg06W(sOBf=$; zv4&s~pATk$>&BuLkUKcAfKUpWbkg&GOOZx8fCNr4`Qw| ziiMf7HUDO6)o3F8;}M@!7mtFyE?ibC<*129&Er(Tb<&FTd2Jf!5G1E_+nATYo7#uA z5iY<7(=xP4RX|swO%=UBo!w12$)uVIuW~!YR69|14_tQEzwitXDO^B9;42HZ+{VTm z+_1vPZUHmzdKA;~@%6_H*-~)1DnEukvV{k?FX%STc}oV`hlDY8Q&#Gya*9$?dh|uo zqhAOV!at@7MWjjlLoTFHA5b=8C&@lQPjfb!#}-(H_Bza?J`;qAT%|5Tq& zU%aDu#=iXeDqdgqbk3@?6v$#c7C^!Ct8uBa8E3K@55!QWwqmMwtR0AFe~tGt)Am~8 zL2H=Q6}$ck>k&$T6}$<+jujK250$|vV;s^S|4AUon`nu0>EGY+;rSg_4uobb6M^wY z8`7^`CmZU=HgQm11?~ywvM4O`pG)MT=w0PSQ%|*$JK>-X8Tvuf&mZPpXHdY{%@{-4 zxRVd`lG@p{N_m_=ppv-n>zzu28_MJ`8T6h|C?v>k{ONJ|3O}k*u8^-+Sp7|eD(_M)6vSdZC3{u(6g zreJoX>@ppX4+#njO~F7}XN7g%Jptf7xCj6L2lQ(CeTMw*0f~{UfZY2hoRZ_DgWku3 zuD}Lv3^0YssP&#fS3pv@5srvXr*M-~5+Eh}IIit-Wl)DpkeR;1k`DtP2BV|~Si<3F zM}^ab>1~f5k~PpFoMRg+XZIoTz|BH0O`a;RbF?G`tqW326S1|Pm~34bxyzouoao(5 zGUuWZCo#&NsF_F*Qaatf{8IX^GKsUbmq8kVo#I&&PYk2;fuV$3@#L@chbvvP50#y!kuWMo29WQvP1ODKH zwnga2B84-Z`f3*o5ljmzpB5%8dZ;q_3|V-{&VtD2`6+&{H}nN2)*?9^*bnWBhVo_6 z<3)?w8G+Dvfh_kK)fvGLb(v|*MXi}Ghv;?{n zPPgx^sO|PBc6K&npTnosp5?=Wu4p>}0tApiopGmaU_#xz)RS}mEcjDk`m^$9A)ERY zKp==9MWAmwBK?fCr`4FNk7$9z7GJrSn_}2R<01~2$AK2!4Yo9^-*F4zRJ9S+saljr zEiu`nm~GCR(W{pGae7G$$YDG7hK+dY{Cb?w`}v0-j8Ff{XX5O+v+>iHUyZN*`B&n> za}UQ8PdpYs`q7W##TQ?U&wS=HzN`XaTv6gNPz%m8`=dYlBVUMd-|5qFW8+qwzi?g) zF}6D21{TK%SJAkH5ms$eooPS$gQB|u0zTRm4LmMIKtRo+8|^$6OQ+AAiJ$!V$8qlL z+1M5h;D@Fo7kjL)t$Ew+XH^Hz>to9eZ=jDFhgx+Jf?FG5wbvll$XmrSa{-=`W2jq{EbQkB6^gEX_0YJ zP==Oia=#)d12^C^jWM_*WC2&oT9Di`Fb`2yoGfT@oP=M1csYC)+JH;kd3fieSZ+tk zoiqTUx75cFME{Mujc%apdAMJsyPnrUq~ct7|q3k3Nv3*RMEyh!Ds8@U(+1SJj{ne9@8iS9ZV=qc4!gO zqdhXhaHbY)^Q0CyyDe2Wky;ubF$tWUi~3S?QdCuN6bw~Y`xDoX@S%4E><~8mP6|rf zlOKT*k|`Z$kkU#)QhYSL9C92tfoVnHvI-DRyV%4QU8ZwWDIejW9ofWlrmsS32E~W; zINOg~Y0>uUjS%1^K_DjQ`dRbO+kKOUALsbB5%9?mt-p@S-dD3C1mrtRUzwuq2a1d* z59X8Sl`W2Lnt%rqjg@8k1GTm)1YH+oM_wQ( zyU8@yqWmec@v8qch82Ae2l9{$bOlabT&2UuIP9bbj|-m+otaALlhD^FX%XTyvT$0( z6V6i-so%O-auFrz51tz{wPmh>ccaj<n(qUTC5C;cP)+EDpqlt#gK2Re$JVcw1kWM_M&X-%`gqP$q zF18sQy}*PFIlD{wF`%*-6XRDBGaGEp!k;Z5ltWBgNsPmxn7)*Q+z>))amyB8pPiSt z`Z6&M+X}3@5e6p)_g*^Zk6NMC=7aHjy9&crSk-C&hWs?G_jY_H)M0N!?=|tJyNaua z@Gzvn7~guRpW4Ap7EZ=Jc4ce^N_CRoA(w;9tm+*cDhQJ`?Kj0&R}iB#!Ktif7L+>z zNy^3zvOz<#f8)yoM0ruiR zX$x=7#$2qfE{Z9x#{4`Qg9vjqp{q3C`qsBB@L|DG(IOAtiA4w7&hWRkmC6RQfMACO z20Rxx@c9fq;Tml!0;5&Jf)PMd4=oXdZfNYWUCsHh7?3{;2l7Y@&#E3Re&hoa1KoH* zr7$C<(e0pl$ifswr=|shET%D8kiv9PZUl&ZajgA*SBvy?Ru$)>c$>)qlYQT}n|0fq z(Iop|s5OTc{AfC~I^I&%DC0$X-143OJUG=m#k9tqu? zSyCHSVs3`>#9$O@TlEi(E3&DprqqO`)NTFtv%wlnG7&^VqvVa&9rOjAE-f!Bj{^&C zjxLV>bAgLR5FC=;7ryX?`1GegZ5jl?+t2i>^1+lasD z-lxtstIju1r_`9LGHJ~4aD<=)JRpb`y_DEfuJS|A+{W#MK#l3OXkBoISu{8XQ22Uk zc@Gp}-(yaK+&oPb?&F{;3*~XS0j3+OgiI08!WBv$1|L5lMt5>gEyAMrJ+Kllj zp$&RUw2r1A+se@{<)&z~Q11rBhd$^t2%n)<;OIgfAq@Q|KjZ;@Lo1ljK6H$*h`2l! z+{k2nKyYKBhWs({&jLjRRY1<$0%7@M4z)@jXbw)oqI9NTy`lcpNdkB-{s6KTBDV{> z&r=5BnxjE{1E;D1&Q(}aF zymQHjJe@A-6AzR0a~i}YF9a3%JJ4PTbr*j5oK- z@%C;dF170MZf7=bjSv9V`AiAARW7xY@NBS9PZ`iGloOuQ0#WKC9Krul2jUPG!5=&c zJQp9DMUSOX$9&Lq^rNb9wW(25^)xhYHPqFT@UIk2-esZ*SQmR~O+dB=D+~g^if?R{ zo5F(&=F7A#m|X_oO{VxHw-f&glLa`KKoW}M;QvI~ybEVWEA=kuEcs%WflVd?KKh1* zo_17K0`^S*VoM;_8A)-EImfT7=JLbYe)98eziP6c(m)FkdtYe~x2HDe!im9v zg5Ay&`cH@}fI7Lrgvfxu-f0)y@nW7bu4RY5Tmdko%m~N$PB_t+Blv|lGWapBQ(yAj zK~jouZ+<$i08U={;c#g&T$kk+DS& zpmzqM;_JjX{_Rn!aGFRXPlg`Q2+E{JpqwTnuLdd7P#Aw#+o|uG0OG%TI7&{NPO2c1P(YWx$tm#XJ&-bHD-u5fz6OAUe zW+5m;I9IMkS(7+72*-imT^I6D9S#_LRqkO+?$Zj#Id$Z#5Pg+h12@7zYw{uV6MheS z?Id_4z5Y(Bo4+(82vis@1lhZ4d>A)7@2Cu_pB6tc+;@4b6^NfFY60~waAZ3`n;9Po zuV^N!Wa38Gqg2$9pSQC8pQenLfpQXdDVSbRaT9tDN?z{7x9RhDrfSAp0b5$jhWe0e&xUgBi;(8 zv^ek^fWc&2EZT7_47jBg4H1NK(2?;hlbW+&V2c-i#Djs!i#fnrCUQr!0l^1MwlDUO zJHkQA0lg5$nhpokTI2{vqKQf^)dQ_Vv|w0(!n|`P6zlq)7F&Z}(z-zC$0FBEwJ?8h zKsXjwrE4BF0~~q1#O@1UXV2#xefouc9V^jKQ+rlW<6{gppZT$6#_k0@*1i2jG_9 z?SC|(0`h#50x-_YHW`*dk1f904NonM%5r1evIoKi><)vSIY95Ip3onM8te7WF%Qwx zc)oun9<8_H(+};$qbDOi`l(OEeWy;x_3KxCi4humoF&ROU>_l%j1he0qVjOYC<0sn z?NZv@LWH{jLO8acGe%{B-gvxJ9E3;s5e}gp4}J*j@<$TFF^)n*jHS>FfJUE%j|z|J zGRV$3nWRHF!l#ccRgbeipGt8Vi!Gqj8+oAV=rGEIEubUKrCj`kwp$XW6kC=V=ahhj zW=bn*RcYRm9gS^hiNz8EChAeq7)9eGVH9%&<8$$GO#XmSYZ3)g{*3M8MproO)IZfb z^{3>H76;Wvh>1xY@SDPkp7rOg$|_^l6vU(~)FJoFTo!}k`-6krcqZExeBckzAE06K zBb_WvOLp);sG>aZ1%A}!lpbl~%uUM)AK<3IN0GPZR(uGrz}QKf^uV{b4dbuJ+MS9c zZ~3Qk0OWJK{Mk%pwNObBay>JB@zISfz&rb$*w{UYclIlBaeF#0cW2^CZ$560W@GoD z7NVN8_%}a8A5@+^xFPWJyI$y{76kHHLf*9mk0#W3PcMK!61A?t#Y9Lz?NY38`YhUq89!M&1kcN=4p+A z2xN>O+7UO+x8A;~0PZD1SHex=*%V49d>p2$U7%Di2AR-paYPK>fP;aH!k*g(zA=Kx^4MgX%_cj6I^MxH2`W3=H`zb7%fT9}&eefiNWxMLYZBE|G7y}zt+x3&{lpNjz z_!hBm-ytn`DUKq%u8FY>~a!z5Z$pd)de@1z@vP`)E@B*^Xb za1h+leuXu=`5kwqOWg{ADt!g|9Cvz~@-xLhI7)q<2C&tYx(VUqF zo22v)%hklp=_zx58%&*Vz)g!83;VRlKmce4in1PPK_kO zE(5h#IfdsdvD~H*2C{7yKP>>nII=JxP6>^w?ry3FX?M`@lOLST)r;cxRL?<2tGO$V z8`e_n#B}w?dYxCfI?9fl8^M<1-vNs2b5y_$8a;$5+R2QE-pzO@Om!(~1X3&nj7*SJ z7j9H|w#EUosOpurH^E%;MILP_7IxEOrqmAlo2~KHdfHn6(F$B_uy~k>z0O`N)Td%$ zZb}QuUQ|k5kp%}d6Tcp{Moo+}LL@DAlt*0*G8$Tx5psf=VA~ALvIVRP+Y_D;Fm<{e z#nr-3i(oYQ(A;Ff=!K>1gllN=NtL>6C04%a0Qri-a4y?Sw9tT27;fofaa~uLXxbW| z?G?TPJtJMOr^h0Ng`wI{{f3?+LeZ~iSIHb6rZSHEC;bKw z`kwos+SOk8DL(XXyWX(d!cX!?e(VFDdB;S60qrbbi1O?iEo#(O@@okXWi7&MoWn(b zKI{qqP2o&=h@jZcyf8DPwl2lyPB)tMN-Q=P;@b9J%+o0TSK?dW`lf{u7tWtodsXAL*ItP$m#@a-Pdpw^=s9ux z1cf(H10G5buwD1TX5G`PqIt(J%A=0x8qvKp?A>3r381| zp8I}4UPkNR5@?g$Hk|3kEx;M>mKNbY|M|~*dogs#)?KztXQACum~3+Z!QT&l@B_a; z|NQe7@Oz#1o@kfLhc4ba zh`;DQ7%{6dSA|geE#r(9$dtTXX{0m!5D2ocDGoBX1_E;cVPtpv(7B4TD$p1ww&SEH zw}~Shfjj)~0z?4?4oA90+6LRP@BT#g7-4xT(Gjv-mk}I;b2F z(jeTDJI6p+6MWc;!(J<5=W;9^?#GADbmD`jcjNizo`~l^_#q2C4iGvBS6m>(nUI_d zn6$GH03?A8s7BihfjMpZ^KJx2sFH8s1)%YaV;&1! zyLuP{DHCpKTt&k!33|vc3lfKnWy&juBR|}DCqL{6?fAHXKViv(cYhR8gHUJ2I?7<6 zilAB^xz1=e@iB?9A7K`0;GXg%e?62>`I0xSm&c4uYXE|;B$QLW`cn*-fzaeZu+-GJ z(H77v?ZJGR3YLU?gh}CCHq8xLLyLaEMb#XgSpZmFY2q(kuFXa^eG?X7J(m*^jCNp{BT3?$2`k<&f>Mwd4Tdq5U6)P;POGW zOuvl2{tyT@DhLFVP_R-61gk>RwCokNGZ!bpVu7pL;T*7c4ridHs5P#l2jK`TD>fFdx0JR8w#F6jl!JHc}vrk+U?7~Azjsf@v*E*{P%;pjW{o(z-|I~wjNOoo}H z0pq<$gn58hJK z2|Umg&z&z5Aa@V;#p^h1PG`cOLDXL%ib;uq((Z)gT?WyZ{RxXZZh*piUh#m1x2KKU z{^lsfERs zm5sIg&^$n3=!srw?Qt21{1EVonXGD3s8&Yt@On8OSn9;tmAX(oinWDiRA>6Jy0jG4 zX_%pdsB0nPs=;llyuJQ`7kcd$HwC9J05r zX>iLILO-39(V6HuwnBD&H7L}5xp zG0RoCvDj1_sI8_EYKdMD8d4_~O1`C6k-V)_rVn{H4WgX^lP)G(bwr4T816vsEcdFF zYKWJVuNX{(af(u#s=2wW!6)Vt#=0+Bf&vGk7tWx835O1Ps&Eoq)`Tx%v^$7qlkLAH zUpm4TU4)A;yqsB;%Em%Ri(%mg?F8SrXQnkBUeAIbO~ig@5FLftZ?(-N@3+}Lt}?1T z;8>MbdC^c*1Cj879_p-rerP&1R_Yf9{Af&>#t-z6oRx5j=3m^2MEazOv)o}i)HgVf zGiviOy>cPSjisoKy3s>BvMQPtUeU^>cvWud)FP4_o+)Ef?XG2cY_(glx-cIN(agJB zd$BxIkA=CV*w}nG9yvB0n=Ld#m*c(@GqJp&J}^HQAOEF~$ESb!*Sr||$xAqP66Wo=M)v~XY&jNjX-x?2&1A4edkB0ZN+i%BY?q23oz z5tlK8xx@=MA&GIH68HH?gkVO2H6B{yo7>-8SEJnBjfa;H;}iGo#`BLY#D_op;aEF% zDq7py8o$_b%QO< zS?I?z91h1q!mRy=78+x0*6t#_wVhQy#^batx2kcT`R~AK6NYs75Jb5fjdWI978H>t z6-WZWk;i5(mGV&o@?+aALNf$O7KA8XiVLbWrZP9vR`P?UDL0G$IvGlo)ne4ATNH1ZgT~`XDBMnGUA_d5bbm&@}e+p2m2zy6{uBhAfD~^oKME ztAOMVT~J2Vqev&YBXAWSRS)Wr1!K5#mYaoKg*)>o+myj$il4$|L1n6$QEmTJW~!uF zP5cOgSA4p-zu8bCI2 z$Da=o&?(1@aFoY>t1C9D7q?oYxU@SJm%GilJeZFg{e`$Snv30oMsyES8&gTuMDwir z9n6#5%mdO6;6pe~&gz_e;6ms}zeL!le#Sdv8y{``u@`M!&1Zbvg?}O(LO{}iKbq2< zIVJvtVXP*5O}v^vl&Lsu18#^HsucpkN>%*?e5?N=44kSU1Wf!)8JfrcN=-q+dzAs$N7zT9IVo=XXI z`CzK{ABayv0GPJ+qWPye7a^gV*Y4ui`pR#Fz)&Xql+ROh0VzW&AMgBTpQ55a2U5rc zIXsgBklvHRz$D1slZP+>?qq`B6kK6dehUHxZik!&;q}KlCk0km$Ki+c^zKHRgvs|w zJ9*!JALlWK)SlyV(Vl?tHn!s7w#^O-Thu3GG1X62g-Ll3hw!9Z#IrEVfeL5nBhiMP zY>`KfuP2v1wU|q5tdncTc7Z~}*l%KNHMsnRJ;PBP5+#=v@O!e3!O0#?dooUe3#>=! zfie_+Ih|C$G*3{GgpJfcovy|M^X=e{@+!Q?WS33jEn%F7+?WrI&wB#EdvFhafxx3d z@l1dRl{+j)pm4t<`eazyJ?LQPr+CNoAS9E)2d0XFjlqa9&p`;oe<7S>hWA$r(#T=- z$YO@XBVe+NOOqFADUKG9p77+(c}bX_)JX?Mti+dU&HhfRNS}0I?uyyKT6ePeECrZ6 zK%NexLDYpV(grw`_<+@%%3MN-XGTJdoyvH?Agi#4obN{k5Ga~~6r)In2MEQgDLsT< z778F#YsX{D2l3?T>3I0~D9)c4MYA@D*#@`4cEq%b(HZnqrNiQYbc9entrrJgNR7An z2p_O_iQ#6kz&0vwTjV^XYRt|yweDuCYSqlv&5fJ!!yo-1E@=_}_FEU@o8Npvi=`|S zWI_gKvk{GB;!+pXta?`&4!Lz!_&h+1Qk)9)pHf{}94Kq$TUYuCmuvy%j2kq8SQv2D zO?kQ=EtP$iL$Fn@E@eOHS-@s_l~99>c77H*nu?wFFwp#(R=Kw}cVlrunW#CsZQ)sq zrJCw`pa>PXX(a_iP_H&DZ-&1|AP6lWa3ekDO%}{B(G|rXiblNDLnw&QO-y1%%s9J# zEA>)z+DSXa^;UXJtQFM>vW2m&u-%R?(5iF8LP-wJr_EJ=Ei(IRzk@+H>RQ;c=`xaMMDvdR5TJ17P7^;-|Z#43N;W{yracD=h_U4xUKfS7a0gO z4-XLZ(0(9;4o2Oe5t+F!$}7>dEkb&FcOT1u7fq1Une+qj=SS||MvlK1Y3h4(XQOib z$!Lr^V&b`3xfYFTO$+^&wY(OZb7Im{eP(Oi@>vnS2MT)-Yutj{Ye%ayjMM9jYX82^ zNIZ9PF?#Lm!TFg}mARN-T8R6PRbqX0I!>K95g+`>$K%;&o~2OUqWadGZ>rz)Z#SmEZ?#~**(C<1HT-228GZ^XHC=i-NohxQ;h@B)l)8Sgnfi{0(5t+;vX zmM`hZ@YY*z#l?#keWo9a?bly_-CH^lDo&>JcLjt!XhOazoN?L6Lk~Sf7xAHIAB$%`@T8KZ@9#yk(R3Rkq&ar%xVHjRha}Vz z`b3<4jVoxp?(Xh59D>}x?N(sYLclkvsh7g7d_!qcA-rW2nwMxe%dmz=Gd z1v~)$Dcz3Cn+4U3(ac|jV;)54mV{@NrQ!5gNFfAdL7z0_l8}tC9X^DM3pg_kuHis& znU|7~4FRFTiH?~2YbrneiMi8Se<}lGGs)0SY9aS;>Xx?rB20siz{egAOFc zCEO-=Y`2Afyn_NB@B~f}inBw3c2zN)7DCVDhc>;FvwISVC3?(l$o!(%$ytCqdGku$ z(PoD>iA(u0sUr2tT6^G|C$|x01*hpOI^j}zI1(PRkY1`!>I}w_+a#6Sf>cbUxEyS+)sLI|hjFPj9XEROacwvo z*M|rIXJhxU8J&YP=aRSu@G>pH#SY%61J$5EQZM?w1@iDS^j$q@0ji&}qXePfA=-d! z1LjfR#T_kPGz1ao)93j(#{6vlOzBq22m$$sc^FmUmNNs>cHkrsL`xoag^!(R0;2r~ zPv>Jr{3O9%rgdm93upbVxMK}LkcJ6Pu_7qM0lN)CK(o9Phj)lo?X6#4QyTiEzc>u< za#w##&MG)2Y2f8Z#8-}mn*;Jrd&-42hdl-}2U74=up{ zu&g6 zx+wVtOK#}*0DeV#8hB5p`z}_>pQF0myid3RPG4X?wE#Quqg1keoDH;2`obZv#UFOR zs{;Hf6rqc#IdY1j4pP`N=$*yF&w{ack%q0=UZmwLkEG*qWg?7#vCwhd*80zcXdL03 z!ltz>kN<6VmM(ws5Xb3d_u}1cqd~y_g{kMB0Pr5%gI^e+t21=)Ou&1bJ$fYT7z($s zSGMHH6aEZf{!Hz z$c@9Wt(li66c3J?P|24|Em&j$iX-+y{$dC<`1?#jOtctFFfK~V3@u@qP>4d>Fm{xI zFmfgTVMl2ZMgy(SQqkhUTYD9Dx+(5sS8nnfz&MIgQo7HbXvedsOY!{aejH!!$gQmf zP(OCX#O}5_VqO%SGv4}Lvtd-1g#!x{7-}v)Xf`>Ysp|3wHHy;}gQ&bU;3F`iY^_eq zhhwvFVnKpd2n;+6t43ocmX{Y}ra2c23v(8b?e28qkN)Tn;?>t)j~~DIquAcQm2eOo z+`kf~=9;R)0wFX2jy zCA3TsYIIdrv_&|}aCg5WyjO+CDWy9QzDF^wGI)(3ZkBDmEONNuW4cnZ@RKjn2U_6O z>RQ|iN1R8)!jmudP-#z#1sMBut{`8m`^FVy#^R5yvYau6pb$sS3EbIfdqICFy6N?j z2E=FpP16?8C3Gk&jE%d3erOo{#z2^~*ct7V)AL zF;$J}6VFC-ZY2iYebL!WR75BHTIg4+^_ZWTjaIjsKm}*$7dlO zUtW%jH}+z_b`Ud*Yq7Pt9V;^(Eu>WUK{;mTkHy-0Bi3gJu`qWK4?TDxKK{v1#zPOK zt*+4Vk6-$U7aVBIaVsx^uIo2$xcr>i_-Jvl#rtXIWndwS1`WaxG^*HE`-zW#+`17el|i%tf*?ciWJH5faVL&X_h3;8G0c z4XOw#xDgm3AY`XAbz(9Ydx1zKlYC3G;<*u*;~ADsB$($$zlJm@lO2&OV1Br48k zD};my1ekls3t=HbKEmUN#xoZ*A=E*bRIAlpW;C9&01#nhrfE##lMi-2W+nX6T!lbH zeuSmZV~$i_3#Md_G$(*3fR8L(_>nZO4@HI*jp1@r8INLwym%~d1fjA6q)%Wz0;PA# zMV%=t^m1E^E%)IJ7VychGEKM?Hc?g@`w<3O1JCtI^E}xlTw&)&_!bV**pC~W31!lw zKt66nfRHhrovUzi=W-5&wA3l%iw8UNIPC?Vz#CHs;iz|7z>;FZhjF5^TIh=1c%a-# zXh=CMR8>4ao`HGNAe56)n$}h+%0YO&B^(zfc>wr>v!wkuRC{tWKIc(#kyb1A+r7Be zF2&VuGp_aL;`(qdZj2V=)@UZSM@@}Oj6Eq`FV1;L8az^N`X+hNUfCa>kvR>aJUpER z^~}X;V+4TS2HY+BZ{eqKocoNXuj47~l={1{ta*!V?4mu5k(KGgsFy}j*BF?Df1(i~ zNM!H1Pwa#FC${`fD-8UItnMFteB@j}NZB6{yh5w}5fUmfgoODbkG{rTGzFaxC2^Cxkp88- zK3C09j4QVK_co-8-3H!|hPfNOZEQ z6M>Nqyd^V-OG+ELO$ByV_(?b3*%5OTimdJmWNE;X1ClQGySYt(-)TQ176(1RWSJ(R zNF%p_?J{ZeY&y-tq^~*I!j9>=4U;fMUEN0+9qtJL@4-Fz1p<#6$(q3fM)4T#5+=Ki z!yb)PyfaWcYEEOq9Uz_uES~IFILYn-oP`jKCLtU|uEpeRrj~c5ZGoJ^;lr2xV4Eu1 zcnCRQ(0pDUcDM=>l3%$lMhty!+xy{s?dk6<93~85O?Bpk_ zCtgp$Fu3xE8B}-}ei%TP!&(>0N6fW3l*5@=u5{wD+gqL3 z7X#btj-u1=YVFIdhIK9AmSawf|A+2B>)SAsCSN73gOzWmgHUJ?d;18qVDHdc12-^y zFn@dR-h9IgEyL;TQ*fFEbEstnKZENv}@CXK;#o5eE!vcqurL{oLcXMMazVziU z#+SbIg}C_E+sYj{7Ny!k#LS{NQQ>OTH{!iL=}^6S1cS0%vA%+iOQS9}V|nS#{mr*;gC( zV_|VV+FdcL{XsMuXf0HtBb-fF(}D9H#h(&mJ=>g(o&9aqQ44P2j73jR?cXRCtZWn3 z>Ol2xiYe8?%Ugi8(8Ny*Ug!>7`&LUW5?DO4Ettzbx@`T^!Z^`eNsDmNq-dIpGXTzy zavLiDUVCWmKLUH<2~DyM5fh;^z}9Ht)AXN+z5wW0?SI<9SQ#mSYq7^%N)Z*IrZ%JG=?q3avU6z##OSeRdmW2=o= zU!DpzWgI_oIzI4$=i>1vp0;rI@|7#`&2N4)xO8A?WhLfkXMJ|sj`{-Ib`b!ep>+S* zvvKymv$3+e>}vj90AU4MbKrFHoW5H(Z^ny1`jO~$&cc^R9y#wY3HR>>w&Ic&i+%d! zq%aX+@iiIu==)J19c~A{bm@|XItXYG`khr>5%h3b2sf#srG?fZLQK-UcI`@BzVuG) z@Ac!&E3NqHPd8#0jjZxQ8jsXlNBU*U8H>6hXPs(1+1l^LAHQ3TgXVFK6)RDys&Cfj zM2dQ9jNK|P7l2e)s3;}T0!r718qfF&ZdznafeazROpf_6;HU=!I9h+`a{?@Qz>P;? ze-^&(5DYq4%9w9NPL&^=2xpT%fOC<)`c_G9*7jpQAiUj#Ed+iRG7PO%jJ6aSM4S_A z0fNSoLoR>f5|Hke%uPCeEY(W!=<;4Xb*2;_eCqyq_L-+O7S%nza`ve|5^2oigAQB8 z`9Q?{P*lLMx2Jh$dq=jC1%PvNv$7`yAH~N|d2%Z-bO?1d%G9oNwj=+!nvyc)XNec<}Sg5GfvL+Fg zqx}d<8B&>YS=a_kSvV6h2|m*HUWA_rwuTof!ubyq78^UZA3`y;GRAQ)+iGfQ&rVwv~f-&3n>x};Fg4f_Ei|{q=)cG zDLPFH0Rh=7N*@76&NGEg^n&R!$nLGx)Q_}_yi=V@;#c|>0D?d02jL$dmAabq_d6Qn z+Ea0D$k~5$u`!yB8^eXzJeY}{Q6qXBb3(aOM-?KV4OwUxG9f>BJi^$Iewq3yyq+)F zg3t3MAacvvfTNDy>9hDD5X4`+g61V_#VY41rNDEAk8(Hu^`x|j1J2SPJQq$W_2dHzdFUr--+@lHrH>BOpXH7w z{&0v;Uc;N_4w0g_=_1$z<>_({+(*91!&-fs8`x#Ri} z=4aI>r;&l&5~Ng%bSBdnr(J|}S@ifdn*tKZX+uZmNBvSbt6nx!PRY}eWMD$KxECO& zbndT0C;_mOqWiai6wl2H5I$LyKjTk+Cy^Wod{1U1$ic=y_=)mOnz@dJo8MffoUTer zhrAn1Cg-$ra{5sv4(a5$8^73v8nnmG_?R!y#0N)pK(@VO$*?p(t;JTq-?Yc+h7~w?4eaIPVfaFpij8y5Be$_Gz2rNatyUF>!tJk zC=<;(8lr6zvAwewJ3B3J-yUcoG6L98##D~CZ`SG%5B zT?#H2*=x09UbvsG)uP);w^}dFE~vdYdu$N*pIVDcxAvkD{g_)?i9PkH11-eX5e~Mm zt9xoOKRx3!CD+#)u{b-5*+yCR<#^@;&%{$tKJP8FXeYh(_S^B!yBFiS`k8M>okb8? z7w(5~e7v=Ta+Pe`i zI`RQQeSk6IkX5E=mi}{~MX%?Ej2DqHWW~6iXjKOG_dr3rcLU+o0*2x>!~1FgIvIX= zQW%Rzm?qLo0_F-9IXGgMdxP4N*TSxc$f@I2!5<(tpu zOB%}1$Ixv`xe!P)j?)e~ZJti2?YL;)G5=Y(Av=N|#zh1i2pswFSF5Hi$3WiF3mCrw z-q|imov@RZx2LLroEOMBcxa>H&cnq)8ueUOglrZ>DJ;hlkPl%Pi{UlgSDlT18ueWySF2| z{)O1eKUyr6oiJIjYC&d^mluk>D=wi)1NPt1QKI-H5!Q9T9+eB4d6V9i^lYkm|w>7isE51<#D zdZ;73minpB?nHRcM`LgK#SekKOgBaz$D-h9|(n)l8ES-`7j z5#@pK5I`nS z5D%kq@b;sy2=uV44SE_oIqR71yBwE-CLcT)A47Ws@xt;)akZ679Vg@N+_bdw)BF2V$iU+q@} zut6D$^7=jJrx!cFUqS^Qie$z>c!$a9@lM#n4NtozYvCc#3lsA=2-Jg{%ICI_2d0A- zWpp3M4>uxVEm})%Ss2C+E!R2y-!6{Z&@M8d-;9d_GM)?*?uH4!32QE*!S4Lr2}#@V zc0k)q3X}O|JEp>q%Pc5x;yy*)aB^J%nZ`xoul7iO)K8|zMDyWkYCNcs9!!R; zo{;cM5uH+=bTp!+;h$e8qHtOuGEp!PGsuz@k%*ZR)FbW*t-mbvNIykD#r43LCI^4L zX8`sftObh7Yb^|=YlhI}!%qgQ9dTV~dm&sa!SusGP&YAFrGXYNXtE6DCSGv4-id$l z*!B3x$qg}bdvWd7Zfx!Kd}bZnbEoT-xbO6Rapv@?IDYJS+_-TqE??P*t?jM2dUY$V z-`tFijZH09y3wdn)^y_`+eHx8H5)ZCK0Pho8s1h3GmN0gApGz}oPu{dY^yr-!he6C zZN+TMI*eAA8yQKj8uRlF3-`{QS&w7ut8wZy=R(b@+?9Cw)z`G}e>e7awdfO$$@|pF z;|g;oZd~7pKlzjYIsRY2`)|$QA%Km_si-fm`$kW3$wKWQYGP8^I@?9aCtNPf$WLW# zx6!bh^0|28-_AX*=88T)Lctulh6A02E`tvl~k@S^zd?V_S9vc(b!; zi%{QgEH2Er&Mnn_VNQ!Tm1|3j)`gjROlbki#Tjh3nyELUEsm4L#=`up!?PNnX*8nK z>nn}E!+=KwcC|`9sw%_&uIx1!bj9!VwIDxKdZJB{4tQWe%q1wj4%^JMSXDeO^FVvW zhu3RSMEYoJLR!%Gki`Vtb6JZT)q_PX4`*GmKw?|$rWW8A-@X!iJEApcwwUBCu!FwM z4Hfim#su1h#*>pX6HUX=1Gg7eg&#nCI}uM$5jORaBWY!DoFd#^VIl(y0<}P#I~(g~ zpHxTa8jRxprDB z;+bcjjkEVZ7|od(^_xz-{nneYxw+-@`ex_mVtHjP=4RQpuEm^6yt}of{x-7qEdA=_ z$&+cjrQ&l=;Oy+I`)Xd){{I?GAEGTZLMcDnc`0;Ho!JjUtWTXaQZXJ%vx_v(8oy;$#56KtaE=8;>q`;scK?#q-ZS z>2n(qRzZ_!>hbY{k1Mo2?aLUEE?7v_MFS9RP=w%U3o*7c?qg=5R|W(=n_Ed+yery5 zIG*T>v9F>yY}rK%UVWSPQzi(45DZ%&q_lVtCZ$K?P%)op0U!?_J8IRs)8HK;Ch^z` z>~`GUzWlV3zVJ&Wg*Cv=0XLy?XK1& z9Scv3Gyr%5G%*0`M!I=SO~N+ff`f$Tgb#()4|7d^CryMl6o7b?9lYf-r}7>MCy5hc zyDkwCkdg~I4&{#<@tm_vglkS!Cgr0nY2pArm#+Zw&G{3TaL|qMh+EE2 z59wz+;Q(%XM~+WB(+2nvjrvkD(z1iVf;LP&rp*HXfHfO=SJ)!7Xab>fy7XhDdUX4G zL?>vOS^&rqDk95U!)DwV%*6G;z7#ylS5$-voqU^$d>W`We)%LCq z5~Vb$Cw>pRg?!3@{>tP2D-!{}%9XSN)oaeyy@wFR+kb^KS&e`A zUCzLS1}wl+c&Ha%8#nxuppVwppTmK1-b9!BMI$hQ+Fb8YAHN9tOi40fUl7>w&aJ(4 zAq0FD%*l?Bj_tniX+8QOT6>^Z{_s5Bw(D@^=!uU;Fv!_{KEKcIX!!At&>I0`(VvwU z<)XYUlzyy9=Q7K|Ui#5wL2V4K?Cm-waO4S)JHf%xd*G-W0q+)W5^_F&8&Fy%LV?Z6 zv?t0-z3?ik<$4i*(lkui?{LrIWR;QP*(14S9N7XTFP<8eUkZE(UoawimY4nPaJKB-WGj2zwzyOSx>Kyd2!)CW@B z+mMpuCx1BPmq3^~4+l!FrbnO%mnu*^1)boOfgr{U>C1z0b{qw}EDWeHJN9z~JqY$F zne47VZt};EaDHd*lBqb>M8xTy0Pr5%gI^?|yE7n6z<7Z1o8T^CCf)Lg;q3!CTw%v> zICQUssaHPq$VFqR~WR!<5wCR>%G_)wE{3xajwy6>&rW+~(0wYSP_}gu9 zC)4rd>3;mP3vb4wE7yFZ>8%|t#yUMS-HQwJ@zBE$#p#o$#mMyH%B5@Z_Qfl4@ttcv zGpygy(`#wbHWiJTdaN!lC80;P7L8_2V?0cFV%lJor@2f-xwA-MA~5r>f#36mCJf5W zLE;FUhGJaJP*X3(8uYqaz;$ACb0@Y`_MM%**xeucoRw;AHddDw;`FJdc=ECHaqjFX zFA6VTy%HPOZpNi6m&AM>#N7OR+;{r^SXo_&Z~e`;;*bC23-Om<|Ef|Kl-IP#Uy5>L zF=pqegBUs%YGR`2>M*Lc*lTrTPMq$H>e?25;P4u=2;78IF@I=j%r>ZFDRx@DSe~CT zbGx~<9}9D}sMR@-udfB;DC$}?_EkqN$Czs>PPrO8ySuTxq&Q-CxA%xMBRq+z)FOg& z|C%!k(bmEe&9TM#+1T43DD2SX>2`-=Ol4QSM=BRvq}i^^!mqVY8?jBaZcVkSaE>+< z=Ss1#@`WU-0~!&mbxZ8ml~2d3pyqQUF?qTOLT=9gBY-P#lWMsaLqDfYTr zq>grDWu_eatsN~GYTlOKoI$g-5i9d*XOYazLL<(cJQe58Jsb}_^q~4{+HQOE=7ulu zxN&2{8n9>xA|PSwB*H%W9%nKlOkoV!7TwV{oUPR`{R|zRv;5e?n}s0sDf%vcn7n6U z35#0#GW`}|4*pq4f<_<07c{X*2S3VzMk8q;)I+O_w9xP(JVGAA;f@C2@e?P;i+(PI zKPQwdyn_Ep%CLn@sUD ztrY~vEAeF_i@Ou#=w}i#p=LPhe>Wfw;V3}yiiO3F3{P9Q;76GYp`g1L?^+1k0XiqH z1r9}g?DSLOVkY%oxeM0_6c`JAo|qotG6wrm>TX9M0Ax!r?WQc28iP33*pKrkhVj8C z&&JbFUx>BUb+>V*6$H@@%^}B*ty{R41Ur;7ovDYQ8#B`eTfU(qXfgxg88dHb+~q@1 zi<_RyZ2#@4YJBiO05~IB%=0jFCc>dKH(5xeM4&gc!Pr__uAn8zxrB+Xp-;5?5VAA= z@llI%0nqe7ejLM)xd)nM+Lt=*aj7;AMJ|Hc^3FOZ_$a#Zk0z!WX zH_({kf{+8z^R(!^tT7xRBWXE3CFr@=G@9y2!{X=pSov6ZrN{HI<|+K~Lr6g!J}%;i z9bp%7Nf^N(Cc->whhIexVZoi}Z2|FUKk5Z9VC_En7oLvmkn%T{#(kRK@0RpB~RO687UV80Tc#_l>2nb*L%hY`DK5IcBVbnKmm)k&n*TO-W z3d60zoH1P%of3ZvVW9HksM9H#@DSCqOoV?L@AyFJ3qj~7DsDsX(|l+Y4!tc{ZpNqR z3*NdS`h|v(6Ik#qG+X13IzkWF)jk$DgHzn~;*$eHLbmx1co#aj$(Jp=pcDZg{eW%0 z-Xd(FV4@XJhj1C5*7~9P&%!zX@NcVl9pzS;1XuKRo?)K9A(Rhss+o}>$hadHYrI@z?F9^zwqLX$i1_~;Yb|ZvELp;t$~Ogf3;b9C$7RVHW0rEpNhlWa8Ceu5AMM)5afaA2;AZPK4G#u z24l~7faL-7?k^LVaD{aAoiK8su_6#U{pK~X!sofc*bLv9pcS{P@~oQ_8yyDuJp{1Gvw(-ul_UfR{G*M0NuiM8W#=KeE6=P3Tozxg-u`9Jzk zsmxp)B3zXl3o%t))WWJBYwJrs--a{#=Bm?CY1GBcDOytM$0G+lhslDJ@vpw%qd9ac(spC?FS~%rDM~1j^p_yEI={{8H?+yD{IWs;*ON zAGMj7?AdxFT3S4?9cE#EF7{h$GvN;*Qx9RK78BgkTP|0vU4>u}t;zk4@>Du(_2qIA z6<2uX5|NRfp)U&=3ZtVz(neux+@QyzZ8Zrs}QXkWM7H)e|$AL*b^`P_)2x%rDy%Wx~3*qWfIG;g=zgymk%AkMT zekHCK1tjZ^B)4&ZBj9u~^A;omh>N z>nGy=a}UP)`mvbtxr8MPEYPI8aYOy&+BNqF&NidpB0Qm72vm3wc%a$DA{@aTV;A9v zq7@cOSyK;pgdqqP@dJ@8=IDR41Mx|hck&?&?tEMz4QQ0{fU*&ma0mktJR;OVSP1O5 z_G0_iX56}U({#4KuecgZZrFpP z`Aw_OwpETVfA6)}E-goS{fRhitj1woG>)KqnoES#s8jRqe|$tyL#aec1nn!5l)tFX z_k%!3C5=s{Jpg*jRyv*RknDS*2s8%XGc8Wqe-@;~P4-8lXTXhqRm@}VN>~b$Ex;CH z;J`|lgzTpu+7~~Kan>%fPyr30o~9h^JT0w`_4IglH9l?!H`a5(4qL4enyl7)advh; z9zRuy4?Oi?JpSaPv9_`(bXR=_C3JyM4=qs6orD$`e{zMO6$EY2jkgUq(ha??vmnj0 zrPyor)NeYmwYe9)VJ9kRDi6|GsC-~*HfJql>EVZ)e*kOKi5ABzx3G3R+Q1pgX)5$2I1!YJlN zvPTR$sKOd&_==yDg3!{e5Y8}Y2;vI3-&>zCgVbWyt028q{DLj0;Nl%MPtRO(5K zU3rtI?bK7_qUKWg9<=_@4C9yqE=(JUe%qQmhux0oQhbrR&F*0%ZVsEVffnEh0pNVx zE_^}C`j$1hns<`s_T^cL`6J7(g2iQLnCJcA{2y&n?e&1cez3L zVx5FP+0_R*QpPJ)jQ(SRpiJN1Z`Tw)wQ7n0DvTDw z=@I(nfGIi^YV1}B>Co;&p?RpW6SNLT;z&Xy|Rh zPA{Ps?LQ0H$+swBDy_=reu>?lcCrwfI{FI|j{Kw;Hb`jfUc|E*@mOVX;v_+6pfi2ga(Gj3c6?pA-gbF2@*$0;eswBQL@!edDKylgr@#i8bR~kLyI; zi@Dowlkc*-T$nheah!gW(!~us|Mvud_uwA<0s-BfL7*52fb0a=#DS4x5{f_`go;-W z%sHIw*^fcSgYRS-g+Jf{tgsto*MOKAMGvfb@JtDg$1Rx7#Pl*ai=o8Sr0nt3gJp_~ zppLD)FnE0N^mYygLNAy|i2+xPn8PWKnaosPe?bxR#m%pt1g5meFq0=wwn!+BSbK+b z#;i~`+VL+wG9Uk!|ILYLOl`&Q|Iz;(Kl;fb3pgX2c5@&c#D#kHrT+_<>knScsQieKp>>c+uN&mzNjf z;fKy^ac~%4{NkU*zx&;P=Nm&K*nSB9C|o_t&83*G%|@fvP@IMszA2yJ*r=;*%2kzH zOugzh+o%a&2eH%X#`1i_0>B$L_mpp4Wz`}V4Zx{`sLwU55ik<-jlc&=;qr*JB?N3! zzPWdHrUv;$Px!1U2F?TA*@vUqcJjuG)ufEi-IG75CohXo1XEd(}tFB`sbKh2w@8b`~=ue>mOQY{#`5 zw_8)BF#@t*}^r1Gc9>k33kxOD$*H+`q>HAfd<(QwJi@Es)RX5eMtHmhW%n``# z@9z2HmOYs)s(smx`sJMH&00yS8}wIKKL9@ni)rqBb{Gq7H;3B80uHqk;{Y00^mzn= zXh@+oWsSrc*-4kwG>#!a+1uT#QXd+|-X64%#-TFP zqJO$PZMtVm`cw(wdQYUlIK#&m(WvN%W@pithjz|O{PK%eqg!8(m|c$Y+?hCN&dXCY zhMW4Xh&0NLS&hfgjLL~XQ2r$?Y&kEKpbS2|112Tr95S1nTkznObbc-nCbi9-_DMM6 zMs|AW2KK_lsyr#mIGJ$(f!%4m^y(YsEih1|)Tr`LW4z}X3jul8TxQKbJz21T(4gPe zbjJ2y&i~tqQg_pS2uDg4+CgKOl3uHI;=cJ-JaMKO&pr1@oPX$?h1Y1X?QuDf%7_3s zY4_>!s00IDnV1VgOG{!ltAQ!qr$iv*buYR?$*@^A#eTCsT1U|NC?5n6*MK7j7 zgt$TimmGj2=AWVJm;_L2cclZJ@<5`v;fDYaI`xghA|{`~r$2;#^eOrcVJT0m-EvvI z&5=Lcg#(Vja6AQ~9-a^NNBt1`5f_185_o{>fyRWs#`&btj}{;T7;eyK-s3|MWpR2$ zP}AYhMPSyZ@&Zfl{!#lW?=0v85O!t2j#iV;MU0HS%FE}7B0XsvZn ziOmrLKs}>b-vEsE-_~K%g2Dcw@JiX0uQ93g-y;NM;GkI@3!I}2I)g)cT9jC+}&LGH}a zpb5U%LTb>#$8`Z(c(jYdD3EF+l$7PpLpU`32q!;{eQ5FdvJV7*!m~B{6qhj83?xm> zJA_Z?`6&(MoXSHf1r$JKbXmOyA^*ZpHaXr7JDwBdhF?)%w=q`2*{SfOqV7j}chu|; z$N}V$e|B_P6rNW*%K{>DJ{g?WB)rGry)c=E^DH3e1su%>PnW59CEU>K{-Zg#0L>#A;@XCjPJ3xMJhQb7r;zx>>GAM9736zcYngqfScbr9z zR3whO+t`i?QYMBpelb4EoQRr!vKw_EOma%Jgk>U(;|NTDj+7wd-QiPzgpSA6u)81& z?-COvd*P0duZWvWJ=qP@;R-)J9#;uNdU)X`e_r9a?g;?z!9Dne0=m0LmfJ8nM%l~` z*%2t*?ifUmhSR&9iu64YPuPnI0FxMI_!y8p>N9D|Urze>_~q;zCPi~p{n?Fyj(=IL z6~Z7aHxF)1z@!JWFXOPpLQ0Dl&Lv6`F()RrNe0_Cl%~q*JX!FdtxRme_py(CA~rW~YC(K0-nn!$ zZr<9Ajhk1^&>cT{JeHSMqd7aLG|~D()2$M_tzPWyAH>FXIww$UlESmSb!b5!Uv(>5 z?P0R$@fIUhpT!#*5n|C?=Cn`}Gi4?|*8>I%%?vSDd_h+{Zl2{FKo)kRVOh*`DSCq` zZ&_SlX~cb}7JY$6wO&b0qtrg1|~2Th{8v$8MQ{!+ji4J zVk%aa*%mpB{k?$&g$S*7w!1MuBc`~q6nk5HT7({Wn;U{t7L#lb1~+H`ve*R&ySsa; zPu+snec=}^i)wA!!Xp^+xtY0WE4(ll^_f}Y2SE#4ebFFgOKx+v<^|X8p6ZU~Vx=1U zy-rlsCz`cJI^$5Z#^M~|WKYa~6AdS|RcF5wJKa&V)y_9I_hVTGR06m;id$#s`Y0c6?O*DQp=9*mk(%0f-7>n~Orulif zRn?gnW-3vyi}u*E-$)uuT)ML`zZfg4D>0)qmll_N2IMRP87<7|pGN^K@UeoiAYGQA zu}1xEntm-*TJRtgB}TOX;hzOH!V$J)vK@0zIN&DLj_TR(9f-EE4=otqZ!27T6dPL| zg&W2|bldJKXBL{AQK@l}^PCXgc-)hV7n1%%NTIOGA7Ldx`4|t)>k8g^_gZ}8^=mPx zu0?6_Y#h$4MKl(bzUaR)7p1DkVa`ZJo7E@UH{I_|yGpmD{$hZ1RVK5?lmjxN+7neb zkgxp|?jHi2(Gei&$$ZI^_iO^#i*TNo+(&Q|?t~-S)nIKY+2!Ul#t6q4s8z80tTl!5 zcEWyf0Z1!KY%A>T%g!ypJ5l0BU_MkG2#*>g83Sf2!&tAkv!M_gUaiR!Ir4az${@9T60|=Mukm|zY zI0EOVaJXd?Kj?N`j?9M$u%`#1RKh$-`2rBe5fups(jxbq7Wm-Z0)iq8fWNo>vdvd* z&PS6${~&s5uR)LTi}U}I0GHeP2O5hMGoY*b*!pumfRQ`S2l;w&G0VitON4Q;X;gZ9p`BWyeqNXt7S~ zoo^-%^mIGSgUFc}dz@@}i#?5y(nJ^3@n(j@j9!;!d0 zlA8?72b3d`6DWL+IvJUE_J_grR(KtWZ(J940%Y$Z!L(+hEs}FFxQv@F0o3N6aR)fN zoc&~YwMnKyr|mS0Cx_4Z0l4X*zxkCp-*hrDRy#f33RAdu7`Z1wWO|rq5^bx$LO(>& zn97GJ@;ofY*OV0DJuB#yIC4}x(lEI?9AWMW0Pn#)_yq%x5XlPgsxiWk;XMuo6!Gk> z9|n<0U@&8_V$j0N@3!c{9aHa%~XP^|z!dDM8|6ndOQCsk*$YNFGCO;-`rIiL~>@a0hY4Wq+tS?tB zP{q5I%FXy+-2dbF#If&3R}Am9Ydc=F!?1nuLm!C`Jo{{X?dxBQ?|tu;*u1q9-R_N; zpPi2r$JS$Ec}a{M4Cv6s-P$X~wXH$yZff4v6D~B=LXvE&W z?3A(2Ig47L^jWy{mB&HswFYr*M>yT-_&hp)YfJIS z*(ELfy0Nvr9Vd^k#O@x#gS}W=k-ejZ<)ABiZK@9C*lq8}$SY19AoGBU6iMhFDpWVsUwACdoBGs4Y8VDgcKMYMz zw4m7PU5aLX(b}{k!Kl}pG7o(YWsRflRMo275oS~?+%`Qcx~Be|xi%9O^(Qa%)yJo` z$U{g1O2HDe-|elhQ4c;khGFnJOH&I)#;6uZLi+$Ke?t{|@s{by1nPURbjzQ2d z5I)m($OF@0I_E5DsmWF2GYmUp2IXO4?X%G2&LWNTo}iB@Wqcso9cl%K;G44wzxkt| z#v3<()O%i1xXW7W_nFj z#M}W=jsl(}QCJN{yfGAE?f~4z5ehi^4%{WnJJN&RnfC;A1$v4D;Kt+uUE{=fMnCpP z581)D{E~ps4XJmTYFpnFj3yw0KRu;>+k!xE0q$<;eMjwukX&u(xdg4YgP5z1Vzt(Z z`&SO*sdFpw0c+$ph#FVxP6GL9!7Hl9a{s{6CE@@+roC-*PD!Y#(V5FYIhD{*U-gnze24PX4h&A*!m_1KkL7amS?1O0__^oN3;iVBW&9GD|!Mb84s+LfyUvR_jEx~*gS9InV+E*|o%P?Jz3R-kMg7upRO`#k~RJ-7$IaNypbtQoQs zW}f-{OhOT8?42zDrryUB3ZVDN3Ejcv>7cj$tnRJB$X`cD9%jnIy~+5FTqNyjSWx(B z0%rV!i7l5a;=9CDF(`UqXAy#3R<;EDYmXQN`X z2xTW+uNu#<-im*D?ynW)rtkdd_SibN8y|fB`S`$d&&N++dMW<=Yu|_)H#WtT^hvo1JKjZ=KfSeSK{)9y`At^K{?zKzF;lNad%qvt z;M{ChR7bWI4Xi2HQ6+S&2#+5cbm{yfO`wX~$ksNL>_vycct3A#Sec$->#iBUbROuJEqCnS9sa(Rroah^?(&%&Fb9 z)rR=^%<2)og4>Ms&CNKvu;BLF-QHH;?W=z@tdL%q)kbrACi-ea?YTMCa3fl3vnT>) z)lO&BE~vYf`+O=0xK=nL8$})One--G;k^HfW>3-hE8pN%*Yp+I<%J7ZVxYR%R$Hg$ zV!G|N!T839c5?Kb(GX1xHs{o%#tHGEZJ?~K3r)skHu#JKC=aG3C-Sh#M47_4GOcpo z9kQ|CiB~UNiZ49#Txj#Dn0zBbn$16^s)D zZJ0F*tILQX{SC(SSCyg1HTzW$-XW_J@uMWOVn8-y-T(#Qmc|m4f7{U*tjDO!DL|Pa z*9cXf?D(hh>NpCc`F1}}wY%})@kTuU;PH6#qj$%t6RUCT_z{25hIaxoesN`;E9877 zcvXF9VPT2lcisCW-ZmeM(by!OR@AAUu3X#FIN$T>?m?#)OX^Pp$;Q~r!x!FLyP!S- zZB_KphK49|P(+Cr^AT+wQx#1BG*$V?xXURbt~nA;+XE;ffO#p4OXVa;KH{rBV?~?% zlP3a^BNcTr`bTkv9A;N&s590fC`fq#;!}T4kZ|H=wJNsoJXm2pQQ|7RD#GX=Jmi5F zN-3%y#lIDKVgL(baXOGPp(pN^@mVV=zk8Q~>h+KiV*U z%9=Qg#f;}XD5kBECBn#R_Bq0^^+Sf0rVI~eaI2Bhq7++xi6ujAa2gz}-6~s(h4-S|a#u$>9(=koD2Rjc zjh;jlKz_@PO?-IDb~`PLANk$(irej|#$llZ*d|O)@o|xnPHl6Ewv4k6)gr3wvcvNCAmW@;XJQ~iV&jJM&EFZ+fZpHTi zCJ(C!AcGWG6(=mhS(tD-ucd_si?AH@EeeY^1ac(dS)@&AGwM@-S{x~yH4w{FZD&QJ zNZO3$X+rU6@I+g2fSqQ{G@9|}@BUJ}!=1 zx zemwX5i}AIuzoL!IOuYM@kHs(i!iS@&iRvp~`-bE=?`vr9dgnXh`mJm67yjJe@yU`n zvZ};W3CIMO$}Q?z_0K!WTEes7X0o)PW#VJu%=>jvoU*Zo1|kdse)6@e&A)i~6s!L7^pE0@cePWW zCgel{Y{kS@d%D=jO7d4SMW8tV6r8J}$N zHcI0eZSTJO@AhVoYb1Vur~c;V=c3(gxvz7gmeYRMu5YLr(B?%!k#Q1=an%J$nW{9^ zb~&Y*MJ*yM(vnQ}ijI?|Bbr{Hz9FRQiSdUkmh?leeVT_7xpi|rzWL%S@#5Lb5i_gN zSUeG<%JGV{kH+DFu>RJZ=RFa1Qe>e43w*?3O#S^*ST*vKVX_a6yJIRBPa{|d^s z0^$b%n$iyfwr2}a%!Fv+N41o03}o^OIT|p-n9b5i98mE$T$Qa5k>(%*M^(eB9Vwh?}F?*ci=4hb!|+m!%09NC{@UQQ2yInJZ;mRs)H_DH+7{~AX$$xC?1i6cLGq(3^g))ID|IiW__7*f(KluwhaugHf(l zpuwM1EMDw}lsNil@XDv#7(%hx1>)gkk}Q-b@Reb6%E^{YQ^PZhQBQJ;Qw*yD^AXxi7VT4T5xJ1tHmNOUB2hO zhvHM8{B(TwGoO#ES1-lM6G!902kwnicbtkD?cO`RQM~-xNE>Co;CM4umbT;6vFVtb znUCfSS6n$=(bVFOs~$Z4mysW(2OEyOT0_1f?!D(OZ;<@7Tr_L9ZpN|WC*$;855(Pf z-x1eu+*BMsZqbab&8>Lux#zUuyDw(v7UIE&?~O~BF6RQB&5|aCdSwb=;$c(9rqm05 z(pLC1r%q(9NRbnU{e8o_1P98abJdKu_ zZu@J-eQg4`qTA7Cfx7ALOviS&6`Q?AY!9bmyFVRW*=!d0QeA(iskq`r`w|bIUgA_A z>2ivT4UrWZsw0&jGG&Y6Pk!2<+VO}yAh$?qtKOhVKEETxvd=n(ZOF8d<%A)pRU0ag zQ40kt^`rLbcnYVTLQ5K)NWo7TI1votqElV-)$C*}cVjNsp;Ou@YvBYb@&WF94V5iv z(;vVo-)N~~`UW4^7eiOQ_sp}*{?56oJxLjPG^ zITANFIx#ofh`IKn_HBImc_$X<=40DeF9*SgS~j}f%3$)<2Lt!W7hhirrP>wny;p+O*Q6KRWh_Q zuDmxF)qJ&ay~X?12C=cZ6I-2zWFGhg)|Km9v9__}d~R%WU6OaHQDixuahi5l8&!&p z^0z|3N@-=m4@@Xm#zoPp@A;j7iqCnZhBnlkGC{e(=@P~{-mA#wmY2};VUusY@N#_a z8_&g6$q|dkBNkR%DgBhsG(}*9qO$RsQgx zZ#pd9iKnf}SV72x5EKe(m-fq8QOM~cl=Pw_4Ye^WU%gY!^S-i<+H$|sle-r)?#raH z6MU=#893?Z(^$e=Ib*j*C)FME1P?{(!zezMvA(_@8yg#nx21S}^$U~?%oVg1B)5I-doZyBG6MON^NgPSt4QjD^K2EL**57AkAxS$CMph+9@}F?3!P@6%Id_r}(%GgyUCE`zvIAsJo%YV&o-l1rQf?6E;H8 zG^{|POf^&}9Zs2bNA2inF5lQ~#-`@%j?DI`Dg1N{My=QpG0TOP#=5rFer-PVHO<#{ zM=^t6`C?kf<`F7m;FQ*txG zrq&|Fn4xf47sNohhWxy{aG;2c2wbn_)SbVqs|ke%Tmy~O1LdDD?P@BD9`EGaneqcn z!Z{(?^_pf%Ve${vuVq*Rb!Bhkm%FF%uEMKroYqTT4@t!Suo*q2-ygQD@EayugrUV~6x#ZR7%7Y38c$Z1>JG|I--v*G^;RocLG?uH#WJ3Z( zl&NWLL!rq4|7V^`SpFmwF={!mjwikGdKOds0!XdnofWcrq;uTu}3hxAJzo*74IK~kB?I@ry20{3iBBc9#uPR#Nlf%(Pw%2&P?ubw#@ za|?}l_|Z4V@ngqhPGQ^Kop|BwRGd41J!axs+;MCeOUvz;L6M`)KkIa^`;ayZbryql zQIA+lOUu5VwawK+Exx%Hb^iSMSUq}FZf*Ki2y5Dqef?|SjI(FY#aF)k#dz?+`?Z-s z_FTN5J^QM7PseZko8Q(Za~OBrd8bcVa8l13wk)u+aOcJ3y*RphBHsW0ACA={N8<98 zOODS53K?9F6!nxghuY9{g5>y-**Li>`8w78$a^F55!$}osQ?e^IV)e_j3Hm55F`1(qH=d`0`U{Nli?okY)^r|*A7!-)aV;8{32V4PaL!#q4 zaqs~GGj1mOiOUK_fE=%0cl_5+Q#o;E)M9GcK|vz*F@}Ud_MCiagL4oaL2`zjPPU zVnauE^Lj9gg|_;q=!C;^9pDhpDaEZ%TIn}r5gyK;c}Na+am0ZRc{78yP>^!1YH}mw ze4qrWbe3JR7>GwWbiyfp(%Rj+99vhOiz{kNub#UV^Q*_>W_K#?Jhr5wZAHJwJM?n% z+Us^=aXu9r>+5-47$tANw-vMV^l$nar}`GOnNmL*3}R+h8y#(gc81-UYtwi6qITC` z%idKv4dv$jXXKf!Gv_0sF(dk+ihvDtTm02$TiRGk22K^Z=%-QCi3eA}8iQ!j7Sx6Y zJAI%0$ufc)8&++!DGK>f*v+)3)dy*HY7ewOiiFTw_VVTS5e1;q5RDZzv@?xw9Cpcf zJ?3d(ij;9<*LA_Bos*7gO%kK6_?#Gf_NBA&xo^A_XU|`W9Tdd#OEO0z=1<6+l>3+> zEGlF4FY0GreT%xM@6k_`HVoY!u+^sN&j6}GRln3J>GE&C#ZRd2>i+@2O$MMGe$aS- zz%&e=@6u_@?GihY)QO?m0ONZ_xX@*omudyrl)0)X1N~7U)mfT;G=_Xspr_zo_~b9_ zO8LsYKuJhL9sY;d!13;@Gy&0;(VEwxrcd!k7A(w?I0O^9~ z1fJi2G0sbl_s|igD$L+j^9Pu>%7gH#OjAIXQHfJ!#kM30L$T&j zy~MSmO@{cmT|Olr05p3NAYam3F4-s($7vJ;uev^{fV;-SWVw@9pQCTW?+ z1fR?abeyzQyHwlddOA4h`Iw7IRFG+ zaqX1Wgfg!^8pPbxFy@jNWAt2WD0?U7Te~qoJ&IYaQ)V^C&Ndq|YTHv< z1Mz@_yb163=V?r}VC2ww!;M8aa$-~-iB7-bxsOBdG66>%09yTdZGcy4DZUNkJZY-N zxsFSoXkWt-^A|Sn)|*b-O248Ql<8wcGe9ATl24KQMX`s?d;12%5+--XZDxFwjwtzd zRo1e1g;!6LEcA8BiV}i0&l-h4@=Mkx*Ce%Uu*ocCP%`Z{A*aLr!}dlT;PR~W6$*{<1!|g;F!oQTSqxz+udLr{6jX|!g3HHagiFhA$Dg!o z+6A>|#IU;IzYnTkc9m1MA4V7lBFi@2{FJhwOmguiz+c1C@AzZL`W@53-)xAFKdp>X z%c(%6`Ci7%i>YN&(it20VmZ9XNm3P{v7aA>Plinb@tk*}*kd$hnJ}849z~C|V7Mx*%1}KBh7;3yq6Dv!cHX6mZzV%#myIXPp1NX%}r|*sV z85T*SID4@X=Ps;ik$E{z9B;(p3SYFH_okkAgpt?$A|V@w6b)EhScrS?yDu(WxDYSD z^ite?_uW?5`6;*L`s`;u8;?EqCM}lx%8IuBihud?rFimPZ;uBad??n}*Tj>}h?c67 z^V*fG@!%u(MN13Ui;rrOOxMZEt^T+`Mtq z8$0lv9LX=^4z$5*YfsPOzv(MiM~<$>@l`fP-FW(2ufgZn*}D;=#%VCP^8eWJCEtTgdpXd;H|zi|uR!SuRYx zg!w?H5Zi>vZ54320>XQAh%DCkOz2_^ix?TTkS|ciIaTeK8L%MnHTPC z_{xGKX=IFNQ!m@RdD>4oC|&0pqhP>p_{z2-3pqr`rd%laxqRSDU3wFbTt!}T!l^OB z*=}$hpE56f)#N$z0 zA{dp|8tm@!9zNQu@~r+)6&3!#hQ>3({RF!dkBgFaC>g!*)A+@PHD7!Uk;WhqQKb1% z7nCX5=n_PI2!n!hZEZ82dHGCy?&+7})w5TXSEWNgn_Z5^!pRuTpNhuP9r?9im9_gR z%69~y?y09zH!29(a+kKqn1VPc^}P`yZ`k0f0Vdr)0Eo*T`~l+K7HDsiQ2nacF>h7H zI2jxYV~cK5cIjolF#^B9r~c>sKj%rROH3S?Uo%GTEcWqhN9r%UWM$sq1Cr<}FU9wRB>u@aILSm=vlj7HUfCG> zx)o@aO-8Z;Rt`b~t&GEj$M!Hwc(E-XP8o7j>3}SYOrrww`1)~?A@hKoa86E>`0=%0 z{lVAm2YF<&^fHFvZ; zuOAz|p=`BNjniGNQ5cuqJ=8xm`o_H09}82xSP0p2FE@4yjxZE~JF%#-8l~Wz#=gbo zj+P(_)0jVRh2T`oVN3S*G;2nNGUZHu+WffwC6{w-Tk{uTSprGRAGXReedJBdlt(`H zqFg4e5Q^A~(^?u18NSZ?h;2|8s8xk}q*c8B7Cz&zq^9T;a0qmW`6}Jb$GBA69tTeJcHdWiBQU;GF zeNaYdT+Rg&lQ}~d6dA@wLjxmNt*lt2FzK1Vld!_^JFaXtP#!=ra*B=#5lU~S;N^uT z0a`eWX5-H3Zv5}>{U2jx?nZQW=Cn|1#CCVf$*(RQiL2MI#w#zq5-Tf<@#rHD$Kv9w z#_8R-aCtgjIlrk*^o=;ass-iZf;KEOUa&F&v9L!7o?f&0U~y|jps+KuGx7DWf5QvP zx!E}@0a31Towq)L=VK$By7N1hv`~iM*|TTk*y?J0{No>wU;g8NA}(Dzr+8Y-iTCp_ zyci$;i64)pBS$3Tk`~*2$IYuenhad-?9;h2yd5`h-gH`<+uQM`H$CL?;L0SlEa=a? z@=E;ZkN;SlzVme4x_MoTM~YR8Kgr^+)oFvjIKL2goaBQiJMrvy&c@fCJr_+a*6%uX zEbhGP&Uoxi_s7MH=i}e})+giYjqCC5cfH*w7cZQ@6feDaCLVwM?)b<@{z!cBlTXL3 zOIr~tW6CELV@%jePloDr8rZt~PVp zkn5S84joO)Kb=>dtt3Q=={#E^(ejmB(OM+&Yc2?_+F&CfxpU#5K>0bbXZcBoFw(@3 zJ7mP|G|Ws<=@Pc~NoGsahN>0a&UP#;a8;Og-;IS?6tx#CW8>O9I z%(UmUk>d28+P%t+#W($AW`?h^qM$%orwyX|_RtC)-sOdOoL13hw2A!97|^$rfhH#j zcXGU&ZZa;=Hc<9(`bK%8*r+?D=MzP=9ohjWP}KLV7!;Z@fe_a-?ZbcJhXMZR4{cfD zes8MCC|6z?KwAh<`_x6Z~Fzw=65xOmGa#U!}OR{e2yDPsOq#KMVa z%yH^(C8ABabJCCcRbAnxPU^{96h$ZisXywUO{~%!FK}ha;rev76NpU)fNFm~fX<8s zKWLoWK^;)W14{uHw9M_&VZNyWcH@-o4V_9DOUB+p<{#RvopM`aAw!!-0f=&svZo!X z-mDBn@kbc%KJ`aKP!wu>bYFErie6~A40D6uSNlQ<*zIw8PklrDI0;Js=T#Q8y`fLR z#>`AY`Mo_fX9 z^2e?;jEUKPlBZHN52tVLNynH(+LR&6zkJ^=<(nU3v45C#3NZH}7q3Y1J0A5n==EZ= z+mEfzmcPp1=?z~&&9ru(vcvDie>C({;AW9}lS z|EdzurvrEFo{>F=BCrK6Vz#yG=aVhrG<!{__>{f zpD^P(oG>MiV>50`cr(u#!XNxAPzFVQ*Y!l97I|`ngr5r6`3I7l@mVk#R)hD2m#~U+ zI=JB}%RjXrR6`#qIOsHHIZo|E=8^Ma(g;VNB8)Y*`>gz?hkuDHdmP83+-JTXPrUWX z*xFk6CgtYMUYx(U9XD=t6h0mEb10H1*DN1kyigbJ*=L@OAN|ok6tBK|HC}t|T-3Oi#6xZxohuF~2wyr%x`cET)vF zGx6LD7i0D4Vw^a7EFOIDbli8}o$>XrJRQIF@lVI>>~#FX&;OjC+Q0DJORBEj_}~88 zPsgn*gZTDSFGQ@&C?!pdZX-4*CuXALzU> zkWA3Cc|=CiqRc5LXszgzTY*!Khw@u#dQ5;$Hgdv`Osd_v4ywGSMJ~BXPwg$60A;E2 zMN!Gdo3wd18mCB6LZRU5+>FiZ=i|!D&&H+8SK{K0?HCT!cITF~*&M~GV=HQZ+URK$ z*q)iUqK>3cZgjbxCLXhM?dbKWHC_R*pp7OUKxk+~ijuMsJ6r{xZTq^FcAq{4H5?)t zC;!M-Q)2;&If?9(SCW}4ot$t~8{^a=n;}kB4R=r`rc#GZHz$wXl!bBsRlh}5U|bmo zX_@@eR=`2#q7@eY40pV5lMe~`U7zxEBcA$WLw@7dT0H;ih4|99&&IPaU5Z;99i<=w z>VfiCSx(I_$B1|REpY8uW^OgxI0|bk{7^X0sD5cHvQ-9FP0(JcAJxB~%)1!~k5J?R zIb=LO$!R}8ST#Q=9HeKA%fj1(+uU z%r#!Le%PgP!74k~E$vNijNNK8v=h<$!&E*MD0@e9fZAZ5aHlQ7Lolv%q15&Ul9>~$ zeYN-P4hoWiqULEUe<_~qsvbN>C=V#vOtUkR8IBb-Jc$q$V`m_!NcAEgrfIDI~;V5;%qPhas> zVA5Av(NinnCJu^lmy6{=mh3}>Gly`sH|Gq|xGq$j=AUKY@!#=C9|wxVnm6Ksqa1N3 zpW3F4Ay~EIMByi!atCrVpY*t0sTPZJh- zD?Q+HS6S9C5JPJvq3jw45QcJ+GVwcvMGC)szhEl=DkN{xPdT8ovQISBKW^d>mhD%3 zWb)%AsT8d8F$SV+oN4oQ^zcb*Ue(aq?#k}Prq)Q?T~4QV{YnN-v+fT2F+Jk_m%UhM z3}dO$m(lu6_QDhfMPEM_ecDfEiYvgPnc9toq8OZ)d%l&Y2RRiutNt`A|LpY03c)$s zjhNF!#Or~%DvZn+WhH?;)Ul!VO@0bW$P!LGS!z=r8zJxEr=F!>F0(tm`@nqRUuZ3Z3}pb|Ckz7**|pqoJDQmILtPW)!6@gn#`RE4Z4>0*^#~pt zBc~@|L6u!$ISy4C;T-3HZ9xwBvEhR~NqZ1)z6VXgmvwG}aFb>n|9}CoUWb=~RdFV+ zAP&+x3?r!Jw9k}a(@|!!$8^{jq5V_*4#!JhVhxL3>2dFc*}Y5uBwY5m{EHEu@z-l8 z^OZpk^P^7{JPpiY&}10A-F}RhO|u~#(H|-R58)8raNrRjos*z3!DbBmJbU2Dgs?i; zRJaXa1|H)ldF5g?@q+5~Vu6K$v0}{zA{Pt{eO4-PT0v>%lT21tOpdblP4KzMwZec6 zfCpHGdy-`VLwwne!vxD>pC}Bx^YQ-Kr{m}D`t2Ark0^LXn~iR)uiuIzM~-?k@U3rs z+Y8Z0A9*BJkE|%-bi8)CAD1t!#nI(!v9i#%Vt{115(EEykvfSK5hXV#4R)0#U(CI5 zaXpSKYm=k}aeH)V`><$ys{R{D=Wck>(Ft` zEiQNge8=fKVr69^wz_MvFgI_d;_B+6(ncZKP?$FFl7li}!A;rL6B=~`wXwbyubsUb zKm36w6=zXA23qWEvQXMLu3gvOel|{>J{8N0EdDw9q4*Ny%B9Qk$it6#W7txjDYyAK z-gP$}3-fbv=cyIB2l3Ufy%6UwT#ZvFPsXVeN8(M7J)*_*D1PHNelNcL+_&P%C*L0L zeeZkYnQuNDub#aSzwk>>#{1v@miX=e&(on5xzbWSF-gkM{Hy>$;pVodys zYzwq(`KfaGy{ICbI-xyiL+JJbo{Dn>Q7C_@P*j_mnvD@3=V);{k5ggI7_~UrS57>M z&I%9OCLbX&A6a}5VaO>Plpn~8!b=+@ZS0U?MES$RJ8=Ee?%4q2>rzXW=gi?_@R5{YWkg3sJR8-1X2-h=hhYxK?CiRVxHio_ROL6Vo zOL6|}%W>|)g*bEZx;CGq*zPsdw-ul3(3fm1|o9Cq9ben5gY=P8&wArM+_=Kr8r)=`4)pm!&E!j==BTg~F zRQ#21aGa3ggixNw%(BKsIk-ODuestS-lW4gr}iL8UGltB%U>7O_`{cd`9kuITU+t` znTzp-XJ3hDUcMX`FW-tTZ4Ns66MU)j_M+eSH(Iz;?eMtFQMK=-RQ}O7s8dce^S(do zj((v!u)>x)p&iPm%^PRF)Uj-YBdwYb0IT#_yZ=ML4dXU&J3PB~&|L4bEC?|HlW{0s zdB+$#QfNDwgK*KOMd-Ncp~pCiT&6o1gzW_;+$ z<~lG6Liy=SFr!bpO*jSBJ!8Dul+x;SyV2d#v7^R@e9Q$5M?P?zTb&he{T zZJJ(F<3kHr5vV`L2+w88Z(*$_$92Y$>~ca7I){7Iu#(fK)zsE~nim?bZmUUZG*5bu zMRF^Q{L}9!U6+x^Eb+2TnI_`<^sdKn)*G1~mFq9GmN>+vO}J0U&nZBkOmve&z6pkc z@%7(A@3MriZ;JPTdmDaA-Kb&mVD$ZAa7pM9$*X+f@H1GP8zqu0&8iSWw!#w$?xd{AR z^kROxFSDZ+q3kB_4HSn=8oSA`9E=6fP>2Q^2Yzh)jHApn3TNzu4&ENKWSB$kButIkYv3~8 zqPUgc^RtO)^w{`I{gw3qeEt4m{rN$iaY>hJ25^|d${B?OKJ*QcnJtu8PD1<&mHZiQ za2c2&{RZ67V3eLgIFZ#h=Cy&sndOX|_%kh*%Z|9%l_yZ$*y4jV4g;!Nc5#mLMtT!} z{AYZ@q#K9*qN`<7eEmM9iPebe3JM3(5{-AbysG!%Mp3G(5L~gGZ@P zN96~T^jT&FhmAb@a9D-5@^E?}D!$M%=MmRDd`d9!v{As@HG$hQ?IiMPBhss zMQNLUPQ09p5)a=RN8oV6;GND?)H7ZJ6X_C9$U_C-AsoUR5*Q2)Kp7u$q#b(>Kp9{F zTL)+ybplrhK7#_8oIC;KkTj+@8Th1Uz+@54DJBMAaNhVZ02;4<79Z6txeCBc*C)`tUEP%t4I7UsFz>4=Hgpj zS;}J61a63ByJ@>>rpL|O^^UO2xJ0JU)KYsGz4}Un;H`e2s zr=N@a?mr&C`X@gaAOGDKqH{y#d1MZ$W6GzEmgUqY!6y+^I-E*l(@a%!C6V&36K{J_ zqHt!b*S1pIy^hjp@wB=Hoe2{@fK&~F?PpN###fbrVDI>~*aPo=Y*8(XQ zr9m9>E?y3+HcY+w5D&K?;mo^)nHTL&IQI)|;iptKlF!$5iAx)yjtIvnu9dRlsXoafSB}ArPan#lkfQu)BkdXW;bHXFuEmXu zuf^p{7vhDNUyTb_F2(hYessFp=&6tKrAhkL;=IaU?5Xb=pYYRWPn$wcH|`Aj-o!R% zkVhLo)idt`oR$pqtCq@Cv0^ybQgOA^97LrygtE@3;xwjBix0{P4Ln6h#tC;j{~s3d*U{^9euEv7zP~@8(t~&Ro12&z-#(-#&9SzV`fU zaq0S2^pp?A#70}`V2dwhK7|smy&O~Xr((o)-&yqw^#^eI#cj%idR2K&&1M}SD`kys zL%m86*BP|3UB8LW_C+-@_T#9AddBhp2dI3@IA|LKx@?%-q?vOjO~sooZDZ;GxI83K z1Mn++OhH(&J#GkW>8Ga6*rj+LS1>36nZK+Ql-oA`q6FkL;80`8kZZs_#p7gPp+#28 znt_u>87br$30!Rw_$44cJp#<@#?uDQ1NeMt`(N!Zx=%asAeIT)VD$X>BvM z6`yuK+sae0%qu{hTe6?fMtN5t<3Iv)P^BS!$aq+Q`Ka0`n=C`2#m;d!=T%^b6dJWUDxWO*Y)eWzc(%P(c(12a`=Xk$EAyLl*@ zZOx}Q)qW`(yy!lsoG)(l(^%z1U)z#M@n}JDQ}I3h1*1XG{)hTdn^x# zVp{;gIE~D!!^ho;!2(dALh&1!S31>-bnpsbLLDBHNc!~(1?jsc!vbCL)p z6(=tK{qKJ={@8!=^Zuf!*1VFj5jSpKi}U9;=2^(i4X@qCzo(_nnvt#0bAyHtKC zC&qV*hf{}IX3DJvvy)`gr^TP~sTlAAMlyj%F3KB|FHA>PVrz{!ATDU*|$~k|K;Sc}lyW)=1CwCeN7i$vK!s?JlO}%?Mm&X$3|sSxTTE8mp7+SG%;Dz=Cld7f=cOWGu}|e zprG?A3K_L7Z)B0nvq zBU-Kjas_&XB1>^boB#^0!J+^V9m*}m@wH7}>W{JwIVdXfN~Lgol(Hagr2)!iB1A6U zQ+Cq#LK{5vlAZEGEXyQ9zqhLPJ#5oKfExg>gaGnMnF;Dg7F_BT}adO1t z8TqH2)CXqgW@2`JK30}jWENtkJs&5Jt4*NDQoo#A&<0rxuK`MM@ocFMIGNjO(*Nds ziWgopGi~()^4L+GFNl^+FNz;dxJc?9MV?YSlArf~qOfo|fI&g#GFEh1E&9FNq0*4N zyx)rrGpD!u8ed5N)@C=Zu5HH6wXN9h4nxg3Is@@T>ENs4V#2jG%0<7FQYwLE=wGwy zYwe@us;}}pt+w6fLpGd%Rh#p*cjzVeG^hVm9##g@c2%Y-S1ahDQNdWD3~wi)G^uYA zwNe*{0E-4z{r@q*Wq1H4aZXEq>K*hCk~Hl~bdFh@eZ|o?b{vxYXiKWg^sA)lr;N9p z?h~y)@PQ(X>%A!T{Doiau53(4M!3GlqQPb~dK#-VUPb?A#P*E{`Talv;9&rD)#lW) z>JKF@<*9%AQCsdAPC-o%V|igJPA>DhhNZaU*nAvYU65H;8=v#LXn9@5+*~tS8s7)~ zQM`6>GhRM-JuY9n<#%HqQQW(a&%_CR+T`s z?K(%I@PoF-$53KiQ>Op$+6$E7#KBK5A9;L(ielx|t>!J-V8M}&`6y21NuQdcFVTHJMySN_QG{* zmy`Mj;_>PO+{0asry6Yem=0fsA84%imv$B2-)$*BQ_)4Cju|wfGn`HZ`*13@<=^h@ z#71W~HoChSe|Mv+_0NE7`^;tPuT!!cn!mXzz;$JDwVMQxmR6BragTe#FQ5u$w>vDsSA?FWcn-fD;rM9Bs^4KyYQHvmv*TPT^zqgdIxWK3ItHj#vBTP6a&8x*=R;0G$M z_-naW@`KR;lFow2aEpcf$WS7r;QN7~gHUM*bJP-VOgj#cHAWVYe~c?Ml^+YfF>mOK z4S%Y&a^ayw7p(x2lFp@r5!T)9mGEw~BWfJX#QW5U?t2b(y>T|xds1>hkZ!W$CG zAaoG+p%2pFFM|t%dZmlCpU4LSY=eI6PQ0dPAdd(=f>w-gR+cdaX_fD~nAp z2-#>8-El>)L67$)nXThvBO4ZrU3?78b#crRDmM=~uxf$W8^+Jf{`+|1)Hh?deZu2t zcWWzpgMQp`>Qub=;)}i(`@n+_#IYksmBdcGeCD;-(IWHsQ8w?hT1c`$$kR>vQg!(y z6iONf^m_6k7sSXRnH7%z)ibZg=Jr;+`@Qdt!FE>*%#IetQ!zWEO*1lTCFfI9Wx`|g zmJevPXq|=+icu6)q{Jx$Er7&#pp7Fh!uE^Am3MDiw6UpIX)s>cBaVv03vtC`@yv#V zj~93&R}?7dL$KKaBtjs#}S23$C)!P$I+w56CHBM-;#{r>Mqx6_HA{n;OhfBcVLj{pAu`H6@JwZY|do;Jmtwu_E7#w-R^Mtrzo zq{a1Uq{X!Bg?!Qu)CMS5loNxFPxqm?Lk}|IL@6iCC`pwgO7)*tXvg4l?xjndC@f0AGmI~t9CX&GjB!V zi0fm#J5Mm+1eem}OTzSH6slIBt3D{9)EyzCWYPaXvh{nM!qKKueSM?TkFGYGo9ZX) zTf?~7(MH()S@BRLIM3uuHhq#ZQ631!?e--a*A)GShYmB#F*UOiqnRUlB9;@AoRXDs z-=j?FOSEyyL}QGve)9l?af{-_re19;4aH$ha5JL}O_Rl4ixyG$DFpvxfZK~~cvslR zza&n997In-^&@AYHCvhuj*3&kqX2Xm8KVMgJy70~XT(z+{Io0F^jX?7Z5CzUaJwi5 zw^iYs^3&L(F+r1s+#8y#)}zt88Kdo+(dgcYQD;r*(dSgw)L(lk8mhxQ4T~a{!WPJC zD*aX~PcJRWUR`X($)ode`sh*|TW!a&mHAj%S&EgVIiDh*o8z?tvvJ{CKVEq4W}H2L zH8wZ4VsXA1cb%MzyN=Dpv13d5;T*MFlq|F<=9;Pm%y+n{FUYP+B51~n0ReMWjfcSv zZm9l((vJsdlo=<*z!8oOkIE0g#(>8pU*-nIRvp!CchafIRX5O3vDoxK=D@1BqOH>P zd<|Ib83mu`dcvqeceJurp^7Vi^JBi(=qj0s!yn-_ug(X3LQ$Yi#Uo_^2mO@1dCVX$ z3S+J$Zf+hWh5QavBrEQ~0mX(EH+V42FSV;>85DYfPX;2Jj88AhU|YaKM_k;FPug#ypeRRZ|pm!b^FG~3V)CKj<^V7z)5< z3}RY+e|nd9L8Ay1PHO^6TB&Qfptk7pE9IjxoMGIDo*2v%ZK+8Y(BmD&U9qewdV!6GWc@ ztw0(#WO#}#Fj28_h-bQK6D2@t+7!M9$>X)9%cbDRvjr-C55@=5R2?OVMzR{Oddetr z7k-H0xQ?b$A}s@U;Y(jPA@K;3Tfvob(&b?Dngk)J6VsU@jh(nDJlQx44fPEw)2;ba z1k)gs45&h%yb7(?H<=D&A#QvbmmlJT$*{x=EQ={ibo>)IgA@JkaFBcq?M zsDF4;F9pb-`Ad`K;X(aO)#VUh^py|Ow4oz81 z;x2!vo% z!#H)vF@KR3rPCviKBA5NoHpqFc;(Ecm~T(T((;m+YJ;xLy2ooL!#i?P;l_IdAAImp z#ovgvwJq_^MHZ(Ha&b%^v`|#|g>%q89J4b6Ez(%PYq6${0?IXjO?pcURtc>&&rbAs z`FgkGulDlwJ3bJ?)ms2LX0_NI40!(xi@q!?(quC=EE@;rW;2>XoamUq8_=i}`PS{b|Sj`Jex}SY18p#r*Gn{1fr)x4s?! z*?;zDo$W^D!xhE;nrK=vYH6d&iMuII0BYmS$tEqrz4?+XEYA7p2KDUtGxIUhCfrR? z<)KPZ{!}NV2~VyL`@|2|;?yS12PF@6hYXU76H?mD^BzI2__E;Ul$sZSDvySh#`ut_ zr~Gi0R5U&rC%TTxb^eG*mHw{UJJ*3Z4dh*kN^n{>`Pj*;c`gq=6kz@+%H|bMc}214 zhRb3-^Go|ugp7xuJZ47}I%zEfTcK7LE?;*Bi`7V@`EBz37J>?nksu30W0D ze68K@GLyYDI~~WCXX1_(P6E!vaoI&B?cQ5B9D7&8Vy=R^#`%V~Q3)p-7c zpT;2OHHi2#s9(a5F<_T5ntrM>%Tsvb#ls6F!PQvs#L^1LVN?(&dlk#=2;P!U@SF0>?J&7vgS$whE-6_mEp+meZ(v+rGA_^J_UXJ5FUw{RkcW7*ZB8KL2AAcQ zJS)wlpH~ui9xFIZm8$}E?e|c22Y!V@uh)+*@2`~UZTDhZHn%6bS_5Ib3?(&6X4W$8 z_NK@kMu-Bd1&F3exB0Hv?*8I4l}5n z#Rpp=+O`mKCk4OND2)=9eiD`K;NmZIX^R$OEWpY>B8#pl0dp+OGD@KDBrn?g9zS?j zDCr2+*kZLE&TewLIjpRo$`)ciRylH(|wV zTFe-606;s=WcXxW(&a0`G$8TLq(xKn=lrUEYO*-|&-g)|$io_^v^DAp8vd}|A8L}0 zgYD3aU-*?D%RowgPy|jiS^xL}aB?}G7~?$HHps8*Sl&Yg;2|8s8xiRCP)IglR6v}o|4CA?|$gYBgXiyC_r482|U zL+`5xWx=D}k;iKfw%%2C({?=kEVA3NJlKf0HNF||Sp8%iIeM2CxQ*EEY-#V+jibko z$7^TL$HvCZc;t~c#lpf|^g6vbf8k;*%(s2o$M4w_FWA=WG+rDlh38**KHm1$C*qlB zUygUat6R&bBuR%3v;t^TZw>319)rhe+Tx&Bu^H#(`&s9Mdu5()SVxvGHE!*PZr?*@y5l>Fyu~6=Gw1Jew@UoJQ1*zh20%>7k zAx@q;8OM$twJcmwE^~}T)K48CoVtu!4Jk`Z+YD9;2Yog zM*N$9{jcLc`D1@9KJt-28Q=N#bMeAUFU0$vd@P=Mu^<2CuYW1xUTtvMM6+>5k!OWk zX-5EMJ-y(KGZUni+Ya*yJC)0btC(H23qB6PDJ4$YaKec;IOIf4+jYnL@O=77ZOo_r zRGvH)ru=;pkc~Qh041St;v9u8RC6=hvAD}Dob%1chta9qh^ zI%pUdXd{%df>E*=FYuT_-Qm_h(P2%WK{1yehdE8?DxrY@@$<)jDo=i(B`#xz!fh*W z<}0sgDBm%tZrPksS{W$AxaUI04-o|+2fHa2l*U1WEue1AlQ@a8-=`SCm3+Vt1)I~T z!U#X+iDC~&;pKb~5tIqVigrLbDh@#|xI){S@d>}t%u4XS%;5czC<4_k{XR?5Mpi49 zI8mlHhceLZPy7hS_6a}XprwCUQAj+}Q(hBUO zvu0Rs6yPq`f5FKu+{jmfIT5%Op*|j(%c6Tr=32xy_AQSmE=T4a6u0A#wWz*0b*uvS zxFv&p%sim`#Y2c-*Fit|hHdHM=PALW-yAs)6Mk(!_k?4mg!DZXcm@I(DK^q>)n|`eF_I#UZQjfXmSJRM;)g_W|g)yJH2Z`}1ea#Gh2uOJ=p64OC6a}RoSNr{-O>M)p$fww*rmHfU6i^gR zAHtWi;McU^uxmM$@CwY=q~)-ZKjQe^qU2d_-dXCe@KQz!cNxi4+DSt>5{Au#M$^eq z&RHg<1Z2a{I00^#m7wAPcmfqi-S)dZwXeRFf4nCdvy8x2RfoNumS4@#AE3Nexv*|gBWP*t z#&FV)TPo96n5^o<=f{8c)WmBB{ppsQ^X7O8KA%SjR29`#$ zzZotVlpJ)Bruf--U=zfQ2-E?{UPd7=3q%8vrg(Yli6qkjl@>1pUhx7f3Vfo;JVhug z7x&P}Ulj{}ItouM!X0@kmiss3vEjGk{U<*evn%&%Q8*pzYiqH!wH5c?b9X%V+;g!r z?8g1~JrGBZuEgfrW?Z~&4}Z*W%dm@ zLYzAFU@R<7#cO9T#{Ku-t+0U%CldQIJ1Rf%?Dbs-U;N@1U3NeBb3doDn2u{#FULRm zC;v3w_3kI*FaMRl60g1XT0HygGx65P9*)hy(fHGU`QzGsD$_IC;HuvI@rY6{o`YHB zqTFD!OqnR0iCCqt&GBqBxC+d>%!1Q@3Q;^?8`b8tq0L9kE@s<7IfufG0_MuG+V*I; zrS#Oc_!!AxU3+Wgn^I>JuQtn9VjFDaTjIePdk!8I4?TBmA zubO=;C8t7D;)iLN8?U^TeQOUHe}W#I=5sr*YHk26oNclApe|V=3^}=0R28d zu5P0UEW%q@#+KB{wx%@ZH+N!Ao|XA#9OYEs%3K^-n2jTgGtt?dj_Vpmu5LABV|ypM zy96i#C)ulWE$TfJb$#eROdC7`DPLXRIYJyXHV*Cex5OSW( z2V&UJpqyj;z!1&@GJpqM;3#j(G*6gmOjNw#u#9hl>?4UMKH!gV$e)#!z#NZ41#pv8 z+VpYe4irTwLy*U(^^r-u%uZtzC-N&#PW{7{zM)_90}$0d{U8f8(83p9sf1*XRy*;- z&6JKfPLH_q<-@~NjSyp3yqcs-eCJ6Zn>1R;OTvKcN>j@c8WecA{b18%S=K<|=JxA0 z46XcD`jP($TI^cZ@WW0eZ00d@L-Lg?cG7SQ10`Rl+lg+socil@qKCWJRTy8e?&UiH z}eumS3Gl}EMZ{B#wQ-HK7jMr7TTd4%~d~Vs1JKLb;cm6PlNu4N+ zL^W@aI-~zkV@z+z15>RgMr~gKUhg%dqvqG$;XI$#Ji?(w%a6k-rn0S-oN8Ee+0;(7 zl*Y8i=_X%>hrhyF@>iLd0!f+lPz>hPa}5*XMY*~TEF|?rJlP&+;FNVS(3*>}30h9_ z4Tf27Jh$`v4(U5$%PGM=auQc_FsA_dQa+~!nUcvbUlrd~o;U?ae3XHG%1t)wKi-?T zqx{kXT}z_#-DNu_z|BB81}(SSPC=8ORN7}=6_{p^qSzIRzs#3o+dxkH|D+r0d<{680?L{tV@z?O;x0`>Bv$Zauahlk2)Hp=( z`jiNcl*VmN4u@B~ekSAAvN0Y%h8B0I06c_4cmo36o)O~!j0cC;c_u*kI??T$K#F@j z(CTL#6?f$a$o51IzJ%dr(+GY{Tj-6`0yvjj2{j!LYH}kJr(*Pvf^L_kh88B?lu8!A z53M;DtJ|02&Ydgq!6UyNtEc$dZ_}sWHrLnVet+TimDt!=i$@=RI2IP?)V>Uv;mt(Vb>DxU4^$}ets^N7MD~^d#4nbtW5)>QYOAy zA}{a%VzJlvLb_|7T$O<~?UCQJ#|Db0=9L#$W&F+}$+M+JH;Zw;hRjJn7R$$vAGd;Y zW_HHck-37xVs>Z9i9_W@8%NS0duLub8}~hUUtGR$B`%!57Vm!F6WYJ#VsxmD?a|d$ zmDiRR_{hUT6?va|_Sv|8<9htrKl5i)#;T*Ot@y|P_@Bh7J5R-b^I!irvA%sPzW$|e z#Dfptp-sTi_}~2XFGifwrj~kE%3dt8X~I95Cn4Qnle4NY?-pV=_6DVc4jyc?lDQ)_9XOF}bUpHiv;QpXZ3Us|& zV!5I^;N&0+MTMa}pf54WvjF785CyKbJMz~;Q4FXZipJrJYXu>;l~<+qSU}-)P3~EV z#E6#kl4vj7Uj1N$gJwJ)z>{>@RFrtmk4laxToqPd_7iTl3`)W~3pUXJn`-4dec1=| zY7`ja!Aox26<@$Sg+mF(286{oUeP-qIPDzeA75JDMVV(mM*QH(X+WP2%r@sM!1(3#_^UB8+jL3O zHnODG;z3(YtwYQo1Saze9E?ue1}c7n^t*!PDP|HTc$>uSMf_!%7Nl@_%3VO2lOO6; z;|1dZ0X~7Oan|g1G)`FQr+Vc<18yEfSOF;8Cw6;^qp`Bby8+d&`@H%RfSW-%3Cfy7Q`|d5NofL8(jP)K3B0GG8-osjs%DG!M<72%L!{ zi|shFG-sv2*0343`c0o~>JCQHR$DweyAyY;wBn83*m0W5^s7d(e zWF38&`EW8W{ye#p_^L>v-%R$W8Ygim&We)Az6|&EOOH7jkNMC|g0>+_=2Yf-f>ZGZ zDYU74MZWCUdwrVu1cka4Q;KLgFp36Eo)mN}hrzAdDDc4ZV1W~Z*naP?dz;aemnTkrA`raRHf_F?t91^qTwuLJ zduwX`Zu=GmisqDyUW!;KzR1&#=2f3`lp(-*lNskrf2=(@Mb}ro`Tc-9?dWRV(c8&) z0`}ELI5o(6mR8|$UTaBKCiJpJAh za;7|rTk;?abSUlUONg2ZI~1+-6XkEf7nmy^#U%U~hVqmmG=1Z&KTs&L`tc_3#icWc_FZR`UnK#HBZkkf|731vCZ!G|T$YU># zq)AXDrD>=%rJm@NW+U%-YTgIXRem*c0ngdA57v#6+${HK#;36=t|U2jkg$WWD^0;U zKR9j^Hug`rT|UH-4bEu&I8LDf>?|~6C^VD&$WNiOv=yzo+#gp^{bQMlF;SQMqgzW4zKWL3VhJ4la>NTIvk|?=*^gTu(;GAoZaF z@DL8+4GMJqGC))S#n|9+;x^$1;XRO5VxZb34ik8toGJ^G7aYin*P?)d%+qOE3=-d` zTZ-F*pKYb%_zn;cZ4`XkMaFDI2S3qy0Ou;8X|#EoUW^mHi_zY^5G5*w_`qfk(uCIIXc7HeWq+CSG{qh4@c@;XjR2r%w5F;J^6i|034bZpMH6>;G5f zZ#q8n>CeVP51rN~^RD<~zxMkP_oDDs+tDJ^?_6R*&jJQz2B&A(EYMh{PCs46ThzVi;_`HeCqCqHsLo_wtJ_Ze3cL79-Dlw z@^SKp)U-Hd;V&Ykqm4Y}rgW^3LoNmJR4_N`sxO6k(XRksJ60WWg0eB#Oob#@{Br_ms4vE(&Zh3y=`wU__&0&+V0-eAs;B1QhVZ>674qoYAGjK z?#>o8Q3;N$e~}mk~gxOu=0u@hWXqAqGamzqk`?6_DLJkwH>fUani0jC5gDY;+D4sS+rnSK; zG)~tk`&7>uuX?bz)Ct@yx@8j0*oGbsfE=(R4(ZY+Q1+qVZmZqmrXA59Xh$gZXsfhK z9=@R5!%aMtf=H!tgz?1hz+}vU&SQ`I9G@qqpyf~HpVA-O{#VW=P%Zl^Cvw;F`9WZ^ ztg1URn$|v;;7eQhUda>|hDkmX>?gr!cvh%!*aZ`cANlCxvPZ@X=u@}}LxIAaWo4hn z8JQ7dhVXu;rwpfwM+5a+e-&7UkAZL>p>OSq*j8=5}&Dd$Q zJ?bpa46Fn^d88G`mRdytIGsvBzQQ`g>GPc1xEfqf1LnNNhZs`P=M(X&N8Bjq>O9GO zRh2DOaRlHdoH?jo4W>M;pb-$qC%1&RTXv0)pR~Z$Iniwz9wj^-{Fn5pY?KRPfg&u& z0MPks3)_8=bxe*$(6NT_c#sJFmpB5%hR+|rLDH>x))DQ2m(%zvez1o zSCXJ?wsKO;t-#ZI!&1rZlYX-ELoQY3RQT2W49FXGrM$u`m4BjDSYI{|cq@)L{zkDp z!yT0G4aG&t$Q5Vs;;k&81Vk~&sllGpQ8}0obQEhN21DYa9HgAdB)QX%_~jlT%OX1) zmITM9lAt9H6T8-cI3dEvvLDxAEzP=s$;M2jZlu?T=ZHw9WPi=4?&ZZ=PB zR85nMr`^U(938DkR+7IMY^?w(|=Q7NJ$~$5U?JxyQiF0`}<9qh6TeCx6)F4H;O-u_yyr zd~n*2g&zyPd>Wp97Se2bP!?K=*Y7)?-!Y`PTmj`{A1tJ~7K}Wk$%2Ka=O`gXl<&$> z7z=rni2(25xpCvBuP0x-detZP9(v@_xaZ!xH6LlgtF-DOpO1NQC6`B(YB+5nZ2FeX@m|M}{WKDa;CvALH#~WozKnrO$X#?S4pmve@rCvyv z_6VN(7M>G-oV+Q@MK2!IrW@L{kF@bnYmhB@*vum*X<@6~3aOQ}OcRAA*NRD>{(#^L zCNHXEo{Z-QL}YW~ko>71jQU(V7BBsev}vE>q~k#KqdIPg|7ftLq(lcl(nU$lS4P#= z)F|=_v=b#i>Ti}!ehQ10lwwRk!Q0@LQ5hsuyGE*h!GzPHjwa+d3jLWfArz#_ugYTL zwD#y_jMIS&kPdil zj`qT`ZKM~sfPCW~=Y4_?V*zPbyT<2Nq-+9{T9} zF4?j|+`|4~K%OVTDAp#lrRGq0F_=-4JfL-?}dS|mexGt4R+JIz4I{a)-@pCP4YI--?+JO6np5hG~voYXf zMN_jet8r|$xf4gG`*CD$H;yh&#me$bEYE4~n{UKCU&o$nYktcs!E-aI5aeV#^IE+E z%v@)?sj*w>^M1CL+9C53x?gz*Fpv0Jq{a%p`c(qA~FaMVJ{`LBUR6MC(DO>pPp$|^>SqZ3iG3d`_aOVjXv!3=rqa|8 z(BwlpZEn?oKOaRH`(LuC~KWWCQzJ!^B%NyN3qgB&~e=gG1Zzso=QG2V=2AR=>vc^#k;*pIW2 zA1VM3;Sk=iP)34-0Ga`$PAoQ)AUp%uzNnMDO1wHSjl&AA@-=#IvC4|ZA$8EwqQirk zCt>12%c7A`24@rDN$>znT*V=-2W=6H$MRq^TALT*ZSAkdn~%O4M^4=@KD%+|%$d0N zt~<5B+>SG^yb|}{f1j`GcDJ_T;+30mWGSBtH?=r~A1~_W>H{w@=fu<}KlRD@D}VVf z$M66C?`wmz5NBUK6Tk8&ekDHp+0S?}$t2rqYe?s+sTO!FtXPB&w9w@g9m*^|$bU`lBe>9_OnUi$`Sctqtuk!S6F;yMR`_yuCp-Eqr{_#*c?rXmQwSEit=%J z=hBtM`OurATnO4N8^tBpgU2|9W3%ujeKsc40q@bddE;g*uPmF_rOTI1_t3)+$G!L7 z<2<3*^kP$+*{LZue{IvSnY(iNiWlgYFP@8gA9`C1wl}m;Pu}Ds7pcP-bo)MS_~}o7 zI^OlJcf|)j_yP0yy-)mJeDj%S;&1$o|8v}R*S+zv-}zWPc<-s0UwR<^_+S5Wj25-w z<%0&Qdp4-v{G!OyB0N79LRy@TTTnfTmeWos{uDNTkDl5R*J1&`1I>y;EhZ^z*>0bl zq+>DF5+7F6+Q9qjZg5pk;cU3U6W85Ao9Es9@?TEgY-|N;yM8xbouqlUpe&!zL4HpD zP}L*F9C6Z88+T3xv0y+kDEUU(BsH{|@$O(qUXf25dKj?*=1MIxsqOf^hf2@Nzk%e@ zt^?kDn1vk(w@cah@1o2pR}sCz;rb^E3oo`UA(y%Hfy>Bg2s(pY%f6gF*Q>pC5*xy$OfnJ5PyW zIQ@qqp6Z)+?knT+)25(-FX28NSn#wJhZB!546{@ZC%vLzYjqB0ZRJb^ZGzr6)nyb&`HTgPyXcb-`#L>_=b(TuFl$9hi_wa0JJ{KQ^ z6p)^I~#vxp;R}@!iarG2Cul4eg z53cy8@~`6)fLsIKj_nR#|3x9#4c=Xc@(Et`p(TnuPWa`?QnfFXehXan*c!S5T&*yi%Cx zDH}q_yA{={ORanqfi)RzG~0AbY0s%Iwbdth2O(dGr=8QskfGrdZ{p;1s2kcKGEwfS z0Ia9@Q1tQOmn+eEU0JdS&rOajGR2o;sChrbVU=-N*YXZQhr>^4dJQNybpB|Y@qR9H^}-Uwl-Auia-F zyhepQJIk&c+P{@ocFQ7w@+nRardXwq*jIvI4@sL)d0-cO={HrGlSViPtCdu==``;Z zJdjs}OFuQs%2&Bim|KVI6#}F4r}D$t&AcjyX^TPG25aPU7&bwbFT9e}r&9G_2tcH5 zw~YD7RGuYn#sMK9j%0Qirn>im5SA4ufpU-rZLIQjni+I^aO4s`K|~y&1Oo>}$gAN8 z;@Atnf}iB0pDI>GGxDmn6)t7W!dK|W;BuE;>vTLG7n-pwaFAW|ZTFr9zNV4mPU4at zzPRCC{F7nW25{A1#d_3-X_?=#moj?C-%xlrOw6qkjo_SfDlf`)Of%|>s_CtCkuIBa}e+jL}dKT zXFeMbKm3r&@LW9f=o3NqXXn~p+?lu1pnQnMwPSdE>XV<0haY-4e*7o?h-4VW$Nufd z;u}vt9e?ld{{2`vx)7iL%u{jyy(eO$e>#5c?>!x{s&bst##S2vw+k_2@tunWrNQQz z1e9sNzldv(Y_4g4+K{L~B!}X18b_!pEmU_|pu>ZWx_RiAa_np4&8C_!0s90L3PlAf z4-MYEhhmVEk?Ie5VyflSh@39l13_`6xe1NKOoBBIliexzJL} zV!@8G4q537lFeWCg_eBztH<;QZS<9AP7_&SgL0u5l$<6;@reRpr1+E-?*`+eB{TC9 zNBP%A-&dkV%bsM{vXwT5$jIr15gzeF(O7|NOLS&;Xbd#i05-zngeINP?0bTVjN}`) zY4qb&VBtlu;jK~#5ACY-8I z%ZZotsNa&VX+@+SE5Z`V=}v-VvM3}dusfZ0TkeVwn2-GAwWf`6^i0#`LuBwSV>!9r zgL2o(o~qnEcRp2%ALG7KaCPjV zY^g)~7xL%7_bcg;0dTv1ar^;bqAvCWjFkvwRMR;~Mi_Dcgip${XBleH_kuCKh{tUU z@xU>rIY2%F*}%e78(kBy!^RLnecC%}#&-I>m4BF2{^i$!QTp}O4?7w*)F%gBjXRwf zaqXY?{_#FQe+?MrU%3+8Ur!pprh)pPO`rr+9dr7V@rrgbZU@w}gmXp8S^6RmzBCHD zEm&!6rQMw8iTRmUEUK?BwuUj^97cP35c6U?uW@~TUg5J%jq$vWqAfG+D~~AuW(Y4z z8a{5tgROcRi}uYQbB`4x%%zg0DgaaQmI|B1XWOg&BKxGk`9Og|Iq!uNr{b7T!Bs!7 z*T1M8`spT~ zWtGj|SrvsUr8MB%)lp9Jg z%6Oo885@OIW|MNuQ+N1Xw{md9VxYd6^`GE6#8#V~W?WU@@d4W=`9#^SaYiV)ka3f%-cT$Ma*w0nid}A}#v1=^1}P!`}`Ww=p^4?Mx<) z{SWm`e>8t&tJ=v*3tt0n_z7%RTA6}Qx!_a$h8k}IDbyY>8T?}qVuI8S2mb^;k~<1* zY%={xWh8b9&h%seEEacMg?y$zY?}D|HV;cAIl9?8ETzXx8ul+ z<(9j)86ll)QQR5|Z^JlWL>46R1dZ&{=F<(1vxc|QU zX(l#b^^#pfL)oYG(sTNecsEQ>*21fGk%T;x%1 zJS}F?4VgC*!t;e+Xi&U4K)~W0Ik*PxFAZz)N*;M;#%7FDk}M*J3S-fD`SO+MY4QH# zyWSBePTZk#(WX^7LvGUKE5~dapLzCM@rQooL(%PRSpn&VCQqzIL(Zen{nJ0~bUyykkH^=aemZ{r@BZyrUOF0|f9iAb_#>y{JC{z!U;FRB8F803 zw@TCR!9p>nO>|!8RbgrY@5PfA9A3a{Gh4r$>%_TI%c&{ekvGeSHbk$@c%8R>T82%! z5P3RISlMpTEcC_4i$0~7@1tbXOxsm@+N}GUrOMAI5UIfSym+w*Rr*}(B*lmz%O$$@4dkeh;3-I|W_ zHcp1}aryIK+pzxqFhRjA5J4rWY&q(pNgIzz#i7e?iaeHZfZYr9P7}F7PK1LX96HlL zAe(gHS^4`nV>v0jU*L5mO_?XoJKGbo|3qh__ z;W*L76;CT^=CU2M=GBMQ$AseqSEDf-yVN0Vrz(9o`3LyKplBFJ%)8L}A%N0A!N|sk zex!K*&;&ALBZFm9zd%ulNXSN6m$KVy0|ZRq{~)lh%xj@m5WiBKW58cwGPwyhmCIzb zgPd;%V<{k>OqZcVR`w6Ms8kYTZZl3^jZdy?eyD5i(=lFH0VoF8>hC_e%mW6LfhhWY z8j$w^q6CyJd}Fv7Bfk$&eYtZz6@Z;J`EMz_d^wmj5QEnWFutMmqu$j%QV}SFBA7No z<+&~qRCNou56BIT;x$p8w3;z1ev9o!%qjZ9)F5W2hiWcEjq@S*R4go@w82dKw70)V zkMc$K{Opt;P|b5fa5k@FqS#?>@%*B8%KVdx5hX2~aluML$;aQA#(h9!3a>Pb1vL() z^1=-;FL_?1E<~G#5NzV0T*euYE;^D3u*Wt?CE!g6i} zO>^;;Pv(~~6Wqw2^Sf3jLNTLA9_U3uIOUVd9nncHVq5V?o{^PyC_>t(-I;L%;pt!u zg-oeHgIi&^#?p}3L|n@$SP%OqD<3t?;CrIbk<$1GHCMte@1LHHOj;P*z*n zt$bMFEqp4nS^Mp^CuC8o6tH}4bbj+CuR?DOGdHkxK+O?78wGCRal>17eIKMt(lmq>T8w^Demq6~u~JdM_-mYrWv7g8 z1Lip)hiMAVPU6WfK%2@_ffZTe;;pE0Sb-vT6(`%F0IR0yI5{qiVUo@OahXGi;sA`9 z*xJiag%bAtpbA(?Ul$F&g@%B-uVn465mV#O48Y;cp0e*gngvt4U{tU2QbKJ_)v_cSU#sw+*Lj~X= z9KstG==%Fco&*mRn6X1<5)Rsb|$V~ zzY$Nq<82n_(!~o}KysCY_Y(26mVuQkG%U&*v3Bcb%rEeDSW-tp#S4#n@#QanCGNTB zzIgMS9*Le7trp*Z+_r4RjhnY(b8|iUHgkc=f|A8A;HR%FwpfVCpYK`ILQ)Gg(~BP; z=V-~{E4W%%@wHvv%}3Gl6y4WXlpu>c6of250V~cV6Yna72T!??Zf<@q78mBd2(25f zTxcTCu4VKh*f!;$Y}E-!K;G+S!E#e3k{g*&dakeEigT~M7H7`98q3Qo@xdSYfER9q zL03i_LoK=o+Khht*;o92sJA@+Kx}XGq&hb_$h5eq&8a5cYuBzR?PsR9g?Z4y%X z8SU_8%q0n|GHPg{tI#QJu945zhS@+<2d&xs06k`^;P6gKd2#+0}=_x^wYVyM2^l=Pl9RExepHF z@e4rJ#Th*5Q{KeWr(D;fn8*Wt8;=!lHJ-pEgsDKR*d_naP}W4W0#9v(lc4H@F+HD( z927g8Ftw6Teona(hZCOEui9~*9>s>Q40R%U>c(vVB?LI7;gf)p-AZ5kkwf7U$g&_P z^azN86E`%7E~m4E-<2(}AH?^7iE-P}fx?(b3Q4QNMA2wgOOn5Sx=bDEl-<`BeaX@Q1!gpF$}(L@8L6 zfP4@{;~O6b>hWb@-UWC|VVlCE2;35nt>g<>(MSDrI<&1iLMcd_LHVnGi%rEzRDX=f zgP!VNW$#mfp*c-sHS^qjTc$N_v)JB=na0r9hIt^@Qd?+g&f>j)?O7BcGA+$L*faQ1 z%#32zN}ZNZrK8+|Zz^x{M4%r!DQ)_ZKNf-_S^$pl8b*Jf);Q%k%l|otJ6w&{$`;XC z!6vAEjkyniE|n|POAP~`^;Vl7bTw@dNK@nO#f83Be1(*I4-cQTYaDSBE*mX48+Vw> zQ|&|pVZ~b!Bsb~O@K9lyn(z_^SSeHu?NCY4ZaoIm4u$aCAaaJ=Y`0(q_M44)*OPuK zOyi)z5N3J-iX{|!oQz|w!n%ibiLd@@ZNdpaD*=7Ym+QW{W?_v4olmT(Pf*t_mGiX5 zFy8T(SA0|H*XHzJX)E(HbMgysMKVgZY(K=YqR(v(MWNz|A14BvYUi{&+B$P1`AQ`k zIjPFARA7ShIIbMFSQjY&R;npH6{e{?gmzHYVF|=bBlD=%?En$0;ii{ z3B)Cu_MmHPyu)dhww%P zy8gt#0MyaI=<(=r04kBf#w-f$cz`bf_`#1i@E8GjCM_lm5A^ce$zoOx;uKOAHg%A* z!q2Q&=;wmOgwQa+D!jo$r8O6;n`dKc^IWV>t;M?*J{I>r`cBa{)b$++{*JL1`Az8UlL z^Ik}y)PncQ@{$*WyuXDF0rFkAc-{+8hG!Ofe6+%YuMI^3E$+-420S??buGb^E#8mR z)FMoaGvQHc@&S$;l4)Z@8#@7;CDLT!Mq#qp<9e}+mV7uZEu45H>+rr8sGOi=!s5%p z*Hs2Ay6?XG?pR%2H9hih-5Ka>QO*fPyG6&-a?)hsj%>UK5!t9m%7z6#@7=j^^JbiV z?X~#f_rE{xy60|R5oSTk!i2BtQa%75LZL1O+Soq(&F{qA!eT5fYGW#(ypV0+(*VQx z%x6C1F9ZL=FaCl*rt+`<^}mT%UVb_L!GHG;Eb|w>^u_qGAAUUk>F>z-f44{l+#Gat#Tm8yV~4w-P%eC1aMOnEj&oy zn;~VaF7A*WIVe^_vXSDDAEd$^B4>%>^(@#4rQqvrpzV`{;+v)_$1VL zxF_Qt0MN*Zj1$3*0nY75zRIHVQ5}yX)bz(R1&l)JmUJ!|HV0PV6y;uPR(X&u+(?_` zhTr9KYL- zge%OsW4sIEnVGa$|P0?Ond?298tMd4Pxt_Psjh0A}!eK5(};eJ3ECrf*)ZLZ2A zzOG(^^oKh)r~++v9pL^&ht)s3S{e)EBX0Gr1}AYDi|DV6?<3y%CqLs3W0+3@s?XEE z$L|N+vJ#LJfFr&PY~|ltH26>m?+)Zju*NaZaVURP|0B&Y(NG&wd-0dcX-icRsPgs$ z4aLgMhFpw`Y7hqfRVq6+>(X3E_eQ@ zyVrs8>dw0#s$y=eRHWStaHAmdLp{bm@g#n7&ieL=Li;I0suUZF#6s+PArNm7%eMN_ zm@iF%KaUwD96ZKO)Sf#G_xLPV%HssesX?x7QmYB%2YLArLm6yy>@vrss(H1S@l0Xh z_9#^4;>}uQs5J&kKOWw(Ch4*6(7K>glz-hW%D#^AR{Hh&(P55#qDHPK)+l^v zhzFcAn#X7hDDqg7@Bq};fKdjbWS%KF%}2a9Ior>S70^=}|LT=t+E0^qB^y5{^lCfd z!y3qMC7H`SWvRKuopn_G&I4Z2 zxLn8S?7?2!NaZ7d^3GocmaLrWQ=sLpd8k){@$cnJG|DGyM3ltF;VyYac}H(g+6*&a zjQp7{G${-1W~4C-zB{8lA(?#PCBLHdh3jj4L^;?IqCcFD-e6=UUw4O($f4w$ijLZ4 zx8D$r@X$CsVjJb4+-e@-uL&ar?G^C4KmgK0*(ZGYL4Kf=pL=4Zo3tmLa_p@)0GP=Q zFUO%?Y5(%n2&y-)+p@wF=k*-n;25i5p&!O4>`H5X#K12)qA1N=1Emi<6e)`+ZIyZ1 z@vww6i9H0Qzp^NfR8UR?7?7d*6=s3VtfY~@j${5cezh?IlgaIgFP+XS&Jxe-TqB^7 zdrZp@0A12fLY3cPqRmi8w99NN3FQRBZ1@=mBuwVP^|}{MI?1Qf$i)~~+mgU*F&dro zLj1Hd8f8{^I*71zCx;RSWQ4R$pZKf`xHzEv6Fb|H`#?#WALz$qxK85s1|x@Qkn*4f4iFl}R~^>Jqq!EP zjgdAc4Ni+O&@t%=kJ7{&Vr>d~Yq5Im>F7)?#JdLnuXyWQACJYA)wpu$f)|;0-E~)d z`&-Y%iQ^~YzWeTp&elfUymc#9mY1Cr3r$~_6@T0)0H1mKY3-X^@$ySA#4rBRFT`D^ z?~1Q}^{ZBJ@uYUTrNt>HX(S2?K$KM%E?tU+Ij#$@#qs0EtdQe+D~o*=c5I}yE-Lxn zk)4CN7kygHO=*KZW#!;hY;UE)4`mmNDKCaahoX(eEs9G;^&ropHuI6EyttMEZC%8% zVC2d3P>aB-R0H4F;+uB_Zf&FR%l8wWIB`5qojR#BX2v{-kIdMX)iprsxzO`dX)PSN zdXs#6D*G$(-1E;_vG~3p{(u($ThZ$c6dyTr6LhZe70>k3I2#>l@zWZ@kEr z-Rt+XupY+eKKnU;Rrrto(Ld^R{?)(ySFyFV6@T+@|IN65?Ych_^7B9S{`j@Oe>J{% zsTYlzj!)b*W>>X(ga*D2m!NcuYi){4?uS?|KMR~^QLzFEDA=@AP zP`EPgvY>r?^WUD=W?q~7X|+FX#CcC7*D(FXP!_|yQ;2KE+PwP%0ZrB4pr;^(A&>Hw z3K{sbSU?WRgHou!A$nv~TBNPE;FE*+oiF9A#^)pvr^+~yL={mcge%`8zUu1ul!VGg z?M;o-d2z!>3B(ECmY7mBY&Mhti*4uM^{-@Ij>zW3Wrzz!hVH?n|2APpG43caXXGIL z1ni3{4}Rz;$>FgNgq&pg-C&#)gw#Q{?Fz0(wKsPT(nMah$400RBXax6HYfd1<`iX(4RuSp;;Emsq1Bk8K-usnOn?lE>%}^9nFn+-;KuQYQ*cC) zT~9t#amU5&%@p|}jPc_(;Cz>mWOD!}k)o?706`P2c)c>NxJmmURJuO^93&qr_Qav?Xw~p~U;tF=K@d z;{hkKnm*CwE4&)3XJ@8jN$xq>?P<+5E(DFG%KNTta@|rJ zIT^@_LFO{}T2Z4ktSHnt$((>md>ZBu=A&xU2C)y;Ikey_4dK*_$5%t0&Ge^n3T5K> zonHlv6N?vI^@S^$9 zZunOW^C@u%bR3PVLOQ*|Gv{mY5GAk7gYrnxG4?4XzSu2{@h(?)>V(QO^N+%b>!_Ne z2dQl8aq3U&E|h!&tp&K|%bJ7t8F#x1_f_Eh&_}LE2C<`fzF{CpU005PR4)%F8zz5Y8pH>ftq2<$vb=aSJCm{6~!cSB9G-j29%QOXZ7PZq?Prx z2a|r>)t@qE{V^6%^FHlqMP|xhX=t0|jc}R|C->k()zeS?5ff~MDyeqJlgBvqtjaQa!H&;1?cc0IuWxT5eKePo9(@mVb*_L4rtw35% zhcaM%5E1doulW069ezx8WQQuYP|UsXF8#{<;6oTZ6ffsc@DM1>-byDzc*C#Km|oyC z0c_FPs~`VoyBw!G4lg__k1;?;fe24Tf=z><6Se^VKmfnv%4zs6yebdJ!7EvcdtA_t zqMvyV*%)#*X3(3!OQ0oe>h9-s&>{xT?yc}&JJUK0+R5ok^CfW4$p%y`n4$5|i_gX}1d zU;U~U3K0*Co{2|SpNmJ|@}w3D{dnf-Z^V1v`<{5=`R8MMYb&07=MQP2+4mJwUpLZ% zt1dK2l6^2&DoAqB(}qd%^Ip5pfBtjvE5Gt5V_|V2&Ye9gdd1VClv6HEMcUll@~Jnj zIPpOZuDGxeVsSLoVi;u|ex8bR1%)+3E~-!vzmdlzc2a{WJ(V=*5o(n!gOEMH#0H`&yLWT3e5ejV&$a z`!PQ^Z{^?}r%rjXOrF??p{V4<5OLWE8pIRXP_}xbRr13ZkNI#4<^A6Gz1QzR>}%zg z8;GIux~B3O#`@-3Ts(Ine(b{^j?MLT#|2opl8>P_2R5SpcmM9+#X}E0*<)sZU0Cdo!MR`wzuW{PkBOI8Dfj8SlomvE>xZ%!+tw18vldHqY8H zBaaqmG&7&9W8sgI%ctbDk>+F-n{Temp*W-rd5X>#HLWyMg|hmU?P*`(yPTLqkuq4< zQi}X2URCC>ndkbQ7eF*RwQb?1+G;1_;}co^j+(jB;Jt2a_?xq8j^eEiyq4GEs|CC_ z?~)OjhF!%YKU?`B4>lkuh5E=ZIe5QeYgzF+nVz_?kj*@5rL7GJ9~|+AL1-s*GJjM= zvY_-t@k5&v?bN8N*h(85rw=JRvO?Xqv{~w_Oti^&-mG9HkCL}6mfg`f8X$|Z^hq=K zJ9-|t{Bav+Ln3*Ms|&S^IAIqjKjJqA;sF&`{eo!A36y&%0NI$JSTLjv|M$1V^2fy0lSxdA%1mc<~`VvZCm79LS(arANK`>y4G1-n2M>(D9R5 z$m~v*2LaF(9DD%k7%&gYK6#D7UUS@odg8943oEle5dF6BgVGhKq_jtuLHhjfvZec1 zqMBuF)jho_m4y-#di4X^9;eqi3Fu8TV~&-9>M!&e`mg#7AM){aU&a|uEHid^{OZZ# zV<4Oq_N2dwO){rHM_X>&di z$Xqw2=AaC661s&lV>V_{%(SOtewORN(=p4t);Q%frEy?dbCL4Mi8R0FL8+l6X-;Xb zX!8C)PC=EckuByo#S>qyOrjLbtCD+)KEi!!O5;nu#v-p%GFKALyaO$D1K_XtoG+;b zjcQh2-v)@L;s>CwV-aysq`=o@K))0%b8bdbH06_Z1DWJY_RcBw=io|LnB(?XN0sN? z%~%XD95Lrrdh=D=Fz*uG;R@!8CSPtv4B}yXc%{4@AG}=fFY$fK%XkztnToSv9QnqE zC;gl-m6ys512u7Rp%9`ybNY=dubiAi!N-X|ZW>tGhk_5AE57|y_Vs#v{DY5#_56^K zTLt+QTiOWg64jH^q>OFU4w_m6@vgtN=Gs&qqj+ZRh7vGO1Xg8QD)R3O({iK3N}eLj=gOq)fAYFh^20^`xE4*)-J8PAUOi@O$Mr zEtxC>GO4}Jp#YQ|wY`!CJScMN)64+ya+7`q+||%ds2k+wOVCyMM;-Z^uiRA$2;O6k zWJ^2S2zcn=!`hV+!L2}kluy#2?n{ex+De0bik@;XkAlx=a?27L7Qs6K2eOBKt^zky z*1OSF*j7KU3U?IP>!SpW*zTbS9L4r<+RDH!D+;G#TXDD5j=Jy~IM;MYB_b#Dsmlu4 zB`sAad?~)n4>$`aFv8?z+J{hv2n3D;WI2qwmu&^PaJ$Tl&t=HLYZlP~$qy2_}{I7=*AN9&*>RabXtv z3Kb93vY4d9t}yA|2f{mOg0bV)JS0FeK_S1|nd9ll^q5NJfc@aG8a~0BbX?yuRmOdM z3JzOzdv#pUK#d1->=xKP5oWhciJzn;AC-1oe%KXXpv2>+jvMJMaVBY}=+}n|z(Y8M zH!#rs%V39-@nK?&NSL586hcNN&`h%6Jiy@Qr!vD?{B;0gFaqjeWG`XR?4{!|*Yr7o zd-vOf0TF7p=}EZ>HWp`XA%1@AyD0F3iQVPk%E`-*c}>hw;L5 z--##Q_O@7AT!?Geu4ogW#h*-j7R3&Orz|#I;@#2)WT4GeQ}%Gk>5Hk@++2$nUU)g) z^WOJr(FidzYA>$M__b?Sz2L>q!t&I~Q(iE7F(@Qyu_&sGN8aU^i>xUxFj=f_ZfwSd zix;)W8(Q&)(hvnBi(O9TEy&z+_uX;+{CS^vs|#iL8SLIwo|2*-W*34ga=ZqSS-Z6+xi7@aFTE6RdHnHs;)%zsOyp{EeaSlMe(8%}i9htAA2EOO z2L4N5_)`4ppZ?YO@|VBt#W73C?shjm@rh5wlgifzKls5|Utf>^;s5?W#CugY|JDEL zzlwkTo4*ySN1CdKC*tS+56?zCxT4MRcJSp(KS|r=y>_ZrFY24hgf_z{IZ)6cH%c>3 z*`U;FC|{!SM>m`)x!GiE;qDKKXyLBRi`DFYOqHhg){Rxt?TDMiV^MoQ+-M@N2A6JF~(T97;gSk@B*?@Sx7Bf)7OwaUGwy zYST({tn5P(YXxHQD}G+zPF~5k$PeCpN*+w2GAwQYCt1Y1TQ*2p5C;Grr5+5EZX(pv zeH9#ZfDr|2KIyG8P|QjHeSmnFAA}aDZKXyS`vu63|Da5g#jO{a98LjY3jvNcWjB2p zzibqJYXANsIM)jqKR5+Q-{JHg^Az)v-wUWd%Sk}vWvX(IE5Cdl80A0j5bdsuZX-s$ zEsbAWIliIXS6X}JF4<5xYi!H5Qf#+BPQ9z0sEzQE7up!_Q1i9Q_H6Kl--R}(n)t{^ z)7N@wmQ5eCVT>0G<^^~Ab1zJ(K zcP$uWC5!F7lkvE#;p8551W$v?-O9n@uUCnIIzD&|054)jgDK{4)iuL~6&{7Qo}?O& zGlkK(hy{dIzSzV^E)-4Bfg8KkKH!(>C;~{~NHO_9hrEsmfoN%Q=AO1_B(0yfC~}gO zFvW6QaQP6CGNQatitzxEd@4|QXmO^3j1&KS*n=AdeKkqmH<#CZIq}CDqSNhK!I!7~ zQXzLeUBA>a{C>UeAolL)-|*} z;@2y}tc9|jw2BfCKAgZS%0Q)&?S^>j3X+4mpj7-|RBkH(sUPw#!?j_TwP+|8>II!W zigD(Lq53a&Tj{V4LkU<<)&Y#Oq(}OeU$#F)A~$`3u-X>MODba>bu63f&iq&dB6AUm z5aHcsBu7=M5^u=qN@T&vZ(BH@?6YXeC+W4e&|ju^00_rcf~@zPp5pge56Z8kA(AuG zrInGMyS>_t6{p6l+++__c>XxZkW-Y6*rFYw1eD?0Z>NvKZzTMb6@Z%>+B(DO*y`^p zJcQ>&pu+scW{s5;1ZAc!&WUW&ColPsO)i9YWy;TcbuEdbWFK=m@&ljZ!~ucPM8;79 z?Gzv8IxG2vFf)Qk7lIsbvXV$sHg5X?6U(Z+39EFn#x~)A(xRWrRqLYSQqCfqp~i(W z$HH+?1^h$-Y8ZKOVF4hEso}t6GGnMx5&w08`+@L%>F&|f{%a7BTqiIJhno7$&`D~6 z!ok8bb3r)uQ0Zzs0XV!c9LrpJ%3so|Je+2w!=lko`VDf>#$2bw15{_C%Y4YVu4+7u zC9-(;c+wMJ)_4sCt!&d1x4K1Qo&wSXS9wB&8(Nx^s16l?hj0jQXrTL-fp5aO2e(6l zV<2I0NlXr;lXS&j(TqsYct8V)U-(oub-=O{WdX}nJWS+lR5b~Bv!I1e;mhL2n@;o6 zqHwq#i&wr7o1^7;+s?=1(Fa;_|9y|f#S5?bB;8xy@>qQH>2LZyFpt0GiMV;|dh|Nm z^7GVH3qUQn5QeLtCr+I30`ctGb6PNJVaQOebXcS!28ucs#4KW%o~E1a*jQhSF4t4F zxLsIUjH9bZz4&zm(Gi~o?NEy?A<3P9JnuMdFt46@)lX?xRu+|hOY=!1jvhT?<=>S2 z8*A%UTE6+sZ}ADlt<6mB(2t*T#pxDc+oUJ{KG%&lLOEoD+@;6=Xc+I_xTzRva@;k%9p+rZ+ZNQ_^F@z zaQxoy{d+I+I59weKl;&+#z#K#k+}E1d*kw@%kdBY;XjPO_!s|TeCS6%WCh_v_n(ZD zcl}uW*q{Gs!~+Z3_$tdvyV27|xHYFXMcYKNr~JA&G)t=f*+A!!dp6&yYZjI&R~B5pUu~Z9<20f_ghF|ytp2L3=qMAvA4>~=uR|#V%3E#C8wmG7u|r9O(t`~>yaC}{ z9>mXog;NIb!6%+71Fq|si8EVlk@=$sf^VRQo!%_G; z-;{yl%PW~u$w%Ac^d99WLf+j+{fN%><1qDUwWpEa*(VyVXTp#2lJOVPZ4;k%$(Tmn z(GKJ$Ey9(SmzlWDSF%txmPb5DcN%$+QFv{3P2+Z@_M>vBl2yR9}m%30Dt5gw@10%j!+<@aHh?0LQw70 z?rAl}mK8EQRGQP6&B;GLx-h3Gywk7UYy{VS>5DDeg2q!Pp@Q+lBH`Q%Xm%<#<{cC= zoX~4=g_ATCKR@1qGKh3h>Y+4Y?nZ&b2`*@w(Uff9p+O-7&PpB<5Y$&_E zg6VgRPoOezLqq?x@TPVDaAi@+^s54@SDz+hob@;Zd4}`rKN=5o#z7`GEKyjqPnV~Y*yyg>oxE+!Jy&{g|GZ%210j{+SsuIfcyV^*7 zM;?kl6i9x*pKPDzlbd$~bK;M=yU%Gq(V-aRJ%7-0+G|K0@u>xIW;$f>F4{H zvkWlEg{f;3m$%DDbcG*)!myS$>0qo_Q#ql`1jr{iGRW9VJGYFI4aJ`o;K<9`%{;Pg zHe2w@It52MSzehQb+YG98$d?W@vk<75;F6&lWQ^tXyI%AtPE8BvHtQ}TRi>MUzJNL z>=^SIm&8{|(hiWxK)WpQ;0GO|`06j|N(i%3xRro%BS(r0e+Q9b40d=w;I6Orq6p+Y zfhhR4HAHdZZ;ST@_GR}+vDrZ(IPDuhC;&G^vu(xTNNZB$5l^)xWKP8#X}MLCtPD70 z5YPn@X*%-cE)9T&nS<%?g@zc6kADB2h$#>F5iU3LFyy`=K?Yr3*>-sM9buLUdOYS; z!;^>8DR})5J!xg*OeS_YZ+4q6&Kky?Bc6_*v}1ry5o(##^@{TgK#tS07chzZg~Wi2 z2cfVU^8zdreQ1wg%7v@)DD+q+L%zzR3RHe6FZ*z2|Hya+I~mO&gxz91iF3Jws0N@7 z$vv4j_}ME5vW?rwUVbJadBTTqx$|GBA_wWJ%yWzuP|oIA!c9}~26^xcXeWTZlV$97 zBinU}E&rGgV-Vg$1>hkZ!W$SoLKGu7;Jpo^0Qfq<;FV)?a;O0eoHcwr=@gu4uo&3K zzP&JPHc)J&JW(=n1>Nei&^rZftRP+EJ#@>vp^kckp-|&nw6i$ z&idM|{0PSKlEQ`8LU4Iy*-ADRWu%In-+1~Pab)#qJn+B+zG90EEao^_2=K1JpZFs` z5uf?&XS|R@HWq1H+uK&Sz5o61i#4TH-!lV^7qd)2lIQDR|7Lvn!#@$1E?rVQ7Q`(2 zsF9I3PfXe<+)xB^o%rn8SG@p#=aWxLt`*~Q0VsYf_Bgd7@Y8RV11|(;p@_{FeJ@|R z5*ur4@!_BP$=p0>LqI)Keq75&!G{dju3nAfCr-o*&%YekuV0Q2{KyA=nvexJd{9Jk z9r(}x=YKv{R#xKdt7qdM{iA;rzy5cBJ?_5yuK4t4KN~;y6Yq_`|36R1KmYv2h!xe3 z@+DDRN7IsbhcfiZGvyhZe6!$X^GiNx;%vfIUf#6Uc1`(FLY&GP@m@nMf_G>y;=ux# z+^7zGGOszWz3)Jiz4&l?OKzHp6*P1y^j2 zS$HFx6*X#SFjZNr@@R0T^8(LGJjuZO{@B#J4@d@1M^4Ym)@s@(9*L1k0DrgyKS~K$ zpd4^{DTk8D*M)cb5_wMfSQoz;i79$EvqSvwlH4d5%F|3M#ZW#d{SkS=&+12I?s%iF zh_rcAI=j>l{U5r9(t}oX&M&(u6d?o^`FuUr4jJ15$}mgRUY8|qyflUy%tni}>=D>m z+yLd8iIsTNcLwe86pi`d7kKj~oZ~9o^;~FhE6nenbX!mx^yxnOoN$D5B8xPzOMIX3 zbNtF%a+tQnqfMYNrR*$YNf%nI8czM1o}i5Hyg6Ly*p^I=FB<0$w~Wf(<8whf91m^` zFsT5nIB2W@tccrzhz=?MzZ=vv%@>5AvMcVF+OdB;!n1(24fdDr<1K9Ot-HE^G-lsW6&)p z0*BaqFoY|^ybb_b*|b^Yp?=+tWjqfn&u(uh18HN^{-DOL+$b`vfN9Ri&X0oF&qo;) zkB@w`#YR)1yDJ-J-UG;7!2=ed$gu1jr~D7Ch&d_GA9GM%^-U#<-ICFYqHMIp&D8yLD;I3DEG5LN!6wjQR<14_bbF~9bqFPB<;-DC;A1rI~Fjw_Q ze9|#aGt&x$tjr8Nu3dNCE8 zC@oo&(T|GUv|W_}oq%*`$E0H3loPe$^2@OVnjBXU)s&*OrFEF-ly;s+f5?HGG(ajG z+zyI!9{h5`H2mdXlzf~9-0bg0r#~gT8QX(hp9I{J+2ks4ZxovY8M(K*JARiSLnb^a z3{OMUX^KxL&`$;2GH7DPXc0kYzkXE4w!!Jg^(r~-B@D*KDJ^^XkrB$3;kuI%!tI6t z<3NGOji=zSabP7;2?vU8za(({0uIs-C<})TQiky%877#v0K80BV4T(gFdcjdSG$nk zCrAr@{heerhKh4^JZiflq?l+yV|-=rpUFrV#^?gBLvVsRxB>g>7Lebll6RK_>4{g7 zdkod@Jf(9ilcR%_$L)#nGM!1Qx~2Z*GHwzk>jQq~Ng8SA1M}jC0~Rn*wqqMOh#&JV z_!-xDvr z^okZVgLwGC`{JpmJ|92y_P6=Hd7aLd7NcD+1X*;EJ`2O`?alb&7rqcb`?EhA>$gzK z&09|1FIP7WD6{-@R^m0aaJzo}s^^{V_EsD@vJyv+9=Cifm=KReBu|0KK^fkK<77kA zimS_)FI$PmB8zJ-tE)%6=w;E#^%xd|ETmY(KKI=7aqj%N_?e&i884nW{fA86;Ar#n z&;R+qj6eC2UygUZ(d)WDr9-#xfkN( zsS}cEJsx|@Tl}uR+z{nrr2?BP;%}=AH`h1f%9X1!S6pw$j~{m#pa`T~DN{~jpvbF> zY%kC`9Wpno#oa*ZJ|Ab!oKc>B+HqJcdM;Dp5r^`bo1GJFPhkY?SUHMJl-ZEYgf<+n zoqbLD{961MfAzm`x}W;gr{W8r|3dtoU;jJK%i7x2c;}Np5kLFazZKnilquR2Hy5=j z)<$@G&gH>7{g}Eb+x&tr@4aKQpt@u;Jv|eR{&w({Oq4JFXa|dQ7J*vaI7vzEInY;V^nUN6PtnlI zv=QeWV6?TW7?be{KsHu8L-Cc&a^qKI%jx$LvKfZS6bipvFjF?>v|EsTYIAuSi8d_$ zv|lgsQ9vjbvih2|OrVfL*??j|OjLHtgxpFOr2~CMeR&s!C{N0Fd&&iyKk-(WPZjxn zgYRrDoeEw@?I4ml)3v5a#4Pi11F!z3-M?;q>qBt4-h0u7L8{8-| z;E5jzBnQq(K%UYE#7a@AbK({#N(1AaC{#)jMG5Ju9>-zO;#S_B7HH>1w%UKnqjFMz z=F6+Jk1QvY7sL@i@WroARopO=Jq@Fpj{K@iw`~$Ie*v_X0Rs=xqyt8gn3 zO|LK-s@cmApv?hMf^kv}rooKel$D5T(F272$5a4TFyC~J(<{k;PxyYK6oACz17$;6 z2lC`$)&ZxlcM}D^% z+P3Bgxf!<^+qr7#E0~&RI8~K)zK5+X8r~7eoYF=~=k^7A#;Z{@#Wo+9Fpg3->7u`< z(t{I6C~$JVV|-w4VXXH_L6m^l@-sj20WIvD>rfu1Qpt+0A}`H36*g&%lc6feH)&z( zCynV!L&7Z!iSw#3{!&ik5M0Td4KnG0ah!4J9$29ujFllJ!2Pn8{{%QTVfKihWQ8te zaZfJ!OL?J%&h(IAIgVtoA2};dbTX+dQoECT!0RpKN7=`mi|r3`X>Lc^XFp0mt+$wu zSu^n=5YrTTluJC|#&8_vO`F1obPxxbx&6iaZp7 z=_d~1UVmu(v)k<>4Y-4DWl`x;DhW0J)lE6nvczBAw5@5$?)nvqTN`duE@An_BNd6% zYo4@o2zggL(nen7fTyo4%Z)OV_UY&b$}HO#;VB=Gv{~2ro=D1mPa%iF zP2PxK>zg$$e)oT<RVuSYr%D>Sa#YRu=zHs>ayRju4Ck0Ww`ox`h zSw8BSw451m%0savP!^cLwI~|ricSIzeT#AiXXO#}Sq5Vp{#CIA&gm4lnd63zFc}sB zleC0^v%*HUJFJk%Z@-|@83>o<{NWe}q%8YDe#;|TwaIjYmQD0YAaAxw6MEd3636ls z_hgy}VKQhkO~C%*CV`s2F_biF+5m3A<@`Nluor%Eum&M5;C1p>ySOWVaAV#8Vc_>k zh!uZZTOBLZ;EOV%g{wYSA*a|Yj^`*AMsg!^?Qw=Bx2%f8qV{KmGRAh?ONZCoRUck+t$k8)qv@*gW$tJvQC6H!Z@s z-fKmfyu27+B_Vpzi9SO0$2D7(6Ps=};#STg_$ic(C|K0a zXd_d+w7E zeAQWQVXPojzJ02|MJQg%mrvu-7f>=Pz=|i7o#YE8lkz>Ky5vIyc@0oy!Fvm}Xr`=G z+vG$%P$a4jY5d5f#RvIUZ&I?0x%op0io%hrhg0(k6Ag+!ZQxX7l1uq+&&Cv29bIPd zMp-~PN){{qXuqUK8&!Jb1;s2%MT(X74L!0W3uQxwU8e9sKElYGfc&D^a2)96_Cg$^ zFzVC13Xc4%d@>%k!tjq}z^{B#M-G!sIAuy3gNBoej)M)Y+L`Haiw<5Y6Z50rj(HK6 ze9JgLGSHDG{)(f$SYF|++$(vM%nj(>78I`blX0Pij{GG({VPu)LPMFVy_k;jV{F4& z+LF))lzSe#Wl-V~Cc1q<*!KhK_+Y&62bI32dAqa^!Vf|tFo`lszcw7mg3*=FBu{Mo zDhi(vpzrA~+31JDGmUJ8Talw8ba_$+F4w|@a>va-P6rl`{o-H#R6(Y<;>u*gseZFg zp(mVi3R2ogwvB89@{=B9?ojZN#lr^1Aly7Op{mt)b4)HLhO7|KxWm|_Fdkem#-Uuu zaXa%4iv*;F5g55BAI0@aBGIE@KzZU*XyV1`^3h;NbHy-r<<5^#$Y`wdDJB$68iSbc zcu#HGD5A7t3_8U)pPO9fAHBPPhtG4*Z@zU+rRw(`9K;iHpoD)mPDF1FBMN7_; zlmqhS$F?M|@`WM>rA#VdWRyqCOx`4GHI(I~zv8ONE0zW1H>k|O`NJT#)zUDOt!(Pv z{Z$4OV?A_~E%lT69Ynv&*L(9Feyp1~ZO_NaxCOwPqNBN-wF>U7ZS1a$!nQl6?RGnP zC0HiQTVuJ>BLB>t%&GHP_OI$rqvqpq%gtP@^)XS#3NPs32xI<9 z(0JU%QviQGJzK-_N-~2-f)(leaLkLDX8@aF#lt^tC<=Xk$(e_qNzW-rIh-Ev_@o?D z*~!{b5oKmH4$ZV0F-Ki1E=zO2w_7&1c3Pt6ecZfefGETx+;!n{r#w_oHLI2r*(*YT zm*Nt=$4a|3M&fp%QLcn#JzFsO9cGfkll<_pEyAG353R#xupI_YVfZ};WAGOP4fx8l z+J)~pJ&a|JOgDGx^ihn0Nup$@njANPbQ z?Lr=r6dGWXW)hFP+QpePg|_%J?c{meax@=s_zQk4oBRjm1nk!Oov7@S5#B+WPd{W* z*r5XO5DwuD4|R094V3X@!Xd!TpfZ7Dz+pzLgPuV+23=-~TxFzjP>JsWHT^~@ev)XQ z@}MPt(0I0y7t2wt-4G3HV&Mo&7K2(+dy&N={`u#>9dCX7?Q!W^KQ`7oT6nTx&Qn?*sAX6H zag}9jYr~RUzj4FwKDu`OTHL&G(@ME3moNE*A72E<@PUx4SFgtn(W1~okp&;j>C>mh zx8X%HX|RC)XaDS<#k=19u6Wa`WuQEPTg<<47WBm-jwmue=%kuuf#;7^!Spn_$8?It4_77 zb-V`3FBW;E>0sgc&`H1Rel=>!O&cF+vn3ZN7_Cs^v>*9U`$m12$}ASIiOYV;!a;b_ z(nd?WH=%BrDE_Vh7Go%{te^)kx)Im=STu@{{8m1?&!ZIVJD!`O<0(FhP56sf zo}|puL%GSgzyjR1{w$#KKSe!=FJTM|)FXMoVypcBTM{(hSEPU`q@%)8n zD-R1F+v4H0CUC?h&+2F6w47J))L*v6lncBJHhCeQ%E$_82DTbbU!dHL6Hn8sirhEA zVJN=hpWYP;1dCVjI92bst@M)vgC8>q_-pw0GW!1mLybe5#QlTtfTq%aHz;kD@rQB9 zV*_oSc32HWmR-*8#!Gm25u9${v}+0vCkd1=l&jvg%7@KA^rTB#`u9~%{090Jb%|eY z`YvdGsB?I$u3h)8U+TQnz1uYPDwNx=+K<}_ZGwJY(k0OM5zjrJGlGaI%Pe*hm(C z`BXHV+OA(g-5n~A$|_%UPhOb@Jo7|YHN{VOiK|jDZJw^8OvHzbyDlgdszUvhvctwG zjOu4Y37wT~qC=@8mhQSn2(qq}o@|t!JjhIiUDqG+;G-S9%MWEZ>&b4i?6C@l8vB_(^(?t=8+gE^_ zt!U5XX+M-aC<<8@u#UsjcszLY!$-nejOAPv&l7bR+%78_D>W!wq>&8{n|6ThFyZ9L zIE5Y?oQqWMsu+Wmd{NLDwYKf-U#aA?Pd4!~Ec=1tFn;62tvYig|7ST_At-v&$S;g( ztZc{0qJ%bK90O+Bfy`Qi`ud#@B;p@_^shIUw!m006{`vI+O+I>u0uV)@Ml>Zh zrLnWEa`by0MU%rQkNd@#;zJ$>gFb2jLvpN(gQb`kKL6-1XLCbnR;~&?f%G?zOmM`q_B%gw+5rF!3&nVx;YG5|qvAWE_*(~@QT-bb>Y>(_GM#l6qf z^&``g9*d?anh;HZBnFrT17P;OXS#c4dS9z+-90V5l?vM-FM^BN6yA-$L_dx`9h5D z>W{uYoEBQZtxo|dcz@!)61lMN-LqQ@ZAT3B4>+(J4M!S|u5H^!Vq|1{jP2cLCl?XAn?97~H96Wf?&f2%$dOJpUkGg&6 zitK7AGFTY>ywi|}0UVI%O21N0TlVhR>s^325%=!h8;6e^ihun-{!x7AyT9WjXjg9D zjUPPK9Y6ncB_}&s=Vs3~$(qrF zCA$=ng)TT2Rlh{?z|HPEb%J=LhiOy~^${V2KkV@99#FXq7MzMWr&Qzzj@3oAOLd_S zPAJmwFxcoRK}oAWIIKwHh+3uZ#KW;==|QoB+d_Ml!>Ce}$8fSQQ&${n>T_L-Cg4lQ z)aj=l$;9DBS#?%`XNMep$FH2|ZAxiNx#VV_(5^BzXds!@NK2=NXo+#OsSFwk&U&cN z#-sGIBP8{=6HfGrqy7>@&)jsZHd|kUc%!j!DxdYq88RDyB7*f zR_bsh#KyyRVQBF|M4yYYR0Gb}XZ0Q`Zzryk`pbU{))<*z5o6d=oUttB%vpFmcbKo_ zbR zIg#N2TNS-l`)s58hW07F#=2apb#+FVY)hK?gF}QiFb8l5;*`bNx286Fr=y*I zi+0}m;~l)SPxpI%EXA?MuKoEr;#t`NbAH{)98N;rhrJunyZ`1ThxY(3*zw1!MzUYj z35=@L!A7A`=*CoHe$f{4)dA!qu*KomE&IV=?ZxS5=U=yM3!Hyh?sovn?jWv?KXweV zlZ>>F{Sq{X3Du6EK0?z8NT|nia}2V7>9?BB{%6Kzx;paoM{;QgA9*bckOM__Do z)-q%5@N)lf{gHyE`~xgWW7gV*Cwac_QEXb~1N^Cn(UM6%b>lzSaw*f_Tw_A{#~a19 zPXO1kDQ?=n(4k8@)M#JI;|esb`Ka5}1()0#KRl~d`ky-u8HfBx3p@7cL-fo%fpOzr zo_X+mS-D3<>;PovA9?z*OI0J2uY+4w;ZbqUKh?}n5WHhhf;1NBjw&i)O++`_ehKJm zr?tk+<)s~VlDUo9Z|iD<`LGF?2ds-O14rLvOr1ii-YQFREu(JAk*j}sG6ZzuJ-1i~ zJD3sBRlb@|-7KHDpoLJJA%7IeHY3+`{v*QDHpZpJV;W-q^A9@eDm1QBq0qKs1ND@; z2o#lc{t+ui9Hry{HHcrn+5NXPAW{GPG3j-ePH|8YEa_DF0W9gXwnKZ&v3W6{^w6X!qvD4u-s z2`|n#|2SGpofsYnbJa4;dB+@l-~F9`5Vx-1h(lxj(c3@ZA6jy)&*hh2F7MsDXX9~Z zdL|AWIN%#jpT8!&@hi07l_$f6YA|qadPm@djaQ80qeqUq9T@$*KpP|0$D~xpii~EC z(EjRIzl@V7&cvVm$^R1H`sNF9=FIVU=_fD8qmMpfgB!!`^Dn-LbLSqB>?zCs;`7hr z#Hka}-`f}C6SrezXhgcN$B7ds-3Iyq9qDQuXB?4bhaEa`YzA7sVEo#vug2LkXJcV$ zCJr7s9N&KK8!@zPTm10Pe;V(-`$4?++Rx&dXP@>10)1O|G;pLD2PcN}lyv&=!w*&W ziP*P)pN~oJ*}Erp@7W!@cklL>jBOmN|Hjp)?5?2f7q9;!_U_xOK1ex$4S3ZvJvANu z1O0X?as&%UVSRAIIHZj@{(ku9KlBbtc1cdnPR1`@dp*AY;)^jmHDl-PA3V1!{{2fD zoE^RSVJwVObiv?YC!XrW5$5Bs%s18H9ewJjwhoT{iV59B$a}1~Dcd=O@r{#kagKpk zai^ZAW$0jI@`o4pi`F}>RG*!1IOX79ofj>;+1P!9Otq`bb@Qlw`4v}!czgOZ|Mh^y z4mioP0m_j)CaQS7i&1s+9zg3#dxCd+iAMk2X6Y(UrExwLXA@uc#W+(Fc{x`*&Z?C; z(dMyfHyV1yZUclkqBzc~oZnxD1B-IYAJM_(%45I? z&zFqb+oTucBb^x=DFBi3I2u#7oe-{*cP}z97?>&p?8H!=(#6J@WLqW=UOZq(mvjs& zuuBlUjruHa#U*VgoZBe*=&U+(*P!&1j&``QtC6;~0(}9F7#`X#TH1hI^EGJgv{Sm` zXba;)zmTSnObbpic*{dhX+JpTrQ289MR{!tWu{TO^owI?O|P`)Rw?7Z0$row5T4F0 zz+zd!4^1WgpBietoAvum@OAXy8|7-g(j`Mj)HJZU?X_FLRXnlqtZAOJj29qYFv(OH zY7(Fx=ZgTwNY`H$EA2dsjW8{p3cm2=dZxgbJI?vhnp-|r&b7idsxr?fl`+>0$^nch=9XS7R`r)**15japZZUWK;q>z^Kb(Uz3JWnms~AV0=s0=c zFa1g$_QSGlC>*8qi52pFLGweJ-o#`0k(o4IHHNXyG?s~m(RY{qfj)HJc%M%$%-9=*+eq0CM^_YL`~XXVTGaAG9KBxTlq zWh_b8;Q6DN9e;dn+(&}x7cEJAZ5%c`1iRQZh1?}W;TS9Cf_b=} zDjjmrx$5USkqs$xt6ll>%A2%!F3@-fNaY^c7xYA6BM-m)L^|SYk>7s`~V#Y zbVpVRrCI}d>r-Nf%CB^l;XFnDlk^quyhcUojs7A?M`it|g(Hx!^^`K8CF>#e0xmC5 zX%yU?l5T|uaHNgM7`aupaV2h*Z>k@p(yb3T3Fo<5ihL{@(0osNQ4yJ+xZ-u4Y&ih8 zU<>|p2Nr`0&9p#kMFM!1n@zMvDRwA01IABfF1XfWq_`zYf1Kwwm5W&3cq^1L<79xb zqE~tuO6`l&(RKIzSnceO{)O8yy7ERm^X#|mpy6w|Pe1c)T)M!!|5p9(KY#c`20aD_ zzZPPwbje^qoetgje(|ec#kaost(csei-F$d=;|5pFNbYBy`@*4=ET_ zGt+abc_nu58H+#r4?m2d;hnK}Y*fZir+2~a*|R%-`T8&7(BUIKI*S26t2%jb>F@88 zu|6A5K7KC#$AA4tas2qPICktvjEwAzJ9qBNV8+;7i)+`e$FZYFVpe)$M5iH0d)DHU zPd9Ca>SV37rgWE`qk^+4TuAekC@<)9UL0;kzkyE1L_Zc!GHbr*JJCe+AbO#d3Jn>4w-gf&}Y)S<`F|}!;eg)%7{mxS+!ERe|{@EEv8P2}y@KbE3U`gXVbQv+nki`oh`ax5jepN^0(iZDM zS>}_EhM_OC3i@vzrSn~V;AtCWiAQJeL@d0_H;0<$my2phdd%R@q>XC=fQN>8Lui86 z>yrLY4YgiW`rGL6o9HPk&2;l3T~_9!9W`JWXxrYoVPV`FUb;v80v0A0LKSeuUn0Aw?o9L zs!#%PJn#cfN=!XdZ>py6om8B1(t!g45wswH0FBRkb@sAF2~iQ4z%Jr+tsf!=^|CHP3S=WEh<9L2!s zAS-33OafW%iReO56)tB?>zV+a=Z&r@JMKyu^WCw)w5~S$6(<>USR#ebx{@d5Rfj9I z3=yp&Z#=a0ug8Trou#It&dMt~+Xuvy5*K{-n{Y)Q8FrzPM9(moC>a_`UkT1Fd55x+l zRkEdPBNUwFx<2wSvj|ii7YF=^qnx~gX=++I(?D;+OcN7Xzs$N{A>qDg8KiY>N>0a? z18@trU<-0p$c3e>5F1byjIxUSI}cw_{Yx31i+ZS7jct>!#iPf!$DXl+apA(n7}+))qdT_6M<09;&ph|6B`nNMYrW^F z01xjx7!=tOcqZrt+MdU+7xV;~%*e)W}Cr3Ta`Q>26(?-c~6}kS-x4*_ToHbcby)% z{Qf`H?<1Vdu@2$8`!&~P2Cnd~Ld`#J%v~IJRUK;!qG2Z=U&8ISO=u%QbKK4^o{IHw z?T?Qv&&!5{PyDM&+hL?iI>qPr@Zmg!UTKU1c#5ORN9k}DLBj()4nz17qq)Roo zpsUMs4gB#O+7yT??cWyuu6#h{`%N+)R{nK7wT!Ttjt=6c;<8deq`IYB|?m^-2WDuclS$t(8wYkq*Mb4B@F z=Stew8gocuPbOzKNqRU`Dk1Aw?MMa3iq0 zQk}#7aYgsC<&|{GRi_`$zD#q}7e^i+^q9|Geu}-r51U4I%Yw=%=cq5`x%;m={pO1t zj&9@hpxpqMqCwxwf6Q*ZYzBU4^;dlr`xtOn zx8E;prylE~WWozi%1~b8f-GoQ|7$sU(&km3J|#~Ky~hR}8$h1|90^WmR$hm`7L|s& z@&hg}Jm^x#oQAtk_(KjEiYq^8=yQ%`9v*6Nxl`^wU!p!PtVDf(^@jen4a_}DFL?rO zP)anWEoGd50q-Bfp%l)#Yg}BeYZ*svJ+|vUc3Orzi44Hk593!A@f9D=VXuANkcb<{3ECtA5u< z+?lR^ z%OtN*-f!n#qs;ZFmKWN5Wv6HUdzT+*Ja z3U;1012oNc0T1Z9Ilnom{9$bdjN?CTq0LzaIzM!xKzo2zA6A^`bsam!AD2Pc08p)Z zl{XzTVaoxy1zWHMEnsD6z@}`j9t~hYNz0-j0Ma$TnO?y+v5hn)POfy|h&RgGheciTlucJpU0EWeA`?8-+TMbc;fMM@#Wh zacSwQ$JMHwU3VXS_(8nz!gpeNdQy2A_&lJi+_h#Pfbq9=v@+TM;tqL%sbF_ zkB-_I$F4rU`@7Z}VKwR|a$JRiYe#{-5SI|gYg@AN~5#~*t1o@r~!76VFQAx^;sFSS}yAz`-~^e&6rs;XQu*a)0sj&*SmOAB#SFZN}r15;~)}7ckG8}`012&l1X}~ew6UR^3M&L!_JS_0V zVs<04WAE~pm*cZfKb2nnv9!G8BR#w`kUrzRfAkSM0@)o%-;D0u6+e0DCu++Ru7ii0 zYRKCNRNz?ku04BWd}1+9pFR~UOMH=V-etRY?T$bH^FNO#pL$Ybv%?Rdzx>57;`_h% z{g|AZw8QmVkM4}Wc(W&h4S3So@7`12dk3G4H_|>r%Lg!+pFGI$BuXq=zeh%M14kWG z+q(yuWK3nzFy-5p7ZfYq-3OA16>S;=JBQR+^r!KvCyyeNSIw#~cL8E_VTfx!P_!~H z8?)bil)Fp{Jq|RE7-LAZOE+e)`pwRE9DYu#PB<_i*m-E9Lh^Yy;s`EINcFM58Z5EM z!_ZEdGHh`UsxRyupsm8KVSTVW5S{qPu0{F`e$n|l?--Qs=%BtUPOdbx)OTI%j8u%l zM%M|i64fVOKY-AWMUIW{m>tdhnd%8owxii0nme&n^@6djT`1G1BbI-uhrA=_$Nw-LNT zaXO+O&WC&lA?2yNgWFB4RwGmYb2kBVvzAvL)dRo#N5SPu+j?M7WE^Cq$qH>89bRxw zX8{#vTmw<1HJw5ezyX`_K&5{e-){qz=j-?>+pJrylcdtW#@Z;aX?K^26<8mP=T8I7 z1C4XPCIda#?dEj=gx4AF1B{>2-jRlbp>(|Db2-B5wZc3~!*8<0LBp8k)gT=C^01qE zDu!0UZJ>xXhHFlP&ph>EcC5F)hfry#}5vxYSSue zEA3}+<=GLaRm6@yRy8~P2rBokHq$B1y+E|=a$2FC!qGGzv85vZsExGTKYSR$J9dSE zkgN&0hp67t?_MYA8}&c;5Bjqi%u(>R4TN$K-sP?<^U$qn?9c%m>ny`qokPaCYmr16 zF4}F^g!+Ynq>V(f8Pwht|3Igp`{0TleG0nAW_s05zh#_!)%mwjKE|QoqrN!x=F`Df zop}rF>|4k(9EAMHiPMk!H_kwR$rqWfCwKbQ9xpbO-PHxIB5u zZ}e>`cCFkjs}J>G^P=`GG_+B2 zMSy&ql9XGfc;UyP$r0baZuJp-D(6EWJQMi3rw-A#`=mgQKk~3OmYK|4wOWf*Ri**t zvkp2-80W?6_%9EqZf?*qtkVdAV4F;HUK;Icxem~6^bx(3Rrqt??51}UR5Kgan8 znN4Jcss-p#3tiesS5yTQvTFRvG=2Yoel?h(K(h`47fP#7KoNs0s3v{wW79Na{uDWt z)<`ep$}&qzVAuf5YVue@NpCKzfwe_=>6||+lz{vVG2%l`4I7y)2jCWL!4_-+FBu6W zSyPN+;rI$*rOAW>3>6CAC>AF21?Sa?MG(0U^5mjhLXpj1?pIzzx%uDvFgg||Vnq+% z{j*o%(6-xg_R({3kFV@bOvKqo&c@qszZK^cV^m_$`rf2JHe@V!-A7)pUAtn((4M{f z>_qGC>5|bPV^#~Rj~k$+3^d+7hf%>UwPVMQ+Yqis9ydc9dq|Zrfnmyf=4^b+aOQn} z+x)Q)-eo2t1&m359Z`IIwH8O%$y2A|%P+pL;R_iu`6$Qd7ca$;qeuOb4yxI^cTfDg zfBWxjNd3Vd{DJgpi$DF-KaD4!dP>Gyhu;Ip5nT8&>^ZK?&OG4Yfdlczn{UR&i=V|e zzxkcuMc!x5oQ-{BqoSLQU%d5YeEtRR;~S6Nd;0QY9eQXucKmouPtVx#NW0wXLk52-^|rBk=tM?c)WdCUEO?D(;`dE=&!KJ#&q zdv{eQ4>vM^InKOu*QgzbJe<7!_S^CJFDEq?y!~OdY#O?9>ab|DCXSYY<+Wn>A zLl&Nwe8E)w-i;PZ!B=#B4e-E=;mIyJoOR25NTV~IcA8J??Y*80_1${wOOvAO(|uPo z82LOjFVBlcGBjpBo`WNan>cdyILkHRoqs*(qH@h8`a5@jaLtGh$0Lq3juN{*oNbyj zIOkM158Ul5^AX+smf@XS-W8}a9E6(JSRWhj_flT+*x_ae?% z^nh3GM7*vII}~U$#;o+@7`6LW81qxEv9nC~t7M?Ff0-}srC*>W-*EV$bAAY+&{7Y5 z1PwCn(1VtIr6XPD2D~k&pT?v`1778pNgh4Kr+JZj3g>p!dP?lNvQ2jCL5nfyGW05G zmDL|evP?W4TcurZgV%DPtFgMmbAqnQIcFTfI0c}Yt^f|ukU3ogKwR-nXwp8c9H_X5 zmHj5DJYOXn0Kd8Xx7DlS6*ozIU-7)soW^m-#CH&`%BwN`Skpz2uM_8#;TkA&l(nTL z%Vi44ciMk5UF&M)iB%D@oMb+fG-V#kr1!d`aksPF0VFYVm3afN80s80UU|xN9j0Tu z;CvkrN_mrCcpkcaBv^cQ_(>&xKFJSg_@@_L@_gHTT{zx}3!dY|I0JDE=8fWP zj~PQFKJLFb0s)$u4z>Kp{lY&wP-fjkAUTX1zHn$dz?(q*(W1>5I{L`cOvcEFpKDDa zuTSKvURb0%hzxq>0l>q z#xdXO!1Gus_R(MQw|)>5o*!nNmh5y=r4xYIyd^*bZo__~9U2V<($$s&NW%m8-dAGi z?1U5Mv#qNDJqxaJj4OXZcUG+`WQP|h0;khmR0nCJ_WnI z*e>Wzzgt7g&i-m?DfwQ$g!fKbL0)f+H`k?t<^wuX%ol&Hi)mm-r=;!dZ1Z~o$T8mJ;TvG(e>zFduRrXL(-ddA|dhV0I@;0DcYG2UvZ|P zE~O1cHVFS`_UNzaKoohT0V48F6a~<|K*yE?a0|9z3pQZWqSaa}l<~q=(oJB2@uC8a z5enq%f#7^vraeICj)(t;i@|k)h5}n#sxgF{3gZVUtr6F)=x%^}XFR zILwBIhKnKT#@LX?_yO13*B2js{GoTdaqMRA*go&1v#}%^0=wwmeB)Pf=IkSJ_wMc3 zzi*$~I})FK{BivB<(K0h|G^*FLHO_f-M@|Bd+`VH@h9iwsi&T>?zeB>QM)^0bl0fs zqs@DE?T+`}c`wdA{%EYOEXDoF$$0C%>v8eYt?22Rj{SSOq;tRepvMlrS6+D~9#dap z)bjvB8&;Q>-Pro^czsb*HGc_) zx2?S|)jM=iz8t=N)}ARDE4(un@&{!9yN9V7X@7yLAol&@6qq z^dz5$H-AI~`Kr^`FFOKdQuzIM#eufYZa?>(1ZxhYBTTxXi{?@891>3K-Yr=5#8D_Y ztsO{Q^TKjRWmR@s@MKbt0R*=+PJFonr-@Zt!rSl2>15 zU6iYgBjCk(M|*W)6+X(*jkx5|sitfD(SdX=b9k$qf=$JdqRnne!&_k2>oKHEQea*02#`BK3NkA5J zA6j^Xvreo&+y{9G#}QZ@f?AT66 zpIz(xsI?NyTBF&ewcKHzjuxv|7;24o?#5z1 zFprqP;BroRx2orwf`?XkjrWFAirshV$lKVh*Y4eY9lDqIvdgcVFZXu&U2dI9_h{XR z79JdaUe{C?_6%v9Na+A1;0#i}yEy(Rrw*kFfSpo;Yzq#r)Z+mMT}d;Jq|%zX#;ZymUPY~9vs&Nb0@`7roTe->YBXWs87^C9lEZvZ`BUx zxyI-d(x8Vrq(p!a(L)e*EO9f2h+ zKHk}kvp(CBYm9$zz-v#RN}da7ANsnT1lBHUp$t083s0+@K`MDPavjKPq)l6BaLhT0 z-KezdgIsad0a`#Yea^MkDkpN<10r&8g}yp3tG>M3)$%C^r^vcOi|m>wq&$}?&T)d5 zF(HOWQ1x|r2`$}SkfGK?uzm&CiVJW*Dzx=_-;ish)2+GVs_H${fBe7IPNz!@6xAN6 zy9VuK;^EZ)i#jKQb_2lyk=8pkP0R>Vcri-Py=NOmIshwtx1{G=k^KGxkw-q zUeDC%(rR;4UMtZIKpoEv9a|2-E!cuBco6DhQJ}SUuxPL_5t=k*QE_=e86L=#tQNYm zwrv!{CnRE62rYhN;d5H}a^KPOb5FEST!^-r>$+*{2ETkaw#~i~-}>I)i>2AA_~_%0 z2^@*ty?1v^PE1m@ z*ZVx?kq;p>)keN}zWDr$cuM+HHZd__g9rnZcii2$al`MqJ8oNtKX%j2O8hOEkSkZ0Xc9$73Uc59Ap=v=RXcPQSntr zb}7P#b58Pj1ociiUnIioq0Raz>0`EhAcSA5q2ytW8kvV`ig(IXgB5+5pj-p%(C3ln zwaz}JS5(}kSW@iVLMQaaVTG`a`K4b%r3SjH9sVk?0R5@Z{g8cO$1r`{!8-++&%)~g zF&zfTBhUzFq?7(>;yLY@vNFFaosVRL!;xl3D>C4xjnZGb`)kK`>YL|`ZT%2>FLl*Z7@3Iq)dp1rl9Ck^Avo0NX?7CYaR^Z1f zX#GCClIEirIM00i){Z&FD>&Jbj@^3D_{+IC^9mjDsvU3aw%a&nTOD!!s2C2uW$`Jn zYj3$Y?v^E=`y>uMA1`G;9Nrv!FnQy`$;M&fQQ1&i?j44*EIY&)?|Dv*JFYl z6{>CMM1ACGyW4Mi;gwGP&^gD(ZBSMGFpra$zOutlGAN+C{H{OQ4$#sLJD$bkqvg5> zvQx3WogeeN~f6Mv;ym- zgK&P=AMF*MwwOlj#L&2-HgM3Xx1={X1sZOdDi=N-f6yY^i7dBs3L5=Ej^)E^wt^?B z<(ZVktgD3(u_C7p6<5j?+()f^k~mn;5(;cMwKl@Wcq`v(o8SRjm18_k|4>FuLcn2(SOm4EB}G3ecG%GDEYi^7aWo06rO@MpoZ{>@E7ju+#o<` z`pQSX;F1xhj2{RB+W^GMgR1&krwkoi4!|wgf-Oj3Q7DUs(#e+ z#Z9$I)1p=494eEoHmv%9E0dZ#{%vxj@*$f3jW`K2#n=dSIs zePlzm(*fAdFw6o2?n|LYjtIqF@9Gt)EHeQGXRD`M3zjT=(xg5MyJz?I?TcrJwi%8aHpsWOc+p`p5q$ zwheFhF1z7v!|~c{@5j{}6YhwwPCcxO|#(C%VEgScIAjLOd1&#*y_4US$ z8#i^2YL9Qd@GTp3w3QuwpMU;EOifOz|GL}{J9q6g-OpeBd7L_V%Ey8*(AinRSp59; z_u|fdJ=`sEPha-Y;aV2}Jr2g(w{OSk)2CzCu3hoRfBeVso$r3f#^XKp$BT~+#h-pW z5-Yq1&kh{%`$0$Z4yPK&do`~9+AYUe)h{-yRmVEJ>iEYT!*Pd|j+3twN2+vKp3As< z$aB!TX^#7*uR1UQNxI%*1mN`Z!xWAsc;Vy08#>J?@3yd0Qab8Ex3<*|D&^Z1{M6ee z-Bd@uw~JVG;$3f}4e&^o42iZb8DFYDcRflryARh zrAsF}9)*|Qb|^>yzgQZOLw$CXQpUr-_^4NM?D#~E{<i5d{o;45fSw+I z9&qR14?Y58%6Pz2+gR$NFVyaO6p38Q zqB{x?T?jq$6ghw+W}cON3z8+vY5<_KLraJnFitD|e`=_@{axyZr^$yLfxGo@DbuVT zClcx(8{*7S@=CMgq{yo%627eKO$ubeHxl``{y|Pj#wuf*bp9EOu_f!V)O=v=P@FpO zM>M*a^PvTl<`43vl`(g89j4=7_&P^TPCCo=1m2>h67Gfh;{?|Pa;b}JN3yuK zkYhgLbn>k$zoPlGD!YL=9fLUS_*sJEz&Ht&*BZB^a&`oIw;#?v9C_kfw)3z!26a#4 zRU0c>zgCxp!{Jx*?9#)*=OeWefP*mKrH7+$V|U*2;<6oWOAF};T%5-NhvQ5*AE{*r zox;3=aFj1d&Jua>3iApJ!p|?VD{o1%M58nx?O4^#%Z^1m9&_j4$}&GB;;dWDG&Bl! z-q|6DPO8KDF4Yk}Nw}Rz!cz_F8OKwpG--SJdV`YIi3d2eq0xQPt?&1+RL&a~3!^dUHi@~Cw} z>OdmX)aLd$ox4|)&VO@!kf9uoGds_ytNcTl&DJPG#qKDf}EZIq`J}PPIV~z09XT@2ba}&Di1oV+$)kit?r^Awd$ojg)-`S?r`?cf&m|-I z15H`8Q%DB4vj*}CRc}wpU1z9mr9e* z`oL3ynMvd%<57~n6l>*m@JqRLh1*m3}F!4_=6gHTtH0yWt}^M^&HS-^s# zxQRB9DF_xuFJOWO8XOCu*FFT)n;&4L7B9r}j|b<4yU~941DP`1pu1yW^7VN7$y5Gf z>>F>s6;D0+L|ngiO$P2loH%|g4PP0&9Qj2aJKtD5F&cOm-Kq@hBS(+eP{vsBFN{SO z?n4+9`E|V6=wpZ9(2y)Djtr%KUQ|t+de6*Ed2wgA-m&9HFo40QG z9fjM5`bEd?gk|ZwZU-Ve@A$w4blZ3AP&^!;U%Du*+GFR=UGa_QpO5$7c|ZP_|MlOi zH#_ocd!0)$wzD_(@7Wd?FJFnDz5HH$_q)%=*w|iwL@NFO~>etzUb}ah-(_#Jn)cS(E}Cl|9ko6m*dQtGu}DL4$F@|{3u@d&I{6EDt7cw z#q8Ry_~g3UjL%IEnB16id%wn4^T_YqQ-4aLx`i?KM9`dA(mcgTl~LU@AYH&?^sSWn zD_XUUn1^2*?VezwA?RVRjdD5~)^fzQjbpT{^Qx+cT3lx1fiD4rv9n3WT24O!W$a#D zNWH!AKrObALYC>l6C)ozij1NgZROZf)=jMbGfknR53MUnXuylc^63&}CLd+K zK8#lEF;WJ=a0W-A^CjL4l*99D4!s(ANq*-y6!?O zLbo{Y`qIgVV{%1pNar8-%5>1->`P}|b>cZzu)f3u%b-kpE+Mzj(YCU?54qSv>Gb2B zew!UfIo9mjVh5m|JDv}W6CqDJcq~16a;{X{hjQkOoja6kJfOo-)7g!~ugmrf&bp4S zJi1$t?{YNQKNw12x6130UhwHm$~i@?q^Ywyt0;#)9YVq}uZ+i0mi3`MwngP7WV;g3 zxjNoj4mg$9d`%NKLzPnlG!-g6@BoeSRfoz?%=}L$op=;*YWv!^0P!gJcr7+6mx++@ zv171VFLTF7*s)XV5UZSa*amQ(0`!45^&^2@;@7-bUg}G|)~(<~sB|eSeNK$3i1Ap7 zsyglLkW)dvuWzHxNJFN7m^VnCWSO6ND7thw7Q5VImvlMajIZ#XqtI>it0WmmJ)UpE z`3QNZ%2hME`A0nKA!^lu4Z)cQ)|N$ek8KLCLju~MHqsAX?-V<@9=BFm^$BI}FhtXC z$wh|JE_1&nPs^SmID$_9U6%!jp1u&RWsxs)%5|g;Mw2e}`r1Qwp|_ru-h)IRD6Pt9 zyUUBLjhIrE!B^|Hj2b+8)}@Ihx1oOtfaNI8K~lOFRszZiHCxhE4slZ#*S`UbcfDt9 z1lq0$P@lN9%JcPTUsg3#eOw4}Bkxe!S?hQEO3;7zH+VRST&@1WBUw(X4qrdWFEoy; zgRs<-aVg&nt+Gm2f-7u3=R(a zqa*CF+r4X4bqvJF$c{L3_LSuAj9sJD)m5CB9D&{89fCV|j>O(EzD~Tyj<^dKFZuZL z*xtSBk~Q}YU)byJ8MNuXcXT9{7N+9mpS>xWJL84#elxCI{?bl3`iLC|d|ZVcfH$w- za6554V$5^&cyf9wmi5rHfB$|Pp|s)Zl`FANd5->aMA~C2AjTl&tG|o}yYo0YjRE-i z#n0`Wqdgq`#c@Z>7+~B{HZ?V+u{-SJ!8Qc-(9+j0etsF(T;WT|)W^~3YQXdB8}i?H z;|(8W#>x0+f5t~cPPvb+T)z`9J~9~p_ML4JJ<`*5KpK{r(cDoQM@(BgAJ1IpcF13}NggE=?TwQl*{NOZ1ZTd?1>@dsXf4lU_uZdEh3|T+et6z#!i+67skG|#M zF)b+cO>s8D)xP{S8c?1zS^A86iMe)7tM=K^MZ3CH#4bvBGQZ)#qaPS2XwV1UpnYhpZAa zUtJeL!hOB9^6ca3$Uh(9|+w@=las-M|SdZIkD>1`D_AuC7PP*nPtMGL)Hi1RZC)Id&9s1)3GLt0KG-#Fip#x~~6$Q+n#P78-?myv^4hG88P2 zYejsXew@q*ZnNNj*CO*$Jpx@?C%F5X5=00^W|oD2_h`JJr@= zNo(cOlJ4WmFN$z+MfXDGT~-``IQVd;EiR_>%scsX&-ceNyxULdg(ctbxIc2-mUvz? zb_^=;!(o0!S7qQ9=JUry^UlW#jy)WFtINJWv%7i?2c6bh9Fl8VXYC+d!Ks%HzH|t3 z)Hj`jIP~n)6P;u6z@Lsj96%g*&fR@DO4Esx4jdeIWO4YgZrE|6G06ANWxh-b0rU(J z_ccP&nnZwHZb9i7OdcG)I3{@b<*08u;L_QLQwE1$yX=bY>I76da!KPTtUJhX`~cJe z4Lib^Bduek&}i;eT4o*29X_PS5n=SS4C|YEXFqU@<-U_nvu0e&vt3D3aqts1r;%-X z=n5@R>#OCdZ|Xs)dUMTaL_80e=ge^-eH~zxswqn12os-hEjcE`sUbY+8Vmf+N{>Gd z-PT~0x|sp=L0)P=?hquX&xGV?J32!PF!q$@`}Atac2w~EP`Q5u5a5JOEz=pt*fF-L zJMxMICK-)ey^CWB4&4cP^`b=A75Shpb=X&GnC%I-#NBTBd-_29P!#WkzHk2Cf~; zRhA!Ix^gqjm2U!$CPaZOGq)XnYLZ6vZ zhMdwYib`>oD@LDMPPst zg8MGBDMMf$#m2c46_lxg3xG1mxi-+R{P%cKU>zW6gsMjk#uL{x$&x2_UzK#l6Ohy5 zt5M0DFUOdWe4C)i+HwGH!4_=6CSY+Wi&3sD8}LB3(&b{3X$2=Mjz}?i8y1R|(YR&t6mCt;FyB-izwD_PBQSYV6y;S0mOI zfBL`uZ}IGN&qhygj~$>mLTT?CzxY)gK73gHwBTXm>%j+w|LIR&GM-%u82teKOJCDp z=)yz5`yYJZ@q7G<$L$PcjILe3=A+4z6H~E$`-pc3a-5eBnD_|xwr&1EOGg(Ut6=P8 zEKByczx{&xVP{;qa>Y(U>c!B+;rOdxz7a#}*Sh17U5zik_+s3jnu@{h+34#Vi+8_N zOFLI&hxJKYrQ11#ruoCv(^KU-&Np_=88p8-I#uto4NATsj00|6df^~i=N)`}MHoXu zbF__Pz*w^D^i#LeIQL|*GVht^qGK*c*PwUud6%4>Whz_Ocy{*MF3IaB=d3?W!eHWf zvY{$~zJnvMDo3_IJVHtVhoub+$x|L<+Pl@@_4^5lacbiHB8_$!n-nRJgVEOu0p}h# z3}5tDj67m=Ku;UU$VXT71`keY^Qs;@wUD8_=?jnL6&dIwTpov|tkBp2t1{=&Su}np zA3TN5dYAfK4{7A#G=!%H9EB=JZ{f0bAAw8eSoQa|?zV_w^#IGuk*7G;*B zyyM!J@X(J0=oCX!`@sDMo_R?<;6(#Zty9U&Ba1w7HiZtjgG?^AIA1uIW z0@Z7ZIc;1?^RoF?x#qN;HcU8`dyRpPY~?R9eckb3UudgLrFDl^%qm1z@Sx5+0Nct( zL)bB;G6miNXh+}*M|*Xzm)*c?E&Q%PExRjr2(o*gqrPjgsQb*)vT!*5aPBEj%$IU; z2(pt82i!c4yd~jVyZqSQx9nrRE`w*Da-4n2D{UHuId=a+N4erj?aX6WV7}YW4#MK(Yth12cJ)E)51i0Z>LYMC39wi4zEkc2?qB8> z{S7T(CJhOFow4sP;)jMGH8W2cOa%INV|RbDCLi>Ckrl@suS4+{eHHBB>*S+s`5wP+ z*%I*DQKNe`Yc38SoIluY)}xeDW(Shf=^)y07Iq3JKH*&__kHPMUi7wRwUug*@YU(( zcBy}Gf{|`I18du|?O9I!#NaE=K|GbV$q!iP!c#*!M$w8B6Qb4p#jQ~5x3UU2IiYi( zSTqIFM`>glLp`M~*I)4bEn*UK#EBHA!k}u$1t_k zG~)xHw`J+Ntw(xMs`g>lm3#oQX(yUw8a#6&$2WHpmVR(L9hQu9%E|eW^@3*(Xr3wW zU8SnOXr^Te$D+ntblLaq`7S`M6YM(njA_{mS)cx(SiwOp6NIki z<|V5%2|QTB<=240l`_^!@j&i!@KqLM)`Kx6Eu`~G%O158j{@jwef+8S0I$!btU}Sv z^#Bi)l~CK(3ZP0{gLNqZsB|Tp>6$4}`vSDvL3$(P+=fJd8uIPjb6+VY4G^{JZUlg1 zE$)LFYC!{xYT&(VuY?K@$W+4lO?pG#lGD+k)sO!&P98rRYb(=n z=-__82d}rUH|~xv#O13~aq-f4od5JnT)TERE?>J9moMLmix=<2m1`4m_2!fen~qqV z9rq5ozJdO@cXvt;H65|E-W>x2JLA;pv%!(7PtSkqcM9TQo1b5e9Xm(j+_}fR`|tGW zlYXDx!u&#FbEb2las0je&b#r**)y?-QL3@VFyyPi z3mVV4nc4WC{`DXEJ%t<}^{#>F6xmAb+%e)~#LqtWT<~teSAO?{5c@rIIHh`2=bX~)^pgx3BCfk#4@|rn3tBx4 zGI@EwAae3ubJQ!jI1y0}Cl?o*`U^Ua02?nEc4%Sr>Y)TZTh}tX_DrWVhO8iWv!Sd4 zWGdTm%n64~+AI2epa(_!kcWPvLl*6#dSu%Wq8}-PR@biUD6-r?gi5D2m`?ppUqkD9 zh2xiam!S`FNn18C^i>XlzAAWhbUMp(ryn$mp=Y5m9eJg_aDao3P-PU^)))CjuJr(4 z0(zQO<(qIk?BqunN|}vy$@91%5BkK}iRU_?hol&NRBwI-6}b#3M^MaHfRvwm2%Dke zYV2_rG-)4(dzdWfJP(M!B2@UbGW~fVzgdp{H1!|=HBAF6t_dz{#1)!pfbwPln)Pi4 zm7&rD#MV)vNso+@&r45#Oj?orp`d{iaDQvbF&}vnX3m(pl2yR9O}@~Xz61+ugo<;y z=9sQ49v^Z(dSa;@Jo8Lx%{}YmIaT>I-;LXtt2sxZDHGCVDaSi+n)0EmeAY*?Wy8z8 zT}@HQqrtrIPieKyUklcN zSoX19oP0~I9e}wTkUTp8izCnh$KXON+ToYZKi>UUkK*FgTUFh5d}u8EzBt{-xIZ}^ z>CEFE;4kqCk28>aWeqrGpdp=(mj{9QfqeSKvE@-f8EcCAT4@{u8+3Fv{Yyxv4C&@k zQ9^apfI|oU7am7UI$jtb=+cSTX~zwxFmV3iluNsbU4Z4?e<~M)9e3;!?Cc`e+NX8b zjveZi)Ow_sANr6>jNM>)&}$BHdc$(W$6W9XL52eQwbGKwdmw3q+eu>tIL5L+Hg^93 zHH{3)vL8}6V#+N?P-CD;Tj|la;^+r)h|qU&(X*44aYY~Dd4G2Mn%mXocF{M;C~ct* zWGSXi>}JE6SKC23ntPXN!4a4@#QG!Mg%cs;oHk17i&p!qBbhX9fDJj6!vmi7WLsM8 zEqKIb`}11mUQ~Z@ul-UX9lq4Uc#}pRZO``7ZfrfoGR9f1P~=#ybt!%8I@Difeq!4A z>%ho^PqOJhzgj>v%osidLRea54xttIYioz{ifCBQa|yLBdEd^oZNt*WbV{WjtzaVX zC6M+2AP=$nL%pUkLZL)n*DD_#ODq)pO3=m}b$~uopCin57dfPDN0eZc%4)vg9?X~E zypq<1xZ+Bv@UV1~t{FC$2|QPv&G7|a=Sw)swjD>29MRO5QmAai1i@|HNlo ziL_&Q8vSg!fMSn*%@-iQxi2>d3j#{IX04>4QB1Y?gez&Q4Uk$E>B?8~57e~@Kq+iF z0JmTZw%}`E)8g@vwIrcgptKhzg8zWr0N>0ugBX1Cf{}$Y4JP;q?FPP8zmq)B&ETT5~I6olyrA@ck}FbANT$I3p{?E)zfXCrVKNR>_=H#FcB(P zM5+{^F&4`!AYy@9uFjGaSIzb}+S}jVJ^2-vHiw2{)Cw&^k9-NOW zRI6h{cAe`Fpplts3h9UbGG{sMh;JG+`#;+jfBrh~S=PEm4xld3c+1$K!|wI*Z}bwi zJS2cwN`~5L=a77jkh~|o-Uu0Q0{FpfF{m{MOaX`Jbc6)I5r;ajBobY5& zKhezT3pBq3t@;bCwzi3%T+UIi9;VrrnYp+tDV21OnBiRr*&PPzK^-Pi{$0zG*z!IP3`LHF0{?|}j{4VLy12f*;10_!T1e^D}S68kev zC?AXlT=2~{Ik<;6@iOAzmq`uHLlgF*KwIsF;^Yk+d?sd+_*yOu+;Z+Ib~6ymi+J4L zPmgSChMo*oanC@LNgJ==OpOC_3xYQ ztgQ!6DFuO%evB)ztwUu%(y{CEw;$9jki_fhHAX?&r;FQC$v)Rr2H1Ea=`=n0CiZ_l z<_szsMab(SbY(6_cfqpu0N4Ov_sp2Q<}H? z-Tn4RjP|i$uwyeBIcs1rzbjd6NN$haPJ3YNZc)Rz5|8K=F@Fv)YpgaaB@Mpr=(GB} z0-NH7prLJ!LuYOclYx%BZOYJ98uJco;|B-53eAbbiqgbS3UD@qE*eLbBaII z_v%ZNvvX$<1J`GWx-f4pBz*<9l6?5bJk420*jb*Um!nueW*X0An>CBk>+umt2pWu5 zMG+`#7#+VIDah2r;PCLfeVr(_InZHco6fFb-%Z7jvu+*oxc3<2#oiHE%OmfR$@Kik z`;0q6dRzRmP2Ba#M6ob`rbq)B1+R2+P+{ffNwG0eV!6FKCh*(MKl6-W*=3Bz$K`mO&B zf_+aC4gJ{7@_<)S^OUuJTD>u}_p|$vhum8ykgmo;QaPhdI>{?~*fk;oNa?Bd{1ONF ztoQ2Xq{^7yr>N`|H5)3?X+-qQ#p`n+KG#n%h=n3!tna{RFmb&uJ5pS#mdEU42@hI^)RpY>T&>-hj+J%3D|qN&4#dC;*!{#3qkw$SEDnwZho}+nI5#T}hhz2;xBy{;&P@ ztogR`auv0=C#w~+VHb%KZX}|czpr<|&Cit>nt_EXo?U+KFAE`O&_Ca>tl<9@*Bp|% z@R35J+dSE`h?ai@w?a+C-vVD{jPe7M3W z9)aKkyySZ`vHc_NDs%BIxP|ttci&iDFlF7(MO((;o&C2^_J25((*elfdavj5f>UW< z$O?OzkFi)y19k`;yQW+y`>;QsF?WQa$QUi|KQQVo%pwkEhx$KfG1Vt_o5|hf2wzQC zINnWi6`%AwZVx|tT%n1^14(0#yPS~R&t`-O#3WtYojbQ-Jq;XuV$L}@Bv(Tu8}Z`N z)L>d(ZFys1&D|b#Le8S@N((CFpvTwixf*6eQ~sGYHB}(KFxso>5rm*IMpXN1YKMHg zn*2h~!NE@WLPM~O5YYDqG4)V-+|Y6s5COla1xo-r=BiP2_V;{79xFH}j`J4`sHK}h z_m5AA>qRuDzv21y@2>WC1A|7F|CrJ0PDz^h$kGxy6e|9=W~kvnIN4`?yG$6iYaa1! zjsa8+e}>8o!SgcRlDAY+S_~Ijd>m*1C$;P zZfR!q!Yl<%gK0`RJE&P2q4#JXTy41yZ~4iR?jh!Ndus;s5{x?7iF|T^d0%(&(svvT zV+RGhHc88RLanqOd<1IJAft|r#RIbEMBDxfq#m&6tCDOC4hKGD+Sb0sHBBmK`lL1c zJsrZ82ok_V5bti?-_t0&lTrk{4skQYd9cj%wugcX6+0uqY6b!>n&&4|A=LSzb0~r{ zEy1zBZ|7CU5rdJUcc$`=W`~ zVCL&rhtGb>YT-re9PdI3M|)hdu)e!_Q*MVdLkjH)z7ziw8wxal64JQe(O7BK}d}&j9Ho+n*%5t9dp11 zQ_nY397@R(Z<3rT7heW$!jU|q25al#MB8Fhz0{3crKSPy`8w#*6p!=|Dn>hhA)yQI zn$P>7oJpH%i=QWf8*J^oJ*Yy5pAJv|3@^8?!MC=XKmq39|9fpj5fTsuyScG*@Ujj?ylP*2a& z8i+LB+5Po7fV>ps`@GA4s@R+P2)77y4yuxv>t*rWr!r?Tc1@TtgzOl{iGfIdNqZh% zcl_FRZ~RovAjQg5id_~QAbmEA7oSi$m;Ipy?Ft|-9oF{4^K!wqsUID8alTI$6VUP9 z$6wj$w@AV~=DqrzNR@Xn4`q9_+YCSC9U#BOr{{a~V+eAgwKqJ+RfX~Hr8JhILL;vb zfl-?%hb^1Jlt^bS0xTR=&>_u0$rnlz#>ukf@f}okO@loC#MszZ_t>b&Ln|(OPUtGN z_Q>H;@{1j*l{>BKAn!=`J3OcH(s@v2gaf`d3@zv`Cn@cZ0dxr1vt&-zOY_#=_vcI ziw8yqzV`Oz@oH#TyS>fQa`f z#3G@9MlpPhx8Bm7h?u0SBn^8P(KanU%kt2?6z*M6$$N`$~@ zL2koB`^=4d?pUkabTsro(FD!T4IZAmrhxr`MyHD~cbW3DfXh)!?dEI7+Yr?1Klhf1 zi}+rexj9R*K`@b|8u!jDFwb!q?~Ls3_U4Nv$@k z(J;j(HyXa&mzM8n*R=7HPx5;Wt_-BoQZi#Eh80>>S1_?KF9aMZmwtpK2>c@W_|FT& zA&O0V+F%juAH*tYUTlY#WZ3zW=9`blW4bsOACh`&R@!2Qp7I3o?}I->auf% z=F(>x9P`>p_LfrWG|?ge4?`;5{kr37R$w{eN0kvTc(mQ70Mmf$tBl4^cvCP z-2+}o9*S1{g!KbydYSb1icF6Z*5v5BjPxmm(-m*(CpCHU7JKmyw4bfF!L1(5@Srfi zOzEq=!R;dxIfKMe0z+YJXYH7lxWdZBmzo@DaIudG-v~zw;;e5)cSaq}7}$TZGBC5n zeh@jCeRZ8%5q8Ti&KFZ1{8uCNqxRVi6TVyUl5Ji|&6$c@^wQZDssD0izuT;Tp6h^% zUd9Y%kKC*k-qG`HmFxV(J84_c#jp{q^g>SB;W`xV{@{Owl1BfykxakbA16qImY@CT zzIua0pHYQ=Y`8E62j7p3|3;Ko5q%(0y$ct6Fg*JZ$%TxwSSkhCF}c_@ueGkf%12E& zO3l$8c>ZWk2JgP5|8mas&{m=_E8CEd{qHYK0QYaKGMD4rSv|%tv!vd2ybv)qq)5cS zU-#VFnGAkjLzMz5y4EGDj2XIc)$W%JGRwZ5LBD@X__r`vf~OeE`3IMOk^bl0>6)1` ziAlc^hro9ZXl)s1+Ry-A)c;i{1<7JgA)n4c&Ya%vjx^ld(bl@b{idJZo6zOP75>0?}%WP?XNkWLaKqoaSeigptRigZ`CY zvlzRn82wHEy;>{MCZ3SgJ+9OJ(O9m9gb=2**0b9ML%dZo9bgg`^pu#IJA(1kjijfN zF=raQF2z2EQu<;x}DMXLu_txVp)+8Y)ME>WLbuMb9W< z=&t5`GnB(zALWmY7s#`jQz0uGX?H)r?!f{Sf;M-0Zw~04+d-Y_#C z%0M73=P;pkuiG7(^Qp*0^eigm6&|J*Z))NNi<2)vo60mE{7pW)o7VoJJLot2)W2Bg zaklyIcWNULjek@Fr-pg2k@Jo(0kI#N(0b0}0BGB)zYaCn9l1AkkvY0Xno2+I+Zt7; z4Y|?%A24loeodvb2CM#WE;4B(LgyP zhtBQ10^hG>pvF|h5qQ5Ab@YBmzHg9Q1sl<<2l3V?@_5afE*BR9!~xl84~3On_))v2 zA7+oE{>aKZKII7EHBry0jLj0j*Wag$bs-w6<$;Jc;XC=WQp8*ZLpW=(V3q4Bj?u|a zSkrf1HRL|S1P8m9*tCLgm12&rC z<;?h7&%`n1ZA(3k`o`5QjCUP=IE^pq<90j%&RQh(H6Z1w8Q5xww%G!yBzE6IMk(c< zc1)P|SmL}4EOS27rWeLfVZv})#g5qxZwzwlK8^w*uZxMCmEL|T#CZ3Dl<>twWsPcE zQR{snCi~QcU;FOxvs0N)Y|MO7t>jl=A{);~HXkw3vS1q*i*xrvUoRIfSB`U6j(l$~ z&>RKh?ZxnX9)Fg$q4@9w)kFIg>jKgReoN?6(}$nd?y8W^?MV72McGp@XQ4TFzDA)A z9Pi%3@2Zhm_~U} z@Tq4Tx22q?IQi8C`BS-nTn=5YHKmZu`YlorC6bmdUah!)-LA$0dd=XTR=?T0GTnD4c%~X#Qmmg|1$C468?pVHz?7Qw4MWQQpZ(!v+`;c`7k4~PX^NR7 zAPoG!S-W;DOU(K8vnMRC*4uGjcR=6nB&^hhcCHs56r4%2t`*=$I&4p*g-wQtAbdT) z316JIywqNS4P{^eVzgjJcr%yZTFk2|KYNbL(L$BtFJ^h0HVUBa-cww{yM5nP2+vv(jSc3@~C$HtE=oRB}gZw=vBYhcv7{4(XqK z*5vaa#(K&J@#h|XQ3?w0!fw`+awD)Vl}!4heH_Ls11%EV#-laybKl5vmzBxDm{g4} z3M3l`Y7z`QQqF(K)`wlvbBR@D#90U3C;EZa=1JSJ5A1MvHC8$L@o&#;v2fzzYt8;I zu@XY+Dq|v0P$-8Tam)T{qY0zjBZkHB%YQrxowsI86}f2+B80jBqDW}%YZfONypl5H znhuMX?zPa*>3hM5MX$YLkEp9B=(Wi{16}y{x#0Un22R$#nb06i44`r;M`B9^OS%su zl`vyOg|zE>6F~>FJvaSUo$J{bdT}QmT;#i3_!=v5_Pthe3JYl1!*T)b?cF{)f(LbZ z9=SCf&sbUuf1(1W)S_Lu1OJp{kXFKssmk>Nbgbt?tsi_N4rwCv(Q*q2=tG94e?`E= zdz}ovdOEU20VH0c5nJX;?zejl+Q`*=y5qx!q#0dc>_VAy-fV$>*{hC|>02y2n4v4D z*q{`!LG9*;i>ch2#%_4liiz)Z;DQ7AZfA(z+2`iEm)!B7j}k=9Yv@)0SWG+b06(Ea z`i_j~ZHNZ!y|ZzBNx0+$i70roU#g`Hj0wSXzu4UnhMjwG7IWWC*%IL`#_|gY(4x1P zmqP)!f98a-TFD@@{uME4uzjQTz19!`Dq%u=MGcJ$7Irdq^v{=A(9*3ps51`b2;rAmvg(gS;1h1TU%Y8 z&{27av$8q)n-c!eOe^etKN;nN6e---6%(OoCnH0;)#3C6nN$Qq+$u&X(rnsMmz{Mhj<()>BE|Jk+0nSbNYd(gmdE0`3asm#QL(s~J z^-VJCRBC9pM-xC{(rLipjKHWOo^vB~%MtPvw~0`;OP@W6p9KH;8O)EnvY}!QBW638aQSJ9$P9yqkx5z%0OR-f^u4V7wZL35b;@sGXxcCS4lga+m zPk~%MGah3!KL#EXj1=-B_U$)Pg_PSGo}McpNTZDQ-;Vw4?+@JzNDwLZ8h4Pm|8?}J z5AT|&)`?@N$-ZxQYA}t&ug3Q|C(atT%!+D@uVnA}w!1H=z8S`bbWwy&?;7obu zv66f-0xaPet4bT*D5;4oFM@|X3mS6%lYp(vkqdksgt}!@Ss=kdP5*2WVP1YP(s^Y| zpEYhGLZBQ=nKs3sY9XfJu+U7c3fXwWT@IkaK>bHt8zCAkqbCg7W-WBYCp8~NTyErI z#66B>e91rGW+zN(>JV)bQh*3!mgpCS5ui;N!of5)#D@zMYa ztG7a#jG=UjnH9HVdh-2!69$@*o87ISapS)5Ec~9cYsnEX46mn}yxf@C*1r}`_qx3K zot}z*p<~hhBs%*>GRvXV%R{j!l<6~LdB(V-Lb9b6U!lXrCUQ&VjB2yq?wSZKDhIm$ zKe|S`=Xk7M=C!9AdPL73vtE$AU3~L%%-#-W6b#iiX!iMU@K|6rsOwvdykmFMj%8enr~(Prv5dZ_{~`+F^<2%|2{eYcBlPeq3^@#2|dkQbj*R z-219K|8{qK1W|Id+!n~o2IYMzB0J#y1l#g%F`LIb^7Zo*cG&i7IqX+k-a~gr|3ZYU zjh$t5<#&f6Uzrt|vGP%zI}+o2R&>jM4O#!Q+1sT^y;g<-oN+65N2H}}*HJ0*jtbEu z4H-(82v`!9IBKd{Jr~NNFozNiwSZ>`!?Le`4~yE>KxcZmO$;A~x3fBq9?lx>gwr`_ zC!a3}nbU5V-W)GmJ8Xa^%hwoaY}mP{<$c>V}UjPN1c~#tw!3ZKE$U z=r43bM_68;yW1M;yu(X7YCCWD;P2}VllwIDlU1*ngmFRS@K^`=+Bc>_lAjM?;?Y-s z4bjb=`vck%*OyH6#8(yYJH!mHU*CCR)>VaCVa9o0w8$y3+A;~xN2B*Y-=~yKzB=(L zW)<7y*|@1K{>aV*`!W}dVJ?bde6wKF6j$)N5Q&fJJVnn>Atvu&-pg?f=u0*@Q<{GH zv(;JrHKMaFT&8U={4qstSpc7EWW}db0z>k`4p)>s@wMT5B)Bq&#?$;eHAQ*(9x3Nu zB?IF!KdY>nZ>4!$n^JdsNV-C1?)ld({lmkxe0z5yCz}uC;w?W5>;CY$Ij_)|mDC!! z$OUJL&h<<()qQ|om$h zk+iW^YxDj{A03oe9z4uPK@U=$>qT$J-7avHIeiDPjc~s4ohA?~yL84`LRO5?tbvJN zKS?C`ifHn(P6&$HT)A>B&apsm9c%0GDCQ(y6lYb2KK^Zk7BYH_`sWldd-W|BKSYZ+ zV#Wn7DedV%_YAEff~-Vt`$-cY!vsK>@hEi0rwfvrR=EI{SSHehu*%xIID_c?MMJg9 z%$D+o3$hXqMBo+OI<=ywu6p6DX@19y9sIlGJMy#N1HKUTwaxr7lb|f?#(b2N-cgQU zF}7_UL+*BVt?8VRhfXM0Kg(sDa#|^T=q25Cjp(&BZhSo?7FJ8r8F%u5%4@7UE|9Xj z1T4`Rfc>uV%-#fFF4Hv0ilb0HKvq%RR-Ex*FQh!cdZJ&n+Mn79!4=1$X6?*CHF*89 zVzD;1tF?8Qqnjh{a=cREBS*a+F6p!XNHZ(uNHiZlBZfymWfeK!U@~X5)@OVmT=9w! z7`#lmp~GyhHxi9K!@<1@cntiG8Q?+Xq|2lUO~GiU#f}G*S{7sUGIl%|JhIiaX>@e# z+I+ArvT2U*t9;T;_^4JX!f)d2`<(=W_gMhgJxA0kom};Q_4%cjI-hpg)y-CRvCQ)M z1;*QPf5qN*L}tlAPL*T6IOs9slSHAz@NQS)IiA0dqAq6U%Iue6snB%;g9fJ=+{?i< z&}#S)Pd5UdO3Blb$-UPd_1l$}p6|tZX{)ynnpXev?&<)(vhw|r2Df26KWt8D{D80A z;drCra<;LMIB)VH^bXCC+%a^Tf4j>qu*eW%26um2p;tnrF;{wO&+H+aUoBmC3$6M- zBEVs5C^(874kk-P8kCVGH<0r>)Zd3!GN>ymE^b_|uUVSTMKzs-Lz-yKyyc*8e;_B- zw<27Y!|QykX`sX47S#ypaKzt(vdY?ZCT?Ll>P_nX%s@9Ao4=F}fYqMVm+1^HjY7W= zgETwz?_oPRi9TZ0g$*bY+1XB>Jt9)syONQG$8CZQ7G;K5%)*dUafIXErdIEER8j%$ z)x?Nd$Xd?`ljG?+{zaRbYZM@1!V(3~I7VJIhMe?maGb1!0PDf1qsTjK=KIAkjmxx} zCC8;SVb^wa^~%%XLK8Je&VAOzD;fpN_(saHrvtw^37b^FU&6sC& z6H$HwZJK$T5N%{%4xubXZuOd}>W)f-JK0~{MXqf`Yk!QcDX7LAx;miFAh>S@2YB$2 za=4mMDB^Ai4*x6w+PuoV72nFlVJTgam389J9bs-VWcAXwrC@`k`D7P<3)pxWdW9)g z8zTrXBuuU>MyT7pT2WHnCRT4et^3uvPAG0Yg;YJ`Mlj51-^Mz|o6Itkq~oSbR2qqW z$Y~rX^o`cP3vb0jh>^Y}t!#P*diPw@yjeYQFOjp=bKQ@L-&`{(N>N1hER4Qyw(jJE zdS((=kq9*b|5ysn#$)w_S^`Mz%CLX$A2BSA@b31B4d z+^QxZ&7Xtzty$tJ$l=iyY0hc1dSFPP0A~lNEoOx;1oVeZQGPM)u_zpca#go=*tHJ| zpsNvhg|qKf@s!&pXtr(OZBYUsoIB9C9kDw+7`z0L!5h&kdZv)ba1Ohu^=(S) zNSzUCnOxm7_8neo51+RGbHB=?8Z0<sTr|~3U);H>xT%8}#cAlh5;Gfq3#*7JWaOKPAfxr(ckl5uQ4P8s2qrbLS55>rk zG+&=oLKHBnaQ+5mC!DG^Q^N){PSq#f!P(Cy^Rr(ZD-~)C|J?Qn=8)91E?=0?9bNy& zzxK4Hz0gKW-&* zp&887eRN1370thMe>$?L4w>xb2GfTfe}b&d$glx$%=rR@gQg$4bVQ2pB$SnBKP}kd zHLg0=^;rpQTrBua_j#vQf<}IF=Lr7x_)Ynz|USF?mJorVA4=53xt7sb-AmJs7LM z#JXs&lmZ!3PsbXLvr}3+VE181ZcCT?Q`VC_0>i10 z80$}h_B*b!(9d#97I44WkNW1DUL{`tAOYtCcjBI(-Zh<8s(s39vSTh@`ywLtjC~X+ zalCS&XUn~2(U>Wzva|`ur9@8i#l0ql_p`A|3dft%$tXT~iTXWT7UFSIaCqqKVIAf~ zo|iZ{TlsM?Qy3;+_%P(pJO9)X%VxO717y9dGMW3YFH37H_gs7V=e(9Lb-oke3#mzk z!CDaK#^VUfV+hY<$%Os?kSe~DstF`=dTPnxS-&iDc*iYdJ!9sJ^o&1tf7Ph(TmCvc zLHGS?5Oq7D?TS#>3m(3`a9=xtUadB?+}**Z7N?t=c*m#6kD8uf_sd;NkvUym=yUwp zNpw`zf1z95!5ziouybl(GT$fQqx8b{luw0a2(FM2f2MLoe_dTt?YSq6)qJi;{`~yB zZ@c}4bX0^KE%trKo1VMJ>r~N{Y%yLD)#Y+P>=~m$(=#Bf`<-z|hVb#3En5M)$GC!Qf8ZD53a}+m>R;vt&Y_ zXCHBMHnN0dUqdJljjw>K+FIe}9RKDO+r%z2>0Zn3u6PDb^HJQZD%ClpV|Owtbj5aK z0HionPs6@AtlaT4tKTAyquMLzXcwJestIBeS* zG8Sm-eO^F#=knl?n&5uy$^jS-l&b-#dx5l@oJ%U8|J_a;+8q-ZGVF!TdCVcc^4mt) z;l&Ki{;OYDk)R;4-rLRdN+wd<iQf?qt_XbGXu@W{C-zm(#Y_bh5>l8UH22aOr|SXJ}J36P>Oet zy5wb57q4xM$HD$P`%uc+j|d|*Jz>%Cs-B%}>opWX&Y66s*Mx^e!W%uWwDR^XKuCty zFSzNXzfV`Z8|%TPZp+IQ*_|)Gnc=4WezLq!gz$wVcv5@2v-4H~z_0+jm9<6QA|ijo zL2p9N32b?9|3*w7WD)HC;@o^=OLoDr86r&&eMARP-J8#lE&V_o+bMxz)L}7qs`k#j zByM?KUJf~ln&;DBW6R*o)fny_lU5PAW>Fb=@~PIQN~}uLQ`Z=u0p~-39b;@xMb|b$ zRTa^7^^%J(WKsC3KF3u7`-I9`4slbUDVH)cj^)mFzzWo-c}S6DureV~#ro7$o6*y1 zn*)dwEX#Kwulb_P{l*go1inyXnBN;A7qK!*lc+*|F^|>4%Y3fUyiUc4%#r|b`c&l% zAZR}IoDYILegsm}#-R_m{D4HPD&XF978rb+i>ki*jmG8$9OLgSZbHQtA?u+4D8NS@OA-GyVA>M^dSGh{EY(Znq zIlpo2=RVHP6(u#VBF^!Hfx$FF;`C5#>_EP-1oP6XZusLV&!4;op2v0Y{ipk@r+Y~E z@Ud~k>Bf2)FX$t0I$AxaoGP(4=v2}FRaIV}UH@h69+il`)A6hU9}<1R=mKTb$V3xW zZ0yx)XPFr<=fezidTz>AeCB(vcKD1|FNy5=hso*bW^^*g&d2M~$LDq@?$_Gw-0qyZe7ba`ZU*EuE<4EIuPJ2-& zJdZbE_+4!53HWKGCDiwX=c#UqY`R(km`I%-{VS8OOej63Q2p@7)4fVUtLY8m$Pu{kPsURvR&At3qZL9+M z#6xF|M*kCrlxG(Q@(pU=Vkt|l8Ax#n*&~)stS`v^Iqq?k?0)M=(~(h)`=-bvN1XJ* z~%Z)q)Cad1VR5O9D3^LMX#f^MxPyXiDVO!p8ga; z$?v-=Sah*XUO6Nzob#xJalSluPSKt+rBD| zQsga?woSEP) zZ-idddiip3tH>IlyBj~>q*RbOho9rE<$FsN3{j_n{#15+|Aw*gAqS5>g>6h$TSP>n z7zp(5vt)G=?9ac(awV}FCQveRTvr^Z-+X*Y0k~#^Y?;x1`2-DGOE!PAA!YhVgI9Un z{_POY0plXN5)dXp3h-kuy0i?U(j|wm7nP&$bM?f;etk3#)`OtU{5-I$*z3Ozn!Kc8 ziXMJOrAfg)WM?%2|D60o`ldflXBHf6@kq;`{j7|h6HaDMP*8GL+_0VlU17AO z=OkNv1?zWifdD5vT%+r;OxuPVyRdQTz=43DXiKh!N_tGz0yQ;{&nvk2rH8@oy*gTP z4`l$k?ZP^Fs=XZIvi#n(M%GIUy;}?v5)x;~Q>KUC+=$RcOsKBIe!OWbdABGemrknm zI`36VV<67jv#rsX^ub(aW>YJxX_Q4s4RQDUy(#Cw+2Myp^28S5K7KSHi~*fYJi3;q zVo^zr`0wOtC*$GBadn-n#q9V#PkVJko2PsA{^K_~12xd?fsfvpv_(jIzR2nAbe)`e z=Pssy2-!}DH{Oh=Fc`#wuowXf>FVi}N{2I5ZU1~9d9}YXY@Rnaupf6CD={ky0wFxs zMz; zH{O^inU?knYx&NOuo>3gkiYvgb0Ji1-?C)panYwW1V)Vv1D(ph7Ka_Ucf95I$si(UW z?P94tERRT<8-!N|d1c8xyU2>&d)XaaV#;WmuFfjWZB3Vwou#7t31ZdLu9S54Y?NI) zYtDw1Un_lzNPdI^_|*!&p(}Xar^D^J!ZB#Q@|UQ_UxM`jPuF6&24HJ?{Po?Etfy{G z5uPYZiA+eR9ulPBavu5nVemr@o+L%QkH5L)JH5IhMSeG|HtoROced}ZF_l7NR7P^R z^Fl9FaTT(@95lXw9lf>AEyB3)s-HEjWiger?_A9K`4C8UM?peV)cNRdk)ur+YZTV> zU|WXt)jDwkoE>P*52+a}ZfOTBow0Z>|7U4=WwXCMRzHf&6qTh2)?9K>f%OEsjquU*KcGh$#8jI^H;~hkRvL@)6#e=Y*+V!Y^6=P3k^X1Ngn5=B{=>`+;(Kk zX(yOTGtsc+*yr01cl=8$438P`ROu9bs=vV;)(}@@h5NOKDn)Ft@{SKB=9vNpq1EP( zaG5QW?yetBirl)5GUUVH}yh1uDlSdTYZGBxZy z7Y_fjZ~SEyS?!Jj%^pGP&G`=LR_kC~|we(Bnr!$zmuic2dV zowQk1vs2|4n$bVM7~Cb=%3e_c4-O8?iHDC!VWr;T4Br@D4dtHkOhxA+p698E%Dqi# zX}6Hb5_Pqyzhtw{>~qxPlh=Z+>M1AJ_AwpJ1y8oHS9}`sk{8`^5L1>)TZybwJM@M51p=o{tx_vex%95#G2j%3YZTlZ8hz>vht-wp# zm!c@%!oM=E8mccuQf_Biq)ORTFa(5s?yptjrpJKfjw5Bd!_qoJgQ%eMJlnbVU#+5u zr(UpGt(=gSD4bzS&#^ZIWsx3XnEzdQ_7-9>Y}qImgJf{OTBg^^s0bW?$he&>E2xjg zgWOdMfHT=@6|l#3I*3K@vIqhXA#K>yhQGLDn)Gt=S-%F+zRdC7%Jd8U4o*9zzDS&IA#s1*WlNG%W z986Vey4k4yt#1w2g$=8DNh$`k@UV&k8wB!|hd>*}G}Po4=NerFsbRzLSytShsY-H! zT)d3$S>Q1v`6l8`@~G<8O|hNMk&NO~fyx6k50tIHgo;Op3tK8aFB5Q)Wyde@5jMw(6B!t|*ae-EwpQK=V94n!49By)(ac;H zWZxN<_hopE?5beH=!9fFX}5nBA(0vSiecl4b0KF)p2@0N{QvvTo~Hb$lFO&fi&Uu} zn4_`pud>~xI z*!Kd z{#^~^fc6@xnGvp~J7nPBXH-vh*7a(*ZJGN~`m~7Xs|@IEDA2C{JaZl_Y>c-V6i#h6 zcWjJaI`VcC0YDsC#SgSP6S-#njyGRj({eJ)uLGQjamiz4l#>Br(GWeC0`4x43|}!W?8{i8iFIPSK0?@lZG_0f@HLeQ>PU(9<<4Ag;qu2 zJO)W;ob?c|`H)4Pvc#LV^kLQ|oJlGU)CQgVok2AYH1w9PHh?cY;63=H;Z^KD9HOlz01T0HBA@!OR7@37UM!+8l(h4?vb&Ct?ju zWkNoRvL>u)ZHJZzN3H)7(4{`*NF7I#yV}>HS8=cE=~Lj?@_?@UL7a=q5A{f|o^|P_ zG!94w9EL-F51{(R&O@Aw!V%!HW00MYt1-~QI|EmvUv>A}F}N0kol1)a=U*T14piWM ziM^7Q?+;{MM&BG5wW16PIdDpI;jnI0N46iF3y>(gN}x8F2DU;~6Bpd_&O-SwIn0ayk|@(MVi+{Oyomi(hoD)J=@Dg`DW!)-6hSQiCn z`GcP7AF`%ZT775-pw{k;wWj+AMCioB{S`Tsxm;=LGfoMrlQL~S>Yh8&dU`rES9`o` z%U}G}yyBi|XHId7QGL@+*r3ZG65(rb z+XSg!ttah>O5^vfDR7^rJ=irtRL*Wc>gmA=Sjz20 zDrx2qCok$TVRY~gL-l({x9Y+vDc*DxD@g4;wLv1=xyp~njJ0Z_Z8_EgmCef52C zW)NUMaBLkLhOx3Z2OZ8a)yJhP9r-{8 zyE<_wGoSK(e+qtYBz=a1G{>XX>sYe$nDm2VO=URW0Ps21nQqYt>;zRnf5ydQ4vlz8 zH=RNN^-yO8Xicv)bf%|(KjNuQR`30 zh}ZT3c^X1_u32a-igALTJZtNkU(c|J!*4laW+`G$>Di_Am|fxHAUR%Uu6@9I)>@PV zQfGm~2mz%AHkIcI#y=KLhN6F!S3Gqgo`3pLf2o&`Se!n6Cf@kfFXHjX&gq`e5o^m!HWD%7F+B6w zL5Giuj*JZZtFsss7?m~{q()ZBukb7W$Ob$7=4NI^mmiDRJ~Cn_*q+_HeN+{v)`aTD z33vDIcwD=7HLhKsh)x;)Pd)KSboKPuQO6AmXC1rn_U#*U{VU6hF*&^ym%q3Yx9(hy zci#CTo_y+&IDPVT+`e;L_^BS8IFJE{rvdLK)Ah ziydyAtzU@MJ_U{*@!*IqX&maon1^T4*uK_39H-n;FfP?-^Y;(*sW0ZdyYbamUWw=Y zCF9)j$L_#K&OIvpYjN!8F$r0ZySMMflTSVofAcp#^*j4+T)W|~8uJC@Pd`2HcxMA3h|0sZ|V(g~jEVm>7?nw{FKfZ=R3$-hW4Zde9GEHWo#9 z{*zDaw8Xi4{`@C#NMp-x!PQlC9*Lh`9VvHfCX9shp${9@szWz!ANBPv3U1BROMsj| zw3spJ6bU=+Xj`SBT*13jxF(QCx@)71Ao|wBdU-HHZfn;VF~GIQL$n`;;WaYx=;Ah1 zynq-z45f^?MTZ;$X#PM;xniqZamuu4;Ukp1+f>Ukq!Uh1>LcPkYiYWu+;u<$J!#}^ z4)j5h>GC4aaV;Z*Oz@0#F(6Hoxa6%gL~4uslT498Anj~1IE(z$wa}QX@KkW#i9(|o zJwTCnT?Hy{lfMEe&jHbRzJRopENg;kHwB=?*0}*S=Z8YeRN#Mkc=Vdky&gLU+G6iO zI{Xd{x5dGsl{hrK;+=g52Ug+$j=z3({H?~A9eykRV(;$0^%(72i(SI+WM^I9YK-)> z+1WSP#g~9_ct!Md;+#Vtc2Kj|BG+j*LH(9Ljwq-9Olj6Q`m*Ve@R7i-+;x;cdT?Fl zHJ52g7c)DW{Gclya0F!Ypve8fP71|-r+iy0u^v6TUi*t<66c?HA1WTA zUFs{2Ko9k-2-j|Bpq+rw3D2%TJ}APm=>AU8NFF-_2Z&XUqi_KE%J(VV*N$TlhhRD{ zX*TniJ}_iwl#IHkI60VQv@1KTKJbyx@y()I?!SeOc}Th-6`78_pH@tnk<0bR|D9>2 z8OM~5fC8<2(U)usm*ZeLb-nYtg-mFW2a@v4W@kW~GbhdLwH&u4Jab$C#KaaikXl}48Fr8i8Z?nCAC4+dm z)>azMKfu?YLd^pk=`14viB36{#`Bwh9%F75xnpf3fL#}z=1{p7k{{aCBj4>->;v$+ zXXTfE)7D7afpj`Hxqk8^73u8T93vCDbmDOhrn3|q$GiK=HRzpv3OKy5Rd8t4cioZC zcPFM3vXdQ^=%ko60X=CkyVP>0nF5X@^>uaPG5nOHkLy(6l_2oC&F+~T1Lgo@8ZKYhnYh_7WzQP*(g@@Xz!&qKpFN8 zC~P&zgrg6QL!@b(P$*H6Yv&*7+F3Ph&Ra*}Tz`>eozzgu!IP!LbxXE0g^mpEtMwU5 zUzvt{iJ=2$9{n+nvPNjpDp)2w=t5mEQpP-yd?#~GoDou+Hd@b(O-S=j+O@66odESSn z1#WpRx+dR^r=R__;?#vlesn94nP!szsKYIXmf)_u&Wc z#kofxb=m65qK(b05kr6@AssP0JLesMk3DwI&ZMEif#~h;w?a7bV89{85n5v2Q#Uy| z?&GwF5AKWq_?Iuo`A;v$o;|zb?3q*1-`6KSr{ctk6S26s8q-tr(WwW6GpA0(^73?y z3=hk&TaCZ`@h@X}btS(2?dMg`YTUYY)9)A@zjrql=I8x&+u7+E>v8key|{I+Ew103 zimO-d#nl^%uaC#Io6~Xi+N8tHTeETF#zfq{GZ)uxOpA6p?%kh{>$hg&?!AS$b6>J2 z7URy{g_xLHj$5Lem|BVZ6U#9^xfD|~OEEpeyLWg9?uyHozl`DGA-~J8x3|xR!i?I* zuE?{GoQ}nXrMPzON}N6WXngtQMH!e~@yMfRbCcxbDHED6JGO5RhV$0-E3s|+PPGq*Cc8j8 zCFg34?%L&}+Sim`)i@kHu+KXONBX+s7q|Ar+^QxLMjP{0a?^<=<5uluuBFjXj5>e` zriUFTMC)TM6oQuw-@uD3^LV#nO&1FU0(q73faR|VTYk#QW2&@Sb+|rgDa-b9{ZP$js1F5ht965~=vei%AxKQU&=Evu zTuE0N^U+U~K|`JbBb4Ofrr;I1KBtjEo<1l%#uFF1iU&v9bvM$0>4;QM6W`Ru>si48 zt`psquQDqw0f48{Zw5$IY;q-Bub~te;3Z!I>n+X>ue&m!6?our-a3}JF>2&;eoB_h z+3nXJ+j`n!x2_wG_Z}L;>9?-18vBRX?UzS<4-KyQ$nV|(j`%LcXn%g8ceL#C+veSU zt1&29y*Nhrv4UM~>Wkc|trloau7S##hs+y01=vBPxmU|^-c@G+52xvDP+B+~4I2)@ zd~mg+LNNhaJ0wb6ABah3;3Guoyl~#Kv&;{$=&CNlxkd2DN~E%P4R*J;b}aUHuSI`X z-3_=FL*5z4kzvvtIcCRT;@KUD6L6qwIR=!*@dy84*J|{2tVnp7IA`{=*{~qT_vx zrUy*pJGLUOfAIO&;Ic-Zl<(8(6t&=nJO=a^I;xeARr7ff_dfT%|*$?2Cj-Pg&}=As1lY1O9&GAH;5t$n*GJv`*SeNU8P{yZdB+~tA$an>n3_()#M>cA46f!~ zhVu^@I1TwhO$w_Se!s6BX&hG-PUE|{yc{db8}I(JGm4bj?OkPNR{Ir^H(oS8va0dH zVaPR~{gZuaXN2;`iMRH1Jz{LMw>Rxf!t9>VD}$7=T1=^ zfb^&0a{Sltk(B+IKkBmf0+U81A+eN;DyUmG>c~WVryh=?uw8*jZ z2-!;0254%3Al{d-Ja6i^gcA3)T zZBxPzErse&@_^Sf%E%WSJgyH^DKj7W5>VNAGC=as2c8ecl|FH*%*hHZ8I5>zsC700 zd=tpS4{R>0(8O2z>ac7D{V%~ZB{Xr4lwsbY8u=E%SA~bc!`k(AfS8B$(Ut>n3$|bj z8c>&|y3~>zXf0->6O{{YgRasbs)F)u?68`;6fu26H%vWI$=Hj@ z+p)86D$bre7q_q9kRj9+JGSqPi=TcH=Y(SiA0Jb|u(ZLV8x>9`WPkF>`FQfl$899p z;FJzNQl*;^I|f(RmSc8iIu@6fy-U!>6pZ@s2f?l$$LxN)H$EQQw{Q2?fBAAQJJHTQ z`bhNYp>B0$K7RiCJ25!eqw=2U?;Z5VGA@07QSrUFaPeAP`t1GqZ~wc05uaZCBnJ8i z4RQZ^XWR`@Ng)i6*tj@_8o0V}q7b{DXvA!}J%ZoFyx-=Ct(|2P@ z@%-#~%+K79g}KSNKYm;Id(o+J=pX2bk&*53@=t#j-}&x$;>*il#KD8PdyaSRJ@)t$ zF+I(D1jnr#z1ey?wk7 z@#>Y!9!m@e9H<8mA67mM-R0$_xcudncwGItfB&B7)|jwMqyCBy@NPtQC?acedRk+8 zBTk+^Bi_~6*1H~8=Jv-IGyTyv&k>AF=BEukVv#VXZAdB2CFLonKdw{3 zb5NlgQ}BDfQC|2eon_@iQ`Vt8vCBy-S@R^V1HnQvHjVyJPkCT=aZ{dUkfw|W7mQ{M zpT&OYx1=4ir{a`RPcj_0{^lca{W;eyuF}&6vuU9z=_WAdrJk<@ zid=;f#5Fj-3D+vyfKAy1>NRf(=*&Z?k{q+eX}5>nenSz56%KA&&E0+j%W(wf-_W|> z?Kd{C5_|fVV$a}ezPpe2^=W1Q)t&iJVyw5z{E%<=Al37 z)Q8e59}t;y8Iy;OHM}|;a7f@Ntd2d`Q65@J1LP|nS@j{q&JLU#(k0~<=U)lPOnmaA zQ%yUMKE~6|oN^p3<|r>;LGD#Q@CD=nju3a}abn&H*spcFpENrI*)`ayb-fEmAUpn6 z?ELHRSoN+zb^vnR*t-E8uiDv&Gq9Kb#j&Ec;Iya@(Rn);mMm@6IQvET;Hy(ByWm0a ze8}P!n2!5t@;Ga``r}v_uU}c-ib@}6nbNM4zApqWHl=XtLvkug72JRgD0RC&5>*Ze zqBgC|W-NK=iTR`Zr&VF?wigtqpVG1$d_0(slc>yT*%6+r)nN#@eef~B`mZr(_aCq3 z=HQlcTjm$@*{1L+qC7tf&C(ui=T|Q<5e& z$Tcs8E9p8vfhr^CuX?uV(3-=-WgUrYIo#Bjh{)@J>xAp9IP{8xk8#^@{^fN6-VQ#? zDAz0WDy!EHG|0(oC!K&UgSOzSes=cT5f6W@H}ApqnCKeEeeHC{fv5IqJeTP|1@HdL zj>xpzs_Q{0JNgtO1EMkUgS{>AyH zH185tT58KiWh}(cwA4R-80BLh>^NrUwYpVvD%U60J^C5BgbL_TfpM+nS@*`+JFQST zD~<1`lqzc!D-(Y1?=Di=l&s$4ALs|yoE+>VC*bgvh0*AIs!yoOF0L` z2RC9=27dx$nEIJZN+y3gszIVuT?c7LF0ZecxU z7T05H0Y_lO{9?P01TU)0%SE*-V6=@ytUs=+q?tj+Wyl|BavnKP-A)&Jg7kG>ed2pE zxC$;)p7E;qnl`WU$h1zI@OJ)DMqwtoZ{c$DN&r1|Qit1B_#re({pfQ2M}%?8n})m) z&H8Fb5E1w>#(j+dXcOPMt`u@8ltz9j&n|-=V$vIB4}f_y*($H0$j|W<2?a zL6c7D7FmOyq!&rbMT_xt@3V;IDdly8;47)Kw_|(nLYz2#B5q#48Uq9UHbn1FjK{I# z$L+LB<0p@f@ry8PAxC*HUApLF!We}7vg=>GTz%@bvb++r^9wd;*y-j6Pu-+=Z{Wnl z{kVPWR$RY+JqCw{;`Ys(ap2&AG;l=o!N(ujVK*^36Ne7$i>IGD8+Y%G$4ftX#m=Zl z9z7l3`EfmM(?9z^ zq^lmV$M(kD+`PJ^BQ9RJpt_!nZQHlUu3dZlzQP?lx5v(%J7V{)-F{c!uF;(_wr{U+ zJDuLXV|$E=ZftB%96fs2M{~Dt-xi}P+p%**^$y43!v|t`cu+heapL$9_2;2Dr~cwd zG;L&u97gfU6DQ)Wx8I2;pL)vOhq1c6q`s5RJb(`L54g|vN@w&vsD9!-fv>#!Y8=>q zz{j9@PvgKqUz|RDI&R;diuXUh9y617q|ZPM4fWeVoSK?-AM+(RjDCLk=GZqo0@*>x z13At^9Cu%S`K5R6@ipP4r6s>F@Zf>{HY{>JaI|JQzWCy1EUyj~r|_a4-Z(~`20TZF zu3x|5-Ily;{JrD=qaB1g$z$MqFU?af_^{mMaY( zakK5Dk?R@-a0|q+uBuH19TBjcXAYialaOzuRq-Ygc$gjg!;hR8J zRgQJYq@m&~)bfXgri|7+P)2i-ol86V+G1<~hhM}Ig~NmEad4R9z4>8}14H?Kzuf~% z3M;XzZ!LE4p^V;jAAiMZ#gSRwugAk5^OU}EcNmus#soVN6u1ukAPN!MlrkP1iK~N< zK%VmCp}&*9@>bxwuJ?qz#@C#$WzZ8R!26(#jXE*_o73oH=b#;##bKf}yreBt*Fhj;xc=3^gx4cW(kyVx<<7Wsh^9E9oY8|+C(Uq3(e;Ox^w6z?kJeSzL3==TLm zrtW!saEaZB1Rkh4zPd`~JUDyM82}#2OPgt{%6LtIo9*3zJOGg?Jh0G56-P0#=xAf6 z6->)hF){0q%9UoBOMYnJ&Gi^*u$aw9a*eS(^JGD?)iuYuDOqtfuW?Nzp@5RE%Q(sb zevA_M=^cK>TKDzH@7Rt%^2ja0^TG8L`3O+^aEf(xxBI@tG2cGo{$8ays)?g3on?Lx zu;vNXF(x#gIq1GC0bp)csJJ>e8Lw^pERqA@3 zFR=lA$(Jv{(?`>#n;$G^^j>S$Hwfimc6S#4*fCkD5%!!g?r)Vyio zqg|!U>o0PP9JHZsWmFy~wHSmHX6v<*Wd`NTXZk zfvgLD;U$72+3fP0;n?p&C|-}r;{2OkiCALSrq`>iC-40hESv-=Fn2RgC{Sql#|52s zRwHxxR#A**8y>E19Vy0b2Up z|E(8&ni=vN^}GK8_*x8&q}!*I=?jRK>%>E*Y*96#h;wXRh>b~T$^mNm!@_3T7Nkz} zLy{ClO0r%Pwcp+Mo5ODdUs?ax0HO)0;%^_gsNksq+$Pv^0B*q+Y=NMz5>05X7&Tp2 zmr7gGtk}NM)Uu{5a1{!TSNbMxlO|VuZa&^ob?cp2Us({jZV=q1rmx1>=xQ82awaZZ z{M28Mh5PR9TXEv}aozBjWklqTGfUQu3qze_v{Ta)apu$+f8o_H5SC1CW!!v_kKs2t zao^4>J`!@}%2hl5_$nT(`4sZh9_GpE_;B?e4vM{!qpG z+OqUK82tmi{y4?r(rOI!568&Pp%~k}KQ4XwdCbh*kJo9{*J8H>}? z@%pcR72CJ%il?4D5g&f|Q5-*hB9^5S2H;=))nCVBk3Vi>acOBm`q5??yDO_QZ0k`M zjF>$BO2C-RZg2C^Wegn*c^mJFc`qLZ3-7<{Ui|ceKfjK~$lo*uHbSXnIwjjKr0-xOMAB96o&5eauZ5 zLwt2**?s@iQ%_3w&bV~(bLrpZvA=h3Jf^L7oSIe-#`pYueFt>SnlkN52tp;{3>%)p+h{LWM*}r z+0eycu<-^Rv7*+`r2^e#+yyLFQ&d7--zw%tR zmg73f5Z5{tD!zs)4EdD?Fs&0sM%I&|$TM^%&i#=_GMe~!s_8QCV!(21P~L$*#MDz{ zx9G?c3s2)Jlgad_(p7y;n}I&5!9WBZ50u7j4#-m|dRJ%}jQW@F>0ywF6)3Av&<{YZ z`|AJ_!sfw;x0VsU3Yhb?{rs^WdgxR$NBVfb-&!2n))t3-%y&&;Ira}P<&odPRe#}k z@8C-8?pukS1M9K9y!WoJiw|iqFD*_%@}ZJ^FCaVrddrdF zUUgGnCttt^&k^A=9;!=AlXPZ>8-0ns%4ZiyB_(JNgib3a3#r#MWe@;BV_GGMsemHp zxn=7CU#Oh+wM>D!>b2l&Q)&IzRZ=e1f>XdDSxL-ewEj?+ zWIpxq`l}3fK$YQZPqtUR?mS0jBaqKIU7UN+mEE${0f=J}T+aCo8I;#F4kH3~M-zv$ zkiN2m5PIb)qk-9nv?t|~rwn}=3(s*SJViCWD@yPo4f?J%Y)a5BCo~dvwq?@%92@pg zQ)2p`eam%?eRcIg*Aw4$ChuD(LAv>0P=o9)$G0t24t8<8u)mzD&F9P(cag&D7ECVVYfR;AW2dy?H zk?EVXHSPREWI3&v64q7HS(1RRcK!*>jeJF|9~=}?Y_^w6m+KJ}bhZ7Az0;-cT7QlV zd5do0OH_C%M+e%bz7pMv#$ygA;G!Nm7G?h`wlh%i>|(o*1oIoR1zCT^mPtN^XI+x5 zylMeag3!=3`8V7hhspkJU~`)u7J!H0n_+YP55sM)>mfRCIRLj{3${SO z>d;&*2ww-4rtsAyz@qs8g1A+vq|#+!O}a`;AYCG?e-^QuZz<1BNQRsYOO68{9Bq#S z2M@>jPd<&4#}CK-iTnO=24Cdm2rv$=JldOv&zf-e#_#!Eb7vlTH0EcfgwMK&Fm|A0 zhuF;Yl-~=tZ5U_Yp4hc}cZ`gT$hhyf(F^VT{EWh)kLg~!b}dHt?22>e9*eoTS-t4M5&POpZF&Ddc4f`v!uf6tq{NMj?|Hwz>+G8R1 zj1I)$P+#oZJsKA-T#PF>rsL@+AF%Rl@AioW2DswWsG5V^;r(ao8(N-O#8zm&pr2?zpC8VHyGzX z{Vbk)_BoBW zbo1sde;kC)!G!fghYaeWp#eQq_X?AJLHp=F>foa?JYevVk%@^(&8>;pw|AfWXsD+< zE=})@8?#c{b5i>F$w1tmPs-ERq?x~EOe8pC zbT*?@w~ZF~C^auJl)|BhWfp#%;L7_~X!9u#IA3CPCWAp)=?cnia9sIHJ3-bop|;;R z01^0K3&=-SsmGw0 zbPXQo(k~{%l%*|6`hdY(^-bkkQ7fhlSydiT#<>;$CaCJeRc%4uZV9w-w&v|x;s{*6XzhiF*U}#6IV)T)lsExzf~2ktb;YrQ?|PiJaa{{ z=80EH_b++U&fRb(DoPn>V6|;*%Keqs*OLDbPCSSe>`cxnv-3uU7JFwv;q{Ime)9PUQ|L5kXjR zt$TtXDs7}2agF|*6$=|rXo3hXaCk@U$zyD9cywJg; zG>(C~8_o3K)Q-B77$=w_x5YikaH=hKS}8-G7O&a{qM!J{uLA+TgMjYJRS5kD2Bq^|5P=;nWrBI{iTq9D&N@c+hwB zrLJGiA-`X;yCdHvskzn7oRT-iGQj;pMFna(fwCG`x>|+=X!Gc7;zX3R z(4mBYHUrfu>OO_X*bO~feWHkZ=r`ohn5sJ+V!6;!E;;b2M!4-DT`x{~>VVF3zRYpv z2mcVoAGo+=v;7bx+m|SR6Sc{pJ_Ly1FGl0fz z#mD&zZ@unZIbsT)tU}sYnNA+!f+Jt~&`$v!syzC^P-t3p(m2y7Zs7Ih{$$p~>e7)(UHIoGn#6WMB-(yB~ZO`^JXi=@d(nmN^Qte6S zpPmktY2Cbqr@d+X6ukbW@dHodTE<2LFraXXE-oy17u{QLy%}fEo{gcwAseOdz4t+U z@WChX=(#6ieEg0-&cVk#c5WZBbMX4L>+$4MPeyOQWGr^7opW*d>ZkF==by&Y&phpR z+`V@v+Sl`e03B%8`1pN){TL&(8m^RcBzb;*-tR}eaN$DCPR+)#lP6@1uEft zdfMXl+-RJi8P?P&eT;(%%cyofMjf-o)`x=g0C|;@70yO08M@nav@hG9MhQk-kp*}h zF%FBvjt2{9d6+YOk{PNo+5%|6WitQNJiMgIfF@sY+bEom(U)L5tb13bHdR@O< z%Qet|prgPB8fR*nN9UlnkCHROj zbmG&x)2;QYI%;_@A=d%-M%FxOrUoijog5i<*H$kIz`8|WpklLm;60fjh35aq-hX^q zmLzGOm>B28xqG-rL}l{|xa z5a;g3pS}0Y4Bzh)m1k-%%p)?3PlbuQn5v43ii(n}S5%(fdmByvUDQ94G$FJ-85*CE zkUz*)+RLL)u0ZBbLP|g{A!G=yhyHY?^)@tFR#b79L1)^7Q-?=@eRM}-%sc)lXD1-< z%WV!p$}*1C2M!fMw)%*%@w@$+V}>v2ujqcaqJdiE{dc0cfd)ej(R9^2$+Y`KtfIDOYD;0ITb_C@ zhsJZ_ygfX%z&ikaEvm2mMO{JmAI`e$OA1d;^9jkbohQU`XlJAD0k%iPj)M{&);V;n zG&Q5mSoM&O6`r7wNK%9UI z^Wz__Zv;6na{VGiAM!xrJ&<2;8P8?1K-xf9`NYdc0~xDY^V}D$ToTU9)%zAph9WuE zLNtR`S(|^~;oZzxBufTH&ImlDGoabrZ63aa1lX}6tiB`#U;xuVA zp2?Gc1Kt668n1>CJ4Z^7^6}syKU$zEg<5+ki#*p#BSbS1$jm7eo%zdu`a(3?H^~P| z#)Q@y-{((guG!;YIY~_3Ru6ytzUC@VNYvP9RaR|FS&W6sOzYOC3n_|9pc6vanx19* z`m*iO(Bu^mMMUu+qT&UUe9E@Cp`{C^_3Y~bkkiXA1g6u|K-nHIgI>n#@Hc_W%6yF` zB`&1D4p$DqE4YI1JaF@V%?dFMENrk=*n=0EmVwBx@w9^QaMLh~c3}}tLjs!rVH7?6 zOY!N3VMmMdUOkLA@2|w&J9pz}KmS>L|NZy;C0b4>-Mf3wC&zg77G`c-bF!v>^{bC% zJk9xwyBq84KB31~eAAdjCGjerU)_BgcO=KZq^o{ErlK1b&ZWb{Lp$CM4~}AObvc%o zS7U9RFX9g4@uOeG>dK~c*odw5g}8oWBbHZ|VsnjfRfY*00~x^D;B9WN#@$=%vGejp z{MWz!Bvx0qrNnXkAO5@lHik!%_2j9#APwQI?albb&wm;psGT^~{GL4-rw>2-Jl^}@ zM?STfA83%F%|A7W%>XA9{1^^tZsHDQSjwR07kb_!Gq-@zkFkm&N15E%FeGdQcvp`8 zyKfdH>%^xf=G+h9d(!FY(n|8?k*`NJY{NC^Vu5{k;BSUZ8zaLv$o38u%_3e1} z^f119{4_Q<&f=dLSF|hR3t^YT;{tVfIOE|ym%Z^E{$U+;n5hf zF>aM+T}?g}cmt=jH<>P!I;0$Ogq3AIa%?8VN!utx8u^umNBM4uuxO5xm+`#*nw$c% zTYZzdK(kdse=U-Bz*B}M@y6oog}y|uR=?XyCbX=-%3pw{6MA?~>RjwDxPU*<6vGk8Iy8TNM29RhF-)z-~1@cW_%`YEYHOK&4{soHpXGuseg17G>*;yxARCN4Le zIMBwr#*03^IVBD)H#ErutsHMXtxuO8$gXssM|q&i6^%4J05sxNrsD7w4In+OW63Oe z6^F0-3m^`y=#|IGUe<1Ief0B^BAoDB5}zOQ#rY>1&OqKLh+}X~G~O?W0}#jGlEw+g zARl01>{hg(FN%&c(C^UFf1D=P8r_>to-+9-|7z_^XBx_oh6t$rqNxYX<4gr!UsxpJ zC8WIPF`;O#OMOiV>ZEU^3-rm_L|$E4kXqDb8_gcHw#lDCo}>JM4oz|NavAC-E1Ac4_(VaRl@+}yh*1Eb0p#XIstueRGq9zMJuOr#_O6o z7fjmMrJ&|rrg7%+#o2sCNL|AfuX&mdy^I%6pHDme7%y=l>xDz~Qyf0?H(o-=MZ*RF z&D)SZg`aDII}|P<<*4oSAbpv0Yb;xBEL%XM=8nyFs^65KeR$pv*JscV(>#N(c8 zJGvklyMg{?ERjW?+o3%2JznV2$~bi2%WiD-#A&|w?^NT+xuOTY8Z zKOBL)LzRyw@!*SXG|9y2OuvDiJ5(;9&RWlao~M8~b1C~E^QU=g%>u{+kPX7u%Yc@1 z^E}^Wh$Dl1`V@X4bK5^SG&#L&uB+BlcA{3_!<+I{1{qpITqk*|i;(hFrrKn>i&GvQ zDZsd72vplCZ_ps*@`m1g>Gw200CGGNuLjzB9P%aL+1MM-_zS^9FAF&j07Uz#3glTP zVYbs1Gw+;-PNKPK(zWOiV277}B81-h$`v?lbjO8c(?*20xt*`x;F_0yqIvB$|3#S> z?J4L`#cMVsN*0yy@eWVYR^Du#juV=qkO*0uvl`cveXUGr3Jipe$MKR=a3L?F6R11@ z{igF(C)d;k{idOp0bIrg?e7Dp>-yUQvc3&2vjwN{$^m!x$ z8-4e^cjHuXzV6G{d!Ijh7LT7ivBAsN{&@71mte21tmp=lUjQ5&4Q<5o1za|qeh<$4 zLc96W1e|{|fZY~;DPQu(F7Do5kC!i>$AA7WKaHJNuj0o){4l=%;fHpF?e6TviqkH^oB;>)iN;;YAd@$%KN(ueW<#Zf$e ziBt3_o;*L)zUWMwomoG6{9pM%hWdVEW5dor9DSQ=&wu#$|Iv@(lE#S!@QBpQo!wZG z@v3gqrfE_AG3$-f`uckO9Ry1SCc z`vI9=pMLU5yrKT#QElRUgk*DbBX-1t;lme@0|uSc_Ez$#sa8S)%gw7_&R(lMIbgkNbH_*wou zAN@IfSYwa|rq&8eZP;iIDLav&(4zFGiJYuS)BWAG&yFvZ&20$Ac8x3bQcifm0P6rT z>@vJIz6SOGLa{zxP&_Q*$OJFpb90*NHsHmxvNRL7RwLfp#PN3;Z*B?KM*heLU-`Yi z5&po(&GnPGwshu?Qq1G{Yx9Ay-UH^%R%^enF(Gm2Y?6WE0l2=#S|7QFi35Fp$+`?H zzks^>5P2n+I{GwWVWlbeI$pv)ui}*H%Mya$@Xv&+IL0pv3VBze-qJVIpACQ|eVT_(+3xAjw)Coq#AP>~C5BAoI2 zFg11xPh@A}_=~go@cRixJ3X0+5%nvi{5)2tfQ^WznlHHegS|RN%AWf>u8Yt7sA)74AY&^YukFO*!SL_^C z+xoJ^vTg96x6@DZ&<`q8PCzR1@<26W_82QoeOYz3*I=6TP!v9=iA(-KQ-TwKyGLj7 z^611L0ofgaeyRpc916SAh)xiaouRDT?{8-=9 zuO5A6r_!xkw`KetOC5g2#e~<5eLRX!K6@x5YZ!08^|m%~qZp2kWoSrNyRmtV)t}?R zVeIYg#lhizynMM6!{b5RxqByW-Ms0Kf8ea*>v1ohKabVbwOHHO@QFaaQp>vo`MAg% z4<5vrQ*0QyGDgx!!dSx)%(l(UjC@nX)Zk=U@6m8_4F=+oCocJfgBJV^P`ei|gAs^@K*px@iNlzWBW(-^+W#D=FJ7weaF!m#;OJEh z2M02)hq1P{?9+gJd6!3JahCF4LN+gpiwiLvO3wUp+_-t&kK;a9U(siO^uPZ9{3YYf ztqt)U%h2To;5bR={J{-Q`~Bo^e&Tj-Z*AG($|JyUz4bsk;Cx6U0;3m$ad&seC-oNQ z7vt^ky`?cb@`=AU)&C=H0QmCqlIFzT-hNz@d^Qy}1oe-x9%`)j_ceAJtCR7W#&*ja zVK(>3<zZ3OUS?P0mwPwk+0mlnjHe1Q#=aJEtZjC{OWLS701Yr3 z25uQ!kSbI1Y?vuphL+_DDy=dG*Qq#k^Ft>h^xP&NBrj`e3D-+MQo*iZCUge9pFtQFUO=uW%W>L!q;IztJ~1%lk8N&gsKXd zZKAn32*CY8{o8HI7VOKZ?q!K;Hkiz~jL} zPWma$heKB8XZ@j&C4VItho9DbbvcedP6bkSc6O}$04Kk>9GKfPUa#|-)F0_M0mXfp znnV>Lr{hM;}f;rDYS$l+%y6-wDW>EseG1QAVQqqyLx;3!3)}OS+e;!WV zc->zn`GhUcWg9=>a_~TJJeFbI=>V>qTqmH_HDfvOs4aP#8(_W3{$`!ZKBtd`jA!d> zJ6shqMm#di2SBh7T)+E<`Xrw|(sjhVqi#E>sEe^fn#!mamt!od4SXm8hYib#At>EERvdrRA z7cPi(TL{gero(82&ImrhN z(DJ;FdTB0(;?g{?WC|6%=!&RLXn$V*=RBRvVc3pDc#gb)v#bD%dlCMxY$^D>HV#Re zAtBQ5nS@^^?KwZ-4mUc`PEw{pcCq@mIW0B0gBRv3KiX({Gi62c(4S^( z1@Tv~RqJ54**phk>Bo0$TmN?*h}f{?E^|`KCr3S-RXTY~I$C@J=)6_n>O%faX$qYg zDgc|7MeoJM%7iP4XY?A;2+0ot!uJ2jeD6-aGXUb4nzC8O67GgV|#AR)f6(NHZ@kNxqjlz!UyFGq|~6 ziwLQm*#~?XUGTX-m&dAt_26K1-W|trHOJk46v)$;DK8l9;N;>GeLFfn7~r~UaOd zvKL!%*$dN1zuRAbS3t^JM`jDKEAW*MZ0%|zVL~p5iRI7{i2~kDb0}@`4+L^&42Z7# z?L8P@Pd*2pA?=VUc^JUMrg8;OJNP7uWCSDkH0~#%;w&O)@-QlV=YW8b_&)hNxO}{$ zMD+kw@OAJ1BrKPl{VuU{kNXdC|l1tKMy6MqNqo~c{P5^?VoB#jkD`5 z=)YL?;jfayxvippchVM9#i6z0d@%u6pZ{dBlFkB@cCa{L?p%WJlYC7Cm zR)EsAtwjfq5w=}2wkT|tM?pLCCfN~BOCVh*T6>=PmlB`D_%T@O;UFkIm_swgmZymsLsMe*Gd(@Vjtq6{rECE2Ye+#tc&gJ`g6zw z@~~xM(JWbxo&Jnn_^4LG!2@&`1)eZgjpa*d!%(}5ldj^R#JH6qsqVvSTbn1;oaV+3 z!{^yUf0ND5`S8z?$rO5#o^$5=jXx2JZNndo0~H!WPeoqZS)R}l1eBh82LHT8PZpd- z*UKT{WHma2j#=%i?c-aUy*JImEF)y$TeRR2NnCp1lr8i{_uIAJJwHGOV9oVrlDGtS zj~=ME%CjfiG(7~PM|x@SenlY|)neo94c~&kC35P`cbzqcG&~lqZyqW}q0S}1DZ zHw?S( z*j~=a8+c$v|C(+kOazL=#B0f*P20{Cr{8+qz>L~eeM4TRFMK{A6{uNbSDT3`v7RTa zdR>G%w0GB-a8PCGP=wsbM(=2=HWAE zocfx&Je=l=2+JKt!{92ZaGV{7`vwSJ*MP3ooY_ujr`8U)urylJ)blf^BjZorPbM00 z48GdR{NY9A6=>sH5iNv7HX2xZg^i0c#Z5XvYKdk8fB!cj5 zBHT|??ufhmlKRvdGVeQ5z>f7X%dGf?sM%51sSrY4Of)eL+7quChKmT6@!TiM;hwSa zCFd*+F^GLmu>#2?3USsTO}x!xFlCpIm8vz&AR}dJw7=Wm1arbFmP8L?)bB4RNBAqH zOG4W_MGoKO(o8m!a{*!3wogMMW+jS!*uWAc`fV8Pl#PRyyTl|ocp`bVH*io8@IVLuAMi( zR>H8NA52)2_a&KFO9C%?Vbfn-?GGIf<=$Oy55ceThcEjcwQq{nrgjj z?>ncnYvk@{Kmb}Ra-~fC^T;b3OtJj<;?B<*()8@*~zVSWba>033mmH5ph4hINwdP-yl)Dt$v(^IJ z7!q+VFoF1{S{T}TZ!0{}zKy`}X4t1~irAo8LWtJ1NcTsHF0e6j_BzRXjx>hQ z6=`Hb9b!0{UUhx*IoTmg1nn!tQOxQ^N2OQyy}2f(v15OyG(T_(_wNWb?-CAjI{o*V z8>t~Au`Z|$O;zfiDqp5~Kk~%PnYXQ&=|Rr+Jw1RyIIheswn3Kc*d0&HMXA9Tiff?0 zY#{X|iGn?!OpW%hoDe7Bfz@~Kt2xZ_`u$Y0Na^1<>rOTnOQZ=*T=~33kVPQ2xqzT$ z!^8gqe>^3TZ$E7ic6jrhcTFoWe&P>JC5@A*2JqHuY%bMMT~i2BoPH8lH_1I})WxJ9bIDctlh){`ejJeJBCq zk$dU~D=~-l7?%41?d^L_}Sm7mn)q_bO=aw-z-43`N!LRo&|y^Q496bvX3{1)ZLH4)m&ouwF;KMv8io4(5f2jv zjrj|>7@w2zhLB6%Cu@}KV5&|JKizk3{=bz`#9id>FllF9u!fxL!8hw_x z$zxSLS29oTm`2(YT)lz}RQ}k!hy!e#Hr@sF7PTcLBw*J&h^W}ra($UM?zRdxM6Yjp zqiXBg7=(a;7#4}@M<-4<=kNrWujfA>6gEm8i!$C=jlJKyKfGt@!kmL1#xO7C6;W+V z1M|bFAVy-ng@q&dGX9gKn<->?OaYUR+!s-lG@pLZA<$)*BFn z$%wD@_%|Zdb*A1C(a(KkCTXB7QTCHbdHPBVTCF_g{H@tS)0+3B(xpD+^6`LWC{>sw zg`jxh&>nK%H?D0;Ku8EWwH55-x{>Z#XUSYFoG(#{p$FS_bGBJ$;9H! zg-hmBsk9^_3Z5`VdU6Tx0PlZCQA$Bn7H53FGf7kf(*>EGmbr?ns?&d8#3?!#Tj)@p z=_q>oBVnoARX6becr>~Io$Ou9f1V6vl^j34Q%j4(k%71$+q9vL-@VFRdHj7_kN8dL zS>}=zhXL-j!qDp$2-gvK+~lAcss8nFhz2i%xlMsg(>uixn`5M4aW?Jh_RgqD*K@`+ zlRdOESmAsfVP}8wpQ9?*x^?3pBD>cnDQ(Qtlq@|FKe{UOWd0pG>(xS$rV1i@feiWu zT+ZePJr|8FJ+X{QWty!Emcw+wIH@;J@&T0ojvYZeK8G*aopPXIjVZn!@aOA`%mXZk zb|A-#=i=#+-gvKmImw;*12*y(%9@ykl=iXyO2N(=Jn*LqIzkm^d=`^3o!!G>uF{o~ zdS~5yW|Ym-tu_YjHX%Xg-C|(mR$u9FS1Mz@I^qIa2E*HOp=d@rAtJc*$InjnR6sIOlS8Tee3=*=XqmCjJ?P%d z+@yia4fKvzCL|$ljw>scQC3wA_;lFg4TX>$f&A!C%*zz#U*6a-AYkbpZ<{xVXUyGY z9+RERGU+atm{%tdBN7f_r_bb|+CoAY&UCC{l9$9Nnoaj*5T5|T;MW08S^dFIXDBM6 z!PaQ4P)b0W^hdSj&VnqDGvmXH9=N1_+NK*fiIN`TkeJ(}&LAQM{gYBR9SpcK_0h7K z4Ztg-SeI5;38*b|<6SB!iV5YAbvBEhu-Z@xHbUFMsST z=o_I4DX(mKZiubh_qiJr8ar&;UY_;(j+)R>L~AenIvD1m{y-|lyV+KX42)gt($_o6 zIk#ou7}go)H+PiS%>6f4kwASkad5@$}``-A~!5qWVRaZR@THs+-4def&Rt zBI{lyGy*L}aLT?Z51Tm*&KK-R3HFS;+V2cn32w{ZWgi57MFp#cFZyOo=FTczk19TH z<3exzmkZBS_5K;8G4D_RS?0VXmDVQezr=-T4@SLl40;94WG|q>ZYfRh3m(L5U#Ktf zVJZ)*I#2MOs`PgWeV~ABS@#eLUD>IUEyeP03sb6ai}Q^~_o4r9Boi3^GMy4MvHGQ+ za{iOwoM=1sUu36MgXGh9*s|<5kGnORS2DkuWyWy$N?(u{UL5#SozmB;_S3HnROKR&=fT*1$GgfWzb<{)6 zaQl_w>K_jYN}{OX1_m}@2P}*(8}$1RKUa|4@%If%`FoLsyYN-dR;fB?{eABp!iKXo z3zuB>um3z^xnq|CjpBKkIZ&L+w!#g3+U#|k7k6qb-;i$GPqCO7A(*QCT@stypXn5; z5J>42(U*bYgYVN7;_hH<1<(=IKqKMeI#37o1cUSC01|?jkv6oy1E?qA1^8mlsJ6ZC z0fTaQ=Pz19>-VuFI0AfeX3NS!#qIH8-j4%5m6X#WN$p1m(T6|?2%4IjoFFsI_iY-G zJ5cQUAYge^T^kb8jsiJ5%jU`k2x4!NkzTqzVN;(mn9a}s5*n@Ye?;)AdI%ns{MSXI z%Rcwk?uCZ=xL7^ew{P2q-B0buJ%nTKj45|KR{vQNJmDvHhG_F={_0gV%^dg9neNtc znU0|CsB?0eCS`FQdNlLwUt&H&9W0aU_aXf|@u=m0kMHulY^LpV=s_|joLTHa*z^K2 z#&e`Ajtzs_yTi5Q5cpCENw+==>zk`|`LdufK5)R4KSct>6Pqr?7KbcdYb}GO&ubl4cJXt`X@oQEsm_ zLc>gd=!tCp49o*!BHr>?c;V8|?>0`KrmkvSNmI|O_)5E)itC|qWlwBDztIuCLPVSt zhFyjM-FzFU3xq`iX<0fNefhy;{=~2BtF@I?yb#eISC1y&FhZXF(XM$21Oq4F{DLY- zx-qHRvjgo% zDuN|e&OTP6E4uomxCa^w9e-7+uj*DLy*6B}X<7L4qu$&;e)&^9S7Mue5y@=Xs}Eqm ze^0s0LTJCud>XW=baXlQsL2b%B1&WTUeC&)>={Aw7M+6uejsUq#afaM9rU}VVXf(K z0i7W3feVr?c<^{zg7*9NMId*P=kd-iq94^{tm7TZxdLtZLHj$`U2k-4&#&O2AD%u( z2xEwB6NJ`L;pmtZN;K)usmfUob3Uig(Y4Iu)iOC3vL@3_d%$bW1OYA`5A~5ID}}jr zg>e~qg#`jvuXI@5odpk+wz(WevWx&1zl)^?;5$ubvb$2Q7+q{APF5wXDF!{`I~V_j zOkpsPV1I)B`+&0^Yvmb^!x^6oQNB%TJD7^9M>OUF}qYq{sBpN{A1p2u#|B13g z;t}OHG1kQEz%2o^%Ivr*|1EG^k9uird3Tt)#PH-~ZK)@-VfY+r$%I{P4c}o4h)Jer zjoeKGMv2F6_;kNzFtn|~-cjw;?Q;3y9qNRO^l=wSlV!|u3ongQjvllPQir;qHlHnB zRx^E4fX(QgBLHutsa|BMCQrQH6+c%HZy>$J6dJMh1?*q=n1ZhTw-XTh#^ims!T4HS zqucVTE$%oLJ@kP*1%|&CDs^lY{JleWvJD&faI}WJ--Bc0CS6+g$Q*z#Bt9Q$5ejj6 z`w?+U92$PUukeNMergBZD`GHv@>fQmfB$*A2 z>(>RNN3M(H(M8vYiC~88>#f&`EePBX2v-eF|(h;eC>3w>{)W82G za&Z4cKvumZ^BM8)CdKaww)xlTpeIqB&G(qb1UV~|f{-;pvG6|Is#G$e4hI919f2!p ze0ts+$;v*kL$_h?>9n^Z6pV~%@z{$eHV~W0587T@uG@mt`Zb5@hpYvFr+v z(phcbE4jciAF%5L2#OcQ36D-m6<-`8o|c=#&s!-+M~m`Ll-_Q3V*+=WcwVBPhN*g8 zjyJ)K0v2HXZt84bL$k0%i>FW3@7o@K`~HI~4ks*5=e2SHDfKB)5dk~lfR*xydaf9| zdiqBZX5EM?XXivw?WX%}CVtVBZJFn5)JuhXLqumWQSRE_Ljv{yT5oJ^u9C+^d$*J| z>^aa&mye&$&B{#vCmDZUq3oKUY{t`~4Lo+$YfX;74w$TK6)wFs7l~{FXsc>Q<;vmj z81G_Nf;p*IpXmih^ZJe&>wOPR`&I&X(rd6TxqaCWf5~8e*!sg2q9)$jHaVVICVc+*|kl1?wT6byV0R0}d;y(;t+wx>E}IO8Y;y zvZ~wMTs{Py(%@MTJ>o8zICM}zP|>kj*nBX5i$8^5O3k}=>;0p0ScvnOqUA5FApVQ~ zfx6ksf0Ae6bS1ZL&rfYP-^!8J3Dauw)eBGDvd`d_rWy=hX|#@t9WMh=YOhN6S8uFBL<}%>YVhd%^h(&u zYRXX#_`rzp#F138-7*dCHv1@h$YH7Y@b`U>VShsqFXZ((s$T^bSWVfX;whfh&W$0PA)sHsQh(g?VfJU2Lj926fQJ>lJTuw znWqXZ(W|oSdD>2L(cV4Jdh{ZkJA*vFt1Jx=6exyn|OmCYWD_gjg1QKvUe0jYHn__^ z3;S*J6{j%Tlv0{>O!Lu3 z2I>#N6G!%&{;eo{A1f<$mPYP8SZ@aW%?27B3H2Njb^4@d53}-q z$D#aD{K-j{RqR#|!pGCoMhc=~1NZc8VyB{V?Molvhs|#;<5)co#q6aUhLdFeX=-<; zw6#;vZ$r3Q7<#H{F-_Awb=LcfNHfyYz?bbH8u@a;$(1_Vz#}iFkmOzUKN`T4h?E8E_GW=Uocf)2<9DYNr5^sjnw#k~lA<7xIL3yQynFMxv6x=?rP`I&#Q zwxDX80y5tA>qg<cDr0omN+*W17W3!+PeUyUuSdt?68yP(L?P z7A=@>ifCTnE4q%qmUo=#drd4m&`_Nj-u^i`L2}Ynx`I{DHl{{AUslK+XP>*7dJ{cD zVL87L#m&KK&SG#DIvhp#qaIhmE+o)CD9g98Y&u-_1G|E;*N1i?qdLBaBsBG!=6&J2 zU(<6wkNWlN-pe@`2p(wh*wk$iZx^Q>n*c~Fe`XJSWuyZps^#JIAsKJ(%phOAixGn9 z@jXrN7@pXLM~JtY;9>;UU}a^n_!pk};w|KU;oB0tS@>t)QglCtg57$i-Zi8NWm57} zHPq`4T6cT>J=r#PU=3YekU|>8_ju>2$`u-K5FALa4S?du4lEupej}Ql2`>?ydqNE` zOc=dgg3Thb{5gkKDMc;En(ap>BRy=a^`N#T`{{(p^#nxS0MPtKB~oH>I0RZIoD$tT zvoBetG~Q-?EtI+LYwcQkQu2HuLfL9+6aTkCY0AgzYa+ep z7tg@!p1>4IoL0HnuE5P6=jlcdZ|Ral#WVV|7FTKXt~tjE-nObq;3y)NVAd!3CAB`P?+^^q7ZUWsO(qM% z{<679e;hkG9X^9}_=h6ZAgl`|#Z4f>Jhu;{4hFAI?36n-#Wj-4{J8lWxLs~7r^mL> z(VWG)Fs-zp&aQ=b$kU)~aIadFBDsm&D5?)6+U(J4XC_V!{>i;-PN>DU3`TowwD!yG=|HwLLx^ItT7*k)F>fKgc~Y`y;y6 zAH(?GHnTF1RQyxY>P;DvO6iT?=)~71I5B%GhWtD5 z7cJfHiiyAbO}1KbwHeI!U;ede5@DL=iJ}n-<|YeNue0r*c&Wk)`0iNI>wD5c1*@Ns zi<4Ss3mN-brA4m03aokB0*g*Ntgogbj14I}h@O&?gTM*`^wE6p4ad zViGhp_VJLlemCJLA!*#)=UZPl)(2i@6g`7j@8S}t2_Xj|%%R`=% zpS|5r=%Jy8hKhYP{-mSodW{9S8}w@K(V*Yb3A59D2qg&kLdCGQnDZmXpdp5 z?aa0B;wZHR6eQsCEf~A}#mQ9&x(ikMxbiW+N?S*Av=2=Rl!`Sr=_znyU^zUv%}j!| z3muFC6*_%R;>DF?zN}>4rueY9xKs|H_9m?D_I`Q>iV_Z}E?Ic}=D0ElboS!Dq`Jhc z%f%uZFB%tr$s5hXmKlITou8xlN;n@{V}Q?hKRgC{$gszXt&5z#Hf;Avy88n{wH;(M z&QPjyCa8nz+zc)z!2r_srnd41=I6Zlb=s2n4z6TBqKZOQGc)l!@Dpc3AcSl=RsD8R z5-?QJYnHngB?b8E&-yYAJvw8_4-7@(ex(gugm@W5KDHe^^ZImLoEhFj=2|F0py1l4 z#id|xXipHgp-}2M2akDn^RYwm+>n0r%Z=!e?&QDmI`8MnOX1Xw@rmv;uNC)r(0QJk z_}FLJxBJ=M7eOrfzC!0B|B9Y$ZQK~Q6RydVR;CpGA$&j)wXi-i4MIR8)IcpLh?$czu^M36=7i95@0os7yguE$@Q0NlA_z#QB*g1C zNmBO5-V#BSXrvdY5b-EAvLsRN*!CTes+hm)piJCj;#sBl^nXeaTFHWzpGd1jKOOcP zHfspMELQ!dok)+X(l(Y+s#tlfWT&r}doXKEy_@!4Bp<*B&F)9rvg9MQqsX@%9LM+_g#4IQ zB5hc>ufu=nQpmE@i26{(lJRU-OACZDi(bd!h9DoBC)F*PPlO?ziB?zvx$j`MDmt@% z!t^aJu}8 z{k`p*HoPbFIs?G7i<0~AHM=wpHgtv-bMMXyt^&6g9F*1-2ZyB5r3ZYSKT3Y-4%1BY zw0ckayq*}^lYXjG(C$4dy;Wc{cH5?-VYK3#{I1*d8!I8VJa55LkFj(*dRDG0*!Bg= z?c70YLTA?xXKm)}Un~y=fZ_;eyYtn1Q?AOEzM9gGg%EFIAL-$Ra4MKxhNzB_lz#sR#Flj>XVclrD{ZLHup>VsMa_~N@V;)z6 z{SY6{?WUfzL5luDR#6m-)<3%A`N~hUN&m6O=kXW%ps@pdzdA{pn_sErHYCPwJWhoH zJz<>x;Nx7&868aGrnn8Y}CuCdYgd_Ttb ze(fsgdxFo5mGKQet?A|sH35g0FJ>+sbUW^~Q`I+;ep}nxTKUCRVe@6N`x}G((OovcYqVIhTTh0y5)5R}Izzb9H==Zhs@{M#rygF2%$BlpW! zICyA^D0b@sV`1S~+Pdp~;y?-4bx&3vPHfMvtJt5%K-RU`C?b|uN}LM&Eq9AOKO^<2 za&Q^W5hA0+LLX(`WGPChCkutCkxaBCzarrQ6D-LQZLiR%L&oA@mZaJZ1+(a4&o-Rl z`rz^$*pEo~yq<;O>HE{*&4#0#%Hc;Dbx{zS#uoN6lJ{)u}f&bIb7DxK^; zBg`X4zo`8-K}c_W;`C1bED8ab(fE#XrCfdjoKvN|nAszpL3I~T=lyUD$vZR-OpN}V zHR@U3V!j?rqvZ2T!AtVPvinM;_6{nX!(^0W`u*22$#MBZCFVY4)Yl?tn1@^Cwej23 zy_AqI)(G=M0noho(jy2TYz^F=?(7GWnm0Vd`a+if;);f)5U>5zkSZHSByy~6S|m1z zvc?V9p&N1M@&XAst~i}_o_POrSgXaKYO^QjPLOQJ4BEb@thzzr6Mr1|m_2%kk~-24 zR;l(nD*)Y(IZEmhei9W1o_TT_FZez^LsP#AmY)#R?9J0beDrX8ljgFByD#dx_MZKz zM=xczAv^lURKYapr^_~aaQwqE%3cL^yV|TR%NYrGpHg0oGya-$B^xf1 zXGk50QgFH|%(EjtLC}qP$a|%$WN{R#`&6sr1l58a0;D>=046i*CcD4LX9W4leSS#Y zpATit+9>dt+d>vXyPO1;!&L__6jhVGC%nDd0^wKJG~#O-gkCy{eqoSE@4qwe&u8V& z{%O5mVlSmAJI*ZE#CliC_T6!Q+B<#e{UCJgSoL{i=E|tr)$-3^Pv5}(O)u%bVxmHG z8+!cCy)^%%#+Ostj{^4!Xp2gj#5|vGy=)k1(h3pzi!K?mq_urE0!xm%%fWGvq5QBK zArqn{ITh+2UOc4bDU&@|+12Zi|8jDVUVGE!yhE{6j&}e!kQ}`*2MT?saCdlJR?^sW zP4&nCO!c!wCQdlzp3ZFtr~NDcwT@Div_3!ekZFDhST}20;To&K{^t?aj)E!9XBAm?hCiT958l$qmmDl zcfE$LzHwhBx1;tC$`6!VMebMdfSj{|Zm%p268Lr^du4VmFR!Y4_o%wQVX?9!;KMNq z>)Yjv#r5STh`I0c+lK;0xroSmnlN}jim|q>>GR&~{aF_V4137Q+$Fp+yh$%yQ7qZr z>XTt*T|zcAH9e-{kZX7spjmhAFEIYgXCp|}>!e~dFc32}06IBl11A=ebI_d&wc873 zy+dzPv^q0gBzW%N+crp5U8`NB)rx$cS-ZwzzxeySVB^*E)*k(F;5bU=k)M-MTH^lc zCp{D{J;cGsWdmj8?(^$=s(dqV&&F~#BJ~q7}`QC-@ znp80MC84sRZh3hp{qj1?f=z2LCO0|M(gwqE?>0>+xA^=0 z%GeftQ9&JiP#y@m>L*I1qSM7ikWN)?(;tb*YPdAk3>&r&GjxvM%%eUq^P1p1y}+F% zNhBN!Gi+CA#5J8GN&F1SzX-D8`MUFF|MKTWww^Ty&#Rc3*el%SP-u`9U40vo+uzu+ zS1hmP9C|+P3HA(Ky5s%wpzKiNNm$_WyZ}!PdMo^=kb(3t?N3U2`izwiA@}r|d8_Kq zpSwx3o59P4;M7a5PExAgS--%p&bk(6)nX+HOu6#^mt(L`>{L( zXZt*jE#z3)z(XTXG&dI4zJzl$`%gcv-rnrZ=!mjw9*IjUfv>V(exNczFlhseC2i*x#6}w_SBTl% zpZ|5%eEMi^z$7XsOaq3gS0i=MdZOE`XuX*b=qm{l|25;Pa%Cxp?kVbI=1$Es%JnUc zar}!dL^rO&y3Ie1&NK%9&^3{dI;N0gDf1ADAX}g1bzBK3K*pvQq2A+uEa>*T#f%g~ucr7WE*24&?ZH^3JjOrD?$dgdpYU&_XHpk|w%o(^{&YWEA%cgappj3i1RejpR9c|?UNu6BCO z5Pqkih)`7xlLSb{o&=o)ATc-f52^4iUD*AlJci2K33L`R6J3Oq6c-milH7Lu3*qY> z3a5=xHNLU$4&ke91G_EC2r-^SkD*c>p)5fHLN zy#S8=A};*ABa*&HH;}4%a6TG0ZDIIbSy`kHM`zgv#N%{ug_xk9x^*r z@CsERwBGJvj~Ous7h3}WvB>?0NIRAjdo+YI$r;tEm3n5&cPxC34j=e zB-G$p|9dCOLxm86gu4{ofeMlPr-LOVzEqqgxQgqbH}YnFxFvX?7Is$F+wh%gPuK@L z7Xq>V_%qL^M+)L1z8rA$a(PqaA+q01hMnEHZ;NS<1fK7nmUCt>sFDrt@afE-b1wCh z+Y&_rs=(rp1N3sA6s%l_=MlgiJ`q-@sD*V}bRQH~R#pfV%46z|E*m^WJv$2MBZ|4k z^YAiiIUi0o;s(n9A_Q1IsNx9_e zS0COT+m1%G2fe!d=oNS!c7-kLkQ@?|@Lj_LE^<%o3_AMYoV?`@csc4n)l1Jcn_kN= z%)4RB=GCh1k5`O#TaOQ@G zRux4~d(&KWoqt%mF_CAE3H#g=|HLA$Hsi#3rXwQZ-IPzD!(xA9%0)uFDfl;IaXVTi z&Mrz5+~93M|F0Io+opzJ*5I3CD6{f<%y`VN>W3C0Ea-1~NTwMg5a2_;(>`?g_}`vY z!k%aKJ^5i6C-&p{48Awzu5_rDFY&~oOijf^jfkagQ8nOb0a+9UTa8kK6OVXrf1JN> zKbfR@REX@fMDtCV+i=D?wWT5-siluMcx9zM)mfW0F-kw;?4JALRGFt2o3$+E!c&+R z-^wSZ54r?Jl#b7&NL6XKO!jk09dP$Qw-yBA_NvMY(LBiHWQ=Ie7 zui|}PC~_>Cl*@f$FQ`{kZ0fp5*gu`3YRElgld$7w~6P&nPTTj1VcvVf{Skxq{P_vK7(%sXIqfdf69xC$sYGR#-;XA|ifj&4^rwR(e$+OmmS-WUXM+8MzbYrDj6Md0+J0ov*z)4{mHkdgJrMy#Yva7fefw4t%ugmQ zsfsKM?rnOO$Xjn?7)kFsr>*q60*zFIkj33VMwa@B!a-XfUqAXFVnoB7q` zi3*@I^dm&8)D>U-DItH!s7g^mT*Fn@eZkJ%3i#F)eg(e2($kWrI64iuJkOLr1;Np; z^LTqVl_+_Zh1I4Nqb%&ab!w4=174-_9Au#psw%sZ(fN0EQ<3cRLKFcqigQr0_Ux_a zvMpPCTyK{?pE;?ODLXmczFk=*LaG}|46Q9(BwmtNXm8bhr7PhqXMt&0}JR(83 z2*5$%%SdXTfBAezS5=E{*($hNg8U7YpC!M}=3;@;l^K z!agXElbk>9s+%Z45PVqaGUNepM$jAAFo>k}PpEV)DDv4v1(NCXHt$^Nm1}c(F*3x3 zxS8IG8OqaH5VGHQ5hb!hs3afy&rafY>RVdfA2+Az!s7pCS8SSm1b*lghm1P6pt2^$ zgdKk@unv_=Q39owLxQ;^j_7bUYka2;nfW*=IYh|R!#?)@#8 zYt9*XG5%ohCwmrUq&<3Qkx^2qK_w2!!e>6<)(#u%uWzYk&Q)$U)P*mfNmdK64a~zp zPW+vXlEc@@^OrwUjLo*|e$~uLe8`npXpaoE`d|zK71S?p+cQkd4|5-l9xB(>U0?r5 zB>ADQSNG8vgrwd}vXGx20oS#tdSroMtlKn}FLs5GA}@K~mb0_#+T`p7E6O7WcPr;j zW!4pH->nTrFITF3;^9nI)jg`8MSCA0{|Y=0N~FTK-tli?pN<|`qYFOn3U)HS2i*N& z%(;Dn-M{KV+>MxO$(7LFrhE|OTKoO(m&5A>k%#*wrn^6yJd%{Y_2ddgY#ID2JwqPL zdPKw7Zfvw83eL3K!;H$x6tnVhEFGEZ0Yd^qY%M(hrTF#tSDMa7eZddJT$gvZJxSes z5i#B6`N*$?166STH;vbPG6r;EKTKHZI3V(YTba`qP9Bvv$TO-MadRiXlucf9z?M@Q zYV%lj1UI7mPd%bn-($E)w$J z$F>%#4O@PspEd-~z75Jg=TPdpQjME`Pd|h{6Sl*W$G)CshJ6}WB?gfyZkt+C zHeG3aSr_JDNwEojzmWeItfW98F@Rk?Z=GBOf6VwJ z{eR$0=8-NDl@X;}UP-PYuy>MH2E{_dFelYVp4X=Tg(kK0DGe`t^M3|` z=S!#u2Qcb-e<5#R8s=14Erf>VbyemP0+ZNS+4`$we2RyM`a-twIRS(RR6$NoeaGV! zEmu%kotNs)?X z&_S&SzDFBt2^AGpyv;e=Kz&J#&9y-Ph>2;dqh2$SFz}{Lcs! z+;jO$Wi37>b-?U8b@ukfRDKwMP6c@S8n|xei<+m9;j005vAeGRVKiHq5A!*_NwR=s zE|303*mQ3Wbi=V(v-5kmxfFpEeyOy{BHmjslqolhc}fVRYKLy`-3ZR!Jtp6F z$FaPgE{Wyh!Fgp^AZnI=S+7tCzqo{DEJ(c`7G>BUNJ z`C0z{_8-|D$@hmkvA=})Q@bzUrQ`Ym9j)nk8~#6{-ZHG|_i@7}B&3nf!54INNembR zK_rw=T4Ev~AV?!M21w^f5$Tfd6iJEEDcz$xMvi*+Kc3(5Jn#4V-u=0+>pIVGB;HSD zvT`!mZbL(+3tfuXeVf~9po%2Iw4YT)$R{?0&gLCSt*gZS=o<{Q)|PftmLD!Rr&8L^ zd>jQ)7n`>B0(R)q>#&d|kS%1Z>H9Euc|ns9pDCxIl>$m3xGsf{Nf}743-KQ;&K;)< z)x3^K&Mn8j&dMv8a(LmGPvWMZ`kIdVEa9zxU&8Uua+Q8r!k%TR>$QFSgg)A>?sq@^ z)LkB?_^O!9uzBKSykwVGt~k2e;4FiIgSS^WEjc_-yIP+Oj>VDl+_B#PW+ivkPz6Tg6sS*V0 zciKPkM@@jI9qeu16leGrN1gAJ}I?%?ehHINT=45nk|Di4|+IM|q zBj?_~^^YnJRQnDj%NNEQH3HvL(`}gz3F@Tyk!i}DR4IQU4Ttv|_#wxWY+au)ZW zjM57M$&3;bRKFLXq)2*lN=+5_h_wH2MYtL1lpdzYyQgDFcj2OfW4f}odm*#m!Yo^A zCvLw6lRY8Bp&~Q--{%6v+Y(I8{;r$uryC{~lB=e?yRJpb2<;y*TnmFW;wi%>N977w zR!{B-QC2Etlg(%!FMPM8F50PQdcw>1*vEum^cjXUYywDuU4Bo+pmG;SpUbl$&sI-P z)L7XvdzMyhv2MRD27fQwE0K@ZAQpTrW@p;cTfihVVe1)Cp;^mg zj-I&4p&8@8hOB0L$K;ajpsQz8^ z@vUkTJKF*B*prdS=MM^SZSgd)Q%U~QpFcGWL`0uQO4#JR|J3}U5r!Uip&2S}x6dNC zgwrq2W(PbmXI5bEvzOkj?=VH%MB`fu&3s%ip^Ri<%C(J}K+kVveemBk0AVv~_AW;2 zxp$DiH8p5;-?-sF9oRB3+T|qQ(9ATNZgqS-f-S3rpC2O82hL81@vKh`rNR*_ePJF1 zt?>a;)|m1BYAMRw-N+LnCmG5u_PZYdLun~)={uqaL)U-=;Y3~{4sFd~@k59CDV#Jv1(^emD63n#Vg?PQ_|cx&=k|@m;8=*=TtzHym}-K6u+80 zfp~PCEB8!9oQZ}X`=6eF^-`sPoqz9$MDMQQMa8(drqbB=N6ys z&z9+9rCga)Nei5<55y0@MBUxD-Pq+eM&fJhB&ql@NGQ)TinW~*-2Q%15v`pq^?I?< zpm{6c6|t^Yg#~$bRndQ?x8HK~n*BjmJwxV1^t#RE(*tfl%LB!Zm9Vi&B;tahB^fu~ zz3B#e}clc&b@MA z=N^-@=Lagh;)!#V>f7(1&A;)Kz0Y3z*LiJCl<7I=gX23Mf%KDD`bs?KRS07Z`nOm8 zPetx?B(oLKEExJ}NccfW@MIDi+|)KHdjYyrSw86?m+yZTy?Y;s4@{R{-$)Zu+3U(i zy|QT*wfmQ%>K`J9$B{b&+s*XRVR=3x*X=u^lO`Q^DYQFvr!Agg=r0U7*Fdsv09|wX zJ~R&%fB^ZuV#oFMZX5n2f=Va-z%Ojf(Vl&L-sb6zxx=*2x-2%h(Q4OafKfyp?iTA^ z*xHEeck>DP3Fg0~iA#q>oVNA}*;2F~?9;L1FtQlPD?$n(#nZS5`{V+N2y|EtTPY@#Wc|5=5Z9xu zv5HB=gyFUS-dkpF3O06BX-gN2MF@GZuN>ZtmBccy@u`2Yir+KMu^g@b5`^z*^?Jl7 zT5=gc6brc~%7)uVm-Faho++(+;6+ztV3>glwU5$lNb`uyX5FyYlcFbidz610>(!)8 zhed72Lr9Gu2M;>Bxk}Omw=!_l?0|Wf3rI~a?M{uyM`xN1`Ty?x?XQ5Rf*zhZ-+830 z*W7nKHm0Ld&>t}v-Tjf64L68;lO%^rOk+k&{)_3RdHO}4OS!hX3z

|iJ)rNwdGr)EOmirSOj@aI>%6ZNkal&y#akd%Z!h9PH=pX zunSE4#rHx6xEAD*#{#Db`j(nTHb$rq( z`SIDCw`IE4UK1Cdl({%QKiRpYvTI-Ol)2E3n83%6*X4lQTMw!im@x|=F;1LfZo~Bi zz8NanVFA(DOnN3USPvw4gNFtrRu0qgkpyHaDRvGISd351$@kpw`x|c>3KfXn$u&2; z`YH>)`XD!_1eR6A#F*dni;b15*+r!}i>5Wk&f1YAUQr*cES(1_$e9xt2lm;#X>q1N z^~f!^j11l7%FB=Wh5XVRZ?du2qN$s&8EW$xAD=en{wJ`EcLpk)nsQzwbcYS z`Gd1Uxu1V+O&I5g%~#~+ly9P;rmZu+8N?k8GcAjx>r1RXidKDjVTGVLT0Jn;=%&b4 z;Rg2DM0S{X%2U^#WXLMY%5+<^EuvA1%GkN&g*j1>MX_d^W76@)P`%T0883Go2a({ALKF?KFD>=KXUSYGYYJ3Q7Tk1Ni}n_TnL=PkP}eZH%SJ7V22 zNmh?T@7kRtc?vyJuFI61o{T@EJ6rOw6X){5n9c#d;0Ek*S7H2tlnGpED3z&Cv;vSa zF%Afdu{fd=#`T$~KS;8SP>%}g=rPh(qP!r9DH^uY8h5@~kzlghqids+!c%8YwPtRg zpBPMh53UQm?!}(WIA2w`YGpXMVoJCwB|bBDQB<7UXm}4v=IzL^PMtF~nB=H+N83#a z)$d57Y|nX>TZ*nWBxEG|@?BYpj>LtRrdlofq=r;Wd8SR0(sQyC60&pBCCQOlX-REJ z(p#*)-3yQ~%bk~!kQr~dvUqFdWm_=^&YauN$6lVGU&EvSYZy4!f`Oz{;h+$3V9B;B zaIj;o02H~N=!ESD}J8h-5^cocoYSL{%o5NvbyP58+$p9d*FRvk~X$=Ub z2Ipk}2>f&XbGS231p}FPi6cOn+?AjyX?&<~CXM`ez-!(c^n%-K7h6Hs)HHe)q>mS?`Y}S4F6yJZNv{ z{?h5q!P@gT)#`PHs~cwK7U`ouDNLH`&)28CXumgfp)=WFNSN)*w59lQ;%<@eNHWB( z;4HB)EeiZSeHrV6mm!lQtzc&11LE9u=UrX1aMP?*^-M*vpV|PLc`fWelWZH9{J`%M zerZ`{23RdQ^CPZ4aQlQG&?DU6o%IWH$X3#vA(W62?Na2jp^HF=uF6HqmHu?hmG#yG z`BM*eOqoC5?w{kg&zn`-ad1+}gKuTIj(s9YpMF3I3a1?EsGAAop5<3l9GX)2z?+#d zNRfO{{>!0F?;Kpc`rtd84l&!onPdH9{rnpK!?DR@lcgVy>BxTpA1z3+&zo7_acD}> zgKuYgKKfj*|Ma*k`|StwY7TWyn=#*>3&|$?{F!x~hbaXr|C3(-$p^0Nw;n8-a=5c< z{yck1;SuJ5q2+fsZ+e$3HamFo7?&?%+qlfOefbl1lTgOs9qiBK}bP zSV!N%Eo;293od`*1>x8KkdwXXWuZBXda7=zaJ%IXKYCJFdh$1!Mt*y1V_f6{$v@*z z-^sD2{Vr+7ijV`Y20{@JRSICq&Z6Yl^wHK%S;Vm{VXvZ4>(mBX$~nkA!t_dmJi_9%^0c(_i*qJt=OiWP z+?zc)Cnq^6=Q}yLPaeN9>tgwx`_Fsx>V+|#7jI6UQl9K9!>`YmT%K5B8@Tw&8Bxhi z;p54R9^BjCYLgqPTdJqFP30rAztuAL>ayZh?V%MJ5PlVBFJa!g$(8b_tHeopS^;G! zq^Nvl&&D<3;D%|wtQE757RN>x)b!L&^0>U*EtunDoy)$wG(BO`vPBh=)dq0!I}c{Z zr5BW~6n|e?R8(2?)#AbAyu9SWkZxNYBoUo{l-2Ltox2TJG9myfNxy{BQ);oi>mE`510-d+FPV88sw+UkSx zY%s4{&0kks-^g4k>kNfQ2g^GvF1zW%#X%hGK+&Mk@9w`utges@Qk28R^sz9avHSDn zlE#U9_&CUpkd#0$3$77pXRdG+A+HS>aAHI;VM6I}830cLF{KlU3}L@sKJW|c1&ytj zU*5WAa%a!}Bgc*%x$P%xMQ?8({;}wDNC>_uHRX~yE3SI}s!5SHlCOAu6Q%288_%T< z&>TfyjLy=t@Bnotz!;F60oD&mrd&BL(<{=?pc4Rg1Y{n)uH-wn&Xhk~a_cKcrp_6C zWOUBdr>}2qwLce}yWFzd9q)&}>f^=s;G|;tJJRyFf%;XWqpRu%;_CAqJSUoyvllx1 zUH}AA53Fm5s9PM$y8v{hG1t?dc1>}O1U%O@ z`h1N(y~$h=A4o6sT(IawV+E^xz*Cty$FjQi(2bJMnqZGHvYerTc|{fdQL{pBABPLm z`V_+@>((5s?YLt_#m^EG@^ayI-(yx(4*81yDu%FC@$8S$Z%8YhNJ zp`~;R4$V~dPG`0O5dH>X04mvw4)m}Lj1BP$Kwj7dAV=`I{a_A|5QCH~2C4)D)EmBn z%7evN71PkL^|n5#skpJSF|bBy8&r!3Er2im7X|g ziAS7ZSqK+sje&V{XU$zuyigcCSx8FM!s`x`p)9I0v}Q}AI3qPPGp#{t+_ENA8C7O5 zjotZ!DaJTU5QW~gK%lp&GlZSPC@W}*Gfw$|adKLL$5Z5+O6vvj-PCU_fxmO?zyV75 z8XTSrd1O{!wPc}r1WXntL63%)Wq{-1io(Zc7E&ro4K!}h1ZXDk*sy~@e<2g~7_2r) z&t@3~bKV^nidnhyXJs;$Icr|NU)p>}78;vrOt7qdLz;_UBRLp!(2j`r}o`(yqxwEOv*>ejs@{S*0p2Pb~@x^Hu zH48pp!0Qd9rig1UN>=(tG|jw4tV&5sOQ{l{&o>HVe&NWX@>##-waMw}$+i6U!zBT$ z;p9594|3nhbxNlnDfbVuW+^$nBsR7rJvrmvM-~#e;M_O{Jh?vtuZ+tb#p{w`2gr}T zXh63STn#UnT$x!C^9ork6B>4Sb`wJ$FeC|?tPIxED7q{QNAi%vD0A>E16flmB8hfr zD)>WLegPte{;ct9Sthtuo*0*+=pExF8yjV$%Sxs;Xd{cvY}QL@?|@MdZGj5yrymyo z4MgM=JJ>Q;H1Q7DE||B(Fg6u#apjN2cE@k|*avLHC9e=}a3AMa0Ho1%B?H(n@7TO|ErL3%|m{Y~T!xA+4+ zd+Sec%BAoA?QOR6O*Z|fW5?fOFvE6B<7e}k!z2V7^!(6^>}U6#c<2wee$F>M%O1bw zGKiT=^{mMt6|@=I>tls>ga$z-7bssm@rlIo6pf7EF({ zRm^N|<~R0ScU@2Sb=S%BkJ_V;QFaO0p(3RSeUEBa?L0yGMiV67R^ZeRI|1d44$B%a zmPiy9Ed-#WCc*z)pbEB)=qu0q7VWFFq!Yh9=3JS2QB*&zxNv5X&uN%nJ9e~oKC}iF zgd{^CrXVTDpOaJ&6W|ZIZ0l$ijbG2|1)J*>^ng!P(|ZxKSvVh`+Ko?^A4{7ubH$vT zx{i*z;#KSC2E`PM*MxswO9~S)?G-o8>UCnTP+^1?NR=2@%})+=u1CQyPX$d<1Kq+A z%vs`_k3#@g0Dx=aWuOH7=&5nj+~KJI;aOdBkq8SjGNqmgjW4?p6wyWJG*;+~6Y_I& zbMq65^%add(X*g29bUBK`#W}gUrd`QN+07Gd(jaSu_U1x;E<0H zEa(9dY{_VMYlWETaGOkSN1|BK+C932Po=_l$iJ;7aH9*0Mwu}Vx-iR`*m(q*>n6aY z3Z+oO14HrD=-2vh2YOHi5-^!cm8Gr>YIa=PT`1%{fNk6!M@R#{fA#FbPKml)6~P20 z1`0*f8q`8xKe-Wgv%<12JnQQnyXU{?Qb5p`3iPpcN(X5cJ;>$v=-S#Z(JNZ_zB#(& zYdy@KRJwO;-RX|}^mOn3?R4D907142$qzqz zTB}j9g!`i#Uv|z~v}l&|IamZg&|n@y+5C0C-@AF;Dly%K3Yn4d|@i} zw0S@>)vg&21d}bg6rRfie$4_Ve@V5ydj;9v-77!*8A=y>_n#4K++X|ocGk1~^SiVL z>vbec`N;R6hI!SMe`d3l>?fwb{MAjWtflFCm> zqdjdEvu9U88A1W&6Gxw%8{gnN#=VHsa?*bB4?V>_AimbaQ4Kn53gAksICqyTN5su zJD1&}$mz((kWj;@r>z00&nlWd6UqA4QPPQ1{onQD=~bGSDuBTM6;91O2d7F3(W2s9 zLYn8|T-Uz|(uGlC$j(HT1b)7sgrKj;IXEZj>WT+fM&LD1J_OR4Ls*l*q z(0*St?x?Cn66Xlq2=RBXfAIcmuf0F3!jl#b&CDrGE$O=Fk~`|^*v=7bS7u(Zditi- zwW-ZL2jmZbwQJY=ENTCiKfZAN(wlb|t*M++%RhlqRfYV#{G9wl`NvUtlN<7qoXx9x zBKzeX35|WLYW%Zc^=lYDzVEu5<-IgK1gx>U`KST(A29 z7zKa>5}U&3kmea3T`C7PP8?q(!vL&C%aPcrM^Mg1kzT=ZU_koGHY{==3Tvr$@}meu z(76{7H1?;&I71DJEHUJbY5U7kF&c?($w^%6EDR3)04!Cc>mjVaVxT%7K77Y zh?pqBk>{-y%(hC8Bnm!1{Hf0!vV!feb#LkwVyxaMx5<@y*LL}%dvho98^~G} zG!Mgm12%DxTp%-y23ElgP>F!e<8u@r#M`blW%*7XNs4jC{))30i@_o{144R^Rr8*2 z&`0p*=TzY~ufG2^DI z;q(2Q)BlV7uRm}~M}+kHr>C!dWnn&ErK*Cu zE0x>r%5_Y=!9E*3GS~n^U_5eSLiybZxnwPulF6?oQ?HO%i>G#=8S&=)RljeYeqj9x z@a&1IUpOl(sV3iSmhVvVt^C?Gs8pfKH-G)@yI)IBZS@Byro?W5#*eMGzbgOS`0-~wIj{%qH??L=S2NXR ztHxf1SHsRpw0yA>v zFz!3P#c0_0114N`D=T_$``GdAPi)`*1iPhsjS;ks*I=%!9eIAkj-xhnU5(igD{-f> zshbOzynpf4|Gb7RU)uk6%gU84Z}%;`lj%N}&tEE7O~uhZ@RAp>z+(@yf;-KIp8I}x z!DI5P^955(tf|OqvWk_zW+iuA#iVDpn#>zsli$mvI=7$FZGCgP-e?YHo6X_93;UmF zwmN>eWA&Yr&E}k-$*7<8?giVAU#2(g{Ie=s13AS}aA?3%B=_Db)9(y}j{!}bz<8*~ zJ?g%B6!NI+Chq$f<~O#PjBK3i&fUL_9~G&2j~%7mH(fB+3jam%K`7{~!1cNu7L~(+ zy=h;dw&bj>vBtMm9KnNrBUkX)?+a+$*pYEY0AHsXIp-+-6y9(hF$h$CqJVmdLqK&a zaz)CwldWB7-owEOwgIH1fMZBlS);Sa6aa|k1qDt}&g~oVTYJssk3Tk>_X4fr9*@9T z&wOZNx4r$Zl4;pQ*Tg=hzCoX2Y{;`c@qPYdySUmWO6x80W2*PAyVU04t~7VT^GVy+ zhnU@kPx*$lr}N4$i@LL5fcjI#@d_-FBkZq{^@S`jHYmR$t@{QVp0)EJjtpP>CVHKC zwK@aG`T{8vN%%r}=W%B$ z(_Hb|gBcG?AUFkN5Y~VkE(GrtKO*q7;wN+fJOUo29}*gAigXo;osss59xv!U`MCtT z0Y-7tL3UXoH<G9z{;ZqrR6sUVoNd1cHI&I+7p&q;$?!N3uAwtrmOGDX%no4MwBE zYcw26x2D_tR;zm3LQw{z$I14jT^sfninHcc`?<&9(%S_|Fgz!CeQEma<*PGWbp4^j|Y{)20DOhSxob0p(vRs8Wo6THMV&gai%S?{*q({Z?zGt@82bgi}jd`<0OI%h}?mLwImJ5vIN5RxqA_FrH zs@2572~8G=#8x69z5(NV=>~rmtP)1KN?i~;E|k*J)1YM>DD}XM1K28x)-O3(Ze>l-?J=9$=Cy(7F3C?I= zOiomcQC#KDxT_pC^QMT7w4}n6kv>CmQNZ``#3MQW;Ul8Q=rkAw7UD+1DS2AAFt5=8 zA(0!o*B50lJByg6e69S~^~sLO zw|{F_PIhXxNfa*p$t_zOL`Qkrd0#$!O=hMi9nQo;ugPP(9?98#=>=I?S8aao(^>ZT zhF`y0oHk=sMkaa7nFW=1eN=iTkVoP4?m&{jrHbrYIKMKwrruJ`EsJt?C59YnzC*C! zQE}jx$A82GV{%*XJUltl`DgiwiySp_^I88y9q~t86c=iP4J! zOUleNTViVGPR`iymr8w3ZGBv<)8vY4j&06#i|cM)Q)97u{jKbLX4*CPHTjQ2sg`&c zEnW%xe1QwPR>j9#8~m4DwLLeN$2j6+6B4ZEl*vZl{wrR(WvDeV%`t1Tf8LPXfbq*b zW!1kU{S_xw#h^f!DHf-&ED-(&wMYUV2B-?j z6~eSPWM;Y7&#Oer#)Pmg3sa{oS+olnaA``?^re-%BGFb@dQ7QI$e5a!8S92~PqrcW z%%9*w@2k%r?vR+n>=#QrVX2g@V=IT<{4WbG{r+p;zjT3mV*@q6gZa~+$nVMWBaO)= z(wr-w`rxy_AAe~0qngDl_DX%?Ehd@uOH~qD* zwHg;Z@OSyv7j9++e|`O1ksR-mTZaNy$`}2WEw7hQ^6Gt0{p{86?_I%@+xEVSsR4Ns z&@>7TC3|*7(9tHD?tbWIUj@DF`(gVBa;IdW66dL8xw72&(=`%gnh zzCs1%*%DQD!bmw$!sq|PoyLagim<*d!1{JI(VBo(P%#kG@j!@A$c(}>yt)?AcAAc2 z@J=zY5+y+c4O{4OQ9sO*D%dbC07Zs_2{OW>#H3(>#ID;VMJbP904q|7Nu-?yyrbMn~K9OnSo4Fk@c z)L8C(P5yJcZF;~~_JlV8LqFap?nsI^<-%FC;u!KJ(Ug!T#wSog@j;JP4s(1%Im~fR zISKJ%T7pTGUs8NphLdtl@$8n=Zd<7rjaq-iUuw=|`8UZgd>Wmb;xa~$zD2TtZ;eJ9 zT`9TIpR$UZaXdqZN7Igq5s^!a3Kj~lCj;(!JkeM~M1#cqv_}Ts%8;Hh zH12(EWcaYY~)7fzL!mxZ`r)XYE+ zt0PLtbgAx?I7Pm7M1JY^N97k^h`WTX8fIm;KgP;mi1REbqDk8un00no0QaC}BysLa zx3F|qR+-lT;-vs4*|IY6gBc`0&i*HwK019KPci|*!?%>)e^1Fn^I|@ak*BfZi{;nY zyPtP_#j9P|C%d zIzDS(x!~yqYn5Ecf2Jh9=^Lm*>{(AS!%FC^F4wi_dSGSZB6y*CRQIgzW!*cvk942n z8zGA2hoCFA71%OBmJ$;}uWT`($E@x(gc!ZDg-~`0;6^B1i7*L+hrI!1y{AYTqa2d@@6zTCo1Q!H`o@u428IC!p?{x+;^E?Y0l5?UBS4;X7dxD;~Fnwu*TU^wrhboN7w;8N~lBoLGfs-|Qr^6m6 z2+l;l%xXx>v088$i^-UZMLaqhS4nhP%WM4Bgv6RlriFS|_PQ@RG{wp~{yIG%EZUUo zugVZZ>+5|x4?i${#-&@97wLlyF}@Rnc9YvxVpFd7iqUC_a7yKjN)&H{44Es<7~^)Q zj`cVli3wAjPDi+ket?a>MUOv_72z=D&!M?0i14E< znc=Akr;1+YFkp|BV2duyO}yg#tJ$WZ$8Pq0S2##myV-&$Vlc3FA#2Kmc5Q-#L0 z5dz+Ga;S1VUEFbVF#@!6v5 zh!ce$wCeIJWPazJe&>?M~T7=80Km%%z<$p*1`g0SAVL7MV*HckBHJs zx(s}m8rCDeNedfv-)7sjuu&Jww`gIL&drZ#VT&%8Kcj{1y2*k7-b6p-jkmzhX%}o^ zbi&7&51O0JIJbx(G##NnXf$m>H~1emZ8;TqtN9^B958d9Djx*_BnRC2c=rLL}j zV9Q`vN9VAwzIkKBH@&&9ZHq5ZToNwy)%5iElvhK(!N^c#aATwm85+=@KD43+_=!sE z2Spn}bbsG)&8Emue=i;uBBlfKE3@Y{^Evd%Nyq}q^SR(#-++v4WW;ybv|7X-&TfSF~Z~hqFWjn z9O~-t^92jb3X7GG{Lcz+#D_%iDb#h;r4bw)Q78J)4gJcsQ+e}ELq&O7k#4+U?Z~0# zRP)d?btjcIh&tMkzE|nCZp1Ysmg2jxAdDb1UP>Qw(Nil@5796-_C%V8A{eLk$e?ey z-#6SD@tqmkp-Ag6eRz96UgAwV2Fo`**xVNBZ656QH4hIDcD0NsN&5PSyILbd+CUGY z76PVohI(+=cY3V92^Mu{U`eNd>@YyM5+r&NdQSb`=CjHyRK85tIXpZ7y&h^_vkFUv zUH$(}2}KwwwO9I-(JDgbZz{8>2Orrt6v2Ci#-ZE4`p2Kc8wN^9z$xJ#-EN#QU9GzY zwu1KRu406);cgXD1+m@36aLx@U1YH&13UfBU`{0vPIbGEn!R9GPWFkVOFwLY&BcM z*0Lt-|C(6~@Y!cN8*624EW+AZ2kT^AY(47+^Q{;9l>KagZGa7wAvO$?up8MXcq8A! zwzBiEF}?ueliS!RyNF%PwzEs%c5o-#1xb?2pt`z;UCypxSF)?v)$AI!mtD*DvHk1- z`xcC{UC(Y{H^N8IL0ITM%#N^|*|*s(>{fOgyPe$uPgi%byV*VLUUnb*4!fUymp#B9 zWDl{2+4tBZ>{0d@+^s&ro@C!=PqC-j57<#y<9wDq$9~9u#GYp_uou~n*-Pvv@Id`C zdxgCUBf39hud|=CH`tr(E%r8hhy8-R%id$ZWWQqXvtP4g>;rb3eaJpyzkxN?-@$Xy z$LtU6kL*wE6ZR?ljD61j%)VfMVSix4=7)jl*ytck(D6&0XBhW4MQVc`T3P@jQVi@+1y^3#>Y)@-&{#GdL_q z@GPFqb9gS#c`5L~KH}Q46nYZv( z-o_)m9ZCR% zG2hNF;XC+FzKdVVFXOxU9)3B$f?vt6;#WgcbuYh`@8kRV0sbw19lsuQ|Bd`6evlvH zhxrkHGygWfh2P3=F#jHZgg?q3=tm{3-r4{{cVBpW)B)=lBo#kNETa1^y!cF@K5wg#VPk%wOTJ^4Iv!`0M=V{0;sl ze~Z7(-{HUD@ACKfFZr+d`~27Z82^AD=O6Nq_;2`c`S1Ae`N#YZ{Ez%k{1g5u|BQdm z|IEMOf8l@Sf8&4W|KR`RU-GZ`34W48H>a)ewVPskSv z1n}a7VxdF`2&F<07AV6)nNTiN2$jMlVX`nqs1l|M)k2L>E7S?~!Ze{lm@do^W(u=} z*}@!Qt}suSFEk1ZgoVN)VX?48SSlMn~gl3^dXcgLoh|n%{ z2%SQguwLjEdW2q~Pv{p0gbl)=FeD5MBf>^uldxIXB5W1T6V4YdfD*|zVN|$CxLDXO zTq5icb_%a^VW$O5rNuYT+7TuW+rfPuMRU5WXc`CtNSwAlxY2BpehD z35SIv!p*|Bg2=@!$6&}#-lRA2uhlZryk)f_u z{ZOQNu(i_|>Dw6T=^uzlop>G=hlZO6&2(vs^bQPf5l29^i0xfHy~g3rCQu+95kA~$ zpm5jFFz@fy4@P?XH%1Iw`}=#Fy84XDy?8^<5?BLfsCb@jFMZ?+8dG;e8Y?HX+DiJ;Db zNb|4(OEsvfP9rr%DX^!%wOefOY3?xNW7-Bf`}-n8=8gS5BfXI(w8x?asREN09vRSY z7;Notix^ta9k>g_%^f0sLt;yRf47k?w8BdRgI#^Y`qt*&$Y8Tb%PZdZwCTHso3RjD zh9jGYn>r&z1)7!crmnW(PBY$h^fmQF+J~)b5KHE8WYD5MD3qa14X+;=8t!V}BGR{5 zy87CXPR*xW!>{q|sHvXV|f@z>l%BMx zL8TQ&H9Rt4Rs#w|C|yKwgysx&ZH+XwkM#6dweV1Hb5D;mvbnXVxwrXrv&4?B_F)l( zV>{-^V8j^N0zkuPm?+TN(?1lkqQCmO`Z|=hOX$zOh_SV~C(_r}Jg6VUR-wPw(AwYI zi}BX?Hh1(zhRx&sH8OCzAE|u+_u);E$gmBcJ}^Ku?5h8&g&CfB0W8p zR_fMvbnI}%+=*dqQlVQ3(tI~4p^*WTa;FZ7Qh~GS3`9ns6{8g3I4f#o;OtCP3~+dV zOGLkE5Ocm$8g3ry9?}D&qR&h%gI$sKR%~L-1i9)wkvazZM+Sga`nn|mS5 z$Z!*VDdq_UF-g?`b*n`UDt(1{1I*qxBo6ft0@QF(vKf>RCeQfFMj(PULWMOE?d}J_ zbO8R_uq3tgV~i~tI8#dNIB3%Y;rL;|>o9hC14cmlAjZBK7!f$n4BXxcq&d>lVgz2m zICn(sN*625pry;IKB|yvpry2_x6OjQ!=3#@==_LrXrybHM$AY+MK$VMu~0=KSYi5s zm1(6^mJ|AfmXWR=%$5!#G7r$YV`}b2?ah6y5q)o@t-EX3(oRi6E$bs_dIal0r_%3Y zdvSXts;z$n1J#6f;!2$veO8PLe`iGj{?2-)Q8Ay%Z&8CvMxz=gjH;ARNeyk0p>8Z2 z`kv+ix+#D%Z0+rDq3=>=qg8`<1>VdXM*4@ z*#IiVra)PRWx~p085+Ti#PsbN09cQ-s39aPFSQPgY~4zI*A;1vU;(89iOR8`2@;{B zAL{Ii^t9Q>7aFxSQM5!g0lfl-M!JSN(W8Svb`e^5Hn+9`L20YDf&ml&IV(m5kh7u) zK~2o0AgIpa-ky-yIy6+O2W$dmnpLby9jRc^A*_xrzrj<OOZWXSXNDEchhc(j6pqt1Gw_b9G3NSBax3s%#S zmWaBvX%FIN46}(YO7!V8)R~4hzzv9MpmY#`n|t-`plQ1Yh32+CvAv|M z#NN_1+ycZ7Y^)9gFk#Q2Wmvf>QI4K|RCI=zvQ2m%8JPH%;L17Stvbawfz0jSG-SXu z9qjLFlQ1zxHlvwcEwr`_b#EEKqSik$IJ98|ivq|2fJ(o<9cZ~HBGQEx@ZqijVQ7Sg zHXJt4=B8_7L}(f5;2XQ8O_8paerz22@P`Ct0lV_;m<}rDrnq2?`T^r>aF0rY)2pz( ztsnG&vi;CHzpUK45u`Y%Ql(8uRbFgUS2iW0sh^?(bSb3^ja7MwE@8Tq(WRU&6^4<% zu7;ADV)S)$31TWJQ$;B~Ql<*ZR6&_4C{qPxs;Cf~g2hUX778Ipuo%?@i-T%uwJ0c9 zj7-5|WC|7|Q?Qsal@!y3-j-0N63SG9YJw%GCRjo_N+?GOI4p?)>g>sZ?&8yc6tS?auu2)h})>5rX_)S#0r9Q0P zsqi3`5u{p!RBMoG4Jt1vYf#HNjVcaN#UUy-M43XADMXnfL=X`ohzJoxgo-PqjS=8d1PLTUR91*UB19k&B9I6XNQ4L^ zLIe__5~?IXl>{gU0Yiv@Aw<9sB47v+FoXygLIeyU0)`L)Lx_MOM8FUtU#BTP9k=(tdha0PlBIdGvI7<7av2Mv0N z20es9$AxmxpoeJCLp10i8uSnidWZ%+M1vlpK@ZWOhiK44H0U83^biethz31GgC3$m z4`I-8p&Wz>LWBuIzy$4qvWPN20_EzA3Q$d98u~B|eOSW>fpT>^1*pC-0YI1lAWSGB zOt2KD@ekAZhiUx7H2z^4|1gbzn8rU$;~%E+57YREY5c=9{$U#bFpYnh#y?EsAExmS z)A)x2>a+~hXf3Q!=X{_hptiiGRJ*GaE>NR2wML!!ftoVyeYtiYFRw;>uGQ{!+Pz-8 zPgC!;TD`Sey|r4swOYNkTD`Sey|r4swOYNkTD`Sey|r4swOYNkTD`Sey|r4s8qy5Z zY4z4=_10?v$(?k d0m81_!itTT%&fM`8Do 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot new file mode 100644 index 0000000000000000000000000000000000000000..e9f60ca953f93e35eab4108bd414bc02ddcf3928 GIT binary patch literal 165742 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 G*yFsbY~cLNXLP73aA74Mq6M9f^&YV`isWW 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

5q!RY z*BeMp5!YRitn`g&nth8{m6Dd0QYAj0ZxqJ;!r>+5bAHQflhf0aYx(Url?1GY6U}5F zylvy$dA2fK(`58 z4KJ8nnOPF^3Rx@@8g_Vg6GI*_Bng?U4A#>qx-1Jv@{q$QbMPz!SyL+_iFRlz_(NHK z0V0O}tchz`Cb(6e7?+~x9pfb%8)c-+N~ShwBa6&z&P!?UfKd=_feP)X9~S=&MC3F( z*fN(l@lMz-Sg_16J{@jx<&VV<$8Y)g2W-?OuM)0zALCcypa7@C54l}4jp82+hE{_p zzbA6zM`9T_Oj{2RAI9}Nc{4Y$2PA<_)4TPX&X=UEl76Wmy`q=?CUS>c{DGdm^`|%G z(s%#%Hrw?koB7l6V{b8-VY{XAvxUrI5`qnSe&|K^v-^%e^oLtN=Nq48kKc0Q$&at- zZW5)*hobU>eO7s-$XtWXd)6mnm%lcTUi zK&*foQA{K#vaRajK9rcS7^w0jBmjFlBtBqCDQ+x!lKgTGJR=daf)T>G+sSz z>3!F|bshfrxlql3dksJ;yki`JCk>MLXg+mixfSh^nFV61GuCX5b*731Gb8O4vs+sD z4ZYW1+uL*PwerFv_UNOOT|#!KNGU?!W7<_aPf)(m1c|p*IQ7F$KslqsvIdML5`{$z z0qCeH@IM!*f^8%E$}_%2`zkHzlwXZbDe}9@bPMTFJd+e=i*a)@X7LHY13w}nwL}8*;!Y- zX2blTm}2po@Xu>WVIroz;-*=>PVN;djL-t96631*$$`%G82II>ph;?=TR4h2OMLSQ z2;d3;a80}nlz<;SHDQ`N9Q8jut4l5tVPQt5)YGAfWfy`Xy6Bw73Vm@xer|4VenPRn zqA@3W4m762OLl&L=g#koX_H0iV;tizI$~lRyxb8pIi6uPkq;}DBs2pY@?nAnJs^TD z8|!JS5EC74lgaH!6f4?##+LEvRQOK$x77r0bYambGsZy|W;q?ZfFQGZ5=^R43MD)+ z6i<$Qt^anS2UQ>elc`i$>dK&I$F<#sLe2x&ChT#9G~oMJ&o1ngsLNFmOi*H=P&BPU zE%f!18&NkWEbGE^zTUBW{);XJ1bwMMA8S@RNVDicF2Bdt*M5m!(Yp7|v1MQDVfLib zz2nWNI`Y#~z5BOQaVG)<*(#Jz?qZkt@@afP>W-7vV$y2Q#<~IOO|h;-EJ;N!4Tpo^ zU@8)hpk4hC!wy5Z)+7DJvtx7JcFpS9~Tv{OBpIM#U2D zk8XI`IcLd|InI}FIB@^{{6VN6P;wTAVBz=ve3qTy(=>t;n$`JeDcSLbsnk>E0m)Rm zW;_r~w&+rLE)V!M3z+;R)%Nb?WP5k7{P1TeUF_R`TC8z@?dLmK?~c#!(i*JSku2pS z--8$Fh@<%s*^)j0|Hg>bt>QjBE@Ipwk1==?343tLN;5Apv7hZkM!Shz~&+WynJAc08`uE`A{YtbCi2_ziC%N89v&j=UV=9qCt+GB%BC8;6h8AOLkTMEk zmx-ycsJ!u=#_~lu7w>+0_wJ|J&2VsFBTHw1WwLR$zLvoJ2*eqifiaekEnhy?+g>qu zZUvMf6i_~XSZe<2FrZa>nW!ptu~C5*5DIxY4HuAXNgnh}=7P5nA$+QwLt^``9#_+H z`mfOG+2|DlO&aD@zvygqs~}VbIiMpZi`#jGF-KZ`QT1chMfGWp>G|yL{OMzgD2xcf z&2eS^aeS+cMN(CcBrQxb--Af)ayk_`(~P!%i4=x2Cw_f+-HJeUbzsH1aM}F%>=s2% zM?Q*#8b&>34M=@f(d_9+*56D?Cr|Z%*N>-GXSyHS;W-Dk(&ZigO8Ro{e)| z{{oOe9gI!SmzU>HpVXWG_x(8bB|uKEg4`tZS&zOeJJplyEu|O751;DAFHVI{_uT2Y z6Ay~b#|bRYM44Q%QFaXTC?4xNd0&1-8@TY3-3 zAO33h?)O>J{;hv};kxBFUs|-Ta#}6_1WHvE^7Ha@@(<-7N99dz$V+mztm%#Hmv<&K z_OGe&&wu#3!(#WjKp8E2Vr{y2@G|Zkmfe#|!58R;hVaITt?gwBL01ilO z3ZFxoXLNL_9Mm{*e31+Tuo^8#Vy7NKITuBG1;>E_=_lK;$bl%VrP|4lA`n66UO>>; zpAzE?H7L6DBr}1{9C5%&p}?Iip-(U^m1ib7u@_Ve$B7W}G$G9eeN%KUjA3F2^CMpj zvrcdO;LWT-zsonhwPf=-f#p2T?lwu&)02+B5bsY<5-Z~UZ`Z}G%5qu^PJba{q69~t zw^lIQDm{`Y`26svo|_baJZrQ*Ve_>mGaE|ck`i1wfvGuDvl5*~yP@+UWrg#?xstWW=82!@sC2}|#8tq6 z1uss{tST(5%51I5b4wBzoR++2wv}z|>)jj-0_YgN!Z4Eqh( z#6fa_%rF{Q1v5Y;0ydA&QhX3^yT+8|J8?KE#u@u7&SESEi`)VT={;J_d%r;+;Wzwy z`F^YXkR>tBFoVH5i)5BB`N-3CTL!=3n-mH#v0$Eu)+w8El3a>)m8>vm`-(DXhJ*72 zfB;Ys@uq;74|>^vV{n17eegk})k9i06F*LvrJ-`HvSF-#DuPq%pM?4DF;&QKObL%2 zQT~zg`_%RrVb6)tnD(jjcNGXaiW=7y?3%yx$tQO{E`P}kk3X`5zd%pp6+76as&b8@ zU_*`m|Ge#d&-nju+s^jL|4-T;DkW>X|8HSt&z}Dqh|&C2D)4Sn=$j%~7X&3a0qO9yeGA>hr{%c;twgFkKCw@86vM zU*w<2r`PgL+@u=xvT6$`$KR7uhb^|n?gu0S&eo_F*ooTumu!(V= zZl~^Y-G1Fc-EF%2bl=lGMHYOq$2OcI`G_3II`xEo_ry70SQ(#iz^~oa@jCrH5kGmy zJ_W2ETHF<&An7^cLxTBu8f*fdiSj4%Pu%}i`De#ZJnPAUJ!rq_HRHOP=`LF}_A0y@ zcK)Ih7c197<+^uLSd9@EtJFHUXa_d*&MWN7@mMUd&Llst+&mekM4U0rm5xH)b?j@o zU;no;YHjSuk-J8pCE9(H$I~C>^+r80de;&59co*2;iRil))_J5r?v-tY{P*CF1zo{ z#ubhP(#hu%%uP%xM=f*lzl~ArQudG}>!_1ttj*QX_1g%DP)J0dO3L||o7^TqmPPqb z=F2lc$0-yW(U8RE2lYqdqG7P}v7et1?FU;>Igx^jJ4xB%bOYQ6I?|w14k+s==dU<; z5{^Zs#Cqfto>+)aAK}UJU*9nzr65A9=B8&Jkzf4YxyNp9V(f=EL6S{iM$R0@eaE&M z4V!+zgez}lMepqxKepqE9Xp<2xAd$tg0}G*%$2pH&u`p$#AdFmF&knf?ld;_aN(l& zFTCoXSF@GN2i|U7y}I@7{uOsJ-RJVT%LS{cINAqZ@*);^>|s`Lr`gbZ-|xqJBoD(z|^>f}mZ^yAq^oCu3R%L4-r#J=<4Ooig-dkn*oo4Vcpo!xc5B0c5-8YXx z9<_P$zK>ykW1Gpy#<}k7{oBM*k(&4D5!!vz1!Jx7UlbpNg3bzDughUkIULxV_62H7 z&e$4jd|Sm4Jm@!a1&{r{fX0m#A)izODZ;2mMy?5QEHV=2Dxs#qx*uFl*>@IxD zH>5q4SAJR4odE;XpDK=5V2K=Ie~qj!WP$M^`4y@88)$ge!Gkz5eC?a)b>h|P3>@nR zOyQ$H3SmF`hq^b=Cw`dw@Icyv>?c9K4I4K%+6W6p%q!19G?!yjT2)z|)GK&;jrWc$9ufXrw99RU~#s+9!Ivp!ekG66gjP#Z3p< zWrf^OC6;;=IT?@oUh;VTS#}W!29oPYf&h@xSz8^+;>fmI>_Mlz+UPYHjRvpLa46lH zZu48M>TN4U8H^q$+mm)p*k35lnP2Va9)nA77bL;(oZ$7P>9bePaOGO99DY~?A+KC- z-mr9PZ(_0`qco*pxjk{J(-z2b720ezb3uuX;|we_InI+FNlRV*h?Bv*SWI4S4un}v zz9?^bY)Xs`PKC2KNG#E26O$p??%<|$?upBF*=??Z=O0a3zA2%or)zrF-!YI6VZy1aKN#^Q>N zho*lbG9`&ZV$+_G-Q(;lDolHHrqg1Lj;r)Uxuzv^y@^Q<39iR-GD983og+!Pdc7f# zGkr>3ZE`q1HaYCi_gUf|WTxie_VRVhmI$0}{U#995sm{M1Psmu+(nVTFiG8&3NFY6 z0#d-lBW`Auh&UWFA}T#q3emX3@)?>wGE8 z8^(W`=#XZQZ^VJCzzb$w0n2^QY_AV6c`iuJ$LIU2sGt9MDY(51x|P|XznE%2NWz97{`x-sjWl?W*k(jiGvfG zDiDdSL_&N6#`n?<{w!D}jB=H_Aa-0RrKP7q%Q#T#ff)y|RTQm_5E7I@=;Q19D%Uf{ zC8OPB!tNcuieO*U0@L@RAnGN(5ofW--`}>4J-FefM7Q-&Prr^L!vqVlSbzYxi?9i!!v#fD(@+Ji>SV#- zhrj^|6jX77FNHXf^jV~GO~?b8NYf39?)r3}PJo~<{Mq1@w@`q%2GVhCca;BtyKn|< zXhe&f^^&dd{GQR2s6(}EvApiiIG-Rc&6Kv~rR66}htK`F{QgbX$ba3C?3jA{w|3`b zr)HZ(;ryT6vaLaMl&78Z<-=EJW_r@$Of2-8JihypoJ%i0FDvWHEzf;A#~$DC>sO1@ zX06G{ByTx$pz^MdO3wuHD4f|7ND{bIkzEVtS4P+LTdKKbNzU%XkR#1^2o^jl4*c@i zkC29{1%^*IPcMLXz>*_ytsO4p+`P+Gs}46yzb`8j?$VKy(qAx%uKT- zrgr|+jE#S()aTUJ$Hh8LuDF)imQ1(UeDk^*i`DCIW9Kr{?)k6De;iJ=#KUOuYS`xs zoY%c3KHl2kzvRjtxw$;X5g(h7U^S;qHTw2n{?aYOZHZ})IaB=$hUEr~U*<`x{vGMB zIH@WI1-e49IE7__@IRvQ?2sb|1@$Qf8OgCH^+F}um0fT-Y0Kv<)7!@Q<0VAPVkx~L3EgHnVH!c zsj)UT{*&!bw8WO~IKsTQ=B&usVtY;ACCk@aZ@x7F?j%!Qdzub`o>p)AYhG(JE_&ea z@~to2%nJVc`nMuE-etEA2dX6dX$S z?24eHO)}jB(9OOQdfE5G_7CJv$wDR0Q^|5=>Hqebte64SYEojbq#NTV`3J?vEy+FL zEa89kd}PpB?8F}|a{k-9_}%jC6GzBqs!*L>4#Mbv&Y~0vmY>t<^x^lPh7Ny)3d*x3 zs_eLta-xLK|A#w`4bv52eOrX}?JA-*0j;27Ag1Gi5TB44g=ctmEu!r-9mU|CVqzsq zf(9D4&=aD5m?c%PVO#);3D-sq!N=zI}Liha5PM|k0Bvc zhE$6D5LJg|Cey|;!$_e|zT*k6&1MgHpD42hX4*RBKfmVWv8g%EL9iPJojIwo-1(aP z=MLMENC zlPJHW__Pcs<(lHzEvY@WQZE{{;jq8doXPTUlwbHXIyc2-j2?T7WC7nAi#EDaa-%A-cnmns=lx&RbO@RAPk%5=Soykq1~<)B)@SZtN7-EqHFDoCGNR7m4^nhuYq9Tg)YmlhQ)6kbmT-1T^(v4)5SiTP=d47`;gJ!5Fx``YNp zd$)BP5c=8Z4a|KnnPL8=7_8`9Y zuK~nM0Zg)GW#R`jNPe9CPd0sY>O7ug0)&TeDZT%ml7|+=d>$juV8s{8ud#PO@BEBy z|H0y?`7~P46`W&C*()jdimRIQ))>^fOn&m3paOu*0Flg z(~H(Cxsd;KNqqA+P=(mDo@9pA&{4OJcXS`=KE*de6w41m zS8OY=Wq>RtCWKzuVnB~s-D?OjdSwft>=M9@P`DCd5(W=@1Il_&s}49BSbvbCiZKu7 zoMHu5XIJ?an5Gno35N*;4|X6BD2bW@l8)grnwKcjbN>ei^sP>^eOfPJ#S_D(gwGYI!YV=NrJx&muiF}3C zkd|Y$;4&VQF&&F|bTqD#=(3jA_^krX3jt|*QZdZv-x!x;ArzOHEl`|?)ybUsBt~6te+nqYz>vSY0 zOmjLN;VS->=yW)!8EDM+9dKG2PB!OHMvL9x@JIi};?MN@jd$K;N@9Me{AFUOJ=SCs zQtnJvD~s35??&as8l&hUgu_->bai}!HQF`K66^fd@>;jc%BwfZU(TB@G_IH6;do|2 z*X%X+jaS}WIrZY9C8lNPS9r@}3^h%=XFC@+ck)4Zi5*|9T+zTJxCh5)i>?z>+-ag1 zlbt4sUSUJRbbNL~VpW=Re5oT&6r${oczpaZPuS@&=ZAf;`mc*+e%c8s|B7_YS{Ob! zba!fDj-A90wXgur@8?=r)LB@(7M66d{iB8Th~KP*4Z1}<2P!?d3I5?tC^r0IDlxvsr=9`9!^0Xn{M8i6eL(Qq?p=at& zDr*RJv?G0=(rrD6Ye6iQ2LwP662wfN&*9^dj_}`n@e@lv${JnXYSOWDt5i)VvlImI}KE{+kkt zFj8u-^edxPgv{SmW>GIbvVS;&_X>?ew}17IKZiFAl#qZ^!acf6amI9&?rPWy+N-;g z5xR!ERY;K=m=WGt&CG&bnhoTpgE^rB7|mSF&0?_Vd08y{wZyXoNLwUtLO%i*>UNtOv}uKIl^putByFHc*Dy2u#9mVw>TOd@I|=&cVj` zJcv(jXJhOFb|KrrE`r;^U2HcbNiKov>K=9(yPRFYu4GrStJz+54co`|vjgl~Fv@lv zyPn+uA3+CUq5CFwnBC02&2C}0vfJ40><)Okx{KY-?qT<```CBb{p`E!0rnt!h&{}{ z#~xvivd7?V^$GSQ`#yV$JX+Fo>{S@i z{TX|m{hYnQ-ehmFx7j=F7wld39{VNx6?>oknjK{yuw(2)_7VFHtf~GEo{K(ae_(%P ze`24oPuXYebM|NU1^Wy8EBhP!JNpOwC;O6p#g4NRY@EsLB-e4qITyIdB@S*1H|o;3 ziJQ3v-hpf!h6A~iNAYOx;%*+pJ>1J;0=5xpT%eM zIeadk$LI3}d?9b-i}+%`ME5#h%9ruwd<9?0SMk++4PVRG@%6lkH}e+W%G-E5kMIsC zJ#_JIzJd4fUf#$1`2Zi}8~G3)<|BNRZ{nNz7QU5l=cIDdja$-mE^ z;!pD*@FV;g{w#lv|B(NPKhIy_FY+Jrm-tWkPx;II75*xJjsJ|l&VSC|;BWG`_}ly) z{tNyte~Tgu$p6GY;h*x)_~-o3{0sgU z{#X7t{&)Tl{!jiT|B4^yCpdIt`AIE`oLaLA^qzf5Brr;N{glr*4$QAO0e4#)9FHR^H zN`!z=DgxA_}lh7=*2(3b!&@M!T4xv-%61s&A zLXXfZ^a=gKfG{X*6o!OhVMG`eHVK=BEy7k|n{bYBu5ccdNVW@O!Ue*G!VcjgVW+T5 z*ezTvTq0a5>=7;#E*Gv4t`x2kt`_zR*9iNB{lWp^Tf()%b;9++4Z@AWLE(^alWwe&M^q1G;@uXK%~!u+%p?+})-hjslmcibZtxav+Lv6hg)HxVw88Kj~ z236H%q^2kZ_71f5h#kExoo0MY`(W2Ve`MIaX`pwsFVckeShOHjVA8^)gZhm_Z3FEQ zLo2!icVVQZQ^aprY#kWrG17%rcxiB`yMILA*3uUlY7uF9#rxiNefLNU7DCHNWXniX zSA?iQvl8Ci-9FM~#=Fk`rrt=$h*b?@$sCCcS=0xGGPJ4T4Wq*&-5py+`W8!fe>>8t z`LwW-*51+57NK5i+SJ`1888fXw~dSrMf8J_{lgD8Hz}4T@myU4VZ0sBr@34+S1muxn-!`*3p74oOm)$1Vrj|X|M%A0Kga+G=Tb{ z(zfKalco=rmo>X+Ll9+Xco4fc)>HxXc%`?~wJphX2DCE761qugy9 zM1=@NCh9g$=SATbZr_y!_{n;Newzc#|`rBKE^h4Mx4D=b=2KxFi-uk|l z&i=@Vd7{5Y2T%1QwGZGvvN;kNvEkDP2dT(5Ojv6NpfEC|R%X#2s0j|O;hQ2uAV*tz zqqOI)fuZhgL>=~;0P#(2fQu39$mZ@5z@^&p1Y`vE%9B-v_$E|7G$8auwu+d|!$z&i z!?uyG(Z1Ha4sG(Jb0~I?^HBv8dP`{+icZ&kzYDM;m$*Vq^ zl>|y=gZ9D3iEq`bCF@6lhT3{805MD&>fm-^Xn0uYYHv5T0vgbH{bFmRx7X4}-P(bU z9f_E`FpNzqbSpuc?*=6_I%rbv)FDwSa5kNW$mla-lmZ-QM2!xfnTd)44j*WZ=r<2x z&UZ;8EyF#-dSF!anW=TCJJQjHO^lf!SDhzP=g`3DAka#Gj|6}mZP&L(T7V&hw$Tv` z<=|HHV9THaKiz}kF!rxz8l9$A0BR2)ZeR$&#YcPjKrb-HPX@;`+GER!N6jA3M}8GRlZX`(O1 zJfR>asT!bewWvX*uP|?b+53mZ;ejE58ZJsUgA&5znONBfM6gDvuqLA20|1y#z<)cI zq}Bn9u|)%CN@<+{ZF(RaKLU6i!7gvm2uL5o*tY;90_T~5+q-}?M|)e1zzZ1X&WK&< zVx<|hbXnC$6;chfls5IXTab68YhW0iA2AM(c8}1A840MUMtvI=sz?MY%mA=5t(3}g zLZ8q&+TDxU(rHBIL0WfAEq$oHrN1qr?~AnebdOj%s7a`0Lj+BaU>)dE`d#cO?ubOS z4~$}lfxL!=I@5dA`5q|4BW)qSv~-3T(N#XWN0tGc7k%CGBuR1L>hY|AZH0@r~w6H(Zn`&H8Uw_or*%qB>}U#whBE%n}ybqHX@TFrc-m)soc#gzu>60&Z^YC75)QI|ID zLEM62Hqk|iK9z<#)6fpM0Z|Q<4gzojd4a~lbLUV?pS}Y$ZO@R<(%vt2l$4d&Tf0YE zf!KkK)nNc8>>aXOP7_nMNzbE$liw0tIVZhUr}$=&xdWSr4Vb1w1KsTs zCdTL%G_$*v)|TO(t%F$921bX5H;!Ua0673q8PInCE%!!5y3hhX(mf~)kJ8YF!v@;i zbZ?3Xt)rcMQ;)Pc(%m|MjYB{Fkf1DJSH2z7LB-q@7mQIqU}6pKRY`Dq6}GnzfF4k` zA6n;^m0LG~6bDtRv;@aqncoGP%W(%1qF+dDOik5 z!D3_z7E`8@V!F`V63SFUnMzPiumsfvODIPPqGQmzuQ!q?9!juDcjB%kH zVXdhR$~(#wF2j&?DDNm!8NDc@Ol6d*j9!#cHDy!{B%P7CjY3pS8RaOa9OaaQ;37zH z5hS<>5?llcE`kIXL4u25IpwIJ92Jyz$GYl1e9R}P#~ndpd17gApiv~$Ppr- z2oX?(icv?X7ZaA%cidafP%g0$hq9fkcSP3K2+z2qZ!T5+MSK5P?L9Kq6E^ zl?14g0OcTH2oW%Z2pB>H3?TxB5CKDofFVS{5F%g*5io=Z7(xULAwpjvn6|=&a+Fez zQp!q^DF+4}7s?T?KyM=lE|dd@ekAZhiUx7H2z^4|8PK^ zmVp|rg*ED&57Y$Ime-VOcXh%AYP6=-s53uMQ>MKy*X|SL)o9PP+PzM@*K79~>b+L0 zw^pmSR;#yGtG8CGw^pmSR;#yGtG8CGw^pmSR;#yGtG8CGw^pmSR;yP-nt?j4-a4(` zI<4M1t=>AV-a4(`I<4M1t=>AV-a4(`I<4M1t=>AV-a4&b4Yvj~+#0CY>aEx6t=H<+ zFl<1>uz`B5-g>Rxdad4it=@XA-g>Rxdad4it=<`0KhO9-gZkGMYOgEQURS8Su2BEF zLjCIsN-365OI@LsxW2@EHO9NV8h3u2x_sp}KECIB>@9+Qn{FBV{ zJTr4<=FH5QnRCvZnOu5{#2&j@Vw_3r#2?PKa|-F4dtx{Ptp0P(#$Rn88poKQO<|X@ zOW8U$o^4<&*p=|D!J9EVI}`7V*m|~_En`<8B*M-{$Q6LOSfmND1Z!lia3ffVHQ_mu zwE*t)c_Na~v9UCh+1x2p=FeL7+|;L;bTeUAHg(eEDN-*};9m=WXwJOhO^lgVEPBX5Gh_bo8QSSFY{vM^4hsD-mzHX!X?>-tpg$&tfe27?V1mUAbb} z1dVewCjIN7C5$=lXROG% zX4%HIa)VTc_%^_YE?u@}#b58a4S8RL@|2s`UUucWZ{P9NJxp5Fi!#@Xx+(mZ+kdt3 zobw#*|6)Z(BxCGw^Gi+ncRvs|a|3xz=tRA9@HDV~1eqD)`^`KTPEg`UdXhq18})-@}JTHp30^)`L{?* z;c)alkYAc@67|W!7RDPu6Tsy@xJCK8{2T9-fJw6?@=A(w^}KCVjwlOd=JTO=3Zr+< zIdd?1zo-M^76}Jf!cpLfH`+2q=}d5id5XLcPw#xVocH5RVG7;@@%R>Sxpy8{(H9JH zY1V)?J1-AIeIxKhoG1%;AWq7C50ok3DSe?!Gatbry_zpS*VoS6`$~lK9E?(!mcrm1 z^cLZ1fmx5Ds`-ethCvMtDTz zMd=G1)gR$jic|1SaTLaL-{ePJOFkUs%j634IMp}dnR5yGMtsXmA$+JDyxRuSq*)bk zt3tSN2(J<@ooh3|!(R%VsE#5%U{m-mB7fcy&h(8kC(#>yA(JCmQ6|O1<=_U=0+$AY zC)@~M`UboR6Xm2?$e8Z$r#u8)TEP0~`viw@@+){#874R?kHRP|IU4&!?+9Cy52v^I zPV4Xd{9yc;)#l?0VS#6g@ z`#y))03Laq@^6Z#Z*uvzpl{$JzFJgn&xHlNBS|Eb!E@}~Z$^m!a9k34KX zT|VETZ;B_E$Ai8J#t5#kATCAUlqbr&P~-s)k^FfWyz}iK@`B$FI6L0u1uz5fgfqgU zRBmB>F8s_qp1HWm1!aXOEbpf`U?X|>{F`8Md500U3i;Mh9Kvbd(CeuC>077ww4g^h zKgM(A48W`XEDE~N*Th^NqP#S7&^w2Vpq+df2#@A*&4u~I+>t)9&GYcop9OtUo=;2d zGSq?IMBAYZffMC1v^|Z|AWdQ38UdJS4(H(nFI<|%=>0iAn3lvcSjIR(^7r7QuQI0a zm+@Z9QXmf!efG1**%Ryq_G-AQs-mi^*WO#v+tE9_cWLjXz1Q{L-uqzh z-Vb`UBlaT|M;ecG9GQJ&>5)s1TzBO5BM%;V{K#`h4juXPkq?e&N9{)|j&>ZKeRS#3 zOOIZ6^!B3<9)0}ib4L#y{qxZe{ss8}C5PC)Atkb2XK%PS)jPMht9Na0x_5hTckhAT zOz+FRJ-xk0*b(QE(2)^GQb*<<={mCZNczb3Bi%<19LXGc`AE-^-lOcO^Jw^J>ge2~ zT}Rg*O&{HUwEO6RqnV>GAMK$M`~TX%q<>-my#5LOBmex)pWgq|V@{jX>a;k`PLtE< zG&ohK;*_0|<6n-C93MK4I*vGc9shKE;CSEhp5tA|KOBE|yyJM=@i)g?jyD~Db^OKg zhNH*vXUCr$uRH$ec+K$#$E%LtJ6>`8&T-iBTicKH)SNMZS zB8UG!{1{Y=QL&oLMgLzR(}0Y>sN0TqgG|kLqv_VcVSLD)aJ?AC^D!bLa6K5Ut1)YA zghRXq;YBrYhrzOK23vXorq6v~v*CBb?*bYw$l-3J@cY5H}8Gr;t8{e8!J}L*5e>!hOQnM3g=8eoXDiYZBlmBW?=(Qvo;ib;hP4-|5>J zo6*MD%*UW90?aI=ncV;fJZB$fY|a73<^rd=!0(I%TsLE9TH#hRHV<&~b~82~@n<2= z1-*oTQL{zWh}4H zGjX>}SbW{R;(k^VBouiebp<&Q9S1P`GIlM(uLaz7TNt~37h`FJ-B1j-jj@}iF}B$Yhy1^cv|oM`3X|20-GXwq z0QapK#%@FUZ9ik|D}cWpad#li_7EK6?wrrq4l5kOc5H@2*p5ENc6Pxb%`OEl1=q{i zU1`Sdjxcu562^8fWbEEDi1(A=o?`5)DC_=i#vVX^45ZpSrpE35`g>WA+_QYDo!1%Byk?;4A*Y^%H_McC{^)mJp(mf6Mr$1rr8Klp< z@9$&m+0Bd{OfmMH!q^XxU*>tneq@E)#@LU6-}5Nz`DYpXi4*QA#$MRP*w045^)U8x zl=XAu_Y36n%QPIqUi^r$mjH7JWgdEmv0oiv>}BNj>jtO;GSSiGr=LO--M;f3$4%-kcdA5=kp1;?w1)iU%_3WyqWQmjf@AcVZ3xc<7I~# zFHgbYU4b-}3LN4>NEZft6=17@TlH$jBZ!NjjQC2%Yu;hJu9NWwZ@DynQp=tBj8Wjw$e9<5A{>pD{iW zZqogXPX_!HxT$LypN98z;4>ox_a@^r4>R7`&G@Wh#%HG(p9^;e{AczsK5r7^^FxfE z1>DZ=f&=UVl(8@Y2be_)+!n?cUjPUAC8+bcuQI+Aab3F@Uxu=lJpt$oQq38DE=X{7U3=m6P!eKVy6&>UK5q-?WYKFCon} zcwbuv_Xy+HBi;48;XYwJy_)eGknfFvzbOHS_{~WFRt)zJ zijpU?=0x zkwe%IkXL3J<39wBKYX6?A1iQgGX8uw<3E|t_zN{~?=k)}E8{7uHGX6%I@xLJ5o5hU3g}A@9GyXR4dV3$^??m7ZGyeD0jQ;~={sZ6d0>}3fa8JQ~ z#Q6Kj>z^jLM;Px_;9g|>2lp6?Oy32JW8UD|ZH#LugXW9=mzl&9Ov2uUBsVZgS;-{zFeKKwOfnbOFe$i&Nu~HMe}YLB^Wk1(Qs^2cg^_pF zV@!&4GARo9*fb`^0bBDClWMmysSaUvuQREB7n2(BZbV*M)y$0@8CXG!nX&m5FyO}f|^_bYrq)EtQ3jEW$ z;E;a$iwt`}|2xOlf`@fNIFLzjYz@1@vMcQB;TbKpR_b1>hK{W@uw#sVI6JqW86H;C ztQ;P%k-Nf8ey^cATop^SG>2V0mP~Z;=5SL5H#}UQ-NIABSS;9=rYBEjx70^!0%|%? z6H%vBBRb1si5UK{xwWyrI#6mdl~NhlB{DFSQ4f#HYnQ4Tr9_9++!S!BCwdbtt-PhV z2|9^MD=%7f(aK494ZCcz4t6dY`X;_62ywrIPovV+sT0pH?+{mwxjh%^> zh_?T`uiv2^KX}>z4HVY!Y%V1QDcBvi>!sD@MEbj99(bg@lcBxTD9~gYzfIm>7jFFl;^hEgOD8Clhu+6jw>0z&OhJ=2DoJ42R3QaA zWOOLCseE6;o!xG!?ra~f^>o~D+1yBE?qxT0^k{Eo?@YU;MW)Dk7u-Ja^-t=jry`Nm z^!iU;|I=I9eR|&CLf`eUDtM5Q2iZ}-MO8dOpsgMv)7Ge`r77T1(I!FduCuw%>+xyh zv~lQApLDjitE7#8{D!C9^9KL8O}^S6)E?BVMw_qP`rdoia-YG@KjOf%Qh4Bnt8Mcoi9h#JRYY3kEvn*UVbReO50BrmV+ z;MZw4c4)uX7XS38vL%mZ(`R5ww4GL|?R_+gqd5vmpyBRdmy(bdo1(0=sB8@yxdn)~lxbJjigu9=)pPhNBHJ@OCr@Hfy7 zMKpelG=3bck_~6$*c^5qw$ra?cd)OqZ$smlOvLJWm7$z_{bM*t_;dW+m52!n&yhSI z0)LYKbKpO(yrBb!r(;1ei=F17uvjq5XquDp?1L{4s1~Hu@I46id3j>UeJTcx0fQ!$ z&o9RBJJn}4D52n3P@|_Z2y%SzQ!WJ22E$LC;WNiX*{T?@;Pj!}DC|#~nZ>-HpIS<2 za>P22_kUiz%sLYqOLTT7B=H>lmeZ$;kr+*xoe54)>BRz1U!muO7@@$$G=552gn*!9 zJ(lYeq-%(OX#D?e|IqRz)>flsYTDXrc#58b-%`5Jmp#FEV%&+o&w?z>k%vUF^x&@! zd}aqf<-yN_(1OoX0~BNi5+XV}sW1Mo_rky5sw&#MPqeg*Iv+ow^-qi|g!>=1)d@|( zIJ=tJ4Yw%YfhiFbenxIIR1N1mmKeveFq!eFI?k+2%4<3`YlV3hM zS45R<;g^uVtW5iZbSGet@1^}8sBUEktA@_c>)?i}IE-EQTR@N-j%b9$Syc1{S3U?8e~d3B1?Lij0H27USiF&gR}A>wG-vBGIPuh*4ry;{Khxekv}wCTm%_>vhFZSJ)Pw2iv6Q4YVoQ`J2w?yCkiavVTWeVa)j|q=T9@J0pTtcQX!VHnIM6Al- z^*7Og!1y$xN4)5fYK&2X5x-Om4A;1k20|=O+$wl^1T}IRHkcq<^P$a{C0fAii(ypB z{ef1n(U1a&g|>5}zY?N{!tOqN_uYr3yPejjJ>KeR7IW!#ztw(g!*Hj~SpH|bkC%t5kd^Q2w*f{D8tJPwQ z++kT&2yEHVY_jXXBg!P7SUbSC;y1@rj$sqoMWF2=y$%ua1S%Nn_dvGwR*;O^!Fd?1 z8#WkKL1{>+GcdW?sX2^RC#k8D;~{~1M4#fpPxGDbOWPf?oRS^(Y!}arFj}-9Ta5B$ zZhP0#34P$Fx`;w}a*AU%t?#oPQ+U$umO}+(WIxS!wnBcQuM;%yiYhbKnNwXa7LiRjmf+(2(ZG}wiz%sgWJi>jgGIsPnZ=KfX?8mJ2^L!4-hBx#UR zZa((80+3k2t!n9h@La(dm&Qrs_teRTeB}Y= zShqm6zJdPGS+juA6^_Mu3_1sz1Hvx#*|M6pnqz`jk<&F@Wt;g%i&gunm7lM5)wE@q zvbn6Q=6IU;C_@UMWs|fmylAcBqr(MowarQT7@9BsXzyH534G z1e0`Rlnqb_RAIW{M7dQoxdg$ z;&VZRA?1jrgF9nN0lg?)7VU>c#YI}iVKVtMV&I^SUL2sA9Xn2<8mY@_)qZF;^OV!$ z;QVMjZTMUtC^eDXuo)DkX75sJ*#d6g{w?U1!Fbwid(nlSiF_z zStRqVrV`8MJBg{|ZM^Kzrps2`fI(Eq&qUZ%VCjWLQn)GthGkFz0LcT(tUy)_i~PWb ze1obC@Hu0-n}r4LO@8%lp3+uoAMDWnx#|WFhG&pQo@eXSCzjp(&Xl4$kfY60LiIx^ zs+SA=sm(K<-^V>WxOdf!NXC0qN&86q?xh#r;L)>)B|KXvOuO+4*98HO?4jfcxpk`^ zU^8+npM|PWn*7Nj9O_U%@pt)^gcu2m|17^}h}J6KWCJ>t zv@Qsc2z0711@V0%PDVqW?i)a)=GC>nC+Kx~*FeS}p5iNes=&dpY_lv9^<|K`GOJMG zE5^7&yqgjFK*qz6I-su3QFo4`PbRSbk|gNIa3+>jPUVH}5I6C)+!U&5lUe4HyYIe4 z>&a$lqL(n;XP)9F?USc6ZA6!;oE+i8ksYGTfe8;xbPFg9e&VVdrRpkO9Zch#cxJH7 z%@Bt~=_%2;shO9|R5K-|zrSznwM%ZBp3!<;&S0$4H~PJ&S3PrGtf}StbLZKDF_le= z9k)|^Do10}k~3$n&#EP*_H_-3h8^ZuQ2JXaU@zY|dW@$oQAY%Z@s0V8+F~YQ=#aqp z=je#~nV5}oI1J`wLIQ^&`Mj01oDZ;O`V>BvWCRJd%56g!((T@-{aY6fa;a0Vs+v@O z0IK2dXum&DKB?-ese^F~xB8#t6TFirdTy3(-MedKc;2cI&D}ztv4^I%ThCj* ziyQ90UpuyI`FYm%sUlWqP(!Qcg-7n%dk-&uY15{cw0HD+gbuz}CQP*u8*(+KCYFiz80m1pT=kmx0(q(xrCPMsUH1k{mefDSp) zD5G^q?m1N%Jbl&_iz65-uBs{~7YjNpQ%+H^=H7i%nHnwimHSGDPZ(Z;cWG1wcZw|v z%*juq&!(bo!`O7T>Wkon^QZ-rLvkd_^z#)5Hg zxufObryg!`lzZc#{xRRv6592P5fce0Hl-xEm^*nBcP$v z0`KR64y6=xK{a*oNxW9jv+9)$I9SxN-Oig_c%UK7hZDj_WEb$BDlO#*M?@b>eU7 zxN!%UE+w#Wg$bqFfc# zeDOpwnoY)%(93rx(=q9nQKg6?XKJZrRP#oo(u>h_l6NOMld)_IF( zs6M+iRmTC+ALc}C7V>JEuRjk9o)*YO8Y}oKQNl2t?D;qFLv4U`StSyoFzFYuq>i@C zEa1!N?B0BK0gjTwsL04McVmu=$6B!!-4bi1u_j7ZpCQm-l2u7AlYMmx zH!4a*@eEhENs{b-gUMy{c*AjMjcwAWGv@lW4YQtoQvvf*jQ2wL8+EGF4rQjAc;uiEzG%4uf z9wX{X3(U5*s$>6M z)n+q=_&#l6nEa|4ez8YOb9q{(?8h1|AYN<53x+g()8?U_N+)sEV;tdoV{pJ^DTD)ZvO|;^t&(V6L2z~TSiWu zI&#bLG#NGMHVY^mJXXH_jBGA?Np1q;)EYzS3U=1VKn3aXyU}xGihu`L8($R|e#HpJ zzo`QozgXO&25>bM*l>oHk|GV&2I+U-2>)u7C$^yP7gAuth~}8}eO^2>X_8+G@2GX0 zUG8;wZgm*=I4#ww{Ufg2!~-Uu*`{`!$+eE)in1}WPMJ%i|32CjmFLR8);bg^+jrF* zW0A!Zuas6whwVl!G+Vp(ysAHq9%glv8)6>Sr8w=pzPe1s`fRb9oO^yGOQW^-OZ=5? zNNaJk+iSAxa}{PtjC&tu_+{8J_cw=JiFhMqFC!}FHB@j}@Q$b&*h-^U)Y&U$fDWad zC!K&D&RZgww6M(~`@DA92;#vDM1_`->Ss*g8*57^PdIP-=;>u#;wD4g#4|T7ZytTY zx(Q8lO+5Ris0v-@GZXC@|&A*DPrZ51ZeSyziwc>%X>dNyCAL zOSDTJAwK7d2@UOGmtsjCPM9{#I9Gbb7#z25{*;Tyl-Zho(Oh~-u(5CLQl;2ot%#Nl z_cf{VEA=LuSylKv$-{%A=U+QBv0&8bP;vDOcU|zc3n!Nu{9=5j6^6DL&6tm-J4|~) z9#1w(@m3N|G3n9Xf)O<|NO+P)+F(TgqN3E#F8`eIrDZn0=@MQ%cDBb8e*D_eBUXH+ zOtn|s5j9y2W~uaQm*j{3fV=j|wxar?@^xjmPHKMYy0eTPkG*<=QA$Wf)g`tfRlZ0v ztEyRwH(8<%&+zbQ+pg>z^Ucf8Jj>x$N*h{buawh;61^S+&ZX>H^j?#nw!}!~35^Z# zqU|=INy-tBD+E^RCJdtvC_M2+Bx*2%C6nTfGS!1b*MJvhKZZPkBfkjIFf@kLBCdo) zszai4sxmBgklbZ>Iqddc=N%2_4$qxi==t>5E!Ll+-y(NJc+^l)uMgMZH+KM<|+cUS^t~AUy&z{UpW?AA~QO;;xntfuA^Rj7SU%j)& zVs~)K>u%=e(ooP|$In{9cdb}2l?KYZinZ8o+i;N-baM#CG$-JMDcX1$y9-L(TsuaT zfPY9MCb3xN8WGxNDB@4sjvZ10JTUS1Snvy5l9QPbZJ1#AG@_xCVXxndg&0Cz99x`Z zKvV%^1YbB2L)tU+ww(e6EZYzc6gI5g;!?*}TsL=hotb0Mow8kxW*HVdXfdVep4yL` zdfTcM*7nwv5)3M-)^@ASp~`(sR`IsMgXV>xPx0&5!lR8(L&vn@?_Oi2EXy)sj?Q8S$Mm zP{=PsbQ)rJtxy*+R9EqNek1fupF(7d1z|uHBZdEQMm`l!QnDTsJ_DX2E=_R?o*D5) z4}Rh2eEvVeTQ^UXfsDXgAf@6dtaXG>!t?(&-a~B^KF@z*dl$BLVOt|yVElz!`rm5n z&%<$O{7{?+>7|f%3ctTlD}Sc0Zs_hY;YO-&eOIT+Kh%FJdM|_@8b7qIL;aj#^MhF1 z(>x4_KPKYTl+AOj0Q$t3La4&;o`HP%m8bgb`*0vs83ZT@J#{j%7e8dKm;){k%rMw* zG9eKbw_mh1PHLUB$7VNcJ=oL;nV~#W;r|rv;ISD5+Q-FH5g~=&gD`RrnNm>lGJ1GE zw`K+PW!P*uxsEyAzhLvBOEUkj>)1sV6q-RhP*nGS(JD%Z$|wijTm)a5S+oj03MzBz zPjp$XjyM!3`cFtv`8wrA`EpL(8Soof9J(X7wr2l^Y-+>){TrmrhW&h}yVPonlai>; zrF!_zz4@5^8y@95z(7+GLY@+~o<>}!RDp|@N4vi4Y-r@AF@6Q7ET8d9j~&O$3l#Yuo`voKB12v8pK*p3sJO+k{- zak5sNppfOFju-S9tC#^&UI}&^S-3TB^fmi<0$e%==MK3AqBrn!K@ZCzuah-}pRZc{ z?&7p`mEU5_{>6x=RAFr4-F+FYOMN%GSL@mvX-UT3jRI;_TJH7}l*La_ztFn+GQ3;r zNk;eb?nh&>e?Z$I<$LDON!e1tJ26yLILq`~hFYrCA|rj2uGJHxzz@8b<} z&bETBnbLPG9E*iz!<03Ld4q;C140%fzRO5j*Ql#XY*C-ELCtp24zs*#$X0ZhlF~Qj zq$4Nq9U@=qSTzHghxD(IcI0@hO0e}l7_PKLX|J5jQe+67(8W~90a!?QdAYyLs6f^$ zgAUsZ6%aIOhqZ;;;WG@EpL1!Mxhc_XD!cTY%MEAnbR^8{!>s|QGte5Y=ivx6=T9Ei zP_M&x-e`XKwm+O(fpg~P{^7QV&DZPW)$j@GX#kClVjXN6u+n=I$K0{Y-O4?f;0vgV zY+%5cgK;dNK1}{#_x-Zyaw9sN`r9jST(^5&m&8IY?IBml#h0G3e?uSWfByzKHLe8) z9oCU{cfd~u97`w2ATe{wQPagk*)FX|S+YdySpplm-DSKB*|c>@nSp$=zj{v3WyAgw zqtk_K3c5J|0pC zSpww86>3JZSitYm_b*{%7cv?=elhCFy1v6m)^n?211803vG_;TRU3WPV`g7=>ywvsW6B76c-kXXYuS7~J+@Lc zSf%7^`HIJ4D|VX9{BlBG~IV;M->JId%#U?}jR@kQ&o5A3HyYDx}6Nc^pMjj0Jeun)M=&7-NLZ9@2 z)j60}@#z8oft^qhO`qgPG;Gf4Q@Zbq!Fx_DP1GkX<}_%EF`!5fg*xCsir}$yMH#85 zT3Y4bdV)bucC=X;w24>D>XjaA@K`En^++$6E!jmvauA$rc9F%b=P&f^I7M+{{--HM z0JXFl21+}*Oz8zr@T8JQp9Td0TZ7rr0+&rWePPKdaG}l-^)$@O*ON;2pkAjf4ZSg# zy{PLo>hhTUUK_q5L{o!vKb^7AIkbXB zm3BG{rbFE>fKfZsL4iKVYubQMO_AvYWH<3F_@;7*b}ss*4!r5a-5Mr{qoVbpXW1cja+YCd!nQ3xt*CEBq_FNhDc93rhj=>>F59=AN5 zoRmKmL))oDox0VF;gltwNSdcF9cb*OX3{Gx?X{Q-krC~b9}_3yG8Bn{`W6m}6YD#q zAkEzk)zB|ZA2Ao`dW^gC77j#kXk7>zOYg~2Y0NyG9@9L)X=yRL!=`tj7; z^S=K3l)dWTz%eniebMP!Z)q@7d(l_cR;2OvPv7I~Va{X>R@4XXh- zOMOMef=}m)U?`>^E`qUO(+Ng$xKwZ1|FQ|>X41&zvAf`(9 zj3GGCzGHqa8_lMGV+Q3A(d5seacFHJ92meB0vj+?SfQ~dL#3UE!1{}wjz|HPWCEHI zW{zYTeA(UwAEq6F%|@%!oD5ebM$D`kG45gkQ6COfjjk-==^@y6=Tp0-#~0px=I@H# z7Z|LQii;EBSfjse{lo}m?iuTG`$i6*F?L9m*kGMV_JUqsuT##HNJkrNL~cklwZK&3 zgesq4oycISoHuCg>Jo;0K(3&I(n-j7+uaf)NPK7+@p8+z!=r!xa45cmV`Mna1hT=i zAkgv-=xDHofR+dHn7FZvghtoxVqmi^U=Tk5i*(?UbiEGt9|mBN4tXfwT0b zIQSzTbod84Y<){2C!IJja=k65vqPM|!xFS?-HOK!3%&6=!T(Z$<>g6+rTpioPBf57 z$!8fVo=}&Z?KB-UB4$>vfxffiJ*^StPHhnl@7Fw@3-N|6BAyp|HhmV#(r=Ll2Y3af zNJ44J*!nZfs0Z5o%Qy|_7UzOtMt~9CA*sTy5=4c0Q9mP-JJ+p-7G&*PyD$6sj+4b>6a~%2eXf~A?KRzL4v_GQ!SRxsdZi`B(7Jx*fGf@DK z&P<|o9z*F!kX>I*;y78= z>JB#p1zld#NFeK3{?&UgU*1uzsxF7qYP34!>yr;jKktE5CNZ3N_W+965o=}3S?jx3 zv`#Wqn;l-4If#|AeD6_oY2Y||U?Fss}Sa>HvkP$9_KPcb_jB*Jc;M0XIE+qhbP$U2d z&;h?{>;H=Sp?W2>Uc{rF29ML>EiCy?fyim_mQtrgMA~^uv?&@WN@gUOPn(379I}U4Vg~Qo)jwJb7e_Pg^`Gmp+s5vF{tNzJVhBQ z$VB8M@`XJsXC!-){6wetDsTY94 G*yFsbY~cLNXLP73aA74Mq6M9f^&YV`isWW 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

5q!RY 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 + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 GIT binary patch literal 77160 zcmV(81_!itTT%&fM`8Do zgetlXfhX-f>pHa>CezJ5a+CKJB5E?t-D3Q@I zv;Az_{%F*wqQWVk+*x^)@=9sx>ldws&U_`?fwx|)6i0%hGq@6No|Wjj+Lhc2#LbXI zik@&>S#lthOy5xS4viawbfqcF5t#22r#4c;ULsQqOn&iMQrAORQWXh`G=YxhM*4YN zTfgWxZlU6?d>wP(yNq!jqfNVxB}>Ww7cSen4lE1$g!lMN&~*PN_7ITCO&u%|6=U~^ zD`NV@*N5j%{d4(V*d&F9*Lp4o^=-wV4E$&&XJX#);dbqZ^8pUYCyEa?qdKs=!}D|N zZKGn0G1#bWFe1l-8nC}AR*a~P9;0KUBrGsNR8Um3F%kp&^sGD!?K|!B(qItgwkPpO z4nOg8&Z#<)4^Bj%sQjrANfD$Zj098^i(7$$Vl;{o&HR7r?C&hE&b-&}y`y4mHj%mu zNlfW!ecOyC;56fuZ7e6t7R&P^z1O9)e^Pe=qGENxwk%7Q3&sYU;&zJz+X!u6Ex^F$ zTu6(Z`;JIR{;Knn>IcTcKbV%&ZSxB`P>8MADLLm#sD>oQy@;IWvGh3j=*Qa5&VIQ& z#BvplZofSw5gN50lul%1ZW|#duBPzgJG1nxIGMaB*-obI9wC1%7zRoi%C^%k;Mn?+ z?pUuq3@j1^4v?E3B49cgqW>EY2?-#3jqje^;JgycOCcwp0HG~LNR*rji6bO_n_6Fl zxt$OawF6EyR#iAg$gdotjwKXO)cf75+S~gE2n>cpa0mh<1W_5Hw7c36opP+~qRPFS z?z(HcYuX#9GugKj(K=EQB_0sAfiipahu*36k{xIzyD2!y5%vK1@c|DQ3Q0^$kT!Po zBklXM?*0ZWJJ6;!hoDZHGR|mrw+{{o{_lUy{_6}+Pm!l|BNl}Q;&@bv@2Wy(0-c_O zab6Z9oUWgiKYRW)Vv0%P;3X|rT9E6xVx&Q%6AWJDG0oX-H5vJ?>5A8;PEnm%C;H~y z%@URb{E<@x+!!CGA#@@j24G?{>Gvg*2lVeVHM;^7(Pnl#tDV)(Y|gCiIh;CbXJ$WV za+~#V|9GDufDe2U{2(L>iu$ z&FbBmZ9gV+TlVF2nNyNeYL2HloUh~eKdpS)>J9Pm#Xd(4%myqFVno%qUa9n|Ua803 z8#-)?GmgDZL7HHzH4B_FHnRat`EXP62|?edFIDRb!q%9yytA|?Ib5`-)rNGqg%GbH z-}d(Uw;KH$fouQgEh;fvK+gfZPMGsl{cktu>gD1?zL z`z7_05U{qkjReFC1qI#x+jpODe!iG=?eIufIBbyAS`i6yq~pK;J!P{R?B6jf<_85Y z$&N8sKi05v?h+0-IZ#Z-(g8koZ#f{v7%?Dp!%F^s91LTw|BvSLb7Oj@878i9HK*kSp)6{%ZXlv-PQ)RD zE`x4f_xM$H9{@mn{1`uWwLbR;xgELO9FcMuRbkvnQXmT&j}ZE~*Z9?u0F(1c4Md6G z%ZpLJy?$`%3V_^=J3F{;`T31Z7#Ad=bomK731~(`S)uLTR8OErP908ueHZaDB4D$q z{GZri&j-sW%|A#W5to*SAH-ai&E<86{%v3LDwPh%=3Mm7wrS#iOV1$&8oKgshx_jMlowl4ED4$f#L1!t6C1g9p~=ODPt z5-F*yQZ*RmNQ`~4r~k{Ouxs3@+Z>Q5N}1kIzW_;y+Y`2(U+=Sj1(9)2Vkg!}$DaT~ zSw&5w0~|KUc7%a7st`^}4doR9Pl!$j8b%9FcqlQFIssg|->XC5YmQ@}VmJj+^a&GW z;TT&?6ewkE94j()E$+}^)|h0Xjx{@?P9)U!BBDsDj}WU31 zAtcV{=d|bI-bs8=m>_-=CKKcXWW_GX0~^$^=>jcb2lM)283`*Z!V{7?x-M-}_~|s` zV|lNhxg(2J)xt(s?g(|g4crMAX)o}cuastffHd9kY=i3#SX1;l!-O06F-4v5y)!_N z{n~32h};!G7bhd5ytZSkz1eQ+sUW)X74K7DJFF%9?n#Q!!7ID?F7r$p*h2z%vFq+0 z9=`hOhOu`E+Rawmf`Ea#sNtl*!}&#cW`0Ouz3DI?ydh+i=s;0>PiQfT7Zu*A>rw!Z2oWMZdTlLANQLT4}czIhYZic*axDrD;QpTldic#?)QnYZQ#V&@GPdWKu$ce zkR96D(D?F+uOEL7E{&8{@#anN+7VOiE7M#=o-3l-Qlfm(Hnj`lCvjX<;N1eImGc}P zIfq1q23S0QB<*mCfZhipyXl3dlKdo_(zgrVEctLByL0)aRMXBH-Ttp)yZ_WqYe|tF zU*@4;)#eID=!hTcSCgMs|CA-!(RT=~eyOCyMAVSk!pq$%^Rswq@*cQ(TXI^ehX9#d zQzf)Vo7@<4U`9OSg`E*=es@n8G*SbT@I9!qVekl|qYka=BE@A6$s=C?(x-c+DlyNW} z6eaQe@Drh#XmE?Ex(!VKoZcdgD?X0w=CviN3tmmjikMECbJNHMagMY-l@hQIzV7AZ zriQRf5j1k=Eh_KlCFt5{BiAK6a8T){lxWsNJ@?M~+S(158s#PwDXC&%gvLuu_&~q; zp5%18A)_>(Gy@` zHu}fy7?5gdqUqRaZ9G+VYFVjT`f3hBTtJLx%QHo4W^k7Hn4dbj+U@EPSKG&~pSs!K zvyPmU&Tyr~vom3Dulo^!F^FVgi})a%1Gn9)rTvJRN`lw2KOkz(aW}5MO~dBSW@edL zwPwp4)N=wJup1;S7@U)OkZj2gQGo~o4#o=@iYEeNjFZoLvW2r$?(LKzQYnI52$jlzP&K3-Fs?@ z8TYz{a*Ip6o|)y)qHif|*~IjRGj3tOR55>Cr^87ZMJVZQz4x-c--DZz!bJ3J`mBFt zv$MzMB*TT@cUYc?%vG%XC_t5juJ=v#VIpp<4lLvW$%%|VH?JfU3&D=q@FkudiARUh(d2N+ zWLd~2X5t4S?fb`JHk6Khs0b;)4m))>Bf>MuG>~md#IxJ@3UBxJiBI@&t;m6*b~tLF z>Y4m_C`-#PTHIv21B#D$$;E^HZ8uiYUtFhV*G%O%3~-xR^LiE@?1e}-zAdW`mbEM> zF-u5dt!0p?EOIRw9HXESaG^}g@5b$*Gd<>1m;%N!sdSMt*}PbmYdWd4wf_iOfHlC+ za|MYGa1MylQ*%_SxCI*3>pCu7wYNkflt8fcEw)9s%#j8m5R?-^jqs5&y2-XJ@J1PZ zvCEQxGD63Ll8sRsnbjBI1u1mJ!>4@OBQ%73++6qLsDSXuV7F#t5G=NzBh&|HiRm#q z*)7%le!&>OD#^0421Im4)tJOE2i~}o^A-DsEaeX+t0KZ z{sQInfSneVRDtp{f^<>g*rTZi2sAuCI!Z9Zh$ZFSky>G5VCcOA>UPbn{DxunR4-Zq z0{Rr3Vcwm`(344N37c0jkQV&${exerkPtp8!}^!LNFtPq`QzzulIshDd^c?rMzvmA z&&_^jixC$vO7ZGm0Le*_7u+*exgqHorQCbdJY~!;JgCi-!q5HtGLD2^A9dP#_`PVfh~Qf+*{6POoKUi6l2P%*Hl&QKAyfLqkaIKd`D8JY1@={Zhq*1zZjQU5-VVG9EdQhh(N}S^W*!YLJe?QZ~`l?e_yw z5+Rt%0P61dAXbLEnF=K$2o+w?V3$raPx6eS5Bi3KtXuINb~@n7ggV*iUfP^;*T3fx zK(YWg|IErMMW^{br`nI~*hvLG+;Qa(JTE9Xz2mD|`K zWkMsBLSxbz*}wwmYD`=a5~IW|zFKINTi5zYJdLXS5AlQ;aj16QewJ%pn@7XW)l@{k zKU1m8+14)_#x2y>CEb#Vl-cMv42b@BrfGab7RyPY#BuR=W2k^v0h<(f44SbZ&kQd& z1c7+0f=Eva?9UId@{fgyyLhy>XLZ>Hs_gVQ>JLK39^$?US5+# zF8FwgP0>wLKjyriCrA1t{C?ppovgaV>1c~smv@h!4uR$(`2`$DeE7c~B> zpO)wsEU7ZQ#)-uJ6()96NKJ8Y@H7-Z0#aPGy|SvlSYbSo*fbFCmK;D$X{<=pL|?w> z37bU`XR6OqiFvV2n$yv2RQ}kYO5LsvtCo2WW6I7VnMg|XEFd+Y{o1b`B?Ku6B<2+= z&U7;n*3GsPjMqSY02HvKv_gCJS?}VwnX)lP$9Q?8>7cln_TCYaRXg*#;^hb%1uH+IT+qbi5QUIEkAPwUL- zZcK{joDF?6iF-BK80ny(qch>Bj2#sVh;E9olq4i9E2BhC2h@ZuNbOcWnAb?Aj+ol{ zPjg%dw*~)|Ezvu`S2h4n_?1nG-8izHMroCi)H}Y7r8gOC^D?nEB?8ux%nux4T`W2w zjmomxy+te?pWb^_g#G~wZee%3vH68gXQ75Jt@23+IdVE`poA6wl8hR#JV_HpwK4Eu zBw$Qpa>tT{f!Cet&Rr4Zc;X#7JyIEVCMr=i=zs(;dVe1C%lLUbh~NS0gJ4a3_SBi0 zWKV|KrDg~RR0H=-#?#LMUi65trDJ==U20Be7 z%Xwpj z8rGRuVi>6*eIn2 z4sdTqnx|BWhY_zMYaCA7zUpjza))jPvt-vupa&k7+<6n*ist$5`NN|BwO~KBX%LYryjwYCD`L@BOz&Y#&6yLk zrl09#3<5$~a4xgYhziDTTr}+GvxUZ_irgNJWb6?^#5mb!Oz(fO^4&7G%H z5^GS_GXIRAC_Q6#bn~Jjo?A1S$rmQJt!U~*P6dbvJ-70Rj*C#qoAg1nM--Cz!Y317 z=u#u7#!Wgd*X$9WGk^)j?$&fleixkNGkSM;Ai$K^JD4}R=>kur91A#{$yq51$wX5{ z_^yQCFMy;I)XX=RX%FBGjUjh=$~M62v?QPtjW|Ux>QrIgjQe~*2*&>nXZq^b5AiNL zZOI)6wC_3KIl*(?NODXbHzum22a=JFGaEv41mKQ*TW=5nCK7LT+EZuu)vXw=D|?|q zMZe$WYg*z7q#{n@ie%~;HG`r$nwUvewW8XJl|HLR?P9D;g~!gQW+^ITmZnEFJoC&$ zpqK!kl`d!W6#u8;k_s8NrGXb9K``UKExyy)qZX#Ac7FthR3Nwo1`lL3ODL!o z#aVG+vZ|XXb=~EAEWJ7~DkOX|><)vPi!TI8y2~t+U`4!!=-3qTcu*UzvmX| zU;vxoFY7w$fXLF*)+alS*@;#LhY>_6%d`y63v$W)kPx*5f^bYS(x#$=iQiEsSbWTj#TRZs?$7t8|iN~L%c(PyNt zN>cc8olk|i&vOa$9mc_tq1qTUO?Q~7+#U@N=prKaG!!!T;ppICO~e}UM7l3dA&J#? zf-}{*xAKAEE{qjsE0aKYPnTB6aq63DUe`n4s;NtDuJ@l2EaI^^NCY{ITBxi%Cb)05 zg&!!x67sqr4))=f2=^B;|&U9nAtxK%O?JrH(qLN-KLYGA2ys`5Pbca_F5=9yX0 zI@KWOZ;?E|06C&Ni~*hajz+-M`jaFaJ2KXs*J`w}5c=M_?075|63ZIOft^DH#ZttH zbQl)6uo5JL99BwZ9>Hda#W}|*0Iy-0IZ%nKCgAwd#WqiGzSaX5Y^gk*)brv38S)wL zWOF?u0W-yO7LT=1Ezn{_pw#>#jSuWwImbE(F^wt}}lf1z<$?f+@!t&&enhvFSp|oAa+s9!U zHXe30?GjS`pv=ByF^BCWSWJbRy2A=eiD6-y5fj~pEXMQfgpkY{A~P+|N8}+K%cVH8 zxAHg&eBe|%Q{GUMi~=9Hw)OFF98FTLS>9sw=B0b@E4xqqW!sxF_VU+f1*fUgb*|_4 zRz3PvJ}t!oYhpH4pAwRi(5Y}*;!VBKPpDx3vfLzB=tRMJ8;%jV@j>6aqg%i<1&#b+ zk^D-3Kdxp(KRuW4k%?rmuP94I&g0b4>O%zd6?@oyO6liO1^U`$YEO(w~dfSW-)I*JFbc95RKnhH_Ueo)^V z5O<-H?_2BbD+u?V6s?hlkNW{&D{7-4R^P`fkDgL0;{mp{b)#&5Aruay{_1@GD<`i@ zS^hSgHnz=Q2J4n}WYT?K1Ba~KTmN}=+nAMVj->#wyKf}M<5@kRd1_Le5osxl7MTWO zkkpGzVMHjsSp8MXcS#7V+PhkS79{jH0@}OoIU2e8CV!dMG+M*m)+daUL`I+W-4I(& zUB!OpWEez0R`B*0QI%Jr&CRlbeRfkm!A=eXZTHE;D+5#BaqzefNU;B5|N6>RA@|Ob zujYmt7m3)_czpI-ihZS1NN z{mBusZ?O_Oo54A_*Q29z84jB*6Wst#IvTqXn1FOd0WHRQYg4!CYPDfB?VoaEw10XJ zM*G{lAl|>>gn0kjc8K>kTL8Snq(eBCBR95iHQy_>TsDaOw3GMV`td+(amo3Y-6~SVgFExhSbYQt48O)0=vGOBz@93V1J{b z%hnjMkz5Lb^ba^Q<`P+L@G)XOzkbHOO0N0Xg0Ihy$^3ajb3G!GhUm=0X6-0?ONj*> z_f3DrB8?gdNMPm0cL=p(y+ve&>N;XLt~MwFIj|UsJns<6WB+W8-IyLPg}oO15Nn;A zXX*?`q_n+^0gs7HP%P#UtYbBYu|?p@^*>8)y$gH5q(rM|2sDE3?Nr_ z6;wk|U!eBTYxBbDj4oegyx`H4PD;~E0DDx)A+w4$lWIO__?$4^47wxdhTYj)uj=EM znyJ8s%uB-ov3ip%{vp~EGl-_rGMMKEfwnp}WIi3G1!!q)Mb=!*J@7~jy3`z6D|(ulUfoM`T~yvcgH%qlR3L>cQz}3KH_#K=7el_UiNveh$%U8? z_LGuK4xOlJQHD;H94v&y2_rh?&Qj5;yNIP~_>vbFIhO?$;xT|Nf?1iDP{&TfzW|C{ zCb@Y`IIq*W&G(5WFw0|-!FC7~@WzQ;j=+kc@=CQq%FR2Z@=-e+m0g92{YkVJKEF#;crZ%nQcFJ%ER9s%lZuHyt zzJCQXZKOUpq-8^{@!U>*5UtJX?PJ5B=GmY497K(+_9#(mFzjTf_-f`njzVGrbu~ zIo%B~2+9wdNd~?$Ckbz>{gcoZ5?p1VB{W_&eWQl99s=eyg47Eg{UFjXJqPm>4W7YD z$9-*oALJ8xuo5PzsHx8)k^U}Y)`AIEyYYQx=Stt&>pC^1 z<1Ipzi|(09mqxhhS;O1DqBDH|#e6Brh?)T?##hqzUdF1q6jPRD!uP? zbWjmu@AiW4LERk~L~lO?LlBOkXS8(lwDr(C^0>rF%Uwqug_tr@MLb@WZA&whtoIbB zE8!EYJKqhOTZ^g|%QMT``HvY}F|fSBy?KOoxP^}j7bAZUs@!njJZjWwL(^eq=6+n~ z8%LxAL!~qu?!w+=bz*cNLZC~R!u8OxQEj~wJTO)h@b)gBEo@zQDyI4YXo5}-(Ea; zYM(shM=smh)qbs|w%6;$>GU<*xxL%3UDH z0vH0D^OBr9a`sG=$rh?)7@YIo7tGXb<&x^?G`z4x$kihn?Wt54!tl=`j5ks~^J>k@Dr0)P<4=`SHK z9HqZCbCIW(RVN`J;D75Pe20ytLgS&Ts0!l`bX*&cR3jPU^U~6tO^zfhGHzeRUZ*DYv5=CgnUBb27sKfkX_*_QW8g{ZJrxy%`UQ0*MHZ%`jL5C?){`F! z&C1heYOrD0xYm%Mlg`aWz|)=J6XL61(PaYmoZu*Oee#}dZ#fyd`&CdjdPpQ^urvhm z*}68VQ1kadK;l>pC^5~>n9Trx;doyON_o9|l{4Dr69cU$EWU&B<4x-^ZkyN@g+6xh zPwMoB)w72E_{3`d-x8SCuyV~Y<7PBtbGlz8b|q|+<4fOKPHB=WR`~8S-zT@E#MIz^ z=alPCn@!+HKuGW89YXG6E7SeT?x%L$Rz`6^7@OU(bxT^EXsU2P?CnJ`_xORo0LS5ZqJMxCVbRWeo-#hK z{zFi%iIA{N#Sai5nrc7MZU}T|<(}BnT?3{T;ZumX`1pI_wN=xH1(7Hxv$bO9qbFvM z=4UX|gWc*FmBdU?L8VP}WEBU@DdV#;!@A>HA=Y*PjwWDlg|GfH5>Q(U8=Ya^l!UuA z`@jrShkPR|fU*HMN(H2f3L_iHxXfRx)nrwvq&6c~8APszz?(uMOM~~;e4-k-z`+?7 zfGGlRkkAmSbZh-=1DfW@EUpy$Y!T?8>kso)AM7dJxn-C&fjmLF2(TVpFr4e2U+g#7 z+4k*TetXy?4RKO}&ah^a69N0{Pzn%X8X;zvwD}fTRfDp#XjmKaqHNo}UcvD?D4zpu zpg)quKs{n;XPMnk&6ayDlWEX8k|(r56^l4OXTtD$NJe@v5fJxV4@4v5kU@+YF81KM zB`3Ckcdb1#4>KC1$+)+jS|{?MNO*>ms=Mx+CI?BKk~GjUN$;IXX{4>cn`P*Fl-e82 z)6I{U{cqygw40B6gQ97V*DIRULB6*KLPT`CR2Q|GilRB@t|Z3gvZLw#C-?I9 zy!hb|Fjj~seB&a|1(KNJ>wxs3916gZ*He~34@x1F)sNqi(l*9MHd0)QHWXaHyE(K7 z7cKZ-J*L4?vm!Z3S1w#G4ti~Cddo)5wN>F(8-aiB*r&s{6%BN!A zfXYqSk3jA<$0DOjjri6<$##L%7TK|6qVIW0hR0*(fg#o6fLB0H$oz`;1a}}DIS=m zbyp1H(H}*@XgRD90l;D@8c^gVE|w&ON1VYZKqwZG5%G1S)>4fd>}E_8%j0} z>CWmY4@fF`)8Fw6=$}2#(#%l{FRR_s*mX%Ry$HHIkK6B%!5A!-uyP}Uc?5jE0|so# zJYf39QTYezJ;eLe`Rl1hBpc|f(m|4R>6nc&+U%5MHUVSI^MY5$rR0aBG=BCa?{*tv z8T?`Y(3M|9)vn`N-fV}=sLpm8aiki6a}XqLIP~HXQxETrC1SUhA1v?k|2gmVR&_R2s(seFN2Y%r46JqWZi{zMzO@6d9I)pcW^+TATpWS22)!K7 z{@c%I{Tj3rhq(T^vsRbu&Ze%9K%2Jx;;cHVUtnV^eewPNOqD#*TeOfPRjbx2AAHc} zt-4#2+gs(Qnd`dLr*F8*$-Dx&zg#^>Qus?OAzM6)zDVOgj)gmgIpO%m1%Wz|)Je^w zE56KO{+Rh8zqjowkH|kGk|#&d2je}T?ZiXYJha&VyO4V8#=E9bh(Tco8rT zPe-~LXJF3m-dlc?;6F}7;88&8_{fAd=8#U#frP4_L49h#jzVGc!5lN~#ic3g6~oWV zv^sIRNviD2sp=g0o*CI#Z^KCv z#FxvQ-B_rBq7Gjt0mKsW!!`BC6$k3Nbv~=i32Sh;2_&#wx~G` z(eO_m^%*b>b$6$%N#e-yrUExgrg)Xbt1_?iT*?_%W<73Jkye1Kq|hQGIg_l`b~tzn z`?hTr4-{}gX!g?+=y~FiGlIKtQ3(zuiP@z5*mQMqJp{b_?lasFliFvhEL3A?EU$@}>?(xy?0}JwQH8W)@ zgM%@G>PXH-ueM<_`@adULW)`<8U01d5R+zQxRm%!F$xyv|chrOou44}{FQ zu6YqRf~q96u+ODLO0G^H%4Fs2B8k-be>oiK3g$C0AW6*^ms%)ZC=G0PHVrTJK#p08 zLXKYE*x7xsPgH(6W4>d;@{V2knw5LvDa+k`?zu!b?IaU>6Z`Pq6UTXDmMjv=q=0+& zbV0gTGkOq6NxG|T!|+7LG~A?B1pV4nGi0U@Nzx9T^F)#<4HAstN!zTAE&*ige(75b zE&EHBUNV4MV+@np3f(yUgLS?vS?RQ1T-jfytki+QU-&E97h_7L+8iXKTrxUZSLO`W zV$?#Q?RP!b+FLOvP6MA=R(dp(9y_!AD3@k>PN&3w;8lV1W+;Df)|ucTc-JF?m*BR~ zOsPF17R8HHWkv%j8E+8z^ns8d>p9D}&pP2~Dkoz~<@M#QkC?n$ z&e?ks$b<$?W~FX=nO!(W5x+0$ryG2dx-rUj?F|2CK-5Y)v02RT)wWJ`+B%|S>gH%j ztfKJtZwjIKzq@q2O_0W5goIMejlWX#_i4d8d`{b6P$HnB{fI(9u(`CzAZ=h_p7o2O zI!*lxi_iiR31c$L#i%^U6{h{zleCsq2#-&VQv#A)oq+%)VO&84x^U<84CMIggs<|k zy=BH+=Ey;ktf{G+F3hldr`GGNcZSEmemrDYNoc|SQck^RYZ`Xo=5O44Zl=_nqJ53m z?jA^dWvppdl~<{u*c`_{q0Ag3%_vJcw7Cau9bggfCgx23cwR=Xk^w6xrQHLW>mJ6~ zoLc6EiL#W%j~X5^KVItxMGgd}D4^Y)9{5DysmOKYi5BuUui;d}nD6_L6YasFOjC}# zHczo(ZSUG->j%o24td8i_|W>9e3D++Qxe`w@T9$cDvUBrFU6PyDH+cIXb67yo5J#3 zG40794Me%jg^c&;B&HbEF_T9x&XsSefG`7I4C>qZhx=cAaV){D41BBnVE){<2L>v7 z@O+e}#wYA`9CLORgK8)rap0>`tBHC{KGDrK|BkwuzlaI=96JbeGJ_Pwi(vS%g;$GU z{Zx5S_h+a9Wo0lHhxZH-?es7(>U}TAl)Q~QXj^ng`9!-l)?P)w#v|is_sESpWZ=t+AIf!#G5rs&Syz>JIdC**R%{28T7 z3V@q>j&C4r)}lPRp4ColvW%S&W~ir4e=5v=&{fKhhgb93U!Md&2bOjoJ19Yb8HK3L zy4q61UjHC7w>>t}Ha#-tZtH%1W3Rmx2ar!UlUNLfmEdH$tN}_H)_jlNOi-NOoqi9^ zg{k`SIGQU_MC|n7T(8vT(ya@_ty9AnT&F$vRoQmT4Nc^QnjT{!Vf(8~JI_I`92Py) zsKlD7l)2VxfdNW{PJnQm=uIU-Qee^9h&$N%C=>g=hc&|xSDL-sJ+%mnhFKt;XD#Gj z2zE4q&{%)2*@^mvO4vZ|*FE@S$1}z1{Oo{4vd%e)yV|NLF_6$95=Yw_z4vQ4lC3tBMDGfINUylPM{vLdC8$PvGww3M z#7!FCN}^#}-qt^>V~yZ$FrFzti)i5lP8Wc{b)L^3ngy~Q{tIn0A4raVvcVtQ$}w_8 z{3pGv*4Hunp5VvTf00XaophUX0ZP&+jLmekkfXZY#_;M=VNVsAyL*H&%BP~bR*Q}dWg0oT^8Hb z+8?1G&z0BSPn^-$hiXOPI+G&__cnoUIy{k1=Mc@&b;oJ3rj6kk$$N!*-WU(H*D=bT zr0V|Tqw7^x$?|Od3@g!L!cOqQSF7ZW$!NRFDNm;|d2K~(*`%*Q*3~y3q@}A_QE>1T z_6D(LLad5BIEtTzyE_8L9|e!)^p^N1XG>BwZkhJX2IjpB!BjvAu5P?4wikmTJr-d# ze~F%~qM?I`uv&gYSC`RHUPM?eSZ1ec==@HA#jy~*aWwx=5(dFZKo$AuQ_>Rp!25mj zSZFWpKHMx~mgDF1I61Y+^zJP>M|=fW1(A{|-QHr~ANxVa>i9KBlioZk*_GScI>eu& z1|bw(XKH?{PY2&7|BF?JPV1t%IM>@CuK1MYhZAS<3|$8;R~lD;C|B%GHu9HNvEw0;77(X?22w1IM z%aiOB(=+-KA2<0vs~0Nfhj)MhXFr;#l`0{U>G=9ec~qi63stjc&eM9u(Mj>TmCs)n zqy~jI(kAj;bc_&x@JKEnS@BxtC^T6o>twE#!UOw>4wdD*?dko{h9uAd6M2~^-V^XtQB8iDT>SuRV5`lF@KVqR6BpM!C7IOSK==Vpw&g(pxj3)fUkzqW=b~T@qFwtEZ zW+hV>@`(tZVIO~PD)HCr*ovK<9kXxHykgqU{en1fN;#jwg4p7qn!+cTEpyI5hH}vG z>x6~8sZ_AKr9oJMqy|Y0(OfufU3-I1W($>IBOJ=s6IioUUS_%(HTTpfCmY%9#O%-* z7Wh}nGS9alcExi=;#_~8?TAqrbG4o*nahwsLFg1}QWPF4TIl>4u;pQqh|II-98+uo z(Uzi8j9bgxoMgNzDV@owyPUubP~^g*#Jxy#7^83fyfvKkIEl$Fgu-3GXv3c-G_7y!TzN53|0z0QrgQ7caCIUODsHrJxMO^Wb*kGR?`kWpC;A=J&>1(h7!{7l6brcI(kLf%V{TT2<75-6 z8&zYT427ft`=>CKA>vVv&c z>9c-_$@t1_qhpRP6z0#+ww!e6an%ezStolEC*FwaLF8jo@%>hTO&IniscS@-4Xk^{ zrtKJ5&7a4q|Ll#BJS?d+UDhcz~oPM2|KSxUs4*+p8fP(ywu!Bkt8%c6sw78 zWyNMQf4$PiP-wJBw)J zFrI&zxy$w&L>{f?;zPdE1W50pp&X*=#w>q9Fo{|y964+OygHpN!b_)=H+o!D;6hCIj zaWcvUbE@H&Wtj%YJiK-AP$vs@i<*4hd0{uunqN#iOC>hj6>gO$NE&}#blRdD+`i|#RqLfDYEs|E;WZS(Jd4JuKXL$d|7$*@si*w5&^NgZ;jfd9P&&PAfyK0 z@-#u^rMW!<3dHgDRD+nfKzz(tB&HQ<8g4F2+(~@yQiKAa_dwrJf`{u|5QPP|UW&x-B%aYvU?T(iBW85A*9V0nld}B|2ByRyeWvN&^j9@JKZ@!Qbsb8_^ zONlcJ=M0REj)N6&mU~$eu?2^f;T}P5TkRP+t4-So4XIQpAtJu020vP`T?2z@1x3Vd zvJ1qX!amg}mWG+-dq>E0of@wos@EzJey05Ent8dE>tKl|t3mre*_a~%{M0D|w-9f} zC?w+bfEz#g9_ATATsZS!`bnjtFS^eH6s zdY{~Fa>v+oy@j+DD2O^9u(yLph#W_UVr5pQccN(|L%vTj^!N}UkkH#>=UUua>^w(f zJbJADK(RUlt4b}v)x_UlVCbm>IDnyO(zDGhZ+jkL3o0&`h0 z@{No_wWBu{*EDzEFzZK`(=~~~dX2&bK`()oMNe|h|4Dlo1x#xHR(r?t-E^1H#SqLUK8XTlHbx)yx-zJV%;W zKH0>$zqd^jvt0{Zv#3t^*dDNRu~*%VWSum|q z51|7P!|^AB8yP?XE}H1sStdAo3W_XgHx(MPwWI3&GkMs-JB@+sRef+T-$|bg0qg$@ zcvks%*4}As_(r{2#p-68|I7JkSlVNUnAGeZE@BMm>Ov~4d?vr*k9=pVw`DKNYshuG z{&rknNQbtbo??Qa3K@Uo4zmWL7IK@zzE~4tS9XEc*vZt)r;Y|JJv<;-Pq|0 z%OO{|+~4Q~2Y_nK%zLWsoY`7QB;R_zdr#gJaIYRa=XjEGnV2kj4}%4b7WKja_3cjMco6HoZV~yG2pj)qF`7L zVJc{QADVF*X?0cOT;3WMsv=DOy3n*h`BatGSlLolhrUJwXZBrl<;2|=MZwM#05d?$ zzq2)~RxsboSgg_(FUIe6>$S#fx_X73LiM~S2ib$bO1gL%8=}nT-y8|%NqY0{0f5ps z`ihbDjgrz?{)Wz#?J;z;zqWa=h_}v~Uwwh0e6)CN<68v4cmhg&di-qj$o@o|*H)MN zhH~@QV{>G4ak_TpTan|pCJ~N~V4rVQwtu+3Z0kPcpe!WQvt4J6;&li^~|lB(=48NU`r2 z$5ptqRbX95wQEDI>V|^m?Dw++2AZ+`PnhjdQ-wp7;&+p8j}{AOe&HW^M>tULnR|Ok zuD>oM_4^m!6*k2o77=|29Aq>saUVY9U>1M`Y;3hvO+r$Wxlm;ShBD?sjWJS$x#CFt zalGMd2ttrizow=n(pRG;iN|8%w`f9%viT0fnpPY@C_nri9kzc)_XwUrm{EN^M?~~8 z9KsqptPf>CkY>~*A_I*VIO4tc$c;w&m!_F!^Xs=YV7%&ksTIJ23`_L&b#~lbrq5XC zwJVsP@(gweY7>RvwgO%>J>JhSGf$I)DB$V(zS=M?Nr#PQOVRaGpb^N&Z?Kz!PpG`j zY2z{z2Er-Wh6fb0NAky>3RpbR633Wj$86{78f~M+Q_WnU=k|wC%-kU%`fqsdB*QBV z7l{ai1U_VJ?Zx0LjOU$ViklGOPDxDz7Q{@2g^ zTzoYk-lO!p*rq7Q`jeoGlGu3*@oJ@Ulo@R(vh4SO=F>b}N0A8?-ZIw*>G5P#o*45` zoR=`K^ynmrr?zg-4U}@Yt^%@cxh{CkoMm5 zoPXV&&8X3vA}~MBUNYsjSVrfKEPHdn=5k+U5I|P0`W2GF@sfF;XNZy%{u&bu&Q8i- z=V|l^j+gs)0&%@NSlY-OMMQ(3T%oOEF&Z96qmn4Lq!5jYQghe9lB!h2%iZ)m8(i9n zQU3Xn0y1<|34=SAp9^4;)!bVf2iYvJ>OpJ1qf4XeVnl2s<6=0?EM1vtT&$b1{(Ngg ziP`1QcuaAAau(eR)Xs)Je2aR_jJpp)irmA=VV~$?#P>g8-w^PChhYw9GrTaM=nm53 zC<$un+#*J`K`QNg-=oW9v|YuSD_BV8lzPB(|Jl~}3*`%1sRC2!;!GV6;0|>541kSrttz3llsEV32psoEb>y#`{&)#REmCm={YP3 zkS~Izr@rF*wXZJjgaYCHsz`u-g(1b@h09>l*8)ZPyAQk=cp3W?_!Lk1+m;~P8*K!4 z0ZFiI>Zi2PkyUz~diHB7y()Zd<(bL?Dhn<@{q^^L<@~-4$mL_}__@FWXmHolKV{8X zmtDCkNPNtjG0*go`N(BIsa87)*ry2&G7*|kQC5h&l5AHtZ5%aE5u`I4Cj;AF{i3TJ zcoP!fEU41C8?#|4RP34arDaw7u5&RktJ~QYgl2R(7ZZT|fW!VA{8YQHd(t7WicG+# z(LnD{Opce;bjQ6R$qxFtUgJz5bgkxTAoiq|Uby)>LlXGRQts9Xg1wpWOPu`;5H@|AnueaE;&Yr*p!z}53qVrc-7QXPLS&p48sckL6*~l23wsvl+#eZ@qD?{k}E!>@*~j(GCw3uZe+c6>cFUF(NmvF zC7+C~{t{)_o_?MERiAN})$tgb3cTL4+0ux5*#%N=;LyJ;H-rU?%dzP961Dfy#l=2g z7sV9@3e7L;bw(0rhldkSXDLwUl}hx5Tq#%^zXWR_Rz@Q6=mT7I_Se|Ta?%1L^4NDp zU9)or6R3XU9B02{=iu1H`}AmFc}s^F;7ukNi;7i&ih z)Bjxo@;ow7%fz+n`CL9A&@#?$i4;Th0(zq zq4@P%1npcbS*gTbO0&BD8R^ft-;ju`#KWw9ySA545D}A}9Ns}CKAj7;@tFi&)#MX0 zP?>BsaJb-4lf%)F2=;+n%78RaK%c^)5i9`50Me|Ahl4GHEE$u}8Xyn}nlhj}i8BndXM!{V9@ULn(5BO=r$<`sYbb4v3~;t~tLvr= za%ox-M$LVSxQl5z$uH~snh+g~V|q}Z#dTK2Q8`78(k3U&FYF74k#^;r@~!y%rO(}G_EA+zTka?F#8vv(l>5w`m)5p>zc?}JARmg2a;0vX@8X)$ zxrGwVeI2^a3I#e75dbX2(7D|AHX2wrq@S+utY)mi8fBX&1q}yIO&OsTGH`r?G}-iU zHU*Hj0#KEWC4DbARw|3e#iG>jy*FKP&EG4~32 zmoC^Zo2~LJm+tb7QgYY%8DF{mc~wIt63q`c`uX!V5sy>UWxeE81)SF@eNm%^c75VZ*KB>B;`2 z;ddS|3p!af%~7->3c!l$pDPw;A`&Gk9-}fE0qJzh^_pOfN2QS6w51KeW;$q2Gwc>K z#ui=$hJHLy5Ccv6zghsx1S)re`Nq%I(vb2=FrXH2AtGRbP*dgt3ry$(6*dbBHmpzF z)DwFHCb+zC5sVNNXL5^sPFcLNv>-LCj}*in zB%n`#2xa~aM{dQ&bC}^Iii}(a?`ivB<3!fj+0pGkwBNo3JMsYP=y%-A>orw^cxry` zw9KZ~+_i?Pr}WmHpFW3q)2ZL~;3*u^Zz*gl-tLh|@GTvdJNwA=0|P7Be32N^D_f*juK7AWtCz#4>hE>(_0DNNN*N>a1aA&IDhdw9bkWyB#<|~n11hB zccL`+tIBq9mMF%!i3+ z7PVFGOz=o-eeG5ewfKU|_u7UZRra6A9V$XI{cMyD z6jD%T>j}|h1Ft6zzWU8PYR1716h*Dx5hTjS2M1bZcwGy(MXMlwbkF7HBmQnTJ*tKi<85{MeCN8$Q(z-qr#~Oz!UG+tI~i0b9dl{Z0yvB||xj zSfxDrQSI$sY5BX_?~8CORUpWb6c-C0RKtn(ev$1}t}+)WCwF|-FPf`DGZX;A>ao}8 z=Sm1HyL1Zb9^CP)S7%I4B=R6z$X4V04t(CenRdWvFj$>f{tW5tn$OTY+iH$z=lPtr z8Hs8z(9U~uOipdHt>#->Odj?#Q?Vpj2!j##rSZy$6MhZfhoyg#kxQPix~=gT-67Rc zMJU*dnv;ve*-$zrf0y}tug1L7tTc1QlZk~_Ofx}@Hic3R5ovZU6*mP_5IUbsu`{i( zWd@q@?zuf)s*8!Q8KT9eG|RKUGzP*?L*MCAe%z3Zg-%N_D`O-kGnP%U{MPApJUXQ! z6v^u>OgO2=!ar*yf>Yt8mk!+9#p4YSJoDfdZ?`D-Lm?uLxs_J(rRaWjcjl(l~; zK?+iH{>VLBM7RoSIUI4S@8WhIf6qhQZf^tPol8<4GKO~FDaOszF=U)$eMFfuYdkqW zz+DbI#5nz-fBL#YQYm=$%cDC;(`mGQd(AgAp3TY^G|!J)7Q_n--a2QRRtGJ8K)4{? zp&DP;fJ#t$7p1e0`iG5`SUZ;~VMI#JKc$bHToof&lELh9>6+(v@NK@y&Hh32(2g=( zsSVvd5#}~IYKcssUrw z(x6waKfH!3`oiD<_5Zy0<6z!{&xf)jL%o2P%Lo|7Lh768S0_TN!+x`?g3bM7;bIK{ z6Vm?g+BJTCVDQyJ)=e?_>fj3~(wvuFsXmya5;| z*x|VcAa9N&-KDBKX7XU7%%a%*bg{X~pGvPJ-}~dLNFV;?TIB!)5=)iC)QW?#9M5Y5 zz$*|;0d4KA6yD$OQZgQ-<*qUGEUuZslsAo76}LL=}fX=+YRK2vu_!3iu+bq88_~6K6d23g`7+NXELRGw=j@D~xdDR;< zSpN0LOT*?Y4Kwiy?nVFt`{lej7~*hC>vfK=u+_JN3zv-9agadwoS08RcK&%sH1PV6 z%ii8DEN!`?BSa!z%+aHV0XS@=QCjt-G4=C;tI$J~uAk^!t2A#)+^CG`?VgGcm8PJD z9h3cJL^kJWTc*5x8kyHj(HvdXR``B_E{4}Sw&@Ox#uCibFnTHl7##W;6`Dv`*DQd~ zzt1>$l zy`tr!xYPUpkWSf{f5Sj7i_}-tF$F}i2YMV^5W%qGTd++fR^~PAav?M(Rhe?D4Rhk4 zHzj$00OwBGN+>_2Zdq-K9wJl|`a_LPZF2iA1n!vKw0mMxPE?E?>|H7uedv-Kc3`Tc znERrYG3s7Oo#pO}({__iZ|+swhCx#{SD8=QiDe60DB8|K5d-C-&7B^FbZ;?Y&#M($ zNP_3Qd(pu4q<+gzfPGdS%Zu5$0B^FA6+DYRBgg%sZ>sR_zEnm;BJUd|H}5m9tk*8} zC_fdxX19`qisj~A-_rG9A@!WVvHZZlyfGzJ@APp@I_R9IsL!~3k_7ueI4AQLE3Wlc zsJ2%gb=#nVoiKlk3(I{VD^xFu?on>(6QJU35bBa=XfzR!b_H+p_jZ;uafnByQ$ZFzeFCn{3?&FTXjn(nbO86K)<>eWp)YTN2fr4;#I; zuOdnA*$U}^3y!5y|wZ%gt2Spw?1r~Xs#>Bj<$lV% zOegfQxuQPduw&@N;gU{38I`@@s_{4=;TOt_ihJyWm3kCn_5?TuUw8;s;?(fd+}bD} zSR!4{l&r*?O*VJ_ETm@WXJ(YsE6toKRI1fV8&wE&J`FACU3z^38-{PADv@nR2gSA@ zmNAJ_%^i$9yRo{v+qLC~{I@2mg%vs%mzhz6dhtl@;cB|QY#OF&{<%y6?i>x+MlAdP z!SMKxVdz<^A}37CtcJ<7rLtm5aC`Q=mo}}{tLCH*Xp`pAT@$~J5N)ar{YBC}t_#wB zlImumyV?Xsb{vY|>W4+UU`1DHZWeWT;5Z>iR$1piKQ~KW_7y9eTQawn-6dbFZFl6l zbHiG->gi2dKiqcWY@V}|IitB|q=-+-49|NU`Le1kvnM&LFB^Ro01Z@q<;)xF%I7xO z-d5{+!?gc)RT8;d;?ZPO9xPvV>Q>6_qvS=+D?%1Jfq3HKVUJlZOf-#h-B8Oh@*)wf zp>D75YFjB-bJh_xG>!EE+aSp_bLCUYHr>IiqVf!TnJ5J;iECG?hY&ZGs*@ zMqi^@Gv{UkUbjpVm1gT^CmIz%)EFjBH@8MGdxDJTl@dp%im_D4Ld4O|(=V?dX1LXQ zabx&hE=(>-5wdPx9=)X5(pRBtl-4Ni5NH~T-D9L7$ejA?u6*K(CD=bDz|dU%gf`t3 zQO3ZuZYsH%Fu(%jvnLp<87GR3j?-7JXvC@GpFR5k?!}!!NfITQtWVex=oEq$Qbdv_)@$k~&IuRwktnFF{qbwn&9`6Nb>Uc41%a?M zgG${LZ>@pdbjP58^&MamShIiV3+(fVYy{dbgx)RP)TyehuE7}!6jVYZ%RegiAp?{fle zrZ~A&f3U?pW+7v@D4I(fNcW2BgHx@`=twsqOz=~`E=0rvH0O&X{@H$A%i7trVZ2A_ z0-AHLX$VU&kiqv@&@*~q_hy|-?`nyJ1?Y7xt?`{TNyhP**=B8&I%%g8dVJT|pQ!OT)J~x!odB)G@6&^!F&Xx#i;#~kuQXG?@y9`0` z8jmoU@C*%0W|Oo=J$eg_#%Ba)iUY57W}7z`OL!oVThJ2as~-$ZUM^d+rqr!I^IFjX zWBVC5Xt}pViP5L?6Ps)lU5J|-On4|x5|JRH{|v!INPmIG^6cHduk;ZDTpT-w*`2b=}lq&|5&VzP9gpLxa=Pdj-IB)8~jZ0xqAXJQ<(_Q1Ei` z&6%0u5p%gQxx6o&7S&E2IIwkfqP;HDzf-DTa)fHDUASDWrJ7-OUX|n{3@uxM!@ zW_&@H(PqGBU3px^=npz&)a3oneUBfD$JMVB=SHsCO|dRb7o{ys+C!t{MTlnUx~#vf zb?xF@Q79BkjoXBvQfjTMxl;QQ$B)tPFSYPn%>=h~4pdKK4y21jI}=0Lw_^g0MZ1>0 zMaEQ9al_sGXftG#+bw$q{AO5i7R1BwHm9v<4_%_U+g77UVKY3f)!YDfnbb-^Sf=9X zzUTJMO~iU+Qp!wX1*0>fkuR76^az-TxMX^$BA58{Kh%H&A7|P+L|>&H(ZW!uzBj$C z!e7~-%Tr?&eZCc;mcswvsPxK}{4kIt`JFHVrJ!^ByWpEmM2C~*PgS#&h!5i+1eBY&9lSe`3@5A=D2})4dQ=Lbi7ELpiQ@aGf`O>dG~-{rIee z9&s}0(W>Ca(zF2gRl|+DEbGjMZCmj6<=#PJ)7>Vh$6hE6ad&nj>*K!(9`EXsj{E;E(NN#n zqq}mP(>xZHN;%~eYdXK62QEvGuyRNb#S zGVo+VAqX@L`QWZD3X+OWkpnnSEM~p>rxKihGE`|+4RwpLb$8_IQ< zXVLJ&lFU1%8B25DCl6kvrxKufD}x$0RaH-&sQW^h_|UfME3G87B~QCKWo*@@Dv{b_ zK&puaMu`OVV>T3LX9e_4RexXEelcc*rgptnyEP4o5c4fo4V&CB9gi5nAQvfLMDcsQ z^VG9qF&i0{BT;b8BYvnDRc3XEhGa-0g&L$J zwlZr`49qW!tK8Hd13py~UzBx+xJKWsC_4{hGpMNf*5q8{KjbHZJNA z^jbTY%}}r_Ptz%g(^#edwhcZ=ca_8*&Y? zl{cCt)2II&xO<)-uML|M;dle8ZJ`~f2E8$F(2}$CX@l``6R_kU5=z#}+)tXXCsrYe znIg9musw++6$%Z}mo$XJ_)Al|E9#NL$|hRc+nIxrC#2?vrCE*+;Lu*%7Pkduz6Aoz z=6?VG_kH4)EQP{&Cn9sBZ{MzDvB&+fAEV#BeS0nl=WFQ5$W%&MJ7#9;mhXj**J`Ir zR+6|Jyh86Q(e`S^+yNbNO|Dl=uOgcpW%Vze*S5RgyIE$L{fzW@ccMx4@;YnlkxA?5 zaW003$Fc~VWK36SZSMTIvt1ql$(QxQ$NOCkX3yfdDS|@b>U(Um*1NaC9boQ^vC3-J zexu%o-s!J9#DP10tv9j7EqX!0@7UK^!6&TF4s>Fljo2K6S5MV0n9Cm|0Q3e&Q!rA= znpX9Z$)8+E81nn+%5I`6XaO5-DT|>j8V0%P3hEr&E5R&YWX(0Rh&Q}B338(XS`fzLR;O0^i zd>Hn<8c&)sFK*C4k~U4@vH;Ce=+&!2e5nwaToqMrp`;65!)&i}-NFU5JrG-atd}08 zK?AM@KeF)*dP-jqQZ@nvt^QL%gXO>D3BQc`kD#^uZ_*#iOk;S?;n2L=z$7UxKT4FBS~l*jqV5r3fL zc?yV&`?|@ewX^2-Wh-^gXstuOJjO5YEOQBWd8of5@oLxDN$2purs%J=pL_ArjuQT~ z`pGQWzw#ySrGw631ydqhJG9;XUw&X4AwKL~`rM8aD$d$;T{udabsN{W56yK?!3~Mk z4%MMZK8T74XzxsGaW`k;61Y+_7WOR4s*$=FT3yC`ppYc2Lt3S*wviCb!H35qsum>>o?g+x^38-2Cux#N_m_E3sN z0tqF7xNdRLU5MqF$v(gd`g-)XXqjy=ke8ct%L6}x@&+Ke05ej2PWVuP&-WV7*Xz-^YdpaeNVp4 zS347URKFp(y4dzcf?Euw`K@p14Q!Q&zAE|}u&1=ZO9lazgiD9wRd%-AyvB^#t4>)o zn zTIh5Ujl*cs#>u;pQp2VJM{vf&6*oV2Nj_6aiBDkj?Gq;%?$-RYrP1murR10)yKlB$jpRoq* zU7O+1_k{A7X`)3)%S6uynj4a-7SL)p zY{A_GL;yC~rxz{!hK~Zb)WIvKeOgsCpI)x#cu%$6yq%wB#r)V&9!U5b6c7uI!s=B! zB1wDqDUsYUg#?XSz_9olF7?xcD{h2wDDc&ny!|Y+GD2sBK(aaW{CO3T&3Tvuj8CNjN6N2 zc^<8pBeum+YM(Y_a(^QMr^u1Bg5DHL?aMT55*qSP76$I$#wd9XhZgTn_04@GZH^3E znglJ&eDjmkh${UN9h6h?id^^6oQ?kIhlxNE{|n1N3fR(~3Up*`2 zijvce&z>hx^xV344M)^U?$&HBi@N=CsB!yR$aWt@D4j$@85l>8CgVft*s;SQ5ux&v zuRW5-qk1%jf{J!1qa-^6yn6Hp>aAVR%!xZca8VP7<010#C z&pr(kf!0j6UhAS}@7lX}z714Y-k-Mr2U6J$%r9TLNgk@iro>GrLVqrvwAd_Anl0%1 zNXlv{{r)9TfBC(>^h9tn+sIz+UU!XPOV+D_OXveoVLr~j@2jP1&!}hW_$mEMQ~cA} zyb|tYM@Csk%p{W)s+AS^SYU_@HzktNfMc>tk=jufPq`bxkAWgW)u9_gl_#s{wq6h} z>tG`AhC9kff1(D{|A5GBWz>?bPhM<^gF2Z}8KFMxG&N-#7Wf)HTQ?+ny{83(w0{iY zX}{%0@LVcF^bQm!$DPJOmJ9`JZ{7m9kmpTCW4yrK5Wa+krveuUd*Pv0edJrHe_c_J+3K;Y0fGo2K7-^3KpC?_WFK2zB=YrOQX#|1ZRY}N$ zsjg3wbQaq1zOBrX2Esqh)oYCB=NAGx(#X}&Tlw5RR8wig^q~--1elwg97Q}g_Zmel z?@kHWkas)hZA1u-uXWbPdM8_271IRIjYHLUr-uPBp=?(Ras7yfm^#HYOSK& z`wvMb^~2LMmRw~tZiUa+5rruoQg&l_>o4?H(nG{Q-Ana{or#-gdml%+`dImrvbG{( z7p&tb<2KF1iyEl$<3+|T(cr$3H{GD2`gSx^hn7h3?N z-7f#2g>parXHTO6Xp+A#C2Zuc{Zdc36GglYx@H|9PCaBM{&in*V!%HPSi-P^+!JO5 zI@rugFRTlbeLpC5i#EQCqt8&7BKWgRe%EPME#GG`?dVxT9A|p(!G9fnHgQW#ss8N_Q1c&3xd57=V@14Ul( z;Oq|aNiyHKuw+(mm2ptbABVYXT46HV*GPgdjvGBFxMN#vS0!oI8@L~%w_{iUf@6pe z!J}wU#&NgP={AWH8DsoS@;|-{eIIF4Xopg5(CA$r`Op>xj-ym(=xp)QE=7Xv{$V{4qbf+kT65`SQT( z!ZyvE*xJEVow#eKj@8VD4<6E)84uEj`&>;30OfqZbRZDZHBUS=J|IdC=Y78387%)% z9dc1B&9C;GL0lCl^(lD;dekR|9TQ7r*scadjrLb$X}myZdUYo;Torx0UU9+a&q+K6 zK4o6kXer21DjvD?6l{8}e?ow4KMQBv`LY4j_lk?k1Ir+oK{PaH?B{SH*qzj};=~S$xWpk*YrTFKJ~fRkm`kA6J*@ z(N}Xe3Y2Hsg` zd_4%nK)XGK!B0X5uzJQ&ykzsh$u(ATY$O1^q0w5^ggB79gS0qa&ySdKa40%KHcB;6 zSuzO;!>CpsnY9ilN0f=q%y4Dq;hn8qwyJ1qlNKKx4x-X>n%%9B&MK?4XR z6VrUXNWt|*BRA29)zaX!+%fR}Xm1 zh)0bC`jGnm?+!;tk`SQRu6~VKx=N|OR5wj=Uc%_QBZ4r2r{vhfwQ+~O1RC?#%j#l_ zFq%tNZ*=in4T>4nmTeIZUgv8d7i+Y-Eo94Z+TEXj|F2#QO7z`i_A{c#-IYcf6OTsE zROZjR+n1d=Z%+j1JTn zd+6vm8?`#Qp7VM|4Fn(8W8II^OkLUcMnV0%8i zr-c?L`(fwaopm_}=js0UIS}xkC!hfcsZ1Uc`D4(y%EXaKXp!_}&7Sgy>)}~Pk7k*v z0R*+iSy#a$v~R zeX^24%(kxlnZBzNfrHfi>tqOoyp%v43|w(75S}?G)apg?N;OE`O0+b$p?Yc&Fa4;>M((f(+qN5a0fa6{?2lCvuLHUtJ~ zs?$>|(7(8KG&DIi>SSt=D-4F6OKZ8(PI2i%r5OSRluhu66AmjYKYItpG80XMn@&o9 zR`GQZ{5deuBqL;2oG;ZZDUr_&L2EFS#)4iOjE8~wMjVvio6QBl+}v)l0*m+ix|BR6 zq7j@*t-zf3jCOGVB%GV-9-qnRuVe{8>Sv@<-AIjL3V*mP=gMK7dWVl_LqBz>zeAM?E0)b*m z(-tW@b|C-yqZl(%hEkVNw2uUR%ev%$PwfoW32O$$RZzsii+!`7Q&yF){S3^1cz<&M zQOa^}ud$yq9;5$y=a4dqMi8Wo()uUXucO%AZcab&9@l#!UG*^*LMtD{)wQJ!^~{{|qje>0#VA_7t-GV0Vt=7IO_^w2S|1KGCn=&7 zIiMqlKFliD13Y7lJK7x7ntg0O;-~v1`zg0pU=VC&Sr_guH7d{#*$<^ee(Eg@iS`F% zHA>;eTJ<4O1GTx+rl($J0Z@RWFJ@}K3xQP1SdkK<1Xw00W+4cO!<}9e@|b5YYCH+E zFWSfJrGrx^O4gG#;Z|M={+0UQpTC}7#2Ib8d!Ua7GQO-kqNNQmX*UEU0pJe@7AE4U zwf@t!j*X40k61-dQ|KSSc*Zpj9>=l0*@|=`jumLC5r}r@uU|vj7K7zem7BeOK_t37 zhCmC^0leiNW{O-pQ_NwEDVnA>L($P+o!;NhiVSBkC^Ts;Yr+#e1qvfIbcC$AnegCRn?NkwemQ9q{hZ80)DRKKV55>n@+ zrF_6xec$!x3-5M?t7hpcw?AKqOMFRL_1?t$qmqSty(Mj6DiAf?M7yNXV2p=OfuA`f zBa>sjholVH6rcqddf`ip%Fh>sbg|fg9}8rHx@*{h-8b_G>|28~r~`VU8QhR8o~FUQ zVm$X6d{aD^e%QJ#Rz-f)Y+bL?@#<8df815HKiz1(<-p~CrfcD+F|np^Vcxs=+ty|2{Ww#AoH6&% zo#cyzwgikJ)APFGIg@CG*hvi-ht@)l>k0=EIZLZ=Unl@u0cII6x44LJA^Z!4lKC?+ z9iBtCzQH?K4wgx1B&ErK=cc(pgvCHGS8NR*-4R`eCMk0^@ZhL4ck!fIkTYX0{Nqgm zXA54u6v#2s$LYCGvvG4HO>^;rGg?keO=~o~A8voFukYHJ1yE)-pw)>!Y}+;oIY8agmiMNa9*?C0;5E;h zHZt=0bU-%>p5aW6&N2xd_SY96bo}-0C)BUNVo1v5@6@~jh<6gp=2vF&@wdr}H$BYT z{4PCWcnu{5WIqkMf5GmJVYAB1Ad)%YW&d!Hr;EKvkJ70OOUUK-T=0;^+mHL5gr0C3 zEfR5KgQKbmo0CAPN#e)o^I~h<*%Y~*smuj4Wl)?JMmXI8iCS${OeonAC~;6QHNP2d z87I7@!9)1R!d8j3ifO>Ls+-yplcA1kmC*3XzXVu6ap`AXI@6oLTU$`DRye7g8L|tZ zpEjfb+C53hi6{uQV+PGfmYNmYK&cfMz2Hn@A#As71>D9s->gk`+WGpOc2;8bao>Iw z+|m*+q}t6T$4O})h=stm(t^*S)}vJOojv*?LbHPePzF;5I;L%%b*y%a&;$ig1fR%r z&(EdrJEy-Frq5agd~+-oM}-f|I^f1|NcM`aXW8ji6?K547g`8XK4#|3K%L?MWfbCz zu0Te^JT~LavfwTq1(Ui=feqFWFM%nOSdLj|`ofd%rjvvjgu(Vy^JZUHZQ6_h6WNlg9F`pn0bGzs>?3HLw0ZOK&|M5DU zPKimPl{Zeo*d(cX7TUPF^a~>+90YH4G8YBWFps2b{&?jK$gEYWx3(D1 z!<21adU``7ytCf#r&HikiojIc~8C+D%CNYW3!UMh+0Xdsi zJa%p$1_QS`eLF%c*M|;d-cycTNT3ng2n@+=H5Bb2YKy3*W@TT9jMnMqPRxN}#5li# ze0*p1fWUan)K^A~Y4FG;5kt>L0VD19O>3u&F_-A{u@MHIcSe0TnJmI^0V)0=rO?PJ0vAVOUPhak5s4~M34*5kF z25O02RuL8fQ>{_BoGq=8f#?NIsMkGNodk7Ylh7DoD8 zzPfI@YFNx}*sLL!U@enFT-YvoYpfdnBm?&Bf@OHevw%+U zNRBWjHA7s0U^svMzgEe2yb+DSJl{eE#<^>v`hffK8eg-Ib!p$35ZH= z5}7G;Zk%*q^70w$Uk`XiORbbdlm;NByg~_?BxhNeLBCc$A7><$B}~vTOe5~&dmARs zotTzJbPr_fT)?GJloLIi(i>qk;>rz=9}hSpoIKo}ii>mnOkQ42-`w&=W1Po!xvcF- zEnhzAm-46a){EHM_yRk8D~DsL$RUfV1i!Yw-s%fDz8_C7(k|$ygu(YpZpJvgCa5gz z5rLK^>vQvTkX<$?3u_0KNH*~diAHfFDBFo!mU)+qkEVP3!7wP3Uf{|L*1y4G*7)n! zqpZcO4g-UdfaDhx0NmOOot^!(ktSw_&U!;}Nr}%A5Eb1#&YUEYt0*XFT+&5E=|j=< z9|0W|t=$~l^XX$>=y>)o!GlGDE;{5K{rqWO_{J-W&Yzw!e;C)M$@9{JN@+AeU~GqY z5Kiw*B<7HqHp9|Xm#W1QE}fP?(CUxm4>Si|42@W%F=%{!XE;1D$fP_A?m$ZdjhZhO z$MvEw3*)8HHSKT#$bZ+I%5UrFk#v%-aEB0KAZqEQbl_q|krJE>MX7oAwZ0-PRqgo|BCn>&`IF=Y?=7?)5<=Q#D7yDqGNhr5l|ces8J$>Q}~C`goaq;?B(t0HPdZ@otlM-AqfX#@VUglq#y zWsHU;X<;Tgvt)_3&m3ev^ZX7iX$`k*O%m?D+_2dep;STdlq9yCR!B#D=dR@7LJ z85N`5m3X>xbXYH-LD6v6GPDl}URyDKQhVzb^W8M3^|hoU-b4nq-D5+^lon2;PL zp(ocvSOQQmHb;Zou95p}Tj@NO8%~3BV^2n9QToa)l4ofo^B7W2=o7O2Zy7hzS9+Qa zUv#>;B0uVSJW_+F zhC<5xXSd1N+X}5uO%?u&Sz?xr+3NE3!%pTXIOg(K;@F{1e<)9X;eFV@x8p{La*u76dWsCAC0 z;3<~x07XE$zic`7(5?15A?1C^k-R-y@)9btnLDSgvH^s3d$6>z1M4mtq?T|Iz2YM3 zA?o4=EdIQF9Ci+?4{lBwn@bE6?KU%Y0AxOc_BM={1iR09FGv=mecTfslJU`zg93YT zOo1Jo@g$P+4GQO+;4Q?&^kJcoTaNzub94*cZc~hIGLFQb;6R~&lI|MOw~CDqzYY(N zjCe>+aKWO9$K$o$5FXMp@zCQ4CIsQ>3o`==r}2dIkaDmk(QT?&E&SMTv9|S&6XJknCMcy%W2@rdP%wEgdul!cz zeevkyGTT7sO3FwDl~dss9`+PIA%681n@s6mWE&6(nC5c8(lsyV9gs(PP7hc92rczs z1*EYX;^fJiOiBZui#@5-C{m?XGQ-G^>`gnqI*TpO>_G@HJQ>KO2~5KWF-$y0DAG#q zt@IR34uMfZFui753z0sPh|B0G^vM_P~}qobEq zrQ0l5Oo}5#*R0Y-wylJR92l8TH7-l~!I80%rumsuY;$h{jKzA1WRep%|$Mtgz z>Xr+=pZTauYs&7%qXV9JSn}5Q%GN$Inb@Zcg!Jn~;z5y>%z8 z^3vmGU7;TFwL<%I6im0bLCFC%Q-^5POQUw?oOW(4%3o!?IS^&_RtF+&ldlJfLJ~Uf zM+45QzIfJS^;%d8uD;1{8XM`_dH&`30P?~}5KCuNoE&~*P6xuc7wzHzhfi8dI^1I1 zK?i^(IYS9uox^YP70QEYqMHOIy;UmhPlW)g916w1eH_QvJjhlsxs zzRRIMb@u&1a;aLGnikCh(OuI)>sTNZU)6T+O%J?}F;*Owza|+_T<_`~#Wq-@lQQe; zoozSdrLkLV(vK&*9zm(eQ8rS$3sVd2QGM&{l&w>T>}7wI?C(l~^;=Qa)VPBkGn3IpP+HR#54sm{HY` z+mRkD9%1=qq|fB0SeqliDuv(YXIAV~ZgKgK%|}d^D44=pDbsI+P4mHNj^!aETG1E; z%18w+gU}@LiOGOh`t`J+uUxQjskjx;D#*6=jSCkq50sTIXTH*TAUTuoOfr{&8gQp5 z(IZ+dDQS+uxbwB$YU{MpYSgV6Js%ppFk+MQ@*7}oqcGrMU7Tw&lSwJMSnWmIIA)e^ zM6u4dyCpc1LsKr^Z`u`$#G4rQPG{dIe`MWotu39|N|QZdx{AG7JZ#+T$Dj;p*7UX{56pUxSdX5*+lmX{xiD172Y)8r^qOtsfs`JakDoOQx94|Zfum+8Ls zezZtV@&Kz_v2H}f%*thGFWQJGGO015Xk}l@lu>S0J&{A?_VALZ`AGj98-GQO?`Ion zey1g>LZ#y|HU7rnV|vAv3w8~GK4I%wfbk`UB}`S4+3I45lSh*7q z+hO`l8Q2kJcgc&M^(|;weL5bf!FXvPPq_skm5O+LD_)Dkv9d#P0VRZg1LnA0ds|x@ z9@udrnhD%^KuibLb#T>`9o55XyXu1r3*6Q%0o~}MTRq8ti@^1h*ru{v4Dn@&i)wLO z{w41mvtC!Fhm;x_C*nwI(|N*U>hvW_IEolaZFrT!HA2U&7A(LOnqvi2eC;=E(YKM^1`El#k zQ}QEbC`U9$-j_)}w5QbIh2(D4+Jr@t1`hn$ssHzl@?M0Sl7Qxy%a@DVJVYcuZt+M* zTgMhni6_ZJ)FzV0xF>J;a#d{z1%Moi#u59?PRq~TzJGU00Y8ZnP-B1t17 zR+L{Za&t*>4R9ORsqnewx*$Ff1j%AY>`r=>#l14Jah6z<{Y3dmuGV3S_LkZwNdFL4 zgH)oe?3}!rpC6S)$#jo=`r1deGnOa~Z%=e`N^B385_1APJ3fuNIMJ8rg!Roe5xQJDC_U?_s{tY_J-Nuwi)+f zWY`BH3AvFA+bwfZXCvY)F-@=*oP4jXFR69SX!cT+vC}QbE^8!5_)9F^g)w0jJz=Z- zj9E~}LB=d`lqDe%*8d7mP6ZWuc1||eUZutZKJf0wtU>8^+)9T=@YB7`DX_^3FP)i+ z-l}ZOlBq&7M@<==uP0j=kQyv*To%6Pj9eXS-qE8CZ7~IF59R2j!o&fVtm}T)n)zyOF+NOMiR^UwBUR5fNa=fSkCVa9152N(|@>YDi4> zO%JI&l0c6qkRajwR%$ zO>Wq5=AjE(0Ms-6Kt3n-O}y}A4gOiWEJ6fSvzK+T!b$J6YU+fqO93Djd_VvMQB)SN#!#r_D+d_kI&~iIvSZzS(4M_ivYX2bq40%5HH_M* z$^tksg4Srrsj8}+r(w65Ms@aBOk-Q2Zcf*zcyvzRM4MRH#VQd_I0ORy@W$NX!*e$t z0v3rCeE9YlhRre!e~<-Idp>cWJ{Hro9peUl!p4jv$vgDAsPKfCX;7=1yl zVD}F<8`K3jl<0sMOc_Wlt(rF{w;X`k) zw9awDr~6u`W$5Pfn!R+azh&bYS84v0w}D z2dB>*Lf_-4s)9MGaRN8iK=~Q5i-NDXC$tjK?G_&6p5gi(t6M!~9vq3pNGo2^m%7E? z>R~VSM}-qMjC$2P@HQ!V(6)!=L`dX!M$6Ch;}dq}`uZ|%M!hK|!({mL?*qB+E}bdi z2o%QKl~6Wb!?$t?jpGD+s%ZDfJc>-pKeI__E~mGcjsvS!7Y zusJ3)F4{W)=5srbLX5AK{q_nHnrrs;8QkXe^_70lKB#Ib&#-wSRLkR?ylTBoRU3f< z>157=O}yQ)t+ZSJghcUYG!J_kE8*RpAE}H2p%*%;JcBuLsRFkF{z1=w6aoc*p%r%r z2~2&v#X&v7qc#&8uiKzycKF>vbrF;+Rr+85ANEn+GiKgDpXB0|8&bDimk2NgQpNxn ze+{HkULf-<_n7Ne(RYR1SE3so6@q`V?lR(FK?xt_cBx0HJUI&wlgc!1SUaIVy9165W~)bEVdWK?t&E>anro9=REA^l2S{WD}o3I-yMc) zHONyJ~x~)-!6B6-+T3?r`y=Z8V zO!akq*TxVy`3(ue*5q20roz;H@kvO+I>w7{OMSbH3d~_IE!AtI^LSQqFvJ4Fa>~ws zOhb@g;DiViL=ZM;Cg{79Q>AfzaNnr%J(?J}els|}5TWs2c#c!wp<}+N)i_mc5wZ7W zemAhVwjT7ER#jTZI`nqNuM6Z`ZRtLRzY~Bz(+$xG;BXs#^j`+y`4DGI214ERq58vL z3MK1bq-Q<%Noag7-KE5Z^8Qv1UNPj8x-bbMdy|$ohJ$T}bI>`+59*tyv-HtI;PvcI zo|H+!6L5#jX?qG?N~|F25cWDvxT>YndE_OD#dU_~)dm2+`bXvj&Hq-`fuRDm3+B=R zYXWOLZz&qidpsRa@kdJ6rJ;C3PHHnP%c>iy@9_{QpEUqGU2?+IsT<#j` zWPWZHu#qxyaxzb1yEcMbmQ;b((h5=-535UK%USd1ii`NKG-F+nKC~31jRuTxdElq! zfocYDIvNB=U9Vcu=-9|45-b$pGVH3D>%Bu-UOz|o_*Q1(?DprNv9bjF7brsO;7Mik{3{fR zIjt7%It@V#4hzHeobL+%ymqLi)X+54QbM;#AlG{5(X)B%eE)bGzOJ0squW0&_+)V&)k&ZlVcwHls)yDF-7GhRwz{SlA71SeGBHRa#K0Baw`(tc>suBaw4;>+a^8 zyE`uH>D?LzyZSD4ir1++>Pr?$R3{gKHkcZf%5688(jxLY?;7mlzHc#ftUNg=wW9_cFMZljE zbDsz__PRp@cT8%1DH*Z(;yfsZo>_26cjDdiSBqYf{YXrVEem$b+i-;W#F0P&cizO% zpK!&@xt&$|OSqT7p*}I|w}A1)Ov}EhX5s`eaEZ{)j+Yxf)L-k2@t+|J2|508##_3& z!N#qw`E-OWV_Xf@2|(3x@m;c#;6p)5w6Ac@P+@O;9(k#3PTuN~dk;p2^C~m5M$q`n zcuap(cA~Vz<#{E6V7!wZG^fW|(pzO%7JafdOZ-X&%c+Es63hSqUL!oo zoyiE#N#9>D?yfR3EkLnsvow~=`(VoKP~trS=1V3$E-C5F)tp#%Osa^*X0dPC3!RHX zM_t~ojTX`?0`iOI*n&`bxX?+CZmCva=4&l}Q;fxA(Craq{Q}ryRkxQe+Goa>C*2@1 zPKy2YtuRm_^Z*E<&aZ-pNR{oVT}WoI5}prRv|7S=%N^py1zaw|Ad%pJy(^+zUlueI zVwk2+cCQ-$f{KzOyRP=Jh{bjxf^5tLEYx^B>>5N9cu7tIEk+Z9>}4!3iCk@h-qU2X zP+3&RXfPER%PaAAh7A(j2^#CyZFwKZ=7^+l2SZ#n&oRS1XbWI3xcA+g0SYCJwuqw z0lq`Ao}SV699L>VoU*kH+D~c2?VpULl4)!(2N*|mV?75{qY12aHJv=!gz<&?Cryez zBL$AD4emjwM2Hrm!{oMw5TYsQZG$4moADV~ArKBN>X*)(VZKrxm8ycdnP08+k$ovU z%{w*|#qZFcvM7#@Z#veL{Bc8G{rSh0?Wy~%+qLPfK|PLo`5I5}2V%+zg=B<&_{zoG z+xxbS*Y0R~mu@dgewfFq#iV*u=qyTtrb;6+#jV5h5NQkH|5|=uqI+Yzj2>NY2bN+| zI`nor>!afKKV?4&bXr~3xZl;F-)GgTO=}M778E9qdU~I6vmfOp!&O69Tv^`QyJd6r zwuU!pcB145xvW~3WbX(X6cL|PsTNk|tWnHEjvORy1jLMMz-bKKceKX81rj6k=C3;s z&G^iV$q6NS%SRurI6yTzd2uPUsH}YAjI2)G=RN(j#_Yx2Le_!BUR?gEQ~5Yu2LkK$ zs$H5td%U1>SNXN_(p!Hm?71sf4;Z9z*(qK!)%f52$1TXr8%s-|6fkEriA>VG?j}$9 zvQtpJWbNProyDFlZL$@B1;;-3xZU%Bhi>e68_H36S>?2j0Ak@B;)!{tLlRM%2%FBw z`auBC8Ivgpn2$os>qKBYV3LUJnZef>v$3-91?j*3H=fA{k-H^kBBfc07Lyf?`#!dk z+0dv*UEEZC>R@OSr8JmDa98lcwx9A-gh3Sj zPVeG{tq5mo-YMS6?BXV>ie#Ap47xQ7xHPSQA2fbzEiy~0qEPxGWkKaZ_zYE#=I?FR%$ z`X}qka2xh9=8he`O2Zg!>S6}k_RZB{TkkUOvE@H&OK|}lr?Mf8h(Ik~SvfcNDxH>Z zFz|tqX~j*_Y~(%l-@5#^wC$?DrIPl(DCsw6sl2~mtKY|&#{^g9*rTM=E-w3x3XBeL z&D$R6Yov?=pRNn;BM+?e`1rwNT?Rnl`2+5kl8tc#i*K597G11%OOC*4UDHDqD;=6k zHr5L*?Jp-&qRZ%eR;uAfBX9-Argcvy;pJx@^m>V@b@JeJlB#%ROq4E)sCM3S+)ZZh z(Vsvs(E-}a6UbJ? zi)t=*-PZ9{NTKsE!OCsNmDboQGZLu0htOgNbTfdX+Q}&4&m=}8vBXe=XnIucAv-Yc~5wEt#<(A_qRo#V9!r3PQ(T_+p zvDb$fg~Kxb)%*&vb!|;U&7}tCp>S;~S<9`fi_$p`0m5Iqo$}%pN)cPc^YgkcIkeX% z^WiLVfJnG$--9^Gg`n?Y!p+vm-x-%%zfK;QZnOS8jze;IOttTF`ARb4c4HV6{^UM* z%?bRR?$#0HN*;nEb>pN5w>oZFlNOzreHv`^dcxDLwCP@1JD#@Wv3j)Xvlr8etTDh~ zH+qA1FPfNN=bV$U$_{&w&l^1_REHp7O4+=1b4=r+>{F zJz}v137f{^?qY}leL_mwIf;h)#KP2$@ky@pJwsMfjkzVxOw~oop1wSB86Z#E4XT z@RsOP5gsq4QI%Q#rAz&e71cMl|C^R(y%bQy;I z=SraX>8v=nGuK(Qwce=wMqWCe%!=cD?vBcuIAC&p;8EwnXh!KY)$5|VY9g~bYoanc zYopFCEbk`%)_U7iNk+F+dH6k@OPRtu!fW|{B~$mW6rG`^P9mMg|(`OwEA(}UJ(8eEa{%8cMe z%`O7PK5(|??Uy0VT|B4)+wy5mxdFml#Mz~8&TD!I`8A0Vy9 z_LYqv+(tyYkaA?dME-0IVQF zq6on(SOc)SW|R7tuYcQIk^a?H%$GdpFj7aqHr3b^DfUK#a1 z1%xQI+DKBV)IxZTwM^89h-xhu@a^wm+Hf4=b(#WY-J3M zntBML_NYog>eV&+tKxaMLl*~)Q9x2sae`0zr?5OP9ponQ9Z5$f0xfVrUsEr;ZEmLZ zzu3Y9W2TT=H9Pe@c?1a<8hSkmdIs)AmE+0`hl$i@S+5i(+8GNE>~;xS&2k6 z&H+5_A3=)xrPCLtkWR;}m6~bAM3wdqP9%TAHz4izE`}h|E6c!V97&vKp~gD3BR}D| zq)>H7mlts>H9RPj8PD3TEl9gcM4ub4xZqVWCTHxs&b}jAxdIp?eZ+&1i3cr|bE6eJ zNt(*JjbP4uHo}2$*i)qYnsq_zoNa9ui${ZSJP_@f-1>9)PibQ?0?M|6b-x(+1)Y?f zW*)*dZzB(^lAMws+SM-aZ(W6Kt~@AzN$b^?E6^ZY6htkSvC|S{q45O2aUJTNyWuGr z%RE(3ad~f1UNkvN9Gem&2`a(A@g-jV=Jt;wRv&hR94als=IV3Vc`+hRq#?sJ#t86S zRV2}$%8OgA%)m{3f!~o&zJGE8J(=}OEs+NbiN829N#(8n-Yby^$|$iNS!8W!ucpP2 zh@1sXVW7MuRhd+mt_t>)L-!~K4+Os2<%%7S9VZ}2CqF1Ij&~sytX# zm#$Hiq{;({!UaqYDMn3;hhD2bhQhpsaK+vjh3_!~%tE-2YOpH34hR`f@__ApPq7XR z6fA=70*d{S?l8&Uu&>Iw0?@tlh%6j+?umfI=!E>h!V0uVbN&)Fz23yK*~(I-)#@mv zhx7G~E2PjyyG+L)KSpRHeo7bg^1U$+^^}&D0vrpJw4o4iDNiEJElS7|{c#Wtn*zy$ zH^+50mDecSgrdLqtL*>omLX6;f$9i88pDAxlnMZ(CKMSbj&n1u*@uQ$EbBR0gBN_i za~iADLC8Zzc5udg%(^8Mn6m^kxHlhvlwT@%L+j=^&k8)FB8(p!Cn86|wejcDAqU;U zqr?!T=T`OWv#H>7z$QF4L@jNekHMRviw=Qwu5_My=y5gvw<2x#jIX>(>)h;pU;HRu z4!v#dCsv@do11eI-U8dSM)y7v4}B_g)>g?C(}x2VBCw{Q%=c~lx3{eZ@BI9z)fV)r zId5^Oxu?3(`Fp{XZ>*3Z3_K2^e_eM6zd&IQ@FQW2#Ob+N*I9jO!J?GJd?V6w@6ufM z2J(rQNelv%U*DODS1a4gBJGim|J+X8o`Nu!e3$2^Ij1=2*1ZZY#d&6sq__z0ZtVVZ z%b@`1Vwk_qejRWsHAN!<@&$7W%XUuQIX=*1$>iv>QAgDw>wv?W#}9!x{`}C2k$JN= zCaTH|y)81ceo_0D%K(8}^kLz-mYD0%z9}`;ALHZM>0euyk$Uf6X&&!%s^#-yDBrCf z8c(E+J?KL(`pMv&4DAlE8BjDo3=cWxRLd*^?lAzOuhp#56oxs`%_8+?z2M1E?yRO= zQ@i!sAJm+GC?7C(H2ZVUN(XadwV7^Fw|nXA{04o^3?sonr2X>u?#Yj!@t+x(RoTJ& z6TPNhzMN7k7=bS~_a_Pxq?eExi;EG+OK7L}E$!b%_;Z0ZlUV+=-j-PWd00{RGlh;?}k=%CeTjT3gH8S}klO z-cE{TlvhYs2G32%Ul`E}R@0~Cc;<7H^_E#ihG;W_N+Zn02X1Gb;|^{|d`gISN$vPb6iA3F7=ul4nrMeB6Y z*XQm7VkWpe4VXpfU+eMFaM3VIbb24aSPZAFLbS5=tS(aa?fUf!E=9uP#EzhpbuBPY zQ$oYO7;OpS+ttUSoS^aIlk6G?U3Qcf-(;O&w|~pSomd(FQ2*eZ;`*Cg4Ht~+R_;U7 zG*1wbjFGjFzxOaEddCv@3C?)J?>!L=pYD~CkOjz=7SenIVc z)*kS@Lr_avssNX67ObD=zEWqrym-PZ&h#5;d>goL@yeXy@sc>Kw{M&maZ0mb1Dq7= z{6`er;eHH;iOH33AW#bDI1sRT4|Q>Z>!P*U!U)Xz*6@&^wfdQ-jg6m~)r>vHwx1K5 zRNTV1ZZdGK61l%&K^-sQMq3SCD{x-6wMMlUo5U!}^Zmj<$*ePHX94rG_1O*t>`^JS z0mH<^inR_zOl>sxm`6LmKR7YhThXi3RMB&PllwK#Z)ue{h&rb({Q!uxKDj+GFHFA&Z ze4l{Gq>7VX%s=>geYaciqQHSuR|i%1y&m=(u>|Z?eHwv{KTOxa_W2G~&0f2}jLm%* zObOC9Xt+4r4eny%jmM5f+OPs{yf1`J0nyn(g$@MlHp=4b`?ixdO=}c9>CAOGjc+w6 zKXIuEBgQZ>Id!8!F3N3K0v4%h$g1*YXU0)~8k4uWS8wtDXRScS>lk&cJHrXdZxaa*E0_iv+lS{OF)}dP)V5I@OJP>2nDX zo-+~l_juI0*DOc3Ae~K1WW1WNb{8dL?XhpZgMSCsd;;M7t=eohrFscoVM9kddRA<> z4j_DA^}`RQ{cYf{w?(O1QEZ&*yN*Z1H?2wk-`wgXYdgN!d(4dHe{W=Gps5=uM& zs6F0!cNRdrQoq~f{&Bh)TmuqoOE7yfbaw4920bEo4KRPiPTm)k1NFRe4X;G*ZrTQe zN?$c1TWqgUorX6^!WMtQ*YhxV8~87K$A$rMu#mwxJ~l?O zz78iaDhNkh@=@Di*Caawo@j|?6aYm+*ZilMLlU}{gtskV88Cs}0V(j0gL#x&Xv&e1 z_7lIvR_c`sNHU&qLy8%+cu}=b!lm%&IhqnaCVFS#fUS=zl`Ct>yo4vk6u-(>U!;CX z`L&M0P-kEF5JOLUV)5e6%$A9xs$tc)^R`aO$RP00^a`i@enBS=l`jHG+2!qwpKr36 z_39rYrwrQMtQsmXcLJxux%04r>yAqrqfbnDi~EUbF~ChKf6IV++?TO?nIM~O&1Fiu zAuLZP_NZDiPKs>~!Vd=GI;gac+@dN+$6(;}cwKYSwj*XlT$m930rI*Pqr^r@f}Kcr z^X**{tEvE!Nela;kw3UMBNfPkRf#U~HFq`1uFg_FH~ZEXkPoipFdUIOy)&u5ZW94; zCOIbOR&{W&9kirDMstu9n~WP(V>?NGyCGbU7_L=z!W*>ZeW-*1VuHU9nR+_S&CWS_ z9^4@yQrXnl*Ur9^?vvj9smcmYKq-kZ-jI@VOCAy`-Pzor;FIKC~AnIxkg#JEFRE_du zH#B0&q+aZPUhF6-dB+q%QNXQ_XSDMmyplN_Y;5q}yR-|V~XBWrhISFaFAU8k6$!ku*yc^EJSGK*T z=KmJrv-}|W)j{&|Q29k__J?rgrdiT*(u&d(@*R>&7U2?b7&pUyR-wDvz_&Qyw99Xw zKbNE0@4L&_{_7xztJ>$S{4*m;MhQDpY&H;4L4auz-G8eDr11qq-w*6&e^fA8@^>Br z!b$u0v@3qp9<*DRuxmmcu?6CjG|@3k`KVi=D)YuWFKW~JOaVbnFj(b%KK&4}xuml7 zF64CBx^)%E!*m~Njk3gPT8+5sHpJ|qDdP~aq;(PO9%T5M_-^B_`~<+cm8-v=e?OG8 z*~-cl?h1o^ZZvONyYo0m+b^TgXw@OB-2?`GgGoNA*A^e%{NH5$Z)T`L)kW06IxI=<98b%6lU} zd;iB+CHAF5u!l=cJK>D$!T?2$D0_BP5;hA=VVhZf#%kkFlZ?@=RQAxazhDq`AhEds zgq7{P%O6U_+S`NmGG>G^_TNOB>Eo_1pG_M4=u(X_vqNHs79c<)55!(1c}OC*V*}wO z8{dE%PE)z|3zSu&W$!s?u>Xg-9gr~?|U0uB@mjb^C5Ev3=!e?GFI*zjmb|Q4D zyu~u@3=`&LVB1jIu!OhXiT)16P)2N6vDfmM}z$}e0Zi01L{OR))P zfu4}63BO`^8d`|I>r7G-zM8sey-&v|J?^%A((R=D$5wrax+(Cr*S?+LTU!C?AKFm% zThH_E@opW=^W-w@Hdz;)ORAL#zf~Aa6PkSkl2;ipB!Ak2QaYfg45d#1{WD2wx+u<) zA5zwZN{xUE@R2E}ozxcj?YE|}u?71ENSjIfgV}DJQ@1F~XP8Usa0{iV?=qWQpO2;v zZ%*CsfgO2a=)0Qsufd);lqckn+HkfGu_YUS*8xkbMMbG+PZ-5pIx5W9xDWu(4{*Ae z;MPsxlNSsOfn>me1GePI-i?ZjASVHTm#mzJl7?24ui?0DtQoTo zs!1+h#mj{W!Mq+g-|#}8Zy>e5meHZgrj4= z8?!cubAI>-pzZ=nX>G6<7U{7Tqq%Fdj{ zJ6-jjMV`da96|v>(2xaDnTc#7lvUN*e}?e2EZ#%xDgF@TCuW;Nd)!MzhF#ilBPbjN zUh&S~9u>OfdG`);J-nG1Jyp5fYHt>9{t)nNR%I0Sb;+PHh2|qcnGMo#QJl8w2aXxPeRIhTR9(X3!3R|_iCoR%=rf{e*YNuQ9J2MWPNq6ar z4!pI1Hcme~o3T7?Cn}71MA!X4BthWHg7F$S4~b?XA~449yUJQg`8$lGAYb32RT5)I zYp5d03mRD>Vh_R)3Wq#$U)jJeROYo@y{cnAjje|rbW=m_5v zdRhre4peW9JI6TY%}C1-uZa$T%TOO)MRQaN5+_TXK*8h&?#~4G3<`vF_JKn4B}QuG zWJA+`gV)!p1{Mu(u^pqXhCoacn)1(OF^k+Q143^xvVp zbL#KqOr9Ywh(R))QuiPaAe%G_qZz4~f;t^%wO@@YTXY1Mi1bq`U5>vt73?g58&5gA zGXtii)TcZ5eX>j{;)dPC|}Y;umdv*NnW%@a{bJ%bE9HM1yc^v49`?q&f!})o1m8}dVgcOqEpVx4TXOF@ru2`4y|3%+mhgT=W*RK8 z6(O@ep%JM|2AZRqIayLNy6|@Ka`{9v@5Cqi3d8uB4@&O^R@KgztCSwA@*G zejM6|)v@YSADEAE&J1%pcDX={?om(r#j7lDc9prji1zFK94xnCq5@^uO7aSZC05 zUNoyxd;YU#6dH<5$q{+ee{cxV;hLJs1^_YMsC=+b2Myj7GTY!a-XaVP@^r~n;5w-WnAY*kzmT$khfH&2ouL;on2i6_id@}sdR_6ReKn5@%}+F;L77DhvpWU# zR~PA$Lq(#_o)&Wd<$LE~$tH=!EFUNI+jRfk>=llRTR6cNap8$|?)VBVD91|dUAvex z4XE1lnX>E3xizcj@L_rUw+d)z`dP94nYb?R{>wC-2Wlp;wi=T(-|~XCVfGxN_6vh? z%O@zB3xze{mlYEogz~r)a~g_R!$qCdnJxh~9m-+< zUmHO+y#4ztJ!HJx;|xB;xnC|B?y6|d&&cRFbVA{Cxacs%4@gSJABt?8;h}6>RY)}U zb}k9K%06AjC<<$gIWC|eRg^(GEI}<5tiQ&0=7o96u#nP;%kfs=YF1SYoL;_|fqk%i zcYjn!!PA&59|J*g$S^xB^IAkIuG}MgpS-PX%t$xj)nXn}Snn`HfyZRcbwbgi^)=FD zs6EYAuv}CSJnQ6K_r6wz`$U7Gvh4EHB^h>UCRfN0>oF8QmleUAP=ENiR0;ep?5Ol1bMx<)P ztE$4zlNy*+vINO|PA7Ftq~gOIq0xAyhbD?C3aK`Ca&m7+=AbkI7Y(t#-b~w4x4H>u zZj^{xVV|S9z?36&D-|;2K51ql2!9gKrM(;xDaXF~J}@LE+sg!Tq`(lp4;Ai?l>b_^H}p9?N?P7 zRV(TIQAf_v`BC%S#^2;KEadAi;3bMhZ=9n7j^D%HhYl3gyyy<+^p#}IH+p>p4I>>- zw{&}XL?ScctP8us^h=)3WUiI)AbUe~H~o+&(hV9zDQ<)?dmhg;tZSyNkSKf!btpCc zm31j1>wLBpRv`YAS8^1dobY9?6!C7|e{PfB>sVKWPadRukA#v!b(vRHhXx<1k}NVz zA&n@DOMSSa1CaEZr1Qc9y0`qCHF0z6pl^ZoF$ia4Lg4a`fI&`~0(aoLagn+LQRlq|N5^ zAo?@Ty_40YcT(~JErnoFdR*_*r;T>$0D)ulk34{L2mpz=&?+f^;>O=4ZRfvdPTZ#M zx~)lhvVJ4yn>s?eeeZjjL=Y<9{s&aT4?=5{ZP?qoUOTkK1S_$(jNz z*h0Td6Ql>gJg;ZuO-W6E2>{ur0Ok9R5*P^K&cZ-$X5avZT%h=U!L(!^9B-Jyhlz~s zj9V8rTdqPRthzZZx1Lg6)q<1a1_o5keeHD;K_r_i!DZ5-6g0+b0Q$R*b|>%Z>HMFT zUP}nh?9$2{7&Z-IJ2+%5cq_Hl;YtTzhIJKRG7Qe5N3Q_~%5no`Jsq7tz})-WD7O9m z1A&SYcZZZ4FE5lR#{yqqy*2uG&M%%XD>_(xw_5yI*1|4wb;yuWmVlRmS0?QP++|gB zKYxLG@PAH&(tK)a1R7t+O?NXfhvdf*9}gpO7D`)n|5rxvc=^t{UL!E`&pX(Tml8^17>keUn3>qx z_9L=9pXlpN>w0}2baie1xNG~4aEF#*Qx>e4uAb8tATslC7%o9xQ!$=jE_X*CVQ(cj zt}IhkSE-cMl?pfKZDh11MfN=`+faqx>Zx1Ou+!y=nyU5fY>MsY@k@|BGrB%#I&fMy zf7hQMyJvp?-Xrgd)H@t_M6Yz)-%q=y{(RZqbke$g)YT?gIsND76uQQ)aAI{;TV0Te z@t9P)qS(&4Bf{aTRn|ste}4HEdCt|Ps-evg+l9%YLdZI~68eRYJi;uE+=( zy^}oQq7v`}YQUPoHF>1bgKy<2UAm3$u`IoWwkzme$12f8jI200yT!cXn)Vf@plwr% z-BhJX%=S6ry14`6?As!${;kAcOG{^H#qcJ>TwY;4qze*QhNm77#{DRX9CcvsvmK>v zXHOd}i_?jQ0%(1K`;y*ys0JjN1KW}kq$CXAMaKJE)9GT8$L0*PTpikq$arjiTgC9c z0MXNIIk91iyVMQ8uU zLx2A$raTpYXSZbU+t<*ba!q?oSJJLW2WS#E{5i8%_eRN_EOSx@h0EWSdPq0Yde526 zMsj0FOZ@-%8sBdjQ?B9TMqw}+!xpW2vVoOo$3vn|?*Dyxxe6SAQ39 zr}o=50!rC%N7bOy()6@2%<7C^)zpoujsV|rSO3JAl$Z*CT{W0^43YrJ_Mn~?;Q2Aj zd3Dkz=BEy?I7rBkCljCkJEYP;yF5|ucJ(;9gp94ebyloA9_F{nrbSsP7Au+WbZ)t^ ze9qsp)l0SXl?>D$-RZT}Gb)M87O3hX+x)fy_TH-_BOCf2@VMIzlF*J$*=Zt8L!(BR zTETTx2nyZ7gQhq1?GWmDTs`;EhQ85}V+55CSXm@0=3d%KPU~pyaU2D~hiJ(>hp_C2 zqSERdTekq`t%i}cCBccsRay4VLGDNNIGk-8UXIXnAFZ-=7uLeIlanMi33PpWqwGzZGc^&=nRnea|NaiXT#nC$KguRg@; zFjIWnUqNM&XRbUl%s3GJK&>n3u{D$lGy7*ta5~oM@T^4#>P+7MLU#X4uda)UYWq6k zz3wU|dWDqT;HmmB;tp0I3qB5^%}2CY9sWZ~qv}cWPqOz#awYkt zVfMKTxtqb&36J<(y-k6*{Go|<^2nP?XLx;d4Oo1rBJAW;$YLuQ?P3oWpZMX9ftu~R*EY_5 z>qxKAn}=;AoSJlH)-f#}#G4B4{I$Hh2uEFMx!joWsF~ooB)hs%I&KH;M`>RX{u zppQp9s+yUpG8&cB;`Wa`y;aBL<&N%mu$7#ct}8v{IlaZZ5 z=Zq!ATK!0?TvF(_71yry!WnJoSz3fFUExbel3UtEw-Cd>$K)?;JKtu#>kZqP{YrS_#AOR!cJRfQ$C&JWVVDMyly zLYXAKMK@e#{8`quROGJhxW@|h21{q&-^sT-qBk4wAa}2+LTLUe`D=yE%`~!&m;dQp z^Rse1!g_VVt8}YVd}~=Kb&KS0C0xZ>O05*hZ^(wj(LXfpj?Ltv2gj zo8?Ha&UZ5`5o>v?l+mGht-Qj4$}B;K*S85};;G9chJ`QG=>2rtb9JnpBl?`eIEl08 z=F8#vJ7>(744v9t$Nn5!hks;X6vl6}u0eqaY>4|9XCt>DZ~Z{tULNz&c1aGSL$$ev z65-Dm;A_w05pn{E{A-9!a0?dI)PUjhOP!6*ZEg-q_%@``%^}1Idxd&YNmfpta)EM1 z&RUkbaOAbpSEY9-TX`D!9r>%W4Jryw`9t|r#SViZe<6Rv*rQ|A?vR9|{=&j7ajm`3 z9#wZr`#owb!W-}fozU3pz0hm`9__JPUUN*ob?Iu32|rp z;kgF3`_32QV@_zB`;`4u!hd$xDOa20WWvcA?On%R#~mt3*&W9n#uA)vzN8Pqkp@@8H+}ttZw5(A?hRnQ>%D5kf1xQip0-5#VERy0HuB#4XRgf zb-G*_%N++ublNIM#GVdz$~vmkTjRb=*K(NNEugEZdHhGvZ3=6HEjCLRzdeFE0oX)7 zxkqdEzTys>VMG}2Y&qaOYTX-Em=toaod7orjI7}FYP7j3?FLS4rMtiskCPWEIKdHW zkTR6eV&dsj%fKEjVTzk`^Y7?1WFRaVrU76Cf;a{N8y;#fUq(YJxDqy{6sL(Qzgr|< zTp)2LI~YSUY(&;c()klTBjOkFI^I@rEht}`=}2MBxg?|{J$Jt&7HtMYDna2fN{boQ zP`M?VbKqnur#jT(B?*1#y6e$2szFjX?!3eW28EfE_{ z5Z5feEJ4dm=;L*?TbY`i`5n))QA#!1CwiHc51K$u)Sb^-%!#K(M9x5?C{R{pY?G{9 zI8Ny%ES#_@NnN&NtLCIm^Zw7?Sr#}eyUL#GU%Li(pajnQ?EiJ*rHbr0*CYGnEAue| zWbHU}Hi41@^`6J98-3-YuMD5!(ezb$i}Ge;kinU_E6UXSAt{Z>rnBBLo3|CdTj#P) z>#+3d*L^d`u1QC%+jU)z+jxH7UWLk(m^2EVnVWHB>E@UNxLY1Rlq`Gft}!F=UNfri zNks3P>pkmn2PCm2@}SA3!t**oDuLcZX9^2a$-%@x43$EZhDiO6m_Xzq9#n4qn-$u3 zwrt|f%dPMg*kK41v0d)X^U18T!x8iYdNmW93$@Z1@d$f*-xkI3G13H5CV-D@o?KVa zpOpJ&g7BCCl0`|`k#s4C9-;_@IFM4PRB$Q-SxuYTi}&+2B-&RZr>_BEkOW6iu0HSQT6zh@E+HVE_|mVKdIxxk8`>1o!DGj-sSrnCDQ&I zXOi=DGG0uOBRfl;Fg`o7AH&WekdqSmQ&UOR$NU5#A+Oa3NQXY4Q`HpCe7r)w&$Y$1 z9#KxO2rMM47A#8d%Paw{pLz3Pjy^%6@B;TDR0rTw=z~q2&(;o0mcIVc?FS;mN$jhL zoGYn2JEhaS=%ril>EShyttwvSo-rYb-8%qn$t^8EcVb>;nW95!=uZ`UuXQ+NQ_LD#8ldFQlyV_ z8HXb>1RRuE-_{gBurj>nfll`}UR0XDDRo=S6+Sd5ZX@FnDtDj4vPxo}(%t{AB*>(d z)E=s3(*NbiN^unI%{*&L$8QE%m_qn0VNpTH{VTY6%{GUaZg zuKcylw5TpaOh234XZoLP(=yv!^^_y0E?1bU@>yW%9UfOlfx$jY+qzNL&<0zYOH9myL{1h`)?iN&`dd|p}^n! z7iWqFt?}fCgs5W3CA=oLvS`R4-gv;)OrWhPdkYsRW^eYJf9z13NEw#vp2vP{7nYM9 z@z^+`AT4w1v@^RXAqyE^1G zVw`VIzDvSXlD}vkciQLJQ687Z7k>%5uqox8f!!zyy=j=owihOFIgy-@n4H}nMx$i+ zNr1riQ}Ca9vDMU~rRM_Hb#a>)6=&YvwCPqv(OUE-VECHS0RM1( zorRg7`C$_of#;R$EI$ml@aH&?&=3{}=9!!PONO3bm9Moo%xB_11kiGu5mzo%(E(|W*UN~m%89UW)1r-Q6OpSdONsqpjp2Ot(n^TqzQUf6`KywCiL*z>t6&C{%i zl^o^l9z^GW2ADjOt;6+-B{T(sGCl4f9rw~S+mk;$^ z{DUY6{rJd1(1Yq-c<;e!@mgz;u;U~(pzH-z+=z%j16r!JPW}TrHQZXizX1Y6<^?BO z>fEHteIFEep{Lq@NJZn`0j*X}C-YA_sZz!L7^r+oC9Dz@*r6B#%+y0JUf{XM+K%O5 z%i3qnkSH@DwvS;Aj9W0tm<|xay8t7gsAFAfq1ziNn1Nst8}HI`b4nqlDr&X`5))(f z2xedul)Z1uE9MQZ@9iBK85=uoc&NO%c>jSQwHz`$bH)`l)%uP=gGf}ueTlDLjo?s$ z$T}5ud;K1)P$#w5?b-M*wYsf7Jq>*bN=t96o0S<2VG8A`>R3+Zx-H=ZzDv3TI}~_K zKtLVAwuzKs9gFZR1mcOv5vZ!nbzL3Lx~ZL2ELrwDN$p|S%de~@7J19UTnUIAz$3Xb zBA{fs!4ZjJMc%bOP?dhKKW@dKc3pQ`#P7^m*Q^50?~bvs@PM~rDTwCYGo3SZGSKnk z?+^E_RQ~`_rlfhpY%0L9PhA9Y0^}0ZSl-pTiU5kN?3J{ed?992iu_-l6d{b!&^W!t97dh zt7nGy_wxIp0OCNv9gF-c`XYb@lTt1dK~s=an=7sdI8z6JnXxl+3Q#O@-IZ2egk}Z0 z0NvAKnfBV9U1WS~unHP@bWsc3!=yc;6FTAu1aU(z(Z1hH`ZnY_K+X}&rnLV!+k=fM zuj4ibZPja!&x;?05_)@ycKx-r#X}Mc>+MGqt@D(qX?TwE6ZjpAfQr9ybd8y6PZFl%4DfeL*&Dg(7b!f@w@i zj2)gy4>kF`dEl4hKLCM*hk<;r)>UOKhti_VXkzQIEM2{_TZJ zSRGrEJGS)UgfvCVXd%c#L9NT*Y8S5)TFE?oI%csOp`rtcAC`KWJiqwjRGUIa5yKXTRWOv{SP zW~}#b%gqQ$4{p!(NZ1vb%^hjkaaCt$>W$?o(}$)MX&&`08eyybb!p7YG%R6zo*-_% zStPKyoB2rXYf2eo)Xqu>0XRU3bTL7ad5`M*r8uKfQO+qS=MBMea{fHE!s)9gRK)+3 zGEr4UzVlRwsD~847orT*s|ud!(keteAq12X;-#2i@|3Fuxm}VlUf-fCJ;$r{s!4na zUcM4f{b6{cyC;|9iA2y;QxZ}&f_wc(a05#XI2<80k7E^_AxkZi3@j^aVRxL^>^7Ob_S6Y5u&tBC9%x@o1b>UV_z88v6zBou;Epp^(tqoxe1)JWq zLX6^&05_3NIkO?P_-9EVGV6l`X-`5QxvUGiDtpMPA-yKLM%)l{sKHaApYP%5ZFJKr zR>ta)V`zM}lFFitCJ;qEqpd{*mMenOLQ0?}Q6evK!eo)(=gmy#4Aj$-=1%U@W5BBMycfgJo z<+z#TBC6zRsx;upeL|I~S2LO4tnTCPTW>U3X1UBFiyi*b(lapwM1ODEl)b=m!Cgax zs)TUQyg_+vu%c_pH&Y-?uFYz}stxr(**^XGbNVI!@#-+!DRmLGLAoH_IsJ$&UV9oN zc=#`&-lj}j7GUBqFRhj+iQGTJs9DV^hS-~73XFG2d*ZER&16FeF|U=j+1>c<+K}2u z@Qh@I5^9OOJeK2t@fz}^Qm^YU@G50lL$OYCNhp3UmL))Y2Dz9MFs%#?Dv?0Jg6 zV$n;z&Aa&yk);Mi$il9-nupzPd` zE|_1o6$aDR|F39^B74{v`DgM++YxH6-RBhHc@PHS!WFHDJ0Vz%JBr2|gZvgl3P`Au zDrfd`Es*{@GD$nKf$(JG`c#tFSn9+j5?tM87gVhG2bG)0no@J1-);F2$1UzJERG$^ z!aG&4y;ZW?-}$i+#C9!vg{PA}m2OW7If4M4@@s$}5mm11m5`mP?&6aY9t7@-65;LE02$&Il8gBz;kB!3emQ*ocX3=7?L3q^K^<&Wvva# zUN?1o&rq%0|9-~Q#t=VNTzFlgZ$^f1XC|I^HBYD3 zZ|f{GmD{RpOjP}!*2A^j8HP@71^HEAdZ%1e7tT#@_oYT_{jk zoYC=^^mrvQin?FQ<(`=5GG{>kMZlkz$!CV7NNT&wbm>j)`wods5$ZPfMozvB+hbn3 z$_4P*vb^oB@?(+J>#Tn*O5jA)U&jS5EAgRBQEY)vkpl?AWaR*0b(6cNAG|xM;nt>A z{bKECm@DWJeNT{G=H|2U?!oXA4%&&swIR$Ie`08u3B~;4AJYaBj>ma2FZLvTEi?nZ zt&lAOf%g)qqT3vOmf#tDkbYdp&o6E1+KA7wzyu&(gd{Qpp3RivH6z^TzQ9}$flyq6 zYgn_i4vfEaculM+#+4LLYzDw7UielyW-I#?baRbryb;>S%auyJsS~XD3||t4~R3@K@<}WEJcd zjW53+n)c0Z-w?3!@hQ;xFr@qIP$O6}Klwt(hO-f=DT_4=G?taDB ziL0FtwWGmVSeAtY#6csIUoe6elBkN7YK0{o7b8l^^Eh9nyqRV$=kLVG;VsUJUdArq z)+Y*#WOc#*?BavacnB;#a{um}vLlgYv6Hr?f$}OrTFuJcg~bzFQz~l=q4l-I?6iRN z=txez1Q%4YvL*RNorE2g7WsCJL4xMUV~SGWS(G+_;s9jp%)6^u+_C|s02>sC4g&o2 z%I|?6ij7Am2mcvk1Bg81^lzS*kS5}6^LKTOy+2GyT9mVtZk&y)O({e#^HrR2*0MXl z8}__A>JJ4CkL-_(?hL%f_GccAx3dwOxZNoM%F*4Ts-LBd|GBq$4tIQBeq`Tl1Fse) z$-Y42ook7pXevXu7dHH!|z2d*cX8Ip# z{kDk+QwQJGz|@gMRJxTHo|TnN72+7l0D(^>NgMu;YJ1l~a zd+L1`ge=mW+&!(obC2F`jEOzRx=%?v_9TC*?$U7b?ZPK%CTolz+&8Y-`n^Xk?)I?~ z=KYPj58d|7bo2leFzOp}1-0l6CmpT)Vq7_cs&apk+wKi)XKGK}+AVSn-2Rem@dINL z#q5j2H)&&SE7Ktrt3;Pw)%1zZVKF_?q&0DYi);pejt{L4Z139!)uW>&5tWg&8q$&d zYQzag_heKG!Vh)=FQfGN3H690_Uw-zsl86#zSUmA40w~A>_VB_ic2YEP&jVFGdTLc!J;94=7^~+UF+< zNCIV!sC4bz6>ob|mVG2|MHFKDu|Ju^*%g7ytnQ;hp$~Z#vu4}=nz2JK&Yzrn-PW^p zH+tlfj~$O1lh9a4wsxVi)&APsEmuCjxvgJ*nQPCZl*sXqh?JD>zp8fba>$!$f+iua zDk*`p2pw`s_3YAOK;`VJmL*L!(4BLWAx@jU>pj&oXv8I8fgM#d2C|Ni^?6o&433TD zaEK2G(`zg?uGZD9id`#v6ZZ7RMb4L8z!TJ7+0z8d)&qHN+mtRU9Z`CfO;5A))xZDg z5Jc}0?%gNsRF(fzT%s_TS5+r9`;@*qnIqw7&V@l0CCWuwx5}I~Vzttos}wd(F8f|_ z=hf}gw%S2n@nfyOw5crG$6I zp%;9$_}WhPcK~EzdnHly31gpm*wJT^{Zg}@pq#})IePD)ShWX2PM&-<`Pq@P5rmcNLB753es^X2f~1W|_^o1I&Auz<&NSHfmi1H{v*L*{8t1yQ(X;9&T25C| zsAdqu9a^S%sgey+x6K}}eIAnt%=gsI9;-#y+M;z{!1t|v+YOnluowS5*1R+1u|q-Z zY(re*qbEfU&Z#NaE{kF=E&9jzM?(Cx?wr_!^6p4Md|E|^d5p`g(|Peo=iEB~4ErRF zh7%`>ScUd>AIUQ&yLs~hR#8eXxw-$ENnYvG#oGz$Cp22`|5;lZeLnoelWrEDoY?Ec z(XHkg#iMrUtNv7PXIFaLyts14F>4KdP-E~eX8OgQ>Gl%) zOhDwfUV|;&&^PdKYJ_j8vAdjd&7|=9MB=uz3vh5tbn=1119BAlk5zrjBxh|(bdW(% zgS5kTt=-EE9B30N*|O!$n=SXX{aVm=CdFh(t7?2Sw@}6oIiU0VvEDyjU4ME7cN-Yn z?gAhY0DuS@cliIKOq<~k2bjRxdd(nuz=i1^xS-IfA=UUU1uG{kdYoc7`|b#Xrw=OM zt|W`z>W0p0&W0?4wKwWwL*|76731rYZ=NsO_g%q7tY|A9x)Qe|P)@2D$T|%l(#JfX zMB-BrUsE&?I}Xm)Oh+HAu9@BMv+P!1{UJxQsW_L2%A6&z_W~WQXK`JycUZaH!W$S8 zTzU&#h(ecFu=@;$&b!xo{p?gz`F5c6Y}3l{@X8Q{hE}*MBl?Qrp`5C-G8-wq!WLcaLM{2QQ?{dvP@$dI>&A3HC%GgKa ztTc_@6Pv%q*5q>Gt1sfz4Kot5m6GO^s4?rjQ(CK~6i zdwsMs1Mz*Gz4wgQ^`ae?U{VKF1Lt|CtO#jtqE;LlZe@7ico^8PsAKnrVR7J4wd7P6D5A~O2YX{c0+BVIFD-`b~(KTMT)m)-DY;4N7F!3bYEvH=O zw8lx8O++`GPZry{(&MdiRr(Cd6gpAbgPSotJJJa)tC;IL7~y*Bulimk@o|v6LcUr{ zicv)C=*D{m(wCNa$8TjNv?_26*A5mpe6=lfJYL;+*rU*5RQ~NMZVZ*>ea_pNZ_vui zp4TYz-2v~kvV*4t*Vd0agHj&rli=;pMSiD$>gx*yz$ZS@6+m89wm$!o-B&dWfWRd) zBUp(w^adi|w&%FD=xuj@46e86BP{5DEU`oNIO&#!omY;}Pd&uD;)WR9NcS5z>*GDn zw#CdEIxEo);gg;yPUWmT&BAUXT|3#V;Y11w3M+?AeFU{xVAkgs2kg)2)5z)!Pu0FclNz#B-?$EVx zRIcV37GXCe?rjqKeH@89VZ*=wZEG&XG}9j3=QpbHwgb3Jblr=TLi>CC5Z=!p^Pag{ zJ)@C-`z!cKp%?n5;pCV1cl7<~lW$I`F0YVM@gi%kPc>+=ycJ=&y+f5tkT4rhuZsO2 zP^%<_FS~nj%XM4964t<9X6s)fE|7QRc_i#ODI#xJh&waDG+HO*@{^)RCZ4SHZ`tfM z8=&%M$gBxl3p|iOUUic2NB0~0l+0H!Ij%(Fu`Z}fizb5rLM1#qf zAN<)s3GuptNw~=3G(7BVoI@h*V86&V=lrF?-ZvJ|iz@iPDW%5_Z0mX&NDg0$dQFsz0rFIT#po}Z_E^|Zy){2{g*c?4<954(@xJKZV&hT28|^%(^pbnZIM$^O~b&S73B9a06;F7-`6OMF4A)GeU>Yu5D5g*Vf-5?5YJ1dp zePd7h?(6*{Rv@AV`yI@sDV;hD&+cZRo~S6pz4B2W>hK^O^v8hSDyhm_!_~E)lC0r= z#4TWG_`oqKI=_g+1%}d@oEW#lZVx~$$j;q?+9y6^6DYEu@$b(*ET*ZkkyS8`E>WNE zuYc~_FN~yfRVub?qTZ2GF(xKEdz?Kyq#g-T0i_nTkYvM!QWY2_q?H||u~M%Iz@)v! z;-^MHA`*$t_7w<*Gp=CAKV9D zzVQDa3?B2({|te`TO+C0$IRgnyjljg?%FTFgb+DcO-7xl+lPA+;KAHC^8OwI$eEC_ zoZ6}6^v~iOw=0STXoj=H!~b(cW+5Rj*Tvd-#@P#d+_?16J@xKqFg%GB%&8}^@X zR`WtFMQJ$6w>hlP$ud00$Wwk!2}|3l#BkFmhr@!PhX;TvkrmdQ)^}r9M&I^hryi)D zOFzO|K}rzW#=50&H`KSh^I{;;X@~gs%S%ksU|q-SXUUFmBy1^%ar_IpqQSA!jaIQj zAErZ(Dr4_}{7bKCa(aIuku&JphqfHHvwSe)-$t{F4Pf*KTAM-ynNePz_IiCHA=Rl( zkFNM~A`8D;-WgJ|j2iEez)e5x$M6q^xF8d~A2*il3*iZeWK3inNGn*=>GxD{ox8U6 zmmfQwjNiLgwa?GnGmnOAK5F`>S6!f6_XPp^(SnyzRDSpeH#xOMojjXz1(lI$@uwi6p;$ww{h(GIasiWY zPNqh$6O~Kvd^tH$Q0JKT8e(BB{eB806#|h*7H(LOfIm86E^q;6E*~BO3n9X;L*ZtK z0EFL!S`Q@o-0y(;z84DW;nv-rT-b?fwzR8_a(2>Un=$(2z(zC+3ME1y5C|W+LJeyo zy>hZF9VDmpB<#ukT!}YJm8~`2bNBOZU&IW)(JS@!v7;4swY{exitI@gyIAUmMv+dfhbcfG*UTOs)P+I(p#t@!OC)kW`bXDpV+m32 zQe6$9zg=Zq6+<8pcMx9c%DT+}@R6RcS2o_NeM~}p`RLNInW(ciG4q{L3=Oo=aBe-4 zhYTGIVi1%aK0s>*v;G!Dwo=#E#*9J?z&vE@7DUWXOP%N5XL?HOGKFn#1;5>TO>PB6 z=Y2&>N5EH<oBbrabh`Y z3qxPPeo*Rf*7fjVt(nSzz%lTYK4RCYijmXYY1Vdz|C=^58FgO>oXI<8Y90f)FEJ;1 zuo*eGL^zva(I5q_x^62LE?U6y7-n(*xjw;K4$Q;zRFIk$&Y#Y#1od+^r|Rj;8V%R( zAMK!bqgD(btUxLF!RiQs_TYCHF{ly#yR%@@XzvLFrhHm=vXG0ahWAyo|7r8L4<2Ez ze|z{{=d%7Hs+SNo3y4_vAg@jLp+s0_Y{_c^VWW_Ex60Z2C$Kp-5+SFwF}5mTn4YdOpVi8d2WxACwK?(wTJ7cuFiuCig@(&A zgEey5VNpsJ3l760&i#KYjuu+MEUHha>Cb5GPYvig`Wn_)6$d?Fr%%7;Fo?knjuhXE z92|_iS3L4g9n3qx%6nV0z8;+X9Mfem#a_2Z=g7|8tiUaM3_89h9Nd=mR-qOdPaZvV zU54|#wa3x+G{%ohMtw0+tXBb0%6Z}wKu@K9YxnV{Tkk7@xnrLZ3`btN%croh%9}h$fRAg3r~5fEUv2F?ew`DbVpE%N4HtN`|X z@7sX+?i$ArIa94w60cVPfgw-I8luvbr0HO2z`8%1FPJ@_r1J_O@NdWYBKMgZ29G*8 zg7`r;0#-}LBc_p9t{=9DpovLw^l^_%g^umqc`VVmgF0SNL3I#*-`(pn%^z zi(q7tnQSt3*xDWcb`3V2HDc2J3z^5Qt+0Vh)Ax4k{O!>ek8cZzfQqim4V`ZjqnQdx z(U7G$5Q^v!FpB8NO^p2c?FoNVf63Sv5>6lX`~{ZOCQI)--3 zMF?UJO4^h4Fp!i>B9LI@M}JzM(bsOF*+^DaN~^NI7L!8ku06qi~X2%kd{V?eTHWTz%dFj>j}T?yx{aH-F$- z!1EKCceWN;HRa}>-su}K6gHFpzSEe^>d=ybAhaqe1GDJtfb)8{M;7W+JOM67IU?ua zLt)M#dW5c{id(*Z#ZW$)lHIgp1CiKTLjR9q%rtBs5W zfodp9m9*8I8?rixaawOBIU*p86`#rCgU{hKX~5E zfLHS{O)aaXH_{p(*qNT9?nrW0s4@z-krW+C>a^}W```%c;^ru~+~&Cz2JH`=4K;On zcWOd(h0Fit9Et`(k+84Uk8c+bhV@)!8#7tqj{3DsT<*%cYiuKP|8vmGf0Pc(ugn`1 zM-vX{V*f8|=Fr4KS}>OKauv=*xoCw%*cx#;;r>_a^PkdsvqK$>9XKFBtjQAq(?b{P z1vHU_w&I-e6^br5qrz32dtawq(GY--UwtDXe0r29F*3MMhmW1F1iG{Q~9EjEcD;1^ddH6j{7%L#klChR8DOCnXZb_w0aTTWQ>@HiwDn zXiP?u3auGPPhGwKgofVdqYaHs6`kSkBHP?m?b0!yP~g=H4_grO9=VMrfBomA;m43jr2Z+86zdY~WEfX1T?JdSS5b7@3(9@(KUv&Ewa!}^=C z@YNGDZC5VIdon8r*r%-S%XE?#V(@^K#Y&xm1eRmh3j`wSy~_nT3&qaEkycKV6N+Hs-MIds`6X-C(Is)myLbJty^QX0>P7dsg$8M5?956AuVueKNd@&q@_h!q62|?-?G{EKJ8TgR<=lmw&r=_zjry990o;ft^oeJW!XNQp~8D2yN6oL*2$1klFP$Ib8h(%=6y$c^E z9SBn+mem4qOQ6W_fJ7dc+W|!Uqze1UnhX5!>KaXmIYQROG)Lhc^JPHsW{!T|yE_A6 zez#XoYYNvxOabWejv!Qq=aqb*JC@yc=qcimvtdXUlD7<&z`5{xu03pdPWlw0Q(pS( z2H$u`hv}~{7^($k-^O?$Ww-;zxGtJGm8QVrTqp_$|0r&6L1|CjK($AN!?Ap4JMQH@8Aa9@G|DGS zJp4edx_k(Wm^5C1aS43oT;+fJhE^3H;_VxsF>s&{C0oWLQ`GO^BkV@$i~8dC&)6ff zs4b>Lq)GAG% zCM>7Si{DTetjkQUS>fL#IPk!rKK9ZN(LMOWTgTRS+&l&<2}2lu&Ljd{n5CXs$yqo5 zn^z=R;gf%{tX`0uapFcLMTOSc*Fn=1R}->PsT4QLd)4sht&fTkWD3zq%%hh)4} zR8UUkko^dEVzQ6B)SQD|9+UZIf7 zZ%2H-o#7)_Duaqe{pm=d2+@aDcwKEI@7mRmkxNQV&kr<4EvuIpZ&B+*8=b1Q+A`6{ z?Xw2DGjT72RG(eFDe)Z^JT@+BcyGTid_zHArdwk|>N2V0d_f7hdvAZxF|CzLd+`P` zK^0(6t?>*SMmW2|JEzqrAij$^5(E;)fIwnW!(Hx_qsq6@aV%EaZx^3DD)5r}_-wrq zUXg+bjRt zs}9U9vKC{UYi=(3%kOp>mLxwqi|>i1f$!Xx-^IZGV#j;m6U||I1Henb!|L9nWSK{6 zc~;i8yupR1TKTWdr8>9FCt8jbb7z|_0=ofETo*4Z-)Z|UgrzlV%04Kejtf14|32~v z%XS_L+w^xmH(Y}>z8~4(--vnf`hF?c$#EG@O928G0&}Tze)2hgJfheOYYm*>w|is( zhNj=vZ~4QXJD;`3TIh|0umt8o#8Qbgr*?9~txe5=meI2L63T#{my0IyUp}>PJYifW z5ZzK1^IvhFzs+wAKv*JBT~t-xFnPb|zIGYlcC-t3*6RJGbjn@jRn?ak?P=c&hddQS z)8g@Iu6R9TF?KgOiYR9J3hYhlYxCNKI+G{bstUVF>WU1N2KQimdCmwqMD4t$@imfe zj__3uI=VwEFFrX{$3`e4Wl5BLl}jPI+TqZWlWZ`kq%$_L*>1;7N0((PHcn*?FUyP? z?bMFf#j0v*)tcjX`n0X{W%b23a(vN(kl=)r_nW*Tlp6uNXgF)(=TFq0c zLvjk%ltSZ4o3d_nhuYSDwJpsfTH{u`f4kbqcKX&G8%(mSLIE3c`KKZ|#g{dn*uy#C z9)LJj2EOXJc&rC#>R)7D%Q};Mcx_h!D4(}}tKSX!P3n1pE2SwT5+%xlwV5Av{i=nX zf_~nwz83q3(TR&HxAdg9#Y+>Tlvs{~ukSqg&(UYA`!@i5U=V=K+SYm!u*OI*l^nFs zX=_=SJu=4@7UbdY`{iy8U;Ec}|5(5NM^{$TxsHyrfmvNIOFT;MRAg=zow&GJv+d^f zN=-IE;OBDPjhq|vPWxhNzVFjS9XPdoAkD%jgERm(*b+=Y{vkc#Nu?AQb$@#5Z4R2s zkY2spNmV+O5P<2JWdDuB-HZ}p4nJWsXaX;gu*7NZdBr=}*KP(;x{3JbZy?z3kdr8j z{(-f3BUf<-_~!{pVJD6ygusKR@**+z#_9 zUupR8uaaG&#iBsBkip|rei7U`8GFp^9aXe&t^7^>*;pOdkf8-?`ozgo>6@unIy&#s zKvoo!R@uIQMiy^b`(7xJK9Pg5Ifgw}#EUkT$JQsde_T;h7pswSZdX`o zBSt(hd087`3w@5%ml>7RcLn^BBO^zV(9mOrW?HmyHMOy3adL2Lc{&>mzfYG}-gIUR zvQ(uPmV|mCv`7+D_a;#4$`4*Z79Nbok%`0Y9Sy^dOFK>k@$5R(jS-`_ET71?$G^1j z#hG8oLeZ3y!I zIr!2KKxMG`e%y50jm)j5zrxdGk|6RbETSD?hO(x>^k(_Cb8uRYT*DnIqva{A%}LW! z%?zE2exenF<@3*R@AmFSnk+t(IaEI3HZ91nt3`wm?IQ@KIu4F2GPNIFgW1w-^5Tjr zzliSakOP*e2+4~lXJqpP?xT`+QJ^t(OKNuLq7nQ`U_{~f^uX0Vf+JtzdIy!v3*TE2yxCq+3 zmx2?LZ@vO7E!oLXgADFuhj0Py?`ao@9K$>RJRZX#?8>k$SNF?|r3xP5aU*ScE6enB zWo2B_tEVq_xcR+Q;G}N9c<1B3U&`F5BT65Q(LlpRp!gFOz}T3DZOMUSZxE8V`)k*N z1pVct^9@hQl-|Lh@LZ@r5e~>B@eQk=Zv)hL&FJlozmJ^-vaz?bkE?{3W4|B?9Wl#rhXOZA@F^c##c(~_f3A^44sA8$3F=Yvq)2`RJ&I76~~@H!P<-0mJstYKMk^W z-sKgB0TZBoVR*UQdEOeOoXp@X?j7Q1#^VJ=N6~R*JeikR;1#*8w0Kj3_tfuvYGkcg zlALYL&ie#>9tu!z{eYXNOosb&YI;j2*As}Sbr*4<{#7@5yMvCd+RmfXXPZ>?LQ~cW z43IOF(h6MlNq0h_;<>zwepxd2Xo4-M9|&lgk_ExSSZyl2d&6@uXGa3mru04xOC7_2 zeTxNLP5zdtLmE+qnSt>7%*McATI{_ggapmw$ba4 z)47KnvtHpDgRN8Gd6DmD&VU@!V-#;qkolx`T~Nfvh6ST*^iw;4i!0=K2GrR(yB425 zx1z7lCDO16g5L&2!UyWzO^JT`w>I_7nVv$&xDn16db~&w(;2%dxz5GWS!@?W+l%RL z3d>o2*5&Tx_q9OdM5w!~h?hpmOUgYmi z>Vw5{pBc#t(lo#3iIUn=PL(2~eA%106>GSzBJ4=nWSQ33(9U#p+#cGAG;K6Cc${!w zp!zL!oX6YK? zPhI&O*L7gLVKK|yzjQ0m;&LnK;Ar(MF>(?R5;318I+O4Ld6FyC$%e^z+pvXz{l~9jfQxHf$)q$Ogb2+$5*WC2&13Btc zb|lHGdOF1yW+UPX`?*(dB8OU(XM|dJ_Tb4nu{2yl-EaSin=LoZjtvhQzi(aj{?xA2 z*VWyZZK&l1(=@1>ty>FcK=r+|ygG0RWE?!6kGnY(sWxIc3{F3!r2vugB~K?sq}csb z*>s$l@E7}ykdc*@i7ikw)1dHV851~GR7?paz>g7f2uen=i2HLeyl+Me;22Ebi^j89XnvHWgModvFZwFxteCyK_{Pfc`AnRn$l{Z&4W~^yrjq~P04i4Zpid?a^vu2|4`97BKQtU=SAMAT@hYg!+U8x>1a5l(k z(q}(LUBdg{{}lW_cLmPA9Z(({PJO5ffHP+-XyQbV#q3g zT;LT1k;*N|TQC}{og&qHOz}EtP5mBAdbb~5M<8m&Gg_RNN?QpvQB7oRPq!G@8=J>B z8VMwEe~f5`3lqY{!Q7CL**EZwt*40;t%UYAGeSk~8_lQ|*+?I{(Im zM6Iwe%GQCFR)G>y@jLRz)B3 zs#dSsj8h|R7nSjZdgw`zOOz|qmmt4pks!F_i1;7XUbJ0Cz(oD zbOuVKkK|Bnk6Kha)c7r81k~>!B zER=eoTxlpY+10w!Bfp91QnDKHMfQA@lk!iHeX7{aKbI{xi%wg_XiI~7R5UWI*rr`y z^!fLsU!velyQi>BR}f)mg6~7VNUHx5Cl^>S*vrI`Z<0SPWEZ9&R|YV50^yR%glz0C zj^_?F*>#p(F`47~xliY!W(4pzl_dS-b`I^$h8ZYJC?-nae8$odxYcTT=i}WQ7mjw# zgHPv--!4z-8`0NNptNVs+m^UC1z+DSj!*7;(4E`?{$HGn|LQS+j9Ru$Q0Mt>bebJj zeHFCu_jeXCcIaMY8*LR0P}}X-l=Xj{ULfjIKh&6cNM6Gwm|=tRs{v=kVXMiX@6%dx zLr+l#>wYSMIwgGbo6<<=B7&|ga_(B{^Vooo`bkYEnk}vvDj;g377=`jAcR>i8tPZAUT~)gNk>lRbaFvK3 zWD?)4LaDVe;q?lv3x8skl7JoX=$CQQ5$dnY{d+OuLt=6)#YesFT(Z!;@3W#F*j9AdR6S@TTvC6kCu--xuKO z%(~|<I@d0!?Ze^g<`QT~8HQx3YR;=bu2MQm^$aQ*E}bi|yq7K?87K)e zIOR1`-F(r=sugj$^Ap%yeFiYZEoM{$$&hb1?k`=>>__`<5w)(jrLeMxqql7GaA1fgXZW_ zjvEU2!V#?mf)!f|A`)i0DSej9*3%r)yLVD@COY^44&(BZIhx9)@DVSl!MaX4p8KKq z`fH{%V$bXHe%>x*f>;tBe-NyB%F~m+M<(j^NpfhL1uyMtySiU9cTqyg`L1$AnkFsq z6g_0PLKn?PReWp!6$rgew@b@KNcI;?fa7)yDh+sN-vlFNb@|nwtz2Jv3>5G&e8d+0 zMCAq-v8Y+|q9y(P|LB1B`C^m}GWACf5Ja1!6V(gpsp~!%B}ww!q3$(WywZyIjim!W z92<}wiR&_v5hXwOdws{{;_Mwm=RE(ty!y3{ zO7313dtvL9vSs+|`jZOodR1h8n+I1VWOEFnPHv&PBLo z|3{e!zMSRyk!UU&*;xx-4>t=TA8X}|NUNAA>}1A@a7(gcyTggq!|Xi6)&Ako=o5S2 zUXOQo-+_dk%60*Z#ar~Lti@-T#T;J`U16m?8+_%l+iLiq_V+N3ZgWJrYDjU*$!)(2 z<)_E6eG}h?MP0}LQpqIG<`=jx|K^w2m{etqeH&7+1yp3E+52@f>Ge&c|1`!taDLo< z?Ry`q?!;wX3uJcBLmiO8CU-{@6GP)Jkq67jz-m(rI6PuXlqD)Mo#Yn{ChH^3JoTrG zN{>9^GkZ2n9r(P zVNJskC(vRmgm0vq83Mq~zJPen*TUaG+-9HenJyK%_2mtJdY=h$hfPnamJ?W$iA~csmYBI6DmDi%%vn=XSWpGJ$OI5;gcSJwdPv?1Bd?m)mrlW zJ$qNanNc{sn=d;)ub>`RBE8-p5O^f22~?p-NblrO5jkR>OJA>yzx33)aJQXOhx}y% zAT(BNCoiCnwv#i}>79@jCv4(F$c?~cRDW&gndWeF8Ks&EB9o7GLV`kfQjS*W)b-~v zA{NyEK`xZS&V+yB)1>beuI_yWiYqJKXzKy?}t9UZbjUEgSe|1tF`&$~7NYRvxz?25tbyRbAe27dHI>nK= zhFZv@J7UY@v$A8IIK8!;uFzE#&-hkIK)?Oi_omncEP)ih?^`@WT&zmKMw?T?<#o4U z0E8)}taVbxW+J)BL2Gbl_xbFzAvr)iZ3VB&Fx9X_9~Bil+GY$LJS= zu(5Qq>zQjyj)t^d=5&>>cV)U2e>0aOktkZ67U0 zzaM+qMdXXE-m{SRi^~!+B(O4a@kAOIV1Yw%G8S3NUieQ{ z@`=%UqY^ok@;kyO+gKB^0@B;C*l44)wZBY-*1Qa;46fTrGvSyB$(NFN(RSU!j=aC& zs@kBXkRq>@lPtu5@(S57qR9%?Y;QP_pGFKTOPJJ*b$G#`g0o5Lpng(K7L6wc3jJYE zWA0}1YjK`yIlTiswHaa`F{!pLv7c&OHR$c#KB35I#*r8{HOF<>-pm@HUn(9)gb)Xs z#151Dy*9Tqou2zX*1y)bliHDNv75X?7#8Q}CX<=cF^MlxPJYRL z-p&K{r<)xG@b8_zZd9^98(9sDS-EqmV61Mjgy?!Lw?{N4=>gDN{UaJDAK70tZ2{p5 zlnkJmk6~^j0Q_QM{ws;j60EQ7!~I=!pN;eDmxlL9lSupqM)~O5%<^qqBZ}TU5>iqk z^EYF-dmkjr4syM-(x8IJ>>X(~z%px4wL7VW#aO*`n;mmvcfSd%z?`X+%B-wS231>v z(KrLy%EF1C)|2f*5E z35$#~9)VjnVylbnQv7s3OXUi`B}S%VL!(I9^)G_4>bz0 z;Zt4&XL26;b3-Cs&%rH#+VWH+|IFIZt6OJVs}Xt1WQ|SF3I)v=1O12#J3fXC^gMC0 zmpv6?TBJm5Yhi(*-f+Zo2%wfnq>>3@0h^QXZa=F2ow?#!WWk+S@+?L|NjKAE8<$^| zLkfCH^7vpF7x&a36OtmKKNt5TLcQHU-^bSKx7K|$sy1u`od2T$QkJv0L!HFkrb>?h=_O48fmctYHQl!rtQL>13-$W5(BbyiJ}MoRrs*1IF91XV7YsfBa{aVl2s zx57pJzH2CNk3p4**K0Gw{VaQP^R_d?eA^{SWqYY-VH)tjNX6$lns%fag+BmciwTD; z{eVqUm4Mgr3)34~grHgkOhHM1NIlmK)DJ;NPEBY=^bL5fof%EdN2GAc*tSba|5 zd%Da_mCezJ-OR#}B5eCDOYKr|h*?#syewp!p-?V6K2h15S)NpCOho4^p0%JDK5iEh zx5E`Egfd;y$Z2-YWKQw6dL`Uh+8l`BJ0L5q7U=v+RZic}Zm1hu}UNe`mO z=LptzGSdq5EKUf?`+YG^;{mRZ>MEv&WAW2kl}mE-NCVt17>JK7Wgxm{we_u2<8t}k zhE3`2yO=e>c54;}iy6mEDa~O){1F{NO2EspIQ_)1BZPC>#dQK?im_j?!XC+>TvujUx`O zrP>n6kf(ZfC;SY5DVK1NYw{0LRH(j&?q7GP^!vy~O?pd-yJBaRdj5PM2kMk9%57Lq z8{48QQJxx3-?aAE)fi{#%_G-5f|VtP;dT|evh}ysUl}sn2)6>_4#d`5)A05UZPLX1 z02wc&ab>YE*| z00wzTjq#4xcwee33dNraE!<1rf#}rrLC>Ne*Hz+OPOl;ShcE&{W3yKE(nV^p6KB=` zRMYM@Oo1fB_Fum@?w?s^yJuO8^%W-k>^AFHd7i`>XSn}I49ca z=gHReK08-Pi5@6RFtZAuUM|6SAmr9D@_T~cKyi9ccIdqOV(_+7_q`0!Q~}bIJ)p&& zW{@X%7USX^sK)VIDH$%xZw&JAFK)XGZ*H5^hV7)=SIL`3%j>^td5j9#)xL!K>sfi& z?cYH2ZOjQlvHR&piRSs_6lh@}Fy1D3bWyLXRg>DSOkm@f2&XQ#-T~XVg*Xa+Hzzm> z(gA&X*`GJTi-N~5ukS-Mho#wx7!m1QlKQ3LjFDcuw^Q0VZ0*zsb4BrpU(-i{iRjxZ z4wO`zbg%Kr_q%?k8tX1bhjnJ%E;{f`!2~Od6BuwtlWYrt-E_9gK&;Y|FbP3`P{}?M z?*aFreO^3N5_5SLsoPEJFHiDa>%XbLV$8Z*TJ?HoymC7LVZcg7WTsE-x}QtvjkteE z)emmI$xS`a4?+LBe*!!~@gDlt&DDD1dMDe?TRB)09>_d7wn* z>B%%mKS|5ch9vpQtJwXuLJjOM2Z}vQpox06_V}qN{w1Hf;cu>$RMe=8G?PF*FVnZ< zlGv3(nC%)xH(B;wJMqlj{ebX1v|JYhFlX+7n zbOM7NWBYsG`uS@hqD#v^z^BId-Y#pPr(%W@#^g(|t?qMl-|B&F%?8!`c&j(aaz0d{ zGRmQ$2!<3KgmgVe;%z+tR>_L5{q2jsae_f=KcLhRe{PNxD2qyj1QLQAg#pu3`yOas zD@2DAgAQrzZLUC)(Avl_%KNLYno*aAk#w*|2=AMjyPsokxx--ms^V$9V1_pjI3=1Y z#8SZ|$E_JsT`3M5xPrvD%0an8oi56j=9s90h3n8&sNajoTxSRe2822S-r=;hF%2DM ze8e+Kre}(!T_RZ$(U4rL|I%ZzEV~EFNNeM@N8t6~7*%c>!R!d8lVXBl zVJWn=l4EWf;4AzSakR{LSO?S*SHc4=Xh6ACdK~c8lySDg_f`pkFa*>HU#k^?Mk*9{ za)hMXOej0CYjHfP@rr~g=bzpZWd>K)z(RWS24$;J{WoGXRRr;k!7#8hjdn`O-U8}5 zo6@7Qu$vlPAwxkd&&~X!a5-rWMK9dA?DB9=jmEx5D3{D5oiT{fXLI@`D=Ux#grhuG zD^+!nEA~NcC)v7i@}e#|#_(t9O%4YG-k=tCW>)%JiM~ScnO!i>TNad-?#I#}>v((J!f2=gHwtwVc_EHLQC){JFeq7&ps>W$Ag5{AA z5%-n%)m`Uk9s6B0JIB6kaJrH3z;!O?qLioid$n=1i4lrqDOhOBjy_{)&~}-)5yfq~ zDifYQW_zyMSN{T4L=Pc#ME$CI0va)*OlfjUkgHml<^y$ie%U+w2tv?6msX5G3P$2| z#}ZAU`GSWiS?V@OD{M@e!KF@7;%AG)l_V?oK94RRx+$P-W{4>of3`BKkt$%=Cw)rH zdIYbw;3}9c=gIK<(6$4kYGoOTejN0P^d6Erc!4g3XYGDqwO^ERSQsi+-!=}GN!)X>w*ji{P1H>wZ{UH6 zX{an&UKRFSLBQ>AVwy2F&Q`XK_T!efPgBi&dArxpzkCbg)}*sMQ3d!ynYcWix z_|npYGkjM4H_VCfl1lDfoX0C$VNvA=MKO()qiafz$U5Uzd^r!`sw6gjbZ`=$i^_!5*E*mpvGd zg5%DuZ3wIxm4a&5e0xsqmgD* zYGLt_w3+$h0%!yaVq;0um3t$XEA$yK5Pw|pv!C9zSh@wc?lNT5)5EG6KfIzyluy3k zUv3{ba}*4FG$(pmR^nCj0s#eCNQ4~D zqf!&>E;YJNTW#siz8Z?A8ZLGxgC714l~`@O#>4Wd5=#=oawdMM<77yT(2db7k@4Wp zE%_OM$dm`us47x}?QgqM7)?HZM=$E)8)}u-P|8J5me;Vs-QgJLa01hjt`-GZf4WXYs8)21~d#k7r)eGs%T zoTM@mjdY}?b}Wv#jHbE*Kz`zf{tRkAt>Qc*%XqotdNs+gjp4Eba2n*ly|eRwCt$ys zh~nX>+L&#zD&EyQzPT7a-T4FSO1;b<&IKtjfrbAlppEY|+K)W=f(08x4LSchxPcZ; z&=#FTV)*|ywEy4&Mhf@OGx`^f5+SBVpmLE zI=62U*W>|>NHHU*R5SE{tCw-<<`9FC;fkJ1!6_8;hau))x%lmF$sfp7&pD(kD96H)c$SxIVbZT_~A3 zq=}nfv}2Lwr=d1$v7i?b+##9FLkXQFg^h;+o~eoUixID_yyG_rQYZ@APz*{54#pA0 zKa>pR#RSC`{ME;>CYUt;d;KKSEM)0R4s_P8I^L$4pB(rX9NTKK(#8fN{R*CJBK6fj zg$x42U%7H@19J?CBoA$x)b)Wp621#55p_mM7E4!7(moooafA6ECF-Zt^1qol{;FtA zId&y37DAx8Lw|yrU@Kx3nm!Z4dtT`gHi}vb$}j&kSBP&eGZ2SUb=dNsnEsur&WEKT z)j_QnLZ)5KOXZBcM8xs9Gw{W^CwZ=9$>@IzmDQpcEd(2W&^0pw4EE)QCw7R^@bLL; z`;jKBD-xYQQ2yd6a!O3cQ1R6Y?8$v6opn%hlyAYLdyZByBqP$wt`$?@3G?GqjI-WI zFr(&N%W-LTiVx^1Ho9CEPW9Z5AOL?Gi|-iXg08;`9bHFOX<@)jh53F(ufGo7X8;-H z0l)YvMmC@|H(*Hq)5~Lc+wpVu7B-~+C=Jcxyn+Svys26)m~PyI-+W15v=_={`XO5l zHTRU5<6Q%(;GtU{_)M$_Z@txr^r;MoqLKj!*lxsJ-o*}P>e`FX{w*=TWA)e>mkquq zR>aObeoL>tvlW0b{B)@!*Q#MRNDVE1iwYTY0jEF7nOpwz-CzpVB)}t%DHnxnklM&j z{5nE-m_I0{MuyF@X{w^ZXId;$ZzxX3PofMm&=br2L2ZV2EG&HUL-^jmzMYczD$O`Z z?tN3awcrjqUCwXxK5<+SI?>|?PR!D$t||ghxxLKVr-Z6Dw@24}CgX^Pq}kM_7!5qg z%Z*9SS}A#;Gxrf6Yzc??{fJaAfRlxa)hoqd(HC= z7O1`LmWceuZ0Io0(jzpSr>;rS>W?x`vcp>fVVJl1r4thU;2&FV>(dCwX&XK8S-%w< z9R&H4wYnRLSj%_btvh@R$#$Oo0`rfNf}|CtyFYe$!fDRQ{TCn#B2oP}ys`rt2n8pY zPr*hy=n`c2!FY)-Q6avwsaI|ld#8}B@=2^@?xy>AgA!eO(n7ietiyp6B?7 zzEjdImQZsbH{m6+$_l~!C_p?uVA-?$aetr2!i(>2oJ8*9svS$rL?LjaYe}8@!`*TQ zq#ig1wLj@;6j;-piPNt2DLzE!!*!-C3&;{_h7O&)YC#HO4{G<&N_9zob7B%}yt1NC zn%`Mm`%Yl-g?yhDxiV;rXh^>0f5my?!*A)t)TMO`3`(N+D9}1!YxNnLK)>@{8hpI5 zD`Qq^)g>Q(N6@}yx=%cj9sNvX@vp)=nn6ncK;7JEiZgd^P2j%)6VR%zgBZHuTvAw6 z>wG|E*}P>alWtK8B}_gAdu^xWy(?U(@8_IgZ{Dg_YfH_i| zcEU*ZONGosHYDv&Sy(wA_rub(!|ZW;oHgD9RV~OgubHzEy>?~?K2bePVezxt2%>;P z-?ra7<4n?x&FYaE?cEGI)-)$tD$5+muBu}U?sPHFKe+hV5?aCTUXV`J=9AHC=o-*Q zXUuT@-0>M!)m+!o+T(oHaeB!5lJUF^EcXIqSUNsvI7$4;|X#{w!e5pUJ_ zak1J+C*mxrK*L>l)}}XDmB5!T;U_ev;jCB9B2`6t)Wa`7=7pam>YPepUHy>E1}-i| zx=cTq2|P}#Ey5pcy4D8*2oic4dykynV%zxoUkQ#ZS%}$Wd?mL`_nI;G*TmEF^KJp z_vh{DE5H7`9RZOzAku0+?DJ`Ocwh zS7jB5f%YHF1(sTSKSuTtezZh?ey859@nDV}*wx8We3^(^>c;D^k{15Qf0gLJdBw#% zK4AOfnWngIHTLC=dT)#w{3rZBSpE+*HU0+;Htp>`-fzW8*#W`aU5e&a;9&m+kS-Mo literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 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 z 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 d0m + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.f691f37e57f04c152e23.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.f691f37e57f04c152e23.woff new file mode 100644 index 0000000000000000000000000000000000000000..400014a4b06eee3d0c0d54402a47ab2601b2862b GIT binary patch literal 98024 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 SdSQM28?+M|D(2r_;{O0|uQ74} literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff new file mode 100644 index 0000000000000000000000000000000000000000..400014a4b06eee3d0c0d54402a47ab2601b2862b GIT binary patch literal 98024 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 SdSQM28?+M|D(2r_;{O0|uQ74} literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png new file mode 100644 index 0000000000000000000000000000000000000000..d73c27344ce322d412519d63590eea4657214d04 GIT binary patch literal 920348 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

ZAh<`4UBqKKX#{2&)kM&{?Dr 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


c=wDF8K@V3J8V|*;E|zr-&_aOfi#gymnp-L~Jp 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Ɲ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

1mNzQMU2hHDR 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�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 iJo)Usyk)(E+JD(Pg(x5`GWOzAUgUGecn6V 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 z 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 + + + + Skycoin + + + + + + + +

+ + + diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/inline.2fc97466d3eec1b646d4.bundle.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/inline.2fc97466d3eec1b646d4.bundle.js new file mode 100644 index 0000000000..e28bc7c131 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/inline.2fc97466d3eec1b646d4.bundle.js @@ -0,0 +1 @@ +!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){for(var f,u,i,d=0,l=[];d=20?"ste":"de")},week:{dow:1,doy:4}})}(n("wd/R"))},"//9w":function(t,e,n){!function(t){"use strict";t.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},"/X5v":function(t,e,n){!function(t){"use strict";t.defineLocale("x-pseudo",{months:"J~\xe1\xf1\xfa\xe1~r\xfd_F~\xe9br\xfa~\xe1r\xfd_~M\xe1rc~h_\xc1p~r\xedl_~M\xe1\xfd_~J\xfa\xf1\xe9~_J\xfal~\xfd_\xc1\xfa~g\xfast~_S\xe9p~t\xe9mb~\xe9r_\xd3~ct\xf3b~\xe9r_\xd1~\xf3v\xe9m~b\xe9r_~D\xe9c\xe9~mb\xe9r".split("_"),monthsShort:"J~\xe1\xf1_~F\xe9b_~M\xe1r_~\xc1pr_~M\xe1\xfd_~J\xfa\xf1_~J\xfal_~\xc1\xfag_~S\xe9p_~\xd3ct_~\xd1\xf3v_~D\xe9c".split("_"),monthsParseExact:!0,weekdays:"S~\xfa\xf1d\xe1~\xfd_M\xf3~\xf1d\xe1\xfd~_T\xfa\xe9~sd\xe1\xfd~_W\xe9d~\xf1\xe9sd~\xe1\xfd_T~h\xfars~d\xe1\xfd_~Fr\xedd~\xe1\xfd_S~\xe1t\xfar~d\xe1\xfd".split("_"),weekdaysShort:"S~\xfa\xf1_~M\xf3\xf1_~T\xfa\xe9_~W\xe9d_~Th\xfa_~Fr\xed_~S\xe1t".split("_"),weekdaysMin:"S~\xfa_M\xf3~_T\xfa_~W\xe9_T~h_Fr~_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~\xf3d\xe1~\xfd \xe1t] LT",nextDay:"[T~\xf3m\xf3~rr\xf3~w \xe1t] LT",nextWeek:"dddd [\xe1t] LT",lastDay:"[\xdd~\xe9st~\xe9rd\xe1~\xfd \xe1t] LT",lastWeek:"[L~\xe1st] dddd [\xe1t] LT",sameElse:"L"},relativeTime:{future:"\xed~\xf1 %s",past:"%s \xe1~g\xf3",s:"\xe1 ~f\xe9w ~s\xe9c\xf3~\xf1ds",ss:"%d s~\xe9c\xf3\xf1~ds",m:"\xe1 ~m\xed\xf1~\xfat\xe9",mm:"%d m~\xed\xf1\xfa~t\xe9s",h:"\xe1~\xf1 h\xf3~\xfar",hh:"%d h~\xf3\xfars",d:"\xe1 ~d\xe1\xfd",dd:"%d d~\xe1\xfds",M:"\xe1 ~m\xf3\xf1~th",MM:"%d m~\xf3\xf1t~hs",y:"\xe1 ~\xfd\xe9\xe1r",yy:"%d \xfd~\xe9\xe1rs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},0:function(t,e,n){t.exports=n("zUnb")},"0mo+":function(t,e,n){!function(t){"use strict";var e={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},n={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};t.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(t){return t.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,(function(t){return n[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===e&&t>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===e&&t<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":t<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":t<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":t<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(n("wd/R"))},"0tRk":function(t,e,n){!function(t){"use strict";t.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba"})}(n("wd/R"))},"1rYy":function(t,e,n){!function(t){"use strict";t.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(t){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(t)},meridiem:function(t){return t<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":t<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":t<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(t,e){switch(e){case"DDD":case"w":case"W":case"DDDo":return 1===t?t+"-\u056b\u0576":t+"-\u0580\u0564";default:return t}},week:{dow:1,doy:7}})}(n("wd/R"))},"1xZ4":function(t,e,n){!function(t){"use strict";t.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(t,e){var n=1===t?"r":2===t?"n":3===t?"r":4===t?"t":"\xe8";return"w"!==e&&"W"!==e||(n="a"),t+n},week:{dow:1,doy:4}})}(n("wd/R"))},"2fjn":function(t,e,n){!function(t){"use strict";t.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}}})}(n("wd/R"))},"2ykv":function(t,e,n){!function(t){"use strict";var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),i=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;t.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,i){return t?/-MMM-/.test(i)?n[t.month()]:e[t.month()]:e},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("wd/R"))},"3E1r":function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};t.defineLocale("hi",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,(function(t){return n[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924"===e?t<4?t:t+12:"\u0938\u0941\u092c\u0939"===e?t:"\u0926\u094b\u092a\u0939\u0930"===e?t>=10?t:t+12:"\u0936\u093e\u092e"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0930\u093e\u0924":t<10?"\u0938\u0941\u092c\u0939":t<17?"\u0926\u094b\u092a\u0939\u0930":t<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(n("wd/R"))},"49sm":function(t,e){var n={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==n.call(t)}},"4MV3":function(t,e,n){!function(t){"use strict";var e={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},n={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};t.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ac7\u0ab9\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(t){return t.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,(function(t){return n[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0ab0\u0abe\u0aa4"===e?t<4?t:t+12:"\u0ab8\u0ab5\u0abe\u0ab0"===e?t:"\u0aac\u0aaa\u0acb\u0ab0"===e?t>=10?t:t+12:"\u0ab8\u0abe\u0a82\u0a9c"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0ab0\u0abe\u0aa4":t<10?"\u0ab8\u0ab5\u0abe\u0ab0":t<17?"\u0aac\u0aaa\u0acb\u0ab0":t<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(n("wd/R"))},"4dOw":function(t,e,n){!function(t){"use strict";t.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},"5ey7":function(t,e,n){var i={"./en.json":["amrp",1],"./es.json":["ZF/7",2],"./es_base.json":["bIFx",3],"./ru.json":["3Al/",4],"./zh.json":["+dwz",5],"./zh_base.json":["mJbx",6]};function r(t){if(!n.o(i,t))return Promise.resolve().then((function(){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}));var e=i[t],r=e[0];return n.e(e[1]).then((function(){return n.t(r,3)}))}r.keys=function(){return Object.keys(i)},r.id="5ey7",t.exports=r},"6+QB":function(t,e,n){!function(t){"use strict";t.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("wd/R"))},"6B0Y":function(t,e,n){!function(t){"use strict";t.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysMin:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},week:{dow:1,doy:4}})}(n("wd/R"))},"7BjC":function(t,e,n){!function(t){"use strict";function e(t,e,n,i){var r={s:["m\xf5ne sekundi","m\xf5ni sekund","paar sekundit"],ss:[t+"sekundi",t+"sekundit"],m:["\xfche minuti","\xfcks minut"],mm:[t+" minuti",t+" minutit"],h:["\xfche tunni","tund aega","\xfcks tund"],hh:[t+" tunni",t+" tundi"],d:["\xfche p\xe4eva","\xfcks p\xe4ev"],M:["kuu aja","kuu aega","\xfcks kuu"],MM:[t+" kuu",t+" kuud"],y:["\xfche aasta","aasta","\xfcks aasta"],yy:[t+" aasta",t+" aastat"]};return e?r[n][2]?r[n][2]:r[n][1]:i?r[n][0]:r[n][1]}t.defineLocale("et",{months:"jaanuar_veebruar_m\xe4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xe4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"p\xfchap\xe4ev_esmasp\xe4ev_teisip\xe4ev_kolmap\xe4ev_neljap\xe4ev_reede_laup\xe4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[T\xe4na,] LT",nextDay:"[Homme,] LT",nextWeek:"[J\xe4rgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s p\xe4rast",past:"%s tagasi",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:"%d p\xe4eva",M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},"7aV9":function(t,e,n){!function(t){"use strict";t.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(t){return t+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(t){return"\u0db4.\u0dc0."===t||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===t},meridiem:function(t,e,n){return t>11?n?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":n?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(n("wd/R"))},"8/+R":function(t,e,n){!function(t){"use strict";var e={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},n={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};t.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(t){return t.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,(function(t){return n[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0a30\u0a3e\u0a24"===e?t<4?t:t+12:"\u0a38\u0a35\u0a47\u0a30"===e?t:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===e?t>=10?t:t+12:"\u0a38\u0a3c\u0a3e\u0a2e"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0a30\u0a3e\u0a24":t<10?"\u0a38\u0a35\u0a47\u0a30":t<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":t<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(n("wd/R"))},"8mBD":function(t,e,n){!function(t){"use strict";t.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},"9rRi":function(t,e,n){!function(t){"use strict";t.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(t){return t+(1===t?"d":t%10==2?"na":"mh")},week:{dow:1,doy:4}})}(n("wd/R"))},"A+xa":function(t,e,n){!function(t){"use strict";t.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(t){return t+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(t)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(t)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(n("wd/R"))},AQ68:function(t,e,n){!function(t){"use strict";t.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(n("wd/R"))},AvvY:function(t,e,n){!function(t){"use strict";t.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===e&&t>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===e||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":t<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":t<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":t<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(n("wd/R"))},B55N:function(t,e,n){!function(t){"use strict";t.defineLocale("ja",{months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(t){return"\u5348\u5f8c"===t},meridiem:function(t,e,n){return t<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:"[\u6765\u9031]dddd LT",lastDay:"[\u6628\u65e5] LT",lastWeek:"[\u524d\u9031]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";default:return t}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}})}(n("wd/R"))},BVg3:function(t,e,n){!function(t){"use strict";function e(t){return t%100==11||t%10!=1}function n(t,n,i,r){var a=t+" ";switch(i){case"s":return n||r?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return e(t)?a+(n||r?"sek\xfandur":"sek\xfandum"):a+"sek\xfanda";case"m":return n?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return e(t)?a+(n||r?"m\xedn\xfatur":"m\xedn\xfatum"):n?a+"m\xedn\xfata":a+"m\xedn\xfatu";case"hh":return e(t)?a+(n||r?"klukkustundir":"klukkustundum"):a+"klukkustund";case"d":return n?"dagur":r?"dag":"degi";case"dd":return e(t)?n?a+"dagar":a+(r?"daga":"d\xf6gum"):n?a+"dagur":a+(r?"dag":"degi");case"M":return n?"m\xe1nu\xf0ur":r?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return e(t)?n?a+"m\xe1nu\xf0ir":a+(r?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):n?a+"m\xe1nu\xf0ur":a+(r?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return n||r?"\xe1r":"\xe1ri";case"yy":return e(t)?a+(n||r?"\xe1r":"\xe1rum"):a+(n||r?"\xe1r":"\xe1ri")}}t.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:n,ss:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},ByF4:function(t,e,n){!function(t){"use strict";t.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minutt",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0i",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},CjzT:function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),i=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,i){return t?/-MMM-/.test(i)?n[t.month()]:e[t.month()]:e},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},CoRJ:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-ma",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:6,doy:12}})}(n("wd/R"))},"D/JM":function(t,e,n){!function(t){"use strict";t.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))},"DKr+":function(t,e,n){!function(t){"use strict";function e(t,e,n,i){var r={s:["thodde secondanim","thodde second"],ss:[t+" secondanim",t+" second"],m:["eka mintan","ek minute"],mm:[t+" mintanim",t+" mintam"],h:["eka horan","ek hor"],hh:[t+" horanim",t+" hor"],d:["eka disan","ek dis"],dd:[t+" disanim",t+" dis"],M:["eka mhoinean","ek mhoino"],MM:[t+" mhoineanim",t+" mhoine"],y:["eka vorsan","ek voros"],yy:[t+" vorsanim",t+" vorsam"]};return e?r[n][0]:r[n][1]}t.defineLocale("gom-latn",{months:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Ieta to] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fatlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(t,e){switch(e){case"D":return t+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return t}},week:{dow:1,doy:4},meridiemParse:/rati|sokalli|donparam|sanje/,meridiemHour:function(t,e){return 12===t&&(t=0),"rati"===e?t<4?t:t+12:"sokalli"===e?t:"donparam"===e?t>12?t:t+12:"sanje"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"rati":t<12?"sokalli":t<16?"donparam":t<20?"sanje":"rati"}})}(n("wd/R"))},Dkky:function(t,e,n){!function(t){"use strict";t.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(n("wd/R"))},Dmvi:function(t,e,n){!function(t){"use strict";t.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},DoHr:function(t,e,n){!function(t){"use strict";var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};t.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xc7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(t,n){switch(n){case"d":case"D":case"Do":case"DD":return t;default:if(0===t)return t+"'\u0131nc\u0131";var i=t%10;return t+(e[i]||e[t%100-i]||e[t>=100?100:null])}},week:{dow:1,doy:7}})}(n("wd/R"))},DxQv:function(t,e,n){!function(t){"use strict";t.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8n_man_tir_ons_tor_fre_l\xf8r".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"p\xe5 dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xe5 sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"et \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},Dzi0:function(t,e,n){!function(t){"use strict";t.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(n("wd/R"))},"E+lV":function(t,e,n){!function(t){"use strict";var e={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u0435 \u043c\u0438\u043d\u0443\u0442\u0435"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0435","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],yy:["\u0433\u043e\u0434\u0438\u043d\u0430","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,i){var r=e.words[i];return 1===i.length?n?r[0]:r[1]:t+" "+e.correctGrammaticalCase(t,r)}};t.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"\u0434\u0430\u043d",dd:e.translate,M:"\u043c\u0435\u0441\u0435\u0446",MM:e.translate,y:"\u0433\u043e\u0434\u0438\u043d\u0443",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))},EOgW:function(t,e,n){!function(t){"use strict";t.defineLocale("th",{months:"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21_\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c_\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21_\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19_\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21_\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19_\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21_\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21_\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19_\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21_\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19_\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split("_"),monthsShort:"\u0e21.\u0e04._\u0e01.\u0e1e._\u0e21\u0e35.\u0e04._\u0e40\u0e21.\u0e22._\u0e1e.\u0e04._\u0e21\u0e34.\u0e22._\u0e01.\u0e04._\u0e2a.\u0e04._\u0e01.\u0e22._\u0e15.\u0e04._\u0e1e.\u0e22._\u0e18.\u0e04.".split("_"),monthsParseExact:!0,weekdays:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysShort:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysMin:"\u0e2d\u0e32._\u0e08._\u0e2d._\u0e1e._\u0e1e\u0e24._\u0e28._\u0e2a.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm",LLLL:"\u0e27\u0e31\u0e19dddd\u0e17\u0e35\u0e48 D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm"},meridiemParse:/\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07|\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07/,isPM:function(t){return"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"===t},meridiem:function(t,e,n){return t<12?"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07":"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"},calendar:{sameDay:"[\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextDay:"[\u0e1e\u0e23\u0e38\u0e48\u0e07\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextWeek:"dddd[\u0e2b\u0e19\u0e49\u0e32 \u0e40\u0e27\u0e25\u0e32] LT",lastDay:"[\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",lastWeek:"[\u0e27\u0e31\u0e19]dddd[\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 \u0e40\u0e27\u0e25\u0e32] LT",sameElse:"L"},relativeTime:{future:"\u0e2d\u0e35\u0e01 %s",past:"%s\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27",s:"\u0e44\u0e21\u0e48\u0e01\u0e35\u0e48\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",ss:"%d \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",m:"1 \u0e19\u0e32\u0e17\u0e35",mm:"%d \u0e19\u0e32\u0e17\u0e35",h:"1 \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",hh:"%d \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",d:"1 \u0e27\u0e31\u0e19",dd:"%d \u0e27\u0e31\u0e19",M:"1 \u0e40\u0e14\u0e37\u0e2d\u0e19",MM:"%d \u0e40\u0e14\u0e37\u0e2d\u0e19",y:"1 \u0e1b\u0e35",yy:"%d \u0e1b\u0e35"}})}(n("wd/R"))},G0Uy:function(t,e,n){!function(t){"use strict";t.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},H7XF:function(t,e,n){"use strict";e.byteLength=function(t){var e=l(t),n=e[1];return 3*(e[0]+n)/4-n},e.toByteArray=function(t){var e,n,i=l(t),o=i[0],s=i[1],u=new a(function(t,e,n){return 3*(e+n)/4-n}(0,o,s)),c=0,d=s>0?o-4:o;for(n=0;n>16&255,u[c++]=e>>8&255,u[c++]=255&e;return 2===s&&(e=r[t.charCodeAt(n)]<<2|r[t.charCodeAt(n+1)]>>4,u[c++]=255&e),1===s&&(e=r[t.charCodeAt(n)]<<10|r[t.charCodeAt(n+1)]<<4|r[t.charCodeAt(n+2)]>>2,u[c++]=e>>8&255,u[c++]=255&e),u},e.fromByteArray=function(t){for(var e,n=t.length,r=n%3,a=[],o=16383,s=0,u=n-r;su?u:s+o));return 1===r?a.push(i[(e=t[n-1])>>2]+i[e<<4&63]+"=="):2===r&&a.push(i[(e=(t[n-2]<<8)+t[n-1])>>10]+i[e>>4&63]+i[e<<2&63]+"="),a.join("")};for(var i=[],r=[],a="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,u=o.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");var n=t.indexOf("=");return-1===n&&(n=e),[n,n===e?0:4-n%4]}function c(t,e,n){for(var r,a=[],o=e;o>18&63]+i[r>>12&63]+i[r>>6&63]+i[63&r]);return a.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},H8ED:function(t,e,n){!function(t){"use strict";function e(t,e,n){return"m"===n?e?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===n?e?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":t+" "+(i=+t,r={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:e?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[n].split("_"),i%10==1&&i%100!=11?r[0]:i%10>=2&&i%10<=4&&(i%100<10||i%100>=20)?r[1]:r[2]);var i,r}t.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:e,mm:e,h:e,hh:e,d:"\u0434\u0437\u0435\u043d\u044c",dd:e,M:"\u043c\u0435\u0441\u044f\u0446",MM:e,y:"\u0433\u043e\u0434",yy:e},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u044b":t<12?"\u0440\u0430\u043d\u0456\u0446\u044b":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t%10!=2&&t%10!=3||t%100==12||t%100==13?t+"-\u044b":t+"-\u0456";case"D":return t+"-\u0433\u0430";default:return t}},week:{dow:1,doy:7}})}(n("wd/R"))},HP3h:function(t,e,n){!function(t){"use strict";var e={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},n=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},i={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},r=function(t){return function(e,r,a,o){var s=n(e),u=i[t][n(e)];return 2===s&&(u=u[r?0:1]),u.replace(/%d/i,e)}},a=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];t.defineLocale("ar-ly",{months:a,monthsShort:a,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:r("s"),ss:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]})).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n("wd/R"))},I2Jj:function(t,e,n){var i=n("hwdV").Buffer;t.exports=function(t){if(t.length>=255)throw new TypeError("Alphabet too long");var e=new Uint8Array(256);e.fill(255);for(var n=0;n>>0,c=new Uint8Array(l);t[n];){var d=e[t.charCodeAt(n)];if(255===d)return;for(var h=0,f=l-1;(0!==d||h>>0)%256>>>0,d=d/256>>>0;if(0!==d)throw new Error("Non-zero carry");a=h,n++}if(" "!==t[n]){for(var p=l-a;p!==l&&0===c[p];)p++;var m=i.allocUnsafe(r+(l-p));m.fill(0,0,r);for(var g=r;p!==l;)m[g++]=c[p++];return m}}}return{encode:function(e){if(!i.isBuffer(e))throw new TypeError("Expected Buffer");if(0===e.length)return"";for(var n=0,r=0,a=0,u=e.length;a!==u&&0===e[a];)a++,n++;for(var c=(u-a)*l+1>>>0,d=new Uint8Array(c);a!==u;){for(var h=e[a],f=0,p=c-1;(0!==h||f>>0)%o>>>0,h=h/o>>>0;if(0!==h)throw new Error("Non-zero carry");r=f,a++}for(var m=c-r;m!==c&&0===d[m];)m++;for(var g=s.repeat(n);m10&&t<20}function r(t){return e[t].split("_")}function a(t,e,a,o){var s=t+" ";return 1===t?s+n(0,e,a[0],o):e?s+(i(t)?r(a)[1]:r(a)[0]):o?s+r(a)[1]:s+(i(t)?r(a)[1]:r(a)[2])}t.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(t,e,n,i){return e?"kelios sekund\u0117s":i?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:a,m:n,mm:a,h:n,hh:a,d:n,dd:a,M:n,MM:a,y:n,yy:a},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(t){return t+"-oji"},week:{dow:1,doy:4}})}(n("wd/R"))},"K/tc":function(t,e,n){!function(t){"use strict";t.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(t){return/^nm$/i.test(t)},meridiem:function(t,e,n){return t<12?n?"vm":"VM":n?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("wd/R"))},KSF8:function(t,e,n){!function(t){"use strict";t.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(t){return/^ch$/i.test(t)},meridiem:function(t,e,n){return t<12?n?"sa":"SA":n?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n r\u1ed3i l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(n("wd/R"))},KTz0:function(t,e,n){!function(t){"use strict";var e={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,i){var r=e.words[i];return 1===i.length?n?r[0]:r[1]:t+" "+e.correctGrammaticalCase(t,r)}};t.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mjesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))},Loxo:function(t,e,n){!function(t){"use strict";t.defineLocale("uz",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u042f\u043a\u0448\u0430\u043d\u0431\u0430_\u0414\u0443\u0448\u0430\u043d\u0431\u0430_\u0421\u0435\u0448\u0430\u043d\u0431\u0430_\u0427\u043e\u0440\u0448\u0430\u043d\u0431\u0430_\u041f\u0430\u0439\u0448\u0430\u043d\u0431\u0430_\u0416\u0443\u043c\u0430_\u0428\u0430\u043d\u0431\u0430".split("_"),weekdaysShort:"\u042f\u043a\u0448_\u0414\u0443\u0448_\u0421\u0435\u0448_\u0427\u043e\u0440_\u041f\u0430\u0439_\u0416\u0443\u043c_\u0428\u0430\u043d".split("_"),weekdaysMin:"\u042f\u043a_\u0414\u0443_\u0421\u0435_\u0427\u043e_\u041f\u0430_\u0416\u0443_\u0428\u0430".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[\u0411\u0443\u0433\u0443\u043d \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",nextDay:"[\u042d\u0440\u0442\u0430\u0433\u0430] LT [\u0434\u0430]",nextWeek:"dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastDay:"[\u041a\u0435\u0447\u0430 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastWeek:"[\u0423\u0442\u0433\u0430\u043d] dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",sameElse:"L"},relativeTime:{future:"\u042f\u043a\u0438\u043d %s \u0438\u0447\u0438\u0434\u0430",past:"\u0411\u0438\u0440 \u043d\u0435\u0447\u0430 %s \u043e\u043b\u0434\u0438\u043d",s:"\u0444\u0443\u0440\u0441\u0430\u0442",ss:"%d \u0444\u0443\u0440\u0441\u0430\u0442",m:"\u0431\u0438\u0440 \u0434\u0430\u043a\u0438\u043a\u0430",mm:"%d \u0434\u0430\u043a\u0438\u043a\u0430",h:"\u0431\u0438\u0440 \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u0431\u0438\u0440 \u043e\u0439",MM:"%d \u043e\u0439",y:"\u0431\u0438\u0440 \u0439\u0438\u043b",yy:"%d \u0439\u0438\u043b"},week:{dow:1,doy:7}})}(n("wd/R"))},OIYi:function(t,e,n){!function(t){"use strict";t.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}})}(n("wd/R"))},Oaa7:function(t,e,n){!function(t){"use strict";t.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},Ob0Z:function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function i(t,e,n,i){var r="";if(e)switch(n){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":r="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":r="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":r="%d \u0924\u093e\u0938";break;case"d":r="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":r="%d \u0926\u093f\u0935\u0938";break;case"M":r="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":r="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u0947"}else switch(n){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":r="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":r="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":r="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":r="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":r="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":r="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":r="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return r.replace(/%d/i,t)}t.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,(function(t){return n[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0930\u093e\u0924\u094d\u0930\u0940|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924\u094d\u0930\u0940"===e?t<4?t:t+12:"\u0938\u0915\u093e\u0933\u0940"===e?t:"\u0926\u0941\u092a\u093e\u0930\u0940"===e?t>=10?t:t+12:"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0930\u093e\u0924\u094d\u0930\u0940":t<10?"\u0938\u0915\u093e\u0933\u0940":t<17?"\u0926\u0941\u092a\u093e\u0930\u0940":t<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(n("wd/R"))},OjkT:function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};t.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,(function(t){return n[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924\u093f"===e?t<4?t:t+12:"\u092c\u093f\u0939\u093e\u0928"===e?t:"\u0926\u093f\u0909\u0901\u0938\u094b"===e?t>=10?t:t+12:"\u0938\u093e\u0901\u091d"===e?t+12:void 0},meridiem:function(t,e,n){return t<3?"\u0930\u093e\u0924\u093f":t<12?"\u092c\u093f\u0939\u093e\u0928":t<16?"\u0926\u093f\u0909\u0901\u0938\u094b":t<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(n("wd/R"))},Oxv6:function(t,e,n){!function(t){"use strict";var e={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};t.defineLocale("tg",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u041f\u0430\u0433\u043e\u04b3 \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0448\u0430\u0431"===e?t<4?t:t+12:"\u0441\u0443\u0431\u04b3"===e?t:"\u0440\u04ef\u0437"===e?t>=11?t:t+12:"\u0431\u0435\u0433\u043e\u04b3"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0448\u0430\u0431":t<11?"\u0441\u0443\u0431\u04b3":t<16?"\u0440\u04ef\u0437":t<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("wd/R"))},PA2r:function(t,e,n){!function(t){"use strict";var e="leden_\xfanor_b\u0159ezen_duben_kv\u011bten_\u010derven_\u010dervenec_srpen_z\xe1\u0159\xed_\u0159\xedjen_listopad_prosinec".split("_"),n="led_\xfano_b\u0159e_dub_kv\u011b_\u010dvn_\u010dvc_srp_z\xe1\u0159_\u0159\xedj_lis_pro".split("_");function i(t){return t>1&&t<5&&1!=~~(t/10)}function r(t,e,n,r){var a=t+" ";switch(n){case"s":return e||r?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return e||r?a+(i(t)?"sekundy":"sekund"):a+"sekundami";case"m":return e?"minuta":r?"minutu":"minutou";case"mm":return e||r?a+(i(t)?"minuty":"minut"):a+"minutami";case"h":return e?"hodina":r?"hodinu":"hodinou";case"hh":return e||r?a+(i(t)?"hodiny":"hodin"):a+"hodinami";case"d":return e||r?"den":"dnem";case"dd":return e||r?a+(i(t)?"dny":"dn\xed"):a+"dny";case"M":return e||r?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return e||r?a+(i(t)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):a+"m\u011bs\xedci";case"y":return e||r?"rok":"rokem";case"yy":return e||r?a+(i(t)?"roky":"let"):a+"lety"}}t.defineLocale("cs",{months:e,monthsShort:n,monthsParse:function(t,e){var n,i=[];for(n=0;n<12;n++)i[n]=new RegExp("^"+t[n]+"$|^"+e[n]+"$","i");return i}(e,n),shortMonthsParse:function(t){var e,n=[];for(e=0;e<12;e++)n[e]=new RegExp("^"+t[e]+"$","i");return n}(n),longMonthsParse:function(t){var e,n=[];for(e=0;e<12;e++)n[e]=new RegExp("^"+t[e]+"$","i");return n}(e),weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},PeUW:function(t,e,n){!function(t){"use strict";var e={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},n={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};t.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(t){return t+"\u0bb5\u0ba4\u0bc1"},preparse:function(t){return t.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,(function(t){return n[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(t,e,n){return t<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":t<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":t<10?" \u0b95\u0bbe\u0bb2\u0bc8":t<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":t<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":t<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(t,e){return 12===t&&(t=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===e?t<2?t:t+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===e||"\u0b95\u0bbe\u0bb2\u0bc8"===e||"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===e&&t>=10?t:t+12},week:{dow:0,doy:6}})}(n("wd/R"))},PpIw:function(t,e,n){!function(t){"use strict";var e={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},n={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};t.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(t){return t.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,(function(t){return n[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===e?t<4?t:t+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===e?t:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===e?t>=10?t:t+12:"\u0cb8\u0c82\u0c9c\u0cc6"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":t<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":t<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":t<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(t){return t+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(n("wd/R"))},Qj4J:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(n("wd/R"))},RAwQ:function(t,e,n){!function(t){"use strict";function e(t,e,n,i){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return e?r[n][0]:r[n][1]}function n(t){if(t=parseInt(t,10),isNaN(t))return!1;if(t<0)return!0;if(t<10)return 4<=t&&t<=7;if(t<100){var e=t%10;return n(0===e?t/10:e)}if(t<1e4){for(;t>=10;)t/=10;return n(t)}return n(t/=1e3)}t.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(t){return n(t.substr(0,t.indexOf(" ")))?"a "+t:"an "+t},past:function(t){return n(t.substr(0,t.indexOf(" ")))?"viru "+t:"virun "+t},s:"e puer Sekonnen",ss:"%d Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:"%d Deeg",M:e,MM:"%d M\xe9int",y:e,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},RnhZ:function(t,e,n){var i={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function r(t){var e=a(t);return n(e)}function a(t){if(!n.o(i,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return i[t]}r.keys=function(){return Object.keys(i)},r.resolve=a,t.exports=r,r.id="RnhZ"},S6ln:function(t,e,n){!function(t){"use strict";function e(t,e,n){var i=t+" ";switch(n){case"ss":return i+(1===t?"sekunda":2===t||3===t||4===t?"sekunde":"sekundi");case"m":return e?"jedna minuta":"jedne minute";case"mm":return i+(1===t?"minuta":2===t||3===t||4===t?"minute":"minuta");case"h":return e?"jedan sat":"jednog sata";case"hh":return i+(1===t?"sat":2===t||3===t||4===t?"sata":"sati");case"dd":return i+(1===t?"dan":"dana");case"MM":return i+(1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci");case"yy":return i+(1===t?"godina":2===t||3===t||4===t?"godine":"godina")}}t.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:e,m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))},SFxW:function(t,e,n){!function(t){"use strict";var e={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-\xfcnc\xfc",4:"-\xfcnc\xfc",100:"-\xfcnc\xfc",6:"-nc\u0131",9:"-uncu",10:"-uncu",30:"-uncu",60:"-\u0131nc\u0131",90:"-\u0131nc\u0131"};t.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ert\u0259si_\xc7\u0259r\u015f\u0259nb\u0259 ax\u015fam\u0131_\xc7\u0259r\u015f\u0259nb\u0259_C\xfcm\u0259 ax\u015fam\u0131_C\xfcm\u0259_\u015e\u0259nb\u0259".split("_"),weekdaysShort:"Baz_BzE_\xc7Ax_\xc7\u0259r_CAx_C\xfcm_\u015e\u0259n".split("_"),weekdaysMin:"Bz_BE_\xc7A_\xc7\u0259_CA_C\xfc_\u015e\u0259".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[g\u0259l\u0259n h\u0259ft\u0259] dddd [saat] LT",lastDay:"[d\xfcn\u0259n] LT",lastWeek:"[ke\xe7\u0259n h\u0259ft\u0259] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \u0259vv\u0259l",s:"birne\xe7\u0259 saniyy\u0259",ss:"%d saniy\u0259",m:"bir d\u0259qiq\u0259",mm:"%d d\u0259qiq\u0259",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gec\u0259|s\u0259h\u0259r|g\xfcnd\xfcz|ax\u015fam/,isPM:function(t){return/^(g\xfcnd\xfcz|ax\u015fam)$/.test(t)},meridiem:function(t,e,n){return t<4?"gec\u0259":t<12?"s\u0259h\u0259r":t<17?"g\xfcnd\xfcz":"ax\u015fam"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0131nc\u0131|inci|nci|\xfcnc\xfc|nc\u0131|uncu)/,ordinal:function(t){if(0===t)return t+"-\u0131nc\u0131";var n=t%10;return t+(e[n]||e[t%100-n]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("wd/R"))},SatO:function(t,e,n){!function(t){"use strict";t.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e2d\u5348"===e?t>=11?t:t+12:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:void 0},meridiem:function(t,e,n){var i=100*t+e;return i<600?"\u51cc\u6668":i<900?"\u65e9\u4e0a":i<1130?"\u4e0a\u5348":i<1230?"\u4e2d\u5348":i<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u9031";default:return t}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n("wd/R"))},UDhR:function(t,e,n){!function(t){"use strict";t.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"siang"===e?t>=11?t:t+12:"sore"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"siang":t<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("wd/R"))},UpQW:function(t,e,n){!function(t){"use strict";var e=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],n=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];t.defineLocale("ur",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(t){return"\u0634\u0627\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(n("wd/R"))},Ur1D:function(t,e,n){!function(t){"use strict";t.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(t,e,n){return t<11?"ekuseni":t<15?"emini":t<19?"entsambama":"ebusuku"},meridiemHour:function(t,e){return 12===t&&(t=0),"ekuseni"===e?t:"emini"===e?t>=11?t:t+12:"entsambama"===e||"ebusuku"===e?0===t?0:t+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(n("wd/R"))},V2x9:function(t,e,n){!function(t){"use strict";t.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",ss:"minutu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},Vclq:function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");t.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,i){return t?/-MMM-/.test(i)?n[t.month()]:e[t.month()]:e},monthsParseExact:!0,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"MMMM [de] D [de] YYYY",LLL:"MMMM [de] D [de] YYYY h:mm A",LLLL:"dddd, MMMM [de] D [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(n("wd/R"))},WYrj:function(t,e,n){!function(t){"use strict";var e=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],n=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];t.defineLocale("dv",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(t){return"\u0789\u078a"===t},meridiem:function(t,e,n){return t<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(n("wd/R"))},WxRl:function(t,e,n){!function(t){"use strict";var e="vas\xe1rnap h\xe9tf\u0151n kedden szerd\xe1n cs\xfct\xf6rt\xf6k\xf6n p\xe9nteken szombaton".split(" ");function n(t,e,n,i){var r=t;switch(n){case"s":return i||e?"n\xe9h\xe1ny m\xe1sodperc":"n\xe9h\xe1ny m\xe1sodperce";case"ss":return r+(i||e)?" m\xe1sodperc":" m\xe1sodperce";case"m":return"egy"+(i||e?" perc":" perce");case"mm":return r+(i||e?" perc":" perce");case"h":return"egy"+(i||e?" \xf3ra":" \xf3r\xe1ja");case"hh":return r+(i||e?" \xf3ra":" \xf3r\xe1ja");case"d":return"egy"+(i||e?" nap":" napja");case"dd":return r+(i||e?" nap":" napja");case"M":return"egy"+(i||e?" h\xf3nap":" h\xf3napja");case"MM":return r+(i||e?" h\xf3nap":" h\xf3napja");case"y":return"egy"+(i||e?" \xe9v":" \xe9ve");case"yy":return r+(i||e?" \xe9v":" \xe9ve")}return""}function i(t){return(t?"":"[m\xfalt] ")+"["+e[this.day()]+"] LT[-kor]"}t.defineLocale("hu",{months:"janu\xe1r_febru\xe1r_m\xe1rcius_\xe1prilis_m\xe1jus_j\xfanius_j\xfalius_augusztus_szeptember_okt\xf3ber_november_december".split("_"),monthsShort:"jan_feb_m\xe1rc_\xe1pr_m\xe1j_j\xfan_j\xfal_aug_szept_okt_nov_dec".split("_"),weekdays:"vas\xe1rnap_h\xe9tf\u0151_kedd_szerda_cs\xfct\xf6rt\xf6k_p\xe9ntek_szombat".split("_"),weekdaysShort:"vas_h\xe9t_kedd_sze_cs\xfct_p\xe9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(t){return"u"===t.charAt(1).toLowerCase()},meridiem:function(t,e,n){return t<12?!0===n?"de":"DE":!0===n?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return i.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return i.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s m\xfalva",past:"%s",s:n,ss:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},X709:function(t,e,n){!function(t){"use strict";t.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"e":1===e||2===e?"a":"e")},week:{dow:1,doy:4}})}(n("wd/R"))},XDpg:function(t,e,n){!function(t){"use strict";t.defineLocale("zh-cn",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u5468\u65e5_\u5468\u4e00_\u5468\u4e8c_\u5468\u4e09_\u5468\u56db_\u5468\u4e94_\u5468\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5Ah\u70b9mm\u5206",LLLL:"YYYY\u5e74M\u6708D\u65e5ddddAh\u70b9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:t>=11?t:t+12},meridiem:function(t,e,n){var i=100*t+e;return i<600?"\u51cc\u6668":i<900?"\u65e9\u4e0a":i<1130?"\u4e0a\u5348":i<1230?"\u4e2d\u5348":i<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u5468";default:return t}},relativeTime:{future:"%s\u5185",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(n("wd/R"))},XLvN:function(t,e,n){!function(t){"use strict";t.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===e?t<4?t:t+12:"\u0c09\u0c26\u0c2f\u0c02"===e?t:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===e?t>=10?t:t+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":t<10?"\u0c09\u0c26\u0c2f\u0c02":t<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":t<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(n("wd/R"))},YRex:function(t,e,n){!function(t){"use strict";t.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===e||"\u0633\u06d5\u06be\u06d5\u0631"===e||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===e?t:"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"===e||"\u0643\u06d5\u0686"===e?t+12:t>=11?t:t+12},meridiem:function(t,e,n){var i=100*t+e;return i<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":i<900?"\u0633\u06d5\u06be\u06d5\u0631":i<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":i<1230?"\u0686\u06c8\u0634":i<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return t+"-\u06be\u06d5\u067e\u062a\u06d5";default:return t}},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(n("wd/R"))},YuTi:function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},Z4QM:function(t,e,n){!function(t){"use strict";var e=["\u062c\u0646\u0648\u0631\u064a","\u0641\u064a\u0628\u0631\u0648\u0631\u064a","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u064a\u0644","\u0645\u0626\u064a","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0621\u0650","\u0622\u06af\u0633\u067d","\u0633\u064a\u067e\u067d\u0645\u0628\u0631","\u0622\u06aa\u067d\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u068a\u0633\u0645\u0628\u0631"],n=["\u0622\u0686\u0631","\u0633\u0648\u0645\u0631","\u0627\u06b1\u0627\u0631\u0648","\u0627\u0631\u0628\u0639","\u062e\u0645\u064a\u0633","\u062c\u0645\u0639","\u0687\u0646\u0687\u0631"];t.defineLocale("sd",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(t){return"\u0634\u0627\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0627\u0684] LT",nextDay:"[\u0633\u0680\u0627\u06bb\u064a] LT",nextWeek:"dddd [\u0627\u06b3\u064a\u0646 \u0647\u0641\u062a\u064a \u062a\u064a] LT",lastDay:"[\u06aa\u0627\u0644\u0647\u0647] LT",lastWeek:"[\u06af\u0632\u0631\u064a\u0644 \u0647\u0641\u062a\u064a] dddd [\u062a\u064a] LT",sameElse:"L"},relativeTime:{future:"%s \u067e\u0648\u0621",past:"%s \u0627\u06b3",s:"\u0686\u0646\u062f \u0633\u064a\u06aa\u0646\u068a",ss:"%d \u0633\u064a\u06aa\u0646\u068a",m:"\u0647\u06aa \u0645\u0646\u067d",mm:"%d \u0645\u0646\u067d",h:"\u0647\u06aa \u06aa\u0644\u0627\u06aa",hh:"%d \u06aa\u0644\u0627\u06aa",d:"\u0647\u06aa \u068f\u064a\u0646\u0647\u0646",dd:"%d \u068f\u064a\u0646\u0647\u0646",M:"\u0647\u06aa \u0645\u0647\u064a\u0646\u0648",MM:"%d \u0645\u0647\u064a\u0646\u0627",y:"\u0647\u06aa \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(n("wd/R"))},ZAMP:function(t,e,n){!function(t){"use strict";t.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("wd/R"))},Zduo:function(t,e,n){!function(t){"use strict";t.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_a\u016dg_sep_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(t){return"p"===t.charAt(0).toLowerCase()},meridiem:function(t,e,n){return t>11?n?"p.t.m.":"P.T.M.":n?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"sekundoj",ss:"%d sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(n("wd/R"))},aIdf:function(t,e,n){!function(t){"use strict";function e(t,e,n){return t+" "+function(t,e){return 2===e?function(t){var e={m:"v",b:"v",d:"z"};return void 0===e[t.charAt(0)]?t:e[t.charAt(0)]+t.substring(1)}(t):t}({mm:"munutenn",MM:"miz",dd:"devezh"}[n],t)}t.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:e,h:"un eur",hh:"%d eur",d:"un devezh",dd:e,M:"ur miz",MM:e,y:"ur bloaz",yy:function(t){switch(function t(e){return e>9?t(e%10):e}(t)){case 1:case 3:case 4:case 5:case 9:return t+" bloaz";default:return t+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(t){return t+(1===t?"a\xf1":"vet")},week:{dow:1,doy:4}})}(n("wd/R"))},aIsn:function(t,e,n){!function(t){"use strict";t.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},aQkU:function(t,e,n){!function(t){"use strict";t.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u043e\u0441\u043b\u0435 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-\u0435\u0432":0===n?t+"-\u0435\u043d":n>10&&n<20?t+"-\u0442\u0438":1===e?t+"-\u0432\u0438":2===e?t+"-\u0440\u0438":7===e||8===e?t+"-\u043c\u0438":t+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n("wd/R"))},b1Dy:function(t,e,n){!function(t){"use strict";t.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},bOMt:function(t,e,n){!function(t){"use strict";t.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},bXm7:function(t,e,n){!function(t){"use strict";var e={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};t.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("wd/R"))},bYM6:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(n("wd/R"))},bpih:function(t,e,n){!function(t){"use strict";t.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(t){return(/^[0-9].+$/.test(t)?"tra":"in")+" "+t},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},cRix:function(t,e,n){!function(t){"use strict";var e="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),n="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");t.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(t,i){return t?/-MMM-/.test(i)?n[t.month()]:e[t.month()]:e},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[\xf4fr\xfbne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien min\xfat",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("wd/R"))},crnd:function(t,e){function n(t){return Promise.resolve().then((function(){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}))}n.keys=function(){return[]},n.resolve=n,t.exports=n,n.id="crnd"},czMo:function(t,e,n){!function(t){"use strict";t.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}})}(n("wd/R"))},dNwA:function(t,e,n){!function(t){"use strict";t.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(n("wd/R"))},"e+ae":function(t,e,n){!function(t){"use strict";var e="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),n="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function i(t){return t>1&&t<5}function r(t,e,n,r){var a=t+" ";switch(n){case"s":return e||r?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return e||r?a+(i(t)?"sekundy":"sek\xfand"):a+"sekundami";case"m":return e?"min\xfata":r?"min\xfatu":"min\xfatou";case"mm":return e||r?a+(i(t)?"min\xfaty":"min\xfat"):a+"min\xfatami";case"h":return e?"hodina":r?"hodinu":"hodinou";case"hh":return e||r?a+(i(t)?"hodiny":"hod\xedn"):a+"hodinami";case"d":return e||r?"de\u0148":"d\u0148om";case"dd":return e||r?a+(i(t)?"dni":"dn\xed"):a+"d\u0148ami";case"M":return e||r?"mesiac":"mesiacom";case"MM":return e||r?a+(i(t)?"mesiace":"mesiacov"):a+"mesiacmi";case"y":return e||r?"rok":"rokom";case"yy":return e||r?a+(i(t)?"roky":"rokov"):a+"rokmi"}}t.defineLocale("sk",{months:e,monthsShort:n,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},fzPg:function(t,e,n){!function(t){"use strict";t.defineLocale("yo",{months:"S\u1eb9\u0301r\u1eb9\u0301_E\u0300re\u0300le\u0300_\u1eb8r\u1eb9\u0300na\u0300_I\u0300gbe\u0301_E\u0300bibi_O\u0300ku\u0300du_Ag\u1eb9mo_O\u0300gu\u0301n_Owewe_\u1ecc\u0300wa\u0300ra\u0300_Be\u0301lu\u0301_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),monthsShort:"S\u1eb9\u0301r_E\u0300rl_\u1eb8rn_I\u0300gb_E\u0300bi_O\u0300ku\u0300_Ag\u1eb9_O\u0300gu\u0301_Owe_\u1ecc\u0300wa\u0300_Be\u0301l_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),weekdays:"A\u0300i\u0300ku\u0301_Aje\u0301_I\u0300s\u1eb9\u0301gun_\u1eccj\u1ecd\u0301ru\u0301_\u1eccj\u1ecd\u0301b\u1ecd_\u1eb8ti\u0300_A\u0300ba\u0301m\u1eb9\u0301ta".split("_"),weekdaysShort:"A\u0300i\u0300k_Aje\u0301_I\u0300s\u1eb9\u0301_\u1eccjr_\u1eccjb_\u1eb8ti\u0300_A\u0300ba\u0301".split("_"),weekdaysMin:"A\u0300i\u0300_Aj_I\u0300s_\u1eccr_\u1eccb_\u1eb8t_A\u0300b".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[O\u0300ni\u0300 ni] LT",nextDay:"[\u1ecc\u0300la ni] LT",nextWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301n'b\u1ecd] [ni] LT",lastDay:"[A\u0300na ni] LT",lastWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301l\u1ecd\u0301] [ni] LT",sameElse:"L"},relativeTime:{future:"ni\u0301 %s",past:"%s k\u1ecdja\u0301",s:"i\u0300s\u1eb9ju\u0301 aaya\u0301 die",ss:"aaya\u0301 %d",m:"i\u0300s\u1eb9ju\u0301 kan",mm:"i\u0300s\u1eb9ju\u0301 %d",h:"wa\u0301kati kan",hh:"wa\u0301kati %d",d:"\u1ecdj\u1ecd\u0301 kan",dd:"\u1ecdj\u1ecd\u0301 %d",M:"osu\u0300 kan",MM:"osu\u0300 %d",y:"\u1ecddu\u0301n kan",yy:"\u1ecddu\u0301n %d"},dayOfMonthOrdinalParse:/\u1ecdj\u1ecd\u0301\s\d{1,2}/,ordinal:"\u1ecdj\u1ecd\u0301 %d",week:{dow:1,doy:4}})}(n("wd/R"))},gVVK:function(t,e,n){!function(t){"use strict";function e(t,e,n,i){var r=t+" ";switch(n){case"s":return e||i?"nekaj sekund":"nekaj sekundami";case"ss":return r+(1===t?e?"sekundo":"sekundi":2===t?e||i?"sekundi":"sekundah":t<5?e||i?"sekunde":"sekundah":"sekund");case"m":return e?"ena minuta":"eno minuto";case"mm":return r+(1===t?e?"minuta":"minuto":2===t?e||i?"minuti":"minutama":t<5?e||i?"minute":"minutami":e||i?"minut":"minutami");case"h":return e?"ena ura":"eno uro";case"hh":return r+(1===t?e?"ura":"uro":2===t?e||i?"uri":"urama":t<5?e||i?"ure":"urami":e||i?"ur":"urami");case"d":return e||i?"en dan":"enim dnem";case"dd":return r+(1===t?e||i?"dan":"dnem":2===t?e||i?"dni":"dnevoma":e||i?"dni":"dnevi");case"M":return e||i?"en mesec":"enim mesecem";case"MM":return r+(1===t?e||i?"mesec":"mesecem":2===t?e||i?"meseca":"mesecema":t<5?e||i?"mesece":"meseci":e||i?"mesecev":"meseci");case"y":return e||i?"eno leto":"enim letom";case"yy":return r+(1===t?e||i?"leto":"letom":2===t?e||i?"leti":"letoma":t<5?e||i?"leta":"leti":e||i?"let":"leti")}}t.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))},gekB:function(t,e,n){!function(t){"use strict";var e="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),n=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",e[7],e[8],e[9]];function i(t,i,r,a){var o="";switch(r){case"s":return a?"muutaman sekunnin":"muutama sekunti";case"ss":return a?"sekunnin":"sekuntia";case"m":return a?"minuutin":"minuutti";case"mm":o=a?"minuutin":"minuuttia";break;case"h":return a?"tunnin":"tunti";case"hh":o=a?"tunnin":"tuntia";break;case"d":return a?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":o=a?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return a?"kuukauden":"kuukausi";case"MM":o=a?"kuukauden":"kuukautta";break;case"y":return a?"vuoden":"vuosi";case"yy":o=a?"vuoden":"vuotta"}return function(t,i){return t<10?i?n[t]:e[t]:t}(t,a)+" "+o}t.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},gjCT:function(t,e,n){!function(t){"use strict";var e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};t.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(t){return t.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,(function(t){return n[t]})).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]})).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(n("wd/R"))},hKrs:function(t,e,n){!function(t){"use strict";t.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0440_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u043d\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-\u0435\u0432":0===n?t+"-\u0435\u043d":n>10&&n<20?t+"-\u0442\u0438":1===e?t+"-\u0432\u0438":2===e?t+"-\u0440\u0438":7===e||8===e?t+"-\u043c\u0438":t+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n("wd/R"))},honF:function(t,e,n){!function(t){"use strict";var e={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},n={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};t.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(t){return t.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,(function(t){return n[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},week:{dow:1,doy:4}})}(n("wd/R"))},hwdV:function(t,e,n){var i=n("tjlA"),r=i.Buffer;function a(t,e){for(var n in t)e[n]=t[n]}function o(t,e,n){return r(t,e,n)}r.from&&r.alloc&&r.allocUnsafe&&r.allocUnsafeSlow?t.exports=i:(a(i,e),e.Buffer=o),a(r,o),o.from=function(t,e,n){if("number"==typeof t)throw new TypeError("Argument must not be a number");return r(t,e,n)},o.alloc=function(t,e,n){if("number"!=typeof t)throw new TypeError("Argument must be a number");var i=r(t);return void 0!==e?"string"==typeof n?i.fill(e,n):i.fill(e):i.fill(0),i},o.allocUnsafe=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return r(t)},o.allocUnsafeSlow=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return i.SlowBuffer(t)}},iEDd:function(t,e,n){!function(t){"use strict";t.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(t){return 0===t.indexOf("un")?"n"+t:"en "+t},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},iYuL:function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),i=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,i){return t?/-MMM-/.test(i)?n[t.month()]:e[t.month()]:e},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},jUeY:function(t,e,n){!function(t){"use strict";t.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(t,e){return t?"string"==typeof e&&/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[t.month()]:this._monthsNominativeEl[t.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(t,e,n){return t>11?n?"\u03bc\u03bc":"\u039c\u039c":n?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(t){return"\u03bc"===(t+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(t,e){var n,i=this._calendarEl[t],r=e&&e.hours();return((n=i)instanceof Function||"[object Function]"===Object.prototype.toString.call(n))&&(i=i.apply(e)),i.replace("{}",r%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(n("wd/R"))},jVdC:function(t,e,n){!function(t){"use strict";var e="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_");function i(t){return t%10<5&&t%10>1&&~~(t/10)%10!=1}function r(t,e,n){var r=t+" ";switch(n){case"ss":return r+(i(t)?"sekundy":"sekund");case"m":return e?"minuta":"minut\u0119";case"mm":return r+(i(t)?"minuty":"minut");case"h":return e?"godzina":"godzin\u0119";case"hh":return r+(i(t)?"godziny":"godzin");case"MM":return r+(i(t)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return r+(i(t)?"lata":"lat")}}t.defineLocale("pl",{months:function(t,i){return t?""===i?"("+n[t.month()]+"|"+e[t.month()]+")":/D MMMM/.test(i)?n[t.month()]:e[t.month()]:e},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:r,m:r,mm:r,h:r,hh:r,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:r,y:"rok",yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},jfSC:function(t,e,n){!function(t){"use strict";var e={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},n={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};t.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(t){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(t)},meridiem:function(t,e,n){return t<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"\u062b\u0627\u0646\u06cc\u0647 d%",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/[\u06f0-\u06f9]/g,(function(t){return n[t]})).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]})).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(n("wd/R"))},jnO4:function(t,e,n){!function(t){"use strict";var e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},i=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},r={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},a=function(t){return function(e,n,a,o){var s=i(e),u=r[t][i(e)];return 2===s&&(u=u[n?0:1]),u.replace(/%d/i,e)}},o=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];t.defineLocale("ar",{months:o,monthsShort:o,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:a("s"),ss:a("s"),m:a("m"),mm:a("m"),h:a("h"),hh:a("h"),d:a("d"),dd:a("d"),M:a("M"),MM:a("M"),y:a("y"),yy:a("y")},preparse:function(t){return t.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,(function(t){return n[t]})).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]})).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n("wd/R"))},kB5k:function(t,e,n){var i;!function(r){"use strict";var a,o=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,s=Math.ceil,u=Math.floor,l="[BigNumber Error] ",c=l+"Number primitive has more than 15 significant digits: ",d=1e14,h=14,f=9007199254740991,p=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],m=1e7,g=1e9;function v(t){var e=0|t;return t>0||t===e?e:e-1}function _(t){for(var e,n,i=1,r=t.length,a=t[0]+"";il^n?1:-1;for(s=(u=r.length)<(l=a.length)?u:l,o=0;oa[o]^n?1:-1;return u==l?0:u>l^n?1:-1}function b(t,e,n,i){if(tn||t!==(t<0?s(t):u(t)))throw Error(l+(i||"Argument")+("number"==typeof t?tn?" out of range: ":" not an integer: ":" not a primitive number: ")+t)}function w(t){return"[object Array]"==Object.prototype.toString.call(t)}function k(t){var e=t.c.length-1;return v(t.e/h)==e&&t.c[e]%2!=0}function M(t,e){return(t.length>1?t.charAt(0)+"."+t.slice(1):t)+(e<0?"e":"e+")+e}function S(t,e,n){var i,r;if(e<0){for(r=n+".";++e;r+=n);t=r+t}else if(++e>(i=t.length)){for(r=n,e-=i;--e;r+=n);t+=r}else e=10;d/=10,l++);return v.e=l,void(v.c=[t])}g=t+""}else{if(!o.test(g=t+""))return r(v,g,p);v.s=45==g.charCodeAt(0)?(g=g.slice(1),-1):1}(l=g.indexOf("."))>-1&&(g=g.replace(".","")),(d=g.search(/e/i))>0?(l<0&&(l=d),l+=+g.slice(d+1),g=g.substring(0,d)):l<0&&(l=g.length)}else{if(b(e,2,V.length,"Base"),g=t+"",10==e)return K(v=new z(t instanceof z?t:g),P+v.e+1,I);if(p="number"==typeof t){if(0*t!=0)return r(v,g,p,e);if(v.s=1/t<0?(g=g.slice(1),-1):1,z.DEBUG&&g.replace(/^0\.0*|\./,"").length>15)throw Error(c+t);p=!1}else v.s=45===g.charCodeAt(0)?(g=g.slice(1),-1):1;for(n=V.slice(0,e),l=d=0,m=g.length;dl){l=m;continue}}else if(!s&&(g==g.toUpperCase()&&(g=g.toLowerCase())||g==g.toLowerCase()&&(g=g.toUpperCase()))){s=!0,d=-1,l=0;continue}return r(v,t+"",p,e)}(l=(g=i(g,e,10,v.s)).indexOf("."))>-1?g=g.replace(".",""):l=g.length}for(d=0;48===g.charCodeAt(d);d++);for(m=g.length;48===g.charCodeAt(--m););if(g=g.slice(d,++m)){if(m-=d,p&&z.DEBUG&&m>15&&(t>f||t!==u(t)))throw Error(c+v.s*t);if((l=l-d-1)>H)v.c=v.e=null;else if(ls){if(--e>0)for(u+=".";e--;u+="0");}else if((e+=a-s)>0)for(a+1==s&&(u+=".");e--;u+="0");return t.s<0&&r?"-"+u:u}function q(t,e){var n,i,r=0;for(w(t[0])&&(t=t[0]),n=new z(t[0]);++r=10;r/=10,i++);return(n=i+n*h-1)>H?t.c=t.e=null:n=10;l/=10,r++);if((a=e-r)<0)a+=h,m=(c=g[f=0])/v[r-(o=e)-1]%10|0;else if((f=s((a+1)/h))>=g.length){if(!i)break t;for(;g.length<=f;g.push(0));c=m=0,r=1,o=(a%=h)-h+1}else{for(c=l=g[f],r=1;l>=10;l/=10,r++);m=(o=(a%=h)-h+r)<0?0:c/v[r-o-1]%10|0}if(i=i||e<0||null!=g[f+1]||(o<0?c:c%v[r-o-1]),i=n<4?(m||i)&&(0==n||n==(t.s<0?3:2)):m>5||5==m&&(4==n||i||6==n&&(a>0?o>0?c/v[r-o]:0:g[f-1])%10&1||n==(t.s<0?8:7)),e<1||!g[0])return g.length=0,i?(g[0]=v[(h-(e-=t.e+1)%h)%h],t.e=-e||0):g[0]=t.e=0,t;if(0==a?(g.length=f,l=1,f--):(g.length=f+1,l=v[h-a],g[f]=o>0?u(c/v[r-o]%v[o])*l:0),i)for(;;){if(0==f){for(a=1,o=g[0];o>=10;o/=10,a++);for(o=g[0]+=l,l=1;o>=10;o/=10,l++);a!=l&&(t.e++,g[0]==d&&(g[0]=1));break}if(g[f]+=l,g[f]!=d)break;g[f--]=0,l=1}for(a=g.length;0===g[--a];g.pop());}t.e>H?t.c=t.e=null:t.e>>11))>=9e15?(n=crypto.getRandomValues(new Uint32Array(2)),e[o]=n[0],e[o+1]=n[1]):(c.push(a%1e14),o+=2);o=r/2}else{if(!crypto.randomBytes)throw B=!1,Error(l+"crypto unavailable");for(e=crypto.randomBytes(r*=7);o=9e15?crypto.randomBytes(7).copy(e,o):(c.push(a%1e14),o+=7);o=r/7}if(!B)for(;o=10;a/=10,o++);on-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/n|0,o[r]%=n)}return o.reverse()}return function(i,r,a,o,s){var u,l,c,d,h,f,p,m,g=i.indexOf("."),v=P,y=I;for(g>=0&&(d=N,N=0,i=i.replace(".",""),f=(m=new z(r)).pow(i.length-g),N=d,m.c=e(S(_(f.c),f.e,"0"),10,a,t),m.e=m.c.length),c=d=(p=e(i,r,a,s?(u=V,t):(u=t,V))).length;0==p[--d];p.pop());if(!p[0])return u.charAt(0);if(g<0?--c:(f.c=p,f.e=c,f.s=o,p=(f=n(f,m,v,y,a)).c,h=f.r,c=f.e),g=p[l=c+v+1],d=a/2,h=h||l<0||null!=p[l+1],h=y<4?(null!=g||h)&&(0==y||y==(f.s<0?3:2)):g>d||g==d&&(4==y||h||6==y&&1&p[l-1]||y==(f.s<0?8:7)),l<1||!p[0])i=h?S(u.charAt(1),-v,u.charAt(0)):u.charAt(0);else{if(p.length=l,h)for(--a;++p[--l]>a;)p[l]=0,l||(++c,p=[1].concat(p));for(d=p.length;!p[--d];);for(g=0,i="";g<=d;i+=u.charAt(p[g++]));i=S(i,c,u.charAt(0))}return i}}(),n=function(){function t(t,e,n){var i,r,a,o,s=0,u=t.length,l=e%m,c=e/m|0;for(t=t.slice();u--;)s=((r=l*(a=t[u]%m)+(i=c*a+(o=t[u]/m|0)*l)%m*m+s)/n|0)+(i/m|0)+c*o,t[u]=r%n;return s&&(t=[s].concat(t)),t}function e(t,e,n,i){var r,a;if(n!=i)a=n>i?1:-1;else for(r=a=0;re[r]?1:-1;break}return a}function n(t,e,n,i){for(var r=0;n--;)t[n]-=r,t[n]=(r=t[n]1;t.splice(0,1));}return function(i,r,a,o,s){var l,c,f,p,m,g,_,y,b,w,k,M,S,C,x,D,L,T=i.s==r.s?1:-1,E=i.c,O=r.c;if(!(E&&E[0]&&O&&O[0]))return new z(i.s&&r.s&&(E?!O||E[0]!=O[0]:O)?E&&0==E[0]||!O?0*T:T/0:NaN);for(b=(y=new z(T)).c=[],T=a+(c=i.e-r.e)+1,s||(s=d,c=v(i.e/h)-v(r.e/h),T=T/h|0),f=0;O[f]==(E[f]||0);f++);if(O[f]>(E[f]||0)&&c--,T<0)b.push(1),p=!0;else{for(C=E.length,D=O.length,f=0,T+=2,(m=u(s/(O[0]+1)))>1&&(O=t(O,m,s),E=t(E,m,s),D=O.length,C=E.length),S=D,k=(w=E.slice(0,D)).length;k=s/2&&x++;do{if(m=0,(l=e(O,w,D,k))<0){if(M=w[0],D!=k&&(M=M*s+(w[1]||0)),(m=u(M/x))>1)for(m>=s&&(m=s-1),_=(g=t(O,m,s)).length,k=w.length;1==e(g,w,_,k);)m--,n(g,D<_?L:O,_,s),_=g.length,l=1;else 0==m&&(l=m=1),_=(g=O.slice()).length;if(_=10;T/=10,f++);K(y,a+(y.e=f+c*h-1)+1,o,p)}else y.e=c,y.r=+p;return y}}(),x=/^(-?)0([xbo])(?=\w[\w.]*$)/i,D=/^([^.]+)\.$/,L=/^\.([^.]+)$/,T=/^-?(Infinity|NaN)$/,E=/^\s*\+(?=[\w.])|^\s+|\s+$/g,r=function(t,e,n,i){var r,a=n?e:e.replace(E,"");if(T.test(a))t.s=isNaN(a)?null:a<0?-1:1,t.c=t.e=null;else{if(!n&&(a=a.replace(x,(function(t,e,n){return r="x"==(n=n.toLowerCase())?16:"b"==n?2:8,i&&i!=r?t:e})),i&&(r=i,a=a.replace(D,"$1").replace(L,"0.$1")),e!=a))return new z(a,r);if(z.DEBUG)throw Error(l+"Not a"+(i?" base "+i:"")+" number: "+e);t.c=t.e=t.s=null}},O.absoluteValue=O.abs=function(){var t=new z(this);return t.s<0&&(t.s=1),t},O.comparedTo=function(t,e){return y(this,new z(t,e))},O.decimalPlaces=O.dp=function(t,e){var n,i,r,a=this;if(null!=t)return b(t,0,g),null==e?e=I:b(e,0,8),K(new z(a),t+a.e+1,e);if(!(n=a.c))return null;if(i=((r=n.length-1)-v(this.e/h))*h,r=n[r])for(;r%10==0;r/=10,i--);return i<0&&(i=0),i},O.dividedBy=O.div=function(t,e){return n(this,new z(t,e),P,I)},O.dividedToIntegerBy=O.idiv=function(t,e){return n(this,new z(t,e),0,1)},O.exponentiatedBy=O.pow=function(t,e){var n,i,r,a,o,c,d,f=this;if((t=new z(t)).c&&!t.isInteger())throw Error(l+"Exponent not an integer: "+t);if(null!=e&&(e=new z(e)),a=t.e>14,!f.c||!f.c[0]||1==f.c[0]&&!f.e&&1==f.c.length||!t.c||!t.c[0])return d=new z(Math.pow(+f.valueOf(),a?2-k(t):+t)),e?d.mod(e):d;if(o=t.s<0,e){if(e.c?!e.c[0]:!e.s)return new z(NaN);(i=!o&&f.isInteger()&&e.isInteger())&&(f=f.mod(e))}else{if(t.e>9&&(f.e>0||f.e<-1||(0==f.e?f.c[0]>1||a&&f.c[1]>=24e7:f.c[0]<8e13||a&&f.c[0]<=9999975e7)))return r=f.s<0&&k(t)?-0:0,f.e>-1&&(r=1/r),new z(o?1/r:r);N&&(r=s(N/h+2))}for(a?(n=new z(.5),c=k(t)):c=t%2,o&&(t.s=1),d=new z(A);;){if(c){if(!(d=d.times(f)).c)break;r?d.c.length>r&&(d.c.length=r):i&&(d=d.mod(e))}if(a){if(K(t=t.times(n),t.e+1,1),!t.c[0])break;a=t.e>14,c=k(t)}else{if(!(t=u(t/2)))break;c=t%2}f=f.times(f),r?f.c&&f.c.length>r&&(f.c.length=r):i&&(f=f.mod(e))}return i?d:(o&&(d=A.div(d)),e?d.mod(e):r?K(d,N,I,void 0):d)},O.integerValue=function(t){var e=new z(this);return null==t?t=I:b(t,0,8),K(e,e.e+1,t)},O.isEqualTo=O.eq=function(t,e){return 0===y(this,new z(t,e))},O.isFinite=function(){return!!this.c},O.isGreaterThan=O.gt=function(t,e){return y(this,new z(t,e))>0},O.isGreaterThanOrEqualTo=O.gte=function(t,e){return 1===(e=y(this,new z(t,e)))||0===e},O.isInteger=function(){return!!this.c&&v(this.e/h)>this.c.length-2},O.isLessThan=O.lt=function(t,e){return y(this,new z(t,e))<0},O.isLessThanOrEqualTo=O.lte=function(t,e){return-1===(e=y(this,new z(t,e)))||0===e},O.isNaN=function(){return!this.s},O.isNegative=function(){return this.s<0},O.isPositive=function(){return this.s>0},O.isZero=function(){return!!this.c&&0==this.c[0]},O.minus=function(t,e){var n,i,r,a,o=this,s=o.s;if(e=(t=new z(t,e)).s,!s||!e)return new z(NaN);if(s!=e)return t.s=-e,o.plus(t);var u=o.e/h,l=t.e/h,c=o.c,f=t.c;if(!u||!l){if(!c||!f)return c?(t.s=-e,t):new z(f?o:NaN);if(!c[0]||!f[0])return f[0]?(t.s=-e,t):new z(c[0]?o:3==I?-0:0)}if(u=v(u),l=v(l),c=c.slice(),s=u-l){for((a=s<0)?(s=-s,r=c):(l=u,r=f),r.reverse(),e=s;e--;r.push(0));r.reverse()}else for(i=(a=(s=c.length)<(e=f.length))?s:e,s=e=0;e0)for(;e--;c[n++]=0);for(e=d-1;i>s;){if(c[--i]=0;){for(n=0,p=M[r]%b,g=M[r]/b|0,a=r+(o=u);a>r;)n=((l=p*(l=k[--o]%b)+(s=g*l+(c=k[o]/b|0)*p)%b*b+_[a]+n)/y|0)+(s/b|0)+g*c,_[a--]=l%y;_[a]=n}return n?++i:_.splice(0,1),G(t,_,i)},O.negated=function(){var t=new z(this);return t.s=-t.s||null,t},O.plus=function(t,e){var n,i=this,r=i.s;if(e=(t=new z(t,e)).s,!r||!e)return new z(NaN);if(r!=e)return t.s=-e,i.minus(t);var a=i.e/h,o=t.e/h,s=i.c,u=t.c;if(!a||!o){if(!s||!u)return new z(r/0);if(!s[0]||!u[0])return u[0]?t:new z(s[0]?i:0*r)}if(a=v(a),o=v(o),s=s.slice(),r=a-o){for(r>0?(o=a,n=u):(r=-r,n=s),n.reverse();r--;n.push(0));n.reverse()}for((r=s.length)-(e=u.length)<0&&(n=u,u=s,s=n,e=r),r=0;e;)r=(s[--e]=s[e]+u[e]+r)/d|0,s[e]=d===s[e]?0:s[e]%d;return r&&(s=[r].concat(s),++o),G(t,s,o)},O.precision=O.sd=function(t,e){var n,i,r,a=this;if(null!=t&&t!==!!t)return b(t,1,g),null==e?e=I:b(e,0,8),K(new z(a),t,e);if(!(n=a.c))return null;if(i=(r=n.length-1)*h+1,r=n[r]){for(;r%10==0;r/=10,i--);for(r=n[0];r>=10;r/=10,i++);}return t&&a.e+1>i&&(i=a.e+1),i},O.shiftedBy=function(t){return b(t,-9007199254740991,f),this.times("1e"+t)},O.squareRoot=O.sqrt=function(){var t,e,i,r,a,o=this,s=o.c,u=o.s,l=o.e,c=P+4,d=new z("0.5");if(1!==u||!s||!s[0])return new z(!u||u<0&&(!s||s[0])?NaN:s?o:1/0);if(0==(u=Math.sqrt(+o))||u==1/0?(((e=_(s)).length+l)%2==0&&(e+="0"),u=Math.sqrt(e),l=v((l+1)/2)-(l<0||l%2),i=new z(e=u==1/0?"1e"+l:(e=u.toExponential()).slice(0,e.indexOf("e")+1)+l)):i=new z(u+""),i.c[0])for((u=(l=i.e)+c)<3&&(u=0);;)if(i=d.times((a=i).plus(n(o,a,c,1))),_(a.c).slice(0,u)===(e=_(i.c)).slice(0,u)){if(i.e0&&h>0){for(u=d.substr(0,i=h%a||a);i0&&(u+=s+d.slice(i)),c&&(u="-"+u)}n=l?u+W.decimalSeparator+((o=+W.fractionGroupSize)?l.replace(new RegExp("\\d{"+o+"}\\B","g"),"$&"+W.fractionGroupSeparator):l):u}return n},O.toFraction=function(t){var e,i,r,a,o,s,u,c,d,f,m,g,v=this,y=v.c;if(null!=t&&(!(c=new z(t)).isInteger()&&(c.c||1!==c.s)||c.lt(A)))throw Error(l+"Argument "+(c.isInteger()?"out of range: ":"not an integer: ")+t);if(!y)return v.toString();for(i=new z(A),f=r=new z(A),a=d=new z(A),g=_(y),s=i.e=g.length-v.e-1,i.c[0]=p[(u=s%h)<0?h+u:u],t=!t||c.comparedTo(i)>0?s>0?i:f:c,u=H,H=1/0,c=new z(g),d.c[0]=0;m=n(c,i,0,1),1!=(o=r.plus(m.times(a))).comparedTo(t);)r=a,a=o,f=d.plus(m.times(o=f)),d=o,i=c.minus(m.times(o=i)),c=o;return o=n(t.minus(r),a,0,1),d=d.plus(o.times(f)),r=r.plus(o.times(a)),d.s=f.s=v.s,e=n(f,a,s*=2,I).minus(v).abs().comparedTo(n(d,r,s,I).minus(v).abs())<1?[f.toString(),a.toString()]:[d.toString(),r.toString()],H=u,e},O.toNumber=function(){return+this},O.toPrecision=function(t,e){return null!=t&&b(t,1,g),U(this,t,e,2)},O.toString=function(t){var e,n=this,r=n.s,a=n.e;return null===a?r?(e="Infinity",r<0&&(e="-"+e)):e="NaN":(e=_(n.c),null==t?e=a<=Y||a>=R?M(e,a):S(e,a,"0"):(b(t,2,V.length,"Base"),e=i(S(e,a,"0"),10,t,r,!0)),r<0&&n.c[0]&&(e="-"+e)),e},O.valueOf=O.toJSON=function(){var t,e=this,n=e.e;return null===n?e.toString():(t=_(e.c),t=n<=Y||n>=R?M(t,n):S(t,n,"0"),e.s<0?"-"+t:t)},O._isBigNumber=!0,null!=e&&z.set(e),z}()).default=a.BigNumber=a,void 0===(i=(function(){return a}).call(e,n,e,t))||(t.exports=i)}()},kEOa:function(t,e,n){!function(t){"use strict";var e={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},n={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};t.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2_\u0986\u0997_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u0983_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(t){return t.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,(function(t){return n[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u09b0\u09be\u09a4"===e&&t>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===e&&t<5||"\u09ac\u09bf\u0995\u09be\u09b2"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u09b0\u09be\u09a4":t<10?"\u09b8\u0995\u09be\u09b2":t<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":t<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(n("wd/R"))},kOpN:function(t,e,n){!function(t){"use strict";t.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e2d\u5348"===e?t>=11?t:t+12:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:void 0},meridiem:function(t,e,n){var i=100*t+e;return i<600?"\u51cc\u6668":i<900?"\u65e9\u4e0a":i<1130?"\u4e0a\u5348":i<1230?"\u4e2d\u5348":i<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u9031";default:return t}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n("wd/R"))},"kVK+":function(t,e){e.read=function(t,e,n,i,r){var a,o,s=8*r-i-1,u=(1<>1,c=-7,d=n?r-1:0,h=n?-1:1,f=t[e+d];for(d+=h,a=f&(1<<-c)-1,f>>=-c,c+=s;c>0;a=256*a+t[e+d],d+=h,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=i;c>0;o=256*o+t[e+d],d+=h,c-=8);if(0===a)a=1-l;else{if(a===u)return o?NaN:1/0*(f?-1:1);o+=Math.pow(2,i),a-=l}return(f?-1:1)*o*Math.pow(2,a-i)},e.write=function(t,e,n,i,r,a){var o,s,u,l=8*a-r-1,c=(1<>1,h=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,f=i?0:a-1,p=i?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=c):(o=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-o))<1&&(o--,u*=2),(e+=o+d>=1?h/u:h*Math.pow(2,1-d))*u>=2&&(o++,u/=2),o+d>=c?(s=0,o=c):o+d>=1?(s=(e*u-1)*Math.pow(2,r),o+=d):(s=e*Math.pow(2,d-1)*Math.pow(2,r),o=0));r>=8;t[n+f]=255&s,f+=p,s/=256,r-=8);for(o=o<0;t[n+f]=255&o,f+=p,o/=256,l-=8);t[n+f-p]|=128*m}},l5ep:function(t,e,n){!function(t){"use strict";t.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn \xf4l",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(t){var e="";return t>20?e=40===t||50===t||60===t||80===t||100===t?"fed":"ain":t>0&&(e=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][t]),t+e},week:{dow:1,doy:4}})}(n("wd/R"))},lXzo:function(t,e,n){!function(t){"use strict";function e(t,e,n){return"m"===n?e?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":t+" "+(i=+t,r={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[n].split("_"),i%10==1&&i%100!=11?r[0]:i%10>=2&&i%10<=4&&(i%100<10||i%100>=20)?r[1]:r[2]);var i,r}var n=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];t.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?\] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430 \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",nextWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd [\u0432] LT"}},lastWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:e,m:e,mm:e,h:"\u0447\u0430\u0441",hh:e,d:"\u0434\u0435\u043d\u044c",dd:e,M:"\u043c\u0435\u0441\u044f\u0446",MM:e,y:"\u0433\u043e\u0434",yy:e},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u0438":t<12?"\u0443\u0442\u0440\u0430":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":return t+"-\u0439";case"D":return t+"-\u0433\u043e";case"w":case"W":return t+"-\u044f";default:return t}},week:{dow:1,doy:4}})}(n("wd/R"))},lgnt:function(t,e,n){!function(t){"use strict";var e={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};t.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u0435 \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("wd/R"))},lyxo:function(t,e,n){!function(t){"use strict";function e(t,e,n){var i=" ";return(t%100>=20||t>=100&&t%100==0)&&(i=" de "),t+i+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"}[n]}t.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:e,m:"un minut",mm:e,h:"o or\u0103",hh:e,d:"o zi",dd:e,M:"o lun\u0103",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}})}(n("wd/R"))},nyYc:function(t,e,n){!function(t){"use strict";t.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(t,e){switch(e){case"D":return t+(1===t?"er":"");default:case"M":case"Q":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(n("wd/R"))},o1bE:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-dz",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u0623\u062d_\u0625\u062b_\u062b\u0644\u0627_\u0623\u0631_\u062e\u0645_\u062c\u0645_\u0633\u0628".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:4}})}(n("wd/R"))},"p/rL":function(t,e,n){!function(t){"use strict";t.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(n("wd/R"))},raLr:function(t,e,n){!function(t){"use strict";function e(t,e,n){return"m"===n?e?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===n?e?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":t+" "+(i=+t,r={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:e?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[n].split("_"),i%10==1&&i%100!=11?r[0]:i%10>=2&&i%10<=4&&(i%100<10||i%100>=20)?r[1]:r[2]);var i,r}function n(t){return function(){return t+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}t.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(t,e){var n={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return t?n[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(e)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(e)?"genitive":"nominative"][t.day()]:n.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:n("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:n("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:n("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:n("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:e,m:e,mm:e,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:e,d:"\u0434\u0435\u043d\u044c",dd:e,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:e,y:"\u0440\u0456\u043a",yy:e},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u0456":t<12?"\u0440\u0430\u043d\u043a\u0443":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t+"-\u0439";case"D":return t+"-\u0433\u043e";default:return t}},week:{dow:1,doy:7}})}(n("wd/R"))},"s+uk":function(t,e,n){!function(t){"use strict";function e(t,e,n,i){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?r[n][0]:r[n][1]}t.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},sp3z:function(t,e,n){!function(t){"use strict";t.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(t){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===t},meridiem:function(t,e,n){return t<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(t){return"\u0e97\u0eb5\u0ec8"+t}})}(n("wd/R"))},tGlX:function(t,e,n){!function(t){"use strict";function e(t,e,n,i){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?r[n][0]:r[n][1]}t.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},tT3J:function(t,e,n){!function(t){"use strict";t.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(n("wd/R"))},tUCv:function(t,e,n){!function(t){"use strict";t.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(t,e){return 12===t&&(t=0),"enjing"===e?t:"siyang"===e?t>=11?t:t+12:"sonten"===e||"ndalu"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"enjing":t<15?"siyang":t<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(n("wd/R"))},tjlA:function(t,e,n){"use strict";var i=n("H7XF"),r=n("kVK+"),a=n("49sm");function o(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(t,e){if(o()=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|t}function p(t,e){if(u.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var n=t.length;if(0===n)return 0;for(var i=!1;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return j(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return N(t).length;default:if(i)return j(t).length;e=(""+e).toLowerCase(),i=!0}}function m(t,e,n){var i=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return E(this,e,n);case"utf8":case"utf-8":return x(this,e,n);case"ascii":return L(this,e,n);case"latin1":case"binary":return T(this,e,n);case"base64":return C(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,e,n);default:if(i)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),i=!0}}function g(t,e,n){var i=t[e];t[e]=t[n],t[n]=i}function v(t,e,n,i,r){if(0===t.length)return-1;if("string"==typeof n?(i=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=r?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(r)return-1;n=t.length-1}else if(n<0){if(!r)return-1;n=0}if("string"==typeof e&&(e=u.from(e,i)),u.isBuffer(e))return 0===e.length?-1:_(t,e,n,i,r);if("number"==typeof e)return e&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):_(t,[e],n,i,r);throw new TypeError("val must be string, number or Buffer")}function _(t,e,n,i,r){var a,o=1,s=t.length,u=e.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(t.length<2||e.length<2)return-1;o=2,s/=2,u/=2,n/=2}function l(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(r){var c=-1;for(a=n;as&&(n=s-u),a=n;a>=0;a--){for(var d=!0,h=0;hr&&(i=r):i=r;var a=e.length;if(a%2!=0)throw new TypeError("Invalid hex string");i>a/2&&(i=a/2);for(var o=0;o>8,r.push(n%256),r.push(i);return r}(e,t.length-n),t,n,i)}function C(t,e,n){return i.fromByteArray(0===e&&n===t.length?t:t.slice(e,n))}function x(t,e,n){n=Math.min(t.length,n);for(var i=[],r=e;r239?4:l>223?3:l>191?2:1;if(r+d<=n)switch(d){case 1:l<128&&(c=l);break;case 2:128==(192&(a=t[r+1]))&&(u=(31&l)<<6|63&a)>127&&(c=u);break;case 3:o=t[r+2],128==(192&(a=t[r+1]))&&128==(192&o)&&(u=(15&l)<<12|(63&a)<<6|63&o)>2047&&(u<55296||u>57343)&&(c=u);break;case 4:o=t[r+2],s=t[r+3],128==(192&(a=t[r+1]))&&128==(192&o)&&128==(192&s)&&(u=(15&l)<<18|(63&a)<<12|(63&o)<<6|63&s)>65535&&u<1114112&&(c=u)}null===c?(c=65533,d=1):c>65535&&(i.push((c-=65536)>>>10&1023|55296),c=56320|1023&c),i.push(c),r+=d}return function(t){var e=t.length;if(e<=D)return String.fromCharCode.apply(String,t);for(var n="",i=0;i0&&(t=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(t+=" ... ")),""},u.prototype.compare=function(t,e,n,i,r){if(!u.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===i&&(i=0),void 0===r&&(r=this.length),e<0||n>t.length||i<0||r>this.length)throw new RangeError("out of range index");if(i>=r&&e>=n)return 0;if(i>=r)return-1;if(e>=n)return 1;if(this===t)return 0;for(var a=(r>>>=0)-(i>>>=0),o=(n>>>=0)-(e>>>=0),s=Math.min(a,o),l=this.slice(i,r),c=t.slice(e,n),d=0;dr)&&(n=r),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var a=!1;;)switch(i){case"hex":return y(this,t,e,n);case"utf8":case"utf-8":return b(this,t,e,n);case"ascii":return w(this,t,e,n);case"latin1":case"binary":return k(this,t,e,n);case"base64":return M(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,t,e,n);default:if(a)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),a=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var D=4096;function L(t,e,n){var i="";n=Math.min(t.length,n);for(var r=e;rr)&&(n=r);for(var a="",o=e;on)throw new RangeError("Trying to access beyond buffer length")}function P(t,e,n,i,r,a){if(!u.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>r||et.length)throw new RangeError("Index out of range")}function I(t,e,n,i){e<0&&(e=65535+e+1);for(var r=0,a=Math.min(t.length-n,2);r>>8*(i?r:1-r)}function Y(t,e,n,i){e<0&&(e=4294967295+e+1);for(var r=0,a=Math.min(t.length-n,4);r>>8*(i?r:3-r)&255}function R(t,e,n,i,r,a){if(n+i>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function F(t,e,n,i,a){return a||R(t,0,n,4),r.write(t,e,n,i,23,4),n+4}function H(t,e,n,i,a){return a||R(t,0,n,8),r.write(t,e,n,i,52,8),n+8}u.prototype.slice=function(t,e){var n,i=this.length;if((t=~~t)<0?(t+=i)<0&&(t=0):t>i&&(t=i),(e=void 0===e?i:~~e)<0?(e+=i)<0&&(e=0):e>i&&(e=i),e0&&(r*=256);)i+=this[t+--e]*r;return i},u.prototype.readUInt8=function(t,e){return e||A(t,1,this.length),this[t]},u.prototype.readUInt16LE=function(t,e){return e||A(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUInt16BE=function(t,e){return e||A(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUInt32LE=function(t,e){return e||A(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUInt32BE=function(t,e){return e||A(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readIntLE=function(t,e,n){t|=0,e|=0,n||A(t,e,this.length);for(var i=this[t],r=1,a=0;++a=(r*=128)&&(i-=Math.pow(2,8*e)),i},u.prototype.readIntBE=function(t,e,n){t|=0,e|=0,n||A(t,e,this.length);for(var i=e,r=1,a=this[t+--i];i>0&&(r*=256);)a+=this[t+--i]*r;return a>=(r*=128)&&(a-=Math.pow(2,8*e)),a},u.prototype.readInt8=function(t,e){return e||A(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){e||A(t,2,this.length);var n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(t,e){e||A(t,2,this.length);var n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(t,e){return e||A(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return e||A(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readFloatLE=function(t,e){return e||A(t,4,this.length),r.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return e||A(t,4,this.length),r.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return e||A(t,8,this.length),r.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return e||A(t,8,this.length),r.read(this,t,!1,52,8)},u.prototype.writeUIntLE=function(t,e,n,i){t=+t,e|=0,n|=0,i||P(this,t,e,n,Math.pow(2,8*n)-1,0);var r=1,a=0;for(this[e]=255&t;++a=0&&(a*=256);)this[e+r]=t/a&255;return e+n},u.prototype.writeUInt8=function(t,e,n){return t=+t,e|=0,n||P(this,t,e,1,255,0),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},u.prototype.writeUInt16LE=function(t,e,n){return t=+t,e|=0,n||P(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):I(this,t,e,!0),e+2},u.prototype.writeUInt16BE=function(t,e,n){return t=+t,e|=0,n||P(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):I(this,t,e,!1),e+2},u.prototype.writeUInt32LE=function(t,e,n){return t=+t,e|=0,n||P(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):Y(this,t,e,!0),e+4},u.prototype.writeUInt32BE=function(t,e,n){return t=+t,e|=0,n||P(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):Y(this,t,e,!1),e+4},u.prototype.writeIntLE=function(t,e,n,i){if(t=+t,e|=0,!i){var r=Math.pow(2,8*n-1);P(this,t,e,n,r-1,-r)}var a=0,o=1,s=0;for(this[e]=255&t;++a>0)-s&255;return e+n},u.prototype.writeIntBE=function(t,e,n,i){if(t=+t,e|=0,!i){var r=Math.pow(2,8*n-1);P(this,t,e,n,r-1,-r)}var a=n-1,o=1,s=0;for(this[e+a]=255&t;--a>=0&&(o*=256);)t<0&&0===s&&0!==this[e+a+1]&&(s=1),this[e+a]=(t/o>>0)-s&255;return e+n},u.prototype.writeInt8=function(t,e,n){return t=+t,e|=0,n||P(this,t,e,1,127,-128),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,n){return t=+t,e|=0,n||P(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):I(this,t,e,!0),e+2},u.prototype.writeInt16BE=function(t,e,n){return t=+t,e|=0,n||P(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):I(this,t,e,!1),e+2},u.prototype.writeInt32LE=function(t,e,n){return t=+t,e|=0,n||P(this,t,e,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):Y(this,t,e,!0),e+4},u.prototype.writeInt32BE=function(t,e,n){return t=+t,e|=0,n||P(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):Y(this,t,e,!1),e+4},u.prototype.writeFloatLE=function(t,e,n){return F(this,t,e,!0,n)},u.prototype.writeFloatBE=function(t,e,n){return F(this,t,e,!1,n)},u.prototype.writeDoubleLE=function(t,e,n){return H(this,t,e,!0,n)},u.prototype.writeDoubleBE=function(t,e,n){return H(this,t,e,!1,n)},u.prototype.copy=function(t,e,n,i){if(n||(n=0),i||0===i||(i=this.length),e>=t.length&&(e=t.length),e||(e=0),i>0&&i=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),t.length-e=0;--r)t[r+e]=this[r+n];else if(a<1e3||!u.TYPED_ARRAY_SUPPORT)for(r=0;r>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),"number"==typeof t)for(a=e;a55295&&n<57344){if(!r){if(n>56319){(e-=3)>-1&&a.push(239,191,189);continue}if(o+1===i){(e-=3)>-1&&a.push(239,191,189);continue}r=n;continue}if(n<56320){(e-=3)>-1&&a.push(239,191,189),r=n;continue}n=65536+(r-55296<<10|n-56320)}else r&&(e-=3)>-1&&a.push(239,191,189);if(r=null,n<128){if((e-=1)<0)break;a.push(n)}else if(n<2048){if((e-=2)<0)break;a.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;a.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;a.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return a}function N(t){return i.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(B,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function W(t,e,n,i){for(var r=0;r=e.length||r>=t.length);++r)e[r+n]=t[r];return r}},u3GI:function(t,e,n){!function(t){"use strict";function e(t,e,n,i){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?r[n][0]:r[n][1]}t.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},uEye:function(t,e,n){!function(t){"use strict";t.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_m\xe5n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},uXwI:function(t,e,n){!function(t){"use strict";var e={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function n(t,e,n){return n?e%10==1&&e%100!=11?t[2]:t[3]:e%10==1&&e%100!=11?t[0]:t[1]}function i(t,i,r){return t+" "+n(e[r],t,i)}function r(t,i,r){return n(e[r],t,i)}t.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(t,e){return e?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:i,m:r,mm:i,h:r,hh:i,d:r,dd:i,M:r,MM:i,y:r,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},wQk9:function(t,e,n){!function(t){"use strict";t.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(n("wd/R"))},"wd/R":function(t,e,n){(function(t){t.exports=function(){"use strict";var e,i;function r(){return e.apply(null,arguments)}function a(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function s(t){return void 0===t}function u(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function l(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function c(t,e){var n,i=[];for(n=0;n>>0,i=0;i0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,e-i.length)).toString().substr(1)+i}var j=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,N=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,W={},V={};function z(t,e,n,i){var r=i;"string"==typeof i&&(r=function(){return this[i]()}),t&&(V[t]=r),e&&(V[e[0]]=function(){return B(r.apply(this,arguments),e[1],e[2])}),n&&(V[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),t)})}function U(t,e){return t.isValid()?(e=q(e,t.localeData()),W[e]=W[e]||function(t){var e,n,i,r=t.match(j);for(e=0,n=r.length;e=0&&N.test(t);)t=t.replace(N,i),N.lastIndex=0,n-=1;return t}var G=/\d/,K=/\d\d/,Z=/\d{3}/,J=/\d{4}/,Q=/[+-]?\d{6}/,X=/\d\d?/,$=/\d\d\d\d?/,tt=/\d\d\d\d\d\d?/,et=/\d{1,3}/,nt=/\d{1,4}/,it=/[+-]?\d{1,6}/,rt=/\d+/,at=/[+-]?\d+/,ot=/Z|[+-]\d\d:?\d\d/gi,st=/Z|[+-]\d\d(?::?\d\d)?/gi,ut=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,lt={};function ct(t,e,n){lt[t]=E(e)?e:function(t,i){return t&&n?n:e}}function dt(t,e){return d(lt,t)?lt[t](e._strict,e._locale):new RegExp(ht(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(t,e,n,i,r){return e||n||i||r}))))}function ht(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var ft={};function pt(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),u(e)&&(i=function(t,n){n[e]=M(t)}),n=0;n68?1900:2e3)};var yt,bt=wt("FullYear",!0);function wt(t,e){return function(n){return null!=n?(Mt(this,t,n),r.updateOffset(this,e),this):kt(this,t)}}function kt(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function Mt(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&_t(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),St(n,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](n))}function St(t,e){if(isNaN(t)||isNaN(e))return NaN;var n=(e%12+12)%12;return t+=(e-n)/12,1===n?_t(t)?29:28:31-n%7%2}yt=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function Yt(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function Rt(t,e,n){var i=7+e-n;return-(7+Yt(t,0,i).getUTCDay()-e)%7+i-1}function Ft(t,e,n,i,r){var a,o,s=1+7*(e-1)+(7+n-i)%7+Rt(t,i,r);return s<=0?o=vt(a=t-1)+s:s>vt(t)?(a=t+1,o=s-vt(t)):(a=t,o=s),{year:a,dayOfYear:o}}function Ht(t,e,n){var i,r,a=Rt(t.year(),e,n),o=Math.floor((t.dayOfYear()-a-1)/7)+1;return o<1?i=o+Bt(r=t.year()-1,e,n):o>Bt(t.year(),e,n)?(i=o-Bt(t.year(),e,n),r=t.year()+1):(r=t.year(),i=o),{week:i,year:r}}function Bt(t,e,n){var i=Rt(t,e,n),r=Rt(t+1,e,n);return(vt(t)-i+r)/7}z("w",["ww",2],"wo","week"),z("W",["WW",2],"Wo","isoWeek"),I("week","w"),I("isoWeek","W"),H("week",5),H("isoWeek",5),ct("w",X),ct("ww",X,K),ct("W",X),ct("WW",X,K),mt(["w","ww","W","WW"],(function(t,e,n,i){e[i.substr(0,1)]=M(t)})),z("d",0,"do","day"),z("dd",0,0,(function(t){return this.localeData().weekdaysMin(this,t)})),z("ddd",0,0,(function(t){return this.localeData().weekdaysShort(this,t)})),z("dddd",0,0,(function(t){return this.localeData().weekdays(this,t)})),z("e",0,0,"weekday"),z("E",0,0,"isoWeekday"),I("day","d"),I("weekday","e"),I("isoWeekday","E"),H("day",11),H("weekday",11),H("isoWeekday",11),ct("d",X),ct("e",X),ct("E",X),ct("dd",(function(t,e){return e.weekdaysMinRegex(t)})),ct("ddd",(function(t,e){return e.weekdaysShortRegex(t)})),ct("dddd",(function(t,e){return e.weekdaysRegex(t)})),mt(["dd","ddd","dddd"],(function(t,e,n,i){var r=n._locale.weekdaysParse(t,i,n._strict);null!=r?e.d=r:p(n).invalidWeekday=t})),mt(["d","e","E"],(function(t,e,n,i){e[i]=M(t)}));var jt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Nt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Wt="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function Vt(t,e,n){var i,r,a,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)a=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(a,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(a,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(a,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(r=yt.call(this._weekdaysParse,o))?r:null:"ddd"===e?-1!==(r=yt.call(this._shortWeekdaysParse,o))?r:null:-1!==(r=yt.call(this._minWeekdaysParse,o))?r:null:"dddd"===e?-1!==(r=yt.call(this._weekdaysParse,o))||-1!==(r=yt.call(this._shortWeekdaysParse,o))||-1!==(r=yt.call(this._minWeekdaysParse,o))?r:null:"ddd"===e?-1!==(r=yt.call(this._shortWeekdaysParse,o))||-1!==(r=yt.call(this._weekdaysParse,o))||-1!==(r=yt.call(this._minWeekdaysParse,o))?r:null:-1!==(r=yt.call(this._minWeekdaysParse,o))||-1!==(r=yt.call(this._weekdaysParse,o))||-1!==(r=yt.call(this._shortWeekdaysParse,o))?r:null}var zt=ut,Ut=ut,qt=ut;function Gt(){function t(t,e){return e.length-t.length}var e,n,i,r,a,o=[],s=[],u=[],l=[];for(e=0;e<7;e++)n=f([2e3,1]).day(e),i=this.weekdaysMin(n,""),r=this.weekdaysShort(n,""),a=this.weekdays(n,""),o.push(i),s.push(r),u.push(a),l.push(i),l.push(r),l.push(a);for(o.sort(t),s.sort(t),u.sort(t),l.sort(t),e=0;e<7;e++)s[e]=ht(s[e]),u[e]=ht(u[e]),l[e]=ht(l[e]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function Kt(){return this.hours()%12||12}function Zt(t,e){z(t,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)}))}function Jt(t,e){return e._meridiemParse}z("H",["HH",2],0,"hour"),z("h",["hh",2],0,Kt),z("k",["kk",2],0,(function(){return this.hours()||24})),z("hmm",0,0,(function(){return""+Kt.apply(this)+B(this.minutes(),2)})),z("hmmss",0,0,(function(){return""+Kt.apply(this)+B(this.minutes(),2)+B(this.seconds(),2)})),z("Hmm",0,0,(function(){return""+this.hours()+B(this.minutes(),2)})),z("Hmmss",0,0,(function(){return""+this.hours()+B(this.minutes(),2)+B(this.seconds(),2)})),Zt("a",!0),Zt("A",!1),I("hour","h"),H("hour",13),ct("a",Jt),ct("A",Jt),ct("H",X),ct("h",X),ct("k",X),ct("HH",X,K),ct("hh",X,K),ct("kk",X,K),ct("hmm",$),ct("hmmss",tt),ct("Hmm",$),ct("Hmmss",tt),pt(["H","HH"],3),pt(["k","kk"],(function(t,e,n){var i=M(t);e[3]=24===i?0:i})),pt(["a","A"],(function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t})),pt(["h","hh"],(function(t,e,n){e[3]=M(t),p(n).bigHour=!0})),pt("hmm",(function(t,e,n){var i=t.length-2;e[3]=M(t.substr(0,i)),e[4]=M(t.substr(i)),p(n).bigHour=!0})),pt("hmmss",(function(t,e,n){var i=t.length-4,r=t.length-2;e[3]=M(t.substr(0,i)),e[4]=M(t.substr(i,2)),e[5]=M(t.substr(r)),p(n).bigHour=!0})),pt("Hmm",(function(t,e,n){var i=t.length-2;e[3]=M(t.substr(0,i)),e[4]=M(t.substr(i))})),pt("Hmmss",(function(t,e,n){var i=t.length-4,r=t.length-2;e[3]=M(t.substr(0,i)),e[4]=M(t.substr(i,2)),e[5]=M(t.substr(r))}));var Qt,Xt=wt("Hours",!0),$t={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:xt,monthsShort:Dt,week:{dow:0,doy:6},weekdays:jt,weekdaysMin:Wt,weekdaysShort:Nt,meridiemParse:/[ap]\.?m?\.?/i},te={},ee={};function ne(t){return t?t.toLowerCase().replace("_","-"):t}function ie(e){var i=null;if(!te[e]&&void 0!==t&&t&&t.exports)try{i=Qt._abbr,n("RnhZ")("./"+e),re(i)}catch(r){}return te[e]}function re(t,e){var n;return t&&((n=s(e)?oe(t):ae(t,e))?Qt=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),Qt._abbr}function ae(t,e){if(null!==e){var n,i=$t;if(e.abbr=t,null!=te[t])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=te[t]._config;else if(null!=e.parentLocale)if(null!=te[e.parentLocale])i=te[e.parentLocale]._config;else{if(null==(n=ie(e.parentLocale)))return ee[e.parentLocale]||(ee[e.parentLocale]=[]),ee[e.parentLocale].push({name:t,config:e}),null;i=n._config}return te[t]=new A(O(i,e)),ee[t]&&ee[t].forEach((function(t){ae(t.name,t.config)})),re(t),te[t]}return delete te[t],null}function oe(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return Qt;if(!a(t)){if(e=ie(t))return e;t=[t]}return function(t){for(var e,n,i,r,a=0;a0;){if(i=ie(r.slice(0,e).join("-")))return i;if(n&&n.length>=e&&S(r,n,!0)>=e-1)break;e--}a++}return Qt}(t)}function se(t){var e,n=t._a;return n&&-2===p(t).overflow&&(e=n[1]<0||n[1]>11?1:n[2]<1||n[2]>St(n[0],n[1])?2:n[3]<0||n[3]>24||24===n[3]&&(0!==n[4]||0!==n[5]||0!==n[6])?3:n[4]<0||n[4]>59?4:n[5]<0||n[5]>59?5:n[6]<0||n[6]>999?6:-1,p(t)._overflowDayOfYear&&(e<0||e>2)&&(e=2),p(t)._overflowWeeks&&-1===e&&(e=7),p(t)._overflowWeekday&&-1===e&&(e=8),p(t).overflow=e),t}function ue(t,e,n){return null!=t?t:null!=e?e:n}function le(t){var e,n,i,a,o,s=[];if(!t._d){for(i=function(t){var e=new Date(r.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}(t),t._w&&null==t._a[2]&&null==t._a[1]&&function(t){var e,n,i,r,a,o,s,u;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)a=1,o=4,n=ue(e.GG,t._a[0],Ht(Me(),1,4).year),i=ue(e.W,1),((r=ue(e.E,1))<1||r>7)&&(u=!0);else{a=t._locale._week.dow,o=t._locale._week.doy;var l=Ht(Me(),a,o);n=ue(e.gg,t._a[0],l.year),i=ue(e.w,l.week),null!=e.d?((r=e.d)<0||r>6)&&(u=!0):null!=e.e?(r=e.e+a,(e.e<0||e.e>6)&&(u=!0)):r=a}i<1||i>Bt(n,a,o)?p(t)._overflowWeeks=!0:null!=u?p(t)._overflowWeekday=!0:(s=Ft(n,i,r,a,o),t._a[0]=s.year,t._dayOfYear=s.dayOfYear)}(t),null!=t._dayOfYear&&(o=ue(t._a[0],i[0]),(t._dayOfYear>vt(o)||0===t._dayOfYear)&&(p(t)._overflowDayOfYear=!0),n=Yt(o,0,t._dayOfYear),t._a[1]=n.getUTCMonth(),t._a[2]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=i[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[3]&&0===t._a[4]&&0===t._a[5]&&0===t._a[6]&&(t._nextDay=!0,t._a[3]=0),t._d=(t._useUTC?Yt:It).apply(null,s),a=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[3]=24),t._w&&void 0!==t._w.d&&t._w.d!==a&&(p(t).weekdayMismatch=!0)}}var ce=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,de=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,he=/Z|[+-]\d\d(?::?\d\d)?/,fe=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],pe=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],me=/^\/?Date\((\-?\d+)/i;function ge(t){var e,n,i,r,a,o,s=t._i,u=ce.exec(s)||de.exec(s);if(u){for(p(t).iso=!0,e=0,n=fe.length;e0&&p(t).unusedInput.push(o),s=s.slice(s.indexOf(n)+n.length),l+=n.length),V[a]?(n?p(t).empty=!1:p(t).unusedTokens.push(a),gt(a,n,t)):t._strict&&!n&&p(t).unusedTokens.push(a);p(t).charsLeftOver=u-l,s.length>0&&p(t).unusedInput.push(s),t._a[3]<=12&&!0===p(t).bigHour&&t._a[3]>0&&(p(t).bigHour=void 0),p(t).parsedDateParts=t._a.slice(0),p(t).meridiem=t._meridiem,t._a[3]=function(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?((i=t.isPM(n))&&e<12&&(e+=12),i||12!==e||(e=0),e):e}(t._locale,t._a[3],t._meridiem),le(t),se(t)}else ye(t);else ge(t)}function we(t){var e=t._i,n=t._f;return t._locale=t._locale||oe(t._l),null===e||void 0===n&&""===e?g({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),w(e)?new b(se(e)):(l(e)?t._d=e:a(n)?function(t){var e,n,i,r,a;if(0===t._f.length)return p(t).invalidFormat=!0,void(t._d=new Date(NaN));for(r=0;rthis?this:t:g()}));function xe(t,e){var n,i;if(1===e.length&&a(e[0])&&(e=e[0]),!e.length)return Me();for(n=e[0],i=1;i(a=Bt(t,i,r))&&(e=a),Xe.call(this,t,e,n,i,r))}function Xe(t,e,n,i,r){var a=Ft(t,e,n,i,r),o=Yt(a.year,0,a.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}z(0,["gg",2],0,(function(){return this.weekYear()%100})),z(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),Je("gggg","weekYear"),Je("ggggg","weekYear"),Je("GGGG","isoWeekYear"),Je("GGGGG","isoWeekYear"),I("weekYear","gg"),I("isoWeekYear","GG"),H("weekYear",1),H("isoWeekYear",1),ct("G",at),ct("g",at),ct("GG",X,K),ct("gg",X,K),ct("GGGG",nt,J),ct("gggg",nt,J),ct("GGGGG",it,Q),ct("ggggg",it,Q),mt(["gggg","ggggg","GGGG","GGGGG"],(function(t,e,n,i){e[i.substr(0,2)]=M(t)})),mt(["gg","GG"],(function(t,e,n,i){e[i]=r.parseTwoDigitYear(t)})),z("Q",0,"Qo","quarter"),I("quarter","Q"),H("quarter",7),ct("Q",G),pt("Q",(function(t,e){e[1]=3*(M(t)-1)})),z("D",["DD",2],"Do","date"),I("date","D"),H("date",9),ct("D",X),ct("DD",X,K),ct("Do",(function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient})),pt(["D","DD"],2),pt("Do",(function(t,e){e[2]=M(t.match(X)[0])}));var $e=wt("Date",!0);z("DDD",["DDDD",3],"DDDo","dayOfYear"),I("dayOfYear","DDD"),H("dayOfYear",4),ct("DDD",et),ct("DDDD",Z),pt(["DDD","DDDD"],(function(t,e,n){n._dayOfYear=M(t)})),z("m",["mm",2],0,"minute"),I("minute","m"),H("minute",14),ct("m",X),ct("mm",X,K),pt(["m","mm"],4);var tn=wt("Minutes",!1);z("s",["ss",2],0,"second"),I("second","s"),H("second",15),ct("s",X),ct("ss",X,K),pt(["s","ss"],5);var en,nn=wt("Seconds",!1);for(z("S",0,0,(function(){return~~(this.millisecond()/100)})),z(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),z(0,["SSS",3],0,"millisecond"),z(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),z(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),z(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),z(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),z(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),z(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),I("millisecond","ms"),H("millisecond",16),ct("S",et,G),ct("SS",et,K),ct("SSS",et,Z),en="SSSS";en.length<=9;en+="S")ct(en,rt);function rn(t,e){e[6]=M(1e3*("0."+t))}for(en="S";en.length<=9;en+="S")pt(en,rn);var an=wt("Milliseconds",!1);z("z",0,0,"zoneAbbr"),z("zz",0,0,"zoneName");var on=b.prototype;function sn(t){return t}on.add=ze,on.calendar=function(t,e){var n=t||Me(),i=Ie(n,this).startOf("day"),a=r.calendarFormat(this,i)||"sameElse",o=e&&(E(e[a])?e[a].call(this,n):e[a]);return this.format(o||this.localeData().calendar(a,this,Me(n)))},on.clone=function(){return new b(this)},on.diff=function(t,e,n){var i,r,a;if(!this.isValid())return NaN;if(!(i=Ie(t,this)).isValid())return NaN;switch(r=6e4*(i.utcOffset()-this.utcOffset()),e=Y(e)){case"year":a=qe(this,i)/12;break;case"month":a=qe(this,i);break;case"quarter":a=qe(this,i)/3;break;case"second":a=(this-i)/1e3;break;case"minute":a=(this-i)/6e4;break;case"hour":a=(this-i)/36e5;break;case"day":a=(this-i-r)/864e5;break;case"week":a=(this-i-r)/6048e5;break;default:a=this-i}return n?a:k(a)},on.endOf=function(t){return void 0===(t=Y(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))},on.format=function(t){t||(t=this.isUtc()?r.defaultFormatUtc:r.defaultFormat);var e=U(this,t);return this.localeData().postformat(e)},on.from=function(t,e){return this.isValid()&&(w(t)&&t.isValid()||Me(t).isValid())?Be({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},on.fromNow=function(t){return this.from(Me(),t)},on.to=function(t,e){return this.isValid()&&(w(t)&&t.isValid()||Me(t).isValid())?Be({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},on.toNow=function(t){return this.to(Me(),t)},on.get=function(t){return E(this[t=Y(t)])?this[t]():this},on.invalidAt=function(){return p(this).overflow},on.isAfter=function(t,e){var n=w(t)?t:Me(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=Y(s(e)?"millisecond":e))?this.valueOf()>n.valueOf():n.valueOf()9999?U(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):E(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(n,"Z")):U(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},on.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY";return this.format(n+i+"-MM-DD[T]HH:mm:ss.SSS"+e+'[")]')},on.toJSON=function(){return this.isValid()?this.toISOString():null},on.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},on.unix=function(){return Math.floor(this.valueOf()/1e3)},on.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},on.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},on.year=bt,on.isLeapYear=function(){return _t(this.year())},on.weekYear=function(t){return Qe.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},on.isoWeekYear=function(t){return Qe.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},on.quarter=on.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},on.month=Et,on.daysInMonth=function(){return St(this.year(),this.month())},on.week=on.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},on.isoWeek=on.isoWeeks=function(t){var e=Ht(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},on.weeksInYear=function(){var t=this.localeData()._week;return Bt(this.year(),t.dow,t.doy)},on.isoWeeksInYear=function(){return Bt(this.year(),1,4)},on.date=$e,on.day=on.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=function(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}(t,this.localeData()),this.add(t-e,"d")):e},on.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},on.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=function(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},on.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},on.hour=on.hours=Xt,on.minute=on.minutes=tn,on.second=on.seconds=nn,on.millisecond=on.milliseconds=an,on.utcOffset=function(t,e,n){var i,a=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=Pe(st,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(i=Ye(this)),this._offset=t,this._isUTC=!0,null!=i&&this.add(i,"m"),a!==t&&(!e||this._changeInProgress?Ve(this,Be(t-a,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,r.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?a:Ye(this)},on.utc=function(t){return this.utcOffset(0,t)},on.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ye(this),"m")),this},on.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=Pe(ot,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},on.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Me(t).utcOffset():0,(this.utcOffset()-t)%60==0)},on.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},on.isLocal=function(){return!!this.isValid()&&!this._isUTC},on.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},on.isUtc=Re,on.isUTC=Re,on.zoneAbbr=function(){return this._isUTC?"UTC":""},on.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},on.dates=x("dates accessor is deprecated. Use date instead.",$e),on.months=x("months accessor is deprecated. Use month instead",Et),on.years=x("years accessor is deprecated. Use year instead",bt),on.zone=x("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",(function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()})),on.isDSTShifted=x("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(_(t,this),(t=we(t))._a){var e=t._isUTC?f(t._a):Me(t._a);this._isDSTShifted=this.isValid()&&S(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}));var un=A.prototype;function ln(t,e,n,i){var r=oe(),a=f().set(i,e);return r[n](a,t)}function cn(t,e,n){if(u(t)&&(e=t,t=void 0),t=t||"",null!=e)return ln(t,e,n,"month");var i,r=[];for(i=0;i<12;i++)r[i]=ln(t,i,n,"month");return r}function dn(t,e,n,i){"boolean"==typeof t?(u(e)&&(n=e,e=void 0),e=e||""):(n=e=t,t=!1,u(e)&&(n=e,e=void 0),e=e||"");var r,a=oe(),o=t?a._week.dow:0;if(null!=n)return ln(e,(n+o)%7,i,"day");var s=[];for(r=0;r<7;r++)s[r]=ln(e,(r+o)%7,i,"day");return s}un.calendar=function(t,e,n){var i=this._calendar[t]||this._calendar.sameElse;return E(i)?i.call(e,n):i},un.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,(function(t){return t.slice(1)})),this._longDateFormat[t])},un.invalidDate=function(){return this._invalidDate},un.ordinal=function(t){return this._ordinal.replace("%d",t)},un.preparse=sn,un.postformat=sn,un.relativeTime=function(t,e,n,i){var r=this._relativeTime[n];return E(r)?r(t,e,n,i):r.replace(/%d/i,t)},un.pastFuture=function(t,e){var n=this._relativeTime[t>0?"future":"past"];return E(n)?n(e):n.replace(/%s/i,e)},un.set=function(t){var e,n;for(n in t)E(e=t[n])?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},un.months=function(t,e){return t?a(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||Ct).test(e)?"format":"standalone"][t.month()]:a(this._months)?this._months:this._months.standalone},un.monthsShort=function(t,e){return t?a(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[Ct.test(e)?"format":"standalone"][t.month()]:a(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},un.monthsParse=function(t,e,n){var i,r,a;if(this._monthsParseExact)return Lt.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(r=f([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(r,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(r,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(a="^"+this.months(r,"")+"|^"+this.monthsShort(r,""),this._monthsParse[i]=new RegExp(a.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[i].test(t))return i;if(n&&"MMM"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}},un.monthsRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||Pt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=At),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},un.monthsShortRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||Pt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=Ot),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},un.week=function(t){return Ht(t,this._week.dow,this._week.doy).week},un.firstDayOfYear=function(){return this._week.doy},un.firstDayOfWeek=function(){return this._week.dow},un.weekdays=function(t,e){return t?a(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:a(this._weekdays)?this._weekdays:this._weekdays.standalone},un.weekdaysMin=function(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin},un.weekdaysShort=function(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort},un.weekdaysParse=function(t,e,n){var i,r,a;if(this._weekdaysParseExact)return Vt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(r=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(r,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(r,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(r,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(a="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[i]=new RegExp(a.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}},un.weekdaysRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=zt),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},un.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Ut),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},un.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=qt),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},un.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},un.meridiem=function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},re("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===M(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),r.lang=x("moment.lang is deprecated. Use moment.locale instead.",re),r.langData=x("moment.langData is deprecated. Use moment.localeData instead.",oe);var hn=Math.abs;function fn(t,e,n,i){var r=Be(e,n);return t._milliseconds+=i*r._milliseconds,t._days+=i*r._days,t._months+=i*r._months,t._bubble()}function pn(t){return t<0?Math.floor(t):Math.ceil(t)}function mn(t){return 4800*t/146097}function gn(t){return 146097*t/4800}function vn(t){return function(){return this.as(t)}}var _n=vn("ms"),yn=vn("s"),bn=vn("m"),wn=vn("h"),kn=vn("d"),Mn=vn("w"),Sn=vn("M"),Cn=vn("y");function xn(t){return function(){return this.isValid()?this._data[t]:NaN}}var Dn=xn("milliseconds"),Ln=xn("seconds"),Tn=xn("minutes"),En=xn("hours"),On=xn("days"),An=xn("months"),Pn=xn("years"),In=Math.round,Yn={ss:44,s:45,m:45,h:22,d:26,M:11};function Rn(t,e,n,i,r){return r.relativeTime(e||1,!!n,t,i)}var Fn=Math.abs;function Hn(t){return(t>0)-(t<0)||+t}function Bn(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n=Fn(this._milliseconds)/1e3,i=Fn(this._days),r=Fn(this._months);t=k(n/60),e=k(t/60),n%=60,t%=60;var a=k(r/12),o=r%=12,s=i,u=e,l=t,c=n?n.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var h=d<0?"-":"",f=Hn(this._months)!==Hn(d)?"-":"",p=Hn(this._days)!==Hn(d)?"-":"",m=Hn(this._milliseconds)!==Hn(d)?"-":"";return h+"P"+(a?f+a+"Y":"")+(o?f+o+"M":"")+(s?p+s+"D":"")+(u||l||c?"T":"")+(u?m+u+"H":"")+(l?m+l+"M":"")+(c?m+c+"S":"")}var jn=Le.prototype;return jn.isValid=function(){return this._isValid},jn.abs=function(){var t=this._data;return this._milliseconds=hn(this._milliseconds),this._days=hn(this._days),this._months=hn(this._months),t.milliseconds=hn(t.milliseconds),t.seconds=hn(t.seconds),t.minutes=hn(t.minutes),t.hours=hn(t.hours),t.months=hn(t.months),t.years=hn(t.years),this},jn.add=function(t,e){return fn(this,t,e,1)},jn.subtract=function(t,e){return fn(this,t,e,-1)},jn.as=function(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if("month"===(t=Y(t))||"year"===t)return n=this._months+mn(e=this._days+i/864e5),"month"===t?n:n/12;switch(e=this._days+Math.round(gn(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}},jn.asMilliseconds=_n,jn.asSeconds=yn,jn.asMinutes=bn,jn.asHours=wn,jn.asDays=kn,jn.asWeeks=Mn,jn.asMonths=Sn,jn.asYears=Cn,jn.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*M(this._months/12):NaN},jn._bubble=function(){var t,e,n,i,r,a=this._milliseconds,o=this._days,s=this._months,u=this._data;return a>=0&&o>=0&&s>=0||a<=0&&o<=0&&s<=0||(a+=864e5*pn(gn(s)+o),o=0,s=0),u.milliseconds=a%1e3,t=k(a/1e3),u.seconds=t%60,e=k(t/60),u.minutes=e%60,n=k(e/60),u.hours=n%24,o+=k(n/24),s+=r=k(mn(o)),o-=pn(gn(r)),i=k(s/12),s%=12,u.days=o,u.months=s,u.years=i,this},jn.clone=function(){return Be(this)},jn.get=function(t){return t=Y(t),this.isValid()?this[t+"s"]():NaN},jn.milliseconds=Dn,jn.seconds=Ln,jn.minutes=Tn,jn.hours=En,jn.days=On,jn.weeks=function(){return k(this.days()/7)},jn.months=An,jn.years=Pn,jn.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=function(t,e,n){var i=Be(t).abs(),r=In(i.as("s")),a=In(i.as("m")),o=In(i.as("h")),s=In(i.as("d")),u=In(i.as("M")),l=In(i.as("y")),c=r<=Yn.ss&&["s",r]||r0,c[4]=n,Rn.apply(null,c)}(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},jn.toISOString=Bn,jn.toString=Bn,jn.toJSON=Bn,jn.locale=Ge,jn.localeData=Ze,jn.toIsoString=x("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Bn),jn.lang=Ke,z("X",0,0,"unix"),z("x",0,0,"valueOf"),ct("x",at),ct("X",/[+-]?\d+(\.\d{1,3})?/),pt("X",(function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))})),pt("x",(function(t,e,n){n._d=new Date(M(t))})),r.version="2.21.0",e=Me,r.fn=on,r.min=function(){return xe("isBefore",[].slice.call(arguments,0))},r.max=function(){return xe("isAfter",[].slice.call(arguments,0))},r.now=function(){return Date.now?Date.now():+new Date},r.utc=f,r.unix=function(t){return Me(1e3*t)},r.months=function(t,e){return cn(t,e,"months")},r.isDate=l,r.locale=re,r.invalid=g,r.duration=Be,r.isMoment=w,r.weekdays=function(t,e,n){return dn(t,e,n,"weekdays")},r.parseZone=function(){return Me.apply(null,arguments).parseZone()},r.localeData=oe,r.isDuration=Te,r.monthsShort=function(t,e){return cn(t,e,"monthsShort")},r.weekdaysMin=function(t,e,n){return dn(t,e,n,"weekdaysMin")},r.defineLocale=ae,r.updateLocale=function(t,e){if(null!=e){var n,i,r=$t;null!=(i=ie(t))&&(r=i._config),(n=new A(e=O(r,e))).parentLocale=te[t],te[t]=n,re(t)}else null!=te[t]&&(null!=te[t].parentLocale?te[t]=te[t].parentLocale:null!=te[t]&&delete te[t]);return te[t]},r.locales=function(){return D(te)},r.weekdaysShort=function(t,e,n){return dn(t,e,n,"weekdaysShort")},r.normalizeUnits=Y,r.relativeTimeRounding=function(t){return void 0===t?In:"function"==typeof t&&(In=t,!0)},r.relativeTimeThreshold=function(t,e){return void 0!==Yn[t]&&(void 0===e?Yn[t]:(Yn[t]=e,"s"===t&&(Yn.ss=e-1),!0))},r.calendarFormat=function(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},r.prototype=on,r.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},r}()}).call(this,n("YuTi")(t))},x6pH:function(t,e,n){!function(t){"use strict";t.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(t){return 2===t?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":t+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(t){return 2===t?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":t+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(t){return 2===t?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":t+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(t){return 2===t?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":t%10==0&&10!==t?t+" \u05e9\u05e0\u05d4":t+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(t){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(t)},meridiem:function(t,e,n){return t<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":t<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":t<12?n?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":t<18?n?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(n("wd/R"))},yPMs:function(t,e,n){!function(t){"use strict";t.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(t){return"M"===t.charAt(0)},meridiem:function(t,e,n){return t<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},z1FC:function(t,e,n){!function(t){"use strict";function e(t,e,n,i){var r={s:["viensas secunds","'iensas secunds"],ss:[t+" secunds",t+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[t+" m\xeduts",t+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[t+" \xfeoras",t+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[t+" ziuas",t+" ziuas"],M:["'n mes","'iens mes"],MM:[t+" mesen",t+" mesen"],y:["'n ar","'iens ar"],yy:[t+" ars",t+" ars"]};return i||e?r[n][0]:r[n][1]}t.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(t){return"d'o"===t.toLowerCase()},meridiem:function(t,e,n){return t>11?n?"d'o":"D'O":n?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},z3Vd:function(t,e,n){!function(t){"use strict";var e="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function n(t,n,i,r){var a=function(t){var n=Math.floor(t%1e3/100),i=Math.floor(t%100/10),r=t%10,a="";return n>0&&(a+=e[n]+"vatlh"),i>0&&(a+=(""!==a?" ":"")+e[i]+"maH"),r>0&&(a+=(""!==a?" ":"")+e[r]),""===a?"pagh":a}(t);switch(i){case"ss":return a+" lup";case"mm":return a+" tup";case"hh":return a+" rep";case"dd":return a+" jaj";case"MM":return a+" jar";case"yy":return a+" DIS"}}t.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(t){var e=t;return-1!==t.indexOf("jaj")?e.slice(0,-3)+"leS":-1!==t.indexOf("jar")?e.slice(0,-3)+"waQ":-1!==t.indexOf("DIS")?e.slice(0,-3)+"nem":e+" pIq"},past:function(t){var e=t;return-1!==t.indexOf("jaj")?e.slice(0,-3)+"Hu\u2019":-1!==t.indexOf("jar")?e.slice(0,-3)+"wen":-1!==t.indexOf("DIS")?e.slice(0,-3)+"ben":e+" ret"},s:"puS lup",ss:n,m:"wa\u2019 tup",mm:n,h:"wa\u2019 rep",hh:n,d:"wa\u2019 jaj",dd:n,M:"wa\u2019 jar",MM:n,y:"wa\u2019 DIS",yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},zUnb:function(t,e,n){"use strict";function i(t){return(i=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function r(t,e,n){return(r="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var r=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=i(t)););return t}(t,e);if(r){var a=Object.getOwnPropertyDescriptor(r,e);return a.get?a.get.call(n):a.value}})(t,e,n||t)}function a(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function o(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,u=!1;return{s:function(){n=t[Symbol.iterator]()},n:function(){var t=n.next();return o=t.done,t},e:function(t){u=!0,a=t},f:function(){try{o||null==n.return||n.return()}finally{if(u)throw a}}}}function h(t,e){return(h=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function f(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&h(t,e)}function p(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(t){return!1}}function m(t){return(m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function g(t,e){return!e||"object"!==m(e)&&"function"!=typeof e?a(t):e}function v(t){var e=p();return function(){var n,r=i(t);if(e){var a=i(this).constructor;n=Reflect.construct(r,arguments,a)}else n=r.apply(this,arguments);return g(this,n)}}function _(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function y(t,e){for(var n=0;n4&&void 0!==arguments[4]?arguments[4]:new G(t,n,i);if(!r.closed)return e instanceof B?e.subscribe(r):$(e)(r)}var et=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return b(n,[{key:"notifyNext",value:function(t,e,n,i,r){this.destination.next(e)}},{key:"notifyError",value:function(t,e){this.destination.error(t)}},{key:"notifyComplete",value:function(t){this.destination.complete()}}]),n}(P);function nt(t,e){return function(n){if("function"!=typeof t)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return n.lift(new it(t,e))}}var it=function(){function t(e,n){_(this,t),this.project=e,this.thisArg=n}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new rt(t,this.project,this.thisArg))}}]),t}(),rt=function(t){f(n,t);var e=v(n);function n(t,i,r){var o;return _(this,n),(o=e.call(this,t)).project=i,o.count=0,o.thisArg=r||a(o),o}return b(n,[{key:"_next",value:function(t){var e;try{e=this.project.call(this.thisArg,t,this.count++)}catch(n){return void this.destination.error(n)}this.destination.next(e)}}]),n}(P);function at(t,e){return new B((function(n){var i=new x,r=0;return i.add(e.schedule((function(){r!==t.length?(n.next(t[r++]),n.closed||i.add(this.schedule())):n.complete()}))),i}))}function ot(t,e){return e?function(t,e){if(null!=t){if(function(t){return t&&"function"==typeof t[Y]}(t))return function(t,e){return new B((function(n){var i=new x;return i.add(e.schedule((function(){var r=t[Y]();i.add(r.subscribe({next:function(t){i.add(e.schedule((function(){return n.next(t)})))},error:function(t){i.add(e.schedule((function(){return n.error(t)})))},complete:function(){i.add(e.schedule((function(){return n.complete()})))}}))}))),i}))}(t,e);if(X(t))return function(t,e){return new B((function(n){var i=new x;return i.add(e.schedule((function(){return t.then((function(t){i.add(e.schedule((function(){n.next(t),i.add(e.schedule((function(){return n.complete()})))})))}),(function(t){i.add(e.schedule((function(){return n.error(t)})))}))}))),i}))}(t,e);if(Q(t))return at(t,e);if(function(t){return t&&"function"==typeof t[J]}(t)||"string"==typeof t)return function(t,e){if(!t)throw new Error("Iterable cannot be null");return new B((function(n){var i,r=new x;return r.add((function(){i&&"function"==typeof i.return&&i.return()})),r.add(e.schedule((function(){i=t[J](),r.add(e.schedule((function(){if(!n.closed){var t,e;try{var r=i.next();t=r.value,e=r.done}catch(a){return void n.error(a)}e?n.complete():(n.next(t),this.schedule())}})))}))),r}))}(t,e)}throw new TypeError((null!==t&&typeof t||t)+" is not observable")}(t,e):t instanceof B?t:new B($(t))}function st(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Number.POSITIVE_INFINITY;return"function"==typeof e?function(i){return i.pipe(st((function(n,i){return ot(t(n,i)).pipe(nt((function(t,r){return e(n,t,i,r)})))}),n))}:("number"==typeof e&&(n=e),function(e){return e.lift(new ut(t,n))})}var ut=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.POSITIVE_INFINITY;_(this,t),this.project=e,this.concurrent=n}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new lt(t,this.project,this.concurrent))}}]),t}(),lt=function(t){f(n,t);var e=v(n);function n(t,i){var r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Number.POSITIVE_INFINITY;return _(this,n),(r=e.call(this,t)).project=i,r.concurrent=a,r.hasCompleted=!1,r.buffer=[],r.active=0,r.index=0,r}return b(n,[{key:"_next",value:function(t){this.active0?this._next(e.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()}}]),n}(et);function ct(t){return t}function dt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Number.POSITIVE_INFINITY;return st(ct,t)}function ht(t,e){return e?at(t,e):new B(K(t))}function ft(){for(var t=Number.POSITIVE_INFINITY,e=null,n=arguments.length,i=new Array(n),r=0;r1&&"number"==typeof i[i.length-1]&&(t=i.pop())):"number"==typeof a&&(t=i.pop()),null===e&&1===i.length&&i[0]instanceof B?i[0]:dt(t)(ht(i,e))}function pt(){return function(t){return t.lift(new mt(t))}}var mt=function(){function t(e){_(this,t),this.connectable=e}return b(t,[{key:"call",value:function(t,e){var n=this.connectable;n._refCount++;var i=new gt(t,n),r=e.subscribe(i);return i.closed||(i.connection=n.connect()),r}}]),t}(),gt=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,t)).connectable=i,r}return b(n,[{key:"_unsubscribe",value:function(){var t=this.connectable;if(t){this.connectable=null;var e=t._refCount;if(e<=0)this.connection=null;else if(t._refCount=e-1,e>1)this.connection=null;else{var n=this.connection,i=t._connection;this.connection=null,!i||n&&i!==n||i.unsubscribe()}}else this.connection=null}}]),n}(P),vt=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this)).source=t,r.subjectFactory=i,r._refCount=0,r._isComplete=!1,r}return b(n,[{key:"_subscribe",value:function(t){return this.getSubject().subscribe(t)}},{key:"getSubject",value:function(){var t=this._subject;return t&&!t.isStopped||(this._subject=this.subjectFactory()),this._subject}},{key:"connect",value:function(){var t=this._connection;return t||(this._isComplete=!1,(t=this._connection=new x).add(this.source.subscribe(new yt(this.getSubject(),this))),t.closed&&(this._connection=null,t=x.EMPTY)),t}},{key:"refCount",value:function(){return pt()(this)}}]),n}(B),_t=function(){var t=vt.prototype;return{operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:t._subscribe},_isComplete:{value:t._isComplete,writable:!0},getSubject:{value:t.getSubject},connect:{value:t.connect},refCount:{value:t.refCount}}}(),yt=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,t)).connectable=i,r}return b(n,[{key:"_error",value:function(t){this._unsubscribe(),r(i(n.prototype),"_error",this).call(this,t)}},{key:"_complete",value:function(){this.connectable._isComplete=!0,this._unsubscribe(),r(i(n.prototype),"_complete",this).call(this)}},{key:"_unsubscribe",value:function(){var t=this.connectable;if(t){this.connectable=null;var e=t._connection;t._refCount=0,t._subject=null,t._connection=null,e&&e.unsubscribe()}}}]),n}(V);function bt(){return new z}function wt(){return function(t){return pt()((e=bt,function(t){var n;n="function"==typeof e?e:function(){return e};var i=Object.create(t,_t);return i.source=t,i.subjectFactory=n,i})(t));var e}}function kt(t){return{toString:t}.toString()}var Mt="__parameters__";function St(t,e,n){return kt((function(){var i=function(t){return function(){if(t){var e=t.apply(void 0,arguments);for(var n in e)this[n]=e[n]}}}(e);function r(){for(var t=arguments.length,e=new Array(t),n=0;n1&&void 0!==arguments[1]?arguments[1]:Tt.Default;if(void 0===fe)throw new Error("inject() must be called from an injection context");return null===fe?ye(t,void 0,e):fe.get(t,e&Tt.Optional?null:void 0,e)}function ve(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Tt.Default;return(oe||ge)(qt(t),e)}var _e=ve;function ye(t,e,n){var i=It(t);if(i&&"root"==i.providedIn)return void 0===i.value?i.value=i.factory():i.value;if(n&Tt.Optional)return null;if(void 0!==e)return e;throw new Error("Injector: NOT_FOUND [".concat(Wt(t),"]"))}function be(t){for(var e=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:le;if(e===le){var n=new Error("NullInjectorError: No provider for ".concat(Wt(t),"!"));throw n.name="NullInjectorError",n}return e}}]),t}();function ke(t,e,n,i){var r=t.ngTempTokenPath;throw e[de]&&r.unshift(e[de]),t.message=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;t=t&&"\n"===t.charAt(0)&&"\u0275"==t.charAt(1)?t.substr(2):t;var r=Wt(e);if(Array.isArray(e))r=e.map(Wt).join(" -> ");else if("object"==typeof e){var a=[];for(var o in e)if(e.hasOwnProperty(o)){var s=e[o];a.push(o+":"+("string"==typeof s?JSON.stringify(s):Wt(s)))}r="{".concat(a.join(", "),"}")}return"".concat(n).concat(i?"("+i+")":"","[").concat(r,"]: ").concat(t.replace(ce,"\n "))}("\n"+t.message,r,n,i),t.ngTokenPath=r,t.ngTempTokenPath=null,t}var Me=function t(){_(this,t)},Se=function t(){_(this,t)};function Ce(t,e){t.forEach((function(t){return Array.isArray(t)?Ce(t,e):e(t)}))}function xe(t,e,n){e>=t.length?t.push(n):t.splice(e,0,n)}function De(t,e){return e>=t.length-1?t.pop():t.splice(e,1)[0]}function Le(t,e){for(var n=[],i=0;i=0?t[1|i]=n:function(t,e,n,i){var r=t.length;if(r==e)t.push(n,i);else if(1===r)t.push(i,t[0]),t[0]=n;else{for(r--,t.push(t[r-1],t[r]);r>e;)t[r]=t[r-2],r--;t[e]=n,t[e+1]=i}}(t,i=~i,e,n),i}function Ee(t,e){var n=Oe(t,e);if(n>=0)return t[1|n]}function Oe(t,e){return function(t,e,n){for(var i=0,r=t.length>>1;r!==i;){var a=i+(r-i>>1),o=t[a<<1];if(e===o)return a<<1;o>e?r=a:i=a+1}return~(r<<1)}(t,e)}var Ae=function(t){return t[t.OnPush=0]="OnPush",t[t.Default=1]="Default",t}({}),Pe=function(t){return t[t.Emulated=0]="Emulated",t[t.Native=1]="Native",t[t.None=2]="None",t[t.ShadowDom=3]="ShadowDom",t}({}),Ie={},Ye=[],Re=0;function Fe(t){return kt((function(){var e={},n={type:t.type,providersResolver:null,decls:t.decls,vars:t.vars,factory:null,template:t.template||null,consts:t.consts||null,ngContentSelectors:t.ngContentSelectors,hostBindings:t.hostBindings||null,hostVars:t.hostVars||0,hostAttrs:t.hostAttrs||null,contentQueries:t.contentQueries||null,declaredInputs:e,inputs:null,outputs:null,exportAs:t.exportAs||null,onPush:t.changeDetection===Ae.OnPush,directiveDefs:null,pipeDefs:null,selectors:t.selectors||Ye,viewQuery:t.viewQuery||null,features:t.features||null,data:t.data||{},encapsulation:t.encapsulation||Pe.Emulated,id:"c",styles:t.styles||Ye,_:null,setInput:null,schemas:t.schemas||null,tView:null},i=t.directives,r=t.features,a=t.pipes;return n.id+=Re++,n.inputs=Ve(t.inputs,e),n.outputs=Ve(t.outputs),r&&r.forEach((function(t){return t(n)})),n.directiveDefs=i?function(){return("function"==typeof i?i():i).map(Be)}:null,n.pipeDefs=a?function(){return("function"==typeof a?a():a).map(je)}:null,n}))}function He(t,e,n){var i=t.\u0275cmp;i.directiveDefs=function(){return e.map(Be)},i.pipeDefs=function(){return n.map(je)}}function Be(t){return qe(t)||function(t){return t[te]||null}(t)}function je(t){return function(t){return t[ee]||null}(t)}var Ne={};function We(t){var e={type:t.type,bootstrap:t.bootstrap||Ye,declarations:t.declarations||Ye,imports:t.imports||Ye,exports:t.exports||Ye,transitiveCompileScopes:null,schemas:t.schemas||null,id:t.id||null};return null!=t.id&&kt((function(){Ne[t.id]=t.type})),e}function Ve(t,e){if(null==t)return Ie;var n={};for(var i in t)if(t.hasOwnProperty(i)){var r=t[i],a=r;Array.isArray(r)&&(a=r[1],r=r[0]),n[r]=i,e&&(e[r]=a)}return n}var ze=Fe;function Ue(t){return{type:t.type,name:t.name,factory:null,pure:!1!==t.pure,onDestroy:t.type.prototype.ngOnDestroy||null}}function qe(t){return t[$t]||null}function Ge(t,e){return t.hasOwnProperty(re)?t[re]:null}function Ke(t,e){var n=t[ne]||null;if(!n&&!0===e)throw new Error("Type ".concat(Wt(t)," does not have '\u0275mod' property."));return n}var Ze=20,Je=10;function Qe(t){return Array.isArray(t)&&"object"==typeof t[1]}function Xe(t){return Array.isArray(t)&&!0===t[1]}function $e(t){return 0!=(8&t.flags)}function tn(t){return 2==(2&t.flags)}function en(t){return 1==(1&t.flags)}function nn(t){return null!==t.template}function rn(t){return 0!=(512&t[2])}function an(t){return"string"==typeof t?t:null==t?"":""+t}function on(t){return"function"==typeof t?t.name||t.toString():"object"==typeof t&&null!=t&&"function"==typeof t.type?t.type.name||t.type.toString():an(t)}var sn=function(){return("undefined"!=typeof requestAnimationFrame&&requestAnimationFrame||setTimeout).bind(Xt)}();function un(t){return{name:"window",target:t.ownerDocument.defaultView}}function ln(t){return{name:"body",target:t.ownerDocument.body}}function cn(t){return t instanceof Function?t():t}function dn(t,e){var n=e?" in ".concat(e):"";throw new Error("No provider for ".concat(on(t)," found").concat(n))}var hn=function(){function t(e,n,i){_(this,t),this.previousValue=e,this.currentValue=n,this.firstChange=i}return b(t,[{key:"isFirstChange",value:function(){return this.firstChange}}]),t}();function fn(){return pn}function pn(t){return t.type.prototype.ngOnChanges&&(t.setInput=gn),mn}function mn(){var t=vn(this),e=null==t?void 0:t.current;if(e){var n=t.previous;if(n===Ie)t.previous=e;else for(var i in e)n[i]=e[i];t.current=null,this.ngOnChanges(e)}}function gn(t,e,n,i){var r=vn(t)||function(t,e){return t.__ngSimpleChanges__=e}(t,{previous:Ie,current:null}),a=r.current||(r.current={}),o=r.previous,s=this.declaredInputs[n],u=o[s];a[s]=new hn(u&&u.currentValue,e,o===Ie),t[i]=e}function vn(t){return t.__ngSimpleChanges__||null}fn.ngInherit=!0;var _n="http://www.w3.org/2000/svg",yn=void 0;function bn(){return void 0!==yn?yn:"undefined"!=typeof document?document:void 0}function wn(t){return!!t.listen}var kn={createRenderer:function(t,e){return bn()}};function Mn(t){for(;Array.isArray(t);)t=t[0];return t}function Sn(t,e){return Mn(e[t+Ze])}function Cn(t,e){return Mn(e[t.index])}function xn(t,e){return t.data[e+Ze]}function Dn(t,e){return t[e+Ze]}function Ln(t,e){var n=e[t];return Qe(n)?n:n[0]}function Tn(t){var e=function(t){return t.__ngContext__||null}(t);return e?Array.isArray(e)?e:e.lView:null}function En(t){return 4==(4&t[2])}function On(t){return 128==(128&t[2])}function An(t,e){return null===t||null==e?null:t[e]}function Pn(t){t[18]=0}function In(t,e){t[5]+=e;for(var n=t,i=t[3];null!==i&&(1===e&&1===n[5]||-1===e&&0===n[5]);)i[5]+=e,n=i,i=i[3]}var Yn={lFrame:ri(null),bindingsEnabled:!0,isInCheckNoChangesMode:!1};function Rn(){return Yn.bindingsEnabled}function Fn(){return Yn.lFrame.lView}function Hn(){return Yn.lFrame.tView}function Bn(t){Yn.lFrame.contextLView=t}function jn(){return Yn.lFrame.currentTNode}function Nn(t,e){Yn.lFrame.currentTNode=t,Yn.lFrame.isParent=e}function Wn(){return Yn.lFrame.isParent}function Vn(){Yn.lFrame.isParent=!1}function zn(){return Yn.isInCheckNoChangesMode}function Un(t){Yn.isInCheckNoChangesMode=t}function qn(){var t=Yn.lFrame,e=t.bindingRootIndex;return-1===e&&(e=t.bindingRootIndex=t.tView.bindingStartIndex),e}function Gn(){return Yn.lFrame.bindingIndex}function Kn(){return Yn.lFrame.bindingIndex++}function Zn(t){var e=Yn.lFrame,n=e.bindingIndex;return e.bindingIndex=e.bindingIndex+t,n}function Jn(t,e){var n=Yn.lFrame;n.bindingIndex=n.bindingRootIndex=t,Qn(e)}function Qn(t){Yn.lFrame.currentDirectiveIndex=t}function Xn(t){var e=Yn.lFrame.currentDirectiveIndex;return-1===e?null:t[e]}function $n(){return Yn.lFrame.currentQueryIndex}function ti(t){Yn.lFrame.currentQueryIndex=t}function ei(t,e){var n=ii();Yn.lFrame=n,n.currentTNode=e,n.lView=t}function ni(t){var e=ii(),n=t[1];Yn.lFrame=e,e.currentTNode=n.firstChild,e.lView=t,e.tView=n,e.contextLView=t,e.bindingIndex=n.bindingStartIndex}function ii(){var t=Yn.lFrame,e=null===t?null:t.child;return null===e?ri(t):e}function ri(t){var e={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:0,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:t,child:null};return null!==t&&(t.child=e),e}function ai(){var t=Yn.lFrame;return Yn.lFrame=t.parent,t.currentTNode=null,t.lView=null,t}var oi=ai;function si(){var t=ai();t.isParent=!0,t.tView=null,t.selectedIndex=0,t.contextLView=null,t.elementDepthCount=0,t.currentDirectiveIndex=-1,t.currentNamespace=null,t.bindingRootIndex=-1,t.bindingIndex=-1,t.currentQueryIndex=0}function ui(t){return(Yn.lFrame.contextLView=function(t,e){for(;t>0;)e=e[15],t--;return e}(t,Yn.lFrame.contextLView))[8]}function li(){return Yn.lFrame.selectedIndex}function ci(t){Yn.lFrame.selectedIndex=t}function di(){var t=Yn.lFrame;return xn(t.tView,t.selectedIndex)}function hi(){Yn.lFrame.currentNamespace=_n}function fi(){Yn.lFrame.currentNamespace=null}function pi(t,e){for(var n=e.directiveStart,i=e.directiveEnd;n=i)break}else e[o]<0&&(t[18]+=65536),(a>11>16&&(3&t[2])===e&&(t[2]+=2048,a.call(o)):a.call(o)}var bi=-1,wi=function t(e,n,i){_(this,t),this.factory=e,this.resolving=!1,this.canSeeViewProviders=n,this.injectImpl=i};function ki(t,e,n){for(var i=wn(t),r=0;re){o=a-1;break}}}for(;a>16,i=e;n>0;)i=i[15],n--;return i}var Ei=!0;function Oi(t){var e=Ei;return Ei=t,e}var Ai=0;function Pi(t,e){var n=Yi(t,e);if(-1!==n)return n;var i=e[1];i.firstCreatePass&&(t.injectorIndex=e.length,Ii(i.data,t),Ii(e,null),Ii(i.blueprint,null));var r=Ri(t,e),a=t.injectorIndex;if(Di(r))for(var o=Li(r),s=Ti(r,e),u=s[1].data,l=0;l<8;l++)e[a+l]=s[o+l]|u[o+l];return e[a+8]=r,a}function Ii(t,e){t.push(0,0,0,0,0,0,0,0,e)}function Yi(t,e){return-1===t.injectorIndex||t.parent&&t.parent.injectorIndex===t.injectorIndex||null===e[t.injectorIndex+8]?-1:t.injectorIndex}function Ri(t,e){if(t.parent&&-1!==t.parent.injectorIndex)return t.parent.injectorIndex;for(var n=0,i=null,r=e;null!==r;){var a=r[1],o=a.type;if(null===(i=2===o?a.declTNode:1===o?r[6]:null))return bi;if(n++,r=r[15],-1!==i.injectorIndex)return i.injectorIndex|n<<16}return bi}function Fi(t,e,n){!function(t,e,n){var i;"string"==typeof n?i=n.charCodeAt(0)||0:n.hasOwnProperty(ae)&&(i=n[ae]),null==i&&(i=n[ae]=Ai++);var r=255&i,a=1<3&&void 0!==arguments[3]?arguments[3]:Tt.Default,r=arguments.length>4?arguments[4]:void 0;if(null!==t){var a=Vi(n);if("function"==typeof a){ei(e,t);try{var o=a();if(null!=o||i&Tt.Optional)return o;dn(n)}finally{oi()}}else if("number"==typeof a){if(-1===a)return new qi(t,e);var s=null,u=Yi(t,e),l=bi,c=i&Tt.Host?e[16][6]:null;for((-1===u||i&Tt.SkipSelf)&&((l=-1===u?Ri(t,e):e[u+8])!==bi&&Ui(i,!1)?(s=e[1],u=Li(l),e=Ti(l,e)):u=-1);-1!==u;){var d=e[1];if(zi(a,u,d.data)){var h=ji(u,e,n,s,i,c);if(h!==Bi)return h}(l=e[u+8])!==bi&&Ui(i,e[1].data[u+8]===c)&&zi(a,u,e)?(s=d,u=Li(l),e=Ti(l,e)):u=-1}}}if(i&Tt.Optional&&void 0===r&&(r=null),0==(i&(Tt.Self|Tt.Host))){var f=e[9],p=me(void 0);try{return f?f.get(n,r,i&Tt.Optional):ye(n,r,i&Tt.Optional)}finally{me(p)}}if(i&Tt.Optional)return r;dn(n,"NodeInjector")}var Bi={};function ji(t,e,n,i,r,a){var o=e[1],s=o.data[t+8],u=Ni(s,o,n,null==i?tn(s)&&Ei:i!=o&&2===s.type,r&Tt.Host&&a===s);return null!==u?Wi(e,o,u,s):Bi}function Ni(t,e,n,i,r){for(var a=t.providerIndexes,o=e.data,s=1048575&a,u=t.directiveStart,l=a>>20,c=r?s+l:t.directiveEnd,d=i?s:s+l;d=u&&h.type===n)return d}if(r){var f=o[u];if(f&&nn(f)&&f.type===n)return u}return null}function Wi(t,e,n,i){var r=t[n],a=e.data;if(r instanceof wi){var o=r;o.resolving&&function(t,e){throw new Error("Circular dependency in DI detected for ".concat(t).concat(""))}(on(a[n]));var s=Oi(o.canSeeViewProviders);o.resolving=!0;var u=o.injectImpl?me(o.injectImpl):null;ei(t,i);try{r=t[n]=o.factory(void 0,a,t,i),e.firstCreatePass&&n>=i.directiveStart&&function(t,e,n){var i=e.type.prototype,r=i.ngOnInit,a=i.ngDoCheck;if(i.ngOnChanges){var o=pn(e);(n.preOrderHooks||(n.preOrderHooks=[])).push(t,o),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(t,o)}r&&(n.preOrderHooks||(n.preOrderHooks=[])).push(0-t,r),a&&((n.preOrderHooks||(n.preOrderHooks=[])).push(t,a),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(t,a))}(n,a[n],e)}finally{null!==u&&me(u),Oi(s),o.resolving=!1,oi()}}return r}function Vi(t){if("string"==typeof t)return t.charCodeAt(0)||0;var e=t.hasOwnProperty(ae)?t[ae]:void 0;return"number"==typeof e&&e>0?255&e:e}function zi(t,e,n){var i=64&t,r=32&t;return!!((128&t?i?r?n[e+7]:n[e+6]:r?n[e+5]:n[e+4]:i?r?n[e+3]:n[e+2]:r?n[e+1]:n[e])&1<1?e-1:0),i=1;i"),!0}},{key:"endElement",value:function(t){var e=t.nodeName.toLowerCase();Mr.hasOwnProperty(e)&&!yr.hasOwnProperty(e)&&(this.buf.push(""))}},{key:"chars",value:function(t){this.buf.push(Or(t))}},{key:"checkClobberedElement",value:function(t,e){if(e&&(t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_CONTAINED_BY)===Node.DOCUMENT_POSITION_CONTAINED_BY)throw new Error("Failed to sanitize html because the element is clobbered: ".concat(t.outerHTML));return e}}]),t}(),Tr=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Er=/([^\#-~ |!])/g;function Or(t){return t.replace(/&/g,"&").replace(Tr,(function(t){return"&#"+(1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536)+";"})).replace(Er,(function(t){return"&#"+t.charCodeAt(0)+";"})).replace(//g,">")}function Ar(t,e){var n=null;try{_r=_r||function(t){return function(){try{return!!(new window.DOMParser).parseFromString("","text/html")}catch(t){return!1}}()?new dr:new hr(t)}(t);var i=e?String(e):"";n=_r.getInertBodyElement(i);var r=5,a=i;do{if(0===r)throw new Error("Failed to sanitize html because the input is unstable");r--,i=a,a=n.innerHTML,n=_r.getInertBodyElement(i)}while(i!==a);var o=new Lr,s=o.sanitizeChildren(Pr(n)||n);return cr()&&o.sanitizedSomething&&console.warn("WARNING: sanitizing HTML stripped some content, see http://g.co/ng/security#xss"),s}finally{if(n)for(var u=Pr(n)||n;u.firstChild;)u.removeChild(u.firstChild)}}function Pr(t){return"content"in t&&function(t){return t.nodeType===Node.ELEMENT_NODE&&"TEMPLATE"===t.nodeName}(t)?t.content:null}var Ir=function(t){return t[t.NONE=0]="NONE",t[t.HTML=1]="HTML",t[t.STYLE=2]="STYLE",t[t.SCRIPT=3]="SCRIPT",t[t.URL=4]="URL",t[t.RESOURCE_URL=5]="RESOURCE_URL",t}({});function Yr(t){var e=Fr();return e?e.sanitize(Ir.HTML,t)||"":or(t,"HTML")?ar(t):Ar(bn(),an(t))}function Rr(t){var e=Fr();return e?e.sanitize(Ir.URL,t)||"":or(t,"URL")?ar(t):mr(an(t))}function Fr(){var t=Fn();return t&&t[12]}function Hr(t,e){t.__ngContext__=e}function Br(t,e,n){for(var i=t.length;;){var r=t.indexOf(e,n);if(-1===r)return r;if(0===r||t.charCodeAt(r-1)<=32){var a=e.length;if(r+a===i||t.charCodeAt(r+a)<=32)return r}n=r+1}}var jr="ng-template";function Nr(t,e,n){for(var i=0;ia?"":r[c+1].toLowerCase();var h=8&i?d:null;if(h&&-1!==Br(h,l,0)||2&i&&l!==d){if(Ur(i))return!1;o=!0}}}}else{if(!o&&!Ur(i)&&!Ur(u))return!1;if(o&&Ur(u))continue;o=!1,i=u|1&i}}return Ur(i)||o}function Ur(t){return 0==(1&t)}function qr(t,e,n,i){if(null===e)return-1;var r=0;if(i||!n){for(var a=!1;r-1)for(n++;n2&&void 0!==arguments[2]&&arguments[2],i=0;i0?'="'+s+'"':"")+"]"}else 8&i?r+="."+o:4&i&&(r+=" "+o);else""===r||Ur(o)||(e+=Zr(a,r),r=""),i=o,a=a||!Ur(i);n++}return""!==r&&(e+=Zr(a,r)),e}var Qr={};function Xr(t){var e=t[3];return Xe(e)?e[3]:e}function $r(t){return ea(t[13])}function ta(t){return ea(t[4])}function ea(t){for(;null!==t&&!Xe(t);)t=t[4];return t}function na(t){ia(Hn(),Fn(),li()+t,zn())}function ia(t,e,n,i){if(!i)if(3==(3&e[2])){var r=t.preOrderCheckHooks;null!==r&&mi(e,r,n)}else{var a=t.preOrderHooks;null!==a&&gi(e,a,0,n)}ci(n)}function ra(t,e){return t<<17|e<<2}function aa(t){return t>>17&32767}function oa(t){return 2|t}function sa(t){return(131068&t)>>2}function ua(t,e){return-131069&t|e<<2}function la(t){return 1|t}function ca(t,e){var n=t.contentQueries;if(null!==n)for(var i=0;iZe&&ia(t,e,0,zn()),n(i,r)}finally{ci(a)}}function _a(t,e,n){if($e(e))for(var i=e.directiveEnd,r=e.directiveStart;r2&&void 0!==arguments[2]?arguments[2]:Cn,i=e.localNames;if(null!==i)for(var r=e.index+1,a=0;a0&&function t(e){for(var n=$r(e);null!==n;n=ta(n))for(var i=Je;i0&&t(r)}var o=e[1].components;if(null!==o)for(var s=0;s0&&t(u)}}(n)}}function ja(t,e){var n=Ln(e,t),i=n[1];!function(t,e){for(var n=e.length;n0&&(t[i-1][4]=r[4]);var o=De(t,Je+e);fo(r[1],n=r,n[11],2,null,null),n[0]=null,n[6]=null;var s=o[19];null!==s&&s.detachView(o[1]),r[3]=null,r[4]=null,r[2]&=-129}return r}}function no(t,e){if(!(256&e[2])){var n=e[11];wn(n)&&n.destroyNode&&fo(t,e,n,3,null,null),function(t){var e=t[13];if(!e)return io(t[1],t);for(;e;){var n=null;if(Qe(e))n=e[13];else{var i=e[10];i&&(n=i)}if(!n){for(;e&&!e[4]&&e!==t;)Qe(e)&&io(e[1],e),e=e[3];null===e&&(e=t),Qe(e)&&io(e[1],e),n=e&&e[4]}e=n}}(e)}}function io(t,e){if(!(256&e[2])){e[2]&=-129,e[2]|=256,function(t,e){var n;if(null!=t&&null!=(n=t.destroyHooks))for(var i=0;i=0?i[s]():i[-s].unsubscribe(),r+=2}else n[r].call(i[n[r+1]]);e[7]=null}}(t,e),1===e[1].type&&wn(e[11])&&e[11].destroy();var n=e[17];if(null!==n&&Xe(e[3])){n!==e[3]&&to(n,e);var i=e[19];null!==i&&i.detachView(t)}}}function ro(t,e,n){for(var i=e.parent;null!=i&&(3===i.type||4===i.type);)i=(e=i).parent;if(null===i)return n[0];if(e&&4===e.type&&4&e.flags)return Cn(e,n).parentNode;if(2&i.flags){var r=t.data,a=r[r[i.index].directiveStart].encapsulation;if(a!==Pe.ShadowDom&&a!==Pe.Native)return null}return Cn(i,n)}function ao(t,e,n,i){wn(t)?t.insertBefore(e,n,i):e.insertBefore(n,i,!0)}function oo(t,e,n){wn(t)?t.appendChild(e,n):e.appendChild(n)}function so(t,e,n,i){null!==i?ao(t,e,n,i):oo(t,e,n)}function uo(t,e){return wn(t)?t.parentNode(e):e.parentNode}function lo(t,e){return 3===t.type||4===t.type?Cn(t,e):null}function co(t,e,n,i){var r=ro(t,i,e);if(null!=r){var a=e[11],o=lo(i.parent||e[6],e);if(Array.isArray(n))for(var s=0;s-1&&this._viewContainerRef.detach(t),this._viewContainerRef=null}no(this._lView[1],this._lView)}},{key:"onDestroy",value:function(t){Ma(this._lView[1],this._lView,null,t)}},{key:"markForCheck",value:function(){Wa(this._cdRefInjectingView||this._lView)}},{key:"detach",value:function(){this._lView[2]&=-129}},{key:"reattach",value:function(){this._lView[2]|=128}},{key:"detectChanges",value:function(){Va(this._lView[1],this._lView,this.context)}},{key:"checkNoChanges",value:function(){!function(t,e,n){Un(!0);try{Va(t,e,n)}finally{Un(!1)}}(this._lView[1],this._lView,this.context)}},{key:"attachToViewContainerRef",value:function(t){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._viewContainerRef=t}},{key:"detachFromAppRef",value:function(){var t;this._appRef=null,fo(this._lView[1],t=this._lView,t[11],2,null,null)}},{key:"attachToAppRef",value:function(t){if(this._viewContainerRef)throw new Error("This view is already attached to a ViewContainer!");this._appRef=t}},{key:"rootNodes",get:function(){var t=this._lView,e=t[1];return function t(e,n,i,r){for(var a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];null!==i;){var o=n[i.index];if(null!==o&&r.push(Mn(o)),Xe(o))for(var s=Je;s0;)this.remove(this.length-1)}},{key:"get",value:function(t){return null!==this._lContainer[8]&&this._lContainer[8][t]||null}},{key:"createEmbeddedView",value:function(t,e,n){var i=t.createEmbeddedView(e||{});return this.insert(i,n),i}},{key:"createComponent",value:function(t,e,n,i,r){var a=n||this.parentInjector;if(!r&&null==t.ngModule&&a){var o=a.get(Me,null);o&&(r=o)}var s=t.create(a,i,void 0,r);return this.insert(s.hostView,e),s}},{key:"insert",value:function(t,e){var n=t._lView,i=n[1];if(t.destroyed)throw new Error("Cannot insert a destroyed View in a ViewContainer!");if(this.allocateContainerIfNeeded(),Xe(n[3])){var r=this.indexOf(t);if(-1!==r)this.detach(r);else{var a=n[3],o=new bo(a,a[6],a[3]);o.detach(o.indexOf(t))}}var s=this._adjustIndex(e),u=this._lContainer;!function(t,e,n,i){var r=Je+i,a=n.length;i>0&&(n[r-1][4]=e),i1&&void 0!==arguments[1]?arguments[1]:0;return null==t?this.length+e:t}},{key:"allocateContainerIfNeeded",value:function(){null===this._lContainer[8]&&(this._lContainer[8]=[])}},{key:"element",get:function(){return Mo(e,this._hostTNode,this._hostView)}},{key:"injector",get:function(){return new qi(this._hostTNode,this._hostView)}},{key:"parentInjector",get:function(){var t=Ri(this._hostTNode,this._hostView);if(Di(t)){var e=Ti(t,this._hostView),n=Li(t);return new qi(e[1].data[n+8],e)}return new qi(null,this._hostView)}},{key:"length",get:function(){return this._lContainer.length-Je}}]),i}(t));var a=i[n.index];if(Xe(a))r=a;else{var o;if(3===n.type)o=Mn(a);else if(o=i[11].createComment(""),rn(i)){var s=i[11],u=Cn(n,i);ao(s,uo(s,u),o,function(t,e){return wn(t)?t.nextSibling(e):e.nextSibling}(s,u))}else co(i[1],i,o,n);i[n.index]=r=Ha(a,i,o,n),Na(i,r)}return new bo(r,n,i)}function xo(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Do(jn(),Fn(),t)}function Do(t,e,n){if(!n&&tn(t)){var i=Ln(t.index,e);return new wo(i,i)}return 2===t.type||0===t.type||3===t.type||4===t.type?new wo(e[16],e):null}var Lo=function(){var t=function t(){_(this,t)};return t.__NG_ELEMENT_ID__=function(){return To()},t}(),To=xo,Eo=Function,Oo=new se("Set Injector scope."),Ao={},Po={},Io=[],Yo=void 0;function Ro(){return void 0===Yo&&(Yo=new we),Yo}function Fo(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3?arguments[3]:void 0;return new Ho(t,n,e||Ro(),i)}var Ho=function(){function t(e,n,i){var r=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;_(this,t),this.parent=i,this.records=new Map,this.injectorDefTypes=new Set,this.onDestroy=new Set,this._destroyed=!1;var o=[];n&&Ce(n,(function(t){return r.processProvider(t,e,n)})),Ce([e],(function(t){return r.processInjectorType(t,[],o)})),this.records.set(ue,No(void 0,this));var s=this.records.get(Oo);this.scope=null!=s?s.value:null,this.source=a||("object"==typeof e?null:Wt(e))}return b(t,[{key:"destroy",value:function(){this.assertNotDestroyed(),this._destroyed=!0;try{this.onDestroy.forEach((function(t){return t.ngOnDestroy()}))}finally{this.records.clear(),this.onDestroy.clear(),this.injectorDefTypes.clear()}}},{key:"get",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:le,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Tt.Default;this.assertNotDestroyed();var i=pe(this);try{if(!(n&Tt.SkipSelf)){var r=this.records.get(t);if(void 0===r){var a=zo(t)&&It(t);r=a&&this.injectableDefInScope(a)?No(Bo(t),Ao):null,this.records.set(t,r)}if(null!=r)return this.hydrate(t,r)}var o=n&Tt.Self?Ro():this.parent;return o.get(t,e=n&Tt.Optional&&e===le?null:e)}catch(u){if("NullInjectorError"===u.name){var s=u.ngTempTokenPath=u.ngTempTokenPath||[];if(s.unshift(Wt(t)),i)throw u;return ke(u,t,"R3InjectorError",this.source)}throw u}finally{pe(i)}}},{key:"_resolveInjectorDefTypes",value:function(){var t=this;this.injectorDefTypes.forEach((function(e){return t.get(e)}))}},{key:"toString",value:function(){var t=[];return this.records.forEach((function(e,n){return t.push(Wt(n))})),"R3Injector[".concat(t.join(", "),"]")}},{key:"assertNotDestroyed",value:function(){if(this._destroyed)throw new Error("Injector has already been destroyed.")}},{key:"processInjectorType",value:function(t,e,n){var i=this;if(!(t=qt(t)))return!1;var r=Rt(t),a=null==r&&t.ngModule||void 0,o=void 0===a?t:a,s=-1!==n.indexOf(o);if(void 0!==a&&(r=Rt(a)),null==r)return!1;if(null!=r.imports&&!s){var u;n.push(o);try{Ce(r.imports,(function(t){i.processInjectorType(t,e,n)&&(void 0===u&&(u=[]),u.push(t))}))}finally{}if(void 0!==u)for(var l=function(t){var e=u[t],n=e.ngModule,r=e.providers;Ce(r,(function(t){return i.processProvider(t,n,r||Io)}))},c=0;c0){var n=Le(e,"?");throw new Error("Can't resolve all parameters for ".concat(Wt(t),": (").concat(n.join(", "),")."))}var i=function(t){var e=t&&(t[Ft]||t[jt]||t[Bt]&&t[Bt]());if(e){var n=function(t){if(t.hasOwnProperty("name"))return t.name;var e=(""+t).match(/^function\s*([^\s(]+)/);return null===e?"":e[1]}(t);return console.warn('DEPRECATED: DI is instantiating a token "'.concat(n,'" that inherits its @Injectable decorator but does not provide one itself.\n')+'This will become an error in a future version of Angular. Please add @Injectable() to the "'.concat(n,'" class.')),e}return null}(t);return null!==i?function(){return i.factory(t)}:function(){return new t}}(t);throw new Error("unreachable")}function jo(t,e,n){var i,r=void 0;if(Vo(t)){var a=qt(t);return Ge(a)||Bo(a)}if(Wo(t))r=function(){return qt(t.useValue)};else if((i=t)&&i.useFactory)r=function(){return t.useFactory.apply(t,l(be(t.deps||[])))};else if(function(t){return!(!t||!t.useExisting)}(t))r=function(){return ve(qt(t.useExisting))};else{var o=qt(t&&(t.useClass||t.provide));if(!function(t){return!!t.deps}(t))return Ge(o)||Bo(o);r=function(){return w(o,l(be(t.deps)))}}return r}function No(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return{factory:t,value:e,multi:n?[]:void 0}}function Wo(t){return null!==t&&"object"==typeof t&&he in t}function Vo(t){return"function"==typeof t}function zo(t){return"function"==typeof t||"object"==typeof t&&t instanceof se}var Uo=function(t,e,n){return function(t){var e=Fo(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,arguments.length>3?arguments[3]:void 0);return e._resolveInjectorDefTypes(),e}({name:n},e,t,n)},qo=function(){var t=function(){function t(){_(this,t)}return b(t,null,[{key:"create",value:function(t,e){return Array.isArray(t)?Uo(t,e,""):Uo(t.providers,t.parent,t.name||"")}}]),t}();return t.THROW_IF_NOT_FOUND=le,t.NULL=new we,t.\u0275prov=At({token:t,providedIn:"any",factory:function(){return ve(ue)}}),t.__NG_ELEMENT_ID__=-1,t}(),Go=new se("AnalyzeForEntryComponents");function Ko(t,e,n){var i=n?t.styles:null,r=n?t.classes:null,a=0;if(null!==e)for(var o=0;o=0;i--){var r=t[i];r.hostVars=e+=r.hostVars,r.hostAttrs=Ci(r.hostAttrs,n=Ci(n,r.hostAttrs))}}(i)}function Qo(t){return t===Ie?{}:t===Ye?[]:t}function Xo(t,e){var n=t.viewQuery;t.viewQuery=n?function(t,i){e(t,i),n(t,i)}:e}function $o(t,e){var n=t.contentQueries;t.contentQueries=n?function(t,i,r){e(t,i,r),n(t,i,r)}:e}function ts(t,e){var n=t.hostBindings;t.hostBindings=n?function(t,i){e(t,i),n(t,i)}:e}var es=null;function ns(){if(!es){var t=Xt.Symbol;if(t&&t.iterator)es=t.iterator;else for(var e=Object.getOwnPropertyNames(Map.prototype),n=0;n1&&void 0!==arguments[1]?arguments[1]:Tt.Default,n=Fn();if(null===n)return ve(t,e);var i=jn();return Hi(i,n,qt(t),e)}function vs(t){return function(t,e){if("class"===e)return t.classes;if("style"===e)return t.styles;var n=t.attrs;if(n)for(var i=n.length,r=0;r2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3?arguments[3]:void 0,r=Fn(),a=Hn(),o=jn();return As(a,r,r[11],o,t,e,n,i),Ts}function Es(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3?arguments[3]:void 0,r=jn(),a=Fn(),o=Hn(),s=Xn(o.data),u=Ka(s,r,a);return As(o,a,u,r,t,e,n,i),Es}function Os(t,e,n,i){var r=t.cleanup;if(null!=r)for(var a=0;au?s[u]:null}"string"==typeof o&&(a+=2)}return null}function As(t,e,n,i,r,a){var o=arguments.length>6&&void 0!==arguments[6]&&arguments[6],s=arguments.length>7?arguments[7]:void 0,u=en(i),l=t.firstCreatePass,c=l&&(t.cleanup||(t.cleanup=[])),d=Ga(e),h=!0;if(2===i.type){var f=Cn(i,e),p=s?s(f):Ie,m=p.target||f,g=d.length,v=s?function(t){return s(Mn(t[i.index])).target}:i.index;if(wn(n)){var _=null;if(!s&&u&&(_=Os(t,e,r,i.index)),null!==_){var y=_.__ngLastListenerFn__||_;y.__ngNextListenerFn__=a,_.__ngLastListenerFn__=a,h=!1}else{a=Is(i,e,a,!1);var b=n.listen(p.name||m,r,a);d.push(a,b),c&&c.push(r,v,g,g+1)}}else a=Is(i,e,a,!0),m.addEventListener(r,a,o),d.push(a),c&&c.push(r,v,g,o)}var w,k=i.outputs;if(h&&null!==k&&(w=k[r])){var M=w.length;if(M)for(var S=0;S0&&void 0!==arguments[0]?arguments[0]:1;return ui(t)}function Rs(t,e){for(var n=null,i=function(t){var e=t.attrs;if(null!=e){var n=e.indexOf(5);if(0==(1&n))return e[n+1]}return null}(t),r=0;r1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0,i=Fn(),r=Hn(),a=fa(r,t,1,null,n||null);null===a.projection&&(a.projection=e),Vn(),po(r,i,a)}function Bs(t,e,n){return js(t,"",e,"",n),Bs}function js(t,e,n,i,r){var a=Fn(),o=hs(a,e,n,i);return o!==Qr&&Ca(Hn(),di(),a,t,o,a[11],r,!1),js}function Ns(t,e,n,i,r,a,o,s,u){var l=Fn(),c=fs(l,e,n,i,r,a,o,s);return c!==Qr&&Ca(Hn(),di(),l,t,c,l[11],u,!1),Ns}var Ws=[];function Vs(t,e,n,i,r){for(var a=t[n+1],o=null===e,s=i?aa(a):sa(a),u=!1;0!==s&&(!1===u||o);){var l=t[s+1];zs(t[s],e)&&(u=!0,t[s+1]=i?la(l):oa(l)),s=i?aa(l):sa(l)}u&&(t[n+1]=i?oa(a):la(a))}function zs(t,e){return null===t||null==e||(Array.isArray(t)?t[1]:t)===e||!(!Array.isArray(t)||"string"!=typeof e)&&Oe(t,e)>=0}var Us={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function qs(t){return t.substring(Us.key,Us.keyEnd)}function Gs(t,e){var n=Us.textEnd;return n===e?-1:(e=Us.keyEnd=function(t,e,n){for(;e32;)e++;return e}(t,Us.key=e,n),Ks(t,e,n))}function Ks(t,e,n){for(;e=0;n=Gs(e,n))Te(t,qs(e),!0)}function Xs(t,e,n,i){var r=Fn(),a=Hn(),o=Zn(2);a.firstUpdatePass&&eu(a,t,o,i),e!==Qr&&ss(r,o,e)&&ru(a,a.data[li()+Ze],r,r[11],t,r[o+1]=function(t,e){return null==t||("string"==typeof e?t+=e:"object"==typeof t&&(t=Wt(ar(t)))),t}(e,n),i,o)}function $s(t,e,n,i){var r=Hn(),a=Zn(2);r.firstUpdatePass&&eu(r,null,a,i);var o=Fn();if(n!==Qr&&ss(o,a,n)){var s=r.data[li()+Ze];if(su(s,i)&&!tu(r,a)){var u=i?s.classesWithoutHost:s.stylesWithoutHost;null!==u&&(n=Vt(u,n||"")),ys(r,s,o,n,i)}else!function(t,e,n,i,r,a,o,s){r===Qr&&(r=Ws);for(var u=0,l=0,c=0=t.expandoStartIndex}function eu(t,e,n,i){var r=t.data;if(null===r[n+1]){var a=r[li()+Ze],o=tu(t,n);su(a,i)&&null===e&&!o&&(e=!1),e=function(t,e,n,i){var r=Xn(t),a=i?e.residualClasses:e.residualStyles;if(null===r)0===(i?e.classBindings:e.styleBindings)&&(n=iu(n=nu(null,t,e,n,i),e.attrs,i),a=null);else{var o=e.directiveStylingLast;if(-1===o||t[o]!==r)if(n=nu(r,t,e,n,i),null===a){var s=function(t,e,n){var i=n?e.classBindings:e.styleBindings;if(0!==sa(i))return t[aa(i)]}(t,e,i);void 0!==s&&Array.isArray(s)&&function(t,e,n,i){t[aa(n?e.classBindings:e.styleBindings)]=i}(t,e,i,s=iu(s=nu(null,t,e,s[1],i),e.attrs,i))}else a=function(t,e,n){for(var i=void 0,r=e.directiveEnd,a=1+e.directiveStylingLast;a0)&&(c=!0):l=n,r)if(0!==u){var d=aa(t[s+1]);t[i+1]=ra(d,s),0!==d&&(t[d+1]=ua(t[d+1],i)),t[s+1]=131071&t[s+1]|i<<17}else t[i+1]=ra(s,0),0!==s&&(t[s+1]=ua(t[s+1],i)),s=i;else t[i+1]=ra(u,0),0===s?s=i:t[u+1]=ua(t[u+1],i),u=i;c&&(t[i+1]=oa(t[i+1])),Vs(t,l,i,!0),Vs(t,l,i,!1),function(t,e,n,i,r){var a=r?t.residualClasses:t.residualStyles;null!=a&&"string"==typeof e&&Oe(a,e)>=0&&(n[i+1]=la(n[i+1]))}(e,l,t,i,a),o=ra(s,u),a?e.classBindings=o:e.styleBindings=o}(r,a,e,n,o,i)}}function nu(t,e,n,i,r){var a=null,o=n.directiveEnd,s=n.directiveStylingLast;for(-1===s?s=n.directiveStart:s++;s0;){var u=t[r],l=Array.isArray(u),c=l?u[1]:u,d=null===c,h=n[r+1];h===Qr&&(h=d?Ws:void 0);var f=d?Ee(h,i):c===i?h:void 0;if(l&&!ou(f)&&(f=Ee(u,i)),ou(f)&&(s=f,o))return s;var p=t[r+1];r=o?aa(p):sa(p)}if(null!==e){var m=a?e.residualClasses:e.residualStyles;null!=m&&(s=Ee(m,i))}return s}function ou(t){return void 0!==t}function su(t,e){return 0!=(t.flags&(e?16:32))}function uu(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=Fn(),i=Hn(),r=t+Ze,a=i.firstCreatePass?fa(i,t,2,null,null):i.data[r],o=n[r]=$a(e,n[11]);co(i,n,o,a),Nn(a,!1)}function lu(t){return cu("",t,""),lu}function cu(t,e,n){var i=Fn(),r=hs(i,t,e,n);return r!==Qr&&Qa(i,li(),r),cu}function du(t,e,n,i,r){var a=Fn(),o=function(t,e,n,i,r,a){var o=us(t,Gn(),n,r);return Zn(2),o?e+an(n)+i+an(r)+a:Qr}(a,t,e,n,i,r);return o!==Qr&&Qa(a,li(),o),du}function hu(t,e,n,i,r,a,o){var s=Fn(),u=fs(s,t,e,n,i,r,a,o);return u!==Qr&&Qa(s,li(),u),hu}function fu(t,e,n,i,r,a,o,s,u){var l=Fn(),c=function(t,e,n,i,r,a,o,s,u,l){var c=cs(t,Gn(),n,r,o,u);return Zn(4),c?e+an(n)+i+an(r)+a+an(o)+s+an(u)+l:Qr}(l,t,e,n,i,r,a,o,s,u);return c!==Qr&&Qa(l,li(),c),fu}function pu(t,e,n){$s(Te,Qs,hs(Fn(),t,e,n),!0)}function mu(t,e,n){var i=Fn();return ss(i,Kn(),e)&&Ca(Hn(),di(),i,t,e,i[11],n,!0),mu}function gu(t,e,n){var i=Fn();if(ss(i,Kn(),e)){var r=Hn(),a=di();Ca(r,a,i,t,e,Ka(Xn(r.data),a,i),n,!0)}return gu}var vu=void 0,_u=["en",[["a","p"],["AM","PM"],vu],[["AM","PM"],vu,vu],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],vu,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],vu,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",vu,"{1} 'at' {0}",vu],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"USD","$","US Dollar",{},"ltr",function(t){var e=Math.floor(Math.abs(t)),n=t.toString().replace(/^[^.]*\.?/,"").length;return 1===e&&0===n?1:5}],yu={};function bu(t){var e=function(t){return t.toLowerCase().replace(/_/g,"-")}(t),n=wu(e);if(n)return n;var i=e.split("-")[0];if(n=wu(i))return n;if("en"===i)return _u;throw new Error('Missing locale data for the locale "'.concat(t,'".'))}function wu(t){return t in yu||(yu[t]=Xt.ng&&Xt.ng.common&&Xt.ng.common.locales&&Xt.ng.common.locales[t]),yu[t]}var ku=function(t){return t[t.LocaleId=0]="LocaleId",t[t.DayPeriodsFormat=1]="DayPeriodsFormat",t[t.DayPeriodsStandalone=2]="DayPeriodsStandalone",t[t.DaysFormat=3]="DaysFormat",t[t.DaysStandalone=4]="DaysStandalone",t[t.MonthsFormat=5]="MonthsFormat",t[t.MonthsStandalone=6]="MonthsStandalone",t[t.Eras=7]="Eras",t[t.FirstDayOfWeek=8]="FirstDayOfWeek",t[t.WeekendRange=9]="WeekendRange",t[t.DateFormat=10]="DateFormat",t[t.TimeFormat=11]="TimeFormat",t[t.DateTimeFormat=12]="DateTimeFormat",t[t.NumberSymbols=13]="NumberSymbols",t[t.NumberFormats=14]="NumberFormats",t[t.CurrencyCode=15]="CurrencyCode",t[t.CurrencySymbol=16]="CurrencySymbol",t[t.CurrencyName=17]="CurrencyName",t[t.Currencies=18]="Currencies",t[t.Directionality=19]="Directionality",t[t.PluralCase=20]="PluralCase",t[t.ExtraData=21]="ExtraData",t}({}),Mu="en-US";function Su(t){var e,n;n="Expected localeId to be defined",null==(e=t)&&function(t,e,n,i){throw new Error("ASSERTION ERROR: ".concat(t)+" [Expected=> ".concat(null," ").concat("!="," ").concat(e," <=Actual]"))}(n,e),"string"==typeof t&&t.toLowerCase().replace(/_/g,"-")}function Cu(t,e,n){var i=Hn();if(i.firstCreatePass){var r=nn(t);xu(n,i.data,i.blueprint,r,!0),xu(e,i.data,i.blueprint,r,!1)}}function xu(t,e,n,i,r){if(t=qt(t),Array.isArray(t))for(var a=0;a>20;if(Vo(t)||!t.multi){var p=new wi(l,r,gs),m=Tu(u,e,r?d:d+f,h);-1===m?(Fi(Pi(c,s),o,u),Du(o,t,e.length),e.push(u),c.directiveStart++,c.directiveEnd++,r&&(c.providerIndexes+=1048576),n.push(p),s.push(p)):(n[m]=p,s[m]=p)}else{var g=Tu(u,e,d+f,h),v=Tu(u,e,d,d+f),_=v>=0&&n[v];if(r&&!_||!r&&!(g>=0&&n[g])){Fi(Pi(c,s),o,u);var y=function(t,e,n,i,r){var a=new wi(t,n,gs);return a.multi=[],a.index=e,a.componentProviders=0,Lu(a,r,i&&!n),a}(r?Ou:Eu,n.length,r,i,l);!r&&_&&(n[v].providerFactory=y),Du(o,t,e.length,0),e.push(u),c.directiveStart++,c.directiveEnd++,r&&(c.providerIndexes+=1048576),n.push(y),s.push(y)}else Du(o,t,g>-1?g:v,Lu(n[r?v:g],l,!r&&i));!r&&i&&_&&n[v].componentProviders++}}}function Du(t,e,n,i){var r=Vo(e);if(r||e.useClass){var a=(e.useClass||e).prototype.ngOnDestroy;if(a){var o=t.destroyHooks||(t.destroyHooks=[]);if(!r&&e.multi){var s=o.indexOf(n);-1===s?o.push(n,[i,a]):o[s+1].push(i,a)}else o.push(n,a)}}}function Lu(t,e,n){return n&&t.componentProviders++,t.multi.push(e)-1}function Tu(t,e,n,i){for(var r=n;r1&&void 0!==arguments[1]?arguments[1]:[];return function(n){n.providersResolver=function(n,i){return Cu(n,i?i(t):t,e)}}}var Iu=function t(){_(this,t)},Yu=function t(){_(this,t)},Ru=function(){function t(){_(this,t)}return b(t,[{key:"resolveComponentFactory",value:function(t){throw function(t){var e=Error("No component factory found for ".concat(Wt(t),". Did you add it to @NgModule.entryComponents?"));return e.ngComponent=t,e}(t)}}]),t}(),Fu=function(){var t=function t(){_(this,t)};return t.NULL=new Ru,t}(),Hu=function(){var t=function t(e){_(this,t),this.nativeElement=e};return t.__NG_ELEMENT_ID__=function(){return Bu(t)},t}(),Bu=function(t){return Mo(t,jn(),Fn())},ju=function t(){_(this,t)},Nu=function(t){return t[t.Important=1]="Important",t[t.DashCase=2]="DashCase",t}({}),Wu=function(){var t=function t(){_(this,t)};return t.__NG_ELEMENT_ID__=function(){return Vu()},t}(),Vu=function(){var t=Fn(),e=Ln(jn().index,t);return function(t){var e=t[11];if(wn(e))return e;throw new Error("Cannot inject Renderer2 when the application uses Renderer3!")}(Qe(e)?e:t)},zu=function(){var t=function t(){_(this,t)};return t.\u0275prov=At({token:t,providedIn:"root",factory:function(){return null}}),t}(),Uu=function t(e){_(this,t),this.full=e,this.major=e.split(".")[0],this.minor=e.split(".")[1],this.patch=e.split(".").slice(2).join(".")},qu=new Uu("10.2.3"),Gu=function(){function t(){_(this,t)}return b(t,[{key:"supports",value:function(t){return rs(t)}},{key:"create",value:function(t){return new Zu(t)}}]),t}(),Ku=function(t,e){return e},Zu=function(){function t(e){_(this,t),this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=e||Ku}return b(t,[{key:"forEachItem",value:function(t){var e;for(e=this._itHead;null!==e;e=e._next)t(e)}},{key:"forEachOperation",value:function(t){for(var e=this._itHead,n=this._removalsHead,i=0,r=null;e||n;){var a=!n||e&&e.currentIndex<$u(n,i,r)?e:n,o=$u(a,i,r),s=a.currentIndex;if(a===n)i--,n=n._nextRemoved;else if(e=e._next,null==a.previousIndex)i++;else{r||(r=[]);var u=o-i,l=s-i;if(u!=l){for(var c=0;c0&&vo(l,d,y.join(" "))}if(a=xn(p,0),void 0!==e)for(var b=a.projection=[],w=0;w1&&void 0!==arguments[1]?arguments[1]:qo.THROW_IF_NOT_FOUND,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Tt.Default;return t===qo||t===Me||t===ue?this:this._r3Injector.get(t,e,n)}},{key:"destroy",value:function(){var t=this._r3Injector;!t.destroyed&&t.destroy(),this.destroyCbs.forEach((function(t){return t()})),this.destroyCbs=null}},{key:"onDestroy",value:function(t){this.destroyCbs.push(t)}}]),n}(Me),bl=function(t){f(n,t);var e=v(n);function n(t){var i,r,a;return _(this,n),(i=e.call(this)).moduleType=t,null!==Ke(t)&&(r=t,a=new Set,function t(e){var n=Ke(e,!0),i=n.id;null!==i&&(function(t,e,n){if(e&&e!==n)throw new Error("Duplicate module registered for ".concat(t," - ").concat(Wt(e)," vs ").concat(Wt(e.name)))}(i,_l.get(i),e),_l.set(i,e));var r,o=d(cn(n.imports));try{for(o.s();!(r=o.n()).done;){var s=r.value;a.has(s)||(a.add(s),t(s))}}catch(u){o.e(u)}finally{o.f()}}(r)),i}return b(n,[{key:"create",value:function(t){return new yl(this.moduleType,t)}}]),n}(Se);function wl(t,e,n){var i=qn()+t,r=Fn();return r[i]===Qr?os(r,i,n?e.call(n):e()):function(t,e){return t[e]}(r,i)}function kl(t,e,n,i){return xl(Fn(),qn(),t,e,n,i)}function Ml(t,e,n,i,r){return Dl(Fn(),qn(),t,e,n,i,r)}function Sl(t,e,n,i,r,a){return Ll(Fn(),qn(),t,e,n,i,r,a)}function Cl(t,e){var n=t[e];return n===Qr?void 0:n}function xl(t,e,n,i,r,a){var o=e+n;return ss(t,o,r)?os(t,o+1,a?i.call(a,r):i(r)):Cl(t,o+1)}function Dl(t,e,n,i,r,a,o){var s=e+n;return us(t,s,r,a)?os(t,s+2,o?i.call(o,r,a):i(r,a)):Cl(t,s+2)}function Ll(t,e,n,i,r,a,o,s){var u=e+n;return ls(t,u,r,a,o)?os(t,u+3,s?i.call(s,r,a,o):i(r,a,o)):Cl(t,u+3)}function Tl(t,e){var n,i=Hn(),r=t+Ze;i.firstCreatePass?(n=function(t,e){if(e)for(var n=e.length-1;n>=0;n--){var i=e[n];if(t===i.name)return i}throw new Error("The pipe '".concat(t,"' could not be found!"))}(e,i.pipeRegistry),i.data[r]=n,n.onDestroy&&(i.destroyHooks||(i.destroyHooks=[])).push(r,n.onDestroy)):n=i.data[r];var a=n.factory||(n.factory=Ge(n.type)),o=me(gs);try{var s=Oi(!1),u=a();return Oi(s),function(t,e,n,i){var r=n+Ze;r>=t.data.length&&(t.data[r]=null,t.blueprint[r]=null),e[r]=i}(i,Fn(),t,u),u}finally{me(o)}}function El(t,e,n){var i=Fn(),r=Dn(i,t);return Yl(i,Il(i,t)?xl(i,qn(),e,r.transform,n,r):r.transform(n))}function Ol(t,e,n,i){var r=Fn(),a=Dn(r,t);return Yl(r,Il(r,t)?Dl(r,qn(),e,a.transform,n,i,a):a.transform(n,i))}function Al(t,e,n,i,r){var a=Fn(),o=Dn(a,t);return Yl(a,Il(a,t)?Ll(a,qn(),e,o.transform,n,i,r,o):o.transform(n,i,r))}function Pl(t,e,n,i,r,a){var o=Fn(),s=Dn(o,t);return Yl(o,Il(o,t)?function(t,e,n,i,r,a,o,s,u){var l=e+n;return cs(t,l,r,a,o,s)?os(t,l+4,u?i.call(u,r,a,o,s):i(r,a,o,s)):Cl(t,l+4)}(o,qn(),e,s.transform,n,i,r,a,s):s.transform(n,i,r,a))}function Il(t,e){return t[1].data[e+Ze].pure}function Yl(t,e){return is.isWrapped(e)&&(e=is.unwrap(e),t[Gn()]=Qr),e}var Rl=function(t){f(n,t);var e=v(n);function n(){var t,i=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return _(this,n),(t=e.call(this)).__isAsync=i,t}return b(n,[{key:"emit",value:function(t){r(i(n.prototype),"next",this).call(this,t)}},{key:"subscribe",value:function(t,e,a){var o,s=function(t){return null},u=function(){return null};t&&"object"==typeof t?(o=this.__isAsync?function(e){setTimeout((function(){return t.next(e)}))}:function(e){t.next(e)},t.error&&(s=this.__isAsync?function(e){setTimeout((function(){return t.error(e)}))}:function(e){t.error(e)}),t.complete&&(u=this.__isAsync?function(){setTimeout((function(){return t.complete()}))}:function(){t.complete()})):(o=this.__isAsync?function(e){setTimeout((function(){return t(e)}))}:function(e){t(e)},e&&(s=this.__isAsync?function(t){setTimeout((function(){return e(t)}))}:function(t){e(t)}),a&&(u=this.__isAsync?function(){setTimeout((function(){return a()}))}:function(){a()}));var l=r(i(n.prototype),"subscribe",this).call(this,o,s,u);return t instanceof x&&t.add(l),l}}]),n}(z);function Fl(){return this._results[ns()]()}var Hl=function(){function t(){_(this,t),this.dirty=!0,this._results=[],this.changes=new Rl,this.length=0;var e=ns(),n=t.prototype;n[e]||(n[e]=Fl)}return b(t,[{key:"map",value:function(t){return this._results.map(t)}},{key:"filter",value:function(t){return this._results.filter(t)}},{key:"find",value:function(t){return this._results.find(t)}},{key:"reduce",value:function(t,e){return this._results.reduce(t,e)}},{key:"forEach",value:function(t){this._results.forEach(t)}},{key:"some",value:function(t){return this._results.some(t)}},{key:"toArray",value:function(){return this._results.slice()}},{key:"toString",value:function(){return this._results.toString()}},{key:"reset",value:function(t){this._results=function t(e,n){void 0===n&&(n=e);for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:[];_(this,t),this.queries=e}return b(t,[{key:"createEmbeddedView",value:function(e){var n=e.queries;if(null!==n){for(var i=null!==e.contentQueries?e.contentQueries[0]:n.length,r=[],a=0;a3&&void 0!==arguments[3]?arguments[3]:null;_(this,t),this.predicate=e,this.descendants=n,this.isStatic=i,this.read=r},Wl=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];_(this,t),this.queries=e}return b(t,[{key:"elementStart",value:function(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:-1;_(this,t),this.metadata=e,this.matches=null,this.indexInDeclarationView=-1,this.crossesNgTemplate=!1,this._appliesToNextNode=!0,this._declarationNodeIndex=n}return b(t,[{key:"elementStart",value:function(t,e){this.isApplyingToNode(e)&&this.matchTNode(t,e)}},{key:"elementEnd",value:function(t){this._declarationNodeIndex===t.index&&(this._appliesToNextNode=!1)}},{key:"template",value:function(t,e){this.elementStart(t,e)}},{key:"embeddedTView",value:function(e,n){return this.isApplyingToNode(e)?(this.crossesNgTemplate=!0,this.addMatch(-e.index,n),new t(this.metadata)):null}},{key:"isApplyingToNode",value:function(t){if(this._appliesToNextNode&&!1===this.metadata.descendants){for(var e=this._declarationNodeIndex,n=t.parent;null!==n&&3===n.type&&n.index!==e;)n=n.parent;return e===(null!==n?n.index:-1)}return this._appliesToNextNode}},{key:"matchTNode",value:function(t,e){var n=this.metadata.predicate;if(Array.isArray(n))for(var i=0;i0)r.push(s[u/2]);else{for(var c=o[u+1],d=n[-l],h=Je;h0&&void 0!==arguments[0]?arguments[0]:Tt.Default,e=xo(!0);if(null!=e||t&Tt.Optional)return e;dn("ChangeDetectorRef")}var oc=new se("Application Initializer"),sc=function(){var t=function(){function t(e){var n=this;_(this,t),this.appInits=e,this.initialized=!1,this.done=!1,this.donePromise=new Promise((function(t,e){n.resolve=t,n.reject=e}))}return b(t,[{key:"runInitializers",value:function(){var t=this;if(!this.initialized){var e=[],n=function(){t.done=!0,t.resolve()};if(this.appInits)for(var i=0;i0&&(r=setTimeout((function(){i._callbacks=i._callbacks.filter((function(t){return t.timeoutId!==r})),t(i._didWork,i.getPendingTasks())}),e)),this._callbacks.push({doneCb:t,timeoutId:r,updateCb:n})}},{key:"whenStable",value:function(t,e,n){if(n&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/dist/task-tracking.js" loaded?');this.addCallback(t,e,n),this._runCallbacksIfReady()}},{key:"getPendingRequestCount",value:function(){return this._pendingCount}},{key:"findProviders",value:function(t,e,n){return[]}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(Dc))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),Fc=function(){var t=function(){function t(){_(this,t),this._applications=new Map,Hc.addToWindow(this)}return b(t,[{key:"registerApplication",value:function(t,e){this._applications.set(t,e)}},{key:"unregisterApplication",value:function(t){this._applications.delete(t)}},{key:"unregisterAllApplications",value:function(){this._applications.clear()}},{key:"getTestability",value:function(t){return this._applications.get(t)||null}},{key:"getAllTestabilities",value:function(){return Array.from(this._applications.values())}},{key:"getAllRootElements",value:function(){return Array.from(this._applications.keys())}},{key:"findTestabilityInTree",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return Hc.findTestabilityInTree(this,t,e)}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),Hc=new(function(){function t(){_(this,t)}return b(t,[{key:"addToWindow",value:function(t){}},{key:"findTestabilityInTree",value:function(t,e,n){return null}}]),t}()),Bc=function(t,e,n){var i=new bl(n);return Promise.resolve(i)},jc=new se("AllowMultipleToken"),Nc=function t(e,n){_(this,t),this.name=e,this.token=n};function Wc(t){if(Ic&&!Ic.destroyed&&!Ic.injector.get(jc,!1))throw new Error("There can be only one platform. Destroy the previous one to create a new one.");Ic=t.get(qc);var e=t.get(dc,null);return e&&e.forEach((function(t){return t()})),Ic}function Vc(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],i="Platform: ".concat(e),r=new se(i);return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],a=Uc();if(!a||a.injector.get(jc,!1))if(t)t(n.concat(e).concat({provide:r,useValue:!0}));else{var o=n.concat(e).concat({provide:r,useValue:!0},{provide:Oo,useValue:"platform"});Wc(qo.create({providers:o,name:i}))}return zc(r)}}function zc(t){var e=Uc();if(!e)throw new Error("No platform exists!");if(!e.injector.get(t,null))throw new Error("A platform with a different configuration has been created. Please destroy it first.");return e}function Uc(){return Ic&&!Ic.destroyed?Ic:null}var qc=function(){var t=function(){function t(e){_(this,t),this._injector=e,this._modules=[],this._destroyListeners=[],this._destroyed=!1}return b(t,[{key:"bootstrapModuleFactory",value:function(t,e){var n,i,r=this,a=(i=e&&e.ngZoneEventCoalescing||!1,"noop"===(n=e?e.ngZone:void 0)?new Yc:("zone.js"===n?void 0:n)||new Dc({enableLongStackTrace:cr(),shouldCoalesceEventChangeDetection:i})),o=[{provide:Dc,useValue:a}];return a.run((function(){var e=qo.create({providers:o,parent:r.injector,name:t.moduleType.name}),n=t.create(e),i=n.injector.get(Xi,null);if(!i)throw new Error("No ErrorHandler. Is platform module (BrowserModule) included?");return n.onDestroy((function(){return Zc(r._modules,n)})),a.runOutsideAngular((function(){return a.onError.subscribe({next:function(t){i.handleError(t)}})})),function(t,e,i){try{var a=((o=n.injector.get(sc)).runInitializers(),o.donePromise.then((function(){return Su(n.injector.get(mc,Mu)||Mu),r._moduleDoBootstrap(n),n})));return Ds(a)?a.catch((function(n){throw e.runOutsideAngular((function(){return t.handleError(n)})),n})):a}catch(s){throw e.runOutsideAngular((function(){return t.handleError(s)})),s}var o}(i,a)}))}},{key:"bootstrapModule",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],i=Gc({},n);return Bc(0,0,t).then((function(t){return e.bootstrapModuleFactory(t,i)}))}},{key:"_moduleDoBootstrap",value:function(t){var e=t.injector.get(Kc);if(t._bootstrapComponents.length>0)t._bootstrapComponents.forEach((function(t){return e.bootstrap(t)}));else{if(!t.instance.ngDoBootstrap)throw new Error("The module ".concat(Wt(t.instance.constructor),' was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. ')+"Please define one of these.");t.instance.ngDoBootstrap(e)}this._modules.push(t)}},{key:"onDestroy",value:function(t){this._destroyListeners.push(t)}},{key:"destroy",value:function(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach((function(t){return t.destroy()})),this._destroyListeners.forEach((function(t){return t()})),this._destroyed=!0}},{key:"injector",get:function(){return this._injector}},{key:"destroyed",get:function(){return this._destroyed}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(qo))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}();function Gc(t,e){return Array.isArray(e)?e.reduce(Gc,t):Object.assign(Object.assign({},t),e)}var Kc=function(){var t=function(){function t(e,n,i,r,a,o){var s=this;_(this,t),this._zone=e,this._console=n,this._injector=i,this._exceptionHandler=r,this._componentFactoryResolver=a,this._initStatus=o,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._enforceNoNewChanges=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._enforceNoNewChanges=cr(),this._zone.onMicrotaskEmpty.subscribe({next:function(){s._zone.run((function(){s.tick()}))}});var u=new B((function(t){s._stable=s._zone.isStable&&!s._zone.hasPendingMacrotasks&&!s._zone.hasPendingMicrotasks,s._zone.runOutsideAngular((function(){t.next(s._stable),t.complete()}))})),l=new B((function(t){var e;s._zone.runOutsideAngular((function(){e=s._zone.onStable.subscribe((function(){Dc.assertNotInAngularZone(),xc((function(){s._stable||s._zone.hasPendingMacrotasks||s._zone.hasPendingMicrotasks||(s._stable=!0,t.next(!0))}))}))}));var n=s._zone.onUnstable.subscribe((function(){Dc.assertInAngularZone(),s._stable&&(s._stable=!1,s._zone.runOutsideAngular((function(){t.next(!1)})))}));return function(){e.unsubscribe(),n.unsubscribe()}}));this.isStable=ft(u,l.pipe(wt()))}return b(t,[{key:"bootstrap",value:function(t,e){var n,i=this;if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");n=t instanceof Yu?t:this._componentFactoryResolver.resolveComponentFactory(t),this.componentTypes.push(n.componentType);var r=n.isBoundToModule?void 0:this._injector.get(Me),a=n.create(qo.NULL,[],e||n.selector,r);a.onDestroy((function(){i._unloadComponent(a)}));var o=a.injector.get(Rc,null);return o&&a.injector.get(Fc).registerApplication(a.location.nativeElement,o),this._loadComponent(a),cr()&&this._console.log("Angular is running in development mode. Call enableProdMode() to enable production mode."),a}},{key:"tick",value:function(){var t=this;if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");try{this._runningTick=!0;var e,n=d(this._views);try{for(n.s();!(e=n.n()).done;)e.value.detectChanges()}catch(a){n.e(a)}finally{n.f()}if(this._enforceNoNewChanges){var i,r=d(this._views);try{for(r.s();!(i=r.n()).done;)i.value.checkNoChanges()}catch(a){r.e(a)}finally{r.f()}}}catch(o){this._zone.runOutsideAngular((function(){return t._exceptionHandler.handleError(o)}))}finally{this._runningTick=!1}}},{key:"attachView",value:function(t){var e=t;this._views.push(e),e.attachToAppRef(this)}},{key:"detachView",value:function(t){var e=t;Zc(this._views,e),e.detachFromAppRef()}},{key:"_loadComponent",value:function(t){this.attachView(t.hostView),this.tick(),this.components.push(t),this._injector.get(fc,[]).concat(this._bootstrapListeners).forEach((function(e){return e(t)}))}},{key:"_unloadComponent",value:function(t){this.detachView(t.hostView),Zc(this.components,t)}},{key:"ngOnDestroy",value:function(){this._views.slice().forEach((function(t){return t.destroy()}))}},{key:"viewCount",get:function(){return this._views.length}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(Dc),ve(pc),ve(qo),ve(Xi),ve(Fu),ve(sc))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}();function Zc(t,e){var n=t.indexOf(e);n>-1&&t.splice(n,1)}var Jc=function t(){_(this,t)},Qc=function t(){_(this,t)},Xc={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"},$c=function(){var t=function(){function t(e,n){_(this,t),this._compiler=e,this._config=n||Xc}return b(t,[{key:"load",value:function(t){return this.loadAndCompile(t)}},{key:"loadAndCompile",value:function(t){var e=this,i=u(t.split("#"),2),r=i[0],a=i[1];return void 0===a&&(a="default"),n("crnd")(r).then((function(t){return t[a]})).then((function(t){return td(t,r,a)})).then((function(t){return e._compiler.compileModuleAsync(t)}))}},{key:"loadFactory",value:function(t){var e=u(t.split("#"),2),i=e[0],r=e[1],a="NgFactory";return void 0===r&&(r="default",a=""),n("crnd")(this._config.factoryPathPrefix+i+this._config.factoryPathSuffix).then((function(t){return t[r+a]})).then((function(t){return td(t,i,r)}))}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(Sc),ve(Qc,8))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}();function td(t,e,n){if(!t)throw new Error("Cannot find '".concat(n,"' in '").concat(e,"'"));return t}var ed=Vc(null,"core",[{provide:hc,useValue:"unknown"},{provide:qc,deps:[qo]},{provide:Fc,deps:[]},{provide:pc,deps:[]}]),nd=[{provide:Kc,useClass:Kc,deps:[Dc,pc,qo,Xi,Fu,sc]},{provide:ml,deps:[Dc],useFactory:function(t){var e=[];return t.onStable.subscribe((function(){for(;e.length;)e.pop()()})),function(t){e.push(t)}}},{provide:sc,useClass:sc,deps:[[new xt,oc]]},{provide:Sc,useClass:Sc,deps:[]},lc,{provide:il,useFactory:function(){return ol},deps:[]},{provide:rl,useFactory:function(){return sl},deps:[]},{provide:mc,useFactory:function(t){return Su(t=t||"undefined"!=typeof $localize&&$localize.locale||Mu),t},deps:[[new Ct(mc),new xt,new Lt]]},{provide:gc,useValue:"USD"}],id=function(){var t=function t(e){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)(ve(Kc))},providers:nd}),t}(),rd="w4bxe2tbf9beb72r",ad=null;function od(){return ad}var sd=function t(){_(this,t)},ud=new se("DocumentToken"),ld=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275prov=At({factory:cd,token:t,providedIn:"platform"}),t}();function cd(){return ve(hd)}var dd=new se("Location Initialized"),hd=function(){var t=function(t){f(n,t);var e=v(n);function n(t){var i;return _(this,n),(i=e.call(this))._doc=t,i._init(),i}return b(n,[{key:"_init",value:function(){this.location=od().getLocation(),this._history=od().getHistory()}},{key:"getBaseHrefFromDOM",value:function(){return od().getBaseHref(this._doc)}},{key:"onPopState",value:function(t){od().getGlobalEventTarget(this._doc,"window").addEventListener("popstate",t,!1)}},{key:"onHashChange",value:function(t){od().getGlobalEventTarget(this._doc,"window").addEventListener("hashchange",t,!1)}},{key:"pushState",value:function(t,e,n){fd()?this._history.pushState(t,e,n):this.location.hash=n}},{key:"replaceState",value:function(t,e,n){fd()?this._history.replaceState(t,e,n):this.location.hash=n}},{key:"forward",value:function(){this._history.forward()}},{key:"back",value:function(){this._history.back()}},{key:"getState",value:function(){return this._history.state}},{key:"href",get:function(){return this.location.href}},{key:"protocol",get:function(){return this.location.protocol}},{key:"hostname",get:function(){return this.location.hostname}},{key:"port",get:function(){return this.location.port}},{key:"pathname",get:function(){return this.location.pathname},set:function(t){this.location.pathname=t}},{key:"search",get:function(){return this.location.search}},{key:"hash",get:function(){return this.location.hash}}]),n}(ld);return t.\u0275fac=function(e){return new(e||t)(ve(ud))},t.\u0275prov=At({factory:pd,token:t,providedIn:"platform"}),t}();function fd(){return!!window.history.pushState}function pd(){return new hd(ve(ud))}function md(t,e){if(0==t.length)return e;if(0==e.length)return t;var n=0;return t.endsWith("/")&&n++,e.startsWith("/")&&n++,2==n?t+e.substring(1):1==n?t+e:t+"/"+e}function gd(t){var e=t.match(/#|\?|$/),n=e&&e.index||t.length;return t.slice(0,n-("/"===t[n-1]?1:0))+t.slice(n)}function vd(t){return t&&"?"!==t[0]?"?"+t:t}var _d=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275prov=At({factory:yd,token:t,providedIn:"root"}),t}();function yd(t){var e=ve(ud).location;return new wd(ve(ld),e&&e.origin||"")}var bd=new se("appBaseHref"),wd=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i){var r;if(_(this,n),(r=e.call(this))._platformLocation=t,null==i&&(i=r._platformLocation.getBaseHrefFromDOM()),null==i)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return r._baseHref=i,r}return b(n,[{key:"onPopState",value:function(t){this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t)}},{key:"getBaseHref",value:function(){return this._baseHref}},{key:"prepareExternalUrl",value:function(t){return md(this._baseHref,t)}},{key:"path",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=this._platformLocation.pathname+vd(this._platformLocation.search),n=this._platformLocation.hash;return n&&t?"".concat(e).concat(n):e}},{key:"pushState",value:function(t,e,n,i){var r=this.prepareExternalUrl(n+vd(i));this._platformLocation.pushState(t,e,r)}},{key:"replaceState",value:function(t,e,n,i){var r=this.prepareExternalUrl(n+vd(i));this._platformLocation.replaceState(t,e,r)}},{key:"forward",value:function(){this._platformLocation.forward()}},{key:"back",value:function(){this._platformLocation.back()}}]),n}(_d);return t.\u0275fac=function(e){return new(e||t)(ve(ld),ve(bd,8))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),kd=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this))._platformLocation=t,r._baseHref="",null!=i&&(r._baseHref=i),r}return b(n,[{key:"onPopState",value:function(t){this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t)}},{key:"getBaseHref",value:function(){return this._baseHref}},{key:"path",value:function(){var t=this._platformLocation.hash;return null==t&&(t="#"),t.length>0?t.substring(1):t}},{key:"prepareExternalUrl",value:function(t){var e=md(this._baseHref,t);return e.length>0?"#"+e:e}},{key:"pushState",value:function(t,e,n,i){var r=this.prepareExternalUrl(n+vd(i));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.pushState(t,e,r)}},{key:"replaceState",value:function(t,e,n,i){var r=this.prepareExternalUrl(n+vd(i));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.replaceState(t,e,r)}},{key:"forward",value:function(){this._platformLocation.forward()}},{key:"back",value:function(){this._platformLocation.back()}}]),n}(_d);return t.\u0275fac=function(e){return new(e||t)(ve(ld),ve(bd,8))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),Md=function(){var t=function(){function t(e,n){var i=this;_(this,t),this._subject=new Rl,this._urlChangeListeners=[],this._platformStrategy=e;var r=this._platformStrategy.getBaseHref();this._platformLocation=n,this._baseHref=gd(Cd(r)),this._platformStrategy.onPopState((function(t){i._subject.emit({url:i.path(!0),pop:!0,state:t.state,type:t.type})}))}return b(t,[{key:"path",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.normalize(this._platformStrategy.path(t))}},{key:"getState",value:function(){return this._platformLocation.getState()}},{key:"isCurrentPathEqualTo",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return this.path()==this.normalize(t+vd(e))}},{key:"normalize",value:function(e){return t.stripTrailingSlash(function(t,e){return t&&e.startsWith(t)?e.substring(t.length):e}(this._baseHref,Cd(e)))}},{key:"prepareExternalUrl",value:function(t){return t&&"/"!==t[0]&&(t="/"+t),this._platformStrategy.prepareExternalUrl(t)}},{key:"go",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;this._platformStrategy.pushState(n,"",t,e),this._notifyUrlChangeListeners(this.prepareExternalUrl(t+vd(e)),n)}},{key:"replaceState",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;this._platformStrategy.replaceState(n,"",t,e),this._notifyUrlChangeListeners(this.prepareExternalUrl(t+vd(e)),n)}},{key:"forward",value:function(){this._platformStrategy.forward()}},{key:"back",value:function(){this._platformStrategy.back()}},{key:"onUrlChange",value:function(t){var e=this;this._urlChangeListeners.push(t),this._urlChangeSubscription||(this._urlChangeSubscription=this.subscribe((function(t){e._notifyUrlChangeListeners(t.url,t.state)})))}},{key:"_notifyUrlChangeListeners",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1?arguments[1]:void 0;this._urlChangeListeners.forEach((function(n){return n(t,e)}))}},{key:"subscribe",value:function(t,e,n){return this._subject.subscribe({next:t,error:e,complete:n})}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(_d),ve(ld))},t.normalizeQueryParams=vd,t.joinWithSlash=md,t.stripTrailingSlash=gd,t.\u0275prov=At({factory:Sd,token:t,providedIn:"root"}),t}();function Sd(){return new Md(ve(_d),ve(ld))}function Cd(t){return t.replace(/\/index.html$/,"")}var xd={ADP:[void 0,void 0,0],AFN:[void 0,void 0,0],ALL:[void 0,void 0,0],AMD:[void 0,void 0,2],AOA:[void 0,"Kz"],ARS:[void 0,"$"],AUD:["A$","$"],BAM:[void 0,"KM"],BBD:[void 0,"$"],BDT:[void 0,"\u09f3"],BHD:[void 0,void 0,3],BIF:[void 0,void 0,0],BMD:[void 0,"$"],BND:[void 0,"$"],BOB:[void 0,"Bs"],BRL:["R$"],BSD:[void 0,"$"],BWP:[void 0,"P"],BYN:[void 0,"\u0440.",2],BYR:[void 0,void 0,0],BZD:[void 0,"$"],CAD:["CA$","$",2],CHF:[void 0,void 0,2],CLF:[void 0,void 0,4],CLP:[void 0,"$",0],CNY:["CN\xa5","\xa5"],COP:[void 0,"$",2],CRC:[void 0,"\u20a1",2],CUC:[void 0,"$"],CUP:[void 0,"$"],CZK:[void 0,"K\u010d",2],DJF:[void 0,void 0,0],DKK:[void 0,"kr",2],DOP:[void 0,"$"],EGP:[void 0,"E\xa3"],ESP:[void 0,"\u20a7",0],EUR:["\u20ac"],FJD:[void 0,"$"],FKP:[void 0,"\xa3"],GBP:["\xa3"],GEL:[void 0,"\u20be"],GIP:[void 0,"\xa3"],GNF:[void 0,"FG",0],GTQ:[void 0,"Q"],GYD:[void 0,"$",2],HKD:["HK$","$"],HNL:[void 0,"L"],HRK:[void 0,"kn"],HUF:[void 0,"Ft",2],IDR:[void 0,"Rp",2],ILS:["\u20aa"],INR:["\u20b9"],IQD:[void 0,void 0,0],IRR:[void 0,void 0,0],ISK:[void 0,"kr",0],ITL:[void 0,void 0,0],JMD:[void 0,"$"],JOD:[void 0,void 0,3],JPY:["\xa5",void 0,0],KHR:[void 0,"\u17db"],KMF:[void 0,"CF",0],KPW:[void 0,"\u20a9",0],KRW:["\u20a9",void 0,0],KWD:[void 0,void 0,3],KYD:[void 0,"$"],KZT:[void 0,"\u20b8"],LAK:[void 0,"\u20ad",0],LBP:[void 0,"L\xa3",0],LKR:[void 0,"Rs"],LRD:[void 0,"$"],LTL:[void 0,"Lt"],LUF:[void 0,void 0,0],LVL:[void 0,"Ls"],LYD:[void 0,void 0,3],MGA:[void 0,"Ar",0],MGF:[void 0,void 0,0],MMK:[void 0,"K",0],MNT:[void 0,"\u20ae",2],MRO:[void 0,void 0,0],MUR:[void 0,"Rs",2],MXN:["MX$","$"],MYR:[void 0,"RM"],NAD:[void 0,"$"],NGN:[void 0,"\u20a6"],NIO:[void 0,"C$"],NOK:[void 0,"kr",2],NPR:[void 0,"Rs"],NZD:["NZ$","$"],OMR:[void 0,void 0,3],PHP:[void 0,"\u20b1"],PKR:[void 0,"Rs",2],PLN:[void 0,"z\u0142"],PYG:[void 0,"\u20b2",0],RON:[void 0,"lei"],RSD:[void 0,void 0,0],RUB:[void 0,"\u20bd"],RUR:[void 0,"\u0440."],RWF:[void 0,"RF",0],SBD:[void 0,"$"],SEK:[void 0,"kr",2],SGD:[void 0,"$"],SHP:[void 0,"\xa3"],SLL:[void 0,void 0,0],SOS:[void 0,void 0,0],SRD:[void 0,"$"],SSP:[void 0,"\xa3"],STD:[void 0,void 0,0],STN:[void 0,"Db"],SYP:[void 0,"\xa3",0],THB:[void 0,"\u0e3f"],TMM:[void 0,void 0,0],TND:[void 0,void 0,3],TOP:[void 0,"T$"],TRL:[void 0,void 0,0],TRY:[void 0,"\u20ba"],TTD:[void 0,"$"],TWD:["NT$","$",2],TZS:[void 0,void 0,2],UAH:[void 0,"\u20b4"],UGX:[void 0,void 0,0],USD:["$"],UYI:[void 0,void 0,0],UYU:[void 0,"$"],UYW:[void 0,void 0,4],UZS:[void 0,void 0,2],VEF:[void 0,"Bs",2],VND:["\u20ab",void 0,0],VUV:[void 0,void 0,0],XAF:["FCFA",void 0,0],XCD:["EC$","$"],XOF:["CFA",void 0,0],XPF:["CFPF",void 0,0],XXX:["\xa4"],YER:[void 0,void 0,0],ZAR:[void 0,"R"],ZMK:[void 0,void 0,0],ZMW:[void 0,"ZK"],ZWD:[void 0,void 0,0]},Dd=function(t){return t[t.Decimal=0]="Decimal",t[t.Percent=1]="Percent",t[t.Currency=2]="Currency",t[t.Scientific=3]="Scientific",t}({}),Ld=function(t){return t[t.Zero=0]="Zero",t[t.One=1]="One",t[t.Two=2]="Two",t[t.Few=3]="Few",t[t.Many=4]="Many",t[t.Other=5]="Other",t}({}),Td=function(t){return t[t.Format=0]="Format",t[t.Standalone=1]="Standalone",t}({}),Ed=function(t){return t[t.Narrow=0]="Narrow",t[t.Abbreviated=1]="Abbreviated",t[t.Wide=2]="Wide",t[t.Short=3]="Short",t}({}),Od=function(t){return t[t.Short=0]="Short",t[t.Medium=1]="Medium",t[t.Long=2]="Long",t[t.Full=3]="Full",t}({}),Ad=function(t){return t[t.Decimal=0]="Decimal",t[t.Group=1]="Group",t[t.List=2]="List",t[t.PercentSign=3]="PercentSign",t[t.PlusSign=4]="PlusSign",t[t.MinusSign=5]="MinusSign",t[t.Exponential=6]="Exponential",t[t.SuperscriptingExponent=7]="SuperscriptingExponent",t[t.PerMille=8]="PerMille",t[t[1/0]=9]="Infinity",t[t.NaN=10]="NaN",t[t.TimeSeparator=11]="TimeSeparator",t[t.CurrencyDecimal=12]="CurrencyDecimal",t[t.CurrencyGroup=13]="CurrencyGroup",t}({});function Pd(t,e){return jd(bu(t)[ku.DateFormat],e)}function Id(t,e){return jd(bu(t)[ku.TimeFormat],e)}function Yd(t,e){return jd(bu(t)[ku.DateTimeFormat],e)}function Rd(t,e){var n=bu(t),i=n[ku.NumberSymbols][e];if(void 0===i){if(e===Ad.CurrencyDecimal)return n[ku.NumberSymbols][Ad.Decimal];if(e===Ad.CurrencyGroup)return n[ku.NumberSymbols][Ad.Group]}return i}function Fd(t,e){return bu(t)[ku.NumberFormats][e]}function Hd(t){return bu(t)[ku.Currencies]}function Bd(t){if(!t[ku.ExtraData])throw new Error('Missing extra locale data for the locale "'.concat(t[ku.LocaleId],'". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.'))}function jd(t,e){for(var n=e;n>-1;n--)if(void 0!==t[n])return t[n];throw new Error("Locale data API: locale data undefined")}function Nd(t){var e=u(t.split(":"),2);return{hours:+e[0],minutes:+e[1]}}function Wd(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"en",i=Hd(n)[t]||xd[t]||[],r=i[1];return"narrow"===e&&"string"==typeof r?r:i[0]||t}var Vd=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,zd={},Ud=/((?:[^GyMLwWdEabBhHmsSzZO']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/,qd=function(t){return t[t.Short=0]="Short",t[t.ShortGMT=1]="ShortGMT",t[t.Long=2]="Long",t[t.Extended=3]="Extended",t}({}),Gd=function(t){return t[t.FullYear=0]="FullYear",t[t.Month=1]="Month",t[t.Date=2]="Date",t[t.Hours=3]="Hours",t[t.Minutes=4]="Minutes",t[t.Seconds=5]="Seconds",t[t.FractionalSeconds=6]="FractionalSeconds",t[t.Day=7]="Day",t}({}),Kd=function(t){return t[t.DayPeriods=0]="DayPeriods",t[t.Days=1]="Days",t[t.Months=2]="Months",t[t.Eras=3]="Eras",t}({});function Zd(t,e,n,i){var r=function(t){if(lh(t))return t;if("number"==typeof t&&!isNaN(t))return new Date(t);if("string"==typeof t){t=t.trim();var e,n=parseFloat(t);if(!isNaN(t-n))return new Date(n);if(/^(\d{4}-\d{1,2}-\d{1,2})$/.test(t)){var i=u(t.split("-").map((function(t){return+t})),3);return new Date(i[0],i[1]-1,i[2])}if(e=t.match(Vd))return function(t){var e=new Date(0),n=0,i=0,r=t[8]?e.setUTCFullYear:e.setFullYear,a=t[8]?e.setUTCHours:e.setHours;t[9]&&(n=Number(t[9]+t[10]),i=Number(t[9]+t[11])),r.call(e,Number(t[1]),Number(t[2])-1,Number(t[3]));var o=Number(t[4]||0)-n,s=Number(t[5]||0)-i,u=Number(t[6]||0),l=Math.round(1e3*parseFloat("0."+(t[7]||0)));return a.call(e,o,s,u,l),e}(e)}var r=new Date(t);if(!lh(r))throw new Error('Unable to convert "'.concat(t,'" into a date'));return r}(t);e=function t(e,n){var i=function(t){return bu(t)[ku.LocaleId]}(e);if(zd[i]=zd[i]||{},zd[i][n])return zd[i][n];var r="";switch(n){case"shortDate":r=Pd(e,Od.Short);break;case"mediumDate":r=Pd(e,Od.Medium);break;case"longDate":r=Pd(e,Od.Long);break;case"fullDate":r=Pd(e,Od.Full);break;case"shortTime":r=Id(e,Od.Short);break;case"mediumTime":r=Id(e,Od.Medium);break;case"longTime":r=Id(e,Od.Long);break;case"fullTime":r=Id(e,Od.Full);break;case"short":var a=t(e,"shortTime"),o=t(e,"shortDate");r=Jd(Yd(e,Od.Short),[a,o]);break;case"medium":var s=t(e,"mediumTime"),u=t(e,"mediumDate");r=Jd(Yd(e,Od.Medium),[s,u]);break;case"long":var l=t(e,"longTime"),c=t(e,"longDate");r=Jd(Yd(e,Od.Long),[l,c]);break;case"full":var d=t(e,"fullTime"),h=t(e,"fullDate");r=Jd(Yd(e,Od.Full),[d,h])}return r&&(zd[i][n]=r),r}(n,e)||e;for(var a,o=[];e;){if(!(a=Ud.exec(e))){o.push(e);break}var s=(o=o.concat(a.slice(1))).pop();if(!s)break;e=s}var l=r.getTimezoneOffset();i&&(l=uh(i,l),r=function(t,e,n){var i=t.getTimezoneOffset();return function(t,e){return(t=new Date(t.getTime())).setMinutes(t.getMinutes()+e),t}(t,-1*(uh(e,i)-i))}(r,i));var c="";return o.forEach((function(t){var e=function(t){if(sh[t])return sh[t];var e;switch(t){case"G":case"GG":case"GGG":e=eh(Kd.Eras,Ed.Abbreviated);break;case"GGGG":e=eh(Kd.Eras,Ed.Wide);break;case"GGGGG":e=eh(Kd.Eras,Ed.Narrow);break;case"y":e=$d(Gd.FullYear,1,0,!1,!0);break;case"yy":e=$d(Gd.FullYear,2,0,!0,!0);break;case"yyy":e=$d(Gd.FullYear,3,0,!1,!0);break;case"yyyy":e=$d(Gd.FullYear,4,0,!1,!0);break;case"M":case"L":e=$d(Gd.Month,1,1);break;case"MM":case"LL":e=$d(Gd.Month,2,1);break;case"MMM":e=eh(Kd.Months,Ed.Abbreviated);break;case"MMMM":e=eh(Kd.Months,Ed.Wide);break;case"MMMMM":e=eh(Kd.Months,Ed.Narrow);break;case"LLL":e=eh(Kd.Months,Ed.Abbreviated,Td.Standalone);break;case"LLLL":e=eh(Kd.Months,Ed.Wide,Td.Standalone);break;case"LLLLL":e=eh(Kd.Months,Ed.Narrow,Td.Standalone);break;case"w":e=oh(1);break;case"ww":e=oh(2);break;case"W":e=oh(1,!0);break;case"d":e=$d(Gd.Date,1);break;case"dd":e=$d(Gd.Date,2);break;case"E":case"EE":case"EEE":e=eh(Kd.Days,Ed.Abbreviated);break;case"EEEE":e=eh(Kd.Days,Ed.Wide);break;case"EEEEE":e=eh(Kd.Days,Ed.Narrow);break;case"EEEEEE":e=eh(Kd.Days,Ed.Short);break;case"a":case"aa":case"aaa":e=eh(Kd.DayPeriods,Ed.Abbreviated);break;case"aaaa":e=eh(Kd.DayPeriods,Ed.Wide);break;case"aaaaa":e=eh(Kd.DayPeriods,Ed.Narrow);break;case"b":case"bb":case"bbb":e=eh(Kd.DayPeriods,Ed.Abbreviated,Td.Standalone,!0);break;case"bbbb":e=eh(Kd.DayPeriods,Ed.Wide,Td.Standalone,!0);break;case"bbbbb":e=eh(Kd.DayPeriods,Ed.Narrow,Td.Standalone,!0);break;case"B":case"BB":case"BBB":e=eh(Kd.DayPeriods,Ed.Abbreviated,Td.Format,!0);break;case"BBBB":e=eh(Kd.DayPeriods,Ed.Wide,Td.Format,!0);break;case"BBBBB":e=eh(Kd.DayPeriods,Ed.Narrow,Td.Format,!0);break;case"h":e=$d(Gd.Hours,1,-12);break;case"hh":e=$d(Gd.Hours,2,-12);break;case"H":e=$d(Gd.Hours,1);break;case"HH":e=$d(Gd.Hours,2);break;case"m":e=$d(Gd.Minutes,1);break;case"mm":e=$d(Gd.Minutes,2);break;case"s":e=$d(Gd.Seconds,1);break;case"ss":e=$d(Gd.Seconds,2);break;case"S":e=$d(Gd.FractionalSeconds,1);break;case"SS":e=$d(Gd.FractionalSeconds,2);break;case"SSS":e=$d(Gd.FractionalSeconds,3);break;case"Z":case"ZZ":case"ZZZ":e=ih(qd.Short);break;case"ZZZZZ":e=ih(qd.Extended);break;case"O":case"OO":case"OOO":case"z":case"zz":case"zzz":e=ih(qd.ShortGMT);break;case"OOOO":case"ZZZZ":case"zzzz":e=ih(qd.Long);break;default:return null}return sh[t]=e,e}(t);c+=e?e(r,n,l):"''"===t?"'":t.replace(/(^'|'$)/g,"").replace(/''/g,"'")})),c}function Jd(t,e){return e&&(t=t.replace(/\{([^}]+)}/g,(function(t,n){return null!=e&&n in e?e[n]:t}))),t}function Qd(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"-",i=arguments.length>3?arguments[3]:void 0,r=arguments.length>4?arguments[4]:void 0,a="";(t<0||r&&t<=0)&&(r?t=1-t:(t=-t,a=n));for(var o=String(t);o.length2&&void 0!==arguments[2]?arguments[2]:0,i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];return function(a,o){var s=th(t,a);if((n>0||s>-n)&&(s+=n),t===Gd.Hours)0===s&&-12===n&&(s=12);else if(t===Gd.FractionalSeconds)return Xd(s,e);var u=Rd(o,Ad.MinusSign);return Qd(s,e,u,i,r)}}function th(t,e){switch(t){case Gd.FullYear:return e.getFullYear();case Gd.Month:return e.getMonth();case Gd.Date:return e.getDate();case Gd.Hours:return e.getHours();case Gd.Minutes:return e.getMinutes();case Gd.Seconds:return e.getSeconds();case Gd.FractionalSeconds:return e.getMilliseconds();case Gd.Day:return e.getDay();default:throw new Error('Unknown DateType value "'.concat(t,'".'))}}function eh(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Td.Format,i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];return function(r,a){return nh(r,a,t,e,n,i)}}function nh(t,e,n,i,r,a){switch(n){case Kd.Months:return function(t,e,n){var i=bu(t),r=jd([i[ku.MonthsFormat],i[ku.MonthsStandalone]],e);return jd(r,n)}(e,r,i)[t.getMonth()];case Kd.Days:return function(t,e,n){var i=bu(t),r=jd([i[ku.DaysFormat],i[ku.DaysStandalone]],e);return jd(r,n)}(e,r,i)[t.getDay()];case Kd.DayPeriods:var o=t.getHours(),s=t.getMinutes();if(a){var l=function(t){var e=bu(t);return Bd(e),(e[ku.ExtraData][2]||[]).map((function(t){return"string"==typeof t?Nd(t):[Nd(t[0]),Nd(t[1])]}))}(e),c=function(t,e,n){var i=bu(t);Bd(i);var r=jd([i[ku.ExtraData][0],i[ku.ExtraData][1]],e)||[];return jd(r,n)||[]}(e,r,i),d=l.findIndex((function(t){if(Array.isArray(t)){var e=u(t,2),n=e[0],i=e[1],r=o>=n.hours&&s>=n.minutes,a=o0?Math.floor(r/60):Math.ceil(r/60);switch(t){case qd.Short:return(r>=0?"+":"")+Qd(o,2,a)+Qd(Math.abs(r%60),2,a);case qd.ShortGMT:return"GMT"+(r>=0?"+":"")+Qd(o,1,a);case qd.Long:return"GMT"+(r>=0?"+":"")+Qd(o,2,a)+":"+Qd(Math.abs(r%60),2,a);case qd.Extended:return 0===i?"Z":(r>=0?"+":"")+Qd(o,2,a)+":"+Qd(Math.abs(r%60),2,a);default:throw new Error('Unknown zone width "'.concat(t,'"'))}}}function rh(t){var e=new Date(t,0,1).getDay();return new Date(t,0,1+(e<=4?4:11)-e)}function ah(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate()+(4-t.getDay()))}function oh(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return function(n,i){var r;if(e){var a=new Date(n.getFullYear(),n.getMonth(),1).getDay()-1,o=n.getDate();r=1+Math.floor((o+a)/7)}else{var s=ah(n),u=rh(s.getFullYear()),l=s.getTime()-u.getTime();r=1+Math.round(l/6048e5)}return Qd(r,t,Rd(i,Ad.MinusSign))}}var sh={};function uh(t,e){t=t.replace(/:/g,"");var n=Date.parse("Jan 01, 1970 00:00:00 "+t)/6e4;return isNaN(n)?e:n}function lh(t){return t instanceof Date&&!isNaN(t.valueOf())}var ch=/^(\d+)?\.((\d+)(-(\d+))?)?$/,dh=".",hh="0",fh="#";function ph(t,e,n,i,r,a){var o=arguments.length>6&&void 0!==arguments[6]&&arguments[6],s="",u=!1;if(isFinite(t)){var l=_h(t);o&&(l=vh(l));var c=e.minInt,d=e.minFrac,h=e.maxFrac;if(a){var f=a.match(ch);if(null===f)throw new Error("".concat(a," is not a valid digit info"));var p=f[1],m=f[3],g=f[5];null!=p&&(c=bh(p)),null!=m&&(d=bh(m)),null!=g?h=bh(g):null!=m&&d>h&&(h=d)}yh(l,d,h);var v=l.digits,_=l.integerLen,y=l.exponent,b=[];for(u=v.every((function(t){return!t}));_0?b=v.splice(_,v.length):(b=v,v=[0]);var w=[];for(v.length>=e.lgSize&&w.unshift(v.splice(-e.lgSize,v.length).join(""));v.length>e.gSize;)w.unshift(v.splice(-e.gSize,v.length).join(""));v.length&&w.unshift(v.join("")),s=w.join(Rd(n,i)),b.length&&(s+=Rd(n,r)+b.join("")),y&&(s+=Rd(n,Ad.Exponential)+"+"+y)}else s=Rd(n,Ad.Infinity);return t<0&&!u?e.negPre+s+e.negSuf:e.posPre+s+e.posSuf}function mh(t,e,n,i,r){var a=gh(Fd(e,Dd.Currency),Rd(e,Ad.MinusSign));return a.minFrac=function(t){var e,n=xd[t];return n&&(e=n[2]),"number"==typeof e?e:2}(i),a.maxFrac=a.minFrac,ph(t,a,e,Ad.CurrencyGroup,Ad.CurrencyDecimal,r).replace("\xa4",n).replace("\xa4","").trim()}function gh(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"-",n={minInt:1,minFrac:0,maxFrac:0,posPre:"",posSuf:"",negPre:"",negSuf:"",gSize:0,lgSize:0},i=t.split(";"),r=i[0],a=i[1],o=-1!==r.indexOf(dh)?r.split(dh):[r.substring(0,r.lastIndexOf(hh)+1),r.substring(r.lastIndexOf(hh)+1)],s=o[0],u=o[1]||"";n.posPre=s.substr(0,s.indexOf(fh));for(var l=0;l-1&&(o=o.replace(dh,"")),(i=o.search(/e/i))>0?(n<0&&(n=i),n+=+o.slice(i+1),o=o.substring(0,i)):n<0&&(n=o.length),i=0;o.charAt(i)===hh;i++);if(i===(a=o.length))e=[0],n=1;else{for(a--;o.charAt(a)===hh;)a--;for(n-=i,e=[],r=0;i<=a;i++,r++)e[r]=Number(o.charAt(i))}return n>22&&(e=e.splice(0,21),s=n-1,n=1),{digits:e,exponent:s,integerLen:n}}function yh(t,e,n){if(e>n)throw new Error("The minimum number of digits after fraction (".concat(e,") is higher than the maximum (").concat(n,")."));var i=t.digits,r=i.length-t.integerLen,a=Math.min(Math.max(e,r),n),o=a+t.integerLen,s=i[o];if(o>0){i.splice(Math.max(t.integerLen,o));for(var u=o;u=5)if(o-1<0){for(var c=0;c>o;c--)i.unshift(0),t.integerLen++;i.unshift(1),t.integerLen++}else i[o-1]++;for(;r=h?i.pop():d=!1),e>=10?1:0}),0);f&&(i.unshift(f),t.integerLen++)}function bh(t){var e=parseInt(t);if(isNaN(e))throw new Error("Invalid integer literal when parsing "+t);return e}var wh=function t(){_(this,t)};function kh(t,e,n,i){var r="=".concat(t);if(e.indexOf(r)>-1)return r;if(r=n.getPluralCategory(t,i),e.indexOf(r)>-1)return r;if(e.indexOf("other")>-1)return"other";throw new Error('No plural message found for value "'.concat(t,'"'))}var Mh=function(){var t=function(t){f(n,t);var e=v(n);function n(t){var i;return _(this,n),(i=e.call(this)).locale=t,i}return b(n,[{key:"getPluralCategory",value:function(t,e){switch(function(t){return bu(t)[ku.PluralCase]}(e||this.locale)(t)){case Ld.Zero:return"zero";case Ld.One:return"one";case Ld.Two:return"two";case Ld.Few:return"few";case Ld.Many:return"many";default:return"other"}}}]),n}(wh);return t.\u0275fac=function(e){return new(e||t)(ve(mc))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}();function Sh(t,e){e=encodeURIComponent(e);var n,i=d(t.split(";"));try{for(i.s();!(n=i.n()).done;){var r=n.value,a=r.indexOf("="),o=u(-1==a?[r,""]:[r.slice(0,a),r.slice(a+1)],2),s=o[1];if(o[0].trim()===e)return decodeURIComponent(s)}}catch(l){i.e(l)}finally{i.f()}return null}var Ch=function(){var t=function(){function t(e,n,i,r){_(this,t),this._iterableDiffers=e,this._keyValueDiffers=n,this._ngEl=i,this._renderer=r,this._iterableDiffer=null,this._keyValueDiffer=null,this._initialClasses=[],this._rawClass=null}return b(t,[{key:"ngDoCheck",value:function(){if(this._iterableDiffer){var t=this._iterableDiffer.diff(this._rawClass);t&&this._applyIterableChanges(t)}else if(this._keyValueDiffer){var e=this._keyValueDiffer.diff(this._rawClass);e&&this._applyKeyValueChanges(e)}}},{key:"_applyKeyValueChanges",value:function(t){var e=this;t.forEachAddedItem((function(t){return e._toggleClass(t.key,t.currentValue)})),t.forEachChangedItem((function(t){return e._toggleClass(t.key,t.currentValue)})),t.forEachRemovedItem((function(t){t.previousValue&&e._toggleClass(t.key,!1)}))}},{key:"_applyIterableChanges",value:function(t){var e=this;t.forEachAddedItem((function(t){if("string"!=typeof t.item)throw new Error("NgClass can only toggle CSS classes expressed as strings, got ".concat(Wt(t.item)));e._toggleClass(t.item,!0)})),t.forEachRemovedItem((function(t){return e._toggleClass(t.item,!1)}))}},{key:"_applyClasses",value:function(t){var e=this;t&&(Array.isArray(t)||t instanceof Set?t.forEach((function(t){return e._toggleClass(t,!0)})):Object.keys(t).forEach((function(n){return e._toggleClass(n,!!t[n])})))}},{key:"_removeClasses",value:function(t){var e=this;t&&(Array.isArray(t)||t instanceof Set?t.forEach((function(t){return e._toggleClass(t,!1)})):Object.keys(t).forEach((function(t){return e._toggleClass(t,!1)})))}},{key:"_toggleClass",value:function(t,e){var n=this;(t=t.trim())&&t.split(/\s+/g).forEach((function(t){e?n._renderer.addClass(n._ngEl.nativeElement,t):n._renderer.removeClass(n._ngEl.nativeElement,t)}))}},{key:"klass",set:function(t){this._removeClasses(this._initialClasses),this._initialClasses="string"==typeof t?t.split(/\s+/):[],this._applyClasses(this._initialClasses),this._applyClasses(this._rawClass)}},{key:"ngClass",set:function(t){this._removeClasses(this._rawClass),this._applyClasses(this._initialClasses),this._iterableDiffer=null,this._keyValueDiffer=null,this._rawClass="string"==typeof t?t.split(/\s+/):t,this._rawClass&&(rs(this._rawClass)?this._iterableDiffer=this._iterableDiffers.find(this._rawClass).create():this._keyValueDiffer=this._keyValueDiffers.find(this._rawClass).create())}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(il),gs(rl),gs(Hu),gs(Wu))},t.\u0275dir=ze({type:t,selectors:[["","ngClass",""]],inputs:{klass:["class","klass"],ngClass:"ngClass"}}),t}(),xh=function(){var t=function(){function t(e){_(this,t),this._viewContainerRef=e,this._componentRef=null,this._moduleRef=null}return b(t,[{key:"ngOnChanges",value:function(t){if(this._viewContainerRef.clear(),this._componentRef=null,this.ngComponentOutlet){var e=this.ngComponentOutletInjector||this._viewContainerRef.parentInjector;if(t.ngComponentOutletNgModuleFactory)if(this._moduleRef&&this._moduleRef.destroy(),this.ngComponentOutletNgModuleFactory){var n=e.get(Me);this._moduleRef=this.ngComponentOutletNgModuleFactory.create(n.injector)}else this._moduleRef=null;var i=(this._moduleRef?this._moduleRef.componentFactoryResolver:e.get(Fu)).resolveComponentFactory(this.ngComponentOutlet);this._componentRef=this._viewContainerRef.createComponent(i,this._viewContainerRef.length,e,this.ngComponentOutletContent)}}},{key:"ngOnDestroy",value:function(){this._moduleRef&&this._moduleRef.destroy()}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(cl))},t.\u0275dir=ze({type:t,selectors:[["","ngComponentOutlet",""]],inputs:{ngComponentOutlet:"ngComponentOutlet",ngComponentOutletInjector:"ngComponentOutletInjector",ngComponentOutletContent:"ngComponentOutletContent",ngComponentOutletNgModuleFactory:"ngComponentOutletNgModuleFactory"},features:[fn]}),t}(),Dh=function(){function t(e,n,i,r){_(this,t),this.$implicit=e,this.ngForOf=n,this.index=i,this.count=r}return b(t,[{key:"first",get:function(){return 0===this.index}},{key:"last",get:function(){return this.index===this.count-1}},{key:"even",get:function(){return this.index%2==0}},{key:"odd",get:function(){return!this.even}}]),t}(),Lh=function(){var t=function(){function t(e,n,i){_(this,t),this._viewContainer=e,this._template=n,this._differs=i,this._ngForOf=null,this._ngForOfDirty=!0,this._differ=null}return b(t,[{key:"ngDoCheck",value:function(){if(this._ngForOfDirty){this._ngForOfDirty=!1;var t=this._ngForOf;if(!this._differ&&t)try{this._differ=this._differs.find(t).create(this.ngForTrackBy)}catch(i){throw new Error("Cannot find a differ supporting object '".concat(t,"' of type '").concat((e=t).name||typeof e,"'. NgFor only supports binding to Iterables such as Arrays."))}}var e;if(this._differ){var n=this._differ.diff(this._ngForOf);n&&this._applyChanges(n)}}},{key:"_applyChanges",value:function(t){var e=this,n=[];t.forEachOperation((function(t,i,r){if(null==t.previousIndex){var a=e._viewContainer.createEmbeddedView(e._template,new Dh(null,e._ngForOf,-1,-1),null===r?void 0:r),o=new Th(t,a);n.push(o)}else if(null==r)e._viewContainer.remove(null===i?void 0:i);else if(null!==i){var s=e._viewContainer.get(i);e._viewContainer.move(s,r);var u=new Th(t,s);n.push(u)}}));for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:"mediumDate",i=arguments.length>2?arguments[2]:void 0,r=arguments.length>3?arguments[3]:void 0;if(null==e||""===e||e!=e)return null;try{return Zd(e,n,r||this.locale,i)}catch(a){throw Nh(t,a.message)}}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(mc))},t.\u0275pipe=Ue({name:"date",type:t,pure:!0}),t}(),Qh=/#/g,Xh=function(){var t=function(){function t(e){_(this,t),this._localization=e}return b(t,[{key:"transform",value:function(e,n,i){if(null==e)return"";if("object"!=typeof n||null===n)throw Nh(t,n);return n[kh(e,Object.keys(n),this._localization,i)].replace(Qh,e.toString())}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(wh))},t.\u0275pipe=Ue({name:"i18nPlural",type:t,pure:!0}),t}(),$h=function(){var t=function(){function t(){_(this,t)}return b(t,[{key:"transform",value:function(e,n){if(null==e)return"";if("object"!=typeof n||"string"!=typeof e)throw Nh(t,n);return n.hasOwnProperty(e)?n[e]:n.hasOwnProperty("other")?n.other:""}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275pipe=Ue({name:"i18nSelect",type:t,pure:!0}),t}(),tf=function(){var t=function(){function t(){_(this,t)}return b(t,[{key:"transform",value:function(t){return JSON.stringify(t,null,2)}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275pipe=Ue({name:"json",type:t,pure:!1}),t}();function ef(t,e){return{key:t,value:e}}var nf=function(){var t=function(){function t(e){_(this,t),this.differs=e,this.keyValues=[]}return b(t,[{key:"transform",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:rf;if(!t||!(t instanceof Map)&&"object"!=typeof t)return null;this.differ||(this.differ=this.differs.find(t).create());var i=this.differ.diff(t);return i&&(this.keyValues=[],i.forEachItem((function(t){e.keyValues.push(ef(t.key,t.currentValue))})),this.keyValues.sort(n)),this.keyValues}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(rl))},t.\u0275pipe=Ue({name:"keyvalue",type:t,pure:!1}),t}();function rf(t,e){var n=t.key,i=e.key;if(n===i)return 0;if(void 0===n)return 1;if(void 0===i)return-1;if(null===n)return 1;if(null===i)return-1;if("string"==typeof n&&"string"==typeof i)return n1&&void 0!==arguments[1]?arguments[1]:"USD";_(this,t),this._locale=e,this._defaultCurrencyCode=n}return b(t,[{key:"transform",value:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"symbol",r=arguments.length>3?arguments[3]:void 0,a=arguments.length>4?arguments[4]:void 0;if(uf(e))return null;a=a||this._locale,"boolean"==typeof i&&(console&&console.warn&&console.warn('Warning: the currency pipe has been changed in Angular v5. The symbolDisplay option (third parameter) is now a string instead of a boolean. The accepted values are "code", "symbol" or "symbol-narrow".'),i=i?"symbol":"code");var o=n||this._defaultCurrencyCode;"code"!==i&&(o="symbol"===i||"symbol-narrow"===i?Wd(o,"symbol"===i?"wide":"narrow",a):i);try{var s=lf(e);return mh(s,a,o,n,r)}catch(u){throw Nh(t,u.message)}}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(mc),gs(gc))},t.\u0275pipe=Ue({name:"currency",type:t,pure:!0}),t}();function uf(t){return null==t||""===t||t!=t}function lf(t){if("string"==typeof t&&!isNaN(Number(t)-parseFloat(t)))return Number(t);if("number"!=typeof t)throw new Error("".concat(t," is not a number"));return t}var cf=function(){var t=function(){function t(){_(this,t)}return b(t,[{key:"transform",value:function(e,n,i){if(null==e)return e;if(!this.supports(e))throw Nh(t,e);return e.slice(n,i)}},{key:"supports",value:function(t){return"string"==typeof t||Array.isArray(t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275pipe=Ue({name:"slice",type:t,pure:!1}),t}(),df=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[{provide:wh,useClass:Mh}]}),t}(),hf=function(){var t=function t(){_(this,t)};return t.\u0275prov=At({token:t,providedIn:"root",factory:function(){return new ff(ve(ud),window,ve(Xi))}}),t}(),ff=function(){function t(e,n,i){_(this,t),this.document=e,this.window=n,this.errorHandler=i,this.offset=function(){return[0,0]}}return b(t,[{key:"setOffset",value:function(t){this.offset=Array.isArray(t)?function(){return t}:t}},{key:"getScrollPosition",value:function(){return this.supportsScrolling()?[this.window.scrollX,this.window.scrollY]:[0,0]}},{key:"scrollToPosition",value:function(t){this.supportsScrolling()&&this.window.scrollTo(t[0],t[1])}},{key:"scrollToAnchor",value:function(t){if(this.supportsScrolling()){var e=this.document.getElementById(t)||this.document.getElementsByName(t)[0];e&&this.scrollToElement(e)}}},{key:"setHistoryScrollRestoration",value:function(t){if(this.supportScrollRestoration()){var e=this.window.history;e&&e.scrollRestoration&&(e.scrollRestoration=t)}}},{key:"scrollToElement",value:function(t){var e=t.getBoundingClientRect(),n=e.left+this.window.pageXOffset,i=e.top+this.window.pageYOffset,r=this.offset();this.window.scrollTo(n-r[0],i-r[1])}},{key:"supportScrollRestoration",value:function(){try{if(!this.window||!this.window.scrollTo)return!1;var t=pf(this.window.history)||pf(Object.getPrototypeOf(this.window.history));return!(!t||!t.writable&&!t.set)}catch(e){return!1}}},{key:"supportsScrolling",value:function(){try{return!!this.window.scrollTo}catch(t){return!1}}}]),t}();function pf(t){return Object.getOwnPropertyDescriptor(t,"scrollRestoration")}var mf,gf=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return b(n,[{key:"getProperty",value:function(t,e){return t[e]}},{key:"log",value:function(t){window.console&&window.console.log&&window.console.log(t)}},{key:"logGroup",value:function(t){window.console&&window.console.group&&window.console.group(t)}},{key:"logGroupEnd",value:function(){window.console&&window.console.groupEnd&&window.console.groupEnd()}},{key:"onAndCancel",value:function(t,e,n){return t.addEventListener(e,n,!1),function(){t.removeEventListener(e,n,!1)}}},{key:"dispatchEvent",value:function(t,e){t.dispatchEvent(e)}},{key:"remove",value:function(t){return t.parentNode&&t.parentNode.removeChild(t),t}},{key:"getValue",value:function(t){return t.value}},{key:"createElement",value:function(t,e){return(e=e||this.getDefaultDocument()).createElement(t)}},{key:"createHtmlDocument",value:function(){return document.implementation.createHTMLDocument("fakeTitle")}},{key:"getDefaultDocument",value:function(){return document}},{key:"isElementNode",value:function(t){return t.nodeType===Node.ELEMENT_NODE}},{key:"isShadowRoot",value:function(t){return t instanceof DocumentFragment}},{key:"getGlobalEventTarget",value:function(t,e){return"window"===e?window:"document"===e?t:"body"===e?t.body:null}},{key:"getHistory",value:function(){return window.history}},{key:"getLocation",value:function(){return window.location}},{key:"getBaseHref",value:function(t){var e,n=vf||(vf=document.querySelector("base"))?vf.getAttribute("href"):null;return null==n?null:(e=n,mf||(mf=document.createElement("a")),mf.setAttribute("href",e),"/"===mf.pathname.charAt(0)?mf.pathname:"/"+mf.pathname)}},{key:"resetBaseElement",value:function(){vf=null}},{key:"getUserAgent",value:function(){return window.navigator.userAgent}},{key:"performanceNow",value:function(){return window.performance&&window.performance.now?window.performance.now():(new Date).getTime()}},{key:"supportsCookies",value:function(){return!0}},{key:"getCookie",value:function(t){return Sh(document.cookie,t)}}],[{key:"makeCurrent",value:function(){var t;t=new n,ad||(ad=t)}}]),n}(function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.call(this)}return b(n,[{key:"supportsDOMEvents",value:function(){return!0}}]),n}(sd)),vf=null,_f=new se("TRANSITION_ID"),yf=[{provide:oc,useFactory:function(t,e,n){return function(){n.get(sc).donePromise.then((function(){var n=od();Array.prototype.slice.apply(e.querySelectorAll("style[ng-transition]")).filter((function(e){return e.getAttribute("ng-transition")===t})).forEach((function(t){return n.remove(t)}))}))}},deps:[_f,ud,qo],multi:!0}],bf=function(){function t(){_(this,t)}return b(t,[{key:"addToWindow",value:function(t){Xt.getAngularTestability=function(e){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=t.findTestabilityInTree(e,n);if(null==i)throw new Error("Could not find testability for element.");return i},Xt.getAllAngularTestabilities=function(){return t.getAllTestabilities()},Xt.getAllAngularRootElements=function(){return t.getAllRootElements()},Xt.frameworkStabilizers||(Xt.frameworkStabilizers=[]),Xt.frameworkStabilizers.push((function(t){var e=Xt.getAllAngularTestabilities(),n=e.length,i=!1,r=function(e){i=i||e,0==--n&&t(i)};e.forEach((function(t){t.whenStable(r)}))}))}},{key:"findTestabilityInTree",value:function(t,e,n){if(null==e)return null;var i=t.getTestability(e);return null!=i?i:n?od().isShadowRoot(e)?this.findTestabilityInTree(t,e.host,!0):this.findTestabilityInTree(t,e.parentElement,!0):null}}],[{key:"init",value:function(){var e;e=new t,Hc=e}}]),t}(),wf=new se("EventManagerPlugins"),kf=function(){var t=function(){function t(e,n){var i=this;_(this,t),this._zone=n,this._eventNameToPlugin=new Map,e.forEach((function(t){return t.manager=i})),this._plugins=e.slice().reverse()}return b(t,[{key:"addEventListener",value:function(t,e,n){return this._findPluginFor(e).addEventListener(t,e,n)}},{key:"addGlobalEventListener",value:function(t,e,n){return this._findPluginFor(e).addGlobalEventListener(t,e,n)}},{key:"getZone",value:function(){return this._zone}},{key:"_findPluginFor",value:function(t){var e=this._eventNameToPlugin.get(t);if(e)return e;for(var n=this._plugins,i=0;i-1&&(e.splice(n,1),a+=t+".")})),a+=r,0!=e.length||0===r.length)return null;var o={};return o.domEventName=i,o.fullKey=a,o}},{key:"getEventFullKey",value:function(t){var e="",n=function(t){var e=t.key;if(null==e){if(null==(e=t.keyIdentifier))return"Unidentified";e.startsWith("U+")&&(e=String.fromCharCode(parseInt(e.substring(2),16)),3===t.location&&jf.hasOwnProperty(e)&&(e=jf[e]))}return Bf[e]||e}(t);return" "===(n=n.toLowerCase())?n="space":"."===n&&(n="dot"),Hf.forEach((function(i){i!=n&&(0,Nf[i])(t)&&(e+=i+".")})),e+=n}},{key:"eventCallback",value:function(t,e,i){return function(r){n.getEventFullKey(r)===t&&i.runGuarded((function(){return e(r)}))}}},{key:"_normalizeKey",value:function(t){switch(t){case"esc":return"escape";default:return t}}}]),n}(Mf);return t.\u0275fac=function(e){return new(e||t)(ve(ud))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),Vf=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275prov=At({factory:function(){return ve(zf)},token:t,providedIn:"root"}),t}(),zf=function(){var t=function(t){f(n,t);var e=v(n);function n(t){var i;return _(this,n),(i=e.call(this))._doc=t,i}return b(n,[{key:"sanitize",value:function(t,e){if(null==e)return null;switch(t){case Ir.NONE:return e;case Ir.HTML:return or(e,"HTML")?ar(e):Ar(this._doc,String(e));case Ir.STYLE:return or(e,"Style")?ar(e):e;case Ir.SCRIPT:if(or(e,"Script"))return ar(e);throw new Error("unsafe value used in a script context");case Ir.URL:return sr(e),or(e,"URL")?ar(e):mr(String(e));case Ir.RESOURCE_URL:if(or(e,"ResourceURL"))return ar(e);throw new Error("unsafe value used in a resource URL context (see http://g.co/ng/security#xss)");default:throw new Error("Unexpected SecurityContext ".concat(t," (see http://g.co/ng/security#xss)"))}}},{key:"bypassSecurityTrustHtml",value:function(t){return new tr(t)}},{key:"bypassSecurityTrustStyle",value:function(t){return new er(t)}},{key:"bypassSecurityTrustScript",value:function(t){return new nr(t)}},{key:"bypassSecurityTrustUrl",value:function(t){return new ir(t)}},{key:"bypassSecurityTrustResourceUrl",value:function(t){return new rr(t)}}]),n}(Vf);return t.\u0275fac=function(e){return new(e||t)(ve(ud))},t.\u0275prov=At({factory:function(){return t=ve(ue),new zf(t.get(ud));var t},token:t,providedIn:"root"}),t}(),Uf=Vc(ed,"browser",[{provide:hc,useValue:"browser"},{provide:dc,useValue:function(){gf.makeCurrent(),bf.init()},multi:!0},{provide:ud,useFactory:function(){return function(t){yn=t}(document),document},deps:[]}]),qf=[[],{provide:Oo,useValue:"root"},{provide:Xi,useFactory:function(){return new Xi},deps:[]},{provide:wf,useClass:Ff,multi:!0,deps:[ud,Dc,hc]},{provide:wf,useClass:Wf,multi:!0,deps:[ud]},[],{provide:Pf,useClass:Pf,deps:[kf,Cf,uc]},{provide:ju,useExisting:Pf},{provide:Sf,useExisting:Cf},{provide:Cf,useClass:Cf,deps:[ud]},{provide:Rc,useClass:Rc,deps:[Dc]},{provide:kf,useClass:kf,deps:[wf,Dc]},[]],Gf=function(){var t=function(){function t(e){if(_(this,t),e)throw new Error("BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.")}return b(t,null,[{key:"withServerTransition",value:function(e){return{ngModule:t,providers:[{provide:uc,useValue:e.appId},{provide:_f,useExisting:uc},yf]}}}]),t}();return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)(ve(t,12))},providers:qf,imports:[df,id]}),t}();function Kf(t){return function(e){return e.lift(new Zf(t,e))}}"undefined"!=typeof window&&window;var Zf=function(){function t(e,n){_(this,t),this.notifier=e,this.source=n}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new Jf(t,this.notifier,this.source))}}]),t}(),Jf=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,t)).notifier=i,a.source=r,a}return b(n,[{key:"error",value:function(t){if(!this.isStopped){var e=this.errors,a=this.retries,o=this.retriesSubscription;if(a)this.errors=null,this.retriesSubscription=null;else{e=new z;try{a=(0,this.notifier)(e)}catch(s){return r(i(n.prototype),"error",this).call(this,s)}o=tt(this,a)}this._unsubscribeAndRecycle(),this.errors=e,this.retries=a,this.retriesSubscription=o,e.next(t)}}},{key:"_unsubscribe",value:function(){var t=this.errors,e=this.retriesSubscription;t&&(t.unsubscribe(),this.errors=null),e&&(e.unsubscribe(),this.retriesSubscription=null),this.retries=null}},{key:"notifyNext",value:function(t,e,n,i,r){var a=this._unsubscribe;this._unsubscribe=null,this._unsubscribeAndRecycle(),this._unsubscribe=a,this.source.subscribe(this)}}]),n}(et),Qf=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,t,i)).scheduler=t,r.work=i,r.pending=!1,r}return b(n,[{key:"schedule",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(this.closed)return this;this.state=t;var n=this.id,i=this.scheduler;return null!=n&&(this.id=this.recycleAsyncId(i,n,e)),this.pending=!0,this.delay=e,this.id=this.id||this.requestAsyncId(i,this.id,e),this}},{key:"requestAsyncId",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return setInterval(t.flush.bind(t,this),n)}},{key:"recycleAsyncId",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(null!==n&&this.delay===n&&!1===this.pending)return e;clearInterval(e)}},{key:"execute",value:function(t,e){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var n=this._execute(t,e);if(n)return n;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))}},{key:"_execute",value:function(t,e){var n=!1,i=void 0;try{this.work(t)}catch(r){n=!0,i=!!r&&r||new Error(r)}if(n)return this.unsubscribe(),i}},{key:"_unsubscribe",value:function(){var t=this.id,e=this.scheduler,n=e.actions,i=n.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==i&&n.splice(i,1),null!=t&&(this.id=this.recycleAsyncId(e,t,null)),this.delay=null}}]),n}(function(t){f(n,t);var e=v(n);function n(t,i){return _(this,n),e.call(this)}return b(n,[{key:"schedule",value:function(t){return this}}]),n}(x)),Xf=function(){var t=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t.now;_(this,t),this.SchedulerAction=e,this.now=n}return b(t,[{key:"schedule",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0;return new this.SchedulerAction(this,t).schedule(n,e)}}]),t}();return t.now=function(){return Date.now()},t}(),$f=function(t){f(n,t);var e=v(n);function n(t){var i,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Xf.now;return _(this,n),(i=e.call(this,t,(function(){return n.delegate&&n.delegate!==a(i)?n.delegate.now():r()}))).actions=[],i.active=!1,i.scheduled=void 0,i}return b(n,[{key:"schedule",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2?arguments[2]:void 0;return n.delegate&&n.delegate!==this?n.delegate.schedule(t,e,a):r(i(n.prototype),"schedule",this).call(this,t,e,a)}},{key:"flush",value:function(t){var e=this.actions;if(this.active)e.push(t);else{var n;this.active=!0;do{if(n=t.execute(t.state,t.delay))break}while(t=e.shift());if(this.active=!1,n){for(;t=e.shift();)t.unsubscribe();throw n}}}}]),n}(Xf),tp=new $f(Qf);function ep(t){return t instanceof Date&&!isNaN(+t)}var np=new B((function(t){return t.complete()}));function ip(t){return t?function(t){return new B((function(e){return t.schedule((function(){return e.complete()}))}))}(t):np}function rp(){for(var t=arguments.length,e=new Array(t),n=0;n1&&void 0!==arguments[1]?arguments[1]:tp,n=ep(t),i=n?+t-e.now():Math.abs(t);return function(t){return t.lift(new lp(i,e))}}var lp=function(){function t(e,n){_(this,t),this.delay=e,this.scheduler=n}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new cp(t,this.delay,this.scheduler))}}]),t}(),cp=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,t)).delay=i,a.scheduler=r,a.queue=[],a.active=!1,a.errored=!1,a}return b(n,[{key:"_schedule",value:function(t){this.active=!0,this.destination.add(t.schedule(n.dispatch,this.delay,{source:this,destination:this.destination,scheduler:t}))}},{key:"scheduleNotification",value:function(t){if(!0!==this.errored){var e=this.scheduler,n=new dp(e.now()+this.delay,t);this.queue.push(n),!1===this.active&&this._schedule(e)}}},{key:"_next",value:function(t){this.scheduleNotification(sp.createNext(t))}},{key:"_error",value:function(t){this.errored=!0,this.queue=[],this.destination.error(t),this.unsubscribe()}},{key:"_complete",value:function(){this.scheduleNotification(sp.createComplete()),this.unsubscribe()}}],[{key:"dispatch",value:function(t){for(var e=t.source,n=e.queue,i=t.scheduler,r=t.destination;n.length>0&&n[0].time-i.now()<=0;)n.shift().notification.observe(r);if(n.length>0){var a=Math.max(0,n[0].time-i.now());this.schedule(t,a)}else this.unsubscribe(),e.active=!1}}]),n}(P),dp=function t(e,n){_(this,t),this.time=e,this.notification=n},hp=n("kB5k"),fp=n.n(hp);function pp(t){return function(e){var n=new mp(t),i=e.lift(n);return n.caught=i}}var mp=function(){function t(e){_(this,t),this.selector=e}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new gp(t,this.selector,this.caught))}}]),t}(),gp=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,t)).selector=i,a.caught=r,a}return b(n,[{key:"error",value:function(t){if(!this.isStopped){var e;try{e=this.selector(t,this.caught)}catch(o){return void r(i(n.prototype),"error",this).call(this,o)}this._unsubscribeAndRecycle();var a=new G(this,void 0,void 0);this.add(a),tt(this,e,void 0,void 0,a)}}}]),n}(et),vp=function(){function t(){return Error.call(this),this.message="no elements in sequence",this.name="EmptyError",this}return t.prototype=Object.create(Error.prototype),t}();function _p(t,e){return function(n){return n.lift(new yp(t,e))}}var yp=function(){function t(e,n){_(this,t),this.predicate=e,this.thisArg=n}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new bp(t,this.predicate,this.thisArg))}}]),t}(),bp=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,t)).predicate=i,a.thisArg=r,a.count=0,a}return b(n,[{key:"_next",value:function(t){var e;try{e=this.predicate.call(this.thisArg,t,this.count++)}catch(n){return void this.destination.error(n)}e&&this.destination.next(t)}}]),n}(P),wp=function(){function t(){return Error.call(this),this.message="argument out of range",this.name="ArgumentOutOfRangeError",this}return t.prototype=Object.create(Error.prototype),t}();function kp(t){return function(e){return 0===t?ip():e.lift(new Mp(t))}}var Mp=function(){function t(e){if(_(this,t),this.total=e,this.total<0)throw new wp}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new Sp(t,this.total))}}]),t}(),Sp=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,t)).total=i,r.count=0,r}return b(n,[{key:"_next",value:function(t){var e=this.total,n=++this.count;n<=e&&(this.destination.next(t),n===e&&(this.destination.complete(),this.unsubscribe()))}}]),n}(P);function Cp(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return function(e){return e.lift(new xp(t))}}var xp=function(){function t(e){_(this,t),this.defaultValue=e}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new Dp(t,this.defaultValue))}}]),t}(),Dp=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,t)).defaultValue=i,r.isEmpty=!0,r}return b(n,[{key:"_next",value:function(t){this.isEmpty=!1,this.destination.next(t)}},{key:"_complete",value:function(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()}}]),n}(P);function Lp(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Op;return function(e){return e.lift(new Tp(t))}}var Tp=function(){function t(e){_(this,t),this.errorFactory=e}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new Ep(t,this.errorFactory))}}]),t}(),Ep=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,t)).errorFactory=i,r.hasValue=!1,r}return b(n,[{key:"_next",value:function(t){this.hasValue=!0,this.destination.next(t)}},{key:"_complete",value:function(){if(this.hasValue)return this.destination.complete();var t;try{t=this.errorFactory()}catch(e){t=e}this.destination.error(t)}}]),n}(P);function Op(){return new vp}function Ap(t,e){var n=arguments.length>=2;return function(i){return i.pipe(t?_p((function(e,n){return t(e,n,i)})):ct,kp(1),n?Cp(e):Lp((function(){return new vp})))}}function Pp(t,e){return st(t,e,1)}var Ip=function t(){_(this,t)},Yp=function t(){_(this,t)},Rp=function(){function t(e){var n=this;_(this,t),this.normalizedNames=new Map,this.lazyUpdate=null,e?this.lazyInit="string"==typeof e?function(){n.headers=new Map,e.split("\n").forEach((function(t){var e=t.indexOf(":");if(e>0){var i=t.slice(0,e),r=i.toLowerCase(),a=t.slice(e+1).trim();n.maybeSetNormalizedName(i,r),n.headers.has(r)?n.headers.get(r).push(a):n.headers.set(r,[a])}}))}:function(){n.headers=new Map,Object.keys(e).forEach((function(t){var i=e[t],r=t.toLowerCase();"string"==typeof i&&(i=[i]),i.length>0&&(n.headers.set(r,i),n.maybeSetNormalizedName(t,r))}))}:this.headers=new Map}return b(t,[{key:"has",value:function(t){return this.init(),this.headers.has(t.toLowerCase())}},{key:"get",value:function(t){this.init();var e=this.headers.get(t.toLowerCase());return e&&e.length>0?e[0]:null}},{key:"keys",value:function(){return this.init(),Array.from(this.normalizedNames.values())}},{key:"getAll",value:function(t){return this.init(),this.headers.get(t.toLowerCase())||null}},{key:"append",value:function(t,e){return this.clone({name:t,value:e,op:"a"})}},{key:"set",value:function(t,e){return this.clone({name:t,value:e,op:"s"})}},{key:"delete",value:function(t,e){return this.clone({name:t,value:e,op:"d"})}},{key:"maybeSetNormalizedName",value:function(t,e){this.normalizedNames.has(e)||this.normalizedNames.set(e,t)}},{key:"init",value:function(){var e=this;this.lazyInit&&(this.lazyInit instanceof t?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach((function(t){return e.applyUpdate(t)})),this.lazyUpdate=null))}},{key:"copyFrom",value:function(t){var e=this;t.init(),Array.from(t.headers.keys()).forEach((function(n){e.headers.set(n,t.headers.get(n)),e.normalizedNames.set(n,t.normalizedNames.get(n))}))}},{key:"clone",value:function(e){var n=new t;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof t?this.lazyInit:this,n.lazyUpdate=(this.lazyUpdate||[]).concat([e]),n}},{key:"applyUpdate",value:function(t){var e=t.name.toLowerCase();switch(t.op){case"a":case"s":var n=t.value;if("string"==typeof n&&(n=[n]),0===n.length)return;this.maybeSetNormalizedName(t.name,e);var i=("a"===t.op?this.headers.get(e):void 0)||[];i.push.apply(i,l(n)),this.headers.set(e,i);break;case"d":var r=t.value;if(r){var a=this.headers.get(e);if(!a)return;0===(a=a.filter((function(t){return-1===r.indexOf(t)}))).length?(this.headers.delete(e),this.normalizedNames.delete(e)):this.headers.set(e,a)}else this.headers.delete(e),this.normalizedNames.delete(e)}}},{key:"forEach",value:function(t){var e=this;this.init(),Array.from(this.normalizedNames.keys()).forEach((function(n){return t(e.normalizedNames.get(n),e.headers.get(n))}))}}]),t}(),Fp=function(){function t(){_(this,t)}return b(t,[{key:"encodeKey",value:function(t){return Bp(t)}},{key:"encodeValue",value:function(t){return Bp(t)}},{key:"decodeKey",value:function(t){return decodeURIComponent(t)}},{key:"decodeValue",value:function(t){return decodeURIComponent(t)}}]),t}();function Hp(t,e){var n=new Map;return t.length>0&&t.split("&").forEach((function(t){var i=t.indexOf("="),r=u(-1==i?[e.decodeKey(t),""]:[e.decodeKey(t.slice(0,i)),e.decodeValue(t.slice(i+1))],2),a=r[0],o=r[1],s=n.get(a)||[];s.push(o),n.set(a,s)})),n}function Bp(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var jp=function(){function t(){var e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(_(this,t),this.updates=null,this.cloneFrom=null,this.encoder=n.encoder||new Fp,n.fromString){if(n.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=Hp(n.fromString,this.encoder)}else n.fromObject?(this.map=new Map,Object.keys(n.fromObject).forEach((function(t){var i=n.fromObject[t];e.map.set(t,Array.isArray(i)?i:[i])}))):this.map=null}return b(t,[{key:"has",value:function(t){return this.init(),this.map.has(t)}},{key:"get",value:function(t){this.init();var e=this.map.get(t);return e?e[0]:null}},{key:"getAll",value:function(t){return this.init(),this.map.get(t)||null}},{key:"keys",value:function(){return this.init(),Array.from(this.map.keys())}},{key:"append",value:function(t,e){return this.clone({param:t,value:e,op:"a"})}},{key:"set",value:function(t,e){return this.clone({param:t,value:e,op:"s"})}},{key:"delete",value:function(t,e){return this.clone({param:t,value:e,op:"d"})}},{key:"toString",value:function(){var t=this;return this.init(),this.keys().map((function(e){var n=t.encoder.encodeKey(e);return t.map.get(e).map((function(e){return n+"="+t.encoder.encodeValue(e)})).join("&")})).filter((function(t){return""!==t})).join("&")}},{key:"clone",value:function(e){var n=new t({encoder:this.encoder});return n.cloneFrom=this.cloneFrom||this,n.updates=(this.updates||[]).concat([e]),n}},{key:"init",value:function(){var t=this;null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach((function(e){return t.map.set(e,t.cloneFrom.map.get(e))})),this.updates.forEach((function(e){switch(e.op){case"a":case"s":var n=("a"===e.op?t.map.get(e.param):void 0)||[];n.push(e.value),t.map.set(e.param,n);break;case"d":if(void 0===e.value){t.map.delete(e.param);break}var i=t.map.get(e.param)||[],r=i.indexOf(e.value);-1!==r&&i.splice(r,1),i.length>0?t.map.set(e.param,i):t.map.delete(e.param)}})),this.cloneFrom=this.updates=null)}}]),t}();function Np(t){return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer}function Wp(t){return"undefined"!=typeof Blob&&t instanceof Blob}function Vp(t){return"undefined"!=typeof FormData&&t instanceof FormData}var zp=function(){function t(e,n,i,r){var a;if(_(this,t),this.url=n,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=e.toUpperCase(),function(t){switch(t){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||r?(this.body=void 0!==i?i:null,a=r):a=i,a&&(this.reportProgress=!!a.reportProgress,this.withCredentials=!!a.withCredentials,a.responseType&&(this.responseType=a.responseType),a.headers&&(this.headers=a.headers),a.params&&(this.params=a.params)),this.headers||(this.headers=new Rp),this.params){var o=this.params.toString();if(0===o.length)this.urlWithParams=n;else{var s=n.indexOf("?");this.urlWithParams=n+(-1===s?"?":s0&&void 0!==arguments[0]?arguments[0]:{},n=e.method||this.method,i=e.url||this.url,r=e.responseType||this.responseType,a=void 0!==e.body?e.body:this.body,o=void 0!==e.withCredentials?e.withCredentials:this.withCredentials,s=void 0!==e.reportProgress?e.reportProgress:this.reportProgress,u=e.headers||this.headers,l=e.params||this.params;return void 0!==e.setHeaders&&(u=Object.keys(e.setHeaders).reduce((function(t,n){return t.set(n,e.setHeaders[n])}),u)),e.setParams&&(l=Object.keys(e.setParams).reduce((function(t,n){return t.set(n,e.setParams[n])}),l)),new t(n,i,a,{params:l,headers:u,reportProgress:s,responseType:r,withCredentials:o})}}]),t}(),Up=function(t){return t[t.Sent=0]="Sent",t[t.UploadProgress=1]="UploadProgress",t[t.ResponseHeader=2]="ResponseHeader",t[t.DownloadProgress=3]="DownloadProgress",t[t.Response=4]="Response",t[t.User=5]="User",t}({}),qp=function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:200,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"OK";_(this,t),this.headers=e.headers||new Rp,this.status=void 0!==e.status?e.status:n,this.statusText=e.statusText||i,this.url=e.url||null,this.ok=this.status>=200&&this.status<300},Gp=function(t){f(n,t);var e=v(n);function n(){var t,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return _(this,n),(t=e.call(this,i)).type=Up.ResponseHeader,t}return b(n,[{key:"clone",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return new n({headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})}}]),n}(qp),Kp=function(t){f(n,t);var e=v(n);function n(){var t,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return _(this,n),(t=e.call(this,i)).type=Up.Response,t.body=void 0!==i.body?i.body:null,t}return b(n,[{key:"clone",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return new n({body:void 0!==t.body?t.body:this.body,headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})}}]),n}(qp),Zp=function(t){f(n,t);var e=v(n);function n(t){var i;return _(this,n),(i=e.call(this,t,0,"Unknown Error")).name="HttpErrorResponse",i.ok=!1,i.message=i.status>=200&&i.status<300?"Http failure during parsing for ".concat(t.url||"(unknown url)"):"Http failure response for ".concat(t.url||"(unknown url)",": ").concat(t.status," ").concat(t.statusText),i.error=t.error||null,i}return n}(qp);function Jp(t,e){return{body:e,headers:t.headers,observe:t.observe,params:t.params,reportProgress:t.reportProgress,responseType:t.responseType,withCredentials:t.withCredentials}}var Qp=function(){var t=function(){function t(e){_(this,t),this.handler=e}return b(t,[{key:"request",value:function(t,e){var n,i=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(t instanceof zp)n=t;else{var a=void 0;a=r.headers instanceof Rp?r.headers:new Rp(r.headers);var o=void 0;r.params&&(o=r.params instanceof jp?r.params:new jp({fromObject:r.params})),n=new zp(t,e,void 0!==r.body?r.body:null,{headers:a,params:o,reportProgress:r.reportProgress,responseType:r.responseType||"json",withCredentials:r.withCredentials})}var s=rp(n).pipe(Pp((function(t){return i.handler.handle(t)})));if(t instanceof zp||"events"===r.observe)return s;var u=s.pipe(_p((function(t){return t instanceof Kp})));switch(r.observe||"body"){case"body":switch(n.responseType){case"arraybuffer":return u.pipe(nt((function(t){if(null!==t.body&&!(t.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return t.body})));case"blob":return u.pipe(nt((function(t){if(null!==t.body&&!(t.body instanceof Blob))throw new Error("Response is not a Blob.");return t.body})));case"text":return u.pipe(nt((function(t){if(null!==t.body&&"string"!=typeof t.body)throw new Error("Response is not a string.");return t.body})));case"json":default:return u.pipe(nt((function(t){return t.body})))}case"response":return u;default:throw new Error("Unreachable: unhandled observe type ".concat(r.observe,"}"))}}},{key:"delete",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("DELETE",t,e)}},{key:"get",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("GET",t,e)}},{key:"head",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("HEAD",t,e)}},{key:"jsonp",value:function(t,e){return this.request("JSONP",t,{params:(new jp).append(e,"JSONP_CALLBACK"),observe:"body",responseType:"json"})}},{key:"options",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("OPTIONS",t,e)}},{key:"patch",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.request("PATCH",t,Jp(n,e))}},{key:"post",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.request("POST",t,Jp(n,e))}},{key:"put",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.request("PUT",t,Jp(n,e))}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(Ip))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),Xp=function(){function t(e,n){_(this,t),this.next=e,this.interceptor=n}return b(t,[{key:"handle",value:function(t){return this.interceptor.intercept(t,this.next)}}]),t}(),$p=new se("HTTP_INTERCEPTORS"),tm=function(){var t=function(){function t(){_(this,t)}return b(t,[{key:"intercept",value:function(t,e){return e.handle(t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),em=/^\)\]\}',?\n/,nm=function t(){_(this,t)},im=function(){var t=function(){function t(){_(this,t)}return b(t,[{key:"build",value:function(){return new XMLHttpRequest}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),rm=function(){var t=function(){function t(e){_(this,t),this.xhrFactory=e}return b(t,[{key:"handle",value:function(t){var e=this;if("JSONP"===t.method)throw new Error("Attempted to construct Jsonp request without HttpClientJsonpModule installed.");return new B((function(n){var i=e.xhrFactory.build();if(i.open(t.method,t.urlWithParams),t.withCredentials&&(i.withCredentials=!0),t.headers.forEach((function(t,e){return i.setRequestHeader(t,e.join(","))})),t.headers.has("Accept")||i.setRequestHeader("Accept","application/json, text/plain, */*"),!t.headers.has("Content-Type")){var r=t.detectContentTypeHeader();null!==r&&i.setRequestHeader("Content-Type",r)}if(t.responseType){var a=t.responseType.toLowerCase();i.responseType="json"!==a?a:"text"}var o=t.serializeBody(),s=null,u=function(){if(null!==s)return s;var e=1223===i.status?204:i.status,n=i.statusText||"OK",r=new Rp(i.getAllResponseHeaders()),a=function(t){return"responseURL"in t&&t.responseURL?t.responseURL:/^X-Request-URL:/m.test(t.getAllResponseHeaders())?t.getResponseHeader("X-Request-URL"):null}(i)||t.url;return s=new Gp({headers:r,status:e,statusText:n,url:a})},l=function(){var e=u(),r=e.headers,a=e.status,o=e.statusText,s=e.url,l=null;204!==a&&(l=void 0===i.response?i.responseText:i.response),0===a&&(a=l?200:0);var c=a>=200&&a<300;if("json"===t.responseType&&"string"==typeof l){var d=l;l=l.replace(em,"");try{l=""!==l?JSON.parse(l):null}catch(h){l=d,c&&(c=!1,l={error:h,text:l})}}c?(n.next(new Kp({body:l,headers:r,status:a,statusText:o,url:s||void 0})),n.complete()):n.error(new Zp({error:l,headers:r,status:a,statusText:o,url:s||void 0}))},c=function(t){var e=u(),r=new Zp({error:t,status:i.status||0,statusText:i.statusText||"Unknown Error",url:e.url||void 0});n.error(r)},d=!1,h=function(e){d||(n.next(u()),d=!0);var r={type:Up.DownloadProgress,loaded:e.loaded};e.lengthComputable&&(r.total=e.total),"text"===t.responseType&&i.responseText&&(r.partialText=i.responseText),n.next(r)},f=function(t){var e={type:Up.UploadProgress,loaded:t.loaded};t.lengthComputable&&(e.total=t.total),n.next(e)};return i.addEventListener("load",l),i.addEventListener("error",c),t.reportProgress&&(i.addEventListener("progress",h),null!==o&&i.upload&&i.upload.addEventListener("progress",f)),i.send(o),n.next({type:Up.Sent}),function(){i.removeEventListener("error",c),i.removeEventListener("load",l),t.reportProgress&&(i.removeEventListener("progress",h),null!==o&&i.upload&&i.upload.removeEventListener("progress",f)),i.readyState!==i.DONE&&i.abort()}}))}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(nm))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),am=new se("XSRF_COOKIE_NAME"),om=new se("XSRF_HEADER_NAME"),sm=function t(){_(this,t)},um=function(){var t=function(){function t(e,n,i){_(this,t),this.doc=e,this.platform=n,this.cookieName=i,this.lastCookieString="",this.lastToken=null,this.parseCount=0}return b(t,[{key:"getToken",value:function(){if("server"===this.platform)return null;var t=this.doc.cookie||"";return t!==this.lastCookieString&&(this.parseCount++,this.lastToken=Sh(t,this.cookieName),this.lastCookieString=t),this.lastToken}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(ud),ve(hc),ve(am))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),lm=function(){var t=function(){function t(e,n){_(this,t),this.tokenService=e,this.headerName=n}return b(t,[{key:"intercept",value:function(t,e){var n=t.url.toLowerCase();if("GET"===t.method||"HEAD"===t.method||n.startsWith("http://")||n.startsWith("https://"))return e.handle(t);var i=this.tokenService.getToken();return null===i||t.headers.has(this.headerName)||(t=t.clone({headers:t.headers.set(this.headerName,i)})),e.handle(t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(sm),ve(om))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),cm=function(){var t=function(){function t(e,n){_(this,t),this.backend=e,this.injector=n,this.chain=null}return b(t,[{key:"handle",value:function(t){if(null===this.chain){var e=this.injector.get($p,[]);this.chain=e.reduceRight((function(t,e){return new Xp(t,e)}),this.backend)}return this.chain.handle(t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(Yp),ve(qo))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),dm=function(){var t=function(){function t(){_(this,t)}return b(t,null,[{key:"disable",value:function(){return{ngModule:t,providers:[{provide:lm,useClass:tm}]}}},{key:"withOptions",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{ngModule:t,providers:[e.cookieName?{provide:am,useValue:e.cookieName}:[],e.headerName?{provide:om,useValue:e.headerName}:[]]}}}]),t}();return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[lm,{provide:$p,useExisting:lm,multi:!0},{provide:sm,useClass:um},{provide:am,useValue:"XSRF-TOKEN"},{provide:om,useValue:"X-XSRF-TOKEN"}]}),t}(),hm=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[Qp,{provide:Ip,useClass:cm},rm,{provide:Yp,useExisting:rm},im,{provide:nm,useExisting:im}],imports:[[dm.withOptions({cookieName:"XSRF-TOKEN",headerName:"X-XSRF-TOKEN"})]]}),t}(),fm=function(t){return t.NoInternet="NoInternet",t.Unauthorized="Unauthorized",t.ApiDisabled="ApiDisabled",t.Unknown="Unknown",t}({}),pm=function(t){return t.Success="Success",t.FailedOrRefused="FailedOrRefused",t.PinMismatch="PinMismatch",t.WithoutSeed="WithoutSeed",t.WrongPin="WrongPin",t.IncorrectHardwareWallet="IncorrectHardwareWallet",t.WrongWord="WrongWord",t.InvalidSeed="InvalidSeed",t.WrongSeed="WrongSeed",t.UndefinedError="UndefinedError",t.Disconnected="Disconnected",t.DaemonConnectionError="DaemonConnectionError",t.InvalidAddress="InvalidAddress",t.Timeout="Timeout",t.NotInBootloaderMode="NotInBootloaderMode",t.AddressGeneratorProblem="AddressGeneratorProblem",t}({}),mm=function(){return function(){}}();function gm(t){if(t.type)return t;var e=new mm;if(e.originalError=t,!t||"string"==typeof t)return e.originalServerErrorMsg=t||"",e.translatableErrorMsg=t||"service.api.unknown-error",e.type=fm.Unknown,e;e.originalServerErrorMsg=vm(t);var n=t;return null!=n.status&&(0===n.status||504===n.status?(e.type=fm.NoInternet,e.translatableErrorMsg="service.api.no-internet-error"):0===n.status||403===n.status?(e.type=fm.ApiDisabled,e.translatableErrorMsg="service.api.api-disabled-error"):400===n.status&&-1!==e.originalServerErrorMsg.toUpperCase().indexOf("Invalid password".toUpperCase())&&(e.type=fm.Unauthorized,e.translatableErrorMsg="service.api.incorrect-password-error")),e.type||(e.type=fm.Unknown,e.translatableErrorMsg=e.originalServerErrorMsg?function(t){if(!t||0===t.length)return t;var e,n,i=(n=null,(e=(e=t).toUpperCase()).includes("CHANGEADDRESS MUST NOT BE THE NULL ADDRESS")?n="null-change-address-error":e.includes("TO IS REQUIRED")?n="to-required-error":e.includes("TO.COINS MUST NOT BE ZERO")?n="zero-coins-error":e.includes("TO.ADDRESS MUST NOT BE THE NULL ADDRESS")?n="null-destination-error":e.includes("TO CONTAINS DUPLICATE VALUES")?n="duplicate-destination-error":e.includes("TO.HOURS MUST BE ZERO FOR AUTO TYPE HOURS SELECTION")?n="hours-in-automatic-mode-error":e.includes("HOURSSELECTION.MODE IS REQUIRED FOR AUTO TYPE HOURS SELECTION")?n="hours-allocation-mode-needed-error":e.includes("INVALID HOURSSELECTION.MODE")?n="invalid-hours-allocation-mode-error":e.includes("HOURSSELECTION.MODE CANNOT BE USED FOR MANUAL TYPE HOURS SELECTION")?n="hours-allocation-mode-not-needed-error":e.includes("INVALID HOURSSELECTION.TYPE")?n="invalid-hours-mode-error":e.includes("HOURSSELECTION.SHAREFACTOR MUST BE SET FOR SHARE MODE")?n="share-factor-needed-error":e.includes("HOURSSELECTION.SHAREFACTOR CAN ONLY BE USED FOR SHARE MODE")?n="share-factor-not-needed-error":e.includes("HOURSSELECTION.SHAREFACTOR MUST BE >= 0 AND <= 1")?n="invalid-share-factor-error":e.includes("TRANSACTION VIOLATES HARD CONSTRAINT: DUPLICATE OUTPUT IN TRANSACTION")?n="change-equal-to-destination-error":e.includes("FINGERPRINT CONFLICT FOR")&&(n="repeated-wallet"),n?"send.known-node-errors."+n:null);if(i)return i;if(-1!==t.indexOf('"error":'))try{t=JSON.parse(t).error.message}catch(o){}if(t.startsWith("400")||t.startsWith("403")){var r=t.split(" - ",2);t=2===r.length?r[1]:t}var a=(t=t.trim()).substr(0,1);return a.toUpperCase()!==a&&(t=a.toUpperCase()+t.substr(1,t.length-1)),t.endsWith(".")||t.endsWith(",")||t.endsWith(":")||t.endsWith(";")||t.endsWith("?")||t.endsWith("!")||(t+="."),t}(e.originalServerErrorMsg):"service.api.unknown-error"),e}function vm(t){if(t){if("string"==typeof t._body)return t._body;if(t.originalServerErrorMsg&&"string"==typeof t.originalServerErrorMsg)return t.originalServerErrorMsg;if(t.error&&"string"==typeof t.error)return t.error;if(t.error&&t.error.error&&t.error.error.message)return t.error.error.message;if(t.error&&t.error.error&&"string"==typeof t.error.error)return t.error.error;if(t.message)return t.message;if(t._body&&t._body.error)return t._body.error;try{return JSON.parse(t._body).error}catch(e){}}return null}function _m(t){window.location.assign("assets/error-alert/index.html?"+t)}var ym=function(){function t(t){this.http=t,this.url="/api/"}return t.prototype.get=function(t,e,n){var i=this;return void 0===e&&(e=null),void 0===n&&(n=null),n=n?Object.assign(this.createDefaultRequestOptions(),n):this.createDefaultRequestOptions(),this.http.get(this.getUrl(t,e,n.useV2),this.returnRequestOptions(n,null)).pipe(pp((function(t){return i.processConnectionError(t)})))},t.prototype.post=function(t,e,n){var i=this;return void 0===e&&(e=null),void 0===n&&(n=null),n=n?Object.assign(this.createDefaultRequestOptions(),n):this.createDefaultRequestOptions(),this.getCsrf().pipe(Ap(),st((function(r){return n.useV2&&(n.sendDataAsJson=!0),i.http.post(i.getUrl(t,null,n.useV2),n.sendDataAsJson?e?JSON.stringify(e):"":i.getQueryString(e),i.returnRequestOptions(n,r)).pipe(pp((function(t){return i.processConnectionError(t)})))})))},t.prototype.createDefaultRequestOptions=function(){return{useV2:!1,sendDataAsJson:!1}},t.prototype.getCsrf=function(){return this.get("csrf").pipe(nt((function(t){return t.csrf_token})))},t.prototype.returnRequestOptions=function(t,e){var n={};return n.headers=new Rp,n.headers=n.headers.append("Content-Type",t.sendDataAsJson?"application/json":"application/x-www-form-urlencoded"),e&&(n.headers=n.headers.append("X-CSRF-Token",e)),n},t.prototype.getQueryString=function(t){return void 0===t&&(t=null),t?Object.keys(t).reduce((function(e,n){return e.push(n+"="+encodeURIComponent(t[n])),e}),[]).join("&"):""},t.prototype.getUrl=function(t,e,n){return void 0===e&&(e=null),void 0===n&&(n=!1),t.startsWith("/")&&(t=t.substr(1,t.length-1)),this.url+(n?"v2/":"v1/")+t+"?"+this.getQueryString(e)},t.prototype.processConnectionError=function(t){return ap(gm(t))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(Qp))}}),t}();function bm(t){var e=document.createElement("textarea");e.style.position="fixed",e.style.left="0",e.style.top="0",e.style.opacity="0",e.value=t,document.body.appendChild(e),e.focus(),e.select(),document.execCommand("copy"),document.body.removeChild(e)}var wm=function(){return function(){}}();function km(t){var e;try{e=new URL(t)}catch(i){}if(!e||!e.protocol||"skycoin:"!==e.protocol.toLowerCase()||!e.pathname)return null;var n=new wm;return n.address=e.pathname,n.coins=e.searchParams.get("amount"),n.hours=e.searchParams.get("hours"),n.message=e.searchParams.get("message"),n}var Mm={otcEnabled:!1,maxHardwareWalletAddresses:1,urlForHwWalletVersionChecking:"https://version.skycoin.com/skywallet/version.txt",hwWalletDownloadUrlAndPrefix:"https://downloads.skycoin.com/skywallet/skywallet-firmware-v",hwWalletDaemonDownloadUrl:"https://www.skycoin.com/downloads/",urlForVersionChecking:"https://version.skycoin.com/skycoin/version.txt",walletDownloadUrl:"https://www.skycoin.com/downloads/",priceApiId:"sky-skycoin",languages:[{code:"en",name:"English",iconName:"en.png"},{code:"zh",name:"\u4e2d\u6587",iconName:"zh.png"},{code:"es",name:"Espa\xf1ol",iconName:"es.png"}],defaultLanguage:"en",mediumModalWidth:"566px"},Sm=function(){function t(t,e){this.apiService=t,this.http=e,this.csrfDisabledInternal=!1,this.fullCoinNameInternal=" ",this.coinNameInternal=" ",this.hoursNameInternal=" ",this.hoursNameSingularInternal=" ",this.explorerUrlInternal=" ",this.currentMaxDecimalsInternal=6,this.burnRateInternal=new hp.BigNumber(2),this.updateAvailableInternal=!1,this.lastestVersionInternal="",this.uriSpecificatioPrefixInternal=""}return Object.defineProperty(t.prototype,"csrfDisabled",{get:function(){return this.csrfDisabledInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"nodeVersion",{get:function(){return this.nodeVersionInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"fullCoinName",{get:function(){return this.fullCoinNameInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"coinName",{get:function(){return this.coinNameInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"hoursName",{get:function(){return this.hoursNameInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"hoursNameSingular",{get:function(){return this.hoursNameSingularInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"explorerUrl",{get:function(){return this.explorerUrlInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"currentMaxDecimals",{get:function(){return this.currentMaxDecimalsInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"burnRate",{get:function(){return this.burnRateInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"updateAvailable",{get:function(){return this.updateAvailableInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"lastestVersion",{get:function(){return this.lastestVersionInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"uriSpecificatioPrefix",{get:function(){return this.uriSpecificatioPrefixInternal},enumerable:!1,configurable:!0}),t.prototype.UpdateData=function(){var t=this;this.apiService.get("health").subscribe((function(e){t.nodeVersionInternal=e.version.version,t.burnRateInternal=new hp.BigNumber(e.user_verify_transaction.burn_factor),t.currentMaxDecimalsInternal=e.user_verify_transaction.max_decimals,t.detectUpdateAvailable(),t.fullCoinNameInternal=e.fiber.display_name,t.coinNameInternal=e.fiber.ticker,t.hoursNameInternal=e.fiber.coin_hours_display_name,t.hoursNameSingularInternal=e.fiber.coin_hours_display_name_singular,t.explorerUrlInternal=e.fiber.explorer_url,t.uriSpecificatioPrefixInternal=e.fiber.qr_uri_prefix,t.explorerUrlInternal.endsWith("/")&&(t.explorerUrlInternal=t.explorerUrlInternal.substr(0,t.explorerUrl.length-1)),e.csrf_enabled||(t.csrfDisabledInternal=!0)}),(function(){return _m(2)}))},t.prototype.detectUpdateAvailable=function(){var t=this;Mm.urlForVersionChecking&&this.http.get(Mm.urlForVersionChecking,{responseType:"text"}).pipe(Kf((function(t){return t.pipe(up(3e4))}))).subscribe((function(e){t.lastestVersionInternal=e.trim(),t.lastestVersionInternal.startsWith("v")&&(t.lastestVersionInternal=t.lastestVersionInternal.substr(1)),t.updateAvailableInternal=function(t,e){for(var n=e.split("."),i=t.split("-"),r=i[0].split("."),a=0;a<3;a++){var o=Number(n[a]),s=Number(r[a]);if(o>s)return!0;if(o2&&void 0!==arguments[2]?arguments[2]:tp;return function(i){var r=ep(t),a=r?+t-n.now():Math.abs(t);return i.lift(new Lm(a,r,e,n))}}var Lm=function(){function t(e,n,i,r){_(this,t),this.waitFor=e,this.absoluteTimeout=n,this.withObservable=i,this.scheduler=r}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new Tm(t,this.absoluteTimeout,this.waitFor,this.withObservable,this.scheduler))}}]),t}(),Tm=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o){var s;return _(this,n),(s=e.call(this,t)).absoluteTimeout=i,s.waitFor=r,s.withObservable=a,s.scheduler=o,s.action=null,s.scheduleTimeout(),s}return b(n,[{key:"scheduleTimeout",value:function(){var t=this.action;t?this.action=t.schedule(this,this.waitFor):this.add(this.action=this.scheduler.schedule(n.dispatchTimeout,this.waitFor,this))}},{key:"_next",value:function(t){this.absoluteTimeout||this.scheduleTimeout(),r(i(n.prototype),"_next",this).call(this,t)}},{key:"_unsubscribe",value:function(){this.action=null,this.scheduler=null,this.withObservable=null}}],[{key:"dispatchTimeout",value:function(t){var e=t.withObservable;t._unsubscribeAndRecycle(),t.add(tt(t,e))}}]),n}(et);function Em(t){return null!=t&&"false"!=="".concat(t)}function Om(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return Am(t)?Number(t):e}function Am(t){return!isNaN(parseFloat(t))&&!isNaN(Number(t))}function Pm(t){return Array.isArray(t)?t:[t]}function Im(t){return null==t?"":"string"==typeof t?t:"".concat(t,"px")}function Ym(t){return t instanceof Hu?t.nativeElement:t}function Rm(t,e,n,i){return S(n)&&(i=n,n=void 0),i?Rm(t,e,n).pipe(nt((function(t){return k(t)?i.apply(void 0,l(t)):i(t)}))):new B((function(i){!function t(e,n,i,r,a){var o;if(function(t){return t&&"function"==typeof t.addEventListener&&"function"==typeof t.removeEventListener}(e)){var s=e;e.addEventListener(n,i,a),o=function(){return s.removeEventListener(n,i,a)}}else if(function(t){return t&&"function"==typeof t.on&&"function"==typeof t.off}(e)){var u=e;e.on(n,i),o=function(){return u.off(n,i)}}else if(function(t){return t&&"function"==typeof t.addListener&&"function"==typeof t.removeListener}(e)){var l=e;e.addListener(n,i),o=function(){return l.removeListener(n,i)}}else{if(!e||!e.length)throw new TypeError("Invalid event target");for(var c=0,d=e.length;c1?Array.prototype.slice.call(arguments):t)}),i,n)}))}var Fm=1,Hm={},Bm=function(t){var e=Fm++;return Hm[e]=t,Promise.resolve().then((function(){return function(t){var e=Hm[t];e&&e()}(e)})),e},jm=function(t){delete Hm[t]},Nm=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,t,i)).scheduler=t,r.work=i,r}return b(n,[{key:"requestAsyncId",value:function(t,e){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return null!==a&&a>0?r(i(n.prototype),"requestAsyncId",this).call(this,t,e,a):(t.actions.push(this),t.scheduled||(t.scheduled=Bm(t.flush.bind(t,null))))}},{key:"recycleAsyncId",value:function(t,e){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(null!==a&&a>0||null===a&&this.delay>0)return r(i(n.prototype),"recycleAsyncId",this).call(this,t,e,a);0===t.actions.length&&(jm(e),t.scheduled=void 0)}}]),n}(Qf),Wm=new(function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return b(n,[{key:"flush",value:function(t){this.active=!0,this.scheduled=void 0;var e,n=this.actions,i=-1,r=n.length;t=t||n.shift();do{if(e=t.execute(t.state,t.delay))break}while(++i=0}function Jm(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,i=-1;return Zm(e)?i=Number(e)<1?1:Number(e):q(e)&&(n=e),q(n)||(n=tp),new B((function(e){var r=Zm(t)?t:+t-n.now();return n.schedule(Qm,r,{index:0,period:i,subscriber:e})}))}function Qm(t){var e=t.index,n=t.period,i=t.subscriber;if(i.next(e),!i.closed){if(-1===n)return i.complete();t.index=e+1,this.schedule(t,n)}}function Xm(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:tp;return qm((function(){return Jm(t,e)}))}function $m(t){return function(e){return e.lift(new tg(t))}}var tg=function(){function t(e){_(this,t),this.notifier=e}return b(t,[{key:"call",value:function(t,e){var n=new eg(t),i=tt(n,this.notifier);return i&&!n.seenValue?(n.add(i),e.subscribe(n)):n}}]),t}(),eg=function(t){f(n,t);var e=v(n);function n(t){var i;return _(this,n),(i=e.call(this,t)).seenValue=!1,i}return b(n,[{key:"notifyNext",value:function(t,e,n,i,r){this.seenValue=!0,this.complete()}},{key:"notifyComplete",value:function(){}}]),n}(et);function ng(){return dt(1)}function ig(){return ng()(rp.apply(void 0,arguments))}function rg(){for(var t=arguments.length,e=new Array(t),n=0;n1&&void 0!==arguments[1]?arguments[1]:0;return e>0?r(i(n.prototype),"schedule",this).call(this,t,e):(this.delay=e,this.state=t,this.scheduler.flush(this),this)}},{key:"execute",value:function(t,e){return e>0||this.closed?r(i(n.prototype),"execute",this).call(this,t,e):this._execute(t,e)}},{key:"requestAsyncId",value:function(t,e){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return null!==a&&a>0||null===a&&this.delay>0?r(i(n.prototype),"requestAsyncId",this).call(this,t,e,a):t.flush(this)}}]),n}(Qf),cg=new(function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return n}($f))(lg),dg=function(t){f(n,t);var e=v(n);function n(t,i){var r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return _(this,n),(r=e.call(this,t)).scheduler=i,r.delay=a,r}return b(n,[{key:"scheduleMessage",value:function(t){this.destination.add(this.scheduler.schedule(n.dispatch,this.delay,new hg(t,this.destination)))}},{key:"_next",value:function(t){this.scheduleMessage(sp.createNext(t))}},{key:"_error",value:function(t){this.scheduleMessage(sp.createError(t)),this.unsubscribe()}},{key:"_complete",value:function(){this.scheduleMessage(sp.createComplete()),this.unsubscribe()}}],[{key:"dispatch",value:function(t){t.notification.observe(t.destination),this.unsubscribe()}}]),n}(P),hg=function t(e,n){_(this,t),this.notification=e,this.destination=n},fg=function(t){f(n,t);var e=v(n);function n(){var t,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Number.POSITIVE_INFINITY,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.POSITIVE_INFINITY,a=arguments.length>2?arguments[2]:void 0;return _(this,n),(t=e.call(this)).scheduler=a,t._events=[],t._infiniteTimeWindow=!1,t._bufferSize=i<1?1:i,t._windowTime=r<1?1:r,r===Number.POSITIVE_INFINITY?(t._infiniteTimeWindow=!0,t.next=t.nextInfiniteTimeWindow):t.next=t.nextTimeWindow,t}return b(n,[{key:"nextInfiniteTimeWindow",value:function(t){var e=this._events;e.push(t),e.length>this._bufferSize&&e.shift(),r(i(n.prototype),"next",this).call(this,t)}},{key:"nextTimeWindow",value:function(t){this._events.push(new pg(this._getNow(),t)),this._trimBufferThenGetEvents(),r(i(n.prototype),"next",this).call(this,t)}},{key:"_subscribe",value:function(t){var e,n=this._infiniteTimeWindow,i=n?this._events:this._trimBufferThenGetEvents(),r=this.scheduler,a=i.length;if(this.closed)throw new N;if(this.isStopped||this.hasError?e=x.EMPTY:(this.observers.push(t),e=new W(this,t)),r&&t.add(t=new dg(t,r)),n)for(var o=0;oe&&(a=Math.max(a,r-e)),a>0&&i.splice(0,a),i}}]),n}(z),pg=function t(e,n){_(this,t),this.time=e,this.value=n};try{og="undefined"!=typeof Intl&&Intl.v8BreakIterator}catch(lU){og=!1}var mg,gg,vg,_g,yg,bg=function(){var t=function t(e){_(this,t),this._platformId=e,this.isBrowser=this._platformId?"browser"===this._platformId:"object"==typeof document&&!!document,this.EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent),this.TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent),this.BLINK=this.isBrowser&&!(!window.chrome&&!og)&&"undefined"!=typeof CSS&&!this.EDGE&&!this.TRIDENT,this.WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT,this.IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window),this.FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent),this.ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT,this.SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT};return t.\u0275fac=function(e){return new(e||t)(ve(hc))},t.\u0275prov=At({factory:function(){return new t(ve(hc))},token:t,providedIn:"root"}),t}(),wg=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)}}),t}(),kg=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function Mg(){if(mg)return mg;if("object"!=typeof document||!document)return mg=new Set(kg);var t=document.createElement("input");return mg=new Set(kg.filter((function(e){return t.setAttribute("type",e),t.type===e})))}function Sg(t){return function(){if(null==gg&&"undefined"!=typeof window)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){return gg=!0}}))}finally{gg=gg||!1}return gg}()?t:!!t.capture}function Cg(){if("object"!=typeof document||!document)return 0;if(null==vg){var t=document.createElement("div"),e=t.style;t.dir="rtl",e.width="1px",e.overflow="auto",e.visibility="hidden",e.pointerEvents="none",e.position="absolute";var n=document.createElement("div"),i=n.style;i.width="2px",i.height="1px",t.appendChild(n),document.body.appendChild(t),vg=0,0===t.scrollLeft&&(t.scrollLeft=1,vg=0===t.scrollLeft?1:2),t.parentNode.removeChild(t)}return vg}function xg(t){if(function(){if(null==yg){var t="undefined"!=typeof document?document.head:null;yg=!(!t||!t.createShadowRoot&&!t.attachShadow)}return yg}()){var e=t.getRootNode?t.getRootNode():null;if("undefined"!=typeof ShadowRoot&&ShadowRoot&&e instanceof ShadowRoot)return e}return null}var Dg=new se("cdk-dir-doc",{providedIn:"root",factory:function(){return _e(ud)}}),Lg=function(){var t=function(){function t(e){if(_(this,t),this.value="ltr",this.change=new Rl,e){var n=(e.body?e.body.dir:null)||(e.documentElement?e.documentElement.dir:null);this.value="ltr"===n||"rtl"===n?n:"ltr"}}return b(t,[{key:"ngOnDestroy",value:function(){this.change.complete()}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(Dg,8))},t.\u0275prov=At({factory:function(){return new t(ve(Dg,8))},token:t,providedIn:"root"}),t}(),Tg=function(){var t=function(){function t(){_(this,t),this._dir="ltr",this._isInitialized=!1,this.change=new Rl}return b(t,[{key:"ngAfterContentInit",value:function(){this._isInitialized=!0}},{key:"ngOnDestroy",value:function(){this.change.complete()}},{key:"dir",get:function(){return this._dir},set:function(t){var e=this._dir,n=t?t.toLowerCase():t;this._rawDir=t,this._dir="ltr"===n||"rtl"===n?n:"ltr",e!==this._dir&&this._isInitialized&&this.change.emit(this._dir)}},{key:"value",get:function(){return this.dir}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","dir",""]],hostVars:1,hostBindings:function(t,e){2&t&&ds("dir",e._rawDir)},inputs:{dir:"dir"},outputs:{change:"dirChange"},exportAs:["dir"],features:[Pu([{provide:Lg,useExisting:t}])]}),t}(),Eg=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)}}),t}(),Og=function(){function t(){var e=this,n=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=arguments.length>1?arguments[1]:void 0,r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];_(this,t),this._multiple=n,this._emitChanges=r,this._selection=new Set,this._deselectedToEmit=[],this._selectedToEmit=[],this.changed=new z,i&&i.length&&(n?i.forEach((function(t){return e._markSelected(t)})):this._markSelected(i[0]),this._selectedToEmit.length=0)}return b(t,[{key:"select",value:function(){for(var t=this,e=arguments.length,n=new Array(e),i=0;i0&&void 0!==arguments[0]?arguments[0]:20;return this._platform.isBrowser?new B((function(n){t._globalSubscription||t._addGlobalListener();var i=e>0?t._scrolled.pipe(Xm(e)).subscribe(n):t._scrolled.subscribe(n);return t._scrolledCount++,function(){i.unsubscribe(),t._scrolledCount--,t._scrolledCount||t._removeGlobalListener()}})):rp()}},{key:"ngOnDestroy",value:function(){var t=this;this._removeGlobalListener(),this.scrollContainers.forEach((function(e,n){return t.deregister(n)})),this._scrolled.complete()}},{key:"ancestorScrolled",value:function(t,e){var n=this.getAncestorScrollContainers(t);return this.scrolled(e).pipe(_p((function(t){return!t||n.indexOf(t)>-1})))}},{key:"getAncestorScrollContainers",value:function(t){var e=this,n=[];return this.scrollContainers.forEach((function(i,r){e._scrollableContainsElement(r,t)&&n.push(r)})),n}},{key:"_getDocument",value:function(){return this._document||document}},{key:"_getWindow",value:function(){return this._getDocument().defaultView||window}},{key:"_scrollableContainsElement",value:function(t,e){var n=e.nativeElement,i=t.getElementRef().nativeElement;do{if(n==i)return!0}while(n=n.parentElement);return!1}},{key:"_addGlobalListener",value:function(){var t=this;this._globalSubscription=this._ngZone.runOutsideAngular((function(){return Rm(t._getWindow().document,"scroll").subscribe((function(){return t._scrolled.next()}))}))}},{key:"_removeGlobalListener",value:function(){this._globalSubscription&&(this._globalSubscription.unsubscribe(),this._globalSubscription=null)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(Dc),ve(bg),ve(ud,8))},t.\u0275prov=At({factory:function(){return new t(ve(Dc),ve(bg),ve(ud,8))},token:t,providedIn:"root"}),t}(),Ig=function(){var t=function(){function t(e,n,i,r){var a=this;_(this,t),this.elementRef=e,this.scrollDispatcher=n,this.ngZone=i,this.dir=r,this._destroyed=new z,this._elementScrolled=new B((function(t){return a.ngZone.runOutsideAngular((function(){return Rm(a.elementRef.nativeElement,"scroll").pipe($m(a._destroyed)).subscribe(t)}))}))}return b(t,[{key:"ngOnInit",value:function(){this.scrollDispatcher.register(this)}},{key:"ngOnDestroy",value:function(){this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}},{key:"elementScrolled",value:function(){return this._elementScrolled}},{key:"getElementRef",value:function(){return this.elementRef}},{key:"scrollTo",value:function(t){var e=this.elementRef.nativeElement,n=this.dir&&"rtl"==this.dir.value;null==t.left&&(t.left=n?t.end:t.start),null==t.right&&(t.right=n?t.start:t.end),null!=t.bottom&&(t.top=e.scrollHeight-e.clientHeight-t.bottom),n&&0!=Cg()?(null!=t.left&&(t.right=e.scrollWidth-e.clientWidth-t.left),2==Cg()?t.left=t.right:1==Cg()&&(t.left=t.right?-t.right:t.right)):null!=t.right&&(t.left=e.scrollWidth-e.clientWidth-t.right),this._applyScrollToOptions(t)}},{key:"_applyScrollToOptions",value:function(t){var e=this.elementRef.nativeElement;!function(){if(null==_g)if("object"==typeof document&&document||(_g=!1),"scrollBehavior"in document.documentElement.style)_g=!0;else{var t=Element.prototype.scrollTo;_g=!!t&&!/\{\s*\[native code\]\s*\}/.test(t.toString())}return _g}()?(null!=t.top&&(e.scrollTop=t.top),null!=t.left&&(e.scrollLeft=t.left)):e.scrollTo(t)}},{key:"measureScrollOffset",value:function(t){var e="left",n="right",i=this.elementRef.nativeElement;if("top"==t)return i.scrollTop;if("bottom"==t)return i.scrollHeight-i.clientHeight-i.scrollTop;var r=this.dir&&"rtl"==this.dir.value;return"start"==t?t=r?n:e:"end"==t&&(t=r?e:n),r&&2==Cg()?t==e?i.scrollWidth-i.clientWidth-i.scrollLeft:i.scrollLeft:r&&1==Cg()?t==e?i.scrollLeft+i.scrollWidth-i.clientWidth:-i.scrollLeft:t==e?i.scrollLeft:i.scrollWidth-i.clientWidth-i.scrollLeft}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Pg),gs(Dc),gs(Lg,8))},t.\u0275dir=ze({type:t,selectors:[["","cdk-scrollable",""],["","cdkScrollable",""]]}),t}(),Yg=function(){var t=function(){function t(e,n,i){var r=this;_(this,t),this._platform=e,this._change=new z,this._changeListener=function(t){r._change.next(t)},this._document=i,n.runOutsideAngular((function(){if(e.isBrowser){var t=r._getWindow();t.addEventListener("resize",r._changeListener),t.addEventListener("orientationchange",r._changeListener)}r.change().subscribe((function(){return r._updateViewportSize()}))}))}return b(t,[{key:"ngOnDestroy",value:function(){if(this._platform.isBrowser){var t=this._getWindow();t.removeEventListener("resize",this._changeListener),t.removeEventListener("orientationchange",this._changeListener)}this._change.complete()}},{key:"getViewportSize",value:function(){this._viewportSize||this._updateViewportSize();var t={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),t}},{key:"getViewportRect",value:function(){var t=this.getViewportScrollPosition(),e=this.getViewportSize(),n=e.width,i=e.height;return{top:t.top,left:t.left,bottom:t.top+i,right:t.left+n,height:i,width:n}}},{key:"getViewportScrollPosition",value:function(){if(!this._platform.isBrowser)return{top:0,left:0};var t=this._getDocument(),e=this._getWindow(),n=t.documentElement,i=n.getBoundingClientRect();return{top:-i.top||t.body.scrollTop||e.scrollY||n.scrollTop||0,left:-i.left||t.body.scrollLeft||e.scrollX||n.scrollLeft||0}}},{key:"change",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:20;return t>0?this._change.pipe(Xm(t)):this._change}},{key:"_getDocument",value:function(){return this._document||document}},{key:"_getWindow",value:function(){return this._getDocument().defaultView||window}},{key:"_updateViewportSize",value:function(){var t=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:t.innerWidth,height:t.innerHeight}:{width:0,height:0}}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(bg),ve(Dc),ve(ud,8))},t.\u0275prov=At({factory:function(){return new t(ve(bg),ve(Dc),ve(ud,8))},token:t,providedIn:"root"}),t}(),Rg=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)}}),t}(),Fg=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[Eg,wg,Rg],Eg,Rg]}),t}(),Hg=function(){function t(){_(this,t)}return b(t,[{key:"attach",value:function(t){return this._attachedHost=t,t.attach(this)}},{key:"detach",value:function(){var t=this._attachedHost;null!=t&&(this._attachedHost=null,t.detach())}},{key:"setAttachedHost",value:function(t){this._attachedHost=t}},{key:"isAttached",get:function(){return null!=this._attachedHost}}]),t}(),Bg=function(t){f(n,t);var e=v(n);function n(t,i,r,a){var o;return _(this,n),(o=e.call(this)).component=t,o.viewContainerRef=i,o.injector=r,o.componentFactoryResolver=a,o}return n}(Hg),jg=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this)).templateRef=t,a.viewContainerRef=i,a.context=r,a}return b(n,[{key:"attach",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.context;return this.context=e,r(i(n.prototype),"attach",this).call(this,t)}},{key:"detach",value:function(){return this.context=void 0,r(i(n.prototype),"detach",this).call(this)}},{key:"origin",get:function(){return this.templateRef.elementRef}}]),n}(Hg),Ng=function(t){f(n,t);var e=v(n);function n(t){var i;return _(this,n),(i=e.call(this)).element=t instanceof Hu?t.nativeElement:t,i}return n}(Hg),Wg=function(){function t(){_(this,t),this._isDisposed=!1,this.attachDomPortal=null}return b(t,[{key:"hasAttached",value:function(){return!!this._attachedPortal}},{key:"attach",value:function(t){return t instanceof Bg?(this._attachedPortal=t,this.attachComponentPortal(t)):t instanceof jg?(this._attachedPortal=t,this.attachTemplatePortal(t)):this.attachDomPortal&&t instanceof Ng?(this._attachedPortal=t,this.attachDomPortal(t)):void 0}},{key:"detach",value:function(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()}},{key:"dispose",value:function(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0}},{key:"setDisposeFn",value:function(t){this._disposeFn=t}},{key:"_invokeDisposeFn",value:function(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)}}]),t}(),Vg=function(t){f(n,t);var e=v(n);function n(t,o,s,u,l){var c,d;return _(this,n),(d=e.call(this)).outletElement=t,d._componentFactoryResolver=o,d._appRef=s,d._defaultInjector=u,d.attachDomPortal=function(t){var e=t.element,o=d._document.createComment("dom-portal");e.parentNode.insertBefore(o,e),d.outletElement.appendChild(e),r((c=a(d),i(n.prototype)),"setDisposeFn",c).call(c,(function(){o.parentNode&&o.parentNode.replaceChild(e,o)}))},d._document=l,d}return b(n,[{key:"attachComponentPortal",value:function(t){var e,n=this,i=(t.componentFactoryResolver||this._componentFactoryResolver).resolveComponentFactory(t.component);return t.viewContainerRef?(e=t.viewContainerRef.createComponent(i,t.viewContainerRef.length,t.injector||t.viewContainerRef.injector),this.setDisposeFn((function(){return e.destroy()}))):(e=i.create(t.injector||this._defaultInjector),this._appRef.attachView(e.hostView),this.setDisposeFn((function(){n._appRef.detachView(e.hostView),e.destroy()}))),this.outletElement.appendChild(this._getComponentRootNode(e)),e}},{key:"attachTemplatePortal",value:function(t){var e=this,n=t.viewContainerRef,i=n.createEmbeddedView(t.templateRef,t.context);return i.rootNodes.forEach((function(t){return e.outletElement.appendChild(t)})),i.detectChanges(),this.setDisposeFn((function(){var t=n.indexOf(i);-1!==t&&n.remove(t)})),i}},{key:"dispose",value:function(){r(i(n.prototype),"dispose",this).call(this),null!=this.outletElement.parentNode&&this.outletElement.parentNode.removeChild(this.outletElement)}},{key:"_getComponentRootNode",value:function(t){return t.hostView.rootNodes[0]}}]),n}(Wg),zg=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i){return _(this,n),e.call(this,t,i)}return n}(jg);return t.\u0275fac=function(e){return new(e||t)(gs(ul),gs(cl))},t.\u0275dir=ze({type:t,selectors:[["","cdkPortal",""]],exportAs:["cdkPortal"],features:[Jo]}),t}(),Ug=function(){var t=function(t){f(n,t);var e=v(n);function n(t,o,s){var u,l;return _(this,n),(l=e.call(this))._componentFactoryResolver=t,l._viewContainerRef=o,l._isInitialized=!1,l.attached=new Rl,l.attachDomPortal=function(t){var e=t.element,o=l._document.createComment("dom-portal");t.setAttachedHost(a(l)),e.parentNode.insertBefore(o,e),l._getRootNode().appendChild(e),r((u=a(l),i(n.prototype)),"setDisposeFn",u).call(u,(function(){o.parentNode&&o.parentNode.replaceChild(e,o)}))},l._document=s,l}return b(n,[{key:"ngOnInit",value:function(){this._isInitialized=!0}},{key:"ngOnDestroy",value:function(){r(i(n.prototype),"dispose",this).call(this),this._attachedPortal=null,this._attachedRef=null}},{key:"attachComponentPortal",value:function(t){t.setAttachedHost(this);var e=null!=t.viewContainerRef?t.viewContainerRef:this._viewContainerRef,a=(t.componentFactoryResolver||this._componentFactoryResolver).resolveComponentFactory(t.component),o=e.createComponent(a,e.length,t.injector||e.injector);return e!==this._viewContainerRef&&this._getRootNode().appendChild(o.hostView.rootNodes[0]),r(i(n.prototype),"setDisposeFn",this).call(this,(function(){return o.destroy()})),this._attachedPortal=t,this._attachedRef=o,this.attached.emit(o),o}},{key:"attachTemplatePortal",value:function(t){var e=this;t.setAttachedHost(this);var a=this._viewContainerRef.createEmbeddedView(t.templateRef,t.context);return r(i(n.prototype),"setDisposeFn",this).call(this,(function(){return e._viewContainerRef.clear()})),this._attachedPortal=t,this._attachedRef=a,this.attached.emit(a),a}},{key:"_getRootNode",value:function(){var t=this._viewContainerRef.element.nativeElement;return t.nodeType===t.ELEMENT_NODE?t:t.parentNode}},{key:"portal",get:function(){return this._attachedPortal},set:function(t){(!this.hasAttached()||t||this._isInitialized)&&(this.hasAttached()&&r(i(n.prototype),"detach",this).call(this),t&&r(i(n.prototype),"attach",this).call(this,t),this._attachedPortal=t)}},{key:"attachedRef",get:function(){return this._attachedRef}}]),n}(Wg);return t.\u0275fac=function(e){return new(e||t)(gs(Fu),gs(cl),gs(ud))},t.\u0275dir=ze({type:t,selectors:[["","cdkPortalOutlet",""]],inputs:{portal:["cdkPortalOutlet","portal"]},outputs:{attached:"attached"},exportAs:["cdkPortalOutlet"],features:[Jo]}),t}(),qg=function(){var t=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return n}(Ug);return t.\u0275fac=function(e){return Gg(e||t)},t.\u0275dir=ze({type:t,selectors:[["","cdkPortalHost",""],["","portalHost",""]],inputs:{portal:["cdkPortalHost","portal"]},exportAs:["cdkPortalHost"],features:[Pu([{provide:Ug,useExisting:t}]),Jo]}),t}(),Gg=Ki(qg),Kg=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)}}),t}(),Zg=function(){function t(e,n){_(this,t),this.predicate=e,this.inclusive=n}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new Jg(t,this.predicate,this.inclusive))}}]),t}(),Jg=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,t)).predicate=i,a.inclusive=r,a.index=0,a}return b(n,[{key:"_next",value:function(t){var e,n=this.destination;try{e=this.predicate(t,this.index++)}catch(i){return void n.error(i)}this.nextOrComplete(t,e)}},{key:"nextOrComplete",value:function(t,e){var n=this.destination;Boolean(e)?n.next(t):(this.inclusive&&n.next(t),n.complete())}}]),n}(P),Qg=13,Xg=27,$g=32,tv=38,ev=40;function nv(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),i=1;ie.height||t.scrollWidth>e.width}}]),t}(),rv=function(){function t(e,n,i,r){var a=this;_(this,t),this._scrollDispatcher=e,this._ngZone=n,this._viewportRuler=i,this._config=r,this._scrollSubscription=null,this._detach=function(){a.disable(),a._overlayRef.hasAttached()&&a._ngZone.run((function(){return a._overlayRef.detach()}))}}return b(t,[{key:"attach",value:function(t){this._overlayRef=t}},{key:"enable",value:function(){var t=this;if(!this._scrollSubscription){var e=this._scrollDispatcher.scrolled(0);this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=e.subscribe((function(){var e=t._viewportRuler.getViewportScrollPosition().top;Math.abs(e-t._initialScrollPosition)>t._config.threshold?t._detach():t._overlayRef.updatePosition()}))):this._scrollSubscription=e.subscribe(this._detach)}}},{key:"disable",value:function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}},{key:"detach",value:function(){this.disable(),this._overlayRef=null}}]),t}(),av=function(){function t(){_(this,t)}return b(t,[{key:"enable",value:function(){}},{key:"disable",value:function(){}},{key:"attach",value:function(){}}]),t}();function ov(t,e){return e.some((function(e){return t.bottome.bottom||t.righte.right}))}function sv(t,e){return e.some((function(e){return t.tope.bottom||t.lefte.right}))}var uv=function(){function t(e,n,i,r){_(this,t),this._scrollDispatcher=e,this._viewportRuler=n,this._ngZone=i,this._config=r,this._scrollSubscription=null}return b(t,[{key:"attach",value:function(t){this._overlayRef=t}},{key:"enable",value:function(){var t=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(this._config?this._config.scrollThrottle:0).subscribe((function(){if(t._overlayRef.updatePosition(),t._config&&t._config.autoClose){var e=t._overlayRef.overlayElement.getBoundingClientRect(),n=t._viewportRuler.getViewportSize(),i=n.width,r=n.height;ov(e,[{width:i,height:r,bottom:r,right:i,top:0,left:0}])&&(t.disable(),t._ngZone.run((function(){return t._overlayRef.detach()})))}})))}},{key:"disable",value:function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}},{key:"detach",value:function(){this.disable(),this._overlayRef=null}}]),t}(),lv=function(){var t=function t(e,n,i,r){var a=this;_(this,t),this._scrollDispatcher=e,this._viewportRuler=n,this._ngZone=i,this.noop=function(){return new av},this.close=function(t){return new rv(a._scrollDispatcher,a._ngZone,a._viewportRuler,t)},this.block=function(){return new iv(a._viewportRuler,a._document)},this.reposition=function(t){return new uv(a._scrollDispatcher,a._viewportRuler,a._ngZone,t)},this._document=r};return t.\u0275fac=function(e){return new(e||t)(ve(Pg),ve(Yg),ve(Dc),ve(ud))},t.\u0275prov=At({factory:function(){return new t(ve(Pg),ve(Yg),ve(Dc),ve(ud))},token:t,providedIn:"root"}),t}(),cv=function t(e){if(_(this,t),this.scrollStrategy=new av,this.panelClass="",this.hasBackdrop=!1,this.backdropClass="cdk-overlay-dark-backdrop",this.disposeOnNavigation=!1,e)for(var n=0,i=Object.keys(e);n-1&&this._attachedOverlays.splice(e,1),0===this._attachedOverlays.length&&this.detach()}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(ud))},t.\u0275prov=At({factory:function(){return new t(ve(ud))},token:t,providedIn:"root"}),t}(),pv=function(){var t=function(t){f(n,t);var e=v(n);function n(t){var i;return _(this,n),(i=e.call(this,t))._keydownListener=function(t){for(var e=i._attachedOverlays,n=e.length-1;n>-1;n--)if(e[n]._keydownEvents.observers.length>0){e[n]._keydownEvents.next(t);break}},i}return b(n,[{key:"add",value:function(t){r(i(n.prototype),"add",this).call(this,t),this._isAttached||(this._document.body.addEventListener("keydown",this._keydownListener),this._isAttached=!0)}},{key:"detach",value:function(){this._isAttached&&(this._document.body.removeEventListener("keydown",this._keydownListener),this._isAttached=!1)}}]),n}(fv);return t.\u0275fac=function(e){return new(e||t)(ve(ud))},t.\u0275prov=At({factory:function(){return new t(ve(ud))},token:t,providedIn:"root"}),t}(),mv=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,t))._platform=i,r._cursorStyleIsSet=!1,r._clickListener=function(t){for(var e=t.composedPath?t.composedPath()[0]:t.target,n=r._attachedOverlays.slice(),i=n.length-1;i>-1;i--){var a=n[i];if(!(a._outsidePointerEvents.observers.length<1)&&a.hasAttached()){if(a.overlayElement.contains(e))break;a._outsidePointerEvents.next(t)}}},r}return b(n,[{key:"add",value:function(t){r(i(n.prototype),"add",this).call(this,t),this._isAttached||(this._document.body.addEventListener("click",this._clickListener,!0),this._document.body.addEventListener("contextmenu",this._clickListener,!0),this._platform.IOS&&!this._cursorStyleIsSet&&(this._cursorOriginalValue=this._document.body.style.cursor,this._document.body.style.cursor="pointer",this._cursorStyleIsSet=!0),this._isAttached=!0)}},{key:"detach",value:function(){this._isAttached&&(this._document.body.removeEventListener("click",this._clickListener,!0),this._document.body.removeEventListener("contextmenu",this._clickListener,!0),this._platform.IOS&&this._cursorStyleIsSet&&(this._document.body.style.cursor=this._cursorOriginalValue,this._cursorStyleIsSet=!1),this._isAttached=!1)}}]),n}(fv);return t.\u0275fac=function(e){return new(e||t)(ve(ud),ve(bg))},t.\u0275prov=At({factory:function(){return new t(ve(ud),ve(bg))},token:t,providedIn:"root"}),t}(),gv=!("undefined"==typeof window||!window||!window.__karma__&&!window.jasmine),vv=function(){var t=function(){function t(e,n){_(this,t),this._platform=n,this._document=e}return b(t,[{key:"ngOnDestroy",value:function(){var t=this._containerElement;t&&t.parentNode&&t.parentNode.removeChild(t)}},{key:"getContainerElement",value:function(){return this._containerElement||this._createContainer(),this._containerElement}},{key:"_createContainer",value:function(){var t=this._platform?this._platform.isBrowser:"undefined"!=typeof window,e="cdk-overlay-container";if(t||gv)for(var n=this._document.querySelectorAll(".".concat(e,'[platform="server"], ')+".".concat(e,'[platform="test"]')),i=0;ip&&(p=v,f=g)}}catch(_){m.e(_)}finally{m.f()}return this._isPushed=!1,void this._applyPosition(f.position,f.origin)}if(this._canPush)return this._isPushed=!0,void this._applyPosition(t.position,t.originPoint);this._applyPosition(t.position,t.originPoint)}}},{key:"detach",value:function(){this._clearPanelClasses(),this._lastPosition=null,this._previousPushAmount=null,this._resizeSubscription.unsubscribe()}},{key:"dispose",value:function(){this._isDisposed||(this._boundingBox&&kv(this._boundingBox.style,{top:"",left:"",right:"",bottom:"",height:"",width:"",alignItems:"",justifyContent:""}),this._pane&&this._resetOverlayElementStyles(),this._overlayRef&&this._overlayRef.hostElement.classList.remove(yv),this.detach(),this._positionChanges.complete(),this._overlayRef=this._boundingBox=null,this._isDisposed=!0)}},{key:"reapplyLastPosition",value:function(){if(!this._isDisposed&&(!this._platform||this._platform.isBrowser)){this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._viewportRect=this._getNarrowedViewportRect();var t=this._lastPosition||this._preferredPositions[0],e=this._getOriginPoint(this._originRect,t);this._applyPosition(t,e)}}},{key:"withScrollableContainers",value:function(t){return this._scrollables=t,this}},{key:"withPositions",value:function(t){return this._preferredPositions=t,-1===t.indexOf(this._lastPosition)&&(this._lastPosition=null),this._validatePositions(),this}},{key:"withViewportMargin",value:function(t){return this._viewportMargin=t,this}},{key:"withFlexibleDimensions",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._hasFlexibleDimensions=t,this}},{key:"withGrowAfterOpen",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._growAfterOpen=t,this}},{key:"withPush",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._canPush=t,this}},{key:"withLockedPosition",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._positionLocked=t,this}},{key:"setOrigin",value:function(t){return this._origin=t,this}},{key:"withDefaultOffsetX",value:function(t){return this._offsetX=t,this}},{key:"withDefaultOffsetY",value:function(t){return this._offsetY=t,this}},{key:"withTransformOriginOn",value:function(t){return this._transformOriginSelector=t,this}},{key:"_getOriginPoint",value:function(t,e){var n;if("center"==e.originX)n=t.left+t.width/2;else{var i=this._isRtl()?t.right:t.left,r=this._isRtl()?t.left:t.right;n="start"==e.originX?i:r}return{x:n,y:"center"==e.originY?t.top+t.height/2:"top"==e.originY?t.top:t.bottom}}},{key:"_getOverlayPoint",value:function(t,e,n){var i;return i="center"==n.overlayX?-e.width/2:"start"===n.overlayX?this._isRtl()?-e.width:0:this._isRtl()?0:-e.width,{x:t.x+i,y:t.y+("center"==n.overlayY?-e.height/2:"top"==n.overlayY?0:-e.height)}}},{key:"_getOverlayFit",value:function(t,e,n,i){var r=t.x,a=t.y,o=this._getOffset(i,"x"),s=this._getOffset(i,"y");o&&(r+=o),s&&(a+=s);var u=0-a,l=a+e.height-n.height,c=this._subtractOverflows(e.width,0-r,r+e.width-n.width),d=this._subtractOverflows(e.height,u,l),h=c*d;return{visibleArea:h,isCompletelyWithinViewport:e.width*e.height===h,fitsInViewportVertically:d===e.height,fitsInViewportHorizontally:c==e.width}}},{key:"_canFitWithFlexibleDimensions",value:function(t,e,n){if(this._hasFlexibleDimensions){var i=n.bottom-e.y,r=n.right-e.x,a=Mv(this._overlayRef.getConfig().minHeight),o=Mv(this._overlayRef.getConfig().minWidth);return(t.fitsInViewportVertically||null!=a&&a<=i)&&(t.fitsInViewportHorizontally||null!=o&&o<=r)}return!1}},{key:"_pushOverlayOnScreen",value:function(t,e,n){if(this._previousPushAmount&&this._positionLocked)return{x:t.x+this._previousPushAmount.x,y:t.y+this._previousPushAmount.y};var i,r,a=this._viewportRect,o=Math.max(t.x+e.width-a.width,0),s=Math.max(t.y+e.height-a.height,0),u=Math.max(a.top-n.top-t.y,0),l=Math.max(a.left-n.left-t.x,0);return this._previousPushAmount={x:i=e.width<=a.width?l||-o:t.xd&&!this._isInitialRender&&!this._growAfterOpen&&(i=t.y-d/2)}if("end"===e.overlayX&&!l||"start"===e.overlayX&&l)s=u.width-t.x+this._viewportMargin,a=t.x-this._viewportMargin;else if("start"===e.overlayX&&!l||"end"===e.overlayX&&l)o=t.x,a=u.right-t.x;else{var h=Math.min(u.right-t.x+u.left,t.x),f=this._lastBoundingBoxSize.width;o=t.x-h,(a=2*h)>f&&!this._isInitialRender&&!this._growAfterOpen&&(o=t.x-f/2)}return{top:i,left:o,bottom:r,right:s,width:a,height:n}}},{key:"_setBoundingBoxStyles",value:function(t,e){var n=this._calculateBoundingBoxRect(t,e);this._isInitialRender||this._growAfterOpen||(n.height=Math.min(n.height,this._lastBoundingBoxSize.height),n.width=Math.min(n.width,this._lastBoundingBoxSize.width));var i={};if(this._hasExactPosition())i.top=i.left="0",i.bottom=i.right=i.maxHeight=i.maxWidth="",i.width=i.height="100%";else{var r=this._overlayRef.getConfig().maxHeight,a=this._overlayRef.getConfig().maxWidth;i.height=Im(n.height),i.top=Im(n.top),i.bottom=Im(n.bottom),i.width=Im(n.width),i.left=Im(n.left),i.right=Im(n.right),i.alignItems="center"===e.overlayX?"center":"end"===e.overlayX?"flex-end":"flex-start",i.justifyContent="center"===e.overlayY?"center":"bottom"===e.overlayY?"flex-end":"flex-start",r&&(i.maxHeight=Im(r)),a&&(i.maxWidth=Im(a))}this._lastBoundingBoxSize=n,kv(this._boundingBox.style,i)}},{key:"_resetBoundingBoxStyles",value:function(){kv(this._boundingBox.style,{top:"0",left:"0",right:"0",bottom:"0",height:"",width:"",alignItems:"",justifyContent:""})}},{key:"_resetOverlayElementStyles",value:function(){kv(this._pane.style,{top:"",left:"",bottom:"",right:"",position:"",transform:""})}},{key:"_setOverlayElementStyles",value:function(t,e){var n={},i=this._hasExactPosition(),r=this._hasFlexibleDimensions,a=this._overlayRef.getConfig();if(i){var o=this._viewportRuler.getViewportScrollPosition();kv(n,this._getExactOverlayY(e,t,o)),kv(n,this._getExactOverlayX(e,t,o))}else n.position="static";var s="",u=this._getOffset(e,"x"),l=this._getOffset(e,"y");u&&(s+="translateX(".concat(u,"px) ")),l&&(s+="translateY(".concat(l,"px)")),n.transform=s.trim(),a.maxHeight&&(i?n.maxHeight=Im(a.maxHeight):r&&(n.maxHeight="")),a.maxWidth&&(i?n.maxWidth=Im(a.maxWidth):r&&(n.maxWidth="")),kv(this._pane.style,n)}},{key:"_getExactOverlayY",value:function(t,e,n){var i={top:"",bottom:""},r=this._getOverlayPoint(e,this._overlayRect,t);this._isPushed&&(r=this._pushOverlayOnScreen(r,this._overlayRect,n));var a=this._overlayContainer.getContainerElement().getBoundingClientRect().top;return r.y-=a,"bottom"===t.overlayY?i.bottom="".concat(this._document.documentElement.clientHeight-(r.y+this._overlayRect.height),"px"):i.top=Im(r.y),i}},{key:"_getExactOverlayX",value:function(t,e,n){var i={left:"",right:""},r=this._getOverlayPoint(e,this._overlayRect,t);return this._isPushed&&(r=this._pushOverlayOnScreen(r,this._overlayRect,n)),"right"==(this._isRtl()?"end"===t.overlayX?"left":"right":"end"===t.overlayX?"right":"left")?i.right="".concat(this._document.documentElement.clientWidth-(r.x+this._overlayRect.width),"px"):i.left=Im(r.x),i}},{key:"_getScrollVisibility",value:function(){var t=this._getOriginRect(),e=this._pane.getBoundingClientRect(),n=this._scrollables.map((function(t){return t.getElementRef().nativeElement.getBoundingClientRect()}));return{isOriginClipped:sv(t,n),isOriginOutsideView:ov(t,n),isOverlayClipped:sv(e,n),isOverlayOutsideView:ov(e,n)}}},{key:"_subtractOverflows",value:function(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),i=1;i0&&void 0!==arguments[0]?arguments[0]:"";return this._bottomOffset="",this._topOffset=t,this._alignItems="flex-start",this}},{key:"left",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._rightOffset="",this._leftOffset=t,this._justifyContent="flex-start",this}},{key:"bottom",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._topOffset="",this._bottomOffset=t,this._alignItems="flex-end",this}},{key:"right",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._leftOffset="",this._rightOffset=t,this._justifyContent="flex-end",this}},{key:"width",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._overlayRef?this._overlayRef.updateSize({width:t}):this._width=t,this}},{key:"height",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._overlayRef?this._overlayRef.updateSize({height:t}):this._height=t,this}},{key:"centerHorizontally",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this.left(t),this._justifyContent="center",this}},{key:"centerVertically",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this.top(t),this._alignItems="center",this}},{key:"apply",value:function(){if(this._overlayRef&&this._overlayRef.hasAttached()){var t=this._overlayRef.overlayElement.style,e=this._overlayRef.hostElement.style,n=this._overlayRef.getConfig(),i=n.width,r=n.height,a=n.maxWidth,o=n.maxHeight,s=!("100%"!==i&&"100vw"!==i||a&&"100%"!==a&&"100vw"!==a),u=!("100%"!==r&&"100vh"!==r||o&&"100%"!==o&&"100vh"!==o);t.position=this._cssPosition,t.marginLeft=s?"0":this._leftOffset,t.marginTop=u?"0":this._topOffset,t.marginBottom=this._bottomOffset,t.marginRight=this._rightOffset,s?e.justifyContent="flex-start":"center"===this._justifyContent?e.justifyContent="center":"rtl"===this._overlayRef.getConfig().direction?"flex-start"===this._justifyContent?e.justifyContent="flex-end":"flex-end"===this._justifyContent&&(e.justifyContent="flex-start"):e.justifyContent=this._justifyContent,e.alignItems=u?"flex-start":this._alignItems}}},{key:"dispose",value:function(){if(!this._isDisposed&&this._overlayRef){var t=this._overlayRef.overlayElement.style,e=this._overlayRef.hostElement,n=e.style;e.classList.remove(Cv),n.justifyContent=n.alignItems=t.marginTop=t.marginBottom=t.marginLeft=t.marginRight=t.position="",this._overlayRef=null,this._isDisposed=!0}}}]),t}(),Dv=function(){var t=function(){function t(e,n,i,r){_(this,t),this._viewportRuler=e,this._document=n,this._platform=i,this._overlayContainer=r}return b(t,[{key:"global",value:function(){return new xv}},{key:"connectedTo",value:function(t,e,n){return new Sv(e,n,t,this._viewportRuler,this._document,this._platform,this._overlayContainer)}},{key:"flexibleConnectedTo",value:function(t){return new wv(t,this._viewportRuler,this._document,this._platform,this._overlayContainer)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(Yg),ve(ud),ve(bg),ve(vv))},t.\u0275prov=At({factory:function(){return new t(ve(Yg),ve(ud),ve(bg),ve(vv))},token:t,providedIn:"root"}),t}(),Lv=0,Tv=function(){var t=function(){function t(e,n,i,r,a,o,s,u,l,c,d){_(this,t),this.scrollStrategies=e,this._overlayContainer=n,this._componentFactoryResolver=i,this._positionBuilder=r,this._keyboardDispatcher=a,this._injector=o,this._ngZone=s,this._document=u,this._directionality=l,this._location=c,this._outsideClickDispatcher=d}return b(t,[{key:"create",value:function(t){var e=this._createHostElement(),n=this._createPaneElement(e),i=this._createPortalOutlet(n),r=new cv(t);return r.direction=r.direction||this._directionality.value,new _v(i,e,n,r,this._ngZone,this._keyboardDispatcher,this._document,this._location,this._outsideClickDispatcher)}},{key:"position",value:function(){return this._positionBuilder}},{key:"_createPaneElement",value:function(t){var e=this._document.createElement("div");return e.id="cdk-overlay-".concat(Lv++),e.classList.add("cdk-overlay-pane"),t.appendChild(e),e}},{key:"_createHostElement",value:function(){var t=this._document.createElement("div");return this._overlayContainer.getContainerElement().appendChild(t),t}},{key:"_createPortalOutlet",value:function(t){return this._appRef||(this._appRef=this._injector.get(Kc)),new Vg(t,this._componentFactoryResolver,this._appRef,this._injector,this._document)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(lv),ve(vv),ve(Fu),ve(Dv),ve(pv),ve(qo),ve(Dc),ve(ud),ve(Lg),ve(Md),ve(mv))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),Ev=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],Ov=new se("cdk-connected-overlay-scroll-strategy"),Av=function(){var t=function t(e){_(this,t),this.elementRef=e};return t.\u0275fac=function(e){return new(e||t)(gs(Hu))},t.\u0275dir=ze({type:t,selectors:[["","cdk-overlay-origin",""],["","overlay-origin",""],["","cdkOverlayOrigin",""]],exportAs:["cdkOverlayOrigin"]}),t}(),Pv=function(){var t=function(){function t(e,n,i,r,a){_(this,t),this._overlay=e,this._dir=a,this._hasBackdrop=!1,this._lockPosition=!1,this._growAfterOpen=!1,this._flexibleDimensions=!1,this._push=!1,this._backdropSubscription=x.EMPTY,this._attachSubscription=x.EMPTY,this._detachSubscription=x.EMPTY,this._positionSubscription=x.EMPTY,this.viewportMargin=0,this.open=!1,this.backdropClick=new Rl,this.positionChange=new Rl,this.attach=new Rl,this.detach=new Rl,this.overlayKeydown=new Rl,this.overlayOutsideClick=new Rl,this._templatePortal=new jg(n,i),this._scrollStrategyFactory=r,this.scrollStrategy=this._scrollStrategyFactory()}return b(t,[{key:"ngOnDestroy",value:function(){this._attachSubscription.unsubscribe(),this._detachSubscription.unsubscribe(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._overlayRef&&this._overlayRef.dispose()}},{key:"ngOnChanges",value:function(t){this._position&&(this._updatePositionStrategy(this._position),this._overlayRef.updateSize({width:this.width,minWidth:this.minWidth,height:this.height,minHeight:this.minHeight}),t.origin&&this.open&&this._position.apply()),t.open&&(this.open?this._attachOverlay():this._detachOverlay())}},{key:"_createOverlay",value:function(){var t=this;this.positions&&this.positions.length||(this.positions=Ev);var e=this._overlayRef=this._overlay.create(this._buildConfig());this._attachSubscription=e.attachments().subscribe((function(){return t.attach.emit()})),this._detachSubscription=e.detachments().subscribe((function(){return t.detach.emit()})),e.keydownEvents().subscribe((function(e){t.overlayKeydown.next(e),e.keyCode!==Xg||nv(e)||(e.preventDefault(),t._detachOverlay())})),this._overlayRef.outsidePointerEvents().subscribe((function(e){t.overlayOutsideClick.next(e)}))}},{key:"_buildConfig",value:function(){var t=this._position=this.positionStrategy||this._createPositionStrategy(),e=new cv({direction:this._dir,positionStrategy:t,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop});return(this.width||0===this.width)&&(e.width=this.width),(this.height||0===this.height)&&(e.height=this.height),(this.minWidth||0===this.minWidth)&&(e.minWidth=this.minWidth),(this.minHeight||0===this.minHeight)&&(e.minHeight=this.minHeight),this.backdropClass&&(e.backdropClass=this.backdropClass),this.panelClass&&(e.panelClass=this.panelClass),e}},{key:"_updatePositionStrategy",value:function(t){var e=this,n=this.positions.map((function(t){return{originX:t.originX,originY:t.originY,overlayX:t.overlayX,overlayY:t.overlayY,offsetX:t.offsetX||e.offsetX,offsetY:t.offsetY||e.offsetY,panelClass:t.panelClass||void 0}}));return t.setOrigin(this.origin.elementRef).withPositions(n).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector)}},{key:"_createPositionStrategy",value:function(){var t=this._overlay.position().flexibleConnectedTo(this.origin.elementRef);return this._updatePositionStrategy(t),t}},{key:"_attachOverlay",value:function(){var t=this;this._overlayRef?this._overlayRef.getConfig().hasBackdrop=this.hasBackdrop:this._createOverlay(),this._overlayRef.hasAttached()||this._overlayRef.attach(this._templatePortal),this.hasBackdrop?this._backdropSubscription=this._overlayRef.backdropClick().subscribe((function(e){t.backdropClick.emit(e)})):this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.positionChange.observers.length>0&&(this._positionSubscription=this._position.positionChanges.pipe(function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return function(n){return n.lift(new Zg(t,e))}}((function(){return t.positionChange.observers.length>0}))).subscribe((function(e){t.positionChange.emit(e),0===t.positionChange.observers.length&&t._positionSubscription.unsubscribe()})))}},{key:"_detachOverlay",value:function(){this._overlayRef&&this._overlayRef.detach(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe()}},{key:"offsetX",get:function(){return this._offsetX},set:function(t){this._offsetX=t,this._position&&this._updatePositionStrategy(this._position)}},{key:"offsetY",get:function(){return this._offsetY},set:function(t){this._offsetY=t,this._position&&this._updatePositionStrategy(this._position)}},{key:"hasBackdrop",get:function(){return this._hasBackdrop},set:function(t){this._hasBackdrop=Em(t)}},{key:"lockPosition",get:function(){return this._lockPosition},set:function(t){this._lockPosition=Em(t)}},{key:"flexibleDimensions",get:function(){return this._flexibleDimensions},set:function(t){this._flexibleDimensions=Em(t)}},{key:"growAfterOpen",get:function(){return this._growAfterOpen},set:function(t){this._growAfterOpen=Em(t)}},{key:"push",get:function(){return this._push},set:function(t){this._push=Em(t)}},{key:"overlayRef",get:function(){return this._overlayRef}},{key:"dir",get:function(){return this._dir?this._dir.value:"ltr"}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Tv),gs(ul),gs(cl),gs(Ov),gs(Lg,8))},t.\u0275dir=ze({type:t,selectors:[["","cdk-connected-overlay",""],["","connected-overlay",""],["","cdkConnectedOverlay",""]],inputs:{viewportMargin:["cdkConnectedOverlayViewportMargin","viewportMargin"],open:["cdkConnectedOverlayOpen","open"],scrollStrategy:["cdkConnectedOverlayScrollStrategy","scrollStrategy"],offsetX:["cdkConnectedOverlayOffsetX","offsetX"],offsetY:["cdkConnectedOverlayOffsetY","offsetY"],hasBackdrop:["cdkConnectedOverlayHasBackdrop","hasBackdrop"],lockPosition:["cdkConnectedOverlayLockPosition","lockPosition"],flexibleDimensions:["cdkConnectedOverlayFlexibleDimensions","flexibleDimensions"],growAfterOpen:["cdkConnectedOverlayGrowAfterOpen","growAfterOpen"],push:["cdkConnectedOverlayPush","push"],positions:["cdkConnectedOverlayPositions","positions"],origin:["cdkConnectedOverlayOrigin","origin"],positionStrategy:["cdkConnectedOverlayPositionStrategy","positionStrategy"],width:["cdkConnectedOverlayWidth","width"],height:["cdkConnectedOverlayHeight","height"],minWidth:["cdkConnectedOverlayMinWidth","minWidth"],minHeight:["cdkConnectedOverlayMinHeight","minHeight"],backdropClass:["cdkConnectedOverlayBackdropClass","backdropClass"],panelClass:["cdkConnectedOverlayPanelClass","panelClass"],transformOriginSelector:["cdkConnectedOverlayTransformOriginOn","transformOriginSelector"]},outputs:{backdropClick:"backdropClick",positionChange:"positionChange",attach:"attach",detach:"detach",overlayKeydown:"overlayKeydown",overlayOutsideClick:"overlayOutsideClick"},exportAs:["cdkConnectedOverlay"],features:[fn]}),t}(),Iv={provide:Ov,deps:[Tv],useFactory:function(t){return function(){return t.scrollStrategies.reposition()}}},Yv=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[Tv,Iv],imports:[[Eg,Kg,Fg],Fg]}),t}();function Rv(t,e,n){return function(i){return i.lift(new Fv(t,e,n))}}var Fv=function(){function t(e,n,i){_(this,t),this.nextOrObserver=e,this.error=n,this.complete=i}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new Hv(t,this.nextOrObserver,this.error,this.complete))}}]),t}(),Hv=function(t){f(n,t);var e=v(n);function n(t,i,r,o){var s;return _(this,n),(s=e.call(this,t))._tapNext=R,s._tapError=R,s._tapComplete=R,s._tapError=r||R,s._tapComplete=o||R,S(i)?(s._context=a(s),s._tapNext=i):i&&(s._context=i,s._tapNext=i.next||R,s._tapError=i.error||R,s._tapComplete=i.complete||R),s}return b(n,[{key:"_next",value:function(t){try{this._tapNext.call(this._context,t)}catch(e){return void this.destination.error(e)}this.destination.next(t)}},{key:"_error",value:function(t){try{this._tapError.call(this._context,t)}catch(t){return void this.destination.error(t)}this.destination.error(t)}},{key:"_complete",value:function(){try{this._tapComplete.call(this._context)}catch(t){return void this.destination.error(t)}return this.destination.complete()}}]),n}(P);function Bv(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:tp;return function(n){return n.lift(new jv(t,e))}}var jv=function(){function t(e,n){_(this,t),this.dueTime=e,this.scheduler=n}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new Nv(t,this.dueTime,this.scheduler))}}]),t}(),Nv=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,t)).dueTime=i,a.scheduler=r,a.debouncedSubscription=null,a.lastValue=null,a.hasValue=!1,a}return b(n,[{key:"_next",value:function(t){this.clearDebounce(),this.lastValue=t,this.hasValue=!0,this.add(this.debouncedSubscription=this.scheduler.schedule(Wv,this.dueTime,this))}},{key:"_complete",value:function(){this.debouncedNext(),this.destination.complete()}},{key:"debouncedNext",value:function(){if(this.clearDebounce(),this.hasValue){var t=this.lastValue;this.lastValue=null,this.hasValue=!1,this.destination.next(t)}}},{key:"clearDebounce",value:function(){var t=this.debouncedSubscription;null!==t&&(this.remove(t),t.unsubscribe(),this.debouncedSubscription=null)}}]),n}(P);function Wv(t){t.debouncedNext()}var Vv=function(){var t=function(){function t(){_(this,t)}return b(t,[{key:"create",value:function(t){return"undefined"==typeof MutationObserver?null:new MutationObserver(t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275prov=At({factory:function(){return new t},token:t,providedIn:"root"}),t}(),zv=function(){var t=function(){function t(e){_(this,t),this._mutationObserverFactory=e,this._observedElements=new Map}return b(t,[{key:"ngOnDestroy",value:function(){var t=this;this._observedElements.forEach((function(e,n){return t._cleanupObserver(n)}))}},{key:"observe",value:function(t){var e=this,n=Ym(t);return new B((function(t){var i=e._observeElement(n).subscribe(t);return function(){i.unsubscribe(),e._unobserveElement(n)}}))}},{key:"_observeElement",value:function(t){if(this._observedElements.has(t))this._observedElements.get(t).count++;else{var e=new z,n=this._mutationObserverFactory.create((function(t){return e.next(t)}));n&&n.observe(t,{characterData:!0,childList:!0,subtree:!0}),this._observedElements.set(t,{observer:n,stream:e,count:1})}return this._observedElements.get(t).stream}},{key:"_unobserveElement",value:function(t){this._observedElements.has(t)&&(this._observedElements.get(t).count--,this._observedElements.get(t).count||this._cleanupObserver(t))}},{key:"_cleanupObserver",value:function(t){if(this._observedElements.has(t)){var e=this._observedElements.get(t),n=e.observer,i=e.stream;n&&n.disconnect(),i.complete(),this._observedElements.delete(t)}}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(Vv))},t.\u0275prov=At({factory:function(){return new t(ve(Vv))},token:t,providedIn:"root"}),t}(),Uv=function(){var t=function(){function t(e,n,i){_(this,t),this._contentObserver=e,this._elementRef=n,this._ngZone=i,this.event=new Rl,this._disabled=!1,this._currentSubscription=null}return b(t,[{key:"ngAfterContentInit",value:function(){this._currentSubscription||this.disabled||this._subscribe()}},{key:"ngOnDestroy",value:function(){this._unsubscribe()}},{key:"_subscribe",value:function(){var t=this;this._unsubscribe();var e=this._contentObserver.observe(this._elementRef);this._ngZone.runOutsideAngular((function(){t._currentSubscription=(t.debounce?e.pipe(Bv(t.debounce)):e).subscribe(t.event)}))}},{key:"_unsubscribe",value:function(){this._currentSubscription&&this._currentSubscription.unsubscribe()}},{key:"disabled",get:function(){return this._disabled},set:function(t){this._disabled=Em(t),this._disabled?this._unsubscribe():this._subscribe()}},{key:"debounce",get:function(){return this._debounce},set:function(t){this._debounce=Om(t),this._subscribe()}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(zv),gs(Hu),gs(Dc))},t.\u0275dir=ze({type:t,selectors:[["","cdkObserveContent",""]],inputs:{disabled:["cdkObserveContentDisabled","disabled"],debounce:"debounce"},outputs:{event:"cdkObserveContent"},exportAs:["cdkObserveContent"]}),t}(),qv=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[Vv]}),t}();function Gv(t,e){return(t.getAttribute(e)||"").match(/\S+/g)||[]}var Kv="cdk-describedby-message-container",Zv="cdk-describedby-message",Jv="cdk-describedby-host",Qv=0,Xv=new Map,$v=null,t_=function(){var t=function(){function t(e,n){_(this,t),this._platform=n,this._document=e}return b(t,[{key:"describe",value:function(t,e){this._canBeDescribed(t,e)&&("string"!=typeof e?(this._setMessageId(e),Xv.set(e,{messageElement:e,referenceCount:0})):Xv.has(e)||this._createMessageElement(e),this._isElementDescribedByMessage(t,e)||this._addMessageReference(t,e))}},{key:"removeDescription",value:function(t,e){if(e&&this._isElementNode(t)){if(this._isElementDescribedByMessage(t,e)&&this._removeMessageReference(t,e),"string"==typeof e){var n=Xv.get(e);n&&0===n.referenceCount&&this._deleteMessageElement(e)}$v&&0===$v.childNodes.length&&this._deleteMessagesContainer()}}},{key:"ngOnDestroy",value:function(){for(var t=this._document.querySelectorAll("[".concat(Jv,"]")),e=0;e-1&&e!==n._activeItemIndex&&(n._activeItemIndex=e)}}))}return b(t,[{key:"skipPredicate",value:function(t){return this._skipPredicateFn=t,this}},{key:"withWrap",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._wrap=t,this}},{key:"withVerticalOrientation",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._vertical=t,this}},{key:"withHorizontalOrientation",value:function(t){return this._horizontal=t,this}},{key:"withAllowedModifierKeys",value:function(t){return this._allowedModifierKeys=t,this}},{key:"withTypeAhead",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:200;return this._typeaheadSubscription.unsubscribe(),this._typeaheadSubscription=this._letterKeyStream.pipe(Rv((function(e){return t._pressedLetters.push(e)})),Bv(e),_p((function(){return t._pressedLetters.length>0})),nt((function(){return t._pressedLetters.join("")}))).subscribe((function(e){for(var n=t._getItemsArray(),i=1;i0&&void 0!==arguments[0])||arguments[0];return this._homeAndEnd=t,this}},{key:"setActiveItem",value:function(t){var e=this._activeItem;this.updateActiveItem(t),this._activeItem!==e&&this.change.next(this._activeItemIndex)}},{key:"onKeydown",value:function(t){var e=this,n=t.keyCode,i=["altKey","ctrlKey","metaKey","shiftKey"].every((function(n){return!t[n]||e._allowedModifierKeys.indexOf(n)>-1}));switch(n){case 9:return void this.tabOut.next();case ev:if(this._vertical&&i){this.setNextItemActive();break}return;case tv:if(this._vertical&&i){this.setPreviousItemActive();break}return;case 39:if(this._horizontal&&i){"rtl"===this._horizontal?this.setPreviousItemActive():this.setNextItemActive();break}return;case 37:if(this._horizontal&&i){"rtl"===this._horizontal?this.setNextItemActive():this.setPreviousItemActive();break}return;case 36:if(this._homeAndEnd&&i){this.setFirstItemActive();break}return;case 35:if(this._homeAndEnd&&i){this.setLastItemActive();break}return;default:return void((i||nv(t,"shiftKey"))&&(t.key&&1===t.key.length?this._letterKeyStream.next(t.key.toLocaleUpperCase()):(n>=65&&n<=90||n>=48&&n<=57)&&this._letterKeyStream.next(String.fromCharCode(n))))}this._pressedLetters=[],t.preventDefault()}},{key:"isTyping",value:function(){return this._pressedLetters.length>0}},{key:"setFirstItemActive",value:function(){this._setActiveItemByIndex(0,1)}},{key:"setLastItemActive",value:function(){this._setActiveItemByIndex(this._items.length-1,-1)}},{key:"setNextItemActive",value:function(){this._activeItemIndex<0?this.setFirstItemActive():this._setActiveItemByDelta(1)}},{key:"setPreviousItemActive",value:function(){this._activeItemIndex<0&&this._wrap?this.setLastItemActive():this._setActiveItemByDelta(-1)}},{key:"updateActiveItem",value:function(t){var e=this._getItemsArray(),n="number"==typeof t?t:e.indexOf(t),i=e[n];this._activeItem=null==i?null:i,this._activeItemIndex=n}},{key:"_setActiveItemByDelta",value:function(t){this._wrap?this._setActiveInWrapMode(t):this._setActiveInDefaultMode(t)}},{key:"_setActiveInWrapMode",value:function(t){for(var e=this._getItemsArray(),n=1;n<=e.length;n++){var i=(this._activeItemIndex+t*n+e.length)%e.length;if(!this._skipPredicateFn(e[i]))return void this.setActiveItem(i)}}},{key:"_setActiveInDefaultMode",value:function(t){this._setActiveItemByIndex(this._activeItemIndex+t,t)}},{key:"_setActiveItemByIndex",value:function(t,e){var n=this._getItemsArray();if(n[t]){for(;this._skipPredicateFn(n[t]);)if(!n[t+=e])return;this.setActiveItem(t)}}},{key:"_getItemsArray",value:function(){return this._items instanceof Hl?this._items.toArray():this._items}},{key:"activeItemIndex",get:function(){return this._activeItemIndex}},{key:"activeItem",get:function(){return this._activeItem}}]),t}(),n_=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return b(n,[{key:"setActiveItem",value:function(t){this.activeItem&&this.activeItem.setInactiveStyles(),r(i(n.prototype),"setActiveItem",this).call(this,t),this.activeItem&&this.activeItem.setActiveStyles()}}]),n}(e_),i_=function(t){f(n,t);var e=v(n);function n(){var t;return _(this,n),(t=e.apply(this,arguments))._origin="program",t}return b(n,[{key:"setFocusOrigin",value:function(t){return this._origin=t,this}},{key:"setActiveItem",value:function(t){r(i(n.prototype),"setActiveItem",this).call(this,t),this.activeItem&&this.activeItem.focus(this._origin)}}]),n}(e_),r_=function(){var t=function(){function t(e){_(this,t),this._platform=e}return b(t,[{key:"isDisabled",value:function(t){return t.hasAttribute("disabled")}},{key:"isVisible",value:function(t){return function(t){return!!(t.offsetWidth||t.offsetHeight||"function"==typeof t.getClientRects&&t.getClientRects().length)}(t)&&"visible"===getComputedStyle(t).visibility}},{key:"isTabbable",value:function(t){if(!this._platform.isBrowser)return!1;var e,n=function(t){try{return t.frameElement}catch(lU){return null}}((e=t).ownerDocument&&e.ownerDocument.defaultView||window);if(n){if(-1===o_(n))return!1;if(!this.isVisible(n))return!1}var i=t.nodeName.toLowerCase(),r=o_(t);return t.hasAttribute("contenteditable")?-1!==r:"iframe"!==i&&"object"!==i&&!(this._platform.WEBKIT&&this._platform.IOS&&!function(t){var e=t.nodeName.toLowerCase(),n="input"===e&&t.type;return"text"===n||"password"===n||"select"===e||"textarea"===e}(t))&&("audio"===i?!!t.hasAttribute("controls")&&-1!==r:"video"===i?-1!==r&&(null!==r||this._platform.FIREFOX||t.hasAttribute("controls")):t.tabIndex>=0)}},{key:"isFocusable",value:function(t,e){return function(t){return!function(t){return function(t){return"input"==t.nodeName.toLowerCase()}(t)&&"hidden"==t.type}(t)&&(function(t){var e=t.nodeName.toLowerCase();return"input"===e||"select"===e||"button"===e||"textarea"===e}(t)||function(t){return function(t){return"a"==t.nodeName.toLowerCase()}(t)&&t.hasAttribute("href")}(t)||t.hasAttribute("contenteditable")||a_(t))}(t)&&!this.isDisabled(t)&&((null==e?void 0:e.ignoreVisibility)||this.isVisible(t))}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(bg))},t.\u0275prov=At({factory:function(){return new t(ve(bg))},token:t,providedIn:"root"}),t}();function a_(t){if(!t.hasAttribute("tabindex")||void 0===t.tabIndex)return!1;var e=t.getAttribute("tabindex");return"-32768"!=e&&!(!e||isNaN(parseInt(e,10)))}function o_(t){if(!a_(t))return null;var e=parseInt(t.getAttribute("tabindex")||"",10);return isNaN(e)?-1:e}var s_=function(){function t(e,n,i,r){var a=this,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];_(this,t),this._element=e,this._checker=n,this._ngZone=i,this._document=r,this._hasAttached=!1,this.startAnchorListener=function(){return a.focusLastTabbableElement()},this.endAnchorListener=function(){return a.focusFirstTabbableElement()},this._enabled=!0,o||this.attachAnchors()}return b(t,[{key:"destroy",value:function(){var t=this._startAnchor,e=this._endAnchor;t&&(t.removeEventListener("focus",this.startAnchorListener),t.parentNode&&t.parentNode.removeChild(t)),e&&(e.removeEventListener("focus",this.endAnchorListener),e.parentNode&&e.parentNode.removeChild(e)),this._startAnchor=this._endAnchor=null,this._hasAttached=!1}},{key:"attachAnchors",value:function(){var t=this;return!!this._hasAttached||(this._ngZone.runOutsideAngular((function(){t._startAnchor||(t._startAnchor=t._createAnchor(),t._startAnchor.addEventListener("focus",t.startAnchorListener)),t._endAnchor||(t._endAnchor=t._createAnchor(),t._endAnchor.addEventListener("focus",t.endAnchorListener))})),this._element.parentNode&&(this._element.parentNode.insertBefore(this._startAnchor,this._element),this._element.parentNode.insertBefore(this._endAnchor,this._element.nextSibling),this._hasAttached=!0),this._hasAttached)}},{key:"focusInitialElementWhenReady",value:function(){var t=this;return new Promise((function(e){t._executeOnStable((function(){return e(t.focusInitialElement())}))}))}},{key:"focusFirstTabbableElementWhenReady",value:function(){var t=this;return new Promise((function(e){t._executeOnStable((function(){return e(t.focusFirstTabbableElement())}))}))}},{key:"focusLastTabbableElementWhenReady",value:function(){var t=this;return new Promise((function(e){t._executeOnStable((function(){return e(t.focusLastTabbableElement())}))}))}},{key:"_getRegionBoundary",value:function(t){for(var e=this._element.querySelectorAll("[cdk-focus-region-".concat(t,"], ")+"[cdkFocusRegion".concat(t,"], ")+"[cdk-focus-".concat(t,"]")),n=0;n=0;n--){var i=e[n].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(e[n]):null;if(i)return i}return null}},{key:"_createAnchor",value:function(){var t=this._document.createElement("div");return this._toggleAnchorTabIndex(this._enabled,t),t.classList.add("cdk-visually-hidden"),t.classList.add("cdk-focus-trap-anchor"),t.setAttribute("aria-hidden","true"),t}},{key:"_toggleAnchorTabIndex",value:function(t,e){t?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")}},{key:"toggleAnchors",value:function(t){this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(t,this._startAnchor),this._toggleAnchorTabIndex(t,this._endAnchor))}},{key:"_executeOnStable",value:function(t){this._ngZone.isStable?t():this._ngZone.onStable.pipe(kp(1)).subscribe(t)}},{key:"enabled",get:function(){return this._enabled},set:function(t){this._enabled=t,this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(t,this._startAnchor),this._toggleAnchorTabIndex(t,this._endAnchor))}}]),t}(),u_=function(){var t=function(){function t(e,n,i){_(this,t),this._checker=e,this._ngZone=n,this._document=i}return b(t,[{key:"create",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return new s_(t,this._checker,this._ngZone,this._document,e)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(r_),ve(Dc),ve(ud))},t.\u0275prov=At({factory:function(){return new t(ve(r_),ve(Dc),ve(ud))},token:t,providedIn:"root"}),t}();"undefined"!=typeof Element&∈var l_=new se("liveAnnouncerElement",{providedIn:"root",factory:function(){return null}}),c_=new se("LIVE_ANNOUNCER_DEFAULT_OPTIONS"),d_=function(){var t=function(){function t(e,n,i,r){_(this,t),this._ngZone=n,this._defaultOptions=r,this._document=i,this._liveElement=e||this._createLiveElement()}return b(t,[{key:"announce",value:function(t){for(var e,n,i=this,r=this._defaultOptions,a=arguments.length,o=new Array(a>1?a-1:0),s=1;s1&&void 0!==arguments[1]&&arguments[1],n=Ym(t);if(!this._platform.isBrowser||1!==n.nodeType)return rp(null);var i=xg(n)||this._getDocument(),r=this._elementInfo.get(n);if(r)return e&&(r.checkChildren=!0),r.subject;var a={checkChildren:e,subject:new z,rootNode:i};return this._elementInfo.set(n,a),this._registerGlobalListeners(a),a.subject}},{key:"stopMonitoring",value:function(t){var e=Ym(t),n=this._elementInfo.get(e);n&&(n.subject.complete(),this._setClasses(e),this._elementInfo.delete(e),this._removeGlobalListeners(n))}},{key:"focusVia",value:function(t,e,n){var i=Ym(t);this._setOriginForCurrentEventQueue(e),"function"==typeof i.focus&&i.focus(n)}},{key:"ngOnDestroy",value:function(){var t=this;this._elementInfo.forEach((function(e,n){return t.stopMonitoring(n)}))}},{key:"_getDocument",value:function(){return this._document||document}},{key:"_getWindow",value:function(){return this._getDocument().defaultView||window}},{key:"_toggleClass",value:function(t,e,n){n?t.classList.add(e):t.classList.remove(e)}},{key:"_getFocusOrigin",value:function(t){return this._origin?this._origin:this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:this._wasCausedByTouch(t)?"touch":"program"}},{key:"_setClasses",value:function(t,e){this._toggleClass(t,"cdk-focused",!!e),this._toggleClass(t,"cdk-touch-focused","touch"===e),this._toggleClass(t,"cdk-keyboard-focused","keyboard"===e),this._toggleClass(t,"cdk-mouse-focused","mouse"===e),this._toggleClass(t,"cdk-program-focused","program"===e)}},{key:"_setOriginForCurrentEventQueue",value:function(t){var e=this;this._ngZone.runOutsideAngular((function(){e._origin=t,0===e._detectionMode&&(e._originTimeoutId=setTimeout((function(){return e._origin=null}),1))}))}},{key:"_wasCausedByTouch",value:function(t){var e=g_(t);return this._lastTouchTarget instanceof Node&&e instanceof Node&&(e===this._lastTouchTarget||e.contains(this._lastTouchTarget))}},{key:"_onFocus",value:function(t,e){var n=this._elementInfo.get(e);if(n&&(n.checkChildren||e===g_(t))){var i=this._getFocusOrigin(t);this._setClasses(e,i),this._emitOrigin(n.subject,i),this._lastFocusOrigin=i}}},{key:"_onBlur",value:function(t,e){var n=this._elementInfo.get(e);!n||n.checkChildren&&t.relatedTarget instanceof Node&&e.contains(t.relatedTarget)||(this._setClasses(e),this._emitOrigin(n.subject,null))}},{key:"_emitOrigin",value:function(t,e){this._ngZone.run((function(){return t.next(e)}))}},{key:"_registerGlobalListeners",value:function(t){var e=this;if(this._platform.isBrowser){var n=t.rootNode,i=this._rootNodeFocusListenerCount.get(n)||0;i||this._ngZone.runOutsideAngular((function(){n.addEventListener("focus",e._rootNodeFocusAndBlurListener,p_),n.addEventListener("blur",e._rootNodeFocusAndBlurListener,p_)})),this._rootNodeFocusListenerCount.set(n,i+1),1==++this._monitoredElementCount&&this._ngZone.runOutsideAngular((function(){var t=e._getDocument(),n=e._getWindow();t.addEventListener("keydown",e._documentKeydownListener,p_),t.addEventListener("mousedown",e._documentMousedownListener,p_),t.addEventListener("touchstart",e._documentTouchstartListener,p_),n.addEventListener("focus",e._windowFocusListener)}))}}},{key:"_removeGlobalListeners",value:function(t){var e=t.rootNode;if(this._rootNodeFocusListenerCount.has(e)){var n=this._rootNodeFocusListenerCount.get(e);n>1?this._rootNodeFocusListenerCount.set(e,n-1):(e.removeEventListener("focus",this._rootNodeFocusAndBlurListener,p_),e.removeEventListener("blur",this._rootNodeFocusAndBlurListener,p_),this._rootNodeFocusListenerCount.delete(e))}if(!--this._monitoredElementCount){var i=this._getDocument(),r=this._getWindow();i.removeEventListener("keydown",this._documentKeydownListener,p_),i.removeEventListener("mousedown",this._documentMousedownListener,p_),i.removeEventListener("touchstart",this._documentTouchstartListener,p_),r.removeEventListener("focus",this._windowFocusListener),clearTimeout(this._windowFocusTimeoutId),clearTimeout(this._touchTimeoutId),clearTimeout(this._originTimeoutId)}}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(Dc),ve(bg),ve(ud,8),ve(f_,8))},t.\u0275prov=At({factory:function(){return new t(ve(Dc),ve(bg),ve(ud,8),ve(f_,8))},token:t,providedIn:"root"}),t}();function g_(t){return t.composedPath?t.composedPath()[0]:t.target}var v_=function(){var t=function(){function t(e,n){_(this,t),this._elementRef=e,this._focusMonitor=n,this.cdkFocusChange=new Rl}return b(t,[{key:"ngAfterViewInit",value:function(){var t=this,e=this._elementRef.nativeElement;this._monitorSubscription=this._focusMonitor.monitor(e,1===e.nodeType&&e.hasAttribute("cdkMonitorSubtreeFocus")).subscribe((function(e){return t.cdkFocusChange.emit(e)}))}},{key:"ngOnDestroy",value:function(){this._focusMonitor.stopMonitoring(this._elementRef),this._monitorSubscription&&this._monitorSubscription.unsubscribe()}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(m_))},t.\u0275dir=ze({type:t,selectors:[["","cdkMonitorElementFocus",""],["","cdkMonitorSubtreeFocus",""]],outputs:{cdkFocusChange:"cdkFocusChange"}}),t}(),__="cdk-high-contrast-black-on-white",y_="cdk-high-contrast-white-on-black",b_="cdk-high-contrast-active",w_=function(){var t=function(){function t(e,n){_(this,t),this._platform=e,this._document=n}return b(t,[{key:"getHighContrastMode",value:function(){if(!this._platform.isBrowser)return 0;var t=this._document.createElement("div");t.style.backgroundColor="rgb(1,2,3)",t.style.position="absolute",this._document.body.appendChild(t);var e=this._document.defaultView||window,n=e&&e.getComputedStyle?e.getComputedStyle(t):null,i=(n&&n.backgroundColor||"").replace(/ /g,"");switch(this._document.body.removeChild(t),i){case"rgb(0,0,0)":return 2;case"rgb(255,255,255)":return 1}return 0}},{key:"_applyBodyHighContrastModeCssClasses",value:function(){if(this._platform.isBrowser&&this._document.body){var t=this._document.body.classList;t.remove(b_),t.remove(__),t.remove(y_);var e=this.getHighContrastMode();1===e?(t.add(b_),t.add(__)):2===e&&(t.add(b_),t.add(y_))}}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(bg),ve(ud))},t.\u0275prov=At({factory:function(){return new t(ve(bg),ve(ud))},token:t,providedIn:"root"}),t}(),k_=function(){var t=function t(e){_(this,t),e._applyBodyHighContrastModeCssClasses()};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)(ve(w_))},imports:[[wg,qv]]}),t}(),M_=new Uu("10.2.7"),S_=function t(){_(this,t)},C_=function t(){_(this,t)},x_="*";function D_(t,e){return{type:7,name:t,definitions:e,options:{}}}function L_(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return{type:4,styles:e,timings:t}}function T_(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return{type:3,steps:t,options:e}}function E_(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return{type:2,steps:t,options:e}}function O_(t){return{type:6,styles:t,offset:null}}function A_(t,e,n){return{type:0,name:t,styles:e,options:n}}function P_(t){return{type:5,steps:t}}function I_(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return{type:1,expr:t,animation:e,options:n}}function Y_(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return{type:9,options:t}}function R_(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return{type:11,selector:t,animation:e,options:n}}function F_(t){Promise.resolve(null).then(t)}var H_=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;_(this,t),this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this.parentPlayer=null,this.totalTime=e+n}return b(t,[{key:"_onFinish",value:function(){this._finished||(this._finished=!0,this._onDoneFns.forEach((function(t){return t()})),this._onDoneFns=[])}},{key:"onStart",value:function(t){this._onStartFns.push(t)}},{key:"onDone",value:function(t){this._onDoneFns.push(t)}},{key:"onDestroy",value:function(t){this._onDestroyFns.push(t)}},{key:"hasStarted",value:function(){return this._started}},{key:"init",value:function(){}},{key:"play",value:function(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}},{key:"triggerMicrotask",value:function(){var t=this;F_((function(){return t._onFinish()}))}},{key:"_onStart",value:function(){this._onStartFns.forEach((function(t){return t()})),this._onStartFns=[]}},{key:"pause",value:function(){}},{key:"restart",value:function(){}},{key:"finish",value:function(){this._onFinish()}},{key:"destroy",value:function(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach((function(t){return t()})),this._onDestroyFns=[])}},{key:"reset",value:function(){}},{key:"setPosition",value:function(t){}},{key:"getPosition",value:function(){return 0}},{key:"triggerCallback",value:function(t){var e="start"==t?this._onStartFns:this._onDoneFns;e.forEach((function(t){return t()})),e.length=0}}]),t}(),B_=function(){function t(e){var n=this;_(this,t),this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=e;var i=0,r=0,a=0,o=this.players.length;0==o?F_((function(){return n._onFinish()})):this.players.forEach((function(t){t.onDone((function(){++i==o&&n._onFinish()})),t.onDestroy((function(){++r==o&&n._onDestroy()})),t.onStart((function(){++a==o&&n._onStart()}))})),this.totalTime=this.players.reduce((function(t,e){return Math.max(t,e.totalTime)}),0)}return b(t,[{key:"_onFinish",value:function(){this._finished||(this._finished=!0,this._onDoneFns.forEach((function(t){return t()})),this._onDoneFns=[])}},{key:"init",value:function(){this.players.forEach((function(t){return t.init()}))}},{key:"onStart",value:function(t){this._onStartFns.push(t)}},{key:"_onStart",value:function(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach((function(t){return t()})),this._onStartFns=[])}},{key:"onDone",value:function(t){this._onDoneFns.push(t)}},{key:"onDestroy",value:function(t){this._onDestroyFns.push(t)}},{key:"hasStarted",value:function(){return this._started}},{key:"play",value:function(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach((function(t){return t.play()}))}},{key:"pause",value:function(){this.players.forEach((function(t){return t.pause()}))}},{key:"restart",value:function(){this.players.forEach((function(t){return t.restart()}))}},{key:"finish",value:function(){this._onFinish(),this.players.forEach((function(t){return t.finish()}))}},{key:"destroy",value:function(){this._onDestroy()}},{key:"_onDestroy",value:function(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach((function(t){return t.destroy()})),this._onDestroyFns.forEach((function(t){return t()})),this._onDestroyFns=[])}},{key:"reset",value:function(){this.players.forEach((function(t){return t.reset()})),this._destroyed=!1,this._finished=!1,this._started=!1}},{key:"setPosition",value:function(t){var e=t*this.totalTime;this.players.forEach((function(t){var n=t.totalTime?Math.min(1,e/t.totalTime):1;t.setPosition(n)}))}},{key:"getPosition",value:function(){var t=0;return this.players.forEach((function(e){var n=e.getPosition();t=Math.min(n,t)})),t}},{key:"beforeDestroy",value:function(){this.players.forEach((function(t){t.beforeDestroy&&t.beforeDestroy()}))}},{key:"triggerCallback",value:function(t){var e="start"==t?this._onStartFns:this._onDoneFns;e.forEach((function(t){return t()})),e.length=0}}]),t}(),j_="!";function N_(){return"undefined"!=typeof process&&"[object process]"==={}.toString.call(process)}function W_(t){switch(t.length){case 0:return new H_;case 1:return t[0];default:return new B_(t)}}function V_(t,e,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},o=[],s=[],u=-1,l=null;if(i.forEach((function(t){var n=t.offset,i=n==u,c=i&&l||{};Object.keys(t).forEach((function(n){var i=n,s=t[n];if("offset"!==n)switch(i=e.normalizePropertyName(i,o),s){case j_:s=r[n];break;case x_:s=a[n];break;default:s=e.normalizeStyleValue(n,i,s,o)}c[i]=s})),i||s.push(c),l=c,u=n})),o.length){var c="\n - ";throw new Error("Unable to animate due to the following errors:".concat(c).concat(o.join(c)))}return s}function z_(t,e,n,i){switch(e){case"start":t.onStart((function(){return i(n&&U_(n,"start",t))}));break;case"done":t.onDone((function(){return i(n&&U_(n,"done",t))}));break;case"destroy":t.onDestroy((function(){return i(n&&U_(n,"destroy",t))}))}}function U_(t,e,n){var i=n.totalTime,r=q_(t.element,t.triggerName,t.fromState,t.toState,e||t.phaseName,null==i?t.totalTime:i,!!n.disabled),a=t._data;return null!=a&&(r._data=a),r}function q_(t,e,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,o=arguments.length>6?arguments[6]:void 0;return{element:t,triggerName:e,fromState:n,toState:i,phaseName:r,totalTime:a,disabled:!!o}}function G_(t,e,n){var i;return t instanceof Map?(i=t.get(e))||t.set(e,i=n):(i=t[e])||(i=t[e]=n),i}function K_(t){var e=t.indexOf(":");return[t.substring(1,e),t.substr(e+1)]}var Z_=function(t,e){return!1},J_=function(t,e){return!1},Q_=function(t,e,n){return[]},X_=N_();(X_||"undefined"!=typeof Element)&&(Z_=function(t,e){return t.contains(e)},J_=function(){if(X_||Element.prototype.matches)return function(t,e){return t.matches(e)};var t=Element.prototype,e=t.matchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector||t.webkitMatchesSelector;return e?function(t,n){return e.apply(t,[n])}:J_}(),Q_=function(t,e,n){var i=[];if(n)i.push.apply(i,l(t.querySelectorAll(e)));else{var r=t.querySelector(e);r&&i.push(r)}return i});var $_=null,ty=!1;function ey(t){$_||($_=("undefined"!=typeof document?document.body:null)||{},ty=!!$_.style&&"WebkitAppearance"in $_.style);var e=!0;return $_.style&&!function(t){return"ebkit"==t.substring(1,6)}(t)&&!(e=t in $_.style)&&ty&&(e="Webkit"+t.charAt(0).toUpperCase()+t.substr(1)in $_.style),e}var ny=J_,iy=Z_,ry=Q_;function ay(t){var e={};return Object.keys(t).forEach((function(n){var i=n.replace(/([a-z])([A-Z])/g,"$1-$2");e[i]=t[n]})),e}var oy=function(){var t=function(){function t(){_(this,t)}return b(t,[{key:"validateStyleProperty",value:function(t){return ey(t)}},{key:"matchesElement",value:function(t,e){return ny(t,e)}},{key:"containsElement",value:function(t,e){return iy(t,e)}},{key:"query",value:function(t,e,n){return ry(t,e,n)}},{key:"computeStyle",value:function(t,e,n){return n||""}},{key:"animate",value:function(t,e,n,i,r){return new H_(n,i)}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),sy=function(){var t=function t(){_(this,t)};return t.NOOP=new oy,t}(),uy="ng-enter",ly="ng-leave",cy="ng-trigger",dy=".ng-trigger",hy="ng-animating",fy=".ng-animating";function py(t){if("number"==typeof t)return t;var e=t.match(/^(-?[\.\d]+)(m?s)/);return!e||e.length<2?0:my(parseFloat(e[1]),e[2])}function my(t,e){switch(e){case"s":return 1e3*t;default:return t}}function gy(t,e,n){return t.hasOwnProperty("duration")?t:function(t,e,n){var i,r=0,a="";if("string"==typeof t){var o=t.match(/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i);if(null===o)return e.push('The provided timing value "'.concat(t,'" is invalid.')),{duration:0,delay:0,easing:""};i=my(parseFloat(o[1]),o[2]);var s=o[3];null!=s&&(r=my(parseFloat(s),o[4]));var u=o[5];u&&(a=u)}else i=t;if(!n){var l=!1,c=e.length;i<0&&(e.push("Duration values below 0 are not allowed for this animation step."),l=!0),r<0&&(e.push("Delay values below 0 are not allowed for this animation step."),l=!0),l&&e.splice(c,0,'The provided timing value "'.concat(t,'" is invalid.'))}return{duration:i,delay:r,easing:a}}(t,e,n)}function vy(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).forEach((function(n){e[n]=t[n]})),e}function _y(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e)for(var i in t)n[i]=t[i];else vy(t,n);return n}function yy(t,e,n){return n?e+":"+n+";":""}function by(t){for(var e="",n=0;n *";case":leave":return"* => void";case":increment":return function(t,e){return parseFloat(e)>parseFloat(t)};case":decrement":return function(t,e){return parseFloat(e) *"}}(t,n);if("function"==typeof i)return void e.push(i);t=i}var r=t.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(null==r||r.length<4)return n.push('The provided transition expression "'.concat(t,'" is not supported')),e;var a=r[1],o=r[2],s=r[3];e.push(Fy(a,s)),"<"!=o[0]||a==Iy&&s==Iy||e.push(Fy(s,a))}(t,r,i)})):r.push(n),r),animation:a,queryCount:e.queryCount,depCount:e.depCount,options:zy(t.options)}}},{key:"visitSequence",value:function(t,e){var n=this;return{type:2,steps:t.steps.map((function(t){return Ay(n,t,e)})),options:zy(t.options)}}},{key:"visitGroup",value:function(t,e){var n=this,i=e.currentTime,r=0,a=t.steps.map((function(t){e.currentTime=i;var a=Ay(n,t,e);return r=Math.max(r,e.currentTime),a}));return e.currentTime=r,{type:3,steps:a,options:zy(t.options)}}},{key:"visitAnimate",value:function(t,e){var n,i=function(t,e){var n=null;if(t.hasOwnProperty("duration"))n=t;else if("number"==typeof t)return Uy(gy(t,e).duration,0,"");var i=t;if(i.split(/\s+/).some((function(t){return"{"==t.charAt(0)&&"{"==t.charAt(1)}))){var r=Uy(0,0,"");return r.dynamic=!0,r.strValue=i,r}return Uy((n=n||gy(i,e)).duration,n.delay,n.easing)}(t.timings,e.errors);e.currentAnimateTimings=i;var r=t.styles?t.styles:O_({});if(5==r.type)n=this.visitKeyframes(r,e);else{var a=t.styles,o=!1;if(!a){o=!0;var s={};i.easing&&(s.easing=i.easing),a=O_(s)}e.currentTime+=i.duration+i.delay;var u=this.visitStyle(a,e);u.isEmptyStep=o,n=u}return e.currentAnimateTimings=null,{type:4,timings:i,style:n,options:null}}},{key:"visitStyle",value:function(t,e){var n=this._makeStyleAst(t,e);return this._validateStyleAst(n,e),n}},{key:"_makeStyleAst",value:function(t,e){var n=[];Array.isArray(t.styles)?t.styles.forEach((function(t){"string"==typeof t?t==x_?n.push(t):e.errors.push("The provided style string value ".concat(t," is not allowed.")):n.push(t)})):n.push(t.styles);var i=!1,r=null;return n.forEach((function(t){if(Vy(t)){var e=t,n=e.easing;if(n&&(r=n,delete e.easing),!i)for(var a in e)if(e[a].toString().indexOf("{{")>=0){i=!0;break}}})),{type:6,styles:n,easing:r,offset:t.offset,containsDynamicStyles:i,options:null}}},{key:"_validateStyleAst",value:function(t,e){var n=this,i=e.currentAnimateTimings,r=e.currentTime,a=e.currentTime;i&&a>0&&(a-=i.duration+i.delay),t.styles.forEach((function(t){"string"!=typeof t&&Object.keys(t).forEach((function(i){if(n._driver.validateStyleProperty(i)){var o,s,u,l=e.collectedStyles[e.currentQuerySelector],c=l[i],d=!0;c&&(a!=r&&a>=c.startTime&&r<=c.endTime&&(e.errors.push('The CSS property "'.concat(i,'" that exists between the times of "').concat(c.startTime,'ms" and "').concat(c.endTime,'ms" is also being animated in a parallel animation between the times of "').concat(a,'ms" and "').concat(r,'ms"')),d=!1),a=c.startTime),d&&(l[i]={startTime:a,endTime:r}),e.options&&(o=e.errors,s=e.options.params||{},(u=Cy(t[i])).length&&u.forEach((function(t){s.hasOwnProperty(t)||o.push("Unable to resolve the local animation param ".concat(t," in the given list of values"))})))}else e.errors.push('The provided animation property "'.concat(i,'" is not a supported CSS property for animations'))}))}))}},{key:"visitKeyframes",value:function(t,e){var n=this,i={type:5,styles:[],options:null};if(!e.currentAnimateTimings)return e.errors.push("keyframes() must be placed inside of a call to animate()"),i;var r=0,a=[],o=!1,s=!1,u=0,l=t.steps.map((function(t){var i=n._makeStyleAst(t,e),l=null!=i.offset?i.offset:function(t){if("string"==typeof t)return null;var e=null;if(Array.isArray(t))t.forEach((function(t){if(Vy(t)&&t.hasOwnProperty("offset")){var n=t;e=parseFloat(n.offset),delete n.offset}}));else if(Vy(t)&&t.hasOwnProperty("offset")){var n=t;e=parseFloat(n.offset),delete n.offset}return e}(i.styles),c=0;return null!=l&&(r++,c=i.offset=l),s=s||c<0||c>1,o=o||c0&&r0?r==h?1:d*r:a[r],s=o*m;e.currentTime=f+p.delay+s,p.duration=s,n._validateStyleAst(t,e),t.offset=o,i.styles.push(t)})),i}},{key:"visitReference",value:function(t,e){return{type:8,animation:Ay(this,My(t.animation),e),options:zy(t.options)}}},{key:"visitAnimateChild",value:function(t,e){return e.depCount++,{type:9,options:zy(t.options)}}},{key:"visitAnimateRef",value:function(t,e){return{type:10,animation:this.visitReference(t.animation,e),options:zy(t.options)}}},{key:"visitQuery",value:function(t,e){var n=e.currentQuerySelector,i=t.options||{};e.queryCount++,e.currentQuery=t;var r=u(function(t){var e=!!t.split(/\s*,\s*/).find((function(t){return t==Hy}));return e&&(t=t.replace(By,"")),[t=t.replace(/@\*/g,dy).replace(/@\w+/g,(function(t){return".ng-trigger-"+t.substr(1)})).replace(/:animating/g,fy),e]}(t.selector),2),a=r[0],o=r[1];e.currentQuerySelector=n.length?n+" "+a:a,G_(e.collectedStyles,e.currentQuerySelector,{});var s=Ay(this,My(t.animation),e);return e.currentQuery=null,e.currentQuerySelector=n,{type:11,selector:a,limit:i.limit||0,optional:!!i.optional,includeSelf:o,animation:s,originalSelector:t.selector,options:zy(t.options)}}},{key:"visitStagger",value:function(t,e){e.currentQuery||e.errors.push("stagger() can only be used inside of query()");var n="full"===t.timings?{duration:0,delay:0,easing:"full"}:gy(t.timings,e.errors,!0);return{type:12,animation:Ay(this,My(t.animation),e),timings:n,options:null}}}]),t}(),Wy=function t(e){_(this,t),this.errors=e,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null};function Vy(t){return!Array.isArray(t)&&"object"==typeof t}function zy(t){var e;return t?(t=vy(t)).params&&(t.params=(e=t.params)?vy(e):null):t={},t}function Uy(t,e,n){return{duration:t,delay:e,easing:n}}function qy(t,e,n,i,r,a){var o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:null,s=arguments.length>7&&void 0!==arguments[7]&&arguments[7];return{type:1,element:t,keyframes:e,preStyleProps:n,postStyleProps:i,duration:r,delay:a,totalTime:r+a,easing:o,subTimeline:s}}var Gy=function(){function t(){_(this,t),this._map=new Map}return b(t,[{key:"consume",value:function(t){var e=this._map.get(t);return e?this._map.delete(t):e=[],e}},{key:"append",value:function(t,e){var n,i=this._map.get(t);i||this._map.set(t,i=[]),(n=i).push.apply(n,l(e))}},{key:"has",value:function(t){return this._map.has(t)}},{key:"clear",value:function(){this._map.clear()}}]),t}(),Ky=new RegExp(":enter","g"),Zy=new RegExp(":leave","g");function Jy(t,e,n,i,r){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},s=arguments.length>7?arguments[7]:void 0,u=arguments.length>8?arguments[8]:void 0,l=arguments.length>9&&void 0!==arguments[9]?arguments[9]:[];return(new Qy).buildKeyframes(t,e,n,i,r,a,o,s,u,l)}var Qy=function(){function t(){_(this,t)}return b(t,[{key:"buildKeyframes",value:function(t,e,n,i,r,a,o,s,u){var l=arguments.length>9&&void 0!==arguments[9]?arguments[9]:[];u=u||new Gy;var c=new $y(t,e,u,i,r,l,[]);c.options=s,c.currentTimeline.setStyles([a],null,c.errors,s),Ay(this,n,c);var d=c.timelines.filter((function(t){return t.containsAnimation()}));if(d.length&&Object.keys(o).length){var h=d[d.length-1];h.allowOnlyTimelineStyles()||h.setStyles([o],null,c.errors,s)}return d.length?d.map((function(t){return t.buildKeyframes()})):[qy(e,[],[],[],0,0,"",!1)]}},{key:"visitTrigger",value:function(t,e){}},{key:"visitState",value:function(t,e){}},{key:"visitTransition",value:function(t,e){}},{key:"visitAnimateChild",value:function(t,e){var n=e.subInstructions.consume(e.element);if(n){var i=e.createSubContext(t.options),r=e.currentTimeline.currentTime,a=this._visitSubInstructions(n,i,i.options);r!=a&&e.transformIntoNewTimeline(a)}e.previousNode=t}},{key:"visitAnimateRef",value:function(t,e){var n=e.createSubContext(t.options);n.transformIntoNewTimeline(),this.visitReference(t.animation,n),e.transformIntoNewTimeline(n.currentTimeline.currentTime),e.previousNode=t}},{key:"_visitSubInstructions",value:function(t,e,n){var i=e.currentTimeline.currentTime,r=null!=n.duration?py(n.duration):null,a=null!=n.delay?py(n.delay):null;return 0!==r&&t.forEach((function(t){var n=e.appendInstructionToTimeline(t,r,a);i=Math.max(i,n.duration+n.delay)})),i}},{key:"visitReference",value:function(t,e){e.updateOptions(t.options,!0),Ay(this,t.animation,e),e.previousNode=t}},{key:"visitSequence",value:function(t,e){var n=this,i=e.subContextCount,r=e,a=t.options;if(a&&(a.params||a.delay)&&((r=e.createSubContext(a)).transformIntoNewTimeline(),null!=a.delay)){6==r.previousNode.type&&(r.currentTimeline.snapshotCurrentStyles(),r.previousNode=Xy);var o=py(a.delay);r.delayNextStep(o)}t.steps.length&&(t.steps.forEach((function(t){return Ay(n,t,r)})),r.currentTimeline.applyStylesToKeyframe(),r.subContextCount>i&&r.transformIntoNewTimeline()),e.previousNode=t}},{key:"visitGroup",value:function(t,e){var n=this,i=[],r=e.currentTimeline.currentTime,a=t.options&&t.options.delay?py(t.options.delay):0;t.steps.forEach((function(o){var s=e.createSubContext(t.options);a&&s.delayNextStep(a),Ay(n,o,s),r=Math.max(r,s.currentTimeline.currentTime),i.push(s.currentTimeline)})),i.forEach((function(t){return e.currentTimeline.mergeTimelineCollectedStyles(t)})),e.transformIntoNewTimeline(r),e.previousNode=t}},{key:"_visitTiming",value:function(t,e){if(t.dynamic){var n=t.strValue;return gy(e.params?xy(n,e.params,e.errors):n,e.errors)}return{duration:t.duration,delay:t.delay,easing:t.easing}}},{key:"visitAnimate",value:function(t,e){var n=e.currentAnimateTimings=this._visitTiming(t.timings,e),i=e.currentTimeline;n.delay&&(e.incrementTime(n.delay),i.snapshotCurrentStyles());var r=t.style;5==r.type?this.visitKeyframes(r,e):(e.incrementTime(n.duration),this.visitStyle(r,e),i.applyStylesToKeyframe()),e.currentAnimateTimings=null,e.previousNode=t}},{key:"visitStyle",value:function(t,e){var n=e.currentTimeline,i=e.currentAnimateTimings;!i&&n.getCurrentStyleProperties().length&&n.forwardFrame();var r=i&&i.easing||t.easing;t.isEmptyStep?n.applyEmptyStep(r):n.setStyles(t.styles,r,e.errors,e.options),e.previousNode=t}},{key:"visitKeyframes",value:function(t,e){var n=e.currentAnimateTimings,i=e.currentTimeline.duration,r=n.duration,a=e.createSubContext().currentTimeline;a.easing=n.easing,t.styles.forEach((function(t){a.forwardTime((t.offset||0)*r),a.setStyles(t.styles,t.easing,e.errors,e.options),a.applyStylesToKeyframe()})),e.currentTimeline.mergeTimelineCollectedStyles(a),e.transformIntoNewTimeline(i+r),e.previousNode=t}},{key:"visitQuery",value:function(t,e){var n=this,i=e.currentTimeline.currentTime,r=t.options||{},a=r.delay?py(r.delay):0;a&&(6===e.previousNode.type||0==i&&e.currentTimeline.getCurrentStyleProperties().length)&&(e.currentTimeline.snapshotCurrentStyles(),e.previousNode=Xy);var o=i,s=e.invokeQuery(t.selector,t.originalSelector,t.limit,t.includeSelf,!!r.optional,e.errors);e.currentQueryTotal=s.length;var u=null;s.forEach((function(i,r){e.currentQueryIndex=r;var s=e.createSubContext(t.options,i);a&&s.delayNextStep(a),i===e.element&&(u=s.currentTimeline),Ay(n,t.animation,s),s.currentTimeline.applyStylesToKeyframe(),o=Math.max(o,s.currentTimeline.currentTime)})),e.currentQueryIndex=0,e.currentQueryTotal=0,e.transformIntoNewTimeline(o),u&&(e.currentTimeline.mergeTimelineCollectedStyles(u),e.currentTimeline.snapshotCurrentStyles()),e.previousNode=t}},{key:"visitStagger",value:function(t,e){var n=e.parentContext,i=e.currentTimeline,r=t.timings,a=Math.abs(r.duration),o=a*(e.currentQueryTotal-1),s=a*e.currentQueryIndex;switch(r.duration<0?"reverse":r.easing){case"reverse":s=o-s;break;case"full":s=n.currentStaggerTime}var u=e.currentTimeline;s&&u.delayNextStep(s);var l=u.currentTime;Ay(this,t.animation,e),e.previousNode=t,n.currentStaggerTime=i.currentTime-l+(i.startTime-n.currentTimeline.startTime)}}]),t}(),Xy={},$y=function(){function t(e,n,i,r,a,o,s,u){_(this,t),this._driver=e,this.element=n,this.subInstructions=i,this._enterClassName=r,this._leaveClassName=a,this.errors=o,this.timelines=s,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=Xy,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=u||new tb(this._driver,n,0),s.push(this.currentTimeline)}return b(t,[{key:"updateOptions",value:function(t,e){var n=this;if(t){var i=t,r=this.options;null!=i.duration&&(r.duration=py(i.duration)),null!=i.delay&&(r.delay=py(i.delay));var a=i.params;if(a){var o=r.params;o||(o=this.options.params={}),Object.keys(a).forEach((function(t){e&&o.hasOwnProperty(t)||(o[t]=xy(a[t],o,n.errors))}))}}}},{key:"_copyOptions",value:function(){var t={};if(this.options){var e=this.options.params;if(e){var n=t.params={};Object.keys(e).forEach((function(t){n[t]=e[t]}))}}return t}},{key:"createSubContext",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,n=arguments.length>1?arguments[1]:void 0,i=arguments.length>2?arguments[2]:void 0,r=n||this.element,a=new t(this._driver,r,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(r,i||0));return a.previousNode=this.previousNode,a.currentAnimateTimings=this.currentAnimateTimings,a.options=this._copyOptions(),a.updateOptions(e),a.currentQueryIndex=this.currentQueryIndex,a.currentQueryTotal=this.currentQueryTotal,a.parentContext=this,this.subContextCount++,a}},{key:"transformIntoNewTimeline",value:function(t){return this.previousNode=Xy,this.currentTimeline=this.currentTimeline.fork(this.element,t),this.timelines.push(this.currentTimeline),this.currentTimeline}},{key:"appendInstructionToTimeline",value:function(t,e,n){var i={duration:null!=e?e:t.duration,delay:this.currentTimeline.currentTime+(null!=n?n:0)+t.delay,easing:""},r=new eb(this._driver,t.element,t.keyframes,t.preStyleProps,t.postStyleProps,i,t.stretchStartingKeyframe);return this.timelines.push(r),i}},{key:"incrementTime",value:function(t){this.currentTimeline.forwardTime(this.currentTimeline.duration+t)}},{key:"delayNextStep",value:function(t){t>0&&this.currentTimeline.delayNextStep(t)}},{key:"invokeQuery",value:function(t,e,n,i,r,a){var o=[];if(i&&o.push(this.element),t.length>0){t=(t=t.replace(Ky,"."+this._enterClassName)).replace(Zy,"."+this._leaveClassName);var s=this._driver.query(this.element,t,1!=n);0!==n&&(s=n<0?s.slice(s.length+n,s.length):s.slice(0,n)),o.push.apply(o,l(s))}return r||0!=o.length||a.push('`query("'.concat(e,'")` returned zero elements. (Use `query("').concat(e,'", { optional: true })` if you wish to allow this.)')),o}},{key:"params",get:function(){return this.options.params}}]),t}(),tb=function(){function t(e,n,i,r){_(this,t),this._driver=e,this.element=n,this.startTime=i,this._elementTimelineStylesLookup=r,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(n),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(n,this._localTimelineStyles)),this._loadKeyframe()}return b(t,[{key:"containsAnimation",value:function(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}}},{key:"getCurrentStyleProperties",value:function(){return Object.keys(this._currentKeyframe)}},{key:"delayNextStep",value:function(t){var e=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||e?(this.forwardTime(this.currentTime+t),e&&this.snapshotCurrentStyles()):this.startTime+=t}},{key:"fork",value:function(e,n){return this.applyStylesToKeyframe(),new t(this._driver,e,n||this.currentTime,this._elementTimelineStylesLookup)}},{key:"_loadKeyframe",value:function(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))}},{key:"forwardFrame",value:function(){this.duration+=1,this._loadKeyframe()}},{key:"forwardTime",value:function(t){this.applyStylesToKeyframe(),this.duration=t,this._loadKeyframe()}},{key:"_updateStyle",value:function(t,e){this._localTimelineStyles[t]=e,this._globalTimelineStyles[t]=e,this._styleSummary[t]={time:this.currentTime,value:e}}},{key:"allowOnlyTimelineStyles",value:function(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}},{key:"applyEmptyStep",value:function(t){var e=this;t&&(this._previousKeyframe.easing=t),Object.keys(this._globalTimelineStyles).forEach((function(t){e._backFill[t]=e._globalTimelineStyles[t]||x_,e._currentKeyframe[t]=x_})),this._currentEmptyStepKeyframe=this._currentKeyframe}},{key:"setStyles",value:function(t,e,n,i){var r=this;e&&(this._previousKeyframe.easing=e);var a=i&&i.params||{},o=function(t,e){var n,i={};return t.forEach((function(t){"*"===t?(n=n||Object.keys(e)).forEach((function(t){i[t]=x_})):_y(t,!1,i)})),i}(t,this._globalTimelineStyles);Object.keys(o).forEach((function(t){var e=xy(o[t],a,n);r._pendingStyles[t]=e,r._localTimelineStyles.hasOwnProperty(t)||(r._backFill[t]=r._globalTimelineStyles.hasOwnProperty(t)?r._globalTimelineStyles[t]:x_),r._updateStyle(t,e)}))}},{key:"applyStylesToKeyframe",value:function(){var t=this,e=this._pendingStyles,n=Object.keys(e);0!=n.length&&(this._pendingStyles={},n.forEach((function(n){t._currentKeyframe[n]=e[n]})),Object.keys(this._localTimelineStyles).forEach((function(e){t._currentKeyframe.hasOwnProperty(e)||(t._currentKeyframe[e]=t._localTimelineStyles[e])})))}},{key:"snapshotCurrentStyles",value:function(){var t=this;Object.keys(this._localTimelineStyles).forEach((function(e){var n=t._localTimelineStyles[e];t._pendingStyles[e]=n,t._updateStyle(e,n)}))}},{key:"getFinalKeyframe",value:function(){return this._keyframes.get(this.duration)}},{key:"mergeTimelineCollectedStyles",value:function(t){var e=this;Object.keys(t._styleSummary).forEach((function(n){var i=e._styleSummary[n],r=t._styleSummary[n];(!i||r.time>i.time)&&e._updateStyle(n,r.value)}))}},{key:"buildKeyframes",value:function(){var t=this;this.applyStylesToKeyframe();var e=new Set,n=new Set,i=1===this._keyframes.size&&0===this.duration,r=[];this._keyframes.forEach((function(a,o){var s=_y(a,!0);Object.keys(s).forEach((function(t){var i=s[t];i==j_?e.add(t):i==x_&&n.add(t)})),i||(s.offset=o/t.duration),r.push(s)}));var a=e.size?Dy(e.values()):[],o=n.size?Dy(n.values()):[];if(i){var s=r[0],u=vy(s);s.offset=0,u.offset=1,r=[s,u]}return qy(this.element,r,a,o,this.duration,this.startTime,this.easing,!1)}},{key:"currentTime",get:function(){return this.startTime+this.duration}},{key:"properties",get:function(){var t=[];for(var e in this._currentKeyframe)t.push(e);return t}}]),t}(),eb=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s){var u,l=arguments.length>6&&void 0!==arguments[6]&&arguments[6];return _(this,n),(u=e.call(this,t,i,s.delay)).element=i,u.keyframes=r,u.preStyleProps=a,u.postStyleProps=o,u._stretchStartingKeyframe=l,u.timings={duration:s.duration,delay:s.delay,easing:s.easing},u}return b(n,[{key:"containsAnimation",value:function(){return this.keyframes.length>1}},{key:"buildKeyframes",value:function(){var t=this.keyframes,e=this.timings,n=e.delay,i=e.duration,r=e.easing;if(this._stretchStartingKeyframe&&n){var a=[],o=i+n,s=n/o,u=_y(t[0],!1);u.offset=0,a.push(u);var l=_y(t[0],!1);l.offset=nb(s),a.push(l);for(var c=t.length-1,d=1;d<=c;d++){var h=_y(t[d],!1);h.offset=nb((n+h.offset*i)/o),a.push(h)}i=o,n=0,r="",t=a}return qy(this.element,t,this.preStyleProps,this.postStyleProps,i,n,r,!0)}}]),n}(tb);function nb(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=Math.pow(10,e-1);return Math.round(t*n)/n}var ib=function t(){_(this,t)},rb=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return b(n,[{key:"normalizePropertyName",value:function(t,e){return Ty(t)}},{key:"normalizeStyleValue",value:function(t,e,n,i){var r="",a=n.toString().trim();if(ab[e]&&0!==n&&"0"!==n)if("number"==typeof n)r="px";else{var o=n.match(/^[+-]?[\d\.]+([a-z]*)$/);o&&0==o[1].length&&i.push("Please provide a CSS unit value for ".concat(t,":").concat(n))}return a+r}}]),n}(ib),ab=function(){return t="width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(","),e={},t.forEach((function(t){return e[t]=!0})),e;var t,e}();function ob(t,e,n,i,r,a,o,s,u,l,c,d,h){return{type:0,element:t,triggerName:e,isRemovalTransition:r,fromState:n,fromStyles:a,toState:i,toStyles:o,timelines:s,queriedElements:u,preStyleProps:l,postStyleProps:c,totalTime:d,errors:h}}var sb={},ub=function(){function t(e,n,i){_(this,t),this._triggerName=e,this.ast=n,this._stateStyles=i}return b(t,[{key:"match",value:function(t,e,n,i){return function(t,e,n,i,r){return t.some((function(t){return t(e,n,i,r)}))}(this.ast.matchers,t,e,n,i)}},{key:"buildStyles",value:function(t,e,n){var i=this._stateStyles["*"],r=this._stateStyles[t],a=i?i.buildStyles(e,n):{};return r?r.buildStyles(e,n):a}},{key:"build",value:function(t,e,n,i,r,a,o,s,u,l){var c=[],d=this.ast.options&&this.ast.options.params||sb,h=this.buildStyles(n,o&&o.params||sb,c),f=s&&s.params||sb,p=this.buildStyles(i,f,c),m=new Set,g=new Map,v=new Map,_="void"===i,y={params:Object.assign(Object.assign({},d),f)},b=l?[]:Jy(t,e,this.ast.animation,r,a,h,p,y,u,c),w=0;if(b.forEach((function(t){w=Math.max(t.duration+t.delay,w)})),c.length)return ob(e,this._triggerName,n,i,_,h,p,[],[],g,v,w,c);b.forEach((function(t){var n=t.element,i=G_(g,n,{});t.preStyleProps.forEach((function(t){return i[t]=!0}));var r=G_(v,n,{});t.postStyleProps.forEach((function(t){return r[t]=!0})),n!==e&&m.add(n)}));var k=Dy(m.values());return ob(e,this._triggerName,n,i,_,h,p,b,k,g,v,w)}}]),t}(),lb=function(){function t(e,n){_(this,t),this.styles=e,this.defaultParams=n}return b(t,[{key:"buildStyles",value:function(t,e){var n={},i=vy(this.defaultParams);return Object.keys(t).forEach((function(e){var n=t[e];null!=n&&(i[e]=n)})),this.styles.styles.forEach((function(t){if("string"!=typeof t){var r=t;Object.keys(r).forEach((function(t){var a=r[t];a.length>1&&(a=xy(a,i,e)),n[t]=a}))}})),n}}]),t}(),cb=function(){function t(e,n){var i=this;_(this,t),this.name=e,this.ast=n,this.transitionFactories=[],this.states={},n.states.forEach((function(t){i.states[t.name]=new lb(t.style,t.options&&t.options.params||{})})),db(this.states,"true","1"),db(this.states,"false","0"),n.transitions.forEach((function(t){i.transitionFactories.push(new ub(e,t,i.states))})),this.fallbackTransition=new ub(e,{type:1,animation:{type:2,steps:[],options:null},matchers:[function(t,e){return!0}],options:null,queryCount:0,depCount:0},this.states)}return b(t,[{key:"matchTransition",value:function(t,e,n,i){return this.transitionFactories.find((function(r){return r.match(t,e,n,i)}))||null}},{key:"matchStyles",value:function(t,e,n){return this.fallbackTransition.buildStyles(t,e,n)}},{key:"containsQueries",get:function(){return this.ast.queryCount>0}}]),t}();function db(t,e,n){t.hasOwnProperty(e)?t.hasOwnProperty(n)||(t[n]=t[e]):t.hasOwnProperty(n)&&(t[e]=t[n])}var hb=new Gy,fb=function(){function t(e,n,i){_(this,t),this.bodyNode=e,this._driver=n,this._normalizer=i,this._animations={},this._playersById={},this.players=[]}return b(t,[{key:"register",value:function(t,e){var n=[],i=jy(this._driver,e,n);if(n.length)throw new Error("Unable to build the animation due to the following errors: ".concat(n.join("\n")));this._animations[t]=i}},{key:"_buildPlayer",value:function(t,e,n){var i=t.element,r=V_(this._driver,this._normalizer,i,t.keyframes,e,n);return this._driver.animate(i,r,t.duration,t.delay,t.easing,[],!0)}},{key:"create",value:function(t,e){var n,i=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=[],o=this._animations[t],s=new Map;if(o?(n=Jy(this._driver,e,o,uy,ly,{},{},r,hb,a)).forEach((function(t){var e=G_(s,t.element,{});t.postStyleProps.forEach((function(t){return e[t]=null}))})):(a.push("The requested animation doesn't exist or has already been destroyed"),n=[]),a.length)throw new Error("Unable to create the animation due to the following errors: ".concat(a.join("\n")));s.forEach((function(t,e){Object.keys(t).forEach((function(n){t[n]=i._driver.computeStyle(e,n,x_)}))}));var u=n.map((function(t){var e=s.get(t.element);return i._buildPlayer(t,{},e)})),l=W_(u);return this._playersById[t]=l,l.onDestroy((function(){return i.destroy(t)})),this.players.push(l),l}},{key:"destroy",value:function(t){var e=this._getPlayer(t);e.destroy(),delete this._playersById[t];var n=this.players.indexOf(e);n>=0&&this.players.splice(n,1)}},{key:"_getPlayer",value:function(t){var e=this._playersById[t];if(!e)throw new Error("Unable to find the timeline player referenced by ".concat(t));return e}},{key:"listen",value:function(t,e,n,i){var r=q_(e,"","","");return z_(this._getPlayer(t),n,r,i),function(){}}},{key:"command",value:function(t,e,n,i){if("register"!=n)if("create"!=n){var r=this._getPlayer(t);switch(n){case"play":r.play();break;case"pause":r.pause();break;case"reset":r.reset();break;case"restart":r.restart();break;case"finish":r.finish();break;case"init":r.init();break;case"setPosition":r.setPosition(parseFloat(i[0]));break;case"destroy":this.destroy(t)}}else this.create(t,e,i[0]||{});else this.register(t,i[0])}}]),t}(),pb="ng-animate-queued",mb="ng-animate-disabled",gb=".ng-animate-disabled",vb="ng-star-inserted",_b=[],yb={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},bb={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},wb=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";_(this,t),this.namespaceId=n;var i=e&&e.hasOwnProperty("value"),r=i?e.value:e;if(this.value=Db(r),i){var a=vy(e);delete a.value,this.options=a}else this.options={};this.options.params||(this.options.params={})}return b(t,[{key:"absorbOptions",value:function(t){var e=t.params;if(e){var n=this.options.params;Object.keys(e).forEach((function(t){null==n[t]&&(n[t]=e[t])}))}}},{key:"params",get:function(){return this.options.params}}]),t}(),kb="void",Mb=new wb(kb),Sb=function(){function t(e,n,i){_(this,t),this.id=e,this.hostElement=n,this._engine=i,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+e,Ab(n,this._hostClassName)}return b(t,[{key:"listen",value:function(t,e,n,i){var r,a=this;if(!this._triggers.hasOwnProperty(e))throw new Error('Unable to listen on the animation trigger event "'.concat(n,'" because the animation trigger "').concat(e,"\" doesn't exist!"));if(null==n||0==n.length)throw new Error('Unable to listen on the animation trigger "'.concat(e,'" because the provided event is undefined!'));if("start"!=(r=n)&&"done"!=r)throw new Error('The provided animation trigger event "'.concat(n,'" for the animation trigger "').concat(e,'" is not supported!'));var o=G_(this._elementListeners,t,[]),s={name:e,phase:n,callback:i};o.push(s);var u=G_(this._engine.statesByElement,t,{});return u.hasOwnProperty(e)||(Ab(t,cy),Ab(t,"ng-trigger-"+e),u[e]=Mb),function(){a._engine.afterFlush((function(){var t=o.indexOf(s);t>=0&&o.splice(t,1),a._triggers[e]||delete u[e]}))}}},{key:"register",value:function(t,e){return!this._triggers[t]&&(this._triggers[t]=e,!0)}},{key:"_getTrigger",value:function(t){var e=this._triggers[t];if(!e)throw new Error('The provided animation trigger "'.concat(t,'" has not been registered!'));return e}},{key:"trigger",value:function(t,e,n){var i=this,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=this._getTrigger(e),o=new xb(this.id,e,t),s=this._engine.statesByElement.get(t);s||(Ab(t,cy),Ab(t,"ng-trigger-"+e),this._engine.statesByElement.set(t,s={}));var u=s[e],l=new wb(n,this.id),c=n&&n.hasOwnProperty("value");!c&&u&&l.absorbOptions(u.options),s[e]=l,u||(u=Mb);var d=l.value===kb;if(d||u.value!==l.value){var h=G_(this._engine.playersByElement,t,[]);h.forEach((function(t){t.namespaceId==i.id&&t.triggerName==e&&t.queued&&t.destroy()}));var f=a.matchTransition(u.value,l.value,t,l.params),p=!1;if(!f){if(!r)return;f=a.fallbackTransition,p=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:t,triggerName:e,transition:f,fromState:u,toState:l,player:o,isFallbackTransition:p}),p||(Ab(t,pb),o.onStart((function(){Pb(t,pb)}))),o.onDone((function(){var e=i.players.indexOf(o);e>=0&&i.players.splice(e,1);var n=i._engine.playersByElement.get(t);if(n){var r=n.indexOf(o);r>=0&&n.splice(r,1)}})),this.players.push(o),h.push(o),o}if(!Yb(u.params,l.params)){var m=[],g=a.matchStyles(u.value,u.params,m),v=a.matchStyles(l.value,l.params,m);m.length?this._engine.reportError(m):this._engine.afterFlush((function(){ky(t,g),wy(t,v)}))}}},{key:"deregister",value:function(t){var e=this;delete this._triggers[t],this._engine.statesByElement.forEach((function(e,n){delete e[t]})),this._elementListeners.forEach((function(n,i){e._elementListeners.set(i,n.filter((function(e){return e.name!=t})))}))}},{key:"clearElementCache",value:function(t){this._engine.statesByElement.delete(t),this._elementListeners.delete(t);var e=this._engine.playersByElement.get(t);e&&(e.forEach((function(t){return t.destroy()})),this._engine.playersByElement.delete(t))}},{key:"_signalRemovalForInnerTriggers",value:function(t,e){var n=this,i=this._engine.driver.query(t,dy,!0);i.forEach((function(t){if(!t.__ng_removed){var i=n._engine.fetchNamespacesByElement(t);i.size?i.forEach((function(n){return n.triggerLeaveAnimation(t,e,!1,!0)})):n.clearElementCache(t)}})),this._engine.afterFlushAnimationsDone((function(){return i.forEach((function(t){return n.clearElementCache(t)}))}))}},{key:"triggerLeaveAnimation",value:function(t,e,n,i){var r=this,a=this._engine.statesByElement.get(t);if(a){var o=[];if(Object.keys(a).forEach((function(e){if(r._triggers[e]){var n=r.trigger(t,e,kb,i);n&&o.push(n)}})),o.length)return this._engine.markElementAsRemoved(this.id,t,!0,e),n&&W_(o).onDone((function(){return r._engine.processLeaveNode(t)})),!0}return!1}},{key:"prepareLeaveAnimationListeners",value:function(t){var e=this,n=this._elementListeners.get(t);if(n){var i=new Set;n.forEach((function(n){var r=n.name;if(!i.has(r)){i.add(r);var a=e._triggers[r].fallbackTransition,o=e._engine.statesByElement.get(t)[r]||Mb,s=new wb(kb),u=new xb(e.id,r,t);e._engine.totalQueuedPlayers++,e._queue.push({element:t,triggerName:r,transition:a,fromState:o,toState:s,player:u,isFallbackTransition:!0})}}))}}},{key:"removeNode",value:function(t,e){var n=this,i=this._engine;if(t.childElementCount&&this._signalRemovalForInnerTriggers(t,e),!this.triggerLeaveAnimation(t,e,!0)){var r=!1;if(i.totalAnimations){var a=i.players.length?i.playersByQueriedElement.get(t):[];if(a&&a.length)r=!0;else for(var o=t;o=o.parentNode;)if(i.statesByElement.get(o)){r=!0;break}}if(this.prepareLeaveAnimationListeners(t),r)i.markElementAsRemoved(this.id,t,!1,e);else{var s=t.__ng_removed;s&&s!==yb||(i.afterFlush((function(){return n.clearElementCache(t)})),i.destroyInnerAnimations(t),i._onRemovalComplete(t,e))}}}},{key:"insertNode",value:function(t,e){Ab(t,this._hostClassName)}},{key:"drainQueuedTransitions",value:function(t){var e=this,n=[];return this._queue.forEach((function(i){var r=i.player;if(!r.destroyed){var a=i.element,o=e._elementListeners.get(a);o&&o.forEach((function(e){if(e.name==i.triggerName){var n=q_(a,i.triggerName,i.fromState.value,i.toState.value);n._data=t,z_(i.player,e.phase,n,e.callback)}})),r.markedForDestroy?e._engine.afterFlush((function(){r.destroy()})):n.push(i)}})),this._queue=[],n.sort((function(t,n){var i=t.transition.ast.depCount,r=n.transition.ast.depCount;return 0==i||0==r?i-r:e._engine.driver.containsElement(t.element,n.element)?1:-1}))}},{key:"destroy",value:function(t){this.players.forEach((function(t){return t.destroy()})),this._signalRemovalForInnerTriggers(this.hostElement,t)}},{key:"elementContainsData",value:function(t){var e=!1;return this._elementListeners.has(t)&&(e=!0),!!this._queue.find((function(e){return e.element===t}))||e}}]),t}(),Cb=function(){function t(e,n,i){_(this,t),this.bodyNode=e,this.driver=n,this._normalizer=i,this.players=[],this.newHostElements=new Map,this.playersByElement=new Map,this.playersByQueriedElement=new Map,this.statesByElement=new Map,this.disabledNodes=new Set,this.totalAnimations=0,this.totalQueuedPlayers=0,this._namespaceLookup={},this._namespaceList=[],this._flushFns=[],this._whenQuietFns=[],this.namespacesByHostElement=new Map,this.collectedEnterElements=[],this.collectedLeaveElements=[],this.onRemovalComplete=function(t,e){}}return b(t,[{key:"_onRemovalComplete",value:function(t,e){this.onRemovalComplete(t,e)}},{key:"createNamespace",value:function(t,e){var n=new Sb(t,e,this);return e.parentNode?this._balanceNamespaceList(n,e):(this.newHostElements.set(e,n),this.collectEnterElement(e)),this._namespaceLookup[t]=n}},{key:"_balanceNamespaceList",value:function(t,e){var n=this._namespaceList.length-1;if(n>=0){for(var i=!1,r=n;r>=0;r--)if(this.driver.containsElement(this._namespaceList[r].hostElement,e)){this._namespaceList.splice(r+1,0,t),i=!0;break}i||this._namespaceList.splice(0,0,t)}else this._namespaceList.push(t);return this.namespacesByHostElement.set(e,t),t}},{key:"register",value:function(t,e){var n=this._namespaceLookup[t];return n||(n=this.createNamespace(t,e)),n}},{key:"registerTrigger",value:function(t,e,n){var i=this._namespaceLookup[t];i&&i.register(e,n)&&this.totalAnimations++}},{key:"destroy",value:function(t,e){var n=this;if(t){var i=this._fetchNamespace(t);this.afterFlush((function(){n.namespacesByHostElement.delete(i.hostElement),delete n._namespaceLookup[t];var e=n._namespaceList.indexOf(i);e>=0&&n._namespaceList.splice(e,1)})),this.afterFlushAnimationsDone((function(){return i.destroy(e)}))}}},{key:"_fetchNamespace",value:function(t){return this._namespaceLookup[t]}},{key:"fetchNamespacesByElement",value:function(t){var e=new Set,n=this.statesByElement.get(t);if(n)for(var i=Object.keys(n),r=0;r=0&&this.collectedLeaveElements.splice(a,1)}if(t){var o=this._fetchNamespace(t);o&&o.insertNode(e,n)}i&&this.collectEnterElement(e)}}},{key:"collectEnterElement",value:function(t){this.collectedEnterElements.push(t)}},{key:"markElementAsDisabled",value:function(t,e){e?this.disabledNodes.has(t)||(this.disabledNodes.add(t),Ab(t,mb)):this.disabledNodes.has(t)&&(this.disabledNodes.delete(t),Pb(t,mb))}},{key:"removeNode",value:function(t,e,n,i){if(Lb(e)){var r=t?this._fetchNamespace(t):null;if(r?r.removeNode(e,i):this.markElementAsRemoved(t,e,!1,i),n){var a=this.namespacesByHostElement.get(e);a&&a.id!==t&&a.removeNode(e,i)}}else this._onRemovalComplete(e,i)}},{key:"markElementAsRemoved",value:function(t,e,n,i){this.collectedLeaveElements.push(e),e.__ng_removed={namespaceId:t,setForRemoval:i,hasAnimation:n,removedBeforeQueried:!1}}},{key:"listen",value:function(t,e,n,i,r){return Lb(e)?this._fetchNamespace(t).listen(e,n,i,r):function(){}}},{key:"_buildInstruction",value:function(t,e,n,i,r){return t.transition.build(this.driver,t.element,t.fromState.value,t.toState.value,n,i,t.fromState.options,t.toState.options,e,r)}},{key:"destroyInnerAnimations",value:function(t){var e=this,n=this.driver.query(t,dy,!0);n.forEach((function(t){return e.destroyActiveAnimationsForElement(t)})),0!=this.playersByQueriedElement.size&&(n=this.driver.query(t,fy,!0)).forEach((function(t){return e.finishActiveQueriedAnimationOnElement(t)}))}},{key:"destroyActiveAnimationsForElement",value:function(t){var e=this.playersByElement.get(t);e&&e.forEach((function(t){t.queued?t.markedForDestroy=!0:t.destroy()}))}},{key:"finishActiveQueriedAnimationOnElement",value:function(t){var e=this.playersByQueriedElement.get(t);e&&e.forEach((function(t){return t.finish()}))}},{key:"whenRenderingDone",value:function(){var t=this;return new Promise((function(e){if(t.players.length)return W_(t.players).onDone((function(){return e()}));e()}))}},{key:"processLeaveNode",value:function(t){var e=this,n=t.__ng_removed;if(n&&n.setForRemoval){if(t.__ng_removed=yb,n.namespaceId){this.destroyInnerAnimations(t);var i=this._fetchNamespace(n.namespaceId);i&&i.clearElementCache(t)}this._onRemovalComplete(t,n.setForRemoval)}this.driver.matchesElement(t,gb)&&this.markElementAsDisabled(t,!1),this.driver.query(t,gb,!0).forEach((function(t){e.markElementAsDisabled(t,!1)}))}},{key:"flush",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1,n=[];if(this.newHostElements.size&&(this.newHostElements.forEach((function(e,n){return t._balanceNamespaceList(e,n)})),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(var i=0;i=0;D--)this._namespaceList[D].drainQueuedTransitions(e).forEach((function(t){var e=t.player,a=t.element;if(C.push(e),n.collectedEnterElements.length){var l=a.__ng_removed;if(l&&l.setForMove)return void e.destroy()}var d=!h||!n.driver.containsElement(h,a),f=M.get(a),p=m.get(a),g=n._buildInstruction(t,i,p,f,d);if(g.errors&&g.errors.length)x.push(g);else{if(d)return e.onStart((function(){return ky(a,g.fromStyles)})),e.onDestroy((function(){return wy(a,g.toStyles)})),void r.push(e);if(t.isFallbackTransition)return e.onStart((function(){return ky(a,g.fromStyles)})),e.onDestroy((function(){return wy(a,g.toStyles)})),void r.push(e);g.timelines.forEach((function(t){return t.stretchStartingKeyframe=!0})),i.append(a,g.timelines),o.push({instruction:g,player:e,element:a}),g.queriedElements.forEach((function(t){return G_(s,t,[]).push(e)})),g.preStyleProps.forEach((function(t,e){var n=Object.keys(t);if(n.length){var i=u.get(e);i||u.set(e,i=new Set),n.forEach((function(t){return i.add(t)}))}})),g.postStyleProps.forEach((function(t,e){var n=Object.keys(t),i=c.get(e);i||c.set(e,i=new Set),n.forEach((function(t){return i.add(t)}))}))}}));if(x.length){var L=[];x.forEach((function(t){L.push("@".concat(t.triggerName," has failed due to:\n")),t.errors.forEach((function(t){return L.push("- ".concat(t,"\n"))}))})),C.forEach((function(t){return t.destroy()})),this.reportError(L)}var T=new Map,E=new Map;o.forEach((function(t){var e=t.element;i.has(e)&&(E.set(e,e),n._beforeAnimationBuild(t.player.namespaceId,t.instruction,T))})),r.forEach((function(t){var e=t.element;n._getPreviousPlayers(e,!1,t.namespaceId,t.triggerName,null).forEach((function(t){G_(T,e,[]).push(t),t.destroy()}))}));var O=v.filter((function(t){return Rb(t,u,c)})),A=new Map;Eb(A,this.driver,y,c,x_).forEach((function(t){Rb(t,u,c)&&O.push(t)}));var P=new Map;p.forEach((function(t,e){Eb(P,n.driver,new Set(t),u,j_)})),O.forEach((function(t){var e=A.get(t),n=P.get(t);A.set(t,Object.assign(Object.assign({},e),n))}));var I=[],Y=[],R={};o.forEach((function(t){var e=t.element,o=t.player,s=t.instruction;if(i.has(e)){if(d.has(e))return o.onDestroy((function(){return wy(e,s.toStyles)})),o.disabled=!0,o.overrideTotalTime(s.totalTime),void r.push(o);var u=R;if(E.size>1){for(var l=e,c=[];l=l.parentNode;){var h=E.get(l);if(h){u=h;break}c.push(l)}c.forEach((function(t){return E.set(t,u)}))}var f=n._buildAnimation(o.namespaceId,s,T,a,P,A);if(o.setRealPlayer(f),u===R)I.push(o);else{var p=n.playersByElement.get(u);p&&p.length&&(o.parentPlayer=W_(p)),r.push(o)}}else ky(e,s.fromStyles),o.onDestroy((function(){return wy(e,s.toStyles)})),Y.push(o),d.has(e)&&r.push(o)})),Y.forEach((function(t){var e=a.get(t.element);if(e&&e.length){var n=W_(e);t.setRealPlayer(n)}})),r.forEach((function(t){t.parentPlayer?t.syncPlayerEvents(t.parentPlayer):t.destroy()}));for(var F=0;F0?this.driver.animate(t.element,e,t.duration,t.delay,t.easing,n):new H_(t.duration,t.delay)}},{key:"queuedPlayers",get:function(){var t=[];return this._namespaceList.forEach((function(e){e.players.forEach((function(e){e.queued&&t.push(e)}))})),t}}]),t}(),xb=function(){function t(e,n,i){_(this,t),this.namespaceId=e,this.triggerName=n,this.element=i,this._player=new H_,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1,this.disabled=!1,this.queued=!0,this.totalTime=0}return b(t,[{key:"setRealPlayer",value:function(t){var e=this;this._containsRealPlayer||(this._player=t,Object.keys(this._queuedCallbacks).forEach((function(n){e._queuedCallbacks[n].forEach((function(e){return z_(t,n,void 0,e)}))})),this._queuedCallbacks={},this._containsRealPlayer=!0,this.overrideTotalTime(t.totalTime),this.queued=!1)}},{key:"getRealPlayer",value:function(){return this._player}},{key:"overrideTotalTime",value:function(t){this.totalTime=t}},{key:"syncPlayerEvents",value:function(t){var e=this,n=this._player;n.triggerCallback&&t.onStart((function(){return n.triggerCallback("start")})),t.onDone((function(){return e.finish()})),t.onDestroy((function(){return e.destroy()}))}},{key:"_queueEvent",value:function(t,e){G_(this._queuedCallbacks,t,[]).push(e)}},{key:"onDone",value:function(t){this.queued&&this._queueEvent("done",t),this._player.onDone(t)}},{key:"onStart",value:function(t){this.queued&&this._queueEvent("start",t),this._player.onStart(t)}},{key:"onDestroy",value:function(t){this.queued&&this._queueEvent("destroy",t),this._player.onDestroy(t)}},{key:"init",value:function(){this._player.init()}},{key:"hasStarted",value:function(){return!this.queued&&this._player.hasStarted()}},{key:"play",value:function(){!this.queued&&this._player.play()}},{key:"pause",value:function(){!this.queued&&this._player.pause()}},{key:"restart",value:function(){!this.queued&&this._player.restart()}},{key:"finish",value:function(){this._player.finish()}},{key:"destroy",value:function(){this.destroyed=!0,this._player.destroy()}},{key:"reset",value:function(){!this.queued&&this._player.reset()}},{key:"setPosition",value:function(t){this.queued||this._player.setPosition(t)}},{key:"getPosition",value:function(){return this.queued?0:this._player.getPosition()}},{key:"triggerCallback",value:function(t){var e=this._player;e.triggerCallback&&e.triggerCallback(t)}}]),t}();function Db(t){return null!=t?t:null}function Lb(t){return t&&1===t.nodeType}function Tb(t,e){var n=t.style.display;return t.style.display=null!=e?e:"none",n}function Eb(t,e,n,i,r){var a=[];n.forEach((function(t){return a.push(Tb(t))}));var o=[];i.forEach((function(n,i){var a={};n.forEach((function(t){var n=a[t]=e.computeStyle(i,t,r);n&&0!=n.length||(i.__ng_removed=bb,o.push(i))})),t.set(i,a)}));var s=0;return n.forEach((function(t){return Tb(t,a[s++])})),o}function Ob(t,e){var n=new Map;if(t.forEach((function(t){return n.set(t,[])})),0==e.length)return n;var i=new Set(e),r=new Map;return e.forEach((function(t){var e=function t(e){if(!e)return 1;var a=r.get(e);if(a)return a;var o=e.parentNode;return a=n.has(o)?o:i.has(o)?1:t(o),r.set(e,a),a}(t);1!==e&&n.get(e).push(t)})),n}function Ab(t,e){if(t.classList)t.classList.add(e);else{var n=t.$$classes;n||(n=t.$$classes={}),n[e]=!0}}function Pb(t,e){if(t.classList)t.classList.remove(e);else{var n=t.$$classes;n&&delete n[e]}}function Ib(t,e,n){W_(n).onDone((function(){return t.processLeaveNode(e)}))}function Yb(t,e){var n=Object.keys(t),i=Object.keys(e);if(n.length!=i.length)return!1;for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:-1;this._transitionEngine.flush(t)}},{key:"whenRenderingDone",value:function(){return this._transitionEngine.whenRenderingDone()}},{key:"players",get:function(){return this._transitionEngine.players.concat(this._timelineEngine.players)}}]),t}();function Hb(t,e){var n=null,i=null;return Array.isArray(e)&&e.length?(n=jb(e[0]),e.length>1&&(i=jb(e[e.length-1]))):e&&(n=jb(e)),n||i?new Bb(t,n,i):null}var Bb=function(){var t=function(){function t(e,n,i){_(this,t),this._element=e,this._startStyles=n,this._endStyles=i,this._state=0;var r=t.initialStylesByElement.get(e);r||t.initialStylesByElement.set(e,r={}),this._initialStyles=r}return b(t,[{key:"start",value:function(){this._state<1&&(this._startStyles&&wy(this._element,this._startStyles,this._initialStyles),this._state=1)}},{key:"finish",value:function(){this.start(),this._state<2&&(wy(this._element,this._initialStyles),this._endStyles&&(wy(this._element,this._endStyles),this._endStyles=null),this._state=1)}},{key:"destroy",value:function(){this.finish(),this._state<3&&(t.initialStylesByElement.delete(this._element),this._startStyles&&(ky(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(ky(this._element,this._endStyles),this._endStyles=null),wy(this._element,this._initialStyles),this._state=3)}}]),t}();return t.initialStylesByElement=new WeakMap,t}();function jb(t){for(var e=null,n=Object.keys(t),i=0;i=this._delay&&n>=this._duration&&this.finish()}},{key:"finish",value:function(){this._finished||(this._finished=!0,this._onDoneFn(),Kb(this._element,this._eventFn,!0))}},{key:"destroy",value:function(){var t,e,n,i;this._destroyed||(this._destroyed=!0,this.finish(),e=this._name,(i=Gb(n=Jb(t=this._element,"").split(","),e))>=0&&(n.splice(i,1),Zb(t,"",n.join(","))))}}]),t}();function Ub(t,e,n){Zb(t,"PlayState",n,qb(t,e))}function qb(t,e){var n=Jb(t,"");return n.indexOf(",")>0?Gb(n.split(","),e):Gb([n],e)}function Gb(t,e){for(var n=0;n=0)return n;return-1}function Kb(t,e,n){n?t.removeEventListener(Vb,e):t.addEventListener(Vb,e)}function Zb(t,e,n,i){var r=Wb+e;if(null!=i){var a=t.style[r];if(a.length){var o=a.split(",");o[i]=n,n=o.join(",")}}t.style[r]=n}function Jb(t,e){return t.style[Wb+e]}var Qb=function(){function t(e,n,i,r,a,o,s,u){_(this,t),this.element=e,this.keyframes=n,this.animationName=i,this._duration=r,this._delay=a,this._finalStyles=s,this._specialStyles=u,this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this.currentSnapshot={},this._state=0,this.easing=o||"linear",this.totalTime=r+a,this._buildStyler()}return b(t,[{key:"onStart",value:function(t){this._onStartFns.push(t)}},{key:"onDone",value:function(t){this._onDoneFns.push(t)}},{key:"onDestroy",value:function(t){this._onDestroyFns.push(t)}},{key:"destroy",value:function(){this.init(),this._state>=4||(this._state=4,this._styler.destroy(),this._flushStartFns(),this._flushDoneFns(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach((function(t){return t()})),this._onDestroyFns=[])}},{key:"_flushDoneFns",value:function(){this._onDoneFns.forEach((function(t){return t()})),this._onDoneFns=[]}},{key:"_flushStartFns",value:function(){this._onStartFns.forEach((function(t){return t()})),this._onStartFns=[]}},{key:"finish",value:function(){this.init(),this._state>=3||(this._state=3,this._styler.finish(),this._flushStartFns(),this._specialStyles&&this._specialStyles.finish(),this._flushDoneFns())}},{key:"setPosition",value:function(t){this._styler.setPosition(t)}},{key:"getPosition",value:function(){return this._styler.getPosition()}},{key:"hasStarted",value:function(){return this._state>=2}},{key:"init",value:function(){this._state>=1||(this._state=1,this._styler.apply(),this._delay&&this._styler.pause())}},{key:"play",value:function(){this.init(),this.hasStarted()||(this._flushStartFns(),this._state=2,this._specialStyles&&this._specialStyles.start()),this._styler.resume()}},{key:"pause",value:function(){this.init(),this._styler.pause()}},{key:"restart",value:function(){this.reset(),this.play()}},{key:"reset",value:function(){this._styler.destroy(),this._buildStyler(),this._styler.apply()}},{key:"_buildStyler",value:function(){var t=this;this._styler=new zb(this.element,this.animationName,this._duration,this._delay,this.easing,"forwards",(function(){return t.finish()}))}},{key:"triggerCallback",value:function(t){var e="start"==t?this._onStartFns:this._onDoneFns;e.forEach((function(t){return t()})),e.length=0}},{key:"beforeDestroy",value:function(){var t=this;this.init();var e={};if(this.hasStarted()){var n=this._state>=3;Object.keys(this._finalStyles).forEach((function(i){"offset"!=i&&(e[i]=n?t._finalStyles[i]:Py(t.element,i))}))}this.currentSnapshot=e}}]),t}(),Xb=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this)).element=t,r._startingStyles={},r.__initialized=!1,r._styles=ay(i),r}return b(n,[{key:"init",value:function(){var t=this;!this.__initialized&&this._startingStyles&&(this.__initialized=!0,Object.keys(this._styles).forEach((function(e){t._startingStyles[e]=t.element.style[e]})),r(i(n.prototype),"init",this).call(this))}},{key:"play",value:function(){var t=this;this._startingStyles&&(this.init(),Object.keys(this._styles).forEach((function(e){return t.element.style.setProperty(e,t._styles[e])})),r(i(n.prototype),"play",this).call(this))}},{key:"destroy",value:function(){var t=this;this._startingStyles&&(Object.keys(this._startingStyles).forEach((function(e){var n=t._startingStyles[e];n?t.element.style.setProperty(e,n):t.element.style.removeProperty(e)})),this._startingStyles=null,r(i(n.prototype),"destroy",this).call(this))}}]),n}(H_),$b="gen_css_kf_",tw=function(){function t(){_(this,t),this._count=0,this._head=document.querySelector("head"),this._warningIssued=!1}return b(t,[{key:"validateStyleProperty",value:function(t){return ey(t)}},{key:"matchesElement",value:function(t,e){return ny(t,e)}},{key:"containsElement",value:function(t,e){return iy(t,e)}},{key:"query",value:function(t,e,n){return ry(t,e,n)}},{key:"computeStyle",value:function(t,e,n){return window.getComputedStyle(t)[e]}},{key:"buildKeyframeElement",value:function(t,e,n){n=n.map((function(t){return ay(t)}));var i="@keyframes ".concat(e," {\n"),r="";n.forEach((function(t){r=" ";var e=parseFloat(t.offset);i+="".concat(r).concat(100*e,"% {\n"),r+=" ",Object.keys(t).forEach((function(e){var n=t[e];switch(e){case"offset":return;case"easing":return void(n&&(i+="".concat(r,"animation-timing-function: ").concat(n,";\n")));default:return void(i+="".concat(r).concat(e,": ").concat(n,";\n"))}})),i+="".concat(r,"}\n")})),i+="}\n";var a=document.createElement("style");return a.textContent=i,a}},{key:"animate",value:function(t,e,n,i,r){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:[],o=arguments.length>6?arguments[6]:void 0;o&&this._notifyFaultyScrubber();var s=a.filter((function(t){return t instanceof Qb})),u={};Ey(n,i)&&s.forEach((function(t){var e=t.currentSnapshot;Object.keys(e).forEach((function(t){return u[t]=e[t]}))}));var l=ew(e=Oy(t,e,u));if(0==n)return new Xb(t,l);var c="".concat($b).concat(this._count++),d=this.buildKeyframeElement(t,c,e);document.querySelector("head").appendChild(d);var h=Hb(t,e),f=new Qb(t,e,c,n,i,r,l,h);return f.onDestroy((function(){return nw(d)})),f}},{key:"_notifyFaultyScrubber",value:function(){this._warningIssued||(console.warn("@angular/animations: please load the web-animations.js polyfill to allow programmatic access...\n"," visit http://bit.ly/IWukam to learn more about using the web-animation-js polyfill."),this._warningIssued=!0)}}]),t}();function ew(t){var e={};return t&&(Array.isArray(t)?t:[t]).forEach((function(t){Object.keys(t).forEach((function(n){"offset"!=n&&"easing"!=n&&(e[n]=t[n])}))})),e}function nw(t){t.parentNode.removeChild(t)}var iw=function(){function t(e,n,i,r){_(this,t),this.element=e,this.keyframes=n,this.options=i,this._specialStyles=r,this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._initialized=!1,this._finished=!1,this._started=!1,this._destroyed=!1,this.time=0,this.parentPlayer=null,this.currentSnapshot={},this._duration=i.duration,this._delay=i.delay||0,this.time=this._duration+this._delay}return b(t,[{key:"_onFinish",value:function(){this._finished||(this._finished=!0,this._onDoneFns.forEach((function(t){return t()})),this._onDoneFns=[])}},{key:"init",value:function(){this._buildPlayer(),this._preparePlayerBeforeStart()}},{key:"_buildPlayer",value:function(){var t=this;if(!this._initialized){this._initialized=!0;var e=this.keyframes;this.domPlayer=this._triggerWebAnimation(this.element,e,this.options),this._finalKeyframe=e.length?e[e.length-1]:{},this.domPlayer.addEventListener("finish",(function(){return t._onFinish()}))}}},{key:"_preparePlayerBeforeStart",value:function(){this._delay?this._resetDomPlayerState():this.domPlayer.pause()}},{key:"_triggerWebAnimation",value:function(t,e,n){return t.animate(e,n)}},{key:"onStart",value:function(t){this._onStartFns.push(t)}},{key:"onDone",value:function(t){this._onDoneFns.push(t)}},{key:"onDestroy",value:function(t){this._onDestroyFns.push(t)}},{key:"play",value:function(){this._buildPlayer(),this.hasStarted()||(this._onStartFns.forEach((function(t){return t()})),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),this.domPlayer.play()}},{key:"pause",value:function(){this.init(),this.domPlayer.pause()}},{key:"finish",value:function(){this.init(),this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish()}},{key:"reset",value:function(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1}},{key:"_resetDomPlayerState",value:function(){this.domPlayer&&this.domPlayer.cancel()}},{key:"restart",value:function(){this.reset(),this.play()}},{key:"hasStarted",value:function(){return this._started}},{key:"destroy",value:function(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach((function(t){return t()})),this._onDestroyFns=[])}},{key:"setPosition",value:function(t){this.domPlayer.currentTime=t*this.time}},{key:"getPosition",value:function(){return this.domPlayer.currentTime/this.time}},{key:"beforeDestroy",value:function(){var t=this,e={};this.hasStarted()&&Object.keys(this._finalKeyframe).forEach((function(n){"offset"!=n&&(e[n]=t._finished?t._finalKeyframe[n]:Py(t.element,n))})),this.currentSnapshot=e}},{key:"triggerCallback",value:function(t){var e="start"==t?this._onStartFns:this._onDoneFns;e.forEach((function(t){return t()})),e.length=0}},{key:"totalTime",get:function(){return this._delay+this._duration}}]),t}(),rw=function(){function t(){_(this,t),this._isNativeImpl=/\{\s*\[native\s+code\]\s*\}/.test(aw().toString()),this._cssKeyframesDriver=new tw}return b(t,[{key:"validateStyleProperty",value:function(t){return ey(t)}},{key:"matchesElement",value:function(t,e){return ny(t,e)}},{key:"containsElement",value:function(t,e){return iy(t,e)}},{key:"query",value:function(t,e,n){return ry(t,e,n)}},{key:"computeStyle",value:function(t,e,n){return window.getComputedStyle(t)[e]}},{key:"overrideWebAnimationsSupport",value:function(t){this._isNativeImpl=t}},{key:"animate",value:function(t,e,n,i,r){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:[],o=arguments.length>6?arguments[6]:void 0,s=!o&&!this._isNativeImpl;if(s)return this._cssKeyframesDriver.animate(t,e,n,i,r,a);var u=0==i?"both":"forwards",l={duration:n,delay:i,fill:u};r&&(l.easing=r);var c={},d=a.filter((function(t){return t instanceof iw}));Ey(n,i)&&d.forEach((function(t){var e=t.currentSnapshot;Object.keys(e).forEach((function(t){return c[t]=e[t]}))}));var h=Hb(t,e=Oy(t,e=e.map((function(t){return _y(t,!1)})),c));return new iw(t,e,l,h)}}]),t}();function aw(){return"undefined"!=typeof window&&void 0!==window.document&&Element.prototype.animate||{}}var ow=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this))._nextAnimationId=0,r._renderer=t.createRenderer(i.body,{id:"0",encapsulation:Pe.None,styles:[],data:{animation:[]}}),r}return b(n,[{key:"build",value:function(t){var e=this._nextAnimationId.toString();this._nextAnimationId++;var n=Array.isArray(t)?E_(t):t;return lw(this._renderer,null,e,"register",[n]),new sw(e,this._renderer)}}]),n}(S_);return t.\u0275fac=function(e){return new(e||t)(ve(ju),ve(ud))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),sw=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this))._id=t,r._renderer=i,r}return b(n,[{key:"create",value:function(t,e){return new uw(this._id,t,e||{},this._renderer)}}]),n}(C_),uw=function(){function t(e,n,i,r){_(this,t),this.id=e,this.element=n,this._renderer=r,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",i)}return b(t,[{key:"_listen",value:function(t,e){return this._renderer.listen(this.element,"@@".concat(this.id,":").concat(t),e)}},{key:"_command",value:function(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),i=1;i=0&&t1&&void 0!==arguments[1]?arguments[1]:0,n=function(t){f(i,t);var n=v(i);function i(){var t;_(this,i);for(var r=arguments.length,a=new Array(r),o=0;o2&&void 0!==arguments[2]?arguments[2]:"mat";t.changes.pipe(rg(t)).subscribe((function(t){var i=t.length;Yw(e,"".concat(n,"-2-line"),!1),Yw(e,"".concat(n,"-3-line"),!1),Yw(e,"".concat(n,"-multi-line"),!1),2===i||3===i?Yw(e,"".concat(n,"-").concat(i,"-line"),!0):i>3&&Yw(e,"".concat(n,"-multi-line"),!0)}))}function Yw(t,e,n){var i=t.nativeElement.classList;n?i.add(e):i.remove(e)}var Rw=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[xw],xw]}),t}(),Fw=function(){function t(e,n,i){_(this,t),this._renderer=e,this.element=n,this.config=i,this.state=3}return b(t,[{key:"fadeOut",value:function(){this._renderer.fadeOutRipple(this)}}]),t}(),Hw={enterDuration:450,exitDuration:400},Bw=Sg({passive:!0}),jw=["mousedown","touchstart"],Nw=["mouseup","mouseleave","touchend","touchcancel"],Ww=function(){function t(e,n,i,r){_(this,t),this._target=e,this._ngZone=n,this._isPointerDown=!1,this._activeRipples=new Set,this._pointerUpEventsRegistered=!1,r.isBrowser&&(this._containerElement=Ym(i))}return b(t,[{key:"fadeInRipple",value:function(t,e){var n=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=this._containerRect=this._containerRect||this._containerElement.getBoundingClientRect(),a=Object.assign(Object.assign({},Hw),i.animation);i.centered&&(t=r.left+r.width/2,e=r.top+r.height/2);var o=i.radius||zw(t,e,r),s=t-r.left,u=e-r.top,l=a.enterDuration,c=document.createElement("div");c.classList.add("mat-ripple-element"),c.style.left="".concat(s-o,"px"),c.style.top="".concat(u-o,"px"),c.style.height="".concat(2*o,"px"),c.style.width="".concat(2*o,"px"),null!=i.color&&(c.style.backgroundColor=i.color),c.style.transitionDuration="".concat(l,"ms"),this._containerElement.appendChild(c),Vw(c),c.style.transform="scale(1)";var d=new Fw(this,c,i);return d.state=0,this._activeRipples.add(d),i.persistent||(this._mostRecentTransientRipple=d),this._runTimeoutOutsideZone((function(){var t=d===n._mostRecentTransientRipple;d.state=1,i.persistent||t&&n._isPointerDown||d.fadeOut()}),l),d}},{key:"fadeOutRipple",value:function(t){var e=this._activeRipples.delete(t);if(t===this._mostRecentTransientRipple&&(this._mostRecentTransientRipple=null),this._activeRipples.size||(this._containerRect=null),e){var n=t.element,i=Object.assign(Object.assign({},Hw),t.config.animation);n.style.transitionDuration="".concat(i.exitDuration,"ms"),n.style.opacity="0",t.state=2,this._runTimeoutOutsideZone((function(){t.state=3,n.parentNode.removeChild(n)}),i.exitDuration)}}},{key:"fadeOutAll",value:function(){this._activeRipples.forEach((function(t){return t.fadeOut()}))}},{key:"setupTriggerEvents",value:function(t){var e=Ym(t);e&&e!==this._triggerElement&&(this._removeTriggerEvents(),this._triggerElement=e,this._registerEvents(jw))}},{key:"handleEvent",value:function(t){"mousedown"===t.type?this._onMousedown(t):"touchstart"===t.type?this._onTouchStart(t):this._onPointerUp(),this._pointerUpEventsRegistered||(this._registerEvents(Nw),this._pointerUpEventsRegistered=!0)}},{key:"_onMousedown",value:function(t){var e=h_(t),n=this._lastTouchStartEvent&&Date.now()1&&void 0!==arguments[1]?arguments[1]:0;this._ngZone.runOutsideAngular((function(){return setTimeout(t,e)}))}},{key:"_registerEvents",value:function(t){var e=this;this._ngZone.runOutsideAngular((function(){t.forEach((function(t){e._triggerElement.addEventListener(t,e,Bw)}))}))}},{key:"_removeTriggerEvents",value:function(){var t=this;this._triggerElement&&(jw.forEach((function(e){t._triggerElement.removeEventListener(e,t,Bw)})),this._pointerUpEventsRegistered&&Nw.forEach((function(e){t._triggerElement.removeEventListener(e,t,Bw)})))}}]),t}();function Vw(t){window.getComputedStyle(t).getPropertyValue("opacity")}function zw(t,e,n){var i=Math.max(Math.abs(t-n.left),Math.abs(t-n.right)),r=Math.max(Math.abs(e-n.top),Math.abs(e-n.bottom));return Math.sqrt(i*i+r*r)}var Uw=new se("mat-ripple-global-options"),qw=function(){var t=function(){function t(e,n,i,r,a){_(this,t),this._elementRef=e,this._animationMode=a,this.radius=0,this._disabled=!1,this._isInitialized=!1,this._globalOptions=r||{},this._rippleRenderer=new Ww(this,n,e,i)}return b(t,[{key:"ngOnInit",value:function(){this._isInitialized=!0,this._setupTriggerEventsIfEnabled()}},{key:"ngOnDestroy",value:function(){this._rippleRenderer._removeTriggerEvents()}},{key:"fadeOutAll",value:function(){this._rippleRenderer.fadeOutAll()}},{key:"_setupTriggerEventsIfEnabled",value:function(){!this.disabled&&this._isInitialized&&this._rippleRenderer.setupTriggerEvents(this.trigger)}},{key:"launch",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0;return"number"==typeof t?this._rippleRenderer.fadeInRipple(t,e,Object.assign(Object.assign({},this.rippleConfig),n)):this._rippleRenderer.fadeInRipple(0,0,Object.assign(Object.assign({},this.rippleConfig),t))}},{key:"disabled",get:function(){return this._disabled},set:function(t){this._disabled=t,this._setupTriggerEventsIfEnabled()}},{key:"trigger",get:function(){return this._trigger||this._elementRef.nativeElement},set:function(t){this._trigger=t,this._setupTriggerEventsIfEnabled()}},{key:"rippleConfig",get:function(){return{centered:this.centered,radius:this.radius,color:this.color,animation:Object.assign(Object.assign(Object.assign({},this._globalOptions.animation),"NoopAnimations"===this._animationMode?{enterDuration:0,exitDuration:0}:{}),this.animation),terminateOnPointerUp:this._globalOptions.terminateOnPointerUp}}},{key:"rippleDisabled",get:function(){return this.disabled||!!this._globalOptions.disabled}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Dc),gs(bg),gs(Uw,8),gs(gw,8))},t.\u0275dir=ze({type:t,selectors:[["","mat-ripple",""],["","matRipple",""]],hostAttrs:[1,"mat-ripple"],hostVars:2,hostBindings:function(t,e){2&t&&Js("mat-ripple-unbounded",e.unbounded)},inputs:{radius:["matRippleRadius","radius"],disabled:["matRippleDisabled","disabled"],trigger:["matRippleTrigger","trigger"],color:["matRippleColor","color"],unbounded:["matRippleUnbounded","unbounded"],centered:["matRippleCentered","centered"],animation:["matRippleAnimation","animation"]},exportAs:["matRipple"]}),t}(),Gw=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[xw,wg],xw]}),t}(),Kw=function(){var t=function t(e){_(this,t),this._animationMode=e,this.state="unchecked",this.disabled=!1};return t.\u0275fac=function(e){return new(e||t)(gs(gw,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-pseudo-checkbox"]],hostAttrs:[1,"mat-pseudo-checkbox"],hostVars:8,hostBindings:function(t,e){2&t&&Js("mat-pseudo-checkbox-indeterminate","indeterminate"===e.state)("mat-pseudo-checkbox-checked","checked"===e.state)("mat-pseudo-checkbox-disabled",e.disabled)("_mat-animation-noopable","NoopAnimations"===e._animationMode)},inputs:{state:"state",disabled:"disabled"},decls:0,vars:0,template:function(t,e){},styles:['.mat-pseudo-checkbox{width:16px;height:16px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border-color:transparent}._mat-animation-noopable.mat-pseudo-checkbox{transition:none;animation:none}._mat-animation-noopable.mat-pseudo-checkbox::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:5px;left:1px;width:10px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{top:2.4px;left:1px;width:8px;height:3px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}\n'],encapsulation:2,changeDetection:0}),t}(),Zw=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)}}),t}(),Jw=Dw((function t(){_(this,t)})),Qw=0,Xw=function(){var t=function(t){f(n,t);var e=v(n);function n(){var t;return _(this,n),(t=e.apply(this,arguments))._labelId="mat-optgroup-label-".concat(Qw++),t}return n}(Jw);return t.\u0275fac=function(e){return $w(e||t)},t.\u0275dir=ze({type:t,inputs:{label:"label"},features:[Jo]}),t}(),$w=Ki(Xw),tk=new se("MatOptgroup"),ek=function(){var t=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return n}(Xw);return t.\u0275fac=function(e){return nk(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["mat-optgroup"]],hostAttrs:["role","group",1,"mat-optgroup"],hostVars:4,hostBindings:function(t,e){2&t&&(ds("aria-disabled",e.disabled.toString())("aria-labelledby",e._labelId),Js("mat-optgroup-disabled",e.disabled))},inputs:{disabled:"disabled"},exportAs:["matOptgroup"],features:[Pu([{provide:tk,useExisting:t}]),Jo],ngContentSelectors:ww,decls:6,vars:2,consts:[[1,"mat-optgroup-label",3,"id"]],template:function(t,e){1&t&&(Fs(bw),bs(0,"label",0),uu(1),Hs(2),ws(),uu(3,"\n"),Hs(4,1),uu(5,"\n")),2&t&&(_s("id",e._labelId),na(1),cu("",e.label," "))},styles:[".mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px;vertical-align:middle}.mat-optgroup-label .mat-icon svg{vertical-align:top}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}\n"],encapsulation:2,changeDetection:0}),t}(),nk=Ki(ek),ik=0,rk=function t(e){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];_(this,t),this.source=e,this.isUserInput=n},ak=new se("MAT_OPTION_PARENT_COMPONENT"),ok=function(){var t=function(){function t(e,n,i,r){_(this,t),this._element=e,this._changeDetectorRef=n,this._parent=i,this.group=r,this._selected=!1,this._active=!1,this._disabled=!1,this._mostRecentViewValue="",this.id="mat-option-".concat(ik++),this.onSelectionChange=new Rl,this._stateChanges=new z}return b(t,[{key:"select",value:function(){this._selected||(this._selected=!0,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent())}},{key:"deselect",value:function(){this._selected&&(this._selected=!1,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent())}},{key:"focus",value:function(t,e){var n=this._getHostElement();"function"==typeof n.focus&&n.focus(e)}},{key:"setActiveStyles",value:function(){this._active||(this._active=!0,this._changeDetectorRef.markForCheck())}},{key:"setInactiveStyles",value:function(){this._active&&(this._active=!1,this._changeDetectorRef.markForCheck())}},{key:"getLabel",value:function(){return this.viewValue}},{key:"_handleKeydown",value:function(t){t.keyCode!==Qg&&t.keyCode!==$g||nv(t)||(this._selectViaInteraction(),t.preventDefault())}},{key:"_selectViaInteraction",value:function(){this.disabled||(this._selected=!this.multiple||!this._selected,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent(!0))}},{key:"_getAriaSelected",value:function(){return this.selected||!this.multiple&&null}},{key:"_getTabIndex",value:function(){return this.disabled?"-1":"0"}},{key:"_getHostElement",value:function(){return this._element.nativeElement}},{key:"ngAfterViewChecked",value:function(){if(this._selected){var t=this.viewValue;t!==this._mostRecentViewValue&&(this._mostRecentViewValue=t,this._stateChanges.next())}}},{key:"ngOnDestroy",value:function(){this._stateChanges.complete()}},{key:"_emitSelectionChangeEvent",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.onSelectionChange.emit(new rk(this,t))}},{key:"multiple",get:function(){return this._parent&&this._parent.multiple}},{key:"selected",get:function(){return this._selected}},{key:"disabled",get:function(){return this.group&&this.group.disabled||this._disabled},set:function(t){this._disabled=Em(t)}},{key:"disableRipple",get:function(){return this._parent&&this._parent.disableRipple}},{key:"active",get:function(){return this._active}},{key:"viewValue",get:function(){return(this._getHostElement().textContent||"").trim()}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Lo),gs(void 0),gs(Xw))},t.\u0275dir=ze({type:t,inputs:{id:"id",disabled:"disabled",value:"value"},outputs:{onSelectionChange:"onSelectionChange"}}),t}(),sk=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a){return _(this,n),e.call(this,t,i,r,a)}return n}(ok);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Lo),gs(ak,8),gs(tk,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-option"]],hostAttrs:["role","option",1,"mat-option","mat-focus-indicator"],hostVars:12,hostBindings:function(t,e){1&t&&Ts("click",(function(){return e._selectViaInteraction()}))("keydown",(function(t){return e._handleKeydown(t)})),2&t&&(mu("id",e.id),ds("tabindex",e._getTabIndex())("aria-selected",e._getAriaSelected())("aria-disabled",e.disabled.toString()),Js("mat-selected",e.selected)("mat-option-multiple",e.multiple)("mat-active",e.active)("mat-option-disabled",e.disabled))},exportAs:["matOption"],features:[Jo],ngContentSelectors:Mw,decls:8,vars:3,consts:[["class","mat-option-pseudo-checkbox",3,"state","disabled",4,"ngIf"],[1,"mat-option-text"],["mat-ripple","",1,"mat-option-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mat-option-pseudo-checkbox",3,"state","disabled"]],template:function(t,e){1&t&&(Fs(),ps(0,kw,1,2,"mat-pseudo-checkbox",0),uu(1,"\n\n"),bs(2,"span",1),Hs(3),ws(),uu(4,"\n\n"),bs(5,"div",2),uu(6,"\n"),ws(),uu(7,"\n")),2&t&&(_s("ngIf",e.multiple),na(5),_s("matRippleTrigger",e._getHostElement())("matRippleDisabled",e.disabled||e.disableRipple))},directives:[Eh,qw,Kw],styles:[".mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;position:relative;cursor:pointer;outline:none;display:flex;flex-direction:row;max-width:100%;box-sizing:border-box;align-items:center;-webkit-tap-highlight-color:transparent}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px;vertical-align:middle}.mat-option .mat-icon svg{vertical-align:top}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.cdk-high-contrast-active .mat-option{margin:0 1px}.cdk-high-contrast-active .mat-option.mat-active{border:solid 1px currentColor;margin:0}.mat-option-text{display:inline-block;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option .mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.cdk-high-contrast-active .mat-option .mat-option-ripple{opacity:.5}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}\n"],encapsulation:2,changeDetection:0}),t}();function uk(t,e,n){if(n.length){for(var i=e.toArray(),r=n.toArray(),a=0,o=0;on+i?Math.max(0,t-i+e):n}var ck=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[Gw,df,Zw]]}),t}(),dk=new se("mat-label-global-options");function hk(t){return new B((function(e){var n;try{n=t()}catch(i){return void e.error(i)}return(n?ot(n):ip()).subscribe(e)}))}function fk(t,e){}var pk=function t(){_(this,t),this.role="dialog",this.panelClass="",this.hasBackdrop=!0,this.backdropClass="",this.disableClose=!1,this.width="",this.height="",this.maxWidth="80vw",this.data=null,this.ariaDescribedBy=null,this.ariaLabelledBy=null,this.ariaLabel=null,this.autoFocus=!0,this.restoreFocus=!0,this.closeOnNavigation=!0},mk={dialogContainer:D_("dialogContainer",[A_("void, exit",O_({opacity:0,transform:"scale(0.7)"})),A_("enter",O_({transform:"none"})),I_("* => enter",L_("150ms cubic-bezier(0, 0, 0.2, 1)",O_({transform:"none",opacity:1}))),I_("* => void, * => exit",L_("75ms cubic-bezier(0.4, 0.0, 0.2, 1)",O_({opacity:0})))])},gk=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s){var u;return _(this,n),(u=e.call(this))._elementRef=t,u._focusTrapFactory=i,u._changeDetectorRef=r,u._config=o,u._focusMonitor=s,u._animationStateChanged=new Rl,u._elementFocusedBeforeDialogWasOpened=null,u._closeInteractionType=null,u.attachDomPortal=function(t){return u._portalOutlet.hasAttached(),u._portalOutlet.attachDomPortal(t)},u._ariaLabelledBy=o.ariaLabelledBy||null,u._document=a,u}return b(n,[{key:"_initializeWithAttachedContent",value:function(){this._setupFocusTrap(),this._capturePreviouslyFocusedElement(),this._focusDialogContainer()}},{key:"attachComponentPortal",value:function(t){return this._portalOutlet.hasAttached(),this._portalOutlet.attachComponentPortal(t)}},{key:"attachTemplatePortal",value:function(t){return this._portalOutlet.hasAttached(),this._portalOutlet.attachTemplatePortal(t)}},{key:"_recaptureFocus",value:function(){this._containsFocus()||(!this._config.autoFocus||!this._focusTrap.focusInitialElement())&&this._elementRef.nativeElement.focus()}},{key:"_trapFocus",value:function(){this._config.autoFocus?this._focusTrap.focusInitialElementWhenReady():this._containsFocus()||this._elementRef.nativeElement.focus()}},{key:"_restoreFocus",value:function(){var t=this._elementFocusedBeforeDialogWasOpened;if(this._config.restoreFocus&&t&&"function"==typeof t.focus){var e=this._document.activeElement,n=this._elementRef.nativeElement;e&&e!==this._document.body&&e!==n&&!n.contains(e)||(this._focusMonitor?(this._focusMonitor.focusVia(t,this._closeInteractionType),this._closeInteractionType=null):t.focus())}this._focusTrap&&this._focusTrap.destroy()}},{key:"_setupFocusTrap",value:function(){this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement)}},{key:"_capturePreviouslyFocusedElement",value:function(){this._document&&(this._elementFocusedBeforeDialogWasOpened=this._document.activeElement)}},{key:"_focusDialogContainer",value:function(){this._elementRef.nativeElement.focus&&this._elementRef.nativeElement.focus()}},{key:"_containsFocus",value:function(){var t=this._elementRef.nativeElement,e=this._document.activeElement;return t===e||t.contains(e)}}]),n}(Wg);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(u_),gs(Lo),gs(ud,8),gs(pk),gs(m_))},t.\u0275dir=ze({type:t,viewQuery:function(t,e){var n;1&t&&Kl(Ug,!0),2&t&&Gl(n=tc())&&(e._portalOutlet=n.first)},features:[Jo]}),t}(),vk=function(){var t=function(t){f(n,t);var e=v(n);function n(){var t;return _(this,n),(t=e.apply(this,arguments))._state="enter",t}return b(n,[{key:"_onAnimationDone",value:function(t){var e=t.toState,n=t.totalTime;"enter"===e?(this._trapFocus(),this._animationStateChanged.next({state:"opened",totalTime:n})):"exit"===e&&(this._restoreFocus(),this._animationStateChanged.next({state:"closed",totalTime:n}))}},{key:"_onAnimationStart",value:function(t){var e=t.toState,n=t.totalTime;"enter"===e?this._animationStateChanged.next({state:"opening",totalTime:n}):"exit"!==e&&"void"!==e||this._animationStateChanged.next({state:"closing",totalTime:n})}},{key:"_startExitAnimation",value:function(){this._state="exit",this._changeDetectorRef.markForCheck()}}]),n}(gk);return t.\u0275fac=function(e){return _k(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["mat-dialog-container"]],hostAttrs:["tabindex","-1","aria-modal","true",1,"mat-dialog-container"],hostVars:6,hostBindings:function(t,e){1&t&&Es("@dialogContainer.start",(function(t){return e._onAnimationStart(t)}))("@dialogContainer.done",(function(t){return e._onAnimationDone(t)})),2&t&&(mu("id",e._id),ds("role",e._config.role)("aria-labelledby",e._config.ariaLabel?null:e._ariaLabelledBy)("aria-label",e._config.ariaLabel)("aria-describedby",e._config.ariaDescribedBy||null),gu("@dialogContainer",e._state))},features:[Jo],decls:2,vars:0,consts:[["cdkPortalOutlet",""]],template:function(t,e){1&t&&(ps(0,fk,0,0,"ng-template",0),uu(1,"\n"))},directives:[Ug],styles:[".mat-dialog-container{display:block;padding:24px;border-radius:4px;box-sizing:border-box;overflow:auto;outline:0;width:100%;height:100%;min-height:inherit;max-height:inherit}.cdk-high-contrast-active .mat-dialog-container{outline:solid 1px}.mat-dialog-content{display:block;margin:0 -24px;padding:0 24px;max-height:65vh;overflow:auto;-webkit-overflow-scrolling:touch}.mat-dialog-title{margin:0 0 20px;display:block}.mat-dialog-actions{padding:8px 0;display:flex;flex-wrap:wrap;min-height:52px;align-items:center;margin-bottom:-24px}.mat-dialog-actions[align=end]{justify-content:flex-end}.mat-dialog-actions[align=center]{justify-content:center}.mat-dialog-actions .mat-button-base+.mat-button-base,.mat-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-dialog-actions .mat-button-base+.mat-button-base,[dir=rtl] .mat-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"],encapsulation:2,data:{animation:[mk.dialogContainer]}}),t}(),_k=Ki(vk),yk=0,bk=function(){function t(e,n){var i=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"mat-dialog-".concat(yk++);_(this,t),this._overlayRef=e,this._containerInstance=n,this.id=r,this.disableClose=this._containerInstance._config.disableClose,this._afterOpened=new z,this._afterClosed=new z,this._beforeClosed=new z,this._state=0,n._id=r,n._animationStateChanged.pipe(_p((function(t){return"opened"===t.state})),kp(1)).subscribe((function(){i._afterOpened.next(),i._afterOpened.complete()})),n._animationStateChanged.pipe(_p((function(t){return"closed"===t.state})),kp(1)).subscribe((function(){clearTimeout(i._closeFallbackTimeout),i._finishDialogClose()})),e.detachments().subscribe((function(){i._beforeClosed.next(i._result),i._beforeClosed.complete(),i._afterClosed.next(i._result),i._afterClosed.complete(),i.componentInstance=null,i._overlayRef.dispose()})),e.keydownEvents().pipe(_p((function(t){return t.keyCode===Xg&&!i.disableClose&&!nv(t)}))).subscribe((function(t){t.preventDefault(),wk(i,"keyboard")})),e.backdropClick().subscribe((function(){i.disableClose?i._containerInstance._recaptureFocus():wk(i,"mouse")}))}return b(t,[{key:"close",value:function(t){var e=this;this._result=t,this._containerInstance._animationStateChanged.pipe(_p((function(t){return"closing"===t.state})),kp(1)).subscribe((function(n){e._beforeClosed.next(t),e._beforeClosed.complete(),e._overlayRef.detachBackdrop(),e._closeFallbackTimeout=setTimeout((function(){return e._finishDialogClose()}),n.totalTime+100)})),this._state=1,this._containerInstance._startExitAnimation()}},{key:"afterOpened",value:function(){return this._afterOpened}},{key:"afterClosed",value:function(){return this._afterClosed}},{key:"beforeClosed",value:function(){return this._beforeClosed}},{key:"backdropClick",value:function(){return this._overlayRef.backdropClick()}},{key:"keydownEvents",value:function(){return this._overlayRef.keydownEvents()}},{key:"updatePosition",value:function(t){var e=this._getPositionStrategy();return t&&(t.left||t.right)?t.left?e.left(t.left):e.right(t.right):e.centerHorizontally(),t&&(t.top||t.bottom)?t.top?e.top(t.top):e.bottom(t.bottom):e.centerVertically(),this._overlayRef.updatePosition(),this}},{key:"updateSize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return this._getPositionStrategy().width(t).height(e),this._overlayRef.updatePosition(),this}},{key:"addPanelClass",value:function(t){return this._overlayRef.addPanelClass(t),this}},{key:"removePanelClass",value:function(t){return this._overlayRef.removePanelClass(t),this}},{key:"getState",value:function(){return this._state}},{key:"_finishDialogClose",value:function(){this._state=2,this._overlayRef.dispose()}},{key:"_getPositionStrategy",value:function(){return this._overlayRef.getConfig().positionStrategy}}]),t}();function wk(t,e,n){return void 0!==t._containerInstance&&(t._containerInstance._closeInteractionType=e),t.close(n)}var kk=new se("MatDialogData"),Mk=new se("mat-dialog-default-options"),Sk=new se("mat-dialog-scroll-strategy"),Ck={provide:Sk,deps:[Tv],useFactory:function(t){return function(){return t.scrollStrategies.block()}}},xk=function(){var t=function(){function t(e,n,i,r,a,o,s,u,l){var c=this;_(this,t),this._overlay=e,this._injector=n,this._defaultOptions=i,this._parentDialog=r,this._overlayContainer=a,this._dialogRefConstructor=s,this._dialogContainerType=u,this._dialogDataToken=l,this._openDialogsAtThisLevel=[],this._afterAllClosedAtThisLevel=new z,this._afterOpenedAtThisLevel=new z,this._ariaHiddenElements=new Map,this.afterAllClosed=hk((function(){return c.openDialogs.length?c._getAfterAllClosed():c._getAfterAllClosed().pipe(rg(void 0))})),this._scrollStrategy=o}return b(t,[{key:"_getAfterAllClosed",value:function(){var t=this._parentDialog;return t?t._getAfterAllClosed():this._afterAllClosedAtThisLevel}},{key:"open",value:function(t,e){var n=this;(e=function(t,e){return Object.assign(Object.assign({},e),t)}(e,this._defaultOptions||new pk)).id&&this.getDialogById(e.id);var i=this._createOverlay(e),r=this._attachDialogContainer(i,e),a=this._attachDialogContent(t,r,i,e);return this.openDialogs.length||this._hideNonDialogContentFromAssistiveTechnology(),this.openDialogs.push(a),a.afterClosed().subscribe((function(){return n._removeOpenDialog(a)})),this.afterOpened.next(a),r._initializeWithAttachedContent(),a}},{key:"closeAll",value:function(){this._closeDialogs(this.openDialogs)}},{key:"getDialogById",value:function(t){return this.openDialogs.find((function(e){return e.id===t}))}},{key:"ngOnDestroy",value:function(){this._closeDialogs(this._openDialogsAtThisLevel),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete()}},{key:"_createOverlay",value:function(t){var e=this._getOverlayConfig(t);return this._overlay.create(e)}},{key:"_getOverlayConfig",value:function(t){var e=new cv({positionStrategy:this._overlay.position().global(),scrollStrategy:t.scrollStrategy||this._scrollStrategy(),panelClass:t.panelClass,hasBackdrop:t.hasBackdrop,direction:t.direction,minWidth:t.minWidth,minHeight:t.minHeight,maxWidth:t.maxWidth,maxHeight:t.maxHeight,disposeOnNavigation:t.closeOnNavigation});return t.backdropClass&&(e.backdropClass=t.backdropClass),e}},{key:"_attachDialogContainer",value:function(t,e){var n=qo.create({parent:e&&e.viewContainerRef&&e.viewContainerRef.injector||this._injector,providers:[{provide:pk,useValue:e}]}),i=new Bg(this._dialogContainerType,e.viewContainerRef,n,e.componentFactoryResolver);return t.attach(i).instance}},{key:"_attachDialogContent",value:function(t,e,n,i){var r=new this._dialogRefConstructor(n,e,i.id);if(t instanceof ul)e.attachTemplatePortal(new jg(t,null,{$implicit:i.data,dialogRef:r}));else{var a=this._createInjector(i,r,e),o=e.attachComponentPortal(new Bg(t,i.viewContainerRef,a));r.componentInstance=o.instance}return r.updateSize(i.width,i.height).updatePosition(i.position),r}},{key:"_createInjector",value:function(t,e,n){var i=t&&t.viewContainerRef&&t.viewContainerRef.injector,r=[{provide:this._dialogContainerType,useValue:n},{provide:this._dialogDataToken,useValue:t.data},{provide:this._dialogRefConstructor,useValue:e}];return!t.direction||i&&i.get(Lg,null)||r.push({provide:Lg,useValue:{value:t.direction,change:rp()}}),qo.create({parent:i||this._injector,providers:r})}},{key:"_removeOpenDialog",value:function(t){var e=this.openDialogs.indexOf(t);e>-1&&(this.openDialogs.splice(e,1),this.openDialogs.length||(this._ariaHiddenElements.forEach((function(t,e){t?e.setAttribute("aria-hidden",t):e.removeAttribute("aria-hidden")})),this._ariaHiddenElements.clear(),this._getAfterAllClosed().next()))}},{key:"_hideNonDialogContentFromAssistiveTechnology",value:function(){var t=this._overlayContainer.getContainerElement();if(t.parentElement)for(var e=t.parentElement.children,n=e.length-1;n>-1;n--){var i=e[n];i===t||"SCRIPT"===i.nodeName||"STYLE"===i.nodeName||i.hasAttribute("aria-live")||(this._ariaHiddenElements.set(i,i.getAttribute("aria-hidden")),i.setAttribute("aria-hidden","true"))}}},{key:"_closeDialogs",value:function(t){for(var e=t.length;e--;)t[e].close()}},{key:"openDialogs",get:function(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}},{key:"afterOpened",get:function(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Tv),gs(qo),gs(void 0),gs(void 0),gs(vv),gs(void 0),gs(Eo),gs(Eo),gs(se))},t.\u0275dir=ze({type:t}),t}(),Dk=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s,u){return _(this,n),e.call(this,t,i,a,s,u,o,bk,vk,kk)}return n}(xk);return t.\u0275fac=function(e){return new(e||t)(ve(Tv),ve(qo),ve(Md,8),ve(Mk,8),ve(Sk),ve(t,12),ve(vv))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),Lk=0,Tk=function(){var t=function(){function t(e,n,i){_(this,t),this.dialogRef=e,this._elementRef=n,this._dialog=i,this.type="button"}return b(t,[{key:"ngOnInit",value:function(){this.dialogRef||(this.dialogRef=Pk(this._elementRef,this._dialog.openDialogs))}},{key:"ngOnChanges",value:function(t){var e=t._matDialogClose||t._matDialogCloseResult;e&&(this.dialogResult=e.currentValue)}},{key:"_onButtonClick",value:function(t){wk(this.dialogRef,0===t.screenX&&0===t.screenY?"keyboard":"mouse",this.dialogResult)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(bk,8),gs(Hu),gs(Dk))},t.\u0275dir=ze({type:t,selectors:[["","mat-dialog-close",""],["","matDialogClose",""]],hostVars:2,hostBindings:function(t,e){1&t&&Ts("click",(function(t){return e._onButtonClick(t)})),2&t&&ds("aria-label",e.ariaLabel||null)("type",e.type)},inputs:{type:"type",dialogResult:["mat-dialog-close","dialogResult"],ariaLabel:["aria-label","ariaLabel"],_matDialogClose:["matDialogClose","_matDialogClose"]},exportAs:["matDialogClose"],features:[fn]}),t}(),Ek=function(){var t=function(){function t(e,n,i){_(this,t),this._dialogRef=e,this._elementRef=n,this._dialog=i,this.id="mat-dialog-title-".concat(Lk++)}return b(t,[{key:"ngOnInit",value:function(){var t=this;this._dialogRef||(this._dialogRef=Pk(this._elementRef,this._dialog.openDialogs)),this._dialogRef&&Promise.resolve().then((function(){var e=t._dialogRef._containerInstance;e&&!e._ariaLabelledBy&&(e._ariaLabelledBy=t.id)}))}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(bk,8),gs(Hu),gs(Dk))},t.\u0275dir=ze({type:t,selectors:[["","mat-dialog-title",""],["","matDialogTitle",""]],hostAttrs:[1,"mat-dialog-title"],hostVars:1,hostBindings:function(t,e){2&t&&mu("id",e.id)},inputs:{id:"id"},exportAs:["matDialogTitle"]}),t}(),Ok=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-dialog-content",""],["mat-dialog-content"],["","matDialogContent",""]],hostAttrs:[1,"mat-dialog-content"]}),t}(),Ak=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-dialog-actions",""],["mat-dialog-actions"],["","matDialogActions",""]],hostAttrs:[1,"mat-dialog-actions"]}),t}();function Pk(t,e){for(var n=t.nativeElement.parentElement;n&&!n.classList.contains("mat-dialog-container");)n=n.parentElement;return n?e.find((function(t){return t.id===n.id})):null}var Ik=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[Dk,Ck],imports:[[Yv,Kg,xw],xw]}),t}(),Yk=function(t){return t.RequestingCurrentPin="RequestingCurrentPin",t.RequestingNewPin="RequestingNewPin",t.ConfirmingNewPin="ConfirmingNewPin",t}({}),Rk=function(){function t(t){this.dialog=t}return Object.defineProperty(t.prototype,"requestPinComponent",{set:function(t){this.requestPinComponentInternal=t},enumerable:!1,configurable:!0}),t.prototype.requestPin=function(){var t=this;return this.requestPinComponentInternal.openDialog(this.dialog,{changingPin:this.changingPin,changePinState:this.changePinState,signingTx:this.signingTx}).afterClosed().pipe(nt((function(e){return t.changingPin&&(t.changePinState===Yk.RequestingCurrentPin?t.changePinState=Yk.RequestingNewPin:t.changePinState===Yk.RequestingNewPin&&(t.changePinState=Yk.ConfirmingNewPin)),e})))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(Dk))}}),t}(),Fk=function(){function t(t){this.dialog=t}return Object.defineProperty(t.prototype,"requestWordComponent",{set:function(t){this.requestWordComponentInternal=t},enumerable:!1,configurable:!0}),t.prototype.requestWord=function(){return this.requestWordComponentInternal.openDialog(this.dialog,{reason:"HWWalletOperation"}).afterClosed().pipe(nt((function(t){return t})))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(Dk))}}),t}(),Hk=function(){function t(t,e,n,i){this.http=t,this.hwWalletPinService=e,this.hwWalletSeedWordService=n,this.ngZone=i,this.url="http://127.0.0.1:9510/api/v1/",this.timeoutMs=55e3,this.connectionEventSubject=new Cm(!1),this.hwConnected=!1,this.disconnectedChecks=0,this.maxFastDisconnectedChecks=32,this.updatePeriod=1e4,this.fastUpdatePeriod=2e3}return Object.defineProperty(t.prototype,"connectionEvent",{get:function(){return this.connectionEventSubject.asObservable()},enumerable:!1,configurable:!0}),t.prototype.get=function(t){return this.checkResponse(this.http.get(this.getUrl(t),this.returnRequestOptions()),t.includes("/available"))},t.prototype.post=function(t,e){return void 0===e&&(e=null),e||(e={}),this.checkResponse(this.http.post(this.getUrl(t),JSON.stringify(e),this.returnRequestOptions()))},t.prototype.put=function(t,e,n){return void 0===e&&(e=null),void 0===n&&(n=!1),this.checkResponse(this.http.put(this.getUrl(t),e,this.returnRequestOptions(n)),!1)},t.prototype.delete=function(t){return this.checkResponse(this.http.delete(this.getUrl(t),this.returnRequestOptions()))},t.prototype.checkResponse=function(t,e){var n=this;return void 0===e&&(e=!1),t.pipe(function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:tp;return Dm(t,ap(new xm),e)}(this.timeoutMs),st((function(t){return t.data&&t.data.length&&1===t.data.length&&(t.data=t.data[0]),e?n.ngZone.run((function(){return n.updateHwConnected(!!t.data)})):n.updateHwConnected(!0),"string"==typeof t.data&&-1!==t.data.indexOf("PinMatrixRequest")?n.hwWalletPinService.requestPin().pipe(st((function(t){return t?n.post("/intermediate/pin_matrix",{pin:t}):n.put("/cancel").pipe(st((function(){var t=new mm;return t.originalError=null,t.originalServerErrorMsg="",t.type=pm.FailedOrRefused,t.translatableErrorMsg=n.getHardwareWalletErrorMsg(t.type),ap(t)})))}))):"string"==typeof t.data&&-1!==t.data.indexOf("WordRequest")?n.hwWalletSeedWordService.requestWord().pipe(st((function(t){return t?n.post("/intermediate/word",{word:t}):n.put("/cancel").pipe(st((function(){var t=new mm;return t.originalError=null,t.originalServerErrorMsg="",t.type=pm.FailedOrRefused,t.translatableErrorMsg=n.getHardwareWalletErrorMsg(t.type),ap(t)})))}))):"string"==typeof t.data&&-1!==t.data.indexOf("ButtonRequest")?n.post("/intermediate/button"):rp(t)})),pp((function(t){if(t.type)return ap(t);var e=new mm;return e.originalError=t,t&&t.name&&"TimeoutError"===t.name?(n.put("/cancel").subscribe(),e.originalServerErrorMsg=t.name,e.type=pm.Timeout,e.translatableErrorMsg=n.getHardwareWalletErrorMsg(e.type),ap(e)):null==t.status||0!==t.status&&504!==t.status?(e.originalServerErrorMsg=vm(t),e.type=n.getHardwareWalletErrorType(e.originalServerErrorMsg),e.translatableErrorMsg=n.getHardwareWalletErrorMsg(e.type),ap(e)):(e.originalServerErrorMsg=vm(t),e.type=pm.DaemonConnectionError,e.translatableErrorMsg=n.getHardwareWalletErrorMsg(e.type),ap(e))})))},t.prototype.returnRequestOptions=function(t){void 0===t&&(t=!1);var e={};return e.headers=new Rp,t||(e.headers=e.headers.append("Content-Type","application/json")),e},t.prototype.checkHw=function(t){var e=this;this.checkHwSubscription&&this.checkHwSubscription.unsubscribe(),this.ngZone.runOutsideAngular((function(){e.checkHwSubscription=rp(1).pipe(up(t?e.hwConnected||e.disconnectedChecks0&&void 0!==arguments[0]?arguments[0]:void 0;this.control&&this.control.reset(t)}},{key:"hasError",value:function(t,e){return!!this.control&&this.control.hasError(t,e)}},{key:"getError",value:function(t,e){return this.control?this.control.getError(t,e):null}},{key:"value",get:function(){return this.control?this.control.value:null}},{key:"valid",get:function(){return this.control?this.control.valid:null}},{key:"invalid",get:function(){return this.control?this.control.invalid:null}},{key:"pending",get:function(){return this.control?this.control.pending:null}},{key:"disabled",get:function(){return this.control?this.control.disabled:null}},{key:"enabled",get:function(){return this.control?this.control.enabled:null}},{key:"errors",get:function(){return this.control?this.control.errors:null}},{key:"pristine",get:function(){return this.control?this.control.pristine:null}},{key:"dirty",get:function(){return this.control?this.control.dirty:null}},{key:"touched",get:function(){return this.control?this.control.touched:null}},{key:"status",get:function(){return this.control?this.control.status:null}},{key:"untouched",get:function(){return this.control?this.control.untouched:null}},{key:"statusChanges",get:function(){return this.control?this.control.statusChanges:null}},{key:"valueChanges",get:function(){return this.control?this.control.valueChanges:null}},{key:"path",get:function(){return null}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t}),t}(),$k=function(){var t=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return b(n,[{key:"formDirective",get:function(){return null}},{key:"path",get:function(){return null}}]),n}(Xk);return t.\u0275fac=function(e){return tM(e||t)},t.\u0275dir=ze({type:t,features:[Jo]}),t}(),tM=Ki($k),eM=function(t){f(n,t);var e=v(n);function n(){var t;return _(this,n),(t=e.apply(this,arguments))._parent=null,t.name=null,t.valueAccessor=null,t._rawValidators=[],t._rawAsyncValidators=[],t}return b(n,[{key:"validator",get:function(){}},{key:"asyncValidator",get:function(){}}]),n}(Xk),nM=function(){function t(e){_(this,t),this._cd=e}return b(t,[{key:"ngClassUntouched",get:function(){return!!this._cd.control&&this._cd.control.untouched}},{key:"ngClassTouched",get:function(){return!!this._cd.control&&this._cd.control.touched}},{key:"ngClassPristine",get:function(){return!!this._cd.control&&this._cd.control.pristine}},{key:"ngClassDirty",get:function(){return!!this._cd.control&&this._cd.control.dirty}},{key:"ngClassValid",get:function(){return!!this._cd.control&&this._cd.control.valid}},{key:"ngClassInvalid",get:function(){return!!this._cd.control&&this._cd.control.invalid}},{key:"ngClassPending",get:function(){return!!this._cd.control&&this._cd.control.pending}}]),t}(),iM=function(){var t=function(t){f(n,t);var e=v(n);function n(t){return _(this,n),e.call(this,t)}return n}(nM);return t.\u0275fac=function(e){return new(e||t)(gs(eM,2))},t.\u0275dir=ze({type:t,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(t,e){2&t&&Js("ng-untouched",e.ngClassUntouched)("ng-touched",e.ngClassTouched)("ng-pristine",e.ngClassPristine)("ng-dirty",e.ngClassDirty)("ng-valid",e.ngClassValid)("ng-invalid",e.ngClassInvalid)("ng-pending",e.ngClassPending)},features:[Jo]}),t}(),rM=function(){var t=function(t){f(n,t);var e=v(n);function n(t){return _(this,n),e.call(this,t)}return n}(nM);return t.\u0275fac=function(e){return new(e||t)(gs($k,2))},t.\u0275dir=ze({type:t,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:14,hostBindings:function(t,e){2&t&&Js("ng-untouched",e.ngClassUntouched)("ng-touched",e.ngClassTouched)("ng-pristine",e.ngClassPristine)("ng-dirty",e.ngClassDirty)("ng-valid",e.ngClassValid)("ng-invalid",e.ngClassInvalid)("ng-pending",e.ngClassPending)},features:[Jo]}),t}();function aM(t){return null==t||0===t.length}function oM(t){return null!=t&&"number"==typeof t.length}var sM=new se("NgValidators"),uM=new se("NgAsyncValidators"),lM=/^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,cM=function(){function t(){_(this,t)}return b(t,null,[{key:"min",value:function(t){return function(e){if(aM(e.value)||aM(t))return null;var n=parseFloat(e.value);return!isNaN(n)&&nt?{max:{max:t,actual:e.value}}:null}}},{key:"required",value:function(t){return aM(t.value)?{required:!0}:null}},{key:"requiredTrue",value:function(t){return!0===t.value?null:{required:!0}}},{key:"email",value:function(t){return aM(t.value)||lM.test(t.value)?null:{email:!0}}},{key:"minLength",value:function(t){return function(e){return aM(e.value)||!oM(e.value)?null:e.value.lengtht?{maxlength:{requiredLength:t,actualLength:e.value.length}}:null}}},{key:"pattern",value:function(e){return e?("string"==typeof e?(i="","^"!==e.charAt(0)&&(i+="^"),i+=e,"$"!==e.charAt(e.length-1)&&(i+="$"),n=new RegExp(i)):(i=e.toString(),n=e),function(t){if(aM(t.value))return null;var e=t.value;return n.test(e)?null:{pattern:{requiredPattern:i,actualValue:e}}}):t.nullValidator;var n,i}},{key:"nullValidator",value:function(t){return null}},{key:"compose",value:function(t){if(!t)return null;var e=t.filter(dM);return 0==e.length?null:function(t){return fM(pM(t,e))}}},{key:"composeAsync",value:function(t){if(!t)return null;var e=t.filter(dM);return 0==e.length?null:function(t){return zk(pM(t,e).map(hM)).pipe(nt(fM))}}}]),t}();function dM(t){return null!=t}function hM(t){var e=Ds(t)?ot(t):t;return Ls(e),e}function fM(t){var e={};return t.forEach((function(t){e=null!=t?Object.assign(Object.assign({},e),t):e})),0===Object.keys(e).length?null:e}function pM(t,e){return e.map((function(e){return e(t)}))}function mM(t){return t.map((function(t){return function(t){return!t.validate}(t)?t:function(e){return t.validate(e)}}))}var gM={provide:qk,useExisting:Ut((function(){return vM})),multi:!0},vM=function(){var t=function(){function t(e,n){_(this,t),this._renderer=e,this._elementRef=n,this.onChange=function(t){},this.onTouched=function(){}}return b(t,[{key:"writeValue",value:function(t){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==t?"":t)}},{key:"registerOnChange",value:function(t){this.onChange=function(e){t(""==e?null:parseFloat(e))}}},{key:"registerOnTouched",value:function(t){this.onTouched=t}},{key:"setDisabledState",value:function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Wu),gs(Hu))},t.\u0275dir=ze({type:t,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(t,e){1&t&&Ts("input",(function(t){return e.onChange(t.target.value)}))("blur",(function(){return e.onTouched()}))},features:[Pu([gM])]}),t}(),_M={provide:qk,useExisting:Ut((function(){return bM})),multi:!0},yM=function(){var t=function(){function t(){_(this,t),this._accessors=[]}return b(t,[{key:"add",value:function(t,e){this._accessors.push([t,e])}},{key:"remove",value:function(t){for(var e=this._accessors.length-1;e>=0;--e)if(this._accessors[e][1]===t)return void this._accessors.splice(e,1)}},{key:"select",value:function(t){var e=this;this._accessors.forEach((function(n){e._isSameGroup(n,t)&&n[1]!==t&&n[1].fireUncheck(t.value)}))}},{key:"_isSameGroup",value:function(t,e){return!!t[0].control&&t[0]._parent===e._control._parent&&t[1].name===e.name}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),bM=function(){var t=function(){function t(e,n,i,r){_(this,t),this._renderer=e,this._elementRef=n,this._registry=i,this._injector=r,this.onChange=function(){},this.onTouched=function(){}}return b(t,[{key:"ngOnInit",value:function(){this._control=this._injector.get(eM),this._checkName(),this._registry.add(this._control,this)}},{key:"ngOnDestroy",value:function(){this._registry.remove(this)}},{key:"writeValue",value:function(t){this._state=t===this.value,this._renderer.setProperty(this._elementRef.nativeElement,"checked",this._state)}},{key:"registerOnChange",value:function(t){var e=this;this._fn=t,this.onChange=function(){t(e.value),e._registry.select(e)}}},{key:"fireUncheck",value:function(t){this.writeValue(t)}},{key:"registerOnTouched",value:function(t){this.onTouched=t}},{key:"setDisabledState",value:function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)}},{key:"_checkName",value:function(){!this.name&&this.formControlName&&(this.name=this.formControlName)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Wu),gs(Hu),gs(yM),gs(qo))},t.\u0275dir=ze({type:t,selectors:[["input","type","radio","formControlName",""],["input","type","radio","formControl",""],["input","type","radio","ngModel",""]],hostBindings:function(t,e){1&t&&Ts("change",(function(){return e.onChange()}))("blur",(function(){return e.onTouched()}))},inputs:{name:"name",formControlName:"formControlName",value:"value"},features:[Pu([_M])]}),t}(),wM={provide:qk,useExisting:Ut((function(){return kM})),multi:!0},kM=function(){var t=function(){function t(e,n){_(this,t),this._renderer=e,this._elementRef=n,this.onChange=function(t){},this.onTouched=function(){}}return b(t,[{key:"writeValue",value:function(t){this._renderer.setProperty(this._elementRef.nativeElement,"value",parseFloat(t))}},{key:"registerOnChange",value:function(t){this.onChange=function(e){t(""==e?null:parseFloat(e))}}},{key:"registerOnTouched",value:function(t){this.onTouched=t}},{key:"setDisabledState",value:function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Wu),gs(Hu))},t.\u0275dir=ze({type:t,selectors:[["input","type","range","formControlName",""],["input","type","range","formControl",""],["input","type","range","ngModel",""]],hostBindings:function(t,e){1&t&&Ts("change",(function(t){return e.onChange(t.target.value)}))("input",(function(t){return e.onChange(t.target.value)}))("blur",(function(){return e.onTouched()}))},features:[Pu([wM])]}),t}(),MM={provide:qk,useExisting:Ut((function(){return CM})),multi:!0};function SM(t,e){return null==t?"".concat(e):(e&&"object"==typeof e&&(e="Object"),"".concat(t,": ").concat(e).slice(0,50))}var CM=function(){var t=function(){function t(e,n){_(this,t),this._renderer=e,this._elementRef=n,this._optionMap=new Map,this._idCounter=0,this.onChange=function(t){},this.onTouched=function(){},this._compareWith=Object.is}return b(t,[{key:"writeValue",value:function(t){this.value=t;var e=this._getOptionId(t);null==e&&this._renderer.setProperty(this._elementRef.nativeElement,"selectedIndex",-1);var n=SM(e,t);this._renderer.setProperty(this._elementRef.nativeElement,"value",n)}},{key:"registerOnChange",value:function(t){var e=this;this.onChange=function(n){e.value=e._getOptionValue(n),t(e.value)}}},{key:"registerOnTouched",value:function(t){this.onTouched=t}},{key:"setDisabledState",value:function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)}},{key:"_registerOption",value:function(){return(this._idCounter++).toString()}},{key:"_getOptionId",value:function(t){for(var e=0,n=Array.from(this._optionMap.keys());e-1)}}else e=function(t,e){t._setSelected(!1)};this._optionMap.forEach(e)}},{key:"registerOnChange",value:function(t){var e=this;this.onChange=function(n){var i=[];if(void 0!==n.selectedOptions)for(var r=n.selectedOptions,a=0;a-1&&t.splice(n,1)}function WM(t,e,n,i){cr()&&"never"!==i&&((null!==i&&"once"!==i||e._ngModelWarningSentOnce)&&("always"!==i||n._ngModelWarningSent)||(e._ngModelWarningSentOnce=!0,n._ngModelWarningSent=!0))}var VM="VALID",zM="INVALID",UM="PENDING",qM="DISABLED";function GM(t){return(QM(t)?t.validators:t)||null}function KM(t){return Array.isArray(t)?YM(t):t||null}function ZM(t,e){return(QM(e)?e.asyncValidators:t)||null}function JM(t){return Array.isArray(t)?RM(t):t||null}function QM(t){return null!=t&&!Array.isArray(t)&&"object"==typeof t}var XM=function(){function t(e,n){_(this,t),this._hasOwnPendingAsyncValidator=!1,this._onCollectionChange=function(){},this.pristine=!0,this.touched=!1,this._onDisabledChange=[],this._rawValidators=e,this._rawAsyncValidators=n,this._composedValidatorFn=KM(this._rawValidators),this._composedAsyncValidatorFn=JM(this._rawAsyncValidators)}return b(t,[{key:"setValidators",value:function(t){this._rawValidators=t,this._composedValidatorFn=KM(t)}},{key:"setAsyncValidators",value:function(t){this._rawAsyncValidators=t,this._composedAsyncValidatorFn=JM(t)}},{key:"clearValidators",value:function(){this.validator=null}},{key:"clearAsyncValidators",value:function(){this.asyncValidator=null}},{key:"markAsTouched",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.touched=!0,this._parent&&!t.onlySelf&&this._parent.markAsTouched(t)}},{key:"markAllAsTouched",value:function(){this.markAsTouched({onlySelf:!0}),this._forEachChild((function(t){return t.markAllAsTouched()}))}},{key:"markAsUntouched",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.touched=!1,this._pendingTouched=!1,this._forEachChild((function(t){t.markAsUntouched({onlySelf:!0})})),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)}},{key:"markAsDirty",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.pristine=!1,this._parent&&!t.onlySelf&&this._parent.markAsDirty(t)}},{key:"markAsPristine",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.pristine=!0,this._pendingDirty=!1,this._forEachChild((function(t){t.markAsPristine({onlySelf:!0})})),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)}},{key:"markAsPending",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.status=UM,!1!==t.emitEvent&&this.statusChanges.emit(this.status),this._parent&&!t.onlySelf&&this._parent.markAsPending(t)}},{key:"disable",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=this._parentMarkedDirty(t.onlySelf);this.status=qM,this.errors=null,this._forEachChild((function(e){e.disable(Object.assign(Object.assign({},t),{onlySelf:!0}))})),this._updateValue(),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Object.assign(Object.assign({},t),{skipPristineCheck:e})),this._onDisabledChange.forEach((function(t){return t(!0)}))}},{key:"enable",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=this._parentMarkedDirty(t.onlySelf);this.status=VM,this._forEachChild((function(e){e.enable(Object.assign(Object.assign({},t),{onlySelf:!0}))})),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent}),this._updateAncestors(Object.assign(Object.assign({},t),{skipPristineCheck:e})),this._onDisabledChange.forEach((function(t){return t(!1)}))}},{key:"_updateAncestors",value:function(t){this._parent&&!t.onlySelf&&(this._parent.updateValueAndValidity(t),t.skipPristineCheck||this._parent._updatePristine(),this._parent._updateTouched())}},{key:"setParent",value:function(t){this._parent=t}},{key:"updateValueAndValidity",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),this.status!==VM&&this.status!==UM||this._runAsyncValidator(t.emitEvent)),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!t.onlySelf&&this._parent.updateValueAndValidity(t)}},{key:"_updateTreeValidity",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{emitEvent:!0};this._forEachChild((function(e){return e._updateTreeValidity(t)})),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent})}},{key:"_setInitialStatus",value:function(){this.status=this._allControlsDisabled()?qM:VM}},{key:"_runValidator",value:function(){return this.validator?this.validator(this):null}},{key:"_runAsyncValidator",value:function(t){var e=this;if(this.asyncValidator){this.status=UM,this._hasOwnPendingAsyncValidator=!0;var n=hM(this.asyncValidator(this));this._asyncValidationSubscription=n.subscribe((function(n){e._hasOwnPendingAsyncValidator=!1,e.setErrors(n,{emitEvent:t})}))}}},{key:"_cancelExistingSubscription",value:function(){this._asyncValidationSubscription&&(this._asyncValidationSubscription.unsubscribe(),this._hasOwnPendingAsyncValidator=!1)}},{key:"setErrors",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.errors=t,this._updateControlsErrors(!1!==e.emitEvent)}},{key:"get",value:function(t){return function(t,e,n){if(null==e)return null;if(Array.isArray(e)||(e=e.split(".")),Array.isArray(e)&&0===e.length)return null;var i=t;return e.forEach((function(t){i=i instanceof tS?i.controls.hasOwnProperty(t)?i.controls[t]:null:i instanceof eS&&i.at(t)||null})),i}(this,t)}},{key:"getError",value:function(t,e){var n=e?this.get(e):this;return n&&n.errors?n.errors[t]:null}},{key:"hasError",value:function(t,e){return!!this.getError(t,e)}},{key:"_updateControlsErrors",value:function(t){this.status=this._calculateStatus(),t&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(t)}},{key:"_initObservables",value:function(){this.valueChanges=new Rl,this.statusChanges=new Rl}},{key:"_calculateStatus",value:function(){return this._allControlsDisabled()?qM:this.errors?zM:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(UM)?UM:this._anyControlsHaveStatus(zM)?zM:VM}},{key:"_anyControlsHaveStatus",value:function(t){return this._anyControls((function(e){return e.status===t}))}},{key:"_anyControlsDirty",value:function(){return this._anyControls((function(t){return t.dirty}))}},{key:"_anyControlsTouched",value:function(){return this._anyControls((function(t){return t.touched}))}},{key:"_updatePristine",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.pristine=!this._anyControlsDirty(),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)}},{key:"_updateTouched",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.touched=this._anyControlsTouched(),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)}},{key:"_isBoxedValue",value:function(t){return"object"==typeof t&&null!==t&&2===Object.keys(t).length&&"value"in t&&"disabled"in t}},{key:"_registerOnCollectionChange",value:function(t){this._onCollectionChange=t}},{key:"_setUpdateStrategy",value:function(t){QM(t)&&null!=t.updateOn&&(this._updateOn=t.updateOn)}},{key:"_parentMarkedDirty",value:function(t){return!t&&this._parent&&this._parent.dirty&&!this._parent._anyControlsDirty()}},{key:"validator",get:function(){return this._composedValidatorFn},set:function(t){this._rawValidators=this._composedValidatorFn=t}},{key:"asyncValidator",get:function(){return this._composedAsyncValidatorFn},set:function(t){this._rawAsyncValidators=this._composedAsyncValidatorFn=t}},{key:"parent",get:function(){return this._parent}},{key:"valid",get:function(){return this.status===VM}},{key:"invalid",get:function(){return this.status===zM}},{key:"pending",get:function(){return this.status==UM}},{key:"disabled",get:function(){return this.status===qM}},{key:"enabled",get:function(){return this.status!==qM}},{key:"dirty",get:function(){return!this.pristine}},{key:"untouched",get:function(){return!this.touched}},{key:"updateOn",get:function(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}},{key:"root",get:function(){for(var t=this;t._parent;)t=t._parent;return t}}]),t}(),$M=function(t){f(n,t);var e=v(n);function n(){var t,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,r=arguments.length>1?arguments[1]:void 0,a=arguments.length>2?arguments[2]:void 0;return _(this,n),(t=e.call(this,GM(r),ZM(a,r)))._onChange=[],t._applyFormState(i),t._setUpdateStrategy(r),t.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),t._initObservables(),t}return b(n,[{key:"setValue",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.value=this._pendingValue=t,this._onChange.length&&!1!==n.emitModelToViewChange&&this._onChange.forEach((function(t){return t(e.value,!1!==n.emitViewToModelChange)})),this.updateValueAndValidity(n)}},{key:"patchValue",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.setValue(t,e)}},{key:"reset",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._applyFormState(t),this.markAsPristine(e),this.markAsUntouched(e),this.setValue(this.value,e),this._pendingChange=!1}},{key:"_updateValue",value:function(){}},{key:"_anyControls",value:function(t){return!1}},{key:"_allControlsDisabled",value:function(){return this.disabled}},{key:"registerOnChange",value:function(t){this._onChange.push(t)}},{key:"_clearChangeFns",value:function(){this._onChange=[],this._onDisabledChange=[],this._onCollectionChange=function(){}}},{key:"registerOnDisabledChange",value:function(t){this._onDisabledChange.push(t)}},{key:"_forEachChild",value:function(t){}},{key:"_syncPendingControls",value:function(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))}},{key:"_applyFormState",value:function(t){this._isBoxedValue(t)?(this.value=this._pendingValue=t.value,t.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=t}}]),n}(XM),tS=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,GM(i),ZM(r,i))).controls=t,a._initObservables(),a._setUpdateStrategy(i),a._setUpControls(),a.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),a}return b(n,[{key:"registerControl",value:function(t,e){return this.controls[t]?this.controls[t]:(this.controls[t]=e,e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange),e)}},{key:"addControl",value:function(t,e){this.registerControl(t,e),this.updateValueAndValidity(),this._onCollectionChange()}},{key:"removeControl",value:function(t){this.controls[t]&&this.controls[t]._registerOnCollectionChange((function(){})),delete this.controls[t],this.updateValueAndValidity(),this._onCollectionChange()}},{key:"setControl",value:function(t,e){this.controls[t]&&this.controls[t]._registerOnCollectionChange((function(){})),delete this.controls[t],e&&this.registerControl(t,e),this.updateValueAndValidity(),this._onCollectionChange()}},{key:"contains",value:function(t){return this.controls.hasOwnProperty(t)&&this.controls[t].enabled}},{key:"setValue",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._checkAllValuesPresent(t),Object.keys(t).forEach((function(i){e._throwIfControlMissing(i),e.controls[i].setValue(t[i],{onlySelf:!0,emitEvent:n.emitEvent})})),this.updateValueAndValidity(n)}},{key:"patchValue",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};Object.keys(t).forEach((function(i){e.controls[i]&&e.controls[i].patchValue(t[i],{onlySelf:!0,emitEvent:n.emitEvent})})),this.updateValueAndValidity(n)}},{key:"reset",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._forEachChild((function(n,i){n.reset(t[i],{onlySelf:!0,emitEvent:e.emitEvent})})),this._updatePristine(e),this._updateTouched(e),this.updateValueAndValidity(e)}},{key:"getRawValue",value:function(){return this._reduceChildren({},(function(t,e,n){return t[n]=e instanceof $M?e.value:e.getRawValue(),t}))}},{key:"_syncPendingControls",value:function(){var t=this._reduceChildren(!1,(function(t,e){return!!e._syncPendingControls()||t}));return t&&this.updateValueAndValidity({onlySelf:!0}),t}},{key:"_throwIfControlMissing",value:function(t){if(!Object.keys(this.controls).length)throw new Error("\n There are no form controls registered with this group yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.controls[t])throw new Error("Cannot find form control with name: ".concat(t,"."))}},{key:"_forEachChild",value:function(t){var e=this;Object.keys(this.controls).forEach((function(n){return t(e.controls[n],n)}))}},{key:"_setUpControls",value:function(){var t=this;this._forEachChild((function(e){e.setParent(t),e._registerOnCollectionChange(t._onCollectionChange)}))}},{key:"_updateValue",value:function(){this.value=this._reduceValue()}},{key:"_anyControls",value:function(t){for(var e=0,n=Object.keys(this.controls);e0||this.disabled}},{key:"_checkAllValuesPresent",value:function(t){this._forEachChild((function(e,n){if(void 0===t[n])throw new Error("Must supply a value for form control with name: '".concat(n,"'."))}))}}]),n}(XM),eS=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,GM(i),ZM(r,i))).controls=t,a._initObservables(),a._setUpdateStrategy(i),a._setUpControls(),a.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),a}return b(n,[{key:"at",value:function(t){return this.controls[t]}},{key:"push",value:function(t){this.controls.push(t),this._registerControl(t),this.updateValueAndValidity(),this._onCollectionChange()}},{key:"insert",value:function(t,e){this.controls.splice(t,0,e),this._registerControl(e),this.updateValueAndValidity()}},{key:"removeAt",value:function(t){this.controls[t]&&this.controls[t]._registerOnCollectionChange((function(){})),this.controls.splice(t,1),this.updateValueAndValidity()}},{key:"setControl",value:function(t,e){this.controls[t]&&this.controls[t]._registerOnCollectionChange((function(){})),this.controls.splice(t,1),e&&(this.controls.splice(t,0,e),this._registerControl(e)),this.updateValueAndValidity(),this._onCollectionChange()}},{key:"setValue",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._checkAllValuesPresent(t),t.forEach((function(t,i){e._throwIfControlMissing(i),e.at(i).setValue(t,{onlySelf:!0,emitEvent:n.emitEvent})})),this.updateValueAndValidity(n)}},{key:"patchValue",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t.forEach((function(t,i){e.at(i)&&e.at(i).patchValue(t,{onlySelf:!0,emitEvent:n.emitEvent})})),this.updateValueAndValidity(n)}},{key:"reset",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._forEachChild((function(n,i){n.reset(t[i],{onlySelf:!0,emitEvent:e.emitEvent})})),this._updatePristine(e),this._updateTouched(e),this.updateValueAndValidity(e)}},{key:"getRawValue",value:function(){return this.controls.map((function(t){return t instanceof $M?t.value:t.getRawValue()}))}},{key:"clear",value:function(){this.controls.length<1||(this._forEachChild((function(t){return t._registerOnCollectionChange((function(){}))})),this.controls.splice(0),this.updateValueAndValidity())}},{key:"_syncPendingControls",value:function(){var t=this.controls.reduce((function(t,e){return!!e._syncPendingControls()||t}),!1);return t&&this.updateValueAndValidity({onlySelf:!0}),t}},{key:"_throwIfControlMissing",value:function(t){if(!this.controls.length)throw new Error("\n There are no form controls registered with this array yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.at(t))throw new Error("Cannot find form control at index ".concat(t))}},{key:"_forEachChild",value:function(t){this.controls.forEach((function(e,n){t(e,n)}))}},{key:"_updateValue",value:function(){var t=this;this.value=this.controls.filter((function(e){return e.enabled||t.disabled})).map((function(t){return t.value}))}},{key:"_anyControls",value:function(t){return this.controls.some((function(e){return e.enabled&&t(e)}))}},{key:"_setUpControls",value:function(){var t=this;this._forEachChild((function(e){return t._registerControl(e)}))}},{key:"_checkAllValuesPresent",value:function(t){this._forEachChild((function(e,n){if(void 0===t[n])throw new Error("Must supply a value for form control at index: ".concat(n,"."))}))}},{key:"_allControlsDisabled",value:function(){var t,e=d(this.controls);try{for(e.s();!(t=e.n()).done;)if(t.value.enabled)return!1}catch(n){e.e(n)}finally{e.f()}return this.controls.length>0||this.disabled}},{key:"_registerControl",value:function(t){t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange)}},{key:"length",get:function(){return this.controls.length}}]),n}(XM),nS={provide:$k,useExisting:Ut((function(){return rS}))},iS=function(){return Promise.resolve(null)}(),rS=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this)).submitted=!1,r._directives=[],r.ngSubmit=new Rl,r.form=new tS({},YM(t),RM(i)),r}return b(n,[{key:"ngAfterViewInit",value:function(){this._setUpdateStrategy()}},{key:"addControl",value:function(t){var e=this;iS.then((function(){var n=e._findContainer(t.path);t.control=n.registerControl(t.name,t.control),AM(t.control,t),t.control.updateValueAndValidity({emitEvent:!1}),e._directives.push(t)}))}},{key:"getControl",value:function(t){return this.form.get(t.path)}},{key:"removeControl",value:function(t){var e=this;iS.then((function(){var n=e._findContainer(t.path);n&&n.removeControl(t.name),NM(e._directives,t)}))}},{key:"addFormGroup",value:function(t){var e=this;iS.then((function(){var n=e._findContainer(t.path),i=new tS({});IM(i,t),n.registerControl(t.name,i),i.updateValueAndValidity({emitEvent:!1})}))}},{key:"removeFormGroup",value:function(t){var e=this;iS.then((function(){var n=e._findContainer(t.path);n&&n.removeControl(t.name)}))}},{key:"getFormGroup",value:function(t){return this.form.get(t.path)}},{key:"updateModel",value:function(t,e){var n=this;iS.then((function(){n.form.get(t.path).setValue(e)}))}},{key:"setValue",value:function(t){this.control.setValue(t)}},{key:"onSubmit",value:function(t){return this.submitted=!0,BM(this.form,this._directives),this.ngSubmit.emit(t),!1}},{key:"onReset",value:function(){this.resetForm()}},{key:"resetForm",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;this.form.reset(t),this.submitted=!1}},{key:"_setUpdateStrategy",value:function(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)}},{key:"_findContainer",value:function(t){return t.pop(),t.length?this.form.get(t):this.form}},{key:"formDirective",get:function(){return this}},{key:"control",get:function(){return this.form}},{key:"path",get:function(){return[]}},{key:"controls",get:function(){return this.form.controls}}]),n}($k);return t.\u0275fac=function(e){return new(e||t)(gs(sM,10),gs(uM,10))},t.\u0275dir=ze({type:t,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(t,e){1&t&&Ts("submit",(function(t){return e.onSubmit(t)}))("reset",(function(){return e.onReset()}))},inputs:{options:["ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[Pu([nS]),Jo]}),t}(),aS=function(){var t=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return b(n,[{key:"ngOnInit",value:function(){this._checkParentType(),this.formDirective.addFormGroup(this)}},{key:"ngOnDestroy",value:function(){this.formDirective&&this.formDirective.removeFormGroup(this)}},{key:"_checkParentType",value:function(){}},{key:"control",get:function(){return this.formDirective.getFormGroup(this)}},{key:"path",get:function(){return OM(null==this.name?this.name:this.name.toString(),this._parent)}},{key:"formDirective",get:function(){return this._parent?this._parent.formDirective:null}},{key:"validator",get:function(){return YM(this._validators)}},{key:"asyncValidator",get:function(){return RM(this._asyncValidators)}}]),n}($k);return t.\u0275fac=function(e){return oS(e||t)},t.\u0275dir=ze({type:t,features:[Jo]}),t}(),oS=Ki(aS),sS=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""]}),t}(),uS=new se("NgModelWithFormControlWarning"),lS={provide:eM,useExisting:Ut((function(){return cS}))},cS=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,o){var s;return _(this,n),(s=e.call(this))._ngModelWarningConfig=o,s.update=new Rl,s._ngModelWarningSent=!1,s._rawValidators=t||[],s._rawAsyncValidators=i||[],s.valueAccessor=jM(a(s),r),s}return b(n,[{key:"ngOnChanges",value:function(t){this._isControlChanged(t)&&(AM(this.form,this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this.form.updateValueAndValidity({emitEvent:!1})),FM(t,this.viewModel)&&(WM(0,n,this,this._ngModelWarningConfig),this.form.setValue(this.model),this.viewModel=this.model)}},{key:"viewToModelUpdate",value:function(t){this.viewModel=t,this.update.emit(t)}},{key:"_isControlChanged",value:function(t){return t.hasOwnProperty("form")}},{key:"isDisabled",set:function(t){}},{key:"path",get:function(){return[]}},{key:"validator",get:function(){return YM(this._rawValidators)}},{key:"asyncValidator",get:function(){return RM(this._rawAsyncValidators)}},{key:"control",get:function(){return this.form}}]),n}(eM);return t.\u0275fac=function(e){return new(e||t)(gs(sM,10),gs(uM,10),gs(qk,10),gs(uS,8))},t.\u0275dir=ze({type:t,selectors:[["","formControl",""]],inputs:{isDisabled:["disabled","isDisabled"],form:["formControl","form"],model:["ngModel","model"]},outputs:{update:"ngModelChange"},exportAs:["ngForm"],features:[Pu([lS]),Jo,fn]}),t._ngModelWarningSentOnce=!1,t}(),dS={provide:$k,useExisting:Ut((function(){return hS}))},hS=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this))._validators=t,r._asyncValidators=i,r.submitted=!1,r.directives=[],r.form=null,r.ngSubmit=new Rl,r}return b(n,[{key:"ngOnChanges",value:function(t){this._checkFormPresent(),t.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations())}},{key:"addControl",value:function(t){var e=this.form.get(t.path);return AM(e,t),e.updateValueAndValidity({emitEvent:!1}),this.directives.push(t),e}},{key:"getControl",value:function(t){return this.form.get(t.path)}},{key:"removeControl",value:function(t){NM(this.directives,t)}},{key:"addFormGroup",value:function(t){var e=this.form.get(t.path);IM(e,t),e.updateValueAndValidity({emitEvent:!1})}},{key:"removeFormGroup",value:function(t){}},{key:"getFormGroup",value:function(t){return this.form.get(t.path)}},{key:"addFormArray",value:function(t){var e=this.form.get(t.path);IM(e,t),e.updateValueAndValidity({emitEvent:!1})}},{key:"removeFormArray",value:function(t){}},{key:"getFormArray",value:function(t){return this.form.get(t.path)}},{key:"updateModel",value:function(t,e){this.form.get(t.path).setValue(e)}},{key:"onSubmit",value:function(t){return this.submitted=!0,BM(this.form,this.directives),this.ngSubmit.emit(t),!1}},{key:"onReset",value:function(){this.resetForm()}},{key:"resetForm",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;this.form.reset(t),this.submitted=!1}},{key:"_updateDomValue",value:function(){var t=this;this.directives.forEach((function(e){var n=t.form.get(e.path);e.control!==n&&(function(t,e){var n=function(){};e.valueAccessor.registerOnChange(n),e.valueAccessor.registerOnTouched(n),e._rawValidators.forEach((function(t){t.registerOnValidatorChange&&t.registerOnValidatorChange(null)})),e._rawAsyncValidators.forEach((function(t){t.registerOnValidatorChange&&t.registerOnValidatorChange(null)})),t&&t._clearChangeFns()}(e.control,e),n&&AM(n,e),e.control=n)})),this.form._updateTreeValidity({emitEvent:!1})}},{key:"_updateRegistrations",value:function(){var t=this;this.form._registerOnCollectionChange((function(){return t._updateDomValue()})),this._oldForm&&this._oldForm._registerOnCollectionChange((function(){})),this._oldForm=this.form}},{key:"_updateValidators",value:function(){var t=YM(this._validators);this.form.validator=cM.compose([this.form.validator,t]);var e=RM(this._asyncValidators);this.form.asyncValidator=cM.composeAsync([this.form.asyncValidator,e])}},{key:"_checkFormPresent",value:function(){}},{key:"formDirective",get:function(){return this}},{key:"control",get:function(){return this.form}},{key:"path",get:function(){return[]}}]),n}($k);return t.\u0275fac=function(e){return new(e||t)(gs(sM,10),gs(uM,10))},t.\u0275dir=ze({type:t,selectors:[["","formGroup",""]],hostBindings:function(t,e){1&t&&Ts("submit",(function(t){return e.onSubmit(t)}))("reset",(function(){return e.onReset()}))},inputs:{form:["formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[Pu([dS]),Jo,fn]}),t}(),fS={provide:$k,useExisting:Ut((function(){return pS}))},pS=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this))._parent=t,a._validators=i,a._asyncValidators=r,a}return b(n,[{key:"_checkParentType",value:function(){vS(this._parent)}}]),n}(aS);return t.\u0275fac=function(e){return new(e||t)(gs($k,13),gs(sM,10),gs(uM,10))},t.\u0275dir=ze({type:t,selectors:[["","formGroupName",""]],inputs:{name:["formGroupName","name"]},features:[Pu([fS]),Jo]}),t}(),mS={provide:$k,useExisting:Ut((function(){return gS}))},gS=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this))._parent=t,a._validators=i,a._asyncValidators=r,a}return b(n,[{key:"ngOnInit",value:function(){this._checkParentType(),this.formDirective.addFormArray(this)}},{key:"ngOnDestroy",value:function(){this.formDirective&&this.formDirective.removeFormArray(this)}},{key:"_checkParentType",value:function(){vS(this._parent)}},{key:"control",get:function(){return this.formDirective.getFormArray(this)}},{key:"formDirective",get:function(){return this._parent?this._parent.formDirective:null}},{key:"path",get:function(){return OM(null==this.name?this.name:this.name.toString(),this._parent)}},{key:"validator",get:function(){return YM(this._validators)}},{key:"asyncValidator",get:function(){return RM(this._asyncValidators)}}]),n}($k);return t.\u0275fac=function(e){return new(e||t)(gs($k,13),gs(sM,10),gs(uM,10))},t.\u0275dir=ze({type:t,selectors:[["","formArrayName",""]],inputs:{name:["formArrayName","name"]},features:[Pu([mS]),Jo]}),t}();function vS(t){return!(t instanceof pS||t instanceof hS||t instanceof gS)}var _S={provide:eM,useExisting:Ut((function(){return yS}))},yS=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,o,s){var u;return _(this,n),(u=e.call(this))._ngModelWarningConfig=s,u._added=!1,u.update=new Rl,u._ngModelWarningSent=!1,u._parent=t,u._rawValidators=i||[],u._rawAsyncValidators=r||[],u.valueAccessor=jM(a(u),o),u}return b(n,[{key:"ngOnChanges",value:function(t){this._added||this._setUpControl(),FM(t,this.viewModel)&&(WM(0,n,this,this._ngModelWarningConfig),this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}},{key:"ngOnDestroy",value:function(){this.formDirective&&this.formDirective.removeControl(this)}},{key:"viewToModelUpdate",value:function(t){this.viewModel=t,this.update.emit(t)}},{key:"_checkParentType",value:function(){}},{key:"_setUpControl",value:function(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0}},{key:"isDisabled",set:function(t){}},{key:"path",get:function(){return OM(null==this.name?this.name:this.name.toString(),this._parent)}},{key:"formDirective",get:function(){return this._parent?this._parent.formDirective:null}},{key:"validator",get:function(){return YM(this._rawValidators)}},{key:"asyncValidator",get:function(){return RM(this._rawAsyncValidators)}}]),n}(eM);return t.\u0275fac=function(e){return new(e||t)(gs($k,13),gs(sM,10),gs(uM,10),gs(qk,10),gs(uS,8))},t.\u0275dir=ze({type:t,selectors:[["","formControlName",""]],inputs:{isDisabled:["disabled","isDisabled"],name:["formControlName","name"],model:["ngModel","model"]},outputs:{update:"ngModelChange"},features:[Pu([_S]),Jo,fn]}),t._ngModelWarningSentOnce=!1,t}(),bS={provide:sM,useExisting:Ut((function(){return kS})),multi:!0},wS={provide:sM,useExisting:Ut((function(){return MS})),multi:!0},kS=function(){var t=function(){function t(){_(this,t),this._required=!1}return b(t,[{key:"validate",value:function(t){return this.required?cM.required(t):null}},{key:"registerOnValidatorChange",value:function(t){this._onChange=t}},{key:"required",get:function(){return this._required},set:function(t){this._required=null!=t&&!1!==t&&"false"!=="".concat(t),this._onChange&&this._onChange()}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","required","","formControlName","",3,"type","checkbox"],["","required","","formControl","",3,"type","checkbox"],["","required","","ngModel","",3,"type","checkbox"]],hostVars:1,hostBindings:function(t,e){2&t&&ds("required",e.required?"":null)},inputs:{required:"required"},features:[Pu([bS])]}),t}(),MS=function(){var t=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return b(n,[{key:"validate",value:function(t){return this.required?cM.requiredTrue(t):null}}]),n}(kS);return t.\u0275fac=function(e){return SS(e||t)},t.\u0275dir=ze({type:t,selectors:[["input","type","checkbox","required","","formControlName",""],["input","type","checkbox","required","","formControl",""],["input","type","checkbox","required","","ngModel",""]],hostVars:1,hostBindings:function(t,e){2&t&&ds("required",e.required?"":null)},features:[Pu([wS]),Jo]}),t}(),SS=Ki(MS),CS={provide:sM,useExisting:Ut((function(){return xS})),multi:!0},xS=function(){var t=function(){function t(){_(this,t),this._enabled=!1}return b(t,[{key:"validate",value:function(t){return this._enabled?cM.email(t):null}},{key:"registerOnValidatorChange",value:function(t){this._onChange=t}},{key:"email",set:function(t){this._enabled=""===t||!0===t||"true"===t,this._onChange&&this._onChange()}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","email","","formControlName",""],["","email","","formControl",""],["","email","","ngModel",""]],inputs:{email:"email"},features:[Pu([CS])]}),t}(),DS={provide:sM,useExisting:Ut((function(){return LS})),multi:!0},LS=function(){var t=function(){function t(){_(this,t),this._validator=cM.nullValidator}return b(t,[{key:"ngOnChanges",value:function(t){"minlength"in t&&(this._createValidator(),this._onChange&&this._onChange())}},{key:"validate",value:function(t){return null==this.minlength?null:this._validator(t)}},{key:"registerOnValidatorChange",value:function(t){this._onChange=t}},{key:"_createValidator",value:function(){this._validator=cM.minLength("number"==typeof this.minlength?this.minlength:parseInt(this.minlength,10))}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","minlength","","formControlName",""],["","minlength","","formControl",""],["","minlength","","ngModel",""]],hostVars:1,hostBindings:function(t,e){2&t&&ds("minlength",e.minlength?e.minlength:null)},inputs:{minlength:"minlength"},features:[Pu([DS]),fn]}),t}(),TS={provide:sM,useExisting:Ut((function(){return ES})),multi:!0},ES=function(){var t=function(){function t(){_(this,t),this._validator=cM.nullValidator}return b(t,[{key:"ngOnChanges",value:function(t){"maxlength"in t&&(this._createValidator(),this._onChange&&this._onChange())}},{key:"validate",value:function(t){return null!=this.maxlength?this._validator(t):null}},{key:"registerOnValidatorChange",value:function(t){this._onChange=t}},{key:"_createValidator",value:function(){this._validator=cM.maxLength("number"==typeof this.maxlength?this.maxlength:parseInt(this.maxlength,10))}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","maxlength","","formControlName",""],["","maxlength","","formControl",""],["","maxlength","","ngModel",""]],hostVars:1,hostBindings:function(t,e){2&t&&ds("maxlength",e.maxlength?e.maxlength:null)},inputs:{maxlength:"maxlength"},features:[Pu([TS]),fn]}),t}(),OS={provide:sM,useExisting:Ut((function(){return AS})),multi:!0},AS=function(){var t=function(){function t(){_(this,t),this._validator=cM.nullValidator}return b(t,[{key:"ngOnChanges",value:function(t){"pattern"in t&&(this._createValidator(),this._onChange&&this._onChange())}},{key:"validate",value:function(t){return this._validator(t)}},{key:"registerOnValidatorChange",value:function(t){this._onChange=t}},{key:"_createValidator",value:function(){this._validator=cM.pattern(this.pattern)}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","pattern","","formControlName",""],["","pattern","","formControl",""],["","pattern","","ngModel",""]],hostVars:1,hostBindings:function(t,e){2&t&&ds("pattern",e.pattern?e.pattern:null)},inputs:{pattern:"pattern"},features:[Pu([OS]),fn]}),t}(),PS=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)}}),t}();function IS(t){return void 0!==t.asyncValidators||void 0!==t.validators||void 0!==t.updateOn}var YS=function(){var t=function(){function t(){_(this,t)}return b(t,[{key:"group",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=this._reduceControls(t),i=null,r=null,a=void 0;return null!=e&&(IS(e)?(i=null!=e.validators?e.validators:null,r=null!=e.asyncValidators?e.asyncValidators:null,a=null!=e.updateOn?e.updateOn:void 0):(i=null!=e.validator?e.validator:null,r=null!=e.asyncValidator?e.asyncValidator:null)),new tS(n,{asyncValidators:r,updateOn:a,validators:i})}},{key:"control",value:function(t,e,n){return new $M(t,e,n)}},{key:"array",value:function(t,e,n){var i=this,r=t.map((function(t){return i._createControl(t)}));return new eS(r,e,n)}},{key:"_reduceControls",value:function(t){var e=this,n={};return Object.keys(t).forEach((function(i){n[i]=e._createControl(t[i])})),n}},{key:"_createControl",value:function(t){return t instanceof $M||t instanceof tS||t instanceof eS?t:Array.isArray(t)?this.control(t[0],t.length>1?t[1]:null,t.length>2?t[2]:null):this.control(t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),RS=function(){var t=function(){function t(){_(this,t)}return b(t,null,[{key:"withConfig",value:function(e){return{ngModule:t,providers:[{provide:uS,useValue:e.warnOnNgModelWithFormControl}]}}}]),t}();return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[YS,yM],imports:[PS]}),t}();function FS(t,e){if(1&t){var n=xs();bs(0,"img",3),Ts("click",(function(){return Bn(n),Ys().closePopup()})),ws()}}var HS=function(t){return{"red-title":t}},BS=["*"],jS=function(){function t(t){this.matDialog=t,this.useRedTitle=!1}return Object.defineProperty(t.prototype,"dialog",{set:function(t){t.disableClose=!0,this.dialogInternal=t},enumerable:!1,configurable:!0}),t.prototype.onKeyUp=function(){this.closePopup()},t.prototype.closePopup=function(){this.disableDismiss||this.matDialog.openDialogs[this.matDialog.openDialogs.length-1].id===this.dialogInternal.id&&this.dialogInternal.close()},t.\u0275fac=function(e){return new(e||t)(gs(Dk))},t.\u0275cmp=Fe({type:t,selectors:[["app-modal"]],hostBindings:function(t,e){1&t&&Ts("keyup.esc",(function(){return e.onKeyUp()}),!1,un)},inputs:{useRedTitle:"useRedTitle",headline:"headline",disableDismiss:"disableDismiss",dialog:"dialog"},ngContentSelectors:BS,decls:13,vars:5,consts:[[1,"-header",3,"ngClass"],["class","image-button","src","assets/img/delete-grey.png",3,"click",4,"ngIf"],[1,"modal"],["src","assets/img/delete-grey.png",1,"image-button",3,"click"]],template:function(t,e){1&t&&(Fs(),bs(0,"div",0),uu(1),ps(2,FS,1,0,"img",1),uu(3,"\n"),ws(),uu(4,"\n"),bs(5,"div",2),uu(6,"\n "),bs(7,"mat-dialog-content"),uu(8,"\n "),Hs(9),uu(10,"\n "),ws(),uu(11,"\n"),ws(),uu(12,"\n")),2&t&&(_s("ngClass",kl(3,HS,e.useRedTitle)),na(1),cu("\n ",e.headline,"\n "),na(1),_s("ngIf",!e.disableDismiss))},directives:[Ch,Eh,Ok],styles:['.-header[_ngcontent-%COMP%]{background-color:#f7f7f7;line-height:50px;position:relative;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 32px;font-size:14px}.-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:32px;position:absolute;right:9px;top:9px}mat-dialog-content[_ngcontent-%COMP%]:after, mat-dialog-content[_ngcontent-%COMP%]:before{content:"";padding-top:24px;height:0;display:block}.red-title[_ngcontent-%COMP%]{text-transform:uppercase;font-weight:700;letter-spacing:1px;color:#ff004e}']}),t}();function NS(t,e){var n=!1;return arguments.length>=2&&(n=!0),function(i){return i.lift(new WS(t,e,n))}}var WS=function(){function t(e,n){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];_(this,t),this.accumulator=e,this.seed=n,this.hasSeed=i}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new VS(t,this.accumulator,this.seed,this.hasSeed))}}]),t}(),VS=function(t){f(n,t);var e=v(n);function n(t,i,r,a){var o;return _(this,n),(o=e.call(this,t)).accumulator=i,o._seed=r,o.hasSeed=a,o.index=0,o}return b(n,[{key:"_next",value:function(t){if(this.hasSeed)return this._tryNext(t);this.seed=t,this.destination.next(t)}},{key:"_tryNext",value:function(t){var e,n=this.index++;try{e=this.accumulator(this.seed,t,n)}catch(i){this.destination.error(i)}this.seed=e,this.destination.next(e)}},{key:"seed",get:function(){return this._seed},set:function(t){this.hasSeed=!0,this._seed=t}}]),n}(P);function zS(t){return function(e){return 0===t?ip():e.lift(new US(t))}}var US=function(){function t(e){if(_(this,t),this.total=e,this.total<0)throw new wp}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new qS(t,this.total))}}]),t}(),qS=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,t)).total=i,r.ring=new Array,r.count=0,r}return b(n,[{key:"_next",value:function(t){var e=this.ring,n=this.total,i=this.count++;e.length0)for(var n=this.count>=this.total?this.total:this.count,i=this.ring,r=0;r5&&void 0!==arguments[5])||arguments[5],s=arguments.length>6&&void 0!==arguments[6]&&arguments[6];_(this,t),this.store=e,this.currentLoader=n,this.compiler=i,this.parser=r,this.missingTranslationHandler=a,this.useDefaultLang=o,this.isolate=s,this.pending=!1,this._onTranslationChange=new Rl,this._onLangChange=new Rl,this._onDefaultLangChange=new Rl,this._langs=[],this._translations={},this._translationRequests={}}return b(t,[{key:"setDefaultLang",value:function(t){var e=this;if(t!==this.defaultLang){var n=this.retrieveTranslations(t);void 0!==n?(this.defaultLang||(this.defaultLang=t),n.pipe(kp(1)).subscribe((function(n){e.changeDefaultLang(t)}))):this.changeDefaultLang(t)}}},{key:"getDefaultLang",value:function(){return this.defaultLang}},{key:"use",value:function(t){var e=this;if(t===this.currentLang)return rp(this.translations[t]);var n=this.retrieveTranslations(t);return void 0!==n?(this.currentLang||(this.currentLang=t),n.pipe(kp(1)).subscribe((function(n){e.changeLang(t)})),n):(this.changeLang(t),rp(this.translations[t]))}},{key:"retrieveTranslations",value:function(t){var e;return void 0===this.translations[t]&&(this._translationRequests[t]=this._translationRequests[t]||this.getTranslation(t),e=this._translationRequests[t]),e}},{key:"getTranslation",value:function(t){var e=this;return this.pending=!0,this.loadingTranslations=this.currentLoader.getTranslation(t).pipe(wt()),this.loadingTranslations.pipe(kp(1)).subscribe((function(n){e.translations[t]=e.compiler.compileTranslations(n,t),e.updateLangs(),e.pending=!1}),(function(t){e.pending=!1})),this.loadingTranslations}},{key:"setTranslation",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e=this.compiler.compileTranslations(e,t),this.translations[t]=n&&this.translations[t]?aC(this.translations[t],e):e,this.updateLangs(),this.onTranslationChange.emit({lang:t,translations:this.translations[t]})}},{key:"getLangs",value:function(){return this.langs}},{key:"addLangs",value:function(t){var e=this;t.forEach((function(t){-1===e.langs.indexOf(t)&&e.langs.push(t)}))}},{key:"updateLangs",value:function(){this.addLangs(Object.keys(this.translations))}},{key:"getParsedResult",value:function(t,e,n){var i;if(e instanceof Array){var r,a={},o=!1,s=d(e);try{for(s.s();!(r=s.n()).done;){var u=r.value;a[u]=this.getParsedResult(t,u,n),"function"==typeof a[u].subscribe&&(o=!0)}}catch(g){s.e(g)}finally{s.f()}if(o){var l,c,h=d(e);try{for(h.s();!(c=h.n()).done;){var f=c.value,p="function"==typeof a[f].subscribe?a[f]:rp(a[f]);l=void 0===l?p:ft(l,p)}}catch(g){h.e(g)}finally{h.f()}return l.pipe(function(t,e){return arguments.length>=2?function(n){return F(NS(t,e),zS(1),Cp(e))(n)}:function(e){return F(NS((function(e,n,i){return t(e,n,i+1)})),zS(1))(e)}}(GS,[]),nt((function(t){var n={};return t.forEach((function(t,i){n[e[i]]=t})),n})))}return a}if(t&&(i=this.parser.interpolate(this.parser.getValue(t,e),n)),void 0===i&&this.defaultLang&&this.defaultLang!==this.currentLang&&this.useDefaultLang&&(i=this.parser.interpolate(this.parser.getValue(this.translations[this.defaultLang],e),n)),void 0===i){var m={key:e,translateService:this};void 0!==n&&(m.interpolateParams=n),i=this.missingTranslationHandler.handle(m)}return void 0!==i?i:e}},{key:"get",value:function(t,e){var n=this;if(!iC(t)||!t.length)throw new Error('Parameter "key" required');if(this.pending)return B.create((function(i){var r=function(t){i.next(t),i.complete()},a=function(t){i.error(t)};n.loadingTranslations.subscribe((function(i){"function"==typeof(i=n.getParsedResult(n.compiler.compileTranslations(i,n.currentLang),t,e)).subscribe?i.subscribe(r,a):r(i)}),a)}));var i=this.getParsedResult(this.translations[this.currentLang],t,e);return"function"==typeof i.subscribe?i:rp(i)}},{key:"stream",value:function(t,e){var n=this;if(!iC(t)||!t.length)throw new Error('Parameter "key" required');return ig(this.get(t,e),this.onLangChange.pipe(ag((function(i){var r=n.getParsedResult(i.translations,t,e);return"function"==typeof r.subscribe?r:rp(r)}))))}},{key:"instant",value:function(t,e){if(!iC(t)||!t.length)throw new Error('Parameter "key" required');var n=this.getParsedResult(this.translations[this.currentLang],t,e);if(void 0!==n.subscribe){if(t instanceof Array){var i={};return t.forEach((function(e,n){i[t[n]]=t[n]})),i}return t}return n}},{key:"set",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.currentLang;this.translations[n][t]=this.compiler.compile(e,n),this.updateLangs(),this.onTranslationChange.emit({lang:n,translations:this.translations[n]})}},{key:"changeLang",value:function(t){this.currentLang=t,this.onLangChange.emit({lang:t,translations:this.translations[t]}),this.defaultLang||this.changeDefaultLang(t)}},{key:"changeDefaultLang",value:function(t){this.defaultLang=t,this.onDefaultLangChange.emit({lang:t,translations:this.translations[t]})}},{key:"reloadLang",value:function(t){return this.resetLang(t),this.getTranslation(t)}},{key:"resetLang",value:function(t){this._translationRequests[t]=void 0,this.translations[t]=void 0}},{key:"getBrowserLang",value:function(){if("undefined"!=typeof window&&void 0!==window.navigator){var t=window.navigator.languages?window.navigator.languages[0]:null;return-1!==(t=t||window.navigator.language||window.navigator.browserLanguage||window.navigator.userLanguage).indexOf("-")&&(t=t.split("-")[0]),-1!==t.indexOf("_")&&(t=t.split("_")[0]),t}}},{key:"getBrowserCultureLang",value:function(){if("undefined"!=typeof window&&void 0!==window.navigator)return(window.navigator.languages?window.navigator.languages[0]:null)||window.navigator.language||window.navigator.browserLanguage||window.navigator.userLanguage}},{key:"onTranslationChange",get:function(){return this.isolate?this._onTranslationChange:this.store.onTranslationChange}},{key:"onLangChange",get:function(){return this.isolate?this._onLangChange:this.store.onLangChange}},{key:"onDefaultLangChange",get:function(){return this.isolate?this._onDefaultLangChange:this.store.onDefaultLangChange}},{key:"defaultLang",get:function(){return this.isolate?this._defaultLang:this.store.defaultLang},set:function(t){this.isolate?this._defaultLang=t:this.store.defaultLang=t}},{key:"currentLang",get:function(){return this.isolate?this._currentLang:this.store.currentLang},set:function(t){this.isolate?this._currentLang=t:this.store.currentLang=t}},{key:"langs",get:function(){return this.isolate?this._langs:this.store.langs},set:function(t){this.isolate?this._langs=t:this.store.langs=t}},{key:"translations",get:function(){return this.isolate?this._translations:this.store.translations},set:function(t){this.isolate?this._translations=t:this.store.translations=t}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(lC),ve(KS),ve($S),ve(oC),ve(QS),ve(dC),ve(cC))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),fC=function(){var t=function(){function t(e,n,i){var r=this;_(this,t),this.translateService=e,this.element=n,this._ref=i,this.onTranslationChangeSub||(this.onTranslationChangeSub=this.translateService.onTranslationChange.subscribe((function(t){t.lang===r.translateService.currentLang&&r.checkNodes(!0,t.translations)}))),this.onLangChangeSub||(this.onLangChangeSub=this.translateService.onLangChange.subscribe((function(t){r.checkNodes(!0,t.translations)}))),this.onDefaultLangChangeSub||(this.onDefaultLangChangeSub=this.translateService.onDefaultLangChange.subscribe((function(t){r.checkNodes(!0)})))}return b(t,[{key:"ngAfterViewChecked",value:function(){this.checkNodes()}},{key:"checkNodes",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=arguments.length>1?arguments[1]:void 0,n=this.element.nativeElement.childNodes;n.length||(this.setContent(this.element.nativeElement,this.key),n=this.element.nativeElement.childNodes);for(var i=0;i1?i-1:0),a=1;a0&&void 0!==arguments[0]?arguments[0]:{};return{ngModule:t,providers:[e.loader||{provide:KS,useClass:ZS},e.compiler||{provide:$S,useClass:tC},e.parser||{provide:oC,useClass:sC},e.missingTranslationHandler||{provide:QS,useClass:XS},lC,{provide:cC,useValue:e.isolate},{provide:dC,useValue:e.useDefaultLang},hC]}}},{key:"forChild",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{ngModule:t,providers:[e.loader||{provide:KS,useClass:ZS},e.compiler||{provide:$S,useClass:tC},e.parser||{provide:oC,useClass:sC},e.missingTranslationHandler||{provide:QS,useClass:XS},{provide:cC,useValue:e.isolate},{provide:dC,useValue:e.useDefaultLang},hC]}}}]),t}();return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)}}),t}(),gC=function(){function t(t){this.dialogRef=t}return t.openDialog=function(e){var n=new pk;return n.autoFocus=!1,n.width="450px",e.open(t,n)},t.\u0275fac=function(e){return new(e||t)(gs(bk))},t.\u0275cmp=Fe({type:t,selectors:[["app-hw-added-dialog"]],decls:16,vars:13,consts:[[3,"headline","dialog"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),bs(3,"p"),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),bs(7,"p"),uu(8),Tl(9,"translate"),ws(),uu(10,"\n "),bs(11,"p"),uu(12),Tl(13,"translate"),ws(),uu(14,"\n"),ws(),uu(15,"\n")),2&t&&(_s("headline",El(1,5,"hardware-wallet.pin-help.title"))("dialog",e.dialogRef),na(4),lu(El(5,7,"hardware-wallet.pin-help.part1")),na(4),lu(El(9,9,"hardware-wallet.pin-help.part2")),na(4),lu(El(13,11,"hardware-wallet.pin-help.part3")))},directives:[jS],pipes:[pC],styles:[""]}),t}();function vC(t,e){if(1&t&&(hi(),ks(0,"circle",3)),2&t){var n=Ys();Zs("animation-name","mat-progress-spinner-stroke-rotate-"+n._spinnerAnimationLabel)("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),ds("r",n._getCircleRadius())}}function _C(t,e){if(1&t&&(hi(),ks(0,"circle",3)),2&t){var n=Ys();Zs("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),ds("r",n._getCircleRadius())}}function yC(t,e){if(1&t&&(hi(),ks(0,"circle",3)),2&t){var n=Ys();Zs("animation-name","mat-progress-spinner-stroke-rotate-"+n._spinnerAnimationLabel)("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),ds("r",n._getCircleRadius())}}function bC(t,e){if(1&t&&(hi(),ks(0,"circle",3)),2&t){var n=Ys();Zs("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),ds("r",n._getCircleRadius())}}var wC=".mat-progress-spinner{display:block;position:relative}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}._mat-animation-noopable.mat-progress-spinner circle{transition:none;animation:none}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:currentColor}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate]{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate]{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4000ms;animation-timing-function:cubic-bezier(0.35, 0, 0.25, 1);animation-iteration-count:infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate]{animation:mat-progress-spinner-stroke-rotate-fallback 10000ms cubic-bezier(0.87, 0.03, 0.33, 1) infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate]{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition:none;animation:none}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.606171575px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.606171575px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.606171575px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.606171575px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0deg)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}\n",kC=Lw((function t(e){_(this,t),this._elementRef=e}),"primary"),MC=new se("mat-progress-spinner-default-options",{providedIn:"root",factory:function(){return{diameter:100}}}),SC=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o){var s;_(this,n),(s=e.call(this,t))._elementRef=t,s._document=r,s._diameter=100,s._value=0,s._fallbackAnimation=!1,s.mode="determinate";var u=n._diameters;return s._spinnerAnimationLabel=s._getSpinnerAnimationLabel(),u.has(r.head)||u.set(r.head,new Set([100])),s._fallbackAnimation=i.EDGE||i.TRIDENT,s._noopAnimations="NoopAnimations"===a&&!!o&&!o._forceAnimations,o&&(o.diameter&&(s.diameter=o.diameter),o.strokeWidth&&(s.strokeWidth=o.strokeWidth)),s}return b(n,[{key:"ngOnInit",value:function(){var t=this._elementRef.nativeElement;this._styleRoot=xg(t)||this._document.head,this._attachStyleNode();var e="mat-progress-spinner-indeterminate".concat(this._fallbackAnimation?"-fallback":"","-animation");t.classList.add(e)}},{key:"_getCircleRadius",value:function(){return(this.diameter-10)/2}},{key:"_getViewBox",value:function(){var t=2*this._getCircleRadius()+this.strokeWidth;return"0 0 ".concat(t," ").concat(t)}},{key:"_getStrokeCircumference",value:function(){return 2*Math.PI*this._getCircleRadius()}},{key:"_getStrokeDashOffset",value:function(){return"determinate"===this.mode?this._getStrokeCircumference()*(100-this._value)/100:this._fallbackAnimation&&"indeterminate"===this.mode?.2*this._getStrokeCircumference():null}},{key:"_getCircleStrokeWidth",value:function(){return this.strokeWidth/this.diameter*100}},{key:"_attachStyleNode",value:function(){var t=this._styleRoot,e=this._diameter,i=n._diameters,r=i.get(t);if(!r||!r.has(e)){var a=this._document.createElement("style");a.setAttribute("mat-spinner-animation",this._spinnerAnimationLabel),a.textContent=this._getAnimationText(),t.appendChild(a),r||(r=new Set,i.set(t,r)),r.add(e)}}},{key:"_getAnimationText",value:function(){var t=this._getStrokeCircumference();return"\n @keyframes mat-progress-spinner-stroke-rotate-DIAMETER {\n 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }\n 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }\n 12.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n\n 25.0001% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }\n 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }\n 37.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n\n 50.0001% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }\n 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }\n 62.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n\n 75.0001% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }\n 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }\n 87.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n }\n".replace(/START_VALUE/g,"".concat(.95*t)).replace(/END_VALUE/g,"".concat(.2*t)).replace(/DIAMETER/g,"".concat(this._spinnerAnimationLabel))}},{key:"_getSpinnerAnimationLabel",value:function(){return this.diameter.toString().replace(".","_")}},{key:"diameter",get:function(){return this._diameter},set:function(t){this._diameter=Om(t),this._spinnerAnimationLabel=this._getSpinnerAnimationLabel(),!this._fallbackAnimation&&this._styleRoot&&this._attachStyleNode()}},{key:"strokeWidth",get:function(){return this._strokeWidth||this.diameter/10},set:function(t){this._strokeWidth=Om(t)}},{key:"value",get:function(){return"determinate"===this.mode?this._value:0},set:function(t){this._value=Math.max(0,Math.min(100,Om(t)))}}]),n}(kC);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(bg),gs(ud,8),gs(gw,8),gs(MC))},t.\u0275cmp=Fe({type:t,selectors:[["mat-progress-spinner"]],hostAttrs:["role","progressbar",1,"mat-progress-spinner"],hostVars:10,hostBindings:function(t,e){2&t&&(ds("aria-valuemin","determinate"===e.mode?0:null)("aria-valuemax","determinate"===e.mode?100:null)("aria-valuenow","determinate"===e.mode?e.value:null)("mode",e.mode),Zs("width",e.diameter,"px")("height",e.diameter,"px"),Js("_mat-animation-noopable",e._noopAnimations))},inputs:{color:"color",mode:"mode",diameter:"diameter",strokeWidth:"strokeWidth",value:"value"},exportAs:["matProgressSpinner"],features:[Jo],decls:9,vars:8,consts:[["preserveAspectRatio","xMidYMid meet","focusable","false",3,"ngSwitch"],["cx","50%","cy","50%",3,"animation-name","stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%",3,"stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%"]],template:function(t,e){1&t&&(uu(0,"\n\n"),hi(),bs(1,"svg",0),uu(2,"\n\n "),uu(3,"\n "),ps(4,vC,1,9,"circle",1),uu(5,"\n\n "),ps(6,_C,1,7,"circle",2),uu(7,"\n"),ws(),uu(8,"\n")),2&t&&(na(1),Zs("width",e.diameter,"px")("height",e.diameter,"px"),_s("ngSwitch","indeterminate"===e.mode),ds("viewBox",e._getViewBox()),na(3),_s("ngSwitchCase",!0),na(2),_s("ngSwitchCase",!1))},directives:[Ih,Yh],styles:[wC],encapsulation:2,changeDetection:0}),t._diameters=new WeakMap,t}(),CC=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o){var s;return _(this,n),(s=e.call(this,t,i,r,a,o)).mode="indeterminate",s}return n}(SC);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(bg),gs(ud,8),gs(gw,8),gs(MC))},t.\u0275cmp=Fe({type:t,selectors:[["mat-spinner"]],hostAttrs:["role","progressbar","mode","indeterminate",1,"mat-spinner","mat-progress-spinner"],hostVars:6,hostBindings:function(t,e){2&t&&(Zs("width",e.diameter,"px")("height",e.diameter,"px"),Js("_mat-animation-noopable",e._noopAnimations))},inputs:{color:"color"},features:[Jo],decls:9,vars:8,consts:[["preserveAspectRatio","xMidYMid meet","focusable","false",3,"ngSwitch"],["cx","50%","cy","50%",3,"animation-name","stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%",3,"stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%"]],template:function(t,e){1&t&&(uu(0,"\n\n"),hi(),bs(1,"svg",0),uu(2,"\n\n "),uu(3,"\n "),ps(4,yC,1,9,"circle",1),uu(5,"\n\n "),ps(6,bC,1,7,"circle",2),uu(7,"\n"),ws(),uu(8,"\n")),2&t&&(na(1),Zs("width",e.diameter,"px")("height",e.diameter,"px"),_s("ngSwitch","indeterminate"===e.mode),ds("viewBox",e._getViewBox()),na(3),_s("ngSwitchCase",!0),na(2),_s("ngSwitchCase",!1))},directives:[Ih,Yh],styles:[wC],encapsulation:2,changeDetection:0}),t}(),xC=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[xw,df],xw]}),t}(),DC=function(){function t(t,e){this.decimalPipe=t,this.appService=e}return t.prototype.transform=function(t,e,n){void 0===e&&(e=!0),void 0===n&&(n="");var i="";return"last"!==n&&(i=this.decimalPipe.transform(t,e?"1.0-"+this.appService.currentMaxDecimals:"1.0-0"),"first"!==n&&(i+=" ")),"first"!==n&&(i+=e?this.appService.coinName:1===Number(t)||-1===Number(t)?this.appService.hoursNameSingular:this.appService.hoursName),i},t.\u0275fac=function(e){return new(e||t)(gs(af),gs(Sm))},t.\u0275pipe=Ue({name:"amount",type:t,pure:!1}),t}();function LC(t,e){1&t&&ks(0,"mat-spinner")}function TC(t,e){1&t&&(bs(0,"i",12),uu(1,"done"),ws())}function EC(t,e){1&t&&(bs(0,"i",13),uu(1,"error_outline"),ws())}function OC(t,e){1&t&&(bs(0,"i",14),uu(1,"usb"),ws())}function AC(t,e){1&t&&(bs(0,"i",15),uu(1,"memory"),ws())}function PC(t,e){1&t&&(bs(0,"i",16),uu(1,"error"),ws())}function IC(t,e){1&t&&(bs(0,"i",15),uu(1,"touch_app"),ws())}function YC(t,e){if(1&t&&(bs(0,"div",6),uu(1,"\n "),ps(2,LC,1,0,"mat-spinner",3),uu(3,"\n "),ps(4,TC,2,0,"i",7),uu(5,"\n "),ps(6,EC,2,0,"i",8),uu(7,"\n "),ps(8,OC,2,0,"i",9),uu(9,"\n "),ps(10,AC,2,0,"i",10),uu(11,"\n "),ps(12,PC,2,0,"i",11),uu(13,"\n "),ps(14,IC,2,0,"i",10),uu(15,"\n "),ws()),2&t){var n=Ys();na(2),_s("ngIf",n.icon==n.icons.Spinner),na(2),_s("ngIf",n.icon==n.icons.Success),na(2),_s("ngIf",n.icon==n.icons.Error),na(2),_s("ngIf",n.icon==n.icons.Usb),na(2),_s("ngIf",n.icon==n.icons.HardwareWallet),na(2),_s("ngIf",n.icon==n.icons.Warning),na(2),_s("ngIf",n.icon==n.icons.Confirm)}}function RC(t,e){if(1&t&&(bs(0,"div"),uu(1,"\n "),bs(2,"span",17),uu(3),ws(),uu(4,"\n "),ws()),2&t){var n=Ys();na(3),lu(n.upperBigText)}}function FC(t,e){if(1&t&&(bs(0,"span"),uu(1),ws()),2&t){var n=Ys();na(1),lu(n.text)}}function HC(t,e){if(1&t){var n=xs();bs(0,"span",18),Ts("click",(function(){return Bn(n),Ys().activateLink()})),uu(1),ws()}if(2&t){var i=Ys();na(1),lu(i.linkText)}}function BC(t,e){if(1&t&&(bs(0,"span"),bs(1,"a",19),uu(2),ws(),ws()),2&t){var n=Ys();na(1),_s("href",n.linkText,Rr),na(1),lu(n.linkText)}}function jC(t,e){if(1&t&&(bs(0,"div",22),uu(1,"\n "),bs(2,"span"),uu(3),Tl(4,"amount"),ws(),uu(5,"\n "),bs(6,"span"),uu(7),Tl(8,"translate"),Tl(9,"amount"),ws(),uu(10,"\n "),bs(11,"span"),uu(12),Tl(13,"translate"),ws(),uu(14,"\n "),ws()),2&t){var n=e.$implicit;na(3),cu("\u2022 ",El(4,5,n.coins.toString()),""),na(4),du("",El(8,7,"hardware-wallet.create-tx.separator-for-coins-and-hours")," ",Ol(9,9,n.hours.toString(),!1),""),na(5),du("",El(13,12,"hardware-wallet.create-tx.separator-to-destination")," ",n.address,"")}}function NC(t,e){if(1&t&&(bs(0,"div",20),uu(1,"\n "),ps(2,jC,15,14,"div",21),uu(3,"\n "),ws()),2&t){var n=Ys();na(2),_s("ngForOf",n.outputsList)}}function WC(t,e){if(1&t&&(bs(0,"span"),uu(1),ws()),2&t){var n=Ys();na(1),lu(n.lowerText)}}function VC(t,e){if(1&t&&(bs(0,"div"),uu(1,"\n "),bs(2,"span",17),uu(3),ws(),uu(4,"\n "),ws()),2&t){var n=Ys();na(3),lu(n.lowerBigText)}}function zC(t,e){if(1&t&&(bs(0,"div"),uu(1,"\n "),bs(2,"span",23),uu(3),ws(),uu(4,"\n "),ws()),2&t){var n=Ys();na(3),lu(n.lowerLightText)}}var UC=function(t){return t[t.None=0]="None",t[t.Spinner=1]="Spinner",t[t.Success=2]="Success",t[t.Error=3]="Error",t[t.Usb=4]="Usb",t[t.HardwareWallet=5]="HardwareWallet",t[t.Warning=6]="Warning",t[t.Confirm=7]="Confirm",t}({}),qC=function(){function t(){this.icon=UC.None,this.linkIsUrl=!1,this.linkClicked=new Rl,this.icons=UC}return t.prototype.activateLink=function(){this.linkClicked.emit()},t.\u0275fac=function(e){return new(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["app-hw-message"]],inputs:{icon:"icon",text:"text",linkText:"linkText",linkIsUrl:"linkIsUrl",outputsList:"outputsList",lowerText:"lowerText",upperBigText:"upperBigText",lowerBigText:"lowerBigText",lowerLightText:"lowerLightText"},outputs:{linkClicked:"linkClicked"},decls:26,vars:9,consts:[[1,"content"],["class","icon-container",4,"ngIf"],[1,"text-container"],[4,"ngIf"],["class","link",3,"click",4,"ngIf"],["class","list",4,"ngIf"],[1,"icon-container"],["class","material-icons green-text",4,"ngIf"],["class","material-icons red-text",4,"ngIf"],["class","material-icons grey-light-text",4,"ngIf"],["class","material-icons yellow-text",4,"ngIf"],["class","material-icons red-text -blinking",4,"ngIf"],[1,"material-icons","green-text"],[1,"material-icons","red-text"],[1,"material-icons","grey-light-text"],[1,"material-icons","yellow-text"],[1,"material-icons","red-text","-blinking"],[1,"big-text"],[1,"link",3,"click"],["target","_blank","rel","noreferrer nofollow noopener",1,"link",3,"href"],[1,"list"],["class","list-element",4,"ngFor","ngForOf"],[1,"list-element"],[1,"grey-light-text"]],template:function(t,e){1&t&&(bs(0,"div",0),uu(1,"\n "),uu(2,"\n "),ps(3,YC,16,7,"div",1),uu(4,"\n "),uu(5,"\n "),bs(6,"div",2),uu(7,"\n "),ps(8,RC,5,1,"div",3),uu(9,"\n "),ps(10,FC,2,1,"span",3),uu(11,"\n "),ps(12,HC,2,1,"span",4),uu(13,"\n "),ps(14,BC,3,2,"span",3),uu(15,"\n "),ps(16,NC,4,1,"div",5),uu(17,"\n "),ps(18,WC,2,1,"span",3),uu(19,"\n "),ps(20,VC,5,1,"div",3),uu(21,"\n "),ps(22,zC,5,1,"div",3),uu(23,"\n "),ws(),uu(24,"\n"),ws(),uu(25,"\n")),2&t&&(na(3),_s("ngIf",e.icon!==e.icons.None),na(5),_s("ngIf",e.upperBigText),na(2),_s("ngIf",e.text),na(2),_s("ngIf",e.linkText&&!e.linkIsUrl),na(2),_s("ngIf",e.linkText&&e.linkIsUrl),na(2),_s("ngIf",e.outputsList),na(2),_s("ngIf",e.lowerText),na(2),_s("ngIf",e.lowerBigText),na(2),_s("ngIf",e.lowerLightText))},directives:[Eh,CC,Lh],pipes:[DC,pC],styles:[".content[_ngcontent-%COMP%]{display:flex}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%]{margin-right:20px}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%], .content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:36px!important;width:36px!important}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{font-size:40px}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%]{flex-grow:1;align-self:center}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .list[_ngcontent-%COMP%]{padding:10px 0}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .list[_ngcontent-%COMP%] .list-element[_ngcontent-%COMP%]{word-break:break-all;margin:10px 0;font-size:12px;color:#000;font-weight:700}.content[_ngcontent-%COMP%] .-blinking[_ngcontent-%COMP%]{-webkit-animation:alert-blinking 1s linear infinite;animation:alert-blinking 1s linear infinite}.big-text[_ngcontent-%COMP%]{color:#1e2227;font-weight:700;font-size:15px}"]}),t}(),GC=["mat-button",""],KC=["*"],ZC=".mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{opacity:0}.mat-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay,.mat-stroked-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay{opacity:.04}@media(hover: none){.mat-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay,.mat-stroked-button:hover:not(.mat-button-disabled) .mat-button-focus-overlay{opacity:0}}.mat-button,.mat-icon-button,.mat-stroked-button,.mat-flat-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible}.mat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner{border:0}.mat-button.mat-button-disabled,.mat-icon-button.mat-button-disabled,.mat-stroked-button.mat-button-disabled,.mat-flat-button.mat-button-disabled{cursor:default}.mat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-button.cdk-program-focused .mat-button-focus-overlay,.mat-icon-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-icon-button.cdk-program-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-program-focused .mat-button-focus-overlay,.mat-flat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-flat-button.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner{border:0}.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-raised-button::-moz-focus-inner{border:0}.mat-raised-button.mat-button-disabled{cursor:default}.mat-raised-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-raised-button.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-raised-button::-moz-focus-inner{border:0}._mat-animation-noopable.mat-raised-button{transition:none;animation:none}.mat-stroked-button{border:1px solid currentColor;padding:0 15px;line-height:34px}.mat-stroked-button .mat-button-ripple.mat-ripple,.mat-stroked-button .mat-button-focus-overlay{top:-1px;left:-1px;right:-1px;bottom:-1px}.mat-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab::-moz-focus-inner{border:0}.mat-fab.mat-button-disabled{cursor:default}.mat-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-fab.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-fab::-moz-focus-inner{border:0}._mat-animation-noopable.mat-fab{transition:none;animation:none}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:64px;line-height:36px;padding:0 16px;border-radius:4px;overflow:visible;transform:translate3d(0, 0, 0);transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab::-moz-focus-inner{border:0}.mat-mini-fab.mat-button-disabled{cursor:default}.mat-mini-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-mini-fab.cdk-program-focused .mat-button-focus-overlay{opacity:.12}.mat-mini-fab::-moz-focus-inner{border:0}._mat-animation-noopable.mat-mini-fab{transition:none;animation:none}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button i,.mat-icon-button .mat-icon{line-height:24px}.mat-button-ripple.mat-ripple,.mat-button-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-button-ripple.mat-ripple:not(:empty){transform:translateZ(0)}.mat-button-focus-overlay{opacity:0;transition:opacity 200ms cubic-bezier(0.35, 0, 0.25, 1),background-color 200ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-button-focus-overlay{transition:none}.mat-button-ripple-round{border-radius:50%;z-index:1}.mat-button .mat-button-wrapper>*,.mat-flat-button .mat-button-wrapper>*,.mat-stroked-button .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*{vertical-align:middle}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button{display:block;font-size:inherit;width:2.5em;height:2.5em}.cdk-high-contrast-active .mat-button,.cdk-high-contrast-active .mat-flat-button,.cdk-high-contrast-active .mat-raised-button,.cdk-high-contrast-active .mat-icon-button,.cdk-high-contrast-active .mat-fab,.cdk-high-contrast-active .mat-mini-fab{outline:solid 1px}.cdk-high-contrast-active .mat-button-base.cdk-keyboard-focused,.cdk-high-contrast-active .mat-button-base.cdk-program-focused{outline:solid 3px}\n",JC=["mat-button","mat-flat-button","mat-icon-button","mat-raised-button","mat-stroked-button","mat-mini-fab","mat-fab"],QC=Lw(Dw(Tw((function t(e){_(this,t),this._elementRef=e})))),XC=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;_(this,n),(a=e.call(this,t))._focusMonitor=i,a._animationMode=r,a.isRoundButton=a._hasHostAttributes("mat-fab","mat-mini-fab"),a.isIconButton=a._hasHostAttributes("mat-icon-button");var o,s=d(JC);try{for(s.s();!(o=s.n()).done;){var u=o.value;a._hasHostAttributes(u)&&a._getHostElement().classList.add(u)}}catch(l){s.e(l)}finally{s.f()}return t.nativeElement.classList.add("mat-button-base"),a.isRoundButton&&(a.color="accent"),a}return b(n,[{key:"ngAfterViewInit",value:function(){this._focusMonitor.monitor(this._elementRef,!0)}},{key:"ngOnDestroy",value:function(){this._focusMonitor.stopMonitoring(this._elementRef)}},{key:"focus",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"program",e=arguments.length>1?arguments[1]:void 0;this._focusMonitor.focusVia(this._getHostElement(),t,e)}},{key:"_getHostElement",value:function(){return this._elementRef.nativeElement}},{key:"_isRippleDisabled",value:function(){return this.disableRipple||this.disabled}},{key:"_hasHostAttributes",value:function(){for(var t=this,e=arguments.length,n=new Array(e),i=0;i1&&void 0!==arguments[1]?arguments[1]:t;return this._fontCssClassesByAlias.set(t,e),this}},{key:"classNameForFontAlias",value:function(t){return this._fontCssClassesByAlias.get(t)||t}},{key:"setDefaultFontSetClass",value:function(t){return this._defaultFontSetClass=t,this}},{key:"getDefaultFontSetClass",value:function(){return this._defaultFontSetClass}},{key:"getSvgIconFromUrl",value:function(t){var e=this,n=this._sanitizer.sanitize(Ir.RESOURCE_URL,t);if(!n)throw ox(t);var i=this._cachedIconsByUrl.get(n);return i?rp(cx(i)):this._loadSvgIconFromConfig(new ux(t,null)).pipe(Rv((function(t){return e._cachedIconsByUrl.set(n,t)})),nt((function(t){return cx(t)})))}},{key:"getNamedSvgIcon",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=dx(e,t),i=this._svgIconConfigs.get(n);if(i)return this._getSvgFromConfig(i);var r=this._iconSetConfigs.get(e);return r?this._getSvgFromIconSetConfigs(t,r):ap(ax(n))}},{key:"ngOnDestroy",value:function(){this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}},{key:"_getSvgFromConfig",value:function(t){return t.svgText?rp(cx(this._svgElementFromConfig(t))):this._loadSvgIconFromConfig(t).pipe(nt((function(t){return cx(t)})))}},{key:"_getSvgFromIconSetConfigs",value:function(t,e){var n=this,i=this._extractIconWithNameFromAnySet(t,e);return i?rp(i):zk(e.filter((function(t){return!t.svgText})).map((function(t){return n._loadSvgIconSetFromConfig(t).pipe(pp((function(e){var i=n._sanitizer.sanitize(Ir.RESOURCE_URL,t.url),r="Loading icon set URL: ".concat(i," failed: ").concat(e.message);return n._errorHandler.handleError(new Error(r)),rp(null)})))}))).pipe(nt((function(){var i=n._extractIconWithNameFromAnySet(t,e);if(!i)throw ax(t);return i})))}},{key:"_extractIconWithNameFromAnySet",value:function(t,e){for(var n=e.length-1;n>=0;n--){var i=e[n];if(i.svgText&&i.svgText.indexOf(t)>-1){var r=this._svgElementFromConfig(i),a=this._extractSvgIconFromSet(r,t,i.options);if(a)return a}}return null}},{key:"_loadSvgIconFromConfig",value:function(t){var e=this;return this._fetchIcon(t).pipe(Rv((function(e){return t.svgText=e})),nt((function(){return e._svgElementFromConfig(t)})))}},{key:"_loadSvgIconSetFromConfig",value:function(t){return t.svgText?rp(null):this._fetchIcon(t).pipe(Rv((function(e){return t.svgText=e})))}},{key:"_extractSvgIconFromSet",value:function(t,e,n){var i=t.querySelector('[id="'.concat(e,'"]'));if(!i)return null;var r=i.cloneNode(!0);if(r.removeAttribute("id"),"svg"===r.nodeName.toLowerCase())return this._setSvgAttributes(r,n);if("symbol"===r.nodeName.toLowerCase())return this._setSvgAttributes(this._toSvgElement(r),n);var a=this._svgElementFromString("");return a.appendChild(r),this._setSvgAttributes(a,n)}},{key:"_svgElementFromString",value:function(t){var e=this._document.createElement("DIV");e.innerHTML=t;var n=e.querySelector("svg");if(!n)throw Error(" tag not found");return n}},{key:"_toSvgElement",value:function(t){for(var e=this._svgElementFromString(""),n=t.attributes,i=0;i0&&e<10?this.addNumber(e.toString()):8===t.keyCode?this.removeNumber():13===t.keyCode&&this.sendPin()},e.prototype.addNumber=function(t){var e=this.form.value.pin;e.length<8&&this.form.get("pin").setValue(e+t)},e.prototype.removeNumber=function(){var t=this.form.value.pin;this.form.get("pin").setValue(t.substring(0,t.length-1))},e.prototype.sendPin=function(){this.form.valid&&this.dialogRef.close(this.form.value.pin)},e.\u0275fac=function(t){return new(t||e)(gs(kk),gs(bk),gs(YS),gs(Dk),gs(jk))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-pin-dialog"]],hostBindings:function(t,e){1&t&&Ts("keyup",(function(t){return e.keyEvent(t)}),!1,un)},features:[Jo],decls:90,vars:24,consts:[[3,"headline","dialog"],[3,"formGroup"],[1,"form-field","text-center"],[4,"ngIf"],[1,"link",3,"click"],["formControlName","pin","id","pin","type","password","readonly",""],[1,"light-button-theme"],[1,"num-pad-row"],["mat-button","","color","primary",3,"click"],[1,"material-icons"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n\n "),uu(3,"\n "),bs(4,"div",1),uu(5,"\n "),bs(6,"div",2),uu(7,"\n "),bs(8,"div"),uu(9,"\n "),ps(10,Tx,3,3,"span",3),uu(11,"\n "),ps(12,Ex,3,3,"span",3),uu(13,"\n "),ps(14,Ox,3,3,"span",3),uu(15,"\n "),bs(16,"span",4),Ts("click",(function(){return e.openHelp()})),uu(17),Tl(18,"translate"),ws(),uu(19,"\n "),ws(),uu(20,"\n "),ks(21,"input",5),uu(22,"\n "),ws(),uu(23,"\n "),ws(),uu(24,"\n\n "),uu(25,"\n "),bs(26,"div",6),uu(27,"\n "),bs(28,"div",7),uu(29,"\n "),bs(30,"button",8),Ts("click",(function(){return e.addNumber("7")})),bs(31,"span"),uu(32),ws(),ws(),uu(33,"\n "),bs(34,"button",8),Ts("click",(function(){return e.addNumber("8")})),bs(35,"span"),uu(36),ws(),ws(),uu(37,"\n "),bs(38,"button",8),Ts("click",(function(){return e.addNumber("9")})),bs(39,"span"),uu(40),ws(),ws(),uu(41,"\n "),ws(),uu(42,"\n "),bs(43,"div",7),uu(44,"\n "),bs(45,"button",8),Ts("click",(function(){return e.addNumber("4")})),bs(46,"span"),uu(47),ws(),ws(),uu(48,"\n "),bs(49,"button",8),Ts("click",(function(){return e.addNumber("5")})),bs(50,"span"),uu(51),ws(),ws(),uu(52,"\n "),bs(53,"button",8),Ts("click",(function(){return e.addNumber("6")})),bs(54,"span"),uu(55),ws(),ws(),uu(56,"\n "),ws(),uu(57,"\n "),bs(58,"div",7),uu(59,"\n "),bs(60,"button",8),Ts("click",(function(){return e.addNumber("1")})),bs(61,"span"),uu(62),ws(),ws(),uu(63,"\n "),bs(64,"button",8),Ts("click",(function(){return e.addNumber("2")})),bs(65,"span"),uu(66),ws(),ws(),uu(67,"\n "),bs(68,"button",8),Ts("click",(function(){return e.addNumber("3")})),bs(69,"span"),uu(70),ws(),ws(),uu(71,"\n "),ws(),uu(72,"\n "),bs(73,"div",7),uu(74,"\n "),bs(75,"button",8),Ts("click",(function(){return e.removeNumber()})),bs(76,"span",9),uu(77,"backspace"),ws(),ws(),uu(78,"\n "),ws(),uu(79,"\n "),ws(),uu(80,"\n\n "),uu(81,"\n "),bs(82,"div",10),uu(83,"\n "),bs(84,"app-button",11),Ts("action",(function(){return e.sendPin()})),uu(85),Tl(86,"translate"),ws(),uu(87,"\n "),ws(),uu(88,"\n"),ws(),uu(89,"\n")),2&t&&(_s("headline",El(1,18,e.title))("dialog",e.dialogRef),na(4),_s("formGroup",e.form),na(6),_s("ngIf",e.data.signingTx&&!e.data.changingPin),na(2),_s("ngIf",e.data.changingPin&&e.data.changePinState===e.changePinStates.RequestingNewPin),na(2),_s("ngIf",!(e.data.signingTx||e.data.changingPin&&e.data.changePinState===e.changePinStates.RequestingNewPin)),na(3),lu(El(18,20,"hardware-wallet.enter-pin.help")),na(15),lu(e.buttonsContent),na(4),lu(e.buttonsContent),na(4),lu(e.buttonsContent),na(7),lu(e.buttonsContent),na(4),lu(e.buttonsContent),na(4),lu(e.buttonsContent),na(7),lu(e.buttonsContent),na(4),lu(e.buttonsContent),na(4),lu(e.buttonsContent),na(14),_s("disabled",!e.form.valid),na(1),cu("\n ",El(86,22,"common.continue-button"),"\n "))},directives:[jS,rM,hS,Eh,Qk,iM,yS,XC,Cx],pipes:[pC],styles:["mat-form-field[_ngcontent-%COMP%]{width:100%}.form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{font-size:25px;line-height:1;letter-spacing:15px;text-align:center;margin-top:5px}.num-pad-row[_ngcontent-%COMP%]{display:flex}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{flex-grow:1;height:50px;border:1px solid rgba(30,34,39,.05);margin:2px}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#1e2227}"]}),e}(Lx),Px=function(){function t(){var t=this;this.lastSearchTerm="",this.searchRequestSubject=new z,this.wordMap=new Map,ot(n("+ix3")("./bip39-word-list.json")).subscribe((function(e){t.wordList=e.list,t.wordList.forEach((function(e){t.wordMap.set(e,!0)})),t.searchRequestSubject.next(t.lastSearchTerm)}))}return Object.defineProperty(t.prototype,"searchResults",{get:function(){var t=this;return this.searchRequestSubject.asObservable().pipe(Bv(100),nt((function(e){return e.length>1&&t.wordList?t.wordList.filter((function(t){return t.startsWith(e)})):[]})))},enumerable:!1,configurable:!0}),t.prototype.setSearchTerm=function(t){this.lastSearchTerm=t,this.wordList&&this.searchRequestSubject.next(t)},t.prototype.validateWord=function(t){return this.wordList?!!this.wordMap.has(t):null},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)}}),t}(),Ix=function(t){function e(e,n,i){var r=t.call(this,i,n)||this;return r.data=e,r.dialogRef=n,r}return Wk(e,t),e.openDialog=function(t,n){var i=new pk;return i.data=n,i.autoFocus=!1,i.width="600px",t.open(e,i)},e.\u0275fac=function(t){return new(t||e)(gs(kk),gs(bk),gs(jk))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-confirm-tx-dialog"]],features:[Jo],decls:9,vars:13,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","lowerText","icon","outputsList"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ks(4,"app-hw-message",1),Tl(5,"translate"),Tl(6,"translate"),uu(7,"\n"),ws(),uu(8,"\n")),2&t&&(_s("headline",El(1,7,"hardware-wallet.create-tx.title"))("dialog",e.dialogRef)("disableDismiss",!0),na(4),_s("text",El(5,9,"hardware-wallet.create-tx.upper-text"))("lowerText",El(6,11,"hardware-wallet.create-tx.lower-text"))("icon",e.msgIcons.Confirm)("outputsList",e.data))},directives:[jS,qC],pipes:[pC],styles:[""]}),e}(Lx),Yx=function(t){return t.CLIENT="client",t.NOTES="txid",t}({}),Rx=function(){function t(t){this.apiService=t}return t.prototype.get=function(t,e){var n={type:t};return e&&(n.key=e),this.apiService.get("data",n,{useV2:!0})},t.prototype.store=function(t,e,n){return this.apiService.post("data",{type:t,key:e,val:n},{useV2:!0})},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(ym))}}),t}(),Fx=function(){return function(t){Object.assign(this,t)}}(),Hx=function(){function t(t,e){this.translate=t,this.storageService=e,this.currentLanguageInternal=new fg(1),this.savedSelectedLanguageLoadedInternal=new fg(1),this.languagesInternal=[],this.storageKey="lang"}return Object.defineProperty(t.prototype,"currentLanguage",{get:function(){return this.currentLanguageInternal.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"savedSelectedLanguageLoaded",{get:function(){return this.savedSelectedLanguageLoadedInternal.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"languages",{get:function(){return this.languagesInternal},enumerable:!1,configurable:!0}),t.prototype.initialize=function(){var t=this,e=[];Mm.languages.forEach((function(n){var i=new Fx(n);t.languagesInternal.push(i),e.push(i.code)})),this.translate.addLangs(e),this.translate.setDefaultLang(Mm.defaultLanguage),this.translate.onLangChange.subscribe((function(e){return t.onLanguageChanged(e)})),this.loadCurrentLanguage()},t.prototype.changeLanguage=function(t){this.translate.use(t)},t.prototype.onLanguageChanged=function(t){this.currentLanguageInternal.next(this.languages.find((function(e){return e.code===t.lang}))),this.subscription&&this.subscription.unsubscribe(),this.subscription=this.storageService.store(Yx.CLIENT,this.storageKey,t.lang).subscribe()},t.prototype.loadCurrentLanguage=function(){var t=this;this.storageService.get(Yx.CLIENT,this.storageKey).subscribe((function(e){e.data&&-1!==t.translate.getLangs().indexOf(e.data)?(setTimeout((function(){t.changeLanguage(e.data)}),16),t.savedSelectedLanguageLoadedInternal.next(!0)):t.savedSelectedLanguageLoadedInternal.next(!1)}),(function(){t.savedSelectedLanguageLoadedInternal.next(!1)}))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(hC),ve(Rx))}}),t}();function Bx(t,e){if(1&t&&(bs(0,"div",9),bs(1,"mat-icon"),uu(2),ws(),ws()),2&t){var n=Ys(2);na(2),lu(n.config.icon)}}function jx(t,e){if(1&t&&(bs(0,"div",10),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(2);na(1),lu(El(2,1,n.config.title))}}function Nx(t,e){if(1&t&&(bs(0,"a",11),uu(1),ws()),2&t){var n=Ys(2);_s("href",n.config.link,Rr),na(1),lu(n.config.link)}}function Wx(t,e){if(1&t){var n=xs();bs(0,"div",1),uu(1,"\n "),bs(2,"div"),uu(3,"\n "),ps(4,Bx,3,1,"div",2),uu(5,"\n "),bs(6,"div",3),uu(7,"\n "),ps(8,jx,3,3,"div",4),uu(9,"\n "),bs(10,"div",5),uu(11),Tl(12,"translate"),ps(13,Nx,2,2,"a",6),ws(),uu(14,"\n "),ws(),uu(15,"\n "),bs(16,"div",7),bs(17,"mat-icon",8),Ts("click",(function(){return Bn(n),Ys().hide()})),uu(18,"close"),ws(),ws(),uu(19,"\n "),ws(),uu(20,"\n"),ws()}if(2&t){var i=Ys();na(2),$s(Te,Qs,"internal-container "+(i.config.color?i.config.color:"red-background"),!0),na(2),_s("ngIf",i.config.icon),na(4),_s("ngIf",i.config.title),na(3),cu("",El(12,6,i.config.text),"\n "),na(2),_s("ngIf",i.config.link)}}var Vx=function(t){return t.Error="error",t.Done="done",t.Warning="warning",t}({}),zx=function(t){return t.Red="red-background",t.Green="green-background",t.Yellow="yellow-background",t}({}),Ux=function(){return function(){}}(),qx=function(){function t(){this.config=new Ux,this.visible=!1}return t.prototype.show=function(){var t=this;this.visible?(this.visible=!1,setTimeout((function(){return t.visible=!0}),32)):this.visible=!0},t.prototype.hide=function(){this.visible=!1},t.\u0275fac=function(e){return new(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["app-msg-bar"]],decls:2,vars:1,consts:[["class","main-container",4,"ngIf"],[1,"main-container"],["class","icon-container",4,"ngIf"],[1,"text-container"],["class","title",4,"ngIf"],[1,"text"],["class","link","target","_blank","rel","noreferrer nofollow noopener",3,"href",4,"ngIf"],[1,"close-container"],[1,"image-button",3,"click"],[1,"icon-container"],[1,"title"],["target","_blank","rel","noreferrer nofollow noopener",1,"link",3,"href"]],template:function(t,e){1&t&&(ps(0,Wx,21,8,"div",0),uu(1,"\n")),2&t&&_s("ngIf",e.visible)},directives:[Eh,vx],pipes:[pC],styles:[".main-container[_ngcontent-%COMP%]{position:fixed;bottom:0;width:100%;z-index:1000000;display:flex;flex-direction:row;justify-content:center}.internal-container[_ngcontent-%COMP%]{color:#fff;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;min-width:40%;max-width:90%;display:flex;padding:10px;border-top-left-radius:6px;border-top-right-radius:6px}.red-background[_ngcontent-%COMP%]{background-color:rgba(255,0,0,.7)}.green-background[_ngcontent-%COMP%]{background-color:rgba(31,177,31,.7)}.yellow-background[_ngcontent-%COMP%]{background-color:rgba(255,94,0,.7)}.icon-container[_ngcontent-%COMP%], .text-container[_ngcontent-%COMP%]{margin-right:10px}.text-container[_ngcontent-%COMP%]{flex-grow:1}.text-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-size:15px;margin-top:-1px}.text-container[_ngcontent-%COMP%] .text[_ngcontent-%COMP%]{font-size:13px;margin-top:2px}.text-container[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:#fff}"]}),t}(),Gx=function(){function t(){}return Object.defineProperty(t.prototype,"msgBarComponent",{set:function(t){this.msgBarComponentInternal=t},enumerable:!1,configurable:!0}),t.prototype.hide=function(){this.msgBarComponentInternal&&this.msgBarComponentInternal.hide()},t.prototype.showError=function(t,e){void 0===e&&(e=2e4);var n=new Ux;n.text=gm(t).translatableErrorMsg,n.title="common.error-title",n.icon=Vx.Error,n.color=zx.Red,t.type&&t.type===pm.DaemonConnectionError&&(n.text="hardware-wallet.errors.daemon-connection-with-configurable-link",n.link=Mm.hwWalletDaemonDownloadUrl),this.show(n),this.setTimer(e)},t.prototype.showWarning=function(t,e){void 0===e&&(e=2e4);var n=new Ux;n.text=gm(t).translatableErrorMsg,n.title="common.warning-title",n.icon=Vx.Warning,n.color=zx.Yellow,this.show(n),this.setTimer(e)},t.prototype.showDone=function(t,e){void 0===e&&(e=1e4);var n=new Ux;n.text=t,n.title="common.done-title",n.icon=Vx.Done,n.color=zx.Green,this.show(n),this.setTimer(e)},t.prototype.show=function(t){this.msgBarComponentInternal&&(this.msgBarComponentInternal.config=t,this.msgBarComponentInternal.show())},t.prototype.setTimer=function(t){var e=this;void 0===t&&(t=1e4),this.timeSubscription&&this.timeSubscription.unsubscribe(),this.timeSubscription=rp(1).pipe(up(t)).subscribe((function(){return e.hide()}))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)}}),t}();function Kx(t,e){1&t&&(ks(0,"app-hw-message",11),Tl(1,"translate"),Tl(2,"translate")),2&t&&_s("upperBigText",El(1,2,"hardware-wallet.seed-word.enter-word"))("text",El(2,4,"hardware-wallet.seed-word.info"))}var Zx=function(t){return{number:t}};function Jx(t,e){if(1&t&&(ks(0,"app-hw-message",11),Tl(1,"translate"),Tl(2,"translate")),2&t){var n=Ys();_s("upperBigText",Ol(1,2,"wallet.new.seed.enter-word",kl(7,Zx,n.data.wordNumber)))("text",El(2,5,n.data.reason===n.wordAskedReasons.CreatingSoftwareWallet?"wallet.new.seed.new-seed-info":"wallet.new.seed.recover-seed-info"))}}function Qx(t,e){1&t&&(bs(0,"label",12),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),lu(El(2,1,"hardware-wallet.seed-word.word-label")))}function Xx(t,e){if(1&t){var n=xs();bs(0,"mat-option",13),Ts("click",(function(){return Bn(n),Ys().sendWord()})),uu(1),ws()}if(2&t){var i=e.$implicit;_s("value",i),na(1),lu(i)}}var $x=function(t){return t.HWWalletOperation="HWWalletOperation",t.CreatingSoftwareWallet="CreatingSoftwareWallet",t.RecoveringSoftwareWallet="RecoveringSoftwareWallet",t}({}),tD=function(){function t(t,e,n,i,r,a,o){var s=this;this.data=t,this.dialogRef=e,this.formBuilder=n,this.bip38WordList=i,this.msgBarService=r,this.translateService=a,this.msgIcons=UC,this.wordAskedReasons=$x,this.inputErrorMsg="",this.sendingWord=!1,t.reason===$x.HWWalletOperation&&(this.hwConnectionSubscription=o.walletConnectedAsyncEvent.subscribe((function(t){t||s.dialogRef.close()})))}return t.openDialog=function(e,n){var i=new pk;return i.data=n,i.autoFocus=!0,i.width="350px",e.open(t,i)},t.prototype.ngOnInit=function(){var t=this;this.form=this.formBuilder.group({word:[""]}),this.form.setValidators(this.validateForm.bind(this)),this.valueChangeSubscription=this.form.controls.word.valueChanges.subscribe((function(e){t.bip38WordList.setSearchTerm(e.trim().toLowerCase())})),this.filteredOptions=this.bip38WordList.searchResults.pipe(nt((function(t){return t})))},t.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.valueChangeSubscription.unsubscribe(),this.hwConnectionSubscription&&this.hwConnectionSubscription.unsubscribe()},t.prototype.sendWord=function(){var t=this;this.sendingWord||(this.sendingWord=!0,this.msgBarService.hide(),setTimeout((function(){if(t.form.valid){var e=t.bip38WordList.validateWord(t.form.value.word.trim().toLowerCase());e?t.dialogRef.close(t.form.value.word.trim().toLowerCase()):t.msgBarService.showError(t.translateService.instant(null===e?"hardware-wallet.seed-word.error-loading-words":"hardware-wallet.seed-word.error-invalid-word"))}t.sendingWord=!1}),32))},t.prototype.validateForm=function(){this.inputErrorMsg="";var t=!0;return this.form.get("word").value||(t=!1,this.form.get("word").touched&&(this.inputErrorMsg="wallet.new.seed.word-error-info")),t?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(gs(kk),gs(bk),gs(YS),gs(Px),gs(Gx),gs(hC),gs(jk))},t.\u0275cmp=Fe({type:t,selectors:[["app-seed-word-dialog"]],decls:34,vars:18,consts:[[3,"headline","dialog"],[3,"upperBigText","text",4,"ngIf"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],["for","word",4,"ngIf"],["matInput","","formControlName","word","id","word",3,"matAutocomplete","appFormFieldError","keydown.enter","blur"],[3,"autoActiveFirstOption"],["auto","matAutocomplete"],["class","option",3,"value","click",4,"ngFor","ngForOf"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"],[3,"upperBigText","text"],["for","word"],[1,"option",3,"value","click"]],template:function(t,e){if(1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ps(4,Kx,3,6,"app-hw-message",1),uu(5,"\n "),ps(6,Jx,3,9,"app-hw-message",1),uu(7,"\n\n "),uu(8,"\n "),bs(9,"div",2),uu(10,"\n "),bs(11,"div",3),uu(12,"\n "),ps(13,Qx,3,3,"label",4),uu(14,"\n "),bs(15,"input",5),Ts("keydown.enter",(function(){return e.sendWord()}))("blur",(function(){return e.validateForm()})),ws(),uu(16,"\n "),bs(17,"mat-autocomplete",6,7),uu(19,"\n "),ps(20,Xx,2,2,"mat-option",8),Tl(21,"async"),uu(22,"\n "),ws(),uu(23,"\n "),ws(),uu(24,"\n "),ws(),uu(25,"\n "),bs(26,"div",9),uu(27,"\n "),bs(28,"app-button",10),Ts("action",(function(){return e.sendWord()})),uu(29),Tl(30,"translate"),ws(),uu(31,"\n "),ws(),uu(32,"\n"),ws(),uu(33,"\n")),2&t){var n=ms(18);_s("headline",El(1,12,e.data.reason===e.wordAskedReasons.HWWalletOperation?"hardware-wallet.seed-word.title":"wallet.new.seed-label"))("dialog",e.dialogRef),na(4),_s("ngIf",e.data.reason===e.wordAskedReasons.HWWalletOperation),na(2),_s("ngIf",e.data.reason!==e.wordAskedReasons.HWWalletOperation),na(3),_s("formGroup",e.form),na(4),_s("ngIf",e.data.reason===e.wordAskedReasons.HWWalletOperation),na(2),_s("matAutocomplete",n)("appFormFieldError",e.inputErrorMsg),na(2),_s("autoActiveFirstOption",!0),na(3),_s("ngForOf",El(21,14,e.filteredOptions)),na(8),_s("disabled",!e.form.valid),na(1),cu("\n ",El(30,16,"common.continue-button"),"\n ")}},styles:[".option[_ngcontent-%COMP%]{font-size:13px;height:42px}"]}),t}();function eD(t,e){if(1&t){var n=xs();bs(0,"button",3),Ts("click",(function(){Bn(n);var t=e.$implicit;return Ys().closePopup(t)})),uu(1,"\n "),ks(2,"img",4),uu(3,"\n "),bs(4,"div",5),uu(5),ws(),uu(6,"\n "),ws()}if(2&t){var i=e.$implicit;na(2),_s("src","assets/img/lang/"+i.iconName,Rr),na(3),lu(i.name)}}var nD=function(){function t(t,e){this.dialogRef=t,this.languageService=e}return t.openDialog=function(e,n){void 0===n&&(n=!1);var i=new pk;return i.autoFocus=!1,i.disableClose=n,i.width="600px",e.open(t,i)},t.prototype.ngOnInit=function(){this.disableDismiss=this.dialogRef.disableClose,this.languages=this.languageService.languages},t.prototype.closePopup=function(t){void 0===t&&(t=null),t&&this.languageService.changeLanguage(t.code),this.dialogRef.close()},t.\u0275fac=function(e){return new(e||t)(gs(bk),gs(Hx))},t.\u0275cmp=Fe({type:t,selectors:[["app-select-language"]],decls:9,vars:6,consts:[[1,"e2e-language-modal",3,"headline","disableDismiss","dialog"],[1,"options-container","light-button-theme"],["mat-button","","color","primary","class","button",3,"click",4,"ngFor","ngForOf"],["mat-button","","color","primary",1,"button",3,"click"],[3,"src"],[1,"label"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),bs(3,"div",1),uu(4,"\n "),ps(5,eD,7,2,"button",2),uu(6,"\n "),ws(),uu(7,"\n"),ws(),uu(8,"\n")),2&t&&(_s("headline",El(1,4,"language.title"))("disableDismiss",e.disableDismiss)("dialog",e.dialogRef),na(5),_s("ngForOf",e.languages))},directives:[jS,Lh,XC],pipes:[pC],styles:[".options-container[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%]{width:118px;margin:20px;font-size:12px;line-height:1.4;padding:0;min-width:0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:64px;height:64px;margin:10px 0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);padding:4px 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#1e2227}"]}),t}(),iD=function(){return function(){this.label="",this.id="",this.addresses=[],this.encrypted=!1,this.isHardware=!1,this.hasHwSecurityWarnings=!1,this.stopShowingHwSecurityPopup=!1}}(),rD=function(){return function(){this.address="",this.confirmed=!1}}();function aD(t,e){var n=new iD;return Object.assign(n,t),sD(!0,n),n.addresses=[],e&&t.addresses.forEach((function(t){n.addresses.push(oD(t))})),n}function oD(t){var e=new rD;return Object.assign(e,t),sD(!1,e),e}function sD(t,e){var n=new Map,i=t?new iD:new rD;Object.keys(i).forEach((function(t){n.set(t,!0)}));var r=[];Object.keys(e).forEach((function(t){n.has(t)||r.push(t)})),r.forEach((function(t){delete e[t]}))}var uD=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.coins=new fp.a(0),e.hours=new fp.a(0),e.addresses=[],e}return Wk(e,t),e}(iD),lD=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.coins=new fp.a(0),e.hours=new fp.a(0),e}return Wk(e,t),e}(rD),cD=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.addresses=[],e}return Wk(e,t),e}(iD),dD=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.outputs=[],e}return Wk(e,t),e}(rD),hD=function(){function t(t,e,n,i){this.apiService=t,this.hwWalletService=e,this.translate=n,this.storageService=i,this.hwWalletsDataStorageKey="hw-wallets",this.walletsSubject=new fg(1),this.initialLoadFailed=new Cm(!1),this.loadWallets()}return Object.defineProperty(t.prototype,"errorDuringinitialLoad",{get:function(){return this.initialLoadFailed.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"allWallets",{get:function(){return this.walletsSubject.asObservable()},enumerable:!1,configurable:!0}),t.prototype.addAddressesToWallet=function(t,e,n){var i=this;if(t.isHardware)return this.hwWalletService.getAddresses(e,t.addresses.length).pipe(nt((function(e){var n=i.walletsList.find((function(e){return e.id===t.id})),r=[];return e.rawResponse.forEach((function(t){var e={address:t,confirmed:!1};r.push(e),n.addresses.push(e)})),i.saveHardwareWalletsAndInformUpdate(),r})));var r=new Object;return r.id=t.id,r.num=e,n&&(r.password=n),this.apiService.post("wallet/newAddress",r).pipe(nt((function(e){var n=i.walletsList.find((function(e){return e.id===t.id})),r=[];return e.addresses.forEach((function(t){var e={address:t,confirmed:!0};r.push(e),n.addresses.push(e)})),i.informDataUpdated(),r})))},t.prototype.scanAddresses=function(t,e){var n=this;if(t.isHardware)return rp(!1);var i=new Object;return i.id=t.id,e&&(i.password=e),this.apiService.post("wallet/scan",i).pipe(nt((function(e){var i=n.walletsList.find((function(e){return e.id===t.id})),r=e.addresses;return!!(r&&r.length>0)&&(r.forEach((function(t){i.addresses.push({address:t,confirmed:!0})})),n.informDataUpdated(),!0)})))},t.prototype.informValuesUpdated=function(t){var e=this.walletsList.findIndex((function(e){return e.id===t.id}));if(-1!==e){var n=aD(t,!0);this.walletsList[e]=n,t.isHardware?this.saveHardwareWalletsAndInformUpdate():this.informDataUpdated()}},t.prototype.createSoftwareWallet=function(t,e,n){var i=this,r={label:t||"undefined",seed:e=e.replace(/(\n|\r\n)$/,""),scan:100,type:"deterministic"};return n&&(r.password=n,r.encrypt=!0),this.apiService.post("wallet/create",r).pipe(nt((function(t){var e={label:t.meta.label,id:t.meta.filename,addresses:[],encrypted:t.meta.encrypted,isHardware:!1,hasHwSecurityWarnings:!1,stopShowingHwSecurityPopup:!0};t.entries.forEach((function(t){return e.addresses.push({address:t.address,confirmed:!0})})),i.walletsList.push(e),i.informDataUpdated()})))},t.prototype.createHardwareWallet=function(){var t,e=this,n=0,i=new Map,r=new Map;return this.hwWalletService.getAddresses(Mm.maxHardwareWalletAddresses,0).pipe(st((function(n){(t=n.rawResponse).forEach((function(t){i.set(t,!0)}));var r=!1;if(e.walletsList.forEach((function(t){i.has(t.id)&&(r=!0)})),r)return ap(gm("The wallet already exists"));var a=t.join(",");return e.apiService.post("transactions",{addrs:a})})),nt((function(a){a.forEach((function(t){t.txn.outputs.forEach((function(t){i.has(t.dst)&&r.set(t.dst,!0)}))})),t.forEach((function(t,e){r.has(t)&&(n=e)}));var o=e.createHardwareWalletData(e.translate.instant("hardware-wallet.general.default-wallet-name"),t.slice(0,n+1).map((function(t){return{address:t,confirmed:!1}})),!0,!1);o.id=o.addresses[0].address;for(var s=e.walletsList.length-1,u=0;u2&&void 0!==arguments[2]?arguments[2]:"imperative",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;return _(this,n),(r=e.call(this,t,i)).navigationTrigger=a,r.restoredState=o,r}return b(n,[{key:"toString",value:function(){return"NavigationStart(id: ".concat(this.id,", url: '").concat(this.url,"')")}}]),n}(vD),yD=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,t,i)).urlAfterRedirects=r,a}return b(n,[{key:"toString",value:function(){return"NavigationEnd(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"')")}}]),n}(vD),bD=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,t,i)).reason=r,a}return b(n,[{key:"toString",value:function(){return"NavigationCancel(id: ".concat(this.id,", url: '").concat(this.url,"')")}}]),n}(vD),wD=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,t,i)).error=r,a}return b(n,[{key:"toString",value:function(){return"NavigationError(id: ".concat(this.id,", url: '").concat(this.url,"', error: ").concat(this.error,")")}}]),n}(vD),kD=function(t){f(n,t);var e=v(n);function n(t,i,r,a){var o;return _(this,n),(o=e.call(this,t,i)).urlAfterRedirects=r,o.state=a,o}return b(n,[{key:"toString",value:function(){return"RoutesRecognized(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(vD),MD=function(t){f(n,t);var e=v(n);function n(t,i,r,a){var o;return _(this,n),(o=e.call(this,t,i)).urlAfterRedirects=r,o.state=a,o}return b(n,[{key:"toString",value:function(){return"GuardsCheckStart(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(vD),SD=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o){var s;return _(this,n),(s=e.call(this,t,i)).urlAfterRedirects=r,s.state=a,s.shouldActivate=o,s}return b(n,[{key:"toString",value:function(){return"GuardsCheckEnd(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,", shouldActivate: ").concat(this.shouldActivate,")")}}]),n}(vD),CD=function(t){f(n,t);var e=v(n);function n(t,i,r,a){var o;return _(this,n),(o=e.call(this,t,i)).urlAfterRedirects=r,o.state=a,o}return b(n,[{key:"toString",value:function(){return"ResolveStart(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(vD),xD=function(t){f(n,t);var e=v(n);function n(t,i,r,a){var o;return _(this,n),(o=e.call(this,t,i)).urlAfterRedirects=r,o.state=a,o}return b(n,[{key:"toString",value:function(){return"ResolveEnd(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(vD),DD=function(){function t(e){_(this,t),this.route=e}return b(t,[{key:"toString",value:function(){return"RouteConfigLoadStart(path: ".concat(this.route.path,")")}}]),t}(),LD=function(){function t(e){_(this,t),this.route=e}return b(t,[{key:"toString",value:function(){return"RouteConfigLoadEnd(path: ".concat(this.route.path,")")}}]),t}(),TD=function(){function t(e){_(this,t),this.snapshot=e}return b(t,[{key:"toString",value:function(){return"ChildActivationStart(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),t}(),ED=function(){function t(e){_(this,t),this.snapshot=e}return b(t,[{key:"toString",value:function(){return"ChildActivationEnd(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),t}(),OD=function(){function t(e){_(this,t),this.snapshot=e}return b(t,[{key:"toString",value:function(){return"ActivationStart(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),t}(),AD=function(){function t(e){_(this,t),this.snapshot=e}return b(t,[{key:"toString",value:function(){return"ActivationEnd(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),t}(),PD=function(){function t(e,n,i){_(this,t),this.routerEvent=e,this.position=n,this.anchor=i}return b(t,[{key:"toString",value:function(){var t=this.position?"".concat(this.position[0],", ").concat(this.position[1]):null;return"Scroll(anchor: '".concat(this.anchor,"', position: '").concat(t,"')")}}]),t}(),ID="primary",YD=function(){function t(e){_(this,t),this.params=e||{}}return b(t,[{key:"has",value:function(t){return Object.prototype.hasOwnProperty.call(this.params,t)}},{key:"get",value:function(t){if(this.has(t)){var e=this.params[t];return Array.isArray(e)?e[0]:e}return null}},{key:"getAll",value:function(t){if(this.has(t)){var e=this.params[t];return Array.isArray(e)?e:[e]}return[]}},{key:"keys",get:function(){return Object.keys(this.params)}}]),t}();function RD(t){return new YD(t)}function FD(t){var e=Error("NavigationCancelingError: "+t);return e.ngNavigationCancelingError=!0,e}function HD(t,e,n){var i=n.path.split("/");if(i.length>t.length)return null;if("full"===n.pathMatch&&(e.hasChildren()||i.length0?t[t.length-1]:null}function VD(t,e){for(var n in t)t.hasOwnProperty(n)&&e(t[n],n)}function zD(t){return Ls(t)?t:Ds(t)?ot(Promise.resolve(t)):rp(t)}function UD(t,e,n){return n?function(t,e){return BD(t,e)}(t.queryParams,e.queryParams)&&function t(e,n){if(!ZD(e.segments,n.segments))return!1;if(e.numberOfChildren!==n.numberOfChildren)return!1;for(var i in n.children){if(!e.children[i])return!1;if(!t(e.children[i],n.children[i]))return!1}return!0}(t.root,e.root):function(t,e){return Object.keys(e).length<=Object.keys(t).length&&Object.keys(e).every((function(n){return jD(t[n],e[n])}))}(t.queryParams,e.queryParams)&&function t(e,n){return function e(n,i,r){if(n.segments.length>r.length)return!!ZD(n.segments.slice(0,r.length),r)&&!i.hasChildren();if(n.segments.length===r.length){if(!ZD(n.segments,r))return!1;for(var a in i.children){if(!n.children[a])return!1;if(!t(n.children[a],i.children[a]))return!1}return!0}var o=r.slice(0,n.segments.length),s=r.slice(n.segments.length);return!!ZD(n.segments,o)&&!!n.children.primary&&e(n.children.primary,i,s)}(e,n,n.segments)}(t.root,e.root)}var qD=function(){function t(e,n,i){_(this,t),this.root=e,this.queryParams=n,this.fragment=i}return b(t,[{key:"toString",value:function(){return $D.serialize(this)}},{key:"queryParamMap",get:function(){return this._queryParamMap||(this._queryParamMap=RD(this.queryParams)),this._queryParamMap}}]),t}(),GD=function(){function t(e,n){var i=this;_(this,t),this.segments=e,this.children=n,this.parent=null,VD(n,(function(t,e){return t.parent=i}))}return b(t,[{key:"hasChildren",value:function(){return this.numberOfChildren>0}},{key:"toString",value:function(){return tL(this)}},{key:"numberOfChildren",get:function(){return Object.keys(this.children).length}}]),t}(),KD=function(){function t(e,n){_(this,t),this.path=e,this.parameters=n}return b(t,[{key:"toString",value:function(){return oL(this)}},{key:"parameterMap",get:function(){return this._parameterMap||(this._parameterMap=RD(this.parameters)),this._parameterMap}}]),t}();function ZD(t,e){return t.length===e.length&&t.every((function(t,n){return t.path===e[n].path}))}function JD(t,e){var n=[];return VD(t.children,(function(t,i){i===ID&&(n=n.concat(e(t,i)))})),VD(t.children,(function(t,i){i!==ID&&(n=n.concat(e(t,i)))})),n}var QD=function t(){_(this,t)},XD=function(){function t(){_(this,t)}return b(t,[{key:"parse",value:function(t){var e=new dL(t);return new qD(e.parseRootSegment(),e.parseQueryParams(),e.parseFragment())}},{key:"serialize",value:function(t){var e,n,i="/".concat(function t(e,n){if(!e.hasChildren())return tL(e);if(n){var i=e.children.primary?t(e.children.primary,!1):"",r=[];return VD(e.children,(function(e,n){n!==ID&&r.push("".concat(n,":").concat(t(e,!1)))})),r.length>0?"".concat(i,"(").concat(r.join("//"),")"):i}var a=JD(e,(function(n,i){return i===ID?[t(e.children.primary,!1)]:["".concat(i,":").concat(t(n,!1))]}));return 1===Object.keys(e.children).length&&null!=e.children.primary?"".concat(tL(e),"/").concat(a[0]):"".concat(tL(e),"/(").concat(a.join("//"),")")}(t.root,!0)),r=(e=t.queryParams,(n=Object.keys(e).map((function(t){var n=e[t];return Array.isArray(n)?n.map((function(e){return"".concat(nL(t),"=").concat(nL(e))})).join("&"):"".concat(nL(t),"=").concat(nL(n))}))).length?"?".concat(n.join("&")):""),a="string"==typeof t.fragment?"#".concat(encodeURI(t.fragment)):"";return"".concat(i).concat(r).concat(a)}}]),t}(),$D=new XD;function tL(t){return t.segments.map((function(t){return oL(t)})).join("/")}function eL(t){return encodeURIComponent(t).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function nL(t){return eL(t).replace(/%3B/gi,";")}function iL(t){return eL(t).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function rL(t){return decodeURIComponent(t)}function aL(t){return rL(t.replace(/\+/g,"%20"))}function oL(t){return"".concat(iL(t.path)).concat((e=t.parameters,Object.keys(e).map((function(t){return";".concat(iL(t),"=").concat(iL(e[t]))})).join("")));var e}var sL=/^[^\/()?;=#]+/;function uL(t){var e=t.match(sL);return e?e[0]:""}var lL=/^[^=?&#]+/,cL=/^[^?&#]+/,dL=function(){function t(e){_(this,t),this.url=e,this.remaining=e}return b(t,[{key:"parseRootSegment",value:function(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new GD([],{}):new GD([],this.parseChildren())}},{key:"parseQueryParams",value:function(){var t={};if(this.consumeOptional("?"))do{this.parseQueryParam(t)}while(this.consumeOptional("&"));return t}},{key:"parseFragment",value:function(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}},{key:"parseChildren",value:function(){if(""===this.remaining)return{};this.consumeOptional("/");var t=[];for(this.peekStartsWith("(")||t.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),t.push(this.parseSegment());var e={};this.peekStartsWith("/(")&&(this.capture("/"),e=this.parseParens(!0));var n={};return this.peekStartsWith("(")&&(n=this.parseParens(!1)),(t.length>0||Object.keys(e).length>0)&&(n.primary=new GD(t,e)),n}},{key:"parseSegment",value:function(){var t=uL(this.remaining);if(""===t&&this.peekStartsWith(";"))throw new Error("Empty path url segment cannot have parameters: '".concat(this.remaining,"'."));return this.capture(t),new KD(rL(t),this.parseMatrixParams())}},{key:"parseMatrixParams",value:function(){for(var t={};this.consumeOptional(";");)this.parseParam(t);return t}},{key:"parseParam",value:function(t){var e=uL(this.remaining);if(e){this.capture(e);var n="";if(this.consumeOptional("=")){var i=uL(this.remaining);i&&this.capture(n=i)}t[rL(e)]=rL(n)}}},{key:"parseQueryParam",value:function(t){var e,n=(e=this.remaining.match(lL))?e[0]:"";if(n){this.capture(n);var i="";if(this.consumeOptional("=")){var r=function(t){var e=t.match(cL);return e?e[0]:""}(this.remaining);r&&this.capture(i=r)}var a=aL(n),o=aL(i);if(t.hasOwnProperty(a)){var s=t[a];Array.isArray(s)||(t[a]=s=[s]),s.push(o)}else t[a]=o}}},{key:"parseParens",value:function(t){var e={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){var n=uL(this.remaining),i=this.remaining[n.length];if("/"!==i&&")"!==i&&";"!==i)throw new Error("Cannot parse url '".concat(this.url,"'"));var r=void 0;n.indexOf(":")>-1?(r=n.substr(0,n.indexOf(":")),this.capture(r),this.capture(":")):t&&(r=ID);var a=this.parseChildren();e[r]=1===Object.keys(a).length?a.primary:new GD([],a),this.consumeOptional("//")}return e}},{key:"peekStartsWith",value:function(t){return this.remaining.startsWith(t)}},{key:"consumeOptional",value:function(t){return!!this.peekStartsWith(t)&&(this.remaining=this.remaining.substring(t.length),!0)}},{key:"capture",value:function(t){if(!this.consumeOptional(t))throw new Error('Expected "'.concat(t,'".'))}}]),t}(),hL=function(){function t(e){_(this,t),this._root=e}return b(t,[{key:"parent",value:function(t){var e=this.pathFromRoot(t);return e.length>1?e[e.length-2]:null}},{key:"children",value:function(t){var e=fL(t,this._root);return e?e.children.map((function(t){return t.value})):[]}},{key:"firstChild",value:function(t){var e=fL(t,this._root);return e&&e.children.length>0?e.children[0].value:null}},{key:"siblings",value:function(t){var e=pL(t,this._root);return e.length<2?[]:e[e.length-2].children.map((function(t){return t.value})).filter((function(e){return e!==t}))}},{key:"pathFromRoot",value:function(t){return pL(t,this._root).map((function(t){return t.value}))}},{key:"root",get:function(){return this._root.value}}]),t}();function fL(t,e){if(t===e.value)return e;var n,i=d(e.children);try{for(i.s();!(n=i.n()).done;){var r=fL(t,n.value);if(r)return r}}catch(a){i.e(a)}finally{i.f()}return null}function pL(t,e){if(t===e.value)return[e];var n,i=d(e.children);try{for(i.s();!(n=i.n()).done;){var r=pL(t,n.value);if(r.length)return r.unshift(e),r}}catch(a){i.e(a)}finally{i.f()}return[]}var mL=function(){function t(e,n){_(this,t),this.value=e,this.children=n}return b(t,[{key:"toString",value:function(){return"TreeNode(".concat(this.value,")")}}]),t}();function gL(t){var e={};return t&&t.children.forEach((function(t){return e[t.value.outlet]=t})),e}var vL=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,t)).snapshot=i,SL(a(r),t),r}return b(n,[{key:"toString",value:function(){return this.snapshot.toString()}}]),n}(hL);function _L(t,e){var n=function(t,e){var n=new kL([],{},{},"",{},ID,e,null,t.root,-1,{});return new ML("",new mL(n,[]))}(t,e),i=new Cm([new KD("",{})]),r=new Cm({}),a=new Cm({}),o=new Cm({}),s=new Cm(""),u=new yL(i,r,o,s,a,ID,e,n.root);return u.snapshot=n.root,new vL(new mL(u,[]),n)}var yL=function(){function t(e,n,i,r,a,o,s,u){_(this,t),this.url=e,this.params=n,this.queryParams=i,this.fragment=r,this.data=a,this.outlet=o,this.component=s,this._futureSnapshot=u}return b(t,[{key:"toString",value:function(){return this.snapshot?this.snapshot.toString():"Future(".concat(this._futureSnapshot,")")}},{key:"routeConfig",get:function(){return this._futureSnapshot.routeConfig}},{key:"root",get:function(){return this._routerState.root}},{key:"parent",get:function(){return this._routerState.parent(this)}},{key:"firstChild",get:function(){return this._routerState.firstChild(this)}},{key:"children",get:function(){return this._routerState.children(this)}},{key:"pathFromRoot",get:function(){return this._routerState.pathFromRoot(this)}},{key:"paramMap",get:function(){return this._paramMap||(this._paramMap=this.params.pipe(nt((function(t){return RD(t)})))),this._paramMap}},{key:"queryParamMap",get:function(){return this._queryParamMap||(this._queryParamMap=this.queryParams.pipe(nt((function(t){return RD(t)})))),this._queryParamMap}}]),t}();function bL(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"emptyOnly",n=t.pathFromRoot,i=0;if("always"!==e)for(i=n.length-1;i>=1;){var r=n[i],a=n[i-1];if(r.routeConfig&&""===r.routeConfig.path)i--;else{if(a.component)break;i--}}return wL(n.slice(i))}function wL(t){return t.reduce((function(t,e){return{params:Object.assign(Object.assign({},t.params),e.params),data:Object.assign(Object.assign({},t.data),e.data),resolve:Object.assign(Object.assign({},t.resolve),e._resolvedData)}}),{params:{},data:{},resolve:{}})}var kL=function(){function t(e,n,i,r,a,o,s,u,l,c,d){_(this,t),this.url=e,this.params=n,this.queryParams=i,this.fragment=r,this.data=a,this.outlet=o,this.component=s,this.routeConfig=u,this._urlSegment=l,this._lastPathIndex=c,this._resolve=d}return b(t,[{key:"toString",value:function(){var t=this.url.map((function(t){return t.toString()})).join("/"),e=this.routeConfig?this.routeConfig.path:"";return"Route(url:'".concat(t,"', path:'").concat(e,"')")}},{key:"root",get:function(){return this._routerState.root}},{key:"parent",get:function(){return this._routerState.parent(this)}},{key:"firstChild",get:function(){return this._routerState.firstChild(this)}},{key:"children",get:function(){return this._routerState.children(this)}},{key:"pathFromRoot",get:function(){return this._routerState.pathFromRoot(this)}},{key:"paramMap",get:function(){return this._paramMap||(this._paramMap=RD(this.params)),this._paramMap}},{key:"queryParamMap",get:function(){return this._queryParamMap||(this._queryParamMap=RD(this.queryParams)),this._queryParamMap}}]),t}(),ML=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,i)).url=t,SL(a(r),i),r}return b(n,[{key:"toString",value:function(){return CL(this._root)}}]),n}(hL);function SL(t,e){e.value._routerState=t,e.children.forEach((function(e){return SL(t,e)}))}function CL(t){var e=t.children.length>0?" { ".concat(t.children.map(CL).join(", ")," } "):"";return"".concat(t.value).concat(e)}function xL(t){if(t.snapshot){var e=t.snapshot,n=t._futureSnapshot;t.snapshot=n,BD(e.queryParams,n.queryParams)||t.queryParams.next(n.queryParams),e.fragment!==n.fragment&&t.fragment.next(n.fragment),BD(e.params,n.params)||t.params.next(n.params),function(t,e){if(t.length!==e.length)return!1;for(var n=0;nr;){if(a-=r,!(i=i.parent))throw new Error("Invalid number of '../'");r=i.segments.length}return new PL(i,!1,r-a)}(n.snapshot._urlSegment,n.snapshot._lastPathIndex+r,t.numberOfDoubleDots)}(a,e,t),s=o.processChildren?YL(o.segmentGroup,o.index,a.commands):IL(o.segmentGroup,o.index,a.commands);return OL(o.segmentGroup,s,e,i,r)}function TL(t){return"object"==typeof t&&null!=t&&!t.outlets&&!t.segmentPath}function EL(t){return"object"==typeof t&&null!=t&&t.outlets}function OL(t,e,n,i,r){var a={};return i&&VD(i,(function(t,e){a[e]=Array.isArray(t)?t.map((function(t){return"".concat(t)})):"".concat(t)})),new qD(n.root===t?e:function t(e,n,i){var r={};return VD(e.children,(function(e,a){r[a]=e===n?i:t(e,n,i)})),new GD(e.segments,r)}(n.root,t,e),a,r)}var AL=function(){function t(e,n,i){if(_(this,t),this.isAbsolute=e,this.numberOfDoubleDots=n,this.commands=i,e&&i.length>0&&TL(i[0]))throw new Error("Root segment cannot have matrix parameters");var r=i.find(EL);if(r&&r!==WD(i))throw new Error("{outlets:{}} has to be the last command")}return b(t,[{key:"toRoot",value:function(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]}}]),t}(),PL=function t(e,n,i){_(this,t),this.segmentGroup=e,this.processChildren=n,this.index=i};function IL(t,e,n){if(t||(t=new GD([],{})),0===t.segments.length&&t.hasChildren())return YL(t,e,n);var i=function(t,e,n){for(var i=0,r=e,a={match:!1,pathIndex:0,commandIndex:0};r=n.length)return a;var o=t.segments[r],s=n[i];if(EL(s))break;var u="".concat(s),l=i0&&void 0===u)break;if(u&&l&&"object"==typeof l&&void 0===l.outlets){if(!BL(u,l,o))return a;i+=2}else{if(!BL(u,{},o))return a;i++}r++}return{match:!0,pathIndex:r,commandIndex:i}}(t,e,n),r=n.slice(i.commandIndex);if(i.match&&i.pathIndex0?new GD([],c({},ID,t)):t;return new qD(i,e,n)}},{key:"expandSegmentGroup",value:function(t,e,n,i){return 0===n.segments.length&&n.hasChildren()?this.expandChildren(t,e,n).pipe(nt((function(t){return new GD([],t)}))):this.expandSegment(t,n,e,n.segments,i,!0)}},{key:"expandChildren",value:function(t,e,n){var i=this;return function(n,r){if(0===Object.keys(n).length)return rp({});var a=[],o=[],s={};return VD(n,(function(n,r){var u,l,c=(u=r,l=n,i.expandSegmentGroup(t,e,l,u)).pipe(nt((function(t){return s[r]=t})));r===ID?a.push(c):o.push(c)})),rp.apply(null,a.concat(o)).pipe(ng(),function(t,e){var n=arguments.length>=2;return function(i){return i.pipe(t?_p((function(e,n){return t(e,n,i)})):ct,zS(1),n?Cp(e):Lp((function(){return new vp})))}}(),nt((function(){return s})))}(n.children)}},{key:"expandSegment",value:function(t,e,n,i,r,a){var o=this;return rp.apply(void 0,l(n)).pipe(Pp((function(s){return o.expandSegmentAgainstRoute(t,e,n,s,i,r,a).pipe(pp((function(t){if(t instanceof GL)return rp(null);throw t})))})),Ap((function(t){return!!t})),pp((function(t,n){if(t instanceof vp||"EmptyError"===t.name){if(o.noLeftoversInUrl(e,i,r))return rp(new GD([],{}));throw new GL(e)}throw t})))}},{key:"noLeftoversInUrl",value:function(t,e,n){return 0===e.length&&!t.children[n]}},{key:"expandSegmentAgainstRoute",value:function(t,e,n,i,r,a,o){return nT(i)!==a?ZL(e):void 0===i.redirectTo?this.matchSegmentAgainstRoute(t,e,i,r):o&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(t,e,n,i,r,a):ZL(e)}},{key:"expandSegmentAgainstRouteUsingRedirect",value:function(t,e,n,i,r,a){return"**"===i.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(t,n,i,a):this.expandRegularSegmentAgainstRouteUsingRedirect(t,e,n,i,r,a)}},{key:"expandWildCardWithParamsAgainstRouteUsingRedirect",value:function(t,e,n,i){var r=this,a=this.applyRedirectCommands([],n.redirectTo,{});return n.redirectTo.startsWith("/")?JL(a):this.lineralizeSegments(n,a).pipe(st((function(n){var a=new GD(n,{});return r.expandSegment(t,a,e,n,i,!1)})))}},{key:"expandRegularSegmentAgainstRouteUsingRedirect",value:function(t,e,n,i,r,a){var o=this,s=$L(e,i,r),u=s.consumedSegments,l=s.lastChild,c=s.positionalParamSegments;if(!s.matched)return ZL(e);var d=this.applyRedirectCommands(u,i.redirectTo,c);return i.redirectTo.startsWith("/")?JL(d):this.lineralizeSegments(i,d).pipe(st((function(i){return o.expandSegment(t,e,n,i.concat(r.slice(l)),a,!1)})))}},{key:"matchSegmentAgainstRoute",value:function(t,e,n,i){var r=this;if("**"===n.path)return n.loadChildren?this.configLoader.load(t.injector,n).pipe(nt((function(t){return n._loadedConfig=t,new GD(i,{})}))):rp(new GD(i,{}));var a=$L(e,n,i),o=a.consumedSegments,s=a.lastChild;if(!a.matched)return ZL(e);var u=i.slice(s);return this.getChildConfig(t,n,i).pipe(st((function(t){var n=t.module,i=t.routes,a=function(t,e,n,i){return n.length>0&&function(t,e,n){return n.some((function(n){return eT(t,e,n)&&nT(n)!==ID}))}(t,n,i)?{segmentGroup:tT(new GD(e,function(t,e){var n={};n.primary=e;var i,r=d(t);try{for(r.s();!(i=r.n()).done;){var a=i.value;""===a.path&&nT(a)!==ID&&(n[nT(a)]=new GD([],{}))}}catch(o){r.e(o)}finally{r.f()}return n}(i,new GD(n,t.children)))),slicedSegments:[]}:0===n.length&&function(t,e,n){return n.some((function(n){return eT(t,e,n)}))}(t,n,i)?{segmentGroup:tT(new GD(t.segments,function(t,e,n,i){var r,a={},o=d(n);try{for(o.s();!(r=o.n()).done;){var s=r.value;eT(t,e,s)&&!i[nT(s)]&&(a[nT(s)]=new GD([],{}))}}catch(u){o.e(u)}finally{o.f()}return Object.assign(Object.assign({},i),a)}(t,n,i,t.children))),slicedSegments:n}:{segmentGroup:t,slicedSegments:n}}(e,o,u,i),s=a.segmentGroup,l=a.slicedSegments;return 0===l.length&&s.hasChildren()?r.expandChildren(n,i,s).pipe(nt((function(t){return new GD(o,t)}))):0===i.length&&0===l.length?rp(new GD(o,{})):r.expandSegment(n,s,i,l,ID,!0).pipe(nt((function(t){return new GD(o.concat(t.segments),t.children)})))})))}},{key:"getChildConfig",value:function(t,e,n){var i=this;return e.children?rp(new WL(e.children,t)):e.loadChildren?void 0!==e._loadedConfig?rp(e._loadedConfig):this.runCanLoadGuards(t.injector,e,n).pipe(st((function(n){return n?i.configLoader.load(t.injector,e).pipe(nt((function(t){return e._loadedConfig=t,t}))):function(t){return new B((function(e){return e.error(FD("Cannot load children because the guard of the route \"path: '".concat(t.path,"'\" returned false")))}))}(e)}))):rp(new WL([],t))}},{key:"runCanLoadGuards",value:function(t,e,n){var i=this,r=e.canLoad;return r&&0!==r.length?rp(r.map((function(i){var r,a=t.get(i);if(function(t){return t&&VL(t.canLoad)}(a))r=a.canLoad(e,n);else{if(!VL(a))throw new Error("Invalid CanLoad guard");r=a(e,n)}return zD(r)}))).pipe(qL(),Rv((function(t){if(zL(t)){var e=FD('Redirecting to "'.concat(i.urlSerializer.serialize(t),'"'));throw e.url=t,e}})),nt((function(t){return!0===t}))):rp(!0)}},{key:"lineralizeSegments",value:function(t,e){for(var n=[],i=e.root;;){if(n=n.concat(i.segments),0===i.numberOfChildren)return rp(n);if(i.numberOfChildren>1||!i.children.primary)return QL(t.redirectTo);i=i.children.primary}}},{key:"applyRedirectCommands",value:function(t,e,n){return this.applyRedirectCreatreUrlTree(e,this.urlSerializer.parse(e),t,n)}},{key:"applyRedirectCreatreUrlTree",value:function(t,e,n,i){var r=this.createSegmentGroup(t,e.root,n,i);return new qD(r,this.createQueryParams(e.queryParams,this.urlTree.queryParams),e.fragment)}},{key:"createQueryParams",value:function(t,e){var n={};return VD(t,(function(t,i){if("string"==typeof t&&t.startsWith(":")){var r=t.substring(1);n[i]=e[r]}else n[i]=t})),n}},{key:"createSegmentGroup",value:function(t,e,n,i){var r=this,a=this.createSegments(t,e.segments,n,i),o={};return VD(e.children,(function(e,a){o[a]=r.createSegmentGroup(t,e,n,i)})),new GD(a,o)}},{key:"createSegments",value:function(t,e,n,i){var r=this;return e.map((function(e){return e.path.startsWith(":")?r.findPosParam(t,e,i):r.findOrReturn(e,n)}))}},{key:"findPosParam",value:function(t,e,n){var i=n[e.path.substring(1)];if(!i)throw new Error("Cannot redirect to '".concat(t,"'. Cannot find '").concat(e.path,"'."));return i}},{key:"findOrReturn",value:function(t,e){var n,i=0,r=d(e);try{for(r.s();!(n=r.n()).done;){var a=n.value;if(a.path===t.path)return e.splice(i),a;i++}}catch(o){r.e(o)}finally{r.f()}return t}}]),t}();function $L(t,e,n){if(""===e.path)return"full"===e.pathMatch&&(t.hasChildren()||n.length>0)?{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}:{matched:!0,consumedSegments:[],lastChild:0,positionalParamSegments:{}};var i=(e.matcher||HD)(n,t,e);return i?{matched:!0,consumedSegments:i.consumed,lastChild:i.consumed.length,positionalParamSegments:i.posParams}:{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}}function tT(t){if(1===t.numberOfChildren&&t.children.primary){var e=t.children.primary;return new GD(t.segments.concat(e.segments),e.children)}return t}function eT(t,e,n){return(!(t.hasChildren()||e.length>0)||"full"!==n.pathMatch)&&""===n.path&&void 0!==n.redirectTo}function nT(t){return t.outlet||ID}var iT=function t(e){_(this,t),this.path=e,this.route=this.path[this.path.length-1]},rT=function t(e,n){_(this,t),this.component=e,this.route=n};function aT(t,e,n){var i=function(t){if(!t)return null;for(var e=t.parent;e;e=e.parent){var n=e.routeConfig;if(n&&n._loadedConfig)return n._loadedConfig}return null}(e);return(i?i.module.injector:n).get(t)}function oT(t,e,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{canDeactivateChecks:[],canActivateChecks:[]},a=gL(e);return t.children.forEach((function(t){sT(t,a[t.value.outlet],n,i.concat([t.value]),r),delete a[t.value.outlet]})),VD(a,(function(t,e){return lT(t,n.getContext(e),r)})),r}function sT(t,e,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{canDeactivateChecks:[],canActivateChecks:[]},a=t.value,o=e?e.value:null,s=n?n.getContext(t.value.outlet):null;if(o&&a.routeConfig===o.routeConfig){var u=uT(o,a,a.routeConfig.runGuardsAndResolvers);u?r.canActivateChecks.push(new iT(i)):(a.data=o.data,a._resolvedData=o._resolvedData),oT(t,e,a.component?s?s.children:null:n,i,r),u&&s&&s.outlet&&s.outlet.isActivated&&r.canDeactivateChecks.push(new rT(s.outlet.component,o))}else o&&lT(e,s,r),r.canActivateChecks.push(new iT(i)),oT(t,null,a.component?s?s.children:null:n,i,r);return r}function uT(t,e,n){if("function"==typeof n)return n(t,e);switch(n){case"pathParamsChange":return!ZD(t.url,e.url);case"pathParamsOrQueryParamsChange":return!ZD(t.url,e.url)||!BD(t.queryParams,e.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!DL(t,e)||!BD(t.queryParams,e.queryParams);case"paramsChange":default:return!DL(t,e)}}function lT(t,e,n){var i=gL(t),r=t.value;VD(i,(function(t,i){lT(t,r.component?e?e.children.getContext(i):null:e,n)})),n.canDeactivateChecks.push(new rT(r.component&&e&&e.outlet&&e.outlet.isActivated?e.outlet.component:null,r))}function cT(t,e){return null!==t&&e&&e(new OD(t)),rp(!0)}function dT(t,e){return null!==t&&e&&e(new TD(t)),rp(!0)}function hT(t,e,n){var i=e.routeConfig?e.routeConfig.canActivate:null;return i&&0!==i.length?rp(i.map((function(i){return hk((function(){var r,a=aT(i,e,n);if(function(t){return t&&VL(t.canActivate)}(a))r=zD(a.canActivate(e,t));else{if(!VL(a))throw new Error("Invalid CanActivate guard");r=zD(a(e,t))}return r.pipe(Ap())}))}))).pipe(qL()):rp(!0)}function fT(t,e,n){var i=e[e.length-1],r=e.slice(0,e.length-1).reverse().map((function(t){return function(t){var e=t.routeConfig?t.routeConfig.canActivateChild:null;return e&&0!==e.length?{node:t,guards:e}:null}(t)})).filter((function(t){return null!==t})).map((function(e){return hk((function(){return rp(e.guards.map((function(r){var a,o=aT(r,e.node,n);if(function(t){return t&&VL(t.canActivateChild)}(o))a=zD(o.canActivateChild(i,t));else{if(!VL(o))throw new Error("Invalid CanActivateChild guard");a=zD(o(i,t))}return a.pipe(Ap())}))).pipe(qL())}))}));return rp(r).pipe(qL())}var pT=function t(){_(this,t)},mT=function(){function t(e,n,i,r,a,o){_(this,t),this.rootComponentType=e,this.config=n,this.urlTree=i,this.url=r,this.paramsInheritanceStrategy=a,this.relativeLinkResolution=o}return b(t,[{key:"recognize",value:function(){try{var t=_T(this.urlTree.root,[],[],this.config,this.relativeLinkResolution).segmentGroup,e=this.processSegmentGroup(this.config,t,ID),n=new kL([],Object.freeze({}),Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,{},ID,this.rootComponentType,null,this.urlTree.root,-1,{}),i=new mL(n,e),r=new ML(this.url,i);return this.inheritParamsAndData(r._root),rp(r)}catch(a){return new B((function(t){return t.error(a)}))}}},{key:"inheritParamsAndData",value:function(t){var e=this,n=t.value,i=bL(n,this.paramsInheritanceStrategy);n.params=Object.freeze(i.params),n.data=Object.freeze(i.data),t.children.forEach((function(t){return e.inheritParamsAndData(t)}))}},{key:"processSegmentGroup",value:function(t,e,n){return 0===e.segments.length&&e.hasChildren()?this.processChildren(t,e):this.processSegment(t,e,e.segments,n)}},{key:"processChildren",value:function(t,e){var n,i=this,r=JD(e,(function(e,n){return i.processSegmentGroup(t,e,n)}));return n={},r.forEach((function(t){var e=n[t.value.outlet];if(e){var i=e.url.map((function(t){return t.toString()})).join("/"),r=t.value.url.map((function(t){return t.toString()})).join("/");throw new Error("Two segments cannot have the same outlet name: '".concat(i,"' and '").concat(r,"'."))}n[t.value.outlet]=t.value})),r.sort((function(t,e){return t.value.outlet===ID?-1:e.value.outlet===ID?1:t.value.outlet.localeCompare(e.value.outlet)})),r}},{key:"processSegment",value:function(t,e,n,i){var r,a=d(t);try{for(a.s();!(r=a.n()).done;){var o=r.value;try{return this.processSegmentAgainstRoute(o,e,n,i)}catch(s){if(!(s instanceof pT))throw s}}}catch(u){a.e(u)}finally{a.f()}if(this.noLeftoversInUrl(e,n,i))return[];throw new pT}},{key:"noLeftoversInUrl",value:function(t,e,n){return 0===e.length&&!t.children[n]}},{key:"processSegmentAgainstRoute",value:function(t,e,n,i){if(t.redirectTo)throw new pT;if((t.outlet||ID)!==i)throw new pT;var r,a=[],o=[];if("**"===t.path){var s=n.length>0?WD(n).parameters:{};r=new kL(n,s,Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,wT(t),i,t.component,t,gT(e),vT(e)+n.length,kT(t))}else{var u=function(t,e,n){if(""===e.path){if("full"===e.pathMatch&&(t.hasChildren()||n.length>0))throw new pT;return{consumedSegments:[],lastChild:0,parameters:{}}}var i=(e.matcher||HD)(n,t,e);if(!i)throw new pT;var r={};VD(i.posParams,(function(t,e){r[e]=t.path}));var a=i.consumed.length>0?Object.assign(Object.assign({},r),i.consumed[i.consumed.length-1].parameters):r;return{consumedSegments:i.consumed,lastChild:i.consumed.length,parameters:a}}(e,t,n);a=u.consumedSegments,o=n.slice(u.lastChild),r=new kL(a,u.parameters,Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,wT(t),i,t.component,t,gT(e),vT(e)+a.length,kT(t))}var l=function(t){return t.children?t.children:t.loadChildren?t._loadedConfig.routes:[]}(t),c=_T(e,a,o,l,this.relativeLinkResolution),d=c.segmentGroup,h=c.slicedSegments;if(0===h.length&&d.hasChildren()){var f=this.processChildren(l,d);return[new mL(r,f)]}if(0===l.length&&0===h.length)return[new mL(r,[])];var p=this.processSegment(l,d,h,ID);return[new mL(r,p)]}}]),t}();function gT(t){for(var e=t;e._sourceSegment;)e=e._sourceSegment;return e}function vT(t){for(var e=t,n=e._segmentIndexShift?e._segmentIndexShift:0;e._sourceSegment;)n+=(e=e._sourceSegment)._segmentIndexShift?e._segmentIndexShift:0;return n-1}function _T(t,e,n,i,r){if(n.length>0&&function(t,e,n){return n.some((function(n){return yT(t,e,n)&&bT(n)!==ID}))}(t,n,i)){var a=new GD(e,function(t,e,n,i){var r={};r.primary=i,i._sourceSegment=t,i._segmentIndexShift=e.length;var a,o=d(n);try{for(o.s();!(a=o.n()).done;){var s=a.value;if(""===s.path&&bT(s)!==ID){var u=new GD([],{});u._sourceSegment=t,u._segmentIndexShift=e.length,r[bT(s)]=u}}}catch(l){o.e(l)}finally{o.f()}return r}(t,e,i,new GD(n,t.children)));return a._sourceSegment=t,a._segmentIndexShift=e.length,{segmentGroup:a,slicedSegments:[]}}if(0===n.length&&function(t,e,n){return n.some((function(n){return yT(t,e,n)}))}(t,n,i)){var o=new GD(t.segments,function(t,e,n,i,r,a){var o,s={},u=d(i);try{for(u.s();!(o=u.n()).done;){var l=o.value;if(yT(t,n,l)&&!r[bT(l)]){var c=new GD([],{});c._sourceSegment=t,c._segmentIndexShift="legacy"===a?t.segments.length:e.length,s[bT(l)]=c}}}catch(h){u.e(h)}finally{u.f()}return Object.assign(Object.assign({},r),s)}(t,e,n,i,t.children,r));return o._sourceSegment=t,o._segmentIndexShift=e.length,{segmentGroup:o,slicedSegments:n}}var s=new GD(t.segments,t.children);return s._sourceSegment=t,s._segmentIndexShift=e.length,{segmentGroup:s,slicedSegments:n}}function yT(t,e,n){return(!(t.hasChildren()||e.length>0)||"full"!==n.pathMatch)&&""===n.path&&void 0===n.redirectTo}function bT(t){return t.outlet||ID}function wT(t){return t.data||{}}function kT(t){return t.resolve||{}}function MT(t){return function(e){return e.pipe(ag((function(e){var n=t(e);return n?ot(n).pipe(nt((function(){return e}))):ot([e])})))}}var ST=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return n}(function(){function t(){_(this,t)}return b(t,[{key:"shouldDetach",value:function(t){return!1}},{key:"store",value:function(t,e){}},{key:"shouldAttach",value:function(t){return!1}},{key:"retrieve",value:function(t){return null}},{key:"shouldReuseRoute",value:function(t,e){return t.routeConfig===e.routeConfig}}]),t}()),CT=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["ng-component"]],decls:1,vars:0,template:function(t,e){1&t&&ks(0,"router-outlet")},directives:function(){return[zT]},encapsulation:2}),t}();function xT(t){for(var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=0;n4&&void 0!==arguments[4]?arguments[4]:"emptyOnly",arguments.length>5&&void 0!==arguments[5]?arguments[5]:"legacy").recognize()}(t,n,i.urlAfterRedirects,(o=i.urlAfterRedirects,e.serializeUrl(o)),r,a).pipe(nt((function(t){return Object.assign(Object.assign({},i),{targetSnapshot:t})})));var o})))}}(e.rootComponentType,e.config,0,e.paramsInheritanceStrategy,e.relativeLinkResolution),Rv((function(t){"eager"===e.urlUpdateStrategy&&(t.extras.skipLocationChange||e.setBrowserUrl(t.urlAfterRedirects,!!t.extras.replaceUrl,t.id,t.extras.state),e.browserUrlTree=t.urlAfterRedirects)})),Rv((function(t){var i=new kD(t.id,e.serializeUrl(t.extractedUrl),e.serializeUrl(t.urlAfterRedirects),t.targetSnapshot);n.next(i)})));if(s&&e.rawUrlTree&&e.urlHandlingStrategy.shouldProcessUrl(e.rawUrlTree)){var u=t.extractedUrl,l=t.source,c=t.restoredState,d=t.extras,h=new _D(t.id,e.serializeUrl(u),l,c);n.next(h);var f=_L(u,e.rootComponentType).snapshot;return rp(Object.assign(Object.assign({},t),{targetSnapshot:f,urlAfterRedirects:u,extras:Object.assign(Object.assign({},d),{skipLocationChange:!1,replaceUrl:!1})}))}return e.rawUrlTree=t.rawUrl,e.browserUrlTree=t.urlAfterRedirects,t.resolve(null),np})),MT((function(t){var n=t.extras;return e.hooks.beforePreactivation(t.targetSnapshot,{navigationId:t.id,appliedUrlTree:t.extractedUrl,rawUrlTree:t.rawUrl,skipLocationChange:!!n.skipLocationChange,replaceUrl:!!n.replaceUrl})})),Rv((function(t){var n=new MD(t.id,e.serializeUrl(t.extractedUrl),e.serializeUrl(t.urlAfterRedirects),t.targetSnapshot);e.triggerEvent(n)})),nt((function(t){return Object.assign(Object.assign({},t),{guards:(n=t.targetSnapshot,i=t.currentSnapshot,r=e.rootContexts,a=n._root,oT(a,i?i._root:null,r,[a.value]))});var n,i,r,a})),function(t,e){return function(n){return n.pipe(st((function(n){var i=n.targetSnapshot,r=n.currentSnapshot,a=n.guards,o=a.canActivateChecks,s=a.canDeactivateChecks;return 0===s.length&&0===o.length?rp(Object.assign(Object.assign({},n),{guardsResult:!0})):function(t,e,n,i){return ot(t).pipe(st((function(t){return function(t,e,n,i,r){var a=e&&e.routeConfig?e.routeConfig.canDeactivate:null;return a&&0!==a.length?rp(a.map((function(a){var o,s=aT(a,e,r);if(function(t){return t&&VL(t.canDeactivate)}(s))o=zD(s.canDeactivate(t,e,n,i));else{if(!VL(s))throw new Error("Invalid CanDeactivate guard");o=zD(s(t,e,n,i))}return o.pipe(Ap())}))).pipe(qL()):rp(!0)}(t.component,t.route,n,e,i)})),Ap((function(t){return!0!==t}),!0))}(s,i,r,t).pipe(st((function(n){return n&&"boolean"==typeof n?function(t,e,n,i){return ot(e).pipe(Pp((function(e){return ot([dT(e.route.parent,i),cT(e.route,i),fT(t,e.path,n),hT(t,e.route,n)]).pipe(ng(),Ap((function(t){return!0!==t}),!0))})),Ap((function(t){return!0!==t}),!0))}(i,o,t,e):rp(n)})),nt((function(t){return Object.assign(Object.assign({},n),{guardsResult:t})})))})))}}(e.ngModule.injector,(function(t){return e.triggerEvent(t)})),Rv((function(t){if(zL(t.guardsResult)){var n=FD('Redirecting to "'.concat(e.serializeUrl(t.guardsResult),'"'));throw n.url=t.guardsResult,n}})),Rv((function(t){var n=new SD(t.id,e.serializeUrl(t.extractedUrl),e.serializeUrl(t.urlAfterRedirects),t.targetSnapshot,!!t.guardsResult);e.triggerEvent(n)})),_p((function(t){if(!t.guardsResult){e.resetUrlToCurrentUrlTree();var i=new bD(t.id,e.serializeUrl(t.extractedUrl),"");return n.next(i),t.resolve(!1),!1}return!0})),MT((function(t){if(t.guards.canActivateChecks.length)return rp(t).pipe(Rv((function(t){var n=new CD(t.id,e.serializeUrl(t.extractedUrl),e.serializeUrl(t.urlAfterRedirects),t.targetSnapshot);e.triggerEvent(n)})),ag((function(t){var i,r,a=!1;return rp(t).pipe((i=e.paramsInheritanceStrategy,r=e.ngModule.injector,function(t){return t.pipe(st((function(t){var e=t.targetSnapshot,n=t.guards.canActivateChecks;if(!n.length)return rp(t);var a=0;return ot(n).pipe(Pp((function(t){return function(t,e,n,i){return function(t,e,n,i){var r=Object.keys(t);if(0===r.length)return rp({});var a={};return ot(r).pipe(st((function(r){return function(t,e,n,i){var r=aT(t,e,i);return zD(r.resolve?r.resolve(e,n):r(e,n))}(t[r],e,n,i).pipe(Rv((function(t){a[r]=t})))})),zS(1),st((function(){return Object.keys(a).length===r.length?rp(a):np})))}(t._resolve,t,e,i).pipe(nt((function(e){return t._resolvedData=e,t.data=Object.assign(Object.assign({},t.data),bL(t,n).resolve),null})))}(t.route,e,i,r)})),Rv((function(){return a++})),zS(1),st((function(e){return a===n.length?rp(t):np})))})))}),Rv({next:function(){return a=!0},complete:function(){if(!a){var i=new bD(t.id,e.serializeUrl(t.extractedUrl),"At least one route resolver didn't emit any value.");n.next(i),t.resolve(!1)}}}))})),Rv((function(t){var n=new xD(t.id,e.serializeUrl(t.extractedUrl),e.serializeUrl(t.urlAfterRedirects),t.targetSnapshot);e.triggerEvent(n)})))})),MT((function(t){var n=t.extras;return e.hooks.afterPreactivation(t.targetSnapshot,{navigationId:t.id,appliedUrlTree:t.extractedUrl,rawUrlTree:t.rawUrl,skipLocationChange:!!n.skipLocationChange,replaceUrl:!!n.replaceUrl})})),nt((function(t){var n,i,r,a=(r=function t(e,n,i){if(i&&e.shouldReuseRoute(n.value,i.value.snapshot)){var r=i.value;r._futureSnapshot=n.value;var a=function(e,n,i){return n.children.map((function(n){var r,a=d(i.children);try{for(a.s();!(r=a.n()).done;){var o=r.value;if(e.shouldReuseRoute(o.value.snapshot,n.value))return t(e,n,o)}}catch(s){a.e(s)}finally{a.f()}return t(e,n)}))}(e,n,i);return new mL(r,a)}var o=e.retrieve(n.value);if(o){var s=o.route;return function t(e,n){if(e.value.routeConfig!==n.value.routeConfig)throw new Error("Cannot reattach ActivatedRouteSnapshot created from a different route");if(e.children.length!==n.children.length)throw new Error("Cannot reattach ActivatedRouteSnapshot with a different number of children");n.value._futureSnapshot=e.value;for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:{},n=e.relativeTo,i=e.queryParams,r=e.fragment,a=e.preserveQueryParams,o=e.queryParamsHandling,s=e.preserveFragment;cr()&&a&&console&&console.warn&&console.warn("preserveQueryParams is deprecated, use queryParamsHandling instead.");var u=n||this.routerState.root,l=s?this.currentUrlTree.fragment:r,c=null;if(o)switch(o){case"merge":c=Object.assign(Object.assign({},this.currentUrlTree.queryParams),i);break;case"preserve":c=this.currentUrlTree.queryParams;break;default:c=i||null}else c=a?this.currentUrlTree.queryParams:i||null;return null!==c&&(c=this.removeEmptyProps(c)),LL(u,this.currentUrlTree,t,c,l)}},{key:"navigateByUrl",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{skipLocationChange:!1};cr()&&this.isNgZoneEnabled&&!Dc.isInAngularZone()&&this.console.warn("Navigation triggered outside Angular zone, did you forget to call 'ngZone.run()'?");var n=zL(t)?t:this.parseUrl(t),i=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(i,"imperative",null,e)}},{key:"navigate",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{skipLocationChange:!1};return BT(t),this.navigateByUrl(this.createUrlTree(t,e),e)}},{key:"serializeUrl",value:function(t){return this.urlSerializer.serialize(t)}},{key:"parseUrl",value:function(t){var e;try{e=this.urlSerializer.parse(t)}catch(n){e=this.malformedUriErrorHandler(n,this.urlSerializer,t)}return e}},{key:"isActive",value:function(t,e){if(zL(t))return UD(this.currentUrlTree,t,e);var n=this.parseUrl(t);return UD(this.currentUrlTree,n,e)}},{key:"removeEmptyProps",value:function(t){return Object.keys(t).reduce((function(e,n){var i=t[n];return null!=i&&(e[n]=i),e}),{})}},{key:"processNavigations",value:function(){var t=this;this.navigations.subscribe((function(e){t.navigated=!0,t.lastSuccessfulId=e.id,t.events.next(new yD(e.id,t.serializeUrl(e.extractedUrl),t.serializeUrl(t.currentUrlTree))),t.lastSuccessfulNavigation=t.currentNavigation,t.currentNavigation=null,e.resolve(!0)}),(function(e){t.console.warn("Unhandled Navigation Error: ")}))}},{key:"scheduleNavigation",value:function(t,e,n,i,r){var a,o,s,u=this.getTransition(),l="imperative"!==e&&"imperative"===(null==u?void 0:u.source),c=(this.lastSuccessfulId===u.id||this.currentNavigation?u.rawUrl:u.urlAfterRedirects).toString()===t.toString();if(l&&c)return Promise.resolve(!0);r?(a=r.resolve,o=r.reject,s=r.promise):s=new Promise((function(t,e){a=t,o=e}));var d=++this.navigationId;return this.setTransition({id:d,source:e,restoredState:n,currentUrlTree:this.currentUrlTree,currentRawUrl:this.rawUrlTree,rawUrl:t,extras:i,resolve:a,reject:o,promise:s,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),s.catch((function(t){return Promise.reject(t)}))}},{key:"setBrowserUrl",value:function(t,e,n,i){var r=this.urlSerializer.serialize(t);i=i||{},this.location.isCurrentPathEqualTo(r)||e?this.location.replaceState(r,"",Object.assign(Object.assign({},i),{navigationId:n})):this.location.go(r,"",Object.assign(Object.assign({},i),{navigationId:n}))}},{key:"resetStateAndUrl",value:function(t,e,n){this.routerState=t,this.currentUrlTree=e,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,n),this.resetUrlToCurrentUrlTree()}},{key:"resetUrlToCurrentUrlTree",value:function(){this.location.replaceState(this.urlSerializer.serialize(this.rawUrlTree),"",{navigationId:this.lastSuccessfulId})}},{key:"url",get:function(){return this.serializeUrl(this.currentUrlTree)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(Eo),ve(QD),ve(PT),ve(Md),ve(qo),ve(Jc),ve(Sc),ve(void 0))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}();function BT(t){for(var e=0;e2&&void 0!==arguments[2]?arguments[2]:{};_(this,t),this.router=e,this.viewportScroller=n,this.options=i,this.lastId=0,this.lastSource="imperative",this.restoredId=0,this.store={},i.scrollPositionRestoration=i.scrollPositionRestoration||"disabled",i.anchorScrolling=i.anchorScrolling||"disabled"}return b(t,[{key:"init",value:function(){"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}},{key:"createScrollEvents",value:function(){var t=this;return this.router.events.subscribe((function(e){e instanceof _D?(t.store[t.lastId]=t.viewportScroller.getScrollPosition(),t.lastSource=e.navigationTrigger,t.restoredId=e.restoredState?e.restoredState.navigationId:0):e instanceof yD&&(t.lastId=e.id,t.scheduleScrollEvent(e,t.router.parseUrl(e.urlAfterRedirects).fragment))}))}},{key:"consumeScrollEvents",value:function(){var t=this;return this.router.events.subscribe((function(e){e instanceof PD&&(e.position?"top"===t.options.scrollPositionRestoration?t.viewportScroller.scrollToPosition([0,0]):"enabled"===t.options.scrollPositionRestoration&&t.viewportScroller.scrollToPosition(e.position):e.anchor&&"enabled"===t.options.anchorScrolling?t.viewportScroller.scrollToAnchor(e.anchor):"disabled"!==t.options.scrollPositionRestoration&&t.viewportScroller.scrollToPosition([0,0]))}))}},{key:"scheduleScrollEvent",value:function(t,e){this.router.triggerEvent(new PD(t,"popstate"===this.lastSource?this.store[this.restoredId]:null,e))}},{key:"ngOnDestroy",value:function(){this.routerEventsSubscription&&this.routerEventsSubscription.unsubscribe(),this.scrollEventsSubscription&&this.scrollEventsSubscription.unsubscribe()}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(HT),ve(hf),ve(void 0))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}(),QT=new se("ROUTER_CONFIGURATION"),XT=new se("ROUTER_FORROOT_GUARD"),$T=[Md,{provide:QD,useClass:XD},{provide:HT,useFactory:function(t,e,n,i,r,a,o){var s=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},u=arguments.length>8?arguments[8]:void 0,l=arguments.length>9?arguments[9]:void 0,c=new HT(null,t,e,n,i,r,a,ND(o));if(u&&(c.urlHandlingStrategy=u),l&&(c.routeReuseStrategy=l),s.errorHandler&&(c.errorHandler=s.errorHandler),s.malformedUriErrorHandler&&(c.malformedUriErrorHandler=s.malformedUriErrorHandler),s.enableTracing){var d=od();c.events.subscribe((function(t){d.logGroup("Router Event: ".concat(t.constructor.name)),d.log(t.toString()),d.log(t),d.logGroupEnd()}))}return s.onSameUrlNavigation&&(c.onSameUrlNavigation=s.onSameUrlNavigation),s.paramsInheritanceStrategy&&(c.paramsInheritanceStrategy=s.paramsInheritanceStrategy),s.urlUpdateStrategy&&(c.urlUpdateStrategy=s.urlUpdateStrategy),s.relativeLinkResolution&&(c.relativeLinkResolution=s.relativeLinkResolution),c},deps:[QD,PT,Md,qo,Jc,Sc,ET,QT,[function t(){_(this,t)},new xt],[function t(){_(this,t)},new xt]]},PT,{provide:yL,useFactory:function(t){return t.routerState.root},deps:[HT]},{provide:Jc,useClass:$c},ZT,KT,GT,{provide:QT,useValue:{enableTracing:!1}}];function tE(){return new Nc("Router",HT)}var eE=function(){var t=function(){function t(e,n){_(this,t)}return b(t,null,[{key:"forRoot",value:function(e,n){return{ngModule:t,providers:[$T,aE(e),{provide:XT,useFactory:rE,deps:[[HT,new xt,new Lt]]},{provide:QT,useValue:n||{}},{provide:_d,useFactory:iE,deps:[ld,[new Ct(bd),new xt],QT]},{provide:JT,useFactory:nE,deps:[HT,hf,QT]},{provide:qT,useExisting:n&&n.preloadingStrategy?n.preloadingStrategy:KT},{provide:Nc,multi:!0,useFactory:tE},[oE,{provide:oc,multi:!0,useFactory:sE,deps:[oE]},{provide:lE,useFactory:uE,deps:[oE]},{provide:fc,multi:!0,useExisting:lE}]]}}},{key:"forChild",value:function(e){return{ngModule:t,providers:[aE(e)]}}}]),t}();return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)(ve(XT,8),ve(HT,8))}}),t}();function nE(t,e,n){return n.scrollOffset&&e.setOffset(n.scrollOffset),new JT(t,e,n)}function iE(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.useHash?new kd(t,e):new wd(t,e)}function rE(t){if(t)throw new Error("RouterModule.forRoot() called twice. Lazy loaded modules should use RouterModule.forChild() instead.");return"guarded"}function aE(t){return[{provide:Go,multi:!0,useValue:t},{provide:ET,multi:!0,useValue:t}]}var oE=function(){var t=function(){function t(e){_(this,t),this.injector=e,this.initNavigation=!1,this.resultOfPreactivationDone=new z}return b(t,[{key:"appInitializer",value:function(){var t=this;return this.injector.get(dd,Promise.resolve(null)).then((function(){var e=null,n=new Promise((function(t){return e=t})),i=t.injector.get(HT),r=t.injector.get(QT);if(t.isLegacyDisabled(r)||t.isLegacyEnabled(r))e(!0);else if("disabled"===r.initialNavigation)i.setUpLocationChangeListener(),e(!0);else{if("enabled"!==r.initialNavigation)throw new Error("Invalid initialNavigation options: '".concat(r.initialNavigation,"'"));i.hooks.afterPreactivation=function(){return t.initNavigation?rp(null):(t.initNavigation=!0,e(!0),t.resultOfPreactivationDone)},i.initialNavigation()}return n}))}},{key:"bootstrapListener",value:function(t){var e=this.injector.get(QT),n=this.injector.get(ZT),i=this.injector.get(JT),r=this.injector.get(HT),a=this.injector.get(Kc);t===a.components[0]&&(this.isLegacyEnabled(e)?r.initialNavigation():this.isLegacyDisabled(e)&&r.setUpLocationChangeListener(),n.setUpPreloading(),i.init(),r.resetRootComponentType(a.componentTypes[0]),this.resultOfPreactivationDone.next(null),this.resultOfPreactivationDone.complete())}},{key:"isLegacyEnabled",value:function(t){return"legacy_enabled"===t.initialNavigation||!0===t.initialNavigation||void 0===t.initialNavigation}},{key:"isLegacyDisabled",value:function(t){return"legacy_disabled"===t.initialNavigation||!1===t.initialNavigation}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(qo))},t.\u0275prov=At({token:t,factory:t.\u0275fac}),t}();function sE(t){return t.appInitializer.bind(t)}function uE(t){return t.bootstrapListener.bind(t)}var lE=new se("Router Initializer"),cE=["msgBar"],dE=function(){function t(t,e,n,i,r,a,o,s,u){this.appService=t,this.languageService=e,this.bip38WordList=o,this.dialog=s,this.msgBarService=u,i.requestPinComponent=Ax,r.requestWordComponent=tD,n.signTransactionConfirmationComponent=Ix,a.errorDuringinitialLoad.subscribe((function(t){t&&_m(2)}))}return t.prototype.ngOnInit=function(){var t=this;this.appService.UpdateData(),this.languageService.initialize();var e=this.languageService.savedSelectedLanguageLoaded.subscribe((function(n){n||nD.openDialog(t.dialog,!0),e.unsubscribe()}));setTimeout((function(){t.msgBarService.msgBarComponent=t.msgBar}))},t.\u0275fac=function(e){return new(e||t)(gs(Sm),gs(Hx),gs(jk),gs(Rk),gs(Fk),gs(hD),gs(Px),gs(Dk),gs(Gx))},t.\u0275cmp=Fe({type:t,selectors:[["app-root"]],viewQuery:function(t,e){var n;1&t&&Zl(cE,!0),2&t&&Gl(n=tc())&&(e.msgBar=n.first)},decls:19,vars:3,consts:[[1,"size-alert","d-md-none"],["src","assets/img/size-alert.png"],[1,"background-fixer"],["msgBar",""]],template:function(t,e){1&t&&(bs(0,"div",0),uu(1,"\n "),bs(2,"div"),uu(3,"\n "),ks(4,"img",1),uu(5,"\n "),bs(6,"div"),uu(7),Tl(8,"translate"),ws(),uu(9,"\n "),ws(),uu(10,"\n"),ws(),uu(11,"\n"),uu(12,"\n"),ks(13,"div",2),uu(14,"\n"),ks(15,"router-outlet"),uu(16,"\n"),ks(17,"app-msg-bar",null,3)),2&t&&(na(7),lu(El(8,1,"errors.window-size")))},directives:[zT,qx],pipes:[pC],styles:[".size-alert[_ngcontent-%COMP%]{background-color:rgba(0,0,0,.85);position:fixed;top:0;left:0;width:100%;height:100%;z-index:10000;display:inline-flex;align-items:center;justify-content:center;text-align:center;color:#fff}.size-alert[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{margin:0 40px;max-width:400px}"]}),t}(),hE=["input"],fE=function(){return{enterDuration:150}},pE=["*"],mE=new se("mat-checkbox-default-options",{providedIn:"root",factory:function(){return{color:"accent",clickAction:"check-indeterminate"}}}),gE=new se("mat-checkbox-click-action"),vE=0,_E={provide:qk,useExisting:Ut((function(){return wE})),multi:!0},yE=function t(){_(this,t)},bE=Ew(Lw(Tw(Dw((function t(e){_(this,t),this._elementRef=e}))))),wE=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s,u,l){var c;return _(this,n),(c=e.call(this,t))._changeDetectorRef=i,c._focusMonitor=r,c._ngZone=a,c._clickAction=s,c._animationMode=u,c._options=l,c.ariaLabel="",c.ariaLabelledby=null,c._uniqueId="mat-checkbox-".concat(++vE),c.id=c._uniqueId,c.labelPosition="after",c.name=null,c.change=new Rl,c.indeterminateChange=new Rl,c._onTouched=function(){},c._currentAnimationClass="",c._currentCheckState=0,c._controlValueAccessorChangeFn=function(){},c._checked=!1,c._disabled=!1,c._indeterminate=!1,c._options=c._options||{},c._options.color&&(c.color=c.defaultColor=c._options.color),c.tabIndex=parseInt(o)||0,c._clickAction=c._clickAction||c._options.clickAction,c}return b(n,[{key:"ngAfterViewInit",value:function(){var t=this;this._focusMonitor.monitor(this._elementRef,!0).subscribe((function(e){e||Promise.resolve().then((function(){t._onTouched(),t._changeDetectorRef.markForCheck()}))})),this._syncIndeterminate(this._indeterminate)}},{key:"ngAfterViewChecked",value:function(){}},{key:"ngOnDestroy",value:function(){this._focusMonitor.stopMonitoring(this._elementRef)}},{key:"_isRippleDisabled",value:function(){return this.disableRipple||this.disabled}},{key:"_onLabelTextChange",value:function(){this._changeDetectorRef.detectChanges()}},{key:"writeValue",value:function(t){this.checked=!!t}},{key:"registerOnChange",value:function(t){this._controlValueAccessorChangeFn=t}},{key:"registerOnTouched",value:function(t){this._onTouched=t}},{key:"setDisabledState",value:function(t){this.disabled=t}},{key:"_getAriaChecked",value:function(){return this.checked?"true":this.indeterminate?"mixed":"false"}},{key:"_transitionCheckState",value:function(t){var e=this._currentCheckState,n=this._elementRef.nativeElement;if(e!==t&&(this._currentAnimationClass.length>0&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(e,t),this._currentCheckState=t,this._currentAnimationClass.length>0)){n.classList.add(this._currentAnimationClass);var i=this._currentAnimationClass;this._ngZone.runOutsideAngular((function(){setTimeout((function(){n.classList.remove(i)}),1e3)}))}}},{key:"_emitChangeEvent",value:function(){var t=new yE;t.source=this,t.checked=this.checked,this._controlValueAccessorChangeFn(this.checked),this.change.emit(t)}},{key:"toggle",value:function(){this.checked=!this.checked}},{key:"_onInputClick",value:function(t){var e=this;t.stopPropagation(),this.disabled||"noop"===this._clickAction?this.disabled||"noop"!==this._clickAction||(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate):(this.indeterminate&&"check"!==this._clickAction&&Promise.resolve().then((function(){e._indeterminate=!1,e.indeterminateChange.emit(e._indeterminate)})),this.toggle(),this._transitionCheckState(this._checked?1:2),this._emitChangeEvent())}},{key:"focus",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"keyboard",e=arguments.length>1?arguments[1]:void 0;this._focusMonitor.focusVia(this._inputElement,t,e)}},{key:"_onInteractionEvent",value:function(t){t.stopPropagation()}},{key:"_getAnimationClassForCheckStateTransition",value:function(t,e){if("NoopAnimations"===this._animationMode)return"";var n="";switch(t){case 0:if(1===e)n="unchecked-checked";else{if(3!=e)return"";n="unchecked-indeterminate"}break;case 2:n=1===e?"unchecked-checked":"unchecked-indeterminate";break;case 1:n=2===e?"checked-unchecked":"checked-indeterminate";break;case 3:n=1===e?"indeterminate-checked":"indeterminate-unchecked"}return"mat-checkbox-anim-".concat(n)}},{key:"_syncIndeterminate",value:function(t){var e=this._inputElement;e&&(e.nativeElement.indeterminate=t)}},{key:"inputId",get:function(){return"".concat(this.id||this._uniqueId,"-input")}},{key:"required",get:function(){return this._required},set:function(t){this._required=Em(t)}},{key:"checked",get:function(){return this._checked},set:function(t){t!=this.checked&&(this._checked=t,this._changeDetectorRef.markForCheck())}},{key:"disabled",get:function(){return this._disabled},set:function(t){var e=Em(t);e!==this.disabled&&(this._disabled=e,this._changeDetectorRef.markForCheck())}},{key:"indeterminate",get:function(){return this._indeterminate},set:function(t){var e=t!=this._indeterminate;this._indeterminate=Em(t),e&&(this._transitionCheckState(this._indeterminate?3:this.checked?1:2),this.indeterminateChange.emit(this._indeterminate)),this._syncIndeterminate(this._indeterminate)}}]),n}(bE);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Lo),gs(m_),gs(Dc),vs("tabindex"),gs(gE,8),gs(gw,8),gs(mE,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-checkbox"]],viewQuery:function(t,e){var n;1&t&&(Zl(hE,!0),Zl(qw,!0)),2&t&&(Gl(n=tc())&&(e._inputElement=n.first),Gl(n=tc())&&(e.ripple=n.first))},hostAttrs:[1,"mat-checkbox"],hostVars:12,hostBindings:function(t,e){2&t&&(mu("id",e.id),ds("tabindex",null),Js("mat-checkbox-indeterminate",e.indeterminate)("mat-checkbox-checked",e.checked)("mat-checkbox-disabled",e.disabled)("mat-checkbox-label-before","before"==e.labelPosition)("_mat-animation-noopable","NoopAnimations"===e._animationMode))},inputs:{disableRipple:"disableRipple",color:"color",tabIndex:"tabIndex",ariaLabel:["aria-label","ariaLabel"],ariaLabelledby:["aria-labelledby","ariaLabelledby"],id:"id",labelPosition:"labelPosition",name:"name",required:"required",checked:"checked",disabled:"disabled",indeterminate:"indeterminate",ariaDescribedby:["aria-describedby","ariaDescribedby"],value:"value"},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],features:[Pu([_E]),Jo],ngContentSelectors:pE,decls:38,vars:20,consts:[[1,"mat-checkbox-layout"],["label",""],[1,"mat-checkbox-inner-container"],["type","checkbox",1,"mat-checkbox-input","cdk-visually-hidden",3,"id","required","checked","disabled","tabIndex","change","click"],["input",""],["matRipple","",1,"mat-checkbox-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleRadius","matRippleCentered","matRippleAnimation"],[1,"mat-ripple-element","mat-checkbox-persistent-ripple"],[1,"mat-checkbox-frame"],[1,"mat-checkbox-background"],["version","1.1","focusable","false","viewBox","0 0 24 24",0,"xml","space","preserve",1,"mat-checkbox-checkmark"],["fill","none","stroke","white","d","M4.1,12.7 9,17.6 20.3,6.3",1,"mat-checkbox-checkmark-path"],[1,"mat-checkbox-mixedmark"],[1,"mat-checkbox-label",3,"cdkObserveContent"],["checkboxLabel",""],[2,"display","none"]],template:function(t,e){if(1&t&&(Fs(),bs(0,"label",0,1),uu(2,"\n "),bs(3,"div",2),uu(4,"\n "),bs(5,"input",3,4),Ts("change",(function(t){return e._onInteractionEvent(t)}))("click",(function(t){return e._onInputClick(t)})),ws(),uu(7,"\n "),bs(8,"div",5),uu(9,"\n "),ks(10,"div",6),uu(11,"\n "),ws(),uu(12,"\n "),ks(13,"div",7),uu(14,"\n "),bs(15,"div",8),uu(16,"\n "),hi(),bs(17,"svg",9),uu(18,"\n "),ks(19,"path",10),uu(20,"\n "),ws(),uu(21,"\n "),uu(22,"\n "),fi(),ks(23,"div",11),uu(24,"\n "),ws(),uu(25,"\n "),ws(),uu(26,"\n "),bs(27,"span",12,13),Ts("cdkObserveContent",(function(){return e._onLabelTextChange()})),uu(29,"\n "),uu(30,"\n "),bs(31,"span",14),uu(32,"\xa0"),ws(),uu(33,"\n "),Hs(34),uu(35,"\n "),ws(),uu(36,"\n"),ws(),uu(37,"\n")),2&t){var n=ms(1),i=ms(28);ds("for",e.inputId),na(3),Js("mat-checkbox-inner-container-no-side-margin",!i.textContent||!i.textContent.trim()),na(2),_s("id",e.inputId)("required",e.required)("checked",e.checked)("disabled",e.disabled)("tabIndex",e.tabIndex),ds("value",e.value)("name",e.name)("aria-label",e.ariaLabel||null)("aria-labelledby",e.ariaLabelledby)("aria-checked",e._getAriaChecked())("aria-describedby",e.ariaDescribedby),na(3),_s("matRippleTrigger",n)("matRippleDisabled",e._isRippleDisabled())("matRippleRadius",20)("matRippleCentered",!0)("matRippleAnimation",wl(19,fE))}},directives:[qw,Uv],styles:["@keyframes mat-checkbox-fade-in-background{0%{opacity:0}50%{opacity:1}}@keyframes mat-checkbox-fade-out-background{0%,50%{opacity:1}100%{opacity:0}}@keyframes mat-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:22.910259}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 0.1)}100%{stroke-dashoffset:0}}@keyframes mat-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mat-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);stroke-dashoffset:0}to{stroke-dashoffset:-22.910259}}@keyframes mat-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 0.1);opacity:1;transform:rotate(0deg)}to{opacity:0;transform:rotate(45deg)}}@keyframes mat-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);opacity:0;transform:rotate(45deg)}to{opacity:1;transform:rotate(360deg)}}@keyframes mat-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 0.1);opacity:0;transform:rotate(-45deg)}to{opacity:1;transform:rotate(0deg)}}@keyframes mat-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);opacity:1;transform:rotate(0deg)}to{opacity:0;transform:rotate(315deg)}}@keyframes mat-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;opacity:1;transform:scaleX(1)}32.8%,100%{opacity:0;transform:scaleX(0)}}.mat-checkbox-background,.mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:2px;box-sizing:border-box;pointer-events:none}.mat-checkbox{transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);cursor:pointer;-webkit-tap-highlight-color:transparent}._mat-animation-noopable.mat-checkbox{transition:none;animation:none}.mat-checkbox .mat-ripple-element:not(.mat-checkbox-persistent-ripple){opacity:.16}.mat-checkbox-layout{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:inherit;align-items:baseline;vertical-align:middle;display:inline-flex;white-space:nowrap}.mat-checkbox-label{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.mat-checkbox-inner-container{display:inline-block;height:16px;line-height:0;margin:auto;margin-right:8px;order:0;position:relative;vertical-align:middle;white-space:nowrap;width:16px;flex-shrink:0}[dir=rtl] .mat-checkbox-inner-container{margin-left:8px;margin-right:auto}.mat-checkbox-inner-container-no-side-margin{margin-left:0;margin-right:0}.mat-checkbox-frame{background-color:transparent;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1);border-width:2px;border-style:solid}._mat-animation-noopable .mat-checkbox-frame{transition:none}.cdk-high-contrast-active .mat-checkbox.cdk-keyboard-focused .mat-checkbox-frame{border-style:dotted}.mat-checkbox-background{align-items:center;display:inline-flex;justify-content:center;transition:background-color 90ms cubic-bezier(0, 0, 0.2, 0.1),opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}._mat-animation-noopable .mat-checkbox-background{transition:none}.cdk-high-contrast-active .mat-checkbox .mat-checkbox-background{background:none}.mat-checkbox-persistent-ripple{width:100%;height:100%;transform:none}.mat-checkbox-inner-container:hover .mat-checkbox-persistent-ripple{opacity:.04}.mat-checkbox.cdk-keyboard-focused .mat-checkbox-persistent-ripple{opacity:.12}.mat-checkbox-persistent-ripple,.mat-checkbox.mat-checkbox-disabled .mat-checkbox-inner-container:hover .mat-checkbox-persistent-ripple{opacity:0}@media(hover: none){.mat-checkbox-inner-container:hover .mat-checkbox-persistent-ripple{display:none}}.mat-checkbox-checkmark{top:0;left:0;right:0;bottom:0;position:absolute;width:100%}.mat-checkbox-checkmark-path{stroke-dashoffset:22.910259;stroke-dasharray:22.910259;stroke-width:2.1333333333px}.cdk-high-contrast-black-on-white .mat-checkbox-checkmark-path{stroke:#000 !important}.mat-checkbox-mixedmark{width:calc(100% - 6px);height:2px;opacity:0;transform:scaleX(0) rotate(0deg);border-radius:2px}.cdk-high-contrast-active .mat-checkbox-mixedmark{height:0;border-top:solid 2px;margin-top:2px}.mat-checkbox-label-before .mat-checkbox-inner-container{order:1;margin-left:8px;margin-right:auto}[dir=rtl] .mat-checkbox-label-before .mat-checkbox-inner-container{margin-left:auto;margin-right:8px}.mat-checkbox-checked .mat-checkbox-checkmark{opacity:1}.mat-checkbox-checked .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-checked .mat-checkbox-mixedmark{transform:scaleX(1) rotate(-45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark{opacity:0;transform:rotate(45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-indeterminate .mat-checkbox-mixedmark{opacity:1;transform:scaleX(1) rotate(0deg)}.mat-checkbox-unchecked .mat-checkbox-background{background-color:transparent}.mat-checkbox-disabled{cursor:default}.cdk-high-contrast-active .mat-checkbox-disabled{opacity:.5}.mat-checkbox-anim-unchecked-checked .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-checked .mat-checkbox-checkmark-path{animation:180ms linear 0ms mat-checkbox-unchecked-checked-checkmark-path}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0ms mat-checkbox-unchecked-indeterminate-mixedmark}.mat-checkbox-anim-checked-unchecked .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-out-background}.mat-checkbox-anim-checked-unchecked .mat-checkbox-checkmark-path{animation:90ms linear 0ms mat-checkbox-checked-unchecked-checkmark-path}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-checkmark{animation:90ms linear 0ms mat-checkbox-checked-indeterminate-checkmark}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0ms mat-checkbox-checked-indeterminate-mixedmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-checkmark{animation:500ms linear 0ms mat-checkbox-indeterminate-checked-checkmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-mixedmark{animation:500ms linear 0ms mat-checkbox-indeterminate-checked-mixedmark}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-out-background}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-mixedmark{animation:300ms linear 0ms mat-checkbox-indeterminate-unchecked-mixedmark}.mat-checkbox-input{bottom:0;left:50%}.mat-checkbox .mat-checkbox-ripple{position:absolute;left:calc(50% - 20px);top:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}\n"],encapsulation:2,changeDetection:0}),t}(),kE={provide:sM,useExisting:Ut((function(){return ME})),multi:!0},ME=function(){var t=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return n}(MS);return t.\u0275fac=function(e){return SE(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-checkbox","required","","formControlName",""],["mat-checkbox","required","","formControl",""],["mat-checkbox","required","","ngModel",""]],features:[Pu([kE]),Jo]}),t}(),SE=Ki(ME),CE=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)}}),t}(),xE=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[Gw,xw,qv,CE],xw,CE]}),t}();function DE(t,e){if(1&t){var n=xs();bs(0,"span",6),Ts("click",(function(){Bn(n);var t=Ys();return t.data.linkFunction(),t.closeModal(!1)})),uu(1),Tl(2,"translate"),ws()}if(2&t){var i=Ys();na(1),lu(El(2,1,i.data.linkText))}}function LE(t,e){if(1&t){var n=xs();bs(0,"div",7),uu(1,"\n "),bs(2,"mat-checkbox",8),Ts("change",(function(t){return Bn(n),Ys().setAccept(t)})),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ws()}if(2&t){var i=Ys();na(2),_s("checked",i.accepted),na(1),cu("",El(4,2,i.data.checkboxText),"\n ")}}function TE(t,e){if(1&t){var n=xs();bs(0,"app-button",9),Ts("action",(function(){return Bn(n),Ys().closeModal(!1)})),uu(1),Tl(2,"translate"),ws()}if(2&t){var i=Ys();na(1),cu("\n ",El(2,1,i.data.cancelButtonText),"\n ")}}var EE,OE=function(t){return t.YesNo="YesNo",t.ContinueCancel="ContinueCancel",t.Close="Close",t}({}),AE=function(){function t(t,e){this.dialogRef=t,this.data=e,this.accepted=!1,this.disableDismiss=!1,e.headerText||(e.headerText="confirmation.default-title"),e.defaultButtons&&(e.confirmButtonText=null,e.cancelButtonText=null,e.defaultButtons===OE.Close&&(e.confirmButtonText="common.close-button"),e.defaultButtons===OE.YesNo&&(e.confirmButtonText="confirmation.yes-button",e.cancelButtonText="confirmation.no-button"),e.defaultButtons===OE.ContinueCancel&&(e.confirmButtonText="common.continue-button",e.cancelButtonText="common.cancel-button")),this.disableDismiss=!!e.disableDismiss}return t.openDialog=function(e,n){var i=new pk;return i.data=n,i.autoFocus=!1,i.width="450px",e.open(t,i)},t.prototype.closeModal=function(t){this.dialogRef.close(t)},t.prototype.setAccept=function(t){this.accepted=!!t.checked},t.\u0275fac=function(e){return new(e||t)(gs(bk),gs(kk))},t.\u0275cmp=Fe({type:t,selectors:[["app-confirmation"]],decls:18,vars:16,consts:[[3,"useRedTitle","headline","dialog","disableDismiss"],["class","link",3,"click",4,"ngIf"],["class","-check-container",4,"ngIf"],[1,"-buttons"],[3,"action",4,"ngIf"],[1,"primary-button",3,"disabled","action"],[1,"link",3,"click"],[1,"-check-container"],["type","checkbox","id","terms",1,"-check","e2e-confirm-checkbox",3,"checked","change"],[3,"action"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2),Tl(3,"translate"),ps(4,DE,3,3,"span",1),uu(5,"\n\n "),ps(6,LE,6,4,"div",2),uu(7,"\n\n "),bs(8,"div",3),uu(9,"\n "),ps(10,TE,3,3,"app-button",4),uu(11,"\n "),bs(12,"app-button",5),Ts("action",(function(){return e.closeModal(!0)})),uu(13),Tl(14,"translate"),ws(),uu(15,"\n "),ws(),uu(16,"\n"),ws(),uu(17,"\n")),2&t&&(_s("useRedTitle",e.data.redTitle)("headline",El(1,10,e.data.headerText))("dialog",e.dialogRef)("disableDismiss",e.disableDismiss),na(2),cu("\n ",El(3,12,e.data.text),"\n "),na(2),_s("ngIf",e.data.linkText&&e.data.linkFunction),na(2),_s("ngIf",e.data.checkboxText),na(4),_s("ngIf",e.data.cancelButtonText),na(2),_s("disabled",e.data.checkboxText&&!e.accepted),na(1),cu("\n ",El(14,14,e.data.confirmButtonText),"\n "))},directives:[jS,Eh,Cx,wE],pipes:[pC],styles:[""]}),t}(),PE=function(){function t(e){_(this,t),this.total=e}return b(t,[{key:"call",value:function(t,e){return e.subscribe(new IE(t,this.total))}}]),t}(),IE=function(t){f(n,t);var e=v(n);function n(t,i){var r;return _(this,n),(r=e.call(this,t)).total=i,r.count=0,r}return b(n,[{key:"_next",value:function(t){++this.count>this.total&&this.destination.next(t)}}]),n}(P),YE=new Set,RE=function(){var t=function(){function t(e){_(this,t),this._platform=e,this._matchMedia=this._platform.isBrowser&&window.matchMedia?window.matchMedia.bind(window):FE}return b(t,[{key:"matchMedia",value:function(t){return this._platform.WEBKIT&&function(t){if(!YE.has(t))try{EE||((EE=document.createElement("style")).setAttribute("type","text/css"),document.head.appendChild(EE)),EE.sheet&&(EE.sheet.insertRule("@media ".concat(t," {.fx-query-test{ }}"),0),YE.add(t))}catch(e){console.error(e)}}(t),this._matchMedia(t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(bg))},t.\u0275prov=At({factory:function(){return new t(ve(bg))},token:t,providedIn:"root"}),t}();function FE(t){return{matches:"all"===t||""===t,media:t,addListener:function(){},removeListener:function(){}}}var HE=function(){var t=function(){function t(e,n){_(this,t),this._mediaMatcher=e,this._zone=n,this._queries=new Map,this._destroySubject=new z}return b(t,[{key:"ngOnDestroy",value:function(){this._destroySubject.next(),this._destroySubject.complete()}},{key:"isMatched",value:function(t){var e=this;return BE(Pm(t)).some((function(t){return e._registerQuery(t).mql.matches}))}},{key:"observe",value:function(t){var e=this,n=pD(BE(Pm(t)).map((function(t){return e._registerQuery(t).observable})));return(n=ig(n.pipe(kp(1)),n.pipe((function(t){return t.lift(new PE(1))}),Bv(0)))).pipe(nt((function(t){var e={matches:!1,breakpoints:{}};return t.forEach((function(t){var n=t.matches,i=t.query;e.matches=e.matches||n,e.breakpoints[i]=n})),e})))}},{key:"_registerQuery",value:function(t){var e=this;if(this._queries.has(t))return this._queries.get(t);var n=this._mediaMatcher.matchMedia(t),i={observable:new B((function(t){var i=function(n){return e._zone.run((function(){return t.next(n)}))};return n.addListener(i),function(){n.removeListener(i)}})).pipe(rg(n),nt((function(e){return{query:t,matches:e.matches}})),$m(this._destroySubject)),mql:n};return this._queries.set(t,i),i}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(RE),ve(Dc))},t.\u0275prov=At({factory:function(){return new t(ve(RE),ve(Dc))},token:t,providedIn:"root"}),t}();function BE(t){return t.map((function(t){return t.split(",")})).reduce((function(t,e){return t.concat(e)})).map((function(t){return t.trim()}))}var jE={tooltipState:D_("state",[A_("initial, void, hidden",O_({opacity:0,transform:"scale(0)"})),A_("visible",O_({transform:"scale(1)"})),I_("* => visible",L_("200ms cubic-bezier(0, 0, 0.2, 1)",P_([O_({opacity:0,transform:"scale(0)",offset:0}),O_({opacity:.5,transform:"scale(0.99)",offset:.5}),O_({opacity:1,transform:"scale(1)",offset:1})]))),I_("* => hidden",L_("100ms cubic-bezier(0, 0, 0.2, 1)",O_({opacity:0})))])},NE=Sg({passive:!0}),WE=new se("mat-tooltip-scroll-strategy"),VE={provide:WE,deps:[Tv],useFactory:function(t){return function(){return t.scrollStrategies.reposition({scrollThrottle:20})}}},zE=new se("mat-tooltip-default-options",{providedIn:"root",factory:function(){return{showDelay:0,hideDelay:0,touchendHideDelay:1500}}}),UE=function(){var t=function(){function t(e,n,i,r,a,o,s,u,l,c,d){var h=this;_(this,t),this._overlay=e,this._elementRef=n,this._scrollDispatcher=i,this._viewContainerRef=r,this._ngZone=a,this._platform=o,this._ariaDescriber=s,this._focusMonitor=u,this._dir=c,this._defaultOptions=d,this._position="below",this._disabled=!1,this._viewInitialized=!1,this._pointerExitEventsInitialized=!1,this.showDelay=this._defaultOptions.showDelay,this.hideDelay=this._defaultOptions.hideDelay,this.touchGestures="auto",this._message="",this._passiveListeners=[],this._destroyed=new z,this._handleKeydown=function(t){h._isTooltipVisible()&&t.keyCode===Xg&&!nv(t)&&(t.preventDefault(),t.stopPropagation(),h._ngZone.run((function(){return h.hide(0)})))},this._scrollStrategy=l,d&&(d.position&&(this.position=d.position),d.touchGestures&&(this.touchGestures=d.touchGestures)),a.runOutsideAngular((function(){n.nativeElement.addEventListener("keydown",h._handleKeydown)}))}return b(t,[{key:"ngAfterViewInit",value:function(){var t=this;this._viewInitialized=!0,this._setupPointerEnterEventsIfNeeded(),this._focusMonitor.monitor(this._elementRef).pipe($m(this._destroyed)).subscribe((function(e){e?"keyboard"===e&&t._ngZone.run((function(){return t.show()})):t._ngZone.run((function(){return t.hide(0)}))}))}},{key:"ngOnDestroy",value:function(){var t=this._elementRef.nativeElement;clearTimeout(this._touchstartTimeout),this._overlayRef&&(this._overlayRef.dispose(),this._tooltipInstance=null),t.removeEventListener("keydown",this._handleKeydown),this._passiveListeners.forEach((function(e){var n=u(e,2);t.removeEventListener(n[0],n[1],NE)})),this._passiveListeners.length=0,this._destroyed.next(),this._destroyed.complete(),this._ariaDescriber.removeDescription(t,this.message),this._focusMonitor.stopMonitoring(t)}},{key:"show",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.showDelay;if(!this.disabled&&this.message&&(!this._isTooltipVisible()||this._tooltipInstance._showTimeoutId||this._tooltipInstance._hideTimeoutId)){var n=this._createOverlay();this._detach(),this._portal=this._portal||new Bg(qE,this._viewContainerRef),this._tooltipInstance=n.attach(this._portal).instance,this._tooltipInstance.afterHidden().pipe($m(this._destroyed)).subscribe((function(){return t._detach()})),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),this._tooltipInstance.show(e)}}},{key:"hide",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.hideDelay;this._tooltipInstance&&this._tooltipInstance.hide(t)}},{key:"toggle",value:function(){this._isTooltipVisible()?this.hide():this.show()}},{key:"_isTooltipVisible",value:function(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()}},{key:"_createOverlay",value:function(){var t=this;if(this._overlayRef)return this._overlayRef;var e=this._scrollDispatcher.getAncestorScrollContainers(this._elementRef),n=this._overlay.position().flexibleConnectedTo(this._elementRef).withTransformOriginOn(".mat-tooltip").withFlexibleDimensions(!1).withViewportMargin(8).withScrollableContainers(e);return n.positionChanges.pipe($m(this._destroyed)).subscribe((function(e){t._tooltipInstance&&e.scrollableViewProperties.isOverlayClipped&&t._tooltipInstance.isVisible()&&t._ngZone.run((function(){return t.hide(0)}))})),this._overlayRef=this._overlay.create({direction:this._dir,positionStrategy:n,panelClass:"mat-tooltip-panel",scrollStrategy:this._scrollStrategy()}),this._updatePosition(),this._overlayRef.detachments().pipe($m(this._destroyed)).subscribe((function(){return t._detach()})),this._overlayRef}},{key:"_detach",value:function(){this._overlayRef&&this._overlayRef.hasAttached()&&this._overlayRef.detach(),this._tooltipInstance=null}},{key:"_updatePosition",value:function(){var t=this._overlayRef.getConfig().positionStrategy,e=this._getOrigin(),n=this._getOverlayPosition();t.withPositions([Object.assign(Object.assign({},e.main),n.main),Object.assign(Object.assign({},e.fallback),n.fallback)])}},{key:"_getOrigin",value:function(){var t,e=!this._dir||"ltr"==this._dir.value,n=this.position;"above"==n||"below"==n?t={originX:"center",originY:"above"==n?"top":"bottom"}:"before"==n||"left"==n&&e||"right"==n&&!e?t={originX:"start",originY:"center"}:("after"==n||"right"==n&&e||"left"==n&&!e)&&(t={originX:"end",originY:"center"});var i=this._invertPosition(t.originX,t.originY);return{main:t,fallback:{originX:i.x,originY:i.y}}}},{key:"_getOverlayPosition",value:function(){var t,e=!this._dir||"ltr"==this._dir.value,n=this.position;"above"==n?t={overlayX:"center",overlayY:"bottom"}:"below"==n?t={overlayX:"center",overlayY:"top"}:"before"==n||"left"==n&&e||"right"==n&&!e?t={overlayX:"end",overlayY:"center"}:("after"==n||"right"==n&&e||"left"==n&&!e)&&(t={overlayX:"start",overlayY:"center"});var i=this._invertPosition(t.overlayX,t.overlayY);return{main:t,fallback:{overlayX:i.x,overlayY:i.y}}}},{key:"_updateTooltipMessage",value:function(){var t=this;this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),this._ngZone.onMicrotaskEmpty.pipe(kp(1),$m(this._destroyed)).subscribe((function(){t._tooltipInstance&&t._overlayRef.updatePosition()})))}},{key:"_setTooltipClass",value:function(t){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=t,this._tooltipInstance._markForCheck())}},{key:"_invertPosition",value:function(t,e){return"above"===this.position||"below"===this.position?"top"===e?e="bottom":"bottom"===e&&(e="top"):"end"===t?t="start":"start"===t&&(t="end"),{x:t,y:e}}},{key:"_setupPointerEnterEventsIfNeeded",value:function(){var t=this;!this._disabled&&this.message&&this._viewInitialized&&!this._passiveListeners.length&&(this._platformSupportsMouseEvents()?this._passiveListeners.push(["mouseenter",function(){t._setupPointerExitEventsIfNeeded(),t.show()}]):"off"!==this.touchGestures&&(this._disableNativeGesturesIfNecessary(),this._passiveListeners.push(["touchstart",function(){t._setupPointerExitEventsIfNeeded(),clearTimeout(t._touchstartTimeout),t._touchstartTimeout=setTimeout((function(){return t.show()}),500)}])),this._addListeners(this._passiveListeners))}},{key:"_setupPointerExitEventsIfNeeded",value:function(){var t,e=this;if(!this._pointerExitEventsInitialized){this._pointerExitEventsInitialized=!0;var n=[];if(this._platformSupportsMouseEvents())n.push(["mouseleave",function(){return e.hide()}]);else if("off"!==this.touchGestures){this._disableNativeGesturesIfNecessary();var i=function(){clearTimeout(e._touchstartTimeout),e.hide(e._defaultOptions.touchendHideDelay)};n.push(["touchend",i],["touchcancel",i])}this._addListeners(n),(t=this._passiveListeners).push.apply(t,n)}}},{key:"_addListeners",value:function(t){var e=this;t.forEach((function(t){var n=u(t,2);e._elementRef.nativeElement.addEventListener(n[0],n[1],NE)}))}},{key:"_platformSupportsMouseEvents",value:function(){return!this._platform.IOS&&!this._platform.ANDROID}},{key:"_disableNativeGesturesIfNecessary",value:function(){var t=this.touchGestures;if("off"!==t){var e=this._elementRef.nativeElement,n=e.style;("on"===t||"INPUT"!==e.nodeName&&"TEXTAREA"!==e.nodeName)&&(n.userSelect=n.msUserSelect=n.webkitUserSelect=n.MozUserSelect="none"),"on"!==t&&e.draggable||(n.webkitUserDrag="none"),n.touchAction="none",n.webkitTapHighlightColor="transparent"}}},{key:"position",get:function(){return this._position},set:function(t){t!==this._position&&(this._position=t,this._overlayRef&&(this._updatePosition(),this._tooltipInstance&&this._tooltipInstance.show(0),this._overlayRef.updatePosition()))}},{key:"disabled",get:function(){return this._disabled},set:function(t){this._disabled=Em(t),this._disabled?this.hide(0):this._setupPointerEnterEventsIfNeeded()}},{key:"message",get:function(){return this._message},set:function(t){var e=this;this._ariaDescriber.removeDescription(this._elementRef.nativeElement,this._message),this._message=null!=t?String(t).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._setupPointerEnterEventsIfNeeded(),this._updateTooltipMessage(),this._ngZone.runOutsideAngular((function(){Promise.resolve().then((function(){e._ariaDescriber.describe(e._elementRef.nativeElement,e.message)}))})))}},{key:"tooltipClass",get:function(){return this._tooltipClass},set:function(t){this._tooltipClass=t,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Tv),gs(Hu),gs(Pg),gs(cl),gs(Dc),gs(bg),gs(t_),gs(m_),gs(WE),gs(Lg,8),gs(zE,8))},t.\u0275dir=ze({type:t,selectors:[["","matTooltip",""]],hostAttrs:[1,"mat-tooltip-trigger"],inputs:{showDelay:["matTooltipShowDelay","showDelay"],hideDelay:["matTooltipHideDelay","hideDelay"],touchGestures:["matTooltipTouchGestures","touchGestures"],position:["matTooltipPosition","position"],disabled:["matTooltipDisabled","disabled"],message:["matTooltip","message"],tooltipClass:["matTooltipClass","tooltipClass"]},exportAs:["matTooltip"]}),t}(),qE=function(){var t=function(){function t(e,n){_(this,t),this._changeDetectorRef=e,this._breakpointObserver=n,this._visibility="initial",this._closeOnInteraction=!1,this._onHide=new z,this._isHandset=this._breakpointObserver.observe("(max-width: 599.99px) and (orientation: portrait), (max-width: 959.99px) and (orientation: landscape)")}return b(t,[{key:"show",value:function(t){var e=this;this._hideTimeoutId&&(clearTimeout(this._hideTimeoutId),this._hideTimeoutId=null),this._closeOnInteraction=!0,this._showTimeoutId=setTimeout((function(){e._visibility="visible",e._showTimeoutId=null,e._markForCheck()}),t)}},{key:"hide",value:function(t){var e=this;this._showTimeoutId&&(clearTimeout(this._showTimeoutId),this._showTimeoutId=null),this._hideTimeoutId=setTimeout((function(){e._visibility="hidden",e._hideTimeoutId=null,e._markForCheck()}),t)}},{key:"afterHidden",value:function(){return this._onHide}},{key:"isVisible",value:function(){return"visible"===this._visibility}},{key:"ngOnDestroy",value:function(){this._onHide.complete()}},{key:"_animationStart",value:function(){this._closeOnInteraction=!1}},{key:"_animationDone",value:function(t){var e=t.toState;"hidden"!==e||this.isVisible()||this._onHide.next(),"visible"!==e&&"hidden"!==e||(this._closeOnInteraction=!0)}},{key:"_handleBodyInteraction",value:function(){this._closeOnInteraction&&this.hide(0)}},{key:"_markForCheck",value:function(){this._changeDetectorRef.markForCheck()}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Lo),gs(HE))},t.\u0275cmp=Fe({type:t,selectors:[["mat-tooltip-component"]],hostAttrs:["aria-hidden","true"],hostVars:2,hostBindings:function(t,e){1&t&&Ts("click",(function(){return e._handleBodyInteraction()}),!1,ln),2&t&&Zs("zoom","visible"===e._visibility?1:null)},decls:4,vars:7,consts:[[1,"mat-tooltip",3,"ngClass"]],template:function(t,e){var n;1&t&&(bs(0,"div",0),Ts("@state.start",(function(){return e._animationStart()}))("@state.done",(function(t){return e._animationDone(t)})),Tl(1,"async"),uu(2),ws(),uu(3,"\n")),2&t&&(Js("mat-tooltip-handset",null==(n=El(1,5,e._isHandset))?null:n.matches),_s("ngClass",e.tooltipClass)("@state",e._visibility),na(2),lu(e.message))},directives:[Ch],pipes:[Uh],styles:[".mat-tooltip-panel{pointer-events:none !important}.mat-tooltip{color:#fff;border-radius:4px;margin:14px;max-width:250px;padding-left:8px;padding-right:8px;overflow:hidden;text-overflow:ellipsis}.cdk-high-contrast-active .mat-tooltip{outline:solid 1px}.mat-tooltip-handset{margin:24px;padding-left:16px;padding-right:16px}\n"],encapsulation:2,data:{animation:[jE.tooltipState]},changeDetection:0}),t}(),GE=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[VE],imports:[[k_,df,Yv,xw],xw,Rg]}),t}(),KE=function(t){function e(e,n,i,r,a,o,s,u,l,c,d,h,f){var p=t.call(this,r,i,a,o,s,u,l,c,d,h,f)||this;return p.translate=e,p.renderer=n,p.elementRef=i,p.tooltipClass="error-tooltip",p}return Wk(e,t),Object.defineProperty(e.prototype,"appFormFieldError",{set:function(t){this.message=t?this.translate.instant(t):null,this.updateField()},enumerable:!1,configurable:!0}),e.prototype.updateField=function(){this.message?(this.renderer.addClass(this.elementRef.nativeElement,"red-field"),document.activeElement===this.elementRef.nativeElement&&this.show()):this.renderer.removeClass(this.elementRef.nativeElement,"red-field")},e.\u0275fac=function(t){return new(t||e)(gs(hC),gs(Wu),gs(Hu),gs(Tv),gs(Pg),gs(cl),gs(Dc),gs(bg),gs(t_),gs(m_),gs(WE),gs(Lg,8),gs(zE,8))},e.\u0275dir=ze({type:e,selectors:[["","appFormFieldError",""]],inputs:{appFormFieldError:"appFormFieldError"},features:[Jo]}),e}(UE),ZE=function(){function t(t){this.el=t,t.nativeElement.autocomplete="new-password",t.nativeElement.readOnly=!0}return t.prototype.onFocus=function(){this.el.nativeElement.readOnly=!1},t.\u0275fac=function(e){return new(e||t)(gs(Hu))},t.\u0275dir=ze({type:t,selectors:[["","appDontSavePassword",""]],hostBindings:function(t,e){1&t&&Ts("focus",(function(){return e.onFocus()}))}}),t}();function JE(t,e){if(1&t&&(bs(0,"div",1),uu(1,"\n "),bs(2,"label",10),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),bs(6,"div",11),uu(7,"\n "),bs(8,"select",12),uu(9,"\n "),bs(10,"option",13),uu(11),Tl(12,"translate"),ws(),uu(13,"\n "),bs(14,"option",13),uu(15),Tl(16,"translate"),ws(),uu(17,"\n "),ws(),uu(18,"\n "),ws(),uu(19,"\n "),ws()),2&t){var n=Ys();na(3),lu(El(4,6,"wallet.new.words-number-label")),na(5),ds("disabled",n.busy?"true":null),na(2),_s("ngValue",12),na(1),lu(El(12,8,"wallet.new.12-words")),na(3),_s("ngValue",24),na(1),lu(El(16,10,"wallet.new.24-words"))}}var QE=function(t,e){return{"-white-text":t,"element-disabled":e}};function XE(t,e){if(1&t){var n=xs();bs(0,"span",14),uu(1,"\n "),bs(2,"span",15),Ts("click",(function(){return Bn(n),Ys().generateSeed(128)})),Tl(3,"translate"),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),bs(7,"span",16),uu(8,"|"),ws(),uu(9,"\n "),bs(10,"span",15),Ts("click",(function(){return Bn(n),Ys().generateSeed(256)})),Tl(11,"translate"),uu(12),Tl(13,"translate"),ws(),uu(14,"\n "),ws()}if(2&t){var i=Ys();_s("ngClass",Ml(13,QE,i.onboarding,i.busy)),na(2),_s("matTooltip",El(3,5,"wallet.new.generate-12-help")),na(2),cu("\n ",El(5,7,"wallet.new.12-words"),"\n "),na(6),_s("matTooltip",El(11,9,"wallet.new.generate-24-help")),na(2),cu("\n ",El(13,11,"wallet.new.24-words"),"\n ")}}function $E(t,e){1&t&&(bs(0,"div",25),ks(1,"mat-spinner"),ws())}function tO(t,e){if(1&t&&(bs(0,"span",26),uu(1),ws()),2&t){var n=Ys(2);na(1),lu(n.lastAssistedSeed)}}var eO=function(t){return{"transparent-text":t}};function nO(t,e){if(1&t&&(bs(0,"div",27),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(2);_s("ngClass",kl(4,eO,n.onboarding)),na(1),lu(El(2,2,"wallet.new.seed.change-seed"))}}function iO(t,e){if(1&t&&(bs(0,"div",28),uu(1,"\n "),bs(2,"mat-icon",29),uu(3,"touch_app"),ws(),bs(4,"span",27),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),ws()),2&t){var n=Ys(2);na(4),_s("ngClass",kl(4,eO,n.onboarding)),na(1),lu(El(6,2,"wallet.new.seed.enter-seed"))}}var rO=function(t,e,n){return{"onboarding-version":t,"show-pointer":e,"element-disabled":n}},aO=function(t){return{"element-disabled":t}},oO=function(t){return{"-white-text":t}};function sO(t,e){if(1&t){var n=xs();Ms(0),uu(1,"\n "),bs(2,"div",17),Ts("click",(function(){return Bn(n),Ys().enterSeed()})),uu(3,"\n "),ps(4,$E,2,0,"div",18),uu(5,"\n "),ps(6,tO,2,1,"span",19),uu(7,"\n "),ps(8,nO,3,6,"div",20),uu(9,"\n "),ps(10,iO,8,6,"div",21),uu(11,"\n "),ws(),uu(12,"\n "),bs(13,"div",22),uu(14,"\n "),bs(15,"span",23),Ts("click",(function(){return Bn(n),Ys().changeSeedType()})),uu(16,"\n "),bs(17,"mat-icon",24),uu(18,"edit"),ws(),uu(19),Tl(20,"translate"),ws(),uu(21,"\n "),ws(),uu(22,"\n "),Ss()}if(2&t){var i=Ys();na(2),_s("ngClass",Sl(11,rO,i.onboarding,!i.create,i.busy)),na(2),_s("ngIf",i.checkingAssistedSeed),na(2),_s("ngIf",i.create||i.lastAssistedSeed),na(2),_s("ngIf",!i.create&&i.lastAssistedSeed),na(2),_s("ngIf",!i.create&&!i.lastAssistedSeed),na(3),_s("ngClass",kl(15,aO,i.busy)),na(2),_s("ngClass",kl(17,oO,i.onboarding)),na(2),_s("inline",!0),na(2),cu("\n ",El(20,9,"wallet.new.seed.use-custom"),"\n ")}}function uO(t,e){1&t&&(bs(0,"div",32),ks(1,"mat-spinner"),ws())}function lO(t,e){if(1&t){var n=xs();Ms(0),uu(1,"\n "),ps(2,uO,2,0,"div",30),uu(3,"\n "),bs(4,"textarea",31),Ts("blur",(function(){return Bn(n),Ys().validateForm()})),ws(),uu(5,"\n "),bs(6,"div",22),uu(7,"\n "),bs(8,"span",23),Ts("click",(function(){return Bn(n),Ys().changeSeedType()})),uu(9,"\n "),bs(10,"mat-icon",24),uu(11,"format_list_numbered"),ws(),uu(12),Tl(13,"translate"),ws(),uu(14,"\n "),ws(),uu(15,"\n "),Ss()}if(2&t){var i=Ys();na(2),_s("ngIf",i.checkingCustomSeed),na(2),_s("appFormFieldError",i.seed1ErrorMsg),ds("disabled",i.busy?"true":null),na(2),_s("ngClass",kl(9,aO,i.busy)),na(2),_s("ngClass",kl(11,oO,i.onboarding)),na(2),_s("inline",!0),na(2),cu("\n ",El(13,7,"wallet.new.seed.use-normal"),"\n ")}}var cO=function(t,e){return{"red-text":t,"white-text transparent-text":e}};function dO(t,e){if(1&t&&(bs(0,"p",33),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys();_s("ngClass",Ml(4,cO,!n.onboarding,n.onboarding)),na(1),cu("\n ",El(2,2,"wallet.new.seed-warning"),"\n ")}}function hO(t,e){if(1&t&&(bs(0,"div",28),uu(1,"\n "),bs(2,"mat-icon",29),uu(3,"touch_app"),ws(),bs(4,"span",27),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),ws()),2&t){var n=Ys(3);na(4),_s("ngClass",kl(4,eO,n.onboarding)),na(1),lu(El(6,2,"wallet.new.seed.confirm-seed"))}}function fO(t,e){if(1&t&&(bs(0,"div",28),uu(1,"\n "),bs(2,"mat-icon",35),uu(3,"done"),ws(),uu(4," "),bs(5,"span",27),uu(6),Tl(7,"translate"),ws(),uu(8,"\n "),ws()),2&t){var n=Ys(3);na(5),_s("ngClass",kl(4,eO,n.onboarding)),na(1),lu(El(7,2,"wallet.new.seed.confirmed-seed"))}}function pO(t,e){if(1&t){var n=xs();Ms(0),uu(1,"\n "),bs(2,"div",17),Ts("click",(function(){return Bn(n),Ys(2).confirmNormalSeed()})),uu(3,"\n "),ps(4,hO,8,6,"div",21),uu(5,"\n "),ps(6,fO,9,6,"div",21),uu(7,"\n "),ws(),uu(8,"\n "),Ss()}if(2&t){var i=Ys(2);na(2),_s("ngClass",Sl(3,rO,i.onboarding,!i.assistedSeedConfirmed,i.busy)),na(2),_s("ngIf",!i.assistedSeedConfirmed),na(2),_s("ngIf",i.assistedSeedConfirmed)}}function mO(t,e){1&t&&(bs(0,"div",32),ks(1,"mat-spinner"),ws())}function gO(t,e){if(1&t){var n=xs();Ms(0),uu(1,"\n "),ps(2,mO,2,0,"div",30),uu(3,"\n "),bs(4,"textarea",36),Ts("blur",(function(){return Bn(n),Ys(2).validateForm()})),ws(),uu(5,"\n "),Ss()}if(2&t){var i=Ys(2);na(2),_s("ngIf",i.checkingCustomSeed),na(2),_s("appFormFieldError",i.seed2ErrorMsg),ds("disabled",i.busy?"true":null)}}function vO(t,e){if(1&t&&(bs(0,"div",1),uu(1,"\n "),bs(2,"label",34),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ps(6,pO,9,7,"ng-container",7),uu(7,"\n\n "),ps(8,gO,6,3,"ng-container",7),uu(9,"\n "),ws()),2&t){var n=Ys();na(3),lu(El(4,3,"wallet.new.confirm-seed-label")),na(3),_s("ngIf",n.enterSeedWithAssistance),na(2),_s("ngIf",!n.enterSeedWithAssistance)}}function _O(t,e){if(1&t){var n=xs();bs(0,"div",44),uu(1,"\n "),bs(2,"div",1),uu(3,"\n "),bs(4,"label",45),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),bs(8,"input",46),Ts("blur",(function(){return Bn(n),Ys(2).validateForm()})),ws(),uu(9,"\n "),ws(),uu(10,"\n "),ws()}if(2&t){var i=Ys(2);na(5),lu(El(6,3,"password.password-label")),na(3),_s("appFormFieldError",i.password1ErrorMsg),ds("disabled",i.busy?"true":null)}}function yO(t,e){if(1&t){var n=xs();bs(0,"div",44),uu(1,"\n "),bs(2,"div",1),uu(3,"\n "),bs(4,"label",47),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),bs(8,"input",48),Ts("keydown.enter",(function(){return Bn(n),Ys(2).requestCreation()}))("blur",(function(){return Bn(n),Ys(2).validateForm()})),ws(),uu(9,"\n "),ws(),uu(10,"\n "),ws()}if(2&t){var i=Ys(2);na(5),lu(El(6,3,"password.confirm-password-label")),na(3),_s("appFormFieldError",i.password2ErrorMsg),ds("disabled",i.busy?"true":null)}}function bO(t,e){if(1&t){var n=xs();bs(0,"div"),uu(1,"\n "),bs(2,"div"),uu(3,"\n "),bs(4,"mat-checkbox",37),Ts("change",(function(t){return Bn(n),Ys().setEncrypt(t)})),uu(5,"\n "),bs(6,"span",38),ks(7,"img",39),uu(8),Tl(9,"translate"),ws(),uu(10,"\n "),ws(),uu(11,"\n "),ws(),uu(12,"\n "),bs(13,"div",40),uu(14,"\n "),bs(15,"div",41),uu(16,"\n "),bs(17,"p",42),uu(18),Tl(19,"translate"),ws(),uu(20,"\n "),ws(),uu(21,"\n "),ps(22,_O,11,5,"div",43),uu(23,"\n "),ps(24,yO,11,5,"div",43),uu(25,"\n "),ws(),uu(26,"\n "),ws()}if(2&t){var i=Ys();na(4),_s("checked",!0)("ngClass",kl(10,aO,i.busy)),na(4),cu(" ",El(9,6,"wallet.new.encrypt-check"),""),na(10),lu(El(19,8,"wallet.new.encrypt-warning")),na(4),_s("ngIf",i.encrypt),na(2),_s("ngIf",i.encrypt)}}function wO(t,e){if(1&t){var n=xs();bs(0,"div",49),uu(1,"\n "),bs(2,"mat-icon"),uu(3,"error"),ws(),uu(4,"\n "),bs(5,"div"),uu(6,"\n "),bs(7,"div",50),uu(8),Tl(9,"translate"),ws(),uu(10,"\n "),bs(11,"div"),uu(12),Tl(13,"translate"),ws(),uu(14,"\n "),bs(15,"mat-checkbox",51,52),Ts("change",(function(t){return Bn(n),Ys().onCustomSeedAcceptance(t)})),uu(17),Tl(18,"translate"),ws(),uu(19,"\n "),ws(),uu(20,"\n"),ws()}if(2&t){var i=Ys();na(8),lu(El(9,5,"wallet.new.unconventional-seed-title")),na(4),lu(El(13,7,"wallet.new.unconventional-seed-text")),na(3),_s("checked",i.customSeedAccepted)("ngClass",kl(11,aO,i.busy)),na(2),cu("\n ",El(18,9,"wallet.new.unconventional-seed-check"),"\n ")}}var kO=function(){function t(t,e,n){this.apiService=t,this.dialog=e,this.msgBarService=n,this.busy=!1,this.createRequested=new Rl,this.customSeedIsNormal=!0,this.customSeedAccepted=!1,this.encrypt=!0,this.enterSeedWithAssistance=!0,this.assistedSeedConfirmed=!1,this.lastAssistedSeed="",this.numberOfAutogeneratedWords=0,this.checkingCustomSeed=!1,this.checkingAssistedSeed=!1,this.labelErrorMsg="",this.seed1ErrorMsg="",this.seed2ErrorMsg="",this.password1ErrorMsg="",this.password2ErrorMsg="",this.seed=new z}return t.prototype.ngOnInit=function(){this.onboarding?this.initForm(!1,null):this.initForm()},t.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.statusSubscription.unsubscribe(),this.seedValiditySubscription.unsubscribe()},Object.defineProperty(t.prototype,"isValid",{get:function(){return!this.checkingCustomSeed&&this.form.valid&&(!this.enterSeedWithAssistance&&(this.customSeedIsNormal||this.customSeedAccepted)||this.create&&this.enterSeedWithAssistance&&this.assistedSeedConfirmed||!this.create&&this.enterSeedWithAssistance&&this.lastAssistedSeed.length>2)},enumerable:!1,configurable:!0}),t.prototype.onCustomSeedAcceptance=function(t){this.customSeedAccepted=t.checked},t.prototype.setEncrypt=function(t){this.encrypt=t.checked,this.form.updateValueAndValidity()},t.prototype.getData=function(){return{creatingNewWallet:this.create,label:this.form.value.label,seed:this.enterSeedWithAssistance?this.lastAssistedSeed:this.form.value.seed,password:!this.onboarding&&this.encrypt?this.form.value.password:null,enterSeedWithAssistance:this.enterSeedWithAssistance,lastAssistedSeed:this.lastAssistedSeed,lastCustomSeed:this.form.value.seed,numberOfWords:this.create?this.numberOfAutogeneratedWords:this.form.value.number_of_words}},t.prototype.changeSeedType=function(){var t=this;this.msgBarService.hide(),this.enterSeedWithAssistance?AE.openDialog(this.dialog,{text:this.create?"wallet.new.seed.custom-seed-warning-text":"wallet.new.seed.custom-seed-warning-text-recovering",headerText:"common.warning-title",checkboxText:this.create?"common.generic-confirmation-check":null,defaultButtons:OE.ContinueCancel,redTitle:!0}).afterClosed().subscribe((function(e){e&&(t.enterSeedWithAssistance=!1,t.removeConfirmations())})):(this.enterSeedWithAssistance=!0,this.removeConfirmations())},t.prototype.enterSeed=function(){this.create||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},t.prototype.confirmNormalSeed=function(){this.assistedSeedConfirmed||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},t.prototype.askForWord=function(t){var e=this;return tD.openDialog(this.dialog,{reason:this.create?$x.CreatingSoftwareWallet:$x.RecoveringSoftwareWallet,wordNumber:t+1}).afterClosed().subscribe((function(n){if(n){if(e.create&&n!==e.lastAssistedSeed.split(" ")[t])return void e.msgBarService.showError("wallet.new.seed.incorrect-word-error");if(e.partialSeed[t]=n,t+=1,e.create&&t0&&(!t.create||t.seedsAreEqual())?(t.checkingCustomSeed=!0,rp(0).pipe(up(500),st((function(){return t.apiService.post("wallet/seed/verify",{seed:e},{useV2:!0})})))):rp(0)}))).subscribe((function(){t.checkingCustomSeed=!1,t.customSeedIsNormal=!0}),(function(e){t.checkingCustomSeed=!1,(e=gm(e))&&e.originalError&&422===e.originalError.status?t.customSeedIsNormal=!1:(t.customSeedIsNormal=!0,t.msgBarService.showWarning("wallet.new.seed-checking-error")),t.subscribeToSeedValidation()}))},t.prototype.seedsAreEqual=function(){return this.form&&this.form.get("seed")&&this.form.get("confirm_seed")?this.form.get("seed").value===this.form.get("confirm_seed").value:(this.customSeedIsNormal=!0,!1)},t.prototype.validateForm=function(){this.labelErrorMsg="",this.seed1ErrorMsg="",this.seed2ErrorMsg="",this.password1ErrorMsg="",this.password2ErrorMsg="";var t=!0;if(this.form.get("label").value||(t=!1,this.form.get("label").touched&&(this.labelErrorMsg="wallet.new.name-error-info")),!this.enterSeedWithAssistance){var e=!0;this.form.get("seed").value||(t=!1,e=!1,this.customSeedIsNormal=!0,this.form.get("seed").touched&&(this.seed1ErrorMsg="wallet.new.seed-error-info")),this.create&&(this.form.get("confirm_seed").value||(t=!1,e=!1,this.customSeedIsNormal=!0,this.form.get("confirm_seed").touched&&(this.seed2ErrorMsg="wallet.new.seed-error-info")),e&&(this.seed2ErrorMsg||this.seedsAreEqual()||(t=!1,this.customSeedIsNormal=!0,this.seed2ErrorMsg="wallet.new.confirm-seed-error-info")))}if(this.encrypt&&!this.onboarding){var n=!0;this.form.get("password").value||(t=!1,n=!1,this.form.get("password").touched&&(this.password1ErrorMsg="password.password-error-info")),this.form.get("confirm_password").value||(t=!1,n=!1,this.form.get("confirm_password").touched&&(this.password2ErrorMsg="password.password-error-info")),n&&(this.password2ErrorMsg||this.form.get("password").value===this.form.get("confirm_password").value||(t=!1,this.password2ErrorMsg="password.confirm-error-info"))}return t?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(gs(ym),gs(Dk),gs(Gx))},t.\u0275cmp=Fe({type:t,selectors:[["app-create-wallet-form"]],inputs:{create:"create",onboarding:"onboarding",busy:"busy"},outputs:{createRequested:"createRequested"},decls:38,vars:17,consts:[[1,"main-container",3,"formGroup"],[1,"form-field"],["for","label"],["formControlName","label","id","label",3,"appFormFieldError","blur"],["class","form-field",4,"ngIf"],["for","seed"],["class","generators",3,"ngClass",4,"ngIf"],[4,"ngIf"],["class","disclaimer-box",3,"ngClass",4,"ngIf"],["class","alert-box",4,"ngIf"],["for","number_of_words"],[1,"-select"],["formControlName","number_of_words","id","number_of_words"],[3,"ngValue"],[1,"generators",3,"ngClass"],[1,"link",3,"matTooltip","click"],[1,"divider"],[1,"dashed-border","non-editable-field",3,"ngClass","click"],["class","seed-spinner assisted-seed-spinner",4,"ngIf"],["class","normal-seed-field",4,"ngIf"],[3,"ngClass",4,"ngIf"],["class","text-with-icon-container",4,"ngIf"],[1,"seed-type-button",3,"ngClass"],[1,"link",3,"ngClass","click"],[3,"inline"],[1,"seed-spinner","assisted-seed-spinner"],[1,"normal-seed-field"],[3,"ngClass"],[1,"text-with-icon-container"],[1,"yellow-text"],["class","seed-spinner",4,"ngIf"],["formControlName","seed","id","seed","rows","2",3,"appFormFieldError","blur"],[1,"seed-spinner"],[1,"disclaimer-box",3,"ngClass"],["for","confirm_seed"],[1,"green-text"],["formControlName","confirm_seed","id","confirm_seed","rows","2",3,"appFormFieldError","blur"],["type","checkbox","id","encrypt",1,"-check",3,"checked","ngClass","change"],[1,"img-label-container"],["src","assets/img/lock-gold.png"],[1,"row","-passwords"],[1,"col-md-12"],[1,"-info"],["class","col-md-6",4,"ngIf"],[1,"col-md-6"],["for","password"],["formControlName","password","id","password","type","password","appDontSavePassword","",3,"appFormFieldError","blur"],["for","confirm_password"],["formControlName","confirm_password","id","confirm_password","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],[1,"alert-box"],[1,"title"],["type","checkbox",1,"-check",3,"checked","ngClass","change"],["seedCheck",""]],template:function(t,e){1&t&&(bs(0,"div",0),uu(1,"\n "),bs(2,"div",1),uu(3,"\n "),bs(4,"label",2),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),bs(8,"input",3),Ts("blur",(function(){return e.validateForm()})),ws(),uu(9,"\n "),ws(),uu(10,"\n "),ps(11,JE,20,12,"div",4),uu(12,"\n "),bs(13,"div",1),uu(14,"\n "),bs(15,"label",5),uu(16,"\n "),bs(17,"span"),uu(18),Tl(19,"translate"),ws(),uu(20,"\n "),ps(21,XE,15,16,"span",6),uu(22,"\n "),ws(),uu(23,"\n\n "),ps(24,sO,23,19,"ng-container",7),uu(25,"\n\n "),ps(26,lO,16,13,"ng-container",7),uu(27,"\n\n "),ps(28,dO,3,7,"p",8),uu(29,"\n "),ws(),uu(30,"\n "),ps(31,vO,10,5,"div",4),uu(32,"\n "),ps(33,bO,27,12,"div",7),uu(34,"\n"),ws(),uu(35,"\n"),ps(36,wO,21,13,"div",9),uu(37,"\n")),2&t&&(_s("formGroup",e.form),na(5),lu(El(6,13,"wallet.new.name-label")),na(3),_s("appFormFieldError",e.labelErrorMsg),ds("disabled",e.busy?"true":null),na(3),_s("ngIf",!e.create&&e.enterSeedWithAssistance),na(7),lu(El(19,15,"wallet.new.seed-label")),na(3),_s("ngIf",e.create),na(3),_s("ngIf",e.enterSeedWithAssistance),na(2),_s("ngIf",!e.enterSeedWithAssistance),na(2),_s("ngIf",e.create),na(3),_s("ngIf",e.create),na(2),_s("ngIf",!e.onboarding),na(3),_s("ngIf",e.form.valid&&!e.customSeedIsNormal))},directives:[rM,hS,Qk,iM,yS,KE,Eh,CM,xM,EM,Ch,UE,vx,CC,wE,ZE],pipes:[pC],styles:[".main-container[_ngcontent-%COMP%]{font-size:12px}.dashed-border[_ngcontent-%COMP%]{border:2px dashed rgba(30,34,39,.05)}.show-pointer[_ngcontent-%COMP%]{cursor:pointer}.non-editable-field[_ngcontent-%COMP%]{text-align:center;padding:15px;border-radius:6px;color:#1e2227}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%]{display:inline-flex;align-items:center}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:5px;opacity:1}.normal-seed-field[_ngcontent-%COMP%]{font-size:14px}.seed-type-button[_ngcontent-%COMP%]{text-align:right}.seed-type-button[_ngcontent-%COMP%], .seed-type-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{position:relative;top:2px}.onboarding-version[_ngcontent-%COMP%]{border:2px dashed hsla(0,0%,100%,.25);color:#fafafa}.transparent-text[_ngcontent-%COMP%]{opacity:.75}.disclaimer-box[_ngcontent-%COMP%]{padding:0 10px;line-height:1.5}label[for=seed][_ngcontent-%COMP%]{display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px;color:#1e2227}.-white-text[_ngcontent-%COMP%], .-white-text[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fafafa!important}.-passwords[_ngcontent-%COMP%]{margin-left:24px}.-passwords[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin:5px 0 15px;color:rgba(30,34,39,.5);line-height:1.5}.seed-spinner[_ngcontent-%COMP%]{height:0;position:relative;top:2px;left:2px}.seed-spinner[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{position:absolute}.seed-spinner[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%], .seed-spinner[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:10px!important;width:10px!important}.assisted-seed-spinner[_ngcontent-%COMP%]{top:-14px!important;left:-14px!important}"]}),t}(),MO=function(){function t(t,e,n){var i=this;this.walletsAndAddressesService=t,this.apiService=e,this.ngZone=n,this.walletsWithBalanceSubject=new fg(1),this.hasPendingTransactionsSubject=new Cm(!1),this.firstFullUpdateMadeSubject=new Cm(!1),this.updatePeriod=1e4,this.errorUpdatePeriod=2e3,this.savedBalanceData=new Map,this.temporalSavedBalanceData=new Map,this.walletsAndAddressesService.allWallets.subscribe((function(t){i.savedWalletsList=t,i.startDataRefreshSubscription(0,!0)}))}return Object.defineProperty(t.prototype,"walletsWithBalance",{get:function(){return this.walletsWithBalanceSubject.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"hasPendingTransactions",{get:function(){return this.hasPendingTransactionsSubject.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"firstFullUpdateMade",{get:function(){return this.firstFullUpdateMadeSubject.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"outputsWithWallets",{get:function(){var t=this;return this.walletsWithBalance.pipe(ag((function(e){var n=e.map((function(t){return t.addresses.map((function(t){return t.address})).join(",")})).join(",");return t.getOutputs(n)})),nt((function(e){var n=[];return t.walletsWithBalanceList.forEach((function(t){return n.push(function(t){var e=new cD;return Object.assign(e,aD(t,!1)),t.addresses.forEach((function(t){e.addresses.push(function(t){var e=new dD;return Object.assign(e,oD(t)),e}(t))})),e}(t))})),n.forEach((function(t){t.addresses.forEach((function(t){t.outputs=e.filter((function(e){return e.address===t.address}))}))})),n})))},enumerable:!1,configurable:!0}),t.prototype.getOutputs=function(t){return t?this.apiService.post("outputs",{addrs:t}).pipe(nt((function(t){var e=[];return t.head_outputs.forEach((function(t){var n={address:t.address,coins:new hp.BigNumber(t.coins),hash:t.hash,hours:new hp.BigNumber(t.calculated_hours)};e.push(n)})),e}))):rp([])},t.prototype.getWalletUnspentOutputs=function(t){var e=t.addresses.map((function(t){return t.address})).join(",");return this.getOutputs(e)},t.prototype.refreshBalance=function(){this.startDataRefreshSubscription(0,!1)},t.prototype.startDataRefreshSubscription=function(t,e){var n=this;this.dataRefreshSubscription&&this.dataRefreshSubscription.unsubscribe(),this.savedWalletsList&&this.ngZone.runOutsideAngular((function(){n.dataRefreshSubscription=rp(0).pipe(up(t),st((function(){return e?n.refreshBalances(n.savedWalletsList,!0):rp(0)})),st((function(){return n.refreshBalances(n.savedWalletsList,!1)}))).subscribe((function(){return n.startDataRefreshSubscription(n.updatePeriod,!1)}),(function(){return n.startDataRefreshSubscription(n.errorUpdatePeriod,!1)}))}))},t.prototype.refreshBalances=function(t,e){var n=this;this.gettingBalanceSubscription&&this.gettingBalanceSubscription.unsubscribe();var i=[];return t.forEach((function(t){i.push(function(t){var e=new uD;return Object.assign(e,aD(t,!1)),t.addresses.forEach((function(t){e.addresses.push(function(t){var e=new lD;return Object.assign(e,oD(t)),e}(t))})),e}(t))})),e||(this.temporalSavedBalanceData=new Map),zk(i.map((function(t){return n.retrieveWalletBalance(t,e)}))).pipe(Rv((function(t){if(n.hasPendingTransactionsSubject.next(t.some((function(t){return t}))),!n.walletsWithBalanceList||e||n.walletsWithBalanceList.length!==i.length)n.walletsWithBalanceList=i,n.informDataUpdated();else{var r=!1;n.walletsWithBalanceList.forEach((function(t,e){t.id!==i[e].id&&(r=!0)})),r?(n.walletsWithBalanceList=i,n.informDataUpdated()):(n.walletsWithBalanceList.forEach((function(t,e){t.coins.isEqualTo(i[e].coins)&&t.hours.isEqualTo(i[e].hours)||(t.coins=i[e].coins,t.hours=i[e].hours,r=!0),t.addresses.length!==i[e].addresses.length?(t.addresses=i[e].addresses,r=!0):t.addresses.forEach((function(t,n){t.coins.isEqualTo(i[e].addresses[n].coins)&&t.hours.isEqualTo(i[e].addresses[n].hours)||(t.coins=i[e].addresses[n].coins,t.hours=i[e].addresses[n].hours,r=!0)}))})),r&&n.informDataUpdated())}e||(n.savedBalanceData=n.temporalSavedBalanceData,n.firstFullUpdateMadeSubject.value||n.ngZone.run((function(){n.firstFullUpdateMadeSubject.next(!0)})))})))},t.prototype.retrieveWalletBalance=function(t,e){var n,i=this;if(e)n=this.savedBalanceData.has(t.id)?rp(this.savedBalanceData.get(t.id)):rp({addresses:[]});else if(t.isHardware){var r=t.addresses.map((function(t){return t.address})).join(",");n=this.apiService.post("balance",{addrs:r})}else n=this.apiService.get("wallet/balance",{id:t.id});return n.pipe(nt((function(n){return i.temporalSavedBalanceData.set(t.id,n),n.confirmed?(t.coins=new hp.BigNumber(n.confirmed.coins).dividedBy(1e6),t.hours=new hp.BigNumber(n.confirmed.hours)):(t.coins=new hp.BigNumber(0),t.hours=new hp.BigNumber(0)),t.addresses.forEach((function(t){n.addresses[t.address]?(t.coins=new hp.BigNumber(n.addresses[t.address].confirmed.coins).dividedBy(1e6),t.hours=new hp.BigNumber(n.addresses[t.address].confirmed.hours)):(t.coins=new hp.BigNumber(0),t.hours=new hp.BigNumber(0))})),e?i.hasPendingTransactionsSubject.value:!new hp.BigNumber(n.predicted.coins).dividedBy(1e6).isEqualTo(t.coins)||!new hp.BigNumber(n.predicted.hours).isEqualTo(t.hours)})))},t.prototype.informDataUpdated=function(){var t=this;this.ngZone.run((function(){t.walletsWithBalanceSubject.next(t.walletsWithBalanceList)}))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(hD),ve(ym),ve(Dc))}}),t}(),SO=function(){function t(t,e,n){this.apiService=t,this.ngZone=e,this.balanceAndOutputsService=n,this.progressSubject=new fg(1),this.lastCurrentBlock=0,this.lastHighestBlock=0,this.nodeSynchronized=!1,this.refreshedBalance=!1,this.updatePeriod=2e3,this.errorUpdatePeriod=2e3,this.startDataRefreshSubscription(0)}return Object.defineProperty(t.prototype,"progress",{get:function(){return this.progressSubject.asObservable()},enumerable:!1,configurable:!0}),t.prototype.getLastBlock=function(){return this.apiService.get("last_blocks",{num:1}).pipe(nt((function(t){return{seq:t.blocks[0].header.seq,timestamp:t.blocks[0].header.timestamp,hash:t.blocks[0].header.block_hash}})))},t.prototype.getCoinSupply=function(){return this.apiService.get("coinSupply").pipe(nt((function(t){return{currentSupply:t.current_supply,totalSupply:t.total_supply,currentCoinhourSupply:t.current_coinhour_supply,totalCoinhourSupply:t.total_coinhour_supply}})))},t.prototype.startDataRefreshSubscription=function(t){var e=this;this.dataSubscription&&this.dataSubscription.unsubscribe(),this.ngZone.runOutsideAngular((function(){e.dataSubscription=rp(0).pipe(up(t),st((function(){return e.apiService.get("blockchain/progress")}))).subscribe((function(t){e.ngZone.run((function(){!t||!t.current||!t.highest||0===t.highest||t.currents[0]||u===s[0]&&(l>s[1]||l===s[1]&&i.rawResponse.fw_patch>=s[2]))&&(a=!0)}}var c=[],d=!1;i.rawResponse.needs_backup&&(c.push(FO.NeedsBackup),d=!0),i.rawResponse.pin_protection||(c.push(FO.NeedsPin),d=!0),r?a||(c.push(FO.OutdatedFirmware),d=!0):c.push(FO.FirmwareVersionNotVerified);var h=!1;if(t){var f=!1,p=i.rawResponse.label?i.rawResponse.label:i.rawResponse.deviceId?i.rawResponse.deviceId:i.rawResponse.device_id;t.label!==p&&(t.label=p,h=!0,f=!0),t.hasHwSecurityWarnings!==d&&(t.hasHwSecurityWarnings=d,f=!0),f&&n.walletsAndAddressesService.informValuesUpdated(t)}return{features:i.rawResponse,securityWarnings:c,walletNameUpdated:h}}))):null},t.prototype.confirmAddress=function(t,e){var n=this;return this.hwWalletService.checkIfCorrectHwConnected(t.id).pipe(st((function(){return n.hwWalletService.confirmAddress(e)})),nt((function(){t.addresses[e].confirmed=!0,n.walletsAndAddressesService.informValuesUpdated(t)})))},t.prototype.changeLabel=function(t,e){var n=this;return this.hwWalletService.checkIfCorrectHwConnected(t.id).pipe(st((function(){return n.hwWalletService.changeLabel(e)})),nt((function(){t.label=e,n.walletsAndAddressesService.informValuesUpdated(t)})))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(hD),ve(jk),ve(Qp))}}),t}(),BO=["button"];function jO(t,e){1&t&&(bs(0,"div"),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),cu("\n ",El(2,1,"hardware-wallet.added.characters-warning"),"\n "))}var NO=function(t){return{"modal-form-container":t}};function WO(t,e){if(1&t){var n=xs();Ms(0),uu(1,"\n "),ps(2,jO,3,3,"div",1),uu(3,"\n "),bs(4,"div",3),uu(5,"\n "),bs(6,"div",4),uu(7,"\n "),bs(8,"label",5),uu(9),Tl(10,"translate"),ws(),uu(11,"\n "),bs(12,"input",6),Ts("keydown.enter",(function(){return Bn(n),Ys().rename()}))("blur",(function(){return Bn(n),Ys().validateForm()})),ws(),uu(13,"\n "),ws(),uu(14,"\n "),ws(),uu(15,"\n "),bs(16,"div",7),uu(17,"\n "),bs(18,"app-button",8),Ts("action",(function(){return Bn(n),Ys().closePopup()})),uu(19),Tl(20,"translate"),ws(),uu(21,"\n "),bs(22,"app-button",9,10),Ts("action",(function(){return Bn(n),Ys().rename()})),uu(24),Tl(25,"translate"),ws(),uu(26,"\n "),ws(),uu(27,"\n "),Ss()}if(2&t){var i=ms(23),r=Ys();na(2),_s("ngIf",r.showCharactersWarning),na(2),_s("ngClass",kl(17,NO,r.showCharactersWarning))("formGroup",r.form),na(5),lu(El(10,11,"wallet.rename.name-label")),na(3),_s("maxlength",r.data.wallet.isHardware?r.maxHwWalletLabelLength:null)("appFormFieldError",r.inputErrorMsg),ds("disabled",r.working?"true":null),na(6),_s("disabled",i&&i.isLoading()),na(1),cu("\n ",El(20,13,"common.cancel-button"),"\n "),na(3),_s("disabled",!r.form.valid),na(2),cu("\n ",El(25,15,"wallet.rename.rename-button"),"\n ")}}function VO(t,e){if(1&t&&(ks(0,"app-hw-message",11),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,2,"hardware-wallet.general.confirm"))("icon",n.msgIcons.Confirm)}}var zO=function(t){return t[t.Initial=0]="Initial",t[t.WaitingForConfirmation=1]="WaitingForConfirmation",t}({}),UO=function(){return function(){}}(),qO=function(){return function(){}}(),GO=function(){function t(t,e,n,i,r,a,o){this.dialogRef=t,this.data=e,this.formBuilder=n,this.hwWalletService=i,this.msgBarService=r,this.softwareWalletService=a,this.hardwareWalletService=o,this.currentState=zO.Initial,this.states=zO,this.msgIcons=UC,this.maxHwWalletLabelLength=jk.maxLabelLength,this.showCharactersWarning=!1,this.working=!1,this.inputErrorMsg=""}return t.openDialog=function(e,n,i){var r=new pk;return r.data=n,r.autoFocus=!0,r.width=i?"400px":Mm.mediumModalWidth,e.open(t,r)},t.prototype.ngOnInit=function(){var t=this;this.data.newName?this.finishRenaming(this.data.newName):(this.form=this.formBuilder.group({label:[this.data.wallet.label]}),this.form.setValidators(this.validateForm.bind(this))),this.data.wallet.isHardware&&(this.showCharactersWarning=!0,this.hwConnectionSubscription=this.hwWalletService.walletConnectedAsyncEvent.subscribe((function(e){e||t.closePopup()})))},t.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.hwConnectionSubscription&&this.hwConnectionSubscription.unsubscribe(),this.operationSubscription&&this.operationSubscription.unsubscribe()},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.rename=function(){this.form.valid&&!this.button.isLoading()&&(this.msgBarService.hide(),this.button.setLoading(),this.finishRenaming(this.form.value.label))},t.prototype.finishRenaming=function(t){var e=this;this.working=!0,this.newLabel=t,this.data.wallet.isHardware?(this.currentState=zO.WaitingForConfirmation,this.operationSubscription=this.hardwareWalletService.changeLabel(this.data.wallet,this.newLabel).subscribe((function(){e.working=!1,e.dialogRef.close(e.newLabel),e.data.newName||setTimeout((function(){return e.msgBarService.showDone("common.changes-made")}))}),(function(t){if(e.working=!1,e.data.newName){var n=new qO;n.errorMsg=gm(t).translatableErrorMsg,e.dialogRef.close(n)}else e.msgBarService.showError(t),e.currentState=zO.Initial,e.button&&e.button.resetState()}))):this.operationSubscription=this.softwareWalletService.renameWallet(this.data.wallet,this.newLabel).subscribe((function(){e.working=!1,e.dialogRef.close(e.newLabel),setTimeout((function(){return e.msgBarService.showDone("common.changes-made")}))}),(function(t){e.working=!1,e.msgBarService.showError(t),e.button&&e.button.resetState()}))},t.prototype.validateForm=function(){this.inputErrorMsg="";var t=!0;return this.form.get("label").value||(t=!1,this.form.get("label").touched&&(this.inputErrorMsg="wallet.rename.label-error-info")),t?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(gs(bk),gs(kk),gs(YS),gs(jk),gs(Gx),gs(RO),gs(HO))},t.\u0275cmp=Fe({type:t,selectors:[["app-change-name"]],viewQuery:function(t,e){var n;1&t&&Zl(BO,!0),2&t&&Gl(n=tc())&&(e.button=n.first)},decls:8,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon",4,"ngIf"],[3,"ngClass","formGroup"],[1,"form-field"],["for","label"],["formControlName","label","id","label",3,"maxlength","appFormFieldError","keydown.enter","blur"],[1,"-buttons"],[3,"disabled","action"],[1,"primary-button",3,"disabled","action"],["button",""],[3,"text","icon"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),ps(3,WO,28,19,"ng-container",1),uu(4,"\n\n "),ps(5,VO,2,4,"app-hw-message",2),uu(6,"\n"),ws(),uu(7,"\n")),2&t&&(_s("headline",El(1,5,"wallet.rename.title"))("dialog",e.dialogRef)("disableDismiss",e.button&&e.button.isLoading()||e.currentState===e.states.WaitingForConfirmation),na(3),_s("ngIf",e.currentState===e.states.Initial),na(2),_s("ngIf",e.currentState===e.states.WaitingForConfirmation))},directives:[jS,Eh,Ch,rM,hS,Qk,iM,yS,ES,KE,Cx,qC],pipes:[pC],styles:[""]}),t}(),KO=["input"];function ZO(t,e){if(1&t&&(ks(0,"app-hw-message",4),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,2,"hardware-wallet.added.configuring"))("icon",n.msgIcons.Spinner)}}function JO(t,e){if(1&t&&(ks(0,"app-hw-message",4),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,2,n.result.text))("icon",n.result.icon)}}function QO(t,e){if(1&t){var n=xs();bs(0,"div"),uu(1,"\n "),ks(2,"app-hw-message",5),Tl(3,"translate"),uu(4,"\n "),bs(5,"div",6),uu(6),Tl(7,"translate"),ws(),uu(8,"\n "),bs(9,"div",7),uu(10,"\n "),bs(11,"div",8),uu(12,"\n "),bs(13,"input",9,10),Ts("keydown.enter",(function(){return Bn(n),Ys().saveNameAndCloseModal()}))("blur",(function(){return Bn(n),Ys().validateForm()})),ws(),uu(15,"\n "),ws(),uu(16,"\n "),ws(),uu(17,"\n "),bs(18,"div",11),uu(19),Tl(20,"translate"),ws(),uu(21,"\n \n "),bs(22,"div"),uu(23),Tl(24,"translate"),ws(),uu(25,"\n "),ws()}if(2&t){var i=Ys();na(2),_s("upperBigText",El(3,8,"hardware-wallet.added.done"))("icon",i.msgIcons.Success),na(4),lu(El(7,10,"hardware-wallet.added.added1")),na(3),_s("formGroup",i.form),na(4),_s("maxlength",i.maxHwWalletLabelLength)("appFormFieldError",i.inputErrorMsg),na(6),lu(El(20,12,"hardware-wallet.added.characters-warning")),na(4),lu(El(24,14,"hardware-wallet.added.added2"))}}function XO(t,e){if(1&t){var n=xs();bs(0,"div",12),uu(1,"\n "),bs(2,"app-button",13,14),Ts("action",(function(){Bn(n);var t=Ys();return t.currentState===t.states.Finished?t.saveNameAndCloseModal():t.closeModal()})),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()}if(2&t){var i=Ys();na(2),_s("disabled",i.currentState===i.states.Finished&&!i.form.valid),na(2),cu("\n ",El(5,2,i.currentState===i.states.Finished?"common.continue-button":"common.close-button"),"\n ")}}var $O=function(t){function e(e,n,i,r,a,o,s,u){var l=t.call(this,i,n)||this;return l.data=e,l.dialogRef=n,l.formBuilder=r,l.dialog=a,l.msgBarService=o,l.walletsAndAddressesService=s,l.hardwareWalletService=u,l.maxHwWalletLabelLength=jk.maxLabelLength,l.inputErrorMsg="",l.operationSubscription=l.walletsAndAddressesService.createHardwareWallet().subscribe((function(t){l.operationSubscription=l.hardwareWalletService.getFeaturesAndUpdateData(t).subscribe((function(){l.wallet=t,l.initialLabel=t.label,l.form=l.formBuilder.group({label:[t.label]}),l.form.setValidators(l.validateForm.bind(l)),l.currentState=l.states.Finished,l.data.requestOptionsComponentRefresh(),setTimeout((function(){return l.input.nativeElement.focus()}))}),(function(t){return l.processError(t)}))}),(function(t){return l.processError(t)})),l}return Wk(e,t),e.prototype.processError=function(t){t=gm(t),this.processHwOperationError(t),this.data.requestOptionsComponentRefresh(t.translatableErrorMsg)},e.prototype.ngOnDestroy=function(){t.prototype.ngOnDestroy.call(this),this.msgBarService.hide()},e.prototype.saveNameAndCloseModal=function(){var t=this;if(this.form.value.label===this.initialLabel)this.closeModal();else{this.msgBarService.hide();var e=new UO;e.wallet=this.wallet,e.newName=this.form.value.label,GO.openDialog(this.dialog,e,!0).afterClosed().subscribe((function(e){e&&!e.errorMsg?t.closeModal():e&&e.errorMsg&&t.msgBarService.showError(e.errorMsg)}))}},e.prototype.validateForm=function(){this.inputErrorMsg="";var t=!0;return this.form.get("label").value||(t=!1,this.form.get("label").touched&&(this.inputErrorMsg="hardware-wallet.added.added-error-info")),t?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(gs(kk),gs(bk),gs(jk),gs(YS),gs(Dk),gs(Gx),gs(hD),gs(HO))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-added-dialog"]],viewQuery:function(t,e){var n;1&t&&Zl(KO,!0),2&t&&Gl(n=tc())&&(e.input=n.first)},features:[Jo],decls:15,vars:9,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","icon",4,"ngIf"],[4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","icon"],[3,"upperBigText","icon"],[1,"upper-text"],[3,"formGroup"],[1,"form-field"],["formControlName","label","id","label",3,"maxlength","appFormFieldError","keydown.enter","blur"],["input",""],[1,"warning"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"],["closeButton",""]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ps(4,ZO,2,4,"app-hw-message",1),uu(5,"\n\n "),uu(6,"\n "),ps(7,JO,2,4,"app-hw-message",1),uu(8,"\n\n "),uu(9,"\n "),ps(10,QO,26,16,"div",2),uu(11,"\n\n "),ps(12,XO,7,4,"div",3),uu(13,"\n"),ws(),uu(14,"\n")),2&t&&(_s("headline",El(1,7,"hardware-wallet.added.title"))("dialog",e.dialogRef)("disableDismiss",e.currentState===e.states.Initial),na(4),_s("ngIf",e.currentState===e.states.Initial),na(3),_s("ngIf",e.currentState===e.states.ShowingResult),na(3),_s("ngIf",e.currentState===e.states.Finished),na(2),_s("ngIf",e.currentState===e.states.Finished||e.currentState===e.states.ShowingResult))},directives:[jS,Eh,qC,rM,hS,Qk,iM,yS,ES,KE,Cx],pipes:[pC],styles:[".upper-text[_ngcontent-%COMP%]{margin-top:10px;margin-bottom:10px}.warning[_ngcontent-%COMP%]{margin:-20px 0 20px;color:rgba(30,34,39,.5)}"]}),e}(Lx);function tA(t,e){if(1&t){var n=xs();bs(0,"div"),uu(1,"\n "),ks(2,"app-hw-message",4),Tl(3,"translate"),uu(4,"\n\n "),bs(5,"div",5),uu(6,"\n "),bs(7,"div",6),uu(8,"\n "),bs(9,"div",7),uu(10,"\n "),bs(11,"select",8),uu(12,"\n "),bs(13,"option",9),uu(14),Tl(15,"translate"),ws(),uu(16,"\n "),bs(17,"option",9),uu(18),Tl(19,"translate"),ws(),uu(20,"\n "),ws(),uu(21,"\n "),ws(),uu(22,"\n "),ws(),uu(23,"\n "),ws(),uu(24,"\n\n "),bs(25,"div",10),uu(26,"\n "),bs(27,"app-button",11),Ts("action",(function(){return Bn(n),Ys().closeModal()})),uu(28),Tl(29,"translate"),ws(),uu(30,"\n "),bs(31,"app-button",12),Ts("action",(function(){return Bn(n),Ys().startOperation()})),uu(32),Tl(33,"translate"),ws(),uu(34,"\n "),ws(),uu(35,"\n "),ws()}if(2&t){var i=Ys();na(2),_s("text",El(3,8,"hardware-wallet.generate-seed.text")),na(3),_s("formGroup",i.form),na(8),_s("ngValue",12),na(1),lu(El(15,10,"wallet.new.12-words")),na(3),_s("ngValue",24),na(1),lu(El(19,12,"wallet.new.24-words")),na(10),cu("\n ",El(29,14,"common.cancel-button"),"\n "),na(4),cu("\n ",El(33,16,"common.continue-button"),"\n ")}}function eA(t,e){if(1&t&&(ks(0,"app-hw-message",13),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,2,"hardware-wallet.generate-seed.configuring"))("icon",n.msgIcons.Spinner)}}function nA(t,e){if(1&t&&(ks(0,"app-hw-message",13),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,2,n.result.text))("icon",n.result.icon)}}function iA(t,e){if(1&t){var n=xs();bs(0,"div",10),uu(1,"\n "),bs(2,"app-button",12,14),Ts("action",(function(){return Bn(n),Ys().closeModal()})),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()}2&t&&(na(4),cu("\n ",El(5,1,"common.close-button"),"\n "))}var rA=function(t){function e(e,n,i,r){var a=t.call(this,i,n)||this;return a.data=e,a.dialogRef=n,a.hwWalletService=i,a.form=r.group({words:[24,cM.required]}),a}return Wk(e,t),e.prototype.startOperation=function(){var t=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.generateMnemonic(this.form.controls.words.value).subscribe((function(){t.data.requestOptionsComponentRefresh(),t.closeModal()}),(function(e){return t.processHwOperationError(e)}))},e.\u0275fac=function(t){return new(t||e)(gs(kk),gs(bk),gs(jk),gs(YS))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-generate-seed-dialog"]],features:[Jo],decls:16,vars:9,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],[1,"-select"],["formControlName","words","id","words"],[3,"ngValue"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],[3,"text","icon"],["closeButton",""]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ps(4,tA,36,18,"div",1),uu(5,"\n\n "),uu(6,"\n "),ps(7,eA,2,4,"app-hw-message",2),uu(8,"\n\n "),uu(9,"\n "),ps(10,nA,2,4,"app-hw-message",2),uu(11,"\n\n "),uu(12,"\n "),ps(13,iA,7,3,"div",3),uu(14,"\n"),ws(),uu(15,"\n")),2&t&&(_s("headline",El(1,7,"hardware-wallet.options.configure-automatically"))("dialog",e.dialogRef)("disableDismiss",e.currentState===e.states.Processing),na(4),_s("ngIf",e.currentState===e.states.Initial),na(3),_s("ngIf",e.currentState===e.states.Processing),na(3),_s("ngIf",e.currentState===e.states.ShowingResult),na(3),_s("ngIf",e.currentState!==e.states.Initial&&e.currentState!==e.states.Processing))},directives:[jS,Eh,qC,rM,hS,CM,iM,yS,xM,EM,Cx],pipes:[pC],styles:[""]}),e}(Lx);function aA(t,e){if(1&t){var n=xs();bs(0,"div"),uu(1,"\n "),ks(2,"app-hw-message",2),Tl(3,"translate"),uu(4,"\n\n "),bs(5,"div",3),uu(6,"\n "),bs(7,"app-button",4),Ts("action",(function(){return Bn(n),Ys().closeModal()})),uu(8),Tl(9,"translate"),ws(),uu(10,"\n "),bs(11,"app-button",5),Ts("action",(function(){return Bn(n),Ys().requestBackup()})),uu(12),Tl(13,"translate"),ws(),uu(14,"\n "),ws(),uu(15,"\n "),ws()}if(2&t){var i=Ys();na(2),_s("text",El(3,4,"hardware-wallet.create-backup.warning"))("icon",i.msgIcons.Warning),na(6),cu("\n ",El(9,6,"common.cancel-button"),"\n "),na(4),cu("\n ",El(13,8,"common.continue-button"),"\n ")}}function oA(t,e){if(1&t&&(ks(0,"app-hw-message",2),Tl(1,"translate")),2&t){var n=Ys(2);_s("text",El(1,2,"hardware-wallet.create-backup.instructions"))("icon",n.msgIcons.Confirm)}}function sA(t,e){if(1&t&&(ks(0,"app-hw-message",2),Tl(1,"translate")),2&t){var n=Ys(2);_s("text",El(1,2,n.result.text))("icon",n.result.icon)}}function uA(t,e){if(1&t){var n=xs();bs(0,"div",3),uu(1,"\n "),bs(2,"app-button",5,8),Ts("action",(function(){return Bn(n),Ys(2).closeModal()})),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()}2&t&&(na(4),cu("\n ",El(5,1,"common.close-button"),"\n "))}function lA(t,e){if(1&t&&(bs(0,"div"),uu(1,"\n "),uu(2,"\n "),ps(3,oA,2,4,"app-hw-message",6),uu(4,"\n\n "),uu(5,"\n "),ps(6,sA,2,4,"app-hw-message",6),uu(7,"\n\n "),uu(8,"\n "),ps(9,uA,7,3,"div",7),uu(10,"\n "),ws()),2&t){var n=Ys();na(3),_s("ngIf",n.currentState===n.states.Processing),na(3),_s("ngIf",n.currentState===n.states.ShowingResult),na(3),_s("ngIf",n.currentState!==n.states.Processing)}}var cA=function(t){function e(e,n,i){var r=t.call(this,i,n)||this;return r.data=e,r.dialogRef=n,r.hwWalletService=i,r}return Wk(e,t),e.prototype.requestBackup=function(){var t=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.backup().subscribe((function(){t.showResult({text:"hardware-wallet.general.completed",icon:t.msgIcons.Success}),t.data.requestOptionsComponentRefresh(null,!0)}),(function(e){return t.processHwOperationError(e)}))},e.\u0275fac=function(t){return new(t||e)(gs(kk),gs(bk),gs(jk))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-backup-dialog"]],features:[Jo],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],["closeButton",""]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ps(4,aA,16,10,"div",1),uu(5,"\n\n "),ps(6,lA,11,3,"div",1),uu(7,"\n"),ws(),uu(8,"\n")),2&t&&(_s("headline",El(1,5,"hardware-wallet.options.create-backup"))("dialog",e.dialogRef)("disableDismiss",e.currentState===e.states.Processing),na(4),_s("ngIf",e.currentState===e.states.Initial),na(2),_s("ngIf",e.currentState!==e.states.Initial))},directives:[jS,Eh,qC,Cx],pipes:[pC],styles:[""]}),e}(Lx);function dA(t,e){if(1&t&&(ks(0,"app-hw-message",3),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,2,"hardware-wallet.general.confirm"))("icon",n.msgIcons.Confirm)}}function hA(t,e){if(1&t&&(ks(0,"app-hw-message",3),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,2,n.result.text))("icon",n.result.icon)}}function fA(t,e){if(1&t){var n=xs();bs(0,"div",4),uu(1,"\n "),bs(2,"app-button",5,6),Ts("action",(function(){return Bn(n),Ys().closeModal()})),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()}2&t&&(na(4),cu("\n ",El(5,1,"common.close-button"),"\n "))}var pA=function(t){function e(e,n,i){var r=t.call(this,i,n)||this;return r.data=e,r.dialogRef=n,r.hwWalletService=i,r.changingExistingPin=e.walletHasPin,r.operationSubscription=r.hwWalletService.getFeatures().pipe(st((function(t){return r.changingExistingPin=t.rawResponse.pin_protection,r.hwWalletService.changePin(t.rawResponse.pin_protection)}))).subscribe((function(){r.showResult({text:"hardware-wallet.general.completed",icon:r.msgIcons.Success}),r.data.requestOptionsComponentRefresh(null,!0)}),(function(t){return r.processHwOperationError(t)})),r}return Wk(e,t),e.\u0275fac=function(t){return new(t||e)(gs(kk),gs(bk),gs(jk))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-change-pin-dialog"]],features:[Jo],decls:13,vars:8,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","icon"],[1,"-buttons"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ps(4,dA,2,4,"app-hw-message",1),uu(5,"\n\n "),uu(6,"\n "),ps(7,hA,2,4,"app-hw-message",1),uu(8,"\n\n "),uu(9,"\n "),ps(10,fA,7,3,"div",2),uu(11,"\n"),ws(),uu(12,"\n")),2&t&&(_s("headline",El(1,6,e.changingExistingPin?"hardware-wallet.options.change-pin":"hardware-wallet.options.create-pin"))("dialog",e.dialogRef)("disableDismiss",e.currentState===e.states.Initial),na(4),_s("ngIf",e.currentState===e.states.Initial),na(3),_s("ngIf",e.currentState===e.states.ShowingResult),na(3),_s("ngIf",e.currentState!==e.states.Initial))},directives:[jS,Eh,qC,Cx],pipes:[pC],styles:[""]}),e}(Lx);function mA(t,e){1&t&&(bs(0,"div",14),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),lu(El(2,1,"hardware-wallet.restore-seed.warning")))}function gA(t,e){if(1&t){var n=xs();bs(0,"div"),uu(1,"\n "),ks(2,"app-hw-message",4),Tl(3,"translate"),uu(4,"\n\n "),bs(5,"div",5),uu(6,"\n "),bs(7,"div",6),uu(8,"\n "),bs(9,"div",7),uu(10,"\n "),bs(11,"select",8),uu(12,"\n "),bs(13,"option",9),uu(14),Tl(15,"translate"),ws(),uu(16,"\n "),bs(17,"option",9),uu(18),Tl(19,"translate"),ws(),uu(20,"\n "),ws(),uu(21,"\n "),ws(),uu(22,"\n "),ws(),uu(23,"\n "),ws(),uu(24,"\n\n "),ps(25,mA,3,3,"div",10),uu(26,"\n\n "),bs(27,"div",11),uu(28,"\n "),bs(29,"app-button",12),Ts("action",(function(){return Bn(n),Ys().closeModal()})),uu(30),Tl(31,"translate"),ws(),uu(32,"\n "),bs(33,"app-button",13),Ts("action",(function(){return Bn(n),Ys().startOperation()})),uu(34),Tl(35,"translate"),ws(),uu(36,"\n "),ws(),uu(37,"\n "),ws()}if(2&t){var i=Ys();na(2),_s("text",El(3,9,i.justCheckingSeed?"hardware-wallet.restore-seed.check-text":"hardware-wallet.restore-seed.text")),na(3),_s("formGroup",i.form),na(8),_s("ngValue",12),na(1),lu(El(15,11,"wallet.new.12-words")),na(3),_s("ngValue",24),na(1),lu(El(19,13,"wallet.new.24-words")),na(7),_s("ngIf",!i.justCheckingSeed),na(5),cu("\n ",El(31,15,"common.cancel-button"),"\n "),na(4),cu("\n ",El(35,17,"common.continue-button"),"\n ")}}function vA(t,e){if(1&t&&(ks(0,"app-hw-message",15),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,2,n.justCheckingSeed?"hardware-wallet.general.follow":"hardware-wallet.general.confirm-and-more"))("icon",n.msgIcons.Confirm)}}function _A(t,e){if(1&t&&(ks(0,"app-hw-message",15),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,2,n.result.text))("icon",n.result.icon)}}function yA(t,e){if(1&t){var n=xs();bs(0,"div",11),uu(1,"\n "),bs(2,"app-button",13,16),Ts("action",(function(){return Bn(n),Ys().closeModal()})),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()}2&t&&(na(4),cu("\n ",El(5,1,"common.close-button"),"\n "))}var bA=function(t){function e(e,n,i,r){var a=t.call(this,i,n)||this;return a.data=e,a.dialogRef=n,a.hwWalletService=i,a.form=r.group({words:[24,cM.required]}),a.justCheckingSeed=!!a.data.wallet,a}return Wk(e,t),e.prototype.startOperation=function(){var t=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.recoverMnemonic(this.form.controls.words.value,this.justCheckingSeed).subscribe((function(){t.justCheckingSeed?t.showResult({text:"hardware-wallet.restore-seed.correct-seed",icon:t.msgIcons.Success}):(t.data.requestOptionsComponentRefresh(),t.closeModal())}),(function(e){return t.processHwOperationError(e)}))},e.\u0275fac=function(t){return new(t||e)(gs(kk),gs(bk),gs(jk),gs(YS))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-restore-seed-dialog"]],features:[Jo],decls:16,vars:9,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],[1,"-select"],["formControlName","words","id","words"],[3,"ngValue"],["class","warning",4,"ngIf"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],[1,"warning"],[3,"text","icon"],["closeButton",""]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n\n "),uu(3,"\n "),ps(4,gA,38,19,"div",1),uu(5,"\n\n "),uu(6,"\n "),ps(7,vA,2,4,"app-hw-message",2),uu(8,"\n\n "),uu(9,"\n "),ps(10,_A,2,4,"app-hw-message",2),uu(11,"\n\n "),uu(12,"\n "),ps(13,yA,7,3,"div",3),uu(14,"\n"),ws(),uu(15,"\n")),2&t&&(_s("headline",El(1,7,e.justCheckingSeed?"hardware-wallet.options.confirm-seed":"hardware-wallet.options.restore-backup"))("dialog",e.dialogRef)("disableDismiss",e.currentState===e.states.Processing),na(4),_s("ngIf",e.currentState===e.states.Initial),na(3),_s("ngIf",e.currentState===e.states.Processing),na(3),_s("ngIf",e.currentState===e.states.ShowingResult),na(3),_s("ngIf",e.currentState!==e.states.Initial&&e.currentState!==e.states.Processing))},directives:[jS,Eh,qC,rM,hS,CM,iM,yS,xM,EM,Cx],pipes:[pC],styles:[".warning[_ngcontent-%COMP%]{margin-top:15px;color:#ff004e;text-align:center}"]}),e}(Lx);function wA(t,e){if(1&t){var n=xs();bs(0,"div"),uu(1,"\n "),ks(2,"app-hw-message",2),Tl(3,"translate"),uu(4,"\n\n "),bs(5,"div",3),uu(6,"\n "),bs(7,"mat-checkbox",4),Ts("change",(function(t){return Bn(n),Ys().setConfirmed(t)})),uu(8),Tl(9,"translate"),ws(),uu(10,"\n "),ws(),uu(11,"\n\n "),bs(12,"div",5),uu(13,"\n "),bs(14,"app-button",6),Ts("action",(function(){return Bn(n),Ys().closeModal()})),uu(15),Tl(16,"translate"),ws(),uu(17,"\n "),bs(18,"app-button",7),Ts("action",(function(){return Bn(n),Ys().requestRemoval()})),uu(19),Tl(20,"translate"),ws(),uu(21,"\n "),ws(),uu(22,"\n "),ws()}if(2&t){var i=Ys();na(2),_s("text",El(3,7,"hardware-wallet.remove-pin.warning"))("icon",i.msgIcons.Warning),na(5),_s("checked",i.confirmed),na(1),cu("",El(9,9,"common.generic-confirmation-check"),"\n "),na(7),cu("\n ",El(16,11,"common.cancel-button"),"\n "),na(3),_s("disabled",!i.confirmed),na(1),cu("\n ",El(20,13,"common.continue-button"),"\n ")}}function kA(t,e){if(1&t&&(ks(0,"app-hw-message",2),Tl(1,"translate")),2&t){var n=Ys(2);_s("text",El(1,2,"hardware-wallet.general.confirm"))("icon",n.msgIcons.Confirm)}}function MA(t,e){if(1&t&&(ks(0,"app-hw-message",2),Tl(1,"translate")),2&t){var n=Ys(2);_s("text",El(1,2,n.result.text))("icon",n.result.icon)}}function SA(t,e){if(1&t){var n=xs();bs(0,"div",5),uu(1,"\n "),bs(2,"app-button",10,11),Ts("action",(function(){return Bn(n),Ys(2).closeModal()})),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()}2&t&&(na(4),cu("\n ",El(5,1,"common.close-button"),"\n "))}function CA(t,e){if(1&t&&(bs(0,"div"),uu(1,"\n "),uu(2,"\n "),ps(3,kA,2,4,"app-hw-message",8),uu(4,"\n\n "),uu(5,"\n "),ps(6,MA,2,4,"app-hw-message",8),uu(7,"\n\n "),uu(8,"\n "),ps(9,SA,7,3,"div",9),uu(10,"\n "),ws()),2&t){var n=Ys();na(3),_s("ngIf",n.currentState===n.states.Processing),na(3),_s("ngIf",n.currentState===n.states.ShowingResult),na(3),_s("ngIf",n.currentState!==n.states.Processing)}}var xA=function(t){function e(e,n,i){var r=t.call(this,i,n)||this;return r.data=e,r.dialogRef=n,r.hwWalletService=i,r.confirmed=!1,r}return Wk(e,t),e.prototype.setConfirmed=function(t){this.confirmed=t.checked},e.prototype.requestRemoval=function(){var t=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.removePin().subscribe((function(){t.showResult({text:"hardware-wallet.general.completed",icon:t.msgIcons.Success}),t.data.requestOptionsComponentRefresh(null,!0)}),(function(e){return t.processHwOperationError(e)}))},e.\u0275fac=function(t){return new(t||e)(gs(kk),gs(bk),gs(jk))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-remove-pin-dialog"]],features:[Jo],decls:8,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon"],[1,"-check-container"],["type","checkbox",1,"-check",3,"checked","change"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"disabled","action"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ps(4,wA,23,15,"div",1),uu(5,"\n\n "),ps(6,CA,11,3,"div",1),uu(7,"\n"),ws()),2&t&&(_s("headline",El(1,5,"hardware-wallet.options.delete-pin"))("dialog",e.dialogRef)("disableDismiss",e.currentState===e.states.Processing),na(4),_s("ngIf",e.currentState===e.states.Initial),na(2),_s("ngIf",e.currentState!==e.states.Initial))},directives:[jS,Eh,qC,wE,Cx],pipes:[pC],styles:[""]}),e}(Lx);function DA(t,e){if(1&t){var n=xs();bs(0,"div",7),uu(1,"\n "),bs(2,"mat-checkbox",8),Ts("change",(function(t){return Bn(n),Ys(2).setConfirmed(t)})),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ws()}if(2&t){var i=Ys(2);na(2),_s("checked",i.confirmed),na(1),cu("",El(4,2,"common.generic-confirmation-check"),"\n ")}}function LA(t,e){if(1&t){var n=xs();bs(0,"div"),uu(1,"\n "),ks(2,"app-hw-message",2),Tl(3,"translate"),uu(4,"\n\n "),ps(5,DA,6,4,"div",3),uu(6,"\n\n "),bs(7,"div",4),uu(8,"\n "),bs(9,"app-button",5),Ts("action",(function(){return Bn(n),Ys().closeModal()})),uu(10),Tl(11,"translate"),ws(),uu(12,"\n "),bs(13,"app-button",6),Ts("action",(function(){return Bn(n),Ys().startUpdating()})),uu(14),Tl(15,"translate"),ws(),uu(16,"\n "),ws(),uu(17,"\n "),ws()}if(2&t){var i=Ys();na(2),_s("text",El(3,6,i.text))("icon",i.deviceHasFirmware?i.msgIcons.Warning:i.msgIcons.HardwareWallet),na(3),_s("ngIf",i.deviceHasFirmware),na(5),cu("\n ",El(11,8,"common.cancel-button"),"\n "),na(3),_s("disabled",i.deviceHasFirmware&&!i.confirmed),na(1),cu("\n ",El(15,10,"common.continue-button"),"\n ")}}function TA(t,e){if(1&t&&(ks(0,"app-hw-message",2),Tl(1,"translate")),2&t){var n=Ys(2);_s("text",El(1,2,"hardware-wallet.update-firmware.title-connecting"))("icon",n.msgIcons.Spinner)}}function EA(t,e){if(1&t&&(ks(0,"app-hw-message",2),Tl(1,"translate")),2&t){var n=Ys(2);_s("text",El(1,2,"hardware-wallet.update-firmware.follow"))("icon",n.msgIcons.Confirm)}}function OA(t,e){if(1&t&&(ks(0,"app-hw-message",2),Tl(1,"translate")),2&t){var n=Ys(2);_s("text",El(1,2,n.result.text))("icon",n.result.icon)}}function AA(t,e){if(1&t){var n=xs();bs(0,"div",4),uu(1,"\n "),bs(2,"app-button",11,12),Ts("action",(function(){return Bn(n),Ys(2).closeModal()})),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()}2&t&&(na(4),cu("\n ",El(5,1,"common.close-button"),"\n "))}function PA(t,e){if(1&t&&(bs(0,"div"),uu(1,"\n "),uu(2,"\n "),ps(3,TA,2,4,"app-hw-message",9),uu(4,"\n\n "),uu(5,"\n "),ps(6,EA,2,4,"app-hw-message",9),uu(7,"\n\n "),uu(8,"\n "),ps(9,OA,2,4,"app-hw-message",9),uu(10,"\n\n "),uu(11,"\n "),ps(12,AA,7,3,"div",10),uu(13,"\n "),ws()),2&t){var n=Ys();na(3),_s("ngIf",n.currentState===n.states.Connecting),na(3),_s("ngIf",n.currentState===n.states.Processing),na(3),_s("ngIf",n.currentState===n.states.ShowingResult),na(3),_s("ngIf",n.currentState!==n.states.Processing)}}var IA=function(t){function e(e,n,i){var r=t.call(this,n,e)||this;return r.dialogRef=e,r.hwWalletService=n,r.msgBarService=i,r.closeIfHwDisconnected=!1,r.currentState=r.states.Connecting,r.confirmed=!1,r.deviceInBootloaderMode=!1,r.deviceHasFirmware=!0,r.checkDevice(!1),r}return Wk(e,t),Object.defineProperty(e.prototype,"title",{get:function(){return this.currentState===this.states.Connecting?"hardware-wallet.update-firmware.title-connecting":this.deviceHasFirmware?"hardware-wallet.update-firmware.title-update":"hardware-wallet.update-firmware.title-install"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"text",{get:function(){return this.deviceHasFirmware?this.deviceInBootloaderMode?"hardware-wallet.update-firmware.text-bootloader":"hardware-wallet.update-firmware.text-not-bootloader":"hardware-wallet.update-firmware.text-no-firmware"},enumerable:!1,configurable:!0}),e.openDialog=function(t){var n=new pk;return n.autoFocus=!1,n.width="450px",t.open(e,n)},e.prototype.ngOnDestroy=function(){t.prototype.ngOnDestroy.call(this),this.msgBarService.hide(),this.closeCheckDeviceSubscription()},e.prototype.setConfirmed=function(t){this.confirmed=t.checked},e.prototype.startUpdating=function(){var t=this;this.msgBarService.hide(),this.showResult({text:"hardware-wallet.update-firmware.text-downloading",icon:this.msgIcons.Spinner}),this.closeCheckDeviceSubscription(),this.operationSubscription=this.hwWalletService.updateFirmware((function(){return t.currentState=t.states.Processing})).subscribe((function(){t.showResult({text:"hardware-wallet.update-firmware.finished",icon:t.msgIcons.Success})}),(function(e){(e=gm(e)).type===pm.Success?t.showResult({text:"hardware-wallet.update-firmware.finished",icon:t.msgIcons.Success}):e.type===pm.Timeout?t.showResult({text:"hardware-wallet.update-firmware.timeout",icon:t.msgIcons.Error}):(setTimeout((function(){t.msgBarService.showError(e)})),t.checkDevice(!1),t.currentState=t.states.Initial)}))},e.prototype.checkDevice=function(t){var e=this;void 0===t&&(t=!0),this.closeCheckDeviceSubscription(),this.checkDeviceSubscription=rp(0).pipe(up(t?1e3:0),st((function(){return e.hwWalletService.getFeatures(!1)}))).subscribe((function(t){e.deviceInBootloaderMode=t.rawResponse.bootloader_mode,e.deviceHasFirmware=!e.deviceInBootloaderMode||t.rawResponse.firmware_present,e.currentState===e.states.Connecting&&(e.currentState=e.states.Initial),e.checkDevice()}),(function(){e.deviceInBootloaderMode=!1,e.deviceHasFirmware=!0,e.currentState===e.states.Connecting&&(e.currentState=e.states.Initial),e.checkDevice()}))},e.prototype.closeCheckDeviceSubscription=function(){this.checkDeviceSubscription&&this.checkDeviceSubscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(gs(bk),gs(jk),gs(Gx))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-update-firmware-dialog"]],features:[Jo],decls:8,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon"],["class","-check-container",4,"ngIf"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"disabled","action"],[1,"-check-container"],["type","checkbox",1,"-check",3,"checked","change"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ps(4,LA,18,12,"div",1),uu(5,"\n\n "),ps(6,PA,14,4,"div",1),uu(7,"\n"),ws()),2&t&&(_s("headline",El(1,5,e.title))("dialog",e.dialogRef)("disableDismiss",e.currentState===e.states.Processing),na(4),_s("ngIf",e.currentState===e.states.Initial),na(2),_s("ngIf",e.currentState!==e.states.Initial))},directives:[jS,Eh,qC,Cx,wE],pipes:[pC],styles:[""]}),e}(Lx),YA=function(t){function e(e,n){var i=t.call(this,n,e)||this;return i.dialogRef=e,i}return Wk(e,t),e.openDialog=function(t){var n=new pk;return n.autoFocus=!1,n.width="450px",t.open(e,n)},e.prototype.update=function(){this._dialogRef.close(!0)},e.\u0275fac=function(t){return new(t||e)(gs(bk),gs(jk))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-update-alert-dialog"]],features:[Jo],decls:18,vars:14,consts:[[3,"headline","dialog"],[3,"text","icon"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),ks(3,"app-hw-message",1),Tl(4,"translate"),uu(5,"\n\n "),bs(6,"div",2),uu(7,"\n "),bs(8,"app-button",3),Ts("action",(function(){return e.closeModal()})),uu(9),Tl(10,"translate"),ws(),uu(11,"\n "),bs(12,"app-button",4),Ts("action",(function(){return e.update()})),uu(13),Tl(14,"translate"),ws(),uu(15,"\n "),ws(),uu(16,"\n"),ws(),uu(17,"\n")),2&t&&(_s("headline",El(1,6,"hardware-wallet.update-firmware-warning.title"))("dialog",e.dialogRef),na(3),_s("text",El(4,8,"hardware-wallet.update-firmware-warning.text"))("icon",e.msgIcons.Warning),na(6),cu("\n ",El(10,10,"common.cancel-button"),"\n "),na(4),cu("\n ",El(14,12,"hardware-wallet.update-firmware-warning.update"),"\n "))},directives:[jS,qC,Cx],pipes:[pC],styles:[""]}),e}(Lx);function RA(t,e){if(1&t&&(ks(0,"app-hw-message",7),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,4,n.result.text))("linkText",n.result.link)("linkIsUrl",!0)("icon",n.result.icon)}}function FA(t,e){if(1&t){var n=xs();bs(0,"app-hw-message",8),Ts("linkClicked",(function(){return Bn(n),Ys().wipe()})),Tl(1,"translate"),Tl(2,"translate"),Tl(3,"translate"),ws()}if(2&t){var i=Ys();_s("text",El(1,3,"hardware-wallet.errors.refused")+" "+El(2,5,"hardware-wallet.options.forgotten-pin-part1"))("linkText",El(3,7,"hardware-wallet.options.forgotten-pin-part2"))("icon",i.msgIcons.Error)}}function HA(t,e){if(1&t){var n=xs();bs(0,"app-hw-message",8),Ts("linkClicked",(function(){return Bn(n),Ys().wipe()})),Tl(1,"translate"),Tl(2,"translate"),Tl(3,"translate"),ws()}if(2&t){var i=Ys();_s("text",El(1,3,"hardware-wallet.errors.incorrect-pin")+" "+El(2,5,"hardware-wallet.options.forgotten-pin-part1"))("linkText",El(3,7,"hardware-wallet.options.forgotten-pin-part2"))("icon",i.msgIcons.Error)}}function BA(t,e){if(1&t&&(ks(0,"app-hw-message",17),Tl(1,"translate"),Tl(2,"translate"),Tl(3,"translate")),2&t){var n=Ys(2);_s("upperBigText",El(1,4,"hardware-wallet.options.unconfigured-detected-title"))("lowerLightText",El(2,6,"hardware-wallet.options.firmware-version")+" "+n.firmwareVersion)("text",El(3,8,"hardware-wallet.options.unconfigured-detected"))("icon",n.msgIcons.HardwareWallet)}}function jA(t,e){if(1&t&&(ks(0,"app-hw-message",18),Tl(1,"translate"),Tl(2,"translate")),2&t){var n=Ys(2);_s("text",El(1,4,"hardware-wallet.options.configured-detected"))("lowerLightText",El(2,6,"hardware-wallet.options.firmware-version")+" "+n.firmwareVersion)("lowerBigText",n.wallet.label)("icon",n.msgIcons.HardwareWallet)}}function NA(t,e){1&t&&ks(0,"br")}function WA(t,e){if(1&t&&(Ms(0),uu(1,"\n "),bs(2,"div"),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ps(6,NA,1,0,"br",16),uu(7,"\n "),Ss()),2&t){var n=e.$implicit,i=e.index,r=Ys(3);na(3),du("",r.securityWarnings.length>1?i+1+")":""," ",El(4,3,n),""),na(3),_s("ngIf",i1?"hardware-wallet.options.security-warnings-title":"hardware-wallet.options.security-warning-title")),na(3),_s("ngForOf",n.securityWarnings)}}function zA(t,e){if(1&t){var n=xs();bs(0,"button",22),Ts("click",(function(){return Bn(n),Ys(2).update()})),uu(1,"\n "),bs(2,"div",23),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ws()}2&t&&(na(3),lu(El(4,1,"hardware-wallet.options.update-firmware")))}function UA(t,e){if(1&t){var n=xs();bs(0,"div"),uu(1,"\n "),bs(2,"button",22),Ts("click",(function(){return Bn(n),Ys(2).generateMnemonic()})),uu(3,"\n "),bs(4,"div",24),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),ws(),uu(8,"\n "),bs(9,"button",22),Ts("click",(function(){return Bn(n),Ys(2).restoreMnemonic()})),uu(10,"\n "),bs(11,"div",24),uu(12),Tl(13,"translate"),ws(),uu(14,"\n "),ws(),uu(15,"\n "),ws()}2&t&&(na(5),lu(El(6,2,"hardware-wallet.options.configure-automatically")),na(7),lu(El(13,4,"hardware-wallet.options.restore-backup")))}function qA(t,e){if(1&t){var n=xs();bs(0,"button",22),Ts("click",(function(){return Bn(n),Ys(3).backup()})),uu(1,"\n "),bs(2,"div",24),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ws()}2&t&&(na(3),lu(El(4,1,"hardware-wallet.options.create-backup")))}function GA(t,e){if(1&t){var n=xs();bs(0,"button",22),Ts("click",(function(){return Bn(n),Ys(3).confirmSeed()})),uu(1,"\n "),bs(2,"div",24),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ws()}2&t&&(na(3),lu(El(4,1,"hardware-wallet.options.confirm-seed")))}function KA(t,e){if(1&t){var n=xs();bs(0,"button",22),Ts("click",(function(){return Bn(n),Ys(3).removePin()})),uu(1,"\n "),bs(2,"div",25),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ws()}2&t&&(na(3),lu(El(4,1,"hardware-wallet.options.delete-pin")))}function ZA(t,e){if(1&t){var n=xs();bs(0,"div"),uu(1,"\n "),ps(2,qA,6,3,"button",15),uu(3,"\n "),ps(4,GA,6,3,"button",15),uu(5,"\n "),bs(6,"button",22),Ts("click",(function(){return Bn(n),Ys(2).changePin()})),uu(7,"\n "),bs(8,"div",24),uu(9),Tl(10,"translate"),ws(),uu(11,"\n "),ws(),uu(12,"\n "),ps(13,KA,6,3,"button",15),uu(14,"\n "),bs(15,"button",22),Ts("click",(function(){return Bn(n),Ys(2).wipe()})),uu(16,"\n "),bs(17,"div",25),uu(18),Tl(19,"translate"),ws(),uu(20,"\n "),ws(),uu(21,"\n "),ws()}if(2&t){var i=Ys(2);na(2),_s("ngIf",i.needsBackup),na(2),_s("ngIf",!i.needsBackup),na(5),lu(El(10,5,i.needsPin?"hardware-wallet.options.create-pin":"hardware-wallet.options.change-pin")),na(4),_s("ngIf",!i.needsPin),na(5),lu(El(19,7,"hardware-wallet.options.wipe"))}}var JA=function(t){return{disabled:t}};function QA(t,e){if(1&t&&(bs(0,"div",9),uu(1,"\n "),ps(2,BA,4,10,"app-hw-message",10),uu(3,"\n\n "),ps(4,jA,3,8,"app-hw-message",11),uu(5,"\n\n "),ps(6,VA,14,4,"div",12),uu(7,"\n\n "),bs(8,"div",13),uu(9),Tl(10,"translate"),ws(),uu(11,"\n "),bs(12,"div",14),uu(13,"\n "),ps(14,zA,6,3,"button",15),uu(15,"\n "),ps(16,UA,16,6,"div",16),uu(17,"\n "),ps(18,ZA,22,9,"div",16),uu(19,"\n "),ws(),uu(20,"\n "),ws()),2&t){var n=Ys();_s("ngClass",kl(10,JA,n.refreshingWarnings)),na(2),_s("ngIf",n.newWalletConnected),na(2),_s("ngIf",!n.newWalletConnected),na(2),_s("ngIf",n.securityWarnings.length>0),na(3),lu(El(10,8,"hardware-wallet.options.options")),na(5),_s("ngIf",n.outdatedFirmware),na(2),_s("ngIf",n.newWalletConnected),na(2),_s("ngIf",!n.newWalletConnected)}}function XA(t,e){1&t&&(bs(0,"div",26),uu(1,"\n "),ks(2,"mat-spinner"),uu(3),Tl(4,"translate"),ws()),2&t&&(na(3),cu("\n ",El(4,1,"common.loading"),"\n "))}function $A(t,e){if(1&t){var n=xs();bs(0,"div",27),uu(1,"\n "),bs(2,"app-button",28),Ts("action",(function(){return Bn(n),Ys().closeModal()})),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ws()}if(2&t){var i=Ys();_s("ngClass",kl(4,JA,i.refreshingWarnings)),na(3),cu("\n ",El(4,2,"common.close-button"),"\n ")}}function tP(t,e){if(1&t){var n=xs();bs(0,"div",29),uu(1,"\n "),bs(2,"app-button",28,30),Ts("action",(function(){return Bn(n),Ys().closeModal()})),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()}2&t&&(na(4),cu("\n ",El(5,1,"common.close-button"),"\n "))}var eP=function(t){function e(e,n,i,r,a,o,s){var u=t.call(this,i,n)||this;return u.onboarding=e,u.dialogRef=n,u.hwWalletService=i,u.dialog=r,u.msgBarService=a,u.hardwareWalletService=o,u.walletsAndAddressesService=s,u.closeIfHwDisconnected=!1,u.newWalletConnected=!1,u.otherStateBecauseWrongPin=!1,u.firmwareVersion="",u.securityWarnings=[],u.refreshingWarnings=!1,u.completeRecheckRequested=!1,u.recheckSecurityOnlyRequested=!1,u.showErrorRequested=!1,u.customErrorMsg="",u.checkWallet(!0),u}return Wk(e,t),e.openDialog=function(t,n){var i=new pk;return i.data=n,i.autoFocus=!1,i.width=Mm.mediumModalWidth,t.open(e,i)},e.prototype.ngOnDestroy=function(){t.prototype.ngOnDestroy.call(this),this.removeDialogSubscription(),this.removeOperationSubscription(),this.msgBarService.hide()},e.prototype.hwConnectionChanged=function(t){this.checkWallet(!0)},e.prototype.update=function(){this.openUpdateDialog()},e.prototype.generateMnemonic=function(){this.openDialog(rA)},e.prototype.restoreMnemonic=function(){this.openDialog(bA)},e.prototype.changePin=function(){this.openDialog(pA)},e.prototype.removePin=function(){this.openDialog(xA)},e.prototype.backup=function(){this.openDialog(cA)},e.prototype.wipe=function(){this.openDialog(YO)},e.prototype.confirmSeed=function(){this.openDialog(bA)},e.prototype.openDialog=function(t){var e=this;this.customErrorMsg="",this.removeDialogSubscription();var n=new pk;n.width="450px",n.autoFocus=!1,n.data={wallet:this.wallet,walletHasPin:!this.needsPin,requestOptionsComponentRefresh:function(t,n){void 0===t&&(t=null),void 0===n&&(n=!1),t?(e.showErrorRequested=!0,e.customErrorMsg=t):n?e.recheckSecurityOnlyRequested=!0:e.completeRecheckRequested=!0}},this.dialogSubscription=this.dialog.open(t,n).afterClosed().subscribe((function(){e.completeRecheckRequested?e.checkWallet():e.recheckSecurityOnlyRequested?e.updateSecurityWarningsAndData().subscribe():e.showErrorRequested&&e.showError(),e.completeRecheckRequested=!1,e.recheckSecurityOnlyRequested=!1,e.showErrorRequested=!1}))},e.prototype.removeDialogSubscription=function(){this.dialogSubscription&&this.dialogSubscription.unsubscribe()},e.prototype.updateSecurityWarningsAndData=function(){var t=this;return rp(1).pipe(Rv((function(){return t.refreshingWarnings=!0})),st((function(){return t.hardwareWalletService.getFeaturesAndUpdateData(t.wallet)})),nt((function(e){return t.refreshingWarnings=!1,t.securityWarnings=[],e.securityWarnings.includes(FO.FirmwareVersionNotVerified)?(t.firmwareVersionNotVerified=!0,t.securityWarnings.push("hardware-wallet.options.unchecked-version-warning")):t.firmwareVersionNotVerified=!1,e.securityWarnings.includes(FO.OutdatedFirmware)?(t.outdatedFirmware=!0,t.securityWarnings.push("hardware-wallet.options.outdated-version-warning")):t.outdatedFirmware=!1,t.wallet&&e.securityWarnings.includes(FO.NeedsBackup)?(t.needsBackup=!0,t.securityWarnings.push("hardware-wallet.options.backup-warning")):t.needsBackup=!1,t.wallet&&e.securityWarnings.includes(FO.NeedsPin)?(t.needsPin=!0,t.securityWarnings.push("hardware-wallet.options.pin-warning")):t.needsPin=!1,e.walletNameUpdated&&t.msgBarService.showWarning("hardware-wallet.general.name-updated"),t.firmwareVersion=e.features.fw_major+"."+e.features.fw_minor+"."+e.features.fw_patch,e})))},e.prototype.checkWallet=function(t){var e=this;void 0===t&&(t=!1),this.wallet=null,this.showResult({text:"hardware-wallet.options.connecting",icon:this.msgIcons.Spinner},!1),this.removeOperationSubscription(),this.operationSubscription=this.hwWalletService.getDeviceConnected().subscribe((function(n){n?e.operationSubscription=e.hwWalletService.getFeatures(!1).subscribe((function(n){n.rawResponse.bootloader_mode?e.openUpdateDialog():e.continueCheckingWallet(t)}),(function(){return e.continueCheckingWallet(t)})):e.showResult({text:"hardware-wallet.options.disconnected",icon:e.msgIcons.Usb})}),(function(t){e.processHwOperationError(t)}))},e.prototype.continueCheckingWallet=function(t){var e=this;this.operationSubscription=this.hwWalletService.getAddresses(1,0).subscribe((function(n){e.operationSubscription=e.walletsAndAddressesService.allWallets.pipe(Ap()).subscribe((function(i){i.some((function(t){var i=t.addresses[0].address===n.rawResponse[0]&&t.isHardware;return i&&(e.wallet=t),i}))?e.operationSubscription=e.updateSecurityWarningsAndData().subscribe((function(n){t&&n.securityWarnings.find((function(t){return t===FO.OutdatedFirmware}))&&e.openUpdateWarning(),e.onboarding?(e.hwWalletService.showOptionsWhenPossible=!0,e.dialogRef.close(!0)):(e.currentState=e.states.Finished,e.newWalletConnected=!1)}),(function(t){return e.processHwOperationError(t)})):e.openDialog($O)}))}),(function(n){(n=gm(n)).type===pm.WithoutSeed?e.operationSubscription=e.updateSecurityWarningsAndData().subscribe((function(n){e.currentState=e.states.Finished,e.newWalletConnected=!0,t&&n.securityWarnings.find((function(t){return t===FO.OutdatedFirmware}))&&e.openUpdateWarning()}),(function(t){return e.processHwOperationError(t)})):n.type===pm.FailedOrRefused?(e.currentState=e.states.Other,e.otherStateBecauseWrongPin=!1):n.type===pm.WrongPin?(e.currentState=e.states.Other,e.otherStateBecauseWrongPin=!0):e.processHwOperationError(n)}))},e.prototype.removeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},e.prototype.openUpdateWarning=function(){var t=this;YA.openDialog(this.dialog).afterClosed().subscribe((function(e){e&&t.openUpdateDialog()}))},e.prototype.openUpdateDialog=function(){IA.openDialog(this.dialog),this.closeModal()},e.prototype.showError=function(){this.showResult({text:this.customErrorMsg?this.customErrorMsg:"hardware-wallet.errors.generic-error",icon:this.msgIcons.Error}),this.customErrorMsg=""},e.\u0275fac=function(t){return new(t||e)(gs(kk),gs(bk),gs(jk),gs(Dk),gs(Gx),gs(HO),gs(hD))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-options-dialog"]],features:[Jo],decls:18,vars:11,consts:[[3,"headline","dialog"],[3,"text","linkText","linkIsUrl","icon",4,"ngIf"],[3,"text","linkText","icon","linkClicked",4,"ngIf"],[3,"ngClass",4,"ngIf"],["class","loading-indicator",4,"ngIf"],["class","-buttons",3,"ngClass",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","linkText","linkIsUrl","icon"],[3,"text","linkText","icon","linkClicked"],[3,"ngClass"],[3,"upperBigText","lowerLightText","text","icon",4,"ngIf"],[3,"text","lowerLightText","lowerBigText","icon",4,"ngIf"],["class","alert-box",4,"ngIf"],[1,"options-label"],[1,"option-buttons-container","light-button-theme"],["mat-button","","color","primary",3,"click",4,"ngIf"],[4,"ngIf"],[3,"upperBigText","lowerLightText","text","icon"],[3,"text","lowerLightText","lowerBigText","icon"],[1,"alert-box"],[1,"title"],[4,"ngFor","ngForOf"],["mat-button","","color","primary",3,"click"],[1,"label","-blinking"],[1,"label"],[1,"label","red-text"],[1,"loading-indicator"],[1,"-buttons",3,"ngClass"],[1,"primary-button",3,"action"],[1,"-buttons"],["closeButton",""]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),ps(3,RA,2,6,"app-hw-message",1),uu(4,"\n\n "),ps(5,FA,4,9,"app-hw-message",2),uu(6,"\n\n "),ps(7,HA,4,9,"app-hw-message",2),uu(8,"\n\n "),ps(9,QA,21,12,"div",3),uu(10,"\n\n "),ps(11,XA,5,3,"div",4),uu(12,"\n\n "),ps(13,$A,6,6,"div",5),uu(14,"\n\n "),ps(15,tP,7,3,"div",6),uu(16,"\n"),ws(),uu(17,"\n")),2&t&&(_s("headline",El(1,9,"wallet.hardware-wallet-button"))("dialog",e.dialogRef),na(3),_s("ngIf",e.currentState===e.states.ShowingResult),na(2),_s("ngIf",e.currentState===e.states.Other&&!e.otherStateBecauseWrongPin),na(2),_s("ngIf",e.currentState===e.states.Other&&e.otherStateBecauseWrongPin),na(2),_s("ngIf",e.currentState===e.states.Finished),na(2),_s("ngIf",e.currentState===e.states.Finished&&e.refreshingWarnings),na(2),_s("ngIf",e.currentState===e.states.Finished),na(2),_s("ngIf",e.currentState!==e.states.Finished))},directives:[jS,Eh,qC,Ch,vx,Lh,XC,CC,Cx],pipes:[pC],styles:[".alert-box[_ngcontent-%COMP%], .options-label[_ngcontent-%COMP%]{margin-top:25px}.options-label[_ngcontent-%COMP%]{margin-bottom:10px;font-weight:700}.option-buttons-container[_ngcontent-%COMP%]{margin:0 -10px}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid rgba(30,34,39,.05)}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:first-child{border-top:1px solid rgba(30,34,39,.05)}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}.-blinking[_ngcontent-%COMP%]{-webkit-animation:alert-blinking 1s linear infinite;animation:alert-blinking 1s linear infinite}.loading-indicator[_ngcontent-%COMP%]{width:100px;height:40px;left:calc(50% - 50px);top:calc(50% - 20px);position:absolute;display:flex;justify-content:center;align-items:center}.loading-indicator[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{margin-left:7px;margin-right:12px}.loading-indicator[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%], .loading-indicator[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:18px!important;width:18px!important}.loading-indicator[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg circle{stroke:rgba(30,34,39,.2)}.disabled[_ngcontent-%COMP%]{opacity:.3;cursor:default;pointer-events:none}"]}),e}(Lx),nP=function(){function t(t,e){this.http=t,this.ngZone=e,this.PRICE_API_ID=Mm.priceApiId,this.priceInternal=new Cm(null),this.updatePeriod=6e5,this.errorUpdatePeriod=3e4,this.startDataRefreshSubscription(0)}return Object.defineProperty(t.prototype,"price",{get:function(){return this.priceInternal.asObservable()},enumerable:!1,configurable:!0}),t.prototype.startDataRefreshSubscription=function(t){var e=this;this.PRICE_API_ID&&(this.priceSubscription&&this.priceSubscription.unsubscribe(),this.ngZone.runOutsideAngular((function(){e.priceSubscription=rp(0).pipe(up(t),st((function(){return e.http.get("https://api.coinpaprika.com/v1/tickers/"+e.PRICE_API_ID+"?quotes=USD")}))).subscribe((function(t){e.ngZone.run((function(){return e.priceInternal.next(t.quotes.USD.price)})),e.startDataRefreshSubscription(e.updatePeriod)}),(function(){e.startDataRefreshSubscription(e.errorUpdatePeriod)}))})))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(Qp),ve(Dc))}}),t}(),iP=function(t){return t.Default="default",t.Exchange="exchange",t}({}),rP=function(){function t(t,e){this.apiService=t,this.ngZone=e,this.noConnections=!1,this.updatePeriod=5e3,this.errorUpdatePeriod=5e3,this.connectionsSubject=new Cm([]),this.startDataRefreshSubscription(0)}return t.prototype.connections=function(){return this.connectionsSubject.asObservable()},t.prototype.startDataRefreshSubscription=function(t){var e=this;this.dataRefreshSubscription&&this.dataRefreshSubscription.unsubscribe(),this.ngZone.runOutsideAngular((function(){e.dataRefreshSubscription=rp(0).pipe(up(t),st((function(){return e.trustedAddresses?rp(e.trustedAddresses):e.apiService.get("network/defaultConnections")})),st((function(t){return e.trustedAddresses=t,e.apiService.get("network/connections")}))).subscribe((function(t){if(null===t.connections||0===t.connections.length)return e.noConnections=!0,e.ngZone.run((function(){return e.connectionsSubject.next([])})),void e.startDataRefreshSubscription(e.updatePeriod);e.noConnections=!1;var n=t.connections.map((function(t){return{address:t.address,listenPort:t.listen_port,outgoing:t.outgoing,height:t.height,lastSent:t.last_sent,lastReceived:t.last_received,source:e.trustedAddresses.find((function(e){return e===t.address}))?iP.Default:iP.Exchange}})).sort((function(t,e){return t.address.localeCompare(e.address)}));e.ngZone.run((function(){return e.connectionsSubject.next(n)})),e.startDataRefreshSubscription(e.updatePeriod)}),(function(){return e.startDataRefreshSubscription(e.errorUpdatePeriod)}))}))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(ym),ve(Dc))}}),t}(),aP=["mat-menu-item",""],oP=["*"];function sP(t,e){if(1&t){var n=xs();uu(0,"\n "),bs(1,"div",0),Ts("keydown",(function(t){return Bn(n),Ys()._handleKeydown(t)}))("click",(function(){return Bn(n),Ys().closed.emit("click")}))("@transformMenu.start",(function(t){return Bn(n),Ys()._onAnimationStart(t)}))("@transformMenu.done",(function(t){return Bn(n),Ys()._onAnimationDone(t)})),uu(2,"\n "),bs(3,"div",1),uu(4,"\n "),Hs(5),uu(6,"\n "),ws(),uu(7,"\n "),ws(),uu(8,"\n")}if(2&t){var i=Ys();na(1),_s("id",i.panelId)("ngClass",i._classList)("@transformMenu",i._panelAnimationState),ds("aria-label",i.ariaLabel||null)("aria-labelledby",i.ariaLabelledby||null)("aria-describedby",i.ariaDescribedby||null)}}var uP={transformMenu:D_("transformMenu",[A_("void",O_({opacity:0,transform:"scale(0.8)"})),I_("void => enter",T_([R_(".mat-menu-content, .mat-mdc-menu-content",L_("100ms linear",O_({opacity:1}))),L_("120ms cubic-bezier(0, 0, 0.2, 1)",O_({transform:"scale(1)"}))])),I_("* => void",L_("100ms 25ms linear",O_({opacity:0})))]),fadeInItems:D_("fadeInItems",[A_("showing",O_({opacity:1})),I_("void => *",[O_({opacity:0}),L_("400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)")])])},lP=new se("MatMenuContent"),cP=function(){var t=function(){function t(e,n,i,r,a,o,s){_(this,t),this._template=e,this._componentFactoryResolver=n,this._appRef=i,this._injector=r,this._viewContainerRef=a,this._document=o,this._changeDetectorRef=s,this._attached=new z}return b(t,[{key:"attach",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._portal||(this._portal=new jg(this._template,this._viewContainerRef)),this.detach(),this._outlet||(this._outlet=new Vg(this._document.createElement("div"),this._componentFactoryResolver,this._appRef,this._injector));var e=this._template.elementRef.nativeElement;e.parentNode.insertBefore(this._outlet.outletElement,e),this._changeDetectorRef&&this._changeDetectorRef.markForCheck(),this._portal.attach(this._outlet,t),this._attached.next()}},{key:"detach",value:function(){this._portal.isAttached&&this._portal.detach()}},{key:"ngOnDestroy",value:function(){this._outlet&&this._outlet.dispose()}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(ul),gs(Fu),gs(Kc),gs(qo),gs(cl),gs(ud),gs(Lo))},t.\u0275dir=ze({type:t,selectors:[["ng-template","matMenuContent",""]],features:[Pu([{provide:lP,useExisting:t}])]}),t}(),dP=new se("MAT_MENU_PANEL"),hP=Tw(Dw((function t(){_(this,t)}))),fP=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,o){var s;return _(this,n),(s=e.call(this))._elementRef=t,s._focusMonitor=r,s._parentMenu=o,s.role="menuitem",s._hovered=new z,s._focused=new z,s._highlighted=!1,s._triggersSubmenu=!1,o&&o.addItem&&o.addItem(a(s)),s}return b(n,[{key:"focus",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"program",e=arguments.length>1?arguments[1]:void 0;this._focusMonitor?this._focusMonitor.focusVia(this._getHostElement(),t,e):this._getHostElement().focus(e),this._focused.next(this)}},{key:"ngAfterViewInit",value:function(){this._focusMonitor&&this._focusMonitor.monitor(this._elementRef,!1)}},{key:"ngOnDestroy",value:function(){this._focusMonitor&&this._focusMonitor.stopMonitoring(this._elementRef),this._parentMenu&&this._parentMenu.removeItem&&this._parentMenu.removeItem(this),this._hovered.complete(),this._focused.complete()}},{key:"_getTabIndex",value:function(){return this.disabled?"-1":"0"}},{key:"_getHostElement",value:function(){return this._elementRef.nativeElement}},{key:"_checkDisabled",value:function(t){this.disabled&&(t.preventDefault(),t.stopPropagation())}},{key:"_handleMouseEnter",value:function(){this._hovered.next(this)}},{key:"getLabel",value:function(){for(var t,e,n=this._elementRef.nativeElement.cloneNode(!0),i=n.querySelectorAll("mat-icon, .material-icons"),r=0;r0&&void 0!==arguments[0]?arguments[0]:"program";this.lazyContent?this._ngZone.onStable.pipe(kp(1)).subscribe((function(){return t._focusFirstItem(e)})):this._focusFirstItem(e)}},{key:"_focusFirstItem",value:function(t){var e=this._keyManager;if(e.setFocusOrigin(t).setFirstItemActive(),!e.activeItem&&this._directDescendantItems.length)for(var n=this._directDescendantItems.first._getHostElement().parentElement;n;){if("menu"===n.getAttribute("role")){n.focus();break}n=n.parentElement}}},{key:"resetActiveItem",value:function(){this._keyManager.setActiveItem(-1)}},{key:"setElevation",value:function(t){var e=Math.min(4+t,24),n="mat-elevation-z".concat(e),i=Object.keys(this._classList).find((function(t){return t.startsWith("mat-elevation-z")}));i&&i!==this._previousElevation||(this._previousElevation&&(this._classList[this._previousElevation]=!1),this._classList[n]=!0,this._previousElevation=n)}},{key:"setPositionClasses",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.xPosition,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.yPosition,n=this._classList;n["mat-menu-before"]="before"===t,n["mat-menu-after"]="after"===t,n["mat-menu-above"]="above"===e,n["mat-menu-below"]="below"===e}},{key:"_startAnimation",value:function(){this._panelAnimationState="enter"}},{key:"_resetAnimation",value:function(){this._panelAnimationState="void"}},{key:"_onAnimationDone",value:function(t){this._animationDone.next(t),this._isAnimating=!1}},{key:"_onAnimationStart",value:function(t){this._isAnimating=!0,"enter"===t.toState&&0===this._keyManager.activeItemIndex&&(t.element.scrollTop=0)}},{key:"_updateDirectDescendants",value:function(){var t=this;this._allItems.changes.pipe(rg(this._allItems)).subscribe((function(e){t._directDescendantItems.reset(e.filter((function(e){return e._parentMenu===t}))),t._directDescendantItems.notifyOnChanges()}))}},{key:"xPosition",get:function(){return this._xPosition},set:function(t){this._xPosition=t,this.setPositionClasses()}},{key:"yPosition",get:function(){return this._yPosition},set:function(t){this._yPosition=t,this.setPositionClasses()}},{key:"overlapTrigger",get:function(){return this._overlapTrigger},set:function(t){this._overlapTrigger=Em(t)}},{key:"hasBackdrop",get:function(){return this._hasBackdrop},set:function(t){this._hasBackdrop=Em(t)}},{key:"panelClass",set:function(t){var e=this,n=this._previousPanelClass;n&&n.length&&n.split(" ").forEach((function(t){e._classList[t]=!1})),this._previousPanelClass=t,t&&t.length&&(t.split(" ").forEach((function(t){e._classList[t]=!0})),this._elementRef.nativeElement.className="")}},{key:"classList",get:function(){return this.panelClass},set:function(t){this.panelClass=t}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Dc),gs(pP))},t.\u0275dir=ze({type:t,contentQueries:function(t,e,n){var i;1&t&&(Ql(n,lP,!0),Ql(n,fP,!0),Ql(n,fP,!1)),2&t&&(Gl(i=tc())&&(e.lazyContent=i.first),Gl(i=tc())&&(e._allItems=i),Gl(i=tc())&&(e.items=i))},viewQuery:function(t,e){var n;1&t&&Zl(ul,!0),2&t&&Gl(n=tc())&&(e.templateRef=n.first)},inputs:{backdropClass:"backdropClass",xPosition:"xPosition",yPosition:"yPosition",overlapTrigger:"overlapTrigger",hasBackdrop:"hasBackdrop",panelClass:["class","panelClass"],classList:"classList",ariaLabel:["aria-label","ariaLabel"],ariaLabelledby:["aria-labelledby","ariaLabelledby"],ariaDescribedby:["aria-describedby","ariaDescribedby"]},outputs:{closed:"closed",close:"close"}}),t}(),vP=function(){var t=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return n}(gP);return t.\u0275fac=function(e){return _P(e||t)},t.\u0275dir=ze({type:t,features:[Jo]}),t}(),_P=Ki(vP),yP=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r){return _(this,n),e.call(this,t,i,r)}return n}(vP);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Dc),gs(pP))},t.\u0275cmp=Fe({type:t,selectors:[["mat-menu"]],exportAs:["matMenu"],features:[Pu([{provide:dP,useExisting:vP},{provide:vP,useExisting:t}]),Jo],ngContentSelectors:oP,decls:2,vars:0,consts:[["tabindex","-1","role","menu",1,"mat-menu-panel",3,"id","ngClass","keydown","click"],[1,"mat-menu-content"]],template:function(t,e){1&t&&(Fs(),ps(0,sP,9,6,"ng-template"),uu(1,"\n"))},directives:[Ch],styles:['.mat-menu-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh - 48px);border-radius:4px;outline:0;min-height:64px}.mat-menu-panel.ng-animating{pointer-events:none}.cdk-high-contrast-active .mat-menu-panel{outline:solid 1px}.mat-menu-content:not(:empty){padding-top:8px;padding-bottom:8px}.mat-menu-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;position:relative}.mat-menu-item::-moz-focus-inner{border:0}.mat-menu-item[disabled]{cursor:default}[dir=rtl] .mat-menu-item{text-align:right}.mat-menu-item .mat-icon{margin-right:16px;vertical-align:middle}.mat-menu-item .mat-icon svg{vertical-align:top}[dir=rtl] .mat-menu-item .mat-icon{margin-left:16px;margin-right:0}.mat-menu-item[disabled]{pointer-events:none}.cdk-high-contrast-active .mat-menu-item.cdk-program-focused,.cdk-high-contrast-active .mat-menu-item.cdk-keyboard-focused,.cdk-high-contrast-active .mat-menu-item-highlighted{outline:dotted 1px}.mat-menu-item-submenu-trigger{padding-right:32px}.mat-menu-item-submenu-trigger::after{width:0;height:0;border-style:solid;border-width:5px 0 5px 5px;border-color:transparent transparent transparent currentColor;content:"";display:inline-block;position:absolute;top:50%;right:16px;transform:translateY(-50%)}[dir=rtl] .mat-menu-item-submenu-trigger{padding-right:16px;padding-left:32px}[dir=rtl] .mat-menu-item-submenu-trigger::after{right:auto;left:16px;transform:rotateY(180deg) translateY(-50%)}button.mat-menu-item{width:100%}.mat-menu-item .mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}\n'],encapsulation:2,data:{animation:[uP.transformMenu,uP.fadeInItems]},changeDetection:0}),t}(),bP=new se("mat-menu-scroll-strategy"),wP={provide:bP,deps:[Tv],useFactory:function(t){return function(){return t.scrollStrategies.reposition()}}},kP=Sg({passive:!0}),MP=function(){var t=function(){function t(e,n,i,r,a,o,s,u){var l=this;_(this,t),this._overlay=e,this._element=n,this._viewContainerRef=i,this._parentMenu=a,this._menuItemInstance=o,this._dir=s,this._focusMonitor=u,this._overlayRef=null,this._menuOpen=!1,this._closingActionsSubscription=x.EMPTY,this._hoverSubscription=x.EMPTY,this._menuCloseSubscription=x.EMPTY,this._handleTouchStart=function(){return l._openedBy="touch"},this._openedBy=null,this.restoreFocus=!0,this.menuOpened=new Rl,this.onMenuOpen=this.menuOpened,this.menuClosed=new Rl,this.onMenuClose=this.menuClosed,n.nativeElement.addEventListener("touchstart",this._handleTouchStart,kP),o&&(o._triggersSubmenu=this.triggersSubmenu()),this._scrollStrategy=r}return b(t,[{key:"ngAfterContentInit",value:function(){this._checkMenu(),this._handleHover()}},{key:"ngOnDestroy",value:function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._element.nativeElement.removeEventListener("touchstart",this._handleTouchStart,kP),this._menuCloseSubscription.unsubscribe(),this._closingActionsSubscription.unsubscribe(),this._hoverSubscription.unsubscribe()}},{key:"triggersSubmenu",value:function(){return!(!this._menuItemInstance||!this._parentMenu)}},{key:"toggleMenu",value:function(){return this._menuOpen?this.closeMenu():this.openMenu()}},{key:"openMenu",value:function(){var t=this;if(!this._menuOpen){this._checkMenu();var e=this._createOverlay(),n=e.getConfig();this._setPosition(n.positionStrategy),n.hasBackdrop=null==this.menu.hasBackdrop?!this.triggersSubmenu():this.menu.hasBackdrop,e.attach(this._getPortal()),this.menu.lazyContent&&this.menu.lazyContent.attach(this.menuData),this._closingActionsSubscription=this._menuClosingActions().subscribe((function(){return t.closeMenu()})),this._initMenu(),this.menu instanceof vP&&this.menu._startAnimation()}}},{key:"closeMenu",value:function(){this.menu.close.emit()}},{key:"focus",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"program",e=arguments.length>1?arguments[1]:void 0;this._focusMonitor?this._focusMonitor.focusVia(this._element,t,e):this._element.nativeElement.focus(e)}},{key:"_destroyMenu",value:function(){var t=this;if(this._overlayRef&&this.menuOpen){var e=this.menu;this._closingActionsSubscription.unsubscribe(),this._overlayRef.detach(),this._restoreFocus(),e instanceof vP?(e._resetAnimation(),e.lazyContent?e._animationDone.pipe(_p((function(t){return"void"===t.toState})),kp(1),$m(e.lazyContent._attached)).subscribe({next:function(){return e.lazyContent.detach()},complete:function(){return t._setIsMenuOpen(!1)}}):this._setIsMenuOpen(!1)):(this._setIsMenuOpen(!1),e.lazyContent&&e.lazyContent.detach())}}},{key:"_initMenu",value:function(){this.menu.parentMenu=this.triggersSubmenu()?this._parentMenu:void 0,this.menu.direction=this.dir,this._setMenuElevation(),this._setIsMenuOpen(!0),this.menu.focusFirstItem(this._openedBy||"program")}},{key:"_setMenuElevation",value:function(){if(this.menu.setElevation){for(var t=0,e=this.menu.parentMenu;e;)t++,e=e.parentMenu;this.menu.setElevation(t)}}},{key:"_restoreFocus",value:function(){this.restoreFocus&&(this._openedBy?this.triggersSubmenu()||this.focus(this._openedBy):this.focus()),this._openedBy=null}},{key:"_setIsMenuOpen",value:function(t){this._menuOpen=t,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this.triggersSubmenu()&&(this._menuItemInstance._highlighted=t)}},{key:"_checkMenu",value:function(){}},{key:"_createOverlay",value:function(){if(!this._overlayRef){var t=this._getOverlayConfig();this._subscribeToPositions(t.positionStrategy),this._overlayRef=this._overlay.create(t),this._overlayRef.keydownEvents().subscribe()}return this._overlayRef}},{key:"_getOverlayConfig",value:function(){return new cv({positionStrategy:this._overlay.position().flexibleConnectedTo(this._element).withLockedPosition().withTransformOriginOn(".mat-menu-panel, .mat-mdc-menu-panel"),backdropClass:this.menu.backdropClass||"cdk-overlay-transparent-backdrop",panelClass:this.menu.overlayPanelClass,scrollStrategy:this._scrollStrategy(),direction:this._dir})}},{key:"_subscribeToPositions",value:function(t){var e=this;this.menu.setPositionClasses&&t.positionChanges.subscribe((function(t){e.menu.setPositionClasses("start"===t.connectionPair.overlayX?"after":"before","top"===t.connectionPair.overlayY?"below":"above")}))}},{key:"_setPosition",value:function(t){var e=u("before"===this.menu.xPosition?["end","start"]:["start","end"],2),n=e[0],i=e[1],r=u("above"===this.menu.yPosition?["bottom","top"]:["top","bottom"],2),a=r[0],o=r[1],s=a,l=o,c=n,d=i,h=0;this.triggersSubmenu()?(d=n="before"===this.menu.xPosition?"start":"end",i=c="end"===n?"start":"end",h="bottom"===a?8:-8):this.menu.overlapTrigger||(s="top"===a?"bottom":"top",l="top"===o?"bottom":"top"),t.withPositions([{originX:n,originY:s,overlayX:c,overlayY:a,offsetY:h},{originX:i,originY:s,overlayX:d,overlayY:a,offsetY:h},{originX:n,originY:l,overlayX:c,overlayY:o,offsetY:-h},{originX:i,originY:l,overlayX:d,overlayY:o,offsetY:-h}])}},{key:"_menuClosingActions",value:function(){var t=this,e=this._overlayRef.backdropClick(),n=this._overlayRef.detachments();return ft(e,this._parentMenu?this._parentMenu.closed:rp(),this._parentMenu?this._parentMenu._hovered().pipe(_p((function(e){return e!==t._menuItemInstance})),_p((function(){return t._menuOpen}))):rp(),n)}},{key:"_handleMousedown",value:function(t){h_(t)||(this._openedBy=0===t.button?"mouse":null,this.triggersSubmenu()&&t.preventDefault())}},{key:"_handleKeydown",value:function(t){var e=t.keyCode;this.triggersSubmenu()&&(39===e&&"ltr"===this.dir||37===e&&"rtl"===this.dir)&&this.openMenu()}},{key:"_handleClick",value:function(t){this.triggersSubmenu()?(t.stopPropagation(),this.openMenu()):this.toggleMenu()}},{key:"_handleHover",value:function(){var t=this;this.triggersSubmenu()&&(this._hoverSubscription=this._parentMenu._hovered().pipe(_p((function(e){return e===t._menuItemInstance&&!e.disabled})),up(0,Wm)).subscribe((function(){t._openedBy="mouse",t.menu instanceof vP&&t.menu._isAnimating?t.menu._animationDone.pipe(kp(1),up(0,Wm),$m(t._parentMenu._hovered())).subscribe((function(){return t.openMenu()})):t.openMenu()})))}},{key:"_getPortal",value:function(){return this._portal&&this._portal.templateRef===this.menu.templateRef||(this._portal=new jg(this.menu.templateRef,this._viewContainerRef)),this._portal}},{key:"_deprecatedMatMenuTriggerFor",get:function(){return this.menu},set:function(t){this.menu=t}},{key:"menu",get:function(){return this._menu},set:function(t){var e=this;t!==this._menu&&(this._menu=t,this._menuCloseSubscription.unsubscribe(),t&&(this._menuCloseSubscription=t.close.subscribe((function(t){e._destroyMenu(),"click"!==t&&"tab"!==t||!e._parentMenu||e._parentMenu.closed.emit(t)}))))}},{key:"menuOpen",get:function(){return this._menuOpen}},{key:"dir",get:function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Tv),gs(Hu),gs(cl),gs(bP),gs(vP,8),gs(fP,10),gs(Lg,8),gs(m_))},t.\u0275dir=ze({type:t,selectors:[["","mat-menu-trigger-for",""],["","matMenuTriggerFor",""]],hostAttrs:["aria-haspopup","true",1,"mat-menu-trigger"],hostVars:2,hostBindings:function(t,e){1&t&&Ts("mousedown",(function(t){return e._handleMousedown(t)}))("keydown",(function(t){return e._handleKeydown(t)}))("click",(function(t){return e._handleClick(t)})),2&t&&ds("aria-expanded",e.menuOpen||null)("aria-controls",e.menuOpen?e.menu.panelId:null)},inputs:{restoreFocus:["matMenuTriggerRestoreFocus","restoreFocus"],_deprecatedMatMenuTriggerFor:["mat-menu-trigger-for","_deprecatedMatMenuTriggerFor"],menu:["matMenuTriggerFor","menu"],menuData:["matMenuTriggerData","menuData"]},outputs:{menuOpened:"menuOpened",onMenuOpen:"onMenuOpen",menuClosed:"menuClosed",onMenuClose:"onMenuClose"},exportAs:["matMenuTrigger"]}),t}(),SP=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[wP],imports:[xw]}),t}(),CP=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[wP],imports:[[df,xw,Gw,Yv,SP],Rg,xw,SP]}),t}();function xP(t,e){if(1&t){var n=xs();bs(0,"button",11),Ts("click",(function(){return Bn(n),Ys().changelanguage()})),uu(1,"\n "),ks(2,"img",12),uu(3),ws()}if(2&t){var i=Ys();na(2),_s("src","assets/img/lang/"+i.language.iconName,Rr),na(1),cu("\n ",i.language.name,"\n ")}}function DP(t,e){if(1&t&&(bs(0,"button",13),uu(1),ws()),2&t){var n=Ys();_s("disabled",!0),na(1),cu(" v",n.appService.nodeVersion," ")}}var LP=function(){return["/settings/network"]},TP=function(){return["/settings/blockchain"]},EP=function(){return["/settings/outputs"]},OP=function(){return["/settings/pending-transactions"]},AP=function(){return["/settings/backup"]},PP=function(t){return{coinName:t}},IP=function(){function t(t,e,n){this.appService=t,this.languageService=e,this.dialog=n}return t.prototype.ngOnInit=function(){var t=this;this.subscription=this.languageService.currentLanguage.subscribe((function(e){return t.language=e}))},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.changelanguage=function(){nD.openDialog(this.dialog)},t.\u0275fac=function(e){return new(e||t)(gs(Sm),gs(Hx),gs(Dk))},t.\u0275cmp=Fe({type:t,selectors:[["app-top-bar"]],inputs:{headline:"headline"},decls:50,vars:37,consts:[[1,"buttons-left"],[1,"title"],[1,"buttons-right"],[3,"overlapTrigger"],["menuMenu","matMenu"],["mat-menu-item","",3,"routerLink"],["mat-menu-item","","target","_blank","rel","noreferrer nofollow noopener",1,"color-primary",3,"href"],[1,"separator"],["mat-menu-item","",3,"click",4,"ngIf"],["mat-menu-item","",3,"disabled",4,"ngIf"],["mat-icon-button","",1,"button",3,"matMenuTriggerFor"],["mat-menu-item","",3,"click"],[1,"flag",3,"src"],["mat-menu-item","",3,"disabled"]],template:function(t,e){if(1&t&&(ks(0,"div",0),uu(1,"\n"),bs(2,"div",1),uu(3),ws(),uu(4,"\n"),bs(5,"div",2),uu(6,"\n "),bs(7,"mat-menu",3,4),uu(9,"\n "),bs(10,"button",5),uu(11),Tl(12,"translate"),ws(),uu(13,"\n "),bs(14,"button",5),uu(15),Tl(16,"translate"),ws(),uu(17,"\n "),bs(18,"button",5),uu(19),Tl(20,"translate"),ws(),uu(21,"\n "),bs(22,"button",5),uu(23),Tl(24,"translate"),ws(),uu(25,"\n "),bs(26,"button",5),uu(27),Tl(28,"translate"),ws(),uu(29,"\n "),bs(30,"a",6),uu(31),Tl(32,"translate"),ws(),uu(33,"\n "),ks(34,"div",7),uu(35,"\n "),ps(36,xP,4,2,"button",8),uu(37,"\n "),ks(38,"div",7),uu(39,"\n "),ps(40,DP,2,2,"button",9),uu(41,"\n "),ws(),uu(42,"\n "),bs(43,"button",10),uu(44,"\n "),bs(45,"mat-icon"),uu(46,"menu"),ws(),uu(47,"\n "),ws(),uu(48,"\n"),ws(),uu(49,"\n")),2&t){var n=ms(8);na(3),cu("\n ",e.headline,"\n"),na(4),_s("overlapTrigger",!1),na(3),_s("routerLink",wl(30,LP)),na(1),lu(El(12,17,"network.title")),na(3),_s("routerLink",wl(31,TP)),na(1),lu(El(16,19,"blockchain.title")),na(3),_s("routerLink",wl(32,EP)),na(1),lu(El(20,21,"outputs.title")),na(3),_s("routerLink",wl(33,OP)),na(1),lu(El(24,23,"pending-txs.title")),na(3),_s("routerLink",wl(34,AP)),na(1),lu(El(28,25,"backup.title")),na(3),_s("href",e.appService.explorerUrl,Rr),na(1),lu(Ol(32,27,"header.explorer-link",kl(35,PP,e.appService.fullCoinName))),na(5),_s("ngIf",e.language),na(4),_s("ngIf",e.appService.nodeVersion),na(3),_s("matMenuTriggerFor",n)}},directives:[yP,fP,jT,Eh,XC,MP,vx],pipes:[pC],styles:["[_nghost-%COMP%]{display:flex;color:#fff;width:100%}.buttons-left[_ngcontent-%COMP%]{padding:0 10px;width:120px}.title[_ngcontent-%COMP%]{font-size:13px;font-weight:700;flex:1 1 auto;letter-spacing:1px;line-height:50px;text-align:center}.buttons-right[_ngcontent-%COMP%]{text-align:right;width:120px}.buttons-right[_ngcontent-%COMP%] .button[_ngcontent-%COMP%]{height:50px;width:50px}.mat-menu-item[_ngcontent-%COMP%]{height:50px;line-height:50px;font-size:14px}.color-primary[_ngcontent-%COMP%]{color:#0072ff}.separator[_ngcontent-%COMP%]{width:100%;height:2px;background-color:rgba(30,34,39,.05);margin:8px 0}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:3px}"]}),t}(),YP=function(t){return t.RightButton="RightButton",t.LeftButton="LeftButton",t}({}),RP=function(){function t(){this.className="",this.changeActiveButtonManually=!1,this.onStateChange=new Rl,this.ButtonStates=YP}return t.prototype.onRightButtonClicked=function(){this.activeButton===YP.LeftButton&&(this.changeActiveButtonManually||(this.activeButton=YP.RightButton),this.onStateChange.emit(YP.RightButton))},t.prototype.onLeftButtonClicked=function(){this.activeButton===YP.RightButton&&(this.changeActiveButtonManually||(this.activeButton=YP.LeftButton),this.onStateChange.emit(YP.LeftButton))},t.\u0275fac=function(e){return new(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["app-double-button"]],inputs:{rightButtonText:"rightButtonText",leftButtonText:"leftButtonText",activeButton:"activeButton",className:"className",changeActiveButtonManually:"changeActiveButtonManually"},outputs:{onStateChange:"onStateChange"},decls:9,vars:9,consts:[[1,"-toggle","-small-button",3,"disabled","forceEmitEvents","action"]],template:function(t,e){1&t&&(bs(0,"div"),uu(1,"\n "),bs(2,"app-button",0),Ts("action",(function(){return e.onLeftButtonClicked()})),uu(3),ws(),uu(4,"\n "),bs(5,"app-button",0),Ts("action",(function(){return e.onRightButtonClicked()})),uu(6),ws(),uu(7,"\n"),ws(),uu(8,"\n")),2&t&&(pu("-buttons-container ",e.className,""),na(2),_s("disabled",e.activeButton!==e.ButtonStates.LeftButton)("forceEmitEvents",!0),na(1),lu(e.leftButtonText),na(2),_s("disabled",e.activeButton!==e.ButtonStates.RightButton)("forceEmitEvents",!0),na(1),lu(e.rightButtonText))},directives:[Cx],styles:[".-small-button[_ngcontent-%COMP%] button{width:unset;height:unset;padding:0 10px;min-width:100px;margin:unset;box-shadow:unset;background-color:transparent!important;line-height:1!important;min-height:26px}.-small-button[_ngcontent-%COMP%] button span{color:#1e2227;line-height:unset!important}.-small-button[_ngcontent-%COMP%] button .content-container .content{font-size:13px}.-small-button[_ngcontent-%COMP%] button.enabled{background-color:#1e2227!important}.-small-button[_ngcontent-%COMP%] button.enabled span{color:#fafafa}.-buttons-container[_ngcontent-%COMP%]{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:5px;background:hsla(0,0%,100%,.1);border-radius:100px;margin:0 auto;font-size:1px}.light.-buttons-container[_ngcontent-%COMP%]{background:rgba(30,34,39,.065)}.light[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button.enabled{background-color:#fafafa!important}.light[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button.enabled span{color:#1e2227}@media (max-width:991px){.-buttons-container.navbar.light[_ngcontent-%COMP%]{border-radius:20px}.-buttons-container.navbar.light[_ngcontent-%COMP%] app-button[_ngcontent-%COMP%] .internal-container{display:block}}.small.-buttons-container[_ngcontent-%COMP%]{padding:2px}.small[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button{min-width:70px;min-height:16px}.small[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button .content-container .content{font-size:9px}"]}),t}(),FP=function(){function t(){this.switchVisibleInternal=!1,this.activeComponentInternal=new Cm(YP.LeftButton),this.switchDiabledInternal=!1}return Object.defineProperty(t.prototype,"switchVisible",{get:function(){return this.switchVisibleInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"activeComponent",{get:function(){return this.activeComponentInternal.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"leftText",{get:function(){return this.leftTextInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"rightText",{get:function(){return this.rightTextInternal},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"switchDiabled",{get:function(){return this.switchDiabledInternal},enumerable:!1,configurable:!0}),t.prototype.setActiveComponent=function(t){this.activeComponentInternal.next(t)},t.prototype.showSwitch=function(t,e,n){void 0===n&&(n=YP.LeftButton),this.setActiveComponent(n),this.switchDiabledInternal=!1,this.switchVisibleInternal=!0,this.leftTextInternal=t,this.rightTextInternal=e},t.prototype.hideSwitch=function(){this.switchVisibleInternal=!1},t.prototype.enableSwitch=function(){this.switchDiabledInternal=!1},t.prototype.disableSwitch=function(){this.switchDiabledInternal=!0},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)}}),t}(),HP=function(t){return{coinName:t}};function BP(t,e){if(1&t&&(bs(0,"a",12),uu(1,"\n "),ks(2,"img",13),uu(3,"\n "),bs(4,"span"),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),ws()),2&t){var n=Ys();na(5),lu(Ol(6,1,"exchange.title-and-button",kl(4,HP,n.appService.coinName)))}}function jP(t,e){1&t&&(bs(0,"a",14),uu(1,"\n "),ks(2,"img",13),uu(3,"\n "),bs(4,"span"),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),ws()),2&t&&(na(5),lu(El(6,1,"buy.title-and-button")))}var NP=function(t){return{"-switch":!0,"element-disabled":t}};function WP(t,e){if(1&t){var n=xs();bs(0,"app-double-button",15),Ts("onStateChange",(function(t){return Bn(n),Ys().changeActiveComponent(t)})),Tl(1,"translate"),Tl(2,"translate"),Tl(3,"async"),ws()}if(2&t){var i=Ys();_s("ngClass",kl(10,NP,i.navBarSwitchService.switchDiabled))("leftButtonText",El(1,4,i.navBarSwitchService.leftText))("rightButtonText",El(2,6,i.navBarSwitchService.rightText))("activeButton",El(3,8,i.navBarSwitchService.activeComponent))}}var VP=function(){function t(t,e){this.appService=t,this.navBarSwitchService=e,this.otcEnabled=Mm.otcEnabled,this.exchangeEnabled=!0}return t.prototype.changeActiveComponent=function(t){this.navBarSwitchService.setActiveComponent(t)},t.\u0275fac=function(e){return new(e||t)(gs(Sm),gs(FP))},t.\u0275cmp=Fe({type:t,selectors:[["app-nav-bar"]],decls:41,vars:12,consts:[[1,"container"],[1,"-buttons"],["routerLink","/wallets","routerLinkActive","full-opacity",1,"-button"],["src","assets/img/wallet-black.png"],["routerLink","/send","routerLinkActive","full-opacity",1,"-button"],["src","assets/img/send-black.png"],["routerLink","/transactions","routerLinkActive","full-opacity",1,"-button"],["src","assets/img/transactions-black.png"],[1,"flex-fill"],["class","-button","routerLink","/exchange","routerLinkActive","full-opacity",4,"ngIf"],["class","-button",4,"ngIf"],["className","light navbar",3,"ngClass","leftButtonText","rightButtonText","activeButton","onStateChange",4,"ngIf"],["routerLink","/exchange","routerLinkActive","full-opacity",1,"-button"],["src","assets/img/money-gold.png"],[1,"-button"],["className","light navbar",3,"ngClass","leftButtonText","rightButtonText","activeButton","onStateChange"]],template:function(t,e){1&t&&(bs(0,"div",0),uu(1,"\n "),bs(2,"div",1),uu(3,"\n "),bs(4,"a",2),uu(5,"\n "),ks(6,"img",3),uu(7,"\n "),bs(8,"span"),uu(9),Tl(10,"translate"),ws(),uu(11,"\n "),ws(),uu(12,"\n "),bs(13,"a",4),uu(14,"\n "),ks(15,"img",5),uu(16,"\n "),bs(17,"span"),uu(18),Tl(19,"translate"),ws(),uu(20,"\n "),ws(),uu(21,"\n "),bs(22,"a",6),uu(23,"\n "),ks(24,"img",7),uu(25,"\n "),bs(26,"span"),uu(27),Tl(28,"translate"),ws(),uu(29,"\n "),ws(),uu(30,"\n "),ks(31,"div",8),uu(32,"\n "),ps(33,BP,8,6,"a",9),uu(34,"\n "),ps(35,jP,8,3,"a",10),uu(36,"\n "),ps(37,WP,4,12,"app-double-button",11),uu(38,"\n "),ws(),uu(39,"\n"),ws(),uu(40,"\n")),2&t&&(na(9),lu(El(10,6,"wallet.title-and-button")),na(9),lu(El(19,8,"send.title-and-button")),na(9),lu(El(28,10,"history.title-and-button")),na(6),_s("ngIf",e.exchangeEnabled),na(2),_s("ngIf",e.otcEnabled),na(2),_s("ngIf",e.navBarSwitchService.switchVisible))},directives:[NT,VT,Eh,RP,Ch],pipes:[pC,Uh],styles:[".-buttons[_ngcontent-%COMP%]{display:flex;width:100%}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{cursor:pointer;padding:0 20px;opacity:.2;display:block;text-decoration:none;color:#1e2227;display:flex;height:66px;align-items:center}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:hover{opacity:.4}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:active{opacity:.55}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{float:left;height:32px;width:32px}@media (max-width:991px){.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:27.2px;width:27.2px}}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:14px;line-height:1.3;margin:0 5px}@media (max-width:991px){.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:11.9px}}.-buttons[_ngcontent-%COMP%] .-switch[_ngcontent-%COMP%]{align-self:center;padding:0 20px}.full-opacity[_ngcontent-%COMP%]{opacity:1!important}"]}),t}(),zP=["primaryValueBar"],UP=Lw((function t(e){_(this,t),this._elementRef=e}),"primary"),qP=new se("mat-progress-bar-location",{providedIn:"root",factory:function(){var t=_e(ud),e=t?t.location:null;return{getPathname:function(){return e?e.pathname+e.search:""}}}}),GP=0,KP=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a){var o;_(this,n),(o=e.call(this,t))._elementRef=t,o._ngZone=i,o._animationMode=r,o._isNoopAnimation=!1,o._value=0,o._bufferValue=0,o.animationEnd=new Rl,o._animationEndSubscription=x.EMPTY,o.mode="determinate",o.progressbarId="mat-progress-bar-".concat(GP++);var s=a?a.getPathname().split("#")[0]:"";return o._rectangleFillValue="url('".concat(s,"#").concat(o.progressbarId,"')"),o._isNoopAnimation="NoopAnimations"===r,o}return b(n,[{key:"_primaryTransform",value:function(){return{transform:"scaleX(".concat(this.value/100,")")}}},{key:"_bufferTransform",value:function(){return"buffer"===this.mode?{transform:"scaleX(".concat(this.bufferValue/100,")")}:null}},{key:"ngAfterViewInit",value:function(){var t=this;this._ngZone.runOutsideAngular((function(){var e=t._primaryValueBar.nativeElement;t._animationEndSubscription=Rm(e,"transitionend").pipe(_p((function(t){return t.target===e}))).subscribe((function(){"determinate"!==t.mode&&"buffer"!==t.mode||t._ngZone.run((function(){return t.animationEnd.next({value:t.value})}))}))}))}},{key:"ngOnDestroy",value:function(){this._animationEndSubscription.unsubscribe()}},{key:"value",get:function(){return this._value},set:function(t){this._value=ZP(Om(t)||0)}},{key:"bufferValue",get:function(){return this._bufferValue},set:function(t){this._bufferValue=ZP(t||0)}}]),n}(UP);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Dc),gs(gw,8),gs(qP,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-progress-bar"]],viewQuery:function(t,e){var n;1&t&&Zl(zP,!0),2&t&&Gl(n=tc())&&(e._primaryValueBar=n.first)},hostAttrs:["role","progressbar","aria-valuemin","0","aria-valuemax","100",1,"mat-progress-bar"],hostVars:4,hostBindings:function(t,e){2&t&&(ds("aria-valuenow","indeterminate"===e.mode||"query"===e.mode?null:e.value)("mode",e.mode),Js("_mat-animation-noopable",e._isNoopAnimation))},inputs:{color:"color",mode:"mode",value:"value",bufferValue:"bufferValue"},outputs:{animationEnd:"animationEnd"},exportAs:["matProgressBar"],features:[Jo],decls:21,vars:4,consts:[["width","100%","height","4","focusable","false",1,"mat-progress-bar-background","mat-progress-bar-element"],["x","4","y","0","width","8","height","4","patternUnits","userSpaceOnUse",3,"id"],["cx","2","cy","2","r","2"],["width","100%","height","100%"],[1,"mat-progress-bar-buffer","mat-progress-bar-element",3,"ngStyle"],[1,"mat-progress-bar-primary","mat-progress-bar-fill","mat-progress-bar-element",3,"ngStyle"],["primaryValueBar",""],[1,"mat-progress-bar-secondary","mat-progress-bar-fill","mat-progress-bar-element"]],template:function(t,e){1&t&&(uu(0,"\n"),hi(),bs(1,"svg",0),uu(2,"\n "),bs(3,"defs"),uu(4,"\n "),bs(5,"pattern",1),uu(6,"\n "),ks(7,"circle",2),uu(8,"\n "),ws(),uu(9,"\n "),ws(),uu(10,"\n "),ks(11,"rect",3),uu(12,"\n"),ws(),uu(13,"\n"),fi(),ks(14,"div",4),uu(15,"\n"),ks(16,"div",5,6),uu(18,"\n"),ks(19,"div",7),uu(20,"\n")),2&t&&(na(5),_s("id",e.progressbarId),na(6),ds("fill",e._rectangleFillValue),na(3),_s("ngStyle",e._bufferTransform()),na(2),_s("ngStyle",e._primaryTransform()))},directives:[Bh],styles:['.mat-progress-bar{display:block;height:4px;overflow:hidden;position:relative;transition:opacity 250ms linear;width:100%}._mat-animation-noopable.mat-progress-bar{transition:none;animation:none}.mat-progress-bar .mat-progress-bar-element,.mat-progress-bar .mat-progress-bar-fill::after{height:100%;position:absolute;width:100%}.mat-progress-bar .mat-progress-bar-background{width:calc(100% + 10px)}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-background{display:none}.mat-progress-bar .mat-progress-bar-buffer{transform-origin:top left;transition:transform 250ms ease}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-buffer{border-top:solid 5px;opacity:.5}.mat-progress-bar .mat-progress-bar-secondary{display:none}.mat-progress-bar .mat-progress-bar-fill{animation:none;transform-origin:top left;transition:transform 250ms ease}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-fill{border-top:solid 4px}.mat-progress-bar .mat-progress-bar-fill::after{animation:none;content:"";display:inline-block;left:0}.mat-progress-bar[dir=rtl],[dir=rtl] .mat-progress-bar{transform:rotateY(180deg)}.mat-progress-bar[mode=query]{transform:rotateZ(180deg)}.mat-progress-bar[mode=query][dir=rtl],[dir=rtl] .mat-progress-bar[mode=query]{transform:rotateZ(180deg) rotateY(180deg)}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-fill,.mat-progress-bar[mode=query] .mat-progress-bar-fill{transition:none}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary,.mat-progress-bar[mode=query] .mat-progress-bar-primary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-translate 2000ms infinite linear;left:-145.166611%}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-primary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-scale 2000ms infinite linear}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary,.mat-progress-bar[mode=query] .mat-progress-bar-secondary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-translate 2000ms infinite linear;left:-54.888891%;display:block}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-secondary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-scale 2000ms infinite linear}.mat-progress-bar[mode=buffer] .mat-progress-bar-background{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-background-scroll 250ms infinite linear;display:block}.mat-progress-bar._mat-animation-noopable .mat-progress-bar-fill,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-buffer,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-primary,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-secondary,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-background{animation:none;transition-duration:1ms}@keyframes mat-progress-bar-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mat-progress-bar-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mat-progress-bar-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mat-progress-bar-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mat-progress-bar-background-scroll{to{transform:translateX(-8px)}}\n'],encapsulation:2,changeDetection:0}),t}();function ZP(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:100;return Math.max(e,Math.min(n,t))}var JP=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[df,xw],xw]}),t}();function QP(t,e){1&t&&(bs(0,"p",13),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),lu(El(2,1,"common.loading")))}function XP(t,e){if(1&t&&(bs(0,"p",14),bs(1,"span"),uu(2),Tl(3,"percent"),ws(),ws()),2&t){var n=Ys();na(2),lu(Ol(3,1,n.synchronizationPercentage,"1.2-2"))}}function $P(t,e){if(1&t&&(bs(0,"p",14),bs(1,"span"),uu(2),Tl(3,"amount"),ws(),uu(4),Tl(5,"amount"),ws()),2&t){var n=Ys();na(2),lu(Al(3,2,n.coins,!0,"first")),na(2),cu(" ",Al(5,6,n.coins,!0,"last"),"")}}function tI(t,e){if(1&t&&(bs(0,"span"),uu(1),Tl(2,"currency"),ws()),2&t){var n=Ys(3);na(1),lu(Pl(2,1,n.coins*n.price,"USD","symbol","1.2-2"))}}function eI(t,e){1&t&&(bs(0,"span"),uu(1,"-"),ws())}function nI(t,e){if(1&t&&(bs(0,"span"),uu(1,"\n "),ps(2,tI,3,6,"span",10),uu(3,"\n "),ps(4,eI,2,0,"span",10),uu(5),Tl(6,"currency"),ws()),2&t){var n=Ys(2);na(2),_s("ngIf",n.synchronized&&n.balanceObtained),na(2),_s("ngIf",!n.synchronized||!n.balanceObtained),na(1),cu("\n (",Pl(6,3,n.price,"USD","symbol","1.2-2"),")\n ")}}function iI(t,e){1&t&&(bs(0,"span"),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),lu(El(2,1,"common.loading")))}function rI(t,e){if(1&t&&(bs(0,"p",15),uu(1,"\n "),ps(2,nI,7,8,"span",10),uu(3,"\n "),ps(4,iI,3,3,"span",10),uu(5,"\n "),ws()),2&t){var n=Ys();na(2),_s("ngIf",n.price),na(2),_s("ngIf",!n.price)}}function aI(t,e){1&t&&(bs(0,"p"),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),lu(El(2,1,"common.loading")))}function oI(t,e){if(1&t&&(bs(0,"p"),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys();na(1),du("",El(2,2,"header.syncing-blocks")," ","("+n.currentBlock+"/"+n.highestBlock+")","")}}function sI(t,e){if(1&t&&(bs(0,"p"),uu(1),Tl(2,"amount"),ws()),2&t){var n=Ys();na(1),lu(Ol(2,1,n.hours,!1))}}function uI(t,e){if(1&t&&ks(0,"mat-progress-bar",16),2&t){var n=Ys();_s("mode","determinate")("value",100*n.synchronizationPercentage)}}function lI(t,e){if(1&t&&(bs(0,"div",17),uu(1,"\n "),bs(2,"div"),uu(3),Tl(4,"translate"),bs(5,"a",18),uu(6),ws(),uu(7),Tl(8,"translate"),ws(),uu(9,"\n "),ws()),2&t){var n=Ys();na(3),cu("\n ",El(4,4,"header.warnings.update-part1"),"\n "),na(2),_s("href",n.walletDownloadUrl,Rr),na(1),cu("v",n.appService.lastestVersion,""),na(1),cu("\n ",El(8,6,"header.warnings.update-part3"),"\n ")}}function cI(t,e){1&t&&(bs(0,"div",17),uu(1,"\n "),bs(2,"div"),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ws()),2&t&&(na(3),lu(El(4,1,"header.warnings.csrf")))}function dI(t,e){1&t&&(bs(0,"div",17),uu(1,"\n "),bs(2,"div"),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ws()),2&t&&(na(3),lu(El(4,1,"header.warnings.no-connections")))}function hI(t,e){1&t&&(bs(0,"div"),uu(1),Tl(2,"translate"),bs(3,"a",19),uu(4),Tl(5,"translate"),ws(),uu(6),Tl(7,"translate"),ws()),2&t&&(na(1),cu("\n ",El(2,3,"header.warnings.pending-txs-part1"),"\n "),na(3),lu(El(5,5,"header.warnings.pending-txs-part2")),na(2),cu("\n ",El(7,7,"header.warnings.pending-txs-part3"),"\n "))}function fI(t,e){1&t&&(bs(0,"div"),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),cu("\n ",El(2,1,"header.warnings.synchronizing"),"\n "))}function pI(t,e){if(1&t&&(bs(0,"div",17),uu(1,"\n "),ps(2,hI,8,9,"div",10),uu(3,"\n "),ps(4,fI,3,3,"div",10),uu(5,"\n "),ws()),2&t){var n=Ys();na(2),_s("ngIf",n.hasPendingTxs),na(2),_s("ngIf",!n.synchronized&&n.synchronizationInfoObtained&&!n.hasPendingTxs)}}var mI=function(){function t(t,e,n,i,r){this.appService=t,this.networkService=e,this.blockchainService=n,this.priceService=i,this.balanceAndOutputsService=r,this.synchronizationInfoObtained=!1,this.synchronized=!1,this.showPrice=!!Mm.priceApiId,this.balanceObtained=!1,this.walletDownloadUrl=Mm.walletDownloadUrl,this.subscriptionsGroup=[]}return t.prototype.ngOnInit=function(){var t=this;this.subscriptionsGroup.push(this.blockchainService.progress.pipe(_p((function(t){return!!t}))).subscribe((function(e){t.synchronizationInfoObtained=!0,t.highestBlock=e.highestBlock,t.currentBlock=e.currentBlock,t.synchronizationPercentage=t.currentBlock&&t.highestBlock?t.currentBlock/t.highestBlock:0,t.synchronized=e.synchronized}))),this.subscriptionsGroup.push(this.priceService.price.subscribe((function(e){return t.price=e}))),this.subscriptionsGroup.push(this.balanceAndOutputsService.walletsWithBalance.subscribe((function(e){var n=new Map;e.forEach((function(t){t.addresses.forEach((function(t){n.has(t.address)?n.get(t.address).coins.isLessThan(t.coins)&&n.set(t.address,t):n.set(t.address,t)}))}));var i=new hp.BigNumber(0),r=new hp.BigNumber(0);n.forEach((function(t){i=i.plus(t.coins),r=r.plus(t.hours)})),t.coins=i.toString(),t.hours=r.toString()}))),this.subscriptionsGroup.push(this.balanceAndOutputsService.hasPendingTransactions.subscribe((function(e){t.hasPendingTxs=e}))),this.subscriptionsGroup.push(this.balanceAndOutputsService.firstFullUpdateMade.subscribe((function(e){t.balanceObtained=e})))},t.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach((function(t){return t.unsubscribe()}))},t.\u0275fac=function(e){return new(e||t)(gs(Sm),gs(rP),gs(SO),gs(nP),gs(MO))},t.\u0275cmp=Fe({type:t,selectors:[["app-header"]],inputs:{headline:"headline"},decls:48,vars:13,consts:[[1,"-container"],[1,"large-header"],[1,"gradient"],[3,"headline"],[1,"balance-container"],[1,"balance"],["class","loading-header",4,"ngIf"],["class","coins",4,"ngIf"],["class","dollars",4,"ngIf"],[1,"hour-balance"],[4,"ngIf"],["color","primary",3,"mode","value",4,"ngIf"],["class","notification-bar",4,"ngIf"],[1,"loading-header"],[1,"coins"],[1,"dollars"],["color","primary",3,"mode","value"],[1,"notification-bar"],["target","_blank","rel","noreferrer nofollow noopener",3,"href"],["routerLink","/settings/pending-transactions"]],template:function(t,e){1&t&&(bs(0,"div",0),uu(1,"\n "),bs(2,"div",1),uu(3,"\n "),uu(4,"\n "),bs(5,"div",2),uu(6,"\n "),ks(7,"app-top-bar",3),uu(8,"\n "),bs(9,"div",4),uu(10,"\n "),bs(11,"div",5),uu(12,"\n "),ps(13,QP,3,3,"p",6),uu(14,"\n "),ps(15,XP,4,4,"p",7),uu(16,"\n "),ps(17,$P,6,10,"p",7),uu(18,"\n "),ps(19,rI,6,2,"p",8),uu(20,"\n "),ws(),uu(21,"\n "),ws(),uu(22,"\n "),bs(23,"div",9),uu(24,"\n "),ps(25,aI,3,3,"p",10),uu(26,"\n "),ps(27,oI,3,4,"p",10),uu(28,"\n "),ps(29,sI,3,4,"p",10),uu(30,"\n "),ws(),uu(31,"\n "),ws(),uu(32,"\n "),ws(),uu(33,"\n "),ks(34,"app-nav-bar"),uu(35,"\n "),ps(36,uI,1,2,"mat-progress-bar",11),uu(37,"\n "),uu(38,"\n "),ps(39,lI,10,8,"div",12),uu(40,"\n "),ps(41,cI,6,3,"div",12),uu(42,"\n "),ps(43,dI,6,3,"div",12),uu(44,"\n "),ps(45,pI,6,2,"div",12),uu(46,"\n"),ws(),uu(47,"\n")),2&t&&(na(7),_s("headline",e.headline),na(6),_s("ngIf",!e.synchronizationInfoObtained||e.synchronized&&!e.balanceObtained),na(2),_s("ngIf",e.synchronizationInfoObtained&&!e.synchronized),na(2),_s("ngIf",e.synchronized&&e.balanceObtained),na(2),_s("ngIf",e.showPrice),na(6),_s("ngIf",!e.synchronizationInfoObtained||e.synchronized&&!e.balanceObtained),na(2),_s("ngIf",e.synchronizationInfoObtained&&!e.synchronized),na(2),_s("ngIf",e.synchronized&&e.balanceObtained),na(7),_s("ngIf",!e.synchronized&&e.synchronizationInfoObtained),na(3),_s("ngIf",e.appService.updateAvailable),na(2),_s("ngIf",e.appService.csrfDisabled),na(2),_s("ngIf",!e.appService.csrfDisabled&&e.networkService.noConnections),na(2),_s("ngIf",e.hasPendingTxs||!e.synchronized&&e.synchronizationInfoObtained))},directives:[IP,Eh,VP,KP,NT],pipes:[pC,of,DC,sf],styles:[".-container[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:2px solid rgba(30,34,39,.05)}.large-header[_ngcontent-%COMP%]{background-repeat:no-repeat;background-position:50%;background-size:100% auto;background-size:cover;background-image:url(/customize/header.png)}.large-header[_ngcontent-%COMP%] .gradient[_ngcontent-%COMP%]{background-size:100% 100%;display:flex;flex-flow:column;align-items:stretch;min-height:190px;background-image:url(/customize/header-gradient.png)}.balance-container[_ngcontent-%COMP%]{align-items:center;color:#fff;display:flex;flex:1 1 auto;font-size:12px;justify-content:center;text-align:center}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%]{line-height:1;margin:0 0 .5em}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:4em}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .loading-header[_ngcontent-%COMP%]{margin:0 0 .5em;font-size:2em}.balance-container[_ngcontent-%COMP%] .dollars[_ngcontent-%COMP%]{margin:0}.hour-balance[_ngcontent-%COMP%]{text-align:center}.hour-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{background-color:hsla(0,0%,100%,.3);border-radius:1000px;color:#000;display:inline-block;font-size:12px;line-height:1.8;margin:1em 0 2em;padding:0 30px}.notification-bar[_ngcontent-%COMP%]{background-color:#ff004e;color:#fafafa;min-height:64px;display:flex;font-size:18px;padding:15px 30px;text-align:center;line-height:1.2}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{margin:auto}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{text-decoration:underline;color:#fafafa}"]}),t}(),gI=["button"],vI=function(t){return{"red-text":t}};function _I(t,e){if(1&t&&(bs(0,"div",11),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys();_s("ngClass",kl(4,vI,n.data.warning)),na(1),lu(El(2,2,n.data.description))}}function yI(t,e){if(1&t){var n=xs();bs(0,"div",3),uu(1,"\n "),bs(2,"label",12),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),bs(6,"input",13),Ts("keydown.enter",(function(){return Bn(n),Ys().proceed()}))("blur",(function(){return Bn(n),Ys().validateForm()})),ws(),uu(7,"\n "),ws()}if(2&t){var i=Ys();na(3),lu(El(4,3,"password.confirm-password-label")),na(3),_s("appFormFieldError",i.password2ErrorMsg),ds("disabled",i.working?"true":null)}}var bI=function(t){return{"element-disabled":t}};function wI(t,e){if(1&t&&(bs(0,"a",14),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys();_s("ngClass",kl(5,bI,n.working))("href","#/reset/"+n.data.wallet.id,Rr),na(1),lu(El(2,3,"password.reset-link"))}}var kI=function(t){return{"modal-form-container":t}},MI=function(){function t(t,e,n,i){this.data=t,this.dialogRef=e,this.msgBarService=n,this.changeDetector=i,this.passwordSubmit=new z,this.working=!1,this.password1ErrorMsg="",this.password2ErrorMsg="",this.data=Object.assign({confirm:!1,description:null,warning:!1,title:null,wallet:null},t||{})}return t.openDialog=function(e,n,i){void 0===i&&(i=!0);var r=new pk;return r.data=n,r.autoFocus=!0,r.width=i?"260px":Mm.mediumModalWidth,e.open(t,r)},t.prototype.ngOnInit=function(){this.form=new tS({}),this.form.addControl("password",new $M("")),this.form.addControl("confirm_password",new $M("")),this.data.confirm?this.form.get("confirm_password").enable():this.form.get("confirm_password").disable(),this.form.setValidators(this.validateForm.bind(this)),this.data.description&&this.dialogRef.updateSize("400px")},t.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.passwordSubmit.complete()},t.prototype.proceed=function(){!this.working&&this.form.valid&&(this.msgBarService.hide(),this.button.setLoading(),this.working=!0,this.passwordSubmit.next({password:this.form.get("password").value,close:this.close.bind(this),error:this.error.bind(this)}),this.changeDetector.detectChanges())},t.prototype.validateForm=function(){this.password1ErrorMsg="",this.password2ErrorMsg="";var t=!0;return this.form.get("password").value||(t=!1,this.form.get("password").touched&&(this.password1ErrorMsg="password.password-error-info")),this.data.confirm&&(this.form.get("confirm_password").value||(t=!1,this.form.get("confirm_password").touched&&(this.password2ErrorMsg="password.password-error-info")),t&&this.form.get("password").value!==this.form.get("confirm_password").value&&(t=!1,this.password2ErrorMsg="password.confirm-error-info")),t?null:{Invalid:!0}},t.prototype.close=function(){this.dialogRef.close()},t.prototype.error=function(t){t.type||(t=gm(t)),t.translatableErrorMsg=t.translatableErrorMsg?t.translatableErrorMsg:"password.decrypting-error",this.msgBarService.showError(t),this.button.resetState(),this.working=!1},t.\u0275fac=function(e){return new(e||t)(gs(kk),gs(bk),gs(Gx),gs(Lo))},t.\u0275cmp=Fe({type:t,selectors:[["app-password-dialog"]],viewQuery:function(t,e){var n;1&t&&Zl(gI,!0),2&t&&Gl(n=tc())&&(e.button=n.first)},decls:31,vars:23,consts:[[3,"headline","dialog","disableDismiss"],[3,"ngClass",4,"ngIf"],[3,"ngClass","formGroup"],[1,"form-field"],["for","password"],["formControlName","password","id","password","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],["class","form-field",4,"ngIf"],["class","link",3,"ngClass","href",4,"ngIf"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"],["button",""],[3,"ngClass"],["for","confirm_password"],["formControlName","confirm_password","id","confirm_password","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],[1,"link",3,"ngClass","href"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),Tl(2,"translate"),uu(3,"\n "),ps(4,_I,3,6,"div",1),uu(5,"\n "),bs(6,"div",2),uu(7,"\n "),bs(8,"div",3),uu(9,"\n "),bs(10,"label",4),uu(11),Tl(12,"translate"),ws(),uu(13,"\n "),bs(14,"input",5),Ts("keydown.enter",(function(){return e.proceed()}))("blur",(function(){return e.validateForm()})),ws(),uu(15,"\n "),ws(),uu(16,"\n "),ps(17,yI,8,5,"div",6),uu(18,"\n "),ws(),uu(19,"\n "),ps(20,wI,3,7,"a",7),uu(21,"\n "),bs(22,"div",8),uu(23,"\n "),bs(24,"app-button",9,10),Ts("action",(function(){return e.proceed()})),uu(26),Tl(27,"translate"),ws(),uu(28,"\n "),ws(),uu(29,"\n"),ws(),uu(30,"\n")),2&t&&(_s("headline",e.data.title?El(1,13,e.data.title):El(2,15,"password.title"))("dialog",e.dialogRef)("disableDismiss",e.working),na(4),_s("ngIf",e.data.description),na(2),_s("ngClass",kl(21,kI,e.data.description))("formGroup",e.form),na(5),lu(El(12,17,"password.password-label")),na(3),_s("appFormFieldError",e.password1ErrorMsg),ds("disabled",e.working?"true":null),na(3),_s("ngIf",e.data.confirm),na(3),_s("ngIf",e.data.wallet),na(4),_s("disabled",!e.form.valid),na(2),cu("\n ",El(27,19,"password.proceed-button"),"\n "))},directives:[jS,Eh,Ch,rM,hS,Qk,iM,yS,ZE,KE,Cx],pipes:[pC],styles:[".link[_ngcontent-%COMP%]{width:100%;display:inline-block;text-align:center}"]}),t}(),SI=["button"],CI=function(){function t(t,e,n){this.data=t,this.dialogRef=e,this.msgBarService=n,this.inputErrorMsg=""}return t.openDialog=function(e,n){var i=new pk;return i.data=n,i.autoFocus=!0,i.width=Mm.mediumModalWidth,e.open(t,i)},t.prototype.ngOnInit=function(){this.form=new tS({}),this.form.addControl("quantity",new $M(1)),this.form.setValidators(this.validateForm.bind(this))},t.prototype.ngOnDestroy=function(){this.msgBarService.hide()},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.continue=function(){var t=this;this.button.isLoading()||(this.msgBarService.hide(),this.button.setLoading(),this.data(this.form.value.quantity,(function(e,n){void 0===n&&(n=!1),t.button.resetState(),n?t.msgBarService.showError("wallet.add-addresses.error"):e&&t.closePopup()})))},t.prototype.validateForm=function(){this.inputErrorMsg="";var t=!0,e=this.form.get("quantity").value;return(!e||e<1||e>100||e!==Math.round(e))&&(t=!1,this.form.get("quantity").touched&&(this.inputErrorMsg="wallet.add-addresses.quantity-error-info")),t?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(gs(kk),gs(bk),gs(Gx))},t.\u0275cmp=Fe({type:t,selectors:[["app-number-of-addresses"]],viewQuery:function(t,e){var n;1&t&&Zl(SI,!0),2&t&&Gl(n=tc())&&(e.button=n.first)},decls:28,vars:18,consts:[[3,"headline","dialog","disableDismiss"],[3,"formGroup"],[1,"form-field"],["for","quantity"],["formControlName","quantity","id","quantity","type","number","min","1","max","100",3,"appFormFieldError","keydown.enter","blur"],[1,"-buttons"],[3,"disabled","action"],[1,"primary-button",3,"disabled","action"],["button",""]],template:function(t,e){if(1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),bs(3,"div",1),uu(4,"\n "),bs(5,"div",2),uu(6,"\n "),bs(7,"label",3),uu(8),Tl(9,"translate"),ws(),uu(10,"\n "),bs(11,"input",4),Ts("keydown.enter",(function(){return e.continue()}))("blur",(function(){return e.validateForm()})),ws(),uu(12,"\n "),ws(),uu(13,"\n "),ws(),uu(14,"\n "),bs(15,"div",5),uu(16,"\n "),bs(17,"app-button",6),Ts("action",(function(){return e.closePopup()})),uu(18),Tl(19,"translate"),ws(),uu(20,"\n "),bs(21,"app-button",7,8),Ts("action",(function(){return e.continue()})),uu(23),Tl(24,"translate"),ws(),uu(25,"\n "),ws(),uu(26,"\n"),ws(),uu(27,"\n")),2&t){var n=ms(22);_s("headline",El(1,10,"wallet.add-addresses.title"))("dialog",e.dialogRef)("disableDismiss",n.isLoading()),na(3),_s("formGroup",e.form),na(5),lu(El(9,12,"wallet.add-addresses.quantity-label")),na(3),_s("appFormFieldError",e.inputErrorMsg),na(6),_s("disabled",n&&n.isLoading()),na(1),cu("\n ",El(19,14,"common.cancel-button"),"\n "),na(3),_s("disabled",!e.form.valid),na(2),cu("\n ",El(24,16,"common.create-button"),"\n ")}},directives:[jS,rM,hS,Qk,vM,iM,yS,KE,Cx],pipes:[pC],styles:[""]}),t}();function xI(t,e){if(1&t&&(ks(0,"app-hw-message",4),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,3,"hardware-wallet.confirm-address.instructions"))("lowerBigText",n.data.wallet.addresses[n.data.addressIndex].address)("icon",n.msgIcons.Confirm)}}function DI(t,e){if(1&t&&(ks(0,"app-hw-message",5),Tl(1,"translate")),2&t){var n=Ys();_s("text",El(1,2,n.result.text))("icon",n.result.icon)}}function LI(t,e){if(1&t){var n=xs();bs(0,"div",6),uu(1,"\n "),bs(2,"app-button",7,8),Ts("action",(function(){return Bn(n),Ys().closeModal()})),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()}2&t&&(na(4),cu("\n ",El(5,1,"common.close-button"),"\n "))}var TI=function(){return function(){}}(),EI=function(t){function e(e,n,i,r){var a=t.call(this,r,n)||this;return a.data=e,a.dialogRef=n,a.hardwareWalletService=i,a.operationSubscription=a.hardwareWalletService.confirmAddress(e.wallet,e.addressIndex).subscribe((function(){a.showResult({text:e.showCompleteConfirmation?"hardware-wallet.confirm-address.confirmation":"hardware-wallet.confirm-address.short-confirmation",icon:a.msgIcons.Success})}),(function(t){return a.processHwOperationError(t)})),a}return Wk(e,t),e.openDialog=function(t,n){var i=new pk;return i.width="566px",i.autoFocus=!1,i.data=n,t.open(e,i)},e.\u0275fac=function(t){return new(t||e)(gs(kk),gs(bk),gs(HO),gs(jk))},e.\u0275cmp=Fe({type:e,selectors:[["app-hw-confirm-address-dialog"]],features:[Jo],decls:13,vars:8,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","lowerBigText","icon",4,"ngIf"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","lowerBigText","icon"],[3,"text","icon"],[1,"-buttons"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ps(4,xI,2,5,"app-hw-message",1),uu(5,"\n\n "),uu(6,"\n "),ps(7,DI,2,4,"app-hw-message",2),uu(8,"\n\n "),uu(9,"\n "),ps(10,LI,7,3,"div",3),uu(11,"\n"),ws(),uu(12,"\n")),2&t&&(_s("headline",El(1,6,"hardware-wallet.confirm-address.title"))("dialog",e.dialogRef)("disableDismiss",e.currentState===e.states.Initial),na(4),_s("ngIf",e.currentState===e.states.Initial),na(3),_s("ngIf",e.currentState===e.states.ShowingResult),na(3),_s("ngIf",e.currentState!==e.states.Initial))},directives:[jS,Eh,qC,Cx],pipes:[pC],styles:[""]}),e}(Lx),OI=function(t){return t.new="new",t.scan="scan",t}({}),AI=function(){function t(t){this.dialogRef=t,this.addressOptions=OI}return t.openDialog=function(e){var n=new pk;return n.autoFocus=!1,n.width=Mm.mediumModalWidth,e.open(t,n)},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.select=function(t){this.dialogRef.close(t)},t.\u0275fac=function(e){return new(e||t)(gs(bk))},t.\u0275cmp=Fe({type:t,selectors:[["app-address-options"]],decls:35,vars:13,consts:[[3,"headline","dialog"],[1,"list-button-container","light-button-theme"],["mat-button","","color","primary",1,"top-line",3,"click"],[1,"content"],["src","assets/img/plus-green.png"],["mat-button","","color","primary",3,"click"],["src","assets/img/search-gold.png"],[1,"help-icon",3,"matTooltip"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),bs(3,"div",1),uu(4,"\n "),bs(5,"button",2),Ts("click",(function(){return e.select(e.addressOptions.new)})),uu(6,"\n "),bs(7,"div",3),uu(8,"\n "),ks(9,"img",4),uu(10,"\n "),bs(11,"span"),uu(12),Tl(13,"translate"),ws(),uu(14,"\n "),ws(),uu(15,"\n "),ws(),uu(16,"\n "),bs(17,"button",5),Ts("click",(function(){return e.select(e.addressOptions.scan)})),uu(18,"\n "),bs(19,"div",3),uu(20,"\n "),ks(21,"img",6),uu(22,"\n "),bs(23,"span"),uu(24),Tl(25,"translate"),bs(26,"mat-icon",7),Tl(27,"translate"),uu(28,"help"),ws(),uu(29,"\n "),ws(),uu(30,"\n "),ws(),uu(31,"\n "),ws(),uu(32,"\n "),ws(),uu(33,"\n"),ws(),uu(34,"\n")),2&t&&(_s("headline",El(1,5,"wallet.address-options.title"))("dialog",e.dialogRef),na(12),lu(El(13,7,"wallet.address-options.new")),na(12),cu("\n ",El(25,9,"wallet.address-options.scan"),"\n "),na(2),_s("matTooltip",El(27,11,"wallet.address-options.scan-help")))},directives:[jS,XC,vx,UE],pipes:[pC],styles:[".content[_ngcontent-%COMP%]{display:flex;align-items:center}.content[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:32px;width:32px;margin-right:5px}.content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}"]}),t}(),PI=n("wd/R"),II=function(){function t(t,e,n){this.walletsAndAddressesService=t,this.apiService=e,this.storageService=n}return t.prototype.getTransactionsHistory=function(t){var e,n=this,i=new Map;return(t?rp([t]):this.walletsAndAddressesService.allWallets).pipe(Ap(),st((function(t){var e=[];t.forEach((function(t){t.addresses.map((function(n){e.push(n),(!i.has(n.address)||i.get(n.address).addresses.length=Mm.maxHardwareWalletAddresses?AE.openDialog(this.dialog,{text:"wallet.max-hardware-wallets-error",headerText:"common.error",defaultButtons:OE.Close}):(this.msgBarService.hide(),this.wallet.isHardware?(this.howManyAddresses=1,this.continueNewAddress()):CI.openDialog(this.dialog,(function(e,n){t.howManyAddresses=e;var i=0;t.wallet.addresses.forEach((function(t,e){t.coins.isGreaterThan(0)&&(i=e)})),t.wallet.addresses.length-(i+1)+e<20?(n(!0),t.continueNewAddress()):t.txHistorySubscription=t.historyService.getTransactionsHistory(t.wallet).pipe(Ap()).subscribe((function(i){var r=new Map;i.forEach((function(t){t.outputs.forEach((function(t){r.has(t.address)||r.set(t.address,!0)}))}));var a=0;t.wallet.addresses.forEach((function(t,e){r.has(t.address)&&(a=e)})),t.wallet.addresses.length-(a+1)+e<20?(n(!0),t.continueNewAddress()):AE.openDialog(t.dialog,{text:"wallet.add-many-confirmation",defaultButtons:OE.YesNo}).afterClosed().subscribe((function(e){e?(n(!0),t.continueNewAddress()):n(!1)}))}),(function(){return n(!1,!0)}))}))))},t.prototype.toggleEmpty=function(){this.hideEmpty=!this.hideEmpty},t.prototype.deleteWallet=function(){var t=this;this.msgBarService.hide();var e={text:this.translateService.instant("wallet.delete-confirmation",{name:this.wallet.label}),checkboxText:"wallet.delete-confirmation-check",defaultButtons:OE.YesNo};AE.openDialog(this.dialog,e).afterClosed().subscribe((function(e){e&&(t.walletsAndAddressesService.deleteHardwareWallet(t.wallet.id),t.walletsAndAddressesService.allWallets.pipe(Ap()).subscribe((function(e){0===e.length&&setTimeout((function(){return t.router.navigate(["/wizard"])}),500)})))}))},t.prototype.toggleEncryption=function(){var t=this;MI.openDialog(this.dialog,{confirm:!this.wallet.encrypted,title:this.wallet.encrypted?"wallet.decrypt-button":"wallet.encrypt-button",description:this.wallet.encrypted?"wallet.decrypt-warning":"wallet.new.encrypt-warning",warning:this.wallet.encrypted,wallet:this.wallet.encrypted?this.wallet:null},!1).componentInstance.passwordSubmit.subscribe((function(e){t.softwareWalletService.toggleEncryption(t.wallet,e.password).subscribe((function(){e.close(),setTimeout((function(){return t.msgBarService.showDone("common.changes-made")}))}),(function(t){return e.error(t)}))}))},t.prototype.confirmAddress=function(t,e,n){var i=this;null===this.confirmingIndex&&(this.confirmingIndex=e,this.msgBarService.hide(),this.confirmSubscription&&this.confirmSubscription.unsubscribe(),this.confirmSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).subscribe((function(r){var a=new TI;a.wallet=t,a.addressIndex=e,a.showCompleteConfirmation=n,EI.openDialog(i.dialog,a),i.confirmingIndex=null}),(function(t){i.msgBarService.showError(t),i.confirmingIndex=null})))},t.prototype.copyAddress=function(t,e,n){void 0===n&&(n=500),t.stopPropagation(),e.copying||(bm(e.address),e.copying=!0,setTimeout((function(){e.copying=!1}),n))},t.prototype.scanAddresses=function(){var t=this;if(!this.workingWithAddresses)if(this.workingWithAddresses=!0,!this.wallet.isHardware&&this.wallet.encrypted){var e=MI.openDialog(this.dialog,{wallet:this.wallet});e.afterClosed().subscribe((function(){return t.workingWithAddresses=!1})),e.componentInstance.passwordSubmit.subscribe((function(e){t.walletsAndAddressesService.scanAddresses(t.wallet,e.password).subscribe((function(n){e.close(),setTimeout((function(){n?t.msgBarService.showDone("wallet.scan-addresses.done-with-new-addresses"):t.msgBarService.showWarning("wallet.scan-addresses.done-without-new-addresses")}))}),(function(t){e.error(t)}))}))}else this.walletsAndAddressesService.scanAddresses(this.wallet).subscribe((function(e){e?t.msgBarService.showDone("wallet.scan-addresses.done-with-new-addresses"):t.msgBarService.showWarning("wallet.scan-addresses.done-without-new-addresses"),t.workingWithAddresses=!1}),(function(e){t.msgBarService.showError(e),t.workingWithAddresses=!1}))},t.prototype.continueNewAddress=function(){var t=this;if(this.workingWithAddresses=!0,!this.wallet.isHardware&&this.wallet.encrypted){var e=MI.openDialog(this.dialog,{wallet:this.wallet});e.afterClosed().subscribe((function(){return t.workingWithAddresses=!1})),e.componentInstance.passwordSubmit.subscribe((function(e){t.walletsAndAddressesService.addAddressesToWallet(t.wallet,t.howManyAddresses,e.password).subscribe((function(){e.close(),setTimeout((function(){return t.msgBarService.showDone("common.changes-made")}))}),(function(t){return e.error(t)}))}))}else(this.wallet.isHardware?this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).pipe(st((function(){return t.walletsAndAddressesService.addAddressesToWallet(t.wallet,t.howManyAddresses)}))):this.walletsAndAddressesService.addAddressesToWallet(this.wallet,this.howManyAddresses)).subscribe((function(){t.workingWithAddresses=!1,t.msgBarService.showDone("common.changes-made")}),(function(e){t.msgBarService.showError(e),t.workingWithAddresses=!1}))},t.prototype.continueEditWallet=function(){var t=new UO;t.wallet=this.wallet,GO.openDialog(this.dialog,t,!1)},t.\u0275fac=function(e){return new(e||t)(gs(Dk),gs(Gx),gs(jk),gs(hC),gs(HT),gs(ym),gs(hD),gs(RO),gs(HO),gs(II))},t.\u0275cmp=Fe({type:t,selectors:[["app-wallet-detail"]],inputs:{wallet:"wallet"},decls:22,vars:13,consts:[[1,"-actions"],[4,"ngIf"],["class","-button btn-delete-wallet",3,"click",4,"ngIf"],[1,"flex-fill"],["class","-button",3,"click",4,"ngIf"],[1,"-button",3,"click"],[3,"ngClass"],[4,"ngFor","ngForOf"],[1,"-button","btn-delete-wallet",3,"click"],[1,"-img","-btn-delete"],["class","-record",4,"ngIf"],[1,"-record"],[1,"-width-50","grey-text"],[1,"-flex-fill","address-column"],[1,"-width-130","text-right"],[1,"-width-130","text-right","grey-text"],[1,"-width-85","options-column"],[3,"matMenuTriggerFor"],[3,"overlapTrigger"],["optionsMenu","matMenu"],["mat-menu-item","",3,"click",4,"ngIf"],["mat-menu-item","","routerLink","/settings/outputs",3,"queryParams"],["mat-menu-item","","routerLink","/transactions",3,"queryParams"],[3,"address"],[1,"click-to-copy",3,"ngClass","click","mouseleave"],[1,"copy-label"],[1,"click-to-copy",3,"click"],[1,"small-preview"],[1,"copy-label","unconfirmed-label"],["mat-menu-item","",3,"click"]],template:function(t,e){1&t&&(bs(0,"div",0),uu(1,"\n "),ps(2,JI,18,15,"ng-container",1),uu(3,"\n "),ps(4,QI,6,3,"div",2),uu(5,"\n "),ks(6,"div",3),uu(7,"\n "),ps(8,$I,6,7,"div",4),uu(9,"\n "),bs(10,"div",5),Ts("click",(function(){return e.editWallet()})),uu(11,"\n "),bs(12,"span",6),uu(13,"\n "),ps(14,tY,1,0,"mat-spinner",1),uu(15),Tl(16,"translate"),ws(),uu(17,"\n "),ws(),uu(18,"\n"),ws(),uu(19,"\n\n"),ps(20,cY,4,1,"ng-container",7),uu(21,"\n")),2&t&&(na(2),_s("ngIf",!e.wallet.isHardware),na(2),_s("ngIf",e.wallet.isHardware),na(4),_s("ngIf",!e.wallet.isHardware),na(4),_s("ngClass",Ml(9,dY,!e.preparingToEdit,e.preparingToEdit)),na(2),_s("ngIf",e.preparingToEdit),na(1),cu("\n ",El(16,7,"wallet.edit-button"),"\n "),na(5),_s("ngForOf",e.wallet?e.wallet.addresses:wl(12,hY)))},directives:[Eh,Ch,Lh,CC,vx,MP,yP,fP,jT,qI],pipes:[pC,DC],styles:['.-record[_ngcontent-%COMP%]{display:flex;font-size:13px;padding:21px 0 16px 20px;align-items:center;color:#1e2227}.-record[_ngcontent-%COMP%]:not(:last-of-type){border-bottom:1px solid rgba(30,34,39,.05)}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:flex;align-items:center}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] app-qr-code-button[_ngcontent-%COMP%]{margin-right:10px}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;word-break:break-all}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:hover .copy-label[_ngcontent-%COMP%]{opacity:.999!important}.-record[_ngcontent-%COMP%] .small-preview[_ngcontent-%COMP%]{max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:middle}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;flex-shrink:0;padding-right:20px!important}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{cursor:pointer;color:rgba(97,109,125,.5)}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{color:#0072ff}.-actions[_ngcontent-%COMP%]{background-color:#fafafa;display:flex;box-shadow:0 4px 10px rgba(0,0,0,.03)!important;z-index:100}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{padding-right:20px;padding-left:0}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:first-child{padding-left:5px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] .-disabled-span[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)!important;cursor:default;pointer-events:none}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5);font-size:12px;height:60px;margin:0 5px;cursor:pointer;display:flex;align-items:center}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-img[_ngcontent-%COMP%]:before{content:"";height:32px;width:32px;margin-right:5px;background-repeat:no-repeat;background-size:32px 32px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-address-options[_ngcontent-%COMP%]:before{background-image:url(/assets/img/list-grey.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-hide-empty[_ngcontent-%COMP%]:before{background-image:url(/assets/img/minus-grey.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-show-empty[_ngcontent-%COMP%]:before{background-image:url(/assets/img/plus-grey.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-enable-encryption[_ngcontent-%COMP%]:before{background-image:url(/assets/img/lock-grey.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-disable-encryption[_ngcontent-%COMP%]:before{background-image:url(/assets/img/unlock-grey.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-edit-wallet[_ngcontent-%COMP%]:before{background-image:url(/assets/img/edit-grey.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-btn-delete[_ngcontent-%COMP%]:before{background-image:url(/assets/img/delete-grey.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover{color:rgba(30,34,39,.5);opacity:.8}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-address-options:before{background-image:url(/assets/img/list-blue.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-hide-empty:before{background-image:url(/assets/img/minus-red.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-show-empty:before{background-image:url(/assets/img/plus-green.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-enable-encryption:before{background-image:url(/assets/img/lock-gold.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-disable-encryption:before{background-image:url(/assets/img/unlock-gold.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-edit-wallet:before{background-image:url(/assets/img/edit-blue.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-btn-delete:before{background-image:url(/assets/img/delete-red.png)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:active{opacity:1}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{margin-left:7px;margin-right:12px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%], .-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:18px!important;width:18px!important}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg circle{stroke:rgba(30,34,39,.2)}@-webkit-keyframes floatup{50%{opacity:1}to{transform:translateY(-20px);opacity:0}}@keyframes floatup{50%{opacity:1}to{transform:translateY(-20px);opacity:0}}.copy-label[_ngcontent-%COMP%]{color:#0072ff;opacity:0;font-size:12px;position:relative;padding-left:10px}.copy-label[_ngcontent-%COMP%]:after{content:attr(data-label);position:absolute;white-space:nowrap;top:0;left:4px;opacity:0;line-height:1}.unconfirmed-label[_ngcontent-%COMP%]{opacity:.5!important}.copying[_ngcontent-%COMP%] .copy-label[_ngcontent-%COMP%]:after{-webkit-animation:floatup .5s ease-in-out;animation:floatup .5s ease-in-out}.mat-menu-item[_ngcontent-%COMP%]{font-size:13px;height:35px;line-height:35px}.click-to-copy[_ngcontent-%COMP%]{cursor:pointer}.click-to-copy[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block;margin-left:7px!important;position:relative;top:2px}.click-to-copy[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%], .click-to-copy[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:12px!important;width:12px!important}.click-to-copy[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg circle{stroke:#0072ff}']}),t}(),pY=function(){function t(t){this.appService=t}return t.prototype.transform=function(t){return"hours"===t?this.appService.hoursName:"coin"===t?this.appService.coinName:"coinFull"===t?this.appService.fullCoinName:""},t.\u0275fac=function(e){return new(e||t)(gs(Sm))},t.\u0275pipe=Ue({name:"commonText",type:t,pure:!1}),t}();function mY(t,e){1&t&&(ks(0,"img",28),Tl(1,"translate")),2&t&&_s("matTooltip",El(1,1,"wallet.encryption-enabled"))}function gY(t,e){1&t&&(ks(0,"img",29),Tl(1,"translate")),2&t&&_s("matTooltip",El(1,1,"wallet.encryption-disabled"))}function vY(t,e){1&t&&(ks(0,"img",30),Tl(1,"translate")),2&t&&_s("matTooltip",El(1,1,"wallet.warning-hw-security"))}function _Y(t,e){1&t&&ks(0,"app-wallet-detail",31),2&t&&_s("wallet",Ys().$implicit)}var yY=function(t,e){return{"rotate-270":t,"rotate-90":e}};function bY(t,e){if(1&t){var n=xs();bs(0,"div",16),uu(1,"\n "),bs(2,"div",17),uu(3,"\n "),bs(4,"div",18),Ts("click",(function(){Bn(n);var t=e.$implicit;return Ys(3).toggleWallet(t)})),uu(5,"\n "),bs(6,"div",19),uu(7),ws(),uu(8,"\n "),bs(9,"div",20),uu(10,"\n "),ps(11,mY,2,3,"img",21),uu(12,"\n "),ps(13,gY,2,3,"img",22),uu(14,"\n "),ps(15,vY,2,3,"img",23),uu(16,"\n "),ws(),uu(17,"\n "),bs(18,"div",13),uu(19),Tl(20,"amount"),ws(),uu(21,"\n "),bs(22,"div",24),uu(23),Tl(24,"amount"),ws(),uu(25,"\n "),bs(26,"div",25),uu(27,"\n "),ks(28,"img",26),uu(29,"\n "),ws(),uu(30,"\n "),ws(),uu(31,"\n "),ps(32,_Y,1,1,"app-wallet-detail",27),uu(33,"\n "),ws(),uu(34,"\n "),ws()}if(2&t){var i=e.$implicit,r=Ys(3);na(6),ds("title",i.label),na(1),lu(i.label),na(4),_s("ngIf",i.encrypted&&!i.isHardware),na(2),_s("ngIf",!i.encrypted&&!i.isHardware),na(2),_s("ngIf",i.hasHwSecurityWarnings&&i.isHardware),na(4),lu(Al(20,9,i.coins?i.coins.toString():0,!0,"first")),na(4),lu(Al(24,13,i.hours?i.hours.toString():0,!1,"first")),na(5),_s("ngClass",Ml(17,yY,r.walletsOpenedState.get(i.id),!r.walletsOpenedState.get(i.id))),na(4),_s("ngIf",r.walletsOpenedState.get(i.id))}}function wY(t,e){if(1&t&&(Ms(0),uu(1,"\n "),bs(2,"div",10),uu(3,"\n "),bs(4,"div",11),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),ks(8,"div",12),uu(9,"\n "),bs(10,"div",13),uu(11),Tl(12,"commonText"),ws(),uu(13,"\n "),bs(14,"div",13),uu(15),Tl(16,"commonText"),ws(),uu(17,"\n "),ks(18,"div",14),uu(19,"\n "),ws(),uu(20,"\n\n "),ps(21,bY,35,20,"div",15),uu(22,"\n "),Ss()),2&t){var n=Ys().$implicit,i=Ys();na(5),lu(El(6,4,0===n?"wallet.hardware-wallet-table-label":"wallet.wallet-table-label")),na(6),lu(El(12,6,"coin")),na(4),lu(El(16,8,"hours")),na(6),_s("ngForOf",0===n?i.hardwareWallets:i.wallets)}}function kY(t,e){if(1&t&&(bs(0,"div",8),uu(1,"\n "),ps(2,wY,23,10,"ng-container",9),uu(3,"\n "),ws()),2&t){var n=e.$implicit,i=Ys();na(2),_s("ngIf",0===n&&i.hardwareWallets.length>0||1===n&&i.wallets.length>0)}}function MY(t,e){if(1&t){var n=xs();bs(0,"button",4),Ts("click",(function(){return Bn(n),Ys().adminHwWallet()})),uu(1,"\n "),ks(2,"img",32),uu(3),Tl(4,"translate"),ws()}2&t&&(na(3),cu(" ",El(4,1,"wallet.hardware-wallet-button"),"\n "))}var SY=function(){return[0,1]},CY=function(){function t(t,e,n,i,r){var a=this;this.hwWalletService=t,this.dialog=e,this.router=n,this.walletsAndAddressesService=i,this.balanceAndOutputsService=r,this.hwCompatibilityActivated=!1,this.wallets=[],this.hardwareWallets=[],this.walletsOpenedState=new Map,this.hwCompatibilityActivated=this.hwWalletService.hwWalletCompatibilityActivated,this.subscription=this.balanceAndOutputsService.walletsWithBalance.subscribe((function(t){a.wallets=[],a.hardwareWallets=[];var e=new Map;t.forEach((function(t){e.set(t.id,!0),t.isHardware?a.hardwareWallets.push(t):a.wallets.push(t),a.walletsOpenedState.has(t.id)||a.walletsOpenedState.set(t.id,!1)}));var n=[];a.walletsOpenedState.forEach((function(t,i){e.has(i)||n.push(i)})),n.forEach((function(t){a.walletsOpenedState.delete(t)}))}))}return t.prototype.ngOnInit=function(){var t=this;this.hwWalletService.showOptionsWhenPossible&&setTimeout((function(){t.hwWalletService.showOptionsWhenPossible=!1,t.adminHwWallet()}))},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.addWallet=function(t){LO.openDialog(this.dialog,{create:t})},t.prototype.adminHwWallet=function(){var t=this;eP.openDialog(this.dialog,!1).afterClosed().subscribe((function(){t.walletsAndAddressesService.allWallets.pipe(Ap()).subscribe((function(e){0===e.length&&setTimeout((function(){return t.router.navigate(["/wizard"])}),500)}))}))},t.prototype.toggleWallet=function(t){var e=this;if(t.isHardware&&t.hasHwSecurityWarnings&&!t.stopShowingHwSecurityPopup&&!this.walletsOpenedState.get(t.id)){var n={headerText:"hardware-wallet.security-warning.title",text:"hardware-wallet.security-warning.text",checkboxText:"common.generic-confirmation-check",defaultButtons:OE.ContinueCancel,linkText:"hardware-wallet.security-warning.link",linkFunction:this.adminHwWallet.bind(this)};AE.openDialog(this.dialog,n).afterClosed().subscribe((function(n){n&&(t.stopShowingHwSecurityPopup=!0,e.walletsAndAddressesService.informValuesUpdated(t),e.walletsOpenedState.set(t.id,!0))}))}else this.walletsOpenedState.set(t.id,!this.walletsOpenedState.get(t.id))},t.\u0275fac=function(e){return new(e||t)(gs(jk),gs(Dk),gs(HT),gs(hD),gs(MO))},t.\u0275cmp=Fe({type:t,selectors:[["app-wallets"]],decls:28,vars:12,consts:[[3,"headline"],[1,"container"],["class","-table",4,"ngFor","ngForOf"],[1,"action-buttons"],["mat-button","",3,"click"],["src","assets/img/plus-gold.png"],["src","assets/img/load-gold.png"],["mat-button","",3,"click",4,"ngIf"],[1,"-table"],[4,"ngIf"],[1,"-headers"],[1,"-width-250","text-truncate"],[1,"-flex-fill"],[1,"-width-130","text-right"],[1,"-width-85"],["class","e2e-wallets",4,"ngFor","ngForOf"],[1,"e2e-wallets"],[1,"-body"],[1,"-row",3,"click"],[1,"-width-250","text-truncate","e2e-label"],[1,"-flex-fill","-encryption","d-flex"],["src","assets/img/lock-gold.png",3,"matTooltip",4,"ngIf"],["src","assets/img/unlock-grey.png",3,"matTooltip",4,"ngIf"],["src","assets/img/alert-red.png",3,"matTooltip",4,"ngIf"],[1,"-width-130","text-right","grey-text"],[1,"-width-85","-expand"],["src","assets/img/chevron-right-grey.png",3,"ngClass"],[3,"wallet",4,"ngIf"],["src","assets/img/lock-gold.png",3,"matTooltip"],["src","assets/img/unlock-grey.png",3,"matTooltip"],["src","assets/img/alert-red.png",3,"matTooltip"],[3,"wallet"],["src","assets/img/hw-gold.png"]],template:function(t,e){1&t&&(bs(0,"div"),uu(1,"\n "),ks(2,"app-header",0),Tl(3,"translate"),uu(4,"\n\n "),bs(5,"div",1),uu(6,"\n "),ps(7,kY,4,1,"div",2),uu(8,"\n\n "),bs(9,"div",3),uu(10,"\n "),bs(11,"button",4),Ts("click",(function(){return e.addWallet(!0)})),uu(12,"\n "),ks(13,"img",5),uu(14),Tl(15,"translate"),ws(),uu(16,"\n "),bs(17,"button",4),Ts("click",(function(){return e.addWallet(!1)})),uu(18,"\n "),ks(19,"img",6),uu(20),Tl(21,"translate"),ws(),uu(22,"\n "),ps(23,MY,5,3,"button",7),uu(24,"\n "),ws(),uu(25,"\n "),ws(),uu(26,"\n"),ws(),uu(27,"\n")),2&t&&(na(2),_s("headline",El(3,5,"wallet.title-and-button")),na(5),_s("ngForOf",wl(11,SY)),na(7),cu(" ",El(15,7,"wallet.add-button"),"\n "),na(6),cu(" ",El(21,9,"wallet.load-button"),"\n "),na(3),_s("ngIf",e.hwCompatibilityActivated))},directives:[mI,Lh,XC,Eh,Ch,UE,fY],pipes:[pC,pY,DC],styles:[".-width-85[_ngcontent-%COMP%]{padding-right:20px!important}.-width-250[_ngcontent-%COMP%]{padding-left:20px!important}@media (max-width:991px){.-width-250[_ngcontent-%COMP%]{width:200px;flex-shrink:0}}.-headers[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0}.-body[_ngcontent-%COMP%]{margin-bottom:10px;color:#1e2227;background-color:transparent!important}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]{font-size:13px;line-height:60px;height:60px;background-color:#fafafa;cursor:pointer}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-hours[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);text-align:right}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{text-align:right}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%]{padding-left:20px!important}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{border-radius:50%;background-color:#f7f7f7;display:inline-block;height:38px;padding:3px;width:38px}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px;height:32px;opacity:.7}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]:hover{background-color:#f7f7f7}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]:hover .-expand[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{opacity:1}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]:hover .-encryption[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{background-color:#f4f4f4}.action-buttons[_ngcontent-%COMP%]{padding:40px 0;text-align:center}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:13px;margin:0 5px;min-width:140px}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:28px;margin-left:-4px;width:28px}.rotate-90[_ngcontent-%COMP%]{transform:rotate(90deg)}.rotate-270[_ngcontent-%COMP%]{transform:rotate(270deg)}"]}),t}(),xY=["okButton"],DY=function(t){return t.Loading="Loading",t.ErrorLoading="ErrorLoading",t.ShowingForm="ShowingForm",t}({}),LY=function(){function t(t){this.working=!1,this.currentState=DY.Loading,this.states=DY,this.validateForm=!1,this.title="",this.text="",this.dropdownLabel="",this.defaultDropdownText="",this.inputLabel="",this.contents="",this.cancelButtonText="",this.okButtonText="",this.dropdownErrorMsg="",this.inputErrorMsg="",this.form=t.group({dropdown:[""],input:[""]}),this.form.setValidators(this.validate.bind(this))}return t.prototype.validate=function(){this.dropdownErrorMsg="",this.inputErrorMsg="";var t=!0;this.form.get("dropdown").value||(t=!1,this.form.get("dropdown").touched&&(this.dropdownErrorMsg="offline-transactions.wallet-error-info"));var e=this.form.get("input").value;return(!e||e.length<300||!/^[0-9a-fA-F]+$/.test(e))&&(t=!1,this.form.get("input").touched&&(this.inputErrorMsg="offline-transactions.tx-error-info")),t?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(gs(YS))},t.\u0275cmp=Fe({type:t,selectors:[["ng-component"]],viewQuery:function(t,e){var n;1&t&&Zl(xY,!0),2&t&&Gl(n=tc())&&(e.okButton=n.first)},decls:0,vars:0,template:function(t,e){},encapsulation:2}),t}();function TY(t,e){1&t&&(bs(0,"div"),uu(1,"\n "),ks(2,"mat-spinner",2),uu(3,"\n "),bs(4,"p"),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),ws()),2&t&&(na(2),_s("diameter",40),na(3),lu(El(6,2,"common.loading")))}function EY(t,e){if(1&t&&(bs(0,"div"),uu(1,"\n "),bs(2,"i",3),uu(3,"announcement"),ws(),uu(4,"\n "),bs(5,"p"),uu(6),Tl(7,"translate"),ws(),uu(8,"\n "),ws()),2&t){var n=Ys();na(6),lu(El(7,1,n.noDataText))}}var OY=function(){function t(){this.isLoading=!0}return t.\u0275fac=function(e){return new(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["app-loading-content"]],inputs:{isLoading:"isLoading",noDataText:"noDataText"},decls:7,vars:2,consts:[[1,"-content"],[4,"ngIf"],[3,"diameter"],[1,"material-icons"]],template:function(t,e){1&t&&(bs(0,"div",0),uu(1,"\n "),ps(2,TY,8,4,"div",1),uu(3,"\n "),ps(4,EY,9,3,"div",1),uu(5,"\n"),ws(),uu(6,"\n")),2&t&&(na(2),_s("ngIf",e.isLoading),na(2),_s("ngIf",!e.isLoading))},directives:[Eh,CC],pipes:[pC],styles:[".-content[_ngcontent-%COMP%]{text-align:center;margin:50px 0;font-size:13px;opacity:.5}.-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:15px}.-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:40px;opacity:.5}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block;opacity:.5}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.5)}"]}),t}();function AY(t,e){if(1&t&&ks(0,"app-loading-content",3),2&t){var n=Ys();_s("isLoading",n.currentState===n.states.Loading)("noDataText","offline-transactions.loading-problem")}}function PY(t,e){if(1&t&&(bs(0,"label",19),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(3);na(1),lu(El(2,1,n.dropdownLabel))}}function IY(t,e){if(1&t&&(bs(0,"option",20),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(3);_s("ngValue",""),na(1),lu(El(2,2,n.defaultDropdownText))}}function YY(t,e){if(1&t&&(Ms(0),uu(1,"\n "),bs(2,"option",22),uu(3),ws(),uu(4,"\n "),Ss()),2&t){var n=e.$implicit;na(2),_s("ngValue",n.value),na(1),cu("\n ",n.name,"\n ")}}function RY(t,e){if(1&t&&(Ms(0),uu(1,"\n "),ps(2,YY,5,2,"ng-container",21),uu(3,"\n "),Ss()),2&t){var n=Ys(3);na(2),_s("ngForOf",n.dropdownElements)}}function FY(t,e){if(1&t){var n=xs();bs(0,"div",6),uu(1,"\n "),ps(2,PY,3,3,"label",15),uu(3,"\n "),bs(4,"div",16),uu(5,"\n "),bs(6,"select",17),Ts("blur",(function(){return Bn(n),Ys(2).validate()})),uu(7,"\n "),ps(8,IY,3,4,"option",18),uu(9,"\n "),ps(10,RY,4,1,"ng-container",2),uu(11,"\n "),ws(),uu(12,"\n "),ws(),uu(13,"\n "),ws()}if(2&t){var i=Ys(2);na(2),_s("ngIf",i.dropdownLabel),na(4),_s("appFormFieldError",i.dropdownErrorMsg),ds("disabled",i.working?"true":null),na(2),_s("ngIf",i.defaultDropdownText),na(2),_s("ngIf",i.dropdownElements)}}function HY(t,e){if(1&t&&(bs(0,"label",23),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(2);na(1),lu(El(2,1,n.inputLabel))}}function BY(t,e){if(1&t&&(bs(0,"textarea",24),uu(1),ws()),2&t){var n=Ys(2);_s("readonly",!0),na(1),lu(n.contents)}}function jY(t,e){if(1&t){var n=xs();bs(0,"textarea",25),Ts("blur",(function(){return Bn(n),Ys(2).validate()})),ws()}if(2&t){var i=Ys(2);_s("appFormFieldError",i.inputErrorMsg),ds("disabled",i.working?"true":null)}}function NY(t,e){if(1&t){var n=xs();Ms(0),uu(1,"\n "),uu(2),Tl(3,"translate"),bs(4,"div",4),uu(5,"\n "),uu(6,"\n "),ps(7,FY,14,5,"div",5),uu(8,"\n "),uu(9,"\n "),bs(10,"div",6),uu(11,"\n "),ps(12,HY,3,3,"label",7),uu(13,"\n "),ps(14,BY,2,2,"textarea",8),uu(15,"\n "),ps(16,jY,1,2,"textarea",9),uu(17,"\n "),ws(),uu(18,"\n "),ws(),uu(19,"\n "),uu(20,"\n "),bs(21,"div",10),uu(22,"\n "),bs(23,"app-button",11,12),Ts("action",(function(){return Bn(n),Ys().cancelPressed()})),uu(25),Tl(26,"translate"),ws(),uu(27,"\n "),bs(28,"app-button",13,14),Ts("action",(function(){return Bn(n),Ys().okPressed()})),uu(30),Tl(31,"translate"),ws(),uu(32,"\n "),ws(),uu(33,"\n "),Ss()}if(2&t){var i=Ys();na(2),cu("\n ",El(3,10,i.text),"\n "),na(2),_s("formGroup",i.form),na(3),_s("ngIf",i.dropdownElements),na(5),_s("ngIf",i.inputLabel),na(2),_s("ngIf",!!i.contents),na(2),_s("ngIf",!i.contents),na(7),_s("disabled",i.working),na(2),cu("\n ",El(26,12,i.cancelButtonText),"\n "),na(3),_s("disabled",i.validateForm&&!i.form.valid||i.working),na(2),cu("\n ",El(31,14,i.okButtonText),"\n ")}}var WY=function(t){function e(e,n,i,r){var a=t.call(this,r)||this;return a.data=e,a.dialogRef=n,a.msgBarService=i,a.cancelButtonText="common.close-button",a.okButtonText="offline-transactions.copy-tx.copy-button",a.inputLabel="offline-transactions.copy-tx.input-label",a.title="offline-transactions.copy-tx."+(e.isUnsigned?"unsigned":"signed")+"-title",a.text="offline-transactions.copy-tx.text-"+(e.isUnsigned?"unsigned":"signed"),a.contents=e.rawTx,a.currentState=DY.ShowingForm,a}return Wk(e,t),e.openDialog=function(t,n){var i=new pk;return i.data=n,i.autoFocus=!0,i.width=Mm.mediumModalWidth,t.open(e,i)},e.prototype.ngOnInit=function(){var t=this;setTimeout((function(){t.okButton.focus()}))},e.prototype.cancelPressed=function(){this.dialogRef.close()},e.prototype.okPressed=function(){bm(this.data.rawTx),this.msgBarService.showDone("common.copied",4e3)},e.\u0275fac=function(t){return new(t||e)(gs(kk),gs(bk),gs(Gx),gs(YS))},e.\u0275cmp=Fe({type:e,selectors:[["app-copy-raw-tx"]],features:[Jo],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[3,"isLoading","noDataText",4,"ngIf"],[4,"ngIf"],[3,"isLoading","noDataText"],[1,"modal-form-container",3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","input",4,"ngIf"],["rows","5",3,"readonly",4,"ngIf"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur",4,"ngIf"],[1,"-buttons"],[3,"disabled","action"],["cancelButton",""],[1,"primary-button",3,"disabled","action"],["okButton",""],["for","dropdown",4,"ngIf"],[1,"-select"],["formControlName","dropdown","id","dropdown",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue",4,"ngIf"],["for","dropdown"],["disabled","","hidden","",3,"ngValue"],[4,"ngFor","ngForOf"],[3,"ngValue"],["for","input"],["rows","5",3,"readonly"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ps(4,AY,1,2,"app-loading-content",1),uu(5,"\n\n "),ps(6,NY,34,16,"ng-container",2),uu(7,"\n"),ws(),uu(8,"\n")),2&t&&(_s("headline",El(1,5,e.title))("dialog",e.dialogRef)("disableDismiss",e.working),na(4),_s("ngIf",e.currentState===e.states.Loading||e.currentState===e.states.ErrorLoading),na(2),_s("ngIf",e.currentState===e.states.ShowingForm))},directives:[jS,Eh,OY,rM,hS,Cx,CM,iM,yS,KE,xM,EM,Lh,Qk],pipes:[pC],styles:[""]}),e}(LY),VY=n("I2Jj"),zY=function(){function t(){}return t.encode=function(t,e,n,i,r){var a=this;if(void 0===r&&(r=0),t.length!==n.length)throw new Error("Invalid number of signatures.");var o=this.encodeSizeTransaction(t,e,n).toNumber(),s=new ArrayBuffer(o),u=new DataView(s),l=0;if(u.setUint32(l,o,!0),u.setUint8(l+=4,r),l+=1,this.convertToBytes(i).forEach((function(t){u.setUint8(l,t),l+=1})),n.length>65535)throw new Error("Too many signatures.");if(u.setUint32(l,n.length,!0),l+=4,n.forEach((function(t){a.convertToBytes(t).forEach((function(t){u.setUint8(l,t),l+=1}))})),t.length>65535)throw new Error("Too many inputs.");if(u.setUint32(l,t.length,!0),l+=4,t.forEach((function(t){a.convertToBytes(t.hash).forEach((function(t){u.setUint8(l,t),l+=1}))})),e.length>65535)throw new Error("Too many outputs.");u.setUint32(l,e.length,!0),l+=4;var c=VY("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");return e.forEach((function(t){var e=c.decode(t.address);u.setUint8(l,e[20]),l+=1;for(var n=0;n<20;n++)u.setUint8(l,e[n]),l+=1;l=a.setUint64(u,l,new fp.a(t.coins).multipliedBy(1e6).decimalPlaces(0)),l=a.setUint64(u,l,new fp.a(t.hours))})),this.convertToHex(s)},t.encodeSizeTransaction=function(t,e,n){var i=new fp.a(0);return(i=(i=(i=(i=(i=(i=(i=(i=i.plus(4)).plus(1)).plus(32)).plus(4)).plus(new fp.a(65).multipliedBy(n.length))).plus(4)).plus(new fp.a(32).multipliedBy(t.length))).plus(4)).plus(new fp.a(37).multipliedBy(e.length))},t.setUint64=function(t,e,n){var i=n.toString(16);i.length%2!=0&&(i="0"+i);for(var r=this.convertToBytes(i),a=r.length-1;a>=0;a--)t.setUint8(e,r[a]),e+=1;for(a=0;a<8-r.length;a++)t.setUint8(e,0),e+=1;return e},t.convertToBytes=function(t){if(t.length%2!=0)throw new Error("Invalid hex string.");for(var e=[],n=0;n8)throw new Error(u.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"));if(n.transaction.outputs.length>8)throw new Error(u.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"))}var r=new hp.BigNumber(0);i.map((function(t){return r=r.plus(t.coins)}));var a=new hp.BigNumber(0);return n.transaction.outputs.filter((function(t){return i.map((function(t){return t.address})).find((function(e){return e===t.address}))})).map((function(t){return a=a.plus(new hp.BigNumber(t.hours))})),{inputs:n.transaction.inputs.map((function(t){return{hash:t.uxid,address:t.address,coins:new hp.BigNumber(t.coins),hours:new hp.BigNumber(t.calculated_hours)}})),outputs:n.transaction.outputs.map((function(t){return{hash:t.uxid,address:t.address,coins:new hp.BigNumber(t.coins),hours:new hp.BigNumber(t.hours)}})),coinsToSend:r,hoursToSend:a,hoursBurned:new hp.BigNumber(n.transaction.fee),from:l,to:i.map((function(t){return t.address})).join(", "),wallet:t,encoded:n.encoded_transaction,innerHash:n.transaction.inner_hash}})));return t&&t.isHardware&&!s&&(f=f.pipe(st((function(e){return h=e,u.signTransaction(t,null,e)}))).pipe(nt((function(t){return h.encoded=t,h})))),f},t.prototype.signTransaction=function(t,e,n,i){if(void 0===i&&(i=""),t.isHardware){if(i)throw new Error("Raw transactions not allowed.");var r=[],a=[],o=new Map;if(t.addresses.forEach((function(t,e){return o.set(t.address,e)})),n.outputs.forEach((function(t){r.push({address:t.address,coins:new hp.BigNumber(t.coins).toString(),hours:new hp.BigNumber(t.hours).toFixed(0)})})),n.inputs.forEach((function(t){a.push({hash:t.hash,index:o.get(t.address)})})),r.length>1)for(var s=r.length-1;s>=0;s--)if(r[s].address===t.addresses[0].address){r[s].address_index=0;break}return this.hwWalletService.signTransaction(a,r).pipe(nt((function(t){return zY.encode(a,r,t.rawResponse,n.innerHash)})))}return this.apiService.post("wallet/transaction/sign",{wallet_id:t.id,password:e,encoded_transaction:i||n.encoded},{useV2:!0}).pipe(nt((function(t){return t.data.encoded_transaction})))},t.prototype.injectTransaction=function(t,e){var n=this;return this.apiService.post("injectTransaction",{rawtx:t},{sendDataAsJson:!0}).pipe(st((function(t){return setTimeout((function(){return n.balanceAndOutputsService.refreshBalance()}),32),e?n.storageService.store(Yx.NOTES,t,e).pipe(Kf((function(t){return ig(t.pipe(up(1e3),kp(3)),ap(-1))})),pp((function(t){return-1===t?rp(-1):t})),nt((function(t){return-1!==t}))):rp(!1)})))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(MO),ve(ym),ve(jk),ve(hC),ve(Rx))}}),t}();function GY(t,e){if(1&t&&ks(0,"app-loading-content",3),2&t){var n=Ys();_s("isLoading",n.currentState===n.states.Loading)("noDataText","offline-transactions.loading-problem")}}function KY(t,e){if(1&t&&(bs(0,"label",19),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(3);na(1),lu(El(2,1,n.dropdownLabel))}}function ZY(t,e){if(1&t&&(bs(0,"option",20),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(3);_s("ngValue",""),na(1),lu(El(2,2,n.defaultDropdownText))}}function JY(t,e){if(1&t&&(Ms(0),uu(1,"\n "),bs(2,"option",22),uu(3),ws(),uu(4,"\n "),Ss()),2&t){var n=e.$implicit;na(2),_s("ngValue",n.value),na(1),cu("\n ",n.name,"\n ")}}function QY(t,e){if(1&t&&(Ms(0),uu(1,"\n "),ps(2,JY,5,2,"ng-container",21),uu(3,"\n "),Ss()),2&t){var n=Ys(3);na(2),_s("ngForOf",n.dropdownElements)}}function XY(t,e){if(1&t){var n=xs();bs(0,"div",6),uu(1,"\n "),ps(2,KY,3,3,"label",15),uu(3,"\n "),bs(4,"div",16),uu(5,"\n "),bs(6,"select",17),Ts("blur",(function(){return Bn(n),Ys(2).validate()})),uu(7,"\n "),ps(8,ZY,3,4,"option",18),uu(9,"\n "),ps(10,QY,4,1,"ng-container",2),uu(11,"\n "),ws(),uu(12,"\n "),ws(),uu(13,"\n "),ws()}if(2&t){var i=Ys(2);na(2),_s("ngIf",i.dropdownLabel),na(4),_s("appFormFieldError",i.dropdownErrorMsg),ds("disabled",i.working?"true":null),na(2),_s("ngIf",i.defaultDropdownText),na(2),_s("ngIf",i.dropdownElements)}}function $Y(t,e){if(1&t&&(bs(0,"label",23),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(2);na(1),lu(El(2,1,n.inputLabel))}}function tR(t,e){if(1&t&&(bs(0,"textarea",24),uu(1),ws()),2&t){var n=Ys(2);_s("readonly",!0),na(1),lu(n.contents)}}function eR(t,e){if(1&t){var n=xs();bs(0,"textarea",25),Ts("blur",(function(){return Bn(n),Ys(2).validate()})),ws()}if(2&t){var i=Ys(2);_s("appFormFieldError",i.inputErrorMsg),ds("disabled",i.working?"true":null)}}function nR(t,e){if(1&t){var n=xs();Ms(0),uu(1,"\n "),uu(2),Tl(3,"translate"),bs(4,"div",4),uu(5,"\n "),uu(6,"\n "),ps(7,XY,14,5,"div",5),uu(8,"\n "),uu(9,"\n "),bs(10,"div",6),uu(11,"\n "),ps(12,$Y,3,3,"label",7),uu(13,"\n "),ps(14,tR,2,2,"textarea",8),uu(15,"\n "),ps(16,eR,1,2,"textarea",9),uu(17,"\n "),ws(),uu(18,"\n "),ws(),uu(19,"\n "),uu(20,"\n "),bs(21,"div",10),uu(22,"\n "),bs(23,"app-button",11,12),Ts("action",(function(){return Bn(n),Ys().cancelPressed()})),uu(25),Tl(26,"translate"),ws(),uu(27,"\n "),bs(28,"app-button",13,14),Ts("action",(function(){return Bn(n),Ys().okPressed()})),uu(30),Tl(31,"translate"),ws(),uu(32,"\n "),ws(),uu(33,"\n "),Ss()}if(2&t){var i=Ys();na(2),cu("\n ",El(3,10,i.text),"\n "),na(2),_s("formGroup",i.form),na(3),_s("ngIf",i.dropdownElements),na(5),_s("ngIf",i.inputLabel),na(2),_s("ngIf",!!i.contents),na(2),_s("ngIf",!i.contents),na(7),_s("disabled",i.working),na(2),cu("\n ",El(26,12,i.cancelButtonText),"\n "),na(3),_s("disabled",i.validateForm&&!i.form.valid||i.working),na(2),cu("\n ",El(31,14,i.okButtonText),"\n ")}}var iR=function(t){function e(e,n,i,r,a,o){var s=t.call(this,o)||this;return s.dialogRef=e,s.msgBarService=n,s.dialog=i,s.spendingService=r,s.walletsAndAddressesService=a,s.title="offline-transactions.sign-tx.title",s.text="offline-transactions.sign-tx.text",s.dropdownLabel="offline-transactions.sign-tx.wallet-label",s.defaultDropdownText="offline-transactions.sign-tx.select-wallet",s.inputLabel="offline-transactions.sign-tx.input-label",s.cancelButtonText="common.cancel-button",s.okButtonText="offline-transactions.sign-tx.sign-button",s.validateForm=!0,s.currentState=DY.Loading,s}return Wk(e,t),e.openDialog=function(t){var n=new pk;return n.autoFocus=!0,n.width=Mm.mediumModalWidth,t.open(e,n)},e.prototype.ngOnInit=function(){var t=this;this.walletsSubscription=this.walletsAndAddressesService.allWallets.pipe(Ap()).subscribe((function(e){e?(t.dropdownElements=[],e.forEach((function(e){e.isHardware||t.dropdownElements.push({name:e.label,value:e})})),t.currentState=DY.ShowingForm,setTimeout((function(){try{1===e.length&&t.form.get("dropdown").setValue(e[0])}catch(n){}}))):t.currentState=DY.ErrorLoading}),(function(){return t.currentState=DY.ErrorLoading}))},e.prototype.ngOnDestroy=function(){this.walletsSubscription.unsubscribe(),this.closeOperationSubscription(),this.msgBarService.hide()},e.prototype.cancelPressed=function(){this.dialogRef.close()},e.prototype.okPressed=function(){var t=this;this.working||(this.msgBarService.hide(),this.form.get("dropdown").value.encrypted?MI.openDialog(this.dialog,{wallet:this.form.get("dropdown").value}).componentInstance.passwordSubmit.subscribe((function(e){e.close(),t.signTransaction(e.password)})):this.signTransaction(null))},e.prototype.signTransaction=function(t){var e=this;this.working=!0,this.okButton.setLoading(),this.closeOperationSubscription(),this.operationSubscription=this.spendingService.signTransaction(this.form.get("dropdown").value,t,null,this.form.get("input").value).subscribe((function(t){e.cancelPressed(),setTimeout((function(){return e.msgBarService.showDone("offline-transactions.sign-tx.signed")})),setTimeout((function(){WY.openDialog(e.dialog,{rawTx:t,isUnsigned:!1})}),500)}),(function(t){e.working=!1,e.okButton.resetState(),e.msgBarService.showError(t)}))},e.prototype.closeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(gs(bk),gs(Gx),gs(Dk),gs(qY),gs(hD),gs(YS))},e.\u0275cmp=Fe({type:e,selectors:[["app-sign-raw-tx"]],features:[Jo],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[3,"isLoading","noDataText",4,"ngIf"],[4,"ngIf"],[3,"isLoading","noDataText"],[1,"modal-form-container",3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","input",4,"ngIf"],["rows","5",3,"readonly",4,"ngIf"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur",4,"ngIf"],[1,"-buttons"],[3,"disabled","action"],["cancelButton",""],[1,"primary-button",3,"disabled","action"],["okButton",""],["for","dropdown",4,"ngIf"],[1,"-select"],["formControlName","dropdown","id","dropdown",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue",4,"ngIf"],["for","dropdown"],["disabled","","hidden","",3,"ngValue"],[4,"ngFor","ngForOf"],[3,"ngValue"],["for","input"],["rows","5",3,"readonly"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ps(4,GY,1,2,"app-loading-content",1),uu(5,"\n\n "),ps(6,nR,34,16,"ng-container",2),uu(7,"\n"),ws(),uu(8,"\n")),2&t&&(_s("headline",El(1,5,e.title))("dialog",e.dialogRef)("disableDismiss",e.working),na(4),_s("ngIf",e.currentState===e.states.Loading||e.currentState===e.states.ErrorLoading),na(2),_s("ngIf",e.currentState===e.states.ShowingForm))},directives:[jS,Eh,OY,rM,hS,Cx,CM,iM,yS,KE,xM,EM,Lh,Qk],pipes:[pC],styles:[""]}),e}(LY);function rR(t,e){if(1&t&&ks(0,"app-loading-content",3),2&t){var n=Ys();_s("isLoading",n.currentState===n.states.Loading)("noDataText","offline-transactions.loading-problem")}}function aR(t,e){if(1&t&&(bs(0,"label",19),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(3);na(1),lu(El(2,1,n.dropdownLabel))}}function oR(t,e){if(1&t&&(bs(0,"option",20),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(3);_s("ngValue",""),na(1),lu(El(2,2,n.defaultDropdownText))}}function sR(t,e){if(1&t&&(Ms(0),uu(1,"\n "),bs(2,"option",22),uu(3),ws(),uu(4,"\n "),Ss()),2&t){var n=e.$implicit;na(2),_s("ngValue",n.value),na(1),cu("\n ",n.name,"\n ")}}function uR(t,e){if(1&t&&(Ms(0),uu(1,"\n "),ps(2,sR,5,2,"ng-container",21),uu(3,"\n "),Ss()),2&t){var n=Ys(3);na(2),_s("ngForOf",n.dropdownElements)}}function lR(t,e){if(1&t){var n=xs();bs(0,"div",6),uu(1,"\n "),ps(2,aR,3,3,"label",15),uu(3,"\n "),bs(4,"div",16),uu(5,"\n "),bs(6,"select",17),Ts("blur",(function(){return Bn(n),Ys(2).validate()})),uu(7,"\n "),ps(8,oR,3,4,"option",18),uu(9,"\n "),ps(10,uR,4,1,"ng-container",2),uu(11,"\n "),ws(),uu(12,"\n "),ws(),uu(13,"\n "),ws()}if(2&t){var i=Ys(2);na(2),_s("ngIf",i.dropdownLabel),na(4),_s("appFormFieldError",i.dropdownErrorMsg),ds("disabled",i.working?"true":null),na(2),_s("ngIf",i.defaultDropdownText),na(2),_s("ngIf",i.dropdownElements)}}function cR(t,e){if(1&t&&(bs(0,"label",23),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(2);na(1),lu(El(2,1,n.inputLabel))}}function dR(t,e){if(1&t&&(bs(0,"textarea",24),uu(1),ws()),2&t){var n=Ys(2);_s("readonly",!0),na(1),lu(n.contents)}}function hR(t,e){if(1&t){var n=xs();bs(0,"textarea",25),Ts("blur",(function(){return Bn(n),Ys(2).validate()})),ws()}if(2&t){var i=Ys(2);_s("appFormFieldError",i.inputErrorMsg),ds("disabled",i.working?"true":null)}}function fR(t,e){if(1&t){var n=xs();Ms(0),uu(1,"\n "),uu(2),Tl(3,"translate"),bs(4,"div",4),uu(5,"\n "),uu(6,"\n "),ps(7,lR,14,5,"div",5),uu(8,"\n "),uu(9,"\n "),bs(10,"div",6),uu(11,"\n "),ps(12,cR,3,3,"label",7),uu(13,"\n "),ps(14,dR,2,2,"textarea",8),uu(15,"\n "),ps(16,hR,1,2,"textarea",9),uu(17,"\n "),ws(),uu(18,"\n "),ws(),uu(19,"\n "),uu(20,"\n "),bs(21,"div",10),uu(22,"\n "),bs(23,"app-button",11,12),Ts("action",(function(){return Bn(n),Ys().cancelPressed()})),uu(25),Tl(26,"translate"),ws(),uu(27,"\n "),bs(28,"app-button",13,14),Ts("action",(function(){return Bn(n),Ys().okPressed()})),uu(30),Tl(31,"translate"),ws(),uu(32,"\n "),ws(),uu(33,"\n "),Ss()}if(2&t){var i=Ys();na(2),cu("\n ",El(3,10,i.text),"\n "),na(2),_s("formGroup",i.form),na(3),_s("ngIf",i.dropdownElements),na(5),_s("ngIf",i.inputLabel),na(2),_s("ngIf",!!i.contents),na(2),_s("ngIf",!i.contents),na(7),_s("disabled",i.working),na(2),cu("\n ",El(26,12,i.cancelButtonText),"\n "),na(3),_s("disabled",i.validateForm&&!i.form.valid||i.working),na(2),cu("\n ",El(31,14,i.okButtonText),"\n ")}}var pR=function(t){function e(e,n,i,r,a){var o=t.call(this,a)||this;return o.dialogRef=e,o.msgBarService=n,o.balanceAndOutputsService=i,o.spendingService=r,o.title="offline-transactions.broadcast-tx.title",o.text="offline-transactions.broadcast-tx.text",o.inputLabel="offline-transactions.broadcast-tx.input-label",o.cancelButtonText="common.cancel-button",o.okButtonText="offline-transactions.broadcast-tx.send-button",o.validateForm=!0,o.currentState=DY.ShowingForm,o}return Wk(e,t),e.openDialog=function(t){var n=new pk;return n.autoFocus=!0,n.width=Mm.mediumModalWidth,t.open(e,n)},e.prototype.ngOnInit=function(){this.form.get("dropdown").setValue("dummy")},e.prototype.ngOnDestroy=function(){this.closeOperationSubscription()},e.prototype.cancelPressed=function(){this.dialogRef.close()},e.prototype.okPressed=function(){var t=this;this.working||(this.msgBarService.hide(),this.working=!0,this.okButton.setLoading(),this.closeOperationSubscription(),this.operationSubscription=this.spendingService.injectTransaction(this.form.get("input").value,null).subscribe((function(){t.balanceAndOutputsService.refreshBalance(),t.msgBarService.showDone("offline-transactions.broadcast-tx.sent"),t.cancelPressed()}),(function(e){t.working=!1,t.okButton.resetState(),t.msgBarService.showError(e)})))},e.prototype.closeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(gs(bk),gs(Gx),gs(MO),gs(qY),gs(YS))},e.\u0275cmp=Fe({type:e,selectors:[["app-broadcast-raw-tx"]],features:[Jo],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[3,"isLoading","noDataText",4,"ngIf"],[4,"ngIf"],[3,"isLoading","noDataText"],[1,"modal-form-container",3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","input",4,"ngIf"],["rows","5",3,"readonly",4,"ngIf"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur",4,"ngIf"],[1,"-buttons"],[3,"disabled","action"],["cancelButton",""],[1,"primary-button",3,"disabled","action"],["okButton",""],["for","dropdown",4,"ngIf"],[1,"-select"],["formControlName","dropdown","id","dropdown",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue",4,"ngIf"],["for","dropdown"],["disabled","","hidden","",3,"ngValue"],[4,"ngFor","ngForOf"],[3,"ngValue"],["for","input"],["rows","5",3,"readonly"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),ps(4,rR,1,2,"app-loading-content",1),uu(5,"\n\n "),ps(6,fR,34,16,"ng-container",2),uu(7,"\n"),ws(),uu(8,"\n")),2&t&&(_s("headline",El(1,5,e.title))("dialog",e.dialogRef)("disableDismiss",e.working),na(4),_s("ngIf",e.currentState===e.states.Loading||e.currentState===e.states.ErrorLoading),na(2),_s("ngIf",e.currentState===e.states.ShowingForm))},directives:[jS,Eh,OY,rM,hS,Cx,CM,iM,yS,KE,xM,EM,Lh,Qk],pipes:[pC],styles:[""]}),e}(LY);function mR(t,e){if(1&t){var n=xs();Ms(0),uu(1,"\n "),bs(2,"button",6),Ts("click",(function(){Bn(n);var t=e.$implicit;return Ys(3).select(t.address)})),uu(3,"\n "),bs(4,"div",7),uu(5),ws(),uu(6,"\n "),bs(7,"div",8),uu(8),Tl(9,"amount"),bs(10,"span",9),uu(11),Tl(12,"amount"),ws(),uu(13),Tl(14,"amount"),bs(15,"span",9),uu(16),Tl(17,"amount"),ws(),uu(18,"\n "),ws(),uu(19,"\n "),ws(),uu(20,"\n "),Ss()}if(2&t){var i=e.$implicit;na(5),lu(i.address),na(3),cu("",Al(9,5,i.coins.toString(),!0,"first"),"\n "),na(3),cu("",Al(12,9,i.coins.toString(),!0,"last")," | "),na(2),cu("\n ",Al(14,13,i.hours.toString(),!1,"first"),"\n "),na(3),lu(Al(17,17,i.hours.toString(),!1,"last"))}}function gR(t,e){if(1&t&&(Ms(0),uu(1,"\n "),ps(2,mR,21,21,"ng-container",5),uu(3,"\n "),Ss()),2&t){var n=Ys().$implicit;na(2),_s("ngForOf",n.addresses)}}function vR(t,e){1&t&&(Ms(0),uu(1,"\n "),bs(2,"div",10),bs(3,"mat-icon",11),uu(4,"error"),ws(),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),Ss()),2&t&&(na(3),_s("inline",!0),na(2),lu(El(6,2,"select-address.no-addresses")))}function _R(t,e){if(1&t&&(bs(0,"div",2),uu(1,"\n "),bs(2,"div",3),uu(3),ws(),uu(4,"\n "),ps(5,gR,4,1,"ng-container",4),uu(6,"\n "),ps(7,vR,8,4,"ng-container",4),uu(8,"\n "),ws()),2&t){var n=e.$implicit;na(2),Bs("title",n.label),na(1),lu(n.label),na(2),_s("ngIf",n.addresses.length>0),na(2),_s("ngIf",0===n.addresses.length)}}var yR=function(){return function(){this.addresses=[]}}(),bR=function(){function t(t,e){var n=this;this.dialogRef=t,this.balanceAndOutputsService=e,this.listElements=[],this.balanceAndOutputsService.walletsWithBalance.pipe(Ap()).subscribe((function(t){t.forEach((function(t){var e=new yR;e.label=t.label,t.addresses.forEach((function(n){t.isHardware&&!n.confirmed||e.addresses.push({address:n.address,coins:n.coins,hours:n.hours})})),n.listElements.push(e)}))}))}return t.openDialog=function(e){var n=new pk;return n.autoFocus=!1,n.width=Mm.mediumModalWidth,e.open(t,n)},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.select=function(t){this.dialogRef.close(t)},t.\u0275fac=function(e){return new(e||t)(gs(bk),gs(MO))},t.\u0275cmp=Fe({type:t,selectors:[["app-select-address"]],decls:6,vars:5,consts:[[3,"headline","dialog"],["class","wallet-container list-button-container light-button-theme",4,"ngFor","ngForOf"],[1,"wallet-container","list-button-container","light-button-theme"],[1,"title",3,"title"],[4,"ngIf"],[4,"ngFor","ngForOf"],["mat-button","","color","primary",3,"click"],[1,"address"],[1,"balance"],[1,"grey-text"],[1,"no-addresses-msg"],[3,"inline"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),ps(3,_R,9,4,"div",1),uu(4,"\n"),ws(),uu(5,"\n")),2&t&&(_s("headline",El(1,3,"select-address.title"))("dialog",e.dialogRef),na(3),_s("ngForOf",e.listElements))},directives:[jS,Lh,Eh,XC,vx],pipes:[pC,DC],styles:[".wallet-container[_ngcontent-%COMP%]{padding-top:30px}.wallet-container[_ngcontent-%COMP%]:first-child{padding-top:0}.wallet-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{color:#1e2227;border-bottom:1px solid rgba(30,34,39,.05);padding:0 10px;font-size:18px;line-height:1.8;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.wallet-container[_ngcontent-%COMP%] .address[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}.wallet-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%]{font-size:12px;line-height:1.5;color:#1e2227}.wallet-container[_ngcontent-%COMP%] .no-addresses-msg[_ngcontent-%COMP%]{padding:10px}.wallet-container[_ngcontent-%COMP%] .no-addresses-msg[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:5px;position:relative;top:2px}"]}),t}(),wR=["button"],kR=function(){function t(e,n,i,r,a){this.dialogRef=e,this.data=n,this.formBuilder=i,this.msgBarService=r,this.storageService=a,this.maxNoteChars=t.MAX_NOTE_CHARS,this.busy=!1}return t.openDialog=function(e,n){var i=new pk;return i.data=n,i.autoFocus=!0,i.width=Mm.mediumModalWidth,e.open(t,i)},t.prototype.ngOnInit=function(){this.originalNote=this.data.note?this.data.note:"",this.form=this.formBuilder.group({note:[this.data.note]})},t.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.OperationSubscription&&this.OperationSubscription.unsubscribe()},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.changeNote=function(){var t=this;if(!this.busy){var e=this.form.value.note?this.form.value.note.trim():"";this.originalNote!==e?(this.busy=!0,this.msgBarService.hide(),this.button.setLoading(),this.OperationSubscription=this.storageService.store(Yx.NOTES,this.data.id,e).subscribe((function(){t.busy=!1,t.dialogRef.close(e)}),(function(e){t.busy=!1,t.msgBarService.showError(e),t.button.resetState().setEnabled()}))):this.closePopup()}},t.MAX_NOTE_CHARS=64,t.\u0275fac=function(e){return new(e||t)(gs(bk),gs(kk),gs(YS),gs(Gx),gs(Rx))},t.\u0275cmp=Fe({type:t,selectors:[["app-change-note"]],viewQuery:function(t,e){var n;1&t&&Zl(wR,!0),2&t&&Gl(n=tc())&&(e.button=n.first)},decls:34,vars:20,consts:[[3,"headline","dialog","disableDismiss"],[3,"formGroup"],[1,"form-field"],["for","note"],[1,"help-icon",3,"matTooltip"],["formControlName","note","id","note",3,"maxlength","keydown.enter"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],["button",""]],template:function(t,e){if(1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),bs(4,"div",1),uu(5,"\n "),bs(6,"div",2),uu(7,"\n "),bs(8,"label",3),uu(9),Tl(10,"translate"),bs(11,"mat-icon",4),Tl(12,"translate"),uu(13,"help"),ws(),uu(14,"\n "),ws(),uu(15,"\n "),bs(16,"input",5),Ts("keydown.enter",(function(){return e.changeNote()})),ws(),uu(17,"\n "),ws(),uu(18,"\n "),ws(),uu(19,"\n "),uu(20,"\n "),bs(21,"div",6),uu(22,"\n "),bs(23,"app-button",7),Ts("action",(function(){return e.closePopup()})),uu(24),Tl(25,"translate"),ws(),uu(26,"\n "),bs(27,"app-button",8,9),Ts("action",(function(){return e.changeNote()})),uu(29),Tl(30,"translate"),ws(),uu(31,"\n "),ws(),uu(32,"\n"),ws(),uu(33,"\n")),2&t){var n=ms(28);_s("headline",El(1,10,"edit-note.title"))("dialog",e.dialogRef)("disableDismiss",n&&n.isLoading()),na(4),_s("formGroup",e.form),na(5),cu("\n ",El(10,12,"send.personal-note-label"),"\n "),na(2),_s("matTooltip",El(12,14,"send.personal-note-help")),na(5),_s("maxlength",e.maxNoteChars),ds("disabled",e.busy?"true":null),na(8),cu("\n ",El(25,16,"common.cancel-button"),"\n "),na(5),cu("\n ",El(30,18,"edit-note.change-button"),"\n ")}},directives:[jS,rM,hS,vx,UE,Qk,iM,yS,ES,Cx],pipes:[pC],styles:[""]}),t}(),MR=function(){function t(t,e,n,i){this.dialogRef=t,this.data=e,this.formBuilder=n,this.msgBarService=i,this.inputErrorMsg=""}return t.openDialog=function(e,n){var i=new pk;return i.data=n,i.autoFocus=!0,i.width=Mm.mediumModalWidth,e.open(t,i)},t.prototype.ngOnInit=function(){this.form=this.formBuilder.group({data:[this.data]}),this.form.setValidators(this.validateForm.bind(this))},t.prototype.ngOnDestroy=function(){this.msgBarService.hide()},t.prototype.processData=function(){try{if(0===this.form.value.data.trim().length)return void this.msgBarService.showError("send.bulk-send.no-data-error");var t=this.form.value.data.split(/\r?\n/);if(!t||0===t.length)return void this.msgBarService.showError("send.bulk-send.no-data-error");var e=(t=t.filter((function(t){return t.trim().length>0})))[0].split(",").length;if(2!==e&&3!==e)return void this.msgBarService.showError("send.bulk-send.invalid-data-error");var n=[],i=!0;if(t.forEach((function(t){var r=t.split(","),a={address:r[0].trim(),coins:r[1].trim(),originalAmount:null};a.hours=3===r.length?r[2].trim():void 0,n.push(a),r.length!==e&&(i=!1)})),!i)return void this.msgBarService.showError("send.bulk-send.inconsistent-data-error");this.dialogRef.close(n)}catch(r){this.msgBarService.showError("send.bulk-send.invalid-data-error")}},t.prototype.validateForm=function(){this.inputErrorMsg="";var t=!0;return this.form.get("data").value&&this.form.get("data").value.trim()||(t=!1,this.form.get("data").touched&&(this.inputErrorMsg="send.bulk-send.data-error-info")),t?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(gs(bk),gs(kk),gs(YS),gs(Gx))},t.\u0275cmp=Fe({type:t,selectors:[["app-multiple-destinations-dialog"]],decls:20,vars:13,consts:[[3,"headline","dialog"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],["formControlName","data","id","data","rows","5",3,"appFormFieldError","blur"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2),Tl(3,"translate"),bs(4,"div",1),uu(5,"\n "),bs(6,"div",2),uu(7,"\n "),bs(8,"textarea",3),Ts("blur",(function(){return e.validateForm()})),ws(),uu(9,"\n "),ws(),uu(10,"\n "),ws(),uu(11,"\n "),bs(12,"div",4),uu(13,"\n "),bs(14,"app-button",5),Ts("action",(function(){return e.processData()})),uu(15),Tl(16,"translate"),ws(),uu(17,"\n "),ws(),uu(18,"\n"),ws(),uu(19,"\n")),2&t&&(_s("headline",El(1,7,"send.bulk-send.title"))("dialog",e.dialogRef),na(2),cu("\n ",El(3,9,"send.bulk-send.indications"),"\n "),na(2),_s("formGroup",e.form),na(4),_s("appFormFieldError",e.inputErrorMsg),na(6),_s("disabled",!e.form.valid),na(1),cu("\n ",El(16,11,"send.bulk-send.process-button"),"\n "))},directives:[jS,rM,hS,Qk,iM,yS,KE,Cx],pipes:[pC],styles:[""]}),t}(),SR=["underline"],CR=["connectionContainer"],xR=["inputContainer"],DR=["label"];function LR(t,e){1&t&&(Ms(0),uu(1,"\n "),bs(2,"div",14),uu(3,"\n "),ks(4,"div",15),uu(5,"\n "),ks(6,"div",16),uu(7,"\n "),ks(8,"div",17),uu(9,"\n "),ws(),uu(10,"\n "),bs(11,"div",18),uu(12,"\n "),ks(13,"div",15),uu(14,"\n "),ks(15,"div",16),uu(16,"\n "),ks(17,"div",17),uu(18,"\n "),ws(),uu(19,"\n "),Ss())}function TR(t,e){1&t&&(bs(0,"div",19),uu(1,"\n "),Hs(2,1),uu(3,"\n "),ws())}function ER(t,e){if(1&t&&(Ms(0),uu(1,"\n "),Hs(2,2),uu(3,"\n "),bs(4,"span"),uu(5),ws(),uu(6,"\n "),Ss()),2&t){var n=Ys(2);na(5),lu(n._control.placeholder)}}function OR(t,e){1&t&&Hs(0,3,["*ngSwitchCase","true"])}function AR(t,e){1&t&&(bs(0,"span",23),uu(1," *"),ws())}function PR(t,e){if(1&t){var n=xs();bs(0,"label",20,21),Ts("cdkObserveContent",(function(){return Bn(n),Ys().updateOutlineGap()})),uu(2,"\n\n "),uu(3,"\n "),ps(4,ER,7,1,"ng-container",12),uu(5,"\n\n "),ps(6,OR,1,0,"ng-content",12),uu(7,"\n\n "),uu(8,"\n "),ps(9,AR,2,0,"span",22),uu(10,"\n "),ws()}if(2&t){var i=Ys();Js("mat-empty",i._control.empty&&!i._shouldAlwaysFloat())("mat-form-field-empty",i._control.empty&&!i._shouldAlwaysFloat())("mat-accent","accent"==i.color)("mat-warn","warn"==i.color),_s("cdkObserveContentDisabled","outline"!=i.appearance)("id",i._labelId)("ngSwitch",i._hasLabel()),ds("for",i._control.id)("aria-owns",i._control.id),na(4),_s("ngSwitchCase",!1),na(2),_s("ngSwitchCase",!0),na(3),_s("ngIf",!i.hideRequiredMarker&&i._control.required&&!i._control.disabled)}}function IR(t,e){1&t&&(bs(0,"div",24),uu(1,"\n "),Hs(2,4),uu(3,"\n "),ws())}function YR(t,e){if(1&t&&(bs(0,"div",25,26),uu(2,"\n "),ks(3,"span",27),uu(4,"\n "),ws()),2&t){var n=Ys();na(3),Js("mat-accent","accent"==n.color)("mat-warn","warn"==n.color)}}function RR(t,e){1&t&&(bs(0,"div"),uu(1,"\n "),Hs(2,5),uu(3,"\n "),ws()),2&t&&_s("@transitionMessages",Ys()._subscriptAnimationState)}function FR(t,e){if(1&t&&(bs(0,"div",31),uu(1),ws()),2&t){var n=Ys(2);_s("id",n._hintLabelId),na(1),lu(n.hintLabel)}}function HR(t,e){if(1&t&&(bs(0,"div",28),uu(1,"\n "),uu(2,"\n "),ps(3,FR,2,2,"div",29),uu(4,"\n "),Hs(5,6),uu(6,"\n "),ks(7,"div",30),uu(8,"\n "),Hs(9,7),uu(10,"\n "),ws()),2&t){var n=Ys();_s("@transitionMessages",n._subscriptAnimationState),na(3),_s("ngIf",n.hintLabel)}}var BR=["*",[["","matPrefix",""]],[["mat-placeholder"]],[["mat-label"]],[["","matSuffix",""]],[["mat-error"]],[["mat-hint",3,"align","end"]],[["mat-hint","align","end"]]],jR=["*","[matPrefix]","mat-placeholder","mat-label","[matSuffix]","mat-error","mat-hint:not([align='end'])","mat-hint[align='end']"],NR=0,WR=new se("MatError"),VR=function(){var t=function t(){_(this,t),this.id="mat-error-".concat(NR++)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-error"]],hostAttrs:["role","alert",1,"mat-error"],hostVars:1,hostBindings:function(t,e){2&t&&ds("id",e.id)},inputs:{id:"id"},features:[Pu([{provide:WR,useExisting:t}])]}),t}(),zR={transitionMessages:D_("transitionMessages",[A_("enter",O_({opacity:1,transform:"translateY(0%)"})),I_("void => enter",[O_({opacity:0,transform:"translateY(-100%)"}),L_("300ms cubic-bezier(0.55, 0, 0.55, 0.2)")])])},UR=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t}),t}(),qR=0,GR=new se("MatHint"),KR=function(){var t=function t(){_(this,t),this.align="start",this.id="mat-hint-".concat(qR++)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-hint"]],hostAttrs:[1,"mat-hint"],hostVars:4,hostBindings:function(t,e){2&t&&(ds("id",e.id)("align",null),Js("mat-form-field-hint-end","end"===e.align))},inputs:{align:"align",id:"id"},features:[Pu([{provide:GR,useExisting:t}])]}),t}(),ZR=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-label"]]}),t}(),JR=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-placeholder"]]}),t}(),QR=new se("MatPrefix"),XR=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","matPrefix",""]],features:[Pu([{provide:QR,useExisting:t}])]}),t}(),$R=new se("MatSuffix"),tF=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","matSuffix",""]],features:[Pu([{provide:$R,useExisting:t}])]}),t}(),eF=0,nF=Lw((function t(e){_(this,t),this._elementRef=e}),"primary"),iF=new se("MAT_FORM_FIELD_DEFAULT_OPTIONS"),rF=new se("MatFormField"),aF=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s,u,l){var c;return _(this,n),(c=e.call(this,t))._elementRef=t,c._changeDetectorRef=i,c._dir=a,c._defaults=o,c._platform=s,c._ngZone=u,c._outlineGapCalculationNeededImmediately=!1,c._outlineGapCalculationNeededOnStable=!1,c._destroyed=new z,c._showAlwaysAnimate=!1,c._subscriptAnimationState="",c._hintLabel="",c._hintLabelId="mat-hint-".concat(eF++),c._labelId="mat-form-field-label-".concat(eF++),c._labelOptions=r||{},c.floatLabel=c._getDefaultFloatLabelState(),c._animationsEnabled="NoopAnimations"!==l,c.appearance=o&&o.appearance?o.appearance:"legacy",c._hideRequiredMarker=!(!o||null==o.hideRequiredMarker)&&o.hideRequiredMarker,c}return b(n,[{key:"_shouldAlwaysFloat",value:function(){return"always"===this.floatLabel&&!this._showAlwaysAnimate}},{key:"_canLabelFloat",value:function(){return"never"!==this.floatLabel}},{key:"getLabelId",value:function(){return this._hasFloatingLabel()?this._labelId:null}},{key:"getConnectedOverlayOrigin",value:function(){return this._connectionContainerRef||this._elementRef}},{key:"ngAfterContentInit",value:function(){var t=this;this._validateControlChild();var e=this._control;e.controlType&&this._elementRef.nativeElement.classList.add("mat-form-field-type-".concat(e.controlType)),e.stateChanges.pipe(rg(null)).subscribe((function(){t._validatePlaceholders(),t._syncDescribedByIds(),t._changeDetectorRef.markForCheck()})),e.ngControl&&e.ngControl.valueChanges&&e.ngControl.valueChanges.pipe($m(this._destroyed)).subscribe((function(){return t._changeDetectorRef.markForCheck()})),this._ngZone.runOutsideAngular((function(){t._ngZone.onStable.pipe($m(t._destroyed)).subscribe((function(){t._outlineGapCalculationNeededOnStable&&t.updateOutlineGap()}))})),ft(this._prefixChildren.changes,this._suffixChildren.changes).subscribe((function(){t._outlineGapCalculationNeededOnStable=!0,t._changeDetectorRef.markForCheck()})),this._hintChildren.changes.pipe(rg(null)).subscribe((function(){t._processHints(),t._changeDetectorRef.markForCheck()})),this._errorChildren.changes.pipe(rg(null)).subscribe((function(){t._syncDescribedByIds(),t._changeDetectorRef.markForCheck()})),this._dir&&this._dir.change.pipe($m(this._destroyed)).subscribe((function(){"function"==typeof requestAnimationFrame?t._ngZone.runOutsideAngular((function(){requestAnimationFrame((function(){return t.updateOutlineGap()}))})):t.updateOutlineGap()}))}},{key:"ngAfterContentChecked",value:function(){this._validateControlChild(),this._outlineGapCalculationNeededImmediately&&this.updateOutlineGap()}},{key:"ngAfterViewInit",value:function(){this._subscriptAnimationState="enter",this._changeDetectorRef.detectChanges()}},{key:"ngOnDestroy",value:function(){this._destroyed.next(),this._destroyed.complete()}},{key:"_shouldForward",value:function(t){var e=this._control?this._control.ngControl:null;return e&&e[t]}},{key:"_hasPlaceholder",value:function(){return!!(this._control&&this._control.placeholder||this._placeholderChild)}},{key:"_hasLabel",value:function(){return!(!this._labelChildNonStatic&&!this._labelChildStatic)}},{key:"_shouldLabelFloat",value:function(){return this._canLabelFloat()&&(this._control&&this._control.shouldLabelFloat||this._shouldAlwaysFloat())}},{key:"_hideControlPlaceholder",value:function(){return"legacy"===this.appearance&&!this._hasLabel()||this._hasLabel()&&!this._shouldLabelFloat()}},{key:"_hasFloatingLabel",value:function(){return this._hasLabel()||"legacy"===this.appearance&&this._hasPlaceholder()}},{key:"_getDisplayedMessages",value:function(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"}},{key:"_animateAndLockLabel",value:function(){var t=this;this._hasFloatingLabel()&&this._canLabelFloat()&&(this._animationsEnabled&&this._label&&(this._showAlwaysAnimate=!0,Rm(this._label.nativeElement,"transitionend").pipe(kp(1)).subscribe((function(){t._showAlwaysAnimate=!1}))),this.floatLabel="always",this._changeDetectorRef.markForCheck())}},{key:"_validatePlaceholders",value:function(){}},{key:"_processHints",value:function(){this._validateHints(),this._syncDescribedByIds()}},{key:"_validateHints",value:function(){}},{key:"_getDefaultFloatLabelState",value:function(){return this._defaults&&this._defaults.floatLabel||this._labelOptions.float||"auto"}},{key:"_syncDescribedByIds",value:function(){if(this._control){var t=[];if(this._control.userAriaDescribedBy&&"string"==typeof this._control.userAriaDescribedBy&&t.push.apply(t,l(this._control.userAriaDescribedBy.split(" "))),"hint"===this._getDisplayedMessages()){var e=this._hintChildren?this._hintChildren.find((function(t){return"start"===t.align})):null,n=this._hintChildren?this._hintChildren.find((function(t){return"end"===t.align})):null;e?t.push(e.id):this._hintLabel&&t.push(this._hintLabelId),n&&t.push(n.id)}else this._errorChildren&&t.push.apply(t,l(this._errorChildren.map((function(t){return t.id}))));this._control.setDescribedByIds(t)}}},{key:"_validateControlChild",value:function(){}},{key:"updateOutlineGap",value:function(){var t=this._label?this._label.nativeElement:null;if("outline"===this.appearance&&t&&t.children.length&&t.textContent.trim()&&this._platform.isBrowser)if(this._isAttachedToDOM()){var e=0,n=0,i=this._connectionContainerRef.nativeElement,r=i.querySelectorAll(".mat-form-field-outline-start"),a=i.querySelectorAll(".mat-form-field-outline-gap");if(this._label&&this._label.nativeElement.children.length){var o=i.getBoundingClientRect();if(0===o.width&&0===o.height)return this._outlineGapCalculationNeededOnStable=!0,void(this._outlineGapCalculationNeededImmediately=!1);for(var s=this._getStartEnd(o),u=t.children,l=this._getStartEnd(u[0].getBoundingClientRect()),c=0,d=0;d0?.75*c+10:0}for(var h=0;h void",R_("@transformPanel",[Y_()],{optional:!0}))]),transformPanel:D_("transformPanel",[A_("void",O_({transform:"scaleY(0.8)",minWidth:"100%",opacity:0})),A_("showing",O_({opacity:1,minWidth:"calc(100% + 32px)",transform:"scaleY(1)"})),A_("showing-multiple",O_({opacity:1,minWidth:"calc(100% + 64px)",transform:"scaleY(1)"})),I_("void => *",L_("120ms cubic-bezier(0, 0, 0.2, 1)")),I_("* => void",L_("100ms 25ms linear",O_({opacity:0})))])},vF=0,_F=256,yF=new se("mat-select-scroll-strategy"),bF=new se("MAT_SELECT_CONFIG"),wF={provide:yF,deps:[Tv],useFactory:function(t){return function(){return t.scrollStrategies.reposition()}}},kF=function t(e,n){_(this,t),this.source=e,this.value=n},MF=Tw(Ew(Dw(Ow((function t(e,n,i,r,a){_(this,t),this._elementRef=e,this._defaultErrorStateMatcher=n,this._parentForm=i,this._parentFormGroup=r,this.ngControl=a}))))),SF=new se("MatSelectTrigger"),CF=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-select-trigger"]],features:[Pu([{provide:SF,useExisting:t}])]}),t}(),xF=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,o,s,u,c,d,h,f,p,m,g,v){var y;return _(this,n),(y=e.call(this,s,o,c,d,f))._viewportRuler=t,y._changeDetectorRef=i,y._ngZone=r,y._dir=u,y._parentFormField=h,y.ngControl=f,y._liveAnnouncer=g,y._panelOpen=!1,y._required=!1,y._scrollTop=0,y._multiple=!1,y._compareWith=function(t,e){return t===e},y._uid="mat-select-".concat(vF++),y._triggerAriaLabelledBy=null,y._destroy=new z,y._triggerFontSize=0,y._onChange=function(){},y._onTouched=function(){},y._valueId="mat-select-value-".concat(vF++),y._transformOrigin="top",y._panelDoneAnimatingStream=new z,y._offsetY=0,y._positions=[{originX:"start",originY:"top",overlayX:"start",overlayY:"top"},{originX:"start",originY:"bottom",overlayX:"start",overlayY:"bottom"}],y._disableOptionCentering=!1,y._focused=!1,y.controlType="mat-select",y.ariaLabel="",y.optionSelectionChanges=hk((function(){var t=y.options;return t?t.changes.pipe(rg(t),ag((function(){return ft.apply(void 0,l(t.map((function(t){return t.onSelectionChange}))))}))):y._ngZone.onStable.pipe(kp(1),ag((function(){return y.optionSelectionChanges})))})),y.openedChange=new Rl,y._openedStream=y.openedChange.pipe(_p((function(t){return t})),nt((function(){}))),y._closedStream=y.openedChange.pipe(_p((function(t){return!t})),nt((function(){}))),y.selectionChange=new Rl,y.valueChange=new Rl,y.ngControl&&(y.ngControl.valueAccessor=a(y)),y._scrollStrategyFactory=m,y._scrollStrategy=y._scrollStrategyFactory(),y.tabIndex=parseInt(p)||0,y.id=y.id,v&&(null!=v.disableOptionCentering&&(y.disableOptionCentering=v.disableOptionCentering),null!=v.typeaheadDebounceInterval&&(y.typeaheadDebounceInterval=v.typeaheadDebounceInterval)),y}return b(n,[{key:"ngOnInit",value:function(){var t=this;this._selectionModel=new Og(this.multiple),this.stateChanges.next(),this._panelDoneAnimatingStream.pipe(Vm(),$m(this._destroy)).subscribe((function(){t.panelOpen?(t._scrollTop=0,t.openedChange.emit(!0)):(t.openedChange.emit(!1),t.overlayDir.offsetX=0,t._changeDetectorRef.markForCheck())})),this._viewportRuler.change().pipe($m(this._destroy)).subscribe((function(){t._panelOpen&&(t._triggerRect=t.trigger.nativeElement.getBoundingClientRect(),t._changeDetectorRef.markForCheck())}))}},{key:"ngAfterContentInit",value:function(){var t=this;this._initKeyManager(),this._selectionModel.changed.pipe($m(this._destroy)).subscribe((function(t){t.added.forEach((function(t){return t.select()})),t.removed.forEach((function(t){return t.deselect()}))})),this.options.changes.pipe(rg(null),$m(this._destroy)).subscribe((function(){t._resetOptions(),t._initializeSelection()}))}},{key:"ngDoCheck",value:function(){var t=this._getTriggerAriaLabelledby();if(t!==this._triggerAriaLabelledBy){var e=this._elementRef.nativeElement;this._triggerAriaLabelledBy=t,t?e.setAttribute("aria-labelledby",t):e.removeAttribute("aria-labelledby")}this.ngControl&&this.updateErrorState()}},{key:"ngOnChanges",value:function(t){t.disabled&&this.stateChanges.next(),t.typeaheadDebounceInterval&&this._keyManager&&this._keyManager.withTypeAhead(this._typeaheadDebounceInterval)}},{key:"ngOnDestroy",value:function(){this._destroy.next(),this._destroy.complete(),this.stateChanges.complete()}},{key:"toggle",value:function(){this.panelOpen?this.close():this.open()}},{key:"open",value:function(){var t=this;!this.disabled&&this.options&&this.options.length&&!this._panelOpen&&(this._triggerRect=this.trigger.nativeElement.getBoundingClientRect(),this._triggerFontSize=parseInt(getComputedStyle(this.trigger.nativeElement).fontSize||"0"),this._panelOpen=!0,this._keyManager.withHorizontalOrientation(null),this._calculateOverlayPosition(),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this._ngZone.onStable.pipe(kp(1)).subscribe((function(){t._triggerFontSize&&t.overlayDir.overlayRef&&t.overlayDir.overlayRef.overlayElement&&(t.overlayDir.overlayRef.overlayElement.style.fontSize="".concat(t._triggerFontSize,"px"))})))}},{key:"close",value:function(){this._panelOpen&&(this._panelOpen=!1,this._keyManager.withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._changeDetectorRef.markForCheck(),this._onTouched())}},{key:"writeValue",value:function(t){this.value=t}},{key:"registerOnChange",value:function(t){this._onChange=t}},{key:"registerOnTouched",value:function(t){this._onTouched=t}},{key:"setDisabledState",value:function(t){this.disabled=t,this._changeDetectorRef.markForCheck(),this.stateChanges.next()}},{key:"_isRtl",value:function(){return!!this._dir&&"rtl"===this._dir.value}},{key:"_handleKeydown",value:function(t){this.disabled||(this.panelOpen?this._handleOpenKeydown(t):this._handleClosedKeydown(t))}},{key:"_handleClosedKeydown",value:function(t){var e=t.keyCode,n=e===ev||e===tv||37===e||39===e,i=e===Qg||e===$g,r=this._keyManager;if(!r.isTyping()&&i&&!nv(t)||(this.multiple||t.altKey)&&n)t.preventDefault(),this.open();else if(!this.multiple){var a=this.selected;r.onKeydown(t);var o=this.selected;o&&a!==o&&this._liveAnnouncer.announce(o.viewValue,1e4)}}},{key:"_handleOpenKeydown",value:function(t){var e=this._keyManager,n=t.keyCode,i=n===ev||n===tv,r=e.isTyping();if(i&&t.altKey)t.preventDefault(),this.close();else if(r||n!==Qg&&n!==$g||!e.activeItem||nv(t))if(!r&&this._multiple&&65===n&&t.ctrlKey){t.preventDefault();var a=this.options.some((function(t){return!t.disabled&&!t.selected}));this.options.forEach((function(t){t.disabled||(a?t.select():t.deselect())}))}else{var o=e.activeItemIndex;e.onKeydown(t),this._multiple&&i&&t.shiftKey&&e.activeItem&&e.activeItemIndex!==o&&e.activeItem._selectViaInteraction()}else t.preventDefault(),e.activeItem._selectViaInteraction()}},{key:"_onFocus",value:function(){this.disabled||(this._focused=!0,this.stateChanges.next())}},{key:"_onBlur",value:function(){this._focused=!1,this.disabled||this.panelOpen||(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}},{key:"_onAttached",value:function(){var t=this;this.overlayDir.positionChange.pipe(kp(1)).subscribe((function(){t._changeDetectorRef.detectChanges(),t._calculateOverlayOffsetX(),t.panel.nativeElement.scrollTop=t._scrollTop}))}},{key:"_getPanelTheme",value:function(){return this._parentFormField?"mat-".concat(this._parentFormField.color):""}},{key:"_initializeSelection",value:function(){var t=this;Promise.resolve().then((function(){t._setSelectionByValue(t.ngControl?t.ngControl.value:t._value),t.stateChanges.next()}))}},{key:"_setSelectionByValue",value:function(t){var e=this;if(this.multiple&&t)Array.isArray(t),this._selectionModel.clear(),t.forEach((function(t){return e._selectValue(t)})),this._sortValues();else{this._selectionModel.clear();var n=this._selectValue(t);n?this._keyManager.updateActiveItem(n):this.panelOpen||this._keyManager.updateActiveItem(-1)}this._changeDetectorRef.markForCheck()}},{key:"_selectValue",value:function(t){var e=this,n=this.options.find((function(n){try{return null!=n.value&&e._compareWith(n.value,t)}catch(i){return!1}}));return n&&this._selectionModel.select(n),n}},{key:"_initKeyManager",value:function(){var t=this;this._keyManager=new n_(this.options).withTypeAhead(this._typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl()?"rtl":"ltr").withHomeAndEnd().withAllowedModifierKeys(["shiftKey"]),this._keyManager.tabOut.pipe($m(this._destroy)).subscribe((function(){t.panelOpen&&(!t.multiple&&t._keyManager.activeItem&&t._keyManager.activeItem._selectViaInteraction(),t.focus(),t.close())})),this._keyManager.change.pipe($m(this._destroy)).subscribe((function(){t._panelOpen&&t.panel?t._scrollActiveOptionIntoView():t._panelOpen||t.multiple||!t._keyManager.activeItem||t._keyManager.activeItem._selectViaInteraction()}))}},{key:"_resetOptions",value:function(){var t=this,e=ft(this.options.changes,this._destroy);this.optionSelectionChanges.pipe($m(e)).subscribe((function(e){t._onSelect(e.source,e.isUserInput),e.isUserInput&&!t.multiple&&t._panelOpen&&(t.close(),t.focus())})),ft.apply(void 0,l(this.options.map((function(t){return t._stateChanges})))).pipe($m(e)).subscribe((function(){t._changeDetectorRef.markForCheck(),t.stateChanges.next()}))}},{key:"_onSelect",value:function(t,e){var n=this._selectionModel.isSelected(t);null!=t.value||this._multiple?(n!==t.selected&&(t.selected?this._selectionModel.select(t):this._selectionModel.deselect(t)),e&&this._keyManager.setActiveItem(t),this.multiple&&(this._sortValues(),e&&this.focus())):(t.deselect(),this._selectionModel.clear(),null!=this.value&&this._propagateChanges(t.value)),n!==this._selectionModel.isSelected(t)&&this._propagateChanges(),this.stateChanges.next()}},{key:"_sortValues",value:function(){var t=this;if(this.multiple){var e=this.options.toArray();this._selectionModel.sort((function(n,i){return t.sortComparator?t.sortComparator(n,i,e):e.indexOf(n)-e.indexOf(i)})),this.stateChanges.next()}}},{key:"_propagateChanges",value:function(t){var e;e=this.multiple?this.selected.map((function(t){return t.value})):this.selected?this.selected.value:t,this._value=e,this.valueChange.emit(e),this._onChange(e),this.selectionChange.emit(new kF(this,e)),this._changeDetectorRef.markForCheck()}},{key:"_highlightCorrectOption",value:function(){this._keyManager&&(this.empty?this._keyManager.setFirstItemActive():this._keyManager.setActiveItem(this._selectionModel.selected[0]))}},{key:"_scrollActiveOptionIntoView",value:function(){var t=this._keyManager.activeItemIndex||0,e=uk(t,this.options,this.optionGroups),n=this._getItemHeight();this.panel.nativeElement.scrollTop=lk((t+e)*n,n,this.panel.nativeElement.scrollTop,_F)}},{key:"focus",value:function(t){this._elementRef.nativeElement.focus(t)}},{key:"_getOptionIndex",value:function(t){return this.options.reduce((function(e,n,i){return void 0!==e?e:t===n?i:void 0}),void 0)}},{key:"_calculateOverlayPosition",value:function(){var t=this._getItemHeight(),e=this._getItemCount(),n=Math.min(e*t,_F),i=e*t-n,r=this.empty?0:this._getOptionIndex(this._selectionModel.selected[0]);r+=uk(r,this.options,this.optionGroups);var a=n/2;this._scrollTop=this._calculateOverlayScroll(r,a,i),this._offsetY=this._calculateOverlayOffsetY(r,a,i),this._checkOverlayWithinViewport(i)}},{key:"_calculateOverlayScroll",value:function(t,e,n){var i=this._getItemHeight();return Math.min(Math.max(0,i*t-e+i/2),n)}},{key:"_getPanelAriaLabelledby",value:function(){if(this.ariaLabel)return null;var t=this._getLabelId();return this.ariaLabelledby?t+" "+this.ariaLabelledby:t}},{key:"_getAriaActiveDescendant",value:function(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null}},{key:"_getLabelId",value:function(){var t;return(null===(t=this._parentFormField)||void 0===t?void 0:t.getLabelId())||""}},{key:"_calculateOverlayOffsetX",value:function(){var t,e=this.overlayDir.overlayRef.overlayElement.getBoundingClientRect(),n=this._viewportRuler.getViewportSize(),i=this._isRtl(),r=this.multiple?56:32;if(this.multiple)t=40;else{var a=this._selectionModel.selected[0]||this.options.first;t=a&&a.group?32:16}i||(t*=-1);var o=0-(e.left+t-(i?r:0)),s=e.right+t-n.width+(i?0:r);o>0?t+=o+8:s>0&&(t-=s+8),this.overlayDir.offsetX=Math.round(t),this.overlayDir.overlayRef.updatePosition()}},{key:"_calculateOverlayOffsetY",value:function(t,e,n){var i,r=this._getItemHeight(),a=(r-this._triggerRect.height)/2,o=Math.floor(_F/r);return this._disableOptionCentering?0:(i=0===this._scrollTop?t*r:this._scrollTop===n?(t-(this._getItemCount()-o))*r+(r-(this._getItemCount()*r-_F)%r):e-r/2,Math.round(-1*i-a))}},{key:"_checkOverlayWithinViewport",value:function(t){var e=this._getItemHeight(),n=this._viewportRuler.getViewportSize(),i=this._triggerRect.top-8,r=n.height-this._triggerRect.bottom-8,a=Math.abs(this._offsetY),o=Math.min(this._getItemCount()*e,_F)-a-this._triggerRect.height;o>r?this._adjustPanelUp(o,r):a>i?this._adjustPanelDown(a,i,t):this._transformOrigin=this._getOriginBasedOnOption()}},{key:"_adjustPanelUp",value:function(t,e){var n=Math.round(t-e);this._scrollTop-=n,this._offsetY-=n,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop<=0&&(this._scrollTop=0,this._offsetY=0,this._transformOrigin="50% bottom 0px")}},{key:"_adjustPanelDown",value:function(t,e,n){var i=Math.round(t-e);if(this._scrollTop+=i,this._offsetY+=i,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop>=n)return this._scrollTop=n,this._offsetY=0,void(this._transformOrigin="50% top 0px")}},{key:"_getOriginBasedOnOption",value:function(){var t=this._getItemHeight(),e=(t-this._triggerRect.height)/2,n=Math.abs(this._offsetY)-e+t/2;return"50% ".concat(n,"px 0px")}},{key:"_getItemCount",value:function(){return this.options.length+this.optionGroups.length}},{key:"_getItemHeight",value:function(){return 3*this._triggerFontSize}},{key:"_getTriggerAriaLabelledby",value:function(){if(this.ariaLabel)return null;var t=this._getLabelId()+" "+this._valueId;return this.ariaLabelledby&&(t+=" "+this.ariaLabelledby),t}},{key:"setDescribedByIds",value:function(t){this._ariaDescribedby=t.join(" ")}},{key:"onContainerClick",value:function(){this.focus(),this.open()}},{key:"focused",get:function(){return this._focused||this._panelOpen}},{key:"placeholder",get:function(){return this._placeholder},set:function(t){this._placeholder=t,this.stateChanges.next()}},{key:"required",get:function(){return this._required},set:function(t){this._required=Em(t),this.stateChanges.next()}},{key:"multiple",get:function(){return this._multiple},set:function(t){this._multiple=Em(t)}},{key:"disableOptionCentering",get:function(){return this._disableOptionCentering},set:function(t){this._disableOptionCentering=Em(t)}},{key:"compareWith",get:function(){return this._compareWith},set:function(t){this._compareWith=t,this._selectionModel&&this._initializeSelection()}},{key:"value",get:function(){return this._value},set:function(t){t!==this._value&&(this.options&&this._setSelectionByValue(t),this._value=t)}},{key:"typeaheadDebounceInterval",get:function(){return this._typeaheadDebounceInterval},set:function(t){this._typeaheadDebounceInterval=Om(t)}},{key:"id",get:function(){return this._id},set:function(t){this._id=t||this._uid,this.stateChanges.next()}},{key:"panelOpen",get:function(){return this._panelOpen}},{key:"selected",get:function(){return this.multiple?this._selectionModel.selected:this._selectionModel.selected[0]}},{key:"triggerValue",get:function(){if(this.empty)return"";if(this._multiple){var t=this._selectionModel.selected.map((function(t){return t.viewValue}));return this._isRtl()&&t.reverse(),t.join(", ")}return this._selectionModel.selected[0].viewValue}},{key:"empty",get:function(){return!this._selectionModel||this._selectionModel.isEmpty()}},{key:"shouldLabelFloat",get:function(){return this._panelOpen||!this.empty}}]),n}(MF);return t.\u0275fac=function(e){return new(e||t)(gs(Yg),gs(Lo),gs(Dc),gs(Aw),gs(Hu),gs(Lg,8),gs(rS,8),gs(hS,8),gs(rF,8),gs(eM,10),vs("tabindex"),gs(yF),gs(d_),gs(bF,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-select"]],contentQueries:function(t,e,n){var i;1&t&&(Ql(n,SF,!0),Ql(n,sk,!0),Ql(n,tk,!0)),2&t&&(Gl(i=tc())&&(e.customTrigger=i.first),Gl(i=tc())&&(e.options=i),Gl(i=tc())&&(e.optionGroups=i))},viewQuery:function(t,e){var n;1&t&&(Zl(sF,!0),Zl(uF,!0),Zl(Pv,!0)),2&t&&(Gl(n=tc())&&(e.trigger=n.first),Gl(n=tc())&&(e.panel=n.first),Gl(n=tc())&&(e.overlayDir=n.first))},hostAttrs:["role","combobox","aria-autocomplete","none","aria-haspopup","true",1,"mat-select"],hostVars:20,hostBindings:function(t,e){1&t&&Ts("keydown",(function(t){return e._handleKeydown(t)}))("focus",(function(){return e._onFocus()}))("blur",(function(){return e._onBlur()})),2&t&&(ds("id",e.id)("tabindex",e.tabIndex)("aria-controls",e.panelOpen?e.id+"-panel":null)("aria-expanded",e.panelOpen)("aria-label",e.ariaLabel||null)("aria-required",e.required.toString())("aria-disabled",e.disabled.toString())("aria-invalid",e.errorState)("aria-describedby",e._ariaDescribedby||null)("aria-activedescendant",e._getAriaActiveDescendant()),Js("mat-select-disabled",e.disabled)("mat-select-invalid",e.errorState)("mat-select-required",e.required)("mat-select-empty",e.empty)("mat-select-multiple",e.multiple))},inputs:{disabled:"disabled",disableRipple:"disableRipple",tabIndex:"tabIndex",ariaLabel:["aria-label","ariaLabel"],id:"id",disableOptionCentering:"disableOptionCentering",typeaheadDebounceInterval:"typeaheadDebounceInterval",placeholder:"placeholder",required:"required",multiple:"multiple",compareWith:"compareWith",value:"value",panelClass:"panelClass",ariaLabelledby:["aria-labelledby","ariaLabelledby"],errorStateMatcher:"errorStateMatcher",sortComparator:"sortComparator"},outputs:{openedChange:"openedChange",_openedStream:"opened",_closedStream:"closed",selectionChange:"selectionChange",valueChange:"valueChange"},exportAs:["matSelect"],features:[Pu([{provide:UR,useExisting:t},{provide:ak,useExisting:t}]),Jo,fn],ngContentSelectors:mF,decls:17,vars:10,consts:[["cdk-overlay-origin","",1,"mat-select-trigger",3,"click"],["origin","cdkOverlayOrigin","trigger",""],[1,"mat-select-value",3,"ngSwitch"],["class","mat-select-placeholder",4,"ngSwitchCase"],["class","mat-select-value-text",3,"ngSwitch",4,"ngSwitchCase"],[1,"mat-select-arrow-wrapper"],[1,"mat-select-arrow"],["cdk-connected-overlay","","cdkConnectedOverlayLockPosition","","cdkConnectedOverlayHasBackdrop","","cdkConnectedOverlayBackdropClass","cdk-overlay-transparent-backdrop",3,"cdkConnectedOverlayScrollStrategy","cdkConnectedOverlayOrigin","cdkConnectedOverlayOpen","cdkConnectedOverlayPositions","cdkConnectedOverlayMinWidth","cdkConnectedOverlayOffsetY","backdropClick","attach","detach"],[1,"mat-select-placeholder"],[1,"mat-select-value-text",3,"ngSwitch"],[4,"ngSwitchDefault"],[4,"ngSwitchCase"],[1,"mat-select-panel-wrap"],["role","listbox","tabindex","-1",3,"ngClass","keydown"],["panel",""]],template:function(t,e){if(1&t&&(Fs(pF),bs(0,"div",0,1),Ts("click",(function(){return e.toggle()})),uu(3,"\n "),bs(4,"div",2),uu(5,"\n "),ps(6,lF,2,1,"span",3),uu(7,"\n "),ps(8,hF,6,2,"span",4),uu(9,"\n "),ws(),uu(10,"\n\n "),bs(11,"div",5),ks(12,"div",6),ws(),uu(13,"\n"),ws(),uu(14,"\n\n"),ps(15,fF,10,14,"ng-template",7),Ts("backdropClick",(function(){return e.close()}))("attach",(function(){return e._onAttached()}))("detach",(function(){return e.close()})),uu(16,"\n")),2&t){var n=ms(1);na(4),_s("ngSwitch",e.empty),ds("id",e._valueId),na(2),_s("ngSwitchCase",!0),na(2),_s("ngSwitchCase",!1),na(7),_s("cdkConnectedOverlayScrollStrategy",e._scrollStrategy)("cdkConnectedOverlayOrigin",n)("cdkConnectedOverlayOpen",e.panelOpen)("cdkConnectedOverlayPositions",e._positions)("cdkConnectedOverlayMinWidth",null==e._triggerRect?null:e._triggerRect.width)("cdkConnectedOverlayOffsetY",e._offsetY)}},directives:[Av,Ih,Yh,Pv,Rh,Ch],styles:[".mat-select{display:inline-block;width:100%;outline:none}.mat-select-trigger{display:inline-table;cursor:pointer;position:relative;box-sizing:border-box}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-select-value{display:table-cell;max-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{display:table-cell;vertical-align:middle}.mat-form-field-appearance-fill .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:translateY(-25%)}.mat-form-field-appearance-standard.mat-form-field-has-label .mat-select:not(.mat-select-empty) .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:none}.mat-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.mat-select-panel-wrap{flex-basis:100%}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%;border-radius:4px}.cdk-high-contrast-active .mat-select-panel{outline:solid 1px}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable .mat-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-select-placeholder{color:transparent;-webkit-text-fill-color:transparent;transition:none;display:block}\n"],encapsulation:2,data:{animation:[gF.transformPanelWrap,gF.transformPanel]},changeDetection:0}),t}(),DF=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[wF],imports:[[df,Yv,ck,xw],Rg,oF,ck,xw]}),t}();function LF(t,e){if(1&t){var n=xs();bs(0,"div",2),uu(1,"\n "),bs(2,"label",3),uu(3),Tl(4,"translate"),bs(5,"mat-icon",4),Tl(6,"translate"),uu(7,"help"),ws(),uu(8,"\n "),ws(),uu(9,"\n "),bs(10,"input",5),Ts("blur",(function(){return Bn(n),Ys().validateForm()})),ws(),uu(11,"\n "),ws()}if(2&t){var i=Ys();na(3),cu("\n ",El(4,4,"send.addresses-label"),"\n "),na(2),_s("matTooltip",El(6,6,"send.addresses-manual-help")),na(5),_s("appFormFieldError",i.manualAddressesErrorMsg),ds("disabled",i.busy?"true":null)}}function TF(t,e){if(1&t&&(Ms(0),uu(1,"\n "),bs(2,"option",12),uu(3),Tl(4,"amount"),Tl(5,"amount"),ws(),uu(6,"\n "),Ss()),2&t){var n=e.$implicit;na(2),_s("disabled",!n.coins||n.coins.isLessThanOrEqualTo(0))("ngValue",n),na(1),hu("\n ",n.label," - ",El(4,5,n.coins?n.coins.toString():0),"\n (",Ol(5,7,n.hours?n.hours.toString():0,!1),")\n ")}}function EF(t,e){if(1&t&&(Ms(0),uu(1,"\n "),ps(2,TF,7,10,"ng-container",11),uu(3,"\n "),Ss()),2&t){var n=Ys(2);na(2),_s("ngForOf",n.allWallets)}}function OF(t,e){if(1&t){var n=xs();bs(0,"div",2),uu(1,"\n "),bs(2,"label",6),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),bs(6,"div",7),uu(7,"\n "),bs(8,"select",8),Ts("blur",(function(){return Bn(n),Ys().validateForm()})),uu(9,"\n "),bs(10,"option",9),uu(11),Tl(12,"translate"),ws(),uu(13,"\n "),ps(14,EF,4,1,"ng-container",10),uu(15,"\n "),ws(),uu(16,"\n "),ws(),uu(17,"\n "),ws()}if(2&t){var i=Ys();na(3),lu(El(4,6,i.selectionMode===i.sourceSelectionModes.Wallet?"send.from-label":"send.wallet-label")),na(5),_s("appFormFieldError",i.walletErrorMsg),ds("disabled",i.busy?"true":null),na(2),_s("ngValue",""),na(1),lu(El(12,8,"send.select-wallet")),na(3),_s("ngIf",i.allWallets)}}function AF(t,e){if(1&t&&(bs(0,"mat-option",17),uu(1),Tl(2,"amount"),Tl(3,"amount"),ws()),2&t){var n=e.$implicit;_s("value",n),na(1),hu("\n ",n.address," - ",El(2,4,n.coins?n.coins.toString():0),"\n (",Ol(3,6,n.hours.toString(),!1),")\n ")}}function PF(t,e){if(1&t&&(bs(0,"div"),uu(1),Tl(2,"amount"),Tl(3,"amount"),ws()),2&t){var n=e.$implicit;na(1),hu("\n ",n.address," - ",El(2,3,n.coins?n.coins.toString():0),"\n (",Ol(3,5,n.hours.toString(),!1),")\n ")}}var IF=function(t){return{"element-disabled":t}};function YF(t,e){if(1&t){var n=xs();bs(0,"div",2),uu(1,"\n "),bs(2,"label",13),Ts("click",(function(){Bn(n);var t=ms(13);return Ys().busy?null:t.open()})),uu(3),Tl(4,"translate"),bs(5,"mat-icon",4),Tl(6,"translate"),uu(7,"help"),ws(),uu(8,"\n "),ws(),uu(9,"\n "),bs(10,"div",7),uu(11,"\n "),bs(12,"mat-select",14,15),Tl(14,"translate"),uu(15,"\n "),ps(16,AF,4,9,"mat-option",16),uu(17,"\n "),bs(18,"mat-select-trigger"),uu(19,"\n "),ps(20,PF,4,8,"div",11),uu(21,"\n "),ws(),uu(22,"\n "),ws(),uu(23,"\n "),ws(),uu(24,"\n "),ws()}if(2&t){var i=Ys();na(2),_s("for",i.busy?"":"addresses"),na(1),cu("\n ",El(4,8,"send.addresses-label"),"\n "),na(2),_s("matTooltip",El(6,10,"send.addresses-help")),na(7),_s("placeholder",El(14,12,i.addressessPlaceholder))("ngClass",kl(14,IF,i.busy||i.addresses&&0===i.addresses.length)),ds("disabled",i.busy||i.addresses&&0===i.addresses.length?"true":null),na(4),_s("ngForOf",i.addresses),na(4),_s("ngForOf",i.form.get("addresses").value)}}function RF(t,e){1&t&&(bs(0,"mat-icon",21),Tl(1,"translate"),uu(2,"error"),ws()),2&t&&_s("matTooltip",El(1,1,"send.outputs-error"))}function FF(t,e){1&t&&ks(0,"mat-spinner")}function HF(t,e){if(1&t&&(bs(0,"mat-option",17),uu(1),Tl(2,"amount"),Tl(3,"amount"),ws()),2&t){var n=e.$implicit;_s("value",n),na(1),hu("\n ",n.hash," - ",El(2,4,n.coins?n.coins.toString():0),"\n (",Ol(3,6,n.hours.toString(),!1),")\n ")}}function BF(t,e){if(1&t&&(bs(0,"div"),uu(1),Tl(2,"amount"),Tl(3,"amount"),ws()),2&t){var n=e.$implicit;na(1),hu("\n ",n.hash," - ",El(2,3,n.coins?n.coins.toString():0),"\n (",Ol(3,5,n.hours.toString(),!1),")\n ")}}function jF(t,e){if(1&t){var n=xs();bs(0,"div",2),uu(1,"\n "),bs(2,"label",13),Ts("click",(function(){Bn(n);var t=ms(17);return Ys().busy?null:t.open()})),uu(3),Tl(4,"translate"),bs(5,"mat-icon",4),Tl(6,"translate"),uu(7,"help"),ws(),uu(8,"\n "),ps(9,RF,3,3,"mat-icon",18),uu(10,"\n "),ps(11,FF,1,0,"mat-spinner",10),uu(12,"\n "),ws(),uu(13,"\n "),bs(14,"div",7),uu(15,"\n "),bs(16,"mat-select",19,20),Tl(18,"translate"),uu(19,"\n "),ps(20,HF,4,9,"mat-option",16),uu(21,"\n "),bs(22,"mat-select-trigger"),uu(23,"\n "),ps(24,BF,4,8,"div",11),uu(25,"\n "),ws(),uu(26,"\n "),ws(),uu(27,"\n "),ws(),uu(28,"\n "),ws()}if(2&t){var i=Ys();na(2),_s("for",i.busy?null:"outputs"),na(1),cu("\n ",El(4,10,"send.outputs-label"),"\n "),na(2),_s("matTooltip",El(6,12,"send.outputs-help")),na(4),_s("ngIf",i.errorLoadingManualOutputs),na(2),_s("ngIf",i.loadingUnspentOutputs),na(5),_s("placeholder",El(18,14,i.outputsPlaceholder))("ngClass",kl(16,IF,i.busy||i.unspentOutputs&&0===i.unspentOutputs.length)),ds("disabled",i.busy||i.unspentOutputs&&0===i.unspentOutputs.length?"true":null),na(4),_s("ngForOf",i.unspentOutputs),na(4),_s("ngForOf",i.form.get("outputs").value)}}var NF=function(){return function(){this.availableCoins=new hp.BigNumber(0),this.availableHours=new hp.BigNumber(0),this.minimumFee=new hp.BigNumber(0),this.loading=!1}}(),WF=function(t){return t.Wallet="Wallet",t.All="All",t.Manual="Manual",t}({}),VF=function(){function t(t,e,n){this.appService=t,this.formBuilder=e,this.balanceAndOutputsService=n,this.onSelectionChanged=new Rl,this.sourceSelectionModes=WF,this.addresses=[],this.manualAddresses=[],this.allUnspentOutputs=[],this.unspentOutputs=[],this.loadingUnspentOutputs=!1,this.errorLoadingManualOutputs=!1,this.manualAddressesErrorMsg="",this.walletErrorMsg="",this.subscriptionsGroup=[]}return Object.defineProperty(t.prototype,"selectionMode",{get:function(){return this.selectionModeInternal},set:function(t){this.selectionModeInternal=t,this.form&&(this.resetForm(),this.form.updateValueAndValidity())},enumerable:!1,configurable:!0}),t.prototype.ngOnInit=function(){var t=this;this.form=this.formBuilder.group({manualAddresses:[""],wallet:[""],addresses:[null],outputs:[null]}),this.form.setValidators(this.validateForm.bind(this)),this.subscriptionsGroup.push(this.form.get("manualAddresses").valueChanges.pipe(Bv(500)).subscribe((function(){var e=t.form.get("manualAddresses").value,n=[];e&&e.trim().length>0&&(n=(n=(n=e.split(",")).map((function(t){return t.trim()}))).filter((function(t){return t.length>0})));var i=!1;n.length!==t.manualAddresses.length?i=!0:n.forEach((function(e,n){t.manualAddresses[n]!==e&&(i=!0)})),i&&(t.manualAddresses=n,t.closeGetOutputsSubscription(),t.allUnspentOutputs=[],t.unspentOutputs=[],t.form.get("outputs").setValue(null),t.loadingUnspentOutputs=0!==n.length,t.errorLoadingManualOutputs=!1,t.onSelectionChanged.emit()),0!==n.length&&i&&(t.getOutputsSubscription=t.balanceAndOutputsService.getOutputs(t.form.get("manualAddresses").value.replace(/ /g,"")).pipe(Kf((function(e){return e.pipe(st((function(e){return(e=gm(e)).originalError&&e.originalError.status&&400===e.originalError.status?(t.errorLoadingManualOutputs=!0,ap(e)):rp(e)})),up(4e3))}))).subscribe((function(e){t.loadingUnspentOutputs=!1,t.allUnspentOutputs=e,t.unspentOutputs=t.filterUnspentOutputs(),t.onSelectionChanged.emit()}),(function(){t.loadingUnspentOutputs=!1,t.onSelectionChanged.emit()})))}))),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe((function(e){t.wallet=e,t.closeGetOutputsSubscription(),t.allUnspentOutputs=[],t.unspentOutputs=[],t.form.get("addresses").setValue(null),t.form.get("outputs").setValue(null),t.loadingUnspentOutputs=!1,e&&t.selectionMode===WF.All&&(t.loadingUnspentOutputs=!0,t.getOutputsSubscription=t.balanceAndOutputsService.getWalletUnspentOutputs(e).pipe(Kf((function(t){return t.pipe(up(4e3))}))).subscribe((function(e){t.loadingUnspentOutputs=!1,t.allUnspentOutputs=e,t.unspentOutputs=t.filterUnspentOutputs()}),(function(){return t.loadingUnspentOutputs=!1}))),t.addresses=e?e.addresses.filter((function(t){return t.coins>0})):[],t.onSelectionChanged.emit()}))),this.subscriptionsGroup.push(this.form.get("addresses").valueChanges.subscribe((function(){t.form.get("outputs").setValue(null),t.unspentOutputs=t.filterUnspentOutputs(),t.onSelectionChanged.emit()}))),this.subscriptionsGroup.push(this.form.get("outputs").valueChanges.subscribe((function(){t.onSelectionChanged.emit()}))),this.subscriptionsGroup.push(this.balanceAndOutputsService.walletsWithBalance.subscribe((function(e){t.allWallets=e,1===e.length&&setTimeout((function(){try{t.form.get("wallet").setValue(e[0])}catch(n){}}))})))},t.prototype.ngOnDestroy=function(){this.closeGetOutputsSubscription(),this.subscriptionsGroup.forEach((function(t){return t.unsubscribe()}))},t.prototype.resetForm=function(){this.form.get("manualAddresses").setValue(""),this.form.get("wallet").setValue(""),this.form.get("addresses").setValue(null),this.form.get("outputs").setValue(null),this.wallet=null},t.prototype.fill=function(t){var e=this;setTimeout((function(){if(e.selectionMode===WF.Manual){var n="",i=t.form.manualAddresses;i.forEach((function(t,e){n+=t,e0){var e=this.form.get("outputs").value;e&&e.length>0?e.map((function(e){t.availableCoins=t.availableCoins.plus(e.coins),t.availableHours=t.availableHours.plus(e.hours)})):this.unspentOutputs.forEach((function(e){t.availableCoins=t.availableCoins.plus(e.coins),t.availableHours=t.availableHours.plus(e.hours)}))}if(this.selectionMode===WF.Manual&&(t.loading=this.loadingUnspentOutputs),this.form.get("wallet").value){var n=this.form.get("outputs").value,i=this.form.get("addresses").value;if(n&&n.length>0)n.map((function(e){t.availableCoins=t.availableCoins.plus(e.coins),t.availableHours=t.availableHours.plus(e.hours)}));else if(i&&i.length>0)i.map((function(e){t.availableCoins=t.availableCoins.plus(e.coins),t.availableHours=t.availableHours.plus(e.hours)}));else if(this.form.get("wallet").value){var r=this.form.get("wallet").value;t.availableCoins=r.coins,t.availableHours=r.hours}}if(t.availableCoins.isGreaterThan(0)){var a=new hp.BigNumber(1).minus(new hp.BigNumber(1).dividedBy(this.appService.burnRate)),o=t.availableHours.multipliedBy(a).decimalPlaces(0,hp.BigNumber.ROUND_FLOOR);t.minimumFee=t.availableHours.minus(o),t.availableHours=o}return t},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"selectedSources",{get:function(){return this.selectionMode===WF.Manual?{wallet:null,manualAddresses:this.manualAddresses,unspentOutputs:this.form.get("outputs").value}:{wallet:this.form.get("wallet").value,addresses:this.form.get("addresses").value,unspentOutputs:this.form.get("outputs").value}},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"unspentOutputsList",{get:function(){return this.loadingUnspentOutputs?null:this.allUnspentOutputs},enumerable:!1,configurable:!0}),t.prototype.filterUnspentOutputs=function(){if(this.selectionMode===WF.Manual)return this.allUnspentOutputs;if(0===this.allUnspentOutputs.length)return[];if(this.form.get("addresses").value&&0!==this.form.get("addresses").value.length){var t=new Map;return this.form.get("addresses").value.forEach((function(e){return t.set(e.address,!0)})),this.allUnspentOutputs.filter((function(e){return t.has(e.address)}))}return this.allUnspentOutputs},t.prototype.closeGetOutputsSubscription=function(){this.loadingUnspentOutputs=!1,this.getOutputsSubscription&&this.getOutputsSubscription.unsubscribe()},t.prototype.validateForm=function(){this.manualAddressesErrorMsg="",this.walletErrorMsg="";var t=!0;return this.selectionMode===WF.Manual?(!this.form.get("manualAddresses").value||this.form.get("manualAddresses").value.length<20)&&(t=!1,this.form.get("manualAddresses").touched&&(this.manualAddressesErrorMsg="send.addresses-error-info")):this.form.get("wallet").value||(t=!1,this.form.get("wallet").touched&&(this.walletErrorMsg="send.wallet-error-info")),t?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(gs(Sm),gs(YS),gs(MO))},t.\u0275cmp=Fe({type:t,selectors:[["app-form-source-selection"]],inputs:{busy:"busy",selectionMode:"selectionMode"},outputs:{onSelectionChanged:"onSelectionChanged"},decls:15,vars:5,consts:[[3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","manualAddresses"],[1,"help-icon",3,"matTooltip"],["formControlName","manualAddresses","id","manualAddresses",3,"appFormFieldError","blur"],["for","wallet"],[1,"-select"],["formControlName","wallet","id","wallet",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue"],[4,"ngIf"],[4,"ngFor","ngForOf"],[3,"disabled","ngValue"],[3,"for","click"],["multiple","","formControlName","addresses","id","addresses",3,"placeholder","ngClass"],["selectAddresses",""],[3,"value",4,"ngFor","ngForOf"],[3,"value"],["class","help-icon red-text",3,"matTooltip",4,"ngIf"],["multiple","","formControlName","outputs","id","outputs",3,"placeholder","ngClass"],["selectOutputs",""],[1,"help-icon","red-text",3,"matTooltip"]],template:function(t,e){1&t&&(bs(0,"div",0),uu(1,"\n "),uu(2,"\n "),ps(3,LF,12,8,"div",1),uu(4,"\n "),uu(5,"\n "),ps(6,OF,18,10,"div",1),uu(7,"\n "),uu(8,"\n "),ps(9,YF,25,16,"div",1),uu(10,"\n "),uu(11,"\n "),ps(12,jF,29,18,"div",1),uu(13,"\n"),ws(),uu(14,"\n")),2&t&&(_s("formGroup",e.form),na(3),_s("ngIf",e.selectionMode===e.sourceSelectionModes.Manual),na(3),_s("ngIf",e.selectionMode!==e.sourceSelectionModes.Manual),na(3),_s("ngIf",e.selectionMode===e.sourceSelectionModes.All),na(3),_s("ngIf",e.selectionMode!==e.sourceSelectionModes.Wallet))},directives:[rM,hS,Eh,vx,UE,Qk,iM,yS,KE,CM,xM,EM,Lh,xF,Ch,CF,sk,CC],pipes:[pC,DC],styles:[".form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{opacity:.5;margin:0!important;display:inline-block;position:relative;top:2px;margin-left:8px}.form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:12px!important;width:12px!important}"]}),t}(),zF=function(){function t(t,e){this.dialogRef=t,this.formBuilder=e,this.inputErrorMsg=""}return t.openDialog=function(e){var n=new pk;return n.autoFocus=!0,n.width=Mm.mediumModalWidth,e.open(t,n)},t.prototype.ngOnInit=function(){this.form=this.formBuilder.group({link:[""]}),this.form.setValidators(this.validateForm.bind(this))},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.process=function(){this.form.valid&&this.dialogRef.close(this.form.get("link").value)},t.prototype.validateForm=function(){this.inputErrorMsg="";var t=!0;return km(this.form.get("link").value)||(t=!1,this.form.get("link").touched&&(this.inputErrorMsg="send.fill-with-link.link-error-info")),t?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(gs(bk),gs(YS))},t.\u0275cmp=Fe({type:t,selectors:[["app-enter-link"]],decls:34,vars:19,consts:[[3,"headline","dialog"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],["for","link"],["formControlName","link","id","link",3,"appFormFieldError","keydown.enter","blur"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"disabled","action"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),uu(3,"\n "),bs(4,"div"),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),uu(8,"\n "),bs(9,"div",1),uu(10,"\n "),bs(11,"div",2),uu(12,"\n "),bs(13,"label",3),uu(14),Tl(15,"translate"),ws(),uu(16,"\n "),bs(17,"input",4),Ts("keydown.enter",(function(){return e.process()}))("blur",(function(){return e.validateForm()})),ws(),uu(18,"\n "),ws(),uu(19,"\n "),ws(),uu(20,"\n "),uu(21,"\n "),bs(22,"div",5),uu(23,"\n "),bs(24,"app-button",6),Ts("action",(function(){return e.closePopup()})),uu(25),Tl(26,"translate"),ws(),uu(27,"\n "),bs(28,"app-button",7),Ts("action",(function(){return e.process()})),uu(29),Tl(30,"translate"),ws(),uu(31,"\n "),ws(),uu(32,"\n"),ws(),uu(33,"\n")),2&t&&(_s("headline",El(1,9,"send.fill-with-link.title"))("dialog",e.dialogRef),na(5),cu("\n ",El(6,11,"send.fill-with-link.link-info"),"\n "),na(4),_s("formGroup",e.form),na(5),lu(El(15,13,"send.fill-with-link.link-label")),na(3),_s("appFormFieldError",e.inputErrorMsg),na(8),cu("\n ",El(26,15,"common.cancel-button"),"\n "),na(3),_s("disabled",!e.form.valid),na(1),cu("\n ",El(30,17,"send.fill-with-link.process-button"),"\n "))},directives:[jS,rM,hS,Qk,iM,yS,KE,Cx],pipes:[pC],styles:[""]}),t}(),UF=function(t){return t.bulk="bulk",t.link="link",t}({}),qF=function(){function t(t){this.dialogRef=t,this.destinationTools=UF}return t.openDialog=function(e){var n=new pk;return n.autoFocus=!1,n.width=Mm.mediumModalWidth,e.open(t,n)},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.select=function(t){this.dialogRef.close(t)},t.\u0275fac=function(e){return new(e||t)(gs(bk))},t.\u0275cmp=Fe({type:t,selectors:[["app-destination-tools"]],decls:31,vars:10,consts:[[3,"headline","dialog"],[1,"list-button-container","light-button-theme"],["mat-button","","color","primary",1,"top-line",3,"click"],[1,"content"],["src","assets/img/list-purple.png"],["mat-button","","color","primary",3,"click"],["src","assets/img/link-blue.png"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),bs(3,"div",1),uu(4,"\n "),bs(5,"button",2),Ts("click",(function(){return e.select(e.destinationTools.bulk)})),uu(6,"\n "),bs(7,"div",3),uu(8,"\n "),ks(9,"img",4),uu(10,"\n "),bs(11,"span"),uu(12),Tl(13,"translate"),ws(),uu(14,"\n "),ws(),uu(15,"\n "),ws(),uu(16,"\n "),bs(17,"button",5),Ts("click",(function(){return e.select(e.destinationTools.link)})),uu(18,"\n "),bs(19,"div",3),uu(20,"\n "),ks(21,"img",6),uu(22,"\n "),bs(23,"span"),uu(24),Tl(25,"translate"),ws(),uu(26,"\n "),ws(),uu(27,"\n "),ws(),uu(28,"\n "),ws(),uu(29,"\n"),ws(),uu(30,"\n")),2&t&&(_s("headline",El(1,4,"send.destination-tools-title"))("dialog",e.dialogRef),na(12),lu(El(13,6,"send.bulk-send.title")),na(12),cu("\n ",El(25,8,"send.fill-with-link.title"),"\n "))},directives:[jS,XC],pipes:[pC],styles:[".content[_ngcontent-%COMP%]{display:flex;align-items:center}.content[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:32px;width:32px;margin-right:5px}.content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}"]}),t}();function GF(t,e){if(1&t){var n=xs();bs(0,"div",2),uu(1,"\n "),bs(2,"label",10),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),bs(6,"input",11),Ts("blur",(function(){return Bn(n),Ys().validateForm()})),ws(),uu(7,"\n "),ws()}if(2&t){var i=Ys();na(3),lu(El(4,3,"send.to-label")),na(3),_s("appFormFieldError",i.isAddressValid(0)?i.singleAddressErrorMsg:"send.invalid-addresses-error"),ds("disabled",i.busy?"true":null)}}function KF(t,e){1&t&&(bs(0,"mat-icon",12),Tl(1,"translate"),uu(2,"help"),ws()),2&t&&_s("matTooltip",El(1,1,"send.destinations-help"+(Ys().showHourFields?"2":"1")))}var ZF=function(t){return{"element-disabled":t}};function JF(t,e){if(1&t){var n=xs();bs(0,"div",13),uu(1,"\n "),bs(2,"app-double-button",14),Ts("onStateChange",(function(t){return Bn(n),Ys().changeActiveCurrency(t)})),Tl(3,"commonText"),Tl(4,"translate"),ws(),uu(5,"\n "),ws()}if(2&t){var i=Ys();_s("ngClass",kl(8,ZF,i.busy)),na(2),_s("leftButtonText",El(3,4,"coin"))("rightButtonText",El(4,6,"common.usd"))("activeButton",i.selectedCurrency)}}function QF(t,e){if(1&t){var n=xs();bs(0,"app-arrow-link",15),Ts("pressed",(function(){return Bn(n),Ys().showDestinationTools()})),uu(1,"\n "),ws()}if(2&t){var i=Ys();_s("text","send.destination-tools-title")("ngClass",kl(2,ZF,i.busy))}}function XF(t,e){if(1&t){var n=xs();bs(0,"app-arrow-link",15),Ts("pressed",(function(){return Bn(n),Ys().openLinkModalWindow()})),uu(1,"\n "),ws()}if(2&t){var i=Ys();_s("text","send.fill-with-link.title")("ngClass",kl(2,ZF,i.busy))}}function $F(t,e){if(1&t){var n=xs();bs(0,"div",27),uu(1,"\n "),bs(2,"input",28),Ts("blur",(function(){return Bn(n),Ys(2).validateForm()})),ws(),uu(3,"\n "),ws()}if(2&t){var i=Ys().index,r=Ys();na(2),_s("id",0===i?"destination":"address"+i)("appFormFieldError",r.isAddressValid(i)?r.addressErrorMsgs[i]:"send.invalid-addresses-error"),ds("disabled",r.busy?"true":null)}}function tH(t,e){1&t&&(bs(0,"span"),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),lu(El(2,1,"send.invalid-amount")))}function eH(t,e){if(1&t&&(bs(0,"span"),uu(1),Tl(2,"number"),Tl(3,"translate"),ws()),2&t){var n=Ys().index,i=Ys();na(1),du("\n ~ ",Ol(2,2,i.values[n].toString(),"1.0-2")," ",El(3,5,"common.usd"),"\n ")}}function nH(t,e){if(1&t&&(bs(0,"span"),uu(1),Tl(2,"amount"),ws()),2&t){var n=Ys().index,i=Ys();na(1),cu("\n ~ ",El(2,1,i.values[n].toString()),"\n ")}}var iH=function(t){return{"-input-addon":!0,"d-none":t}};function rH(t,e){if(1&t){var n=xs();bs(0,"div",29),uu(1,"\n "),bs(2,"div",19),uu(3,"\n "),bs(4,"input",30),Ts("blur",(function(){return Bn(n),Ys(2).validateForm()})),ws(),uu(5,"\n "),bs(6,"span"),uu(7),Tl(8,"commonText"),ws(),uu(9,"\n "),ws(),uu(10,"\n "),ws()}if(2&t){var i=Ys().index,r=Ys();na(2),_s("ngClass",kl(6,iH,!r.showHourFields)),na(2),_s("appFormFieldError",r.gethoursErrorMsg(i)),ds("disabled",r.busy?"true":null),na(3),lu(El(8,4,"hours"))}}function aH(t,e){if(1&t){var n=xs();bs(0,"img",34),Ts("click",(function(){return Bn(n),Ys(3).addDestination()})),ws()}}function oH(t,e){if(1&t){var n=xs();bs(0,"img",35),Ts("click",(function(){Bn(n);var t=Ys(2).index;return Ys().removeDestination(t)})),ws()}}function sH(t,e){if(1&t&&(bs(0,"div",31),uu(1,"\n "),ps(2,aH,1,0,"img",32),uu(3,"\n "),ps(4,oH,1,0,"img",33),uu(5,"\n "),ws()),2&t){var n=Ys().index,i=Ys();_s("ngClass",kl(3,ZF,i.busy)),na(2),_s("ngIf",0===n),na(2),_s("ngIf",0!==n)}}var uH=function(t,e){return{"col-md-3":t,"col-md-12":e}},lH=function(t){return{"centerd-link":t}};function cH(t,e){if(1&t){var n=xs();bs(0,"div",16),uu(1,"\n "),bs(2,"div",17),uu(3,"\n "),uu(4,"\n "),ps(5,$F,4,3,"div",18),uu(6,"\n "),uu(7,"\n "),bs(8,"div",19),uu(9,"\n "),bs(10,"div",20),uu(11,"\n "),bs(12,"input",21),Ts("blur",(function(){return Bn(n),Ys().validateForm()})),ws(),uu(13,"\n "),bs(14,"span"),uu(15),Tl(16,"commonText"),Tl(17,"translate"),ws(),uu(18,"\n "),ws(),uu(19,"\n "),uu(20,"\n "),bs(21,"div",22),uu(22,"\n "),ps(23,tH,3,3,"span",23),uu(24,"\n "),ps(25,eH,4,7,"span",23),uu(26,"\n "),ps(27,nH,3,3,"span",23),uu(28,"\n "),bs(29,"div",24),Ts("click",(function(){Bn(n);var t=e.index;return Ys().assignAll(t)})),uu(30),Tl(31,"translate"),ws(),uu(32,"\n "),ws(),uu(33,"\n "),ws(),uu(34,"\n "),uu(35,"\n "),ps(36,rH,11,8,"div",25),uu(37,"\n "),ps(38,sH,6,5,"div",26),uu(39,"\n "),ws(),uu(40,"\n "),ws()}if(2&t){var i=e.index,r=Ys();na(2),_s("formGroupName",i),na(3),_s("ngIf",!r.showSimpleForm),na(3),_s("ngClass",Ml(19,uH,!r.showSimpleForm,r.showSimpleForm)),na(4),_s("appFormFieldError",r.getCoinsErrorMsg(i)),ds("disabled",r.busy?"true":null),na(3),lu(r.selectedCurrency===r.doubleButtonActive.LeftButton?El(16,13,"coin"):El(17,15,"common.usd")),na(8),_s("ngIf",r.price&&r.values[i].isLessThanOrEqualTo(0)),na(2),_s("ngIf",r.price&&r.values[i].isGreaterThan(0)&&r.selectedCurrency===r.doubleButtonActive.LeftButton),na(2),_s("ngIf",r.price&&r.values[i].isGreaterThan(0)&&r.selectedCurrency===r.doubleButtonActive.RightButton),na(2),_s("ngClass",kl(22,lH,!r.price)),na(1),cu("(",El(31,17,"send.send-all-available-coins-link"),")"),na(6),_s("ngIf",!r.showSimpleForm),na(2),_s("ngIf",!r.showSimpleForm)}}function dH(t,e){if(1&t&&(Ms(0),uu(1),Tl(2,"number"),Tl(3,"translate"),Ss()),2&t){var n=Ys(2);na(1),du("/ ",Ol(2,2,n.totalFiat.toString(),"1.0-2")," ",El(3,5,"common.usd"),"")}}var hH=function(t){return{"error-coins-value":t}};function fH(t,e){if(1&t&&(bs(0,"div",29),uu(1,"\n "),bs(2,"div",38),Tl(3,"translate"),uu(4,"\n "),bs(5,"span"),uu(6),Tl(7,"translate"),ws(),uu(8),Tl(9,"amount"),ws(),uu(10,"\n "),ws()),2&t){var n=Ys(2);na(2),_s("ngClass",kl(11,hH,n.insufficientHours))("matTooltip",n.insufficientHours?El(3,4,"send.insufficient-funds-error-info"):""),na(4),lu(El(7,6,"send.total-to-send")),na(2),cu(" ",Ol(9,8,n.totalHours.toString(),!1),"\n ")}}function pH(t,e){if(1&t&&(bs(0,"div",36),uu(1,"\n "),ks(2,"div",27),uu(3,"\n "),bs(4,"div",37),uu(5,"\n "),bs(6,"div",38),Tl(7,"translate"),uu(8,"\n "),bs(9,"span"),uu(10),Tl(11,"translate"),ws(),uu(12),Tl(13,"amount"),ps(14,dH,4,7,"ng-container",23),uu(15,"\n "),ws(),uu(16,"\n "),ws(),uu(17,"\n "),ps(18,fH,11,13,"div",25),uu(19,"\n "),ws()),2&t){var n=Ys();na(6),_s("ngClass",kl(12,hH,n.insufficientCoins))("matTooltip",n.insufficientCoins?El(7,6,"send.insufficient-funds-error-info"):""),na(4),lu(El(11,8,"send.total-to-send")),na(2),cu(" ",El(13,10,n.totalCoins.toString()),"\n "),na(2),_s("ngIf",n.price),na(4),_s("ngIf",n.showHourFields)}}var mH=function(t){return{"simple-form-hours-error":t}};function gH(t,e){if(1&t){var n=xs();bs(0,"div",39),uu(1,"\n "),bs(2,"span",40),Tl(3,"translate"),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),bs(7,"mat-icon",41),Ts("click",(function(){return Bn(n),Ys().removeSimpleFormhours()})),Tl(8,"translate"),uu(9,"clear"),ws(),uu(10,"\n "),ws()}if(2&t){var i=Ys();na(2),_s("ngClass",kl(12,mH,i.simpleFormHoursErrorMsg))("matTooltip",El(3,6,i.simpleFormHoursErrorMsg?i.simpleFormHoursErrorMsg:"")),na(2),du("",El(5,8,"send.specific-hours")," ",i.simpleFormSpecificHours.toString(),""),na(3),_s("inline",!0)("matTooltip",El(8,10,"send.remove-specific-hours-info"))}}var vH=function(){function t(t,e,n,i,r,a){this.appService=t,this.formBuilder=e,this.dialog=n,this.msgBarService=i,this.translate=r,this.priceService=a,this.onChanges=new Rl,this.onBulkRequested=new Rl,this.newNoteRequested=new Rl,this.manualHoursRequested=new Rl,this.hoursAddedToSimpleForm=new Rl,this.doubleButtonActive=YP,this.selectedCurrency=YP.LeftButton,this.totalCoins=new hp.BigNumber(0),this.totalFiat=new hp.BigNumber(0),this.totalHours=new hp.BigNumber(0),this.addressErrorMsgs=[],this.coinsErrorMsgs=[],this.hoursErrorMsgs=[],this.singleAddressErrorMsg="",this.simpleFormHoursErrorMsg="",this.insufficientCoins=!1,this.insufficientHours=!1,this.destinationSubscriptions=[]}return Object.defineProperty(t.prototype,"showHourFields",{get:function(){return this.showHourFieldsInternal},set:function(t){t!==this.showHourFieldsInternal&&(this.showHourFieldsInternal=t,this.form&&this.destControls.forEach((function(t){t.get("hours").setValue("")})))},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"showSimpleForm",{get:function(){return this.showSimpleFormInternal},set:function(t){this.showSimpleFormInternal=t,this.form&&(t?this.form.get("address").setValidators(cM.required):this.form.get("address").clearValidators(),this.form.get("address").updateValueAndValidity(),this.form.get("destinations").updateValueAndValidity())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"destControls",{get:function(){return this.form.get("destinations").controls},enumerable:!1,configurable:!0}),t.prototype.ngOnInit=function(){var t=this;this.form=this.formBuilder.group({address:[""],destinations:this.formBuilder.array([])}),this.form.setValidators(this.validateForm.bind(this)),this.addDestination(),this.addressSubscription=this.form.get("address").valueChanges.subscribe((function(){t.onChanges.emit()})),this.priceSubscription=this.priceService.price.subscribe((function(e){t.price=e,t.updateValuesAndValidity()}))},t.prototype.ngOnDestroy=function(){this.addressSubscription.unsubscribe(),this.priceSubscription.unsubscribe(),this.destinationSubscriptions.forEach((function(t){return t.unsubscribe()})),this.onBulkRequested.unsubscribe(),this.newNoteRequested.unsubscribe(),this.manualHoursRequested.unsubscribe(),this.hoursAddedToSimpleForm.unsubscribe()},t.prototype.changeActiveCurrency=function(t){t!==this.selectedCurrency&&(this.selectedCurrency=t,this.askIfConvertAmount(),this.updateValuesAndValidity(),this.form.get("destinations").updateValueAndValidity())},t.prototype.askIfConvertAmount=function(){var t=this,e=0;if(this.destControls.forEach((function(t){var n=t.get("coins").value;n=n?n.trim():n;var i=new hp.BigNumber(n);n&&!i.isNaN()&&(e+=1)})),0!==e){var n,i,r=this.translate.instant("common.usd"),a=this.appService.coinName;this.selectedCurrency===YP.LeftButton?(n=r,i=a):(n=a,i=r);var o={text:this.translate.instant(1===e?"send.convert-confirmation":"send.convert-confirmation-plural",{from:n,to:i}),defaultButtons:OE.YesNo};AE.openDialog(this.dialog,o).afterClosed().subscribe((function(e){e&&t.convertAmounts()}))}},t.prototype.convertAmounts=function(){var e=this;this.msgBarService.hide();var n=0,i=0;this.destControls.forEach((function(r){var a=r.get("coins").value;a=a?a.trim():a;var o=new hp.BigNumber(a);if(a){if(o.isNaN())return void(n+=1);var s;e.selectedCurrency===YP.LeftButton?((s=o.dividedBy(e.price).decimalPlaces(e.appService.currentMaxDecimals)).multipliedBy(e.price).decimalPlaces(t.MaxUsdDecimals,hp.BigNumber.ROUND_FLOOR).isEqualTo(o)||(i+=1),r.get("coins").setValue(s.toString())):((s=o.multipliedBy(e.price).decimalPlaces(t.MaxUsdDecimals,hp.BigNumber.ROUND_FLOOR)).dividedBy(e.price).decimalPlaces(e.appService.currentMaxDecimals).isEqualTo(o)||(i+=1),r.get("coins").setValue(s.toString()))}})),n>0&&i>0?this.msgBarService.showWarning(this.translate.instant("send.multiple-problems-warning")):1===n?this.msgBarService.showWarning(this.translate.instant("send.invaid-amount-warning")):n>1?this.msgBarService.showWarning(this.translate.instant("send.invaid-amounts-warning")):1===i?this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")):i>1&&this.msgBarService.showWarning(this.translate.instant("send.precision-errors-warning"))},t.prototype.assignAll=function(e){var n=this;if(this.msgBarService.hide(),this.availableBalance.availableCoins.isEqualTo(0))this.msgBarService.showError(this.translate.instant("send.no-wallet-selected-error"));else{var i=this.availableBalance.availableCoins;this.selectedCurrency===YP.RightButton&&(i=i.multipliedBy(this.price).decimalPlaces(t.MaxUsdDecimals,hp.BigNumber.ROUND_FLOOR)),this.destControls.forEach((function(t,r){if(r!==e){var a=n.getAmount(t.get("coins").value.trim(),!0);if(!a||a.isNaN())return;i=i.minus(a)}})),(i=i.decimalPlaces(this.selectedCurrency===YP.LeftButton?this.appService.currentMaxDecimals:t.MaxUsdDecimals,hp.BigNumber.ROUND_FLOOR)).isLessThanOrEqualTo(0)?this.msgBarService.showError(this.translate.instant("send.no-coins-left-error")):this.destControls[e].get("coins").setValue(i.toString())}},t.prototype.updateValuesAndValidity=function(){var t=this,e=this.selectedCurrency!==YP.LeftButton,n=this.price;this.price||(e=!1,n=0),this.values=[],this.totalCoins=new hp.BigNumber(0),this.totalFiat=new hp.BigNumber(0),this.totalHours=new hp.BigNumber(0),this.destControls.forEach((function(i,r){var a=i.get("coins").value,o=t.getAmount(a,!0);if(o)if(e)s=o.dividedBy(n).decimalPlaces(t.appService.currentMaxDecimals),t.totalCoins=t.totalCoins.plus(s),t.totalFiat=t.totalFiat.plus(o),t.values[r]=s;else{var s=o.multipliedBy(n).decimalPlaces(2);t.totalCoins=t.totalCoins.plus(o),t.totalFiat=t.totalFiat.plus(s),t.values[r]=s}else t.values[r]=new hp.BigNumber(-1);t.showHourFields&&(a=i.get("hours").value,(o=t.getAmount(a,!1))&&(t.totalHours=t.totalHours.plus(o)))})),setTimeout((function(){t.form.get("destinations").updateValueAndValidity(),t.onChanges.emit()}))},t.prototype.addDestination=function(){var t=this,e=this.formBuilder.group({address:"",coins:"",hours:""});this.destinationSubscriptions.push(e.valueChanges.subscribe((function(){t.updateValuesAndValidity()}))),this.form.get("destinations").push(e),this.addressErrorMsgs.push(""),this.coinsErrorMsgs.push(""),this.hoursErrorMsgs.push(""),this.updateValuesAndValidity()},t.prototype.removeDestination=function(t){this.form.get("destinations").removeAt(t),this.validAddressesList&&this.validAddressesList.length>t&&this.validAddressesList.splice(t,1),this.addressErrorMsgs&&this.addressErrorMsgs.length>t&&this.addressErrorMsgs.splice(t,1),this.coinsErrorMsgs&&this.coinsErrorMsgs.length>t&&this.coinsErrorMsgs.splice(t,1),this.hoursErrorMsgs&&this.hoursErrorMsgs.length>t&&this.hoursErrorMsgs.splice(t,1),this.destinationSubscriptions[t].unsubscribe(),this.destinationSubscriptions.splice(t,1),this.updateValuesAndValidity()},t.prototype.requestBulkSend=function(){this.onBulkRequested.emit()},t.prototype.showDestinationTools=function(){var t=this;qF.openDialog(this.dialog).afterClosed().subscribe((function(e){e===UF.bulk?t.requestBulkSend():e===UF.link&&t.openLinkModalWindow()}))},t.prototype.openLinkModalWindow=function(){var t=this;zF.openDialog(this.dialog).afterClosed().subscribe((function(e){e&&t.processRequestLink(e)}))},t.prototype.processRequestLink=function(t){var e=km(t);if(e){if(this.showSimpleForm&&e.hours&&!this.getAmount(e.hours,!1))return void this.msgBarService.showError("send.fill-with-link.invalid-link-hours-error");this.checkChangesBeforeUsingLink(e)}else this.msgBarService.showError("send.fill-with-link.invalid-link-error")},t.prototype.checkChangesBeforeUsingLink=function(t){var e=this,n=!1;this.showSimpleForm?this.form.get("address").value&&(n=!0):(this.destControls[0].get("address").value&&(n=!0),t.hours&&this.destControls[0].get("hours").value&&(n=!0)),t.coins&&this.destControls[0].get("coins").value&&(n=!0),n?AE.openDialog(this.dialog,{text:"send.fill-with-link.data-overwritten-alert",defaultButtons:OE.YesNo}).afterClosed().subscribe((function(n){n&&e.finishUsingRequestLink(t)})):this.finishUsingRequestLink(t)},t.prototype.finishUsingRequestLink=function(t){var e=this;this.showSimpleForm?(this.form.get("address").setValue(t.address),this.form.get("address").markAsTouched(),t.hours?(this.simpleFormSpecificHours=this.getAmount(t.hours,!1),this.hoursAddedToSimpleForm.next(!0)):this.hoursAddedToSimpleForm.next(!1)):(this.destControls[0].get("address").setValue(t.address),this.destControls[0].get("address").markAsTouched(),t.hours&&(this.manualHoursRequested.next(),setTimeout((function(){e.destControls[0].get("hours").setValue(t.hours),e.destControls[0].get("hours").markAsTouched()})))),t.coins&&(this.destControls[0].get("coins").setValue(t.coins),this.destControls[0].get("coins").markAsTouched()),t.message&&this.newNoteRequested.next(t.message),this.form.updateValueAndValidity(),this.msgBarService.showDone("send.fill-with-link.confirmation")},t.prototype.removeSimpleFormhours=function(){var t=this;AE.openDialog(this.dialog,{text:"send.remove-specific-hours-confirmation",defaultButtons:OE.YesNo}).afterClosed().subscribe((function(e){e&&(t.simpleFormSpecificHours=null,t.hoursAddedToSimpleForm.next(!1))}))},t.prototype.fill=function(t){var e=this;setTimeout((function(){e.selectedCurrency=t.form.currency;for(var n=0;n0;)this.form.get("destinations").removeAt(0);t.forEach((function(t,n){e.addDestination(),e.destControls[n].get("address").setValue(t.address),e.destControls[n].get("coins").setValue(t.coins),t.hours&&e.destControls[n].get("hours").setValue(t.hours)}))},Object.defineProperty(t.prototype,"valid",{get:function(){return this.form.valid},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"currentlySelectedCurrency",{get:function(){return this.selectedCurrency},enumerable:!1,configurable:!0}),t.prototype.setValidAddressesList=function(t){this.validAddressesList=t,this.validAddressesList&&this.validAddressesList.length>this.destControls.length&&(this.validAddressesList=this.validAddressesList.slice(0,this.destControls.length))},t.prototype.isAddressValid=function(t){return!(this.validAddressesList&&this.validAddressesList.length>t)||this.validAddressesList[t]},t.prototype.getCoinsErrorMsg=function(t){if(tthis.destControls.length;)t.pop();for(;t.lengththis.appService.currentMaxDecimals)return null}else if(2===r.length&&r[1].length>t.MaxUsdDecimals)return null}else if(!i.isEqualTo(i.decimalPlaces(0)))return null;return i},t.prototype.resetForm=function(){for(this.form.get("address").setValue("");this.destControls.length>0;)this.form.get("destinations").removeAt(0);this.addDestination(),this.updateValuesAndValidity()},t.MaxUsdDecimals=6,t.\u0275fac=function(e){return new(e||t)(gs(Sm),gs(YS),gs(Dk),gs(Gx),gs(hC),gs(nP))},t.\u0275cmp=Fe({type:t,selectors:[["app-form-destination"]],inputs:{availableBalance:"availableBalance",busy:"busy",showHourFields:"showHourFields",showSimpleForm:"showSimpleForm"},outputs:{onChanges:"onChanges",onBulkRequested:"onBulkRequested",newNoteRequested:"newNoteRequested",manualHoursRequested:"manualHoursRequested",hoursAddedToSimpleForm:"hoursAddedToSimpleForm"},decls:33,vars:12,consts:[[3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","destination",1,"destinations-label"],["class","help-icon",3,"matTooltip",4,"ngIf"],["class","coin-selector-container",3,"ngClass",4,"ngIf"],[3,"text","ngClass","pressed",4,"ngIf"],["formArrayName","destinations","class","-destination",4,"ngFor","ngForOf"],["class","row",4,"ngIf"],["class","form-field simple-form-hours",4,"ngIf"],["for","address"],["formControlName","address","id","address",3,"appFormFieldError","blur"],[1,"help-icon",3,"matTooltip"],[1,"coin-selector-container",3,"ngClass"],["className","light small",3,"leftButtonText","rightButtonText","activeButton","onStateChange"],[3,"text","ngClass","pressed"],["formArrayName","destinations",1,"-destination"],[1,"row",3,"formGroupName"],["class","col-lg-5 col-md-4",4,"ngIf"],[3,"ngClass"],[1,"-input-addon"],["formControlName","coins",3,"appFormFieldError","blur"],[1,"coins-value-label"],[4,"ngIf"],[1,"link",3,"ngClass","click"],["class","col-lg-3 col-md-4",4,"ngIf"],["class","col-md-1 -icons",3,"ngClass",4,"ngIf"],[1,"col-lg-5","col-md-4"],["formControlName","address",3,"id","appFormFieldError","blur"],[1,"col-lg-3","col-md-4"],["formControlName","hours",3,"appFormFieldError","blur"],[1,"col-md-1","-icons",3,"ngClass"],["class","image-button","src","assets/img/plus-green.png","alt","plus",3,"click",4,"ngIf"],["class","image-button","src","assets/img/minus-grey.png","alt","minus",3,"click",4,"ngIf"],["src","assets/img/plus-green.png","alt","plus",1,"image-button",3,"click"],["src","assets/img/minus-grey.png","alt","minus",1,"image-button",3,"click"],[1,"row"],[1,"col-md-3"],["matTooltipClass","error-tooltip",1,"coins-value-label",3,"ngClass","matTooltip"],[1,"form-field","simple-form-hours"],["matTooltipClass","error-tooltip",3,"ngClass","matTooltip"],[1,"remove-icon",3,"inline","matTooltip","click"]],template:function(t,e){1&t&&(bs(0,"div",0),uu(1,"\n "),uu(2,"\n "),ps(3,GF,8,5,"div",1),uu(4,"\n\n "),bs(5,"div",2),uu(6,"\n "),uu(7,"\n "),bs(8,"label",3),uu(9),Tl(10,"translate"),ps(11,KF,3,3,"mat-icon",4),uu(12,"\n "),ws(),uu(13,"\n "),uu(14,"\n "),ps(15,JF,6,10,"div",5),uu(16,"\n\n "),uu(17,"\n "),ps(18,QF,2,4,"app-arrow-link",6),uu(19,"\n\n "),uu(20,"\n "),ps(21,XF,2,4,"app-arrow-link",6),uu(22,"\n\n "),uu(23,"\n "),ps(24,cH,41,24,"div",7),uu(25,"\n "),ps(26,pH,20,14,"div",8),uu(27,"\n "),ws(),uu(28,"\n\n "),uu(29,"\n "),ps(30,gH,11,14,"div",9),uu(31,"\n"),ws(),uu(32,"\n")),2&t&&(_s("formGroup",e.form),na(3),_s("ngIf",e.showSimpleForm),na(6),cu("\n ",El(10,10,e.showSimpleForm?"send.amount-label":"send.destinations-label"),"\n "),na(2),_s("ngIf",!e.showSimpleForm),na(4),_s("ngIf",e.price),na(3),_s("ngIf",!e.showSimpleForm),na(3),_s("ngIf",e.showSimpleForm),na(3),_s("ngForOf",e.destControls),na(2),_s("ngIf",e.destControls.length>1),na(4),_s("ngIf",e.showSimpleForm&&e.simpleFormSpecificHours))},directives:[rM,hS,Eh,Lh,Qk,iM,yS,KE,vx,UE,Ch,RP,RI,gS,pS],pipes:[pC,pY,af,DC],styles:[".-destination[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%]{text-align:right;padding-top:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.destinations-label[_ngcontent-%COMP%]{display:inline-block}.coin-selector-container[_ngcontent-%COMP%]{display:inline-block;margin-left:5px;margin-bottom:5px}.coins-value-label[_ngcontent-%COMP%]{font-size:11px;margin-top:1px;padding:3px 10px;background-color:#f7f7f7;border-radius:6px}.coins-value-label[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{opacity:.5}.coins-value-label[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{display:inline-block;margin-bottom:3px;margin-top:-5px}.coins-value-label[_ngcontent-%COMP%] .centerd-link[_ngcontent-%COMP%]{width:100%;text-align:center}.error-coins-value[_ngcontent-%COMP%]{background-color:#ff004e!important;color:#fafafa!important}.-input-addon[_ngcontent-%COMP%]{display:flex}.-input-addon[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{border-top-right-radius:0;border-bottom-right-radius:0}.-input-addon[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border:2px;border-radius:0 6px 6px 0;background:rgba(30,34,39,.05);padding:0 10px;line-height:44px;color:rgba(30,34,39,.5);font-size:13px;flex-shrink:0}.simple-form-hours[_ngcontent-%COMP%]{display:flex;align-items:center}.simple-form-hours[_ngcontent-%COMP%] .remove-icon[_ngcontent-%COMP%]{margin-left:2px;color:#ff004e;cursor:pointer}.simple-form-hours-error[_ngcontent-%COMP%]{color:#ff004e}"]}),t}(),_H=["formSourceSelection"],yH=["formMultipleDestinations"],bH=["previewButton"],wH=["sendButton"],kH=function(t){return{"element-disabled":t}};function MH(t,e){if(1&t){var n=xs();bs(0,"div",15),uu(1,"\n "),uu(2,"\n "),bs(3,"app-double-button",16),Ts("onStateChange",(function(t){return Bn(n),Ys().changeFormType(t)})),Tl(4,"translate"),Tl(5,"translate"),ws(),uu(6,"\n"),ws()}if(2&t){var i=Ys();na(3),_s("changeActiveButtonManually",!0)("leftButtonText",El(4,5,"send.signed-button"))("rightButtonText",El(5,7,"send.unsigned-button"))("activeButton",i.showForManualUnsigned?i.doubleButtonActive.RightButton:i.doubleButtonActive.LeftButton)("ngClass",kl(9,kH,i.busy))}}function SH(t,e){if(1&t&&(Ms(0),uu(1,"\n "),bs(2,"span"),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),bs(6,"span",19),uu(7),Tl(8,"amount"),ws(),uu(9,"\n "),bs(10,"span"),uu(11),Tl(12,"translate"),ws(),uu(13,"\n "),bs(14,"span",19),uu(15),Tl(16,"amount"),ws(),uu(17,"\n "),bs(18,"span"),uu(19),Tl(20,"translate"),ws(),uu(21,"\n "),bs(22,"span",19),uu(23),Tl(24,"amount"),ws(),uu(25,"\n "),bs(26,"span"),uu(27),Tl(28,"translate"),ws(),uu(29,"\n "),Ss()),2&t){var n=Ys(2);na(3),lu(El(4,7,"send.available-funds-msg-part1")),na(4),cu("\n ",El(8,9,n.availableBalance.availableCoins.toString()),"\n "),na(4),lu(El(12,11,"send.available-funds-msg-part2")),na(4),cu("\n ",Ol(16,13,n.availableBalance.availableHours.toString(),!1),"\n "),na(4),lu(El(20,16,"send.available-funds-msg-part3")),na(4),cu("\n ",Ol(24,18,n.availableBalance.minimumFee.toString(),!1),"\n "),na(4),lu(El(28,21,"send.available-funds-msg-part4"))}}function CH(t,e){1&t&&(Ms(0),uu(1,"\n "),bs(2,"span"),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),Ss()),2&t&&(na(3),lu(El(4,1,"common.loading")))}function xH(t,e){if(1&t&&(bs(0,"div",17),uu(1,"\n "),ps(2,SH,30,23,"ng-container",18),uu(3,"\n "),ps(4,CH,6,3,"ng-container",18),uu(5,"\n "),ws()),2&t){var n=Ys();na(2),_s("ngIf",!n.availableBalance.loading),na(2),_s("ngIf",n.availableBalance.loading)}}function DH(t,e){if(1&t){var n=xs();bs(0,"div",20),uu(1,"\n "),bs(2,"label",21),uu(3),Tl(4,"translate"),bs(5,"mat-icon",22),Tl(6,"translate"),uu(7,"help"),ws(),uu(8,"\n "),bs(9,"app-arrow-link",23),Ts("pressed",(function(t){return Bn(n),Ys().selectChangeAddress(t)})),uu(10,"\n "),ws(),uu(11,"\n "),ws(),uu(12,"\n "),bs(13,"input",24),Ts("keydown.enter",(function(){Bn(n);var t=Ys();return t.showForManualUnsigned?t.preview():null}))("blur",(function(){return Bn(n),Ys().validateForm()})),ws(),uu(14,"\n "),ws()}if(2&t){var i=Ys();na(3),cu("\n ",El(4,6,"send.change-address-label"),"\n "),na(2),_s("matTooltip",El(6,8,"send.change-address-help")),na(4),_s("text","send.change-address-select-from-list-link")("ngClass",kl(10,kH,i.busy)),na(4),_s("appFormFieldError",i.invalidChangeAddress?"send.invalid-addresses-error":i.changeAddressErrorMsg),ds("disabled",i.busy?"true":null)}}function LH(t,e){if(1&t){var n=xs();bs(0,"div",20),uu(1,"\n "),bs(2,"label",25),uu(3),Tl(4,"translate"),bs(5,"mat-icon",22),Tl(6,"translate"),uu(7,"help"),ws(),uu(8,"\n "),ws(),uu(9,"\n "),bs(10,"input",26),Ts("keydown.enter",(function(){return Bn(n),Ys().preview()})),ws(),uu(11,"\n "),ws()}if(2&t){var i=Ys();na(3),cu("\n ",El(4,4,"send.personal-note-label"),"\n "),na(2),_s("matTooltip",El(6,6,"send.personal-note-help")),na(5),_s("maxlength",i.maxNoteChars),ds("disabled",i.busy?"true":null)}}function TH(t,e){if(1&t){var n=xs();bs(0,"app-arrow-link",28),Ts("pressed",(function(t){return Bn(n),Ys(2).toggleOptions(t)})),uu(1,"\n "),ws()}if(2&t){var i=Ys(2);_s("noPadding",!0)("text","send.coin-hours-options-link")("pointDown",!i.showAutoHourDistributionOptions)}}function EH(t,e){if(1&t&&(bs(0,"div",20),uu(1,"\n "),ps(2,TH,2,3,"app-arrow-link",27),uu(3,"\n "),ws()),2&t){var n=Ys();na(2),_s("ngIf",n.showSimpleForm)}}function OH(t,e){1&t&&Cs(0)}var AH=function(t){return{"d-none":t}};function PH(t,e){if(1&t&&(bs(0,"div",29),uu(1,"\n "),ps(2,OH,1,0,"ng-container",30),uu(3,"\n "),ws()),2&t){var n=Ys(),i=ms(47);_s("ngClass",kl(2,AH,!n.showAutoHourDistributionOptions)),na(2),_s("ngTemplateOutlet",i)}}function IH(t,e){if(1&t){var n=xs();bs(0,"app-arrow-link",36),Ts("mousedown",(function(t){return Bn(n),t.stopPropagation()}))("pressed",(function(t){return Bn(n),Ys(2).toggleOptions(t)})),uu(1,"\n "),ws()}if(2&t){var i=Ys(2);_s("text","send.options-link")("pointDown",!i.showAutoHourDistributionOptions)}}function YH(t,e){1&t&&Cs(0)}var RH=function(t){return{coinHoursName:t}},FH=function(t){return{"row -options-wrapper":!0,"d-none":t}};function HH(t,e){if(1&t){var n=xs();bs(0,"div",20),uu(1,"\n "),bs(2,"div",31),uu(3,"\n "),bs(4,"div",32),uu(5,"\n "),bs(6,"mat-checkbox",33),Ts("change",(function(t){return Bn(n),Ys().setAutoHours(t)})),uu(7,"\n "),bs(8,"span"),uu(9),Tl(10,"translate"),ws(),uu(11,"\n "),ps(12,IH,2,2,"app-arrow-link",34),uu(13,"\n "),ws(),uu(14,"\n "),ws(),uu(15,"\n "),ws(),uu(16,"\n\n "),uu(17,"\n "),bs(18,"div",35),uu(19,"\n "),ps(20,YH,1,0,"ng-container",30),uu(21,"\n "),ws(),uu(22,"\n "),ws()}if(2&t){var i=Ys(),r=ms(47);na(2),_s("ngClass",kl(9,kH,i.busy)),na(4),_s("checked",i.autoHours),na(3),lu(Ol(10,6,"send.hours-allocation-check",kl(11,RH,i.appService.hoursName))),na(3),_s("ngIf",i.autoHours),na(6),_s("ngClass",kl(13,FH,!i.showAutoHourDistributionOptions)),na(2),_s("ngTemplateOutlet",r)}}function BH(t,e){if(1&t){var n=xs();uu(0,"\n "),bs(1,"div",37),uu(2,"\n "),bs(3,"div",20),uu(4,"\n "),bs(5,"label",38),uu(6,"\n "),bs(7,"span"),uu(8),Tl(9,"translate"),bs(10,"mat-icon",22),Tl(11,"translate"),uu(12,"help"),ws(),uu(13,"\n "),ws(),uu(14,"\n "),bs(15,"span"),uu(16),Tl(17,"number"),ws(),uu(18,"\n "),ws(),uu(19,"\n "),bs(20,"mat-slider",39),Ts("input",(function(t){return Bn(n),Ys().setShareValue(t)})),ws(),uu(21,"\n "),ws(),uu(22,"\n "),ws(),uu(23,"\n")}if(2&t){var i=Ys();na(8),cu("\n ",Ol(9,5,"send.hours-share-factor-label",kl(14,RH,i.appService.hoursName)),"\n "),na(2),_s("matTooltip",Ol(11,8,"send.hours-share-factor-help",kl(16,RH,i.appService.hoursName))),na(6),lu(Ol(17,11,i.autoShareValue,"1.0-2")),na(4),_s("value",i.autoShareValue)("ngClass",kl(18,kH,i.busy))}}var jH=function(){function t(t,e,n,i,r,a,o,s,u,l){this.appService=t,this.blockchainService=e,this.dialog=n,this.msgBarService=i,this.navBarSwitchService=r,this.hwWalletService=a,this.translate=o,this.changeDetector=s,this.spendingService=u,this.walletsAndAddressesService=l,this.defaultAutoShareValue="0.5",this.onFormSubmitted=new Rl,this.sourceSelectionModes=WF,this.doubleButtonActive=YP,this.maxNoteChars=kR.MAX_NOTE_CHARS,this.availableBalance=new NF,this.autoHours=!0,this.hoursAddedToSimpleForm=!1,this.showAutoHourDistributionOptions=!1,this.autoShareValue=this.defaultAutoShareValue,this.busy=!1,this.showForManualUnsigned=!1,this.changeAddressErrorMsg="",this.invalidChangeAddress=!1}return t.prototype.ngOnInit=function(){var t=this;this.form=new tS({}),this.form.addControl("changeAddress",new $M("")),this.form.addControl("note",new $M("")),this.form.setValidators(this.validateForm.bind(this)),this.formData&&setTimeout((function(){return t.fillForm()}))},t.prototype.ngOnDestroy=function(){this.processingSubscription&&!this.processingSubscription.closed&&this.processingSubscription.unsubscribe(),this.closeSyncCheckSubscription(),this.msgBarService.hide()},t.prototype.sourceSelectionChanged=function(){this.selectedSources=this.formSourceSelection.selectedSources,this.availableBalance=this.formSourceSelection.availableBalance,this.formMultipleDestinations.updateValuesAndValidity(),this.form.updateValueAndValidity()},t.prototype.destinationsChanged=function(){var t=this;setTimeout((function(){t.form.updateValueAndValidity()}))},t.prototype.preview=function(){this.checkBeforeCreatingTx(!0),this.changeDetector.detectChanges()},t.prototype.send=function(){this.checkBeforeCreatingTx(!1)},t.prototype.changeFormType=function(t){var e=this;t===YP.LeftButton&&!this.showForManualUnsigned||t===YP.RightButton&&this.showForManualUnsigned||(t===YP.RightButton?AE.openDialog(this.dialog,{text:"send.unsigned-confirmation",defaultButtons:OE.YesNo}).afterClosed().subscribe((function(t){t&&(e.showForManualUnsigned=!0)})):this.showForManualUnsigned=!1)},t.prototype.setShareValue=function(t){this.autoShareValue=parseFloat(t.value).toFixed(2)},t.prototype.selectChangeAddress=function(){var t=this;bR.openDialog(this.dialog).afterClosed().subscribe((function(e){e&&t.form.get("changeAddress").setValue(e)}))},t.prototype.openMultipleDestinationsPopup=function(){var t=this,e="";this.formMultipleDestinations.getDestinations(!1).map((function(n){(n.address.trim().length>0||n.originalAmount.trim().length>0||!t.autoHours&&n.hours.trim().length>0)&&(e+=n.address.replace(",",""),e+=", "+n.originalAmount.replace(",",""),t.autoHours||(e+=", "+n.hours.replace(",","")),e+="\r\n")})),MR.openDialog(this.dialog,e).afterClosed().subscribe((function(e){e&&(e.length>0?(t.autoHours=void 0===e[0].hours,setTimeout((function(){return t.formMultipleDestinations.setDestinations(e)}))):t.formMultipleDestinations.resetForm())}))},t.prototype.changeNote=function(t){this.form.get("note").setValue(t),this.form.get("note").markAsTouched(),this.form.updateValueAndValidity()},t.prototype.setManualHours=function(){this.autoHours=!1},t.prototype.changeHoursAddedToSimpleForm=function(t){this.hoursAddedToSimpleForm=t},t.prototype.toggleOptions=function(t){var e=this;t.stopPropagation(),t.preventDefault(),this.showAutoHourDistributionOptions&&this.autoShareValue!==this.defaultAutoShareValue?AE.openDialog(this.dialog,{text:"send.close-hours-share-factor-alert",defaultButtons:OE.YesNo}).afterClosed().subscribe((function(t){t&&(e.autoShareValue=e.defaultAutoShareValue,e.showAutoHourDistributionOptions=!e.showAutoHourDistributionOptions)})):(this.autoShareValue=this.defaultAutoShareValue,this.showAutoHourDistributionOptions=!this.showAutoHourDistributionOptions)},t.prototype.setAutoHours=function(t){this.autoHours=t.checked,this.formMultipleDestinations.updateValuesAndValidity(),this.autoHours||(this.showAutoHourDistributionOptions=!1)},t.prototype.fillForm=function(){var t=this;this.showForManualUnsigned=this.formData.showForManualUnsigned,this.formSourceSelection.fill(this.formData),this.formMultipleDestinations.fill(this.formData),["changeAddress","note"].forEach((function(e){t.form.get(e).setValue(t.formData.form[e])})),this.showSimpleForm||this.formData.form.hoursSelection.type===UY.Auto?(this.autoShareValue=this.formData.form.hoursSelection.share_factor?this.formData.form.hoursSelection.share_factor:this.defaultAutoShareValue,this.autoHours=!0):this.autoHours=!1,this.showAutoHourDistributionOptions=this.formData.form.showAutoHourDistributionOptions},t.prototype.validateForm=function(){this.changeAddressErrorMsg="";var t=!0,e=this.form.get("changeAddress").value;return e&&e.length<20&&(t=!1,this.form.get("changeAddress").touched&&(this.changeAddressErrorMsg="send.address-error-info")),this.formSourceSelection&&this.formSourceSelection.valid&&this.formMultipleDestinations&&this.formMultipleDestinations.valid||(t=!1),t?null:{Invalid:!0}},t.prototype.checkBeforeCreatingTx=function(t){var e=this;!this.form.valid||this.previewButton.isLoading()||this.sendButton.isLoading()||(this.closeSyncCheckSubscription(),this.syncCheckSubscription=this.blockchainService.progress.pipe(Ap()).subscribe((function(n){n.synchronized?e.checkHoursBeforeCreatingTx(t):AE.openDialog(e.dialog,{text:"send.synchronizing-warning",defaultButtons:OE.YesNo}).afterClosed().subscribe((function(n){n&&e.checkHoursBeforeCreatingTx(t)}))})))},t.prototype.checkHoursBeforeCreatingTx=function(t){var e=this;if(this.form.valid&&!this.previewButton.isLoading()&&!this.sendButton.isLoading()){var n,i=new hp.BigNumber(0),r=new hp.BigNumber(0);if(this.formMultipleDestinations.getDestinations(!0).forEach((function(t){i=i.plus(t.coins),e.autoHours||(r=r.plus(t.hours))})),i.isEqualTo(this.availableBalance.availableCoins)||r.isEqualTo(this.availableBalance.availableHours)||1===Number(this.autoShareValue)&&this.autoHours)n=r.isEqualTo(this.availableBalance.availableHours)?"send.sending-all-hours-waning":i.isEqualTo(this.availableBalance.availableCoins)?this.formSourceSelection.wallet.coins.isEqualTo(this.availableBalance.availableCoins)?"send.sending-all-hours-with-coins-waning":"send.advanced-sending-all-hours-with-coins-waning":this.formSourceSelection.wallet.coins.isEqualTo(this.availableBalance.availableCoins)?"send.high-hours-share-waning":"send.advanced-high-hours-share-waning",AE.openDialog(this.dialog,{headerText:"common.warning-title",redTitle:!0,text:n,defaultButtons:OE.YesNo}).afterClosed().subscribe((function(n){n&&e.prepareTransaction(t)}));else this.prepareTransaction(t)}},t.prototype.prepareTransaction=function(t){var e=this;this.msgBarService.hide(),this.previewButton.resetState(),this.sendButton.resetState(),this.showForManualUnsigned||!this.selectedSources.wallet.encrypted||this.selectedSources.wallet.isHardware||t?t||this.showForManualUnsigned||!this.selectedSources.wallet.isHardware?this.createTransaction(t):(this.showBusy(t),this.processingSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.selectedSources.wallet.addresses[0].address).subscribe((function(){return e.createTransaction(t)}),(function(t){return e.showError(t)}))):MI.openDialog(this.dialog,{wallet:this.selectedSources.wallet}).componentInstance.passwordSubmit.subscribe((function(n){e.createTransaction(t,n)}))},t.prototype.createTransaction=function(t,e){var n,i=this;this.showBusy(t),n=this.showForManualUnsigned?this.selectedSources.manualAddresses:this.selectedSources.addresses&&this.selectedSources.addresses.length>0?this.selectedSources.addresses.map((function(t){return t.address})):null;var r=this.selectedSources.unspentOutputs&&this.selectedSources.unspentOutputs.length>0?this.selectedSources.unspentOutputs.map((function(t){return t.hash})):null,a=this.formMultipleDestinations.getDestinations(!0);this.formMultipleDestinations.setValidAddressesList(null),this.invalidChangeAddress=!1;var o=this.form.get("changeAddress").value,s=a.map((function(t){return t.address}));o&&s.push(o),this.processingSubscription=zk(s.map((function(t){return i.walletsAndAddressesService.verifyAddress(t)}))).pipe(st((function(s){if(o&&(i.invalidChangeAddress=!s.pop(),i.invalidChangeAddress))return ap(i.translate.instant("send.change-address-error-info"));var u=0;return s.forEach((function(t){t||(u+=1)})),0===u?i.spendingService.createTransaction(i.selectedSources.wallet,n||i.selectedSources.wallet.addresses.map((function(t){return t.address})),r,a,i.hoursSelection,i.form.get("changeAddress").value?i.form.get("changeAddress").value:null,e?e.password:null,t||i.showForManualUnsigned):(i.formMultipleDestinations.setValidAddressesList(s),ap(i.translate.instant(a.length>1?u===a.length?"send.all-addresses-invalid-error":1===u?"send.one-invalid-address-error":"send.various-invalid-addresses-error":"send.invalid-address-error")))}))).subscribe((function(n){e&&e.close();var r=i.form.value.note.trim();if(n.note=r,t){var o=new hp.BigNumber("0");a.map((function(t){return o=o.plus(t.coins)})),i.onFormSubmitted.emit({form:{wallet:i.selectedSources.wallet,addresses:i.selectedSources.addresses,manualAddresses:i.selectedSources.manualAddresses,changeAddress:i.form.get("changeAddress").value,destinations:a,hoursSelection:i.hoursSelection,showAutoHourDistributionOptions:i.showAutoHourDistributionOptions,allUnspentOutputs:i.formSourceSelection.unspentOutputsList,outputs:i.selectedSources.unspentOutputs,currency:i.formMultipleDestinations.currentlySelectedCurrency,note:r},amount:o,to:a.map((function(t){return t.address})),transaction:n,showForManualUnsigned:i.showForManualUnsigned}),i.busy=!1,i.navBarSwitchService.enableSwitch()}else i.showForManualUnsigned?WY.openDialog(i.dialog,{rawTx:n.encoded,isUnsigned:!0}).afterClosed().subscribe((function(){i.resetState(),AE.openDialog(i.dialog,{text:"offline-transactions.copy-tx.reset-confirmation",defaultButtons:OE.YesNo}).afterClosed().subscribe((function(t){t&&(i.resetForm(),i.msgBarService.showDone("offline-transactions.copy-tx.reset-done",4e3))}))})):i.processingSubscription=i.spendingService.injectTransaction(n.encoded,r).subscribe((function(t){var e=!0;r&&!t&&(i.msgBarService.showWarning(i.translate.instant("send.saving-note-error")),e=!1),i.showSuccess(e)}),(function(t){return i.showError(t)}))}),(function(t){e&&e.error(t),i.showError(t)}))},t.prototype.resetForm=function(){this.formSourceSelection.resetForm(),this.formMultipleDestinations.resetForm(),this.form.get("changeAddress").setValue(""),this.form.get("note").setValue(""),this.autoHours=!0,this.showAutoHourDistributionOptions=!1,this.autoShareValue=this.defaultAutoShareValue},Object.defineProperty(t.prototype,"hoursSelection",{get:function(){var t={type:UY.Manual};return this.autoHours&&!this.hoursAddedToSimpleForm&&(t={type:UY.Auto,mode:"share",share_factor:this.autoShareValue}),t},enumerable:!1,configurable:!0}),t.prototype.closeSyncCheckSubscription=function(){this.syncCheckSubscription&&this.syncCheckSubscription.unsubscribe()},t.prototype.showBusy=function(t){t?(this.previewButton.setLoading(),this.sendButton.setDisabled()):(this.sendButton.setLoading(),this.previewButton.setDisabled()),this.busy=!0,this.navBarSwitchService.disableSwitch()},t.prototype.showSuccess=function(t){var e=this;this.busy=!1,this.navBarSwitchService.enableSwitch(),this.resetForm(),t?(this.msgBarService.showDone("send.sent"),this.sendButton.resetState()):(this.sendButton.setSuccess(),setTimeout((function(){e.sendButton.resetState()}),3e3))},t.prototype.showError=function(t){this.busy=!1,this.msgBarService.showError(t),this.navBarSwitchService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},t.prototype.resetState=function(){this.busy=!1,this.navBarSwitchService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},t.\u0275fac=function(e){return new(e||t)(gs(Sm),gs(SO),gs(Dk),gs(Gx),gs(FP),gs(jk),gs(hC),gs(Lo),gs(qY),gs(hD))},t.\u0275cmp=Fe({type:t,selectors:[["app-send-coins-form"]],viewQuery:function(t,e){var n;1&t&&(Zl(_H,!0),Zl(yH,!0),Zl(bH,!0),Zl(wH,!0)),2&t&&(Gl(n=tc())&&(e.formSourceSelection=n.first),Gl(n=tc())&&(e.formMultipleDestinations=n.first),Gl(n=tc())&&(e.previewButton=n.first),Gl(n=tc())&&(e.sendButton=n.first))},inputs:{formData:"formData",showSimpleForm:"showSimpleForm"},outputs:{onFormSubmitted:"onFormSubmitted"},decls:49,vars:22,consts:[["class","mode-selector",4,"ngIf"],[3,"formGroup"],[3,"busy","selectionMode","onSelectionChanged"],["formSourceSelection",""],["class","form-field -available-msg",4,"ngIf"],[3,"availableBalance","busy","showHourFields","showSimpleForm","onChanges","onBulkRequested","newNoteRequested","manualHoursRequested","hoursAddedToSimpleForm"],["formMultipleDestinations",""],["class","form-field",4,"ngIf"],["class","form-field row -options-wrapper",3,"ngClass",4,"ngIf"],[1,"text-center"],[3,"disabled","action"],["previewButton",""],[1,"primary-button",3,"disabled","action"],["sendButton",""],["hoursSelector",""],[1,"mode-selector"],["className","light small",3,"changeActiveButtonManually","leftButtonText","rightButtonText","activeButton","ngClass","onStateChange"],[1,"form-field","-available-msg"],[4,"ngIf"],[1,"value"],[1,"form-field"],["for","change-address"],[1,"help-icon",3,"matTooltip"],[3,"text","ngClass","pressed"],["formControlName","changeAddress","id","change-address",3,"appFormFieldError","keydown.enter","blur"],["for","note"],["formControlName","note","id","note",3,"maxlength","keydown.enter"],[3,"noPadding","text","pointDown","pressed",4,"ngIf"],[3,"noPadding","text","pointDown","pressed"],[1,"form-field","row","-options-wrapper",3,"ngClass"],[4,"ngTemplateOutlet"],[1,"row",3,"ngClass"],[1,"col-12"],[1,"-check",3,"checked","change"],[3,"text","pointDown","mousedown","pressed",4,"ngIf"],[3,"ngClass"],[3,"text","pointDown","mousedown","pressed"],[1,"col-md-7"],["for","value",1,"-space-between"],["min","0","max","1","step","0.01","id","value",3,"value","ngClass","input"]],template:function(t,e){1&t&&(ps(0,MH,7,11,"div",0),uu(1,"\n\n"),bs(2,"div",1),uu(3,"\n "),uu(4,"\n "),bs(5,"app-form-source-selection",2,3),Ts("onSelectionChanged",(function(){return e.sourceSelectionChanged()})),uu(7,"\n "),ws(),uu(8,"\n\n "),uu(9,"\n "),ps(10,xH,6,2,"div",4),uu(11,"\n\n "),uu(12,"\n "),bs(13,"app-form-destination",5,6),Ts("onChanges",(function(){return e.destinationsChanged()}))("onBulkRequested",(function(){return e.openMultipleDestinationsPopup()}))("newNoteRequested",(function(t){return e.changeNote(t)}))("manualHoursRequested",(function(){return e.setManualHours()}))("hoursAddedToSimpleForm",(function(t){return e.changeHoursAddedToSimpleForm(t)})),uu(15,"\n "),ws(),uu(16,"\n\n "),uu(17,"\n "),ps(18,DH,15,12,"div",7),uu(19,"\n\n "),uu(20,"\n "),ps(21,LH,12,8,"div",7),uu(22,"\n\n "),uu(23,"\n "),ps(24,EH,4,1,"div",7),uu(25,"\n\n "),ps(26,PH,4,4,"div",8),uu(27,"\n\n "),uu(28,"\n "),ps(29,HH,23,15,"div",7),uu(30,"\n"),ws(),uu(31,"\n\n"),uu(32,"\n"),bs(33,"div",9),uu(34,"\n "),bs(35,"app-button",10,11),Ts("action",(function(){return e.preview()})),uu(37),Tl(38,"translate"),ws(),uu(39,"\n "),bs(40,"app-button",12,13),Ts("action",(function(){return e.send()})),uu(42),Tl(43,"translate"),ws(),uu(44,"\n"),ws(),uu(45,"\n\n"),ps(46,BH,24,20,"ng-template",null,14,rc),uu(48,"\n")),2&t&&(_s("ngIf",!e.showSimpleForm),na(2),_s("formGroup",e.form),na(3),_s("busy",e.busy)("selectionMode",e.showSimpleForm?e.sourceSelectionModes.Wallet:e.showForManualUnsigned?e.sourceSelectionModes.Manual:e.sourceSelectionModes.All),na(5),_s("ngIf",!e.showSimpleForm),na(3),_s("availableBalance",e.availableBalance)("busy",e.busy)("showHourFields",!e.autoHours)("showSimpleForm",e.showSimpleForm),na(5),_s("ngIf",!e.showSimpleForm),na(3),_s("ngIf",!e.showForManualUnsigned),na(3),_s("ngIf",e.showSimpleForm&&!e.hoursAddedToSimpleForm),na(2),_s("ngIf",e.showSimpleForm&&!e.hoursAddedToSimpleForm),na(3),_s("ngIf",!e.showSimpleForm),na(6),_s("disabled",!e.form.valid),na(2),cu("\n ",El(38,18,"send.preview-button"),"\n "),na(3),_s("disabled",!e.form.valid),na(2),cu("\n ",El(43,20,"send."+(e.showForManualUnsigned?"show":"send")+"-button"),"\n "))},styles:[".mode-selector[_ngcontent-%COMP%]{text-align:right;height:0}.mode-selector[_ngcontent-%COMP%] app-double-button[_ngcontent-%COMP%]{display:inline-block;position:relative;top:-27px;right:-27px}.-options-wrapper[_ngcontent-%COMP%]{margin-top:20px}.-space-between[_ngcontent-%COMP%]{display:flex;justify-content:space-between}.-available-msg[_ngcontent-%COMP%]{background-color:#f7f7f7;border:1px dotted rgba(30,34,39,.2);border-radius:6px;padding:10px;font-size:11px;text-align:center}.-available-msg[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{opacity:.7}.-available-msg[_ngcontent-%COMP%] .value[_ngcontent-%COMP%]{opacity:1!important;font-weight:700;font-size:13px}"]}),t}(),NH=function(){function t(){}return t.prototype.transform=function(t){return PI.unix(t).format("YYYY-MM-DD HH:mm")},t.\u0275fac=function(e){return new(e||t)},t.\u0275pipe=Ue({name:"dateTime",type:t,pure:!0}),t}();function WH(t,e){1&t&&(bs(0,"h4"),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),lu(El(2,1,"tx.confirm-transaction-title")))}function VH(t,e){1&t&&(bs(0,"h4"),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),lu(El(2,1,"tx.transaction-title")))}function zH(t,e){if(1&t&&(Ms(0),uu(1,"\n "),bs(2,"div",4),uu(3,"\n "),bs(4,"span"),uu(5),Tl(6,"translate"),ws(),uu(7," "),bs(8,"span"),uu(9),ws(),uu(10,"\n "),ws(),uu(11,"\n "),bs(12,"div",4),uu(13,"\n "),bs(14,"span"),uu(15),Tl(16,"translate"),ws(),uu(17," "),bs(18,"span"),uu(19),ws(),uu(20,"\n "),ws(),uu(21,"\n "),Ss()),2&t){var n=Ys();na(5),lu(El(6,4,"tx.from-small-label")),na(4),lu(n.transaction.from),na(6),lu(El(16,6,"tx.to-small-label")),na(4),lu(n.transaction.to)}}function UH(t,e){if(1&t&&(Ms(0),uu(1,"\n "),bs(2,"div",4),uu(3,"\n "),bs(4,"span"),uu(5),Tl(6,"translate"),ws(),uu(7," "),bs(8,"span"),uu(9),Tl(10,"dateTime"),ws(),uu(11,"\n "),ws(),uu(12,"\n "),bs(13,"div",4),uu(14,"\n "),bs(15,"span"),uu(16),Tl(17,"translate"),ws(),uu(18," "),bs(19,"span"),uu(20),Tl(21,"translate"),ws(),uu(22,"\n "),ws(),uu(23,"\n "),Ss()),2&t){var n=Ys();na(5),lu(El(6,4,"tx.date-small-label")),na(4),lu(El(10,6,n.transaction.timestamp)),na(7),lu(El(17,8,"tx.status-small-label")),na(4),lu(El(21,10,n.transaction.confirmed?"tx.confirmed-transaction":"tx.pending-transaction"))}}function qH(t,e){if(1&t&&(bs(0,"div",4),uu(1,"\n "),bs(2,"span"),uu(3),Tl(4,"translate"),ws(),uu(5," "),bs(6,"span"),uu(7),ws(),uu(8,"\n "),ws()),2&t){var n=Ys();na(3),lu(El(4,2,"tx.id-small-label")),na(4),lu(n.transaction.id)}}function GH(t,e){if(1&t&&(bs(0,"span"),uu(1),ws()),2&t){var n=Ys(2);na(1),lu(n.transaction.note)}}function KH(t,e){1&t&&(bs(0,"span",13),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),lu(El(2,1,"tx.without-note")))}function ZH(t,e){if(1&t){var n=xs();bs(0,"mat-icon",14),Ts("click",(function(){return Bn(n),Ys(2).editNote()})),uu(1,"edit"),ws()}}function JH(t,e){if(1&t&&(bs(0,"div",4),uu(1,"\n "),bs(2,"span"),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ps(6,GH,2,1,"span",2),uu(7,"\n "),ps(8,KH,3,3,"span",11),uu(9,"\n "),ps(10,ZH,2,0,"mat-icon",12),uu(11,"\n "),ws()),2&t){var n=Ys();na(3),lu(El(4,4,"tx.note-small-label")),na(3),_s("ngIf",n.transaction.note),na(2),_s("ngIf",!n.transaction.note),na(2),_s("ngIf",!n.isPreview)}}function QH(t,e){1&t&&(bs(0,"span"),uu(1,"*"),ws())}function XH(t,e){if(1&t&&(bs(0,"p",15),Tl(1,"translate"),uu(2),Tl(3,"currency"),ps(4,QH,2,0,"span",2),uu(5,"\n "),ws()),2&t){var n=Ys();_s("matTooltip",n.isPreview?"":El(1,3,"tx.current-rate-help")),na(2),cu("\n ",Pl(3,5,n.balanceToShow.multipliedBy(n.price).toString(),"USD","symbol","1.2-2"),""),na(2),_s("ngIf",!n.isPreview)}}function $H(t,e){if(1&t){var n=xs();bs(0,"div",16),uu(1,"\n "),bs(2,"app-arrow-link",17),Ts("pressed",(function(t){return Bn(n),Ys().toggleInputsOutputs(t)})),uu(3,"\n "),ws(),uu(4,"\n "),ws()}2&t&&(na(2),_s("noPadding",!0)("text","tx.show-more-link"))}function tB(t,e){if(1&t&&(bs(0,"div",20),uu(1,"\n "),bs(2,"div",21),uu(3),ws(),uu(4,"\n "),bs(5,"div",22),uu(6,"\n "),bs(7,"div",23),uu(8),ws(),uu(9,"\n "),bs(10,"div",4),uu(11,"\n "),bs(12,"span"),uu(13),Tl(14,"translate"),ws(),uu(15),Tl(16,"amount"),ws(),uu(17,"\n "),bs(18,"div",4),uu(19,"\n "),bs(20,"span"),uu(21),Tl(22,"translate"),ws(),uu(23),Tl(24,"amount"),ws(),uu(25,"\n "),ws(),uu(26,"\n "),ws()),2&t){var n=e.$implicit,i=e.index;na(3),lu(i+1),na(5),lu(n.address),na(5),lu(El(14,6,"tx.coins-small-label")),na(2),cu(" ",Al(16,8,n.coins.toString(),!0,"first"),"\n "),na(6),lu(El(22,12,"tx.hours-small-label")),na(2),cu(" ",Al(24,14,n.hours.toString(),!1,"first"),"\n ")}}function eB(t,e){if(1&t&&(bs(0,"div",20),uu(1,"\n "),bs(2,"div",21),uu(3),ws(),uu(4,"\n "),bs(5,"div",22),uu(6,"\n "),bs(7,"div",23),uu(8),ws(),uu(9,"\n "),bs(10,"div",4),uu(11,"\n "),bs(12,"span"),uu(13),Tl(14,"translate"),ws(),uu(15),Tl(16,"amount"),ws(),uu(17,"\n "),bs(18,"div",4),uu(19,"\n "),bs(20,"span"),uu(21),Tl(22,"translate"),ws(),uu(23),Tl(24,"amount"),ws(),uu(25,"\n "),ws(),uu(26,"\n "),ws()),2&t){var n=e.$implicit,i=e.index;na(3),lu(i+1),na(5),lu(n.address),na(5),lu(El(14,6,"tx.coins-small-label")),na(2),cu(" ",Al(16,8,n.coins.toString(),!0,"first"),"\n "),na(6),lu(El(22,12,"tx.hours-small-label")),na(2),cu(" ",Al(24,14,n.hours.toString(),!1,"first"),"\n ")}}function nB(t,e){if(1&t&&(Ms(0),uu(1,"\n "),uu(2,"\n "),bs(3,"div",18),uu(4,"\n "),bs(5,"h4"),uu(6),Tl(7,"translate"),ws(),uu(8,"\n\n "),ps(9,tB,27,18,"div",19),uu(10,"\n "),ws(),uu(11,"\n "),uu(12,"\n "),bs(13,"div",18),uu(14,"\n "),bs(15,"h4"),uu(16),Tl(17,"translate"),ws(),uu(18,"\n\n "),ps(19,eB,27,18,"div",19),uu(20,"\n "),ws(),uu(21,"\n "),Ss()),2&t){var n=Ys();na(6),lu(El(7,4,"tx.inputs-title")),na(3),_s("ngForOf",n.transaction.inputs),na(7),lu(El(17,6,"tx.outputs-title")),na(3),_s("ngForOf",n.transaction.outputs)}}var iB=function(){function t(t,e){var n=this;this.priceService=t,this.dialog=e,this.showInputsOutputs=!1,this.subscription=this.priceService.price.subscribe((function(t){return n.price=t}))}return Object.defineProperty(t.prototype,"hoursText",{get:function(){if(!this.isPreview){if(this.transaction.coinsMovedInternally)return"tx.hours-moved";if(this.transaction.balance.isGreaterThan(0))return"tx.hours-received"}return"tx.hours-sent"},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"sentOrReceivedHours",{get:function(){return this.isPreview?this.transaction.hoursToSend:this.transaction.hoursBalance},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"shouldShowIncomingIcon",{get:function(){return!this.isPreview&&this.transaction.balance.isGreaterThan(0)&&!this.transaction.coinsMovedInternally},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"balanceToShow",{get:function(){return this.isPreview?this.transaction.coinsToSend:this.transaction.balance},enumerable:!1,configurable:!0}),t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.toggleInputsOutputs=function(t){t.preventDefault(),this.showInputsOutputs=!this.showInputsOutputs},t.prototype.editNote=function(){var t=this;kR.openDialog(this.dialog,this.transaction).afterClosed().subscribe((function(e){(e||""===e)&&(t.transaction.note=e)}))},t.\u0275fac=function(e){return new(e||t)(gs(nP),gs(Dk))},t.\u0275cmp=Fe({type:t,selectors:[["app-transaction-info"]],inputs:{transaction:"transaction",isPreview:"isPreview"},decls:61,vars:32,consts:[[1,"row"],[1,"col-md-12"],[4,"ngIf"],[1,"col-md-9","-tx-meta"],[1,"-data"],["class","-data",4,"ngIf"],[1,"col-md-3","-tx-price"],[1,"-icon"],[3,"src"],[3,"matTooltip",4,"ngIf"],["class","-data -more",4,"ngIf"],["class","grey-text",4,"ngIf"],["class","edit-button image-button",3,"click",4,"ngIf"],[1,"grey-text"],[1,"edit-button","image-button",3,"click"],[3,"matTooltip"],[1,"-data","-more"],[3,"noPadding","text","pressed"],[1,"col-md-6","-margin-top"],["class","-item",4,"ngFor","ngForOf"],[1,"-item"],[1,"-number"],[1,"-info"],[1,"-address"]],template:function(t,e){1&t&&(bs(0,"div",0),uu(1,"\n "),bs(2,"div",1),uu(3,"\n "),uu(4,"\n "),ps(5,WH,3,3,"h4",2),uu(6,"\n "),ps(7,VH,3,3,"h4",2),uu(8,"\n "),bs(9,"div",0),uu(10,"\n "),uu(11,"\n "),bs(12,"div",3),uu(13,"\n "),ps(14,zH,22,8,"ng-container",2),uu(15,"\n "),ps(16,UH,24,12,"ng-container",2),uu(17,"\n "),bs(18,"div",4),uu(19,"\n "),bs(20,"span"),uu(21),Tl(22,"translate"),ws(),uu(23,"\n "),bs(24,"span"),uu(25),Tl(26,"amount"),Tl(27,"translate"),Tl(28,"amount"),Tl(29,"translate"),ws(),uu(30,"\n "),ws(),uu(31,"\n "),ps(32,qH,9,4,"div",5),uu(33,"\n "),ps(34,JH,12,6,"div",5),uu(35,"\n "),ws(),uu(36,"\n\n "),uu(37,"\n "),bs(38,"div",6),uu(39,"\n "),bs(40,"div",7),uu(41,"\n "),ks(42,"img",8),uu(43,"\n "),ws(),uu(44,"\n "),bs(45,"h4"),uu(46),Tl(47,"amount"),ws(),uu(48,"\n "),ps(49,XH,6,10,"p",9),uu(50,"\n "),ws(),uu(51,"\n "),ws(),uu(52,"\n\n "),uu(53,"\n "),ps(54,$H,5,2,"div",10),uu(55,"\n "),ws(),uu(56,"\n\n "),uu(57,"\n "),ps(58,nB,22,8,"ng-container",2),uu(59,"\n"),ws(),uu(60,"\n")),2&t&&(na(5),_s("ngIf",e.isPreview),na(2),_s("ngIf",!e.isPreview),na(7),_s("ngIf",e.isPreview),na(2),_s("ngIf",!e.isPreview),na(5),lu(El(22,16,"tx.hours-small-label")),na(4),fu("\n ",Al(26,18,e.sentOrReceivedHours.toString(),!1,"first")," ",El(27,22,e.hoursText),"\n |\n ",Al(28,24,e.transaction.hoursBurned.toString(),!1,"first")," ",El(29,28,"tx.hours-burned"),"\n "),na(7),_s("ngIf",!e.isPreview),na(2),_s("ngIf",e.transaction.note||!e.isPreview),na(8),_s("src","assets/img/"+(e.shouldShowIncomingIcon?"received":"sent")+"-blue.png",Rr),na(4),lu(El(47,30,e.balanceToShow.toString())),na(3),_s("ngIf",e.price),na(5),_s("ngIf",!e.showInputsOutputs),na(4),_s("ngIf",e.showInputsOutputs))},directives:[Eh,vx,UE,RI,Lh],pipes:[pC,DC,NH,sf],styles:["h4[_ngcontent-%COMP%]{font-size:14px;margin:0 0 30px}.-item[_ngcontent-%COMP%]{display:flex;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}.-item[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{padding:10px;background:#f7f7f7;align-self:flex-start;border-radius:10px}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin-left:10px;display:flex;flex-direction:column;word-break:break-all}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{padding:10px 0;margin-bottom:5px}.-data[_ngcontent-%COMP%]{font-size:13px;display:flex}.-data[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:first-child{color:rgba(30,34,39,.5);width:70px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(2){word-break:break-word}.-data.-more[_ngcontent-%COMP%]{margin-top:20px}.edit-button[_ngcontent-%COMP%]{font-size:20px;padding-left:5px;color:#0072ff}.-tx-meta[_ngcontent-%COMP%] .-data[_ngcontent-%COMP%]{margin-bottom:10px}.-tx-price[_ngcontent-%COMP%]{text-align:center;display:flex;flex-direction:column;justify-content:center}.-tx-price[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:30px}.-tx-price[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:18px;font-weight:700;margin:10px 0 5px;word-break:break-word}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:13px;margin:0}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}.-margin-top[_ngcontent-%COMP%]{margin-top:30px}"]}),t}(),rB=["sendButton"],aB=["backButton"],oB=function(){function t(t,e,n,i,r,a){this.msgBarService=t,this.dialog=e,this.hwWalletService=n,this.translate=i,this.balanceAndOutputsService=r,this.spendingService=a,this.onBack=new Rl}return t.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.sendSubscription&&this.sendSubscription.unsubscribe()},t.prototype.back=function(){this.onBack.emit(!1)},t.prototype.send=function(){var t=this;this.sendButton.isLoading()||(this.msgBarService.hide(),this.sendButton.resetState(),this.transaction.wallet?this.transaction.wallet.encrypted&&!this.transaction.wallet.isHardware?MI.openDialog(this.dialog,{wallet:this.transaction.wallet}).componentInstance.passwordSubmit.subscribe((function(e){t.finishSending(e)})):this.transaction.wallet.isHardware?(this.showBusy(),this.sendSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.transaction.wallet.addresses[0].address).subscribe((function(){return t.finishSending()}),(function(e){return t.showError(e)}))):this.finishSending():WY.openDialog(this.dialog,{rawTx:this.transaction.encoded,isUnsigned:!0}).afterClosed().subscribe((function(){AE.openDialog(t.dialog,{text:"offline-transactions.copy-tx.reset-confirmation",defaultButtons:OE.YesNo}).afterClosed().subscribe((function(e){e&&t.onBack.emit(!0)}))})))},t.prototype.finishSending=function(t){var e=this;this.showBusy();var n=this.transaction.note.trim();this.sendSubscription=this.spendingService.signTransaction(this.transaction.wallet,t?t.password:null,this.transaction).pipe(st((function(i){return t&&t.close(),e.spendingService.injectTransaction(i,n)}))).subscribe((function(t){n&&!t?setTimeout((function(){return e.msgBarService.showWarning(e.translate.instant("send.saving-note-error"))})):setTimeout((function(){return e.msgBarService.showDone("send.sent")})),e.balanceAndOutputsService.refreshBalance(),e.onBack.emit(!0)}),(function(n){t&&t.error(n),e.showError(n)}))},t.prototype.showBusy=function(){this.sendButton.setLoading(),this.backButton.setDisabled()},t.prototype.showError=function(t){this.msgBarService.showError(t),this.sendButton.resetState(),this.backButton.resetState().setEnabled()},t.\u0275fac=function(e){return new(e||t)(gs(Gx),gs(Dk),gs(jk),gs(hC),gs(MO),gs(qY))},t.\u0275cmp=Fe({type:t,selectors:[["app-send-preview"]],viewQuery:function(t,e){var n;1&t&&(Zl(rB,!0),Zl(aB,!0)),2&t&&(Gl(n=tc())&&(e.sendButton=n.first),Gl(n=tc())&&(e.backButton=n.first))},inputs:{transaction:"transaction"},outputs:{onBack:"onBack"},decls:15,vars:8,consts:[[3,"transaction","isPreview"],[1,"-buttons"],[3,"action"],["backButton",""],[1,"primary-button",3,"action"],["sendButton",""]],template:function(t,e){1&t&&(ks(0,"app-transaction-info",0),uu(1,"\n\n"),bs(2,"div",1),uu(3,"\n "),bs(4,"app-button",2,3),Ts("action",(function(){return e.back()})),uu(6),Tl(7,"translate"),ws(),uu(8,"\n "),bs(9,"app-button",4,5),Ts("action",(function(){return e.send()})),uu(11),Tl(12,"translate"),ws(),uu(13,"\n"),ws(),uu(14,"\n")),2&t&&(_s("transaction",e.transaction)("isPreview",!0),na(6),lu(El(7,4,"common.back-button")),na(5),cu("\n ",El(12,6,"send."+(e.transaction&&!e.transaction.wallet?"show":"send")+"-button"),"\n "))},directives:[iB,Cx],pipes:[pC],styles:[".-buttons[_ngcontent-%COMP%]{margin-top:10px;text-align:center}"]}),t}();function sB(t,e){if(1&t){var n=xs();bs(0,"app-send-coins-form",8),Ts("onFormSubmitted",(function(t){return Bn(n),Ys().onFormSubmitted(t)})),ws()}2&t&&_s("formData",Ys().formData)("showSimpleForm",!0)}function uB(t,e){if(1&t){var n=xs();bs(0,"app-send-coins-form",8),Ts("onFormSubmitted",(function(t){return Bn(n),Ys().onFormSubmitted(t)})),ws()}2&t&&_s("formData",Ys().formData)("showSimpleForm",!1)}function lB(t,e){if(1&t){var n=xs();bs(0,"app-send-preview",9),Ts("onBack",(function(t){return Bn(n),Ys().onBack(t)})),ws()}2&t&&_s("transaction",Ys().formData.transaction)}var cB=function(){function t(t,e,n){var i=this;this.navBarSwitchService=t,this.changeDetector=e,this.dialog=n,this.showForm=!0,this.activeForms=YP,this.navBarSwitchService.showSwitch("send.simple-form-button","send.advanced-form-button",YP.LeftButton),this.subscription=t.activeComponent.subscribe((function(t){i.activeForm!==t&&(i.activeForm=t,i.formData=null)}))}return t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe(),this.navBarSwitchService.hideSwitch()},t.prototype.onFormSubmitted=function(t){this.formData=t,this.showForm=!1},t.prototype.onBack=function(t){t&&(this.formData=null),this.showForm=!0,this.changeDetector.detectChanges()},t.prototype.signTransaction=function(){iR.openDialog(this.dialog)},t.prototype.broadcastTransaction=function(){pR.openDialog(this.dialog)},t.\u0275fac=function(e){return new(e||t)(gs(FP),gs(Lo),gs(Dk))},t.\u0275cmp=Fe({type:t,selectors:[["app-send-skycoin"]],decls:32,vars:12,consts:[[3,"headline"],[1,"container"],[1,"paper"],[3,"formData","showSimpleForm","onFormSubmitted",4,"ngIf"],[3,"transaction","onBack",4,"ngIf"],[1,"-links"],[1,"link",3,"click"],[1,"separator"],[3,"formData","showSimpleForm","onFormSubmitted"],[3,"transaction","onBack"]],template:function(t,e){1&t&&(ks(0,"app-header",0),Tl(1,"translate"),uu(2,"\n"),bs(3,"div",1),uu(4,"\n "),bs(5,"div",2),uu(6,"\n "),uu(7,"\n "),ps(8,sB,1,2,"app-send-coins-form",3),uu(9,"\n "),ps(10,uB,1,2,"app-send-coins-form",3),uu(11,"\n "),uu(12,"\n "),ps(13,lB,1,1,"app-send-preview",4),uu(14,"\n "),ws(),uu(15,"\n "),uu(16,"\n "),bs(17,"div",5),uu(18,"\n "),bs(19,"span",6),Ts("click",(function(){return e.signTransaction()})),uu(20),Tl(21,"translate"),ws(),uu(22,"\n "),bs(23,"span",7),uu(24," / "),ws(),uu(25,"\n "),bs(26,"span",6),Ts("click",(function(){return e.broadcastTransaction()})),uu(27),Tl(28,"translate"),ws(),uu(29,"\n "),ws(),uu(30,"\n"),ws(),uu(31,"\n")),2&t&&(_s("headline",El(1,6,"send.title-and-button")),na(8),_s("ngIf",e.showForm&&e.activeForm===e.activeForms.LeftButton),na(2),_s("ngIf",e.showForm&&e.activeForm===e.activeForms.RightButton),na(3),_s("ngIf",!e.showForm),na(7),lu(El(21,8,"offline-transactions.sign-tx.title")),na(7),lu(El(28,10,"offline-transactions.broadcast-tx.title")))},directives:[mI,Eh,jH,oB],pipes:[pC],styles:[".-links[_ngcontent-%COMP%]{text-align:center;font-size:13px;margin-top:-15px;margin-bottom:15px}.-links[_ngcontent-%COMP%] .separator[_ngcontent-%COMP%]{margin:0 10px}"]}),t}(),dB=function(){function t(t){this.translateService=t}return t.prototype.transform=function(t){var e=PI().unix()-t;return e<60?this.translateService.instant("time-from-now.few-seconds"):e<120?this.translateService.instant("time-from-now.minute"):e<3600?this.translateService.instant("time-from-now.minutes",{time:Math.floor(e/60)}):e<7200?this.translateService.instant("time-from-now.hour"):e<86400?this.translateService.instant("time-from-now.hours",{time:Math.floor(e/3600)}):e<172800?this.translateService.instant("time-from-now.day"):this.translateService.instant("time-from-now.days",{time:Math.floor(e/86400)})},t.\u0275fac=function(e){return new(e||t)(gs(hC))},t.\u0275pipe=Ue({name:"dateFromNow",type:t,pure:!1}),t}();function hB(t,e){1&t&&ks(0,"app-loading-content",3),2&t&&_s("isLoading",!Ys().transactions)}function fB(t,e){if(1&t&&(bs(0,"div",12),uu(1,"\n "),bs(2,"div",13),uu(3),ws(),uu(4,"\n "),bs(5,"div",8),uu(6),Tl(7,"amount"),ws(),uu(8,"\n "),bs(9,"div",8),uu(10),Tl(11,"amount"),ws(),uu(12,"\n "),bs(13,"div",14),uu(14),Tl(15,"dateTime"),ws(),uu(16,"\n "),ws()),2&t){var n=e.$implicit;na(3),lu(n.id),na(3),lu(Al(7,4,n.coins,!0,"first")),na(4),lu(Al(11,8,n.hours,!1,"first")),na(4),lu(El(15,12,n.timestamp))}}function pB(t,e){if(1&t&&(bs(0,"div",4),uu(1,"\n "),bs(2,"div",5),uu(3,"\n "),bs(4,"div",6),uu(5,"\n "),bs(6,"div",7),uu(7),Tl(8,"translate"),ws(),uu(9,"\n "),bs(10,"div",8),uu(11),Tl(12,"commonText"),ws(),uu(13,"\n "),bs(14,"div",8),uu(15),Tl(16,"commonText"),ws(),uu(17,"\n "),bs(18,"div",9),uu(19),Tl(20,"translate"),ws(),uu(21,"\n "),ws(),uu(22,"\n "),bs(23,"div",10),uu(24,"\n "),ps(25,fB,17,14,"div",11),uu(26,"\n "),ws(),uu(27,"\n "),ws(),uu(28,"\n "),ws()),2&t){var n=Ys();na(7),lu(El(8,5,"pending-txs.txid-table-label")),na(4),lu(El(12,7,"coin")),na(4),lu(El(16,9,"hours")),na(4),lu(El(20,11,"pending-txs.timestamp-table-label")),na(6),_s("ngForOf",n.transactions)}}var mB=function(){function t(t,e){var n=this;this.navBarSwitchService=t,this.historyService=e,this.transactions=null,this.updatePeriod=1e4,this.errorUpdatePeriod=2e3,this.navbarSubscription=this.navBarSwitchService.activeComponent.subscribe((function(t){n.selectedNavbarOption=t,n.transactions=null,n.startDataRefreshSubscription(0)}))}return t.prototype.ngOnInit=function(){this.navBarSwitchService.showSwitch("pending-txs.my-transactions-button","pending-txs.all-transactions-button")},t.prototype.ngOnDestroy=function(){this.navbarSubscription.unsubscribe(),this.removeTransactionsSubscription(),this.navBarSwitchService.hideSwitch()},t.prototype.startDataRefreshSubscription=function(t){var e=this;this.removeTransactionsSubscription(),this.transactionsSubscription=rp(0).pipe(up(t),st((function(){return e.historyService.getPendingTransactions()}))).subscribe((function(t){e.transactions=e.selectedNavbarOption===YP.LeftButton?t.user:t.all,e.startDataRefreshSubscription(e.updatePeriod)}),(function(){return e.startDataRefreshSubscription(e.errorUpdatePeriod)}))},t.prototype.removeTransactionsSubscription=function(){this.transactionsSubscription&&this.transactionsSubscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(gs(FP),gs(II))},t.\u0275cmp=Fe({type:t,selectors:[["app-pending-transactions"]],decls:10,vars:5,consts:[[3,"headline"],["noDataText","pending-txs.none",3,"isLoading",4,"ngIf"],["class","container",4,"ngIf"],["noDataText","pending-txs.none",3,"isLoading"],[1,"container"],[1,"-table"],[1,"-headers"],[1,"-flex-fill"],[1,"-width-150","text-right"],[1,"-width-150"],[1,"-body"],["class","-row",4,"ngFor","ngForOf"],[1,"-row"],[1,"-flex-fill","break-all"],[1,"-width-150","grey-text"]],template:function(t,e){1&t&&(bs(0,"div"),uu(1,"\n "),ks(2,"app-header",0),Tl(3,"translate"),uu(4,"\n\n "),ps(5,hB,1,1,"app-loading-content",1),uu(6,"\n\n "),ps(7,pB,29,13,"div",2),uu(8,"\n"),ws(),uu(9,"\n")),2&t&&(na(2),_s("headline",El(3,3,"pending-txs.title")),na(3),_s("ngIf",!e.transactions||0===e.transactions.length),na(2),_s("ngIf",e.transactions&&e.transactions.length>0))},directives:[mI,Eh,OY,Lh],pipes:[pC,pY,DC,NH],styles:[""]}),t}();function gB(t,e){1&t&&ks(0,"app-loading-content",3),2&t&&_s("isLoading",!Ys().wallets)}function vB(t,e){if(1&t&&(bs(0,"div",12),uu(1,"\n "),bs(2,"div",17),uu(3),ws(),uu(4,"\n "),bs(5,"div",9),uu(6),Tl(7,"amount"),ws(),uu(8,"\n "),bs(9,"div",18),uu(10),Tl(11,"amount"),ws(),uu(12,"\n "),ws()),2&t){var n=e.$implicit;na(3),lu(n.hash),na(3),lu(Al(7,3,n.coins.toString(),!0,"first")),na(4),lu(Al(11,7,n.hours.toString(),!1,"first"))}}function _B(t,e){if(1&t&&(Ms(0),uu(1,"\n "),bs(2,"div",12),uu(3,"\n "),bs(4,"div",13),uu(5,"\n "),ks(6,"app-qr-code-button",14),uu(7,"\n "),bs(8,"span",15),uu(9),ws(),uu(10,"\n "),ws(),uu(11,"\n "),ws(),uu(12,"\n "),ps(13,vB,13,11,"div",16),uu(14,"\n "),Ss()),2&t){var n=e.$implicit;na(6),_s("address",n.address),na(3),lu(n.address),na(4),_s("ngForOf",n.outputs)}}function yB(t,e){if(1&t&&(bs(0,"div",6),uu(1,"\n "),bs(2,"div",7),uu(3,"\n "),bs(4,"div",8),uu(5),ws(),uu(6,"\n "),bs(7,"div",9),uu(8),Tl(9,"commonText"),ws(),uu(10,"\n "),bs(11,"div",9),uu(12),Tl(13,"commonText"),ws(),uu(14,"\n "),ws(),uu(15,"\n "),bs(16,"div",10),uu(17,"\n "),ps(18,_B,15,3,"ng-container",11),uu(19,"\n "),ws(),uu(20,"\n "),ws()),2&t){var n=e.$implicit;na(4),ds("title",n.label),na(1),lu(n.label),na(3),lu(El(9,5,"coin")),na(4),lu(El(13,7,"hours")),na(6),_s("ngForOf",n.addresses)}}function bB(t,e){if(1&t&&(bs(0,"div",4),uu(1,"\n "),ps(2,yB,21,9,"div",5),uu(3,"\n "),ws()),2&t){var n=Ys();na(2),_s("ngForOf",n.wallets)}}var wB=function(){function t(t,e){var n=this;this.balanceAndOutputsService=e,t.queryParams.subscribe((function(t){n.wallets=null,n.loadData(t)}))}return t.prototype.ngOnDestroy=function(){this.removeOutputsSubscription()},t.prototype.loadData=function(t){var e=this,n=t.addr;this.removeOutputsSubscription(),this.outputsSubscription=this.balanceAndOutputsService.outputsWithWallets.subscribe((function(t){e.wallets=t.map((function(t){return t.addresses=t.addresses.filter((function(t){if(t.outputs.length>0)return!n||t.address===n})),t})).filter((function(t){return t.addresses.length>0}))}))},t.prototype.removeOutputsSubscription=function(){this.outputsSubscription&&this.outputsSubscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(gs(yL),gs(MO))},t.\u0275cmp=Fe({type:t,selectors:[["app-outputs"]],decls:10,vars:5,consts:[[3,"headline"],["noDataText","outputs.error-no-outputs",3,"isLoading",4,"ngIf"],["class","container",4,"ngIf"],["noDataText","outputs.error-no-outputs",3,"isLoading"],[1,"container"],["class","-table",4,"ngFor","ngForOf"],[1,"-table"],[1,"-headers"],[1,"-flex-fill","text-truncate"],[1,"-width-150","text-right"],[1,"-body"],[4,"ngFor","ngForOf"],[1,"-row"],[1,"-flex-fill","grey-text","text-truncate"],[3,"address"],[1,"address"],["class","-row",4,"ngFor","ngForOf"],[1,"-flex-fill","-hash"],[1,"-width-150","text-right","grey-text"]],template:function(t,e){1&t&&(bs(0,"div"),uu(1,"\n "),ks(2,"app-header",0),Tl(3,"translate"),uu(4,"\n\n "),ps(5,gB,1,1,"app-loading-content",1),uu(6,"\n\n "),ps(7,bB,4,1,"div",2),uu(8,"\n"),ws(),uu(9,"\n")),2&t&&(na(2),_s("headline",El(3,3,"outputs.title")),na(3),_s("ngIf",!e.wallets||0===e.wallets.length||0===e.wallets[0].addresses[0].outputs.length),na(2),_s("ngIf",e.wallets&&e.wallets.length>0))},directives:[mI,Eh,OY,Lh,qI],pipes:[pC,pY,DC],styles:[".-hash[_ngcontent-%COMP%]{margin-left:27px;word-break:break-all}app-qr-code-button[_ngcontent-%COMP%]{margin-right:10px}.address[_ngcontent-%COMP%], app-qr-code-button[_ngcontent-%COMP%]{vertical-align:middle}"]}),t}();function kB(t,e){1&t&&ks(0,"app-loading-content")}var MB=function(t){return{coinName:t}},SB=function(t){return{coinHoursName:t}};function CB(t,e){if(1&t&&(bs(0,"div",3),uu(1,"\n "),bs(2,"div",4),uu(3,"\n "),uu(4,"\n "),bs(5,"div",5),uu(6,"\n "),bs(7,"div",6),uu(8,"\n "),bs(9,"div",7),uu(10,"\n "),bs(11,"div",8),uu(12),Tl(13,"translate"),ws(),uu(14,"\n "),bs(15,"div",9),uu(16),Tl(17,"number"),ws(),uu(18,"\n "),ws(),uu(19,"\n "),bs(20,"div",7),uu(21,"\n "),bs(22,"div",8),uu(23),Tl(24,"translate"),ws(),uu(25,"\n "),bs(26,"div",9),uu(27),Tl(28,"dateTime"),ws(),uu(29,"\n "),ws(),uu(30,"\n "),bs(31,"div",7),uu(32,"\n "),bs(33,"div",8),uu(34),Tl(35,"translate"),ws(),uu(36,"\n "),bs(37,"div",9),uu(38),ws(),uu(39,"\n "),ws(),uu(40,"\n "),ws(),uu(41,"\n "),ws(),uu(42,"\n "),uu(43,"\n "),bs(44,"div",10),uu(45,"\n "),bs(46,"div",6),uu(47,"\n "),bs(48,"div",11),uu(49,"\n "),bs(50,"div",12),uu(51,"\n "),bs(52,"div",7),uu(53,"\n "),bs(54,"div",8),uu(55),Tl(56,"translate"),ws(),uu(57,"\n "),bs(58,"div",9),uu(59),Tl(60,"amount"),ws(),uu(61,"\n "),ws(),uu(62,"\n "),bs(63,"div",7),uu(64,"\n "),bs(65,"div",8),uu(66),Tl(67,"translate"),ws(),uu(68,"\n "),bs(69,"div",9),uu(70),Tl(71,"amount"),ws(),uu(72,"\n "),ws(),uu(73,"\n "),ws(),uu(74,"\n "),bs(75,"div",12),uu(76,"\n "),bs(77,"div",7),uu(78,"\n "),bs(79,"div",8),uu(80),Tl(81,"translate"),ws(),uu(82,"\n "),bs(83,"div",9),uu(84),Tl(85,"amount"),ws(),uu(86,"\n "),ws(),uu(87,"\n "),bs(88,"div",7),uu(89,"\n "),bs(90,"div",8),uu(91),Tl(92,"translate"),ws(),uu(93,"\n "),bs(94,"div",9),uu(95),Tl(96,"amount"),ws(),uu(97,"\n "),ws(),uu(98,"\n "),ws(),uu(99,"\n "),ws(),uu(100,"\n "),ws(),uu(101,"\n "),ws(),uu(102,"\n "),ws(),uu(103,"\n "),ws()),2&t){var n=Ys();na(12),lu(El(13,14,"blockchain.blocks-label")),na(4),lu(El(17,16,n.block.seq)),na(7),lu(El(24,18,"blockchain.time-label")),na(4),lu(El(28,20,n.block.timestamp)),na(7),lu(El(35,22,"blockchain.hash-label")),na(4),lu(n.block.hash),na(17),lu(Ol(56,24,"blockchain.current-supply-label",kl(52,MB,n.appService.coinName))),na(4),lu(Al(60,27,n.coinSupply.currentSupply,!0,"first")),na(7),lu(Ol(67,31,"blockchain.total-supply-label",kl(54,MB,n.appService.coinName))),na(4),lu(Al(71,34,n.coinSupply.totalSupply,!0,"first")),na(10),lu(Ol(81,38,"blockchain.current-coinhour-supply-label",kl(56,SB,n.appService.hoursName))),na(4),lu(Al(85,41,n.coinSupply.currentCoinhourSupply,!1,"first")),na(7),lu(Ol(92,45,"blockchain.total-coinhour-supply-label",kl(58,SB,n.appService.hoursName))),na(4),lu(Al(96,48,n.coinSupply.totalCoinhourSupply,!1,"first"))}}var xB=function(){function t(t,e){this.appService=t,this.blockchainService=e,this.updatePeriod=5e3,this.errorUpdatePeriod=2e3}return t.prototype.ngOnInit=function(){this.startDataRefreshSubscription(0)},t.prototype.startDataRefreshSubscription=function(t){var e=this;this.removeOperationSubscription(),this.operationSubscription=rp(0).pipe(up(t),st((function(){return e.blockchainService.getLastBlock()})),st((function(t){return e.block=t,e.blockchainService.getCoinSupply()}))).subscribe((function(t){e.coinSupply=t,e.startDataRefreshSubscription(e.updatePeriod)}),(function(){return e.startDataRefreshSubscription(e.errorUpdatePeriod)}))},t.prototype.ngOnDestroy=function(){this.removeOperationSubscription()},t.prototype.removeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(gs(Sm),gs(SO))},t.\u0275cmp=Fe({type:t,selectors:[["app-blockchain"]],decls:10,vars:5,consts:[[3,"headline"],[4,"ngIf"],["class","container",4,"ngIf"],[1,"container"],[1,"row","-wrapper"],[1,"col-md-6","pl-0"],[1,"paper"],[1,"-item"],[1,"-key"],[1,"break-all"],[1,"col-md-6","pr-0"],[1,"row"],[1,"col-md-6"]],template:function(t,e){1&t&&(bs(0,"div"),uu(1,"\n "),ks(2,"app-header",0),Tl(3,"translate"),uu(4,"\n\n "),ps(5,kB,1,0,"app-loading-content",1),uu(6,"\n\n "),ps(7,CB,104,60,"div",2),uu(8,"\n"),ws(),uu(9,"\n")),2&t&&(na(2),_s("headline",El(3,3,"blockchain.title")),na(3),_s("ngIf",!(e.block&&e.coinSupply)),na(2),_s("ngIf",e.block&&e.coinSupply))},directives:[mI,Eh,OY],pipes:[pC,af,NH,DC],styles:[".-wrapper[_ngcontent-%COMP%]{margin:30px}.paper[_ngcontent-%COMP%]{margin:0}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}"]}),t}(),DB=function(){function t(t,e){this.data=t,this.dialogRef=e}return t.openDialog=function(e,n){var i=new pk;return i.data=n,i.autoFocus=!0,i.width=Mm.mediumModalWidth,e.open(t,i)},t.\u0275fac=function(e){return new(e||t)(gs(kk),gs(bk))},t.\u0275cmp=Fe({type:t,selectors:[["app-seed-modal"]],decls:21,vars:11,consts:[[3,"headline","dialog"],[1,"form-field"],["for","seed"],["id","seed","readonly",""],[1,"-buttons"],[1,"primary-button",3,"action"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),bs(3,"div",1),uu(4,"\n "),bs(5,"label",2),uu(6),Tl(7,"translate"),ws(),uu(8,"\n "),bs(9,"textarea",3),uu(10),ws(),uu(11,"\n "),ws(),uu(12,"\n "),bs(13,"div",4),uu(14,"\n "),bs(15,"app-button",5),Ts("action",(function(){return e.dialogRef.close()})),uu(16),Tl(17,"translate"),ws(),uu(18,"\n "),ws(),uu(19,"\n"),ws(),uu(20,"\n")),2&t&&(_s("headline",El(1,5,"backup.seed-modal-window.title"))("dialog",e.dialogRef),na(6),lu(El(7,7,"backup.seed-modal-window.seed-label")),na(4),lu(e.data),na(6),cu("\n ",El(17,9,"common.close-button"),"\n "))},directives:[jS,Cx],pipes:[pC],styles:[""]}),t}();function LB(t,e){1&t&&ks(0,"app-loading-content",8),2&t&&_s("isLoading",!1)}function TB(t,e){if(1&t){var n=xs();bs(0,"div",22),Ts("click",(function(){Bn(n);var t=Ys().$implicit;return Ys(2).showSeed(t)})),uu(1),Tl(2,"translate"),ws()}2&t&&(na(1),lu(El(2,1,"backup.show-seed-button")))}function EB(t,e){1&t&&(bs(0,"mat-icon",24),Tl(1,"translate"),uu(2,"help"),ws()),2&t&&_s("matTooltip",El(1,1,"backup.unencrypted-info"))}function OB(t,e){1&t&&(bs(0,"mat-icon",24),Tl(1,"translate"),uu(2,"help"),ws()),2&t&&_s("matTooltip",El(1,1,"backup.hw-wallet-info"))}function AB(t,e){if(1&t&&(bs(0,"div"),uu(1,"\n "),ps(2,EB,3,3,"mat-icon",23),uu(3,"\n "),ps(4,OB,3,3,"mat-icon",23),uu(5),Tl(6,"translate"),ws()),2&t){var n=Ys().$implicit;na(2),_s("ngIf",!n.encrypted&&!n.isHardware),na(2),_s("ngIf",n.isHardware),na(1),cu("\n ",El(6,3,"backup.show-seed-button"),"\n ")}}function PB(t,e){if(1&t){var n=xs();bs(0,"div",16),uu(1,"\n "),bs(2,"div",17),uu(3),ws(),uu(4,"\n "),bs(5,"div",12),uu(6),ws(),uu(7,"\n "),uu(8,"\n "),bs(9,"div",18),uu(10,"\n "),bs(11,"div",19),Ts("click",(function(){Bn(n);var t=e.$implicit;return Ys(2).saveAddresses(t)})),uu(12),Tl(13,"translate"),ws(),uu(14,"\n "),ps(15,TB,3,3,"div",20),uu(16,"\n "),ps(17,AB,7,5,"div",21),uu(18,"\n "),ws(),uu(19,"\n "),ws()}if(2&t){var i=e.$implicit;na(2),ds("title",i.label),na(1),lu(i.label),na(3),lu(i.id),na(6),lu(El(13,6,"backup.save-addresses-button")),na(3),_s("ngIf",i.encrypted&&!i.isHardware),na(2),_s("ngIf",!i.encrypted||i.isHardware)}}function IB(t,e){if(1&t&&(bs(0,"div",9),uu(1,"\n "),bs(2,"div",10),uu(3,"\n "),bs(4,"div",11),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),bs(8,"div",12),uu(9),Tl(10,"translate"),ws(),uu(11,"\n "),ks(12,"div",13),uu(13,"\n "),ws(),uu(14,"\n "),bs(15,"div",14),uu(16,"\n "),ps(17,PB,20,8,"div",15),uu(18,"\n "),ws(),uu(19,"\n "),ws()),2&t){var n=Ys();na(5),lu(El(6,3,"backup.wallet-table-label")),na(4),lu(El(10,5,"backup.filename-table-label")),na(8),_s("ngForOf",n.wallets)}}var YB=function(){function t(t,e,n,i){this.dialog=t,this.walletsAndAddressesService=e,this.softwareWalletService=n,this.msgBarService=i,this.wallets=[]}return t.prototype.ngOnInit=function(){var t=this;this.folderSubscription=this.walletsAndAddressesService.folder().subscribe((function(e){t.folder=e}),(function(e){t.folder="?",t.msgBarService.showError(e)})),this.walletSubscription=this.walletsAndAddressesService.allWallets.subscribe((function(e){t.wallets=e}))},t.prototype.ngOnDestroy=function(){this.folderSubscription.unsubscribe(),this.walletSubscription.unsubscribe()},t.prototype.saveAddresses=function(t){var e="";t.addresses.forEach((function(t){e+=t.address+"\n"})),e=e.substr(0,e.length-1);var n=new Blob([e],{type:"text/csv;charset=utf-8;"}),i=document.createElement("a");if(void 0!==i.download){var r=URL.createObjectURL(n);i.setAttribute("href",r),i.setAttribute("download",t.label+".csv"),i.style.visibility="hidden",document.body.appendChild(i),i.click(),document.body.removeChild(i)}else this.msgBarService.showError("backup.not-compatible-error")},t.prototype.showSeed=function(t){var e=this;MI.openDialog(this.dialog,{wallet:t}).componentInstance.passwordSubmit.subscribe((function(n){e.softwareWalletService.getWalletSeed(t,n.password).subscribe((function(t){n.close(),DB.openDialog(e.dialog,t)}),(function(t){return n.error(t)}))}))},t.\u0275fac=function(e){return new(e||t)(gs(Dk),gs(hD),gs(RO),gs(Gx))},t.\u0275cmp=Fe({type:t,selectors:[["app-backup"]],decls:32,vars:15,consts:[[3,"headline"],[1,"container"],[1,"paper","small-padding","mb-0"],[1,"mt-0"],[1,"grey-text","mb-0"],[3,"innerHtml"],["noDataText","backup.no-wallets",3,"isLoading",4,"ngIf"],["class","-table",4,"ngIf"],["noDataText","backup.no-wallets",3,"isLoading"],[1,"-table"],[1,"-headers"],[1,"-width-250"],[1,"-width-150"],[1,"-flex-fill"],[1,"-body"],["class","-row",4,"ngFor","ngForOf"],[1,"-row"],[1,"-width-250","text-truncate"],[1,"-flex-fill","text-right"],[1,"link","address-link",3,"click"],["class","link",3,"click",4,"ngIf"],[4,"ngIf"],[1,"link",3,"click"],["class","help-icon",3,"matTooltip",4,"ngIf"],[1,"help-icon",3,"matTooltip"]],template:function(t,e){1&t&&(bs(0,"div"),uu(1,"\n "),ks(2,"app-header",0),Tl(3,"translate"),uu(4,"\n\n "),uu(5,"\n "),bs(6,"div",1),uu(7,"\n "),bs(8,"div",2),uu(9,"\n "),bs(10,"p",3),uu(11),Tl(12,"translate"),ws(),uu(13,"\n "),bs(14,"p"),uu(15),Tl(16,"translate"),ws(),uu(17,"\n "),bs(18,"p",4),uu(19,"\n "),ks(20,"small",5),Tl(21,"translate"),uu(22,"\n "),ws(),uu(23,"\n "),ws(),uu(24,"\n\n "),ps(25,LB,1,1,"app-loading-content",6),uu(26,"\n\n "),uu(27,"\n "),ps(28,IB,20,7,"div",7),uu(29,"\n "),ws(),uu(30,"\n"),ws(),uu(31,"\n")),2&t&&(na(2),_s("headline",El(3,7,"backup.title")),na(9),du("",El(12,9,"backup.wallet-directory")," ",e.folder,""),na(4),lu(El(16,11,"backup.seed-warning")),na(5),_s("innerHtml",El(21,13,"backup.desc"),Yr),na(5),_s("ngIf",0===e.wallets.length),na(3),_s("ngIf",e.wallets.length>0))},directives:[mI,Eh,OY,Lh,vx,UE],pipes:[pC],styles:[".address-link[_ngcontent-%COMP%]{margin-bottom:2px}"]}),t}();function RB(t,e){1&t&&ks(0,"app-loading-content")}function FB(t,e){1&t&&(ks(0,"img",25),Tl(1,"translate")),2&t&&_s("matTooltip",El(1,1,"network.out-help"))}function HB(t,e){1&t&&(ks(0,"img",26),Tl(1,"translate")),2&t&&_s("matTooltip",El(1,1,"network.in-help"))}function BB(t,e){if(1&t&&(bs(0,"div",14),uu(1,"\n "),bs(2,"div",15),uu(3,"\n "),ps(4,FB,2,3,"img",16),uu(5,"\n "),ps(6,HB,2,3,"img",17),uu(7,"\n "),ws(),uu(8,"\n "),bs(9,"div",18),uu(10),bs(11,"span",19),uu(12),ws(),uu(13,"\n "),ws(),uu(14,"\n "),bs(15,"div",20),uu(16),Tl(17,"translate"),ws(),uu(18,"\n "),bs(19,"div",21),uu(20),ws(),uu(21,"\n "),bs(22,"div",22),uu(23,"\n "),bs(24,"div",23),uu(25,"\n "),bs(26,"mat-icon",24),Tl(27,"translate"),uu(28,"keyboard_arrow_up"),ws(),uu(29),Tl(30,"dateFromNow"),ws(),uu(31,"\n "),bs(32,"div",23),uu(33,"\n "),bs(34,"mat-icon",24),Tl(35,"translate"),uu(36,"keyboard_arrow_down"),ws(),uu(37),Tl(38,"dateFromNow"),ws(),uu(39,"\n "),ws(),uu(40,"\n "),ws()),2&t){var n=e.$implicit;na(4),_s("ngIf",n.outgoing),na(2),_s("ngIf",!n.outgoing),na(4),cu("\n ",n.address.split(":")[0],""),na(2),cu(":",n.listenPort,""),na(4),lu(El(17,10,"network.sources."+n.source)),na(4),lu(n.height),na(6),_s("matTooltip",El(27,12,"network.last-sent-help")),na(3),cu("\n ",El(30,14,n.lastSent),"\n "),na(5),_s("matTooltip",El(35,16,"network.last-received-help")),na(3),cu("\n ",El(38,18,n.lastReceived),"\n ")}}function jB(t,e){if(1&t&&(bs(0,"div",3),uu(1,"\n "),bs(2,"div",4),uu(3,"\n "),bs(4,"div",5),uu(5,"\n "),ks(6,"div",6),uu(7,"\n "),bs(8,"div",7),uu(9),Tl(10,"translate"),ws(),uu(11,"\n "),bs(12,"div",8),uu(13),Tl(14,"translate"),ws(),uu(15,"\n "),bs(16,"div",9),uu(17),Tl(18,"translate"),ws(),uu(19,"\n "),bs(20,"div",10),uu(21),Tl(22,"translate"),ws(),uu(23,"\n "),bs(24,"div",11),uu(25),Tl(26,"translate"),ws(),uu(27,"\n "),ws(),uu(28,"\n "),bs(29,"div",12),uu(30,"\n "),ps(31,BB,41,20,"div",13),uu(32,"\n "),ws(),uu(33,"\n "),ws(),uu(34,"\n "),ws()),2&t){var n=Ys();na(9),lu(El(10,6,"network.peer-small-table-label")),na(4),lu(El(14,8,"network.source-small-table-label")),na(4),lu(El(18,10,"network.block-height-small-table-label")),na(4),lu(El(22,12,"network.block-height-short-small-table-label")),na(4),lu(El(26,14,"network.last-seen-small-table-label")),na(6),_s("ngForOf",n.peers)}}var NB=function(){function t(t){this.networkService=t}return t.prototype.ngOnInit=function(){var t=this;this.subscription=this.networkService.connections().subscribe((function(e){return t.peers=e}))},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(gs(rP))},t.\u0275cmp=Fe({type:t,selectors:[["app-network"]],decls:10,vars:5,consts:[[3,"headline"],[4,"ngIf"],["class","container",4,"ngIf"],[1,"container"],[1,"-table"],[1,"-headers"],[1,"-direction-cell"],[1,"-address-cell"],[1,"-flex-fill"],[1,"d-none","d-lg-block","-block-cell"],[1,"d-lg-none","-block-cell"],[1,"-last-seen-cell"],[1,"-body"],["class","-row",4,"ngFor","ngForOf"],[1,"-row"],[1,"-direction-cell","-direction-container"],["src","assets/img/sent-blue.png",3,"matTooltip",4,"ngIf"],["src","assets/img/received-blue.png",3,"matTooltip",4,"ngIf"],[1,"-address-cell","break-all"],[1,"grey-text"],[1,"-flex-fill","grey-text"],[1,"-block-cell","break-all"],[1,"-last-seen-cell","-last-seen-container","grey-text"],[1,"text-truncate"],[3,"matTooltip"],["src","assets/img/sent-blue.png",3,"matTooltip"],["src","assets/img/received-blue.png",3,"matTooltip"]],template:function(t,e){1&t&&(bs(0,"div"),uu(1,"\n "),ks(2,"app-header",0),Tl(3,"translate"),uu(4,"\n\n "),ps(5,RB,1,0,"app-loading-content",1),uu(6,"\n\n "),ps(7,jB,35,16,"div",2),uu(8,"\n"),ws(),uu(9,"\n")),2&t&&(na(2),_s("headline",El(3,3,"network.title")),na(3),_s("ngIf",!e.peers),na(2),_s("ngIf",e.peers))},directives:[mI,Eh,OY,Lh,vx,UE],pipes:[pC,dB],styles:[".-direction-cell[_ngcontent-%COMP%]{width:72px;flex-shrink:0}.-direction-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center}.-direction-container[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-last-seen-cell[_ngcontent-%COMP%]{width:180px;flex-shrink:0}.-last-seen-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;font-size:11px;line-height:1;justify-content:center}.-last-seen-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:12px;display:inline;vertical-align:middle;padding-right:5px}.-address-cell[_ngcontent-%COMP%]{width:200px;flex-shrink:0;padding-left:0!important}.-block-cell[_ngcontent-%COMP%]{width:150px;flex-shrink:0;text-align:right}@media (max-width:991px){.-row[_ngcontent-%COMP%]{font-size:12px!important}.-address-cell[_ngcontent-%COMP%]{width:160px!important}.-block-cell[_ngcontent-%COMP%]{width:100px}}"]}),t}(),WB=function(){function t(t,e){this.httpClient=t,this.walletsAndAddressesService=e,this.configSubject=new Cm(null),this.purchaseOrders=new Cm([]),this.purchaseUrl="https://event.skycoin.com/api/",this.getConfig()}return t.prototype.all=function(){return this.purchaseOrders.asObservable()},t.prototype.config=function(){return this.configSubject.asObservable()},t.prototype.getConfig=function(){var t=this;return this.get("config").pipe(nt((function(t){return{enabled:!0,sky_btc_exchange_rate:parseFloat(t.sky_btc_exchange_rate)}}))).subscribe((function(e){return t.configSubject.next(e)}))},t.prototype.generate=function(t){var e=this;return this.walletsAndAddressesService.addAddressesToWallet(t,1).pipe(st((function(n){return e.post("bind",{skyaddr:n[0].address,coin_type:"BTC"}).pipe(nt((function(e){return{coin_type:e.coin_type,deposit_address:e.deposit_address,filename:t.id,recipient_address:n[0].address,status:"waiting_deposit"}})))})))},t.prototype.scan=function(t){return this.get("status?skyaddr="+t).pipe(nt((function(t){if(!t.statuses||t.statuses.length>1)throw new Error("too many purchase orders found");return t.statuses[0]})))},t.prototype.get=function(t){return this.httpClient.get(this.purchaseUrl+t)},t.prototype.post=function(t,e){return void 0===e&&(e={}),this.httpClient.post(this.purchaseUrl+t,e)},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(Qp),ve(hD))}}),t}(),VB=function(){function t(){this.statuses=["done","waiting_confirm","waiting_deposit","waiting_send"]}return t.prototype.transform=function(t){return this.statuses.find((function(e){return e===t}))?"teller."+t.replace("_","-"):"teller.unknown"},t.\u0275fac=function(e){return new(e||t)},t.\u0275pipe=Ue({name:"tellerStatus",type:t,pure:!0}),t}(),zB=["button"];function UB(t,e){if(1&t&&(bs(0,"option",16),uu(1),bs(2,"span",17),uu(3),Tl(4,"amount"),ws(),uu(5,"\n "),ws()),2&t){var n=e.$implicit;_s("value",n.id),na(1),cu("\n ",n.label," - "),na(2),lu(El(4,3,n.coins))}}var qB=function(t){return{rate:t}};function GB(t,e){if(1&t&&(bs(0,"div",5),uu(1,"\n "),bs(2,"div",6),uu(3,"\n "),bs(4,"span",7),uu(5,"2"),ws(),uu(6,"\n "),ws(),uu(7,"\n "),bs(8,"div",8),uu(9,"\n "),bs(10,"h3"),uu(11),Tl(12,"translate"),ws(),uu(13,"\n "),bs(14,"p"),uu(15),Tl(16,"translate"),ws(),uu(17,"\n "),bs(18,"span",18),uu(19),ws(),uu(20,"\n "),bs(21,"span",14),uu(22),Tl(23,"translate"),ws(),uu(24,"\n "),ws(),uu(25,"\n "),ws()),2&t){var n=Ys(2);na(11),lu(El(12,4,"buy.send")),na(4),lu(Ol(16,6,"buy.send-desc",kl(11,qB,n.config.sky_btc_exchange_rate))),na(4),cu("\n ",n.order.deposit_address,"\n "),na(3),lu(El(23,9,"buy.fraction-warning"))}}function KB(t,e){if(1&t){var n=xs();bs(0,"div",5),uu(1,"\n "),bs(2,"div",6),uu(3,"\n "),bs(4,"span",7),uu(5,"3"),ws(),uu(6,"\n "),ws(),uu(7,"\n "),bs(8,"div",8),uu(9,"\n "),bs(10,"h3"),uu(11),Tl(12,"translate"),ws(),uu(13,"\n "),bs(14,"p"),uu(15),Tl(16,"translate"),ws(),uu(17,"\n "),bs(18,"span",19),uu(19),Tl(20,"translate"),Tl(21,"translate"),Tl(22,"tellerStatus"),ws(),uu(23,"\n "),bs(24,"app-button",20,21),Ts("action",(function(){return Bn(n),Ys(2).checkStatus()})),uu(26),Tl(27,"translate"),ws(),uu(28,"\n "),bs(29,"app-button",22,21),Ts("action",(function(){return Bn(n),Ys(2).removeOrder()})),uu(31),Tl(32,"translate"),ws(),uu(33,"\n "),ws(),uu(34,"\n "),ws()}if(2&t){var i=Ys(2);na(11),lu(El(12,6,"buy.receive")),na(4),lu(El(16,8,"buy.receive-desc")),na(4),du("\n ",El(20,10,"buy.status-button")," ",El(21,12,El(22,14,i.order.status)),"\n "),na(7),cu("\n ",El(27,16,"buy.check-status-button"),"\n "),na(5),cu("\n ",El(32,18,"buy.new-order-button"),"\n ")}}function ZB(t,e){if(1&t&&(bs(0,"div",4),uu(1,"\n "),bs(2,"div",5),uu(3,"\n "),bs(4,"div",6),uu(5,"\n "),bs(6,"span",7),uu(7,"1"),ws(),uu(8,"\n "),ws(),uu(9,"\n "),bs(10,"div",8),uu(11,"\n "),bs(12,"h3"),uu(13),Tl(14,"translate"),ws(),uu(15,"\n "),bs(16,"p"),uu(17),Tl(18,"translate"),ws(),uu(19,"\n "),bs(20,"div",9),uu(21,"\n "),bs(22,"div",10),uu(23,"\n "),bs(24,"select",11),uu(25,"\n "),bs(26,"option",12),uu(27),Tl(28,"translate"),ws(),uu(29,"\n "),ps(30,UB,6,5,"option",13),uu(31,"\n "),ws(),uu(32,"\n "),ws(),uu(33,"\n "),ws(),uu(34,"\n "),bs(35,"span",14),uu(36),Tl(37,"translate"),ws(),uu(38,"\n "),ws(),uu(39,"\n "),ws(),uu(40,"\n "),ps(41,GB,26,13,"div",15),uu(42,"\n "),ps(43,KB,35,20,"div",15),uu(44,"\n "),ws()),2&t){var n=Ys();_s("formGroup",n.form),na(13),lu(El(14,8,"buy.deposit-location")),na(4),lu(El(18,10,"buy.deposit-location-desc")),na(10),lu(El(28,12,"buy.make-choice")),na(3),_s("ngForOf",n.wallets),na(6),lu(El(37,14,"buy.wallets-desc")),na(5),_s("ngIf",n.order),na(2),_s("ngIf",n.order)}}var JB=function(){function t(t,e,n,i){this.formBuilder=t,this.purchaseService=e,this.msgBarService=n,this.walletsAndAddressesService=i,this.subscriptionsGroup=[]}return t.prototype.ngOnInit=function(){this.initForm(),this.loadData()},t.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach((function(t){return t.unsubscribe()}))},t.prototype.checkStatus=function(){var t=this;this.button.setLoading(),this.purchaseService.scan(this.order.recipient_address).subscribe((function(e){t.button.setSuccess(),t.order.status=e.status}),(function(e){return t.button.resetState()}))},t.prototype.removeOrder=function(){window.localStorage.removeItem("purchaseOrder"),this.order=null},t.prototype.initForm=function(){var t=this;this.form=this.formBuilder.group({wallet:["",cM.required]}),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe((function(e){var n=t.wallets.find((function(t){return t.id===e}));console.log("changing wallet value",e),t.purchaseService.generate(n).subscribe((function(e){return t.saveData(e)}),(function(e){return t.msgBarService.showError(e.toString())}))})))},t.prototype.loadConfig=function(){var t=this;this.purchaseService.config().pipe(_p((function(t){return!!t&&!!t.sky_btc_exchange_rate})),Ap()).subscribe((function(e){return t.config=e}))},t.prototype.loadData=function(){var t=this;this.loadConfig(),this.loadOrder(),this.subscriptionsGroup.push(this.walletsAndAddressesService.allWallets.subscribe((function(e){t.wallets=e,t.order&&t.form.get("wallet").setValue(t.order.filename,{emitEvent:!1})})))},t.prototype.loadOrder=function(){var t=JSON.parse(window.localStorage.getItem("purchaseOrder"));t&&(this.order=t,this.updateOrder())},t.prototype.saveData=function(t){this.order=t,window.localStorage.setItem("purchaseOrder",JSON.stringify(t))},t.prototype.updateOrder=function(){var t=this;this.purchaseService.scan(this.order.recipient_address).pipe(Ap()).subscribe((function(e){return t.order.status=e.status}),(function(t){return console.log(t)}))},t.\u0275fac=function(e){return new(e||t)(gs(YS),gs(WB),gs(Gx),gs(hD))},t.\u0275cmp=Fe({type:t,selectors:[["app-buy"]],viewQuery:function(t,e){var n;1&t&&Zl(zB,!0),2&t&&Gl(n=tc())&&(e.button=n.first)},decls:13,vars:1,consts:[[1,"-background-container"],[1,"container"],["class","-paper",3,"formGroup",4,"ngIf"],["src","../../../../assets/img/otc-background.jpg",1,"-background-image"],[1,"-paper",3,"formGroup"],[1,"-step"],[1,"-number"],[1,"primary-gradient-background"],[1,"-instructions","flex-fill"],[1,"form-field"],[1,"-select"],["formControlName","wallet","id","wallet","required","",1,"-wallet"],["disabled","","selected",""],[3,"value",4,"ngFor","ngForOf"],[1,"-subtitle"],["class","-step",4,"ngIf"],[3,"value"],[1,"-coins"],[1,"-address"],[1,"-status"],[1,"primary-button",3,"action"],["button",""],[3,"action"]],template:function(t,e){1&t&&(uu(0,"\n"),ks(1,"app-header"),uu(2,"\n"),bs(3,"div",0),uu(4,"\n "),bs(5,"div",1),uu(6,"\n "),ps(7,ZB,45,16,"div",2),uu(8,"\n "),ks(9,"img",3),uu(10,"\n "),ws(),uu(11,"\n"),ws(),uu(12,"\n")),2&t&&(na(7),_s("ngIf",e.config))},directives:[mI,Eh,rM,hS,CM,iM,yS,kS,xM,EM,Lh,Cx],pipes:[pC,DC,VB],styles:[".-background-container[_ngcontent-%COMP%]{background-color:#fbfbfb;padding-top:30px;max-width:100%;min-height:calc(100% - 190px);overflow:hidden;position:relative}.-background-image[_ngcontent-%COMP%]{display:none}@media (min-width:768px){.-background-image[_ngcontent-%COMP%]{display:block;left:50%;width:80%;position:absolute;top:0}}@media (min-width:992px){.-background-image[_ngcontent-%COMP%]{left:40%;width:90%;max-width:850px}}@media (min-width:1200px){.-background-image[_ngcontent-%COMP%]{left:40%;width:80%;max-width:850px}}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;position:relative;margin-top:30px;max-width:540px;z-index:5}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%]{display:flex;margin-bottom:30px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{width:60px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border-radius:50%;color:#fff;display:inline-block;font-size:16px;font-weight:700;height:40px;line-height:46px;text-align:center;width:40px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%]{flex:1 1}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] button{margin-left:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:0;line-height:46px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px;font-weight:300;line-height:20px;margin-top:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%], .-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%]{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;box-sizing:border-box;color:rgba(30,34,39,.8);display:block;font-size:14px;line-height:20px;margin-bottom:15px;padding:10px;width:100%}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#0072ff}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .form-field[_ngcontent-%COMP%]{margin-bottom:15px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-subtitle[_ngcontent-%COMP%]{color:#8c8e90;font-size:12px;line-height:18px;font-weight:300;opacity:.8}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-wallet[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px}"]}),t}();function QB(t,e){if(1&t&&(bs(0,"mat-option",5),uu(1),ws()),2&t){var n=e.$implicit;_s("value",n.address),na(1),cu("\n ",n.address,"\n ")}}var XB=function(){function t(t,e,n,i){this.walletsAndAddressesService=t,this.dialogRef=e,this.formBuilder=n,this.purchaseService=i,this.addresses=[]}return t.prototype.ngOnInit=function(){var t=this;this.initForm(),this.getWalletsSubscription=this.walletsAndAddressesService.allWallets.subscribe((function(e){t.addresses=e.reduce((function(t,e){return t.concat(e.addresses)}),[])}))},t.prototype.ngOnDestroy=function(){this.getWalletsSubscription.unsubscribe()},t.prototype.generate=function(){var t=this;this.purchaseService.generate(this.form.value.address).subscribe((function(){return t.dialogRef.close()}))},t.prototype.initForm=function(){this.form=this.formBuilder.group({address:["",cM.required]})},t.\u0275fac=function(e){return new(e||t)(gs(hD),gs(bk),gs(YS),gs(WB))},t.\u0275cmp=Fe({type:t,selectors:[["app-add-deposit-address"]],decls:21,vars:11,consts:[[3,"formGroup"],["formControlName","address",1,"input-field",3,"placeholder"],[3,"value",4,"ngFor","ngForOf"],[1,"button-line"],["mat-raised-button","",3,"click"],[3,"value"]],template:function(t,e){1&t&&(uu(0,"\n"),bs(1,"p"),uu(2),Tl(3,"translate"),ws(),uu(4,"\n"),bs(5,"div",0),uu(6,"\n "),bs(7,"mat-select",1),Tl(8,"translate"),uu(9,"\n "),ps(10,QB,2,2,"mat-option",2),uu(11,"\n "),ws(),uu(12,"\n"),ws(),uu(13,"\n"),bs(14,"div",3),uu(15,"\n "),bs(16,"a",4),Ts("click",(function(){return e.generate()})),uu(17),Tl(18,"translate"),ws(),uu(19,"\n"),ws(),uu(20,"\n")),2&t&&(na(2),lu(El(3,5,"buy.deposit-address")),na(3),_s("formGroup",e.form),na(2),_s("placeholder",El(8,7,"buy.select-address")),na(3),_s("ngForOf",e.addresses),na(7),lu(El(18,9,"buy.generate")))},directives:[rM,hS,xF,iM,yS,Lh,$C,sk],pipes:[pC],styles:["mat-select[_ngcontent-%COMP%]{width:100%;padding:40px 0 20px}.button-line[_ngcontent-%COMP%]{margin-top:40px;text-align:right}"]}),t}(),$B=function(){function t(t,e){this.transaction=t,this.dialogRef=e}return t.openDialog=function(e,n){var i=new pk;return i.data=n,i.autoFocus=!1,i.width="800px",e.open(t,i)},t.prototype.closePopup=function(){this.dialogRef.close()},t.\u0275fac=function(e){return new(e||t)(gs(kk),gs(bk))},t.\u0275cmp=Fe({type:t,selectors:[["app-transaction-detail"]],decls:6,vars:6,consts:[[3,"headline","dialog"],[3,"transaction","isPreview"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),bs(3,"app-transaction-info",1),uu(4,"\n "),ws(),uu(5,"\n"),ws()),2&t&&(_s("headline",El(1,4,"history.tx-detail-title"))("dialog",e.dialogRef),na(3),_s("transaction",e.transaction)("isPreview",!1))},directives:[jS,iB],pipes:[pC],styles:["app-transaction-info[_ngcontent-%COMP%]{color:#1e2227}"]}),t}();function tj(t,e){1&t&&(bs(0,"mat-option",14),uu(1),Tl(2,"translate"),ws()),2&t&&(_s("value",Ys().$implicit),na(1),cu("\n ",El(2,2,"history.all-addresses"),"\n "))}function ej(t,e){if(1&t&&(bs(0,"mat-option",15),uu(1),Tl(2,"amount"),Tl(3,"amount"),ws()),2&t){var n=e.$implicit,i=Ys().$implicit;_s("value",n)("disabled",i.allAddressesSelected),na(1),hu("\n ",n.address," - ",El(2,5,n.coins),"\n (",Ol(3,7,n.hours,!1),")\n ")}}function nj(t,e){if(1&t&&(bs(0,"mat-optgroup",11),Tl(1,"amount"),Tl(2,"amount"),uu(3,"\n "),ps(4,tj,3,4,"mat-option",12),uu(5,"\n "),ps(6,ej,4,10,"mat-option",13),uu(7,"\n "),ws()),2&t){var n=e.$implicit;Ns("label","\n ",n.label," - ",El(1,5,n.coins),"\n (",Ol(2,7,n.hours,!1),")\n "),na(4),_s("ngIf",n.addresses.length>1),na(2),_s("ngForOf",n.addresses)}}function ij(t,e){1&t&&(bs(0,"span"),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),lu(El(2,1,"history.filter")))}function rj(t,e){1&t&&(bs(0,"span"),uu(1),Tl(2,"translate"),ws()),2&t&&(na(1),lu(El(2,1,"history.filters")))}function aj(t,e){if(1&t&&(bs(0,"span"),uu(1),ws()),2&t){var n=Ys(2).$implicit;na(1),lu(n.label)}}function oj(t,e){if(1&t&&(bs(0,"span"),uu(1),ws()),2&t){var n=Ys(2).$implicit;na(1),lu(n.address)}}function sj(t,e){if(1&t&&(bs(0,"div",17),uu(1,"\n "),ps(2,aj,2,1,"span",8),uu(3,"\n "),ps(4,oj,2,1,"span",8),uu(5),Tl(6,"amount"),Tl(7,"amount"),ws()),2&t){var n=Ys().$implicit;na(2),_s("ngIf",n.label),na(2),_s("ngIf",!n.label),na(1),du("\n - ",El(6,4,n.coins),"\n (",Ol(7,6,n.hours,!1),")\n ")}}function uj(t,e){if(1&t&&(Ms(0),uu(1,"\n "),ps(2,sj,8,9,"div",16),uu(3,"\n "),Ss()),2&t){var n=e.$implicit;na(2),_s("ngIf",n.label||!n.showingWholeWallet)}}function lj(t,e){if(1&t){var n=xs();bs(0,"img",18),Ts("click",(function(){return Bn(n),Ys(2).removeFilters()})),ws()}}var cj=function(t){return{"bottom-line":t}};function dj(t,e){if(1&t&&(bs(0,"div",5),uu(1,"\n "),bs(2,"mat-select",6),Tl(3,"translate"),uu(4,"\n "),uu(5,"\n "),ps(6,nj,8,10,"mat-optgroup",7),uu(7,"\n "),uu(8,"\n "),bs(9,"mat-select-trigger"),uu(10,"\n "),ps(11,ij,3,3,"span",8),uu(12,"\n "),ps(13,rj,3,3,"span",8),uu(14,"\n "),ps(15,uj,4,1,"ng-container",9),uu(16,"\n "),ws(),uu(17,"\n "),ws(),uu(18,"\n "),ps(19,lj,1,0,"img",10),uu(20,"\n "),ws()),2&t){var n=Ys();_s("formGroup",n.form)("ngClass",kl(10,cj,!n.transactions||0===n.transactions.length)),na(2),_s("placeholder",El(3,8,"history.no-filter")),na(4),_s("ngForOf",n.wallets),na(5),_s("ngIf",1===n.form.get("filter").value.length),na(2),_s("ngIf",n.form.get("filter").value.length>1),na(2),_s("ngForOf",n.form.get("filter").value),na(4),_s("ngIf",n.form.get("filter").value.length>0)}}function hj(t,e){if(1&t&&ks(0,"app-loading-content",19),2&t){var n=Ys();_s("isLoading",!n.transactionsLoaded)("noDataText",n.allTransactions&&0!==n.allTransactions.length?"history.no-txs-filter":"history.no-txs")}}var fj=function(t){return{coinName:t}};function pj(t,e){if(1&t&&(bs(0,"h4"),uu(1),Tl(2,"translate"),bs(3,"span",30),uu(4),Tl(5,"dateTime"),ws(),uu(6,"\n "),ws()),2&t){var n=Ys(2).$implicit,i=Ys(2);na(1),cu("\n ",Ol(2,2,"history.sent",kl(7,fj,i.appService.coinName)),"\n "),na(3),lu(El(5,5,n.timestamp))}}function mj(t,e){if(1&t&&(bs(0,"h4"),uu(1),Tl(2,"translate"),bs(3,"span",31),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()),2&t){var n=Ys(4);na(1),cu("\n ",Ol(2,2,"history.sending",kl(7,fj,n.appService.coinName)),"\n "),na(3),lu(El(5,5,"history.pending-indication"))}}function gj(t,e){if(1&t&&(bs(0,"h4"),uu(1),Tl(2,"translate"),bs(3,"span",30),uu(4),Tl(5,"dateTime"),ws(),uu(6,"\n "),ws()),2&t){var n=Ys(2).$implicit,i=Ys(2);na(1),cu("\n ",Ol(2,2,"history.received",kl(7,fj,i.appService.coinName)),"\n "),na(3),lu(El(5,5,n.timestamp))}}function vj(t,e){if(1&t&&(bs(0,"h4"),uu(1),Tl(2,"translate"),bs(3,"span",31),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()),2&t){var n=Ys(4);na(1),cu("\n ",Ol(2,2,"history.receiving",kl(7,fj,n.appService.coinName)),"\n "),na(3),lu(El(5,5,"history.pending-indication"))}}function _j(t,e){if(1&t&&(Ms(0),uu(1,"\n "),ps(2,pj,7,9,"h4",8),uu(3,"\n "),ps(4,mj,7,9,"h4",8),uu(5,"\n "),ps(6,gj,7,9,"h4",8),uu(7,"\n "),ps(8,vj,7,9,"h4",8),uu(9,"\n "),Ss()),2&t){var n=Ys().$implicit;na(2),_s("ngIf",n.balance.isLessThan(0)&&n.confirmed),na(2),_s("ngIf",n.balance.isLessThan(0)&&!n.confirmed),na(2),_s("ngIf",n.balance.isGreaterThan(0)&&n.confirmed),na(2),_s("ngIf",n.balance.isGreaterThan(0)&&!n.confirmed)}}function yj(t,e){if(1&t&&(bs(0,"h4"),uu(1),Tl(2,"translate"),bs(3,"span",30),uu(4),Tl(5,"dateTime"),ws(),uu(6,"\n "),ws()),2&t){var n=Ys(2).$implicit,i=Ys(2);na(1),cu("\n ",Ol(2,2,"history.moved",kl(7,fj,i.appService.coinName)),"\n "),na(3),lu(El(5,5,n.timestamp))}}function bj(t,e){if(1&t&&(bs(0,"h4"),uu(1),Tl(2,"translate"),bs(3,"span",31),uu(4),Tl(5,"translate"),ws(),uu(6,"\n "),ws()),2&t){var n=Ys(4);na(1),cu("\n ",Ol(2,2,"history.moving",kl(7,fj,n.appService.coinName)),"\n "),na(3),lu(El(5,5,"history.pending-indication"))}}function wj(t,e){if(1&t&&(Ms(0),uu(1,"\n "),ps(2,yj,7,9,"h4",8),uu(3,"\n "),ps(4,bj,7,9,"h4",8),uu(5,"\n "),Ss()),2&t){var n=Ys().$implicit;na(2),_s("ngIf",n.confirmed),na(2),_s("ngIf",!n.confirmed)}}function kj(t,e){if(1&t&&(bs(0,"div",32),uu(1,"\n "),ks(2,"app-qr-code-button",33),uu(3,"\n "),bs(4,"span",34),uu(5),ws(),uu(6,"\n "),ws()),2&t){var n=e.$implicit;na(2),_s("address",n),na(3),lu(n)}}function Mj(t,e){if(1&t&&(bs(0,"div",32),uu(1,"\n "),bs(2,"span"),uu(3),Tl(4,"translate"),bs(5,"span",35),uu(6),ws(),ws(),uu(7,"\n "),ws()),2&t){var n=Ys().$implicit;na(3),cu("",El(4,2,"history.transaction-note-small-label")," "),na(3),lu(n.note)}}function Sj(t,e){if(1&t&&(bs(0,"p",36),Tl(1,"translate"),uu(2),Tl(3,"currency"),bs(4,"span"),uu(5,"*"),ws(),uu(6,"\n "),ws()),2&t){var n=Ys().$implicit,i=Ys(2);_s("matTooltip",El(1,2,"tx.current-rate-help")),na(2),cu("\n ",Pl(3,4,n.balance*i.price,"USD","symbol","1.2-2"),"")}}var Cj=function(t){return{"-pending":t}};function xj(t,e){if(1&t){var n=xs();Ms(0),uu(1,"\n "),bs(2,"div",22),Ts("click",(function(){Bn(n);var t=e.$implicit;return Ys(2).showTransaction(t)})),uu(3,"\n "),bs(4,"div",23),uu(5,"\n "),ks(6,"img",24),uu(7,"\n "),ws(),uu(8,"\n "),bs(9,"div",25),uu(10,"\n "),ps(11,_j,10,4,"ng-container",8),uu(12,"\n "),ps(13,wj,6,2,"ng-container",8),uu(14,"\n "),ps(15,kj,7,2,"div",26),uu(16,"\n "),ps(17,Mj,8,4,"div",27),uu(18,"\n "),ws(),uu(19,"\n "),bs(20,"div",28),uu(21,"\n "),bs(22,"h4"),uu(23),Tl(24,"amount"),ws(),uu(25,"\n "),ps(26,Sj,7,9,"p",29),uu(27,"\n "),ws(),uu(28,"\n "),ws(),uu(29,"\n "),Ss()}if(2&t){var i=e.$implicit,r=Ys(2);na(4),_s("ngClass",kl(10,Cj,!i.confirmed)),na(2),_s("src","assets/img/"+(i.balance.isGreaterThan(0)&&!i.coinsMovedInternally?"received":"sent")+"-blue.png",Rr),na(5),_s("ngIf",!i.coinsMovedInternally),na(2),_s("ngIf",i.coinsMovedInternally),na(2),_s("ngForOf",i.relevantAddresses),na(2),_s("ngIf",i.note),na(6),lu(El(24,8,i.balance.toString())),na(3),_s("ngIf",r.price)}}var Dj=function(t){return{number:t}};function Lj(t,e){if(1&t){var n=xs();bs(0,"div",37),Ts("click",(function(){return Bn(n),Ys(2).showAll()})),uu(1),Tl(2,"translate"),ws()}if(2&t){var i=Ys(2);na(1),lu(Ol(2,1,"history.view-all",kl(4,Dj,i.totalElements)))}}function Tj(t,e){if(1&t&&(bs(0,"div",20),uu(1,"\n "),ps(2,xj,30,12,"ng-container",9),uu(3,"\n "),ps(4,Lj,3,6,"div",21),uu(5,"\n "),ws()),2&t){var n=Ys();na(2),_s("ngForOf",n.transactions),na(2),_s("ngIf",n.viewingTruncatedList)}}var Ej=function(){function t(t,e,n,i,r,a,o){var s=this;this.appService=t,this.dialog=e,this.priceService=n,this.formBuilder=i,this.historyService=r,this.transactionsLoaded=!1,this.maxInitialElements=40,this.viewAll=!1,this.viewingTruncatedList=!1,this.form=this.formBuilder.group({filter:[[]]}),this.routeSubscription=o.queryParams.subscribe((function(t){var e=t.addr?t.addr.split(","):[],n=t.wal?t.wal.split(","):[];e=e.map((function(t){return"a-"+t})),n=n.map((function(t){return"w-"+t})),s.viewAll=!1,s.requestedFilters=e.concat(n),s.showRequestedFilters()})),this.walletsSubscription=a.walletsWithBalance.subscribe((function(t){var e=new Map,n=new Map;s.form.get("filter").value.forEach((function(t){t.addresses?n.set(t.id,!0):e.set(t.walletID+"/"+t.address,!0)}));var i=[];s.wallets=[],t.forEach((function(t){var r={id:t.id,label:t.label,coins:t.coins.decimalPlaces(6).toString(),hours:t.hours.decimalPlaces(0).toString(),addresses:[],allAddressesSelected:n.has(t.id)};s.wallets.push(r),n.has(t.id)&&i.push(r),t.addresses.forEach((function(r){var a={walletID:t.id,address:r.address,coins:r.coins.decimalPlaces(6).toString(),hours:r.hours.decimalPlaces(0).toString(),showingWholeWallet:n.has(t.id)};s.wallets[s.wallets.length-1].addresses.push(a),e.has(t.id+"/"+r.address)&&i.push(a)}))})),s.form.get("filter").setValue(i,{emitEvent:!1}),s.loadTransactions(0)}))}return t.prototype.ngOnInit=function(){var t=this;this.priceSubscription=this.priceService.price.subscribe((function(e){return t.price=e})),this.filterSubscription=this.form.get("filter").valueChanges.subscribe((function(){t.viewAll=!1,t.filterTransactions()}))},t.prototype.ngOnDestroy=function(){this.priceSubscription.unsubscribe(),this.filterSubscription.unsubscribe(),this.walletsSubscription.unsubscribe(),this.routeSubscription.unsubscribe(),this.removeTransactionsSubscription()},t.prototype.showAll=function(){this.viewAll||(this.viewAll=!0,this.filterTransactions())},t.prototype.showTransaction=function(t){$B.openDialog(this.dialog,t)},t.prototype.removeFilters=function(){this.form.get("filter").setValue([])},t.prototype.loadTransactions=function(t){var e=this;this.removeTransactionsSubscription(),this.transactionsSubscription=rp(1).pipe(up(t),st((function(){return e.historyService.getTransactionsHistory(null)}))).subscribe((function(t){e.allTransactions=t,e.transactionsLoaded=!0,e.showRequestedFilters(),e.filterTransactions()}),(function(){return e.loadTransactions(2e3)}))},t.prototype.filterTransactions=function(){var t=this.form.get("filter").value;if(this.wallets.forEach((function(t){t.allAddressesSelected=!1,t.addresses.forEach((function(t){return t.showingWholeWallet=!1}))})),0===t.length)this.transactions=this.allTransactions;else{var e=new Map;t.forEach((function(t){t.addresses?(t.addresses.forEach((function(t){e.set(t.address,!0),t.showingWholeWallet=!0})),t.allAddressesSelected=!0):e.set(t.address,!0)})),this.transactions=this.allTransactions.filter((function(t){return t.inputs.some((function(t){return e.has(t.address)}))||t.outputs.some((function(t){return e.has(t.address)}))}))}this.totalElements=this.transactions.length,!this.viewAll&&this.totalElements>this.maxInitialElements?(this.transactions=this.transactions.slice(0,this.maxInitialElements),this.viewingTruncatedList=!0):this.viewingTruncatedList=!1},t.prototype.showRequestedFilters=function(){var t=this;if(this.transactionsLoaded&&this.wallets&&0!==this.wallets.length&&null!=this.requestedFilters){if(this.requestedFilters.length>0){var e=[];this.requestedFilters.forEach((function(n){var i=n.substr(2,n.length-2);t.wallets.forEach((function(t){n.startsWith("w-")?i===t.id&&e.push(t):n.startsWith("a-")&&t.addresses.forEach((function(t){i===t.address&&e.push(t)}))}))})),this.form.get("filter").setValue(e)}else this.form.get("filter").setValue([]);this.requestedFilters=null}},t.prototype.removeTransactionsSubscription=function(){this.transactionsSubscription&&this.transactionsSubscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(gs(Sm),gs(Dk),gs(nP),gs(YS),gs(II),gs(MO),gs(yL))},t.\u0275cmp=Fe({type:t,selectors:[["app-transaction-list"]],decls:14,vars:6,consts:[[3,"headline"],[1,"container"],["class","form-field",3,"formGroup","ngClass",4,"ngIf"],[3,"isLoading","noDataText",4,"ngIf"],["class","paper",4,"ngIf"],[1,"form-field",3,"formGroup","ngClass"],["multiple","","formControlName","filter","id","filter",3,"placeholder"],[3,"label",4,"ngFor","ngForOf"],[4,"ngIf"],[4,"ngFor","ngForOf"],["class","x-button image-button","src","assets/img/delete-grey.png",3,"click",4,"ngIf"],[3,"label"],[3,"value",4,"ngIf"],[3,"value","disabled",4,"ngFor","ngForOf"],[3,"value"],[3,"value","disabled"],["class","filter text-truncate",4,"ngIf"],[1,"filter","text-truncate"],["src","assets/img/delete-grey.png",1,"x-button","image-button",3,"click"],[3,"isLoading","noDataText"],[1,"paper"],["class","view-all-button",3,"click",4,"ngIf"],[1,"-transaction",3,"click"],[1,"-icon",3,"ngClass"],[3,"src"],[1,"-address"],["class","-item",4,"ngFor","ngForOf"],["class","-item",4,"ngIf"],[1,"-balance"],[3,"matTooltip",4,"ngIf"],[1,"-timestamp"],[1,"-pending"],[1,"-item"],[3,"address"],[1,"break-all"],[1,"note"],[3,"matTooltip"],[1,"view-all-button",3,"click"]],template:function(t,e){1&t&&(ks(0,"app-header",0),Tl(1,"translate"),uu(2,"\n"),bs(3,"div",1),uu(4,"\n "),uu(5,"\n "),ps(6,dj,21,12,"div",2),uu(7,"\n\n "),ps(8,hj,1,2,"app-loading-content",3),uu(9,"\n\n "),uu(10,"\n "),ps(11,Tj,6,2,"div",4),uu(12,"\n"),ws(),uu(13,"\n")),2&t&&(_s("headline",El(1,4,"history.title-and-button")),na(6),_s("ngIf",e.transactionsLoaded),na(2),_s("ngIf",!e.transactions||0===e.transactions.length),na(3),_s("ngIf",e.transactions&&e.transactions.length>0))},directives:[mI,Eh,rM,hS,Ch,xF,iM,yS,Lh,CF,ek,sk,OY,qI,UE],pipes:[pC,DC,NH,sf],styles:['.form-field[_ngcontent-%COMP%]{margin:10px 30px -21px;display:flex}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%]{background:transparent;border:0;border-radius:0}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .mat-select-value{font-size:13px;line-height:1.7}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .left-icon[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .mat-select-placeholder:before, .form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] mat-select-trigger[_ngcontent-%COMP%]:before{content:"filter_list";font-family:Material Icons;font-weight:400;font-style:normal;font-size:13px;margin-right:10px;position:relative;top:1px}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .mat-select-placeholder{color:rgba(30,34,39,.5)!important}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .filter[_ngcontent-%COMP%]{font-size:13px;margin-left:28px;color:rgba(30,34,39,.5)}.form-field[_ngcontent-%COMP%] .x-button[_ngcontent-%COMP%]{width:24px;height:24px;margin-top:10px}.bottom-line[_ngcontent-%COMP%]{border-bottom:2px solid rgba(30,34,39,.05)}.paper[_ngcontent-%COMP%]{padding:0}.-transaction[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid rgba(30,34,39,.05);cursor:pointer;display:flex;padding:20px 12px}.-transaction[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0 8px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%]{margin-top:5px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-transaction[_ngcontent-%COMP%] .-icon.-pending[_ngcontent-%COMP%]{opacity:.5}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{flex:1}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:1.15;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:11px;line-height:1.2;padding-left:5px;font-weight:300}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-pending[_ngcontent-%COMP%]{color:#ffc125}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] app-qr-code-button[_ngcontent-%COMP%]{vertical-align:middle;margin-right:4px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:13px;line-height:1.15}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] .note[_ngcontent-%COMP%]{color:#1e2227;word-break:break-word}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%]{width:200px;text-align:right;font-size:13px;line-height:1.15}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-weight:700;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;margin:0}.-transaction[_ngcontent-%COMP%]:hover{background-color:#f7f7f7}.view-all-button[_ngcontent-%COMP%]{color:#0072ff;font-size:13px;text-align:center;padding:20px;cursor:pointer}']}),t}(),Oj=["*",[["mat-card-footer"]]],Aj=["*","mat-card-footer"],Pj=[[["","mat-card-avatar",""],["","matCardAvatar",""]],[["mat-card-title"],["mat-card-subtitle"],["","mat-card-title",""],["","mat-card-subtitle",""],["","matCardTitle",""],["","matCardSubtitle",""]],"*"],Ij=["[mat-card-avatar], [matCardAvatar]","mat-card-title, mat-card-subtitle,\n [mat-card-title], [mat-card-subtitle],\n [matCardTitle], [matCardSubtitle]","*"],Yj=[[["mat-card-title"],["mat-card-subtitle"],["","mat-card-title",""],["","mat-card-subtitle",""],["","matCardTitle",""],["","matCardSubtitle",""]],[["img"]],"*"],Rj=["mat-card-title, mat-card-subtitle,\n [mat-card-title], [mat-card-subtitle],\n [matCardTitle], [matCardSubtitle]","img","*"],Fj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-card-content"],["","mat-card-content",""],["","matCardContent",""]],hostAttrs:[1,"mat-card-content"]}),t}(),Hj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-card-title"],["","mat-card-title",""],["","matCardTitle",""]],hostAttrs:[1,"mat-card-title"]}),t}(),Bj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-card-subtitle"],["","mat-card-subtitle",""],["","matCardSubtitle",""]],hostAttrs:[1,"mat-card-subtitle"]}),t}(),jj=function(){var t=function t(){_(this,t),this.align="start"};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-card-actions"]],hostAttrs:[1,"mat-card-actions"],hostVars:2,hostBindings:function(t,e){2&t&&Js("mat-card-actions-align-end","end"===e.align)},inputs:{align:"align"},exportAs:["matCardActions"]}),t}(),Nj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-card-footer"]],hostAttrs:[1,"mat-card-footer"]}),t}(),Wj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-card-image",""],["","matCardImage",""]],hostAttrs:[1,"mat-card-image"]}),t}(),Vj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-card-sm-image",""],["","matCardImageSmall",""]],hostAttrs:[1,"mat-card-sm-image"]}),t}(),zj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-card-md-image",""],["","matCardImageMedium",""]],hostAttrs:[1,"mat-card-md-image"]}),t}(),Uj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-card-lg-image",""],["","matCardImageLarge",""]],hostAttrs:[1,"mat-card-lg-image"]}),t}(),qj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-card-xl-image",""],["","matCardImageXLarge",""]],hostAttrs:[1,"mat-card-xl-image"]}),t}(),Gj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-card-avatar",""],["","matCardAvatar",""]],hostAttrs:[1,"mat-card-avatar"]}),t}(),Kj=function(){var t=function t(e){_(this,t),this._animationMode=e};return t.\u0275fac=function(e){return new(e||t)(gs(gw,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-card"]],hostAttrs:[1,"mat-card","mat-focus-indicator"],hostVars:2,hostBindings:function(t,e){2&t&&Js("_mat-animation-noopable","NoopAnimations"===e._animationMode)},exportAs:["matCard"],ngContentSelectors:Aj,decls:4,vars:0,template:function(t,e){1&t&&(Fs(Oj),Hs(0),uu(1,"\n"),Hs(2,1),uu(3,"\n"))},styles:[".mat-card{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);display:block;position:relative;padding:16px;border-radius:4px}._mat-animation-noopable.mat-card{transition:none;animation:none}.mat-card .mat-divider-horizontal{position:absolute;left:0;width:100%}[dir=rtl] .mat-card .mat-divider-horizontal{left:auto;right:0}.mat-card .mat-divider-horizontal.mat-divider-inset{position:static;margin:0}[dir=rtl] .mat-card .mat-divider-horizontal.mat-divider-inset{margin-right:0}.cdk-high-contrast-active .mat-card{outline:solid 1px}.mat-card-actions,.mat-card-subtitle,.mat-card-content{display:block;margin-bottom:16px}.mat-card-title{display:block;margin-bottom:8px}.mat-card-actions{margin-left:-8px;margin-right:-8px;padding:8px 0}.mat-card-actions-align-end{display:flex;justify-content:flex-end}.mat-card-image{width:calc(100% + 32px);margin:0 -16px 16px -16px}.mat-card-footer{display:block;margin:0 -16px -16px -16px}.mat-card-actions .mat-button,.mat-card-actions .mat-raised-button,.mat-card-actions .mat-stroked-button{margin:0 8px}.mat-card-header{display:flex;flex-direction:row}.mat-card-header .mat-card-title{margin-bottom:12px}.mat-card-header-text{margin:0 16px}.mat-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;object-fit:cover}.mat-card-title-group{display:flex;justify-content:space-between}.mat-card-sm-image{width:80px;height:80px}.mat-card-md-image{width:112px;height:112px}.mat-card-lg-image{width:152px;height:152px}.mat-card-xl-image{width:240px;height:240px;margin:-8px}.mat-card-title-group>.mat-card-xl-image{margin:-8px 0 8px}@media(max-width: 599px){.mat-card-title-group{margin:0}.mat-card-xl-image{margin-left:0;margin-right:0}}.mat-card>:first-child,.mat-card-content>:first-child{margin-top:0}.mat-card>:last-child:not(.mat-card-footer),.mat-card-content>:last-child:not(.mat-card-footer){margin-bottom:0}.mat-card-image:first-child{margin-top:-16px;border-top-left-radius:inherit;border-top-right-radius:inherit}.mat-card>.mat-card-actions:last-child{margin-bottom:-8px;padding-bottom:0}.mat-card-actions .mat-button:first-child,.mat-card-actions .mat-raised-button:first-child,.mat-card-actions .mat-stroked-button:first-child{margin-left:0;margin-right:0}.mat-card-title:not(:first-child),.mat-card-subtitle:not(:first-child){margin-top:-4px}.mat-card-header .mat-card-subtitle:not(:first-child){margin-top:-8px}.mat-card>.mat-card-xl-image:first-child{margin-top:-8px}.mat-card>.mat-card-xl-image:last-child{margin-bottom:-8px}\n"],encapsulation:2,changeDetection:0}),t}(),Zj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["mat-card-header"]],hostAttrs:[1,"mat-card-header"],ngContentSelectors:Ij,decls:9,vars:0,consts:[[1,"mat-card-header-text"]],template:function(t,e){1&t&&(Fs(Pj),Hs(0),uu(1,"\n"),bs(2,"div",0),uu(3,"\n "),Hs(4,1),uu(5,"\n"),ws(),uu(6,"\n"),Hs(7,2),uu(8,"\n"))},encapsulation:2,changeDetection:0}),t}(),Jj=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["mat-card-title-group"]],hostAttrs:[1,"mat-card-title-group"],ngContentSelectors:Rj,decls:9,vars:0,template:function(t,e){1&t&&(Fs(Yj),bs(0,"div"),uu(1,"\n "),Hs(2),uu(3,"\n"),ws(),uu(4,"\n"),Hs(5,1),uu(6,"\n"),Hs(7,2),uu(8,"\n"))},encapsulation:2,changeDetection:0}),t}(),Qj=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[xw],xw]}),t}(),Xj=0,$j=new se("CdkAccordion"),tN=function(){var t=function(){function t(){_(this,t),this._stateChanges=new z,this._openCloseAllActions=new z,this.id="cdk-accordion-".concat(Xj++),this._multi=!1}return b(t,[{key:"openAll",value:function(){this._openCloseAll(!0)}},{key:"closeAll",value:function(){this._openCloseAll(!1)}},{key:"ngOnChanges",value:function(t){this._stateChanges.next(t)}},{key:"ngOnDestroy",value:function(){this._stateChanges.complete()}},{key:"_openCloseAll",value:function(t){this.multi&&this._openCloseAllActions.next(t)}},{key:"multi",get:function(){return this._multi},set:function(t){this._multi=Em(t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["cdk-accordion"],["","cdkAccordion",""]],inputs:{multi:"multi"},exportAs:["cdkAccordion"],features:[Pu([{provide:$j,useExisting:t}]),fn]}),t}(),eN=0,nN=function(){var t=function(){function t(e,n,i){var r=this;_(this,t),this.accordion=e,this._changeDetectorRef=n,this._expansionDispatcher=i,this._openCloseAllSubscription=x.EMPTY,this.closed=new Rl,this.opened=new Rl,this.destroyed=new Rl,this.expandedChange=new Rl,this.id="cdk-accordion-child-".concat(eN++),this._expanded=!1,this._disabled=!1,this._removeUniqueSelectionListener=function(){},this._removeUniqueSelectionListener=i.listen((function(t,e){r.accordion&&!r.accordion.multi&&r.accordion.id===e&&r.id!==t&&(r.expanded=!1)})),this.accordion&&(this._openCloseAllSubscription=this._subscribeToOpenCloseAllActions())}return b(t,[{key:"ngOnDestroy",value:function(){this.opened.complete(),this.closed.complete(),this.destroyed.emit(),this.destroyed.complete(),this._removeUniqueSelectionListener(),this._openCloseAllSubscription.unsubscribe()}},{key:"toggle",value:function(){this.disabled||(this.expanded=!this.expanded)}},{key:"close",value:function(){this.disabled||(this.expanded=!1)}},{key:"open",value:function(){this.disabled||(this.expanded=!0)}},{key:"_subscribeToOpenCloseAllActions",value:function(){var t=this;return this.accordion._openCloseAllActions.subscribe((function(e){t.disabled||(t.expanded=e)}))}},{key:"expanded",get:function(){return this._expanded},set:function(t){t=Em(t),this._expanded!==t&&(this._expanded=t,this.expandedChange.emit(t),t?(this.opened.emit(),this._expansionDispatcher.notify(this.id,this.accordion?this.accordion.id:this.id)):this.closed.emit(),this._changeDetectorRef.markForCheck())}},{key:"disabled",get:function(){return this._disabled},set:function(t){this._disabled=Em(t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs($j,12),gs(Lo),gs(Ag))},t.\u0275dir=ze({type:t,selectors:[["cdk-accordion-item"],["","cdkAccordionItem",""]],inputs:{expanded:"expanded",disabled:"disabled"},outputs:{closed:"closed",opened:"opened",destroyed:"destroyed",expandedChange:"expandedChange"},exportAs:["cdkAccordionItem"],features:[Pu([{provide:$j,useValue:void 0}])]}),t}(),iN=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)}}),t}(),rN=["body"];function aN(t,e){}var oN=[[["mat-expansion-panel-header"]],"*",[["mat-action-row"]]],sN=["mat-expansion-panel-header","*","mat-action-row"];function uN(t,e){1&t&&ks(0,"span",2),2&t&&_s("@indicatorRotate",Ys()._getExpandedState())}var lN=[[["mat-panel-title"]],[["mat-panel-description"]],"*"],cN=["mat-panel-title","mat-panel-description","*"],dN=new se("MAT_ACCORDION"),hN="225ms cubic-bezier(0.4,0.0,0.2,1)",fN={indicatorRotate:D_("indicatorRotate",[A_("collapsed, void",O_({transform:"rotate(0deg)"})),A_("expanded",O_({transform:"rotate(180deg)"})),I_("expanded <=> collapsed, void => collapsed",L_(hN))]),bodyExpansion:D_("bodyExpansion",[A_("collapsed, void",O_({height:"0px",visibility:"hidden"})),A_("expanded",O_({height:"*",visibility:"visible"})),I_("expanded <=> collapsed, void => collapsed",L_(hN))])},pN=function(){var t=function t(e){_(this,t),this._template=e};return t.\u0275fac=function(e){return new(e||t)(gs(ul))},t.\u0275dir=ze({type:t,selectors:[["ng-template","matExpansionPanelContent",""]]}),t}(),mN=0,gN=new se("MAT_EXPANSION_PANEL_DEFAULT_OPTIONS"),vN=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s,u){var l;return _(this,n),(l=e.call(this,t,i,r))._viewContainerRef=a,l._animationMode=s,l._hideToggle=!1,l.afterExpand=new Rl,l.afterCollapse=new Rl,l._inputChanges=new z,l._headerId="mat-expansion-panel-header-".concat(mN++),l._bodyAnimationDone=new z,l.accordion=t,l._document=o,l._bodyAnimationDone.pipe(Vm((function(t,e){return t.fromState===e.fromState&&t.toState===e.toState}))).subscribe((function(t){"void"!==t.fromState&&("expanded"===t.toState?l.afterExpand.emit():"collapsed"===t.toState&&l.afterCollapse.emit())})),u&&(l.hideToggle=u.hideToggle),l}return b(n,[{key:"_hasSpacing",value:function(){return!!this.accordion&&this.expanded&&"default"===this.accordion.displayMode}},{key:"_getExpandedState",value:function(){return this.expanded?"expanded":"collapsed"}},{key:"toggle",value:function(){this.expanded=!this.expanded}},{key:"close",value:function(){this.expanded=!1}},{key:"open",value:function(){this.expanded=!0}},{key:"ngAfterContentInit",value:function(){var t=this;this._lazyContent&&this.opened.pipe(rg(null),_p((function(){return t.expanded&&!t._portal})),kp(1)).subscribe((function(){t._portal=new jg(t._lazyContent._template,t._viewContainerRef)}))}},{key:"ngOnChanges",value:function(t){this._inputChanges.next(t)}},{key:"ngOnDestroy",value:function(){r(i(n.prototype),"ngOnDestroy",this).call(this),this._bodyAnimationDone.complete(),this._inputChanges.complete()}},{key:"_containsFocus",value:function(){if(this._body){var t=this._document.activeElement,e=this._body.nativeElement;return t===e||e.contains(t)}return!1}},{key:"hideToggle",get:function(){return this._hideToggle||this.accordion&&this.accordion.hideToggle},set:function(t){this._hideToggle=Em(t)}},{key:"togglePosition",get:function(){return this._togglePosition||this.accordion&&this.accordion.togglePosition},set:function(t){this._togglePosition=t}}]),n}(nN);return t.\u0275fac=function(e){return new(e||t)(gs(dN,12),gs(Lo),gs(Ag),gs(cl),gs(ud),gs(gw,8),gs(gN,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-expansion-panel"]],contentQueries:function(t,e,n){var i;1&t&&Ql(n,pN,!0),2&t&&Gl(i=tc())&&(e._lazyContent=i.first)},viewQuery:function(t,e){var n;1&t&&Zl(rN,!0),2&t&&Gl(n=tc())&&(e._body=n.first)},hostAttrs:[1,"mat-expansion-panel"],hostVars:6,hostBindings:function(t,e){2&t&&Js("mat-expanded",e.expanded)("_mat-animation-noopable","NoopAnimations"===e._animationMode)("mat-expansion-panel-spacing",e._hasSpacing())},inputs:{disabled:"disabled",expanded:"expanded",hideToggle:"hideToggle",togglePosition:"togglePosition"},outputs:{opened:"opened",closed:"closed",expandedChange:"expandedChange",afterExpand:"afterExpand",afterCollapse:"afterCollapse"},exportAs:["matExpansionPanel"],features:[Pu([{provide:dN,useValue:void 0}]),Jo,fn],ngContentSelectors:sN,decls:15,vars:4,consts:[["role","region",1,"mat-expansion-panel-content",3,"id"],["body",""],[1,"mat-expansion-panel-body"],[3,"cdkPortalOutlet"]],template:function(t,e){1&t&&(Fs(oN),Hs(0),uu(1,"\n"),bs(2,"div",0,1),Ts("@bodyExpansion.done",(function(t){return e._bodyAnimationDone.next(t)})),uu(4,"\n "),bs(5,"div",2),uu(6,"\n "),Hs(7,1),uu(8,"\n "),ps(9,aN,0,0,"ng-template",3),uu(10,"\n "),ws(),uu(11,"\n "),Hs(12,2),uu(13,"\n"),ws(),uu(14,"\n")),2&t&&(na(2),_s("@bodyExpansion",e._getExpandedState())("id",e.id),ds("aria-labelledby",e._headerId),na(7),_s("cdkPortalOutlet",e._portal))},directives:[Ug],styles:[".mat-expansion-panel{box-sizing:content-box;display:block;margin:0;border-radius:4px;overflow:hidden;transition:margin 225ms cubic-bezier(0.4, 0, 0.2, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);position:relative}.mat-accordion .mat-expansion-panel:not(.mat-expanded),.mat-accordion .mat-expansion-panel:not(.mat-expansion-panel-spacing){border-radius:0}.mat-accordion .mat-expansion-panel:first-of-type{border-top-right-radius:4px;border-top-left-radius:4px}.mat-accordion .mat-expansion-panel:last-of-type{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.cdk-high-contrast-active .mat-expansion-panel{outline:solid 1px}.mat-expansion-panel.ng-animate-disabled,.ng-animate-disabled .mat-expansion-panel,.mat-expansion-panel._mat-animation-noopable{transition:none}.mat-expansion-panel-content{display:flex;flex-direction:column;overflow:visible}.mat-expansion-panel-body{padding:0 24px 16px}.mat-expansion-panel-spacing{margin:16px 0}.mat-accordion>.mat-expansion-panel-spacing:first-child,.mat-accordion>*:first-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-top:0}.mat-accordion>.mat-expansion-panel-spacing:last-child,.mat-accordion>*:last-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-bottom:0}.mat-action-row{border-top-style:solid;border-top-width:1px;display:flex;flex-direction:row;justify-content:flex-end;padding:16px 8px 16px 24px}.mat-action-row button.mat-button-base,.mat-action-row button.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-action-row button.mat-button-base,[dir=rtl] .mat-action-row button.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"],encapsulation:2,data:{animation:[fN.bodyExpansion]},changeDetection:0}),t}(),_N=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-action-row"]],hostAttrs:[1,"mat-action-row"]}),t}(),yN=function(){var t=function(){function t(e,n,i,r,a,o){var s=this;_(this,t),this.panel=e,this._element=n,this._focusMonitor=i,this._changeDetectorRef=r,this._animationMode=o,this._parentChangeSubscription=x.EMPTY;var u=e.accordion?e.accordion._stateChanges.pipe(_p((function(t){return!(!t.hideToggle&&!t.togglePosition)}))):np;this._parentChangeSubscription=ft(e.opened,e.closed,u,e._inputChanges.pipe(_p((function(t){return!!(t.hideToggle||t.disabled||t.togglePosition)})))).subscribe((function(){return s._changeDetectorRef.markForCheck()})),e.closed.pipe(_p((function(){return e._containsFocus()}))).subscribe((function(){return i.focusVia(n,"program")})),a&&(this.expandedHeight=a.expandedHeight,this.collapsedHeight=a.collapsedHeight)}return b(t,[{key:"_toggle",value:function(){this.disabled||this.panel.toggle()}},{key:"_isExpanded",value:function(){return this.panel.expanded}},{key:"_getExpandedState",value:function(){return this.panel._getExpandedState()}},{key:"_getPanelId",value:function(){return this.panel.id}},{key:"_getTogglePosition",value:function(){return this.panel.togglePosition}},{key:"_showToggle",value:function(){return!this.panel.hideToggle&&!this.panel.disabled}},{key:"_getHeaderHeight",value:function(){var t=this._isExpanded();return t&&this.expandedHeight?this.expandedHeight:!t&&this.collapsedHeight?this.collapsedHeight:null}},{key:"_keydown",value:function(t){switch(t.keyCode){case $g:case Qg:nv(t)||(t.preventDefault(),this._toggle());break;default:return void(this.panel.accordion&&this.panel.accordion._handleHeaderKeydown(t))}}},{key:"focus",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"program",e=arguments.length>1?arguments[1]:void 0;this._focusMonitor.focusVia(this._element,t,e)}},{key:"ngAfterViewInit",value:function(){var t=this;this._focusMonitor.monitor(this._element).subscribe((function(e){e&&t.panel.accordion&&t.panel.accordion._handleHeaderFocus(t)}))}},{key:"ngOnDestroy",value:function(){this._parentChangeSubscription.unsubscribe(),this._focusMonitor.stopMonitoring(this._element)}},{key:"disabled",get:function(){return this.panel.disabled}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(vN,1),gs(Hu),gs(m_),gs(Lo),gs(gN,8),gs(gw,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-expansion-panel-header"]],hostAttrs:["role","button",1,"mat-expansion-panel-header","mat-focus-indicator"],hostVars:15,hostBindings:function(t,e){1&t&&Ts("click",(function(){return e._toggle()}))("keydown",(function(t){return e._keydown(t)})),2&t&&(ds("id",e.panel._headerId)("tabindex",e.disabled?-1:0)("aria-controls",e._getPanelId())("aria-expanded",e._isExpanded())("aria-disabled",e.panel.disabled),Zs("height",e._getHeaderHeight()),Js("mat-expanded",e._isExpanded())("mat-expansion-toggle-indicator-after","after"===e._getTogglePosition())("mat-expansion-toggle-indicator-before","before"===e._getTogglePosition())("_mat-animation-noopable","NoopAnimations"===e._animationMode))},inputs:{expandedHeight:"expandedHeight",collapsedHeight:"collapsedHeight"},ngContentSelectors:cN,decls:11,vars:1,consts:[[1,"mat-content"],["class","mat-expansion-indicator",4,"ngIf"],[1,"mat-expansion-indicator"]],template:function(t,e){1&t&&(Fs(lN),bs(0,"span",0),uu(1,"\n "),Hs(2),uu(3,"\n "),Hs(4,1),uu(5,"\n "),Hs(6,2),uu(7,"\n"),ws(),uu(8,"\n"),ps(9,uN,1,1,"span",1),uu(10,"\n")),2&t&&(na(9),_s("ngIf",e._showToggle()))},directives:[Eh],styles:['.mat-expansion-panel-header{display:flex;flex-direction:row;align-items:center;padding:0 24px;border-radius:inherit;transition:height 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header._mat-animation-noopable{transition:none}.mat-expansion-panel-header:focus,.mat-expansion-panel-header:hover{outline:none}.mat-expansion-panel-header.mat-expanded:focus,.mat-expansion-panel-header.mat-expanded:hover{background:inherit}.mat-expansion-panel-header:not([aria-disabled=true]){cursor:pointer}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before{flex-direction:row-reverse}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 16px 0 0}[dir=rtl] .mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 0 0 16px}.mat-content{display:flex;flex:1;flex-direction:row;overflow:hidden}.mat-expansion-panel-header-title,.mat-expansion-panel-header-description{display:flex;flex-grow:1;margin-right:16px}[dir=rtl] .mat-expansion-panel-header-title,[dir=rtl] .mat-expansion-panel-header-description{margin-right:0;margin-left:16px}.mat-expansion-panel-header-description{flex-grow:2}.mat-expansion-indicator::after{border-style:solid;border-width:0 2px 2px 0;content:"";display:inline-block;padding:3px;transform:rotate(45deg);vertical-align:middle}\n'],encapsulation:2,data:{animation:[fN.indicatorRotate]},changeDetection:0}),t}(),bN=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-panel-description"]],hostAttrs:[1,"mat-expansion-panel-header-description"]}),t}(),wN=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-panel-title"]],hostAttrs:[1,"mat-expansion-panel-header-title"]}),t}(),kN=function(){var t=function(t){f(n,t);var e=v(n);function n(){var t;return _(this,n),(t=e.apply(this,arguments))._ownHeaders=new Hl,t._hideToggle=!1,t.displayMode="default",t.togglePosition="after",t}return b(n,[{key:"ngAfterContentInit",value:function(){var t=this;this._headers.changes.pipe(rg(this._headers)).subscribe((function(e){t._ownHeaders.reset(e.filter((function(e){return e.panel.accordion===t}))),t._ownHeaders.notifyOnChanges()})),this._keyManager=new i_(this._ownHeaders).withWrap().withHomeAndEnd()}},{key:"_handleHeaderKeydown",value:function(t){this._keyManager.onKeydown(t)}},{key:"_handleHeaderFocus",value:function(t){this._keyManager.updateActiveItem(t)}},{key:"hideToggle",get:function(){return this._hideToggle},set:function(t){this._hideToggle=Em(t)}}]),n}(tN);return t.\u0275fac=function(e){return MN(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-accordion"]],contentQueries:function(t,e,n){var i;1&t&&Ql(n,yN,!0),2&t&&Gl(i=tc())&&(e._headers=i)},hostAttrs:[1,"mat-accordion"],hostVars:2,hostBindings:function(t,e){2&t&&Js("mat-accordion-multi",e.multi)},inputs:{multi:"multi",displayMode:"displayMode",togglePosition:"togglePosition",hideToggle:"hideToggle"},exportAs:["matAccordion"],features:[Pu([{provide:dN,useExisting:t}]),Jo]}),t}(),MN=Ki(kN),SN=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[df,iN,Kg]]}),t}(),CN=["*"],xN=[[["","mat-grid-avatar",""],["","matGridAvatar",""]],[["","mat-line",""],["","matLine",""]],"*"],DN=["[mat-grid-avatar], [matGridAvatar]","[mat-line], [matLine]","*"],LN=".mat-grid-list{display:block;position:relative}.mat-grid-tile{display:block;position:absolute;overflow:hidden}.mat-grid-tile .mat-figure{top:0;left:0;right:0;bottom:0;position:absolute;display:flex;align-items:center;justify-content:center;height:100%;padding:0;margin:0}.mat-grid-tile .mat-grid-tile-header,.mat-grid-tile .mat-grid-tile-footer{display:flex;align-items:center;height:48px;color:#fff;background:rgba(0,0,0,.38);overflow:hidden;padding:0 16px;position:absolute;left:0;right:0}.mat-grid-tile .mat-grid-tile-header>*,.mat-grid-tile .mat-grid-tile-footer>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-grid-tile .mat-grid-tile-header.mat-2-line,.mat-grid-tile .mat-grid-tile-footer.mat-2-line{height:68px}.mat-grid-tile .mat-grid-list-text{display:flex;flex-direction:column;flex:auto;box-sizing:border-box;overflow:hidden}.mat-grid-tile .mat-grid-list-text>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-grid-tile .mat-grid-list-text:empty{display:none}.mat-grid-tile .mat-grid-tile-header{top:0}.mat-grid-tile .mat-grid-tile-footer{bottom:0}.mat-grid-tile .mat-grid-avatar{padding-right:16px}[dir=rtl] .mat-grid-tile .mat-grid-avatar{padding-right:0;padding-left:16px}.mat-grid-tile .mat-grid-avatar:empty{display:none}\n",TN=new se("MAT_GRID_LIST"),EN=function(){var t=function(){function t(e,n){_(this,t),this._element=e,this._gridList=n,this._rowspan=1,this._colspan=1}return b(t,[{key:"_setStyle",value:function(t,e){this._element.nativeElement.style[t]=e}},{key:"rowspan",get:function(){return this._rowspan},set:function(t){this._rowspan=Math.round(Om(t))}},{key:"colspan",get:function(){return this._colspan},set:function(t){this._colspan=Math.round(Om(t))}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(TN,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-grid-tile"]],hostAttrs:[1,"mat-grid-tile"],hostVars:2,hostBindings:function(t,e){2&t&&ds("rowspan",e.rowspan)("colspan",e.colspan)},inputs:{rowspan:"rowspan",colspan:"colspan"},exportAs:["matGridTile"],ngContentSelectors:CN,decls:5,vars:0,consts:[[1,"mat-figure"]],template:function(t,e){1&t&&(Fs(),uu(0,"\n"),bs(1,"figure",0),uu(2,"\n "),Hs(3),uu(4,"\n"),ws())},styles:[LN],encapsulation:2,changeDetection:0}),t}(),ON=function(){var t=function(){function t(e){_(this,t),this._element=e}return b(t,[{key:"ngAfterContentInit",value:function(){Iw(this._lines,this._element)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu))},t.\u0275cmp=Fe({type:t,selectors:[["mat-grid-tile-header"],["mat-grid-tile-footer"]],contentQueries:function(t,e,n){var i;1&t&&Ql(n,Pw,!0),2&t&&Gl(i=tc())&&(e._lines=i)},ngContentSelectors:DN,decls:7,vars:0,consts:[[1,"mat-grid-list-text"]],template:function(t,e){1&t&&(Fs(xN),Hs(0),uu(1,"\n"),bs(2,"div",0),Hs(3,1),ws(),uu(4,"\n"),Hs(5,2),uu(6,"\n"))},encapsulation:2,changeDetection:0}),t}(),AN=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-grid-avatar",""],["","matGridAvatar",""]],hostAttrs:[1,"mat-grid-avatar"]}),t}(),PN=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-grid-tile-header"]],hostAttrs:[1,"mat-grid-tile-header"]}),t}(),IN=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-grid-tile-footer"]],hostAttrs:[1,"mat-grid-tile-footer"]}),t}(),YN=function(){function t(){_(this,t),this.columnIndex=0,this.rowIndex=0}return b(t,[{key:"update",value:function(t,e){var n=this;this.columnIndex=0,this.rowIndex=0,this.tracker=new Array(t),this.tracker.fill(0,0,this.tracker.length),this.positions=e.map((function(t){return n._trackTile(t)}))}},{key:"_trackTile",value:function(t){var e=this._findMatchingGap(t.colspan);return this._markTilePosition(e,t),this.columnIndex=e+t.colspan,new RN(this.rowIndex,e)}},{key:"_findMatchingGap",value:function(t){var e=-1,n=-1;do{this.columnIndex+t>this.tracker.length?(this._nextRow(),e=this.tracker.indexOf(0,this.columnIndex),n=this._findGapEndIndex(e)):-1!=(e=this.tracker.indexOf(0,this.columnIndex))?(n=this._findGapEndIndex(e),this.columnIndex=e+1):(this._nextRow(),e=this.tracker.indexOf(0,this.columnIndex),n=this._findGapEndIndex(e))}while(n-e1?this.rowCount+t-1:this.rowCount}}]),t}(),RN=function t(e,n){_(this,t),this.row=e,this.col=n},FN=/^-?\d+((\.\d+)?[A-Za-z%$]?)+$/,HN=function(){function t(){_(this,t),this._rows=0,this._rowspan=0}return b(t,[{key:"init",value:function(t,e,n,i){this._gutterSize=VN(t),this._rows=e.rowCount,this._rowspan=e.rowspan,this._cols=n,this._direction=i}},{key:"getBaseTileSize",value:function(t,e){return"(".concat(t,"% - (").concat(this._gutterSize," * ").concat(e,"))")}},{key:"getTilePosition",value:function(t,e){return 0===e?"0":WN("(".concat(t," + ").concat(this._gutterSize,") * ").concat(e))}},{key:"getTileSize",value:function(t,e){return"(".concat(t," * ").concat(e,") + (").concat(e-1," * ").concat(this._gutterSize,")")}},{key:"setStyle",value:function(t,e,n){var i=100/this._cols,r=(this._cols-1)/this._cols;this.setColStyles(t,n,i,r),this.setRowStyles(t,e,i,r)}},{key:"setColStyles",value:function(t,e,n,i){var r=this.getBaseTileSize(n,i);t._setStyle("rtl"===this._direction?"right":"left",this.getTilePosition(r,e)),t._setStyle("width",WN(this.getTileSize(r,t.colspan)))}},{key:"getGutterSpan",value:function(){return"".concat(this._gutterSize," * (").concat(this._rowspan," - 1)")}},{key:"getTileSpan",value:function(t){return"".concat(this._rowspan," * ").concat(this.getTileSize(t,1))}},{key:"getComputedHeight",value:function(){return null}}]),t}(),BN=function(t){f(n,t);var e=v(n);function n(t){var i;return _(this,n),(i=e.call(this)).fixedRowHeight=t,i}return b(n,[{key:"init",value:function(t,e,a,o){r(i(n.prototype),"init",this).call(this,t,e,a,o),this.fixedRowHeight=VN(this.fixedRowHeight),FN.test(this.fixedRowHeight)}},{key:"setRowStyles",value:function(t,e){t._setStyle("top",this.getTilePosition(this.fixedRowHeight,e)),t._setStyle("height",WN(this.getTileSize(this.fixedRowHeight,t.rowspan)))}},{key:"getComputedHeight",value:function(){return["height",WN("".concat(this.getTileSpan(this.fixedRowHeight)," + ").concat(this.getGutterSpan()))]}},{key:"reset",value:function(t){t._setListStyle(["height",null]),t._tiles&&t._tiles.forEach((function(t){t._setStyle("top",null),t._setStyle("height",null)}))}}]),n}(HN),jN=function(t){f(n,t);var e=v(n);function n(t){var i;return _(this,n),(i=e.call(this))._parseRatio(t),i}return b(n,[{key:"setRowStyles",value:function(t,e,n,i){this.baseTileHeight=this.getBaseTileSize(n/this.rowHeightRatio,i),t._setStyle("marginTop",this.getTilePosition(this.baseTileHeight,e)),t._setStyle("paddingTop",WN(this.getTileSize(this.baseTileHeight,t.rowspan)))}},{key:"getComputedHeight",value:function(){return["paddingBottom",WN("".concat(this.getTileSpan(this.baseTileHeight)," + ").concat(this.getGutterSpan()))]}},{key:"reset",value:function(t){t._setListStyle(["paddingBottom",null]),t._tiles.forEach((function(t){t._setStyle("marginTop",null),t._setStyle("paddingTop",null)}))}},{key:"_parseRatio",value:function(t){var e=t.split(":");this.rowHeightRatio=parseFloat(e[0])/parseFloat(e[1])}}]),n}(HN),NN=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return b(n,[{key:"setRowStyles",value:function(t,e){var n=this.getBaseTileSize(100/this._rowspan,(this._rows-1)/this._rows);t._setStyle("top",this.getTilePosition(n,e)),t._setStyle("height",WN(this.getTileSize(n,t.rowspan)))}},{key:"reset",value:function(t){t._tiles&&t._tiles.forEach((function(t){t._setStyle("top",null),t._setStyle("height",null)}))}}]),n}(HN);function WN(t){return"calc(".concat(t,")")}function VN(t){return t.match(/([A-Za-z%]+)$/)?t:"".concat(t,"px")}var zN=function(){var t=function(){function t(e,n){_(this,t),this._element=e,this._dir=n,this._gutter="1px"}return b(t,[{key:"ngOnInit",value:function(){this._checkCols(),this._checkRowHeight()}},{key:"ngAfterContentChecked",value:function(){this._layoutTiles()}},{key:"_checkCols",value:function(){}},{key:"_checkRowHeight",value:function(){this._rowHeight||this._setTileStyler("1:1")}},{key:"_setTileStyler",value:function(t){this._tileStyler&&this._tileStyler.reset(this),this._tileStyler="fit"===t?new NN:t&&t.indexOf(":")>-1?new jN(t):new BN(t)}},{key:"_layoutTiles",value:function(){var t=this;this._tileCoordinator||(this._tileCoordinator=new YN);var e=this._tileCoordinator,n=this._tiles.filter((function(e){return!e._gridList||e._gridList===t})),i=this._dir?this._dir.value:"ltr";this._tileCoordinator.update(this.cols,n),this._tileStyler.init(this.gutterSize,e,this.cols,i),n.forEach((function(n,i){var r=e.positions[i];t._tileStyler.setStyle(n,r.row,r.col)})),this._setListStyle(this._tileStyler.getComputedHeight())}},{key:"_setListStyle",value:function(t){t&&(this._element.nativeElement.style[t[0]]=t[1])}},{key:"cols",get:function(){return this._cols},set:function(t){this._cols=Math.max(1,Math.round(Om(t)))}},{key:"gutterSize",get:function(){return this._gutter},set:function(t){this._gutter="".concat(null==t?"":t)}},{key:"rowHeight",get:function(){return this._rowHeight},set:function(t){var e="".concat(null==t?"":t);e!==this._rowHeight&&(this._rowHeight=e,this._setTileStyler(this._rowHeight))}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Lg,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-grid-list"]],contentQueries:function(t,e,n){var i;1&t&&Ql(n,EN,!0),2&t&&Gl(i=tc())&&(e._tiles=i)},hostAttrs:[1,"mat-grid-list"],hostVars:1,hostBindings:function(t,e){2&t&&ds("cols",e.cols)},inputs:{cols:"cols",gutterSize:"gutterSize",rowHeight:"rowHeight"},exportAs:["matGridList"],features:[Pu([{provide:TN,useExisting:t}])],ngContentSelectors:CN,decls:4,vars:0,template:function(t,e){1&t&&(Fs(),bs(0,"div"),uu(1,"\n "),Hs(2),uu(3,"\n"),ws())},styles:[LN],encapsulation:2,changeDetection:0}),t}(),UN=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[Rw,xw],Rw,xw]}),t}(),qN=Sg({passive:!0}),GN=function(){var t=function(){function t(e,n){_(this,t),this._platform=e,this._ngZone=n,this._monitoredElements=new Map}return b(t,[{key:"monitor",value:function(t){var e=this;if(!this._platform.isBrowser)return np;var n=Ym(t),i=this._monitoredElements.get(n);if(i)return i.subject;var r=new z,a="cdk-text-field-autofilled",o=function(t){"cdk-text-field-autofill-start"!==t.animationName||n.classList.contains(a)?"cdk-text-field-autofill-end"===t.animationName&&n.classList.contains(a)&&(n.classList.remove(a),e._ngZone.run((function(){return r.next({target:t.target,isAutofilled:!1})}))):(n.classList.add(a),e._ngZone.run((function(){return r.next({target:t.target,isAutofilled:!0})})))};return this._ngZone.runOutsideAngular((function(){n.addEventListener("animationstart",o,qN),n.classList.add("cdk-text-field-autofill-monitored")})),this._monitoredElements.set(n,{subject:r,unlisten:function(){n.removeEventListener("animationstart",o,qN)}}),r}},{key:"stopMonitoring",value:function(t){var e=Ym(t),n=this._monitoredElements.get(e);n&&(n.unlisten(),n.subject.complete(),e.classList.remove("cdk-text-field-autofill-monitored"),e.classList.remove("cdk-text-field-autofilled"),this._monitoredElements.delete(e))}},{key:"ngOnDestroy",value:function(){var t=this;this._monitoredElements.forEach((function(e,n){return t.stopMonitoring(n)}))}}]),t}();return t.\u0275fac=function(e){return new(e||t)(ve(bg),ve(Dc))},t.\u0275prov=At({factory:function(){return new t(ve(bg),ve(Dc))},token:t,providedIn:"root"}),t}(),KN=function(){var t=function(){function t(e,n){_(this,t),this._elementRef=e,this._autofillMonitor=n,this.cdkAutofill=new Rl}return b(t,[{key:"ngOnInit",value:function(){var t=this;this._autofillMonitor.monitor(this._elementRef).subscribe((function(e){return t.cdkAutofill.emit(e)}))}},{key:"ngOnDestroy",value:function(){this._autofillMonitor.stopMonitoring(this._elementRef)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(GN))},t.\u0275dir=ze({type:t,selectors:[["","cdkAutofill",""]],outputs:{cdkAutofill:"cdkAutofill"}}),t}(),ZN=function(){var t=function(){function t(e,n,i,r){_(this,t),this._elementRef=e,this._platform=n,this._ngZone=i,this._destroyed=new z,this._enabled=!0,this._previousMinRows=-1,this._document=r,this._textareaElement=this._elementRef.nativeElement,this._measuringClass=n.FIREFOX?"cdk-textarea-autosize-measuring-firefox":"cdk-textarea-autosize-measuring"}return b(t,[{key:"_setMinHeight",value:function(){var t=this.minRows&&this._cachedLineHeight?"".concat(this.minRows*this._cachedLineHeight,"px"):null;t&&(this._textareaElement.style.minHeight=t)}},{key:"_setMaxHeight",value:function(){var t=this.maxRows&&this._cachedLineHeight?"".concat(this.maxRows*this._cachedLineHeight,"px"):null;t&&(this._textareaElement.style.maxHeight=t)}},{key:"ngAfterViewInit",value:function(){var t=this;this._platform.isBrowser&&(this._initialHeight=this._textareaElement.style.height,this.resizeToFitContent(),this._ngZone.runOutsideAngular((function(){Rm(t._getWindow(),"resize").pipe(Xm(16),$m(t._destroyed)).subscribe((function(){return t.resizeToFitContent(!0)}))})))}},{key:"ngOnDestroy",value:function(){this._destroyed.next(),this._destroyed.complete()}},{key:"_cacheTextareaLineHeight",value:function(){if(!this._cachedLineHeight){var t=this._textareaElement.cloneNode(!1);t.rows=1,t.style.position="absolute",t.style.visibility="hidden",t.style.border="none",t.style.padding="0",t.style.height="",t.style.minHeight="",t.style.maxHeight="",t.style.overflow="hidden",this._textareaElement.parentNode.appendChild(t),this._cachedLineHeight=t.clientHeight,this._textareaElement.parentNode.removeChild(t),this._setMinHeight(),this._setMaxHeight()}}},{key:"ngDoCheck",value:function(){this._platform.isBrowser&&this.resizeToFitContent()}},{key:"resizeToFitContent",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this._enabled&&(this._cacheTextareaLineHeight(),this._cachedLineHeight)){var n=this._elementRef.nativeElement,i=n.value;if(e||this._minRows!==this._previousMinRows||i!==this._previousValue){var r=n.placeholder;n.classList.add(this._measuringClass),n.placeholder="";var a=n.scrollHeight-4;n.style.height="".concat(a,"px"),n.classList.remove(this._measuringClass),n.placeholder=r,this._ngZone.runOutsideAngular((function(){"undefined"!=typeof requestAnimationFrame?requestAnimationFrame((function(){return t._scrollToCaretPosition(n)})):setTimeout((function(){return t._scrollToCaretPosition(n)}))})),this._previousValue=i,this._previousMinRows=this._minRows}}}},{key:"reset",value:function(){void 0!==this._initialHeight&&(this._textareaElement.style.height=this._initialHeight)}},{key:"_noopInputHandler",value:function(){}},{key:"_getDocument",value:function(){return this._document||document}},{key:"_getWindow",value:function(){return this._getDocument().defaultView||window}},{key:"_scrollToCaretPosition",value:function(t){var e=t.selectionStart,n=t.selectionEnd,i=this._getDocument();this._destroyed.isStopped||i.activeElement!==t||t.setSelectionRange(e,n)}},{key:"minRows",get:function(){return this._minRows},set:function(t){this._minRows=Om(t),this._setMinHeight()}},{key:"maxRows",get:function(){return this._maxRows},set:function(t){this._maxRows=Om(t),this._setMaxHeight()}},{key:"enabled",get:function(){return this._enabled},set:function(t){t=Em(t),this._enabled!==t&&((this._enabled=t)?this.resizeToFitContent(!0):this.reset())}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(bg),gs(Dc),gs(ud,8))},t.\u0275dir=ze({type:t,selectors:[["textarea","cdkTextareaAutosize",""]],hostAttrs:["rows","1",1,"cdk-textarea-autosize"],hostBindings:function(t,e){1&t&&Ts("input",(function(){return e._noopInputHandler()}))},inputs:{minRows:["cdkAutosizeMinRows","minRows"],maxRows:["cdkAutosizeMaxRows","maxRows"],enabled:["cdkTextareaAutosize","enabled"]},exportAs:["cdkTextareaAutosize"]}),t}(),JN=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[wg]]}),t}(),QN=function(){var t=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return b(n,[{key:"matAutosizeMinRows",get:function(){return this.minRows},set:function(t){this.minRows=t}},{key:"matAutosizeMaxRows",get:function(){return this.maxRows},set:function(t){this.maxRows=t}},{key:"matAutosize",get:function(){return this.enabled},set:function(t){this.enabled=t}},{key:"matTextareaAutosize",get:function(){return this.enabled},set:function(t){this.enabled=t}}]),n}(ZN);return t.\u0275fac=function(e){return XN(e||t)},t.\u0275dir=ze({type:t,selectors:[["textarea","mat-autosize",""],["textarea","matTextareaAutosize",""]],hostAttrs:["rows","1",1,"cdk-textarea-autosize","mat-autosize"],inputs:{cdkAutosizeMinRows:"cdkAutosizeMinRows",cdkAutosizeMaxRows:"cdkAutosizeMaxRows",matAutosizeMinRows:"matAutosizeMinRows",matAutosizeMaxRows:"matAutosizeMaxRows",matAutosize:["mat-autosize","matAutosize"],matTextareaAutosize:"matTextareaAutosize"},exportAs:["matTextareaAutosize"],features:[Jo]}),t}(),XN=Ki(QN),$N=new se("MAT_INPUT_VALUE_ACCESSOR"),tW=["button","checkbox","file","hidden","image","radio","range","reset","submit"],eW=0,nW=Ow((function t(e,n,i,r){_(this,t),this._defaultErrorStateMatcher=e,this._parentForm=n,this._parentFormGroup=i,this.ngControl=r})),iW=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s,u,l,c,d){var h;_(this,n),(h=e.call(this,s,a,o,r))._elementRef=t,h._platform=i,h.ngControl=r,h._autofillMonitor=l,h._formField=d,h._uid="mat-input-".concat(eW++),h.focused=!1,h.stateChanges=new z,h.controlType="mat-input",h.autofilled=!1,h._disabled=!1,h._required=!1,h._type="text",h._readonly=!1,h._neverEmptyInputTypes=["date","datetime","datetime-local","month","time","week"].filter((function(t){return Mg().has(t)}));var f=h._elementRef.nativeElement,p=f.nodeName.toLowerCase();return h._inputValueAccessor=u||f,h._previousNativeValue=h.value,h.id=h.id,i.IOS&&c.runOutsideAngular((function(){t.nativeElement.addEventListener("keyup",(function(t){var e=t.target;e.value||e.selectionStart||e.selectionEnd||(e.setSelectionRange(1,1),e.setSelectionRange(0,0))}))})),h._isServer=!h._platform.isBrowser,h._isNativeSelect="select"===p,h._isTextarea="textarea"===p,h._isNativeSelect&&(h.controlType=f.multiple?"mat-native-select-multiple":"mat-native-select"),h}return b(n,[{key:"ngAfterViewInit",value:function(){var t=this;this._platform.isBrowser&&this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe((function(e){t.autofilled=e.isAutofilled,t.stateChanges.next()}))}},{key:"ngOnChanges",value:function(){this.stateChanges.next()}},{key:"ngOnDestroy",value:function(){this.stateChanges.complete(),this._platform.isBrowser&&this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement)}},{key:"ngDoCheck",value:function(){this.ngControl&&this.updateErrorState(),this._dirtyCheckNativeValue(),this._dirtyCheckPlaceholder()}},{key:"focus",value:function(t){this._elementRef.nativeElement.focus(t)}},{key:"_focusChanged",value:function(t){t===this.focused||this.readonly&&t||(this.focused=t,this.stateChanges.next())}},{key:"_onInput",value:function(){}},{key:"_dirtyCheckPlaceholder",value:function(){var t,e,n=(null===(e=null===(t=this._formField)||void 0===t?void 0:t._hideControlPlaceholder)||void 0===e?void 0:e.call(t))?null:this.placeholder;if(n!==this._previousPlaceholder){var i=this._elementRef.nativeElement;this._previousPlaceholder=n,n?i.setAttribute("placeholder",n):i.removeAttribute("placeholder")}}},{key:"_dirtyCheckNativeValue",value:function(){var t=this._elementRef.nativeElement.value;this._previousNativeValue!==t&&(this._previousNativeValue=t,this.stateChanges.next())}},{key:"_validateType",value:function(){tW.indexOf(this._type)}},{key:"_isNeverEmpty",value:function(){return this._neverEmptyInputTypes.indexOf(this._type)>-1}},{key:"_isBadInput",value:function(){var t=this._elementRef.nativeElement.validity;return t&&t.badInput}},{key:"setDescribedByIds",value:function(t){t.length?this._elementRef.nativeElement.setAttribute("aria-describedby",t.join(" ")):this._elementRef.nativeElement.removeAttribute("aria-describedby")}},{key:"onContainerClick",value:function(){this.focused||this.focus()}},{key:"disabled",get:function(){return this.ngControl&&null!==this.ngControl.disabled?this.ngControl.disabled:this._disabled},set:function(t){this._disabled=Em(t),this.focused&&(this.focused=!1,this.stateChanges.next())}},{key:"id",get:function(){return this._id},set:function(t){this._id=t||this._uid}},{key:"required",get:function(){return this._required},set:function(t){this._required=Em(t)}},{key:"type",get:function(){return this._type},set:function(t){this._type=t||"text",this._validateType(),!this._isTextarea&&Mg().has(this._type)&&(this._elementRef.nativeElement.type=this._type)}},{key:"value",get:function(){return this._inputValueAccessor.value},set:function(t){t!==this.value&&(this._inputValueAccessor.value=t,this.stateChanges.next())}},{key:"readonly",get:function(){return this._readonly},set:function(t){this._readonly=Em(t)}},{key:"empty",get:function(){return!(this._isNeverEmpty()||this._elementRef.nativeElement.value||this._isBadInput()||this.autofilled)}},{key:"shouldLabelFloat",get:function(){if(this._isNativeSelect){var t=this._elementRef.nativeElement,e=t.options[0];return this.focused||t.multiple||!this.empty||!!(t.selectedIndex>-1&&e&&e.label)}return this.focused||!this.empty}}]),n}(nW);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(bg),gs(eM,10),gs(rS,8),gs(hS,8),gs(Aw),gs($N,10),gs(GN),gs(Dc),gs(rF,8))},t.\u0275dir=ze({type:t,selectors:[["input","matInput",""],["textarea","matInput",""],["select","matNativeControl",""],["input","matNativeControl",""],["textarea","matNativeControl",""]],hostAttrs:[1,"mat-input-element","mat-form-field-autofill-control"],hostVars:9,hostBindings:function(t,e){1&t&&Ts("focus",(function(){return e._focusChanged(!0)}))("blur",(function(){return e._focusChanged(!1)}))("input",(function(){return e._onInput()})),2&t&&(mu("disabled",e.disabled)("required",e.required),ds("id",e.id)("data-placeholder",e.placeholder)("readonly",e.readonly&&!e._isNativeSelect||null)("aria-invalid",e.errorState)("aria-required",e.required.toString()),Js("mat-input-server",e._isServer))},inputs:{id:"id",disabled:"disabled",required:"required",type:"type",value:"value",readonly:"readonly",placeholder:"placeholder",errorStateMatcher:"errorStateMatcher",userAriaDescribedBy:["aria-describedby","userAriaDescribedBy"]},exportAs:["matInput"],features:[Pu([{provide:UR,useExisting:t}]),Jo,fn]}),t}(),rW=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[Aw],imports:[[JN,oF],JN,oF]}),t}(),aW=function(){var t=function(){function t(){_(this,t),this._vertical=!1,this._inset=!1}return b(t,[{key:"vertical",get:function(){return this._vertical},set:function(t){this._vertical=Em(t)}},{key:"inset",get:function(){return this._inset},set:function(t){this._inset=Em(t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["mat-divider"]],hostAttrs:["role","separator",1,"mat-divider"],hostVars:7,hostBindings:function(t,e){2&t&&(ds("aria-orientation",e.vertical?"vertical":"horizontal"),Js("mat-divider-vertical",e.vertical)("mat-divider-horizontal",!e.vertical)("mat-divider-inset",e.inset))},inputs:{vertical:"vertical",inset:"inset"},decls:0,vars:0,template:function(t,e){},styles:[".mat-divider{display:block;margin:0;border-top-width:1px;border-top-style:solid}.mat-divider.mat-divider-vertical{border-top:0;border-right-width:1px;border-right-style:solid}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px}\n"],encapsulation:2,changeDetection:0}),t}(),oW=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[xw],xw]}),t}(),sW=["*"],uW='.mat-subheader{display:flex;box-sizing:border-box;padding:16px;align-items:center}.mat-list-base .mat-subheader{margin:0}.mat-list-base{padding-top:8px;display:block;-webkit-tap-highlight-color:transparent}.mat-list-base .mat-subheader{height:48px;line-height:16px}.mat-list-base .mat-subheader:first-child{margin-top:-8px}.mat-list-base .mat-list-item,.mat-list-base .mat-list-option{display:block;height:48px;-webkit-tap-highlight-color:transparent;width:100%;padding:0}.mat-list-base .mat-list-item .mat-list-item-content,.mat-list-base .mat-list-option .mat-list-item-content{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;padding:0 16px;position:relative;height:inherit}.mat-list-base .mat-list-item .mat-list-item-content-reverse,.mat-list-base .mat-list-option .mat-list-item-content-reverse{display:flex;align-items:center;padding:0 16px;flex-direction:row-reverse;justify-content:space-around}.mat-list-base .mat-list-item .mat-list-item-ripple,.mat-list-base .mat-list-option .mat-list-item-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-list-base .mat-list-item.mat-list-item-with-avatar,.mat-list-base .mat-list-option.mat-list-item-with-avatar{height:56px}.mat-list-base .mat-list-item.mat-2-line,.mat-list-base .mat-list-option.mat-2-line{height:72px}.mat-list-base .mat-list-item.mat-3-line,.mat-list-base .mat-list-option.mat-3-line{height:88px}.mat-list-base .mat-list-item.mat-multi-line,.mat-list-base .mat-list-option.mat-multi-line{height:auto}.mat-list-base .mat-list-item.mat-multi-line .mat-list-item-content,.mat-list-base .mat-list-option.mat-multi-line .mat-list-item-content{padding-top:16px;padding-bottom:16px}.mat-list-base .mat-list-item .mat-list-text,.mat-list-base .mat-list-option .mat-list-text{display:flex;flex-direction:column;flex:auto;box-sizing:border-box;overflow:hidden;padding:0}.mat-list-base .mat-list-item .mat-list-text>*,.mat-list-base .mat-list-option .mat-list-text>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-list-base .mat-list-item .mat-list-text:empty,.mat-list-base .mat-list-option .mat-list-text:empty{display:none}.mat-list-base .mat-list-item.mat-list-item-with-avatar .mat-list-item-content .mat-list-text,.mat-list-base .mat-list-item.mat-list-option .mat-list-item-content .mat-list-text,.mat-list-base .mat-list-option.mat-list-item-with-avatar .mat-list-item-content .mat-list-text,.mat-list-base .mat-list-option.mat-list-option .mat-list-item-content .mat-list-text{padding-right:0;padding-left:16px}[dir=rtl] .mat-list-base .mat-list-item.mat-list-item-with-avatar .mat-list-item-content .mat-list-text,[dir=rtl] .mat-list-base .mat-list-item.mat-list-option .mat-list-item-content .mat-list-text,[dir=rtl] .mat-list-base .mat-list-option.mat-list-item-with-avatar .mat-list-item-content .mat-list-text,[dir=rtl] .mat-list-base .mat-list-option.mat-list-option .mat-list-item-content .mat-list-text{padding-right:16px;padding-left:0}.mat-list-base .mat-list-item.mat-list-item-with-avatar .mat-list-item-content-reverse .mat-list-text,.mat-list-base .mat-list-item.mat-list-option .mat-list-item-content-reverse .mat-list-text,.mat-list-base .mat-list-option.mat-list-item-with-avatar .mat-list-item-content-reverse .mat-list-text,.mat-list-base .mat-list-option.mat-list-option .mat-list-item-content-reverse .mat-list-text{padding-left:0;padding-right:16px}[dir=rtl] .mat-list-base .mat-list-item.mat-list-item-with-avatar .mat-list-item-content-reverse .mat-list-text,[dir=rtl] .mat-list-base .mat-list-item.mat-list-option .mat-list-item-content-reverse .mat-list-text,[dir=rtl] .mat-list-base .mat-list-option.mat-list-item-with-avatar .mat-list-item-content-reverse .mat-list-text,[dir=rtl] .mat-list-base .mat-list-option.mat-list-option .mat-list-item-content-reverse .mat-list-text{padding-right:0;padding-left:16px}.mat-list-base .mat-list-item.mat-list-item-with-avatar.mat-list-option .mat-list-item-content-reverse .mat-list-text,.mat-list-base .mat-list-item.mat-list-item-with-avatar.mat-list-option .mat-list-item-content .mat-list-text,.mat-list-base .mat-list-option.mat-list-item-with-avatar.mat-list-option .mat-list-item-content-reverse .mat-list-text,.mat-list-base .mat-list-option.mat-list-item-with-avatar.mat-list-option .mat-list-item-content .mat-list-text{padding-right:16px;padding-left:16px}.mat-list-base .mat-list-item .mat-list-avatar,.mat-list-base .mat-list-option .mat-list-avatar{flex-shrink:0;width:40px;height:40px;border-radius:50%;object-fit:cover}.mat-list-base .mat-list-item .mat-list-avatar~.mat-divider-inset,.mat-list-base .mat-list-option .mat-list-avatar~.mat-divider-inset{margin-left:72px;width:calc(100% - 72px)}[dir=rtl] .mat-list-base .mat-list-item .mat-list-avatar~.mat-divider-inset,[dir=rtl] .mat-list-base .mat-list-option .mat-list-avatar~.mat-divider-inset{margin-left:auto;margin-right:72px}.mat-list-base .mat-list-item .mat-list-icon,.mat-list-base .mat-list-option .mat-list-icon{flex-shrink:0;width:24px;height:24px;font-size:24px;box-sizing:content-box;border-radius:50%;padding:4px}.mat-list-base .mat-list-item .mat-list-icon~.mat-divider-inset,.mat-list-base .mat-list-option .mat-list-icon~.mat-divider-inset{margin-left:64px;width:calc(100% - 64px)}[dir=rtl] .mat-list-base .mat-list-item .mat-list-icon~.mat-divider-inset,[dir=rtl] .mat-list-base .mat-list-option .mat-list-icon~.mat-divider-inset{margin-left:auto;margin-right:64px}.mat-list-base .mat-list-item .mat-divider,.mat-list-base .mat-list-option .mat-divider{position:absolute;bottom:0;left:0;width:100%;margin:0}[dir=rtl] .mat-list-base .mat-list-item .mat-divider,[dir=rtl] .mat-list-base .mat-list-option .mat-divider{margin-left:auto;margin-right:0}.mat-list-base .mat-list-item .mat-divider.mat-divider-inset,.mat-list-base .mat-list-option .mat-divider.mat-divider-inset{position:absolute}.mat-list-base[dense]{padding-top:4px;display:block}.mat-list-base[dense] .mat-subheader{height:40px;line-height:8px}.mat-list-base[dense] .mat-subheader:first-child{margin-top:-4px}.mat-list-base[dense] .mat-list-item,.mat-list-base[dense] .mat-list-option{display:block;height:40px;-webkit-tap-highlight-color:transparent;width:100%;padding:0}.mat-list-base[dense] .mat-list-item .mat-list-item-content,.mat-list-base[dense] .mat-list-option .mat-list-item-content{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;padding:0 16px;position:relative;height:inherit}.mat-list-base[dense] .mat-list-item .mat-list-item-content-reverse,.mat-list-base[dense] .mat-list-option .mat-list-item-content-reverse{display:flex;align-items:center;padding:0 16px;flex-direction:row-reverse;justify-content:space-around}.mat-list-base[dense] .mat-list-item .mat-list-item-ripple,.mat-list-base[dense] .mat-list-option .mat-list-item-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-list-base[dense] .mat-list-item.mat-list-item-with-avatar,.mat-list-base[dense] .mat-list-option.mat-list-item-with-avatar{height:48px}.mat-list-base[dense] .mat-list-item.mat-2-line,.mat-list-base[dense] .mat-list-option.mat-2-line{height:60px}.mat-list-base[dense] .mat-list-item.mat-3-line,.mat-list-base[dense] .mat-list-option.mat-3-line{height:76px}.mat-list-base[dense] .mat-list-item.mat-multi-line,.mat-list-base[dense] .mat-list-option.mat-multi-line{height:auto}.mat-list-base[dense] .mat-list-item.mat-multi-line .mat-list-item-content,.mat-list-base[dense] .mat-list-option.mat-multi-line .mat-list-item-content{padding-top:16px;padding-bottom:16px}.mat-list-base[dense] .mat-list-item .mat-list-text,.mat-list-base[dense] .mat-list-option .mat-list-text{display:flex;flex-direction:column;flex:auto;box-sizing:border-box;overflow:hidden;padding:0}.mat-list-base[dense] .mat-list-item .mat-list-text>*,.mat-list-base[dense] .mat-list-option .mat-list-text>*{margin:0;padding:0;font-weight:normal;font-size:inherit}.mat-list-base[dense] .mat-list-item .mat-list-text:empty,.mat-list-base[dense] .mat-list-option .mat-list-text:empty{display:none}.mat-list-base[dense] .mat-list-item.mat-list-item-with-avatar .mat-list-item-content .mat-list-text,.mat-list-base[dense] .mat-list-item.mat-list-option .mat-list-item-content .mat-list-text,.mat-list-base[dense] .mat-list-option.mat-list-item-with-avatar .mat-list-item-content .mat-list-text,.mat-list-base[dense] .mat-list-option.mat-list-option .mat-list-item-content .mat-list-text{padding-right:0;padding-left:16px}[dir=rtl] .mat-list-base[dense] .mat-list-item.mat-list-item-with-avatar .mat-list-item-content .mat-list-text,[dir=rtl] .mat-list-base[dense] .mat-list-item.mat-list-option .mat-list-item-content .mat-list-text,[dir=rtl] .mat-list-base[dense] .mat-list-option.mat-list-item-with-avatar .mat-list-item-content .mat-list-text,[dir=rtl] .mat-list-base[dense] .mat-list-option.mat-list-option .mat-list-item-content .mat-list-text{padding-right:16px;padding-left:0}.mat-list-base[dense] .mat-list-item.mat-list-item-with-avatar .mat-list-item-content-reverse .mat-list-text,.mat-list-base[dense] .mat-list-item.mat-list-option .mat-list-item-content-reverse .mat-list-text,.mat-list-base[dense] .mat-list-option.mat-list-item-with-avatar .mat-list-item-content-reverse .mat-list-text,.mat-list-base[dense] .mat-list-option.mat-list-option .mat-list-item-content-reverse .mat-list-text{padding-left:0;padding-right:16px}[dir=rtl] .mat-list-base[dense] .mat-list-item.mat-list-item-with-avatar .mat-list-item-content-reverse .mat-list-text,[dir=rtl] .mat-list-base[dense] .mat-list-item.mat-list-option .mat-list-item-content-reverse .mat-list-text,[dir=rtl] .mat-list-base[dense] .mat-list-option.mat-list-item-with-avatar .mat-list-item-content-reverse .mat-list-text,[dir=rtl] .mat-list-base[dense] .mat-list-option.mat-list-option .mat-list-item-content-reverse .mat-list-text{padding-right:0;padding-left:16px}.mat-list-base[dense] .mat-list-item.mat-list-item-with-avatar.mat-list-option .mat-list-item-content-reverse .mat-list-text,.mat-list-base[dense] .mat-list-item.mat-list-item-with-avatar.mat-list-option .mat-list-item-content .mat-list-text,.mat-list-base[dense] .mat-list-option.mat-list-item-with-avatar.mat-list-option .mat-list-item-content-reverse .mat-list-text,.mat-list-base[dense] .mat-list-option.mat-list-item-with-avatar.mat-list-option .mat-list-item-content .mat-list-text{padding-right:16px;padding-left:16px}.mat-list-base[dense] .mat-list-item .mat-list-avatar,.mat-list-base[dense] .mat-list-option .mat-list-avatar{flex-shrink:0;width:36px;height:36px;border-radius:50%;object-fit:cover}.mat-list-base[dense] .mat-list-item .mat-list-avatar~.mat-divider-inset,.mat-list-base[dense] .mat-list-option .mat-list-avatar~.mat-divider-inset{margin-left:68px;width:calc(100% - 68px)}[dir=rtl] .mat-list-base[dense] .mat-list-item .mat-list-avatar~.mat-divider-inset,[dir=rtl] .mat-list-base[dense] .mat-list-option .mat-list-avatar~.mat-divider-inset{margin-left:auto;margin-right:68px}.mat-list-base[dense] .mat-list-item .mat-list-icon,.mat-list-base[dense] .mat-list-option .mat-list-icon{flex-shrink:0;width:20px;height:20px;font-size:20px;box-sizing:content-box;border-radius:50%;padding:4px}.mat-list-base[dense] .mat-list-item .mat-list-icon~.mat-divider-inset,.mat-list-base[dense] .mat-list-option .mat-list-icon~.mat-divider-inset{margin-left:60px;width:calc(100% - 60px)}[dir=rtl] .mat-list-base[dense] .mat-list-item .mat-list-icon~.mat-divider-inset,[dir=rtl] .mat-list-base[dense] .mat-list-option .mat-list-icon~.mat-divider-inset{margin-left:auto;margin-right:60px}.mat-list-base[dense] .mat-list-item .mat-divider,.mat-list-base[dense] .mat-list-option .mat-divider{position:absolute;bottom:0;left:0;width:100%;margin:0}[dir=rtl] .mat-list-base[dense] .mat-list-item .mat-divider,[dir=rtl] .mat-list-base[dense] .mat-list-option .mat-divider{margin-left:auto;margin-right:0}.mat-list-base[dense] .mat-list-item .mat-divider.mat-divider-inset,.mat-list-base[dense] .mat-list-option .mat-divider.mat-divider-inset{position:absolute}.mat-nav-list a{text-decoration:none;color:inherit}.mat-nav-list .mat-list-item{cursor:pointer;outline:none}mat-action-list button{background:none;color:inherit;border:none;font:inherit;outline:inherit;-webkit-tap-highlight-color:transparent;text-align:left}[dir=rtl] mat-action-list button{text-align:right}mat-action-list button::-moz-focus-inner{border:0}mat-action-list .mat-list-item{cursor:pointer;outline:inherit}.mat-list-option:not(.mat-list-item-disabled){cursor:pointer;outline:none}.mat-list-item-disabled{pointer-events:none}.cdk-high-contrast-active .mat-list-item-disabled{opacity:.5}.cdk-high-contrast-active :host .mat-list-item-disabled{opacity:.5}.cdk-high-contrast-active .mat-selection-list:focus{outline-style:dotted}.cdk-high-contrast-active .mat-list-option:hover,.cdk-high-contrast-active .mat-list-option:focus,.cdk-high-contrast-active .mat-nav-list .mat-list-item:hover,.cdk-high-contrast-active .mat-nav-list .mat-list-item:focus,.cdk-high-contrast-active mat-action-list .mat-list-item:hover,.cdk-high-contrast-active mat-action-list .mat-list-item:focus{outline:dotted 1px}.cdk-high-contrast-active .mat-list-single-selected-option::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}.cdk-high-contrast-active [dir=rtl] .mat-list-single-selected-option::after{right:auto;left:16px}@media(hover: none){.mat-list-option:not(.mat-list-single-selected-option):not(.mat-list-item-disabled):hover,.mat-nav-list .mat-list-item:not(.mat-list-item-disabled):hover,.mat-action-list .mat-list-item:not(.mat-list-item-disabled):hover{background:none}}\n',lW=[[["","mat-list-avatar",""],["","mat-list-icon",""],["","matListAvatar",""],["","matListIcon",""]],[["","mat-line",""],["","matLine",""]],"*"],cW=["[mat-list-avatar], [mat-list-icon], [matListAvatar], [matListIcon]","[mat-line], [matLine]","*"],dW=["text"];function hW(t,e){if(1&t&&ks(0,"mat-pseudo-checkbox",5),2&t){var n=Ys();_s("state",n.selected?"checked":"unchecked")("disabled",n.disabled)}}var fW=["*",[["","mat-list-avatar",""],["","mat-list-icon",""],["","matListAvatar",""],["","matListIcon",""]]],pW=["*","[mat-list-avatar], [mat-list-icon], [matListAvatar], [matListIcon]"],mW=Dw(Tw((function t(){_(this,t)}))),gW=Tw((function t(){_(this,t)})),vW=new se("MatList"),_W=new se("MatNavList"),yW=function(){var t=function(t){f(n,t);var e=v(n);function n(){var t;return _(this,n),(t=e.apply(this,arguments))._stateChanges=new z,t}return b(n,[{key:"ngOnChanges",value:function(){this._stateChanges.next()}},{key:"ngOnDestroy",value:function(){this._stateChanges.complete()}}]),n}(mW);return t.\u0275fac=function(e){return bW(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["mat-nav-list"]],hostAttrs:["role","navigation",1,"mat-nav-list","mat-list-base"],inputs:{disableRipple:"disableRipple",disabled:"disabled"},exportAs:["matNavList"],features:[Pu([{provide:_W,useExisting:t}]),Jo,fn],ngContentSelectors:sW,decls:2,vars:0,template:function(t,e){1&t&&(Fs(),Hs(0),uu(1,"\n\n"))},styles:[uW],encapsulation:2,changeDetection:0}),t}(),bW=Ki(yW),wW=function(){var t=function(t){f(n,t);var e=v(n);function n(t){var i;return _(this,n),(i=e.call(this))._elementRef=t,i._stateChanges=new z,"action-list"===i._getListType()&&t.nativeElement.classList.add("mat-action-list"),i}return b(n,[{key:"_getListType",value:function(){var t=this._elementRef.nativeElement.nodeName.toLowerCase();return"mat-list"===t?"list":"mat-action-list"===t?"action-list":null}},{key:"ngOnChanges",value:function(){this._stateChanges.next()}},{key:"ngOnDestroy",value:function(){this._stateChanges.complete()}}]),n}(mW);return t.\u0275fac=function(e){return new(e||t)(gs(Hu))},t.\u0275cmp=Fe({type:t,selectors:[["mat-list"],["mat-action-list"]],hostAttrs:[1,"mat-list","mat-list-base"],inputs:{disableRipple:"disableRipple",disabled:"disabled"},exportAs:["matList"],features:[Pu([{provide:vW,useExisting:t}]),Jo,fn],ngContentSelectors:sW,decls:2,vars:0,template:function(t,e){1&t&&(Fs(),Hs(0),uu(1,"\n\n"))},styles:[uW],encapsulation:2,changeDetection:0}),t}(),kW=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-list-avatar",""],["","matListAvatar",""]],hostAttrs:[1,"mat-list-avatar"]}),t}(),MW=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-list-icon",""],["","matListIcon",""]],hostAttrs:[1,"mat-list-icon"]}),t}(),SW=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["","mat-subheader",""],["","matSubheader",""]],hostAttrs:[1,"mat-subheader"]}),t}(),CW=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a){var o;_(this,n),(o=e.call(this))._element=t,o._isInteractiveList=!1,o._destroyed=new z,o._disabled=!1,o._isInteractiveList=!!(r||a&&"action-list"===a._getListType()),o._list=r||a;var s=o._getHostElement();return"button"!==s.nodeName.toLowerCase()||s.hasAttribute("type")||s.setAttribute("type","button"),o._list&&o._list._stateChanges.pipe($m(o._destroyed)).subscribe((function(){i.markForCheck()})),o}return b(n,[{key:"ngAfterContentInit",value:function(){Iw(this._lines,this._element)}},{key:"ngOnDestroy",value:function(){this._destroyed.next(),this._destroyed.complete()}},{key:"_isRippleDisabled",value:function(){return!this._isInteractiveList||this.disableRipple||!(!this._list||!this._list.disableRipple)}},{key:"_getHostElement",value:function(){return this._element.nativeElement}},{key:"disabled",get:function(){return this._disabled||!(!this._list||!this._list.disabled)},set:function(t){this._disabled=Em(t)}}]),n}(gW);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Lo),gs(_W,8),gs(vW,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-list-item"],["a","mat-list-item",""],["button","mat-list-item",""]],contentQueries:function(t,e,n){var i;1&t&&(Ql(n,kW,!0),Ql(n,MW,!0),Ql(n,Pw,!0)),2&t&&(Gl(i=tc())&&(e._avatar=i.first),Gl(i=tc())&&(e._icon=i.first),Gl(i=tc())&&(e._lines=i))},hostAttrs:[1,"mat-list-item","mat-focus-indicator"],hostVars:6,hostBindings:function(t,e){2&t&&Js("mat-list-item-disabled",e.disabled)("mat-list-item-avatar",e._avatar||e._icon)("mat-list-item-with-avatar",e._avatar||e._icon)},inputs:{disableRipple:"disableRipple",disabled:"disabled"},exportAs:["matListItem"],features:[Jo],ngContentSelectors:cW,decls:13,vars:2,consts:[[1,"mat-list-item-content"],["mat-ripple","",1,"mat-list-item-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mat-list-text"]],template:function(t,e){1&t&&(Fs(lW),bs(0,"div",0),uu(1,"\n "),bs(2,"div",1),uu(3,"\n "),ws(),uu(4,"\n\n "),Hs(5),uu(6,"\n\n "),bs(7,"div",2),Hs(8,1),ws(),uu(9,"\n\n "),Hs(10,2),uu(11,"\n"),ws(),uu(12,"\n")),2&t&&(na(2),_s("matRippleTrigger",e._getHostElement())("matRippleDisabled",e._isRippleDisabled()))},directives:[qw],encapsulation:2,changeDetection:0}),t}(),xW=Tw((function t(){_(this,t)})),DW=Tw((function t(){_(this,t)})),LW={provide:qk,useExisting:Ut((function(){return OW})),multi:!0},TW=function t(e,n,i){_(this,t),this.source=e,this.option=n,this.options=i},EW=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this))._element=t,a._changeDetector=i,a.selectionList=r,a._selected=!1,a._disabled=!1,a._hasFocus=!1,a.checkboxPosition="after",a._inputsInitialized=!1,a}return b(n,[{key:"ngOnInit",value:function(){var t=this,e=this.selectionList;e._value&&e._value.some((function(n){return e.compareWith(n,t._value)}))&&this._setSelected(!0);var n=this._selected;Promise.resolve().then((function(){(t._selected||n)&&(t.selected=!0,t._changeDetector.markForCheck())})),this._inputsInitialized=!0}},{key:"ngAfterContentInit",value:function(){Iw(this._lines,this._element)}},{key:"ngOnDestroy",value:function(){var t=this;this.selected&&Promise.resolve().then((function(){t.selected=!1}));var e=this._hasFocus,n=this.selectionList._removeOptionFromList(this);e&&n&&n.focus()}},{key:"toggle",value:function(){this.selected=!this.selected}},{key:"focus",value:function(){this._element.nativeElement.focus()}},{key:"getLabel",value:function(){return this._text&&this._text.nativeElement.textContent||""}},{key:"_isRippleDisabled",value:function(){return this.disabled||this.disableRipple||this.selectionList.disableRipple}},{key:"_handleClick",value:function(){this.disabled||!this.selectionList.multiple&&this.selected||(this.toggle(),this.selectionList._emitChangeEvent([this]))}},{key:"_handleFocus",value:function(){this.selectionList._setFocusedOption(this),this._hasFocus=!0}},{key:"_handleBlur",value:function(){this.selectionList._onTouched(),this._hasFocus=!1}},{key:"_getHostElement",value:function(){return this._element.nativeElement}},{key:"_setSelected",value:function(t){return t!==this._selected&&(this._selected=t,t?this.selectionList.selectedOptions.select(this):this.selectionList.selectedOptions.deselect(this),this._changeDetector.markForCheck(),!0)}},{key:"_markForCheck",value:function(){this._changeDetector.markForCheck()}},{key:"color",get:function(){return this._color||this.selectionList.color},set:function(t){this._color=t}},{key:"value",get:function(){return this._value},set:function(t){this.selected&&!this.selectionList.compareWith(t,this.value)&&this._inputsInitialized&&(this.selected=!1),this._value=t}},{key:"disabled",get:function(){return this._disabled||this.selectionList&&this.selectionList.disabled},set:function(t){var e=Em(t);e!==this._disabled&&(this._disabled=e,this._changeDetector.markForCheck())}},{key:"selected",get:function(){return this.selectionList.selectedOptions.isSelected(this)},set:function(t){var e=Em(t);e!==this._selected&&(this._setSelected(e),this.selectionList._reportValueChange())}}]),n}(DW);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Lo),gs(Ut((function(){return OW}))))},t.\u0275cmp=Fe({type:t,selectors:[["mat-list-option"]],contentQueries:function(t,e,n){var i;1&t&&(Ql(n,kW,!0),Ql(n,MW,!0),Ql(n,Pw,!0)),2&t&&(Gl(i=tc())&&(e._avatar=i.first),Gl(i=tc())&&(e._icon=i.first),Gl(i=tc())&&(e._lines=i))},viewQuery:function(t,e){var n;1&t&&Zl(dW,!0),2&t&&Gl(n=tc())&&(e._text=n.first)},hostAttrs:["role","option",1,"mat-list-item","mat-list-option","mat-focus-indicator"],hostVars:15,hostBindings:function(t,e){1&t&&Ts("focus",(function(){return e._handleFocus()}))("blur",(function(){return e._handleBlur()}))("click",(function(){return e._handleClick()})),2&t&&(ds("aria-selected",e.selected)("aria-disabled",e.disabled)("tabindex",-1),Js("mat-list-item-disabled",e.disabled)("mat-list-item-with-avatar",e._avatar||e._icon)("mat-primary","primary"===e.color)("mat-accent","primary"!==e.color&&"warn"!==e.color)("mat-warn","warn"===e.color)("mat-list-single-selected-option",e.selected&&!e.selectionList.multiple))},inputs:{disableRipple:"disableRipple",checkboxPosition:"checkboxPosition",color:"color",value:"value",selected:"selected",disabled:"disabled"},exportAs:["matListOption"],features:[Jo],ngContentSelectors:pW,decls:13,vars:5,consts:[[1,"mat-list-item-content"],["mat-ripple","",1,"mat-list-item-ripple",3,"matRippleTrigger","matRippleDisabled"],[3,"state","disabled",4,"ngIf"],[1,"mat-list-text"],["text",""],[3,"state","disabled"]],template:function(t,e){1&t&&(Fs(fW),bs(0,"div",0),uu(1,"\n\n "),ks(2,"div",1),uu(3,"\n\n "),ps(4,hW,1,2,"mat-pseudo-checkbox",2),uu(5,"\n\n "),bs(6,"div",3,4),Hs(8),ws(),uu(9,"\n\n "),Hs(10,1),uu(11,"\n\n"),ws(),uu(12,"\n")),2&t&&(Js("mat-list-item-content-reverse","after"==e.checkboxPosition),na(2),_s("matRippleTrigger",e._getHostElement())("matRippleDisabled",e._isRippleDisabled()),na(2),_s("ngIf",e.selectionList.multiple))},directives:[qw,Eh,Kw],encapsulation:2,changeDetection:0}),t}(),OW=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a){var o;return _(this,n),(o=e.call(this))._element=t,o._changeDetector=r,o._focusMonitor=a,o._multiple=!0,o._contentInitialized=!1,o.selectionChange=new Rl,o.tabIndex=0,o.color="accent",o.compareWith=function(t,e){return t===e},o._disabled=!1,o.selectedOptions=new Og(o._multiple),o._tabIndex=-1,o._onChange=function(t){},o._destroyed=new z,o._onTouched=function(){},o}return b(n,[{key:"ngAfterContentInit",value:function(){var t,e=this;this._contentInitialized=!0,this._keyManager=new i_(this.options).withWrap().withTypeAhead().withHomeAndEnd().skipPredicate((function(){return!1})).withAllowedModifierKeys(["shiftKey"]),this._value&&this._setOptionsFromValues(this._value),this._keyManager.tabOut.pipe($m(this._destroyed)).subscribe((function(){e._allowFocusEscape()})),this.options.changes.pipe(rg(null),$m(this._destroyed)).subscribe((function(){e._updateTabIndex()})),this.selectedOptions.changed.pipe($m(this._destroyed)).subscribe((function(t){if(t.added){var e,n=d(t.added);try{for(n.s();!(e=n.n()).done;)e.value.selected=!0}catch(a){n.e(a)}finally{n.f()}}if(t.removed){var i,r=d(t.removed);try{for(r.s();!(i=r.n()).done;)i.value.selected=!1}catch(a){r.e(a)}finally{r.f()}}})),null===(t=this._focusMonitor)||void 0===t||t.monitor(this._element).pipe($m(this._destroyed)).subscribe((function(t){if("keyboard"===t||"program"===t){var n=e._keyManager.activeItemIndex;n&&-1!==n?e._keyManager.setActiveItem(n):e._keyManager.setFirstItemActive()}}))}},{key:"ngOnChanges",value:function(t){var e=t.disableRipple,n=t.color;(e&&!e.firstChange||n&&!n.firstChange)&&this._markOptionsForCheck()}},{key:"ngOnDestroy",value:function(){var t;null===(t=this._focusMonitor)||void 0===t||t.stopMonitoring(this._element),this._destroyed.next(),this._destroyed.complete(),this._isDestroyed=!0}},{key:"focus",value:function(t){this._element.nativeElement.focus(t)}},{key:"selectAll",value:function(){this._setAllOptionsSelected(!0)}},{key:"deselectAll",value:function(){this._setAllOptionsSelected(!1)}},{key:"_setFocusedOption",value:function(t){this._keyManager.updateActiveItem(t)}},{key:"_removeOptionFromList",value:function(t){var e=this._getOptionIndex(t);return e>-1&&this._keyManager.activeItemIndex===e&&(e>0?this._keyManager.updateActiveItem(e-1):0===e&&this.options.length>1&&this._keyManager.updateActiveItem(Math.min(e+1,this.options.length-1))),this._keyManager.activeItem}},{key:"_keydown",value:function(t){var e=t.keyCode,n=this._keyManager,i=n.activeItemIndex,r=nv(t);switch(e){case $g:case Qg:r||n.isTyping()||(this._toggleFocusedOption(),t.preventDefault());break;default:if(65===e&&this.multiple&&nv(t,"ctrlKey")&&!n.isTyping()){var a=this.options.some((function(t){return!t.disabled&&!t.selected}));this._setAllOptionsSelected(a,!0,!0),t.preventDefault()}else n.onKeydown(t)}this.multiple&&(e===tv||e===ev)&&t.shiftKey&&n.activeItemIndex!==i&&this._toggleFocusedOption()}},{key:"_reportValueChange",value:function(){if(this.options&&!this._isDestroyed){var t=this._getSelectedOptionValues();this._onChange(t),this._value=t}}},{key:"_emitChangeEvent",value:function(t){this.selectionChange.emit(new TW(this,t[0],t))}},{key:"writeValue",value:function(t){this._value=t,this.options&&this._setOptionsFromValues(t||[])}},{key:"setDisabledState",value:function(t){this.disabled=t}},{key:"registerOnChange",value:function(t){this._onChange=t}},{key:"registerOnTouched",value:function(t){this._onTouched=t}},{key:"_setOptionsFromValues",value:function(t){var e=this;this.options.forEach((function(t){return t._setSelected(!1)})),t.forEach((function(t){var n=e.options.find((function(n){return!n.selected&&e.compareWith(n.value,t)}));n&&n._setSelected(!0)}))}},{key:"_getSelectedOptionValues",value:function(){return this.options.filter((function(t){return t.selected})).map((function(t){return t.value}))}},{key:"_toggleFocusedOption",value:function(){var t=this._keyManager.activeItemIndex;if(null!=t&&this._isValidIndex(t)){var e=this.options.toArray()[t];!e||e.disabled||!this._multiple&&e.selected||(e.toggle(),this._emitChangeEvent([e]))}}},{key:"_setAllOptionsSelected",value:function(t,e,n){var i=[];this.options.forEach((function(n){e&&n.disabled||!n._setSelected(t)||i.push(n)})),i.length&&(this._reportValueChange(),n&&this._emitChangeEvent(i))}},{key:"_isValidIndex",value:function(t){return t>=0&&t left, * => right, left => center, right => center",L_("{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)")),I_("void => left-origin-center",[O_({transform:"translate3d(-100%, 0, 0)"}),L_("{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)")]),I_("void => right-origin-center",[O_({transform:"translate3d(100%, 0, 0)"}),L_("{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)")])])},sV=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a){var o;return _(this,n),(o=e.call(this,t,i,a))._host=r,o._centeringSub=x.EMPTY,o._leavingSub=x.EMPTY,o}return b(n,[{key:"ngOnInit",value:function(){var t=this;r(i(n.prototype),"ngOnInit",this).call(this),this._centeringSub=this._host._beforeCentering.pipe(rg(this._host._isCenterPosition(this._host._position))).subscribe((function(e){e&&!t.hasAttached()&&t.attach(t._host._content)})),this._leavingSub=this._host._afterLeavingCenter.subscribe((function(){t.detach()}))}},{key:"ngOnDestroy",value:function(){r(i(n.prototype),"ngOnDestroy",this).call(this),this._centeringSub.unsubscribe(),this._leavingSub.unsubscribe()}}]),n}(Ug);return t.\u0275fac=function(e){return new(e||t)(gs(Fu),gs(cl),gs(Ut((function(){return lV}))),gs(ud))},t.\u0275dir=ze({type:t,selectors:[["","matTabBodyHost",""]],features:[Jo]}),t}(),uV=function(){var t=function(){function t(e,n,i){var r=this;_(this,t),this._elementRef=e,this._dir=n,this._dirChangeSubscription=x.EMPTY,this._translateTabComplete=new z,this._onCentering=new Rl,this._beforeCentering=new Rl,this._afterLeavingCenter=new Rl,this._onCentered=new Rl(!0),this.animationDuration="500ms",n&&(this._dirChangeSubscription=n.change.subscribe((function(t){r._computePositionAnimationState(t),i.markForCheck()}))),this._translateTabComplete.pipe(Vm((function(t,e){return t.fromState===e.fromState&&t.toState===e.toState}))).subscribe((function(t){r._isCenterPosition(t.toState)&&r._isCenterPosition(r._position)&&r._onCentered.emit(),r._isCenterPosition(t.fromState)&&!r._isCenterPosition(r._position)&&r._afterLeavingCenter.emit()}))}return b(t,[{key:"ngOnInit",value:function(){"center"==this._position&&null!=this.origin&&(this._position=this._computePositionFromOrigin(this.origin))}},{key:"ngOnDestroy",value:function(){this._dirChangeSubscription.unsubscribe(),this._translateTabComplete.complete()}},{key:"_onTranslateTabStarted",value:function(t){var e=this._isCenterPosition(t.toState);this._beforeCentering.emit(e),e&&this._onCentering.emit(this._elementRef.nativeElement.clientHeight)}},{key:"_getLayoutDirection",value:function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"}},{key:"_isCenterPosition",value:function(t){return"center"==t||"left-origin-center"==t||"right-origin-center"==t}},{key:"_computePositionAnimationState",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this._getLayoutDirection();this._position=this._positionIndex<0?"ltr"==t?"left":"right":this._positionIndex>0?"ltr"==t?"right":"left":"center"}},{key:"_computePositionFromOrigin",value:function(t){var e=this._getLayoutDirection();return"ltr"==e&&t<=0||"rtl"==e&&t>0?"left-origin-center":"right-origin-center"}},{key:"position",set:function(t){this._positionIndex=t,this._computePositionAnimationState()}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Lg,8),gs(Lo))},t.\u0275dir=ze({type:t,inputs:{animationDuration:"animationDuration",position:"position",_content:["content","_content"],origin:"origin"},outputs:{_onCentering:"_onCentering",_beforeCentering:"_beforeCentering",_afterLeavingCenter:"_afterLeavingCenter",_onCentered:"_onCentered"}}),t}(),lV=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r){return _(this,n),e.call(this,t,i,r)}return n}(uV);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Lg,8),gs(Lo))},t.\u0275cmp=Fe({type:t,selectors:[["mat-tab-body"]],viewQuery:function(t,e){var n;1&t&&Zl(qg,!0),2&t&&Gl(n=tc())&&(e._portalHost=n.first)},hostAttrs:[1,"mat-tab-body"],features:[Jo],decls:6,vars:6,consts:[[1,"mat-tab-body-content"],["content",""],["matTabBodyHost",""]],template:function(t,e){1&t&&(bs(0,"div",0,1),Ts("@translateTab.start",(function(t){return e._onTranslateTabStarted(t)}))("@translateTab.done",(function(t){return e._translateTabComplete.next(t)})),uu(2,"\n "),ps(3,YW,0,0,"ng-template",2),uu(4,"\n"),ws(),uu(5,"\n")),2&t&&_s("@translateTab",Ml(3,FW,e._position,kl(1,RW,e.animationDuration)))},directives:[sV],styles:[".mat-tab-body-content{height:100%;overflow:auto}.mat-tab-group-dynamic-height .mat-tab-body-content{overflow:hidden}\n"],encapsulation:2,data:{animation:[oV.translateTab]}}),t}(),cV=new se("MAT_TABS_CONFIG"),dV=0,hV=function t(){_(this,t)},fV=Lw(Tw((function t(e){_(this,t),this._elementRef=e})),"primary"),pV=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a){var o;return _(this,n),(o=e.call(this,t))._changeDetectorRef=i,o._animationMode=a,o._tabs=new Hl,o._indexToSelect=0,o._tabBodyWrapperHeight=0,o._tabsSubscription=x.EMPTY,o._tabLabelSubscription=x.EMPTY,o._dynamicHeight=!1,o._selectedIndex=null,o.headerPosition="above",o.selectedIndexChange=new Rl,o.focusChange=new Rl,o.animationDone=new Rl,o.selectedTabChange=new Rl(!0),o._groupId=dV++,o.animationDuration=r&&r.animationDuration?r.animationDuration:"500ms",o.disablePagination=!(!r||null==r.disablePagination)&&r.disablePagination,o}return b(n,[{key:"ngAfterContentChecked",value:function(){var t=this,e=this._indexToSelect=this._clampTabIndex(this._indexToSelect);if(this._selectedIndex!=e){var n=null==this._selectedIndex;n||this.selectedTabChange.emit(this._createChangeEvent(e)),Promise.resolve().then((function(){t._tabs.forEach((function(t,n){return t.isActive=n===e})),n||t.selectedIndexChange.emit(e)}))}this._tabs.forEach((function(n,i){n.position=i-e,null==t._selectedIndex||0!=n.position||n.origin||(n.origin=e-t._selectedIndex)})),this._selectedIndex!==e&&(this._selectedIndex=e,this._changeDetectorRef.markForCheck())}},{key:"ngAfterContentInit",value:function(){var t=this;this._subscribeToAllTabChanges(),this._subscribeToTabLabels(),this._tabsSubscription=this._tabs.changes.subscribe((function(){if(t._clampTabIndex(t._indexToSelect)===t._selectedIndex)for(var e=t._tabs.toArray(),n=0;n.mat-tab-header .mat-tab-label{flex-basis:0;flex-grow:1}.mat-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable.mat-tab-body-wrapper{transition:none;animation:none}.mat-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;flex-basis:100%}.mat-tab-body.mat-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-tab-group.mat-tab-group-dynamic-height .mat-tab-body.mat-tab-body-active{overflow-y:hidden}\n"],encapsulation:2}),t}(),gV=Dw((function t(){_(this,t)})),vV=function(){var t=function(t){f(n,t);var e=v(n);function n(t){var i;return _(this,n),(i=e.call(this)).elementRef=t,i}return b(n,[{key:"focus",value:function(){this.elementRef.nativeElement.focus()}},{key:"getOffsetLeft",value:function(){return this.elementRef.nativeElement.offsetLeft}},{key:"getOffsetWidth",value:function(){return this.elementRef.nativeElement.offsetWidth}}]),n}(gV);return t.\u0275fac=function(e){return new(e||t)(gs(Hu))},t.\u0275dir=ze({type:t,selectors:[["","matTabLabelWrapper",""]],hostVars:3,hostBindings:function(t,e){2&t&&(ds("aria-disabled",!!e.disabled),Js("mat-tab-disabled",e.disabled))},inputs:{disabled:"disabled"},features:[Jo]}),t}(),_V=Sg({passive:!0}),yV=function(){var t=function(){function t(e,n,i,r,a,o,s){var u=this;_(this,t),this._elementRef=e,this._changeDetectorRef=n,this._viewportRuler=i,this._dir=r,this._ngZone=a,this._platform=o,this._animationMode=s,this._scrollDistance=0,this._selectedIndexChanged=!1,this._destroyed=new z,this._showPaginationControls=!1,this._disableScrollAfter=!0,this._disableScrollBefore=!0,this._stopScrolling=new z,this.disablePagination=!1,this._selectedIndex=0,this.selectFocusedIndex=new Rl,this.indexFocused=new Rl,a.runOutsideAngular((function(){Rm(e.nativeElement,"mouseleave").pipe($m(u._destroyed)).subscribe((function(){u._stopInterval()}))}))}return b(t,[{key:"ngAfterViewInit",value:function(){var t=this;Rm(this._previousPaginator.nativeElement,"touchstart",_V).pipe($m(this._destroyed)).subscribe((function(){t._handlePaginatorPress("before")})),Rm(this._nextPaginator.nativeElement,"touchstart",_V).pipe($m(this._destroyed)).subscribe((function(){t._handlePaginatorPress("after")}))}},{key:"ngAfterContentInit",value:function(){var t=this,e=this._dir?this._dir.change:rp(null),n=this._viewportRuler.change(150),i=function(){t.updatePagination(),t._alignInkBarToSelectedTab()};this._keyManager=new i_(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap(),this._keyManager.updateActiveItem(this._selectedIndex),"undefined"!=typeof requestAnimationFrame?requestAnimationFrame(i):i(),ft(e,n,this._items.changes).pipe($m(this._destroyed)).subscribe((function(){Promise.resolve().then(i),t._keyManager.withHorizontalOrientation(t._getLayoutDirection())})),this._keyManager.change.pipe($m(this._destroyed)).subscribe((function(e){t.indexFocused.emit(e),t._setTabFocus(e)}))}},{key:"ngAfterContentChecked",value:function(){this._tabLabelCount!=this._items.length&&(this.updatePagination(),this._tabLabelCount=this._items.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())}},{key:"ngOnDestroy",value:function(){this._destroyed.next(),this._destroyed.complete(),this._stopScrolling.complete()}},{key:"_handleKeydown",value:function(t){if(!nv(t))switch(t.keyCode){case Qg:case $g:this.focusIndex!==this.selectedIndex&&(this.selectFocusedIndex.emit(this.focusIndex),this._itemSelected(t));break;default:this._keyManager.onKeydown(t)}}},{key:"_onContentChanges",value:function(){var t=this,e=this._elementRef.nativeElement.textContent;e!==this._currentTextContent&&(this._currentTextContent=e||"",this._ngZone.run((function(){t.updatePagination(),t._alignInkBarToSelectedTab(),t._changeDetectorRef.markForCheck()})))}},{key:"updatePagination",value:function(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()}},{key:"_isValidIndex",value:function(t){if(!this._items)return!0;var e=this._items?this._items.toArray()[t]:null;return!!e&&!e.disabled}},{key:"_setTabFocus",value:function(t){if(this._showPaginationControls&&this._scrollToLabel(t),this._items&&this._items.length){this._items.toArray()[t].focus();var e=this._tabListContainer.nativeElement,n=this._getLayoutDirection();e.scrollLeft="ltr"==n?0:e.scrollWidth-e.offsetWidth}}},{key:"_getLayoutDirection",value:function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"}},{key:"_updateTabScrollPosition",value:function(){if(!this.disablePagination){var t=this.scrollDistance,e=this._platform,n="ltr"===this._getLayoutDirection()?-t:t;this._tabList.nativeElement.style.transform="translateX(".concat(Math.round(n),"px)"),e&&(e.TRIDENT||e.EDGE)&&(this._tabListContainer.nativeElement.scrollLeft=0)}}},{key:"_scrollHeader",value:function(t){return this._scrollTo(this._scrollDistance+("before"==t?-1:1)*this._tabListContainer.nativeElement.offsetWidth/3)}},{key:"_handlePaginatorClick",value:function(t){this._stopInterval(),this._scrollHeader(t)}},{key:"_scrollToLabel",value:function(t){if(!this.disablePagination){var e=this._items?this._items.toArray()[t]:null;if(e){var n,i,r=this._tabListContainer.nativeElement.offsetWidth,a=e.elementRef.nativeElement,o=a.offsetLeft,s=a.offsetWidth;"ltr"==this._getLayoutDirection()?i=(n=o)+s:n=(i=this._tabList.nativeElement.offsetWidth-o)-s;var u=this.scrollDistance,l=this.scrollDistance+r;nl&&(this.scrollDistance+=i-l+60)}}}},{key:"_checkPaginationEnabled",value:function(){if(this.disablePagination)this._showPaginationControls=!1;else{var t=this._tabList.nativeElement.scrollWidth>this._elementRef.nativeElement.offsetWidth;t||(this.scrollDistance=0),t!==this._showPaginationControls&&this._changeDetectorRef.markForCheck(),this._showPaginationControls=t}}},{key:"_checkScrollingControls",value:function(){this.disablePagination?this._disableScrollAfter=this._disableScrollBefore=!0:(this._disableScrollBefore=0==this.scrollDistance,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck())}},{key:"_getMaxScrollDistance",value:function(){return this._tabList.nativeElement.scrollWidth-this._tabListContainer.nativeElement.offsetWidth||0}},{key:"_alignInkBarToSelectedTab",value:function(){var t=this._items&&this._items.length?this._items.toArray()[this.selectedIndex]:null,e=t?t.elementRef.nativeElement:null;e?this._inkBar.alignToElement(e):this._inkBar.hide()}},{key:"_stopInterval",value:function(){this._stopScrolling.next()}},{key:"_handlePaginatorPress",value:function(t,e){var n=this;e&&null!=e.button&&0!==e.button||(this._stopInterval(),Jm(650,100).pipe($m(ft(this._stopScrolling,this._destroyed))).subscribe((function(){var e=n._scrollHeader(t),i=e.distance;(0===i||i>=e.maxScrollDistance)&&n._stopInterval()})))}},{key:"_scrollTo",value:function(t){if(this.disablePagination)return{maxScrollDistance:0,distance:0};var e=this._getMaxScrollDistance();return this._scrollDistance=Math.max(0,Math.min(e,t)),this._scrollDistanceChanged=!0,this._checkScrollingControls(),{maxScrollDistance:e,distance:this._scrollDistance}}},{key:"selectedIndex",get:function(){return this._selectedIndex},set:function(t){t=Om(t),this._selectedIndex!=t&&(this._selectedIndexChanged=!0,this._selectedIndex=t,this._keyManager&&this._keyManager.updateActiveItem(t))}},{key:"focusIndex",get:function(){return this._keyManager?this._keyManager.activeItemIndex:0},set:function(t){this._isValidIndex(t)&&this.focusIndex!==t&&this._keyManager&&this._keyManager.setActiveItem(t)}},{key:"scrollDistance",get:function(){return this._scrollDistance},set:function(t){this._scrollTo(t)}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Lo),gs(Yg),gs(Lg,8),gs(Dc),gs(bg),gs(gw,8))},t.\u0275dir=ze({type:t,inputs:{disablePagination:"disablePagination"}}),t}(),bV=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s,u){var l;return _(this,n),(l=e.call(this,t,i,r,a,o,s,u))._disableRipple=!1,l}return b(n,[{key:"_itemSelected",value:function(t){t.preventDefault()}},{key:"disableRipple",get:function(){return this._disableRipple},set:function(t){this._disableRipple=Em(t)}}]),n}(yV);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Lo),gs(Yg),gs(Lg,8),gs(Dc),gs(bg),gs(gw,8))},t.\u0275dir=ze({type:t,inputs:{disableRipple:"disableRipple"},features:[Jo]}),t}(),wV=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s,u){return _(this,n),e.call(this,t,i,r,a,o,s,u)}return n}(bV);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Lo),gs(Yg),gs(Lg,8),gs(Dc),gs(bg),gs(gw,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-tab-header"]],contentQueries:function(t,e,n){var i;1&t&&Ql(n,vV,!1),2&t&&Gl(i=tc())&&(e._items=i)},viewQuery:function(t,e){var n;1&t&&(Kl(QW,!0),Kl(UW,!0),Kl(qW,!0),Zl(GW,!0),Zl(KW,!0)),2&t&&(Gl(n=tc())&&(e._inkBar=n.first),Gl(n=tc())&&(e._tabListContainer=n.first),Gl(n=tc())&&(e._tabList=n.first),Gl(n=tc())&&(e._nextPaginator=n.first),Gl(n=tc())&&(e._previousPaginator=n.first))},hostAttrs:[1,"mat-tab-header"],hostVars:4,hostBindings:function(t,e){2&t&&Js("mat-tab-header-pagination-controls-enabled",e._showPaginationControls)("mat-tab-header-rtl","rtl"==e._getLayoutDirection())},inputs:{selectedIndex:"selectedIndex"},outputs:{selectFocusedIndex:"selectFocusedIndex",indexFocused:"indexFocused"},features:[Jo],ngContentSelectors:IW,decls:27,vars:8,consts:[["aria-hidden","true","mat-ripple","",1,"mat-tab-header-pagination","mat-tab-header-pagination-before","mat-elevation-z4",3,"matRippleDisabled","click","mousedown","touchend"],["previousPaginator",""],[1,"mat-tab-header-pagination-chevron"],[1,"mat-tab-label-container",3,"keydown"],["tabListContainer",""],["role","tablist",1,"mat-tab-list",3,"cdkObserveContent"],["tabList",""],[1,"mat-tab-labels"],["aria-hidden","true","mat-ripple","",1,"mat-tab-header-pagination","mat-tab-header-pagination-after","mat-elevation-z4",3,"matRippleDisabled","mousedown","click","touchend"],["nextPaginator",""]],template:function(t,e){1&t&&(Fs(),bs(0,"div",0,1),Ts("click",(function(){return e._handlePaginatorClick("before")}))("mousedown",(function(t){return e._handlePaginatorPress("before",t)}))("touchend",(function(){return e._stopInterval()})),uu(2,"\n "),ks(3,"div",2),uu(4,"\n"),ws(),uu(5,"\n\n"),bs(6,"div",3,4),Ts("keydown",(function(t){return e._handleKeydown(t)})),uu(8,"\n "),bs(9,"div",5,6),Ts("cdkObserveContent",(function(){return e._onContentChanges()})),uu(11,"\n "),bs(12,"div",7),uu(13,"\n "),Hs(14),uu(15,"\n "),ws(),uu(16,"\n "),ks(17,"mat-ink-bar"),uu(18,"\n "),ws(),uu(19,"\n"),ws(),uu(20,"\n\n"),bs(21,"div",8,9),Ts("mousedown",(function(t){return e._handlePaginatorPress("after",t)}))("click",(function(){return e._handlePaginatorClick("after")}))("touchend",(function(){return e._stopInterval()})),uu(23,"\n "),ks(24,"div",2),uu(25,"\n"),ws(),uu(26,"\n")),2&t&&(Js("mat-tab-header-pagination-disabled",e._disableScrollBefore),_s("matRippleDisabled",e._disableScrollBefore||e.disableRipple),na(9),Js("_mat-animation-noopable","NoopAnimations"===e._animationMode),na(12),Js("mat-tab-header-pagination-disabled",e._disableScrollAfter),_s("matRippleDisabled",e._disableScrollAfter||e.disableRipple))},directives:[qw,Uv,QW],styles:['.mat-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mat-tab-header-pagination{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:transparent;touch-action:none}.mat-tab-header-pagination-controls-enabled .mat-tab-header-pagination{display:flex}.mat-tab-header-pagination-before,.mat-tab-header-rtl .mat-tab-header-pagination-after{padding-left:4px}.mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-rtl .mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-tab-header-rtl .mat-tab-header-pagination-before,.mat-tab-header-pagination-after{padding-right:4px}.mat-tab-header-rtl .mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;content:"";height:8px;width:8px}.mat-tab-header-pagination-disabled{box-shadow:none;cursor:default}.mat-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-ink-bar{position:absolute;bottom:0;height:2px;transition:500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable.mat-ink-bar{transition:none;animation:none}.mat-tab-group-inverted-header .mat-ink-bar{bottom:auto;top:0}.cdk-high-contrast-active .mat-ink-bar{outline:solid 2px;height:0}.mat-tab-labels{display:flex}[mat-align-tabs=center]>.mat-tab-header .mat-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-tab-header .mat-tab-labels{justify-content:flex-end}.mat-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}._mat-animation-noopable.mat-tab-list{transition:none;animation:none}.mat-tab-label{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:inline-flex;justify-content:center;align-items:center;white-space:nowrap;position:relative}.mat-tab-label:focus{outline:none}.mat-tab-label:focus:not(.mat-tab-disabled){opacity:1}.cdk-high-contrast-active .mat-tab-label:focus{outline:dotted 2px;outline-offset:-2px}.mat-tab-label.mat-tab-disabled{cursor:default}.cdk-high-contrast-active .mat-tab-label.mat-tab-disabled{opacity:.5}.mat-tab-label .mat-tab-label-content{display:inline-flex;justify-content:center;align-items:center;white-space:nowrap}.cdk-high-contrast-active .mat-tab-label{opacity:1}@media(max-width: 599px){.mat-tab-label{min-width:72px}}\n'],encapsulation:2}),t}(),kV=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s,u){var l;return _(this,n),(l=e.call(this,t,a,o,i,r,s,u))._disableRipple=!1,l.color="primary",l}return b(n,[{key:"_itemSelected",value:function(){}},{key:"ngAfterContentInit",value:function(){var t=this;this._items.changes.pipe(rg(null),$m(this._destroyed)).subscribe((function(){t.updateActiveLink()})),r(i(n.prototype),"ngAfterContentInit",this).call(this)}},{key:"updateActiveLink",value:function(t){if(this._items){for(var e=this._items.toArray(),n=0;n.mat-tab-link-container .mat-tab-links{justify-content:center}[mat-align-tabs=end]>.mat-tab-link-container .mat-tab-links{justify-content:flex-end}.mat-ink-bar{position:absolute;bottom:0;height:2px;transition:500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable.mat-ink-bar{transition:none;animation:none}.mat-tab-group-inverted-header .mat-ink-bar{bottom:auto;top:0}.cdk-high-contrast-active .mat-ink-bar{outline:solid 2px;height:0}.mat-tab-link-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}.mat-tab-link{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:inline-flex;justify-content:center;align-items:center;white-space:nowrap;vertical-align:top;text-decoration:none;position:relative;overflow:hidden;-webkit-tap-highlight-color:transparent}.mat-tab-link:focus{outline:none}.mat-tab-link:focus:not(.mat-tab-disabled){opacity:1}.cdk-high-contrast-active .mat-tab-link:focus{outline:dotted 2px;outline-offset:-2px}.mat-tab-link.mat-tab-disabled{cursor:default}.cdk-high-contrast-active .mat-tab-link.mat-tab-disabled{opacity:.5}.mat-tab-link .mat-tab-label-content{display:inline-flex;justify-content:center;align-items:center;white-space:nowrap}.cdk-high-contrast-active .mat-tab-link{opacity:1}[mat-stretch-tabs] .mat-tab-link{flex-basis:0;flex-grow:1}.mat-tab-link.mat-tab-disabled{pointer-events:none}@media(max-width: 599px){.mat-tab-link{min-width:72px}}\n'],encapsulation:2}),t}(),SV=Ew(Tw(Dw((function t(){_(this,t)})))),CV=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s){var u;return _(this,n),(u=e.call(this))._tabNavBar=t,u.elementRef=i,u._focusMonitor=o,u._isActive=!1,u.rippleConfig=r||{},u.tabIndex=parseInt(a)||0,"NoopAnimations"===s&&(u.rippleConfig.animation={enterDuration:0,exitDuration:0}),u}return b(n,[{key:"focus",value:function(){this.elementRef.nativeElement.focus()}},{key:"ngAfterViewInit",value:function(){this._focusMonitor.monitor(this.elementRef)}},{key:"ngOnDestroy",value:function(){this._focusMonitor.stopMonitoring(this.elementRef)}},{key:"active",get:function(){return this._isActive},set:function(t){Em(t)!==this._isActive&&(this._isActive=t,this._tabNavBar.updateActiveLink(this.elementRef))}},{key:"rippleDisabled",get:function(){return this.disabled||this.disableRipple||this._tabNavBar.disableRipple||!!this.rippleConfig.disabled}}]),n}(SV);return t.\u0275fac=function(e){return new(e||t)(gs(kV),gs(Hu),gs(Uw,8),vs("tabindex"),gs(m_),gs(gw,8))},t.\u0275dir=ze({type:t,inputs:{active:"active"},features:[Jo]}),t}(),xV=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,o,s,u,l,c){var d;return _(this,n),(d=e.call(this,t,i,s,u,l,c))._tabLinkRipple=new Ww(a(d),r,i,o),d._tabLinkRipple.setupTriggerEvents(i.nativeElement),d}return b(n,[{key:"ngOnDestroy",value:function(){r(i(n.prototype),"ngOnDestroy",this).call(this),this._tabLinkRipple._removeTriggerEvents()}}]),n}(CV);return t.\u0275fac=function(e){return new(e||t)(gs(MV),gs(Hu),gs(Dc),gs(bg),gs(Uw,8),vs("tabindex"),gs(m_),gs(gw,8))},t.\u0275dir=ze({type:t,selectors:[["","mat-tab-link",""],["","matTabLink",""]],hostAttrs:[1,"mat-tab-link","mat-focus-indicator"],hostVars:7,hostBindings:function(t,e){2&t&&(ds("aria-current",e.active?"page":null)("aria-disabled",e.disabled)("tabIndex",e.tabIndex),Js("mat-tab-disabled",e.disabled)("mat-tab-label-active",e.active))},inputs:{disabled:"disabled",disableRipple:"disableRipple",tabIndex:"tabIndex"},exportAs:["matTabLink"],features:[Jo]}),t}(),DV=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[df,xw,Kg,Gw,qv,k_],xw]}),t}(),LV=["*",[["mat-toolbar-row"]]],TV=["*","mat-toolbar-row"],EV=Lw((function t(e){_(this,t),this._elementRef=e})),OV=function(){var t=function t(){_(this,t)};return t.\u0275fac=function(e){return new(e||t)},t.\u0275dir=ze({type:t,selectors:[["mat-toolbar-row"]],hostAttrs:[1,"mat-toolbar-row"],exportAs:["matToolbarRow"]}),t}(),AV=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this,t))._platform=i,a._document=r,a}return b(n,[{key:"ngAfterViewInit",value:function(){var t=this;this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe((function(){return t._checkToolbarMixedModes()})))}},{key:"_checkToolbarMixedModes",value:function(){}}]),n}(EV);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(bg),gs(ud))},t.\u0275cmp=Fe({type:t,selectors:[["mat-toolbar"]],contentQueries:function(t,e,n){var i;1&t&&Ql(n,OV,!0),2&t&&Gl(i=tc())&&(e._toolbarRows=i)},hostAttrs:[1,"mat-toolbar"],hostVars:4,hostBindings:function(t,e){2&t&&Js("mat-toolbar-multiple-rows",e._toolbarRows.length>0)("mat-toolbar-single-row",0===e._toolbarRows.length)},inputs:{color:"color"},exportAs:["matToolbar"],features:[Jo],ngContentSelectors:TV,decls:4,vars:0,template:function(t,e){1&t&&(Fs(LV),Hs(0),uu(1,"\n"),Hs(2,1),uu(3,"\n"))},styles:[".cdk-high-contrast-active .mat-toolbar{outline:solid 1px}.mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}\n"],encapsulation:2,changeDetection:0}),t}(),PV=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[xw],xw]}),t}(),IV=["panel"];function YV(t,e){if(1&t&&(uu(0,"\n "),bs(1,"div",0,1),uu(3,"\n "),Hs(4),uu(5,"\n "),ws(),uu(6,"\n")),2&t){var n=Ys();na(1),_s("id",n.id)("ngClass",n._classList)}}var RV=["*"],FV=0,HV=function t(e,n){_(this,t),this.source=e,this.option=n},BV=Tw((function t(){_(this,t)})),jV=new se("mat-autocomplete-default-options",{providedIn:"root",factory:function(){return{autoActiveFirstOption:!1}}}),NV=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r){var a;return _(this,n),(a=e.call(this))._changeDetectorRef=t,a._elementRef=i,a._activeOptionChanges=x.EMPTY,a.showPanel=!1,a._isOpen=!1,a.displayWith=null,a.optionSelected=new Rl,a.opened=new Rl,a.closed=new Rl,a.optionActivated=new Rl,a._classList={},a.id="mat-autocomplete-".concat(FV++),a._autoActiveFirstOption=!!r.autoActiveFirstOption,a}return b(n,[{key:"ngAfterContentInit",value:function(){var t=this;this._keyManager=new n_(this.options).withWrap(),this._activeOptionChanges=this._keyManager.change.subscribe((function(e){t.optionActivated.emit({source:t,option:t.options.toArray()[e]||null})})),this._setVisibility()}},{key:"ngOnDestroy",value:function(){this._activeOptionChanges.unsubscribe()}},{key:"_setScrollTop",value:function(t){this.panel&&(this.panel.nativeElement.scrollTop=t)}},{key:"_getScrollTop",value:function(){return this.panel?this.panel.nativeElement.scrollTop:0}},{key:"_setVisibility",value:function(){this.showPanel=!!this.options.length,this._setVisibilityClasses(this._classList),this._changeDetectorRef.markForCheck()}},{key:"_emitSelectEvent",value:function(t){var e=new HV(this,t);this.optionSelected.emit(e)}},{key:"_setVisibilityClasses",value:function(t){t[this._visibleClass]=this.showPanel,t[this._hiddenClass]=!this.showPanel}},{key:"isOpen",get:function(){return this._isOpen&&this.showPanel}},{key:"autoActiveFirstOption",get:function(){return this._autoActiveFirstOption},set:function(t){this._autoActiveFirstOption=Em(t)}},{key:"classList",set:function(t){this._classList=t&&t.length?t.split(" ").reduce((function(t,e){return t[e.trim()]=!0,t}),{}):{},this._setVisibilityClasses(this._classList),this._elementRef.nativeElement.className=""}}]),n}(BV);return t.\u0275fac=function(e){return new(e||t)(gs(Lo),gs(Hu),gs(jV))},t.\u0275dir=ze({type:t,viewQuery:function(t,e){var n;1&t&&(Kl(ul,!0),Zl(IV,!0)),2&t&&(Gl(n=tc())&&(e.template=n.first),Gl(n=tc())&&(e.panel=n.first))},inputs:{displayWith:"displayWith",autoActiveFirstOption:"autoActiveFirstOption",classList:["class","classList"],panelWidth:"panelWidth"},outputs:{optionSelected:"optionSelected",opened:"opened",closed:"closed",optionActivated:"optionActivated"},features:[Jo]}),t}(),WV=function(){var t=function(t){f(n,t);var e=v(n);function n(){var t;return _(this,n),(t=e.apply(this,arguments))._visibleClass="mat-autocomplete-visible",t._hiddenClass="mat-autocomplete-hidden",t}return n}(NV);return t.\u0275fac=function(e){return VV(e||t)},t.\u0275cmp=Fe({type:t,selectors:[["mat-autocomplete"]],contentQueries:function(t,e,n){var i;1&t&&(Ql(n,tk,!0),Ql(n,sk,!0)),2&t&&(Gl(i=tc())&&(e.optionGroups=i),Gl(i=tc())&&(e.options=i))},hostAttrs:[1,"mat-autocomplete"],inputs:{disableRipple:"disableRipple"},exportAs:["matAutocomplete"],features:[Pu([{provide:ak,useExisting:t}]),Jo],ngContentSelectors:RV,decls:2,vars:0,consts:[["role","listbox",1,"mat-autocomplete-panel",3,"id","ngClass"],["panel",""]],template:function(t,e){1&t&&(Fs(),ps(0,YV,7,2,"ng-template"),uu(1,"\n"))},directives:[Ch],styles:[".mat-autocomplete-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;visibility:hidden;max-width:none;max-height:256px;position:relative;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.mat-autocomplete-panel.mat-autocomplete-visible{visibility:visible}.mat-autocomplete-panel.mat-autocomplete-hidden{visibility:hidden}.mat-autocomplete-panel-above .mat-autocomplete-panel{border-radius:0;border-top-left-radius:4px;border-top-right-radius:4px}.mat-autocomplete-panel .mat-divider-horizontal{margin-top:-1px}.cdk-high-contrast-active .mat-autocomplete-panel{outline:solid 1px}\n"],encapsulation:2,changeDetection:0}),t}(),VV=Ki(WV),zV=function(){var t=function t(e){_(this,t),this.elementRef=e};return t.\u0275fac=function(e){return new(e||t)(gs(Hu))},t.\u0275dir=ze({type:t}),t}(),UV=function(){var t=function(t){f(n,t);var e=v(n);function n(){return _(this,n),e.apply(this,arguments)}return n}(zV);return t.\u0275fac=function(e){return qV(e||t)},t.\u0275dir=ze({type:t,selectors:[["","matAutocompleteOrigin",""]],exportAs:["matAutocompleteOrigin"],features:[Jo]}),t}(),qV=Ki(UV),GV=new se("mat-autocomplete-scroll-strategy"),KV={provide:GV,deps:[Tv],useFactory:function(t){return function(){return t.scrollStrategies.reposition()}}},ZV={provide:qk,useExisting:Ut((function(){return QV})),multi:!0},JV=function(){var t=function(){function t(e,n,i,r,a,o,s,u,c,d){var h=this;_(this,t),this._element=e,this._overlay=n,this._viewContainerRef=i,this._zone=r,this._changeDetectorRef=a,this._dir=s,this._formField=u,this._document=c,this._viewportRuler=d,this._componentDestroyed=!1,this._autocompleteDisabled=!1,this._manuallyFloatingLabel=!1,this._viewportSubscription=x.EMPTY,this._canOpenOnNextFocus=!0,this._closeKeyEventStream=new z,this._windowBlurHandler=function(){h._canOpenOnNextFocus=h._document.activeElement!==h._element.nativeElement||h.panelOpen},this._onChange=function(){},this._onTouched=function(){},this.position="auto",this.autocompleteAttribute="off",this._overlayAttached=!1,this.optionSelections=hk((function(){return h.autocomplete&&h.autocomplete.options?ft.apply(void 0,l(h.autocomplete.options.map((function(t){return t.onSelectionChange})))):h._zone.onStable.pipe(kp(1),ag((function(){return h.optionSelections})))})),this._scrollStrategy=o}return b(t,[{key:"ngAfterViewInit",value:function(){var t=this,e=this._getWindow();void 0!==e&&this._zone.runOutsideAngular((function(){return e.addEventListener("blur",t._windowBlurHandler)}))}},{key:"ngOnChanges",value:function(t){t.position&&this._positionStrategy&&(this._setStrategyPositions(this._positionStrategy),this.panelOpen&&this._overlayRef.updatePosition())}},{key:"ngOnDestroy",value:function(){var t=this._getWindow();void 0!==t&&t.removeEventListener("blur",this._windowBlurHandler),this._viewportSubscription.unsubscribe(),this._componentDestroyed=!0,this._destroyPanel(),this._closeKeyEventStream.complete()}},{key:"openPanel",value:function(){this._attachOverlay(),this._floatLabel()}},{key:"closePanel",value:function(){this._resetLabel(),this._overlayAttached&&(this.panelOpen&&this.autocomplete.closed.emit(),this.autocomplete._isOpen=this._overlayAttached=!1,this._overlayRef&&this._overlayRef.hasAttached()&&(this._overlayRef.detach(),this._closingActionsSubscription.unsubscribe()),this._componentDestroyed||this._changeDetectorRef.detectChanges())}},{key:"updatePosition",value:function(){this._overlayAttached&&this._overlayRef.updatePosition()}},{key:"_getOutsideClickStream",value:function(){var t=this;return ft(Rm(this._document,"click"),Rm(this._document,"touchend")).pipe(_p((function(e){var n=t._isInsideShadowRoot&&e.composedPath?e.composedPath()[0]:e.target,i=t._formField?t._formField._elementRef.nativeElement:null,r=t.connectedTo?t.connectedTo.elementRef.nativeElement:null;return t._overlayAttached&&n!==t._element.nativeElement&&(!i||!i.contains(n))&&(!r||!r.contains(n))&&!!t._overlayRef&&!t._overlayRef.overlayElement.contains(n)})))}},{key:"writeValue",value:function(t){var e=this;Promise.resolve(null).then((function(){return e._setTriggerValue(t)}))}},{key:"registerOnChange",value:function(t){this._onChange=t}},{key:"registerOnTouched",value:function(t){this._onTouched=t}},{key:"setDisabledState",value:function(t){this._element.nativeElement.disabled=t}},{key:"_handleKeydown",value:function(t){var e=t.keyCode;if(e!==Xg||nv(t)||t.preventDefault(),this.activeOption&&e===Qg&&this.panelOpen)this.activeOption._selectViaInteraction(),this._resetActiveItem(),t.preventDefault();else if(this.autocomplete){var n=this.autocomplete._keyManager.activeItem,i=e===tv||e===ev;this.panelOpen||9===e?this.autocomplete._keyManager.onKeydown(t):i&&this._canOpen()&&this.openPanel(),(i||this.autocomplete._keyManager.activeItem!==n)&&this._scrollToOption(this.autocomplete._keyManager.activeItemIndex||0)}}},{key:"_handleInput",value:function(t){var e=t.target,n=e.value;"number"===e.type&&(n=""==n?null:parseFloat(n)),this._previousValue!==n&&(this._previousValue=n,this._onChange(n),this._canOpen()&&this._document.activeElement===t.target&&this.openPanel())}},{key:"_handleFocus",value:function(){this._canOpenOnNextFocus?this._canOpen()&&(this._previousValue=this._element.nativeElement.value,this._attachOverlay(),this._floatLabel(!0)):this._canOpenOnNextFocus=!0}},{key:"_floatLabel",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this._formField&&"auto"===this._formField.floatLabel&&(t?this._formField._animateAndLockLabel():this._formField.floatLabel="always",this._manuallyFloatingLabel=!0)}},{key:"_resetLabel",value:function(){this._manuallyFloatingLabel&&(this._formField.floatLabel="auto",this._manuallyFloatingLabel=!1)}},{key:"_subscribeToClosingActions",value:function(){var t=this;return ft(this._zone.onStable.pipe(kp(1)),this.autocomplete.options.changes.pipe(Rv((function(){return t._positionStrategy.reapplyLastPosition()})),up(0))).pipe(ag((function(){var e=t.panelOpen;return t._resetActiveItem(),t.autocomplete._setVisibility(),t.panelOpen&&(t._overlayRef.updatePosition(),e!==t.panelOpen&&t.autocomplete.opened.emit()),t.panelClosingActions})),kp(1)).subscribe((function(e){return t._setValueAndClose(e)}))}},{key:"_destroyPanel",value:function(){this._overlayRef&&(this.closePanel(),this._overlayRef.dispose(),this._overlayRef=null)}},{key:"_setTriggerValue",value:function(t){var e=this.autocomplete&&this.autocomplete.displayWith?this.autocomplete.displayWith(t):t,n=null!=e?e:"";this._formField?this._formField._control.value=n:this._element.nativeElement.value=n,this._previousValue=n}},{key:"_setValueAndClose",value:function(t){t&&t.source&&(this._clearPreviousSelectedOption(t.source),this._setTriggerValue(t.source.value),this._onChange(t.source.value),this._element.nativeElement.focus(),this.autocomplete._emitSelectEvent(t.source)),this.closePanel()}},{key:"_clearPreviousSelectedOption",value:function(t){this.autocomplete.options.forEach((function(e){e!==t&&e.selected&&e.deselect()}))}},{key:"_attachOverlay",value:function(){var t=this;null==this._isInsideShadowRoot&&(this._isInsideShadowRoot=!!xg(this._element.nativeElement));var e=this._overlayRef;e?(this._positionStrategy.setOrigin(this._getConnectedElement()),e.updateSize({width:this._getPanelWidth()})):(this._portal=new jg(this.autocomplete.template,this._viewContainerRef),e=this._overlay.create(this._getOverlayConfig()),this._overlayRef=e,e.keydownEvents().subscribe((function(e){(e.keyCode===Xg&&!nv(e)||e.keyCode===tv&&nv(e,"altKey"))&&(t._resetActiveItem(),t._closeKeyEventStream.next(),e.stopPropagation(),e.preventDefault())})),this._viewportSubscription=this._viewportRuler.change().subscribe((function(){t.panelOpen&&e&&e.updateSize({width:t._getPanelWidth()})}))),e&&!e.hasAttached()&&(e.attach(this._portal),this._closingActionsSubscription=this._subscribeToClosingActions());var n=this.panelOpen;this.autocomplete._setVisibility(),this.autocomplete._isOpen=this._overlayAttached=!0,this.panelOpen&&n!==this.panelOpen&&this.autocomplete.opened.emit()}},{key:"_getOverlayConfig",value:function(){return new cv({positionStrategy:this._getOverlayPosition(),scrollStrategy:this._scrollStrategy(),width:this._getPanelWidth(),direction:this._dir})}},{key:"_getOverlayPosition",value:function(){var t=this._overlay.position().flexibleConnectedTo(this._getConnectedElement()).withFlexibleDimensions(!1).withPush(!1);return this._setStrategyPositions(t),this._positionStrategy=t,t}},{key:"_setStrategyPositions",value:function(t){var e,n=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],i=this._aboveClass,r=[{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",panelClass:i},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",panelClass:i}];e="above"===this.position?r:"below"===this.position?n:[].concat(n,r),t.withPositions(e)}},{key:"_getConnectedElement",value:function(){return this.connectedTo?this.connectedTo.elementRef:this._formField?this._formField.getConnectedOverlayOrigin():this._element}},{key:"_getPanelWidth",value:function(){return this.autocomplete.panelWidth||this._getHostWidth()}},{key:"_getHostWidth",value:function(){return this._getConnectedElement().nativeElement.getBoundingClientRect().width}},{key:"_resetActiveItem",value:function(){this.autocomplete._keyManager.setActiveItem(this.autocomplete.autoActiveFirstOption?0:-1)}},{key:"_canOpen",value:function(){var t=this._element.nativeElement;return!t.readOnly&&!t.disabled&&!this._autocompleteDisabled}},{key:"_getWindow",value:function(){var t;return(null===(t=this._document)||void 0===t?void 0:t.defaultView)||window}},{key:"_scrollToOption",value:function(t){var e=this.autocomplete,n=uk(t,e.options,e.optionGroups);if(0===t&&1===n)e._setScrollTop(0);else{var i=e.options.toArray()[t];if(i){var r=i._getHostElement(),a=lk(r.offsetTop,r.offsetHeight,e._getScrollTop(),e.panel.nativeElement.offsetHeight);e._setScrollTop(a)}}}},{key:"autocompleteDisabled",get:function(){return this._autocompleteDisabled},set:function(t){this._autocompleteDisabled=Em(t)}},{key:"panelOpen",get:function(){return this._overlayAttached&&this.autocomplete.showPanel}},{key:"panelClosingActions",get:function(){var t=this;return ft(this.optionSelections,this.autocomplete._keyManager.tabOut.pipe(_p((function(){return t._overlayAttached}))),this._closeKeyEventStream,this._getOutsideClickStream(),this._overlayRef?this._overlayRef.detachments().pipe(_p((function(){return t._overlayAttached}))):rp()).pipe(nt((function(t){return t instanceof rk?t:null})))}},{key:"activeOption",get:function(){return this.autocomplete&&this.autocomplete._keyManager?this.autocomplete._keyManager.activeItem:null}}]),t}();return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(Tv),gs(cl),gs(Dc),gs(Lo),gs(GV),gs(Lg,8),gs(rF,9),gs(ud,8),gs(Yg))},t.\u0275dir=ze({type:t,inputs:{position:["matAutocompletePosition","position"],autocompleteAttribute:["autocomplete","autocompleteAttribute"],autocompleteDisabled:["matAutocompleteDisabled","autocompleteDisabled"],autocomplete:["matAutocomplete","autocomplete"],connectedTo:["matAutocompleteConnectedTo","connectedTo"]},features:[fn]}),t}(),QV=function(){var t=function(t){f(n,t);var e=v(n);function n(){var t;return _(this,n),(t=e.apply(this,arguments))._aboveClass="mat-autocomplete-panel-above",t}return n}(JV);return t.\u0275fac=function(e){return XV(e||t)},t.\u0275dir=ze({type:t,selectors:[["input","matAutocomplete",""],["textarea","matAutocomplete",""]],hostAttrs:[1,"mat-autocomplete-trigger"],hostVars:7,hostBindings:function(t,e){1&t&&Ts("focusin",(function(){return e._handleFocus()}))("blur",(function(){return e._onTouched()}))("input",(function(t){return e._handleInput(t)}))("keydown",(function(t){return e._handleKeydown(t)})),2&t&&ds("autocomplete",e.autocompleteAttribute)("role",e.autocompleteDisabled?null:"combobox")("aria-autocomplete",e.autocompleteDisabled?null:"list")("aria-activedescendant",e.panelOpen&&e.activeOption?e.activeOption.id:null)("aria-expanded",e.autocompleteDisabled?null:e.panelOpen.toString())("aria-owns",e.autocompleteDisabled||!e.panelOpen||null==e.autocomplete?null:e.autocomplete.id)("aria-haspopup",!e.autocompleteDisabled)},exportAs:["matAutocompleteTrigger"],features:[Pu([ZV]),Jo]}),t}(),XV=Ki(QV),$V=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[KV],imports:[[Yv,ck,xw,df],Rg,ck,xw]}),t}(),tz=["sliderWrapper"],ez=Sg({passive:!1}),nz={provide:qk,useExisting:Ut((function(){return az})),multi:!0},iz=function t(){_(this,t)},rz=Ew(Lw(Dw((function t(e){_(this,t),this._elementRef=e})),"accent")),az=function(){var t=function(t){f(n,t);var e=v(n);function n(t,i,r,a,o,s,u,l){var c;return _(this,n),(c=e.call(this,t))._focusMonitor=i,c._changeDetectorRef=r,c._dir=a,c._ngZone=s,c._animationMode=l,c._invert=!1,c._max=100,c._min=0,c._step=1,c._thumbLabel=!1,c._tickInterval=0,c._value=null,c._vertical=!1,c.change=new Rl,c.input=new Rl,c.valueChange=new Rl,c.onTouched=function(){},c._percent=0,c._isSliding=!1,c._isActive=!1,c._tickIntervalPercent=0,c._sliderDimensions=null,c._controlValueAccessorChangeFn=function(){},c._dirChangeSubscription=x.EMPTY,c._pointerDown=function(t){c.disabled||c._isSliding||!oz(t)&&0!==t.button||c._ngZone.run((function(){var e=c.value,n=sz(t);c._isSliding=!0,c._lastPointerEvent=t,t.preventDefault(),c._focusHostElement(),c._onMouseenter(),c._bindGlobalEvents(t),c._focusHostElement(),c._updateValueFromPosition(n),c._valueOnSlideStart=e,e!=c.value&&c._emitInputEvent()}))},c._pointerMove=function(t){if(c._isSliding){t.preventDefault();var e=c.value;c._lastPointerEvent=t,c._updateValueFromPosition(sz(t)),e!=c.value&&c._emitInputEvent()}},c._pointerUp=function(t){c._isSliding&&(t.preventDefault(),c._removeGlobalEvents(),c._isSliding=!1,c._valueOnSlideStart==c.value||c.disabled||c._emitChangeEvent(),c._valueOnSlideStart=c._lastPointerEvent=null)},c._windowBlur=function(){c._lastPointerEvent&&c._pointerUp(c._lastPointerEvent)},c._document=u,c.tabIndex=parseInt(o)||0,s.runOutsideAngular((function(){var e=t.nativeElement;e.addEventListener("mousedown",c._pointerDown,ez),e.addEventListener("touchstart",c._pointerDown,ez)})),c}return b(n,[{key:"focus",value:function(t){this._focusHostElement(t)}},{key:"blur",value:function(){this._blurHostElement()}},{key:"_shouldInvertAxis",value:function(){return this.vertical?!this.invert:this.invert}},{key:"_isMinValue",value:function(){return 0===this.percent}},{key:"_getThumbGap",value:function(){return this.disabled?7:this._isMinValue()&&!this.thumbLabel?this._isActive?10:7:0}},{key:"_getTrackBackgroundStyles",value:function(){var t=this.vertical?"Y":"X",e=this.vertical?"1, ".concat(1-this.percent,", 1"):"".concat(1-this.percent,", 1, 1"),n=this._shouldInvertMouseCoords()?"-":"";return{transform:"translate".concat(t,"(").concat(n).concat(this._getThumbGap(),"px) scale3d(").concat(e,")")}}},{key:"_getTrackFillStyles",value:function(){var t=this.percent,e=this.vertical?"Y":"X",n=this.vertical?"1, ".concat(t,", 1"):"".concat(t,", 1, 1"),i=this._shouldInvertMouseCoords()?"":"-";return{transform:"translate".concat(e,"(").concat(i).concat(this._getThumbGap(),"px) scale3d(").concat(n,")"),display:0===t?"none":""}}},{key:"_getTicksContainerStyles",value:function(){var t=this.vertical?"Y":"X",e=this.vertical||"rtl"!=this._getDirection()?"-":"",n=this._tickIntervalPercent/2*100;return{transform:"translate".concat(t,"(").concat(e).concat(n,"%)")}}},{key:"_getTicksStyles",value:function(){var t=100*this._tickIntervalPercent,e=this.vertical?"2px ".concat(t,"%"):"".concat(t,"% 2px"),n=this.vertical?"Y":"X",i=this.vertical||"rtl"!=this._getDirection()?"":"-",r=this.vertical||"rtl"!=this._getDirection()?"":" rotate(180deg)",a={backgroundSize:e,transform:"translateZ(0) translate".concat(n,"(").concat(i).concat(t/2,"%)").concat(r)};if(this._isMinValue()&&this._getThumbGap()){var o=this._shouldInvertAxis();a["padding".concat(this.vertical?o?"Bottom":"Top":o?"Right":"Left")]="".concat(this._getThumbGap(),"px")}return a}},{key:"_getThumbContainerStyles",value:function(){var t=this._shouldInvertAxis(),e=this.vertical?"Y":"X",n=100*(("rtl"!=this._getDirection()||this.vertical?t:!t)?this.percent:1-this.percent);return{transform:"translate".concat(e,"(-").concat(n,"%)")}}},{key:"_shouldInvertMouseCoords",value:function(){var t=this._shouldInvertAxis();return"rtl"!=this._getDirection()||this.vertical?t:!t}},{key:"_getDirection",value:function(){return this._dir&&"rtl"==this._dir.value?"rtl":"ltr"}},{key:"ngAfterViewInit",value:function(){var t=this;this._focusMonitor.monitor(this._elementRef,!0).subscribe((function(e){t._isActive=!!e&&"keyboard"!==e,t._changeDetectorRef.detectChanges()})),this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe((function(){t._changeDetectorRef.markForCheck()})))}},{key:"ngOnDestroy",value:function(){var t=this._elementRef.nativeElement;t.removeEventListener("mousedown",this._pointerDown,ez),t.removeEventListener("touchstart",this._pointerDown,ez),this._lastPointerEvent=null,this._removeGlobalEvents(),this._focusMonitor.stopMonitoring(this._elementRef),this._dirChangeSubscription.unsubscribe()}},{key:"_onMouseenter",value:function(){this.disabled||(this._sliderDimensions=this._getSliderDimensions(),this._updateTickIntervalPercent())}},{key:"_onFocus",value:function(){this._sliderDimensions=this._getSliderDimensions(),this._updateTickIntervalPercent()}},{key:"_onBlur",value:function(){this.onTouched()}},{key:"_onKeydown",value:function(t){if(!this.disabled&&!nv(t)){var e=this.value;switch(t.keyCode){case 33:this._increment(10);break;case 34:this._increment(-10);break;case 35:this.value=this.max;break;case 36:this.value=this.min;break;case 37:this._increment("rtl"==this._getDirection()?1:-1);break;case tv:this._increment(1);break;case 39:this._increment("rtl"==this._getDirection()?-1:1);break;case ev:this._increment(-1);break;default:return}e!=this.value&&(this._emitInputEvent(),this._emitChangeEvent()),this._isSliding=!0,t.preventDefault()}}},{key:"_onKeyup",value:function(){this._isSliding=!1}},{key:"_getWindow",value:function(){return this._document.defaultView||window}},{key:"_bindGlobalEvents",value:function(t){var e=this._document,n=oz(t),i=n?"touchend":"mouseup";e.addEventListener(n?"touchmove":"mousemove",this._pointerMove,ez),e.addEventListener(i,this._pointerUp,ez),n&&e.addEventListener("touchcancel",this._pointerUp,ez);var r=this._getWindow();void 0!==r&&r&&r.addEventListener("blur",this._windowBlur)}},{key:"_removeGlobalEvents",value:function(){var t=this._document;t.removeEventListener("mousemove",this._pointerMove,ez),t.removeEventListener("mouseup",this._pointerUp,ez),t.removeEventListener("touchmove",this._pointerMove,ez),t.removeEventListener("touchend",this._pointerUp,ez),t.removeEventListener("touchcancel",this._pointerUp,ez);var e=this._getWindow();void 0!==e&&e&&e.removeEventListener("blur",this._windowBlur)}},{key:"_increment",value:function(t){this.value=this._clamp((this.value||0)+this.step*t,this.min,this.max)}},{key:"_updateValueFromPosition",value:function(t){if(this._sliderDimensions){var e=this._clamp(((this.vertical?t.y:t.x)-(this.vertical?this._sliderDimensions.top:this._sliderDimensions.left))/(this.vertical?this._sliderDimensions.height:this._sliderDimensions.width));if(this._shouldInvertMouseCoords()&&(e=1-e),0===e)this.value=this.min;else if(1===e)this.value=this.max;else{var n=this._calculateValue(e),i=Math.round((n-this.min)/this.step)*this.step+this.min;this.value=this._clamp(i,this.min,this.max)}}}},{key:"_emitChangeEvent",value:function(){this._controlValueAccessorChangeFn(this.value),this.valueChange.emit(this.value),this.change.emit(this._createChangeEvent())}},{key:"_emitInputEvent",value:function(){this.input.emit(this._createChangeEvent())}},{key:"_updateTickIntervalPercent",value:function(){if(this.tickInterval&&this._sliderDimensions)if("auto"==this.tickInterval){var t=this.vertical?this._sliderDimensions.height:this._sliderDimensions.width,e=Math.ceil(30/(t*this.step/(this.max-this.min)));this._tickIntervalPercent=e*this.step/t}else this._tickIntervalPercent=this.tickInterval*this.step/(this.max-this.min)}},{key:"_createChangeEvent",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.value,e=new iz;return e.source=this,e.value=t,e}},{key:"_calculatePercentage",value:function(t){return((t||0)-this.min)/(this.max-this.min)}},{key:"_calculateValue",value:function(t){return this.min+t*(this.max-this.min)}},{key:"_clamp",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return Math.max(e,Math.min(t,n))}},{key:"_getSliderDimensions",value:function(){return this._sliderWrapper?this._sliderWrapper.nativeElement.getBoundingClientRect():null}},{key:"_focusHostElement",value:function(t){this._elementRef.nativeElement.focus(t)}},{key:"_blurHostElement",value:function(){this._elementRef.nativeElement.blur()}},{key:"writeValue",value:function(t){this.value=t}},{key:"registerOnChange",value:function(t){this._controlValueAccessorChangeFn=t}},{key:"registerOnTouched",value:function(t){this.onTouched=t}},{key:"setDisabledState",value:function(t){this.disabled=t}},{key:"invert",get:function(){return this._invert},set:function(t){this._invert=Em(t)}},{key:"max",get:function(){return this._max},set:function(t){this._max=Om(t,this._max),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()}},{key:"min",get:function(){return this._min},set:function(t){this._min=Om(t,this._min),null===this._value&&(this.value=this._min),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()}},{key:"step",get:function(){return this._step},set:function(t){this._step=Om(t,this._step),this._step%1!=0&&(this._roundToDecimal=this._step.toString().split(".").pop().length),this._changeDetectorRef.markForCheck()}},{key:"thumbLabel",get:function(){return this._thumbLabel},set:function(t){this._thumbLabel=Em(t)}},{key:"tickInterval",get:function(){return this._tickInterval},set:function(t){this._tickInterval="auto"===t?"auto":"number"==typeof t||"string"==typeof t?Om(t,this._tickInterval):0}},{key:"value",get:function(){return null===this._value&&(this.value=this._min),this._value},set:function(t){if(t!==this._value){var e=Om(t);this._roundToDecimal&&(e=parseFloat(e.toFixed(this._roundToDecimal))),this._value=e,this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()}}},{key:"vertical",get:function(){return this._vertical},set:function(t){this._vertical=Em(t)}},{key:"displayValue",get:function(){return this.displayWith?this.displayWith(this.value):this._roundToDecimal&&this.value&&this.value%1!=0?this.value.toFixed(this._roundToDecimal):this.value||0}},{key:"percent",get:function(){return this._clamp(this._percent)}}]),n}(rz);return t.\u0275fac=function(e){return new(e||t)(gs(Hu),gs(m_),gs(Lo),gs(Lg,8),vs("tabindex"),gs(Dc),gs(ud),gs(gw,8))},t.\u0275cmp=Fe({type:t,selectors:[["mat-slider"]],viewQuery:function(t,e){var n;1&t&&Zl(tz,!0),2&t&&Gl(n=tc())&&(e._sliderWrapper=n.first)},hostAttrs:["role","slider",1,"mat-slider","mat-focus-indicator"],hostVars:28,hostBindings:function(t,e){1&t&&Ts("focus",(function(){return e._onFocus()}))("blur",(function(){return e._onBlur()}))("keydown",(function(t){return e._onKeydown(t)}))("keyup",(function(){return e._onKeyup()}))("mouseenter",(function(){return e._onMouseenter()}))("selectstart",(function(t){return t.preventDefault()})),2&t&&(mu("tabIndex",e.tabIndex),ds("aria-disabled",e.disabled)("aria-valuemax",e.max)("aria-valuemin",e.min)("aria-valuenow",e.value)("aria-orientation",e.vertical?"vertical":"horizontal"),Js("mat-slider-disabled",e.disabled)("mat-slider-has-ticks",e.tickInterval)("mat-slider-horizontal",!e.vertical)("mat-slider-axis-inverted",e._shouldInvertAxis())("mat-slider-invert-mouse-coords",e._shouldInvertMouseCoords())("mat-slider-sliding",e._isSliding)("mat-slider-thumb-label-showing",e.thumbLabel)("mat-slider-vertical",e.vertical)("mat-slider-min-value",e._isMinValue())("mat-slider-hide-last-tick",e.disabled||e._isMinValue()&&e._getThumbGap()&&e._shouldInvertAxis())("_mat-animation-noopable","NoopAnimations"===e._animationMode))},inputs:{disabled:"disabled",color:"color",tabIndex:"tabIndex",invert:"invert",max:"max",min:"min",value:"value",step:"step",thumbLabel:"thumbLabel",tickInterval:"tickInterval",vertical:"vertical",displayWith:"displayWith"},outputs:{change:"change",input:"input",valueChange:"valueChange"},exportAs:["matSlider"],features:[Pu([nz]),Jo],decls:29,vars:6,consts:[[1,"mat-slider-wrapper"],["sliderWrapper",""],[1,"mat-slider-track-wrapper"],[1,"mat-slider-track-background",3,"ngStyle"],[1,"mat-slider-track-fill",3,"ngStyle"],[1,"mat-slider-ticks-container",3,"ngStyle"],[1,"mat-slider-ticks",3,"ngStyle"],[1,"mat-slider-thumb-container",3,"ngStyle"],[1,"mat-slider-focus-ring"],[1,"mat-slider-thumb"],[1,"mat-slider-thumb-label"],[1,"mat-slider-thumb-label-text"]],template:function(t,e){1&t&&(bs(0,"div",0,1),uu(2,"\n "),bs(3,"div",2),uu(4,"\n "),ks(5,"div",3),uu(6,"\n "),ks(7,"div",4),uu(8,"\n "),ws(),uu(9,"\n "),bs(10,"div",5),uu(11,"\n "),ks(12,"div",6),uu(13,"\n "),ws(),uu(14,"\n "),bs(15,"div",7),uu(16,"\n "),ks(17,"div",8),uu(18,"\n "),ks(19,"div",9),uu(20,"\n "),bs(21,"div",10),uu(22,"\n "),bs(23,"span",11),uu(24),ws(),uu(25,"\n "),ws(),uu(26,"\n "),ws(),uu(27,"\n"),ws(),uu(28,"\n")),2&t&&(na(5),_s("ngStyle",e._getTrackBackgroundStyles()),na(2),_s("ngStyle",e._getTrackFillStyles()),na(3),_s("ngStyle",e._getTicksContainerStyles()),na(2),_s("ngStyle",e._getTicksStyles()),na(3),_s("ngStyle",e._getThumbContainerStyles()),na(9),lu(e.displayValue))},directives:[Bh],styles:['.mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:none;vertical-align:middle}.mat-slider:not(.mat-slider-disabled):active,.mat-slider.mat-slider-sliding:not(.mat-slider-disabled){cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-wrapper{position:absolute}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{background-repeat:repeat;background-clip:content-box;box-sizing:border-box;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider.cdk-keyboard-focused .mat-slider-focus-ring,.mat-slider.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb{cursor:-webkit-grab;cursor:grab}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(0.7);transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-radius 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.cdk-high-contrast-active .mat-slider-thumb-label{outline:solid 1px}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-sliding .mat-slider-track-fill,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-thumb-container{transition-duration:0ms}.mat-slider-has-ticks .mat-slider-wrapper::after{content:"";position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{display:none}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(0.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.cdk-high-contrast-active .mat-slider-horizontal .mat-slider-ticks-container{height:0;outline:solid 2px;top:1px}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(0.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label,.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label-text{transform:none}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.cdk-high-contrast-active .mat-slider-vertical .mat-slider-ticks-container{width:0;outline:solid 2px;left:1px}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(0.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}.mat-slider._mat-animation-noopable .mat-slider-track-fill,.mat-slider._mat-animation-noopable .mat-slider-track-background,.mat-slider._mat-animation-noopable .mat-slider-ticks,.mat-slider._mat-animation-noopable .mat-slider-thumb-container,.mat-slider._mat-animation-noopable .mat-slider-focus-ring,.mat-slider._mat-animation-noopable .mat-slider-thumb,.mat-slider._mat-animation-noopable .mat-slider-thumb-label,.mat-slider._mat-animation-noopable .mat-slider-thumb-label-text,.mat-slider._mat-animation-noopable .mat-slider-has-ticks .mat-slider-wrapper::after{transition:none}\n'],encapsulation:2,changeDetection:0}),t}();function oz(t){return"t"===t.type[0]}function sz(t){var e=oz(t)?t.touches[0]||t.changedTouches[0]:t;return{x:e.clientX,y:e.clientY}}var uz=function(){var t=function t(){_(this,t)};return t.\u0275mod=We({type:t}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},imports:[[df,xw],xw]}),t}(),lz=function(){function t(t,e){this.walletsAndAddressesService=t,this.router=e}return t.prototype.canActivate=function(t,e){var n=this;return new Promise((function(t){n.walletsAndAddressesService.allWallets.pipe(Ap()).subscribe((function(e){return 0===e.length?(n.router.navigate(["/wizard"]),t(!1)):t(!0)}))}))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(hD),ve(HT))}}),t}(),cz=["formControl"];function dz(t,e){if(1&t){var n=xs();bs(0,"div",12),uu(1,"\n "),bs(2,"span",13),Ts("click",(function(){return Bn(n),Ys().useHardwareWallet()})),uu(3),Tl(4,"translate"),ws(),uu(5,"\n "),ws()}2&t&&(na(3),lu(El(4,1,"wizard.hardware-wallet-link")))}var hz=function(t){return{coinName:t}},fz=function(){function t(t,e,n,i,r){var a=this;this.appService=t,this.dialog=e,this.router=n,this.fill=null,this.onLabelAndSeedCreated=new Rl,this.showNewForm=!0,this.doubleButtonActive=YP.LeftButton,this.hwCompatibilityActivated=!1,this.synchronized=!0,this.hwCompatibilityActivated=i.hwWalletCompatibilityActivated,this.blockchainSubscription=r.progress.subscribe((function(t){return a.synchronized=t.synchronized}))}return t.prototype.ngOnInit=function(){var t=this;setTimeout((function(){t.formControl.initForm(null,t.fill)})),this.fill&&(this.doubleButtonActive=this.fill.creatingNewWallet?YP.LeftButton:YP.RightButton,this.showNewForm=this.fill.creatingNewWallet)},t.prototype.ngOnDestroy=function(){this.blockchainSubscription.unsubscribe()},t.prototype.changeForm=function(t){this.showNewForm=t!==YP.RightButton,this.doubleButtonActive=t,this.fill=null,this.formControl.initForm(this.showNewForm,this.fill)},t.prototype.createWallet=function(){var t=this;AE.openDialog(this.dialog,{headerText:"wizard.confirm.title",redTitle:!0,text:"wizard.confirm.desc",checkboxText:"wizard.confirm.checkbox",confirmButtonText:"common.continue-button"}).afterClosed().subscribe((function(e){e&&t.emitCreatedData()}))},t.prototype.loadWallet=function(){var t=this;this.synchronized?this.emitCreatedData():AE.openDialog(this.dialog,{headerText:"common.warning-title",text:"wallet.new.synchronizing-warning-text",defaultButtons:OE.ContinueCancel,redTitle:!0}).afterClosed().subscribe((function(e){e&&t.emitCreatedData()}))},t.prototype.useHardwareWallet=function(){var t=this;eP.openDialog(this.dialog,!0).afterClosed().subscribe((function(e){e&&t.router.navigate(["/wallets"])}))},t.prototype.emitCreatedData=function(){this.onLabelAndSeedCreated.emit(this.formControl.getData())},t.\u0275fac=function(e){return new(e||t)(gs(Sm),gs(Dk),gs(HT),gs(jk),gs(SO))},t.\u0275cmp=Fe({type:t,selectors:[["app-onboarding-create-wallet"]],viewQuery:function(t,e){var n;1&t&&Zl(cz,!0),2&t&&Gl(n=tc())&&(e.formControl=n.first)},inputs:{fill:"fill"},outputs:{onLabelAndSeedCreated:"onLabelAndSeedCreated"},decls:51,vars:23,consts:[[1,"onboarding-container"],[1,"row"],[1,"row-container"],[1,"-header"],[1,"-description"],[1,"row-container","-toggle-container"],[3,"leftButtonText","rightButtonText","activeButton","onStateChange"],[3,"create","onboarding"],["formControl",""],["class","row justify-content-center",4,"ngIf"],[1,"row","-buttons-footer"],[1,"dark-button","-button-min-margin",3,"disabled","action"],[1,"row","justify-content-center"],[1,"hw-link",3,"click"]],template:function(t,e){if(1&t&&(bs(0,"div",0),uu(1,"\n "),bs(2,"div",1),uu(3,"\n "),bs(4,"div",2),uu(5,"\n "),bs(6,"div",3),uu(7,"\n "),bs(8,"span"),uu(9),Tl(10,"translate"),ws(),uu(11,"\n "),ws(),uu(12,"\n "),bs(13,"div",4),uu(14,"\n "),bs(15,"p"),uu(16),Tl(17,"translate"),ws(),uu(18,"\n "),ws(),uu(19,"\n "),ws(),uu(20,"\n "),ws(),uu(21,"\n "),bs(22,"div",1),uu(23,"\n "),bs(24,"div",5),uu(25,"\n "),bs(26,"app-double-button",6),Ts("onStateChange",(function(t){return e.changeForm(t)})),Tl(27,"translate"),Tl(28,"translate"),ws(),uu(29,"\n "),ws(),uu(30,"\n "),ws(),uu(31,"\n "),bs(32,"div",1),uu(33,"\n "),bs(34,"div",2),uu(35,"\n "),ks(36,"app-create-wallet-form",7,8),uu(38,"\n "),ws(),uu(39,"\n "),ws(),uu(40,"\n "),ps(41,dz,6,3,"div",9),uu(42,"\n "),bs(43,"div",10),uu(44,"\n "),bs(45,"app-button",11),Ts("action",(function(){return e.showNewForm?e.createWallet():e.loadWallet()})),uu(46),Tl(47,"translate"),ws(),uu(48,"\n "),ws(),uu(49,"\n"),ws(),uu(50,"\n")),2&t){var n=ms(37);na(9),lu(El(10,10,"wizard.create-title")),na(7),lu(Ol(17,12,"wizard.create-desc",kl(21,hz,e.appService.fullCoinName))),na(10),_s("leftButtonText",El(27,15,"wizard.new-button"))("rightButtonText",El(28,17,"wizard.load-button"))("activeButton",e.doubleButtonActive),na(10),_s("create",e.showNewForm)("onboarding",!0),na(5),_s("ngIf",e.hwCompatibilityActivated),na(4),_s("disabled",!n.isValid),na(1),cu("\n ",El(47,19,"common.create-button"),"\n ")}},directives:[RP,kO,Eh,Cx],pipes:[pC],styles:[".-toggle-container[_ngcontent-%COMP%]{margin:10px auto}.hw-link[_ngcontent-%COMP%]{cursor:pointer;color:#fafafa;font-size:13px;margin-bottom:20px}"]}),t}(),pz=["button"],mz=function(t){return{"element-disabled":t}},gz=function(t){return{"d-none":t}},vz=function(){function t(t){this.formBuilder=t,this.onPasswordCreated=new Rl,this.onBack=new Rl,this.password1ErrorMsg="",this.password2ErrorMsg=""}return t.prototype.ngOnInit=function(){this.initEncryptForm()},t.prototype.initEncryptForm=function(){this.form=this.formBuilder.group({password:new $M(""),confirm:new $M("")}),this.form.setValidators(this.validateForm.bind(this))},t.prototype.setEncrypt=function(t){t.checked?this.form.enable():this.form.disable()},t.prototype.emitCreatedPassword=function(){this.form.enabled&&!this.form.valid||this.button.isLoading()||(this.button.setLoading(),this.onPasswordCreated.emit(this.form.enabled?this.form.get("password").value:null))},t.prototype.emitBack=function(){this.onBack.emit()},t.prototype.resetButton=function(){this.button.resetState()},Object.defineProperty(t.prototype,"isWorking",{get:function(){return!!this.button&&this.button.isLoading()},enumerable:!1,configurable:!0}),t.prototype.validateForm=function(){this.password1ErrorMsg="",this.password2ErrorMsg="";var t=!0;return this.form.get("password").value||(t=!1,this.form.get("password").touched&&(this.password1ErrorMsg="password.password-error-info")),this.form.get("confirm").value||(t=!1,this.form.get("confirm").touched&&(this.password2ErrorMsg="password.password-error-info")),t&&this.form.get("password").value!==this.form.get("confirm").value&&(t=!1,this.password2ErrorMsg="password.confirm-error-info"),t?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(gs(YS))},t.\u0275cmp=Fe({type:t,selectors:[["app-onboarding-encrypt-wallet"]],viewQuery:function(t,e){var n;1&t&&Zl(pz,!0),2&t&&Gl(n=tc())&&(e.button=n.first)},outputs:{onPasswordCreated:"onPasswordCreated",onBack:"onBack"},decls:77,vars:40,consts:[[1,"onboarding-container"],[1,"row"],[1,"row-container"],[1,"-header"],[1,"-description"],[1,"row-container","-check-container"],["type","checkbox","id","encrypt",1,"-check",3,"checked","ngClass","change"],[1,"img-label-container"],["src","assets/img/lock-gold.png"],[3,"formGroup"],[1,"form-field"],["for","password"],["type","password","formControlName","password","id","password",1,"-input",3,"ngClass","appFormFieldError","blur"],["for","confirm"],["type","password","formControlName","confirm","id","confirm",1,"-input",3,"ngClass","appFormFieldError","keydown.enter","blur"],[1,"row","-buttons-footer"],[1,"dark-button","-button-min-margin",3,"disabled","action"],["button",""],[1,"ghost-button","-button-min-margin",3,"ngClass","action"]],template:function(t,e){1&t&&(bs(0,"div",0),uu(1,"\n "),bs(2,"div",1),uu(3,"\n "),bs(4,"div",2),uu(5,"\n "),bs(6,"div",3),uu(7,"\n "),bs(8,"span"),uu(9),Tl(10,"translate"),ws(),uu(11,"\n "),ws(),uu(12,"\n "),bs(13,"div",4),uu(14,"\n "),bs(15,"p"),uu(16),Tl(17,"translate"),ws(),uu(18,"\n "),ws(),uu(19,"\n "),ws(),uu(20,"\n "),ws(),uu(21,"\n "),bs(22,"div",1),uu(23,"\n "),bs(24,"div",5),uu(25,"\n "),bs(26,"mat-checkbox",6),Ts("change",(function(t){return e.setEncrypt(t)})),uu(27,"\n "),bs(28,"span",7),uu(29,"\n "),ks(30,"img",8),uu(31),Tl(32,"translate"),ws(),uu(33,"\n "),ws(),uu(34,"\n "),ws(),uu(35,"\n "),ws(),uu(36,"\n "),bs(37,"div",1),uu(38,"\n "),bs(39,"div",2),uu(40,"\n "),bs(41,"form",9),uu(42,"\n "),bs(43,"div",10),uu(44,"\n "),bs(45,"label",11),uu(46),Tl(47,"translate"),ws(),uu(48,"\n "),bs(49,"input",12),Ts("blur",(function(){return e.validateForm()})),ws(),uu(50,"\n "),ws(),uu(51,"\n "),bs(52,"div",10),uu(53,"\n "),bs(54,"label",13),uu(55),Tl(56,"translate"),ws(),uu(57,"\n "),bs(58,"input",14),Ts("keydown.enter",(function(){return e.emitCreatedPassword()}))("blur",(function(){return e.validateForm()})),ws(),uu(59,"\n "),ws(),uu(60,"\n "),ws(),uu(61,"\n "),ws(),uu(62,"\n "),ws(),uu(63,"\n "),bs(64,"div",15),uu(65,"\n "),bs(66,"app-button",16,17),Ts("action",(function(){return e.emitCreatedPassword()})),uu(68),Tl(69,"translate"),ws(),uu(70,"\n "),bs(71,"app-button",18),Ts("action",(function(){return e.emitBack()})),uu(72),Tl(73,"translate"),ws(),uu(74,"\n "),ws(),uu(75,"\n"),ws(),uu(76,"\n")),2&t&&(na(9),lu(El(10,18,"wizard.encrypt-title")),na(7),lu(El(17,20,"wizard.encrypt-desc")),na(10),_s("checked",!0)("ngClass",kl(32,mz,e.isWorking)),na(5),cu("\n ",El(32,22,"wallet.new.encrypt-check"),"\n "),na(10),_s("formGroup",e.form),na(5),lu(El(47,24,"password.password-label")),na(3),_s("ngClass",kl(34,mz,e.form.disabled))("appFormFieldError",e.password1ErrorMsg),ds("disabled",e.isWorking?"true":null),na(6),lu(El(56,26,"password.confirm-password-label")),na(3),_s("ngClass",kl(36,mz,e.form.disabled))("appFormFieldError",e.password2ErrorMsg),ds("disabled",e.isWorking?"true":null),na(8),_s("disabled",e.form.enabled&&!e.form.valid),na(2),cu("\n ",El(69,28,"wizard.finish-button"),"\n "),na(3),_s("ngClass",kl(38,gz,e.isWorking)),na(1),cu("\n ",El(73,30,"common.back-button"),"\n "))},directives:[wE,Ch,sS,rM,hS,Qk,iM,yS,KE,Cx],pipes:[pC],styles:[".-check-container[_ngcontent-%COMP%]{margin:10px auto}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{stroke:#fafafa!important}"]}),t}(),_z=["encryptForm"];function yz(t,e){if(1&t){var n=xs();bs(0,"button",3),Ts("click",(function(){return Bn(n),Ys().changelanguage()})),uu(1,"\n "),ks(2,"img",4),uu(3,"\n"),ws()}if(2&t){var i=Ys();na(2),_s("src","assets/img/lang/"+i.language.iconName,Rr)}}function bz(t,e){if(1&t){var n=xs();bs(0,"app-onboarding-create-wallet",5),Ts("onLabelAndSeedCreated",(function(t){return Bn(n),Ys().onLabelAndSeedCreated(t)})),ws()}2&t&&_s("fill",Ys().fill)}function wz(t,e){if(1&t){var n=xs();bs(0,"app-onboarding-encrypt-wallet",6,7),Ts("onPasswordCreated",(function(t){return Bn(n),Ys().onPasswordCreated(t)}))("onBack",(function(){return Bn(n),Ys().onBack()})),ws()}}var kz=function(){function t(t,e,n,i,r){this.router=t,this.languageService=e,this.dialog=n,this.msgBarService=i,this.walletsAndAddressesService=r,this.step=1}return t.prototype.ngOnInit=function(){var t=this;this.subscription=this.languageService.currentLanguage.subscribe((function(e){return t.language=e}))},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.onLabelAndSeedCreated=function(t){this.formData=t,this.step=2},t.prototype.onPasswordCreated=function(t){this.password=t,this.createWallet()},t.prototype.onBack=function(){this.step=1},t.prototype.changelanguage=function(){nD.openDialog(this.dialog)},Object.defineProperty(t.prototype,"fill",{get:function(){return this.formData},enumerable:!1,configurable:!0}),t.prototype.createWallet=function(){var t=this;this.walletsAndAddressesService.createSoftwareWallet(this.formData.label,this.formData.seed,this.password).subscribe((function(){t.router.navigate(["/wallets"])}),(function(e){t.msgBarService.showError(e),t.encryptForm.resetButton()}))},t.\u0275fac=function(e){return new(e||t)(gs(HT),gs(Hx),gs(Dk),gs(Gx),gs(hD))},t.\u0275cmp=Fe({type:t,selectors:[["app-onboarding"]],viewQuery:function(t,e){var n;1&t&&Zl(_z,!0),2&t&&Gl(n=tc())&&(e.encryptForm=n.first)},decls:6,vars:3,consts:[["mat-icon-button","",3,"click",4,"ngIf"],[3,"fill","onLabelAndSeedCreated",4,"ngIf"],[3,"onPasswordCreated","onBack",4,"ngIf"],["mat-icon-button","",3,"click"],[1,"flag",3,"src"],[3,"fill","onLabelAndSeedCreated"],[3,"onPasswordCreated","onBack"],["encryptForm",""]],template:function(t,e){1&t&&(ps(0,yz,4,1,"button",0),uu(1,"\n\n"),ps(2,bz,1,1,"app-onboarding-create-wallet",1),uu(3,"\n\n"),ps(4,wz,2,0,"app-onboarding-encrypt-wallet",2),uu(5,"\n")),2&t&&(_s("ngIf",e.language),na(2),_s("ngIf",1===e.step),na(2),_s("ngIf",2===e.step))},directives:[Eh,XC,fz,vz],styles:["button[_ngcontent-%COMP%]{position:fixed;right:30px;top:20px;background-color:#fafafa!important}button[_ngcontent-%COMP%]:hover{background-color:#f7f7f7!important}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:-3px}"]}),t}(),Mz=function(){function t(){}return t.prototype.getTranslation=function(t){return ot(n("5ey7")("./"+t+".json"))},t}(),Sz=["resetButton"],Cz=function(t){return{"element-disabled":t}},xz=function(){function t(t,e,n,i,r,a,o){var s=this;this.formBuilder=t,this.route=e,this.router=n,this.msgBarService=i,this.softwareWalletService=r,this.walletsAndAddressesService=a,this.changeDetector=o,this.busy=!0,this.seedErrorMsg="",this.passwordErrorMsg="",this.done=!1,this.hideBarWhenClosing=!0,this.initForm(),this.subscription=pD([this.route.params,this.walletsAndAddressesService.allWallets]).pipe(nt((function(t){var e=t[0],n=t[1].find((function(t){return t.id===e.id}));n?(s.wallet=n,s.form.get("wallet").setValue(n.label),s.busy=!1):setTimeout((function(){return s.router.navigate([""],{skipLocationChange:!0})}))}))).subscribe()}return t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe(),this.hideBarWhenClosing&&this.msgBarService.hide()},t.prototype.initForm=function(){this.form=new tS({}),this.form.addControl("wallet",new $M),this.form.addControl("seed",new $M("")),this.form.addControl("password",new $M("")),this.form.addControl("confirm",new $M("")),this.form.setValidators(this.validateForm.bind(this))},t.prototype.reset=function(){var t=this;!this.form.valid||this.busy||this.done||(this.busy=!0,this.msgBarService.hide(),this.resetButton.setLoading(),this.softwareWalletService.resetPassword(this.wallet,this.form.value.seed,""!==this.form.value.password?this.form.value.password:null).subscribe((function(){t.resetButton.setSuccess(),t.resetButton.setDisabled(),t.done=!0,t.msgBarService.showDone("reset.done"),t.hideBarWhenClosing=!1,setTimeout((function(){t.router.navigate([""])}),2e3)}),(function(e){t.busy=!1,t.resetButton.resetState(),t.msgBarService.showError(e)})),this.changeDetector.detectChanges())},t.prototype.validateForm=function(){this.seedErrorMsg="",this.passwordErrorMsg="";var t=!0;return this.form.get("seed").value||(t=!1,this.form.get("seed").touched&&(this.seedErrorMsg="reset.seed-error-info")),this.form.get("password").value!==this.form.get("confirm").value&&(t=!1,this.form.get("confirm").touched&&(this.passwordErrorMsg="reset.confirm-error-info")),t?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(gs(YS),gs(yL),gs(HT),gs(Gx),gs(RO),gs(hD),gs(Lo))},t.\u0275cmp=Fe({type:t,selectors:[["app-reset-password"]],viewQuery:function(t,e){var n;1&t&&Zl(Sz,!0),2&t&&Gl(n=tc())&&(e.resetButton=n.first)},decls:59,vars:28,consts:[[3,"headline"],[1,"container"],[1,"paper"],[3,"formGroup"],[1,"form-field"],["for","wallet"],[1,"-not-allowed"],["formControlName","wallet","id","wallet","readonly","",3,"ngClass"],["for","seed"],["formControlName","seed","id","seed","row","2",3,"appFormFieldError","blur"],["for","password"],["formControlName","password","id","password","type","password","appDontSavePassword",""],["for","confirm"],["formControlName","confirm","id","confirm","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],[1,"text-center"],[1,"primary-button",3,"disabled","action"],["resetButton",""]],template:function(t,e){1&t&&(ks(0,"app-header",0),Tl(1,"translate"),uu(2,"\n"),bs(3,"div",1),uu(4,"\n "),bs(5,"div",2),uu(6,"\n "),bs(7,"div",3),uu(8,"\n "),uu(9,"\n "),bs(10,"div",4),uu(11,"\n "),bs(12,"label",5),uu(13),Tl(14,"translate"),ws(),uu(15,"\n "),bs(16,"div",6),ks(17,"input",7),ws(),uu(18,"\n "),ws(),uu(19,"\n "),bs(20,"div",4),uu(21,"\n "),bs(22,"label",8),uu(23),Tl(24,"translate"),ws(),uu(25,"\n "),bs(26,"textarea",9),Ts("blur",(function(){return e.validateForm()})),ws(),uu(27,"\n "),ws(),uu(28,"\n "),bs(29,"div",4),uu(30,"\n "),bs(31,"label",10),uu(32),Tl(33,"translate"),ws(),uu(34,"\n "),ks(35,"input",11),uu(36,"\n "),ws(),uu(37,"\n "),bs(38,"div",4),uu(39,"\n "),bs(40,"label",12),uu(41),Tl(42,"translate"),ws(),uu(43,"\n "),bs(44,"input",13),Ts("keydown.enter",(function(){return e.reset()}))("blur",(function(){return e.validateForm()})),ws(),uu(45,"\n "),ws(),uu(46,"\n "),uu(47,"\n "),bs(48,"div",14),uu(49,"\n "),bs(50,"app-button",15,16),Ts("action",(function(){return e.reset()})),uu(52),Tl(53,"translate"),ws(),uu(54,"\n "),ws(),uu(55,"\n "),ws(),uu(56,"\n "),ws(),uu(57,"\n"),ws(),uu(58,"\n")),2&t&&(_s("headline",El(1,14,"reset.title")),na(7),_s("formGroup",e.form),na(6),lu(El(14,16,"reset.wallet-label")),na(4),_s("ngClass",kl(26,Cz,e.busy)),na(6),lu(El(24,18,"reset.seed-label")),na(3),_s("appFormFieldError",e.seedErrorMsg),ds("disabled",e.busy?"true":null),na(6),lu(El(33,20,"reset.password-label")),na(3),ds("disabled",e.busy?"true":null),na(6),lu(El(42,22,"reset.confirm-label")),na(3),_s("appFormFieldError",e.passwordErrorMsg),ds("disabled",e.busy?"true":null),na(6),_s("disabled",!e.form.valid),na(2),cu("\n ",El(53,24,"reset.reset-button"),"\n "))},directives:[mI,rM,hS,Qk,iM,yS,Ch,KE,ZE,Cx],pipes:[pC],styles:[""]}),t}(),Dz=function(){function t(t,e,n){var i=this;this.http=t,this.storageService=e,this.apiService=n,this.API_ENDPOINT="https://swaplab.cc/api/v3",this.STORAGE_KEY="exchange-orders",this.LAST_VIEWED_STORAGE_KEY="last-viewed-order",this.API_KEY=rd,this.TEST_MODE=false,this.lastViewedOrderLoaded=new Cm(!1),e.get(Yx.CLIENT,this.LAST_VIEWED_STORAGE_KEY).subscribe((function(t){i.lastViewedOrder=JSON.parse(t.data),i.lastViewedOrderLoaded.next(!0)}),(function(){i.lastViewedOrderLoaded.next(!0)}))}return Object.defineProperty(t.prototype,"lastViewedOrder",{get:function(){return this._lastViewedOrder},set:function(t){this._lastViewedOrder=t,this.saveLastViewedSubscription&&this.saveLastViewedSubscription.unsubscribe(),this.saveLastViewedSubscription=this.storageService.store(Yx.CLIENT,this.LAST_VIEWED_STORAGE_KEY,JSON.stringify(t)).subscribe()},enumerable:!1,configurable:!0}),t.prototype.tradingPairs=function(){return this.post("trading_pairs").pipe(nt((function(t){return t.result})))},t.prototype.exchange=function(t,e,n,i){var r,a=this;return this.post("orders",{pair:t,fromAmount:e,toAddress:n}).pipe(st((function(t){return a.storeOrder(r=t.result,i)})),nt((function(){return r})))},t.prototype.status=function(t,e){return this.TEST_MODE&&!e&&(e="user_waiting"),this.post("orders/status",{id:t},this.TEST_MODE?{status:e}:null).pipe(Kf((function(t){return t.pipe(st((function(t){return t instanceof Zp&&404===t.status?ap(t):rp(t)})),up(3e3))})),nt((function(t){return t.result})))},t.prototype.history=function(){return this.storageService.get(Yx.CLIENT,this.STORAGE_KEY).pipe(nt((function(t){return JSON.parse(t.data)})))},t.prototype.isOrderFinished=function(t){return["complete","error","user_deposit_timeout"].indexOf(t.status)>-1},t.prototype.post=function(t,e,n){var i=this;return this.http.post(this.buildUrl(t),e,{responseType:"json",headers:new Rp(Vk({"api-key":this.API_KEY,Accept:"application/json"},n))}).pipe(pp((function(t){return i.processConnectionError(t)})))},t.prototype.buildUrl=function(t){return this.TEST_MODE&&"trading_pairs"!==t?this.API_ENDPOINT+"sandbox/"+t:this.API_ENDPOINT+"/"+t},t.prototype.storeOrder=function(t,e){var n=this;return this.history().pipe(pp((function(t){try{if(t.status&&404===t.status)return rp([])}catch(e){}return ap(t)})),st((function(i){return n.storeOrderEntry(i,t,e)})))},t.prototype.storeOrderEntry=function(t,e,n){var i={id:e.id,pair:e.pair,fromAmount:e.fromAmount,toAmount:e.toAmount,address:e.toAddress,timestamp:PI().unix(),price:n};t.push(i);var r=JSON.stringify(t);return t.pop(),this.storageService.store(Yx.CLIENT,this.STORAGE_KEY,r).pipe(Rv((function(){return t.push(i)})))},t.prototype.processConnectionError=function(t){return ap(gm(t))},t.\u0275prov=At({token:t,factory:t.\u0275fac=function(e){return new(e||t)(ve(Qp),ve(Rx),ve(ym))}}),t}();function Lz(t,e){if(1&t){var n=xs();bs(0,"div",2),uu(1,"\n "),bs(2,"button",3),Ts("click",(function(){Bn(n);var t=e.$implicit;return Ys().select(t)})),uu(3,"\n "),bs(4,"div",4),uu(5,"\n "),bs(6,"div"),uu(7),bs(8,"mat-icon"),uu(9,"play_arrow"),ws(),uu(10),Tl(11,"amount"),ws(),uu(12,"\n "),bs(13,"div"),bs(14,"span",5),uu(15),Tl(16,"translate"),ws(),uu(17),ws(),uu(18,"\n "),bs(19,"div"),bs(20,"span",5),uu(21),Tl(22,"translate"),ws(),uu(23),Tl(24,"dateTime"),ws(),uu(25,"\n "),ws(),uu(26,"\n "),ws(),uu(27,"\n "),ws()}if(2&t){var i=e.$implicit,r=Ys();na(7),du("",i.fromAmount," ",r.getFromCoin(i.pair)," "),na(3),du(" \u2248",Al(11,8,i.toAmount,!0,"first")," ",r.getToCoin(i.pair),""),na(5),lu(El(16,12,"exchange.history-window.address")),na(2),cu(" ",i.address,""),na(4),lu(El(22,14,"exchange.history-window.date")),na(2),cu(" ",El(24,16,i.timestamp),"")}}var Tz=function(){function t(t,e,n){this.dialogRef=t,this.blockchainService=e,this.exchangeService=n}return t.openDialog=function(e){var n=new pk;return n.autoFocus=!1,n.width=Mm.mediumModalWidth,e.open(t,n)},t.prototype.ngOnInit=function(){var t=this;this.exchangeService.history().subscribe((function(e){return t.orders=e.reverse()}),(function(){return t.orders=[]}))},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.select=function(t){this.dialogRef.close(t)},t.prototype.getFromCoin=function(t){return t.split("/")[0].toUpperCase()},t.prototype.getToCoin=function(t){return t.split("/")[1].toUpperCase()},t.\u0275fac=function(e){return new(e||t)(gs(bk),gs(SO),gs(Dz))},t.\u0275cmp=Fe({type:t,selectors:[["app-exchange-history"]],decls:6,vars:5,consts:[[3,"headline","dialog"],["class","light-button-theme list-button-container",4,"ngFor","ngForOf"],[1,"light-button-theme","list-button-container"],["mat-button","","color","primary",1,"top-line",3,"click"],[1,"info"],[1,"grey-text"]],template:function(t,e){1&t&&(bs(0,"app-modal",0),Tl(1,"translate"),uu(2,"\n "),ps(3,Lz,28,18,"div",1),uu(4,"\n"),ws(),uu(5,"\n")),2&t&&(_s("headline",El(1,3,"exchange.history-window.title"))("dialog",e.dialogRef),na(3),_s("ngForOf",e.orders))},directives:[jS,Lh,XC,vx],pipes:[pC,DC,NH],styles:[".info[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}.info[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.info[_ngcontent-%COMP%] div[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;position:relative;top:3px;margin:0 5px}"]}),t}(),Ez=["exchangeButton"];function Oz(t,e){if(1&t&&ks(0,"app-loading-content",2),2&t){var n=Ys();_s("isLoading",!n.tradingPairs&&!n.problemGettingPairs)("noDataText",n.problemGettingPairs?"exchange.problem-connecting":"exchange.offline")}}function Az(t,e){if(1&t&&(bs(0,"span",28),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(2);na(1),du("\n ",El(2,2,"exchange.min-amount")," ",n.activeTradingPair.min,"\n ")}}function Pz(t,e){if(1&t&&(bs(0,"span",28),uu(1),Tl(2,"translate"),ws()),2&t){var n=Ys(2);na(1),du("\n ",El(2,2,"exchange.max-amount")," ",n.activeTradingPair.max,"\n ")}}function Iz(t,e){if(1&t&&(bs(0,"option",29),uu(1),ws()),2&t){var n=e.$implicit;_s("value",n.from),na(1),lu(n.from)}}var Yz=function(t){return{coin:t}};function Rz(t,e){if(1&t&&(bs(0,"div",30),uu(1,"\n "),bs(2,"div",31),uu(3,"\n "),bs(4,"div",32),uu(5),Tl(6,"translate"),ws(),uu(7,"\n "),bs(8,"div",33),uu(9),ws(),uu(10,"\n "),ws(),uu(11,"\n\n "),bs(12,"div",31),uu(13,"\n "),bs(14,"div",32),uu(15),Tl(16,"translate"),ws(),uu(17,"\n "),bs(18,"div",33),uu(19),ws(),uu(20,"\n "),ws(),uu(21,"\n\n "),bs(22,"div",31),uu(23,"\n "),bs(24,"div",32),uu(25),Tl(26,"translate"),ws(),uu(27,"\n "),bs(28,"div",33),uu(29),ws(),uu(30,"\n "),ws(),uu(31,"\n\n "),bs(32,"div",31),uu(33,"\n "),bs(34,"div",32),uu(35),Tl(36,"translate"),ws(),uu(37,"\n "),bs(38,"div",33),uu(39),ws(),uu(40,"\n "),ws(),uu(41,"\n\n "),bs(42,"div",31),uu(43,"\n "),bs(44,"div",32),uu(45),Tl(46,"translate"),ws(),uu(47,"\n "),bs(48,"div",33),uu(49,"\u2248 15 minutes"),ws(),uu(50,"\n "),ws(),uu(51,"\n "),ws()),2&t){var n=Ys(2);na(5),lu(El(6,13,"exchange.label-you-send")),na(4),du("",n.sendAmount," ",n.form.get("fromCoin").value,""),na(6),lu(El(16,15,"exchange.label-you-get")),na(4),du("\u2248 ",n.toAmount," ",n.toCoin,""),na(6),lu(Ol(26,17,"exchange.label-to-address",kl(24,Yz,n.toCoin))),na(4),lu(n.form.get("toAddress").value||"-"),na(6),lu(El(36,20,"exchange.label-price")),na(4),hu("1 ",n.form.get("fromCoin").value," \u2248 ",n.activeTradingPair.price.toFixed(6)," ",n.toCoin,""),na(6),lu(El(46,22,"exchange.label-stimate-transaction-time"))}}var Fz=function(t){return{"element-disabled":t}};function Hz(t,e){if(1&t){var n=xs();bs(0,"div",3),uu(1,"\n "),bs(2,"div",4),uu(3,"\n "),bs(4,"div",5),uu(5,"\n "),bs(6,"label",6),uu(7),Tl(8,"translate"),ps(9,Az,3,4,"span",7),uu(10,"\n "),ps(11,Pz,3,4,"span",7),uu(12,"\n "),ws(),uu(13,"\n "),bs(14,"div",8),uu(15,"\n "),bs(16,"input",9),Ts("blur",(function(){return Bn(n),Ys().validateForm()})),ws(),uu(17,"\n "),bs(18,"div",10),uu(19,"\n "),bs(20,"select",11),Ts("blur",(function(){return Bn(n),Ys().validateForm()})),uu(21,"\n "),ps(22,Iz,2,2,"option",12),uu(23,"\n "),ws(),uu(24,"\n "),ws(),uu(25,"\n "),ws(),uu(26,"\n "),ws(),uu(27,"\n "),bs(28,"div",5),uu(29,"\n "),bs(30,"label",13),uu(31),Tl(32,"translate"),ws(),uu(33,"\n "),bs(34,"div",14),uu(35,"\n "),ks(36,"input",15),uu(37,"\n "),bs(38,"div",16),uu(39,"\n "),ks(40,"input",17),uu(41,"\n "),ws(),uu(42,"\n "),ws(),uu(43,"\n "),ws(),uu(44,"\n "),bs(45,"div",5),uu(46,"\n "),bs(47,"label",18),uu(48,"\n "),bs(49,"span"),uu(50),Tl(51,"translate"),ws(),uu(52,"\n "),bs(53,"app-arrow-link",19),Ts("pressed",(function(t){return Bn(n),Ys().selectAddress(t)})),uu(54,"\n "),ws(),uu(55,"\n "),ws(),uu(56,"\n "),bs(57,"input",20),Ts("blur",(function(){return Bn(n),Ys().validateForm()})),ws(),uu(58,"\n "),ws(),uu(59,"\n\n "),bs(60,"div",21),uu(61,"\n "),bs(62,"mat-checkbox",22),Ts("change",(function(t){return Bn(n),Ys().setAgreement(t)})),uu(63),Tl(64,"translate"),bs(65,"a",23),uu(66),Tl(67,"translate"),ws(),uu(68),Tl(69,"translate"),bs(70,"a",24),uu(71),Tl(72,"translate"),ws(),uu(73,"\n "),ws(),uu(74,"\n\n "),bs(75,"app-button",25,26),Ts("action",(function(){return Bn(n),Ys().exchange()})),uu(77),Tl(78,"translate"),ws(),uu(79,"\n "),ws(),uu(80,"\n "),ws(),uu(81,"\n\n "),ps(82,Rz,52,26,"div",27),uu(83,"\n"),ws()}if(2&t){var i=Ys();na(2),_s("formGroup",i.form),na(5),cu("\n ",El(8,26,"exchange.label-you-send"),"\n "),na(2),_s("ngIf",i.amountTooLow),na(2),_s("ngIf",i.amountTooHight),na(5),_s("appFormFieldError",i.amountErrorMsg),ds("disabled",i.busy?"true":null),na(4),_s("appFormFieldError",i.coinErrorMsg),ds("disabled",i.busy?"true":null),na(2),_s("ngForOf",i.tradingPairs),na(9),lu(El(32,28,"exchange.label-you-get")),na(5),_s("value",i.toAmount)("ngClass",kl(43,Fz,i.busy)),na(4),_s("value",i.toCoin)("ngClass",kl(45,Fz,i.busy)),na(10),lu(Ol(51,30,"exchange.label-to-address",kl(47,Yz,i.toCoin))),na(3),_s("text","exchange.destination-select-from-list-link"),na(4),_s("appFormFieldError",i.addressErrorMsg),ds("disabled",i.busy?"true":null),na(5),_s("ngClass",kl(49,Fz,i.busy)),na(1),cu("\n ",El(64,33,"exchange.agree-part1"),"\n "),na(3),cu("\n ",El(67,35,"exchange.agree-part2"),"\n "),na(2),cu("\n ",El(69,37,"exchange.agree-part3"),"\n "),na(3),cu("\n ",El(72,39,"exchange.agree-part4"),"\n "),na(4),_s("disabled",!i.form.valid),na(2),cu("\n ",El(78,41,"exchange.exchange-button"),"\n "),na(5),_s("ngIf",i.activeTradingPair)}}var Bz=function(){function t(t,e,n,i,r,a,o){this.exchangeService=t,this.formBuilder=e,this.msgBarService=n,this.dialog=i,this.appService=r,this.translateService=a,this.walletsAndAddressesService=o,this.defaultFromCoin="BTC",this.defaultFromAmount="0.1",this.toCoin="SKY",this.submitted=new Rl,this.problemGettingPairs=!1,this.busy=!1,this.coinErrorMsg="",this.amountErrorMsg="",this.addressErrorMsg="",this.amountTooLow=!1,this.amountTooHight=!1,this.agreement=!1,this.subscriptionsGroup=[]}return Object.defineProperty(t.prototype,"toAmount",{get:function(){if(!this.activeTradingPair)return 0;var t=this.form.get("fromAmount").value;return isNaN(t)?0:(this.form.get("fromAmount").value*this.activeTradingPair.price).toFixed(this.appService.currentMaxDecimals)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"sendAmount",{get:function(){var t=this.form.get("fromAmount").value;return isNaN(parseFloat(t))?0:t},enumerable:!1,configurable:!0}),t.prototype.ngOnInit=function(){this.createForm(),this.loadData()},t.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach((function(t){return t.unsubscribe()})),this.removeExchangeSubscription(),this.msgBarService.hide(),this.removePriceUpdateSubscription()},t.prototype.setAgreement=function(t){this.agreement=t.checked,this.form.updateValueAndValidity()},t.prototype.selectAddress=function(t){var e=this;t.stopPropagation(),t.preventDefault(),bR.openDialog(this.dialog).afterClosed().subscribe((function(t){t&&e.form.get("toAddress").setValue(t)}))},t.prototype.exchange=function(){var t=this;if(this.form.valid&&!this.busy){this.busy=!0,this.msgBarService.hide(),this.exchangeButton.resetState(),this.exchangeButton.setLoading(),this.exchangeButton.setDisabled();var e=parseFloat(this.form.get("fromAmount").value),n=this.form.get("toAddress").value.trim();this.removeExchangeSubscription(),this.exchangeSubscription=this.walletsAndAddressesService.verifyAddress(n).subscribe((function(i){i?t.exchangeSubscription=t.exchangeService.exchange(t.activeTradingPair.pair,e,n,t.activeTradingPair.price).subscribe((function(e){t.busy=!1,t.submitted.emit({id:e.id,pair:e.pair,fromAmount:e.fromAmount,toAmount:e.toAmount,address:e.toAddress,timestamp:PI().unix(),price:t.activeTradingPair.price})}),(function(e){t.busy=!1,t.exchangeButton.resetState(),t.exchangeButton.setEnabled(),t.msgBarService.showError(e)})):t.showInvalidAddress()}),(function(){t.showInvalidAddress()}))}},t.prototype.showInvalidAddress=function(){this.busy=!1,this.exchangeButton.resetState(),this.exchangeButton.setEnabled();var t=this.translateService.instant("exchange.invalid-address-error");this.msgBarService.showError(t)},t.prototype.createForm=function(){var t=this;this.form=this.formBuilder.group({fromCoin:[this.defaultFromCoin],fromAmount:[this.defaultFromAmount],toAddress:[""]}),this.form.setValidators(this.validateForm.bind(this)),this.subscriptionsGroup.push(this.form.get("fromCoin").valueChanges.subscribe((function(){t.updateActiveTradingPair()})))},t.prototype.loadData=function(){var t=this;this.subscriptionsGroup.push(this.exchangeService.tradingPairs().pipe(Kf((function(t){return ig(t.pipe(up(2e3),kp(10)),ap(""))}))).subscribe((function(e){t.tradingPairs=[],e.forEach((function(e){e.to===t.toCoin&&t.tradingPairs.push(e)})),t.updateActiveTradingPair(),t.updatePrices()}),(function(){t.problemGettingPairs=!0})))},t.prototype.updatePrices=function(){var t=this;this.removePriceUpdateSubscription(),this.priceUpdateSubscription=rp(1).pipe(up(6e4),st((function(){return t.exchangeService.tradingPairs()})),Kf((function(t){return t.pipe(up(6e4))}))).subscribe((function(e){e.forEach((function(e){if(e.to===t.toCoin){var n=t.tradingPairs.find((function(t){return t.from===e.from}));n&&(n.price=e.price)}})),t.updatePrices()}))},t.prototype.updateActiveTradingPair=function(){var t=this;this.activeTradingPair=this.tradingPairs.find((function(e){return e.from===t.form.get("fromCoin").value})),!this.activeTradingPair&&this.tradingPairs.length>0&&(this.activeTradingPair=this.tradingPairs[0],this.form.get("fromCoin").setValue(this.activeTradingPair.from))},t.prototype.validateForm=function(){if(this.coinErrorMsg="",this.amountErrorMsg="",this.addressErrorMsg="",this.amountTooLow=!1,this.amountTooHight=!1,!this.activeTradingPair)return null;var t=!0,e=this.form.get("fromAmount").value;if(!e||isNaN(e))t=!1,this.form.get("fromAmount").touched&&(this.amountErrorMsg="exchange.invalid-value-error-info");else{var n=e.split(".");n.length>1&&n[1].length>6&&(t=!1,this.form.get("fromAmount").touched&&(this.amountErrorMsg="exchange.invalid-value-error-info"))}t&&(ethis.activeTradingPair.max&&(this.amountTooHight=!0,t=!1,this.form.get("fromAmount").touched&&(this.amountErrorMsg="exchange.invalid-value-error-info"))),this.form.get("fromCoin").value||(t=!1,this.form.get("fromCoin").touched&&(this.coinErrorMsg="exchange.from-coin-error-info"));var i=this.form.get("toAddress").value;return(!i||i.length<20)&&(t=!1,this.form.get("toAddress").touched&&(this.addressErrorMsg="exchange.address-error-info")),this.agreement||(t=!1),t?null:{Invalid:!0}},t.prototype.removeExchangeSubscription=function(){this.exchangeSubscription&&this.exchangeSubscription.unsubscribe()},t.prototype.removePriceUpdateSubscription=function(){this.priceUpdateSubscription&&this.priceUpdateSubscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(gs(Dz),gs(YS),gs(Gx),gs(Dk),gs(Sm),gs(hC),gs(hD))},t.\u0275cmp=Fe({type:t,selectors:[["app-exchange-create"]],viewQuery:function(t,e){var n;1&t&&Zl(Ez,!0),2&t&&Gl(n=tc())&&(e.exchangeButton=n.first)},outputs:{submitted:"submitted"},decls:4,vars:2,consts:[[3,"isLoading","noDataText",4,"ngIf"],["class","-create",4,"ngIf"],[3,"isLoading","noDataText"],[1,"-create"],[1,"-form",3,"formGroup"],[1,"form-field"],["for","fromAmount"],["class","-error",4,"ngIf"],[1,"-inputs"],["type","text","formControlName","fromAmount","id","fromAmount",3,"appFormFieldError","blur"],[1,"-select"],["formControlName","fromCoin",3,"appFormFieldError","blur"],[3,"value",4,"ngFor","ngForOf"],["for","toAmount"],[1,"-inputs","-not-allowed"],["type","text","readonly","","id","toAmount",3,"value","ngClass"],[1,"-input"],["type","text","readonly","",3,"value","ngClass"],["for","toAddress"],[3,"text","pressed"],["type","text","formControlName","toAddress","id","toAddress",3,"appFormFieldError","blur"],[1,"-buttons"],["type","checkbox",1,"-check",3,"ngClass","change"],["href","https://swaplab.cc/terms","target","_blank","rel","noreferrer nofollow noopener",1,"link"],["href","https://swaplab.cc/privacy","target","_blank","rel","noreferrer nofollow noopener",1,"link"],[1,"primary-button",3,"disabled","action"],["exchangeButton",""],["class","-info",4,"ngIf"],[1,"-error"],[3,"value"],[1,"-info"],[1,"-item"],[1,"-key"],[1,"break-all"]],template:function(t,e){1&t&&(ps(0,Oz,1,2,"app-loading-content",0),uu(1,"\n\n"),ps(2,Hz,84,51,"div",1),uu(3,"\n")),2&t&&(_s("ngIf",!e.activeTradingPair),na(2),_s("ngIf",e.activeTradingPair))},directives:[Eh,OY,rM,hS,Qk,iM,yS,KE,CM,Lh,Ch,RI,wE,Cx,xM,EM],pipes:[pC],styles:[".-create[_ngcontent-%COMP%]{display:flex}.-create[_ngcontent-%COMP%] .-form[_ngcontent-%COMP%]{flex:.6}.-create[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{flex:.4;margin-left:40px}.form-field[_ngcontent-%COMP%] .-error[_ngcontent-%COMP%]{color:#ff004e;margin-left:20px}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%]{display:flex}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{flex:.7;border-top-right-radius:0;border-bottom-right-radius:0}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%]{flex:.3}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%] select[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%] select[_ngcontent-%COMP%]{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.-item[_ngcontent-%COMP%]{font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-buttons[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center}"]}),t}();function jz(t,e){1&t&&ks(0,"app-loading-content",4),2&t&&_s("isLoading",!Ys().showError)}function Nz(t,e){if(1&t&&(bs(0,"div",14),uu(1,"\n "),bs(2,"div",15),uu(3,"\n "),ks(4,"app-qr-code-button",19),uu(5,"\n "),ws(),uu(6,"\n "),bs(7,"div",8),uu(8,"\n "),bs(9,"div",9),uu(10),Tl(11,"translate"),ws(),uu(12,"\n "),bs(13,"div",10),uu(14),ws(),uu(15,"\n "),ws(),uu(16,"\n "),ws()),2&t){var n=Ys(3);na(4),_s("address",n.order.exchangeTag)("showAddressOnly",!0),na(6),lu(El(11,4,"exchange.details.exchange-addr-tag-label")),na(4),lu(n.order.exchangeTag)}}function Wz(t,e){if(1&t&&(uu(0,"\n "),bs(1,"div",14),uu(2,"\n "),ks(3,"div",15),uu(4,"\n "),bs(5,"div",8),uu(6,"\n "),bs(7,"div",9),uu(8),Tl(9,"translate"),ws(),uu(10,"\n "),bs(11,"div",10),uu(12),ws(),uu(13,"\n "),ws(),uu(14,"\n "),ws(),uu(15,"\n\n "),bs(16,"div",14),uu(17,"\n "),bs(18,"div",15),uu(19,"\n "),ks(20,"app-qr-code-button",19),uu(21,"\n "),ws(),uu(22,"\n "),bs(23,"div",8),uu(24,"\n "),bs(25,"div",9),uu(26),Tl(27,"translate"),ws(),uu(28,"\n "),bs(29,"div",10),uu(30),ws(),uu(31,"\n "),ws(),uu(32,"\n "),ws(),uu(33,"\n\n "),ps(34,Nz,17,6,"div",17),uu(35,"\n ")),2&t){var n=Ys(2);na(8),lu(El(9,8,"exchange.label-you-send")),na(4),du("",n.order.fromAmount," ",n.fromCoin,""),na(8),_s("address",n.order.exchangeAddress)("showAddressOnly",!0),na(6),lu(El(27,10,"exchange.details.exchange-addr-label")),na(4),lu(n.order.exchangeAddress),na(4),_s("ngIf",n.order.exchangeTag)}}function Vz(t,e){1&t&&Cs(0)}function zz(t,e){if(1&t&&(Ms(0),uu(1,"\n "),ps(2,Vz,1,0,"ng-container",20),uu(3,"\n "),Ss()),2&t){Ys();var n=ms(49);na(2),_s("ngTemplateOutlet",n)}}function Uz(t,e){if(1&t&&(bs(0,"div",14),uu(1,"\n "),ks(2,"div",15),uu(3,"\n "),bs(4,"div",8),uu(5,"\n "),bs(6,"div",9),uu(7),Tl(8,"translate"),ws(),uu(9,"\n "),bs(10,"div",10),uu(11),bs(12,"a",21),uu(13,"\n "),bs(14,"mat-icon",22),uu(15,"launch"),ws(),uu(16,"\n "),ws(),uu(17,"\n "),ws(),uu(18,"\n "),ws(),uu(19,"\n "),ws()),2&t){var n=Ys(2);na(7),lu(El(8,3,"exchange.details.tx-id-label")),na(4),cu("\n ",n.order.toTx,"\n "),na(1),_s("href",n.appService.explorerUrl+"/transaction/"+n.order.toTx,Rr)}}function qz(t,e){if(1&t&&(bs(0,"div",14),uu(1,"\n "),ks(2,"div",15),uu(3,"\n "),bs(4,"div",8),uu(5,"\n "),bs(6,"div",9),uu(7),Tl(8,"translate"),ws(),uu(9,"\n "),bs(10,"div",10),uu(11),ws(),uu(12,"\n "),ws(),uu(13,"\n "),ws()),2&t){var n=Ys(2);na(7),lu(El(8,2,"exchange.details.error-msg-label")),na(4),lu(n.order.message)}}function Gz(t,e){1&t&&Cs(0)}function Kz(t,e){if(1&t&&(Ms(0),uu(1,"\n "),ps(2,Gz,1,0,"ng-container",20),uu(3,"\n "),Ss()),2&t){Ys(2);var n=ms(49);na(2),_s("ngTemplateOutlet",n)}}var Zz=function(t){return{coin:t}};function Jz(t,e){if(1&t&&(Ms(0),uu(1,"\n "),bs(2,"div",14),uu(3,"\n "),ks(4,"div",15),uu(5,"\n "),bs(6,"div",8),uu(7,"\n "),bs(8,"div",9),uu(9),Tl(10,"translate"),ws(),uu(11,"\n "),bs(12,"div",10),uu(13),Tl(14,"dateTime"),ws(),uu(15,"\n "),ws(),uu(16,"\n "),ws(),uu(17,"\n\n "),ps(18,Kz,4,1,"ng-container",1),uu(19,"\n\n "),bs(20,"div",14),uu(21,"\n "),ks(22,"div",15),uu(23,"\n "),bs(24,"div",8),uu(25,"\n "),bs(26,"div",9),uu(27),Tl(28,"translate"),ws(),uu(29,"\n "),bs(30,"div",10),uu(31),Tl(32,"amount"),ws(),uu(33,"\n "),ws(),uu(34,"\n "),ws(),uu(35,"\n\n "),bs(36,"div",14),uu(37,"\n "),ks(38,"div",15),uu(39,"\n "),bs(40,"div",8),uu(41,"\n "),bs(42,"div",9),uu(43),Tl(44,"translate"),ws(),uu(45,"\n "),bs(46,"div",10),uu(47),ws(),uu(48,"\n "),ws(),uu(49,"\n "),ws(),uu(50,"\n\n "),bs(51,"div",14),uu(52,"\n "),ks(53,"div",15),uu(54,"\n "),bs(55,"div",8),uu(56,"\n "),bs(57,"div",9),uu(58),Tl(59,"translate"),ws(),uu(60,"\n "),bs(61,"div",10),uu(62),ws(),uu(63,"\n "),ws(),uu(64,"\n "),ws(),uu(65,"\n "),Ss()),2&t){var n=Ys(2);na(9),lu(El(10,12,"exchange.details.start-date-label")),na(4),lu(El(14,14,n._orderDetails.timestamp)),na(5),_s("ngIf",n.order.status!==n.statuses[0]),na(9),lu(El(28,16,"exchange.label-you-get")),na(4),du("",Al(32,18,n.order.toAmount,!0,"first")," ",n.toCoin,""),na(12),lu(Ol(44,22,"exchange.label-to-address",kl(27,Zz,n.toCoin))),na(4),lu(n.order.toAddress),na(11),lu(El(59,25,"exchange.details.initial-price-label")),na(4),hu("1 ",n.fromCoin," \u2248 ",n._orderDetails.price," ",n.toCoin,"")}}var Qz=function(t){return{"-spin":t}},Xz=function(t,e){return{from:t,to:e}};function $z(t,e){if(1&t){var n=xs();Ms(0),uu(1,"\n "),bs(2,"div",5),uu(3,"\n "),bs(4,"div",6),uu(5,"\n "),bs(6,"mat-icon",7),uu(7),ws(),uu(8,"\n "),bs(9,"div",8),uu(10,"\n "),bs(11,"div",9),uu(12),Tl(13,"translate"),ws(),uu(14,"\n "),bs(15,"div",10),uu(16),Tl(17,"translate"),bs(18,"mat-icon",11),Tl(19,"translate"),uu(20,"help"),ws(),ws(),uu(21,"\n "),ws(),uu(22,"\n "),ws(),uu(23,"\n "),bs(24,"span"),uu(25),Tl(26,"translate"),ws(),uu(27,"\n "),ws(),uu(28,"\n\n "),ks(29,"mat-progress-bar",12),uu(30,"\n\n "),bs(31,"div",13),uu(32,"\n "),bs(33,"div",14),uu(34,"\n "),ks(35,"div",15),uu(36,"\n "),bs(37,"div",8),uu(38,"\n "),bs(39,"div",9),uu(40),Tl(41,"translate"),ws(),uu(42,"\n "),bs(43,"div",10),uu(44),ws(),uu(45,"\n "),ws(),uu(46,"\n "),ws(),uu(47,"\n\n "),ps(48,Wz,36,12,"ng-template",null,16,rc),uu(50,"\n\n "),ps(51,zz,4,1,"ng-container",1),uu(52,"\n\n "),ps(53,Uz,20,5,"div",17),uu(54,"\n\n "),ps(55,qz,14,4,"div",17),uu(56,"\n\n "),bs(57,"div",14),uu(58,"\n "),ks(59,"div",15),uu(60,"\n "),bs(61,"app-arrow-link",18),Ts("pressed",(function(){return Bn(n),Ys().toggleDetails()})),uu(62,"\n "),ws(),uu(63,"\n "),ws(),uu(64,"\n\n "),ps(65,Jz,66,29,"ng-container",1),uu(66,"\n "),ws(),uu(67,"\n"),Ss()}if(2&t){var i=Ys();na(6),_s("ngClass",kl(28,Qz,"refresh"===i.statusIcon)),na(1),lu(i.statusIcon),na(5),lu(El(13,16,"exchange.label-status")),na(4),cu("",Ol(17,18,i.translatedStatus.text,i.translatedStatus.params)," "),na(2),_s("matTooltip",El(19,21,i.translatedStatus.info)),na(7),lu(Ol(26,23,"exchange.exchanging",Ml(30,Xz,i.fromCoin,i.toCoin))),na(4),_s("value",i.progress),na(11),lu(El(41,26,"exchange.details.order-id-label")),na(4),lu(i.order.id),na(7),_s("ngIf",i.order.status===i.statuses[0]),na(2),_s("ngIf",i.order.status===i.statuses[5]),na(2),_s("ngIf",i.order.status===i.statuses[6]),na(6),_s("noPadding",!0)("pointDown",!i.expanded)("text","exchange.details.details-link"),na(4),_s("ngIf",i.expanded)}}var tU=function(){function t(t,e,n,i){this.exchangeService=t,this.dialog=e,this.blockchainService=n,this.appService=i,this.TEST_MODE=false,this.TEST_ERROR=false,this.statuses=["user_waiting","market_waiting_confirmations","market_confirmed","market_exchanged","market_withdraw_waiting","complete","error","user_deposit_timeout"],this.loading=!0,this.showError=!1,this.expanded=!1,this.testStatusIndex=0,this.goBack=new Rl}return Object.defineProperty(t.prototype,"orderDetails",{set:function(t){var e=this._orderDetails;this._orderDetails=t,null===t||e&&e.id===t.id||(this.exchangeService.lastViewedOrder=this._orderDetails,this.testStatusIndex=0,this.loading=!0,this.getStatus())},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"fromCoin",{get:function(){return this.order.pair.split("/")[0].toUpperCase()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"toCoin",{get:function(){return this.order.pair.split("/")[1].toUpperCase()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"translatedStatus",{get:function(){var t=this.order.status.replace(/_/g,"-");return{text:"exchange.statuses."+t,info:"exchange.statuses."+t+"-info",params:{from:this.fromCoin,amount:this.order.fromAmount,to:this.toCoin}}},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"statusIcon",{get:function(){return this.order.status===this.statuses[5]?"done":this.order.status===this.statuses[6]||this.order.status===this.statuses[7]?"close":"refresh"},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"progress",{get:function(){var t=this.statuses.indexOf(this.order.status);return t=Math.min(t,5)+1,Math.ceil(100/6*t)},enumerable:!1,configurable:!0}),t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.toggleDetails=function(){this.expanded=!this.expanded},t.prototype.close=function(){var t=this;this.loading||this.exchangeService.isOrderFinished(this.order)?this.goBack.emit():AE.openDialog(this.dialog,{text:"exchange.details.back-alert",defaultButtons:OE.YesNo}).afterClosed().subscribe((function(e){e&&t.goBack.emit()}))},t.prototype.getStatus=function(t){var e=this;void 0===t&&(t=0),this.subscription&&this.subscription.unsubscribe();var n=this._orderDetails.fromAmount;this.TEST_MODE&&this.TEST_ERROR&&this.testStatusIndex===this.statuses.length-2&&(this.testStatusIndex=this.statuses.length-1),this.subscription=rp(0).pipe(up(t),st((function(){return e.exchangeService.status(e.TEST_MODE?"4729821d-390d-4ef8-a31e-2465d82a142f":e._orderDetails.id,e.TEST_MODE?e.statuses[e.testStatusIndex++]:null)}))).subscribe((function(t){e.order=Vk(Vk({},t),{fromAmount:n}),e._orderDetails.id=t.id,e.exchangeService.lastViewedOrder=e._orderDetails,e.exchangeService.isOrderFinished(t)?e.exchangeService.lastViewedOrder=null:e.getStatus(e.TEST_MODE?3e3:3e4),e.loading=!1}),(function(){return e.showError=!0}))},t.\u0275fac=function(e){return new(e||t)(gs(Dz),gs(Dk),gs(SO),gs(Sm))},t.\u0275cmp=Fe({type:t,selectors:[["app-exchange-status"]],inputs:{orderDetails:"orderDetails"},outputs:{goBack:"goBack"},decls:11,vars:5,consts:[["noDataText","exchange.order-not-found",3,"isLoading",4,"ngIf"],[4,"ngIf"],[1,"text-center"],[1,"primary-button",3,"action"],["noDataText","exchange.order-not-found",3,"isLoading"],[1,"-wrapper"],[1,"-status"],[3,"ngClass"],[1,"-item"],[1,"-key"],[1,"-value"],[1,"help-icon",3,"matTooltip"],["color","primary",3,"value"],[1,"-details"],[1,"-box"],[1,"-img"],["fromInfo",""],["class","-box",4,"ngIf"],[3,"noPadding","pointDown","text","pressed"],[3,"address","showAddressOnly"],[4,"ngTemplateOutlet"],["target","_blank","rel","noreferrer nofollow noopener",1,"-external",3,"href"],[1,"image-button"]],template:function(t,e){1&t&&(ps(0,jz,1,1,"app-loading-content",0),uu(1,"\n\n"),ps(2,$z,68,33,"ng-container",1),uu(3,"\n\n"),bs(4,"div",2),uu(5,"\n "),bs(6,"app-button",3),Ts("action",(function(){return e.close()})),uu(7),Tl(8,"translate"),ws(),uu(9,"\n"),ws(),uu(10,"\n")),2&t&&(_s("ngIf",e.loading),na(2),_s("ngIf",!e.loading),na(5),cu("\n ",El(8,3,"common.back-button"),"\n "))},directives:[Eh,Cx,OY,vx,Ch,UE,KP,RI,qI,jh],pipes:[pC,NH,DC],styles:[".-wrapper[_ngcontent-%COMP%]{font-size:13px;justify-content:space-between}.-wrapper[_ngcontent-%COMP%], .-wrapper[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%]{display:flex;align-items:center}.-wrapper[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:15px;width:18px;height:18px;font-size:18px}.-wrapper[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%] mat-icon.-spin[_ngcontent-%COMP%]{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.-wrapper[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{padding-right:30px;word-break:normal}mat-progress-bar[_ngcontent-%COMP%]{margin:30px -30px;width:calc(100% + 60px)}.-details[_ngcontent-%COMP%] .-box[_ngcontent-%COMP%]{display:flex;align-items:center}.-details[_ngcontent-%COMP%] .-box[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-details[_ngcontent-%COMP%] .-box[_ngcontent-%COMP%] > .-img[_ngcontent-%COMP%]{width:17px;margin-right:15px;flex-shrink:0}.-item[_ngcontent-%COMP%]{font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.-external[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{line-height:13px;height:13px;width:13px;font-size:16px;vertical-align:middle;color:#0072ff;margin-left:10px}"]}),t}();function eU(t,e){1&t&&ks(0,"app-loading-content",10),2&t&&_s("isLoading",!1)}function nU(t,e){if(1&t){var n=xs();bs(0,"app-exchange-create",11),Ts("submitted",(function(t){return Bn(n),Ys().showStatus(t)})),ws()}}function iU(t,e){if(1&t){var n=xs();bs(0,"app-exchange-status",12),Ts("goBack",(function(){return Bn(n),Ys().goBack()})),ws()}2&t&&_s("orderDetails",Ys().currentOrderDetails)}function rU(t,e){if(1&t){var n=xs();bs(0,"span",13),uu(1,"\n "),bs(2,"a",14),Ts("click",(function(t){return Bn(n),Ys().showHistory(t)})),bs(3,"mat-icon"),uu(4,"history"),ws(),uu(5," "),bs(6,"span",15),uu(7),Tl(8,"translate"),ws(),ws(),uu(9,"\n "),ws()}2&t&&(na(7),lu(El(8,1,"exchange.history")))}var aU=function(t){return{coinName:t}},oU=function(){function t(t,e,n){this.appService=t,this.exchangeService=e,this.dialog=n,this.hasHistory=!1,this.loading=!0,this.unavailable=!1}return t.prototype.ngOnInit=function(){var t=this;-1===navigator.userAgent.toLowerCase().indexOf("electron")?this.unavailable=!0:(this.lastViewedSubscription=this.exchangeService.lastViewedOrderLoaded.subscribe((function(e){if(e){var n=t.exchangeService.lastViewedOrder;n&&(t.currentOrderDetails=n),setTimeout((function(){return t.lastViewedSubscription.unsubscribe()})),t.loading=!1}})),this.historySubscription=this.exchangeService.history().subscribe((function(){return t.hasHistory=!0})))},t.prototype.ngOnDestroy=function(){this.lastViewedSubscription&&this.lastViewedSubscription.unsubscribe(),this.historySubscription&&this.historySubscription.unsubscribe()},t.prototype.showStatus=function(t){this.currentOrderDetails=t,this.hasHistory=!0},t.prototype.showHistory=function(t){var e=this;t.preventDefault(),Tz.openDialog(this.dialog).afterClosed().subscribe((function(t){t&&(e.currentOrderDetails=t)}))},t.prototype.goBack=function(){this.currentOrderDetails=null,this.exchangeService.lastViewedOrder=null},t.\u0275fac=function(e){return new(e||t)(gs(Sm),gs(Dz),gs(Dk))},t.\u0275cmp=Fe({type:t,selectors:[["app-exchange"]],decls:44,vars:19,consts:[[3,"headline"],[1,"container"],[1,"paper"],["noDataText","exchange.unavailable",3,"isLoading",4,"ngIf"],[3,"submitted",4,"ngIf"],[3,"orderDetails","goBack",4,"ngIf"],[1,"-contact"],["class","history",4,"ngIf"],["href","https://swaplabcc.freshdesk.com/support/home","target","_blank","rel","noreferrer nofollow noopener",1,"link"],["href","https://swaplab.cc","target","_blank","rel","noreferrer nofollow noopener",1,"link"],["noDataText","exchange.unavailable",3,"isLoading"],[3,"submitted"],[3,"orderDetails","goBack"],[1,"history"],["href","#",1,"link",3,"click"],[1,"history-text"]],template:function(t,e){1&t&&(ks(0,"app-header",0),Tl(1,"translate"),uu(2,"\n"),bs(3,"div",1),uu(4,"\n "),bs(5,"div",2),uu(6,"\n "),ps(7,eU,1,1,"app-loading-content",3),uu(8,"\n\n "),ps(9,nU,1,0,"app-exchange-create",4),uu(10,"\n\n "),ps(11,iU,1,1,"app-exchange-status",5),uu(12,"\n "),ws(),uu(13,"\n "),bs(14,"div",6),uu(15,"\n "),bs(16,"div"),uu(17,"\n "),ps(18,rU,10,3,"span",7),uu(19,"\n "),ws(),uu(20,"\n "),bs(21,"div"),uu(22,"\n "),bs(23,"span"),uu(24),Tl(25,"translate"),bs(26,"a",8),uu(27),Tl(28,"translate"),ws(),uu(29,"\n "),ws(),uu(30,"\n "),bs(31,"span"),uu(32,"|"),ws(),uu(33,"\n "),bs(34,"span"),uu(35),Tl(36,"translate"),bs(37,"a",9),uu(38,"SWAPLAB.CC"),ws(),uu(39,"\n "),ws(),uu(40,"\n "),ws(),uu(41,"\n "),ws(),uu(42,"\n"),ws(),uu(43,"\n")),2&t&&(_s("headline",Ol(1,8,"exchange.title-and-button",kl(17,aU,e.appService.coinName))),na(7),_s("ngIf",e.unavailable),na(2),_s("ngIf",!e.currentOrderDetails&&!e.loading),na(2),_s("ngIf",e.currentOrderDetails&&!e.loading),na(7),_s("ngIf",e.hasHistory),na(6),cu("\n ",El(25,11,"exchange.need-help"),"\n "),na(3),cu("\n ",El(28,13,"exchange.support-portal"),"\n "),na(8),cu("\n ",El(36,15,"exchange.powered-by"),"\n "))},directives:[mI,Eh,OY,Bz,tU,vx],pipes:[pC],styles:[".-contact[_ngcontent-%COMP%]{margin:15px 30px;display:flex;justify-content:space-between}.-contact[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:13px;margin:0 5px;opacity:.5;vertical-align:middle}.-contact[_ngcontent-%COMP%] .history[_ngcontent-%COMP%]{opacity:1}.-contact[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;vertical-align:middle}.-contact[_ngcontent-%COMP%] .history-text[_ngcontent-%COMP%]{font-size:14px;opacity:1}"]}),t}(),sU=[{path:"",redirectTo:"wallets",pathMatch:"full"},{path:"wallets",component:CY,canActivate:[lz]},{path:"send",component:cB,canActivate:[lz]},{path:"transactions",component:Ej,canActivate:[lz]},{path:"buy",component:JB,canActivate:[lz]},{path:"exchange",component:oU,canActivate:[lz]},{path:"settings",children:[{path:"backup",component:YB},{path:"blockchain",component:xB},{path:"network",component:NB},{path:"outputs",component:wB},{path:"pending-transactions",component:mB}],canActivate:[lz]},{path:"wizard",component:kz},{path:"reset/:id",component:xz}],uU=function(){function t(){}return t.\u0275mod=We({type:t,bootstrap:[dE]}),t.\u0275inj=Pt({factory:function(e){return new(e||t)},providers:[ym,Sm,SO,Dz,FP,rP,nP,WB,lz,jk,Px,Hk,Rk,Fk,Hx,Rx,Gx,af,hD,RO,HO,MO,qY,II,{provide:MC,useValue:{_forceAnimations:!0}}],imports:[[Gf,hm,tx,Qj,Ik,SN,UN,_x,rW,AW,CP,JP,xC,DF,DV,PV,GE,xE,uz,$V,yw,RS,eE.forRoot(sU,{useHash:!0}),mC.forRoot({loader:{provide:KS,useClass:Mz}})]]}),t}();He(jH,[Ch,xh,Lh,Eh,jh,Bh,Ih,Yh,Rh,Fh,Hh,XC,$C,Tg,Kj,Zj,Jj,Fj,Hj,Bj,jj,Nj,Vj,zj,Uj,Wj,qj,Gj,vk,Tk,Ek,Ok,Ak,kN,vN,_N,yN,wN,bN,pN,zN,EN,ON,Pw,PN,IN,AN,vx,KN,ZN,VR,aF,KR,ZR,JR,XR,tF,iW,QN,wW,yW,CW,kW,MW,SW,Kw,OW,EW,aW,Ig,yP,fP,MP,cP,KP,SC,CC,xF,CF,sk,ek,mV,eV,aV,MV,xV,$W,AV,OV,UE,qE,wE,ME,az,WV,QV,UV,sS,xM,EM,Qk,vM,kM,Kk,CM,TM,bM,iM,rM,kS,LS,ES,AS,MS,xS,cS,hS,yS,pS,gS,zT,jT,NT,VT,CT,fC,XB,dE,YB,xB,JB,Cx,GO,LO,mI,NB,wB,mB,UI,cB,IP,$B,Ej,CY,VP,fY,jS,fz,vz,RP,MI,DB,kz,ZE,oB,iB,jH,OY,CI,bR,kO,xz,oU,Bz,tU,eP,YO,$O,rA,cA,AE,qC,Ax,pA,gC,bA,Lx,Ix,EI,nD,Tz,xA,IA,YA,kR,qx,tD,MR,VF,vH,WY,iR,pR,LY,RI,AI,qI,KE,zF,qF],[Uh,Zh,qh,tf,cf,af,of,Kh,sf,Jh,Xh,$h,nf,pC,dB,NH,VB,pY,DC]),He(tD,[Ch,xh,Lh,Eh,jh,Bh,Ih,Yh,Rh,Fh,Hh,XC,$C,Tg,Kj,Zj,Jj,Fj,Hj,Bj,jj,Nj,Vj,zj,Uj,Wj,qj,Gj,vk,Tk,Ek,Ok,Ak,kN,vN,_N,yN,wN,bN,pN,zN,EN,ON,Pw,PN,IN,AN,vx,KN,ZN,VR,aF,KR,ZR,JR,XR,tF,iW,QN,wW,yW,CW,kW,MW,SW,Kw,OW,EW,aW,Ig,yP,fP,MP,cP,KP,SC,CC,xF,CF,sk,ek,mV,eV,aV,MV,xV,$W,AV,OV,UE,qE,wE,ME,az,WV,QV,UV,sS,xM,EM,Qk,vM,kM,Kk,CM,TM,bM,iM,rM,kS,LS,ES,AS,MS,xS,cS,hS,yS,pS,gS,zT,jT,NT,VT,CT,fC,XB,dE,YB,xB,JB,Cx,GO,LO,mI,NB,wB,mB,UI,cB,IP,$B,Ej,CY,VP,fY,jS,fz,vz,RP,MI,DB,kz,ZE,oB,iB,jH,OY,CI,bR,kO,xz,oU,Bz,tU,eP,YO,$O,rA,cA,AE,qC,Ax,pA,gC,bA,Lx,Ix,EI,nD,Tz,xA,IA,YA,kR,qx,tD,MR,VF,vH,WY,iR,pR,LY,RI,AI,qI,KE,zF,qF],[Uh,Zh,qh,tf,cf,af,of,Kh,sf,Jh,Xh,$h,nf,pC,dB,NH,VB,pY,DC]),function(){if(lr)throw new Error("Cannot enable prod mode after platform setup.");ur=!1}(),Uf().bootstrapModule(uU,{preserveWhitespaces:!0})},zx6S:function(t,e,n){!function(t){"use strict";var e={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,i){var r=e.words[i];return 1===i.length?n?r[0]:r[1]:t+" "+e.correctGrammaticalCase(t,r)}};t.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))}},[[0,0]]]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.85a0e2e4ac9f36ebc6fd.bundle.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.85a0e2e4ac9f36ebc6fd.bundle.js new file mode 100644 index 0000000000..10c478c84a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.85a0e2e4ac9f36ebc6fd.bundle.js @@ -0,0 +1 @@ +webpackJsonp([7],{"+27R":function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={s:["thodde secondanim","thodde second"],ss:[n+" secondanim",n+" second"],m:["eka mintan","ek minute"],mm:[n+" mintanim",n+" mintam"],h:["eka horan","ek hor"],hh:[n+" horanim",n+" hor"],d:["eka disan","ek dis"],dd:[n+" disanim",n+" dis"],M:["eka mhoinean","ek mhoino"],MM:[n+" mhoineanim",n+" mhoine"],y:["eka vorsan","ek voros"],yy:[n+" vorsanim",n+" vorsam"]};return t?r[e][0]:r[e][1]}n.defineLocale("gom-latn",{months:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Ieta to] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fatlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(n,t){switch(t){case"D":return n+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return n}},week:{dow:1,doy:4},meridiemParse:/rati|sokalli|donparam|sanje/,meridiemHour:function(n,t){return 12===n&&(n=0),"rati"===t?n<4?n:n+12:"sokalli"===t?n:"donparam"===t?n>12?n:n+12:"sanje"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"rati":n<12?"sokalli":n<16?"donparam":n<20?"sanje":"rati"}})}(e("PJh5"))},"+3/4":function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(t){n.call(this),this.scheduler=t}return Object(l.__extends)(t,n),t.create=function(n){return new t(n)},t.dispatch=function(n){n.subscriber.complete()},t.prototype._subscribe=function(n){var e=this.scheduler;if(e)return e.schedule(t.dispatch,0,{subscriber:n});n.complete()},t}(e("YaPU").a)},"+7/x":function(n,t,e){!function(n){"use strict";var t={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},e={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};n.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(n){return n+"\u0bb5\u0ba4\u0bc1"},preparse:function(n){return n.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(n,t,e){return n<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":n<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":n<10?" \u0b95\u0bbe\u0bb2\u0bc8":n<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":n<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":n<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(n,t){return 12===n&&(n=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===t?n<2?n:n+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===t||"\u0b95\u0bbe\u0bb2\u0bc8"===t?n:"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===t&&n>=10?n:n+12},week:{dow:0,doy:6}})}(e("PJh5"))},"+CnV":function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=function(n){var t,l=e("AMGY").a.Symbol;return"function"==typeof l?l.observable?t=l.observable:(t=l("observable"),l.observable=t):t="@@observable",t}()},"/4Bh":function(n,t,e){"use strict";t.a=function(n,t){return arguments.length>=2?function(e){return Object(o.a)(Object(l.a)(n,t),Object(r.a)(1),Object(i.a)(t))(e)}:function(t){return Object(o.a)(Object(l.a)(function(t,e,l){return n(t,e,l+1)}),Object(r.a)(1))(t)}};var l=e("E5SG"),r=e("T1Dh"),i=e("2ESx"),o=e("f9aG")},"/6P1":function(n,t,e){!function(n){"use strict";var t={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function e(n,t,e,l){return t?r(e)[0]:l?r(e)[1]:r(e)[2]}function l(n){return n%10==0||n>10&&n<20}function r(n){return t[n].split("_")}function i(n,t,i,o){var s=n+" ";return 1===n?s+e(0,t,i[0],o):t?s+(l(n)?r(i)[1]:r(i)[0]):o?s+r(i)[1]:s+(l(n)?r(i)[1]:r(i)[2])}n.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(n,t,e,l){return t?"kelios sekund\u0117s":l?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:i,m:e,mm:i,h:e,hh:i,d:e,dd:i,M:e,MM:i,y:e,yy:i},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(n){return n+"-oji"},week:{dow:1,doy:4}})}(e("PJh5"))},"/bsm":function(n,t,e){!function(n){"use strict";n.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(e("PJh5"))},"/iUD":function(n,t,e){"use strict";t.a=function(n){return"function"==typeof n}},"/mhn":function(n,t,e){!function(n){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},e={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};n.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(n){return n.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0930\u093e\u0924\u093f"===t?n<4?n:n+12:"\u092c\u093f\u0939\u093e\u0928"===t?n:"\u0926\u093f\u0909\u0901\u0938\u094b"===t?n>=10?n:n+12:"\u0938\u093e\u0901\u091d"===t?n+12:void 0},meridiem:function(n,t,e){return n<3?"\u0930\u093e\u0924\u093f":n<12?"\u092c\u093f\u0939\u093e\u0928":n<16?"\u0926\u093f\u0909\u0901\u0938\u094b":n<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(e("PJh5"))},"/nXB":function(n,t,e){"use strict";t.a=function(){for(var n=[],t=0;t1&&"number"==typeof n[n.length-1]&&(e=n.pop())):"number"==typeof a&&(e=n.pop()),null===s&&1===n.length&&n[0]instanceof l.a?n[0]:Object(o.a)(e)(new r.a(n,s))};var l=e("YaPU"),r=e("Veqx"),i=e("1Q68"),o=e("8D5t")},0:function(n,t,e){n.exports=e("x35b")},"0P3J":function(n,t,e){"use strict";t.a=function(){return function(n){return n.lift(new i(n))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n){this.connectable=n}return n.prototype.call=function(n,t){var e=this.connectable;e._refCount++;var l=new o(n,e),r=t.subscribe(l);return l.closed||(l.connection=e.connect()),r},n}(),o=function(n){function t(t,e){n.call(this,t),this.connectable=e}return Object(l.__extends)(t,n),t.prototype._unsubscribe=function(){var n=this.connectable;if(n){this.connectable=null;var t=n._refCount;if(t<=0)this.connection=null;else if(n._refCount=t-1,t>1)this.connection=null;else{var e=this.connection,l=n._connection;this.connection=null,!l||e&&l!==e||l.unsubscribe()}}else this.connection=null},t}(r.a)},"0X8Q":function(n,t,e){!function(n){"use strict";n.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(n){return/^ch$/i.test(n)},meridiem:function(n,t,e){return n<12?e?"sa":"SA":e?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n r\u1ed3i l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(n){return n},week:{dow:1,doy:4}})}(e("PJh5"))},"1Bqh":function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(t,e){n.call(this),this.subject=t,this.subscriber=e,this.closed=!1}return Object(l.__extends)(t,n),t.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var n=this.subject,t=n.observers;if(this.subject=null,t&&0!==t.length&&!n.isStopped&&!n.closed){var e=t.indexOf(this.subscriber);-1!==e&&t.splice(e,1)}}},t}(e("VwZZ").a)},"1Q68":function(n,t,e){"use strict";t.a=function(n){return n&&"function"==typeof n.schedule}},"2ESx":function(n,t,e){"use strict";t.a=function(n){return void 0===n&&(n=null),function(t){return t.lift(new i(n))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n){this.defaultValue=n}return n.prototype.call=function(n,t){return t.subscribe(new o(n,this.defaultValue))},n}(),o=function(n){function t(t,e){n.call(this,t),this.defaultValue=e,this.isEmpty=!0}return Object(l.__extends)(t,n),t.prototype._next=function(n){this.isEmpty=!1,this.destination.next(n)},t.prototype._complete=function(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()},t}(r.a)},"2pmY":function(n,t,e){!function(n){"use strict";var t={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},e={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};n.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(n){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(n)},meridiem:function(n,t,e){return n<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"\u062b\u0627\u0646\u06cc\u0647 d%",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(n){return n.replace(/[\u06f0-\u06f9]/g,function(n){return e[n]}).replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(e("PJh5"))},"2s1U":function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r=n+" ";switch(e){case"s":return t||l?"nekaj sekund":"nekaj sekundami";case"ss":return r+(1===n?t?"sekundo":"sekundi":2===n?t||l?"sekundi":"sekundah":n<5?t||l?"sekunde":"sekundah":"sekund");case"m":return t?"ena minuta":"eno minuto";case"mm":return r+(1===n?t?"minuta":"minuto":2===n?t||l?"minuti":"minutama":n<5?t||l?"minute":"minutami":t||l?"minut":"minutami");case"h":return t?"ena ura":"eno uro";case"hh":return r+(1===n?t?"ura":"uro":2===n?t||l?"uri":"urama":n<5?t||l?"ure":"urami":t||l?"ur":"urami");case"d":return t||l?"en dan":"enim dnem";case"dd":return r+(1===n?t||l?"dan":"dnem":2===n?t||l?"dni":"dnevoma":t||l?"dni":"dnevi");case"M":return t||l?"en mesec":"enim mesecem";case"MM":return r+(1===n?t||l?"mesec":"mesecem":2===n?t||l?"meseca":"mesecema":n<5?t||l?"mesece":"meseci":t||l?"mesecev":"meseci");case"y":return t||l?"eno leto":"enim letom";case"yy":return r+(1===n?t||l?"leto":"letom":2===n?t||l?"leti":"letoma":n<5?t||l?"leta":"leti":t||l?"let":"leti")}}n.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},"3CJN":function(n,t,e){!function(n){"use strict";n.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(n){return/^nm$/i.test(n)},meridiem:function(n,t,e){return n<12?e?"vm":"VM":e?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(n){return n+(1===n||8===n||n>=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},"3IRH":function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},"3K28":function(n,t,e){!function(n){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),e="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),l=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;n.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(n){return n+(1===n||8===n||n>=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},"3LKG":function(n,t,e){!function(n){"use strict";n.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(n){return n},week:{dow:1,doy:4}})}(e("PJh5"))},"3MVc":function(n,t,e){!function(n){"use strict";var t={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},e={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},l=function(n){return 0===n?0:1===n?1:2===n?2:n%100>=3&&n%100<=10?3:n%100>=11?4:5},r={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},i=function(n){return function(t,e,i,o){var s=l(t),a=r[n][l(t)];return 2===s&&(a=a[e?0:1]),a.replace(/%d/i,t)}},o=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];n.defineLocale("ar",{months:o,monthsShort:o,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(n){return"\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:i("s"),ss:i("s"),m:i("m"),mm:i("m"),h:i("h"),hh:i("h"),d:i("d"),dd:i("d"),M:i("M"),MM:i("M"),y:i("y"),yy:i("y")},preparse:function(n){return n.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(n){return e[n]}).replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(e("PJh5"))},"3a3m":function(n,t,e){"use strict";t.a=function(){return function(n){return Object(r.a)()(Object(l.a)(o)(n))}};var l=e("Jwyl"),r=e("0P3J"),i=e("g5jc");function o(){return new i.a}},"3hfc":function(n,t,e){!function(n){"use strict";function t(n,t,e){var l,r;return"m"===e?t?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===e?t?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":n+" "+(l=+n,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:t?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[e].split("_"),l%10==1&&l%100!=11?r[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?r[1]:r[2])}n.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:t,mm:t,h:t,hh:t,d:"\u0434\u0437\u0435\u043d\u044c",dd:t,M:"\u043c\u0435\u0441\u044f\u0446",MM:t,y:"\u0433\u043e\u0434",yy:t},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(n){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(n)},meridiem:function(n,t,e){return n<4?"\u043d\u043e\u0447\u044b":n<12?"\u0440\u0430\u043d\u0456\u0446\u044b":n<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(n,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return n%10!=2&&n%10!=3||n%100==12||n%100==13?n+"-\u044b":n+"-\u0456";case"D":return n+"-\u0433\u0430";default:return n}},week:{dow:1,doy:7}})}(e("PJh5"))},"5Omq":function(n,t,e){!function(n){"use strict";n.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"5SNd":function(n,t,e){!function(n){"use strict";var t={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};n.defineLocale("tg",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u041f\u0430\u0433\u043e\u04b3 \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0448\u0430\u0431"===t?n<4?n:n+12:"\u0441\u0443\u0431\u04b3"===t?n:"\u0440\u04ef\u0437"===t?n>=11?n:n+12:"\u0431\u0435\u0433\u043e\u04b3"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0448\u0430\u0431":n<11?"\u0441\u0443\u0431\u04b3":n<16?"\u0440\u04ef\u0437":n<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(n){return n+(t[n]||t[n%10]||t[n>=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},"5X6E":function(n,t,e){"use strict";t.a=function(n,t){return function(e){return e.lift(new o(n,t))}};var l=e("TToO"),r=e("tZ2B"),i=e("PIsA"),o=function(){function n(n,t){this.project=n,this.resultSelector=t}return n.prototype.call=function(n,t){return t.subscribe(new s(n,this.project,this.resultSelector))},n}(),s=function(n){function t(t,e,l){n.call(this,t),this.project=e,this.resultSelector=l,this.index=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t,e=this.index++;try{t=this.project(n,e)}catch(n){return void this.destination.error(n)}this._innerSub(t,n,e)},t.prototype._innerSub=function(n,t,e){var l=this.innerSubscription;l&&l.unsubscribe(),this.add(this.innerSubscription=Object(i.a)(this,n,t,e))},t.prototype._complete=function(){var t=this.innerSubscription;t&&!t.closed||n.prototype._complete.call(this)},t.prototype._unsubscribe=function(){this.innerSubscription=null},t.prototype.notifyComplete=function(t){this.remove(t),this.innerSubscription=null,this.isStopped&&n.prototype._complete.call(this)},t.prototype.notifyNext=function(n,t,e,l,r){this.resultSelector?this._tryNotifyNext(n,t,e,l):this.destination.next(t)},t.prototype._tryNotifyNext=function(n,t,e,l){var r;try{r=this.resultSelector(n,t,e,l)}catch(n){return void this.destination.error(n)}this.destination.next(r)},t}(r.a)},"5j66":function(n,t,e){!function(n){"use strict";n.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysMin:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},week:{dow:1,doy:4}})}(e("PJh5"))},"5vPg":function(n,t,e){!function(n){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},e={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function l(n,t,e,l){var r="";if(t)switch(e){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":r="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":r="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":r="%d \u0924\u093e\u0938";break;case"d":r="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":r="%d \u0926\u093f\u0935\u0938";break;case"M":r="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":r="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u0947"}else switch(e){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":r="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":r="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":r="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":r="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":r="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":r="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":r="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return r.replace(/%d/i,n)}n.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:l,ss:l,m:l,mm:l,h:l,hh:l,d:l,dd:l,M:l,MM:l,y:l,yy:l},preparse:function(n){return n.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0930\u093e\u0924\u094d\u0930\u0940|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0930\u093e\u0924\u094d\u0930\u0940"===t?n<4?n:n+12:"\u0938\u0915\u093e\u0933\u0940"===t?n:"\u0926\u0941\u092a\u093e\u0930\u0940"===t?n>=10?n:n+12:"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0930\u093e\u0924\u094d\u0930\u0940":n<10?"\u0938\u0915\u093e\u0933\u0940":n<17?"\u0926\u0941\u092a\u093e\u0930\u0940":n<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(e("PJh5"))},"6cf8":function(n,t,e){!function(n){"use strict";var t={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};n.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u0435 \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(n){return n+(t[n]||t[n%10]||t[n>=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},"7LV+":function(n,t,e){!function(n){"use strict";var t="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_");function l(n){return n%10<5&&n%10>1&&~~(n/10)%10!=1}function r(n,t,e){var r=n+" ";switch(e){case"ss":return r+(l(n)?"sekundy":"sekund");case"m":return t?"minuta":"minut\u0119";case"mm":return r+(l(n)?"minuty":"minut");case"h":return t?"godzina":"godzin\u0119";case"hh":return r+(l(n)?"godziny":"godzin");case"MM":return r+(l(n)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return r+(l(n)?"lata":"lat")}}n.defineLocale("pl",{months:function(n,l){return n?""===l?"("+e[n.month()]+"|"+t[n.month()]+")":/D MMMM/.test(l)?e[n.month()]:t[n.month()]:t},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:r,m:r,mm:r,h:r,hh:r,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:r,y:"rok",yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"7MHZ":function(n,t,e){!function(n){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),e="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),l=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;n.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},"7OnE":function(n,t,e){!function(n){"use strict";var t={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},e={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};n.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(n){return"\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(n){return n.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(n){return e[n]}).replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(e("PJh5"))},"7Q8x":function(n,t,e){!function(n){"use strict";n.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(n,t,e){return n<11?"ekuseni":n<15?"emini":n<19?"entsambama":"ebusuku"},meridiemHour:function(n,t){return 12===n&&(n=0),"ekuseni"===t?n:"emini"===t?n>=11?n:n+12:"entsambama"===t||"ebusuku"===t?0===n?0:n+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(e("PJh5"))},"8D5t":function(n,t,e){"use strict";t.a=function(n){return void 0===n&&(n=Number.POSITIVE_INFINITY),Object(l.a)(r.a,null,n)};var l=e("Qnch"),r=e("lAP5")},"8v14":function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[n+" Tage",n+" Tagen"],M:["ein Monat","einem Monat"],MM:[n+" Monate",n+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[n+" Jahre",n+" Jahren"]};return t?r[e][0]:r[e][1]}n.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"9Ocp":function(n,t,e){"use strict";t.a=function(n){return function(t){return 0===n?new o.a:t.lift(new s(n))}};var l=e("TToO"),r=e("OVmG"),i=e("pU/0"),o=e("+3/4"),s=function(){function n(n){if(this.total=n,this.total<0)throw new i.a}return n.prototype.call=function(n,t){return t.subscribe(new a(n,this.total))},n}(),a=function(n){function t(t,e){n.call(this,t),this.total=e,this.count=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t=this.total,e=++this.count;e<=t&&(this.destination.next(n),e===t&&(this.destination.complete(),this.unsubscribe()))},t}(r.a)},ALEw:function(n,t,e){!function(n){"use strict";n.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},AMGY:function(n,t,e){"use strict";(function(n){e.d(t,"a",function(){return i});var l="undefined"!=typeof window&&window,r="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,i=l||"undefined"!=typeof n&&n||r}).call(t,e("DuR2"))},Ab7C:function(n,t,e){!function(n){"use strict";n.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u043e\u0441\u043b\u0435 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(n){var t=n%10,e=n%100;return 0===n?n+"-\u0435\u0432":0===e?n+"-\u0435\u043d":e>10&&e<20?n+"-\u0442\u0438":1===t?n+"-\u0432\u0438":2===t?n+"-\u0440\u0438":7===t||8===t?n+"-\u043c\u0438":n+"-\u0442\u0438"},week:{dow:1,doy:7}})}(e("PJh5"))},AoDM:function(n,t,e){!function(n){"use strict";n.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba"})}(e("PJh5"))},BEem:function(n,t,e){!function(n){"use strict";n.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(e("PJh5"))},BX3T:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=Array.isArray||function(n){return n&&"number"==typeof n.length}},BbgG:function(n,t,e){!function(n){"use strict";n.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?n:"\u4e2d\u5348"===t?n>=11?n:n+12:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?n+12:void 0},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u51cc\u6668":l<900?"\u65e9\u4e0a":l<1130?"\u4e0a\u5348":l<1230?"\u4e2d\u5348":l<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";case"M":return n+"\u6708";case"w":case"W":return n+"\u9031";default:return n}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(e("PJh5"))},Bp2f:function(n,t,e){!function(n){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),e="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),l=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;n.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(n){return n+(1===n||8===n||n>=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},C7av:function(n,t,e){!function(n){"use strict";n.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_m\xe5n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},CFqe:function(n,t,e){!function(n){"use strict";n.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(n,t){return n?"string"==typeof t&&/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[n.month()]:this._monthsNominativeEl[n.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(n,t,e){return n>11?e?"\u03bc\u03bc":"\u039c\u039c":e?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(n){return"\u03bc"===(n+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(n,t){var e,l=this._calendarEl[n],r=t&&t.hours();return((e=l)instanceof Function||"[object Function]"===Object.prototype.toString.call(e))&&(l=l.apply(t)),l.replace("{}",r%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(e("PJh5"))},DDro:function(n,t,e){"use strict";t.a=function(){return Object(l.a)(r,[])};var l=e("/4Bh");function r(n,t,e){return n.push(t),n}},DOkx:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[n+" Tage",n+" Tagen"],M:["ein Monat","einem Monat"],MM:[n+" Monate",n+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[n+" Jahre",n+" Jahren"]};return t?r[e][0]:r[e][1]}n.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},DSXN:function(n,t,e){!function(n){"use strict";n.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(e("PJh5"))},DuR2:function(n,t){var e;e=function(){return this}();try{e=e||Function("return this")()||(0,eval)("this")}catch(n){"object"==typeof window&&(e=window)}n.exports=e},E5SG:function(n,t,e){"use strict";t.a=function(n,t){var e=!1;return arguments.length>=2&&(e=!0),function(l){return l.lift(new i(n,t,e))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n,t,e){void 0===e&&(e=!1),this.accumulator=n,this.seed=t,this.hasSeed=e}return n.prototype.call=function(n,t){return t.subscribe(new o(n,this.accumulator,this.seed,this.hasSeed))},n}(),o=function(n){function t(t,e,l,r){n.call(this,t),this.accumulator=e,this._seed=l,this.hasSeed=r,this.index=0}return Object(l.__extends)(t,n),Object.defineProperty(t.prototype,"seed",{get:function(){return this._seed},set:function(n){this.hasSeed=!0,this._seed=n},enumerable:!0,configurable:!0}),t.prototype._next=function(n){if(this.hasSeed)return this._tryNext(n);this.seed=n,this.destination.next(n)},t.prototype._tryNext=function(n){var t,e=this.index++;try{t=this.accumulator(this.seed,n,e)}catch(n){this.destination.error(n)}this.seed=t,this.destination.next(t)},t}(r.a)},EKta:function(n,t,e){"use strict";t.byteLength=function(n){return 3*n.length/4-u(n)},t.toByteArray=function(n){var t,e,l,o,s,a=n.length;o=u(n),s=new i(3*a/4-o),e=o>0?a-4:a;var c=0;for(t=0;t>16&255,s[c++]=l>>8&255,s[c++]=255&l;return 2===o?(l=r[n.charCodeAt(t)]<<2|r[n.charCodeAt(t+1)]>>4,s[c++]=255&l):1===o&&(l=r[n.charCodeAt(t)]<<10|r[n.charCodeAt(t+1)]<<4|r[n.charCodeAt(t+2)]>>2,s[c++]=l>>8&255,s[c++]=255&l),s},t.fromByteArray=function(n){for(var t,e=n.length,r=e%3,i="",o=[],s=0,a=e-r;sa?a:s+16383));return 1===r?(i+=l[(t=n[e-1])>>2],i+=l[t<<4&63],i+="=="):2===r&&(i+=l[(t=(n[e-2]<<8)+n[e-1])>>10],i+=l[t>>4&63],i+=l[t<<2&63],i+="="),o.push(i),o.join("")};for(var l=[],r=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,a=o.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===n[t-2]?2:"="===n[t-1]?1:0}function c(n,t,e){for(var r,i=[],o=t;o>18&63]+l[r>>12&63]+l[r>>6&63]+l[63&r]);return i.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},ETHv:function(n,t,e){!function(n){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},e={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};n.defineLocale("hi",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(n){return n.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0930\u093e\u0924"===t?n<4?n:n+12:"\u0938\u0941\u092c\u0939"===t?n:"\u0926\u094b\u092a\u0939\u0930"===t?n>=10?n:n+12:"\u0936\u093e\u092e"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0930\u093e\u0924":n<10?"\u0938\u0941\u092c\u0939":n<17?"\u0926\u094b\u092a\u0939\u0930":n<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(e("PJh5"))},EuP9:function(n,t,e){"use strict";(function(n){var l=e("EKta"),r=e("ujcs"),i=e("sOR5");function o(){return a.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(n,t){if(o()=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|n}function f(n,t){if(a.isBuffer(n))return n.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(n)||n instanceof ArrayBuffer))return n.byteLength;"string"!=typeof n&&(n=""+n);var e=n.length;if(0===e)return 0;for(var l=!1;;)switch(t){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":case void 0:return N(n).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*e;case"hex":return e>>>1;case"base64":return F(n).length;default:if(l)return N(n).length;t=(""+t).toLowerCase(),l=!0}}function _(n,t,e){var l=n[t];n[t]=n[e],n[e]=l}function m(n,t,e,l,r){if(0===n.length)return-1;if("string"==typeof e?(l=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,isNaN(e)&&(e=r?0:n.length-1),e<0&&(e=n.length+e),e>=n.length){if(r)return-1;e=n.length-1}else if(e<0){if(!r)return-1;e=0}if("string"==typeof t&&(t=a.from(t,l)),a.isBuffer(t))return 0===t.length?-1:g(n,t,e,l,r);if("number"==typeof t)return t&=255,a.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(n,t,e):Uint8Array.prototype.lastIndexOf.call(n,t,e):g(n,[t],e,l,r);throw new TypeError("val must be string, number or Buffer")}function g(n,t,e,l,r){var i,o=1,s=n.length,a=t.length;if(void 0!==l&&("ucs2"===(l=String(l).toLowerCase())||"ucs-2"===l||"utf16le"===l||"utf-16le"===l)){if(n.length<2||t.length<2)return-1;o=2,s/=2,a/=2,e/=2}function u(n,t){return 1===o?n[t]:n.readUInt16BE(t*o)}if(r){var c=-1;for(i=e;is&&(e=s-a),i=e;i>=0;i--){for(var d=!0,h=0;hr&&(l=r):l=r;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");l>i/2&&(l=i/2);for(var o=0;o>8,r.push(e%256),r.push(l);return r}(t,n.length-e),n,e,l)}function k(n,t,e){return l.fromByteArray(0===t&&e===n.length?n:n.slice(t,e))}function C(n,t,e){e=Math.min(n.length,e);for(var l=[],r=t;r239?4:u>223?3:u>191?2:1;if(r+d<=e)switch(d){case 1:u<128&&(c=u);break;case 2:128==(192&(i=n[r+1]))&&(a=(31&u)<<6|63&i)>127&&(c=a);break;case 3:o=n[r+2],128==(192&(i=n[r+1]))&&128==(192&o)&&(a=(15&u)<<12|(63&i)<<6|63&o)>2047&&(a<55296||a>57343)&&(c=a);break;case 4:o=n[r+2],s=n[r+3],128==(192&(i=n[r+1]))&&128==(192&o)&&128==(192&s)&&(a=(15&u)<<18|(63&i)<<12|(63&o)<<6|63&s)>65535&&a<1114112&&(c=a)}null===c?(c=65533,d=1):c>65535&&(l.push((c-=65536)>>>10&1023|55296),c=56320|1023&c),l.push(c),r+=d}return function(n){var t=n.length;if(t<=S)return String.fromCharCode.apply(String,n);for(var e="",l=0;lthis.length)return"";if((void 0===e||e>this.length)&&(e=this.length),e<=0)return"";if((e>>>=0)<=(t>>>=0))return"";for(n||(n="utf8");;)switch(n){case"hex":return L(this,t,e);case"utf8":case"utf-8":return C(this,t,e);case"ascii":return O(this,t,e);case"latin1":case"binary":return T(this,t,e);case"base64":return k(this,t,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,e);default:if(l)throw new TypeError("Unknown encoding: "+n);n=(n+"").toLowerCase(),l=!0}}).apply(this,arguments)},a.prototype.equals=function(n){if(!a.isBuffer(n))throw new TypeError("Argument must be a Buffer");return this===n||0===a.compare(this,n)},a.prototype.inspect=function(){var n="",e=t.INSPECT_MAX_BYTES;return this.length>0&&(n=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(n+=" ... ")),""},a.prototype.compare=function(n,t,e,l,r){if(!a.isBuffer(n))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===e&&(e=n?n.length:0),void 0===l&&(l=0),void 0===r&&(r=this.length),t<0||e>n.length||l<0||r>this.length)throw new RangeError("out of range index");if(l>=r&&t>=e)return 0;if(l>=r)return-1;if(t>=e)return 1;if(t>>>=0,e>>>=0,l>>>=0,r>>>=0,this===n)return 0;for(var i=r-l,o=e-t,s=Math.min(i,o),u=this.slice(l,r),c=n.slice(t,e),d=0;dr)&&(e=r),n.length>0&&(e<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");l||(l="utf8");for(var i=!1;;)switch(l){case"hex":return y(this,n,t,e);case"utf8":case"utf-8":return b(this,n,t,e);case"ascii":return v(this,n,t,e);case"latin1":case"binary":return w(this,n,t,e);case"base64":return x(this,n,t,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return M(this,n,t,e);default:if(i)throw new TypeError("Unknown encoding: "+l);l=(""+l).toLowerCase(),i=!0}},a.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var S=4096;function O(n,t,e){var l="";e=Math.min(n.length,e);for(var r=t;rr)&&(e=r);for(var i="",o=t;oe)throw new RangeError("Trying to access beyond buffer length")}function A(n,t,e,l,r,i){if(!a.isBuffer(n))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||tn.length)throw new RangeError("Index out of range")}function E(n,t,e,l){t<0&&(t=65535+t+1);for(var r=0,i=Math.min(n.length-e,2);r>>8*(l?r:1-r)}function Y(n,t,e,l){t<0&&(t=4294967295+t+1);for(var r=0,i=Math.min(n.length-e,4);r>>8*(l?r:3-r)&255}function j(n,t,e,l,r,i){if(e+l>n.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function I(n,t,e,l,i){return i||j(n,0,e,4),r.write(n,t,e,l,23,4),e+4}function R(n,t,e,l,i){return i||j(n,0,e,8),r.write(n,t,e,l,52,8),e+8}a.prototype.slice=function(n,t){var e,l=this.length;if(n=~~n,t=void 0===t?l:~~t,n<0?(n+=l)<0&&(n=0):n>l&&(n=l),t<0?(t+=l)<0&&(t=0):t>l&&(t=l),t0&&(r*=256);)l+=this[n+--t]*r;return l},a.prototype.readUInt8=function(n,t){return t||D(n,1,this.length),this[n]},a.prototype.readUInt16LE=function(n,t){return t||D(n,2,this.length),this[n]|this[n+1]<<8},a.prototype.readUInt16BE=function(n,t){return t||D(n,2,this.length),this[n]<<8|this[n+1]},a.prototype.readUInt32LE=function(n,t){return t||D(n,4,this.length),(this[n]|this[n+1]<<8|this[n+2]<<16)+16777216*this[n+3]},a.prototype.readUInt32BE=function(n,t){return t||D(n,4,this.length),16777216*this[n]+(this[n+1]<<16|this[n+2]<<8|this[n+3])},a.prototype.readIntLE=function(n,t,e){n|=0,t|=0,e||D(n,t,this.length);for(var l=this[n],r=1,i=0;++i=(r*=128)&&(l-=Math.pow(2,8*t)),l},a.prototype.readIntBE=function(n,t,e){n|=0,t|=0,e||D(n,t,this.length);for(var l=t,r=1,i=this[n+--l];l>0&&(r*=256);)i+=this[n+--l]*r;return i>=(r*=128)&&(i-=Math.pow(2,8*t)),i},a.prototype.readInt8=function(n,t){return t||D(n,1,this.length),128&this[n]?-1*(255-this[n]+1):this[n]},a.prototype.readInt16LE=function(n,t){t||D(n,2,this.length);var e=this[n]|this[n+1]<<8;return 32768&e?4294901760|e:e},a.prototype.readInt16BE=function(n,t){t||D(n,2,this.length);var e=this[n+1]|this[n]<<8;return 32768&e?4294901760|e:e},a.prototype.readInt32LE=function(n,t){return t||D(n,4,this.length),this[n]|this[n+1]<<8|this[n+2]<<16|this[n+3]<<24},a.prototype.readInt32BE=function(n,t){return t||D(n,4,this.length),this[n]<<24|this[n+1]<<16|this[n+2]<<8|this[n+3]},a.prototype.readFloatLE=function(n,t){return t||D(n,4,this.length),r.read(this,n,!0,23,4)},a.prototype.readFloatBE=function(n,t){return t||D(n,4,this.length),r.read(this,n,!1,23,4)},a.prototype.readDoubleLE=function(n,t){return t||D(n,8,this.length),r.read(this,n,!0,52,8)},a.prototype.readDoubleBE=function(n,t){return t||D(n,8,this.length),r.read(this,n,!1,52,8)},a.prototype.writeUIntLE=function(n,t,e,l){n=+n,t|=0,e|=0,l||A(this,n,t,e,Math.pow(2,8*e)-1,0);var r=1,i=0;for(this[t]=255&n;++i=0&&(i*=256);)this[t+r]=n/i&255;return t+e},a.prototype.writeUInt8=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,1,255,0),a.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),this[t]=255&n,t+1},a.prototype.writeUInt16LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=255&n,this[t+1]=n>>>8):E(this,n,t,!0),t+2},a.prototype.writeUInt16BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>8,this[t+1]=255&n):E(this,n,t,!1),t+2},a.prototype.writeUInt32LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t+3]=n>>>24,this[t+2]=n>>>16,this[t+1]=n>>>8,this[t]=255&n):Y(this,n,t,!0),t+4},a.prototype.writeUInt32BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>24,this[t+1]=n>>>16,this[t+2]=n>>>8,this[t+3]=255&n):Y(this,n,t,!1),t+4},a.prototype.writeIntLE=function(n,t,e,l){if(n=+n,t|=0,!l){var r=Math.pow(2,8*e-1);A(this,n,t,e,r-1,-r)}var i=0,o=1,s=0;for(this[t]=255&n;++i>0)-s&255;return t+e},a.prototype.writeIntBE=function(n,t,e,l){if(n=+n,t|=0,!l){var r=Math.pow(2,8*e-1);A(this,n,t,e,r-1,-r)}var i=e-1,o=1,s=0;for(this[t+i]=255&n;--i>=0&&(o*=256);)n<0&&0===s&&0!==this[t+i+1]&&(s=1),this[t+i]=(n/o>>0)-s&255;return t+e},a.prototype.writeInt8=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,1,127,-128),a.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),n<0&&(n=255+n+1),this[t]=255&n,t+1},a.prototype.writeInt16LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=255&n,this[t+1]=n>>>8):E(this,n,t,!0),t+2},a.prototype.writeInt16BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>8,this[t+1]=255&n):E(this,n,t,!1),t+2},a.prototype.writeInt32LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[t]=255&n,this[t+1]=n>>>8,this[t+2]=n>>>16,this[t+3]=n>>>24):Y(this,n,t,!0),t+4},a.prototype.writeInt32BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,2147483647,-2147483648),n<0&&(n=4294967295+n+1),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>24,this[t+1]=n>>>16,this[t+2]=n>>>8,this[t+3]=255&n):Y(this,n,t,!1),t+4},a.prototype.writeFloatLE=function(n,t,e){return I(this,n,t,!0,e)},a.prototype.writeFloatBE=function(n,t,e){return I(this,n,t,!1,e)},a.prototype.writeDoubleLE=function(n,t,e){return R(this,n,t,!0,e)},a.prototype.writeDoubleBE=function(n,t,e){return R(this,n,t,!1,e)},a.prototype.copy=function(n,t,e,l){if(e||(e=0),l||0===l||(l=this.length),t>=n.length&&(t=n.length),t||(t=0),l>0&&l=this.length)throw new RangeError("sourceStart out of bounds");if(l<0)throw new RangeError("sourceEnd out of bounds");l>this.length&&(l=this.length),n.length-t=0;--r)n[r+t]=this[r+e];else if(i<1e3||!a.TYPED_ARRAY_SUPPORT)for(r=0;r>>=0,e=void 0===e?this.length:e>>>0,n||(n=0),"number"==typeof n)for(i=t;i55295&&e<57344){if(!r){if(e>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(o+1===l){(t-=3)>-1&&i.push(239,191,189);continue}r=e;continue}if(e<56320){(t-=3)>-1&&i.push(239,191,189),r=e;continue}e=65536+(r-55296<<10|e-56320)}else r&&(t-=3)>-1&&i.push(239,191,189);if(r=null,e<128){if((t-=1)<0)break;i.push(e)}else if(e<2048){if((t-=2)<0)break;i.push(e>>6|192,63&e|128)}else if(e<65536){if((t-=3)<0)break;i.push(e>>12|224,e>>6&63|128,63&e|128)}else{if(!(e<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}}return i}function F(n){return l.toByteArray(function(n){if((n=function(n){return n.trim?n.trim():n.replace(/^\s+|\s+$/g,"")}(n).replace(H,"")).length<2)return"";for(;n.length%4!=0;)n+="=";return n}(n))}function B(n,t,e,l){for(var r=0;r=t.length||r>=n.length);++r)t[r+e]=n[r];return r}}).call(t,e("DuR2"))},"F+2e":function(n,t,e){!function(n){"use strict";var t={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},e={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};n.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(n){return n.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},week:{dow:1,doy:4}})}(e("PJh5"))},FKXc:function(n,t,e){!function(n){"use strict";n.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(n){return(/^[0-9].+$/.test(n)?"tra":"in")+" "+n},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},FRPF:function(n,t,e){!function(n){"use strict";n.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(e("PJh5"))},FlzV:function(n,t,e){!function(n){"use strict";n.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},Fpqq:function(n,t,e){!function(n){"use strict";n.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"e":1===t?"a":2===t?"a":"e")},week:{dow:1,doy:4}})}(e("PJh5"))},Frex:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[n+" Tage",n+" Tagen"],M:["ein Monat","einem Monat"],MM:[n+" Monate",n+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[n+" Jahre",n+" Jahren"]};return t?r[e][0]:r[e][1]}n.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},FuaP:function(n,t,e){!function(n){"use strict";n.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(n){return 0===n.indexOf("un")?"n"+n:"en "+n},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},"G++c":function(n,t,e){!function(n){"use strict";n.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(n,t){return 12===n&&(n=0),"pagi"===t?n:"tengahari"===t?n>=11?n:n+12:"petang"===t||"malam"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"pagi":n<15?"tengahari":n<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(e("PJh5"))},GK6M:function(n,t,e){"use strict";t.a=function(n){return l=n,i};var l,r=e("fKB6");function i(){try{return l.apply(this,arguments)}catch(n){return r.a.e=n,r.a}}},GrS7:function(n,t,e){!function(n){"use strict";n.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(n){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(n)},meridiem:function(n){return n<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":n<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":n<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(n,t){switch(t){case"DDD":case"w":case"W":case"DDDo":return 1===n?n+"-\u056b\u0576":n+"-\u0580\u0564";default:return n}},week:{dow:1,doy:7}})}(e("PJh5"))},HdCx:function(n,t,e){"use strict";t.a=function(n,t){return function(e){if("function"!=typeof n)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return e.lift(new i(n,t))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n,t){this.project=n,this.thisArg=t}return n.prototype.call=function(n,t){return t.subscribe(new o(n,this.project,this.thisArg))},n}(),o=function(n){function t(t,e,l){n.call(this,t),this.project=e,this.count=0,this.thisArg=l||this}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t;try{t=this.project.call(this.thisArg,n,this.count++)}catch(n){return void this.destination.error(n)}this.destination.next(t)},t}(r.a)},INcR:function(n,t,e){!function(n){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),e="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");n.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsParseExact:!0,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"MMMM [de] D [de] YYYY",LLL:"MMMM [de] D [de] YYYY h:mm A",LLLL:"dddd, MMMM [de] D [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(e("PJh5"))},Jnfr:function(n,t){function e(n){return Promise.resolve().then(function(){throw new Error("Cannot find module '"+n+"'.")})}e.keys=function(){return[]},e.resolve=e,n.exports=e,e.id="Jnfr"},JwiF:function(n,t,e){!function(n){"use strict";n.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(n,t){return 12===n&&(n=0),"enjing"===t?n:"siyang"===t?n>=11?n:n+12:"sonten"===t||"ndalu"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"enjing":n<15?"siyang":n<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(e("PJh5"))},Jwyl:function(n,t,e){"use strict";var l=e("TToO"),r=e("g5jc"),i=e("YaPU"),o=(e("OVmG"),e("VwZZ")),s=e("0P3J"),a=function(n){function t(t,e){n.call(this),this.source=t,this.subjectFactory=e,this._refCount=0,this._isComplete=!1}return Object(l.__extends)(t,n),t.prototype._subscribe=function(n){return this.getSubject().subscribe(n)},t.prototype.getSubject=function(){var n=this._subject;return n&&!n.isStopped||(this._subject=this.subjectFactory()),this._subject},t.prototype.connect=function(){var n=this._connection;return n||(this._isComplete=!1,(n=this._connection=new o.a).add(this.source.subscribe(new c(this.getSubject(),this))),n.closed?(this._connection=null,n=o.a.EMPTY):this._connection=n),n},t.prototype.refCount=function(){return Object(s.a)()(this)},t}(i.a).prototype,u={operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:a._subscribe},_isComplete:{value:a._isComplete,writable:!0},getSubject:{value:a.getSubject},connect:{value:a.connect},refCount:{value:a.refCount}},c=function(n){function t(t,e){n.call(this,t),this.connectable=e}return Object(l.__extends)(t,n),t.prototype._error=function(t){this._unsubscribe(),n.prototype._error.call(this,t)},t.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),n.prototype._complete.call(this)},t.prototype._unsubscribe=function(){var n=this.connectable;if(n){this.connectable=null;var t=n._connection;n._refCount=0,n._subject=null,n._connection=null,t&&t.unsubscribe()}},t}(r.b);t.a=function(n,t){return function(e){var l;if(l="function"==typeof n?n:function(){return n},"function"==typeof t)return e.lift(new d(l,t));var r=Object.create(e,u);return r.source=e,r.subjectFactory=l,r}};var d=function(){function n(n,t){this.subjectFactory=n,this.selector=t}return n.prototype.call=function(n,t){var e=this.selector,l=this.subjectFactory(),r=e(l).subscribe(n);return r.add(t.subscribe(l)),r},n}()},LT9G:function(n,t,e){!function(n){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),e="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),l=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;n.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},Lgqo:function(n,t,e){!function(n){"use strict";n.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(n){return n+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(n){return"\u0db4.\u0dc0."===n||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===n},meridiem:function(n,t,e){return n>11?e?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":e?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(e("PJh5"))},N3vo:function(n,t,e){!function(n){"use strict";n.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(n){return n+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(n)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(n)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(e("PJh5"))},N4j0:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=function(n){return n&&"number"==typeof n.length}},Nd3h:function(n,t,e){!function(n){"use strict";n.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_a\u016dg_sep_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(n){return"p"===n.charAt(0).toLowerCase()},meridiem:function(n,t,e){return n>11?e?"p.t.m.":"P.T.M.":e?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"sekundoj",ss:"%d sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(e("PJh5"))},Nlnz:function(n,t,e){!function(n){"use strict";n.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===t?n<4?n:n+12:"\u0c09\u0c26\u0c2f\u0c02"===t?n:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===t?n>=10?n:n+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":n<10?"\u0c09\u0c26\u0c2f\u0c02":n<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":n<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(e("PJh5"))},Nzt2:function(n,t,e){!function(n){"use strict";n.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(n){return 2===n?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":n+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(n){return 2===n?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":n+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(n){return 2===n?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":n+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(n){return 2===n?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":n%10==0&&10!==n?n+" \u05e9\u05e0\u05d4":n+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(n){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(n)},meridiem:function(n,t,e){return n<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":n<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":n<12?e?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":n<18?e?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(e("PJh5"))},ORgI:function(n,t,e){!function(n){"use strict";n.defineLocale("ja",{months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(n){return"\u5348\u5f8c"===n},meridiem:function(n,t,e){return n<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:"[\u6765\u9031]dddd LT",lastDay:"[\u6628\u65e5] LT",lastWeek:"[\u524d\u9031]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";default:return n}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}})}(e("PJh5"))},OSsP:function(n,t,e){!function(n){"use strict";function t(n,t,e){return n+" "+function(n,t){return 2===t?function(n){var t={m:"v",b:"v",d:"z"};return void 0===t[n.charAt(0)]?n:t[n.charAt(0)]+n.substring(1)}(n):n}({mm:"munutenn",MM:"miz",dd:"devezh"}[e],n)}n.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:t,h:"un eur",hh:"%d eur",d:"un devezh",dd:t,M:"ur miz",MM:t,y:"ur bloaz",yy:function(n){switch(function n(t){return t>9?n(t%10):t}(n)){case 1:case 3:case 4:case 5:case 9:return n+" bloaz";default:return n+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(n){return n+(1===n?"a\xf1":"vet")},week:{dow:1,doy:4}})}(e("PJh5"))},OUMt:function(n,t,e){!function(n){"use strict";var t="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),e="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function l(n){return n>1&&n<5}function r(n,t,e,r){var i=n+" ";switch(e){case"s":return t||r?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return t||r?i+(l(n)?"sekundy":"sek\xfand"):i+"sekundami";case"m":return t?"min\xfata":r?"min\xfatu":"min\xfatou";case"mm":return t||r?i+(l(n)?"min\xfaty":"min\xfat"):i+"min\xfatami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?i+(l(n)?"hodiny":"hod\xedn"):i+"hodinami";case"d":return t||r?"de\u0148":"d\u0148om";case"dd":return t||r?i+(l(n)?"dni":"dn\xed"):i+"d\u0148ami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?i+(l(n)?"mesiace":"mesiacov"):i+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?i+(l(n)?"roky":"rokov"):i+"rokmi"}}n.defineLocale("sk",{months:t,monthsShort:e,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},OVPi:function(n,t,e){!function(n){"use strict";n.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minutt",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0i",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},OVmG:function(n,t,e){"use strict";e.d(t,"a",function(){return a});var l=e("TToO"),r=e("/iUD"),i=e("VwZZ"),o=e("t7NR"),s=e("tLDX"),a=function(n){function t(e,l,r){switch(n.call(this),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=o.a;break;case 1:if(!e){this.destination=o.a;break}if("object"==typeof e){e instanceof t?(this.syncErrorThrowable=e.syncErrorThrowable,this.destination=e,this.destination.add(this)):(this.syncErrorThrowable=!0,this.destination=new u(this,e));break}default:this.syncErrorThrowable=!0,this.destination=new u(this,e,l,r)}}return Object(l.__extends)(t,n),t.prototype[s.a]=function(){return this},t.create=function(n,e,l){var r=new t(n,e,l);return r.syncErrorThrowable=!1,r},t.prototype.next=function(n){this.isStopped||this._next(n)},t.prototype.error=function(n){this.isStopped||(this.isStopped=!0,this._error(n))},t.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,n.prototype.unsubscribe.call(this))},t.prototype._next=function(n){this.destination.next(n)},t.prototype._error=function(n){this.destination.error(n),this.unsubscribe()},t.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},t.prototype._unsubscribeAndRecycle=function(){var n=this._parent,t=this._parents;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=n,this._parents=t,this},t}(i.a),u=function(n){function t(t,e,l,i){var s;n.call(this),this._parentSubscriber=t;var a=this;Object(r.a)(e)?s=e:e&&(s=e.next,l=e.error,i=e.complete,e!==o.a&&(a=Object.create(e),Object(r.a)(a.unsubscribe)&&this.add(a.unsubscribe.bind(a)),a.unsubscribe=this.unsubscribe.bind(this))),this._context=a,this._next=s,this._error=l,this._complete=i}return Object(l.__extends)(t,n),t.prototype.next=function(n){if(!this.isStopped&&this._next){var t=this._parentSubscriber;t.syncErrorThrowable?this.__tryOrSetError(t,this._next,n)&&this.unsubscribe():this.__tryOrUnsub(this._next,n)}},t.prototype.error=function(n){if(!this.isStopped){var t=this._parentSubscriber;if(this._error)t.syncErrorThrowable?(this.__tryOrSetError(t,this._error,n),this.unsubscribe()):(this.__tryOrUnsub(this._error,n),this.unsubscribe());else{if(!t.syncErrorThrowable)throw this.unsubscribe(),n;t.syncErrorValue=n,t.syncErrorThrown=!0,this.unsubscribe()}}},t.prototype.complete=function(){var n=this;if(!this.isStopped){var t=this._parentSubscriber;if(this._complete){var e=function(){return n._complete.call(n._context)};t.syncErrorThrowable?(this.__tryOrSetError(t,e),this.unsubscribe()):(this.__tryOrUnsub(e),this.unsubscribe())}else this.unsubscribe()}},t.prototype.__tryOrUnsub=function(n,t){try{n.call(this._context,t)}catch(n){throw this.unsubscribe(),n}},t.prototype.__tryOrSetError=function(n,t,e){try{t.call(this._context,e)}catch(t){return n.syncErrorValue=t,n.syncErrorThrown=!0,!0}return!1},t.prototype._unsubscribe=function(){var n=this._parentSubscriber;this._context=null,this._parentSubscriber=null,n.unsubscribe()},t}(a)},PIsA:function(n,t,e){"use strict";var l=e("AMGY"),r=e("N4j0"),i=e("cQXm"),o=e("dgOU"),s=e("YaPU"),a=e("etqZ"),u=e("TToO"),c=function(n){function t(t,e,l){n.call(this),this.parent=t,this.outerValue=e,this.outerIndex=l,this.index=0}return Object(u.__extends)(t,n),t.prototype._next=function(n){this.parent.notifyNext(this.outerValue,n,this.outerIndex,this.index++,this)},t.prototype._error=function(n){this.parent.notifyError(n,this),this.unsubscribe()},t.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},t}(e("OVmG").a),d=e("+CnV");t.a=function(n,t,e,u){var h=new c(n,e,u);if(h.closed)return null;if(t instanceof s.a)return t._isScalar?(h.next(t.value),h.complete(),null):(h.syncErrorThrowable=!0,t.subscribe(h));if(Object(r.a)(t)){for(var p=0,f=t.length;p>>0,l=0;l0)for(e=0;e=0?e?"+":"":"-")+Math.pow(10,Math.max(0,t-l.length)).toString().substr(1)+l}var F=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,B=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,V={},W={};function z(n,t,e,l){var r=l;"string"==typeof l&&(r=function(){return this[l]()}),n&&(W[n]=r),t&&(W[t[0]]=function(){return N(r.apply(this,arguments),t[1],t[2])}),e&&(W[e]=function(){return this.localeData().ordinal(r.apply(this,arguments),n)})}function U(n,t){return n.isValid()?(t=G(t,n.localeData()),V[t]=V[t]||function(n){var t,e,l,r=n.match(F);for(t=0,e=r.length;t=0&&B.test(n);)n=n.replace(B,l),B.lastIndex=0,e-=1;return n}var q=/\d/,J=/\d\d/,Q=/\d{3}/,K=/\d{4}/,X=/[+-]?\d{6}/,Z=/\d\d?/,$=/\d\d\d\d?/,nn=/\d\d\d\d\d\d?/,tn=/\d{1,3}/,en=/\d{1,4}/,ln=/[+-]?\d{1,6}/,rn=/\d+/,on=/[+-]?\d+/,sn=/Z|[+-]\d\d:?\d\d/gi,an=/Z|[+-]\d\d(?::?\d\d)?/gi,un=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,cn={};function dn(n,t,e){cn[n]=P(t)?t:function(n,l){return n&&e?e:t}}function hn(n,t){return d(cn,n)?cn[n](t._strict,t._locale):new RegExp(pn(n.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(n,t,e,l,r){return t||e||l||r})))}function pn(n){return n.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var fn={};function _n(n,t){var e,l=t;for("string"==typeof n&&(n=[n]),a(t)&&(l=function(n,e){e[t]=M(n)}),e=0;e68?1900:2e3)};var Ln,Pn=Dn("FullYear",!0);function Dn(n,t){return function(e){return null!=e?(En(this,n,e),r.updateOffset(this,t),this):An(this,n)}}function An(n,t){return n.isValid()?n._d["get"+(n._isUTC?"UTC":"")+t]():NaN}function En(n,t,e){n.isValid()&&!isNaN(e)&&("FullYear"===t&&Tn(n.year())&&1===n.month()&&29===n.date()?n._d["set"+(n._isUTC?"UTC":"")+t](e,n.month(),Yn(e,n.month())):n._d["set"+(n._isUTC?"UTC":"")+t](e))}function Yn(n,t){if(isNaN(n)||isNaN(t))return NaN;var e=(t%12+12)%12;return n+=(t-e)/12,1===e?Tn(n)?29:28:31-e%7%2}Ln=Array.prototype.indexOf?Array.prototype.indexOf:function(n){var t;for(t=0;t=0&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(n),t}function zn(n,t,e){var l=7+t-e;return-(7+Wn(n,0,l).getUTCDay()-t)%7+l-1}function Un(n,t,e,l,r){var i,o,s=1+7*(t-1)+(7+e-l)%7+zn(n,l,r);return s<=0?o=On(i=n-1)+s:s>On(n)?(i=n+1,o=s-On(n)):(i=n,o=s),{year:i,dayOfYear:o}}function Gn(n,t,e){var l,r,i=zn(n.year(),t,e),o=Math.floor((n.dayOfYear()-i-1)/7)+1;return o<1?l=o+qn(r=n.year()-1,t,e):o>qn(n.year(),t,e)?(l=o-qn(n.year(),t,e),r=n.year()+1):(r=n.year(),l=o),{week:l,year:r}}function qn(n,t,e){var l=zn(n,t,e),r=zn(n+1,t,e);return(On(n)-l+r)/7}z("w",["ww",2],"wo","week"),z("W",["WW",2],"Wo","isoWeek"),Y("week","w"),Y("isoWeek","W"),H("week",5),H("isoWeek",5),dn("w",Z),dn("ww",Z,J),dn("W",Z),dn("WW",Z,J),mn(["w","ww","W","WW"],function(n,t,e,l){t[l.substr(0,1)]=M(n)}),z("d",0,"do","day"),z("dd",0,0,function(n){return this.localeData().weekdaysMin(this,n)}),z("ddd",0,0,function(n){return this.localeData().weekdaysShort(this,n)}),z("dddd",0,0,function(n){return this.localeData().weekdays(this,n)}),z("e",0,0,"weekday"),z("E",0,0,"isoWeekday"),Y("day","d"),Y("weekday","e"),Y("isoWeekday","E"),H("day",11),H("weekday",11),H("isoWeekday",11),dn("d",Z),dn("e",Z),dn("E",Z),dn("dd",function(n,t){return t.weekdaysMinRegex(n)}),dn("ddd",function(n,t){return t.weekdaysShortRegex(n)}),dn("dddd",function(n,t){return t.weekdaysRegex(n)}),mn(["dd","ddd","dddd"],function(n,t,e,l){var r=e._locale.weekdaysParse(n,l,e._strict);null!=r?t.d=r:f(e).invalidWeekday=n}),mn(["d","e","E"],function(n,t,e,l){t[l]=M(n)});var Jn="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Qn="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Kn="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Xn=un,Zn=un,$n=un;function nt(){function n(n,t){return t.length-n.length}var t,e,l,r,i,o=[],s=[],a=[],u=[];for(t=0;t<7;t++)e=p([2e3,1]).day(t),l=this.weekdaysMin(e,""),r=this.weekdaysShort(e,""),i=this.weekdays(e,""),o.push(l),s.push(r),a.push(i),u.push(l),u.push(r),u.push(i);for(o.sort(n),s.sort(n),a.sort(n),u.sort(n),t=0;t<7;t++)s[t]=pn(s[t]),a[t]=pn(a[t]),u[t]=pn(u[t]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function tt(){return this.hours()%12||12}function et(n,t){z(n,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function lt(n,t){return t._meridiemParse}z("H",["HH",2],0,"hour"),z("h",["hh",2],0,tt),z("k",["kk",2],0,function(){return this.hours()||24}),z("hmm",0,0,function(){return""+tt.apply(this)+N(this.minutes(),2)}),z("hmmss",0,0,function(){return""+tt.apply(this)+N(this.minutes(),2)+N(this.seconds(),2)}),z("Hmm",0,0,function(){return""+this.hours()+N(this.minutes(),2)}),z("Hmmss",0,0,function(){return""+this.hours()+N(this.minutes(),2)+N(this.seconds(),2)}),et("a",!0),et("A",!1),Y("hour","h"),H("hour",13),dn("a",lt),dn("A",lt),dn("H",Z),dn("h",Z),dn("k",Z),dn("HH",Z,J),dn("hh",Z,J),dn("kk",Z,J),dn("hmm",$),dn("hmmss",nn),dn("Hmm",$),dn("Hmmss",nn),_n(["H","HH"],wn),_n(["k","kk"],function(n,t,e){var l=M(n);t[wn]=24===l?0:l}),_n(["a","A"],function(n,t,e){e._isPm=e._locale.isPM(n),e._meridiem=n}),_n(["h","hh"],function(n,t,e){t[wn]=M(n),f(e).bigHour=!0}),_n("hmm",function(n,t,e){var l=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l)),f(e).bigHour=!0}),_n("hmmss",function(n,t,e){var l=n.length-4,r=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l,2)),t[Mn]=M(n.substr(r)),f(e).bigHour=!0}),_n("Hmm",function(n,t,e){var l=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l))}),_n("Hmmss",function(n,t,e){var l=n.length-4,r=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l,2)),t[Mn]=M(n.substr(r))});var rt,it=Dn("Hours",!0),ot={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:In,monthsShort:Rn,week:{dow:0,doy:6},weekdays:Jn,weekdaysMin:Kn,weekdaysShort:Qn,meridiemParse:/[ap]\.?m?\.?/i},st={},at={};function ut(n){return n?n.toLowerCase().replace("_","-"):n}function ct(t){var l=null;if(!st[t]&&"undefined"!=typeof n&&n&&n.exports)try{l=rt._abbr,e("uslO")("./"+t),dt(l)}catch(n){}return st[t]}function dt(n,t){var e;return n&&((e=s(t)?pt(n):ht(n,t))?rt=e:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+n+" not found. Did you forget to load it?")),rt._abbr}function ht(n,t){if(null!==t){var e,l=ot;if(t.abbr=n,null!=st[n])L("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),l=st[n]._config;else if(null!=t.parentLocale)if(null!=st[t.parentLocale])l=st[t.parentLocale]._config;else{if(null==(e=ct(t.parentLocale)))return at[t.parentLocale]||(at[t.parentLocale]=[]),at[t.parentLocale].push({name:n,config:t}),null;l=e._config}return st[n]=new A(D(l,t)),at[n]&&at[n].forEach(function(n){ht(n.name,n.config)}),dt(n),st[n]}return delete st[n],null}function pt(n){var t;if(n&&n._locale&&n._locale._abbr&&(n=n._locale._abbr),!n)return rt;if(!i(n)){if(t=ct(n))return t;n=[n]}return function(n){for(var t,e,l,r,i=0;i0;){if(l=ct(r.slice(0,t).join("-")))return l;if(e&&e.length>=t&&k(r,e,!0)>=t-1)break;t--}i++}return rt}(n)}function ft(n){var t,e=n._a;return e&&-2===f(n).overflow&&(t=e[bn]<0||e[bn]>11?bn:e[vn]<1||e[vn]>Yn(e[yn],e[bn])?vn:e[wn]<0||e[wn]>24||24===e[wn]&&(0!==e[xn]||0!==e[Mn]||0!==e[kn])?wn:e[xn]<0||e[xn]>59?xn:e[Mn]<0||e[Mn]>59?Mn:e[kn]<0||e[kn]>999?kn:-1,f(n)._overflowDayOfYear&&(tvn)&&(t=vn),f(n)._overflowWeeks&&-1===t&&(t=Cn),f(n)._overflowWeekday&&-1===t&&(t=Sn),f(n).overflow=t),n}function _t(n,t,e){return null!=n?n:null!=t?t:e}function mt(n){var t,e,l,i,o,s=[];if(!n._d){for(l=function(n){var t=new Date(r.now());return n._useUTC?[t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()]:[t.getFullYear(),t.getMonth(),t.getDate()]}(n),n._w&&null==n._a[vn]&&null==n._a[bn]&&function(n){var t,e,l,r,i,o,s,a;if(null!=(t=n._w).GG||null!=t.W||null!=t.E)i=1,o=4,e=_t(t.GG,n._a[yn],Gn(Pt(),1,4).year),l=_t(t.W,1),((r=_t(t.E,1))<1||r>7)&&(a=!0);else{i=n._locale._week.dow,o=n._locale._week.doy;var u=Gn(Pt(),i,o);e=_t(t.gg,n._a[yn],u.year),l=_t(t.w,u.week),null!=t.d?((r=t.d)<0||r>6)&&(a=!0):null!=t.e?(r=t.e+i,(t.e<0||t.e>6)&&(a=!0)):r=i}l<1||l>qn(e,i,o)?f(n)._overflowWeeks=!0:null!=a?f(n)._overflowWeekday=!0:(s=Un(e,l,r,i,o),n._a[yn]=s.year,n._dayOfYear=s.dayOfYear)}(n),null!=n._dayOfYear&&(o=_t(n._a[yn],l[yn]),(n._dayOfYear>On(o)||0===n._dayOfYear)&&(f(n)._overflowDayOfYear=!0),e=Wn(o,0,n._dayOfYear),n._a[bn]=e.getUTCMonth(),n._a[vn]=e.getUTCDate()),t=0;t<3&&null==n._a[t];++t)n._a[t]=s[t]=l[t];for(;t<7;t++)n._a[t]=s[t]=null==n._a[t]?2===t?1:0:n._a[t];24===n._a[wn]&&0===n._a[xn]&&0===n._a[Mn]&&0===n._a[kn]&&(n._nextDay=!0,n._a[wn]=0),n._d=(n._useUTC?Wn:function(n,t,e,l,r,i,o){var s=new Date(n,t,e,l,r,i,o);return n<100&&n>=0&&isFinite(s.getFullYear())&&s.setFullYear(n),s}).apply(null,s),i=n._useUTC?n._d.getUTCDay():n._d.getDay(),null!=n._tzm&&n._d.setUTCMinutes(n._d.getUTCMinutes()-n._tzm),n._nextDay&&(n._a[wn]=24),n._w&&"undefined"!=typeof n._w.d&&n._w.d!==i&&(f(n).weekdayMismatch=!0)}}var gt=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,yt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,bt=/Z|[+-]\d\d(?::?\d\d)?/,vt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],wt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],xt=/^\/?Date\((\-?\d+)/i;function Mt(n){var t,e,l,r,i,o,s=n._i,a=gt.exec(s)||yt.exec(s);if(a){for(f(n).iso=!0,t=0,e=vt.length;t0&&f(n).unusedInput.push(o),s=s.slice(s.indexOf(e)+e.length),u+=e.length),W[i]?(e?f(n).empty=!1:f(n).unusedTokens.push(i),gn(i,e,n)):n._strict&&!e&&f(n).unusedTokens.push(i);f(n).charsLeftOver=a-u,s.length>0&&f(n).unusedInput.push(s),n._a[wn]<=12&&!0===f(n).bigHour&&n._a[wn]>0&&(f(n).bigHour=void 0),f(n).parsedDateParts=n._a.slice(0),f(n).meridiem=n._meridiem,n._a[wn]=(c=n._locale,d=n._a[wn],null==(h=n._meridiem)?d:null!=c.meridiemHour?c.meridiemHour(d,h):null!=c.isPM?((p=c.isPM(h))&&d<12&&(d+=12),p||12!==d||(d=0),d):d),mt(n),ft(n)}else St(n);else Mt(n);var c,d,h,p}function Tt(n){var t=n._i,e=n._f;return n._locale=n._locale||pt(n._l),null===t||void 0===e&&""===t?m({nullInput:!0}):("string"==typeof t&&(n._i=t=n._locale.preparse(t)),w(t)?new v(ft(t)):(u(t)?n._d=t:i(e)?function(n){var t,e,l,r,i;if(0===n._f.length)return f(n).invalidFormat=!0,void(n._d=new Date(NaN));for(r=0;rthis?this:n:m()});function Et(n,t){var e,l;if(1===t.length&&i(t[0])&&(t=t[0]),!t.length)return Pt();for(e=t[0],l=1;l(i=qn(n,l,r))&&(t=i),(function(n,t,e,l,r){var i=Un(n,t,e,l,r),o=Wn(i.year,0,i.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}).call(this,n,t,e,l,r))}z(0,["gg",2],0,function(){return this.weekYear()%100}),z(0,["GG",2],0,function(){return this.isoWeekYear()%100}),le("gggg","weekYear"),le("ggggg","weekYear"),le("GGGG","isoWeekYear"),le("GGGGG","isoWeekYear"),Y("weekYear","gg"),Y("isoWeekYear","GG"),H("weekYear",1),H("isoWeekYear",1),dn("G",on),dn("g",on),dn("GG",Z,J),dn("gg",Z,J),dn("GGGG",en,K),dn("gggg",en,K),dn("GGGGG",ln,X),dn("ggggg",ln,X),mn(["gggg","ggggg","GGGG","GGGGG"],function(n,t,e,l){t[l.substr(0,2)]=M(n)}),mn(["gg","GG"],function(n,t,e,l){t[l]=r.parseTwoDigitYear(n)}),z("Q",0,"Qo","quarter"),Y("quarter","Q"),H("quarter",7),dn("Q",q),_n("Q",function(n,t){t[bn]=3*(M(n)-1)}),z("D",["DD",2],"Do","date"),Y("date","D"),H("date",9),dn("D",Z),dn("DD",Z,J),dn("Do",function(n,t){return n?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),_n(["D","DD"],vn),_n("Do",function(n,t){t[vn]=M(n.match(Z)[0])});var ie=Dn("Date",!0);z("DDD",["DDDD",3],"DDDo","dayOfYear"),Y("dayOfYear","DDD"),H("dayOfYear",4),dn("DDD",tn),dn("DDDD",Q),_n(["DDD","DDDD"],function(n,t,e){e._dayOfYear=M(n)}),z("m",["mm",2],0,"minute"),Y("minute","m"),H("minute",14),dn("m",Z),dn("mm",Z,J),_n(["m","mm"],xn);var oe=Dn("Minutes",!1);z("s",["ss",2],0,"second"),Y("second","s"),H("second",15),dn("s",Z),dn("ss",Z,J),_n(["s","ss"],Mn);var se,ae=Dn("Seconds",!1);for(z("S",0,0,function(){return~~(this.millisecond()/100)}),z(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),z(0,["SSS",3],0,"millisecond"),z(0,["SSSS",4],0,function(){return 10*this.millisecond()}),z(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),z(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),z(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),z(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),z(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),Y("millisecond","ms"),H("millisecond",16),dn("S",tn,q),dn("SS",tn,J),dn("SSS",tn,Q),se="SSSS";se.length<=9;se+="S")dn(se,rn);function ue(n,t){t[kn]=M(1e3*("0."+n))}for(se="S";se.length<=9;se+="S")_n(se,ue);var ce=Dn("Milliseconds",!1);z("z",0,0,"zoneAbbr"),z("zz",0,0,"zoneName");var de=v.prototype;function he(n){return n}de.add=Xt,de.calendar=function(n,t){var e=n||Pt(),l=Bt(e,this).startOf("day"),i=r.calendarFormat(this,l)||"sameElse",o=t&&(P(t[i])?t[i].call(this,e):t[i]);return this.format(o||this.localeData().calendar(i,this,Pt(e)))},de.clone=function(){return new v(this)},de.diff=function(n,t,e){var l,r,i;if(!this.isValid())return NaN;if(!(l=Bt(n,this)).isValid())return NaN;switch(r=6e4*(l.utcOffset()-this.utcOffset()),t=j(t)){case"year":i=$t(this,l)/12;break;case"month":i=$t(this,l);break;case"quarter":i=$t(this,l)/3;break;case"second":i=(this-l)/1e3;break;case"minute":i=(this-l)/6e4;break;case"hour":i=(this-l)/36e5;break;case"day":i=(this-l-r)/864e5;break;case"week":i=(this-l-r)/6048e5;break;default:i=this-l}return e?i:x(i)},de.endOf=function(n){return void 0===(n=j(n))||"millisecond"===n?this:("date"===n&&(n="day"),this.startOf(n).add(1,"isoWeek"===n?"week":n).subtract(1,"ms"))},de.format=function(n){n||(n=this.isUtc()?r.defaultFormatUtc:r.defaultFormat);var t=U(this,n);return this.localeData().postformat(t)},de.from=function(n,t){return this.isValid()&&(w(n)&&n.isValid()||Pt(n).isValid())?Gt({to:this,from:n}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},de.fromNow=function(n){return this.from(Pt(),n)},de.to=function(n,t){return this.isValid()&&(w(n)&&n.isValid()||Pt(n).isValid())?Gt({from:this,to:n}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},de.toNow=function(n){return this.to(Pt(),n)},de.get=function(n){return P(this[n=j(n)])?this[n]():this},de.invalidAt=function(){return f(this).overflow},de.isAfter=function(n,t){var e=w(n)?n:Pt(n);return!(!this.isValid()||!e.isValid())&&("millisecond"===(t=j(s(t)?"millisecond":t))?this.valueOf()>e.valueOf():e.valueOf()9999?U(e,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):P(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(e,"Z")):U(e,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},de.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var n="moment",t="";this.isLocal()||(n=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var e="["+n+'("]',l=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY";return this.format(e+l+"-MM-DD[T]HH:mm:ss.SSS"+t+'[")]')},de.toJSON=function(){return this.isValid()?this.toISOString():null},de.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},de.unix=function(){return Math.floor(this.valueOf()/1e3)},de.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},de.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},de.year=Pn,de.isLeapYear=function(){return Tn(this.year())},de.weekYear=function(n){return re.call(this,n,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},de.isoWeekYear=function(n){return re.call(this,n,this.isoWeek(),this.isoWeekday(),1,4)},de.quarter=de.quarters=function(n){return null==n?Math.ceil((this.month()+1)/3):this.month(3*(n-1)+this.month()%3)},de.month=Nn,de.daysInMonth=function(){return Yn(this.year(),this.month())},de.week=de.weeks=function(n){var t=this.localeData().week(this);return null==n?t:this.add(7*(n-t),"d")},de.isoWeek=de.isoWeeks=function(n){var t=Gn(this,1,4).week;return null==n?t:this.add(7*(n-t),"d")},de.weeksInYear=function(){var n=this.localeData()._week;return qn(this.year(),n.dow,n.doy)},de.isoWeeksInYear=function(){return qn(this.year(),1,4)},de.date=ie,de.day=de.days=function(n){if(!this.isValid())return null!=n?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=n?(n=function(n,t){return"string"!=typeof n?n:isNaN(n)?"number"==typeof(n=t.weekdaysParse(n))?n:null:parseInt(n,10)}(n,this.localeData()),this.add(n-t,"d")):t},de.weekday=function(n){if(!this.isValid())return null!=n?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==n?t:this.add(n-t,"d")},de.isoWeekday=function(n){if(!this.isValid())return null!=n?this:NaN;if(null!=n){var t=function(n,t){return"string"==typeof n?t.weekdaysParse(n)%7||7:isNaN(n)?null:n}(n,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7},de.dayOfYear=function(n){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==n?t:this.add(n-t,"d")},de.hour=de.hours=it,de.minute=de.minutes=oe,de.second=de.seconds=ae,de.millisecond=de.milliseconds=ce,de.utcOffset=function(n,t,e){var l,i=this._offset||0;if(!this.isValid())return null!=n?this:NaN;if(null!=n){if("string"==typeof n){if(null===(n=Ft(an,n)))return this}else Math.abs(n)<16&&!e&&(n*=60);return!this._isUTC&&t&&(l=Vt(this)),this._offset=n,this._isUTC=!0,null!=l&&this.add(l,"m"),i!==n&&(!t||this._changeInProgress?Kt(this,Gt(n-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,r.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?i:Vt(this)},de.utc=function(n){return this.utcOffset(0,n)},de.local=function(n){return this._isUTC&&(this.utcOffset(0,n),this._isUTC=!1,n&&this.subtract(Vt(this),"m")),this},de.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var n=Ft(sn,this._i);null!=n?this.utcOffset(n):this.utcOffset(0,!0)}return this},de.hasAlignedHourOffset=function(n){return!!this.isValid()&&(n=n?Pt(n).utcOffset():0,(this.utcOffset()-n)%60==0)},de.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},de.isLocal=function(){return!!this.isValid()&&!this._isUTC},de.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},de.isUtc=Wt,de.isUTC=Wt,de.zoneAbbr=function(){return this._isUTC?"UTC":""},de.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},de.dates=S("dates accessor is deprecated. Use date instead.",ie),de.months=S("months accessor is deprecated. Use month instead",Nn),de.years=S("years accessor is deprecated. Use year instead",Pn),de.zone=S("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(n,t){return null!=n?("string"!=typeof n&&(n=-n),this.utcOffset(n,t),this):-this.utcOffset()}),de.isDSTShifted=S("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var n={};if(y(n,this),(n=Tt(n))._a){var t=n._isUTC?p(n._a):Pt(n._a);this._isDSTShifted=this.isValid()&&k(n._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var pe=A.prototype;function fe(n,t,e,l){var r=pt(),i=p().set(l,t);return r[e](i,n)}function _e(n,t,e){if(a(n)&&(t=n,n=void 0),n=n||"",null!=t)return fe(n,t,e,"month");var l,r=[];for(l=0;l<12;l++)r[l]=fe(n,l,e,"month");return r}function me(n,t,e,l){"boolean"==typeof n?(a(t)&&(e=t,t=void 0),t=t||""):(e=t=n,n=!1,a(t)&&(e=t,t=void 0),t=t||"");var r,i=pt(),o=n?i._week.dow:0;if(null!=e)return fe(t,(e+o)%7,l,"day");var s=[];for(r=0;r<7;r++)s[r]=fe(t,(r+o)%7,l,"day");return s}pe.calendar=function(n,t,e){var l=this._calendar[n]||this._calendar.sameElse;return P(l)?l.call(t,e):l},pe.longDateFormat=function(n){var t=this._longDateFormat[n],e=this._longDateFormat[n.toUpperCase()];return t||!e?t:(this._longDateFormat[n]=e.replace(/MMMM|MM|DD|dddd/g,function(n){return n.slice(1)}),this._longDateFormat[n])},pe.invalidDate=function(){return this._invalidDate},pe.ordinal=function(n){return this._ordinal.replace("%d",n)},pe.preparse=he,pe.postformat=he,pe.relativeTime=function(n,t,e,l){var r=this._relativeTime[e];return P(r)?r(n,t,e,l):r.replace(/%d/i,n)},pe.pastFuture=function(n,t){var e=this._relativeTime[n>0?"future":"past"];return P(e)?e(t):e.replace(/%s/i,t)},pe.set=function(n){var t,e;for(e in n)P(t=n[e])?this[e]=t:this["_"+e]=t;this._config=n,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},pe.months=function(n,t){return n?i(this._months)?this._months[n.month()]:this._months[(this._months.isFormat||jn).test(t)?"format":"standalone"][n.month()]:i(this._months)?this._months:this._months.standalone},pe.monthsShort=function(n,t){return n?i(this._monthsShort)?this._monthsShort[n.month()]:this._monthsShort[jn.test(t)?"format":"standalone"][n.month()]:i(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},pe.monthsParse=function(n,t,e){var l,r,i;if(this._monthsParseExact)return(function(n,t,e){var l,r,i,o=n.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],l=0;l<12;++l)i=p([2e3,l]),this._shortMonthsParse[l]=this.monthsShort(i,"").toLocaleLowerCase(),this._longMonthsParse[l]=this.months(i,"").toLocaleLowerCase();return e?"MMM"===t?-1!==(r=Ln.call(this._shortMonthsParse,o))?r:null:-1!==(r=Ln.call(this._longMonthsParse,o))?r:null:"MMM"===t?-1!==(r=Ln.call(this._shortMonthsParse,o))?r:-1!==(r=Ln.call(this._longMonthsParse,o))?r:null:-1!==(r=Ln.call(this._longMonthsParse,o))?r:-1!==(r=Ln.call(this._shortMonthsParse,o))?r:null}).call(this,n,t,e);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),l=0;l<12;l++){if(r=p([2e3,l]),e&&!this._longMonthsParse[l]&&(this._longMonthsParse[l]=new RegExp("^"+this.months(r,"").replace(".","")+"$","i"),this._shortMonthsParse[l]=new RegExp("^"+this.monthsShort(r,"").replace(".","")+"$","i")),e||this._monthsParse[l]||(i="^"+this.months(r,"")+"|^"+this.monthsShort(r,""),this._monthsParse[l]=new RegExp(i.replace(".",""),"i")),e&&"MMMM"===t&&this._longMonthsParse[l].test(n))return l;if(e&&"MMM"===t&&this._shortMonthsParse[l].test(n))return l;if(!e&&this._monthsParse[l].test(n))return l}},pe.monthsRegex=function(n){return this._monthsParseExact?(d(this,"_monthsRegex")||Vn.call(this),n?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=Bn),this._monthsStrictRegex&&n?this._monthsStrictRegex:this._monthsRegex)},pe.monthsShortRegex=function(n){return this._monthsParseExact?(d(this,"_monthsRegex")||Vn.call(this),n?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=Fn),this._monthsShortStrictRegex&&n?this._monthsShortStrictRegex:this._monthsShortRegex)},pe.week=function(n){return Gn(n,this._week.dow,this._week.doy).week},pe.firstDayOfYear=function(){return this._week.doy},pe.firstDayOfWeek=function(){return this._week.dow},pe.weekdays=function(n,t){return n?i(this._weekdays)?this._weekdays[n.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][n.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone},pe.weekdaysMin=function(n){return n?this._weekdaysMin[n.day()]:this._weekdaysMin},pe.weekdaysShort=function(n){return n?this._weekdaysShort[n.day()]:this._weekdaysShort},pe.weekdaysParse=function(n,t,e){var l,r,i;if(this._weekdaysParseExact)return(function(n,t,e){var l,r,i,o=n.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],l=0;l<7;++l)i=p([2e3,1]).day(l),this._minWeekdaysParse[l]=this.weekdaysMin(i,"").toLocaleLowerCase(),this._shortWeekdaysParse[l]=this.weekdaysShort(i,"").toLocaleLowerCase(),this._weekdaysParse[l]=this.weekdays(i,"").toLocaleLowerCase();return e?"dddd"===t?-1!==(r=Ln.call(this._weekdaysParse,o))?r:null:"ddd"===t?-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:null:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:null:"dddd"===t?-1!==(r=Ln.call(this._weekdaysParse,o))?r:-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:null:"ddd"===t?-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:-1!==(r=Ln.call(this._weekdaysParse,o))?r:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:null:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:-1!==(r=Ln.call(this._weekdaysParse,o))?r:-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:null}).call(this,n,t,e);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),l=0;l<7;l++){if(r=p([2e3,1]).day(l),e&&!this._fullWeekdaysParse[l]&&(this._fullWeekdaysParse[l]=new RegExp("^"+this.weekdays(r,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[l]=new RegExp("^"+this.weekdaysShort(r,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[l]=new RegExp("^"+this.weekdaysMin(r,"").replace(".",".?")+"$","i")),this._weekdaysParse[l]||(i="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[l]=new RegExp(i.replace(".",""),"i")),e&&"dddd"===t&&this._fullWeekdaysParse[l].test(n))return l;if(e&&"ddd"===t&&this._shortWeekdaysParse[l].test(n))return l;if(e&&"dd"===t&&this._minWeekdaysParse[l].test(n))return l;if(!e&&this._weekdaysParse[l].test(n))return l}},pe.weekdaysRegex=function(n){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||nt.call(this),n?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Xn),this._weekdaysStrictRegex&&n?this._weekdaysStrictRegex:this._weekdaysRegex)},pe.weekdaysShortRegex=function(n){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||nt.call(this),n?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Zn),this._weekdaysShortStrictRegex&&n?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},pe.weekdaysMinRegex=function(n){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||nt.call(this),n?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=$n),this._weekdaysMinStrictRegex&&n?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},pe.isPM=function(n){return"p"===(n+"").toLowerCase().charAt(0)},pe.meridiem=function(n,t,e){return n>11?e?"pm":"PM":e?"am":"AM"},dt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(n){var t=n%10;return n+(1===M(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),r.lang=S("moment.lang is deprecated. Use moment.locale instead.",dt),r.langData=S("moment.langData is deprecated. Use moment.localeData instead.",pt);var ge=Math.abs;function ye(n,t,e,l){var r=Gt(t,e);return n._milliseconds+=l*r._milliseconds,n._days+=l*r._days,n._months+=l*r._months,n._bubble()}function be(n){return n<0?Math.floor(n):Math.ceil(n)}function ve(n){return 4800*n/146097}function we(n){return 146097*n/4800}function xe(n){return function(){return this.as(n)}}var Me=xe("ms"),ke=xe("s"),Ce=xe("m"),Se=xe("h"),Oe=xe("d"),Te=xe("w"),Le=xe("M"),Pe=xe("y");function De(n){return function(){return this.isValid()?this._data[n]:NaN}}var Ae=De("milliseconds"),Ee=De("seconds"),Ye=De("minutes"),je=De("hours"),Ie=De("days"),Re=De("months"),He=De("years"),Ne=Math.round,Fe={ss:44,s:45,m:45,h:22,d:26,M:11},Be=Math.abs;function Ve(n){return(n>0)-(n<0)||+n}function We(){if(!this.isValid())return this.localeData().invalidDate();var n,t,e=Be(this._milliseconds)/1e3,l=Be(this._days),r=Be(this._months);t=x((n=x(e/60))/60),e%=60,n%=60;var i=x(r/12),o=r%=12,s=l,a=t,u=n,c=e?e.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var h=d<0?"-":"",p=Ve(this._months)!==Ve(d)?"-":"",f=Ve(this._days)!==Ve(d)?"-":"",_=Ve(this._milliseconds)!==Ve(d)?"-":"";return h+"P"+(i?p+i+"Y":"")+(o?p+o+"M":"")+(s?f+s+"D":"")+(a||u||c?"T":"")+(a?_+a+"H":"")+(u?_+u+"M":"")+(c?_+c+"S":"")}var ze=jt.prototype;return ze.isValid=function(){return this._isValid},ze.abs=function(){var n=this._data;return this._milliseconds=ge(this._milliseconds),this._days=ge(this._days),this._months=ge(this._months),n.milliseconds=ge(n.milliseconds),n.seconds=ge(n.seconds),n.minutes=ge(n.minutes),n.hours=ge(n.hours),n.months=ge(n.months),n.years=ge(n.years),this},ze.add=function(n,t){return ye(this,n,t,1)},ze.subtract=function(n,t){return ye(this,n,t,-1)},ze.as=function(n){if(!this.isValid())return NaN;var t,e,l=this._milliseconds;if("month"===(n=j(n))||"year"===n)return e=this._months+ve(t=this._days+l/864e5),"month"===n?e:e/12;switch(t=this._days+Math.round(we(this._months)),n){case"week":return t/7+l/6048e5;case"day":return t+l/864e5;case"hour":return 24*t+l/36e5;case"minute":return 1440*t+l/6e4;case"second":return 86400*t+l/1e3;case"millisecond":return Math.floor(864e5*t)+l;default:throw new Error("Unknown unit "+n)}},ze.asMilliseconds=Me,ze.asSeconds=ke,ze.asMinutes=Ce,ze.asHours=Se,ze.asDays=Oe,ze.asWeeks=Te,ze.asMonths=Le,ze.asYears=Pe,ze.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*M(this._months/12):NaN},ze._bubble=function(){var n,t,e,l,r,i=this._milliseconds,o=this._days,s=this._months,a=this._data;return i>=0&&o>=0&&s>=0||i<=0&&o<=0&&s<=0||(i+=864e5*be(we(s)+o),o=0,s=0),a.milliseconds=i%1e3,n=x(i/1e3),a.seconds=n%60,t=x(n/60),a.minutes=t%60,e=x(t/60),a.hours=e%24,s+=r=x(ve(o+=x(e/24))),o-=be(we(r)),l=x(s/12),s%=12,a.days=o,a.months=s,a.years=l,this},ze.clone=function(){return Gt(this)},ze.get=function(n){return n=j(n),this.isValid()?this[n+"s"]():NaN},ze.milliseconds=Ae,ze.seconds=Ee,ze.minutes=Ye,ze.hours=je,ze.days=Ie,ze.weeks=function(){return x(this.days()/7)},ze.months=Re,ze.years=He,ze.humanize=function(n){if(!this.isValid())return this.localeData().invalidDate();var t=this.localeData(),e=function(n,t,e){var l=Gt(n).abs(),r=Ne(l.as("s")),i=Ne(l.as("m")),o=Ne(l.as("h")),s=Ne(l.as("d")),a=Ne(l.as("M")),u=Ne(l.as("y")),c=r<=Fe.ss&&["s",r]||r0,c[4]=e,(function(n,t,e,l,r){return r.relativeTime(t||1,!!e,n,l)}).apply(null,c)}(this,!n,t);return n&&(e=t.pastFuture(+this,e)),t.postformat(e)},ze.toISOString=We,ze.toString=We,ze.toJSON=We,ze.locale=ne,ze.localeData=ee,ze.toIsoString=S("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",We),ze.lang=te,z("X",0,0,"unix"),z("x",0,0,"valueOf"),dn("x",on),dn("X",/[+-]?\d+(\.\d{1,3})?/),_n("X",function(n,t,e){e._d=new Date(1e3*parseFloat(n,10))}),_n("x",function(n,t,e){e._d=new Date(M(n))}),r.version="2.21.0",t=Pt,r.fn=de,r.min=function(){return Et("isBefore",[].slice.call(arguments,0))},r.max=function(){return Et("isAfter",[].slice.call(arguments,0))},r.now=function(){return Date.now?Date.now():+new Date},r.utc=p,r.unix=function(n){return Pt(1e3*n)},r.months=function(n,t){return _e(n,t,"months")},r.isDate=u,r.locale=dt,r.invalid=m,r.duration=Gt,r.isMoment=w,r.weekdays=function(n,t,e){return me(n,t,e,"weekdays")},r.parseZone=function(){return Pt.apply(null,arguments).parseZone()},r.localeData=pt,r.isDuration=It,r.monthsShort=function(n,t){return _e(n,t,"monthsShort")},r.weekdaysMin=function(n,t,e){return me(n,t,e,"weekdaysMin")},r.defineLocale=ht,r.updateLocale=function(n,t){if(null!=t){var e,l,r=ot;null!=(l=ct(n))&&(r=l._config),(e=new A(t=D(r,t))).parentLocale=st[n],st[n]=e,dt(n)}else null!=st[n]&&(null!=st[n].parentLocale?st[n]=st[n].parentLocale:null!=st[n]&&delete st[n]);return st[n]},r.locales=function(){return O(st)},r.weekdaysShort=function(n,t,e){return me(n,t,e,"weekdaysShort")},r.normalizeUnits=j,r.relativeTimeRounding=function(n){return void 0===n?Ne:"function"==typeof n&&(Ne=n,!0)},r.relativeTimeThreshold=function(n,t){return void 0!==Fe[n]&&(void 0===t?Fe[n]:(Fe[n]=t,"s"===n&&(Fe.ss=t-1),!0))},r.calendarFormat=function(n,t){var e=n.diff(t,"days",!0);return e<-6?"sameElse":e<-1?"lastWeek":e<0?"lastDay":e<1?"sameDay":e<2?"nextDay":e<7?"nextWeek":"sameElse"},r.prototype=de,r.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},r}()}).call(t,e("3IRH")(n))},QZk1:function(n,t,e){!function(n){"use strict";n.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}})}(e("PJh5"))},Qnch:function(n,t,e){"use strict";t.a=function(n,t,e){return void 0===e&&(e=Number.POSITIVE_INFINITY),function(l){return"number"==typeof t&&(e=t,t=null),l.lift(new o(n,t,e))}};var l=e("TToO"),r=e("PIsA"),i=e("tZ2B"),o=function(){function n(n,t,e){void 0===e&&(e=Number.POSITIVE_INFINITY),this.project=n,this.resultSelector=t,this.concurrent=e}return n.prototype.call=function(n,t){return t.subscribe(new s(n,this.project,this.resultSelector,this.concurrent))},n}(),s=function(n){function t(t,e,l,r){void 0===r&&(r=Number.POSITIVE_INFINITY),n.call(this,t),this.project=e,this.resultSelector=l,this.concurrent=r,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){this.active0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},t}(i.a)},RMhj:function(n,t,e){var l={"./en.json":["TKku",5],"./es.json":["/YBz",4],"./es_base.json":["0v8u",3],"./ru.json":["P+VX",2],"./zh.json":["ODm5",1],"./zh_base.json":["dXVM",0]};function r(n){var t=l[n];return t?e.e(t[1]).then(function(){return e(t[0])}):Promise.reject(new Error("Cannot find module '"+n+"'."))}r.keys=function(){return Object.keys(l)},r.id="RMhj",n.exports=r},Rf9G:function(n,t,e){"use strict";t.a=function(){return Object(l.a)()(this)};var l=e("3a3m")},RnJI:function(n,t,e){!function(n){"use strict";n.defineLocale("ka",{months:{standalone:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),format:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10e1_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10e1_\u10db\u10d0\u10e0\u10e2\u10e1_\u10d0\u10de\u10e0\u10d8\u10da\u10d8\u10e1_\u10db\u10d0\u10d8\u10e1\u10e1_\u10d8\u10d5\u10dc\u10d8\u10e1\u10e1_\u10d8\u10d5\u10da\u10d8\u10e1\u10e1_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10e1_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10e1_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10e1".split("_")},monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(n){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10ec\u10d4\u10da\u10d8)/.test(n)?n.replace(/\u10d8$/,"\u10e8\u10d8"):n+"\u10e8\u10d8"},past:function(n){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(n)?n.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10e3\u10d9\u10d0\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(n)?n.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10e3\u10d9\u10d0\u10dc"):void 0},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(n){return 0===n?n:1===n?n+"-\u10da\u10d8":n<20||n<=100&&n%20==0||n%100==0?"\u10db\u10d4-"+n:n+"-\u10d4"},week:{dow:1,doy:7}})}(e("PJh5"))},Sjoy:function(n,t,e){!function(n){"use strict";n.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},T1Dh:function(n,t,e){"use strict";t.a=function(n){return function(t){return 0===n?new o.a:t.lift(new s(n))}};var l=e("TToO"),r=e("OVmG"),i=e("pU/0"),o=e("+3/4"),s=function(){function n(n){if(this.total=n,this.total<0)throw new i.a}return n.prototype.call=function(n,t){return t.subscribe(new a(n,this.total))},n}(),a=function(n){function t(t,e){n.call(this,t),this.total=e,this.ring=new Array,this.count=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t=this.ring,e=this.total,l=this.count++;t.length0)for(var e=this.count>=this.total?this.total:this.count,l=this.ring,r=0;r=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},t.__param=function(n,t){return function(e,l){t(e,l,n)}},t.__metadata=function(n,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(n,t)},t.__awaiter=function(n,t,e,l){return new(e||(e=Promise))(function(r,i){function o(n){try{a(l.next(n))}catch(n){i(n)}}function s(n){try{a(l.throw(n))}catch(n){i(n)}}function a(n){n.done?r(n.value):new e(function(t){t(n.value)}).then(o,s)}a((l=l.apply(n,t||[])).next())})},t.__generator=function(n,t){var e,l,r,i,o={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(e)throw new TypeError("Generator is already executing.");for(;o;)try{if(e=1,l&&(r=l[2&i[0]?"return":i[0]?"throw":"next"])&&!(r=r.call(l,i[1])).done)return r;switch(l=0,r&&(i=[0,r.value]),i[0]){case 0:case 1:r=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,l=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(r=(r=o.trys).length>0&&r[r.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]1||a(n,t)})})}function a(n,t){try{(e=r[n](t)).value instanceof s?Promise.resolve(e.value.v).then(u,c):d(i[0][2],e)}catch(n){d(i[0][3],n)}var e}function u(n){a("next",n)}function c(n){a("throw",n)}function d(n,t){n(t),i.shift(),i.length&&a(i[0][0],i[0][1])}},t.__asyncDelegator=function(n){var t,e;return t={},l("next"),l("throw",function(n){throw n}),l("return"),t[Symbol.iterator]=function(){return this},t;function l(l,r){n[l]&&(t[l]=function(t){return(e=!e)?{value:s(n[l](t)),done:"return"===l}:r?r(t):t})}},t.__asyncValues=function(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=n[Symbol.asyncIterator];return t?t.call(n):"function"==typeof i?i(n):n[Symbol.iterator]()},t.__makeTemplateObject=function(n,t){return Object.defineProperty?Object.defineProperty(n,"raw",{value:t}):n.raw=t,n};var l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,t){n.__proto__=t}||function(n,t){for(var e in t)t.hasOwnProperty(e)&&(n[e]=t[e])},r=Object.assign||function(n){for(var t,e=1,l=arguments.length;e=n.length&&(n=void 0),{value:n&&n[e++],done:!n}}}}function o(n,t){var e="function"==typeof Symbol&&n[Symbol.iterator];if(!e)return n;var l,r,i=e.call(n),o=[];try{for(;(void 0===t||t-- >0)&&!(l=i.next()).done;)o.push(l.value)}catch(n){r={error:n}}finally{try{l&&!l.done&&(e=i.return)&&e.call(i)}finally{if(r)throw r.error}}return o}function s(n){return this instanceof s?(this.v=n,this):new s(n)}},To0v:function(n,t,e){!function(n){"use strict";n.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===t||"\u0633\u06d5\u06be\u06d5\u0631"===t||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===t?n:"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"===t||"\u0643\u06d5\u0686"===t?n+12:n>=11?n:n+12},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":l<900?"\u0633\u06d5\u06be\u06d5\u0631":l<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":l<1230?"\u0686\u06c8\u0634":l<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return n+"-\u06be\u06d5\u067e\u062a\u06d5";default:return n}},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(e("PJh5"))},Tqun:function(n,t,e){!function(n){"use strict";n.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}})}(e("PJh5"))},Uter:function(n,t,e){const l=e("X3l8").Buffer;n.exports=function(n){if(n.length>=255)throw new TypeError("Alphabet too long");const t=new Uint8Array(256);t.fill(255);for(let l=0;l>>0,c=new Uint8Array(u);for(;n[o];){let l=t[n.charCodeAt(o)];if(255===l)return;let r=0;for(let n=u-1;(0!==l||r>>0)%256>>>0,l=l/256>>>0;if(0!==l)throw new Error("Non-zero carry");a=r,o++}if(" "===n[o])return;let d=u-a;for(;d!==u&&0===c[d];)d++;const h=l.allocUnsafe(s+(u-d));h.fill(0,0,s);let p=s;for(;d!==u;)h[p++]=c[d++];return h}return{encode:function(t){if(!l.isBuffer(t))throw new TypeError("Expected Buffer");if(0===t.length)return"";let i=0,s=0,a=0;const u=t.length;for(;a!==u&&0===t[a];)a++,i++;const c=(u-a)*o+1>>>0,d=new Uint8Array(c);for(;a!==u;){let n=t[a],l=0;for(let t=c-1;(0!==n||l>>0)%e>>>0,n=n/e>>>0;if(0!==n)throw new Error("Non-zero carry");s=l,a++}let h=c-s;for(;h!==c&&0===d[h];)h++;let p=r.repeat(i);for(;h1?new t(n,l):1===r?new i.a(n[0],l):new o.a(l)},t.dispatch=function(n){var t=n.array,e=n.index,l=n.subscriber;e>=n.count?l.complete():(l.next(t[e]),l.closed||(n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.array,l=e.length,r=this.scheduler;if(r)return r.schedule(t.dispatch,0,{array:e,index:0,count:l,subscriber:n});for(var i=0;i=11?n:n+12},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u51cc\u6668":l<900?"\u65e9\u4e0a":l<1130?"\u4e0a\u5348":l<1230?"\u4e2d\u5348":l<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";case"M":return n+"\u6708";case"w":case"W":return n+"\u5468";default:return n}},relativeTime:{future:"%s\u5185",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(e("PJh5"))},WT6e:function(n,t,e){"use strict";(function(n){e.d(t,"g",function(){return ot}),e.d(t,"V",function(){return $n}),e.d(t,"Y",function(){return nt}),e.d(t,"U",function(){return et}),e.d(t,"A",function(){return tt}),e.d(t,"c",function(){return hn}),e.d(t,"E",function(){return _n}),e.d(t,"D",function(){return mn}),e.d(t,"b",function(){return gn}),e.d(t,"d",function(){return cn}),e.d(t,"e",function(){return dn}),e.d(t,"X",function(){return Ot}),e.d(t,"P",function(){return Un}),e.d(t,"_0",function(){return qn}),e.d(t,"w",function(){return Kt}),e.d(t,"f",function(){return ne}),e.d(t,"o",function(){return Rn}),e.d(t,"n",function(){return sn}),e.d(t,"J",function(){return ee}),e.d(t,"K",function(){return te}),e.d(t,"a",function(){return _}),e.d(t,"k",function(){return m}),e.d(t,"t",function(){return y}),e.d(t,"F",function(){return g}),e.d(t,"S",function(){return b}),e.d(t,"Q",function(){return v}),e.d(t,"W",function(){return j}),e.d(t,"s",function(){return F}),e.d(t,"r",function(){return a}),e.d(t,"p",function(){return x}),e.d(t,"C",function(){return M}),e.d(t,"q",function(){return k}),e.d(t,"L",function(){return S}),e.d(t,"B",function(){return Hn}),e.d(t,"G",function(){return ct}),e.d(t,"H",function(){return at}),e.d(t,"I",function(){return ut}),e.d(t,"i",function(){return vn}),e.d(t,"j",function(){return Tn}),e.d(t,"l",function(){return dt}),e.d(t,"x",function(){return An}),e.d(t,"z",function(){return Dn}),e.d(t,"y",function(){return ht}),e.d(t,"M",function(){return mt}),e.d(t,"N",function(){return ft}),e.d(t,"O",function(){return yt}),e.d(t,"R",function(){return bt}),e.d(t,"m",function(){return wt}),e.d(t,"h",function(){return vt}),e.d(t,"u",function(){return zt}),e.d(t,"v",function(){return Ut}),e.d(t,"T",function(){return Pt}),e.d(t,"Z",function(){return Qt}),e.d(t,"_13",function(){return At}),e.d(t,"_2",function(){return yn}),e.d(t,"_1",function(){return Ln}),e.d(t,"_10",function(){return L}),e.d(t,"_16",function(){return E}),e.d(t,"_30",function(){return Y}),e.d(t,"_14",function(){return un}),e.d(t,"_15",function(){return an}),e.d(t,"_3",function(){return Qe}),e.d(t,"_4",function(){return Ke}),e.d(t,"_5",function(){return _l}),e.d(t,"_6",function(){return wi}),e.d(t,"_7",function(){return ve}),e.d(t,"_8",function(){return Hl}),e.d(t,"_9",function(){return Xe}),e.d(t,"_12",function(){return qe}),e.d(t,"_18",function(){return ol}),e.d(t,"_19",function(){return il}),e.d(t,"_21",function(){return or}),e.d(t,"_22",function(){return Sl}),e.d(t,"_25",function(){return Nl}),e.d(t,"_28",function(){return Fl}),e.d(t,"_24",function(){return ur}),e.d(t,"_26",function(){return cr}),e.d(t,"_27",function(){return ar}),e.d(t,"_29",function(){return tr}),e.d(t,"_31",function(){return hr}),e.d(t,"_32",function(){return ge}),e.d(t,"_33",function(){return _r}),e.d(t,"_17",function(){return Xt}),e.d(t,"_20",function(){return Zt}),e.d(t,"_23",function(){return $t}),e.d(t,"_11",function(){return pn});var l=e("TToO"),r=e("YaPU"),i=e("/nXB"),o=e("Rf9G"),s=e("g5jc"),a=function(){function n(n){this._desc=n,this.ngMetadataName="InjectionToken"}return n.prototype.toString=function(){return"InjectionToken "+this._desc},n}(),u="__annotations__",c="__paramaters__",d="__prop__metadata__";function h(n,t,e,l){var r=p(t);function i(n){if(this instanceof i)return r.call(this,n),this;var t=new i(n),e=function(n){return(n.hasOwnProperty(u)?n[u]:Object.defineProperty(n,u,{value:[]})[u]).push(t),n};return l&&l(e),e}return e&&(i.prototype=Object.create(e.prototype)),i.prototype.ngMetadataName=n,i.annotationCls=i,i}function p(n){return function(){for(var t=[],e=0;e ");else if("object"==typeof t){var r=[];for(var i in t)if(t.hasOwnProperty(i)){var o=t[i];r.push(i+":"+("string"==typeof o?JSON.stringify(o):Y(o)))}l="{"+r.join(", ")+"}"}return"StaticInjectorError"+(e?"("+e+")":"")+"["+l+"]: "+n.replace(J,"\n ")}function $(n,t){return new Error(Z(n,t))}var nn="ngDebugContext",tn="ngOriginalError",en="ngErrorLogger";function ln(n){return n[nn]}function rn(n){return n[tn]}function on(n){for(var t=[],e=1;e0)n._bootstrapComponents.forEach(function(n){return t.bootstrap(n)});else{if(!n.instance.ngDoBootstrap)throw new Error("The module "+Y(n.instance.constructor)+' was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.');n.instance.ngDoBootstrap(t)}this._modules.push(n)},n.prototype.onDestroy=function(n){this._destroyListeners.push(n)},Object.defineProperty(n.prototype,"injector",{get:function(){return this._injector},enumerable:!0,configurable:!0}),n.prototype.destroy=function(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(function(n){return n.destroy()}),this._destroyListeners.forEach(function(n){return n()}),this._destroyed=!0},Object.defineProperty(n.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!0,configurable:!0}),n}();function it(n,t){return Array.isArray(t)?t.reduce(it,n):Object(l.__assign)({},n,t)}var ot=function(){function n(n,t,e,l,s,a){var u=this;this._zone=n,this._console=t,this._injector=e,this._exceptionHandler=l,this._componentFactoryResolver=s,this._initStatus=a,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._enforceNoNewChanges=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._enforceNoNewChanges=nt(),this._zone.onMicrotaskEmpty.subscribe({next:function(){u._zone.run(function(){u.tick()})}});var c=new r.a(function(n){u._stable=u._zone.isStable&&!u._zone.hasPendingMacrotasks&&!u._zone.hasPendingMicrotasks,u._zone.runOutsideAngular(function(){n.next(u._stable),n.complete()})}),d=new r.a(function(n){var t;u._zone.runOutsideAngular(function(){t=u._zone.onStable.subscribe(function(){Hn.assertNotInAngularZone(),A(function(){u._stable||u._zone.hasPendingMacrotasks||u._zone.hasPendingMicrotasks||(u._stable=!0,n.next(!0))})})});var e=u._zone.onUnstable.subscribe(function(){Hn.assertInAngularZone(),u._stable&&(u._stable=!1,u._zone.runOutsideAngular(function(){n.next(!1)}))});return function(){t.unsubscribe(),e.unsubscribe()}});this.isStable=Object(i.a)(c,o.a.call(d))}return n.prototype.bootstrap=function(n,t){var e,l=this;if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");e=n instanceof xn?n:this._componentFactoryResolver.resolveComponentFactory(n),this.componentTypes.push(e.componentType);var r=e instanceof Pn?null:this._injector.get(Dn),i=e.create(F.NULL,[],t||e.selector,r);i.onDestroy(function(){l._unloadComponent(i)});var o=i.injector.get(Un,null);return o&&i.injector.get(Gn).registerApplication(i.location.nativeElement,o),this._loadComponent(i),nt()&&this._console.log("Angular is running in the development mode. Call enableProdMode() to enable the production mode."),i},n.prototype.tick=function(){var t=this;if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");var e=n._tickScope();try{this._runningTick=!0,this._views.forEach(function(n){return n.detectChanges()}),this._enforceNoNewChanges&&this._views.forEach(function(n){return n.checkNoChanges()})}catch(n){this._zone.runOutsideAngular(function(){return t._exceptionHandler.handleError(n)})}finally{this._runningTick=!1,In(e)}},n.prototype.attachView=function(n){var t=n;this._views.push(t),t.attachToAppRef(this)},n.prototype.detachView=function(n){var t=n;st(this._views,t),t.detachFromAppRef()},n.prototype._loadComponent=function(n){this.attachView(n.hostView),this.tick(),this.components.push(n),this._injector.get(gn,[]).concat(this._bootstrapListeners).forEach(function(t){return t(n)})},n.prototype._unloadComponent=function(n){this.detachView(n.hostView),st(this.components,n)},n.prototype.ngOnDestroy=function(){this._views.slice().forEach(function(n){return n.destroy()})},Object.defineProperty(n.prototype,"viewCount",{get:function(){return this._views.length},enumerable:!0,configurable:!0}),n._tickScope=jn("ApplicationRef#tick()"),n}();function st(n,t){var e=n.indexOf(t);e>-1&&n.splice(e,1)}var at=function(){},ut=function(){var n={Important:1,DashCase:2};return n[n.Important]="Important",n[n.DashCase]="DashCase",n}(),ct=function(){},dt=function(n){this.nativeElement=n},ht=function(){},pt=function(){function n(){this.dirty=!0,this._results=[],this.changes=new Rn}return n.prototype.map=function(n){return this._results.map(n)},n.prototype.filter=function(n){return this._results.filter(n)},n.prototype.find=function(n){return this._results.find(n)},n.prototype.reduce=function(n,t){return this._results.reduce(n,t)},n.prototype.forEach=function(n){this._results.forEach(n)},n.prototype.some=function(n){return this._results.some(n)},n.prototype.toArray=function(){return this._results.slice()},n.prototype[D()]=function(){return this._results[D()]()},n.prototype.toString=function(){return this._results.toString()},n.prototype.reset=function(n){this._results=function n(t){return t.reduce(function(t,e){var l=Array.isArray(e)?n(e):e;return t.concat(l)},[])}(n),this.dirty=!1,this.length=this._results.length,this.last=this._results[this.length-1],this.first=this._results[0]},n.prototype.notifyOnChanges=function(){this.changes.emit(this)},n.prototype.setDirty=function(){this.dirty=!0},n.prototype.destroy=function(){this.changes.complete(),this.changes.unsubscribe()},n}(),ft=function(){},_t={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"},mt=function(){function n(n,t){this._compiler=n,this._config=t||_t}return n.prototype.load=function(n){return this._compiler instanceof vn?this.loadFactory(n):this.loadAndCompile(n)},n.prototype.loadAndCompile=function(n){var t=this,l=n.split("#"),r=l[0],i=l[1];return void 0===i&&(i="default"),e("Jnfr")(r).then(function(n){return n[i]}).then(function(n){return gt(n,r,i)}).then(function(n){return t._compiler.compileModuleAsync(n)})},n.prototype.loadFactory=function(n){var t=n.split("#"),l=t[0],r=t[1],i="NgFactory";return void 0===r&&(r="default",i=""),e("Jnfr")(this._config.factoryPathPrefix+l+this._config.factoryPathSuffix).then(function(n){return n[r+i]}).then(function(n){return gt(n,l,r)})},n}();function gt(n,t,e){if(!n)throw new Error("Cannot find '"+e+"' in '"+t+"'");return n}var yt=function(){},bt=function(){},vt=function(){},wt=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(l.__extends)(t,n),t}(function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(l.__extends)(t,n),t}(vt)),xt=function(){function n(n,t,e){this._debugContext=e,this.nativeNode=n,t&&t instanceof Mt?t.addChild(this):this.parent=null,this.listeners=[]}return Object.defineProperty(n.prototype,"injector",{get:function(){return this._debugContext.injector},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"componentInstance",{get:function(){return this._debugContext.component},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"context",{get:function(){return this._debugContext.context},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"references",{get:function(){return this._debugContext.references},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"providerTokens",{get:function(){return this._debugContext.providerTokens},enumerable:!0,configurable:!0}),n}(),Mt=function(n){function t(t,e,l){var r=n.call(this,t,e,l)||this;return r.properties={},r.attributes={},r.classes={},r.styles={},r.childNodes=[],r.nativeElement=t,r}return Object(l.__extends)(t,n),t.prototype.addChild=function(n){n&&(this.childNodes.push(n),n.parent=this)},t.prototype.removeChild=function(n){var t=this.childNodes.indexOf(n);-1!==t&&(n.parent=null,this.childNodes.splice(t,1))},t.prototype.insertChildrenAfter=function(n,t){var e,l=this,r=this.childNodes.indexOf(n);-1!==r&&((e=this.childNodes).splice.apply(e,[r+1,0].concat(t)),t.forEach(function(n){n.parent&&n.parent.removeChild(n),n.parent=l}))},t.prototype.insertBefore=function(n,t){var e=this.childNodes.indexOf(n);-1===e?this.addChild(t):(t.parent&&t.parent.removeChild(t),t.parent=this,this.childNodes.splice(e,0,t))},t.prototype.query=function(n){return this.queryAll(n)[0]||null},t.prototype.queryAll=function(n){var t=[];return kt(this,n,t),t},t.prototype.queryAllNodes=function(n){var t=[];return Ct(this,n,t),t},Object.defineProperty(t.prototype,"children",{get:function(){return this.childNodes.filter(function(n){return n instanceof t})},enumerable:!0,configurable:!0}),t.prototype.triggerEventHandler=function(n,t){this.listeners.forEach(function(e){e.name==n&&e.callback(t)})},t}(xt);function kt(n,t,e){n.childNodes.forEach(function(n){n instanceof Mt&&(t(n)&&e.push(n),kt(n,t,e))})}function Ct(n,t,e){n instanceof Mt&&n.childNodes.forEach(function(n){t(n)&&e.push(n),n instanceof Mt&&Ct(n,t,e)})}var St=new Map;function Ot(n){return St.get(n)||null}function Tt(n){St.set(n.nativeNode,n)}function Lt(n,t){var e=At(n),l=At(t);return e&&l?function(n,t,e){for(var l=n[D()](),r=t[D()]();;){var i=l.next(),o=r.next();if(i.done&&o.done)return!0;if(i.done||o.done)return!1;if(!e(i.value,o.value))return!1}}(n,t,Lt):!(e||!n||"object"!=typeof n&&"function"!=typeof n||l||!t||"object"!=typeof t&&"function"!=typeof t)||E(n,t)}var Pt=function(){function n(n){this.wrapped=n}return n.wrap=function(t){return new n(t)},n}(),Dt=function(){function n(n,t,e){this.previousValue=n,this.currentValue=t,this.firstChange=e}return n.prototype.isFirstChange=function(){return this.firstChange},n}();function At(n){return!!Et(n)&&(Array.isArray(n)||!(n instanceof Map)&&D()in n)}function Et(n){return null!==n&&("function"==typeof n||"object"==typeof n)}var Yt=function(){function n(){}return n.prototype.supports=function(n){return At(n)},n.prototype.create=function(n){return new It(n)},n}(),jt=function(n,t){return t},It=function(){function n(n){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=n||jt}return n.prototype.forEachItem=function(n){var t;for(t=this._itHead;null!==t;t=t._next)n(t)},n.prototype.forEachOperation=function(n){for(var t=this._itHead,e=this._removalsHead,l=0,r=null;t||e;){var i=!e||t&&t.currentIndex=e.length)&&(t=e.length-1),t<0)return null;var l=e[t];return l.viewContainerParent=null,pl(e,t),ce.dirtyParentQueries(l),dl(l),l}function cl(n,t,e){var l=t?Pe(t,t.def.lastRenderRootNode):n.renderElement;Ne(e,2,e.renderer.parentNode(l),e.renderer.nextSibling(l),void 0)}function dl(n){Ne(n,3,null,null,void 0)}function hl(n,t,e){t>=n.length?n.push(e):n.splice(t,0,e)}function pl(n,t){t>=n.length-1?n.pop():n.splice(t,1)}var fl=new Object;function _l(n,t,e,l,r,i){return new ml(n,t,e,l,r,i)}var ml=function(n){function t(t,e,l,r,i,o){var s=n.call(this)||this;return s.selector=t,s.componentType=e,s._inputs=r,s._outputs=i,s.ngContentSelectors=o,s.viewDefFactory=l,s}return Object(l.__extends)(t,n),Object.defineProperty(t.prototype,"inputs",{get:function(){var n=[],t=this._inputs;for(var e in t)n.push({propName:e,templateName:t[e]});return n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"outputs",{get:function(){var n=[];for(var t in this._outputs)n.push({propName:t,templateName:this._outputs[t]});return n},enumerable:!0,configurable:!0}),t.prototype.create=function(n,t,e,l){if(!l)throw new Error("ngModule should be provided");var r=He(this.viewDefFactory),i=r.nodes[0].element.componentProvider.nodeIndex,o=ce.createRootView(n,t||[],e,r,l,fl),s=se(o,i).instance;return e&&o.renderer.setAttribute(oe(o,0).renderElement,"ng-version",w.full),new gl(o,new wl(o),s)},t}(xn),gl=function(n){function t(t,e,l){var r=n.call(this)||this;return r._view=t,r._viewRef=e,r._component=l,r._elDef=r._view.def.nodes[0],r.hostView=e,r.changeDetectorRef=e,r.instance=l,r}return Object(l.__extends)(t,n),Object.defineProperty(t.prototype,"location",{get:function(){return new dt(oe(this._view,this._elDef.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return new Cl(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentType",{get:function(){return this._component.constructor},enumerable:!0,configurable:!0}),t.prototype.destroy=function(){this._viewRef.destroy()},t.prototype.onDestroy=function(n){this._viewRef.onDestroy(n)},t}(function(){});function yl(n,t,e){return new bl(n,t,e)}var bl=function(){function n(n,t,e){this._view=n,this._elDef=t,this._data=e,this._embeddedViews=[]}return Object.defineProperty(n.prototype,"element",{get:function(){return new dt(this._data.renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"injector",{get:function(){return new Cl(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"parentInjector",{get:function(){for(var n=this._view,t=this._elDef.parent;!t&&n;)t=Le(n),n=n.parent;return n?new Cl(n,t):new Cl(this._view,null)},enumerable:!0,configurable:!0}),n.prototype.clear=function(){for(var n=this._embeddedViews.length-1;n>=0;n--){var t=ul(this._data,n);ce.destroyView(t)}},n.prototype.get=function(n){var t=this._embeddedViews[n];if(t){var e=new wl(t);return e.attachToViewContainerRef(this),e}return null},Object.defineProperty(n.prototype,"length",{get:function(){return this._embeddedViews.length},enumerable:!0,configurable:!0}),n.prototype.createEmbeddedView=function(n,t,e){var l=n.createEmbeddedView(t||{});return this.insert(l,e),l},n.prototype.createComponent=function(n,t,e,l,r){var i=e||this.parentInjector;r||n instanceof Pn||(r=i.get(Dn));var o=n.create(i,l,void 0,r);return this.insert(o.hostView,t),o},n.prototype.insert=function(n,t){if(n.destroyed)throw new Error("Cannot insert a destroyed View in a ViewContainer!");var e,l,r,i,o=n;return r=o._view,i=(e=this._data).viewContainer._embeddedViews,null!==(l=t)&&void 0!==l||(l=i.length),r.viewContainerParent=this._view,hl(i,l,r),function(n,t){var e=Te(t);if(e&&e!==n&&!(16&t.state)){t.state|=16;var l=e.template._projectedViews;l||(l=e.template._projectedViews=[]),l.push(t),function(n,e){if(!(4&e.flags)){t.parent.def.nodeFlags|=4,e.flags|=4;for(var l=e.parent;l;)l.childFlags|=4,l=l.parent}}(0,t.parentNodeDef)}}(e,r),ce.dirtyParentQueries(r),cl(e,l>0?i[l-1]:null,r),o.attachToViewContainerRef(this),n},n.prototype.move=function(n,t){if(n.destroyed)throw new Error("Cannot move a destroyed View in a ViewContainer!");var e,l,r,i,o,s=this._embeddedViews.indexOf(n._view);return r=t,o=(i=(e=this._data).viewContainer._embeddedViews)[l=s],pl(i,l),null==r&&(r=i.length),hl(i,r,o),ce.dirtyParentQueries(o),dl(o),cl(e,r>0?i[r-1]:null,o),n},n.prototype.indexOf=function(n){return this._embeddedViews.indexOf(n._view)},n.prototype.remove=function(n){var t=ul(this._data,n);t&&ce.destroyView(t)},n.prototype.detach=function(n){var t=ul(this._data,n);return t?new wl(t):null},n}();function vl(n){return new wl(n)}var wl=function(){function n(n){this._view=n,this._viewContainerRef=null,this._appRef=null}return Object.defineProperty(n.prototype,"rootNodes",{get:function(){return Ne(this._view,0,void 0,void 0,n=[]),n;var n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"context",{get:function(){return this._view.context},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"destroyed",{get:function(){return 0!=(128&this._view.state)},enumerable:!0,configurable:!0}),n.prototype.markForCheck=function(){Ce(this._view)},n.prototype.detach=function(){this._view.state&=-5},n.prototype.detectChanges=function(){var n=this._view.root.rendererFactory;n.begin&&n.begin();try{ce.checkAndUpdateView(this._view)}finally{n.end&&n.end()}},n.prototype.checkNoChanges=function(){ce.checkNoChangesView(this._view)},n.prototype.reattach=function(){this._view.state|=4},n.prototype.onDestroy=function(n){this._view.disposables||(this._view.disposables=[]),this._view.disposables.push(n)},n.prototype.destroy=function(){this._appRef?this._appRef.detachView(this):this._viewContainerRef&&this._viewContainerRef.detach(this._viewContainerRef.indexOf(this)),ce.destroyView(this._view)},n.prototype.detachFromAppRef=function(){this._appRef=null,dl(this._view),ce.dirtyParentQueries(this._view)},n.prototype.attachToAppRef=function(n){if(this._viewContainerRef)throw new Error("This view is already attached to a ViewContainer!");this._appRef=n},n.prototype.attachToViewContainerRef=function(n){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._viewContainerRef=n},n}();function xl(n,t){return new Ml(n,t)}var Ml=function(n){function t(t,e){var l=n.call(this)||this;return l._parentView=t,l._def=e,l}return Object(l.__extends)(t,n),t.prototype.createEmbeddedView=function(n){return new wl(ce.createEmbeddedView(this._parentView,this._def,this._def.element.template,n))},Object.defineProperty(t.prototype,"elementRef",{get:function(){return new dt(oe(this._parentView,this._def.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),t}(yt);function kl(n,t){return new Cl(n,t)}var Cl=function(){function n(n,t){this.view=n,this.elDef=t}return n.prototype.get=function(n,t){return void 0===t&&(t=F.THROW_IF_NOT_FOUND),ce.resolveDep(this.view,this.elDef,!!this.elDef&&0!=(33554432&this.elDef.flags),{flags:0,token:n,tokenKey:me(n)},t)},n}();function Sl(n,t){var e=n.def.nodes[t];if(1&e.flags){var l=oe(n,e.nodeIndex);return e.element.template?l.template:l.renderElement}if(2&e.flags)return ie(n,e.nodeIndex).renderText;if(20240&e.flags)return se(n,e.nodeIndex).instance;throw new Error("Illegal state: read nodeValue for node index "+t)}function Ol(n){return new Tl(n.renderer)}var Tl=function(){function n(n){this.delegate=n}return n.prototype.selectRootElement=function(n){return this.delegate.selectRootElement(n)},n.prototype.createElement=function(n,t){var e=Ue(t),l=this.delegate.createElement(e[1],e[0]);return n&&this.delegate.appendChild(n,l),l},n.prototype.createViewRoot=function(n){return n},n.prototype.createTemplateAnchor=function(n){var t=this.delegate.createComment("");return n&&this.delegate.appendChild(n,t),t},n.prototype.createText=function(n,t){var e=this.delegate.createText(t);return n&&this.delegate.appendChild(n,e),e},n.prototype.projectNodes=function(n,t){for(var e=0;e0,t.provider.value,t.provider.deps);if(t.outputs.length)for(var l=0;l0,l=t.provider;switch(201347067&t.flags){case 512:return ql(n,t.parent,e,l.value,l.deps);case 1024:return function(n,t,e,l,r){var i=r.length;switch(i){case 0:return l();case 1:return l(Ql(n,t,e,r[0]));case 2:return l(Ql(n,t,e,r[0]),Ql(n,t,e,r[1]));case 3:return l(Ql(n,t,e,r[0]),Ql(n,t,e,r[1]),Ql(n,t,e,r[2]));default:for(var o=Array(i),s=0;s0)u=_,mr(_)||(c=_);else for(;u&&f===u.nodeIndex+u.childCount;){var y=u.parent;y&&(y.childFlags|=u.childFlags,y.childMatchedQueries|=u.childMatchedQueries),c=(u=y)&&mr(u)?u.renderParent:u}}return{factory:null,nodeFlags:o,rootNodeFlags:s,nodeMatchedQueries:a,flags:n,nodes:t,updateDirectives:e||fe,updateRenderer:l||fe,handleEvent:function(n,e,l,r){return t[e].element.handleEvent(n,l,r)},bindingCount:r,outputCount:i,lastRenderRootNode:p}}function mr(n){return 0!=(1&n.flags)&&null===n.element.name}function gr(n,t,e){var l=t.element&&t.element.template;if(l){if(!l.lastRenderRootNode)throw new Error("Illegal State: Embedded templates without nodes are not allowed!");if(l.lastRenderRootNode&&16777216&l.lastRenderRootNode.flags)throw new Error("Illegal State: Last root node of a template can't have embedded views, at index "+t.nodeIndex+"!")}if(20224&t.flags&&0==(1&(n?n.flags:0)))throw new Error("Illegal State: StaticProvider/Directive nodes need to be children of elements or anchors, at index "+t.nodeIndex+"!");if(t.query){if(67108864&t.flags&&(!n||0==(16384&n.flags)))throw new Error("Illegal State: Content Query nodes need to be children of directives, at index "+t.nodeIndex+"!");if(134217728&t.flags&&n)throw new Error("Illegal State: View Query nodes have to be top level nodes, at index "+t.nodeIndex+"!")}if(t.childCount){var r=n?n.nodeIndex+n.childCount:e-1;if(t.nodeIndex<=r&&t.nodeIndex+t.childCount>r)throw new Error("Illegal State: childCount of node leads outside of parent, at index "+t.nodeIndex+"!")}}function yr(n,t,e,l){var r=wr(n.root,n.renderer,n,t,e);return xr(r,n.component,l),Mr(r),r}function br(n,t,e){var l=wr(n,n.renderer,null,null,t);return xr(l,e,e),Mr(l),l}function vr(n,t,e,l){var r,i=t.element.componentRendererType;return r=i?n.root.rendererFactory.createRenderer(l,i):n.root.renderer,wr(n.root,r,n,t.element.componentProvider,e)}function wr(n,t,e,l,r){var i=new Array(r.nodes.length),o=r.outputCount?new Array(r.outputCount):null;return{def:r,parent:e,viewContainerParent:null,parentNodeDef:l,context:null,component:null,nodes:i,state:13,root:n,renderer:t,oldValues:new Array(r.bindingCount),disposables:o,initIndex:-1}}function xr(n,t,e){n.component=t,n.context=e}function Mr(n){var t;De(n)&&(t=oe(n.parent,n.parentNodeDef.parent.nodeIndex).renderElement);for(var e=n.def,l=n.nodes,r=0;r0&&tl(n,t,0,e)&&(p=!0),h>1&&tl(n,t,1,l)&&(p=!0),h>2&&tl(n,t,2,r)&&(p=!0),h>3&&tl(n,t,3,i)&&(p=!0),h>4&&tl(n,t,4,o)&&(p=!0),h>5&&tl(n,t,5,s)&&(p=!0),h>6&&tl(n,t,6,a)&&(p=!0),h>7&&tl(n,t,7,u)&&(p=!0),h>8&&tl(n,t,8,c)&&(p=!0),h>9&&tl(n,t,9,d)&&(p=!0),p}(n,t,e,l,r,i,o,s,a,u,c,d);case 2:return function(n,t,e,l,r,i,o,s,a,u,c,d){var h=!1,p=t.bindings,f=p.length;if(f>0&&Me(n,t,0,e)&&(h=!0),f>1&&Me(n,t,1,l)&&(h=!0),f>2&&Me(n,t,2,r)&&(h=!0),f>3&&Me(n,t,3,i)&&(h=!0),f>4&&Me(n,t,4,o)&&(h=!0),f>5&&Me(n,t,5,s)&&(h=!0),f>6&&Me(n,t,6,a)&&(h=!0),f>7&&Me(n,t,7,u)&&(h=!0),f>8&&Me(n,t,8,c)&&(h=!0),f>9&&Me(n,t,9,d)&&(h=!0),h){var _=t.text.prefix;f>0&&(_+=fr(e,p[0])),f>1&&(_+=fr(l,p[1])),f>2&&(_+=fr(r,p[2])),f>3&&(_+=fr(i,p[3])),f>4&&(_+=fr(o,p[4])),f>5&&(_+=fr(s,p[5])),f>6&&(_+=fr(a,p[6])),f>7&&(_+=fr(u,p[7])),f>8&&(_+=fr(c,p[8])),f>9&&(_+=fr(d,p[9]));var m=ie(n,t.nodeIndex).renderText;n.renderer.setValue(m,_)}return h}(n,t,e,l,r,i,o,s,a,u,c,d);case 16384:return function(n,t,e,l,r,i,o,s,a,u,c,d){var h=se(n,t.nodeIndex),p=h.instance,f=!1,_=void 0,m=t.bindings.length;return m>0&&xe(n,t,0,e)&&(f=!0,_=Xl(n,h,t,0,e,_)),m>1&&xe(n,t,1,l)&&(f=!0,_=Xl(n,h,t,1,l,_)),m>2&&xe(n,t,2,r)&&(f=!0,_=Xl(n,h,t,2,r,_)),m>3&&xe(n,t,3,i)&&(f=!0,_=Xl(n,h,t,3,i,_)),m>4&&xe(n,t,4,o)&&(f=!0,_=Xl(n,h,t,4,o,_)),m>5&&xe(n,t,5,s)&&(f=!0,_=Xl(n,h,t,5,s,_)),m>6&&xe(n,t,6,a)&&(f=!0,_=Xl(n,h,t,6,a,_)),m>7&&xe(n,t,7,u)&&(f=!0,_=Xl(n,h,t,7,u,_)),m>8&&xe(n,t,8,c)&&(f=!0,_=Xl(n,h,t,8,c,_)),m>9&&xe(n,t,9,d)&&(f=!0,_=Xl(n,h,t,9,d,_)),_&&p.ngOnChanges(_),65536&t.flags&&re(n,256,t.nodeIndex)&&p.ngOnInit(),262144&t.flags&&p.ngDoCheck(),f}(n,t,e,l,r,i,o,s,a,u,c,d);case 32:case 64:case 128:return function(n,t,e,l,r,i,o,s,a,u,c,d){var h=t.bindings,p=!1,f=h.length;if(f>0&&Me(n,t,0,e)&&(p=!0),f>1&&Me(n,t,1,l)&&(p=!0),f>2&&Me(n,t,2,r)&&(p=!0),f>3&&Me(n,t,3,i)&&(p=!0),f>4&&Me(n,t,4,o)&&(p=!0),f>5&&Me(n,t,5,s)&&(p=!0),f>6&&Me(n,t,6,a)&&(p=!0),f>7&&Me(n,t,7,u)&&(p=!0),f>8&&Me(n,t,8,c)&&(p=!0),f>9&&Me(n,t,9,d)&&(p=!0),p){var _=ae(n,t.nodeIndex),m=void 0;switch(201347067&t.flags){case 32:m=new Array(h.length),f>0&&(m[0]=e),f>1&&(m[1]=l),f>2&&(m[2]=r),f>3&&(m[3]=i),f>4&&(m[4]=o),f>5&&(m[5]=s),f>6&&(m[6]=a),f>7&&(m[7]=u),f>8&&(m[8]=c),f>9&&(m[9]=d);break;case 64:m={},f>0&&(m[h[0].name]=e),f>1&&(m[h[1].name]=l),f>2&&(m[h[2].name]=r),f>3&&(m[h[3].name]=i),f>4&&(m[h[4].name]=o),f>5&&(m[h[5].name]=s),f>6&&(m[h[6].name]=a),f>7&&(m[h[7].name]=u),f>8&&(m[h[8].name]=c),f>9&&(m[h[9].name]=d);break;case 128:var g=e;switch(f){case 1:m=g.transform(e);break;case 2:m=g.transform(l);break;case 3:m=g.transform(l,r);break;case 4:m=g.transform(l,r,i);break;case 5:m=g.transform(l,r,i,o);break;case 6:m=g.transform(l,r,i,o,s);break;case 7:m=g.transform(l,r,i,o,s,a);break;case 8:m=g.transform(l,r,i,o,s,a,u);break;case 9:m=g.transform(l,r,i,o,s,a,u,c);break;case 10:m=g.transform(l,r,i,o,s,a,u,c,d)}}_.value=m}return p}(n,t,e,l,r,i,o,s,a,u,c,d);default:throw"unreachable"}}(n,t,l,r,i,o,s,a,u,c,d,h):function(n,t,e){switch(201347067&t.flags){case 1:return function(n,t,e){for(var l=!1,r=0;r0&&ke(n,t,0,e),h>1&&ke(n,t,1,l),h>2&&ke(n,t,2,r),h>3&&ke(n,t,3,i),h>4&&ke(n,t,4,o),h>5&&ke(n,t,5,s),h>6&&ke(n,t,6,a),h>7&&ke(n,t,7,u),h>8&&ke(n,t,8,c),h>9&&ke(n,t,9,d)}(n,t,l,r,i,o,s,a,u,c,d,h):function(n,t,e){for(var l=0;l=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},f=function(){},_=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return h(t,n),t.prototype.getTranslation=function(n){return Object(r.a)({})},t}(f);_=p([Object(l.q)()],_);var m=function(n){return n&&"function"==typeof n.schedule},g="undefined"!=typeof window?window:"undefined"!=typeof n?n:"undefined"!=typeof self?self:{};function y(n,t){return n(t={exports:{}},t.exports),t.exports}var b="undefined"!=typeof window&&window,v="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,w=b||"undefined"!=typeof g&&g||v,x=w;!function(){if(!w)throw new Error("RxJS could not find any global context (window, self, global)")}();var M,k={root:x},C={isFunction:function(n){return"function"==typeof n}},S={isArray:Array.isArray||function(n){return n&&"number"==typeof n.length}},O=function(n){return null!=n&&"object"==typeof n},T={errorObject:{e:{}}};function L(){try{return M.apply(this,arguments)}catch(n){return T.errorObject.e=n,T.errorObject}}var P=function(n){return M=n,L},D=g&&g.__extends||function(n,t){for(var e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);function l(){this.constructor=n}n.prototype=null===t?Object.create(t):(l.prototype=t.prototype,new l)},A={UnsubscriptionError:function(n){function t(t){n.call(this),this.errors=t;var e=Error.call(this,t?t.length+" errors occurred during unsubscription:\n "+t.map(function(n,t){return t+1+") "+n.toString()}).join("\n "):"");this.name=e.name="UnsubscriptionError",this.stack=e.stack,this.message=e.message}return D(t,n),t}(Error)};function E(n){return n.reduce(function(n,t){return n.concat(t instanceof A.UnsubscriptionError?t.errors:t)},[])}var Y={Subscription:function(){function n(n){this.closed=!1,this._parent=null,this._parents=null,this._subscriptions=null,n&&(this._unsubscribe=n)}var t;return n.prototype.unsubscribe=function(){var n,t=!1;if(!this.closed){var e=this._parent,l=this._parents,r=this._unsubscribe,i=this._subscriptions;this.closed=!0,this._parent=null,this._parents=null,this._subscriptions=null;for(var o=-1,s=l?l.length:0;e;)e.remove(this),e=++o1?new t(n,l):1===r?new J.ScalarObservable(n[0],l):new K.EmptyObservable(l)},t.dispatch=function(n){var t=n.array,e=n.index,l=n.subscriber;e>=n.count?l.complete():(l.next(t[e]),l.closed||(n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.array,l=e.length,r=this.scheduler;if(r)return r.schedule(t.dispatch,0,{array:e,index:0,count:l,subscriber:n});for(var i=0;idn?dn:r:r}()),this.arr=n,this.idx=t,this.len=e}return n.prototype[on.iterator]=function(){return this},n.prototype.next=function(){return this.idx=n.length?l.complete():(l.next(t[e]),n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.arrayLike,l=this.scheduler,r=e.length;if(l)return l.schedule(t.dispatch,0,{arrayLike:e,index:0,length:r,subscriber:n});for(var i=0;i0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},t}(On.OuterSubscriber),Dn=function(n){return n},An=function(n){return void 0===n&&(n=Number.POSITIVE_INFINITY),function(n,t,e){return void 0===e&&(e=Number.POSITIVE_INFINITY),function(l){return"number"==typeof t&&(e=t,t=null),l.lift(new Ln(n,t,e))}}(Dn,null,n)},En={concat:function(){for(var n=[],t=0;t=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},jn=function(){},In=function(){function n(){}return n.prototype.handle=function(n){return n.key},n}();In=Yn([Object(l.q)()],In);var Rn=this&&this.__decorate||function(n,t,e,l){var r,i=arguments.length,o=i<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,e):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(n,t,e,l);else for(var s=n.length-1;s>=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},Hn=function(){},Nn=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return h(t,n),t.prototype.compile=function(n,t){return n},t.prototype.compileTranslations=function(n,t){return n},t}(Hn);function Fn(n,t){if(n===t)return!0;if(null===n||null===t)return!1;if(n!=n&&t!=t)return!0;var e,l,r,i=typeof n;if(i==typeof t&&"object"==i){if(!Array.isArray(n)){if(Array.isArray(t))return!1;for(l in r=Object.create(null),n){if(!Fn(n[l],t[l]))return!1;r[l]=!0}for(l in t)if(!(l in r)&&"undefined"!=typeof t[l])return!1;return!0}if(!Array.isArray(t))return!1;if((e=n.length)==t.length){for(l=0;l=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},zn=function(){},Un=function(n){function t(){var t=n.apply(this,arguments)||this;return t.templateMatcher=/{{\s?([^{}\s]*)\s?}}/g,t}return h(t,n),t.prototype.interpolate=function(n,t){return"string"==typeof n?this.interpolateString(n,t):"function"==typeof n?this.interpolateFunction(n,t):n},t.prototype.getValue=function(n,t){var e=t.split(".");t="";do{t+=e.shift(),!Bn(n)||!Bn(n[t])||"object"!=typeof n[t]&&e.length?e.length?t+=".":n=void 0:(n=n[t],t="")}while(e.length);return n},t.prototype.interpolateFunction=function(n,t){return n(t)},t.prototype.interpolateString=function(n,t){var e=this;return t?n.replace(this.templateMatcher,function(n,l){var r=e.getValue(t,l);return Bn(r)?r:n}):n},t}(zn);Un=Wn([Object(l.q)()],Un);var Gn=function(){return function(){this.currentLang=this.defaultLang,this.translations={},this.langs=[],this.onTranslationChange=new l.o,this.onLangChange=new l.o,this.onDefaultLangChange=new l.o}}(),qn=this&&this.__decorate||function(n,t,e,l){var r,i=arguments.length,o=i<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,e):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(n,t,e,l);else for(var s=n.length-1;s>=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},Jn=e("TToO").__metadata,Qn=e("TToO").__param,Kn=new l.r("USE_STORE"),Xn=new l.r("USE_DEFAULT_LANG"),Zn=function(){function n(n,t,e,r,i,o,s){void 0===o&&(o=!0),void 0===s&&(s=!1),this.store=n,this.currentLoader=t,this.compiler=e,this.parser=r,this.missingTranslationHandler=i,this.useDefaultLang=o,this.isolate=s,this.pending=!1,this._onTranslationChange=new l.o,this._onLangChange=new l.o,this._onDefaultLangChange=new l.o,this._langs=[],this._translations={},this._translationRequests={}}return Object.defineProperty(n.prototype,"onTranslationChange",{get:function(){return this.isolate?this._onTranslationChange:this.store.onTranslationChange},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"onLangChange",{get:function(){return this.isolate?this._onLangChange:this.store.onLangChange},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"onDefaultLangChange",{get:function(){return this.isolate?this._onDefaultLangChange:this.store.onDefaultLangChange},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"defaultLang",{get:function(){return this.isolate?this._defaultLang:this.store.defaultLang},set:function(n){this.isolate?this._defaultLang=n:this.store.defaultLang=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"currentLang",{get:function(){return this.isolate?this._currentLang:this.store.currentLang},set:function(n){this.isolate?this._currentLang=n:this.store.currentLang=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"langs",{get:function(){return this.isolate?this._langs:this.store.langs},set:function(n){this.isolate?this._langs=n:this.store.langs=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"translations",{get:function(){return this.isolate?this._translations:this.store.translations},set:function(n){this.isolate?this._translations=n:this.store.translations=n},enumerable:!0,configurable:!0}),n.prototype.setDefaultLang=function(n){var t=this;if(n!==this.defaultLang){var e=this.retrieveTranslations(n);"undefined"!=typeof e?(this.defaultLang||(this.defaultLang=n),e.pipe(Object(d.a)(1)).subscribe(function(e){t.changeDefaultLang(n)})):this.changeDefaultLang(n)}},n.prototype.getDefaultLang=function(){return this.defaultLang},n.prototype.use=function(n){var t=this;if(n===this.currentLang)return Object(r.a)(this.translations[n]);var e=this.retrieveTranslations(n);return"undefined"!=typeof e?(this.currentLang||(this.currentLang=n),e.pipe(Object(d.a)(1)).subscribe(function(e){t.changeLang(n)}),e):(this.changeLang(n),Object(r.a)(this.translations[n]))},n.prototype.retrieveTranslations=function(n){var t;return"undefined"==typeof this.translations[n]&&(this._translationRequests[n]=this._translationRequests[n]||this.getTranslation(n),t=this._translationRequests[n]),t},n.prototype.getTranslation=function(n){var t=this;return this.pending=!0,this.loadingTranslations=this.currentLoader.getTranslation(n).pipe(Object(o.a)()),this.loadingTranslations.pipe(Object(d.a)(1)).subscribe(function(e){t.translations[n]=t.compiler.compileTranslations(e,n),t.updateLangs(),t.pending=!1},function(n){t.pending=!1}),this.loadingTranslations},n.prototype.setTranslation=function(n,t,e){void 0===e&&(e=!1),t=this.compiler.compileTranslations(t,n),this.translations[n]=e&&this.translations[n]?function n(t,e){var l=Object.assign({},t);return Vn(t)&&Vn(e)&&Object.keys(e).forEach(function(r){var i,o;Vn(e[r])?r in t?l[r]=n(t[r],e[r]):Object.assign(l,((i={})[r]=e[r],i)):Object.assign(l,((o={})[r]=e[r],o))}),l}(this.translations[n],t):t,this.updateLangs(),this.onTranslationChange.emit({lang:n,translations:this.translations[n]})},n.prototype.getLangs=function(){return this.langs},n.prototype.addLangs=function(n){var t=this;n.forEach(function(n){-1===t.langs.indexOf(n)&&t.langs.push(n)})},n.prototype.updateLangs=function(){this.addLangs(Object.keys(this.translations))},n.prototype.getParsedResult=function(n,t,e){var l;if(t instanceof Array){for(var i={},o=!1,u=0,d=t;u=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},nt=this&&this.__metadata||function(n,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(n,t)},tt=function(){function n(n,t,e){var l=this;this.translateService=n,this.element=t,this._ref=e,this.onTranslationChangeSub||(this.onTranslationChangeSub=this.translateService.onTranslationChange.subscribe(function(n){n.lang===l.translateService.currentLang&&l.checkNodes(!0,n.translations)})),this.onLangChangeSub||(this.onLangChangeSub=this.translateService.onLangChange.subscribe(function(n){l.checkNodes(!0,n.translations)})),this.onDefaultLangChangeSub||(this.onDefaultLangChangeSub=this.translateService.onDefaultLangChange.subscribe(function(n){l.checkNodes(!0)}))}return Object.defineProperty(n.prototype,"translate",{set:function(n){n&&(this.key=n,this.checkNodes())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"translateParams",{set:function(n){Fn(this.currentParams,n)||(this.currentParams=n,this.checkNodes(!0))},enumerable:!0,configurable:!0}),n.prototype.ngAfterViewChecked=function(){this.checkNodes()},n.prototype.checkNodes=function(n,t){void 0===n&&(n=!1);var e=this.element.nativeElement.childNodes;e.length||(this.setContent(this.element.nativeElement,this.key),e=this.element.nativeElement.childNodes);for(var l=0;l=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},lt=this&&this.__metadata||function(n,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(n,t)},rt=function(){function n(n,t){this.translate=n,this._ref=t,this.value=""}return n.prototype.updateValue=function(n,t,e){var l=this,r=function(t){l.value=void 0!==t?t:n,l.lastKey=n,l._ref.markForCheck()};if(e){var i=this.translate.getParsedResult(e,n,t);"function"==typeof i.subscribe?i.subscribe(r):r(i)}this.translate.get(n,t).subscribe(r)},n.prototype.transform=function(n){for(var t,e=this,l=[],r=1;r20?t=40===n||50===n||60===n||80===n||100===n?"fed":"ain":n>0&&(t=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][n]),n+t},week:{dow:1,doy:4}})}(e("PJh5"))},ZUyn:function(n,t,e){!function(n){"use strict";n.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?n:"\u4e2d\u5348"===t?n>=11?n:n+12:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?n+12:void 0},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u51cc\u6668":l<900?"\u65e9\u4e0a":l<1130?"\u4e0a\u5348":l<1230?"\u4e2d\u5348":l<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";case"M":return n+"\u6708";case"w":case"W":return n+"\u9031";default:return n}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(e("PJh5"))},ZoSI:function(n,t,e){!function(n){"use strict";n.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},aM0x:function(n,t,e){!function(n){"use strict";var t={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},e={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};n.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2_\u0986\u0997_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u0983_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(n){return n.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u09b0\u09be\u09a4"===t&&n>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===t&&n<5||"\u09ac\u09bf\u0995\u09be\u09b2"===t?n+12:n},meridiem:function(n,t,e){return n<4?"\u09b0\u09be\u09a4":n<10?"\u09b8\u0995\u09be\u09b2":n<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":n<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(e("PJh5"))},aqvp:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l=n+" ";switch(e){case"ss":return l+(1===n?"sekunda":2===n||3===n||4===n?"sekunde":"sekundi");case"m":return t?"jedna minuta":"jedne minute";case"mm":return l+(1===n?"minuta":2===n||3===n||4===n?"minute":"minuta");case"h":return t?"jedan sat":"jednog sata";case"hh":return l+(1===n?"sat":2===n||3===n||4===n?"sata":"sati");case"dd":return l+(1===n?"dan":"dana");case"MM":return l+(1===n?"mjesec":2===n||3===n||4===n?"mjeseca":"mjeseci");case"yy":return l+(1===n?"godina":2===n||3===n||4===n?"godine":"godina")}}n.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},bXQP:function(n,t,e){!function(n){"use strict";n.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(n,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return n+(1===n?"er":"e");case"w":case"W":return n+(1===n?"re":"e")}}})}(e("PJh5"))},c1x4:function(n,t,e){!function(n){"use strict";var t={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u0435 \u043c\u0438\u043d\u0443\u0442\u0435"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0435","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],yy:["\u0433\u043e\u0434\u0438\u043d\u0430","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(n,t){return 1===n?t[0]:n>=2&&n<=4?t[1]:t[2]},translate:function(n,e,l){var r=t.words[l];return 1===l.length?e?r[0]:r[1]:n+" "+t.correctGrammaticalCase(n,r)}};n.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"\u0434\u0430\u043d",dd:t.translate,M:"\u043c\u0435\u0441\u0435\u0446",MM:t.translate,y:"\u0433\u043e\u0434\u0438\u043d\u0443",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},cQXm:function(n,t,e){"use strict";t.a=function(n){return n&&"function"!=typeof n.subscribe&&"function"==typeof n.then}},"ce/b":function(n,t,e){"use strict";t.a=function(){for(var n=[],t=0;t=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},etqZ:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=function(n){var t=n.Symbol;if("function"==typeof t)return t.iterator||(t.iterator=t("iterator polyfill")),t.iterator;var e=n.Set;if(e&&"function"==typeof(new e)["@@iterator"])return"@@iterator";var l=n.Map;if(l)for(var r=Object.getOwnPropertyNames(l.prototype),i=0;i=2&&n<=4?t[1]:t[2]},translate:function(n,e,l){var r=t.words[l];return 1===l.length?e?r[0]:r[1]:n+" "+t.correctGrammaticalCase(n,r)}};n.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},f9aG:function(n,t,e){"use strict";t.a=function(){for(var n=[],t=0;t=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},gEQe:function(n,t,e){!function(n){"use strict";var t={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},e={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};n.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(n){return n.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===t?n<4?n:n+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===t?n:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===t?n>=10?n:n+12:"\u0cb8\u0c82\u0c9c\u0cc6"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":n<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":n<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":n<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(n){return n+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(e("PJh5"))},gEU3:function(n,t,e){!function(n){"use strict";n.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},gIN1:function(n,t,e){"use strict";t.a=function(){}},gUgh:function(n,t,e){!function(n){"use strict";n.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",ss:"minutu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},hPuz:function(n,t,e){!function(n){"use strict";n.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},hng5:function(n,t,e){!function(n){"use strict";n.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(e("PJh5"))},iNtv:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={s:["viensas secunds","'iensas secunds"],ss:[n+" secunds",n+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[n+" m\xeduts",n+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[n+" \xfeoras",n+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[n+" ziuas",n+" ziuas"],M:["'n mes","'iens mes"],MM:[n+" mesen",n+" mesen"],y:["'n ar","'iens ar"],yy:[n+" ars",n+" ars"]};return l?r[e][0]:t?r[e][0]:r[e][1]}n.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(n){return"d'o"===n.toLowerCase()},meridiem:function(n,t,e){return n>11?e?"d'o":"D'O":e?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"j+vx":function(n,t,e){!function(n){"use strict";var t={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};n.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(n){return n+(t[n]||t[n%10]||t[n>=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},j8cJ:function(n,t,e){!function(n){"use strict";n.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(e("PJh5"))},jxEH:function(n,t,e){!function(n){"use strict";var t={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function e(n,t,e){return e?t%10==1&&t%100!=11?n[2]:n[3]:t%10==1&&t%100!=11?n[0]:n[1]}function l(n,l,r){return n+" "+e(t[r],n,l)}function r(n,l,r){return e(t[r],n,l)}n.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(n,t){return t?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:l,m:r,mm:l,h:r,hh:l,d:r,dd:l,M:r,MM:l,y:r,yy:l},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"k+5o":function(n,t,e){!function(n){"use strict";var t={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};n.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xc7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(n,e){switch(e){case"d":case"D":case"Do":case"DD":return n;default:if(0===n)return n+"'\u0131nc\u0131";var l=n%10;return n+(t[l]||t[n%100-l]||t[n>=100?100:null])}},week:{dow:1,doy:7}})}(e("PJh5"))},krPU:function(n,t,e){!function(n){"use strict";n.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(e("PJh5"))},lAP5:function(n,t,e){"use strict";t.a=function(n){return n}},lOED:function(n,t,e){!function(n){"use strict";n.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0440_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u043d\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(n){var t=n%10,e=n%100;return 0===n?n+"-\u0435\u0432":0===e?n+"-\u0435\u043d":e>10&&e<20?n+"-\u0442\u0438":1===t?n+"-\u0432\u0438":2===t?n+"-\u0440\u0438":7===t||8===t?n+"-\u043c\u0438":n+"-\u0442\u0438"},week:{dow:1,doy:7}})}(e("PJh5"))},m7yE:function(n,t,e){!function(n){"use strict";var t="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function e(n,e,l,r){var i=function(n){var e=Math.floor(n%1e3/100),l=Math.floor(n%100/10),r=n%10,i="";return e>0&&(i+=t[e]+"vatlh"),l>0&&(i+=(""!==i?" ":"")+t[l]+"maH"),r>0&&(i+=(""!==i?" ":"")+t[r]),""===i?"pagh":i}(n);switch(l){case"ss":return i+" lup";case"mm":return i+" tup";case"hh":return i+" rep";case"dd":return i+" jaj";case"MM":return i+" jar";case"yy":return i+" DIS"}}n.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(n){var t=n;return-1!==n.indexOf("jaj")?t.slice(0,-3)+"leS":-1!==n.indexOf("jar")?t.slice(0,-3)+"waQ":-1!==n.indexOf("DIS")?t.slice(0,-3)+"nem":t+" pIq"},past:function(n){var t=n;return-1!==n.indexOf("jaj")?t.slice(0,-3)+"Hu\u2019":-1!==n.indexOf("jar")?t.slice(0,-3)+"wen":-1!==n.indexOf("DIS")?t.slice(0,-3)+"ben":t+" ret"},s:"puS lup",ss:e,m:"wa\u2019 tup",mm:e,h:"wa\u2019 rep",hh:e,d:"wa\u2019 jaj",dd:e,M:"wa\u2019 jar",MM:e,y:"wa\u2019 DIS",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},nE8X:function(n,t,e){!function(n){"use strict";n.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(n){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===n},meridiem:function(n,t,e){return n<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(n){return"\u0e97\u0eb5\u0ec8"+n}})}(e("PJh5"))},nLOz:function(n,t,e){!function(n){"use strict";n.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(n){return n+(1===n?"d":n%10==2?"na":"mh")},week:{dow:1,doy:4}})}(e("PJh5"))},nS2h:function(n,t,e){!function(n){"use strict";var t="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),e=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",t[7],t[8],t[9]];function l(n,l,r,i){var o="";switch(r){case"s":return i?"muutaman sekunnin":"muutama sekunti";case"ss":return i?"sekunnin":"sekuntia";case"m":return i?"minuutin":"minuutti";case"mm":o=i?"minuutin":"minuuttia";break;case"h":return i?"tunnin":"tunti";case"hh":o=i?"tunnin":"tuntia";break;case"d":return i?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":o=i?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return i?"kuukauden":"kuukausi";case"MM":o=i?"kuukauden":"kuukautta";break;case"y":return i?"vuoden":"vuosi";case"yy":o=i?"vuoden":"vuotta"}return function(n,l){return n<10?l?e[n]:t[n]:n}(n,i)+" "+o}n.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:l,ss:l,m:l,mm:l,h:l,hh:l,d:l,dd:l,M:l,MM:l,y:l,yy:l},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},ntHu:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l,r;return"m"===e?t?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===e?t?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":n+" "+(l=+n,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:t?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[e].split("_"),l%10==1&&l%100!=11?r[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?r[1]:r[2])}function e(n){return function(){return n+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}n.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(n,t){var e={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return n?e[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(t)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(t)?"genitive":"nominative"][n.day()]:e.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:e("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:e("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:e("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:e("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return e("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return e("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:t,m:t,mm:t,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:t,d:"\u0434\u0435\u043d\u044c",dd:t,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:t,y:"\u0440\u0456\u043a",yy:t},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(n){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(n)},meridiem:function(n,t,e){return n<4?"\u043d\u043e\u0447\u0456":n<12?"\u0440\u0430\u043d\u043a\u0443":n<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(n,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return n+"-\u0439";case"D":return n+"-\u0433\u043e";default:return n}},week:{dow:1,doy:7}})}(e("PJh5"))},oCzW:function(n,t,e){!function(n){"use strict";n.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},oo1B:function(n,t,e){!function(n){"use strict";n.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===t&&n>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===t||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===t?n+12:n},meridiem:function(n,t,e){return n<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":n<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":n<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":n<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(e("PJh5"))},ooba:function(n,t,e){!function(n){"use strict";n.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(n,t){return 12===n&&(n=0),"pagi"===t?n:"tengahari"===t?n>=11?n:n+12:"petang"===t||"malam"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"pagi":n<15?"tengahari":n<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(e("PJh5"))},"pU/0":function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(){var t=n.call(this,"argument out of range");this.name=t.name="ArgumentOutOfRangeError",this.stack=t.stack,this.message=t.message}return Object(l.__extends)(t,n),t}(Error)},pfs9:function(n,t,e){!function(n){"use strict";var t={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},e={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};n.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(n){return n.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0a30\u0a3e\u0a24"===t?n<4?n:n+12:"\u0a38\u0a35\u0a47\u0a30"===t?n:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===t?n>=10?n:n+12:"\u0a38\u0a3c\u0a3e\u0a2e"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0a30\u0a3e\u0a24":n<10?"\u0a38\u0a35\u0a47\u0a30":n<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":n<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(e("PJh5"))},rIuo:function(n,t,e){!function(n){"use strict";var t=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],e=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];n.defineLocale("dv",{months:t,monthsShort:t,weekdays:e,weekdaysShort:e,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(n){return"\u0789\u078a"===n},meridiem:function(n,t,e){return n<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(e("PJh5"))},rtsW:function(n,t,e){!function(n){"use strict";var t={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},e={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};n.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ac7\u0ab9\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(n){return n.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0ab0\u0abe\u0aa4"===t?n<4?n:n+12:"\u0ab8\u0ab5\u0abe\u0ab0"===t?n:"\u0aac\u0aaa\u0acb\u0ab0"===t?n>=10?n:n+12:"\u0ab8\u0abe\u0a82\u0a9c"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0ab0\u0abe\u0aa4":n<10?"\u0ab8\u0ab5\u0abe\u0ab0":n<17?"\u0aac\u0aaa\u0acb\u0ab0":n<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(e("PJh5"))},rxKx:function(n,t,e){var l;!function(r,i,o,s){"use strict";var a,u=["","webkit","Moz","MS","ms","o"],c=i.createElement("div"),d="function",h=Math.round,p=Math.abs,f=Date.now;function _(n,t,e){return setTimeout(x(n,e),t)}function m(n,t,e){return!!Array.isArray(n)&&(g(n,e[t],e),!0)}function g(n,t,e){var l;if(n)if(n.forEach)n.forEach(t,e);else if(n.length!==s)for(l=0;l\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",i=r.console&&(r.console.warn||r.console.log);return i&&i.call(r.console,l,e),n.apply(this,arguments)}}a="function"!=typeof Object.assign?function(n){if(n===s||null===n)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(n),e=1;e-1}function L(n){return n.trim().split(/\s+/g)}function P(n,t,e){if(n.indexOf&&!e)return n.indexOf(t);for(var l=0;le[t]}):l.sort()),l}function E(n,t){for(var e,l,r=t[0].toUpperCase()+t.slice(1),i=0;i1&&!e.firstMultiple?e.firstMultiple=tn(t):1===r&&(e.firstMultiple=!1);var i=e.firstInput,o=e.firstMultiple,a=o?o.center:i.center,u=t.center=en(l);t.timeStamp=f(),t.deltaTime=t.timeStamp-i.timeStamp,t.angle=sn(a,u),t.distance=on(a,u),function(n,t){var e=t.center,l=n.offsetDelta||{},r=n.prevDelta||{},i=n.prevInput||{};t.eventType!==F&&i.eventType!==B||(r=n.prevDelta={x:i.deltaX||0,y:i.deltaY||0},l=n.offsetDelta={x:e.x,y:e.y}),t.deltaX=r.x+(e.x-l.x),t.deltaY=r.y+(e.y-l.y)}(e,t),t.offsetDirection=rn(t.deltaX,t.deltaY);var c,d,h=ln(t.deltaTime,t.deltaX,t.deltaY);t.overallVelocityX=h.x,t.overallVelocityY=h.y,t.overallVelocity=p(h.x)>p(h.y)?h.x:h.y,t.scale=o?(c=o.pointers,on((d=l)[0],d[1],Z)/on(c[0],c[1],Z)):1,t.rotation=o?function(n,t){return sn(l[1],l[0],Z)+sn(n[1],n[0],Z)}(o.pointers):0,t.maxPointers=e.prevInput?t.pointers.length>e.prevInput.maxPointers?t.pointers.length:e.prevInput.maxPointers:t.pointers.length,function(n,t){var e,l,r,i,o=n.lastInterval||t,a=t.timeStamp-o.timeStamp;if(t.eventType!=V&&(a>N||o.velocity===s)){var u=t.deltaX-o.deltaX,c=t.deltaY-o.deltaY,d=ln(a,u,c);l=d.x,r=d.y,e=p(d.x)>p(d.y)?d.x:d.y,i=rn(u,c),n.lastInterval=t}else e=o.velocity,l=o.velocityX,r=o.velocityY,i=o.direction;t.velocity=e,t.velocityX=l,t.velocityY=r,t.direction=i}(e,t);var _=n.element;O(t.srcEvent.target,_)&&(_=t.srcEvent.target),t.target=_}(n,e),n.emit("hammer.input",e),n.recognize(e),n.session.prevInput=e}function tn(n){for(var t=[],e=0;e=p(t)?n<0?z:U:t<0?G:q}function on(n,t,e){e||(e=X);var l=t[e[0]]-n[e[0]],r=t[e[1]]-n[e[1]];return Math.sqrt(l*l+r*r)}function sn(n,t,e){return e||(e=X),180*Math.atan2(t[e[1]]-n[e[1]],t[e[0]]-n[e[0]])/Math.PI}$.prototype={handler:function(){},init:function(){this.evEl&&C(this.element,this.evEl,this.domHandler),this.evTarget&&C(this.target,this.evTarget,this.domHandler),this.evWin&&C(j(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&S(this.element,this.evEl,this.domHandler),this.evTarget&&S(this.target,this.evTarget,this.domHandler),this.evWin&&S(j(this.element),this.evWin,this.domHandler)}};var an={mousedown:F,mousemove:2,mouseup:B},un="mousedown",cn="mousemove mouseup";function dn(){this.evEl=un,this.evWin=cn,this.pressed=!1,$.apply(this,arguments)}w(dn,$,{handler:function(n){var t=an[n.type];t&F&&0===n.button&&(this.pressed=!0),2&t&&1!==n.which&&(t=B),this.pressed&&(t&B&&(this.pressed=!1),this.callback(this.manager,t,{pointers:[n],changedPointers:[n],pointerType:"mouse",srcEvent:n}))}});var hn={pointerdown:F,pointermove:2,pointerup:B,pointercancel:V,pointerout:V},pn={2:"touch",3:"pen",4:"mouse",5:"kinect"},fn="pointerdown",_n="pointermove pointerup pointercancel";function mn(){this.evEl=fn,this.evWin=_n,$.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}r.MSPointerEvent&&!r.PointerEvent&&(fn="MSPointerDown",_n="MSPointerMove MSPointerUp MSPointerCancel"),w(mn,$,{handler:function(n){var t=this.store,e=!1,l=n.type.toLowerCase().replace("ms",""),r=hn[l],i=pn[n.pointerType]||n.pointerType,o="touch"==i,s=P(t,n.pointerId,"pointerId");r&F&&(0===n.button||o)?s<0&&(t.push(n),s=t.length-1):r&(B|V)&&(e=!0),s<0||(t[s]=n,this.callback(this.manager,r,{pointers:t,changedPointers:[n],pointerType:i,srcEvent:n}),e&&t.splice(s,1))}});var gn={touchstart:F,touchmove:2,touchend:B,touchcancel:V},yn="touchstart",bn="touchstart touchmove touchend touchcancel";function vn(){this.evTarget=yn,this.evWin=bn,this.started=!1,$.apply(this,arguments)}w(vn,$,{handler:function(n){var t=gn[n.type];if(t===F&&(this.started=!0),this.started){var e=(function(n,t){var e=D(n.touches),l=D(n.changedTouches);return t&(B|V)&&(e=A(e.concat(l),"identifier",!0)),[e,l]}).call(this,n,t);t&(B|V)&&e[0].length-e[1].length==0&&(this.started=!1),this.callback(this.manager,t,{pointers:e[0],changedPointers:e[1],pointerType:"touch",srcEvent:n})}}});var wn={touchstart:F,touchmove:2,touchend:B,touchcancel:V},xn="touchstart touchmove touchend touchcancel";function Mn(){this.evTarget=xn,this.targetIds={},$.apply(this,arguments)}w(Mn,$,{handler:function(n){var t=wn[n.type],e=(function(n,t){var e=D(n.touches),l=this.targetIds;if(t&(2|F)&&1===e.length)return l[e[0].identifier]=!0,[e,e];var r,i,o=D(n.changedTouches),s=[],a=this.target;if(i=e.filter(function(n){return O(n.target,a)}),t===F)for(r=0;r-1&&l.splice(n,1)},kn)}}w(Cn,$,{handler:function(n,t,e){var l="mouse"==e.pointerType;if(!(l&&e.sourceCapabilities&&e.sourceCapabilities.firesTouchEvents)){if("touch"==e.pointerType)(function(n,t){n&F?(this.primaryTouch=t.changedPointers[0].identifier,Sn.call(this,t)):n&(B|V)&&Sn.call(this,t)}).call(this,t,e);else if(l&&(function(n){for(var t=n.srcEvent.clientX,e=n.srcEvent.clientY,l=0;l-1&&this.requireFail.splice(t,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(n){return!!this.simultaneous[n.id]},emit:function(n){var t=this,e=this.state;function l(e){t.manager.emit(e,n)}e=Yn&&l(t.options.event+Hn(e))},tryEmit:function(n){if(this.canEmit())return this.emit(n);this.state=32},canEmit:function(){for(var n=0;nt.threshold&&r&t.direction},attrTest:function(n){return Bn.prototype.attrTest.call(this,n)&&(this.state&An||!(this.state&An)&&this.directionTest(n))},emit:function(n){this.pX=n.deltaX,this.pY=n.deltaY;var t=Nn(n.direction);t&&(n.additionalEvent=this.options.event+t),this._super.emit.call(this,n)}}),w(Wn,Bn,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(n){return this._super.attrTest.call(this,n)&&(Math.abs(n.scale-1)>this.options.threshold||this.state&An)},emit:function(n){1!==n.scale&&(n.additionalEvent=this.options.event+(n.scale<1?"in":"out")),this._super.emit.call(this,n)}}),w(zn,Rn,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return["auto"]},process:function(n){var t=this.options,e=n.pointers.length===t.pointers,l=n.distancet.time;if(this._input=n,!l||!e||n.eventType&(B|V)&&!r)this.reset();else if(n.eventType&F)this.reset(),this._timer=_(function(){this.state=jn,this.tryEmit()},t.time,this);else if(n.eventType&B)return jn;return 32},reset:function(){clearTimeout(this._timer)},emit:function(n){this.state===jn&&(n&&n.eventType&B?this.manager.emit(this.options.event+"up",n):(this._input.timeStamp=f(),this.manager.emit(this.options.event,this._input)))}}),w(Un,Bn,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(n){return this._super.attrTest.call(this,n)&&(Math.abs(n.rotation)>this.options.threshold||this.state&An)}}),w(Gn,Bn,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:J|Q,pointers:1},getTouchAction:function(){return Vn.prototype.getTouchAction.call(this)},attrTest:function(n){var t,e=this.options.direction;return e&(J|Q)?t=n.overallVelocity:e&J?t=n.overallVelocityX:e&Q&&(t=n.overallVelocityY),this._super.attrTest.call(this,n)&&e&n.offsetDirection&&n.distance>this.options.threshold&&n.maxPointers==this.options.pointers&&p(t)>this.options.velocity&&n.eventType&B},emit:function(n){var t=Nn(n.offsetDirection);t&&this.manager.emit(this.options.event+t,n),this.manager.emit(this.options.event,n)}}),w(qn,Rn,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return["manipulation"]},process:function(n){var t=this.options,e=n.pointers.length===t.pointers,l=n.distance1&&n<5&&1!=~~(n/10)}function r(n,t,e,r){var i=n+" ";switch(e){case"s":return t||r?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return t||r?i+(l(n)?"sekundy":"sekund"):i+"sekundami";case"m":return t?"minuta":r?"minutu":"minutou";case"mm":return t||r?i+(l(n)?"minuty":"minut"):i+"minutami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?i+(l(n)?"hodiny":"hodin"):i+"hodinami";case"d":return t||r?"den":"dnem";case"dd":return t||r?i+(l(n)?"dny":"dn\xed"):i+"dny";case"M":return t||r?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return t||r?i+(l(n)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):i+"m\u011bs\xedci";case"y":return t||r?"rok":"rokem";case"yy":return t||r?i+(l(n)?"roky":"let"):i+"lety"}}n.defineLocale("cs",{months:t,monthsShort:e,monthsParse:function(n,t){var e,l=[];for(e=0;e<12;e++)l[e]=new RegExp("^"+n[e]+"$|^"+t[e]+"$","i");return l}(t,e),shortMonthsParse:function(n){var t,e=[];for(t=0;t<12;t++)e[t]=new RegExp("^"+n[t]+"$","i");return e}(e),longMonthsParse:function(n){var t,e=[];for(t=0;t<12;t++)e[t]=new RegExp("^"+n[t]+"$","i");return e}(t),weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},svD2:function(n,t,e){!function(n){"use strict";var t={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(n,t){return 1===n?t[0]:n>=2&&n<=4?t[1]:t[2]},translate:function(n,e,l){var r=t.words[l];return 1===l.length?e?r[0]:r[1]:n+" "+t.correctGrammaticalCase(n,r)}};n.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mjesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},t7NR:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l={closed:!0,next:function(n){},error:function(n){throw n},complete:function(){}}},tLDX:function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("AMGY").a.Symbol,r="function"==typeof l&&"function"==typeof l.for?l.for("rxSubscriber"):"@@rxSubscriber"},tZ2B:function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(){n.apply(this,arguments)}return Object(l.__extends)(t,n),t.prototype.notifyNext=function(n,t,e,l,r){this.destination.next(t)},t.prototype.notifyError=function(n,t){this.destination.error(n)},t.prototype.notifyComplete=function(n){this.destination.complete()},t}(e("OVmG").a)},tkWw:function(n,t,e){!function(n){"use strict";n.defineLocale("ar-dz",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u0623\u062d_\u0625\u062b_\u062b\u0644\u0627_\u0623\u0631_\u062e\u0645_\u062c\u0645_\u0633\u0628".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:4}})}(e("PJh5"))},tzHd:function(n,t,e){!function(n){"use strict";n.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(n,t){switch(t){case"D":return n+(1===n?"er":"");default:case"M":case"Q":case"DDD":case"d":return n+(1===n?"er":"e");case"w":case"W":return n+(1===n?"re":"e")}},week:{dow:1,doy:4}})}(e("PJh5"))},uSe8:function(n,t,e){!function(n){"use strict";var t=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],e=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];n.defineLocale("ur",{months:t,monthsShort:t,weekdays:e,weekdaysShort:e,weekdaysMin:e,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(n){return"\u0634\u0627\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(e("PJh5"))},ujcs:function(n,t){t.read=function(n,t,e,l,r){var i,o,s=8*r-l-1,a=(1<>1,c=-7,d=e?r-1:0,h=e?-1:1,p=n[t+d];for(d+=h,i=p&(1<<-c)-1,p>>=-c,c+=s;c>0;i=256*i+n[t+d],d+=h,c-=8);for(o=i&(1<<-c)-1,i>>=-c,c+=l;c>0;o=256*o+n[t+d],d+=h,c-=8);if(0===i)i=1-u;else{if(i===a)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,l),i-=u}return(p?-1:1)*o*Math.pow(2,i-l)},t.write=function(n,t,e,l,r,i){var o,s,a,u=8*i-r-1,c=(1<>1,h=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,p=l?0:i-1,f=l?1:-1,_=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,o=c):(o=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-o))<1&&(o--,a*=2),(t+=o+d>=1?h/a:h*Math.pow(2,1-d))*a>=2&&(o++,a/=2),o+d>=c?(s=0,o=c):o+d>=1?(s=(t*a-1)*Math.pow(2,r),o+=d):(s=t*Math.pow(2,d-1)*Math.pow(2,r),o=0));r>=8;n[e+p]=255&s,p+=f,s/=256,r-=8);for(o=o<0;n[e+p]=255&o,p+=f,o/=256,u-=8);n[e+p-f]|=128*_}},ulq9:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l,r;return"m"===e?t?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":n+" "+(l=+n,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[e].split("_"),l%10==1&&l%100!=11?r[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?r[1]:r[2])}var e=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];n.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?\] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:e,longMonthsParse:e,shortMonthsParse:e,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430 \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",nextWeek:function(n){if(n.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd [\u0432] LT"}},lastWeek:function(n){if(n.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:t,m:t,mm:t,h:"\u0447\u0430\u0441",hh:t,d:"\u0434\u0435\u043d\u044c",dd:t,M:"\u043c\u0435\u0441\u044f\u0446",MM:t,y:"\u0433\u043e\u0434",yy:t},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(n){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(n)},meridiem:function(n,t,e){return n<4?"\u043d\u043e\u0447\u0438":n<12?"\u0443\u0442\u0440\u0430":n<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(n,t){switch(t){case"M":case"d":case"DDD":return n+"-\u0439";case"D":return n+"-\u0433\u043e";case"w":case"W":return n+"-\u044f";default:return n}},week:{dow:1,doy:4}})}(e("PJh5"))},uotZ:function(n,t,e){var l;!function(r){"use strict";var i,o=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,s=Math.ceil,a=Math.floor,u="[BigNumber Error] ",c=u+"Number primitive has more than 15 significant digits: ",d=1e14,h=14,p=9007199254740991,f=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],_=1e7;function m(n){var t=0|n;return n>0||n===t?t:t-1}function g(n){for(var t,e,l=1,r=n.length,i=n[0]+"";lu^e?1:-1;for(s=(a=r.length)<(u=i.length)?a:u,o=0;oi[o]^e?1:-1;return a==u?0:a>u^e?1:-1}function b(n,t,e,l){if(ne||n!==(n<0?s(n):a(n)))throw Error(u+(l||"Argument")+("number"==typeof n?ne?" out of range: ":" not an integer: ":" not a primitive number: ")+n)}function v(n){return"[object Array]"==Object.prototype.toString.call(n)}function w(n){var t=n.c.length-1;return m(n.e/h)==t&&n.c[t]%2!=0}function x(n,t){return(n.length>1?n.charAt(0)+"."+n.slice(1):n)+(t<0?"e":"e+")+t}function M(n,t,e){var l,r;if(t<0){for(r=e+".";++t;r+=e);n=r+n}else if(++t>(l=n.length)){for(r=e,t-=l;--t;r+=e);n+=r}else t=10;d/=10,u++);return g.e=u,void(g.c=[n])}m=n+""}else{if(!o.test(m=n+""))return r(g,m,f);g.s=45==m.charCodeAt(0)?(m=m.slice(1),-1):1}(u=m.indexOf("."))>-1&&(m=m.replace(".","")),(d=m.search(/e/i))>0?(u<0&&(u=d),u+=+m.slice(d+1),m=m.substring(0,d)):u<0&&(u=m.length)}else{if(b(t,2,B.length,"Base"),m=n+"",10==t)return G(g=new V(n instanceof V?n:m),D+g.e+1,A);if(f="number"==typeof n){if(0*n!=0)return r(g,m,f,t);if(g.s=1/n<0?(m=m.slice(1),-1):1,V.DEBUG&&m.replace(/^0\.0*|\./,"").length>15)throw Error(c+n);f=!1}else g.s=45===m.charCodeAt(0)?(m=m.slice(1),-1):1;for(e=B.slice(0,t),u=d=0,_=m.length;d<_;d++)if(e.indexOf(i=m.charAt(d))<0){if("."==i){if(d>u){u=_;continue}}else if(!s&&(m==m.toUpperCase()&&(m=m.toLowerCase())||m==m.toLowerCase()&&(m=m.toUpperCase()))){s=!0,d=-1,u=0;continue}return r(g,n+"",f,t)}(u=(m=l(m,t,10,g.s)).indexOf("."))>-1?m=m.replace(".",""):u=m.length}for(d=0;48===m.charCodeAt(d);d++);for(_=m.length;48===m.charCodeAt(--_););if(m=m.slice(d,++_)){if(_-=d,f&&V.DEBUG&&_>15&&(n>p||n!==a(n)))throw Error(c+g.s*n);if((u=u-d-1)>I)g.c=g.e=null;else if(us){if(--t>0)for(a+=".";t--;a+="0");}else if((t+=i-s)>0)for(i+1==s&&(a+=".");t--;a+="0");return n.s<0&&r?"-"+a:a}function z(n,t){var e,l,r=0;for(v(n[0])&&(n=n[0]),e=new V(n[0]);++r=10;r/=10,l++);return(e=l+e*h-1)>I?n.c=n.e=null:e=10;u/=10,r++);if((i=t-r)<0)i+=h,_=(c=m[p=0])/g[r-(o=t)-1]%10|0;else if((p=s((i+1)/h))>=m.length){if(!l)break n;for(;m.length<=p;m.push(0));c=_=0,r=1,o=(i%=h)-h+1}else{for(c=u=m[p],r=1;u>=10;u/=10,r++);_=(o=(i%=h)-h+r)<0?0:c/g[r-o-1]%10|0}if(l=l||t<0||null!=m[p+1]||(o<0?c:c%g[r-o-1]),l=e<4?(_||l)&&(0==e||e==(n.s<0?3:2)):_>5||5==_&&(4==e||l||6==e&&(i>0?o>0?c/g[r-o]:0:m[p-1])%10&1||e==(n.s<0?8:7)),t<1||!m[0])return m.length=0,l?(m[0]=g[(h-(t-=n.e+1)%h)%h],n.e=-t||0):m[0]=n.e=0,n;if(0==i?(m.length=p,u=1,p--):(m.length=p+1,u=g[h-i],m[p]=o>0?a(c/g[r-o]%g[o])*u:0),l)for(;;){if(0==p){for(i=1,o=m[0];o>=10;o/=10,i++);for(o=m[0]+=u,u=1;o>=10;o/=10,u++);i!=u&&(n.e++,m[0]==d&&(m[0]=1));break}if(m[p]+=u,m[p]!=d)break;m[p--]=0,u=1}for(i=m.length;0===m[--i];m.pop());}n.e>I?n.c=n.e=null:n.e>>11))>=9e15?(e=crypto.getRandomValues(new Uint32Array(2)),t[c]=e[0],t[c+1]=e[1]):(d.push(o%1e14),c+=2);c=r/2}else{if(!crypto.randomBytes)throw R=!1,Error(u+"crypto unavailable");for(t=crypto.randomBytes(r*=7);c=9e15?crypto.randomBytes(7).copy(t,c):(d.push(o%1e14),c+=7);c=r/7}if(!R)for(;c=10;o/=10,c++);ce-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/e|0,o[r]%=e)}return o.reverse()}return function(t,l,r,i,o){var s,a,u,c,d,h,p,f,_=t.indexOf("."),m=D,y=A;for(_>=0&&(c=N,N=0,t=t.replace(".",""),h=(f=new V(l)).pow(t.length-_),N=c,f.c=n(M(g(h.c),h.e,"0"),10,r,"0123456789"),f.e=f.c.length),u=c=(p=n(t,l,r,o?(s=B,"0123456789"):(s="0123456789",B))).length;0==p[--c];p.pop());if(!p[0])return s.charAt(0);if(_<0?--u:(h.c=p,h.e=u,h.s=i,p=(h=e(h,f,m,y,r)).c,d=h.r,u=h.e),_=p[a=u+m+1],c=r/2,d=d||a<0||null!=p[a+1],d=y<4?(null!=_||d)&&(0==y||y==(h.s<0?3:2)):_>c||_==c&&(4==y||d||6==y&&1&p[a-1]||y==(h.s<0?8:7)),a<1||!p[0])t=d?M(s.charAt(1),-m,s.charAt(0)):s.charAt(0);else{if(p.length=a,d)for(--r;++p[--a]>r;)p[a]=0,a||(++u,p=[1].concat(p));for(c=p.length;!p[--c];);for(_=0,t="";_<=c;t+=s.charAt(p[_++]));t=M(t,u,s.charAt(0))}return t}}(),e=function(){function n(n,t,e){var l,r,i,o,s=0,a=n.length,u=t%_,c=t/_|0;for(n=n.slice();a--;)s=((r=u*(i=n[a]%_)+(l=c*i+(o=n[a]/_|0)*u)%_*_+s)/e|0)+(l/_|0)+c*o,n[a]=r%e;return s&&(n=[s].concat(n)),n}function t(n,t,e,l){var r,i;if(e!=l)i=e>l?1:-1;else for(r=i=0;rt[r]?1:-1;break}return i}function e(n,t,e,l){for(var r=0;e--;)n[e]-=r,n[e]=(r=n[e]1;n.splice(0,1));}return function(l,r,i,o,s){var u,c,p,f,_,g,y,b,v,w,x,M,k,C,S,O,T,L=l.s==r.s?1:-1,P=l.c,D=r.c;if(!(P&&P[0]&&D&&D[0]))return new V(l.s&&r.s&&(P?!D||P[0]!=D[0]:D)?P&&0==P[0]||!D?0*L:L/0:NaN);for(v=(b=new V(L)).c=[],L=i+(c=l.e-r.e)+1,s||(s=d,c=m(l.e/h)-m(r.e/h),L=L/h|0),p=0;D[p]==(P[p]||0);p++);if(D[p]>(P[p]||0)&&c--,L<0)v.push(1),f=!0;else{for(C=P.length,O=D.length,p=0,L+=2,(_=a(s/(D[0]+1)))>1&&(D=n(D,_,s),P=n(P,_,s),O=D.length,C=P.length),k=O,x=(w=P.slice(0,O)).length;x=s/2&&S++;do{if(_=0,(u=t(D,w,O,x))<0){if(M=w[0],O!=x&&(M=M*s+(w[1]||0)),(_=a(M/S))>1)for(_>=s&&(_=s-1),y=(g=n(D,_,s)).length,x=w.length;1==t(g,w,y,x);)_--,e(g,O=10;L/=10,p++);G(b,i+(b.e=p+c*h-1)+1,o,f)}else b.e=c,b.r=+f;return b}}(),k=/^(-?)0([xbo])(?=\w[\w.]*$)/i,C=/^([^.]+)\.$/,S=/^\.([^.]+)$/,O=/^-?(Infinity|NaN)$/,T=/^\s*\+(?=[\w.])|^\s+|\s+$/g,r=function(n,t,e,l){var r,i=e?t:t.replace(T,"");if(O.test(i))n.s=isNaN(i)?null:i<0?-1:1,n.c=n.e=null;else{if(!e&&(i=i.replace(k,function(n,t,e){return r="x"==(e=e.toLowerCase())?16:"b"==e?2:8,l&&l!=r?n:t}),l&&(r=l,i=i.replace(C,"$1").replace(S,"0.$1")),t!=i))return new V(i,r);if(V.DEBUG)throw Error(u+"Not a"+(l?" base "+l:"")+" number: "+t);n.c=n.e=n.s=null}},L.absoluteValue=L.abs=function(){var n=new V(this);return n.s<0&&(n.s=1),n},L.comparedTo=function(n,t){return y(this,new V(n,t))},L.decimalPlaces=L.dp=function(n,t){var e,l,r,i=this;if(null!=n)return b(n,0,1e9),null==t?t=A:b(t,0,8),G(new V(i),n+i.e+1,t);if(!(e=i.c))return null;if(l=((r=e.length-1)-m(this.e/h))*h,r=e[r])for(;r%10==0;r/=10,l--);return l<0&&(l=0),l},L.dividedBy=L.div=function(n,t){return e(this,new V(n,t),D,A)},L.dividedToIntegerBy=L.idiv=function(n,t){return e(this,new V(n,t),0,1)},L.exponentiatedBy=L.pow=function(n,t){var e,l,r,i,o,c,d,p=this;if((n=new V(n)).c&&!n.isInteger())throw Error(u+"Exponent not an integer: "+n);if(null!=t&&(t=new V(t)),i=n.e>14,!p.c||!p.c[0]||1==p.c[0]&&!p.e&&1==p.c.length||!n.c||!n.c[0])return d=new V(Math.pow(+p.valueOf(),i?2-w(n):+n)),t?d.mod(t):d;if(o=n.s<0,t){if(t.c?!t.c[0]:!t.s)return new V(NaN);(l=!o&&p.isInteger()&&t.isInteger())&&(p=p.mod(t))}else{if(n.e>9&&(p.e>0||p.e<-1||(0==p.e?p.c[0]>1||i&&p.c[1]>=24e7:p.c[0]<8e13||i&&p.c[0]<=9999975e7)))return r=p.s<0&&w(n)?-0:0,p.e>-1&&(r=1/r),new V(o?1/r:r);N&&(r=s(N/h+2))}for(i?(e=new V(.5),c=w(n)):c=n%2,o&&(n.s=1),d=new V(P);;){if(c){if(!(d=d.times(p)).c)break;r?d.c.length>r&&(d.c.length=r):l&&(d=d.mod(t))}if(i){if(G(n=n.times(e),n.e+1,1),!n.c[0])break;i=n.e>14,c=w(n)}else{if(!(n=a(n/2)))break;c=n%2}p=p.times(p),r?p.c&&p.c.length>r&&(p.c.length=r):l&&(p=p.mod(t))}return l?d:(o&&(d=P.div(d)),t?d.mod(t):r?G(d,N,A,void 0):d)},L.integerValue=function(n){var t=new V(this);return null==n?n=A:b(n,0,8),G(t,t.e+1,n)},L.isEqualTo=L.eq=function(n,t){return 0===y(this,new V(n,t))},L.isFinite=function(){return!!this.c},L.isGreaterThan=L.gt=function(n,t){return y(this,new V(n,t))>0},L.isGreaterThanOrEqualTo=L.gte=function(n,t){return 1===(t=y(this,new V(n,t)))||0===t},L.isInteger=function(){return!!this.c&&m(this.e/h)>this.c.length-2},L.isLessThan=L.lt=function(n,t){return y(this,new V(n,t))<0},L.isLessThanOrEqualTo=L.lte=function(n,t){return-1===(t=y(this,new V(n,t)))||0===t},L.isNaN=function(){return!this.s},L.isNegative=function(){return this.s<0},L.isPositive=function(){return this.s>0},L.isZero=function(){return!!this.c&&0==this.c[0]},L.minus=function(n,t){var e,l,r,i,o=this,s=o.s;if(t=(n=new V(n,t)).s,!s||!t)return new V(NaN);if(s!=t)return n.s=-t,o.plus(n);var a=o.e/h,u=n.e/h,c=o.c,p=n.c;if(!a||!u){if(!c||!p)return c?(n.s=-t,n):new V(p?o:NaN);if(!c[0]||!p[0])return p[0]?(n.s=-t,n):new V(c[0]?o:3==A?-0:0)}if(a=m(a),u=m(u),c=c.slice(),s=a-u){for((i=s<0)?(s=-s,r=c):(u=a,r=p),r.reverse(),t=s;t--;r.push(0));r.reverse()}else for(l=(i=(s=c.length)<(t=p.length))?s:t,s=t=0;t0)for(;t--;c[e++]=0);for(t=d-1;l>s;){if(c[--l]=0;){for(e=0,f=M[r]%v,g=M[r]/v|0,i=r+(o=a);i>r;)e=((u=f*(u=x[--o]%v)+(s=g*u+(c=x[o]/v|0)*f)%v*v+y[i]+e)/b|0)+(s/v|0)+g*c,y[i--]=u%b;y[i]=e}return e?++l:y.splice(0,1),U(n,y,l)},L.negated=function(){var n=new V(this);return n.s=-n.s||null,n},L.plus=function(n,t){var e,l=this,r=l.s;if(t=(n=new V(n,t)).s,!r||!t)return new V(NaN);if(r!=t)return n.s=-t,l.minus(n);var i=l.e/h,o=n.e/h,s=l.c,a=n.c;if(!i||!o){if(!s||!a)return new V(r/0);if(!s[0]||!a[0])return a[0]?n:new V(s[0]?l:0*r)}if(i=m(i),o=m(o),s=s.slice(),r=i-o){for(r>0?(o=i,e=a):(r=-r,e=s),e.reverse();r--;e.push(0));e.reverse()}for((r=s.length)-(t=a.length)<0&&(e=a,a=s,s=e,t=r),r=0;t;)r=(s[--t]=s[t]+a[t]+r)/d|0,s[t]=d===s[t]?0:s[t]%d;return r&&(s=[r].concat(s),++o),U(n,s,o)},L.precision=L.sd=function(n,t){var e,l,r,i=this;if(null!=n&&n!==!!n)return b(n,1,1e9),null==t?t=A:b(t,0,8),G(new V(i),n,t);if(!(e=i.c))return null;if(l=(r=e.length-1)*h+1,r=e[r]){for(;r%10==0;r/=10,l--);for(r=e[0];r>=10;r/=10,l++);}return n&&i.e+1>l&&(l=i.e+1),l},L.shiftedBy=function(n){return b(n,-p,p),this.times("1e"+n)},L.squareRoot=L.sqrt=function(){var n,t,l,r,i,o=this,s=o.c,a=o.s,u=o.e,c=D+4,d=new V("0.5");if(1!==a||!s||!s[0])return new V(!a||a<0&&(!s||s[0])?NaN:s?o:1/0);if(0==(a=Math.sqrt(+o))||a==1/0?(((t=g(s)).length+u)%2==0&&(t+="0"),a=Math.sqrt(t),u=m((u+1)/2)-(u<0||u%2),l=new V(t=a==1/0?"1e"+u:(t=a.toExponential()).slice(0,t.indexOf("e")+1)+u)):l=new V(a+""),l.c[0])for((a=(u=l.e)+c)<3&&(a=0);;)if(l=d.times((i=l).plus(e(o,i,c,1))),g(i.c).slice(0,a)===(t=g(l.c)).slice(0,a)){if(l.e0&&h>0){for(a=d.substr(0,l=h%i||i);l0&&(a+=s+d.slice(l)),c&&(a="-"+a)}e=u?a+F.decimalSeparator+((o=+F.fractionGroupSize)?u.replace(new RegExp("\\d{"+o+"}\\B","g"),"$&"+F.fractionGroupSeparator):u):a}return e},L.toFraction=function(n){var t,l,r,i,o,s,a,c,d,p,_,m,y=this,b=y.c;if(null!=n&&(!(c=new V(n)).isInteger()&&(c.c||1!==c.s)||c.lt(P)))throw Error(u+"Argument "+(c.isInteger()?"out of range: ":"not an integer: ")+n);if(!b)return y.toString();for(l=new V(P),p=r=new V(P),i=d=new V(P),m=g(b),s=l.e=m.length-y.e-1,l.c[0]=f[(a=s%h)<0?h+a:a],n=!n||c.comparedTo(l)>0?s>0?l:p:c,a=I,I=1/0,c=new V(m),d.c[0]=0;_=e(c,l,0,1),1!=(o=r.plus(_.times(i))).comparedTo(n);)r=i,i=o,p=d.plus(_.times(o=p)),d=o,l=c.minus(_.times(o=l)),c=o;return o=e(n.minus(r),i,0,1),d=d.plus(o.times(p)),r=r.plus(o.times(i)),d.s=p.s=y.s,t=e(p,i,s*=2,A).minus(y).abs().comparedTo(e(d,r,s,A).minus(y).abs())<1?[p.toString(),i.toString()]:[d.toString(),r.toString()],I=a,t},L.toNumber=function(){return+this},L.toPrecision=function(n,t){return null!=n&&b(n,1,1e9),W(this,n,t,2)},L.toString=function(n){var t,e=this,r=e.s,i=e.e;return null===i?r?(t="Infinity",r<0&&(t="-"+t)):t="NaN":(t=g(e.c),null==n?t=i<=E||i>=Y?x(t,i):M(t,i,"0"):(b(n,2,B.length,"Base"),t=l(M(t,i,"0"),10,n,r,!0)),r<0&&e.c[0]&&(t="-"+t)),t},L.valueOf=L.toJSON=function(){var n,t=this,e=t.e;return null===e?t.toString():(n=g(t.c),n=e<=E||e>=Y?x(n,e):M(n,e,"0"),t.s<0?"-"+n:n)},L._isBigNumber=!0,null!=t&&V.set(t),V}()).default=i.BigNumber=i,void 0===(l=(function(){return i}).call(t,e,t,n))||(n.exports=l)}()},upln:function(n,t,e){!function(n){"use strict";function t(n){return n%100==11||n%10!=1}function e(n,e,l,r){var i=n+" ";switch(l){case"s":return e||r?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return t(n)?i+(e||r?"sek\xfandur":"sek\xfandum"):i+"sek\xfanda";case"m":return e?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return t(n)?i+(e||r?"m\xedn\xfatur":"m\xedn\xfatum"):e?i+"m\xedn\xfata":i+"m\xedn\xfatu";case"hh":return t(n)?i+(e||r?"klukkustundir":"klukkustundum"):i+"klukkustund";case"d":return e?"dagur":r?"dag":"degi";case"dd":return t(n)?e?i+"dagar":i+(r?"daga":"d\xf6gum"):e?i+"dagur":i+(r?"dag":"degi");case"M":return e?"m\xe1nu\xf0ur":r?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return t(n)?e?i+"m\xe1nu\xf0ir":i+(r?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):e?i+"m\xe1nu\xf0ur":i+(r?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return e||r?"\xe1r":"\xe1ri";case"yy":return t(n)?i+(e||r?"\xe1r":"\xe1rum"):i+(e||r?"\xe1r":"\xe1ri")}}n.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:e,ss:e,m:e,mm:e,h:"klukkustund",hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},uslO:function(n,t,e){var l={"./af":"3CJN","./af.js":"3CJN","./ar":"3MVc","./ar-dz":"tkWw","./ar-dz.js":"tkWw","./ar-kw":"j8cJ","./ar-kw.js":"j8cJ","./ar-ly":"wPpW","./ar-ly.js":"wPpW","./ar-ma":"dURR","./ar-ma.js":"dURR","./ar-sa":"7OnE","./ar-sa.js":"7OnE","./ar-tn":"BEem","./ar-tn.js":"BEem","./ar.js":"3MVc","./az":"eHwN","./az.js":"eHwN","./be":"3hfc","./be.js":"3hfc","./bg":"lOED","./bg.js":"lOED","./bm":"hng5","./bm.js":"hng5","./bn":"aM0x","./bn.js":"aM0x","./bo":"w2Hs","./bo.js":"w2Hs","./br":"OSsP","./br.js":"OSsP","./bs":"aqvp","./bs.js":"aqvp","./ca":"wIgY","./ca.js":"wIgY","./cs":"ssxj","./cs.js":"ssxj","./cv":"N3vo","./cv.js":"N3vo","./cy":"ZFGz","./cy.js":"ZFGz","./da":"YBA/","./da.js":"YBA/","./de":"DOkx","./de-at":"8v14","./de-at.js":"8v14","./de-ch":"Frex","./de-ch.js":"Frex","./de.js":"DOkx","./dv":"rIuo","./dv.js":"rIuo","./el":"CFqe","./el.js":"CFqe","./en-au":"Sjoy","./en-au.js":"Sjoy","./en-ca":"Tqun","./en-ca.js":"Tqun","./en-gb":"hPuz","./en-gb.js":"hPuz","./en-ie":"ALEw","./en-ie.js":"ALEw","./en-il":"QZk1","./en-il.js":"QZk1","./en-nz":"dyB6","./en-nz.js":"dyB6","./eo":"Nd3h","./eo.js":"Nd3h","./es":"LT9G","./es-do":"7MHZ","./es-do.js":"7MHZ","./es-us":"INcR","./es-us.js":"INcR","./es.js":"LT9G","./et":"XlWM","./et.js":"XlWM","./eu":"sqLM","./eu.js":"sqLM","./fa":"2pmY","./fa.js":"2pmY","./fi":"nS2h","./fi.js":"nS2h","./fo":"OVPi","./fo.js":"OVPi","./fr":"tzHd","./fr-ca":"bXQP","./fr-ca.js":"bXQP","./fr-ch":"VK9h","./fr-ch.js":"VK9h","./fr.js":"tzHd","./fy":"g7KF","./fy.js":"g7KF","./gd":"nLOz","./gd.js":"nLOz","./gl":"FuaP","./gl.js":"FuaP","./gom-latn":"+27R","./gom-latn.js":"+27R","./gu":"rtsW","./gu.js":"rtsW","./he":"Nzt2","./he.js":"Nzt2","./hi":"ETHv","./hi.js":"ETHv","./hr":"V4qH","./hr.js":"V4qH","./hu":"xne+","./hu.js":"xne+","./hy-am":"GrS7","./hy-am.js":"GrS7","./id":"yRTJ","./id.js":"yRTJ","./is":"upln","./is.js":"upln","./it":"FKXc","./it.js":"FKXc","./ja":"ORgI","./ja.js":"ORgI","./jv":"JwiF","./jv.js":"JwiF","./ka":"RnJI","./ka.js":"RnJI","./kk":"j+vx","./kk.js":"j+vx","./km":"5j66","./km.js":"5j66","./kn":"gEQe","./kn.js":"gEQe","./ko":"eBB/","./ko.js":"eBB/","./ky":"6cf8","./ky.js":"6cf8","./lb":"z3hR","./lb.js":"z3hR","./lo":"nE8X","./lo.js":"nE8X","./lt":"/6P1","./lt.js":"/6P1","./lv":"jxEH","./lv.js":"jxEH","./me":"svD2","./me.js":"svD2","./mi":"gEU3","./mi.js":"gEU3","./mk":"Ab7C","./mk.js":"Ab7C","./ml":"oo1B","./ml.js":"oo1B","./mr":"5vPg","./mr.js":"5vPg","./ms":"ooba","./ms-my":"G++c","./ms-my.js":"G++c","./ms.js":"ooba","./mt":"oCzW","./mt.js":"oCzW","./my":"F+2e","./my.js":"F+2e","./nb":"FlzV","./nb.js":"FlzV","./ne":"/mhn","./ne.js":"/mhn","./nl":"3K28","./nl-be":"Bp2f","./nl-be.js":"Bp2f","./nl.js":"3K28","./nn":"C7av","./nn.js":"C7av","./pa-in":"pfs9","./pa-in.js":"pfs9","./pl":"7LV+","./pl.js":"7LV+","./pt":"ZoSI","./pt-br":"AoDM","./pt-br.js":"AoDM","./pt.js":"ZoSI","./ro":"wT5f","./ro.js":"wT5f","./ru":"ulq9","./ru.js":"ulq9","./sd":"fW1y","./sd.js":"fW1y","./se":"5Omq","./se.js":"5Omq","./si":"Lgqo","./si.js":"Lgqo","./sk":"OUMt","./sk.js":"OUMt","./sl":"2s1U","./sl.js":"2s1U","./sq":"V0td","./sq.js":"V0td","./sr":"f4W3","./sr-cyrl":"c1x4","./sr-cyrl.js":"c1x4","./sr.js":"f4W3","./ss":"7Q8x","./ss.js":"7Q8x","./sv":"Fpqq","./sv.js":"Fpqq","./sw":"DSXN","./sw.js":"DSXN","./ta":"+7/x","./ta.js":"+7/x","./te":"Nlnz","./te.js":"Nlnz","./tet":"gUgh","./tet.js":"gUgh","./tg":"5SNd","./tg.js":"5SNd","./th":"XzD+","./th.js":"XzD+","./tl-ph":"3LKG","./tl-ph.js":"3LKG","./tlh":"m7yE","./tlh.js":"m7yE","./tr":"k+5o","./tr.js":"k+5o","./tzl":"iNtv","./tzl.js":"iNtv","./tzm":"FRPF","./tzm-latn":"krPU","./tzm-latn.js":"krPU","./tzm.js":"FRPF","./ug-cn":"To0v","./ug-cn.js":"To0v","./uk":"ntHu","./uk.js":"ntHu","./ur":"uSe8","./ur.js":"uSe8","./uz":"XU1s","./uz-latn":"/bsm","./uz-latn.js":"/bsm","./uz.js":"XU1s","./vi":"0X8Q","./vi.js":"0X8Q","./x-pseudo":"e/KL","./x-pseudo.js":"e/KL","./yo":"YXlc","./yo.js":"YXlc","./zh-cn":"Vz2w","./zh-cn.js":"Vz2w","./zh-hk":"ZUyn","./zh-hk.js":"ZUyn","./zh-tw":"BbgG","./zh-tw.js":"BbgG"};function r(n){return e(i(n))}function i(n){var t=l[n];if(!(t+1))throw new Error("Cannot find module '"+n+"'.");return t}r.keys=function(){return Object.keys(l)},r.resolve=i,n.exports=r,r.id="uslO"},w2Hs:function(n,t,e){!function(n){"use strict";var t={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},e={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};n.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(n){return n.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===t&&n>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===t&&n<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===t?n+12:n},meridiem:function(n,t,e){return n<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":n<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":n<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":n<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(e("PJh5"))},wIgY:function(n,t,e){!function(n){"use strict";n.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(n,t){var e=1===n?"r":2===n?"n":3===n?"r":4===n?"t":"\xe8";return"w"!==t&&"W"!==t||(e="a"),n+e},week:{dow:1,doy:4}})}(e("PJh5"))},wPpW:function(n,t,e){!function(n){"use strict";var t={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},e=function(n){return 0===n?0:1===n?1:2===n?2:n%100>=3&&n%100<=10?3:n%100>=11?4:5},l={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},r=function(n){return function(t,r,i,o){var s=e(t),a=l[n][e(t)];return 2===s&&(a=a[r?0:1]),a.replace(/%d/i,t)}},i=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];n.defineLocale("ar-ly",{months:i,monthsShort:i,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(n){return"\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:r("s"),ss:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(e("PJh5"))},wT5f:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l=" ";return(n%100>=20||n>=100&&n%100==0)&&(l=" de "),n+l+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"}[e]}n.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:t,m:"un minut",mm:t,h:"o or\u0103",hh:t,d:"o zi",dd:t,M:"o lun\u0103",MM:t,y:"un an",yy:t},week:{dow:1,doy:7}})}(e("PJh5"))},x35b:function(n,t,e){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l=e("WT6e"),r={nodeUrl:"/api/",production:!0,tellerUrl:"https://event.skycoin.com/api/",swaplab:{apiKey:"w4bxe2tbf9beb72r",activateTestMode:!1,endStatusInError:!1}},i=(e("rxKx"),e("TToO")),o=e("YaPU"),s=function(){},a=new l.r("Location Initialized"),u=function(){},c=new l.r("appBaseHref"),d=function(){function n(t){var e=this;this._subject=new l.o,this._platformStrategy=t;var r=this._platformStrategy.getBaseHref();this._baseHref=n.stripTrailingSlash(h(r)),this._platformStrategy.onPopState(function(n){e._subject.emit({url:e.path(!0),pop:!0,type:n.type})})}return n.prototype.path=function(n){return void 0===n&&(n=!1),this.normalize(this._platformStrategy.path(n))},n.prototype.isCurrentPathEqualTo=function(t,e){return void 0===e&&(e=""),this.path()==this.normalize(t+n.normalizeQueryParams(e))},n.prototype.normalize=function(t){return n.stripTrailingSlash(function(n,t){return n&&t.startsWith(n)?t.substring(n.length):t}(this._baseHref,h(t)))},n.prototype.prepareExternalUrl=function(n){return n&&"/"!==n[0]&&(n="/"+n),this._platformStrategy.prepareExternalUrl(n)},n.prototype.go=function(n,t){void 0===t&&(t=""),this._platformStrategy.pushState(null,"",n,t)},n.prototype.replaceState=function(n,t){void 0===t&&(t=""),this._platformStrategy.replaceState(null,"",n,t)},n.prototype.forward=function(){this._platformStrategy.forward()},n.prototype.back=function(){this._platformStrategy.back()},n.prototype.subscribe=function(n,t,e){return this._subject.subscribe({next:n,error:t,complete:e})},n.normalizeQueryParams=function(n){return n&&"?"!==n[0]?"?"+n:n},n.joinWithSlash=function(n,t){if(0==n.length)return t;if(0==t.length)return n;var e=0;return n.endsWith("/")&&e++,t.startsWith("/")&&e++,2==e?n+t.substring(1):1==e?n+t:n+"/"+t},n.stripTrailingSlash=function(n){var t=n.match(/#|\?|$/),e=t&&t.index||n.length;return n.slice(0,e-("/"===n[e-1]?1:0))+n.slice(e)},n}();function h(n){return n.replace(/\/index.html$/,"")}var p=function(n){function t(t,e){var l=n.call(this)||this;return l._platformLocation=t,l._baseHref="",null!=e&&(l._baseHref=e),l}return Object(i.__extends)(t,n),t.prototype.onPopState=function(n){this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n)},t.prototype.getBaseHref=function(){return this._baseHref},t.prototype.path=function(n){void 0===n&&(n=!1);var t=this._platformLocation.hash;return null==t&&(t="#"),t.length>0?t.substring(1):t},t.prototype.prepareExternalUrl=function(n){var t=d.joinWithSlash(this._baseHref,n);return t.length>0?"#"+t:t},t.prototype.pushState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.pushState(n,t,r)},t.prototype.replaceState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.replaceState(n,t,r)},t.prototype.forward=function(){this._platformLocation.forward()},t.prototype.back=function(){this._platformLocation.back()},t}(u),f=function(n){function t(t,e){var l=n.call(this)||this;if(l._platformLocation=t,null==e&&(e=l._platformLocation.getBaseHrefFromDOM()),null==e)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return l._baseHref=e,l}return Object(i.__extends)(t,n),t.prototype.onPopState=function(n){this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n)},t.prototype.getBaseHref=function(){return this._baseHref},t.prototype.prepareExternalUrl=function(n){return d.joinWithSlash(this._baseHref,n)},t.prototype.path=function(n){void 0===n&&(n=!1);var t=this._platformLocation.pathname+d.normalizeQueryParams(this._platformLocation.search),e=this._platformLocation.hash;return e&&n?""+t+e:t},t.prototype.pushState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));this._platformLocation.pushState(n,t,r)},t.prototype.replaceState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));this._platformLocation.replaceState(n,t,r)},t.prototype.forward=function(){this._platformLocation.forward()},t.prototype.back=function(){this._platformLocation.back()},t}(u),_={AOA:[,"Kz"],ARS:[,"$"],AUD:["A$","$"],BAM:[,"KM"],BBD:[,"$"],BDT:[,"\u09f3"],BMD:[,"$"],BND:[,"$"],BOB:[,"Bs"],BRL:["R$"],BSD:[,"$"],BWP:[,"P"],BYN:[,"\u0440."],BZD:[,"$"],CAD:["CA$","$"],CLP:[,"$"],CNY:["CN\xa5","\xa5"],COP:[,"$"],CRC:[,"\u20a1"],CUC:[,"$"],CUP:[,"$"],CZK:[,"K\u010d"],DKK:[,"kr"],DOP:[,"$"],EGP:[,"E\xa3"],ESP:[,"\u20a7"],EUR:["\u20ac"],FJD:[,"$"],FKP:[,"\xa3"],GBP:["\xa3"],GEL:[,"\u20be"],GIP:[,"\xa3"],GNF:[,"FG"],GTQ:[,"Q"],GYD:[,"$"],HKD:["HK$","$"],HNL:[,"L"],HRK:[,"kn"],HUF:[,"Ft"],IDR:[,"Rp"],ILS:["\u20aa"],INR:["\u20b9"],ISK:[,"kr"],JMD:[,"$"],JPY:["\xa5"],KHR:[,"\u17db"],KMF:[,"CF"],KPW:[,"\u20a9"],KRW:["\u20a9"],KYD:[,"$"],KZT:[,"\u20b8"],LAK:[,"\u20ad"],LBP:[,"L\xa3"],LKR:[,"Rs"],LRD:[,"$"],LTL:[,"Lt"],LVL:[,"Ls"],MGA:[,"Ar"],MMK:[,"K"],MNT:[,"\u20ae"],MUR:[,"Rs"],MXN:["MX$","$"],MYR:[,"RM"],NAD:[,"$"],NGN:[,"\u20a6"],NIO:[,"C$"],NOK:[,"kr"],NPR:[,"Rs"],NZD:["NZ$","$"],PHP:[,"\u20b1"],PKR:[,"Rs"],PLN:[,"z\u0142"],PYG:[,"\u20b2"],RON:[,"lei"],RUB:[,"\u20bd"],RUR:[,"\u0440."],RWF:[,"RF"],SBD:[,"$"],SEK:[,"kr"],SGD:[,"$"],SHP:[,"\xa3"],SRD:[,"$"],SSP:[,"\xa3"],STD:[,"Db"],SYP:[,"\xa3"],THB:[,"\u0e3f"],TOP:[,"T$"],TRY:[,"\u20ba"],TTD:[,"$"],TWD:["NT$","$"],UAH:[,"\u20b4"],USD:["$"],UYU:[,"$"],VEF:[,"Bs"],VND:["\u20ab"],XAF:["FCFA"],XCD:["EC$","$"],XOF:["CFA"],XPF:["CFPF"],ZAR:[,"R"],ZMW:[,"ZK"]},m=["en",[["a","p"],["AM","PM"]],[["AM","PM"],,],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",,"{1} 'at' {0}"],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"$","US Dollar",function(n){var t=Math.floor(Math.abs(n)),e=n.toString().replace(/^[^.]*\.?/,"").length;return 1===t&&0===e?1:5}],g={},y=function(){var n={Decimal:0,Percent:1,Currency:2,Scientific:3};return n[n.Decimal]="Decimal",n[n.Percent]="Percent",n[n.Currency]="Currency",n[n.Scientific]="Scientific",n}(),b=function(){var n={Zero:0,One:1,Two:2,Few:3,Many:4,Other:5};return n[n.Zero]="Zero",n[n.One]="One",n[n.Two]="Two",n[n.Few]="Few",n[n.Many]="Many",n[n.Other]="Other",n}(),v=function(){var n={Decimal:0,Group:1,List:2,PercentSign:3,PlusSign:4,MinusSign:5,Exponential:6,SuperscriptingExponent:7,PerMille:8,Infinity:9,NaN:10,TimeSeparator:11,CurrencyDecimal:12,CurrencyGroup:13};return n[n.Decimal]="Decimal",n[n.Group]="Group",n[n.List]="List",n[n.PercentSign]="PercentSign",n[n.PlusSign]="PlusSign",n[n.MinusSign]="MinusSign",n[n.Exponential]="Exponential",n[n.SuperscriptingExponent]="SuperscriptingExponent",n[n.PerMille]="PerMille",n[n.Infinity]="Infinity",n[n.NaN]="NaN",n[n.TimeSeparator]="TimeSeparator",n[n.CurrencyDecimal]="CurrencyDecimal",n[n.CurrencyGroup]="CurrencyGroup",n}();function w(n,t){var e=x(n),l=e[13][t];if("undefined"==typeof l){if(t===v.CurrencyDecimal)return e[13][v.Decimal];if(t===v.CurrencyGroup)return e[13][v.Group]}return l}function x(n){var t=n.toLowerCase().replace(/_/g,"-"),e=g[t];if(e)return e;var l=t.split("-")[0];if(e=g[l])return e;if("en"===l)return m;throw new Error('Missing locale data for the locale "'+n+'".')}var M=new l.r("UseV4Plurals"),k=function(){},C=function(n){function t(t,e){var l=n.call(this)||this;return l.locale=t,l.deprecatedPluralFn=e,l}return Object(i.__extends)(t,n),t.prototype.getPluralCategory=function(n,t){switch(this.deprecatedPluralFn?this.deprecatedPluralFn(t||this.locale,n):function(n){return x(n)[17]}(t||this.locale)(n)){case b.Zero:return"zero";case b.One:return"one";case b.Two:return"two";case b.Few:return"few";case b.Many:return"many";default:return"other"}},t}(k);function S(n,t){t=encodeURIComponent(t);for(var e=0,l=n.split(";");e-1&&(o=o.replace(V,"")),(l=o.search(/e/i))>0?(e<0&&(e=l),e+=+o.slice(l+1),o=o.substring(0,l)):e<0&&(e=o.length),l=0;o.charAt(l)===W;l++);if(l===(i=o.length))t=[0],e=1;else{for(i--;o.charAt(i)===W;)i--;for(e-=l,t=[],r=0;l<=i;l++,r++)t[r]=+o.charAt(l)}return e>B&&(t=t.splice(0,B-1),s=e-1,e=1),{digits:t,exponent:s,integerLen:e}}(i);e===y.Percent&&(d=function(n){if(0===n.digits[0])return n;var t=n.digits.length-n.integerLen;return n.exponent?n.exponent+=2:(0===t?n.digits.push(0,0):1===t&&n.digits.push(0),n.integerLen+=2),n}(d));var h=a.minInt,p=a.minFrac,f=a.maxFrac;if(l){var _=l.match(F);if(null===_)return o.error=l+" is not a valid digit info",o;var m=_[1],g=_[3],b=_[5];null!=m&&(h=K(m)),null!=g&&(p=K(g)),null!=b?f=K(b):null!=g&&p>f&&(f=p)}!function(n,t,e){if(t>e)throw new Error("The minimum number of digits after fraction ("+t+") is higher than the maximum ("+e+").");var l=n.digits,r=l.length-n.integerLen,i=Math.min(Math.max(t,r),e),o=i+n.integerLen,s=l[o];if(o>0){l.splice(Math.max(n.integerLen,o));for(var a=o;a=5)if(o-1<0){for(var c=0;c>o;c--)l.unshift(0),n.integerLen++;l.unshift(1),n.integerLen++}else l[o-1]++;for(;r=h?l.pop():d=!1),t>=10?1:0},0);p&&(l.unshift(p),n.integerLen++)}(d,p,f);var M=d.digits,k=d.integerLen,C=d.exponent,S=[];for(c=M.every(function(n){return!n});k0?S=M.splice(k,M.length):(S=M,M=[0]);var O=[];for(M.length>=a.lgSize&&O.unshift(M.splice(-a.lgSize,M.length).join(""));M.length>a.gSize;)O.unshift(M.splice(-a.gSize,M.length).join(""));M.length&&O.unshift(M.join("")),u=O.join(w(t,r?v.CurrencyGroup:v.Group)),S.length&&(u+=w(t,r?v.CurrencyDecimal:v.Decimal)+S.join("")),C&&(u+=w(t,v.Exponential)+"+"+C)}else u=w(t,v.Infinity);return u=i<0&&!c?a.negPre+u+a.negSuf:a.posPre+u+a.posSuf,e===y.Currency&&null!==r?(o.str=u.replace(q,r).replace(q,""),o):e===y.Percent?(o.str=u.replace(new RegExp(J,"g"),w(t,v.PercentSign)),o):(o.str=u,o)}function K(n){var t=parseInt(n);if(isNaN(t))throw new Error("Invalid integer literal when parsing "+n);return t}var X=function(){function n(){}return n.prototype.createSubscription=function(n,t){return n.subscribe({next:t,error:function(n){throw n}})},n.prototype.dispose=function(n){n.unsubscribe()},n.prototype.onDestroy=function(n){n.unsubscribe()},n}(),Z=new(function(){function n(){}return n.prototype.createSubscription=function(n,t){return n.then(t,function(n){throw n})},n.prototype.dispose=function(n){},n.prototype.onDestroy=function(n){},n}()),$=new X,nn=function(){function n(n){this._ref=n,this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null,this._strategy=null}return n.prototype.ngOnDestroy=function(){this._subscription&&this._dispose()},n.prototype.transform=function(n){return this._obj?n!==this._obj?(this._dispose(),this.transform(n)):this._latestValue===this._latestReturnedValue?this._latestReturnedValue:(this._latestReturnedValue=this._latestValue,l.T.wrap(this._latestValue)):(n&&this._subscribe(n),this._latestReturnedValue=this._latestValue,this._latestValue)},n.prototype._subscribe=function(n){var t=this;this._obj=n,this._strategy=this._selectStrategy(n),this._subscription=this._strategy.createSubscription(n,function(e){return t._updateLatestValue(n,e)})},n.prototype._selectStrategy=function(t){if(Object(l._15)(t))return Z;if(Object(l._14)(t))return $;throw N(n,t)},n.prototype._dispose=function(){this._strategy.dispose(this._subscription),this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null},n.prototype._updateLatestValue=function(n,t){n===this._obj&&(this._latestValue=t,this._ref.markForCheck())},n}(),tn=function(){function n(n){this._locale=n}return n.prototype.transform=function(t,e,l){if(rn(t))return null;var r=Q(t,l=l||this._locale,y.Decimal,e),i=r.str,o=r.error;if(o)throw N(n,o);return i},n}(),en=function(){function n(n){this._locale=n}return n.prototype.transform=function(t,e,l){if(rn(t))return null;var r=Q(t,l=l||this._locale,y.Percent,e),i=r.str,o=r.error;if(o)throw N(n,o);return i},n}(),ln=function(){function n(n){this._locale=n}return n.prototype.transform=function(t,e,l,r,i){if(void 0===l&&(l="symbol"),rn(t))return null;i=i||this._locale,"boolean"==typeof l&&(console&&console.warn&&console.warn('Warning: the currency pipe has been changed in Angular v5. The symbolDisplay option (third parameter) is now a string instead of a boolean. The accepted values are "code", "symbol" or "symbol-narrow".'),l=l?"symbol":"code");var o=e||"USD";"code"!==l&&(o=function(n,t){var e=_[n]||[],r=e[1];return"narrow"==("symbol"===l?"wide":"narrow")&&"string"==typeof r?r:e[0]||n}(o));var s=Q(t,i,y.Currency,r,o),a=s.str,u=s.error;if(u)throw N(n,u);return a},n}();function rn(n){return null==n||""===n||n!=n}var on=function(){},sn=new l.r("DocumentToken"),an=null;function un(){return an}var cn,dn={class:"className",innerHtml:"innerHTML",readonly:"readOnly",tabindex:"tabIndex"},hn={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},pn={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"};l._10.Node&&(cn=l._10.Node.prototype.contains||function(n){return!!(16&this.compareDocumentPosition(n))});var fn,_n=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),t.prototype.parse=function(n){throw new Error("parse not implemented")},t.makeCurrent=function(){var n;n=new t,an||(an=n)},t.prototype.hasProperty=function(n,t){return t in n},t.prototype.setProperty=function(n,t,e){n[t]=e},t.prototype.getProperty=function(n,t){return n[t]},t.prototype.invoke=function(n,t,e){var l;(l=n)[t].apply(l,e)},t.prototype.logError=function(n){window.console&&(console.error?console.error(n):console.log(n))},t.prototype.log=function(n){window.console&&window.console.log&&window.console.log(n)},t.prototype.logGroup=function(n){window.console&&window.console.group&&window.console.group(n)},t.prototype.logGroupEnd=function(){window.console&&window.console.groupEnd&&window.console.groupEnd()},Object.defineProperty(t.prototype,"attrToPropMap",{get:function(){return dn},enumerable:!0,configurable:!0}),t.prototype.contains=function(n,t){return cn.call(n,t)},t.prototype.querySelector=function(n,t){return n.querySelector(t)},t.prototype.querySelectorAll=function(n,t){return n.querySelectorAll(t)},t.prototype.on=function(n,t,e){n.addEventListener(t,e,!1)},t.prototype.onAndCancel=function(n,t,e){return n.addEventListener(t,e,!1),function(){n.removeEventListener(t,e,!1)}},t.prototype.dispatchEvent=function(n,t){n.dispatchEvent(t)},t.prototype.createMouseEvent=function(n){var t=this.getDefaultDocument().createEvent("MouseEvent");return t.initEvent(n,!0,!0),t},t.prototype.createEvent=function(n){var t=this.getDefaultDocument().createEvent("Event");return t.initEvent(n,!0,!0),t},t.prototype.preventDefault=function(n){n.preventDefault(),n.returnValue=!1},t.prototype.isPrevented=function(n){return n.defaultPrevented||null!=n.returnValue&&!n.returnValue},t.prototype.getInnerHTML=function(n){return n.innerHTML},t.prototype.getTemplateContent=function(n){return"content"in n&&this.isTemplateElement(n)?n.content:null},t.prototype.getOuterHTML=function(n){return n.outerHTML},t.prototype.nodeName=function(n){return n.nodeName},t.prototype.nodeValue=function(n){return n.nodeValue},t.prototype.type=function(n){return n.type},t.prototype.content=function(n){return this.hasProperty(n,"content")?n.content:n},t.prototype.firstChild=function(n){return n.firstChild},t.prototype.nextSibling=function(n){return n.nextSibling},t.prototype.parentElement=function(n){return n.parentNode},t.prototype.childNodes=function(n){return n.childNodes},t.prototype.childNodesAsList=function(n){for(var t=n.childNodes,e=new Array(t.length),l=0;l0},t.prototype.tagName=function(n){return n.tagName},t.prototype.attributeMap=function(n){for(var t=new Map,e=n.attributes,l=0;l0;s||(s=n[o]=[]);var u=Xn(t)?Zone.root:Zone.current;if(0===s.length)s.push({zone:u,handler:i});else{for(var c=!1,d=0;d-1},t}(Pn),rt=["alt","control","meta","shift"],it={alt:function(n){return n.altKey},control:function(n){return n.ctrlKey},meta:function(n){return n.metaKey},shift:function(n){return n.shiftKey}},ot=function(n){function t(t){return n.call(this,t)||this}return Object(i.__extends)(t,n),t.prototype.supports=function(n){return null!=t.parseEventName(n)},t.prototype.addEventListener=function(n,e,l){var r=t.parseEventName(e),i=t.eventCallback(r.fullKey,l,this.manager.getZone());return this.manager.getZone().runOutsideAngular(function(){return un().onAndCancel(n,r.domEventName,i)})},t.parseEventName=function(n){var e=n.toLowerCase().split("."),l=e.shift();if(0===e.length||"keydown"!==l&&"keyup"!==l)return null;var r=t._normalizeKey(e.pop()),i="";if(rt.forEach(function(n){var t=e.indexOf(n);t>-1&&(e.splice(t,1),i+=n+".")}),i+=r,0!=e.length||0===r.length)return null;var o={};return o.domEventName=l,o.fullKey=i,o},t.getEventFullKey=function(n){var t="",e=un().getEventKey(n);return" "===(e=e.toLowerCase())?e="space":"."===e&&(e="dot"),rt.forEach(function(l){l!=e&&(0,it[l])(n)&&(t+=l+".")}),t+=e},t.eventCallback=function(n,e,l){return function(r){t.getEventFullKey(r)===n&&l.runGuarded(function(){return e(r)})}},t._normalizeKey=function(n){switch(n){case"esc":return"escape";default:return n}},t}(Pn),st=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,at=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\/]+=*$/i;function ut(n){return(n=String(n)).match(st)||n.match(at)?n:(Object(l.Y)()&&un().log("WARNING: sanitizing unsafe URL value "+n+" (see http://g.co/ng/security#xss)"),"unsafe:"+n)}var ct=null,dt=null;function ht(n){for(var t={},e=0,l=n.split(",");e")):this.sanitizedSomething=!0},n.prototype.endElement=function(n){var t=dt.nodeName(n).toLowerCase();yt.hasOwnProperty(t)&&!ft.hasOwnProperty(t)&&(this.buf.push(""))},n.prototype.chars=function(n){this.buf.push(St(n))},n}();function Mt(n,t){if(t&&dt.contains(n,t))throw new Error("Failed to sanitize html because the element is clobbered: "+dt.getOuterHTML(n));return t}var kt=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Ct=/([^\#-~ |!])/g;function St(n){return n.replace(/&/g,"&").replace(kt,function(n){return"&#"+(1024*(n.charCodeAt(0)-55296)+(n.charCodeAt(1)-56320)+65536)+";"}).replace(Ct,function(n){return"&#"+n.charCodeAt(0)+";"}).replace(//g,">")}function Ot(n){dt.attributeMap(n).forEach(function(t,e){"xmlns:ns1"!==e&&0!==e.indexOf("ns1:")||dt.removeAttribute(n,e)});for(var t=0,e=dt.childNodesAsList(n);t0){var l=n.slice(0,t),r=n.slice(t+1).trim();e.set(l,r)}}),e},n.prototype.append=function(n,t){var e=this.getAll(n);null===e?this.set(n,t):e.push(t)},n.prototype.delete=function(n){var t=n.toLowerCase();this._normalizedNames.delete(t),this._headers.delete(t)},n.prototype.forEach=function(n){var t=this;this._headers.forEach(function(e,l){return n(e,t._normalizedNames.get(l),t._headers)})},n.prototype.get=function(n){var t=this.getAll(n);return null===t?null:t.length>0?t[0]:null},n.prototype.has=function(n){return this._headers.has(n.toLowerCase())},n.prototype.keys=function(){return Array.from(this._normalizedNames.values())},n.prototype.set=function(n,t){Array.isArray(t)?t.length&&this._headers.set(n.toLowerCase(),[t.join(",")]):this._headers.set(n.toLowerCase(),[t]),this.mayBeSetNormalizedName(n)},n.prototype.values=function(){return Array.from(this._headers.values())},n.prototype.toJSON=function(){var n=this,t={};return this._headers.forEach(function(e,l){var r=[];e.forEach(function(n){return r.push.apply(r,n.split(","))}),t[n._normalizedNames.get(l)]=r}),t},n.prototype.getAll=function(n){return this.has(n)&&this._headers.get(n.toLowerCase())||null},n.prototype.entries=function(){throw new Error('"entries" method is not implemented on Headers class')},n.prototype.mayBeSetNormalizedName=function(n){var t=n.toLowerCase();this._normalizedNames.has(t)||this._normalizedNames.set(t,n)},n}(),Jt=function(){function n(n){void 0===n&&(n={});var t=n.body,e=n.status,l=n.headers,r=n.statusText,i=n.type,o=n.url;this.body=null!=t?t:null,this.status=null!=e?e:null,this.headers=null!=l?l:null,this.statusText=null!=r?r:null,this.type=null!=i?i:null,this.url=null!=o?o:null}return n.prototype.merge=function(t){return new n({body:t&&null!=t.body?t.body:this.body,status:t&&null!=t.status?t.status:this.status,headers:t&&null!=t.headers?t.headers:this.headers,statusText:t&&null!=t.statusText?t.statusText:this.statusText,type:t&&null!=t.type?t.type:this.type,url:t&&null!=t.url?t.url:this.url})},n}(),Qt=function(n){function t(){return n.call(this,{status:200,statusText:"Ok",type:zt.Default,headers:new qt})||this}return Object(i.__extends)(t,n),t}(Jt),Kt=function(){};function Xt(n){if("string"!=typeof n)return n;switch(n.toUpperCase()){case"GET":return Wt.Get;case"POST":return Wt.Post;case"PUT":return Wt.Put;case"DELETE":return Wt.Delete;case"OPTIONS":return Wt.Options;case"HEAD":return Wt.Head;case"PATCH":return Wt.Patch}throw new Error('Invalid request method. The method "'+n+'" is not supported.')}var Zt=function(n){return n>=200&&n<300},$t=function(){function n(){}return n.prototype.encodeKey=function(n){return ne(n)},n.prototype.encodeValue=function(n){return ne(n)},n}();function ne(n){return encodeURIComponent(n).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var te=function(){function n(n,t){void 0===n&&(n=""),void 0===t&&(t=new $t),this.rawParams=n,this.queryEncoder=t,this.paramsMap=function(n){void 0===n&&(n="");var t=new Map;return n.length>0&&n.split("&").forEach(function(n){var e=n.indexOf("="),l=-1==e?[n,""]:[n.slice(0,e),n.slice(e+1)],r=l[0],i=l[1],o=t.get(r)||[];o.push(i),t.set(r,o)}),t}(n)}return n.prototype.clone=function(){var t=new n("",this.queryEncoder);return t.appendAll(this),t},n.prototype.has=function(n){return this.paramsMap.has(n)},n.prototype.get=function(n){var t=this.paramsMap.get(n);return Array.isArray(t)?t[0]:null},n.prototype.getAll=function(n){return this.paramsMap.get(n)||[]},n.prototype.set=function(n,t){if(void 0!==t&&null!==t){var e=this.paramsMap.get(n)||[];e.length=0,e.push(t),this.paramsMap.set(n,e)}else this.delete(n)},n.prototype.setAll=function(n){var t=this;n.paramsMap.forEach(function(n,e){var l=t.paramsMap.get(e)||[];l.length=0,l.push(n[0]),t.paramsMap.set(e,l)})},n.prototype.append=function(n,t){if(void 0!==t&&null!==t){var e=this.paramsMap.get(n)||[];e.push(t),this.paramsMap.set(n,e)}},n.prototype.appendAll=function(n){var t=this;n.paramsMap.forEach(function(n,e){for(var l=t.paramsMap.get(e)||[],r=0;r=200&&e.status<=299,e.statusText=t.statusText,e.headers=t.headers,e.type=t.type,e.url=t.url,e}return Object(i.__extends)(t,n),t.prototype.toString=function(){return"Response with status: "+this.status+" "+this.statusText+" for URL: "+this.url},t}(ee),re=/^\)\]\}',?\n/,ie=function(){function n(n,t,e){var l=this;this.request=n,this.response=new o.a(function(r){var i=t.build();i.open(Wt[n.method].toUpperCase(),n.url),null!=n.withCredentials&&(i.withCredentials=n.withCredentials);var o=function(){var t=1223===i.status?204:i.status,l=null;204!==t&&"string"==typeof(l="undefined"==typeof i.response?i.responseText:i.response)&&(l=l.replace(re,"")),0===t&&(t=l?200:0);var o,s=qt.fromResponseHeaderString(i.getAllResponseHeaders()),a=("responseURL"in(o=i)?o.responseURL:/^X-Request-URL:/m.test(o.getAllResponseHeaders())?o.getResponseHeader("X-Request-URL"):null)||n.url,u=new Jt({body:l,status:t,headers:s,statusText:i.statusText||"OK",url:a});null!=e&&(u=e.merge(u));var c=new le(u);if(c.ok=Zt(t),c.ok)return r.next(c),void r.complete();r.error(c)},s=function(n){var t=new Jt({body:n,type:zt.Error,status:i.status,statusText:i.statusText});null!=e&&(t=e.merge(t)),r.error(new le(t))};if(l.setDetectedContentType(n,i),null==n.headers&&(n.headers=new qt),n.headers.has("Accept")||n.headers.append("Accept","application/json, text/plain, */*"),n.headers.forEach(function(n,t){return i.setRequestHeader(t,n.join(","))}),null!=n.responseType&&null!=i.responseType)switch(n.responseType){case Gt.ArrayBuffer:i.responseType="arraybuffer";break;case Gt.Json:i.responseType="json";break;case Gt.Text:i.responseType="text";break;case Gt.Blob:i.responseType="blob";break;default:throw new Error("The selected responseType is not supported")}return i.addEventListener("load",o),i.addEventListener("error",s),i.send(l.request.getBody()),function(){i.removeEventListener("load",o),i.removeEventListener("error",s),i.abort()}})}return n.prototype.setDetectedContentType=function(n,t){if(null==n.headers||null==n.headers.get("Content-Type"))switch(n.contentType){case Ut.NONE:break;case Ut.JSON:t.setRequestHeader("content-type","application/json");break;case Ut.FORM:t.setRequestHeader("content-type","application/x-www-form-urlencoded;charset=UTF-8");break;case Ut.TEXT:t.setRequestHeader("content-type","text/plain");break;case Ut.BLOB:var e=n.blob();e.type&&t.setRequestHeader("content-type",e.type)}},n}(),oe=function(){function n(n,t){void 0===n&&(n="XSRF-TOKEN"),void 0===t&&(t="X-XSRF-TOKEN"),this._cookieName=n,this._headerName=t}return n.prototype.configureRequest=function(n){var t=un().getCookie(this._cookieName);t&&n.headers.set(this._headerName,t)},n}(),se=function(){function n(n,t,e){this._browserXHR=n,this._baseResponseOptions=t,this._xsrfStrategy=e}return n.prototype.createConnection=function(n){return this._xsrfStrategy.configureRequest(n),new ie(n,this._browserXHR,this._baseResponseOptions)},n}(),ae=function(){function n(n){void 0===n&&(n={});var t=n.method,e=n.headers,l=n.body,r=n.url,i=n.search,o=n.params,s=n.withCredentials,a=n.responseType;this.method=null!=t?Xt(t):null,this.headers=null!=e?e:null,this.body=null!=l?l:null,this.url=null!=r?r:null,this.params=this._mergeSearchParams(o||i),this.withCredentials=null!=s?s:null,this.responseType=null!=a?a:null}return Object.defineProperty(n.prototype,"search",{get:function(){return this.params},set:function(n){this.params=n},enumerable:!0,configurable:!0}),n.prototype.merge=function(t){return new n({method:t&&null!=t.method?t.method:this.method,headers:t&&null!=t.headers?t.headers:new qt(this.headers),body:t&&null!=t.body?t.body:this.body,url:t&&null!=t.url?t.url:this.url,params:t&&this._mergeSearchParams(t.params||t.search),withCredentials:t&&null!=t.withCredentials?t.withCredentials:this.withCredentials,responseType:t&&null!=t.responseType?t.responseType:this.responseType})},n.prototype._mergeSearchParams=function(n){return n?n instanceof te?n.clone():"string"==typeof n?new te(n):this._parseParams(n):this.params},n.prototype._parseParams=function(n){var t=this;void 0===n&&(n={});var e=new te;return Object.keys(n).forEach(function(l){var r=n[l];Array.isArray(r)?r.forEach(function(n){return t._appendParam(l,n,e)}):t._appendParam(l,r,e)}),e},n.prototype._appendParam=function(n,t,e){"string"!=typeof t&&(t=JSON.stringify(t)),e.append(n,t)},n}(),ue=function(n){function t(){return n.call(this,{method:Wt.Get,headers:new qt})||this}return Object(i.__extends)(t,n),t}(ae),ce=function(n){function t(t){var e=n.call(this)||this,l=t.url;e.url=t.url;var r,i=t.params||t.search;if(i&&(r="object"!=typeof i||i instanceof te?i.toString():function(n){var t=new te;return Object.keys(n).forEach(function(e){var l=n[e];l&&Array.isArray(l)?l.forEach(function(n){return t.append(e,n.toString())}):t.append(e,l.toString())}),t}(i).toString()).length>0){var o="?";-1!=e.url.indexOf("?")&&(o="&"==e.url[e.url.length-1]?"":"&"),e.url=l+o+r}return e._body=t.body,e.method=Xt(t.method),e.headers=new qt(t.headers),e.contentType=e.detectContentType(),e.withCredentials=t.withCredentials,e.responseType=t.responseType,e}return Object(i.__extends)(t,n),t.prototype.detectContentType=function(){switch(this.headers.get("content-type")){case"application/json":return Ut.JSON;case"application/x-www-form-urlencoded":return Ut.FORM;case"multipart/form-data":return Ut.FORM_DATA;case"text/plain":case"text/html":return Ut.TEXT;case"application/octet-stream":return this._body instanceof _e?Ut.ARRAY_BUFFER:Ut.BLOB;default:return this.detectContentTypeFromBody()}},t.prototype.detectContentTypeFromBody=function(){return null==this._body?Ut.NONE:this._body instanceof te?Ut.FORM:this._body instanceof pe?Ut.FORM_DATA:this._body instanceof fe?Ut.BLOB:this._body instanceof _e?Ut.ARRAY_BUFFER:this._body&&"object"==typeof this._body?Ut.JSON:Ut.TEXT},t.prototype.getBody=function(){switch(this.contentType){case Ut.JSON:case Ut.FORM:return this.text();case Ut.FORM_DATA:return this._body;case Ut.TEXT:return this.text();case Ut.BLOB:return this.blob();case Ut.ARRAY_BUFFER:return this.arrayBuffer();default:return null}},t}(ee),de=function(){},he="object"==typeof window?window:de,pe=he.FormData||de,fe=he.Blob||de,_e=he.ArrayBuffer||de;function me(n,t){return n.createConnection(t).response}function ge(n,t,e,l){return n.merge(new ae(t?{method:t.method||e,url:t.url||l,search:t.search,params:t.params,headers:t.headers,body:t.body,withCredentials:t.withCredentials,responseType:t.responseType}:{method:e,url:l}))}var ye=function(){function n(n,t){this._backend=n,this._defaultOptions=t}return n.prototype.request=function(n,t){var e;if("string"==typeof n)e=me(this._backend,new ce(ge(this._defaultOptions,t,Wt.Get,n)));else{if(!(n instanceof ce))throw new Error("First argument must be a url string or Request instance.");e=me(this._backend,n)}return e},n.prototype.get=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Get,n)))},n.prototype.post=function(n,t,e){return this.request(new ce(ge(this._defaultOptions.merge(new ae({body:t})),e,Wt.Post,n)))},n.prototype.put=function(n,t,e){return this.request(new ce(ge(this._defaultOptions.merge(new ae({body:t})),e,Wt.Put,n)))},n.prototype.delete=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Delete,n)))},n.prototype.patch=function(n,t,e){return this.request(new ce(ge(this._defaultOptions.merge(new ae({body:t})),e,Wt.Patch,n)))},n.prototype.head=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Head,n)))},n.prototype.options=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Options,n)))},n}();function be(){return new oe}function ve(n,t){return new ye(n,t)}var we=function(){},xe=function(n){function t(t,e){n.call(this),this.error=t,this.scheduler=e}return Object(i.__extends)(t,n),t.create=function(n,e){return new t(n,e)},t.dispatch=function(n){n.subscriber.error(n.error)},t.prototype._subscribe=function(n){var e=this.error,l=this.scheduler;if(n.syncErrorThrowable=!0,l)return l.schedule(t.dispatch,0,{error:e,subscriber:n});n.error(e)},t}(o.a).create;o.a.throw=xe;var Me=e("tZ2B"),ke=e("PIsA");function Ce(n){return function(t){var e=new Se(n),l=t.lift(e);return e.caught=l}}var Se=function(){function n(n){this.selector=n}return n.prototype.call=function(n,t){return t.subscribe(new Oe(n,this.selector,this.caught))},n}(),Oe=function(n){function t(t,e,l){n.call(this,t),this.selector=e,this.caught=l}return Object(i.__extends)(t,n),t.prototype.error=function(t){if(!this.isStopped){var e=void 0;try{e=this.selector(t,this.caught)}catch(t){return void n.prototype.error.call(this,t)}this._unsubscribeAndRecycle(),this.add(Object(ke.a)(this,e))}},t}(Me.a);function Te(n){return Ce(n)(this)}o.a.prototype.catch=Te,o.a.prototype._catch=Te;var Le=e("HdCx");function Pe(n,t){return Object(Le.a)(n,t)(this)}o.a.prototype.map=Pe;var De=e("YKDW"),Ae=e("uotZ"),Ee=e.n(Ae),Ye=function(){function n(n,t){this.http=n,this.translate=t,this.url=r.nodeUrl}return n.prototype.getTransactions=function(n){var t=n.map(function(n){return n.address}).join(",");return this.post("transactions",{addrs:t,verbose:!0}).map(function(n){return n.map(function(n){return{addresses:[],balance:new Ae.BigNumber(0),block:n.status.block_seq,confirmed:n.status.confirmed,timestamp:n.txn.timestamp,txid:n.txn.txid,inputs:n.txn.inputs,outputs:n.txn.outputs}})})},n.prototype.getVersion=function(){return this.get("version")},n.prototype.generateSeed=function(n){return void 0===n&&(n=128),this.get("wallet/newSeed",{entropy:n}).map(function(n){return n.seed})},n.prototype.getHealth=function(){return this.get("health")},n.prototype.getWallets=function(){return this.get("wallets").map(function(n){var t=[];return n.forEach(function(n){var e={label:n.meta.label,filename:n.meta.filename,coins:null,hours:null,addresses:[],encrypted:n.meta.encrypted};n.entries&&(e.addresses=n.entries.map(function(n){return{address:n.address,coins:null,hours:null,confirmed:!0}})),t.push(e)}),t})},n.prototype.getWalletSeed=function(n,t){return this.post("wallet/seed",{id:n.filename,password:t}).map(function(n){return n.seed})},n.prototype.postWalletCreate=function(n,t,e,l,r){var i={label:n,seed:t,scan:e,type:r};return l&&(i.password=l,i.encrypt=!0),this.post("wallet/create",i).map(function(n){return{label:n.meta.label,filename:n.meta.filename,coins:null,hours:null,addresses:n.entries.map(function(n){return{address:n.address,coins:null,hours:null,confirmed:!0}}),encrypted:n.meta.encrypted}})},n.prototype.postWalletNewAddress=function(n,t,e){var l=new Object;return l.id=n.filename,l.num=t,e&&(l.password=e),this.post("wallet/newAddress",l).map(function(n){var t=[];return n.addresses.forEach(function(n){t.push({address:n,coins:null,hours:null})}),t})},n.prototype.postWalletToggleEncryption=function(n,t){return this.post("wallet/"+(n.encrypted?"decrypt":"encrypt"),{id:n.filename,password:t})},n.prototype.get=function(n,t,e,l){var r=this;return void 0===t&&(t=null),void 0===e&&(e={}),void 0===l&&(l=!1),this.http.get(this.getUrl(n,t,l),this.returnRequestOptions(e)).map(function(n){return n.json()}).catch(function(n){return r.processConnectionError(n)})},n.prototype.getCsrf=function(){return this.get("csrf").map(function(n){return n.csrf_token})},n.prototype.post=function(n,t,e,l){var r=this;return void 0===t&&(t={}),void 0===e&&(e={}),void 0===l&&(l=!1),this.getCsrf().first().flatMap(function(i){return e.csrf=i,l&&(e.json=!0),r.http.post(r.getUrl(n,null,l),e.json||l?JSON.stringify(t):r.getQueryString(t),r.returnRequestOptions(e)).map(function(n){return n.json()}).catch(function(n){return r.processConnectionError(n)})})},n.prototype.returnRequestOptions=function(n){var t=new ae;return t.headers=this.getHeaders(n),n.csrf&&t.headers.append("X-CSRF-Token",n.csrf),t},n.prototype.getHeaders=function(n){var t=new qt;return t.append("Content-Type",n.json?"application/json":"application/x-www-form-urlencoded"),t},n.prototype.getQueryString=function(n){return void 0===n&&(n=null),n?Object.keys(n).reduce(function(t,e){return t.push(e+"="+encodeURIComponent(n[e])),t},[]).join("&"):""},n.prototype.getUrl=function(n,t,e){return void 0===t&&(t=null),void 0===e&&(e=!1),n.startsWith("/")&&(n=n.substr(1,n.length-1)),this.url+(e?"v2/":"v1/")+n+"?"+this.getQueryString(t)},n.prototype.processConnectionError=function(n,t){if(void 0===t&&(t=!1),n){if("string"==typeof n._body)return o.a.throw(n);if(n.error&&"string"==typeof n.error)return n._body=n.error,o.a.throw(n);if(n.message)return n._body=n.message,o.a.throw(n)}var e=Error(this.translate.instant(t?"hardware-wallet.errors.daemon-connection":"service.api.server-error"));return e._body=e.message,o.a.throw(e)},n}(),je=e("+3/4"),Ie=e("BX3T"),Re=function(n){function t(t,e){n.call(this),this.sources=t,this.resultSelector=e}return Object(i.__extends)(t,n),t.create=function(){for(var n=[],e=0;e=0}o.a.prototype.mergeMap=tl,o.a.prototype.flatMap=tl;var ll=e("AMGY"),rl=e("VwZZ"),il=function(n){function t(t,e){n.call(this,t,e),this.scheduler=t,this.work=e,this.pending=!1}return Object(i.__extends)(t,n),t.prototype.schedule=function(n,t){if(void 0===t&&(t=0),this.closed)return this;this.state=n,this.pending=!0;var e=this.id,l=this.scheduler;return null!=e&&(this.id=this.recycleAsyncId(l,e,t)),this.delay=t,this.id=this.id||this.requestAsyncId(l,this.id,t),this},t.prototype.requestAsyncId=function(n,t,e){return void 0===e&&(e=0),ll.a.setInterval(n.flush.bind(n,this),e)},t.prototype.recycleAsyncId=function(n,t,e){if(void 0===e&&(e=0),null!==e&&this.delay===e&&!1===this.pending)return t;ll.a.clearInterval(t)},t.prototype.execute=function(n,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var e=this._execute(n,t);if(e)return e;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(n,t){var e=!1,l=void 0;try{this.work(n)}catch(n){e=!0,l=!!n&&n||new Error(n)}if(e)return this.unsubscribe(),l},t.prototype._unsubscribe=function(){var n=this.id,t=this.scheduler,e=t.actions,l=e.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==l&&e.splice(l,1),null!=n&&(this.id=this.recycleAsyncId(t,n,null)),this.delay=null},t}(function(n){function t(t,e){n.call(this)}return Object(i.__extends)(t,n),t.prototype.schedule=function(n,t){return void 0===t&&(t=0),this},t}(rl.a)),ol=function(n){function t(){n.apply(this,arguments),this.actions=[],this.active=!1,this.scheduled=void 0}return Object(i.__extends)(t,n),t.prototype.flush=function(n){var t=this.actions;if(this.active)t.push(n);else{var e;this.active=!0;do{if(e=n.execute(n.state,n.delay))break}while(n=t.shift());if(this.active=!1,e){for(;n=t.shift();)n.unsubscribe();throw e}}},t}(function(){function n(t,e){void 0===e&&(e=n.now),this.SchedulerAction=t,this.now=e}return n.prototype.schedule=function(n,t,e){return void 0===t&&(t=0),new this.SchedulerAction(this,n).schedule(e,t)},n.now=Date.now?Date.now:function(){return+new Date},n}()),sl=new ol(il),al=e("1Q68");function ul(n){return n instanceof Date&&!isNaN(+n)}var cl=function(n){function t(t,e,l){void 0===t&&(t=0),n.call(this),this.period=-1,this.dueTime=0,el(e)?this.period=Number(e)<1?1:Number(e):Object(al.a)(e)&&(l=e),Object(al.a)(l)||(l=sl),this.scheduler=l,this.dueTime=ul(t)?+t-this.scheduler.now():t}return Object(i.__extends)(t,n),t.create=function(n,e,l){return void 0===n&&(n=0),new t(n,e,l)},t.dispatch=function(n){var t=n.index,e=n.period,l=n.subscriber;if(l.next(t),!l.closed){if(-1===e)return l.complete();n.index=t+1,this.schedule(n,e)}},t.prototype._subscribe=function(n){return this.scheduler.schedule(t.dispatch,this.dueTime,{index:0,period:this.period,subscriber:n})},t}(o.a).create;o.a.timer=cl;var dl=e("Veqx"),hl=e("etqZ"),pl=function(){function n(n){this.project=n}return n.prototype.call=function(n,t){return t.subscribe(new fl(n,this.project))},n}(),fl=function(n){function t(t,e,l){void 0===l&&(l=Object.create(null)),n.call(this,t),this.iterators=[],this.active=0,this.project="function"==typeof e?e:null,this.values=l}return Object(i.__extends)(t,n),t.prototype._next=function(n){var t=this.iterators;Object(Ie.a)(n)?t.push(new ml(n)):t.push("function"==typeof n[hl.a]?new _l(n[hl.a]()):new gl(this.destination,this,n))},t.prototype._complete=function(){var n=this.iterators,t=n.length;if(0!==t){this.active=t;for(var e=0;ethis.index},n.prototype.hasCompleted=function(){return this.array.length===this.index},n}(),gl=function(n){function t(t,e,l){n.call(this,t),this.parent=e,this.observable=l,this.stillUnsubscribed=!0,this.buffer=[],this.isComplete=!1}return Object(i.__extends)(t,n),t.prototype[hl.a]=function(){return this},t.prototype.next=function(){var n=this.buffer;return 0===n.length&&this.isComplete?{value:null,done:!0}:{value:n.shift(),done:!1}},t.prototype.hasValue=function(){return this.buffer.length>0},t.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete},t.prototype.notifyComplete=function(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()},t.prototype.notifyNext=function(n,t,e,l,r){this.buffer.push(t),this.parent.checkIterators()},t.prototype.subscribe=function(n,t){return Object(ke.a)(this,this.observable,this,t)},t}(Me.a);o.a.zip=function(){for(var n=[],t=0;t0?n.prototype.schedule.call(this,t,e):(this.delay=e,this.state=t,this.scheduler.flush(this),this)},t.prototype.execute=function(t,e){return e>0||this.closed?n.prototype.execute.call(this,t,e):this._execute(t,e)},t.prototype.requestAsyncId=function(t,e,l){return void 0===l&&(l=0),null!==l&&l>0||null===l&&this.delay>0?n.prototype.requestAsyncId.call(this,t,e,l):t.flush(this)},t}(il),vl=new(function(n){function t(){n.apply(this,arguments)}return Object(i.__extends)(t,n),t}(ol))(bl),wl=function(){function n(n,t,e){this.kind=n,this.value=t,this.error=e,this.hasValue="N"===n}return n.prototype.observe=function(n){switch(this.kind){case"N":return n.next&&n.next(this.value);case"E":return n.error&&n.error(this.error);case"C":return n.complete&&n.complete()}},n.prototype.do=function(n,t,e){switch(this.kind){case"N":return n&&n(this.value);case"E":return t&&t(this.error);case"C":return e&&e()}},n.prototype.accept=function(n,t,e){return n&&"function"==typeof n.next?this.observe(n):this.do(n,t,e)},n.prototype.toObservable=function(){switch(this.kind){case"N":return o.a.of(this.value);case"E":return o.a.throw(this.error);case"C":return o.a.empty()}throw new Error("unexpected notification kind value")},n.createNext=function(t){return"undefined"!=typeof t?new n("N",t):n.undefinedValueNotification},n.createError=function(t){return new n("E",void 0,t)},n.createComplete=function(){return n.completeNotification},n.completeNotification=new n("C"),n.undefinedValueNotification=new n("N",void 0),n}(),xl=function(n){function t(t,e,l){void 0===l&&(l=0),n.call(this,t),this.scheduler=e,this.delay=l}return Object(i.__extends)(t,n),t.dispatch=function(n){n.notification.observe(n.destination),this.unsubscribe()},t.prototype.scheduleMessage=function(n){this.add(this.scheduler.schedule(t.dispatch,this.delay,new Ml(n,this.destination)))},t.prototype._next=function(n){this.scheduleMessage(wl.createNext(n))},t.prototype._error=function(n){this.scheduleMessage(wl.createError(n))},t.prototype._complete=function(){this.scheduleMessage(wl.createComplete())},t}(Be.a),Ml=function(n,t){this.notification=n,this.destination=t},kl=e("x6VL"),Cl=e("1Bqh"),Sl=function(n){function t(t,e,l){void 0===t&&(t=Number.POSITIVE_INFINITY),void 0===e&&(e=Number.POSITIVE_INFINITY),n.call(this),this.scheduler=l,this._events=[],this._bufferSize=t<1?1:t,this._windowTime=e<1?1:e}return Object(i.__extends)(t,n),t.prototype.next=function(t){var e=this._getNow();this._events.push(new Ol(e,t)),this._trimBufferThenGetEvents(),n.prototype.next.call(this,t)},t.prototype._subscribe=function(n){var t,e=this._trimBufferThenGetEvents(),l=this.scheduler;if(this.closed)throw new kl.a;this.hasError?t=rl.a.EMPTY:this.isStopped?t=rl.a.EMPTY:(this.observers.push(n),t=new Cl.a(this,n)),l&&n.add(n=new xl(n,l));for(var r=e.length,i=0;it&&(i=Math.max(i,r-t)),i>0&&l.splice(0,i),l},t}(yl.a),Ol=function(n,t){this.time=n,this.value=t},Tl=function(n){function t(t){n.call(this),this._value=t}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),t.prototype._subscribe=function(t){var e=n.prototype._subscribe.call(this,t);return e&&!e.closed&&t.next(this._value),e},t.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new kl.a;return this._value},t.prototype.next=function(t){n.prototype.next.call(this,this._value=t)},t}(yl.a),Ll={otcEnabled:!1,maxHardwareWalletAddresses:1,useHwWalletDaemon:!0,urlForHwWalletVersionChecking:"https://version.skycoin.com/skywallet/version.txt",hwWalletDownloadUrlAndPrefix:"https://downloads.skycoin.com/skywallet/skywallet-firmware-v",urlForVersionChecking:"https://version.skycoin.com/skycoin/version.txt",walletDownloadUrl:"https://www.skycoin.com/downloads/",uriSpecificatioPrefix:"skycoin",languages:[{code:"en",name:"English",iconName:"en.png"},{code:"zh",name:"\u4e2d\u6587",iconName:"zh.png"},{code:"es",name:"Espa\xf1ol",iconName:"es.png"}],defaultLanguage:"en"},Pl=new l.r("cdk-dir-doc"),Dl=function(){return function(n){this.value="ltr",this.change=new l.o,n&&(this.value=(n.body?n.body.dir:null)||(n.documentElement?n.documentElement.dir:null)||"ltr")}}(),Al=function(){};function El(n){return null!=n&&""+n!="false"}function Yl(n,t){return void 0===t&&(t=0),isNaN(parseFloat(n))||isNaN(Number(n))?t:Number(n)}var jl,Il,Rl="undefined"!=typeof Intl&&Intl.v8BreakIterator,Hl=function(){return function(){this.isBrowser="object"==typeof document&&!!document,this.EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent),this.TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent),this.BLINK=this.isBrowser&&!(!window.chrome&&!Rl)&&!!CSS&&!this.EDGE&&!this.TRIDENT,this.WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT,this.IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,this.FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent),this.ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT,this.SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT}}();function Nl(){if(null==jl&&"undefined"!=typeof window)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){return jl=!0}}))}finally{jl=jl||!1}return jl}var Fl=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function Bl(){if(Il)return Il;if("object"!=typeof document||!document)return Il=new Set(Fl);var n=document.createElement("input");return Il=new Set(Fl.filter(function(t){return n.setAttribute("type",t),n.type===t}))}var Vl=function(){},Wl=new l.r("mat-sanity-checks"),zl=function(){function n(n){this._sanityChecksEnabled=n,this._hasDoneGlobalChecks=!1,this._hasCheckedHammer=!1,this._document="object"==typeof document&&document?document:null,this._window="object"==typeof window&&window?window:null,this._areChecksEnabled()&&!this._hasDoneGlobalChecks&&(this._checkDoctypeIsDefined(),this._checkThemeIsPresent(),this._hasDoneGlobalChecks=!0)}return n.prototype._areChecksEnabled=function(){return this._sanityChecksEnabled&&Object(l.Y)()&&!this._isTestEnv()},n.prototype._isTestEnv=function(){return this._window&&(this._window.__karma__||this._window.jasmine)},n.prototype._checkDoctypeIsDefined=function(){this._document&&!this._document.doctype&&console.warn("Current document does not have a doctype. This may cause some Angular Material components not to behave as expected.")},n.prototype._checkThemeIsPresent=function(){if(this._document&&"function"==typeof getComputedStyle){var n=this._document.createElement("div");n.classList.add("mat-theme-loaded-marker"),this._document.body.appendChild(n);var t=getComputedStyle(n);t&&"none"!==t.display&&console.warn("Could not find Angular Material core theme. Most Material components may not work as expected. For more info refer to the theming guide: https://material.angular.io/guide/theming"),this._document.body.removeChild(n)}},n.prototype._checkHammerIsAvailable=function(){!this._hasCheckedHammer&&this._window&&(this._areChecksEnabled()&&!this._window.Hammer&&console.warn("Could not find HammerJS. Certain Angular Material components may not work correctly."),this._hasCheckedHammer=!0)},n}();function Ul(n){return function(n){function t(){for(var t=[],e=0;e=0},n.prototype.isFocusable=function(n){return function(n){return!function(n){return function(n){return"input"==n.nodeName.toLowerCase()}(n)&&"hidden"==n.type}(n)&&(function(n){var t=n.nodeName.toLowerCase();return"input"===t||"select"===t||"button"===t||"textarea"===t}(n)||function(n){return function(n){return"a"==n.nodeName.toLowerCase()}(n)&&n.hasAttribute("href")}(n)||n.hasAttribute("contenteditable")||wr(n))}(n)&&!this.isDisabled(n)&&this.isVisible(n)},n}();function wr(n){if(!n.hasAttribute("tabindex")||void 0===n.tabIndex)return!1;var t=n.getAttribute("tabindex");return"-32768"!=t&&!(!t||isNaN(parseInt(t,10)))}function xr(n){if(!wr(n))return null;var t=parseInt(n.getAttribute("tabindex")||"",10);return isNaN(t)?-1:t}var Mr=function(){function n(n,t,e,l,r){void 0===r&&(r=!1),this._element=n,this._checker=t,this._ngZone=e,this._document=l,this._enabled=!0,r||this.attachAnchors()}return Object.defineProperty(n.prototype,"enabled",{get:function(){return this._enabled},set:function(n){this._enabled=n,this._startAnchor&&this._endAnchor&&(this._startAnchor.tabIndex=this._endAnchor.tabIndex=this._enabled?0:-1)},enumerable:!0,configurable:!0}),n.prototype.destroy=function(){this._startAnchor&&this._startAnchor.parentNode&&this._startAnchor.parentNode.removeChild(this._startAnchor),this._endAnchor&&this._endAnchor.parentNode&&this._endAnchor.parentNode.removeChild(this._endAnchor),this._startAnchor=this._endAnchor=null},n.prototype.attachAnchors=function(){var n=this;this._startAnchor||(this._startAnchor=this._createAnchor()),this._endAnchor||(this._endAnchor=this._createAnchor()),this._ngZone.runOutsideAngular(function(){n._startAnchor.addEventListener("focus",function(){n.focusLastTabbableElement()}),n._endAnchor.addEventListener("focus",function(){n.focusFirstTabbableElement()}),n._element.parentNode&&(n._element.parentNode.insertBefore(n._startAnchor,n._element),n._element.parentNode.insertBefore(n._endAnchor,n._element.nextSibling))})},n.prototype.focusInitialElementWhenReady=function(){var n=this;return new Promise(function(t){n._executeOnStable(function(){return t(n.focusInitialElement())})})},n.prototype.focusFirstTabbableElementWhenReady=function(){var n=this;return new Promise(function(t){n._executeOnStable(function(){return t(n.focusFirstTabbableElement())})})},n.prototype.focusLastTabbableElementWhenReady=function(){var n=this;return new Promise(function(t){n._executeOnStable(function(){return t(n.focusLastTabbableElement())})})},n.prototype._getRegionBoundary=function(n){for(var t=this._element.querySelectorAll("[cdk-focus-region-"+n+"], [cdkFocusRegion"+n+"], [cdk-focus-"+n+"]"),e=0;e=0;e--){var l=1===t[e].nodeType?this._getLastTabbableElement(t[e]):null;if(l)return l}return null},n.prototype._createAnchor=function(){var n=this._document.createElement("div");return n.tabIndex=this._enabled?0:-1,n.classList.add("cdk-visually-hidden"),n.classList.add("cdk-focus-trap-anchor"),n},n.prototype._executeOnStable=function(n){this._ngZone.isStable?n():this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1)).subscribe(n)},n}(),kr=function(){function n(n,t,e){this._checker=n,this._ngZone=t,this._document=e}return n.prototype.create=function(n,t){return void 0===t&&(t=!1),new Mr(n,this._checker,this._ngZone,this._document,t)},n}(),Cr=function(){function n(n){this._items=n,this._activeItemIndex=-1,this._wrap=!1,this._letterKeyStream=new yl.a,this._typeaheadSubscription=rl.a.EMPTY,this._pressedLetters=[],this.tabOut=new yl.a,this.change=new yl.a}return n.prototype.withWrap=function(){return this._wrap=!0,this},n.prototype.withTypeAhead=function(n){var t=this;if(void 0===n&&(n=200),this._items.length&&this._items.some(function(n){return"function"!=typeof n.getLabel}))throw Error("ListKeyManager items in typeahead mode must implement the `getLabel` method.");return this._typeaheadSubscription.unsubscribe(),this._typeaheadSubscription=this._letterKeyStream.pipe(Ve(function(n){return t._pressedLetters.push(n)}),mr(n),Ge(function(){return t._pressedLetters.length>0}),Object(Le.a)(function(){return t._pressedLetters.join("")})).subscribe(function(n){for(var e=t._items.toArray(),l=1;l=65&&t<=90||t>=48&&t<=91)&&this._letterKeyStream.next(String.fromCharCode(t)))}this._pressedLetters=[],n.preventDefault()},Object.defineProperty(n.prototype,"activeItemIndex",{get:function(){return this._activeItemIndex},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"activeItem",{get:function(){return this._activeItem},enumerable:!0,configurable:!0}),n.prototype.setFirstItemActive=function(){this._setActiveItemByIndex(0,1)},n.prototype.setLastItemActive=function(){this._setActiveItemByIndex(this._items.length-1,-1)},n.prototype.setNextItemActive=function(){this._activeItemIndex<0?this.setFirstItemActive():this._setActiveItemByDelta(1)},n.prototype.setPreviousItemActive=function(){this._activeItemIndex<0&&this._wrap?this.setLastItemActive():this._setActiveItemByDelta(-1)},n.prototype.updateActiveItemIndex=function(n){this._activeItemIndex=n},n.prototype._setActiveItemByDelta=function(n,t){void 0===t&&(t=this._items.toArray()),this._wrap?this._setActiveInWrapMode(n,t):this._setActiveInDefaultMode(n,t)},n.prototype._setActiveInWrapMode=function(n,t){this._activeItemIndex=(this._activeItemIndex+n+t.length)%t.length,t[this._activeItemIndex].disabled?this._setActiveInWrapMode(n,t):this.setActiveItem(this._activeItemIndex)},n.prototype._setActiveInDefaultMode=function(n,t){this._setActiveItemByIndex(this._activeItemIndex+n,n,t)},n.prototype._setActiveItemByIndex=function(n,t,e){if(void 0===e&&(e=this._items.toArray()),e[n]){for(;e[n].disabled;)if(!e[n+=t])return;this.setActiveItem(n)}},n}(),Sr=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),t.prototype.setActiveItem=function(t){this.activeItem&&this.activeItem.setInactiveStyles(),n.prototype.setActiveItem.call(this,t),this.activeItem&&this.activeItem.setActiveStyles()},t}(Cr);function Or(n,t){return(n.getAttribute(t)||"").match(/\S+/g)||[]}var Tr=0,Lr=new Map,Pr=null,Dr=function(){function n(n){this._document=n}return n.prototype.describe=function(n,t){t.trim()&&(Lr.has(t)||this._createMessageElement(t),this._isElementDescribedByMessage(n,t)||this._addMessageReference(n,t))},n.prototype.removeDescription=function(n,t){if(t.trim()){this._isElementDescribedByMessage(n,t)&&this._removeMessageReference(n,t);var e=Lr.get(t);e&&0===e.referenceCount&&this._deleteMessageElement(t),Pr&&0===Pr.childNodes.length&&this._deleteMessagesContainer()}},n.prototype.ngOnDestroy=function(){for(var n=this._document.querySelectorAll("[cdk-describedby-host]"),t=0;t0?t._scrolled.pipe(qr(n)).subscribe(e):t._scrolled.subscribe(e);return t._scrolledCount++,function(){l.unsubscribe(),t._scrolledCount--,t._globalSubscription&&!t._scrolledCount&&(t._globalSubscription.unsubscribe(),t._globalSubscription=null)}}):Object(Fe.a)()},n.prototype.ancestorScrolled=function(n,t){var e=this.getAncestorScrollContainers(n);return this.scrolled(t).pipe(Ge(function(n){return!n||e.indexOf(n)>-1}))},n.prototype.getAncestorScrollContainers=function(n){var t=this,e=[];return this.scrollContainers.forEach(function(l,r){t._scrollableContainsElement(r,n)&&e.push(r)}),e},n.prototype._scrollableContainsElement=function(n,t){var e=t.nativeElement,l=n.getElementRef().nativeElement;do{if(e==l)return!0}while(e=e.parentElement);return!1},n.prototype._addGlobalListener=function(){var n=this;this._globalSubscription=this._ngZone.runOutsideAngular(function(){return zr(window.document,"scroll").subscribe(function(){return n._scrolled.next()})})},n}();function Kr(n,t,e){return n||new Qr(t,e)}var Xr=function(){function n(n,t){var e=this;this._change=n.isBrowser?t.runOutsideAngular(function(){return Object(Jr.a)(zr(window,"resize"),zr(window,"orientationchange"))}):Object(Fe.a)(),this._invalidateCache=this.change().subscribe(function(){return e._updateViewportSize()})}return n.prototype.ngOnDestroy=function(){this._invalidateCache.unsubscribe()},n.prototype.getViewportSize=function(){return this._viewportSize||this._updateViewportSize(),{width:this._viewportSize.width,height:this._viewportSize.height}},n.prototype.getViewportRect=function(){var n=this.getViewportScrollPosition(),t=this.getViewportSize(),e=t.width,l=t.height;return{top:n.top,left:n.left,bottom:n.top+l,right:n.left+e,height:l,width:e}},n.prototype.getViewportScrollPosition=function(){var n=document.documentElement.getBoundingClientRect();return{top:-n.top||document.body.scrollTop||window.scrollY||document.documentElement.scrollTop||0,left:-n.left||document.body.scrollLeft||window.scrollX||document.documentElement.scrollLeft||0}},n.prototype.change=function(n){return void 0===n&&(n=20),n>0?this._change.pipe(qr(n)):this._change},n.prototype._updateViewportSize=function(){this._viewportSize={width:window.innerWidth,height:window.innerHeight}},n}();function Zr(n,t,e){return n||new Xr(t,e)}var $r=function(){};function ni(){throw Error("Host already has a portal attached")}var ti=function(){function n(){}return n.prototype.attach=function(n){return null==n&&function(){throw Error("Attempting to attach a portal to a null PortalOutlet")}(),n.hasAttached()&&ni(),this._attachedHost=n,n.attach(this)},n.prototype.detach=function(){var n=this._attachedHost;null==n?function(){throw Error("Attempting to detach a portal that is not attached to a host")}():(this._attachedHost=null,n.detach())},Object.defineProperty(n.prototype,"isAttached",{get:function(){return null!=this._attachedHost},enumerable:!0,configurable:!0}),n.prototype.setAttachedHost=function(n){this._attachedHost=n},n}(),ei=function(n){function t(t,e,l){var r=n.call(this)||this;return r.component=t,r.viewContainerRef=e,r.injector=l,r}return Object(i.__extends)(t,n),t}(ti),li=function(n){function t(t,e,l){var r=n.call(this)||this;return r.templateRef=t,r.viewContainerRef=e,l&&(r.context=l),r}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"origin",{get:function(){return this.templateRef.elementRef},enumerable:!0,configurable:!0}),t.prototype.attach=function(t,e){return void 0===e&&(e=this.context),this.context=e,n.prototype.attach.call(this,t)},t.prototype.detach=function(){return this.context=void 0,n.prototype.detach.call(this)},t}(ti),ri=function(){function n(){this._isDisposed=!1}return n.prototype.hasAttached=function(){return!!this._attachedPortal},n.prototype.attach=function(n){return n||function(){throw Error("Must provide a portal to attach")}(),this.hasAttached()&&ni(),this._isDisposed&&function(){throw Error("This PortalOutlet has already been disposed")}(),n instanceof ei?(this._attachedPortal=n,this.attachComponentPortal(n)):n instanceof li?(this._attachedPortal=n,this.attachTemplatePortal(n)):void function(){throw Error("Attempting to attach an unknown Portal type. BasePortalOutlet accepts either a ComponentPortal or a TemplatePortal.")}()},n.prototype.detach=function(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()},n.prototype.dispose=function(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0},n.prototype.setDisposeFn=function(n){this._disposeFn=n},n.prototype._invokeDisposeFn=function(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)},n}(),ii=function(n){function t(t,e,l,r){var i=n.call(this)||this;return i._hostDomElement=t,i._componentFactoryResolver=e,i._appRef=l,i._defaultInjector=r,i}return Object(i.__extends)(t,n),t.prototype.attachComponentPortal=function(n){var t,e=this,l=this._componentFactoryResolver.resolveComponentFactory(n.component);return n.viewContainerRef?(t=n.viewContainerRef.createComponent(l,n.viewContainerRef.length,n.injector||n.viewContainerRef.parentInjector),this.setDisposeFn(function(){return t.destroy()})):(t=l.create(n.injector||this._defaultInjector),this._appRef.attachView(t.hostView),this.setDisposeFn(function(){e._appRef.detachView(t.hostView),t.destroy()})),this._hostDomElement.appendChild(this._getComponentRootNode(t)),t},t.prototype.attachTemplatePortal=function(n){var t=this,e=n.viewContainerRef,l=e.createEmbeddedView(n.templateRef,n.context);return l.detectChanges(),l.rootNodes.forEach(function(n){return t._hostDomElement.appendChild(n)}),this.setDisposeFn(function(){var n=e.indexOf(l);-1!==n&&e.remove(n)}),l},t.prototype.dispose=function(){n.prototype.dispose.call(this),null!=this._hostDomElement.parentNode&&this._hostDomElement.parentNode.removeChild(this._hostDomElement)},t.prototype._getComponentRootNode=function(n){return n.hostView.rootNodes[0]},t}(ri),oi=function(n){function t(t,e){var l=n.call(this)||this;return l._componentFactoryResolver=t,l._viewContainerRef=e,l._isInitialized=!1,l}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"_deprecatedPortal",{get:function(){return this.portal},set:function(n){this.portal=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedPortalHost",{get:function(){return this.portal},set:function(n){this.portal=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"portal",{get:function(){return this._attachedPortal},set:function(t){(!this.hasAttached()||t||this._isInitialized)&&(this.hasAttached()&&n.prototype.detach.call(this),t&&n.prototype.attach.call(this,t),this._attachedPortal=t)},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){this._isInitialized=!0},t.prototype.ngOnDestroy=function(){n.prototype.dispose.call(this),this._attachedPortal=null},t.prototype.attachComponentPortal=function(t){t.setAttachedHost(this);var e=null!=t.viewContainerRef?t.viewContainerRef:this._viewContainerRef,l=this._componentFactoryResolver.resolveComponentFactory(t.component),r=e.createComponent(l,e.length,t.injector||e.parentInjector);return n.prototype.setDisposeFn.call(this,function(){return r.destroy()}),this._attachedPortal=t,r},t.prototype.attachTemplatePortal=function(t){var e=this;t.setAttachedHost(this);var l=this._viewContainerRef.createEmbeddedView(t.templateRef,t.context);return n.prototype.setDisposeFn.call(this,function(){return e._viewContainerRef.clear()}),this._attachedPortal=t,l},t}(ri),si=function(){},ai=function(){function n(n,t){this._parentInjector=n,this._customTokens=t}return n.prototype.get=function(n,t){var e=this._customTokens.get(n);return"undefined"!=typeof e?e:this._parentInjector.get(n,t)},n}(),ui=function(){function n(){}return n.prototype.enable=function(){},n.prototype.disable=function(){},n.prototype.attach=function(){},n}(),ci=function(){return function(n){var t=this;this.scrollStrategy=new ui,this.panelClass="",this.hasBackdrop=!1,this.backdropClass="cdk-overlay-dark-backdrop",this.direction="ltr",n&&Object.keys(n).forEach(function(e){return t[e]=n[e]})}}(),di=function(n,t,e,l){this.offsetX=e,this.offsetY=l,this.originX=n.originX,this.originY=n.originY,this.overlayX=t.overlayX,this.overlayY=t.overlayY};function hi(){return Error("Scroll strategy has already been attached.")}var pi=function(){function n(n,t){this._scrollDispatcher=n,this._ngZone=t,this._scrollSubscription=null}return n.prototype.attach=function(n){if(this._overlayRef)throw hi();this._overlayRef=n},n.prototype.enable=function(){var n=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(0).subscribe(function(){n._ngZone.run(function(){n.disable(),n._overlayRef.hasAttached()&&n._overlayRef.detach()})}))},n.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},n}(),fi=function(){function n(n){this._viewportRuler=n,this._previousHTMLStyles={top:"",left:""},this._isEnabled=!1}return n.prototype.attach=function(){},n.prototype.enable=function(){if(this._canBeEnabled()){var n=document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=n.style.left||"",this._previousHTMLStyles.top=n.style.top||"",n.style.left=-this._previousScrollPosition.left+"px",n.style.top=-this._previousScrollPosition.top+"px",n.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}},n.prototype.disable=function(){if(this._isEnabled){var n=document.documentElement,t=document.body,e=n.style.scrollBehavior||"",l=t.style.scrollBehavior||"";this._isEnabled=!1,n.style.left=this._previousHTMLStyles.left,n.style.top=this._previousHTMLStyles.top,n.classList.remove("cdk-global-scrollblock"),n.style.scrollBehavior=t.style.scrollBehavior="auto",window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),n.style.scrollBehavior=e,t.style.scrollBehavior=l}},n.prototype._canBeEnabled=function(){if(document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;var n=document.body,t=this._viewportRuler.getViewportSize();return n.scrollHeight>t.height||n.scrollWidth>t.width},n}();function _i(n,t){return t.some(function(t){return n.bottomt.bottom||n.rightt.right})}function mi(n,t){return t.some(function(t){return n.topt.bottom||n.leftt.right})}var gi=function(){function n(n,t,e,l){this._scrollDispatcher=n,this._viewportRuler=t,this._ngZone=e,this._config=l,this._scrollSubscription=null}return n.prototype.attach=function(n){if(this._overlayRef)throw hi();this._overlayRef=n},n.prototype.enable=function(){var n=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(this._config?this._config.scrollThrottle:0).subscribe(function(){if(n._overlayRef.updatePosition(),n._config&&n._config.autoClose){var t=n._overlayRef.overlayElement.getBoundingClientRect(),e=n._viewportRuler.getViewportSize(),l=e.width,r=e.height;_i(t,[{width:l,height:r,bottom:r,right:l,top:0,left:0}])&&(n.disable(),n._ngZone.run(function(){return n._overlayRef.detach()}))}}))},n.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},n}(),yi=function(){return function(n,t,e){var l=this;this._scrollDispatcher=n,this._viewportRuler=t,this._ngZone=e,this.noop=function(){return new ui},this.close=function(){return new pi(l._scrollDispatcher,l._ngZone)},this.block=function(){return new fi(l._viewportRuler)},this.reposition=function(n){return new gi(l._scrollDispatcher,l._viewportRuler,l._ngZone,n)}}}(),bi=function(){function n(n,t,e,l,r){this._portalOutlet=n,this._pane=t,this._config=e,this._ngZone=l,this._keyboardDispatcher=r,this._backdropElement=null,this._backdropClick=new yl.a,this._attachments=new yl.a,this._detachments=new yl.a,this._keydownEvents=new yl.a,e.scrollStrategy&&e.scrollStrategy.attach(this)}return Object.defineProperty(n.prototype,"overlayElement",{get:function(){return this._pane},enumerable:!0,configurable:!0}),n.prototype.attach=function(n){var t=this,e=this._portalOutlet.attach(n);return this._config.positionStrategy&&this._config.positionStrategy.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._config.scrollStrategy&&this._config.scrollStrategy.enable(),this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1)).subscribe(function(){t.updatePosition()}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&(Array.isArray(this._config.panelClass)?this._config.panelClass.forEach(function(n){return t._pane.classList.add(n)}):this._pane.classList.add(this._config.panelClass)),this._attachments.next(),this._keyboardDispatcher.add(this),e},n.prototype.detach=function(){if(this.hasAttached()){this.detachBackdrop(),this._togglePointerEvents(!1),this._config.positionStrategy&&this._config.positionStrategy.detach&&this._config.positionStrategy.detach(),this._config.scrollStrategy&&this._config.scrollStrategy.disable();var n=this._portalOutlet.detach();return this._detachments.next(),this._keyboardDispatcher.remove(this),n}},n.prototype.dispose=function(){var n=this.hasAttached();this._config.positionStrategy&&this._config.positionStrategy.dispose(),this._config.scrollStrategy&&this._config.scrollStrategy.disable(),this.detachBackdrop(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),n&&this._detachments.next(),this._detachments.complete()},n.prototype.hasAttached=function(){return this._portalOutlet.hasAttached()},n.prototype.backdropClick=function(){return this._backdropClick.asObservable()},n.prototype.attachments=function(){return this._attachments.asObservable()},n.prototype.detachments=function(){return this._detachments.asObservable()},n.prototype.keydownEvents=function(){return this._keydownEvents.asObservable()},n.prototype.getConfig=function(){return this._config},n.prototype.updatePosition=function(){this._config.positionStrategy&&this._config.positionStrategy.apply()},n.prototype.updateSize=function(n){this._config=Object(i.__assign)({},this._config,n),this._updateElementSize()},n.prototype.setDirection=function(n){this._config=Object(i.__assign)({},this._config,{direction:n}),this._updateElementDirection()},n.prototype._updateElementDirection=function(){this._pane.setAttribute("dir",this._config.direction)},n.prototype._updateElementSize=function(){(this._config.width||0===this._config.width)&&(this._pane.style.width=vi(this._config.width)),(this._config.height||0===this._config.height)&&(this._pane.style.height=vi(this._config.height)),(this._config.minWidth||0===this._config.minWidth)&&(this._pane.style.minWidth=vi(this._config.minWidth)),(this._config.minHeight||0===this._config.minHeight)&&(this._pane.style.minHeight=vi(this._config.minHeight)),(this._config.maxWidth||0===this._config.maxWidth)&&(this._pane.style.maxWidth=vi(this._config.maxWidth)),(this._config.maxHeight||0===this._config.maxHeight)&&(this._pane.style.maxHeight=vi(this._config.maxHeight))},n.prototype._togglePointerEvents=function(n){this._pane.style.pointerEvents=n?"auto":"none"},n.prototype._attachBackdrop=function(){var n=this;this._backdropElement=document.createElement("div"),this._backdropElement.classList.add("cdk-overlay-backdrop"),this._config.backdropClass&&this._backdropElement.classList.add(this._config.backdropClass),this._pane.parentElement.insertBefore(this._backdropElement,this._pane),this._backdropElement.addEventListener("click",function(){return n._backdropClick.next(null)}),this._ngZone.runOutsideAngular(function(){requestAnimationFrame(function(){n._backdropElement&&n._backdropElement.classList.add("cdk-overlay-backdrop-showing")})})},n.prototype._updateStackingOrder=function(){this._pane.nextSibling&&this._pane.parentNode.appendChild(this._pane)},n.prototype.detachBackdrop=function(){var n=this,t=this._backdropElement;if(t){var e=function(){t&&t.parentNode&&t.parentNode.removeChild(t),n._backdropElement==t&&(n._backdropElement=null)};t.classList.remove("cdk-overlay-backdrop-showing"),this._config.backdropClass&&t.classList.remove(this._config.backdropClass),t.addEventListener("transitionend",e),t.style.pointerEvents="none",this._ngZone.runOutsideAngular(function(){setTimeout(e,500)})}},n}();function vi(n){return"string"==typeof n?n:n+"px"}var wi=function(){function n(n,t,e,l,r){this._connectedTo=e,this._viewportRuler=l,this._document=r,this._dir="ltr",this._offsetX=0,this._offsetY=0,this.scrollables=[],this._resizeSubscription=rl.a.EMPTY,this._preferredPositions=[],this._applied=!1,this._positionLocked=!1,this._onPositionChange=new yl.a,this._origin=this._connectedTo.nativeElement,this.withFallbackPosition(n,t)}return Object.defineProperty(n.prototype,"_isRtl",{get:function(){return"rtl"===this._dir},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"onPositionChange",{get:function(){return this._onPositionChange.asObservable()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"positions",{get:function(){return this._preferredPositions},enumerable:!0,configurable:!0}),n.prototype.attach=function(n){var t=this;this._overlayRef=n,this._pane=n.overlayElement,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(function(){return t.apply()})},n.prototype.dispose=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},n.prototype.detach=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},n.prototype.apply=function(){if(this._applied&&this._positionLocked&&this._lastConnectedPosition)this.recalculateLastPosition();else{this._applied=!0;for(var n,t,e=this._pane,l=this._origin.getBoundingClientRect(),r=e.getBoundingClientRect(),i=this._viewportRuler.getViewportSize(),o=0,s=this._preferredPositions;o-1&&this._attachedOverlays.splice(t,1),0===this._attachedOverlays.length&&this._unsubscribeFromKeydownEvents()},n.prototype._subscribeToKeydownEvents=function(){var n=this,t=zr(this._document.body,"keydown");this._keydownEventSubscription=t.pipe(Ge(function(){return!!n._attachedOverlays.length})).subscribe(function(t){n._selectOverlayFromEvent(t)._keydownEvents.next(t)})},n.prototype._unsubscribeFromKeydownEvents=function(){this._keydownEventSubscription&&(this._keydownEventSubscription.unsubscribe(),this._keydownEventSubscription=null)},n.prototype._selectOverlayFromEvent=function(n){return this._attachedOverlays.find(function(t){return t.overlayElement===n.target||t.overlayElement.contains(n.target)})||this._attachedOverlays[this._attachedOverlays.length-1]},n}();function Ci(n,t){return n||new ki(t)}var Si=function(){function n(n){this._document=n}return n.prototype.ngOnDestroy=function(){this._containerElement&&this._containerElement.parentNode&&this._containerElement.parentNode.removeChild(this._containerElement)},n.prototype.getContainerElement=function(){return this._containerElement||this._createContainer(),this._containerElement},n.prototype._createContainer=function(){var n=this._document.createElement("div");n.classList.add("cdk-overlay-container"),this._document.body.appendChild(n),this._containerElement=n},n}();function Oi(n,t){return n||new Si(t)}var Ti=0,Li=new ci,Pi=function(){function n(n,t,e,l,r,i,o,s,a){this.scrollStrategies=n,this._overlayContainer=t,this._componentFactoryResolver=e,this._positionBuilder=l,this._keyboardDispatcher=r,this._appRef=i,this._injector=o,this._ngZone=s,this._document=a}return n.prototype.create=function(n){void 0===n&&(n=Li);var t=this._createPaneElement(),e=this._createPortalOutlet(t);return new bi(e,t,n,this._ngZone,this._keyboardDispatcher)},n.prototype.position=function(){return this._positionBuilder},n.prototype._createPaneElement=function(){var n=this._document.createElement("div");return n.id="cdk-overlay-"+Ti++,n.classList.add("cdk-overlay-pane"),this._overlayContainer.getContainerElement().appendChild(n),n},n.prototype._createPortalOutlet=function(n){return new ii(n,this._componentFactoryResolver,this._appRef,this._injector)},n}(),Di=[new di({originX:"start",originY:"bottom"},{overlayX:"start",overlayY:"top"}),new di({originX:"start",originY:"top"},{overlayX:"start",overlayY:"bottom"}),new di({originX:"end",originY:"top"},{overlayX:"end",overlayY:"bottom"}),new di({originX:"end",originY:"bottom"},{overlayX:"end",overlayY:"top"})],Ai=new l.r("cdk-connected-overlay-scroll-strategy");function Ei(n){return function(){return n.scrollStrategies.reposition()}}var Yi=function(n){this.elementRef=n},ji=function(){function n(n,t,e,r,i){this._overlay=n,this._scrollStrategy=r,this._dir=i,this._hasBackdrop=!1,this._backdropSubscription=rl.a.EMPTY,this._positionSubscription=rl.a.EMPTY,this._offsetX=0,this._offsetY=0,this.scrollStrategy=this._scrollStrategy(),this.open=!1,this.backdropClick=new l.o,this.positionChange=new l.o,this.attach=new l.o,this.detach=new l.o,this._templatePortal=new li(t,e)}return Object.defineProperty(n.prototype,"offsetX",{get:function(){return this._offsetX},set:function(n){this._offsetX=n,this._position&&this._position.withOffsetX(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"offsetY",{get:function(){return this._offsetY},set:function(n){this._offsetY=n,this._position&&this._position.withOffsetY(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hasBackdrop",{get:function(){return this._hasBackdrop},set:function(n){this._hasBackdrop=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOrigin",{get:function(){return this.origin},set:function(n){this.origin=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedPositions",{get:function(){return this.positions},set:function(n){this.positions=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOffsetX",{get:function(){return this.offsetX},set:function(n){this.offsetX=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOffsetY",{get:function(){return this.offsetY},set:function(n){this.offsetY=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedWidth",{get:function(){return this.width},set:function(n){this.width=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedHeight",{get:function(){return this.height},set:function(n){this.height=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedMinWidth",{get:function(){return this.minWidth},set:function(n){this.minWidth=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedMinHeight",{get:function(){return this.minHeight},set:function(n){this.minHeight=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedBackdropClass",{get:function(){return this.backdropClass},set:function(n){this.backdropClass=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedScrollStrategy",{get:function(){return this.scrollStrategy},set:function(n){this.scrollStrategy=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOpen",{get:function(){return this.open},set:function(n){this.open=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedHasBackdrop",{get:function(){return this.hasBackdrop},set:function(n){this.hasBackdrop=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"overlayRef",{get:function(){return this._overlayRef},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"dir",{get:function(){return this._dir?this._dir.value:"ltr"},enumerable:!0,configurable:!0}),n.prototype.ngOnDestroy=function(){this._destroyOverlay()},n.prototype.ngOnChanges=function(n){(n.open||n._deprecatedOpen)&&(this.open?this._attachOverlay():this._detachOverlay())},n.prototype._createOverlay=function(){this.positions&&this.positions.length||(this.positions=Di),this._overlayRef=this._overlay.create(this._buildConfig())},n.prototype._buildConfig=function(){var n=this._position=this._createPositionStrategy(),t=new ci({positionStrategy:n,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop});return(this.width||0===this.width)&&(t.width=this.width),(this.height||0===this.height)&&(t.height=this.height),(this.minWidth||0===this.minWidth)&&(t.minWidth=this.minWidth),(this.minHeight||0===this.minHeight)&&(t.minHeight=this.minHeight),this.backdropClass&&(t.backdropClass=this.backdropClass),t},n.prototype._createPositionStrategy=function(){var n=this.positions[0],t={originX:n.originX,originY:n.originY},e={overlayX:n.overlayX,overlayY:n.overlayY},l=this._overlay.position().connectedTo(this.origin.elementRef,t,e).withOffsetX(this.offsetX).withOffsetY(this.offsetY);return this._handlePositionChanges(l),l},n.prototype._handlePositionChanges=function(n){for(var t=this,e=1;e0&&e[0].time-l.now()<=0;)e.shift().notification.observe(r);if(e.length>0){var i=Math.max(0,e[0].time-l.now());this.schedule(n,i)}else t.active=!1},t.prototype._schedule=function(n){this.active=!0,this.add(n.schedule(t.dispatch,this.delay,{source:this,destination:this.destination,scheduler:n}))},t.prototype.scheduleNotification=function(n){if(!0!==this.errored){var t=this.scheduler,e=new Bi(t.now()+this.delay,n);this.queue.push(e),!1===this.active&&this._schedule(t)}},t.prototype._next=function(n){this.scheduleNotification(wl.createNext(n))},t.prototype._error=function(n){this.errored=!0,this.queue=[],this.destination.error(n)},t.prototype._complete=function(){this.scheduleNotification(wl.createComplete())},t}(Be.a),Bi=function(n,t){this.time=n,this.notification=t},Vi=function(n){function t(t,e){n.call(this),this.promise=t,this.scheduler=e}return Object(i.__extends)(t,n),t.create=function(n,e){return new t(n,e)},t.prototype._subscribe=function(n){var t=this,e=this.promise,l=this.scheduler;if(null==l)this._isScalar?n.closed||(n.next(this.value),n.complete()):e.then(function(e){t.value=e,t._isScalar=!0,n.closed||(n.next(e),n.complete())},function(t){n.closed||n.error(t)}).then(null,function(n){ll.a.setTimeout(function(){throw n})});else if(this._isScalar){if(!n.closed)return l.schedule(Wi,0,{value:this.value,subscriber:n})}else e.then(function(e){t.value=e,t._isScalar=!0,n.closed||n.add(l.schedule(Wi,0,{value:e,subscriber:n}))},function(t){n.closed||n.add(l.schedule(zi,0,{err:t,subscriber:n}))}).then(null,function(n){ll.a.setTimeout(function(){throw n})})},t}(o.a);function Wi(n){var t=n.subscriber;t.closed||(t.next(n.value),t.complete())}function zi(n){var t=n.subscriber;t.closed||t.error(n.err)}var Ui=Vi.create,Gi=function(){function n(){}return Object.defineProperty(n.prototype,"value",{get:function(){return this.control?this.control.value:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"valid",{get:function(){return this.control?this.control.valid:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"invalid",{get:function(){return this.control?this.control.invalid:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"pending",{get:function(){return this.control?this.control.pending:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"disabled",{get:function(){return this.control?this.control.disabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"enabled",{get:function(){return this.control?this.control.enabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"errors",{get:function(){return this.control?this.control.errors:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"pristine",{get:function(){return this.control?this.control.pristine:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"dirty",{get:function(){return this.control?this.control.dirty:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"touched",{get:function(){return this.control?this.control.touched:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"status",{get:function(){return this.control?this.control.status:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"untouched",{get:function(){return this.control?this.control.untouched:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"statusChanges",{get:function(){return this.control?this.control.statusChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"valueChanges",{get:function(){return this.control?this.control.valueChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),n.prototype.reset=function(n){void 0===n&&(n=void 0),this.control&&this.control.reset(n)},n.prototype.hasError=function(n,t){return!!this.control&&this.control.hasError(n,t)},n.prototype.getError=function(n,t){return this.control?this.control.getError(n,t):null},n}(),qi=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"formDirective",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),t}(Gi);function Ji(n){return null==n||0===n.length}var Qi=new l.r("NgValidators"),Ki=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Xi=function(){function n(){}return n.min=function(n){return function(t){if(Ji(t.value)||Ji(n))return null;var e=parseFloat(t.value);return!isNaN(e)&&en?{max:{max:n,actual:t.value}}:null}},n.required=function(n){return Ji(n.value)?{required:!0}:null},n.requiredTrue=function(n){return!0===n.value?null:{required:!0}},n.email=function(n){return Ki.test(n.value)?null:{email:!0}},n.minLength=function(n){return function(t){if(Ji(t.value))return null;var e=t.value?t.value.length:0;return en?{maxlength:{requiredLength:n,actualLength:e}}:null}},n.pattern=function(t){return t?("string"==typeof t?(l="^"+t+"$",e=new RegExp(l)):(l=t.toString(),e=t),function(n){if(Ji(n.value))return null;var t=n.value;return e.test(t)?null:{pattern:{requiredPattern:l,actualValue:t}}}):n.nullValidator;var e,l},n.nullValidator=function(n){return null},n.compose=function(n){if(!n)return null;var t=n.filter(Zi);return 0==t.length?null:function(n){return no(function(n,e){return t.map(function(t){return t(n)})}(n))}},n.composeAsync=function(n){if(!n)return null;var t=n.filter(Zi);return 0==t.length?null:function(n){var e=function(n,e){return t.map(function(t){return t(n)})}(n).map($i);return Pe.call(Ne(e),no)}},n}();function Zi(n){return null!=n}function $i(n){var t=Object(l._15)(n)?Ui(n):n;if(!Object(l._14)(t))throw new Error("Expected validator to return Promise or Observable.");return t}function no(n){var t=n.reduce(function(n,t){return null!=t?Object(i.__assign)({},n,t):n},{});return 0===Object.keys(t).length?null:t}var to=new l.r("NgValueAccessor"),eo=function(){function n(n,t){this._renderer=n,this._elementRef=t,this.onChange=function(n){},this.onTouched=function(){}}return n.prototype.writeValue=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"checked",n)},n.prototype.registerOnChange=function(n){this.onChange=n},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n}(),lo=new l.r("CompositionEventMode"),ro=function(){function n(n,t,e){var l;this._renderer=n,this._elementRef=t,this._compositionMode=e,this.onChange=function(n){},this.onTouched=function(){},this._composing=!1,null==this._compositionMode&&(this._compositionMode=(l=un()?un().getUserAgent():"",!/android (\d+)/.test(l.toLowerCase())))}return n.prototype.writeValue=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==n?"":n)},n.prototype.registerOnChange=function(n){this.onChange=n},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n.prototype._handleInput=function(n){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(n)},n.prototype._compositionStart=function(){this._composing=!0},n.prototype._compositionEnd=function(n){this._composing=!1,this._compositionMode&&this.onChange(n)},n}();function io(n){return n.validate?function(t){return n.validate(t)}:n}function oo(n){return n.validate?function(t){return n.validate(t)}:n}var so=function(){function n(n,t){this._renderer=n,this._elementRef=t,this.onChange=function(n){},this.onTouched=function(){}}return n.prototype.writeValue=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==n?"":n)},n.prototype.registerOnChange=function(n){this.onChange=function(t){n(""==t?null:parseFloat(t))}},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n}();function ao(){throw new Error("unimplemented")}var uo=function(n){function t(){var t=null!==n&&n.apply(this,arguments)||this;return t._parent=null,t.name=null,t.valueAccessor=null,t._rawValidators=[],t._rawAsyncValidators=[],t}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"validator",{get:function(){return ao()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return ao()},enumerable:!0,configurable:!0}),t}(Gi),co=function(){function n(){this._accessors=[]}return n.prototype.add=function(n,t){this._accessors.push([n,t])},n.prototype.remove=function(n){for(var t=this._accessors.length-1;t>=0;--t)if(this._accessors[t][1]===n)return void this._accessors.splice(t,1)},n.prototype.select=function(n){var t=this;this._accessors.forEach(function(e){t._isSameGroup(e,n)&&e[1]!==n&&e[1].fireUncheck(n.value)})},n.prototype._isSameGroup=function(n,t){return!!n[0].control&&n[0]._parent===t._control._parent&&n[1].name===t.name},n}(),ho=function(){function n(n,t,e,l){this._renderer=n,this._elementRef=t,this._registry=e,this._injector=l,this.onChange=function(){},this.onTouched=function(){}}return n.prototype.ngOnInit=function(){this._control=this._injector.get(uo),this._checkName(),this._registry.add(this._control,this)},n.prototype.ngOnDestroy=function(){this._registry.remove(this)},n.prototype.writeValue=function(n){this._state=n===this.value,this._renderer.setProperty(this._elementRef.nativeElement,"checked",this._state)},n.prototype.registerOnChange=function(n){var t=this;this._fn=n,this.onChange=function(){n(t.value),t._registry.select(t)}},n.prototype.fireUncheck=function(n){this.writeValue(n)},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n.prototype._checkName=function(){this.name&&this.formControlName&&this.name!==this.formControlName&&this._throwNameError(),!this.name&&this.formControlName&&(this.name=this.formControlName)},n.prototype._throwNameError=function(){throw new Error('\n If you define both a name and a formControlName attribute on your radio button, their values\n must match. Ex:
\n \n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n firstName: new FormControl()\n });',Uo='\n
\n
\n \n
\n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n person: new FormGroup({ firstName: new FormControl() })\n });',Go=function(){function n(){}return n.controlParentException=function(){throw new Error("formControlName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+zo)},n.ngModelGroupException=function(){throw new Error('formControlName cannot be used with an ngModelGroup parent. It is only compatible with parents\n that also have a "form" prefix: formGroupName, formArrayName, or formGroup.\n\n Option 1: Update the parent to be formGroupName (reactive form strategy)\n\n '+Uo+'\n\n Option 2: Use ngModel instead of formControlName (template-driven strategy)\n\n \n
\n
\n \n
\n
')},n.missingFormException=function(){throw new Error("formGroup expects a FormGroup instance. Please pass one in.\n\n Example:\n\n "+zo)},n.groupParentException=function(){throw new Error("formGroupName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+Uo)},n.arrayParentException=function(){throw new Error('formArrayName must be used with a parent formGroup directive. You\'ll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n \n
\n
\n
\n \n
\n
\n
\n\n In your class:\n\n this.cityArray = new FormArray([new FormControl(\'SF\')]);\n this.myGroup = new FormGroup({\n cities: this.cityArray\n });')},n.disabledAttrWarning=function(){console.warn("\n It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true\n when you set up this control in your component class, the disabled attribute will actually be set in the DOM for\n you. We recommend using this approach to avoid 'changed after checked' errors.\n \n Example: \n form = new FormGroup({\n first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),\n last: new FormControl('Drew', Validators.required)\n });\n ")},n}(),qo=function(n){function t(t,e){var r=n.call(this)||this;return r._validators=t,r._asyncValidators=e,r.submitted=!1,r.directives=[],r.form=null,r.ngSubmit=new l.o,r}return Object(i.__extends)(t,n),t.prototype.ngOnChanges=function(n){this._checkFormPresent(),n.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations())},Object.defineProperty(t.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),t.prototype.addControl=function(n){var t=this.form.get(n.path);return wo(t,n),t.updateValueAndValidity({emitEvent:!1}),this.directives.push(n),t},t.prototype.getControl=function(n){return this.form.get(n.path)},t.prototype.removeControl=function(n){Po(this.directives,n)},t.prototype.addFormGroup=function(n){var t=this.form.get(n.path);Mo(t,n),t.updateValueAndValidity({emitEvent:!1})},t.prototype.removeFormGroup=function(n){},t.prototype.getFormGroup=function(n){return this.form.get(n.path)},t.prototype.addFormArray=function(n){var t=this.form.get(n.path);Mo(t,n),t.updateValueAndValidity({emitEvent:!1})},t.prototype.removeFormArray=function(n){},t.prototype.getFormArray=function(n){return this.form.get(n.path)},t.prototype.updateModel=function(n,t){this.form.get(n.path).setValue(t)},t.prototype.onSubmit=function(n){return this.submitted=!0,Lo(this.form,this.directives),this.ngSubmit.emit(n),!1},t.prototype.onReset=function(){this.resetForm()},t.prototype.resetForm=function(n){void 0===n&&(n=void 0),this.form.reset(n),this.submitted=!1},t.prototype._updateDomValue=function(){var n=this;this.directives.forEach(function(t){var e=n.form.get(t.path);t.control!==e&&(function(n,t){t.valueAccessor.registerOnChange(function(){return ko(t)}),t.valueAccessor.registerOnTouched(function(){return ko(t)}),t._rawValidators.forEach(function(n){n.registerOnValidatorChange&&n.registerOnValidatorChange(null)}),t._rawAsyncValidators.forEach(function(n){n.registerOnValidatorChange&&n.registerOnValidatorChange(null)}),n&&n._clearChangeFns()}(t.control,t),e&&wo(e,t),t.control=e)}),this.form._updateTreeValidity({emitEvent:!1})},t.prototype._updateRegistrations=function(){var n=this;this.form._registerOnCollectionChange(function(){return n._updateDomValue()}),this._oldForm&&this._oldForm._registerOnCollectionChange(function(){}),this._oldForm=this.form},t.prototype._updateValidators=function(){var n=So(this._validators);this.form.validator=Xi.compose([this.form.validator,n]);var t=Oo(this._asyncValidators);this.form.asyncValidator=Xi.composeAsync([this.form.asyncValidator,t])},t.prototype._checkFormPresent=function(){this.form||Go.missingFormException()},t}(qi),Jo=function(n){function t(t,e,l){var r=n.call(this)||this;return r._parent=t,r._validators=e,r._asyncValidators=l,r}return Object(i.__extends)(t,n),t.prototype._checkParentType=function(){Ko(this._parent)&&Go.groupParentException()},t}(Do),Qo=function(n){function t(t,e,l){var r=n.call(this)||this;return r._parent=t,r._validators=e,r._asyncValidators=l,r}return Object(i.__extends)(t,n),t.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormArray(this)},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormArray(this)},Object.defineProperty(t.prototype,"control",{get:function(){return this.formDirective.getFormArray(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return vo(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return So(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return Oo(this._asyncValidators)},enumerable:!0,configurable:!0}),t.prototype._checkParentType=function(){Ko(this._parent)&&Go.arrayParentException()},t}(qi);function Ko(n){return!(n instanceof Jo||n instanceof qo||n instanceof Qo)}var Xo=function(n){function t(t,e,r,i){var o=n.call(this)||this;return o._added=!1,o.update=new l.o,o._parent=t,o._rawValidators=e||[],o._rawAsyncValidators=r||[],o.valueAccessor=function(n,t){if(!t)return null;var e=void 0,l=void 0,r=void 0;return t.forEach(function(t){var i;t.constructor===ro?e=t:(i=t,To.some(function(n){return i.constructor===n})?(l&&Co(n,"More than one built-in value accessor matches form control with"),l=t):(r&&Co(n,"More than one custom value accessor matches form control with"),r=t))}),r||l||e||(Co(n,"No valid value accessor for form control with"),null)}(o,i),o}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"isDisabled",{set:function(n){Go.disabledAttrWarning()},enumerable:!0,configurable:!0}),t.prototype.ngOnChanges=function(n){this._added||this._setUpControl(),function(n,t){if(!n.hasOwnProperty("model"))return!1;var e=n.model;return!!e.isFirstChange()||!Object(l._16)(t,e.currentValue)}(n,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},t.prototype.viewToModelUpdate=function(n){this.viewModel=n,this.update.emit(n)},Object.defineProperty(t.prototype,"path",{get:function(){return vo(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return So(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return Oo(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),t.prototype._checkParentType=function(){!(this._parent instanceof Jo)&&this._parent instanceof Do?Go.ngModelGroupException():this._parent instanceof Jo||this._parent instanceof qo||this._parent instanceof Qo||Go.controlParentException()},t.prototype._setUpControl=function(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0},t}(uo),Zo=function(){function n(){}return Object.defineProperty(n.prototype,"required",{get:function(){return this._required},set:function(n){this._required=null!=n&&!1!==n&&""+n!="false",this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),n.prototype.validate=function(n){return this.required?Xi.required(n):null},n.prototype.registerOnValidatorChange=function(n){this._onChange=n},n}(),$o=function(){function n(){}return n.prototype.ngOnChanges=function(n){"maxlength"in n&&(this._createValidator(),this._onChange&&this._onChange())},n.prototype.validate=function(n){return null!=this.maxlength?this._validator(n):null},n.prototype.registerOnValidatorChange=function(n){this._onChange=n},n.prototype._createValidator=function(){this._validator=Xi.maxLength(parseInt(this.maxlength,10))},n}(),ns=function(){function n(){}return n.prototype.group=function(n,t){void 0===t&&(t=null);var e=this._reduceControls(n);return new Fo(e,null!=t?t.validator:null,null!=t?t.asyncValidator:null)},n.prototype.control=function(n,t,e){return new No(n,t,e)},n.prototype.array=function(n,t,e){var l=this,r=n.map(function(n){return l._createControl(n)});return new Bo(r,t,e)},n.prototype._reduceControls=function(n){var t=this,e={};return Object.keys(n).forEach(function(l){e[l]=t._createControl(n[l])}),e},n.prototype._createControl=function(n){return n instanceof No||n instanceof Fo||n instanceof Bo?n:Array.isArray(n)?this.control(n[0],n.length>1?n[1]:null,n.length>2?n[2]:null):this.control(n)},n}(),ts=function(){},es=function(){},ls=function(){},rs=function(){},is="*";function os(n,t){return void 0===t&&(t=null),{type:2,steps:n,options:t}}function ss(n){return{type:6,styles:n,offset:null}}function as(n){Promise.resolve(null).then(n)}var us=function(){function n(){this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this.parentPlayer=null,this.totalTime=0}return n.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(n){return n()}),this._onDoneFns=[])},n.prototype.onStart=function(n){this._onStartFns.push(n)},n.prototype.onDone=function(n){this._onDoneFns.push(n)},n.prototype.onDestroy=function(n){this._onDestroyFns.push(n)},n.prototype.hasStarted=function(){return this._started},n.prototype.init=function(){},n.prototype.play=function(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0},n.prototype.triggerMicrotask=function(){var n=this;as(function(){return n._onFinish()})},n.prototype._onStart=function(){this._onStartFns.forEach(function(n){return n()}),this._onStartFns=[]},n.prototype.pause=function(){},n.prototype.restart=function(){},n.prototype.finish=function(){this._onFinish()},n.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(function(n){return n()}),this._onDestroyFns=[])},n.prototype.reset=function(){},n.prototype.setPosition=function(n){},n.prototype.getPosition=function(){return 0},n.prototype.triggerCallback=function(n){var t="start"==n?this._onStartFns:this._onDoneFns;t.forEach(function(n){return n()}),t.length=0},n}(),cs=function(){function n(n){var t=this;this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=n;var e=0,l=0,r=0,i=this.players.length;0==i?as(function(){return t._onFinish()}):this.players.forEach(function(n){n.onDone(function(){++e==i&&t._onFinish()}),n.onDestroy(function(){++l==i&&t._onDestroy()}),n.onStart(function(){++r==i&&t._onStart()})}),this.totalTime=this.players.reduce(function(n,t){return Math.max(n,t.totalTime)},0)}return n.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(n){return n()}),this._onDoneFns=[])},n.prototype.init=function(){this.players.forEach(function(n){return n.init()})},n.prototype.onStart=function(n){this._onStartFns.push(n)},n.prototype._onStart=function(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(function(n){return n()}),this._onStartFns=[])},n.prototype.onDone=function(n){this._onDoneFns.push(n)},n.prototype.onDestroy=function(n){this._onDestroyFns.push(n)},n.prototype.hasStarted=function(){return this._started},n.prototype.play=function(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(function(n){return n.play()})},n.prototype.pause=function(){this.players.forEach(function(n){return n.pause()})},n.prototype.restart=function(){this.players.forEach(function(n){return n.restart()})},n.prototype.finish=function(){this._onFinish(),this.players.forEach(function(n){return n.finish()})},n.prototype.destroy=function(){this._onDestroy()},n.prototype._onDestroy=function(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(function(n){return n.destroy()}),this._onDestroyFns.forEach(function(n){return n()}),this._onDestroyFns=[])},n.prototype.reset=function(){this.players.forEach(function(n){return n.reset()}),this._destroyed=!1,this._finished=!1,this._started=!1},n.prototype.setPosition=function(n){var t=n*this.totalTime;this.players.forEach(function(n){var e=n.totalTime?Math.min(1,t/n.totalTime):1;n.setPosition(e)})},n.prototype.getPosition=function(){var n=0;return this.players.forEach(function(t){var e=t.getPosition();n=Math.min(e,n)}),n},n.prototype.beforeDestroy=function(){this.players.forEach(function(n){n.beforeDestroy&&n.beforeDestroy()})},n.prototype.triggerCallback=function(n){var t="start"==n?this._onStartFns:this._onDoneFns;t.forEach(function(n){return n()}),t.length=0},n}(),ds="!",hs=e("TILf"),ps=e("N4j0"),fs=e("cQXm"),_s=function(n){function t(t,e){if(n.call(this),this.scheduler=e,null==t)throw new Error("iterator cannot be null.");this.iterator=ys(t)}return Object(i.__extends)(t,n),t.create=function(n,e){return new t(n,e)},t.dispatch=function(n){var t=n.index,e=n.iterator,l=n.subscriber;if(n.hasError)l.error(n.error);else{var r=e.next();r.done?l.complete():(l.next(r.value),n.index=t+1,l.closed?"function"==typeof e.return&&e.return():this.schedule(n))}},t.prototype._subscribe=function(n){var e=this.iterator,l=this.scheduler;if(l)return l.schedule(t.dispatch,0,{index:0,iterator:e,subscriber:n});for(;;){var r=e.next();if(r.done){n.complete();break}if(n.next(r.value),n.closed){"function"==typeof e.return&&e.return();break}}},t}(o.a),ms=function(){function n(n,t,e){void 0===t&&(t=0),void 0===e&&(e=n.length),this.str=n,this.idx=t,this.len=e}return n.prototype[hl.a]=function(){return this},n.prototype.next=function(){return this.idxbs?bs:r:r}()),this.arr=n,this.idx=t,this.len=e}return n.prototype[hl.a]=function(){return this},n.prototype.next=function(){return this.idx=n.length?l.complete():(l.next(t[e]),n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.arrayLike,l=this.scheduler,r=e.length;if(l)return l.schedule(t.dispatch,0,{arrayLike:e,index:0,length:r,subscriber:n});for(var i=0;i1?new dl.a(n,e):new je.a(e),t)}}var Os=function(){};function Ts(n){return Error("A hint was already declared for 'align=\""+n+"\"'.")}var Ls=0,Ps=function(){function n(n,t,e){this._elementRef=n,this._changeDetectorRef=t,this.color="primary",this._showAlwaysAnimate=!1,this._subscriptAnimationState="",this._hintLabel="",this._hintLabelId="mat-hint-"+Ls++,this._labelOptions=e||{},this.floatLabel=this._labelOptions.float||"auto"}return Object.defineProperty(n.prototype,"dividerColor",{get:function(){return this.color},set:function(n){this.color=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hideRequiredMarker",{get:function(){return this._hideRequiredMarker},set:function(n){this._hideRequiredMarker=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_shouldAlwaysFloat",{get:function(){return"always"===this._floatLabel&&!this._showAlwaysAnimate},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_canLabelFloat",{get:function(){return"never"!==this._floatLabel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hintLabel",{get:function(){return this._hintLabel},set:function(n){this._hintLabel=n,this._processHints()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"floatPlaceholder",{get:function(){return this._floatLabel},set:function(n){this.floatLabel=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"floatLabel",{get:function(){return this._floatLabel},set:function(n){n!==this._floatLabel&&(this._floatLabel=n||this._labelOptions.float||"auto",this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){var n=this;this._validateControlChild(),this._control.controlType&&this._elementRef.nativeElement.classList.add("mat-form-field-type-"+this._control.controlType),this._control.stateChanges.pipe(Ss(null)).subscribe(function(){n._validatePlaceholders(),n._syncDescribedByIds(),n._changeDetectorRef.markForCheck()});var t=this._control.ngControl;t&&t.valueChanges&&t.valueChanges.subscribe(function(){n._changeDetectorRef.markForCheck()}),this._hintChildren.changes.pipe(Ss(null)).subscribe(function(){n._processHints(),n._changeDetectorRef.markForCheck()}),this._errorChildren.changes.pipe(Ss(null)).subscribe(function(){n._syncDescribedByIds(),n._changeDetectorRef.markForCheck()})},n.prototype.ngAfterContentChecked=function(){this._validateControlChild()},n.prototype.ngAfterViewInit=function(){this._subscriptAnimationState="enter",this._changeDetectorRef.detectChanges()},n.prototype._shouldForward=function(n){var t=this._control?this._control.ngControl:null;return t&&t[n]},n.prototype._hasPlaceholder=function(){return!(!this._control.placeholder&&!this._placeholderChild)},n.prototype._hasLabel=function(){return!!this._labelChild},n.prototype._shouldLabelFloat=function(){return this._canLabelFloat&&(this._control.shouldLabelFloat||this._control.shouldPlaceholderFloat||this._shouldAlwaysFloat)},n.prototype._hideControlPlaceholder=function(){return!this._hasLabel()||!this._shouldLabelFloat()},n.prototype._hasFloatingLabel=function(){return this._hasLabel()||this._hasPlaceholder()},n.prototype._getDisplayedMessages=function(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"},n.prototype._animateAndLockLabel=function(){var n=this;this._hasFloatingLabel()&&this._canLabelFloat&&(this._showAlwaysAnimate=!0,this._floatLabel="always",zr(this._label.nativeElement,"transitionend").pipe(Object(_r.a)(1)).subscribe(function(){n._showAlwaysAnimate=!1}),this._changeDetectorRef.markForCheck())},n.prototype._validatePlaceholders=function(){if(this._control.placeholder&&this._placeholderChild)throw Error("Placeholder attribute and child element were both specified.")},n.prototype._processHints=function(){this._validateHints(),this._syncDescribedByIds()},n.prototype._validateHints=function(){var n,t,e=this;this._hintChildren&&this._hintChildren.forEach(function(l){if("start"==l.align){if(n||e.hintLabel)throw Ts("start");n=l}else if("end"==l.align){if(t)throw Ts("end");t=l}})},n.prototype._syncDescribedByIds=function(){if(this._control){var n=[];if("hint"===this._getDisplayedMessages()){var t=this._hintChildren?this._hintChildren.find(function(n){return"start"===n.align}):null,e=this._hintChildren?this._hintChildren.find(function(n){return"end"===n.align}):null;t?n.push(t.id):this._hintLabel&&n.push(this._hintLabelId),e&&n.push(e.id)}else this._errorChildren&&(n=this._errorChildren.map(function(n){return n.id}));this._control.setDescribedByIds(n)}},n.prototype._validateControlChild=function(){if(!this._control)throw Error("mat-form-field must contain a MatFormFieldControl.")},n}(),Ds=function(){},As=0,Es=function(){function n(n,t){this._changeDetectorRef=n,this._elementRef=t,this.showPanel=!1,this._isOpen=!1,this.displayWith=null,this.optionSelected=new l.o,this._classList={},this.id="mat-autocomplete-"+As++}return Object.defineProperty(n.prototype,"isOpen",{get:function(){return this._isOpen&&this.showPanel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"classList",{set:function(n){var t=this;n&&n.length&&(n.split(" ").forEach(function(n){return t._classList[n.trim()]=!0}),this._elementRef.nativeElement.className="")},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){this._keyManager=new Sr(this.options).withWrap(),this._setVisibility()},n.prototype._setScrollTop=function(n){this.panel&&(this.panel.nativeElement.scrollTop=n)},n.prototype._getScrollTop=function(){return this.panel?this.panel.nativeElement.scrollTop:0},n.prototype._setVisibility=function(){this.showPanel=!!this.options.length,this._classList["mat-autocomplete-visible"]=this.showPanel,this._classList["mat-autocomplete-hidden"]=!this.showPanel,this._changeDetectorRef.markForCheck()},n.prototype._emitSelectEvent=function(n){var t=new function(n,t){this.source=n,this.option=t}(this,n);this.optionSelected.emit(t)},n}(),Ys=new l.r("mat-autocomplete-scroll-strategy");function js(n){return function(){return n.scrollStrategies.reposition()}}var Is=function(){function n(n,t,e,l,r,i,o,s,a){this._element=n,this._overlay=t,this._viewContainerRef=e,this._zone=l,this._changeDetectorRef=r,this._scrollStrategy=i,this._dir=o,this._formField=s,this._document=a,this._panelOpen=!1,this._manuallyFloatingLabel=!1,this._escapeEventStream=new yl.a,this._onChange=function(){},this._onTouched=function(){}}return n.prototype.ngOnDestroy=function(){this._destroyPanel(),this._escapeEventStream.complete()},Object.defineProperty(n.prototype,"panelOpen",{get:function(){return this._panelOpen&&this.autocomplete.showPanel},enumerable:!0,configurable:!0}),n.prototype.openPanel=function(){this._attachOverlay(),this._floatLabel()},n.prototype.closePanel=function(){this._resetLabel(),this._panelOpen&&(this.autocomplete._isOpen=this._panelOpen=!1,this._overlayRef&&this._overlayRef.hasAttached()&&(this._overlayRef.detach(),this._closingActionsSubscription.unsubscribe()),this._changeDetectorRef.detectChanges())},Object.defineProperty(n.prototype,"panelClosingActions",{get:function(){var n=this;return Object(Jr.a)(this.optionSelections,this.autocomplete._keyManager.tabOut.pipe(Ge(function(){return n._panelOpen})),this._escapeEventStream,this._outsideClickStream,this._overlayRef?this._overlayRef.detachments().pipe(Ge(function(){return n._panelOpen})):Object(Fe.a)())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"optionSelections",{get:function(){return Jr.a.apply(void 0,this.autocomplete.options.map(function(n){return n.onSelectionChange}))},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"activeOption",{get:function(){return this.autocomplete&&this.autocomplete._keyManager?this.autocomplete._keyManager.activeItem:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_outsideClickStream",{get:function(){var n=this;return this._document?Object(Jr.a)(zr(this._document,"click"),zr(this._document,"touchend")).pipe(Ge(function(t){var e=t.target,l=n._formField?n._formField._elementRef.nativeElement:null;return n._panelOpen&&e!==n._element.nativeElement&&(!l||!l.contains(e))&&!!n._overlayRef&&!n._overlayRef.overlayElement.contains(e)})):Object(Fe.a)(null)},enumerable:!0,configurable:!0}),n.prototype.writeValue=function(n){var t=this;Promise.resolve(null).then(function(){return t._setTriggerValue(n)})},n.prototype.registerOnChange=function(n){this._onChange=n},n.prototype.registerOnTouched=function(n){this._onTouched=n},n.prototype.setDisabledState=function(n){this._element.nativeElement.disabled=n},n.prototype._handleKeydown=function(n){var t=n.keyCode;if(27===t&&this.panelOpen)this._resetActiveItem(),this._escapeEventStream.next(),n.stopPropagation();else if(this.activeOption&&13===t&&this.panelOpen)this.activeOption._selectViaInteraction(),this._resetActiveItem(),n.preventDefault();else{var e=this.autocomplete._keyManager.activeItem,l=38===t||40===t;this.panelOpen||9===t?this.autocomplete._keyManager.onKeydown(n):l&&this.openPanel(),(l||this.autocomplete._keyManager.activeItem!==e)&&this._scrollToOption()}},n.prototype._handleInput=function(n){document.activeElement===n.target&&(this._onChange(n.target.value),this.openPanel())},n.prototype._handleFocus=function(){this._element.nativeElement.readOnly||(this._attachOverlay(),this._floatLabel(!0))},n.prototype._floatLabel=function(n){void 0===n&&(n=!1),this._formField&&"auto"===this._formField.floatLabel&&(n?this._formField._animateAndLockLabel():this._formField.floatLabel="always",this._manuallyFloatingLabel=!0)},n.prototype._resetLabel=function(){this._manuallyFloatingLabel&&(this._formField.floatLabel="auto",this._manuallyFloatingLabel=!1)},n.prototype._scrollToOption=function(){var n=this.autocomplete._keyManager.activeItemIndex||0,t=48*(n+pr.countGroupLabelsBeforeOption(n,this.autocomplete.options,this.autocomplete.optionGroups)),e=this.autocomplete._getScrollTop();te+256&&this.autocomplete._setScrollTop(Math.max(0,t-256+48))},n.prototype._subscribeToClosingActions=function(){var n=this,t=this._zone.onStable.asObservable().pipe(Object(_r.a)(1)),e=this.autocomplete.options.changes.pipe(Ve(function(){return n._positionStrategy.recalculateLastPosition()}),Hi(0));return Object(Jr.a)(t,e).pipe(Object(Ri.a)(function(){return n._resetActiveItem(),n.autocomplete._setVisibility(),n.panelClosingActions}),Object(_r.a)(1)).subscribe(function(t){return n._setValueAndClose(t)})},n.prototype._destroyPanel=function(){this._overlayRef&&(this.closePanel(),this._overlayRef.dispose(),this._overlayRef=null)},n.prototype._setTriggerValue=function(n){var t=this.autocomplete&&this.autocomplete.displayWith?this.autocomplete.displayWith(n):n,e=null!=t?t:"";this._formField?this._formField._control.value=e:this._element.nativeElement.value=e},n.prototype._setValueAndClose=function(n){n&&n.source&&(this._clearPreviousSelectedOption(n.source),this._setTriggerValue(n.source.value),this._onChange(n.source.value),this._element.nativeElement.focus(),this.autocomplete._emitSelectEvent(n.source)),this.closePanel()},n.prototype._clearPreviousSelectedOption=function(n){this.autocomplete.options.forEach(function(t){t!=n&&t.selected&&t.deselect()})},n.prototype._attachOverlay=function(){if(!this.autocomplete)throw Error("Attempting to open an undefined instance of `mat-autocomplete`. Make sure that the id passed to the `matAutocomplete` is correct and that you're attempting to open it after the ngAfterContentInit hook.");this._overlayRef?this._overlayRef.updateSize({width:this._getHostWidth()}):(this._portal=new li(this.autocomplete.template,this._viewContainerRef),this._overlayRef=this._overlay.create(this._getOverlayConfig())),this._overlayRef&&!this._overlayRef.hasAttached()&&(this._overlayRef.attach(this._portal),this._closingActionsSubscription=this._subscribeToClosingActions()),this.autocomplete._setVisibility(),this.autocomplete._isOpen=this._panelOpen=!0},n.prototype._getOverlayConfig=function(){return new ci({positionStrategy:this._getOverlayPosition(),scrollStrategy:this._scrollStrategy(),width:this._getHostWidth(),direction:this._dir?this._dir.value:"ltr"})},n.prototype._getOverlayPosition=function(){return this._positionStrategy=this._overlay.position().connectedTo(this._getConnectedElement(),{originX:"start",originY:"bottom"},{overlayX:"start",overlayY:"top"}).withFallbackPosition({originX:"start",originY:"top"},{overlayX:"start",overlayY:"bottom"}),this._positionStrategy},n.prototype._getConnectedElement=function(){return this._formField?this._formField._connectionContainerRef:this._element},n.prototype._getHostWidth=function(){return this._getConnectedElement().nativeElement.getBoundingClientRect().width},n.prototype._resetActiveItem=function(){this.autocomplete._keyManager.setActiveItem(-1)},n}(),Rs=function(){},Hs=function(){},Ns=function(){},Fs=function(){},Bs=function(n){function t(t,e,l){var r=n.call(this,t)||this;return r._platform=e,r._focusMonitor=l,r._isRoundButton=r._hasHostAttributes("mat-fab","mat-mini-fab"),r._isIconButton=r._hasHostAttributes("mat-icon-button"),r._focusMonitor.monitor(r._elementRef.nativeElement,!0),r}return Object(i.__extends)(t,n),t.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._elementRef.nativeElement)},t.prototype.focus=function(){this._getHostElement().focus()},t.prototype._getHostElement=function(){return this._elementRef.nativeElement},t.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},t.prototype._hasHostAttributes=function(){for(var n=this,t=[],e=0;e1&&!this._isMulti)throw Error("Cannot pass multiple values into SelectionModel with single-value mode.")},n}(),Us=function(n,t){this.added=n,this.removed=t},Gs=function(){function n(){this._listeners=[]}return n.prototype.notify=function(n,t){for(var e=0,l=this._listeners;e0?this._ngZone.runOutsideAngular(function(){n._debouncer.pipe(mr(n.debounce)).subscribe(function(t){return n.event.emit(t)})}):this._debouncer.subscribe(function(t){return n.event.emit(t)}),this._observer=this._ngZone.runOutsideAngular(function(){return n._mutationObserverFactory.create(function(t){n._debouncer.next(t)})}),this._observer&&this._observer.observe(this._elementRef.nativeElement,{characterData:!0,childList:!0,subtree:!0})},n.prototype.ngOnDestroy=function(){this._observer&&this._observer.disconnect(),this._debouncer.complete()},n}(),Xs=function(){},Zs=new l.r("mat-checkbox-click-action"),$s=0,na=function(){var n={Init:0,Checked:1,Unchecked:2,Indeterminate:3};return n[n.Init]="Init",n[n.Checked]="Checked",n[n.Unchecked]="Unchecked",n[n.Indeterminate]="Indeterminate",n}(),ta=function(n){function t(t,e,r,i,o){var s=n.call(this,t)||this;return s._changeDetectorRef=e,s._focusMonitor=r,s._clickAction=o,s.ariaLabel="",s.ariaLabelledby=null,s._uniqueId="mat-checkbox-"+ ++$s,s.id=s._uniqueId,s.labelPosition="after",s.name=null,s.change=new l.o,s.indeterminateChange=new l.o,s._rippleConfig={centered:!0,radius:25,speedFactor:1.5},s.onTouched=function(){},s._currentAnimationClass="",s._currentCheckState=na.Init,s._checked=!1,s._indeterminate=!1,s._controlValueAccessorChangeFn=function(){},s.tabIndex=parseInt(i)||0,s}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"inputId",{get:function(){return(this.id||this._uniqueId)+"-input"},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"required",{get:function(){return this._required},set:function(n){this._required=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"align",{get:function(){return"after"==this.labelPosition?"start":"end"},set:function(n){this.labelPosition="start"==n?"after":"before"},enumerable:!0,configurable:!0}),t.prototype.ngAfterViewInit=function(){var n=this;this._focusMonitor.monitor(this._inputElement.nativeElement,!1).subscribe(function(t){return n._onInputFocusChange(t)})},t.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._inputElement.nativeElement)},Object.defineProperty(t.prototype,"checked",{get:function(){return this._checked},set:function(n){n!=this.checked&&(this._checked=n,this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"indeterminate",{get:function(){return this._indeterminate},set:function(n){var t=n!=this._indeterminate;this._indeterminate=n,t&&(this._transitionCheckState(this._indeterminate?na.Indeterminate:this.checked?na.Checked:na.Unchecked),this.indeterminateChange.emit(this._indeterminate))},enumerable:!0,configurable:!0}),t.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},t.prototype._onLabelTextChange=function(){this._changeDetectorRef.markForCheck()},t.prototype.writeValue=function(n){this.checked=!!n},t.prototype.registerOnChange=function(n){this._controlValueAccessorChangeFn=n},t.prototype.registerOnTouched=function(n){this.onTouched=n},t.prototype.setDisabledState=function(n){this.disabled=n,this._changeDetectorRef.markForCheck()},t.prototype._getAriaChecked=function(){return this.checked?"true":this.indeterminate?"mixed":"false"},t.prototype._transitionCheckState=function(n){var t=this._currentCheckState,e=this._elementRef.nativeElement;t!==n&&(this._currentAnimationClass.length>0&&e.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(t,n),this._currentCheckState=n,this._currentAnimationClass.length>0&&e.classList.add(this._currentAnimationClass))},t.prototype._emitChangeEvent=function(){var n=new function(){};n.source=this,n.checked=this.checked,this._controlValueAccessorChangeFn(this.checked),this.change.emit(n)},t.prototype._onInputFocusChange=function(n){this._focusRipple||"keyboard"!==n?n||(this._removeFocusRipple(),this.onTouched()):this._focusRipple=this._ripple.launch(0,0,Object(i.__assign)({persistent:!0},this._rippleConfig))},t.prototype.toggle=function(){this.checked=!this.checked},t.prototype._onInputClick=function(n){var t=this;n.stopPropagation(),this.disabled||"noop"===this._clickAction?this.disabled||"noop"!==this._clickAction||(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate):(this.indeterminate&&"check"!==this._clickAction&&Promise.resolve().then(function(){t._indeterminate=!1,t.indeterminateChange.emit(t._indeterminate)}),this.toggle(),this._transitionCheckState(this._checked?na.Checked:na.Unchecked),this._emitChangeEvent())},t.prototype.focus=function(){this._focusMonitor.focusVia(this._inputElement.nativeElement,"keyboard")},t.prototype._onInteractionEvent=function(n){n.stopPropagation()},t.prototype._getAnimationClassForCheckStateTransition=function(n,t){var e="";switch(n){case na.Init:if(t===na.Checked)e="unchecked-checked";else{if(t!=na.Indeterminate)return"";e="unchecked-indeterminate"}break;case na.Unchecked:e=t===na.Checked?"unchecked-checked":"unchecked-indeterminate";break;case na.Checked:e=t===na.Unchecked?"checked-unchecked":"checked-indeterminate";break;case na.Indeterminate:e=t===na.Checked?"indeterminate-checked":"indeterminate-unchecked"}return"mat-checkbox-anim-"+e},t.prototype._removeFocusRipple=function(){this._focusRipple&&(this._focusRipple.fadeOut(),this._focusRipple=null)},t}(Jl(Gl(ql(Ul(function(n){this._elementRef=n})),"accent"))),ea=function(){},la=function(n){function t(t){n.call(this),this.observableFactory=t}return Object(i.__extends)(t,n),t.create=function(n){return new t(n)},t.prototype._subscribe=function(n){return new ra(n,this.observableFactory)},t}(o.a),ra=function(n){function t(t,e){n.call(this,t),this.factory=e,this.tryDefer()}return Object(i.__extends)(t,n),t.prototype.tryDefer=function(){try{this._callFactory()}catch(n){this._error(n)}},t.prototype._callFactory=function(){var n=this.factory();n&&this.add(Object(ke.a)(this,n))},t}(Me.a),ia=la.create,oa=function(){this.role="dialog",this.panelClass="",this.hasBackdrop=!0,this.backdropClass="",this.disableClose=!1,this.width="",this.height="",this.maxWidth="80vw",this.data=null,this.direction="ltr",this.ariaDescribedBy=null,this.ariaLabel=null,this.autoFocus=!0};function sa(){throw Error("Attempting to attach dialog content after content is already attached")}var aa=function(n){function t(t,e,r,i){var o=n.call(this)||this;return o._elementRef=t,o._focusTrapFactory=e,o._changeDetectorRef=r,o._document=i,o._elementFocusedBeforeDialogWasOpened=null,o._state="enter",o._animationStateChanged=new l.o,o._ariaLabelledBy=null,o}return Object(i.__extends)(t,n),t.prototype.attachComponentPortal=function(n){return this._portalOutlet.hasAttached()&&sa(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachComponentPortal(n)},t.prototype.attachTemplatePortal=function(n){return this._portalOutlet.hasAttached()&&sa(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachTemplatePortal(n)},t.prototype._trapFocus=function(){this._focusTrap||(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement)),this._config.autoFocus&&this._focusTrap.focusInitialElementWhenReady()},t.prototype._restoreFocus=function(){var n=this._elementFocusedBeforeDialogWasOpened;n&&"function"==typeof n.focus&&n.focus(),this._focusTrap&&this._focusTrap.destroy()},t.prototype._savePreviouslyFocusedElement=function(){var n=this;this._document&&(this._elementFocusedBeforeDialogWasOpened=this._document.activeElement,Promise.resolve().then(function(){return n._elementRef.nativeElement.focus()}))},t.prototype._onAnimationDone=function(n){"enter"===n.toState?this._trapFocus():"exit"===n.toState&&this._restoreFocus(),this._animationStateChanged.emit(n)},t.prototype._onAnimationStart=function(n){this._animationStateChanged.emit(n)},t.prototype._startExitAnimation=function(){this._state="exit",this._changeDetectorRef.markForCheck()},t}(ri),ua=0,ca=function(){function n(n,t,e){void 0===e&&(e="mat-dialog-"+ua++);var l=this;this._overlayRef=n,this._containerInstance=t,this.id=e,this.disableClose=this._containerInstance._config.disableClose,this._afterOpen=new yl.a,this._afterClosed=new yl.a,this._beforeClose=new yl.a,t._animationStateChanged.pipe(Ge(function(n){return"done"===n.phaseName&&"enter"===n.toState}),Object(_r.a)(1)).subscribe(function(){l._afterOpen.next(),l._afterOpen.complete()}),t._animationStateChanged.pipe(Ge(function(n){return"done"===n.phaseName&&"exit"===n.toState}),Object(_r.a)(1)).subscribe(function(){l._overlayRef.dispose(),l._afterClosed.next(l._result),l._afterClosed.complete(),l.componentInstance=null})}return n.prototype.close=function(n){var t=this;this._result=n,this._containerInstance._animationStateChanged.pipe(Ge(function(n){return"start"===n.phaseName}),Object(_r.a)(1)).subscribe(function(){t._beforeClose.next(n),t._beforeClose.complete(),t._overlayRef.detachBackdrop()}),this._containerInstance._startExitAnimation()},n.prototype.afterOpen=function(){return this._afterOpen.asObservable()},n.prototype.afterClosed=function(){return this._afterClosed.asObservable()},n.prototype.beforeClose=function(){return this._beforeClose.asObservable()},n.prototype.backdropClick=function(){return this._overlayRef.backdropClick()},n.prototype.keydownEvents=function(){return this._overlayRef.keydownEvents()},n.prototype.updatePosition=function(n){var t=this._getPositionStrategy();return n&&(n.left||n.right)?n.left?t.left(n.left):t.right(n.right):t.centerHorizontally(),n&&(n.top||n.bottom)?n.top?t.top(n.top):t.bottom(n.bottom):t.centerVertically(),this._overlayRef.updatePosition(),this},n.prototype.updateSize=function(n,t){return void 0===n&&(n="auto"),void 0===t&&(t="auto"),this._getPositionStrategy().width(n).height(t),this._overlayRef.updatePosition(),this},n.prototype._getPositionStrategy=function(){return this._overlayRef.getConfig().positionStrategy},n}(),da=new l.r("MatDialogData"),ha=new l.r("mat-dialog-scroll-strategy");function pa(n){return function(){return n.scrollStrategies.block()}}var fa=function(){function n(n,t,e,l,r,i){var o=this;this._overlay=n,this._injector=t,this._scrollStrategy=l,this._parentDialog=r,this._overlayContainer=i,this._openDialogsAtThisLevel=[],this._afterAllClosedAtThisLevel=new yl.a,this._afterOpenAtThisLevel=new yl.a,this._ariaHiddenElements=new Map,this.afterAllClosed=ia(function(){return o.openDialogs.length?o._afterAllClosed:o._afterAllClosed.pipe(Ss(void 0))}),!r&&e&&e.subscribe(function(){return o.closeAll()})}return Object.defineProperty(n.prototype,"openDialogs",{get:function(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"afterOpen",{get:function(){return this._parentDialog?this._parentDialog.afterOpen:this._afterOpenAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_afterAllClosed",{get:function(){var n=this._parentDialog;return n?n._afterAllClosed:this._afterAllClosedAtThisLevel},enumerable:!0,configurable:!0}),n.prototype.open=function(n,t){var e=this;if((t=function(n){return Object(i.__assign)({},new oa,n)}(t)).id&&this.getDialogById(t.id))throw Error('Dialog with id "'+t.id+'" exists already. The dialog id must be unique.');var l=this._createOverlay(t),r=this._attachDialogContainer(l,t),o=this._attachDialogContent(n,r,l,t);return this.openDialogs.length||this._hideNonDialogContentFromAssistiveTechnology(),this.openDialogs.push(o),o.afterClosed().subscribe(function(){return e._removeOpenDialog(o)}),this.afterOpen.next(o),o},n.prototype.closeAll=function(){for(var n=this.openDialogs.length;n--;)this.openDialogs[n].close()},n.prototype.getDialogById=function(n){return this.openDialogs.find(function(t){return t.id===n})},n.prototype._createOverlay=function(n){var t=this._getOverlayConfig(n);return this._overlay.create(t)},n.prototype._getOverlayConfig=function(n){var t=new ci({positionStrategy:this._overlay.position().global(),scrollStrategy:this._scrollStrategy(),panelClass:n.panelClass,hasBackdrop:n.hasBackdrop,direction:n.direction,minWidth:n.minWidth,minHeight:n.minHeight,maxWidth:n.maxWidth,maxHeight:n.maxHeight});return n.backdropClass&&(t.backdropClass=n.backdropClass),t},n.prototype._attachDialogContainer=function(n,t){var e=new ei(aa,t.viewContainerRef),l=n.attach(e);return l.instance._config=t,l.instance},n.prototype._attachDialogContent=function(n,t,e,r){var i=new ca(e,t,r.id);if(r.hasBackdrop&&e.backdropClick().subscribe(function(){i.disableClose||i.close()}),e.keydownEvents().pipe(Ge(function(n){return 27===n.keyCode&&!i.disableClose})).subscribe(function(){return i.close()}),n instanceof l.O)t.attachTemplatePortal(new li(n,null,{$implicit:r.data,dialogRef:i}));else{var o=this._createInjector(r,i,t),s=t.attachComponentPortal(new ei(n,void 0,o));i.componentInstance=s.instance}return i.updateSize(r.width,r.height).updatePosition(r.position),i},n.prototype._createInjector=function(n,t,e){var l=n&&n.viewContainerRef&&n.viewContainerRef.injector,r=new WeakMap;return r.set(ca,t),r.set(aa,e),r.set(da,n.data),r.set(Dl,{value:n.direction,change:Object(Fe.a)()}),new ai(l||this._injector,r)},n.prototype._removeOpenDialog=function(n){var t=this.openDialogs.indexOf(n);t>-1&&(this.openDialogs.splice(t,1),this.openDialogs.length||(this._ariaHiddenElements.forEach(function(n,t){n?t.setAttribute("aria-hidden",n):t.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),this._afterAllClosed.next()))},n.prototype._hideNonDialogContentFromAssistiveTechnology=function(){var n=this._overlayContainer.getContainerElement();if(n.parentElement)for(var t=n.parentElement.children,e=t.length-1;e>-1;e--){var l=t[e];l===n||"SCRIPT"===l.nodeName||"STYLE"===l.nodeName||l.hasAttribute("aria-live")||(this._ariaHiddenElements.set(l,l.getAttribute("aria-hidden")),l.setAttribute("aria-hidden","true"))}},n}(),_a=function(){},ma=function(){},ga=function(){function n(n){this.callback=n}return n.prototype.call=function(n,t){return t.subscribe(new ya(n,this.callback))},n}(),ya=function(n){function t(t,e){n.call(this,t),this.add(new rl.a(e))}return Object(i.__extends)(t,n),t}(Be.a),ba=e("3a3m");function va(n,t){return function(n,t){return Object(nl.a)(n,t,1)}(n,t)(this)}var wa=function(){},xa=function(){},Ma=function(){function n(n){var t=this;this.normalizedNames=new Map,this.lazyUpdate=null,n?this.lazyInit="string"==typeof n?function(){t.headers=new Map,n.split("\n").forEach(function(n){var e=n.indexOf(":");if(e>0){var l=n.slice(0,e),r=l.toLowerCase(),i=n.slice(e+1).trim();t.maybeSetNormalizedName(l,r),t.headers.has(r)?t.headers.get(r).push(i):t.headers.set(r,[i])}})}:function(){t.headers=new Map,Object.keys(n).forEach(function(e){var l=n[e],r=e.toLowerCase();"string"==typeof l&&(l=[l]),l.length>0&&(t.headers.set(r,l),t.maybeSetNormalizedName(e,r))})}:this.headers=new Map}return n.prototype.has=function(n){return this.init(),this.headers.has(n.toLowerCase())},n.prototype.get=function(n){this.init();var t=this.headers.get(n.toLowerCase());return t&&t.length>0?t[0]:null},n.prototype.keys=function(){return this.init(),Array.from(this.normalizedNames.values())},n.prototype.getAll=function(n){return this.init(),this.headers.get(n.toLowerCase())||null},n.prototype.append=function(n,t){return this.clone({name:n,value:t,op:"a"})},n.prototype.set=function(n,t){return this.clone({name:n,value:t,op:"s"})},n.prototype.delete=function(n,t){return this.clone({name:n,value:t,op:"d"})},n.prototype.maybeSetNormalizedName=function(n,t){this.normalizedNames.has(t)||this.normalizedNames.set(t,n)},n.prototype.init=function(){var t=this;this.lazyInit&&(this.lazyInit instanceof n?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(function(n){return t.applyUpdate(n)}),this.lazyUpdate=null))},n.prototype.copyFrom=function(n){var t=this;n.init(),Array.from(n.headers.keys()).forEach(function(e){t.headers.set(e,n.headers.get(e)),t.normalizedNames.set(e,n.normalizedNames.get(e))})},n.prototype.clone=function(t){var e=new n;return e.lazyInit=this.lazyInit&&this.lazyInit instanceof n?this.lazyInit:this,e.lazyUpdate=(this.lazyUpdate||[]).concat([t]),e},n.prototype.applyUpdate=function(n){var t=n.name.toLowerCase();switch(n.op){case"a":case"s":var e=n.value;if("string"==typeof e&&(e=[e]),0===e.length)return;this.maybeSetNormalizedName(n.name,t);var l=("a"===n.op?this.headers.get(t):void 0)||[];l.push.apply(l,e),this.headers.set(t,l);break;case"d":var r=n.value;if(r){var i=this.headers.get(t);if(!i)return;0===(i=i.filter(function(n){return-1===r.indexOf(n)})).length?(this.headers.delete(t),this.normalizedNames.delete(t)):this.headers.set(t,i)}else this.headers.delete(t),this.normalizedNames.delete(t)}},n.prototype.forEach=function(n){var t=this;this.init(),Array.from(this.normalizedNames.keys()).forEach(function(e){return n(t.normalizedNames.get(e),t.headers.get(e))})},n}(),ka=function(){function n(){}return n.prototype.encodeKey=function(n){return Ca(n)},n.prototype.encodeValue=function(n){return Ca(n)},n.prototype.decodeKey=function(n){return decodeURIComponent(n)},n.prototype.decodeValue=function(n){return decodeURIComponent(n)},n}();function Ca(n){return encodeURIComponent(n).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var Sa=function(){function n(n){void 0===n&&(n={});var t,e,l,r=this;if(this.updates=null,this.cloneFrom=null,this.encoder=n.encoder||new ka,n.fromString){if(n.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=(t=n.fromString,e=this.encoder,l=new Map,t.length>0&&t.split("&").forEach(function(n){var t=n.indexOf("="),r=-1==t?[e.decodeKey(n),""]:[e.decodeKey(n.slice(0,t)),e.decodeValue(n.slice(t+1))],i=r[0],o=r[1],s=l.get(i)||[];s.push(o),l.set(i,s)}),l)}else n.fromObject?(this.map=new Map,Object.keys(n.fromObject).forEach(function(t){var e=n.fromObject[t];r.map.set(t,Array.isArray(e)?e:[e])})):this.map=null}return n.prototype.has=function(n){return this.init(),this.map.has(n)},n.prototype.get=function(n){this.init();var t=this.map.get(n);return t?t[0]:null},n.prototype.getAll=function(n){return this.init(),this.map.get(n)||null},n.prototype.keys=function(){return this.init(),Array.from(this.map.keys())},n.prototype.append=function(n,t){return this.clone({param:n,value:t,op:"a"})},n.prototype.set=function(n,t){return this.clone({param:n,value:t,op:"s"})},n.prototype.delete=function(n,t){return this.clone({param:n,value:t,op:"d"})},n.prototype.toString=function(){var n=this;return this.init(),this.keys().map(function(t){var e=n.encoder.encodeKey(t);return n.map.get(t).map(function(t){return e+"="+n.encoder.encodeValue(t)}).join("&")}).join("&")},n.prototype.clone=function(t){var e=new n({encoder:this.encoder});return e.cloneFrom=this.cloneFrom||this,e.updates=(this.updates||[]).concat([t]),e},n.prototype.init=function(){var n=this;null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(function(t){return n.map.set(t,n.cloneFrom.map.get(t))}),this.updates.forEach(function(t){switch(t.op){case"a":case"s":var e=("a"===t.op?n.map.get(t.param):void 0)||[];e.push(t.value),n.map.set(t.param,e);break;case"d":if(void 0===t.value){n.map.delete(t.param);break}var l=n.map.get(t.param)||[],r=l.indexOf(t.value);-1!==r&&l.splice(r,1),l.length>0?n.map.set(t.param,l):n.map.delete(t.param)}}),this.cloneFrom=null)},n}();function Oa(n){return"undefined"!=typeof ArrayBuffer&&n instanceof ArrayBuffer}function Ta(n){return"undefined"!=typeof Blob&&n instanceof Blob}function La(n){return"undefined"!=typeof FormData&&n instanceof FormData}var Pa=function(){function n(n,t,e,l){var r;if(this.url=t,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=n.toUpperCase(),function(n){switch(n){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||l?(this.body=void 0!==e?e:null,r=l):r=e,r&&(this.reportProgress=!!r.reportProgress,this.withCredentials=!!r.withCredentials,r.responseType&&(this.responseType=r.responseType),r.headers&&(this.headers=r.headers),r.params&&(this.params=r.params)),this.headers||(this.headers=new Ma),this.params){var i=this.params.toString();if(0===i.length)this.urlWithParams=t;else{var o=t.indexOf("?");this.urlWithParams=t+(-1===o?"?":o=200&&this.status<300}}(),Ea=function(n){function t(t){void 0===t&&(t={});var e=n.call(this,t)||this;return e.type=Da.ResponseHeader,e}return Object(i.__extends)(t,n),t.prototype.clone=function(n){return void 0===n&&(n={}),new t({headers:n.headers||this.headers,status:void 0!==n.status?n.status:this.status,statusText:n.statusText||this.statusText,url:n.url||this.url||void 0})},t}(Aa),Ya=function(n){function t(t){void 0===t&&(t={});var e=n.call(this,t)||this;return e.type=Da.Response,e.body=void 0!==t.body?t.body:null,e}return Object(i.__extends)(t,n),t.prototype.clone=function(n){return void 0===n&&(n={}),new t({body:void 0!==n.body?n.body:this.body,headers:n.headers||this.headers,status:void 0!==n.status?n.status:this.status,statusText:n.statusText||this.statusText,url:n.url||this.url||void 0})},t}(Aa),ja=function(n){function t(t){var e=n.call(this,t,0,"Unknown Error")||this;return e.name="HttpErrorResponse",e.ok=!1,e.message=e.status>=200&&e.status<300?"Http failure during parsing for "+(t.url||"(unknown url)"):"Http failure response for "+(t.url||"(unknown url)")+": "+t.status+" "+t.statusText,e.error=t.error||null,e}return Object(i.__extends)(t,n),t}(Aa);function Ia(n,t){return{body:t,headers:n.headers,observe:n.observe,params:n.params,reportProgress:n.reportProgress,responseType:n.responseType,withCredentials:n.withCredentials}}var Ra=function(){function n(n){this.handler=n}return n.prototype.request=function(n,t,e){var l,r=this;if(void 0===e&&(e={}),n instanceof Pa)l=n;else{var i;i=e.headers instanceof Ma?e.headers:new Ma(e.headers);var o=void 0;e.params&&(o=e.params instanceof Sa?e.params:new Sa({fromObject:e.params})),l=new Pa(n,t,void 0!==e.body?e.body:null,{headers:i,params:o,reportProgress:e.reportProgress,responseType:e.responseType||"json",withCredentials:e.withCredentials})}var s=va.call(Object(Fe.a)(l),function(n){return r.handler.handle(n)});if(n instanceof Pa||"events"===e.observe)return s;var a=Qe.call(s,function(n){return n instanceof Ya});switch(e.observe||"body"){case"body":switch(l.responseType){case"arraybuffer":return Pe.call(a,function(n){if(null!==n.body&&!(n.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return n.body});case"blob":return Pe.call(a,function(n){if(null!==n.body&&!(n.body instanceof Blob))throw new Error("Response is not a Blob.");return n.body});case"text":return Pe.call(a,function(n){if(null!==n.body&&"string"!=typeof n.body)throw new Error("Response is not a string.");return n.body});case"json":default:return Pe.call(a,function(n){return n.body})}case"response":return a;default:throw new Error("Unreachable: unhandled observe type "+e.observe+"}")}},n.prototype.delete=function(n,t){return void 0===t&&(t={}),this.request("DELETE",n,t)},n.prototype.get=function(n,t){return void 0===t&&(t={}),this.request("GET",n,t)},n.prototype.head=function(n,t){return void 0===t&&(t={}),this.request("HEAD",n,t)},n.prototype.jsonp=function(n,t){return this.request("JSONP",n,{params:(new Sa).append(t,"JSONP_CALLBACK"),observe:"body",responseType:"json"})},n.prototype.options=function(n,t){return void 0===t&&(t={}),this.request("OPTIONS",n,t)},n.prototype.patch=function(n,t,e){return void 0===e&&(e={}),this.request("PATCH",n,Ia(e,t))},n.prototype.post=function(n,t,e){return void 0===e&&(e={}),this.request("POST",n,Ia(e,t))},n.prototype.put=function(n,t,e){return void 0===e&&(e={}),this.request("PUT",n,Ia(e,t))},n}(),Ha=function(){function n(n,t){this.next=n,this.interceptor=t}return n.prototype.handle=function(n){return this.interceptor.intercept(n,this.next)},n}(),Na=new l.r("HTTP_INTERCEPTORS"),Fa=function(){function n(){}return n.prototype.intercept=function(n,t){return t.handle(n)},n}(),Ba=/^\)\]\}',?\n/,Va=function(){},Wa=function(){function n(){}return n.prototype.build=function(){return new XMLHttpRequest},n}(),za=function(){function n(n){this.xhrFactory=n}return n.prototype.handle=function(n){var t=this;if("JSONP"===n.method)throw new Error("Attempted to construct Jsonp request without JsonpClientModule installed.");return new o.a(function(e){var l=t.xhrFactory.build();if(l.open(n.method,n.urlWithParams),n.withCredentials&&(l.withCredentials=!0),n.headers.forEach(function(n,t){return l.setRequestHeader(n,t.join(","))}),n.headers.has("Accept")||l.setRequestHeader("Accept","application/json, text/plain, */*"),!n.headers.has("Content-Type")){var r=n.detectContentTypeHeader();null!==r&&l.setRequestHeader("Content-Type",r)}if(n.responseType){var i=n.responseType.toLowerCase();l.responseType="json"!==i?i:"text"}var o=n.serializeBody(),s=null,a=function(){if(null!==s)return s;var t=1223===l.status?204:l.status,e=l.statusText||"OK",r=new Ma(l.getAllResponseHeaders()),i=function(n){return"responseURL"in n&&n.responseURL?n.responseURL:/^X-Request-URL:/m.test(n.getAllResponseHeaders())?n.getResponseHeader("X-Request-URL"):null}(l)||n.url;return s=new Ea({headers:r,status:t,statusText:e,url:i})},u=function(){var t=a(),r=t.headers,i=t.status,o=t.statusText,s=t.url,u=null;204!==i&&(u="undefined"==typeof l.response?l.responseText:l.response),0===i&&(i=u?200:0);var c=i>=200&&i<300;if("json"===n.responseType&&"string"==typeof u){var d=u;u=u.replace(Ba,"");try{u=""!==u?JSON.parse(u):null}catch(n){u=d,c&&(c=!1,u={error:n,text:u})}}c?(e.next(new Ya({body:u,headers:r,status:i,statusText:o,url:s||void 0})),e.complete()):e.error(new ja({error:u,headers:r,status:i,statusText:o,url:s||void 0}))},c=function(n){var t=new ja({error:n,status:l.status||0,statusText:l.statusText||"Unknown Error"});e.error(t)},d=!1,h=function(t){d||(e.next(a()),d=!0);var r={type:Da.DownloadProgress,loaded:t.loaded};t.lengthComputable&&(r.total=t.total),"text"===n.responseType&&l.responseText&&(r.partialText=l.responseText),e.next(r)},p=function(n){var t={type:Da.UploadProgress,loaded:n.loaded};n.lengthComputable&&(t.total=n.total),e.next(t)};return l.addEventListener("load",u),l.addEventListener("error",c),n.reportProgress&&(l.addEventListener("progress",h),null!==o&&l.upload&&l.upload.addEventListener("progress",p)),l.send(o),e.next({type:Da.Sent}),function(){l.removeEventListener("error",c),l.removeEventListener("load",u),n.reportProgress&&(l.removeEventListener("progress",h),null!==o&&l.upload&&l.upload.removeEventListener("progress",p)),l.abort()}})},n}(),Ua=new l.r("XSRF_COOKIE_NAME"),Ga=new l.r("XSRF_HEADER_NAME"),qa=function(){},Ja=function(){function n(n,t,e){this.doc=n,this.platform=t,this.cookieName=e,this.lastCookieString="",this.lastToken=null,this.parseCount=0}return n.prototype.getToken=function(){if("server"===this.platform)return null;var n=this.doc.cookie||"";return n!==this.lastCookieString&&(this.parseCount++,this.lastToken=S(n,this.cookieName),this.lastCookieString=n),this.lastToken},n}(),Qa=function(){function n(n,t){this.tokenService=n,this.headerName=t}return n.prototype.intercept=function(n,t){var e=n.url.toLowerCase();if("GET"===n.method||"HEAD"===n.method||e.startsWith("http://")||e.startsWith("https://"))return t.handle(n);var l=this.tokenService.getToken();return null===l||n.headers.has(this.headerName)||(n=n.clone({headers:n.headers.set(this.headerName,l)})),t.handle(n)},n}();function Ka(n,t){return void 0===t&&(t=[]),t?t.reduceRight(function(n,t){return new Ha(n,t)},n):n}var Xa=function(){function n(){}return n.disable=function(){return{ngModule:n,providers:[{provide:Qa,useClass:Fa}]}},n.withOptions=function(t){return void 0===t&&(t={}),{ngModule:n,providers:[t.cookieName?{provide:Ua,useValue:t.cookieName}:[],t.headerName?{provide:Ga,useValue:t.headerName}:[]]}},n}(),Za=function(){};function $a(n){return Error('Unable to find icon with the name "'+n+'"')}function nu(n){return Error("The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was \""+n+'".')}var tu=function(n){this.url=n,this.svgElement=null},eu=function(){function n(n,t,e){this._httpClient=n,this._sanitizer=t,this._document=e,this._svgIconConfigs=new Map,this._iconSetConfigs=new Map,this._cachedIconsByUrl=new Map,this._inProgressUrlFetches=new Map,this._fontCssClassesByAlias=new Map,this._defaultFontSetClass="material-icons"}return n.prototype.addSvgIcon=function(n,t){return this.addSvgIconInNamespace("",n,t)},n.prototype.addSvgIconInNamespace=function(n,t,e){var l=iu(n,t);return this._svgIconConfigs.set(l,new tu(e)),this},n.prototype.addSvgIconSet=function(n){return this.addSvgIconSetInNamespace("",n)},n.prototype.addSvgIconSetInNamespace=function(n,t){var e=new tu(t),l=this._iconSetConfigs.get(n);return l?l.push(e):this._iconSetConfigs.set(n,[e]),this},n.prototype.registerFontClassAlias=function(n,t){return void 0===t&&(t=n),this._fontCssClassesByAlias.set(n,t),this},n.prototype.classNameForFontAlias=function(n){return this._fontCssClassesByAlias.get(n)||n},n.prototype.setDefaultFontSetClass=function(n){return this._defaultFontSetClass=n,this},n.prototype.getDefaultFontSetClass=function(){return this._defaultFontSetClass},n.prototype.getSvgIconFromUrl=function(n){var t=this,e=this._sanitizer.sanitize(l.K.RESOURCE_URL,n);if(!e)throw nu(n);var r=this._cachedIconsByUrl.get(e);return r?Object(Fe.a)(ru(r)):this._loadSvgIconFromConfig(new tu(n)).pipe(Ve(function(n){return t._cachedIconsByUrl.set(e,n)}),Object(Le.a)(function(n){return ru(n)}))},n.prototype.getNamedSvgIcon=function(n,t){void 0===t&&(t="");var e=iu(t,n),l=this._svgIconConfigs.get(e);if(l)return this._getSvgFromConfig(l);var r=this._iconSetConfigs.get(t);return r?this._getSvgFromIconSetConfigs(n,r):xe($a(e))},n.prototype._getSvgFromConfig=function(n){return n.svgElement?Object(Fe.a)(ru(n.svgElement)):this._loadSvgIconFromConfig(n).pipe(Ve(function(t){return n.svgElement=t}),Object(Le.a)(function(n){return ru(n)}))},n.prototype._getSvgFromIconSetConfigs=function(n,t){var e=this,r=this._extractIconWithNameFromAnySet(n,t);if(r)return Object(Fe.a)(r);var i=t.filter(function(n){return!n.svgElement}).map(function(n){return e._loadSvgIconSetFromConfig(n).pipe(Ce(function(t){var r=e._sanitizer.sanitize(l.K.RESOURCE_URL,n.url);return console.log("Loading icon set URL: "+r+" failed: "+t),Object(Fe.a)(null)}),Ve(function(t){t&&(n.svgElement=t)}))});return Ne(i).pipe(Object(Le.a)(function(){var l=e._extractIconWithNameFromAnySet(n,t);if(!l)throw $a(n);return l}))},n.prototype._extractIconWithNameFromAnySet=function(n,t){for(var e=t.length-1;e>=0;e--){var l=t[e];if(l.svgElement){var r=this._extractSvgIconFromSet(l.svgElement,n);if(r)return r}}return null},n.prototype._loadSvgIconFromConfig=function(n){var t=this;return this._fetchUrl(n.url).pipe(Object(Le.a)(function(n){return t._createSvgElementForSingleIcon(n)}))},n.prototype._loadSvgIconSetFromConfig=function(n){var t=this;return this._fetchUrl(n.url).pipe(Object(Le.a)(function(n){return t._svgElementFromString(n)}))},n.prototype._createSvgElementForSingleIcon=function(n){var t=this._svgElementFromString(n);return this._setSvgAttributes(t),t},n.prototype._extractSvgIconFromSet=function(n,t){var e=n.querySelector("#"+t);if(!e)return null;var l=e.cloneNode(!0);if(l.id="","svg"===l.nodeName.toLowerCase())return this._setSvgAttributes(l);if("symbol"===l.nodeName.toLowerCase())return this._setSvgAttributes(this._toSvgElement(l));var r=this._svgElementFromString("");return r.appendChild(l),this._setSvgAttributes(r)},n.prototype._svgElementFromString=function(n){if(this._document||"undefined"!=typeof document){var t=(this._document||document).createElement("DIV");t.innerHTML=n;var e=t.querySelector("svg");if(!e)throw Error(" tag not found");return e}throw new Error("MatIconRegistry could not resolve document.")},n.prototype._toSvgElement=function(n){for(var t=this._svgElementFromString(""),e=0;e-1)throw Error('Input type "'+this._type+"\" isn't supported by matInput.")},t.prototype._isNeverEmpty=function(){return this._neverEmptyInputTypes.indexOf(this._type)>-1},t.prototype._isBadInput=function(){var n=this._elementRef.nativeElement.validity;return n&&n.badInput},t.prototype._isTextarea=function(){var n=this._elementRef.nativeElement,t=this._platform.isBrowser?n.nodeName:n.name;return!!t&&"textarea"===t.toLowerCase()},Object.defineProperty(t.prototype,"empty",{get:function(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"shouldLabelFloat",{get:function(){return this.focused||!this.empty},enumerable:!0,configurable:!0}),t.prototype.setDescribedByIds=function(n){this._ariaDescribedby=n.join(" ")},t.prototype.onContainerClick=function(){this.focus()},t}(Ql(function(n,t,e,l){this._defaultErrorStateMatcher=n,this._parentForm=t,this._parentFormGroup=e,this.ngControl=l})),fu=function(){},_u=function(){},mu=function(){},gu=function(){},yu=function(){},bu=function(n){function t(t){var e=n.call(this)||this;return e._elementRef=t,e._hovered=new yl.a,e._highlighted=!1,e._triggersSubmenu=!1,e}return Object(i.__extends)(t,n),t.prototype.focus=function(){this._getHostElement().focus()},t.prototype.ngOnDestroy=function(){this._hovered.complete()},t.prototype._getTabIndex=function(){return this.disabled?"-1":"0"},t.prototype._getHostElement=function(){return this._elementRef.nativeElement},t.prototype._checkDisabled=function(n){this.disabled&&(n.preventDefault(),n.stopPropagation())},t.prototype._emitHoverEvent=function(){this.disabled||this._hovered.next(this)},t.prototype.getLabel=function(){var n=this._elementRef.nativeElement,t="";if(n.childNodes)for(var e=n.childNodes.length,l=0;l')}(),this._xPosition=n,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"yPosition",{get:function(){return this._yPosition},set:function(n){"above"!==n&&"below"!==n&&function(){throw Error('y-position value must be either \'above\' or below\'.\n Example: ')}(),this._yPosition=n,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"overlapTrigger",{get:function(){return this._overlapTrigger},set:function(n){this._overlapTrigger=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"panelClass",{set:function(n){n&&n.length&&(this._classList=n.split(" ").reduce(function(n,t){return n[t]=!0,n},{}),this._elementRef.nativeElement.className="",this.setPositionClasses())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"classList",{get:function(){return this.panelClass},set:function(n){this.panelClass=n},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){var n=this;this._keyManager=new Er(this.items).withWrap().withTypeAhead(),this._tabSubscription=this._keyManager.tabOut.subscribe(function(){return n.close.emit("keydown")})},n.prototype.ngOnDestroy=function(){this._tabSubscription.unsubscribe(),this.closed.complete()},n.prototype._hovered=function(){var n=this;return this.items?this.items.changes.pipe(Ss(this.items),Object(Ri.a)(function(n){return Jr.a.apply(void 0,n.map(function(n){return n._hovered}))})):this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1),Object(Ri.a)(function(){return n._hovered()}))},n.prototype._handleKeydown=function(n){switch(n.keyCode){case 27:this.closed.emit("keydown"),n.stopPropagation();break;case 37:this.parentMenu&&"ltr"===this.direction&&this.closed.emit("keydown");break;case 39:this.parentMenu&&"rtl"===this.direction&&this.closed.emit("keydown");break;default:this._keyManager.onKeydown(n)}},n.prototype.focusFirstItem=function(){this._keyManager.setFirstItemActive()},n.prototype.resetActiveItem=function(){this._keyManager.setActiveItem(-1)},n.prototype.setPositionClasses=function(n,t){void 0===n&&(n=this.xPosition),void 0===t&&(t=this.yPosition),this._classList["mat-menu-before"]="before"===n,this._classList["mat-menu-after"]="after"===n,this._classList["mat-menu-above"]="above"===t,this._classList["mat-menu-below"]="below"===t},n.prototype.setElevation=function(n){var t="mat-elevation-z"+(2+n),e=Object.keys(this._classList).find(function(n){return n.startsWith("mat-elevation-z")});e&&e!==this._previousElevation||(this._previousElevation&&(this._classList[this._previousElevation]=!1),this._classList[t]=!0,this._previousElevation=t)},n.prototype._startAnimation=function(){this._panelAnimationState="enter-start"},n.prototype._resetAnimation=function(){this._panelAnimationState="void"},n.prototype._onAnimationDone=function(n){"enter-start"===n.toState&&(this._panelAnimationState="enter")},n}(),xu=new l.r("mat-menu-scroll-strategy");function Mu(n){return function(){return n.scrollStrategies.reposition()}}var ku=function(){function n(n,t,e,r,i,o,s){this._overlay=n,this._element=t,this._viewContainerRef=e,this._scrollStrategy=r,this._parentMenu=i,this._menuItemInstance=o,this._dir=s,this._overlayRef=null,this._menuOpen=!1,this._closeSubscription=rl.a.EMPTY,this._positionSubscription=rl.a.EMPTY,this._hoverSubscription=rl.a.EMPTY,this._openedByMouse=!1,this.menuOpened=new l.o,this.onMenuOpen=this.menuOpened,this.menuClosed=new l.o,this.onMenuClose=this.menuClosed,o&&(o._triggersSubmenu=this.triggersSubmenu())}return Object.defineProperty(n.prototype,"_deprecatedMatMenuTriggerFor",{get:function(){return this.menu},set:function(n){this.menu=n},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){var n=this;this._checkMenu(),this.menu.close.subscribe(function(t){n._destroyMenu(),"click"===t&&n._parentMenu&&n._parentMenu.closed.emit(t)}),this.triggersSubmenu()&&(this._hoverSubscription=this._parentMenu._hovered().pipe(Ge(function(t){return t===n._menuItemInstance})).subscribe(function(){n._openedByMouse=!0,n.openMenu()}))},n.prototype.ngOnDestroy=function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._cleanUpSubscriptions()},Object.defineProperty(n.prototype,"menuOpen",{get:function(){return this._menuOpen},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"dir",{get:function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"},enumerable:!0,configurable:!0}),n.prototype.triggersSubmenu=function(){return!(!this._menuItemInstance||!this._parentMenu)},n.prototype.toggleMenu=function(){return this._menuOpen?this.closeMenu():this.openMenu()},n.prototype.openMenu=function(){var n=this;this._menuOpen||(this._createOverlay().attach(this._portal),this._closeSubscription=this._menuClosingActions().subscribe(function(){return n.closeMenu()}),this._initMenu(),this.menu instanceof wu&&this.menu._startAnimation())},n.prototype.closeMenu=function(){this.menu.close.emit()},n.prototype.focus=function(){this._element.nativeElement.focus()},n.prototype._destroyMenu=function(){this._overlayRef&&this.menuOpen&&(this._resetMenu(),this._closeSubscription.unsubscribe(),this._overlayRef.detach(),this.menu instanceof wu&&this.menu._resetAnimation())},n.prototype._initMenu=function(){if(this.menu.parentMenu=this.triggersSubmenu()?this._parentMenu:void 0,this.menu.direction=this.dir,this._setMenuElevation(),this._setIsMenuOpen(!0),this._openedByMouse){var n=this._overlayRef.overlayElement.firstElementChild;n&&(this.menu.resetActiveItem(),n.focus())}else this.menu.focusFirstItem()},n.prototype._setMenuElevation=function(){if(this.menu.setElevation){for(var n=0,t=this.menu.parentMenu;t;)n++,t=t.parentMenu;this.menu.setElevation(n)}},n.prototype._resetMenu=function(){this._setIsMenuOpen(!1),this._openedByMouse&&this.triggersSubmenu()||this.focus(),this._openedByMouse=!1},n.prototype._setIsMenuOpen=function(n){this._menuOpen=n,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this.triggersSubmenu()&&(this._menuItemInstance._highlighted=n)},n.prototype._checkMenu=function(){this.menu||function(){throw Error('mat-menu-trigger: must pass in an mat-menu instance.\n\n Example:\n \n ')}()},n.prototype._createOverlay=function(){if(!this._overlayRef){this._portal=new li(this.menu.templateRef,this._viewContainerRef);var n=this._getOverlayConfig();this._subscribeToPositions(n.positionStrategy),this._overlayRef=this._overlay.create(n)}return this._overlayRef},n.prototype._getOverlayConfig=function(){return new ci({positionStrategy:this._getPosition(),hasBackdrop:!this.triggersSubmenu(),backdropClass:"cdk-overlay-transparent-backdrop",direction:this.dir,scrollStrategy:this._scrollStrategy()})},n.prototype._subscribeToPositions=function(n){var t=this;this._positionSubscription=n.onPositionChange.subscribe(function(n){t.menu.setPositionClasses("start"===n.connectionPair.overlayX?"after":"before","top"===n.connectionPair.overlayY?"below":"above")})},n.prototype._getPosition=function(){var n="before"===this.menu.xPosition?["end","start"]:["start","end"],t=n[0],e=n[1],l="above"===this.menu.yPosition?["bottom","top"]:["top","bottom"],r=l[0],i=l[1],o=[r,i],s=o[0],a=o[1],u=[t,e],c=u[0],d=u[1],h=0;return this.triggersSubmenu()?(d=t="before"===this.menu.xPosition?"start":"end",e=c="end"===t?"start":"end",h="bottom"===r?8:-8):this.menu.overlapTrigger||(s="top"===r?"bottom":"top",a="top"===i?"bottom":"top"),this._overlay.position().connectedTo(this._element,{originX:t,originY:s},{overlayX:c,overlayY:r}).withDirection(this.dir).withOffsetY(h).withFallbackPosition({originX:e,originY:s},{overlayX:d,overlayY:r}).withFallbackPosition({originX:t,originY:a},{overlayX:c,overlayY:i},void 0,-h).withFallbackPosition({originX:e,originY:a},{overlayX:d,overlayY:i},void 0,-h)},n.prototype._cleanUpSubscriptions=function(){this._closeSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._hoverSubscription.unsubscribe()},n.prototype._menuClosingActions=function(){var n=this,t=this._overlayRef.backdropClick(),e=this._overlayRef.detachments(),l=this._parentMenu?this._parentMenu.close:Object(Fe.a)(),r=this._parentMenu?this._parentMenu._hovered().pipe(Ge(function(t){return t!==n._menuItemInstance}),Ge(function(){return n._menuOpen})):Object(Fe.a)();return Object(Jr.a)(t,l,r,e)},n.prototype._handleMousedown=function(n){(function(n){return 0===n.buttons})(n)||(this._openedByMouse=!0,this.triggersSubmenu()&&n.preventDefault())},n.prototype._handleKeydown=function(n){var t=n.keyCode;this.triggersSubmenu()&&(39===t&&"ltr"===this.dir||37===t&&"rtl"===this.dir)&&this.openMenu()},n.prototype._handleClick=function(n){this.triggersSubmenu()?(n.stopPropagation(),this.openMenu()):this.toggleMenu()},n}(),Cu=function(){},Su=0,Ou=new l.r("mat-select-scroll-strategy");function Tu(n){return function(){return n.scrollStrategies.reposition()}}var Lu=function(){},Pu=function(n){function t(t,e,r,i,o,s,a,u,c,d,h,p){var f=n.call(this,o,i,a,u,d)||this;return f._viewportRuler=t,f._changeDetectorRef=e,f._ngZone=r,f._dir=s,f._parentFormField=c,f.ngControl=d,f._scrollStrategyFactory=p,f._panelOpen=!1,f._required=!1,f._scrollTop=0,f._multiple=!1,f._compareWith=function(n,t){return n===t},f._uid="mat-select-"+Su++,f._destroy=new yl.a,f._triggerFontSize=0,f._onChange=function(){},f._onTouched=function(){},f._optionIds="",f._transformOrigin="top",f._panelDoneAnimating=!1,f._scrollStrategy=f._scrollStrategyFactory(),f._offsetY=0,f._positions=[{originX:"start",originY:"top",overlayX:"start",overlayY:"top"},{originX:"start",originY:"bottom",overlayX:"start",overlayY:"bottom"}],f.focused=!1,f.controlType="mat-select",f.ariaLabel="",f.optionSelectionChanges=ia(function(){return f.options?Jr.a.apply(void 0,f.options.map(function(n){return n.onSelectionChange})):f._ngZone.onStable.asObservable().pipe(Object(_r.a)(1),Object(Ri.a)(function(){return f.optionSelectionChanges}))}),f.openedChange=new l.o,f.onOpen=f._openedStream,f.onClose=f._closedStream,f.selectionChange=new l.o,f.change=f.selectionChange,f.valueChange=new l.o,f.ngControl&&(f.ngControl.valueAccessor=f),f.tabIndex=parseInt(h)||0,f.id=f.id,f}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"placeholder",{get:function(){return this._placeholder},set:function(n){this._placeholder=n,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"required",{get:function(){return this._required},set:function(n){this._required=El(n),this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"multiple",{get:function(){return this._multiple},set:function(n){if(this._selectionModel)throw Error("Cannot change `multiple` mode of select after initialization.");this._multiple=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"compareWith",{get:function(){return this._compareWith},set:function(n){if("function"!=typeof n)throw Error("`compareWith` must be a function.");this._compareWith=n,this._selectionModel&&this._initializeSelection()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return this._value},set:function(n){n!==this._value&&(this.writeValue(n),this._value=n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"id",{get:function(){return this._id},set:function(n){this._id=n||this._uid,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_openedStream",{get:function(){return this.openedChange.pipe(Ge(function(n){return n}),Object(Le.a)(function(){}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_closedStream",{get:function(){return this.openedChange.pipe(Ge(function(n){return!n}),Object(Le.a)(function(){}))},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){this._selectionModel=new zs(this.multiple,void 0,!1),this.stateChanges.next()},t.prototype.ngAfterContentInit=function(){var n=this;this._initKeyManager(),this.options.changes.pipe(Ss(null),au(this._destroy)).subscribe(function(){n._resetOptions(),n._initializeSelection()})},t.prototype.ngDoCheck=function(){this.ngControl&&this.updateErrorState()},t.prototype.ngOnChanges=function(n){n.disabled&&this.stateChanges.next()},t.prototype.ngOnDestroy=function(){this._destroy.next(),this._destroy.complete(),this.stateChanges.complete()},t.prototype.toggle=function(){this.panelOpen?this.close():this.open()},t.prototype.open=function(){var n=this;!this.disabled&&this.options&&this.options.length&&(this._triggerRect=this.trigger.nativeElement.getBoundingClientRect(),this._triggerFontSize=parseInt(getComputedStyle(this.trigger.nativeElement)["font-size"]),this._panelOpen=!0,this._calculateOverlayPosition(),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1)).subscribe(function(){n._triggerFontSize&&n.overlayDir.overlayRef&&n.overlayDir.overlayRef.overlayElement&&(n.overlayDir.overlayRef.overlayElement.style.fontSize=n._triggerFontSize+"px")}))},t.prototype.close=function(){this._panelOpen&&(this._panelOpen=!1,this._changeDetectorRef.markForCheck(),this._onTouched(),this.focus())},t.prototype.writeValue=function(n){this.options&&this._setSelectionByValue(n)},t.prototype.registerOnChange=function(n){this._onChange=n},t.prototype.registerOnTouched=function(n){this._onTouched=n},t.prototype.setDisabledState=function(n){this.disabled=n,this._changeDetectorRef.markForCheck(),this.stateChanges.next()},Object.defineProperty(t.prototype,"panelOpen",{get:function(){return this._panelOpen},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"selected",{get:function(){return this.multiple?this._selectionModel.selected:this._selectionModel.selected[0]},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"triggerValue",{get:function(){if(this.empty)return"";if(this._multiple){var n=this._selectionModel.selected.map(function(n){return n.viewValue});return this._isRtl()&&n.reverse(),n.join(", ")}return this._selectionModel.selected[0].viewValue},enumerable:!0,configurable:!0}),t.prototype._isRtl=function(){return!!this._dir&&"rtl"===this._dir.value},t.prototype._handleKeydown=function(n){this.disabled||(this.panelOpen?this._handleOpenKeydown(n):this._handleClosedKeydown(n))},t.prototype._handleClosedKeydown=function(n){var t=n.keyCode;13===t||32===t||(this.multiple||n.altKey)&&(40===t||38===t)?(n.preventDefault(),this.open()):this.multiple||this._keyManager.onKeydown(n)},t.prototype._handleOpenKeydown=function(n){var t=n.keyCode;if(36===t||35===t)n.preventDefault(),36===t?this._keyManager.setFirstItemActive():this._keyManager.setLastItemActive();else if(13!==t&&32!==t||!this._keyManager.activeItem){var e=40===t||38===t,l=this._keyManager.activeItemIndex;this._keyManager.onKeydown(n),this._multiple&&e&&n.shiftKey&&this._keyManager.activeItem&&this._keyManager.activeItemIndex!==l&&this._keyManager.activeItem._selectViaInteraction()}else n.preventDefault(),this._keyManager.activeItem._selectViaInteraction()},t.prototype._onPanelDone=function(){this.panelOpen?(this._scrollTop=0,this.openedChange.emit(!0)):(this.openedChange.emit(!1),this._panelDoneAnimating=!1,this.overlayDir.offsetX=0,this._changeDetectorRef.markForCheck())},t.prototype._onFadeInDone=function(){this._panelDoneAnimating=this.panelOpen,this._changeDetectorRef.markForCheck()},t.prototype._onFocus=function(){this.disabled||(this.focused=!0,this.stateChanges.next())},t.prototype._onBlur=function(){this.disabled||this.panelOpen||(this.focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())},t.prototype._onAttached=function(){var n=this;this.overlayDir.positionChange.pipe(Object(_r.a)(1)).subscribe(function(){n._changeDetectorRef.detectChanges(),n._calculateOverlayOffsetX(),n.panel.nativeElement.scrollTop=n._scrollTop})},t.prototype._getPanelTheme=function(){return this._parentFormField?"mat-"+this._parentFormField.color:""},Object.defineProperty(t.prototype,"empty",{get:function(){return!this._selectionModel||this._selectionModel.isEmpty()},enumerable:!0,configurable:!0}),t.prototype._initializeSelection=function(){var n=this;Promise.resolve().then(function(){n._setSelectionByValue(n.ngControl?n.ngControl.value:n._value)})},t.prototype._setSelectionByValue=function(n,t){var e=this;if(void 0===t&&(t=!1),this.multiple&&n){if(!Array.isArray(n))throw Error("Value must be an array in multiple-selection mode.");this._clearSelection(),n.forEach(function(n){return e._selectValue(n,t)}),this._sortValues()}else{this._clearSelection();var l=this._selectValue(n,t);l&&this._keyManager.setActiveItem(this.options.toArray().indexOf(l))}this._changeDetectorRef.markForCheck()},t.prototype._selectValue=function(n,t){var e=this;void 0===t&&(t=!1);var r=this.options.find(function(t){try{return null!=t.value&&e._compareWith(t.value,n)}catch(n){return Object(l.Y)()&&console.warn(n),!1}});return r&&(t?r._selectViaInteraction():r.select(),this._selectionModel.select(r),this.stateChanges.next()),r},t.prototype._clearSelection=function(n){this._selectionModel.clear(),this.options.forEach(function(t){t!==n&&t.deselect()}),this.stateChanges.next()},t.prototype._initKeyManager=function(){var n=this;this._keyManager=new Sr(this.options).withTypeAhead(),this._keyManager.tabOut.pipe(au(this._destroy)).subscribe(function(){return n.close()}),this._keyManager.change.pipe(au(this._destroy)).subscribe(function(){n._panelOpen&&n.panel?n._scrollActiveOptionIntoView():n._panelOpen||n.multiple||!n._keyManager.activeItem||n._keyManager.activeItem._selectViaInteraction()})},t.prototype._resetOptions=function(){var n=this;this.optionSelectionChanges.pipe(au(Object(Jr.a)(this._destroy,this.options.changes)),Ge(function(n){return n.isUserInput})).subscribe(function(t){n._onSelect(t.source),n.multiple||n.close()}),this._setOptionIds()},t.prototype._onSelect=function(n){var t=this._selectionModel.isSelected(n);this.multiple?(this._selectionModel.toggle(n),this.stateChanges.next(),t?n.deselect():n.select(),this._keyManager.setActiveItem(this._getOptionIndex(n)),this._sortValues()):(this._clearSelection(null==n.value?void 0:n),null==n.value?this._propagateChanges(n.value):(this._selectionModel.select(n),this.stateChanges.next())),t!==this._selectionModel.isSelected(n)&&this._propagateChanges()},t.prototype._sortValues=function(){var n=this;this._multiple&&(this._selectionModel.clear(),this.options.forEach(function(t){t.selected&&n._selectionModel.select(t)}),this.stateChanges.next())},t.prototype._propagateChanges=function(n){var t;t=this.multiple?this.selected.map(function(n){return n.value}):this.selected?this.selected.value:n,this._value=t,this.valueChange.emit(t),this._onChange(t),this.selectionChange.emit(new function(n,t){this.source=n,this.value=t}(this,t)),this._changeDetectorRef.markForCheck()},t.prototype._setOptionIds=function(){this._optionIds=this.options.map(function(n){return n.id}).join(" ")},t.prototype._highlightCorrectOption=function(){this._keyManager&&(this.empty?this._keyManager.setFirstItemActive():this._keyManager.setActiveItem(this._getOptionIndex(this._selectionModel.selected[0])))},t.prototype._scrollActiveOptionIntoView=function(){var n=this._getItemHeight(),t=this._keyManager.activeItemIndex||0,e=(t+pr.countGroupLabelsBeforeOption(t,this.options,this.optionGroups))*n,l=this.panel.nativeElement.scrollTop;el+256&&(this.panel.nativeElement.scrollTop=Math.max(0,e-256+n))},t.prototype.focus=function(){this._elementRef.nativeElement.focus()},t.prototype._getOptionIndex=function(n){return this.options.reduce(function(t,e,l){return void 0===t?n===e?l:void 0:t},void 0)},t.prototype._calculateOverlayPosition=function(){var n=this._getItemHeight(),t=this._getItemCount(),e=Math.min(t*n,256),l=t*n-e,r=this.empty?0:this._getOptionIndex(this._selectionModel.selected[0]);r+=pr.countGroupLabelsBeforeOption(r,this.options,this.optionGroups);var i=e/2;this._scrollTop=this._calculateOverlayScroll(r,i,l),this._offsetY=this._calculateOverlayOffsetY(r,i,l),this._checkOverlayWithinViewport(l)},t.prototype._calculateOverlayScroll=function(n,t,e){var l=this._getItemHeight();return Math.min(Math.max(0,l*n-t+l/2),e)},Object.defineProperty(t.prototype,"_ariaLabel",{get:function(){return this.ariaLabelledby?null:this.ariaLabel||this.placeholder},enumerable:!0,configurable:!0}),t.prototype._getAriaActiveDescendant=function(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null},t.prototype._calculateOverlayOffsetX=function(){var n,t=this.overlayDir.overlayRef.overlayElement.getBoundingClientRect(),e=this._viewportRuler.getViewportSize(),l=this._isRtl(),r=this.multiple?60:32;if(this.multiple)n=44;else{var i=this._selectionModel.selected[0]||this.options.first;n=i&&i.group?32:16}l||(n*=-1);var o=0-(t.left+n-(l?r:0)),s=t.right+n-e.width+(l?0:r);o>0?n+=o+8:s>0&&(n-=s+8),this.overlayDir.offsetX=n,this.overlayDir.overlayRef.updatePosition()},t.prototype._calculateOverlayOffsetY=function(n,t,e){var l=this._getItemHeight(),r=(l-this._triggerRect.height)/2,i=Math.floor(256/l);return-1*(0===this._scrollTop?n*l:this._scrollTop===e?(n-(this._getItemCount()-i))*l+(l-(this._getItemCount()*l-256)%l):t-l/2)-r},t.prototype._checkOverlayWithinViewport=function(n){var t=this._getItemHeight(),e=this._viewportRuler.getViewportSize(),l=this._triggerRect.top-8,r=e.height-this._triggerRect.bottom-8,i=Math.abs(this._offsetY),o=Math.min(this._getItemCount()*t,256)-i-this._triggerRect.height;o>r?this._adjustPanelUp(o,r):i>l?this._adjustPanelDown(i,l,n):this._transformOrigin=this._getOriginBasedOnOption()},t.prototype._adjustPanelUp=function(n,t){var e=Math.round(n-t);this._scrollTop-=e,this._offsetY-=e,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop<=0&&(this._scrollTop=0,this._offsetY=0,this._transformOrigin="50% bottom 0px")},t.prototype._adjustPanelDown=function(n,t,e){var l=Math.round(n-t);if(this._scrollTop+=l,this._offsetY+=l,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop>=e)return this._scrollTop=e,this._offsetY=0,void(this._transformOrigin="50% top 0px")},t.prototype._getOriginBasedOnOption=function(){var n=this._getItemHeight(),t=(n-this._triggerRect.height)/2;return"50% "+(Math.abs(this._offsetY)-t+n/2)+"px 0px"},t.prototype._getItemCount=function(){return this.options.length+this.optionGroups.length},t.prototype._getItemHeight=function(){return 3*this._triggerFontSize},t.prototype.setDescribedByIds=function(n){this._ariaDescribedby=n.join(" ")},t.prototype.onContainerClick=function(){this.focus(),this.open()},Object.defineProperty(t.prototype,"shouldLabelFloat",{get:function(){return this._panelOpen||!this.empty},enumerable:!0,configurable:!0}),t}(ql(Jl(Ul(Ql(function(n,t,e,l,r){this._elementRef=n,this._defaultErrorStateMatcher=t,this._parentForm=e,this._parentFormGroup=l,this.ngControl=r}))))),Du=function(){},Au=20;function Eu(n){return Error('Tooltip position "'+n+'" is invalid.')}var Yu=new l.r("mat-tooltip-scroll-strategy");function ju(n){return function(){return n.scrollStrategies.reposition({scrollThrottle:Au})}}var Iu=function(){function n(n,t,e,l,r,i,o,s,a,u){var c=this;this._overlay=n,this._elementRef=t,this._scrollDispatcher=e,this._viewContainerRef=l,this._ngZone=r,this._platform=i,this._ariaDescriber=o,this._focusMonitor=s,this._scrollStrategy=a,this._dir=u,this._position="below",this._disabled=!1,this.showDelay=0,this.hideDelay=0,this._message="",this._manualListeners=new Map;var d=t.nativeElement;i.IOS?"INPUT"!==d.nodeName&&"TEXTAREA"!==d.nodeName||(d.style.webkitUserSelect=d.style.userSelect=""):(this._manualListeners.set("mouseenter",function(){return c.show()}),this._manualListeners.set("mouseleave",function(){return c.hide()}),this._manualListeners.forEach(function(n,e){return t.nativeElement.addEventListener(e,n)})),s.monitor(d,!1).subscribe(function(n){n?"program"!==n&&r.run(function(){return c.show()}):r.run(function(){return c.hide(0)})})}return Object.defineProperty(n.prototype,"position",{get:function(){return this._position},set:function(n){n!==this._position&&(this._position=n,this._tooltipInstance&&this._disposeTooltip())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"disabled",{get:function(){return this._disabled},set:function(n){this._disabled=El(n),this._disabled&&this.hide(0)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_positionDeprecated",{get:function(){return this._position},set:function(n){this._position=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"message",{get:function(){return this._message},set:function(n){this._ariaDescriber.removeDescription(this._elementRef.nativeElement,this._message),this._message=null!=n?(""+n).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._updateTooltipMessage(),this._ariaDescriber.describe(this._elementRef.nativeElement,this.message))},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"tooltipClass",{get:function(){return this._tooltipClass},set:function(n){this._tooltipClass=n,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)},enumerable:!0,configurable:!0}),n.prototype.ngOnDestroy=function(){var n=this;this._tooltipInstance&&this._disposeTooltip(),this._platform.IOS||(this._manualListeners.forEach(function(t,e){n._elementRef.nativeElement.removeEventListener(e,t)}),this._manualListeners.clear()),this._ariaDescriber.removeDescription(this._elementRef.nativeElement,this.message),this._focusMonitor.stopMonitoring(this._elementRef.nativeElement)},n.prototype.show=function(n){void 0===n&&(n=this.showDelay),!this.disabled&&this.message&&(this._tooltipInstance||this._createTooltip(),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),this._tooltipInstance.show(this._position,n))},n.prototype.hide=function(n){void 0===n&&(n=this.hideDelay),this._tooltipInstance&&this._tooltipInstance.hide(n)},n.prototype.toggle=function(){this._isTooltipVisible()?this.hide():this.show()},n.prototype._isTooltipVisible=function(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()},n.prototype._handleKeydown=function(n){this._isTooltipVisible()&&27===n.keyCode&&(n.stopPropagation(),this.hide(0))},n.prototype._createTooltip=function(){var n=this,t=this._createOverlay(),e=new ei(Ru,this._viewContainerRef);this._tooltipInstance=t.attach(e).instance,Object(Jr.a)(this._tooltipInstance.afterHidden(),t.detachments()).subscribe(function(){n._tooltipInstance&&n._disposeTooltip()})},n.prototype._createOverlay=function(){var n=this,t=this._getOrigin(),e=this._getOverlayPosition(),l=this._overlay.position().connectedTo(this._elementRef,t.main,e.main).withFallbackPosition(t.fallback,e.fallback),r=this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);l.withScrollableContainers(r),l.onPositionChange.subscribe(function(t){n._tooltipInstance&&(t.scrollableViewProperties.isOverlayClipped&&n._tooltipInstance.isVisible()?n._ngZone.run(function(){return n.hide(0)}):n._tooltipInstance._setTransformOrigin(t.connectionPair))});var i=new ci({direction:this._dir?this._dir.value:"ltr",positionStrategy:l,panelClass:"mat-tooltip-panel",scrollStrategy:this._scrollStrategy()});return this._overlayRef=this._overlay.create(i),this._overlayRef},n.prototype._disposeTooltip=function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._tooltipInstance=null},n.prototype._getOrigin=function(){var n,t=!this._dir||"ltr"==this._dir.value;if("above"==this.position||"below"==this.position)n={originX:"center",originY:"above"==this.position?"top":"bottom"};else if("left"==this.position||"before"==this.position&&t||"after"==this.position&&!t)n={originX:"start",originY:"center"};else{if(!("right"==this.position||"after"==this.position&&t||"before"==this.position&&!t))throw Eu(this.position);n={originX:"end",originY:"center"}}var e=this._invertPosition(n.originX,n.originY);return{main:n,fallback:{originX:e.x,originY:e.y}}},n.prototype._getOverlayPosition=function(){var n,t=!this._dir||"ltr"==this._dir.value;if("above"==this.position)n={overlayX:"center",overlayY:"bottom"};else if("below"==this.position)n={overlayX:"center",overlayY:"top"};else if("left"==this.position||"before"==this.position&&t||"after"==this.position&&!t)n={overlayX:"end",overlayY:"center"};else{if(!("right"==this.position||"after"==this.position&&t||"before"==this.position&&!t))throw Eu(this.position);n={overlayX:"start",overlayY:"center"}}var e=this._invertPosition(n.overlayX,n.overlayY);return{main:n,fallback:{overlayX:e.x,overlayY:e.y}}},n.prototype._updateTooltipMessage=function(){var n=this;this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),this._ngZone.onMicrotaskEmpty.asObservable().pipe(Object(_r.a)(1)).subscribe(function(){n._tooltipInstance&&n._overlayRef.updatePosition()}))},n.prototype._setTooltipClass=function(n){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=n,this._tooltipInstance._markForCheck())},n.prototype._invertPosition=function(n,t){return"above"===this.position||"below"===this.position?"top"===t?t="bottom":"bottom"===t&&(t="top"):"end"===n?n="start":"start"===n&&(n="end"),{x:n,y:t}},n}(),Ru=function(){function n(n){this._changeDetectorRef=n,this._visibility="initial",this._closeOnInteraction=!1,this._transformOrigin="bottom",this._onHide=new yl.a}return n.prototype.show=function(n,t){var e=this;this._hideTimeoutId&&clearTimeout(this._hideTimeoutId),this._closeOnInteraction=!0,this._position=n,this._showTimeoutId=setTimeout(function(){e._visibility="visible",e._markForCheck()},t)},n.prototype.hide=function(n){var t=this;this._showTimeoutId&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(function(){t._visibility="hidden",t._markForCheck()},n)},n.prototype.afterHidden=function(){return this._onHide.asObservable()},n.prototype.isVisible=function(){return"visible"===this._visibility},n.prototype._setTransformOrigin=function(n){var t="X"==("above"===this._position||"below"===this._position?"Y":"X")?n.overlayX:n.overlayY;if("top"===t||"bottom"===t)this._transformOrigin=t;else if("start"===t)this._transformOrigin="left";else{if("end"!==t)throw Eu(this._position);this._transformOrigin="right"}},n.prototype._animationStart=function(){this._closeOnInteraction=!1},n.prototype._animationDone=function(n){var t=this,e=n.toState;"hidden"!==e||this.isVisible()||this._onHide.next(),"visible"!==e&&"hidden"!==e||Promise.resolve().then(function(){return t._closeOnInteraction=!0})},n.prototype._handleBodyInteraction=function(){this._closeOnInteraction&&this.hide(0)},n.prototype._markForCheck=function(){this._changeDetectorRef.markForCheck()},n}(),Hu=function(){},Nu=function(){function n(){this.color="primary",this._value=0,this._bufferValue=0,this.mode="determinate"}return Object.defineProperty(n.prototype,"value",{get:function(){return this._value},set:function(n){this._value=Fu(n||0)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"bufferValue",{get:function(){return this._bufferValue},set:function(n){this._bufferValue=Fu(n||0)},enumerable:!0,configurable:!0}),n.prototype._primaryTransform=function(){return{transform:"scaleX("+this.value/100+")"}},n.prototype._bufferTransform=function(){if("buffer"==this.mode)return{transform:"scaleX("+this.bufferValue/100+")"}},n}();function Fu(n,t,e){return void 0===t&&(t=0),void 0===e&&(e=100),Math.max(t,Math.min(e,n))}var Bu=function(){},Vu=100,Wu=function(n){function t(t,e,l){var r=n.call(this,t,e,l)||this;return r.mode="indeterminate",r}return Object(i.__extends)(t,n),t}(function(n){function t(t,e,l){var r=n.call(this,t)||this;return r._elementRef=t,r._document=l,r._value=0,r._fallbackAnimation=!1,r._elementSize=Vu,r._diameter=Vu,r.mode="determinate",r._fallbackAnimation=e.EDGE||e.TRIDENT,t.nativeElement.classList.add("mat-progress-spinner-indeterminate"+(r._fallbackAnimation?"-fallback":"")+"-animation"),r}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"diameter",{get:function(){return this._diameter},set:function(n){this._diameter=Yl(n),this._fallbackAnimation||t.diameters.has(this._diameter)||this._attachStyleNode()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"strokeWidth",{get:function(){return this._strokeWidth||this.diameter/10},set:function(n){this._strokeWidth=Yl(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return"determinate"===this.mode?this._value:0},set:function(n){this._value=Math.max(0,Math.min(100,Yl(n)))},enumerable:!0,configurable:!0}),t.prototype.ngOnChanges=function(n){(n.strokeWidth||n.diameter)&&(this._elementSize=this._diameter+Math.max(this.strokeWidth-10,0))},Object.defineProperty(t.prototype,"_circleRadius",{get:function(){return(this.diameter-10)/2},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_viewBox",{get:function(){var n=2*this._circleRadius+this.strokeWidth;return"0 0 "+n+" "+n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_strokeCircumference",{get:function(){return 2*Math.PI*this._circleRadius},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_strokeDashOffset",{get:function(){return"determinate"===this.mode?this._strokeCircumference*(100-this._value)/100:this._fallbackAnimation&&"indeterminate"===this.mode?.2*this._strokeCircumference:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_circleStrokeWidth",{get:function(){return this.strokeWidth/this._elementSize*100},enumerable:!0,configurable:!0}),t.prototype._attachStyleNode=function(){var n=t.styleTag;n||(n=this._document.createElement("style"),this._document.head.appendChild(n),t.styleTag=n),n&&n.sheet&&n.sheet.insertRule(this._getAnimationText(),0),t.diameters.add(this.diameter)},t.prototype._getAnimationText=function(){return"\n @keyframes mat-progress-spinner-stroke-rotate-DIAMETER {\n 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }\n 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }\n 12.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n\n 25.1% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }\n 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }\n 37.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n\n 50.01% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }\n 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }\n 62.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n\n 75.01% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }\n 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }\n 87.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n }\n".replace(/START_VALUE/g,""+.95*this._strokeCircumference).replace(/END_VALUE/g,""+.2*this._strokeCircumference).replace(/DIAMETER/g,""+this.diameter)},t.diameters=new Set([Vu]),t.styleTag=null,t}(Gl(function(n){this._elementRef=n},"primary"))),zu=function(){},Uu=function(n){function t(t,e,r,i,o){var s=n.call(this,t)||this;return s._focusMonitor=e,s._changeDetectorRef=r,s._dir=i,s._invert=!1,s._max=100,s._min=0,s._step=1,s._thumbLabel=!1,s._tickInterval=0,s._value=null,s._vertical=!1,s.change=new l.o,s.input=new l.o,s.onTouched=function(){},s._percent=0,s._isSliding=!1,s._isActive=!1,s._tickIntervalPercent=0,s._sliderDimensions=null,s._controlValueAccessorChangeFn=function(){},s._dirChangeSubscription=rl.a.EMPTY,s.tabIndex=parseInt(o)||0,s}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"invert",{get:function(){return this._invert},set:function(n){this._invert=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"max",{get:function(){return this._max},set:function(n){this._max=Yl(n,this._max),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"min",{get:function(){return this._min},set:function(n){this._min=Yl(n,this._min),null===this._value&&(this.value=this._min),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"step",{get:function(){return this._step},set:function(n){this._step=Yl(n,this._step),this._step%1!=0&&(this._roundLabelTo=this._step.toString().split(".").pop().length),this._changeDetectorRef.markForCheck()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"thumbLabel",{get:function(){return this._thumbLabel},set:function(n){this._thumbLabel=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_thumbLabelDeprecated",{get:function(){return this._thumbLabel},set:function(n){this._thumbLabel=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"tickInterval",{get:function(){return this._tickInterval},set:function(n){this._tickInterval="auto"===n?"auto":"number"==typeof n||"string"==typeof n?Yl(n,this._tickInterval):0},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_tickIntervalDeprecated",{get:function(){return this.tickInterval},set:function(n){this.tickInterval=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return null===this._value&&(this.value=this._min),this._value},set:function(n){n!==this._value&&(this._value=Yl(n,this._value||0),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"vertical",{get:function(){return this._vertical},set:function(n){this._vertical=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"displayValue",{get:function(){return this._roundLabelTo&&this.value&&this.value%1!=0?this.value.toFixed(this._roundLabelTo):this.value||0},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"percent",{get:function(){return this._clamp(this._percent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_invertAxis",{get:function(){return this.vertical?!this.invert:this.invert},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_isMinValue",{get:function(){return 0===this.percent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_thumbGap",{get:function(){return this.disabled?7:this._isMinValue&&!this.thumbLabel?this._isActive?10:7:0},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_trackBackgroundStyles",{get:function(){var n=this.vertical?"Y":"X";return{transform:"translate"+n+"("+(this._invertMouseCoords?"-":"")+this._thumbGap+"px) scale"+n+"("+(1-this.percent)+")"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_trackFillStyles",{get:function(){var n=this.vertical?"Y":"X";return{transform:"translate"+n+"("+(this._invertMouseCoords?"":"-")+this._thumbGap+"px) scale"+n+"("+this.percent+")"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_ticksContainerStyles",{get:function(){return{transform:"translate"+(this.vertical?"Y":"X")+"("+(this.vertical||"rtl"!=this._direction?"-":"")+this._tickIntervalPercent/2*100+"%)"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_ticksStyles",{get:function(){var n=100*this._tickIntervalPercent,t={backgroundSize:this.vertical?"2px "+n+"%":n+"% 2px",transform:"translateZ(0) translate"+(this.vertical?"Y":"X")+"("+(this.vertical||"rtl"!=this._direction?"":"-")+n/2+"%)"+(this.vertical||"rtl"!=this._direction?"":" rotate(180deg)")};return this._isMinValue&&this._thumbGap&&(t["padding"+(this.vertical?this._invertAxis?"Bottom":"Top":this._invertAxis?"Right":"Left")]=this._thumbGap+"px"),t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_thumbContainerStyles",{get:function(){return{transform:"translate"+(this.vertical?"Y":"X")+"(-"+100*(("rtl"!=this._direction||this.vertical?this._invertAxis:!this._invertAxis)?this.percent:1-this.percent)+"%)"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_invertMouseCoords",{get:function(){return"rtl"!=this._direction||this.vertical?this._invertAxis:!this._invertAxis},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_direction",{get:function(){return this._dir&&"rtl"==this._dir.value?"rtl":"ltr"},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){var n=this;this._focusMonitor.monitor(this._elementRef.nativeElement,!0).subscribe(function(t){n._isActive=!!t&&"keyboard"!==t,n._changeDetectorRef.detectChanges()}),this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(function(){n._changeDetectorRef.markForCheck()}))},t.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._elementRef.nativeElement),this._dirChangeSubscription.unsubscribe()},t.prototype._onMouseenter=function(){this.disabled||(this._sliderDimensions=this._getSliderDimensions(),this._updateTickIntervalPercent())},t.prototype._onClick=function(n){if(!this.disabled){var t=this.value;this._isSliding=!1,this._focusHostElement(),this._updateValueFromPosition({x:n.clientX,y:n.clientY}),t!=this.value&&(this._emitInputEvent(),this._emitChangeEvent())}},t.prototype._onSlide=function(n){if(!this.disabled){this._isSliding||this._onSlideStart(null),n.preventDefault();var t=this.value;this._updateValueFromPosition({x:n.center.x,y:n.center.y}),t!=this.value&&this._emitInputEvent()}},t.prototype._onSlideStart=function(n){this.disabled||this._isSliding||(this._onMouseenter(),this._isSliding=!0,this._focusHostElement(),this._valueOnSlideStart=this.value,n&&(this._updateValueFromPosition({x:n.center.x,y:n.center.y}),n.preventDefault()))},t.prototype._onSlideEnd=function(){this._isSliding=!1,this._valueOnSlideStart!=this.value&&this._emitChangeEvent(),this._valueOnSlideStart=null},t.prototype._onFocus=function(){this._sliderDimensions=this._getSliderDimensions(),this._updateTickIntervalPercent()},t.prototype._onBlur=function(){this.onTouched()},t.prototype._onKeydown=function(n){if(!this.disabled){var t=this.value;switch(n.keyCode){case 33:this._increment(10);break;case 34:this._increment(-10);break;case 35:this.value=this.max;break;case 36:this.value=this.min;break;case 37:this._increment("rtl"==this._direction?1:-1);break;case 38:this._increment(1);break;case 39:this._increment("rtl"==this._direction?-1:1);break;case 40:this._increment(-1);break;default:return}t!=this.value&&(this._emitInputEvent(),this._emitChangeEvent()),this._isSliding=!0,n.preventDefault()}},t.prototype._onKeyup=function(){this._isSliding=!1},t.prototype._increment=function(n){this.value=this._clamp((this.value||0)+this.step*n,this.min,this.max)},t.prototype._updateValueFromPosition=function(n){if(this._sliderDimensions){var t=this._clamp(((this.vertical?n.y:n.x)-(this.vertical?this._sliderDimensions.top:this._sliderDimensions.left))/(this.vertical?this._sliderDimensions.height:this._sliderDimensions.width));this._invertMouseCoords&&(t=1-t);var e=this._calculateValue(t),l=Math.round((e-this.min)/this.step)*this.step+this.min;this.value=this._clamp(l,this.min,this.max)}},t.prototype._emitChangeEvent=function(){this._controlValueAccessorChangeFn(this.value),this.change.emit(this._createChangeEvent())},t.prototype._emitInputEvent=function(){this.input.emit(this._createChangeEvent())},t.prototype._updateTickIntervalPercent=function(){if(this.tickInterval&&this._sliderDimensions)if("auto"==this.tickInterval){var n=this.vertical?this._sliderDimensions.height:this._sliderDimensions.width,t=Math.ceil(30/(n*this.step/(this.max-this.min)));this._tickIntervalPercent=t*this.step/n}else this._tickIntervalPercent=this.tickInterval*this.step/(this.max-this.min)},t.prototype._createChangeEvent=function(n){void 0===n&&(n=this.value);var t=new function(){};return t.source=this,t.value=n,t},t.prototype._calculatePercentage=function(n){return((n||0)-this.min)/(this.max-this.min)},t.prototype._calculateValue=function(n){return this.min+n*(this.max-this.min)},t.prototype._clamp=function(n,t,e){return void 0===t&&(t=0),void 0===e&&(e=1),Math.max(t,Math.min(n,e))},t.prototype._getSliderDimensions=function(){return this._sliderWrapper?this._sliderWrapper.nativeElement.getBoundingClientRect():null},t.prototype._focusHostElement=function(){this._elementRef.nativeElement.focus()},t.prototype.writeValue=function(n){this.value=n},t.prototype.registerOnChange=function(n){this._controlValueAccessorChangeFn=n},t.prototype.registerOnTouched=function(n){this.onTouched=n},t.prototype.setDisabledState=function(n){this.disabled=n},t}(Jl(Gl(Ul(function(n){this._elementRef=n}),"accent"))),Gu=function(){},qu=function(){},Ju=function(n){function t(t,e){var l=n.call(this,t)||this;return l._platform=e,l}return Object(i.__extends)(t,n),t.prototype.ngAfterViewInit=function(){var n=this;Object(l.Y)()&&this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe(function(){return n._checkToolbarMixedModes()}))},t.prototype._checkToolbarMixedModes=function(){this._toolbarRows.length&&[].slice.call(this._elementRef.nativeElement.childNodes).filter(function(n){return!(n.classList&&n.classList.contains("mat-toolbar-row"))}).filter(function(n){return n.nodeType!==Node.COMMENT_NODE}).some(function(n){return n.textContent.trim()})&&function(){throw Error("MatToolbar: Attempting to combine different toolbar modes. Either specify multiple `` elements explicitly or just place content inside of a `` for a single row.")}()},t}(Gl(function(n){this._elementRef=n})),Qu=function(){},Ku=function(n){return n[n.RequestingCurrentPin=0]="RequestingCurrentPin",n[n.RequestingNewPin=1]="RequestingNewPin",n[n.ConfirmingNewPin=2]="ConfirmingNewPin",n}({}),Xu=function(){function n(n){this.dialog=n}return Object.defineProperty(n.prototype,"requestPinComponent",{set:function(n){this.requestPinComponentInternal=n},enumerable:!0,configurable:!0}),n.prototype.resetValues=function(){this.changingPin=!1,this.signingTx=!1},n.prototype.requestPin=function(){var n=this;return this.dialog.open(this.requestPinComponentInternal,{width:"350px",autoFocus:!1,data:{changingPin:this.changingPin,changePinState:this.changePinState,signingTx:this.signingTx}}).afterClosed().map(function(t){return n.changingPin&&(n.changePinState===Ku.RequestingCurrentPin?n.changePinState=Ku.RequestingNewPin:n.changePinState===Ku.RequestingNewPin&&(n.changePinState=Ku.ConfirmingNewPin)),t})},n}(),Zu=function(){function n(n){this.dialog=n}return Object.defineProperty(n.prototype,"requestWordComponent",{set:function(n){this.requestWordComponentInternal=n},enumerable:!0,configurable:!0}),n.prototype.requestWord=function(){return this.dialog.open(this.requestWordComponentInternal,{width:"350px",data:{isForHwWallet:!0,wordNumber:0,restoringSoftwareWallet:!1}}).afterClosed().map(function(n){return n})},n}(),$u=function(n){function t(){var t=n.call(this,"Timeout has occurred");this.name=t.name="TimeoutError",this.stack=t.stack,this.message=t.message}return Object(i.__extends)(t,n),t}(Error),nc=function(){function n(n,t,e,l){this.waitFor=n,this.absoluteTimeout=t,this.scheduler=e,this.errorInstance=l}return n.prototype.call=function(n,t){return t.subscribe(new tc(n,this.absoluteTimeout,this.waitFor,this.scheduler,this.errorInstance))},n}(),tc=function(n){function t(t,e,l,r,i){n.call(this,t),this.absoluteTimeout=e,this.waitFor=l,this.scheduler=r,this.errorInstance=i,this.action=null,this.scheduleTimeout()}return Object(i.__extends)(t,n),t.dispatchTimeout=function(n){n.error(n.errorInstance)},t.prototype.scheduleTimeout=function(){var n=this.action;n?this.action=n.schedule(this,this.waitFor):this.add(this.action=this.scheduler.schedule(t.dispatchTimeout,this.waitFor,this))},t.prototype._next=function(t){this.absoluteTimeout||this.scheduleTimeout(),n.prototype._next.call(this,t)},t.prototype._unsubscribe=function(){this.action=null,this.scheduler=null,this.errorInstance=null},t}(Be.a);o.a.prototype.timeout=function(n,t){return void 0===t&&(t=sl),function(n,t){void 0===t&&(t=sl);var e=ul(n),l=e?+n-t.now():Math.abs(n);return function(n){return n.lift(new nc(l,e,t,new $u))}}(n,t)(this)};var ec,lc=function(){function n(n,t,e,l,r){this.http=n,this.apiService=t,this.hwWalletPinService=e,this.hwWalletSeedWordService=l,this.ngZone=r,this.url="http://127.0.0.1:9510/api/v1",this.hwConnected=!1,this.connectionEventSubject=new Tl(!1),this.disconnectedChecks=0,this.maxFastDisconnectedChecks=32}return Object.defineProperty(n.prototype,"connectionEvent",{get:function(){return this.connectionEventSubject.asObservable()},enumerable:!0,configurable:!0}),n.prototype.get=function(n){return this.checkResponse(this.http.get(this.url+n,this.returnRequestOptions()),n.includes("/available"))},n.prototype.post=function(n,t){return void 0===t&&(t={}),this.checkResponse(this.http.post(this.url+n,JSON.stringify(t),this.returnRequestOptions()))},n.prototype.put=function(n,t,e,l){return void 0===t&&(t=null),void 0===e&&(e=!1),void 0===l&&(l=!1),this.checkResponse(this.http.put(this.url+n,t,this.returnRequestOptions(e)),!1,l)},n.prototype.delete=function(n){return this.checkResponse(this.http.delete(this.url+n,this.returnRequestOptions()))},n.prototype.checkResponse=function(t,e,l){var r=this;return void 0===e&&(e=!1),void 0===l&&(l=!1),t.timeout(l?3e4:55e3).flatMap(function(t){var l=t.json();return l.data&&l.data.length&&(l.data=1===l.data.length?l.data[0]:l.data),e?r.ngZone.run(function(){return r.updateHwConnected(!!l.data)}):r.updateHwConnected(!0),"string"==typeof l.data&&-1!==l.data.indexOf("PinMatrixRequest")?r.hwWalletPinService.requestPin().flatMap(function(t){return t?r.post("/intermediate/pin_matrix",{pin:t}):r.put("/cancel").map(function(){return n.errorCancelled})}):"string"==typeof l.data&&-1!==l.data.indexOf("WordRequest")?r.hwWalletSeedWordService.requestWord().flatMap(function(t){return t?r.post("/intermediate/word",{word:t}):r.put("/cancel").map(function(){return n.errorCancelled})}):"string"==typeof l.data&&-1!==l.data.indexOf("ButtonRequest")?r.post("/intermediate/button"):o.a.of(l)}).catch(function(t){if(t&&t.name&&"TimeoutError"===t.name)return r.put("/cancel").subscribe(),o.a.throw({_body:n.errorTimeout});if(t&&t._body){var e=void 0;if("string"==typeof t._body)e=t._body;else if(t._body.error)e=t._body.error;else try{e=JSON.parse(t._body).error}catch(n){}if(e)return r.apiService.processConnectionError({_body:e},!0)}return o.a.throw({_body:n.errorConnectingWithTheDaemon})})},n.prototype.returnRequestOptions=function(n){void 0===n&&(n=!1);var t=new ae;return t.headers=new qt,n||t.headers.append("Content-Type","application/json"),t},n.prototype.checkHw=function(n){var t=this;this.checkHwSubscription&&this.checkHwSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){t.checkHwSubscription=o.a.of(1).delay(n?t.hwConnected||t.disconnectedChecksthis.total&&this.destination.next(n)},t}(Be.a);e("lAP5"),e("T1Dh");var vc=function(){function n(n){this.predicate=n}return n.prototype.call=function(n,t){return t.subscribe(new wc(n,this.predicate))},n}(),wc=function(n){function t(t,e){n.call(this,t),this.predicate=e,this.index=0}return Object(i.__extends)(t,n),t.prototype._next=function(n){var t,e=this.destination;try{t=this.predicate(n,this.index++)}catch(n){return void e.error(n)}this.nextOrComplete(n,t)},t.prototype.nextOrComplete=function(n,t){var e=this.destination;Boolean(t)?e.next(n):e.complete()},t}(Be.a);e("DDro");var xc=e("Uter"),Mc=function(){function n(){}return n.encode=function(n,t,e,l,r){var i=this;if(void 0===r&&(r=0),n.length!==e.length)throw new Error("Invalid number of signatures.");var o=this.encodeSizeTransaction(n,t,e).toNumber(),s=new ArrayBuffer(o),a=new DataView(s),u=0;if(a.setUint32(u,o,!0),a.setUint8(u+=4,r),u+=1,this.convertToBytes(l).forEach(function(n){a.setUint8(u,n),u+=1}),e.length>65535)throw new Error("Too many signatures.");if(a.setUint32(u,e.length,!0),u+=4,e.forEach(function(n){i.convertToBytes(n).forEach(function(n){a.setUint8(u,n),u+=1})}),n.length>65535)throw new Error("Too many inputs.");if(a.setUint32(u,n.length,!0),u+=4,n.forEach(function(n){i.convertToBytes(n.hashIn).forEach(function(n){a.setUint8(u,n),u+=1})}),t.length>65535)throw new Error("Too many outputs.");a.setUint32(u,t.length,!0),u+=4;var c=xc("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");return t.forEach(function(n){var t=c.decode(n.address);a.setUint8(u,t[20]),u+=1;for(var e=0;e<20;e++)a.setUint8(u,t[e]),u+=1;u=i.setUint64(a,u,new Ee.a(n.coin)),u=i.setUint64(a,u,new Ee.a(n.hour))}),this.convertToHex(s)},n.encodeSizeTransaction=function(n,t,e){var l=new Ee.a(0);return(l=(l=(l=(l=(l=(l=(l=(l=l.plus(4)).plus(1)).plus(32)).plus(4)).plus(new Ee.a(65).multipliedBy(e.length))).plus(4)).plus(new Ee.a(32).multipliedBy(n.length))).plus(4)).plus(new Ee.a(37).multipliedBy(t.length))},n.setUint64=function(n,t,e){var l=e.toString(16);l.length%2!=0&&(l="0"+l);for(var r=this.convertToBytes(l),i=r.length-1;i>=0;i--)n.setUint8(t,r[i]),t+=1;for(i=0;i<8-r.length;i++)n.setUint8(t,0),t+=1;return t},n.convertToBytes=function(n){if(n.length%2!=0)throw new Error("Invalid hex string.");for(var t=[],e=0;es[0]?i=!0:a===s[0]&&(u>s[1]?i=!0:u===s[1]&&(Ll.useHwWalletDaemon?l.rawResponse.fw_patch:l.rawResponse.patchVersion)>=s[2]&&(i=!0))}}var c=[],d=!1;Ll.useHwWalletDaemon?(l.rawResponse.needs_backup&&(c.push(Cc.NeedsBackup),d=!0),l.rawResponse.pin_protection||(c.push(Cc.NeedsPin),d=!0)):(l.rawResponse.needsBackup&&(c.push(Cc.NeedsBackup),d=!0),l.rawResponse.pinProtection||(c.push(Cc.NeedsPin),d=!0)),r?i||(c.push(Cc.OutdatedFirmware),d=!0):c.push(Cc.FirmwareVersionNotVerified);var h=!1;if(n){var p=l.rawResponse.label?l.rawResponse.label:l.rawResponse.deviceId?l.rawResponse.deviceId:l.rawResponse.device_id;n.label!==p&&(n.label=p,h=!0),n.hasHwSecurityWarnings=d,e.saveHardwareWallets()}return{features:l.rawResponse,securityWarnings:c,walletNameUpdated:h}}):null},n.prototype.deleteHardwareWallet=function(n){var t=this;return n.isHardware?this.wallets.first().map(function(e){var l=e.indexOf(n);return-1!==l&&(e.splice(l,1),t.saveHardwareWallets(),t.refreshBalances(),!0)}):null},n.prototype.folder=function(){return this.apiService.get("wallets/folderName").map(function(n){return n.address})},n.prototype.outputs=function(){var n=this;return this.addressesAsString().first().filter(function(n){return!!n}).flatMap(function(t){return n.apiService.post("outputs",{addrs:t})})},n.prototype.outputsWithWallets=function(){return o.a.zip(this.all(),this.outputs(),function(n,t){return n.map(function(n){return n.addresses=n.addresses.map(function(n){return n.outputs=t.head_outputs.filter(function(t){return t.address===n.address}),n}),n})})},n.prototype.pendingTransactions=function(){return this.pendingTxs.asObservable()},n.prototype.refreshBalances=function(){var n=this;this.wallets.first().subscribe(function(t){o.a.forkJoin(t.map(function(t){return n.retrieveWalletBalance(t).map(function(n){return t.coins=n.coins,t.hours=n.hours,t.addresses.map(function(t){var e=n.addresses.find(function(n){return n.address===t.address});t.coins=e.coins,t.hours=e.hours}),t})})).subscribe(function(t){return n.wallets.next(t)})})},n.prototype.renameWallet=function(n,t){var e=this;return this.apiService.post("wallet/update",{id:n.filename,label:t}).do(function(){n.label=t,e.updateWallet(n)})},n.prototype.toggleEncryption=function(n,t){var e=this;return this.apiService.postWalletToggleEncryption(n,t).do(function(t){n.encrypted=t.meta.encrypted,e.updateWallet(t)})},n.prototype.resetPassword=function(n,t,e){var l=this,r=new Object;return r.id=n.filename,r.seed=t,e&&(r.password=e),this.apiService.post("wallet/recover",r,{},!0).do(function(t){n.encrypted=t.data.meta.encrypted,l.updateWallet(t.data)})},n.prototype.getWalletSeed=function(n,t){return this.apiService.getWalletSeed(n,t)},n.prototype.createTransaction=function(n,t,e,l,r,i,o,s){var a=this;e&&(t=null),n.isHardware&&!i&&(i=n.addresses[0].address);var u=!!n.isHardware,c={hours_selection:r,wallet_id:n?n.filename:null,password:o,addresses:t,unspents:e,to:l,change_address:i};u||(c.unsigned=s);var d,h=this.apiService.post(u?"transaction":"wallet/transaction",c,{json:!0},u).map(function(t){var e=u?t.data:t;if(n.isHardware){if(e.transaction.inputs.length>8)throw new Error(a.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"));if(e.transaction.outputs.length>8)throw new Error(a.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"))}return kc({},e.transaction,{hoursBurned:new Ae.BigNumber(e.transaction.fee),encoded:e.encoded_transaction,innerHash:e.transaction.inner_hash})});return n.isHardware&&!s&&(h=h.flatMap(function(t){return d=t,a.signTransaction(n,null,t)}).map(function(n){return d.encoded=n.encoded,d})),h},n.prototype.signTransaction=function(n,t,e){if(n.isHardware){var l=[],r=[],i=[],s=[];if(e.outputs.forEach(function(n){l.push({address:n.address,coins:parseInt(new Ae.BigNumber(n.coins).multipliedBy(1e6).toFixed(0),10),hours:parseInt(n.hours,10)}),i.push({address:n.address,coin:parseInt(new Ae.BigNumber(n.coins).multipliedBy(1e6).toFixed(0),10),hour:parseInt(n.hours,10)})}),i.length>1)for(var a=l.length-1;a>=0;a--)if(i[a].address===n.addresses[0].address){i[a].address_index=0;break}var u=new Map;return n.addresses.forEach(function(n,t){return u.set(n.address,t)}),e.inputs.forEach(function(n){r.push({hash:n.uxid,secret:"",address:n.address,address_index:u.get(n.address),calculated_hours:parseInt(n.calculated_hours,10),coins:parseInt(n.coins,10)}),s.push({hashIn:n.uxid,index:u.get(n.address)})}),this.hwWalletService.signTransaction(s,i).flatMap(function(n){var t=Mc.encode(s,i,n.rawResponse,e.innerHash);return o.a.of(kc({},e,{encoded:t}))})}return this.apiService.post("wallet/transaction/sign",{wallet_id:n?n.filename:null,password:t,encoded_transaction:e.encoded},{json:!0},!0).map(function(n){return kc({},n.data.transaction,{hoursBurned:new Ae.BigNumber(n.data.transaction.fee),encoded:n.data.encoded_transaction})})},n.prototype.injectTransaction=function(n,t){var e=this;return this.apiService.post("injectTransaction",{rawtx:n},{json:!0}).flatMap(function(n){return setTimeout(function(){return e.startDataRefreshSubscription()},32),t?e.storageService.store(ec.NOTES,n,t).retryWhen(function(n){return n.delay(1e3).take(3).concat(o.a.throw(-1))}).catch(function(n){return-1===n?o.a.of(-1):n}).map(function(n){return-1!==n}):o.a.of(!1)})},n.prototype.transaction=function(n){var t=this;return this.apiService.get("transaction",{txid:n}).flatMap(function(n){return n.txn.inputs&&!n.txn.inputs.length?o.a.of(n):o.a.forkJoin(n.txn.inputs.map(function(n){return t.retrieveInputAddress(n).map(function(n){return n.owner_address})})).map(function(t){return n.txn.inputs=t,n})})},n.prototype.transactions=function(){var n,t,e=this,l=new Map;return this.wallets.first().flatMap(function(t){return n=t,e.allAddresses().first()}).flatMap(function(n){return e.addresses=n,n.map(function(n){return l.set(n.address,!0)}),e.apiService.getTransactions(n)}).flatMap(function(n){return t=n,e.storageService.get(ec.NOTES,null)}).map(function(e){var r=new Map;return Object.keys(e.data).forEach(function(n){r.set(n,e.data[n])}),t.sort(function(n,t){return t.timestamp-n.timestamp}).map(function(t){var e=t.inputs.some(function(n){return l.has(n.owner)}),i=new Map;if(t.balance=new Ae.BigNumber("0"),t.hoursSent=new Ae.BigNumber("0"),e){var o=new Map;if(t.inputs.map(function(t){l.has(t.owner)&&(i.set(t.owner,!0),n.map(function(n){n.addresses.some(function(n){return n.address===t.owner})&&n.addresses.map(function(n){return o.set(n.address,!0)})}))}),t.outputs.map(function(n){o.has(n.dst)||(t.balance=t.balance.minus(n.coins),t.hoursSent=t.hoursSent.plus(n.hours))}),t.balance.isEqualTo(0)){t.coinsMovedInternally=!0;var s=new Map;t.inputs.map(function(n){s.set(n.owner,!0)}),t.outputs.map(function(n){s.has(n.dst)||(i.set(n.dst,!0),t.balance=t.balance.plus(n.coins),t.hoursSent=t.hoursSent.plus(n.hours))})}}else t.outputs.map(function(n){l.has(n.dst)&&(i.set(n.dst,!0),t.balance=t.balance.plus(n.coins),t.hoursSent=t.hoursSent.plus(n.hours))});i.forEach(function(n,e){t.addresses.push(e)});var a=new Ae.BigNumber("0");t.inputs.map(function(n){return a=a.plus(new Ae.BigNumber(n.calculated_hours))});var u=new Ae.BigNumber("0");t.outputs.map(function(n){return u=u.plus(new Ae.BigNumber(n.hours))}),t.hoursBurned=a.minus(u);var c=r.get(t.txid);return c&&(t.note=c),t})})},n.prototype.startDataRefreshSubscription=function(){var n=this;this.dataRefreshSubscription&&this.dataRefreshSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){n.dataRefreshSubscription=o.a.timer(0,1e4).subscribe(function(){return n.ngZone.run(function(){n.refreshBalances(),n.refreshPendingTransactions()})})})},n.prototype.saveHardwareWallets=function(){var n=this;this.wallets.first().subscribe(function(t){var e=[];t.map(function(t){t.isHardware&&e.push(n.createHardwareWalletData(t.label,t.addresses.map(function(n){return{address:n.address,confirmed:n.confirmed}}),t.hasHwSecurityWarnings,t.stopShowingHwSecurityPopup))}),n.hwWalletService.saveWalletsData(JSON.stringify(e)),n.wallets.next(t)})},n.prototype.verifyAddress=function(n){return this.apiService.post("address/verify",{address:n},{},!0).pipe(Object(Le.a)(function(){return!0}),Ce(function(){return o.a.of(!1)}))},n.prototype.getWalletUnspentOutputs=function(n){var t=n.addresses.map(function(n){return n.address}).join(",");return this.getOutputs(t)},n.prototype.createHardwareWalletData=function(n,t,e,l){return{label:n,filename:"",hasHwSecurityWarnings:e,stopShowingHwSecurityPopup:l,coins:null,hours:null,addresses:t.map(function(n){return{address:n.address,coins:null,hours:null,confirmed:n.confirmed}}),encrypted:!1,isHardware:!0}},n.prototype.loadData=function(){var n=this,t=[],e=[];this.apiService.getWallets().first().flatMap(function(l){return e=l,n.hwWalletService.hwWalletCompatibilityActivated?n.loadHardwareWallets(t):o.a.of(null)}).subscribe(function(){t=t.concat(e),n.wallets.next(t)},function(){return n.initialLoadFailed.next(!0)})},n.prototype.loadHardwareWallets=function(n){return this.hwWalletService.getSavedWalletsData().map(function(t){return t&&JSON.parse(t).map(function(t){return n.push(t)}),null})},n.prototype.retrieveInputAddress=function(n){return this.apiService.get("uxout",{uxid:n})},n.prototype.retrieveWalletBalance=function(n){var t;if(n.isHardware){var e=n.addresses.map(function(n){return n.address}).join(",");t=this.apiService.post("balance",{addrs:e})}else t=this.apiService.get("wallet/balance",{id:n.filename});return t.map(function(n){return{coins:new Ae.BigNumber(n.confirmed.coins).dividedBy(1e6),hours:new Ae.BigNumber(n.confirmed.hours),addresses:Object.keys(n.addresses).map(function(t){return{address:t,coins:new Ae.BigNumber(n.addresses[t].confirmed.coins).dividedBy(1e6),hours:new Ae.BigNumber(n.addresses[t].confirmed.hours)}})}})},n.prototype.updateWallet=function(n){var t=this;this.wallets.first().subscribe(function(e){e[e.findIndex(function(t){return t.filename===n.filename})]=n,t.wallets.next(e)})},n.prototype.refreshPendingTransactions=function(){var n=this;this.apiService.get("pendingTxs",{verbose:!0}).flatMap(function(t){return 0===t.length?o.a.of({user:[],all:[]}):n.wallets.first().map(function(n){var e=new Set;return n.forEach(function(n){n.addresses.forEach(function(n){return e.add(n.address)})}),{user:t.filter(function(n){return n.transaction.inputs.some(function(n){return e.has(n.owner)})||n.transaction.outputs.some(function(n){return e.has(n.dst)})}),all:t}})}).subscribe(function(t){return n.pendingTxs.next(t)})},n.prototype.getOutputs=function(n){return n?this.apiService.post("outputs",{addrs:n}).map(function(n){var t=[];return n.head_outputs.forEach(function(n){return t.push({address:n.address,coins:new Ae.BigNumber(n.coins),hash:n.hash,calculated_hours:new Ae.BigNumber(n.calculated_hours)})}),t}):o.a.of([])},n.prototype.sortOutputs=function(n,t){n.sort(function(n,e){return e.coins.isGreaterThan(n.coins)?t?1:-1:e.coins.isLessThan(n.coins)?t?-1:1:e.calculated_hours.isGreaterThan(n.calculated_hours)?-1:e.calculated_hours.isLessThan(n.calculated_hours)?1:0})},n.prototype.getMinRequiredOutputs=function(n,t){var e=[],l=[];if(t.forEach(function(n){n.calculated_hours.isGreaterThan(0)?e.push(n):l.push(n)}),0===e.length)return[];this.sortOutputs(e,!0);var r=[e[0]],i=new Ae.BigNumber(e[0].coins);return i.isGreaterThanOrEqualTo(n)?r:(this.sortOutputs(l,!1),l.forEach(function(t){i.isLessThan(n)&&(r.push(t),i=i.plus(t.coins))}),i.isGreaterThanOrEqualTo(n)?r:(e.splice(0,1),this.sortOutputs(e,!1),e.forEach(function(t){i.isLessThan(n)&&(r.push(t),i=i.plus(t.coins))}),r))},n}();function Oc(n){if("object"==typeof n&&(n._body?n=n._body:n+=""),-1!==n.indexOf('"error":')&&(n=JSON.parse(n).error.message),n.startsWith("400")||n.startsWith("403")){var t=n.split(" - ",2);return 2===t.length?t[1].charAt(0).toUpperCase()+t[1].slice(1):n}return n}function Tc(n,t,e){return void 0===e&&(e=null),Ll.useHwWalletDaemon||window.ipcRenderer.sendSync("hwGetDeviceConnectedSync")?(l=t.result?t.result===rc.FailedOrRefused?"hardware-wallet.general.refused":t.result===rc.WrongPin?"hardware-wallet.general.error-incorrect-pin":t.result===rc.IncorrectHardwareWallet?"hardware-wallet.general.error-incorrect-wallet":t.result===rc.DaemonError?"hardware-wallet.errors.daemon-connection":t.result===rc.InvalidAddress?"hardware-wallet.errors.invalid-address":t.result===rc.Timeout?"hardware-wallet.errors.timeout":t.result===rc.Disconnected?"hardware-wallet.general.error-disconnected":t.result===rc.NotInBootloaderMode?"hardware-wallet.errors.not-in-bootloader-mode":t.result===rc.PinMismatch?"hardware-wallet.change-pin.pin-mismatch":t.result===rc.WrongWord?"hardware-wallet.restore-seed.error-wrong-word":t.result===rc.InvalidSeed?"hardware-wallet.restore-seed.error-invalid-seed":t.result===rc.WrongSeed?"hardware-wallet.restore-seed.error-wrong-seed":e||"hardware-wallet.general.generic-error":e||"hardware-wallet.general.generic-error",n?n.instant(l):l):n?n.instant("hardware-wallet.general.error-disconnected"):"hardware-wallet.general.error-disconnected";var l}var Lc=function(){function n(){this.forceEmitEvents=!1,this.action=new l.o,this.mouseOver=!1}return n.prototype.onClick=function(){this.disabled&&!this.forceEmitEvents||(this.error="",this.action.emit())},n.prototype.focus=function(){this.button.focus()},n.prototype.setLoading=function(){this.state=0},n.prototype.setSuccess=function(){var n=this;this.state=1,setTimeout(function(){return n.state=null},3e3)},n.prototype.setError=function(n){var t=this;this.error="string"==typeof n?n:Oc(n._body),this.state=2,this.mouseOver&&setTimeout(function(){return t.tooltip.show()},50)},n.prototype.setDisabled=function(){this.disabled=!0},n.prototype.setEnabled=function(){this.disabled=!1},n.prototype.isLoading=function(){return 0===this.state},n.prototype.resetState=function(){return this.state=null,this.error="",this},n}();o.a.prototype.switchMap=function(n,t){return Object(Ri.a)(n,t)(this)},o.a.prototype.debounceTime=function(n,t){return void 0===t&&(t=sl),mr(n,t)(this)};var Pc,Dc,Ac=function(){function n(){var n=this;this.lastSearchTerm="",this.searchResultsSubject=new yl.a,this.wordList=[],this.wordMap=new Map,e.e(6).then(e.bind(null,"flj1")).then(function(t){n.wordList=t.list,n.wordList.forEach(function(t){n.wordMap.set(t,!0)}),n.searchResultsSubject.next(n.lastSearchTerm)})}return Object.defineProperty(n.prototype,"searchResults",{get:function(){var n=this;return this.searchResultsSubject.asObservable().debounceTime(100).map(function(t){return t.length>1?n.wordList.filter(function(n){return n.startsWith(t)}):[]})},enumerable:!0,configurable:!0}),n.prototype.setSearchTerm=function(n){this.lastSearchTerm=n,this.searchResultsSubject.next(n)},n.prototype.validateWord=function(n){return this.wordList.length>0?!!this.wordMap.has(n):null},n}();!function(n){n.Error="error",n.Done="done",n.Warning="warning"}(Pc||(Pc={})),function(n){n.Red="red-background",n.Green="green-background",n.Yellow="yellow-background"}(Dc||(Dc={}));var Ec=function(){},Yc=function(){function n(){this.config=new Ec,this.visible=!1}return n.prototype.show=function(){var n=this;this.visible?(this.visible=!1,setTimeout(function(){return n.visible=!0},32)):this.visible=!0},n.prototype.hide=function(){this.visible=!1},n}(),jc=function(){function n(){}return Object.defineProperty(n.prototype,"msgBarComponent",{set:function(n){this.msgBarComponentInternal=n},enumerable:!0,configurable:!0}),n.prototype.show=function(n){this.msgBarComponentInternal&&(this.msgBarComponentInternal.config=n,this.msgBarComponentInternal.show())},n.prototype.hide=function(){this.msgBarComponentInternal&&this.msgBarComponentInternal.hide()},n.prototype.showError=function(n,t){void 0===t&&(t=2e4);var e=new Ec;e.text=Oc(n),e.title="errors.error",e.icon=Pc.Error,e.color=Dc.Red,this.show(e),this.setTimer(t)},n.prototype.showWarning=function(n,t){void 0===t&&(t=2e4);var e=new Ec;e.text=Oc(n),e.title="common.warning",e.icon=Pc.Warning,e.color=Dc.Yellow,this.show(e),this.setTimer(t)},n.prototype.showDone=function(n,t){void 0===t&&(t=1e4);var e=new Ec;e.text=n,e.title="common.success",e.icon=Pc.Done,e.color=Dc.Green,this.show(e),this.setTimer(t)},n.prototype.setTimer=function(n){var t=this;void 0===n&&(n=1e4),this.timeSubscription&&this.timeSubscription.unsubscribe(),this.timeSubscription=o.a.of(1).delay(n).subscribe(function(){return t.hide()})},n}(),Ic=function(n){return n[n.None=0]="None",n[n.Spinner=1]="Spinner",n[n.Success=2]="Success",n[n.Error=3]="Error",n[n.Usb=4]="Usb",n[n.HardwareWallet=5]="HardwareWallet",n[n.Warning=6]="Warning",n[n.Confirm=7]="Confirm",n}({}),Rc=function(){function n(){this.icon=Ic.HardwareWallet,this.linkClicked=new l.o,this.icons=Ic}return n.prototype.activateLink=function(){this.linkClicked.emit()},n}(),Hc=function(){function n(n,t,e,l,r,i,o){var s=this;this.data=n,this.dialogRef=t,this.formBuilder=e,this.bip38WordList=l,this.msgBarService=r,this.translateService=i,this.msgIcons=Ic,this.sendingWord=!1,n.isForHwWallet&&(this.hwConnectionSubscription=o.walletConnectedAsyncEvent.subscribe(function(n){n||s.dialogRef.close()}))}return n.prototype.ngOnInit=function(){var n=this;this.form=this.formBuilder.group({word:["",Xi.required]}),this.valueChangeSubscription=this.form.controls.word.valueChanges.subscribe(function(t){n.bip38WordList.setSearchTerm(t.trim().toLowerCase())}),this.filteredOptions=this.bip38WordList.searchResults.map(function(n){return n})},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.valueChangeSubscription.unsubscribe(),this.hwConnectionSubscription&&this.hwConnectionSubscription.unsubscribe()},n.prototype.sendWord=function(){var n=this;this.sendingWord||(this.sendingWord=!0,this.msgBarService.hide(),setTimeout(function(){if(n.form.valid){var t=n.bip38WordList.validateWord(n.form.value.word.trim().toLowerCase());t?n.dialogRef.close(n.form.value.word.trim().toLowerCase()):n.msgBarService.showError(n.translateService.instant(null===t?"hardware-wallet.seed-word.error-loading-words":"hardware-wallet.seed-word.error-invalid-word"))}n.sendingWord=!1},32))},n}(),Nc=function(){function n(n,t){this.dialogRef=n,this.data=t,this.accepted=!1,this.disableDismiss=!1,this.disableDismiss=!!t.disableDismiss}return n.prototype.closeModal=function(n){this.dialogRef.close(n)},n.prototype.setAccept=function(n){this.accepted=!!n.checked},n}(),Fc=function(){return function(n){Object.assign(this,n)}}(),Bc=function(){function n(n,t){this.translate=n,this.storageService=t,this.currentLanguage=new Sl(1),this.selectedLanguageLoaded=new Sl(1),this.storageKey="lang",this.languagesInternal=[]}return Object.defineProperty(n.prototype,"languages",{get:function(){return this.languagesInternal},enumerable:!0,configurable:!0}),n.prototype.loadLanguageSettings=function(){var n=this,t=[];Ll.languages.forEach(function(e){var l=new Fc(e);n.languagesInternal.push(l),t.push(l.code)}),this.translate.addLangs(t),this.translate.setDefaultLang(Ll.defaultLanguage),this.translate.onLangChange.subscribe(function(t){return n.onLanguageChanged(t)}),this.loadCurrentLanguage()},n.prototype.changeLanguage=function(n){this.translate.use(n)},n.prototype.onLanguageChanged=function(n){this.currentLanguage.next(this.languages.find(function(t){return t.code===n.lang})),this.subscription&&this.subscription.unsubscribe(),this.subscription=this.storageService.store(ec.CLIENT,this.storageKey,n.lang).subscribe()},n.prototype.loadCurrentLanguage=function(){var n=this;this.storageService.get(ec.CLIENT,this.storageKey).subscribe(function(t){t.data&&-1!==n.translate.getLangs().indexOf(t.data)?(setTimeout(function(){n.translate.use(t.data)},16),n.selectedLanguageLoaded.next(!0)):n.selectedLanguageLoaded.next(!1)},function(){n.selectedLanguageLoaded.next(!1)})},n}(),Vc=function(){function n(n,t){this.dialogRef=n,this.languageService=t}return n.prototype.ngOnInit=function(){this.disableDismiss=this.dialogRef.disableClose,this.languages=this.languageService.languages},n.prototype.closePopup=function(n){void 0===n&&(n=null),this.dialogRef.close(n?n.code:void 0)},n}();function Wc(n,t){return n.open(Nc,{width:"450px",data:t,autoFocus:!1})}function zc(n,t){void 0===t&&(t=!1);var e=new oa;return e.width="600px",e.disableClose=t,e.autoFocus=!1,n.open(Vc,e).afterClosed()}function Uc(n){var t=document.createElement("textarea");t.style.position="fixed",t.style.left="0",t.style.top="0",t.style.opacity="0",t.value=n,document.body.appendChild(t),t.focus(),t.select(),document.execCommand("copy"),document.body.removeChild(t)}var Gc=function(){function n(n,t,e){this.apiService=n,this.dialog=t,this.msgBarService=e,this.customSeedIsNormal=!0,this.customSeedAccepted=!1,this.encrypt=!0,this.enterSeedWithAssistance=!0,this.assistedSeedConfirmed=!1,this.lastAssistedSeed="",this.numberOfAutogeneratedWords=0,this.seed=new yl.a}return n.prototype.ngOnInit=function(){this.onboarding?this.initForm(!1,null):this.initForm()},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.statusSubscription.unsubscribe(),this.seedValiditySubscription.unsubscribe()},Object.defineProperty(n.prototype,"isValid",{get:function(){return this.form.valid&&(!this.enterSeedWithAssistance&&(this.customSeedIsNormal||this.customSeedAccepted)||this.create&&this.enterSeedWithAssistance&&this.assistedSeedConfirmed||!this.create&&this.enterSeedWithAssistance&&this.lastAssistedSeed.length>2)},enumerable:!0,configurable:!0}),n.prototype.onCustomSeedAcceptance=function(n){this.customSeedAccepted=n.checked},n.prototype.setEncrypt=function(n){this.encrypt=n.checked,this.form.updateValueAndValidity()},n.prototype.getData=function(){return{creatingNewWallet:this.create,label:this.form.value.label,seed:this.enterSeedWithAssistance?this.lastAssistedSeed:this.form.value.seed,password:!this.onboarding&&this.encrypt?this.form.value.password:null,enterSeedWithAssistance:this.enterSeedWithAssistance,lastAssistedSeed:this.lastAssistedSeed,lastCustomSeed:this.form.value.seed,numberOfWords:this.create?this.numberOfAutogeneratedWords:this.form.value.number_of_words}},n.prototype.changeSeedType=function(){var n=this;this.msgBarService.hide(),this.enterSeedWithAssistance?Wc(this.dialog,{text:this.create?"wallet.new.seed.custom-seed-warning-text":"wallet.new.seed.custom-seed-warning-text-recovering",headerText:"wallet.new.seed.custom-seed-warning-title",checkboxText:this.create?"wallet.new.seed.custom-seed-warning-check":null,confirmButtonText:"wallet.new.seed.custom-seed-warning-continue",cancelButtonText:"wallet.new.seed.custom-seed-warning-cancel"}).afterClosed().subscribe(function(t){t&&(n.enterSeedWithAssistance=!1,n.removeConfirmations())}):(this.enterSeedWithAssistance=!0,this.removeConfirmations())},n.prototype.enterSeed=function(){this.create||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},n.prototype.confirmNormalSeed=function(){this.assistedSeedConfirmed||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},n.prototype.askForWord=function(n){var t=this;this.dialog.open(Hc,{width:"350px",data:{isForHwWallet:!1,wordNumber:n+1,restoringSoftwareWallet:!this.create}}).afterClosed().subscribe(function(e){if(e){if(t.create&&e!==t.lastAssistedSeed.split(" ")[n])return void t.msgBarService.showError("wallet.new.seed.incorrect-word");if(t.partialSeed[n]=e,n+=1,t.create&&nn.length)return null;if("full"===e.pathMatch&&(t.hasChildren()||l.length0?n[n.length-1]:null}function Bd(n,t){for(var e in n)n.hasOwnProperty(e)&&t(n[e],e)}function Vd(n){var t=pd.call(n);return dd.call(t,function(n){return!0===n})}function Wd(n){return Object(l._14)(n)?n:Object(l._15)(n)?Ui(Promise.resolve(n)):Object(Fe.a)(n)}function zd(n,t,e){return e?function(n,t){return Hd(n,t)}(n.queryParams,t.queryParams)&&function n(t,e){if(!Jd(t.segments,e.segments))return!1;if(t.numberOfChildren!==e.numberOfChildren)return!1;for(var l in e.children){if(!t.children[l])return!1;if(!n(t.children[l],e.children[l]))return!1}return!0}(n.root,t.root):function(n,t){return Object.keys(t).length<=Object.keys(n).length&&Object.keys(t).every(function(e){return t[e]===n[e]})}(n.queryParams,t.queryParams)&&function n(t,e){return function t(e,l,r){if(e.segments.length>r.length)return!!Jd(o=e.segments.slice(0,r.length),r)&&!l.hasChildren();if(e.segments.length===r.length){if(!Jd(e.segments,r))return!1;for(var i in l.children){if(!e.children[i])return!1;if(!n(e.children[i],l.children[i]))return!1}return!0}var o=r.slice(0,e.segments.length),s=r.slice(e.segments.length);return!!Jd(e.segments,o)&&!!e.children[Pd]&&t(e.children[Pd],l,s)}(t,e,e.segments)}(n.root,t.root)}var Ud=function(){function n(n,t,e){this.root=n,this.queryParams=t,this.fragment=e}return Object.defineProperty(n.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=Ad(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return Zd.serialize(this)},n}(),Gd=function(){function n(n,t){var e=this;this.segments=n,this.children=t,this.parent=null,Bd(t,function(n,t){return n.parent=e})}return n.prototype.hasChildren=function(){return this.numberOfChildren>0},Object.defineProperty(n.prototype,"numberOfChildren",{get:function(){return Object.keys(this.children).length},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return $d(this)},n}(),qd=function(){function n(n,t){this.path=n,this.parameters=t}return Object.defineProperty(n.prototype,"parameterMap",{get:function(){return this._parameterMap||(this._parameterMap=Ad(this.parameters)),this._parameterMap},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return eh(this)},n}();function Jd(n,t){return n.length===t.length&&n.every(function(n,e){return n.path===t[e].path})}function Qd(n,t){var e=[];return Bd(n.children,function(n,l){l===Pd&&(e=e.concat(t(n,l)))}),Bd(n.children,function(n,l){l!==Pd&&(e=e.concat(t(n,l)))}),e}var Kd=function(){},Xd=function(){function n(){}return n.prototype.parse=function(n){var t=new sh(n);return new Ud(t.parseRootSegment(),t.parseQueryParams(),t.parseFragment())},n.prototype.serialize=function(n){var t,e;return"/"+function n(t,e){if(!t.hasChildren())return $d(t);if(e){var l=t.children[Pd]?n(t.children[Pd],!1):"",r=[];return Bd(t.children,function(t,e){e!==Pd&&r.push(e+":"+n(t,!1))}),r.length>0?l+"("+r.join("//")+")":l}var i=Qd(t,function(e,l){return l===Pd?[n(t.children[Pd],!1)]:[l+":"+n(e,!1)]});return $d(t)+"/("+i.join("//")+")"}(n.root,!0)+(t=n.queryParams,(e=Object.keys(t).map(function(n){var e=t[n];return Array.isArray(e)?e.map(function(t){return nh(n)+"="+nh(t)}).join("&"):nh(n)+"="+nh(e)})).length?"?"+e.join("&"):"")+("string"==typeof n.fragment?"#"+encodeURI(n.fragment):"")},n}(),Zd=new Xd;function $d(n){return n.segments.map(function(n){return eh(n)}).join("/")}function nh(n){return encodeURIComponent(n).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";")}function th(n){return decodeURIComponent(n)}function eh(n){return""+nh(n.path)+(t=n.parameters,Object.keys(t).map(function(n){return";"+nh(n)+"="+nh(t[n])}).join(""));var t}var lh=/^[^\/()?;=&#]+/;function rh(n){var t=n.match(lh);return t?t[0]:""}var ih=/^[^=?&#]+/,oh=/^[^?&#]+/,sh=function(){function n(n){this.url=n,this.remaining=n}return n.prototype.parseRootSegment=function(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new Gd([],{}):new Gd([],this.parseChildren())},n.prototype.parseQueryParams=function(){var n={};if(this.consumeOptional("?"))do{this.parseQueryParam(n)}while(this.consumeOptional("&"));return n},n.prototype.parseFragment=function(){return this.consumeOptional("#")?decodeURI(this.remaining):null},n.prototype.parseChildren=function(){if(""===this.remaining)return{};this.consumeOptional("/");var n=[];for(this.peekStartsWith("(")||n.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),n.push(this.parseSegment());var t={};this.peekStartsWith("/(")&&(this.capture("/"),t=this.parseParens(!0));var e={};return this.peekStartsWith("(")&&(e=this.parseParens(!1)),(n.length>0||Object.keys(t).length>0)&&(e[Pd]=new Gd(n,t)),e},n.prototype.parseSegment=function(){var n=rh(this.remaining);if(""===n&&this.peekStartsWith(";"))throw new Error("Empty path url segment cannot have parameters: '"+this.remaining+"'.");return this.capture(n),new qd(th(n),this.parseMatrixParams())},n.prototype.parseMatrixParams=function(){for(var n={};this.consumeOptional(";");)this.parseParam(n);return n},n.prototype.parseParam=function(n){var t=rh(this.remaining);if(t){this.capture(t);var e="";if(this.consumeOptional("=")){var l=rh(this.remaining);l&&this.capture(e=l)}n[th(t)]=th(e)}},n.prototype.parseQueryParam=function(n){var t,e=(t=this.remaining.match(ih))?t[0]:"";if(e){this.capture(e);var l="";if(this.consumeOptional("=")){var r=function(n){var t=n.match(oh);return t?t[0]:""}(this.remaining);r&&this.capture(l=r)}var i=th(e),o=th(l);if(n.hasOwnProperty(i)){var s=n[i];Array.isArray(s)||(n[i]=s=[s]),s.push(o)}else n[i]=o}},n.prototype.parseParens=function(n){var t={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){var e=rh(this.remaining),l=this.remaining[e.length];if("/"!==l&&")"!==l&&";"!==l)throw new Error("Cannot parse url '"+this.url+"'");var r=void 0;e.indexOf(":")>-1?(r=e.substr(0,e.indexOf(":")),this.capture(r),this.capture(":")):n&&(r=Pd);var i=this.parseChildren();t[r]=1===Object.keys(i).length?i[Pd]:new Gd([],i),this.consumeOptional("//")}return t},n.prototype.peekStartsWith=function(n){return this.remaining.startsWith(n)},n.prototype.consumeOptional=function(n){return!!this.peekStartsWith(n)&&(this.remaining=this.remaining.substring(n.length),!0)},n.prototype.capture=function(n){if(!this.consumeOptional(n))throw new Error('Expected "'+n+'".')},n}(),ah=function(n){this.segmentGroup=n||null},uh=function(n){this.urlTree=n};function ch(n){return new o.a(function(t){return t.error(new ah(n))})}function dh(n){return new o.a(function(t){return t.error(new uh(n))})}function hh(n){return new o.a(function(t){return t.error(new Error("Only absolute redirects can have named outlets. redirectTo: '"+n+"'"))})}var ph=function(){function n(n,t,e,r,i){this.configLoader=t,this.urlSerializer=e,this.urlTree=r,this.config=i,this.allowRedirects=!0,this.ngModule=n.get(l.z)}return n.prototype.apply=function(){var n=this,t=this.expandSegmentGroup(this.ngModule,this.config,this.urlTree.root,Pd),e=Pe.call(t,function(t){return n.createUrlTree(t,n.urlTree.queryParams,n.urlTree.fragment)});return Te.call(e,function(t){if(t instanceof uh)return n.allowRedirects=!1,n.match(t.urlTree);if(t instanceof ah)throw n.noMatchError(t);throw t})},n.prototype.match=function(n){var t=this,e=this.expandSegmentGroup(this.ngModule,this.config,n.root,Pd),l=Pe.call(e,function(e){return t.createUrlTree(e,n.queryParams,n.fragment)});return Te.call(l,function(n){if(n instanceof ah)throw t.noMatchError(n);throw n})},n.prototype.noMatchError=function(n){return new Error("Cannot match any routes. URL Segment: '"+n.segmentGroup+"'")},n.prototype.createUrlTree=function(n,t,e){var l,r=n.segments.length>0?new Gd([],((l={})[Pd]=n,l)):n;return new Ud(r,t,e)},n.prototype.expandSegmentGroup=function(n,t,e,l){return 0===e.segments.length&&e.hasChildren()?Pe.call(this.expandChildren(n,t,e),function(n){return new Gd([],n)}):this.expandSegment(n,e,t,e.segments,l,!0)},n.prototype.expandChildren=function(n,t,e){var l=this;return function(e,r){if(0===Object.keys(e).length)return Object(Fe.a)({});var i=[],o=[],s={};Bd(e,function(e,r){var a=Pe.call(l.expandSegmentGroup(n,t,e,r),function(n){return s[r]=n});r===Pd?i.push(a):o.push(a)});var a=cd.call(Fe.a.apply(void 0,i.concat(o))),u=hd.call(a);return Pe.call(u,function(){return s})}(e.children)},n.prototype.expandSegment=function(n,t,e,l,r,i){var o=this,s=Fe.a.apply(void 0,e),a=Pe.call(s,function(s){var a=o.expandSegmentAgainstRoute(n,t,e,s,l,r,i);return Te.call(a,function(n){if(n instanceof ah)return Object(Fe.a)(null);throw n})}),u=cd.call(a),c=$e.call(u,function(n){return!!n});return Te.call(c,function(n,e){if(n instanceof Ke||"EmptyError"===n.name){if(o.noLeftoversInUrl(t,l,r))return Object(Fe.a)(new Gd([],{}));throw new ah(t)}throw n})},n.prototype.noLeftoversInUrl=function(n,t,e){return 0===t.length&&!n.children[e]},n.prototype.expandSegmentAgainstRoute=function(n,t,e,l,r,i,o){return gh(l)!==i?ch(t):void 0===l.redirectTo?this.matchSegmentAgainstRoute(n,t,l,r):o&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(n,t,e,l,r,i):ch(t)},n.prototype.expandSegmentAgainstRouteUsingRedirect=function(n,t,e,l,r,i){return"**"===l.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(n,e,l,i):this.expandRegularSegmentAgainstRouteUsingRedirect(n,t,e,l,r,i)},n.prototype.expandWildCardWithParamsAgainstRouteUsingRedirect=function(n,t,e,l){var r=this,i=this.applyRedirectCommands([],e.redirectTo,{});return e.redirectTo.startsWith("/")?dh(i):tl.call(this.lineralizeSegments(e,i),function(e){var i=new Gd(e,{});return r.expandSegment(n,i,t,e,l,!1)})},n.prototype.expandRegularSegmentAgainstRouteUsingRedirect=function(n,t,e,l,r,i){var o=this,s=fh(t,l,r),a=s.consumedSegments,u=s.lastChild,c=s.positionalParamSegments;if(!s.matched)return ch(t);var d=this.applyRedirectCommands(a,l.redirectTo,c);return l.redirectTo.startsWith("/")?dh(d):tl.call(this.lineralizeSegments(l,d),function(l){return o.expandSegment(n,t,e,l.concat(r.slice(u)),i,!1)})},n.prototype.matchSegmentAgainstRoute=function(n,t,e,l){var r=this;if("**"===e.path)return e.loadChildren?Pe.call(this.configLoader.load(n.injector,e),function(n){return e._loadedConfig=n,new Gd(l,{})}):Object(Fe.a)(new Gd(l,{}));var o=fh(t,e,l),s=o.consumedSegments,a=o.lastChild;if(!o.matched)return ch(t);var u=l.slice(a),c=this.getChildConfig(n,e);return tl.call(c,function(n){var e=n.module,l=n.routes,o=function(n,t,e,l){return e.length>0&&function(n,t,e){return l.some(function(e){return mh(n,t,e)&&gh(e)!==Pd})}(n,e)?{segmentGroup:_h(new Gd(t,function(n,t){var e={};e[Pd]=t;for(var l=0,r=n;l1||!l.children[Pd])return hh(n.redirectTo);l=l.children[Pd]}},n.prototype.applyRedirectCommands=function(n,t,e){return this.applyRedirectCreatreUrlTree(t,this.urlSerializer.parse(t),n,e)},n.prototype.applyRedirectCreatreUrlTree=function(n,t,e,l){var r=this.createSegmentGroup(n,t.root,e,l);return new Ud(r,this.createQueryParams(t.queryParams,this.urlTree.queryParams),t.fragment)},n.prototype.createQueryParams=function(n,t){var e={};return Bd(n,function(n,l){if("string"==typeof n&&n.startsWith(":")){var r=n.substring(1);e[l]=t[r]}else e[l]=n}),e},n.prototype.createSegmentGroup=function(n,t,e,l){var r=this,i=this.createSegments(n,t.segments,e,l),o={};return Bd(t.children,function(t,i){o[i]=r.createSegmentGroup(n,t,e,l)}),new Gd(i,o)},n.prototype.createSegments=function(n,t,e,l){var r=this;return t.map(function(t){return t.path.startsWith(":")?r.findPosParam(n,t,l):r.findOrReturn(t,e)})},n.prototype.findPosParam=function(n,t,e){var l=e[t.path.substring(1)];if(!l)throw new Error("Cannot redirect to '"+n+"'. Cannot find '"+t.path+"'.");return l},n.prototype.findOrReturn=function(n,t){for(var e=0,l=0,r=t;l0)?{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}:{matched:!0,consumedSegments:[],lastChild:0,positionalParamSegments:{}};var l=(t.matcher||Ed)(e,n,t);return l?{matched:!0,consumedSegments:l.consumed,lastChild:l.consumed.length,positionalParamSegments:l.posParams}:{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}}function _h(n){if(1===n.numberOfChildren&&n.children[Pd]){var t=n.children[Pd];return new Gd(n.segments.concat(t.segments),t.children)}return n}function mh(n,t,e){return(!(n.hasChildren()||t.length>0)||"full"!==e.pathMatch)&&""===e.path&&void 0!==e.redirectTo}function gh(n){return n.outlet||Pd}var yh=function(){function n(n){this._root=n}return Object.defineProperty(n.prototype,"root",{get:function(){return this._root.value},enumerable:!0,configurable:!0}),n.prototype.parent=function(n){var t=this.pathFromRoot(n);return t.length>1?t[t.length-2]:null},n.prototype.children=function(n){var t=bh(n,this._root);return t?t.children.map(function(n){return n.value}):[]},n.prototype.firstChild=function(n){var t=bh(n,this._root);return t&&t.children.length>0?t.children[0].value:null},n.prototype.siblings=function(n){var t=vh(n,this._root);return t.length<2?[]:t[t.length-2].children.map(function(n){return n.value}).filter(function(t){return t!==n})},n.prototype.pathFromRoot=function(n){return vh(n,this._root).map(function(n){return n.value})},n}();function bh(n,t){if(n===t.value)return t;for(var e=0,l=t.children;e=1;){var r=e[l],o=e[l-1];if(r.routeConfig&&""===r.routeConfig.path)l--;else{if(o.component)break;l--}}return function(n){return n.reduce(function(n,t){return{params:Object(i.__assign)({},n.params,t.params),data:Object(i.__assign)({},n.data,t.data),resolve:Object(i.__assign)({},n.resolve,t._resolvedData)}},{params:{},data:{},resolve:{}})}(e.slice(l))}var Oh=function(){function n(n,t,e,l,r,i,o,s,a,u,c){this.url=n,this.params=t,this.queryParams=e,this.fragment=l,this.data=r,this.outlet=i,this.component=o,this.routeConfig=s,this._urlSegment=a,this._lastPathIndex=u,this._resolve=c}return Object.defineProperty(n.prototype,"root",{get:function(){return this._routerState.root},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"parent",{get:function(){return this._routerState.parent(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"firstChild",{get:function(){return this._routerState.firstChild(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"children",{get:function(){return this._routerState.children(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"pathFromRoot",{get:function(){return this._routerState.pathFromRoot(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"paramMap",{get:function(){return this._paramMap||(this._paramMap=Ad(this.params)),this._paramMap},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=Ad(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return"Route(url:'"+this.url.map(function(n){return n.toString()}).join("/")+"', path:'"+(this.routeConfig?this.routeConfig.path:"")+"')"},n}(),Th=function(n){function t(t,e){var l=n.call(this,e)||this;return l.url=t,Lh(l,e),l}return Object(i.__extends)(t,n),t.prototype.toString=function(){return Ph(this._root)},t}(yh);function Lh(n,t){t.value._routerState=n,t.children.forEach(function(t){return Lh(n,t)})}function Ph(n){var t=n.children.length>0?" { "+n.children.map(Ph).join(", ")+" } ":"";return""+n.value+t}function Dh(n){if(n.snapshot){var t=n.snapshot,e=n._futureSnapshot;n.snapshot=e,Hd(t.queryParams,e.queryParams)||n.queryParams.next(e.queryParams),t.fragment!==e.fragment&&n.fragment.next(e.fragment),Hd(t.params,e.params)||n.params.next(e.params),function(n,t){if(n.length!==t.length)return!1;for(var e=0;e0&&Eh(e[0]))throw new Error("Root segment cannot have matrix parameters");var l=e.find(function(n){return"object"==typeof n&&null!=n&&n.outlets});if(l&&l!==Fd(e))throw new Error("{outlets:{}} has to be the last command")}return n.prototype.toRoot=function(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]},n}(),Ih=function(n,t,e){this.segmentGroup=n,this.processChildren=t,this.index=e};function Rh(n){return"object"==typeof n&&null!=n&&n.outlets?n.outlets[Pd]:""+n}function Hh(n,t,e){if(n||(n=new Gd([],{})),0===n.segments.length&&n.hasChildren())return Nh(n,t,e);var l=function(n,t,e){for(var l=0,r=t,i={match:!1,pathIndex:0,commandIndex:0};r=e.length)return i;var o=n.segments[r],s=Rh(e[l]),a=l0&&void 0===s)break;if(s&&a&&"object"==typeof a&&void 0===a.outlets){if(!Wh(s,a,o))return i;l+=2}else{if(!Wh(s,{},o))return i;l++}r++}return{match:!0,pathIndex:r,commandIndex:l}}(n,t,e),r=e.slice(l.commandIndex);if(l.match&&l.pathIndex=2?Object(pc.a)(n,t)(this):Object(pc.a)(n)(this)}).call(l,function(n,t){return n})},n.prototype.isDeactivating=function(){return 0!==this.canDeactivateChecks.length},n.prototype.isActivating=function(){return 0!==this.canActivateChecks.length},n.prototype.setupChildRouteGuards=function(n,t,e,l){var r=this,i=xh(t);n.children.forEach(function(n){r.setupRouteGuards(n,i[n.value.outlet],e,l.concat([n.value])),delete i[n.value.outlet]}),Bd(i,function(n,t){return r.deactivateRouteAndItsChildren(n,e.getContext(t))})},n.prototype.setupRouteGuards=function(n,t,e,l){var r=n.value,i=t?t.value:null,o=e?e.getContext(n.value.outlet):null;if(i&&r.routeConfig===i.routeConfig){var s=this.shouldRunGuardsAndResolvers(i,r,r.routeConfig.runGuardsAndResolvers);s?this.canActivateChecks.push(new zh(l)):(r.data=i.data,r._resolvedData=i._resolvedData),this.setupChildRouteGuards(n,t,r.component?o?o.children:null:e,l),s&&this.canDeactivateChecks.push(new Uh(o.outlet.component,i))}else i&&this.deactivateRouteAndItsChildren(t,o),this.canActivateChecks.push(new zh(l)),this.setupChildRouteGuards(n,null,r.component?o?o.children:null:e,l)},n.prototype.shouldRunGuardsAndResolvers=function(n,t,e){switch(e){case"always":return!0;case"paramsOrQueryParamsChange":return!Ah(n,t)||!Hd(n.queryParams,t.queryParams);case"paramsChange":default:return!Ah(n,t)}},n.prototype.deactivateRouteAndItsChildren=function(n,t){var e=this,l=xh(n),r=n.value;Bd(l,function(n,l){e.deactivateRouteAndItsChildren(n,r.component?t?t.children.getContext(l):null:t)}),this.canDeactivateChecks.push(new Uh(r.component&&t&&t.outlet&&t.outlet.isActivated?t.outlet.component:null,r))},n.prototype.runCanDeactivateChecks=function(){var n=this,t=xs(this.canDeactivateChecks),e=tl.call(t,function(t){return n.runCanDeactivate(t.component,t.route)});return dd.call(e,function(n){return!0===n})},n.prototype.runCanActivateChecks=function(){var n=this,t=xs(this.canActivateChecks),e=va.call(t,function(t){return Vd(xs([n.fireChildActivationStart(t.route.parent),n.fireActivationStart(t.route),n.runCanActivateChild(t.path),n.runCanActivate(t.route)]))});return dd.call(e,function(n){return!0===n})},n.prototype.fireActivationStart=function(n){return null!==n&&this.forwardEvent&&this.forwardEvent(new Td(n)),Object(Fe.a)(!0)},n.prototype.fireChildActivationStart=function(n){return null!==n&&this.forwardEvent&&this.forwardEvent(new Sd(n)),Object(Fe.a)(!0)},n.prototype.runCanActivate=function(n){var t=this,e=n.routeConfig?n.routeConfig.canActivate:null;return e&&0!==e.length?Vd(Pe.call(xs(e),function(e){var l,r=t.getToken(e,n);return l=Wd(r.canActivate?r.canActivate(n,t.future):r(n,t.future)),$e.call(l)})):Object(Fe.a)(!0)},n.prototype.runCanActivateChild=function(n){var t=this,e=n[n.length-1],l=n.slice(0,n.length-1).reverse().map(function(n){return t.extractCanActivateChild(n)}).filter(function(n){return null!==n});return Vd(Pe.call(xs(l),function(n){return Vd(Pe.call(xs(n.guards),function(l){var r,i=t.getToken(l,n.node);return r=Wd(i.canActivateChild?i.canActivateChild(e,t.future):i(e,t.future)),$e.call(r)}))}))},n.prototype.extractCanActivateChild=function(n){var t=n.routeConfig?n.routeConfig.canActivateChild:null;return t&&0!==t.length?{node:n,guards:t}:null},n.prototype.runCanDeactivate=function(n,t){var e=this,l=t&&t.routeConfig?t.routeConfig.canDeactivate:null;if(!l||0===l.length)return Object(Fe.a)(!0);var r=tl.call(xs(l),function(l){var r,i=e.getToken(l,t);return r=Wd(i.canDeactivate?i.canDeactivate(n,t,e.curr,e.future):i(n,t,e.curr,e.future)),$e.call(r)});return dd.call(r,function(n){return!0===n})},n.prototype.runResolve=function(n,t){return Pe.call(this.resolveNode(n._resolve,n),function(e){return n._resolvedData=e,n.data=Object(i.__assign)({},n.data,Sh(n,t).resolve),null})},n.prototype.resolveNode=function(n,t){var e=this,l=Object.keys(n);if(0===l.length)return Object(Fe.a)({});if(1===l.length){var r=l[0];return Pe.call(this.getResolver(n[r],t),function(n){return(t={})[r]=n,t;var t})}var i={},o=tl.call(xs(l),function(l){return Pe.call(e.getResolver(n[l],t),function(n){return i[l]=n,n})});return Pe.call(hd.call(o),function(){return i})},n.prototype.getResolver=function(n,t){var e=this.getToken(n,t);return Wd(e.resolve?e.resolve(t,this.future):e(t,this.future))},n.prototype.getToken=function(n,t){var e=function(n){if(!n)return null;for(var t=n.parent;t;t=t.parent){var e=t.routeConfig;if(e&&e._loadedConfig)return e._loadedConfig}return null}(t);return(e?e.module.injector:this.moduleInjector).get(n)},n}(),qh=function(){},Jh=function(){function n(n,t,e,l,r){this.rootComponentType=n,this.config=t,this.urlTree=e,this.url=l,this.paramsInheritanceStrategy=r}return n.prototype.recognize=function(){try{var n=Xh(this.urlTree.root,[],[],this.config).segmentGroup,t=this.processSegmentGroup(this.config,n,Pd),e=new Oh([],Object.freeze({}),Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,{},Pd,this.rootComponentType,null,this.urlTree.root,-1,{}),l=new wh(e,t),r=new Th(this.url,l);return this.inheritParamsAndData(r._root),Object(Fe.a)(r)}catch(n){return new o.a(function(t){return t.error(n)})}},n.prototype.inheritParamsAndData=function(n){var t=this,e=n.value,l=Sh(e,this.paramsInheritanceStrategy);e.params=Object.freeze(l.params),e.data=Object.freeze(l.data),n.children.forEach(function(n){return t.inheritParamsAndData(n)})},n.prototype.processSegmentGroup=function(n,t,e){return 0===t.segments.length&&t.hasChildren()?this.processChildren(n,t):this.processSegment(n,t,t.segments,e)},n.prototype.processChildren=function(n,t){var e,l=this,r=Qd(t,function(t,e){return l.processSegmentGroup(n,t,e)});return e={},r.forEach(function(n){var t=e[n.value.outlet];if(t){var l=t.url.map(function(n){return n.toString()}).join("/"),r=n.value.url.map(function(n){return n.toString()}).join("/");throw new Error("Two segments cannot have the same outlet name: '"+l+"' and '"+r+"'.")}e[n.value.outlet]=n.value}),r.sort(function(n,t){return n.value.outlet===Pd?-1:t.value.outlet===Pd?1:n.value.outlet.localeCompare(t.value.outlet)}),r},n.prototype.processSegment=function(n,t,e,l){for(var r=0,i=n;r0?Fd(e).parameters:{};r=new Oh(e,a,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,np(n),l,n.component,n,Qh(t),Kh(t)+e.length,tp(n))}else{var u=function(n,t,e){if(""===t.path){if("full"===t.pathMatch&&(n.hasChildren()||e.length>0))throw new qh;return{consumedSegments:[],lastChild:0,parameters:{}}}var l=(t.matcher||Ed)(e,n,t);if(!l)throw new qh;var r={};Bd(l.posParams,function(n,t){r[t]=n.path});var o=l.consumed.length>0?Object(i.__assign)({},r,l.consumed[l.consumed.length-1].parameters):r;return{consumedSegments:l.consumed,lastChild:l.consumed.length,parameters:o}}(t,n,e);o=u.consumedSegments,s=e.slice(u.lastChild),r=new Oh(o,u.parameters,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,np(n),l,n.component,n,Qh(t),Kh(t)+o.length,tp(n))}var c=function(n){return n.children?n.children:n.loadChildren?n._loadedConfig.routes:[]}(n),d=Xh(t,o,s,c),h=d.segmentGroup,p=d.slicedSegments;if(0===p.length&&h.hasChildren()){var f=this.processChildren(c,h);return[new wh(r,f)]}if(0===c.length&&0===p.length)return[new wh(r,[])];var _=this.processSegment(c,h,p,Pd);return[new wh(r,_)]},n}();function Qh(n){for(var t=n;t._sourceSegment;)t=t._sourceSegment;return t}function Kh(n){for(var t=n,e=t._segmentIndexShift?t._segmentIndexShift:0;t._sourceSegment;)e+=(t=t._sourceSegment)._segmentIndexShift?t._segmentIndexShift:0;return e-1}function Xh(n,t,e,l){if(e.length>0&&function(n,t,e){return l.some(function(e){return Zh(n,t,e)&&$h(e)!==Pd})}(n,e)){var r=new Gd(t,function(n,t,e,l){var r={};r[Pd]=l,l._sourceSegment=n,l._segmentIndexShift=t.length;for(var i=0,o=e;i0)||"full"!==e.pathMatch)&&""===e.path&&void 0===e.redirectTo}function $h(n){return n.outlet||Pd}function np(n){return n.data||{}}function tp(n){return n.resolve||{}}var ep=function(){},lp=function(){function n(){}return n.prototype.shouldDetach=function(n){return!1},n.prototype.store=function(n,t){},n.prototype.shouldAttach=function(n){return!1},n.prototype.retrieve=function(n){return null},n.prototype.shouldReuseRoute=function(n,t){return n.routeConfig===t.routeConfig},n}(),rp=new l.r("ROUTES"),ip=function(){function n(n,t,e,l){this.loader=n,this.compiler=t,this.onLoadStartListener=e,this.onLoadEndListener=l}return n.prototype.load=function(n,t){var e=this;this.onLoadStartListener&&this.onLoadStartListener(t);var l=this.loadModuleFactory(t.loadChildren);return Pe.call(l,function(l){e.onLoadEndListener&&e.onLoadEndListener(t);var r=l.create(n);return new Yd(Nd(r.injector.get(rp)),r)})},n.prototype.loadModuleFactory=function(n){var t=this;return"string"==typeof n?Ui(this.loader.load(n)):tl.call(Wd(n()),function(n){return n instanceof l.x?Object(Fe.a)(n):Ui(t.compiler.compileModuleAsync(n))})},n}(),op=function(){},sp=function(){function n(){}return n.prototype.shouldProcessUrl=function(n){return!0},n.prototype.extract=function(n){return n},n.prototype.merge=function(n,t){return n},n}();function ap(n){throw n}function up(n){return Object(Fe.a)(null)}var cp=function(){function n(n,t,e,r,i,o,s,a){var u=this;this.rootComponentType=n,this.urlSerializer=t,this.rootContexts=e,this.location=r,this.config=a,this.navigations=new Tl(null),this.navigationId=0,this.events=new yl.a,this.errorHandler=ap,this.navigated=!1,this.hooks={beforePreactivation:up,afterPreactivation:up},this.urlHandlingStrategy=new sp,this.routeReuseStrategy=new lp,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.ngModule=i.get(l.z),this.resetConfig(a),this.currentUrlTree=new Ud(new Gd([],{}),{},null),this.rawUrlTree=this.currentUrlTree,this.configLoader=new ip(o,s,function(n){return u.triggerEvent(new kd(n))},function(n){return u.triggerEvent(new Cd(n))}),this.routerState=kh(this.currentUrlTree,this.rootComponentType),this.processNavigations()}return n.prototype.resetRootComponentType=function(n){this.rootComponentType=n,this.routerState.root.component=this.rootComponentType},n.prototype.initialNavigation=function(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})},n.prototype.setUpLocationChangeListener=function(){var n=this;this.locationSubscription||(this.locationSubscription=this.location.subscribe(Zone.current.wrap(function(t){var e=n.urlSerializer.parse(t.url),l="popstate"===t.type?"popstate":"hashchange";setTimeout(function(){n.scheduleNavigation(e,l,{replaceUrl:!0})},0)})))},Object.defineProperty(n.prototype,"url",{get:function(){return this.serializeUrl(this.currentUrlTree)},enumerable:!0,configurable:!0}),n.prototype.triggerEvent=function(n){this.events.next(n)},n.prototype.resetConfig=function(n){jd(n),this.config=n,this.navigated=!1},n.prototype.ngOnDestroy=function(){this.dispose()},n.prototype.dispose=function(){this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=null)},n.prototype.createUrlTree=function(n,t){void 0===t&&(t={});var e=t.relativeTo,r=t.queryParams,o=t.fragment,s=t.preserveQueryParams,a=t.queryParamsHandling,u=t.preserveFragment;Object(l.Y)()&&s&&console&&console.warn&&console.warn("preserveQueryParams is deprecated, use queryParamsHandling instead.");var c=e||this.routerState.root,d=u?this.currentUrlTree.fragment:o,h=null;if(a)switch(a){case"merge":h=Object(i.__assign)({},this.currentUrlTree.queryParams,r);break;case"preserve":h=this.currentUrlTree.queryParams;break;default:h=r||null}else h=s?this.currentUrlTree.queryParams:r||null;return null!==h&&(h=this.removeEmptyProps(h)),function(n,t,e,l,r){if(0===e.length)return Yh(t.root,t.root,t,l,r);var i=function(n){if("string"==typeof n[0]&&1===n.length&&"/"===n[0])return new jh(!0,0,n);var t=0,e=!1,l=n.reduce(function(n,l,r){if("object"==typeof l&&null!=l){if(l.outlets){var i={};return Bd(l.outlets,function(n,t){i[t]="string"==typeof n?n.split("/"):n}),n.concat([{outlets:i}])}if(l.segmentPath)return n.concat([l.segmentPath])}return"string"!=typeof l?n.concat([l]):0===r?(l.split("/").forEach(function(l,r){0==r&&"."===l||(0==r&&""===l?e=!0:".."===l?t++:""!=l&&n.push(l))}),n):n.concat([l])},[]);return new jh(e,t,l)}(e);if(i.toRoot())return Yh(t.root,new Gd([],{}),t,l,r);var o=function(n,e,l){if(n.isAbsolute)return new Ih(t.root,!0,0);if(-1===l.snapshot._lastPathIndex)return new Ih(l.snapshot._urlSegment,!0,0);var r=Eh(n.commands[0])?0:1;return function(t,e,i){for(var o=l.snapshot._urlSegment,s=l.snapshot._lastPathIndex+r,a=n.numberOfDoubleDots;a>s;){if(a-=s,!(o=o.parent))throw new Error("Invalid number of '../'");s=o.segments.length}return new Ih(o,!1,s-a)}()}(i,0,n),s=o.processChildren?Nh(o.segmentGroup,o.index,i.commands):Hh(o.segmentGroup,o.index,i.commands);return Yh(o.segmentGroup,s,t,l,r)}(c,this.currentUrlTree,n,h,d)},n.prototype.navigateByUrl=function(n,t){void 0===t&&(t={skipLocationChange:!1});var e=n instanceof Ud?n:this.parseUrl(n),l=this.urlHandlingStrategy.merge(e,this.rawUrlTree);return this.scheduleNavigation(l,"imperative",t)},n.prototype.navigate=function(n,t){return void 0===t&&(t={skipLocationChange:!1}),function(n){for(var t=0;t0?(this.currentQrContent+=n+"amount="+this.form.get("coins").value,n="&"):this.invalidCoins=!0);var e=this.form.get("hours").value;e&&(Number.parseInt(e).toString()===e&&Number.parseInt(e)>0?(this.currentQrContent+=n+"hours="+this.form.get("hours").value,n="&"):this.invalidHours=!0);var l=this.form.get("note").value;l&&(this.currentQrContent+=n+"message="+encodeURIComponent(l)),this.updateQrCode()},n.prototype.updateQrCode=function(){this.qr.nativeElement.innerHTML="",new QRCode(this.qr.nativeElement,{text:this.currentQrContent,width:this.defaultQrConfig.size,height:this.defaultQrConfig.size,colorDark:this.defaultQrConfig.colordark,colorLight:this.defaultQrConfig.colorlight,useSVG:this.defaultQrConfig.usesvg,correctLevel:QRCode.CorrectLevel[this.defaultQrConfig.level]})},n}(),Jp=function(){function n(n,t,e){var l=this;this.walletService=n,this.route=t,this.dialog=e,t.queryParams.subscribe(function(n){l.wallets=null,l.lastRouteParams=n,l.walletService.startDataRefreshSubscription()}),n.all().subscribe(function(){return l.loadData()})}return n.prototype.ngOnDestroy=function(){this.outputsSubscription.unsubscribe()},n.prototype.loadData=function(){var n=this,t=this.lastRouteParams.addr;this.outputsSubscription=this.walletService.outputsWithWallets().subscribe(function(e){n.wallets=e.map(function(n){return Object.assign({},n)}).map(function(n){return n.addresses=n.addresses.filter(function(n){if(n.outputs.length>0)return!t||n.address===t}),n}).filter(function(n){return n.addresses.length>0})})},n.prototype.showQrCode=function(n,t){n.stopPropagation(),qp.openDialog(this.dialog,{address:t})},n}(),Qp=function(n){function t(t,e){void 0===t&&(t=0),void 0===e&&(e=sl),n.call(this),this.period=t,this.scheduler=e,(!el(t)||t<0)&&(this.period=0),e&&"function"==typeof e.schedule||(this.scheduler=sl)}return Object(i.__extends)(t,n),t.create=function(n,e){return void 0===n&&(n=0),void 0===e&&(e=sl),new t(n,e)},t.dispatch=function(n){var t=n.subscriber,e=n.period;t.next(n.index),t.closed||(n.index+=1,this.schedule(n,e))},t.prototype._subscribe=function(n){var e=this.period;n.add(this.scheduler.schedule(t.dispatch,e,{index:0,subscriber:n,period:e}))},t}(o.a),Kp=function(){function n(n){this.blockchainService=n,this.subscriptionsGroup=[]}return n.prototype.ngOnInit=function(){var n=this;this.subscriptionsGroup.push(Qp.create(5e3).switchMap(function(){return n.blockchainService.lastBlock()}).subscribe(function(t){return n.block=t})),this.subscriptionsGroup.push(Qp.create(5e3).switchMap(function(){return n.blockchainService.coinSupply()}).subscribe(function(t){return n.coinSupply=t}))},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()})},n}(),Xp=function(){function n(n,t){this.data=n,this.dialogRef=t}return n.prototype.ngOnDestroy=function(){this.data.seed=null},n}(),Zp=function(){function n(n,t,e,l){var r=this;this.data=n,this.dialogRef=t,this.msgBarService=e,this.translateService=l,this.passwordSubmit=new yl.a,this.working=!1,this.subscriptions=[],this.data=Object.assign({confirm:!1,description:null,warning:!1,title:null,wallet:null},n||{}),this.translateService.get(["errors.incorrect-password","errors.api-disabled","errors.no-wallet"]).subscribe(function(n){r.errors=n})}return n.prototype.ngOnInit=function(){var n=this;this.form=new Fo({},this.validateForm.bind(this)),this.form.addControl("password",new No("")),this.form.addControl("confirm_password",new No("")),["password","confirm_password"].forEach(function(t){n.subscriptions.push(n.form.get(t).valueChanges.subscribe(function(){2===n.button.state&&n.button.resetState()}))}),this.data.confirm?this.form.get("confirm_password").enable():this.form.get("confirm_password").disable(),this.data.description&&this.dialogRef.updateSize("400px")},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.form.get("password").setValue(""),this.form.get("confirm_password").setValue(""),this.passwordSubmit.complete(),this.subscriptions.forEach(function(n){return n.unsubscribe()})},n.prototype.proceed=function(){this.form.valid&&!this.button.isLoading()&&(this.msgBarService.hide(),this.button.setLoading(),this.working=!0,this.passwordSubmit.next({password:this.form.get("password").value,close:this.close.bind(this),error:this.error.bind(this)}))},n.prototype.validateForm=function(){if(this.form&&this.form.get("password")&&this.form.get("confirm_password")){if(0===this.form.get("password").value.length)return{Required:!0};if(this.data.confirm&&this.form.get("password").value!==this.form.get("confirm_password").value)return{NotEqual:!0}}return null},n.prototype.close=function(){this.dialogRef.close()},n.prototype.error=function(n){if("object"==typeof n)if(n.status)switch(n.status){case 400:n=Oc(n._body);break;case 401:n=this.errors["errors.incorrect-password"];break;case 403:n=this.errors["errors.api-disabled"];break;case 404:n=this.errors["errors.no-wallet"];break;default:n=this.errors["errors.error-decrypting"]}else n=this.errors["errors.error-decrypting"];this.msgBarService.showError(n=n||this.errors["errors.error-decrypting"]),this.button.resetState(),this.working=!1},n}(),$p=function(){function n(n,t){this.walletService=n,this.dialog=t,this.wallets=[]}return n.prototype.ngOnInit=function(){var n=this;this.walletService.folder().subscribe(function(t){return n.folder=t}),this.walletSubscription=this.walletService.all().subscribe(function(t){n.wallets=t})},n.prototype.ngOnDestroy=function(){this.walletSubscription.unsubscribe()},Object.defineProperty(n.prototype,"onlyEncrypted",{get:function(){return this.wallets.filter(function(n){return n.encrypted})},enumerable:!0,configurable:!0}),n.prototype.showSeed=function(n){var t=this,e=new oa;e.data={wallet:n},this.dialog.open(Zp,e).componentInstance.passwordSubmit.subscribe(function(e){t.walletService.getWalletSeed(n,e.password).subscribe(function(n){e.close();var l=new oa;l.width="566px",l.data={seed:n},t.dialog.open(Xp,l)},function(n){return e.error(n)})})},n}(),nf=function(){function n(n,t){this.apiService=n,this.ngZone=t,this.noConnections=!1,this.automaticPeers=new Tl([]),this.loadData()}return n.prototype.automatic=function(){return this.automaticPeers.asObservable()},n.prototype.retrieveDefaultConnections=function(){return this.apiService.get("network/defaultConnections").map(function(n){return n.map(function(n,t){return{id:t+1,address:n,listen_port:6e3}})})},n.prototype.loadData=function(){var n=this;this.retrieveConnections().subscribe(function(t){return n.automaticPeers.next(t)}),this.ngZone.runOutsideAngular(function(){Qp.create(5e3).flatMap(function(){return n.retrieveConnections()}).subscribe(function(t){return n.ngZone.run(function(){n.automaticPeers.next(t)})})})},n.prototype.retrieveConnections=function(){var n=this;return this.apiService.get("network/connections").map(function(t){return null===t.connections||0===t.connections.length?(n.noConnections=!0,[]):(n.noConnections=!1,t.connections.sort(function(n,t){return n.id-t.id}))})},n}(),tf=function(){function n(n){this.networkService=n}return n.prototype.ngOnInit=function(){var n=this;this.subscription=this.networkService.retrieveDefaultConnections().subscribe(function(t){n.subscription=n.networkService.automatic().subscribe(function(e){n.peers=e.map(function(n){return n.source=t.find(function(t){return t.address===n.address})?"default":"exchange",n}).sort(function(n,t){return n.address.localeCompare(t.address)})})})},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n}(),ef=function(){function n(n,t){this.httpClient=n,this.walletService=t,this.configSubject=new Tl(null),this.purchaseOrders=new Tl([]),this.purchaseUrl=r.tellerUrl,this.getConfig()}return n.prototype.all=function(){return this.purchaseOrders.asObservable()},n.prototype.config=function(){return this.configSubject.asObservable()},n.prototype.getConfig=function(){var n=this;return this.get("config").map(function(n){return{enabled:!0,sky_btc_exchange_rate:parseFloat(n.sky_btc_exchange_rate)}}).subscribe(function(t){return n.configSubject.next(t)})},n.prototype.generate=function(n){var t=this;return this.walletService.addAddress(n,1).flatMap(function(e){return t.post("bind",{skyaddr:e[0].address,coin_type:"BTC"}).map(function(t){return{coin_type:t.coin_type,deposit_address:t.deposit_address,filename:n.filename,recipient_address:e[0].address,status:"waiting_deposit"}})})},n.prototype.scan=function(n){return this.get("status?skyaddr="+n).map(function(n){if(!n.statuses||n.statuses.length>1)throw new Error("too many purchase orders found");return n.statuses[0]})},n.prototype.get=function(n){return this.httpClient.get(this.purchaseUrl+n)},n.prototype.post=function(n,t){return void 0===t&&(t={}),this.httpClient.post(this.purchaseUrl+n,t)},n}(),lf=function(){function n(n,t,e,l){this.formBuilder=n,this.purchaseService=t,this.msgBarService=e,this.walletService=l,this.subscriptionsGroup=[]}return n.prototype.ngOnInit=function(){this.initForm(),this.loadData()},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()})},n.prototype.checkStatus=function(){var n=this;this.button.setLoading(),this.purchaseService.scan(this.order.recipient_address).subscribe(function(t){n.button.setSuccess(),n.order.status=t.status},function(t){return n.button.setError(t)})},n.prototype.removeOrder=function(){window.localStorage.removeItem("purchaseOrder"),this.order=null},n.prototype.initForm=function(){var n=this;this.form=this.formBuilder.group({wallet:["",Xi.required]}),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){var e=n.wallets.find(function(n){return n.filename===t});console.log("changing wallet value",t),n.purchaseService.generate(e).subscribe(function(t){return n.saveData(t)},function(t){return n.msgBarService.showError(t.toString())})}))},n.prototype.loadConfig=function(){var n=this;this.purchaseService.config().filter(function(n){return!!n&&!!n.sky_btc_exchange_rate}).first().subscribe(function(t){return n.config=t})},n.prototype.loadData=function(){var n=this;this.loadConfig(),this.loadOrder(),this.subscriptionsGroup.push(this.walletService.all().subscribe(function(t){n.wallets=t,n.order&&n.form.get("wallet").setValue(n.order.filename,{emitEvent:!1})}))},n.prototype.loadOrder=function(){var n=JSON.parse(window.localStorage.getItem("purchaseOrder"));n&&(this.order=n,this.updateOrder())},n.prototype.saveData=function(n){this.order=n,window.localStorage.setItem("purchaseOrder",JSON.stringify(n))},n.prototype.updateOrder=function(){var n=this;this.purchaseService.scan(this.order.recipient_address).first().subscribe(function(t){return n.order.status=t.status},function(n){return console.log(n)})},n}(),rf=function(){function n(n,t){this.http=n,this.ngZone=t,this.PRICE_API_ID="sky-skycoin",this.price=new Tl(null),this.updatePeriod=6e5,this.startTimer()}return n.prototype.startTimer=function(n){var t=this;void 0===n&&(n=0),this.timerSubscriptions&&this.timerSubscriptions.forEach(function(n){return n.unsubscribe()}),this.timerSubscriptions=[],this.ngZone.runOutsideAngular(function(){t.timerSubscriptions.push(o.a.timer(t.updatePeriod,t.updatePeriod).subscribe(function(){t.ngZone.run(function(){return t.lastPriceSubscription?null:t.loadPrice()})}))}),this.timerSubscriptions.push(o.a.of(1).delay(n).subscribe(function(){t.ngZone.run(function(){return t.loadPrice()})}))},n.prototype.loadPrice=function(){var n=this;this.PRICE_API_ID&&(this.lastPriceSubscription&&this.lastPriceSubscription.unsubscribe(),this.lastPriceSubscription=this.http.get("https://api.coinpaprika.com/v1/tickers/"+this.PRICE_API_ID+"?quotes=USD").subscribe(function(t){n.lastPriceSubscription=null,n.price.next(t.quotes.USD.price)},function(){return n.startTimer(3e4)}))},n}(),of=function(){function n(n,t){this.transaction=n,this.dialogRef=t}return n.prototype.closePopup=function(){this.dialogRef.close()},n}(),sf=function(){function n(n,t,e,l,r){var i=this;this.dialog=n,this.priceService=t,this.walletService=e,this.formBuilder=l,this.transactionsLoaded=!1,this.form=this.formBuilder.group({filter:[[]]}),this.routeSubscription=r.queryParams.subscribe(function(n){i.requestedAddress=n.addr?n.addr:"",i.showRequestedAddress()}),this.walletsSubscription=e.all().delay(1).flatMap(function(n){if(i.wallets)return i.walletService.transactions().first();i.wallets=[];var t=!1;return n.forEach(function(n){n.coins&&n.hours&&!t?(i.wallets.push({label:n.label,coins:n.coins.decimalPlaces(6).toString(),hours:n.hours.decimalPlaces(0).toString(),addresses:[],allAddressesSelected:!1}),n.addresses.forEach(function(n){n.coins&&n.hours&&!t?i.wallets[i.wallets.length-1].addresses.push({address:n.address,coins:n.coins.decimalPlaces(6).toString(),hours:n.hours.decimalPlaces(0).toString(),showingWholeWallet:!1}):t=!0})):t=!0}),t?(i.wallets=null,o.a.of(null)):i.walletService.transactions().first()}).subscribe(function(n){n&&(i.allTransactions=n,i.transactionsLoaded=!0,i.showRequestedAddress(),i.filterTransactions())})}return n.prototype.ngOnInit=function(){var n=this;this.priceSubscription=this.priceService.price.subscribe(function(t){return n.price=t}),this.filterSubscription=this.form.get("filter").valueChanges.subscribe(function(){return n.filterTransactions()})},n.prototype.ngOnDestroy=function(){this.priceSubscription.unsubscribe(),this.filterSubscription.unsubscribe(),this.walletsSubscription.unsubscribe(),this.routeSubscription.unsubscribe()},n.prototype.showTransaction=function(n){var t=new oa;t.width="800px",t.data=n,this.dialog.open(of,t)},n.prototype.showQrCode=function(n,t){n.stopPropagation(),qp.openDialog(this.dialog,{address:t})},n.prototype.removeFilters=function(){this.form.get("filter").setValue([])},n.prototype.filterTransactions=function(){var n=this.form.get("filter").value;if(this.wallets.forEach(function(n){n.allAddressesSelected=!1,n.addresses.forEach(function(n){return n.showingWholeWallet=!1})}),0===n.length)this.transactions=this.allTransactions;else{var t=new Map;n.forEach(function(n){n.addresses?(n.addresses.forEach(function(n){return t.set(n.address,!0)}),n.allAddressesSelected=!0,n.addresses.forEach(function(n){return n.showingWholeWallet=!0})):t.set(n.address,!0)}),this.transactions=this.allTransactions.filter(function(n){return n.inputs.some(function(n){return t.has(n.owner)})||n.outputs.some(function(n){return t.has(n.dst)})})}},n.prototype.showRequestedAddress=function(){var n,t=this;this.transactionsLoaded&&this.wallets&&0!==this.wallets.length&&null!==this.requestedAddress&&void 0!==this.requestedAddress&&(""!==this.requestedAddress?(this.wallets.forEach(function(e){var l=e.addresses.find(function(n){return n.address===t.requestedAddress});l&&(n=l)}),n&&this.form.get("filter").setValue([n])):this.form.get("filter").setValue([]),this.requestedAddress=null)},n}(),af=function(){function n(n,t){this.walletService=n,this.router=t}return n.prototype.canActivate=function(n,t){var e=this;return new Promise(function(n){e.walletService.all().first().subscribe(function(t){return 0===t.length?(e.router.navigate(["/wizard"]),n(!1)):n(!0)})})},n}(),uf=function(){function n(n){this.formBuilder=n,this.onPasswordCreated=new l.o,this.onBack=new l.o}return n.prototype.ngOnInit=function(){this.initEncryptForm()},n.prototype.initEncryptForm=function(){this.form=this.formBuilder.group({password:new No("",Xi.compose([Xi.required,Xi.minLength(2)])),confirm:new No("",Xi.compose([Xi.required,Xi.minLength(2)]))},{validator:this.passwordMatchValidator.bind(this)})},n.prototype.setEncrypt=function(n){n.checked?this.form.enable():this.form.disable()},n.prototype.emitCreatedPassword=function(){this.form.enabled&&!this.form.valid||this.button.isLoading()||(this.button.setLoading(),this.onPasswordCreated.emit(this.form.enabled?this.form.get("password").value:null))},n.prototype.emitBack=function(){this.onBack.emit()},n.prototype.resetButton=function(){this.button.resetState()},Object.defineProperty(n.prototype,"isWorking",{get:function(){return this.button.isLoading()},enumerable:!0,configurable:!0}),n.prototype.passwordMatchValidator=function(n){return n.get("password").value===n.get("confirm").value?null:{mismatch:!0}},n}(),cf=function(){function n(n,t,e,l,r){this.router=n,this.walletService=t,this.languageService=e,this.dialog=l,this.msgBarService=r,this.step=1}return n.prototype.ngOnInit=function(){var n=this;this.subscription=this.languageService.currentLanguage.subscribe(function(t){return n.language=t})},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n.prototype.onLabelAndSeedCreated=function(n){this.formData=n,this.step=2},n.prototype.onPasswordCreated=function(n){this.password=n,this.createWallet()},n.prototype.onBack=function(){this.step=1},n.prototype.changelanguage=function(){var n=this;zc(this.dialog).subscribe(function(t){t&&n.languageService.changeLanguage(t)})},Object.defineProperty(n.prototype,"fill",{get:function(){return this.formData},enumerable:!0,configurable:!0}),n.prototype.createWallet=function(){var n=this;this.walletService.create(this.formData.label,this.formData.seed,100,this.password).subscribe(function(){n.router.navigate(["/wallets"])},function(t){n.msgBarService.showError(t),n.encryptForm.resetButton()})},n}(),df=function(){function n(n,t,e,l,r){var i=this;this.formBuilder=n,this.route=t,this.router=e,this.walletService=l,this.msgBarService=r,this.done=!1,this.hideBarWhenClosing=!0,this.initForm(""),this.subscription=o.a.zip(this.route.params,this.walletService.all(),function(n,t){var e=t.find(function(t){return t.filename===n.id});e?(i.wallet=e,i.initForm(e.label)):setTimeout(function(){return i.router.navigate([""],{skipLocationChange:!0})})}).subscribe()}return n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe(),this.hideBarWhenClosing&&this.msgBarService.hide()},n.prototype.initForm=function(n){var t=[];t.push(this.passwordMatchValidator.bind(this)),this.form=new Fo({},t),this.form.addControl("wallet",new No(n)),this.form.addControl("seed",new No("",[Xi.required])),this.form.addControl("password",new No),this.form.addControl("confirm",new No)},n.prototype.reset=function(){var n=this;!this.form.valid||this.resetButton.isLoading()||this.done||(this.msgBarService.hide(),this.resetButton.setLoading(),this.walletService.resetPassword(this.wallet,this.form.value.seed,""!==this.form.value.password?this.form.value.password:null).subscribe(function(){n.resetButton.setSuccess(),n.resetButton.setDisabled(),n.done=!0,n.hideBarWhenClosing=!1,n.msgBarService.showDone("reset.done"),setTimeout(function(){n.router.navigate([""])},2e3)},function(t){n.resetButton.resetState(),n.msgBarService.showError(t)}))},n.prototype.passwordMatchValidator=function(){return this.form&&this.form.get("password")&&this.form.get("confirm")&&this.form.get("password").value===this.form.get("confirm").value?null:{NotEqual:!0}},n}();o.a.prototype.repeatWhen=function(n){return function(n){return function(t){return t.lift(new fc(n))}}(n)(this)};var hf=this&&this.__assign||Object.assign||function(n){for(var t,e=1,l=arguments.length;e-1},n.prototype.post=function(n,t,e){var l=this;return this.http.post(this.buildUrl(n),t,{responseType:"json",headers:new Ma(hf({"api-key":this.API_KEY,Accept:"application/json"},e))}).catch(function(n){return l.apiService.processConnectionError(n)})},n.prototype.buildUrl=function(n){return this.TEST_MODE&&"trading_pairs"!==n?this.API_ENDPOINT+"sandbox/"+n:this.API_ENDPOINT+"/"+n},n.prototype.storeOrder=function(n,t){var e=this;return this.history().catch(function(n){try{if(n._body){var t=JSON.parse(n._body);if(t&&t.error&&404===t.error.code)return o.a.of([])}}catch(n){}return o.a.throw(n)}).flatMap(function(l){return e.storeOrderEntry(l,n,t)})},n.prototype.storeOrderEntry=function(n,t,e){var l={id:t.id,pair:t.pair,fromAmount:t.fromAmount,toAmount:t.toAmount,address:t.toAddress,timestamp:zp().unix(),price:e};n.push(l);var r=JSON.stringify(n);return n.pop(),this.storageService.store(ec.CLIENT,this.STORAGE_KEY,r).do(function(){return n.push(l)})},n}(),ff=function(){function n(n,t,e){this.dialogRef=n,this.blockchainService=t,this.exchangeService=e}return n.prototype.ngOnInit=function(){var n=this;this.exchangeService.history().subscribe(function(t){return n.orders=t.reverse()},function(){return n.orders=[]})},n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.select=function(n){this.dialogRef.close(n)},n.prototype.getFromCoin=function(n){return n.split("/")[0].toUpperCase()},n.prototype.getToCoin=function(n){return n.split("/")[1].toUpperCase()},n}(),_f=function(){function n(n,t){this.exchangeService=n,this.dialog=t,this.hasHistory=!1,this.loading=!0}return n.prototype.ngOnInit=function(){var n=this;this.lastViewedSubscription=this.exchangeService.lastViewedOrderLoaded.subscribe(function(t){if(t){var e=n.exchangeService.lastViewedOrder;e&&(n.currentOrderDetails=e),setTimeout(function(){return n.lastViewedSubscription.unsubscribe()}),n.loading=!1}}),this.historySubscription=this.exchangeService.history().subscribe(function(){return n.hasHistory=!0})},n.prototype.ngOnDestroy=function(){this.lastViewedSubscription.unsubscribe(),this.historySubscription.unsubscribe()},n.prototype.showStatus=function(n){this.currentOrderDetails=n,this.hasHistory=!0},n.prototype.showHistory=function(n){var t=this;n.preventDefault();var e=new oa;e.width="566px",e.autoFocus=!1,this.dialog.open(ff,e).afterClosed().subscribe(function(n){n&&(t.currentOrderDetails=n)})},n.prototype.goBack=function(){this.currentOrderDetails=null,this.exchangeService.lastViewedOrder=null},n}(),mf=function(){};o.a.prototype.takeWhile=function(n){return function(n){return function(t){return t.lift(new vc(n))}}(n)(this)};var gf=function(){function n(n,t){this.apiService=n,this.http=t,this.fullCoinName=" ",this.coinName=" ",this.hoursName=" ",this.hoursNameSingular=" ",this.explorerUrl=" ",this.burnRateInternal=new Ee.a(.5),this.updateAvailableInternal=!1,this.lastestVersionInternal=""}return Object.defineProperty(n.prototype,"burnRate",{get:function(){return this.burnRateInternal},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"updateAvailable",{get:function(){return this.updateAvailableInternal},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"lastestVersion",{get:function(){return this.lastestVersionInternal},enumerable:!0,configurable:!0}),n.prototype.testBackend=function(){var n=this;this.apiService.get("health").subscribe(function(t){n.version=t.version,n.detectUpdateAvailable(),n.burnRateInternal=new Ee.a(t.user_verify_transaction.burn_factor),n.fullCoinName=t.fiber.display_name,n.coinName=t.fiber.ticker,n.hoursName=t.fiber.coin_hours_display_name,n.hoursNameSingular=t.fiber.coin_hours_display_name_singular,n.explorerUrl=t.fiber.explorer_url,n.explorerUrl.endsWith("/")&&(n.explorerUrl=n.explorerUrl.substr(0,n.explorerUrl.length-1)),t.csrf_enabled||(n.error=3)},function(){return n.error=2})},n.prototype.detectUpdateAvailable=function(){var n=this;Ll.urlForVersionChecking&&this.http.get(Ll.urlForVersionChecking).retryWhen(function(n){return n.delay(3e4)}).subscribe(function(t){n.lastestVersionInternal=t.text().trim(),n.lastestVersionInternal.startsWith("v")&&(n.lastestVersionInternal=n.lastestVersionInternal.substr(1)),n.updateAvailableInternal=function(t,e){for(var l=n.lastestVersionInternal.split("."),r=t.split("-"),i=r[0].split("."),o=0;o<3;o++){var s=Number(l[o]),a=Number(i[o]);if(s>a)return!0;if(s0&&t<10?this.addNumber(t.toString()):8===n.keyCode?this.removeNumber():13===n.keyCode&&this.sendPin()},t.prototype.addNumber=function(n){var t=this.form.value.pin;t.length<8&&this.form.get("pin").setValue(t+n)},t.prototype.removeNumber=function(){var n=this.form.value.pin;this.form.get("pin").setValue(n.substring(0,n.length-1))},t.prototype.sendPin=function(){this.form.valid&&this.dialogRef.close(this.form.value.pin)},t}(Kc),vf=function(n){function t(t,e,l){var r=n.call(this,l,e)||this;return r.data=t,r.dialogRef=e,r}return Object(i.__extends)(t,n),t}(Kc),wf=function(){function n(n,t,e,l,r,i,o,s,a){this.appService=n,this.languageService=t,this.bip38WordList=o,this.dialog=s,this.msgBarService=a,r.requestPinComponent=bf,i.requestWordComponent=Hc,l.signTransactionConfirmationComponent=vf,e.initialLoadFailed.subscribe(function(n){n&&window.location.assign("assets/error-alert/index.html?2")})}return n.prototype.ngOnInit=function(){var n=this;this.appService.testBackend(),this.languageService.loadLanguageSettings();var t=this.languageService.selectedLanguageLoaded.subscribe(function(e){e||zc(n.dialog,!0).subscribe(function(t){t&&n.languageService.changeLanguage(t)}),t.unsubscribe(),n.msgBarService.msgBarComponent=n.msgBar})},n}(),xf=l._7({encapsulation:2,styles:[".mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);display:block;padding:24px;border-radius:2px;box-sizing:border-box;overflow:auto;outline:0;width:100%;height:100%}@media screen and (-ms-high-contrast:active){.mat-dialog-container{outline:solid 1px}}.mat-dialog-content{display:block;margin:0 -24px;padding:0 24px;max-height:65vh;overflow:auto;-webkit-overflow-scrolling:touch;-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-dialog-title{margin:0 0 20px;display:block}.mat-dialog-actions{padding:12px 0;display:flex;flex-wrap:wrap}.mat-dialog-actions:last-child{margin-bottom:-24px}.mat-dialog-actions[align=end]{justify-content:flex-end}.mat-dialog-actions[align=center]{justify-content:center}.mat-dialog-actions .mat-button+.mat-button,.mat-dialog-actions .mat-button+.mat-raised-button,.mat-dialog-actions .mat-raised-button+.mat-button,.mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:8px}[dir=rtl] .mat-dialog-actions .mat-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-button+.mat-raised-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:0;margin-right:8px}"],data:{animation:[{type:7,name:"slideDialog",definitions:[{type:0,name:"enter",styles:{type:6,styles:{transform:"none",opacity:1},offset:null},options:void 0},{type:0,name:"void",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0) scale(0.9)",opacity:0},offset:null},options:void 0},{type:0,name:"exit",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0)",opacity:0},offset:null},options:void 0},{type:1,expr:"* => *",animation:{type:4,styles:null,timings:"400ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null}],options:{}}]}});function Mf(n){return l._33(0,[(n()(),l._4(0,null,null,0))],null,null)}function kf(n){return l._33(0,[l._29(402653184,1,{_portalOutlet:0}),(n()(),l._4(16777216,null,null,1,null,Mf)),l._8(2,212992,[[1,4]],0,oi,[l.j,l.R],{portal:[0,"portal"]},null)],function(n,t){n(t,2,0,"")},null)}var Cf=l._5("mat-dialog-container",aa,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-dialog-container",[["class","mat-dialog-container"],["tabindex","-1"]],[[1,"role",0],[1,"aria-labelledby",0],[1,"aria-label",0],[1,"aria-describedby",0],[40,"@slideDialog",0]],[["component","@slideDialog.start"],["component","@slideDialog.done"]],function(n,t,e){var r=!0;return"component:@slideDialog.start"===t&&(r=!1!==l._22(n,1)._onAnimationStart(e)&&r),"component:@slideDialog.done"===t&&(r=!1!==l._22(n,1)._onAnimationDone(e)&&r),r},kf,xf)),l._8(1,49152,null,0,aa,[l.l,kr,l.h,[2,sn]],null,null)],null,function(n,t){n(t,0,0,null==l._22(t,1)._config?null:l._22(t,1)._config.role,null!=l._22(t,1)._config&&l._22(t,1)._config.ariaLabel?null:l._22(t,1)._ariaLabelledBy,null==l._22(t,1)._config?null:l._22(t,1)._config.ariaLabel,(null==l._22(t,1)._config?null:l._22(t,1)._config.ariaDescribedBy)||null,l._22(t,1)._state)})},{},{},[]),Sf=l._7({encapsulation:2,styles:[".mat-tooltip-panel{pointer-events:none!important}.mat-tooltip{color:#fff;border-radius:2px;margin:14px;max-width:250px;padding-left:8px;padding-right:8px}@media screen and (-ms-high-contrast:active){.mat-tooltip{outline:solid 1px}}"],data:{animation:[{type:7,name:"state",definitions:[{type:0,name:"initial, void, hidden",styles:{type:6,styles:{transform:"scale(0)"},offset:null},options:void 0},{type:0,name:"visible",styles:{type:6,styles:{transform:"scale(1)"},offset:null},options:void 0},{type:1,expr:"* => visible",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.0, 0.0, 0.2, 1)"},options:null},{type:1,expr:"* => hidden",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.4, 0.0, 1, 1)"},options:null}],options:{}}]}});function Of(n){return l._33(2,[(n()(),l._9(0,0,null,null,2,"div",[["class","mat-tooltip"]],[[4,"transform-origin",null],[24,"@state",0]],[[null,"@state.start"],[null,"@state.done"]],function(n,t,e){var l=!0,r=n.component;return"@state.start"===t&&(l=!1!==r._animationStart()&&l),"@state.done"===t&&(l=!1!==r._animationDone(e)&&l),l},null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(n()(),l._31(2,null,["",""]))],function(n,t){n(t,1,0,"mat-tooltip",t.component.tooltipClass)},function(n,t){var e=t.component;n(t,0,0,e._transformOrigin,e._visibility),n(t,2,0,e.message)})}var Tf=l._5("mat-tooltip-component",Ru,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-tooltip-component",[["aria-hidden","true"]],[[4,"zoom",null]],[["body","click"]],function(n,t,e){var r=!0;return"body:click"===t&&(r=!1!==l._22(n,1)._handleBodyInteraction()&&r),r},Of,Sf)),l._8(1,49152,null,0,Ru,[l.h],null,null)],null,function(n,t){n(t,0,0,"visible"===l._22(t,1)._visibility?1:null)})},{},{},[]),Lf=l._7({encapsulation:2,styles:[".mat-progress-spinner{display:block;position:relative}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate]{animation:mat-progress-spinner-linear-rotate 2s linear infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4s;animation-timing-function:cubic-bezier(.35,0,.25,1);animation-iteration-count:infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate]{animation:mat-progress-spinner-stroke-rotate-fallback 10s cubic-bezier(.87,.03,.33,1) infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.60617px;transform:rotate(0)}12.5%{stroke-dashoffset:56.54867px;transform:rotate(0)}12.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(72.5deg)}25.1%{stroke-dashoffset:268.60617px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.54867px;transform:rotate(270deg)}37.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(161.5deg)}50.01%{stroke-dashoffset:268.60617px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.54867px;transform:rotate(180deg)}62.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(251.5deg)}75.01%{stroke-dashoffset:268.60617px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.54867px;transform:rotate(90deg)}87.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}"],data:{}});function Pf(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,":svg:svg",[["focusable","false"],["preserveAspectRatio","xMidYMid meet"]],[[4,"width","px"],[4,"height","px"],[1,"viewBox",0]],null,null,null,null)),(n()(),l._9(1,0,null,null,0,":svg:circle",[["cx","50%"],["cy","50%"]],[[1,"r",0],[4,"animation-name",null],[4,"stroke-dashoffset","px"],[4,"stroke-dasharray","px"],[4,"stroke-width","%"]],null,null,null,null))],null,function(n,t){var e=t.component;n(t,0,0,e._elementSize,e._elementSize,e._viewBox),n(t,1,0,e._circleRadius,"mat-progress-spinner-stroke-rotate-"+e.diameter,e._strokeDashOffset,e._strokeCircumference,e._circleStrokeWidth)})}var Df=l._7({encapsulation:2,styles:[".mat-menu-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh - 48px);border-radius:2px;outline:0}.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:left top}.mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:right top}.mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:right top}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:left top}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.ng-animating{pointer-events:none}@media screen and (-ms-high-contrast:active){.mat-menu-panel{outline:solid 1px}}.mat-menu-content{padding-top:8px;padding-bottom:8px}.mat-menu-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative}.mat-menu-item[disabled]{cursor:default}[dir=rtl] .mat-menu-item{text-align:right}.mat-menu-item .mat-icon{margin-right:16px}[dir=rtl] .mat-menu-item .mat-icon{margin-left:16px;margin-right:0}.mat-menu-item .mat-icon{vertical-align:middle}.mat-menu-item-submenu-trigger{padding-right:32px}.mat-menu-item-submenu-trigger::after{width:0;height:0;border-style:solid;border-width:5px 0 5px 5px;border-color:transparent transparent transparent currentColor;content:'';display:inline-block;position:absolute;top:50%;right:16px;transform:translateY(-50%)}[dir=rtl] .mat-menu-item-submenu-trigger{padding-right:8px;padding-left:32px}[dir=rtl] .mat-menu-item-submenu-trigger::after{right:auto;left:16px;transform:rotateY(180deg) translateY(-50%)}button.mat-menu-item{width:100%}.mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}"],data:{animation:[{type:7,name:"transformMenu",definitions:[{type:0,name:"void",styles:{type:6,styles:{opacity:0,transform:"scale(0.01, 0.01)"},offset:null},options:void 0},{type:0,name:"enter-start",styles:{type:6,styles:{opacity:1,transform:"scale(1, 0.5)"},offset:null},options:void 0},{type:0,name:"enter",styles:{type:6,styles:{transform:"scale(1, 1)"},offset:null},options:void 0},{type:1,expr:"void => enter-start",animation:{type:4,styles:null,timings:"100ms linear"},options:null},{type:1,expr:"enter-start => enter",animation:{type:4,styles:null,timings:"300ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null},{type:1,expr:"* => void",animation:{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"150ms 50ms linear"},options:null}],options:{}},{type:7,name:"fadeInItems",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function Af(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[["class","mat-menu-panel"],["role","menu"],["tabindex","-1"]],[[24,"@transformMenu",0]],[[null,"keydown"],[null,"click"],[null,"@transformMenu.done"]],function(n,t,e){var l=!0,r=n.component;return"keydown"===t&&(l=!1!==r._handleKeydown(e)&&l),"click"===t&&(l=!1!==r.closed.emit("click")&&l),"@transformMenu.done"===t&&(l=!1!==r._onAnimationDone(e)&&l),l},null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-menu-content"]],[[24,"@fadeInItems",0]],null,null,null,null)),l._21(null,0)],function(n,t){n(t,1,0,"mat-menu-panel",t.component._classList)},function(n,t){n(t,0,0,t.component._panelAnimationState),n(t,2,0,"showing")})}function Ef(n){return l._33(2,[l._29(402653184,1,{templateRef:0}),(n()(),l._4(0,[[1,2]],null,0,null,Af))],null,null)}var Yf=l._7({encapsulation:2,styles:[],data:{}});function jf(n){return l._33(2,[l._21(null,0),(n()(),l._9(1,0,null,null,1,"div",[["class","mat-menu-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(2,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(n,t){var e=t.component;n(t,2,0,e.disableRipple||e.disabled,e._getHostElement())},function(n,t){n(t,1,0,l._22(t,2).unbounded)})}var If=function(){function n(n,t,e){this.decimalPipe=n,this.blockchainService=t,this.appService=e}return n.prototype.transform=function(n,t,e){void 0===t&&(t=!0),void 0===e&&(e="");var l="";return"last"!==e&&(l=this.decimalPipe.transform(n,t?"1.0-"+this.blockchainService.currentMaxDecimals:"1.0-0"),"first"!==e&&(l+=" ")),"first"!==e&&(l+=t?this.appService.coinName:1===Number(n)||-1===Number(n)?this.appService.hoursNameSingular:this.appService.hoursName),l},n}(),Rf=l._7({encapsulation:2,styles:[".mat-icon{background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}"],data:{}});function Hf(n){return l._33(2,[l._21(null,0)],null,null)}var Nf=function(){function n(n,t,e){this.data=n,this.dialogRef=t,this.msgBarService=e}return n.prototype.ngOnInit=function(){this.form=new Fo({}),this.form.addControl("quantity",new No(1,[this.validateQuantity]))},n.prototype.ngOnDestroy=function(){this.msgBarService.hide()},n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.continue=function(){var n=this;this.button.isLoading()||(this.msgBarService.hide(),this.button.setLoading(),this.data(this.form.value.quantity,function(t,e){void 0===e&&(e=!1),n.button.resetState(),e?n.msgBarService.showError("wallet.add-addresses.error"):t&&n.closePopup()}))},n.prototype.validateQuantity=function(n){return n.value<1||n.value>100||Number(n.value)!==Math.round(Number(n.value))?{invalid:!0}:null},n}(),Ff=function(n){function t(t,e,l,r){var i=n.call(this,l,e)||this;return i.data=t,i.dialogRef=e,i.hwWalletService=l,i.walletService=r,i.operationSubscription=i.hwWalletService.confirmAddress(t.addressIndex).subscribe(function(){i.showResult({text:t.showCompleteConfirmation?"hardware-wallet.confirm-address.confirmation":"hardware-wallet.confirm-address.short-confirmation",icon:i.msgIcons.Success}),i.data.address.confirmed=!0,i.walletService.saveHardwareWallets()},function(n){return i.processResult(n.result)}),i}return Object(i.__extends)(t,n),t}(Kc),Bf=function(){function n(n,t,e,l,r,i,o){this.dialog=n,this.walletService=t,this.msgBarService=e,this.hwWalletService=l,this.translateService=r,this.router=i,this.apiService=o,this.confirmingIndex=null,this.creatingAddress=!1,this.preparingToEdit=!1}return n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.editSubscription&&this.editSubscription.unsubscribe(),this.confirmSubscription&&this.confirmSubscription.unsubscribe(),this.txHistorySubscription&&this.txHistorySubscription.unsubscribe()},n.prototype.editWallet=function(){var n=this;if(this.msgBarService.hide(),this.wallet.isHardware){if(this.preparingToEdit)return;this.preparingToEdit=!0,this.editSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).flatMap(function(){return n.walletService.getHwFeaturesAndUpdateData(n.wallet)}).subscribe(function(t){n.continueEditWallet(),n.preparingToEdit=!1,t.walletNameUpdated&&n.msgBarService.showWarning("hardware-wallet.general.name-updated")},function(t){n.msgBarService.showError(Tc(n.translateService,t)),n.preparingToEdit=!1})}else this.continueEditWallet()},n.prototype.newAddress=function(){var n=this;if(!this.creatingAddress)if(this.wallet.isHardware&&this.wallet.addresses.length>=Ll.maxHardwareWalletAddresses)Wc(this.dialog,{text:"wallet.max-hardware-wallets-error",headerText:"errors.error",confirmButtonText:"confirmation.close"});else if(this.msgBarService.hide(),this.wallet.isHardware)this.howManyAddresses=1,this.continueNewAddress();else{var t=new oa;t.width="566px",t.data=function(t,e){n.howManyAddresses=t;var l=0;n.wallet.addresses.forEach(function(n,t){n.coins.isGreaterThan(0)&&(l=t)}),n.wallet.addresses.length-(l+1)+t<20?(e(!0),n.continueNewAddress()):n.txHistorySubscription=n.apiService.getTransactions(n.wallet.addresses).first().subscribe(function(l){var r=new Map;l.forEach(function(n){n.outputs.forEach(function(n){r.has(n.dst)||r.set(n.dst,!0)})});var i=0;n.wallet.addresses.forEach(function(n,t){r.has(n.address)&&(i=t)}),n.wallet.addresses.length-(i+1)+t<20?(e(!0),n.continueNewAddress()):Wc(n.dialog,{text:"wallet.add-many-confirmation",headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"}).afterClosed().subscribe(function(t){t?(e(!0),n.continueNewAddress()):e(!1)})},function(){return e(!1,!0)})},this.dialog.open(Nf,t)}},n.prototype.toggleEmpty=function(){this.wallet.hideEmpty=!this.wallet.hideEmpty},n.prototype.deleteWallet=function(){var n=this;this.msgBarService.hide();var t={text:this.translateService.instant("wallet.delete-confirmation",{name:this.wallet.label}),headerText:"confirmation.header-text",checkboxText:"wallet.delete-confirmation-check",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"};Wc(this.dialog,t).afterClosed().subscribe(function(t){t&&n.walletService.deleteHardwareWallet(n.wallet).subscribe(function(t){t&&n.walletService.all().first().subscribe(function(t){0===t.length&&setTimeout(function(){return n.router.navigate(["/wizard"])},500)})})})},n.prototype.toggleEncryption=function(){var n=this,t=new oa;t.data={confirm:!this.wallet.encrypted,title:this.wallet.encrypted?"wallet.decrypt":"wallet.encrypt"},this.wallet.encrypted?(t.data.description="wallet.decrypt-warning",t.data.warning=!0,t.data.wallet=this.wallet):t.data.description="wallet.new.encrypt-warning",this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.walletService.toggleEncryption(n.wallet,t.password).subscribe(function(){t.close(),setTimeout(function(){return n.msgBarService.showDone("common.changes-made")})},function(n){return t.error(n)})})},n.prototype.confirmAddress=function(n,t,e){var l=this;null===this.confirmingIndex&&(this.confirmingIndex=t,this.msgBarService.hide(),this.confirmSubscription&&this.confirmSubscription.unsubscribe(),this.confirmSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).subscribe(function(r){var i=new function(){};i.address=n,i.addressIndex=t,i.showCompleteConfirmation=e;var o=new oa;o.width="566px",o.autoFocus=!1,o.data=i,l.dialog.open(Ff,o),l.confirmingIndex=null},function(n){l.msgBarService.showError(Tc(l.translateService,n)),l.confirmingIndex=null}))},n.prototype.copyAddress=function(n,t,e){void 0===e&&(e=500),n.stopPropagation(),t.copying||(Uc(t.address),t.copying=!0,setTimeout(function(){t.copying=!1},e))},n.prototype.showQrCode=function(n,t){n.stopPropagation(),qp.openDialog(this.dialog,{address:t})},n.prototype.continueNewAddress=function(){var n=this;if(this.creatingAddress=!0,!this.wallet.isHardware&&this.wallet.encrypted){var t=new oa;t.data={wallet:this.wallet};var e=this.dialog.open(Zp,t);e.afterClosed().subscribe(function(){return n.creatingAddress=!1}),e.componentInstance.passwordSubmit.subscribe(function(t){n.walletService.addAddress(n.wallet,n.howManyAddresses,t.password).subscribe(function(){return t.close()},function(n){return t.error(n)})})}else(this.wallet.isHardware?this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).flatMap(function(){return n.walletService.addAddress(n.wallet,n.howManyAddresses)}):this.walletService.addAddress(this.wallet,this.howManyAddresses)).subscribe(function(){return n.creatingAddress=!1},function(t){n.msgBarService.showError(n.wallet.isHardware?Tc(n.translateService,t):t),n.creatingAddress=!1})},n.prototype.continueEditWallet=function(){var n=new oa;n.width="566px",n.data=new $c,n.data.wallet=this.wallet,this.dialog.open(nd,n)},n}(),Vf=l._7({encapsulation:0,styles:[[".-record[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px;padding:21px 20px 16px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-record[_ngcontent-%COMP%]:not(:last-of-type){border-bottom:1px solid rgba(30,34,39,.05)}.-record[_ngcontent-%COMP%] .id-column[_ngcontent-%COMP%]{width:50px;color:rgba(30,34,39,.5);-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;height:17px;vertical-align:middle;width:17px;margin-right:10px;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{display:inline-block;margin:0;vertical-align:middle;word-break:break-all}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:hover .copy-label[_ngcontent-%COMP%]{opacity:.999!important}.-record[_ngcontent-%COMP%] .truncated-address[_ngcontent-%COMP%]{max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:middle}.-record[_ngcontent-%COMP%] .hours-column[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);width:130px;text-align:right;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .coins-column[_ngcontent-%COMP%]{color:#1e2227;width:130px;text-align:right;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%]{width:80px;text-align:right;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{cursor:pointer;color:rgba(97,109,125,.5)}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{color:#0072ff}.-record[_ngcontent-%COMP%] > img[_ngcontent-%COMP%]{display:inline-block;margin-left:0;height:32px;width:32px}.click-to-copy[_ngcontent-%COMP%]{cursor:pointer}.-actions[_ngcontent-%COMP%]{background-color:#fefefe;border-bottom:1px solid #eff0f0;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;-webkit-box-shadow:0 4px 10px rgba(0,0,0,.03)!important;box-shadow:0 4px 10px rgba(0,0,0,.03)!important;border-top-left-radius:0!important;border-top-right-radius:0!important;z-index:100;position:relative;padding:0!important}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{padding-right:20px;padding-left:0}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:first-child{padding-left:5px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] .-enabled-span[_ngcontent-%COMP%]{cursor:pointer}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] .-enabled-span[_ngcontent-%COMP%]:hover{color:rgba(30,34,39,.5)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#cecfd0;font-size:12px;height:60px;margin:0 5px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-img[_ngcontent-%COMP%]::before{content:'';display:inline-block;height:32px;width:32px;margin-right:5px;background-repeat:no-repeat;background-size:32px 32px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-new-address[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANpSURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdoK6E8TeIJkg6QRtJqj72l4qZ4JyBA8QiwUk2qVoWbJFyNdc8N3pbFIS+AcCIAQgCIIgCIIgCIIgCMJTQ8GByLJsiD9n2OSJBRjh/xSvobu9wMtgZ+Z4fwaQ32qtF3AAep8AHHia5zBWiTqHfwNuBTt2A2CnOBEGeqS3CShXPLmwYMcQgQJ1iRox7UsjepkAWnUL6juUas4Bbg/7tg9tSICZn1k2ahj8AjViusTB4ICev9AjRRf+f0Z1NrdX+Iypea+YUJINzLBqQMPKGxzgx9daz3aU8wHlXNTJ4dYEtgmgPY+dziDoNK74FarZZN89TPLQeE7QeH4KbtEkaC6bcARsJLhiNvVrSN1faj2BDrgBju+ybKFKbViRlm3BZ2CARQOc6v/x62jlcfDj7e/cn+MzaOGBBogacvxl27N3d9llqAlkQzi2AosRtBYmQZUhtW98Byzdp7ggdROxlSQpZBm/jmILYCB6Agp/r4ogZ025oq17NPX+NwZIJIuMaKUNDKxcdBkFhwacBWXTpM5dcR7En9ThcrnR9t5ETwCq/2mlnNtb6AkXJ6wZDNQJRBKvAUod+8U8gW/QEyh75pfdoSoKDjeYBgLnftmz9o379Xc2t0GVCb0Dyja2oe0ucNiAysBC4+dZ+33Z8A41bu+/MIJtxHSy95wAxwRUOklBkV/OwVLEZqCDXHx3GsgeNrXdBQ4bYMAzRg/lvjSr8iutb6BIblQJ9zydCqGdUU3bUcRrgLX3FYF51S1ygtFfxe+rwOB2IXoC8DA/q5Q3T29soOx3Qc0MIuGwAeT3KxHaryw7BWYoRwAbbi+PDrqiJ4DcHkZoldB3AOp6hzjdnzTT9KDLNfhH4iJpypETYHGDeFoLT3OpO7NvxfMOG9a+poWa7FDbO7vBlhGqP7MXkVxURzGSvHDB1Jq2XMM+9J4S65rWbkirs6bEDpYUbcv6BHJOUc41PKak6ApKXR+B+gr1BxVDx+WkPDHOV6vooke8khO34nUG1DyAff9G62jf7yMfRqAHqKO0T8MERhfI4Lk9b6AHDvJxtEiaBnnDForYgtzro/04GrL6PF6k0MosUgo1n8cx+fljgNHloT6PC4IgCIIgCIIgCILw9PgL6Ap8qFzYW2UAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-hide-empty[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANISURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdIKmE8TewJkg6QStJ6j72p6PzgTlBvUAsVhAohqK1jm2CPkuF3x3uphyDJIgCIAggCAIgiAIgiAIgiAIzw0FB8IYM8Q/Z9jliQMY4eccn6H/eoWPxcEs8fs5QDHTWq/gAPSuAJx4XhRwqTJ1Dg8TfhQc2C2Am6AiLPRIbwqoVjy7cuAuIQEFaooWMenLInpRAK26A/UDKjPnALeHe9+HNWTAzC9jRlsmv0KLmKxxMjihl6/0SNGDn1/QO1e4a/wf2/K7UqEkG5hhtYAtK29xgp/eaj3fUc4Fyrlqk8NtCWwKoD2PgzYQDRpX/BrNbLzvHiZ56DzH6Dw/R1+REjSXTzgCNjJcMZeHb8jcX2s9hg74CV4ujFmpyhpq8qov+AIMsFiAN/0/4TtaeZx8UgSoWSzMNLYE8iEcW4HFCToH4+iVJbMHJrKslGXDd5RbAAPJFuD3/t+mUHWh9fFXYOS3MaeDysHWrLwVJPkCDgs4i9qWe/KEjyDhZIfr9Ubfe5OsADT/00a7cDPoCZ8n/GcwUCeQSLoFKHUcNosMvkNPoOx52PaHqiQ4wmAeCVyGbWPuzjEiYD6/+0HIg/FejcPthLKt29J3Fzh8QGNisVPCyY9h/8kTuVdcKNvClr67wH4WaCFlkL3XBDgU0BgkJUVhuwBHGZuFDnLxt5NI9nBb313g8AEWAmd0X+1LW7ffaH0LZXGDhVFL30mkW4Bzdw2BRTMscoLZXyPuq8jhdiFZAXiYnzfam6c3NlD2h+jNHBLh8AEU9xsZGqWtwAzVCGAj7BXJSVeyAijsYYbWSH0xZ79pcVid8eeN8EhcFk05agIsYRBPa9PoVe7P7ExkLdWhZoToLBkYoAQlztOpGoxZYLISSEZcWaZaA1dZrPeSWNey9payOmtJ7GBF0Tivf0TOKcq5gadUFK2h0vURqG/QflChrTLLqhPjsl5Fnz3ik534FW9zoPYe3Md3WifH/hC5GIEeoIHSPo0dYxfI4fk9b6EHDnI5WhZNVXk5uitlbkHh9clejsbU1+NlCa2qIuXQcj2ON0g/B5hdHup6XBAEQRAEQRAEQRCE58c/90hmWzuzaIoAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-show-empty[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANpSURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdoK6E8TeIJkg6QRtJqj72l4qZ4JyBA8QiwUk2qVoWbJFyNdc8N3pbFIS+AcCIAQgCIIgCIIgCIIgCMJTQ8GByLJsiD9n2OSJBRjh/xSvobu9wMtgZ+Z4fwaQ32qtF3AAep8AHHia5zBWiTqHfwNuBTt2A2CnOBEGeqS3CShXPLmwYMcQgQJ1iRox7UsjepkAWnUL6juUas4Bbg/7tg9tSICZn1k2ahj8AjViusTB4ICev9AjRRf+f0Z1NrdX+Iypea+YUJINzLBqQMPKGxzgx9daz3aU8wHlXNTJ4dYEtgmgPY+dziDoNK74FarZZN89TPLQeE7QeH4KbtEkaC6bcARsJLhiNvVrSN1faj2BDrgBju+ybKFKbViRlm3BZ2CARQOc6v/x62jlcfDj7e/cn+MzaOGBBogacvxl27N3d9llqAlkQzi2AosRtBYmQZUhtW98Byzdp7ggdROxlSQpZBm/jmILYCB6Agp/r4ogZ025oq17NPX+NwZIJIuMaKUNDKxcdBkFhwacBWXTpM5dcR7En9ThcrnR9t5ETwCq/2mlnNtb6AkXJ6wZDNQJRBKvAUod+8U8gW/QEyh75pfdoSoKDjeYBgLnftmz9o379Xc2t0GVCb0Dyja2oe0ucNiAysBC4+dZ+33Z8A41bu+/MIJtxHSy95wAxwRUOklBkV/OwVLEZqCDXHx3GsgeNrXdBQ4bYMAzRg/lvjSr8iutb6BIblQJ9zydCqGdUU3bUcRrgLX3FYF51S1ygtFfxe+rwOB2IXoC8DA/q5Q3T29soOx3Qc0MIuGwAeT3KxHaryw7BWYoRwAbbi+PDrqiJ4DcHkZoldB3AOp6hzjdnzTT9KDLNfhH4iJpypETYHGDeFoLT3OpO7NvxfMOG9a+poWa7FDbO7vBlhGqP7MXkVxURzGSvHDB1Jq2XMM+9J4S65rWbkirs6bEDpYUbcv6BHJOUc41PKak6ApKXR+B+gr1BxVDx+WkPDHOV6vooke8khO34nUG1DyAff9G62jf7yMfRqAHqKO0T8MERhfI4Lk9b6AHDvJxtEiaBnnDForYgtzro/04GrL6PF6k0MosUgo1n8cx+fljgNHloT6PC4IgCIIgCIIgCILw9PgL6Ap8qFzYW2UAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-enable-encryption[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKbSURBVHgB7ZnRbdswEIZ/MhkgI7gTxKzdhz41mSAdIZ2gyQS1J0g8QdIJ6kzQvMcu1QmiEfzYAonYO1stZNaIDfdOcOH7AMMSIRK644n87wgYhmEYhmEYhmEY+4dDi8QYj6oK5967d3TbTUCnfomC/sqqSne9XrhFi7TmgEmM7z3cDV0erXm0TFUatuUIjxaI8fsVGf8F641nOs67G+rzCS2gHgFsSEIaYAsc3HUIx5dQRDUCpjGerzB+Rm3DZ6TT16Hr+PeEFID0Oe9Pz13wpwNFVCPgWyweUS90NeVPMvxtCOWq52mR7CS4r1mfmUN6FUKYQQG1CODZx7IheMl4howsydhTumwaO985oISaA7xzZ817CrXbl4z/DTuBdoHRUl+HEyihtwYkdLOGETak8rhfanDuGEqoOSBl4U8zW2za900I91lTB0q0ogN2mb13wCFagrbEhB1EXAdwwkOBxervAoKwKqTlcSitB0QdwMbXQqYLHQrWCZJOEF4DPCcwWsZjMbYXTZLEIqCWsY9Zc0ma/wMtNMU2s1an0FfItkHOI1ZslVshFwHO5TPDsjbwi24bsv0Qxm6eKKFstvsKYgmSmANSpvyq53Qp8a3yGBxFzTaqF5xBCMk1YMkB/X4YQ4jDRcmsSQdC/BdCSCsVZkwKY88xB2DPMQdAiUVStPuIOcBlau1JMCeYTP4qjW9cXVqHmAP4XK95fwA+3fn3KOAx/ME8H/iD20kHeOTKj5OjuGL2NoINf3iIJzwGMuX3gw5WIIRoPWA6jdek0z9CESq0jHohiBVbRBdB7zGAYHiuoKAXHkAQUQewZueKTX6wIQHPvHQ1iFE7G1wUSHi25oca2+4IJRl+VwFjqQKIYRiGYRiGYRiGYRjGL/wq6dJf5iBxAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-disable-encryption[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN+SURBVHgB7dlvT9pAGADw566tgAhUFJ0ijgSXidnM5t5s2YtlcS/2BfyUfoglvt5csmwMXFjYhij/W0H+lPZurQmmEKeId2SG+727o1T79Gm55zkAQRAEQRAEYTohmKS9PWn54HBhJoACQBUfAuq5+Cew3CK0Y5C2rB0fp6swQRMLQDz+TO3BeVyyXXccoWDQLhQmFQgJJiC6sbGGEIlh203HIgQSlkFVgxHQ9UoTOOMegIfJ5Aqy8ArcFoaA3xeSG436GXDENQDR6OaCfUdj7jmLEBMpUGxjODn5kcnp9crJrFfRFezFFMOs+1isSP750Fpb0047wAnXAIQiixtOSvfHFFA36JUy2XRaa1WrRn++2Wz2NK2iRVeWql0LVPvFJPc/Q3I3pO3uliGVosDBjc/kuJy7jxHMuOcCHnSUSqWMf33H+cw5xrL15wiRpMTh4QJwwi0A2CerA2MLqtddfJ9zjOyTi+45A9k/m5xwCwAl5sDzbJrN4qjfPSekOXgueRY44ZcBQ+mfz+fbI34VKplM47pzscQtAPeFDP+p39n0J5iAqc8AEQCYclMfAG7l8Hpi8wXckdMn6PbM9uksLsAIi6hxsK8F7KZH1DCiGPAc3BUlimQXSCGLLl9Uhu/fnbOuCdgGwL749c/fHmOKVGDMqQzVYi2o776pswwC0wBc3HkOF3/Jzgj/z2PMskfA7h2wtTWz3iVP3VNO+duWya+329ut/f19C25JjcfVgORb6/cO+1o6PapUBpfL42KWAQ/8CzHJ1dBwLv7lzpPvHw8OOqkxU7ajaZ2zeqUaDEfm3T0C7POYjVqRSRYw+xlE1PK5xw2rnR/nrl/BcrJo4G8RYx4YYRYARZYGSlYtl9OAEbs6bLnHLKvD+7IQYpFJVxJLYZhyIgAw5UQAgBe7LoB7gFkAnF1d93jxwxdmrWxnSewe90yrBYwwCwDFZt099gZRnEkW2OeYw96B/UUPkkZusd+EWZp6IhGqEHS5heXsCQYKpXA4tGaMtblpX/hiyZoL10qPhld+fh/OlstlJosjph2h1UQiJoOyBByZIJcK2a9/gBGmL8FCNltg+XwOc1pkr3eSBWCI9ZuaNvVa3R8OYQySHxhy7vyr58kcowrzErem6JbdIGm1yGrXLpOHK8VROT2FGZB0Xe5pw/uFgiAIgiAIgiAIgiAI4/oLaQBI2smc1O8AAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-edit-wallet[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMiSURBVHgB7ZnbcdNAFIbPSvYzpgJEBfaSgdeYDkwFhA5CBXFKoIIkHdABziszILkCnArwc8bSco4jT1aypGgvkjzD+R680lq3/9fZsxcBMAzDMAzDMAzzPyLghIjjeILFAh/rXAFEVIflNgDxHSC7l1JuwDMnYwCKXygQN7g5qTtGgFhKOb0Gj5yEAXG8vlKglm2OxYi4PZOzL+CJwQ0wEX/ApwmDGlAjfot131BkQu1/BMEU9y8hzwkHfJkwmAF14negPn6QMikeG0eYH35AByYMYoCJ+OdzujEhgJ6pa/OY4S/rxBPUBQo0CDc3xfPg4lec3IAlvUbACwmvMQKer1EdCSme+17KFRjSWwQ0hL3EQL7D7ckIhf2M41nTdeoiIQRxBRb0EgFt2vzvOL7Fx/kMZpHwR69DY96ajhY7j4C2Ce+dlBemkYDFSq8Lw3AKhnRqgGm2NzUBlHrQdx8f09dgSGcG2HR1hJEJQrzRd1VYzAtt6MQAW/EH2phAOQCLuV43ghMwwFX8gSYTtK5QZ2UzXfbaC1RlZrAQr1PuHcb7ucLxOIC6U5t7eI0ApWBZqnIST5QjoXo4rK5t7+G3CYj9m9LZ0hsDR3QToEL8mZRLsMSbARj+84rqfVvNE5bLtSNaJivXu4onvBmQZVDM1Erd4y+FpZMJ9bNAd/GEzyYQ6TuYD1b5mN3ahK7FE94MEIEoDEPH4zDGbmlra0If4gmfEVBoAmmarqm0MaEv8YQXA/JBir6cvdUHJSYm9Cme8GJAkBYfFp6EFmhjQt/iCS8GCFEMf5WpddVxTSYMIZ7wkwNKCRAT4nn+meuIGhPmQ4gn/EQAHDWBWS6syYRP8DR7i4YSTzhPhkgkCvhb83eSv21ijn7j/F2hOftpbFR3zb7EEyNwp2nVZlY0R8FL9CmecG4CR0Nge+iT2Nc+xRPOEVDuAQzZ0DfAAMQKrbzDWZ/zzNEUZwOUEK9aJBIShuv5lPlFsoNsjTdO5ACCy7gbgPN0/Ky10KowlHG5OlMPKoAktFyq6gsvS2I0iNlhVj+Vt8owDMMwDMMwDMMwDNPEPw5aH3llqGexAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-btn-delete[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkZGMEIyRDk3NzBFMDExRTg4QjAwOEEwQTk4MTI2NjcwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkZGMEIyRDk4NzBFMDExRTg4QjAwOEEwQTk4MTI2NjcwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RkYwQjJEOTU3MEUwMTFFODhCMDA4QTBBOTgxMjY2NzAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RkYwQjJEOTY3MEUwMTFFODhCMDA4QTBBOTgxMjY2NzAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5XdpwRAAACxElEQVR42uyZPWsUURSGd9dYCakisdDKQomI2dJOSCoVQRSsFBE7Y6siSCJYqE1A4gcG0ySiBkVtBFHjxw/QjabQTlGI4AeYIFGIOz4Hz8IwbMaZ2ZnJneRceLhk5nLnvO+euXPPTdnzvNJybpXSMm9mgBlgBpgBZoAZYAaYAWaAGWAGmAFmgBlgBpgBqbVXtcn10JHCPJ3at2cRZzmLIzGCPUDXBdvhEtyodm/5kVD8BNyFaea46LwBBL2H7jZ8gdXwEw4R/HhC8V16aQ5uwUnmmnbSAE3597DKd7kOkzAADwh+PoF4f9sP15nHc3ENWBcQ33hGFe7D4RbFi5lbXV4Ev8KbkPt9COxNKL4R70Rav34WBsh7PxhyfxOMIrQvuKpHEC/tPOLvOJsBBPeL7ibsgxo0+6XWwCnYFlP8OeY/XojPoIraRXcNmu0F5KFTIgoeRxR/omg7wWfQD5+aGQ+bYWwxxWeaAb5M6KG78B+RiyI+l1oAAU/UAOfE51kMDcMOeBRx/EAe4nN5BQKvw9EI2fAN8R15xVTJUbx86o5FGDrL2L15xZVLBkT8zjfavNYO/Vo7eIU2IKb4YDsCl7M0oeKA+FpY7QC9hcyAqNtbeAcjIWM+6rhRMmGmEBkQY28vn7pxrfFfh5TYp6GnEBkQU3ywdrgKnQvUDrIwnpVzBS263MsARKzUGiDJ3v4pnIHPC9QO3VppHuQ5ZVdfAan3NybZ3nJ9Fob0dZgKmWODGuKkAXJw+baVvT1jpDweChnykjF1Vw34AA99f9cTFjZyjrBbxMIf3/UXpX8nzqm1tpQN+A1XYAXsBFkTxuIWNnpyfE/XlEEVvlZM4d5cUfYBchJcJeCRFuZo10x4DjPM9b3Q1WALRrRF+X/CkjVgSZTDZoAZYAaYAWaAGWAGmAFmgBlgBpgBZoAZYAaYAa60vwIMACj3FKsCfgkuAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover{color:rgba(30,34,39,.5)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-new-address::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM+SURBVHgB7ZnRbdswEIZ/OxnAnSAyMkDTCZpM0HSCJBMkncAU0AGSCepO0HSCJhMkfW4LMS999msBV+5RlGuLlGTJPBoBch9Aw6JESjwe745HQBAEQRAEQRAEQRCEl8YAuyJTI/zFKfbwlq6OqCRURuXdGRVN5ZGeuadnbjFWM+yA+ALIVEK/l1TOsRpwF6ZUUhKERkTiCcDMODChcoUwrkkIHxCJOAKws/4NVs050FROYmjDENxkyqzvpsGbdZ3CDAYY04AGRQFeFXU5bmAH65IUfdq+WeHVgOaZ11QuaLB36EKmzmGXT1LTD6sm8GmAXfP+4O2svuk8eMNYTYs2tu06Cawm9DGmreyDD3/GclL3Q6WwDdYNXtFgZ2XfS5LymsUw8iwBq/pZpc7M3qFq9gBP6RnyxTWMXRgOFA4mnxuf/aWuSVcvndoxx1LgWgIT51pTz6q1Rb4w940qJ6UgmrF96Wr7YPdadh2KXY/nTm3aIZJL1v63r2nb10WlbogzDlsQLgAT3lbRpRHjxRrRdaGOat7dm3AB2Nh+RY6viMdN67u3gMMGHDk93iIed2h79xZwuMHEuX6sXK2sfft6zdTCqdE13kFveHdvODSgOjDX+K2sfV987+C7vWdgBDcT8pHRcwIcAqh+5O+PB859E7FpbNdvWqnx3V6wgDhsgMa6MfozH9Pv0/9r6xKnXit3zdtd4SaOat4dRLgGLPC9cp3jGLHIPb//iEDCBZA7rsmP2fkY4p1Tc49AOAIh4/erEVqmjsHNzyJHkDi1wTFHuACM28vh7uQ+dYjT14WmW580fe15G64pR+aYxw0O4e7mEvg7RJeld/CtvU9ddmhTm07wpcRq9+wUyY0nYR/6lE7KYGrFplxDD/gEYFX+Af5MGe1Ie6trc1pdw6bYWIIkvkjQfpDJ9mrnjhnAQ2nEuvGjMKIPqB/8CeepEf+5gE1df0H9RkXDWO45bZn3yYcvB2JSanN6fn9A29uFGfSooe17ahPs+9eRgxHEwH5oXVq7P6u0ukYEdnM4uqCk5oByeN2xscWwOBfUiEh8ASyxVv2UhHFMb32NpuNxG97u7HhcEARBEARBEARBEISXxz+STv7SiHuLFAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-hide-empty::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkI5QTAxQTVDNzBERTExRTg4MkJCOEU1MUQyMjM4MDJGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkI5QTAxQTVENzBERTExRTg4MkJCOEU1MUQyMjM4MDJGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjlBMDFBNUE3MERFMTFFODgyQkI4RTUxRDIyMzgwMkYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjlBMDFBNUI3MERFMTFFODgyQkI4RTUxRDIyMzgwMkYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5A1duRAAACq0lEQVR42uyb3W3CMBCATdUBzAZhAmACYIKm75WgE0AHqAjqAJQJmkp9L0xQOgF0ArJBPUAlakuHhKwzzo+tGOVOugcMcXyfz5e7i2gdj0fWZLlhDRcCQAAIAAEgAASAABAAAkAACAABIABNlNuqE/w9f+T9KZcaSx1I7UmNYEyJkJpJ3UvdSt3AmN2Al4d6AeQQZehM6vjMYAxOD3QCY6nUBYC5yiOgjFpKPUidXjDeJBO4dlni2toBqF3fwc5XlRnMFV0LAOXGX4YFC3DrkdSO1BZoG8ZWBpePYM5e6ADUQj8R4zMwUBmaQKDLNDBb2G0F5hEBYZo7GADcsPNqV/tgYF5J4ZqVwRN4iADmiPEL2FVRYj4B1y4QCPPQAERIwFuBu1eVBPGEmauj4ApAgpz5xKF3JUhMmIUCgEOSoy9YOAQgIDCey9hFLHABIEZ2/93D43WrQeXIvWsBMNQ+bzxml3osGIQAoKt9XnsEsEWSrtoB6NF4j5zVX6nHgnpAYktmuXdtQVAPWHpA5CXBvloABBEEiwIqGv29igsAwuKWTyVreoFkgdw1IBcAbOcy1Sq/vNqGay8FvSwEAD+Wx6JLiS0BtxYA+qNp6hHAneXetQBYIxmaDy+YIMdrEwIAgaS+b8xtH48jJXAaShBkyPPaac1+odcQTDmcGWr2uSPjsV5DFhIAU82uxsq2tU9tda+9BpcA1HkcGRoXOySvt1WYWFs9g3uIEAGcFnhvSI5SKHBewUCufT8Ed1eFE9ZcNc1dSXy8GtvDLmFGRJAnTEuAHTEPr8l8FUNqoVhbu2wTpM88vSP0WQ2e2todVrxFJsDwDivfVq/tCGDeMAFDYjjrXWZ+Pf6NZJfepEX/F2i4EAACQAAIAAEgAASAABAAAkAACAABaKL8CzAAuPuelr6IAx8AAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-show-empty::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM+SURBVHgB7ZnRbdswEIZ/OxnAnSAyMkDTCZpM0HSCJBMkncAU0AGSCepO0HSCJhMkfW4LMS999msBV+5RlGuLlGTJPBoBch9Aw6JESjwe745HQBAEQRAEQRAEQRCEl8YAuyJTI/zFKfbwlq6OqCRURuXdGRVN5ZGeuadnbjFWM+yA+ALIVEK/l1TOsRpwF6ZUUhKERkTiCcDMODChcoUwrkkIHxCJOAKws/4NVs050FROYmjDENxkyqzvpsGbdZ3CDAYY04AGRQFeFXU5bmAH65IUfdq+WeHVgOaZ11QuaLB36EKmzmGXT1LTD6sm8GmAXfP+4O2svuk8eMNYTYs2tu06Cawm9DGmreyDD3/GclL3Q6WwDdYNXtFgZ2XfS5LymsUw8iwBq/pZpc7M3qFq9gBP6RnyxTWMXRgOFA4mnxuf/aWuSVcvndoxx1LgWgIT51pTz6q1Rb4w940qJ6UgmrF96Wr7YPdadh2KXY/nTm3aIZJL1v63r2nb10WlbogzDlsQLgAT3lbRpRHjxRrRdaGOat7dm3AB2Nh+RY6viMdN67u3gMMGHDk93iIed2h79xZwuMHEuX6sXK2sfft6zdTCqdE13kFveHdvODSgOjDX+K2sfV987+C7vWdgBDcT8pHRcwIcAqh+5O+PB859E7FpbNdvWqnx3V6wgDhsgMa6MfozH9Pv0/9r6xKnXit3zdtd4SaOat4dRLgGLPC9cp3jGLHIPb//iEDCBZA7rsmP2fkY4p1Tc49AOAIh4/erEVqmjsHNzyJHkDi1wTFHuACM28vh7uQ+dYjT14WmW580fe15G64pR+aYxw0O4e7mEvg7RJeld/CtvU9ddmhTm07wpcRq9+wUyY0nYR/6lE7KYGrFplxDD/gEYFX+Af5MGe1Ie6trc1pdw6bYWIIkvkjQfpDJ9mrnjhnAQ2nEuvGjMKIPqB/8CeepEf+5gE1df0H9RkXDWO45bZn3yYcvB2JSanN6fn9A29uFGfSooe17ahPs+9eRgxHEwH5oXVq7P6u0ukYEdnM4uqCk5oByeN2xscWwOBfUiEh8ASyxVv2UhHFMb32NpuNxG97u7HhcEARBEARBEARBEISXxz+STv7SiHuLFAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-enable-encryption::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKESURBVHgB7ZnRbdswEIb/o+33jKAiddG3Ogsk1gTpBk0nqDtBnQkaT5B0groTKG0HqB6LukE0Qt6d6ELSChIqhm0IR8GB7wMEmLR00h2P1P0UoCiKoiiKoiiKouwehBbhLNmD6X0A0RDMA9uVVH/ltq8AY0pH/76hRVoLAGf772HMuf25t+bUwj7WuK1AGLQA/+p/tc5/x3rnHYm94oJ/v/mCFoieAd6RksdoAuGMDmefEZGoGcBZ/2SJ8ze279QeKR3NyB0ocWCP5ynPGPmpE5GoGcA/+9d4XOgcBcp5SmlRLD0/e5vA3GW1a2zA5q/sNTeIQLQM8KMfOoJVzjso/WsD1EnhnH7ErhvdE0Qi3hTo8HHQZlyscv6BRRB4EvaaISIRLwBMg7CNCTbnMmgZfodIxFwEk6cNSmc5NoTS/5erbEnSSh2wzex8ALpoCftKZGwh4hngBI8vfaXtWpteTAkjWghVas8VMgPEIa9qCbGiSDYDOj0nYGI5D297cQ8xxDKgKmOva92uqPkI3OZNRq2S0G46JcEfTkc8f1U2Qi4DzN241uPq/gP3oE1TltKrqbPhbQWwmEASnAK1ao3KkcRc9TZ8Fj3BmGMIIRiAsPSlw6sfEOO2XkUmEOJFFEKxpLBDS2HsOBoA7DgaAEQihnCJgWQAirDZFdMES7bGN95dWodcAMoyLHwMnUtkwUJhmlBe8zYGADStdVhx1PvT9MOG31fIXg+dDdQrP56fQgjh/YD9MztanxCTspxYkTSCEMKLoFeEYum5hLy6hxiiAVgot3nqRgnSOJvCu0GOaN8G/QaJGy2yMpmo2RuB7ZuF3eJKU6kNEEVRFEVRFEVRFEVRlHvYheXBAEeGBAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-disable-encryption::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKZSURBVHgB7ZlRbtpAEIb/NfCeI1ClVH0ruUATnyA9QnqCNidIOEHCCUhP0OQETtsDlMdKtApHyDuxpzNrV8EGAXJnLSLPJ1liF1h7/p3dnRkDhmEYhmEYRjtxaBBK+gdA9wyd6BhEQ+7qF19N4dwcKd25eHaDBmlMAEoOPyCKJvzxYMtP58gwakqICA1A3wdXbPxXbDde6PNTTejHmws0QHAP8IZkdIk6OFy797NzBCSoB1AyOFtj/CP3jfiK3fHMycUuf8TXl9UB8NkvnYAE9QD6NnjA80Yn8PpexC6ez9f+PnnL7p8mlf+wYItX/J9HBCCYB/jZLxuCTcYLLv7FAnViiNHP5CdHIMItgQ6dltqEm03G/yMXgcbl3ugEgQgnALlhuY0xdue+1IroHQIRchPsLzf4XJ9iR1z8+37TWJo0EgfsM13sKf54bIDWe4AJgJbTegGCbTQcBhP+H64T8JUuRrsEUXVQF8AXPTq9C0lkoAlnhoUQqjmBqgDe+KgnycwQYZgW+YSaCLp7gMx8OOPhx87voYaaBxSp7EOlWxKbj8DTtM6sFWW0K6xklVxLWA2Xa6HnAZ20OjOS+x/Jg9Z1WRf/uZUx/FglSK1IoicAVVw/y8411qofw3vRElF0CiU094CSAH721HiqZpJ9KPEiAqFQ5TDBQmG0HBMALccEQCDyN8H7j6YA83Kzq5YTrHk9tnOFeRt6AmTZXXlkN9HwgjzD9PnAUuc+CgBXjfw4Oer9rPtyUwyn5PWJjIFq5EeLEZRQrgccXvNsfUJIsmzMYbZasUV5E0wvobg+1zAt7qGGqgB55raIZZagjYypXA0SwhVFpUAis+X4xaZz9U4E4pOFZHN1t1oFEMMwDMMwDMMwDMMwjL+78e87Hb4jwAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-edit-wallet::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMSSURBVHgB7ZrRcdpAEIb/w/BOB1EHIY8Z4gQ6oIM4FWRSgU0HSQXGJaQCMCTPIRUEVxA9Z4DLrrBmJCFpdNLqxIz3mzE6nWWs/7+93TsBoCiKoiiKoijKS8TgkljaIa4wQw8fYBE894bU/o4DVpiaHYS5HAPWdkZ3c0+tYclVd7g2cwhyGQZs7C1YXBUMFnhnPkGI7g1wER8jaEK3BuSJtzTnDb7RcUtHnv8j6v1M7SB1nZAJ3RlQJP6AKSW7bap/aQNKjss2TOjGABfxMS2Z0INviuf8l0LxDJdANshil+q3uMEPe4+a+I2A8oQX0nBMMS4xgSmKBLKISuQKjviLgKKw3+MNHR/A9f9Iwn7aUen7FEUCcIsa+ImAKnN+bRd0Nx/hEgl9/En19SgqxuYJDrQfAVUT3ntz4xwJoOVxkgNFkyPtGuCa7V1NsMiO9hCOtGdAnVLHuJhg8CpzvoMj7RhQV3xMFRM4BwCTVN/+EgxoKj6mzAQWP6C+NLW2y7JVIC8z1xGfJFsd/tGRxdvMOqBHCXDs/j/6kGRAtdgmzpuKZzgS1haRCRwJg2iDFGSumtcRz8hOAV6Wpt89BKKfZiSnQ574a3OHmsgZsLGTsz6+WQ7XU8KqD/89PyY7p5F4Rs6A7MhYPNLrtrEJccITHvkYSQNGmfMVlaUpmpjQsnhGzoAeXqfODQmfmrC2CR7EM5JJMB0BB5yych0TPIlnZAxYRouU5Do8TC1KXEzwKJ6RMeDq7GbPa3IVEzyLZ2QMyCbAI37nXldmQgfiGRkDsgmQazZ/zJVHngm8huhAPCOzF9jYX8gmQRa4j5bB+SvB4hGPaV0809wAHuk+/hb8dvs82pwnJvQaRNFypLYpFM54Ec803wz1UfbUZnRmDm+Wym33Jp5pbgAnQImJZKPt7pw+5PgKjzQ3gEPaoh78aNtEyfCRFk4L2vU13zk6IhEBwwrXhNHzOhbLJdJEuWFbmCA9ImHAAwmaJc5Z7IpaT9EnvANqv5X/ZocUMmXw9CgsuJRRVRRFURRFURRFURRFKeM/oxaTpik5gaYAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-btn-delete::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYwRTIyQTZCNzBFMDExRTg4ODM5RUYyOTE4Q0I1M0FGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYwRTIyQTZDNzBFMDExRTg4ODM5RUYyOTE4Q0I1M0FGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjBFMjJBNjk3MEUwMTFFODg4MzlFRjI5MThDQjUzQUYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjBFMjJBNkE3MEUwMTFFODg4MzlFRjI5MThDQjUzQUYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4w5yWGAAACxElEQVR42uyZTUgVURiG773ZSmxl2CJXLQzbZLtaBboqCcTATUVEu2zbH0QKLcqNEP5R6MYikyLdBFHZz6KlWEnUrmihYAkpYYLd6fnwXBiG2zQzd2Y8o9+Bh8G5h7nnfe6ZmfMd847j5LZyK+S2eFMBKkAFqAAVoAJUgApQASpABagAFaACVIAKiK0tHzi0B2pjuE6dOe5IYpz5JLbEGOwpDo1wBAbgfs30258Rw0/BY5jjGv3WC2DQ7RwewgLshF9whsGPRwzfaE6twAO4wrXmrBRgpvwXqHadLsI76IInDH4tQnh3Own3uI5j4zOg3hO+9B1NMAlnKwwvMg/a/BD8Dh98Pu8kYEvE8KXxTsX16ychQO77Xp/P98EoQTu9T/UA4aX1EP6RtTOAwf3mMAYdMAPlfqldcBUOhwx/k+tfzMRr0IQ6xmEYyq0F5EtnJRQ8Dxj+UmbWAa6Fywm4DLt9un7cqPCJCnCJaOZw6z8hNyR8KrUAAV4YAdaFT7MYugNH4VnA/l1phE/lFvDcDucDzIYfhK9Na0yFFMPLq+5CkK70PZ7WuFKZAQHf86W2ZmqHa6Z2cDItIGR4bzsHg0lKKFgQfsavdoCWTM6AoMtb+AwjPn2+mX6jzISlTMyAEGt7edWNmxr/vU+J3Q3NmZgBIcN7a4fbUPeP2kEejDdkX8EUXfbNAEJs5/Aq4tr+JVyH+XI/FOw3leZpvidv6y0g9f7eKMtbzi9Dn7kdZn2u0WCEWClANi4/VbK2p4+Ux30+XabpU7RVwFd46vq7GLGwkX2ENgkLf1zn3+TWd5xja1UxC1iFIdgGrSDPhLthCxuzczxhnim9JrjsKbTx2UpW1gGyE9zEgEcq3FSRmfAalrjWYqarwQpEVAX5f8KmFbApymEVoAJUgApQASpABagAFaACVIAKUAEqQAWoAFvaXwEGAEeBGUrXm8wHAAAAAElFTkSuQmCC)}@-webkit-keyframes floatup{50%{opacity:1}100%{-webkit-transform:translateY(-20px);transform:translateY(-20px);opacity:0}}@keyframes floatup{50%{opacity:1}100%{-webkit-transform:translateY(-20px);transform:translateY(-20px);opacity:0}}.copy-label[_ngcontent-%COMP%]{color:#0072ff;opacity:0;font-size:12px;position:relative;padding-left:10px}.copy-label[_ngcontent-%COMP%]::after{content:attr(data-label);position:absolute;white-space:nowrap;top:0;left:4px;opacity:0;line-height:1}.unconfirmed-label[_ngcontent-%COMP%]{opacity:.5!important}.copying[_ngcontent-%COMP%] .copy-label[_ngcontent-%COMP%]::after{-webkit-animation:.5s ease-in-out floatup;animation:.5s ease-in-out floatup}mat-spinner[_ngcontent-%COMP%]{margin-left:7px;margin-right:12px}mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}"]],data:{}});function Wf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-button small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function zf(n){return l._33(0,[(n()(),l._9(0,0,null,null,24,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,12,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.newAddress()&&l),l},null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(4,{"mouse-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,7,"span",[],null,null,null,null,null)),l._8(7,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(8,{"-img -new-address":0,"-disabled-span":1,"-enabled-span":2}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Wf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(12,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,7,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleEmpty()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,4,"span",[],null,null,null,null,null)),l._8(19,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(20,{"-img":0,"-show-empty":1,"-hide-empty":2}),(n()(),l._31(21,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,"-button",n(t,4,0,e.creatingAddress)),n(t,7,0,n(t,8,0,!e.creatingAddress,e.creatingAddress,!e.creatingAddress)),n(t,11,0,e.creatingAddress),n(t,19,0,n(t,20,0,!0,e.wallet.hideEmpty,!e.wallet.hideEmpty))},function(n,t){var e=t.component;n(t,12,0,l._32(t,12,0,l._22(t,13).transform(e.wallet.isHardware?"wallet.new-address":"wallet.new-addresses"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("wallet."+(e.wallet.hideEmpty?"show":"hide")+"-empty")))})}function Uf(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"div",[["class","-button btn-delete-wallet"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.deleteWallet()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[["class","-img -btn-delete -enabled-span"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.delete")))})}function Gf(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleEncryption()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"span",[],null,null,null,null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(4,{"-img":0,"-enable-encryption":1,"-disable-encryption":2}),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,n(t,4,0,!0,!e.wallet.encrypted,e.wallet.encrypted))},function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("wallet."+(e.wallet.encrypted?"decrypt":"encrypt"))))})}function qf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-button small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Jf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-text small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Qf(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showQrCode(e,n.parent.parent.context.$implicit.address)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,11,"p",[["class","click-to-copy"]],null,[[null,"click"],[null,"mouseleave"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.copyAddress(e,n.parent.parent.context.$implicit)&&l),"mouseleave"===t&&(l=0!=(n.parent.parent.context.$implicit.copying=!1)&&l),l},null,null)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(6,{copying:0}),(n()(),l._31(7,null,["\n ","\n "])),(n()(),l._4(16777216,null,null,1,null,Jf)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"span",[["class","copy-label"]],[[1,"data-label",0]],null,null,null,null)),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(13,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,5,0,"click-to-copy",n(t,6,0,t.parent.parent.context.$implicit.copying)),n(t,9,0,e.confirmingIndex===t.parent.parent.context.index)},function(n,t){n(t,7,0,t.parent.parent.context.$implicit.address),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("wallet.address.copied"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.address.copy")))})}function Kf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-text small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Xf(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,11,"p",[["class","click-to-copy"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.confirmAddress(n.parent.parent.context.$implicit,n.parent.parent.context.index,!0)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[["class","truncated-address"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"span",[["class","copy-label unconfirmed-label"]],null,null,null,null,null)),(n()(),l._31(8,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,Kf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,t.component.confirmingIndex===t.parent.parent.context.index)},function(n,t){n(t,5,0,t.parent.parent.context.$implicit.address),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.address.show")))})}function Zf(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),"click"===t&&(r=!1!==i.copyAddress(e,n.parent.parent.context.$implicit,1e3)&&r),r},jf,Yf)),l._8(1,180224,[[1,4]],0,bu,[l.l],null,null),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,2,0,l._32(t,2,0,l._22(t,3).transform("wallet.address."+(t.parent.parent.context.$implicit.copying?"copied":"copy-address"))))})}function $f(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),"click"===t&&(r=!1!==i.confirmAddress(n.parent.parent.context.$implicit,n.parent.parent.context.index,!n.parent.parent.context.$implicit.confirmed)&&r),r},jf,Yf)),l._8(1,180224,[[1,4]],0,bu,[l.l],null,null),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,2,0,l._32(t,2,0,l._22(t,3).transform("wallet.address.confirm")))})}function n_(n){return l._33(0,[(n()(),l._9(0,0,null,null,54,"div",[["class","-record"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","id-column"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,7,"div",[["class","address-column"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Qf)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Xf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","coins-column"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,2,"div",[["class","hours-column"]],null,null,null,null,null)),(n()(),l._31(19,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,31,"div",[["class","options-column"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,16777216,null,null,3,"mat-icon",[["aria-haspopup","true"],["class","mat-icon"],["role","img"]],null,[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(n,t,e){var r=!0;return"mousedown"===t&&(r=!1!==l._22(n,26)._handleMousedown(e)&&r),"keydown"===t&&(r=!1!==l._22(n,26)._handleKeydown(e)&&r),"click"===t&&(r=!1!==l._22(n,26)._handleClick(e)&&r),r},Hf,Rf)),l._8(25,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(26,1196032,null,0,ku,[Pi,l.l,l.R,xu,[2,wu],[8,null],[2,Dl]],{menu:[0,"menu"]},null),(n()(),l._31(-1,0,["more_vert"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,23,"mat-menu",[["class","compact"]],null,null,null,Ef,Df)),l._8(30,1228800,[["optionsMenu",4]],1,wu,[l.l,l.B,vu],{overlapTrigger:[0,"overlapTrigger"],panelClass:[1,"panelClass"]},null),l._29(603979776,1,{items:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Zf)),l._8(34,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,$f)),l._8(37,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(39,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"],["routerLink","/settings/outputs"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,40)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,40)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,41).onClick()&&r),r},jf,Yf)),l._8(40,180224,[[1,4]],0,bu,[l.l],null,null),l._8(41,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{queryParams:[0,"queryParams"],routerLink:[1,"routerLink"]},null),l._26(42,{addr:0}),(n()(),l._31(43,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(46,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"],["routerLink","/transactions"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,47)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,47)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,48).onClick()&&r),r},jf,Yf)),l._8(47,180224,[[1,4]],0,bu,[l.l],null,null),l._8(48,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{queryParams:[0,"queryParams"],routerLink:[1,"routerLink"]},null),l._26(49,{addr:0}),(n()(),l._31(50,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,8,0,!e.wallet.isHardware||t.parent.context.$implicit.confirmed),n(t,11,0,e.wallet.isHardware&&!t.parent.context.$implicit.confirmed),n(t,25,0),n(t,26,0,l._22(t,30)),n(t,30,0,!1,"compact"),n(t,34,0,!e.wallet.isHardware||t.parent.context.$implicit.confirmed),n(t,37,0,e.wallet.isHardware),n(t,41,0,n(t,42,0,t.parent.context.$implicit.address),"/settings/outputs"),n(t,48,0,n(t,49,0,t.parent.context.$implicit.address),"/transactions")},function(n,t){n(t,3,0,t.parent.context.index+1),n(t,15,0,l._32(t,15,0,l._22(t,16).transform(t.parent.context.$implicit.coins?t.parent.context.$implicit.coins.toString():0,!0,"first"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform(t.parent.context.$implicit.hours?t.parent.context.$implicit.hours.toString():0,!1,"first"))),n(t,39,0,l._22(t,40)._highlighted,l._22(t,40)._triggersSubmenu,l._22(t,40)._getTabIndex(),l._22(t,40).disabled.toString(),l._22(t,40).disabled||null),n(t,43,0,l._32(t,43,0,l._22(t,44).transform("wallet.address.outputs"))),n(t,46,0,l._22(t,47)._highlighted,l._22(t,47)._triggersSubmenu,l._22(t,47)._getTabIndex(),l._22(t,47).disabled.toString(),l._22(t,47).disabled||null),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("wallet.address.history")))})}function t_(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,n_)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,!t.component.wallet.hideEmpty||t.context.$implicit.coins.isGreaterThan(0))},null)}function e_(n){return l._33(0,[(n()(),l._9(0,0,null,null,24,"div",[["class","-row -actions"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zf)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Uf)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Gf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,10,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.editWallet()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,7,"span",[],null,null,null,null,null)),l._8(16,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(17,{"-img -edit-wallet":0,"-disabled-span":1,"-enabled-span":2}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qf)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(21,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(26,0,null,null,4,"div",[["class","-records"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,t_)),l._8(29,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,!e.wallet.isHardware),n(t,6,0,e.wallet.isHardware),n(t,11,0,!e.wallet.isHardware),n(t,16,0,n(t,17,0,!e.preparingToEdit,e.preparingToEdit,!e.preparingToEdit)),n(t,20,0,e.preparingToEdit),n(t,29,0,e.wallet?e.wallet.addresses:l._3)},function(n,t){n(t,21,0,l._32(t,21,0,l._22(t,22).transform("wallet.edit")))})}var l_=function(){function n(n){this.appService=n}return n.prototype.transform=function(n){return"hours"===n?this.appService.hoursName:"coin"===n?this.appService.coinName:"coinFull"===n?this.appService.fullCoinName:""},n}(),r_=l._7({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function i_(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),l._21(null,0),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(3,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(n()(),l._9(4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(n,t){var e=t.component;n(t,3,0,e._isIconButton,e._isRippleDisabled(),e._getHostElement())},function(n,t){var e=t.component;n(t,2,0,e._isRoundButton||e._isIconButton,l._22(t,3).unbounded)})}var o_=l._7({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function s_(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),l._21(null,0),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(3,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(n()(),l._9(4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(n,t){var e=t.component;n(t,3,0,e._isIconButton,e._isRippleDisabled(),e._getHostElement())},function(n,t){var e=t.component;n(t,2,0,e._isRoundButton||e._isIconButton,l._22(t,3).unbounded)})}var a_=l._7({encapsulation:2,styles:[".mat-progress-bar{display:block;height:5px;overflow:hidden;position:relative;transition:opacity 250ms linear;width:100%}.mat-progress-bar .mat-progress-bar-element,.mat-progress-bar .mat-progress-bar-fill::after{height:100%;position:absolute;width:100%}.mat-progress-bar .mat-progress-bar-background{background-repeat:repeat-x;background-size:10px 4px;display:none}.mat-progress-bar .mat-progress-bar-buffer{transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-secondary{display:none}.mat-progress-bar .mat-progress-bar-fill{animation:none;transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-fill::after{animation:none;content:'';display:inline-block;left:0}.mat-progress-bar[dir=rtl],[dir=rtl] .mat-progress-bar{transform:rotateY(180deg)}.mat-progress-bar[mode=query]{transform:rotateZ(180deg)}.mat-progress-bar[mode=query][dir=rtl],[dir=rtl] .mat-progress-bar[mode=query]{transform:rotateZ(180deg) rotateY(180deg)}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-fill,.mat-progress-bar[mode=query] .mat-progress-bar-fill{transition:none}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary,.mat-progress-bar[mode=query] .mat-progress-bar-primary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-translate 2s infinite linear;left:-145.166611%}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-primary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary,.mat-progress-bar[mode=query] .mat-progress-bar-secondary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-translate 2s infinite linear;left:-54.888891%;display:block}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-secondary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=buffer] .mat-progress-bar-background{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-background-scroll 250ms infinite linear;display:block}@keyframes mat-progress-bar-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(.5,0,.70173,.49582);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(.30244,.38135,.55,.95635);transform:translateX(83.67142%)}100%{transform:translateX(200.61106%)}}@keyframes mat-progress-bar-primary-indeterminate-scale{0%{transform:scaleX(.08)}36.65%{animation-timing-function:cubic-bezier(.33473,.12482,.78584,1);transform:scaleX(.08)}69.15%{animation-timing-function:cubic-bezier(.06,.11,.6,1);transform:scaleX(.66148)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:translateX(37.65191%)}48.35%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:translateX(84.38617%)}100%{transform:translateX(160.27778%)}}@keyframes mat-progress-bar-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:scaleX(.08)}19.15%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:scaleX(.4571)}44.15%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:scaleX(.72796)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-background-scroll{to{transform:translateX(-10px)}}"],data:{}});function u_(n){return l._33(2,[(n()(),l._9(0,0,null,null,0,"div",[["class","mat-progress-bar-background mat-progress-bar-element"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,1,"div",[["class","mat-progress-bar-buffer mat-progress-bar-element"]],null,null,null,null,null)),l._8(2,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(3,0,null,null,1,"div",[["class","mat-progress-bar-primary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null)),l._8(4,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(5,0,null,null,0,"div",[["class","mat-progress-bar-secondary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null))],function(n,t){var e=t.component;n(t,2,0,e._bufferTransform()),n(t,4,0,e._primaryTransform())},null)}var c_=l._7({encapsulation:2,styles:[".mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}.mat-toolbar-multiple-rows{min-height:64px}.mat-toolbar-row,.mat-toolbar-single-row{height:64px}@media (max-width:600px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}"],data:{}});function d_(n){return l._33(2,[l._21(null,0),l._21(null,1)],null,null)}var h_=function(){function n(n,t,e){this.appService=n,this.languageService=t,this.dialog=e}return n.prototype.ngOnInit=function(){var n=this;this.subscription=this.languageService.currentLanguage.subscribe(function(t){return n.language=t})},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n.prototype.changelanguage=function(){var n=this;zc(this.dialog).subscribe(function(t){t&&n.languageService.changeLanguage(t)})},n}(),p_=l._7({encapsulation:0,styles:[["[_nghost-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;color:#fafafa;width:100%}.buttons-left[_ngcontent-%COMP%]{display:inline-block;padding:0 10px;width:120px}.title[_ngcontent-%COMP%]{font-size:13px;font-weight:700;display:inline;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;letter-spacing:1px;line-height:50px;text-align:center}.buttons-right[_ngcontent-%COMP%]{display:inline-block;text-align:right;width:120px}.buttons-right[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:inline-block}button[_ngcontent-%COMP%]{height:50px;width:50px}.color-primary[_ngcontent-%COMP%]{color:#0072ff}.separator[_ngcontent-%COMP%]{width:100%;height:2px;background-color:rgba(30,34,39,.05);margin:8px 0}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:3px}"]],data:{}});function f_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),r},jf,Yf)),l._8(1,180224,[[1,4]],0,bu,[l.l],{disabled:[0,"disabled"]},null),(n()(),l._31(2,0,[" v"," "]))],function(n,t){n(t,1,0,!0)},function(n,t){var e=t.component;n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,2,0,e.appService.version.version)})}function __(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),"click"===t&&(r=!1!==i.changelanguage()&&r),r},jf,Yf)),l._8(1,180224,[[2,4]],0,bu,[l.l],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(3,0,null,0,0,"img",[["class","flag"]],[[8,"src",4]],null,null,null,null)),(n()(),l._31(4,0,["\n ","\n "]))],null,function(n,t){var e=t.component;n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,3,0,"assets/img/lang/"+e.language.iconName),n(t,4,0,e.language.name)})}function m_(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"div",[["class","buttons-left"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(2,0,null,null,1,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(3,null,["\n ","\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(5,0,null,null,79,"div",[["class","buttons-right"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,34,"mat-menu",[],null,null,null,Ef,Df)),l._8(8,1228800,[["settingsMenu",4]],1,wu,[l.l,l.B,vu],{overlapTrigger:[0,"overlapTrigger"]},null),l._29(603979776,1,{items:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(11,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,12)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,12)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,13).onClick()&&r),r},jf,Yf)),l._8(12,180224,[[1,4]],0,bu,[l.l],null,null),l._8(13,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(14,1),(n()(),l._31(15,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(18,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,19)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,19)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,20).onClick()&&r),r},jf,Yf)),l._8(19,180224,[[1,4]],0,bu,[l.l],null,null),l._8(20,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(21,1),(n()(),l._31(22,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(25,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,26)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,26)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,27).onClick()&&r),r},jf,Yf)),l._8(26,180224,[[1,4]],0,bu,[l.l],null,null),l._8(27,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(28,1),(n()(),l._31(29,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(32,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,33)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,33)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,34).onClick()&&r),r},jf,Yf)),l._8(33,180224,[[1,4]],0,bu,[l.l],null,null),l._8(34,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(35,1),(n()(),l._31(36,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,f_)),l._8(40,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,20,"mat-menu",[],null,null,null,Ef,Df)),l._8(44,1228800,[["menuMenu",4]],1,wu,[l.l,l.B,vu],{overlapTrigger:[0,"overlapTrigger"]},null),l._29(603979776,2,{items:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(47,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,48)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,48)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,49).onClick()&&r),r},jf,Yf)),l._8(48,180224,[[2,4]],0,bu,[l.l],null,null),l._8(49,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(50,1),(n()(),l._31(51,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(54,0,null,0,3,"a",[["class","color-primary mat-menu-item"],["mat-menu-item",""],["rel","noreferrer nofollow"],["role","menuitem"],["target","_blank"]],[[8,"href",4],[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,55)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,55)._emitHoverEvent()&&r),r},jf,Yf)),l._8(55,180224,[[2,4]],0,bu,[l.l],null,null),(n()(),l._31(56,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(59,0,null,0,0,"div",[["class","separator"]],null,null,null,null,null)),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,__)),l._8(62,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(65,16777216,null,null,8,"button",[["aria-haspopup","true"],["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(n,t,e){var r=!0;return"mousedown"===t&&(r=!1!==l._22(n,68)._handleMousedown(e)&&r),"keydown"===t&&(r=!1!==l._22(n,68)._handleKeydown(e)&&r),"click"===t&&(r=!1!==l._22(n,68)._handleClick(e)&&r),r},i_,r_)),l._8(66,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(67,16384,null,0,Fs,[],null,null),l._8(68,1196032,null,0,ku,[Pi,l.l,l.R,xu,[2,wu],[8,null],[2,Dl]],{menu:[0,"menu"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(70,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(71,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["settings"])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,16777216,null,null,8,"button",[["aria-haspopup","true"],["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(n,t,e){var r=!0;return"mousedown"===t&&(r=!1!==l._22(n,78)._handleMousedown(e)&&r),"keydown"===t&&(r=!1!==l._22(n,78)._handleKeydown(e)&&r),"click"===t&&(r=!1!==l._22(n,78)._handleClick(e)&&r),r},i_,r_)),l._8(76,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(77,16384,null,0,Fs,[],null,null),l._8(78,1196032,null,0,ku,[Pi,l.l,l.R,xu,[2,wu],[8,null],[2,Dl]],{menu:[0,"menu"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(80,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(81,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["menu"])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,8,0,!1),n(t,13,0,n(t,14,0,"/settings/network")),n(t,20,0,n(t,21,0,"/settings/blockchain")),n(t,27,0,n(t,28,0,"/settings/outputs")),n(t,34,0,n(t,35,0,"/settings/pending-transactions")),n(t,40,0,e.appService.version),n(t,44,0,!1),n(t,49,0,n(t,50,0,"/settings/backup")),n(t,62,0,e.language),n(t,68,0,l._22(t,8)),n(t,71,0),n(t,78,0,l._22(t,44)),n(t,81,0)},function(n,t){var e=t.component;n(t,3,0,e.headline),n(t,11,0,l._22(t,12)._highlighted,l._22(t,12)._triggersSubmenu,l._22(t,12)._getTabIndex(),l._22(t,12).disabled.toString(),l._22(t,12).disabled||null),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("title.network"))),n(t,18,0,l._22(t,19)._highlighted,l._22(t,19)._triggersSubmenu,l._22(t,19)._getTabIndex(),l._22(t,19).disabled.toString(),l._22(t,19).disabled||null),n(t,22,0,l._32(t,22,0,l._22(t,23).transform("title.blockchain"))),n(t,25,0,l._22(t,26)._highlighted,l._22(t,26)._triggersSubmenu,l._22(t,26)._getTabIndex(),l._22(t,26).disabled.toString(),l._22(t,26).disabled||null),n(t,29,0,l._32(t,29,0,l._22(t,30).transform("title.outputs"))),n(t,32,0,l._22(t,33)._highlighted,l._22(t,33)._triggersSubmenu,l._22(t,33)._getTabIndex(),l._22(t,33).disabled.toString(),l._22(t,33).disabled||null),n(t,36,0,l._32(t,36,0,l._22(t,37).transform("title.pending-txs"))),n(t,47,0,l._22(t,48)._highlighted,l._22(t,48)._triggersSubmenu,l._22(t,48)._getTabIndex(),l._22(t,48).disabled.toString(),l._22(t,48).disabled||null),n(t,51,0,l._32(t,51,0,l._22(t,52).transform("title.backup"))),n(t,54,0,e.appService.explorerUrl,l._22(t,55)._highlighted,l._22(t,55)._triggersSubmenu,l._22(t,55)._getTabIndex(),l._22(t,55).disabled.toString(),l._22(t,55).disabled||null),n(t,56,0,l._32(t,56,0,l._22(t,57).transform("title.explorer"))),n(t,65,0,l._22(t,66).disabled||null),n(t,75,0,l._22(t,76).disabled||null)})}var g_=l._7({encapsulation:0,styles:[[".button-container[_ngcontent-%COMP%]{display:inline-block}button[_ngcontent-%COMP%]{border-radius:25px;height:50px;margin:20px 10px 0;width:160px;overflow:hidden}button.enabled[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);-webkit-box-shadow:none;box-shadow:none;color:#1e2227}mat-icon[_ngcontent-%COMP%]{margin-left:10px;opacity:.3;line-height:20px}mat-spinner[_ngcontent-%COMP%]{display:inline-block;height:24px!important;width:24px!important;margin-left:10px;position:relative;top:-2px}"]],data:{}});function y_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(1,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["done"]))],function(n,t){n(t,1,0)},null)}function b_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(1,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["error"]))],function(n,t){n(t,1,0)},null)}function v_(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-button mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function w_(n){return l._33(0,[l._29(402653184,1,{tooltip:0}),l._29(402653184,2,{button:0}),(n()(),l._9(2,0,null,null,21,"div",[["class","button-container"]],null,[[null,"mouseenter"],[null,"mouseleave"]],function(n,t,e){var l=!0,r=n.component;return"mouseenter"===t&&(l=0!=(r.mouseOver=!0)&&l),"mouseleave"===t&&(l=0!=(r.mouseOver=!1)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,16777216,null,null,18,"button",[["class","mat-button mat-raised-button"],["color","primary"],["mat-button",""],["mat-raised-button",""],["type","submit"]],[[8,"disabled",0]],[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0,i=n.component;return"longpress"===t&&(r=!1!==l._22(n,10).show()&&r),"keydown"===t&&(r=!1!==l._22(n,10)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,10).hide(1500)&&r),"click"===t&&(r=!1!==(0!==i.state?i.onClick():null)&&r),r},i_,r_)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(6,{enabled:0}),l._8(7,180224,[[2,4],["button",4]],0,Bs,[l.l,Hl,Rr],{disabled:[0,"disabled"],color:[1,"color"]},null),l._8(8,16384,null,0,Hs,[],null,null),l._8(9,16384,null,0,Ns,[],null,null),l._8(10,147456,[[1,4],["tooltip",4]],0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),(n()(),l._31(-1,0,["\n "])),l._21(0,0),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,y_)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,b_)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,v_)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,n(t,6,0,!e.disabled)),n(t,7,0,e.disabled&&!e.forceEmitEvents,"primary"),n(t,10,0,e.error?e.error:null),n(t,15,0,1===e.state),n(t,18,0,2===e.state),n(t,21,0,0===e.state)},function(n,t){n(t,4,0,l._22(t,7).disabled||null)})}var x_=l._7({encapsulation:0,styles:[[".-small-button[_ngcontent-%COMP%] button{width:unset;height:unset;padding:0 10px;min-width:100px;margin:unset;font-size:13px}.-toggle[_ngcontent-%COMP%] button{-webkit-box-shadow:unset;box-shadow:unset;background-color:rgba(0,0,0,0)!important;line-height:unset!important;min-height:26px}.-toggle[_ngcontent-%COMP%] button span{color:#171a1d;line-height:unset!important}.-toggle[_ngcontent-%COMP%] button.enabled{background-color:#171a1d!important}.-toggle[_ngcontent-%COMP%] button.enabled span{color:#fafafa}.-buttons-container[_ngcontent-%COMP%]{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:5px;background:rgba(255,255,255,.1);border-radius:100px;margin:0 auto;text-align:center}.light.-buttons-container[_ngcontent-%COMP%]{background:#f1f1f1}.light[_ngcontent-%COMP%] .-toggle[_ngcontent-%COMP%] button.enabled{background-color:#fff!important}.light[_ngcontent-%COMP%] .-toggle[_ngcontent-%COMP%] button.enabled span{color:#1e2227}@media (min-width:768px) and (max-width:991px){.-buttons-container.navbar.light[_ngcontent-%COMP%]{border-radius:20px}.-buttons-container.navbar.light[_ngcontent-%COMP%] app-button[_ngcontent-%COMP%] .button-container{display:block}}.small.-buttons-container[_ngcontent-%COMP%]{padding:2px;line-height:0}.small[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button{padding:0 10px;min-width:70px;font-size:9px;min-height:16px}"]],data:{}});function M_(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[],[[8,"className",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.onLeftClick()&&l),l},w_,g_)),l._8(3,49152,null,0,Lc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(n()(),l._31(4,0,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.onRightClick()&&l),l},w_,g_)),l._8(7,49152,null,0,Lc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(n()(),l._31(8,0,["",""])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.activeButton!==e.ButtonState.LeftButton,!0),n(t,7,0,e.activeButton!==e.ButtonState.RightButton,!0)},function(n,t){var e=t.component;n(t,0,0,l._12(1,"-buttons-container ",e.className,"")),n(t,4,0,e.leftButtonText),n(t,8,0,e.rightButtonText)})}var k_=function(){function n(n){this.navbarService=n,this.otcEnabled=Ll.otcEnabled,this.exchangeEnabled=!!r.swaplab.apiKey}return n.prototype.changeActiveComponent=function(n){this.navbarService.setActiveComponent(n)},n}(),C_=l._7({encapsulation:0,styles:[["[_nghost-%COMP%]{background-color:#fbfbfb;min-height:66px}.-buttons[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{cursor:pointer;padding:0 20px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;float:left;height:66px;padding:17px 0;width:32px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-block;font-size:14px;height:66px;line-height:66px;margin:0 5px}.-buttons[_ngcontent-%COMP%] .-low-opacity[_ngcontent-%COMP%]{opacity:.2}.-buttons[_ngcontent-%COMP%] .-switch[_ngcontent-%COMP%]{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;padding:0 20px}"]],data:{}});function S_(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/exchange"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1).onClick()&&r),r},null,null)),l._8(1,16384,[[7,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(2,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,7,{links:1}),l._29(603979776,8,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,0,"img",[["src","../../../../../assets/img/money-gold.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,"/exchange"),n(t,2,0,"no-opacity")},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("title.buy-coin")))})}function O_(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-button"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["src","../../../../../assets/img/money-gold.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[["class","secondary-color"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("title.buy-coin")))})}function T_(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"app-double-button",[["class","-switch"],["className","light navbar"]],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeActiveComponent(e)&&l),l},M_,x_)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"-switch":0,"element-disabled":1}),l._8(3,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"],className:[3,"className"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,nn,[l.h])],function(n,t){var e=t.component;n(t,1,0,"-switch",n(t,2,0,!0,e.navbarService.switchDiabled)),n(t,3,0,l._32(t,3,0,l._22(t,4).transform(e.navbarService.rightText)),l._32(t,3,1,l._22(t,5).transform(e.navbarService.leftText)),l._32(t,3,2,l._22(t,6).transform(e.navbarService.activeComponent)),"light navbar")},null)}function L_(n){return l._33(0,[(n()(),l._9(0,0,null,null,54,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,51,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/wallets"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,5).onClick()&&r),r},null,null)),l._8(5,16384,[[1,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(6,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,1,{links:1}),l._29(603979776,2,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,0,"img",[["src","../../../../../assets/img/wallet-black.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/send"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,18).onClick()&&r),r},null,null)),l._8(18,16384,[[3,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(19,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,3,{links:1}),l._29(603979776,4,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,0,"img",[["src","../../../../../assets/img/send-black.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(26,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/transactions"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,31).onClick()&&r),r},null,null)),l._8(31,16384,[[5,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(32,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,5,{links:1}),l._29(603979776,6,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,0,"img",[["src","../../../../../assets/img/transactions-black.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(39,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,S_)),l._8(46,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,O_)),l._8(49,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,T_)),l._8(52,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,"/wallets"),n(t,6,0,"no-opacity"),n(t,18,0,"/send"),n(t,19,0,"no-opacity"),n(t,31,0,"/transactions"),n(t,32,0,"no-opacity"),n(t,46,0,e.exchangeEnabled),n(t,49,0,e.otcEnabled),n(t,52,0,e.navbarService.switchVisible)},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("title.wallets"))),n(t,26,0,l._32(t,26,0,l._22(t,27).transform("title.send"))),n(t,39,0,l._32(t,39,0,l._22(t,40).transform("title.history")))})}o.a.prototype.skip=function(n){return function(n){return function(t){return t.lift(new yc(n))}}(n)(this)},o.a.prototype.take=function(n){return Object(_r.a)(n)(this)};var P_=function(){function n(n,t,e,l,r){this.appService=n,this.networkService=t,this.blockchainService=e,this.priceService=l,this.walletService=r,this.addresses=[],this.querying=!0,this.synchronized=!0,this.walletDownloadUrl=Ll.walletDownloadUrl,this.subscriptionsGroup=[]}return Object.defineProperty(n.prototype,"loading",{get:function(){return!(this.current&&this.highest&&this.current===this.highest&&this.coins&&"NaN"!==this.coins&&this.hours&&"NaN"!==this.hours)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"coins",{get:function(){var n=new Ae.BigNumber("0");return this.addresses.map(function(t){return n=n.plus(t.coins)}),n.decimalPlaces(6).toString()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hours",{get:function(){var n=new Ae.BigNumber("0");return this.addresses.map(function(t){return n=n.plus(t.hours)}),n.decimalPlaces(0).toString()},enumerable:!0,configurable:!0}),n.prototype.ngOnInit=function(){var n=this;this.subscriptionsGroup.push(this.blockchainService.progress.filter(function(n){return!!n}).subscribe(function(t){n.querying=!1,n.highest=t.highest,n.current=t.current,n.percentage=n.current&&n.highest?n.current/n.highest:0,n.synchronizedSubscription||(n.synchronizedSubscription=n.blockchainService.synchronized.subscribe(function(t){return n.synchronized=t}))})),this.subscriptionsGroup.push(this.priceService.price.subscribe(function(t){return n.price=t})),this.subscriptionsGroup.push(this.walletService.allAddresses().subscribe(function(t){n.addresses=t.reduce(function(n,t){return n.find(function(n){return n.address===t.address})||n.push(t),n},[])})),this.subscriptionsGroup.push(this.walletService.pendingTransactions().subscribe(function(t){n.hasPendingTxs=t.user.length>0}))},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.synchronizedSubscription&&this.synchronizedSubscription.unsubscribe()},n}(),D_=l._7({encapsulation:0,styles:[[".-container[_ngcontent-%COMP%]{background-color:#fbfbfb;border-bottom:2px solid rgba(30,34,39,.05)}.large-header[_ngcontent-%COMP%]{background:#0072ff;background:-webkit-gradient(linear,left top,right bottom,from(rgba(0,114,255,.7)),to(rgba(0,195,255,.7))),url(header.03fb33b04c982a1a804d.png) center center no-repeat;background:linear-gradient(to bottom right,rgba(0,114,255,.7),rgba(0,195,255,.7)),url(header.03fb33b04c982a1a804d.png) center center no-repeat;background-size:100% auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;min-height:190px}.balance-container[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#fafafa;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;font-size:12px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%]{line-height:1;margin:0 0 .5em}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:4em}.balance-container[_ngcontent-%COMP%] .dollars[_ngcontent-%COMP%]{margin:0}.hour-balance[_ngcontent-%COMP%]{text-align:center}.hour-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{background-color:rgba(255,255,255,.3);border-radius:15px;color:#171a1d;display:inline-block;font-size:12px;line-height:22px;margin:1em 0 2em;padding:0 30px}.notification-bar[_ngcontent-%COMP%]{background-color:#f44a4d;color:#fbfbfb}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{margin:auto}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{text-decoration:none;color:#ffebee}"]],data:{}});function A_(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"p",[["class","coins"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(2,null,["",""])),l._27(3,2)],null,function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,n(t,3,0,l._22(t.parent,0),e.percentage,"1.2-2")))})}function E_(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"p",[["class","coins"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(2,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(4,null,[" ",""])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,l._22(t,3).transform(e.coins,!0,"first"))),n(t,4,0,l._32(t,4,0,l._22(t,5).transform(e.coins,!0,"last")))})}function Y_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[["class","coins"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\xa0"]))],null,null)}function j_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._27(2,4)],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,n(t,2,0,l._22(t.parent.parent,1),e.coins*e.price,"USD","symbol","1.2-2")))})}function I_(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["-"]))],null,null)}function R_(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,j_)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,I_)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(7,null,["\n (",")\n "])),l._27(8,4)],function(n,t){var e=t.component;n(t,3,0,!e.loading),n(t,6,0,e.loading)},function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,n(t,8,0,l._22(t.parent,1),e.price,"USD","symbol","1.2-2")))})}function H_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("common.loading")))})}function N_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.syncing-blocks")),e.current&&e.highest?"("+e.current+"/"+e.highest+")":"...")})}function F_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.hours,!1)))})}function B_(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-progress-bar",[["aria-valuemax","100"],["aria-valuemin","0"],["class","example-margin mat-progress-bar"],["color","primary"],["role","progressbar"]],[[1,"aria-valuenow",0],[1,"mode",0],[2,"mat-primary",null],[2,"mat-accent",null],[2,"mat-warn",null]],null,null,u_,a_)),l._8(1,49152,null,0,Nu,[],{color:[0,"color"],value:[1,"value"],mode:[2,"mode"]},null)],function(n,t){var e=t.component;n(t,1,0,"primary",100*e.percentage,e.querying?"query":"determinate")},function(n,t){n(t,0,0,l._22(t,1).value,l._22(t,1).mode,"primary"==l._22(t,1).color,"accent"==l._22(t,1).color,"warn"==l._22(t,1).color)})}function V_(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,1,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,6,"div",[],null,null,null,null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(7,0,null,null,1,"a",[["rel","noreferrer nofollow"],["target","_blank"]],[[8,"href",4]],null,null,null,null)),(n()(),l._31(8,null,["v",""])),(n()(),l._31(9,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],null,function(n,t){var e=t.component;n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("header.update1"))),n(t,7,0,e.walletDownloadUrl),n(t,8,0,e.appService.lastestVersion),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("header.update2")))})}function W_(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,2,"a",[["href","https://web.telegram.org/#/im?p=@skycoinsupport"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(4,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(6,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.errors.no-backend1"))),n(t,4,0,l._32(t,4,0,l._22(t,5).transform("header.errors.no-backend2"))),n(t,6,0,l._32(t,6,0,l._22(t,7).transform("header.errors.no-backend3")))})}function z_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.errors.csrf")))})}function U_(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,2,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,W_)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,z_)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "]))],function(n,t){var e=t.component;n(t,5,0,2===e.appService.error),n(t,8,0,3===e.appService.error)},function(n,t){n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length)})}function G_(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,3,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],null,function(n,t){n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("header.errors.no-connections")))})}function q_(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,3,"a",[["routerLink","/settings/pending-transactions"]],[[1,"target",0],[8,"href",4]],[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,4).onClick(e.button,e.ctrlKey,e.metaKey,e.shiftKey)&&r),r},null,null)),l._8(4,671744,null,0,fp,[cp,Ch,u],{routerLink:[0,"routerLink"]},null),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(7,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,4,0,"/settings/pending-transactions")},function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.pending-txs1"))),n(t,3,0,l._22(t,4).target,l._22(t,4).href),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("header.pending-txs2"))),n(t,7,0,l._32(t,7,0,l._22(t,8).transform("header.pending-txs3")))})}function J_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.synchronizing")))})}function Q_(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,4,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,q_)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,J_)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "]))],function(n,t){var e=t.component;n(t,5,0,e.hasPendingTxs),n(t,8,0,!e.synchronized&&!e.hasPendingTxs)},function(n,t){n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length)})}function K_(n){return l._33(0,[l._25(0,en,[l.w]),l._25(0,ln,[l.w]),(n()(),l._9(2,0,null,null,58,"div",[["class","-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,37,"div",[["class","large-header"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,1,"app-top-bar",[],null,null,null,m_,p_)),l._8(7,245760,null,0,h_,[gf,Bc,fa],{headline:[0,"headline"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,22,"div",[["class","balance-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,19,"div",[["class","balance"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,A_)),l._8(14,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,E_)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Y_)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,7,"p",[["class","dollars"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,R_)),l._8(25,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,H_)),l._8(28,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,7,"div",[["class","hour-balance"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,N_)),l._8(36,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,F_)),l._8(39,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,1,"app-nav-bar",[],null,null,null,L_,C_)),l._8(44,49152,null,0,k_,[Vp],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,B_)),l._8(47,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,V_)),l._8(50,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,U_)),l._8(53,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,G_)),l._8(56,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Q_)),l._8(59,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,7,0,e.headline),n(t,14,0,e.highest&&e.loading),n(t,17,0,!e.loading),n(t,20,0,!e.highest&&e.loading),n(t,25,0,e.price),n(t,28,0,!e.price),n(t,36,0,e.loading),n(t,39,0,!e.loading),n(t,47,0,e.loading),n(t,50,0,e.appService.updateAvailable),n(t,53,0,e.appService.error),n(t,56,0,!e.appService.error&&e.networkService.noConnections),n(t,59,0,e.hasPendingTxs||!e.synchronized)},null)}var X_=l._7({encapsulation:0,styles:[[".-width-130[_ngcontent-%COMP%]{width:130px;-ms-flex-negative:0;flex-shrink:0}.-width-250[_ngcontent-%COMP%]{width:250px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;padding-right:20px}.-headers[_ngcontent-%COMP%]{color:rgba(30,34,39,.2);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;font-weight:700;height:50px;line-height:50px;padding:0 130px 0 50px}.-wallets[_ngcontent-%COMP%]{margin:0 30px}.-body[_ngcontent-%COMP%]{border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:0 0 10px}.-wallet[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid rgba(30,34,39,.05);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px;line-height:60px;height:60px;padding-left:20px;cursor:pointer}.-wallet[_ngcontent-%COMP%]:first-child{border-top-left-radius:10px;border-top-right-radius:10px}.-wallet[_ngcontent-%COMP%]:last-child{border-bottom-left-radius:10px;border-bottom-right-radius:10px}.-wallet[_ngcontent-%COMP%] .-label[_ngcontent-%COMP%]{color:#1e2227}.-wallet[_ngcontent-%COMP%] .-hours[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);text-align:right}.-wallet[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#1e2227;text-align:right}.-wallet[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%]{padding-left:20px}.-wallet[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{border-radius:50%;background-color:#f7f7f7;display:inline-block;height:38px;margin:11px 0;padding:3px;width:38px;cursor:pointer}.-wallet[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:85px;margin-right:15px;-ms-flex-negative:0;flex-shrink:0}.-wallet[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px;height:32px}.-text-right[_ngcontent-%COMP%]{text-align:right}.action-buttons[_ngcontent-%COMP%]{margin-bottom:74px;padding:40px 0;text-align:center}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{background-color:#f7f7f7;border:none;-webkit-box-shadow:none;box-shadow:none;color:rgba(30,34,39,.5);font-size:13px;margin:0 5px;min-width:140px}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:28px;margin-left:-4px;width:28px}"]],data:{}});function Z_(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,2,"img",[["src","../../../../assets/img/lock-gold.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("wallet.encryption-enabled")))},null)}function $_(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,2,"img",[["src","../../../../assets/img/unlock-grey.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("wallet.encryption-disabled")))},null)}function nm(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,2,"img",[["src","../../../../assets/img/alert-red.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("wallet.hw-security-warning")))},null)}function tm(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-wallet-detail",[],null,null,null,e_,Vf)),l._8(1,180224,null,0,Bf,[fa,Sc,jc,oc,De.j,cp,Ye],{wallet:[0,"wallet"]},null)],function(n,t){n(t,1,0,t.parent.context.$implicit)},null)}function em(n){return l._33(0,[(n()(),l._9(0,0,null,null,40,"div",[["class","-wallets"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,37,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,31,"div",[["class","-wallet"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleWallet(n.context.$implicit)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,1,"div",[["class","-width-250 -label"]],[[1,"title",0]],null,null,null,null)),(n()(),l._31(7,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,10,"div",[["class","-flex-fill -encryption"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Z_)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,$_)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,nm)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,2,"div",[["class","-width-130 -coins"]],null,null,null,null,null)),(n()(),l._31(22,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,2,"div",[["class","-width-130 -hours"]],null,null,null,null,null)),(n()(),l._31(26,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,5,"div",[["class","-expand"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(31,0,null,null,2,"img",[["src","../../../../assets/img/chevron-right-grey.png"]],null,null,null,null,null)),l._8(32,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(33,{"rotate-270":0,"rotate-90":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,tm)),l._8(38,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,12,0,t.context.$implicit.encrypted&&!t.context.$implicit.isHardware),n(t,15,0,!t.context.$implicit.encrypted&&!t.context.$implicit.isHardware),n(t,18,0,t.context.$implicit.hasHwSecurityWarnings&&t.context.$implicit.isHardware),n(t,32,0,n(t,33,0,t.context.$implicit.opened,!t.context.$implicit.opened)),n(t,38,0,t.context.$implicit.opened)},function(n,t){n(t,6,0,t.context.$implicit.label),n(t,7,0,t.context.$implicit.label),n(t,22,0,l._32(t,22,0,l._22(t,23).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0,!0,"first"))),n(t,26,0,l._32(t,26,0,l._22(t,27).transform(t.context.$implicit.hours?t.context.$implicit.hours.toString():0,!1,"first")))})}function lm(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,15,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"div",[["class","-width-250"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,0,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"div",[["class","-width-130 -text-right"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-width-130 -text-right"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,em)),l._8(20,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,20,0,0===t.parent.context.$implicit?e.hardwareWallets:e.wallets)},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform(0===t.parent.context.$implicit?"wallet.hardware-wallet":"wallet.wallet"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("coin"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("hours")))})}function rm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,lm)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,0===t.context.$implicit&&e.hardwareWallets.length>0||1===t.context.$implicit&&e.wallets.length>0)},null)}function im(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"button",[["class","mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.adminHwWallet()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,0,"img",[["src","../../../../assets/img/hw-gold.png"]],null,null,null,null,null)),(n()(),l._31(5,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("wallet.hardware-wallet")))})}function om(n){return l._33(0,[(n()(),l._9(0,0,null,null,34,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,27,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,2,null,rm)),l._8(9,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),l._24(10,2),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(12,0,null,null,20,"div",[["class","action-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,6,"button",[["class","mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addWallet(!0)&&l),l},i_,r_)),l._8(15,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(16,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(18,0,null,0,0,"img",[["src","../../../../assets/img/plus-gold.png"]],null,null,null,null,null)),(n()(),l._31(19,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,6,"button",[["class","mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addWallet(!1)&&l),l},i_,r_)),l._8(23,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(24,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(26,0,null,0,0,"img",[["src","../../../../assets/img/load-gold.png"]],null,null,null,null,null)),(n()(),l._31(27,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,im)),l._8(31,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.wallets"))),n(t,9,0,n(t,10,0,0,1)),n(t,31,0,e.hwCompatibilityActivated)},function(n,t){n(t,14,0,l._22(t,15).disabled||null),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("wallet.add"))),n(t,22,0,l._22(t,23).disabled||null),n(t,27,0,l._32(t,27,0,l._22(t,28).transform("wallet.load")))})}var sm=l._5("app-wallets",Np,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-wallets",[],null,null,null,om,X_)),l._8(1,245760,null,0,Np,[Sc,oc,fa,cp],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]);o.a.prototype.delay=function(n,t){return void 0===t&&(t=sl),Hi(n,t)(this)};var am=function(){function n(t,e,l,r,i){this.dialogRef=t,this.data=e,this.formBuilder=l,this.msgBarService=r,this.storageService=i,this.maxNoteChars=n.MAX_NOTE_CHARS}return n.prototype.ngOnInit=function(){this.originalNote=this.data.note?this.data.note:"",this.form=this.formBuilder.group({note:[this.data.note]})},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.OperationSubscription&&this.OperationSubscription.unsubscribe()},n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.changeNote=function(){var n=this;if(!this.button.isLoading()){var t=this.form.value.note?this.form.value.note.trim():"";this.originalNote!==t?(this.msgBarService.hide(),this.button.setLoading(),this.OperationSubscription=this.storageService.store(ec.NOTES,this.data.txid,t).subscribe(function(){n.dialogRef.close(t)},function(t){n.msgBarService.showError(t),n.button.resetState().setEnabled()})):this.closePopup()}},n.MAX_NOTE_CHARS=64,n}(),um=function(){function n(n,t,e,r,i,o,s,a,u,c,d){var h=this;this.formBuilder=n,this.blockchainService=t,this.walletService=e,this.dialog=r,this.msgBarService=i,this.navbarService=o,this.hwWalletService=s,this.translate=a,this.changeDetector=u,this.appService=c,this.onFormSubmitted=new l.o,this.maxNoteChars=am.MAX_NOTE_CHARS,this.transactions=[],this.busy=!1,this.doubleButtonActive=Fp,this.selectedCurrency=Fp.LeftButton,this.valueGreaterThanBalance=!1,this.subscriptionsGroup=[],this.subscriptionsGroup.push(d.price.subscribe(function(n){h.price=n,h.updateValue()}))}return n.prototype.ngOnInit=function(){var n=this;this.navbarService.showSwitch("send.simple","send.advanced"),this.initForm(),this.subscriptionsGroup.push(this.walletService.all().first().subscribe(function(t){n.wallets=t,1===t.length&&n.form.get("wallet").setValue(t[0])}))},n.prototype.ngOnDestroy=function(){this.processingSubscription&&!this.processingSubscription.closed&&this.processingSubscription.unsubscribe(),this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.closeSyncCheckSubscription(),this.navbarService.hideSwitch(),this.msgBarService.hide()},n.prototype.preview=function(){this.previewTx=!0,this.checkBeforeSending(),this.changeDetector.detectChanges()},n.prototype.send=function(){this.previewTx=!1,this.checkBeforeSending()},n.prototype.changeActiveCurrency=function(n){n!==this.selectedCurrency&&(this.selectedCurrency=n,this.askIfConvertAmount(),this.updateValue(),this.form.get("amount").updateValueAndValidity())},n.prototype.askIfConvertAmount=function(){var n=this;if(this.form.get("amount").value){var t=this.form.get("amount").value.trim(),e=new Ae.BigNumber(this.form.get("amount").value.trim());if(t&&!e.isNaN()){var l,r,i=this.translate.instant("common.usd"),o=this.appService.coinName;this.selectedCurrency===Fp.LeftButton?(l=i,r=o):(l=o,r=i);var s={text:this.translate.instant("send.convert-confirmation",{from:l,to:r}),headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"};Wc(this.dialog,s).afterClosed().subscribe(function(t){t&&n.convertAmount()})}}},n.prototype.convertAmount=function(){if(this.msgBarService.hide(),this.form.get("amount").value){var t,e=this.form.get("amount").value.trim(),l=new Ae.BigNumber(e);if(!e||l.isNaN())return void this.msgBarService.showWarning(this.translate.instant("send.invaid-amount-warning"));this.selectedCurrency===Fp.LeftButton?((t=l.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals)).multipliedBy(this.price).decimalPlaces(n.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR).isEqualTo(l)||this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")),this.form.get("amount").setValue(t.toString())):((t=l.multipliedBy(this.price).decimalPlaces(n.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)).dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals).isEqualTo(l)||this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")),this.form.get("amount").setValue(t.toString()))}},n.prototype.assignAll=function(){this.msgBarService.hide();var t=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:new Ae.BigNumber(-1);t.isEqualTo(-1)?this.msgBarService.showError(this.translate.instant("send.no-wallet-selected")):(this.selectedCurrency===Fp.RightButton&&(t=t.multipliedBy(this.price).decimalPlaces(n.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)),this.form.get("amount").setValue(t.toString()))},n.prototype.updateValue=function(){if(this.price)if(this.form&&null===this.validateAmount(this.form.get("amount"))){var n=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:-1;this.valueGreaterThanBalance=!1,this.selectedCurrency===Fp.LeftButton?(this.value=new Ae.BigNumber(this.form.get("amount").value).multipliedBy(this.price).decimalPlaces(2).toNumber(),n>0&&parseFloat(this.form.get("amount").value)>n&&(this.valueGreaterThanBalance=!0)):(this.value=new Ae.BigNumber(this.form.get("amount").value).dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals).toNumber(),n>0&&this.value>n&&(this.valueGreaterThanBalance=!0))}else this.value=-1;else this.value=null},n.prototype.checkBeforeSending=function(){var n=this;!this.form.valid||this.previewButton.isLoading()||this.sendButton.isLoading()||(this.closeSyncCheckSubscription(),this.syncCheckSubscription=this.blockchainService.synchronized.first().subscribe(function(t){t?n.prepareTransaction():n.showSynchronizingWarning()}))},n.prototype.showSynchronizingWarning=function(){var n=this;Wc(this.dialog,{text:"send.synchronizing-warning",headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"}).afterClosed().subscribe(function(t){t&&n.prepareTransaction()})},n.prototype.prepareTransaction=function(){var n=this;if(this.msgBarService.hide(),this.previewButton.resetState(),this.sendButton.resetState(),!this.form.value.wallet.encrypted||this.form.value.wallet.isHardware||this.previewTx)!this.form.value.wallet.isHardware||this.previewTx?this.createTransaction():(this.showBusy(),this.processingSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.form.value.wallet.addresses[0].address).subscribe(function(){return n.createTransaction()},function(t){return n.showError(Tc(n.translate,t))}));else{var t=new oa;t.data={wallet:this.form.value.wallet},this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.createTransaction(t)})}},n.prototype.showBusy=function(){this.previewTx?(this.previewButton.setLoading(),this.sendButton.setDisabled()):(this.sendButton.setLoading(),this.previewButton.setDisabled()),this.busy=!0,this.navbarService.disableSwitch()},n.prototype.createTransaction=function(n){var t=this;this.showBusy(),this.processingSubscription=this.walletService.createTransaction(this.form.value.wallet,this.form.value.wallet.addresses.map(function(n){return n.address}),null,[{address:this.form.value.address.trim(),coins:(this.selectedCurrency===Fp.LeftButton?this.form.value.amount:this.value.toString()).trim()}],{type:"auto",mode:"share",share_factor:"0.5"},null,n?n.password:null,this.previewTx).subscribe(function(e){n&&n.close();var l=t.form.value.note.trim();t.previewTx?(t.onFormSubmitted.emit({form:{wallet:t.form.value.wallet,address:t.form.value.address.trim(),amount:t.form.value.amount,currency:t.selectedCurrency,note:l},amount:new Ae.BigNumber(t.form.value.amount),to:[t.form.value.address.trim()],transaction:e}),t.busy=!1,t.navbarService.enableSwitch()):t.processingSubscription=t.walletService.injectTransaction(e.encoded,l).subscribe(function(n){var e=!0;l&&!n&&(t.msgBarService.showWarning(t.translate.instant("send.error-saving-note")),e=!1),t.showSuccess(e)},function(n){return t.showError(n)})},function(e){n&&n.error(e),t.showError(e&&e.result?Tc(t.translate,e):e)})},n.prototype.showSuccess=function(n){var t=this;this.busy=!1,this.navbarService.enableSwitch(),this.resetForm(),n?(this.msgBarService.showDone("send.sent"),this.sendButton.resetState()):(this.sendButton.setSuccess(),setTimeout(function(){t.sendButton.resetState()},3e3))},n.prototype.showError=function(n){this.busy=!1,this.msgBarService.showError(n),this.navbarService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},n.prototype.initForm=function(){var n=this;this.form=this.formBuilder.group({wallet:["",Xi.required],address:[""],amount:["",Xi.required],note:[""]}),this.form.get("address").setValidators([this.validateAddress.bind(this)]),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){n.form.get("amount").setValidators([Xi.required,n.validateAmountWithValue.bind(n)]),n.form.get("amount").updateValueAndValidity()})),this.subscriptionsGroup.push(this.form.get("amount").valueChanges.subscribe(function(t){n.updateValue()})),this.formData&&Object.keys(this.form.controls).forEach(function(t){n.form.get(t)&&n.form.get(t).setValue(n.formData.form[t]),n.selectedCurrency=n.formData.form.currency})},n.prototype.validateAddress=function(n){if(!n.value||0===n.value.trim().length)return{Required:!0}},n.prototype.validateAmount=function(t){var e=t.value;e=e?e.trim():e;var l=new Ae.BigNumber(e);if(!e||l.isNaN()||l.isLessThanOrEqualTo(0))return{Invalid:!0};var r=e.split(".");if(this.selectedCurrency===Fp.LeftButton){if(2===r.length&&r[1].length>this.blockchainService.currentMaxDecimals)return{Invalid:!0}}else if(2===r.length&&r[1].length>n.MaxUsdDecimals)return{Invalid:!0};return null},n.prototype.validateAmountWithValue=function(n){var t=this.validateAmount(n);if(t)return t;var e=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:0;if(this.selectedCurrency===Fp.LeftButton){if(parseFloat(n.value)>e)return{Invalid:!0}}else if(this.updateValue(),this.value>e)return{Invalid:!0};return null},n.prototype.resetForm=function(){this.form.get("wallet").setValue(""),this.form.get("address").setValue(""),this.form.get("amount").setValue(""),this.form.get("note").setValue(""),this.selectedCurrency=Fp.LeftButton},n.prototype.closeSyncCheckSubscription=function(){this.syncCheckSubscription&&this.syncCheckSubscription.unsubscribe()},n.MaxUsdDecimals=6,n}(),cm=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.amount-label[_ngcontent-%COMP%]{display:inline-block}label[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom;padding-left:5px}"]],data:{}});function dm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform(t.parent.context.$implicit.coins?t.parent.context.$implicit.coins.toString():0)),l._32(t,1,1,l._22(t,3).transform(t.parent.context.$implicit.hours.toString(),!1)))})}function hm(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"option",[],[[8,"disabled",0]],null,null,null,null)),l._8(1,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(2,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(3,null,["\n "," -\n "])),(n()(),l._4(16777216,null,null,1,null,dm)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,t.context.$implicit),n(t,2,0,t.context.$implicit),n(t,5,0,t.context.$implicit.coins&&t.context.$implicit.hours)},function(n,t){n(t,0,0,!t.context.$implicit.coins||t.context.$implicit.coins.isLessThanOrEqualTo(0)),n(t,3,0,t.context.$implicit.label)})}function pm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,hm)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.wallets)},null)}function fm(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[["class","coin-selector-container"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,3,"app-double-button",[["className","light small"]],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeActiveCurrency(e)&&l),l},M_,x_)),l._8(5,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"],className:[3,"className"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,"coin-selector-container",n(t,2,0,e.busy)),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("common.usd")),l._32(t,5,1,l._22(t,7).transform("coin")),e.selectedCurrency,"light small")},null)}function _m(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("send.invalid-amount")))})}function mm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ "," ","\n "])),l._27(2,2),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,n(t,2,0,l._22(t.parent,0),e.value,"1.0-2")),l._32(t,1,1,l._22(t,3).transform("common.usd")))})}function gm(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ ","\n "])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.value)))})}function ym(n){return l._33(0,[l._25(0,tn,[l.w]),l._29(402653184,1,{previewButton:0}),l._29(402653184,2,{sendButton:0}),(n()(),l._9(3,0,null,null,127,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,4).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,4).onReset()&&r),r},null,null)),l._8(4,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(6,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,27,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"label",[["for","wallet"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,20,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,17,"select",[["formControlName","wallet"],["id","wallet"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,19).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,19).onTouched()&&r),r},null,null)),l._8(17,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(18,{"element-disabled":0}),l._8(19,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(21,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,4,"option",[["disabled",""],["hidden",""]],null,null,null,null,null)),l._8(26,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(27,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(28,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,pm)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,2,"label",[["for","address"]],null,null,null,null,null)),(n()(),l._31(40,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,5,"input",[["formControlName","address"],["id","address"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,44)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,44).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,44)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,44)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(44,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(46,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(48,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(51,0,null,null,43,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(53,0,null,null,2,"label",[["class","amount-label"],["for","amount"]],null,null,null,null,null)),(n()(),l._31(54,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,fm)),l._8(58,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(60,0,null,null,13,"div",[["class","-input-addon"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(62,0,null,null,5,"input",[["formControlName","amount"],["id","amount"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,63)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,63).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,63)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,63)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(63,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(69,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(70,null,["",""])),l._25(0,l_,[gf]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,0,null,null,18,"div",[["class","coins-value-label"]],null,null,null,null,null)),l._8(76,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(77,{red:0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,_m)),l._8(80,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,mm)),l._8(83,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gm)),l._8(86,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(88,0,null,null,4,"div",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.assignAll()&&l),l},null,null)),l._8(89,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(90,{"centerd-link":0}),(n()(),l._31(91,null,["(",")"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(96,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(98,0,null,null,8,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(99,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(101,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,103).show()&&r),"keydown"===t&&(r=!1!==l._22(n,103)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,103).hide(1500)&&r),r},Hf,Rf)),l._8(102,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(103,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(108,0,null,null,7,"input",[["formControlName","note"],["id","note"]],[[1,"disabled",0],[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,109)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,109).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,109)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,109)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.preview()&&r),r},null,null)),l._8(109,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(110,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(113,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(115,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(118,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(120,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.preview()&&l),l},w_,g_)),l._8(121,49152,[[1,4],["previewButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(122,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(125,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.send()&&l),l},w_,g_)),l._8(126,49152,[[2,4],["sendButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(127,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,e.form),n(t,17,0,n(t,18,0,e.busy)),n(t,21,0,"wallet"),n(t,26,0,""),n(t,27,0,""),n(t,32,0,e.wallets),n(t,46,0,"address"),n(t,58,0,e.price),n(t,65,0,"amount"),n(t,76,0,"coins-value-label",n(t,77,0,e.value>=0&&e.valueGreaterThanBalance)),n(t,80,0,e.price&&e.value<0),n(t,83,0,e.price&&e.value>=0&&e.selectedCurrency===e.doubleButtonActive.LeftButton),n(t,86,0,e.price&&e.value>=0&&e.selectedCurrency===e.doubleButtonActive.RightButton),n(t,89,0,"link",n(t,90,0,!e.price)),n(t,102,0),n(t,103,0,l._32(t,103,0,l._22(t,104).transform("send.personal-note-help"))),n(t,110,0,e.maxNoteChars),n(t,113,0,"note"),n(t,121,0,!e.form.valid),n(t,126,0,!e.form.valid)},function(n,t){var e=t.component;n(t,3,0,l._22(t,6).ngClassUntouched,l._22(t,6).ngClassTouched,l._22(t,6).ngClassPristine,l._22(t,6).ngClassDirty,l._22(t,6).ngClassValid,l._22(t,6).ngClassInvalid,l._22(t,6).ngClassPending),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("send.from-label"))),n(t,16,0,e.busy?"true":null,l._22(t,23).ngClassUntouched,l._22(t,23).ngClassTouched,l._22(t,23).ngClassPristine,l._22(t,23).ngClassDirty,l._22(t,23).ngClassValid,l._22(t,23).ngClassInvalid,l._22(t,23).ngClassPending),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("send.select-wallet"))),n(t,40,0,l._32(t,40,0,l._22(t,41).transform("send.to-label"))),n(t,43,0,e.busy?"true":null,l._22(t,48).ngClassUntouched,l._22(t,48).ngClassTouched,l._22(t,48).ngClassPristine,l._22(t,48).ngClassDirty,l._22(t,48).ngClassValid,l._22(t,48).ngClassInvalid,l._22(t,48).ngClassPending),n(t,54,0,l._32(t,54,0,l._22(t,55).transform("send.amount-label"))),n(t,62,0,e.busy?"true":null,l._22(t,67).ngClassUntouched,l._22(t,67).ngClassTouched,l._22(t,67).ngClassPristine,l._22(t,67).ngClassDirty,l._22(t,67).ngClassValid,l._22(t,67).ngClassInvalid,l._22(t,67).ngClassPending),n(t,70,0,l._32(t,70,0,e.selectedCurrency===e.doubleButtonActive.LeftButton?l._22(t,71).transform("coin"):l._22(t,72).transform("common.usd"))),n(t,91,0,l._32(t,91,0,l._22(t,92).transform("send.send-all-available-coins"))),n(t,99,0,l._32(t,99,0,l._22(t,100).transform("send.personal-note-label"))),n(t,108,0,e.busy?"true":null,l._22(t,110).maxlength?l._22(t,110).maxlength:null,l._22(t,115).ngClassUntouched,l._22(t,115).ngClassTouched,l._22(t,115).ngClassPristine,l._22(t,115).ngClassDirty,l._22(t,115).ngClassValid,l._22(t,115).ngClassInvalid,l._22(t,115).ngClassPending),n(t,122,0,l._32(t,122,0,l._22(t,123).transform("send.preview-button"))),n(t,127,0,l._32(t,127,0,l._22(t,128).transform("send.send-button")))})}var bm=l._7({encapsulation:2,styles:[],data:{}});function vm(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-pseudo-checkbox",[["class","mat-option-pseudo-checkbox mat-pseudo-checkbox"]],[[2,"mat-pseudo-checkbox-indeterminate",null],[2,"mat-pseudo-checkbox-checked",null],[2,"mat-pseudo-checkbox-disabled",null]],null,null,Cm,km)),l._8(1,49152,null,0,sr,[],{state:[0,"state"],disabled:[1,"disabled"]},null)],function(n,t){var e=t.component;n(t,1,0,e.selected?"checked":"",e.disabled)},function(n,t){n(t,0,0,"indeterminate"===l._22(t,1).state,"checked"===l._22(t,1).state,l._22(t,1).disabled)})}function wm(n){return l._33(2,[(n()(),l._4(16777216,null,null,1,null,vm)),l._8(1,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._9(2,0,null,null,1,"span",[["class","mat-option-text"]],null,null,null,null,null)),l._21(null,0),(n()(),l._9(4,0,null,null,1,"div",[["class","mat-option-ripple mat-ripple"],["mat-ripple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(5,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(n,t){var e=t.component;n(t,1,0,e.multiple),n(t,5,0,e.disabled||e.disableRipple,e._getHostElement())},function(n,t){n(t,4,0,l._22(t,5).unbounded)})}var xm=l._7({encapsulation:2,styles:[],data:{}});function Mm(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,"label",[["class","mat-optgroup-label"]],[[8,"id",0]],null,null,null,null)),(n()(),l._31(1,null,["",""])),l._21(null,0)],null,function(n,t){var e=t.component;n(t,0,0,e._labelId),n(t,1,0,e.label)})}var km=l._7({encapsulation:2,styles:[".mat-pseudo-checkbox{width:20px;height:20px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0,0,.2,.1),background-color 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:'';border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:9px;left:2px;width:16px;opacity:1}.mat-pseudo-checkbox-checked::after{top:5px;left:3px;width:12px;height:5px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1}"],data:{}});function Cm(n){return l._33(2,[],null,null)}var Sm=l._7({encapsulation:2,styles:[".mat-select{display:inline-block;width:100%;outline:0}.mat-select-trigger{display:inline-table;cursor:pointer;position:relative;box-sizing:border-box}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-select-value{display:table-cell;max-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{display:table-cell;vertical-align:middle}.mat-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%}.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}@media screen and (-ms-high-contrast:active){.mat-select-panel{outline:solid 1px}}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color .4s .133s cubic-bezier(.25,.8,.25,1)}.mat-form-field-hide-placeholder .mat-select-placeholder{color:transparent;transition:none}"],data:{animation:[{type:7,name:"transformPanel",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 32px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:0,name:"showing-multiple",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 64px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0,minWidth:"100%",transform:"scaleY(0)"},offset:null},{type:4,styles:null,timings:"150ms cubic-bezier(0.25, 0.8, 0.25, 1)"}],options:null},{type:1,expr:"* => void",animation:[{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"250ms 100ms linear"}],options:null}],options:{}},{type:7,name:"fadeInContent",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => showing",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"150ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function Om(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[["class","mat-select-placeholder"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.placeholder||"\xa0")})}function Tm(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.triggerValue)})}function Lm(n){return l._33(0,[l._21(null,0),(n()(),l._4(0,null,null,0))],null,null)}function Pm(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"span",[["class","mat-select-value-text"]],null,null,null,null,null)),l._8(1,16384,null,0,Y,[],{ngSwitch:[0,"ngSwitch"]},null),(n()(),l._4(16777216,null,null,1,null,Tm)),l._8(3,16384,null,0,I,[l.R,l.O,Y],null,null),(n()(),l._4(16777216,null,null,1,null,Lm)),l._8(5,278528,null,0,j,[l.R,l.O,Y],{ngSwitchCase:[0,"ngSwitchCase"]},null)],function(n,t){n(t,1,0,!!t.component.customTrigger),n(t,5,0,!0)},null)}function Dm(n){return l._33(0,[(n()(),l._9(0,0,[[2,0],["panel",1]],null,3,"div",[],[[24,"@transformPanel",0],[4,"transformOrigin",null],[2,"mat-select-panel-done-animating",null],[4,"font-size","px"]],[[null,"@transformPanel.done"]],function(n,t,e){var l=!0;return"@transformPanel.done"===t&&(l=!1!==n.component._onPanelDone()&&l),l},null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-select-content"]],[[24,"@fadeInContent",0]],[[null,"@fadeInContent.done"]],function(n,t,e){var l=!0;return"@fadeInContent.done"===t&&(l=!1!==n.component._onFadeInDone()&&l),l},null,null)),l._21(null,1)],function(n,t){var e=t.component;n(t,1,0,l._12(1,"mat-select-panel ",e._getPanelTheme(),""),e.panelClass)},function(n,t){var e=t.component;n(t,0,0,e.multiple?"showing-multiple":"showing",e._transformOrigin,e._panelDoneAnimating,e._triggerFontSize),n(t,2,0,"showing")})}function Am(n){return l._33(2,[l._29(402653184,1,{trigger:0}),l._29(671088640,2,{panel:0}),l._29(402653184,3,{overlayDir:0}),(n()(),l._9(3,0,[[1,0],["trigger",1]],null,9,"div",[["aria-hidden","true"],["cdk-overlay-origin",""],["class","mat-select-trigger"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggle()&&l),l},null,null)),l._8(4,16384,[["origin",4]],0,Yi,[l.l],null,null),(n()(),l._9(5,0,null,null,5,"div",[["class","mat-select-value"]],null,null,null,null,null)),l._8(6,16384,null,0,Y,[],{ngSwitch:[0,"ngSwitch"]},null),(n()(),l._4(16777216,null,null,1,null,Om)),l._8(8,278528,null,0,j,[l.R,l.O,Y],{ngSwitchCase:[0,"ngSwitchCase"]},null),(n()(),l._4(16777216,null,null,1,null,Pm)),l._8(10,278528,null,0,j,[l.R,l.O,Y],{ngSwitchCase:[0,"ngSwitchCase"]},null),(n()(),l._9(11,0,null,null,1,"div",[["class","mat-select-arrow-wrapper"]],null,null,null,null,null)),(n()(),l._9(12,0,null,null,0,"div",[["class","mat-select-arrow"]],null,null,null,null,null)),(n()(),l._4(16777216,null,null,1,function(n,t,e){var l=!0,r=n.component;return"backdropClick"===t&&(l=!1!==r.close()&&l),"attach"===t&&(l=!1!==r._onAttached()&&l),"detach"===t&&(l=!1!==r.close()&&l),l},Dm)),l._8(14,671744,[[3,4]],0,ji,[Pi,l.O,l.R,Ai,[2,Dl]],{_deprecatedOrigin:[0,"_deprecatedOrigin"],_deprecatedPositions:[1,"_deprecatedPositions"],_deprecatedOffsetY:[2,"_deprecatedOffsetY"],_deprecatedMinWidth:[3,"_deprecatedMinWidth"],_deprecatedBackdropClass:[4,"_deprecatedBackdropClass"],_deprecatedScrollStrategy:[5,"_deprecatedScrollStrategy"],_deprecatedOpen:[6,"_deprecatedOpen"],_deprecatedHasBackdrop:[7,"_deprecatedHasBackdrop"]},{backdropClick:"backdropClick",attach:"attach",detach:"detach"})],function(n,t){var e=t.component;n(t,6,0,e.empty),n(t,8,0,!0),n(t,10,0,!1),n(t,14,0,l._22(t,4),e._positions,e._offsetY,null==e._triggerRect?null:e._triggerRect.width,"cdk-overlay-transparent-backdrop",e._scrollStrategy,e.panelOpen,"")},null)}var Em=l._7({encapsulation:2,styles:["@keyframes mat-checkbox-fade-in-background{0%{opacity:0}50%{opacity:1}}@keyframes mat-checkbox-fade-out-background{0%,50%{opacity:1}100%{opacity:0}}@keyframes mat-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:22.91026}50%{animation-timing-function:cubic-bezier(0,0,.2,.1)}100%{stroke-dashoffset:0}}@keyframes mat-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0,0,0,1)}100%{transform:scaleX(1)}}@keyframes mat-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(.4,0,1,1);stroke-dashoffset:0}to{stroke-dashoffset:-22.91026}}@keyframes mat-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(45deg)}}@keyframes mat-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:0;transform:rotate(45deg)}to{opacity:1;transform:rotate(360deg)}}@keyframes mat-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:0;transform:rotate(-45deg)}to{opacity:1;transform:rotate(0)}}@keyframes mat-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(315deg)}}@keyframes mat-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;opacity:1;transform:scaleX(1)}100%,32.8%{opacity:0;transform:scaleX(0)}}.mat-checkbox-checkmark,.mat-checkbox-mixedmark{width:calc(100% - 4px)}.mat-checkbox-background,.mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:2px;box-sizing:border-box;pointer-events:none}.mat-checkbox{transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1);cursor:pointer}.mat-checkbox-layout{cursor:inherit;align-items:baseline;vertical-align:middle;display:inline-flex;white-space:nowrap}.mat-checkbox-inner-container{display:inline-block;height:20px;line-height:0;margin:auto;margin-right:8px;order:0;position:relative;vertical-align:middle;white-space:nowrap;width:20px;flex-shrink:0}[dir=rtl] .mat-checkbox-inner-container{margin-left:8px;margin-right:auto}.mat-checkbox-inner-container-no-side-margin{margin-left:0;margin-right:0}.mat-checkbox-frame{background-color:transparent;transition:border-color 90ms cubic-bezier(0,0,.2,.1);border-width:2px;border-style:solid}.mat-checkbox-background{align-items:center;display:inline-flex;justify-content:center;transition:background-color 90ms cubic-bezier(0,0,.2,.1),opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-checkbox-checkmark{top:0;left:0;right:0;bottom:0;position:absolute;width:100%}.mat-checkbox-checkmark-path{stroke-dashoffset:22.91026;stroke-dasharray:22.91026;stroke-width:2.66667px}.mat-checkbox-mixedmark{height:2px;opacity:0;transform:scaleX(0) rotate(0)}.mat-checkbox-label-before .mat-checkbox-inner-container{order:1;margin-left:8px;margin-right:auto}[dir=rtl] .mat-checkbox-label-before .mat-checkbox-inner-container{margin-left:auto;margin-right:8px}.mat-checkbox-checked .mat-checkbox-checkmark{opacity:1}.mat-checkbox-checked .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-checked .mat-checkbox-mixedmark{transform:scaleX(1) rotate(-45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark{opacity:0;transform:rotate(45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-indeterminate .mat-checkbox-mixedmark{opacity:1;transform:scaleX(1) rotate(0)}.mat-checkbox-unchecked .mat-checkbox-background{background-color:transparent}.mat-checkbox-disabled{cursor:default}.mat-checkbox-anim-unchecked-checked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-checked .mat-checkbox-checkmark-path{animation:180ms linear 0s mat-checkbox-unchecked-checked-checkmark-path}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-unchecked-indeterminate-mixedmark}.mat-checkbox-anim-checked-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-checked-unchecked .mat-checkbox-checkmark-path{animation:90ms linear 0s mat-checkbox-checked-unchecked-checkmark-path}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-checkmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-checkmark}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-mixedmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-checkmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-checkmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-mixedmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-mixedmark}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-mixedmark{animation:.3s linear 0s mat-checkbox-indeterminate-unchecked-mixedmark}.mat-checkbox-input{bottom:0;left:50%}.mat-checkbox-ripple{position:absolute;left:-15px;top:-15px;height:50px;width:50px;z-index:1;pointer-events:none}"],data:{}});function Ym(n){return l._33(2,[l._29(402653184,1,{_inputElement:0}),l._29(402653184,2,{_ripple:0}),(n()(),l._9(2,0,[["label",1]],null,14,"label",[["class","mat-checkbox-layout"]],[[1,"for",0]],null,null,null,null)),(n()(),l._9(3,0,null,null,8,"div",[["class","mat-checkbox-inner-container"]],[[2,"mat-checkbox-inner-container-no-side-margin",null]],null,null,null,null)),(n()(),l._9(4,0,[[1,0],["input",1]],null,0,"input",[["class","mat-checkbox-input cdk-visually-hidden"],["type","checkbox"]],[[8,"id",0],[8,"required",0],[8,"checked",0],[1,"value",0],[8,"disabled",0],[1,"name",0],[8,"tabIndex",0],[8,"indeterminate",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-checked",0]],[[null,"change"],[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"change"===t&&(l=!1!==r._onInteractionEvent(e)&&l),"click"===t&&(l=!1!==r._onInputClick(e)&&l),l},null,null)),(n()(),l._9(5,0,null,null,1,"div",[["class","mat-checkbox-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(6,212992,[[2,4]],0,ir,[l.l,l.B,Hl,[2,rr]],{centered:[0,"centered"],radius:[1,"radius"],speedFactor:[2,"speedFactor"],disabled:[3,"disabled"],trigger:[4,"trigger"]},null),(n()(),l._9(7,0,null,null,0,"div",[["class","mat-checkbox-frame"]],null,null,null,null,null)),(n()(),l._9(8,0,null,null,3,"div",[["class","mat-checkbox-background"]],null,null,null,null,null)),(n()(),l._9(9,0,null,null,1,":svg:svg",[[":xml:space","preserve"],["class","mat-checkbox-checkmark"],["focusable","false"],["version","1.1"],["viewBox","0 0 24 24"]],null,null,null,null,null)),(n()(),l._9(10,0,null,null,0,":svg:path",[["class","mat-checkbox-checkmark-path"],["d","M4.1,12.7 9,17.6 20.3,6.3"],["fill","none"],["stroke","white"]],null,null,null,null,null)),(n()(),l._9(11,0,null,null,0,"div",[["class","mat-checkbox-mixedmark"]],null,null,null,null,null)),(n()(),l._9(12,0,[["checkboxLabel",1]],null,4,"span",[["class","mat-checkbox-label"]],null,[[null,"cdkObserveContent"]],function(n,t,e){var l=!0;return"cdkObserveContent"===t&&(l=!1!==n.component._onLabelTextChange()&&l),l},null,null)),l._8(13,1196032,null,0,Ks,[Qs,l.l,l.B],null,{event:"cdkObserveContent"}),(n()(),l._9(14,0,null,null,1,"span",[["style","display:none"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\xa0"])),l._21(null,0)],function(n,t){var e=t.component;n(t,6,0,e._rippleConfig.centered,e._rippleConfig.radius,e._rippleConfig.speedFactor,e._isRippleDisabled(),l._22(t,2))},function(n,t){var e=t.component;n(t,2,0,e.inputId),n(t,3,0,!l._22(t,12).textContent||!l._22(t,12).textContent.trim()),n(t,4,1,[e.inputId,e.required,e.checked,e.value,e.disabled,e.name,e.tabIndex,e.indeterminate,e.ariaLabel,e.ariaLabelledby,e._getAriaChecked()]),n(t,5,0,l._22(t,6).unbounded)})}var jm=l._7({encapsulation:2,styles:[".mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:0;vertical-align:middle}.mat-slider-wrapper{position:absolute}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{background-repeat:repeat;background-clip:content-box;box-sizing:border-box;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),opacity .4s cubic-bezier(.25,.8,.25,1)}.cdk-keyboard-focused .mat-slider-focus-ring,.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb-label{cursor:-webkit-grab;cursor:grab}.mat-slider-sliding:not(.mat-slider-disabled) .mat-slider-thumb,.mat-slider-sliding:not(.mat-slider-disabled) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb-label:active,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb:active{cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(.7);transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),border-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform .4s cubic-bezier(.25,.8,.25,1),border-radius .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-sliding .mat-slider-thumb-container,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-track-fill{transition-duration:0s}.mat-slider-has-ticks .mat-slider-wrapper::after{content:'';position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}"],data:{}});function Im(n){return l._33(2,[l._29(402653184,1,{_sliderWrapper:0}),(n()(),l._9(1,0,[[1,0],["sliderWrapper",1]],null,16,"div",[["class","mat-slider-wrapper"]],null,null,null,null,null)),(n()(),l._9(2,0,null,null,4,"div",[["class","mat-slider-track-wrapper"]],null,null,null,null,null)),(n()(),l._9(3,0,null,null,1,"div",[["class","mat-slider-track-background"]],null,null,null,null,null)),l._8(4,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(5,0,null,null,1,"div",[["class","mat-slider-track-fill"]],null,null,null,null,null)),l._8(6,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(7,0,null,null,3,"div",[["class","mat-slider-ticks-container"]],null,null,null,null,null)),l._8(8,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(9,0,null,null,1,"div",[["class","mat-slider-ticks"]],null,null,null,null,null)),l._8(10,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(11,0,null,null,6,"div",[["class","mat-slider-thumb-container"]],null,null,null,null,null)),l._8(12,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(13,0,null,null,0,"div",[["class","mat-slider-focus-ring"]],null,null,null,null,null)),(n()(),l._9(14,0,null,null,0,"div",[["class","mat-slider-thumb"]],null,null,null,null,null)),(n()(),l._9(15,0,null,null,2,"div",[["class","mat-slider-thumb-label"]],null,null,null,null,null)),(n()(),l._9(16,0,null,null,1,"span",[["class","mat-slider-thumb-label-text"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""]))],function(n,t){var e=t.component;n(t,4,0,e._trackBackgroundStyles),n(t,6,0,e._trackFillStyles),n(t,8,0,e._ticksContainerStyles),n(t,10,0,e._ticksStyles),n(t,12,0,e._thumbContainerStyles)},function(n,t){n(t,17,0,t.component.displayValue)})}var Rm=function(){function n(n,t){var e=this;this.dialogRef=n,this.walletService=t,this.wallets=[],this.walletService.all().first().subscribe(function(n){return e.wallets=n})}return n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.select=function(n){this.dialogRef.close(n)},n}(),Hm=function(){function n(n,t,e,l){this.dialogRef=n,this.data=t,this.formBuilder=e,this.msgBarService=l}return n.prototype.ngOnInit=function(){this.form=this.formBuilder.group({data:[this.data]})},n.prototype.ngOnDestroy=function(){this.msgBarService.hide()},n.prototype.processData=function(){try{if(0===this.form.value.data.trim().length)return void this.msgBarService.showError("send.bulk-send.error-no-data");var n=this.form.value.data.split(/\r?\n/);if(!n||0===n.length)return void this.msgBarService.showError("send.bulk-send.error-no-data");var t=(n=n.filter(function(n){return n.trim().length>0}))[0].split(",").length;if(2!==t&&3!==t)return void this.msgBarService.showError("send.bulk-send.error-invalid-data");var e=[],l=!0;if(n.forEach(function(n,r){e[r]=n.split(","),e[r].length!==t&&(l=!1)}),!l)return void this.msgBarService.showError("send.bulk-send.error-inconsistent-data");var r=[];e.forEach(function(n,t){r[t]=[],n.forEach(function(n,e){r[t][e]=n.trim()})}),this.dialogRef.close(r)}catch(n){this.msgBarService.showError("send.bulk-send.error-invalid-data")}},n}(),Nm=function(){function n(n,t,e,r,i,o,s,a,u,c,d){this.blockchainService=n,this.walletService=t,this.appService=e,this.formBuilder=r,this.dialog=i,this.msgBarService=o,this.navbarService=s,this.hwWalletService=a,this.translate=u,this.priceService=c,this.changeDetector=d,this.onFormSubmitted=new l.o,this.maxNoteChars=am.MAX_NOTE_CHARS,this.addresses=[],this.allUnspentOutputs=[],this.unspentOutputs=[],this.loadingUnspentOutputs=!1,this.availableCoins=new Ae.BigNumber(0),this.availableHours=new Ae.BigNumber(0),this.minimumFee=new Ae.BigNumber(0),this.autoHours=!0,this.autoOptions=!1,this.autoShareValue="0.5",this.busy=!1,this.doubleButtonActive=Fp,this.selectedCurrency=Fp.LeftButton,this.totalCoins=new Ae.BigNumber(0),this.totalConvertedCoins=new Ae.BigNumber(0),this.totalHours=new Ae.BigNumber(0),this.subscriptionsGroup=[],this.destinationSubscriptions=[],this.destinationHoursSubscriptions=[]}return n.prototype.ngOnInit=function(){var n=this;this.navbarService.showSwitch("send.simple","send.advanced",Fp.RightButton),this.form=this.formBuilder.group({wallet:["",Xi.required],addresses:[null],outputs:[null],changeAddress:[""],destinations:this.formBuilder.array([this.createDestinationFormGroup()],this.validateDestinations.bind(this)),note:[""]}),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){n.wallet=t,n.closeGetOutputsSubscriptions(),n.allUnspentOutputs=[],n.unspentOutputs=[],n.loadingUnspentOutputs=!0,n.getOutputsSubscriptions=n.walletService.getWalletUnspentOutputs(t).retryWhen(function(n){return n.delay(1e3).take(10).concat(o.a.throw(""))}).subscribe(function(t){n.loadingUnspentOutputs=!1,n.allUnspentOutputs=t,n.unspentOutputs=n.filterUnspentOutputs()},function(){return n.loadingUnspentOutputs=!1}),n.addresses=t.addresses.filter(function(n){return n.coins>0}),n.form.get("addresses").setValue(null),n.form.get("outputs").setValue(null),n.updateAvailableBalance(),n.form.get("destinations").updateValueAndValidity()})),this.subscriptionsGroup.push(this.form.get("addresses").valueChanges.subscribe(function(){n.form.get("outputs").setValue(null),n.unspentOutputs=n.filterUnspentOutputs(),n.updateAvailableBalance(),n.form.get("destinations").updateValueAndValidity()})),this.subscriptionsGroup.push(this.form.get("outputs").valueChanges.subscribe(function(){n.updateAvailableBalance(),n.form.get("destinations").updateValueAndValidity()})),this.subscriptionsGroup.push(this.priceService.price.subscribe(function(t){n.price=t,n.updateValues()})),this.formData&&this.fillForm(),this.subscriptionsGroup.push(this.walletService.all().first().subscribe(function(t){n.wallets=t,1===t.length&&n.form.get("wallet").setValue(t[0])}))},n.prototype.ngOnDestroy=function(){this.processingSubscription&&!this.processingSubscription.closed&&this.processingSubscription.unsubscribe(),this.closeGetOutputsSubscriptions(),this.closeSyncCheckSubscription(),this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.navbarService.hideSwitch(),this.msgBarService.hide(),this.destinationSubscriptions.forEach(function(n){return n.unsubscribe()}),this.destinationHoursSubscriptions.forEach(function(n){return n.unsubscribe()})},n.prototype.preview=function(){this.previewTx=!0,this.checkBeforeSending(),this.changeDetector.detectChanges()},n.prototype.send=function(){this.previewTx=!1,this.checkBeforeSending()},n.prototype.changeActiveCurrency=function(n){n!==this.selectedCurrency&&(this.selectedCurrency=n,this.askIfConvertAmount(),this.updateValues(),this.form.get("destinations").updateValueAndValidity())},n.prototype.askIfConvertAmount=function(){var n=this,t=0;if(this.destControls.forEach(function(n,e){var l=n.get("coins").value;l=l?l.trim():l;var r=new Ae.BigNumber(l);l&&!r.isNaN()&&(t+=1)}),0!==t){var e,l,r=this.translate.instant("common.usd"),i=this.appService.coinName;this.selectedCurrency===Fp.LeftButton?(e=r,l=i):(e=i,l=r);var o={text:this.translate.instant(1===t?"send.convert-confirmation":"send.convert-confirmation-plural",{from:e,to:l}),headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"};Wc(this.dialog,o).afterClosed().subscribe(function(t){t&&n.convertAmounts()})}},n.prototype.convertAmounts=function(){var n=this;this.msgBarService.hide();var t=0,e=0;this.destControls.forEach(function(l,r){var i=l.get("coins").value;i=i?i.trim():i;var o=new Ae.BigNumber(i);if(i){if(!i||o.isNaN())return void(t+=1);var s;n.selectedCurrency===Fp.LeftButton?((s=o.dividedBy(n.price).decimalPlaces(n.blockchainService.currentMaxDecimals)).multipliedBy(n.price).decimalPlaces(um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR).isEqualTo(o)||(e+=1),l.get("coins").setValue(s.toString())):((s=o.multipliedBy(n.price).decimalPlaces(um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)).dividedBy(n.price).decimalPlaces(n.blockchainService.currentMaxDecimals).isEqualTo(o)||(e+=1),l.get("coins").setValue(s.toString()))}}),t>0&&e>0?this.msgBarService.showWarning(this.translate.instant("send.multiple-problems-warning")):1===t?this.msgBarService.showWarning(this.translate.instant("send.invaid-amount-warning")):t>1?this.msgBarService.showWarning(this.translate.instant("send.invaid-amounts-warning")):1===e?this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")):e>1&&this.msgBarService.showWarning(this.translate.instant("send.precision-errors-warning"))},n.prototype.assignAll=function(n){this.msgBarService.hide();var t=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:new Ae.BigNumber(-1);t.isEqualTo(-1)?this.msgBarService.showError(this.translate.instant("send.no-wallet-selected")):(this.selectedCurrency===Fp.RightButton&&(t=t.multipliedBy(this.price).decimalPlaces(um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)),this.destControls.forEach(function(e,l){if(l!==n){var r=Number.parseFloat(e.get("coins").value.trim());if(!r||isNaN(r))return;t=t.minus(r)}}),(t=t.decimalPlaces(this.selectedCurrency===Fp.LeftButton?this.blockchainService.currentMaxDecimals:um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)).isLessThan(0)?this.msgBarService.showError(this.translate.instant("send.no-coins-left")):this.destControls[n].get("coins").setValue(t.toString()))},n.prototype.updateValues=function(){var n=this;this.price?(this.values=[],this.totalCoins=new Ae.BigNumber(0),this.totalConvertedCoins=new Ae.BigNumber(0),this.totalHours=new Ae.BigNumber(0),this.destControls.forEach(function(t,e){var l=t.get("coins").value,r=n.getAmount(l,!0);if(r)if(n.selectedCurrency===Fp.LeftButton){var i=r.multipliedBy(n.price).decimalPlaces(2);n.totalCoins=n.totalCoins.plus(r),n.totalConvertedCoins=n.totalConvertedCoins.plus(i),n.values[e]=i.toNumber()}else i=r.dividedBy(n.price).decimalPlaces(n.blockchainService.currentMaxDecimals),n.totalCoins=n.totalCoins.plus(i),n.totalConvertedCoins=n.totalConvertedCoins.plus(r),n.values[e]=i.toNumber();else n.values[e]=-1}),this.autoHours||this.destControls.forEach(function(t,e){var l=t.get("hours").value,r=n.getAmount(l,!1);r&&(n.totalHours=n.totalHours.plus(r))})):this.values=null},n.prototype.checkBeforeSending=function(){var n=this;!this.form.valid||this.previewButton.isLoading()||this.sendButton.isLoading()||(this.closeSyncCheckSubscription(),this.syncCheckSubscription=this.blockchainService.synchronized.first().subscribe(function(t){t?n.prepareTransaction():n.showSynchronizingWarning()}))},n.prototype.showSynchronizingWarning=function(){var n=this;Wc(this.dialog,{text:"send.synchronizing-warning",headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"}).afterClosed().subscribe(function(t){t&&n.prepareTransaction()})},n.prototype.prepareTransaction=function(){var n=this;if(this.msgBarService.hide(),this.previewButton.resetState(),this.sendButton.resetState(),!this.form.value.wallet.encrypted||this.form.value.wallet.isHardware||this.previewTx)!this.form.value.wallet.isHardware||this.previewTx?this.createTransaction():(this.showBusy(),this.processingSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.form.value.wallet.addresses[0].address).subscribe(function(){return n.createTransaction()},function(t){return n.showError(Tc(n.translate,t))}));else{var t=new oa;t.data={wallet:this.form.value.wallet},this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.createTransaction(t)})}},n.prototype.addDestination=function(){this.form.get("destinations").push(this.createDestinationFormGroup()),this.updateValues()},n.prototype.removeDestination=function(n){this.form.get("destinations").removeAt(n),this.destinationSubscriptions[n].unsubscribe(),this.destinationSubscriptions.splice(n,1),this.destinationHoursSubscriptions[n].unsubscribe(),this.destinationHoursSubscriptions.splice(n,1),this.updateValues()},n.prototype.setShareValue=function(n){this.autoShareValue=parseFloat(n.value).toFixed(2)},n.prototype.selectChangeAddress=function(n){var t=this,e=new oa;e.width="566px",e.autoFocus=!1,this.dialog.open(Rm,e).afterClosed().subscribe(function(n){n&&t.form.get("changeAddress").setValue(n)})},n.prototype.openMultipleDestinationsPopup=function(){var n=this,t="";this.destControls.map(function(e,l){(e.get("address").value.trim().length>0||e.get("coins").value.trim().length>0||!n.autoHours&&e.get("hours").value.trim().length>0)&&(t+=e.get("address").value.replace(",",""),t+=", "+e.get("coins").value.replace(",",""),n.autoHours||(t+=", "+e.get("hours").value.replace(",","")),t+="\r\n")}),t.length>0&&(t=t.substr(0,t.length-1));var e=new oa;e.width="566px",e.data=t,this.dialog.open(Hm,e).afterClosed().subscribe(function(t){if(t){for(;n.destControls.length>0;)n.form.get("destinations").removeAt(0);t.length>0?(n.autoHours=2===t[0].length,t.forEach(function(t,e){n.addDestination(),n.destControls[e].get("address").setValue(t[0]),n.destControls[e].get("coins").setValue(t[1]),n.autoHours||n.destControls[e].get("hours").setValue(t[2])})):n.addDestination()}}),this.updateValues()},n.prototype.toggleOptions=function(n){n.stopPropagation(),n.preventDefault(),this.autoOptions=!this.autoOptions},n.prototype.setAutoHours=function(n){this.autoHours=n.checked,this.form.get("destinations").updateValueAndValidity(),this.updateValues(),this.autoHours||(this.autoOptions=!1)},n.prototype.fillForm=function(){var n=this;this.addresses=this.formData.form.wallet.addresses,["wallet","addresses","changeAddress","note"].forEach(function(t){n.form.get(t).setValue(n.formData.form[t])});for(var t=0;tthis.blockchainService.currentMaxDecimals)return null}else if(2===l.length&&l[1].length>um.MaxUsdDecimals)return null}else if("hours"===name&&!e.isEqualTo(e.decimalPlaces(0)))return null;return e},n.prototype.createDestinationFormGroup=function(){var n=this,t=this.formBuilder.group({address:"",coins:"",hours:""});return this.destinationSubscriptions.push(t.get("coins").valueChanges.subscribe(function(t){n.updateValues()})),this.destinationHoursSubscriptions.push(t.get("hours").valueChanges.subscribe(function(t){n.updateValues()})),t},n.prototype.showBusy=function(){this.previewTx?(this.previewButton.setLoading(),this.sendButton.setDisabled()):(this.sendButton.setLoading(),this.previewButton.setDisabled()),this.busy=!0,this.navbarService.disableSwitch()},n.prototype.createTransaction=function(n){var t=this;this.showBusy();var e=this.form.get("addresses").value&&this.form.get("addresses").value.length>0?this.form.get("addresses").value.map(function(n){return n.address}):null,l=this.form.get("outputs").value&&this.form.get("outputs").value.length>0?this.form.get("outputs").value.map(function(n){return n.hash}):null;this.processingSubscription=this.walletService.createTransaction(this.form.value.wallet,e||this.form.value.wallet.addresses.map(function(n){return n.address}),l,this.destinations,this.hoursSelection,this.form.get("changeAddress").value?this.form.get("changeAddress").value:null,n?n.password:null,this.previewTx).subscribe(function(e){n&&n.close();var l=t.form.value.note.trim();if(t.previewTx){var r=new Ae.BigNumber("0");t.destinations.map(function(n){return r=r.plus(n.coins)}),t.onFormSubmitted.emit({form:{wallet:t.form.get("wallet").value,addresses:t.form.get("addresses").value,changeAddress:t.form.get("changeAddress").value,destinations:t.destinations,hoursSelection:t.hoursSelection,autoOptions:t.autoOptions,allUnspentOutputs:t.loadingUnspentOutputs?null:t.allUnspentOutputs,outputs:t.form.get("outputs").value,currency:t.selectedCurrency,note:l},amount:r,to:t.destinations.map(function(n){return n.address}),transaction:e}),t.busy=!1,t.navbarService.enableSwitch()}else t.processingSubscription=t.walletService.injectTransaction(e.encoded,l).subscribe(function(n){var e=!0;l&&!n&&(t.msgBarService.showWarning(t.translate.instant("send.error-saving-note")),e=!1),t.showSuccess(e)},function(n){return t.showError(n)})},function(e){n&&n.error(e),t.showError(e&&e.result?Tc(t.translate,e):e)})},n.prototype.resetForm=function(){for(this.form.get("wallet").setValue("",{emitEvent:!1}),this.form.get("addresses").setValue(null),this.form.get("outputs").setValue(null),this.form.get("changeAddress").setValue(""),this.form.get("note").setValue(""),this.wallet=null;this.destControls.length>0;)this.form.get("destinations").removeAt(0);this.addDestination(),this.autoHours=!0,this.autoOptions=!1,this.autoShareValue="0.5",this.updateValues()},Object.defineProperty(n.prototype,"destinations",{get:function(){var n=this;return this.destControls.map(function(t,e){var l={address:t.get("address").value.trim(),coins:(n.selectedCurrency===Fp.LeftButton?t.get("coins").value:n.values[e].toString()).trim(),originalAmount:t.get("coins").value};return n.autoHours||(l.hours=t.get("hours").value),l})},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hoursSelection",{get:function(){var n={type:"manual"};return this.autoHours&&(n={type:"auto",mode:"share",share_factor:this.autoShareValue}),n},enumerable:!0,configurable:!0}),n.prototype.updateAvailableBalance=function(){var n=this;if(this.form.get("wallet").value){this.availableCoins=new Ae.BigNumber(0),this.availableHours=new Ae.BigNumber(0);var t=this.form.get("outputs").value,e=this.form.get("addresses").value;if(t&&t.length>0)t.map(function(t){n.availableCoins=n.availableCoins.plus(t.coins),n.availableHours=n.availableHours.plus(t.calculated_hours)});else if(e&&e.length>0)e.map(function(t){n.availableCoins=n.availableCoins.plus(t.coins),n.availableHours=n.availableHours.plus(t.hours)});else if(this.form.get("wallet").value){var l=this.form.get("wallet").value;this.availableCoins=l.coins,this.availableHours=l.hours}if(this.availableCoins.isGreaterThan(0)){var r=new Ae.BigNumber(1).minus(new Ae.BigNumber(1).dividedBy(this.appService.burnRate)),i=this.availableHours.multipliedBy(r).decimalPlaces(0,Ae.BigNumber.ROUND_FLOOR);this.minimumFee=this.availableHours.minus(i),this.availableHours=i}else this.minimumFee=new Ae.BigNumber(0),this.availableHours=new Ae.BigNumber(0)}},n.prototype.filterUnspentOutputs=function(){var n=this;return 0===this.allUnspentOutputs.length?[]:this.form.get("addresses").value&&0!==this.form.get("addresses").value.length?this.allUnspentOutputs.filter(function(t){return n.form.get("addresses").value.some(function(n){return n.address===t.address})}):this.allUnspentOutputs},n.prototype.closeGetOutputsSubscriptions=function(){this.loadingUnspentOutputs=!1,this.getOutputsSubscriptions&&this.getOutputsSubscriptions.unsubscribe()},n.prototype.closeSyncCheckSubscription=function(){this.syncCheckSubscription&&this.syncCheckSubscription.unsubscribe()},n.prototype.showSuccess=function(n){var t=this;this.busy=!1,this.navbarService.enableSwitch(),this.resetForm(),n?(this.msgBarService.showDone("send.sent"),this.sendButton.resetState()):(this.sendButton.setSuccess(),setTimeout(function(){t.sendButton.resetState()},3e3))},n.prototype.showError=function(n){this.busy=!1,this.msgBarService.showError(n),this.navbarService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},n}(),Fm=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{height:12px!important;width:12px!important;opacity:.5;margin:0!important;display:inline-block;position:relative;top:2px}.form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:12px!important;width:12px!important}.-destination[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%]{text-align:right;padding-top:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px;cursor:pointer}mat-checkbox[_ngcontent-%COMP%]{font-size:12px}mat-select[_ngcontent-%COMP%]{background:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px}mat-select[_ngcontent-%COMP%] .mat-select-trigger{padding:10px 30px 10px 10px;display:block;font-size:11px;height:100%;line-height:20px}mat-select[_ngcontent-%COMP%] .mat-select-arrow{border:none}mat-select[_ngcontent-%COMP%] .mat-select-placeholder{color:unset!important;-webkit-transition:unset!important;transition:unset!important}mat-option[_ngcontent-%COMP%] .mat-pseudo-checkbox-checked{background:#0072ff}.-autohours[_ngcontent-%COMP%]{margin:40px 0 20px}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{stroke:#0072ff!important}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-background, .-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-frame{width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-label{line-height:20px;font-size:13px;color:#1e2227;-webkit-box-flex:1;-ms-flex:1;flex:1}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-layout{display:-webkit-box;display:-ms-flexbox;display:flex}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%]{margin-top:20px}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%]{width:100%;padding:0;height:40px;border:2px solid rgba(0,0,0,.05);border-radius:6px;background:#fff}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb, .-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb-label{background-color:#0072ff!important;-webkit-transform:scale(1)!important;transform:scale(1)!important;border-width:0!important}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb{right:-6px;width:12px;height:32px;border-radius:3px}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-track-background, .-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-track-fill{background-color:#fff!important}.-options[_ngcontent-%COMP%]{padding-left:5px;color:#0072ff;cursor:pointer;font-size:13px}.-options[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#0072ff;padding:0;display:inline;vertical-align:middle;font-size:13px}.-buttons[_ngcontent-%COMP%]{text-align:center}.-hidden[_ngcontent-%COMP%]{display:none}.-space-between[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}label[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom;padding-left:5px}.-available-msg[_ngcontent-%COMP%]{background-color:#f7f7f7;border:1px dotted rgba(30,34,39,.2);border-radius:6px;padding:10px;font-size:11px;text-align:center}.-available-msg[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{opacity:.7}.-available-msg[_ngcontent-%COMP%] .value[_ngcontent-%COMP%]{opacity:1!important;font-weight:700;font-size:13px}.destinations-label[_ngcontent-%COMP%]{display:inline-block}"]],data:{}});function Bm(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,5,"option",[],[[8,"disabled",0]],null,null,null,null)),l._8(3,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(4,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(5,null,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.context.$implicit),n(t,4,0,t.context.$implicit)},function(n,t){n(t,2,0,!t.context.$implicit.coins||t.context.$implicit.coins.isLessThanOrEqualTo(0)),n(t,5,0,t.context.$implicit.label,l._32(t,5,1,l._22(t,6).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,5,2,l._22(t,7).transform(t.context.$implicit.hours.toString(),!1)))})}function Vm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Bm)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.wallets)},null)}function Wm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[3,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,1,0,t.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.address,l._32(t,2,1,l._22(t,3).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,2,2,l._22(t,4).transform(t.context.$implicit.hours.toString(),!1)))})}function zm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],null,function(n,t){n(t,1,0,t.context.$implicit.address,l._32(t,1,1,l._22(t,2).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,1,2,l._22(t,3).transform(t.context.$implicit.hours.toString(),!1)))})}function Um(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Gm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[6,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,1,0,t.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.hash,l._32(t,2,1,l._22(t,3).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,2,2,l._22(t,4).transform(t.context.$implicit.calculated_hours.toString(),!1)))})}function qm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],null,function(n,t){n(t,1,0,t.context.$implicit.hash,l._32(t,1,1,l._22(t,2).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,1,2,l._22(t,3).transform(t.context.$implicit.calculated_hours.toString(),!1)))})}function Jm(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"mat-select-trigger",[],null,null,null,null,null)),l._8(1,16384,[[8,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qm)),l._8(4,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,t.component.form.get("outputs").value)},null)}function Qm(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"mat-select-trigger",[],null,null,null,null,null)),l._8(1,16384,[[8,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(4,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("send.all-outputs")))})}function Km(n){return l._33(0,[(n()(),l._9(0,0,null,null,116,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,39,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,8,"label",[],[[8,"htmlFor",0]],[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==(n.component.busy?null:l._22(n,23).open())&&r),r},null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(7,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,9).show()&&r),"keydown"===t&&(r=!1!==l._22(n,9)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,9).hide(1500)&&r),r},Hf,Rf)),l._8(8,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(9,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,26,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,23,"mat-select",[["class","mat-select"],["formControlName","addresses"],["id","addresses"],["multiple",""],["role","listbox"]],[[1,"disabled",0],[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,23)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,23)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,23)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(19,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(20,{"element-disabled":0}),l._8(21,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,2080768,[["selectAddresses",4]],3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"],multiple:[1,"multiple"],compareWith:[2,"compareWith"],id:[3,"id"]},null),l._29(603979776,3,{options:1}),l._29(603979776,4,{optionGroups:1}),l._29(335544320,5,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(28,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,1,null,Wm)),l._8(31,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._9(33,0,null,0,5,"mat-select-trigger",[],null,null,null,null,null)),l._8(34,16384,[[5,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zm)),l._8(37,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,41,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,11,"label",[],[[8,"htmlFor",0]],[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==(n.component.busy?null:l._22(n,67).open())&&r),r},null,null)),(n()(),l._31(46,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(48,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,50).show()&&r),"keydown"===t&&(r=!1!==l._22(n,50)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,50).hide(1500)&&r),r},Hf,Rf)),l._8(49,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(50,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Um)),l._8(55,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,25,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(60,0,null,null,22,"mat-select",[["class","mat-select"],["formControlName","outputs"],["id","outputs"],["multiple",""],["role","listbox"]],[[1,"disabled",0],[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,67)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,67)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,67)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(63,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(64,{"element-disabled":0}),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,2080768,[["selectOutputs",4]],3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"],multiple:[1,"multiple"],compareWith:[2,"compareWith"],id:[3,"id"]},null),l._29(603979776,6,{options:1}),l._29(603979776,7,{optionGroups:1}),l._29(603979776,8,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(72,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,1,null,Gm)),l._8(75,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,0,1,null,Jm)),l._8(78,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,0,1,null,Qm)),l._8(81,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(86,0,null,null,29,"div",[["class","form-field -available-msg"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(88,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(89,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(92,0,null,null,2,"span",[["class","value"]],null,null,null,null,null)),(n()(),l._31(93,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(96,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(97,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(100,0,null,null,2,"span",[["class","value"]],null,null,null,null,null)),(n()(),l._31(101,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(104,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(105,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(108,0,null,null,2,"span",[["class","value"]],null,null,null,null,null)),(n()(),l._31(109,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(112,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(113,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,8,0),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("send.addresses-help"))),n(t,19,0,n(t,20,0,e.busy)),n(t,21,0,"addresses"),n(t,23,0,l._32(t,23,0,l._22(t,27).transform("send.all-addresses")),"",e.addressCompare,"addresses"),n(t,31,0,e.addresses),n(t,37,0,e.form.get("addresses").value),n(t,49,0),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("send.outputs-help"))),n(t,55,0,e.loadingUnspentOutputs),n(t,63,0,n(t,64,0,e.busy)),n(t,65,0,"outputs"),n(t,67,0,l._32(t,67,0,l._22(t,71).transform("send.all-outputs")),"",e.outputCompare,"outputs"),n(t,75,0,e.unspentOutputs),n(t,78,0,e.form.get("outputs").value&&e.form.get("outputs").value.length>0),n(t,81,0,!e.form.get("outputs").value||0===e.form.get("outputs").value.length)},function(n,t){var e=t.component;n(t,4,0,e.busy?"":"addresses"),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("send.addresses-label"))),n(t,16,1,[e.busy?"true":null,l._22(t,23).id,l._22(t,23).tabIndex,l._22(t,23)._ariaLabel,l._22(t,23).ariaLabelledby,l._22(t,23).required.toString(),l._22(t,23).disabled.toString(),l._22(t,23).errorState,l._22(t,23).panelOpen?l._22(t,23)._optionIds:null,l._22(t,23).multiple,l._22(t,23)._ariaDescribedby||null,l._22(t,23)._getAriaActiveDescendant(),l._22(t,23).disabled,l._22(t,23).errorState,l._22(t,23).required,l._22(t,28).ngClassUntouched,l._22(t,28).ngClassTouched,l._22(t,28).ngClassPristine,l._22(t,28).ngClassDirty,l._22(t,28).ngClassValid,l._22(t,28).ngClassInvalid,l._22(t,28).ngClassPending]),n(t,45,0,e.busy?null:"outputs"),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("send.outputs-label"))),n(t,60,1,[e.busy?"true":null,l._22(t,67).id,l._22(t,67).tabIndex,l._22(t,67)._ariaLabel,l._22(t,67).ariaLabelledby,l._22(t,67).required.toString(),l._22(t,67).disabled.toString(),l._22(t,67).errorState,l._22(t,67).panelOpen?l._22(t,67)._optionIds:null,l._22(t,67).multiple,l._22(t,67)._ariaDescribedby||null,l._22(t,67)._getAriaActiveDescendant(),l._22(t,67).disabled,l._22(t,67).errorState,l._22(t,67).required,l._22(t,72).ngClassUntouched,l._22(t,72).ngClassTouched,l._22(t,72).ngClassPristine,l._22(t,72).ngClassDirty,l._22(t,72).ngClassValid,l._22(t,72).ngClassInvalid,l._22(t,72).ngClassPending]),n(t,89,0,l._32(t,89,0,l._22(t,90).transform("send.available-msg-part1"))),n(t,93,0,l._32(t,93,0,l._22(t,94).transform(e.availableCoins.toString()))),n(t,97,0,l._32(t,97,0,l._22(t,98).transform("send.available-msg-part2"))),n(t,101,0,l._32(t,101,0,l._22(t,102).transform(e.availableHours.toString(),!1))),n(t,105,0,l._32(t,105,0,l._22(t,106).transform("send.available-msg-part3"))),n(t,109,0,l._32(t,109,0,l._22(t,110).transform(e.minimumFee.toString(),!1))),n(t,113,0,l._32(t,113,0,l._22(t,114).transform("send.available-msg-part4")))})}function Xm(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[["class","coin-selector-container"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,3,"app-double-button",[["className","light small"]],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeActiveCurrency(e)&&l),l},M_,x_)),l._8(5,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"],className:[3,"className"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,"coin-selector-container",n(t,2,0,e.busy)),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("common.usd")),l._32(t,5,1,l._22(t,7).transform("coin")),e.selectedCurrency,"light small")},null)}function Zm(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("send.invalid-amount")))})}function $m(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ "," ","\n "])),l._27(2,2),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,n(t,2,0,l._22(t.parent.parent,0),e.values[t.parent.context.index],"1.0-2")),l._32(t,1,1,l._22(t,3).transform("common.usd")))})}function ng(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ ","\n "])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.values[t.parent.context.index])))})}function tg(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["alt","plus"],["src","../../../../../assets/img/plus-green.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addDestination()&&l),l},null,null))],null,null)}function eg(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["alt","minus"],["src","../../../../../assets/img/minus-grey.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removeDestination(n.parent.context.index)&&l),l},null,null))],null,null)}function lg(n){return l._33(0,[(n()(),l._9(0,0,null,null,86,"div",[["class","-destination"],["formArrayName","destinations"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),l._8(1,212992,null,0,Qo,[[3,qi],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,qi,null,[Qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,80,"div",[["class","row"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),l._8(6,212992,null,0,Jo,[[3,qi],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,qi,null,[Jo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,8,"div",[["class","col-lg-5 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,5,"input",[["formControlName","address"]],[[8,"id",0],[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,13)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,13).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,13)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,13)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(13,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(15,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(17,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,34,"div",[["class","col-md-3"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,13,"div",[["class","-input-addon"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,5,"input",[["formControlName","coins"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,25)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,25).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,25)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,25)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(25,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(27,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(29,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(31,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(32,null,["",""])),l._25(0,l_,[gf]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,16,"div",[["class","coins-value-label"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Zm)),l._8(40,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,$m)),l._8(43,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ng)),l._8(46,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,4,"div",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.assignAll(n.context.index)&&l),l},null,null)),l._8(49,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(50,{"centerd-link":0}),(n()(),l._31(51,null,["(",")"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,17,"div",[["class","col-lg-3 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,14,"div",[],null,null,null,null,null)),l._8(59,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(60,{"-input-addon":0,"-hidden":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(62,0,null,null,5,"input",[["formControlName","hours"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,63)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,63).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,63)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,63)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(63,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(69,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(70,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,0,null,null,9,"div",[["class","col-md-1 -icons"]],null,null,null,null,null)),l._8(76,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(77,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,tg)),l._8(80,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,eg)),l._8(83,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,"destinations"),n(t,6,0,t.context.index),n(t,15,0,"address"),n(t,27,0,"coins"),n(t,40,0,e.price&&e.values[t.context.index]<0),n(t,43,0,e.price&&e.values[t.context.index]>=0&&e.selectedCurrency===e.doubleButtonActive.LeftButton),n(t,46,0,e.price&&e.values[t.context.index]>=0&&e.selectedCurrency===e.doubleButtonActive.RightButton),n(t,49,0,"link",n(t,50,0,!e.price)),n(t,59,0,n(t,60,0,!0,e.autoHours)),n(t,65,0,"hours"),n(t,76,0,"col-md-1 -icons",n(t,77,0,e.busy)),n(t,80,0,0===t.context.index),n(t,83,0,0!==t.context.index)},function(n,t){var e=t.component;n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,12,0,0===t.context.index?"destination":"",e.busy?"true":null,l._22(t,17).ngClassUntouched,l._22(t,17).ngClassTouched,l._22(t,17).ngClassPristine,l._22(t,17).ngClassDirty,l._22(t,17).ngClassValid,l._22(t,17).ngClassInvalid,l._22(t,17).ngClassPending),n(t,24,0,e.busy?"true":null,l._22(t,29).ngClassUntouched,l._22(t,29).ngClassTouched,l._22(t,29).ngClassPristine,l._22(t,29).ngClassDirty,l._22(t,29).ngClassValid,l._22(t,29).ngClassInvalid,l._22(t,29).ngClassPending),n(t,32,0,l._32(t,32,0,e.selectedCurrency===e.doubleButtonActive.LeftButton?l._22(t,33).transform("coin"):l._22(t,34).transform("common.usd"))),n(t,51,0,l._32(t,51,0,l._22(t,52).transform("send.send-all-available-coins"))),n(t,62,0,e.busy?"true":null,l._22(t,67).ngClassUntouched,l._22(t,67).ngClassTouched,l._22(t,67).ngClassPristine,l._22(t,67).ngClassDirty,l._22(t,67).ngClassValid,l._22(t,67).ngClassInvalid,l._22(t,67).ngClassPending),n(t,70,0,l._32(t,70,0,l._22(t,71).transform("hours")))})}function rg(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[["class","col-lg-3 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,6,"div",[["class","coins-value-label"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(7,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("send.total"))),n(t,7,0,l._32(t,7,0,l._22(t,8).transform(e.totalHours.toString(),!1)))})}function ig(n){return l._33(0,[(n()(),l._9(0,0,null,null,19,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"div",[["class","col-lg-5 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,11,"div",[["class","col-md-3"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,8,"div",[["class","coins-value-label"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(11,null,[" "," / "," ","\n "])),l._25(0,If,[tn,qc,gf]),l._27(13,2),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,rg)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,18,0,!t.component.autoHours)},function(n,t){var e=t.component;n(t,9,0,l._32(t,9,0,l._22(t,10).transform("send.total"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform(e.totalCoins.toString())),l._32(t,11,1,n(t,13,0,l._22(t.parent,0),e.totalConvertedCoins.toString(),"1.0-2")),l._32(t,11,2,l._22(t,14).transform("common.usd")))})}function og(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"span",[["class","-options"]],null,[[null,"mousedown"],[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"mousedown"===t&&(l=!1!==e.stopPropagation()&&l),"click"===t&&(l=!1!==r.toggleOptions(e)&&l),l},null,null)),(n()(),l._31(1,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(4,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(5,0,["",""])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0)},function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("send.options-label"))),n(t,5,0,e.autoOptions?"keyboard_arrow_up":"keyboard_arrow_down")})}function sg(n){return l._33(0,[l._25(0,tn,[l.w]),l._29(402653184,1,{previewButton:0}),l._29(402653184,2,{sendButton:0}),(n()(),l._9(3,0,null,null,178,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,4).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,4).onReset()&&r),r},null,null)),l._8(4,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(6,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,27,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"label",[["for","wallets"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,20,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,17,"select",[["formControlName","wallet"],["id","wallets"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,19).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,19).onTouched()&&r),r},null,null)),l._8(17,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(18,{"element-disabled":0}),l._8(19,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(21,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,4,"option",[["disabled",""],["hidden",""]],null,null,null,null,null)),l._8(26,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(27,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(28,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Vm)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Km)),l._8(38,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(40,0,null,null,30,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,8,"label",[["class","destinations-label"],["for","destination"]],null,null,null,null,null)),(n()(),l._31(43,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(45,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,47).show()&&r),"keydown"===t&&(r=!1!==l._22(n,47)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,47).hide(1500)&&r),r},Hf,Rf)),l._8(46,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(47,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Xm)),l._8(53,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(55,0,null,null,8,"span",[["class","-options"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.openMultipleDestinationsPopup()&&l),l},null,null)),l._8(56,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(57,{"element-disabled":0}),(n()(),l._31(58,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(60,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(61,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,lg)),l._8(66,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ig)),l._8(69,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(72,0,null,null,28,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(74,0,null,null,18,"label",[["for","change-address"]],null,null,null,null,null)),(n()(),l._31(75,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(77,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,79).show()&&r),"keydown"===t&&(r=!1!==l._22(n,79)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,79).hide(1500)&&r),r},Hf,Rf)),l._8(78,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(79,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(83,0,null,null,8,"span",[["class","-options"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.selectChangeAddress(e)&&l),l},null,null)),l._8(84,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(85,{"element-disabled":0}),(n()(),l._31(86,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(88,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(89,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(94,0,null,null,5,"input",[["formControlName","changeAddress"],["id","change-address"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,95)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,95).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,95)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,95)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(95,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(97,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(99,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(102,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(104,0,null,null,8,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(105,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(107,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,109).show()&&r),"keydown"===t&&(r=!1!==l._22(n,109)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,109).hide(1500)&&r),r},Hf,Rf)),l._8(108,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(109,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(114,0,null,null,7,"input",[["formControlName","note"],["id","note"]],[[1,"disabled",0],[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,115)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,115).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,115)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,115)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.preview()&&r),r},null,null)),l._8(115,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(116,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(119,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(121,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(124,0,null,null,56,"div",[["class","-autohours"]],null,null,null,null,null)),l._8(125,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(126,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(128,0,null,null,19,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(130,0,null,null,16,"div",[["class","col-xl-4 col-lg-5 col-md-7"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(132,0,null,null,13,"mat-checkbox",[["class","-check mat-checkbox"]],[[1,"disabled",0],[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAutoHours(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(134,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(136,0,null,0,8,"div",[["class","-space-between"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(138,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(139,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,og)),l._8(143,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(149,0,null,null,30,"div",[],null,null,null,null,null)),l._8(150,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(151,{"row -options-wrapper":0,"-hidden":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(153,0,null,null,25,"div",[["class","col-md-5"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(155,0,null,null,22,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(157,0,null,null,15,"label",[["class","-space-between"],["for","value"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(159,0,null,null,8,"span",[],null,null,null,null,null)),(n()(),l._31(160,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(162,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,164).show()&&r),"keydown"===t&&(r=!1!==l._22(n,164)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,164).hide(1500)&&r),r},Hf,Rf)),l._8(163,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(164,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(169,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(170,null,["",""])),l._27(171,2),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(174,0,null,null,2,"mat-slider",[["class","-slider mat-slider"],["id","value"],["max","1"],["min","0.1"],["role","slider"],["step","0.01"]],[[1,"disabled",0],[8,"tabIndex",0],[1,"aria-disabled",0],[1,"aria-valuemax",0],[1,"aria-valuemin",0],[1,"aria-valuenow",0],[1,"aria-orientation",0],[2,"mat-slider-disabled",null],[2,"mat-slider-has-ticks",null],[2,"mat-slider-horizontal",null],[2,"mat-slider-axis-inverted",null],[2,"mat-slider-sliding",null],[2,"mat-slider-thumb-label-showing",null],[2,"mat-slider-vertical",null],[2,"mat-slider-min-value",null],[2,"mat-slider-hide-last-tick",null]],[[null,"input"],[null,"focus"],[null,"blur"],[null,"click"],[null,"keydown"],[null,"keyup"],[null,"mouseenter"],[null,"slide"],[null,"slideend"],[null,"slidestart"]],function(n,t,e){var r=!0,i=n.component;return"focus"===t&&(r=!1!==l._22(n,176)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,176)._onBlur()&&r),"click"===t&&(r=!1!==l._22(n,176)._onClick(e)&&r),"keydown"===t&&(r=!1!==l._22(n,176)._onKeydown(e)&&r),"keyup"===t&&(r=!1!==l._22(n,176)._onKeyup()&&r),"mouseenter"===t&&(r=!1!==l._22(n,176)._onMouseenter()&&r),"slide"===t&&(r=!1!==l._22(n,176)._onSlide(e)&&r),"slideend"===t&&(r=!1!==l._22(n,176)._onSlideEnd()&&r),"slidestart"===t&&(r=!1!==l._22(n,176)._onSlideStart(e)&&r),"input"===t&&(r=!1!==i.setShareValue(e)&&r),r},Im,jm)),l._28(5120,null,to,function(n){return[n]},[Uu]),l._8(176,245760,null,0,Uu,[l.l,Rr,l.h,[2,Dl],[8,null]],{max:[0,"max"],min:[1,"min"],step:[2,"step"],value:[3,"value"]},{input:"input"}),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(183,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(185,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.preview()&&l),l},w_,g_)),l._8(186,49152,[[1,4],["previewButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(187,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(190,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.send()&&l),l},w_,g_)),l._8(191,49152,[[2,4],["sendButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(192,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,e.form),n(t,17,0,n(t,18,0,e.busy)),n(t,21,0,"wallet"),n(t,26,0,""),n(t,27,0,""),n(t,32,0,e.wallets),n(t,38,0,e.wallet),n(t,46,0),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("send.destinations-help"+(e.autoHours?"1":"2")))),n(t,53,0,e.price),n(t,56,0,"-options",n(t,57,0,e.busy)),n(t,61,0),n(t,66,0,e.destControls),n(t,69,0,e.destControls.length>1),n(t,78,0),n(t,79,0,l._32(t,79,0,l._22(t,80).transform("send.change-address-help"))),n(t,84,0,"-options",n(t,85,0,e.busy)),n(t,89,0),n(t,97,0,"changeAddress"),n(t,108,0),n(t,109,0,l._32(t,109,0,l._22(t,110).transform("send.personal-note-help"))),n(t,116,0,e.maxNoteChars),n(t,119,0,"note"),n(t,125,0,"-autohours",n(t,126,0,e.busy)),n(t,134,0,e.autoHours),n(t,143,0,e.autoHours),n(t,150,0,n(t,151,0,!0,!e.autoOptions)),n(t,163,0),n(t,164,0,l._32(t,164,0,l._22(t,165).transform("send.value-help"))),n(t,176,0,"1","0.1","0.01",e.autoShareValue),n(t,186,0,!e.form.valid),n(t,191,0,!e.form.valid)},function(n,t){var e=t.component;n(t,3,0,l._22(t,6).ngClassUntouched,l._22(t,6).ngClassTouched,l._22(t,6).ngClassPristine,l._22(t,6).ngClassDirty,l._22(t,6).ngClassValid,l._22(t,6).ngClassInvalid,l._22(t,6).ngClassPending),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("send.wallet-label"))),n(t,16,0,e.busy?"true":null,l._22(t,23).ngClassUntouched,l._22(t,23).ngClassTouched,l._22(t,23).ngClassPristine,l._22(t,23).ngClassDirty,l._22(t,23).ngClassValid,l._22(t,23).ngClassInvalid,l._22(t,23).ngClassPending),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("send.select-wallet"))),n(t,43,0,l._32(t,43,0,l._22(t,44).transform("send.destinations-label"))),n(t,58,0,l._32(t,58,0,l._22(t,59).transform("send.bulk-send.title"))),n(t,75,0,l._32(t,75,0,l._22(t,76).transform("send.change-address-label"))),n(t,86,0,l._32(t,86,0,l._22(t,87).transform("send.change-address-select"))),n(t,94,0,e.busy?"true":null,l._22(t,99).ngClassUntouched,l._22(t,99).ngClassTouched,l._22(t,99).ngClassPristine,l._22(t,99).ngClassDirty,l._22(t,99).ngClassValid,l._22(t,99).ngClassInvalid,l._22(t,99).ngClassPending),n(t,105,0,l._32(t,105,0,l._22(t,106).transform("send.personal-note-label"))),n(t,114,0,e.busy?"true":null,l._22(t,116).maxlength?l._22(t,116).maxlength:null,l._22(t,121).ngClassUntouched,l._22(t,121).ngClassTouched,l._22(t,121).ngClassPristine,l._22(t,121).ngClassDirty,l._22(t,121).ngClassValid,l._22(t,121).ngClassInvalid,l._22(t,121).ngClassPending),n(t,132,0,e.busy?"true":null,l._22(t,134).id,l._22(t,134).indeterminate,l._22(t,134).checked,l._22(t,134).disabled,"before"==l._22(t,134).labelPosition),n(t,139,0,l._32(t,139,0,l._22(t,140).transform("send.hours-allocation-label"))),n(t,160,0,l._32(t,160,0,l._22(t,161).transform("send.value-label"))),n(t,170,0,l._32(t,170,0,n(t,171,0,l._22(t,0),e.autoShareValue,"1.0-2"))),n(t,174,1,[e.busy?"true":null,l._22(t,176).tabIndex,l._22(t,176).disabled,l._22(t,176).max,l._22(t,176).min,l._22(t,176).value,l._22(t,176).vertical?"vertical":"horizontal",l._22(t,176).disabled,l._22(t,176).tickInterval,!l._22(t,176).vertical,l._22(t,176)._invertAxis,l._22(t,176)._isSliding,l._22(t,176).thumbLabel,l._22(t,176).vertical,l._22(t,176)._isMinValue,l._22(t,176).disabled||l._22(t,176)._isMinValue&&l._22(t,176)._thumbGap&&l._22(t,176)._invertAxis]),n(t,187,0,l._32(t,187,0,l._22(t,188).transform("send.preview-button"))),n(t,192,0,l._32(t,192,0,l._22(t,193).transform("send.send-button")))})}var ag=function(){function n(){}return n.prototype.transform=function(n){return zp.unix(n).format("YYYY-MM-DD HH:mm")},n}(),ug=function(){function n(n,t){var e=this;this.priceService=n,this.dialog=t,this.showInputsOutputs=!1,this.subscription=this.priceService.price.subscribe(function(n){return e.price=n})}return Object.defineProperty(n.prototype,"hoursText",{get:function(){if(!this.transaction)return"";if(!this.isPreview){if(this.transaction.coinsMovedInternally)return"tx.hours-moved";if(this.transaction.balance.isGreaterThan(0))return"tx.hours-received"}return"tx.hours-sent"},enumerable:!0,configurable:!0}),n.prototype.ngOnInit=function(){var n=this;this.isPreview&&(this.transaction.hoursSent=new Ae.BigNumber("0"),this.transaction.outputs.filter(function(t){return n.transaction.to.find(function(n){return n===t.address})}).map(function(t){return n.transaction.hoursSent=n.transaction.hoursSent.plus(new Ae.BigNumber(t.hours))}))},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n.prototype.toggleInputsOutputs=function(n){n.preventDefault(),this.showInputsOutputs=!this.showInputsOutputs},n.prototype.editNote=function(){var n=this,t=new oa;t.width="566px",t.data=this.transaction,this.dialog.open(am,t).afterClosed().subscribe(function(t){(t||""===t)&&(n.transaction.note=t)})},n}(),cg=l._7({encapsulation:0,styles:[["h4[_ngcontent-%COMP%]{font-size:14px;margin:0 0 30px}.-item[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}.-item[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{padding:10px;background:#f7f7f7;-ms-flex-item-align:start;align-self:flex-start;border-radius:10px}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin-left:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{word-break:break-all}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{padding:10px 0;margin-bottom:5px}.-data[_ngcontent-%COMP%]{font-size:12px;display:-webkit-box;display:-ms-flexbox;display:flex}.-data[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:first-child{color:rgba(30,34,39,.5);display:inline-block;width:60px;-ms-flex-negative:0;flex-shrink:0}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(2){word-break:break-word}.-data[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;padding-left:5px;color:#0072ff;cursor:pointer}.-data[_ngcontent-%COMP%] .-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-data.-more[_ngcontent-%COMP%]{margin-bottom:0!important}.-data.-more[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{width:auto!important;margin-top:20px;color:#0072ff;cursor:pointer}.-data.-more[_ngcontent-%COMP%] span[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;vertical-align:middle;font-size:13px}.-tx-meta[_ngcontent-%COMP%] .-data[_ngcontent-%COMP%]{margin-bottom:10px}.-tx-price[_ngcontent-%COMP%]{text-align:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.-tx-price[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.-tx-price[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:30px}.-tx-price[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:10px 0 5px}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:12px;margin:0}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}.-margin-top[_ngcontent-%COMP%]{margin-top:30px}"]],data:{}});function dg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.confirm-transaction")))})}function hg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.transaction")))})}function pg(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,8,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(8,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,8,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(15,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(18,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(19,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("tx.from"))),n(t,9,0,e.transaction.from),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("tx.to"))),n(t,19,0,e.transaction.to.join(", "))})}function fg(n){return l._33(0,[(n()(),l._9(0,0,null,null,23,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,9,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(8,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._27(10,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,9,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(16,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(19,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(20,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("tx.date"))),n(t,9,0,l._32(t,9,0,n(t,10,0,l._22(t.parent,0),e.transaction.timestamp))),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("tx.status"))),n(t,20,0,l._32(t,20,0,l._22(t,21).transform(e.transaction.confirmed?"tx.confirmed":"tx.pending")))})}function _g(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(6,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("tx.id"))),n(t,7,0,e.transaction.txid)})}function mg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.transaction.note)})}function gg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","-grey"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.without-note")))})}function yg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.editNote()&&l),l},Hf,Rf)),l._8(1,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["edit"]))],function(n,t){n(t,1,0)},null)}function bg(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,mg)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gg)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,yg)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,7,0,e.transaction.note),n(t,10,0,!e.transaction.note),n(t,13,0,!e.isPreview)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("tx.note")))})}function vg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["*"]))],null,null)}function wg(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,7,"p",[],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(3,null,["\n ",""])),l._27(4,4),(n()(),l._4(16777216,null,null,1,null,vg)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(0,null,null,0))],function(n,t){var e=t.component;n(t,1,0,e.isPreview?"":l._32(t,1,0,l._22(t,2).transform("tx.current-rate"))),n(t,6,0,!e.isPreview)},function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,n(t,4,0,l._22(t.parent,1),e.transaction.balance*e.price,"USD","symbol","1.2-2")))})}function xg(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[["class","-data -more"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,6,"span",[],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleInputsOutputs(e)&&l),l},null,null)),(n()(),l._31(3,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(5,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(6,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,6,0)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("tx.show-more")))})}function Mg(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,20,"div",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,1,"div",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(13,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(15,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(21,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(23,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,t.context.index+1),n(t,8,0,e.isPreview?t.context.$implicit.address:t.context.$implicit.owner),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("tx.coins"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform(t.context.$implicit.coins,!0,"first"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("tx.hours"))),n(t,23,0,l._32(t,23,0,l._22(t,24).transform(t.context.$implicit.calculated_hours,!1,"first")))})}function kg(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,20,"div",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,1,"div",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(13,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(15,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(21,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(23,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,t.context.index+1),n(t,8,0,e.isPreview?t.context.$implicit.address:t.context.$implicit.dst),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("tx.coins"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform(t.context.$implicit.coins,!0,"first"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("tx.hours"))),n(t,23,0,l._32(t,23,0,l._22(t,24).transform(t.context.$implicit.hours,!1,"first")))})}function Cg(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,8,"div",[["class","col-md-6 -margin-top"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Mg)),l._8(9,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,8,"div",[["class","col-md-6 -margin-top"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,kg)),l._8(19,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,9,0,e.transaction.inputs),n(t,19,0,e.transaction.outputs)},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("tx.inputs"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("tx.outputs")))})}function Sg(n){return l._33(0,[l._25(0,ag,[]),l._25(0,ln,[l.w]),(n()(),l._9(2,0,null,null,65,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,59,"div",[["class","col-md-12"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,dg)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,hg)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,47,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,27,"div",[["class","col-md-9 -tx-meta"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,pg)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,fg)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,12,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(25,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,5,"span",[],null,null,null,null,null)),(n()(),l._31(29,null,["\n "," ","\n |\n "," ","\n "])),l._25(0,If,[tn,qc,gf]),l._25(131072,De.i,[De.j,l.h]),l._25(0,If,[tn,qc,gf]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,_g)),l._8(37,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,bg)),l._8(40,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,15,"div",[["class","col-md-3 -tx-price"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),l._8(46,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(47,{"-incoming":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,0,"img",[["src","/assets/img/send-blue.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(52,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(53,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,wg)),l._8(57,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,xg)),l._8(62,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Cg)),l._8(66,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,7,0,e.isPreview),n(t,10,0,!e.isPreview),n(t,17,0,e.isPreview),n(t,20,0,!e.isPreview),n(t,37,0,!e.isPreview),n(t,40,0,e.transaction.note||!e.isPreview),n(t,46,0,"-icon",n(t,47,0,!e.isPreview&&e.transaction.balance.isGreaterThan(0)&&!e.transaction.coinsMovedInternally)),n(t,57,0,e.price),n(t,62,0,!e.showInputsOutputs),n(t,66,0,e.showInputsOutputs)},function(n,t){var e=t.component;n(t,25,0,l._32(t,25,0,l._22(t,26).transform("tx.hours"))),n(t,29,0,l._32(t,29,0,l._22(t,30).transform(e.transaction.hoursSent.toString(),!1,"first")),l._32(t,29,1,l._22(t,31).transform(e.hoursText)),l._32(t,29,2,l._22(t,32).transform(e.transaction.hoursBurned.toString(),!1,"first")),l._32(t,29,3,l._22(t,33).transform("tx.hours-burned"))),n(t,53,0,l._32(t,53,0,l._22(t,54).transform(e.transaction.balance.toString())))})}var Og=function(){function n(n,t,e,r,i){this.walletService=n,this.msgBarService=t,this.dialog=e,this.hwWalletService=r,this.translate=i,this.onBack=new l.o}return n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.sendSubscription&&this.sendSubscription.unsubscribe()},n.prototype.back=function(){this.onBack.emit(!1)},n.prototype.send=function(){var n=this;if(!this.sendButton.isLoading())if(this.msgBarService.hide(),this.sendButton.resetState(),this.transaction.wallet.encrypted&&!this.transaction.wallet.isHardware){var t=new oa;t.data={wallet:this.transaction.wallet},this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.finishSending(t)})}else this.transaction.wallet.isHardware?(this.showBusy(),this.sendSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.transaction.wallet.addresses[0].address).subscribe(function(){return n.finishSending()},function(t){return n.showError(Tc(n.translate,t))})):this.finishSending()},n.prototype.showBusy=function(){this.sendButton.setLoading(),this.backButton.setDisabled()},n.prototype.finishSending=function(n){var t=this;this.showBusy();var e=this.transaction.note.trim();this.sendSubscription=this.walletService.signTransaction(this.transaction.wallet,n?n.password:null,this.transaction).flatMap(function(l){return n&&n.close(),t.walletService.injectTransaction(l.encoded,e)}).subscribe(function(n){e&&!n?setTimeout(function(){return t.msgBarService.showWarning(t.translate.instant("send.error-saving-note"))}):setTimeout(function(){return t.msgBarService.showDone("send.sent")}),t.walletService.startDataRefreshSubscription(),t.onBack.emit(!0)},function(e){n&&n.error(e),t.showError(e&&e.result?Tc(t.translate,e):e)})},n.prototype.showError=function(n){this.msgBarService.showError(n),this.sendButton.resetState(),this.backButton.resetState().setEnabled()},n}(),Tg=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{margin-top:10px;text-align:center}"]],data:{}});function Lg(n){return l._33(0,[l._29(402653184,1,{sendButton:0}),l._29(402653184,2,{backButton:0}),(n()(),l._9(2,0,null,null,1,"app-transaction-info",[],null,null,null,Sg,cg)),l._8(3,245760,null,0,ug,[rf,fa],{transaction:[0,"transaction"],isPreview:[1,"isPreview"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(5,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.back()&&l),l},w_,g_)),l._8(8,49152,[[2,4],["backButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(9,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.send()&&l),l},w_,g_)),l._8(13,49152,[[1,4],["sendButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(14,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,3,0,t.component.transaction,!0)},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("send.back-button"))),n(t,14,0,l._32(t,14,0,l._22(t,15).transform("send.send-button")))})}var Pg=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px}"]],data:{}});function Dg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-form",[],null,[[null,"onFormSubmitted"]],function(n,t,e){var l=!0;return"onFormSubmitted"===t&&(l=!1!==n.component.onFormSubmitted(e)&&l),l},ym,cm)),l._8(1,245760,null,0,um,[ns,qc,Sc,fa,jc,Vp,oc,De.j,l.h,gf,rf],{formData:[0,"formData"]},{onFormSubmitted:"onFormSubmitted"})],function(n,t){n(t,1,0,t.component.formData)},null)}function Ag(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-form-advanced",[],null,[[null,"onFormSubmitted"]],function(n,t,e){var l=!0;return"onFormSubmitted"===t&&(l=!1!==n.component.onFormSubmitted(e)&&l),l},sg,Fm)),l._8(1,245760,null,0,Nm,[qc,Sc,gf,ns,fa,jc,Vp,oc,De.j,rf,l.h],{formData:[0,"formData"]},{onFormSubmitted:"onFormSubmitted"})],function(n,t){n(t,1,0,t.component.formData)},null)}function Eg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-preview",[],null,[[null,"onBack"]],function(n,t,e){var l=!0;return"onBack"===t&&(l=!1!==n.component.onBack(e)&&l),l},Lg,Tg)),l._8(1,180224,null,0,Og,[Sc,jc,fa,oc,De.j],{transaction:[0,"transaction"]},{onBack:"onBack"})],function(n,t){n(t,1,0,t.component.transaction)},null)}function Yg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(1,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(4,0,null,null,13,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,10,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Dg)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ag)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Eg)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("title.wallets"))),n(t,9,0,e.showForm&&e.activeForm===e.activeForms.LeftButton),n(t,12,0,e.showForm&&e.activeForm===e.activeForms.RightButton),n(t,15,0,!e.showForm)},null)}var jg=l._5("app-send-skycoin",Wp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-skycoin",[],null,null,null,Yg,Pg)),l._8(1,180224,null,0,Wp,[Vp,l.h],null,null)],null,null)},{},{},[]),Ig=function(){this.isLoading=!0},Rg=l._7({encapsulation:0,styles:[[".-content[_ngcontent-%COMP%]{text-align:center;margin:50px 0;color:rgba(30,34,39,.5);font-size:13px}.-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:15px}.-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{color:rgba(30,34,39,.2);font-size:40px}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}"]],data:{}});function Hg(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"mat-spinner",[["class","mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(3,573440,null,0,Wu,[l.l,Hl,[2,sn]],{diameter:[0,"diameter"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,40)},function(n,t){n(t,2,0,l._22(t,3)._elementSize,l._22(t,3)._elementSize),n(t,6,0,l._32(t,6,0,l._22(t,7).transform("common.loading")))})}function Ng(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"i",[["class","material-icons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["announcement"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,6,0,l._32(t,6,0,l._22(t,7).transform(e.noDataText)))})}function Fg(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-content"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hg)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ng)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.isLoading),n(t,6,0,!e.isLoading)},null)}var Bg=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%]{margin:10px 40px -20px;display:-webkit-box;display:-ms-flexbox;display:flex}.form-field[_ngcontent-%COMP%] .x-button[_ngcontent-%COMP%]{width:24px;height:24px;margin-top:10px;cursor:pointer}.bottom-line[_ngcontent-%COMP%]{border-bottom:2px solid rgba(0,0,0,.02)}mat-select[_ngcontent-%COMP%] .mat-select-trigger{padding:10px 30px 10px 10px;display:block;font-size:11px;height:100%;line-height:20px}mat-select[_ngcontent-%COMP%] .mat-select-value{font-size:13px;line-height:22px}mat-select[_ngcontent-%COMP%] .mat-select-arrow{border:none}mat-select[_ngcontent-%COMP%] .mat-select-placeholder{-webkit-transition:unset!important;transition:unset!important;color:rgba(30,34,39,.5)}mat-select[_ngcontent-%COMP%] .mat-select-placeholder::before{content:'filter_list';font-family:'Material Icons';font-weight:400;font-style:normal;font-size:13px;margin-right:10px}mat-select[_ngcontent-%COMP%] mat-select-trigger[_ngcontent-%COMP%]::before{content:'filter_list';font-family:'Material Icons';font-weight:400;font-style:normal;font-size:13px;margin-right:10px}mat-select[_ngcontent-%COMP%] .filter[_ngcontent-%COMP%]{font-size:13px;margin-left:28px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:rgba(30,34,39,.5)}mat-option[_ngcontent-%COMP%] .mat-pseudo-checkbox-checked{background:#0072ff}.mat-option-disabled[_ngcontent-%COMP%] .mat-pseudo-checkbox-disabled{opacity:.5}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:30px}.-transaction[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid #eff0f0;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;padding:20px 12px}.-transaction[_ngcontent-%COMP%]:first-child{border-top-left-radius:15px;border-top-right-radius:15px}.-transaction[_ngcontent-%COMP%]:last-child{border-bottom-left-radius:15px;border-bottom-right-radius:15px}.-transaction[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0 8px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%]{margin-top:5px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-transaction[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-filter:FlipH;filter:FlipH;-ms-filter:FlipH}.-transaction[_ngcontent-%COMP%] .-icon.-pending[_ngcontent-%COMP%]{opacity:.5}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1;flex:1}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:10px;line-height:12px;padding-left:5px;font-weight:300}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-pending[_ngcontent-%COMP%]{color:#fdb51e}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;height:17px;vertical-align:middle;width:17px;margin-right:4px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] .note[_ngcontent-%COMP%]{color:#1e2227;word-break:break-word;display:inline}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%]{width:200px;text-align:right}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}"]],data:{}});function Vg(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.parent.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,l._32(t,2,0,l._22(t,3).transform("history.all-addresses")))})}function Wg(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"],disabled:[1,"disabled"]},null),(n()(),l._31(2,0,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,1,0,t.context.$implicit,t.parent.context.$implicit.allAddressesSelected)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.address,l._32(t,2,1,l._22(t,3).transform(t.context.$implicit.coins)),l._32(t,2,2,l._22(t,4).transform(t.context.$implicit.hours,!1)))})}function zg(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"mat-optgroup",[["class","mat-optgroup"],["role","group"]],[[2,"mat-optgroup-disabled",null],[1,"aria-disabled",0],[1,"aria-labelledby",0]],null,null,Mm,xm)),l._8(1,49152,[[2,4]],0,cr,[],{label:[0,"label"]},null),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,0,1,null,Vg)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,0,1,null,Wg)),l._8(9,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,l._12(3,"\n ",t.context.$implicit.label," - ",l._32(t,1,0,l._22(t,2).transform(t.context.$implicit.coins)),"\n (",l._32(t,1,0,l._22(t,3).transform(t.context.$implicit.hours,!1)),")\n ")),n(t,6,0,t.context.$implicit.addresses.length>1),n(t,9,0,t.context.$implicit.addresses)},function(n,t){n(t,0,0,l._22(t,1).disabled,l._22(t,1).disabled.toString(),l._22(t,1)._labelId)})}function Ug(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.filter")))})}function Gg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.filters")))})}function qg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.parent.parent.context.$implicit.label)})}function Jg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.parent.parent.context.$implicit.address)})}function Qg(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[["class","filter"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qg)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Jg)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(7,null,["\n - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,3,0,t.parent.context.$implicit.label),n(t,6,0,!t.parent.context.$implicit.label)},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform(t.parent.context.$implicit.coins)),l._32(t,7,1,l._22(t,9).transform(t.parent.context.$implicit.hours,!1)))})}function Kg(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Qg)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.context.$implicit.label||!t.context.$implicit.showingWholeWallet)},null)}function Xg(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["class","x-button"],["src","assets/img/close-grey.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removeFilters()&&l),l},null,null))],null,null)}function Zg(n){return l._33(0,[(n()(),l._9(0,0,null,null,38,"div",[["class","form-field"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,29,"mat-select",[["class","mat-select"],["formControlName","filter"],["id","filter"],["multiple",""],["role","listbox"]],[[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,12)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,12)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,12)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(8,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(9,{"bottom-line":0}),l._8(10,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(12,2080768,null,3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"],multiple:[1,"multiple"],id:[2,"id"]},null),l._29(603979776,1,{options:1}),l._29(603979776,2,{optionGroups:1}),l._29(335544320,3,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(17,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,1,null,zg)),l._8(20,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._9(22,0,null,0,11,"mat-select-trigger",[],null,null,null,null,null)),l._8(23,16384,[[3,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ug)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Gg)),l._8(29,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Kg)),l._8(32,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Xg)),l._8(37,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,8,0,n(t,9,0,!e.transactions||0===e.transactions.length)),n(t,10,0,"filter"),n(t,12,0,l._32(t,12,0,l._22(t,16).transform("history.no-filter")),"","filter"),n(t,20,0,e.wallets),n(t,26,0,1===e.form.get("filter").value.length),n(t,29,0,e.form.get("filter").value.length>1),n(t,32,0,e.form.get("filter").value),n(t,37,0,e.form.get("filter").value.length>0)},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,5,1,[l._22(t,12).id,l._22(t,12).tabIndex,l._22(t,12)._ariaLabel,l._22(t,12).ariaLabelledby,l._22(t,12).required.toString(),l._22(t,12).disabled.toString(),l._22(t,12).errorState,l._22(t,12).panelOpen?l._22(t,12)._optionIds:null,l._22(t,12).multiple,l._22(t,12)._ariaDescribedby||null,l._22(t,12)._getAriaActiveDescendant(),l._22(t,12).disabled,l._22(t,12).errorState,l._22(t,12).required,l._22(t,17).ngClassUntouched,l._22(t,17).ngClassTouched,l._22(t,17).ngClassPristine,l._22(t,17).ngClassDirty,l._22(t,17).ngClassValid,l._22(t,17).ngClassInvalid,l._22(t,17).ngClassPending])})}function $g(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){var e=t.component;n(t,1,0,!e.allTransactions,e.allTransactions&&0!==e.allTransactions.length?"history.no-txs-filter":"history.no-txs")},null)}function ny(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._27(6,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.sent")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,n(t,6,0,l._22(t.parent.parent.parent.parent,0),t.parent.parent.context.$implicit.timestamp)))})}function ty(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.sending")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("history.pending")))})}function ey(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._27(6,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.received")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,n(t,6,0,l._22(t.parent.parent.parent.parent,0),t.parent.parent.context.$implicit.timestamp)))})}function ly(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.receiving")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("history.pending")))})}function ry(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ny)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ty)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ey)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ly)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.parent.context.$implicit.balance.isLessThan(0)&&t.parent.context.$implicit.confirmed),n(t,6,0,t.parent.context.$implicit.balance.isLessThan(0)&&!t.parent.context.$implicit.confirmed),n(t,9,0,t.parent.context.$implicit.balance.isGreaterThan(0)&&t.parent.context.$implicit.confirmed),n(t,12,0,t.parent.context.$implicit.balance.isGreaterThan(0)&&!t.parent.context.$implicit.confirmed)},null)}function iy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._27(6,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.moved")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,n(t,6,0,l._22(t.parent.parent.parent.parent,0),t.parent.parent.context.$implicit.timestamp)))})}function oy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.moving")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("history.pending")))})}function sy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,iy)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,oy)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.parent.context.$implicit.confirmed),n(t,6,0,!t.parent.context.$implicit.confirmed)},null)}function ay(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showQrCode(e,n.context.$implicit)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,5,0,t.context.$implicit)})}function uy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["",": "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(5,0,null,null,1,"span",[["class","note"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("history.note"))),n(t,6,0,t.parent.context.$implicit.note)})}function cy(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,7,"p",[],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(3,null,["\n ",""])),l._27(4,4),(n()(),l._9(5,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["*"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.current-rate")))},function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,n(t,4,0,l._22(t.parent.parent.parent,1),t.parent.context.$implicit.balance*e.price,"USD","symbol","1.2-2")))})}function dy(n){return l._33(0,[(n()(),l._9(0,0,null,null,36,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,33,"div",[["class","-transaction"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showTransaction(n.context.$implicit)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(6,{"-incoming":0,"-pending":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,0,"img",[["src","/assets/img/send-blue.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,13,"div",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ry)),l._8(14,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,sy)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ay)),l._8(20,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,uy)),l._8(23,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,8,"div",[["class","-balance"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(29,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,cy)),l._8(33,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,5,0,"-icon",n(t,6,0,t.context.$implicit.balance.isGreaterThan(0)&&!t.context.$implicit.coinsMovedInternally,!t.context.$implicit.confirmed)),n(t,14,0,!t.context.$implicit.coinsMovedInternally),n(t,17,0,t.context.$implicit.coinsMovedInternally),n(t,20,0,t.context.$implicit.addresses),n(t,23,0,t.context.$implicit.note),n(t,33,0,e.price)},function(n,t){n(t,29,0,l._32(t,29,0,l._22(t,30).transform(t.context.$implicit.balance.toString())))})}function hy(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,dy)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.transactions)},null)}function py(n){return l._33(0,[l._25(0,ag,[]),l._25(0,ln,[l.w]),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(6,0,null,null,10,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Zg)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,$g)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,hy)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.transactions"))),n(t,9,0,e.allTransactions),n(t,12,0,!e.transactions||0===e.transactions.length),n(t,15,0,e.transactions&&e.transactions.length>0)},null)}var fy=l._5("app-transaction-list",sf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-transaction-list",[],null,null,null,py,Bg)),l._8(1,245760,null,0,sf,[fa,rf,Sc,ns,Ch],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),_y=function(){function n(){this.statuses=["done","waiting_confirm","waiting_deposit","waiting_send"]}return n.prototype.transform=function(n){return this.statuses.find(function(t){return t===n})?"teller."+n.replace("_","-"):"teller.unknown"},n}(),my=l._7({encapsulation:0,styles:[[".-background-container[_ngcontent-%COMP%]{background-color:#fbfbfb;padding-top:30px;max-width:100%;min-height:calc(100% - 190px);overflow:hidden;position:relative}.-background-image[_ngcontent-%COMP%]{display:none}@media (min-width:768px){.-background-image[_ngcontent-%COMP%]{display:block;left:50%;width:80%;position:absolute;top:0}}@media (min-width:992px){.-background-image[_ngcontent-%COMP%]{left:40%;width:90%;max-width:850px}}@media (min-width:1200px){.-background-image[_ngcontent-%COMP%]{left:40%;width:80%;max-width:850px}}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;position:relative;margin-top:30px;max-width:540px;z-index:5}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:30px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{width:60px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border-radius:50%;color:#fff;display:inline-block;font-size:16px;font-weight:700;height:40px;line-height:46px;text-align:center;width:40px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1;flex:1 1}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] button{margin-left:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:0;line-height:46px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px;font-weight:300;line-height:20px;margin-top:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%], .-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%]{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;color:rgba(30,34,39,.8);display:block;font-size:14px;line-height:20px;margin-bottom:15px;padding:10px;width:100%}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#0072ff}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .form-field[_ngcontent-%COMP%]{margin-bottom:15px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-subtitle[_ngcontent-%COMP%]{color:#8c8e90;font-size:12px;line-height:18px;font-weight:300;opacity:.8}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-wallet[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px}"]],data:{}});function gy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"option",[],null,null,null,null,null)),l._8(1,147456,null,0,mo,[l.l,l.G,[2,_o]],{value:[0,"value"]},null),l._8(2,147456,null,0,bo,[l.l,l.G,[8,null]],{value:[0,"value"]},null),(n()(),l._31(3,null,["\n "," - "])),(n()(),l._9(4,0,null,null,2,"span",[["class","-coins"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,t.context.$implicit.filename),n(t,2,0,t.context.$implicit.filename)},function(n,t){n(t,3,0,t.context.$implicit.label),n(t,5,0,l._32(t,5,0,l._22(t,6).transform(t.context.$implicit.coins)))})}function yy(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","-step"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(n()(),l._31(-1,null,["2"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,17,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"h3",[],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,3,"p",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._26(16,{rate:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,1,"span",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(20,null,["\n ","\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,2,"span",[["class","-subtitle"]],null,null,null,null,null)),(n()(),l._31(23,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("buy.send"))),n(t,15,0,l._32(t,15,0,l._22(t,17).transform("buy.send-desc",n(t,16,0,e.config.sky_btc_exchange_rate)))),n(t,20,0,e.order.deposit_address),n(t,23,0,l._32(t,23,0,l._22(t,24).transform("buy.fraction-warning")))})}function by(n){return l._33(0,[(n()(),l._9(0,0,null,null,34,"div",[["class","-step"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(n()(),l._31(-1,null,["3"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,25,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"h3",[],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,4,"span",[["class","-status"]],null,null,null,null,null)),(n()(),l._31(19,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._27(21,1),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.checkStatus()&&l),l},w_,g_)),l._8(25,49152,[[1,4],["button",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(26,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.removeOrder()&&l),l},w_,g_)),l._8(30,49152,[[1,4],["button",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(31,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("buy.receive"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("buy.receive-desc"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("buy.status-button")),l._32(t,19,1,l._22(t,22).transform(l._32(t,19,1,n(t,21,0,l._22(t.parent.parent,0),e.order.status))))),n(t,26,0,l._32(t,26,0,l._22(t,27).transform("buy.check-status-button"))),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("buy.new-order-button")))})}function vy(n){return l._33(0,[(n()(),l._9(0,0,null,null,59,"div",[["class","-paper"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,47,"div",[["class","-step"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(n()(),l._31(-1,null,["1"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,38,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,2,"h3",[],null,null,null,null,null)),(n()(),l._31(16,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(20,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,23,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,20,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,17,"select",[["class","-wallet"],["formControlName","wallet"],["id","wallet"],["required",""]],[[1,"required",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,28).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,28).onTouched()&&r),r},null,null)),l._8(28,16384,null,0,_o,[l.G,l.l],null,null),l._8(29,16384,null,0,Zo,[],{required:[0,"required"]},null),l._28(1024,null,Qi,function(n){return[n]},[Zo]),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(32,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(34,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,4,"option",[["disabled",""],["selected",""]],null,null,null,null,null)),l._8(37,147456,null,0,mo,[l.l,l.G,[2,_o]],null,null),l._8(38,147456,null,0,bo,[l.l,l.G,[8,null]],null,null),(n()(),l._31(39,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gy)),l._8(43,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,2,"span",[["class","-subtitle"]],null,null,null,null,null)),(n()(),l._31(49,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,yy)),l._8(55,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,by)),l._8(58,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,29,0,""),n(t,32,0,"wallet"),n(t,43,0,e.wallets),n(t,55,0,e.order),n(t,58,0,e.order)},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("buy.deposit-location"))),n(t,20,0,l._32(t,20,0,l._22(t,21).transform("buy.deposit-location-desc"))),n(t,27,0,l._22(t,29).required?"":null,l._22(t,34).ngClassUntouched,l._22(t,34).ngClassTouched,l._22(t,34).ngClassPristine,l._22(t,34).ngClassDirty,l._22(t,34).ngClassValid,l._22(t,34).ngClassInvalid,l._22(t,34).ngClassPending),n(t,39,0,l._32(t,39,0,l._22(t,40).transform("buy.make-choice"))),n(t,49,0,l._32(t,49,0,l._22(t,50).transform("buy.wallets-desc")))})}function wy(n){return l._33(0,[l._25(0,_y,[]),l._29(671088640,1,{button:0}),(n()(),l._9(2,0,null,null,1,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],null,null),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(5,0,null,null,9,"div",[["class","-background-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,6,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,vy)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,0,"img",[["class","-background-image"],["src","../../../../assets/img/otc-background.jpg"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0),n(t,10,0,e.config)},null)}var xy=l._5("app-buy",lf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-buy",[],null,null,null,wy,my)),l._8(1,245760,null,0,lf,[ns,ef,jc,Sc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]);o.a.merge=Jr.a;var My=function(){function n(n,t,e,r,i,o,s){this.exchangeService=n,this.walletService=t,this.formBuilder=e,this.msgBarService=r,this.dialog=i,this.blockchainService=o,this.translateService=s,this.defaultFromCoin="BTC",this.defaultFromAmount="0.1",this.toCoin="SKY",this.submitted=new l.o,this.problemGettingPairs=!1,this.agreement=!1,this.subscriptionsGroup=[]}return Object.defineProperty(n.prototype,"toAmount",{get:function(){if(!this.activeTradingPair)return 0;var n=this.form.get("fromAmount").value;return isNaN(n)?0:(this.form.get("fromAmount").value*this.activeTradingPair.price).toFixed(this.blockchainService.currentMaxDecimals)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"sendAmount",{get:function(){var n=this.form.get("fromAmount").value;return isNaN(parseFloat(n))?0:n},enumerable:!0,configurable:!0}),n.prototype.ngOnInit=function(){this.createForm(),this.loadData()},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.removeExchangeSubscription(),this.msgBarService.hide(),this.priceUpdateSubscription&&this.priceUpdateSubscription.unsubscribe()},n.prototype.setAgreement=function(n){this.agreement=n.checked,this.form.updateValueAndValidity()},n.prototype.selectAddress=function(){var n=this,t=new oa;t.width="566px",t.autoFocus=!1,this.dialog.open(Rm,t).afterClosed().subscribe(function(t){t&&n.form.get("toAddress").setValue(t)})},n.prototype.exchange=function(){var n=this;if(this.form.valid&&!this.exchangeButton.isLoading()){this.msgBarService.hide(),this.exchangeButton.resetState(),this.exchangeButton.setLoading(),this.exchangeButton.setDisabled();var t=parseFloat(this.form.get("fromAmount").value),e=this.form.get("toAddress").value.trim();this.removeExchangeSubscription(),this.exchangeSubscription=this.walletService.verifyAddress(e).subscribe(function(l){l?n.exchangeSubscription=n.exchangeService.exchange(n.activeTradingPair.pair,t,e,n.activeTradingPair.price).subscribe(function(t){n.submitted.emit({id:t.id,pair:t.pair,fromAmount:t.fromAmount,toAmount:t.toAmount,address:t.toAddress,timestamp:zp().unix(),price:n.activeTradingPair.price})},function(t){n.exchangeButton.resetState(),n.exchangeButton.setEnabled(),n.msgBarService.showError(t)}):n.showInvalidAddress()},function(){n.showInvalidAddress()})}},n.prototype.showInvalidAddress=function(){this.exchangeButton.resetState(),this.exchangeButton.setEnabled();var n=this.translateService.instant("exchange.invalid-address");this.msgBarService.showError(n)},n.prototype.createForm=function(){var n=this;this.form=this.formBuilder.group({fromCoin:[this.defaultFromCoin,Xi.required],fromAmount:[this.defaultFromAmount,Xi.required],toAddress:["",Xi.required]},{validator:this.validate.bind(this)}),this.subscriptionsGroup.push(this.form.get("fromCoin").valueChanges.subscribe(function(){n.updateActiveTradingPair()}))},n.prototype.loadData=function(){var n=this;this.subscriptionsGroup.push(this.exchangeService.tradingPairs().retryWhen(function(n){return n.delay(2e3).take(10).concat(o.a.throw(""))}).subscribe(function(t){n.tradingPairs=[],t.forEach(function(t){t.to===n.toCoin&&n.tradingPairs.push(t)}),n.updateActiveTradingPair(),n.updatePrices()},function(){n.problemGettingPairs=!0}))},n.prototype.updatePrices=function(){var n=this;this.priceUpdateSubscription=o.a.of(1).delay(6e4).flatMap(function(){return n.exchangeService.tradingPairs()}).retryWhen(function(n){return n.delay(6e4)}).subscribe(function(t){t.forEach(function(t){if(t.to===n.toCoin){var e=n.tradingPairs.find(function(n){return n.from===t.from});e&&(e.price=t.price)}}),n.updatePrices()})},n.prototype.updateActiveTradingPair=function(){var n=this;this.activeTradingPair=this.tradingPairs.find(function(t){return t.from===n.form.get("fromCoin").value}),!this.activeTradingPair&&this.tradingPairs.length>0&&(this.activeTradingPair=this.tradingPairs[0],this.form.get("fromCoin").setValue(this.activeTradingPair.from))},n.prototype.validate=function(n){if(!n||!this.activeTradingPair)return null;var t=n.get("fromAmount").value;if(isNaN(t))return{invalid:!0};if(tthis.activeTradingPair.max)return{max:this.activeTradingPair.max};var e=t.split(".");return e.length>1&&e[1].length>6?{decimals:!0}:this.agreement?null:{agreement:!0}},n.prototype.removeExchangeSubscription=function(){this.exchangeSubscription&&this.exchangeSubscription.unsubscribe()},n}(),ky=l._7({encapsulation:0,styles:[[".-create[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.-create[_ngcontent-%COMP%] .-form[_ngcontent-%COMP%]{-webkit-box-flex:.6;-ms-flex:.6;flex:.6}.-create[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{-webkit-box-flex:.4;-ms-flex:.4;flex:.4;margin-left:40px;margin-top:5px}.form-field[_ngcontent-%COMP%]{width:100%}.form-field[_ngcontent-%COMP%] .-error[_ngcontent-%COMP%]{color:#ff004e;margin-left:20px}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{-webkit-box-flex:.7;-ms-flex:.7;flex:.7;border-top-right-radius:0;border-bottom-right-radius:0}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%]{-webkit-box-flex:.3;-ms-flex:.3;flex:.3}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%] select[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%] select[_ngcontent-%COMP%]{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.form-field[_ngcontent-%COMP%] .-not-allowed[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{cursor:not-allowed}.-item[_ngcontent-%COMP%]{font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}.-buttons[_ngcontent-%COMP%]{text-align:center}.-buttons[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{margin-right:20px}.-check[_ngcontent-%COMP%] .mat-checkbox-layout{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:13px;color:#1e2227}.-check[_ngcontent-%COMP%] span a{color:#0072ff;text-decoration:none}.-select-address[_ngcontent-%COMP%]{padding-left:5px;color:#0072ff;cursor:pointer}.-select-address[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#0072ff;padding:0;display:inline;vertical-align:middle;font-size:13px}"]],data:{}});function Cy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){var e=t.component;n(t,1,0,!e.tradingPairs&&!e.problemGettingPairs,e.problemGettingPairs?"exchange.problem-connecting":"exchange.offline")},null)}function Sy(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","-error"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("exchange.min-amount")),e.form.getError("min"))})}function Oy(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","-error"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("exchange.max-amount")),e.form.getError("max"))})}function Ty(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"option",[],null,null,null,null,null)),l._8(1,147456,null,0,mo,[l.l,l.G,[2,_o]],{value:[0,"value"]},null),l._8(2,147456,null,0,bo,[l.l,l.G,[8,null]],{value:[0,"value"]},null),(n()(),l._31(3,null,["",""]))],function(n,t){n(t,1,0,t.context.$implicit.from),n(t,2,0,t.context.$implicit.from)},function(n,t){n(t,3,0,t.context.$implicit.from)})}function Ly(n){return l._33(0,[(n()(),l._9(0,0,null,null,52,"div",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(9,null,[""," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(12,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(19,null,["\u2248 "," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(22,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,3,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(25,null,["",""])),l._26(26,{coin:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(30,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(33,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(35,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(36,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(40,null,["1 "," \u2248 "," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(46,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\u2248 15 minutes"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("exchange.you-send"))),n(t,9,0,e.sendAmount,e.form.get("fromCoin").value),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("exchange.you-get"))),n(t,19,0,e.toAmount,e.toCoin),n(t,25,0,l._32(t,25,0,l._22(t,27).transform("exchange.to-address",n(t,26,0,e.toCoin)))),n(t,30,0,e.form.get("toAddress").value||"-"),n(t,36,0,l._32(t,36,0,l._22(t,37).transform("exchange.price"))),n(t,40,0,e.form.get("fromCoin").value,e.activeTradingPair.price.toFixed(6),e.toCoin),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("exchange.time-15")))})}function Py(n){return l._33(0,[(n()(),l._9(0,0,null,null,113,"div",[["class","-create"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,107,"div",[["class","-form"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,3).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,3).onReset()&&r),r},null,null)),l._8(3,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(5,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,35,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,8,"label",[["for","fromAmount"]],null,null,null,null,null)),(n()(),l._31(10,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,Sy)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Oy)),l._8(16,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,22,"div",[["class","-inputs"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,5,"input",[["formControlName","fromAmount"],["id","fromAmount"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,22)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,22).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,22)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,22)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(22,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(24,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(26,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,12,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,9,"select",[["formControlName","fromCoin"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,31).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,31).onTouched()&&r),r},null,null)),l._8(31,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(33,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(35,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ty)),l._8(38,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,15,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,2,"label",[["for","toAmount"]],null,null,null,null,null)),(n()(),l._31(47,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(50,0,null,null,8,"div",[["class","-inputs -not-allowed"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(52,0,null,null,0,"input",[["id","toAmount"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(54,0,null,null,3,"div",[["class","-input"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,0,"input",[["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(61,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,14,"label",[["for","toAddress"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(65,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(66,null,["",""])),l._26(67,{coin:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(70,0,null,null,6,"span",[["class","-select-address"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.selectAddress()&&l),l},null,null)),(n()(),l._31(71,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(73,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(74,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(79,0,null,null,5,"input",[["formControlName","toAddress"],["id","toAddress"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,80)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,80).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,80)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,80)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(80,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(82,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(84,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(87,0,null,null,21,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(89,0,null,null,13,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAgreement(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(91,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],null,{change:"change"}),(n()(),l._31(92,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(94,0,null,0,2,"a",[["href","https://swaplab.cc/terms"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(95,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(97,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(99,0,null,0,2,"a",[["href","https://swaplab.cc/privacy"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(100,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(104,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.exchange()&&l),l},w_,g_)),l._8(105,49152,[[1,4],["exchangeButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(106,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Ly)),l._8(112,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.form),n(t,13,0,e.form.hasError("min")),n(t,16,0,e.form.hasError("max")),n(t,24,0,"fromAmount"),n(t,33,0,"fromCoin"),n(t,38,0,e.tradingPairs),n(t,74,0),n(t,82,0,"toAddress"),n(t,105,0,!e.form.valid),n(t,112,0,e.activeTradingPair)},function(n,t){var e=t.component;n(t,2,0,l._22(t,5).ngClassUntouched,l._22(t,5).ngClassTouched,l._22(t,5).ngClassPristine,l._22(t,5).ngClassDirty,l._22(t,5).ngClassValid,l._22(t,5).ngClassInvalid,l._22(t,5).ngClassPending),n(t,10,0,l._32(t,10,0,l._22(t,11).transform("exchange.you-send"))),n(t,21,0,l._22(t,26).ngClassUntouched,l._22(t,26).ngClassTouched,l._22(t,26).ngClassPristine,l._22(t,26).ngClassDirty,l._22(t,26).ngClassValid,l._22(t,26).ngClassInvalid,l._22(t,26).ngClassPending),n(t,30,0,l._22(t,35).ngClassUntouched,l._22(t,35).ngClassTouched,l._22(t,35).ngClassPristine,l._22(t,35).ngClassDirty,l._22(t,35).ngClassValid,l._22(t,35).ngClassInvalid,l._22(t,35).ngClassPending),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("exchange.you-get"))),n(t,52,0,e.toAmount),n(t,56,0,e.toCoin),n(t,66,0,l._32(t,66,0,l._22(t,68).transform("exchange.to-address",n(t,67,0,e.toCoin)))),n(t,71,0,l._32(t,71,0,l._22(t,72).transform("exchange.select"))),n(t,79,0,l._22(t,84).ngClassUntouched,l._22(t,84).ngClassTouched,l._22(t,84).ngClassPristine,l._22(t,84).ngClassDirty,l._22(t,84).ngClassValid,l._22(t,84).ngClassInvalid,l._22(t,84).ngClassPending),n(t,89,0,l._22(t,91).id,l._22(t,91).indeterminate,l._22(t,91).checked,l._22(t,91).disabled,"before"==l._22(t,91).labelPosition),n(t,92,0,l._32(t,92,0,l._22(t,93).transform("exchange.agree-1"))),n(t,95,0,l._32(t,95,0,l._22(t,96).transform("exchange.agree-2"))),n(t,97,0,l._32(t,97,0,l._22(t,98).transform("exchange.agree-3"))),n(t,100,0,l._32(t,100,0,l._22(t,101).transform("exchange.agree-4"))),n(t,106,0,l._32(t,106,0,l._22(t,107).transform("exchange.exchange-button")))})}function Dy(n){return l._33(0,[l._29(671088640,1,{exchangeButton:0}),(n()(),l._4(16777216,null,null,1,null,Cy)),l._8(2,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,Py)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,!e.activeTradingPair),n(t,5,0,e.activeTradingPair)},null)}var Ay=this&&this.__assign||Object.assign||function(n){for(var t,e=1,l=arguments.length;e .-img[_ngcontent-%COMP%]{width:17px;margin-right:15px}.-item[_ngcontent-%COMP%]{font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%] .info-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.-external[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{line-height:13px;height:13px;width:13px;font-size:16px;vertical-align:middle;color:#0072ff;margin-left:10px}.expand[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer;font-size:13px}.expand[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#0072ff;padding:0;display:inline;vertical-align:middle;font-size:13px}.buttons[_ngcontent-%COMP%]{width:100%;text-align:center;margin-top:10px}"]],data:{}});function jy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","exchange.order-not-found"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!t.component.showError,"exchange.order-not-found")},null)}function Iy(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["class","qr-code-button -img"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.showQrCode(r.order.exchangeTag)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("exchange.details.exchange-addr-tag"))),n(t,11,0,e.order.exchangeTag)})}function Ry(n){return l._33(0,[(n()(),l._31(-1,null,["\n "])),(n()(),l._9(1,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(12,null,[""," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(16,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,0,"img",[["class","qr-code-button -img"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.showQrCode(r.order.exchangeAddress)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(23,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(27,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Iy)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,32,0,t.component.order.exchangeTag)},function(n,t){var e=t.component;n(t,8,0,l._32(t,8,0,l._22(t,9).transform("exchange.you-send"))),n(t,12,0,e.order.fromAmount,e.fromCoin),n(t,23,0,l._32(t,23,0,l._22(t,24).transform("exchange.details.exchange-addr"))),n(t,27,0,e.order.exchangeAddress)})}function Hy(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,null,null,null,null,null,null,null))],null,null)}function Ny(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hy)),l._8(3,540672,null,0,H,[l.R],{ngTemplateOutlet:[0,"ngTemplateOutlet"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,l._22(t.parent,55))},null)}function Fy(n){return l._33(0,[(n()(),l._9(0,0,null,null,20,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,15,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,8,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(11,null,["\n ","\n "])),(n()(),l._9(12,0,null,null,5,"a",[["class","-external"],["rel","noreferrer nofollow"],["target","_blank"]],[[8,"href",4]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(15,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["launch"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,15,0)},function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("exchange.details.tx-id"))),n(t,11,0,e.order.toTx),n(t,12,0,e.appService.explorerUrl+"/transaction/"+e.order.toTx)})}function By(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("exchange.details.error-msg"))),n(t,11,0,e.order.message)})}function Vy(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,null,null,null,null,null,null,null))],null,null)}function Wy(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Vy)),l._8(3,540672,null,0,H,[l.R],{ngTemplateOutlet:[0,"ngTemplateOutlet"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,l._22(t.parent.parent,55))},null)}function zy(n){return l._33(0,[(n()(),l._9(0,0,null,null,67,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,14,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._27(14,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Wy)),l._8(19,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(21,0,null,null,14,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(28,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(31,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(32,null,[""," ",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(37,0,null,null,14,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(41,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,3,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(44,null,["",""])),l._26(45,{coin:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(49,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(53,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(55,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(57,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(59,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(60,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(64,null,["1 "," \u2248 "," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,19,0,e.order.status!==e.statuses[0])},function(n,t){var e=t.component;n(t,9,0,l._32(t,9,0,l._22(t,10).transform("exchange.details.start-date"))),n(t,13,0,l._32(t,13,0,n(t,14,0,l._22(t.parent.parent,0),e._orderDetails.timestamp))),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("exchange.you-get"))),n(t,32,0,l._32(t,32,0,l._22(t,33).transform(e.order.toAmount,!0,"first")),e.toCoin),n(t,44,0,l._32(t,44,0,l._22(t,46).transform("exchange.to-address",n(t,45,0,e.toCoin)))),n(t,49,0,e.order.toAddress),n(t,60,0,l._32(t,60,0,l._22(t,61).transform("exchange.details.initial-price"))),n(t,64,0,e.fromCoin,e._orderDetails.price,e.toCoin)})}function Uy(n){return l._33(0,[(n()(),l._9(0,0,null,null,82,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,31,"div",[["class","-wrapper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,23,"div",[["class","-status"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(7,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(8,{"-spin":0}),l._8(9,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(10,0,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,14,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,7,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(19,null,[""," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(21,16777216,null,null,4,"mat-icon",[["class","info-icon mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,23).show()&&r),"keydown"===t&&(r=!1!==l._22(n,23)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,23).hide(1500)&&r),r},Hf,Rf)),l._8(22,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(23,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(30,null,["",""])),l._26(31,{from:0,to:1}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(35,0,null,null,1,"mat-progress-bar",[["aria-valuemax","100"],["aria-valuemin","0"],["class","mat-progress-bar"],["role","progressbar"]],[[1,"aria-valuenow",0],[1,"mode",0],[2,"mat-primary",null],[2,"mat-accent",null],[2,"mat-warn",null]],null,null,u_,a_)),l._8(36,49152,null,0,Nu,[],{value:[0,"value"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(38,0,null,null,43,"div",[["class","-details"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(40,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(47,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(50,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(51,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(0,[["fromInfo",2]],null,0,null,Ry)),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Ny)),l._8(58,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Fy)),l._8(61,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,By)),l._8(64,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(66,0,null,null,11,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(68,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(70,0,null,null,6,"span",[["class","expand"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleDetails()&&l),l},null,null)),(n()(),l._31(71,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(73,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(74,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(75,0,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,zy)),l._8(80,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,7,0,n(t,8,0,"refresh"===e.statusIcon)),n(t,9,0),n(t,22,0),n(t,23,0,l._32(t,23,0,l._22(t,24).transform(e.translatedStatus.info))),n(t,36,0,e.progress),n(t,58,0,e.order.status===e.statuses[0]),n(t,61,0,e.order.status===e.statuses[5]),n(t,64,0,e.order.status===e.statuses[6]),n(t,74,0),n(t,80,0,e.expanded)},function(n,t){var e=t.component;n(t,10,0,e.statusIcon),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("exchange.status"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform(e.translatedStatus.text,e.translatedStatus.params))),n(t,30,0,l._32(t,30,0,l._22(t,32).transform("exchange.exchanging",n(t,31,0,e.fromCoin,e.toCoin)))),n(t,35,0,l._22(t,36).value,l._22(t,36).mode,"primary"==l._22(t,36).color,"accent"==l._22(t,36).color,"warn"==l._22(t,36).color),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("exchange.details.order-id"))),n(t,51,0,e.order.id),n(t,71,0,l._32(t,71,0,l._22(t,72).transform("exchange.details.details"))),n(t,75,0,e.expanded?"keyboard_arrow_up":"keyboard_arrow_down")})}function Gy(n){return l._33(0,[l._25(0,ag,[]),(n()(),l._4(16777216,null,null,1,null,jy)),l._8(2,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,Uy)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(7,0,null,null,6,"div",[["class","buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.close()&&l),l},w_,g_)),l._8(10,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(11,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.loading),n(t,5,0,!e.loading)},function(n,t){n(t,11,0,l._32(t,11,0,l._22(t,12).transform("exchange.details.back")))})}var qy=l._7({encapsulation:0,styles:[[".-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px 30px 10px}.-contact[_ngcontent-%COMP%]{margin:15px 30px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.-contact[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:13px;margin:0 5px;opacity:.5;display:inline-block;vertical-align:middle}.-contact[_ngcontent-%COMP%] span[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{text-decoration:none;color:#0072ff}.-contact[_ngcontent-%COMP%] .history[_ngcontent-%COMP%]{opacity:1}.-contact[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;vertical-align:middle}.-contact[_ngcontent-%COMP%] .history-text[_ngcontent-%COMP%]{font-size:14px;opacity:1}"]],data:{}});function Jy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange-create",[],null,[[null,"submitted"]],function(n,t,e){var l=!0;return"submitted"===t&&(l=!1!==n.component.showStatus(e)&&l),l},Dy,ky)),l._8(1,245760,null,0,My,[pf,Sc,ns,jc,fa,qc,De.j],null,{submitted:"submitted"})],function(n,t){n(t,1,0)},null)}function Qy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange-status",[],null,[[null,"goBack"]],function(n,t,e){var l=!0;return"goBack"===t&&(l=!1!==n.component.goBack()&&l),l},Gy,Yy)),l._8(1,180224,null,0,Ey,[pf,fa,qc,gf],{orderDetails:[0,"orderDetails"]},{goBack:"goBack"})],function(n,t){n(t,1,0,t.component.currentOrderDetails)},null)}function Ky(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"span",[["class","history"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,7,"a",[["href","#"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showHistory(e)&&l),l},null,null)),(n()(),l._9(3,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(4,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["history"])),(n()(),l._31(-1,null,[" "])),(n()(),l._9(7,0,null,null,2,"span",[["class","history-text"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0)},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("exchange.history")))})}function Xy(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(1,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(4,0,null,null,40,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,7,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Jy)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Qy)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,28,"div",[["class","-contact"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ky)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,19,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,6,"span",[],null,null,null,null,null)),(n()(),l._31(26,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(28,0,null,null,2,"a",[["href","https://swaplabcc.freshdesk.com/support/home"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(29,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["|"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,5,"span",[],null,null,null,null,null)),(n()(),l._31(37,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(39,0,null,null,1,"a",[["href","https://swaplab.cc"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(-1,null,["SWAPLAB.CC"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("title.exchange"))),n(t,9,0,!e.currentOrderDetails&&!e.loading),n(t,12,0,e.currentOrderDetails&&!e.loading),n(t,20,0,e.hasHistory)},function(n,t){n(t,26,0,l._32(t,26,0,l._22(t,27).transform("exchange.need-help"))),n(t,29,0,l._32(t,29,0,l._22(t,30).transform("exchange.support-portal"))),n(t,37,0,l._32(t,37,0,l._22(t,38).transform("exchange.powered-by")))})}var Zy=l._5("app-exchange",_f,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange",[],null,null,null,Xy,qy)),l._8(1,245760,null,0,_f,[pf,fa],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),$y=l._7({encapsulation:0,styles:[[".-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:20px;font-size:13px;margin:30px 30px 0}.-paper[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:first-child{margin-top:0}.-paper[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:last-child{margin-bottom:0}.-text-muted[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-text-right[_ngcontent-%COMP%]{text-align:right}.-link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.-label[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}"]],data:{}});function nb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","backup.no-wallets"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!1,"backup.no-wallets")},null)}function tb(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-width-250 -label"]],[[1,"title",0]],null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,1,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,5,"div",[["class","-flex-fill -text-right"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"span",[["class","-link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showSeed(n.context.$implicit)&&l),l},null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,2,0,t.context.$implicit.label),n(t,3,0,t.context.$implicit.label),n(t,6,0,t.context.$implicit.filename),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("backup.show-seed")))})}function eb(n){return l._33(0,[(n()(),l._9(0,0,null,null,20,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,11,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"div",[["class","-width-250"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,0,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,tb)),l._8(18,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,18,0,t.component.onlyEncrypted)},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("backup.wallet"))),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("backup.filename")))})}function lb(n){return l._33(0,[(n()(),l._9(0,0,null,null,31,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,24,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,15,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(11,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,4,"p",[["class","-text-muted"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,1,"small",[],[[8,"innerHTML",1]],null,null,null,null)),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,nb)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,eb)),l._8(29,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.backup"))),n(t,26,0,0===e.onlyEncrypted.length),n(t,29,0,e.onlyEncrypted.length>0)},function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("backup.wallet-directory")),e.folder),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("backup.seed-warning"))),n(t,20,0,l._32(t,20,0,l._22(t,21).transform("backup.desc")))})}var rb=l._5("app-backup",$p,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-backup",[],null,null,null,lb,$y)),l._8(1,245760,null,0,$p,[Sc,fa],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),ib=l._7({encapsulation:0,styles:[[".-wrapper[_ngcontent-%COMP%]{margin:30px}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:20px;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}"]],data:{}});function ob(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],null,null)],null,null)}function sb(n){return l._33(0,[(n()(),l._9(0,0,null,null,101,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,98,"div",[["class","row -wrapper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,36,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,33,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._27(16,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(22,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(26,null,["",""])),l._27(27,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(32,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(33,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(37,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,57,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,54,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,51,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,23,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(50,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(52,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(53,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(57,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(61,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(64,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(67,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(68,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(73,0,null,null,23,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(77,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(78,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(81,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(82,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(86,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(88,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(89,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(92,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(93,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("blockchain.blocks"))),n(t,15,0,l._32(t,15,0,n(t,16,0,l._22(t.parent,0),e.block.header.seq))),n(t,22,0,l._32(t,22,0,l._22(t,23).transform("blockchain.time"))),n(t,26,0,l._32(t,26,0,n(t,27,0,l._22(t.parent,1),e.block.header.timestamp))),n(t,33,0,l._32(t,33,0,l._22(t,34).transform("blockchain.hash"))),n(t,37,0,e.block.header.block_hash),n(t,53,0,l._32(t,53,0,l._22(t,54).transform("blockchain.current-supply"))),n(t,57,0,l._32(t,57,0,l._22(t,58).transform(e.coinSupply.current_supply,!0,"first"))),n(t,64,0,l._32(t,64,0,l._22(t,65).transform("blockchain.total-supply"))),n(t,68,0,l._32(t,68,0,l._22(t,69).transform(e.coinSupply.total_supply,!0,"first"))),n(t,78,0,l._32(t,78,0,l._22(t,79).transform("blockchain.current-coinhour-supply"))),n(t,82,0,l._32(t,82,0,l._22(t,83).transform(e.coinSupply.current_coinhour_supply,!1,"first"))),n(t,89,0,l._32(t,89,0,l._22(t,90).transform("blockchain.total-coinhour-supply"))),n(t,93,0,l._32(t,93,0,l._22(t,94).transform(e.coinSupply.total_coinhour_supply,!1,"first")))})}function ab(n){return l._33(0,[l._25(0,tn,[l.w]),l._25(0,ag,[]),(n()(),l._9(2,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(5,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,ob)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,sb)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("title.blockchain"))),n(t,9,0,!(e.block&&e.block.header&&e.coinSupply)),n(t,12,0,e.block&&e.block.header&&e.coinSupply)},null)}var ub=l._5("app-blockchain",Kp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-blockchain",[],null,null,null,ab,ib)),l._8(1,245760,null,0,Kp,[qc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),cb=function(){function n(n){this.translateService=n}return n.prototype.transform=function(n){var t=zp().unix()-n;return t<60?this.translateService.instant("time-from-now.few-seconds"):t<120?this.translateService.instant("time-from-now.minute"):t<3600?this.translateService.instant("time-from-now.minutes",{time:Math.floor(t/60)}):t<7200?this.translateService.instant("time-from-now.hour"):t<86400?this.translateService.instant("time-from-now.hours",{time:Math.floor(t/3600)}):t<172800?this.translateService.instant("time-from-now.day"):this.translateService.instant("time-from-now.days",{time:Math.floor(t/86400)})},n}(),db=l._7({encapsulation:0,styles:[[".-last-seen[_ngcontent-%COMP%], .-port[_ngcontent-%COMP%], .-source[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-direction[_ngcontent-%COMP%]{width:72px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-negative:0;flex-shrink:0}.-direction[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-direction[_ngcontent-%COMP%] img.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.-last-seen[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:12px;line-height:1;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.-last-seen[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:12px;display:inline;vertical-align:middle;padding-right:5px}.-trusted[_ngcontent-%COMP%]{display:inline;color:#0072ff;font-size:13px;vertical-align:middle}.-text-right[_ngcontent-%COMP%]{text-align:right}.-pl-0[_ngcontent-%COMP%]{padding-left:0!important}.-block-row[_ngcontent-%COMP%]{width:150px;-ms-flex-negative:0;flex-shrink:0}.-invisible[_ngcontent-%COMP%]{display:none}@media (max-width:991px){.-pl-0[_ngcontent-%COMP%]{width:160px!important}.-block-row[_ngcontent-%COMP%]{width:90px;-ms-flex-negative:0;flex-shrink:0}}"]],data:{}});function hb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],null,null)],null,null)}function pb(n){return l._33(0,[(n()(),l._9(0,0,null,null,46,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,7,"div",[["class","-direction"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,16777216,null,null,4,"img",[["src","/assets/img/send-blue.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,7).show()&&r),"keydown"===t&&(r=!1!==l._22(n,7)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,7).hide(1500)&&r),r},null,null)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(6,{"-incoming":0}),l._8(7,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,4,"div",[["class","-width-200 -pl-0"]],null,null,null,null,null)),(n()(),l._31(12,null,["\n ",""])),(n()(),l._9(13,0,null,null,1,"span",[["class","-port"]],null,null,null,null,null)),(n()(),l._31(14,null,[":",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,2,"div",[["class","-flex-fill -source"]],null,null,null,null,null)),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,1,"div",[["class","-block-row -text-right"]],null,null,null,null,null)),(n()(),l._31(22,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,21,"div",[["class","-width-200 -last-seen"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,30).show()&&r),"keydown"===t&&(r=!1!==l._22(n,30)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,30).hide(1500)&&r),r},Hf,Rf)),l._8(29,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(30,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["keyboard_arrow_up"])),(n()(),l._31(33,null,["\n ","\n "])),l._25(0,cb,[De.j]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,40).show()&&r),"keydown"===t&&(r=!1!==l._22(n,40)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,40).hide(1500)&&r),r},Hf,Rf)),l._8(39,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(40,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(43,null,["\n ","\n "])),l._25(0,cb,[De.j]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,5,0,n(t,6,0,!t.context.$implicit.outgoing)),n(t,7,0,l._32(t,7,0,l._22(t,8).transform(t.context.$implicit.outgoing?"network.out":"network.in"))),n(t,29,0),n(t,30,0,l._32(t,30,0,l._22(t,31).transform("network.last-sent"))),n(t,39,0),n(t,40,0,l._32(t,40,0,l._22(t,41).transform("network.last-received")))},function(n,t){n(t,12,0,t.context.$implicit.address.split(":")[0]),n(t,14,0,t.context.$implicit.listen_port),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("network.sources."+t.context.$implicit.source))),n(t,22,0,t.context.$implicit.height),n(t,33,0,l._32(t,33,0,l._22(t,34).transform(t.context.$implicit.last_sent))),n(t,43,0,l._32(t,43,0,l._22(t,44).transform(t.context.$implicit.last_received)))})}function fb(n){return l._33(0,[(n()(),l._9(0,0,null,null,35,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,32,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,23,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,0,"div",[["class","-direction"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","-width-200 -pl-0"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"div",[["class","d-lg-block -invisible -block-row -text-right"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,2,"div",[["class","d-lg-none -block-row -text-right"]],null,null,null,null,null)),(n()(),l._31(21,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,2,"div",[["class","-width-200"]],null,null,null,null,null)),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,pb)),l._8(32,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,32,0,t.component.peers)},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("network.peer"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("network.source"))),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("network.block-height"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("network.block-height-short"))),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("network.last-seen")))})}function _b(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,hb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,fb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.network"))),n(t,7,0,!e.peers),n(t,10,0,e.peers)},null)}var mb=l._5("app-network",tf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-network",[],null,null,null,_b,db)),l._8(1,245760,null,0,tf,[nf],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),gb=l._7({encapsulation:0,styles:[[".-text-right[_ngcontent-%COMP%]{text-align:right}.-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-hash[_ngcontent-%COMP%]{margin-left:27px;word-break:break-all}.-address[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-address[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:17px;vertical-align:middle;margin-right:10px}.-label[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}"]],data:{}});function yb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","errors.no-outputs"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!t.component.wallets,"errors.no-outputs")},null)}function bb(n){return l._33(0,[(n()(),l._9(0,0,null,null,12,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-flex-fill -hash"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"div",[["class","-width-150 -text-right -grey"]],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.context.$implicit.hash),n(t,6,0,l._32(t,6,0,l._22(t,7).transform(t.context.$implicit.coins,!0,"first"))),n(t,10,0,l._32(t,10,0,l._22(t,11).transform(t.context.$implicit.calculated_hours,!1,"first")))})}function vb(n){return l._33(0,[(n()(),l._9(0,0,null,null,12,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,6,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,3,"div",[["class","-flex-fill -address"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showQrCode(e,n.context.$implicit.address)&&l),l},null,null)),(n()(),l._31(7,null,["\n ","\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,bb)),l._8(11,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,t.context.$implicit.outputs)},function(n,t){n(t,7,0,t.context.$implicit.address)})}function wb(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,12,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"div",[["class","-flex-fill -label"]],[[1,"title",0]],null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(n()(),l._31(12,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,vb)),l._8(19,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,19,0,t.context.$implicit.addresses)},function(n,t){n(t,4,0,t.context.$implicit.label),n(t,5,0,t.context.$implicit.label),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("coin"))),n(t,12,0,l._32(t,12,0,l._22(t,13).transform("hours")))})}function xb(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,wb)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.wallets)},null)}function Mb(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,yb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,xb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.outputs"))),n(t,7,0,!e.wallets||0===e.wallets.length||0===e.wallets[0].addresses[0].outputs.length),n(t,10,0,e.wallets&&e.wallets.length>0)},null)}var kb=l._5("app-outputs",Jp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-outputs",[],null,null,null,Mb,gb)),l._8(1,180224,null,0,Jp,[Sc,Ch,fa],null,null)],null,null)},{},{},[]),Cb=l._7({encapsulation:0,styles:[[".-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-txid[_ngcontent-%COMP%]{word-break:break-all}"]],data:{}});function Sb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","pending-txs.none"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!t.component.transactions,"pending-txs.none")},null)}function Ob(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-flex-fill -txid"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,2,"div",[["class","-width-150 -timestamp"]],null,null,null,null,null)),(n()(),l._31(14,null,["",""])),l._27(15,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.context.$implicit.txid),n(t,6,0,l._32(t,6,0,l._22(t,7).transform(t.context.$implicit.amount,!0,"first"))),n(t,10,0,l._32(t,10,0,l._22(t,11).transform(t.context.$implicit.hours,!1,"first"))),n(t,14,0,l._32(t,14,0,n(t,15,0,l._22(t.parent.parent,0),t.context.$implicit.timestamp)))})}function Tb(n){return l._33(0,[(n()(),l._9(0,0,null,null,29,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,26,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,17,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(19,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ob)),l._8(26,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,26,0,t.component.transactions)},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("pending-txs.txid"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("coin"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("hours"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("pending-txs.timestamp")))})}function Lb(n){return l._33(0,[l._25(0,ag,[]),(n()(),l._9(1,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(4,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Sb)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Tb)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,l._32(t,4,0,l._22(t,5).transform("title.pending-txs"))),n(t,8,0,!e.transactions||0===e.transactions.length),n(t,11,0,e.transactions&&e.transactions.length>0)},null)}var Pb=l._5("app-pending-transactions",Up,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-pending-transactions",[],null,null,null,Lb,Cb)),l._8(1,245760,null,0,Up,[Sc,Vp],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),Db=function(){function n(n){this.el=n,n.nativeElement.autocomplete="new-password",n.nativeElement.readOnly=!0}return n.prototype.onFocus=function(){this.el.nativeElement.readOnly=!1},n}(),Ab=l._7({encapsulation:0,styles:[[".dashed-border[_ngcontent-%COMP%]{border:1px dashed rgba(0,0,0,.25)}.show-pointer[_ngcontent-%COMP%]{cursor:pointer}.non-editable-field[_ngcontent-%COMP%]{font-size:12px;text-align:center;padding:15px;border-radius:6px;color:#171a1d}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%]{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:5px;opacity:1}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] .green[_ngcontent-%COMP%]{color:#00df80}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] .yellow[_ngcontent-%COMP%]{color:#ffc125}.normal-seed-field[_ngcontent-%COMP%]{font-size:14px}.seed-type-button[_ngcontent-%COMP%]{width:100%;height:10px;text-align:right}.seed-type-button[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{display:inline-block;width:32px;height:32px;position:relative;left:16px;top:-10px;background-color:#fff;border-radius:100px;cursor:pointer}.seed-type-button[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] > img[_ngcontent-%COMP%]{width:32px;height:32px}.onboarding-version[_ngcontent-%COMP%]{border:1px dashed rgba(255,255,255,.5);color:#fff}.transparent-text[_ngcontent-%COMP%]{opacity:.75}.red-disclaimer-box[_ngcontent-%COMP%]{color:#ff004e;font-size:12px;padding:0 10px;line-height:1.5}.white-disclaimer-box[_ngcontent-%COMP%]{color:#fafafa;font-size:12px;padding:0 10px;line-height:1.5}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer;color:#0072ff}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px;color:#1e2227}label[for=seed][_ngcontent-%COMP%] .-white-text[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fff!important}.-passwords[_ngcontent-%COMP%]{margin-left:24px}.-passwords[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin:5px 0 15px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}"]],data:{}});function Eb(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"label",[["for","number_of_words"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,21,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,18,"select",[["formControlName","number_of_words"],["id","number_of_words"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,9).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,9).onTouched()&&r),r},null,null)),l._8(9,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(11,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(13,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,4,"option",[],null,null,null,null,null)),l._8(16,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(17,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,4,"option",[],null,null,null,null,null)),l._8(22,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(23,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(24,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,"number_of_words"),n(t,16,0,12),n(t,17,0,12),n(t,22,0,24),n(t,23,0,24)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.words-number"))),n(t,8,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("wallet.new.12-words"))),n(t,24,0,l._32(t,24,0,l._22(t,25).transform("wallet.new.24-words")))})}function Yb(n){return l._33(0,[(n()(),l._9(0,0,null,null,18,"span",[["class","generators"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"-white-text":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0,i=n.component;return"longpress"===t&&(r=!1!==l._22(n,5).show()&&r),"keydown"===t&&(r=!1!==l._22(n,5)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,5).hide(1500)&&r),"click"===t&&(r=!1!==i.generateSeed(128)&&r),r},null,null)),l._8(5,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(7,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"span",[["class","divider"]],null,null,null,null,null)),(n()(),l._31(-1,null,["|"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0,i=n.component;return"longpress"===t&&(r=!1!==l._22(n,14).show()&&r),"keydown"===t&&(r=!1!==l._22(n,14)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,14).hide(1500)&&r),"click"===t&&(r=!1!==i.generateSeed(256)&&r),r},null,null)),l._8(14,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(16,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,"generators",n(t,2,0,t.component.onboarding)),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("wallet.new.generate-12-seed"))),n(t,14,0,l._32(t,14,0,l._22(t,15).transform("wallet.new.generate-24-seed")))},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("wallet.new.12-words"))),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("wallet.new.24-words")))})}function jb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[["class","normal-seed-field"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.lastAssistedSeed)})}function Ib(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(2,{"transparent-text":0}),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,n(t,2,0,t.component.onboarding))},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.seed.change-seed")))})}function Rb(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[["class","text-with-icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","yellow mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["touch_app"])),(n()(),l._9(5,0,null,null,4,"span",[],null,null,null,null,null)),l._8(6,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(7,{"transparent-text":0}),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,6,0,n(t,7,0,e.onboarding))},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.new.seed.enter-seed")))})}function Hb(n){return l._33(0,[(n()(),l._9(0,0,null,null,27,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,12,"div",[["class","dashed-border non-editable-field"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.enterSeed()&&l),l},null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(4,{"onboarding-version":0,"show-pointer":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,jb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ib)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Rb)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,10,"div",[["class","seed-type-button"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,7,"div",[],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changeSeedType()&&l),l},null,null)),l._8(19,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(20,{"dashed-border":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,16777216,null,null,2,"img",[["src","../../../../assets/img/lock-gold.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,23).show()&&r),"keydown"===t&&(r=!1!==l._22(n,23)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,23).hide(1500)&&r),r},null,null)),l._8(23,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,"dashed-border non-editable-field",n(t,4,0,e.onboarding,!e.create)),n(t,7,0,e.create||e.lastAssistedSeed),n(t,10,0,!e.create&&e.lastAssistedSeed),n(t,13,0,!e.create&&!e.lastAssistedSeed),n(t,19,0,n(t,20,0,!e.onboarding)),n(t,23,0,l._32(t,23,0,l._22(t,24).transform("wallet.new.seed.use-custom-seed")))},null)}function Nb(n){return l._33(0,[(n()(),l._9(0,0,null,null,20,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,5,"textarea",[["formControlName","seed"],["id","seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,3)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,3).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,3)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,3)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(3,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(5,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(7,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,10,"div",[["class","seed-type-button"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,7,"div",[],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changeSeedType()&&l),l},null,null)),l._8(12,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(13,{"dashed-border":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,16777216,null,null,2,"img",[["src","../../../../assets/img/unlock-grey.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,16).show()&&r),"keydown"===t&&(r=!1!==l._22(n,16)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,16).hide(1500)&&r),r},null,null)),l._8(16,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,5,0,"seed"),n(t,12,0,n(t,13,0,!e.onboarding)),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("wallet.new.seed.use-normal-seed")))},function(n,t){n(t,2,0,l._22(t,7).ngClassUntouched,l._22(t,7).ngClassTouched,l._22(t,7).ngClassPristine,l._22(t,7).ngClassDirty,l._22(t,7).ngClassValid,l._22(t,7).ngClassInvalid,l._22(t,7).ngClassPending)})}function Fb(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"p",[],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(2,{"red-disclaimer-box":0,"white-disclaimer-box transparent-text":1}),(n()(),l._31(3,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,n(t,2,0,!e.onboarding,e.onboarding))},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.seed-warning")))})}function Bb(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[["class","text-with-icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","yellow mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["touch_app"])),(n()(),l._9(5,0,null,null,4,"span",[],null,null,null,null,null)),l._8(6,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(7,{"transparent-text":0}),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,6,0,n(t,7,0,e.onboarding))},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.new.seed.confirm-seed")))})}function Vb(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","text-with-icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","green mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["done"])),(n()(),l._31(-1,null,[" "])),(n()(),l._9(6,0,null,null,4,"span",[],null,null,null,null,null)),l._8(7,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(8,{"transparent-text":0}),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,7,0,n(t,8,0,e.onboarding))},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("wallet.new.seed.confirmed-seed")))})}function Wb(n){return l._33(0,[(n()(),l._9(0,0,null,null,12,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,9,"div",[["class","dashed-border non-editable-field"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.confirmNormalSeed()&&l),l},null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(4,{"onboarding-version":0,"show-pointer":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Bb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Vb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,"dashed-border non-editable-field",n(t,4,0,e.onboarding,!e.assistedSeedConfirmed)),n(t,7,0,!e.assistedSeedConfirmed),n(t,10,0,e.assistedSeedConfirmed)},null)}function zb(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,5,"textarea",[["formControlName","confirm_seed"],["id","confirm_seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,3)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,3).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,3)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,3)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(3,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(5,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(7,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,5,0,"confirm_seed")},function(n,t){n(t,2,0,l._22(t,7).ngClassUntouched,l._22(t,7).ngClassTouched,l._22(t,7).ngClassPristine,l._22(t,7).ngClassDirty,l._22(t,7).ngClassValid,l._22(t,7).ngClassInvalid,l._22(t,7).ngClassPending)})}function Ub(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"label",[["for","confirm_seed"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Wb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,zb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,7,0,e.enterSeedWithAssistance),n(t,10,0,!e.enterSeedWithAssistance)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.confirm-seed-label")))})}function Gb(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,9)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,9).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,9)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,9)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,14).onFocus()&&r),r},null,null)),l._8(9,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(11,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(13,16384,null,0,Eo,[uo],null,null),l._8(14,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,"password")},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("password.label"))),n(t,8,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending)})}function qb(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"label",[["for","confirm_password"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,9)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,9).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,9)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,9)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,14).onFocus()&&r),"keydown.enter"===t&&(r=!1!==i.createWallet()&&r),r},null,null)),l._8(9,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(11,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(13,16384,null,0,Eo,[uo],null,null),l._8(14,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,"confirm_password")},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("password.confirm-label"))),n(t,8,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending)})}function Jb(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,9,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,6,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setEncrypt(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(6,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(8,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(n()(),l._31(9,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,14,"div",[["class","row -passwords"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,5,"div",[["class","col-md-12"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,2,"p",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Gb)),l._8(23,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qb)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,6,0,"encrypt",!0),n(t,23,0,e.encrypt),n(t,26,0,e.encrypt)},function(n,t){n(t,4,0,l._22(t,6).id,l._22(t,6).indeterminate,l._22(t,6).checked,l._22(t,6).disabled,"before"==l._22(t,6).labelPosition),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("wallet.new.encrypt"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("wallet.new.encrypt-warning")))})}function Qb(n){return l._33(0,[(n()(),l._9(0,0,null,null,22,"div",[["class","alert-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["error"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,15,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.onCustomSeedAcceptance(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(18,4374528,[["seedCheck",4]],0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(19,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0),n(t,18,0,e.customSeedAccepted)},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("wallet.new.unconventional-seed-title"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.new.unconventional-seed-text"))),n(t,16,0,l._22(t,18).id,l._22(t,18).indeterminate,l._22(t,18).checked,l._22(t,18).disabled,"before"==l._22(t,18).labelPosition),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("wallet.new.unconventional-seed-check")))})}function Kb(n){return l._33(0,[(n()(),l._9(0,0,null,null,49,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,12)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,12).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,12)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,12)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(12,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(14,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(16,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Eb)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,8,"label",[["for","seed"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(27,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Yb)),l._8(31,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Hb)),l._8(35,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Nb)),l._8(38,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Fb)),l._8(41,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ub)),l._8(45,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Jb)),l._8(48,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._4(16777216,null,null,1,null,Qb)),l._8(52,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,14,0,"label"),n(t,20,0,!e.create&&e.enterSeedWithAssistance),n(t,31,0,e.create),n(t,35,0,e.enterSeedWithAssistance),n(t,38,0,!e.enterSeedWithAssistance),n(t,41,0,e.create),n(t,45,0,e.create),n(t,48,0,!e.onboarding),n(t,52,0,e.form.valid&&!e.customSeedIsNormal)},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.new.name-label"))),n(t,11,0,l._22(t,16).ngClassUntouched,l._22(t,16).ngClassTouched,l._22(t,16).ngClassPristine,l._22(t,16).ngClassDirty,l._22(t,16).ngClassValid,l._22(t,16).ngClassInvalid,l._22(t,16).ngClassPending),n(t,27,0,l._32(t,27,0,l._22(t,28).transform("wallet.new.seed-label")))})}var Xb=function(){function n(n){this.dialogRef=n,this.acceptSafe=!1}return n.prototype.closePopup=function(){this.dialogRef.close(this.acceptSafe)},n.prototype.setAccept=function(n){this.acceptSafe=n.checked},n}(),Zb=function(){function n(n,t,e,r){var i=this;this.dialog=n,this.router=t,this.fill=null,this.onLabelAndSeedCreated=new l.o,this.showNewForm=!0,this.doubleButtonActive=Fp.LeftButton,this.hwCompatibilityActivated=!1,this.synchronized=!0,this.hwCompatibilityActivated=e.hwWalletCompatibilityActivated,this.synchronizedSubscription=r.synchronized.subscribe(function(n){return i.synchronized=n})}return n.prototype.ngOnInit=function(){var n=this;setTimeout(function(){n.formControl.initForm(null,n.fill)}),this.fill&&(this.doubleButtonActive=this.fill.creatingNewWallet?Fp.LeftButton:Fp.RightButton,this.showNewForm=this.fill.creatingNewWallet)},n.prototype.ngOnDestroy=function(){this.synchronizedSubscription.unsubscribe()},n.prototype.changeForm=function(n){this.showNewForm=n!==Fp.RightButton,this.doubleButtonActive=n,this.fill=null,this.formControl.initForm(this.showNewForm,this.fill)},n.prototype.createWallet=function(){var n=this;this.showSafe().afterClosed().subscribe(function(t){t&&n.emitCreatedData()})},n.prototype.loadWallet=function(){var n=this;this.synchronized?this.emitCreatedData():Wc(this.dialog,{headerText:"wallet.new.synchronizing-warning-title",text:"wallet.new.synchronizing-warning-text",confirmButtonText:"wallet.new.synchronizing-warning-continue",cancelButtonText:"wallet.new.synchronizing-warning-cancel"}).afterClosed().subscribe(function(t){t&&n.emitCreatedData()})},n.prototype.useHardwareWallet=function(){var n=this,t=new oa;t.width="566px",t.autoFocus=!1,t.data=!0,this.dialog.open(ud,t).afterClosed().subscribe(function(t){t&&n.router.navigate(["/wallets"])})},n.prototype.emitCreatedData=function(){this.onLabelAndSeedCreated.emit(this.formControl.getData())},n.prototype.showSafe=function(){var n=new oa;return n.width="450px",this.dialog.open(Xb,n)},n}(),$b=l._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.hw-link[_ngcontent-%COMP%]{cursor:pointer;color:#fff;font-size:13px;line-height:20px;margin-bottom:20px}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;margin-bottom:20px}.-toggle-container[_ngcontent-%COMP%]{margin:10px auto}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px}"]],data:{}});function nv(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[["class","hw-link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.useHardwareWallet()&&l),l},null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wizard.hardware-wallet-link")))})}function tv(n){return l._33(0,[l._29(402653184,1,{formControl:0}),(n()(),l._9(1,0,null,null,52,"div",[["class","onboarding-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,18,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,15,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"div",[["class","-header"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,5,"div",[["class","-description"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,9,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,6,"div",[["class","row-container -toggle-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,3,"app-double-button",[],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeForm(e)&&l),l},M_,x_)),l._8(28,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(34,0,null,null,7,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,4,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,0,null,null,1,"app-create-wallet-form",[],null,null,null,Kb,Ab)),l._8(39,245760,[[1,4],["formControl",4]],0,Gc,[Ye,fa,jc],{create:[0,"create"],onboarding:[1,"onboarding"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,nv)),l._8(44,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,6,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,3,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0,r=n.component;return"action"===t&&(l=!1!==(r.showNewForm?r.createWallet():r.loadWallet())&&l),l},w_,g_)),l._8(49,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(50,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,28,0,l._32(t,28,0,l._22(t,29).transform("common.load")),l._32(t,28,1,l._22(t,30).transform("common.new")),e.doubleButtonActive),n(t,39,0,e.showNewForm,!0),n(t,44,0,e.hwCompatibilityActivated),n(t,49,0,!l._22(t,39).isValid)},function(n,t){n(t,10,0,l._32(t,10,0,l._22(t,11).transform("wallet.new.create-title"))),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("wizard.wallet-desc"))),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("wallet.new.create-button")))})}var ev=l._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;margin-bottom:20px}.-check-container[_ngcontent-%COMP%]{margin:10px auto;text-align:center}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#fafafa!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#fbfbfb}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}.-input.disable[_ngcontent-%COMP%]{background:rgba(255,255,255,.1)}.-hidden[_ngcontent-%COMP%]{display:none}"]],data:{}});function lv(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,95,"div",[["class","onboarding-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,18,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,15,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"div",[["class","-header"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,5,"div",[["class","-description"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,12,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,9,"div",[["class","row-container -check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,6,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setEncrypt(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(29,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(31,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(n()(),l._31(32,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,43,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,40,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(41,0,null,null,37,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,43).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,43).onReset()&&r),r},null,null)),l._8(42,16384,null,0,ts,[],null,null),l._8(43,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(45,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(47,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(50,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(53,0,null,null,7,"input",[["class","-input"],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,56)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,56).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,56)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,56)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(54,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(55,{disable:0}),l._8(56,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(58,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(60,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(65,0,null,null,2,"label",[["for","confirm"]],null,null,null,null,null)),(n()(),l._31(66,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(69,0,null,null,7,"input",[["class","-input"],["formControlName","confirm"],["id","confirm"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,72)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,72).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,72)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,72)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.emitCreatedPassword()&&r),r},null,null)),l._8(70,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(71,{disable:0}),l._8(72,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(74,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(76,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(82,0,null,null,13,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(84,0,null,null,3,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.emitCreatedPassword()&&l),l},w_,g_)),l._8(85,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(86,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(89,0,null,null,5,"app-button",[["class","ghost -button-min-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.emitBack()&&l),l},w_,g_)),l._8(90,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(91,{"-hidden":0}),l._8(92,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(93,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,29,0,"encrypt",!0),n(t,43,0,e.form),n(t,54,0,"-input",n(t,55,0,e.form.disabled)),n(t,58,0,"password"),n(t,70,0,"-input",n(t,71,0,e.form.disabled)),n(t,74,0,"confirm"),n(t,85,0,e.form.enabled&&!e.form.valid),n(t,90,0,"ghost -button-min-margin",n(t,91,0,e.isWorking))},function(n,t){n(t,10,0,l._32(t,10,0,l._22(t,11).transform("wallet.new.encrypt-title"))),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("wizard.encrypt-desc"))),n(t,27,0,l._22(t,29).id,l._22(t,29).indeterminate,l._22(t,29).checked,l._22(t,29).disabled,"before"==l._22(t,29).labelPosition),n(t,32,0,l._32(t,32,0,l._22(t,33).transform("wallet.new.encrypt"))),n(t,41,0,l._22(t,45).ngClassUntouched,l._22(t,45).ngClassTouched,l._22(t,45).ngClassPristine,l._22(t,45).ngClassDirty,l._22(t,45).ngClassValid,l._22(t,45).ngClassInvalid,l._22(t,45).ngClassPending),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("password.label"))),n(t,53,0,l._22(t,60).ngClassUntouched,l._22(t,60).ngClassTouched,l._22(t,60).ngClassPristine,l._22(t,60).ngClassDirty,l._22(t,60).ngClassValid,l._22(t,60).ngClassInvalid,l._22(t,60).ngClassPending),n(t,66,0,l._32(t,66,0,l._22(t,67).transform("password.confirm-label"))),n(t,69,0,l._22(t,76).ngClassUntouched,l._22(t,76).ngClassTouched,l._22(t,76).ngClassPristine,l._22(t,76).ngClassDirty,l._22(t,76).ngClassValid,l._22(t,76).ngClassInvalid,l._22(t,76).ngClassPending),n(t,86,0,l._32(t,86,0,l._22(t,87).transform("wizard.finish-button"))),n(t,93,0,l._32(t,93,0,l._22(t,94).transform("wizard.back-button")))})}var rv=l._7({encapsulation:0,styles:[["button[_ngcontent-%COMP%]{position:fixed;right:30px;top:10px}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:-3px}"]],data:{}});function iv(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"button",[["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changelanguage()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(2,16384,null,0,Fs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,0,"img",[["class","flag"]],[[8,"src",4]],null,null,null,null)),(n()(),l._31(-1,0,["\n"]))],null,function(n,t){var e=t.component;n(t,0,0,l._22(t,1).disabled||null),n(t,4,0,"assets/img/lang/"+e.language.iconName)})}function ov(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding-create-wallet",[],null,[[null,"onLabelAndSeedCreated"]],function(n,t,e){var l=!0;return"onLabelAndSeedCreated"===t&&(l=!1!==n.component.onLabelAndSeedCreated(e)&&l),l},tv,$b)),l._8(1,245760,null,0,Zb,[fa,cp,oc,qc],{fill:[0,"fill"]},{onLabelAndSeedCreated:"onLabelAndSeedCreated"})],function(n,t){n(t,1,0,t.component.fill)},null)}function sv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding-encrypt-wallet",[],null,[[null,"onPasswordCreated"],[null,"onBack"]],function(n,t,e){var l=!0,r=n.component;return"onPasswordCreated"===t&&(l=!1!==r.onPasswordCreated(e)&&l),"onBack"===t&&(l=!1!==r.onBack()&&l),l},lv,ev)),l._8(1,114688,[[1,4],["encryptForm",4]],0,uf,[ns],null,{onPasswordCreated:"onPasswordCreated",onBack:"onBack"})],function(n,t){n(t,1,0)},null)}function av(n){return l._33(0,[l._29(671088640,1,{encryptForm:0}),(n()(),l._4(16777216,null,null,1,null,iv)),l._8(2,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,ov)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,sv)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.language),n(t,5,0,1===e.step),n(t,8,0,2===e.step)},null)}var uv=l._5("app-onboarding",cf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding",[],null,null,null,av,rv)),l._8(1,245760,null,0,cf,[cp,Sc,Bc,fa,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),cv=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px}.-disabled[_ngcontent-%COMP%]{opacity:.5}"]],data:{}});function dv(n){return l._33(0,[l._29(402653184,1,{resetButton:0}),(n()(),l._9(1,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(2,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(5,0,null,null,74,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,71,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,68,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,10).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,10).onReset()&&r),r},null,null)),l._8(10,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(12,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"label",[["for","wallet"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,5,"input",[["class","-disabled"],["formControlName","wallet"],["id","wallet"],["readonly",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,21)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,21).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,21)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,21)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(21,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(23,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(25,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,2,"label",[["for","seed"]],null,null,null,null,null)),(n()(),l._31(31,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(34,0,null,null,5,"textarea",[["formControlName","seed"],["id","seed"],["row","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,35)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,35).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,35)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,35)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(35,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(37,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(39,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(45,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,5,"input",[["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,49)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,49).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,49)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,49)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(49,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(51,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(53,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,2,"label",[["for","confirm"]],null,null,null,null,null)),(n()(),l._31(59,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(62,0,null,null,5,"input",[["formControlName","confirm"],["id","confirm"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,63)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,63).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,63)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,63)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.reset()&&r),r},null,null)),l._8(63,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(70,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(72,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.reset()&&l),l},w_,g_)),l._8(73,49152,[[1,4],["resetButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(74,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,l._22(t,3).transform("title.reset"))),n(t,10,0,e.form),n(t,23,0,"wallet"),n(t,37,0,"seed"),n(t,51,0,"password"),n(t,65,0,"confirm"),n(t,73,0,!e.form.valid)},function(n,t){n(t,9,0,l._22(t,12).ngClassUntouched,l._22(t,12).ngClassTouched,l._22(t,12).ngClassPristine,l._22(t,12).ngClassDirty,l._22(t,12).ngClassValid,l._22(t,12).ngClassInvalid,l._22(t,12).ngClassPending),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("reset.wallet-label"))),n(t,20,0,l._22(t,25).ngClassUntouched,l._22(t,25).ngClassTouched,l._22(t,25).ngClassPristine,l._22(t,25).ngClassDirty,l._22(t,25).ngClassValid,l._22(t,25).ngClassInvalid,l._22(t,25).ngClassPending),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("reset.seed-label"))),n(t,34,0,l._22(t,39).ngClassUntouched,l._22(t,39).ngClassTouched,l._22(t,39).ngClassPristine,l._22(t,39).ngClassDirty,l._22(t,39).ngClassValid,l._22(t,39).ngClassInvalid,l._22(t,39).ngClassPending),n(t,45,0,l._32(t,45,0,l._22(t,46).transform("reset.password-label"))),n(t,48,0,l._22(t,53).ngClassUntouched,l._22(t,53).ngClassTouched,l._22(t,53).ngClassPristine,l._22(t,53).ngClassDirty,l._22(t,53).ngClassValid,l._22(t,53).ngClassInvalid,l._22(t,53).ngClassPending),n(t,59,0,l._32(t,59,0,l._22(t,60).transform("reset.confirm-label"))),n(t,62,0,l._22(t,67).ngClassUntouched,l._22(t,67).ngClassTouched,l._22(t,67).ngClassPristine,l._22(t,67).ngClassDirty,l._22(t,67).ngClassValid,l._22(t,67).ngClassInvalid,l._22(t,67).ngClassPending),n(t,74,0,l._32(t,74,0,l._22(t,75).transform("reset.reset-button")))})}var hv=l._5("app-reset-password",df,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-reset-password",[],null,null,null,dv,cv)),l._8(1,180224,null,0,df,[ns,Ch,cp,Sc,jc],null,null)],null,null)},{},{},[]),pv=function(){function n(n,t,e,l){this.walletService=n,this.dialogRef=t,this.formBuilder=e,this.purchaseService=l}return n.prototype.ngOnInit=function(){this.initForm()},n.prototype.generate=function(){var n=this;this.purchaseService.generate(this.form.value.address).subscribe(function(){return n.dialogRef.close()})},n.prototype.initForm=function(){this.form=this.formBuilder.group({address:["",Xi.required]})},n}(),fv=l._7({encapsulation:0,styles:[["mat-select[_ngcontent-%COMP%]{width:100%;padding:40px 0 20px}"]],data:{}});function _v(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n ","\n "]))],function(n,t){n(t,1,0,t.context.$implicit.address)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.address)})}function mv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(4,0,null,null,21,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,5).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,5).onReset()&&r),r},null,null)),l._8(5,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(7,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,15,"mat-select",[["class","input-field mat-select"],["formControlName","address"],["role","listbox"]],[[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,14)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,14)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,14)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(12,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(14,2080768,null,3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"]},null),l._29(603979776,1,{options:1}),l._29(603979776,2,{optionGroups:1}),l._29(335544320,3,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(19,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,2,null,_v)),l._8(22,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),l._25(131072,nn,[l.h]),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(27,0,null,null,7,"div",[["class","button-line"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,4,"a",[["class","mat-raised-button"],["mat-raised-button",""]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,30)._haltDisabledEvents(e)&&r),"click"===t&&(r=!1!==i.generate()&&r),r},s_,o_)),l._8(30,180224,null,0,Vs,[Hl,Rr,l.l],null,null),l._8(31,16384,null,0,Ns,[],null,null),(n()(),l._31(32,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,e.form),n(t,12,0,"address"),n(t,14,0,l._32(t,14,0,l._22(t,18).transform("buy.select-address"))),n(t,22,0,l._32(t,22,0,l._22(t,23).transform(e.walletService.allAddresses())))},function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("buy.deposit-address"))),n(t,4,0,l._22(t,7).ngClassUntouched,l._22(t,7).ngClassTouched,l._22(t,7).ngClassPristine,l._22(t,7).ngClassDirty,l._22(t,7).ngClassValid,l._22(t,7).ngClassInvalid,l._22(t,7).ngClassPending),n(t,9,1,[l._22(t,14).id,l._22(t,14).tabIndex,l._22(t,14)._ariaLabel,l._22(t,14).ariaLabelledby,l._22(t,14).required.toString(),l._22(t,14).disabled.toString(),l._22(t,14).errorState,l._22(t,14).panelOpen?l._22(t,14)._optionIds:null,l._22(t,14).multiple,l._22(t,14)._ariaDescribedby||null,l._22(t,14)._getAriaActiveDescendant(),l._22(t,14).disabled,l._22(t,14).errorState,l._22(t,14).required,l._22(t,19).ngClassUntouched,l._22(t,19).ngClassTouched,l._22(t,19).ngClassPristine,l._22(t,19).ngClassDirty,l._22(t,19).ngClassValid,l._22(t,19).ngClassInvalid,l._22(t,19).ngClassPending]),n(t,29,0,l._22(t,30).disabled?-1:0,l._22(t,30).disabled||null,l._22(t,30).disabled.toString()),n(t,32,0,l._32(t,32,0,l._22(t,33).transform("buy.generate")))})}var gv=l._5("app-add-deposit-address",pv,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-add-deposit-address",[],null,null,null,mv,fv)),l._8(1,114688,null,0,pv,[Sc,ca,ns,ef],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),yv=function(){function n(){}return n.prototype.closePopup=function(){this.disableDismiss||this.dialog.close()},n.prototype.ngOnChanges=function(n){n.disableDismiss&&(this.dialog.disableClose=n.disableDismiss.currentValue)},n}(),bv=l._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{background-color:#f7f7f7;border-top-left-radius:5px;border-top-right-radius:5px;line-height:50px;position:relative;text-align:center}.-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{cursor:pointer;height:32px;position:absolute;right:9px;top:9px}.-body[_ngcontent-%COMP%]{background-color:#fbfbfb;padding:0 24px}mat-dialog-content[_ngcontent-%COMP%]::after, mat-dialog-content[_ngcontent-%COMP%]::before{content:'';padding-top:24px;height:0;display:block}"]],data:{}});function vv(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["src","../../../../../assets/img/close-grey.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.closePopup()&&l),l},null,null))],null,null)}function wv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","-header"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),(n()(),l._4(16777216,null,null,1,null,vv)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(6,0,null,null,7,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,4,"mat-dialog-content",[["class","mat-dialog-content"]],null,null,null,null,null)),l._8(9,16384,null,0,_a,[],null,null),(n()(),l._31(-1,null,["\n "])),l._21(null,0),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,3,0,!t.component.disableDismiss)},function(n,t){n(t,1,0,t.component.headline)})}var xv=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function Mv(n){return l._33(0,[l._29(402653184,1,{formControl:0}),l._29(402653184,2,{createButton:0}),l._29(402653184,3,{cancelButton:0}),(n()(),l._9(3,0,null,null,19,"app-modal",[],null,null,null,wv,bv)),l._8(4,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(7,0,null,0,1,"app-create-wallet-form",[],null,null,null,Kb,Ab)),l._8(8,245760,[[1,4],["formControl",4]],0,Gc,[Ye,fa,jc],{create:[0,"create"],onboarding:[1,"onboarding"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(10,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(13,49152,[[3,4],["cancelButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(14,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.createWallet()&&l),l},w_,g_)),l._8(18,49152,[[2,4],["createButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(19,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,e.dialogRef,l._32(t,4,1,l._22(t,5).transform("wallet.new."+(e.data.create?"create":"load")+"-title")),e.disableDismiss),n(t,8,0,e.data.create,!1),n(t,18,0,!l._22(t,8).isValid)},function(n,t){var e=t.component;n(t,14,0,l._32(t,14,0,l._22(t,15).transform("wallet.new.cancel-button"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("wallet.new."+(e.data.create?"create":"load")+"-button")))})}var kv=l._5("app-create-wallet",Jc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-create-wallet",[],null,null,null,Mv,xv)),l._8(1,180224,null,0,Jc,[da,ca,Sc,fa,jc,qc],null,null)],null,null)},{},{},[]),Cv=l._7({encapsulation:0,styles:[[".content[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%]{margin-right:20px}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block;height:36px!important;width:36px!important}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:36px!important;width:36px!important}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{font-size:40px}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .list[_ngcontent-%COMP%]{padding:10px 0}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .list[_ngcontent-%COMP%] .list-element[_ngcontent-%COMP%]{margin:10px 0;font-size:12px;color:#000;font-weight:700}.content[_ngcontent-%COMP%] .-red[_ngcontent-%COMP%]{color:#ff004e}.content[_ngcontent-%COMP%] .-yellow[_ngcontent-%COMP%]{color:#ffc125}.content[_ngcontent-%COMP%] .-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.2)}.content[_ngcontent-%COMP%] .-green[_ngcontent-%COMP%]{color:#00df80}.content[_ngcontent-%COMP%] .-blinking[_ngcontent-%COMP%]{-webkit-animation:1s linear infinite alert-blinking;animation:1s linear infinite alert-blinking}"]],data:{}});function Sv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Ov(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -green"]],null,null,null,null,null)),(n()(),l._31(-1,null,["done"]))],null,null)}function Tv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -red"]],null,null,null,null,null)),(n()(),l._31(-1,null,["error_outline"]))],null,null)}function Lv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["usb"]))],null,null)}function Pv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -yellow"]],null,null,null,null,null)),(n()(),l._31(-1,null,["memory"]))],null,null)}function Dv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -red -blinking"]],null,null,null,null,null)),(n()(),l._31(-1,null,["error"]))],null,null)}function Av(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -yellow"]],null,null,null,null,null)),(n()(),l._31(-1,null,["touch_app"]))],null,null)}function Ev(n){return l._33(0,[(n()(),l._9(0,0,null,null,22,"div",[["class","icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Sv)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ov)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Tv)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Lv)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Pv)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Dv)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Av)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.icon==e.icons.Spinner),n(t,6,0,e.icon==e.icons.Success),n(t,9,0,e.icon==e.icons.Error),n(t,12,0,e.icon==e.icons.Usb),n(t,15,0,e.icon==e.icons.HardwareWallet),n(t,18,0,e.icon==e.icons.Warning),n(t,21,0,e.icon==e.icons.Confirm)},null)}function Yv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"span",[["class","big-text"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.component.upperBigText)})}function jv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.text)})}function Iv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.activateLink()&&l),l},null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.linkText)})}function Rv(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,"div",[["class","list-element"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["\u2022 ",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(7,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(12,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform(t.context.$implicit.coins.toString()))),n(t,7,0,l._32(t,7,0,l._22(t,8).transform("hardware-wallet.create-tx.send-p1")),l._32(t,7,1,l._22(t,9).transform(t.context.$implicit.hours.toString(),!1))),n(t,12,0,l._32(t,12,0,l._22(t,13).transform("hardware-wallet.create-tx.send-p2")),t.context.$implicit.address)})}function Hv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","list"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Rv)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.outputsList)},null)}function Nv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.lowerText)})}function Fv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"span",[["class","big-text"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.component.lowerBigText)})}function Bv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"span",[["class","-grey"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.component.lowerLightText)})}function Vv(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[["class","content"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ev)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,22,"div",[["class","text-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Yv)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,jv)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Iv)),l._8(14,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hv)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Nv)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Fv)),l._8(23,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Bv)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.icon!==e.icons.None),n(t,8,0,e.upperBigText),n(t,11,0,e.text),n(t,14,0,e.linkText),n(t,17,0,e.outputsList),n(t,20,0,e.lowerText),n(t,23,0,e.lowerBigText),n(t,26,0,e.lowerLightText)},null)}var Wv=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}.info[_ngcontent-%COMP%]{margin:5px 0 25px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}"]],data:{}});function zv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[["class","info"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.added.characters-warning")))})}function Uv(n){return l._33(0,[(n()(),l._9(0,0,null,null,39,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zv)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,20,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,7,"input",[["formControlName","label"],["id","label"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,17)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,17).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,17)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,17)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.rename()&&r),r},null,null)),l._8(17,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(18,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(21,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(30,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(31,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(34,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.rename()&&l),l},w_,g_)),l._8(35,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(36,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.showCharactersWarning),n(t,6,0,e.form),n(t,18,0,e.data.wallet.isHardware?e.maxHwWalletLabelLength:null),n(t,21,0,"label"),n(t,30,0,l._22(t,35)&&l._22(t,35).isLoading()),n(t,35,0,!e.form.valid)},function(n,t){n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.rename.name-label"))),n(t,16,0,l._22(t,18).maxlength?l._22(t,18).maxlength:null,l._22(t,23).ngClassUntouched,l._22(t,23).ngClassTouched,l._22(t,23).ngClassPristine,l._22(t,23).ngClassDirty,l._22(t,23).ngClassValid,l._22(t,23).ngClassInvalid,l._22(t,23).ngClassPending),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("wallet.rename.cancel-button"))),n(t,36,0,l._32(t,36,0,l._22(t,37).transform("wallet.rename.rename-button")))})}function Gv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function qv(n){return l._33(0,[l._29(671088640,1,{button:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Uv)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Gv)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("wallet.rename.title")),e.button&&e.button.isLoading()||e.currentState===e.states.WaitingForConfirmation),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.WaitingForConfirmation)},null)}var Jv=l._5("app-change-name",nd,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-change-name",[],null,null,null,qv,Wv)),l._8(1,245760,null,0,nd,[ca,da,ns,Sc,oc,De.j,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),Qv=l._7({encapsulation:0,styles:[[".qr-container[_ngcontent-%COMP%]{text-align:center;margin-bottom:24px}.qr-container[_ngcontent-%COMP%] .qr[_ngcontent-%COMP%]{height:180px;width:180px;display:inline-block}.separator[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.2);height:1px;width:100%}.data-container[_ngcontent-%COMP%]{margin:14px 0}.data-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{color:#171a1d}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]{color:rgba(30,34,39,.75);cursor:pointer}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%] .text[_ngcontent-%COMP%]{margin-right:5px}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%] .copy[_ngcontent-%COMP%]{color:rgba(30,34,39,.75);opacity:.25}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]:hover .copy[_ngcontent-%COMP%]{opacity:.75}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]:active .copy[_ngcontent-%COMP%]{opacity:1}.link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{padding:0;display:inline;vertical-align:middle;font-size:13px}.invalid[_ngcontent-%COMP%]{color:#ff004e}"]],data:{}});function Kv(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","data-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,4,"div",[["class","data"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.copyText(r.currentQrContent)&&l),l},null,null)),(n()(),l._9(7,0,null,null,1,"span",[["class","text"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),(n()(),l._9(9,0,null,null,1,"span",[["class","fa copy"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\uf0c5"])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("qr.data"))),n(t,8,0,e.currentQrContent)})}function Xv(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"div",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.startShowingForm()&&l),l},null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(4,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"]))],function(n,t){n(t,4,0)},function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("qr.request-link")))})}function Zv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","invalid"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("qr.invalid")))})}function $v(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","invalid"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("qr.invalid")))})}function nw(n){return l._33(0,[(n()(),l._9(0,0,null,null,58,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,17,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"label",[["for","coins"]],null,null,null,null,null)),(n()(),l._31(8,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,Zv)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,7,"input",[["formControlName","coins"],["id","coins"],["maxlength","20"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,15)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,15).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,15)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,15)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(15,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(16,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(19,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(21,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,17,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,5,"label",[["for","hours"]],null,null,null,null,null)),(n()(),l._31(27,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,$v)),l._8(30,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,7,"input",[["formControlName","hours"],["id","hours"],["maxlength","20"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,34)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,34).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,34)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,34)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(34,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(35,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(38,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(40,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,2,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(46,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,7,"input",[["formControlName","note"],["id","note"],["maxlength","100"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,50)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,50).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,50)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,50)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(50,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(51,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(54,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(56,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,11,0,e.invalidCoins),n(t,16,0,"20"),n(t,19,0,"coins"),n(t,30,0,e.invalidHours),n(t,35,0,"20"),n(t,38,0,"hours"),n(t,51,0,"100"),n(t,54,0,"note")},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("qr.amount"))),n(t,14,0,l._22(t,16).maxlength?l._22(t,16).maxlength:null,l._22(t,21).ngClassUntouched,l._22(t,21).ngClassTouched,l._22(t,21).ngClassPristine,l._22(t,21).ngClassDirty,l._22(t,21).ngClassValid,l._22(t,21).ngClassInvalid,l._22(t,21).ngClassPending),n(t,27,0,l._32(t,27,0,l._22(t,28).transform("qr.hours"))),n(t,33,0,l._22(t,35).maxlength?l._22(t,35).maxlength:null,l._22(t,40).ngClassUntouched,l._22(t,40).ngClassTouched,l._22(t,40).ngClassPristine,l._22(t,40).ngClassDirty,l._22(t,40).ngClassValid,l._22(t,40).ngClassInvalid,l._22(t,40).ngClassPending),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("qr.message"))),n(t,49,0,l._22(t,51).maxlength?l._22(t,51).maxlength:null,l._22(t,56).ngClassUntouched,l._22(t,56).ngClassTouched,l._22(t,56).ngClassPristine,l._22(t,56).ngClassDirty,l._22(t,56).ngClassValid,l._22(t,56).ngClassInvalid,l._22(t,56).ngClassPending)})}function tw(n){return l._33(0,[l._29(402653184,1,{qr:0}),(n()(),l._9(1,0,null,null,32,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,3,"div",[["class","qr-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,[[1,0],["qr",1]],null,0,"div",[["class","qr"],["id","qr"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(10,0,null,0,0,"div",[["class","separator"]],null,null,null,null,null)),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Kv)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(15,0,null,0,11,"div",[["class","data-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,4,"div",[["class","data"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.copyText(r.data.address)&&l),l},null,null)),(n()(),l._9(22,0,null,null,1,"span",[["class","text"]],null,null,null,null,null)),(n()(),l._31(23,null,["",""])),(n()(),l._9(24,0,null,null,1,"span",[["class","fa copy"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\uf0c5"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Xv)),l._8(29,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,nw)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.data.hideCoinRequestForm?"qr.title-read-only":"qr.title"))),n(t,13,0,!e.data.ignoreCoinPrefix||!e.data.hideCoinRequestForm),n(t,29,0,!e.showForm&&!e.data.hideCoinRequestForm),n(t,32,0,e.showForm)},function(n,t){var e=t.component;n(t,18,0,l._32(t,18,0,l._22(t,19).transform("qr.address"))),n(t,23,0,e.data.address)})}var ew=l._5("app-qr-code",qp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-qr-code",[],null,null,null,tw,Qv)),l._8(1,245760,null,0,qp,[da,ca,ns,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),lw=l._7({encapsulation:0,styles:[[""]],data:{}});function rw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"app-modal",[],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"app-transaction-info",[],null,null,null,Sg,cg)),l._8(5,245760,null,0,ug,[rf,fa],{transaction:[0,"transaction"],isPreview:[1,"isPreview"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("history.tx-detail"))),n(t,5,0,e.transaction,!1)},null)}var iw=l._5("app-transaction-detail",of,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-transaction-detail",[],null,null,null,rw,lw)),l._8(1,49152,null,0,of,[da,ca],null,null)],null,null)},{},{},[]),ow=l._7({encapsulation:0,styles:[[".-safe-description[_ngcontent-%COMP%]{font-family:Skycoin;line-height:20px;font-size:12px;color:#1e2227;mix-blend-mode:normal;opacity:.8}.-check-container[_ngcontent-%COMP%]{text-align:center;margin-top:50px}.-safe-check-text[_ngcontent-%COMP%]{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-text-center[_ngcontent-%COMP%]{text-align:center}.-no-bottom-margin[_ngcontent-%COMP%] button{margin:28px 10px 0!important}.-title[_ngcontent-%COMP%]{font-family:Skycoin;line-height:30px;font-size:14px;text-align:center;letter-spacing:.0769231em;color:#ff004e}"]],data:{}});function sw(n){return l._33(0,[(n()(),l._9(0,0,null,null,27,"app-modal",[["class","-title"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,14,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"span",[["class","-safe-description"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,4,"mat-checkbox",[["class","-safe-check-text -check mat-checkbox"],["id","terms"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAccept(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(14,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(15,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(20,0,null,0,6,"div",[["class","-text-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,3,"app-button",[["class","primary -no-bottom-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(23,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(24,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("wizard.confirm.title"))),n(t,14,0,"terms",e.acceptSafe),n(t,23,0,!e.acceptSafe)},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("wizard.confirm.desc"))),n(t,12,0,l._22(t,14).id,l._22(t,14).indeterminate,l._22(t,14).checked,l._22(t,14).disabled,"before"==l._22(t,14).labelPosition),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("wizard.confirm.checkbox"))),n(t,24,0,l._32(t,24,0,l._22(t,25).transform("wizard.confirm.button")))})}var aw=l._5("app-onboarding-safeguard",Xb,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding-safeguard",[],null,null,null,sw,ow)),l._8(1,49152,null,0,Xb,[ca],null,null)],null,null)},{},{},[]),uw=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-info[_ngcontent-%COMP%]{margin:5px 0 25px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}.-warning[_ngcontent-%COMP%]{color:#ff004e}.link[_ngcontent-%COMP%]{font-size:13px;width:100%;display:inline-block;text-align:center;text-decoration:none;color:#0072ff}"]],data:{}});function cw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"p",[["class","-info"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"-warning":0}),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,"-info",n(t,2,0,t.component.data.warning))},function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform(e.data.description)))})}function dw(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"label",[["for","confirm_password"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,7)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,7).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,7)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,7)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,12).onFocus()&&r),"keydown.enter"===t&&(r=!1!==i.proceed()&&r),r},null,null)),l._8(7,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(9,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(11,16384,null,0,Eo,[uo],null,null),l._8(12,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,9,0,"confirm_password")},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("password.confirm-label"))),n(t,6,0,l._22(t,11).ngClassUntouched,l._22(t,11).ngClassTouched,l._22(t,11).ngClassPristine,l._22(t,11).ngClassDirty,l._22(t,11).ngClassValid,l._22(t,11).ngClassInvalid,l._22(t,11).ngClassPending)})}function hw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"a",[["class","link"]],[[8,"href",4]],null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"element-disabled":0}),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,"link",n(t,2,0,t.component.working))},function(n,t){n(t,0,0,"#/reset/"+t.component.data.wallet.filename),n(t,3,0,l._32(t,3,0,l._22(t,4).transform("password.reset-link")))})}function pw(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,42,"app-modal",[],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,cw)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(9,0,null,0,22,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,10).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,10).onReset()&&r),r},null,null)),l._8(10,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(12,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,21)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,21).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,21)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,21)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,26).onFocus()&&r),"keydown.enter"===t&&(r=!1!==i.proceed()&&r),r},null,null)),l._8(21,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(23,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(25,16384,null,0,Eo,[uo],null,null),l._8(26,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,dw)),l._8(30,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,hw)),l._8(34,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(36,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.proceed()&&l),l},w_,g_)),l._8(39,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(40,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,e.data.title?l._22(t,3).transform(e.data.title):l._22(t,4).transform("password.title")),e.working),n(t,7,0,e.data.description),n(t,10,0,e.form),n(t,23,0,"password"),n(t,30,0,e.data.confirm),n(t,34,0,e.data.wallet),n(t,39,0,!e.form.valid)},function(n,t){n(t,9,0,l._22(t,12).ngClassUntouched,l._22(t,12).ngClassTouched,l._22(t,12).ngClassPristine,l._22(t,12).ngClassDirty,l._22(t,12).ngClassValid,l._22(t,12).ngClassInvalid,l._22(t,12).ngClassPending),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("password.label"))),n(t,20,0,l._22(t,25).ngClassUntouched,l._22(t,25).ngClassTouched,l._22(t,25).ngClassPristine,l._22(t,25).ngClassDirty,l._22(t,25).ngClassValid,l._22(t,25).ngClassInvalid,l._22(t,25).ngClassPending),n(t,40,0,l._32(t,40,0,l._22(t,41).transform("password.button")))})}var fw=l._5("app-password-dialog",Zp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-password-dialog",[],null,null,null,pw,uw)),l._8(1,245760,null,0,Zp,[da,ca,jc,De.j],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),_w=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function mw(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"app-modal",[],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,8,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"label",[["for","seed"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"textarea",[["id","seed"],["readonly",""]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(14,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.dialogRef.close()&&l),l},w_,g_)),l._8(17,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,1,0,t.component.dialogRef,l._32(t,1,1,l._22(t,2).transform("title.seed")))},function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("backup.seed"))),n(t,11,0,e.data.seed),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("backup.close-button")))})}var gw=l._5("app-seed-modal",Xp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-seed-modal",[],null,null,null,mw,_w)),l._8(1,180224,null,0,Xp,[da,ca],null,null)],null,null)},{},{},[]),yw=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function bw(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,37,"app-modal",[],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,19,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"label",[["for","quantity"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,6,"input",[["formControlName","quantity"],["id","quantity"],["max","100"],["min","1"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,17)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,17).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,17)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,17)._compositionEnd(e.target.value)&&r),"change"===t&&(r=!1!==l._22(n,18).onChange(e.target.value)&&r),"input"===t&&(r=!1!==l._22(n,18).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,18).onTouched()&&r),"keydown.enter"===t&&(r=!1!==i.continue()&&r),r},null,null)),l._8(17,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(18,16384,null,0,so,[l.G,l.l],null,null),l._28(1024,null,to,function(n,t){return[n,t]},[ro,so]),l._8(20,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(22,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(26,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(29,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(30,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.continue()&&l),l},w_,g_)),l._8(34,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(35,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("wallet.add-addresses.title")),l._22(t,34).isLoading()),n(t,6,0,e.form),n(t,20,0,"quantity"),n(t,29,0,l._22(t,34)&&l._22(t,34).isLoading()),n(t,34,0,!e.form.valid)},function(n,t){n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.add-addresses.name-quantity"))),n(t,16,0,l._22(t,22).ngClassUntouched,l._22(t,22).ngClassTouched,l._22(t,22).ngClassPristine,l._22(t,22).ngClassDirty,l._22(t,22).ngClassValid,l._22(t,22).ngClassInvalid,l._22(t,22).ngClassPending),n(t,30,0,l._32(t,30,0,l._22(t,31).transform("wallet.add-addresses.cancel-button"))),n(t,35,0,l._32(t,35,0,l._22(t,36).transform("wallet.add-addresses.create-button")))})}var vw=l._5("app-number-of-addresses",Nf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-number-of-addresses",[],null,null,null,bw,yw)),l._8(1,245760,null,0,Nf,[da,ca,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),ww=l._7({encapsulation:0,styles:[["button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid #eff0f0}.wallet-container[_ngcontent-%COMP%]{padding-top:30px;margin:0 -10px}.wallet-container[_ngcontent-%COMP%]:first-child{padding-top:0}.wallet-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{color:#171a1d;border-bottom:1px solid #eff0f0;padding:0 10px;font-size:18px;line-height:32px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.wallet-container[_ngcontent-%COMP%] .address[_ngcontent-%COMP%]{font-size:13px;line-height:22px;color:#171a1d}.wallet-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%]{font-size:12px;line-height:18px;color:#171a1d}.wallet-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}"]],data:{}});function xw(n){return l._33(0,[(n()(),l._9(0,0,null,null,19,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.select(n.context.$implicit.address)&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,1,"div",[["class","address"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(7,0,null,0,11,"div",[["class","balance"]],null,null,null,null,null)),(n()(),l._31(8,null,["","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._9(10,0,null,null,2,"span",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(11,null,[""," | "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(13,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._9(15,0,null,null,2,"span",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(16,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,t.context.$implicit.address),n(t,8,0,l._32(t,8,0,l._22(t,9).transform(t.context.$implicit.coins.toString(),!0,"first"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform(t.context.$implicit.coins.toString(),!0,"last"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(t.context.$implicit.hours.toString(),!1,"first"))),n(t,16,0,l._32(t,16,0,l._22(t,17).transform(t.context.$implicit.hours.toString(),!1,"last")))})}function Mw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","wallet-container select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","title"]],[[8,"title",0]],null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,xw)),l._8(6,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,6,0,t.context.$implicit.addresses)},function(n,t){n(t,2,0,l._12(1,"",t.context.$implicit.label,"")),n(t,3,0,t.context.$implicit.label)})}function kw(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"app-modal",[],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Mw)),l._8(5,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("title.select-address"))),n(t,5,0,e.wallets)},null)}var Cw=l._5("app-select-address",Rm,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-select-address",[],null,null,null,kw,ww)),l._8(1,49152,null,0,Rm,[ca,Sc],null,null)],null,null)},{},{},[]),Sw=l._7({encapsulation:0,styles:[[".alert-box[_ngcontent-%COMP%]{margin-top:25px}.options-label[_ngcontent-%COMP%]{color:#171a1d;margin-top:25px;margin-bottom:10px;font-weight:700}.option-buttons-container[_ngcontent-%COMP%]{margin:0 -10px}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid #eff0f0}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:first-child{border-top:1px solid #eff0f0}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{font-size:13px;line-height:22px;color:#171a1d}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .-red[_ngcontent-%COMP%]{color:#ff004e}.-blinking[_ngcontent-%COMP%]{-webkit-animation:1s linear infinite alert-blinking;animation:1s linear infinite alert-blinking}"]],data:{}});function Ow(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Tw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,[[null,"linkClicked"]],function(n,t,e){var l=!0;return"linkClicked"===t&&(l=!1!==n.component.wipe()&&l),l},Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],linkText:[2,"linkText"]},{linkClicked:"linkClicked"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Error,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.refused"))+" "+l._32(t,1,1,l._22(t,3).transform("hardware-wallet.options.forgotten-pin1")),l._32(t,1,2,l._22(t,4).transform("hardware-wallet.options.forgotten-pin2")))},null)}function Lw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,[[null,"linkClicked"]],function(n,t,e){var l=!0;return"linkClicked"===t&&(l=!1!==n.component.wipe()&&l),l},Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],linkText:[2,"linkText"]},{linkClicked:"linkClicked"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Error,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.error-incorrect-pin"))+" "+l._32(t,1,1,l._22(t,3).transform("hardware-wallet.options.forgotten-pin1")),l._32(t,1,2,l._22(t,4).transform("hardware-wallet.options.forgotten-pin2")))},null)}function Pw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],upperBigText:[2,"upperBigText"],lowerLightText:[3,"lowerLightText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.HardwareWallet,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.options.unconfigured-detected")),l._32(t,1,2,l._22(t,3).transform("hardware-wallet.options.unconfigured-detected-title")),l._32(t,1,3,l._22(t,4).transform("hardware-wallet.options.firmware-version"))+" "+e.firmwareVersion)},null)}function Dw(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],lowerBigText:[2,"lowerBigText"],lowerLightText:[3,"lowerLightText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.HardwareWallet,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.options.configured-detected")),e.walletName,l._32(t,1,3,l._22(t,3).transform("hardware-wallet.options.firmware-version"))+" "+e.firmwareVersion)},null)}function Aw(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"br",[],null,null,null,null,null))],null,null)}function Ew(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(3,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Aw)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,7,0,t.context.index1?t.context.index+1+")":"",l._32(t,3,1,l._22(t,4).transform(t.context.$implicit)))})}function Yw(n){return l._33(0,[(n()(),l._9(0,0,null,null,15,"div",[["class","alert-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["error"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ew)),l._8(13,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,13,0,e.securityWarnings)},function(n,t){var e=t.component;n(t,9,0,l._32(t,9,0,l._22(t,10).transform(e.securityWarnings.length>1?"hardware-wallet.options.security-warnings-title":"hardware-wallet.options.security-warning-title")))})}function jw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.update()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label -blinking"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.update-firmware")))})}function Iw(n){return l._33(0,[(n()(),l._9(0,0,null,null,19,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.generateMnemonic()&&l),l},i_,r_)),l._8(3,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(4,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(6,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.restoreMnemonic()&&l),l},i_,r_)),l._8(12,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(13,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(15,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(16,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,"primary"),n(t,12,0,"primary")},function(n,t){n(t,2,0,l._22(t,3).disabled||null),n(t,7,0,l._32(t,7,0,l._22(t,8).transform("hardware-wallet.options.configure-automatically"))),n(t,11,0,l._22(t,12).disabled||null),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("hardware-wallet.options.restore-backup")))})}function Rw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.backup()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.create-backup")))})}function Hw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.confirmSeed()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.confirm-seed")))})}function Nw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removePin()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label -red"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.delete-pin")))})}function Fw(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Rw)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changePin()&&l),l},i_,r_)),l._8(9,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(10,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(12,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Nw)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.wipe()&&l),l},i_,r_)),l._8(21,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(22,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(24,0,null,0,2,"div",[["class","label -red"]],null,null,null,null,null)),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.needsBackup),n(t,6,0,!e.needsBackup),n(t,9,0,"primary"),n(t,18,0,!e.needsPin),n(t,21,0,"primary")},function(n,t){var e=t.component;n(t,8,0,l._22(t,9).disabled||null),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(e.needsPin?"hardware-wallet.options.create-pin":"hardware-wallet.options.change-pin"))),n(t,20,0,l._22(t,21).disabled||null),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("hardware-wallet.options.wipe")))})}function Bw(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Pw)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Dw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Yw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(11,0,null,null,2,"div",[["class","options-label"]],null,null,null,null,null)),(n()(),l._31(12,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,10,"div",[["class","option-buttons-container select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,jw)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Iw)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Fw)),l._8(24,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.newWalletConnected),n(t,6,0,!e.newWalletConnected),n(t,9,0,e.securityWarnings.length>0),n(t,18,0,e.outdatedFirmware),n(t,21,0,e.newWalletConnected),n(t,24,0,!e.newWalletConnected)},function(n,t){n(t,12,0,l._32(t,12,0,l._22(t,13).transform("hardware-wallet.options.options")))})}function Vw(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Ww(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function zw(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,21,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Ow)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Tw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Lw)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Bw)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Vw)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Ww)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("wallet.hardware-wallet"))),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState===e.states.Other&&!e.otherStateBecauseWrongPin),n(t,12,0,e.currentState===e.states.Other&&e.otherStateBecauseWrongPin),n(t,15,0,e.currentState===e.states.Finished),n(t,18,0,e.currentState===e.states.Finished),n(t,21,0,e.currentState!==e.states.Finished)},null)}var Uw=l._5("app-hw-options-dialog",ud,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-options-dialog",[],null,null,null,zw,Sw)),l._8(1,180224,null,0,ud,[da,ca,oc,fa,Sc,jc],null,null)],null,null)},{},{},[]),Gw=l._7({encapsulation:0,styles:[[""]],data:{}});function qw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setDeleteFromList(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(4,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(5,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,t.component.deleteFromList)},function(n,t){n(t,2,0,l._22(t,4).id,l._22(t,4).indeterminate,l._22(t,4).checked,l._22(t,4).disabled,"before"==l._22(t,4).labelPosition),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.wipe.confirm-delete")))})}function Jw(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,qw)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(9,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(12,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(13,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.requestWipe()&&l),l},w_,g_)),l._8(17,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.Warning,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.wipe.warning"))),n(t,7,0,e.showDeleteFromList)},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.general.cancel"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("hardware-wallet.general.continue")))})}function Qw(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function Kw(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Xw(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Zw(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Qw)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Kw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Xw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState!==e.states.Processing)},null)}function $w(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Jw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Zw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.wipe")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState!==e.states.Initial)},null)}var nx=l._5("app-hw-wipe-dialog",Xc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-wipe-dialog",[],null,null,null,$w,Gw)),l._8(1,180224,null,0,Xc,[da,ca,oc,Sc],null,null)],null,null)},{},{},[]),tx=l._7({encapsulation:0,styles:[[".upper-text[_ngcontent-%COMP%]{margin-top:10px;margin-bottom:10px}.warning[_ngcontent-%COMP%]{margin:-20px 0 20px;color:rgba(30,34,39,.5)}"]],data:{}});function ex(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Spinner,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.added.configuring")))},null)}function lx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function rx(n){return l._33(0,[(n()(),l._9(0,0,null,null,35,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],upperBigText:[1,"upperBigText"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","upper-text"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,16,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,11).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,11).onReset()&&r),r},null,null)),l._8(11,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(13,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,10,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,[[2,0],["input",1]],null,7,"input",[["formControlName","label"],["id","label"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,18)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,18).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,18)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,18)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.saveNameAndCloseModal()&&r),r},null,null)),l._8(18,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(19,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(22,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(24,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,2,"div",[["class","warning"]],null,null,null,null,null)),(n()(),l._31(29,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n \n "])),(n()(),l._9(32,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(33,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.Success,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.added.done"))),n(t,11,0,e.form),n(t,19,0,e.maxHwWalletLabelLength),n(t,22,0,"label")},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("hardware-wallet.added.added1"))),n(t,10,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending),n(t,17,0,l._22(t,19).maxlength?l._22(t,19).maxlength:null,l._22(t,24).ngClassUntouched,l._22(t,24).ngClassTouched,l._22(t,24).ngClassPristine,l._22(t,24).ngClassDirty,l._22(t,24).ngClassValid,l._22(t,24).ngClassInvalid,l._22(t,24).ngClassPending),n(t,29,0,l._32(t,29,0,l._22(t,30).transform("hardware-wallet.added.characters-warning"))),n(t,33,0,l._32(t,33,0,l._22(t,34).transform("hardware-wallet.added.added2")))})}function ix(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0,r=n.component;return"action"===t&&(l=!1!==(r.currentState===r.states.Finished?r.saveNameAndCloseModal():r.closeModal())&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Finished&&!e.form.valid)},function(n,t){var e=t.component;n(t,4,0,l._32(t,4,0,l._22(t,5).transform(e.currentState===e.states.Finished?"hardware-wallet.added.ok":"hardware-wallet.general.close")))})}function ox(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),l._29(671088640,2,{input:0}),(n()(),l._9(2,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(3,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,ex)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,lx)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,rx)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,ix)),l._8(16,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.dialogRef,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.added.title")),e.currentState===e.states.Initial||e.currentState===e.states.Finished),n(t,7,0,e.currentState===e.states.Initial),n(t,10,0,e.currentState===e.states.ShowingResult),n(t,13,0,e.currentState===e.states.Finished),n(t,16,0,e.currentState===e.states.Finished||e.currentState===e.states.ShowingResult)},null)}var sx=l._5("app-hw-added-dialog",td,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-added-dialog",[],null,null,null,ox,tx)),l._8(1,180224,null,0,td,[da,ca,Sc,oc,ns,fa,jc],null,null)],null,null)},{},{},[]),ax=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%]{margin-bottom:0;margin-top:15px}"]],data:{}});function ux(n){return l._33(0,[(n()(),l._9(0,0,null,null,50,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,30,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,7).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,7).onReset()&&r),r},null,null)),l._8(7,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(9,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,21,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,18,"select",[["formControlName","words"],["id","words"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,16).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,16).onTouched()&&r),r},null,null)),l._8(16,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(18,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(20,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,4,"option",[],null,null,null,null,null)),l._8(23,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(24,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,4,"option",[],null,null,null,null,null)),l._8(29,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(30,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(31,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(38,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(40,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(41,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(42,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.startOperation()&&l),l},w_,g_)),l._8(46,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(47,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.None,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.generate-seed.text"))),n(t,7,0,e.form),n(t,18,0,"words"),n(t,23,0,12),n(t,24,0,12),n(t,29,0,24),n(t,30,0,24)},function(n,t){n(t,6,0,l._22(t,9).ngClassUntouched,l._22(t,9).ngClassTouched,l._22(t,9).ngClassPristine,l._22(t,9).ngClassDirty,l._22(t,9).ngClassValid,l._22(t,9).ngClassInvalid,l._22(t,9).ngClassPending),n(t,15,0,l._22(t,20).ngClassUntouched,l._22(t,20).ngClassTouched,l._22(t,20).ngClassPristine,l._22(t,20).ngClassDirty,l._22(t,20).ngClassValid,l._22(t,20).ngClassInvalid,l._22(t,20).ngClassPending),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("wallet.new.12-words"))),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("wallet.new.24-words"))),n(t,42,0,l._32(t,42,0,l._22(t,43).transform("hardware-wallet.general.cancel"))),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("hardware-wallet.general.continue")))})}function cx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Spinner,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.generate-seed.configuring")))},null)}function dx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function hx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function px(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,ux)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,cx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,dx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,hx)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.configure-automatically")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.Processing),n(t,12,0,e.currentState===e.states.ShowingResult),n(t,15,0,e.currentState!==e.states.Initial&&e.currentState!==e.states.Processing)},null)}var fx=l._5("app-hw-generate-seed-dialog",ed,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-generate-seed-dialog",[],null,null,null,px,ax)),l._8(1,180224,null,0,ed,[da,ca,oc,ns],null,null)],null,null)},{},{},[]),_x=l._7({encapsulation:0,styles:[[""]],data:{}});function mx(n){return l._33(0,[(n()(),l._9(0,0,null,null,18,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(9,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(10,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.requestBackup()&&l),l},w_,g_)),l._8(14,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(15,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.msgIcons.Warning,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.create-backup.warning")))},function(n,t){n(t,10,0,l._32(t,10,0,l._22(t,11).transform("hardware-wallet.general.cancel"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("hardware-wallet.general.continue")))})}function gx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.create-backup.instructions")))},null)}function yx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function bx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function vx(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gx)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,yx)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,bx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState!==e.states.Processing)},null)}function wx(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,mx)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,vx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.create-backup")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState!==e.states.Initial)},null)}var xx=l._5("app-hw-backup-dialog",ld,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-backup-dialog",[],null,null,null,wx,_x)),l._8(1,180224,null,0,ld,[da,ca,oc],null,null)],null,null)},{},{},[]),Mx=l._7({encapsulation:0,styles:[[".red-title[_ngcontent-%COMP%]{font-family:Skycoin;line-height:30px;font-size:14px;text-align:center;letter-spacing:.0769231em;color:#ff004e}.link[_ngcontent-%COMP%]{cursor:pointer;color:#0072ff}"]],data:{}});function kx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(r.data.linkFunction(),l=!1!==r.closeModal(!1)&&l),l},null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.data.linkText)))})}function Cx(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"mat-checkbox",[["class","-check e2e-confirm-checkbox mat-checkbox"],["id","terms"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAccept(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(4,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(5,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,"terms",t.component.accepted)},function(n,t){var e=t.component;n(t,2,0,l._22(t,4).id,l._22(t,4).indeterminate,l._22(t,4).checked,l._22(t,4).disabled,"before"==l._22(t,4).labelPosition),n(t,5,0,l._32(t,5,0,l._22(t,6).transform(e.data.checkboxText)))})}function Sx(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal(!1)&&l),l},w_,g_)),l._8(1,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,l._22(t,3).transform(e.data.cancelButtonText)))})}function Ox(n){return l._33(0,[(n()(),l._9(0,0,null,null,24,"app-modal",[["class","modal"]],[[2,"red-title",null]],null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,5,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,kx)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Cx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._9(14,0,null,0,9,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Sx)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal(!0)&&l),l},w_,g_)),l._8(20,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(21,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform(e.data.headerText)),e.disableDismiss),n(t,8,0,e.data.linkText&&e.data.linkFunction),n(t,12,0,e.data.checkboxText),n(t,17,0,e.data.cancelButtonText),n(t,20,0,e.data.checkboxText&&!e.accepted)},function(n,t){var e=t.component;n(t,0,0,e.data.redTitle),n(t,5,0,l._32(t,5,0,l._22(t,6).transform(e.data.text))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform(e.data.confirmButtonText)))})}var Tx=l._5("app-confirmation",Nc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-confirmation",[],null,null,null,Ox,Mx)),l._8(1,49152,null,0,Nc,[ca,da],null,null)],null,null)},{},{},[]),Lx=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{font-size:25px;letter-spacing:15px;text-align:center}.form-field[_ngcontent-%COMP%] .info[_ngcontent-%COMP%]{text-align:center}.form-field[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.num-pad-row[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;height:50px;border:1px solid #eff0f0;margin:2px}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#171a1d}"]],data:{}});function Px(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.enter-pin.instructions-tx")))})}function Dx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.enter-pin.instructions-change")))})}function Ax(n){return l._33(0,[l._29(402653184,1,{closeButton:0}),(n()(),l._9(1,0,null,null,116,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,28,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,22,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,12,"div",[["class","info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Px)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Dx)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(19,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(21,0,null,null,2,"span",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.openHelp()&&l),l},null,null)),(n()(),l._31(22,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,5,"input",[["formControlName","pin"],["id","pin"],["readonly",""],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,27)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,27).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,27)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,27)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(27,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(29,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(31,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(35,0,null,0,73,"div",[["class","select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,19,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("7")&&l),l},i_,r_)),l._8(40,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(41,16384,null,0,Hs,[],null,null),(n()(),l._9(42,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(43,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("8")&&l),l},i_,r_)),l._8(46,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(47,16384,null,0,Hs,[],null,null),(n()(),l._9(48,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(49,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(51,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("9")&&l),l},i_,r_)),l._8(52,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(53,16384,null,0,Hs,[],null,null),(n()(),l._9(54,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(55,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,19,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(60,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("4")&&l),l},i_,r_)),l._8(61,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(62,16384,null,0,Hs,[],null,null),(n()(),l._9(63,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(64,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(66,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("5")&&l),l},i_,r_)),l._8(67,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(68,16384,null,0,Hs,[],null,null),(n()(),l._9(69,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(70,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(72,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("6")&&l),l},i_,r_)),l._8(73,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(74,16384,null,0,Hs,[],null,null),(n()(),l._9(75,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(76,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(79,0,null,null,19,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(81,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("1")&&l),l},i_,r_)),l._8(82,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(83,16384,null,0,Hs,[],null,null),(n()(),l._9(84,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(85,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(87,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("2")&&l),l},i_,r_)),l._8(88,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(89,16384,null,0,Hs,[],null,null),(n()(),l._9(90,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(91,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(93,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("3")&&l),l},i_,r_)),l._8(94,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(95,16384,null,0,Hs,[],null,null),(n()(),l._9(96,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(97,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(100,0,null,null,7,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(102,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removeNumber()&&l),l},i_,r_)),l._8(103,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(104,16384,null,0,Hs,[],null,null),(n()(),l._9(105,0,null,0,1,"span",[["class","material-icons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["backspace"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(110,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(112,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.sendPin()&&l),l},w_,g_)),l._8(113,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(114,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.title))),n(t,6,0,e.form),n(t,15,0,e.data.signingTx),n(t,18,0,e.data.changingPin&&e.data.changePinState===e.changePinStates.RequestingNewPin),n(t,29,0,"pin"),n(t,40,0,"primary"),n(t,46,0,"primary"),n(t,52,0,"primary"),n(t,61,0,"primary"),n(t,67,0,"primary"),n(t,73,0,"primary"),n(t,82,0,"primary"),n(t,88,0,"primary"),n(t,94,0,"primary"),n(t,103,0,"primary"),n(t,113,0,!e.form.valid)},function(n,t){var e=t.component;n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("hardware-wallet.enter-pin.instructions"))),n(t,22,0,l._32(t,22,0,l._22(t,23).transform("hardware-wallet.enter-pin.help"))),n(t,26,0,l._22(t,31).ngClassUntouched,l._22(t,31).ngClassTouched,l._22(t,31).ngClassPristine,l._22(t,31).ngClassDirty,l._22(t,31).ngClassValid,l._22(t,31).ngClassInvalid,l._22(t,31).ngClassPending),n(t,39,0,l._22(t,40).disabled||null),n(t,43,0,e.buttonsContent),n(t,45,0,l._22(t,46).disabled||null),n(t,49,0,e.buttonsContent),n(t,51,0,l._22(t,52).disabled||null),n(t,55,0,e.buttonsContent),n(t,60,0,l._22(t,61).disabled||null),n(t,64,0,e.buttonsContent),n(t,66,0,l._22(t,67).disabled||null),n(t,70,0,e.buttonsContent),n(t,72,0,l._22(t,73).disabled||null),n(t,76,0,e.buttonsContent),n(t,81,0,l._22(t,82).disabled||null),n(t,85,0,e.buttonsContent),n(t,87,0,l._22(t,88).disabled||null),n(t,91,0,e.buttonsContent),n(t,93,0,l._22(t,94).disabled||null),n(t,97,0,e.buttonsContent),n(t,102,0,l._22(t,103).disabled||null),n(t,114,0,l._32(t,114,0,l._22(t,115).transform("hardware-wallet.general.continue")))})}var Ex=l._5("app-hw-pin-dialog",bf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-pin-dialog",[],null,[["window","keyup"]],function(n,t,e){var r=!0;return"window:keyup"===t&&(r=!1!==l._22(n,1).keyEvent(e)&&r),r},Ax,Lx)),l._8(1,245760,null,0,bf,[da,ca,ns,fa,oc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),Yx=l._7({encapsulation:0,styles:[[""]],data:{}});function jx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function Ix(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Rx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Hx(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,12,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,jx)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Ix)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Rx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.changingExistingPin?"hardware-wallet.options.change-pin":"hardware-wallet.options.create-pin")),e.currentState===e.states.Initial),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.ShowingResult),n(t,12,0,e.currentState!==e.states.Initial)},null)}var Nx=l._5("app-hw-change-pin-dialog",rd,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-change-pin-dialog",[],null,null,null,Hx,Yx)),l._8(1,180224,null,0,rd,[da,ca,oc],null,null)],null,null)},{},{},[]),Fx=l._7({encapsulation:0,styles:[[""]],data:{}});function Bx(n){return l._33(0,[(n()(),l._9(0,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"p",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(8,0,null,0,2,"p",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(12,0,null,0,2,"p",[],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,1,0,t.component.dialogRef,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.pin-help.title")))},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.pin-help.part1"))),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("hardware-wallet.pin-help.part2"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.pin-help.part3")))})}var Vx=l._5("app-hw-added-dialog",yf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-added-dialog",[],null,null,null,Bx,Fx)),l._8(1,49152,null,0,yf,[ca],null,null)],null,null)},{},{},[]),Wx=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%]{margin-bottom:0;margin-top:15px}.warning[_ngcontent-%COMP%]{margin-top:15px;color:#ff004e;text-align:center}"]],data:{}});function zx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[["class","warning"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.restore-seed.warning")))})}function Ux(n){return l._33(0,[(n()(),l._9(0,0,null,null,53,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,30,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,7).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,7).onReset()&&r),r},null,null)),l._8(7,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(9,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,21,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,18,"select",[["formControlName","words"],["id","words"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,16).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,16).onTouched()&&r),r},null,null)),l._8(16,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(18,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(20,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,4,"option",[],null,null,null,null,null)),l._8(23,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(24,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,4,"option",[],null,null,null,null,null)),l._8(29,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(30,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(31,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,zx)),l._8(39,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(41,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(44,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(45,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.startOperation()&&l),l},w_,g_)),l._8(49,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(50,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.None,l._32(t,3,1,l._22(t,4).transform(e.justCheckingSeed?"hardware-wallet.restore-seed.check-text":"hardware-wallet.restore-seed.text"))),n(t,7,0,e.form),n(t,18,0,"words"),n(t,23,0,12),n(t,24,0,12),n(t,29,0,24),n(t,30,0,24),n(t,39,0,!e.justCheckingSeed)},function(n,t){n(t,6,0,l._22(t,9).ngClassUntouched,l._22(t,9).ngClassTouched,l._22(t,9).ngClassPristine,l._22(t,9).ngClassDirty,l._22(t,9).ngClassValid,l._22(t,9).ngClassInvalid,l._22(t,9).ngClassPending),n(t,15,0,l._22(t,20).ngClassUntouched,l._22(t,20).ngClassTouched,l._22(t,20).ngClassPristine,l._22(t,20).ngClassDirty,l._22(t,20).ngClassValid,l._22(t,20).ngClassInvalid,l._22(t,20).ngClassPending),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("wallet.new.12-words"))),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("wallet.new.24-words"))),n(t,45,0,l._32(t,45,0,l._22(t,46).transform("hardware-wallet.general.cancel"))),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("hardware-wallet.general.continue")))})}function Gx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform(e.justCheckingSeed?"hardware-wallet.general.follow":"hardware-wallet.general.confirm-and-more")))},null)}function qx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Jx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Qx(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Ux)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Gx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,qx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Jx)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.justCheckingSeed?"hardware-wallet.options.confirm-seed":"hardware-wallet.options.restore-backup")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.Processing),n(t,12,0,e.currentState===e.states.ShowingResult),n(t,15,0,e.currentState!==e.states.Initial&&e.currentState!==e.states.Processing)},null)}var Kx=l._5("app-hw-restore-seed-dialog",id,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-restore-seed-dialog",[],null,null,null,Qx,Wx)),l._8(1,180224,null,0,id,[da,ca,oc,ns],null,null)],null,null)},{},{},[]),Xx=l._7({encapsulation:0,styles:[[""]],data:{}});function Zx(n){return l._33(0,[l._29(402653184,1,{closeButton:0}),(n()(),l._9(1,0,null,null,8,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,3,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(6,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],outputsList:[2,"outputsList"],lowerText:[3,"lowerText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.create-tx.title")),!0),n(t,6,0,e.msgIcons.Confirm,l._32(t,6,1,l._22(t,7).transform("hardware-wallet.create-tx.upper-text")),e.data,l._32(t,6,3,l._22(t,8).transform("hardware-wallet.create-tx.lower-text")))},null)}var $x=l._5("app-hw-confirm-tx-dialog",vf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-confirm-tx-dialog",[],null,null,null,Zx,Xx)),l._8(1,180224,null,0,vf,[da,ca,oc],null,null)],null,null)},{},{},[]),nM=l._7({encapsulation:0,styles:[[""]],data:{}});function tM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],lowerBigText:[2,"lowerBigText"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.confirm-address.instructions")),e.data.address.address)},null)}function eM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function lM(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function rM(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,12,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,tM)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,eM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,lM)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.confirm-address.title")),e.currentState===e.states.Initial),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.ShowingResult),n(t,12,0,e.currentState!==e.states.Initial)},null)}var iM=l._5("app-hw-confirm-address-dialog",Ff,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-confirm-address-dialog",[],null,null,null,rM,nM)),l._8(1,180224,null,0,Ff,[da,ca,oc,Sc],null,null)],null,null)},{},{},[]),oM=l._7({encapsulation:0,styles:[[".options-container[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%]{width:118px;margin:20px;font-size:12px;line-height:unset;padding:0;color:unset;min-width:0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:64px;height:64px;margin:10px 0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);padding:4px 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}"]],data:{}});function sM(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"button",[["class","button mat-button"],["color","accent"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.closePopup(n.context.$implicit)&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,0,"img",[],[[8,"src",4]],null,null,null,null)),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(6,0,null,0,1,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"accent")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,4,0,"assets/img/lang/"+t.context.$implicit.iconName),n(t,7,0,t.context.$implicit.name)})}function aM(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"app-modal",[["class","e2e-language-modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,4,"div",[["class","options-container subtle-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,sM)),l._8(7,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("title.language")),e.disableDismiss),n(t,7,0,e.languages)},null)}var uM=l._5("app-select-language",Vc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-select-language",[],null,null,null,aM,oM)),l._8(1,114688,null,0,Vc,[ca,Bc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),cM=l._7({encapsulation:0,styles:[["button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid #eff0f0;cursor:pointer}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%]{font-size:13px;line-height:22px;color:#171a1d}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] div[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;position:relative;top:3px;margin:0 5px}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] .grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}button[_ngcontent-%COMP%] .action[_ngcontent-%COMP%]{color:#0072ff}"]],data:{}});function dM(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,23,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.select(n.context.$implicit)&&l),l},i_,r_)),l._8(3,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(4,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(6,0,null,0,18,"div",[["class","info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,6,"div",[],null,null,null,null,null)),(n()(),l._31(9,null,[""," "," "])),(n()(),l._9(10,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(11,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["play_arrow"])),(n()(),l._31(13,null,[" \u2248"," ",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"div",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(17,null,["",": ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,3,"div",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(21,null,["",": ",""])),l._25(131072,De.i,[De.j,l.h]),l._27(23,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,"primary"),n(t,11,0)},function(n,t){var e=t.component;n(t,2,0,l._22(t,3).disabled||null),n(t,9,0,t.context.$implicit.fromAmount,e.getFromCoin(t.context.$implicit.pair)),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(t.context.$implicit.toAmount,!0,"first")),e.getToCoin(t.context.$implicit.pair)),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("exchange.history-window.address")),t.context.$implicit.address),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("exchange.history-window.date")),l._32(t,21,1,n(t,23,0,l._22(t.parent,0),t.context.$implicit.timestamp)))})}function hM(n){return l._33(0,[l._25(0,ag,[]),(n()(),l._9(1,0,null,null,6,"app-modal",[],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,dM)),l._8(6,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("title.order-history"))),n(t,6,0,e.orders)},null)}var pM=l._5("app-exchange-history",ff,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange-history",[],null,null,null,hM,cM)),l._8(1,114688,null,0,ff,[ca,qc,pf],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),fM=l._7({encapsulation:0,styles:[[""]],data:{}});function _M(n){return l._33(0,[(n()(),l._9(0,0,null,null,27,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setConfirmed(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(10,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(11,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(15,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(18,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(19,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.requestRemoval()&&l),l},w_,g_)),l._8(23,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(24,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.Warning,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.remove-pin.warning"))),n(t,10,0,e.confirmed),n(t,23,0,!e.confirmed)},function(n,t){n(t,8,0,l._22(t,10).id,l._22(t,10).indeterminate,l._22(t,10).checked,l._22(t,10).disabled,"before"==l._22(t,10).labelPosition),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("hardware-wallet.remove-pin.check"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("hardware-wallet.general.cancel"))),n(t,24,0,l._32(t,24,0,l._22(t,25).transform("hardware-wallet.general.continue")))})}function mM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function gM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function yM(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function bM(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,mM)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gM)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,yM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState!==e.states.Processing)},null)}function vM(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,_M)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,bM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.delete-pin")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState!==e.states.Initial)},null)}var wM=l._5("app-hw-remove-pin-dialog",od,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-remove-pin-dialog",[],null,null,null,vM,fM)),l._8(1,180224,null,0,od,[da,ca,oc],null,null)],null,null)},{},{},[]),xM=l._7({encapsulation:0,styles:[[""]],data:{}});function MM(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setConfirmed(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(4,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(5,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,t.component.confirmed)},function(n,t){n(t,2,0,l._22(t,4).id,l._22(t,4).indeterminate,l._22(t,4).checked,l._22(t,4).disabled,"before"==l._22(t,4).labelPosition),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.update-firmware.check")))})}function kM(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,MM)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(9,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(12,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(13,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.startUpdating()&&l),l},w_,g_)),l._8(17,49152,[[2,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.deviceHasFirmware?e.msgIcons.Warning:e.msgIcons.HardwareWallet,l._32(t,3,1,l._22(t,4).transform(e.text))),n(t,7,0,e.deviceHasFirmware),n(t,17,0,e.deviceHasFirmware&&!e.confirmed)},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.general.cancel"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("hardware-wallet.general.continue")))})}function CM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Spinner,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.update-firmware.title-connecting")))},null)}function SM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.update-firmware.follow")))},null)}function OM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function TM(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function LM(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,CM)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,SM)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,OM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,TM)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Connecting),n(t,6,0,e.currentState===e.states.Processing),n(t,9,0,e.currentState===e.states.ShowingResult),n(t,12,0,e.currentState!==e.states.Processing)},null)}function PM(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),l._29(671088640,2,{button:0}),(n()(),l._9(2,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(3,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,kM)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,LM)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.dialogRef,l._32(t,3,1,l._22(t,4).transform(e.title)),e.currentState===e.states.Processing),n(t,7,0,e.currentState===e.states.Initial),n(t,10,0,e.currentState!==e.states.Initial)},null)}var DM=l._5("app-hw-update-firmware-dialog",sd,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-update-firmware-dialog",[],null,null,null,PM,xM)),l._8(1,180224,null,0,sd,[ca,oc,jc,De.j],null,null)],null,null)},{},{},[]),AM=l._7({encapsulation:0,styles:[[""]],data:{}});function EM(n){return l._33(0,[l._29(402653184,1,{closeButton:0}),(n()(),l._9(1,0,null,null,20,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(6,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._9(9,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(12,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(13,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.update()&&l),l},w_,g_)),l._8(17,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.update-firmware-warning.title"))),n(t,6,0,e.msgIcons.Warning,l._32(t,6,1,l._22(t,7).transform("hardware-wallet.update-firmware-warning.text")))},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.update-firmware-warning.cancel"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("hardware-wallet.update-firmware-warning.update")))})}var YM=l._5("app-hw-update-alert-dialog",ad,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-update-alert-dialog",[],null,null,null,EM,AM)),l._8(1,180224,null,0,ad,[ca,oc],null,null)],null,null)},{},{},[]),jM=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}mat-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom;padding-left:5px}"]],data:{}});function IM(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,44,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,26,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,8,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(13,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(15,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,17).show()&&r),"keydown"===t&&(r=!1!==l._22(n,17)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,17).hide(1500)&&r),r},Hf,Rf)),l._8(16,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(17,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,7,"input",[["formControlName","note"],["id","note"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,23)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,23).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,23)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,23)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.changeNote()&&r),r},null,null)),l._8(23,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(24,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(27,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(29,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(33,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(35,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(36,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(37,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(40,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.changeNote()&&l),l},w_,g_)),l._8(41,49152,[[1,4],["button",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(42,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("edit-note.title")),l._22(t,41)&&l._22(t,41).isLoading()),n(t,6,0,e.form),n(t,16,0),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("send.personal-note-help"))),n(t,24,0,e.maxNoteChars),n(t,27,0,"note")},function(n,t){n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("send.personal-note-label"))),n(t,22,0,l._22(t,24).maxlength?l._22(t,24).maxlength:null,l._22(t,29).ngClassUntouched,l._22(t,29).ngClassTouched,l._22(t,29).ngClassPristine,l._22(t,29).ngClassDirty,l._22(t,29).ngClassValid,l._22(t,29).ngClassInvalid,l._22(t,29).ngClassPending),n(t,37,0,l._32(t,37,0,l._22(t,38).transform("edit-note.cancel-button"))),n(t,42,0,l._32(t,42,0,l._22(t,43).transform("edit-note.change-button")))})}var RM=l._5("app-change-note",am,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-change-note",[],null,null,null,IM,jM)),l._8(1,245760,null,0,am,[ca,da,ns,jc,ic],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),HM=l._7({encapsulation:2,styles:[".mat-autocomplete-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;visibility:hidden;max-width:none;max-height:256px;position:relative}.mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-autocomplete-panel.mat-autocomplete-visible{visibility:visible}.mat-autocomplete-panel.mat-autocomplete-hidden{visibility:hidden}"],data:{}});function NM(n){return l._33(0,[(n()(),l._9(0,0,[[2,0],["panel",1]],null,2,"div",[["class","mat-autocomplete-panel"],["role","listbox"]],[[8,"id",0]],null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._21(null,0)],function(n,t){n(t,1,0,"mat-autocomplete-panel",t.component._classList)},function(n,t){n(t,0,0,t.component.id)})}function FM(n){return l._33(2,[l._29(402653184,1,{template:0}),l._29(671088640,2,{panel:0}),(n()(),l._4(0,[[1,2]],null,0,null,NM))],null,null)}var BM=l._7({encapsulation:0,styles:[[".form-container[_ngcontent-%COMP%]{margin-top:20px}.option[_ngcontent-%COMP%]{font-size:13px;height:42px}"]],data:{}});function VM(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],upperBigText:[2,"upperBigText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.None,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.seed-word.info2")),l._32(t,1,2,l._22(t,3).transform("hardware-wallet.seed-word.info1")))},null)}function WM(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],upperBigText:[2,"upperBigText"]},null),l._25(131072,De.i,[De.j,l.h]),l._26(3,{number:0}),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.None,l._32(t,1,1,l._22(t,2).transform(e.data.restoringSoftwareWallet?"wallet.new.seed.recover-seed-help":"wallet.new.seed.new-seed-help")),l._32(t,1,2,l._22(t,4).transform("wallet.new.seed.enter-word",n(t,3,0,e.data.wordNumber))))},null)}function zM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"label",[["for","word"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.seed-word.word")))})}function UM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-option",[["class","option mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"click"===t&&(r=!1!==i.sendWord()&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["",""]))],function(n,t){n(t,1,0,t.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit)})}function GM(n){return l._33(0,[(n()(),l._9(0,0,null,null,49,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,VM)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,WM)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(10,0,null,0,30,"div",[["class","form-container"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,11).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,11).onReset()&&r),r},null,null)),l._8(11,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(13,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zM)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,16777216,null,null,8,"input",[["aria-autocomplete","list"],["autocomplete","off"],["class","mat-input-element mat-form-field-autofill-control"],["formControlName","word"],["id","word"],["matInput",""],["role","combobox"]],[[1,"aria-activedescendant",0],[1,"aria-expanded",0],[1,"aria-owns",0],[2,"mat-input-server",null],[1,"id",0],[8,"placeholder",0],[8,"disabled",0],[8,"required",0],[8,"readOnly",0],[1,"aria-describedby",0],[1,"aria-invalid",0],[1,"aria-required",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"focusin"],[null,"blur"],[null,"input"],[null,"keydown"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"focusin"===t&&(r=!1!==l._22(n,22)._handleFocus()&&r),"blur"===t&&(r=!1!==l._22(n,22)._onTouched()&&r),"input"===t&&(r=!1!==l._22(n,22)._handleInput(e)&&r),"keydown"===t&&(r=!1!==l._22(n,22)._handleKeydown(e)&&r),"input"===t&&(r=!1!==l._22(n,23)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,23).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,23)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,23)._compositionEnd(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,27)._focusChanged(!1)&&r),"focus"===t&&(r=!1!==l._22(n,27)._focusChanged(!0)&&r),"input"===t&&(r=!1!==l._22(n,27)._onInput()&&r),"keydown.enter"===t&&(r=!1!==i.sendWord()&&r),r},null,null)),l._28(6144,null,Os,null,[pu]),l._8(22,147456,null,0,Is,[l.l,Pi,l.R,l.B,l.h,Ys,[2,Dl],[8,null],[2,sn]],{autocomplete:[0,"autocomplete"]},null),l._8(23,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n,t){return[n,t]},[Is,ro]),l._8(25,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(27,933888,null,0,pu,[l.l,Hl,[2,uo],[2,Wo],[2,qo],Kl,[8,null]],{id:[0,"id"]},null),l._8(28,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,8,"mat-autocomplete",[["class","mat-autocomplete"]],null,null,null,FM,HM)),l._8(31,1097728,[["auto",4]],2,Es,[l.h,l.l],null,null),l._29(603979776,1,{options:1}),l._29(603979776,2,{optionGroups:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,2,null,UM)),l._8(36,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),l._25(131072,nn,[l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(42,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.sendWord()&&l),l},w_,g_)),l._8(45,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(46,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform(e.data.isForHwWallet?"hardware-wallet.seed-word.title":"wallet.new.seed-label"))),n(t,5,0,e.data.isForHwWallet),n(t,8,0,!e.data.isForHwWallet),n(t,11,0,e.form),n(t,18,0,e.data.isForHwWallet),n(t,22,0,l._22(t,31)),n(t,25,0,"word"),n(t,27,0,"word"),n(t,36,0,l._32(t,36,0,l._22(t,37).transform(e.filteredOptions))),n(t,45,0,!e.form.valid)},function(n,t){n(t,10,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending),n(t,20,1,[null==l._22(t,22).activeOption?null:l._22(t,22).activeOption.id,l._22(t,22).panelOpen.toString(),null==l._22(t,22).autocomplete?null:l._22(t,22).autocomplete.id,l._22(t,27)._isServer,l._22(t,27).id,l._22(t,27).placeholder,l._22(t,27).disabled,l._22(t,27).required,l._22(t,27).readonly,l._22(t,27)._ariaDescribedby||null,l._22(t,27).errorState,l._22(t,27).required.toString(),l._22(t,28).ngClassUntouched,l._22(t,28).ngClassTouched,l._22(t,28).ngClassPristine,l._22(t,28).ngClassDirty,l._22(t,28).ngClassValid,l._22(t,28).ngClassInvalid,l._22(t,28).ngClassPending]),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("hardware-wallet.general.continue")))})}var qM=l._5("app-seed-word-dialog",Hc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-seed-word-dialog",[],null,null,null,GM,BM)),l._8(1,245760,null,0,Hc,[da,ca,ns,Ac,jc,De.j,oc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),JM=l._7({encapsulation:0,styles:[[".form-container[_ngcontent-%COMP%]{margin-top:20px}"]],data:{}});function QM(n){return l._33(0,[(n()(),l._9(0,0,null,null,31,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(8,0,null,0,14,"div",[["class","form-container"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,9).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,9).onReset()&&r),r},null,null)),l._8(9,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(11,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,8,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,5,"textarea",[["formControlName","data"],["id","data"],["rows","5"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,16)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,16).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,16)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,16)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(16,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(18,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(20,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(24,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.processData()&&l),l},w_,g_)),l._8(27,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(28,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("send.bulk-send.title"))),n(t,9,0,e.form),n(t,18,0,"data")},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("send.bulk-send.indications"))),n(t,8,0,l._22(t,11).ngClassUntouched,l._22(t,11).ngClassTouched,l._22(t,11).ngClassPristine,l._22(t,11).ngClassDirty,l._22(t,11).ngClassValid,l._22(t,11).ngClassInvalid,l._22(t,11).ngClassPending),n(t,15,0,l._22(t,20).ngClassUntouched,l._22(t,20).ngClassTouched,l._22(t,20).ngClassPristine,l._22(t,20).ngClassDirty,l._22(t,20).ngClassValid,l._22(t,20).ngClassInvalid,l._22(t,20).ngClassPending),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("send.bulk-send.process")))})}var KM=l._5("app-multiple-destinations-dialog",Hm,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-multiple-destinations-dialog",[],null,null,null,QM,JM)),l._8(1,245760,null,0,Hm,[ca,da,ns,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),XM=l._7({encapsulation:0,styles:[[".main-container[_ngcontent-%COMP%]{position:fixed;bottom:0;width:100%;z-index:1000000;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.internal-container[_ngcontent-%COMP%]{color:#fff;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;min-width:40%;max-width:90%;display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px;border-top-left-radius:5px;border-top-right-radius:5px}.red-background[_ngcontent-%COMP%]{background-color:rgba(255,0,0,.7)}.green-background[_ngcontent-%COMP%]{background-color:rgba(31,177,31,.7)}.yellow-background[_ngcontent-%COMP%]{background-color:rgba(255,94,0,.7)}.icon-container[_ngcontent-%COMP%]{margin-right:10px}.text-container[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-right:10px}.text-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-size:15px;margin-top:-1px}.text-container[_ngcontent-%COMP%] .text[_ngcontent-%COMP%]{font-size:13px;margin-top:2px}.close-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{cursor:pointer}"]],data:{}});function ZM(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[["class","icon-container"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(2,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(3,0,["",""]))],function(n,t){n(t,2,0)},function(n,t){n(t,3,0,t.component.config.icon)})}function $M(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.config.title)))})}function nk(n){return l._33(0,[(n()(),l._9(0,0,null,null,22,"div",[["class","main-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,19,"div",[],[[8,"className",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ZM)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,8,"div",[["class","text-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,$M)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[["class","text"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,3,"div",[["class","close-container"]],null,null,null,null,null)),(n()(),l._9(18,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.hide()&&l),l},Hf,Rf)),l._8(19,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["close"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,e.config.icon),n(t,10,0,e.config.title),n(t,19,0)},function(n,t){var e=t.component;n(t,2,0,"internal-container "+(e.config.color?e.config.color:"red-background")),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(e.config.text)))})}function tk(n){return l._33(0,[(n()(),l._4(16777216,null,null,1,null,nk)),l._8(1,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,1,0,t.component.visible)},null)}var ek=l._7({encapsulation:0,styles:[[".size-alert[_ngcontent-%COMP%]{background-color:rgba(0,0,0,.85);position:fixed;top:0;left:0;width:100%;height:100%;z-index:10000;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center;color:#fff}.size-alert[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{margin:0 40px;max-width:400px}mat-card[_ngcontent-%COMP%]{max-width:1000px;margin-top:80px;margin-right:auto;margin-left:auto}.logo[_ngcontent-%COMP%]{max-height:100%}.fill-remaining-space[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.sky-container[_ngcontent-%COMP%]{max-width:1000px;margin-top:20px;margin-right:auto;margin-left:auto}mat-toolbar[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{margin:0 20px}.search-field[_ngcontent-%COMP%]{border-radius:8px;border:none;background-color:#fff;padding:8px}.syncing[_ngcontent-%COMP%]{font-size:14px}.main-menu[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{margin-right:20px}#top-menu[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fbfbfb}#top-menu[_ngcontent-%COMP%] span#version[_ngcontent-%COMP%]{padding-top:12px}"]],data:{}});function lk(n){return l._33(0,[l._29(402653184,1,{msgBar:0}),(n()(),l._9(1,0,null,null,10,"div",[["class","size-alert d-md-none"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,7,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,0,"img",[["src","assets/img/size-alert.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(13,16777216,null,null,1,"router-outlet",[],null,null,null,null,null)),l._8(14,212992,null,0,bp,[yp,l.R,l.j,[8,null],l.h],null,null),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(16,0,null,null,1,"app-msg-bar",[],null,null,null,tk,XM)),l._8(17,49152,[[1,4],["msgBar",4]],0,Yc,[],null,null)],function(n,t){n(t,14,0)},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("errors.window-size")))})}var rk=l._5("app-root",wf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-root",[],null,null,null,lk,ek)),l._8(1,114688,null,0,wf,[gf,Bc,Sc,oc,Xu,Zu,Ac,fa,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]);function ik(n){switch(n.length){case 0:return new us;case 1:return n[0];default:return new cs(n)}}function ok(n,t,e,l,r,i){void 0===r&&(r={}),void 0===i&&(i={});var o=[],s=[],a=-1,u=null;if(l.forEach(function(n){var e=n.offset,l=e==a,c=l&&u||{};Object.keys(n).forEach(function(e){var l=e,s=n[e];if("offset"!==e)switch(l=t.normalizePropertyName(l,o),s){case ds:s=r[e];break;case is:s=i[e];break;default:s=t.normalizeStyleValue(e,l,s,o)}c[l]=s}),l||s.push(c),u=c,a=e}),o.length)throw new Error("Unable to animate due to the following errors:\n - "+o.join("\n - "));return s}function sk(n,t,e,l){switch(t){case"start":n.onStart(function(){return l(e&&ak(e,"start",n.totalTime))});break;case"done":n.onDone(function(){return l(e&&ak(e,"done",n.totalTime))});break;case"destroy":n.onDestroy(function(){return l(e&&ak(e,"destroy",n.totalTime))})}}function ak(n,t,e){var l=uk(n.element,n.triggerName,n.fromState,n.toState,t||n.phaseName,void 0==e?n.totalTime:e),r=n._data;return null!=r&&(l._data=r),l}function uk(n,t,e,l,r,i){return void 0===r&&(r=""),void 0===i&&(i=0),{element:n,triggerName:t,fromState:e,toState:l,phaseName:r,totalTime:i}}function ck(n,t,e){var l;return n instanceof Map?(l=n.get(t))||n.set(t,l=e):(l=n[t])||(l=n[t]=e),l}function dk(n){var t=n.indexOf(":");return[n.substring(1,t),n.substr(t+1)]}var hk=function(n,t){return!1},pk=function(n,t){return!1},fk=function(n,t,e){return[]};if("undefined"!=typeof Element){if(hk=function(n,t){return n.contains(t)},Element.prototype.matches)pk=function(n,t){return n.matches(t)};else{var _k=Element.prototype,mk=_k.matchesSelector||_k.mozMatchesSelector||_k.msMatchesSelector||_k.oMatchesSelector||_k.webkitMatchesSelector;mk&&(pk=function(n,t){return mk.apply(n,[t])})}fk=function(n,t,e){var l=[];if(e)l.push.apply(l,n.querySelectorAll(t));else{var r=n.querySelector(t);r&&l.push(r)}return l}}var gk=null,yk=!1;function bk(){return"undefined"!=typeof document?document.body:null}var vk=pk,wk=hk,xk=fk,Mk=function(){function n(){}return n.prototype.validateStyleProperty=function(n){return function(n){gk||(gk=bk()||{},yk=!!gk.style&&"WebkitAppearance"in gk.style);var t=!0;return gk.style&&!function(n){return"ebkit"==n.substring(1,6)}(n)&&!(t=n in gk.style)&&yk&&(t="Webkit"+n.charAt(0).toUpperCase()+n.substr(1)in gk.style),t}(n)},n.prototype.matchesElement=function(n,t){return vk(n,t)},n.prototype.containsElement=function(n,t){return wk(n,t)},n.prototype.query=function(n,t,e){return xk(n,t,e)},n.prototype.computeStyle=function(n,t,e){return e||""},n.prototype.animate=function(n,t,e,l,r,i){return void 0===i&&(i=[]),new us},n}(),kk=function(){function n(){}return n.NOOP=new Mk,n}(),Ck=1e3;function Sk(n){if("number"==typeof n)return n;var t=n.match(/^(-?[\.\d]+)(m?s)/);return!t||t.length<2?0:Ok(parseFloat(t[1]),t[2])}function Ok(n,t){switch(t){case"s":return n*Ck;default:return n}}function Tk(n,t,e){return n.hasOwnProperty("duration")?n:function(n,t,e){var l,r=0,i="";if("string"==typeof n){var o=n.match(/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i);if(null===o)return t.push('The provided timing value "'+n+'" is invalid.'),{duration:0,delay:0,easing:""};l=Ok(parseFloat(o[1]),o[2]);var s=o[3];null!=s&&(r=Ok(Math.floor(parseFloat(s)),o[4]));var a=o[5];a&&(i=a)}else l=n;if(!e){var u=!1,c=t.length;l<0&&(t.push("Duration values below 0 are not allowed for this animation step."),u=!0),r<0&&(t.push("Delay values below 0 are not allowed for this animation step."),u=!0),u&&t.splice(c,0,'The provided timing value "'+n+'" is invalid.')}return{duration:l,delay:r,easing:i}}(n,t,e)}function Lk(n,t){return void 0===t&&(t={}),Object.keys(n).forEach(function(e){t[e]=n[e]}),t}function Pk(n,t,e){if(void 0===e&&(e={}),t)for(var l in n)e[l]=n[l];else Lk(n,e);return e}function Dk(n,t){n.style&&Object.keys(t).forEach(function(e){var l=Nk(e);n.style[l]=t[e]})}function Ak(n,t){n.style&&Object.keys(t).forEach(function(t){var e=Nk(t);n.style[e]=""})}function Ek(n){return Array.isArray(n)?1==n.length?n[0]:os(n):n}var Yk=new RegExp("{{\\s*(.+?)\\s*}}","g");function jk(n){var t=[];if("string"==typeof n){for(var e=n.toString(),l=void 0;l=Yk.exec(e);)t.push(l[1]);Yk.lastIndex=0}return t}function Ik(n,t,e){var l=n.toString(),r=l.replace(Yk,function(n,l){var r=t[l];return t.hasOwnProperty(l)||(e.push("Please provide a value for the animation param "+l),r=""),r.toString()});return r==l?n:r}function Rk(n){for(var t=[],e=n.next();!e.done;)t.push(e.value),e=n.next();return t}var Hk=/-+([a-z0-9])/g;function Nk(n){return n.replace(Hk,function(){for(var n=[],t=0;t *";case":leave":return"* => void";case":increment":return function(n,t){return parseFloat(t)>parseFloat(n)};case":decrement":return function(n,t){return parseFloat(t) *"}}(n,e);if("function"==typeof l)return void t.push(l);n=l}var r=n.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(null==r||r.length<4)return e.push('The provided transition expression "'+n+'" is not supported'),t;var i=r[1],o=r[2],s=r[3];t.push(zk(i,s)),"<"!=o[0]||i==Bk&&s==Bk||t.push(zk(s,i))}(n,r,l)}):r.push(e),r),animation:i,queryCount:t.queryCount,depCount:t.depCount,options:Kk(n.options)}},n.prototype.visitSequence=function(n,t){var e=this;return{type:2,steps:n.steps.map(function(n){return Fk(e,n,t)}),options:Kk(n.options)}},n.prototype.visitGroup=function(n,t){var e=this,l=t.currentTime,r=0,i=n.steps.map(function(n){t.currentTime=l;var i=Fk(e,n,t);return r=Math.max(r,t.currentTime),i});return t.currentTime=r,{type:3,steps:i,options:Kk(n.options)}},n.prototype.visitAnimate=function(n,t){var e,l=function(n,t){var e=null;if(n.hasOwnProperty("duration"))e=n;else if("number"==typeof n)return Xk(Tk(n,t).duration,0,"");var l=n;if(l.split(/\s+/).some(function(n){return"{"==n.charAt(0)&&"{"==n.charAt(1)})){var r=Xk(0,0,"");return r.dynamic=!0,r.strValue=l,r}return Xk((e=e||Tk(l,t)).duration,e.delay,e.easing)}(n.timings,t.errors);t.currentAnimateTimings=l;var r=n.styles?n.styles:ss({});if(5==r.type)e=this.visitKeyframes(r,t);else{var i=n.styles,o=!1;if(!i){o=!0;var s={};l.easing&&(s.easing=l.easing),i=ss(s)}t.currentTime+=l.duration+l.delay;var a=this.visitStyle(i,t);a.isEmptyStep=o,e=a}return t.currentAnimateTimings=null,{type:4,timings:l,style:e,options:null}},n.prototype.visitStyle=function(n,t){var e=this._makeStyleAst(n,t);return this._validateStyleAst(e,t),e},n.prototype._makeStyleAst=function(n,t){var e=[];Array.isArray(n.styles)?n.styles.forEach(function(n){"string"==typeof n?n==is?e.push(n):t.errors.push("The provided style string value "+n+" is not allowed."):e.push(n)}):e.push(n.styles);var l=!1,r=null;return e.forEach(function(n){if(Qk(n)){var t=n,e=t.easing;if(e&&(r=e,delete t.easing),!l)for(var i in t)if(t[i].toString().indexOf("{{")>=0){l=!0;break}}}),{type:6,styles:e,easing:r,offset:n.offset,containsDynamicStyles:l,options:null}},n.prototype._validateStyleAst=function(n,t){var e=this,l=t.currentAnimateTimings,r=t.currentTime,i=t.currentTime;l&&i>0&&(i-=l.duration+l.delay),n.styles.forEach(function(n){"string"!=typeof n&&Object.keys(n).forEach(function(l){if(e._driver.validateStyleProperty(l)){var o,s,a,u=t.collectedStyles[t.currentQuerySelector],c=u[l],d=!0;c&&(i!=r&&i>=c.startTime&&r<=c.endTime&&(t.errors.push('The CSS property "'+l+'" that exists between the times of "'+c.startTime+'ms" and "'+c.endTime+'ms" is also being animated in a parallel animation between the times of "'+i+'ms" and "'+r+'ms"'),d=!1),i=c.startTime),d&&(u[l]={startTime:i,endTime:r}),t.options&&(o=t.errors,s=t.options.params||{},(a=jk(n[l])).length&&a.forEach(function(n){s.hasOwnProperty(n)||o.push("Unable to resolve the local animation param "+n+" in the given list of values")}))}else t.errors.push('The provided animation property "'+l+'" is not a supported CSS property for animations')})})},n.prototype.visitKeyframes=function(n,t){var e=this,l={type:5,styles:[],options:null};if(!t.currentAnimateTimings)return t.errors.push("keyframes() must be placed inside of a call to animate()"),l;var r=0,i=[],o=!1,s=!1,a=0,u=n.steps.map(function(n){var l=e._makeStyleAst(n,t),u=null!=l.offset?l.offset:function(n){if("string"==typeof n)return null;var t=null;if(Array.isArray(n))n.forEach(function(n){if(Qk(n)&&n.hasOwnProperty("offset")){var e=n;t=parseFloat(e.offset),delete e.offset}});else if(Qk(n)&&n.hasOwnProperty("offset")){var e=n;t=parseFloat(e.offset),delete e.offset}return t}(l.styles),c=0;return null!=u&&(r++,c=l.offset=u),s=s||c<0||c>1,o=o||c0&&r0?r==h?1:d*r:i[r],s=o*_;t.currentTime=p+f.delay+s,f.duration=s,e._validateStyleAst(n,t),n.offset=o,l.styles.push(n)}),l},n.prototype.visitReference=function(n,t){return{type:8,animation:Fk(this,Ek(n.animation),t),options:Kk(n.options)}},n.prototype.visitAnimateChild=function(n,t){return t.depCount++,{type:9,options:Kk(n.options)}},n.prototype.visitAnimateRef=function(n,t){return{type:10,animation:this.visitReference(n.animation,t),options:Kk(n.options)}},n.prototype.visitQuery=function(n,t){var e=t.currentQuerySelector,l=n.options||{};t.queryCount++,t.currentQuery=n;var r=function(n){var t=!!n.split(/\s*,\s*/).find(function(n){return":self"==n});return t&&(n=n.replace(Uk,"")),[n=n.replace(/@\*/g,".ng-trigger").replace(/@\w+/g,function(n){return".ng-trigger-"+n.substr(1)}).replace(/:animating/g,".ng-animating"),t]}(n.selector),i=r[0],o=r[1];t.currentQuerySelector=e.length?e+" "+i:i,ck(t.collectedStyles,t.currentQuerySelector,{});var s=Fk(this,Ek(n.animation),t);return t.currentQuery=null,t.currentQuerySelector=e,{type:11,selector:i,limit:l.limit||0,optional:!!l.optional,includeSelf:o,animation:s,originalSelector:n.selector,options:Kk(n.options)}},n.prototype.visitStagger=function(n,t){t.currentQuery||t.errors.push("stagger() can only be used inside of query()");var e="full"===n.timings?{duration:0,delay:0,easing:"full"}:Tk(n.timings,t.errors,!0);return{type:12,animation:Fk(this,Ek(n.animation),t),timings:e,options:null}},n}(),Jk=function(n){this.errors=n,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null};function Qk(n){return!Array.isArray(n)&&"object"==typeof n}function Kk(n){var t;return n?(n=Lk(n)).params&&(n.params=(t=n.params)?Lk(t):null):n={},n}function Xk(n,t,e){return{duration:n,delay:t,easing:e}}function Zk(n,t,e,l,r,i,o,s){return void 0===o&&(o=null),void 0===s&&(s=!1),{type:1,element:n,keyframes:t,preStyleProps:e,postStyleProps:l,duration:r,delay:i,totalTime:r+i,easing:o,subTimeline:s}}var $k=function(){function n(){this._map=new Map}return n.prototype.consume=function(n){var t=this._map.get(n);return t?this._map.delete(n):t=[],t},n.prototype.append=function(n,t){var e=this._map.get(n);e||this._map.set(n,e=[]),e.push.apply(e,t)},n.prototype.has=function(n){return this._map.has(n)},n.prototype.clear=function(){this._map.clear()},n}(),nC=new RegExp(":enter","g"),tC=new RegExp(":leave","g");function eC(n,t,e,l,r,i,o,s,a,u){return void 0===i&&(i={}),void 0===o&&(o={}),void 0===u&&(u=[]),(new lC).buildKeyframes(n,t,e,l,r,i,o,s,a,u)}var lC=function(){function n(){}return n.prototype.buildKeyframes=function(n,t,e,l,r,i,o,s,a,u){void 0===u&&(u=[]),a=a||new $k;var c=new iC(n,t,a,l,r,u,[]);c.options=s,c.currentTimeline.setStyles([i],null,c.errors,s),Fk(this,e,c);var d=c.timelines.filter(function(n){return n.containsAnimation()});if(d.length&&Object.keys(o).length){var h=d[d.length-1];h.allowOnlyTimelineStyles()||h.setStyles([o],null,c.errors,s)}return d.length?d.map(function(n){return n.buildKeyframes()}):[Zk(t,[],[],[],0,0,"",!1)]},n.prototype.visitTrigger=function(n,t){},n.prototype.visitState=function(n,t){},n.prototype.visitTransition=function(n,t){},n.prototype.visitAnimateChild=function(n,t){var e=t.subInstructions.consume(t.element);if(e){var l=t.createSubContext(n.options),r=t.currentTimeline.currentTime,i=this._visitSubInstructions(e,l,l.options);r!=i&&t.transformIntoNewTimeline(i)}t.previousNode=n},n.prototype.visitAnimateRef=function(n,t){var e=t.createSubContext(n.options);e.transformIntoNewTimeline(),this.visitReference(n.animation,e),t.transformIntoNewTimeline(e.currentTimeline.currentTime),t.previousNode=n},n.prototype._visitSubInstructions=function(n,t,e){var l=t.currentTimeline.currentTime,r=null!=e.duration?Sk(e.duration):null,i=null!=e.delay?Sk(e.delay):null;return 0!==r&&n.forEach(function(n){var e=t.appendInstructionToTimeline(n,r,i);l=Math.max(l,e.duration+e.delay)}),l},n.prototype.visitReference=function(n,t){t.updateOptions(n.options,!0),Fk(this,n.animation,t),t.previousNode=n},n.prototype.visitSequence=function(n,t){var e=this,l=t.subContextCount,r=t,i=n.options;if(i&&(i.params||i.delay)&&((r=t.createSubContext(i)).transformIntoNewTimeline(),null!=i.delay)){6==r.previousNode.type&&(r.currentTimeline.snapshotCurrentStyles(),r.previousNode=rC);var o=Sk(i.delay);r.delayNextStep(o)}n.steps.length&&(n.steps.forEach(function(n){return Fk(e,n,r)}),r.currentTimeline.applyStylesToKeyframe(),r.subContextCount>l&&r.transformIntoNewTimeline()),t.previousNode=n},n.prototype.visitGroup=function(n,t){var e=this,l=[],r=t.currentTimeline.currentTime,i=n.options&&n.options.delay?Sk(n.options.delay):0;n.steps.forEach(function(o){var s=t.createSubContext(n.options);i&&s.delayNextStep(i),Fk(e,o,s),r=Math.max(r,s.currentTimeline.currentTime),l.push(s.currentTimeline)}),l.forEach(function(n){return t.currentTimeline.mergeTimelineCollectedStyles(n)}),t.transformIntoNewTimeline(r),t.previousNode=n},n.prototype._visitTiming=function(n,t){if(n.dynamic){var e=n.strValue;return Tk(t.params?Ik(e,t.params,t.errors):e,t.errors)}return{duration:n.duration,delay:n.delay,easing:n.easing}},n.prototype.visitAnimate=function(n,t){var e=t.currentAnimateTimings=this._visitTiming(n.timings,t),l=t.currentTimeline;e.delay&&(t.incrementTime(e.delay),l.snapshotCurrentStyles());var r=n.style;5==r.type?this.visitKeyframes(r,t):(t.incrementTime(e.duration),this.visitStyle(r,t),l.applyStylesToKeyframe()),t.currentAnimateTimings=null,t.previousNode=n},n.prototype.visitStyle=function(n,t){var e=t.currentTimeline,l=t.currentAnimateTimings;!l&&e.getCurrentStyleProperties().length&&e.forwardFrame();var r=l&&l.easing||n.easing;n.isEmptyStep?e.applyEmptyStep(r):e.setStyles(n.styles,r,t.errors,t.options),t.previousNode=n},n.prototype.visitKeyframes=function(n,t){var e=t.currentAnimateTimings,l=t.currentTimeline.duration,r=e.duration,i=t.createSubContext().currentTimeline;i.easing=e.easing,n.styles.forEach(function(n){i.forwardTime((n.offset||0)*r),i.setStyles(n.styles,n.easing,t.errors,t.options),i.applyStylesToKeyframe()}),t.currentTimeline.mergeTimelineCollectedStyles(i),t.transformIntoNewTimeline(l+r),t.previousNode=n},n.prototype.visitQuery=function(n,t){var e=this,l=t.currentTimeline.currentTime,r=n.options||{},i=r.delay?Sk(r.delay):0;i&&(6===t.previousNode.type||0==l&&t.currentTimeline.getCurrentStyleProperties().length)&&(t.currentTimeline.snapshotCurrentStyles(),t.previousNode=rC);var o=l,s=t.invokeQuery(n.selector,n.originalSelector,n.limit,n.includeSelf,!!r.optional,t.errors);t.currentQueryTotal=s.length;var a=null;s.forEach(function(l,r){t.currentQueryIndex=r;var s=t.createSubContext(n.options,l);i&&s.delayNextStep(i),l===t.element&&(a=s.currentTimeline),Fk(e,n.animation,s),s.currentTimeline.applyStylesToKeyframe(),o=Math.max(o,s.currentTimeline.currentTime)}),t.currentQueryIndex=0,t.currentQueryTotal=0,t.transformIntoNewTimeline(o),a&&(t.currentTimeline.mergeTimelineCollectedStyles(a),t.currentTimeline.snapshotCurrentStyles()),t.previousNode=n},n.prototype.visitStagger=function(n,t){var e=t.parentContext,l=t.currentTimeline,r=n.timings,i=Math.abs(r.duration),o=i*(t.currentQueryTotal-1),s=i*t.currentQueryIndex;switch(r.duration<0?"reverse":r.easing){case"reverse":s=o-s;break;case"full":s=e.currentStaggerTime}var a=t.currentTimeline;s&&a.delayNextStep(s);var u=a.currentTime;Fk(this,n.animation,t),t.previousNode=n,e.currentStaggerTime=l.currentTime-u+(l.startTime-e.currentTimeline.startTime)},n}(),rC={},iC=function(){function n(n,t,e,l,r,i,o,s){this._driver=n,this.element=t,this.subInstructions=e,this._enterClassName=l,this._leaveClassName=r,this.errors=i,this.timelines=o,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=rC,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=s||new oC(this._driver,t,0),o.push(this.currentTimeline)}return Object.defineProperty(n.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),n.prototype.updateOptions=function(n,t){var e=this;if(n){var l=n,r=this.options;null!=l.duration&&(r.duration=Sk(l.duration)),null!=l.delay&&(r.delay=Sk(l.delay));var i=l.params;if(i){var o=r.params;o||(o=this.options.params={}),Object.keys(i).forEach(function(n){t&&o.hasOwnProperty(n)||(o[n]=Ik(i[n],o,e.errors))})}}},n.prototype._copyOptions=function(){var n={};if(this.options){var t=this.options.params;if(t){var e=n.params={};Object.keys(t).forEach(function(n){e[n]=t[n]})}}return n},n.prototype.createSubContext=function(t,e,l){void 0===t&&(t=null);var r=e||this.element,i=new n(this._driver,r,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(r,l||0));return i.previousNode=this.previousNode,i.currentAnimateTimings=this.currentAnimateTimings,i.options=this._copyOptions(),i.updateOptions(t),i.currentQueryIndex=this.currentQueryIndex,i.currentQueryTotal=this.currentQueryTotal,i.parentContext=this,this.subContextCount++,i},n.prototype.transformIntoNewTimeline=function(n){return this.previousNode=rC,this.currentTimeline=this.currentTimeline.fork(this.element,n),this.timelines.push(this.currentTimeline),this.currentTimeline},n.prototype.appendInstructionToTimeline=function(n,t,e){var l={duration:null!=t?t:n.duration,delay:this.currentTimeline.currentTime+(null!=e?e:0)+n.delay,easing:""},r=new sC(this._driver,n.element,n.keyframes,n.preStyleProps,n.postStyleProps,l,n.stretchStartingKeyframe);return this.timelines.push(r),l},n.prototype.incrementTime=function(n){this.currentTimeline.forwardTime(this.currentTimeline.duration+n)},n.prototype.delayNextStep=function(n){n>0&&this.currentTimeline.delayNextStep(n)},n.prototype.invokeQuery=function(n,t,e,l,r,i){var o=[];if(l&&o.push(this.element),n.length>0){n=(n=n.replace(nC,"."+this._enterClassName)).replace(tC,"."+this._leaveClassName);var s=this._driver.query(this.element,n,1!=e);0!==e&&(s=e<0?s.slice(s.length+e,s.length):s.slice(0,e)),o.push.apply(o,s)}return r||0!=o.length||i.push('`query("'+t+'")` returned zero elements. (Use `query("'+t+'", { optional: true })` if you wish to allow this.)'),o},n}(),oC=function(){function n(n,t,e,l){this._driver=n,this.element=t,this.startTime=e,this._elementTimelineStylesLookup=l,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(t),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(t,this._localTimelineStyles)),this._loadKeyframe()}return n.prototype.containsAnimation=function(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}},n.prototype.getCurrentStyleProperties=function(){return Object.keys(this._currentKeyframe)},Object.defineProperty(n.prototype,"currentTime",{get:function(){return this.startTime+this.duration},enumerable:!0,configurable:!0}),n.prototype.delayNextStep=function(n){var t=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||t?(this.forwardTime(this.currentTime+n),t&&this.snapshotCurrentStyles()):this.startTime+=n},n.prototype.fork=function(t,e){return this.applyStylesToKeyframe(),new n(this._driver,t,e||this.currentTime,this._elementTimelineStylesLookup)},n.prototype._loadKeyframe=function(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))},n.prototype.forwardFrame=function(){this.duration+=1,this._loadKeyframe()},n.prototype.forwardTime=function(n){this.applyStylesToKeyframe(),this.duration=n,this._loadKeyframe()},n.prototype._updateStyle=function(n,t){this._localTimelineStyles[n]=t,this._globalTimelineStyles[n]=t,this._styleSummary[n]={time:this.currentTime,value:t}},n.prototype.allowOnlyTimelineStyles=function(){return this._currentEmptyStepKeyframe!==this._currentKeyframe},n.prototype.applyEmptyStep=function(n){var t=this;n&&(this._previousKeyframe.easing=n),Object.keys(this._globalTimelineStyles).forEach(function(n){t._backFill[n]=t._globalTimelineStyles[n]||is,t._currentKeyframe[n]=is}),this._currentEmptyStepKeyframe=this._currentKeyframe},n.prototype.setStyles=function(n,t,e,l){var r=this;t&&(this._previousKeyframe.easing=t);var i=l&&l.params||{},o=function(n,t){var e,l={};return n.forEach(function(n){"*"===n?(e=e||Object.keys(t)).forEach(function(n){l[n]=is}):Pk(n,!1,l)}),l}(n,this._globalTimelineStyles);Object.keys(o).forEach(function(n){var t=Ik(o[n],i,e);r._pendingStyles[n]=t,r._localTimelineStyles.hasOwnProperty(n)||(r._backFill[n]=r._globalTimelineStyles.hasOwnProperty(n)?r._globalTimelineStyles[n]:is),r._updateStyle(n,t)})},n.prototype.applyStylesToKeyframe=function(){var n=this,t=this._pendingStyles,e=Object.keys(t);0!=e.length&&(this._pendingStyles={},e.forEach(function(e){n._currentKeyframe[e]=t[e]}),Object.keys(this._localTimelineStyles).forEach(function(t){n._currentKeyframe.hasOwnProperty(t)||(n._currentKeyframe[t]=n._localTimelineStyles[t])}))},n.prototype.snapshotCurrentStyles=function(){var n=this;Object.keys(this._localTimelineStyles).forEach(function(t){var e=n._localTimelineStyles[t];n._pendingStyles[t]=e,n._updateStyle(t,e)})},n.prototype.getFinalKeyframe=function(){return this._keyframes.get(this.duration)},Object.defineProperty(n.prototype,"properties",{get:function(){var n=[];for(var t in this._currentKeyframe)n.push(t);return n},enumerable:!0,configurable:!0}),n.prototype.mergeTimelineCollectedStyles=function(n){var t=this;Object.keys(n._styleSummary).forEach(function(e){var l=t._styleSummary[e],r=n._styleSummary[e];(!l||r.time>l.time)&&t._updateStyle(e,r.value)})},n.prototype.buildKeyframes=function(){var n=this;this.applyStylesToKeyframe();var t=new Set,e=new Set,l=1===this._keyframes.size&&0===this.duration,r=[];this._keyframes.forEach(function(i,o){var s=Pk(i,!0);Object.keys(s).forEach(function(n){var l=s[n];l==ds?t.add(n):l==is&&e.add(n)}),l||(s.offset=o/n.duration),r.push(s)});var i=t.size?Rk(t.values()):[],o=e.size?Rk(e.values()):[];if(l){var s=r[0],a=Lk(s);s.offset=0,a.offset=1,r=[s,a]}return Zk(this.element,r,i,o,this.duration,this.startTime,this.easing,!1)},n}(),sC=function(n){function t(t,e,l,r,i,o,s){void 0===s&&(s=!1);var a=n.call(this,t,e,o.delay)||this;return a.element=e,a.keyframes=l,a.preStyleProps=r,a.postStyleProps=i,a._stretchStartingKeyframe=s,a.timings={duration:o.duration,delay:o.delay,easing:o.easing},a}return Object(i.__extends)(t,n),t.prototype.containsAnimation=function(){return this.keyframes.length>1},t.prototype.buildKeyframes=function(){var n=this.keyframes,t=this.timings,e=t.delay,l=t.duration,r=t.easing;if(this._stretchStartingKeyframe&&e){var i=[],o=l+e,s=e/o,a=Pk(n[0],!1);a.offset=0,i.push(a);var u=Pk(n[0],!1);u.offset=aC(s),i.push(u);for(var c=n.length-1,d=1;d<=c;d++){var h=Pk(n[d],!1);h.offset=aC((e+h.offset*l)/o),i.push(h)}l=o,e=0,r="",n=i}return Zk(this.element,n,this.preStyleProps,this.postStyleProps,l,e,r,!0)},t}(oC);function aC(n,t){void 0===t&&(t=3);var e=Math.pow(10,t-1);return Math.round(n*e)/e}var uC=function(){},cC=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),t.prototype.normalizePropertyName=function(n,t){return Nk(n)},t.prototype.normalizeStyleValue=function(n,t,e,l){var r="",i=e.toString().trim();if(dC[t]&&0!==e&&"0"!==e)if("number"==typeof e)r="px";else{var o=e.match(/^[+-]?[\d\.]+([a-z]*)$/);o&&0==o[1].length&&l.push("Please provide a CSS unit value for "+n+":"+e)}return i+r},t}(uC),dC=function(n){var t={};return"width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(",").forEach(function(n){return t[n]=!0}),t}();function hC(n,t,e,l,r,i,o,s,a,u,c,d){return{type:0,element:n,triggerName:t,isRemovalTransition:r,fromState:e,fromStyles:i,toState:l,toStyles:o,timelines:s,queriedElements:a,preStyleProps:u,postStyleProps:c,errors:d}}var pC={},fC=function(){function n(n,t,e){this._triggerName=n,this.ast=t,this._stateStyles=e}return n.prototype.match=function(n,t){return function(n,t,e){return n.some(function(n){return n(t,e)})}(this.ast.matchers,n,t)},n.prototype.buildStyles=function(n,t,e){var l=this._stateStyles["*"],r=this._stateStyles[n],i=l?l.buildStyles(t,e):{};return r?r.buildStyles(t,e):i},n.prototype.build=function(n,t,e,l,r,o,s,a,u){var c=[],d=this.ast.options&&this.ast.options.params||pC,h=this.buildStyles(e,s&&s.params||pC,c),p=a&&a.params||pC,f=this.buildStyles(l,p,c),_=new Set,m=new Map,g=new Map,y="void"===l,b={params:Object(i.__assign)({},d,p)},v=eC(n,t,this.ast.animation,r,o,h,f,b,u,c);if(c.length)return hC(t,this._triggerName,e,l,y,h,f,[],[],m,g,c);v.forEach(function(n){var e=n.element,l=ck(m,e,{});n.preStyleProps.forEach(function(n){return l[n]=!0});var r=ck(g,e,{});n.postStyleProps.forEach(function(n){return r[n]=!0}),e!==t&&_.add(e)});var w=Rk(_.values());return hC(t,this._triggerName,e,l,y,h,f,v,w,m,g)},n}(),_C=function(){function n(n,t){this.styles=n,this.defaultParams=t}return n.prototype.buildStyles=function(n,t){var e={},l=Lk(this.defaultParams);return Object.keys(n).forEach(function(t){var e=n[t];null!=e&&(l[t]=e)}),this.styles.styles.forEach(function(n){if("string"!=typeof n){var r=n;Object.keys(r).forEach(function(n){var i=r[n];i.length>1&&(i=Ik(i,l,t)),e[n]=i})}}),e},n}(),mC=function(){function n(n,t){var e=this;this.name=n,this.ast=t,this.transitionFactories=[],this.states={},t.states.forEach(function(n){e.states[n.name]=new _C(n.style,n.options&&n.options.params||{})}),gC(this.states,"true","1"),gC(this.states,"false","0"),t.transitions.forEach(function(t){e.transitionFactories.push(new fC(n,t,e.states))}),this.fallbackTransition=new fC(n,{type:1,animation:{type:2,steps:[],options:null},matchers:[function(n,t){return!0}],options:null,queryCount:0,depCount:0},this.states)}return Object.defineProperty(n.prototype,"containsQueries",{get:function(){return this.ast.queryCount>0},enumerable:!0,configurable:!0}),n.prototype.matchTransition=function(n,t){return this.transitionFactories.find(function(e){return e.match(n,t)})||null},n.prototype.matchStyles=function(n,t,e){return this.fallbackTransition.buildStyles(n,t,e)},n}();function gC(n,t,e){n.hasOwnProperty(t)?n.hasOwnProperty(e)||(n[e]=n[t]):n.hasOwnProperty(e)&&(n[t]=n[e])}var yC=new $k,bC=function(){function n(n,t){this._driver=n,this._normalizer=t,this._animations={},this._playersById={},this.players=[]}return n.prototype.register=function(n,t){var e=[],l=Gk(this._driver,t,e);if(e.length)throw new Error("Unable to build the animation due to the following errors: "+e.join("\n"));this._animations[n]=l},n.prototype._buildPlayer=function(n,t,e){var l=n.element,r=ok(0,this._normalizer,0,n.keyframes,t,e);return this._driver.animate(l,r,n.duration,n.delay,n.easing,[])},n.prototype.create=function(n,t,e){var l=this;void 0===e&&(e={});var r,i=[],o=this._animations[n],s=new Map;if(o?(r=eC(this._driver,t,o,"ng-enter","ng-leave",{},{},e,yC,i)).forEach(function(n){var t=ck(s,n.element,{});n.postStyleProps.forEach(function(n){return t[n]=null})}):(i.push("The requested animation doesn't exist or has already been destroyed"),r=[]),i.length)throw new Error("Unable to create the animation due to the following errors: "+i.join("\n"));s.forEach(function(n,t){Object.keys(n).forEach(function(e){n[e]=l._driver.computeStyle(t,e,is)})});var a=ik(r.map(function(n){var t=s.get(n.element);return l._buildPlayer(n,{},t)}));return this._playersById[n]=a,a.onDestroy(function(){return l.destroy(n)}),this.players.push(a),a},n.prototype.destroy=function(n){var t=this._getPlayer(n);t.destroy(),delete this._playersById[n];var e=this.players.indexOf(t);e>=0&&this.players.splice(e,1)},n.prototype._getPlayer=function(n){var t=this._playersById[n];if(!t)throw new Error("Unable to find the timeline player referenced by "+n);return t},n.prototype.listen=function(n,t,e,l){var r=uk(t,"","","");return sk(this._getPlayer(n),e,r,l),function(){}},n.prototype.command=function(n,t,e,l){if("register"!=e)if("create"!=e){var r=this._getPlayer(n);switch(e){case"play":r.play();break;case"pause":r.pause();break;case"reset":r.reset();break;case"restart":r.restart();break;case"finish":r.finish();break;case"init":r.init();break;case"setPosition":r.setPosition(parseFloat(l[0]));break;case"destroy":this.destroy(n)}}else this.create(n,t,l[0]||{});else this.register(n,l[0])},n}(),vC=[],wC={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!1},xC={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!0},MC="__ng_removed",kC=function(){function n(n,t){void 0===t&&(t=""),this.namespaceId=t;var e=n&&n.hasOwnProperty("value");if(this.value=function(n){return null!=n?n:null}(e?n.value:n),e){var l=Lk(n);delete l.value,this.options=l}else this.options={};this.options.params||(this.options.params={})}return Object.defineProperty(n.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),n.prototype.absorbOptions=function(n){var t=n.params;if(t){var e=this.options.params;Object.keys(t).forEach(function(n){null==e[n]&&(e[n]=t[n])})}},n}(),CC=new kC("void"),SC=new kC("DELETED"),OC=function(){function n(n,t,e){this.id=n,this.hostElement=t,this._engine=e,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+n,jC(t,this._hostClassName)}return n.prototype.listen=function(n,t,e,l){var r,i=this;if(!this._triggers.hasOwnProperty(t))throw new Error('Unable to listen on the animation trigger event "'+e+'" because the animation trigger "'+t+"\" doesn't exist!");if(null==e||0==e.length)throw new Error('Unable to listen on the animation trigger "'+t+'" because the provided event is undefined!');if("start"!=(r=e)&&"done"!=r)throw new Error('The provided animation trigger event "'+e+'" for the animation trigger "'+t+'" is not supported!');var o=ck(this._elementListeners,n,[]),s={name:t,phase:e,callback:l};o.push(s);var a=ck(this._engine.statesByElement,n,{});return a.hasOwnProperty(t)||(jC(n,"ng-trigger"),jC(n,"ng-trigger-"+t),a[t]=CC),function(){i._engine.afterFlush(function(){var n=o.indexOf(s);n>=0&&o.splice(n,1),i._triggers[t]||delete a[t]})}},n.prototype.register=function(n,t){return!this._triggers[n]&&(this._triggers[n]=t,!0)},n.prototype._getTrigger=function(n){var t=this._triggers[n];if(!t)throw new Error('The provided animation trigger "'+n+'" has not been registered!');return t},n.prototype.trigger=function(n,t,e,l){var r=this;void 0===l&&(l=!0);var i=this._getTrigger(t),o=new LC(this.id,t,n),s=this._engine.statesByElement.get(n);s||(jC(n,"ng-trigger"),jC(n,"ng-trigger-"+t),this._engine.statesByElement.set(n,s={}));var a=s[t],u=new kC(e,this.id);if(!(e&&e.hasOwnProperty("value"))&&a&&u.absorbOptions(a.options),s[t]=u,a){if(a===SC)return o}else a=CC;if("void"===u.value||a.value!==u.value){var c=ck(this._engine.playersByElement,n,[]);c.forEach(function(n){n.namespaceId==r.id&&n.triggerName==t&&n.queued&&n.destroy()});var d=i.matchTransition(a.value,u.value),h=!1;if(!d){if(!l)return;d=i.fallbackTransition,h=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:n,triggerName:t,transition:d,fromState:a,toState:u,player:o,isFallbackTransition:h}),h||(jC(n,"ng-animate-queued"),o.onStart(function(){IC(n,"ng-animate-queued")})),o.onDone(function(){var t=r.players.indexOf(o);t>=0&&r.players.splice(t,1);var e=r._engine.playersByElement.get(n);if(e){var l=e.indexOf(o);l>=0&&e.splice(l,1)}}),this.players.push(o),c.push(o),o}if(!function(n,t){var e=Object.keys(n),l=Object.keys(t);if(e.length!=l.length)return!1;for(var r=0;r=0){for(var l=!1,r=e;r>=0;r--)if(this.driver.containsElement(this._namespaceList[r].hostElement,t)){this._namespaceList.splice(r+1,0,n),l=!0;break}l||this._namespaceList.splice(0,0,n)}else this._namespaceList.push(n);return this.namespacesByHostElement.set(t,n),n},n.prototype.register=function(n,t){var e=this._namespaceLookup[n];return e||(e=this.createNamespace(n,t)),e},n.prototype.registerTrigger=function(n,t,e){var l=this._namespaceLookup[n];l&&l.register(t,e)&&this.totalAnimations++},n.prototype.destroy=function(n,t){var e=this;if(n){var l=this._fetchNamespace(n);this.afterFlush(function(){e.namespacesByHostElement.delete(l.hostElement),delete e._namespaceLookup[n];var t=e._namespaceList.indexOf(l);t>=0&&e._namespaceList.splice(t,1)}),this.afterFlushAnimationsDone(function(){return l.destroy(t)})}},n.prototype._fetchNamespace=function(n){return this._namespaceLookup[n]},n.prototype.fetchNamespacesByElement=function(n){var t=new Set,e=this.statesByElement.get(n);if(e)for(var l=Object.keys(e),r=0;r=0;C--)this._namespaceList[C].drainQueuedTransitions(t).forEach(function(n){var t=n.player;M.push(t);var i=n.element;if(h&&e.driver.containsElement(h,i)){var o=w.get(i),d=_.get(i),p=e._buildInstruction(n,l,d,o);if(p.errors&&p.errors.length)k.push(p);else{if(n.isFallbackTransition)return t.onStart(function(){return Ak(i,p.fromStyles)}),t.onDestroy(function(){return Dk(i,p.toStyles)}),void r.push(t);p.timelines.forEach(function(n){return n.stretchStartingKeyframe=!0}),l.append(i,p.timelines),s.push({instruction:p,player:t,element:i}),p.queriedElements.forEach(function(n){return ck(a,n,[]).push(t)}),p.preStyleProps.forEach(function(n,t){var e=Object.keys(n);if(e.length){var l=u.get(t);l||u.set(t,l=new Set),e.forEach(function(n){return l.add(n)})}}),p.postStyleProps.forEach(function(n,t){var e=Object.keys(n),l=c.get(t);l||c.set(t,l=new Set),e.forEach(function(n){return l.add(n)})})}}else t.destroy()});if(k.length){var S=[];k.forEach(function(n){S.push("@"+n.triggerName+" has failed due to:\n"),n.errors.forEach(function(n){return S.push("- "+n+"\n")})}),M.forEach(function(n){return n.destroy()}),this.reportError(S)}var O=new Map,T=new Map;s.forEach(function(n){var t=n.element;l.has(t)&&(T.set(t,t),e._beforeAnimationBuild(n.player.namespaceId,n.instruction,O))}),r.forEach(function(n){var t=n.element;e._getPreviousPlayers(t,!1,n.namespaceId,n.triggerName,null).forEach(function(n){ck(O,t,[]).push(n),n.destroy()})});var L=g.filter(function(n){return HC(n,u,c)}),P=new Map;AC(P,this.driver,b,c,is).forEach(function(n){HC(n,u,c)&&L.push(n)});var D=new Map;f.forEach(function(n,t){AC(D,e.driver,new Set(n),u,ds)}),L.forEach(function(n){var t=P.get(n),e=D.get(n);P.set(n,Object(i.__assign)({},t,e))});var A=[],E=[],Y={};s.forEach(function(n){var t=n.element,i=n.player,s=n.instruction;if(l.has(t)){if(d.has(t))return i.onDestroy(function(){return Dk(t,s.toStyles)}),void r.push(i);var a=Y;if(T.size>1){for(var u=t,c=[];u=u.parentNode;){var h=T.get(u);if(h){a=h;break}c.push(u)}c.forEach(function(n){return T.set(n,a)})}var p=e._buildAnimation(i.namespaceId,s,O,o,D,P);if(i.setRealPlayer(p),a===Y)A.push(i);else{var f=e.playersByElement.get(a);f&&f.length&&(i.parentPlayer=ik(f)),r.push(i)}}else Ak(t,s.fromStyles),i.onDestroy(function(){return Dk(t,s.toStyles)}),E.push(i),d.has(t)&&r.push(i)}),E.forEach(function(n){var t=o.get(n.element);if(t&&t.length){var e=ik(t);n.setRealPlayer(e)}}),r.forEach(function(n){n.parentPlayer?n.syncPlayerEvents(n.parentPlayer):n.destroy()});for(var j=0;j0?this.driver.animate(n.element,t,n.duration,n.delay,n.easing,e):new us},n}(),LC=function(){function n(n,t,e){this.namespaceId=n,this.triggerName=t,this.element=e,this._player=new us,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1,this.queued=!0}return n.prototype.setRealPlayer=function(n){var t=this;this._containsRealPlayer||(this._player=n,Object.keys(this._queuedCallbacks).forEach(function(e){t._queuedCallbacks[e].forEach(function(t){return sk(n,e,void 0,t)})}),this._queuedCallbacks={},this._containsRealPlayer=!0,this.queued=!1)},n.prototype.getRealPlayer=function(){return this._player},n.prototype.syncPlayerEvents=function(n){var t=this,e=this._player;e.triggerCallback&&n.onStart(function(){return e.triggerCallback("start")}),n.onDone(function(){return t.finish()}),n.onDestroy(function(){return t.destroy()})},n.prototype._queueEvent=function(n,t){ck(this._queuedCallbacks,n,[]).push(t)},n.prototype.onDone=function(n){this.queued&&this._queueEvent("done",n),this._player.onDone(n)},n.prototype.onStart=function(n){this.queued&&this._queueEvent("start",n),this._player.onStart(n)},n.prototype.onDestroy=function(n){this.queued&&this._queueEvent("destroy",n),this._player.onDestroy(n)},n.prototype.init=function(){this._player.init()},n.prototype.hasStarted=function(){return!this.queued&&this._player.hasStarted()},n.prototype.play=function(){!this.queued&&this._player.play()},n.prototype.pause=function(){!this.queued&&this._player.pause()},n.prototype.restart=function(){!this.queued&&this._player.restart()},n.prototype.finish=function(){this._player.finish()},n.prototype.destroy=function(){this.destroyed=!0,this._player.destroy()},n.prototype.reset=function(){!this.queued&&this._player.reset()},n.prototype.setPosition=function(n){this.queued||this._player.setPosition(n)},n.prototype.getPosition=function(){return this.queued?0:this._player.getPosition()},Object.defineProperty(n.prototype,"totalTime",{get:function(){return this._player.totalTime},enumerable:!0,configurable:!0}),n.prototype.triggerCallback=function(n){var t=this._player;t.triggerCallback&&t.triggerCallback(n)},n}();function PC(n){return n&&1===n.nodeType}function DC(n,t){var e=n.style.display;return n.style.display=null!=t?t:"none",e}function AC(n,t,e,l,r){var i=[];e.forEach(function(n){return i.push(DC(n))});var o=[];l.forEach(function(e,l){var i={};e.forEach(function(n){var e=i[n]=t.computeStyle(l,n,r);e&&0!=e.length||(l[MC]=xC,o.push(l))}),n.set(l,i)});var s=0;return e.forEach(function(n){return DC(n,i[s++])}),o}function EC(n,t){var e=new Map;if(n.forEach(function(n){return e.set(n,[])}),0==t.length)return e;var l=new Set(t),r=new Map;return t.forEach(function(n){var t=function n(t){if(!t)return 1;var i=r.get(t);if(i)return i;var o=t.parentNode;return i=e.has(o)?o:l.has(o)?1:n(o),r.set(t,i),i}(n);1!==t&&e.get(t).push(n)}),e}var YC="$$classes";function jC(n,t){if(n.classList)n.classList.add(t);else{var e=n[YC];e||(e=n[YC]={}),e[t]=!0}}function IC(n,t){if(n.classList)n.classList.remove(t);else{var e=n[YC];e&&delete e[t]}}function RC(n,t,e){ik(e).onDone(function(){return n.processLeaveNode(t)})}function HC(n,t,e){var l=e.get(n);if(!l)return!1;var r=t.get(n);return r?l.forEach(function(n){return r.add(n)}):t.set(n,l),e.delete(n),!0}var NC=function(){function n(n,t){var e=this;this._driver=n,this._triggerCache={},this.onRemovalComplete=function(n,t){},this._transitionEngine=new TC(n,t),this._timelineEngine=new bC(n,t),this._transitionEngine.onRemovalComplete=function(n,t){return e.onRemovalComplete(n,t)}}return n.prototype.registerTrigger=function(n,t,e,l,r){var i=n+"-"+l,o=this._triggerCache[i];if(!o){var s=[],a=Gk(this._driver,r,s);if(s.length)throw new Error('The animation trigger "'+l+'" has failed to build due to the following errors:\n - '+s.join("\n - "));o=function(n,t){return new mC(n,t)}(l,a),this._triggerCache[i]=o}this._transitionEngine.registerTrigger(t,l,o)},n.prototype.register=function(n,t){this._transitionEngine.register(n,t)},n.prototype.destroy=function(n,t){this._transitionEngine.destroy(n,t)},n.prototype.onInsert=function(n,t,e,l){this._transitionEngine.insertNode(n,t,e,l)},n.prototype.onRemove=function(n,t,e){this._transitionEngine.removeNode(n,t,e)},n.prototype.disableAnimations=function(n,t){this._transitionEngine.markElementAsDisabled(n,t)},n.prototype.process=function(n,t,e,l){if("@"==e.charAt(0)){var r=dk(e);this._timelineEngine.command(r[0],t,r[1],l)}else this._transitionEngine.trigger(n,t,e,l)},n.prototype.listen=function(n,t,e,l,r){if("@"==e.charAt(0)){var i=dk(e);return this._timelineEngine.listen(i[0],t,i[1],r)}return this._transitionEngine.listen(n,t,e,l,r)},n.prototype.flush=function(n){void 0===n&&(n=-1),this._transitionEngine.flush(n)},Object.defineProperty(n.prototype,"players",{get:function(){return this._transitionEngine.players.concat(this._timelineEngine.players)},enumerable:!0,configurable:!0}),n.prototype.whenRenderingDone=function(){return this._transitionEngine.whenRenderingDone()},n}(),FC=function(n){function t(t,e){var r=n.call(this)||this;return r._nextAnimationId=0,r._renderer=t.createRenderer(e.body,{id:"0",encapsulation:l.S.None,styles:[],data:{animation:[]}}),r}return Object(i.__extends)(t,n),t.prototype.build=function(n){var t=this._nextAnimationId.toString();this._nextAnimationId++;var e=Array.isArray(n)?os(n):n;return WC(this._renderer,null,t,"register",[e]),new BC(t,this._renderer)},t}(rs),BC=function(n){function t(t,e){var l=n.call(this)||this;return l._id=t,l._renderer=e,l}return Object(i.__extends)(t,n),t.prototype.create=function(n,t){return new VC(this._id,n,t||{},this._renderer)},t}(function(){}),VC=function(){function n(n,t,e,l){this.id=n,this.element=t,this._renderer=l,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",e)}return n.prototype._listen=function(n,t){return this._renderer.listen(this.element,"@@"+this.id+":"+n,t)},n.prototype._command=function(n){for(var t=[],e=1;e=0&&n=11?n:n+12:"sore"===t||"malam"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"pagi":n<15?"siang":n<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(e("PJh5"))},z3hR:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return t?r[e][0]:r[e][1]}function e(n){if(n=parseInt(n,10),isNaN(n))return!1;if(n<0)return!0;if(n<10)return 4<=n&&n<=7;if(n<100){var t=n%10;return e(0===t?n/10:t)}if(n<1e4){for(;n>=10;)n/=10;return e(n)}return e(n/=1e3)}n.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(n){return e(n.substr(0,n.indexOf(" ")))?"a "+n:"an "+n},past:function(n){return e(n.substr(0,n.indexOf(" ")))?"viru "+n:"virun "+n},s:"e puer Sekonnen",ss:"%d Sekonnen",m:t,mm:"%d Minutten",h:t,hh:"%d Stonnen",d:t,dd:"%d Deeg",M:t,MM:"%d M\xe9int",y:t,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))}},[0]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.b001397656dd94b099f7.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.b001397656dd94b099f7.js new file mode 100644 index 0000000000..92a3631b03 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.b001397656dd94b099f7.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{"+ix3":function(e,t,n){var i={"./bip39-word-list.json":["zJtG",11],"./i18n/en.json":["amrp",1],"./i18n/es.json":["ZF/7",2],"./i18n/es_base.json":["bIFx",3],"./i18n/ru.json":["3Al/",4],"./i18n/zh.json":["+dwz",5],"./i18n/zh_base.json":["mJbx",6]};function r(e){if(!n.o(i,e))return Promise.resolve().then(function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=i[e],r=t[0];return n.e(t[1]).then(function(){return n.t(r,3)})}r.keys=function(){return Object.keys(i)},r.id="+ix3",e.exports=r},"+s0g":function(e,t,n){!function(e){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),i=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;e.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("wd/R"))},"//9w":function(e,t,n){!function(e){"use strict";e.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},"/X5v":function(e,t,n){!function(e){"use strict";e.defineLocale("x-pseudo",{months:"J~\xe1\xf1\xfa\xe1~r\xfd_F~\xe9br\xfa~\xe1r\xfd_~M\xe1rc~h_\xc1p~r\xedl_~M\xe1\xfd_~J\xfa\xf1\xe9~_J\xfal~\xfd_\xc1\xfa~g\xfast~_S\xe9p~t\xe9mb~\xe9r_\xd3~ct\xf3b~\xe9r_\xd1~\xf3v\xe9m~b\xe9r_~D\xe9c\xe9~mb\xe9r".split("_"),monthsShort:"J~\xe1\xf1_~F\xe9b_~M\xe1r_~\xc1pr_~M\xe1\xfd_~J\xfa\xf1_~J\xfal_~\xc1\xfag_~S\xe9p_~\xd3ct_~\xd1\xf3v_~D\xe9c".split("_"),monthsParseExact:!0,weekdays:"S~\xfa\xf1d\xe1~\xfd_M\xf3~\xf1d\xe1\xfd~_T\xfa\xe9~sd\xe1\xfd~_W\xe9d~\xf1\xe9sd~\xe1\xfd_T~h\xfars~d\xe1\xfd_~Fr\xedd~\xe1\xfd_S~\xe1t\xfar~d\xe1\xfd".split("_"),weekdaysShort:"S~\xfa\xf1_~M\xf3\xf1_~T\xfa\xe9_~W\xe9d_~Th\xfa_~Fr\xed_~S\xe1t".split("_"),weekdaysMin:"S~\xfa_M\xf3~_T\xfa_~W\xe9_T~h_Fr~_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~\xf3d\xe1~\xfd \xe1t] LT",nextDay:"[T~\xf3m\xf3~rr\xf3~w \xe1t] LT",nextWeek:"dddd [\xe1t] LT",lastDay:"[\xdd~\xe9st~\xe9rd\xe1~\xfd \xe1t] LT",lastWeek:"[L~\xe1st] dddd [\xe1t] LT",sameElse:"L"},relativeTime:{future:"\xed~\xf1 %s",past:"%s \xe1~g\xf3",s:"\xe1 ~f\xe9w ~s\xe9c\xf3~\xf1ds",ss:"%d s~\xe9c\xf3\xf1~ds",m:"\xe1 ~m\xed\xf1~\xfat\xe9",mm:"%d m~\xed\xf1\xfa~t\xe9s",h:"\xe1~\xf1 h\xf3~\xfar",hh:"%d h~\xf3\xfars",d:"\xe1 ~d\xe1\xfd",dd:"%d d~\xe1\xfds",M:"\xe1 ~m\xf3\xf1~th",MM:"%d m~\xf3\xf1t~hs",y:"\xe1 ~\xfd\xe9\xe1r",yy:"%d \xfd~\xe9\xe1rs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},0:function(e,t,n){e.exports=n("zUnb")},"0mo+":function(e,t,n){!function(e){"use strict";var t={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},n={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};e.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(e){return e.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===t&&e>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===t&&e<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===t?e+12:e},meridiem:function(e,t,n){return e<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":e<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":e<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":e<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(n("wd/R"))},"0tRk":function(e,t,n){!function(e){"use strict";e.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba"})}(n("wd/R"))},"1rYy":function(e,t,n){!function(e){"use strict";e.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(e){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(e)},meridiem:function(e){return e<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":e<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":e<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(e,t){switch(t){case"DDD":case"w":case"W":case"DDDo":return 1===e?e+"-\u056b\u0576":e+"-\u0580\u0564";default:return e}},week:{dow:1,doy:7}})}(n("wd/R"))},"1xZ4":function(e,t,n){!function(e){"use strict";e.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(e,t){var n=1===e?"r":2===e?"n":3===e?"r":4===e?"t":"\xe8";return"w"!==t&&"W"!==t||(n="a"),e+n},week:{dow:1,doy:4}})}(n("wd/R"))},"2fjn":function(e,t,n){!function(e){"use strict";e.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}}})}(n("wd/R"))},"2ykv":function(e,t,n){!function(e){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),i=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;e.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("wd/R"))},"3E1r":function(e,t,n){!function(e){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};e.defineLocale("hi",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0930\u093e\u0924"===t?e<4?e:e+12:"\u0938\u0941\u092c\u0939"===t?e:"\u0926\u094b\u092a\u0939\u0930"===t?e>=10?e:e+12:"\u0936\u093e\u092e"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0930\u093e\u0924":e<10?"\u0938\u0941\u092c\u0939":e<17?"\u0926\u094b\u092a\u0939\u0930":e<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(n("wd/R"))},"49sm":function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return"[object Array]"==n.call(e)}},"4MV3":function(e,t,n){!function(e){"use strict";var t={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},n={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};e.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ac7\u0ab9\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(e){return e.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0ab0\u0abe\u0aa4"===t?e<4?e:e+12:"\u0ab8\u0ab5\u0abe\u0ab0"===t?e:"\u0aac\u0aaa\u0acb\u0ab0"===t?e>=10?e:e+12:"\u0ab8\u0abe\u0a82\u0a9c"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0ab0\u0abe\u0aa4":e<10?"\u0ab8\u0ab5\u0abe\u0ab0":e<17?"\u0aac\u0aaa\u0acb\u0ab0":e<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(n("wd/R"))},"4dOw":function(e,t,n){!function(e){"use strict";e.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},"5ey7":function(e,t,n){var i={"./en.json":["amrp",1],"./es.json":["ZF/7",2],"./es_base.json":["bIFx",3],"./ru.json":["3Al/",4],"./zh.json":["+dwz",5],"./zh_base.json":["mJbx",6]};function r(e){if(!n.o(i,e))return Promise.resolve().then(function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=i[e],r=t[0];return n.e(t[1]).then(function(){return n.t(r,3)})}r.keys=function(){return Object.keys(i)},r.id="5ey7",e.exports=r},"6+QB":function(e,t,n){!function(e){"use strict";e.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,t){return 12===e&&(e=0),"pagi"===t?e:"tengahari"===t?e>=11?e:e+12:"petang"===t||"malam"===t?e+12:void 0},meridiem:function(e,t,n){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("wd/R"))},"6B0Y":function(e,t,n){!function(e){"use strict";e.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysMin:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},week:{dow:1,doy:4}})}(n("wd/R"))},"7BjC":function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={s:["m\xf5ne sekundi","m\xf5ni sekund","paar sekundit"],ss:[e+"sekundi",e+"sekundit"],m:["\xfche minuti","\xfcks minut"],mm:[e+" minuti",e+" minutit"],h:["\xfche tunni","tund aega","\xfcks tund"],hh:[e+" tunni",e+" tundi"],d:["\xfche p\xe4eva","\xfcks p\xe4ev"],M:["kuu aja","kuu aega","\xfcks kuu"],MM:[e+" kuu",e+" kuud"],y:["\xfche aasta","aasta","\xfcks aasta"],yy:[e+" aasta",e+" aastat"]};return t?r[n][2]?r[n][2]:r[n][1]:i?r[n][0]:r[n][1]}e.defineLocale("et",{months:"jaanuar_veebruar_m\xe4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xe4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"p\xfchap\xe4ev_esmasp\xe4ev_teisip\xe4ev_kolmap\xe4ev_neljap\xe4ev_reede_laup\xe4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[T\xe4na,] LT",nextDay:"[Homme,] LT",nextWeek:"[J\xe4rgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s p\xe4rast",past:"%s tagasi",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:"%d p\xe4eva",M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},"7aV9":function(e,t,n){!function(e){"use strict";e.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(e){return e+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(e){return"\u0db4.\u0dc0."===e||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===e},meridiem:function(e,t,n){return e>11?n?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":n?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(n("wd/R"))},"8/+R":function(e,t,n){!function(e){"use strict";var t={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},n={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};e.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(e){return e.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0a30\u0a3e\u0a24"===t?e<4?e:e+12:"\u0a38\u0a35\u0a47\u0a30"===t?e:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===t?e>=10?e:e+12:"\u0a38\u0a3c\u0a3e\u0a2e"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0a30\u0a3e\u0a24":e<10?"\u0a38\u0a35\u0a47\u0a30":e<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":e<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(n("wd/R"))},"8mBD":function(e,t,n){!function(e){"use strict";e.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},"9rRi":function(e,t,n){!function(e){"use strict";e.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){return e+(1===e?"d":e%10==2?"na":"mh")},week:{dow:1,doy:4}})}(n("wd/R"))},"A+xa":function(e,t,n){!function(e){"use strict";e.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(e){return e+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(e)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(e)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(n("wd/R"))},AQ68:function(e,t,n){!function(e){"use strict";e.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(n("wd/R"))},AvvY:function(e,t,n){!function(e){"use strict";e.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===t&&e>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===t||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===t?e+12:e},meridiem:function(e,t,n){return e<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":e<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":e<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":e<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(n("wd/R"))},B55N:function(e,t,n){!function(e){"use strict";e.defineLocale("ja",{months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(e){return"\u5348\u5f8c"===e},meridiem:function(e,t,n){return e<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:"[\u6765\u9031]dddd LT",lastDay:"[\u6628\u65e5] LT",lastWeek:"[\u524d\u9031]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"\u65e5";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}})}(n("wd/R"))},BVg3:function(e,t,n){!function(e){"use strict";function t(e){return e%100==11||e%10!=1}function n(e,n,i,r){var a=e+" ";switch(i){case"s":return n||r?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return t(e)?a+(n||r?"sek\xfandur":"sek\xfandum"):a+"sek\xfanda";case"m":return n?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return t(e)?a+(n||r?"m\xedn\xfatur":"m\xedn\xfatum"):n?a+"m\xedn\xfata":a+"m\xedn\xfatu";case"hh":return t(e)?a+(n||r?"klukkustundir":"klukkustundum"):a+"klukkustund";case"d":return n?"dagur":r?"dag":"degi";case"dd":return t(e)?n?a+"dagar":a+(r?"daga":"d\xf6gum"):n?a+"dagur":a+(r?"dag":"degi");case"M":return n?"m\xe1nu\xf0ur":r?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return t(e)?n?a+"m\xe1nu\xf0ir":a+(r?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):n?a+"m\xe1nu\xf0ur":a+(r?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return n||r?"\xe1r":"\xe1ri";case"yy":return t(e)?a+(n||r?"\xe1r":"\xe1rum"):a+(n||r?"\xe1r":"\xe1ri")}}e.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:n,ss:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},ByF4:function(e,t,n){!function(e){"use strict";e.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minutt",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0i",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},CjzT:function(e,t,n){!function(e){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),i=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;e.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},CoRJ:function(e,t,n){!function(e){"use strict";e.defineLocale("ar-ma",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:6,doy:12}})}(n("wd/R"))},"D/JM":function(e,t,n){!function(e){"use strict";e.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))},"DKr+":function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={s:["thodde secondanim","thodde second"],ss:[e+" secondanim",e+" second"],m:["eka mintan","ek minute"],mm:[e+" mintanim",e+" mintam"],h:["eka horan","ek hor"],hh:[e+" horanim",e+" hor"],d:["eka disan","ek dis"],dd:[e+" disanim",e+" dis"],M:["eka mhoinean","ek mhoino"],MM:[e+" mhoineanim",e+" mhoine"],y:["eka vorsan","ek voros"],yy:[e+" vorsanim",e+" vorsam"]};return t?r[n][0]:r[n][1]}e.defineLocale("gom-latn",{months:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Ieta to] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fatlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(e,t){switch(t){case"D":return e+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:1,doy:4},meridiemParse:/rati|sokalli|donparam|sanje/,meridiemHour:function(e,t){return 12===e&&(e=0),"rati"===t?e<4?e:e+12:"sokalli"===t?e:"donparam"===t?e>12?e:e+12:"sanje"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"rati":e<12?"sokalli":e<16?"donparam":e<20?"sanje":"rati"}})}(n("wd/R"))},Dkky:function(e,t,n){!function(e){"use strict";e.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}})}(n("wd/R"))},Dmvi:function(e,t,n){!function(e){"use strict";e.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},DoHr:function(e,t,n){!function(e){"use strict";var t={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};e.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xc7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(e,n){switch(n){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'\u0131nc\u0131";var i=e%10;return e+(t[i]||t[e%100-i]||t[e>=100?100:null])}},week:{dow:1,doy:7}})}(n("wd/R"))},DxQv:function(e,t,n){!function(e){"use strict";e.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8n_man_tir_ons_tor_fre_l\xf8r".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"p\xe5 dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xe5 sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"et \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},Dzi0:function(e,t,n){!function(e){"use strict";e.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}})}(n("wd/R"))},"E+lV":function(e,t,n){!function(e){"use strict";var t={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u0435 \u043c\u0438\u043d\u0443\u0442\u0435"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0435","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],yy:["\u0433\u043e\u0434\u0438\u043d\u0430","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,n,i){var r=t.words[i];return 1===i.length?n?r[0]:r[1]:e+" "+t.correctGrammaticalCase(e,r)}};e.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"\u0434\u0430\u043d",dd:t.translate,M:"\u043c\u0435\u0441\u0435\u0446",MM:t.translate,y:"\u0433\u043e\u0434\u0438\u043d\u0443",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))},EOgW:function(e,t,n){!function(e){"use strict";e.defineLocale("th",{months:"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21_\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c_\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21_\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19_\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21_\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19_\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21_\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21_\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19_\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21_\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19_\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split("_"),monthsShort:"\u0e21.\u0e04._\u0e01.\u0e1e._\u0e21\u0e35.\u0e04._\u0e40\u0e21.\u0e22._\u0e1e.\u0e04._\u0e21\u0e34.\u0e22._\u0e01.\u0e04._\u0e2a.\u0e04._\u0e01.\u0e22._\u0e15.\u0e04._\u0e1e.\u0e22._\u0e18.\u0e04.".split("_"),monthsParseExact:!0,weekdays:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysShort:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysMin:"\u0e2d\u0e32._\u0e08._\u0e2d._\u0e1e._\u0e1e\u0e24._\u0e28._\u0e2a.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm",LLLL:"\u0e27\u0e31\u0e19dddd\u0e17\u0e35\u0e48 D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm"},meridiemParse:/\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07|\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07/,isPM:function(e){return"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"===e},meridiem:function(e,t,n){return e<12?"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07":"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"},calendar:{sameDay:"[\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextDay:"[\u0e1e\u0e23\u0e38\u0e48\u0e07\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextWeek:"dddd[\u0e2b\u0e19\u0e49\u0e32 \u0e40\u0e27\u0e25\u0e32] LT",lastDay:"[\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",lastWeek:"[\u0e27\u0e31\u0e19]dddd[\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 \u0e40\u0e27\u0e25\u0e32] LT",sameElse:"L"},relativeTime:{future:"\u0e2d\u0e35\u0e01 %s",past:"%s\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27",s:"\u0e44\u0e21\u0e48\u0e01\u0e35\u0e48\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",ss:"%d \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",m:"1 \u0e19\u0e32\u0e17\u0e35",mm:"%d \u0e19\u0e32\u0e17\u0e35",h:"1 \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",hh:"%d \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",d:"1 \u0e27\u0e31\u0e19",dd:"%d \u0e27\u0e31\u0e19",M:"1 \u0e40\u0e14\u0e37\u0e2d\u0e19",MM:"%d \u0e40\u0e14\u0e37\u0e2d\u0e19",y:"1 \u0e1b\u0e35",yy:"%d \u0e1b\u0e35"}})}(n("wd/R"))},G0Uy:function(e,t,n){!function(e){"use strict";e.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},H7XF:function(e,t,n){"use strict";t.byteLength=function(e){var t=l(e),n=t[1];return 3*(t[0]+n)/4-n},t.toByteArray=function(e){var t,n,i=l(e),o=i[0],s=i[1],u=new a(function(e,t,n){return 3*(t+n)/4-n}(0,o,s)),c=0,d=s>0?o-4:o;for(n=0;n>16&255,u[c++]=t>>8&255,u[c++]=255&t;return 2===s&&(t=r[e.charCodeAt(n)]<<2|r[e.charCodeAt(n+1)]>>4,u[c++]=255&t),1===s&&(t=r[e.charCodeAt(n)]<<10|r[e.charCodeAt(n+1)]<<4|r[e.charCodeAt(n+2)]>>2,u[c++]=t>>8&255,u[c++]=255&t),u},t.fromByteArray=function(e){for(var t,n=e.length,r=n%3,a=[],o=16383,s=0,u=n-r;su?u:s+o));return 1===r?a.push(i[(t=e[n-1])>>2]+i[t<<4&63]+"=="):2===r&&a.push(i[(t=(e[n-2]<<8)+e[n-1])>>10]+i[t>>4&63]+i[t<<2&63]+"="),a.join("")};for(var i=[],r=[],a="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,u=o.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function c(e,t,n){for(var r,a=[],o=t;o>18&63]+i[r>>12&63]+i[r>>6&63]+i[63&r]);return a.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},H8ED:function(e,t,n){!function(e){"use strict";function t(e,t,n){return"m"===n?t?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===n?t?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":e+" "+(i=+e,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:t?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[n].split("_"),i%10==1&&i%100!=11?r[0]:i%10>=2&&i%10<=4&&(i%100<10||i%100>=20)?r[1]:r[2]);var i,r}e.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:t,mm:t,h:t,hh:t,d:"\u0434\u0437\u0435\u043d\u044c",dd:t,M:"\u043c\u0435\u0441\u044f\u0446",MM:t,y:"\u0433\u043e\u0434",yy:t},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(e)},meridiem:function(e,t,n){return e<4?"\u043d\u043e\u0447\u044b":e<12?"\u0440\u0430\u043d\u0456\u0446\u044b":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e%10!=2&&e%10!=3||e%100==12||e%100==13?e+"-\u044b":e+"-\u0456";case"D":return e+"-\u0433\u0430";default:return e}},week:{dow:1,doy:7}})}(n("wd/R"))},HP3h:function(e,t,n){!function(e){"use strict";var t={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},n=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},i={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},r=function(e){return function(t,r,a,o){var s=n(t),u=i[e][n(t)];return 2===s&&(u=u[r?0:1]),u.replace(/%d/i,t)}},a=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];e.defineLocale("ar-ly",{months:a,monthsShort:a,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,t,n){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:r("s"),ss:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n("wd/R"))},I2Jj:function(e,t,n){var i=n("hwdV").Buffer;e.exports=function(e){if(e.length>=255)throw new TypeError("Alphabet too long");var t=new Uint8Array(256);t.fill(255);for(var n=0;n>>0,c=new Uint8Array(l);e[n];){var d=t[e.charCodeAt(n)];if(255===d)return;for(var h=0,f=l-1;(0!==d||h>>0)%256>>>0,d=d/256>>>0;if(0!==d)throw new Error("Non-zero carry");a=h,n++}if(" "!==e[n]){for(var p=l-a;p!==l&&0===c[p];)p++;var m=i.allocUnsafe(r+(l-p));m.fill(0,0,r);for(var g=r;p!==l;)m[g++]=c[p++];return m}}}return{encode:function(t){if(!i.isBuffer(t))throw new TypeError("Expected Buffer");if(0===t.length)return"";for(var n=0,r=0,a=0,u=t.length;a!==u&&0===t[a];)a++,n++;for(var c=(u-a)*l+1>>>0,d=new Uint8Array(c);a!==u;){for(var h=t[a],f=0,p=c-1;(0!==h||f>>0)%o>>>0,h=h/o>>>0;if(0!==h)throw new Error("Non-zero carry");r=f,a++}for(var m=c-r;m!==c&&0===d[m];)m++;for(var g=s.repeat(n);m10&&e<20}function r(e){return t[e].split("_")}function a(e,t,a,o){var s=e+" ";return 1===e?s+n(0,t,a[0],o):t?s+(i(e)?r(a)[1]:r(a)[0]):o?s+r(a)[1]:s+(i(e)?r(a)[1]:r(a)[2])}e.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(e,t,n,i){return t?"kelios sekund\u0117s":i?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:a,m:n,mm:a,h:n,hh:a,d:n,dd:a,M:n,MM:a,y:n,yy:a},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}})}(n("wd/R"))},"K/tc":function(e,t,n){!function(e){"use strict";e.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,t,n){return e<12?n?"vm":"VM":n?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("wd/R"))},KSF8:function(e,t,n){!function(e){"use strict";e.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,t,n){return e<12?n?"sa":"SA":n?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n r\u1ed3i l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}})}(n("wd/R"))},KTz0:function(e,t,n){!function(e){"use strict";var t={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,n,i){var r=t.words[i];return 1===i.length?n?r[0]:r[1]:e+" "+t.correctGrammaticalCase(e,r)}};e.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mjesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))},Loxo:function(e,t,n){!function(e){"use strict";e.defineLocale("uz",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u042f\u043a\u0448\u0430\u043d\u0431\u0430_\u0414\u0443\u0448\u0430\u043d\u0431\u0430_\u0421\u0435\u0448\u0430\u043d\u0431\u0430_\u0427\u043e\u0440\u0448\u0430\u043d\u0431\u0430_\u041f\u0430\u0439\u0448\u0430\u043d\u0431\u0430_\u0416\u0443\u043c\u0430_\u0428\u0430\u043d\u0431\u0430".split("_"),weekdaysShort:"\u042f\u043a\u0448_\u0414\u0443\u0448_\u0421\u0435\u0448_\u0427\u043e\u0440_\u041f\u0430\u0439_\u0416\u0443\u043c_\u0428\u0430\u043d".split("_"),weekdaysMin:"\u042f\u043a_\u0414\u0443_\u0421\u0435_\u0427\u043e_\u041f\u0430_\u0416\u0443_\u0428\u0430".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[\u0411\u0443\u0433\u0443\u043d \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",nextDay:"[\u042d\u0440\u0442\u0430\u0433\u0430] LT [\u0434\u0430]",nextWeek:"dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastDay:"[\u041a\u0435\u0447\u0430 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastWeek:"[\u0423\u0442\u0433\u0430\u043d] dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",sameElse:"L"},relativeTime:{future:"\u042f\u043a\u0438\u043d %s \u0438\u0447\u0438\u0434\u0430",past:"\u0411\u0438\u0440 \u043d\u0435\u0447\u0430 %s \u043e\u043b\u0434\u0438\u043d",s:"\u0444\u0443\u0440\u0441\u0430\u0442",ss:"%d \u0444\u0443\u0440\u0441\u0430\u0442",m:"\u0431\u0438\u0440 \u0434\u0430\u043a\u0438\u043a\u0430",mm:"%d \u0434\u0430\u043a\u0438\u043a\u0430",h:"\u0431\u0438\u0440 \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u0431\u0438\u0440 \u043e\u0439",MM:"%d \u043e\u0439",y:"\u0431\u0438\u0440 \u0439\u0438\u043b",yy:"%d \u0439\u0438\u043b"},week:{dow:1,doy:7}})}(n("wd/R"))},OIYi:function(e,t,n){!function(e){"use strict";e.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}})}(n("wd/R"))},Oaa7:function(e,t,n){!function(e){"use strict";e.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},Ob0Z:function(e,t,n){!function(e){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function i(e,t,n,i){var r="";if(t)switch(n){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":r="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":r="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":r="%d \u0924\u093e\u0938";break;case"d":r="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":r="%d \u0926\u093f\u0935\u0938";break;case"M":r="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":r="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u0947"}else switch(n){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":r="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":r="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":r="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":r="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":r="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":r="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":r="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return r.replace(/%d/i,e)}e.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0930\u093e\u0924\u094d\u0930\u0940|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0930\u093e\u0924\u094d\u0930\u0940"===t?e<4?e:e+12:"\u0938\u0915\u093e\u0933\u0940"===t?e:"\u0926\u0941\u092a\u093e\u0930\u0940"===t?e>=10?e:e+12:"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0930\u093e\u0924\u094d\u0930\u0940":e<10?"\u0938\u0915\u093e\u0933\u0940":e<17?"\u0926\u0941\u092a\u093e\u0930\u0940":e<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(n("wd/R"))},OjkT:function(e,t,n){!function(e){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};e.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0930\u093e\u0924\u093f"===t?e<4?e:e+12:"\u092c\u093f\u0939\u093e\u0928"===t?e:"\u0926\u093f\u0909\u0901\u0938\u094b"===t?e>=10?e:e+12:"\u0938\u093e\u0901\u091d"===t?e+12:void 0},meridiem:function(e,t,n){return e<3?"\u0930\u093e\u0924\u093f":e<12?"\u092c\u093f\u0939\u093e\u0928":e<16?"\u0926\u093f\u0909\u0901\u0938\u094b":e<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(n("wd/R"))},Oxv6:function(e,t,n){!function(e){"use strict";var t={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};e.defineLocale("tg",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u041f\u0430\u0433\u043e\u04b3 \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0448\u0430\u0431"===t?e<4?e:e+12:"\u0441\u0443\u0431\u04b3"===t?e:"\u0440\u04ef\u0437"===t?e>=11?e:e+12:"\u0431\u0435\u0433\u043e\u04b3"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0448\u0430\u0431":e<11?"\u0441\u0443\u0431\u04b3":e<16?"\u0440\u04ef\u0437":e<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(e){return e+(t[e]||t[e%10]||t[e>=100?100:null])},week:{dow:1,doy:7}})}(n("wd/R"))},PA2r:function(e,t,n){!function(e){"use strict";var t="leden_\xfanor_b\u0159ezen_duben_kv\u011bten_\u010derven_\u010dervenec_srpen_z\xe1\u0159\xed_\u0159\xedjen_listopad_prosinec".split("_"),n="led_\xfano_b\u0159e_dub_kv\u011b_\u010dvn_\u010dvc_srp_z\xe1\u0159_\u0159\xedj_lis_pro".split("_");function i(e){return e>1&&e<5&&1!=~~(e/10)}function r(e,t,n,r){var a=e+" ";switch(n){case"s":return t||r?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return t||r?a+(i(e)?"sekundy":"sekund"):a+"sekundami";case"m":return t?"minuta":r?"minutu":"minutou";case"mm":return t||r?a+(i(e)?"minuty":"minut"):a+"minutami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?a+(i(e)?"hodiny":"hodin"):a+"hodinami";case"d":return t||r?"den":"dnem";case"dd":return t||r?a+(i(e)?"dny":"dn\xed"):a+"dny";case"M":return t||r?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return t||r?a+(i(e)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):a+"m\u011bs\xedci";case"y":return t||r?"rok":"rokem";case"yy":return t||r?a+(i(e)?"roky":"let"):a+"lety"}}e.defineLocale("cs",{months:t,monthsShort:n,monthsParse:function(e,t){var n,i=[];for(n=0;n<12;n++)i[n]=new RegExp("^"+e[n]+"$|^"+t[n]+"$","i");return i}(t,n),shortMonthsParse:function(e){var t,n=[];for(t=0;t<12;t++)n[t]=new RegExp("^"+e[t]+"$","i");return n}(n),longMonthsParse:function(e){var t,n=[];for(t=0;t<12;t++)n[t]=new RegExp("^"+e[t]+"$","i");return n}(t),weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},PeUW:function(e,t,n){!function(e){"use strict";var t={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},n={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};e.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(e){return e+"\u0bb5\u0ba4\u0bc1"},preparse:function(e){return e.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(e,t,n){return e<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":e<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":e<10?" \u0b95\u0bbe\u0bb2\u0bc8":e<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":e<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":e<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(e,t){return 12===e&&(e=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===t?e<2?e:e+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===t||"\u0b95\u0bbe\u0bb2\u0bc8"===t||"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===t&&e>=10?e:e+12},week:{dow:0,doy:6}})}(n("wd/R"))},PpIw:function(e,t,n){!function(e){"use strict";var t={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},n={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};e.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(e){return e.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===t?e<4?e:e+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===t?e:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===t?e>=10?e:e+12:"\u0cb8\u0c82\u0c9c\u0cc6"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":e<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":e<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":e<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(e){return e+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(n("wd/R"))},Qj4J:function(e,t,n){!function(e){"use strict";e.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(n("wd/R"))},RAwQ:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return t?r[n][0]:r[n][1]}function n(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;if(e<100){var t=e%10;return n(0===t?e/10:t)}if(e<1e4){for(;e>=10;)e/=10;return n(e)}return n(e/=1e3)}e.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(e){return n(e.substr(0,e.indexOf(" ")))?"a "+e:"an "+e},past:function(e){return n(e.substr(0,e.indexOf(" ")))?"viru "+e:"virun "+e},s:"e puer Sekonnen",ss:"%d Sekonnen",m:t,mm:"%d Minutten",h:t,hh:"%d Stonnen",d:t,dd:"%d Deeg",M:t,MM:"%d M\xe9int",y:t,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},RnhZ:function(e,t,n){var i={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function r(e){var t=a(e);return n(t)}function a(e){if(!n.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}r.keys=function(){return Object.keys(i)},r.resolve=a,e.exports=r,r.id="RnhZ"},S6ln:function(e,t,n){!function(e){"use strict";function t(e,t,n){var i=e+" ";switch(n){case"ss":return i+(1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi");case"m":return t?"jedna minuta":"jedne minute";case"mm":return i+(1===e?"minuta":2===e||3===e||4===e?"minute":"minuta");case"h":return t?"jedan sat":"jednog sata";case"hh":return i+(1===e?"sat":2===e||3===e||4===e?"sata":"sati");case"dd":return i+(1===e?"dan":"dana");case"MM":return i+(1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci");case"yy":return i+(1===e?"godina":2===e||3===e||4===e?"godine":"godina")}}e.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))},SFxW:function(e,t,n){!function(e){"use strict";var t={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-\xfcnc\xfc",4:"-\xfcnc\xfc",100:"-\xfcnc\xfc",6:"-nc\u0131",9:"-uncu",10:"-uncu",30:"-uncu",60:"-\u0131nc\u0131",90:"-\u0131nc\u0131"};e.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ert\u0259si_\xc7\u0259r\u015f\u0259nb\u0259 ax\u015fam\u0131_\xc7\u0259r\u015f\u0259nb\u0259_C\xfcm\u0259 ax\u015fam\u0131_C\xfcm\u0259_\u015e\u0259nb\u0259".split("_"),weekdaysShort:"Baz_BzE_\xc7Ax_\xc7\u0259r_CAx_C\xfcm_\u015e\u0259n".split("_"),weekdaysMin:"Bz_BE_\xc7A_\xc7\u0259_CA_C\xfc_\u015e\u0259".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[g\u0259l\u0259n h\u0259ft\u0259] dddd [saat] LT",lastDay:"[d\xfcn\u0259n] LT",lastWeek:"[ke\xe7\u0259n h\u0259ft\u0259] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \u0259vv\u0259l",s:"birne\xe7\u0259 saniyy\u0259",ss:"%d saniy\u0259",m:"bir d\u0259qiq\u0259",mm:"%d d\u0259qiq\u0259",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gec\u0259|s\u0259h\u0259r|g\xfcnd\xfcz|ax\u015fam/,isPM:function(e){return/^(g\xfcnd\xfcz|ax\u015fam)$/.test(e)},meridiem:function(e,t,n){return e<4?"gec\u0259":e<12?"s\u0259h\u0259r":e<17?"g\xfcnd\xfcz":"ax\u015fam"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0131nc\u0131|inci|nci|\xfcnc\xfc|nc\u0131|uncu)/,ordinal:function(e){if(0===e)return e+"-\u0131nc\u0131";var n=e%10;return e+(t[n]||t[e%100-n]||t[e>=100?100:null])},week:{dow:1,doy:7}})}(n("wd/R"))},SatO:function(e,t,n){!function(e){"use strict";e.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?e:"\u4e2d\u5348"===t?e>=11?e:e+12:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?e+12:void 0},meridiem:function(e,t,n){var i=100*e+t;return i<600?"\u51cc\u6668":i<900?"\u65e9\u4e0a":i<1130?"\u4e0a\u5348":i<1230?"\u4e2d\u5348":i<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n("wd/R"))},UDhR:function(e,t,n){!function(e){"use strict";e.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,t){return 12===e&&(e=0),"pagi"===t?e:"siang"===t?e>=11?e:e+12:"sore"===t||"malam"===t?e+12:void 0},meridiem:function(e,t,n){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("wd/R"))},UpQW:function(e,t,n){!function(e){"use strict";var t=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],n=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];e.defineLocale("ur",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,t,n){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(n("wd/R"))},Ur1D:function(e,t,n){!function(e){"use strict";e.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(e,t,n){return e<11?"ekuseni":e<15?"emini":e<19?"entsambama":"ebusuku"},meridiemHour:function(e,t){return 12===e&&(e=0),"ekuseni"===t?e:"emini"===t?e>=11?e:e+12:"entsambama"===t||"ebusuku"===t?0===e?0:e+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(n("wd/R"))},V2x9:function(e,t,n){!function(e){"use strict";e.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",ss:"minutu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},Vclq:function(e,t,n){!function(e){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");e.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsParseExact:!0,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"MMMM [de] D [de] YYYY",LLL:"MMMM [de] D [de] YYYY h:mm A",LLLL:"dddd, MMMM [de] D [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(n("wd/R"))},WYrj:function(e,t,n){!function(e){"use strict";var t=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],n=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];e.defineLocale("dv",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(e){return"\u0789\u078a"===e},meridiem:function(e,t,n){return e<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(n("wd/R"))},WxRl:function(e,t,n){!function(e){"use strict";var t="vas\xe1rnap h\xe9tf\u0151n kedden szerd\xe1n cs\xfct\xf6rt\xf6k\xf6n p\xe9nteken szombaton".split(" ");function n(e,t,n,i){var r=e;switch(n){case"s":return i||t?"n\xe9h\xe1ny m\xe1sodperc":"n\xe9h\xe1ny m\xe1sodperce";case"ss":return r+(i||t)?" m\xe1sodperc":" m\xe1sodperce";case"m":return"egy"+(i||t?" perc":" perce");case"mm":return r+(i||t?" perc":" perce");case"h":return"egy"+(i||t?" \xf3ra":" \xf3r\xe1ja");case"hh":return r+(i||t?" \xf3ra":" \xf3r\xe1ja");case"d":return"egy"+(i||t?" nap":" napja");case"dd":return r+(i||t?" nap":" napja");case"M":return"egy"+(i||t?" h\xf3nap":" h\xf3napja");case"MM":return r+(i||t?" h\xf3nap":" h\xf3napja");case"y":return"egy"+(i||t?" \xe9v":" \xe9ve");case"yy":return r+(i||t?" \xe9v":" \xe9ve")}return""}function i(e){return(e?"":"[m\xfalt] ")+"["+t[this.day()]+"] LT[-kor]"}e.defineLocale("hu",{months:"janu\xe1r_febru\xe1r_m\xe1rcius_\xe1prilis_m\xe1jus_j\xfanius_j\xfalius_augusztus_szeptember_okt\xf3ber_november_december".split("_"),monthsShort:"jan_feb_m\xe1rc_\xe1pr_m\xe1j_j\xfan_j\xfal_aug_szept_okt_nov_dec".split("_"),weekdays:"vas\xe1rnap_h\xe9tf\u0151_kedd_szerda_cs\xfct\xf6rt\xf6k_p\xe9ntek_szombat".split("_"),weekdaysShort:"vas_h\xe9t_kedd_sze_cs\xfct_p\xe9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,t,n){return e<12?!0===n?"de":"DE":!0===n?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return i.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return i.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s m\xfalva",past:"%s",s:n,ss:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},X709:function(e,t,n){!function(e){"use strict";e.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"e":1===t||2===t?"a":"e")},week:{dow:1,doy:4}})}(n("wd/R"))},XDpg:function(e,t,n){!function(e){"use strict";e.defineLocale("zh-cn",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u5468\u65e5_\u5468\u4e00_\u5468\u4e8c_\u5468\u4e09_\u5468\u56db_\u5468\u4e94_\u5468\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5Ah\u70b9mm\u5206",LLLL:"YYYY\u5e74M\u6708D\u65e5ddddAh\u70b9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?e:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?e+12:e>=11?e:e+12},meridiem:function(e,t,n){var i=100*e+t;return i<600?"\u51cc\u6668":i<900?"\u65e9\u4e0a":i<1130?"\u4e0a\u5348":i<1230?"\u4e2d\u5348":i<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u5468";default:return e}},relativeTime:{future:"%s\u5185",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(n("wd/R"))},XLvN:function(e,t,n){!function(e){"use strict";e.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===t?e<4?e:e+12:"\u0c09\u0c26\u0c2f\u0c02"===t?e:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===t?e>=10?e:e+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":e<10?"\u0c09\u0c26\u0c2f\u0c02":e<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":e<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(n("wd/R"))},YRex:function(e,t,n){!function(e){"use strict";e.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===t||"\u0633\u06d5\u06be\u06d5\u0631"===t||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===t?e:"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"===t||"\u0643\u06d5\u0686"===t?e+12:e>=11?e:e+12},meridiem:function(e,t,n){var i=100*e+t;return i<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":i<900?"\u0633\u06d5\u06be\u06d5\u0631":i<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":i<1230?"\u0686\u06c8\u0634":i<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return e+"-\u06be\u06d5\u067e\u062a\u06d5";default:return e}},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(n("wd/R"))},YuTi:function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},Z4QM:function(e,t,n){!function(e){"use strict";var t=["\u062c\u0646\u0648\u0631\u064a","\u0641\u064a\u0628\u0631\u0648\u0631\u064a","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u064a\u0644","\u0645\u0626\u064a","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0621\u0650","\u0622\u06af\u0633\u067d","\u0633\u064a\u067e\u067d\u0645\u0628\u0631","\u0622\u06aa\u067d\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u068a\u0633\u0645\u0628\u0631"],n=["\u0622\u0686\u0631","\u0633\u0648\u0645\u0631","\u0627\u06b1\u0627\u0631\u0648","\u0627\u0631\u0628\u0639","\u062e\u0645\u064a\u0633","\u062c\u0645\u0639","\u0687\u0646\u0687\u0631"];e.defineLocale("sd",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,t,n){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0627\u0684] LT",nextDay:"[\u0633\u0680\u0627\u06bb\u064a] LT",nextWeek:"dddd [\u0627\u06b3\u064a\u0646 \u0647\u0641\u062a\u064a \u062a\u064a] LT",lastDay:"[\u06aa\u0627\u0644\u0647\u0647] LT",lastWeek:"[\u06af\u0632\u0631\u064a\u0644 \u0647\u0641\u062a\u064a] dddd [\u062a\u064a] LT",sameElse:"L"},relativeTime:{future:"%s \u067e\u0648\u0621",past:"%s \u0627\u06b3",s:"\u0686\u0646\u062f \u0633\u064a\u06aa\u0646\u068a",ss:"%d \u0633\u064a\u06aa\u0646\u068a",m:"\u0647\u06aa \u0645\u0646\u067d",mm:"%d \u0645\u0646\u067d",h:"\u0647\u06aa \u06aa\u0644\u0627\u06aa",hh:"%d \u06aa\u0644\u0627\u06aa",d:"\u0647\u06aa \u068f\u064a\u0646\u0647\u0646",dd:"%d \u068f\u064a\u0646\u0647\u0646",M:"\u0647\u06aa \u0645\u0647\u064a\u0646\u0648",MM:"%d \u0645\u0647\u064a\u0646\u0627",y:"\u0647\u06aa \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(n("wd/R"))},ZAMP:function(e,t,n){!function(e){"use strict";e.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,t){return 12===e&&(e=0),"pagi"===t?e:"tengahari"===t?e>=11?e:e+12:"petang"===t||"malam"===t?e+12:void 0},meridiem:function(e,t,n){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("wd/R"))},Zduo:function(e,t,n){!function(e){"use strict";e.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_a\u016dg_sep_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(e){return"p"===e.charAt(0).toLowerCase()},meridiem:function(e,t,n){return e>11?n?"p.t.m.":"P.T.M.":n?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"sekundoj",ss:"%d sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(n("wd/R"))},aIdf:function(e,t,n){!function(e){"use strict";function t(e,t,n){return e+" "+function(e,t){return 2===t?function(e){var t={m:"v",b:"v",d:"z"};return void 0===t[e.charAt(0)]?e:t[e.charAt(0)]+e.substring(1)}(e):e}({mm:"munutenn",MM:"miz",dd:"devezh"}[n],e)}function n(e){return e>9?n(e%10):e}e.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:t,h:"un eur",hh:"%d eur",d:"un devezh",dd:t,M:"ur miz",MM:t,y:"ur bloaz",yy:function(e){switch(n(e)){case 1:case 3:case 4:case 5:case 9:return e+" bloaz";default:return e+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(e){return e+(1===e?"a\xf1":"vet")},week:{dow:1,doy:4}})}(n("wd/R"))},aIsn:function(e,t,n){!function(e){"use strict";e.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},aQkU:function(e,t,n){!function(e){"use strict";e.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u043e\u0441\u043b\u0435 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(e){var t=e%10,n=e%100;return 0===e?e+"-\u0435\u0432":0===n?e+"-\u0435\u043d":n>10&&n<20?e+"-\u0442\u0438":1===t?e+"-\u0432\u0438":2===t?e+"-\u0440\u0438":7===t||8===t?e+"-\u043c\u0438":e+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n("wd/R"))},b1Dy:function(e,t,n){!function(e){"use strict";e.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n("wd/R"))},bOMt:function(e,t,n){!function(e){"use strict";e.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},bXm7:function(e,t,n){!function(e){"use strict";var t={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};e.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(e){return e+(t[e]||t[e%10]||t[e>=100?100:null])},week:{dow:1,doy:7}})}(n("wd/R"))},bYM6:function(e,t,n){!function(e){"use strict";e.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(n("wd/R"))},bpih:function(e,t,n){!function(e){"use strict";e.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},cRix:function(e,t,n){!function(e){"use strict";var t="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),n="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");e.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[\xf4fr\xfbne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien min\xfat",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("wd/R"))},crnd:function(e,t){function n(e){return Promise.resolve().then(function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t})}n.keys=function(){return[]},n.resolve=n,e.exports=n,n.id="crnd"},czMo:function(e,t,n){!function(e){"use strict";e.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}})}(n("wd/R"))},dNwA:function(e,t,n){!function(e){"use strict";e.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(n("wd/R"))},"e+ae":function(e,t,n){!function(e){"use strict";var t="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),n="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function i(e){return e>1&&e<5}function r(e,t,n,r){var a=e+" ";switch(n){case"s":return t||r?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return t||r?a+(i(e)?"sekundy":"sek\xfand"):a+"sekundami";case"m":return t?"min\xfata":r?"min\xfatu":"min\xfatou";case"mm":return t||r?a+(i(e)?"min\xfaty":"min\xfat"):a+"min\xfatami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?a+(i(e)?"hodiny":"hod\xedn"):a+"hodinami";case"d":return t||r?"de\u0148":"d\u0148om";case"dd":return t||r?a+(i(e)?"dni":"dn\xed"):a+"d\u0148ami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?a+(i(e)?"mesiace":"mesiacov"):a+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?a+(i(e)?"roky":"rokov"):a+"rokmi"}}e.defineLocale("sk",{months:t,monthsShort:n,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},fzPg:function(e,t,n){!function(e){"use strict";e.defineLocale("yo",{months:"S\u1eb9\u0301r\u1eb9\u0301_E\u0300re\u0300le\u0300_\u1eb8r\u1eb9\u0300na\u0300_I\u0300gbe\u0301_E\u0300bibi_O\u0300ku\u0300du_Ag\u1eb9mo_O\u0300gu\u0301n_Owewe_\u1ecc\u0300wa\u0300ra\u0300_Be\u0301lu\u0301_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),monthsShort:"S\u1eb9\u0301r_E\u0300rl_\u1eb8rn_I\u0300gb_E\u0300bi_O\u0300ku\u0300_Ag\u1eb9_O\u0300gu\u0301_Owe_\u1ecc\u0300wa\u0300_Be\u0301l_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),weekdays:"A\u0300i\u0300ku\u0301_Aje\u0301_I\u0300s\u1eb9\u0301gun_\u1eccj\u1ecd\u0301ru\u0301_\u1eccj\u1ecd\u0301b\u1ecd_\u1eb8ti\u0300_A\u0300ba\u0301m\u1eb9\u0301ta".split("_"),weekdaysShort:"A\u0300i\u0300k_Aje\u0301_I\u0300s\u1eb9\u0301_\u1eccjr_\u1eccjb_\u1eb8ti\u0300_A\u0300ba\u0301".split("_"),weekdaysMin:"A\u0300i\u0300_Aj_I\u0300s_\u1eccr_\u1eccb_\u1eb8t_A\u0300b".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[O\u0300ni\u0300 ni] LT",nextDay:"[\u1ecc\u0300la ni] LT",nextWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301n'b\u1ecd] [ni] LT",lastDay:"[A\u0300na ni] LT",lastWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301l\u1ecd\u0301] [ni] LT",sameElse:"L"},relativeTime:{future:"ni\u0301 %s",past:"%s k\u1ecdja\u0301",s:"i\u0300s\u1eb9ju\u0301 aaya\u0301 die",ss:"aaya\u0301 %d",m:"i\u0300s\u1eb9ju\u0301 kan",mm:"i\u0300s\u1eb9ju\u0301 %d",h:"wa\u0301kati kan",hh:"wa\u0301kati %d",d:"\u1ecdj\u1ecd\u0301 kan",dd:"\u1ecdj\u1ecd\u0301 %d",M:"osu\u0300 kan",MM:"osu\u0300 %d",y:"\u1ecddu\u0301n kan",yy:"\u1ecddu\u0301n %d"},dayOfMonthOrdinalParse:/\u1ecdj\u1ecd\u0301\s\d{1,2}/,ordinal:"\u1ecdj\u1ecd\u0301 %d",week:{dow:1,doy:4}})}(n("wd/R"))},gVVK:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r=e+" ";switch(n){case"s":return t||i?"nekaj sekund":"nekaj sekundami";case"ss":return r+(1===e?t?"sekundo":"sekundi":2===e?t||i?"sekundi":"sekundah":e<5?t||i?"sekunde":"sekundah":"sekund");case"m":return t?"ena minuta":"eno minuto";case"mm":return r+(1===e?t?"minuta":"minuto":2===e?t||i?"minuti":"minutama":e<5?t||i?"minute":"minutami":t||i?"minut":"minutami");case"h":return t?"ena ura":"eno uro";case"hh":return r+(1===e?t?"ura":"uro":2===e?t||i?"uri":"urama":e<5?t||i?"ure":"urami":t||i?"ur":"urami");case"d":return t||i?"en dan":"enim dnem";case"dd":return r+(1===e?t||i?"dan":"dnem":2===e?t||i?"dni":"dnevoma":t||i?"dni":"dnevi");case"M":return t||i?"en mesec":"enim mesecem";case"MM":return r+(1===e?t||i?"mesec":"mesecem":2===e?t||i?"meseca":"mesecema":e<5?t||i?"mesece":"meseci":t||i?"mesecev":"meseci");case"y":return t||i?"eno leto":"enim letom";case"yy":return r+(1===e?t||i?"leto":"letom":2===e?t||i?"leti":"letoma":e<5?t||i?"leta":"leti":t||i?"let":"leti")}}e.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))},gekB:function(e,t,n){!function(e){"use strict";var t="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),n=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",t[7],t[8],t[9]];function i(e,i,r,a){var o="";switch(r){case"s":return a?"muutaman sekunnin":"muutama sekunti";case"ss":return a?"sekunnin":"sekuntia";case"m":return a?"minuutin":"minuutti";case"mm":o=a?"minuutin":"minuuttia";break;case"h":return a?"tunnin":"tunti";case"hh":o=a?"tunnin":"tuntia";break;case"d":return a?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":o=a?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return a?"kuukauden":"kuukausi";case"MM":o=a?"kuukauden":"kuukautta";break;case"y":return a?"vuoden":"vuosi";case"yy":o=a?"vuoden":"vuotta"}return function(e,i){return e<10?i?n[e]:t[e]:e}(e,a)+" "+o}e.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},gjCT:function(e,t,n){!function(e){"use strict";var t={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};e.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,t,n){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return n[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(n("wd/R"))},hKrs:function(e,t,n){!function(e){"use strict";e.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0440_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u043d\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(e){var t=e%10,n=e%100;return 0===e?e+"-\u0435\u0432":0===n?e+"-\u0435\u043d":n>10&&n<20?e+"-\u0442\u0438":1===t?e+"-\u0432\u0438":2===t?e+"-\u0440\u0438":7===t||8===t?e+"-\u043c\u0438":e+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n("wd/R"))},honF:function(e,t,n){!function(e){"use strict";var t={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},n={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};e.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(e){return e.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},week:{dow:1,doy:4}})}(n("wd/R"))},hwdV:function(e,t,n){var i=n("tjlA"),r=i.Buffer;function a(e,t){for(var n in e)t[n]=e[n]}function o(e,t,n){return r(e,t,n)}r.from&&r.alloc&&r.allocUnsafe&&r.allocUnsafeSlow?e.exports=i:(a(i,t),t.Buffer=o),a(r,o),o.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return r(e,t,n)},o.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var i=r(e);return void 0!==t?"string"==typeof n?i.fill(t,n):i.fill(t):i.fill(0),i},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i.SlowBuffer(e)}},iEDd:function(e,t,n){!function(e){"use strict";e.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},iYuL:function(e,t,n){!function(e){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),i=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;e.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("wd/R"))},jUeY:function(e,t,n){!function(e){"use strict";e.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(e,t){return e?"string"==typeof t&&/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(e,t,n){return e>11?n?"\u03bc\u03bc":"\u039c\u039c":n?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(e){return"\u03bc"===(e+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,t){var n,i=this._calendarEl[e],r=t&&t.hours();return((n=i)instanceof Function||"[object Function]"===Object.prototype.toString.call(n))&&(i=i.apply(t)),i.replace("{}",r%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(n("wd/R"))},jVdC:function(e,t,n){!function(e){"use strict";var t="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_");function i(e){return e%10<5&&e%10>1&&~~(e/10)%10!=1}function r(e,t,n){var r=e+" ";switch(n){case"ss":return r+(i(e)?"sekundy":"sekund");case"m":return t?"minuta":"minut\u0119";case"mm":return r+(i(e)?"minuty":"minut");case"h":return t?"godzina":"godzin\u0119";case"hh":return r+(i(e)?"godziny":"godzin");case"MM":return r+(i(e)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return r+(i(e)?"lata":"lat")}}e.defineLocale("pl",{months:function(e,i){return e?""===i?"("+n[e.month()]+"|"+t[e.month()]+")":/D MMMM/.test(i)?n[e.month()]:t[e.month()]:t},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:r,m:r,mm:r,h:r,hh:r,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:r,y:"rok",yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},jfSC:function(e,t,n){!function(e){"use strict";var t={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},n={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};e.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(e){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(e)},meridiem:function(e,t,n){return e<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"\u062b\u0627\u0646\u06cc\u0647 d%",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/[\u06f0-\u06f9]/g,function(e){return n[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(n("wd/R"))},jnO4:function(e,t,n){!function(e){"use strict";var t={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},i=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},r={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},a=function(e){return function(t,n,a,o){var s=i(t),u=r[e][i(t)];return 2===s&&(u=u[n?0:1]),u.replace(/%d/i,t)}},o=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];e.defineLocale("ar",{months:o,monthsShort:o,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,t,n){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:a("s"),ss:a("s"),m:a("m"),mm:a("m"),h:a("h"),hh:a("h"),d:a("d"),dd:a("d"),M:a("M"),MM:a("M"),y:a("y"),yy:a("y")},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return n[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n("wd/R"))},kB5k:function(e,t,n){var i;!function(r){"use strict";var a,o=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,s=Math.ceil,u=Math.floor,l="[BigNumber Error] ",c=l+"Number primitive has more than 15 significant digits: ",d=1e14,h=14,f=9007199254740991,p=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],m=1e7,g=1e9;function v(e){var t=0|e;return e>0||e===t?t:t-1}function _(e){for(var t,n,i=1,r=e.length,a=e[0]+"";il^n?1:-1;for(s=(u=r.length)<(l=a.length)?u:l,o=0;oa[o]^n?1:-1;return u==l?0:u>l^n?1:-1}function b(e,t,n,i){if(en||e!==(e<0?s(e):u(e)))throw Error(l+(i||"Argument")+("number"==typeof e?en?" out of range: ":" not an integer: ":" not a primitive number: ")+e)}function w(e){return"[object Array]"==Object.prototype.toString.call(e)}function k(e){var t=e.c.length-1;return v(e.e/h)==t&&e.c[t]%2!=0}function M(e,t){return(e.length>1?e.charAt(0)+"."+e.slice(1):e)+(t<0?"e":"e+")+t}function S(e,t,n){var i,r;if(t<0){for(r=n+".";++t;r+=n);e=r+e}else if(++t>(i=e.length)){for(r=n,t-=i;--t;r+=n);e+=r}else t=10;d/=10,l++);return v.e=l,void(v.c=[e])}g=e+""}else{if(!o.test(g=e+""))return r(v,g,p);v.s=45==g.charCodeAt(0)?(g=g.slice(1),-1):1}(l=g.indexOf("."))>-1&&(g=g.replace(".","")),(d=g.search(/e/i))>0?(l<0&&(l=d),l+=+g.slice(d+1),g=g.substring(0,d)):l<0&&(l=g.length)}else{if(b(t,2,V.length,"Base"),g=e+"",10==t)return K(v=new U(e instanceof U?e:g),A+v.e+1,Y);if(p="number"==typeof e){if(0*e!=0)return r(v,g,p,t);if(v.s=1/e<0?(g=g.slice(1),-1):1,U.DEBUG&&g.replace(/^0\.0*|\./,"").length>15)throw Error(c+e);p=!1}else v.s=45===g.charCodeAt(0)?(g=g.slice(1),-1):1;for(n=V.slice(0,t),l=d=0,m=g.length;dl){l=m;continue}}else if(!s&&(g==g.toUpperCase()&&(g=g.toLowerCase())||g==g.toLowerCase()&&(g=g.toUpperCase()))){s=!0,d=-1,l=0;continue}return r(v,e+"",p,t)}(l=(g=i(g,t,10,v.s)).indexOf("."))>-1?g=g.replace(".",""):l=g.length}for(d=0;48===g.charCodeAt(d);d++);for(m=g.length;48===g.charCodeAt(--m););if(g=g.slice(d,++m)){if(m-=d,p&&U.DEBUG&&m>15&&(e>f||e!==u(e)))throw Error(c+v.s*e);if((l=l-d-1)>H)v.c=v.e=null;else if(ls){if(--t>0)for(u+=".";t--;u+="0");}else if((t+=a-s)>0)for(a+1==s&&(u+=".");t--;u+="0");return e.s<0&&r?"-"+u:u}function q(e,t){var n,i,r=0;for(w(e[0])&&(e=e[0]),n=new U(e[0]);++r=10;r/=10,i++);return(n=i+n*h-1)>H?e.c=e.e=null:n=10;l/=10,r++);if((a=t-r)<0)a+=h,m=(c=g[f=0])/v[r-(o=t)-1]%10|0;else if((f=s((a+1)/h))>=g.length){if(!i)break e;for(;g.length<=f;g.push(0));c=m=0,r=1,o=(a%=h)-h+1}else{for(c=l=g[f],r=1;l>=10;l/=10,r++);m=(o=(a%=h)-h+r)<0?0:c/v[r-o-1]%10|0}if(i=i||t<0||null!=g[f+1]||(o<0?c:c%v[r-o-1]),i=n<4?(m||i)&&(0==n||n==(e.s<0?3:2)):m>5||5==m&&(4==n||i||6==n&&(a>0?o>0?c/v[r-o]:0:g[f-1])%10&1||n==(e.s<0?8:7)),t<1||!g[0])return g.length=0,i?(g[0]=v[(h-(t-=e.e+1)%h)%h],e.e=-t||0):g[0]=e.e=0,e;if(0==a?(g.length=f,l=1,f--):(g.length=f+1,l=v[h-a],g[f]=o>0?u(c/v[r-o]%v[o])*l:0),i)for(;;){if(0==f){for(a=1,o=g[0];o>=10;o/=10,a++);for(o=g[0]+=l,l=1;o>=10;o/=10,l++);a!=l&&(e.e++,g[0]==d&&(g[0]=1));break}if(g[f]+=l,g[f]!=d)break;g[f--]=0,l=1}for(a=g.length;0===g[--a];g.pop());}e.e>H?e.c=e.e=null:e.e>>11))>=9e15?(n=crypto.getRandomValues(new Uint32Array(2)),t[o]=n[0],t[o+1]=n[1]):(c.push(a%1e14),o+=2);o=r/2}else{if(!crypto.randomBytes)throw j=!1,Error(l+"crypto unavailable");for(t=crypto.randomBytes(r*=7);o=9e15?crypto.randomBytes(7).copy(t,o):(c.push(a%1e14),o+=7);o=r/7}if(!j)for(;o=10;a/=10,o++);on-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/n|0,o[r]%=n)}return o.reverse()}return function(i,r,a,o,s){var u,l,c,d,h,f,p,m,g=i.indexOf("."),v=A,y=Y;for(g>=0&&(d=B,B=0,i=i.replace(".",""),f=(m=new U(r)).pow(i.length-g),B=d,m.c=t(S(_(f.c),f.e,"0"),10,a,e),m.e=m.c.length),c=d=(p=t(i,r,a,s?(u=V,e):(u=e,V))).length;0==p[--d];p.pop());if(!p[0])return u.charAt(0);if(g<0?--c:(f.c=p,f.e=c,f.s=o,p=(f=n(f,m,v,y,a)).c,h=f.r,c=f.e),g=p[l=c+v+1],d=a/2,h=h||l<0||null!=p[l+1],h=y<4?(null!=g||h)&&(0==y||y==(f.s<0?3:2)):g>d||g==d&&(4==y||h||6==y&&1&p[l-1]||y==(f.s<0?8:7)),l<1||!p[0])i=h?S(u.charAt(1),-v,u.charAt(0)):u.charAt(0);else{if(p.length=l,h)for(--a;++p[--l]>a;)p[l]=0,l||(++c,p=[1].concat(p));for(d=p.length;!p[--d];);for(g=0,i="";g<=d;i+=u.charAt(p[g++]));i=S(i,c,u.charAt(0))}return i}}(),n=function(){function e(e,t,n){var i,r,a,o,s=0,u=e.length,l=t%m,c=t/m|0;for(e=e.slice();u--;)s=((r=l*(a=e[u]%m)+(i=c*a+(o=e[u]/m|0)*l)%m*m+s)/n|0)+(i/m|0)+c*o,e[u]=r%n;return s&&(e=[s].concat(e)),e}function t(e,t,n,i){var r,a;if(n!=i)a=n>i?1:-1;else for(r=a=0;rt[r]?1:-1;break}return a}function n(e,t,n,i){for(var r=0;n--;)e[n]-=r,e[n]=(r=e[n]1;e.splice(0,1));}return function(i,r,a,o,s){var l,c,f,p,m,g,_,y,b,w,k,M,S,C,x,L,T,D=i.s==r.s?1:-1,O=i.c,E=r.c;if(!(O&&O[0]&&E&&E[0]))return new U(i.s&&r.s&&(O?!E||O[0]!=E[0]:E)?O&&0==O[0]||!E?0*D:D/0:NaN);for(b=(y=new U(D)).c=[],D=a+(c=i.e-r.e)+1,s||(s=d,c=v(i.e/h)-v(r.e/h),D=D/h|0),f=0;E[f]==(O[f]||0);f++);if(E[f]>(O[f]||0)&&c--,D<0)b.push(1),p=!0;else{for(C=O.length,L=E.length,f=0,D+=2,(m=u(s/(E[0]+1)))>1&&(E=e(E,m,s),O=e(O,m,s),L=E.length,C=O.length),S=L,k=(w=O.slice(0,L)).length;k=s/2&&x++;do{if(m=0,(l=t(E,w,L,k))<0){if(M=w[0],L!=k&&(M=M*s+(w[1]||0)),(m=u(M/x))>1)for(m>=s&&(m=s-1),_=(g=e(E,m,s)).length,k=w.length;1==t(g,w,_,k);)m--,n(g,L<_?T:E,_,s),_=g.length,l=1;else 0==m&&(l=m=1),_=(g=E.slice()).length;if(_=10;D/=10,f++);K(y,a+(y.e=f+c*h-1)+1,o,p)}else y.e=c,y.r=+p;return y}}(),x=/^(-?)0([xbo])(?=\w[\w.]*$)/i,L=/^([^.]+)\.$/,T=/^\.([^.]+)$/,D=/^-?(Infinity|NaN)$/,O=/^\s*\+(?=[\w.])|^\s+|\s+$/g,r=function(e,t,n,i){var r,a=n?t:t.replace(O,"");if(D.test(a))e.s=isNaN(a)?null:a<0?-1:1,e.c=e.e=null;else{if(!n&&(a=a.replace(x,function(e,t,n){return r="x"==(n=n.toLowerCase())?16:"b"==n?2:8,i&&i!=r?e:t}),i&&(r=i,a=a.replace(L,"$1").replace(T,"0.$1")),t!=a))return new U(a,r);if(U.DEBUG)throw Error(l+"Not a"+(i?" base "+i:"")+" number: "+t);e.c=e.e=e.s=null}},E.absoluteValue=E.abs=function(){var e=new U(this);return e.s<0&&(e.s=1),e},E.comparedTo=function(e,t){return y(this,new U(e,t))},E.decimalPlaces=E.dp=function(e,t){var n,i,r,a=this;if(null!=e)return b(e,0,g),null==t?t=Y:b(t,0,8),K(new U(a),e+a.e+1,t);if(!(n=a.c))return null;if(i=((r=n.length-1)-v(this.e/h))*h,r=n[r])for(;r%10==0;r/=10,i--);return i<0&&(i=0),i},E.dividedBy=E.div=function(e,t){return n(this,new U(e,t),A,Y)},E.dividedToIntegerBy=E.idiv=function(e,t){return n(this,new U(e,t),0,1)},E.exponentiatedBy=E.pow=function(e,t){var n,i,r,a,o,c,d,f=this;if((e=new U(e)).c&&!e.isInteger())throw Error(l+"Exponent not an integer: "+e);if(null!=t&&(t=new U(t)),a=e.e>14,!f.c||!f.c[0]||1==f.c[0]&&!f.e&&1==f.c.length||!e.c||!e.c[0])return d=new U(Math.pow(+f.valueOf(),a?2-k(e):+e)),t?d.mod(t):d;if(o=e.s<0,t){if(t.c?!t.c[0]:!t.s)return new U(NaN);(i=!o&&f.isInteger()&&t.isInteger())&&(f=f.mod(t))}else{if(e.e>9&&(f.e>0||f.e<-1||(0==f.e?f.c[0]>1||a&&f.c[1]>=24e7:f.c[0]<8e13||a&&f.c[0]<=9999975e7)))return r=f.s<0&&k(e)?-0:0,f.e>-1&&(r=1/r),new U(o?1/r:r);B&&(r=s(B/h+2))}for(a?(n=new U(.5),c=k(e)):c=e%2,o&&(e.s=1),d=new U(P);;){if(c){if(!(d=d.times(f)).c)break;r?d.c.length>r&&(d.c.length=r):i&&(d=d.mod(t))}if(a){if(K(e=e.times(n),e.e+1,1),!e.c[0])break;a=e.e>14,c=k(e)}else{if(!(e=u(e/2)))break;c=e%2}f=f.times(f),r?f.c&&f.c.length>r&&(f.c.length=r):i&&(f=f.mod(t))}return i?d:(o&&(d=P.div(d)),t?d.mod(t):r?K(d,B,Y,void 0):d)},E.integerValue=function(e){var t=new U(this);return null==e?e=Y:b(e,0,8),K(t,t.e+1,e)},E.isEqualTo=E.eq=function(e,t){return 0===y(this,new U(e,t))},E.isFinite=function(){return!!this.c},E.isGreaterThan=E.gt=function(e,t){return y(this,new U(e,t))>0},E.isGreaterThanOrEqualTo=E.gte=function(e,t){return 1===(t=y(this,new U(e,t)))||0===t},E.isInteger=function(){return!!this.c&&v(this.e/h)>this.c.length-2},E.isLessThan=E.lt=function(e,t){return y(this,new U(e,t))<0},E.isLessThanOrEqualTo=E.lte=function(e,t){return-1===(t=y(this,new U(e,t)))||0===t},E.isNaN=function(){return!this.s},E.isNegative=function(){return this.s<0},E.isPositive=function(){return this.s>0},E.isZero=function(){return!!this.c&&0==this.c[0]},E.minus=function(e,t){var n,i,r,a,o=this,s=o.s;if(t=(e=new U(e,t)).s,!s||!t)return new U(NaN);if(s!=t)return e.s=-t,o.plus(e);var u=o.e/h,l=e.e/h,c=o.c,f=e.c;if(!u||!l){if(!c||!f)return c?(e.s=-t,e):new U(f?o:NaN);if(!c[0]||!f[0])return f[0]?(e.s=-t,e):new U(c[0]?o:3==Y?-0:0)}if(u=v(u),l=v(l),c=c.slice(),s=u-l){for((a=s<0)?(s=-s,r=c):(l=u,r=f),r.reverse(),t=s;t--;r.push(0));r.reverse()}else for(i=(a=(s=c.length)<(t=f.length))?s:t,s=t=0;t0)for(;t--;c[n++]=0);for(t=d-1;i>s;){if(c[--i]=0;){for(n=0,p=M[r]%b,g=M[r]/b|0,a=r+(o=u);a>r;)n=((l=p*(l=k[--o]%b)+(s=g*l+(c=k[o]/b|0)*p)%b*b+_[a]+n)/y|0)+(s/b|0)+g*c,_[a--]=l%y;_[a]=n}return n?++i:_.splice(0,1),G(e,_,i)},E.negated=function(){var e=new U(this);return e.s=-e.s||null,e},E.plus=function(e,t){var n,i=this,r=i.s;if(t=(e=new U(e,t)).s,!r||!t)return new U(NaN);if(r!=t)return e.s=-t,i.minus(e);var a=i.e/h,o=e.e/h,s=i.c,u=e.c;if(!a||!o){if(!s||!u)return new U(r/0);if(!s[0]||!u[0])return u[0]?e:new U(s[0]?i:0*r)}if(a=v(a),o=v(o),s=s.slice(),r=a-o){for(r>0?(o=a,n=u):(r=-r,n=s),n.reverse();r--;n.push(0));n.reverse()}for((r=s.length)-(t=u.length)<0&&(n=u,u=s,s=n,t=r),r=0;t;)r=(s[--t]=s[t]+u[t]+r)/d|0,s[t]=d===s[t]?0:s[t]%d;return r&&(s=[r].concat(s),++o),G(e,s,o)},E.precision=E.sd=function(e,t){var n,i,r,a=this;if(null!=e&&e!==!!e)return b(e,1,g),null==t?t=Y:b(t,0,8),K(new U(a),e,t);if(!(n=a.c))return null;if(i=(r=n.length-1)*h+1,r=n[r]){for(;r%10==0;r/=10,i--);for(r=n[0];r>=10;r/=10,i++);}return e&&a.e+1>i&&(i=a.e+1),i},E.shiftedBy=function(e){return b(e,-9007199254740991,f),this.times("1e"+e)},E.squareRoot=E.sqrt=function(){var e,t,i,r,a,o=this,s=o.c,u=o.s,l=o.e,c=A+4,d=new U("0.5");if(1!==u||!s||!s[0])return new U(!u||u<0&&(!s||s[0])?NaN:s?o:1/0);if(0==(u=Math.sqrt(+o))||u==1/0?(((t=_(s)).length+l)%2==0&&(t+="0"),u=Math.sqrt(t),l=v((l+1)/2)-(l<0||l%2),i=new U(t=u==1/0?"1e"+l:(t=u.toExponential()).slice(0,t.indexOf("e")+1)+l)):i=new U(u+""),i.c[0])for((u=(l=i.e)+c)<3&&(u=0);;)if(i=d.times((a=i).plus(n(o,a,c,1))),_(a.c).slice(0,u)===(t=_(i.c)).slice(0,u)){if(i.e0&&h>0){for(u=d.substr(0,i=h%a||a);i0&&(u+=s+d.slice(i)),c&&(u="-"+u)}n=l?u+W.decimalSeparator+((o=+W.fractionGroupSize)?l.replace(new RegExp("\\d{"+o+"}\\B","g"),"$&"+W.fractionGroupSeparator):l):u}return n},E.toFraction=function(e){var t,i,r,a,o,s,u,c,d,f,m,g,v=this,y=v.c;if(null!=e&&(!(c=new U(e)).isInteger()&&(c.c||1!==c.s)||c.lt(P)))throw Error(l+"Argument "+(c.isInteger()?"out of range: ":"not an integer: ")+e);if(!y)return v.toString();for(i=new U(P),f=r=new U(P),a=d=new U(P),g=_(y),s=i.e=g.length-v.e-1,i.c[0]=p[(u=s%h)<0?h+u:u],e=!e||c.comparedTo(i)>0?s>0?i:f:c,u=H,H=1/0,c=new U(g),d.c[0]=0;m=n(c,i,0,1),1!=(o=r.plus(m.times(a))).comparedTo(e);)r=a,a=o,f=d.plus(m.times(o=f)),d=o,i=c.minus(m.times(o=i)),c=o;return o=n(e.minus(r),a,0,1),d=d.plus(o.times(f)),r=r.plus(o.times(a)),d.s=f.s=v.s,t=n(f,a,s*=2,Y).minus(v).abs().comparedTo(n(d,r,s,Y).minus(v).abs())<1?[f.toString(),a.toString()]:[d.toString(),r.toString()],H=u,t},E.toNumber=function(){return+this},E.toPrecision=function(e,t){return null!=e&&b(e,1,g),z(this,e,t,2)},E.toString=function(e){var t,n=this,r=n.s,a=n.e;return null===a?r?(t="Infinity",r<0&&(t="-"+t)):t="NaN":(t=_(n.c),null==e?t=a<=I||a>=R?M(t,a):S(t,a,"0"):(b(e,2,V.length,"Base"),t=i(S(t,a,"0"),10,e,r,!0)),r<0&&n.c[0]&&(t="-"+t)),t},E.valueOf=E.toJSON=function(){var e,t=this,n=t.e;return null===n?t.toString():(e=_(t.c),e=n<=I||n>=R?M(e,n):S(e,n,"0"),t.s<0?"-"+e:e)},E._isBigNumber=!0,null!=t&&U.set(t),U}()).default=a.BigNumber=a,void 0===(i=(function(){return a}).call(t,n,t,e))||(e.exports=i)}()},kEOa:function(e,t,n){!function(e){"use strict";var t={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},n={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};e.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2_\u0986\u0997_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u0983_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===t&&e>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===t&&e<5||"\u09ac\u09bf\u0995\u09be\u09b2"===t?e+12:e},meridiem:function(e,t,n){return e<4?"\u09b0\u09be\u09a4":e<10?"\u09b8\u0995\u09be\u09b2":e<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(n("wd/R"))},kOpN:function(e,t,n){!function(e){"use strict";e.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?e:"\u4e2d\u5348"===t?e>=11?e:e+12:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?e+12:void 0},meridiem:function(e,t,n){var i=100*e+t;return i<600?"\u51cc\u6668":i<900?"\u65e9\u4e0a":i<1130?"\u4e0a\u5348":i<1230?"\u4e2d\u5348":i<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n("wd/R"))},"kVK+":function(e,t){t.read=function(e,t,n,i,r){var a,o,s=8*r-i-1,u=(1<>1,c=-7,d=n?r-1:0,h=n?-1:1,f=e[t+d];for(d+=h,a=f&(1<<-c)-1,f>>=-c,c+=s;c>0;a=256*a+e[t+d],d+=h,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=i;c>0;o=256*o+e[t+d],d+=h,c-=8);if(0===a)a=1-l;else{if(a===u)return o?NaN:1/0*(f?-1:1);o+=Math.pow(2,i),a-=l}return(f?-1:1)*o*Math.pow(2,a-i)},t.write=function(e,t,n,i,r,a){var o,s,u,l=8*a-r-1,c=(1<>1,h=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,f=i?0:a-1,p=i?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,o=c):(o=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-o))<1&&(o--,u*=2),(t+=o+d>=1?h/u:h*Math.pow(2,1-d))*u>=2&&(o++,u/=2),o+d>=c?(s=0,o=c):o+d>=1?(s=(t*u-1)*Math.pow(2,r),o+=d):(s=t*Math.pow(2,d-1)*Math.pow(2,r),o=0));r>=8;e[n+f]=255&s,f+=p,s/=256,r-=8);for(o=o<0;e[n+f]=255&o,f+=p,o/=256,l-=8);e[n+f-p]|=128*m}},l5ep:function(e,t,n){!function(e){"use strict";e.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn \xf4l",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(e){var t="";return e>20?t=40===e||50===e||60===e||80===e||100===e?"fed":"ain":e>0&&(t=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][e]),e+t},week:{dow:1,doy:4}})}(n("wd/R"))},lXzo:function(e,t,n){!function(e){"use strict";function t(e,t,n){return"m"===n?t?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":e+" "+(i=+e,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[n].split("_"),i%10==1&&i%100!=11?r[0]:i%10>=2&&i%10<=4&&(i%100<10||i%100>=20)?r[1]:r[2]);var i,r}var n=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];e.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?\] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430 \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",nextWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd [\u0432] LT"}},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:t,m:t,mm:t,h:"\u0447\u0430\u0441",hh:t,d:"\u0434\u0435\u043d\u044c",dd:t,M:"\u043c\u0435\u0441\u044f\u0446",MM:t,y:"\u0433\u043e\u0434",yy:t},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(e)},meridiem:function(e,t,n){return e<4?"\u043d\u043e\u0447\u0438":e<12?"\u0443\u0442\u0440\u0430":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":return e+"-\u0439";case"D":return e+"-\u0433\u043e";case"w":case"W":return e+"-\u044f";default:return e}},week:{dow:1,doy:4}})}(n("wd/R"))},lgnt:function(e,t,n){!function(e){"use strict";var t={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};e.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u0435 \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(e){return e+(t[e]||t[e%10]||t[e>=100?100:null])},week:{dow:1,doy:7}})}(n("wd/R"))},lyxo:function(e,t,n){!function(e){"use strict";function t(e,t,n){var i=" ";return(e%100>=20||e>=100&&e%100==0)&&(i=" de "),e+i+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"}[n]}e.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:t,m:"un minut",mm:t,h:"o or\u0103",hh:t,d:"o zi",dd:t,M:"o lun\u0103",MM:t,y:"un an",yy:t},week:{dow:1,doy:7}})}(n("wd/R"))},nyYc:function(e,t,n){!function(e){"use strict";e.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(e,t){switch(t){case"D":return e+(1===e?"er":"");default:case"M":case"Q":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}})}(n("wd/R"))},o1bE:function(e,t,n){!function(e){"use strict";e.defineLocale("ar-dz",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u0623\u062d_\u0625\u062b_\u062b\u0644\u0627_\u0623\u0631_\u062e\u0645_\u062c\u0645_\u0633\u0628".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:4}})}(n("wd/R"))},"p/rL":function(e,t,n){!function(e){"use strict";e.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(n("wd/R"))},raLr:function(e,t,n){!function(e){"use strict";function t(e,t,n){return"m"===n?t?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===n?t?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":e+" "+(i=+e,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:t?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[n].split("_"),i%10==1&&i%100!=11?r[0]:i%10>=2&&i%10<=4&&(i%100<10||i%100>=20)?r[1]:r[2]);var i,r}function n(e){return function(){return e+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}e.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(e,t){var n={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return e?n[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(t)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(t)?"genitive":"nominative"][e.day()]:n.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:n("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:n("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:n("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:n("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:t,m:t,mm:t,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:t,d:"\u0434\u0435\u043d\u044c",dd:t,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:t,y:"\u0440\u0456\u043a",yy:t},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(e)},meridiem:function(e,t,n){return e<4?"\u043d\u043e\u0447\u0456":e<12?"\u0440\u0430\u043d\u043a\u0443":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e+"-\u0439";case"D":return e+"-\u0433\u043e";default:return e}},week:{dow:1,doy:7}})}(n("wd/R"))},"s+uk":function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?r[n][0]:r[n][1]}e.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},sp3z:function(e,t,n){!function(e){"use strict";e.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(e){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===e},meridiem:function(e,t,n){return e<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(e){return"\u0e97\u0eb5\u0ec8"+e}})}(n("wd/R"))},tGlX:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?r[n][0]:r[n][1]}e.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},tT3J:function(e,t,n){!function(e){"use strict";e.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(n("wd/R"))},tUCv:function(e,t,n){!function(e){"use strict";e.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(e,t){return 12===e&&(e=0),"enjing"===t?e:"siyang"===t?e>=11?e:e+12:"sonten"===t||"ndalu"===t?e+12:void 0},meridiem:function(e,t,n){return e<11?"enjing":e<15?"siyang":e<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(n("wd/R"))},tjlA:function(e,t,n){"use strict";var i=n("H7XF"),r=n("kVK+"),a=n("49sm");function o(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(o()=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|e}function p(e,t){if(u.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return N(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return B(e).length;default:if(i)return N(e).length;t=(""+t).toLowerCase(),i=!0}}function m(e,t,n){var i=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return O(this,t,n);case"utf8":case"utf-8":return x(this,t,n);case"ascii":return T(this,t,n);case"latin1":case"binary":return D(this,t,n);case"base64":return C(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,t,n);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function g(e,t,n){var i=e[t];e[t]=e[n],e[n]=i}function v(e,t,n,i,r){if(0===e.length)return-1;if("string"==typeof n?(i=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=r?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(r)return-1;n=e.length-1}else if(n<0){if(!r)return-1;n=0}if("string"==typeof t&&(t=u.from(t,i)),u.isBuffer(t))return 0===t.length?-1:_(e,t,n,i,r);if("number"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):_(e,[t],n,i,r);throw new TypeError("val must be string, number or Buffer")}function _(e,t,n,i,r){var a,o=1,s=e.length,u=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;o=2,s/=2,u/=2,n/=2}function l(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}if(r){var c=-1;for(a=n;as&&(n=s-u),a=n;a>=0;a--){for(var d=!0,h=0;hr&&(i=r):i=r;var a=t.length;if(a%2!=0)throw new TypeError("Invalid hex string");i>a/2&&(i=a/2);for(var o=0;o>8,r.push(n%256),r.push(i);return r}(t,e.length-n),e,n,i)}function C(e,t,n){return i.fromByteArray(0===t&&n===e.length?e:e.slice(t,n))}function x(e,t,n){n=Math.min(e.length,n);for(var i=[],r=t;r239?4:l>223?3:l>191?2:1;if(r+d<=n)switch(d){case 1:l<128&&(c=l);break;case 2:128==(192&(a=e[r+1]))&&(u=(31&l)<<6|63&a)>127&&(c=u);break;case 3:o=e[r+2],128==(192&(a=e[r+1]))&&128==(192&o)&&(u=(15&l)<<12|(63&a)<<6|63&o)>2047&&(u<55296||u>57343)&&(c=u);break;case 4:o=e[r+2],s=e[r+3],128==(192&(a=e[r+1]))&&128==(192&o)&&128==(192&s)&&(u=(15&l)<<18|(63&a)<<12|(63&o)<<6|63&s)>65535&&u<1114112&&(c=u)}null===c?(c=65533,d=1):c>65535&&(i.push((c-=65536)>>>10&1023|55296),c=56320|1023&c),i.push(c),r+=d}return function(e){var t=e.length;if(t<=L)return String.fromCharCode.apply(String,e);for(var n="",i=0;i0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},u.prototype.compare=function(e,t,n,i,r){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===i&&(i=0),void 0===r&&(r=this.length),t<0||n>e.length||i<0||r>this.length)throw new RangeError("out of range index");if(i>=r&&t>=n)return 0;if(i>=r)return-1;if(t>=n)return 1;if(this===e)return 0;for(var a=(r>>>=0)-(i>>>=0),o=(n>>>=0)-(t>>>=0),s=Math.min(a,o),l=this.slice(i,r),c=e.slice(t,n),d=0;dr)&&(n=r),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var a=!1;;)switch(i){case"hex":return y(this,e,t,n);case"utf8":case"utf-8":return b(this,e,t,n);case"ascii":return w(this,e,t,n);case"latin1":case"binary":return k(this,e,t,n);case"base64":return M(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,n);default:if(a)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),a=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var L=4096;function T(e,t,n){var i="";n=Math.min(e.length,n);for(var r=t;rr)&&(n=r);for(var a="",o=t;on)throw new RangeError("Trying to access beyond buffer length")}function A(e,t,n,i,r,a){if(!u.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||te.length)throw new RangeError("Index out of range")}function Y(e,t,n,i){t<0&&(t=65535+t+1);for(var r=0,a=Math.min(e.length-n,2);r>>8*(i?r:1-r)}function I(e,t,n,i){t<0&&(t=4294967295+t+1);for(var r=0,a=Math.min(e.length-n,4);r>>8*(i?r:3-r)&255}function R(e,t,n,i,r,a){if(n+i>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function F(e,t,n,i,a){return a||R(e,0,n,4),r.write(e,t,n,i,23,4),n+4}function H(e,t,n,i,a){return a||R(e,0,n,8),r.write(e,t,n,i,52,8),n+8}u.prototype.slice=function(e,t){var n,i=this.length;if((e=~~e)<0?(e+=i)<0&&(e=0):e>i&&(e=i),(t=void 0===t?i:~~t)<0?(t+=i)<0&&(t=0):t>i&&(t=i),t0&&(r*=256);)i+=this[e+--t]*r;return i},u.prototype.readUInt8=function(e,t){return t||P(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||P(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||P(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||P(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||P(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var i=this[e],r=1,a=0;++a=(r*=128)&&(i-=Math.pow(2,8*t)),i},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var i=t,r=1,a=this[e+--i];i>0&&(r*=256);)a+=this[e+--i]*r;return a>=(r*=128)&&(a-=Math.pow(2,8*t)),a},u.prototype.readInt8=function(e,t){return t||P(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||P(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){t||P(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return t||P(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||P(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||P(e,4,this.length),r.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||P(e,4,this.length),r.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||P(e,8,this.length),r.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||P(e,8,this.length),r.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,i){e=+e,t|=0,n|=0,i||A(this,e,t,n,Math.pow(2,8*n)-1,0);var r=1,a=0;for(this[t]=255&e;++a=0&&(a*=256);)this[t+r]=e/a&255;return t+n},u.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||A(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||A(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Y(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||A(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Y(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||A(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):I(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||A(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):I(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,i){if(e=+e,t|=0,!i){var r=Math.pow(2,8*n-1);A(this,e,t,n,r-1,-r)}var a=0,o=1,s=0;for(this[t]=255&e;++a>0)-s&255;return t+n},u.prototype.writeIntBE=function(e,t,n,i){if(e=+e,t|=0,!i){var r=Math.pow(2,8*n-1);A(this,e,t,n,r-1,-r)}var a=n-1,o=1,s=0;for(this[t+a]=255&e;--a>=0&&(o*=256);)e<0&&0===s&&0!==this[t+a+1]&&(s=1),this[t+a]=(e/o>>0)-s&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||A(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||A(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Y(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||A(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Y(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||A(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):I(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||A(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):I(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return F(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return F(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return H(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return H(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,i){if(n||(n=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t=0;--r)e[r+t]=this[r+n];else if(a<1e3||!u.TYPED_ARRAY_SUPPORT)for(r=0;r>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(a=t;a55295&&n<57344){if(!r){if(n>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(o+1===i){(t-=3)>-1&&a.push(239,191,189);continue}r=n;continue}if(n<56320){(t-=3)>-1&&a.push(239,191,189),r=n;continue}n=65536+(r-55296<<10|n-56320)}else r&&(t-=3)>-1&&a.push(239,191,189);if(r=null,n<128){if((t-=1)<0)break;a.push(n)}else if(n<2048){if((t-=2)<0)break;a.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;a.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return a}function B(e){return i.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(j,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function W(e,t,n,i){for(var r=0;r=t.length||r>=e.length);++r)t[r+n]=e[r];return r}},u3GI:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?r[n][0]:r[n][1]}e.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},uEye:function(e,t,n){!function(e){"use strict";e.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_m\xe5n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},uXwI:function(e,t,n){!function(e){"use strict";var t={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function n(e,t,n){return n?t%10==1&&t%100!=11?e[2]:e[3]:t%10==1&&t%100!=11?e[0]:e[1]}function i(e,i,r){return e+" "+n(t[r],e,i)}function r(e,i,r){return n(t[r],e,i)}e.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(e,t){return t?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:i,m:r,mm:i,h:r,hh:i,d:r,dd:i,M:r,MM:i,y:r,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},wQk9:function(e,t,n){!function(e){"use strict";e.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(n("wd/R"))},"wd/R":function(e,t,n){(function(e){e.exports=function(){"use strict";var t,i;function r(){return t.apply(null,arguments)}function a(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function o(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function s(e){return void 0===e}function u(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function l(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function c(e,t){var n,i=[];for(n=0;n>>0,i=0;i0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,t-i.length)).toString().substr(1)+i}var N=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,B=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,W={},V={};function U(e,t,n,i){var r=i;"string"==typeof i&&(r=function(){return this[i]()}),e&&(V[e]=r),t&&(V[t[0]]=function(){return j(r.apply(this,arguments),t[1],t[2])}),n&&(V[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),e)})}function z(e,t){return e.isValid()?(t=q(t,e.localeData()),W[t]=W[t]||function(e){var t,n,i,r=e.match(N);for(t=0,n=r.length;t=0&&B.test(e);)e=e.replace(B,i),B.lastIndex=0,n-=1;return e}var G=/\d/,K=/\d\d/,J=/\d{3}/,Z=/\d{4}/,Q=/[+-]?\d{6}/,X=/\d\d?/,$=/\d\d\d\d?/,ee=/\d\d\d\d\d\d?/,te=/\d{1,3}/,ne=/\d{1,4}/,ie=/[+-]?\d{1,6}/,re=/\d+/,ae=/[+-]?\d+/,oe=/Z|[+-]\d\d:?\d\d/gi,se=/Z|[+-]\d\d(?::?\d\d)?/gi,ue=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,le={};function ce(e,t,n){le[e]=O(t)?t:function(e,i){return e&&n?n:t}}function de(e,t){return d(le,e)?le[e](t._strict,t._locale):new RegExp(he(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,i,r){return t||n||i||r})))}function he(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var fe={};function pe(e,t){var n,i=t;for("string"==typeof e&&(e=[e]),u(t)&&(i=function(e,n){n[t]=M(e)}),n=0;n68?1900:2e3)};var ye,be=we("FullYear",!0);function we(e,t){return function(n){return null!=n?(Me(this,e,n),r.updateOffset(this,t),this):ke(this,e)}}function ke(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function Me(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&_e(e.year())&&1===e.month()&&29===e.date()?e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),Se(n,e.month())):e._d["set"+(e._isUTC?"UTC":"")+t](n))}function Se(e,t){if(isNaN(e)||isNaN(t))return NaN;var n=(t%12+12)%12;return e+=(t-n)/12,1===n?_e(e)?29:28:31-n%7%2}ye=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t=0&&isFinite(s.getFullYear())&&s.setFullYear(e),s}function Ie(e){var t=new Date(Date.UTC.apply(null,arguments));return e<100&&e>=0&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e),t}function Re(e,t,n){var i=7+t-n;return-(7+Ie(e,0,i).getUTCDay()-t)%7+i-1}function Fe(e,t,n,i,r){var a,o,s=1+7*(t-1)+(7+n-i)%7+Re(e,i,r);return s<=0?o=ve(a=e-1)+s:s>ve(e)?(a=e+1,o=s-ve(e)):(a=e,o=s),{year:a,dayOfYear:o}}function He(e,t,n){var i,r,a=Re(e.year(),t,n),o=Math.floor((e.dayOfYear()-a-1)/7)+1;return o<1?i=o+je(r=e.year()-1,t,n):o>je(e.year(),t,n)?(i=o-je(e.year(),t,n),r=e.year()+1):(r=e.year(),i=o),{week:i,year:r}}function je(e,t,n){var i=Re(e,t,n),r=Re(e+1,t,n);return(ve(e)-i+r)/7}U("w",["ww",2],"wo","week"),U("W",["WW",2],"Wo","isoWeek"),Y("week","w"),Y("isoWeek","W"),H("week",5),H("isoWeek",5),ce("w",X),ce("ww",X,K),ce("W",X),ce("WW",X,K),me(["w","ww","W","WW"],function(e,t,n,i){t[i.substr(0,1)]=M(e)}),U("d",0,"do","day"),U("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),U("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),U("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),U("e",0,0,"weekday"),U("E",0,0,"isoWeekday"),Y("day","d"),Y("weekday","e"),Y("isoWeekday","E"),H("day",11),H("weekday",11),H("isoWeekday",11),ce("d",X),ce("e",X),ce("E",X),ce("dd",function(e,t){return t.weekdaysMinRegex(e)}),ce("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ce("dddd",function(e,t){return t.weekdaysRegex(e)}),me(["dd","ddd","dddd"],function(e,t,n,i){var r=n._locale.weekdaysParse(e,i,n._strict);null!=r?t.d=r:p(n).invalidWeekday=e}),me(["d","e","E"],function(e,t,n,i){t[i]=M(e)});var Ne="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Be="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),We="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function Ve(e,t,n){var i,r,a,o=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)a=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(a,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(a,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(a,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(r=ye.call(this._weekdaysParse,o))?r:null:"ddd"===t?-1!==(r=ye.call(this._shortWeekdaysParse,o))?r:null:-1!==(r=ye.call(this._minWeekdaysParse,o))?r:null:"dddd"===t?-1!==(r=ye.call(this._weekdaysParse,o))||-1!==(r=ye.call(this._shortWeekdaysParse,o))||-1!==(r=ye.call(this._minWeekdaysParse,o))?r:null:"ddd"===t?-1!==(r=ye.call(this._shortWeekdaysParse,o))||-1!==(r=ye.call(this._weekdaysParse,o))||-1!==(r=ye.call(this._minWeekdaysParse,o))?r:null:-1!==(r=ye.call(this._minWeekdaysParse,o))||-1!==(r=ye.call(this._weekdaysParse,o))||-1!==(r=ye.call(this._shortWeekdaysParse,o))?r:null}var Ue=ue,ze=ue,qe=ue;function Ge(){function e(e,t){return t.length-e.length}var t,n,i,r,a,o=[],s=[],u=[],l=[];for(t=0;t<7;t++)n=f([2e3,1]).day(t),i=this.weekdaysMin(n,""),r=this.weekdaysShort(n,""),a=this.weekdays(n,""),o.push(i),s.push(r),u.push(a),l.push(i),l.push(r),l.push(a);for(o.sort(e),s.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)s[t]=he(s[t]),u[t]=he(u[t]),l[t]=he(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function Ke(){return this.hours()%12||12}function Je(e,t){U(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Ze(e,t){return t._meridiemParse}U("H",["HH",2],0,"hour"),U("h",["hh",2],0,Ke),U("k",["kk",2],0,function(){return this.hours()||24}),U("hmm",0,0,function(){return""+Ke.apply(this)+j(this.minutes(),2)}),U("hmmss",0,0,function(){return""+Ke.apply(this)+j(this.minutes(),2)+j(this.seconds(),2)}),U("Hmm",0,0,function(){return""+this.hours()+j(this.minutes(),2)}),U("Hmmss",0,0,function(){return""+this.hours()+j(this.minutes(),2)+j(this.seconds(),2)}),Je("a",!0),Je("A",!1),Y("hour","h"),H("hour",13),ce("a",Ze),ce("A",Ze),ce("H",X),ce("h",X),ce("k",X),ce("HH",X,K),ce("hh",X,K),ce("kk",X,K),ce("hmm",$),ce("hmmss",ee),ce("Hmm",$),ce("Hmmss",ee),pe(["H","HH"],3),pe(["k","kk"],function(e,t,n){var i=M(e);t[3]=24===i?0:i}),pe(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),pe(["h","hh"],function(e,t,n){t[3]=M(e),p(n).bigHour=!0}),pe("hmm",function(e,t,n){var i=e.length-2;t[3]=M(e.substr(0,i)),t[4]=M(e.substr(i)),p(n).bigHour=!0}),pe("hmmss",function(e,t,n){var i=e.length-4,r=e.length-2;t[3]=M(e.substr(0,i)),t[4]=M(e.substr(i,2)),t[5]=M(e.substr(r)),p(n).bigHour=!0}),pe("Hmm",function(e,t,n){var i=e.length-2;t[3]=M(e.substr(0,i)),t[4]=M(e.substr(i))}),pe("Hmmss",function(e,t,n){var i=e.length-4,r=e.length-2;t[3]=M(e.substr(0,i)),t[4]=M(e.substr(i,2)),t[5]=M(e.substr(r))});var Qe,Xe=we("Hours",!0),$e={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:xe,monthsShort:Le,week:{dow:0,doy:6},weekdays:Ne,weekdaysMin:We,weekdaysShort:Be,meridiemParse:/[ap]\.?m?\.?/i},et={},tt={};function nt(e){return e?e.toLowerCase().replace("_","-"):e}function it(t){var i=null;if(!et[t]&&void 0!==e&&e&&e.exports)try{i=Qe._abbr,n("RnhZ")("./"+t),rt(i)}catch(r){}return et[t]}function rt(e,t){var n;return e&&((n=s(t)?ot(e):at(e,t))?Qe=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),Qe._abbr}function at(e,t){if(null!==t){var n,i=$e;if(t.abbr=e,null!=et[e])D("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=et[e]._config;else if(null!=t.parentLocale)if(null!=et[t.parentLocale])i=et[t.parentLocale]._config;else{if(null==(n=it(t.parentLocale)))return tt[t.parentLocale]||(tt[t.parentLocale]=[]),tt[t.parentLocale].push({name:e,config:t}),null;i=n._config}return et[e]=new P(E(i,t)),tt[e]&&tt[e].forEach(function(e){at(e.name,e.config)}),rt(e),et[e]}return delete et[e],null}function ot(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return Qe;if(!a(e)){if(t=it(e))return t;e=[e]}return function(e){for(var t,n,i,r,a=0;a0;){if(i=it(r.slice(0,t).join("-")))return i;if(n&&n.length>=t&&S(r,n,!0)>=t-1)break;t--}a++}return Qe}(e)}function st(e){var t,n=e._a;return n&&-2===p(e).overflow&&(t=n[1]<0||n[1]>11?1:n[2]<1||n[2]>Se(n[0],n[1])?2:n[3]<0||n[3]>24||24===n[3]&&(0!==n[4]||0!==n[5]||0!==n[6])?3:n[4]<0||n[4]>59?4:n[5]<0||n[5]>59?5:n[6]<0||n[6]>999?6:-1,p(e)._overflowDayOfYear&&(t<0||t>2)&&(t=2),p(e)._overflowWeeks&&-1===t&&(t=7),p(e)._overflowWeekday&&-1===t&&(t=8),p(e).overflow=t),e}function ut(e,t,n){return null!=e?e:null!=t?t:n}function lt(e){var t,n,i,a,o,s=[];if(!e._d){for(i=function(e){var t=new Date(r.now());return e._useUTC?[t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()]:[t.getFullYear(),t.getMonth(),t.getDate()]}(e),e._w&&null==e._a[2]&&null==e._a[1]&&function(e){var t,n,i,r,a,o,s,u;if(null!=(t=e._w).GG||null!=t.W||null!=t.E)a=1,o=4,n=ut(t.GG,e._a[0],He(Mt(),1,4).year),i=ut(t.W,1),((r=ut(t.E,1))<1||r>7)&&(u=!0);else{a=e._locale._week.dow,o=e._locale._week.doy;var l=He(Mt(),a,o);n=ut(t.gg,e._a[0],l.year),i=ut(t.w,l.week),null!=t.d?((r=t.d)<0||r>6)&&(u=!0):null!=t.e?(r=t.e+a,(t.e<0||t.e>6)&&(u=!0)):r=a}i<1||i>je(n,a,o)?p(e)._overflowWeeks=!0:null!=u?p(e)._overflowWeekday=!0:(s=Fe(n,i,r,a,o),e._a[0]=s.year,e._dayOfYear=s.dayOfYear)}(e),null!=e._dayOfYear&&(o=ut(e._a[0],i[0]),(e._dayOfYear>ve(o)||0===e._dayOfYear)&&(p(e)._overflowDayOfYear=!0),n=Ie(o,0,e._dayOfYear),e._a[1]=n.getUTCMonth(),e._a[2]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=s[t]=i[t];for(;t<7;t++)e._a[t]=s[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[3]&&0===e._a[4]&&0===e._a[5]&&0===e._a[6]&&(e._nextDay=!0,e._a[3]=0),e._d=(e._useUTC?Ie:Ye).apply(null,s),a=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[3]=24),e._w&&void 0!==e._w.d&&e._w.d!==a&&(p(e).weekdayMismatch=!0)}}var ct=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,dt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ht=/Z|[+-]\d\d(?::?\d\d)?/,ft=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],pt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],mt=/^\/?Date\((\-?\d+)/i;function gt(e){var t,n,i,r,a,o,s=e._i,u=ct.exec(s)||dt.exec(s);if(u){for(p(e).iso=!0,t=0,n=ft.length;t0&&p(e).unusedInput.push(o),s=s.slice(s.indexOf(n)+n.length),l+=n.length),V[a]?(n?p(e).empty=!1:p(e).unusedTokens.push(a),ge(a,n,e)):e._strict&&!n&&p(e).unusedTokens.push(a);p(e).charsLeftOver=u-l,s.length>0&&p(e).unusedInput.push(s),e._a[3]<=12&&!0===p(e).bigHour&&e._a[3]>0&&(p(e).bigHour=void 0),p(e).parsedDateParts=e._a.slice(0),p(e).meridiem=e._meridiem,e._a[3]=function(e,t,n){var i;return null==n?t:null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((i=e.isPM(n))&&t<12&&(t+=12),i||12!==t||(t=0),t):t}(e._locale,e._a[3],e._meridiem),lt(e),st(e)}else yt(e);else gt(e)}function wt(e){var t=e._i,n=e._f;return e._locale=e._locale||ot(e._l),null===t||void 0===n&&""===t?g({nullInput:!0}):("string"==typeof t&&(e._i=t=e._locale.preparse(t)),w(t)?new b(st(t)):(l(t)?e._d=t:a(n)?function(e){var t,n,i,r,a;if(0===e._f.length)return p(e).invalidFormat=!0,void(e._d=new Date(NaN));for(r=0;rthis?this:e:g()});function xt(e,t){var n,i;if(1===t.length&&a(t[0])&&(t=t[0]),!t.length)return Mt();for(n=t[0],i=1;i(a=je(e,i,r))&&(t=a),Xt.call(this,e,t,n,i,r))}function Xt(e,t,n,i,r){var a=Fe(e,t,n,i,r),o=Ie(a.year,0,a.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Zt("gggg","weekYear"),Zt("ggggg","weekYear"),Zt("GGGG","isoWeekYear"),Zt("GGGGG","isoWeekYear"),Y("weekYear","gg"),Y("isoWeekYear","GG"),H("weekYear",1),H("isoWeekYear",1),ce("G",ae),ce("g",ae),ce("GG",X,K),ce("gg",X,K),ce("GGGG",ne,Z),ce("gggg",ne,Z),ce("GGGGG",ie,Q),ce("ggggg",ie,Q),me(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,i){t[i.substr(0,2)]=M(e)}),me(["gg","GG"],function(e,t,n,i){t[i]=r.parseTwoDigitYear(e)}),U("Q",0,"Qo","quarter"),Y("quarter","Q"),H("quarter",7),ce("Q",G),pe("Q",function(e,t){t[1]=3*(M(e)-1)}),U("D",["DD",2],"Do","date"),Y("date","D"),H("date",9),ce("D",X),ce("DD",X,K),ce("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),pe(["D","DD"],2),pe("Do",function(e,t){t[2]=M(e.match(X)[0])});var $t=we("Date",!0);U("DDD",["DDDD",3],"DDDo","dayOfYear"),Y("dayOfYear","DDD"),H("dayOfYear",4),ce("DDD",te),ce("DDDD",J),pe(["DDD","DDDD"],function(e,t,n){n._dayOfYear=M(e)}),U("m",["mm",2],0,"minute"),Y("minute","m"),H("minute",14),ce("m",X),ce("mm",X,K),pe(["m","mm"],4);var en=we("Minutes",!1);U("s",["ss",2],0,"second"),Y("second","s"),H("second",15),ce("s",X),ce("ss",X,K),pe(["s","ss"],5);var tn,nn=we("Seconds",!1);for(U("S",0,0,function(){return~~(this.millisecond()/100)}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),Y("millisecond","ms"),H("millisecond",16),ce("S",te,G),ce("SS",te,K),ce("SSS",te,J),tn="SSSS";tn.length<=9;tn+="S")ce(tn,re);function rn(e,t){t[6]=M(1e3*("0."+e))}for(tn="S";tn.length<=9;tn+="S")pe(tn,rn);var an=we("Milliseconds",!1);U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var on=b.prototype;function sn(e){return e}on.add=Ut,on.calendar=function(e,t){var n=e||Mt(),i=Yt(n,this).startOf("day"),a=r.calendarFormat(this,i)||"sameElse",o=t&&(O(t[a])?t[a].call(this,n):t[a]);return this.format(o||this.localeData().calendar(a,this,Mt(n)))},on.clone=function(){return new b(this)},on.diff=function(e,t,n){var i,r,a;if(!this.isValid())return NaN;if(!(i=Yt(e,this)).isValid())return NaN;switch(r=6e4*(i.utcOffset()-this.utcOffset()),t=I(t)){case"year":a=qt(this,i)/12;break;case"month":a=qt(this,i);break;case"quarter":a=qt(this,i)/3;break;case"second":a=(this-i)/1e3;break;case"minute":a=(this-i)/6e4;break;case"hour":a=(this-i)/36e5;break;case"day":a=(this-i-r)/864e5;break;case"week":a=(this-i-r)/6048e5;break;default:a=this-i}return n?a:k(a)},on.endOf=function(e){return void 0===(e=I(e))||"millisecond"===e?this:("date"===e&&(e="day"),this.startOf(e).add(1,"isoWeek"===e?"week":e).subtract(1,"ms"))},on.format=function(e){e||(e=this.isUtc()?r.defaultFormatUtc:r.defaultFormat);var t=z(this,e);return this.localeData().postformat(t)},on.from=function(e,t){return this.isValid()&&(w(e)&&e.isValid()||Mt(e).isValid())?jt({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},on.fromNow=function(e){return this.from(Mt(),e)},on.to=function(e,t){return this.isValid()&&(w(e)&&e.isValid()||Mt(e).isValid())?jt({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},on.toNow=function(e){return this.to(Mt(),e)},on.get=function(e){return O(this[e=I(e)])?this[e]():this},on.invalidAt=function(){return p(this).overflow},on.isAfter=function(e,t){var n=w(e)?e:Mt(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=I(s(t)?"millisecond":t))?this.valueOf()>n.valueOf():n.valueOf()9999?z(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):O(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",z(n,"Z")):z(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},on.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="";this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var n="["+e+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY";return this.format(n+i+"-MM-DD[T]HH:mm:ss.SSS"+t+'[")]')},on.toJSON=function(){return this.isValid()?this.toISOString():null},on.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},on.unix=function(){return Math.floor(this.valueOf()/1e3)},on.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},on.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},on.year=be,on.isLeapYear=function(){return _e(this.year())},on.weekYear=function(e){return Qt.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},on.isoWeekYear=function(e){return Qt.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},on.quarter=on.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},on.month=Oe,on.daysInMonth=function(){return Se(this.year(),this.month())},on.week=on.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},on.isoWeek=on.isoWeeks=function(e){var t=He(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},on.weeksInYear=function(){var e=this.localeData()._week;return je(this.year(),e.dow,e.doy)},on.isoWeeksInYear=function(){return je(this.year(),1,4)},on.date=$t,on.day=on.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(e=function(e,t){return"string"!=typeof e?e:isNaN(e)?"number"==typeof(e=t.weekdaysParse(e))?e:null:parseInt(e,10)}(e,this.localeData()),this.add(e-t,"d")):t},on.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")},on.isoWeekday=function(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=function(e,t){return"string"==typeof e?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}(e,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7},on.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")},on.hour=on.hours=Xe,on.minute=on.minutes=en,on.second=on.seconds=nn,on.millisecond=on.milliseconds=an,on.utcOffset=function(e,t,n){var i,a=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null!=e){if("string"==typeof e){if(null===(e=At(se,e)))return this}else Math.abs(e)<16&&!n&&(e*=60);return!this._isUTC&&t&&(i=It(this)),this._offset=e,this._isUTC=!0,null!=i&&this.add(i,"m"),a!==e&&(!t||this._changeInProgress?Vt(this,jt(e-a,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,r.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?a:It(this)},on.utc=function(e){return this.utcOffset(0,e)},on.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(It(this),"m")),this},on.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var e=At(oe,this._i);null!=e?this.utcOffset(e):this.utcOffset(0,!0)}return this},on.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?Mt(e).utcOffset():0,(this.utcOffset()-e)%60==0)},on.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},on.isLocal=function(){return!!this.isValid()&&!this._isUTC},on.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},on.isUtc=Rt,on.isUTC=Rt,on.zoneAbbr=function(){return this._isUTC?"UTC":""},on.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},on.dates=x("dates accessor is deprecated. Use date instead.",$t),on.months=x("months accessor is deprecated. Use month instead",Oe),on.years=x("years accessor is deprecated. Use year instead",be),on.zone=x("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),on.isDSTShifted=x("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var e={};if(_(e,this),(e=wt(e))._a){var t=e._isUTC?f(e._a):Mt(e._a);this._isDSTShifted=this.isValid()&&S(e._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var un=P.prototype;function ln(e,t,n,i){var r=ot(),a=f().set(i,t);return r[n](a,e)}function cn(e,t,n){if(u(e)&&(t=e,e=void 0),e=e||"",null!=t)return ln(e,t,n,"month");var i,r=[];for(i=0;i<12;i++)r[i]=ln(e,i,n,"month");return r}function dn(e,t,n,i){"boolean"==typeof e?(u(t)&&(n=t,t=void 0),t=t||""):(n=t=e,e=!1,u(t)&&(n=t,t=void 0),t=t||"");var r,a=ot(),o=e?a._week.dow:0;if(null!=n)return ln(t,(n+o)%7,i,"day");var s=[];for(r=0;r<7;r++)s[r]=ln(t,(r+o)%7,i,"day");return s}un.calendar=function(e,t,n){var i=this._calendar[e]||this._calendar.sameElse;return O(i)?i.call(t,n):i},un.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])},un.invalidDate=function(){return this._invalidDate},un.ordinal=function(e){return this._ordinal.replace("%d",e)},un.preparse=sn,un.postformat=sn,un.relativeTime=function(e,t,n,i){var r=this._relativeTime[n];return O(r)?r(e,t,n,i):r.replace(/%d/i,e)},un.pastFuture=function(e,t){var n=this._relativeTime[e>0?"future":"past"];return O(n)?n(t):n.replace(/%s/i,t)},un.set=function(e){var t,n;for(n in e)O(t=e[n])?this[n]=t:this["_"+n]=t;this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},un.months=function(e,t){return e?a(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||Ce).test(t)?"format":"standalone"][e.month()]:a(this._months)?this._months:this._months.standalone},un.monthsShort=function(e,t){return e?a(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[Ce.test(t)?"format":"standalone"][e.month()]:a(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},un.monthsParse=function(e,t,n){var i,r,a;if(this._monthsParseExact)return Te.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(r=f([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(r,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(r,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(a="^"+this.months(r,"")+"|^"+this.monthsShort(r,""),this._monthsParse[i]=new RegExp(a.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[i].test(e))return i;if(n&&"MMM"===t&&this._shortMonthsParse[i].test(e))return i;if(!n&&this._monthsParse[i].test(e))return i}},un.monthsRegex=function(e){return this._monthsParseExact?(d(this,"_monthsRegex")||Ae.call(this),e?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=Pe),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},un.monthsShortRegex=function(e){return this._monthsParseExact?(d(this,"_monthsRegex")||Ae.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=Ee),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},un.week=function(e){return He(e,this._week.dow,this._week.doy).week},un.firstDayOfYear=function(){return this._week.doy},un.firstDayOfWeek=function(){return this._week.dow},un.weekdays=function(e,t){return e?a(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][e.day()]:a(this._weekdays)?this._weekdays:this._weekdays.standalone},un.weekdaysMin=function(e){return e?this._weekdaysMin[e.day()]:this._weekdaysMin},un.weekdaysShort=function(e){return e?this._weekdaysShort[e.day()]:this._weekdaysShort},un.weekdaysParse=function(e,t,n){var i,r,a;if(this._weekdaysParseExact)return Ve.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(r=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(r,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(r,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(r,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(a="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[i]=new RegExp(a.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[i].test(e))return i;if(n&&"ddd"===t&&this._shortWeekdaysParse[i].test(e))return i;if(n&&"dd"===t&&this._minWeekdaysParse[i].test(e))return i;if(!n&&this._weekdaysParse[i].test(e))return i}},un.weekdaysRegex=function(e){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Ge.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Ue),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},un.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Ge.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ze),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},un.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Ge.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=qe),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},un.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},un.meridiem=function(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"},rt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===M(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),r.lang=x("moment.lang is deprecated. Use moment.locale instead.",rt),r.langData=x("moment.langData is deprecated. Use moment.localeData instead.",ot);var hn=Math.abs;function fn(e,t,n,i){var r=jt(t,n);return e._milliseconds+=i*r._milliseconds,e._days+=i*r._days,e._months+=i*r._months,e._bubble()}function pn(e){return e<0?Math.floor(e):Math.ceil(e)}function mn(e){return 4800*e/146097}function gn(e){return 146097*e/4800}function vn(e){return function(){return this.as(e)}}var _n=vn("ms"),yn=vn("s"),bn=vn("m"),wn=vn("h"),kn=vn("d"),Mn=vn("w"),Sn=vn("M"),Cn=vn("y");function xn(e){return function(){return this.isValid()?this._data[e]:NaN}}var Ln=xn("milliseconds"),Tn=xn("seconds"),Dn=xn("minutes"),On=xn("hours"),En=xn("days"),Pn=xn("months"),An=xn("years"),Yn=Math.round,In={ss:44,s:45,m:45,h:22,d:26,M:11};function Rn(e,t,n,i,r){return r.relativeTime(t||1,!!n,e,i)}var Fn=Math.abs;function Hn(e){return(e>0)-(e<0)||+e}function jn(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n=Fn(this._milliseconds)/1e3,i=Fn(this._days),r=Fn(this._months);e=k(n/60),t=k(e/60),n%=60,e%=60;var a=k(r/12),o=r%=12,s=i,u=t,l=e,c=n?n.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var h=d<0?"-":"",f=Hn(this._months)!==Hn(d)?"-":"",p=Hn(this._days)!==Hn(d)?"-":"",m=Hn(this._milliseconds)!==Hn(d)?"-":"";return h+"P"+(a?f+a+"Y":"")+(o?f+o+"M":"")+(s?p+s+"D":"")+(u||l||c?"T":"")+(u?m+u+"H":"")+(l?m+l+"M":"")+(c?m+c+"S":"")}var Nn=Tt.prototype;return Nn.isValid=function(){return this._isValid},Nn.abs=function(){var e=this._data;return this._milliseconds=hn(this._milliseconds),this._days=hn(this._days),this._months=hn(this._months),e.milliseconds=hn(e.milliseconds),e.seconds=hn(e.seconds),e.minutes=hn(e.minutes),e.hours=hn(e.hours),e.months=hn(e.months),e.years=hn(e.years),this},Nn.add=function(e,t){return fn(this,e,t,1)},Nn.subtract=function(e,t){return fn(this,e,t,-1)},Nn.as=function(e){if(!this.isValid())return NaN;var t,n,i=this._milliseconds;if("month"===(e=I(e))||"year"===e)return n=this._months+mn(t=this._days+i/864e5),"month"===e?n:n/12;switch(t=this._days+Math.round(gn(this._months)),e){case"week":return t/7+i/6048e5;case"day":return t+i/864e5;case"hour":return 24*t+i/36e5;case"minute":return 1440*t+i/6e4;case"second":return 86400*t+i/1e3;case"millisecond":return Math.floor(864e5*t)+i;default:throw new Error("Unknown unit "+e)}},Nn.asMilliseconds=_n,Nn.asSeconds=yn,Nn.asMinutes=bn,Nn.asHours=wn,Nn.asDays=kn,Nn.asWeeks=Mn,Nn.asMonths=Sn,Nn.asYears=Cn,Nn.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*M(this._months/12):NaN},Nn._bubble=function(){var e,t,n,i,r,a=this._milliseconds,o=this._days,s=this._months,u=this._data;return a>=0&&o>=0&&s>=0||a<=0&&o<=0&&s<=0||(a+=864e5*pn(gn(s)+o),o=0,s=0),u.milliseconds=a%1e3,e=k(a/1e3),u.seconds=e%60,t=k(e/60),u.minutes=t%60,n=k(t/60),u.hours=n%24,o+=k(n/24),s+=r=k(mn(o)),o-=pn(gn(r)),i=k(s/12),s%=12,u.days=o,u.months=s,u.years=i,this},Nn.clone=function(){return jt(this)},Nn.get=function(e){return e=I(e),this.isValid()?this[e+"s"]():NaN},Nn.milliseconds=Ln,Nn.seconds=Tn,Nn.minutes=Dn,Nn.hours=On,Nn.days=En,Nn.weeks=function(){return k(this.days()/7)},Nn.months=Pn,Nn.years=An,Nn.humanize=function(e){if(!this.isValid())return this.localeData().invalidDate();var t=this.localeData(),n=function(e,t,n){var i=jt(e).abs(),r=Yn(i.as("s")),a=Yn(i.as("m")),o=Yn(i.as("h")),s=Yn(i.as("d")),u=Yn(i.as("M")),l=Yn(i.as("y")),c=r<=In.ss&&["s",r]||r0,c[4]=n,Rn.apply(null,c)}(this,!e,t);return e&&(n=t.pastFuture(+this,n)),t.postformat(n)},Nn.toISOString=jn,Nn.toString=jn,Nn.toJSON=jn,Nn.locale=Gt,Nn.localeData=Jt,Nn.toIsoString=x("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",jn),Nn.lang=Kt,U("X",0,0,"unix"),U("x",0,0,"valueOf"),ce("x",ae),ce("X",/[+-]?\d+(\.\d{1,3})?/),pe("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),pe("x",function(e,t,n){n._d=new Date(M(e))}),r.version="2.21.0",t=Mt,r.fn=on,r.min=function(){return xt("isBefore",[].slice.call(arguments,0))},r.max=function(){return xt("isAfter",[].slice.call(arguments,0))},r.now=function(){return Date.now?Date.now():+new Date},r.utc=f,r.unix=function(e){return Mt(1e3*e)},r.months=function(e,t){return cn(e,t,"months")},r.isDate=l,r.locale=rt,r.invalid=g,r.duration=jt,r.isMoment=w,r.weekdays=function(e,t,n){return dn(e,t,n,"weekdays")},r.parseZone=function(){return Mt.apply(null,arguments).parseZone()},r.localeData=ot,r.isDuration=Dt,r.monthsShort=function(e,t){return cn(e,t,"monthsShort")},r.weekdaysMin=function(e,t,n){return dn(e,t,n,"weekdaysMin")},r.defineLocale=at,r.updateLocale=function(e,t){if(null!=t){var n,i,r=$e;null!=(i=it(e))&&(r=i._config),(n=new P(t=E(r,t))).parentLocale=et[e],et[e]=n,rt(e)}else null!=et[e]&&(null!=et[e].parentLocale?et[e]=et[e].parentLocale:null!=et[e]&&delete et[e]);return et[e]},r.locales=function(){return L(et)},r.weekdaysShort=function(e,t,n){return dn(e,t,n,"weekdaysShort")},r.normalizeUnits=I,r.relativeTimeRounding=function(e){return void 0===e?Yn:"function"==typeof e&&(Yn=e,!0)},r.relativeTimeThreshold=function(e,t){return void 0!==In[e]&&(void 0===t?In[e]:(In[e]=t,"s"===e&&(In.ss=t-1),!0))},r.calendarFormat=function(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},r.prototype=on,r.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},r}()}).call(this,n("YuTi")(e))},x6pH:function(e,t,n){!function(e){"use strict";e.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(e){return 2===e?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":e+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(e){return 2===e?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":e+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(e){return 2===e?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":e+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(e){return 2===e?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":e%10==0&&10!==e?e+" \u05e9\u05e0\u05d4":e+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(e){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(e)},meridiem:function(e,t,n){return e<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":e<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":e<12?n?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":e<18?n?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(n("wd/R"))},yPMs:function(e,t,n){!function(e){"use strict";e.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(e){return"M"===e.charAt(0)},meridiem:function(e,t,n){return e<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},z1FC:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={s:["viensas secunds","'iensas secunds"],ss:[e+" secunds",e+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[e+" m\xeduts",e+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[e+" \xfeoras",e+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[e+" ziuas",e+" ziuas"],M:["'n mes","'iens mes"],MM:[e+" mesen",e+" mesen"],y:["'n ar","'iens ar"],yy:[e+" ars",e+" ars"]};return i||t?r[n][0]:r[n][1]}e.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(e){return"d'o"===e.toLowerCase()},meridiem:function(e,t,n){return e>11?n?"d'o":"D'O":n?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},z3Vd:function(e,t,n){!function(e){"use strict";var t="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function n(e,n,i,r){var a=function(e){var n=Math.floor(e%1e3/100),i=Math.floor(e%100/10),r=e%10,a="";return n>0&&(a+=t[n]+"vatlh"),i>0&&(a+=(""!==a?" ":"")+t[i]+"maH"),r>0&&(a+=(""!==a?" ":"")+t[r]),""===a?"pagh":a}(e);switch(i){case"ss":return a+" lup";case"mm":return a+" tup";case"hh":return a+" rep";case"dd":return a+" jaj";case"MM":return a+" jar";case"yy":return a+" DIS"}}e.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(e){var t=e;return-1!==e.indexOf("jaj")?t.slice(0,-3)+"leS":-1!==e.indexOf("jar")?t.slice(0,-3)+"waQ":-1!==e.indexOf("DIS")?t.slice(0,-3)+"nem":t+" pIq"},past:function(e){var t=e;return-1!==e.indexOf("jaj")?t.slice(0,-3)+"Hu\u2019":-1!==e.indexOf("jar")?t.slice(0,-3)+"wen":-1!==e.indexOf("DIS")?t.slice(0,-3)+"ben":t+" ret"},s:"puS lup",ss:n,m:"wa\u2019 tup",mm:n,h:"wa\u2019 rep",hh:n,d:"wa\u2019 jaj",dd:n,M:"wa\u2019 jar",MM:n,y:"wa\u2019 DIS",yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("wd/R"))},zUnb:function(e,t,n){"use strict";function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function r(e,t,n){return(r="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(e,t,n){var r=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=i(e)););return e}(e,t);if(r){var a=Object.getOwnPropertyDescriptor(r,t);return a.get?a.get.call(n):a.value}})(e,t,n||e)}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,u=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return o=e.done,e},e:function(e){u=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(u)throw a}}}}function d(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||s(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function h(e,t){return(h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function f(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(e){return!1}}function p(e,t,n){return(p=f()?Reflect.construct:function(e,t,n){var i=[null];i.push.apply(i,t);var r=new(Function.bind.apply(e,i));return n&&h(r,n.prototype),r}).apply(null,arguments)}function m(e,t){for(var n=0;n4&&void 0!==arguments[4]?arguments[4]:new K(e,n,i);if(!r.closed)return t instanceof N?t.subscribe(r):ee(t)(r)}var ne=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"notifyNext",value:function(e,t,n,i,r){this.destination.next(t)}},{key:"notifyError",value:function(e,t){this.destination.error(e)}},{key:"notifyComplete",value:function(e){this.destination.complete()}}]),n}(Y);function ie(e,t){return function(n){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return n.lift(new re(e,t))}}var re=function(){function e(t,n){v(this,e),this.project=t,this.thisArg=n}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new ae(e,this.project,this.thisArg))}}]),e}(),ae=function(e){_(n,e);var t=w(n);function n(e,i,r){var o;return v(this,n),(o=t.call(this,e)).project=i,o.count=0,o.thisArg=r||a(o),o}return g(n,[{key:"_next",value:function(e){var t;try{t=this.project.call(this.thisArg,e,this.count++)}catch(n){return void this.destination.error(n)}this.destination.next(t)}}]),n}(Y);function oe(e,t){return new N(function(n){var i=new L,r=0;return i.add(t.schedule(function(){r!==e.length?(n.next(e[r++]),n.closed||i.add(this.schedule())):n.complete()})),i})}function se(e,t){return t?function(e,t){if(null!=e){if(function(e){return e&&"function"==typeof e[R]}(e))return function(e,t){return new N(function(n){var i=new L;return i.add(t.schedule(function(){var r=e[R]();i.add(r.subscribe({next:function(e){i.add(t.schedule(function(){return n.next(e)}))},error:function(e){i.add(t.schedule(function(){return n.error(e)}))},complete:function(){i.add(t.schedule(function(){return n.complete()}))}}))})),i})}(e,t);if($(e))return function(e,t){return new N(function(n){var i=new L;return i.add(t.schedule(function(){return e.then(function(e){i.add(t.schedule(function(){n.next(e),i.add(t.schedule(function(){return n.complete()}))}))},function(e){i.add(t.schedule(function(){return n.error(e)}))})})),i})}(e,t);if(X(e))return oe(e,t);if(function(e){return e&&"function"==typeof e[Q]}(e)||"string"==typeof e)return function(e,t){if(!e)throw new Error("Iterable cannot be null");return new N(function(n){var i,r=new L;return r.add(function(){i&&"function"==typeof i.return&&i.return()}),r.add(t.schedule(function(){i=e[Q](),r.add(t.schedule(function(){if(!n.closed){var e,t;try{var r=i.next();e=r.value,t=r.done}catch(a){return void n.error(a)}t?n.complete():(n.next(e),this.schedule())}}))})),r})}(e,t)}throw new TypeError((null!==e&&typeof e||e)+" is not observable")}(e,t):e instanceof N?e:new N(ee(e))}function ue(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Number.POSITIVE_INFINITY;return"function"==typeof t?function(i){return i.pipe(ue(function(n,i){return se(e(n,i)).pipe(ie(function(e,r){return t(n,e,i,r)}))},n))}:("number"==typeof t&&(n=t),function(t){return t.lift(new le(e,n))})}var le=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.POSITIVE_INFINITY;v(this,e),this.project=t,this.concurrent=n}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new ce(e,this.project,this.concurrent))}}]),e}(),ce=function(e){_(n,e);var t=w(n);function n(e,i){var r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Number.POSITIVE_INFINITY;return v(this,n),(r=t.call(this,e)).project=i,r.concurrent=a,r.hasCompleted=!1,r.buffer=[],r.active=0,r.index=0,r}return g(n,[{key:"_next",value:function(e){this.active0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()}}]),n}(ne);function de(e){return e}function he(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Number.POSITIVE_INFINITY;return ue(de,e)}function fe(e,t){return t?oe(e,t):new N(J(e))}function pe(){for(var e=Number.POSITIVE_INFINITY,t=null,n=arguments.length,i=new Array(n),r=0;r1&&"number"==typeof i[i.length-1]&&(e=i.pop())):"number"==typeof a&&(e=i.pop()),null===t&&1===i.length&&i[0]instanceof N?i[0]:he(e)(fe(i,t))}function me(){return function(e){return e.lift(new ge(e))}}var ge=function(){function e(t){v(this,e),this.connectable=t}return g(e,[{key:"call",value:function(e,t){var n=this.connectable;n._refCount++;var i=new ve(e,n),r=t.subscribe(i);return i.closed||(i.connection=n.connect()),r}}]),e}(),ve=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,e)).connectable=i,r}return g(n,[{key:"_unsubscribe",value:function(){var e=this.connectable;if(e){this.connectable=null;var t=e._refCount;if(t<=0)this.connection=null;else if(e._refCount=t-1,t>1)this.connection=null;else{var n=this.connection,i=e._connection;this.connection=null,!i||n&&i!==n||i.unsubscribe()}}else this.connection=null}}]),n}(Y),_e=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this)).source=e,r.subjectFactory=i,r._refCount=0,r._isComplete=!1,r}return g(n,[{key:"_subscribe",value:function(e){return this.getSubject().subscribe(e)}},{key:"getSubject",value:function(){var e=this._subject;return e&&!e.isStopped||(this._subject=this.subjectFactory()),this._subject}},{key:"connect",value:function(){var e=this._connection;return e||(this._isComplete=!1,(e=this._connection=new L).add(this.source.subscribe(new be(this.getSubject(),this))),e.closed&&(this._connection=null,e=L.EMPTY)),e}},{key:"refCount",value:function(){return me()(this)}}]),n}(N),ye=function(){var e=_e.prototype;return{operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:e._subscribe},_isComplete:{value:e._isComplete,writable:!0},getSubject:{value:e.getSubject},connect:{value:e.connect},refCount:{value:e.refCount}}}(),be=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,e)).connectable=i,r}return g(n,[{key:"_error",value:function(e){this._unsubscribe(),r(i(n.prototype),"_error",this).call(this,e)}},{key:"_complete",value:function(){this.connectable._isComplete=!0,this._unsubscribe(),r(i(n.prototype),"_complete",this).call(this)}},{key:"_unsubscribe",value:function(){var e=this.connectable;if(e){this.connectable=null;var t=e._connection;e._refCount=0,e._subject=null,e._connection=null,t&&t.unsubscribe()}}}]),n}(U);function we(){return new z}function ke(){return function(e){return me()((t=we,function(e){var n;n="function"==typeof t?t:function(){return t};var i=Object.create(e,ye);return i.source=e,i.subjectFactory=n,i})(e));var t}}function Me(e){for(var t in e)if(e[t]===Me)return t;throw Error("Could not find renamed property on target object.")}function Se(e,t){for(var n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n])}function Ce(e){if("string"==typeof e)return e;if(Array.isArray(e))return"["+e.map(Ce).join(", ")+"]";if(null==e)return""+e;if(e.overriddenName)return"".concat(e.overriddenName);if(e.name)return"".concat(e.name);var t=e.toString();if(null==t)return""+t;var n=t.indexOf("\n");return-1===n?t:t.substring(0,n)}function xe(e,t){return null==e||""===e?null===t?"":t:null==t||""===t?e:e+" "+t}var Le=Me({__forward_ref__:Me});function Te(e){return e.__forward_ref__=Te,e.toString=function(){return Ce(this())},e}function De(e){return Oe(e)?e():e}function Oe(e){return"function"==typeof e&&e.hasOwnProperty(Le)&&e.__forward_ref__===Te}function Ee(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function Pe(e){return{factory:e.factory,providers:e.providers||[],imports:e.imports||[]}}function Ae(e){return Ye(e,Fe)||Ye(e,je)}function Ye(e,t){return e.hasOwnProperty(t)?e[t]:null}function Ie(e){return e&&(e.hasOwnProperty(He)||e.hasOwnProperty(Ne))?e[He]:null}var Re,Fe=Me({"\u0275prov":Me}),He=Me({"\u0275inj":Me}),je=Me({ngInjectableDef:Me}),Ne=Me({ngInjectorDef:Me}),Be=function(e){return e[e.Default=0]="Default",e[e.Host=1]="Host",e[e.Self=2]="Self",e[e.SkipSelf=4]="SkipSelf",e[e.Optional=8]="Optional",e}({});function We(){return Re}function Ve(e){var t=Re;return Re=e,t}function Ue(e,t,n){var i=Ae(e);if(i&&"root"==i.providedIn)return void 0===i.value?i.value=i.factory():i.value;if(n&Be.Optional)return null;if(void 0!==t)return t;throw new Error("Injector: NOT_FOUND [".concat(Ce(e),"]"))}function ze(e){return{toString:e}.toString()}var qe=function(e){return e[e.OnPush=0]="OnPush",e[e.Default=1]="Default",e}({}),Ge=function(e){return e[e.Emulated=0]="Emulated",e[e.None=2]="None",e[e.ShadowDom=3]="ShadowDom",e}({}),Ke="undefined"!=typeof globalThis&&globalThis,Je="undefined"!=typeof window&&window,Ze="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,Qe="undefined"!=typeof global&&global,Xe=Ke||Qe||Je||Ze,$e={},et=[],tt=Me({"\u0275cmp":Me}),nt=Me({"\u0275dir":Me}),it=Me({"\u0275pipe":Me}),rt=Me({"\u0275mod":Me}),at=Me({"\u0275loc":Me}),ot=Me({"\u0275fac":Me}),st=Me({__NG_ELEMENT_ID__:Me}),ut=0;function lt(e){return ze(function(){var t={},n={type:e.type,providersResolver:null,decls:e.decls,vars:e.vars,factory:null,template:e.template||null,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:t,inputs:null,outputs:null,exportAs:e.exportAs||null,onPush:e.changeDetection===qe.OnPush,directiveDefs:null,pipeDefs:null,selectors:e.selectors||et,viewQuery:e.viewQuery||null,features:e.features||null,data:e.data||{},encapsulation:e.encapsulation||Ge.Emulated,id:"c",styles:e.styles||et,_:null,setInput:null,schemas:e.schemas||null,tView:null},i=e.directives,r=e.features,a=e.pipes;return n.id+=ut++,n.inputs=mt(e.inputs,t),n.outputs=mt(e.outputs),r&&r.forEach(function(e){return e(n)}),n.directiveDefs=i?function(){return("function"==typeof i?i():i).map(dt)}:null,n.pipeDefs=a?function(){return("function"==typeof a?a():a).map(ht)}:null,n})}function ct(e,t,n){var i=e.\u0275cmp;i.directiveDefs=function(){return t.map(dt)},i.pipeDefs=function(){return n.map(ht)}}function dt(e){return _t(e)||function(e){return e[nt]||null}(e)}function ht(e){return function(e){return e[it]||null}(e)}var ft={};function pt(e){var t={type:e.type,bootstrap:e.bootstrap||et,declarations:e.declarations||et,imports:e.imports||et,exports:e.exports||et,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null};return null!=e.id&&ze(function(){ft[e.id]=e.type}),t}function mt(e,t){if(null==e)return $e;var n={};for(var i in e)if(e.hasOwnProperty(i)){var r=e[i],a=r;Array.isArray(r)&&(a=r[1],r=r[0]),n[r]=i,t&&(t[r]=a)}return n}var gt=lt;function vt(e){return{type:e.type,name:e.name,factory:null,pure:!1!==e.pure,onDestroy:e.type.prototype.ngOnDestroy||null}}function _t(e){return e[tt]||null}function yt(e,t){var n=e[rt]||null;if(!n&&!0===t)throw new Error("Type ".concat(Ce(e)," does not have '\u0275mod' property."));return n}var bt=20,wt=10;function kt(e){return Array.isArray(e)&&"object"==typeof e[1]}function Mt(e){return Array.isArray(e)&&!0===e[1]}function St(e){return 0!=(8&e.flags)}function Ct(e){return 2==(2&e.flags)}function xt(e){return 1==(1&e.flags)}function Lt(e){return null!==e.template}function Tt(e,t){return e.hasOwnProperty(ot)?e[ot]:null}var Dt=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,function(e,t){var n=e?"NG0".concat(e,": "):"";return"".concat(n).concat(t)}(e,i))).code=e,r}return n}(k(Error));function Ot(e){return"string"==typeof e?e:null==e?"":String(e)}function Et(e){return"function"==typeof e?e.name||e.toString():"object"==typeof e&&null!=e&&"function"==typeof e.type?e.type.name||e.type.toString():Ot(e)}function Pt(e,t){var n=t?" in ".concat(t):"";throw new Dt("201","No provider for ".concat(Et(e)," found").concat(n))}var At=function(){function e(t,n,i){v(this,e),this.previousValue=t,this.currentValue=n,this.firstChange=i}return g(e,[{key:"isFirstChange",value:function(){return this.firstChange}}]),e}();function Yt(){return It}function It(e){return e.type.prototype.ngOnChanges&&(e.setInput=Ft),Rt}function Rt(){var e=Ht(this),t=null==e?void 0:e.current;if(t){var n=e.previous;if(n===$e)e.previous=t;else for(var i in t)n[i]=t[i];e.current=null,this.ngOnChanges(t)}}function Ft(e,t,n,i){var r=Ht(e)||function(e,t){return e.__ngSimpleChanges__=t}(e,{previous:$e,current:null}),a=r.current||(r.current={}),o=r.previous,s=this.declaredInputs[n],u=o[s];a[s]=new At(u&&u.currentValue,t,o===$e),e[i]=t}function Ht(e){return e.__ngSimpleChanges__||null}Yt.ngInherit=!0;var jt="http://www.w3.org/2000/svg",Nt=void 0;function Bt(){return void 0!==Nt?Nt:"undefined"!=typeof document?document:void 0}function Wt(e){return!!e.listen}var Vt={createRenderer:function(e,t){return Bt()}};function Ut(e){for(;Array.isArray(e);)e=e[0];return e}function zt(e,t){return Ut(t[e])}function qt(e,t){return Ut(t[e.index])}function Gt(e,t){return e.data[t]}function Kt(e,t){return e[t]}function Jt(e,t){var n=t[e];return kt(n)?n:n[0]}function Zt(e){var t=function(e){return e.__ngContext__||null}(e);return t?Array.isArray(t)?t:t.lView:null}function Qt(e){return 4==(4&e[2])}function Xt(e){return 128==(128&e[2])}function $t(e,t){return null==t?null:e[t]}function en(e){e[18]=0}function tn(e,t){e[5]+=t;for(var n=e,i=e[3];null!==i&&(1===t&&1===n[5]||-1===t&&0===n[5]);)i[5]+=t,n=i,i=i[3]}var nn={lFrame:Ln(null),bindingsEnabled:!0,isInCheckNoChangesMode:!1};function rn(){return nn.bindingsEnabled}function an(){return nn.lFrame.lView}function on(){return nn.lFrame.tView}function sn(e){nn.lFrame.contextLView=e}function un(){for(var e=ln();null!==e&&64===e.type;)e=e.parent;return e}function ln(){return nn.lFrame.currentTNode}function cn(e,t){var n=nn.lFrame;n.currentTNode=e,n.isParent=t}function dn(){return nn.lFrame.isParent}function hn(){nn.lFrame.isParent=!1}function fn(){return nn.isInCheckNoChangesMode}function pn(e){nn.isInCheckNoChangesMode=e}function mn(){var e=nn.lFrame,t=e.bindingRootIndex;return-1===t&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function gn(){return nn.lFrame.bindingIndex}function vn(){return nn.lFrame.bindingIndex++}function _n(e){var t=nn.lFrame,n=t.bindingIndex;return t.bindingIndex=t.bindingIndex+e,n}function yn(e){nn.lFrame.currentDirectiveIndex=e}function bn(e){var t=nn.lFrame.currentDirectiveIndex;return-1===t?null:e[t]}function wn(){return nn.lFrame.currentQueryIndex}function kn(e){nn.lFrame.currentQueryIndex=e}function Mn(e){var t=e[1];return 2===t.type?t.declTNode:1===t.type?e[6]:null}function Sn(e,t,n){if(n&Be.SkipSelf){for(var i=t,r=e;!(null!==(i=i.parent)||n&Be.Host||null===(i=Mn(r))||(r=r[15],10&i.type)););if(null===i)return!1;t=i,e=r}var a=nn.lFrame=xn();return a.currentTNode=t,a.lView=e,!0}function Cn(e){var t=xn(),n=e[1];nn.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function xn(){var e=nn.lFrame,t=null===e?null:e.child;return null===t?Ln(e):t}function Ln(e){var t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return null!==e&&(e.child=t),t}function Tn(){var e=nn.lFrame;return nn.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var Dn=Tn;function On(){var e=Tn();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function En(e){return(nn.lFrame.contextLView=function(e,t){for(;e>0;)t=t[15],e--;return t}(e,nn.lFrame.contextLView))[8]}function Pn(){return nn.lFrame.selectedIndex}function An(e){nn.lFrame.selectedIndex=e}function Yn(){var e=nn.lFrame;return Gt(e.tView,e.selectedIndex)}function In(){nn.lFrame.currentNamespace=jt}function Rn(){nn.lFrame.currentNamespace=null}function Fn(e,t){for(var n=t.directiveStart,i=t.directiveEnd;n=i)break}else t[s]<0&&(e[18]+=65536),(o>11>16&&(3&e[2])===t&&(e[2]+=2048,a.call(o)):a.call(o)}var Vn=-1,Un=function e(t,n,i){v(this,e),this.factory=t,this.resolving=!1,this.canSeeViewProviders=n,this.injectImpl=i};function zn(e,t,n){for(var i=Wt(e),r=0;rt){o=a-1;break}}}for(;a>16,i=t;n>0;)i=i[15],n--;return i}var $n=!0;function ei(e){var t=$n;return $n=e,t}var ti=0;function ni(e,t){var n=ri(e,t);if(-1!==n)return n;var i=t[1];i.firstCreatePass&&(e.injectorIndex=t.length,ii(i.data,e),ii(t,null),ii(i.blueprint,null));var r=ai(e,t),a=e.injectorIndex;if(Zn(r))for(var o=Qn(r),s=Xn(r,t),u=s[1].data,l=0;l<8;l++)t[a+l]=s[o+l]|u[o+l];return t[a+8]=r,a}function ii(e,t){e.push(0,0,0,0,0,0,0,0,t)}function ri(e,t){return-1===e.injectorIndex||e.parent&&e.parent.injectorIndex===e.injectorIndex||null===t[e.injectorIndex+8]?-1:e.injectorIndex}function ai(e,t){if(e.parent&&-1!==e.parent.injectorIndex)return e.parent.injectorIndex;for(var n=0,i=null,r=t;null!==r;){var a=r[1],o=a.type;if(null===(i=2===o?a.declTNode:1===o?r[6]:null))return Vn;if(n++,r=r[15],-1!==i.injectorIndex)return i.injectorIndex|n<<16}return Vn}function oi(e,t,n){!function(e,t,n){var i;"string"==typeof n?i=n.charCodeAt(0)||0:n.hasOwnProperty(st)&&(i=n[st]),null==i&&(i=n[st]=ti++);var r=255&i,a=1<3&&void 0!==arguments[3]?arguments[3]:Be.Default,r=arguments.length>4?arguments[4]:void 0;if(null!==e){var a=mi(n);if("function"==typeof a){if(!Sn(t,e,i))return i&Be.Host?si(r,n,i):ui(t,n,i,r);try{var o=a();if(null!=o||i&Be.Optional)return o;Pt(n)}finally{Dn()}}else if("number"==typeof a){var s=null,u=ri(e,t),l=Vn,c=i&Be.Host?t[16][6]:null;for((-1===u||i&Be.SkipSelf)&&((l=-1===u?ai(e,t):t[u+8])!==Vn&&vi(i,!1)?(s=t[1],u=Qn(l),t=Xn(l,t)):u=-1);-1!==u;){var d=t[1];if(gi(a,u,d.data)){var h=hi(u,t,n,s,i,c);if(h!==ci)return h}(l=t[u+8])!==Vn&&vi(i,t[1].data[u+8]===c)&&gi(a,u,t)?(s=d,u=Qn(l),t=Xn(l,t)):u=-1}}}return ui(t,n,i,r)}var ci={};function di(){return new _i(un(),an())}function hi(e,t,n,i,r,a){var o=t[1],s=o.data[e+8],u=fi(s,o,n,null==i?Ct(s)&&$n:i!=o&&0!=(3&s.type),r&Be.Host&&a===s);return null!==u?pi(t,o,u,s):ci}function fi(e,t,n,i,r){for(var a=e.providerIndexes,o=t.data,s=1048575&a,u=e.directiveStart,l=a>>20,c=r?s+l:e.directiveEnd,d=i?s:s+l;d=u&&h.type===n)return d}if(r){var f=o[u];if(f&&Lt(f)&&f.type===n)return u}return null}function pi(e,t,n,i){var r=e[n],a=t.data;if(r instanceof Un){var o=r;o.resolving&&function(e,t){throw new Dt("200","Circular dependency in DI detected for ".concat(e).concat(""))}(Et(a[n]));var s=ei(o.canSeeViewProviders);o.resolving=!0;var u=o.injectImpl?Ve(o.injectImpl):null;Sn(e,i,Be.Default);try{r=e[n]=o.factory(void 0,a,e,i),t.firstCreatePass&&n>=i.directiveStart&&function(e,t,n){var i=t.type.prototype,r=i.ngOnInit,a=i.ngDoCheck;if(i.ngOnChanges){var o=It(t);(n.preOrderHooks||(n.preOrderHooks=[])).push(e,o),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(e,o)}r&&(n.preOrderHooks||(n.preOrderHooks=[])).push(0-e,r),a&&((n.preOrderHooks||(n.preOrderHooks=[])).push(e,a),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(e,a))}(n,a[n],t)}finally{null!==u&&Ve(u),ei(s),o.resolving=!1,Dn()}}return r}function mi(e){if("string"==typeof e)return e.charCodeAt(0)||0;var t=e.hasOwnProperty(st)?e[st]:void 0;return"number"==typeof t?t>=0?255&t:di:t}function gi(e,t,n){var i=64&e,r=32&e;return!!((128&e?i?r?n[t+7]:n[t+6]:r?n[t+5]:n[t+4]:i?r?n[t+3]:n[t+2]:r?n[t+1]:n[t])&1<=e.length?e.push(n):e.splice(t,0,n)}function Oi(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function Ei(e,t){for(var n=[],i=0;i=0?e[1|i]=n:function(e,t,n,i){var r=e.length;if(r==t)e.push(n,i);else if(1===r)e.push(i,e[0]),e[0]=n;else{for(r--,e.push(e[r-1],e[r]);r>t;)e[r]=e[r-2],r--;e[t]=n,e[t+1]=i}}(e,i=~i,t,n),i}function Ai(e,t){var n=Yi(e,t);if(n>=0)return e[1|n]}function Yi(e,t){return function(e,t,n){for(var i=0,r=e.length>>1;r!==i;){var a=i+(r-i>>1),o=e[a<<1];if(t===o)return a<<1;o>t?r=a:i=a+1}return~(r<<1)}(e,t)}var Ii=Mi("Inject",function(e){return{token:e}}),Ri=Mi("Optional"),Fi=Mi("Self"),Hi=Mi("SkipSelf"),ji=Mi("Host"),Ni={},Bi=/\n/gm,Wi="__source",Vi=Me({provide:String,useValue:Me}),Ui=void 0;function zi(e){var t=Ui;return Ui=e,t}function qi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Be.Default;if(void 0===Ui)throw new Error("inject() must be called from an injection context");return null===Ui?Ue(e,void 0,t):Ui.get(e,t&Be.Optional?null:void 0,t)}function Gi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Be.Default;return(We()||qi)(De(e),t)}var Ki,Ji=Gi;function Zi(e){for(var t=[],n=0;n3&&void 0!==arguments[3]?arguments[3]:null;e=e&&"\n"===e.charAt(0)&&"\u0275"==e.charAt(1)?e.substr(2):e;var r=Ce(t);if(Array.isArray(t))r=t.map(Ce).join(" -> ");else if("object"==typeof t){var a=[];for(var o in t)if(t.hasOwnProperty(o)){var s=t[o];a.push(o+":"+("string"==typeof s?JSON.stringify(s):Ce(s)))}r="{".concat(a.join(", "),"}")}return"".concat(n).concat(i?"("+i+")":"","[").concat(r,"]: ").concat(e.replace(Bi,"\n "))}("\n"+e.message,r,n,i),e.ngTokenPath=r,e.ngTempTokenPath=null,e}function Xi(e){var t;return(null===(t=function(){if(void 0===Ki&&(Ki=null,Xe.trustedTypes))try{Ki=Xe.trustedTypes.createPolicy("angular",{createHTML:function(e){return e},createScript:function(e){return e},createScriptURL:function(e){return e}})}catch(t){}return Ki}())||void 0===t?void 0:t.createHTML(e))||e}var $i=function(){function e(t){v(this,e),this.changingThisBreaksApplicationSecurity=t}return g(e,[{key:"toString",value:function(){return"SafeValue must use [property]=binding: ".concat(this.changingThisBreaksApplicationSecurity)+" (see https://g.co/ng/security#xss)"}}]),e}(),er=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"getTypeName",value:function(){return"HTML"}}]),n}($i),tr=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"getTypeName",value:function(){return"Style"}}]),n}($i),nr=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"getTypeName",value:function(){return"Script"}}]),n}($i),ir=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"getTypeName",value:function(){return"URL"}}]),n}($i),rr=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"getTypeName",value:function(){return"ResourceURL"}}]),n}($i);function ar(e){return e instanceof $i?e.changingThisBreaksApplicationSecurity:e}function or(e,t){var n=sr(e);if(null!=n&&n!==t){if("ResourceURL"===n&&"URL"===t)return!0;throw new Error("Required a safe ".concat(t,", got a ").concat(n," (see https://g.co/ng/security#xss)"))}return n===t}function sr(e){return e instanceof $i&&e.getTypeName()||null}var ur=function(){function e(t){v(this,e),this.inertDocumentHelper=t}return g(e,[{key:"getInertBodyElement",value:function(e){e=""+e;try{var t=(new window.DOMParser).parseFromString(Xi(e),"text/html").body;return null===t?this.inertDocumentHelper.getInertBodyElement(e):(t.removeChild(t.firstChild),t)}catch(n){return null}}}]),e}(),lr=function(){function e(t){if(v(this,e),this.defaultDoc=t,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert"),null==this.inertDocument.body){var n=this.inertDocument.createElement("html");this.inertDocument.appendChild(n);var i=this.inertDocument.createElement("body");n.appendChild(i)}}return g(e,[{key:"getInertBodyElement",value:function(e){var t=this.inertDocument.createElement("template");if("content"in t)return t.innerHTML=Xi(e),t;var n=this.inertDocument.createElement("body");return n.innerHTML=Xi(e),this.defaultDoc.documentMode&&this.stripCustomNsAttrs(n),n}},{key:"stripCustomNsAttrs",value:function(e){for(var t=e.attributes,n=t.length-1;0"),!0}},{key:"endElement",value:function(e){var t=e.nodeName.toLowerCase();br.hasOwnProperty(t)&&!gr.hasOwnProperty(t)&&(this.buf.push(""))}},{key:"chars",value:function(e){this.buf.push(Tr(e))}},{key:"checkClobberedElement",value:function(e,t){if(t&&(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)===Node.DOCUMENT_POSITION_CONTAINED_BY)throw new Error("Failed to sanitize html because the element is clobbered: ".concat(e.outerHTML));return t}}]),e}(),xr=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Lr=/([^\#-~ |!])/g;function Tr(e){return e.replace(/&/g,"&").replace(xr,function(e){return"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";"}).replace(Lr,function(e){return"&#"+e.charCodeAt(0)+";"}).replace(//g,">")}function Dr(e,t){var n=null;try{mr=mr||function(e){var t=new lr(e);return function(){try{return!!(new window.DOMParser).parseFromString(Xi(""),"text/html")}catch(e){return!1}}()?new ur(t):t}(e);var i=t?String(t):"";n=mr.getInertBodyElement(i);var r=5,a=i;do{if(0===r)throw new Error("Failed to sanitize html because the input is unstable");r--,i=a,a=n.innerHTML,n=mr.getInertBodyElement(i)}while(i!==a);return(new Cr).sanitizeChildren(Or(n)||n)}finally{if(n)for(var o=Or(n)||n;o.firstChild;)o.removeChild(o.firstChild)}}function Or(e){return"content"in e&&function(e){return e.nodeType===Node.ELEMENT_NODE&&"TEMPLATE"===e.nodeName}(e)?e.content:null}var Er=function(e){return e[e.NONE=0]="NONE",e[e.HTML=1]="HTML",e[e.STYLE=2]="STYLE",e[e.SCRIPT=3]="SCRIPT",e[e.URL=4]="URL",e[e.RESOURCE_URL=5]="RESOURCE_URL",e}({});function Pr(e){var t=Yr();return t?t.sanitize(Er.HTML,e)||"":or(e,"HTML")?ar(e):Dr(Bt(),Ot(e))}function Ar(e){var t=Yr();return t?t.sanitize(Er.URL,e)||"":or(e,"URL")?ar(e):hr(Ot(e))}function Yr(){var e=an();return e&&e[12]}function Ir(e){return e.ngDebugContext}function Rr(e){return e.ngOriginalError}function Fr(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i0&&(e[i-1][4]=r[4]);var o=Oi(e,wt+t);pa(r[1],n=r,n[11],2,null,null),n[0]=null,n[6]=null;var s=o[19];null!==s&&s.detachView(o[1]),r[3]=null,r[4]=null,r[2]&=-129}return r}}function ta(e,t){if(!(256&t[2])){var n=t[11];Wt(n)&&n.destroyNode&&pa(e,t,n,3,null,null),function(e){var t=e[13];if(!t)return na(e[1],e);for(;t;){var n=null;if(kt(t))n=t[13];else{var i=t[10];i&&(n=i)}if(!n){for(;t&&!t[4]&&t!==e;)kt(t)&&na(t[1],t),t=t[3];null===t&&(t=e),kt(t)&&na(t[1],t),n=t&&t[4]}t=n}}(t)}}function na(e,t){if(!(256&t[2])){t[2]&=-129,t[2]|=256,function(e,t){var n;if(null!=e&&null!=(n=e.destroyHooks))for(var i=0;i=0?i[r=l]():i[r=-l].unsubscribe(),a+=2}else{var c=i[r=n[a+1]];n[a].call(c)}if(null!==i){for(var d=r+1;da?"":r[c+1].toLowerCase();var h=8&i?d:null;if(h&&-1!==ya(h,l,0)||2&i&&l!==d){if(Ca(i))return!1;o=!0}}}}else{if(!o&&!Ca(i)&&!Ca(u))return!1;if(o&&Ca(u))continue;o=!1,i=u|1&i}}return Ca(i)||o}function Ca(e){return 0==(1&e)}function xa(e,t,n,i){if(null===t)return-1;var r=0;if(i||!n){for(var a=!1;r-1)for(n++;n2&&void 0!==arguments[2]&&arguments[2],i=0;i0?'="'+s+'"':"")+"]"}else 8&i?r+="."+o:4&i&&(r+=" "+o);else""===r||Ca(o)||(t+=Da(a,r),r=""),i=o,a=a||!Ca(i);n++}return""!==r&&(t+=Da(a,r)),t}var Ea={};function Pa(e){Aa(on(),an(),Pn()+e,fn())}function Aa(e,t,n,i){if(!i)if(3==(3&t[2])){var r=e.preOrderCheckHooks;null!==r&&Hn(t,r,n)}else{var a=e.preOrderHooks;null!==a&&jn(t,a,0,n)}An(n)}function Ya(e,t){return e<<17|t<<2}function Ia(e){return e>>17&32767}function Ra(e){return 2|e}function Fa(e){return(131068&e)>>2}function Ha(e,t){return-131069&e|t<<2}function ja(e){return 1|e}function Na(e,t){var n=e.contentQueries;if(null!==n)for(var i=0;ibt&&Aa(e,t,bt,fn()),n(i,r)}finally{An(a)}}function Ka(e,t,n){if(St(t))for(var i=t.directiveEnd,r=t.directiveStart;r2&&void 0!==arguments[2]?arguments[2]:qt,i=t.localNames;if(null!==i)for(var r=t.index+1,a=0;a0;){var n=e[--t];if("number"==typeof n&&n<0)return n}return 0})(s)!=u&&s.push(u),s.push(i,r,o)}}function ro(e,t){null!==e.hostBindings&&e.hostBindings(1,t)}function ao(e,t){t.flags|=2,(e.components||(e.components=[])).push(t.index)}function oo(e,t,n){if(n){if(t.exportAs)for(var i=0;i0&&mo(n)}}function mo(e){for(var t=Gr(e);null!==t;t=Kr(t))for(var n=wt;n0&&mo(i)}var a=e[1].components;if(null!==a)for(var o=0;o0&&mo(s)}}function go(e,t){var n=Jt(t,e),i=n[1];!function(e,t){for(var n=t.length;n1&&void 0!==arguments[1]?arguments[1]:Ni;if(t===Ni){var n=new Error("NullInjectorError: No provider for ".concat(Ce(e),"!"));throw n.name="NullInjectorError",n}return t}}]),e}(),Po=new Si("Set Injector scope."),Ao={},Yo={},Io=[],Ro=void 0;function Fo(){return void 0===Ro&&(Ro=new Eo),Ro}function Ho(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3?arguments[3]:void 0;return new jo(e,n,t||Fo(),i)}var jo=function(){function e(t,n,i){var r=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;v(this,e),this.parent=i,this.records=new Map,this.injectorDefTypes=new Set,this.onDestroy=new Set,this._destroyed=!1;var o=[];n&&Ti(n,function(e){return r.processProvider(e,t,n)}),Ti([t],function(e){return r.processInjectorType(e,[],o)}),this.records.set(Oo,Wo(void 0,this));var s=this.records.get(Po);this.scope=null!=s?s.value:null,this.source=a||("object"==typeof t?null:Ce(t))}return g(e,[{key:"destroy",value:function(){this.assertNotDestroyed(),this._destroyed=!0;try{this.onDestroy.forEach(function(e){return e.ngOnDestroy()})}finally{this.records.clear(),this.onDestroy.clear(),this.injectorDefTypes.clear()}}},{key:"get",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Ni,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Be.Default;this.assertNotDestroyed();var i=zi(this);try{if(!(n&Be.SkipSelf)){var r=this.records.get(e);if(void 0===r){var a=zo(e)&&Ae(e);r=a&&this.injectableDefInScope(a)?Wo(No(e),Ao):null,this.records.set(e,r)}if(null!=r)return this.hydrate(e,r)}var o=n&Be.Self?Fo():this.parent;return o.get(e,t=n&Be.Optional&&t===Ni?null:t)}catch(u){if("NullInjectorError"===u.name){var s=u.ngTempTokenPath=u.ngTempTokenPath||[];if(s.unshift(Ce(e)),i)throw u;return Qi(u,e,"R3InjectorError",this.source)}throw u}finally{zi(i)}}},{key:"_resolveInjectorDefTypes",value:function(){var e=this;this.injectorDefTypes.forEach(function(t){return e.get(t)})}},{key:"toString",value:function(){var e=[];return this.records.forEach(function(t,n){return e.push(Ce(n))}),"R3Injector[".concat(e.join(", "),"]")}},{key:"assertNotDestroyed",value:function(){if(this._destroyed)throw new Error("Injector has already been destroyed.")}},{key:"processInjectorType",value:function(e,t,n){var i=this;if(!(e=De(e)))return!1;var r=Ie(e),a=null==r&&e.ngModule||void 0,o=void 0===a?e:a,s=-1!==n.indexOf(o);if(void 0!==a&&(r=Ie(a)),null==r)return!1;if(null!=r.imports&&!s){var u;n.push(o);try{Ti(r.imports,function(e){i.processInjectorType(e,t,n)&&(void 0===u&&(u=[]),u.push(e))})}finally{}if(void 0!==u)for(var l=function(e){var t=u[e],n=t.ngModule,r=t.providers;Ti(r,function(e){return i.processProvider(e,n,r||Io)})},c=0;c0){var n=Ei(t,"?");throw new Error("Can't resolve all parameters for ".concat(Ce(e),": (").concat(n.join(", "),")."))}var i=function(e){var t=e&&(e[Fe]||e[je]);if(t){var n=function(e){if(e.hasOwnProperty("name"))return e.name;var t=(""+e).match(/^function\s*([^\s(]+)/);return null===t?"":t[1]}(e);return console.warn('DEPRECATED: DI is instantiating a token "'.concat(n,'" that inherits its @Injectable decorator but does not provide one itself.\n')+'This will become an error in a future version of Angular. Please add @Injectable() to the "'.concat(n,'" class.')),t}return null}(e);return null!==i?function(){return i.factory(e)}:function(){return new e}}(e);throw new Error("unreachable")}function Bo(e,t,n){var i,r=void 0;if(Uo(e)){var a=De(e);return Tt(a)||No(a)}if(Vo(e))r=function(){return De(e.useValue)};else if((i=e)&&i.useFactory)r=function(){return e.useFactory.apply(e,d(Zi(e.deps||[])))};else if(function(e){return!(!e||!e.useExisting)}(e))r=function(){return Gi(De(e.useExisting))};else{var o=De(e&&(e.useClass||e.provide));if(!function(e){return!!e.deps}(e))return Tt(o)||No(o);r=function(){return p(o,d(Zi(e.deps)))}}return r}function Wo(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return{factory:e,value:t,multi:n?[]:void 0}}function Vo(e){return null!==e&&"object"==typeof e&&Vi in e}function Uo(e){return"function"==typeof e}function zo(e){return"function"==typeof e||"object"==typeof e&&e instanceof Si}var qo=function(e,t,n){return function(e){var t=Ho(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,arguments.length>3?arguments[3]:void 0);return t._resolveInjectorDefTypes(),t}({name:n},t,e,n)},Go=function(){var e=function(){function e(){v(this,e)}return g(e,null,[{key:"create",value:function(e,t){return Array.isArray(e)?qo(e,t,""):qo(e.providers,e.parent,e.name||"")}}]),e}();return e.THROW_IF_NOT_FOUND=Ni,e.NULL=new Eo,e.\u0275prov=Ee({token:e,providedIn:"any",factory:function(){return Gi(Oo)}}),e.__NG_ELEMENT_ID__=-1,e}();function Ko(e,t){Fn(Zt(e)[1],un())}function Jo(e){for(var t=Object.getPrototypeOf(e.type.prototype).constructor,n=!0,i=[e];t;){var r=void 0;if(Lt(e))r=t.\u0275cmp||t.\u0275dir;else{if(t.\u0275cmp)throw new Error("Directives cannot inherit Components");r=t.\u0275dir}if(r){if(n){i.push(r);var a=e;a.inputs=Zo(e.inputs),a.declaredInputs=Zo(e.declaredInputs),a.outputs=Zo(e.outputs);var o=r.hostBindings;o&&$o(e,o);var s=r.viewQuery,u=r.contentQueries;if(s&&Qo(e,s),u&&Xo(e,u),Se(e.inputs,r.inputs),Se(e.declaredInputs,r.declaredInputs),Se(e.outputs,r.outputs),Lt(r)&&r.data.animation){var l=e.data;l.animation=(l.animation||[]).concat(r.data.animation)}}var c=r.features;if(c)for(var d=0;d=0;i--){var r=e[i];r.hostVars=t+=r.hostVars,r.hostAttrs=Kn(r.hostAttrs,n=Kn(n,r.hostAttrs))}}(i)}function Zo(e){return e===$e?{}:e===et?[]:e}function Qo(e,t){var n=e.viewQuery;e.viewQuery=n?function(e,i){t(e,i),n(e,i)}:t}function Xo(e,t){var n=e.contentQueries;e.contentQueries=n?function(e,i,r){t(e,i,r),n(e,i,r)}:t}function $o(e,t){var n=e.hostBindings;e.hostBindings=n?function(e,i){t(e,i),n(e,i)}:t}var es=null;function ts(){if(!es){var e=Xe.Symbol;if(e&&e.iterator)es=e.iterator;else for(var t=Object.getOwnPropertyNames(Map.prototype),n=0;n1&&void 0!==arguments[1]?arguments[1]:Be.Default,n=an();if(null===n)return Gi(e,t);var i=un();return li(i,n,De(e),t)}function gs(e,t,n){var i=an();return os(i,vn(),t)&&to(on(),Yn(),i,e,t,i[11],n,!1),gs}function vs(e,t,n,i,r){var a=r?"class":"style";Lo(e,n,t.inputs[a],a,i)}function _s(e,t,n,i){var r=an(),a=on(),o=bt+e,s=r[11],u=r[o]=Xr(s,t,nn.lFrame.currentNamespace),l=a.firstCreatePass?function(e,t,n,i,r,a,o){var s=t.consts,u=Wa(t,e,2,r,$t(s,a));return no(t,n,u,$t(s,o)),null!==u.attrs&&Do(u,u.attrs,!1),null!==u.mergedAttrs&&Do(u,u.mergedAttrs,!0),null!==t.queries&&t.queries.elementStart(t,u),u}(o,a,r,0,t,n,i):a.data[o];cn(l,!0);var c=l.mergedAttrs;null!==c&&zn(s,u,c);var d=l.classes;null!==d&&_a(s,u,d);var h=l.styles;null!==h&&va(s,u,h),64!=(64&l.flags)&&ca(a,r,u,l),0===nn.lFrame.elementDepthCount&&jr(u,r),nn.lFrame.elementDepthCount++,xt(l)&&(Ja(a,r,l),Ka(a,l,r)),null!==i&&Za(r,l)}function ys(){var e=un();dn()?hn():cn(e=e.parent,!1);var t=e;nn.lFrame.elementDepthCount--;var n=on();n.firstCreatePass&&(Fn(n,e),St(e)&&n.queries.elementEnd(e)),null!=t.classesWithoutHost&&function(e){return 0!=(16&e.flags)}(t)&&vs(n,t,an(),t.classesWithoutHost,!0),null!=t.stylesWithoutHost&&function(e){return 0!=(32&e.flags)}(t)&&vs(n,t,an(),t.stylesWithoutHost,!1)}function bs(e,t,n,i){_s(e,t,n,i),ys()}function ws(e,t,n){var i=an(),r=on(),a=e+bt,o=r.firstCreatePass?function(e,t,n,i,r){var a=t.consts,o=$t(a,i),s=Wa(t,e,8,"ng-container",o);return null!==o&&Do(s,o,!0),no(t,n,s,$t(a,r)),null!==t.queries&&t.queries.elementStart(t,s),s}(a,r,i,t,n):r.data[a];cn(o,!0);var s=i[a]=i[11].createComment("");ca(r,i,s,o),jr(s,i),xt(o)&&(Ja(r,i,o),Ka(r,o,i)),null!=n&&Za(i,o)}function ks(){var e=un(),t=on();dn()?hn():cn(e=e.parent,!1),t.firstCreatePass&&(Fn(t,e),St(e)&&t.queries.elementEnd(e))}function Ms(e,t,n){ws(e,t,n),ks()}function Ss(){return an()}function Cs(e){return!!e&&"function"==typeof e.then}function xs(e){return!!e&&"function"==typeof e.subscribe}function Ls(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3?arguments[3]:void 0,r=an(),a=on(),o=un();return Os(a,r,r[11],o,e,t,n,i),Ls}function Ts(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3?arguments[3]:void 0,r=un(),a=an(),o=on(),s=bn(o.data),u=Co(s,r,a);return Os(o,a,u,r,e,t,n,i),Ts}function Ds(e,t,n,i){var r=e.cleanup;if(null!=r)for(var a=0;au?s[u]:null}"string"==typeof o&&(a+=2)}return null}function Os(e,t,n,i,r,a){var o=arguments.length>6&&void 0!==arguments[6]&&arguments[6],s=arguments.length>7?arguments[7]:void 0,u=xt(i),l=e.firstCreatePass,c=l&&So(e),d=Mo(t),h=!0;if(3&i.type){var f=qt(i,t),p=s?s(f):$e,m=p.target||f,g=d.length,v=s?function(e){return s(Ut(e[i.index])).target}:i.index;if(Wt(n)){var _=null;if(!s&&u&&(_=Ds(e,t,r,i.index)),null!==_){var y=_.__ngLastListenerFn__||_;y.__ngNextListenerFn__=a,_.__ngLastListenerFn__=a,h=!1}else{a=Ps(i,t,a,!1);var b=n.listen(p.name||m,r,a);d.push(a,b),c&&c.push(r,v,g,g+1)}}else a=Ps(i,t,a,!0),m.addEventListener(r,a,o),d.push(a),c&&c.push(r,v,g,o)}else a=Ps(i,t,a,!1);var w,k=i.outputs;if(h&&null!==k&&(w=k[r])){var M=w.length;if(M)for(var S=0;S0&&void 0!==arguments[0]?arguments[0]:1;return En(e)}function Ys(e,t){for(var n=null,i=function(e){var t=e.attrs;if(null!=t){var n=t.indexOf(5);if(0==(1&n))return t[n+1]}return null}(e),r=0;r1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0,i=an(),r=on(),a=Wa(r,bt+e,16,null,n||null);null===a.projection&&(a.projection=t),hn(),64!=(64&a.flags)&&ma(r,i,a)}function Fs(e,t,n){return Hs(e,"",t,"",n),Fs}function Hs(e,t,n,i,r){var a=an(),o=ds(a,t,n,i);return o!==Ea&&to(on(),Yn(),a,e,o,a[11],r,!1),Hs}function js(e,t,n,i,r,a,o,s,u){var l=an(),c=hs(l,t,n,i,r,a,o,s);return c!==Ea&&to(on(),Yn(),l,e,c,l[11],u,!1),js}var Ns=[];function Bs(e,t,n,i,r){for(var a=e[n+1],o=null===t,s=i?Ia(a):Fa(a),u=!1;0!==s&&(!1===u||o);){var l=e[s+1];Ws(e[s],t)&&(u=!0,e[s+1]=i?ja(l):Ra(l)),s=i?Ia(l):Fa(l)}u&&(e[n+1]=i?Ra(a):ja(a))}function Ws(e,t){return null===e||null==t||(Array.isArray(e)?e[1]:e)===t||!(!Array.isArray(e)||"string"!=typeof t)&&Yi(e,t)>=0}var Vs={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function Us(e){return e.substring(Vs.key,Vs.keyEnd)}function zs(e,t){var n=Vs.textEnd;return n===t?-1:(t=Vs.keyEnd=function(e,t,n){for(;t32;)t++;return t}(e,Vs.key=t,n),qs(e,t,n))}function qs(e,t,n){for(;t=0;n=zs(t,n))Pi(e,Us(t),!0)}function Zs(e,t,n,i){var r=an(),a=on(),o=_n(2);a.firstUpdatePass&&$s(a,e,o,i),t!==Ea&&os(r,o,t)&&nu(a,a.data[Pn()],r,r[11],e,r[o+1]=function(e,t){return null==e||("string"==typeof t?e+=t:"object"==typeof e&&(e=Ce(ar(e)))),e}(t,n),i,o)}function Qs(e,t,n,i){var r=on(),a=_n(2);r.firstUpdatePass&&$s(r,null,a,i);var o=an();if(n!==Ea&&os(o,a,n)){var s=r.data[Pn()];if(au(s,i)&&!Xs(r,a)){var u=i?s.classesWithoutHost:s.stylesWithoutHost;null!==u&&(n=xe(u,n||"")),vs(r,s,o,n,i)}else!function(e,t,n,i,r,a,o,s){r===Ea&&(r=Ns);for(var u=0,l=0,c=0=e.expandoStartIndex}function $s(e,t,n,i){var r=e.data;if(null===r[n+1]){var a=r[Pn()],o=Xs(e,n);au(a,i)&&null===t&&!o&&(t=!1),t=function(e,t,n,i){var r=bn(e),a=i?t.residualClasses:t.residualStyles;if(null===r)0===(i?t.classBindings:t.styleBindings)&&(n=tu(n=eu(null,e,t,n,i),t.attrs,i),a=null);else{var o=t.directiveStylingLast;if(-1===o||e[o]!==r)if(n=eu(r,e,t,n,i),null===a){var s=function(e,t,n){var i=n?t.classBindings:t.styleBindings;if(0!==Fa(i))return e[Ia(i)]}(e,t,i);void 0!==s&&Array.isArray(s)&&function(e,t,n,i){e[Ia(n?t.classBindings:t.styleBindings)]=i}(e,t,i,s=tu(s=eu(null,e,t,s[1],i),t.attrs,i))}else a=function(e,t,n){for(var i=void 0,r=t.directiveEnd,a=1+t.directiveStylingLast;a0)&&(c=!0):l=n,r)if(0!==u){var d=Ia(e[s+1]);e[i+1]=Ya(d,s),0!==d&&(e[d+1]=Ha(e[d+1],i)),e[s+1]=131071&e[s+1]|i<<17}else e[i+1]=Ya(s,0),0!==s&&(e[s+1]=Ha(e[s+1],i)),s=i;else e[i+1]=Ya(u,0),0===s?s=i:e[u+1]=Ha(e[u+1],i),u=i;c&&(e[i+1]=Ra(e[i+1])),Bs(e,l,i,!0),Bs(e,l,i,!1),function(e,t,n,i,r){var a=r?e.residualClasses:e.residualStyles;null!=a&&"string"==typeof t&&Yi(a,t)>=0&&(n[i+1]=ja(n[i+1]))}(t,l,e,i,a),o=Ya(s,u),a?t.classBindings=o:t.styleBindings=o}(r,a,t,n,o,i)}}function eu(e,t,n,i,r){var a=null,o=n.directiveEnd,s=n.directiveStylingLast;for(-1===s?s=n.directiveStart:s++;s0;){var u=e[r],l=Array.isArray(u),c=l?u[1]:u,d=null===c,h=n[r+1];h===Ea&&(h=d?Ns:void 0);var f=d?Ai(h,i):c===i?h:void 0;if(l&&!ru(f)&&(f=Ai(u,i)),ru(f)&&(s=f,o))return s;var p=e[r+1];r=o?Ia(p):Fa(p)}if(null!==t){var m=a?t.residualClasses:t.residualStyles;null!=m&&(s=Ai(m,i))}return s}function ru(e){return void 0!==e}function au(e,t){return 0!=(e.flags&(t?16:32))}function ou(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=an(),i=on(),r=e+bt,a=i.firstCreatePass?Wa(i,r,1,t,null):i.data[r],o=n[r]=Qr(n[11],t);ca(i,n,o,a),cn(a,!1)}function su(e){return uu("",e,""),su}function uu(e,t,n){var i=an(),r=ds(i,e,t,n);return r!==Ea&&To(i,Pn(),r),uu}function lu(e,t,n,i,r){var a=an(),o=function(e,t,n,i,r,a){var o=ss(e,gn(),n,r);return _n(2),o?t+Ot(n)+i+Ot(r)+a:Ea}(a,e,t,n,i,r);return o!==Ea&&To(a,Pn(),o),lu}function cu(e,t,n,i,r,a,o){var s=an(),u=hs(s,e,t,n,i,r,a,o);return u!==Ea&&To(s,Pn(),u),cu}function du(e,t,n,i,r,a,o,s,u){var l=an(),c=function(e,t,n,i,r,a,o,s,u,l){var c=ls(e,gn(),n,r,o,u);return _n(4),c?t+Ot(n)+i+Ot(r)+a+Ot(o)+s+Ot(u)+l:Ea}(l,e,t,n,i,r,a,o,s,u);return c!==Ea&&To(l,Pn(),c),du}function hu(e,t,n){Qs(Pi,Js,ds(an(),e,t,n),!0)}function fu(e,t,n){var i=an();return os(i,vn(),t)&&to(on(),Yn(),i,e,t,i[11],n,!0),fu}function pu(e,t,n){var i=an();if(os(i,vn(),t)){var r=on(),a=Yn();to(r,a,i,e,t,Co(bn(r.data),a,i),n,!0)}return pu}var mu=void 0,gu=["en",[["a","p"],["AM","PM"],mu],[["AM","PM"],mu,mu],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],mu,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],mu,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",mu,"{1} 'at' {0}",mu],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"USD","$","US Dollar",{},"ltr",function(e){var t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,"").length;return 1===t&&0===n?1:5}],vu={};function _u(e){var t=function(e){return e.toLowerCase().replace(/_/g,"-")}(e),n=yu(t);if(n)return n;var i=t.split("-")[0];if(n=yu(i))return n;if("en"===i)return gu;throw new Error('Missing locale data for the locale "'.concat(e,'".'))}function yu(e){return e in vu||(vu[e]=Xe.ng&&Xe.ng.common&&Xe.ng.common.locales&&Xe.ng.common.locales[e]),vu[e]}var bu=function(e){return e[e.LocaleId=0]="LocaleId",e[e.DayPeriodsFormat=1]="DayPeriodsFormat",e[e.DayPeriodsStandalone=2]="DayPeriodsStandalone",e[e.DaysFormat=3]="DaysFormat",e[e.DaysStandalone=4]="DaysStandalone",e[e.MonthsFormat=5]="MonthsFormat",e[e.MonthsStandalone=6]="MonthsStandalone",e[e.Eras=7]="Eras",e[e.FirstDayOfWeek=8]="FirstDayOfWeek",e[e.WeekendRange=9]="WeekendRange",e[e.DateFormat=10]="DateFormat",e[e.TimeFormat=11]="TimeFormat",e[e.DateTimeFormat=12]="DateTimeFormat",e[e.NumberSymbols=13]="NumberSymbols",e[e.NumberFormats=14]="NumberFormats",e[e.CurrencyCode=15]="CurrencyCode",e[e.CurrencySymbol=16]="CurrencySymbol",e[e.CurrencyName=17]="CurrencyName",e[e.Currencies=18]="Currencies",e[e.Directionality=19]="Directionality",e[e.PluralCase=20]="PluralCase",e[e.ExtraData=21]="ExtraData",e}({}),wu="en-US";function ku(e){var t,n;n="Expected localeId to be defined",null==(t=e)&&function(e,t,n,i){throw new Error("ASSERTION ERROR: ".concat(e)+" [Expected=> ".concat(null," ").concat("!="," ").concat(t," <=Actual]"))}(n,t),"string"==typeof e&&e.toLowerCase().replace(/_/g,"-")}function Mu(e,t,n){var i=on();if(i.firstCreatePass){var r=Lt(e);Su(n,i.data,i.blueprint,r,!0),Su(t,i.data,i.blueprint,r,!1)}}function Su(e,t,n,i,r){if(e=De(e),Array.isArray(e))for(var a=0;a>20;if(Uo(e)||!e.multi){var p=new Un(l,r,ms),m=Lu(u,t,r?d:d+f,h);-1===m?(oi(ni(c,s),o,u),Cu(o,e,t.length),t.push(u),c.directiveStart++,c.directiveEnd++,r&&(c.providerIndexes+=1048576),n.push(p),s.push(p)):(n[m]=p,s[m]=p)}else{var g=Lu(u,t,d+f,h),v=Lu(u,t,d,d+f),_=v>=0&&n[v];if(r&&!_||!r&&!(g>=0&&n[g])){oi(ni(c,s),o,u);var y=function(e,t,n,i,r){var a=new Un(e,n,ms);return a.multi=[],a.index=t,a.componentProviders=0,xu(a,r,i&&!n),a}(r?Du:Tu,n.length,r,i,l);!r&&_&&(n[v].providerFactory=y),Cu(o,e,t.length,0),t.push(u),c.directiveStart++,c.directiveEnd++,r&&(c.providerIndexes+=1048576),n.push(y),s.push(y)}else Cu(o,e,g>-1?g:v,xu(n[r?v:g],l,!r&&i));!r&&i&&_&&n[v].componentProviders++}}}function Cu(e,t,n,i){var r=Uo(t);if(r||t.useClass){var a=(t.useClass||t).prototype.ngOnDestroy;if(a){var o=e.destroyHooks||(e.destroyHooks=[]);if(!r&&t.multi){var s=o.indexOf(n);-1===s?o.push(n,[i,a]):o[s+1].push(i,a)}else o.push(n,a)}}}function xu(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function Lu(e,t,n,i){for(var r=n;r1&&void 0!==arguments[1]?arguments[1]:[];return function(n){n.providersResolver=function(n,i){return Mu(n,i?i(e):e,t)}}}var Pu=function e(){v(this,e)},Au=function e(){v(this,e)},Yu=function(){function e(){v(this,e)}return g(e,[{key:"resolveComponentFactory",value:function(e){throw function(e){var t=Error("No component factory found for ".concat(Ce(e),". Did you add it to @NgModule.entryComponents?"));return t.ngComponent=e,t}(e)}}]),e}(),Iu=function(){var e=function e(){v(this,e)};return e.NULL=new Yu,e}();function Ru(){}function Fu(e,t){return new ju(qt(e,t))}var Hu=function(){return Fu(un(),an())},ju=function(){var e=function e(t){v(this,e),this.nativeElement=t};return e.__NG_ELEMENT_ID__=Hu,e}(),Nu=function e(){v(this,e)},Bu=function(){var e=function e(){v(this,e)};return e.__NG_ELEMENT_ID__=function(){return Wu()},e}(),Wu=function(){var e=an(),t=Jt(un().index,e);return function(e){return e[11]}(kt(t)?t:e)},Vu=function(){var e=function e(){v(this,e)};return e.\u0275prov=Ee({token:e,providedIn:"root",factory:function(){return null}}),e}(),Uu=function e(t){v(this,e),this.full=t,this.major=t.split(".")[0],this.minor=t.split(".")[1],this.patch=t.split(".").slice(2).join(".")},zu=new Uu("11.0.8"),qu=function(){function e(){v(this,e)}return g(e,[{key:"supports",value:function(e){return is(e)}},{key:"create",value:function(e){return new Ku(e)}}]),e}(),Gu=function(e,t){return t},Ku=function(){function e(t){v(this,e),this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=t||Gu}return g(e,[{key:"forEachItem",value:function(e){var t;for(t=this._itHead;null!==t;t=t._next)e(t)}},{key:"forEachOperation",value:function(e){for(var t=this._itHead,n=this._removalsHead,i=0,r=null;t||n;){var a=!n||t&&t.currentIndex4&&void 0!==arguments[4]&&arguments[4];null!==n;){var a=t[n.index];if(null!==a&&i.push(Ut(a)),Mt(a))for(var o=wt;o-1&&(ea(e,n),Oi(t,n))}this._attachedToViewContainer=!1}ta(this._lView[1],this._lView)}},{key:"onDestroy",value:function(e){$a(this._lView[1],this._lView,null,e)}},{key:"markForCheck",value:function(){_o(this._cdRefInjectingView||this._lView)}},{key:"detach",value:function(){this._lView[2]&=-129}},{key:"reattach",value:function(){this._lView[2]|=128}},{key:"detectChanges",value:function(){yo(this._lView[1],this._lView,this.context)}},{key:"checkNoChanges",value:function(){!function(e,t,n){pn(!0);try{yo(e,t,n)}finally{pn(!1)}}(this._lView[1],this._lView,this.context)}},{key:"attachToViewContainerRef",value:function(){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._attachedToViewContainer=!0}},{key:"detachFromAppRef",value:function(){var e;this._appRef=null,pa(this._lView[1],e=this._lView,e[11],2,null,null)}},{key:"attachToAppRef",value:function(e){if(this._attachedToViewContainer)throw new Error("This view is already attached to a ViewContainer!");this._appRef=e}},{key:"rootNodes",get:function(){var e=this._lView,t=e[1];return rl(t,e,t.firstChild,[])}},{key:"context",get:function(){return this._lView[8]}},{key:"destroyed",get:function(){return 256==(256&this._lView[2])}}]),e}(),ol=function(e){_(n,e);var t=w(n);function n(e){var i;return v(this,n),(i=t.call(this,e))._view=e,i}return g(n,[{key:"detectChanges",value:function(){bo(this._view)}},{key:"checkNoChanges",value:function(){!function(e){pn(!0);try{bo(e)}finally{pn(!1)}}(this._view)}},{key:"context",get:function(){return null}}]),n}(al),sl=ll,ul=function(){var e=function e(){v(this,e)};return e.__NG_ELEMENT_ID__=sl,e.__ChangeDetectorRef__=!0,e}();function ll(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return cl(un(),an(),e)}function cl(e,t,n){if(!n&&Ct(e)){var i=Jt(e.index,t);return new al(i,i)}return 47&e.type?new al(t[16],t):null}var dl=[new $u],hl=new nl([new qu]),fl=new il(dl),pl=function(){return vl(un(),an())},ml=function(){var e=function e(){v(this,e)};return e.__NG_ELEMENT_ID__=pl,e}(),gl=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this))._declarationLView=e,a._declarationTContainer=i,a.elementRef=r,a}return g(n,[{key:"createEmbeddedView",value:function(e){var t=this._declarationTContainer.tViews,n=Ba(this._declarationLView,t,e,16,null,t.declTNode,null,null,null,null);n[17]=this._declarationLView[this._declarationTContainer.index];var i=this._declarationLView[19];return null!==i&&(n[19]=i.createEmbeddedView(t)),Ua(t,n,e),new al(n)}}]),n}(ml);function vl(e,t){return 4&e.type?new gl(t,e,Fu(e,t)):null}var _l=function e(){v(this,e)},yl=function e(){v(this,e)},bl=function(){return Cl(un(),an())},wl=function(){var e=function e(){v(this,e)};return e.__NG_ELEMENT_ID__=bl,e}(),kl=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this))._lContainer=e,a._hostTNode=i,a._hostLView=r,a}return g(n,[{key:"clear",value:function(){for(;this.length>0;)this.remove(this.length-1)}},{key:"get",value:function(e){var t=Ml(this._lContainer);return null!==t&&t[e]||null}},{key:"createEmbeddedView",value:function(e,t,n){var i=e.createEmbeddedView(t||{});return this.insert(i,n),i}},{key:"createComponent",value:function(e,t,n,i,r){var a=n||this.parentInjector;if(!r&&null==e.ngModule&&a){var o=a.get(_l,null);o&&(r=o)}var s=e.create(a,i,void 0,r);return this.insert(s.hostView,t),s}},{key:"insert",value:function(e,t){var n=e._lView,i=n[1];if(Mt(n[3])){var r=this.indexOf(e);if(-1!==r)this.detach(r);else{var a=n[3],o=new kl(a,a[6],a[3]);o.detach(o.indexOf(e))}}var s=this._adjustIndex(t),u=this._lContainer;!function(e,t,n,i){var r=wt+i,a=n.length;i>0&&(n[r-1][4]=t),i1&&void 0!==arguments[1]?arguments[1]:0;return null==e?this.length+t:e}},{key:"element",get:function(){return Fu(this._hostTNode,this._hostLView)}},{key:"injector",get:function(){return new _i(this._hostTNode,this._hostLView)}},{key:"parentInjector",get:function(){var e=ai(this._hostTNode,this._hostLView);if(Zn(e)){var t=Xn(e,this._hostLView),n=Qn(e);return new _i(t[1].data[n+8],t)}return new _i(null,this._hostLView)}},{key:"length",get:function(){return this._lContainer.length-wt}}]),n}(wl);function Ml(e){return e[8]}function Sl(e){return e[8]||(e[8]=[])}function Cl(e,t){var n,i=t[e.index];if(Mt(i))n=i;else{var r;if(8&e.type)r=Ut(i);else{var a=t[11];r=a.createComment("");var o=qt(e,t);ra(a,sa(a,o),r,function(e,t){return Wt(e)?e.nextSibling(t):t.nextSibling}(a,o),!1)}t[e.index]=n=fo(i,t,r,e),vo(t,n)}return new kl(n,e,t)}var xl={},Ll=function(e){_(n,e);var t=w(n);function n(e){var i;return v(this,n),(i=t.call(this)).ngModule=e,i}return g(n,[{key:"resolveComponentFactory",value:function(e){var t=_t(e);return new Ol(t,this.ngModule)}}]),n}(Iu);function Tl(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push({propName:e[n],templateName:n});return t}var Dl=new Si("SCHEDULER_TOKEN",{providedIn:"root",factory:function(){return Nr}}),Ol=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this)).componentDef=e,r.ngModule=i,r.componentType=e.type,r.selector=e.selectors.map(Oa).join(","),r.ngContentSelectors=e.ngContentSelectors?e.ngContentSelectors:[],r.isBoundToModule=!!i,r}return g(n,[{key:"create",value:function(e,t,n,i){var r,a,o=(i=i||this.ngModule)?function(e,t){return{get:function(n,i,r){var a=e.get(n,xl,r);return a!==xl||i===xl?a:t.get(n,i,r)}}}(e,i.injector):e,s=o.get(Nu,Vt),u=o.get(Vu,null),l=s.createRenderer(null,this.componentDef),c=this.componentDef.selectors[0][0]||"div",d=n?function(e,t,n){if(Wt(e))return e.selectRootElement(t,n===Ge.ShadowDom);var i="string"==typeof t?e.querySelector(t):t;return i.textContent="",i}(l,n,this.componentDef.encapsulation):Xr(s.createRenderer(null,this.componentDef),c,function(e){var t=e.toLowerCase();return"svg"===t?jt:"math"===t?"http://www.w3.org/1998/MathML/":null}(c)),h=this.componentDef.onPush?576:528,f={components:[],scheduler:Nr,clean:ko,playerHandler:null,flags:0},p=Xa(0,null,null,1,0,null,null,null,null,null),m=Ba(null,p,f,h,null,null,s,l,u,o);Cn(m);try{var g=function(e,t,n,i,r,a){var o=n[1];n[20]=e;var s=Wa(o,20,2,"#host",null),u=s.mergedAttrs=t.hostAttrs;null!==u&&(Do(s,u,!0),null!==e&&(zn(r,e,u),null!==s.classes&&_a(r,e,s.classes),null!==s.styles&&va(r,e,s.styles)));var l=i.createRenderer(e,t),c=Ba(n,Qa(t),null,t.onPush?64:16,n[20],s,i,l,null,null);return o.firstCreatePass&&(oi(ni(s,n),o,t.type),ao(o,s),so(s,n.length,1)),vo(n,c),n[20]=c}(d,this.componentDef,m,s,l);if(d)if(n)zn(l,d,["ng-version",zu.full]);else{var v=function(e){for(var t=[],n=[],i=1,r=2;i0&&_a(l,d,y.join(" "))}if(a=Gt(p,bt),void 0!==t)for(var b=a.projection=[],w=0;w1&&void 0!==arguments[1]?arguments[1]:Go.THROW_IF_NOT_FOUND,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Be.Default;return e===Go||e===_l||e===Oo?this:this._r3Injector.get(e,t,n)}},{key:"destroy",value:function(){var e=this._r3Injector;!e.destroyed&&e.destroy(),this.destroyCbs.forEach(function(e){return e()}),this.destroyCbs=null}},{key:"onDestroy",value:function(e){this.destroyCbs.push(e)}}]),n}(_l),Yl=function(e){_(n,e);var t=w(n);function n(e){var i,r,a;return v(this,n),(i=t.call(this)).moduleType=e,null!==yt(e)&&(r=e,a=new Set,function e(t){var n=yt(t,!0),i=n.id;null!==i&&(function(e,t,n){if(t&&t!==n)throw new Error("Duplicate module registered for ".concat(e," - ").concat(Ce(t)," vs ").concat(Ce(t.name)))}(i,Pl.get(i),t),Pl.set(i,t));var r,o=c(Vr(n.imports));try{for(o.s();!(r=o.n()).done;){var s=r.value;a.has(s)||(a.add(s),e(s))}}catch(u){o.e(u)}finally{o.f()}}(r)),i}return g(n,[{key:"create",value:function(e){return new Al(this.moduleType,e)}}]),n}(yl);function Il(e,t,n){var i=mn()+e,r=an();return r[i]===Ea?as(r,i,n?t.call(n):t()):function(e,t){return e[t]}(r,i)}function Rl(e,t,n,i){return Nl(an(),mn(),e,t,n,i)}function Fl(e,t,n,i,r){return Bl(an(),mn(),e,t,n,i,r)}function Hl(e,t,n,i,r,a){return Wl(an(),mn(),e,t,n,i,r,a)}function jl(e,t){var n=e[t];return n===Ea?void 0:n}function Nl(e,t,n,i,r,a){var o=t+n;return os(e,o,r)?as(e,o+1,a?i.call(a,r):i(r)):jl(e,o+1)}function Bl(e,t,n,i,r,a,o){var s=t+n;return ss(e,s,r,a)?as(e,s+2,o?i.call(o,r,a):i(r,a)):jl(e,s+2)}function Wl(e,t,n,i,r,a,o,s){var u=t+n;return us(e,u,r,a,o)?as(e,u+3,s?i.call(s,r,a,o):i(r,a,o)):jl(e,u+3)}function Vl(e,t){var n,i=on(),r=e+bt;i.firstCreatePass?(n=function(e,t){if(t)for(var n=t.length-1;n>=0;n--){var i=t[n];if(e===i.name)return i}throw new Dt("302","The pipe '".concat(e,"' could not be found!"))}(t,i.pipeRegistry),i.data[r]=n,n.onDestroy&&(i.destroyHooks||(i.destroyHooks=[])).push(r,n.onDestroy)):n=i.data[r];var a=n.factory||(n.factory=Tt(n.type)),o=Ve(ms);try{var s=ei(!1),u=a();return ei(s),function(e,t,n,i){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=i}(i,an(),r,u),u}finally{Ve(o)}}function Ul(e,t,n){var i=e+bt,r=an(),a=Kt(r,i);return Jl(r,Kl(r,i)?Nl(r,mn(),t,a.transform,n,a):a.transform(n))}function zl(e,t,n,i){var r=e+bt,a=an(),o=Kt(a,r);return Jl(a,Kl(a,r)?Bl(a,mn(),t,o.transform,n,i,o):o.transform(n,i))}function ql(e,t,n,i,r){var a=e+bt,o=an(),s=Kt(o,a);return Jl(o,Kl(o,a)?Wl(o,mn(),t,s.transform,n,i,r,s):s.transform(n,i,r))}function Gl(e,t,n,i,r,a){var o=e+bt,s=an(),u=Kt(s,o);return Jl(s,Kl(s,o)?function(e,t,n,i,r,a,o,s,u){var l=t+n;return ls(e,l,r,a,o,s)?as(e,l+4,u?i.call(u,r,a,o,s):i(r,a,o,s)):jl(e,l+4)}(s,mn(),t,u.transform,n,i,r,a,u):u.transform(n,i,r,a))}function Kl(e,t){return e[1].data[t].pure}function Jl(e,t){return ns.isWrapped(t)&&(t=ns.unwrap(t),e[gn()]=Ea),t}var Zl=function(e){_(n,e);var t=w(n);function n(){var e,i=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return v(this,n),(e=t.call(this)).__isAsync=i,e}return g(n,[{key:"emit",value:function(e){r(i(n.prototype),"next",this).call(this,e)}},{key:"subscribe",value:function(e,t,a){var o,s=function(e){return null},u=function(){return null};e&&"object"==typeof e?(o=this.__isAsync?function(t){setTimeout(function(){return e.next(t)})}:function(t){e.next(t)},e.error&&(s=this.__isAsync?function(t){setTimeout(function(){return e.error(t)})}:function(t){e.error(t)}),e.complete&&(u=this.__isAsync?function(){setTimeout(function(){return e.complete()})}:function(){e.complete()})):(o=this.__isAsync?function(t){setTimeout(function(){return e(t)})}:function(t){e(t)},t&&(s=this.__isAsync?function(e){setTimeout(function(){return t(e)})}:function(e){t(e)}),a&&(u=this.__isAsync?function(){setTimeout(function(){return a()})}:function(){a()}));var l=r(i(n.prototype),"subscribe",this).call(this,o,s,u);return e instanceof L&&e.add(l),l}}]),n}(z);function Ql(){return this._results[ts()]()}var Xl=function(){function e(){v(this,e),this.dirty=!0,this._results=[],this.changes=new Zl,this.length=0;var t=ts(),n=e.prototype;n[t]||(n[t]=Ql)}return g(e,[{key:"map",value:function(e){return this._results.map(e)}},{key:"filter",value:function(e){return this._results.filter(e)}},{key:"find",value:function(e){return this._results.find(e)}},{key:"reduce",value:function(e,t){return this._results.reduce(e,t)}},{key:"forEach",value:function(e){this._results.forEach(e)}},{key:"some",value:function(e){return this._results.some(e)}},{key:"toArray",value:function(){return this._results.slice()}},{key:"toString",value:function(){return this._results.toString()}},{key:"reset",value:function(e){this._results=Li(e),this.dirty=!1,this.length=this._results.length,this.last=this._results[this.length-1],this.first=this._results[0]}},{key:"notifyOnChanges",value:function(){this.changes.emit(this)}},{key:"setDirty",value:function(){this.dirty=!0}},{key:"destroy",value:function(){this.changes.complete(),this.changes.unsubscribe()}}]),e}(),$l=function(){function e(t){v(this,e),this.queryList=t,this.matches=null}return g(e,[{key:"clone",value:function(){return new e(this.queryList)}},{key:"setDirty",value:function(){this.queryList.setDirty()}}]),e}(),ec=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];v(this,e),this.queries=t}return g(e,[{key:"createEmbeddedView",value:function(t){var n=t.queries;if(null!==n){for(var i=null!==t.contentQueries?t.contentQueries[0]:n.length,r=[],a=0;a3&&void 0!==arguments[3]?arguments[3]:null;v(this,e),this.predicate=t,this.descendants=n,this.isStatic=i,this.read=r},nc=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];v(this,e),this.queries=t}return g(e,[{key:"elementStart",value:function(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:-1;v(this,e),this.metadata=t,this.matches=null,this.indexInDeclarationView=-1,this.crossesNgTemplate=!1,this._appliesToNextNode=!0,this._declarationNodeIndex=n}return g(e,[{key:"elementStart",value:function(e,t){this.isApplyingToNode(t)&&this.matchTNode(e,t)}},{key:"elementEnd",value:function(e){this._declarationNodeIndex===e.index&&(this._appliesToNextNode=!1)}},{key:"template",value:function(e,t){this.elementStart(e,t)}},{key:"embeddedTView",value:function(t,n){return this.isApplyingToNode(t)?(this.crossesNgTemplate=!0,this.addMatch(-t.index,n),new e(this.metadata)):null}},{key:"isApplyingToNode",value:function(e){if(this._appliesToNextNode&&!1===this.metadata.descendants){for(var t=this._declarationNodeIndex,n=e.parent;null!==n&&8&n.type&&n.index!==t;)n=n.parent;return t===(null!==n?n.index:-1)}return this._appliesToNextNode}},{key:"matchTNode",value:function(e,t){var n=this.metadata.predicate;if(Array.isArray(n))for(var i=0;i0)i.push(o[s/2]);else{for(var l=a[s+1],c=t[-u],d=wt;d0&&void 0!==arguments[0]?arguments[0]:Be.Default,t=ll(!0);if(null!=t||e&Be.Optional)return t;Pt("ChangeDetectorRef")}var yc=new Si("Application Initializer"),bc=function(){var e=function(){function e(t){var n=this;v(this,e),this.appInits=t,this.resolve=Ru,this.reject=Ru,this.initialized=!1,this.done=!1,this.donePromise=new Promise(function(e,t){n.resolve=e,n.reject=t})}return g(e,[{key:"runInitializers",value:function(){var e=this;if(!this.initialized){var t=[],n=function(){e.done=!0,e.resolve()};if(this.appInits)for(var i=0;i0&&(r=setTimeout(function(){i._callbacks=i._callbacks.filter(function(e){return e.timeoutId!==r}),e(i._didWork,i.getPendingTasks())},t)),this._callbacks.push({doneCb:e,timeoutId:r,updateCb:n})}},{key:"whenStable",value:function(e,t,n){if(n&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/dist/task-tracking.js" loaded?');this.addCallback(e,t,n),this._runCallbacksIfReady()}},{key:"getPendingRequestCount",value:function(){return this._pendingCount}},{key:"findProviders",value:function(e,t,n){return[]}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Nc))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),Jc=function(){var e=function(){function e(){v(this,e),this._applications=new Map,Zc.addToWindow(this)}return g(e,[{key:"registerApplication",value:function(e,t){this._applications.set(e,t)}},{key:"unregisterApplication",value:function(e){this._applications.delete(e)}},{key:"unregisterAllApplications",value:function(){this._applications.clear()}},{key:"getTestability",value:function(e){return this._applications.get(e)||null}},{key:"getAllTestabilities",value:function(){return Array.from(this._applications.values())}},{key:"getAllRootElements",value:function(){return Array.from(this._applications.keys())}},{key:"findTestabilityInTree",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return Zc.findTestabilityInTree(this,e,t)}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),Zc=new(function(){function e(){v(this,e)}return g(e,[{key:"addToWindow",value:function(e){}},{key:"findTestabilityInTree",value:function(e,t,n){return null}}]),e}()),Qc=!0,Xc=!1;function $c(){return Xc=!0,Qc}var ed=function(e,t,n){var i=new Yl(n);return Promise.resolve(i)},td=new Si("AllowMultipleToken"),nd=function e(t,n){v(this,e),this.name=t,this.token=n};function id(e){if(qc&&!qc.destroyed&&!qc.injector.get(td,!1))throw new Error("There can be only one platform. Destroy the previous one to create a new one.");qc=e.get(sd);var t=e.get(Sc,null);return t&&t.forEach(function(e){return e()}),qc}function rd(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],i="Platform: ".concat(t),r=new Si(i);return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],a=od();if(!a||a.injector.get(td,!1))if(e)e(n.concat(t).concat({provide:r,useValue:!0}));else{var o=n.concat(t).concat({provide:r,useValue:!0},{provide:Po,useValue:"platform"});id(Go.create({providers:o,name:i}))}return ad(r)}}function ad(e){var t=od();if(!t)throw new Error("No platform exists!");if(!t.injector.get(e,null))throw new Error("A platform with a different configuration has been created. Please destroy it first.");return t}function od(){return qc&&!qc.destroyed?qc:null}var sd=function(){var e=function(){function e(t){v(this,e),this._injector=t,this._modules=[],this._destroyListeners=[],this._destroyed=!1}return g(e,[{key:"bootstrapModuleFactory",value:function(e,t){var n,i,r=this,a=(i=t&&t.ngZoneEventCoalescing||!1,"noop"===(n=t?t.ngZone:void 0)?new Gc:("zone.js"===n?void 0:n)||new Nc({enableLongStackTrace:$c(),shouldCoalesceEventChangeDetection:i})),o=[{provide:Nc,useValue:a}];return a.run(function(){var t=Go.create({providers:o,parent:r.injector,name:e.moduleType.name}),n=e.create(t),i=n.injector.get(Hr,null);if(!i)throw new Error("No ErrorHandler. Is platform module (BrowserModule) included?");return a.runOutsideAngular(function(){var e=a.onError.subscribe({next:function(e){i.handleError(e)}});n.onDestroy(function(){cd(r._modules,n),e.unsubscribe()})}),function(e,t,i){try{var a=((o=n.injector.get(bc)).runInitializers(),o.donePromise.then(function(){return ku(n.injector.get(Tc,wu)||wu),r._moduleDoBootstrap(n),n}));return Cs(a)?a.catch(function(n){throw t.runOutsideAngular(function(){return e.handleError(n)}),n}):a}catch(s){throw t.runOutsideAngular(function(){return e.handleError(s)}),s}var o}(i,a)})}},{key:"bootstrapModule",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],i=ud({},n);return ed(0,0,e).then(function(e){return t.bootstrapModuleFactory(e,i)})}},{key:"_moduleDoBootstrap",value:function(e){var t=e.injector.get(ld);if(e._bootstrapComponents.length>0)e._bootstrapComponents.forEach(function(e){return t.bootstrap(e)});else{if(!e.instance.ngDoBootstrap)throw new Error("The module ".concat(Ce(e.instance.constructor),' was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. ')+"Please define one of these.");e.instance.ngDoBootstrap(t)}this._modules.push(e)}},{key:"onDestroy",value:function(e){this._destroyListeners.push(e)}},{key:"destroy",value:function(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(function(e){return e.destroy()}),this._destroyListeners.forEach(function(e){return e()}),this._destroyed=!0}},{key:"injector",get:function(){return this._injector}},{key:"destroyed",get:function(){return this._destroyed}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Go))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}();function ud(e,t){return Array.isArray(t)?t.reduce(ud,e):Object.assign(Object.assign({},e),t)}var ld=function(){var e=function(){function e(t,n,i,r,a,o){var s=this;v(this,e),this._zone=t,this._console=n,this._injector=i,this._exceptionHandler=r,this._componentFactoryResolver=a,this._initStatus=o,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._onMicrotaskEmptySubscription=this._zone.onMicrotaskEmpty.subscribe({next:function(){s._zone.run(function(){s.tick()})}});var u=new N(function(e){s._stable=s._zone.isStable&&!s._zone.hasPendingMacrotasks&&!s._zone.hasPendingMicrotasks,s._zone.runOutsideAngular(function(){e.next(s._stable),e.complete()})}),l=new N(function(e){var t;s._zone.runOutsideAngular(function(){t=s._zone.onStable.subscribe(function(){Nc.assertNotInAngularZone(),jc(function(){s._stable||s._zone.hasPendingMacrotasks||s._zone.hasPendingMicrotasks||(s._stable=!0,e.next(!0))})})});var n=s._zone.onUnstable.subscribe(function(){Nc.assertInAngularZone(),s._stable&&(s._stable=!1,s._zone.runOutsideAngular(function(){e.next(!1)}))});return function(){t.unsubscribe(),n.unsubscribe()}});this.isStable=pe(u,l.pipe(ke()))}return g(e,[{key:"bootstrap",value:function(e,t){var n,i=this;if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");n=e instanceof Au?e:this._componentFactoryResolver.resolveComponentFactory(e),this.componentTypes.push(n.componentType);var r=n.isBoundToModule?void 0:this._injector.get(_l),a=n.create(Go.NULL,[],t||n.selector,r),o=a.location.nativeElement,s=a.injector.get(Kc,null),u=s&&a.injector.get(Jc);return s&&u&&u.registerApplication(o,s),a.onDestroy(function(){i.detachView(a.hostView),cd(i.components,a),u&&u.unregisterApplication(o)}),this._loadComponent(a),$c()&&this._console.log("Angular is running in development mode. Call enableProdMode() to enable production mode."),a}},{key:"tick",value:function(){var e=this;if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");try{this._runningTick=!0;var t,n=c(this._views);try{for(n.s();!(t=n.n()).done;)t.value.detectChanges()}catch(i){n.e(i)}finally{n.f()}}catch(r){this._zone.runOutsideAngular(function(){return e._exceptionHandler.handleError(r)})}finally{this._runningTick=!1}}},{key:"attachView",value:function(e){var t=e;this._views.push(t),t.attachToAppRef(this)}},{key:"detachView",value:function(e){var t=e;cd(this._views,t),t.detachFromAppRef()}},{key:"_loadComponent",value:function(e){this.attachView(e.hostView),this.tick(),this.components.push(e),this._injector.get(xc,[]).concat(this._bootstrapListeners).forEach(function(t){return t(e)})}},{key:"ngOnDestroy",value:function(){this._views.slice().forEach(function(e){return e.destroy()}),this._onMicrotaskEmptySubscription.unsubscribe()}},{key:"viewCount",get:function(){return this._views.length}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Nc),Gi(Lc),Gi(Go),Gi(Hr),Gi(Iu),Gi(bc))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}();function cd(e,t){var n=e.indexOf(t);n>-1&&e.splice(n,1)}var dd=function e(){v(this,e)},hd=function e(){v(this,e)},fd={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"},pd=function(){var e=function(){function e(t,n){v(this,e),this._compiler=t,this._config=n||fd}return g(e,[{key:"load",value:function(e){return this.loadAndCompile(e)}},{key:"loadAndCompile",value:function(e){var t=this,i=u(e.split("#"),2),r=i[0],a=i[1];return void 0===a&&(a="default"),n("crnd")(r).then(function(e){return e[a]}).then(function(e){return md(e,r,a)}).then(function(e){return t._compiler.compileModuleAsync(e)})}},{key:"loadFactory",value:function(e){var t=u(e.split("#"),2),i=t[0],r=t[1],a="NgFactory";return void 0===r&&(r="default",a=""),n("crnd")(this._config.factoryPathPrefix+i+this._config.factoryPathSuffix).then(function(e){return e[r+a]}).then(function(e){return md(e,i,r)})}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Fc),Gi(hd,8))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}();function md(e,t,n){if(!e)throw new Error("Cannot find '".concat(n,"' in '").concat(t,"'"));return e}var gd=rd(null,"core",[{provide:Cc,useValue:"unknown"},{provide:sd,deps:[Go]},{provide:Jc,deps:[]},{provide:Lc,deps:[]}]),vd=[{provide:ld,useClass:ld,deps:[Nc,Lc,Go,Hr,Iu,bc]},{provide:Dl,deps:[Nc],useFactory:function(e){var t=[];return e.onStable.subscribe(function(){for(;t.length;)t.pop()()}),function(e){t.push(e)}}},{provide:bc,useClass:bc,deps:[[new Ri,yc]]},{provide:Fc,useClass:Fc,deps:[]},kc,{provide:nl,useFactory:function(){return hl},deps:[]},{provide:il,useFactory:function(){return fl},deps:[]},{provide:Tc,useFactory:function(e){return ku(e=e||"undefined"!=typeof $localize&&$localize.locale||wu),e},deps:[[new Ii(Tc),new Ri,new Hi]]},{provide:Dc,useValue:"USD"}],_d=function(){var e=function e(t){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)(Gi(ld))},providers:vd}),e}(),yd="w4bxe2tbf9beb72r",bd=null;function wd(){return bd}var kd=function e(){v(this,e)},Md=new Si("DocumentToken"),Sd=function(){var e=function e(){v(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ee({factory:Cd,token:e,providedIn:"platform"}),e}();function Cd(){return Gi(Ld)}var xd=new Si("Location Initialized"),Ld=function(){var e=function(e){_(n,e);var t=w(n);function n(e){var i;return v(this,n),(i=t.call(this))._doc=e,i._init(),i}return g(n,[{key:"_init",value:function(){this.location=wd().getLocation(),this._history=wd().getHistory()}},{key:"getBaseHrefFromDOM",value:function(){return wd().getBaseHref(this._doc)}},{key:"onPopState",value:function(e){wd().getGlobalEventTarget(this._doc,"window").addEventListener("popstate",e,!1)}},{key:"onHashChange",value:function(e){wd().getGlobalEventTarget(this._doc,"window").addEventListener("hashchange",e,!1)}},{key:"pushState",value:function(e,t,n){Td()?this._history.pushState(e,t,n):this.location.hash=n}},{key:"replaceState",value:function(e,t,n){Td()?this._history.replaceState(e,t,n):this.location.hash=n}},{key:"forward",value:function(){this._history.forward()}},{key:"back",value:function(){this._history.back()}},{key:"getState",value:function(){return this._history.state}},{key:"href",get:function(){return this.location.href}},{key:"protocol",get:function(){return this.location.protocol}},{key:"hostname",get:function(){return this.location.hostname}},{key:"port",get:function(){return this.location.port}},{key:"pathname",get:function(){return this.location.pathname},set:function(e){this.location.pathname=e}},{key:"search",get:function(){return this.location.search}},{key:"hash",get:function(){return this.location.hash}}]),n}(Sd);return e.\u0275fac=function(t){return new(t||e)(Gi(Md))},e.\u0275prov=Ee({factory:Dd,token:e,providedIn:"platform"}),e}();function Td(){return!!window.history.pushState}function Dd(){return new Ld(Gi(Md))}function Od(e,t){if(0==e.length)return t;if(0==t.length)return e;var n=0;return e.endsWith("/")&&n++,t.startsWith("/")&&n++,2==n?e+t.substring(1):1==n?e+t:e+"/"+t}function Ed(e){var t=e.match(/#|\?|$/),n=t&&t.index||e.length;return e.slice(0,n-("/"===e[n-1]?1:0))+e.slice(n)}function Pd(e){return e&&"?"!==e[0]?"?"+e:e}var Ad=function(){var e=function e(){v(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ee({factory:Yd,token:e,providedIn:"root"}),e}();function Yd(e){var t=Gi(Md).location;return new Rd(Gi(Sd),t&&t.origin||"")}var Id=new Si("appBaseHref"),Rd=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i){var r;if(v(this,n),(r=t.call(this))._platformLocation=e,null==i&&(i=r._platformLocation.getBaseHrefFromDOM()),null==i)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return r._baseHref=i,r}return g(n,[{key:"onPopState",value:function(e){this._platformLocation.onPopState(e),this._platformLocation.onHashChange(e)}},{key:"getBaseHref",value:function(){return this._baseHref}},{key:"prepareExternalUrl",value:function(e){return Od(this._baseHref,e)}},{key:"path",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this._platformLocation.pathname+Pd(this._platformLocation.search),n=this._platformLocation.hash;return n&&e?"".concat(t).concat(n):t}},{key:"pushState",value:function(e,t,n,i){var r=this.prepareExternalUrl(n+Pd(i));this._platformLocation.pushState(e,t,r)}},{key:"replaceState",value:function(e,t,n,i){var r=this.prepareExternalUrl(n+Pd(i));this._platformLocation.replaceState(e,t,r)}},{key:"forward",value:function(){this._platformLocation.forward()}},{key:"back",value:function(){this._platformLocation.back()}}]),n}(Ad);return e.\u0275fac=function(t){return new(t||e)(Gi(Sd),Gi(Id,8))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),Fd=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this))._platformLocation=e,r._baseHref="",null!=i&&(r._baseHref=i),r}return g(n,[{key:"onPopState",value:function(e){this._platformLocation.onPopState(e),this._platformLocation.onHashChange(e)}},{key:"getBaseHref",value:function(){return this._baseHref}},{key:"path",value:function(){var e=this._platformLocation.hash;return null==e&&(e="#"),e.length>0?e.substring(1):e}},{key:"prepareExternalUrl",value:function(e){var t=Od(this._baseHref,e);return t.length>0?"#"+t:t}},{key:"pushState",value:function(e,t,n,i){var r=this.prepareExternalUrl(n+Pd(i));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.pushState(e,t,r)}},{key:"replaceState",value:function(e,t,n,i){var r=this.prepareExternalUrl(n+Pd(i));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.replaceState(e,t,r)}},{key:"forward",value:function(){this._platformLocation.forward()}},{key:"back",value:function(){this._platformLocation.back()}}]),n}(Ad);return e.\u0275fac=function(t){return new(t||e)(Gi(Sd),Gi(Id,8))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),Hd=function(){var e=function(){function e(t,n){var i=this;v(this,e),this._subject=new Zl,this._urlChangeListeners=[],this._platformStrategy=t;var r=this._platformStrategy.getBaseHref();this._platformLocation=n,this._baseHref=Ed(Nd(r)),this._platformStrategy.onPopState(function(e){i._subject.emit({url:i.path(!0),pop:!0,state:e.state,type:e.type})})}return g(e,[{key:"path",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.normalize(this._platformStrategy.path(e))}},{key:"getState",value:function(){return this._platformLocation.getState()}},{key:"isCurrentPathEqualTo",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return this.path()==this.normalize(e+Pd(t))}},{key:"normalize",value:function(t){return e.stripTrailingSlash(function(e,t){return e&&t.startsWith(e)?t.substring(e.length):t}(this._baseHref,Nd(t)))}},{key:"prepareExternalUrl",value:function(e){return e&&"/"!==e[0]&&(e="/"+e),this._platformStrategy.prepareExternalUrl(e)}},{key:"go",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;this._platformStrategy.pushState(n,"",e,t),this._notifyUrlChangeListeners(this.prepareExternalUrl(e+Pd(t)),n)}},{key:"replaceState",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;this._platformStrategy.replaceState(n,"",e,t),this._notifyUrlChangeListeners(this.prepareExternalUrl(e+Pd(t)),n)}},{key:"forward",value:function(){this._platformStrategy.forward()}},{key:"back",value:function(){this._platformStrategy.back()}},{key:"onUrlChange",value:function(e){var t=this;this._urlChangeListeners.push(e),this._urlChangeSubscription||(this._urlChangeSubscription=this.subscribe(function(e){t._notifyUrlChangeListeners(e.url,e.state)}))}},{key:"_notifyUrlChangeListeners",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0;this._urlChangeListeners.forEach(function(n){return n(e,t)})}},{key:"subscribe",value:function(e,t,n){return this._subject.subscribe({next:e,error:t,complete:n})}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Ad),Gi(Sd))},e.normalizeQueryParams=Pd,e.joinWithSlash=Od,e.stripTrailingSlash=Ed,e.\u0275prov=Ee({factory:jd,token:e,providedIn:"root"}),e}();function jd(){return new Hd(Gi(Ad),Gi(Sd))}function Nd(e){return e.replace(/\/index.html$/,"")}var Bd={ADP:[void 0,void 0,0],AFN:[void 0,void 0,0],ALL:[void 0,void 0,0],AMD:[void 0,void 0,2],AOA:[void 0,"Kz"],ARS:[void 0,"$"],AUD:["A$","$"],BAM:[void 0,"KM"],BBD:[void 0,"$"],BDT:[void 0,"\u09f3"],BHD:[void 0,void 0,3],BIF:[void 0,void 0,0],BMD:[void 0,"$"],BND:[void 0,"$"],BOB:[void 0,"Bs"],BRL:["R$"],BSD:[void 0,"$"],BWP:[void 0,"P"],BYN:[void 0,"\u0440.",2],BYR:[void 0,void 0,0],BZD:[void 0,"$"],CAD:["CA$","$",2],CHF:[void 0,void 0,2],CLF:[void 0,void 0,4],CLP:[void 0,"$",0],CNY:["CN\xa5","\xa5"],COP:[void 0,"$",2],CRC:[void 0,"\u20a1",2],CUC:[void 0,"$"],CUP:[void 0,"$"],CZK:[void 0,"K\u010d",2],DJF:[void 0,void 0,0],DKK:[void 0,"kr",2],DOP:[void 0,"$"],EGP:[void 0,"E\xa3"],ESP:[void 0,"\u20a7",0],EUR:["\u20ac"],FJD:[void 0,"$"],FKP:[void 0,"\xa3"],GBP:["\xa3"],GEL:[void 0,"\u20be"],GIP:[void 0,"\xa3"],GNF:[void 0,"FG",0],GTQ:[void 0,"Q"],GYD:[void 0,"$",2],HKD:["HK$","$"],HNL:[void 0,"L"],HRK:[void 0,"kn"],HUF:[void 0,"Ft",2],IDR:[void 0,"Rp",2],ILS:["\u20aa"],INR:["\u20b9"],IQD:[void 0,void 0,0],IRR:[void 0,void 0,0],ISK:[void 0,"kr",0],ITL:[void 0,void 0,0],JMD:[void 0,"$"],JOD:[void 0,void 0,3],JPY:["\xa5",void 0,0],KHR:[void 0,"\u17db"],KMF:[void 0,"CF",0],KPW:[void 0,"\u20a9",0],KRW:["\u20a9",void 0,0],KWD:[void 0,void 0,3],KYD:[void 0,"$"],KZT:[void 0,"\u20b8"],LAK:[void 0,"\u20ad",0],LBP:[void 0,"L\xa3",0],LKR:[void 0,"Rs"],LRD:[void 0,"$"],LTL:[void 0,"Lt"],LUF:[void 0,void 0,0],LVL:[void 0,"Ls"],LYD:[void 0,void 0,3],MGA:[void 0,"Ar",0],MGF:[void 0,void 0,0],MMK:[void 0,"K",0],MNT:[void 0,"\u20ae",2],MRO:[void 0,void 0,0],MUR:[void 0,"Rs",2],MXN:["MX$","$"],MYR:[void 0,"RM"],NAD:[void 0,"$"],NGN:[void 0,"\u20a6"],NIO:[void 0,"C$"],NOK:[void 0,"kr",2],NPR:[void 0,"Rs"],NZD:["NZ$","$"],OMR:[void 0,void 0,3],PHP:[void 0,"\u20b1"],PKR:[void 0,"Rs",2],PLN:[void 0,"z\u0142"],PYG:[void 0,"\u20b2",0],RON:[void 0,"lei"],RSD:[void 0,void 0,0],RUB:[void 0,"\u20bd"],RUR:[void 0,"\u0440."],RWF:[void 0,"RF",0],SBD:[void 0,"$"],SEK:[void 0,"kr",2],SGD:[void 0,"$"],SHP:[void 0,"\xa3"],SLL:[void 0,void 0,0],SOS:[void 0,void 0,0],SRD:[void 0,"$"],SSP:[void 0,"\xa3"],STD:[void 0,void 0,0],STN:[void 0,"Db"],SYP:[void 0,"\xa3",0],THB:[void 0,"\u0e3f"],TMM:[void 0,void 0,0],TND:[void 0,void 0,3],TOP:[void 0,"T$"],TRL:[void 0,void 0,0],TRY:[void 0,"\u20ba"],TTD:[void 0,"$"],TWD:["NT$","$",2],TZS:[void 0,void 0,2],UAH:[void 0,"\u20b4"],UGX:[void 0,void 0,0],USD:["$"],UYI:[void 0,void 0,0],UYU:[void 0,"$"],UYW:[void 0,void 0,4],UZS:[void 0,void 0,2],VEF:[void 0,"Bs",2],VND:["\u20ab",void 0,0],VUV:[void 0,void 0,0],XAF:["FCFA",void 0,0],XCD:["EC$","$"],XOF:["CFA",void 0,0],XPF:["CFPF",void 0,0],XXX:["\xa4"],YER:[void 0,void 0,0],ZAR:[void 0,"R"],ZMK:[void 0,void 0,0],ZMW:[void 0,"ZK"],ZWD:[void 0,void 0,0]},Wd=function(e){return e[e.Decimal=0]="Decimal",e[e.Percent=1]="Percent",e[e.Currency=2]="Currency",e[e.Scientific=3]="Scientific",e}({}),Vd=function(e){return e[e.Zero=0]="Zero",e[e.One=1]="One",e[e.Two=2]="Two",e[e.Few=3]="Few",e[e.Many=4]="Many",e[e.Other=5]="Other",e}({}),Ud=function(e){return e[e.Decimal=0]="Decimal",e[e.Group=1]="Group",e[e.List=2]="List",e[e.PercentSign=3]="PercentSign",e[e.PlusSign=4]="PlusSign",e[e.MinusSign=5]="MinusSign",e[e.Exponential=6]="Exponential",e[e.SuperscriptingExponent=7]="SuperscriptingExponent",e[e.PerMille=8]="PerMille",e[e[1/0]=9]="Infinity",e[e.NaN=10]="NaN",e[e.TimeSeparator=11]="TimeSeparator",e[e.CurrencyDecimal=12]="CurrencyDecimal",e[e.CurrencyGroup=13]="CurrencyGroup",e}({});function zd(e,t){var n=_u(e),i=n[bu.NumberSymbols][t];if(void 0===i){if(t===Ud.CurrencyDecimal)return n[bu.NumberSymbols][Ud.Decimal];if(t===Ud.CurrencyGroup)return n[bu.NumberSymbols][Ud.Group]}return i}function qd(e,t){return _u(e)[bu.NumberFormats][t]}function Gd(e){return _u(e)[bu.Currencies]}function Kd(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"en",i=Gd(n)[e]||Bd[e]||[],r=i[1];return"narrow"===t&&"string"==typeof r?r:i[0]||e}var Jd=/^(\d+)?\.((\d+)(-(\d+))?)?$/,Zd=".",Qd="0",Xd="#";function $d(e,t,n,i,r,a){var o=arguments.length>6&&void 0!==arguments[6]&&arguments[6],s="",u=!1;if(isFinite(e)){var l=ih(e);o&&(l=nh(l));var c=t.minInt,d=t.minFrac,h=t.maxFrac;if(a){var f=a.match(Jd);if(null===f)throw new Error("".concat(a," is not a valid digit info"));var p=f[1],m=f[3],g=f[5];null!=p&&(c=ah(p)),null!=m&&(d=ah(m)),null!=g?h=ah(g):null!=m&&d>h&&(h=d)}rh(l,d,h);var v=l.digits,_=l.integerLen,y=l.exponent,b=[];for(u=v.every(function(e){return!e});_0?b=v.splice(_,v.length):(b=v,v=[0]);var w=[];for(v.length>=t.lgSize&&w.unshift(v.splice(-t.lgSize,v.length).join(""));v.length>t.gSize;)w.unshift(v.splice(-t.gSize,v.length).join(""));v.length&&w.unshift(v.join("")),s=w.join(zd(n,i)),b.length&&(s+=zd(n,r)+b.join("")),y&&(s+=zd(n,Ud.Exponential)+"+"+y)}else s=zd(n,Ud.Infinity);return e<0&&!u?t.negPre+s+t.negSuf:t.posPre+s+t.posSuf}function eh(e,t,n,i,r){var a=th(qd(t,Wd.Currency),zd(t,Ud.MinusSign));return a.minFrac=function(e){var t,n=Bd[e];return n&&(t=n[2]),"number"==typeof t?t:2}(i),a.maxFrac=a.minFrac,$d(e,a,t,Ud.CurrencyGroup,Ud.CurrencyDecimal,r).replace("\xa4",n).replace("\xa4","").trim()}function th(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"-",n={minInt:1,minFrac:0,maxFrac:0,posPre:"",posSuf:"",negPre:"",negSuf:"",gSize:0,lgSize:0},i=e.split(";"),r=i[0],a=i[1],o=-1!==r.indexOf(Zd)?r.split(Zd):[r.substring(0,r.lastIndexOf(Qd)+1),r.substring(r.lastIndexOf(Qd)+1)],s=o[0],u=o[1]||"";n.posPre=s.substr(0,s.indexOf(Xd));for(var l=0;l-1&&(o=o.replace(Zd,"")),(i=o.search(/e/i))>0?(n<0&&(n=i),n+=+o.slice(i+1),o=o.substring(0,i)):n<0&&(n=o.length),i=0;o.charAt(i)===Qd;i++);if(i===(a=o.length))t=[0],n=1;else{for(a--;o.charAt(a)===Qd;)a--;for(n-=i,t=[],r=0;i<=a;i++,r++)t[r]=Number(o.charAt(i))}return n>22&&(t=t.splice(0,21),s=n-1,n=1),{digits:t,exponent:s,integerLen:n}}function rh(e,t,n){if(t>n)throw new Error("The minimum number of digits after fraction (".concat(t,") is higher than the maximum (").concat(n,")."));var i=e.digits,r=i.length-e.integerLen,a=Math.min(Math.max(t,r),n),o=a+e.integerLen,s=i[o];if(o>0){i.splice(Math.max(e.integerLen,o));for(var u=o;u=5)if(o-1<0){for(var c=0;c>o;c--)i.unshift(0),e.integerLen++;i.unshift(1),e.integerLen++}else i[o-1]++;for(;r=h?i.pop():d=!1),t>=10?1:0},0);f&&(i.unshift(f),e.integerLen++)}function ah(e){var t=parseInt(e);if(isNaN(t))throw new Error("Invalid integer literal when parsing "+e);return t}var oh=function e(){v(this,e)},sh=function(){var e=function(e){_(n,e);var t=w(n);function n(e){var i;return v(this,n),(i=t.call(this)).locale=e,i}return g(n,[{key:"getPluralCategory",value:function(e,t){switch(function(e){return _u(e)[bu.PluralCase]}(t||this.locale)(e)){case Vd.Zero:return"zero";case Vd.One:return"one";case Vd.Two:return"two";case Vd.Few:return"few";case Vd.Many:return"many";default:return"other"}}}]),n}(oh);return e.\u0275fac=function(t){return new(t||e)(Gi(Tc))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}();function uh(e,t){t=encodeURIComponent(t);var n,i=c(e.split(";"));try{for(i.s();!(n=i.n()).done;){var r=n.value,a=r.indexOf("="),o=u(-1==a?[r,""]:[r.slice(0,a),r.slice(a+1)],2),s=o[1];if(o[0].trim()===t)return decodeURIComponent(s)}}catch(l){i.e(l)}finally{i.f()}return null}var lh=function(){var e=function(){function e(t,n,i,r){v(this,e),this._iterableDiffers=t,this._keyValueDiffers=n,this._ngEl=i,this._renderer=r,this._iterableDiffer=null,this._keyValueDiffer=null,this._initialClasses=[],this._rawClass=null}return g(e,[{key:"ngDoCheck",value:function(){if(this._iterableDiffer){var e=this._iterableDiffer.diff(this._rawClass);e&&this._applyIterableChanges(e)}else if(this._keyValueDiffer){var t=this._keyValueDiffer.diff(this._rawClass);t&&this._applyKeyValueChanges(t)}}},{key:"_applyKeyValueChanges",value:function(e){var t=this;e.forEachAddedItem(function(e){return t._toggleClass(e.key,e.currentValue)}),e.forEachChangedItem(function(e){return t._toggleClass(e.key,e.currentValue)}),e.forEachRemovedItem(function(e){e.previousValue&&t._toggleClass(e.key,!1)})}},{key:"_applyIterableChanges",value:function(e){var t=this;e.forEachAddedItem(function(e){if("string"!=typeof e.item)throw new Error("NgClass can only toggle CSS classes expressed as strings, got ".concat(Ce(e.item)));t._toggleClass(e.item,!0)}),e.forEachRemovedItem(function(e){return t._toggleClass(e.item,!1)})}},{key:"_applyClasses",value:function(e){var t=this;e&&(Array.isArray(e)||e instanceof Set?e.forEach(function(e){return t._toggleClass(e,!0)}):Object.keys(e).forEach(function(n){return t._toggleClass(n,!!e[n])}))}},{key:"_removeClasses",value:function(e){var t=this;e&&(Array.isArray(e)||e instanceof Set?e.forEach(function(e){return t._toggleClass(e,!1)}):Object.keys(e).forEach(function(e){return t._toggleClass(e,!1)}))}},{key:"_toggleClass",value:function(e,t){var n=this;(e=e.trim())&&e.split(/\s+/g).forEach(function(e){t?n._renderer.addClass(n._ngEl.nativeElement,e):n._renderer.removeClass(n._ngEl.nativeElement,e)})}},{key:"klass",set:function(e){this._removeClasses(this._initialClasses),this._initialClasses="string"==typeof e?e.split(/\s+/):[],this._applyClasses(this._initialClasses),this._applyClasses(this._rawClass)}},{key:"ngClass",set:function(e){this._removeClasses(this._rawClass),this._applyClasses(this._initialClasses),this._iterableDiffer=null,this._keyValueDiffer=null,this._rawClass="string"==typeof e?e.split(/\s+/):e,this._rawClass&&(is(this._rawClass)?this._iterableDiffer=this._iterableDiffers.find(this._rawClass).create():this._keyValueDiffer=this._keyValueDiffers.find(this._rawClass).create())}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(nl),ms(il),ms(ju),ms(Bu))},e.\u0275dir=gt({type:e,selectors:[["","ngClass",""]],inputs:{klass:["class","klass"],ngClass:"ngClass"}}),e}(),ch=function(){function e(t,n,i,r){v(this,e),this.$implicit=t,this.ngForOf=n,this.index=i,this.count=r}return g(e,[{key:"first",get:function(){return 0===this.index}},{key:"last",get:function(){return this.index===this.count-1}},{key:"even",get:function(){return this.index%2==0}},{key:"odd",get:function(){return!this.even}}]),e}(),dh=function(){var e=function(){function e(t,n,i){v(this,e),this._viewContainer=t,this._template=n,this._differs=i,this._ngForOf=null,this._ngForOfDirty=!0,this._differ=null}return g(e,[{key:"ngDoCheck",value:function(){if(this._ngForOfDirty){this._ngForOfDirty=!1;var e=this._ngForOf;if(!this._differ&&e)try{this._differ=this._differs.find(e).create(this.ngForTrackBy)}catch(i){throw new Error("Cannot find a differ supporting object '".concat(e,"' of type '").concat((t=e).name||typeof t,"'. NgFor only supports binding to Iterables such as Arrays."))}}var t;if(this._differ){var n=this._differ.diff(this._ngForOf);n&&this._applyChanges(n)}}},{key:"_applyChanges",value:function(e){var t=this,n=[];e.forEachOperation(function(e,i,r){if(null==e.previousIndex){var a=t._viewContainer.createEmbeddedView(t._template,new ch(null,t._ngForOf,-1,-1),null===r?void 0:r),o=new hh(e,a);n.push(o)}else if(null==r)t._viewContainer.remove(null===i?void 0:i);else if(null!==i){var s=t._viewContainer.get(i);t._viewContainer.move(s,r);var u=new hh(e,s);n.push(u)}});for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:"USD";v(this,e),this._locale=t,this._defaultCurrencyCode=n}return g(e,[{key:"transform",value:function(t,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"symbol",r=arguments.length>3?arguments[3]:void 0,a=arguments.length>4?arguments[4]:void 0;if(!Oh(t))return null;a=a||this._locale,"boolean"==typeof i&&(i=i?"symbol":"code");var o=n||this._defaultCurrencyCode;"code"!==i&&(o="symbol"===i||"symbol-narrow"===i?Kd(o,"symbol"===i?"wide":"narrow",a):i);try{var s=Eh(t);return eh(s,a,o,n,r)}catch(u){throw kh(e,u.message)}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(Tc),ms(Dc))},e.\u0275pipe=vt({name:"currency",type:e,pure:!0}),e}();function Oh(e){return!(null==e||""===e||e!=e)}function Eh(e){if("string"==typeof e&&!isNaN(Number(e)-parseFloat(e)))return Number(e);if("number"!=typeof e)throw new Error("".concat(e," is not a number"));return e}var Ph=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[{provide:oh,useClass:sh}]}),e}(),Ah=function(){var e=function e(){v(this,e)};return e.\u0275prov=Ee({token:e,providedIn:"root",factory:function(){return new Yh(Gi(Md),window)}}),e}(),Yh=function(){function e(t,n){v(this,e),this.document=t,this.window=n,this.offset=function(){return[0,0]}}return g(e,[{key:"setOffset",value:function(e){this.offset=Array.isArray(e)?function(){return e}:e}},{key:"getScrollPosition",value:function(){return this.supportsScrolling()?[this.window.pageXOffset,this.window.pageYOffset]:[0,0]}},{key:"scrollToPosition",value:function(e){this.supportsScrolling()&&this.window.scrollTo(e[0],e[1])}},{key:"scrollToAnchor",value:function(e){var t;if(this.supportsScrolling()){var n=null!==(t=this.document.getElementById(e))&&void 0!==t?t:this.document.getElementsByName(e)[0];void 0!==n&&(this.scrollToElement(n),this.attemptFocus(n))}}},{key:"setHistoryScrollRestoration",value:function(e){if(this.supportScrollRestoration()){var t=this.window.history;t&&t.scrollRestoration&&(t.scrollRestoration=e)}}},{key:"scrollToElement",value:function(e){var t=e.getBoundingClientRect(),n=t.left+this.window.pageXOffset,i=t.top+this.window.pageYOffset,r=this.offset();this.window.scrollTo(n-r[0],i-r[1])}},{key:"attemptFocus",value:function(e){return e.focus(),this.document.activeElement===e}},{key:"supportScrollRestoration",value:function(){try{if(!this.supportsScrolling())return!1;var e=Ih(this.window.history)||Ih(Object.getPrototypeOf(this.window.history));return!(!e||!e.writable&&!e.set)}catch(t){return!1}}},{key:"supportsScrolling",value:function(){try{return!!this.window&&!!this.window.scrollTo&&"pageXOffset"in this.window}catch(e){return!1}}}]),e}();function Ih(e){return Object.getOwnPropertyDescriptor(e,"scrollRestoration")}var Rh,Fh=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"getProperty",value:function(e,t){return e[t]}},{key:"log",value:function(e){window.console&&window.console.log&&window.console.log(e)}},{key:"logGroup",value:function(e){window.console&&window.console.group&&window.console.group(e)}},{key:"logGroupEnd",value:function(){window.console&&window.console.groupEnd&&window.console.groupEnd()}},{key:"onAndCancel",value:function(e,t,n){return e.addEventListener(t,n,!1),function(){e.removeEventListener(t,n,!1)}}},{key:"dispatchEvent",value:function(e,t){e.dispatchEvent(t)}},{key:"remove",value:function(e){return e.parentNode&&e.parentNode.removeChild(e),e}},{key:"getValue",value:function(e){return e.value}},{key:"createElement",value:function(e,t){return(t=t||this.getDefaultDocument()).createElement(e)}},{key:"createHtmlDocument",value:function(){return document.implementation.createHTMLDocument("fakeTitle")}},{key:"getDefaultDocument",value:function(){return document}},{key:"isElementNode",value:function(e){return e.nodeType===Node.ELEMENT_NODE}},{key:"isShadowRoot",value:function(e){return e instanceof DocumentFragment}},{key:"getGlobalEventTarget",value:function(e,t){return"window"===t?window:"document"===t?e:"body"===t?e.body:null}},{key:"getHistory",value:function(){return window.history}},{key:"getLocation",value:function(){return window.location}},{key:"getBaseHref",value:function(e){var t,n=Hh||(Hh=document.querySelector("base"))?Hh.getAttribute("href"):null;return null==n?null:(t=n,Rh||(Rh=document.createElement("a")),Rh.setAttribute("href",t),"/"===Rh.pathname.charAt(0)?Rh.pathname:"/"+Rh.pathname)}},{key:"resetBaseElement",value:function(){Hh=null}},{key:"getUserAgent",value:function(){return window.navigator.userAgent}},{key:"performanceNow",value:function(){return window.performance&&window.performance.now?window.performance.now():(new Date).getTime()}},{key:"supportsCookies",value:function(){return!0}},{key:"getCookie",value:function(e){return uh(document.cookie,e)}}],[{key:"makeCurrent",value:function(){var e;e=new n,bd||(bd=e)}}]),n}(function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.call(this)}return g(n,[{key:"supportsDOMEvents",value:function(){return!0}}]),n}(kd)),Hh=null,jh=new Si("TRANSITION_ID"),Nh=[{provide:yc,useFactory:function(e,t,n){return function(){n.get(bc).donePromise.then(function(){var n=wd();Array.prototype.slice.apply(t.querySelectorAll("style[ng-transition]")).filter(function(t){return t.getAttribute("ng-transition")===e}).forEach(function(e){return n.remove(e)})})}},deps:[jh,Md,Go],multi:!0}],Bh=function(){function e(){v(this,e)}return g(e,[{key:"addToWindow",value:function(e){Xe.getAngularTestability=function(t){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=e.findTestabilityInTree(t,n);if(null==i)throw new Error("Could not find testability for element.");return i},Xe.getAllAngularTestabilities=function(){return e.getAllTestabilities()},Xe.getAllAngularRootElements=function(){return e.getAllRootElements()},Xe.frameworkStabilizers||(Xe.frameworkStabilizers=[]),Xe.frameworkStabilizers.push(function(e){var t=Xe.getAllAngularTestabilities(),n=t.length,i=!1,r=function(t){i=i||t,0==--n&&e(i)};t.forEach(function(e){e.whenStable(r)})})}},{key:"findTestabilityInTree",value:function(e,t,n){if(null==t)return null;var i=e.getTestability(t);return null!=i?i:n?wd().isShadowRoot(t)?this.findTestabilityInTree(e,t.host,!0):this.findTestabilityInTree(e,t.parentElement,!0):null}}],[{key:"init",value:function(){var t;t=new e,Zc=t}}]),e}(),Wh=new Si("EventManagerPlugins"),Vh=function(){var e=function(){function e(t,n){var i=this;v(this,e),this._zone=n,this._eventNameToPlugin=new Map,t.forEach(function(e){return e.manager=i}),this._plugins=t.slice().reverse()}return g(e,[{key:"addEventListener",value:function(e,t,n){return this._findPluginFor(t).addEventListener(e,t,n)}},{key:"addGlobalEventListener",value:function(e,t,n){return this._findPluginFor(t).addGlobalEventListener(e,t,n)}},{key:"getZone",value:function(){return this._zone}},{key:"_findPluginFor",value:function(e){var t=this._eventNameToPlugin.get(e);if(t)return t;for(var n=this._plugins,i=0;i-1&&(t.splice(n,1),a+=e+".")}),a+=r,0!=t.length||0===r.length)return null;var o={};return o.domEventName=i,o.fullKey=a,o}},{key:"getEventFullKey",value:function(e){var t="",n=function(e){var t=e.key;if(null==t){if(null==(t=e.keyIdentifier))return"Unidentified";t.startsWith("U+")&&(t=String.fromCharCode(parseInt(t.substring(2),16)),3===e.location&&uf.hasOwnProperty(t)&&(t=uf[t]))}return sf[t]||t}(e);return" "===(n=n.toLowerCase())?n="space":"."===n&&(n="dot"),of.forEach(function(i){i!=n&&(0,lf[i])(e)&&(t+=i+".")}),t+=n}},{key:"eventCallback",value:function(e,t,i){return function(r){n.getEventFullKey(r)===e&&i.runGuarded(function(){return t(r)})}}},{key:"_normalizeKey",value:function(e){switch(e){case"esc":return"escape";default:return e}}}]),n}(Uh);return e.\u0275fac=function(t){return new(t||e)(Gi(Md))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),df=function(){var e=function e(){v(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ee({factory:function(){return Gi(hf)},token:e,providedIn:"root"}),e}(),hf=function(){var e=function(e){_(n,e);var t=w(n);function n(e){var i;return v(this,n),(i=t.call(this))._doc=e,i}return g(n,[{key:"sanitize",value:function(e,t){if(null==t)return null;switch(e){case Er.NONE:return t;case Er.HTML:return or(t,"HTML")?ar(t):Dr(this._doc,String(t));case Er.STYLE:return or(t,"Style")?ar(t):t;case Er.SCRIPT:if(or(t,"Script"))return ar(t);throw new Error("unsafe value used in a script context");case Er.URL:return sr(t),or(t,"URL")?ar(t):hr(String(t));case Er.RESOURCE_URL:if(or(t,"ResourceURL"))return ar(t);throw new Error("unsafe value used in a resource URL context (see https://g.co/ng/security#xss)");default:throw new Error("Unexpected SecurityContext ".concat(e," (see https://g.co/ng/security#xss)"))}}},{key:"bypassSecurityTrustHtml",value:function(e){return new er(e)}},{key:"bypassSecurityTrustStyle",value:function(e){return new tr(e)}},{key:"bypassSecurityTrustScript",value:function(e){return new nr(e)}},{key:"bypassSecurityTrustUrl",value:function(e){return new ir(e)}},{key:"bypassSecurityTrustResourceUrl",value:function(e){return new rr(e)}}]),n}(df);return e.\u0275fac=function(t){return new(t||e)(Gi(Md))},e.\u0275prov=Ee({factory:function(){return e=Gi(Oo),new hf(e.get(Md));var e},token:e,providedIn:"root"}),e}(),ff=rd(gd,"browser",[{provide:Cc,useValue:"browser"},{provide:Sc,useValue:function(){Fh.makeCurrent(),Bh.init()},multi:!0},{provide:Md,useFactory:function(){return function(e){Nt=e}(document),document},deps:[]}]),pf=[[],{provide:Po,useValue:"root"},{provide:Hr,useFactory:function(){return new Hr},deps:[]},{provide:Wh,useClass:af,multi:!0,deps:[Md,Nc,Cc]},{provide:Wh,useClass:cf,multi:!0,deps:[Md]},[],{provide:ef,useClass:ef,deps:[Vh,qh,wc]},{provide:Nu,useExisting:ef},{provide:zh,useExisting:qh},{provide:qh,useClass:qh,deps:[Md]},{provide:Kc,useClass:Kc,deps:[Nc]},{provide:Vh,useClass:Vh,deps:[Wh,Nc]},[]],mf=function(){var e=function(){function e(t){if(v(this,e),t)throw new Error("BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.")}return g(e,null,[{key:"withServerTransition",value:function(t){return{ngModule:e,providers:[{provide:wc,useValue:t.appId},{provide:jh,useExisting:wc},Nh]}}}]),e}();return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)(Gi(e,12))},providers:pf,imports:[Ph,_d]}),e}();function gf(e){return function(t){return t.lift(new vf(e,t))}}"undefined"!=typeof window&&window;var vf=function(){function e(t,n){v(this,e),this.notifier=t,this.source=n}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new _f(e,this.notifier,this.source))}}]),e}(),_f=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this,e)).notifier=i,a.source=r,a}return g(n,[{key:"error",value:function(e){if(!this.isStopped){var t=this.errors,a=this.retries,o=this.retriesSubscription;if(a)this.errors=null,this.retriesSubscription=null;else{t=new z;try{a=(0,this.notifier)(t)}catch(s){return r(i(n.prototype),"error",this).call(this,s)}o=te(this,a)}this._unsubscribeAndRecycle(),this.errors=t,this.retries=a,this.retriesSubscription=o,t.next(e)}}},{key:"_unsubscribe",value:function(){var e=this.errors,t=this.retriesSubscription;e&&(e.unsubscribe(),this.errors=null),t&&(t.unsubscribe(),this.retriesSubscription=null),this.retries=null}},{key:"notifyNext",value:function(e,t,n,i,r){var a=this._unsubscribe;this._unsubscribe=null,this._unsubscribeAndRecycle(),this._unsubscribe=a,this.source.subscribe(this)}}]),n}(ne),yf=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,e,i)).scheduler=e,r.work=i,r.pending=!1,r}return g(n,[{key:"schedule",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(this.closed)return this;this.state=e;var n=this.id,i=this.scheduler;return null!=n&&(this.id=this.recycleAsyncId(i,n,t)),this.pending=!0,this.delay=t,this.id=this.id||this.requestAsyncId(i,this.id,t),this}},{key:"requestAsyncId",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return setInterval(e.flush.bind(e,this),n)}},{key:"recycleAsyncId",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(null!==n&&this.delay===n&&!1===this.pending)return t;clearInterval(t)}},{key:"execute",value:function(e,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var n=this._execute(e,t);if(n)return n;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))}},{key:"_execute",value:function(e,t){var n=!1,i=void 0;try{this.work(e)}catch(r){n=!0,i=!!r&&r||new Error(r)}if(n)return this.unsubscribe(),i}},{key:"_unsubscribe",value:function(){var e=this.id,t=this.scheduler,n=t.actions,i=n.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==i&&n.splice(i,1),null!=e&&(this.id=this.recycleAsyncId(t,e,null)),this.delay=null}}]),n}(function(e){_(n,e);var t=w(n);function n(e,i){return v(this,n),t.call(this)}return g(n,[{key:"schedule",value:function(e){return this}}]),n}(L)),bf=function(){var e=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e.now;v(this,e),this.SchedulerAction=t,this.now=n}return g(e,[{key:"schedule",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0;return new this.SchedulerAction(this,e).schedule(n,t)}}]),e}();return e.now=function(){return Date.now()},e}(),wf=function(e){_(n,e);var t=w(n);function n(e){var i,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:bf.now;return v(this,n),(i=t.call(this,e,function(){return n.delegate&&n.delegate!==a(i)?n.delegate.now():r()})).actions=[],i.active=!1,i.scheduled=void 0,i}return g(n,[{key:"schedule",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2?arguments[2]:void 0;return n.delegate&&n.delegate!==this?n.delegate.schedule(e,t,a):r(i(n.prototype),"schedule",this).call(this,e,t,a)}},{key:"flush",value:function(e){var t=this.actions;if(this.active)t.push(e);else{var n;this.active=!0;do{if(n=e.execute(e.state,e.delay))break}while(e=t.shift());if(this.active=!1,n){for(;e=t.shift();)e.unsubscribe();throw n}}}}]),n}(bf),kf=new wf(yf);function Mf(e){return e instanceof Date&&!isNaN(+e)}var Sf=new N(function(e){return e.complete()});function Cf(e){return e?function(e){return new N(function(t){return e.schedule(function(){return t.complete()})})}(e):Sf}function xf(){for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:kf,n=Mf(e),i=n?+e-t.now():Math.abs(e);return function(e){return e.lift(new Ef(i,t))}}var Ef=function(){function e(t,n){v(this,e),this.delay=t,this.scheduler=n}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new Pf(e,this.delay,this.scheduler))}}]),e}(),Pf=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this,e)).delay=i,a.scheduler=r,a.queue=[],a.active=!1,a.errored=!1,a}return g(n,[{key:"_schedule",value:function(e){this.active=!0,this.destination.add(e.schedule(n.dispatch,this.delay,{source:this,destination:this.destination,scheduler:e}))}},{key:"scheduleNotification",value:function(e){if(!0!==this.errored){var t=this.scheduler,n=new Af(t.now()+this.delay,e);this.queue.push(n),!1===this.active&&this._schedule(t)}}},{key:"_next",value:function(e){this.scheduleNotification(Df.createNext(e))}},{key:"_error",value:function(e){this.errored=!0,this.queue=[],this.destination.error(e),this.unsubscribe()}},{key:"_complete",value:function(){this.scheduleNotification(Df.createComplete()),this.unsubscribe()}}],[{key:"dispatch",value:function(e){for(var t=e.source,n=t.queue,i=e.scheduler,r=e.destination;n.length>0&&n[0].time-i.now()<=0;)n.shift().notification.observe(r);if(n.length>0){var a=Math.max(0,n[0].time-i.now());this.schedule(e,a)}else this.unsubscribe(),t.active=!1}}]),n}(Y),Af=function e(t,n){v(this,e),this.time=t,this.notification=n},Yf=n("kB5k"),If=n.n(Yf);function Rf(e){return function(t){var n=new Ff(e),i=t.lift(n);return n.caught=i}}var Ff=function(){function e(t){v(this,e),this.selector=t}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new Hf(e,this.selector,this.caught))}}]),e}(),Hf=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this,e)).selector=i,a.caught=r,a}return g(n,[{key:"error",value:function(e){if(!this.isStopped){var t;try{t=this.selector(e,this.caught)}catch(o){return void r(i(n.prototype),"error",this).call(this,o)}this._unsubscribeAndRecycle();var a=new K(this,void 0,void 0);this.add(a),te(this,t,void 0,void 0,a)}}}]),n}(ne),jf=function(){function e(){return Error.call(this),this.message="no elements in sequence",this.name="EmptyError",this}return e.prototype=Object.create(Error.prototype),e}();function Nf(e,t){return function(n){return n.lift(new Bf(e,t))}}var Bf=function(){function e(t,n){v(this,e),this.predicate=t,this.thisArg=n}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new Wf(e,this.predicate,this.thisArg))}}]),e}(),Wf=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this,e)).predicate=i,a.thisArg=r,a.count=0,a}return g(n,[{key:"_next",value:function(e){var t;try{t=this.predicate.call(this.thisArg,e,this.count++)}catch(n){return void this.destination.error(n)}t&&this.destination.next(e)}}]),n}(Y),Vf=function(){function e(){return Error.call(this),this.message="argument out of range",this.name="ArgumentOutOfRangeError",this}return e.prototype=Object.create(Error.prototype),e}();function Uf(e){return function(t){return 0===e?Cf():t.lift(new zf(e))}}var zf=function(){function e(t){if(v(this,e),this.total=t,this.total<0)throw new Vf}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new qf(e,this.total))}}]),e}(),qf=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,e)).total=i,r.count=0,r}return g(n,[{key:"_next",value:function(e){var t=this.total,n=++this.count;n<=t&&(this.destination.next(e),n===t&&(this.destination.complete(),this.unsubscribe()))}}]),n}(Y);function Gf(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return function(t){return t.lift(new Kf(e))}}var Kf=function(){function e(t){v(this,e),this.defaultValue=t}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new Jf(e,this.defaultValue))}}]),e}(),Jf=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,e)).defaultValue=i,r.isEmpty=!0,r}return g(n,[{key:"_next",value:function(e){this.isEmpty=!1,this.destination.next(e)}},{key:"_complete",value:function(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()}}]),n}(Y);function Zf(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:$f;return function(t){return t.lift(new Qf(e))}}var Qf=function(){function e(t){v(this,e),this.errorFactory=t}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new Xf(e,this.errorFactory))}}]),e}(),Xf=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,e)).errorFactory=i,r.hasValue=!1,r}return g(n,[{key:"_next",value:function(e){this.hasValue=!0,this.destination.next(e)}},{key:"_complete",value:function(){if(this.hasValue)return this.destination.complete();var e;try{e=this.errorFactory()}catch(t){e=t}this.destination.error(e)}}]),n}(Y);function $f(){return new jf}function ep(e,t){var n=arguments.length>=2;return function(i){return i.pipe(e?Nf(function(t,n){return e(t,n,i)}):de,Uf(1),n?Gf(t):Zf(function(){return new jf}))}}function tp(e,t){return ue(e,t,1)}var np=function e(){v(this,e)},ip=function e(){v(this,e)},rp=function(){function e(t){var n=this;v(this,e),this.normalizedNames=new Map,this.lazyUpdate=null,t?this.lazyInit="string"==typeof t?function(){n.headers=new Map,t.split("\n").forEach(function(e){var t=e.indexOf(":");if(t>0){var i=e.slice(0,t),r=i.toLowerCase(),a=e.slice(t+1).trim();n.maybeSetNormalizedName(i,r),n.headers.has(r)?n.headers.get(r).push(a):n.headers.set(r,[a])}})}:function(){n.headers=new Map,Object.keys(t).forEach(function(e){var i=t[e],r=e.toLowerCase();"string"==typeof i&&(i=[i]),i.length>0&&(n.headers.set(r,i),n.maybeSetNormalizedName(e,r))})}:this.headers=new Map}return g(e,[{key:"has",value:function(e){return this.init(),this.headers.has(e.toLowerCase())}},{key:"get",value:function(e){this.init();var t=this.headers.get(e.toLowerCase());return t&&t.length>0?t[0]:null}},{key:"keys",value:function(){return this.init(),Array.from(this.normalizedNames.values())}},{key:"getAll",value:function(e){return this.init(),this.headers.get(e.toLowerCase())||null}},{key:"append",value:function(e,t){return this.clone({name:e,value:t,op:"a"})}},{key:"set",value:function(e,t){return this.clone({name:e,value:t,op:"s"})}},{key:"delete",value:function(e,t){return this.clone({name:e,value:t,op:"d"})}},{key:"maybeSetNormalizedName",value:function(e,t){this.normalizedNames.has(t)||this.normalizedNames.set(t,e)}},{key:"init",value:function(){var t=this;this.lazyInit&&(this.lazyInit instanceof e?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(function(e){return t.applyUpdate(e)}),this.lazyUpdate=null))}},{key:"copyFrom",value:function(e){var t=this;e.init(),Array.from(e.headers.keys()).forEach(function(n){t.headers.set(n,e.headers.get(n)),t.normalizedNames.set(n,e.normalizedNames.get(n))})}},{key:"clone",value:function(t){var n=new e;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof e?this.lazyInit:this,n.lazyUpdate=(this.lazyUpdate||[]).concat([t]),n}},{key:"applyUpdate",value:function(e){var t=e.name.toLowerCase();switch(e.op){case"a":case"s":var n=e.value;if("string"==typeof n&&(n=[n]),0===n.length)return;this.maybeSetNormalizedName(e.name,t);var i=("a"===e.op?this.headers.get(t):void 0)||[];i.push.apply(i,d(n)),this.headers.set(t,i);break;case"d":var r=e.value;if(r){var a=this.headers.get(t);if(!a)return;0===(a=a.filter(function(e){return-1===r.indexOf(e)})).length?(this.headers.delete(t),this.normalizedNames.delete(t)):this.headers.set(t,a)}else this.headers.delete(t),this.normalizedNames.delete(t)}}},{key:"forEach",value:function(e){var t=this;this.init(),Array.from(this.normalizedNames.keys()).forEach(function(n){return e(t.normalizedNames.get(n),t.headers.get(n))})}}]),e}(),ap=function(){function e(){v(this,e)}return g(e,[{key:"encodeKey",value:function(e){return sp(e)}},{key:"encodeValue",value:function(e){return sp(e)}},{key:"decodeKey",value:function(e){return decodeURIComponent(e)}},{key:"decodeValue",value:function(e){return decodeURIComponent(e)}}]),e}();function op(e,t){var n=new Map;return e.length>0&&e.split("&").forEach(function(e){var i=e.indexOf("="),r=u(-1==i?[t.decodeKey(e),""]:[t.decodeKey(e.slice(0,i)),t.decodeValue(e.slice(i+1))],2),a=r[0],o=r[1],s=n.get(a)||[];s.push(o),n.set(a,s)}),n}function sp(e){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var up=function(){function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(v(this,e),this.updates=null,this.cloneFrom=null,this.encoder=n.encoder||new ap,n.fromString){if(n.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=op(n.fromString,this.encoder)}else n.fromObject?(this.map=new Map,Object.keys(n.fromObject).forEach(function(e){var i=n.fromObject[e];t.map.set(e,Array.isArray(i)?i:[i])})):this.map=null}return g(e,[{key:"has",value:function(e){return this.init(),this.map.has(e)}},{key:"get",value:function(e){this.init();var t=this.map.get(e);return t?t[0]:null}},{key:"getAll",value:function(e){return this.init(),this.map.get(e)||null}},{key:"keys",value:function(){return this.init(),Array.from(this.map.keys())}},{key:"append",value:function(e,t){return this.clone({param:e,value:t,op:"a"})}},{key:"set",value:function(e,t){return this.clone({param:e,value:t,op:"s"})}},{key:"delete",value:function(e,t){return this.clone({param:e,value:t,op:"d"})}},{key:"toString",value:function(){var e=this;return this.init(),this.keys().map(function(t){var n=e.encoder.encodeKey(t);return e.map.get(t).map(function(t){return n+"="+e.encoder.encodeValue(t)}).join("&")}).filter(function(e){return""!==e}).join("&")}},{key:"clone",value:function(t){var n=new e({encoder:this.encoder});return n.cloneFrom=this.cloneFrom||this,n.updates=(this.updates||[]).concat([t]),n}},{key:"init",value:function(){var e=this;null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(function(t){return e.map.set(t,e.cloneFrom.map.get(t))}),this.updates.forEach(function(t){switch(t.op){case"a":case"s":var n=("a"===t.op?e.map.get(t.param):void 0)||[];n.push(t.value),e.map.set(t.param,n);break;case"d":if(void 0===t.value){e.map.delete(t.param);break}var i=e.map.get(t.param)||[],r=i.indexOf(t.value);-1!==r&&i.splice(r,1),i.length>0?e.map.set(t.param,i):e.map.delete(t.param)}}),this.cloneFrom=this.updates=null)}}]),e}();function lp(e){return"undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer}function cp(e){return"undefined"!=typeof Blob&&e instanceof Blob}function dp(e){return"undefined"!=typeof FormData&&e instanceof FormData}var hp=function(){function e(t,n,i,r){var a;if(v(this,e),this.url=n,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=t.toUpperCase(),function(e){switch(e){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||r?(this.body=void 0!==i?i:null,a=r):a=i,a&&(this.reportProgress=!!a.reportProgress,this.withCredentials=!!a.withCredentials,a.responseType&&(this.responseType=a.responseType),a.headers&&(this.headers=a.headers),a.params&&(this.params=a.params)),this.headers||(this.headers=new rp),this.params){var o=this.params.toString();if(0===o.length)this.urlWithParams=n;else{var s=n.indexOf("?");this.urlWithParams=n+(-1===s?"?":s0&&void 0!==arguments[0]?arguments[0]:{},n=t.method||this.method,i=t.url||this.url,r=t.responseType||this.responseType,a=void 0!==t.body?t.body:this.body,o=void 0!==t.withCredentials?t.withCredentials:this.withCredentials,s=void 0!==t.reportProgress?t.reportProgress:this.reportProgress,u=t.headers||this.headers,l=t.params||this.params;return void 0!==t.setHeaders&&(u=Object.keys(t.setHeaders).reduce(function(e,n){return e.set(n,t.setHeaders[n])},u)),t.setParams&&(l=Object.keys(t.setParams).reduce(function(e,n){return e.set(n,t.setParams[n])},l)),new e(n,i,a,{params:l,headers:u,reportProgress:s,responseType:r,withCredentials:o})}}]),e}(),fp=function(e){return e[e.Sent=0]="Sent",e[e.UploadProgress=1]="UploadProgress",e[e.ResponseHeader=2]="ResponseHeader",e[e.DownloadProgress=3]="DownloadProgress",e[e.Response=4]="Response",e[e.User=5]="User",e}({}),pp=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:200,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"OK";v(this,e),this.headers=t.headers||new rp,this.status=void 0!==t.status?t.status:n,this.statusText=t.statusText||i,this.url=t.url||null,this.ok=this.status>=200&&this.status<300},mp=function(e){_(n,e);var t=w(n);function n(){var e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return v(this,n),(e=t.call(this,i)).type=fp.ResponseHeader,e}return g(n,[{key:"clone",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return new n({headers:e.headers||this.headers,status:void 0!==e.status?e.status:this.status,statusText:e.statusText||this.statusText,url:e.url||this.url||void 0})}}]),n}(pp),gp=function(e){_(n,e);var t=w(n);function n(){var e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return v(this,n),(e=t.call(this,i)).type=fp.Response,e.body=void 0!==i.body?i.body:null,e}return g(n,[{key:"clone",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return new n({body:void 0!==e.body?e.body:this.body,headers:e.headers||this.headers,status:void 0!==e.status?e.status:this.status,statusText:e.statusText||this.statusText,url:e.url||this.url||void 0})}}]),n}(pp),vp=function(e){_(n,e);var t=w(n);function n(e){var i;return v(this,n),(i=t.call(this,e,0,"Unknown Error")).name="HttpErrorResponse",i.ok=!1,i.message=i.status>=200&&i.status<300?"Http failure during parsing for ".concat(e.url||"(unknown url)"):"Http failure response for ".concat(e.url||"(unknown url)",": ").concat(e.status," ").concat(e.statusText),i.error=e.error||null,i}return n}(pp);function _p(e,t){return{body:t,headers:e.headers,observe:e.observe,params:e.params,reportProgress:e.reportProgress,responseType:e.responseType,withCredentials:e.withCredentials}}var yp=function(){var e=function(){function e(t){v(this,e),this.handler=t}return g(e,[{key:"request",value:function(e,t){var n,i=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e instanceof hp)n=e;else{var a=void 0;a=r.headers instanceof rp?r.headers:new rp(r.headers);var o=void 0;r.params&&(o=r.params instanceof up?r.params:new up({fromObject:r.params})),n=new hp(e,t,void 0!==r.body?r.body:null,{headers:a,params:o,reportProgress:r.reportProgress,responseType:r.responseType||"json",withCredentials:r.withCredentials})}var s=xf(n).pipe(tp(function(e){return i.handler.handle(e)}));if(e instanceof hp||"events"===r.observe)return s;var u=s.pipe(Nf(function(e){return e instanceof gp}));switch(r.observe||"body"){case"body":switch(n.responseType){case"arraybuffer":return u.pipe(ie(function(e){if(null!==e.body&&!(e.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return e.body}));case"blob":return u.pipe(ie(function(e){if(null!==e.body&&!(e.body instanceof Blob))throw new Error("Response is not a Blob.");return e.body}));case"text":return u.pipe(ie(function(e){if(null!==e.body&&"string"!=typeof e.body)throw new Error("Response is not a string.");return e.body}));case"json":default:return u.pipe(ie(function(e){return e.body}))}case"response":return u;default:throw new Error("Unreachable: unhandled observe type ".concat(r.observe,"}"))}}},{key:"delete",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("DELETE",e,t)}},{key:"get",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("GET",e,t)}},{key:"head",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("HEAD",e,t)}},{key:"jsonp",value:function(e,t){return this.request("JSONP",e,{params:(new up).append(t,"JSONP_CALLBACK"),observe:"body",responseType:"json"})}},{key:"options",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("OPTIONS",e,t)}},{key:"patch",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.request("PATCH",e,_p(n,t))}},{key:"post",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.request("POST",e,_p(n,t))}},{key:"put",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.request("PUT",e,_p(n,t))}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(np))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),bp=function(){function e(t,n){v(this,e),this.next=t,this.interceptor=n}return g(e,[{key:"handle",value:function(e){return this.interceptor.intercept(e,this.next)}}]),e}(),wp=new Si("HTTP_INTERCEPTORS"),kp=function(){var e=function(){function e(){v(this,e)}return g(e,[{key:"intercept",value:function(e,t){return t.handle(e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),Mp=/^\)\]\}',?\n/,Sp=function e(){v(this,e)},Cp=function(){var e=function(){function e(){v(this,e)}return g(e,[{key:"build",value:function(){return new XMLHttpRequest}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),xp=function(){var e=function(){function e(t){v(this,e),this.xhrFactory=t}return g(e,[{key:"handle",value:function(e){var t=this;if("JSONP"===e.method)throw new Error("Attempted to construct Jsonp request without HttpClientJsonpModule installed.");return new N(function(n){var i=t.xhrFactory.build();if(i.open(e.method,e.urlWithParams),e.withCredentials&&(i.withCredentials=!0),e.headers.forEach(function(e,t){return i.setRequestHeader(e,t.join(","))}),e.headers.has("Accept")||i.setRequestHeader("Accept","application/json, text/plain, */*"),!e.headers.has("Content-Type")){var r=e.detectContentTypeHeader();null!==r&&i.setRequestHeader("Content-Type",r)}if(e.responseType){var a=e.responseType.toLowerCase();i.responseType="json"!==a?a:"text"}var o=e.serializeBody(),s=null,u=function(){if(null!==s)return s;var t=1223===i.status?204:i.status,n=i.statusText||"OK",r=new rp(i.getAllResponseHeaders()),a=function(e){return"responseURL"in e&&e.responseURL?e.responseURL:/^X-Request-URL:/m.test(e.getAllResponseHeaders())?e.getResponseHeader("X-Request-URL"):null}(i)||e.url;return s=new mp({headers:r,status:t,statusText:n,url:a})},l=function(){var t=u(),r=t.headers,a=t.status,o=t.statusText,s=t.url,l=null;204!==a&&(l=void 0===i.response?i.responseText:i.response),0===a&&(a=l?200:0);var c=a>=200&&a<300;if("json"===e.responseType&&"string"==typeof l){var d=l;l=l.replace(Mp,"");try{l=""!==l?JSON.parse(l):null}catch(h){l=d,c&&(c=!1,l={error:h,text:l})}}c?(n.next(new gp({body:l,headers:r,status:a,statusText:o,url:s||void 0})),n.complete()):n.error(new vp({error:l,headers:r,status:a,statusText:o,url:s||void 0}))},c=function(e){var t=u(),r=new vp({error:e,status:i.status||0,statusText:i.statusText||"Unknown Error",url:t.url||void 0});n.error(r)},d=!1,h=function(t){d||(n.next(u()),d=!0);var r={type:fp.DownloadProgress,loaded:t.loaded};t.lengthComputable&&(r.total=t.total),"text"===e.responseType&&i.responseText&&(r.partialText=i.responseText),n.next(r)},f=function(e){var t={type:fp.UploadProgress,loaded:e.loaded};e.lengthComputable&&(t.total=e.total),n.next(t)};return i.addEventListener("load",l),i.addEventListener("error",c),e.reportProgress&&(i.addEventListener("progress",h),null!==o&&i.upload&&i.upload.addEventListener("progress",f)),i.send(o),n.next({type:fp.Sent}),function(){i.removeEventListener("error",c),i.removeEventListener("load",l),e.reportProgress&&(i.removeEventListener("progress",h),null!==o&&i.upload&&i.upload.removeEventListener("progress",f)),i.readyState!==i.DONE&&i.abort()}})}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Sp))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),Lp=new Si("XSRF_COOKIE_NAME"),Tp=new Si("XSRF_HEADER_NAME"),Dp=function e(){v(this,e)},Op=function(){var e=function(){function e(t,n,i){v(this,e),this.doc=t,this.platform=n,this.cookieName=i,this.lastCookieString="",this.lastToken=null,this.parseCount=0}return g(e,[{key:"getToken",value:function(){if("server"===this.platform)return null;var e=this.doc.cookie||"";return e!==this.lastCookieString&&(this.parseCount++,this.lastToken=uh(e,this.cookieName),this.lastCookieString=e),this.lastToken}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Md),Gi(Cc),Gi(Lp))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),Ep=function(){var e=function(){function e(t,n){v(this,e),this.tokenService=t,this.headerName=n}return g(e,[{key:"intercept",value:function(e,t){var n=e.url.toLowerCase();if("GET"===e.method||"HEAD"===e.method||n.startsWith("http://")||n.startsWith("https://"))return t.handle(e);var i=this.tokenService.getToken();return null===i||e.headers.has(this.headerName)||(e=e.clone({headers:e.headers.set(this.headerName,i)})),t.handle(e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Dp),Gi(Tp))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),Pp=function(){var e=function(){function e(t,n){v(this,e),this.backend=t,this.injector=n,this.chain=null}return g(e,[{key:"handle",value:function(e){if(null===this.chain){var t=this.injector.get(wp,[]);this.chain=t.reduceRight(function(e,t){return new bp(e,t)},this.backend)}return this.chain.handle(e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(ip),Gi(Go))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),Ap=function(){var e=function(){function e(){v(this,e)}return g(e,null,[{key:"disable",value:function(){return{ngModule:e,providers:[{provide:Ep,useClass:kp}]}}},{key:"withOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{ngModule:e,providers:[t.cookieName?{provide:Lp,useValue:t.cookieName}:[],t.headerName?{provide:Tp,useValue:t.headerName}:[]]}}}]),e}();return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[Ep,{provide:wp,useExisting:Ep,multi:!0},{provide:Dp,useClass:Op},{provide:Lp,useValue:"XSRF-TOKEN"},{provide:Tp,useValue:"X-XSRF-TOKEN"}]}),e}(),Yp=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[yp,{provide:np,useClass:Pp},xp,{provide:ip,useExisting:xp},Cp,{provide:Sp,useExisting:Cp}],imports:[[Ap.withOptions({cookieName:"XSRF-TOKEN",headerName:"X-XSRF-TOKEN"})]]}),e}(),Ip=function(e){return e.NoInternet="NoInternet",e.Unauthorized="Unauthorized",e.ApiDisabled="ApiDisabled",e.Unknown="Unknown",e}({}),Rp=function(e){return e.Success="Success",e.FailedOrRefused="FailedOrRefused",e.PinMismatch="PinMismatch",e.WithoutSeed="WithoutSeed",e.WrongPin="WrongPin",e.IncorrectHardwareWallet="IncorrectHardwareWallet",e.WrongWord="WrongWord",e.InvalidSeed="InvalidSeed",e.WrongSeed="WrongSeed",e.UndefinedError="UndefinedError",e.Disconnected="Disconnected",e.DaemonConnectionError="DaemonConnectionError",e.InvalidAddress="InvalidAddress",e.Timeout="Timeout",e.NotInBootloaderMode="NotInBootloaderMode",e.AddressGeneratorProblem="AddressGeneratorProblem",e}({}),Fp=function(){return function(){}}();function Hp(e){if(e.type)return e;var t=new Fp;if(t.originalError=e,!e||"string"==typeof e)return t.originalServerErrorMsg=e||"",t.translatableErrorMsg=e||"service.api.unknown-error",t.type=Ip.Unknown,t;t.originalServerErrorMsg=jp(e);var n=e;return null!=n.status&&(0===n.status||504===n.status?(t.type=Ip.NoInternet,t.translatableErrorMsg="service.api.no-internet-error"):0===n.status||403===n.status?(t.type=Ip.ApiDisabled,t.translatableErrorMsg="service.api.api-disabled-error"):400===n.status&&-1!==t.originalServerErrorMsg.toUpperCase().indexOf("Invalid password".toUpperCase())&&(t.type=Ip.Unauthorized,t.translatableErrorMsg="service.api.incorrect-password-error")),t.type||(t.type=Ip.Unknown,t.translatableErrorMsg=t.originalServerErrorMsg?function(e){if(!e||0===e.length)return e;var t,n,i=(n=null,(t=(t=e).toUpperCase()).includes("CHANGEADDRESS MUST NOT BE THE NULL ADDRESS")?n="null-change-address-error":t.includes("TO IS REQUIRED")?n="to-required-error":t.includes("TO.COINS MUST NOT BE ZERO")?n="zero-coins-error":t.includes("TO.ADDRESS MUST NOT BE THE NULL ADDRESS")?n="null-destination-error":t.includes("TO CONTAINS DUPLICATE VALUES")?n="duplicate-destination-error":t.includes("TO.HOURS MUST BE ZERO FOR AUTO TYPE HOURS SELECTION")?n="hours-in-automatic-mode-error":t.includes("HOURSSELECTION.MODE IS REQUIRED FOR AUTO TYPE HOURS SELECTION")?n="hours-allocation-mode-needed-error":t.includes("INVALID HOURSSELECTION.MODE")?n="invalid-hours-allocation-mode-error":t.includes("HOURSSELECTION.MODE CANNOT BE USED FOR MANUAL TYPE HOURS SELECTION")?n="hours-allocation-mode-not-needed-error":t.includes("INVALID HOURSSELECTION.TYPE")?n="invalid-hours-mode-error":t.includes("HOURSSELECTION.SHAREFACTOR MUST BE SET FOR SHARE MODE")?n="share-factor-needed-error":t.includes("HOURSSELECTION.SHAREFACTOR CAN ONLY BE USED FOR SHARE MODE")?n="share-factor-not-needed-error":t.includes("HOURSSELECTION.SHAREFACTOR MUST BE >= 0 AND <= 1")?n="invalid-share-factor-error":t.includes("TRANSACTION VIOLATES HARD CONSTRAINT: DUPLICATE OUTPUT IN TRANSACTION")?n="change-equal-to-destination-error":t.includes("FINGERPRINT CONFLICT FOR")&&(n="repeated-wallet"),n?"send.known-node-errors."+n:null);if(i)return i;if(-1!==e.indexOf('"error":'))try{e=JSON.parse(e).error.message}catch(o){}if(e.startsWith("400")||e.startsWith("403")){var r=e.split(" - ",2);e=2===r.length?r[1]:e}var a=(e=e.trim()).substr(0,1);return a.toUpperCase()!==a&&(e=a.toUpperCase()+e.substr(1,e.length-1)),e.endsWith(".")||e.endsWith(",")||e.endsWith(":")||e.endsWith(";")||e.endsWith("?")||e.endsWith("!")||(e+="."),e}(t.originalServerErrorMsg):"service.api.unknown-error"),t}function jp(e){if(e){if("string"==typeof e._body)return e._body;if(e.originalServerErrorMsg&&"string"==typeof e.originalServerErrorMsg)return e.originalServerErrorMsg;if(e.error&&"string"==typeof e.error)return e.error;if(e.error&&e.error.error&&e.error.error.message)return e.error.error.message;if(e.error&&e.error.error&&"string"==typeof e.error.error)return e.error.error;if(e.message)return e.message;if(e._body&&e._body.error)return e._body.error;try{return JSON.parse(e._body).error}catch(t){}}return null}function Np(e){window.location.assign("assets/error-alert/index.html?"+e)}var Bp=function(){function e(e){this.http=e,this.url="/api/"}return e.prototype.get=function(e,t,n){var i=this;return void 0===t&&(t=null),void 0===n&&(n=null),n=n?Object.assign(this.createDefaultRequestOptions(),n):this.createDefaultRequestOptions(),this.http.get(this.getUrl(e,t,n.useV2),this.returnRequestOptions(n,null)).pipe(Rf(function(e){return i.processConnectionError(e)}))},e.prototype.post=function(e,t,n){var i=this;return void 0===t&&(t=null),void 0===n&&(n=null),n=n?Object.assign(this.createDefaultRequestOptions(),n):this.createDefaultRequestOptions(),this.getCsrf().pipe(ep(),ue(function(r){return n.useV2&&(n.sendDataAsJson=!0),i.http.post(i.getUrl(e,null,n.useV2),n.sendDataAsJson?t?JSON.stringify(t):"":i.getQueryString(t),i.returnRequestOptions(n,r)).pipe(Rf(function(e){return i.processConnectionError(e)}))}))},e.prototype.createDefaultRequestOptions=function(){return{useV2:!1,sendDataAsJson:!1}},e.prototype.getCsrf=function(){return this.get("csrf").pipe(ie(function(e){return e.csrf_token}))},e.prototype.returnRequestOptions=function(e,t){var n={};return n.headers=new rp,n.headers=n.headers.append("Content-Type",e.sendDataAsJson?"application/json":"application/x-www-form-urlencoded"),t&&(n.headers=n.headers.append("X-CSRF-Token",t)),n},e.prototype.getQueryString=function(e){return void 0===e&&(e=null),e?Object.keys(e).reduce(function(t,n){return t.push(n+"="+encodeURIComponent(e[n])),t},[]).join("&"):""},e.prototype.getUrl=function(e,t,n){return void 0===t&&(t=null),void 0===n&&(n=!1),e.startsWith("/")&&(e=e.substr(1,e.length-1)),this.url+(n?"v2/":"v1/")+e+"?"+this.getQueryString(t)},e.prototype.processConnectionError=function(e){return Lf(Hp(e))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(yp))}}),e}();function Wp(e){var t=document.createElement("textarea");t.style.position="fixed",t.style.left="0",t.style.top="0",t.style.opacity="0",t.value=e,document.body.appendChild(t),t.focus(),t.select(),document.execCommand("copy"),document.body.removeChild(t)}var Vp=function(){return function(){}}();function Up(e){var t;try{t=new URL(e)}catch(i){}if(!t||!t.protocol||"skycoin:"!==t.protocol.toLowerCase()||!t.pathname)return null;var n=new Vp;return n.address=t.pathname,n.coins=t.searchParams.get("amount"),n.hours=t.searchParams.get("hours"),n.message=t.searchParams.get("message"),n}var zp={otcEnabled:!1,maxHardwareWalletAddresses:1,maxAddressesGap:20,priceApiId:"sky-skycoin",uriSpecificatioPrefix:"skycoin",mediumModalWidth:"566px",urlForHwWalletVersionChecking:"https://version.skycoin.com/skywallet/version.txt",hwWalletDownloadUrlAndPrefix:"https://downloads.skycoin.com/skywallet/skywallet-firmware-v",hwWalletDaemonDownloadUrl:"https://www.skycoin.com/downloads/",urlForVersionChecking:"https://version.skycoin.com/skycoin/version.txt",walletDownloadUrl:"https://www.skycoin.com/downloads/",languages:[{code:"en",name:"English",iconName:"en.png"},{code:"zh",name:"\u4e2d\u6587",iconName:"zh.png"},{code:"es",name:"Espa\xf1ol",iconName:"es.png"}],defaultLanguage:"en"},qp=function(){function e(e,t){this.apiService=e,this.http=t,this.csrfDisabledInternal=!1,this.fullCoinNameInternal=" ",this.coinNameInternal=" ",this.hoursNameInternal=" ",this.hoursNameSingularInternal=" ",this.explorerUrlInternal=" ",this.currentMaxDecimalsInternal=6,this.burnRateInternal=new Yf.BigNumber(2),this.updateAvailableInternal=!1,this.lastestVersionInternal="",this.uriSpecificatioPrefixInternal=""}return Object.defineProperty(e.prototype,"csrfDisabled",{get:function(){return this.csrfDisabledInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"nodeVersion",{get:function(){return this.nodeVersionInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"fullCoinName",{get:function(){return this.fullCoinNameInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"coinName",{get:function(){return this.coinNameInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hoursName",{get:function(){return this.hoursNameInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hoursNameSingular",{get:function(){return this.hoursNameSingularInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"explorerUrl",{get:function(){return this.explorerUrlInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentMaxDecimals",{get:function(){return this.currentMaxDecimalsInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"burnRate",{get:function(){return this.burnRateInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"updateAvailable",{get:function(){return this.updateAvailableInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"lastestVersion",{get:function(){return this.lastestVersionInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"uriSpecificatioPrefix",{get:function(){return this.uriSpecificatioPrefixInternal},enumerable:!1,configurable:!0}),e.prototype.UpdateData=function(){var e=this;this.apiService.get("health").subscribe(function(t){e.nodeVersionInternal=t.version.version,e.burnRateInternal=new Yf.BigNumber(t.user_verify_transaction.burn_factor),e.currentMaxDecimalsInternal=t.user_verify_transaction.max_decimals,e.detectUpdateAvailable(),e.fullCoinNameInternal=t.fiber.display_name,e.coinNameInternal=t.fiber.ticker,e.hoursNameInternal=t.fiber.coin_hours_display_name,e.hoursNameSingularInternal=t.fiber.coin_hours_display_name_singular,e.explorerUrlInternal=t.fiber.explorer_url,e.uriSpecificatioPrefixInternal=t.fiber.qr_uri_prefix,e.explorerUrlInternal.endsWith("/")&&(e.explorerUrlInternal=e.explorerUrlInternal.substr(0,e.explorerUrl.length-1)),t.csrf_enabled||(e.csrfDisabledInternal=!0)},function(){return Np(2)})},e.prototype.detectUpdateAvailable=function(){var e=this;zp.urlForVersionChecking&&this.http.get(zp.urlForVersionChecking,{responseType:"text"}).pipe(gf(function(e){return e.pipe(Of(3e4))})).subscribe(function(t){e.lastestVersionInternal=t.trim(),e.lastestVersionInternal.startsWith("v")&&(e.lastestVersionInternal=e.lastestVersionInternal.substr(1)),e.updateAvailableInternal=function(e,t){for(var n=t.split("."),i=e.split("-"),r=i[0].split("."),a=0;a<3;a++){var o=Number(n[a]),s=Number(r[a]);if(o>s)return!0;if(o2&&void 0!==arguments[2]?arguments[2]:kf;return function(i){var r=Mf(e),a=r?+e-n.now():Math.abs(e);return i.lift(new Zp(a,r,t,n))}}var Zp=function(){function e(t,n,i,r){v(this,e),this.waitFor=t,this.absoluteTimeout=n,this.withObservable=i,this.scheduler=r}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new Qp(e,this.absoluteTimeout,this.waitFor,this.withObservable,this.scheduler))}}]),e}(),Qp=function(e){_(n,e);var t=w(n);function n(e,i,r,a,o){var s;return v(this,n),(s=t.call(this,e)).absoluteTimeout=i,s.waitFor=r,s.withObservable=a,s.scheduler=o,s.action=null,s.scheduleTimeout(),s}return g(n,[{key:"scheduleTimeout",value:function(){var e=this.action;e?this.action=e.schedule(this,this.waitFor):this.add(this.action=this.scheduler.schedule(n.dispatchTimeout,this.waitFor,this))}},{key:"_next",value:function(e){this.absoluteTimeout||this.scheduleTimeout(),r(i(n.prototype),"_next",this).call(this,e)}},{key:"_unsubscribe",value:function(){this.action=null,this.scheduler=null,this.withObservable=null}}],[{key:"dispatchTimeout",value:function(e){var t=e.withObservable;e._unsubscribeAndRecycle(),e.add(te(e,t))}}]),n}(ne);function Xp(e){return null!=e&&"false"!=="".concat(e)}function $p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return em(e)?Number(e):t}function em(e){return!isNaN(parseFloat(e))&&!isNaN(Number(e))}function tm(e){return Array.isArray(e)?e:[e]}function nm(e){return null==e?"":"string"==typeof e?e:"".concat(e,"px")}function im(e){return e instanceof ju?e.nativeElement:e}function rm(e,t,n,i){return C(n)&&(i=n,n=void 0),i?rm(e,t,n).pipe(ie(function(e){return M(e)?i.apply(void 0,d(e)):i(e)})):new N(function(i){am(e,t,function(e){i.next(arguments.length>1?Array.prototype.slice.call(arguments):e)},i,n)})}function am(e,t,n,i,r){var a;if(function(e){return e&&"function"==typeof e.addEventListener&&"function"==typeof e.removeEventListener}(e)){var o=e;e.addEventListener(t,n,r),a=function(){return o.removeEventListener(t,n,r)}}else if(function(e){return e&&"function"==typeof e.on&&"function"==typeof e.off}(e)){var s=e;e.on(t,n),a=function(){return s.off(t,n)}}else if(function(e){return e&&"function"==typeof e.addListener&&"function"==typeof e.removeListener}(e)){var u=e;e.addListener(t,n),a=function(){return u.removeListener(t,n)}}else{if(!e||!e.length)throw new TypeError("Invalid event target");for(var l=0,c=e.length;l2&&void 0!==arguments[2]?arguments[2]:0;return null!==a&&a>0?r(i(n.prototype),"requestAsyncId",this).call(this,e,t,a):(e.actions.push(this),e.scheduled||(e.scheduled=um(e.flush.bind(e,null))))}},{key:"recycleAsyncId",value:function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(null!==a&&a>0||null===a&&this.delay>0)return r(i(n.prototype),"recycleAsyncId",this).call(this,e,t,a);0===e.actions.length&&(lm(t),e.scheduled=void 0)}}]),n}(yf),dm=new(function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"flush",value:function(e){this.active=!0,this.scheduled=void 0;var t,n=this.actions,i=-1,r=n.length;e=e||n.shift();do{if(t=e.execute(e.state,e.delay))break}while(++i=0}function _m(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,i=-1;return vm(t)?i=Number(t)<1?1:Number(t):G(t)&&(n=t),G(n)||(n=kf),new N(function(t){var r=vm(e)?e:+e-n.now();return n.schedule(ym,r,{index:0,period:i,subscriber:t})})}function ym(e){var t=e.index,n=e.period,i=e.subscriber;if(i.next(t),!i.closed){if(-1===n)return i.complete();e.index=t+1,this.schedule(e,n)}}function bm(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:kf;return pm(function(){return _m(e,t)})}function wm(e){return function(t){return t.lift(new km(e))}}var km=function(){function e(t){v(this,e),this.notifier=t}return g(e,[{key:"call",value:function(e,t){var n=new Mm(e),i=te(n,this.notifier);return i&&!n.seenValue?(n.add(i),t.subscribe(n)):n}}]),e}(),Mm=function(e){_(n,e);var t=w(n);function n(e){var i;return v(this,n),(i=t.call(this,e)).seenValue=!1,i}return g(n,[{key:"notifyNext",value:function(e,t,n,i,r){this.seenValue=!0,this.complete()}},{key:"notifyComplete",value:function(){}}]),n}(ne);function Sm(){return he(1)}function Cm(){return Sm()(xf.apply(void 0,arguments))}function xm(){for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:0;return t>0?r(i(n.prototype),"schedule",this).call(this,e,t):(this.delay=t,this.state=e,this.scheduler.flush(this),this)}},{key:"execute",value:function(e,t){return t>0||this.closed?r(i(n.prototype),"execute",this).call(this,e,t):this._execute(e,t)}},{key:"requestAsyncId",value:function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return null!==a&&a>0||null===a&&this.delay>0?r(i(n.prototype),"requestAsyncId",this).call(this,e,t,a):e.flush(this)}}]),n}(yf),Pm=new(function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return n}(wf))(Em),Am=function(e){_(n,e);var t=w(n);function n(e,i){var r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return v(this,n),(r=t.call(this,e)).scheduler=i,r.delay=a,r}return g(n,[{key:"scheduleMessage",value:function(e){this.destination.add(this.scheduler.schedule(n.dispatch,this.delay,new Ym(e,this.destination)))}},{key:"_next",value:function(e){this.scheduleMessage(Df.createNext(e))}},{key:"_error",value:function(e){this.scheduleMessage(Df.createError(e)),this.unsubscribe()}},{key:"_complete",value:function(){this.scheduleMessage(Df.createComplete()),this.unsubscribe()}}],[{key:"dispatch",value:function(e){e.notification.observe(e.destination),this.unsubscribe()}}]),n}(Y),Ym=function e(t,n){v(this,e),this.notification=t,this.destination=n},Im=function(e){_(n,e);var t=w(n);function n(){var e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Number.POSITIVE_INFINITY,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.POSITIVE_INFINITY,a=arguments.length>2?arguments[2]:void 0;return v(this,n),(e=t.call(this)).scheduler=a,e._events=[],e._infiniteTimeWindow=!1,e._bufferSize=i<1?1:i,e._windowTime=r<1?1:r,r===Number.POSITIVE_INFINITY?(e._infiniteTimeWindow=!0,e.next=e.nextInfiniteTimeWindow):e.next=e.nextTimeWindow,e}return g(n,[{key:"nextInfiniteTimeWindow",value:function(e){var t=this._events;t.push(e),t.length>this._bufferSize&&t.shift(),r(i(n.prototype),"next",this).call(this,e)}},{key:"nextTimeWindow",value:function(e){this._events.push(new Rm(this._getNow(),e)),this._trimBufferThenGetEvents(),r(i(n.prototype),"next",this).call(this,e)}},{key:"_subscribe",value:function(e){var t,n=this._infiniteTimeWindow,i=n?this._events:this._trimBufferThenGetEvents(),r=this.scheduler,a=i.length;if(this.closed)throw new W;if(this.isStopped||this.hasError?t=L.EMPTY:(this.observers.push(e),t=new V(this,e)),r&&e.add(e=new Am(e,r)),n)for(var o=0;ot&&(a=Math.max(a,r-t)),a>0&&i.splice(0,a),i}}]),n}(z),Rm=function e(t,n){v(this,e),this.time=t,this.value=n};try{Tm="undefined"!=typeof Intl&&Intl.v8BreakIterator}catch(aN){Tm=!1}var Fm,Hm,jm,Nm=function(){var e=function e(t){v(this,e),this._platformId=t,this.isBrowser=this._platformId?"browser"===this._platformId:"object"==typeof document&&!!document,this.EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent),this.TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent),this.BLINK=this.isBrowser&&!(!window.chrome&&!Tm)&&"undefined"!=typeof CSS&&!this.EDGE&&!this.TRIDENT,this.WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT,this.IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window),this.FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent),this.ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT,this.SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT};return e.\u0275fac=function(t){return new(t||e)(Gi(Cc))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Cc))},token:e,providedIn:"root"}),e}(),Bm=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)}}),e}(),Wm=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function Vm(){if(Fm)return Fm;if("object"!=typeof document||!document)return Fm=new Set(Wm);var e=document.createElement("input");return Fm=new Set(Wm.filter(function(t){return e.setAttribute("type",t),e.type===t}))}function Um(e){return function(){if(null==Hm&&"undefined"!=typeof window)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){return Hm=!0}}))}finally{Hm=Hm||!1}return Hm}()?e:!!e.capture}function zm(e){if(function(){if(null==jm){var e="undefined"!=typeof document?document.head:null;jm=!(!e||!e.createShadowRoot&&!e.attachShadow)}return jm}()){var t=e.getRootNode?e.getRootNode():null;if("undefined"!=typeof ShadowRoot&&ShadowRoot&&t instanceof ShadowRoot)return t}return null}var qm=new Si("cdk-dir-doc",{providedIn:"root",factory:function(){return Ji(Md)}}),Gm=function(){var e=function(){function e(t){if(v(this,e),this.value="ltr",this.change=new Zl,t){var n=(t.body?t.body.dir:null)||(t.documentElement?t.documentElement.dir:null);this.value="ltr"===n||"rtl"===n?n:"ltr"}}return g(e,[{key:"ngOnDestroy",value:function(){this.change.complete()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(qm,8))},e.\u0275prov=Ee({factory:function(){return new e(Gi(qm,8))},token:e,providedIn:"root"}),e}(),Km=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)}}),e}(),Jm=function(){function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=arguments.length>1?arguments[1]:void 0,r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];v(this,e),this._multiple=n,this._emitChanges=r,this._selection=new Set,this._deselectedToEmit=[],this._selectedToEmit=[],this.changed=new z,i&&i.length&&(n?i.forEach(function(e){return t._markSelected(e)}):this._markSelected(i[0]),this._selectedToEmit.length=0)}return g(e,[{key:"select",value:function(){for(var e=this,t=arguments.length,n=new Array(t),i=0;i0&&void 0!==arguments[0]?arguments[0]:20;return this._platform.isBrowser?new N(function(n){e._globalSubscription||e._addGlobalListener();var i=t>0?e._scrolled.pipe(bm(t)).subscribe(n):e._scrolled.subscribe(n);return e._scrolledCount++,function(){i.unsubscribe(),e._scrolledCount--,e._scrolledCount||e._removeGlobalListener()}}):xf()}},{key:"ngOnDestroy",value:function(){var e=this;this._removeGlobalListener(),this.scrollContainers.forEach(function(t,n){return e.deregister(n)}),this._scrolled.complete()}},{key:"ancestorScrolled",value:function(e,t){var n=this.getAncestorScrollContainers(e);return this.scrolled(t).pipe(Nf(function(e){return!e||n.indexOf(e)>-1}))}},{key:"getAncestorScrollContainers",value:function(e){var t=this,n=[];return this.scrollContainers.forEach(function(i,r){t._scrollableContainsElement(r,e)&&n.push(r)}),n}},{key:"_getWindow",value:function(){return this._document.defaultView||window}},{key:"_scrollableContainsElement",value:function(e,t){var n=t.nativeElement,i=e.getElementRef().nativeElement;do{if(n==i)return!0}while(n=n.parentElement);return!1}},{key:"_addGlobalListener",value:function(){var e=this;this._globalSubscription=this._ngZone.runOutsideAngular(function(){return rm(e._getWindow().document,"scroll").subscribe(function(){return e._scrolled.next()})})}},{key:"_removeGlobalListener",value:function(){this._globalSubscription&&(this._globalSubscription.unsubscribe(),this._globalSubscription=null)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Nc),Gi(Nm),Gi(Md,8))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Nc),Gi(Nm),Gi(Md,8))},token:e,providedIn:"root"}),e}(),Qm=function(){var e=function(){function e(t,n,i){var r=this;v(this,e),this._platform=t,this._change=new z,this._changeListener=function(e){r._change.next(e)},this._document=i,n.runOutsideAngular(function(){if(t.isBrowser){var e=r._getWindow();e.addEventListener("resize",r._changeListener),e.addEventListener("orientationchange",r._changeListener)}r.change().subscribe(function(){return r._updateViewportSize()})})}return g(e,[{key:"ngOnDestroy",value:function(){if(this._platform.isBrowser){var e=this._getWindow();e.removeEventListener("resize",this._changeListener),e.removeEventListener("orientationchange",this._changeListener)}this._change.complete()}},{key:"getViewportSize",value:function(){this._viewportSize||this._updateViewportSize();var e={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),e}},{key:"getViewportRect",value:function(){var e=this.getViewportScrollPosition(),t=this.getViewportSize(),n=t.width,i=t.height;return{top:e.top,left:e.left,bottom:e.top+i,right:e.left+n,height:i,width:n}}},{key:"getViewportScrollPosition",value:function(){if(!this._platform.isBrowser)return{top:0,left:0};var e=this._document,t=this._getWindow(),n=e.documentElement,i=n.getBoundingClientRect();return{top:-i.top||e.body.scrollTop||t.scrollY||n.scrollTop||0,left:-i.left||e.body.scrollLeft||t.scrollX||n.scrollLeft||0}}},{key:"change",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:20;return e>0?this._change.pipe(bm(e)):this._change}},{key:"_getWindow",value:function(){return this._document.defaultView||window}},{key:"_updateViewportSize",value:function(){var e=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:e.innerWidth,height:e.innerHeight}:{width:0,height:0}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Nm),Gi(Nc),Gi(Md,8))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Nm),Gi(Nc),Gi(Md,8))},token:e,providedIn:"root"}),e}(),Xm=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)}}),e}(),$m=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[Km,Bm,Xm],Km,Xm]}),e}(),eg=function(){function e(){v(this,e)}return g(e,[{key:"attach",value:function(e){return this._attachedHost=e,e.attach(this)}},{key:"detach",value:function(){var e=this._attachedHost;null!=e&&(this._attachedHost=null,e.detach())}},{key:"setAttachedHost",value:function(e){this._attachedHost=e}},{key:"isAttached",get:function(){return null!=this._attachedHost}}]),e}(),tg=function(e){_(n,e);var t=w(n);function n(e,i,r,a){var o;return v(this,n),(o=t.call(this)).component=e,o.viewContainerRef=i,o.injector=r,o.componentFactoryResolver=a,o}return n}(eg),ng=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this)).templateRef=e,a.viewContainerRef=i,a.context=r,a}return g(n,[{key:"attach",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.context;return this.context=t,r(i(n.prototype),"attach",this).call(this,e)}},{key:"detach",value:function(){return this.context=void 0,r(i(n.prototype),"detach",this).call(this)}},{key:"origin",get:function(){return this.templateRef.elementRef}}]),n}(eg),ig=function(e){_(n,e);var t=w(n);function n(e){var i;return v(this,n),(i=t.call(this)).element=e instanceof ju?e.nativeElement:e,i}return n}(eg),rg=function(){function e(){v(this,e),this._isDisposed=!1,this.attachDomPortal=null}return g(e,[{key:"hasAttached",value:function(){return!!this._attachedPortal}},{key:"attach",value:function(e){return e instanceof tg?(this._attachedPortal=e,this.attachComponentPortal(e)):e instanceof ng?(this._attachedPortal=e,this.attachTemplatePortal(e)):this.attachDomPortal&&e instanceof ig?(this._attachedPortal=e,this.attachDomPortal(e)):void 0}},{key:"detach",value:function(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()}},{key:"dispose",value:function(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0}},{key:"setDisposeFn",value:function(e){this._disposeFn=e}},{key:"_invokeDisposeFn",value:function(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)}}]),e}(),ag=function(e){_(n,e);var t=w(n);function n(e,o,s,u,l){var c,d;return v(this,n),(d=t.call(this)).outletElement=e,d._componentFactoryResolver=o,d._appRef=s,d._defaultInjector=u,d.attachDomPortal=function(e){var t=e.element,o=d._document.createComment("dom-portal");t.parentNode.insertBefore(o,t),d.outletElement.appendChild(t),r((c=a(d),i(n.prototype)),"setDisposeFn",c).call(c,function(){o.parentNode&&o.parentNode.replaceChild(t,o)})},d._document=l,d}return g(n,[{key:"attachComponentPortal",value:function(e){var t,n=this,i=(e.componentFactoryResolver||this._componentFactoryResolver).resolveComponentFactory(e.component);return e.viewContainerRef?(t=e.viewContainerRef.createComponent(i,e.viewContainerRef.length,e.injector||e.viewContainerRef.injector),this.setDisposeFn(function(){return t.destroy()})):(t=i.create(e.injector||this._defaultInjector),this._appRef.attachView(t.hostView),this.setDisposeFn(function(){n._appRef.detachView(t.hostView),t.destroy()})),this.outletElement.appendChild(this._getComponentRootNode(t)),t}},{key:"attachTemplatePortal",value:function(e){var t=this,n=e.viewContainerRef,i=n.createEmbeddedView(e.templateRef,e.context);return i.rootNodes.forEach(function(e){return t.outletElement.appendChild(e)}),i.detectChanges(),this.setDisposeFn(function(){var e=n.indexOf(i);-1!==e&&n.remove(e)}),i}},{key:"dispose",value:function(){r(i(n.prototype),"dispose",this).call(this),null!=this.outletElement.parentNode&&this.outletElement.parentNode.removeChild(this.outletElement)}},{key:"_getComponentRootNode",value:function(e){return e.hostView.rootNodes[0]}}]),n}(rg),og=function(){var e=function(e){_(n,e);var t=w(n);function n(e,o,s){var u,l;return v(this,n),(l=t.call(this))._componentFactoryResolver=e,l._viewContainerRef=o,l._isInitialized=!1,l.attached=new Zl,l.attachDomPortal=function(e){var t=e.element,o=l._document.createComment("dom-portal");e.setAttachedHost(a(l)),t.parentNode.insertBefore(o,t),l._getRootNode().appendChild(t),r((u=a(l),i(n.prototype)),"setDisposeFn",u).call(u,function(){o.parentNode&&o.parentNode.replaceChild(t,o)})},l._document=s,l}return g(n,[{key:"ngOnInit",value:function(){this._isInitialized=!0}},{key:"ngOnDestroy",value:function(){r(i(n.prototype),"dispose",this).call(this),this._attachedPortal=null,this._attachedRef=null}},{key:"attachComponentPortal",value:function(e){e.setAttachedHost(this);var t=null!=e.viewContainerRef?e.viewContainerRef:this._viewContainerRef,a=(e.componentFactoryResolver||this._componentFactoryResolver).resolveComponentFactory(e.component),o=t.createComponent(a,t.length,e.injector||t.injector);return t!==this._viewContainerRef&&this._getRootNode().appendChild(o.hostView.rootNodes[0]),r(i(n.prototype),"setDisposeFn",this).call(this,function(){return o.destroy()}),this._attachedPortal=e,this._attachedRef=o,this.attached.emit(o),o}},{key:"attachTemplatePortal",value:function(e){var t=this;e.setAttachedHost(this);var a=this._viewContainerRef.createEmbeddedView(e.templateRef,e.context);return r(i(n.prototype),"setDisposeFn",this).call(this,function(){return t._viewContainerRef.clear()}),this._attachedPortal=e,this._attachedRef=a,this.attached.emit(a),a}},{key:"_getRootNode",value:function(){var e=this._viewContainerRef.element.nativeElement;return e.nodeType===e.ELEMENT_NODE?e:e.parentNode}},{key:"portal",get:function(){return this._attachedPortal},set:function(e){(!this.hasAttached()||e||this._isInitialized)&&(this.hasAttached()&&r(i(n.prototype),"detach",this).call(this),e&&r(i(n.prototype),"attach",this).call(this,e),this._attachedPortal=e)}},{key:"attachedRef",get:function(){return this._attachedRef}}]),n}(rg);return e.\u0275fac=function(t){return new(t||e)(ms(Iu),ms(wl),ms(Md))},e.\u0275dir=gt({type:e,selectors:[["","cdkPortalOutlet",""]],inputs:{portal:["cdkPortalOutlet","portal"]},outputs:{attached:"attached"},exportAs:["cdkPortalOutlet"],features:[Jo]}),e}(),sg=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)}}),e}(),ug=function(){function e(t,n){v(this,e),this.predicate=t,this.inclusive=n}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new lg(e,this.predicate,this.inclusive))}}]),e}(),lg=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this,e)).predicate=i,a.inclusive=r,a.index=0,a}return g(n,[{key:"_next",value:function(e){var t,n=this.destination;try{t=this.predicate(e,this.index++)}catch(i){return void n.error(i)}this.nextOrComplete(e,t)}},{key:"nextOrComplete",value:function(e,t){var n=this.destination;Boolean(t)?n.next(e):(this.inclusive&&n.next(e),n.complete())}}]),n}(Y),cg=27,dg=38,hg=40;function fg(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;it.height||e.scrollWidth>t.width}}]),e}(),mg=function(){function e(t,n,i,r){var a=this;v(this,e),this._scrollDispatcher=t,this._ngZone=n,this._viewportRuler=i,this._config=r,this._scrollSubscription=null,this._detach=function(){a.disable(),a._overlayRef.hasAttached()&&a._ngZone.run(function(){return a._overlayRef.detach()})}}return g(e,[{key:"attach",value:function(e){this._overlayRef=e}},{key:"enable",value:function(){var e=this;if(!this._scrollSubscription){var t=this._scrollDispatcher.scrolled(0);this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=t.subscribe(function(){var t=e._viewportRuler.getViewportScrollPosition().top;Math.abs(t-e._initialScrollPosition)>e._config.threshold?e._detach():e._overlayRef.updatePosition()})):this._scrollSubscription=t.subscribe(this._detach)}}},{key:"disable",value:function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}},{key:"detach",value:function(){this.disable(),this._overlayRef=null}}]),e}(),gg=function(){function e(){v(this,e)}return g(e,[{key:"enable",value:function(){}},{key:"disable",value:function(){}},{key:"attach",value:function(){}}]),e}();function vg(e,t){return t.some(function(t){return e.bottomt.bottom||e.rightt.right})}function _g(e,t){return t.some(function(t){return e.topt.bottom||e.leftt.right})}var yg=function(){function e(t,n,i,r){v(this,e),this._scrollDispatcher=t,this._viewportRuler=n,this._ngZone=i,this._config=r,this._scrollSubscription=null}return g(e,[{key:"attach",value:function(e){this._overlayRef=e}},{key:"enable",value:function(){var e=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(this._config?this._config.scrollThrottle:0).subscribe(function(){if(e._overlayRef.updatePosition(),e._config&&e._config.autoClose){var t=e._overlayRef.overlayElement.getBoundingClientRect(),n=e._viewportRuler.getViewportSize(),i=n.width,r=n.height;vg(t,[{width:i,height:r,bottom:r,right:i,top:0,left:0}])&&(e.disable(),e._ngZone.run(function(){return e._overlayRef.detach()}))}}))}},{key:"disable",value:function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}},{key:"detach",value:function(){this.disable(),this._overlayRef=null}}]),e}(),bg=function(){var e=function e(t,n,i,r){var a=this;v(this,e),this._scrollDispatcher=t,this._viewportRuler=n,this._ngZone=i,this.noop=function(){return new gg},this.close=function(e){return new mg(a._scrollDispatcher,a._ngZone,a._viewportRuler,e)},this.block=function(){return new pg(a._viewportRuler,a._document)},this.reposition=function(e){return new yg(a._scrollDispatcher,a._viewportRuler,a._ngZone,e)},this._document=r};return e.\u0275fac=function(t){return new(t||e)(Gi(Zm),Gi(Qm),Gi(Nc),Gi(Md))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Zm),Gi(Qm),Gi(Nc),Gi(Md))},token:e,providedIn:"root"}),e}(),wg=function e(t){if(v(this,e),this.scrollStrategy=new gg,this.panelClass="",this.hasBackdrop=!1,this.backdropClass="cdk-overlay-dark-backdrop",this.disposeOnNavigation=!1,t)for(var n=0,i=Object.keys(t);n-1&&this._attachedOverlays.splice(t,1),0===this._attachedOverlays.length&&this.detach()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Md))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Md))},token:e,providedIn:"root"}),e}(),Cg=function(){var e=function(e){_(n,e);var t=w(n);function n(e){var i;return v(this,n),(i=t.call(this,e))._keydownListener=function(e){for(var t=i._attachedOverlays,n=t.length-1;n>-1;n--)if(t[n]._keydownEvents.observers.length>0){t[n]._keydownEvents.next(e);break}},i}return g(n,[{key:"add",value:function(e){r(i(n.prototype),"add",this).call(this,e),this._isAttached||(this._document.body.addEventListener("keydown",this._keydownListener),this._isAttached=!0)}},{key:"detach",value:function(){this._isAttached&&(this._document.body.removeEventListener("keydown",this._keydownListener),this._isAttached=!1)}}]),n}(Sg);return e.\u0275fac=function(t){return new(t||e)(Gi(Md))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Md))},token:e,providedIn:"root"}),e}(),xg=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,e))._platform=i,r._cursorStyleIsSet=!1,r._clickListener=function(e){for(var t=e.composedPath?e.composedPath()[0]:e.target,n=r._attachedOverlays.slice(),i=n.length-1;i>-1;i--){var a=n[i];if(!(a._outsidePointerEvents.observers.length<1)&&a.hasAttached()){if(a.overlayElement.contains(t))break;a._outsidePointerEvents.next(e)}}},r}return g(n,[{key:"add",value:function(e){r(i(n.prototype),"add",this).call(this,e),this._isAttached||(this._document.body.addEventListener("click",this._clickListener,!0),this._document.body.addEventListener("contextmenu",this._clickListener,!0),this._platform.IOS&&!this._cursorStyleIsSet&&(this._cursorOriginalValue=this._document.body.style.cursor,this._document.body.style.cursor="pointer",this._cursorStyleIsSet=!0),this._isAttached=!0)}},{key:"detach",value:function(){this._isAttached&&(this._document.body.removeEventListener("click",this._clickListener,!0),this._document.body.removeEventListener("contextmenu",this._clickListener,!0),this._platform.IOS&&this._cursorStyleIsSet&&(this._document.body.style.cursor=this._cursorOriginalValue,this._cursorStyleIsSet=!1),this._isAttached=!1)}}]),n}(Sg);return e.\u0275fac=function(t){return new(t||e)(Gi(Md),Gi(Nm))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Md),Gi(Nm))},token:e,providedIn:"root"}),e}(),Lg=!("undefined"==typeof window||!window||!window.__karma__&&!window.jasmine),Tg=function(){var e=function(){function e(t,n){v(this,e),this._platform=n,this._document=t}return g(e,[{key:"ngOnDestroy",value:function(){var e=this._containerElement;e&&e.parentNode&&e.parentNode.removeChild(e)}},{key:"getContainerElement",value:function(){return this._containerElement||this._createContainer(),this._containerElement}},{key:"_createContainer",value:function(){var e="cdk-overlay-container";if(this._platform.isBrowser||Lg)for(var t=this._document.querySelectorAll(".".concat(e,'[platform="server"], ')+".".concat(e,'[platform="test"]')),n=0;np&&(p=v,f=g)}}catch(_){m.e(_)}finally{m.f()}return this._isPushed=!1,void this._applyPosition(f.position,f.origin)}if(this._canPush)return this._isPushed=!0,void this._applyPosition(e.position,e.originPoint);this._applyPosition(e.position,e.originPoint)}}},{key:"detach",value:function(){this._clearPanelClasses(),this._lastPosition=null,this._previousPushAmount=null,this._resizeSubscription.unsubscribe()}},{key:"dispose",value:function(){this._isDisposed||(this._boundingBox&&Ag(this._boundingBox.style,{top:"",left:"",right:"",bottom:"",height:"",width:"",alignItems:"",justifyContent:""}),this._pane&&this._resetOverlayElementStyles(),this._overlayRef&&this._overlayRef.hostElement.classList.remove(Og),this.detach(),this._positionChanges.complete(),this._overlayRef=this._boundingBox=null,this._isDisposed=!0)}},{key:"reapplyLastPosition",value:function(){if(!this._isDisposed&&(!this._platform||this._platform.isBrowser)){this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._viewportRect=this._getNarrowedViewportRect();var e=this._lastPosition||this._preferredPositions[0],t=this._getOriginPoint(this._originRect,e);this._applyPosition(e,t)}}},{key:"withScrollableContainers",value:function(e){return this._scrollables=e,this}},{key:"withPositions",value:function(e){return this._preferredPositions=e,-1===e.indexOf(this._lastPosition)&&(this._lastPosition=null),this._validatePositions(),this}},{key:"withViewportMargin",value:function(e){return this._viewportMargin=e,this}},{key:"withFlexibleDimensions",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._hasFlexibleDimensions=e,this}},{key:"withGrowAfterOpen",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._growAfterOpen=e,this}},{key:"withPush",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._canPush=e,this}},{key:"withLockedPosition",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._positionLocked=e,this}},{key:"setOrigin",value:function(e){return this._origin=e,this}},{key:"withDefaultOffsetX",value:function(e){return this._offsetX=e,this}},{key:"withDefaultOffsetY",value:function(e){return this._offsetY=e,this}},{key:"withTransformOriginOn",value:function(e){return this._transformOriginSelector=e,this}},{key:"_getOriginPoint",value:function(e,t){var n;if("center"==t.originX)n=e.left+e.width/2;else{var i=this._isRtl()?e.right:e.left,r=this._isRtl()?e.left:e.right;n="start"==t.originX?i:r}return{x:n,y:"center"==t.originY?e.top+e.height/2:"top"==t.originY?e.top:e.bottom}}},{key:"_getOverlayPoint",value:function(e,t,n){var i;return i="center"==n.overlayX?-t.width/2:"start"===n.overlayX?this._isRtl()?-t.width:0:this._isRtl()?0:-t.width,{x:e.x+i,y:e.y+("center"==n.overlayY?-t.height/2:"top"==n.overlayY?0:-t.height)}}},{key:"_getOverlayFit",value:function(e,t,n,i){var r=e.x,a=e.y,o=this._getOffset(i,"x"),s=this._getOffset(i,"y");o&&(r+=o),s&&(a+=s);var u=0-a,l=a+t.height-n.height,c=this._subtractOverflows(t.width,0-r,r+t.width-n.width),d=this._subtractOverflows(t.height,u,l),h=c*d;return{visibleArea:h,isCompletelyWithinViewport:t.width*t.height===h,fitsInViewportVertically:d===t.height,fitsInViewportHorizontally:c==t.width}}},{key:"_canFitWithFlexibleDimensions",value:function(e,t,n){if(this._hasFlexibleDimensions){var i=n.bottom-t.y,r=n.right-t.x,a=Yg(this._overlayRef.getConfig().minHeight),o=Yg(this._overlayRef.getConfig().minWidth);return(e.fitsInViewportVertically||null!=a&&a<=i)&&(e.fitsInViewportHorizontally||null!=o&&o<=r)}return!1}},{key:"_pushOverlayOnScreen",value:function(e,t,n){if(this._previousPushAmount&&this._positionLocked)return{x:e.x+this._previousPushAmount.x,y:e.y+this._previousPushAmount.y};var i,r,a=this._viewportRect,o=Math.max(e.x+t.width-a.width,0),s=Math.max(e.y+t.height-a.height,0),u=Math.max(a.top-n.top-e.y,0),l=Math.max(a.left-n.left-e.x,0);return this._previousPushAmount={x:i=t.width<=a.width?l||-o:e.xd&&!this._isInitialRender&&!this._growAfterOpen&&(i=e.y-d/2)}if("end"===t.overlayX&&!l||"start"===t.overlayX&&l)s=u.width-e.x+this._viewportMargin,a=e.x-this._viewportMargin;else if("start"===t.overlayX&&!l||"end"===t.overlayX&&l)o=e.x,a=u.right-e.x;else{var h=Math.min(u.right-e.x+u.left,e.x),f=this._lastBoundingBoxSize.width;o=e.x-h,(a=2*h)>f&&!this._isInitialRender&&!this._growAfterOpen&&(o=e.x-f/2)}return{top:i,left:o,bottom:r,right:s,width:a,height:n}}},{key:"_setBoundingBoxStyles",value:function(e,t){var n=this._calculateBoundingBoxRect(e,t);this._isInitialRender||this._growAfterOpen||(n.height=Math.min(n.height,this._lastBoundingBoxSize.height),n.width=Math.min(n.width,this._lastBoundingBoxSize.width));var i={};if(this._hasExactPosition())i.top=i.left="0",i.bottom=i.right=i.maxHeight=i.maxWidth="",i.width=i.height="100%";else{var r=this._overlayRef.getConfig().maxHeight,a=this._overlayRef.getConfig().maxWidth;i.height=nm(n.height),i.top=nm(n.top),i.bottom=nm(n.bottom),i.width=nm(n.width),i.left=nm(n.left),i.right=nm(n.right),i.alignItems="center"===t.overlayX?"center":"end"===t.overlayX?"flex-end":"flex-start",i.justifyContent="center"===t.overlayY?"center":"bottom"===t.overlayY?"flex-end":"flex-start",r&&(i.maxHeight=nm(r)),a&&(i.maxWidth=nm(a))}this._lastBoundingBoxSize=n,Ag(this._boundingBox.style,i)}},{key:"_resetBoundingBoxStyles",value:function(){Ag(this._boundingBox.style,{top:"0",left:"0",right:"0",bottom:"0",height:"",width:"",alignItems:"",justifyContent:""})}},{key:"_resetOverlayElementStyles",value:function(){Ag(this._pane.style,{top:"",left:"",bottom:"",right:"",position:"",transform:""})}},{key:"_setOverlayElementStyles",value:function(e,t){var n={},i=this._hasExactPosition(),r=this._hasFlexibleDimensions,a=this._overlayRef.getConfig();if(i){var o=this._viewportRuler.getViewportScrollPosition();Ag(n,this._getExactOverlayY(t,e,o)),Ag(n,this._getExactOverlayX(t,e,o))}else n.position="static";var s="",u=this._getOffset(t,"x"),l=this._getOffset(t,"y");u&&(s+="translateX(".concat(u,"px) ")),l&&(s+="translateY(".concat(l,"px)")),n.transform=s.trim(),a.maxHeight&&(i?n.maxHeight=nm(a.maxHeight):r&&(n.maxHeight="")),a.maxWidth&&(i?n.maxWidth=nm(a.maxWidth):r&&(n.maxWidth="")),Ag(this._pane.style,n)}},{key:"_getExactOverlayY",value:function(e,t,n){var i={top:"",bottom:""},r=this._getOverlayPoint(t,this._overlayRect,e);this._isPushed&&(r=this._pushOverlayOnScreen(r,this._overlayRect,n));var a=this._overlayContainer.getContainerElement().getBoundingClientRect().top;return r.y-=a,"bottom"===e.overlayY?i.bottom="".concat(this._document.documentElement.clientHeight-(r.y+this._overlayRect.height),"px"):i.top=nm(r.y),i}},{key:"_getExactOverlayX",value:function(e,t,n){var i={left:"",right:""},r=this._getOverlayPoint(t,this._overlayRect,e);return this._isPushed&&(r=this._pushOverlayOnScreen(r,this._overlayRect,n)),"right"==(this._isRtl()?"end"===e.overlayX?"left":"right":"end"===e.overlayX?"right":"left")?i.right="".concat(this._document.documentElement.clientWidth-(r.x+this._overlayRect.width),"px"):i.left=nm(r.x),i}},{key:"_getScrollVisibility",value:function(){var e=this._getOriginRect(),t=this._pane.getBoundingClientRect(),n=this._scrollables.map(function(e){return e.getElementRef().nativeElement.getBoundingClientRect()});return{isOriginClipped:_g(e,n),isOriginOutsideView:vg(e,n),isOverlayClipped:_g(t,n),isOverlayOutsideView:vg(t,n)}}},{key:"_subtractOverflows",value:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i0&&void 0!==arguments[0]?arguments[0]:"";return this._bottomOffset="",this._topOffset=e,this._alignItems="flex-start",this}},{key:"left",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._rightOffset="",this._leftOffset=e,this._justifyContent="flex-start",this}},{key:"bottom",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._topOffset="",this._bottomOffset=e,this._alignItems="flex-end",this}},{key:"right",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._leftOffset="",this._rightOffset=e,this._justifyContent="flex-end",this}},{key:"width",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._overlayRef?this._overlayRef.updateSize({width:e}):this._width=e,this}},{key:"height",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._overlayRef?this._overlayRef.updateSize({height:e}):this._height=e,this}},{key:"centerHorizontally",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this.left(e),this._justifyContent="center",this}},{key:"centerVertically",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this.top(e),this._alignItems="center",this}},{key:"apply",value:function(){if(this._overlayRef&&this._overlayRef.hasAttached()){var e=this._overlayRef.overlayElement.style,t=this._overlayRef.hostElement.style,n=this._overlayRef.getConfig(),i=n.width,r=n.height,a=n.maxWidth,o=n.maxHeight,s=!("100%"!==i&&"100vw"!==i||a&&"100%"!==a&&"100vw"!==a),u=!("100%"!==r&&"100vh"!==r||o&&"100%"!==o&&"100vh"!==o);e.position=this._cssPosition,e.marginLeft=s?"0":this._leftOffset,e.marginTop=u?"0":this._topOffset,e.marginBottom=this._bottomOffset,e.marginRight=this._rightOffset,s?t.justifyContent="flex-start":"center"===this._justifyContent?t.justifyContent="center":"rtl"===this._overlayRef.getConfig().direction?"flex-start"===this._justifyContent?t.justifyContent="flex-end":"flex-end"===this._justifyContent&&(t.justifyContent="flex-start"):t.justifyContent=this._justifyContent,t.alignItems=u?"flex-start":this._alignItems}}},{key:"dispose",value:function(){if(!this._isDisposed&&this._overlayRef){var e=this._overlayRef.overlayElement.style,t=this._overlayRef.hostElement,n=t.style;t.classList.remove(Rg),n.justifyContent=n.alignItems=e.marginTop=e.marginBottom=e.marginLeft=e.marginRight=e.position="",this._overlayRef=null,this._isDisposed=!0}}}]),e}(),Hg=function(){var e=function(){function e(t,n,i,r){v(this,e),this._viewportRuler=t,this._document=n,this._platform=i,this._overlayContainer=r}return g(e,[{key:"global",value:function(){return new Fg}},{key:"connectedTo",value:function(e,t,n){return new Ig(t,n,e,this._viewportRuler,this._document,this._platform,this._overlayContainer)}},{key:"flexibleConnectedTo",value:function(e){return new Pg(e,this._viewportRuler,this._document,this._platform,this._overlayContainer)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Qm),Gi(Md),Gi(Nm),Gi(Tg))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Qm),Gi(Md),Gi(Nm),Gi(Tg))},token:e,providedIn:"root"}),e}(),jg=0,Ng=function(){var e=function(){function e(t,n,i,r,a,o,s,u,l,c,d){v(this,e),this.scrollStrategies=t,this._overlayContainer=n,this._componentFactoryResolver=i,this._positionBuilder=r,this._keyboardDispatcher=a,this._injector=o,this._ngZone=s,this._document=u,this._directionality=l,this._location=c,this._outsideClickDispatcher=d}return g(e,[{key:"create",value:function(e){var t=this._createHostElement(),n=this._createPaneElement(t),i=this._createPortalOutlet(n),r=new wg(e);return r.direction=r.direction||this._directionality.value,new Dg(i,t,n,r,this._ngZone,this._keyboardDispatcher,this._document,this._location,this._outsideClickDispatcher)}},{key:"position",value:function(){return this._positionBuilder}},{key:"_createPaneElement",value:function(e){var t=this._document.createElement("div");return t.id="cdk-overlay-".concat(jg++),t.classList.add("cdk-overlay-pane"),e.appendChild(t),t}},{key:"_createHostElement",value:function(){var e=this._document.createElement("div");return this._overlayContainer.getContainerElement().appendChild(e),e}},{key:"_createPortalOutlet",value:function(e){return this._appRef||(this._appRef=this._injector.get(ld)),new ag(e,this._componentFactoryResolver,this._appRef,this._injector,this._document)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(bg),Gi(Tg),Gi(Iu),Gi(Hg),Gi(Cg),Gi(Go),Gi(Nc),Gi(Md),Gi(Gm),Gi(Hd),Gi(xg))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),Bg=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],Wg=new Si("cdk-connected-overlay-scroll-strategy"),Vg=function(){var e=function e(t){v(this,e),this.elementRef=t};return e.\u0275fac=function(t){return new(t||e)(ms(ju))},e.\u0275dir=gt({type:e,selectors:[["","cdk-overlay-origin",""],["","overlay-origin",""],["","cdkOverlayOrigin",""]],exportAs:["cdkOverlayOrigin"]}),e}(),Ug=function(){var e=function(){function e(t,n,i,r,a){v(this,e),this._overlay=t,this._dir=a,this._hasBackdrop=!1,this._lockPosition=!1,this._growAfterOpen=!1,this._flexibleDimensions=!1,this._push=!1,this._backdropSubscription=L.EMPTY,this._attachSubscription=L.EMPTY,this._detachSubscription=L.EMPTY,this._positionSubscription=L.EMPTY,this.viewportMargin=0,this.open=!1,this.disableClose=!1,this.backdropClick=new Zl,this.positionChange=new Zl,this.attach=new Zl,this.detach=new Zl,this.overlayKeydown=new Zl,this.overlayOutsideClick=new Zl,this._templatePortal=new ng(n,i),this._scrollStrategyFactory=r,this.scrollStrategy=this._scrollStrategyFactory()}return g(e,[{key:"ngOnDestroy",value:function(){this._attachSubscription.unsubscribe(),this._detachSubscription.unsubscribe(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._overlayRef&&this._overlayRef.dispose()}},{key:"ngOnChanges",value:function(e){this._position&&(this._updatePositionStrategy(this._position),this._overlayRef.updateSize({width:this.width,minWidth:this.minWidth,height:this.height,minHeight:this.minHeight}),e.origin&&this.open&&this._position.apply()),e.open&&(this.open?this._attachOverlay():this._detachOverlay())}},{key:"_createOverlay",value:function(){var e=this;this.positions&&this.positions.length||(this.positions=Bg);var t=this._overlayRef=this._overlay.create(this._buildConfig());this._attachSubscription=t.attachments().subscribe(function(){return e.attach.emit()}),this._detachSubscription=t.detachments().subscribe(function(){return e.detach.emit()}),t.keydownEvents().subscribe(function(t){e.overlayKeydown.next(t),t.keyCode!==cg||e.disableClose||fg(t)||(t.preventDefault(),e._detachOverlay())}),this._overlayRef.outsidePointerEvents().subscribe(function(t){e.overlayOutsideClick.next(t)})}},{key:"_buildConfig",value:function(){var e=this._position=this.positionStrategy||this._createPositionStrategy(),t=new wg({direction:this._dir,positionStrategy:e,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop});return(this.width||0===this.width)&&(t.width=this.width),(this.height||0===this.height)&&(t.height=this.height),(this.minWidth||0===this.minWidth)&&(t.minWidth=this.minWidth),(this.minHeight||0===this.minHeight)&&(t.minHeight=this.minHeight),this.backdropClass&&(t.backdropClass=this.backdropClass),this.panelClass&&(t.panelClass=this.panelClass),t}},{key:"_updatePositionStrategy",value:function(e){var t=this,n=this.positions.map(function(e){return{originX:e.originX,originY:e.originY,overlayX:e.overlayX,overlayY:e.overlayY,offsetX:e.offsetX||t.offsetX,offsetY:e.offsetY||t.offsetY,panelClass:e.panelClass||void 0}});return e.setOrigin(this.origin.elementRef).withPositions(n).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector)}},{key:"_createPositionStrategy",value:function(){var e=this._overlay.position().flexibleConnectedTo(this.origin.elementRef);return this._updatePositionStrategy(e),e}},{key:"_attachOverlay",value:function(){var e=this;this._overlayRef?this._overlayRef.getConfig().hasBackdrop=this.hasBackdrop:this._createOverlay(),this._overlayRef.hasAttached()||this._overlayRef.attach(this._templatePortal),this.hasBackdrop?this._backdropSubscription=this._overlayRef.backdropClick().subscribe(function(t){e.backdropClick.emit(t)}):this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.positionChange.observers.length>0&&(this._positionSubscription=this._position.positionChanges.pipe(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return function(n){return n.lift(new ug(e,t))}}(function(){return e.positionChange.observers.length>0})).subscribe(function(t){e.positionChange.emit(t),0===e.positionChange.observers.length&&e._positionSubscription.unsubscribe()}))}},{key:"_detachOverlay",value:function(){this._overlayRef&&this._overlayRef.detach(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe()}},{key:"offsetX",get:function(){return this._offsetX},set:function(e){this._offsetX=e,this._position&&this._updatePositionStrategy(this._position)}},{key:"offsetY",get:function(){return this._offsetY},set:function(e){this._offsetY=e,this._position&&this._updatePositionStrategy(this._position)}},{key:"hasBackdrop",get:function(){return this._hasBackdrop},set:function(e){this._hasBackdrop=Xp(e)}},{key:"lockPosition",get:function(){return this._lockPosition},set:function(e){this._lockPosition=Xp(e)}},{key:"flexibleDimensions",get:function(){return this._flexibleDimensions},set:function(e){this._flexibleDimensions=Xp(e)}},{key:"growAfterOpen",get:function(){return this._growAfterOpen},set:function(e){this._growAfterOpen=Xp(e)}},{key:"push",get:function(){return this._push},set:function(e){this._push=Xp(e)}},{key:"overlayRef",get:function(){return this._overlayRef}},{key:"dir",get:function(){return this._dir?this._dir.value:"ltr"}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(Ng),ms(ml),ms(wl),ms(Wg),ms(Gm,8))},e.\u0275dir=gt({type:e,selectors:[["","cdk-connected-overlay",""],["","connected-overlay",""],["","cdkConnectedOverlay",""]],inputs:{viewportMargin:["cdkConnectedOverlayViewportMargin","viewportMargin"],open:["cdkConnectedOverlayOpen","open"],disableClose:["cdkConnectedOverlayDisableClose","disableClose"],scrollStrategy:["cdkConnectedOverlayScrollStrategy","scrollStrategy"],offsetX:["cdkConnectedOverlayOffsetX","offsetX"],offsetY:["cdkConnectedOverlayOffsetY","offsetY"],hasBackdrop:["cdkConnectedOverlayHasBackdrop","hasBackdrop"],lockPosition:["cdkConnectedOverlayLockPosition","lockPosition"],flexibleDimensions:["cdkConnectedOverlayFlexibleDimensions","flexibleDimensions"],growAfterOpen:["cdkConnectedOverlayGrowAfterOpen","growAfterOpen"],push:["cdkConnectedOverlayPush","push"],positions:["cdkConnectedOverlayPositions","positions"],origin:["cdkConnectedOverlayOrigin","origin"],positionStrategy:["cdkConnectedOverlayPositionStrategy","positionStrategy"],width:["cdkConnectedOverlayWidth","width"],height:["cdkConnectedOverlayHeight","height"],minWidth:["cdkConnectedOverlayMinWidth","minWidth"],minHeight:["cdkConnectedOverlayMinHeight","minHeight"],backdropClass:["cdkConnectedOverlayBackdropClass","backdropClass"],panelClass:["cdkConnectedOverlayPanelClass","panelClass"],transformOriginSelector:["cdkConnectedOverlayTransformOriginOn","transformOriginSelector"]},outputs:{backdropClick:"backdropClick",positionChange:"positionChange",attach:"attach",detach:"detach",overlayKeydown:"overlayKeydown",overlayOutsideClick:"overlayOutsideClick"},exportAs:["cdkConnectedOverlay"],features:[Yt]}),e}(),zg={provide:Wg,deps:[Ng],useFactory:function(e){return function(){return e.scrollStrategies.reposition()}}},qg=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[Ng,zg],imports:[[Km,sg,$m],$m]}),e}();function Gg(e,t,n){return function(i){return i.lift(new Kg(e,t,n))}}var Kg=function(){function e(t,n,i){v(this,e),this.nextOrObserver=t,this.error=n,this.complete=i}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new Jg(e,this.nextOrObserver,this.error,this.complete))}}]),e}(),Jg=function(e){_(n,e);var t=w(n);function n(e,i,r,o){var s;return v(this,n),(s=t.call(this,e))._tapNext=F,s._tapError=F,s._tapComplete=F,s._tapError=r||F,s._tapComplete=o||F,C(i)?(s._context=a(s),s._tapNext=i):i&&(s._context=i,s._tapNext=i.next||F,s._tapError=i.error||F,s._tapComplete=i.complete||F),s}return g(n,[{key:"_next",value:function(e){try{this._tapNext.call(this._context,e)}catch(t){return void this.destination.error(t)}this.destination.next(e)}},{key:"_error",value:function(e){try{this._tapError.call(this._context,e)}catch(e){return void this.destination.error(e)}this.destination.error(e)}},{key:"_complete",value:function(){try{this._tapComplete.call(this._context)}catch(e){return void this.destination.error(e)}return this.destination.complete()}}]),n}(Y);function Zg(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:kf;return function(n){return n.lift(new Qg(e,t))}}var Qg=function(){function e(t,n){v(this,e),this.dueTime=t,this.scheduler=n}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new Xg(e,this.dueTime,this.scheduler))}}]),e}(),Xg=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this,e)).dueTime=i,a.scheduler=r,a.debouncedSubscription=null,a.lastValue=null,a.hasValue=!1,a}return g(n,[{key:"_next",value:function(e){this.clearDebounce(),this.lastValue=e,this.hasValue=!0,this.add(this.debouncedSubscription=this.scheduler.schedule($g,this.dueTime,this))}},{key:"_complete",value:function(){this.debouncedNext(),this.destination.complete()}},{key:"debouncedNext",value:function(){if(this.clearDebounce(),this.hasValue){var e=this.lastValue;this.lastValue=null,this.hasValue=!1,this.destination.next(e)}}},{key:"clearDebounce",value:function(){var e=this.debouncedSubscription;null!==e&&(this.remove(e),e.unsubscribe(),this.debouncedSubscription=null)}}]),n}(Y);function $g(e){e.debouncedNext()}var ev=function(){var e=function(){function e(){v(this,e)}return g(e,[{key:"create",value:function(e){return"undefined"==typeof MutationObserver?null:new MutationObserver(e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ee({factory:function(){return new e},token:e,providedIn:"root"}),e}(),tv=function(){var e=function(){function e(t){v(this,e),this._mutationObserverFactory=t,this._observedElements=new Map}return g(e,[{key:"ngOnDestroy",value:function(){var e=this;this._observedElements.forEach(function(t,n){return e._cleanupObserver(n)})}},{key:"observe",value:function(e){var t=this,n=im(e);return new N(function(e){var i=t._observeElement(n).subscribe(e);return function(){i.unsubscribe(),t._unobserveElement(n)}})}},{key:"_observeElement",value:function(e){if(this._observedElements.has(e))this._observedElements.get(e).count++;else{var t=new z,n=this._mutationObserverFactory.create(function(e){return t.next(e)});n&&n.observe(e,{characterData:!0,childList:!0,subtree:!0}),this._observedElements.set(e,{observer:n,stream:t,count:1})}return this._observedElements.get(e).stream}},{key:"_unobserveElement",value:function(e){this._observedElements.has(e)&&(this._observedElements.get(e).count--,this._observedElements.get(e).count||this._cleanupObserver(e))}},{key:"_cleanupObserver",value:function(e){if(this._observedElements.has(e)){var t=this._observedElements.get(e),n=t.observer,i=t.stream;n&&n.disconnect(),i.complete(),this._observedElements.delete(e)}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(ev))},e.\u0275prov=Ee({factory:function(){return new e(Gi(ev))},token:e,providedIn:"root"}),e}(),nv=function(){var e=function(){function e(t,n,i){v(this,e),this._contentObserver=t,this._elementRef=n,this._ngZone=i,this.event=new Zl,this._disabled=!1,this._currentSubscription=null}return g(e,[{key:"ngAfterContentInit",value:function(){this._currentSubscription||this.disabled||this._subscribe()}},{key:"ngOnDestroy",value:function(){this._unsubscribe()}},{key:"_subscribe",value:function(){var e=this;this._unsubscribe();var t=this._contentObserver.observe(this._elementRef);this._ngZone.runOutsideAngular(function(){e._currentSubscription=(e.debounce?t.pipe(Zg(e.debounce)):t).subscribe(e.event)})}},{key:"_unsubscribe",value:function(){var e;null===(e=this._currentSubscription)||void 0===e||e.unsubscribe()}},{key:"disabled",get:function(){return this._disabled},set:function(e){this._disabled=Xp(e),this._disabled?this._unsubscribe():this._subscribe()}},{key:"debounce",get:function(){return this._debounce},set:function(e){this._debounce=$p(e),this._subscribe()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(tv),ms(ju),ms(Nc))},e.\u0275dir=gt({type:e,selectors:[["","cdkObserveContent",""]],inputs:{disabled:["cdkObserveContentDisabled","disabled"],debounce:"debounce"},outputs:{event:"cdkObserveContent"},exportAs:["cdkObserveContent"]}),e}(),iv=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[ev]}),e}();function rv(e,t){return(e.getAttribute(t)||"").match(/\S+/g)||[]}var av="cdk-describedby-message-container",ov="cdk-describedby-message",sv="cdk-describedby-host",uv=0,lv=new Map,cv=null,dv=function(){var e=function(){function e(t,n){v(this,e),this._platform=n,this._document=t}return g(e,[{key:"describe",value:function(e,t){this._canBeDescribed(e,t)&&("string"!=typeof t?(this._setMessageId(t),lv.set(t,{messageElement:t,referenceCount:0})):lv.has(t)||this._createMessageElement(t),this._isElementDescribedByMessage(e,t)||this._addMessageReference(e,t))}},{key:"removeDescription",value:function(e,t){if(t&&this._isElementNode(e)){if(this._isElementDescribedByMessage(e,t)&&this._removeMessageReference(e,t),"string"==typeof t){var n=lv.get(t);n&&0===n.referenceCount&&this._deleteMessageElement(t)}cv&&0===cv.childNodes.length&&this._deleteMessagesContainer()}}},{key:"ngOnDestroy",value:function(){for(var e=this._document.querySelectorAll("[".concat(sv,"]")),t=0;t-1&&t!==n._activeItemIndex&&(n._activeItemIndex=t)}})}return g(e,[{key:"skipPredicate",value:function(e){return this._skipPredicateFn=e,this}},{key:"withWrap",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._wrap=e,this}},{key:"withVerticalOrientation",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._vertical=e,this}},{key:"withHorizontalOrientation",value:function(e){return this._horizontal=e,this}},{key:"withAllowedModifierKeys",value:function(e){return this._allowedModifierKeys=e,this}},{key:"withTypeAhead",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:200;return this._typeaheadSubscription.unsubscribe(),this._typeaheadSubscription=this._letterKeyStream.pipe(Gg(function(t){return e._pressedLetters.push(t)}),Zg(t),Nf(function(){return e._pressedLetters.length>0}),ie(function(){return e._pressedLetters.join("")})).subscribe(function(t){for(var n=e._getItemsArray(),i=1;i0&&void 0!==arguments[0])||arguments[0];return this._homeAndEnd=e,this}},{key:"setActiveItem",value:function(e){var t=this._activeItem;this.updateActiveItem(e),this._activeItem!==t&&this.change.next(this._activeItemIndex)}},{key:"onKeydown",value:function(e){var t=this,n=e.keyCode,i=["altKey","ctrlKey","metaKey","shiftKey"].every(function(n){return!e[n]||t._allowedModifierKeys.indexOf(n)>-1});switch(n){case 9:return void this.tabOut.next();case hg:if(this._vertical&&i){this.setNextItemActive();break}return;case dg:if(this._vertical&&i){this.setPreviousItemActive();break}return;case 39:if(this._horizontal&&i){"rtl"===this._horizontal?this.setPreviousItemActive():this.setNextItemActive();break}return;case 37:if(this._horizontal&&i){"rtl"===this._horizontal?this.setNextItemActive():this.setPreviousItemActive();break}return;case 36:if(this._homeAndEnd&&i){this.setFirstItemActive();break}return;case 35:if(this._homeAndEnd&&i){this.setLastItemActive();break}return;default:return void((i||fg(e,"shiftKey"))&&(e.key&&1===e.key.length?this._letterKeyStream.next(e.key.toLocaleUpperCase()):(n>=65&&n<=90||n>=48&&n<=57)&&this._letterKeyStream.next(String.fromCharCode(n))))}this._pressedLetters=[],e.preventDefault()}},{key:"isTyping",value:function(){return this._pressedLetters.length>0}},{key:"setFirstItemActive",value:function(){this._setActiveItemByIndex(0,1)}},{key:"setLastItemActive",value:function(){this._setActiveItemByIndex(this._items.length-1,-1)}},{key:"setNextItemActive",value:function(){this._activeItemIndex<0?this.setFirstItemActive():this._setActiveItemByDelta(1)}},{key:"setPreviousItemActive",value:function(){this._activeItemIndex<0&&this._wrap?this.setLastItemActive():this._setActiveItemByDelta(-1)}},{key:"updateActiveItem",value:function(e){var t=this._getItemsArray(),n="number"==typeof e?e:t.indexOf(e),i=t[n];this._activeItem=null==i?null:i,this._activeItemIndex=n}},{key:"_setActiveItemByDelta",value:function(e){this._wrap?this._setActiveInWrapMode(e):this._setActiveInDefaultMode(e)}},{key:"_setActiveInWrapMode",value:function(e){for(var t=this._getItemsArray(),n=1;n<=t.length;n++){var i=(this._activeItemIndex+e*n+t.length)%t.length;if(!this._skipPredicateFn(t[i]))return void this.setActiveItem(i)}}},{key:"_setActiveInDefaultMode",value:function(e){this._setActiveItemByIndex(this._activeItemIndex+e,e)}},{key:"_setActiveItemByIndex",value:function(e,t){var n=this._getItemsArray();if(n[e]){for(;this._skipPredicateFn(n[e]);)if(!n[e+=t])return;this.setActiveItem(e)}}},{key:"_getItemsArray",value:function(){return this._items instanceof Xl?this._items.toArray():this._items}},{key:"activeItemIndex",get:function(){return this._activeItemIndex}},{key:"activeItem",get:function(){return this._activeItem}}]),e}(),fv=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"setActiveItem",value:function(e){this.activeItem&&this.activeItem.setInactiveStyles(),r(i(n.prototype),"setActiveItem",this).call(this,e),this.activeItem&&this.activeItem.setActiveStyles()}}]),n}(hv),pv=function(e){_(n,e);var t=w(n);function n(){var e;return v(this,n),(e=t.apply(this,arguments))._origin="program",e}return g(n,[{key:"setFocusOrigin",value:function(e){return this._origin=e,this}},{key:"setActiveItem",value:function(e){r(i(n.prototype),"setActiveItem",this).call(this,e),this.activeItem&&this.activeItem.focus(this._origin)}}]),n}(hv),mv=function(){var e=function(){function e(t){v(this,e),this._platform=t}return g(e,[{key:"isDisabled",value:function(e){return e.hasAttribute("disabled")}},{key:"isVisible",value:function(e){return function(e){return!!(e.offsetWidth||e.offsetHeight||"function"==typeof e.getClientRects&&e.getClientRects().length)}(e)&&"visible"===getComputedStyle(e).visibility}},{key:"isTabbable",value:function(e){if(!this._platform.isBrowser)return!1;var t,n=function(e){try{return e.frameElement}catch(aN){return null}}((t=e).ownerDocument&&t.ownerDocument.defaultView||window);if(n){if(-1===vv(n))return!1;if(!this.isVisible(n))return!1}var i=e.nodeName.toLowerCase(),r=vv(e);return e.hasAttribute("contenteditable")?-1!==r:"iframe"!==i&&"object"!==i&&!(this._platform.WEBKIT&&this._platform.IOS&&!function(e){var t=e.nodeName.toLowerCase(),n="input"===t&&e.type;return"text"===n||"password"===n||"select"===t||"textarea"===t}(e))&&("audio"===i?!!e.hasAttribute("controls")&&-1!==r:"video"===i?-1!==r&&(null!==r||this._platform.FIREFOX||e.hasAttribute("controls")):e.tabIndex>=0)}},{key:"isFocusable",value:function(e,t){return function(e){return!function(e){return function(e){return"input"==e.nodeName.toLowerCase()}(e)&&"hidden"==e.type}(e)&&(function(e){var t=e.nodeName.toLowerCase();return"input"===t||"select"===t||"button"===t||"textarea"===t}(e)||function(e){return function(e){return"a"==e.nodeName.toLowerCase()}(e)&&e.hasAttribute("href")}(e)||e.hasAttribute("contenteditable")||gv(e))}(e)&&!this.isDisabled(e)&&((null==t?void 0:t.ignoreVisibility)||this.isVisible(e))}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Nm))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Nm))},token:e,providedIn:"root"}),e}();function gv(e){if(!e.hasAttribute("tabindex")||void 0===e.tabIndex)return!1;var t=e.getAttribute("tabindex");return"-32768"!=t&&!(!t||isNaN(parseInt(t,10)))}function vv(e){if(!gv(e))return null;var t=parseInt(e.getAttribute("tabindex")||"",10);return isNaN(t)?-1:t}var _v=function(){function e(t,n,i,r){var a=this,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];v(this,e),this._element=t,this._checker=n,this._ngZone=i,this._document=r,this._hasAttached=!1,this.startAnchorListener=function(){return a.focusLastTabbableElement()},this.endAnchorListener=function(){return a.focusFirstTabbableElement()},this._enabled=!0,o||this.attachAnchors()}return g(e,[{key:"destroy",value:function(){var e=this._startAnchor,t=this._endAnchor;e&&(e.removeEventListener("focus",this.startAnchorListener),e.parentNode&&e.parentNode.removeChild(e)),t&&(t.removeEventListener("focus",this.endAnchorListener),t.parentNode&&t.parentNode.removeChild(t)),this._startAnchor=this._endAnchor=null,this._hasAttached=!1}},{key:"attachAnchors",value:function(){var e=this;return!!this._hasAttached||(this._ngZone.runOutsideAngular(function(){e._startAnchor||(e._startAnchor=e._createAnchor(),e._startAnchor.addEventListener("focus",e.startAnchorListener)),e._endAnchor||(e._endAnchor=e._createAnchor(),e._endAnchor.addEventListener("focus",e.endAnchorListener))}),this._element.parentNode&&(this._element.parentNode.insertBefore(this._startAnchor,this._element),this._element.parentNode.insertBefore(this._endAnchor,this._element.nextSibling),this._hasAttached=!0),this._hasAttached)}},{key:"focusInitialElementWhenReady",value:function(){var e=this;return new Promise(function(t){e._executeOnStable(function(){return t(e.focusInitialElement())})})}},{key:"focusFirstTabbableElementWhenReady",value:function(){var e=this;return new Promise(function(t){e._executeOnStable(function(){return t(e.focusFirstTabbableElement())})})}},{key:"focusLastTabbableElementWhenReady",value:function(){var e=this;return new Promise(function(t){e._executeOnStable(function(){return t(e.focusLastTabbableElement())})})}},{key:"_getRegionBoundary",value:function(e){for(var t=this._element.querySelectorAll("[cdk-focus-region-".concat(e,"], ")+"[cdkFocusRegion".concat(e,"], ")+"[cdk-focus-".concat(e,"]")),n=0;n=0;n--){var i=t[n].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(t[n]):null;if(i)return i}return null}},{key:"_createAnchor",value:function(){var e=this._document.createElement("div");return this._toggleAnchorTabIndex(this._enabled,e),e.classList.add("cdk-visually-hidden"),e.classList.add("cdk-focus-trap-anchor"),e.setAttribute("aria-hidden","true"),e}},{key:"_toggleAnchorTabIndex",value:function(e,t){e?t.setAttribute("tabindex","0"):t.removeAttribute("tabindex")}},{key:"toggleAnchors",value:function(e){this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}},{key:"_executeOnStable",value:function(e){this._ngZone.isStable?e():this._ngZone.onStable.pipe(Uf(1)).subscribe(e)}},{key:"enabled",get:function(){return this._enabled},set:function(e){this._enabled=e,this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}}]),e}(),yv=function(){var e=function(){function e(t,n,i){v(this,e),this._checker=t,this._ngZone=n,this._document=i}return g(e,[{key:"create",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return new _v(e,this._checker,this._ngZone,this._document,t)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(mv),Gi(Nc),Gi(Md))},e.\u0275prov=Ee({factory:function(){return new e(Gi(mv),Gi(Nc),Gi(Md))},token:e,providedIn:"root"}),e}();"undefined"!=typeof Element&∈var bv=new Si("liveAnnouncerElement",{providedIn:"root",factory:function(){return null}}),wv=new Si("LIVE_ANNOUNCER_DEFAULT_OPTIONS"),kv=function(){var e=function(){function e(t,n,i,r){v(this,e),this._ngZone=n,this._defaultOptions=r,this._document=i,this._liveElement=t||this._createLiveElement()}return g(e,[{key:"announce",value:function(e){for(var t,n,i=this,r=this._defaultOptions,a=arguments.length,o=new Array(a>1?a-1:0),s=1;s1&&void 0!==arguments[1]&&arguments[1],n=im(e);if(!this._platform.isBrowser||1!==n.nodeType)return xf(null);var i=zm(n)||this._getDocument(),r=this._elementInfo.get(n);if(r)return t&&(r.checkChildren=!0),r.subject;var a={checkChildren:t,subject:new z,rootNode:i};return this._elementInfo.set(n,a),this._registerGlobalListeners(a),a.subject}},{key:"stopMonitoring",value:function(e){var t=im(e),n=this._elementInfo.get(t);n&&(n.subject.complete(),this._setClasses(t),this._elementInfo.delete(t),this._removeGlobalListeners(n))}},{key:"focusVia",value:function(e,t,n){var i=im(e);i===this._getDocument().activeElement&&this._elementInfo.has(i)?this._originChanged(i,t,this._elementInfo.get(i)):(this._setOriginForCurrentEventQueue(t),"function"==typeof i.focus&&i.focus(n))}},{key:"ngOnDestroy",value:function(){var e=this;this._elementInfo.forEach(function(t,n){return e.stopMonitoring(n)})}},{key:"_getDocument",value:function(){return this._document||document}},{key:"_getWindow",value:function(){return this._getDocument().defaultView||window}},{key:"_toggleClass",value:function(e,t,n){n?e.classList.add(t):e.classList.remove(t)}},{key:"_getFocusOrigin",value:function(e){return this._origin?this._origin:this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:this._wasCausedByTouch(e)?"touch":"program"}},{key:"_setClasses",value:function(e,t){this._toggleClass(e,"cdk-focused",!!t),this._toggleClass(e,"cdk-touch-focused","touch"===t),this._toggleClass(e,"cdk-keyboard-focused","keyboard"===t),this._toggleClass(e,"cdk-mouse-focused","mouse"===t),this._toggleClass(e,"cdk-program-focused","program"===t)}},{key:"_setOriginForCurrentEventQueue",value:function(e){var t=this;this._ngZone.runOutsideAngular(function(){t._origin=e,0===t._detectionMode&&(t._originTimeoutId=setTimeout(function(){return t._origin=null},1))})}},{key:"_wasCausedByTouch",value:function(e){var t=Lv(e);return this._lastTouchTarget instanceof Node&&t instanceof Node&&(t===this._lastTouchTarget||t.contains(this._lastTouchTarget))}},{key:"_onFocus",value:function(e,t){var n=this._elementInfo.get(t);n&&(n.checkChildren||t===Lv(e))&&this._originChanged(t,this._getFocusOrigin(e),n)}},{key:"_onBlur",value:function(e,t){var n=this._elementInfo.get(t);!n||n.checkChildren&&e.relatedTarget instanceof Node&&t.contains(e.relatedTarget)||(this._setClasses(t),this._emitOrigin(n.subject,null))}},{key:"_emitOrigin",value:function(e,t){this._ngZone.run(function(){return e.next(t)})}},{key:"_registerGlobalListeners",value:function(e){var t=this;if(this._platform.isBrowser){var n=e.rootNode,i=this._rootNodeFocusListenerCount.get(n)||0;i||this._ngZone.runOutsideAngular(function(){n.addEventListener("focus",t._rootNodeFocusAndBlurListener,Cv),n.addEventListener("blur",t._rootNodeFocusAndBlurListener,Cv)}),this._rootNodeFocusListenerCount.set(n,i+1),1==++this._monitoredElementCount&&this._ngZone.runOutsideAngular(function(){var e=t._getDocument(),n=t._getWindow();e.addEventListener("keydown",t._documentKeydownListener,Cv),e.addEventListener("mousedown",t._documentMousedownListener,Cv),e.addEventListener("touchstart",t._documentTouchstartListener,Cv),n.addEventListener("focus",t._windowFocusListener)})}}},{key:"_removeGlobalListeners",value:function(e){var t=e.rootNode;if(this._rootNodeFocusListenerCount.has(t)){var n=this._rootNodeFocusListenerCount.get(t);n>1?this._rootNodeFocusListenerCount.set(t,n-1):(t.removeEventListener("focus",this._rootNodeFocusAndBlurListener,Cv),t.removeEventListener("blur",this._rootNodeFocusAndBlurListener,Cv),this._rootNodeFocusListenerCount.delete(t))}if(!--this._monitoredElementCount){var i=this._getDocument(),r=this._getWindow();i.removeEventListener("keydown",this._documentKeydownListener,Cv),i.removeEventListener("mousedown",this._documentMousedownListener,Cv),i.removeEventListener("touchstart",this._documentTouchstartListener,Cv),r.removeEventListener("focus",this._windowFocusListener),clearTimeout(this._windowFocusTimeoutId),clearTimeout(this._touchTimeoutId),clearTimeout(this._originTimeoutId)}}},{key:"_originChanged",value:function(e,t,n){this._setClasses(e,t),this._emitOrigin(n.subject,t),this._lastFocusOrigin=t}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Nc),Gi(Nm),Gi(Md,8),Gi(Sv,8))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Nc),Gi(Nm),Gi(Md,8),Gi(Sv,8))},token:e,providedIn:"root"}),e}();function Lv(e){return e.composedPath?e.composedPath()[0]:e.target}var Tv="cdk-high-contrast-black-on-white",Dv="cdk-high-contrast-white-on-black",Ov="cdk-high-contrast-active",Ev=function(){var e=function(){function e(t,n){v(this,e),this._platform=t,this._document=n}return g(e,[{key:"getHighContrastMode",value:function(){if(!this._platform.isBrowser)return 0;var e=this._document.createElement("div");e.style.backgroundColor="rgb(1,2,3)",e.style.position="absolute",this._document.body.appendChild(e);var t=this._document.defaultView||window,n=t&&t.getComputedStyle?t.getComputedStyle(e):null,i=(n&&n.backgroundColor||"").replace(/ /g,"");switch(this._document.body.removeChild(e),i){case"rgb(0,0,0)":return 2;case"rgb(255,255,255)":return 1}return 0}},{key:"_applyBodyHighContrastModeCssClasses",value:function(){if(this._platform.isBrowser&&this._document.body){var e=this._document.body.classList;e.remove(Ov),e.remove(Tv),e.remove(Dv);var t=this.getHighContrastMode();1===t?(e.add(Ov),e.add(Tv)):2===t&&(e.add(Ov),e.add(Dv))}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Nm),Gi(Md))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Nm),Gi(Md))},token:e,providedIn:"root"}),e}(),Pv=function(){var e=function e(t){v(this,e),t._applyBodyHighContrastModeCssClasses()};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)(Gi(Ev))},imports:[[Bm,iv]]}),e}(),Av=new Uu("11.0.3"),Yv=function e(){v(this,e)},Iv=function e(){v(this,e)},Rv="*";function Fv(e,t){return{type:7,name:e,definitions:t,options:{}}}function Hv(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return{type:4,styles:t,timings:e}}function jv(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return{type:2,steps:e,options:t}}function Nv(e){return{type:6,styles:e,offset:null}}function Bv(e,t,n){return{type:0,name:e,styles:t,options:n}}function Wv(e){return{type:5,steps:e}}function Vv(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return{type:1,expr:e,animation:t,options:n}}function Uv(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return{type:9,options:e}}function zv(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return{type:11,selector:e,animation:t,options:n}}function qv(e){Promise.resolve(null).then(e)}var Gv=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;v(this,e),this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this._position=0,this.parentPlayer=null,this.totalTime=t+n}return g(e,[{key:"_onFinish",value:function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])}},{key:"onStart",value:function(e){this._onStartFns.push(e)}},{key:"onDone",value:function(e){this._onDoneFns.push(e)}},{key:"onDestroy",value:function(e){this._onDestroyFns.push(e)}},{key:"hasStarted",value:function(){return this._started}},{key:"init",value:function(){}},{key:"play",value:function(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}},{key:"triggerMicrotask",value:function(){var e=this;qv(function(){return e._onFinish()})}},{key:"_onStart",value:function(){this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[]}},{key:"pause",value:function(){}},{key:"restart",value:function(){}},{key:"finish",value:function(){this._onFinish()}},{key:"destroy",value:function(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])}},{key:"reset",value:function(){}},{key:"setPosition",value:function(e){this._position=this.totalTime?e*this.totalTime:1}},{key:"getPosition",value:function(){return this.totalTime?this._position/this.totalTime:1}},{key:"triggerCallback",value:function(e){var t="start"==e?this._onStartFns:this._onDoneFns;t.forEach(function(e){return e()}),t.length=0}}]),e}(),Kv=function(){function e(t){var n=this;v(this,e),this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=t;var i=0,r=0,a=0,o=this.players.length;0==o?qv(function(){return n._onFinish()}):this.players.forEach(function(e){e.onDone(function(){++i==o&&n._onFinish()}),e.onDestroy(function(){++r==o&&n._onDestroy()}),e.onStart(function(){++a==o&&n._onStart()})}),this.totalTime=this.players.reduce(function(e,t){return Math.max(e,t.totalTime)},0)}return g(e,[{key:"_onFinish",value:function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])}},{key:"init",value:function(){this.players.forEach(function(e){return e.init()})}},{key:"onStart",value:function(e){this._onStartFns.push(e)}},{key:"_onStart",value:function(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[])}},{key:"onDone",value:function(e){this._onDoneFns.push(e)}},{key:"onDestroy",value:function(e){this._onDestroyFns.push(e)}},{key:"hasStarted",value:function(){return this._started}},{key:"play",value:function(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(function(e){return e.play()})}},{key:"pause",value:function(){this.players.forEach(function(e){return e.pause()})}},{key:"restart",value:function(){this.players.forEach(function(e){return e.restart()})}},{key:"finish",value:function(){this._onFinish(),this.players.forEach(function(e){return e.finish()})}},{key:"destroy",value:function(){this._onDestroy()}},{key:"_onDestroy",value:function(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(function(e){return e.destroy()}),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])}},{key:"reset",value:function(){this.players.forEach(function(e){return e.reset()}),this._destroyed=!1,this._finished=!1,this._started=!1}},{key:"setPosition",value:function(e){var t=e*this.totalTime;this.players.forEach(function(e){var n=e.totalTime?Math.min(1,t/e.totalTime):1;e.setPosition(n)})}},{key:"getPosition",value:function(){var e=this.players.reduce(function(e,t){return null===e||t.totalTime>e.totalTime?t:e},null);return null!=e?e.getPosition():0}},{key:"beforeDestroy",value:function(){this.players.forEach(function(e){e.beforeDestroy&&e.beforeDestroy()})}},{key:"triggerCallback",value:function(e){var t="start"==e?this._onStartFns:this._onDoneFns;t.forEach(function(e){return e()}),t.length=0}}]),e}(),Jv="!";function Zv(){return"undefined"!=typeof process&&"[object process]"==={}.toString.call(process)}function Qv(e){switch(e.length){case 0:return new Gv;case 1:return e[0];default:return new Kv(e)}}function Xv(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},o=[],s=[],u=-1,l=null;if(i.forEach(function(e){var n=e.offset,i=n==u,c=i&&l||{};Object.keys(e).forEach(function(n){var i=n,s=e[n];if("offset"!==n)switch(i=t.normalizePropertyName(i,o),s){case Jv:s=r[n];break;case Rv:s=a[n];break;default:s=t.normalizeStyleValue(n,i,s,o)}c[i]=s}),i||s.push(c),l=c,u=n}),o.length){var c="\n - ";throw new Error("Unable to animate due to the following errors:".concat(c).concat(o.join(c)))}return s}function $v(e,t,n,i){switch(t){case"start":e.onStart(function(){return i(n&&e_(n,"start",e))});break;case"done":e.onDone(function(){return i(n&&e_(n,"done",e))});break;case"destroy":e.onDestroy(function(){return i(n&&e_(n,"destroy",e))})}}function e_(e,t,n){var i=n.totalTime,r=t_(e.element,e.triggerName,e.fromState,e.toState,t||e.phaseName,null==i?e.totalTime:i,!!n.disabled),a=e._data;return null!=a&&(r._data=a),r}function t_(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,o=arguments.length>6?arguments[6]:void 0;return{element:e,triggerName:t,fromState:n,toState:i,phaseName:r,totalTime:a,disabled:!!o}}function n_(e,t,n){var i;return e instanceof Map?(i=e.get(t))||e.set(t,i=n):(i=e[t])||(i=e[t]=n),i}function i_(e){var t=e.indexOf(":");return[e.substring(1,t),e.substr(t+1)]}var r_=function(e,t){return!1},a_=function(e,t){return!1},o_=function(e,t,n){return[]},s_=Zv();(s_||"undefined"!=typeof Element)&&(r_=function(e,t){return e.contains(t)},a_=function(){if(s_||Element.prototype.matches)return function(e,t){return e.matches(t)};var e=Element.prototype,t=e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;return t?function(e,n){return t.apply(e,[n])}:a_}(),o_=function(e,t,n){var i=[];if(n)for(var r=e.querySelectorAll(t),a=0;a1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).forEach(function(n){t[n]=e[n]}),t}function L_(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(t)for(var i in e)n[i]=e[i];else x_(e,n);return n}function T_(e,t,n){return n?t+":"+n+";":""}function D_(e){for(var t="",n=0;n *";case":leave":return"* => void";case":increment":return function(e,t){return parseFloat(t)>parseFloat(e)};case":decrement":return function(e,t){return parseFloat(t) *"}}(e,n);if("function"==typeof i)return void t.push(i);e=i}var r=e.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(null==r||r.length<4)return n.push('The provided transition expression "'.concat(e,'" is not supported')),t;var a=r[1],o=r[2],s=r[3];t.push(q_(a,s)),"<"!=o[0]||a==V_&&s==V_||t.push(q_(s,a))}(e,r,i)}):r.push(n),r),animation:a,queryCount:t.queryCount,depCount:t.depCount,options:$_(e.options)}}},{key:"visitSequence",value:function(e,t){var n=this;return{type:2,steps:e.steps.map(function(e){return B_(n,e,t)}),options:$_(e.options)}}},{key:"visitGroup",value:function(e,t){var n=this,i=t.currentTime,r=0,a=e.steps.map(function(e){t.currentTime=i;var a=B_(n,e,t);return r=Math.max(r,t.currentTime),a});return t.currentTime=r,{type:3,steps:a,options:$_(e.options)}}},{key:"visitAnimate",value:function(e,t){var n,i=function(e,t){var n=null;if(e.hasOwnProperty("duration"))n=e;else if("number"==typeof e)return ey(C_(e,t).duration,0,"");var i=e;if(i.split(/\s+/).some(function(e){return"{"==e.charAt(0)&&"{"==e.charAt(1)})){var r=ey(0,0,"");return r.dynamic=!0,r.strValue=i,r}return ey((n=n||C_(i,t)).duration,n.delay,n.easing)}(e.timings,t.errors);t.currentAnimateTimings=i;var r=e.styles?e.styles:Nv({});if(5==r.type)n=this.visitKeyframes(r,t);else{var a=e.styles,o=!1;if(!a){o=!0;var s={};i.easing&&(s.easing=i.easing),a=Nv(s)}t.currentTime+=i.duration+i.delay;var u=this.visitStyle(a,t);u.isEmptyStep=o,n=u}return t.currentAnimateTimings=null,{type:4,timings:i,style:n,options:null}}},{key:"visitStyle",value:function(e,t){var n=this._makeStyleAst(e,t);return this._validateStyleAst(n,t),n}},{key:"_makeStyleAst",value:function(e,t){var n=[];Array.isArray(e.styles)?e.styles.forEach(function(e){"string"==typeof e?e==Rv?n.push(e):t.errors.push("The provided style string value ".concat(e," is not allowed.")):n.push(e)}):n.push(e.styles);var i=!1,r=null;return n.forEach(function(e){if(X_(e)){var t=e,n=t.easing;if(n&&(r=n,delete t.easing),!i)for(var a in t)if(t[a].toString().indexOf("{{")>=0){i=!0;break}}}),{type:6,styles:n,easing:r,offset:e.offset,containsDynamicStyles:i,options:null}}},{key:"_validateStyleAst",value:function(e,t){var n=this,i=t.currentAnimateTimings,r=t.currentTime,a=t.currentTime;i&&a>0&&(a-=i.duration+i.delay),e.styles.forEach(function(e){"string"!=typeof e&&Object.keys(e).forEach(function(i){if(n._driver.validateStyleProperty(i)){var o,s,u,l=t.collectedStyles[t.currentQuerySelector],c=l[i],d=!0;c&&(a!=r&&a>=c.startTime&&r<=c.endTime&&(t.errors.push('The CSS property "'.concat(i,'" that exists between the times of "').concat(c.startTime,'ms" and "').concat(c.endTime,'ms" is also being animated in a parallel animation between the times of "').concat(a,'ms" and "').concat(r,'ms"')),d=!1),a=c.startTime),d&&(l[i]={startTime:a,endTime:r}),t.options&&(o=t.errors,s=t.options.params||{},(u=Y_(e[i])).length&&u.forEach(function(e){s.hasOwnProperty(e)||o.push("Unable to resolve the local animation param ".concat(e," in the given list of values"))}))}else t.errors.push('The provided animation property "'.concat(i,'" is not a supported CSS property for animations'))})})}},{key:"visitKeyframes",value:function(e,t){var n=this,i={type:5,styles:[],options:null};if(!t.currentAnimateTimings)return t.errors.push("keyframes() must be placed inside of a call to animate()"),i;var r=0,a=[],o=!1,s=!1,u=0,l=e.steps.map(function(e){var i=n._makeStyleAst(e,t),l=null!=i.offset?i.offset:function(e){if("string"==typeof e)return null;var t=null;if(Array.isArray(e))e.forEach(function(e){if(X_(e)&&e.hasOwnProperty("offset")){var n=e;t=parseFloat(n.offset),delete n.offset}});else if(X_(e)&&e.hasOwnProperty("offset")){var n=e;t=parseFloat(n.offset),delete n.offset}return t}(i.styles),c=0;return null!=l&&(r++,c=i.offset=l),s=s||c<0||c>1,o=o||c0&&r0?r==h?1:d*r:a[r],s=o*m;t.currentTime=f+p.delay+s,p.duration=s,n._validateStyleAst(e,t),e.offset=o,i.styles.push(e)}),i}},{key:"visitReference",value:function(e,t){return{type:8,animation:B_(this,P_(e.animation),t),options:$_(e.options)}}},{key:"visitAnimateChild",value:function(e,t){return t.depCount++,{type:9,options:$_(e.options)}}},{key:"visitAnimateRef",value:function(e,t){return{type:10,animation:this.visitReference(e.animation,t),options:$_(e.options)}}},{key:"visitQuery",value:function(e,t){var n=t.currentQuerySelector,i=e.options||{};t.queryCount++,t.currentQuery=e;var r=u(function(e){var t=!!e.split(/\s*,\s*/).find(function(e){return e==G_});return t&&(e=e.replace(K_,"")),[e=e.replace(/@\*/g,b_).replace(/@\w+/g,function(e){return".ng-trigger-"+e.substr(1)}).replace(/:animating/g,k_),t]}(e.selector),2),a=r[0],o=r[1];t.currentQuerySelector=n.length?n+" "+a:a,n_(t.collectedStyles,t.currentQuerySelector,{});var s=B_(this,P_(e.animation),t);return t.currentQuery=null,t.currentQuerySelector=n,{type:11,selector:a,limit:i.limit||0,optional:!!i.optional,includeSelf:o,animation:s,originalSelector:e.selector,options:$_(e.options)}}},{key:"visitStagger",value:function(e,t){t.currentQuery||t.errors.push("stagger() can only be used inside of query()");var n="full"===e.timings?{duration:0,delay:0,easing:"full"}:C_(e.timings,t.errors,!0);return{type:12,animation:B_(this,P_(e.animation),t),timings:n,options:null}}}]),e}(),Q_=function e(t){v(this,e),this.errors=t,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null};function X_(e){return!Array.isArray(e)&&"object"==typeof e}function $_(e){var t;return e?(e=x_(e)).params&&(e.params=(t=e.params)?x_(t):null):e={},e}function ey(e,t,n){return{duration:e,delay:t,easing:n}}function ty(e,t,n,i,r,a){var o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:null,s=arguments.length>7&&void 0!==arguments[7]&&arguments[7];return{type:1,element:e,keyframes:t,preStyleProps:n,postStyleProps:i,duration:r,delay:a,totalTime:r+a,easing:o,subTimeline:s}}var ny=function(){function e(){v(this,e),this._map=new Map}return g(e,[{key:"consume",value:function(e){var t=this._map.get(e);return t?this._map.delete(e):t=[],t}},{key:"append",value:function(e,t){var n,i=this._map.get(e);i||this._map.set(e,i=[]),(n=i).push.apply(n,d(t))}},{key:"has",value:function(e){return this._map.has(e)}},{key:"clear",value:function(){this._map.clear()}}]),e}(),iy=new RegExp(":enter","g"),ry=new RegExp(":leave","g");function ay(e,t,n,i,r){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},s=arguments.length>7?arguments[7]:void 0,u=arguments.length>8?arguments[8]:void 0,l=arguments.length>9&&void 0!==arguments[9]?arguments[9]:[];return(new oy).buildKeyframes(e,t,n,i,r,a,o,s,u,l)}var oy=function(){function e(){v(this,e)}return g(e,[{key:"buildKeyframes",value:function(e,t,n,i,r,a,o,s,u){var l=arguments.length>9&&void 0!==arguments[9]?arguments[9]:[];u=u||new ny;var c=new uy(e,t,u,i,r,l,[]);c.options=s,c.currentTimeline.setStyles([a],null,c.errors,s),B_(this,n,c);var d=c.timelines.filter(function(e){return e.containsAnimation()});if(d.length&&Object.keys(o).length){var h=d[d.length-1];h.allowOnlyTimelineStyles()||h.setStyles([o],null,c.errors,s)}return d.length?d.map(function(e){return e.buildKeyframes()}):[ty(t,[],[],[],0,0,"",!1)]}},{key:"visitTrigger",value:function(e,t){}},{key:"visitState",value:function(e,t){}},{key:"visitTransition",value:function(e,t){}},{key:"visitAnimateChild",value:function(e,t){var n=t.subInstructions.consume(t.element);if(n){var i=t.createSubContext(e.options),r=t.currentTimeline.currentTime,a=this._visitSubInstructions(n,i,i.options);r!=a&&t.transformIntoNewTimeline(a)}t.previousNode=e}},{key:"visitAnimateRef",value:function(e,t){var n=t.createSubContext(e.options);n.transformIntoNewTimeline(),this.visitReference(e.animation,n),t.transformIntoNewTimeline(n.currentTimeline.currentTime),t.previousNode=e}},{key:"_visitSubInstructions",value:function(e,t,n){var i=t.currentTimeline.currentTime,r=null!=n.duration?M_(n.duration):null,a=null!=n.delay?M_(n.delay):null;return 0!==r&&e.forEach(function(e){var n=t.appendInstructionToTimeline(e,r,a);i=Math.max(i,n.duration+n.delay)}),i}},{key:"visitReference",value:function(e,t){t.updateOptions(e.options,!0),B_(this,e.animation,t),t.previousNode=e}},{key:"visitSequence",value:function(e,t){var n=this,i=t.subContextCount,r=t,a=e.options;if(a&&(a.params||a.delay)&&((r=t.createSubContext(a)).transformIntoNewTimeline(),null!=a.delay)){6==r.previousNode.type&&(r.currentTimeline.snapshotCurrentStyles(),r.previousNode=sy);var o=M_(a.delay);r.delayNextStep(o)}e.steps.length&&(e.steps.forEach(function(e){return B_(n,e,r)}),r.currentTimeline.applyStylesToKeyframe(),r.subContextCount>i&&r.transformIntoNewTimeline()),t.previousNode=e}},{key:"visitGroup",value:function(e,t){var n=this,i=[],r=t.currentTimeline.currentTime,a=e.options&&e.options.delay?M_(e.options.delay):0;e.steps.forEach(function(o){var s=t.createSubContext(e.options);a&&s.delayNextStep(a),B_(n,o,s),r=Math.max(r,s.currentTimeline.currentTime),i.push(s.currentTimeline)}),i.forEach(function(e){return t.currentTimeline.mergeTimelineCollectedStyles(e)}),t.transformIntoNewTimeline(r),t.previousNode=e}},{key:"_visitTiming",value:function(e,t){if(e.dynamic){var n=e.strValue;return C_(t.params?I_(n,t.params,t.errors):n,t.errors)}return{duration:e.duration,delay:e.delay,easing:e.easing}}},{key:"visitAnimate",value:function(e,t){var n=t.currentAnimateTimings=this._visitTiming(e.timings,t),i=t.currentTimeline;n.delay&&(t.incrementTime(n.delay),i.snapshotCurrentStyles());var r=e.style;5==r.type?this.visitKeyframes(r,t):(t.incrementTime(n.duration),this.visitStyle(r,t),i.applyStylesToKeyframe()),t.currentAnimateTimings=null,t.previousNode=e}},{key:"visitStyle",value:function(e,t){var n=t.currentTimeline,i=t.currentAnimateTimings;!i&&n.getCurrentStyleProperties().length&&n.forwardFrame();var r=i&&i.easing||e.easing;e.isEmptyStep?n.applyEmptyStep(r):n.setStyles(e.styles,r,t.errors,t.options),t.previousNode=e}},{key:"visitKeyframes",value:function(e,t){var n=t.currentAnimateTimings,i=t.currentTimeline.duration,r=n.duration,a=t.createSubContext().currentTimeline;a.easing=n.easing,e.styles.forEach(function(e){a.forwardTime((e.offset||0)*r),a.setStyles(e.styles,e.easing,t.errors,t.options),a.applyStylesToKeyframe()}),t.currentTimeline.mergeTimelineCollectedStyles(a),t.transformIntoNewTimeline(i+r),t.previousNode=e}},{key:"visitQuery",value:function(e,t){var n=this,i=t.currentTimeline.currentTime,r=e.options||{},a=r.delay?M_(r.delay):0;a&&(6===t.previousNode.type||0==i&&t.currentTimeline.getCurrentStyleProperties().length)&&(t.currentTimeline.snapshotCurrentStyles(),t.previousNode=sy);var o=i,s=t.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!r.optional,t.errors);t.currentQueryTotal=s.length;var u=null;s.forEach(function(i,r){t.currentQueryIndex=r;var s=t.createSubContext(e.options,i);a&&s.delayNextStep(a),i===t.element&&(u=s.currentTimeline),B_(n,e.animation,s),s.currentTimeline.applyStylesToKeyframe(),o=Math.max(o,s.currentTimeline.currentTime)}),t.currentQueryIndex=0,t.currentQueryTotal=0,t.transformIntoNewTimeline(o),u&&(t.currentTimeline.mergeTimelineCollectedStyles(u),t.currentTimeline.snapshotCurrentStyles()),t.previousNode=e}},{key:"visitStagger",value:function(e,t){var n=t.parentContext,i=t.currentTimeline,r=e.timings,a=Math.abs(r.duration),o=a*(t.currentQueryTotal-1),s=a*t.currentQueryIndex;switch(r.duration<0?"reverse":r.easing){case"reverse":s=o-s;break;case"full":s=n.currentStaggerTime}var u=t.currentTimeline;s&&u.delayNextStep(s);var l=u.currentTime;B_(this,e.animation,t),t.previousNode=e,n.currentStaggerTime=i.currentTime-l+(i.startTime-n.currentTimeline.startTime)}}]),e}(),sy={},uy=function(){function e(t,n,i,r,a,o,s,u){v(this,e),this._driver=t,this.element=n,this.subInstructions=i,this._enterClassName=r,this._leaveClassName=a,this.errors=o,this.timelines=s,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=sy,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=u||new ly(this._driver,n,0),s.push(this.currentTimeline)}return g(e,[{key:"updateOptions",value:function(e,t){var n=this;if(e){var i=e,r=this.options;null!=i.duration&&(r.duration=M_(i.duration)),null!=i.delay&&(r.delay=M_(i.delay));var a=i.params;if(a){var o=r.params;o||(o=this.options.params={}),Object.keys(a).forEach(function(e){t&&o.hasOwnProperty(e)||(o[e]=I_(a[e],o,n.errors))})}}}},{key:"_copyOptions",value:function(){var e={};if(this.options){var t=this.options.params;if(t){var n=e.params={};Object.keys(t).forEach(function(e){n[e]=t[e]})}}return e}},{key:"createSubContext",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,n=arguments.length>1?arguments[1]:void 0,i=arguments.length>2?arguments[2]:void 0,r=n||this.element,a=new e(this._driver,r,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(r,i||0));return a.previousNode=this.previousNode,a.currentAnimateTimings=this.currentAnimateTimings,a.options=this._copyOptions(),a.updateOptions(t),a.currentQueryIndex=this.currentQueryIndex,a.currentQueryTotal=this.currentQueryTotal,a.parentContext=this,this.subContextCount++,a}},{key:"transformIntoNewTimeline",value:function(e){return this.previousNode=sy,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline}},{key:"appendInstructionToTimeline",value:function(e,t,n){var i={duration:null!=t?t:e.duration,delay:this.currentTimeline.currentTime+(null!=n?n:0)+e.delay,easing:""},r=new cy(this._driver,e.element,e.keyframes,e.preStyleProps,e.postStyleProps,i,e.stretchStartingKeyframe);return this.timelines.push(r),i}},{key:"incrementTime",value:function(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)}},{key:"delayNextStep",value:function(e){e>0&&this.currentTimeline.delayNextStep(e)}},{key:"invokeQuery",value:function(e,t,n,i,r,a){var o=[];if(i&&o.push(this.element),e.length>0){e=(e=e.replace(iy,"."+this._enterClassName)).replace(ry,"."+this._leaveClassName);var s=this._driver.query(this.element,e,1!=n);0!==n&&(s=n<0?s.slice(s.length+n,s.length):s.slice(0,n)),o.push.apply(o,d(s))}return r||0!=o.length||a.push('`query("'.concat(t,'")` returned zero elements. (Use `query("').concat(t,'", { optional: true })` if you wish to allow this.)')),o}},{key:"params",get:function(){return this.options.params}}]),e}(),ly=function(){function e(t,n,i,r){v(this,e),this._driver=t,this.element=n,this.startTime=i,this._elementTimelineStylesLookup=r,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(n),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(n,this._localTimelineStyles)),this._loadKeyframe()}return g(e,[{key:"containsAnimation",value:function(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}}},{key:"getCurrentStyleProperties",value:function(){return Object.keys(this._currentKeyframe)}},{key:"delayNextStep",value:function(e){var t=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||t?(this.forwardTime(this.currentTime+e),t&&this.snapshotCurrentStyles()):this.startTime+=e}},{key:"fork",value:function(t,n){return this.applyStylesToKeyframe(),new e(this._driver,t,n||this.currentTime,this._elementTimelineStylesLookup)}},{key:"_loadKeyframe",value:function(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))}},{key:"forwardFrame",value:function(){this.duration+=1,this._loadKeyframe()}},{key:"forwardTime",value:function(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()}},{key:"_updateStyle",value:function(e,t){this._localTimelineStyles[e]=t,this._globalTimelineStyles[e]=t,this._styleSummary[e]={time:this.currentTime,value:t}}},{key:"allowOnlyTimelineStyles",value:function(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}},{key:"applyEmptyStep",value:function(e){var t=this;e&&(this._previousKeyframe.easing=e),Object.keys(this._globalTimelineStyles).forEach(function(e){t._backFill[e]=t._globalTimelineStyles[e]||Rv,t._currentKeyframe[e]=Rv}),this._currentEmptyStepKeyframe=this._currentKeyframe}},{key:"setStyles",value:function(e,t,n,i){var r=this;t&&(this._previousKeyframe.easing=t);var a=i&&i.params||{},o=function(e,t){var n,i={};return e.forEach(function(e){"*"===e?(n=n||Object.keys(t)).forEach(function(e){i[e]=Rv}):L_(e,!1,i)}),i}(e,this._globalTimelineStyles);Object.keys(o).forEach(function(e){var t=I_(o[e],a,n);r._pendingStyles[e]=t,r._localTimelineStyles.hasOwnProperty(e)||(r._backFill[e]=r._globalTimelineStyles.hasOwnProperty(e)?r._globalTimelineStyles[e]:Rv),r._updateStyle(e,t)})}},{key:"applyStylesToKeyframe",value:function(){var e=this,t=this._pendingStyles,n=Object.keys(t);0!=n.length&&(this._pendingStyles={},n.forEach(function(n){e._currentKeyframe[n]=t[n]}),Object.keys(this._localTimelineStyles).forEach(function(t){e._currentKeyframe.hasOwnProperty(t)||(e._currentKeyframe[t]=e._localTimelineStyles[t])}))}},{key:"snapshotCurrentStyles",value:function(){var e=this;Object.keys(this._localTimelineStyles).forEach(function(t){var n=e._localTimelineStyles[t];e._pendingStyles[t]=n,e._updateStyle(t,n)})}},{key:"getFinalKeyframe",value:function(){return this._keyframes.get(this.duration)}},{key:"mergeTimelineCollectedStyles",value:function(e){var t=this;Object.keys(e._styleSummary).forEach(function(n){var i=t._styleSummary[n],r=e._styleSummary[n];(!i||r.time>i.time)&&t._updateStyle(n,r.value)})}},{key:"buildKeyframes",value:function(){var e=this;this.applyStylesToKeyframe();var t=new Set,n=new Set,i=1===this._keyframes.size&&0===this.duration,r=[];this._keyframes.forEach(function(a,o){var s=L_(a,!0);Object.keys(s).forEach(function(e){var i=s[e];i==Jv?t.add(e):i==Rv&&n.add(e)}),i||(s.offset=o/e.duration),r.push(s)});var a=t.size?R_(t.values()):[],o=n.size?R_(n.values()):[];if(i){var s=r[0],u=x_(s);s.offset=0,u.offset=1,r=[s,u]}return ty(this.element,r,a,o,this.duration,this.startTime,this.easing,!1)}},{key:"currentTime",get:function(){return this.startTime+this.duration}},{key:"properties",get:function(){var e=[];for(var t in this._currentKeyframe)e.push(t);return e}}]),e}(),cy=function(e){_(n,e);var t=w(n);function n(e,i,r,a,o,s){var u,l=arguments.length>6&&void 0!==arguments[6]&&arguments[6];return v(this,n),(u=t.call(this,e,i,s.delay)).element=i,u.keyframes=r,u.preStyleProps=a,u.postStyleProps=o,u._stretchStartingKeyframe=l,u.timings={duration:s.duration,delay:s.delay,easing:s.easing},u}return g(n,[{key:"containsAnimation",value:function(){return this.keyframes.length>1}},{key:"buildKeyframes",value:function(){var e=this.keyframes,t=this.timings,n=t.delay,i=t.duration,r=t.easing;if(this._stretchStartingKeyframe&&n){var a=[],o=i+n,s=n/o,u=L_(e[0],!1);u.offset=0,a.push(u);var l=L_(e[0],!1);l.offset=dy(s),a.push(l);for(var c=e.length-1,d=1;d<=c;d++){var h=L_(e[d],!1);h.offset=dy((n+h.offset*i)/o),a.push(h)}i=o,n=0,r="",e=a}return ty(this.element,e,this.preStyleProps,this.postStyleProps,i,n,r,!0)}}]),n}(ly);function dy(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=Math.pow(10,t-1);return Math.round(e*n)/n}var hy=function e(){v(this,e)},fy=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"normalizePropertyName",value:function(e,t){return H_(e)}},{key:"normalizeStyleValue",value:function(e,t,n,i){var r="",a=n.toString().trim();if(py[t]&&0!==n&&"0"!==n)if("number"==typeof n)r="px";else{var o=n.match(/^[+-]?[\d\.]+([a-z]*)$/);o&&0==o[1].length&&i.push("Please provide a CSS unit value for ".concat(e,":").concat(n))}return a+r}}]),n}(hy),py=function(){return e="width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(","),t={},e.forEach(function(e){return t[e]=!0}),t;var e,t}();function my(e,t,n,i,r,a,o,s,u,l,c,d,h){return{type:0,element:e,triggerName:t,isRemovalTransition:r,fromState:n,fromStyles:a,toState:i,toStyles:o,timelines:s,queriedElements:u,preStyleProps:l,postStyleProps:c,totalTime:d,errors:h}}var gy={},vy=function(){function e(t,n,i){v(this,e),this._triggerName=t,this.ast=n,this._stateStyles=i}return g(e,[{key:"match",value:function(e,t,n,i){return function(e,t,n,i,r){return e.some(function(e){return e(t,n,i,r)})}(this.ast.matchers,e,t,n,i)}},{key:"buildStyles",value:function(e,t,n){var i=this._stateStyles["*"],r=this._stateStyles[e],a=i?i.buildStyles(t,n):{};return r?r.buildStyles(t,n):a}},{key:"build",value:function(e,t,n,i,r,a,o,s,u,l){var c=[],d=this.ast.options&&this.ast.options.params||gy,h=this.buildStyles(n,o&&o.params||gy,c),f=s&&s.params||gy,p=this.buildStyles(i,f,c),m=new Set,g=new Map,v=new Map,_="void"===i,y={params:Object.assign(Object.assign({},d),f)},b=l?[]:ay(e,t,this.ast.animation,r,a,h,p,y,u,c),w=0;if(b.forEach(function(e){w=Math.max(e.duration+e.delay,w)}),c.length)return my(t,this._triggerName,n,i,_,h,p,[],[],g,v,w,c);b.forEach(function(e){var n=e.element,i=n_(g,n,{});e.preStyleProps.forEach(function(e){return i[e]=!0});var r=n_(v,n,{});e.postStyleProps.forEach(function(e){return r[e]=!0}),n!==t&&m.add(n)});var k=R_(m.values());return my(t,this._triggerName,n,i,_,h,p,b,k,g,v,w)}}]),e}(),_y=function(){function e(t,n){v(this,e),this.styles=t,this.defaultParams=n}return g(e,[{key:"buildStyles",value:function(e,t){var n={},i=x_(this.defaultParams);return Object.keys(e).forEach(function(t){var n=e[t];null!=n&&(i[t]=n)}),this.styles.styles.forEach(function(e){if("string"!=typeof e){var r=e;Object.keys(r).forEach(function(e){var a=r[e];a.length>1&&(a=I_(a,i,t)),n[e]=a})}}),n}}]),e}(),yy=function(){function e(t,n){var i=this;v(this,e),this.name=t,this.ast=n,this.transitionFactories=[],this.states={},n.states.forEach(function(e){i.states[e.name]=new _y(e.style,e.options&&e.options.params||{})}),by(this.states,"true","1"),by(this.states,"false","0"),n.transitions.forEach(function(e){i.transitionFactories.push(new vy(t,e,i.states))}),this.fallbackTransition=new vy(t,{type:1,animation:{type:2,steps:[],options:null},matchers:[function(e,t){return!0}],options:null,queryCount:0,depCount:0},this.states)}return g(e,[{key:"matchTransition",value:function(e,t,n,i){return this.transitionFactories.find(function(r){return r.match(e,t,n,i)})||null}},{key:"matchStyles",value:function(e,t,n){return this.fallbackTransition.buildStyles(e,t,n)}},{key:"containsQueries",get:function(){return this.ast.queryCount>0}}]),e}();function by(e,t,n){e.hasOwnProperty(t)?e.hasOwnProperty(n)||(e[n]=e[t]):e.hasOwnProperty(n)&&(e[t]=e[n])}var wy=new ny,ky=function(){function e(t,n,i){v(this,e),this.bodyNode=t,this._driver=n,this._normalizer=i,this._animations={},this._playersById={},this.players=[]}return g(e,[{key:"register",value:function(e,t){var n=[],i=J_(this._driver,t,n);if(n.length)throw new Error("Unable to build the animation due to the following errors: ".concat(n.join("\n")));this._animations[e]=i}},{key:"_buildPlayer",value:function(e,t,n){var i=e.element,r=Xv(this._driver,this._normalizer,i,e.keyframes,t,n);return this._driver.animate(i,r,e.duration,e.delay,e.easing,[],!0)}},{key:"create",value:function(e,t){var n,i=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=[],o=this._animations[e],s=new Map;if(o?(n=ay(this._driver,t,o,v_,__,{},{},r,wy,a)).forEach(function(e){var t=n_(s,e.element,{});e.postStyleProps.forEach(function(e){return t[e]=null})}):(a.push("The requested animation doesn't exist or has already been destroyed"),n=[]),a.length)throw new Error("Unable to create the animation due to the following errors: ".concat(a.join("\n")));s.forEach(function(e,t){Object.keys(e).forEach(function(n){e[n]=i._driver.computeStyle(t,n,Rv)})});var u=n.map(function(e){var t=s.get(e.element);return i._buildPlayer(e,{},t)}),l=Qv(u);return this._playersById[e]=l,l.onDestroy(function(){return i.destroy(e)}),this.players.push(l),l}},{key:"destroy",value:function(e){var t=this._getPlayer(e);t.destroy(),delete this._playersById[e];var n=this.players.indexOf(t);n>=0&&this.players.splice(n,1)}},{key:"_getPlayer",value:function(e){var t=this._playersById[e];if(!t)throw new Error("Unable to find the timeline player referenced by ".concat(e));return t}},{key:"listen",value:function(e,t,n,i){var r=t_(t,"","","");return $v(this._getPlayer(e),n,r,i),function(){}}},{key:"command",value:function(e,t,n,i){if("register"!=n)if("create"!=n){var r=this._getPlayer(e);switch(n){case"play":r.play();break;case"pause":r.pause();break;case"reset":r.reset();break;case"restart":r.restart();break;case"finish":r.finish();break;case"init":r.init();break;case"setPosition":r.setPosition(parseFloat(i[0]));break;case"destroy":this.destroy(e)}}else this.create(e,t,i[0]||{});else this.register(e,i[0])}}]),e}(),My="ng-animate-queued",Sy="ng-animate-disabled",Cy=".ng-animate-disabled",xy="ng-star-inserted",Ly=[],Ty={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},Dy={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},Oy=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";v(this,e),this.namespaceId=n;var i=t&&t.hasOwnProperty("value"),r=i?t.value:t;if(this.value=Ry(r),i){var a=x_(t);delete a.value,this.options=a}else this.options={};this.options.params||(this.options.params={})}return g(e,[{key:"absorbOptions",value:function(e){var t=e.params;if(t){var n=this.options.params;Object.keys(t).forEach(function(e){null==n[e]&&(n[e]=t[e])})}}},{key:"params",get:function(){return this.options.params}}]),e}(),Ey="void",Py=new Oy(Ey),Ay=function(){function e(t,n,i){v(this,e),this.id=t,this.hostElement=n,this._engine=i,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+t,By(n,this._hostClassName)}return g(e,[{key:"listen",value:function(e,t,n,i){var r,a=this;if(!this._triggers.hasOwnProperty(t))throw new Error('Unable to listen on the animation trigger event "'.concat(n,'" because the animation trigger "').concat(t,"\" doesn't exist!"));if(null==n||0==n.length)throw new Error('Unable to listen on the animation trigger "'.concat(t,'" because the provided event is undefined!'));if("start"!=(r=n)&&"done"!=r)throw new Error('The provided animation trigger event "'.concat(n,'" for the animation trigger "').concat(t,'" is not supported!'));var o=n_(this._elementListeners,e,[]),s={name:t,phase:n,callback:i};o.push(s);var u=n_(this._engine.statesByElement,e,{});return u.hasOwnProperty(t)||(By(e,y_),By(e,"ng-trigger-"+t),u[t]=Py),function(){a._engine.afterFlush(function(){var e=o.indexOf(s);e>=0&&o.splice(e,1),a._triggers[t]||delete u[t]})}}},{key:"register",value:function(e,t){return!this._triggers[e]&&(this._triggers[e]=t,!0)}},{key:"_getTrigger",value:function(e){var t=this._triggers[e];if(!t)throw new Error('The provided animation trigger "'.concat(e,'" has not been registered!'));return t}},{key:"trigger",value:function(e,t,n){var i=this,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=this._getTrigger(t),o=new Iy(this.id,t,e),s=this._engine.statesByElement.get(e);s||(By(e,y_),By(e,"ng-trigger-"+t),this._engine.statesByElement.set(e,s={}));var u=s[t],l=new Oy(n,this.id),c=n&&n.hasOwnProperty("value");!c&&u&&l.absorbOptions(u.options),s[t]=l,u||(u=Py);var d=l.value===Ey;if(d||u.value!==l.value){var h=n_(this._engine.playersByElement,e,[]);h.forEach(function(e){e.namespaceId==i.id&&e.triggerName==t&&e.queued&&e.destroy()});var f=a.matchTransition(u.value,l.value,e,l.params),p=!1;if(!f){if(!r)return;f=a.fallbackTransition,p=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:t,transition:f,fromState:u,toState:l,player:o,isFallbackTransition:p}),p||(By(e,My),o.onStart(function(){Wy(e,My)})),o.onDone(function(){var t=i.players.indexOf(o);t>=0&&i.players.splice(t,1);var n=i._engine.playersByElement.get(e);if(n){var r=n.indexOf(o);r>=0&&n.splice(r,1)}}),this.players.push(o),h.push(o),o}if(!zy(u.params,l.params)){var m=[],g=a.matchStyles(u.value,u.params,m),v=a.matchStyles(l.value,l.params,m);m.length?this._engine.reportError(m):this._engine.afterFlush(function(){E_(e,g),O_(e,v)})}}},{key:"deregister",value:function(e){var t=this;delete this._triggers[e],this._engine.statesByElement.forEach(function(t,n){delete t[e]}),this._elementListeners.forEach(function(n,i){t._elementListeners.set(i,n.filter(function(t){return t.name!=e}))})}},{key:"clearElementCache",value:function(e){this._engine.statesByElement.delete(e),this._elementListeners.delete(e);var t=this._engine.playersByElement.get(e);t&&(t.forEach(function(e){return e.destroy()}),this._engine.playersByElement.delete(e))}},{key:"_signalRemovalForInnerTriggers",value:function(e,t){var n=this,i=this._engine.driver.query(e,b_,!0);i.forEach(function(e){if(!e.__ng_removed){var i=n._engine.fetchNamespacesByElement(e);i.size?i.forEach(function(n){return n.triggerLeaveAnimation(e,t,!1,!0)}):n.clearElementCache(e)}}),this._engine.afterFlushAnimationsDone(function(){return i.forEach(function(e){return n.clearElementCache(e)})})}},{key:"triggerLeaveAnimation",value:function(e,t,n,i){var r=this,a=this._engine.statesByElement.get(e);if(a){var o=[];if(Object.keys(a).forEach(function(t){if(r._triggers[t]){var n=r.trigger(e,t,Ey,i);n&&o.push(n)}}),o.length)return this._engine.markElementAsRemoved(this.id,e,!0,t),n&&Qv(o).onDone(function(){return r._engine.processLeaveNode(e)}),!0}return!1}},{key:"prepareLeaveAnimationListeners",value:function(e){var t=this,n=this._elementListeners.get(e);if(n){var i=new Set;n.forEach(function(n){var r=n.name;if(!i.has(r)){i.add(r);var a=t._triggers[r].fallbackTransition,o=t._engine.statesByElement.get(e)[r]||Py,s=new Oy(Ey),u=new Iy(t.id,r,e);t._engine.totalQueuedPlayers++,t._queue.push({element:e,triggerName:r,transition:a,fromState:o,toState:s,player:u,isFallbackTransition:!0})}})}}},{key:"removeNode",value:function(e,t){var n=this,i=this._engine;if(e.childElementCount&&this._signalRemovalForInnerTriggers(e,t),!this.triggerLeaveAnimation(e,t,!0)){var r=!1;if(i.totalAnimations){var a=i.players.length?i.playersByQueriedElement.get(e):[];if(a&&a.length)r=!0;else for(var o=e;o=o.parentNode;)if(i.statesByElement.get(o)){r=!0;break}}if(this.prepareLeaveAnimationListeners(e),r)i.markElementAsRemoved(this.id,e,!1,t);else{var s=e.__ng_removed;s&&s!==Ty||(i.afterFlush(function(){return n.clearElementCache(e)}),i.destroyInnerAnimations(e),i._onRemovalComplete(e,t))}}}},{key:"insertNode",value:function(e,t){By(e,this._hostClassName)}},{key:"drainQueuedTransitions",value:function(e){var t=this,n=[];return this._queue.forEach(function(i){var r=i.player;if(!r.destroyed){var a=i.element,o=t._elementListeners.get(a);o&&o.forEach(function(t){if(t.name==i.triggerName){var n=t_(a,i.triggerName,i.fromState.value,i.toState.value);n._data=e,$v(i.player,t.phase,n,t.callback)}}),r.markedForDestroy?t._engine.afterFlush(function(){r.destroy()}):n.push(i)}}),this._queue=[],n.sort(function(e,n){var i=e.transition.ast.depCount,r=n.transition.ast.depCount;return 0==i||0==r?i-r:t._engine.driver.containsElement(e.element,n.element)?1:-1})}},{key:"destroy",value:function(e){this.players.forEach(function(e){return e.destroy()}),this._signalRemovalForInnerTriggers(this.hostElement,e)}},{key:"elementContainsData",value:function(e){var t=!1;return this._elementListeners.has(e)&&(t=!0),!!this._queue.find(function(t){return t.element===e})||t}}]),e}(),Yy=function(){function e(t,n,i){v(this,e),this.bodyNode=t,this.driver=n,this._normalizer=i,this.players=[],this.newHostElements=new Map,this.playersByElement=new Map,this.playersByQueriedElement=new Map,this.statesByElement=new Map,this.disabledNodes=new Set,this.totalAnimations=0,this.totalQueuedPlayers=0,this._namespaceLookup={},this._namespaceList=[],this._flushFns=[],this._whenQuietFns=[],this.namespacesByHostElement=new Map,this.collectedEnterElements=[],this.collectedLeaveElements=[],this.onRemovalComplete=function(e,t){}}return g(e,[{key:"_onRemovalComplete",value:function(e,t){this.onRemovalComplete(e,t)}},{key:"createNamespace",value:function(e,t){var n=new Ay(e,t,this);return t.parentNode?this._balanceNamespaceList(n,t):(this.newHostElements.set(t,n),this.collectEnterElement(t)),this._namespaceLookup[e]=n}},{key:"_balanceNamespaceList",value:function(e,t){var n=this._namespaceList.length-1;if(n>=0){for(var i=!1,r=n;r>=0;r--)if(this.driver.containsElement(this._namespaceList[r].hostElement,t)){this._namespaceList.splice(r+1,0,e),i=!0;break}i||this._namespaceList.splice(0,0,e)}else this._namespaceList.push(e);return this.namespacesByHostElement.set(t,e),e}},{key:"register",value:function(e,t){var n=this._namespaceLookup[e];return n||(n=this.createNamespace(e,t)),n}},{key:"registerTrigger",value:function(e,t,n){var i=this._namespaceLookup[e];i&&i.register(t,n)&&this.totalAnimations++}},{key:"destroy",value:function(e,t){var n=this;if(e){var i=this._fetchNamespace(e);this.afterFlush(function(){n.namespacesByHostElement.delete(i.hostElement),delete n._namespaceLookup[e];var t=n._namespaceList.indexOf(i);t>=0&&n._namespaceList.splice(t,1)}),this.afterFlushAnimationsDone(function(){return i.destroy(t)})}}},{key:"_fetchNamespace",value:function(e){return this._namespaceLookup[e]}},{key:"fetchNamespacesByElement",value:function(e){var t=new Set,n=this.statesByElement.get(e);if(n)for(var i=Object.keys(n),r=0;r=0&&this.collectedLeaveElements.splice(a,1)}if(e){var o=this._fetchNamespace(e);o&&o.insertNode(t,n)}i&&this.collectEnterElement(t)}}},{key:"collectEnterElement",value:function(e){this.collectedEnterElements.push(e)}},{key:"markElementAsDisabled",value:function(e,t){t?this.disabledNodes.has(e)||(this.disabledNodes.add(e),By(e,Sy)):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),Wy(e,Sy))}},{key:"removeNode",value:function(e,t,n,i){if(Fy(t)){var r=e?this._fetchNamespace(e):null;if(r?r.removeNode(t,i):this.markElementAsRemoved(e,t,!1,i),n){var a=this.namespacesByHostElement.get(t);a&&a.id!==e&&a.removeNode(t,i)}}else this._onRemovalComplete(t,i)}},{key:"markElementAsRemoved",value:function(e,t,n,i){this.collectedLeaveElements.push(t),t.__ng_removed={namespaceId:e,setForRemoval:i,hasAnimation:n,removedBeforeQueried:!1}}},{key:"listen",value:function(e,t,n,i,r){return Fy(t)?this._fetchNamespace(e).listen(t,n,i,r):function(){}}},{key:"_buildInstruction",value:function(e,t,n,i,r){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,n,i,e.fromState.options,e.toState.options,t,r)}},{key:"destroyInnerAnimations",value:function(e){var t=this,n=this.driver.query(e,b_,!0);n.forEach(function(e){return t.destroyActiveAnimationsForElement(e)}),0!=this.playersByQueriedElement.size&&(n=this.driver.query(e,k_,!0)).forEach(function(e){return t.finishActiveQueriedAnimationOnElement(e)})}},{key:"destroyActiveAnimationsForElement",value:function(e){var t=this.playersByElement.get(e);t&&t.forEach(function(e){e.queued?e.markedForDestroy=!0:e.destroy()})}},{key:"finishActiveQueriedAnimationOnElement",value:function(e){var t=this.playersByQueriedElement.get(e);t&&t.forEach(function(e){return e.finish()})}},{key:"whenRenderingDone",value:function(){var e=this;return new Promise(function(t){if(e.players.length)return Qv(e.players).onDone(function(){return t()});t()})}},{key:"processLeaveNode",value:function(e){var t=this,n=e.__ng_removed;if(n&&n.setForRemoval){if(e.__ng_removed=Ty,n.namespaceId){this.destroyInnerAnimations(e);var i=this._fetchNamespace(n.namespaceId);i&&i.clearElementCache(e)}this._onRemovalComplete(e,n.setForRemoval)}this.driver.matchesElement(e,Cy)&&this.markElementAsDisabled(e,!1),this.driver.query(e,Cy,!0).forEach(function(e){t.markElementAsDisabled(e,!1)})}},{key:"flush",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1,n=[];if(this.newHostElements.size&&(this.newHostElements.forEach(function(t,n){return e._balanceNamespaceList(t,n)}),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(var i=0;i=0;L--)this._namespaceList[L].drainQueuedTransitions(t).forEach(function(e){var t=e.player,a=e.element;if(C.push(t),n.collectedEnterElements.length){var c=a.__ng_removed;if(c&&c.setForMove)return void t.destroy()}var d=!h||!n.driver.containsElement(h,a),f=M.get(a),p=m.get(a),g=n._buildInstruction(e,i,p,f,d);if(g.errors&&g.errors.length)x.push(g);else{if(d)return t.onStart(function(){return E_(a,g.fromStyles)}),t.onDestroy(function(){return O_(a,g.toStyles)}),void r.push(t);if(e.isFallbackTransition)return t.onStart(function(){return E_(a,g.fromStyles)}),t.onDestroy(function(){return O_(a,g.toStyles)}),void r.push(t);g.timelines.forEach(function(e){return e.stretchStartingKeyframe=!0}),i.append(a,g.timelines),o.push({instruction:g,player:t,element:a}),g.queriedElements.forEach(function(e){return n_(s,e,[]).push(t)}),g.preStyleProps.forEach(function(e,t){var n=Object.keys(e);if(n.length){var i=u.get(t);i||u.set(t,i=new Set),n.forEach(function(e){return i.add(e)})}}),g.postStyleProps.forEach(function(e,t){var n=Object.keys(e),i=l.get(t);i||l.set(t,i=new Set),n.forEach(function(e){return i.add(e)})})}});if(x.length){var T=[];x.forEach(function(e){T.push("@".concat(e.triggerName," has failed due to:\n")),e.errors.forEach(function(e){return T.push("- ".concat(e,"\n"))})}),C.forEach(function(e){return e.destroy()}),this.reportError(T)}var D=new Map,O=new Map;o.forEach(function(e){var t=e.element;i.has(t)&&(O.set(t,t),n._beforeAnimationBuild(e.player.namespaceId,e.instruction,D))}),r.forEach(function(e){var t=e.element;n._getPreviousPlayers(t,!1,e.namespaceId,e.triggerName,null).forEach(function(e){n_(D,t,[]).push(e),e.destroy()})});var E=v.filter(function(e){return qy(e,u,l)}),P=new Map;jy(P,this.driver,y,l,Rv).forEach(function(e){qy(e,u,l)&&E.push(e)});var A=new Map;p.forEach(function(e,t){jy(A,n.driver,new Set(e),u,Jv)}),E.forEach(function(e){var t=P.get(e),n=A.get(e);P.set(e,Object.assign(Object.assign({},t),n))});var Y=[],I=[],R={};o.forEach(function(e){var t=e.element,o=e.player,s=e.instruction;if(i.has(t)){if(c.has(t))return o.onDestroy(function(){return O_(t,s.toStyles)}),o.disabled=!0,o.overrideTotalTime(s.totalTime),void r.push(o);var u=R;if(O.size>1){for(var l=t,d=[];l=l.parentNode;){var h=O.get(l);if(h){u=h;break}d.push(l)}d.forEach(function(e){return O.set(e,u)})}var f=n._buildAnimation(o.namespaceId,s,D,a,A,P);if(o.setRealPlayer(f),u===R)Y.push(o);else{var p=n.playersByElement.get(u);p&&p.length&&(o.parentPlayer=Qv(p)),r.push(o)}}else E_(t,s.fromStyles),o.onDestroy(function(){return O_(t,s.toStyles)}),I.push(o),c.has(t)&&r.push(o)}),I.forEach(function(e){var t=a.get(e.element);if(t&&t.length){var n=Qv(t);e.setRealPlayer(n)}}),r.forEach(function(e){e.parentPlayer?e.syncPlayerEvents(e.parentPlayer):e.destroy()});for(var F=0;F0?this.driver.animate(e.element,t,e.duration,e.delay,e.easing,n):new Gv(e.duration,e.delay)}},{key:"queuedPlayers",get:function(){var e=[];return this._namespaceList.forEach(function(t){t.players.forEach(function(t){t.queued&&e.push(t)})}),e}}]),e}(),Iy=function(){function e(t,n,i){v(this,e),this.namespaceId=t,this.triggerName=n,this.element=i,this._player=new Gv,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1,this.disabled=!1,this.queued=!0,this.totalTime=0}return g(e,[{key:"setRealPlayer",value:function(e){var t=this;this._containsRealPlayer||(this._player=e,Object.keys(this._queuedCallbacks).forEach(function(n){t._queuedCallbacks[n].forEach(function(t){return $v(e,n,void 0,t)})}),this._queuedCallbacks={},this._containsRealPlayer=!0,this.overrideTotalTime(e.totalTime),this.queued=!1)}},{key:"getRealPlayer",value:function(){return this._player}},{key:"overrideTotalTime",value:function(e){this.totalTime=e}},{key:"syncPlayerEvents",value:function(e){var t=this,n=this._player;n.triggerCallback&&e.onStart(function(){return n.triggerCallback("start")}),e.onDone(function(){return t.finish()}),e.onDestroy(function(){return t.destroy()})}},{key:"_queueEvent",value:function(e,t){n_(this._queuedCallbacks,e,[]).push(t)}},{key:"onDone",value:function(e){this.queued&&this._queueEvent("done",e),this._player.onDone(e)}},{key:"onStart",value:function(e){this.queued&&this._queueEvent("start",e),this._player.onStart(e)}},{key:"onDestroy",value:function(e){this.queued&&this._queueEvent("destroy",e),this._player.onDestroy(e)}},{key:"init",value:function(){this._player.init()}},{key:"hasStarted",value:function(){return!this.queued&&this._player.hasStarted()}},{key:"play",value:function(){!this.queued&&this._player.play()}},{key:"pause",value:function(){!this.queued&&this._player.pause()}},{key:"restart",value:function(){!this.queued&&this._player.restart()}},{key:"finish",value:function(){this._player.finish()}},{key:"destroy",value:function(){this.destroyed=!0,this._player.destroy()}},{key:"reset",value:function(){!this.queued&&this._player.reset()}},{key:"setPosition",value:function(e){this.queued||this._player.setPosition(e)}},{key:"getPosition",value:function(){return this.queued?0:this._player.getPosition()}},{key:"triggerCallback",value:function(e){var t=this._player;t.triggerCallback&&t.triggerCallback(e)}}]),e}();function Ry(e){return null!=e?e:null}function Fy(e){return e&&1===e.nodeType}function Hy(e,t){var n=e.style.display;return e.style.display=null!=t?t:"none",n}function jy(e,t,n,i,r){var a=[];n.forEach(function(e){return a.push(Hy(e))});var o=[];i.forEach(function(n,i){var a={};n.forEach(function(e){var n=a[e]=t.computeStyle(i,e,r);n&&0!=n.length||(i.__ng_removed=Dy,o.push(i))}),e.set(i,a)});var s=0;return n.forEach(function(e){return Hy(e,a[s++])}),o}function Ny(e,t){var n=new Map;if(e.forEach(function(e){return n.set(e,[])}),0==t.length)return n;var i=new Set(t),r=new Map;function a(e){if(!e)return 1;var t=r.get(e);if(t)return t;var o=e.parentNode;return t=n.has(o)?o:i.has(o)?1:a(o),r.set(e,t),t}return t.forEach(function(e){var t=a(e);1!==t&&n.get(t).push(e)}),n}function By(e,t){if(e.classList)e.classList.add(t);else{var n=e.$$classes;n||(n=e.$$classes={}),n[t]=!0}}function Wy(e,t){if(e.classList)e.classList.remove(t);else{var n=e.$$classes;n&&delete n[t]}}function Vy(e,t,n){Qv(n).onDone(function(){return e.processLeaveNode(t)})}function Uy(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:-1;this._transitionEngine.flush(e)}},{key:"whenRenderingDone",value:function(){return this._transitionEngine.whenRenderingDone()}},{key:"players",get:function(){return this._transitionEngine.players.concat(this._timelineEngine.players)}}]),e}();function Ky(e,t){var n=null,i=null;return Array.isArray(t)&&t.length?(n=Zy(t[0]),t.length>1&&(i=Zy(t[t.length-1]))):t&&(n=Zy(t)),n||i?new Jy(e,n,i):null}var Jy=function(){var e=function(){function e(t,n,i){v(this,e),this._element=t,this._startStyles=n,this._endStyles=i,this._state=0;var r=e.initialStylesByElement.get(t);r||e.initialStylesByElement.set(t,r={}),this._initialStyles=r}return g(e,[{key:"start",value:function(){this._state<1&&(this._startStyles&&O_(this._element,this._startStyles,this._initialStyles),this._state=1)}},{key:"finish",value:function(){this.start(),this._state<2&&(O_(this._element,this._initialStyles),this._endStyles&&(O_(this._element,this._endStyles),this._endStyles=null),this._state=1)}},{key:"destroy",value:function(){this.finish(),this._state<3&&(e.initialStylesByElement.delete(this._element),this._startStyles&&(E_(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(E_(this._element,this._endStyles),this._endStyles=null),O_(this._element,this._initialStyles),this._state=3)}}]),e}();return e.initialStylesByElement=new WeakMap,e}();function Zy(e){for(var t=null,n=Object.keys(e),i=0;i=this._delay&&n>=this._duration&&this.finish()}},{key:"finish",value:function(){this._finished||(this._finished=!0,this._onDoneFn(),rb(this._element,this._eventFn,!0))}},{key:"destroy",value:function(){var e,t,n,i;this._destroyed||(this._destroyed=!0,this.finish(),t=this._name,(i=ib(n=ob(e=this._element,"").split(","),t))>=0&&(n.splice(i,1),ab(e,"",n.join(","))))}}]),e}();function tb(e,t,n){ab(e,"PlayState",n,nb(e,t))}function nb(e,t){var n=ob(e,"");return n.indexOf(",")>0?ib(n.split(","),t):ib([n],t)}function ib(e,t){for(var n=0;n=0)return n;return-1}function rb(e,t,n){n?e.removeEventListener($y,t):e.addEventListener($y,t)}function ab(e,t,n,i){var r=Xy+t;if(null!=i){var a=e.style[r];if(a.length){var o=a.split(",");o[i]=n,n=o.join(",")}}e.style[r]=n}function ob(e,t){return e.style[Xy+t]||""}var sb=function(){function e(t,n,i,r,a,o,s,u){v(this,e),this.element=t,this.keyframes=n,this.animationName=i,this._duration=r,this._delay=a,this._finalStyles=s,this._specialStyles=u,this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this.currentSnapshot={},this._state=0,this.easing=o||"linear",this.totalTime=r+a,this._buildStyler()}return g(e,[{key:"onStart",value:function(e){this._onStartFns.push(e)}},{key:"onDone",value:function(e){this._onDoneFns.push(e)}},{key:"onDestroy",value:function(e){this._onDestroyFns.push(e)}},{key:"destroy",value:function(){this.init(),this._state>=4||(this._state=4,this._styler.destroy(),this._flushStartFns(),this._flushDoneFns(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])}},{key:"_flushDoneFns",value:function(){this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[]}},{key:"_flushStartFns",value:function(){this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[]}},{key:"finish",value:function(){this.init(),this._state>=3||(this._state=3,this._styler.finish(),this._flushStartFns(),this._specialStyles&&this._specialStyles.finish(),this._flushDoneFns())}},{key:"setPosition",value:function(e){this._styler.setPosition(e)}},{key:"getPosition",value:function(){return this._styler.getPosition()}},{key:"hasStarted",value:function(){return this._state>=2}},{key:"init",value:function(){this._state>=1||(this._state=1,this._styler.apply(),this._delay&&this._styler.pause())}},{key:"play",value:function(){this.init(),this.hasStarted()||(this._flushStartFns(),this._state=2,this._specialStyles&&this._specialStyles.start()),this._styler.resume()}},{key:"pause",value:function(){this.init(),this._styler.pause()}},{key:"restart",value:function(){this.reset(),this.play()}},{key:"reset",value:function(){this._styler.destroy(),this._buildStyler(),this._styler.apply()}},{key:"_buildStyler",value:function(){var e=this;this._styler=new eb(this.element,this.animationName,this._duration,this._delay,this.easing,"forwards",function(){return e.finish()})}},{key:"triggerCallback",value:function(e){var t="start"==e?this._onStartFns:this._onDoneFns;t.forEach(function(e){return e()}),t.length=0}},{key:"beforeDestroy",value:function(){var e=this;this.init();var t={};if(this.hasStarted()){var n=this._state>=3;Object.keys(this._finalStyles).forEach(function(i){"offset"!=i&&(t[i]=n?e._finalStyles[i]:W_(e.element,i))})}this.currentSnapshot=t}}]),e}(),ub=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this)).element=e,r._startingStyles={},r.__initialized=!1,r._styles=p_(i),r}return g(n,[{key:"init",value:function(){var e=this;!this.__initialized&&this._startingStyles&&(this.__initialized=!0,Object.keys(this._styles).forEach(function(t){e._startingStyles[t]=e.element.style[t]}),r(i(n.prototype),"init",this).call(this))}},{key:"play",value:function(){var e=this;this._startingStyles&&(this.init(),Object.keys(this._styles).forEach(function(t){return e.element.style.setProperty(t,e._styles[t])}),r(i(n.prototype),"play",this).call(this))}},{key:"destroy",value:function(){var e=this;this._startingStyles&&(Object.keys(this._startingStyles).forEach(function(t){var n=e._startingStyles[t];n?e.element.style.setProperty(t,n):e.element.style.removeProperty(t)}),this._startingStyles=null,r(i(n.prototype),"destroy",this).call(this))}}]),n}(Gv),lb="gen_css_kf_",cb=function(){function e(){v(this,e),this._count=0,this._head=document.querySelector("head")}return g(e,[{key:"validateStyleProperty",value:function(e){return c_(e)}},{key:"matchesElement",value:function(e,t){return d_(e,t)}},{key:"containsElement",value:function(e,t){return h_(e,t)}},{key:"query",value:function(e,t,n){return f_(e,t,n)}},{key:"computeStyle",value:function(e,t,n){return window.getComputedStyle(e)[t]}},{key:"buildKeyframeElement",value:function(e,t,n){n=n.map(function(e){return p_(e)});var i="@keyframes ".concat(t," {\n"),r="";n.forEach(function(e){r=" ";var t=parseFloat(e.offset);i+="".concat(r).concat(100*t,"% {\n"),r+=" ",Object.keys(e).forEach(function(t){var n=e[t];switch(t){case"offset":return;case"easing":return void(n&&(i+="".concat(r,"animation-timing-function: ").concat(n,";\n")));default:return void(i+="".concat(r).concat(t,": ").concat(n,";\n"))}}),i+="".concat(r,"}\n")}),i+="}\n";var a=document.createElement("style");return a.textContent=i,a}},{key:"animate",value:function(e,t,n,i,r){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:[],o=a.filter(function(e){return e instanceof sb}),s={};j_(n,i)&&o.forEach(function(e){var t=e.currentSnapshot;Object.keys(t).forEach(function(e){return s[e]=t[e]})});var u=db(t=N_(e,t,s));if(0==n)return new ub(e,u);var l="".concat(lb).concat(this._count++),c=this.buildKeyframeElement(e,l,t);document.querySelector("head").appendChild(c);var d=Ky(e,t),h=new sb(e,t,l,n,i,r,u,d);return h.onDestroy(function(){return hb(c)}),h}}]),e}();function db(e){var t={};return e&&(Array.isArray(e)?e:[e]).forEach(function(e){Object.keys(e).forEach(function(n){"offset"!=n&&"easing"!=n&&(t[n]=e[n])})}),t}function hb(e){e.parentNode.removeChild(e)}var fb=function(){function e(t,n,i,r){v(this,e),this.element=t,this.keyframes=n,this.options=i,this._specialStyles=r,this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._initialized=!1,this._finished=!1,this._started=!1,this._destroyed=!1,this.time=0,this.parentPlayer=null,this.currentSnapshot={},this._duration=i.duration,this._delay=i.delay||0,this.time=this._duration+this._delay}return g(e,[{key:"_onFinish",value:function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])}},{key:"init",value:function(){this._buildPlayer(),this._preparePlayerBeforeStart()}},{key:"_buildPlayer",value:function(){var e=this;if(!this._initialized){this._initialized=!0;var t=this.keyframes;this.domPlayer=this._triggerWebAnimation(this.element,t,this.options),this._finalKeyframe=t.length?t[t.length-1]:{},this.domPlayer.addEventListener("finish",function(){return e._onFinish()})}}},{key:"_preparePlayerBeforeStart",value:function(){this._delay?this._resetDomPlayerState():this.domPlayer.pause()}},{key:"_triggerWebAnimation",value:function(e,t,n){return e.animate(t,n)}},{key:"onStart",value:function(e){this._onStartFns.push(e)}},{key:"onDone",value:function(e){this._onDoneFns.push(e)}},{key:"onDestroy",value:function(e){this._onDestroyFns.push(e)}},{key:"play",value:function(){this._buildPlayer(),this.hasStarted()||(this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),this.domPlayer.play()}},{key:"pause",value:function(){this.init(),this.domPlayer.pause()}},{key:"finish",value:function(){this.init(),this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish()}},{key:"reset",value:function(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1}},{key:"_resetDomPlayerState",value:function(){this.domPlayer&&this.domPlayer.cancel()}},{key:"restart",value:function(){this.reset(),this.play()}},{key:"hasStarted",value:function(){return this._started}},{key:"destroy",value:function(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])}},{key:"setPosition",value:function(e){this.domPlayer.currentTime=e*this.time}},{key:"getPosition",value:function(){return this.domPlayer.currentTime/this.time}},{key:"beforeDestroy",value:function(){var e=this,t={};this.hasStarted()&&Object.keys(this._finalKeyframe).forEach(function(n){"offset"!=n&&(t[n]=e._finished?e._finalKeyframe[n]:W_(e.element,n))}),this.currentSnapshot=t}},{key:"triggerCallback",value:function(e){var t="start"==e?this._onStartFns:this._onDoneFns;t.forEach(function(e){return e()}),t.length=0}},{key:"totalTime",get:function(){return this._delay+this._duration}}]),e}(),pb=function(){function e(){v(this,e),this._isNativeImpl=/\{\s*\[native\s+code\]\s*\}/.test(mb().toString()),this._cssKeyframesDriver=new cb}return g(e,[{key:"validateStyleProperty",value:function(e){return c_(e)}},{key:"matchesElement",value:function(e,t){return d_(e,t)}},{key:"containsElement",value:function(e,t){return h_(e,t)}},{key:"query",value:function(e,t,n){return f_(e,t,n)}},{key:"computeStyle",value:function(e,t,n){return window.getComputedStyle(e)[t]}},{key:"overrideWebAnimationsSupport",value:function(e){this._isNativeImpl=e}},{key:"animate",value:function(e,t,n,i,r){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:[],o=arguments.length>6?arguments[6]:void 0,s=!o&&!this._isNativeImpl;if(s)return this._cssKeyframesDriver.animate(e,t,n,i,r,a);var u=0==i?"both":"forwards",l={duration:n,delay:i,fill:u};r&&(l.easing=r);var c={},d=a.filter(function(e){return e instanceof fb});j_(n,i)&&d.forEach(function(e){var t=e.currentSnapshot;Object.keys(t).forEach(function(e){return c[e]=t[e]})});var h=Ky(e,t=N_(e,t=t.map(function(e){return L_(e,!1)}),c));return new fb(e,t,l,h)}}]),e}();function mb(){return"undefined"!=typeof window&&void 0!==window.document&&Element.prototype.animate||{}}var gb=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this))._nextAnimationId=0,r._renderer=e.createRenderer(i.body,{id:"0",encapsulation:Ge.None,styles:[],data:{animation:[]}}),r}return g(n,[{key:"build",value:function(e){var t=this._nextAnimationId.toString();this._nextAnimationId++;var n=Array.isArray(e)?jv(e):e;return yb(this._renderer,null,t,"register",[n]),new vb(t,this._renderer)}}]),n}(Yv);return e.\u0275fac=function(t){return new(t||e)(Gi(Nu),Gi(Md))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),vb=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this))._id=e,r._renderer=i,r}return g(n,[{key:"create",value:function(e,t){return new _b(this._id,e,t||{},this._renderer)}}]),n}(Iv),_b=function(){function e(t,n,i,r){v(this,e),this.id=t,this.element=n,this._renderer=r,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",i)}return g(e,[{key:"_listen",value:function(e,t){return this._renderer.listen(this.element,"@@".concat(this.id,":").concat(e),t)}},{key:"_command",value:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i=0&&e3&&void 0!==arguments[3])||arguments[3];this.delegate.insertBefore(e,t,n),this.engine.onInsert(this.namespaceId,t,e,i)}},{key:"removeChild",value:function(e,t,n){this.engine.onRemove(this.namespaceId,t,this.delegate,n)}},{key:"selectRootElement",value:function(e,t){return this.delegate.selectRootElement(e,t)}},{key:"parentNode",value:function(e){return this.delegate.parentNode(e)}},{key:"nextSibling",value:function(e){return this.delegate.nextSibling(e)}},{key:"setAttribute",value:function(e,t,n,i){this.delegate.setAttribute(e,t,n,i)}},{key:"removeAttribute",value:function(e,t,n){this.delegate.removeAttribute(e,t,n)}},{key:"addClass",value:function(e,t){this.delegate.addClass(e,t)}},{key:"removeClass",value:function(e,t){this.delegate.removeClass(e,t)}},{key:"setStyle",value:function(e,t,n,i){this.delegate.setStyle(e,t,n,i)}},{key:"removeStyle",value:function(e,t,n){this.delegate.removeStyle(e,t,n)}},{key:"setProperty",value:function(e,t,n){t.charAt(0)==bb&&t==wb?this.disableAnimations(e,!!n):this.delegate.setProperty(e,t,n)}},{key:"setValue",value:function(e,t){this.delegate.setValue(e,t)}},{key:"listen",value:function(e,t,n){return this.delegate.listen(e,t,n)}},{key:"disableAnimations",value:function(e,t){this.engine.disableAnimations(e,t)}},{key:"data",get:function(){return this.delegate.data}}]),e}(),Sb=function(e){_(n,e);var t=w(n);function n(e,i,r,a){var o;return v(this,n),(o=t.call(this,i,r,a)).factory=e,o.namespaceId=i,o}return g(n,[{key:"setProperty",value:function(e,t,n){t.charAt(0)==bb?"."==t.charAt(1)&&t==wb?this.disableAnimations(e,n=void 0===n||!!n):this.engine.process(this.namespaceId,e,t.substr(1),n):this.delegate.setProperty(e,t,n)}},{key:"listen",value:function(e,t,n){var i,r,a=this;if(t.charAt(0)==bb){var o=function(e){switch(e){case"body":return document.body;case"document":return document;case"window":return window;default:return e}}(e),s=t.substr(1),l="";if(s.charAt(0)!=bb){var c=u((r=(i=s).indexOf("."),[i.substring(0,r),i.substr(r+1)]),2);s=c[0],l=c[1]}return this.engine.listen(this.namespaceId,o,s,l,function(e){a.factory.scheduleListenerCallback(e._data||-1,n,e)})}return this.delegate.listen(e,t,n)}}]),n}(Mb),Cb=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r){return v(this,n),t.call(this,e.body,i,r)}return n}(Gy);return e.\u0275fac=function(t){return new(t||e)(Gi(Md),Gi(g_),Gi(hy))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),xb=new Si("AnimationModuleType"),Lb=[{provide:Yv,useClass:gb},{provide:hy,useFactory:function(){return new fy}},{provide:Gy,useClass:Cb},{provide:Nu,useFactory:function(e,t,n){return new kb(e,t,n)},deps:[ef,Gy,Nc]}],Tb=([{provide:g_,useFactory:function(){return"function"==typeof mb()?new pb:new cb}},{provide:xb,useValue:"BrowserAnimations"}].concat(Lb),[{provide:g_,useClass:m_},{provide:xb,useValue:"NoopAnimations"}].concat(Lb)),Db=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:Tb,imports:[mf]}),e}(),Ob=["*",[["mat-option"],["ng-container"]]],Eb=["*","mat-option, ng-container"];function Pb(e,t){if(1&e&&bs(0,"mat-pseudo-checkbox",3),2&e){var n=As();gs("state",n.selected?"checked":"unchecked")("disabled",n.disabled)}}var Ab=["*"],Yb=new Uu("11.0.3"),Ib=new Si("mat-sanity-checks",{providedIn:"root",factory:function(){return!0}}),Rb=function(){var e=function(){function e(t,n,i){v(this,e),this._hasDoneGlobalChecks=!1,this._document=i,t._applyBodyHighContrastModeCssClasses(),this._sanityChecks=n,this._hasDoneGlobalChecks||(this._checkDoctypeIsDefined(),this._checkThemeIsPresent(),this._checkCdkVersionMatch(),this._hasDoneGlobalChecks=!0)}return g(e,[{key:"_getWindow",value:function(){var e=this._document.defaultView||window;return"object"==typeof e&&e?e:null}},{key:"_checksAreEnabled",value:function(){return $c()&&!this._isTestEnv()}},{key:"_isTestEnv",value:function(){var e=this._getWindow();return e&&(e.__karma__||e.jasmine)}},{key:"_checkDoctypeIsDefined",value:function(){this._checksAreEnabled()&&(!0===this._sanityChecks||this._sanityChecks.doctype)&&!this._document.doctype&&console.warn("Current document does not have a doctype. This may cause some Angular Material components not to behave as expected.")}},{key:"_checkThemeIsPresent",value:function(){if(this._checksAreEnabled()&&!1!==this._sanityChecks&&this._sanityChecks.theme&&this._document.body&&"function"==typeof getComputedStyle){var e=this._document.createElement("div");e.classList.add("mat-theme-loaded-marker"),this._document.body.appendChild(e);var t=getComputedStyle(e);t&&"none"!==t.display&&console.warn("Could not find Angular Material core theme. Most Material components may not work as expected. For more info refer to the theming guide: https://material.angular.io/guide/theming"),this._document.body.removeChild(e)}}},{key:"_checkCdkVersionMatch",value:function(){this._checksAreEnabled()&&(!0===this._sanityChecks||this._sanityChecks.version)&&Yb.full!==Av.full&&console.warn("The Angular Material version ("+Yb.full+") does not match the Angular CDK version ("+Av.full+").\nPlease ensure the versions of these two packages exactly match.")}}]),e}();return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)(Gi(Ev),Gi(Ib,8),Gi(Md))},imports:[[Km],Km]}),e}();function Fb(e){return function(e){_(n,e);var t=w(n);function n(){var e;v(this,n);for(var i=arguments.length,r=new Array(i),a=0;a1&&void 0!==arguments[1]?arguments[1]:0,n=function(e){_(i,e);var n=w(i);function i(){var e;v(this,i);for(var r=arguments.length,a=new Array(r),o=0;o2&&void 0!==arguments[2]?arguments[2]:{},r=this._containerRect=this._containerRect||this._containerElement.getBoundingClientRect(),a=Object.assign(Object.assign({},zb),i.animation);i.centered&&(e=r.left+r.width/2,t=r.top+r.height/2);var o=i.radius||Qb(e,t,r),s=e-r.left,u=t-r.top,l=a.enterDuration,c=document.createElement("div");c.classList.add("mat-ripple-element"),c.style.left="".concat(s-o,"px"),c.style.top="".concat(u-o,"px"),c.style.height="".concat(2*o,"px"),c.style.width="".concat(2*o,"px"),null!=i.color&&(c.style.backgroundColor=i.color),c.style.transitionDuration="".concat(l,"ms"),this._containerElement.appendChild(c),Zb(c),c.style.transform="scale(1)";var d=new Ub(this,c,i);return d.state=0,this._activeRipples.add(d),i.persistent||(this._mostRecentTransientRipple=d),this._runTimeoutOutsideZone(function(){var e=d===n._mostRecentTransientRipple;d.state=1,i.persistent||e&&n._isPointerDown||d.fadeOut()},l),d}},{key:"fadeOutRipple",value:function(e){var t=this._activeRipples.delete(e);if(e===this._mostRecentTransientRipple&&(this._mostRecentTransientRipple=null),this._activeRipples.size||(this._containerRect=null),t){var n=e.element,i=Object.assign(Object.assign({},zb),e.config.animation);n.style.transitionDuration="".concat(i.exitDuration,"ms"),n.style.opacity="0",e.state=2,this._runTimeoutOutsideZone(function(){e.state=3,n.parentNode.removeChild(n)},i.exitDuration)}}},{key:"fadeOutAll",value:function(){this._activeRipples.forEach(function(e){return e.fadeOut()})}},{key:"setupTriggerEvents",value:function(e){var t=im(e);t&&t!==this._triggerElement&&(this._removeTriggerEvents(),this._triggerElement=t,this._registerEvents(Gb))}},{key:"handleEvent",value:function(e){"mousedown"===e.type?this._onMousedown(e):"touchstart"===e.type?this._onTouchStart(e):this._onPointerUp(),this._pointerUpEventsRegistered||(this._registerEvents(Kb),this._pointerUpEventsRegistered=!0)}},{key:"_onMousedown",value:function(e){var t=Mv(e),n=this._lastTouchStartEvent&&Date.now()1&&void 0!==arguments[1]?arguments[1]:0;this._ngZone.runOutsideAngular(function(){return setTimeout(e,t)})}},{key:"_registerEvents",value:function(e){var t=this;this._ngZone.runOutsideAngular(function(){e.forEach(function(e){t._triggerElement.addEventListener(e,t,qb)})})}},{key:"_removeTriggerEvents",value:function(){var e=this;this._triggerElement&&(Gb.forEach(function(t){e._triggerElement.removeEventListener(t,e,qb)}),this._pointerUpEventsRegistered&&Kb.forEach(function(t){e._triggerElement.removeEventListener(t,e,qb)}))}}]),e}();function Zb(e){window.getComputedStyle(e).getPropertyValue("opacity")}function Qb(e,t,n){var i=Math.max(Math.abs(e-n.left),Math.abs(e-n.right)),r=Math.max(Math.abs(t-n.top),Math.abs(t-n.bottom));return Math.sqrt(i*i+r*r)}var Xb=new Si("mat-ripple-global-options"),$b=function(){var e=function(){function e(t,n,i,r,a){v(this,e),this._elementRef=t,this._animationMode=a,this.radius=0,this._disabled=!1,this._isInitialized=!1,this._globalOptions=r||{},this._rippleRenderer=new Jb(this,n,t,i)}return g(e,[{key:"ngOnInit",value:function(){this._isInitialized=!0,this._setupTriggerEventsIfEnabled()}},{key:"ngOnDestroy",value:function(){this._rippleRenderer._removeTriggerEvents()}},{key:"fadeOutAll",value:function(){this._rippleRenderer.fadeOutAll()}},{key:"_setupTriggerEventsIfEnabled",value:function(){!this.disabled&&this._isInitialized&&this._rippleRenderer.setupTriggerEvents(this.trigger)}},{key:"launch",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0;return"number"==typeof e?this._rippleRenderer.fadeInRipple(e,t,Object.assign(Object.assign({},this.rippleConfig),n)):this._rippleRenderer.fadeInRipple(0,0,Object.assign(Object.assign({},this.rippleConfig),e))}},{key:"disabled",get:function(){return this._disabled},set:function(e){this._disabled=e,this._setupTriggerEventsIfEnabled()}},{key:"trigger",get:function(){return this._trigger||this._elementRef.nativeElement},set:function(e){this._trigger=e,this._setupTriggerEventsIfEnabled()}},{key:"rippleConfig",get:function(){return{centered:this.centered,radius:this.radius,color:this.color,animation:Object.assign(Object.assign(Object.assign({},this._globalOptions.animation),"NoopAnimations"===this._animationMode?{enterDuration:0,exitDuration:0}:{}),this.animation),terminateOnPointerUp:this._globalOptions.terminateOnPointerUp}}},{key:"rippleDisabled",get:function(){return this.disabled||!!this._globalOptions.disabled}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(Nc),ms(Nm),ms(Xb,8),ms(xb,8))},e.\u0275dir=gt({type:e,selectors:[["","mat-ripple",""],["","matRipple",""]],hostAttrs:[1,"mat-ripple"],hostVars:2,hostBindings:function(e,t){2&e&&Ks("mat-ripple-unbounded",t.unbounded)},inputs:{radius:["matRippleRadius","radius"],disabled:["matRippleDisabled","disabled"],trigger:["matRippleTrigger","trigger"],color:["matRippleColor","color"],unbounded:["matRippleUnbounded","unbounded"],centered:["matRippleCentered","centered"],animation:["matRippleAnimation","animation"]},exportAs:["matRipple"]}),e}(),ew=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[Rb,Bm],Rb]}),e}(),tw=function(){var e=function e(t){v(this,e),this._animationMode=t,this.state="unchecked",this.disabled=!1};return e.\u0275fac=function(t){return new(t||e)(ms(xb,8))},e.\u0275cmp=lt({type:e,selectors:[["mat-pseudo-checkbox"]],hostAttrs:[1,"mat-pseudo-checkbox"],hostVars:8,hostBindings:function(e,t){2&e&&Ks("mat-pseudo-checkbox-indeterminate","indeterminate"===t.state)("mat-pseudo-checkbox-checked","checked"===t.state)("mat-pseudo-checkbox-disabled",t.disabled)("_mat-animation-noopable","NoopAnimations"===t._animationMode)},inputs:{state:"state",disabled:"disabled"},decls:0,vars:0,template:function(e,t){},styles:['.mat-pseudo-checkbox{width:16px;height:16px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border-color:transparent}._mat-animation-noopable.mat-pseudo-checkbox{transition:none;animation:none}._mat-animation-noopable.mat-pseudo-checkbox::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:5px;left:1px;width:10px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{top:2.4px;left:1px;width:8px;height:3px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}\n'],encapsulation:2,changeDetection:0}),e}(),nw=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[Rb]]}),e}(),iw=Fb(function e(){v(this,e)}),rw=0,aw=function(){var e=function(e){_(n,e);var t=w(n);function n(){var e;return v(this,n),(e=t.apply(this,arguments))._labelId="mat-optgroup-label-".concat(rw++),e}return n}(iw);return e.\u0275fac=function(t){return ow(t||e)},e.\u0275dir=gt({type:e,inputs:{label:"label"},features:[Jo]}),e}(),ow=bi(aw),sw=new Si("MatOptgroup"),uw=function(){var e=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return n}(aw);return e.\u0275fac=function(t){return lw(t||e)},e.\u0275cmp=lt({type:e,selectors:[["mat-optgroup"]],hostAttrs:["role","group",1,"mat-optgroup"],hostVars:4,hostBindings:function(e,t){2&e&&(cs("aria-disabled",t.disabled.toString())("aria-labelledby",t._labelId),Ks("mat-optgroup-disabled",t.disabled))},inputs:{disabled:"disabled"},exportAs:["matOptgroup"],features:[Eu([{provide:sw,useExisting:e}]),Jo],ngContentSelectors:Eb,decls:6,vars:2,consts:[[1,"mat-optgroup-label",3,"id"]],template:function(e,t){1&e&&(Is(Ob),_s(0,"label",0),ou(1),Rs(2),ys(),ou(3,"\n"),Rs(4,1),ou(5,"\n")),2&e&&(gs("id",t._labelId),Pa(1),uu("",t.label," "))},styles:[".mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px;vertical-align:middle}.mat-optgroup-label .mat-icon svg{vertical-align:top}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}\n"],encapsulation:2,changeDetection:0}),e}(),lw=bi(uw),cw=0,dw=function e(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];v(this,e),this.source=t,this.isUserInput=n},hw=new Si("MAT_OPTION_PARENT_COMPONENT"),fw=function(){var e=function(){function e(t,n,i,r){v(this,e),this._element=t,this._changeDetectorRef=n,this._parent=i,this.group=r,this._selected=!1,this._active=!1,this._disabled=!1,this._mostRecentViewValue="",this.id="mat-option-".concat(cw++),this.onSelectionChange=new Zl,this._stateChanges=new z}return g(e,[{key:"select",value:function(){this._selected||(this._selected=!0,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent())}},{key:"deselect",value:function(){this._selected&&(this._selected=!1,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent())}},{key:"focus",value:function(e,t){var n=this._getHostElement();"function"==typeof n.focus&&n.focus(t)}},{key:"setActiveStyles",value:function(){this._active||(this._active=!0,this._changeDetectorRef.markForCheck())}},{key:"setInactiveStyles",value:function(){this._active&&(this._active=!1,this._changeDetectorRef.markForCheck())}},{key:"getLabel",value:function(){return this.viewValue}},{key:"_handleKeydown",value:function(e){13!==e.keyCode&&32!==e.keyCode||fg(e)||(this._selectViaInteraction(),e.preventDefault())}},{key:"_selectViaInteraction",value:function(){this.disabled||(this._selected=!this.multiple||!this._selected,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent(!0))}},{key:"_getAriaSelected",value:function(){return this.selected||!this.multiple&&null}},{key:"_getTabIndex",value:function(){return this.disabled?"-1":"0"}},{key:"_getHostElement",value:function(){return this._element.nativeElement}},{key:"ngAfterViewChecked",value:function(){if(this._selected){var e=this.viewValue;e!==this._mostRecentViewValue&&(this._mostRecentViewValue=e,this._stateChanges.next())}}},{key:"ngOnDestroy",value:function(){this._stateChanges.complete()}},{key:"_emitSelectionChangeEvent",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.onSelectionChange.emit(new dw(this,e))}},{key:"multiple",get:function(){return this._parent&&this._parent.multiple}},{key:"selected",get:function(){return this._selected}},{key:"disabled",get:function(){return this.group&&this.group.disabled||this._disabled},set:function(e){this._disabled=Xp(e)}},{key:"disableRipple",get:function(){return this._parent&&this._parent.disableRipple}},{key:"active",get:function(){return this._active}},{key:"viewValue",get:function(){return(this._getHostElement().textContent||"").trim()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(ul),ms(void 0),ms(aw))},e.\u0275dir=gt({type:e,inputs:{id:"id",disabled:"disabled",value:"value"},outputs:{onSelectionChange:"onSelectionChange"}}),e}(),pw=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r,a){return v(this,n),t.call(this,e,i,r,a)}return n}(fw);return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(ul),ms(hw,8),ms(sw,8))},e.\u0275cmp=lt({type:e,selectors:[["mat-option"]],hostAttrs:["role","option",1,"mat-option","mat-focus-indicator"],hostVars:12,hostBindings:function(e,t){1&e&&Ls("click",function(){return t._selectViaInteraction()})("keydown",function(e){return t._handleKeydown(e)}),2&e&&(fu("id",t.id),cs("tabindex",t._getTabIndex())("aria-selected",t._getAriaSelected())("aria-disabled",t.disabled.toString()),Ks("mat-selected",t.selected)("mat-option-multiple",t.multiple)("mat-active",t.active)("mat-option-disabled",t.disabled))},exportAs:["matOption"],features:[Jo],ngContentSelectors:Ab,decls:8,vars:3,consts:[["class","mat-option-pseudo-checkbox",3,"state","disabled",4,"ngIf"],[1,"mat-option-text"],["mat-ripple","",1,"mat-option-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mat-option-pseudo-checkbox",3,"state","disabled"]],template:function(e,t){1&e&&(Is(),fs(0,Pb,1,2,"mat-pseudo-checkbox",0),ou(1,"\n\n"),_s(2,"span",1),Rs(3),ys(),ou(4,"\n\n"),_s(5,"div",2),ou(6,"\n"),ys(),ou(7,"\n")),2&e&&(gs("ngIf",t.multiple),Pa(5),gs("matRippleTrigger",t._getHostElement())("matRippleDisabled",t.disabled||t.disableRipple))},directives:[fh,$b,tw],styles:[".mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;position:relative;cursor:pointer;outline:none;display:flex;flex-direction:row;max-width:100%;box-sizing:border-box;align-items:center;-webkit-tap-highlight-color:transparent}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px;vertical-align:middle}.mat-option .mat-icon svg{vertical-align:top}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.cdk-high-contrast-active .mat-option{margin:0 1px}.cdk-high-contrast-active .mat-option.mat-active{border:solid 1px currentColor;margin:0}.mat-option-text{display:inline-block;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option .mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.cdk-high-contrast-active .mat-option .mat-option-ripple{opacity:.5}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}\n"],encapsulation:2,changeDetection:0}),e}();function mw(e,t,n){if(n.length){for(var i=t.toArray(),r=n.toArray(),a=0,o=0;on+i?Math.max(0,e-i+t):n}var vw=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[ew,Ph,Rb,nw]]}),e}();function _w(e){return new N(function(t){var n;try{n=e()}catch(i){return void t.error(i)}return(n?se(n):Cf()).subscribe(t)})}function yw(e,t){}var bw=function e(){v(this,e),this.role="dialog",this.panelClass="",this.hasBackdrop=!0,this.backdropClass="",this.disableClose=!1,this.width="",this.height="",this.maxWidth="80vw",this.data=null,this.ariaDescribedBy=null,this.ariaLabelledBy=null,this.ariaLabel=null,this.autoFocus=!0,this.restoreFocus=!0,this.closeOnNavigation=!0},ww={dialogContainer:Fv("dialogContainer",[Bv("void, exit",Nv({opacity:0,transform:"scale(0.7)"})),Bv("enter",Nv({transform:"none"})),Vv("* => enter",Hv("150ms cubic-bezier(0, 0, 0.2, 1)",Nv({transform:"none",opacity:1}))),Vv("* => void, * => exit",Hv("75ms cubic-bezier(0.4, 0.0, 0.2, 1)",Nv({opacity:0})))])},kw=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r,a,o,s){var u;return v(this,n),(u=t.call(this))._elementRef=e,u._focusTrapFactory=i,u._changeDetectorRef=r,u._config=o,u._focusMonitor=s,u._animationStateChanged=new Zl,u._elementFocusedBeforeDialogWasOpened=null,u._closeInteractionType=null,u.attachDomPortal=function(e){return u._portalOutlet.hasAttached(),u._portalOutlet.attachDomPortal(e)},u._ariaLabelledBy=o.ariaLabelledBy||null,u._document=a,u}return g(n,[{key:"_initializeWithAttachedContent",value:function(){this._setupFocusTrap(),this._capturePreviouslyFocusedElement(),this._focusDialogContainer()}},{key:"attachComponentPortal",value:function(e){return this._portalOutlet.hasAttached(),this._portalOutlet.attachComponentPortal(e)}},{key:"attachTemplatePortal",value:function(e){return this._portalOutlet.hasAttached(),this._portalOutlet.attachTemplatePortal(e)}},{key:"_recaptureFocus",value:function(){this._containsFocus()||(!this._config.autoFocus||!this._focusTrap.focusInitialElement())&&this._elementRef.nativeElement.focus()}},{key:"_trapFocus",value:function(){this._config.autoFocus?this._focusTrap.focusInitialElementWhenReady():this._containsFocus()||this._elementRef.nativeElement.focus()}},{key:"_restoreFocus",value:function(){var e=this._elementFocusedBeforeDialogWasOpened;if(this._config.restoreFocus&&e&&"function"==typeof e.focus){var t=this._document.activeElement,n=this._elementRef.nativeElement;t&&t!==this._document.body&&t!==n&&!n.contains(t)||(this._focusMonitor?(this._focusMonitor.focusVia(e,this._closeInteractionType),this._closeInteractionType=null):e.focus())}this._focusTrap&&this._focusTrap.destroy()}},{key:"_setupFocusTrap",value:function(){this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement)}},{key:"_capturePreviouslyFocusedElement",value:function(){this._document&&(this._elementFocusedBeforeDialogWasOpened=this._document.activeElement)}},{key:"_focusDialogContainer",value:function(){this._elementRef.nativeElement.focus&&this._elementRef.nativeElement.focus()}},{key:"_containsFocus",value:function(){var e=this._elementRef.nativeElement,t=this._document.activeElement;return e===t||e.contains(t)}}]),n}(rg);return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(yv),ms(ul),ms(Md,8),ms(bw),ms(xv))},e.\u0275dir=gt({type:e,viewQuery:function(e,t){var n;1&e&&lc(og,!0),2&e&&uc(n=fc())&&(t._portalOutlet=n.first)},features:[Jo]}),e}(),Mw=function(){var e=function(e){_(n,e);var t=w(n);function n(){var e;return v(this,n),(e=t.apply(this,arguments))._state="enter",e}return g(n,[{key:"_onAnimationDone",value:function(e){var t=e.toState,n=e.totalTime;"enter"===t?(this._trapFocus(),this._animationStateChanged.next({state:"opened",totalTime:n})):"exit"===t&&(this._restoreFocus(),this._animationStateChanged.next({state:"closed",totalTime:n}))}},{key:"_onAnimationStart",value:function(e){var t=e.toState,n=e.totalTime;"enter"===t?this._animationStateChanged.next({state:"opening",totalTime:n}):"exit"!==t&&"void"!==t||this._animationStateChanged.next({state:"closing",totalTime:n})}},{key:"_startExitAnimation",value:function(){this._state="exit",this._changeDetectorRef.markForCheck()}}]),n}(kw);return e.\u0275fac=function(t){return Sw(t||e)},e.\u0275cmp=lt({type:e,selectors:[["mat-dialog-container"]],hostAttrs:["tabindex","-1","aria-modal","true",1,"mat-dialog-container"],hostVars:6,hostBindings:function(e,t){1&e&&Ts("@dialogContainer.start",function(e){return t._onAnimationStart(e)})("@dialogContainer.done",function(e){return t._onAnimationDone(e)}),2&e&&(fu("id",t._id),cs("role",t._config.role)("aria-labelledby",t._config.ariaLabel?null:t._ariaLabelledBy)("aria-label",t._config.ariaLabel)("aria-describedby",t._config.ariaDescribedBy||null),pu("@dialogContainer",t._state))},features:[Jo],decls:2,vars:0,consts:[["cdkPortalOutlet",""]],template:function(e,t){1&e&&(fs(0,yw,0,0,"ng-template",0),ou(1,"\n"))},directives:[og],styles:[".mat-dialog-container{display:block;padding:24px;border-radius:4px;box-sizing:border-box;overflow:auto;outline:0;width:100%;height:100%;min-height:inherit;max-height:inherit}.cdk-high-contrast-active .mat-dialog-container{outline:solid 1px}.mat-dialog-content{display:block;margin:0 -24px;padding:0 24px;max-height:65vh;overflow:auto;-webkit-overflow-scrolling:touch}.mat-dialog-title{margin:0 0 20px;display:block}.mat-dialog-actions{padding:8px 0;display:flex;flex-wrap:wrap;min-height:52px;align-items:center;box-sizing:content-box;margin-bottom:-24px}.mat-dialog-actions[align=end]{justify-content:flex-end}.mat-dialog-actions[align=center]{justify-content:center}.mat-dialog-actions .mat-button-base+.mat-button-base,.mat-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-dialog-actions .mat-button-base+.mat-button-base,[dir=rtl] .mat-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"],encapsulation:2,data:{animation:[ww.dialogContainer]}}),e}(),Sw=bi(Mw),Cw=0,xw=function(){function e(t,n){var i=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"mat-dialog-".concat(Cw++);v(this,e),this._overlayRef=t,this._containerInstance=n,this.id=r,this.disableClose=this._containerInstance._config.disableClose,this._afterOpened=new z,this._afterClosed=new z,this._beforeClosed=new z,this._state=0,n._id=r,n._animationStateChanged.pipe(Nf(function(e){return"opened"===e.state}),Uf(1)).subscribe(function(){i._afterOpened.next(),i._afterOpened.complete()}),n._animationStateChanged.pipe(Nf(function(e){return"closed"===e.state}),Uf(1)).subscribe(function(){clearTimeout(i._closeFallbackTimeout),i._finishDialogClose()}),t.detachments().subscribe(function(){i._beforeClosed.next(i._result),i._beforeClosed.complete(),i._afterClosed.next(i._result),i._afterClosed.complete(),i.componentInstance=null,i._overlayRef.dispose()}),t.keydownEvents().pipe(Nf(function(e){return e.keyCode===cg&&!i.disableClose&&!fg(e)})).subscribe(function(e){e.preventDefault(),Lw(i,"keyboard")}),t.backdropClick().subscribe(function(){i.disableClose?i._containerInstance._recaptureFocus():Lw(i,"mouse")})}return g(e,[{key:"close",value:function(e){var t=this;this._result=e,this._containerInstance._animationStateChanged.pipe(Nf(function(e){return"closing"===e.state}),Uf(1)).subscribe(function(n){t._beforeClosed.next(e),t._beforeClosed.complete(),t._overlayRef.detachBackdrop(),t._closeFallbackTimeout=setTimeout(function(){return t._finishDialogClose()},n.totalTime+100)}),this._state=1,this._containerInstance._startExitAnimation()}},{key:"afterOpened",value:function(){return this._afterOpened}},{key:"afterClosed",value:function(){return this._afterClosed}},{key:"beforeClosed",value:function(){return this._beforeClosed}},{key:"backdropClick",value:function(){return this._overlayRef.backdropClick()}},{key:"keydownEvents",value:function(){return this._overlayRef.keydownEvents()}},{key:"updatePosition",value:function(e){var t=this._getPositionStrategy();return e&&(e.left||e.right)?e.left?t.left(e.left):t.right(e.right):t.centerHorizontally(),e&&(e.top||e.bottom)?e.top?t.top(e.top):t.bottom(e.bottom):t.centerVertically(),this._overlayRef.updatePosition(),this}},{key:"updateSize",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return this._getPositionStrategy().width(e).height(t),this._overlayRef.updatePosition(),this}},{key:"addPanelClass",value:function(e){return this._overlayRef.addPanelClass(e),this}},{key:"removePanelClass",value:function(e){return this._overlayRef.removePanelClass(e),this}},{key:"getState",value:function(){return this._state}},{key:"_finishDialogClose",value:function(){this._state=2,this._overlayRef.dispose()}},{key:"_getPositionStrategy",value:function(){return this._overlayRef.getConfig().positionStrategy}}]),e}();function Lw(e,t,n){return void 0!==e._containerInstance&&(e._containerInstance._closeInteractionType=t),e.close(n)}var Tw=new Si("MatDialogData"),Dw=new Si("mat-dialog-default-options"),Ow=new Si("mat-dialog-scroll-strategy"),Ew={provide:Ow,deps:[Ng],useFactory:function(e){return function(){return e.scrollStrategies.block()}}},Pw=function(){var e=function(){function e(t,n,i,r,a,o,s,u,l){var c=this;v(this,e),this._overlay=t,this._injector=n,this._defaultOptions=i,this._parentDialog=r,this._overlayContainer=a,this._dialogRefConstructor=s,this._dialogContainerType=u,this._dialogDataToken=l,this._openDialogsAtThisLevel=[],this._afterAllClosedAtThisLevel=new z,this._afterOpenedAtThisLevel=new z,this._ariaHiddenElements=new Map,this.afterAllClosed=_w(function(){return c.openDialogs.length?c._getAfterAllClosed():c._getAfterAllClosed().pipe(xm(void 0))}),this._scrollStrategy=o}return g(e,[{key:"_getAfterAllClosed",value:function(){var e=this._parentDialog;return e?e._getAfterAllClosed():this._afterAllClosedAtThisLevel}},{key:"open",value:function(e,t){var n=this;(t=function(e,t){return Object.assign(Object.assign({},t),e)}(t,this._defaultOptions||new bw)).id&&this.getDialogById(t.id);var i=this._createOverlay(t),r=this._attachDialogContainer(i,t),a=this._attachDialogContent(e,r,i,t);return this.openDialogs.length||this._hideNonDialogContentFromAssistiveTechnology(),this.openDialogs.push(a),a.afterClosed().subscribe(function(){return n._removeOpenDialog(a)}),this.afterOpened.next(a),r._initializeWithAttachedContent(),a}},{key:"closeAll",value:function(){this._closeDialogs(this.openDialogs)}},{key:"getDialogById",value:function(e){return this.openDialogs.find(function(t){return t.id===e})}},{key:"ngOnDestroy",value:function(){this._closeDialogs(this._openDialogsAtThisLevel),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete()}},{key:"_createOverlay",value:function(e){var t=this._getOverlayConfig(e);return this._overlay.create(t)}},{key:"_getOverlayConfig",value:function(e){var t=new wg({positionStrategy:this._overlay.position().global(),scrollStrategy:e.scrollStrategy||this._scrollStrategy(),panelClass:e.panelClass,hasBackdrop:e.hasBackdrop,direction:e.direction,minWidth:e.minWidth,minHeight:e.minHeight,maxWidth:e.maxWidth,maxHeight:e.maxHeight,disposeOnNavigation:e.closeOnNavigation});return e.backdropClass&&(t.backdropClass=e.backdropClass),t}},{key:"_attachDialogContainer",value:function(e,t){var n=Go.create({parent:t&&t.viewContainerRef&&t.viewContainerRef.injector||this._injector,providers:[{provide:bw,useValue:t}]}),i=new tg(this._dialogContainerType,t.viewContainerRef,n,t.componentFactoryResolver);return e.attach(i).instance}},{key:"_attachDialogContent",value:function(e,t,n,i){var r=new this._dialogRefConstructor(n,t,i.id);if(e instanceof ml)t.attachTemplatePortal(new ng(e,null,{$implicit:i.data,dialogRef:r}));else{var a=this._createInjector(i,r,t),o=t.attachComponentPortal(new tg(e,i.viewContainerRef,a));r.componentInstance=o.instance}return r.updateSize(i.width,i.height).updatePosition(i.position),r}},{key:"_createInjector",value:function(e,t,n){var i=e&&e.viewContainerRef&&e.viewContainerRef.injector,r=[{provide:this._dialogContainerType,useValue:n},{provide:this._dialogDataToken,useValue:e.data},{provide:this._dialogRefConstructor,useValue:t}];return!e.direction||i&&i.get(Gm,null)||r.push({provide:Gm,useValue:{value:e.direction,change:xf()}}),Go.create({parent:i||this._injector,providers:r})}},{key:"_removeOpenDialog",value:function(e){var t=this.openDialogs.indexOf(e);t>-1&&(this.openDialogs.splice(t,1),this.openDialogs.length||(this._ariaHiddenElements.forEach(function(e,t){e?t.setAttribute("aria-hidden",e):t.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),this._getAfterAllClosed().next()))}},{key:"_hideNonDialogContentFromAssistiveTechnology",value:function(){var e=this._overlayContainer.getContainerElement();if(e.parentElement)for(var t=e.parentElement.children,n=t.length-1;n>-1;n--){var i=t[n];i===e||"SCRIPT"===i.nodeName||"STYLE"===i.nodeName||i.hasAttribute("aria-live")||(this._ariaHiddenElements.set(i,i.getAttribute("aria-hidden")),i.setAttribute("aria-hidden","true"))}}},{key:"_closeDialogs",value:function(e){for(var t=e.length;t--;)e[t].close()}},{key:"openDialogs",get:function(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}},{key:"afterOpened",get:function(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(Ng),ms(Go),ms(void 0),ms(void 0),ms(Tg),ms(void 0),ms(xi),ms(xi),ms(Si))},e.\u0275dir=gt({type:e}),e}(),Aw=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r,a,o,s,u){return v(this,n),t.call(this,e,i,a,s,u,o,xw,Mw,Tw)}return n}(Pw);return e.\u0275fac=function(t){return new(t||e)(Gi(Ng),Gi(Go),Gi(Hd,8),Gi(Dw,8),Gi(Ow),Gi(e,12),Gi(Tg))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),Yw=function(){var e=function e(){v(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275dir=gt({type:e,selectors:[["","mat-dialog-content",""],["mat-dialog-content"],["","matDialogContent",""]],hostAttrs:[1,"mat-dialog-content"]}),e}(),Iw=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[Aw,Ew],imports:[[qg,sg,Rb],Rb]}),e}(),Rw=function(e){return e.RequestingCurrentPin="RequestingCurrentPin",e.RequestingNewPin="RequestingNewPin",e.ConfirmingNewPin="ConfirmingNewPin",e}({}),Fw=function(){function e(e){this.dialog=e}return Object.defineProperty(e.prototype,"requestPinComponent",{set:function(e){this.requestPinComponentInternal=e},enumerable:!1,configurable:!0}),e.prototype.requestPin=function(){var e=this;return this.requestPinComponentInternal.openDialog(this.dialog,{changingPin:this.changingPin,changePinState:this.changePinState,signingTx:this.signingTx}).afterClosed().pipe(ie(function(t){return e.changingPin&&(e.changePinState===Rw.RequestingCurrentPin?e.changePinState=Rw.RequestingNewPin:e.changePinState===Rw.RequestingNewPin&&(e.changePinState=Rw.ConfirmingNewPin)),t}))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(Aw))}}),e}(),Hw=function(){function e(e){this.dialog=e}return Object.defineProperty(e.prototype,"requestWordComponent",{set:function(e){this.requestWordComponentInternal=e},enumerable:!1,configurable:!0}),e.prototype.requestWord=function(){return this.requestWordComponentInternal.openDialog(this.dialog,{reason:"HWWalletOperation"}).afterClosed().pipe(ie(function(e){return e}))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(Aw))}}),e}(),jw=function(){function e(e,t,n,i){this.http=e,this.hwWalletPinService=t,this.hwWalletSeedWordService=n,this.ngZone=i,this.url="http://127.0.0.1:9510/api/v1/",this.timeoutMs=55e3,this.connectionEventSubject=new Gp(!1),this.hwConnected=!1,this.disconnectedChecks=0,this.maxFastDisconnectedChecks=32,this.updatePeriod=1e4,this.fastUpdatePeriod=2e3}return Object.defineProperty(e.prototype,"connectionEvent",{get:function(){return this.connectionEventSubject.asObservable()},enumerable:!1,configurable:!0}),e.prototype.get=function(e){return this.checkResponse(this.http.get(this.getUrl(e),this.returnRequestOptions()),e.includes("/available"))},e.prototype.post=function(e,t){return void 0===t&&(t=null),t||(t={}),this.checkResponse(this.http.post(this.getUrl(e),JSON.stringify(t),this.returnRequestOptions()))},e.prototype.put=function(e,t,n){return void 0===t&&(t=null),void 0===n&&(n=!1),this.checkResponse(this.http.put(this.getUrl(e),t,this.returnRequestOptions(n)),!1)},e.prototype.delete=function(e){return this.checkResponse(this.http.delete(this.getUrl(e),this.returnRequestOptions()))},e.prototype.checkResponse=function(e,t){var n=this;return void 0===t&&(t=!1),e.pipe(function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:kf;return Jp(e,Lf(new Kp),t)}(this.timeoutMs),ue(function(e){return e.data&&e.data.length&&1===e.data.length&&(e.data=e.data[0]),t?n.ngZone.run(function(){return n.updateHwConnected(!!e.data)}):n.updateHwConnected(!0),"string"==typeof e.data&&-1!==e.data.indexOf("PinMatrixRequest")?n.hwWalletPinService.requestPin().pipe(ue(function(e){return e?n.post("/intermediate/pin_matrix",{pin:e}):n.put("/cancel").pipe(ue(function(){var e=new Fp;return e.originalError=null,e.originalServerErrorMsg="",e.type=Rp.FailedOrRefused,e.translatableErrorMsg=n.getHardwareWalletErrorMsg(e.type),Lf(e)}))})):"string"==typeof e.data&&-1!==e.data.indexOf("WordRequest")?n.hwWalletSeedWordService.requestWord().pipe(ue(function(e){return e?n.post("/intermediate/word",{word:e}):n.put("/cancel").pipe(ue(function(){var e=new Fp;return e.originalError=null,e.originalServerErrorMsg="",e.type=Rp.FailedOrRefused,e.translatableErrorMsg=n.getHardwareWalletErrorMsg(e.type),Lf(e)}))})):"string"==typeof e.data&&-1!==e.data.indexOf("ButtonRequest")?n.post("/intermediate/button"):xf(e)}),Rf(function(e){if(e.type)return Lf(e);var t=new Fp;return t.originalError=e,e&&e.name&&"TimeoutError"===e.name?(n.put("/cancel").subscribe(),t.originalServerErrorMsg=e.name,t.type=Rp.Timeout,t.translatableErrorMsg=n.getHardwareWalletErrorMsg(t.type),Lf(t)):null==e.status||0!==e.status&&504!==e.status?(t.originalServerErrorMsg=jp(e),t.type=n.getHardwareWalletErrorType(t.originalServerErrorMsg),t.translatableErrorMsg=n.getHardwareWalletErrorMsg(t.type),Lf(t)):(t.originalServerErrorMsg=jp(e),t.type=Rp.DaemonConnectionError,t.translatableErrorMsg=n.getHardwareWalletErrorMsg(t.type),Lf(t))}))},e.prototype.returnRequestOptions=function(e){void 0===e&&(e=!1);var t={};return t.headers=new rp,e||(t.headers=t.headers.append("Content-Type","application/json")),t},e.prototype.checkHw=function(e){var t=this;this.checkHwSubscription&&this.checkHwSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){t.checkHwSubscription=xf(1).pipe(Of(e?t.hwConnected||t.disconnectedCheckse?{max:{max:e,actual:t.value}}:null}}},{key:"required",value:function(e){return $w(e.value)?{required:!0}:null}},{key:"requiredTrue",value:function(e){return!0===e.value?null:{required:!0}}},{key:"email",value:function(e){return $w(e.value)||ik.test(e.value)?null:{email:!0}}},{key:"minLength",value:function(e){return function(t){return $w(t.value)||!ek(t.value)?null:t.value.lengthe?{maxlength:{requiredLength:e,actualLength:t.value.length}}:null}}},{key:"pattern",value:function(t){return t?("string"==typeof t?(i="","^"!==t.charAt(0)&&(i+="^"),i+=t,"$"!==t.charAt(t.length-1)&&(i+="$"),n=new RegExp(i)):(i=t.toString(),n=t),function(e){if($w(e.value))return null;var t=e.value;return n.test(t)?null:{pattern:{requiredPattern:i,actualValue:t}}}):e.nullValidator;var n,i}},{key:"nullValidator",value:function(e){return null}},{key:"compose",value:function(e){if(!e)return null;var t=e.filter(ak);return 0==t.length?null:function(e){return sk(uk(e,t))}}},{key:"composeAsync",value:function(e){if(!e)return null;var t=e.filter(ak);return 0==t.length?null:function(e){return zw(uk(e,t).map(ok)).pipe(ie(sk))}}}]),e}();function ak(e){return null!=e}function ok(e){var t=Cs(e)?se(e):e;return xs(t),t}function sk(e){var t={};return e.forEach(function(e){t=null!=e?Object.assign(Object.assign({},t),e):t}),0===Object.keys(t).length?null:t}function uk(e,t){return t.map(function(t){return t(e)})}function lk(e){return e.map(function(e){return function(e){return!e.validate}(e)?e:function(t){return e.validate(t)}})}function ck(e){return null!=e?rk.compose(lk(e)):null}function dk(e){return null!=e?rk.composeAsync(lk(e)):null}function hk(e,t){return null===e?[t]:Array.isArray(e)?[].concat(d(e),[t]):[e,t]}function fk(e){return e._rawValidators}function pk(e){return e._rawAsyncValidators}var mk=function(){var e=function(){function e(){v(this,e),this._rawValidators=[],this._rawAsyncValidators=[],this._onDestroyCallbacks=[]}return g(e,[{key:"_setValidators",value:function(e){this._rawValidators=e||[],this._composedValidatorFn=ck(this._rawValidators)}},{key:"_setAsyncValidators",value:function(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=dk(this._rawAsyncValidators)}},{key:"_registerOnDestroy",value:function(e){this._onDestroyCallbacks.push(e)}},{key:"_invokeOnDestroyCallbacks",value:function(){this._onDestroyCallbacks.forEach(function(e){return e()}),this._onDestroyCallbacks=[]}},{key:"reset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;this.control&&this.control.reset(e)}},{key:"hasError",value:function(e,t){return!!this.control&&this.control.hasError(e,t)}},{key:"getError",value:function(e,t){return this.control?this.control.getError(e,t):null}},{key:"value",get:function(){return this.control?this.control.value:null}},{key:"valid",get:function(){return this.control?this.control.valid:null}},{key:"invalid",get:function(){return this.control?this.control.invalid:null}},{key:"pending",get:function(){return this.control?this.control.pending:null}},{key:"disabled",get:function(){return this.control?this.control.disabled:null}},{key:"enabled",get:function(){return this.control?this.control.enabled:null}},{key:"errors",get:function(){return this.control?this.control.errors:null}},{key:"pristine",get:function(){return this.control?this.control.pristine:null}},{key:"dirty",get:function(){return this.control?this.control.dirty:null}},{key:"touched",get:function(){return this.control?this.control.touched:null}},{key:"status",get:function(){return this.control?this.control.status:null}},{key:"untouched",get:function(){return this.control?this.control.untouched:null}},{key:"statusChanges",get:function(){return this.control?this.control.statusChanges:null}},{key:"valueChanges",get:function(){return this.control?this.control.valueChanges:null}},{key:"path",get:function(){return null}},{key:"validator",get:function(){return this._composedValidatorFn||null}},{key:"asyncValidator",get:function(){return this._composedAsyncValidatorFn||null}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275dir=gt({type:e}),e}(),gk=function(){var e=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"formDirective",get:function(){return null}},{key:"path",get:function(){return null}}]),n}(mk);return e.\u0275fac=function(t){return vk(t||e)},e.\u0275dir=gt({type:e,features:[Jo]}),e}(),vk=bi(gk),_k=function(e){_(n,e);var t=w(n);function n(){var e;return v(this,n),(e=t.apply(this,arguments))._parent=null,e.name=null,e.valueAccessor=null,e}return n}(mk),yk=function(){function e(t){v(this,e),this._cd=t}return g(e,[{key:"ngClassUntouched",get:function(){var e,t,n;return null!==(n=null===(t=null===(e=this._cd)||void 0===e?void 0:e.control)||void 0===t?void 0:t.untouched)&&void 0!==n&&n}},{key:"ngClassTouched",get:function(){var e,t,n;return null!==(n=null===(t=null===(e=this._cd)||void 0===e?void 0:e.control)||void 0===t?void 0:t.touched)&&void 0!==n&&n}},{key:"ngClassPristine",get:function(){var e,t,n;return null!==(n=null===(t=null===(e=this._cd)||void 0===e?void 0:e.control)||void 0===t?void 0:t.pristine)&&void 0!==n&&n}},{key:"ngClassDirty",get:function(){var e,t,n;return null!==(n=null===(t=null===(e=this._cd)||void 0===e?void 0:e.control)||void 0===t?void 0:t.dirty)&&void 0!==n&&n}},{key:"ngClassValid",get:function(){var e,t,n;return null!==(n=null===(t=null===(e=this._cd)||void 0===e?void 0:e.control)||void 0===t?void 0:t.valid)&&void 0!==n&&n}},{key:"ngClassInvalid",get:function(){var e,t,n;return null!==(n=null===(t=null===(e=this._cd)||void 0===e?void 0:e.control)||void 0===t?void 0:t.invalid)&&void 0!==n&&n}},{key:"ngClassPending",get:function(){var e,t,n;return null!==(n=null===(t=null===(e=this._cd)||void 0===e?void 0:e.control)||void 0===t?void 0:t.pending)&&void 0!==n&&n}}]),e}(),bk=function(){var e=function(e){_(n,e);var t=w(n);function n(e){return v(this,n),t.call(this,e)}return n}(yk);return e.\u0275fac=function(t){return new(t||e)(ms(_k,2))},e.\u0275dir=gt({type:e,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(e,t){2&e&&Ks("ng-untouched",t.ngClassUntouched)("ng-touched",t.ngClassTouched)("ng-pristine",t.ngClassPristine)("ng-dirty",t.ngClassDirty)("ng-valid",t.ngClassValid)("ng-invalid",t.ngClassInvalid)("ng-pending",t.ngClassPending)},features:[Jo]}),e}(),wk=function(){var e=function(e){_(n,e);var t=w(n);function n(e){return v(this,n),t.call(this,e)}return n}(yk);return e.\u0275fac=function(t){return new(t||e)(ms(gk,10))},e.\u0275dir=gt({type:e,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:14,hostBindings:function(e,t){2&e&&Ks("ng-untouched",t.ngClassUntouched)("ng-touched",t.ngClassTouched)("ng-pristine",t.ngClassPristine)("ng-dirty",t.ngClassDirty)("ng-valid",t.ngClassValid)("ng-invalid",t.ngClassInvalid)("ng-pending",t.ngClassPending)},features:[Jo]}),e}(),kk={provide:Gw,useExisting:Te(function(){return Mk}),multi:!0},Mk=function(){var e=function(){function e(t,n){v(this,e),this._renderer=t,this._elementRef=n,this.onChange=function(e){},this.onTouched=function(){}}return g(e,[{key:"writeValue",value:function(e){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==e?"":e)}},{key:"registerOnChange",value:function(e){this.onChange=function(t){e(""==t?null:parseFloat(t))}}},{key:"registerOnTouched",value:function(e){this.onTouched=e}},{key:"setDisabledState",value:function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(Bu),ms(ju))},e.\u0275dir=gt({type:e,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(e,t){1&e&&Ls("input",function(e){return t.onChange(e.target.value)})("blur",function(){return t.onTouched()})},features:[Eu([kk])]}),e}(),Sk={provide:Gw,useExisting:Te(function(){return xk}),multi:!0},Ck=function(){var e=function(){function e(){v(this,e),this._accessors=[]}return g(e,[{key:"add",value:function(e,t){this._accessors.push([e,t])}},{key:"remove",value:function(e){for(var t=this._accessors.length-1;t>=0;--t)if(this._accessors[t][1]===e)return void this._accessors.splice(t,1)}},{key:"select",value:function(e){var t=this;this._accessors.forEach(function(n){t._isSameGroup(n,e)&&n[1]!==e&&n[1].fireUncheck(e.value)})}},{key:"_isSameGroup",value:function(e,t){return!!e[0].control&&e[0]._parent===t._control._parent&&e[1].name===t.name}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),xk=function(){var e=function(){function e(t,n,i,r){v(this,e),this._renderer=t,this._elementRef=n,this._registry=i,this._injector=r,this.onChange=function(){},this.onTouched=function(){}}return g(e,[{key:"ngOnInit",value:function(){this._control=this._injector.get(_k),this._checkName(),this._registry.add(this._control,this)}},{key:"ngOnDestroy",value:function(){this._registry.remove(this)}},{key:"writeValue",value:function(e){this._state=e===this.value,this._renderer.setProperty(this._elementRef.nativeElement,"checked",this._state)}},{key:"registerOnChange",value:function(e){var t=this;this._fn=e,this.onChange=function(){e(t.value),t._registry.select(t)}}},{key:"fireUncheck",value:function(e){this.writeValue(e)}},{key:"registerOnTouched",value:function(e){this.onTouched=e}},{key:"setDisabledState",value:function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)}},{key:"_checkName",value:function(){!this.name&&this.formControlName&&(this.name=this.formControlName)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(Bu),ms(ju),ms(Ck),ms(Go))},e.\u0275dir=gt({type:e,selectors:[["input","type","radio","formControlName",""],["input","type","radio","formControl",""],["input","type","radio","ngModel",""]],hostBindings:function(e,t){1&e&&Ls("change",function(){return t.onChange()})("blur",function(){return t.onTouched()})},inputs:{name:"name",formControlName:"formControlName",value:"value"},features:[Eu([Sk])]}),e}(),Lk={provide:Gw,useExisting:Te(function(){return Tk}),multi:!0},Tk=function(){var e=function(){function e(t,n){v(this,e),this._renderer=t,this._elementRef=n,this.onChange=function(e){},this.onTouched=function(){}}return g(e,[{key:"writeValue",value:function(e){this._renderer.setProperty(this._elementRef.nativeElement,"value",parseFloat(e))}},{key:"registerOnChange",value:function(e){this.onChange=function(t){e(""==t?null:parseFloat(t))}}},{key:"registerOnTouched",value:function(e){this.onTouched=e}},{key:"setDisabledState",value:function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(Bu),ms(ju))},e.\u0275dir=gt({type:e,selectors:[["input","type","range","formControlName",""],["input","type","range","formControl",""],["input","type","range","ngModel",""]],hostBindings:function(e,t){1&e&&Ls("change",function(e){return t.onChange(e.target.value)})("input",function(e){return t.onChange(e.target.value)})("blur",function(){return t.onTouched()})},features:[Eu([Lk])]}),e}(),Dk={provide:Gw,useExisting:Te(function(){return Ek}),multi:!0};function Ok(e,t){return null==e?"".concat(t):(t&&"object"==typeof t&&(t="Object"),"".concat(e,": ").concat(t).slice(0,50))}var Ek=function(){var e=function(){function e(t,n){v(this,e),this._renderer=t,this._elementRef=n,this._optionMap=new Map,this._idCounter=0,this.onChange=function(e){},this.onTouched=function(){},this._compareWith=Object.is}return g(e,[{key:"writeValue",value:function(e){this.value=e;var t=this._getOptionId(e);null==t&&this._renderer.setProperty(this._elementRef.nativeElement,"selectedIndex",-1);var n=Ok(t,e);this._renderer.setProperty(this._elementRef.nativeElement,"value",n)}},{key:"registerOnChange",value:function(e){var t=this;this.onChange=function(n){t.value=t._getOptionValue(n),e(t.value)}}},{key:"registerOnTouched",value:function(e){this.onTouched=e}},{key:"setDisabledState",value:function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)}},{key:"_registerOption",value:function(){return(this._idCounter++).toString()}},{key:"_getOptionId",value:function(e){for(var t=0,n=Array.from(this._optionMap.keys());t-1)}}else t=function(e,t){e._setSelected(!1)};this._optionMap.forEach(t)}},{key:"registerOnChange",value:function(e){var t=this;this.onChange=function(n){var i=[];if(void 0!==n.selectedOptions)for(var r=n.selectedOptions,a=0;a0&&e.setValidators(i.filter(function(e){return e!==t.validator}))}if(null!==t.asyncValidator){var r=pk(e);Array.isArray(r)&&r.length>0&&e.setAsyncValidators(r.filter(function(e){return e!==t.asyncValidator}))}}if(n){var a=function(){};jk(t._rawValidators,a),jk(t._rawAsyncValidators,a)}}function Wk(e,t){e._pendingDirty&&e.markAsDirty(),e.setValue(e._pendingValue,{emitModelToViewChange:!1}),t.viewToModelUpdate(e._pendingValue),e._pendingChange=!1}function Vk(e,t){Nk(e,t,!1)}var Uk=[Jw,Tk,Mk,Ek,Ik,xk];function zk(e,t){e._syncPendingControls(),t.forEach(function(e){var t=e.control;"submit"===t.updateOn&&t._pendingChange&&(e.viewToModelUpdate(t._pendingValue),t._pendingChange=!1)})}function qk(e,t){var n=e.indexOf(t);n>-1&&e.splice(n,1)}var Gk="VALID",Kk="INVALID",Jk="PENDING",Zk="DISABLED";function Qk(e){return(tM(e)?e.validators:e)||null}function Xk(e){return Array.isArray(e)?ck(e):e||null}function $k(e,t){return(tM(t)?t.asyncValidators:e)||null}function eM(e){return Array.isArray(e)?dk(e):e||null}function tM(e){return null!=e&&!Array.isArray(e)&&"object"==typeof e}var nM=function(){function e(t,n){v(this,e),this._hasOwnPendingAsyncValidator=!1,this._onCollectionChange=function(){},this._parent=null,this.pristine=!0,this.touched=!1,this._onDisabledChange=[],this._rawValidators=t,this._rawAsyncValidators=n,this._composedValidatorFn=Xk(this._rawValidators),this._composedAsyncValidatorFn=eM(this._rawAsyncValidators)}return g(e,[{key:"setValidators",value:function(e){this._rawValidators=e,this._composedValidatorFn=Xk(e)}},{key:"setAsyncValidators",value:function(e){this._rawAsyncValidators=e,this._composedAsyncValidatorFn=eM(e)}},{key:"clearValidators",value:function(){this.validator=null}},{key:"clearAsyncValidators",value:function(){this.asyncValidator=null}},{key:"markAsTouched",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.touched=!0,this._parent&&!e.onlySelf&&this._parent.markAsTouched(e)}},{key:"markAllAsTouched",value:function(){this.markAsTouched({onlySelf:!0}),this._forEachChild(function(e){return e.markAllAsTouched()})}},{key:"markAsUntouched",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.touched=!1,this._pendingTouched=!1,this._forEachChild(function(e){e.markAsUntouched({onlySelf:!0})}),this._parent&&!e.onlySelf&&this._parent._updateTouched(e)}},{key:"markAsDirty",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.pristine=!1,this._parent&&!e.onlySelf&&this._parent.markAsDirty(e)}},{key:"markAsPristine",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.pristine=!0,this._pendingDirty=!1,this._forEachChild(function(e){e.markAsPristine({onlySelf:!0})}),this._parent&&!e.onlySelf&&this._parent._updatePristine(e)}},{key:"markAsPending",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.status=Jk,!1!==e.emitEvent&&this.statusChanges.emit(this.status),this._parent&&!e.onlySelf&&this._parent.markAsPending(e)}},{key:"disable",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this._parentMarkedDirty(e.onlySelf);this.status=Zk,this.errors=null,this._forEachChild(function(t){t.disable(Object.assign(Object.assign({},e),{onlySelf:!0}))}),this._updateValue(),!1!==e.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Object.assign(Object.assign({},e),{skipPristineCheck:t})),this._onDisabledChange.forEach(function(e){return e(!0)})}},{key:"enable",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this._parentMarkedDirty(e.onlySelf);this.status=Gk,this._forEachChild(function(t){t.enable(Object.assign(Object.assign({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(Object.assign(Object.assign({},e),{skipPristineCheck:t})),this._onDisabledChange.forEach(function(e){return e(!1)})}},{key:"_updateAncestors",value:function(e){this._parent&&!e.onlySelf&&(this._parent.updateValueAndValidity(e),e.skipPristineCheck||this._parent._updatePristine(),this._parent._updateTouched())}},{key:"setParent",value:function(e){this._parent=e}},{key:"updateValueAndValidity",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),this.status!==Gk&&this.status!==Jk||this._runAsyncValidator(e.emitEvent)),!1!==e.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.updateValueAndValidity(e)}},{key:"_updateTreeValidity",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{emitEvent:!0};this._forEachChild(function(t){return t._updateTreeValidity(e)}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}},{key:"_setInitialStatus",value:function(){this.status=this._allControlsDisabled()?Zk:Gk}},{key:"_runValidator",value:function(){return this.validator?this.validator(this):null}},{key:"_runAsyncValidator",value:function(e){var t=this;if(this.asyncValidator){this.status=Jk,this._hasOwnPendingAsyncValidator=!0;var n=ok(this.asyncValidator(this));this._asyncValidationSubscription=n.subscribe(function(n){t._hasOwnPendingAsyncValidator=!1,t.setErrors(n,{emitEvent:e})})}}},{key:"_cancelExistingSubscription",value:function(){this._asyncValidationSubscription&&(this._asyncValidationSubscription.unsubscribe(),this._hasOwnPendingAsyncValidator=!1)}},{key:"setErrors",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.errors=e,this._updateControlsErrors(!1!==t.emitEvent)}},{key:"get",value:function(e){return function(e,t,n){if(null==t)return null;if(Array.isArray(t)||(t=t.split(".")),Array.isArray(t)&&0===t.length)return null;var i=e;return t.forEach(function(e){i=i instanceof rM?i.controls.hasOwnProperty(e)?i.controls[e]:null:i instanceof aM&&i.at(e)||null}),i}(this,e)}},{key:"getError",value:function(e,t){var n=t?this.get(t):this;return n&&n.errors?n.errors[e]:null}},{key:"hasError",value:function(e,t){return!!this.getError(e,t)}},{key:"_updateControlsErrors",value:function(e){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(e)}},{key:"_initObservables",value:function(){this.valueChanges=new Zl,this.statusChanges=new Zl}},{key:"_calculateStatus",value:function(){return this._allControlsDisabled()?Zk:this.errors?Kk:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(Jk)?Jk:this._anyControlsHaveStatus(Kk)?Kk:Gk}},{key:"_anyControlsHaveStatus",value:function(e){return this._anyControls(function(t){return t.status===e})}},{key:"_anyControlsDirty",value:function(){return this._anyControls(function(e){return e.dirty})}},{key:"_anyControlsTouched",value:function(){return this._anyControls(function(e){return e.touched})}},{key:"_updatePristine",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.pristine=!this._anyControlsDirty(),this._parent&&!e.onlySelf&&this._parent._updatePristine(e)}},{key:"_updateTouched",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.touched=this._anyControlsTouched(),this._parent&&!e.onlySelf&&this._parent._updateTouched(e)}},{key:"_isBoxedValue",value:function(e){return"object"==typeof e&&null!==e&&2===Object.keys(e).length&&"value"in e&&"disabled"in e}},{key:"_registerOnCollectionChange",value:function(e){this._onCollectionChange=e}},{key:"_setUpdateStrategy",value:function(e){tM(e)&&null!=e.updateOn&&(this._updateOn=e.updateOn)}},{key:"_parentMarkedDirty",value:function(e){return!e&&!(!this._parent||!this._parent.dirty)&&!this._parent._anyControlsDirty()}},{key:"validator",get:function(){return this._composedValidatorFn},set:function(e){this._rawValidators=this._composedValidatorFn=e}},{key:"asyncValidator",get:function(){return this._composedAsyncValidatorFn},set:function(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}},{key:"parent",get:function(){return this._parent}},{key:"valid",get:function(){return this.status===Gk}},{key:"invalid",get:function(){return this.status===Kk}},{key:"pending",get:function(){return this.status==Jk}},{key:"disabled",get:function(){return this.status===Zk}},{key:"enabled",get:function(){return this.status!==Zk}},{key:"dirty",get:function(){return!this.pristine}},{key:"untouched",get:function(){return!this.touched}},{key:"updateOn",get:function(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}},{key:"root",get:function(){for(var e=this;e._parent;)e=e._parent;return e}}]),e}(),iM=function(e){_(n,e);var t=w(n);function n(){var e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,r=arguments.length>1?arguments[1]:void 0,a=arguments.length>2?arguments[2]:void 0;return v(this,n),(e=t.call(this,Qk(r),$k(a,r)))._onChange=[],e._applyFormState(i),e._setUpdateStrategy(r),e._initObservables(),e.updateValueAndValidity({onlySelf:!0,emitEvent:!!a}),e}return g(n,[{key:"setValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.value=this._pendingValue=e,this._onChange.length&&!1!==n.emitModelToViewChange&&this._onChange.forEach(function(e){return e(t.value,!1!==n.emitViewToModelChange)}),this.updateValueAndValidity(n)}},{key:"patchValue",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.setValue(e,t)}},{key:"reset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._applyFormState(e),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),this._pendingChange=!1}},{key:"_updateValue",value:function(){}},{key:"_anyControls",value:function(e){return!1}},{key:"_allControlsDisabled",value:function(){return this.disabled}},{key:"registerOnChange",value:function(e){this._onChange.push(e)}},{key:"_unregisterOnChange",value:function(e){qk(this._onChange,e)}},{key:"registerOnDisabledChange",value:function(e){this._onDisabledChange.push(e)}},{key:"_unregisterOnDisabledChange",value:function(e){qk(this._onDisabledChange,e)}},{key:"_forEachChild",value:function(e){}},{key:"_syncPendingControls",value:function(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))}},{key:"_applyFormState",value:function(e){this._isBoxedValue(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}}]),n}(nM),rM=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this,Qk(i),$k(r,i))).controls=e,a._initObservables(),a._setUpdateStrategy(i),a._setUpControls(),a.updateValueAndValidity({onlySelf:!0,emitEvent:!!r}),a}return g(n,[{key:"registerControl",value:function(e,t){return this.controls[e]?this.controls[e]:(this.controls[e]=t,t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange),t)}},{key:"addControl",value:function(e,t){this.registerControl(e,t),this.updateValueAndValidity(),this._onCollectionChange()}},{key:"removeControl",value:function(e){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),delete this.controls[e],this.updateValueAndValidity(),this._onCollectionChange()}},{key:"setControl",value:function(e,t){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),delete this.controls[e],t&&this.registerControl(e,t),this.updateValueAndValidity(),this._onCollectionChange()}},{key:"contains",value:function(e){return this.controls.hasOwnProperty(e)&&this.controls[e].enabled}},{key:"setValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._checkAllValuesPresent(e),Object.keys(e).forEach(function(i){t._throwIfControlMissing(i),t.controls[i].setValue(e[i],{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n)}},{key:"patchValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};Object.keys(e).forEach(function(i){t.controls[i]&&t.controls[i].patchValue(e[i],{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n)}},{key:"reset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._forEachChild(function(n,i){n.reset(e[i],{onlySelf:!0,emitEvent:t.emitEvent})}),this._updatePristine(t),this._updateTouched(t),this.updateValueAndValidity(t)}},{key:"getRawValue",value:function(){return this._reduceChildren({},function(e,t,n){return e[n]=t instanceof iM?t.value:t.getRawValue(),e})}},{key:"_syncPendingControls",value:function(){var e=this._reduceChildren(!1,function(e,t){return!!t._syncPendingControls()||e});return e&&this.updateValueAndValidity({onlySelf:!0}),e}},{key:"_throwIfControlMissing",value:function(e){if(!Object.keys(this.controls).length)throw new Error("\n There are no form controls registered with this group yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.controls[e])throw new Error("Cannot find form control with name: ".concat(e,"."))}},{key:"_forEachChild",value:function(e){var t=this;Object.keys(this.controls).forEach(function(n){return e(t.controls[n],n)})}},{key:"_setUpControls",value:function(){var e=this;this._forEachChild(function(t){t.setParent(e),t._registerOnCollectionChange(e._onCollectionChange)})}},{key:"_updateValue",value:function(){this.value=this._reduceValue()}},{key:"_anyControls",value:function(e){for(var t=0,n=Object.keys(this.controls);t0||this.disabled}},{key:"_checkAllValuesPresent",value:function(e){this._forEachChild(function(t,n){if(void 0===e[n])throw new Error("Must supply a value for form control with name: '".concat(n,"'."))})}}]),n}(nM),aM=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this,Qk(i),$k(r,i))).controls=e,a._initObservables(),a._setUpdateStrategy(i),a._setUpControls(),a.updateValueAndValidity({onlySelf:!0,emitEvent:!!r}),a}return g(n,[{key:"at",value:function(e){return this.controls[e]}},{key:"push",value:function(e){this.controls.push(e),this._registerControl(e),this.updateValueAndValidity(),this._onCollectionChange()}},{key:"insert",value:function(e,t){this.controls.splice(e,0,t),this._registerControl(t),this.updateValueAndValidity()}},{key:"removeAt",value:function(e){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),this.controls.splice(e,1),this.updateValueAndValidity()}},{key:"setControl",value:function(e,t){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),this.controls.splice(e,1),t&&(this.controls.splice(e,0,t),this._registerControl(t)),this.updateValueAndValidity(),this._onCollectionChange()}},{key:"setValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._checkAllValuesPresent(e),e.forEach(function(e,i){t._throwIfControlMissing(i),t.at(i).setValue(e,{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n)}},{key:"patchValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e.forEach(function(e,i){t.at(i)&&t.at(i).patchValue(e,{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n)}},{key:"reset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._forEachChild(function(n,i){n.reset(e[i],{onlySelf:!0,emitEvent:t.emitEvent})}),this._updatePristine(t),this._updateTouched(t),this.updateValueAndValidity(t)}},{key:"getRawValue",value:function(){return this.controls.map(function(e){return e instanceof iM?e.value:e.getRawValue()})}},{key:"clear",value:function(){this.controls.length<1||(this._forEachChild(function(e){return e._registerOnCollectionChange(function(){})}),this.controls.splice(0),this.updateValueAndValidity())}},{key:"_syncPendingControls",value:function(){var e=this.controls.reduce(function(e,t){return!!t._syncPendingControls()||e},!1);return e&&this.updateValueAndValidity({onlySelf:!0}),e}},{key:"_throwIfControlMissing",value:function(e){if(!this.controls.length)throw new Error("\n There are no form controls registered with this array yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.at(e))throw new Error("Cannot find form control at index ".concat(e))}},{key:"_forEachChild",value:function(e){this.controls.forEach(function(t,n){e(t,n)})}},{key:"_updateValue",value:function(){var e=this;this.value=this.controls.filter(function(t){return t.enabled||e.disabled}).map(function(e){return e.value})}},{key:"_anyControls",value:function(e){return this.controls.some(function(t){return t.enabled&&e(t)})}},{key:"_setUpControls",value:function(){var e=this;this._forEachChild(function(t){return e._registerControl(t)})}},{key:"_checkAllValuesPresent",value:function(e){this._forEachChild(function(t,n){if(void 0===e[n])throw new Error("Must supply a value for form control at index: ".concat(n,"."))})}},{key:"_allControlsDisabled",value:function(){var e,t=c(this.controls);try{for(t.s();!(e=t.n()).done;)if(e.value.enabled)return!1}catch(n){t.e(n)}finally{t.f()}return this.controls.length>0||this.disabled}},{key:"_registerControl",value:function(e){e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)}},{key:"length",get:function(){return this.controls.length}}]),n}(nM),oM={provide:gk,useExisting:Te(function(){return uM})},sM=function(){return Promise.resolve(null)}(),uM=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this)).submitted=!1,r._directives=[],r.ngSubmit=new Zl,r.form=new rM({},ck(e),dk(i)),r}return g(n,[{key:"ngAfterViewInit",value:function(){this._setUpdateStrategy()}},{key:"addControl",value:function(e){var t=this;sM.then(function(){var n=t._findContainer(e.path);e.control=n.registerControl(e.name,e.control),Hk(e.control,e),e.control.updateValueAndValidity({emitEvent:!1}),t._directives.push(e)})}},{key:"getControl",value:function(e){return this.form.get(e.path)}},{key:"removeControl",value:function(e){var t=this;sM.then(function(){var n=t._findContainer(e.path);n&&n.removeControl(e.name),qk(t._directives,e)})}},{key:"addFormGroup",value:function(e){var t=this;sM.then(function(){var n=t._findContainer(e.path),i=new rM({});Vk(i,e),n.registerControl(e.name,i),i.updateValueAndValidity({emitEvent:!1})})}},{key:"removeFormGroup",value:function(e){var t=this;sM.then(function(){var n=t._findContainer(e.path);n&&n.removeControl(e.name)})}},{key:"getFormGroup",value:function(e){return this.form.get(e.path)}},{key:"updateModel",value:function(e,t){var n=this;sM.then(function(){n.form.get(e.path).setValue(t)})}},{key:"setValue",value:function(e){this.control.setValue(e)}},{key:"onSubmit",value:function(e){return this.submitted=!0,zk(this.form,this._directives),this.ngSubmit.emit(e),!1}},{key:"onReset",value:function(){this.resetForm()}},{key:"resetForm",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;this.form.reset(e),this.submitted=!1}},{key:"_setUpdateStrategy",value:function(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)}},{key:"_findContainer",value:function(e){return e.pop(),e.length?this.form.get(e):this.form}},{key:"formDirective",get:function(){return this}},{key:"control",get:function(){return this.form}},{key:"path",get:function(){return[]}},{key:"controls",get:function(){return this.form.controls}}]),n}(gk);return e.\u0275fac=function(t){return new(t||e)(ms(tk,10),ms(nk,10))},e.\u0275dir=gt({type:e,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(e,t){1&e&&Ls("submit",function(e){return t.onSubmit(e)})("reset",function(){return t.onReset()})},inputs:{options:["ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[Eu([oM]),Jo]}),e}(),lM=function(){var e=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return g(n,[{key:"ngOnInit",value:function(){this._checkParentType(),this.formDirective.addFormGroup(this)}},{key:"ngOnDestroy",value:function(){this.formDirective&&this.formDirective.removeFormGroup(this)}},{key:"_checkParentType",value:function(){}},{key:"control",get:function(){return this.formDirective.getFormGroup(this)}},{key:"path",get:function(){return Fk(null==this.name?this.name:this.name.toString(),this._parent)}},{key:"formDirective",get:function(){return this._parent?this._parent.formDirective:null}}]),n}(gk);return e.\u0275fac=function(t){return cM(t||e)},e.\u0275dir=gt({type:e,features:[Jo]}),e}(),cM=bi(lM),dM=function(){var e=function e(){v(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275dir=gt({type:e,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""]}),e}(),hM=new Si("NgModelWithFormControlWarning"),fM={provide:gk,useExisting:Te(function(){return pM})},pM=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this)).validators=e,r.asyncValidators=i,r.submitted=!1,r.directives=[],r.form=null,r.ngSubmit=new Zl,r._setValidators(e),r._setAsyncValidators(i),r}return g(n,[{key:"ngOnChanges",value:function(e){this._checkFormPresent(),e.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}},{key:"addControl",value:function(e){var t=this.form.get(e.path);return Hk(t,e),t.updateValueAndValidity({emitEvent:!1}),this.directives.push(e),t}},{key:"getControl",value:function(e){return this.form.get(e.path)}},{key:"removeControl",value:function(e){qk(this.directives,e)}},{key:"addFormGroup",value:function(e){var t=this.form.get(e.path);Vk(t,e),t.updateValueAndValidity({emitEvent:!1})}},{key:"removeFormGroup",value:function(e){}},{key:"getFormGroup",value:function(e){return this.form.get(e.path)}},{key:"addFormArray",value:function(e){var t=this.form.get(e.path);Vk(t,e),t.updateValueAndValidity({emitEvent:!1})}},{key:"removeFormArray",value:function(e){}},{key:"getFormArray",value:function(e){return this.form.get(e.path)}},{key:"updateModel",value:function(e,t){this.form.get(e.path).setValue(t)}},{key:"onSubmit",value:function(e){return this.submitted=!0,zk(this.form,this.directives),this.ngSubmit.emit(e),!1}},{key:"onReset",value:function(){this.resetForm()}},{key:"resetForm",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;this.form.reset(e),this.submitted=!1}},{key:"_updateDomValue",value:function(){var e=this;this.directives.forEach(function(t){var n=e.form.get(t.path);t.control!==n&&(function(e,t){var n=function(){};t.valueAccessor.registerOnChange(n),t.valueAccessor.registerOnTouched(n),Bk(e,t,!0),e&&(t._invokeOnDestroyCallbacks(),e._registerOnCollectionChange(function(){}))}(t.control||null,t),n&&Hk(n,t),t.control=n)}),this.form._updateTreeValidity({emitEvent:!1})}},{key:"_updateRegistrations",value:function(){var e=this;this.form._registerOnCollectionChange(function(){return e._updateDomValue()}),this._oldForm&&this._oldForm._registerOnCollectionChange(function(){})}},{key:"_updateValidators",value:function(){Nk(this.form,this,!1),this._oldForm&&Bk(this._oldForm,this,!1)}},{key:"_checkFormPresent",value:function(){}},{key:"formDirective",get:function(){return this}},{key:"control",get:function(){return this.form}},{key:"path",get:function(){return[]}}]),n}(gk);return e.\u0275fac=function(t){return new(t||e)(ms(tk,10),ms(nk,10))},e.\u0275dir=gt({type:e,selectors:[["","formGroup",""]],hostBindings:function(e,t){1&e&&Ls("submit",function(e){return t.onSubmit(e)})("reset",function(){return t.onReset()})},inputs:{form:["formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[Eu([fM]),Jo,Yt]}),e}(),mM={provide:gk,useExisting:Te(function(){return gM})},gM=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this))._parent=e,a._setValidators(i),a._setAsyncValidators(r),a}return g(n,[{key:"_checkParentType",value:function(){yM(this._parent)}}]),n}(lM);return e.\u0275fac=function(t){return new(t||e)(ms(gk,13),ms(tk,10),ms(nk,10))},e.\u0275dir=gt({type:e,selectors:[["","formGroupName",""]],inputs:{name:["formGroupName","name"]},features:[Eu([mM]),Jo]}),e}(),vM={provide:gk,useExisting:Te(function(){return _M})},_M=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this))._parent=e,a._setValidators(i),a._setAsyncValidators(r),a}return g(n,[{key:"ngOnInit",value:function(){this._checkParentType(),this.formDirective.addFormArray(this)}},{key:"ngOnDestroy",value:function(){this.formDirective&&this.formDirective.removeFormArray(this)}},{key:"_checkParentType",value:function(){yM(this._parent)}},{key:"control",get:function(){return this.formDirective.getFormArray(this)}},{key:"formDirective",get:function(){return this._parent?this._parent.formDirective:null}},{key:"path",get:function(){return Fk(null==this.name?this.name:this.name.toString(),this._parent)}}]),n}(gk);return e.\u0275fac=function(t){return new(t||e)(ms(gk,13),ms(tk,10),ms(nk,10))},e.\u0275dir=gt({type:e,selectors:[["","formArrayName",""]],inputs:{name:["formArrayName","name"]},features:[Eu([vM]),Jo]}),e}();function yM(e){return!(e instanceof gM||e instanceof pM||e instanceof _M)}var bM={provide:_k,useExisting:Te(function(){return wM})},wM=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r,o,s){var u;return v(this,n),(u=t.call(this))._ngModelWarningConfig=s,u._added=!1,u.update=new Zl,u._ngModelWarningSent=!1,u._parent=e,u._setValidators(i),u._setAsyncValidators(r),u.valueAccessor=function(e,t){if(!t)return null;Array.isArray(t);var n=void 0,i=void 0,r=void 0;return t.forEach(function(e){var t;e.constructor===Xw?n=e:(t=e,Uk.some(function(e){return t.constructor===e})?i=e:r=e)}),r||i||n||null}(a(u),o),u}return g(n,[{key:"ngOnChanges",value:function(e){this._added||this._setUpControl(),function(e,t){if(!e.hasOwnProperty("model"))return!1;var n=e.model;return!!n.isFirstChange()||!Object.is(t,n.currentValue)}(e,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}},{key:"ngOnDestroy",value:function(){this.formDirective&&this.formDirective.removeControl(this)}},{key:"viewToModelUpdate",value:function(e){this.viewModel=e,this.update.emit(e)}},{key:"_checkParentType",value:function(){}},{key:"_setUpControl",value:function(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0}},{key:"isDisabled",set:function(e){}},{key:"path",get:function(){return Fk(null==this.name?this.name:this.name.toString(),this._parent)}},{key:"formDirective",get:function(){return this._parent?this._parent.formDirective:null}}]),n}(_k);return e.\u0275fac=function(t){return new(t||e)(ms(gk,13),ms(tk,10),ms(nk,10),ms(Gw,10),ms(hM,8))},e.\u0275dir=gt({type:e,selectors:[["","formControlName",""]],inputs:{isDisabled:["disabled","isDisabled"],name:["formControlName","name"],model:["ngModel","model"]},outputs:{update:"ngModelChange"},features:[Eu([bM]),Jo,Yt]}),e._ngModelWarningSentOnce=!1,e}(),kM={provide:tk,useExisting:Te(function(){return MM}),multi:!0},MM=function(){var e=function(){function e(){v(this,e),this._required=!1}return g(e,[{key:"validate",value:function(e){return this.required?rk.required(e):null}},{key:"registerOnValidatorChange",value:function(e){this._onChange=e}},{key:"required",get:function(){return this._required},set:function(e){this._required=null!=e&&!1!==e&&"false"!=="".concat(e),this._onChange&&this._onChange()}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275dir=gt({type:e,selectors:[["","required","","formControlName","",3,"type","checkbox"],["","required","","formControl","",3,"type","checkbox"],["","required","","ngModel","",3,"type","checkbox"]],hostVars:1,hostBindings:function(e,t){2&e&&cs("required",t.required?"":null)},inputs:{required:"required"},features:[Eu([kM])]}),e}(),SM={provide:tk,useExisting:Te(function(){return CM}),multi:!0},CM=function(){var e=function(){function e(){v(this,e),this._validator=rk.nullValidator}return g(e,[{key:"ngOnChanges",value:function(e){"maxlength"in e&&(this._createValidator(),this._onChange&&this._onChange())}},{key:"validate",value:function(e){return null!=this.maxlength?this._validator(e):null}},{key:"registerOnValidatorChange",value:function(e){this._onChange=e}},{key:"_createValidator",value:function(){this._validator=rk.maxLength("number"==typeof this.maxlength?this.maxlength:parseInt(this.maxlength,10))}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275dir=gt({type:e,selectors:[["","maxlength","","formControlName",""],["","maxlength","","formControl",""],["","maxlength","","ngModel",""]],hostVars:1,hostBindings:function(e,t){2&e&&cs("maxlength",t.maxlength?t.maxlength:null)},inputs:{maxlength:"maxlength"},features:[Eu([SM]),Yt]}),e}(),xM=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)}}),e}();function LM(e){return void 0!==e.asyncValidators||void 0!==e.validators||void 0!==e.updateOn}var TM=function(){var e=function(){function e(){v(this,e)}return g(e,[{key:"group",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=this._reduceControls(e),i=null,r=null,a=void 0;return null!=t&&(LM(t)?(i=null!=t.validators?t.validators:null,r=null!=t.asyncValidators?t.asyncValidators:null,a=null!=t.updateOn?t.updateOn:void 0):(i=null!=t.validator?t.validator:null,r=null!=t.asyncValidator?t.asyncValidator:null)),new rM(n,{asyncValidators:r,updateOn:a,validators:i})}},{key:"control",value:function(e,t,n){return new iM(e,t,n)}},{key:"array",value:function(e,t,n){var i=this,r=e.map(function(e){return i._createControl(e)});return new aM(r,t,n)}},{key:"_reduceControls",value:function(e){var t=this,n={};return Object.keys(e).forEach(function(i){n[i]=t._createControl(e[i])}),n}},{key:"_createControl",value:function(e){return e instanceof iM||e instanceof rM||e instanceof aM?e:Array.isArray(e)?this.control(e[0],e.length>1?e[1]:null,e.length>2?e[2]:null):this.control(e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),DM=function(){var e=function(){function e(){v(this,e)}return g(e,null,[{key:"withConfig",value:function(t){return{ngModule:e,providers:[{provide:hM,useValue:t.warnOnNgModelWithFormControl}]}}}]),e}();return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[TM,Ck],imports:[xM]}),e}();function OM(e,t){if(1&e){var n=Ss();_s(0,"img",3),Ls("click",function(){return sn(n),As().closePopup()}),ys()}}var EM=function(e){return{"red-title":e}},PM=["*"],AM=function(){function e(e){this.matDialog=e,this.useRedTitle=!1}return Object.defineProperty(e.prototype,"dialog",{set:function(e){e.disableClose=!0,this.dialogInternal=e},enumerable:!1,configurable:!0}),e.prototype.onKeyUp=function(){this.closePopup()},e.prototype.closePopup=function(){this.disableDismiss||this.matDialog.openDialogs[this.matDialog.openDialogs.length-1].id===this.dialogInternal.id&&this.dialogInternal.close()},e.\u0275fac=function(t){return new(t||e)(ms(Aw))},e.\u0275cmp=lt({type:e,selectors:[["app-modal"]],hostBindings:function(e,t){1&e&&Ls("keyup.esc",function(){return t.onKeyUp()},!1,Br)},inputs:{useRedTitle:"useRedTitle",headline:"headline",disableDismiss:"disableDismiss",dialog:"dialog"},ngContentSelectors:PM,decls:13,vars:5,consts:[[1,"-header",3,"ngClass"],["class","image-button","src","assets/img/delete-grey.png",3,"click",4,"ngIf"],[1,"modal"],["src","assets/img/delete-grey.png",1,"image-button",3,"click"]],template:function(e,t){1&e&&(Is(),_s(0,"div",0),ou(1),fs(2,OM,1,0,"img",1),ou(3,"\n"),ys(),ou(4,"\n"),_s(5,"div",2),ou(6,"\n "),_s(7,"mat-dialog-content"),ou(8,"\n "),Rs(9),ou(10,"\n "),ys(),ou(11,"\n"),ys(),ou(12,"\n")),2&e&&(gs("ngClass",Rl(3,EM,t.useRedTitle)),Pa(1),uu("\n ",t.headline,"\n "),Pa(1),gs("ngIf",!t.disableDismiss))},directives:[lh,fh,Yw],styles:['.-header[_ngcontent-%COMP%]{background-color:#f7f7f7;line-height:50px;position:relative;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 32px;font-size:14px}.-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:32px;position:absolute;right:9px;top:9px}mat-dialog-content[_ngcontent-%COMP%]:after, mat-dialog-content[_ngcontent-%COMP%]:before{content:"";padding-top:24px;height:0;display:block}.red-title[_ngcontent-%COMP%]{text-transform:uppercase;font-weight:700;letter-spacing:1px;color:#ff004e}']}),e}();function YM(e,t){var n=!1;return arguments.length>=2&&(n=!0),function(i){return i.lift(new IM(e,t,n))}}var IM=function(){function e(t,n){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];v(this,e),this.accumulator=t,this.seed=n,this.hasSeed=i}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new RM(e,this.accumulator,this.seed,this.hasSeed))}}]),e}(),RM=function(e){_(n,e);var t=w(n);function n(e,i,r,a){var o;return v(this,n),(o=t.call(this,e)).accumulator=i,o._seed=r,o.hasSeed=a,o.index=0,o}return g(n,[{key:"_next",value:function(e){if(this.hasSeed)return this._tryNext(e);this.seed=e,this.destination.next(e)}},{key:"_tryNext",value:function(e){var t,n=this.index++;try{t=this.accumulator(this.seed,e,n)}catch(i){this.destination.error(i)}this.seed=t,this.destination.next(t)}},{key:"seed",get:function(){return this._seed},set:function(e){this.hasSeed=!0,this._seed=e}}]),n}(Y);function FM(e){return function(t){return 0===e?Cf():t.lift(new HM(e))}}var HM=function(){function e(t){if(v(this,e),this.total=t,this.total<0)throw new Vf}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new jM(e,this.total))}}]),e}(),jM=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,e)).total=i,r.ring=new Array,r.count=0,r}return g(n,[{key:"_next",value:function(e){var t=this.ring,n=this.total,i=this.count++;t.length0)for(var n=this.count>=this.total?this.total:this.count,i=this.ring,r=0;r5&&void 0!==arguments[5])||arguments[5],s=arguments.length>6&&void 0!==arguments[6]&&arguments[6];v(this,e),this.store=t,this.currentLoader=n,this.compiler=i,this.parser=r,this.missingTranslationHandler=a,this.useDefaultLang=o,this.isolate=s,this.pending=!1,this._onTranslationChange=new Zl,this._onLangChange=new Zl,this._onDefaultLangChange=new Zl,this._langs=[],this._translations={},this._translationRequests={}}return g(e,[{key:"setDefaultLang",value:function(e){var t=this;if(e!==this.defaultLang){var n=this.retrieveTranslations(e);void 0!==n?(this.defaultLang||(this.defaultLang=e),n.pipe(Uf(1)).subscribe(function(n){t.changeDefaultLang(e)})):this.changeDefaultLang(e)}}},{key:"getDefaultLang",value:function(){return this.defaultLang}},{key:"use",value:function(e){var t=this;if(e===this.currentLang)return xf(this.translations[e]);var n=this.retrieveTranslations(e);return void 0!==n?(this.currentLang||(this.currentLang=e),n.pipe(Uf(1)).subscribe(function(n){t.changeLang(e)}),n):(this.changeLang(e),xf(this.translations[e]))}},{key:"retrieveTranslations",value:function(e){var t;return void 0===this.translations[e]&&(this._translationRequests[e]=this._translationRequests[e]||this.getTranslation(e),t=this._translationRequests[e]),t}},{key:"getTranslation",value:function(e){var t=this;return this.pending=!0,this.loadingTranslations=this.currentLoader.getTranslation(e).pipe(ke()),this.loadingTranslations.pipe(Uf(1)).subscribe(function(n){t.translations[e]=t.compiler.compileTranslations(n,e),t.updateLangs(),t.pending=!1},function(e){t.pending=!1}),this.loadingTranslations}},{key:"setTranslation",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];t=this.compiler.compileTranslations(t,e),this.translations[e]=n&&this.translations[e]?XM(this.translations[e],t):t,this.updateLangs(),this.onTranslationChange.emit({lang:e,translations:this.translations[e]})}},{key:"getLangs",value:function(){return this.langs}},{key:"addLangs",value:function(e){var t=this;e.forEach(function(e){-1===t.langs.indexOf(e)&&t.langs.push(e)})}},{key:"updateLangs",value:function(){this.addLangs(Object.keys(this.translations))}},{key:"getParsedResult",value:function(e,t,n){var i;if(t instanceof Array){var r,a={},o=!1,s=c(t);try{for(s.s();!(r=s.n()).done;){var u=r.value;a[u]=this.getParsedResult(e,u,n),"function"==typeof a[u].subscribe&&(o=!0)}}catch(g){s.e(g)}finally{s.f()}if(o){var l,d,h=c(t);try{for(h.s();!(d=h.n()).done;){var f=d.value,p="function"==typeof a[f].subscribe?a[f]:xf(a[f]);l=void 0===l?p:pe(l,p)}}catch(g){h.e(g)}finally{h.f()}return l.pipe(function(e,t){return arguments.length>=2?function(n){return H(YM(e,t),FM(1),Gf(t))(n)}:function(t){return H(YM(function(t,n,i){return e(t,n,i+1)}),FM(1))(t)}}(NM,[]),ie(function(e){var n={};return e.forEach(function(e,i){n[t[i]]=e}),n}))}return a}if(e&&(i=this.parser.interpolate(this.parser.getValue(e,t),n)),void 0===i&&this.defaultLang&&this.defaultLang!==this.currentLang&&this.useDefaultLang&&(i=this.parser.interpolate(this.parser.getValue(this.translations[this.defaultLang],t),n)),void 0===i){var m={key:t,translateService:this};void 0!==n&&(m.interpolateParams=n),i=this.missingTranslationHandler.handle(m)}return void 0!==i?i:t}},{key:"get",value:function(e,t){var n=this;if(!ZM(e)||!e.length)throw new Error('Parameter "key" required');if(this.pending)return N.create(function(i){var r=function(e){i.next(e),i.complete()},a=function(e){i.error(e)};n.loadingTranslations.subscribe(function(i){"function"==typeof(i=n.getParsedResult(n.compiler.compileTranslations(i,n.currentLang),e,t)).subscribe?i.subscribe(r,a):r(i)},a)});var i=this.getParsedResult(this.translations[this.currentLang],e,t);return"function"==typeof i.subscribe?i:xf(i)}},{key:"stream",value:function(e,t){var n=this;if(!ZM(e)||!e.length)throw new Error('Parameter "key" required');return Cm(this.get(e,t),this.onLangChange.pipe(Lm(function(i){var r=n.getParsedResult(i.translations,e,t);return"function"==typeof r.subscribe?r:xf(r)})))}},{key:"instant",value:function(e,t){if(!ZM(e)||!e.length)throw new Error('Parameter "key" required');var n=this.getParsedResult(this.translations[this.currentLang],e,t);if(void 0!==n.subscribe){if(e instanceof Array){var i={};return e.forEach(function(t,n){i[e[n]]=e[n]}),i}return e}return n}},{key:"set",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.currentLang;this.translations[n][e]=this.compiler.compile(t,n),this.updateLangs(),this.onTranslationChange.emit({lang:n,translations:this.translations[n]})}},{key:"changeLang",value:function(e){this.currentLang=e,this.onLangChange.emit({lang:e,translations:this.translations[e]}),this.defaultLang||this.changeDefaultLang(e)}},{key:"changeDefaultLang",value:function(e){this.defaultLang=e,this.onDefaultLangChange.emit({lang:e,translations:this.translations[e]})}},{key:"reloadLang",value:function(e){return this.resetLang(e),this.getTranslation(e)}},{key:"resetLang",value:function(e){this._translationRequests[e]=void 0,this.translations[e]=void 0}},{key:"getBrowserLang",value:function(){if("undefined"!=typeof window&&void 0!==window.navigator){var e=window.navigator.languages?window.navigator.languages[0]:null;return-1!==(e=e||window.navigator.language||window.navigator.browserLanguage||window.navigator.userLanguage).indexOf("-")&&(e=e.split("-")[0]),-1!==e.indexOf("_")&&(e=e.split("_")[0]),e}}},{key:"getBrowserCultureLang",value:function(){if("undefined"!=typeof window&&void 0!==window.navigator)return(window.navigator.languages?window.navigator.languages[0]:null)||window.navigator.language||window.navigator.browserLanguage||window.navigator.userLanguage}},{key:"onTranslationChange",get:function(){return this.isolate?this._onTranslationChange:this.store.onTranslationChange}},{key:"onLangChange",get:function(){return this.isolate?this._onLangChange:this.store.onLangChange}},{key:"onDefaultLangChange",get:function(){return this.isolate?this._onDefaultLangChange:this.store.onDefaultLangChange}},{key:"defaultLang",get:function(){return this.isolate?this._defaultLang:this.store.defaultLang},set:function(e){this.isolate?this._defaultLang=e:this.store.defaultLang=e}},{key:"currentLang",get:function(){return this.isolate?this._currentLang:this.store.currentLang},set:function(e){this.isolate?this._currentLang=e:this.store.currentLang=e}},{key:"langs",get:function(){return this.isolate?this._langs:this.store.langs},set:function(e){this.isolate?this._langs=e:this.store.langs=e}},{key:"translations",get:function(){return this.isolate?this._translations:this.store.translations},set:function(e){this.isolate?this._translations=e:this.store.translations=e}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(nS),Gi(BM),Gi(qM),Gi($M),Gi(UM),Gi(rS),Gi(iS))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),oS=function(){var e=function(){function e(t,n){v(this,e),this.translate=t,this._ref=n,this.value=""}return g(e,[{key:"updateValue",value:function(e,t,n){var i=this,r=function(t){i.value=void 0!==t?t:e,i.lastKey=e,i._ref.markForCheck()};if(n){var a=this.translate.getParsedResult(n,e,t);"function"==typeof a.subscribe?a.subscribe(r):r(a)}this.translate.get(e,t).subscribe(r)}},{key:"transform",value:function(e){var t,n=this;if(!e||0===e.length)return e;for(var i=arguments.length,r=new Array(i>1?i-1:0),a=1;a0&&void 0!==arguments[0]?arguments[0]:{};return{ngModule:e,providers:[t.loader||{provide:BM,useClass:WM},t.compiler||{provide:qM,useClass:GM},t.parser||{provide:$M,useClass:eS},t.missingTranslationHandler||{provide:UM,useClass:zM},nS,{provide:iS,useValue:t.isolate},{provide:rS,useValue:t.useDefaultLang},aS]}}},{key:"forChild",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{ngModule:e,providers:[t.loader||{provide:BM,useClass:WM},t.compiler||{provide:qM,useClass:GM},t.parser||{provide:$M,useClass:eS},t.missingTranslationHandler||{provide:UM,useClass:zM},{provide:iS,useValue:t.isolate},{provide:rS,useValue:t.useDefaultLang},aS]}}}]),e}();return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)}}),e}(),uS=function(){function e(e){this.dialogRef=e}return e.openDialog=function(t){var n=new bw;return n.autoFocus=!1,n.width="450px",t.open(e,n)},e.\u0275fac=function(t){return new(t||e)(ms(xw))},e.\u0275cmp=lt({type:e,selectors:[["app-hw-added-dialog"]],decls:16,vars:13,consts:[[3,"headline","dialog"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),_s(3,"p"),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),_s(7,"p"),ou(8),Vl(9,"translate"),ys(),ou(10,"\n "),_s(11,"p"),ou(12),Vl(13,"translate"),ys(),ou(14,"\n"),ys(),ou(15,"\n")),2&e&&(gs("headline",Ul(1,5,"hardware-wallet.pin-help.title"))("dialog",t.dialogRef),Pa(4),su(Ul(5,7,"hardware-wallet.pin-help.part1")),Pa(4),su(Ul(9,9,"hardware-wallet.pin-help.part2")),Pa(4),su(Ul(13,11,"hardware-wallet.pin-help.part3")))},directives:[AM],pipes:[oS],styles:[""]}),e}();function lS(e,t){if(1&e&&(In(),bs(0,"circle",3)),2&e){var n=As();Gs("animation-name","mat-progress-spinner-stroke-rotate-"+n._spinnerAnimationLabel)("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),cs("r",n._getCircleRadius())}}function cS(e,t){if(1&e&&(In(),bs(0,"circle",3)),2&e){var n=As();Gs("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),cs("r",n._getCircleRadius())}}function dS(e,t){if(1&e&&(In(),bs(0,"circle",3)),2&e){var n=As();Gs("animation-name","mat-progress-spinner-stroke-rotate-"+n._spinnerAnimationLabel)("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),cs("r",n._getCircleRadius())}}function hS(e,t){if(1&e&&(In(),bs(0,"circle",3)),2&e){var n=As();Gs("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),cs("r",n._getCircleRadius())}}var fS=".mat-progress-spinner{display:block;position:relative;overflow:hidden}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}._mat-animation-noopable.mat-progress-spinner circle{transition:none;animation:none}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:currentColor}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4000ms;animation-timing-function:cubic-bezier(0.35, 0, 0.25, 1);animation-iteration-count:infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{animation:mat-progress-spinner-stroke-rotate-fallback 10000ms cubic-bezier(0.87, 0.03, 0.33, 1) infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition:none;animation:none}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.606171575px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.606171575px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.606171575px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.606171575px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0deg)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}\n",pS=Hb(function e(t){v(this,e),this._elementRef=t},"primary"),mS=new Si("mat-progress-spinner-default-options",{providedIn:"root",factory:function(){return{diameter:100}}}),gS=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r,a,o){var s;v(this,n),(s=t.call(this,e))._elementRef=e,s._document=r,s._diameter=100,s._value=0,s._fallbackAnimation=!1,s.mode="determinate";var u=n._diameters;return s._spinnerAnimationLabel=s._getSpinnerAnimationLabel(),u.has(r.head)||u.set(r.head,new Set([100])),s._fallbackAnimation=i.EDGE||i.TRIDENT,s._noopAnimations="NoopAnimations"===a&&!!o&&!o._forceAnimations,o&&(o.diameter&&(s.diameter=o.diameter),o.strokeWidth&&(s.strokeWidth=o.strokeWidth)),s}return g(n,[{key:"ngOnInit",value:function(){var e=this._elementRef.nativeElement;this._styleRoot=zm(e)||this._document.head,this._attachStyleNode();var t="mat-progress-spinner-indeterminate".concat(this._fallbackAnimation?"-fallback":"","-animation");e.classList.add(t)}},{key:"_getCircleRadius",value:function(){return(this.diameter-10)/2}},{key:"_getViewBox",value:function(){var e=2*this._getCircleRadius()+this.strokeWidth;return"0 0 ".concat(e," ").concat(e)}},{key:"_getStrokeCircumference",value:function(){return 2*Math.PI*this._getCircleRadius()}},{key:"_getStrokeDashOffset",value:function(){return"determinate"===this.mode?this._getStrokeCircumference()*(100-this._value)/100:this._fallbackAnimation&&"indeterminate"===this.mode?.2*this._getStrokeCircumference():null}},{key:"_getCircleStrokeWidth",value:function(){return this.strokeWidth/this.diameter*100}},{key:"_attachStyleNode",value:function(){var e=this._styleRoot,t=this._diameter,i=n._diameters,r=i.get(e);if(!r||!r.has(t)){var a=this._document.createElement("style");a.setAttribute("mat-spinner-animation",this._spinnerAnimationLabel),a.textContent=this._getAnimationText(),e.appendChild(a),r||(r=new Set,i.set(e,r)),r.add(t)}}},{key:"_getAnimationText",value:function(){var e=this._getStrokeCircumference();return"\n @keyframes mat-progress-spinner-stroke-rotate-DIAMETER {\n 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }\n 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }\n 12.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n\n 25.0001% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }\n 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }\n 37.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n\n 50.0001% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }\n 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }\n 62.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n\n 75.0001% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }\n 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }\n 87.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n }\n".replace(/START_VALUE/g,"".concat(.95*e)).replace(/END_VALUE/g,"".concat(.2*e)).replace(/DIAMETER/g,"".concat(this._spinnerAnimationLabel))}},{key:"_getSpinnerAnimationLabel",value:function(){return this.diameter.toString().replace(".","_")}},{key:"diameter",get:function(){return this._diameter},set:function(e){this._diameter=$p(e),this._spinnerAnimationLabel=this._getSpinnerAnimationLabel(),!this._fallbackAnimation&&this._styleRoot&&this._attachStyleNode()}},{key:"strokeWidth",get:function(){return this._strokeWidth||this.diameter/10},set:function(e){this._strokeWidth=$p(e)}},{key:"value",get:function(){return"determinate"===this.mode?this._value:0},set:function(e){this._value=Math.max(0,Math.min(100,$p(e)))}}]),n}(pS);return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(Nm),ms(Md,8),ms(xb,8),ms(mS))},e.\u0275cmp=lt({type:e,selectors:[["mat-progress-spinner"]],hostAttrs:["role","progressbar",1,"mat-progress-spinner"],hostVars:10,hostBindings:function(e,t){2&e&&(cs("aria-valuemin","determinate"===t.mode?0:null)("aria-valuemax","determinate"===t.mode?100:null)("aria-valuenow","determinate"===t.mode?t.value:null)("mode",t.mode),Gs("width",t.diameter,"px")("height",t.diameter,"px"),Ks("_mat-animation-noopable",t._noopAnimations))},inputs:{color:"color",mode:"mode",diameter:"diameter",strokeWidth:"strokeWidth",value:"value"},exportAs:["matProgressSpinner"],features:[Jo],decls:9,vars:8,consts:[["preserveAspectRatio","xMidYMid meet","focusable","false",3,"ngSwitch"],["cx","50%","cy","50%",3,"animation-name","stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%",3,"stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%"]],template:function(e,t){1&e&&(ou(0,"\n\n"),In(),_s(1,"svg",0),ou(2,"\n\n "),ou(3,"\n "),fs(4,lS,1,9,"circle",1),ou(5,"\n\n "),fs(6,cS,1,7,"circle",2),ou(7,"\n"),ys(),ou(8,"\n")),2&e&&(Pa(1),Gs("width",t.diameter,"px")("height",t.diameter,"px"),gs("ngSwitch","indeterminate"===t.mode),cs("viewBox",t._getViewBox()),Pa(3),gs("ngSwitchCase",!0),Pa(2),gs("ngSwitchCase",!1))},directives:[vh,_h],styles:[fS],encapsulation:2,changeDetection:0}),e._diameters=new WeakMap,e}(),vS=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r,a,o){var s;return v(this,n),(s=t.call(this,e,i,r,a,o)).mode="indeterminate",s}return n}(gS);return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(Nm),ms(Md,8),ms(xb,8),ms(mS))},e.\u0275cmp=lt({type:e,selectors:[["mat-spinner"]],hostAttrs:["role","progressbar","mode","indeterminate",1,"mat-spinner","mat-progress-spinner"],hostVars:6,hostBindings:function(e,t){2&e&&(Gs("width",t.diameter,"px")("height",t.diameter,"px"),Ks("_mat-animation-noopable",t._noopAnimations))},inputs:{color:"color"},features:[Jo],decls:9,vars:8,consts:[["preserveAspectRatio","xMidYMid meet","focusable","false",3,"ngSwitch"],["cx","50%","cy","50%",3,"animation-name","stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%",3,"stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%"]],template:function(e,t){1&e&&(ou(0,"\n\n"),In(),_s(1,"svg",0),ou(2,"\n\n "),ou(3,"\n "),fs(4,dS,1,9,"circle",1),ou(5,"\n\n "),fs(6,hS,1,7,"circle",2),ou(7,"\n"),ys(),ou(8,"\n")),2&e&&(Pa(1),Gs("width",t.diameter,"px")("height",t.diameter,"px"),gs("ngSwitch","indeterminate"===t.mode),cs("viewBox",t._getViewBox()),Pa(3),gs("ngSwitchCase",!0),Pa(2),gs("ngSwitchCase",!1))},directives:[vh,_h],styles:[fS],encapsulation:2,changeDetection:0}),e}(),_S=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[Rb,Ph],Rb]}),e}(),yS=function(){function e(e){this.appService=e}return e.prototype.transform=function(e,t,n){void 0===t&&(t=!0),void 0===n&&(n="");var i=new Yf.BigNumber(e).decimalPlaces(t?this.appService.currentMaxDecimals:0),r="";return"last"!==n&&(r=i.isNaN()?"NaN":i.toFormat(),"first"!==n&&(r+=" ")),"first"!==n&&(r+=t?this.appService.coinName:i.absoluteValue().isEqualTo(1)?this.appService.hoursNameSingular:this.appService.hoursName),r},e.\u0275fac=function(t){return new(t||e)(ms(qp))},e.\u0275pipe=vt({name:"amount",type:e,pure:!1}),e}();function bS(e,t){1&e&&bs(0,"mat-spinner")}function wS(e,t){1&e&&(_s(0,"i",12),ou(1,"done"),ys())}function kS(e,t){1&e&&(_s(0,"i",13),ou(1,"error_outline"),ys())}function MS(e,t){1&e&&(_s(0,"i",14),ou(1,"usb"),ys())}function SS(e,t){1&e&&(_s(0,"i",15),ou(1,"memory"),ys())}function CS(e,t){1&e&&(_s(0,"i",16),ou(1,"error"),ys())}function xS(e,t){1&e&&(_s(0,"i",15),ou(1,"touch_app"),ys())}function LS(e,t){if(1&e&&(_s(0,"div",6),ou(1,"\n "),fs(2,bS,1,0,"mat-spinner",3),ou(3,"\n "),fs(4,wS,2,0,"i",7),ou(5,"\n "),fs(6,kS,2,0,"i",8),ou(7,"\n "),fs(8,MS,2,0,"i",9),ou(9,"\n "),fs(10,SS,2,0,"i",10),ou(11,"\n "),fs(12,CS,2,0,"i",11),ou(13,"\n "),fs(14,xS,2,0,"i",10),ou(15,"\n "),ys()),2&e){var n=As();Pa(2),gs("ngIf",n.icon==n.icons.Spinner),Pa(2),gs("ngIf",n.icon==n.icons.Success),Pa(2),gs("ngIf",n.icon==n.icons.Error),Pa(2),gs("ngIf",n.icon==n.icons.Usb),Pa(2),gs("ngIf",n.icon==n.icons.HardwareWallet),Pa(2),gs("ngIf",n.icon==n.icons.Warning),Pa(2),gs("ngIf",n.icon==n.icons.Confirm)}}function TS(e,t){if(1&e&&(_s(0,"div"),ou(1,"\n "),_s(2,"span",17),ou(3),ys(),ou(4,"\n "),ys()),2&e){var n=As();Pa(3),su(n.upperBigText)}}function DS(e,t){if(1&e&&(_s(0,"span"),ou(1),ys()),2&e){var n=As();Pa(1),su(n.text)}}function OS(e,t){if(1&e){var n=Ss();_s(0,"span",18),Ls("click",function(){return sn(n),As().activateLink()}),ou(1),ys()}if(2&e){var i=As();Pa(1),su(i.linkText?i.linkText:i.link)}}function ES(e,t){if(1&e&&(_s(0,"span"),_s(1,"a",19),ou(2),ys(),ys()),2&e){var n=As();Pa(1),gs("href",n.link,Ar),Pa(1),su(n.linkText?n.linkText:n.link)}}function PS(e,t){if(1&e&&(_s(0,"span"),_s(1,"a",20),ou(2),ys(),ys()),2&e){var n=As();Pa(1),gs("href",n.link,Ar),Pa(1),su(n.linkText?n.linkText:n.link)}}function AS(e,t){if(1&e&&(_s(0,"div",23),ou(1,"\n "),_s(2,"span"),ou(3),Vl(4,"amount"),ys(),ou(5,"\n "),_s(6,"span"),ou(7),Vl(8,"translate"),Vl(9,"amount"),ys(),ou(10,"\n "),_s(11,"span"),ou(12),Vl(13,"translate"),ys(),ou(14,"\n "),ys()),2&e){var n=t.$implicit;Pa(3),uu("\u2022 ",Ul(4,5,n.coins),""),Pa(4),lu("",Ul(8,7,"hardware-wallet.create-tx.separator-for-coins-and-hours")," ",zl(9,9,n.hours,!1),""),Pa(5),lu("",Ul(13,12,"hardware-wallet.create-tx.separator-to-destination")," ",n.address,"")}}function YS(e,t){if(1&e&&(_s(0,"div",21),ou(1,"\n "),fs(2,AS,15,14,"div",22),ou(3,"\n "),ys()),2&e){var n=As();Pa(2),gs("ngForOf",n.outputsList)}}function IS(e,t){if(1&e&&(_s(0,"span"),ou(1),ys()),2&e){var n=As();Pa(1),su(n.lowerText)}}function RS(e,t){if(1&e&&(_s(0,"div"),ou(1,"\n "),_s(2,"span",17),ou(3),ys(),ou(4,"\n "),ys()),2&e){var n=As();Pa(3),su(n.lowerBigText)}}function FS(e,t){if(1&e&&(_s(0,"div"),ou(1,"\n "),_s(2,"span",24),ou(3),ys(),ou(4,"\n "),ys()),2&e){var n=As();Pa(3),su(n.lowerLightText)}}var HS=function(e){return e[e.None=0]="None",e[e.Spinner=1]="Spinner",e[e.Success=2]="Success",e[e.Error=3]="Error",e[e.Usb=4]="Usb",e[e.HardwareWallet=5]="HardwareWallet",e[e.Warning=6]="Warning",e[e.Confirm=7]="Confirm",e}({}),jS=function(){function e(){this.icon=HS.None,this.linkIsUrl=!1,this.linkClicked=new Zl,this.icons=HS}return e.prototype.ngOnDestroy=function(){this.linkClicked.complete()},e.prototype.activateLink=function(){this.linkClicked.emit()},e.\u0275fac=function(t){return new(t||e)},e.\u0275cmp=lt({type:e,selectors:[["app-hw-message"]],inputs:{icon:"icon",text:"text",link:"link",linkText:"linkText",linkIsInternal:"linkIsInternal",linkIsUrl:"linkIsUrl",outputsList:"outputsList",lowerText:"lowerText",upperBigText:"upperBigText",lowerBigText:"lowerBigText",lowerLightText:"lowerLightText"},outputs:{linkClicked:"linkClicked"},decls:28,vars:10,consts:[[1,"content"],["class","icon-container",4,"ngIf"],[1,"text-container"],[4,"ngIf"],["class","link",3,"click",4,"ngIf"],["class","list",4,"ngIf"],[1,"icon-container"],["class","material-icons green-text",4,"ngIf"],["class","material-icons red-text",4,"ngIf"],["class","material-icons grey-light-text",4,"ngIf"],["class","material-icons yellow-text",4,"ngIf"],["class","material-icons red-text -blinking",4,"ngIf"],[1,"material-icons","green-text"],[1,"material-icons","red-text"],[1,"material-icons","grey-light-text"],[1,"material-icons","yellow-text"],[1,"material-icons","red-text","-blinking"],[1,"big-text"],[1,"link",3,"click"],["target","_blank","rel","noreferrer nofollow noopener",1,"link",3,"href"],[1,"link",3,"href"],[1,"list"],["class","list-element",4,"ngFor","ngForOf"],[1,"list-element"],[1,"grey-light-text"]],template:function(e,t){1&e&&(_s(0,"div",0),ou(1,"\n "),ou(2,"\n "),fs(3,LS,16,7,"div",1),ou(4,"\n "),ou(5,"\n "),_s(6,"div",2),ou(7,"\n "),fs(8,TS,5,1,"div",3),ou(9,"\n "),fs(10,DS,2,1,"span",3),ou(11,"\n "),fs(12,OS,2,1,"span",4),ou(13,"\n "),fs(14,ES,3,2,"span",3),ou(15,"\n "),fs(16,PS,3,2,"span",3),ou(17,"\n "),fs(18,YS,4,1,"div",5),ou(19,"\n "),fs(20,IS,2,1,"span",3),ou(21,"\n "),fs(22,RS,5,1,"div",3),ou(23,"\n "),fs(24,FS,5,1,"div",3),ou(25,"\n "),ys(),ou(26,"\n"),ys(),ou(27,"\n")),2&e&&(Pa(3),gs("ngIf",t.icon!==t.icons.None),Pa(5),gs("ngIf",t.upperBigText),Pa(2),gs("ngIf",t.text),Pa(2),gs("ngIf",t.link&&!t.linkIsUrl),Pa(2),gs("ngIf",t.link&&t.linkIsUrl&&!t.linkIsInternal),Pa(2),gs("ngIf",t.link&&t.linkIsUrl&&t.linkIsInternal),Pa(2),gs("ngIf",t.outputsList),Pa(2),gs("ngIf",t.lowerText),Pa(2),gs("ngIf",t.lowerBigText),Pa(2),gs("ngIf",t.lowerLightText))},directives:[fh,vS,dh],pipes:[yS,oS],styles:[".content[_ngcontent-%COMP%]{display:flex}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%]{margin-right:20px}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%], .content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:36px!important;width:36px!important}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{font-size:40px}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%]{flex-grow:1;align-self:center}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .list[_ngcontent-%COMP%]{padding:10px 0}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .list[_ngcontent-%COMP%] .list-element[_ngcontent-%COMP%]{word-break:break-all;margin:10px 0;font-size:12px;color:#000;font-weight:700}.content[_ngcontent-%COMP%] .-blinking[_ngcontent-%COMP%]{-webkit-animation:alert-blinking 1s linear infinite;animation:alert-blinking 1s linear infinite}.big-text[_ngcontent-%COMP%]{color:#1e2227;font-weight:700;font-size:15px}"]}),e}(),NS=["mat-button",""],BS=["*"],WS=["mat-button","mat-flat-button","mat-icon-button","mat-raised-button","mat-stroked-button","mat-mini-fab","mat-fab"],VS=Hb(Fb(jb(function e(t){v(this,e),this._elementRef=t}))),US=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;v(this,n),(a=t.call(this,e))._focusMonitor=i,a._animationMode=r,a.isRoundButton=a._hasHostAttributes("mat-fab","mat-mini-fab"),a.isIconButton=a._hasHostAttributes("mat-icon-button");var o,s=c(WS);try{for(s.s();!(o=s.n()).done;){var u=o.value;a._hasHostAttributes(u)&&a._getHostElement().classList.add(u)}}catch(l){s.e(l)}finally{s.f()}return e.nativeElement.classList.add("mat-button-base"),a.isRoundButton&&(a.color="accent"),a}return g(n,[{key:"ngAfterViewInit",value:function(){this._focusMonitor.monitor(this._elementRef,!0)}},{key:"ngOnDestroy",value:function(){this._focusMonitor.stopMonitoring(this._elementRef)}},{key:"focus",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"program",t=arguments.length>1?arguments[1]:void 0;this._focusMonitor.focusVia(this._getHostElement(),e,t)}},{key:"_getHostElement",value:function(){return this._elementRef.nativeElement}},{key:"_isRippleDisabled",value:function(){return this.disableRipple||this.disabled}},{key:"_hasHostAttributes",value:function(){for(var e=this,t=arguments.length,n=new Array(t),i=0;i*,.mat-flat-button .mat-button-wrapper>*,.mat-stroked-button .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*{vertical-align:middle}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button{display:block;font-size:inherit;width:2.5em;height:2.5em}.cdk-high-contrast-active .mat-button,.cdk-high-contrast-active .mat-flat-button,.cdk-high-contrast-active .mat-raised-button,.cdk-high-contrast-active .mat-icon-button,.cdk-high-contrast-active .mat-fab,.cdk-high-contrast-active .mat-mini-fab{outline:solid 1px}.cdk-high-contrast-active .mat-button-base.cdk-keyboard-focused,.cdk-high-contrast-active .mat-button-base.cdk-program-focused{outline:solid 3px}\n"],encapsulation:2,changeDetection:0}),e}(),zS=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[ew,Rb],Rb]}),e}();function qS(e){return function(t){return t.lift(new GS(e))}}var GS=function(){function e(t){v(this,e),this.callback=t}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new KS(e,this.callback))}}]),e}(),KS=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,e)).add(new L(i)),r}return n}(Y),JS=["*"];function ZS(e){return Error('Unable to find icon with the name "'.concat(e,'"'))}function QS(e){return Error("The URL provided to MatIconRegistry was not trusted as a resource URL "+"via Angular's DomSanitizer. Attempted URL was \"".concat(e,'".'))}function XS(e){return Error("The literal provided to MatIconRegistry was not trusted as safe HTML by "+"Angular's DomSanitizer. Attempted literal was \"".concat(e,'".'))}var $S=function e(t,n,i){v(this,e),this.url=t,this.svgText=n,this.options=i},eC=function(){var e=function(){function e(t,n,i,r){v(this,e),this._httpClient=t,this._sanitizer=n,this._errorHandler=r,this._svgIconConfigs=new Map,this._iconSetConfigs=new Map,this._cachedIconsByUrl=new Map,this._inProgressUrlFetches=new Map,this._fontCssClassesByAlias=new Map,this._defaultFontSetClass="material-icons",this._document=i}return g(e,[{key:"addSvgIcon",value:function(e,t,n){return this.addSvgIconInNamespace("",e,t,n)}},{key:"addSvgIconLiteral",value:function(e,t,n){return this.addSvgIconLiteralInNamespace("",e,t,n)}},{key:"addSvgIconInNamespace",value:function(e,t,n,i){return this._addSvgIconConfig(e,t,new $S(n,null,i))}},{key:"addSvgIconLiteralInNamespace",value:function(e,t,n,i){var r=this._sanitizer.sanitize(Er.HTML,n);if(!r)throw XS(n);return this._addSvgIconConfig(e,t,new $S("",r,i))}},{key:"addSvgIconSet",value:function(e,t){return this.addSvgIconSetInNamespace("",e,t)}},{key:"addSvgIconSetLiteral",value:function(e,t){return this.addSvgIconSetLiteralInNamespace("",e,t)}},{key:"addSvgIconSetInNamespace",value:function(e,t,n){return this._addSvgIconSetConfig(e,new $S(t,null,n))}},{key:"addSvgIconSetLiteralInNamespace",value:function(e,t,n){var i=this._sanitizer.sanitize(Er.HTML,t);if(!i)throw XS(t);return this._addSvgIconSetConfig(e,new $S("",i,n))}},{key:"registerFontClassAlias",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;return this._fontCssClassesByAlias.set(e,t),this}},{key:"classNameForFontAlias",value:function(e){return this._fontCssClassesByAlias.get(e)||e}},{key:"setDefaultFontSetClass",value:function(e){return this._defaultFontSetClass=e,this}},{key:"getDefaultFontSetClass",value:function(){return this._defaultFontSetClass}},{key:"getSvgIconFromUrl",value:function(e){var t=this,n=this._sanitizer.sanitize(Er.RESOURCE_URL,e);if(!n)throw QS(e);var i=this._cachedIconsByUrl.get(n);return i?xf(tC(i)):this._loadSvgIconFromConfig(new $S(e,null)).pipe(Gg(function(e){return t._cachedIconsByUrl.set(n,e)}),ie(function(e){return tC(e)}))}},{key:"getNamedSvgIcon",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=nC(t,e),i=this._svgIconConfigs.get(n);if(i)return this._getSvgFromConfig(i);var r=this._iconSetConfigs.get(t);return r?this._getSvgFromIconSetConfigs(e,r):Lf(ZS(n))}},{key:"ngOnDestroy",value:function(){this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}},{key:"_getSvgFromConfig",value:function(e){return e.svgText?xf(tC(this._svgElementFromConfig(e))):this._loadSvgIconFromConfig(e).pipe(ie(function(e){return tC(e)}))}},{key:"_getSvgFromIconSetConfigs",value:function(e,t){var n=this,i=this._extractIconWithNameFromAnySet(e,t);return i?xf(i):zw(t.filter(function(e){return!e.svgText}).map(function(e){return n._loadSvgIconSetFromConfig(e).pipe(Rf(function(t){var i=n._sanitizer.sanitize(Er.RESOURCE_URL,e.url),r="Loading icon set URL: ".concat(i," failed: ").concat(t.message);return n._errorHandler.handleError(new Error(r)),xf(null)}))})).pipe(ie(function(){var i=n._extractIconWithNameFromAnySet(e,t);if(!i)throw ZS(e);return i}))}},{key:"_extractIconWithNameFromAnySet",value:function(e,t){for(var n=t.length-1;n>=0;n--){var i=t[n];if(i.svgText&&i.svgText.indexOf(e)>-1){var r=this._svgElementFromConfig(i),a=this._extractSvgIconFromSet(r,e,i.options);if(a)return a}}return null}},{key:"_loadSvgIconFromConfig",value:function(e){var t=this;return this._fetchIcon(e).pipe(Gg(function(t){return e.svgText=t}),ie(function(){return t._svgElementFromConfig(e)}))}},{key:"_loadSvgIconSetFromConfig",value:function(e){return e.svgText?xf(null):this._fetchIcon(e).pipe(Gg(function(t){return e.svgText=t}))}},{key:"_extractSvgIconFromSet",value:function(e,t,n){var i=e.querySelector('[id="'.concat(t,'"]'));if(!i)return null;var r=i.cloneNode(!0);if(r.removeAttribute("id"),"svg"===r.nodeName.toLowerCase())return this._setSvgAttributes(r,n);if("symbol"===r.nodeName.toLowerCase())return this._setSvgAttributes(this._toSvgElement(r),n);var a=this._svgElementFromString("");return a.appendChild(r),this._setSvgAttributes(a,n)}},{key:"_svgElementFromString",value:function(e){var t=this._document.createElement("DIV");t.innerHTML=e;var n=t.querySelector("svg");if(!n)throw Error(" tag not found");return n}},{key:"_toSvgElement",value:function(e){for(var t=this._svgElementFromString(""),n=e.attributes,i=0;i0&&t<10?this.addNumber(t.toString()):8===e.keyCode?this.removeNumber():13===e.keyCode&&this.sendPin()},t.prototype.addNumber=function(e){var t=this.form.value.pin;t.length<8&&this.form.get("pin").setValue(t+e)},t.prototype.removeNumber=function(){var e=this.form.value.pin;this.form.get("pin").setValue(e.substring(0,e.length-1))},t.prototype.sendPin=function(){this.form.valid&&this.dialogRef.close(this.form.value.pin)},t.\u0275fac=function(e){return new(e||t)(ms(Tw),ms(xw),ms(TM),ms(Aw),ms(Bw))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-pin-dialog"]],hostBindings:function(e,t){1&e&&Ls("keyup",function(e){return t.keyEvent(e)},!1,Br)},features:[Jo],decls:90,vars:24,consts:[[3,"headline","dialog"],[3,"formGroup"],[1,"form-field","text-center"],[4,"ngIf"],[1,"link",3,"click"],["formControlName","pin","id","pin","type","password","readonly",""],[1,"light-button-theme"],[1,"num-pad-row"],["mat-button","","color","primary",3,"click"],[1,"material-icons"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n\n "),ou(3,"\n "),_s(4,"div",1),ou(5,"\n "),_s(6,"div",2),ou(7,"\n "),_s(8,"div"),ou(9,"\n "),fs(10,bC,3,3,"span",3),ou(11,"\n "),fs(12,wC,3,3,"span",3),ou(13,"\n "),fs(14,kC,3,3,"span",3),ou(15,"\n "),_s(16,"span",4),Ls("click",function(){return t.openHelp()}),ou(17),Vl(18,"translate"),ys(),ou(19,"\n "),ys(),ou(20,"\n "),bs(21,"input",5),ou(22,"\n "),ys(),ou(23,"\n "),ys(),ou(24,"\n\n "),ou(25,"\n "),_s(26,"div",6),ou(27,"\n "),_s(28,"div",7),ou(29,"\n "),_s(30,"button",8),Ls("click",function(){return t.addNumber("7")}),_s(31,"span"),ou(32),ys(),ys(),ou(33,"\n "),_s(34,"button",8),Ls("click",function(){return t.addNumber("8")}),_s(35,"span"),ou(36),ys(),ys(),ou(37,"\n "),_s(38,"button",8),Ls("click",function(){return t.addNumber("9")}),_s(39,"span"),ou(40),ys(),ys(),ou(41,"\n "),ys(),ou(42,"\n "),_s(43,"div",7),ou(44,"\n "),_s(45,"button",8),Ls("click",function(){return t.addNumber("4")}),_s(46,"span"),ou(47),ys(),ys(),ou(48,"\n "),_s(49,"button",8),Ls("click",function(){return t.addNumber("5")}),_s(50,"span"),ou(51),ys(),ys(),ou(52,"\n "),_s(53,"button",8),Ls("click",function(){return t.addNumber("6")}),_s(54,"span"),ou(55),ys(),ys(),ou(56,"\n "),ys(),ou(57,"\n "),_s(58,"div",7),ou(59,"\n "),_s(60,"button",8),Ls("click",function(){return t.addNumber("1")}),_s(61,"span"),ou(62),ys(),ys(),ou(63,"\n "),_s(64,"button",8),Ls("click",function(){return t.addNumber("2")}),_s(65,"span"),ou(66),ys(),ys(),ou(67,"\n "),_s(68,"button",8),Ls("click",function(){return t.addNumber("3")}),_s(69,"span"),ou(70),ys(),ys(),ou(71,"\n "),ys(),ou(72,"\n "),_s(73,"div",7),ou(74,"\n "),_s(75,"button",8),Ls("click",function(){return t.removeNumber()}),_s(76,"span",9),ou(77,"backspace"),ys(),ys(),ou(78,"\n "),ys(),ou(79,"\n "),ys(),ou(80,"\n\n "),ou(81,"\n "),_s(82,"div",10),ou(83,"\n "),_s(84,"app-button",11),Ls("action",function(){return t.sendPin()}),ou(85),Vl(86,"translate"),ys(),ou(87,"\n "),ys(),ou(88,"\n"),ys(),ou(89,"\n")),2&e&&(gs("headline",Ul(1,18,t.title))("dialog",t.dialogRef),Pa(4),gs("formGroup",t.form),Pa(6),gs("ngIf",t.data.signingTx&&!t.data.changingPin),Pa(2),gs("ngIf",t.data.changingPin&&t.data.changePinState===t.changePinStates.RequestingNewPin),Pa(2),gs("ngIf",!(t.data.signingTx||t.data.changingPin&&t.data.changePinState===t.changePinStates.RequestingNewPin)),Pa(3),su(Ul(18,20,"hardware-wallet.enter-pin.help")),Pa(15),su(t.buttonsContent),Pa(4),su(t.buttonsContent),Pa(4),su(t.buttonsContent),Pa(7),su(t.buttonsContent),Pa(4),su(t.buttonsContent),Pa(4),su(t.buttonsContent),Pa(7),su(t.buttonsContent),Pa(4),su(t.buttonsContent),Pa(4),su(t.buttonsContent),Pa(14),gs("disabled",!t.form.valid),Pa(1),uu("\n ",Ul(86,22,"common.continue-button"),"\n "))},directives:[AM,wk,pM,fh,Xw,bk,wM,US,gC],pipes:[oS],styles:["mat-form-field[_ngcontent-%COMP%]{width:100%}.form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{font-size:25px;line-height:1;letter-spacing:15px;text-align:center;margin-top:5px}.num-pad-row[_ngcontent-%COMP%]{display:flex}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{flex-grow:1;height:50px;border:1px solid rgba(30,34,39,.05);margin:2px}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#1e2227}"]}),t}(yC),SC=function(){function e(){this.lastSearchTerm="",this.searchRequestSubject=new z,this.wordMap=new Map}return Object.defineProperty(e.prototype,"searchResults",{get:function(){var e=this;return this.searchRequestSubject.asObservable().pipe(Zg(100),ie(function(t){return t.length>1&&e.wordList?e.wordList.filter(function(e){return e.startsWith(t)}):[]}))},enumerable:!1,configurable:!0}),e.prototype.initialize=function(){var e=this;se(n("+ix3")("./bip39-word-list.json")).subscribe(function(t){e.wordList=t.list,e.wordList.forEach(function(t){e.wordMap.set(t,!0)}),e.searchRequestSubject.next(e.lastSearchTerm)})},e.prototype.setSearchTerm=function(e){this.lastSearchTerm=e,this.wordList&&this.searchRequestSubject.next(e)},e.prototype.validateWord=function(e){return this.wordList?!!this.wordMap.has(e):null},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)}}),e}(),CC=function(e){function t(t,n,i){var r=e.call(this,i,n)||this;return r.data=t,r.dialogRef=n,r}return Vw(t,e),t.openDialog=function(e,n){var i=new bw;return i.data=n,i.autoFocus=!1,i.width="600px",e.open(t,i)},t.\u0275fac=function(e){return new(e||t)(ms(Tw),ms(xw),ms(Bw))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-confirm-tx-dialog"]],features:[Jo],decls:9,vars:13,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","lowerText","icon","outputsList"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),bs(4,"app-hw-message",1),Vl(5,"translate"),Vl(6,"translate"),ou(7,"\n"),ys(),ou(8,"\n")),2&e&&(gs("headline",Ul(1,7,"hardware-wallet.create-tx.title"))("dialog",t.dialogRef)("disableDismiss",!0),Pa(4),gs("text",Ul(5,9,"hardware-wallet.create-tx.upper-text"))("lowerText",Ul(6,11,"hardware-wallet.create-tx.lower-text"))("icon",t.msgIcons.Confirm)("outputsList",t.data))},directives:[AM,jS],pipes:[oS],styles:[""]}),t}(yC),xC=function(e){return e.CLIENT="client",e.NOTES="txid",e}({}),LC=function(){function e(e){this.apiService=e}return e.prototype.get=function(e,t){var n={type:e};return t&&(n.key=t),this.apiService.get("data",n,{useV2:!0})},e.prototype.store=function(e,t,n){return this.apiService.post("data",{type:e,key:t,val:n},{useV2:!0})},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(Bp))}}),e}(),TC=function(){return function(e){Object.assign(this,e)}}(),DC=function(){function e(e,t){this.translate=e,this.storageService=t,this.currentLanguageInternal=new Im(1),this.savedSelectedLanguageLoadedInternal=new Im(1),this.languagesInternal=[],this.storageKey="lang"}return Object.defineProperty(e.prototype,"currentLanguage",{get:function(){return this.currentLanguageInternal.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"savedSelectedLanguageLoaded",{get:function(){return this.savedSelectedLanguageLoadedInternal.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"languages",{get:function(){return this.languagesInternal},enumerable:!1,configurable:!0}),e.prototype.initialize=function(){var e=this,t=[];zp.languages.forEach(function(n){var i=new TC(n);e.languagesInternal.push(i),t.push(i.code)}),this.translate.addLangs(t),this.translate.setDefaultLang(zp.defaultLanguage),this.translate.onLangChange.subscribe(function(t){return e.onLanguageChanged(t)}),this.loadCurrentLanguage()},e.prototype.changeLanguage=function(e){this.translate.use(e)},e.prototype.onLanguageChanged=function(e){this.currentLanguageInternal.next(this.languages.find(function(t){return t.code===e.lang})),this.subscription&&this.subscription.unsubscribe(),this.subscription=this.storageService.store(xC.CLIENT,this.storageKey,e.lang).subscribe()},e.prototype.loadCurrentLanguage=function(){var e=this;this.storageService.get(xC.CLIENT,this.storageKey).subscribe(function(t){t.data&&-1!==e.translate.getLangs().indexOf(t.data)?(setTimeout(function(){e.changeLanguage(t.data)},16),e.savedSelectedLanguageLoadedInternal.next(!0)):e.savedSelectedLanguageLoadedInternal.next(!1)},function(){e.savedSelectedLanguageLoadedInternal.next(!1)})},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(aS),Gi(LC))}}),e}();function OC(e,t){if(1&e&&(_s(0,"div",9),_s(1,"mat-icon"),ou(2),ys(),ys()),2&e){var n=As(2);Pa(2),su(n.config.icon)}}function EC(e,t){if(1&e&&(_s(0,"div",10),ou(1),Vl(2,"translate"),ys()),2&e){var n=As(2);Pa(1),su(Ul(2,1,n.config.title))}}function PC(e,t){if(1&e&&(_s(0,"a",11),ou(1),ys()),2&e){var n=As(2);gs("href",n.config.link,Ar),Pa(1),su(n.config.link)}}function AC(e,t){if(1&e){var n=Ss();_s(0,"div",1),ou(1,"\n "),_s(2,"div"),ou(3,"\n "),fs(4,OC,3,1,"div",2),ou(5,"\n "),_s(6,"div",3),ou(7,"\n "),fs(8,EC,3,3,"div",4),ou(9,"\n "),_s(10,"div",5),ou(11),Vl(12,"translate"),fs(13,PC,2,2,"a",6),ys(),ou(14,"\n "),ys(),ou(15,"\n "),_s(16,"div",7),_s(17,"mat-icon",8),Ls("click",function(){return sn(n),As().hide()}),ou(18,"close"),ys(),ys(),ou(19,"\n "),ys(),ou(20,"\n"),ys()}if(2&e){var i=As();Pa(2),Qs(Pi,Js,"internal-container "+(i.config.color?i.config.color:"red-background"),!0),Pa(2),gs("ngIf",i.config.icon),Pa(4),gs("ngIf",i.config.title),Pa(3),uu("",Ul(12,6,i.config.text),"\n "),Pa(2),gs("ngIf",i.config.link)}}var YC=function(e){return e.Error="error",e.Done="done",e.Warning="warning",e}({}),IC=function(e){return e.Red="red-background",e.Green="green-background",e.Yellow="yellow-background",e}({}),RC=function(){return function(){}}(),FC=function(){function e(){this.config=new RC,this.visible=!1}return e.prototype.show=function(){var e=this;this.visible?(this.visible=!1,setTimeout(function(){return e.visible=!0},32)):this.visible=!0},e.prototype.hide=function(){this.visible=!1},e.\u0275fac=function(t){return new(t||e)},e.\u0275cmp=lt({type:e,selectors:[["app-msg-bar"]],decls:2,vars:1,consts:[["class","main-container",4,"ngIf"],[1,"main-container"],["class","icon-container",4,"ngIf"],[1,"text-container"],["class","title",4,"ngIf"],[1,"text"],["class","link","target","_blank","rel","noreferrer nofollow noopener",3,"href",4,"ngIf"],[1,"close-container"],[1,"image-button",3,"click"],[1,"icon-container"],[1,"title"],["target","_blank","rel","noreferrer nofollow noopener",1,"link",3,"href"]],template:function(e,t){1&e&&(fs(0,AC,21,8,"div",0),ou(1,"\n")),2&e&&gs("ngIf",t.visible)},directives:[fh,uC],pipes:[oS],styles:[".main-container[_ngcontent-%COMP%]{position:fixed;bottom:0;width:100%;z-index:1000000;display:flex;flex-direction:row;justify-content:center}.internal-container[_ngcontent-%COMP%]{color:#fff;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;min-width:40%;max-width:90%;display:flex;padding:10px;border-top-left-radius:6px;border-top-right-radius:6px}.red-background[_ngcontent-%COMP%]{background-color:rgba(255,0,0,.7)}.green-background[_ngcontent-%COMP%]{background-color:rgba(31,177,31,.7)}.yellow-background[_ngcontent-%COMP%]{background-color:rgba(255,94,0,.7)}.icon-container[_ngcontent-%COMP%], .text-container[_ngcontent-%COMP%]{margin-right:10px}.text-container[_ngcontent-%COMP%]{flex-grow:1}.text-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-size:15px;margin-top:-1px}.text-container[_ngcontent-%COMP%] .text[_ngcontent-%COMP%]{font-size:13px;margin-top:2px}.text-container[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:#fff}"]}),e}(),HC=function(){function e(){}return Object.defineProperty(e.prototype,"msgBarComponent",{set:function(e){this.msgBarComponentInternal=e},enumerable:!1,configurable:!0}),e.prototype.hide=function(){this.msgBarComponentInternal&&this.msgBarComponentInternal.hide()},e.prototype.showError=function(e,t){void 0===t&&(t=2e4);var n=new RC;n.text=Hp(e).translatableErrorMsg,n.title="common.error-title",n.icon=YC.Error,n.color=IC.Red,e.type&&e.type===Rp.DaemonConnectionError&&(n.text="hardware-wallet.errors.daemon-connection-with-configurable-link",n.link=zp.hwWalletDaemonDownloadUrl),this.show(n),this.setTimer(t)},e.prototype.showWarning=function(e,t){void 0===t&&(t=2e4);var n=new RC;n.text=Hp(e).translatableErrorMsg,n.title="common.warning-title",n.icon=YC.Warning,n.color=IC.Yellow,this.show(n),this.setTimer(t)},e.prototype.showDone=function(e,t){void 0===t&&(t=1e4);var n=new RC;n.text=e,n.title="common.done-title",n.icon=YC.Done,n.color=IC.Green,this.show(n),this.setTimer(t)},e.prototype.show=function(e){this.msgBarComponentInternal&&(this.msgBarComponentInternal.config=e,this.msgBarComponentInternal.show())},e.prototype.setTimer=function(e){var t=this;void 0===e&&(e=1e4),this.timeSubscription&&this.timeSubscription.unsubscribe(),this.timeSubscription=xf(1).pipe(Of(e)).subscribe(function(){return t.hide()})},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)}}),e}();function jC(e,t){1&e&&(bs(0,"app-hw-message",11),Vl(1,"translate"),Vl(2,"translate")),2&e&&gs("upperBigText",Ul(1,2,"hardware-wallet.seed-word.enter-word"))("text",Ul(2,4,"hardware-wallet.seed-word.info"))}var NC=function(e){return{number:e}};function BC(e,t){if(1&e&&(bs(0,"app-hw-message",11),Vl(1,"translate"),Vl(2,"translate")),2&e){var n=As();gs("upperBigText",zl(1,2,"wallet.new.seed.enter-word",Rl(7,NC,n.data.wordNumber)))("text",Ul(2,5,n.data.reason===n.wordAskedReasons.CreatingSoftwareWallet?"wallet.new.seed.new-seed-info":"wallet.new.seed.recover-seed-info"))}}function WC(e,t){1&e&&(_s(0,"label",12),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),su(Ul(2,1,"hardware-wallet.seed-word.word-label")))}function VC(e,t){if(1&e){var n=Ss();_s(0,"mat-option",13),Ls("click",function(){return sn(n),As().sendWord()}),ou(1),ys()}if(2&e){var i=t.$implicit;gs("value",i),Pa(1),su(i)}}var UC=function(e){return e.HWWalletOperation="HWWalletOperation",e.CreatingSoftwareWallet="CreatingSoftwareWallet",e.RecoveringSoftwareWallet="RecoveringSoftwareWallet",e}({}),zC=function(){function e(e,t,n,i,r,a,o){var s=this;this.data=e,this.dialogRef=t,this.formBuilder=n,this.bip38WordList=i,this.msgBarService=r,this.translateService=a,this.msgIcons=HS,this.wordAskedReasons=UC,this.inputErrorMsg="",this.sendingWord=!1,e.reason===UC.HWWalletOperation&&(this.hwConnectionSubscription=o.walletConnectedAsyncEvent.subscribe(function(e){e||s.dialogRef.close()}))}return e.openDialog=function(t,n){var i=new bw;return i.data=n,i.autoFocus=!0,i.width="350px",t.open(e,i)},e.prototype.ngOnInit=function(){var e=this;this.form=this.formBuilder.group({word:[""]}),this.form.setValidators(this.validateForm.bind(this)),this.valueChangeSubscription=this.form.controls.word.valueChanges.subscribe(function(t){e.bip38WordList.setSearchTerm(t.trim().toLowerCase())}),this.filteredOptions=this.bip38WordList.searchResults.pipe(ie(function(e){return e}))},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.valueChangeSubscription.unsubscribe(),this.hwConnectionSubscription&&this.hwConnectionSubscription.unsubscribe()},e.prototype.sendWord=function(){var e=this;this.sendingWord||(this.sendingWord=!0,this.msgBarService.hide(),setTimeout(function(){if(e.form.valid){var t=e.bip38WordList.validateWord(e.form.value.word.trim().toLowerCase());t?e.dialogRef.close(e.form.value.word.trim().toLowerCase()):e.msgBarService.showError(e.translateService.instant(null===t?"hardware-wallet.seed-word.error-loading-words":"hardware-wallet.seed-word.error-invalid-word"))}e.sendingWord=!1},32))},e.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0;return this.form.get("word").value||(e=!1,this.form.get("word").touched&&(this.inputErrorMsg="wallet.new.seed.word-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ms(Tw),ms(xw),ms(TM),ms(SC),ms(HC),ms(aS),ms(Bw))},e.\u0275cmp=lt({type:e,selectors:[["app-seed-word-dialog"]],decls:34,vars:18,consts:[[3,"headline","dialog"],[3,"upperBigText","text",4,"ngIf"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],["for","word",4,"ngIf"],["matInput","","formControlName","word","id","word",3,"matAutocomplete","appFormFieldError","keydown.enter","blur"],[3,"autoActiveFirstOption"],["auto","matAutocomplete"],["class","option",3,"value","click",4,"ngFor","ngForOf"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"],[3,"upperBigText","text"],["for","word"],[1,"option",3,"value","click"]],template:function(e,t){if(1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,jC,3,6,"app-hw-message",1),ou(5,"\n "),fs(6,BC,3,9,"app-hw-message",1),ou(7,"\n\n "),ou(8,"\n "),_s(9,"div",2),ou(10,"\n "),_s(11,"div",3),ou(12,"\n "),fs(13,WC,3,3,"label",4),ou(14,"\n "),_s(15,"input",5),Ls("keydown.enter",function(){return t.sendWord()})("blur",function(){return t.validateForm()}),ys(),ou(16,"\n "),_s(17,"mat-autocomplete",6,7),ou(19,"\n "),fs(20,VC,2,2,"mat-option",8),Vl(21,"async"),ou(22,"\n "),ys(),ou(23,"\n "),ys(),ou(24,"\n "),ys(),ou(25,"\n "),_s(26,"div",9),ou(27,"\n "),_s(28,"app-button",10),Ls("action",function(){return t.sendWord()}),ou(29),Vl(30,"translate"),ys(),ou(31,"\n "),ys(),ou(32,"\n"),ys(),ou(33,"\n")),2&e){var n=ps(18);gs("headline",Ul(1,12,t.data.reason===t.wordAskedReasons.HWWalletOperation?"hardware-wallet.seed-word.title":"wallet.new.seed-label"))("dialog",t.dialogRef),Pa(4),gs("ngIf",t.data.reason===t.wordAskedReasons.HWWalletOperation),Pa(2),gs("ngIf",t.data.reason!==t.wordAskedReasons.HWWalletOperation),Pa(3),gs("formGroup",t.form),Pa(4),gs("ngIf",t.data.reason===t.wordAskedReasons.HWWalletOperation),Pa(2),gs("matAutocomplete",n)("appFormFieldError",t.inputErrorMsg),Pa(2),gs("autoActiveFirstOption",!0),Pa(3),gs("ngForOf",Ul(21,14,t.filteredOptions)),Pa(8),gs("disabled",!t.form.valid),Pa(1),uu("\n ",Ul(30,16,"common.continue-button"),"\n ")}},styles:[".option[_ngcontent-%COMP%]{font-size:13px;height:42px}"]}),e}();function qC(e,t){if(1&e){var n=Ss();_s(0,"button",3),Ls("click",function(){sn(n);var e=t.$implicit;return As().closePopup(e)}),ou(1,"\n "),bs(2,"img",4),ou(3,"\n "),_s(4,"div",5),ou(5),ys(),ou(6,"\n "),ys()}if(2&e){var i=t.$implicit;Pa(2),gs("src","assets/img/lang/"+i.iconName,Ar),Pa(3),su(i.name)}}var GC=function(){function e(e,t){this.dialogRef=e,this.languageService=t}return e.openDialog=function(t,n){void 0===n&&(n=!1);var i=new bw;return i.autoFocus=!1,i.disableClose=n,i.width="600px",t.open(e,i)},e.prototype.ngOnInit=function(){this.disableDismiss=this.dialogRef.disableClose,this.languages=this.languageService.languages},e.prototype.closePopup=function(e){void 0===e&&(e=null),e&&this.languageService.changeLanguage(e.code),this.dialogRef.close()},e.\u0275fac=function(t){return new(t||e)(ms(xw),ms(DC))},e.\u0275cmp=lt({type:e,selectors:[["app-select-language"]],decls:9,vars:6,consts:[[1,"e2e-language-modal",3,"headline","disableDismiss","dialog"],[1,"options-container","light-button-theme"],["mat-button","","color","primary","class","button",3,"click",4,"ngFor","ngForOf"],["mat-button","","color","primary",1,"button",3,"click"],[3,"src"],[1,"label"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),_s(3,"div",1),ou(4,"\n "),fs(5,qC,7,2,"button",2),ou(6,"\n "),ys(),ou(7,"\n"),ys(),ou(8,"\n")),2&e&&(gs("headline",Ul(1,4,"language.title"))("disableDismiss",t.disableDismiss)("dialog",t.dialogRef),Pa(5),gs("ngForOf",t.languages))},directives:[AM,dh,US],pipes:[oS],styles:[".options-container[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%]{width:118px;margin:20px;font-size:12px;line-height:1.4;padding:0;min-width:0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:64px;height:64px;margin:10px 0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);padding:4px 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#1e2227}"]}),e}(),KC=function(){return function(){this.label="",this.id="",this.addresses=[],this.encrypted=!1,this.isHardware=!1,this.hasHwSecurityWarnings=!1,this.stopShowingHwSecurityPopup=!1}}(),JC=function(){return function(){this.address="",this.confirmed=!1}}();function ZC(e,t){var n=new KC;return Object.assign(n,e),XC(!0,n),n.addresses=[],t&&e.addresses.forEach(function(e){n.addresses.push(QC(e))}),n}function QC(e){var t=new JC;return Object.assign(t,e),XC(!1,t),t}function XC(e,t){var n=new Map,i=e?new KC:new JC;Object.keys(i).forEach(function(e){n.set(e,!0)});var r=[];Object.keys(t).forEach(function(e){n.has(e)||r.push(e)}),r.forEach(function(e){delete t[e]})}var $C=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.coins=new If.a(0),t.hours=new If.a(0),t.addresses=[],t}return Vw(t,e),t}(KC),ex=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.coins=new If.a(0),t.hours=new If.a(0),t}return Vw(t,e),t}(JC),tx=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.addresses=[],t}return Vw(t,e),t}(KC),nx=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.outputs=[],t}return Vw(t,e),t}(JC),ix=function(){function e(e,t,n,i){this.apiService=e,this.hwWalletService=t,this.translate=n,this.storageService=i,this.hwWalletsDataStorageKey="hw-wallets",this.walletsSubject=new Im(1),this.initialLoadFailed=new Gp(!1),this.loadWallets()}return Object.defineProperty(e.prototype,"errorDuringinitialLoad",{get:function(){return this.initialLoadFailed.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"allWallets",{get:function(){return this.walletsSubject.asObservable()},enumerable:!1,configurable:!0}),e.prototype.addAddressesToWallet=function(e,t,n){var i=this;if(e.isHardware)return this.hwWalletService.getAddresses(t,e.addresses.length).pipe(ie(function(t){var n=i.walletsList.find(function(t){return t.id===e.id}),r=[];return t.rawResponse.forEach(function(e){var t={address:e,confirmed:!1};r.push(t),n.addresses.push(t)}),i.saveHardwareWalletsAndInformUpdate(),r}));var r=new Object;return r.id=e.id,r.num=t,n&&(r.password=n),this.apiService.post("wallet/newAddress",r).pipe(ie(function(t){var n=i.walletsList.find(function(t){return t.id===e.id}),r=[];return t.addresses.forEach(function(e){var t={address:e,confirmed:!0};r.push(t),n.addresses.push(t)}),i.informDataUpdated(),r}))},e.prototype.scanAddresses=function(e,t){var n=this;if(e.isHardware)return xf(!1);var i=new Object;return i.id=e.id,t&&(i.password=t),this.apiService.post("wallet/scan",i).pipe(ie(function(t){var i=n.walletsList.find(function(t){return t.id===e.id}),r=t.addresses;return!!(r&&r.length>0)&&(r.forEach(function(e){i.addresses.push({address:e,confirmed:!0})}),n.informDataUpdated(),!0)}))},e.prototype.informValuesUpdated=function(e){var t=this.walletsList.findIndex(function(t){return t.id===e.id});if(-1!==t){var n=ZC(e,!0);this.walletsList[t]=n,e.isHardware?this.saveHardwareWalletsAndInformUpdate():this.informDataUpdated()}},e.prototype.createSoftwareWallet=function(e,t,n){var i=this,r={label:e||"undefined",seed:t=t.replace(/(\n|\r\n)$/,""),scan:100,type:"deterministic"};return n&&(r.password=n,r.encrypt=!0),this.apiService.post("wallet/create",r).pipe(ie(function(e){var t={label:e.meta.label,id:e.meta.filename,addresses:[],encrypted:e.meta.encrypted,isHardware:!1,hasHwSecurityWarnings:!1,stopShowingHwSecurityPopup:!0};e.entries.forEach(function(e){return t.addresses.push({address:e.address,confirmed:!0})}),i.walletsList.push(t),i.informDataUpdated()}))},e.prototype.createHardwareWallet=function(){var e,t=this,n=0,i=new Map,r=new Map;return this.hwWalletService.getAddresses(zp.maxHardwareWalletAddresses,0).pipe(ue(function(n){(e=n.rawResponse).forEach(function(e){i.set(e,!0)});var r=!1;if(t.walletsList.forEach(function(e){i.has(e.id)&&(r=!0)}),r)return Lf(Hp("The wallet already exists"));var a=e.join(",");return t.apiService.post("transactions",{addrs:a})}),ie(function(a){a.forEach(function(e){e.txn.outputs.forEach(function(e){i.has(e.dst)&&r.set(e.dst,!0)})}),e.forEach(function(e,t){r.has(e)&&(n=t)});var o=t.createHardwareWalletData(t.translate.instant("hardware-wallet.general.default-wallet-name"),e.slice(0,n+1).map(function(e){return{address:e,confirmed:!1}}),!0,!1);o.id=o.addresses[0].address;for(var s=t.walletsList.length-1,u=0;u2&&void 0!==arguments[2]?arguments[2]:"imperative",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;return v(this,n),(r=t.call(this,e,i)).navigationTrigger=a,r.restoredState=o,r}return g(n,[{key:"toString",value:function(){return"NavigationStart(id: ".concat(this.id,", url: '").concat(this.url,"')")}}]),n}(ux),cx=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this,e,i)).urlAfterRedirects=r,a}return g(n,[{key:"toString",value:function(){return"NavigationEnd(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"')")}}]),n}(ux),dx=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this,e,i)).reason=r,a}return g(n,[{key:"toString",value:function(){return"NavigationCancel(id: ".concat(this.id,", url: '").concat(this.url,"')")}}]),n}(ux),hx=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this,e,i)).error=r,a}return g(n,[{key:"toString",value:function(){return"NavigationError(id: ".concat(this.id,", url: '").concat(this.url,"', error: ").concat(this.error,")")}}]),n}(ux),fx=function(e){_(n,e);var t=w(n);function n(e,i,r,a){var o;return v(this,n),(o=t.call(this,e,i)).urlAfterRedirects=r,o.state=a,o}return g(n,[{key:"toString",value:function(){return"RoutesRecognized(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(ux),px=function(e){_(n,e);var t=w(n);function n(e,i,r,a){var o;return v(this,n),(o=t.call(this,e,i)).urlAfterRedirects=r,o.state=a,o}return g(n,[{key:"toString",value:function(){return"GuardsCheckStart(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(ux),mx=function(e){_(n,e);var t=w(n);function n(e,i,r,a,o){var s;return v(this,n),(s=t.call(this,e,i)).urlAfterRedirects=r,s.state=a,s.shouldActivate=o,s}return g(n,[{key:"toString",value:function(){return"GuardsCheckEnd(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,", shouldActivate: ").concat(this.shouldActivate,")")}}]),n}(ux),gx=function(e){_(n,e);var t=w(n);function n(e,i,r,a){var o;return v(this,n),(o=t.call(this,e,i)).urlAfterRedirects=r,o.state=a,o}return g(n,[{key:"toString",value:function(){return"ResolveStart(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(ux),vx=function(e){_(n,e);var t=w(n);function n(e,i,r,a){var o;return v(this,n),(o=t.call(this,e,i)).urlAfterRedirects=r,o.state=a,o}return g(n,[{key:"toString",value:function(){return"ResolveEnd(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(ux),_x=function(){function e(t){v(this,e),this.route=t}return g(e,[{key:"toString",value:function(){return"RouteConfigLoadStart(path: ".concat(this.route.path,")")}}]),e}(),yx=function(){function e(t){v(this,e),this.route=t}return g(e,[{key:"toString",value:function(){return"RouteConfigLoadEnd(path: ".concat(this.route.path,")")}}]),e}(),bx=function(){function e(t){v(this,e),this.snapshot=t}return g(e,[{key:"toString",value:function(){return"ChildActivationStart(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),e}(),wx=function(){function e(t){v(this,e),this.snapshot=t}return g(e,[{key:"toString",value:function(){return"ChildActivationEnd(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),e}(),kx=function(){function e(t){v(this,e),this.snapshot=t}return g(e,[{key:"toString",value:function(){return"ActivationStart(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),e}(),Mx=function(){function e(t){v(this,e),this.snapshot=t}return g(e,[{key:"toString",value:function(){return"ActivationEnd(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),e}(),Sx=function(){function e(t,n,i){v(this,e),this.routerEvent=t,this.position=n,this.anchor=i}return g(e,[{key:"toString",value:function(){var e=this.position?"".concat(this.position[0],", ").concat(this.position[1]):null;return"Scroll(anchor: '".concat(this.anchor,"', position: '").concat(e,"')")}}]),e}(),Cx="primary",xx=function(){function e(t){v(this,e),this.params=t||{}}return g(e,[{key:"has",value:function(e){return Object.prototype.hasOwnProperty.call(this.params,e)}},{key:"get",value:function(e){if(this.has(e)){var t=this.params[e];return Array.isArray(t)?t[0]:t}return null}},{key:"getAll",value:function(e){if(this.has(e)){var t=this.params[e];return Array.isArray(t)?t:[t]}return[]}},{key:"keys",get:function(){return Object.keys(this.params)}}]),e}();function Lx(e){return new xx(e)}function Tx(e){var t=Error("NavigationCancelingError: "+e);return t.ngNavigationCancelingError=!0,t}function Dx(e,t,n){var i=n.path.split("/");if(i.length>e.length)return null;if("full"===n.pathMatch&&(t.hasChildren()||i.length0?e[e.length-1]:null}function Yx(e,t){for(var n in e)e.hasOwnProperty(n)&&t(e[n],n)}function Ix(e){return xs(e)?e:Cs(e)?se(Promise.resolve(e)):xf(e)}function Rx(e,t,n){return n?function(e,t){return Ox(e,t)}(e.queryParams,t.queryParams)&&Fx(e.root,t.root):function(e,t){return Object.keys(t).length<=Object.keys(e).length&&Object.keys(t).every(function(n){return Ex(e[n],t[n])})}(e.queryParams,t.queryParams)&&Hx(e.root,t.root)}function Fx(e,t){if(!Vx(e.segments,t.segments))return!1;if(e.numberOfChildren!==t.numberOfChildren)return!1;for(var n in t.children){if(!e.children[n])return!1;if(!Fx(e.children[n],t.children[n]))return!1}return!0}function Hx(e,t){return jx(e,t,t.segments)}function jx(e,t,n){if(e.segments.length>n.length)return!!Vx(e.segments.slice(0,n.length),n)&&!t.hasChildren();if(e.segments.length===n.length){if(!Vx(e.segments,n))return!1;for(var i in t.children){if(!e.children[i])return!1;if(!Hx(e.children[i],t.children[i]))return!1}return!0}var r=n.slice(0,e.segments.length),a=n.slice(e.segments.length);return!!Vx(e.segments,r)&&!!e.children.primary&&jx(e.children.primary,t,a)}var Nx=function(){function e(t,n,i){v(this,e),this.root=t,this.queryParams=n,this.fragment=i}return g(e,[{key:"toString",value:function(){return qx.serialize(this)}},{key:"queryParamMap",get:function(){return this._queryParamMap||(this._queryParamMap=Lx(this.queryParams)),this._queryParamMap}}]),e}(),Bx=function(){function e(t,n){var i=this;v(this,e),this.segments=t,this.children=n,this.parent=null,Yx(n,function(e,t){return e.parent=i})}return g(e,[{key:"hasChildren",value:function(){return this.numberOfChildren>0}},{key:"toString",value:function(){return Gx(this)}},{key:"numberOfChildren",get:function(){return Object.keys(this.children).length}}]),e}(),Wx=function(){function e(t,n){v(this,e),this.path=t,this.parameters=n}return g(e,[{key:"toString",value:function(){return eL(this)}},{key:"parameterMap",get:function(){return this._parameterMap||(this._parameterMap=Lx(this.parameters)),this._parameterMap}}]),e}();function Vx(e,t){return e.length===t.length&&e.every(function(e,n){return e.path===t[n].path})}var Ux=function e(){v(this,e)},zx=function(){function e(){v(this,e)}return g(e,[{key:"parse",value:function(e){var t=new aL(e);return new Nx(t.parseRootSegment(),t.parseQueryParams(),t.parseFragment())}},{key:"serialize",value:function(e){var t,n,i="/".concat(Kx(e.root,!0)),r=(t=e.queryParams,(n=Object.keys(t).map(function(e){var n=t[e];return Array.isArray(n)?n.map(function(t){return"".concat(Zx(e),"=").concat(Zx(t))}).join("&"):"".concat(Zx(e),"=").concat(Zx(n))})).length?"?".concat(n.join("&")):""),a="string"==typeof e.fragment?"#".concat(encodeURI(e.fragment)):"";return"".concat(i).concat(r).concat(a)}}]),e}(),qx=new zx;function Gx(e){return e.segments.map(function(e){return eL(e)}).join("/")}function Kx(e,t){if(!e.hasChildren())return Gx(e);if(t){var n=e.children.primary?Kx(e.children.primary,!1):"",i=[];return Yx(e.children,function(e,t){t!==Cx&&i.push("".concat(t,":").concat(Kx(e,!1)))}),i.length>0?"".concat(n,"(").concat(i.join("//"),")"):n}var r=function(e,t){var n=[];return Yx(e.children,function(e,i){i===Cx&&(n=n.concat(t(e,i)))}),Yx(e.children,function(e,i){i!==Cx&&(n=n.concat(t(e,i)))}),n}(e,function(t,n){return n===Cx?[Kx(e.children.primary,!1)]:["".concat(n,":").concat(Kx(t,!1))]});return 1===Object.keys(e.children).length&&null!=e.children.primary?"".concat(Gx(e),"/").concat(r[0]):"".concat(Gx(e),"/(").concat(r.join("//"),")")}function Jx(e){return encodeURIComponent(e).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function Zx(e){return Jx(e).replace(/%3B/gi,";")}function Qx(e){return Jx(e).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function Xx(e){return decodeURIComponent(e)}function $x(e){return Xx(e.replace(/\+/g,"%20"))}function eL(e){return"".concat(Qx(e.path)).concat((t=e.parameters,Object.keys(t).map(function(e){return";".concat(Qx(e),"=").concat(Qx(t[e]))}).join("")));var t}var tL=/^[^\/()?;=#]+/;function nL(e){var t=e.match(tL);return t?t[0]:""}var iL=/^[^=?&#]+/,rL=/^[^?&#]+/,aL=function(){function e(t){v(this,e),this.url=t,this.remaining=t}return g(e,[{key:"parseRootSegment",value:function(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new Bx([],{}):new Bx([],this.parseChildren())}},{key:"parseQueryParams",value:function(){var e={};if(this.consumeOptional("?"))do{this.parseQueryParam(e)}while(this.consumeOptional("&"));return e}},{key:"parseFragment",value:function(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}},{key:"parseChildren",value:function(){if(""===this.remaining)return{};this.consumeOptional("/");var e=[];for(this.peekStartsWith("(")||e.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),e.push(this.parseSegment());var t={};this.peekStartsWith("/(")&&(this.capture("/"),t=this.parseParens(!0));var n={};return this.peekStartsWith("(")&&(n=this.parseParens(!1)),(e.length>0||Object.keys(t).length>0)&&(n.primary=new Bx(e,t)),n}},{key:"parseSegment",value:function(){var e=nL(this.remaining);if(""===e&&this.peekStartsWith(";"))throw new Error("Empty path url segment cannot have parameters: '".concat(this.remaining,"'."));return this.capture(e),new Wx(Xx(e),this.parseMatrixParams())}},{key:"parseMatrixParams",value:function(){for(var e={};this.consumeOptional(";");)this.parseParam(e);return e}},{key:"parseParam",value:function(e){var t=nL(this.remaining);if(t){this.capture(t);var n="";if(this.consumeOptional("=")){var i=nL(this.remaining);i&&this.capture(n=i)}e[Xx(t)]=Xx(n)}}},{key:"parseQueryParam",value:function(e){var t,n=(t=this.remaining.match(iL))?t[0]:"";if(n){this.capture(n);var i="";if(this.consumeOptional("=")){var r=function(e){var t=e.match(rL);return t?t[0]:""}(this.remaining);r&&this.capture(i=r)}var a=$x(n),o=$x(i);if(e.hasOwnProperty(a)){var s=e[a];Array.isArray(s)||(e[a]=s=[s]),s.push(o)}else e[a]=o}}},{key:"parseParens",value:function(e){var t={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){var n=nL(this.remaining),i=this.remaining[n.length];if("/"!==i&&")"!==i&&";"!==i)throw new Error("Cannot parse url '".concat(this.url,"'"));var r=void 0;n.indexOf(":")>-1?(r=n.substr(0,n.indexOf(":")),this.capture(r),this.capture(":")):e&&(r=Cx);var a=this.parseChildren();t[r]=1===Object.keys(a).length?a.primary:new Bx([],a),this.consumeOptional("//")}return t}},{key:"peekStartsWith",value:function(e){return this.remaining.startsWith(e)}},{key:"consumeOptional",value:function(e){return!!this.peekStartsWith(e)&&(this.remaining=this.remaining.substring(e.length),!0)}},{key:"capture",value:function(e){if(!this.consumeOptional(e))throw new Error('Expected "'.concat(e,'".'))}}]),e}(),oL=function(){function e(t){v(this,e),this._root=t}return g(e,[{key:"parent",value:function(e){var t=this.pathFromRoot(e);return t.length>1?t[t.length-2]:null}},{key:"children",value:function(e){var t=sL(e,this._root);return t?t.children.map(function(e){return e.value}):[]}},{key:"firstChild",value:function(e){var t=sL(e,this._root);return t&&t.children.length>0?t.children[0].value:null}},{key:"siblings",value:function(e){var t=uL(e,this._root);return t.length<2?[]:t[t.length-2].children.map(function(e){return e.value}).filter(function(t){return t!==e})}},{key:"pathFromRoot",value:function(e){return uL(e,this._root).map(function(e){return e.value})}},{key:"root",get:function(){return this._root.value}}]),e}();function sL(e,t){if(e===t.value)return t;var n,i=c(t.children);try{for(i.s();!(n=i.n()).done;){var r=sL(e,n.value);if(r)return r}}catch(a){i.e(a)}finally{i.f()}return null}function uL(e,t){if(e===t.value)return[t];var n,i=c(t.children);try{for(i.s();!(n=i.n()).done;){var r=uL(e,n.value);if(r.length)return r.unshift(t),r}}catch(a){i.e(a)}finally{i.f()}return[]}var lL=function(){function e(t,n){v(this,e),this.value=t,this.children=n}return g(e,[{key:"toString",value:function(){return"TreeNode(".concat(this.value,")")}}]),e}();function cL(e){var t={};return e&&e.children.forEach(function(e){return t[e.value.outlet]=e}),t}var dL=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,e)).snapshot=i,_L(a(r),e),r}return g(n,[{key:"toString",value:function(){return this.snapshot.toString()}}]),n}(oL);function hL(e,t){var n=function(e,t){var n=new gL([],{},{},"",{},Cx,t,null,e.root,-1,{});return new vL("",new lL(n,[]))}(e,t),i=new Gp([new Wx("",{})]),r=new Gp({}),a=new Gp({}),o=new Gp({}),s=new Gp(""),u=new fL(i,r,o,s,a,Cx,t,n.root);return u.snapshot=n.root,new dL(new lL(u,[]),n)}var fL=function(){function e(t,n,i,r,a,o,s,u){v(this,e),this.url=t,this.params=n,this.queryParams=i,this.fragment=r,this.data=a,this.outlet=o,this.component=s,this._futureSnapshot=u}return g(e,[{key:"toString",value:function(){return this.snapshot?this.snapshot.toString():"Future(".concat(this._futureSnapshot,")")}},{key:"routeConfig",get:function(){return this._futureSnapshot.routeConfig}},{key:"root",get:function(){return this._routerState.root}},{key:"parent",get:function(){return this._routerState.parent(this)}},{key:"firstChild",get:function(){return this._routerState.firstChild(this)}},{key:"children",get:function(){return this._routerState.children(this)}},{key:"pathFromRoot",get:function(){return this._routerState.pathFromRoot(this)}},{key:"paramMap",get:function(){return this._paramMap||(this._paramMap=this.params.pipe(ie(function(e){return Lx(e)}))),this._paramMap}},{key:"queryParamMap",get:function(){return this._queryParamMap||(this._queryParamMap=this.queryParams.pipe(ie(function(e){return Lx(e)}))),this._queryParamMap}}]),e}();function pL(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"emptyOnly",n=e.pathFromRoot,i=0;if("always"!==t)for(i=n.length-1;i>=1;){var r=n[i],a=n[i-1];if(r.routeConfig&&""===r.routeConfig.path)i--;else{if(a.component)break;i--}}return mL(n.slice(i))}function mL(e){return e.reduce(function(e,t){return{params:Object.assign(Object.assign({},e.params),t.params),data:Object.assign(Object.assign({},e.data),t.data),resolve:Object.assign(Object.assign({},e.resolve),t._resolvedData)}},{params:{},data:{},resolve:{}})}var gL=function(){function e(t,n,i,r,a,o,s,u,l,c,d){v(this,e),this.url=t,this.params=n,this.queryParams=i,this.fragment=r,this.data=a,this.outlet=o,this.component=s,this.routeConfig=u,this._urlSegment=l,this._lastPathIndex=c,this._resolve=d}return g(e,[{key:"toString",value:function(){var e=this.url.map(function(e){return e.toString()}).join("/"),t=this.routeConfig?this.routeConfig.path:"";return"Route(url:'".concat(e,"', path:'").concat(t,"')")}},{key:"root",get:function(){return this._routerState.root}},{key:"parent",get:function(){return this._routerState.parent(this)}},{key:"firstChild",get:function(){return this._routerState.firstChild(this)}},{key:"children",get:function(){return this._routerState.children(this)}},{key:"pathFromRoot",get:function(){return this._routerState.pathFromRoot(this)}},{key:"paramMap",get:function(){return this._paramMap||(this._paramMap=Lx(this.params)),this._paramMap}},{key:"queryParamMap",get:function(){return this._queryParamMap||(this._queryParamMap=Lx(this.queryParams)),this._queryParamMap}}]),e}(),vL=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,i)).url=e,_L(a(r),i),r}return g(n,[{key:"toString",value:function(){return yL(this._root)}}]),n}(oL);function _L(e,t){t.value._routerState=e,t.children.forEach(function(t){return _L(e,t)})}function yL(e){var t=e.children.length>0?" { ".concat(e.children.map(yL).join(", ")," } "):"";return"".concat(e.value).concat(t)}function bL(e){if(e.snapshot){var t=e.snapshot,n=e._futureSnapshot;e.snapshot=n,Ox(t.queryParams,n.queryParams)||e.queryParams.next(n.queryParams),t.fragment!==n.fragment&&e.fragment.next(n.fragment),Ox(t.params,n.params)||e.params.next(n.params),function(e,t){if(e.length!==t.length)return!1;for(var n=0;nr;){if(a-=r,!(i=i.parent))throw new Error("Invalid number of '../'");r=i.segments.length}return new OL(i,!1,r-a)}(n.snapshot._urlSegment,n.snapshot._lastPathIndex+r,e.numberOfDoubleDots)}(a,t,e),s=o.processChildren?PL(o.segmentGroup,o.index,a.commands):EL(o.segmentGroup,o.index,a.commands);return LL(o.segmentGroup,s,t,i,r)}function CL(e){return"object"==typeof e&&null!=e&&!e.outlets&&!e.segmentPath}function xL(e){return"object"==typeof e&&null!=e&&e.outlets}function LL(e,t,n,i,r){var a={};return i&&Yx(i,function(e,t){a[t]=Array.isArray(e)?e.map(function(e){return"".concat(e)}):"".concat(e)}),new Nx(n.root===e?t:TL(n.root,e,t),a,r)}function TL(e,t,n){var i={};return Yx(e.children,function(e,r){i[r]=e===t?n:TL(e,t,n)}),new Bx(e.segments,i)}var DL=function(){function e(t,n,i){if(v(this,e),this.isAbsolute=t,this.numberOfDoubleDots=n,this.commands=i,t&&i.length>0&&CL(i[0]))throw new Error("Root segment cannot have matrix parameters");var r=i.find(xL);if(r&&r!==Ax(i))throw new Error("{outlets:{}} has to be the last command")}return g(e,[{key:"toRoot",value:function(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]}}]),e}(),OL=function e(t,n,i){v(this,e),this.segmentGroup=t,this.processChildren=n,this.index=i};function EL(e,t,n){if(e||(e=new Bx([],{})),0===e.segments.length&&e.hasChildren())return PL(e,t,n);var i=function(e,t,n){for(var i=0,r=t,a={match:!1,pathIndex:0,commandIndex:0};r=n.length)return a;var o=e.segments[r],s=n[i];if(xL(s))break;var u="".concat(s),l=i0&&void 0===u)break;if(u&&l&&"object"==typeof l&&void 0===l.outlets){if(!RL(u,l,o))return a;i+=2}else{if(!RL(u,{},o))return a;i++}r++}return{match:!0,pathIndex:r,commandIndex:i}}(e,t,n),r=n.slice(i.commandIndex);if(i.match&&i.pathIndex1&&void 0!==arguments[1]?arguments[1]:"",n=0;n0)?Object.assign({},QL):{matched:!0,consumedSegments:[],lastChild:0,parameters:{},positionalParamSegments:{}};var r=(t.matcher||Dx)(n,e,t);if(!r)return Object.assign({},QL);var a={};Yx(r.posParams,function(e,t){a[t]=e.path});var o=r.consumed.length>0?Object.assign(Object.assign({},a),r.consumed[r.consumed.length-1].parameters):a;return{matched:!0,consumedSegments:r.consumed,lastChild:r.consumed.length,parameters:o,positionalParamSegments:null!==(i=r.posParams)&&void 0!==i?i:{}}}function $L(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"corrected";if(n.length>0&&nT(e,n,i)){var a=new Bx(t,tT(e,t,i,new Bx(n,e.children)));return a._sourceSegment=e,a._segmentIndexShift=t.length,{segmentGroup:a,slicedSegments:[]}}if(0===n.length&&iT(e,n,i)){var o=new Bx(e.segments,eT(e,t,n,i,e.children,r));return o._sourceSegment=e,o._segmentIndexShift=t.length,{segmentGroup:o,slicedSegments:n}}var s=new Bx(e.segments,e.children);return s._sourceSegment=e,s._segmentIndexShift=t.length,{segmentGroup:s,slicedSegments:n}}function eT(e,t,n,i,r,a){var o,s={},u=c(i);try{for(u.s();!(o=u.n()).done;){var l=o.value;if(rT(e,n,l)&&!r[JL(l)]){var d=new Bx([],{});d._sourceSegment=e,d._segmentIndexShift="legacy"===a?e.segments.length:t.length,s[JL(l)]=d}}}catch(h){u.e(h)}finally{u.f()}return Object.assign(Object.assign({},r),s)}function tT(e,t,n,i){var r={};r.primary=i,i._sourceSegment=e,i._segmentIndexShift=t.length;var a,o=c(n);try{for(o.s();!(a=o.n()).done;){var s=a.value;if(""===s.path&&JL(s)!==Cx){var u=new Bx([],{});u._sourceSegment=e,u._segmentIndexShift=t.length,r[JL(s)]=u}}}catch(l){o.e(l)}finally{o.f()}return r}function nT(e,t,n){return n.some(function(n){return rT(e,t,n)&&JL(n)!==Cx})}function iT(e,t,n){return n.some(function(n){return rT(e,t,n)})}function rT(e,t,n){return(!(e.hasChildren()||t.length>0)||"full"!==n.pathMatch)&&""===n.path}function aT(e,t,n,i){return!!(JL(e)===i||i!==Cx&&rT(t,n,e))&&("**"===e.path||XL(t,e,n).matched)}function oT(e,t,n){return 0===t.length&&!e.children[n]}var sT=function e(t){v(this,e),this.segmentGroup=t||null},uT=function e(t){v(this,e),this.urlTree=t};function lT(e){return new N(function(t){return t.error(new sT(e))})}function cT(e){return new N(function(t){return t.error(new uT(e))})}function dT(e){return new N(function(t){return t.error(new Error("Only absolute redirects can have named outlets. redirectTo: '".concat(e,"'")))})}var hT=function(){function e(t,n,i,r,a){v(this,e),this.configLoader=n,this.urlSerializer=i,this.urlTree=r,this.config=a,this.allowRedirects=!0,this.ngModule=t.get(_l)}return g(e,[{key:"apply",value:function(){var e=this,t=$L(this.urlTree.root,[],[],this.config).segmentGroup,n=new Bx(t.segments,t.children);return this.expandSegmentGroup(this.ngModule,this.config,n,Cx).pipe(ie(function(t){return e.createUrlTree(fT(t),e.urlTree.queryParams,e.urlTree.fragment)})).pipe(Rf(function(t){if(t instanceof uT)return e.allowRedirects=!1,e.match(t.urlTree);if(t instanceof sT)throw e.noMatchError(t);throw t}))}},{key:"match",value:function(e){var t=this;return this.expandSegmentGroup(this.ngModule,this.config,e.root,Cx).pipe(ie(function(n){return t.createUrlTree(fT(n),e.queryParams,e.fragment)})).pipe(Rf(function(e){if(e instanceof sT)throw t.noMatchError(e);throw e}))}},{key:"noMatchError",value:function(e){return new Error("Cannot match any routes. URL Segment: '".concat(e.segmentGroup,"'"))}},{key:"createUrlTree",value:function(e,t,n){var i=e.segments.length>0?new Bx([],l({},Cx,e)):e;return new Nx(i,t,n)}},{key:"expandSegmentGroup",value:function(e,t,n,i){return 0===n.segments.length&&n.hasChildren()?this.expandChildren(e,t,n).pipe(ie(function(e){return new Bx([],e)})):this.expandSegment(e,n,t,n.segments,i,!0)}},{key:"expandChildren",value:function(e,t,n){for(var i=this,r=[],a=0,o=Object.keys(n.children);a=2;return function(i){return i.pipe(e?Nf(function(t,n){return e(t,n,i)}):de,FM(1),n?Gf(t):Zf(function(){return new jf}))}}())}},{key:"expandSegment",value:function(e,t,n,i,r,a){var o=this;return se(n).pipe(tp(function(s){return o.expandSegmentAgainstRoute(e,t,n,s,i,r,a).pipe(Rf(function(e){if(e instanceof sT)return xf(null);throw e}))}),ep(function(e){return!!e}),Rf(function(e,n){if(e instanceof jf||"EmptyError"===e.name){if(oT(t,i,r))return xf(new Bx([],{}));throw new sT(t)}throw e}))}},{key:"expandSegmentAgainstRoute",value:function(e,t,n,i,r,a,o){return aT(i,t,r,a)?void 0===i.redirectTo?this.matchSegmentAgainstRoute(e,t,i,r,a):o&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(e,t,n,i,r,a):lT(t):lT(t)}},{key:"expandSegmentAgainstRouteUsingRedirect",value:function(e,t,n,i,r,a){return"**"===i.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(e,n,i,a):this.expandRegularSegmentAgainstRouteUsingRedirect(e,t,n,i,r,a)}},{key:"expandWildCardWithParamsAgainstRouteUsingRedirect",value:function(e,t,n,i){var r=this,a=this.applyRedirectCommands([],n.redirectTo,{});return n.redirectTo.startsWith("/")?cT(a):this.lineralizeSegments(n,a).pipe(ue(function(n){var a=new Bx(n,{});return r.expandSegment(e,a,t,n,i,!1)}))}},{key:"expandRegularSegmentAgainstRouteUsingRedirect",value:function(e,t,n,i,r,a){var o=this,s=XL(t,i,r),u=s.consumedSegments,l=s.lastChild,c=s.positionalParamSegments;if(!s.matched)return lT(t);var d=this.applyRedirectCommands(u,i.redirectTo,c);return i.redirectTo.startsWith("/")?cT(d):this.lineralizeSegments(i,d).pipe(ue(function(i){return o.expandSegment(e,t,n,i.concat(r.slice(l)),a,!1)}))}},{key:"matchSegmentAgainstRoute",value:function(e,t,n,i,r){var a=this;if("**"===n.path)return n.loadChildren?this.configLoader.load(e.injector,n).pipe(ie(function(e){return n._loadedConfig=e,new Bx(i,{})})):xf(new Bx(i,{}));var o=XL(t,n,i),s=o.consumedSegments,u=o.lastChild;if(!o.matched)return lT(t);var l=i.slice(u);return this.getChildConfig(e,n,i).pipe(ue(function(e){var i=e.module,o=e.routes,u=$L(t,s,l,o),c=u.segmentGroup,d=u.slicedSegments,h=new Bx(c.segments,c.children);if(0===d.length&&h.hasChildren())return a.expandChildren(i,o,h).pipe(ie(function(e){return new Bx(s,e)}));if(0===o.length&&0===d.length)return xf(new Bx(s,{}));var f=JL(n)===r;return a.expandSegment(i,h,o,d,f?Cx:r,!0).pipe(ie(function(e){return new Bx(s.concat(e.segments),e.children)}))}))}},{key:"getChildConfig",value:function(e,t,n){var i=this;return t.children?xf(new jL(t.children,e)):t.loadChildren?void 0!==t._loadedConfig?xf(t._loadedConfig):this.runCanLoadGuards(e.injector,t,n).pipe(ue(function(n){return n?i.configLoader.load(e.injector,t).pipe(ie(function(e){return t._loadedConfig=e,e})):function(e){return new N(function(t){return t.error(Tx("Cannot load children because the guard of the route \"path: '".concat(e.path,"'\" returned false")))})}(t)})):xf(new jL([],e))}},{key:"runCanLoadGuards",value:function(e,t,n){var i=this,r=t.canLoad;return r&&0!==r.length?xf(r.map(function(i){var r,a=e.get(i);if(function(e){return e&&NL(e.canLoad)}(a))r=a.canLoad(t,n);else{if(!NL(a))throw new Error("Invalid CanLoad guard");r=a(t,n)}return Ix(r)})).pipe(VL(),Gg(function(e){if(BL(e)){var t=Tx('Redirecting to "'.concat(i.urlSerializer.serialize(e),'"'));throw t.url=e,t}}),ie(function(e){return!0===e})):xf(!0)}},{key:"lineralizeSegments",value:function(e,t){for(var n=[],i=t.root;;){if(n=n.concat(i.segments),0===i.numberOfChildren)return xf(n);if(i.numberOfChildren>1||!i.children.primary)return dT(e.redirectTo);i=i.children.primary}}},{key:"applyRedirectCommands",value:function(e,t,n){return this.applyRedirectCreatreUrlTree(t,this.urlSerializer.parse(t),e,n)}},{key:"applyRedirectCreatreUrlTree",value:function(e,t,n,i){var r=this.createSegmentGroup(e,t.root,n,i);return new Nx(r,this.createQueryParams(t.queryParams,this.urlTree.queryParams),t.fragment)}},{key:"createQueryParams",value:function(e,t){var n={};return Yx(e,function(e,i){if("string"==typeof e&&e.startsWith(":")){var r=e.substring(1);n[i]=t[r]}else n[i]=e}),n}},{key:"createSegmentGroup",value:function(e,t,n,i){var r=this,a=this.createSegments(e,t.segments,n,i),o={};return Yx(t.children,function(t,a){o[a]=r.createSegmentGroup(e,t,n,i)}),new Bx(a,o)}},{key:"createSegments",value:function(e,t,n,i){var r=this;return t.map(function(t){return t.path.startsWith(":")?r.findPosParam(e,t,i):r.findOrReturn(t,n)})}},{key:"findPosParam",value:function(e,t,n){var i=n[t.path.substring(1)];if(!i)throw new Error("Cannot redirect to '".concat(e,"'. Cannot find '").concat(t.path,"'."));return i}},{key:"findOrReturn",value:function(e,t){var n,i=0,r=c(t);try{for(r.s();!(n=r.n()).done;){var a=n.value;if(a.path===e.path)return t.splice(i),a;i++}}catch(o){r.e(o)}finally{r.f()}return e}}]),e}();function fT(e){for(var t={},n=0,i=Object.keys(e.children);n0||a.hasChildren())&&(t[r]=a)}return function(e){if(1===e.numberOfChildren&&e.children.primary){var t=e.children.primary;return new Bx(e.segments.concat(t.segments),t.children)}return e}(new Bx(e.segments,t))}var pT=function e(t){v(this,e),this.path=t,this.route=this.path[this.path.length-1]},mT=function e(t,n){v(this,e),this.component=t,this.route=n};function gT(e,t,n){var i=function(e){if(!e)return null;for(var t=e.parent;t;t=t.parent){var n=t.routeConfig;if(n&&n._loadedConfig)return n._loadedConfig}return null}(t);return(i?i.module.injector:n).get(e)}function vT(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{canDeactivateChecks:[],canActivateChecks:[]},a=cL(t);return e.children.forEach(function(e){_T(e,a[e.value.outlet],n,i.concat([e.value]),r),delete a[e.value.outlet]}),Yx(a,function(e,t){return bT(e,n.getContext(t),r)}),r}function _T(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{canDeactivateChecks:[],canActivateChecks:[]},a=e.value,o=t?t.value:null,s=n?n.getContext(e.value.outlet):null;if(o&&a.routeConfig===o.routeConfig){var u=yT(o,a,a.routeConfig.runGuardsAndResolvers);u?r.canActivateChecks.push(new pT(i)):(a.data=o.data,a._resolvedData=o._resolvedData),vT(e,t,a.component?s?s.children:null:n,i,r),u&&s&&s.outlet&&s.outlet.isActivated&&r.canDeactivateChecks.push(new mT(s.outlet.component,o))}else o&&bT(t,s,r),r.canActivateChecks.push(new pT(i)),vT(e,null,a.component?s?s.children:null:n,i,r);return r}function yT(e,t,n){if("function"==typeof n)return n(e,t);switch(n){case"pathParamsChange":return!Vx(e.url,t.url);case"pathParamsOrQueryParamsChange":return!Vx(e.url,t.url)||!Ox(e.queryParams,t.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!wL(e,t)||!Ox(e.queryParams,t.queryParams);case"paramsChange":default:return!wL(e,t)}}function bT(e,t,n){var i=cL(e),r=e.value;Yx(i,function(e,i){bT(e,r.component?t?t.children.getContext(i):null:t,n)}),n.canDeactivateChecks.push(new mT(r.component&&t&&t.outlet&&t.outlet.isActivated?t.outlet.component:null,r))}function wT(e,t){return null!==e&&t&&t(new kx(e)),xf(!0)}function kT(e,t){return null!==e&&t&&t(new bx(e)),xf(!0)}function MT(e,t,n){var i=t.routeConfig?t.routeConfig.canActivate:null;return i&&0!==i.length?xf(i.map(function(i){return _w(function(){var r,a=gT(i,t,n);if(function(e){return e&&NL(e.canActivate)}(a))r=Ix(a.canActivate(t,e));else{if(!NL(a))throw new Error("Invalid CanActivate guard");r=Ix(a(t,e))}return r.pipe(ep())})})).pipe(VL()):xf(!0)}function ST(e,t,n){var i=t[t.length-1],r=t.slice(0,t.length-1).reverse().map(function(e){return function(e){var t=e.routeConfig?e.routeConfig.canActivateChild:null;return t&&0!==t.length?{node:e,guards:t}:null}(e)}).filter(function(e){return null!==e}).map(function(t){return _w(function(){return xf(t.guards.map(function(r){var a,o=gT(r,t.node,n);if(function(e){return e&&NL(e.canActivateChild)}(o))a=Ix(o.canActivateChild(i,e));else{if(!NL(o))throw new Error("Invalid CanActivateChild guard");a=Ix(o(i,e))}return a.pipe(ep())})).pipe(VL())})});return xf(r).pipe(VL())}var CT=function e(){v(this,e)};function xT(e){return new N(function(t){return t.error(e)})}var LT=function(){function e(t,n,i,r,a,o){v(this,e),this.rootComponentType=t,this.config=n,this.urlTree=i,this.url=r,this.paramsInheritanceStrategy=a,this.relativeLinkResolution=o}return g(e,[{key:"recognize",value:function(){var e=$L(this.urlTree.root,[],[],this.config.filter(function(e){return void 0===e.redirectTo}),this.relativeLinkResolution).segmentGroup,t=this.processSegmentGroup(this.config,e,Cx);if(null===t)return null;var n=new gL([],Object.freeze({}),Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,{},Cx,this.rootComponentType,null,this.urlTree.root,-1,{}),i=new lL(n,t),r=new vL(this.url,i);return this.inheritParamsAndData(r._root),r}},{key:"inheritParamsAndData",value:function(e){var t=this,n=e.value,i=pL(n,this.paramsInheritanceStrategy);n.params=Object.freeze(i.params),n.data=Object.freeze(i.data),e.children.forEach(function(e){return t.inheritParamsAndData(e)})}},{key:"processSegmentGroup",value:function(e,t,n){return 0===t.segments.length&&t.hasChildren()?this.processChildren(e,t):this.processSegment(e,t,t.segments,n)}},{key:"processChildren",value:function(e,t){for(var n=[],i=0,r=Object.keys(t.children);i0?Ax(n).parameters:{};r=new gL(n,s,Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,OT(e),JL(e),e.component,e,TT(t),DT(t)+n.length,ET(e))}else{var u=XL(t,e,n);if(!u.matched)return null;a=u.consumedSegments,o=n.slice(u.lastChild),r=new gL(a,u.parameters,Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,OT(e),JL(e),e.component,e,TT(t),DT(t)+a.length,ET(e))}var l=function(e){return e.children?e.children:e.loadChildren?e._loadedConfig.routes:[]}(e),c=$L(t,a,o,l.filter(function(e){return void 0===e.redirectTo}),this.relativeLinkResolution),d=c.segmentGroup,h=c.slicedSegments;if(0===h.length&&d.hasChildren()){var f=this.processChildren(l,d);return null===f?null:[new lL(r,f)]}if(0===l.length&&0===h.length)return[new lL(r,[])];var p=JL(e)===i,m=this.processSegment(l,d,h,p?Cx:i);return null===m?null:[new lL(r,m)]}}]),e}();function TT(e){for(var t=e;t._sourceSegment;)t=t._sourceSegment;return t}function DT(e){for(var t=e,n=t._segmentIndexShift?t._segmentIndexShift:0;t._sourceSegment;)n+=(t=t._sourceSegment)._segmentIndexShift?t._segmentIndexShift:0;return n-1}function OT(e){return e.data||{}}function ET(e){return e.resolve||{}}function PT(e){return function(t){return t.pipe(Lm(function(t){var n=e(t);return n?se(n).pipe(ie(function(){return t})):se([t])}))}}var AT=function(e){_(n,e);var t=w(n);function n(){return v(this,n),t.apply(this,arguments)}return n}(function(){function e(){v(this,e)}return g(e,[{key:"shouldDetach",value:function(e){return!1}},{key:"store",value:function(e,t){}},{key:"shouldAttach",value:function(e){return!1}},{key:"retrieve",value:function(e){return null}},{key:"shouldReuseRoute",value:function(e,t){return e.routeConfig===t.routeConfig}}]),e}()),YT=new Si("ROUTES"),IT=function(){function e(t,n,i,r){v(this,e),this.loader=t,this.compiler=n,this.onLoadStartListener=i,this.onLoadEndListener=r}return g(e,[{key:"load",value:function(e,t){var n=this;return this.onLoadStartListener&&this.onLoadStartListener(t),this.loadModuleFactory(t.loadChildren).pipe(ie(function(i){n.onLoadEndListener&&n.onLoadEndListener(t);var r=i.create(e);return new jL(Px(r.injector.get(YT)).map(KL),r)}))}},{key:"loadModuleFactory",value:function(e){var t=this;return"string"==typeof e?se(this.loader.load(e)):Ix(e()).pipe(ue(function(e){return e instanceof yl?xf(e):se(t.compiler.compileModuleAsync(e))}))}}]),e}(),RT=function e(){v(this,e),this.outlet=null,this.route=null,this.resolver=null,this.children=new FT,this.attachRef=null},FT=function(){function e(){v(this,e),this.contexts=new Map}return g(e,[{key:"onChildOutletCreated",value:function(e,t){var n=this.getOrCreateContext(e);n.outlet=t,this.contexts.set(e,n)}},{key:"onChildOutletDestroyed",value:function(e){var t=this.getContext(e);t&&(t.outlet=null)}},{key:"onOutletDeactivated",value:function(){var e=this.contexts;return this.contexts=new Map,e}},{key:"onOutletReAttached",value:function(e){this.contexts=e}},{key:"getOrCreateContext",value:function(e){var t=this.getContext(e);return t||(t=new RT,this.contexts.set(e,t)),t}},{key:"getContext",value:function(e){return this.contexts.get(e)||null}}]),e}(),HT=function(){function e(){v(this,e)}return g(e,[{key:"shouldProcessUrl",value:function(e){return!0}},{key:"extract",value:function(e){return e}},{key:"merge",value:function(e,t){return e}}]),e}();function jT(e){throw e}function NT(e,t,n){return t.parse("/")}function BT(e,t){return xf(null)}var WT=function(){var e=function(){function e(t,n,i,r,a,o,s,u){var l=this;v(this,e),this.rootComponentType=t,this.urlSerializer=n,this.rootContexts=i,this.location=r,this.config=u,this.lastSuccessfulNavigation=null,this.currentNavigation=null,this.lastLocationChangeInfo=null,this.navigationId=0,this.isNgZoneEnabled=!1,this.events=new z,this.errorHandler=jT,this.malformedUriErrorHandler=NT,this.navigated=!1,this.lastSuccessfulId=-1,this.hooks={beforePreactivation:BT,afterPreactivation:BT},this.urlHandlingStrategy=new HT,this.routeReuseStrategy=new AT,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.urlUpdateStrategy="deferred",this.relativeLinkResolution="corrected",this.ngModule=a.get(_l),this.console=a.get(Lc);var c=a.get(Nc);this.isNgZoneEnabled=c instanceof Nc,this.resetConfig(u),this.currentUrlTree=new Nx(new Bx([],{}),{},null),this.rawUrlTree=this.currentUrlTree,this.browserUrlTree=this.currentUrlTree,this.configLoader=new IT(o,s,function(e){return l.triggerEvent(new _x(e))},function(e){return l.triggerEvent(new yx(e))}),this.routerState=hL(this.currentUrlTree,this.rootComponentType),this.transitions=new Gp({id:0,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,extractedUrl:this.urlHandlingStrategy.extract(this.currentUrlTree),urlAfterRedirects:this.urlHandlingStrategy.extract(this.currentUrlTree),rawUrl:this.currentUrlTree,extras:{},resolve:null,reject:null,promise:Promise.resolve(!0),source:"imperative",restoredState:null,currentSnapshot:this.routerState.snapshot,targetSnapshot:null,currentRouterState:this.routerState,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null}),this.navigations=this.setupNavigations(this.transitions),this.processNavigations()}return g(e,[{key:"setupNavigations",value:function(e){var t=this,n=this.events;return e.pipe(Nf(function(e){return 0!==e.id}),ie(function(e){return Object.assign(Object.assign({},e),{extractedUrl:t.urlHandlingStrategy.extract(e.rawUrl)})}),Lm(function(e){var i,r,a,o=!1,s=!1;return xf(e).pipe(Gg(function(e){t.currentNavigation={id:e.id,initialUrl:e.currentRawUrl,extractedUrl:e.extractedUrl,trigger:e.source,extras:e.extras,previousNavigation:t.lastSuccessfulNavigation?Object.assign(Object.assign({},t.lastSuccessfulNavigation),{previousNavigation:null}):null}}),Lm(function(e){var i,r,a,o,s=!t.navigated||e.extractedUrl.toString()!==t.browserUrlTree.toString();if(("reload"===t.onSameUrlNavigation||s)&&t.urlHandlingStrategy.shouldProcessUrl(e.rawUrl))return xf(e).pipe(Lm(function(e){var i=t.transitions.getValue();return n.next(new lx(e.id,t.serializeUrl(e.extractedUrl),e.source,e.restoredState)),i!==t.transitions.getValue()?Sf:[e]}),Lm(function(e){return Promise.resolve(e)}),(i=t.ngModule.injector,r=t.configLoader,a=t.urlSerializer,o=t.config,function(e){return e.pipe(Lm(function(e){return function(e,t,n,i,r){return new hT(e,t,n,i,r).apply()}(i,r,a,e.extractedUrl,o).pipe(ie(function(t){return Object.assign(Object.assign({},e),{urlAfterRedirects:t})}))}))}),Gg(function(e){t.currentNavigation=Object.assign(Object.assign({},t.currentNavigation),{finalUrl:e.urlAfterRedirects})}),function(e,n,i,r,a){return function(i){return i.pipe(ue(function(i){return function(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"emptyOnly",a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"legacy";try{var o=new LT(e,t,n,i,r,a).recognize();return null===o?xT(new CT):xf(o)}catch(s){return xT(s)}}(e,n,i.urlAfterRedirects,(o=i.urlAfterRedirects,t.serializeUrl(o)),r,a).pipe(ie(function(e){return Object.assign(Object.assign({},i),{targetSnapshot:e})}));var o}))}}(t.rootComponentType,t.config,0,t.paramsInheritanceStrategy,t.relativeLinkResolution),Gg(function(e){"eager"===t.urlUpdateStrategy&&(e.extras.skipLocationChange||t.setBrowserUrl(e.urlAfterRedirects,!!e.extras.replaceUrl,e.id,e.extras.state),t.browserUrlTree=e.urlAfterRedirects)}),Gg(function(e){var i=new fx(e.id,t.serializeUrl(e.extractedUrl),t.serializeUrl(e.urlAfterRedirects),e.targetSnapshot);n.next(i)}));if(s&&t.rawUrlTree&&t.urlHandlingStrategy.shouldProcessUrl(t.rawUrlTree)){var u=e.extractedUrl,l=e.source,c=e.restoredState,d=e.extras,h=new lx(e.id,t.serializeUrl(u),l,c);n.next(h);var f=hL(u,t.rootComponentType).snapshot;return xf(Object.assign(Object.assign({},e),{targetSnapshot:f,urlAfterRedirects:u,extras:Object.assign(Object.assign({},d),{skipLocationChange:!1,replaceUrl:!1})}))}return t.rawUrlTree=e.rawUrl,t.browserUrlTree=e.urlAfterRedirects,e.resolve(null),Sf}),PT(function(e){var n=e.extras;return t.hooks.beforePreactivation(e.targetSnapshot,{navigationId:e.id,appliedUrlTree:e.extractedUrl,rawUrlTree:e.rawUrl,skipLocationChange:!!n.skipLocationChange,replaceUrl:!!n.replaceUrl})}),Gg(function(e){var n=new px(e.id,t.serializeUrl(e.extractedUrl),t.serializeUrl(e.urlAfterRedirects),e.targetSnapshot);t.triggerEvent(n)}),ie(function(e){return Object.assign(Object.assign({},e),{guards:(n=e.targetSnapshot,i=e.currentSnapshot,r=t.rootContexts,a=n._root,vT(a,i?i._root:null,r,[a.value]))});var n,i,r,a}),function(e,t){return function(n){return n.pipe(ue(function(n){var i=n.targetSnapshot,r=n.currentSnapshot,a=n.guards,o=a.canActivateChecks,s=a.canDeactivateChecks;return 0===s.length&&0===o.length?xf(Object.assign(Object.assign({},n),{guardsResult:!0})):function(e,t,n,i){return se(e).pipe(ue(function(e){return function(e,t,n,i,r){var a=t&&t.routeConfig?t.routeConfig.canDeactivate:null;return a&&0!==a.length?xf(a.map(function(a){var o,s=gT(a,t,r);if(function(e){return e&&NL(e.canDeactivate)}(s))o=Ix(s.canDeactivate(e,t,n,i));else{if(!NL(s))throw new Error("Invalid CanDeactivate guard");o=Ix(s(e,t,n,i))}return o.pipe(ep())})).pipe(VL()):xf(!0)}(e.component,e.route,n,t,i)}),ep(function(e){return!0!==e},!0))}(s,i,r,e).pipe(ue(function(n){return n&&"boolean"==typeof n?function(e,t,n,i){return se(t).pipe(tp(function(t){return se([kT(t.route.parent,i),wT(t.route,i),ST(e,t.path,n),MT(e,t.route,n)]).pipe(Sm(),ep(function(e){return!0!==e},!0))}),ep(function(e){return!0!==e},!0))}(i,o,e,t):xf(n)}),ie(function(e){return Object.assign(Object.assign({},n),{guardsResult:e})}))}))}}(t.ngModule.injector,function(e){return t.triggerEvent(e)}),Gg(function(e){if(BL(e.guardsResult)){var n=Tx('Redirecting to "'.concat(t.serializeUrl(e.guardsResult),'"'));throw n.url=e.guardsResult,n}}),Gg(function(e){var n=new mx(e.id,t.serializeUrl(e.extractedUrl),t.serializeUrl(e.urlAfterRedirects),e.targetSnapshot,!!e.guardsResult);t.triggerEvent(n)}),Nf(function(e){if(!e.guardsResult){t.resetUrlToCurrentUrlTree();var i=new dx(e.id,t.serializeUrl(e.extractedUrl),"");return n.next(i),e.resolve(!1),!1}return!0}),PT(function(e){if(e.guards.canActivateChecks.length)return xf(e).pipe(Gg(function(e){var n=new gx(e.id,t.serializeUrl(e.extractedUrl),t.serializeUrl(e.urlAfterRedirects),e.targetSnapshot);t.triggerEvent(n)}),Lm(function(e){var i,r,a=!1;return xf(e).pipe((i=t.paramsInheritanceStrategy,r=t.ngModule.injector,function(e){return e.pipe(ue(function(e){var t=e.targetSnapshot,n=e.guards.canActivateChecks;if(!n.length)return xf(e);var a=0;return se(n).pipe(tp(function(e){return function(e,t,n,i){return function(e,t,n,i){var r=Object.keys(e);if(0===r.length)return xf({});var a={};return se(r).pipe(ue(function(r){return function(e,t,n,i){var r=gT(e,t,i);return Ix(r.resolve?r.resolve(t,n):r(t,n))}(e[r],t,n,i).pipe(Gg(function(e){a[r]=e}))}),FM(1),ue(function(){return Object.keys(a).length===r.length?xf(a):Sf}))}(e._resolve,e,t,i).pipe(ie(function(t){return e._resolvedData=t,e.data=Object.assign(Object.assign({},e.data),pL(e,n).resolve),null}))}(e.route,t,i,r)}),Gg(function(){return a++}),FM(1),ue(function(t){return a===n.length?xf(e):Sf}))}))}),Gg({next:function(){return a=!0},complete:function(){if(!a){var i=new dx(e.id,t.serializeUrl(e.extractedUrl),"At least one route resolver didn't emit any value.");n.next(i),e.resolve(!1)}}}))}),Gg(function(e){var n=new vx(e.id,t.serializeUrl(e.extractedUrl),t.serializeUrl(e.urlAfterRedirects),e.targetSnapshot);t.triggerEvent(n)}))}),PT(function(e){var n=e.extras;return t.hooks.afterPreactivation(e.targetSnapshot,{navigationId:e.id,appliedUrlTree:e.extractedUrl,rawUrlTree:e.rawUrl,skipLocationChange:!!n.skipLocationChange,replaceUrl:!!n.replaceUrl})}),ie(function(e){var n,i,r,a=(r=kL(t.routeReuseStrategy,(n=e.targetSnapshot)._root,(i=e.currentRouterState)?i._root:void 0),new dL(r,n));return Object.assign(Object.assign({},e),{targetRouterState:a})}),Gg(function(e){t.currentUrlTree=e.urlAfterRedirects,t.rawUrlTree=t.urlHandlingStrategy.merge(t.currentUrlTree,e.rawUrl),t.routerState=e.targetRouterState,"deferred"===t.urlUpdateStrategy&&(e.extras.skipLocationChange||t.setBrowserUrl(t.rawUrlTree,!!e.extras.replaceUrl,e.id,e.extras.state),t.browserUrlTree=e.urlAfterRedirects)}),(i=t.rootContexts,r=t.routeReuseStrategy,a=function(e){return t.triggerEvent(e)},ie(function(e){return new FL(r,e.targetRouterState,e.currentRouterState,a).activate(i),e})),Gg({next:function(){o=!0},complete:function(){o=!0}}),qS(function(){if(!o&&!s){t.resetUrlToCurrentUrlTree();var i=new dx(e.id,t.serializeUrl(e.extractedUrl),"Navigation ID ".concat(e.id," is not equal to the current navigation id ").concat(t.navigationId));n.next(i),e.resolve(!1)}t.currentNavigation=null}),Rf(function(i){if(s=!0,(u=i)&&u.ngNavigationCancelingError){var r=BL(i.url);r||(t.navigated=!0,t.resetStateAndUrl(e.currentRouterState,e.currentUrlTree,e.rawUrl));var a=new dx(e.id,t.serializeUrl(e.extractedUrl),i.message);n.next(a),r?setTimeout(function(){var n=t.urlHandlingStrategy.merge(i.url,t.rawUrlTree);return t.scheduleNavigation(n,"imperative",null,{skipLocationChange:e.extras.skipLocationChange,replaceUrl:"eager"===t.urlUpdateStrategy},{resolve:e.resolve,reject:e.reject,promise:e.promise})},0):e.resolve(!1)}else{t.resetStateAndUrl(e.currentRouterState,e.currentUrlTree,e.rawUrl);var o=new hx(e.id,t.serializeUrl(e.extractedUrl),i);n.next(o);try{e.resolve(t.errorHandler(i))}catch(l){e.reject(l)}}var u;return Sf}))}))}},{key:"resetRootComponentType",value:function(e){this.rootComponentType=e,this.routerState.root.component=this.rootComponentType}},{key:"getTransition",value:function(){var e=this.transitions.value;return e.urlAfterRedirects=this.browserUrlTree,e}},{key:"setTransition",value:function(e){this.transitions.next(Object.assign(Object.assign({},this.getTransition()),e))}},{key:"initialNavigation",value:function(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})}},{key:"setUpLocationChangeListener",value:function(){var e=this;this.locationSubscription||(this.locationSubscription=this.location.subscribe(function(t){var n=e.extractLocationChangeInfoFromEvent(t);e.shouldScheduleNavigation(e.lastLocationChangeInfo,n)&&setTimeout(function(){var t=n.source,i=n.state,r=n.urlTree,a={replaceUrl:!0};if(i){var o=Object.assign({},i);delete o.navigationId,0!==Object.keys(o).length&&(a.state=o)}e.scheduleNavigation(r,t,i,a)},0),e.lastLocationChangeInfo=n}))}},{key:"extractLocationChangeInfoFromEvent",value:function(e){var t;return{source:"popstate"===e.type?"popstate":"hashchange",urlTree:this.parseUrl(e.url),state:(null===(t=e.state)||void 0===t?void 0:t.navigationId)?e.state:null,transitionId:this.getTransition().id}}},{key:"shouldScheduleNavigation",value:function(e,t){if(!e)return!0;var n=t.urlTree.toString()===e.urlTree.toString();return!(t.transitionId===e.transitionId&&n&&("hashchange"===t.source&&"popstate"===e.source||"popstate"===t.source&&"hashchange"===e.source))}},{key:"getCurrentNavigation",value:function(){return this.currentNavigation}},{key:"triggerEvent",value:function(e){this.events.next(e)}},{key:"resetConfig",value:function(e){zL(e),this.config=e.map(KL),this.navigated=!1,this.lastSuccessfulId=-1}},{key:"ngOnDestroy",value:function(){this.dispose()}},{key:"dispose",value:function(){this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=void 0)}},{key:"createUrlTree",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.relativeTo,i=t.queryParams,r=t.fragment,a=t.queryParamsHandling,o=t.preserveFragment,s=n||this.routerState.root,u=o?this.currentUrlTree.fragment:r,l=null;switch(a){case"merge":l=Object.assign(Object.assign({},this.currentUrlTree.queryParams),i);break;case"preserve":l=this.currentUrlTree.queryParams;break;default:l=i||null}return null!==l&&(l=this.removeEmptyProps(l)),SL(s,this.currentUrlTree,e,l,u)}},{key:"navigateByUrl",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{skipLocationChange:!1},n=BL(e)?e:this.parseUrl(e),i=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(i,"imperative",null,t)}},{key:"navigate",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{skipLocationChange:!1};return VT(e),this.navigateByUrl(this.createUrlTree(e,t),t)}},{key:"serializeUrl",value:function(e){return this.urlSerializer.serialize(e)}},{key:"parseUrl",value:function(e){var t;try{t=this.urlSerializer.parse(e)}catch(n){t=this.malformedUriErrorHandler(n,this.urlSerializer,e)}return t}},{key:"isActive",value:function(e,t){if(BL(e))return Rx(this.currentUrlTree,e,t);var n=this.parseUrl(e);return Rx(this.currentUrlTree,n,t)}},{key:"removeEmptyProps",value:function(e){return Object.keys(e).reduce(function(t,n){var i=e[n];return null!=i&&(t[n]=i),t},{})}},{key:"processNavigations",value:function(){var e=this;this.navigations.subscribe(function(t){e.navigated=!0,e.lastSuccessfulId=t.id,e.events.next(new cx(t.id,e.serializeUrl(t.extractedUrl),e.serializeUrl(e.currentUrlTree))),e.lastSuccessfulNavigation=e.currentNavigation,e.currentNavigation=null,t.resolve(!0)},function(t){e.console.warn("Unhandled Navigation Error: ")})}},{key:"scheduleNavigation",value:function(e,t,n,i,r){var a,o,s,u=this.getTransition(),l="imperative"!==t&&"imperative"===(null==u?void 0:u.source),c=(this.lastSuccessfulId===u.id||this.currentNavigation?u.rawUrl:u.urlAfterRedirects).toString()===e.toString();if(l&&c)return Promise.resolve(!0);r?(a=r.resolve,o=r.reject,s=r.promise):s=new Promise(function(e,t){a=e,o=t});var d=++this.navigationId;return this.setTransition({id:d,source:t,restoredState:n,currentUrlTree:this.currentUrlTree,currentRawUrl:this.rawUrlTree,rawUrl:e,extras:i,resolve:a,reject:o,promise:s,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),s.catch(function(e){return Promise.reject(e)})}},{key:"setBrowserUrl",value:function(e,t,n,i){var r=this.urlSerializer.serialize(e);i=i||{},this.location.isCurrentPathEqualTo(r)||t?this.location.replaceState(r,"",Object.assign(Object.assign({},i),{navigationId:n})):this.location.go(r,"",Object.assign(Object.assign({},i),{navigationId:n}))}},{key:"resetStateAndUrl",value:function(e,t,n){this.routerState=e,this.currentUrlTree=t,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,n),this.resetUrlToCurrentUrlTree()}},{key:"resetUrlToCurrentUrlTree",value:function(){this.location.replaceState(this.urlSerializer.serialize(this.rawUrlTree),"",{navigationId:this.lastSuccessfulId})}},{key:"url",get:function(){return this.serializeUrl(this.currentUrlTree)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(xi),Gi(Ux),Gi(FT),Gi(Hd),Gi(Go),Gi(dd),Gi(Fc),Gi(void 0))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}();function VT(e){for(var t=0;t2&&void 0!==arguments[2]?arguments[2]:{};v(this,e),this.router=t,this.viewportScroller=n,this.options=i,this.lastId=0,this.lastSource="imperative",this.restoredId=0,this.store={},i.scrollPositionRestoration=i.scrollPositionRestoration||"disabled",i.anchorScrolling=i.anchorScrolling||"disabled"}return g(e,[{key:"init",value:function(){"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}},{key:"createScrollEvents",value:function(){var e=this;return this.router.events.subscribe(function(t){t instanceof lx?(e.store[e.lastId]=e.viewportScroller.getScrollPosition(),e.lastSource=t.navigationTrigger,e.restoredId=t.restoredState?t.restoredState.navigationId:0):t instanceof cx&&(e.lastId=t.id,e.scheduleScrollEvent(t,e.router.parseUrl(t.urlAfterRedirects).fragment))})}},{key:"consumeScrollEvents",value:function(){var e=this;return this.router.events.subscribe(function(t){t instanceof Sx&&(t.position?"top"===e.options.scrollPositionRestoration?e.viewportScroller.scrollToPosition([0,0]):"enabled"===e.options.scrollPositionRestoration&&e.viewportScroller.scrollToPosition(t.position):t.anchor&&"enabled"===e.options.anchorScrolling?e.viewportScroller.scrollToAnchor(t.anchor):"disabled"!==e.options.scrollPositionRestoration&&e.viewportScroller.scrollToPosition([0,0]))})}},{key:"scheduleScrollEvent",value:function(e,t){this.router.triggerEvent(new Sx(e,"popstate"===this.lastSource?this.store[this.restoredId]:null,t))}},{key:"ngOnDestroy",value:function(){this.routerEventsSubscription&&this.routerEventsSubscription.unsubscribe(),this.scrollEventsSubscription&&this.scrollEventsSubscription.unsubscribe()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(WT),Gi(Ah),Gi(void 0))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}(),tD=new Si("ROUTER_CONFIGURATION"),nD=new Si("ROUTER_FORROOT_GUARD"),iD=[Hd,{provide:Ux,useClass:zx},{provide:WT,useFactory:function(e,t,n,i,r,a,o){var s=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},u=arguments.length>8?arguments[8]:void 0,l=arguments.length>9?arguments[9]:void 0,c=new WT(null,e,t,n,i,r,a,Px(o));if(u&&(c.urlHandlingStrategy=u),l&&(c.routeReuseStrategy=l),cD(s,c),s.enableTracing){var d=wd();c.events.subscribe(function(e){d.logGroup("Router Event: ".concat(e.constructor.name)),d.log(e.toString()),d.log(e),d.logGroupEnd()})}return c},deps:[Ux,FT,Hd,Go,dd,Fc,YT,tD,[function e(){v(this,e)},new Ri],[function e(){v(this,e)},new Ri]]},FT,{provide:fL,useFactory:function(e){return e.routerState.root},deps:[WT]},{provide:dd,useClass:pd},$T,XT,QT,{provide:tD,useValue:{enableTracing:!1}}];function rD(){return new nd("Router",WT)}var aD=function(){var e=function(){function e(t,n){v(this,e)}return g(e,null,[{key:"forRoot",value:function(t,n){return{ngModule:e,providers:[iD,lD(t),{provide:nD,useFactory:uD,deps:[[WT,new Ri,new Hi]]},{provide:tD,useValue:n||{}},{provide:Ad,useFactory:sD,deps:[Sd,[new Ii(Id),new Ri],tD]},{provide:eD,useFactory:oD,deps:[WT,Ah,tD]},{provide:ZT,useExisting:n&&n.preloadingStrategy?n.preloadingStrategy:XT},{provide:nd,multi:!0,useFactory:rD},[dD,{provide:yc,multi:!0,useFactory:hD,deps:[dD]},{provide:pD,useFactory:fD,deps:[dD]},{provide:xc,multi:!0,useExisting:pD}]]}}},{key:"forChild",value:function(t){return{ngModule:e,providers:[lD(t)]}}}]),e}();return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)(Gi(nD,8),Gi(WT,8))}}),e}();function oD(e,t,n){return n.scrollOffset&&t.setOffset(n.scrollOffset),new eD(e,t,n)}function sD(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.useHash?new Fd(e,t):new Rd(e,t)}function uD(e){return"guarded"}function lD(e){return[{provide:Ci,multi:!0,useValue:e},{provide:YT,multi:!0,useValue:e}]}function cD(e,t){e.errorHandler&&(t.errorHandler=e.errorHandler),e.malformedUriErrorHandler&&(t.malformedUriErrorHandler=e.malformedUriErrorHandler),e.onSameUrlNavigation&&(t.onSameUrlNavigation=e.onSameUrlNavigation),e.paramsInheritanceStrategy&&(t.paramsInheritanceStrategy=e.paramsInheritanceStrategy),e.relativeLinkResolution&&(t.relativeLinkResolution=e.relativeLinkResolution),e.urlUpdateStrategy&&(t.urlUpdateStrategy=e.urlUpdateStrategy)}var dD=function(){var e=function(){function e(t){v(this,e),this.injector=t,this.initNavigation=!1,this.resultOfPreactivationDone=new z}return g(e,[{key:"appInitializer",value:function(){var e=this;return this.injector.get(xd,Promise.resolve(null)).then(function(){var t=null,n=new Promise(function(e){return t=e}),i=e.injector.get(WT),r=e.injector.get(tD);return"disabled"===r.initialNavigation?(i.setUpLocationChangeListener(),t(!0)):"enabled"===r.initialNavigation||"enabledBlocking"===r.initialNavigation?(i.hooks.afterPreactivation=function(){return e.initNavigation?xf(null):(e.initNavigation=!0,t(!0),e.resultOfPreactivationDone)},i.initialNavigation()):t(!0),n})}},{key:"bootstrapListener",value:function(e){var t=this.injector.get(tD),n=this.injector.get($T),i=this.injector.get(eD),r=this.injector.get(WT),a=this.injector.get(ld);e===a.components[0]&&("enabledNonBlocking"!==t.initialNavigation&&void 0!==t.initialNavigation||r.initialNavigation(),n.setUpPreloading(),i.init(),r.resetRootComponentType(a.componentTypes[0]),this.resultOfPreactivationDone.next(null),this.resultOfPreactivationDone.complete())}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Go))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac}),e}();function hD(e){return e.appInitializer.bind(e)}function fD(e){return e.bootstrapListener.bind(e)}var pD=new Si("Router Initializer"),mD=["msgBar"],gD=function(){function e(e,t,n,i,r,a,o,s,u){this.appService=e,this.languageService=t,this.dialog=n,this.msgBarService=i,a.requestPinComponent=MC,o.requestWordComponent=zC,r.signTransactionConfirmationComponent=CC,u.initialize(),s.errorDuringinitialLoad.subscribe(function(e){e&&Np(2)})}return e.prototype.ngOnInit=function(){var e=this;this.appService.UpdateData(),this.languageService.initialize();var t=this.languageService.savedSelectedLanguageLoaded.subscribe(function(n){n||GC.openDialog(e.dialog,!0),t.unsubscribe()});setTimeout(function(){e.msgBarService.msgBarComponent=e.msgBar})},e.\u0275fac=function(t){return new(t||e)(ms(qp),ms(DC),ms(Aw),ms(HC),ms(Bw),ms(Fw),ms(Hw),ms(ix),ms(SC))},e.\u0275cmp=lt({type:e,selectors:[["app-root"]],viewQuery:function(e,t){var n;1&e&&cc(mD,!0),2&e&&uc(n=fc())&&(t.msgBar=n.first)},decls:19,vars:3,consts:[[1,"size-alert","d-md-none"],["src","assets/img/size-alert.png"],[1,"background-fixer"],["msgBar",""]],template:function(e,t){1&e&&(_s(0,"div",0),ou(1,"\n "),_s(2,"div"),ou(3,"\n "),bs(4,"img",1),ou(5,"\n "),_s(6,"div"),ou(7),Vl(8,"translate"),ys(),ou(9,"\n "),ys(),ou(10,"\n"),ys(),ou(11,"\n"),ou(12,"\n"),bs(13,"div",2),ou(14,"\n"),bs(15,"router-outlet"),ou(16,"\n"),bs(17,"app-msg-bar",null,3)),2&e&&(Pa(7),su(Ul(8,1,"errors.window-size")))},directives:[KT,FC],pipes:[oS],styles:[".size-alert[_ngcontent-%COMP%]{background-color:rgba(0,0,0,.85);position:fixed;top:0;left:0;width:100%;height:100%;z-index:10000;display:inline-flex;align-items:center;justify-content:center;text-align:center;color:#fff}.size-alert[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{margin:0 40px;max-width:400px}"]}),e}(),vD=["input"],_D=function(){return{enterDuration:150}},yD=["*"],bD=new Si("mat-checkbox-default-options",{providedIn:"root",factory:wD});function wD(){return{color:"accent",clickAction:"check-indeterminate"}}var kD=0,MD=wD(),SD={provide:Gw,useExisting:Te(function(){return LD}),multi:!0},CD=function e(){v(this,e)},xD=Nb(Hb(jb(Fb(function e(t){v(this,e),this._elementRef=t})))),LD=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r,a,o,s,u){var l;return v(this,n),(l=t.call(this,e))._changeDetectorRef=i,l._focusMonitor=r,l._ngZone=a,l._animationMode=s,l._options=u,l.ariaLabel="",l.ariaLabelledby=null,l._uniqueId="mat-checkbox-".concat(++kD),l.id=l._uniqueId,l.labelPosition="after",l.name=null,l.change=new Zl,l.indeterminateChange=new Zl,l._onTouched=function(){},l._currentAnimationClass="",l._currentCheckState=0,l._controlValueAccessorChangeFn=function(){},l._checked=!1,l._disabled=!1,l._indeterminate=!1,l._options=l._options||MD,l.color=l.defaultColor=l._options.color||MD.color,l.tabIndex=parseInt(o)||0,l}return g(n,[{key:"ngAfterViewInit",value:function(){var e=this;this._focusMonitor.monitor(this._elementRef,!0).subscribe(function(t){t||Promise.resolve().then(function(){e._onTouched(),e._changeDetectorRef.markForCheck()})}),this._syncIndeterminate(this._indeterminate)}},{key:"ngAfterViewChecked",value:function(){}},{key:"ngOnDestroy",value:function(){this._focusMonitor.stopMonitoring(this._elementRef)}},{key:"_isRippleDisabled",value:function(){return this.disableRipple||this.disabled}},{key:"_onLabelTextChange",value:function(){this._changeDetectorRef.detectChanges()}},{key:"writeValue",value:function(e){this.checked=!!e}},{key:"registerOnChange",value:function(e){this._controlValueAccessorChangeFn=e}},{key:"registerOnTouched",value:function(e){this._onTouched=e}},{key:"setDisabledState",value:function(e){this.disabled=e}},{key:"_getAriaChecked",value:function(){return this.checked?"true":this.indeterminate?"mixed":"false"}},{key:"_transitionCheckState",value:function(e){var t=this._currentCheckState,n=this._elementRef.nativeElement;if(t!==e&&(this._currentAnimationClass.length>0&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(t,e),this._currentCheckState=e,this._currentAnimationClass.length>0)){n.classList.add(this._currentAnimationClass);var i=this._currentAnimationClass;this._ngZone.runOutsideAngular(function(){setTimeout(function(){n.classList.remove(i)},1e3)})}}},{key:"_emitChangeEvent",value:function(){var e=new CD;e.source=this,e.checked=this.checked,this._controlValueAccessorChangeFn(this.checked),this.change.emit(e)}},{key:"toggle",value:function(){this.checked=!this.checked}},{key:"_onInputClick",value:function(e){var t,n=this,i=null===(t=this._options)||void 0===t?void 0:t.clickAction;e.stopPropagation(),this.disabled||"noop"===i?this.disabled||"noop"!==i||(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate):(this.indeterminate&&"check"!==i&&Promise.resolve().then(function(){n._indeterminate=!1,n.indeterminateChange.emit(n._indeterminate)}),this.toggle(),this._transitionCheckState(this._checked?1:2),this._emitChangeEvent())}},{key:"focus",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"keyboard",t=arguments.length>1?arguments[1]:void 0;this._focusMonitor.focusVia(this._inputElement,e,t)}},{key:"_onInteractionEvent",value:function(e){e.stopPropagation()}},{key:"_getAnimationClassForCheckStateTransition",value:function(e,t){if("NoopAnimations"===this._animationMode)return"";var n="";switch(e){case 0:if(1===t)n="unchecked-checked";else{if(3!=t)return"";n="unchecked-indeterminate"}break;case 2:n=1===t?"unchecked-checked":"unchecked-indeterminate";break;case 1:n=2===t?"checked-unchecked":"checked-indeterminate";break;case 3:n=1===t?"indeterminate-checked":"indeterminate-unchecked"}return"mat-checkbox-anim-".concat(n)}},{key:"_syncIndeterminate",value:function(e){var t=this._inputElement;t&&(t.nativeElement.indeterminate=e)}},{key:"inputId",get:function(){return"".concat(this.id||this._uniqueId,"-input")}},{key:"required",get:function(){return this._required},set:function(e){this._required=Xp(e)}},{key:"checked",get:function(){return this._checked},set:function(e){e!=this.checked&&(this._checked=e,this._changeDetectorRef.markForCheck())}},{key:"disabled",get:function(){return this._disabled},set:function(e){var t=Xp(e);t!==this.disabled&&(this._disabled=t,this._changeDetectorRef.markForCheck())}},{key:"indeterminate",get:function(){return this._indeterminate},set:function(e){var t=e!=this._indeterminate;this._indeterminate=Xp(e),t&&(this._transitionCheckState(this._indeterminate?3:this.checked?1:2),this.indeterminateChange.emit(this._indeterminate)),this._syncIndeterminate(this._indeterminate)}}]),n}(xD);return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(ul),ms(xv),ms(Nc),wi("tabindex"),ms(xb,8),ms(bD,8))},e.\u0275cmp=lt({type:e,selectors:[["mat-checkbox"]],viewQuery:function(e,t){var n;1&e&&(cc(vD,!0),cc($b,!0)),2&e&&(uc(n=fc())&&(t._inputElement=n.first),uc(n=fc())&&(t.ripple=n.first))},hostAttrs:[1,"mat-checkbox"],hostVars:12,hostBindings:function(e,t){2&e&&(fu("id",t.id),cs("tabindex",null),Ks("mat-checkbox-indeterminate",t.indeterminate)("mat-checkbox-checked",t.checked)("mat-checkbox-disabled",t.disabled)("mat-checkbox-label-before","before"==t.labelPosition)("_mat-animation-noopable","NoopAnimations"===t._animationMode))},inputs:{disableRipple:"disableRipple",color:"color",tabIndex:"tabIndex",ariaLabel:["aria-label","ariaLabel"],ariaLabelledby:["aria-labelledby","ariaLabelledby"],id:"id",labelPosition:"labelPosition",name:"name",required:"required",checked:"checked",disabled:"disabled",indeterminate:"indeterminate",ariaDescribedby:["aria-describedby","ariaDescribedby"],value:"value"},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],features:[Eu([SD]),Jo],ngContentSelectors:yD,decls:38,vars:20,consts:[[1,"mat-checkbox-layout"],["label",""],[1,"mat-checkbox-inner-container"],["type","checkbox",1,"mat-checkbox-input","cdk-visually-hidden",3,"id","required","checked","disabled","tabIndex","change","click"],["input",""],["matRipple","",1,"mat-checkbox-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleRadius","matRippleCentered","matRippleAnimation"],[1,"mat-ripple-element","mat-checkbox-persistent-ripple"],[1,"mat-checkbox-frame"],[1,"mat-checkbox-background"],["version","1.1","focusable","false","viewBox","0 0 24 24",0,"xml","space","preserve",1,"mat-checkbox-checkmark"],["fill","none","stroke","white","d","M4.1,12.7 9,17.6 20.3,6.3",1,"mat-checkbox-checkmark-path"],[1,"mat-checkbox-mixedmark"],[1,"mat-checkbox-label",3,"cdkObserveContent"],["checkboxLabel",""],[2,"display","none"]],template:function(e,t){if(1&e&&(Is(),_s(0,"label",0,1),ou(2,"\n "),_s(3,"span",2),ou(4,"\n "),_s(5,"input",3,4),Ls("change",function(e){return t._onInteractionEvent(e)})("click",function(e){return t._onInputClick(e)}),ys(),ou(7,"\n "),_s(8,"span",5),ou(9,"\n "),bs(10,"span",6),ou(11,"\n "),ys(),ou(12,"\n "),bs(13,"span",7),ou(14,"\n "),_s(15,"span",8),ou(16,"\n "),In(),_s(17,"svg",9),ou(18,"\n "),bs(19,"path",10),ou(20,"\n "),ys(),ou(21,"\n "),ou(22,"\n "),Rn(),bs(23,"span",11),ou(24,"\n "),ys(),ou(25,"\n "),ys(),ou(26,"\n "),_s(27,"span",12,13),Ls("cdkObserveContent",function(){return t._onLabelTextChange()}),ou(29,"\n "),ou(30,"\n "),_s(31,"span",14),ou(32,"\xa0"),ys(),ou(33,"\n "),Rs(34),ou(35,"\n "),ys(),ou(36,"\n"),ys(),ou(37,"\n")),2&e){var n=ps(1),i=ps(28);cs("for",t.inputId),Pa(3),Ks("mat-checkbox-inner-container-no-side-margin",!i.textContent||!i.textContent.trim()),Pa(2),gs("id",t.inputId)("required",t.required)("checked",t.checked)("disabled",t.disabled)("tabIndex",t.tabIndex),cs("value",t.value)("name",t.name)("aria-label",t.ariaLabel||null)("aria-labelledby",t.ariaLabelledby)("aria-checked",t._getAriaChecked())("aria-describedby",t.ariaDescribedby),Pa(3),gs("matRippleTrigger",n)("matRippleDisabled",t._isRippleDisabled())("matRippleRadius",20)("matRippleCentered",!0)("matRippleAnimation",Il(19,_D))}},directives:[$b,nv],styles:["@keyframes mat-checkbox-fade-in-background{0%{opacity:0}50%{opacity:1}}@keyframes mat-checkbox-fade-out-background{0%,50%{opacity:1}100%{opacity:0}}@keyframes mat-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:22.910259}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 0.1)}100%{stroke-dashoffset:0}}@keyframes mat-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mat-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);stroke-dashoffset:0}to{stroke-dashoffset:-22.910259}}@keyframes mat-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 0.1);opacity:1;transform:rotate(0deg)}to{opacity:0;transform:rotate(45deg)}}@keyframes mat-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);opacity:0;transform:rotate(45deg)}to{opacity:1;transform:rotate(360deg)}}@keyframes mat-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 0.1);opacity:0;transform:rotate(-45deg)}to{opacity:1;transform:rotate(0deg)}}@keyframes mat-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);opacity:1;transform:rotate(0deg)}to{opacity:0;transform:rotate(315deg)}}@keyframes mat-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;opacity:1;transform:scaleX(1)}32.8%,100%{opacity:0;transform:scaleX(0)}}.mat-checkbox-background,.mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:2px;box-sizing:border-box;pointer-events:none}.mat-checkbox{display:inline-block;transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);cursor:pointer;-webkit-tap-highlight-color:transparent}._mat-animation-noopable.mat-checkbox{transition:none;animation:none}.mat-checkbox .mat-ripple-element:not(.mat-checkbox-persistent-ripple){opacity:.16}.mat-checkbox-layout{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:inherit;align-items:baseline;vertical-align:middle;display:inline-flex;white-space:nowrap}.mat-checkbox-label{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.mat-checkbox-inner-container{display:inline-block;height:16px;line-height:0;margin:auto;margin-right:8px;order:0;position:relative;vertical-align:middle;white-space:nowrap;width:16px;flex-shrink:0}[dir=rtl] .mat-checkbox-inner-container{margin-left:8px;margin-right:auto}.mat-checkbox-inner-container-no-side-margin{margin-left:0;margin-right:0}.mat-checkbox-frame{background-color:transparent;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1);border-width:2px;border-style:solid}._mat-animation-noopable .mat-checkbox-frame{transition:none}.cdk-high-contrast-active .mat-checkbox.cdk-keyboard-focused .mat-checkbox-frame{border-style:dotted}.mat-checkbox-background{align-items:center;display:inline-flex;justify-content:center;transition:background-color 90ms cubic-bezier(0, 0, 0.2, 0.1),opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}._mat-animation-noopable .mat-checkbox-background{transition:none}.cdk-high-contrast-active .mat-checkbox .mat-checkbox-background{background:none}.mat-checkbox-persistent-ripple{display:block;width:100%;height:100%;transform:none}.mat-checkbox-inner-container:hover .mat-checkbox-persistent-ripple{opacity:.04}.mat-checkbox.cdk-keyboard-focused .mat-checkbox-persistent-ripple{opacity:.12}.mat-checkbox-persistent-ripple,.mat-checkbox.mat-checkbox-disabled .mat-checkbox-inner-container:hover .mat-checkbox-persistent-ripple{opacity:0}@media(hover: none){.mat-checkbox-inner-container:hover .mat-checkbox-persistent-ripple{display:none}}.mat-checkbox-checkmark{top:0;left:0;right:0;bottom:0;position:absolute;width:100%}.mat-checkbox-checkmark-path{stroke-dashoffset:22.910259;stroke-dasharray:22.910259;stroke-width:2.1333333333px}.cdk-high-contrast-black-on-white .mat-checkbox-checkmark-path{stroke:#000 !important}.mat-checkbox-mixedmark{width:calc(100% - 6px);height:2px;opacity:0;transform:scaleX(0) rotate(0deg);border-radius:2px}.cdk-high-contrast-active .mat-checkbox-mixedmark{height:0;border-top:solid 2px;margin-top:2px}.mat-checkbox-label-before .mat-checkbox-inner-container{order:1;margin-left:8px;margin-right:auto}[dir=rtl] .mat-checkbox-label-before .mat-checkbox-inner-container{margin-left:auto;margin-right:8px}.mat-checkbox-checked .mat-checkbox-checkmark{opacity:1}.mat-checkbox-checked .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-checked .mat-checkbox-mixedmark{transform:scaleX(1) rotate(-45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark{opacity:0;transform:rotate(45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-indeterminate .mat-checkbox-mixedmark{opacity:1;transform:scaleX(1) rotate(0deg)}.mat-checkbox-unchecked .mat-checkbox-background{background-color:transparent}.mat-checkbox-disabled{cursor:default}.cdk-high-contrast-active .mat-checkbox-disabled{opacity:.5}.mat-checkbox-anim-unchecked-checked .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-checked .mat-checkbox-checkmark-path{animation:180ms linear 0ms mat-checkbox-unchecked-checked-checkmark-path}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0ms mat-checkbox-unchecked-indeterminate-mixedmark}.mat-checkbox-anim-checked-unchecked .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-out-background}.mat-checkbox-anim-checked-unchecked .mat-checkbox-checkmark-path{animation:90ms linear 0ms mat-checkbox-checked-unchecked-checkmark-path}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-checkmark{animation:90ms linear 0ms mat-checkbox-checked-indeterminate-checkmark}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0ms mat-checkbox-checked-indeterminate-mixedmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-checkmark{animation:500ms linear 0ms mat-checkbox-indeterminate-checked-checkmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-mixedmark{animation:500ms linear 0ms mat-checkbox-indeterminate-checked-mixedmark}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-out-background}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-mixedmark{animation:300ms linear 0ms mat-checkbox-indeterminate-unchecked-mixedmark}.mat-checkbox-input{bottom:0;left:50%}.mat-checkbox .mat-checkbox-ripple{position:absolute;left:calc(50% - 20px);top:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}\n"],encapsulation:2,changeDetection:0}),e}(),TD=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)}}),e}(),DD=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[ew,Rb,iv,TD],Rb,TD]}),e}();function OD(e,t){if(1&e){var n=Ss();_s(0,"span",6),Ls("click",function(){sn(n);var e=As();return e.data.linkFunction(),e.closeModal(!1)}),ou(1),Vl(2,"translate"),ys()}if(2&e){var i=As();Pa(1),su(Ul(2,1,i.data.linkText))}}function ED(e,t){if(1&e){var n=Ss();_s(0,"div",7),ou(1,"\n "),_s(2,"mat-checkbox",8),Ls("change",function(e){return sn(n),As().setAccept(e)}),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ys()}if(2&e){var i=As();Pa(2),gs("checked",i.accepted),Pa(1),uu("",Ul(4,2,i.data.checkboxText),"\n ")}}function PD(e,t){if(1&e){var n=Ss();_s(0,"app-button",9),Ls("action",function(){return sn(n),As().closeModal(!1)}),ou(1),Vl(2,"translate"),ys()}if(2&e){var i=As();Pa(1),uu("\n ",Ul(2,1,i.data.cancelButtonText),"\n ")}}var AD,YD=function(e){return e.YesNo="YesNo",e.ContinueCancel="ContinueCancel",e.Close="Close",e}({}),ID=function(){function e(e,t){this.dialogRef=e,this.data=t,this.accepted=!1,this.disableDismiss=!1,t.headerText||(t.headerText="confirmation.default-title"),t.defaultButtons&&(t.confirmButtonText=null,t.cancelButtonText=null,t.defaultButtons===YD.Close&&(t.confirmButtonText="common.close-button"),t.defaultButtons===YD.YesNo&&(t.confirmButtonText="confirmation.yes-button",t.cancelButtonText="confirmation.no-button"),t.defaultButtons===YD.ContinueCancel&&(t.confirmButtonText="common.continue-button",t.cancelButtonText="common.cancel-button")),this.disableDismiss=!!t.disableDismiss}return e.openDialog=function(t,n){var i=new bw;return i.data=n,i.autoFocus=!1,i.width="450px",t.open(e,i)},e.prototype.closeModal=function(e){this.dialogRef.close(e)},e.prototype.setAccept=function(e){this.accepted=!!e.checked},e.\u0275fac=function(t){return new(t||e)(ms(xw),ms(Tw))},e.\u0275cmp=lt({type:e,selectors:[["app-confirmation"]],decls:18,vars:16,consts:[[3,"useRedTitle","headline","dialog","disableDismiss"],["class","link",3,"click",4,"ngIf"],["class","-check-container",4,"ngIf"],[1,"-buttons"],[3,"action",4,"ngIf"],[1,"primary-button",3,"disabled","action"],[1,"link",3,"click"],[1,"-check-container"],["type","checkbox","id","terms",1,"-check","e2e-confirm-checkbox",3,"checked","change"],[3,"action"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2),Vl(3,"translate"),fs(4,OD,3,3,"span",1),ou(5,"\n\n "),fs(6,ED,6,4,"div",2),ou(7,"\n\n "),_s(8,"div",3),ou(9,"\n "),fs(10,PD,3,3,"app-button",4),ou(11,"\n "),_s(12,"app-button",5),Ls("action",function(){return t.closeModal(!0)}),ou(13),Vl(14,"translate"),ys(),ou(15,"\n "),ys(),ou(16,"\n"),ys(),ou(17,"\n")),2&e&&(gs("useRedTitle",t.data.redTitle)("headline",Ul(1,10,t.data.headerText))("dialog",t.dialogRef)("disableDismiss",t.disableDismiss),Pa(2),uu("\n ",Ul(3,12,t.data.text),"\n "),Pa(2),gs("ngIf",t.data.linkText&&t.data.linkFunction),Pa(2),gs("ngIf",t.data.checkboxText),Pa(4),gs("ngIf",t.data.cancelButtonText),Pa(2),gs("disabled",t.data.checkboxText&&!t.accepted),Pa(1),uu("\n ",Ul(14,14,t.data.confirmButtonText),"\n "))},directives:[AM,fh,gC,LD],pipes:[oS],styles:[""]}),e}(),RD=function(){function e(t){v(this,e),this.total=t}return g(e,[{key:"call",value:function(e,t){return t.subscribe(new FD(e,this.total))}}]),e}(),FD=function(e){_(n,e);var t=w(n);function n(e,i){var r;return v(this,n),(r=t.call(this,e)).total=i,r.count=0,r}return g(n,[{key:"_next",value:function(e){++this.count>this.total&&this.destination.next(e)}}]),n}(Y),HD=new Set,jD=function(){var e=function(){function e(t){v(this,e),this._platform=t,this._matchMedia=this._platform.isBrowser&&window.matchMedia?window.matchMedia.bind(window):ND}return g(e,[{key:"matchMedia",value:function(e){return this._platform.WEBKIT&&function(e){if(!HD.has(e))try{AD||((AD=document.createElement("style")).setAttribute("type","text/css"),document.head.appendChild(AD)),AD.sheet&&(AD.sheet.insertRule("@media ".concat(e," {.fx-query-test{ }}"),0),HD.add(e))}catch(t){console.error(t)}}(e),this._matchMedia(e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(Nm))},e.\u0275prov=Ee({factory:function(){return new e(Gi(Nm))},token:e,providedIn:"root"}),e}();function ND(e){return{matches:"all"===e||""===e,media:e,addListener:function(){},removeListener:function(){}}}var BD=function(){var e=function(){function e(t,n){v(this,e),this._mediaMatcher=t,this._zone=n,this._queries=new Map,this._destroySubject=new z}return g(e,[{key:"ngOnDestroy",value:function(){this._destroySubject.next(),this._destroySubject.complete()}},{key:"isMatched",value:function(e){var t=this;return WD(tm(e)).some(function(e){return t._registerQuery(e).mql.matches})}},{key:"observe",value:function(e){var t=this,n=ax(WD(tm(e)).map(function(e){return t._registerQuery(e).observable}));return(n=Cm(n.pipe(Uf(1)),n.pipe(function(e){return e.lift(new RD(1))},Zg(0)))).pipe(ie(function(e){var t={matches:!1,breakpoints:{}};return e.forEach(function(e){var n=e.matches,i=e.query;t.matches=t.matches||n,t.breakpoints[i]=n}),t}))}},{key:"_registerQuery",value:function(e){var t=this;if(this._queries.has(e))return this._queries.get(e);var n=this._mediaMatcher.matchMedia(e),i={observable:new N(function(e){var i=function(n){return t._zone.run(function(){return e.next(n)})};return n.addListener(i),function(){n.removeListener(i)}}).pipe(xm(n),ie(function(t){return{query:e,matches:t.matches}}),wm(this._destroySubject)),mql:n};return this._queries.set(e,i),i}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Gi(jD),Gi(Nc))},e.\u0275prov=Ee({factory:function(){return new e(Gi(jD),Gi(Nc))},token:e,providedIn:"root"}),e}();function WD(e){return e.map(function(e){return e.split(",")}).reduce(function(e,t){return e.concat(t)}).map(function(e){return e.trim()})}var VD={tooltipState:Fv("state",[Bv("initial, void, hidden",Nv({opacity:0,transform:"scale(0)"})),Bv("visible",Nv({transform:"scale(1)"})),Vv("* => visible",Hv("200ms cubic-bezier(0, 0, 0.2, 1)",Wv([Nv({opacity:0,transform:"scale(0)",offset:0}),Nv({opacity:.5,transform:"scale(0.99)",offset:.5}),Nv({opacity:1,transform:"scale(1)",offset:1})]))),Vv("* => hidden",Hv("100ms cubic-bezier(0, 0, 0.2, 1)",Nv({opacity:0})))])},UD=Um({passive:!0}),zD=new Si("mat-tooltip-scroll-strategy"),qD={provide:zD,deps:[Ng],useFactory:function(e){return function(){return e.scrollStrategies.reposition({scrollThrottle:20})}}},GD=new Si("mat-tooltip-default-options",{providedIn:"root",factory:function(){return{showDelay:0,hideDelay:0,touchendHideDelay:1500}}}),KD=function(){var e=function(){function e(t,n,i,r,a,o,s,u,l,c,d){var h=this;v(this,e),this._overlay=t,this._elementRef=n,this._scrollDispatcher=i,this._viewContainerRef=r,this._ngZone=a,this._platform=o,this._ariaDescriber=s,this._focusMonitor=u,this._dir=c,this._defaultOptions=d,this._position="below",this._disabled=!1,this._viewInitialized=!1,this._pointerExitEventsInitialized=!1,this.showDelay=this._defaultOptions.showDelay,this.hideDelay=this._defaultOptions.hideDelay,this.touchGestures="auto",this._message="",this._passiveListeners=[],this._destroyed=new z,this._handleKeydown=function(e){h._isTooltipVisible()&&e.keyCode===cg&&!fg(e)&&(e.preventDefault(),e.stopPropagation(),h._ngZone.run(function(){return h.hide(0)}))},this._scrollStrategy=l,d&&(d.position&&(this.position=d.position),d.touchGestures&&(this.touchGestures=d.touchGestures)),a.runOutsideAngular(function(){n.nativeElement.addEventListener("keydown",h._handleKeydown)})}return g(e,[{key:"ngAfterViewInit",value:function(){var e=this;this._viewInitialized=!0,this._setupPointerEnterEventsIfNeeded(),this._focusMonitor.monitor(this._elementRef).pipe(wm(this._destroyed)).subscribe(function(t){t?"keyboard"===t&&e._ngZone.run(function(){return e.show()}):e._ngZone.run(function(){return e.hide(0)})})}},{key:"ngOnDestroy",value:function(){var e=this._elementRef.nativeElement;clearTimeout(this._touchstartTimeout),this._overlayRef&&(this._overlayRef.dispose(),this._tooltipInstance=null),e.removeEventListener("keydown",this._handleKeydown),this._passiveListeners.forEach(function(t){var n=u(t,2);e.removeEventListener(n[0],n[1],UD)}),this._passiveListeners.length=0,this._destroyed.next(),this._destroyed.complete(),this._ariaDescriber.removeDescription(e,this.message),this._focusMonitor.stopMonitoring(e)}},{key:"show",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.showDelay;if(!this.disabled&&this.message&&(!this._isTooltipVisible()||this._tooltipInstance._showTimeoutId||this._tooltipInstance._hideTimeoutId)){var n=this._createOverlay();this._detach(),this._portal=this._portal||new tg(JD,this._viewContainerRef),this._tooltipInstance=n.attach(this._portal).instance,this._tooltipInstance.afterHidden().pipe(wm(this._destroyed)).subscribe(function(){return e._detach()}),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),this._tooltipInstance.show(t)}}},{key:"hide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.hideDelay;this._tooltipInstance&&this._tooltipInstance.hide(e)}},{key:"toggle",value:function(){this._isTooltipVisible()?this.hide():this.show()}},{key:"_isTooltipVisible",value:function(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()}},{key:"_createOverlay",value:function(){var e=this;if(this._overlayRef)return this._overlayRef;var t=this._scrollDispatcher.getAncestorScrollContainers(this._elementRef),n=this._overlay.position().flexibleConnectedTo(this._elementRef).withTransformOriginOn(".mat-tooltip").withFlexibleDimensions(!1).withViewportMargin(8).withScrollableContainers(t);return n.positionChanges.pipe(wm(this._destroyed)).subscribe(function(t){e._tooltipInstance&&t.scrollableViewProperties.isOverlayClipped&&e._tooltipInstance.isVisible()&&e._ngZone.run(function(){return e.hide(0)})}),this._overlayRef=this._overlay.create({direction:this._dir,positionStrategy:n,panelClass:"mat-tooltip-panel",scrollStrategy:this._scrollStrategy()}),this._updatePosition(),this._overlayRef.detachments().pipe(wm(this._destroyed)).subscribe(function(){return e._detach()}),this._overlayRef}},{key:"_detach",value:function(){this._overlayRef&&this._overlayRef.hasAttached()&&this._overlayRef.detach(),this._tooltipInstance=null}},{key:"_updatePosition",value:function(){var e=this._overlayRef.getConfig().positionStrategy,t=this._getOrigin(),n=this._getOverlayPosition();e.withPositions([Object.assign(Object.assign({},t.main),n.main),Object.assign(Object.assign({},t.fallback),n.fallback)])}},{key:"_getOrigin",value:function(){var e,t=!this._dir||"ltr"==this._dir.value,n=this.position;"above"==n||"below"==n?e={originX:"center",originY:"above"==n?"top":"bottom"}:"before"==n||"left"==n&&t||"right"==n&&!t?e={originX:"start",originY:"center"}:("after"==n||"right"==n&&t||"left"==n&&!t)&&(e={originX:"end",originY:"center"});var i=this._invertPosition(e.originX,e.originY);return{main:e,fallback:{originX:i.x,originY:i.y}}}},{key:"_getOverlayPosition",value:function(){var e,t=!this._dir||"ltr"==this._dir.value,n=this.position;"above"==n?e={overlayX:"center",overlayY:"bottom"}:"below"==n?e={overlayX:"center",overlayY:"top"}:"before"==n||"left"==n&&t||"right"==n&&!t?e={overlayX:"end",overlayY:"center"}:("after"==n||"right"==n&&t||"left"==n&&!t)&&(e={overlayX:"start",overlayY:"center"});var i=this._invertPosition(e.overlayX,e.overlayY);return{main:e,fallback:{overlayX:i.x,overlayY:i.y}}}},{key:"_updateTooltipMessage",value:function(){var e=this;this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),this._ngZone.onMicrotaskEmpty.pipe(Uf(1),wm(this._destroyed)).subscribe(function(){e._tooltipInstance&&e._overlayRef.updatePosition()}))}},{key:"_setTooltipClass",value:function(e){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=e,this._tooltipInstance._markForCheck())}},{key:"_invertPosition",value:function(e,t){return"above"===this.position||"below"===this.position?"top"===t?t="bottom":"bottom"===t&&(t="top"):"end"===e?e="start":"start"===e&&(e="end"),{x:e,y:t}}},{key:"_setupPointerEnterEventsIfNeeded",value:function(){var e=this;!this._disabled&&this.message&&this._viewInitialized&&!this._passiveListeners.length&&(this._platformSupportsMouseEvents()?this._passiveListeners.push(["mouseenter",function(){e._setupPointerExitEventsIfNeeded(),e.show()}]):"off"!==this.touchGestures&&(this._disableNativeGesturesIfNecessary(),this._passiveListeners.push(["touchstart",function(){e._setupPointerExitEventsIfNeeded(),clearTimeout(e._touchstartTimeout),e._touchstartTimeout=setTimeout(function(){return e.show()},500)}])),this._addListeners(this._passiveListeners))}},{key:"_setupPointerExitEventsIfNeeded",value:function(){var e,t=this;if(!this._pointerExitEventsInitialized){this._pointerExitEventsInitialized=!0;var n=[];if(this._platformSupportsMouseEvents())n.push(["mouseleave",function(){return t.hide()}]);else if("off"!==this.touchGestures){this._disableNativeGesturesIfNecessary();var i=function(){clearTimeout(t._touchstartTimeout),t.hide(t._defaultOptions.touchendHideDelay)};n.push(["touchend",i],["touchcancel",i])}this._addListeners(n),(e=this._passiveListeners).push.apply(e,n)}}},{key:"_addListeners",value:function(e){var t=this;e.forEach(function(e){var n=u(e,2);t._elementRef.nativeElement.addEventListener(n[0],n[1],UD)})}},{key:"_platformSupportsMouseEvents",value:function(){return!this._platform.IOS&&!this._platform.ANDROID}},{key:"_disableNativeGesturesIfNecessary",value:function(){var e=this.touchGestures;if("off"!==e){var t=this._elementRef.nativeElement,n=t.style;("on"===e||"INPUT"!==t.nodeName&&"TEXTAREA"!==t.nodeName)&&(n.userSelect=n.msUserSelect=n.webkitUserSelect=n.MozUserSelect="none"),"on"!==e&&t.draggable||(n.webkitUserDrag="none"),n.touchAction="none",n.webkitTapHighlightColor="transparent"}}},{key:"position",get:function(){return this._position},set:function(e){e!==this._position&&(this._position=e,this._overlayRef&&(this._updatePosition(),this._tooltipInstance&&this._tooltipInstance.show(0),this._overlayRef.updatePosition()))}},{key:"disabled",get:function(){return this._disabled},set:function(e){this._disabled=Xp(e),this._disabled?this.hide(0):this._setupPointerEnterEventsIfNeeded()}},{key:"message",get:function(){return this._message},set:function(e){var t=this;this._ariaDescriber.removeDescription(this._elementRef.nativeElement,this._message),this._message=null!=e?String(e).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._setupPointerEnterEventsIfNeeded(),this._updateTooltipMessage(),this._ngZone.runOutsideAngular(function(){Promise.resolve().then(function(){t._ariaDescriber.describe(t._elementRef.nativeElement,t.message)})}))}},{key:"tooltipClass",get:function(){return this._tooltipClass},set:function(e){this._tooltipClass=e,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(Ng),ms(ju),ms(Zm),ms(wl),ms(Nc),ms(Nm),ms(dv),ms(xv),ms(zD),ms(Gm,8),ms(GD,8))},e.\u0275dir=gt({type:e,selectors:[["","matTooltip",""]],hostAttrs:[1,"mat-tooltip-trigger"],inputs:{showDelay:["matTooltipShowDelay","showDelay"],hideDelay:["matTooltipHideDelay","hideDelay"],touchGestures:["matTooltipTouchGestures","touchGestures"],position:["matTooltipPosition","position"],disabled:["matTooltipDisabled","disabled"],message:["matTooltip","message"],tooltipClass:["matTooltipClass","tooltipClass"]},exportAs:["matTooltip"]}),e}(),JD=function(){var e=function(){function e(t,n){v(this,e),this._changeDetectorRef=t,this._breakpointObserver=n,this._visibility="initial",this._closeOnInteraction=!1,this._onHide=new z,this._isHandset=this._breakpointObserver.observe("(max-width: 599.98px) and (orientation: portrait), (max-width: 959.98px) and (orientation: landscape)")}return g(e,[{key:"show",value:function(e){var t=this;this._hideTimeoutId&&(clearTimeout(this._hideTimeoutId),this._hideTimeoutId=null),this._closeOnInteraction=!0,this._showTimeoutId=setTimeout(function(){t._visibility="visible",t._showTimeoutId=null,t._markForCheck()},e)}},{key:"hide",value:function(e){var t=this;this._showTimeoutId&&(clearTimeout(this._showTimeoutId),this._showTimeoutId=null),this._hideTimeoutId=setTimeout(function(){t._visibility="hidden",t._hideTimeoutId=null,t._markForCheck()},e)}},{key:"afterHidden",value:function(){return this._onHide}},{key:"isVisible",value:function(){return"visible"===this._visibility}},{key:"ngOnDestroy",value:function(){this._onHide.complete()}},{key:"_animationStart",value:function(){this._closeOnInteraction=!1}},{key:"_animationDone",value:function(e){var t=e.toState;"hidden"!==t||this.isVisible()||this._onHide.next(),"visible"!==t&&"hidden"!==t||(this._closeOnInteraction=!0)}},{key:"_handleBodyInteraction",value:function(){this._closeOnInteraction&&this.hide(0)}},{key:"_markForCheck",value:function(){this._changeDetectorRef.markForCheck()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(ul),ms(BD))},e.\u0275cmp=lt({type:e,selectors:[["mat-tooltip-component"]],hostAttrs:["aria-hidden","true"],hostVars:2,hostBindings:function(e,t){1&e&&Ls("click",function(){return t._handleBodyInteraction()},!1,Wr),2&e&&Gs("zoom","visible"===t._visibility?1:null)},decls:4,vars:7,consts:[[1,"mat-tooltip",3,"ngClass"]],template:function(e,t){var n;1&e&&(_s(0,"div",0),Ls("@state.start",function(){return t._animationStart()})("@state.done",function(e){return t._animationDone(e)}),Vl(1,"async"),ou(2),ys(),ou(3,"\n")),2&e&&(Ks("mat-tooltip-handset",null==(n=Ul(1,5,t._isHandset))?null:n.matches),gs("ngClass",t.tooltipClass)("@state",t._visibility),Pa(2),su(t.message))},directives:[lh],pipes:[xh],styles:[".mat-tooltip-panel{pointer-events:none !important}.mat-tooltip{color:#fff;border-radius:4px;margin:14px;max-width:250px;padding-left:8px;padding-right:8px;overflow:hidden;text-overflow:ellipsis}.cdk-high-contrast-active .mat-tooltip{outline:solid 1px}.mat-tooltip-handset{margin:24px;padding-left:16px;padding-right:16px}\n"],encapsulation:2,data:{animation:[VD.tooltipState]},changeDetection:0}),e}(),ZD=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[qD],imports:[[Pv,Ph,qg,Rb],Rb,Xm]}),e}(),QD=function(e){function t(t,n,i,r,a,o,s,u,l,c,d,h,f){var p=e.call(this,r,i,a,o,s,u,l,c,d,h,f)||this;return p.translate=t,p.renderer=n,p.elementRef=i,p.tooltipClass="error-tooltip",p}return Vw(t,e),Object.defineProperty(t.prototype,"appFormFieldError",{set:function(e){this.message=e?this.translate.instant(e):null,this.updateField()},enumerable:!1,configurable:!0}),t.prototype.updateField=function(){this.message?(this.renderer.addClass(this.elementRef.nativeElement,"red-field"),document.activeElement===this.elementRef.nativeElement&&this.show()):this.renderer.removeClass(this.elementRef.nativeElement,"red-field")},t.\u0275fac=function(e){return new(e||t)(ms(aS),ms(Bu),ms(ju),ms(Ng),ms(Zm),ms(wl),ms(Nc),ms(Nm),ms(dv),ms(xv),ms(zD),ms(Gm,8),ms(GD,8))},t.\u0275dir=gt({type:t,selectors:[["","appFormFieldError",""]],inputs:{appFormFieldError:"appFormFieldError"},features:[Jo]}),t}(KD),XD=function(){function e(e){this.el=e,e.nativeElement.autocomplete="new-password",e.nativeElement.readOnly=!0}return e.prototype.onFocus=function(){this.el.nativeElement.readOnly=!1},e.\u0275fac=function(t){return new(t||e)(ms(ju))},e.\u0275dir=gt({type:e,selectors:[["","appDontSavePassword",""]],hostBindings:function(e,t){1&e&&Ls("focus",function(){return t.onFocus()})}}),e}();function $D(e,t){if(1&e&&(_s(0,"div",1),ou(1,"\n "),_s(2,"label",10),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),_s(6,"div",11),ou(7,"\n "),_s(8,"select",12),ou(9,"\n "),_s(10,"option",13),ou(11),Vl(12,"translate"),ys(),ou(13,"\n "),_s(14,"option",13),ou(15),Vl(16,"translate"),ys(),ou(17,"\n "),ys(),ou(18,"\n "),ys(),ou(19,"\n "),ys()),2&e){var n=As();Pa(3),su(Ul(4,6,"wallet.new.words-number-label")),Pa(5),cs("disabled",n.busy?"true":null),Pa(2),gs("ngValue",12),Pa(1),su(Ul(12,8,"wallet.new.12-words")),Pa(3),gs("ngValue",24),Pa(1),su(Ul(16,10,"wallet.new.24-words"))}}var eO=function(e,t){return{"-white-text":e,"element-disabled":t}};function tO(e,t){if(1&e){var n=Ss();_s(0,"span",14),ou(1,"\n "),_s(2,"span",15),Ls("click",function(){return sn(n),As().generateSeed(128)}),Vl(3,"translate"),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),_s(7,"span",16),ou(8,"|"),ys(),ou(9,"\n "),_s(10,"span",15),Ls("click",function(){return sn(n),As().generateSeed(256)}),Vl(11,"translate"),ou(12),Vl(13,"translate"),ys(),ou(14,"\n "),ys()}if(2&e){var i=As();gs("ngClass",Fl(13,eO,i.onboarding,i.busy)),Pa(2),gs("matTooltip",Ul(3,5,"wallet.new.generate-12-help")),Pa(2),uu("\n ",Ul(5,7,"wallet.new.12-words"),"\n "),Pa(6),gs("matTooltip",Ul(11,9,"wallet.new.generate-24-help")),Pa(2),uu("\n ",Ul(13,11,"wallet.new.24-words"),"\n ")}}var nO=function(e){return{"white-mat-spinner":e}};function iO(e,t){if(1&e&&(_s(0,"div",25),bs(1,"mat-spinner"),ys()),2&e){var n=As(2);gs("ngClass",Rl(1,nO,n.onboarding))}}function rO(e,t){if(1&e&&(_s(0,"span",26),ou(1),ys()),2&e){var n=As(2);Pa(1),su(n.lastAssistedSeed)}}var aO=function(e){return{"transparent-text":e}};function oO(e,t){if(1&e&&(_s(0,"div",27),ou(1),Vl(2,"translate"),ys()),2&e){var n=As(2);gs("ngClass",Rl(4,aO,n.onboarding)),Pa(1),su(Ul(2,2,"wallet.new.seed.change-seed"))}}function sO(e,t){if(1&e&&(_s(0,"div",28),ou(1,"\n "),_s(2,"mat-icon",29),ou(3,"touch_app"),ys(),_s(4,"span",27),ou(5),Vl(6,"translate"),ys(),ou(7,"\n "),ys()),2&e){var n=As(2);Pa(4),gs("ngClass",Rl(4,aO,n.onboarding)),Pa(1),su(Ul(6,2,"wallet.new.seed.enter-seed"))}}var uO=function(e,t,n){return{"onboarding-version":e,"show-pointer":t,"element-disabled":n}},lO=function(e){return{"element-disabled":e}},cO=function(e){return{"-white-text":e}};function dO(e,t){if(1&e){var n=Ss();ws(0),ou(1,"\n "),_s(2,"div",17),Ls("click",function(){return sn(n),As().enterSeed()}),ou(3,"\n "),fs(4,iO,2,3,"div",18),ou(5,"\n "),fs(6,rO,2,1,"span",19),ou(7,"\n "),fs(8,oO,3,6,"div",20),ou(9,"\n "),fs(10,sO,8,6,"div",21),ou(11,"\n "),ys(),ou(12,"\n "),_s(13,"div",22),ou(14,"\n "),_s(15,"span",23),Ls("click",function(){return sn(n),As().changeSeedType()}),ou(16,"\n "),_s(17,"mat-icon",24),ou(18,"edit"),ys(),ou(19),Vl(20,"translate"),ys(),ou(21,"\n "),ys(),ou(22,"\n "),ks()}if(2&e){var i=As();Pa(2),gs("ngClass",Hl(11,uO,i.onboarding,!i.create,i.busy)),Pa(2),gs("ngIf",i.checkingAssistedSeed),Pa(2),gs("ngIf",i.create||i.lastAssistedSeed),Pa(2),gs("ngIf",!i.create&&i.lastAssistedSeed),Pa(2),gs("ngIf",!i.create&&!i.lastAssistedSeed),Pa(3),gs("ngClass",Rl(15,lO,i.busy)),Pa(2),gs("ngClass",Rl(17,cO,i.onboarding)),Pa(2),gs("inline",!0),Pa(2),uu("\n ",Ul(20,9,"wallet.new.seed.use-custom"),"\n ")}}function hO(e,t){1&e&&(_s(0,"div",32),bs(1,"mat-spinner"),ys())}function fO(e,t){if(1&e){var n=Ss();ws(0),ou(1,"\n "),fs(2,hO,2,0,"div",30),ou(3,"\n "),_s(4,"textarea",31),Ls("blur",function(){return sn(n),As().validateForm()}),ys(),ou(5,"\n "),_s(6,"div",22),ou(7,"\n "),_s(8,"span",23),Ls("click",function(){return sn(n),As().changeSeedType()}),ou(9,"\n "),_s(10,"mat-icon",24),ou(11,"format_list_numbered"),ys(),ou(12),Vl(13,"translate"),ys(),ou(14,"\n "),ys(),ou(15,"\n "),ks()}if(2&e){var i=As();Pa(2),gs("ngIf",i.checkingCustomSeed),Pa(2),gs("appFormFieldError",i.seed1ErrorMsg),cs("disabled",i.busy?"true":null),Pa(2),gs("ngClass",Rl(9,lO,i.busy)),Pa(2),gs("ngClass",Rl(11,cO,i.onboarding)),Pa(2),gs("inline",!0),Pa(2),uu("\n ",Ul(13,7,"wallet.new.seed.use-normal"),"\n ")}}var pO=function(e,t){return{"red-text":e,"white-text transparent-text":t}};function mO(e,t){if(1&e&&(_s(0,"p",33),ou(1),Vl(2,"translate"),ys()),2&e){var n=As();gs("ngClass",Fl(4,pO,!n.onboarding,n.onboarding)),Pa(1),uu("\n ",Ul(2,2,"wallet.new.seed-warning"),"\n ")}}function gO(e,t){if(1&e&&(_s(0,"div",28),ou(1,"\n "),_s(2,"mat-icon",29),ou(3,"touch_app"),ys(),_s(4,"span",27),ou(5),Vl(6,"translate"),ys(),ou(7,"\n "),ys()),2&e){var n=As(3);Pa(4),gs("ngClass",Rl(4,aO,n.onboarding)),Pa(1),su(Ul(6,2,"wallet.new.seed.confirm-seed"))}}function vO(e,t){if(1&e&&(_s(0,"div",28),ou(1,"\n "),_s(2,"mat-icon",35),ou(3,"done"),ys(),ou(4," "),_s(5,"span",27),ou(6),Vl(7,"translate"),ys(),ou(8,"\n "),ys()),2&e){var n=As(3);Pa(5),gs("ngClass",Rl(4,aO,n.onboarding)),Pa(1),su(Ul(7,2,"wallet.new.seed.confirmed-seed"))}}function _O(e,t){if(1&e){var n=Ss();ws(0),ou(1,"\n "),_s(2,"div",17),Ls("click",function(){return sn(n),As(2).confirmSeed()}),ou(3,"\n "),fs(4,gO,8,6,"div",21),ou(5,"\n "),fs(6,vO,9,6,"div",21),ou(7,"\n "),ys(),ou(8,"\n "),ks()}if(2&e){var i=As(2);Pa(2),gs("ngClass",Hl(3,uO,i.onboarding,!i.assistedSeedConfirmed,i.busy)),Pa(2),gs("ngIf",!i.assistedSeedConfirmed),Pa(2),gs("ngIf",i.assistedSeedConfirmed)}}function yO(e,t){1&e&&(_s(0,"div",32),bs(1,"mat-spinner"),ys())}function bO(e,t){if(1&e){var n=Ss();ws(0),ou(1,"\n "),fs(2,yO,2,0,"div",30),ou(3,"\n "),_s(4,"textarea",36),Ls("blur",function(){return sn(n),As(2).validateForm()}),ys(),ou(5,"\n "),ks()}if(2&e){var i=As(2);Pa(2),gs("ngIf",i.checkingCustomSeed),Pa(2),gs("appFormFieldError",i.seed2ErrorMsg),cs("disabled",i.busy?"true":null)}}function wO(e,t){if(1&e&&(_s(0,"div",1),ou(1,"\n "),_s(2,"label",34),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ou(6,"\n "),fs(7,_O,9,7,"ng-container",7),ou(8,"\n\n "),ou(9,"\n "),fs(10,bO,6,3,"ng-container",7),ou(11,"\n "),ys()),2&e){var n=As();Pa(3),su(Ul(4,3,"wallet.new.confirm-seed-label")),Pa(4),gs("ngIf",n.enterSeedWithAssistance),Pa(3),gs("ngIf",!n.enterSeedWithAssistance)}}function kO(e,t){if(1&e){var n=Ss();_s(0,"div",44),ou(1,"\n "),_s(2,"div",1),ou(3,"\n "),_s(4,"label",45),ou(5),Vl(6,"translate"),ys(),ou(7,"\n "),_s(8,"input",46),Ls("blur",function(){return sn(n),As(2).validateForm()}),ys(),ou(9,"\n "),ys(),ou(10,"\n "),ys()}if(2&e){var i=As(2);Pa(5),su(Ul(6,3,"password.password-label")),Pa(3),gs("appFormFieldError",i.password1ErrorMsg),cs("disabled",i.busy?"true":null)}}function MO(e,t){if(1&e){var n=Ss();_s(0,"div",44),ou(1,"\n "),_s(2,"div",1),ou(3,"\n "),_s(4,"label",47),ou(5),Vl(6,"translate"),ys(),ou(7,"\n "),_s(8,"input",48),Ls("keydown.enter",function(){return sn(n),As(2).requestCreation()})("blur",function(){return sn(n),As(2).validateForm()}),ys(),ou(9,"\n "),ys(),ou(10,"\n "),ys()}if(2&e){var i=As(2);Pa(5),su(Ul(6,3,"password.confirm-password-label")),Pa(3),gs("appFormFieldError",i.password2ErrorMsg),cs("disabled",i.busy?"true":null)}}function SO(e,t){if(1&e){var n=Ss();_s(0,"div"),ou(1,"\n "),_s(2,"div"),ou(3,"\n "),ou(4,"\n "),_s(5,"mat-checkbox",37),Ls("change",function(e){return sn(n),As().setEncrypt(e)}),ou(6,"\n "),_s(7,"span",38),bs(8,"img",39),ou(9),Vl(10,"translate"),ys(),ou(11,"\n "),ys(),ou(12,"\n "),ys(),ou(13,"\n "),_s(14,"div",40),ou(15,"\n "),_s(16,"div",41),ou(17,"\n "),_s(18,"p",42),ou(19),Vl(20,"translate"),ys(),ou(21,"\n "),ys(),ou(22,"\n "),ou(23,"\n "),fs(24,kO,11,5,"div",43),ou(25,"\n "),fs(26,MO,11,5,"div",43),ou(27,"\n "),ys(),ou(28,"\n "),ys()}if(2&e){var i=As();Pa(5),gs("checked",!0)("ngClass",Rl(10,lO,i.busy)),Pa(4),uu(" ",Ul(10,6,"wallet.new.encrypt-check"),""),Pa(10),su(Ul(20,8,"wallet.new.encrypt-warning")),Pa(5),gs("ngIf",i.encrypt),Pa(2),gs("ngIf",i.encrypt)}}function CO(e,t){if(1&e){var n=Ss();_s(0,"div",49),ou(1,"\n "),_s(2,"mat-icon"),ou(3,"error"),ys(),ou(4,"\n "),_s(5,"div"),ou(6,"\n "),_s(7,"div",50),ou(8),Vl(9,"translate"),ys(),ou(10,"\n "),_s(11,"div"),ou(12),Vl(13,"translate"),ys(),ou(14,"\n "),_s(15,"mat-checkbox",51,52),Ls("change",function(e){return sn(n),As().onCustomSeedAcceptance(e)}),ou(17),Vl(18,"translate"),ys(),ou(19,"\n "),ys(),ou(20,"\n"),ys()}if(2&e){var i=As();Pa(8),su(Ul(9,5,"wallet.new.unconventional-seed-title")),Pa(4),su(Ul(13,7,"wallet.new.unconventional-seed-text")),Pa(3),gs("checked",i.customSeedAccepted)("ngClass",Rl(11,lO,i.busy)),Pa(2),uu("\n ",Ul(18,9,"wallet.new.unconventional-seed-check"),"\n ")}}var xO=function(){function e(e,t,n){this.apiService=e,this.dialog=t,this.msgBarService=n,this.busy=!1,this.createRequested=new Zl,this.enterSeedWithAssistance=!0,this.assistedSeedConfirmed=!1,this.customSeedIsNormal=!0,this.customSeedAccepted=!1,this.encrypt=!0,this.lastAssistedSeed="",this.numberOfAutogeneratedWords=0,this.checkingCustomSeed=!1,this.checkingAssistedSeed=!1,this.labelErrorMsg="",this.seed1ErrorMsg="",this.seed2ErrorMsg="",this.password1ErrorMsg="",this.password2ErrorMsg="",this.seed=new z}return e.prototype.ngOnInit=function(){this.onboarding?this.initForm(!1,null):this.initForm()},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.statusSubscription.unsubscribe(),this.seedValiditySubscription.unsubscribe(),this.createRequested.complete()},Object.defineProperty(e.prototype,"isValid",{get:function(){return this.form.valid&&!this.checkingCustomSeed&&(!this.enterSeedWithAssistance&&(this.customSeedIsNormal||this.customSeedAccepted)||this.create&&this.enterSeedWithAssistance&&this.assistedSeedConfirmed||!this.create&&this.enterSeedWithAssistance&&this.lastAssistedSeed.length>2)},enumerable:!1,configurable:!0}),e.prototype.onCustomSeedAcceptance=function(e){this.customSeedAccepted=e.checked},e.prototype.setEncrypt=function(e){this.encrypt=e.checked,this.form.updateValueAndValidity()},e.prototype.getData=function(){return{creatingNewWallet:this.create,label:this.form.value.label,seed:this.enterSeedWithAssistance?this.lastAssistedSeed:this.form.value.seed,password:!this.onboarding&&this.encrypt?this.form.value.password:null,enterSeedWithAssistance:this.enterSeedWithAssistance,lastAssistedSeed:this.lastAssistedSeed,lastCustomSeed:this.form.value.seed,numberOfWords:this.create?this.numberOfAutogeneratedWords:this.form.value.number_of_words,customSeedIsNormal:this.customSeedIsNormal}},e.prototype.changeSeedType=function(){var e=this;this.msgBarService.hide(),this.enterSeedWithAssistance?ID.openDialog(this.dialog,{text:this.create?"wallet.new.seed.custom-seed-warning-text":"wallet.new.seed.custom-seed-warning-text-recovering",headerText:"common.warning-title",checkboxText:this.create?"common.generic-confirmation-check":null,defaultButtons:YD.ContinueCancel,redTitle:!0}).afterClosed().subscribe(function(t){t&&(e.enterSeedWithAssistance=!1,e.removeConfirmations())}):(this.enterSeedWithAssistance=!0,this.removeConfirmations())},e.prototype.enterSeed=function(){this.create||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},e.prototype.confirmSeed=function(){this.assistedSeedConfirmed||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},e.prototype.askForWord=function(e){var t=this;return zC.openDialog(this.dialog,{reason:this.create?UC.CreatingSoftwareWallet:UC.RecoveringSoftwareWallet,wordNumber:e+1}).afterClosed().subscribe(function(n){if(n){if(t.create&&n!==t.lastAssistedSeed.split(" ")[e])return void t.msgBarService.showError("wallet.new.seed.incorrect-word-error");if(t.partialSeed[e]=n,e+=1,t.create&&e0&&(!e.create||e.seedsAreEqual())?(e.checkingCustomSeed=!0,xf(0).pipe(Of(500),ue(function(){return e.apiService.post("wallet/seed/verify",{seed:t},{useV2:!0})}))):xf(0)})).subscribe(function(t){e.customSeedIsNormal=0!==t,e.checkingCustomSeed=!1},function(t){e.checkingCustomSeed=!1,(t=Hp(t))&&t.originalError&&422===t.originalError.status?e.customSeedIsNormal=!1:(e.customSeedIsNormal=!0,e.msgBarService.showWarning("wallet.new.seed-checking-error")),e.subscribeToSeedValidation()})},e.prototype.seedsAreEqual=function(){return this.form&&this.form.get("seed")&&this.form.get("confirm_seed")?this.form.get("seed").value===this.form.get("confirm_seed").value:(this.customSeedIsNormal=!0,!1)},e.prototype.validateForm=function(){this.labelErrorMsg="",this.seed1ErrorMsg="",this.seed2ErrorMsg="",this.password1ErrorMsg="",this.password2ErrorMsg="";var e=!0;if(this.form.get("label").value||(e=!1,this.form.get("label").touched&&(this.labelErrorMsg="wallet.new.name-error-info")),!this.enterSeedWithAssistance){var t=!0;this.form.get("seed").value||(e=!1,t=!1,this.customSeedIsNormal=!0,this.form.get("seed").touched&&(this.seed1ErrorMsg="wallet.new.seed-error-info")),this.create&&(this.form.get("confirm_seed").value||(e=!1,t=!1,this.customSeedIsNormal=!0,this.form.get("confirm_seed").touched&&(this.seed2ErrorMsg="wallet.new.seed-error-info")),t&&(this.seed2ErrorMsg||this.seedsAreEqual()||(e=!1,this.customSeedIsNormal=!0,this.seed2ErrorMsg="wallet.new.confirm-seed-error-info")))}if(this.encrypt&&!this.onboarding){var n=!0;this.form.get("password").value||(e=!1,n=!1,this.form.get("password").touched&&(this.password1ErrorMsg="password.password-error-info")),this.form.get("confirm_password").value||(e=!1,n=!1,this.form.get("confirm_password").touched&&(this.password2ErrorMsg="password.password-error-info")),n&&(this.password2ErrorMsg||this.form.get("password").value===this.form.get("confirm_password").value||(e=!1,this.password2ErrorMsg="password.confirm-error-info"))}return e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ms(Bp),ms(Aw),ms(HC))},e.\u0275cmp=lt({type:e,selectors:[["app-create-wallet-form"]],inputs:{create:"create",onboarding:"onboarding",busy:"busy"},outputs:{createRequested:"createRequested"},decls:45,vars:17,consts:[[1,"main-container",3,"formGroup"],[1,"form-field"],["for","label"],["formControlName","label","id","label",3,"appFormFieldError","blur"],["class","form-field",4,"ngIf"],["for","seed"],["class","generators",3,"ngClass",4,"ngIf"],[4,"ngIf"],["class","disclaimer-box",3,"ngClass",4,"ngIf"],["class","alert-box",4,"ngIf"],["for","number_of_words"],[1,"-select"],["formControlName","number_of_words","id","number_of_words"],[3,"ngValue"],[1,"generators",3,"ngClass"],[1,"link",3,"matTooltip","click"],[1,"divider"],[1,"dashed-border","non-editable-field",3,"ngClass","click"],["class","seed-spinner assisted-seed-spinner",3,"ngClass",4,"ngIf"],["class","normal-seed-field",4,"ngIf"],[3,"ngClass",4,"ngIf"],["class","text-with-icon-container",4,"ngIf"],[1,"seed-type-button",3,"ngClass"],[1,"link",3,"ngClass","click"],[3,"inline"],[1,"seed-spinner","assisted-seed-spinner",3,"ngClass"],[1,"normal-seed-field"],[3,"ngClass"],[1,"text-with-icon-container"],[1,"yellow-text"],["class","seed-spinner",4,"ngIf"],["formControlName","seed","id","seed","rows","2",3,"appFormFieldError","blur"],[1,"seed-spinner"],[1,"disclaimer-box",3,"ngClass"],["for","confirm_seed"],[1,"green-text"],["formControlName","confirm_seed","id","confirm_seed","rows","2",3,"appFormFieldError","blur"],["type","checkbox","id","encrypt",1,"-check",3,"checked","ngClass","change"],[1,"img-label-container"],["src","assets/img/lock-gold.png"],[1,"row","-passwords"],[1,"col-md-12"],[1,"-info"],["class","col-md-6",4,"ngIf"],[1,"col-md-6"],["for","password"],["formControlName","password","id","password","type","password","appDontSavePassword","",3,"appFormFieldError","blur"],["for","confirm_password"],["formControlName","confirm_password","id","confirm_password","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],[1,"alert-box"],[1,"title"],["type","checkbox",1,"-check",3,"checked","ngClass","change"],["seedCheck",""]],template:function(e,t){1&e&&(_s(0,"div",0),ou(1,"\n "),ou(2,"\n "),_s(3,"div",1),ou(4,"\n "),_s(5,"label",2),ou(6),Vl(7,"translate"),ys(),ou(8,"\n "),_s(9,"input",3),Ls("blur",function(){return t.validateForm()}),ys(),ou(10,"\n "),ys(),ou(11,"\n "),ou(12,"\n "),fs(13,$D,20,12,"div",4),ou(14,"\n "),_s(15,"div",1),ou(16,"\n "),ou(17,"\n "),_s(18,"label",5),ou(19,"\n "),_s(20,"span"),ou(21),Vl(22,"translate"),ys(),ou(23,"\n "),fs(24,tO,15,16,"span",6),ou(25,"\n "),ys(),ou(26,"\n\n "),ou(27,"\n "),fs(28,dO,23,19,"ng-container",7),ou(29,"\n\n "),ou(30,"\n "),fs(31,fO,16,13,"ng-container",7),ou(32,"\n\n "),fs(33,mO,3,7,"p",8),ou(34,"\n "),ys(),ou(35,"\n "),fs(36,wO,12,5,"div",4),ou(37,"\n "),ou(38,"\n "),fs(39,SO,29,12,"div",7),ou(40,"\n"),ys(),ou(41,"\n"),ou(42,"\n"),fs(43,CO,21,13,"div",9),ou(44,"\n")),2&e&&(gs("formGroup",t.form),Pa(6),su(Ul(7,13,"wallet.new.name-label")),Pa(3),gs("appFormFieldError",t.labelErrorMsg),cs("disabled",t.busy?"true":null),Pa(4),gs("ngIf",!t.create&&t.enterSeedWithAssistance),Pa(8),su(Ul(22,15,"wallet.new.seed-label")),Pa(3),gs("ngIf",t.create),Pa(4),gs("ngIf",t.enterSeedWithAssistance),Pa(3),gs("ngIf",!t.enterSeedWithAssistance),Pa(2),gs("ngIf",t.create),Pa(3),gs("ngIf",t.create),Pa(3),gs("ngIf",!t.onboarding),Pa(4),gs("ngIf",t.form.valid&&!t.customSeedIsNormal&&!t.checkingCustomSeed&&!t.enterSeedWithAssistance))},directives:[wk,pM,Xw,bk,wM,QD,fh,Ek,Pk,Rk,lh,KD,uC,vS,LD,XD],pipes:[oS],styles:[".main-container[_ngcontent-%COMP%]{font-size:12px}.dashed-border[_ngcontent-%COMP%]{border:2px dashed rgba(30,34,39,.05)}.show-pointer[_ngcontent-%COMP%]{cursor:pointer}.non-editable-field[_ngcontent-%COMP%]{text-align:center;padding:15px;border-radius:6px;color:#1e2227}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%]{display:inline-flex;align-items:center}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:5px;opacity:1}.normal-seed-field[_ngcontent-%COMP%]{font-size:14px}.seed-type-button[_ngcontent-%COMP%]{text-align:right}.seed-type-button[_ngcontent-%COMP%], .seed-type-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{position:relative;top:2px}.onboarding-version[_ngcontent-%COMP%]{border:2px dashed hsla(0,0%,100%,.25);color:#fafafa}.transparent-text[_ngcontent-%COMP%]{opacity:.75}.disclaimer-box[_ngcontent-%COMP%]{padding:0 10px;line-height:1.5}label[for=seed][_ngcontent-%COMP%]{display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px;color:#1e2227}.-white-text[_ngcontent-%COMP%], .-white-text[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fafafa!important}.-passwords[_ngcontent-%COMP%]{margin-left:24px}.-passwords[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin:5px 0 15px;color:rgba(30,34,39,.5);line-height:1.5}.seed-spinner[_ngcontent-%COMP%]{height:0;position:relative;top:2px;left:2px}.seed-spinner[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{position:absolute}.seed-spinner[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%], .seed-spinner[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:10px!important;width:10px!important}.white-mat-spinner[_ngcontent-%COMP%] svg circle{stroke:#fafafa}.assisted-seed-spinner[_ngcontent-%COMP%]{top:-14px!important;left:-14px!important}"]}),e}(),LO=function(){function e(e,t,n){var i=this;this.walletsAndAddressesService=e,this.apiService=t,this.ngZone=n,this.walletsWithBalanceSubject=new Im(1),this.hasPendingTransactionsSubject=new Gp(!1),this.firstFullUpdateMadeSubject=new Gp(!1),this.updatePeriod=1e4,this.errorUpdatePeriod=2e3,this.savedBalanceData=new Map,this.temporalSavedBalanceData=new Map,this.walletsAndAddressesService.allWallets.subscribe(function(e){i.savedWalletsList=e,i.startDataRefreshSubscription(0,!0)})}return Object.defineProperty(e.prototype,"walletsWithBalance",{get:function(){return this.walletsWithBalanceSubject.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasPendingTransactions",{get:function(){return this.hasPendingTransactionsSubject.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"firstFullUpdateMade",{get:function(){return this.firstFullUpdateMadeSubject.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"outputsWithWallets",{get:function(){var e=this;return this.walletsWithBalance.pipe(Lm(function(t){var n=t.map(function(e){return e.addresses.map(function(e){return e.address}).join(",")}).join(",");return e.getOutputs(n)}),ie(function(t){var n=[];return e.walletsWithBalanceList.forEach(function(e){return n.push(function(e){var t=new tx;return Object.assign(t,ZC(e,!1)),e.addresses.forEach(function(e){t.addresses.push(function(e){var t=new nx;return Object.assign(t,QC(e)),t}(e))}),t}(e))}),n.forEach(function(e){e.addresses.forEach(function(e){e.outputs=t.filter(function(t){return t.address===e.address})})}),n}))},enumerable:!1,configurable:!0}),e.prototype.getOutputs=function(e){return e?this.apiService.post("outputs",{addrs:e}).pipe(ie(function(e){var t=[];return e.head_outputs.forEach(function(e){var n={address:e.address,coins:new Yf.BigNumber(e.coins),hash:e.hash,hours:new Yf.BigNumber(e.calculated_hours)};t.push(n)}),t})):xf([])},e.prototype.getWalletUnspentOutputs=function(e){var t=e.addresses.map(function(e){return e.address}).join(",");return this.getOutputs(t)},e.prototype.refreshBalance=function(){this.startDataRefreshSubscription(0,!1)},e.prototype.startDataRefreshSubscription=function(e,t){var n=this;this.dataRefreshSubscription&&this.dataRefreshSubscription.unsubscribe(),this.savedWalletsList&&this.ngZone.runOutsideAngular(function(){n.dataRefreshSubscription=xf(0).pipe(Of(e),ue(function(){return t?n.refreshBalances(n.savedWalletsList,!0):xf(0)}),ue(function(){return n.refreshBalances(n.savedWalletsList,!1)})).subscribe(function(){return n.startDataRefreshSubscription(n.updatePeriod,!1)},function(){return n.startDataRefreshSubscription(n.errorUpdatePeriod,!1)})})},e.prototype.refreshBalances=function(e,t){var n=this;this.gettingBalanceSubscription&&this.gettingBalanceSubscription.unsubscribe();var i=[];return e.forEach(function(e){i.push(function(e){var t=new $C;return Object.assign(t,ZC(e,!1)),e.addresses.forEach(function(e){t.addresses.push(function(e){var t=new ex;return Object.assign(t,QC(e)),t}(e))}),t}(e))}),t||(this.temporalSavedBalanceData=new Map),zw(i.map(function(e){return n.retrieveWalletBalance(e,t)})).pipe(Gg(function(e){if(n.hasPendingTransactionsSubject.next(e.some(function(e){return e})),!n.walletsWithBalanceList||t||n.walletsWithBalanceList.length!==i.length)n.walletsWithBalanceList=i,n.informDataUpdated();else{var r=!1;n.walletsWithBalanceList.forEach(function(e,t){e.id!==i[t].id&&(r=!0)}),r?(n.walletsWithBalanceList=i,n.informDataUpdated()):(n.walletsWithBalanceList.forEach(function(e,t){e.coins.isEqualTo(i[t].coins)&&e.hours.isEqualTo(i[t].hours)||(e.coins=i[t].coins,e.hours=i[t].hours,r=!0),e.addresses.length!==i[t].addresses.length?(e.addresses=i[t].addresses,r=!0):e.addresses.forEach(function(e,n){e.coins.isEqualTo(i[t].addresses[n].coins)&&e.hours.isEqualTo(i[t].addresses[n].hours)||(e.coins=i[t].addresses[n].coins,e.hours=i[t].addresses[n].hours,r=!0)})}),r&&n.informDataUpdated())}t||(n.savedBalanceData=n.temporalSavedBalanceData,n.firstFullUpdateMadeSubject.value||n.ngZone.run(function(){n.firstFullUpdateMadeSubject.next(!0)}))}))},e.prototype.retrieveWalletBalance=function(e,t){var n,i=this;if(t)n=this.savedBalanceData.has(e.id)?xf(this.savedBalanceData.get(e.id)):xf({addresses:[]});else if(e.isHardware){var r=e.addresses.map(function(e){return e.address}).join(",");n=this.apiService.post("balance",{addrs:r})}else n=this.apiService.get("wallet/balance",{id:e.id});return n.pipe(ie(function(n){return i.temporalSavedBalanceData.set(e.id,n),n.confirmed?(e.coins=new Yf.BigNumber(n.confirmed.coins).dividedBy(1e6),e.hours=new Yf.BigNumber(n.confirmed.hours)):(e.coins=new Yf.BigNumber(0),e.hours=new Yf.BigNumber(0)),e.addresses.forEach(function(e){n.addresses[e.address]?(e.coins=new Yf.BigNumber(n.addresses[e.address].confirmed.coins).dividedBy(1e6),e.hours=new Yf.BigNumber(n.addresses[e.address].confirmed.hours)):(e.coins=new Yf.BigNumber(0),e.hours=new Yf.BigNumber(0))}),t?i.hasPendingTransactionsSubject.value:!new Yf.BigNumber(n.predicted.coins).dividedBy(1e6).isEqualTo(e.coins)||!new Yf.BigNumber(n.predicted.hours).isEqualTo(e.hours)}))},e.prototype.informDataUpdated=function(){var e=this;this.ngZone.run(function(){e.walletsWithBalanceSubject.next(e.walletsWithBalanceList)})},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(ix),Gi(Bp),Gi(Nc))}}),e}(),TO=function(){function e(e,t,n){this.apiService=e,this.ngZone=t,this.balanceAndOutputsService=n,this.progressSubject=new Im(1),this.lastCurrentBlock=0,this.lastHighestBlock=0,this.nodeSynchronized=!1,this.refreshedBalance=!1,this.updatePeriod=2e3,this.errorUpdatePeriod=2e3,this.startDataRefreshSubscription(0)}return Object.defineProperty(e.prototype,"progress",{get:function(){return this.progressSubject.asObservable()},enumerable:!1,configurable:!0}),e.prototype.getLastBlock=function(){return this.apiService.get("last_blocks",{num:1}).pipe(ie(function(e){return{seq:e.blocks[0].header.seq,timestamp:e.blocks[0].header.timestamp,hash:e.blocks[0].header.block_hash}}))},e.prototype.getCoinSupply=function(){return this.apiService.get("coinSupply").pipe(ie(function(e){return{currentSupply:e.current_supply,totalSupply:e.total_supply,currentCoinhourSupply:e.current_coinhour_supply,totalCoinhourSupply:e.total_coinhour_supply}}))},e.prototype.startDataRefreshSubscription=function(e){var t=this;this.dataSubscription&&this.dataSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){t.dataSubscription=xf(0).pipe(Of(e),ue(function(){return t.apiService.get("blockchain/progress")})).subscribe(function(e){t.ngZone.run(function(){!e||!e.current||!e.highest||0===e.highest||e.currents[0]||u===s[0]&&(l>s[1]||l===s[1]&&i.rawResponse.fw_patch>=s[2]))&&(a=!0)}}var c=[],d=!1;i.rawResponse.needs_backup&&(c.push(BO.NeedsBackup),d=!0),i.rawResponse.pin_protection||(c.push(BO.NeedsPin),d=!0),r?a||(c.push(BO.OutdatedFirmware),d=!0):c.push(BO.FirmwareVersionNotVerified);var h=!1;if(e){var f=!1,p=i.rawResponse.label?i.rawResponse.label:i.rawResponse.deviceId?i.rawResponse.deviceId:i.rawResponse.device_id;e.label!==p&&(e.label=p,h=!0,f=!0),e.hasHwSecurityWarnings!==d&&(e.hasHwSecurityWarnings=d,f=!0),f&&n.walletsAndAddressesService.informValuesUpdated(e)}return{features:i.rawResponse,securityWarnings:c,walletNameUpdated:h}})):null},e.prototype.confirmAddress=function(e,t){var n=this;return this.hwWalletService.checkIfCorrectHwConnected(e.id).pipe(ue(function(){return n.hwWalletService.confirmAddress(t)}),ie(function(){e.addresses[t].confirmed=!0,n.walletsAndAddressesService.informValuesUpdated(e)}))},e.prototype.changeLabel=function(e,t){var n=this;return this.hwWalletService.checkIfCorrectHwConnected(e.id).pipe(ue(function(){return n.hwWalletService.changeLabel(t)}),ie(function(){e.label=t,n.walletsAndAddressesService.informValuesUpdated(e)}))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(ix),Gi(Bw),Gi(yp))}}),e}(),VO=["button"];function UO(e,t){1&e&&(_s(0,"div"),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),uu("\n ",Ul(2,1,"hardware-wallet.added.characters-warning"),"\n "))}var zO=function(e){return{"modal-form-container":e}};function qO(e,t){if(1&e){var n=Ss();ws(0),ou(1,"\n "),fs(2,UO,3,3,"div",1),ou(3,"\n "),_s(4,"div",3),ou(5,"\n "),ou(6,"\n "),_s(7,"div",4),ou(8,"\n "),_s(9,"label",5),ou(10),Vl(11,"translate"),ys(),ou(12,"\n "),_s(13,"input",6),Ls("keydown.enter",function(){return sn(n),As().rename()})("blur",function(){return sn(n),As().validateForm()}),ys(),ou(14,"\n "),ys(),ou(15,"\n "),ys(),ou(16,"\n "),ou(17,"\n "),_s(18,"div",7),ou(19,"\n "),_s(20,"app-button",8),Ls("action",function(){return sn(n),As().closePopup()}),ou(21),Vl(22,"translate"),ys(),ou(23,"\n "),_s(24,"app-button",9,10),Ls("action",function(){return sn(n),As().rename()}),ou(26),Vl(27,"translate"),ys(),ou(28,"\n "),ys(),ou(29,"\n "),ks()}if(2&e){var i=ps(25),r=As();Pa(2),gs("ngIf",r.data.wallet.isHardware),Pa(2),gs("ngClass",Rl(17,zO,r.data.wallet.isHardware))("formGroup",r.form),Pa(6),su(Ul(11,11,"wallet.rename.name-label")),Pa(3),gs("maxlength",r.data.wallet.isHardware?r.maxHwWalletLabelLength:null)("appFormFieldError",r.inputErrorMsg),cs("disabled",r.working?"true":null),Pa(7),gs("disabled",i&&i.isLoading()),Pa(1),uu("\n ",Ul(22,13,"common.cancel-button"),"\n "),Pa(3),gs("disabled",!r.form.valid),Pa(2),uu("\n ",Ul(27,15,"wallet.rename.rename-button"),"\n ")}}function GO(e,t){if(1&e&&(bs(0,"app-hw-message",11),Vl(1,"translate")),2&e){var n=As();gs("text",Ul(1,2,"hardware-wallet.general.confirm"))("icon",n.msgIcons.Confirm)}}var KO=function(e){return e.Initial="Initial",e.WaitingForConfirmation="WaitingForConfirmation",e}({}),JO=function(){return function(){}}(),ZO=function(){return function(){}}(),QO=function(){function e(e,t,n,i,r,a,o,s){this.dialogRef=e,this.data=t,this.formBuilder=n,this.hwWalletService=i,this.msgBarService=r,this.softwareWalletService=a,this.hardwareWalletService=o,this.changeDetector=s,this.currentState=KO.Initial,this.states=KO,this.msgIcons=HS,this.maxHwWalletLabelLength=Bw.maxLabelLength,this.working=!1,this.inputErrorMsg=""}return e.openDialog=function(t,n,i){var r=new bw;return r.data=n,r.autoFocus=!0,r.width=i?"400px":zp.mediumModalWidth,t.open(e,r)},e.prototype.ngOnInit=function(){var e=this;this.data.newName?this.finishRenaming(this.data.newName):(this.form=this.formBuilder.group({label:[this.data.wallet.label]}),this.form.setValidators(this.validateForm.bind(this))),this.data.wallet.isHardware&&(this.hwConnectionSubscription=this.hwWalletService.walletConnectedAsyncEvent.subscribe(function(t){t||e.closePopup()}))},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.hwConnectionSubscription&&this.hwConnectionSubscription.unsubscribe(),this.operationSubscription&&this.operationSubscription.unsubscribe()},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.rename=function(){this.form.valid&&!this.button.isLoading()&&(this.msgBarService.hide(),this.button.setLoading(),this.finishRenaming(this.form.value.label),this.changeDetector.detectChanges())},e.prototype.finishRenaming=function(e){var t=this;this.working=!0,this.data.wallet.isHardware?(this.currentState=KO.WaitingForConfirmation,this.operationSubscription=this.hardwareWalletService.changeLabel(this.data.wallet,e).subscribe(function(){t.working=!1,t.dialogRef.close(e),t.data.newName||setTimeout(function(){return t.msgBarService.showDone("common.changes-made")})},function(e){if(t.working=!1,t.data.newName){var n=new ZO;n.errorMsg=Hp(e).translatableErrorMsg,t.dialogRef.close(n)}else t.msgBarService.showError(e),t.currentState=KO.Initial,t.button&&t.button.resetState()})):this.operationSubscription=this.softwareWalletService.renameWallet(this.data.wallet,e).subscribe(function(){t.working=!1,t.dialogRef.close(e),setTimeout(function(){return t.msgBarService.showDone("common.changes-made")})},function(e){t.working=!1,t.msgBarService.showError(e),t.button&&t.button.resetState()})},e.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0;return this.form.get("label").value&&0!==this.form.get("label").value.trim().length||(e=!1,this.form.get("label").touched&&(this.inputErrorMsg="wallet.rename.label-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ms(xw),ms(Tw),ms(TM),ms(Bw),ms(HC),ms(NO),ms(WO),ms(ul))},e.\u0275cmp=lt({type:e,selectors:[["app-change-name"]],viewQuery:function(e,t){var n;1&e&&cc(VO,!0),2&e&&uc(n=fc())&&(t.button=n.first)},decls:10,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon",4,"ngIf"],[3,"ngClass","formGroup"],[1,"form-field"],["for","label"],["formControlName","label","id","label",3,"maxlength","appFormFieldError","keydown.enter","blur"],[1,"-buttons"],[3,"disabled","action"],[1,"primary-button",3,"disabled","action"],["button",""],[3,"text","icon"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,qO,30,19,"ng-container",1),ou(5,"\n\n "),ou(6,"\n "),fs(7,GO,2,4,"app-hw-message",2),ou(8,"\n"),ys(),ou(9,"\n")),2&e&&(gs("headline",Ul(1,5,"wallet.rename.title"))("dialog",t.dialogRef)("disableDismiss",t.button&&t.button.isLoading()||t.currentState===t.states.WaitingForConfirmation),Pa(4),gs("ngIf",t.currentState===t.states.Initial),Pa(3),gs("ngIf",t.currentState===t.states.WaitingForConfirmation))},directives:[AM,fh,lh,wk,pM,Xw,bk,wM,CM,QD,gC,jS],pipes:[oS],styles:[""]}),e}(),XO=["input"];function $O(e,t){if(1&e&&(bs(0,"app-hw-message",4),Vl(1,"translate")),2&e){var n=As();gs("text",Ul(1,2,"hardware-wallet.added.configuring"))("icon",n.msgIcons.Spinner)}}function eE(e,t){if(1&e&&(bs(0,"app-hw-message",4),Vl(1,"translate")),2&e){var n=As();gs("text",Ul(1,2,n.result.text))("icon",n.result.icon)}}function tE(e,t){if(1&e){var n=Ss();_s(0,"div"),ou(1,"\n "),bs(2,"app-hw-message",5),Vl(3,"translate"),ou(4,"\n "),_s(5,"div",6),ou(6),Vl(7,"translate"),ys(),ou(8,"\n "),_s(9,"div",7),ou(10,"\n "),_s(11,"div",8),ou(12,"\n "),_s(13,"input",9,10),Ls("keydown.enter",function(){return sn(n),As().saveNameAndCloseModal()})("blur",function(){return sn(n),As().validateForm()}),ys(),ou(15,"\n "),ys(),ou(16,"\n "),ys(),ou(17,"\n "),_s(18,"div",11),ou(19),Vl(20,"translate"),ys(),ou(21,"\n \n "),_s(22,"div"),ou(23),Vl(24,"translate"),ys(),ou(25,"\n "),ys()}if(2&e){var i=As();Pa(2),gs("upperBigText",Ul(3,8,"hardware-wallet.added.done"))("icon",i.msgIcons.Success),Pa(4),su(Ul(7,10,"hardware-wallet.added.added1")),Pa(3),gs("formGroup",i.form),Pa(4),gs("maxlength",i.maxHwWalletLabelLength)("appFormFieldError",i.inputErrorMsg),Pa(6),su(Ul(20,12,"hardware-wallet.added.characters-warning")),Pa(4),su(Ul(24,14,"hardware-wallet.added.added2"))}}function nE(e,t){if(1&e){var n=Ss();_s(0,"div",12),ou(1,"\n "),_s(2,"app-button",13,14),Ls("action",function(){sn(n);var e=As();return e.currentState===e.states.Finished?e.saveNameAndCloseModal():e.closeModal()}),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()}if(2&e){var i=As();Pa(2),gs("disabled",i.currentState===i.states.Finished&&!i.form.valid),Pa(2),uu("\n ",Ul(5,2,i.currentState===i.states.Finished?"common.continue-button":"common.close-button"),"\n ")}}var iE=function(e){function t(t,n,i,r,a,o,s,u){var l=e.call(this,i,n)||this;return l.data=t,l.dialogRef=n,l.formBuilder=r,l.dialog=a,l.msgBarService=o,l.walletsAndAddressesService=s,l.hardwareWalletService=u,l.maxHwWalletLabelLength=Bw.maxLabelLength,l.inputErrorMsg="",l.operationSubscription=l.walletsAndAddressesService.createHardwareWallet().subscribe(function(e){l.operationSubscription=l.hardwareWalletService.getFeaturesAndUpdateData(e).subscribe(function(){l.wallet=e,l.initialLabel=e.label,l.form=l.formBuilder.group({label:[e.label]}),l.form.setValidators(l.validateForm.bind(l)),l.currentState=l.states.Finished,l.data.requestOptionsComponentRefresh(),setTimeout(function(){return l.input.nativeElement.focus()})},function(e){return l.processError(e)})},function(e){return l.processError(e)}),l}return Vw(t,e),t.prototype.processError=function(e){e=Hp(e),this.processHwOperationError(e),this.data.requestOptionsComponentRefresh(e.translatableErrorMsg)},t.prototype.ngOnDestroy=function(){e.prototype.ngOnDestroy.call(this),this.msgBarService.hide()},t.prototype.saveNameAndCloseModal=function(){var e=this;if(this.form.value.label===this.initialLabel)this.closeModal();else{this.msgBarService.hide();var t=new JO;t.wallet=this.wallet,t.newName=this.form.value.label,QO.openDialog(this.dialog,t,!0).afterClosed().subscribe(function(t){t&&!t.errorMsg?e.closeModal():t&&t.errorMsg&&e.msgBarService.showError(t.errorMsg)})}},t.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0;return this.form.get("label").value||(e=!1,this.form.get("label").touched&&(this.inputErrorMsg="hardware-wallet.added.added-error-info")),e?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(ms(Tw),ms(xw),ms(Bw),ms(TM),ms(Aw),ms(HC),ms(ix),ms(WO))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-added-dialog"]],viewQuery:function(e,t){var n;1&e&&cc(XO,!0),2&e&&uc(n=fc())&&(t.input=n.first)},features:[Jo],decls:15,vars:9,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","icon",4,"ngIf"],[4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","icon"],[3,"upperBigText","icon"],[1,"upper-text"],[3,"formGroup"],[1,"form-field"],["formControlName","label","id","label",3,"maxlength","appFormFieldError","keydown.enter","blur"],["input",""],[1,"warning"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"],["closeButton",""]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,$O,2,4,"app-hw-message",1),ou(5,"\n\n "),ou(6,"\n "),fs(7,eE,2,4,"app-hw-message",1),ou(8,"\n\n "),ou(9,"\n "),fs(10,tE,26,16,"div",2),ou(11,"\n\n "),fs(12,nE,7,4,"div",3),ou(13,"\n"),ys(),ou(14,"\n")),2&e&&(gs("headline",Ul(1,7,"hardware-wallet.added.title"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Initial),Pa(4),gs("ngIf",t.currentState===t.states.Initial),Pa(3),gs("ngIf",t.currentState===t.states.ShowingResult),Pa(3),gs("ngIf",t.currentState===t.states.Finished),Pa(2),gs("ngIf",t.currentState===t.states.Finished||t.currentState===t.states.ShowingResult))},directives:[AM,fh,jS,wk,pM,Xw,bk,wM,CM,QD,gC],pipes:[oS],styles:[".upper-text[_ngcontent-%COMP%]{margin-top:10px;margin-bottom:10px}.warning[_ngcontent-%COMP%]{margin:-20px 0 20px;color:rgba(30,34,39,.5)}"]}),t}(yC);function rE(e,t){if(1&e){var n=Ss();_s(0,"div"),ou(1,"\n "),bs(2,"app-hw-message",4),Vl(3,"translate"),ou(4,"\n\n "),_s(5,"div",5),ou(6,"\n "),_s(7,"div",6),ou(8,"\n "),_s(9,"div",7),ou(10,"\n "),_s(11,"select",8),ou(12,"\n "),_s(13,"option",9),ou(14),Vl(15,"translate"),ys(),ou(16,"\n "),_s(17,"option",9),ou(18),Vl(19,"translate"),ys(),ou(20,"\n "),ys(),ou(21,"\n "),ys(),ou(22,"\n "),ys(),ou(23,"\n "),ys(),ou(24,"\n\n "),_s(25,"div",10),ou(26,"\n "),_s(27,"app-button",11),Ls("action",function(){return sn(n),As().closeModal()}),ou(28),Vl(29,"translate"),ys(),ou(30,"\n "),_s(31,"app-button",12),Ls("action",function(){return sn(n),As().startOperation()}),ou(32),Vl(33,"translate"),ys(),ou(34,"\n "),ys(),ou(35,"\n "),ys()}if(2&e){var i=As();Pa(2),gs("text",Ul(3,8,"hardware-wallet.generate-seed.text")),Pa(3),gs("formGroup",i.form),Pa(8),gs("ngValue",12),Pa(1),su(Ul(15,10,"wallet.new.12-words")),Pa(3),gs("ngValue",24),Pa(1),su(Ul(19,12,"wallet.new.24-words")),Pa(10),uu("\n ",Ul(29,14,"common.cancel-button"),"\n "),Pa(4),uu("\n ",Ul(33,16,"common.continue-button"),"\n ")}}function aE(e,t){if(1&e&&(bs(0,"app-hw-message",13),Vl(1,"translate")),2&e){var n=As();gs("text",Ul(1,2,"hardware-wallet.generate-seed.configuring"))("icon",n.msgIcons.Spinner)}}function oE(e,t){if(1&e&&(bs(0,"app-hw-message",13),Vl(1,"translate")),2&e){var n=As();gs("text",Ul(1,2,n.result.text))("icon",n.result.icon)}}function sE(e,t){if(1&e){var n=Ss();_s(0,"div",10),ou(1,"\n "),_s(2,"app-button",12,14),Ls("action",function(){return sn(n),As().closeModal()}),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()}2&e&&(Pa(4),uu("\n ",Ul(5,1,"common.close-button"),"\n "))}var uE=function(e){function t(t,n,i,r){var a=e.call(this,i,n)||this;return a.data=t,a.dialogRef=n,a.hwWalletService=i,a.form=r.group({words:[24,rk.required]}),a}return Vw(t,e),t.prototype.startOperation=function(){var e=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.generateMnemonic(this.form.controls.words.value).subscribe(function(){e.data.requestOptionsComponentRefresh(),e.closeModal()},function(t){return e.processHwOperationError(t)})},t.\u0275fac=function(e){return new(e||t)(ms(Tw),ms(xw),ms(Bw),ms(TM))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-generate-seed-dialog"]],features:[Jo],decls:16,vars:9,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],[1,"-select"],["formControlName","words","id","words"],[3,"ngValue"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],[3,"text","icon"],["closeButton",""]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,rE,36,18,"div",1),ou(5,"\n\n "),ou(6,"\n "),fs(7,aE,2,4,"app-hw-message",2),ou(8,"\n\n "),ou(9,"\n "),fs(10,oE,2,4,"app-hw-message",2),ou(11,"\n\n "),ou(12,"\n "),fs(13,sE,7,3,"div",3),ou(14,"\n"),ys(),ou(15,"\n")),2&e&&(gs("headline",Ul(1,7,"hardware-wallet.options.configure-automatically"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Processing),Pa(4),gs("ngIf",t.currentState===t.states.Initial),Pa(3),gs("ngIf",t.currentState===t.states.Processing),Pa(3),gs("ngIf",t.currentState===t.states.ShowingResult),Pa(3),gs("ngIf",t.currentState!==t.states.Initial&&t.currentState!==t.states.Processing))},directives:[AM,fh,jS,wk,pM,Ek,bk,wM,Pk,Rk,gC],pipes:[oS],styles:[""]}),t}(yC);function lE(e,t){if(1&e){var n=Ss();_s(0,"div"),ou(1,"\n "),bs(2,"app-hw-message",2),Vl(3,"translate"),ou(4,"\n\n "),_s(5,"div",3),ou(6,"\n "),_s(7,"app-button",4),Ls("action",function(){return sn(n),As().closeModal()}),ou(8),Vl(9,"translate"),ys(),ou(10,"\n "),_s(11,"app-button",5),Ls("action",function(){return sn(n),As().requestBackup()}),ou(12),Vl(13,"translate"),ys(),ou(14,"\n "),ys(),ou(15,"\n "),ys()}if(2&e){var i=As();Pa(2),gs("text",Ul(3,4,"hardware-wallet.create-backup.warning"))("icon",i.msgIcons.Warning),Pa(6),uu("\n ",Ul(9,6,"common.cancel-button"),"\n "),Pa(4),uu("\n ",Ul(13,8,"common.continue-button"),"\n ")}}function cE(e,t){if(1&e&&(bs(0,"app-hw-message",2),Vl(1,"translate")),2&e){var n=As(2);gs("text",Ul(1,2,"hardware-wallet.create-backup.instructions"))("icon",n.msgIcons.Confirm)}}function dE(e,t){if(1&e&&(bs(0,"app-hw-message",2),Vl(1,"translate")),2&e){var n=As(2);gs("text",Ul(1,2,n.result.text))("icon",n.result.icon)}}function hE(e,t){if(1&e){var n=Ss();_s(0,"div",3),ou(1,"\n "),_s(2,"app-button",5,8),Ls("action",function(){return sn(n),As(2).closeModal()}),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()}2&e&&(Pa(4),uu("\n ",Ul(5,1,"common.close-button"),"\n "))}function fE(e,t){if(1&e&&(_s(0,"div"),ou(1,"\n "),ou(2,"\n "),fs(3,cE,2,4,"app-hw-message",6),ou(4,"\n\n "),ou(5,"\n "),fs(6,dE,2,4,"app-hw-message",6),ou(7,"\n\n "),ou(8,"\n "),fs(9,hE,7,3,"div",7),ou(10,"\n "),ys()),2&e){var n=As();Pa(3),gs("ngIf",n.currentState===n.states.Processing),Pa(3),gs("ngIf",n.currentState===n.states.ShowingResult),Pa(3),gs("ngIf",n.currentState!==n.states.Processing)}}var pE=function(e){function t(t,n,i){var r=e.call(this,i,n)||this;return r.data=t,r.dialogRef=n,r.hwWalletService=i,r}return Vw(t,e),t.prototype.requestBackup=function(){var e=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.backup().subscribe(function(){e.showResult({text:"hardware-wallet.general.completed",icon:e.msgIcons.Success}),e.data.requestOptionsComponentRefresh(null,!0)},function(t){return e.processHwOperationError(t)})},t.\u0275fac=function(e){return new(e||t)(ms(Tw),ms(xw),ms(Bw))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-backup-dialog"]],features:[Jo],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],["closeButton",""]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,lE,16,10,"div",1),ou(5,"\n\n "),fs(6,fE,11,3,"div",1),ou(7,"\n"),ys(),ou(8,"\n")),2&e&&(gs("headline",Ul(1,5,"hardware-wallet.options.create-backup"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Processing),Pa(4),gs("ngIf",t.currentState===t.states.Initial),Pa(2),gs("ngIf",t.currentState!==t.states.Initial))},directives:[AM,fh,jS,gC],pipes:[oS],styles:[""]}),t}(yC);function mE(e,t){if(1&e&&(bs(0,"app-hw-message",3),Vl(1,"translate")),2&e){var n=As();gs("text",Ul(1,2,"hardware-wallet.general.confirm"))("icon",n.msgIcons.Confirm)}}function gE(e,t){if(1&e&&(bs(0,"app-hw-message",3),Vl(1,"translate")),2&e){var n=As();gs("text",Ul(1,2,n.result.text))("icon",n.result.icon)}}function vE(e,t){if(1&e){var n=Ss();_s(0,"div",4),ou(1,"\n "),_s(2,"app-button",5,6),Ls("action",function(){return sn(n),As().closeModal()}),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()}2&e&&(Pa(4),uu("\n ",Ul(5,1,"common.close-button"),"\n "))}var _E=function(e){function t(t,n,i){var r=e.call(this,i,n)||this;return r.data=t,r.dialogRef=n,r.hwWalletService=i,r.changingExistingPin=t.walletHasPin,r.operationSubscription=r.hwWalletService.getFeatures().pipe(ue(function(e){return r.changingExistingPin=e.rawResponse.pin_protection,r.hwWalletService.changePin(e.rawResponse.pin_protection)})).subscribe(function(){r.showResult({text:"hardware-wallet.general.completed",icon:r.msgIcons.Success}),r.data.requestOptionsComponentRefresh(null,!0)},function(e){return r.processHwOperationError(e)}),r}return Vw(t,e),t.\u0275fac=function(e){return new(e||t)(ms(Tw),ms(xw),ms(Bw))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-change-pin-dialog"]],features:[Jo],decls:13,vars:8,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","icon"],[1,"-buttons"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,mE,2,4,"app-hw-message",1),ou(5,"\n\n "),ou(6,"\n "),fs(7,gE,2,4,"app-hw-message",1),ou(8,"\n\n "),ou(9,"\n "),fs(10,vE,7,3,"div",2),ou(11,"\n"),ys(),ou(12,"\n")),2&e&&(gs("headline",Ul(1,6,t.changingExistingPin?"hardware-wallet.options.change-pin":"hardware-wallet.options.create-pin"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Initial),Pa(4),gs("ngIf",t.currentState===t.states.Initial),Pa(3),gs("ngIf",t.currentState===t.states.ShowingResult),Pa(3),gs("ngIf",t.currentState!==t.states.Initial))},directives:[AM,fh,jS,gC],pipes:[oS],styles:[""]}),t}(yC);function yE(e,t){1&e&&(_s(0,"div",14),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),su(Ul(2,1,"hardware-wallet.restore-seed.warning")))}function bE(e,t){if(1&e){var n=Ss();_s(0,"div"),ou(1,"\n "),bs(2,"app-hw-message",4),Vl(3,"translate"),ou(4,"\n\n "),_s(5,"div",5),ou(6,"\n "),_s(7,"div",6),ou(8,"\n "),_s(9,"div",7),ou(10,"\n "),_s(11,"select",8),ou(12,"\n "),_s(13,"option",9),ou(14),Vl(15,"translate"),ys(),ou(16,"\n "),_s(17,"option",9),ou(18),Vl(19,"translate"),ys(),ou(20,"\n "),ys(),ou(21,"\n "),ys(),ou(22,"\n "),ys(),ou(23,"\n "),ys(),ou(24,"\n\n "),fs(25,yE,3,3,"div",10),ou(26,"\n\n "),_s(27,"div",11),ou(28,"\n "),_s(29,"app-button",12),Ls("action",function(){return sn(n),As().closeModal()}),ou(30),Vl(31,"translate"),ys(),ou(32,"\n "),_s(33,"app-button",13),Ls("action",function(){return sn(n),As().startOperation()}),ou(34),Vl(35,"translate"),ys(),ou(36,"\n "),ys(),ou(37,"\n "),ys()}if(2&e){var i=As();Pa(2),gs("text",Ul(3,9,i.justCheckingSeed?"hardware-wallet.restore-seed.check-text":"hardware-wallet.restore-seed.text")),Pa(3),gs("formGroup",i.form),Pa(8),gs("ngValue",12),Pa(1),su(Ul(15,11,"wallet.new.12-words")),Pa(3),gs("ngValue",24),Pa(1),su(Ul(19,13,"wallet.new.24-words")),Pa(7),gs("ngIf",!i.justCheckingSeed),Pa(5),uu("\n ",Ul(31,15,"common.cancel-button"),"\n "),Pa(4),uu("\n ",Ul(35,17,"common.continue-button"),"\n ")}}function wE(e,t){if(1&e&&(bs(0,"app-hw-message",15),Vl(1,"translate")),2&e){var n=As();gs("text",Ul(1,2,n.justCheckingSeed?"hardware-wallet.general.follow":"hardware-wallet.general.confirm-and-more"))("icon",n.msgIcons.Confirm)}}function kE(e,t){if(1&e&&(bs(0,"app-hw-message",15),Vl(1,"translate")),2&e){var n=As();gs("text",Ul(1,2,n.result.text))("icon",n.result.icon)}}function ME(e,t){if(1&e){var n=Ss();_s(0,"div",11),ou(1,"\n "),_s(2,"app-button",13,16),Ls("action",function(){return sn(n),As().closeModal()}),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()}2&e&&(Pa(4),uu("\n ",Ul(5,1,"common.close-button"),"\n "))}var SE=function(e){function t(t,n,i,r){var a=e.call(this,i,n)||this;return a.data=t,a.dialogRef=n,a.hwWalletService=i,a.form=r.group({words:[24,rk.required]}),a.justCheckingSeed=!!a.data.wallet,a}return Vw(t,e),t.prototype.startOperation=function(){var e=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.recoverMnemonic(this.form.controls.words.value,this.justCheckingSeed).subscribe(function(){e.justCheckingSeed?e.showResult({text:"hardware-wallet.restore-seed.correct-seed",icon:e.msgIcons.Success}):(e.data.requestOptionsComponentRefresh(),e.closeModal())},function(t){return e.processHwOperationError(t)})},t.\u0275fac=function(e){return new(e||t)(ms(Tw),ms(xw),ms(Bw),ms(TM))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-restore-seed-dialog"]],features:[Jo],decls:16,vars:9,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],[1,"-select"],["formControlName","words","id","words"],[3,"ngValue"],["class","warning",4,"ngIf"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],[1,"warning"],[3,"text","icon"],["closeButton",""]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n\n "),ou(3,"\n "),fs(4,bE,38,19,"div",1),ou(5,"\n\n "),ou(6,"\n "),fs(7,wE,2,4,"app-hw-message",2),ou(8,"\n\n "),ou(9,"\n "),fs(10,kE,2,4,"app-hw-message",2),ou(11,"\n\n "),ou(12,"\n "),fs(13,ME,7,3,"div",3),ou(14,"\n"),ys(),ou(15,"\n")),2&e&&(gs("headline",Ul(1,7,t.justCheckingSeed?"hardware-wallet.options.confirm-seed":"hardware-wallet.options.restore-backup"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Processing),Pa(4),gs("ngIf",t.currentState===t.states.Initial),Pa(3),gs("ngIf",t.currentState===t.states.Processing),Pa(3),gs("ngIf",t.currentState===t.states.ShowingResult),Pa(3),gs("ngIf",t.currentState!==t.states.Initial&&t.currentState!==t.states.Processing))},directives:[AM,fh,jS,wk,pM,Ek,bk,wM,Pk,Rk,gC],pipes:[oS],styles:[".warning[_ngcontent-%COMP%]{margin-top:15px;color:#ff004e;text-align:center}"]}),t}(yC);function CE(e,t){if(1&e){var n=Ss();_s(0,"div"),ou(1,"\n "),bs(2,"app-hw-message",2),Vl(3,"translate"),ou(4,"\n\n "),_s(5,"div",3),ou(6,"\n "),_s(7,"mat-checkbox",4),Ls("change",function(e){return sn(n),As().setConfirmed(e)}),ou(8),Vl(9,"translate"),ys(),ou(10,"\n "),ys(),ou(11,"\n\n "),_s(12,"div",5),ou(13,"\n "),_s(14,"app-button",6),Ls("action",function(){return sn(n),As().closeModal()}),ou(15),Vl(16,"translate"),ys(),ou(17,"\n "),_s(18,"app-button",7),Ls("action",function(){return sn(n),As().requestRemoval()}),ou(19),Vl(20,"translate"),ys(),ou(21,"\n "),ys(),ou(22,"\n "),ys()}if(2&e){var i=As();Pa(2),gs("text",Ul(3,7,"hardware-wallet.remove-pin.warning"))("icon",i.msgIcons.Warning),Pa(5),gs("checked",i.confirmed),Pa(1),uu("",Ul(9,9,"common.generic-confirmation-check"),"\n "),Pa(7),uu("\n ",Ul(16,11,"common.cancel-button"),"\n "),Pa(3),gs("disabled",!i.confirmed),Pa(1),uu("\n ",Ul(20,13,"common.continue-button"),"\n ")}}function xE(e,t){if(1&e&&(bs(0,"app-hw-message",2),Vl(1,"translate")),2&e){var n=As(2);gs("text",Ul(1,2,"hardware-wallet.general.confirm"))("icon",n.msgIcons.Confirm)}}function LE(e,t){if(1&e&&(bs(0,"app-hw-message",2),Vl(1,"translate")),2&e){var n=As(2);gs("text",Ul(1,2,n.result.text))("icon",n.result.icon)}}function TE(e,t){if(1&e){var n=Ss();_s(0,"div",5),ou(1,"\n "),_s(2,"app-button",10,11),Ls("action",function(){return sn(n),As(2).closeModal()}),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()}2&e&&(Pa(4),uu("\n ",Ul(5,1,"common.close-button"),"\n "))}function DE(e,t){if(1&e&&(_s(0,"div"),ou(1,"\n "),ou(2,"\n "),fs(3,xE,2,4,"app-hw-message",8),ou(4,"\n\n "),ou(5,"\n "),fs(6,LE,2,4,"app-hw-message",8),ou(7,"\n\n "),ou(8,"\n "),fs(9,TE,7,3,"div",9),ou(10,"\n "),ys()),2&e){var n=As();Pa(3),gs("ngIf",n.currentState===n.states.Processing),Pa(3),gs("ngIf",n.currentState===n.states.ShowingResult),Pa(3),gs("ngIf",n.currentState!==n.states.Processing)}}var OE=function(e){function t(t,n,i){var r=e.call(this,i,n)||this;return r.data=t,r.dialogRef=n,r.hwWalletService=i,r.confirmed=!1,r}return Vw(t,e),t.prototype.setConfirmed=function(e){this.confirmed=e.checked},t.prototype.requestRemoval=function(){var e=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.removePin().subscribe(function(){e.showResult({text:"hardware-wallet.general.completed",icon:e.msgIcons.Success}),e.data.requestOptionsComponentRefresh(null,!0)},function(t){return e.processHwOperationError(t)})},t.\u0275fac=function(e){return new(e||t)(ms(Tw),ms(xw),ms(Bw))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-remove-pin-dialog"]],features:[Jo],decls:8,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon"],[1,"-check-container"],["type","checkbox",1,"-check",3,"checked","change"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"disabled","action"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,CE,23,15,"div",1),ou(5,"\n\n "),fs(6,DE,11,3,"div",1),ou(7,"\n"),ys()),2&e&&(gs("headline",Ul(1,5,"hardware-wallet.options.delete-pin"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Processing),Pa(4),gs("ngIf",t.currentState===t.states.Initial),Pa(2),gs("ngIf",t.currentState!==t.states.Initial))},directives:[AM,fh,jS,LD,gC],pipes:[oS],styles:[""]}),t}(yC);function EE(e,t){if(1&e){var n=Ss();_s(0,"div",7),ou(1,"\n "),_s(2,"mat-checkbox",8),Ls("change",function(e){return sn(n),As(2).setConfirmed(e)}),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ys()}if(2&e){var i=As(2);Pa(2),gs("checked",i.confirmed),Pa(1),uu("",Ul(4,2,"common.generic-confirmation-check"),"\n ")}}function PE(e,t){if(1&e){var n=Ss();_s(0,"div"),ou(1,"\n "),bs(2,"app-hw-message",2),Vl(3,"translate"),ou(4,"\n\n "),fs(5,EE,6,4,"div",3),ou(6,"\n\n "),_s(7,"div",4),ou(8,"\n "),_s(9,"app-button",5),Ls("action",function(){return sn(n),As().closeModal()}),ou(10),Vl(11,"translate"),ys(),ou(12,"\n "),_s(13,"app-button",6),Ls("action",function(){return sn(n),As().startUpdating()}),ou(14),Vl(15,"translate"),ys(),ou(16,"\n "),ys(),ou(17,"\n "),ys()}if(2&e){var i=As();Pa(2),gs("text",Ul(3,6,i.text))("icon",i.deviceHasFirmware?i.msgIcons.Warning:i.msgIcons.HardwareWallet),Pa(3),gs("ngIf",i.deviceHasFirmware),Pa(5),uu("\n ",Ul(11,8,"common.cancel-button"),"\n "),Pa(3),gs("disabled",i.deviceHasFirmware&&!i.confirmed),Pa(1),uu("\n ",Ul(15,10,"common.continue-button"),"\n ")}}function AE(e,t){if(1&e&&(bs(0,"app-hw-message",2),Vl(1,"translate")),2&e){var n=As(2);gs("text",Ul(1,2,"hardware-wallet.update-firmware.title-connecting"))("icon",n.msgIcons.Spinner)}}function YE(e,t){if(1&e&&(bs(0,"app-hw-message",2),Vl(1,"translate")),2&e){var n=As(2);gs("text",Ul(1,2,"hardware-wallet.update-firmware.follow"))("icon",n.msgIcons.Confirm)}}function IE(e,t){if(1&e&&(bs(0,"app-hw-message",2),Vl(1,"translate")),2&e){var n=As(2);gs("text",Ul(1,2,n.result.text))("icon",n.result.icon)}}function RE(e,t){if(1&e){var n=Ss();_s(0,"div",4),ou(1,"\n "),_s(2,"app-button",11,12),Ls("action",function(){return sn(n),As(2).closeModal()}),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()}2&e&&(Pa(4),uu("\n ",Ul(5,1,"common.close-button"),"\n "))}function FE(e,t){if(1&e&&(_s(0,"div"),ou(1,"\n "),ou(2,"\n "),fs(3,AE,2,4,"app-hw-message",9),ou(4,"\n\n "),ou(5,"\n "),fs(6,YE,2,4,"app-hw-message",9),ou(7,"\n\n "),ou(8,"\n "),fs(9,IE,2,4,"app-hw-message",9),ou(10,"\n\n "),ou(11,"\n "),fs(12,RE,7,3,"div",10),ou(13,"\n "),ys()),2&e){var n=As();Pa(3),gs("ngIf",n.currentState===n.states.Connecting),Pa(3),gs("ngIf",n.currentState===n.states.Processing),Pa(3),gs("ngIf",n.currentState===n.states.ShowingResult),Pa(3),gs("ngIf",n.currentState!==n.states.Processing)}}var HE=function(e){function t(t,n,i){var r=e.call(this,n,t)||this;return r.dialogRef=t,r.hwWalletService=n,r.msgBarService=i,r.closeIfHwDisconnected=!1,r.currentState=r.states.Connecting,r.confirmed=!1,r.deviceInBootloaderMode=!1,r.deviceHasFirmware=!0,r.checkDevice(!1),r}return Vw(t,e),Object.defineProperty(t.prototype,"title",{get:function(){return this.currentState===this.states.Connecting?"hardware-wallet.update-firmware.title-connecting":this.deviceHasFirmware?"hardware-wallet.update-firmware.title-update":"hardware-wallet.update-firmware.title-install"},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"text",{get:function(){return this.deviceHasFirmware?this.deviceInBootloaderMode?"hardware-wallet.update-firmware.text-bootloader":"hardware-wallet.update-firmware.text-not-bootloader":"hardware-wallet.update-firmware.text-no-firmware"},enumerable:!1,configurable:!0}),t.openDialog=function(e){var n=new bw;return n.autoFocus=!1,n.width="450px",e.open(t,n)},t.prototype.ngOnDestroy=function(){e.prototype.ngOnDestroy.call(this),this.msgBarService.hide(),this.closeCheckDeviceSubscription()},t.prototype.setConfirmed=function(e){this.confirmed=e.checked},t.prototype.startUpdating=function(){var e=this;this.msgBarService.hide(),this.showResult({text:"hardware-wallet.update-firmware.text-downloading",icon:this.msgIcons.Spinner}),this.closeCheckDeviceSubscription(),this.operationSubscription=this.hwWalletService.updateFirmware(function(){return e.currentState=e.states.Processing}).subscribe(function(){e.showResult({text:"hardware-wallet.update-firmware.finished",icon:e.msgIcons.Success})},function(t){(t=Hp(t)).type===Rp.Success?e.showResult({text:"hardware-wallet.update-firmware.finished",icon:e.msgIcons.Success}):t.type===Rp.Timeout?e.showResult({text:"hardware-wallet.update-firmware.timeout",icon:e.msgIcons.Error}):(setTimeout(function(){e.msgBarService.showError(t)}),e.checkDevice(!1),e.currentState=e.states.Initial)})},t.prototype.checkDevice=function(e){var t=this;void 0===e&&(e=!0),this.closeCheckDeviceSubscription(),this.checkDeviceSubscription=xf(0).pipe(Of(e?1e3:0),ue(function(){return t.hwWalletService.getFeatures(!1)})).subscribe(function(e){t.deviceInBootloaderMode=e.rawResponse.bootloader_mode,t.deviceHasFirmware=!t.deviceInBootloaderMode||e.rawResponse.firmware_present,t.currentState===t.states.Connecting&&(t.currentState=t.states.Initial),t.checkDevice()},function(){t.deviceInBootloaderMode=!1,t.deviceHasFirmware=!0,t.currentState===t.states.Connecting&&(t.currentState=t.states.Initial),t.checkDevice()})},t.prototype.closeCheckDeviceSubscription=function(){this.checkDeviceSubscription&&this.checkDeviceSubscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(ms(xw),ms(Bw),ms(HC))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-update-firmware-dialog"]],features:[Jo],decls:8,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon"],["class","-check-container",4,"ngIf"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"disabled","action"],[1,"-check-container"],["type","checkbox",1,"-check",3,"checked","change"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,PE,18,12,"div",1),ou(5,"\n\n "),fs(6,FE,14,4,"div",1),ou(7,"\n"),ys()),2&e&&(gs("headline",Ul(1,5,t.title))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Processing),Pa(4),gs("ngIf",t.currentState===t.states.Initial),Pa(2),gs("ngIf",t.currentState!==t.states.Initial))},directives:[AM,fh,jS,gC,LD],pipes:[oS],styles:[""]}),t}(yC),jE=function(e){function t(t,n){var i=e.call(this,n,t)||this;return i.dialogRef=t,i}return Vw(t,e),t.openDialog=function(e){var n=new bw;return n.autoFocus=!1,n.width="450px",e.open(t,n)},t.prototype.update=function(){this._dialogRef.close(!0)},t.\u0275fac=function(e){return new(e||t)(ms(xw),ms(Bw))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-update-alert-dialog"]],features:[Jo],decls:18,vars:14,consts:[[3,"headline","dialog"],[3,"text","icon"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),bs(3,"app-hw-message",1),Vl(4,"translate"),ou(5,"\n\n "),_s(6,"div",2),ou(7,"\n "),_s(8,"app-button",3),Ls("action",function(){return t.closeModal()}),ou(9),Vl(10,"translate"),ys(),ou(11,"\n "),_s(12,"app-button",4),Ls("action",function(){return t.update()}),ou(13),Vl(14,"translate"),ys(),ou(15,"\n "),ys(),ou(16,"\n"),ys(),ou(17,"\n")),2&e&&(gs("headline",Ul(1,6,"hardware-wallet.update-firmware-warning.title"))("dialog",t.dialogRef),Pa(3),gs("text",Ul(4,8,"hardware-wallet.update-firmware-warning.text"))("icon",t.msgIcons.Warning),Pa(6),uu("\n ",Ul(10,10,"common.cancel-button"),"\n "),Pa(4),uu("\n ",Ul(14,12,"hardware-wallet.update-firmware-warning.update"),"\n "))},directives:[AM,jS,gC],pipes:[oS],styles:[""]}),t}(yC);function NE(e,t){if(1&e&&(bs(0,"app-hw-message",7),Vl(1,"translate"),Vl(2,"translate")),2&e){var n=As();gs("text",Ul(1,6,n.result.text))("linkText",n.result.linkText?Ul(2,8,n.result.linkText):null)("link",n.result.link)("linkIsUrl",!0)("linkIsInternal",n.result.linkIsInternal)("icon",n.result.icon)}}function BE(e,t){if(1&e){var n=Ss();_s(0,"app-hw-message",8),Ls("linkClicked",function(){return sn(n),As().wipe()}),Vl(1,"translate"),Vl(2,"translate"),Vl(3,"translate"),ys()}if(2&e){var i=As();gs("text",Ul(1,3,"hardware-wallet.errors.refused")+" "+Ul(2,5,"hardware-wallet.options.forgotten-pin-part1"))("linkText",Ul(3,7,"hardware-wallet.options.forgotten-pin-part2"))("icon",i.msgIcons.Error)}}function WE(e,t){if(1&e){var n=Ss();_s(0,"app-hw-message",8),Ls("linkClicked",function(){return sn(n),As().wipe()}),Vl(1,"translate"),Vl(2,"translate"),Vl(3,"translate"),ys()}if(2&e){var i=As();gs("text",Ul(1,3,"hardware-wallet.errors.incorrect-pin")+" "+Ul(2,5,"hardware-wallet.options.forgotten-pin-part1"))("linkText",Ul(3,7,"hardware-wallet.options.forgotten-pin-part2"))("icon",i.msgIcons.Error)}}function VE(e,t){if(1&e&&(bs(0,"app-hw-message",17),Vl(1,"translate"),Vl(2,"translate"),Vl(3,"translate")),2&e){var n=As(2);gs("upperBigText",Ul(1,4,"hardware-wallet.options.unconfigured-detected-title"))("lowerLightText",Ul(2,6,"hardware-wallet.options.firmware-version")+" "+n.firmwareVersion)("text",Ul(3,8,"hardware-wallet.options.unconfigured-detected"))("icon",n.msgIcons.HardwareWallet)}}function UE(e,t){if(1&e&&(bs(0,"app-hw-message",18),Vl(1,"translate"),Vl(2,"translate")),2&e){var n=As(2);gs("text",Ul(1,4,"hardware-wallet.options.configured-detected"))("lowerLightText",Ul(2,6,"hardware-wallet.options.firmware-version")+" "+n.firmwareVersion)("lowerBigText",n.wallet.label)("icon",n.msgIcons.HardwareWallet)}}function zE(e,t){1&e&&bs(0,"br")}function qE(e,t){if(1&e&&(ws(0),ou(1,"\n "),_s(2,"div"),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),fs(6,zE,1,0,"br",16),ou(7,"\n "),ks()),2&e){var n=t.$implicit,i=t.index,r=As(3);Pa(3),lu("",r.securityWarnings.length>1?i+1+")":""," ",Ul(4,3,n),""),Pa(3),gs("ngIf",i1?"hardware-wallet.options.security-warnings-title":"hardware-wallet.options.security-warning-title")),Pa(3),gs("ngForOf",n.securityWarnings)}}function KE(e,t){if(1&e){var n=Ss();_s(0,"button",22),Ls("click",function(){return sn(n),As(2).update()}),ou(1,"\n "),_s(2,"div",23),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ys()}2&e&&(Pa(3),su(Ul(4,1,"hardware-wallet.options.update-firmware")))}function JE(e,t){if(1&e){var n=Ss();_s(0,"div"),ou(1,"\n "),_s(2,"button",22),Ls("click",function(){return sn(n),As(2).generateMnemonic()}),ou(3,"\n "),_s(4,"div",24),ou(5),Vl(6,"translate"),ys(),ou(7,"\n "),ys(),ou(8,"\n "),_s(9,"button",22),Ls("click",function(){return sn(n),As(2).restoreMnemonic()}),ou(10,"\n "),_s(11,"div",24),ou(12),Vl(13,"translate"),ys(),ou(14,"\n "),ys(),ou(15,"\n "),ys()}2&e&&(Pa(5),su(Ul(6,2,"hardware-wallet.options.configure-automatically")),Pa(7),su(Ul(13,4,"hardware-wallet.options.restore-backup")))}function ZE(e,t){if(1&e){var n=Ss();_s(0,"button",22),Ls("click",function(){return sn(n),As(3).backup()}),ou(1,"\n "),_s(2,"div",24),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ys()}2&e&&(Pa(3),su(Ul(4,1,"hardware-wallet.options.create-backup")))}function QE(e,t){if(1&e){var n=Ss();_s(0,"button",22),Ls("click",function(){return sn(n),As(3).confirmSeed()}),ou(1,"\n "),_s(2,"div",24),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ys()}2&e&&(Pa(3),su(Ul(4,1,"hardware-wallet.options.confirm-seed")))}function XE(e,t){if(1&e){var n=Ss();_s(0,"button",22),Ls("click",function(){return sn(n),As(3).removePin()}),ou(1,"\n "),_s(2,"div",25),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ys()}2&e&&(Pa(3),su(Ul(4,1,"hardware-wallet.options.delete-pin")))}function $E(e,t){if(1&e){var n=Ss();_s(0,"div"),ou(1,"\n "),fs(2,ZE,6,3,"button",15),ou(3,"\n "),fs(4,QE,6,3,"button",15),ou(5,"\n "),_s(6,"button",22),Ls("click",function(){return sn(n),As(2).changePin()}),ou(7,"\n "),_s(8,"div",24),ou(9),Vl(10,"translate"),ys(),ou(11,"\n "),ys(),ou(12,"\n "),fs(13,XE,6,3,"button",15),ou(14,"\n "),_s(15,"button",22),Ls("click",function(){return sn(n),As(2).wipe()}),ou(16,"\n "),_s(17,"div",25),ou(18),Vl(19,"translate"),ys(),ou(20,"\n "),ys(),ou(21,"\n "),ys()}if(2&e){var i=As(2);Pa(2),gs("ngIf",i.needsBackup),Pa(2),gs("ngIf",!i.needsBackup),Pa(5),su(Ul(10,5,i.needsPin?"hardware-wallet.options.create-pin":"hardware-wallet.options.change-pin")),Pa(4),gs("ngIf",!i.needsPin),Pa(5),su(Ul(19,7,"hardware-wallet.options.wipe"))}}var eP=function(e){return{disabled:e}};function tP(e,t){if(1&e&&(_s(0,"div",9),ou(1,"\n "),fs(2,VE,4,10,"app-hw-message",10),ou(3,"\n\n "),fs(4,UE,3,8,"app-hw-message",11),ou(5,"\n\n "),fs(6,GE,14,4,"div",12),ou(7,"\n\n "),_s(8,"div",13),ou(9),Vl(10,"translate"),ys(),ou(11,"\n "),_s(12,"div",14),ou(13,"\n "),fs(14,KE,6,3,"button",15),ou(15,"\n "),fs(16,JE,16,6,"div",16),ou(17,"\n "),fs(18,$E,22,9,"div",16),ou(19,"\n "),ys(),ou(20,"\n "),ys()),2&e){var n=As();gs("ngClass",Rl(10,eP,n.refreshingWarnings)),Pa(2),gs("ngIf",n.newWalletConnected),Pa(2),gs("ngIf",!n.newWalletConnected),Pa(2),gs("ngIf",n.securityWarnings.length>0),Pa(3),su(Ul(10,8,"hardware-wallet.options.options")),Pa(5),gs("ngIf",n.outdatedFirmware),Pa(2),gs("ngIf",n.newWalletConnected),Pa(2),gs("ngIf",!n.newWalletConnected)}}function nP(e,t){1&e&&(_s(0,"div",26),ou(1,"\n "),bs(2,"mat-spinner"),ou(3),Vl(4,"translate"),ys()),2&e&&(Pa(3),uu("\n ",Ul(4,1,"common.loading"),"\n "))}function iP(e,t){if(1&e){var n=Ss();_s(0,"div",27),ou(1,"\n "),_s(2,"app-button",28),Ls("action",function(){return sn(n),As().closeModal()}),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ys()}if(2&e){var i=As();gs("ngClass",Rl(4,eP,i.refreshingWarnings)),Pa(3),uu("\n ",Ul(4,2,"common.close-button"),"\n ")}}function rP(e,t){if(1&e){var n=Ss();_s(0,"div",29),ou(1,"\n "),_s(2,"app-button",28,30),Ls("action",function(){return sn(n),As().closeModal()}),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()}2&e&&(Pa(4),uu("\n ",Ul(5,1,"common.close-button"),"\n "))}var aP=function(e){function t(t,n,i,r,a,o,s){var u=e.call(this,i,n)||this;return u.onboarding=t,u.dialogRef=n,u.hwWalletService=i,u.dialog=r,u.msgBarService=a,u.hardwareWalletService=o,u.walletsAndAddressesService=s,u.closeIfHwDisconnected=!1,u.newWalletConnected=!1,u.otherStateBecauseWrongPin=!1,u.firmwareVersion="",u.securityWarnings=[],u.refreshingWarnings=!1,u.completeRecheckRequested=!1,u.recheckSecurityOnlyRequested=!1,u.showErrorRequested=!1,u.customErrorMsg="",u.checkWallet(!0),u}return Vw(t,e),t.openDialog=function(e,n){var i=new bw;return i.data=n,i.autoFocus=!1,i.width=zp.mediumModalWidth,e.open(t,i)},t.prototype.ngOnDestroy=function(){e.prototype.ngOnDestroy.call(this),this.removeDialogSubscription(),this.removeOperationSubscription(),this.msgBarService.hide()},t.prototype.hwConnectionChanged=function(e){this.checkWallet(!0)},t.prototype.update=function(){this.openUpdateDialog()},t.prototype.generateMnemonic=function(){this.openDialog(uE)},t.prototype.restoreMnemonic=function(){this.openDialog(SE)},t.prototype.changePin=function(){this.openDialog(_E)},t.prototype.removePin=function(){this.openDialog(OE)},t.prototype.backup=function(){this.openDialog(pE)},t.prototype.wipe=function(){this.openDialog(jO)},t.prototype.confirmSeed=function(){this.openDialog(SE)},t.prototype.openDialog=function(e){var t=this;this.customErrorMsg="",this.removeDialogSubscription();var n=new bw;n.width="450px",n.autoFocus=!1,n.data={wallet:this.wallet,walletHasPin:!this.needsPin,requestOptionsComponentRefresh:function(e,n){void 0===e&&(e=null),void 0===n&&(n=!1),e?(t.showErrorRequested=!0,t.customErrorMsg=e):n?t.recheckSecurityOnlyRequested=!0:t.completeRecheckRequested=!0}},this.dialogSubscription=this.dialog.open(e,n).afterClosed().subscribe(function(){t.completeRecheckRequested?t.checkWallet():t.recheckSecurityOnlyRequested?t.updateSecurityWarningsAndData().subscribe():t.showErrorRequested&&t.showError(),t.completeRecheckRequested=!1,t.recheckSecurityOnlyRequested=!1,t.showErrorRequested=!1})},t.prototype.removeDialogSubscription=function(){this.dialogSubscription&&this.dialogSubscription.unsubscribe()},t.prototype.updateSecurityWarningsAndData=function(){var e=this;return xf(1).pipe(Gg(function(){return e.refreshingWarnings=!0}),ue(function(){return e.hardwareWalletService.getFeaturesAndUpdateData(e.wallet)}),ie(function(t){return e.refreshingWarnings=!1,e.securityWarnings=[],t.securityWarnings.includes(BO.FirmwareVersionNotVerified)?(e.firmwareVersionNotVerified=!0,e.securityWarnings.push("hardware-wallet.options.unchecked-version-warning")):e.firmwareVersionNotVerified=!1,t.securityWarnings.includes(BO.OutdatedFirmware)?(e.outdatedFirmware=!0,e.securityWarnings.push("hardware-wallet.options.outdated-version-warning")):e.outdatedFirmware=!1,e.wallet&&t.securityWarnings.includes(BO.NeedsBackup)?(e.needsBackup=!0,e.securityWarnings.push("hardware-wallet.options.backup-warning")):e.needsBackup=!1,e.wallet&&t.securityWarnings.includes(BO.NeedsPin)?(e.needsPin=!0,e.securityWarnings.push("hardware-wallet.options.pin-warning")):e.needsPin=!1,t.walletNameUpdated&&e.msgBarService.showWarning("hardware-wallet.general.name-updated"),e.firmwareVersion=t.features.fw_major+"."+t.features.fw_minor+"."+t.features.fw_patch,t}))},t.prototype.checkWallet=function(e){var t=this;void 0===e&&(e=!1),this.wallet=null,this.showResult({text:"hardware-wallet.options.connecting",icon:this.msgIcons.Spinner},!1),this.removeOperationSubscription(),this.operationSubscription=this.hwWalletService.getDeviceConnected().subscribe(function(n){n?t.operationSubscription=t.hwWalletService.getFeatures(!1).subscribe(function(n){n.rawResponse.bootloader_mode?t.openUpdateDialog():t.continueCheckingWallet(e)},function(){return t.continueCheckingWallet(e)}):t.showResult({text:"hardware-wallet.options.disconnected",icon:t.msgIcons.Usb})},function(e){t.processHwOperationError(e)})},t.prototype.continueCheckingWallet=function(e){var t=this;this.operationSubscription=this.hwWalletService.getAddresses(1,0).subscribe(function(n){t.operationSubscription=t.walletsAndAddressesService.allWallets.pipe(ep()).subscribe(function(i){i.some(function(e){var i=e.addresses[0].address===n.rawResponse[0]&&e.isHardware;return i&&(t.wallet=e),i})?t.operationSubscription=t.updateSecurityWarningsAndData().subscribe(function(n){e&&n.securityWarnings.find(function(e){return e===BO.OutdatedFirmware})&&t.openUpdateWarning(),t.onboarding?(t.hwWalletService.showOptionsWhenPossible=!0,t.dialogRef.close(!0)):(t.currentState=t.states.Finished,t.newWalletConnected=!1)},function(e){return t.processHwOperationError(e)}):t.openDialog(iE)})},function(n){(n=Hp(n)).type===Rp.WithoutSeed?t.operationSubscription=t.updateSecurityWarningsAndData().subscribe(function(n){t.currentState=t.states.Finished,t.newWalletConnected=!0,e&&n.securityWarnings.find(function(e){return e===BO.OutdatedFirmware})&&t.openUpdateWarning()},function(e){return t.processHwOperationError(e)}):n.type===Rp.FailedOrRefused?(t.currentState=t.states.Other,t.otherStateBecauseWrongPin=!1):n.type===Rp.WrongPin?(t.currentState=t.states.Other,t.otherStateBecauseWrongPin=!0):t.processHwOperationError(n)})},t.prototype.removeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},t.prototype.openUpdateWarning=function(){var e=this;jE.openDialog(this.dialog).afterClosed().subscribe(function(t){t&&e.openUpdateDialog()})},t.prototype.openUpdateDialog=function(){HE.openDialog(this.dialog),this.closeModal()},t.prototype.showError=function(){this.showResult({text:this.customErrorMsg?this.customErrorMsg:"hardware-wallet.errors.generic-error",icon:this.msgIcons.Error}),this.customErrorMsg=""},t.\u0275fac=function(e){return new(e||t)(ms(Tw),ms(xw),ms(Bw),ms(Aw),ms(HC),ms(WO),ms(ix))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-options-dialog"]],features:[Jo],decls:18,vars:11,consts:[[3,"headline","dialog"],[3,"text","linkText","link","linkIsUrl","linkIsInternal","icon",4,"ngIf"],[3,"text","linkText","icon","linkClicked",4,"ngIf"],[3,"ngClass",4,"ngIf"],["class","loading-indicator",4,"ngIf"],["class","-buttons",3,"ngClass",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","linkText","link","linkIsUrl","linkIsInternal","icon"],[3,"text","linkText","icon","linkClicked"],[3,"ngClass"],[3,"upperBigText","lowerLightText","text","icon",4,"ngIf"],[3,"text","lowerLightText","lowerBigText","icon",4,"ngIf"],["class","alert-box",4,"ngIf"],[1,"options-label"],[1,"option-buttons-container","light-button-theme"],["mat-button","","color","primary",3,"click",4,"ngIf"],[4,"ngIf"],[3,"upperBigText","lowerLightText","text","icon"],[3,"text","lowerLightText","lowerBigText","icon"],[1,"alert-box"],[1,"title"],[4,"ngFor","ngForOf"],["mat-button","","color","primary",3,"click"],[1,"label","-blinking"],[1,"label"],[1,"label","red-text"],[1,"loading-indicator"],[1,"-buttons",3,"ngClass"],[1,"primary-button",3,"action"],[1,"-buttons"],["closeButton",""]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),fs(3,NE,3,10,"app-hw-message",1),ou(4,"\n\n "),fs(5,BE,4,9,"app-hw-message",2),ou(6,"\n\n "),fs(7,WE,4,9,"app-hw-message",2),ou(8,"\n\n "),fs(9,tP,21,12,"div",3),ou(10,"\n\n "),fs(11,nP,5,3,"div",4),ou(12,"\n\n "),fs(13,iP,6,6,"div",5),ou(14,"\n\n "),fs(15,rP,7,3,"div",6),ou(16,"\n"),ys(),ou(17,"\n")),2&e&&(gs("headline",Ul(1,9,"wallet.hardware-wallet-button"))("dialog",t.dialogRef),Pa(3),gs("ngIf",t.currentState===t.states.ShowingResult),Pa(2),gs("ngIf",t.currentState===t.states.Other&&!t.otherStateBecauseWrongPin),Pa(2),gs("ngIf",t.currentState===t.states.Other&&t.otherStateBecauseWrongPin),Pa(2),gs("ngIf",t.currentState===t.states.Finished),Pa(2),gs("ngIf",t.currentState===t.states.Finished&&t.refreshingWarnings),Pa(2),gs("ngIf",t.currentState===t.states.Finished),Pa(2),gs("ngIf",t.currentState!==t.states.Finished))},directives:[AM,fh,jS,lh,uC,dh,US,vS,gC],pipes:[oS],styles:[".alert-box[_ngcontent-%COMP%], .options-label[_ngcontent-%COMP%]{margin-top:25px}.options-label[_ngcontent-%COMP%]{margin-bottom:10px;font-weight:700}.option-buttons-container[_ngcontent-%COMP%]{margin:0 -10px}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid rgba(30,34,39,.05)}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:first-child{border-top:1px solid rgba(30,34,39,.05)}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}.-blinking[_ngcontent-%COMP%]{-webkit-animation:alert-blinking 1s linear infinite;animation:alert-blinking 1s linear infinite}.loading-indicator[_ngcontent-%COMP%]{width:100px;height:40px;left:calc(50% - 50px);top:calc(50% - 20px);position:absolute;display:flex;justify-content:center;align-items:center}.loading-indicator[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{margin-left:7px;margin-right:12px}.loading-indicator[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%], .loading-indicator[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:18px!important;width:18px!important}.loading-indicator[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg circle{stroke:rgba(30,34,39,.2)}.disabled[_ngcontent-%COMP%]{opacity:.3;cursor:default;pointer-events:none}"]}),t}(yC);function oP(e,t){1&e&&(bs(0,"img",28),Vl(1,"translate")),2&e&&gs("matTooltip",Ul(1,1,"wallet.encryption-enabled"))}function sP(e,t){1&e&&(bs(0,"img",29),Vl(1,"translate")),2&e&&gs("matTooltip",Ul(1,1,"wallet.encryption-disabled"))}function uP(e,t){1&e&&(bs(0,"img",30),Vl(1,"translate")),2&e&&gs("matTooltip",Ul(1,1,"wallet.warning-hw-security"))}function lP(e,t){1&e&&bs(0,"app-wallet-detail",31),2&e&&gs("wallet",As().$implicit)}var cP=function(e,t){return{"rotate-270":e,"rotate-90":t}};function dP(e,t){if(1&e){var n=Ss();_s(0,"div",16),ou(1,"\n "),_s(2,"div",17),ou(3,"\n "),_s(4,"div",18),Ls("click",function(){sn(n);var e=t.$implicit;return As(3).toggleWallet(e)}),ou(5,"\n "),ou(6,"\n "),_s(7,"div",19),ou(8),ys(),ou(9,"\n "),ou(10,"\n "),_s(11,"div",20),ou(12,"\n "),fs(13,oP,2,3,"img",21),ou(14,"\n "),fs(15,sP,2,3,"img",22),ou(16,"\n "),fs(17,uP,2,3,"img",23),ou(18,"\n "),ys(),ou(19,"\n "),ou(20,"\n "),_s(21,"div",13),ou(22),Vl(23,"amount"),ys(),ou(24,"\n "),_s(25,"div",24),ou(26),Vl(27,"amount"),ys(),ou(28,"\n "),ou(29,"\n "),_s(30,"div",25),ou(31,"\n "),bs(32,"img",26),ou(33,"\n "),ys(),ou(34,"\n "),ys(),ou(35,"\n "),ou(36,"\n "),fs(37,lP,1,1,"app-wallet-detail",27),ou(38,"\n "),ys(),ou(39,"\n "),ys()}if(2&e){var i=t.$implicit,r=As(3);Pa(7),cs("title",i.label),Pa(1),su(i.label),Pa(5),gs("ngIf",i.encrypted&&!i.isHardware),Pa(2),gs("ngIf",!i.encrypted&&!i.isHardware),Pa(2),gs("ngIf",i.hasHwSecurityWarnings&&i.isHardware),Pa(5),su(ql(23,9,i.coins?i.coins:0,!0,"first")),Pa(4),su(ql(27,13,i.hours?i.hours:0,!1,"first")),Pa(6),gs("ngClass",Fl(17,cP,r.walletsOpenedState.get(i.id),!r.walletsOpenedState.get(i.id))),Pa(5),gs("ngIf",r.walletsOpenedState.get(i.id))}}function hP(e,t){if(1&e&&(ws(0),ou(1,"\n "),ou(2,"\n "),_s(3,"div",10),ou(4,"\n "),_s(5,"div",11),ou(6),Vl(7,"translate"),ys(),ou(8,"\n "),bs(9,"div",12),ou(10,"\n "),_s(11,"div",13),ou(12),Vl(13,"commonText"),ys(),ou(14,"\n "),_s(15,"div",13),ou(16),Vl(17,"commonText"),ys(),ou(18,"\n "),bs(19,"div",14),ou(20,"\n "),ys(),ou(21,"\n\n "),ou(22,"\n "),fs(23,dP,40,20,"div",15),ou(24,"\n "),ks()),2&e){var n=As().$implicit,i=As();Pa(6),su(Ul(7,4,0===n?"wallet.hardware-wallet-table-label":"wallet.wallet-table-label")),Pa(6),su(Ul(13,6,"coin")),Pa(4),su(Ul(17,8,"hours")),Pa(7),gs("ngForOf",0===n?i.hardwareWallets:i.wallets)}}function fP(e,t){if(1&e&&(_s(0,"div",8),ou(1,"\n "),fs(2,hP,25,10,"ng-container",9),ou(3,"\n "),ys()),2&e){var n=t.$implicit,i=As();Pa(2),gs("ngIf",0===n&&i.hardwareWallets.length>0||1===n&&i.wallets.length>0)}}function pP(e,t){if(1&e){var n=Ss();_s(0,"button",4),Ls("click",function(){return sn(n),As().adminHwWallet()}),ou(1,"\n "),bs(2,"img",32),ou(3),Vl(4,"translate"),ys()}2&e&&(Pa(3),uu(" ",Ul(4,1,"wallet.hardware-wallet-button"),"\n "))}var mP=function(){return[0,1]},gP=function(){function e(e,t,n,i,r){var a=this;this.hwWalletService=e,this.dialog=t,this.router=n,this.walletsAndAddressesService=i,this.balanceAndOutputsService=r,this.hwCompatibilityActivated=!1,this.wallets=[],this.hardwareWallets=[],this.walletsOpenedState=new Map,this.hwCompatibilityActivated=this.hwWalletService.hwWalletCompatibilityActivated,this.subscription=this.balanceAndOutputsService.walletsWithBalance.subscribe(function(e){a.wallets=[],a.hardwareWallets=[];var t=new Map;e.forEach(function(e){t.set(e.id,!0),e.isHardware?a.hardwareWallets.push(e):a.wallets.push(e),a.walletsOpenedState.has(e.id)||a.walletsOpenedState.set(e.id,!1)});var n=[];a.walletsOpenedState.forEach(function(e,i){t.has(i)||n.push(i)}),n.forEach(function(e){a.walletsOpenedState.delete(e)})})}return e.prototype.ngOnInit=function(){var e=this;this.hwWalletService.showOptionsWhenPossible&&setTimeout(function(){e.hwWalletService.showOptionsWhenPossible=!1,e.adminHwWallet()})},e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe(),e.busy=!1},e.prototype.addWallet=function(e){PO.openDialog(this.dialog,{create:e})},e.prototype.adminHwWallet=function(){var e=this;aP.openDialog(this.dialog,!1).afterClosed().subscribe(function(){e.walletsAndAddressesService.allWallets.pipe(ep()).subscribe(function(t){0===t.length&&setTimeout(function(){return e.router.navigate(["/wizard"])},500)})})},e.prototype.toggleWallet=function(e){var t=this;if(e.isHardware&&e.hasHwSecurityWarnings&&!e.stopShowingHwSecurityPopup&&!this.walletsOpenedState.get(e.id)){var n={headerText:"hardware-wallet.security-warning.title",text:"hardware-wallet.security-warning.text",checkboxText:"common.generic-confirmation-check",defaultButtons:YD.ContinueCancel,linkText:"hardware-wallet.security-warning.link",linkFunction:this.adminHwWallet.bind(this)};ID.openDialog(this.dialog,n).afterClosed().subscribe(function(n){n&&(e.stopShowingHwSecurityPopup=!0,t.walletsAndAddressesService.informValuesUpdated(e),t.walletsOpenedState.set(e.id,!0))})}else this.walletsOpenedState.set(e.id,!this.walletsOpenedState.get(e.id))},e.busy=!1,e.\u0275fac=function(t){return new(t||e)(ms(Bw),ms(Aw),ms(WT),ms(ix),ms(LO))},e.\u0275cmp=lt({type:e,selectors:[["app-wallets"]],decls:30,vars:12,consts:[[3,"headline"],[1,"container"],["class","-table",4,"ngFor","ngForOf"],[1,"action-buttons"],["mat-button","",3,"click"],["src","assets/img/plus-gold.png"],["src","assets/img/load-gold.png"],["mat-button","",3,"click",4,"ngIf"],[1,"-table"],[4,"ngIf"],[1,"-headers"],[1,"-width-250","text-truncate"],[1,"-flex-fill"],[1,"-width-130","text-right"],[1,"-width-85"],["class","e2e-wallets",4,"ngFor","ngForOf"],[1,"e2e-wallets"],[1,"-body"],[1,"-row",3,"click"],[1,"-width-250","text-truncate","e2e-label"],[1,"-flex-fill","-encryption","d-flex"],["src","assets/img/lock-gold.png",3,"matTooltip",4,"ngIf"],["src","assets/img/unlock-grey.png",3,"matTooltip",4,"ngIf"],["src","assets/img/alert-red.png",3,"matTooltip",4,"ngIf"],[1,"-width-130","text-right","grey-text"],[1,"-width-85","-expand"],["src","assets/img/chevron-right-grey.png",3,"ngClass"],[3,"wallet",4,"ngIf"],["src","assets/img/lock-gold.png",3,"matTooltip"],["src","assets/img/unlock-grey.png",3,"matTooltip"],["src","assets/img/alert-red.png",3,"matTooltip"],[3,"wallet"],["src","assets/img/hw-gold.png"]],template:function(e,t){1&e&&(_s(0,"div"),ou(1,"\n "),bs(2,"app-header",0),Vl(3,"translate"),ou(4,"\n\n "),_s(5,"div",1),ou(6,"\n "),ou(7,"\n "),fs(8,fP,4,1,"div",2),ou(9,"\n\n "),ou(10,"\n "),_s(11,"div",3),ou(12,"\n "),_s(13,"button",4),Ls("click",function(){return t.addWallet(!0)}),ou(14,"\n "),bs(15,"img",5),ou(16),Vl(17,"translate"),ys(),ou(18,"\n "),_s(19,"button",4),Ls("click",function(){return t.addWallet(!1)}),ou(20,"\n "),bs(21,"img",6),ou(22),Vl(23,"translate"),ys(),ou(24,"\n "),fs(25,pP,5,3,"button",7),ou(26,"\n "),ys(),ou(27,"\n "),ys(),ou(28,"\n"),ys(),ou(29,"\n")),2&e&&(Pa(2),gs("headline",Ul(3,5,"wallet.title-and-button")),Pa(6),gs("ngForOf",Il(11,mP)),Pa(8),uu(" ",Ul(17,7,"wallet.add-button"),"\n "),Pa(6),uu(" ",Ul(23,9,"wallet.load-button"),"\n "),Pa(3),gs("ngIf",t.hwCompatibilityActivated))},styles:[".-width-85[_ngcontent-%COMP%]{padding-right:20px!important}.-width-250[_ngcontent-%COMP%]{padding-left:20px!important}@media (max-width:991px){.-width-250[_ngcontent-%COMP%]{width:200px;flex-shrink:0}}.-headers[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0}.-body[_ngcontent-%COMP%]{margin-bottom:10px;color:#1e2227;background-color:transparent!important}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]{font-size:13px;line-height:60px;height:60px;background-color:#fafafa;cursor:pointer}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-hours[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);text-align:right}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{text-align:right}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%]{padding-left:20px!important}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{border-radius:50%;background-color:#f7f7f7;display:inline-block;height:38px;padding:3px;width:38px}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px;height:32px;opacity:.7}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]:hover{background-color:#f7f7f7}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]:hover .-expand[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{opacity:1}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]:hover .-encryption[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{background-color:#f4f4f4}.action-buttons[_ngcontent-%COMP%]{padding:40px 0;text-align:center}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:13px;margin:0 5px;min-width:140px}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:28px;margin-left:-4px;width:28px}.rotate-90[_ngcontent-%COMP%]{transform:rotate(90deg)}.rotate-270[_ngcontent-%COMP%]{transform:rotate(270deg)}"]}),e}(),vP=function(e){return e.Default="default",e.Exchange="exchange",e}({}),_P=function(){function e(e,t){this.apiService=e,this.ngZone=t,this.noConnections=!1,this.updatePeriod=5e3,this.errorUpdatePeriod=5e3,this.connectionsSubject=new Gp([]),this.startDataRefreshSubscription(0)}return e.prototype.connections=function(){return this.connectionsSubject.asObservable()},e.prototype.startDataRefreshSubscription=function(e){var t=this;this.dataRefreshSubscription&&this.dataRefreshSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){t.dataRefreshSubscription=xf(0).pipe(Of(e),ue(function(){return t.trustedAddresses?xf(t.trustedAddresses):t.apiService.get("network/defaultConnections")}),ue(function(e){return t.trustedAddresses=e,t.apiService.get("network/connections")})).subscribe(function(e){if(null===e.connections||0===e.connections.length)return t.noConnections=!0,t.ngZone.run(function(){return t.connectionsSubject.next([])}),void t.startDataRefreshSubscription(t.updatePeriod);t.noConnections=!1;var n=e.connections.map(function(e){return{address:e.address,listenPort:e.listen_port,outgoing:e.outgoing,height:e.height,lastSent:e.last_sent,lastReceived:e.last_received,source:t.trustedAddresses.find(function(t){return t===e.address})?vP.Default:vP.Exchange}}).sort(function(e,t){return e.address.localeCompare(t.address)});t.ngZone.run(function(){return t.connectionsSubject.next(n)}),t.startDataRefreshSubscription(t.updatePeriod)},function(){return t.startDataRefreshSubscription(t.errorUpdatePeriod)})})},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(Bp),Gi(Nc))}}),e}(),yP=function(){function e(e,t){this.httpClient=e,this.walletsAndAddressesService=t,this.configSubject=new Gp(null),this.purchaseOrders=new Gp([]),this.purchaseUrl="https://event.skycoin.com/api/",this.getConfig()}return e.prototype.all=function(){return this.purchaseOrders.asObservable()},e.prototype.config=function(){return this.configSubject.asObservable()},e.prototype.getConfig=function(){var e=this;return this.get("config").pipe(ie(function(e){return{enabled:!0,sky_btc_exchange_rate:parseFloat(e.sky_btc_exchange_rate)}})).subscribe(function(t){return e.configSubject.next(t)})},e.prototype.generate=function(e){var t=this;return this.walletsAndAddressesService.addAddressesToWallet(e,1).pipe(ue(function(n){return t.post("bind",{skyaddr:n[0].address,coin_type:"BTC"}).pipe(ie(function(t){return{coin_type:t.coin_type,deposit_address:t.deposit_address,filename:e.id,recipient_address:n[0].address,status:"waiting_deposit"}}))}))},e.prototype.scan=function(e){return this.get("status?skyaddr="+e).pipe(ie(function(e){if(!e.statuses||e.statuses.length>1)throw new Error("too many purchase orders found");return e.statuses[0]}))},e.prototype.get=function(e){return this.httpClient.get(this.purchaseUrl+e)},e.prototype.post=function(e,t){return void 0===t&&(t={}),this.httpClient.post(this.purchaseUrl+e,t)},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(yp),Gi(ix))}}),e}(),bP=function(){function e(e,t){this.http=e,this.ngZone=t,this.PRICE_API_ID=zp.priceApiId,this.priceInternal=new Gp(null),this.updatePeriod=6e5,this.errorUpdatePeriod=3e4,this.startDataRefreshSubscription(0)}return Object.defineProperty(e.prototype,"price",{get:function(){return this.priceInternal.asObservable()},enumerable:!1,configurable:!0}),e.prototype.startDataRefreshSubscription=function(e){var t=this;this.PRICE_API_ID&&(this.priceSubscription&&this.priceSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){t.priceSubscription=xf(0).pipe(Of(e),ue(function(){return t.http.get("https://api.coinpaprika.com/v1/tickers/"+t.PRICE_API_ID+"?quotes=USD")})).subscribe(function(e){t.ngZone.run(function(){return t.priceInternal.next(e.quotes.USD.price)}),t.startDataRefreshSubscription(t.updatePeriod)},function(){t.startDataRefreshSubscription(t.errorUpdatePeriod)})}))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(yp),Gi(Nc))}}),e}(),wP=["mat-menu-item",""],kP=["*"];function MP(e,t){if(1&e){var n=Ss();ou(0,"\n "),_s(1,"div",0),Ls("keydown",function(e){return sn(n),As()._handleKeydown(e)})("click",function(){return sn(n),As().closed.emit("click")})("@transformMenu.start",function(e){return sn(n),As()._onAnimationStart(e)})("@transformMenu.done",function(e){return sn(n),As()._onAnimationDone(e)}),ou(2,"\n "),_s(3,"div",1),ou(4,"\n "),Rs(5),ou(6,"\n "),ys(),ou(7,"\n "),ys(),ou(8,"\n")}if(2&e){var i=As();Pa(1),gs("id",i.panelId)("ngClass",i._classList)("@transformMenu",i._panelAnimationState),cs("aria-label",i.ariaLabel||null)("aria-labelledby",i.ariaLabelledby||null)("aria-describedby",i.ariaDescribedby||null)}}var SP={transformMenu:Fv("transformMenu",[Bv("void",Nv({opacity:0,transform:"scale(0.8)"})),Vv("void => enter",Hv("120ms cubic-bezier(0, 0, 0.2, 1)",Nv({opacity:1,transform:"scale(1)"}))),Vv("* => void",Hv("100ms 25ms linear",Nv({opacity:0})))]),fadeInItems:Fv("fadeInItems",[Bv("showing",Nv({opacity:1})),Vv("void => *",[Nv({opacity:0}),Hv("400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)")])])},CP=new Si("MatMenuContent"),xP=new Si("MAT_MENU_PANEL"),LP=jb(Fb(function e(){v(this,e)})),TP=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r,o){var s;return v(this,n),(s=t.call(this))._elementRef=e,s._focusMonitor=r,s._parentMenu=o,s.role="menuitem",s._hovered=new z,s._focused=new z,s._highlighted=!1,s._triggersSubmenu=!1,o&&o.addItem&&o.addItem(a(s)),s}return g(n,[{key:"focus",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"program",t=arguments.length>1?arguments[1]:void 0;this._focusMonitor?this._focusMonitor.focusVia(this._getHostElement(),e,t):this._getHostElement().focus(t),this._focused.next(this)}},{key:"ngAfterViewInit",value:function(){this._focusMonitor&&this._focusMonitor.monitor(this._elementRef,!1)}},{key:"ngOnDestroy",value:function(){this._focusMonitor&&this._focusMonitor.stopMonitoring(this._elementRef),this._parentMenu&&this._parentMenu.removeItem&&this._parentMenu.removeItem(this),this._hovered.complete(),this._focused.complete()}},{key:"_getTabIndex",value:function(){return this.disabled?"-1":"0"}},{key:"_getHostElement",value:function(){return this._elementRef.nativeElement}},{key:"_checkDisabled",value:function(e){this.disabled&&(e.preventDefault(),e.stopPropagation())}},{key:"_handleMouseEnter",value:function(){this._hovered.next(this)}},{key:"getLabel",value:function(){for(var e,t,n=this._elementRef.nativeElement.cloneNode(!0),i=n.querySelectorAll("mat-icon, .material-icons"),r=0;r0&&void 0!==arguments[0]?arguments[0]:"program";this.lazyContent?this._ngZone.onStable.pipe(Uf(1)).subscribe(function(){return e._focusFirstItem(t)}):this._focusFirstItem(t)}},{key:"_focusFirstItem",value:function(e){var t=this._keyManager;if(t.setFocusOrigin(e).setFirstItemActive(),!t.activeItem&&this._directDescendantItems.length)for(var n=this._directDescendantItems.first._getHostElement().parentElement;n;){if("menu"===n.getAttribute("role")){n.focus();break}n=n.parentElement}}},{key:"resetActiveItem",value:function(){this._keyManager.setActiveItem(-1)}},{key:"setElevation",value:function(e){var t=Math.min(4+e,24),n="mat-elevation-z".concat(t),i=Object.keys(this._classList).find(function(e){return e.startsWith("mat-elevation-z")});i&&i!==this._previousElevation||(this._previousElevation&&(this._classList[this._previousElevation]=!1),this._classList[n]=!0,this._previousElevation=n)}},{key:"setPositionClasses",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.xPosition,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.yPosition,n=this._classList;n["mat-menu-before"]="before"===e,n["mat-menu-after"]="after"===e,n["mat-menu-above"]="above"===t,n["mat-menu-below"]="below"===t}},{key:"_startAnimation",value:function(){this._panelAnimationState="enter"}},{key:"_resetAnimation",value:function(){this._panelAnimationState="void"}},{key:"_onAnimationDone",value:function(e){this._animationDone.next(e),this._isAnimating=!1}},{key:"_onAnimationStart",value:function(e){this._isAnimating=!0,"enter"===e.toState&&0===this._keyManager.activeItemIndex&&(e.element.scrollTop=0)}},{key:"_updateDirectDescendants",value:function(){var e=this;this._allItems.changes.pipe(xm(this._allItems)).subscribe(function(t){e._directDescendantItems.reset(t.filter(function(t){return t._parentMenu===e})),e._directDescendantItems.notifyOnChanges()})}},{key:"xPosition",get:function(){return this._xPosition},set:function(e){this._xPosition=e,this.setPositionClasses()}},{key:"yPosition",get:function(){return this._yPosition},set:function(e){this._yPosition=e,this.setPositionClasses()}},{key:"overlapTrigger",get:function(){return this._overlapTrigger},set:function(e){this._overlapTrigger=Xp(e)}},{key:"hasBackdrop",get:function(){return this._hasBackdrop},set:function(e){this._hasBackdrop=Xp(e)}},{key:"panelClass",set:function(e){var t=this,n=this._previousPanelClass;n&&n.length&&n.split(" ").forEach(function(e){t._classList[e]=!1}),this._previousPanelClass=e,e&&e.length&&(e.split(" ").forEach(function(e){t._classList[e]=!0}),this._elementRef.nativeElement.className="")}},{key:"classList",get:function(){return this.panelClass},set:function(e){this.panelClass=e}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(Nc),ms(DP))},e.\u0275dir=gt({type:e,contentQueries:function(e,t,n){var i;1&e&&(hc(n,CP,!0),hc(n,TP,!0),hc(n,TP,!1)),2&e&&(uc(i=fc())&&(t.lazyContent=i.first),uc(i=fc())&&(t._allItems=i),uc(i=fc())&&(t.items=i))},viewQuery:function(e,t){var n;1&e&&cc(ml,!0),2&e&&uc(n=fc())&&(t.templateRef=n.first)},inputs:{backdropClass:"backdropClass",xPosition:"xPosition",yPosition:"yPosition",overlapTrigger:"overlapTrigger",hasBackdrop:"hasBackdrop",panelClass:["class","panelClass"],classList:"classList",ariaLabel:["aria-label","ariaLabel"],ariaLabelledby:["aria-labelledby","ariaLabelledby"],ariaDescribedby:["aria-describedby","ariaDescribedby"]},outputs:{closed:"closed",close:"close"}}),e}(),PP=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r){return v(this,n),t.call(this,e,i,r)}return n}(EP);return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(Nc),ms(DP))},e.\u0275cmp=lt({type:e,selectors:[["mat-menu"]],hostVars:3,hostBindings:function(e,t){2&e&&cs("aria-label",null)("aria-labelledby",null)("aria-describedby",null)},exportAs:["matMenu"],features:[Eu([{provide:xP,useExisting:e}]),Jo],ngContentSelectors:kP,decls:2,vars:0,consts:[["tabindex","-1","role","menu",1,"mat-menu-panel",3,"id","ngClass","keydown","click"],[1,"mat-menu-content"]],template:function(e,t){1&e&&(Is(),fs(0,MP,9,6,"ng-template"),ou(1,"\n"))},directives:[lh],styles:['.mat-menu-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh - 48px);border-radius:4px;outline:0;min-height:64px}.mat-menu-panel.ng-animating{pointer-events:none}.cdk-high-contrast-active .mat-menu-panel{outline:solid 1px}.mat-menu-content:not(:empty){padding-top:8px;padding-bottom:8px}.mat-menu-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;position:relative}.mat-menu-item::-moz-focus-inner{border:0}.mat-menu-item[disabled]{cursor:default}[dir=rtl] .mat-menu-item{text-align:right}.mat-menu-item .mat-icon{margin-right:16px;vertical-align:middle}.mat-menu-item .mat-icon svg{vertical-align:top}[dir=rtl] .mat-menu-item .mat-icon{margin-left:16px;margin-right:0}.mat-menu-item[disabled]{pointer-events:none}.cdk-high-contrast-active .mat-menu-item.cdk-program-focused,.cdk-high-contrast-active .mat-menu-item.cdk-keyboard-focused,.cdk-high-contrast-active .mat-menu-item-highlighted{outline:dotted 1px}.mat-menu-item-submenu-trigger{padding-right:32px}.mat-menu-item-submenu-trigger::after{width:0;height:0;border-style:solid;border-width:5px 0 5px 5px;border-color:transparent transparent transparent currentColor;content:"";display:inline-block;position:absolute;top:50%;right:16px;transform:translateY(-50%)}[dir=rtl] .mat-menu-item-submenu-trigger{padding-right:16px;padding-left:32px}[dir=rtl] .mat-menu-item-submenu-trigger::after{right:auto;left:16px;transform:rotateY(180deg) translateY(-50%)}button.mat-menu-item{width:100%}.mat-menu-item .mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}\n'],encapsulation:2,data:{animation:[SP.transformMenu,SP.fadeInItems]},changeDetection:0}),e}(),AP=new Si("mat-menu-scroll-strategy"),YP={provide:AP,deps:[Ng],useFactory:function(e){return function(){return e.scrollStrategies.reposition()}}},IP=Um({passive:!0}),RP=function(){var e=function(){function e(t,n,i,r,a,o,s,u){var l=this;v(this,e),this._overlay=t,this._element=n,this._viewContainerRef=i,this._menuItemInstance=o,this._dir=s,this._focusMonitor=u,this._overlayRef=null,this._menuOpen=!1,this._closingActionsSubscription=L.EMPTY,this._hoverSubscription=L.EMPTY,this._menuCloseSubscription=L.EMPTY,this._handleTouchStart=function(){return l._openedBy="touch"},this._openedBy=null,this.restoreFocus=!0,this.menuOpened=new Zl,this.onMenuOpen=this.menuOpened,this.menuClosed=new Zl,this.onMenuClose=this.menuClosed,this._scrollStrategy=r,this._parentMaterialMenu=a instanceof EP?a:void 0,n.nativeElement.addEventListener("touchstart",this._handleTouchStart,IP),o&&(o._triggersSubmenu=this.triggersSubmenu())}return g(e,[{key:"ngAfterContentInit",value:function(){this._checkMenu(),this._handleHover()}},{key:"ngOnDestroy",value:function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._element.nativeElement.removeEventListener("touchstart",this._handleTouchStart,IP),this._menuCloseSubscription.unsubscribe(),this._closingActionsSubscription.unsubscribe(),this._hoverSubscription.unsubscribe()}},{key:"triggersSubmenu",value:function(){return!(!this._menuItemInstance||!this._parentMaterialMenu)}},{key:"toggleMenu",value:function(){return this._menuOpen?this.closeMenu():this.openMenu()}},{key:"openMenu",value:function(){var e=this;if(!this._menuOpen){this._checkMenu();var t=this._createOverlay(),n=t.getConfig();this._setPosition(n.positionStrategy),n.hasBackdrop=null==this.menu.hasBackdrop?!this.triggersSubmenu():this.menu.hasBackdrop,t.attach(this._getPortal()),this.menu.lazyContent&&this.menu.lazyContent.attach(this.menuData),this._closingActionsSubscription=this._menuClosingActions().subscribe(function(){return e.closeMenu()}),this._initMenu(),this.menu instanceof EP&&this.menu._startAnimation()}}},{key:"closeMenu",value:function(){this.menu.close.emit()}},{key:"focus",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"program",t=arguments.length>1?arguments[1]:void 0;this._focusMonitor?this._focusMonitor.focusVia(this._element,e,t):this._element.nativeElement.focus(t)}},{key:"_destroyMenu",value:function(){var e=this;if(this._overlayRef&&this.menuOpen){var t=this.menu;this._closingActionsSubscription.unsubscribe(),this._overlayRef.detach(),this._restoreFocus(),t instanceof EP?(t._resetAnimation(),t.lazyContent?t._animationDone.pipe(Nf(function(e){return"void"===e.toState}),Uf(1),wm(t.lazyContent._attached)).subscribe({next:function(){return t.lazyContent.detach()},complete:function(){return e._setIsMenuOpen(!1)}}):this._setIsMenuOpen(!1)):(this._setIsMenuOpen(!1),t.lazyContent&&t.lazyContent.detach())}}},{key:"_initMenu",value:function(){this.menu.parentMenu=this.triggersSubmenu()?this._parentMaterialMenu:void 0,this.menu.direction=this.dir,this._setMenuElevation(),this._setIsMenuOpen(!0),this.menu.focusFirstItem(this._openedBy||"program")}},{key:"_setMenuElevation",value:function(){if(this.menu.setElevation){for(var e=0,t=this.menu.parentMenu;t;)e++,t=t.parentMenu;this.menu.setElevation(e)}}},{key:"_restoreFocus",value:function(){this.restoreFocus&&(this._openedBy?this.triggersSubmenu()||this.focus(this._openedBy):this.focus()),this._openedBy=null}},{key:"_setIsMenuOpen",value:function(e){this._menuOpen=e,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this.triggersSubmenu()&&(this._menuItemInstance._highlighted=e)}},{key:"_checkMenu",value:function(){}},{key:"_createOverlay",value:function(){if(!this._overlayRef){var e=this._getOverlayConfig();this._subscribeToPositions(e.positionStrategy),this._overlayRef=this._overlay.create(e),this._overlayRef.keydownEvents().subscribe()}return this._overlayRef}},{key:"_getOverlayConfig",value:function(){return new wg({positionStrategy:this._overlay.position().flexibleConnectedTo(this._element).withLockedPosition().withTransformOriginOn(".mat-menu-panel, .mat-mdc-menu-panel"),backdropClass:this.menu.backdropClass||"cdk-overlay-transparent-backdrop",panelClass:this.menu.overlayPanelClass,scrollStrategy:this._scrollStrategy(),direction:this._dir})}},{key:"_subscribeToPositions",value:function(e){var t=this;this.menu.setPositionClasses&&e.positionChanges.subscribe(function(e){t.menu.setPositionClasses("start"===e.connectionPair.overlayX?"after":"before","top"===e.connectionPair.overlayY?"below":"above")})}},{key:"_setPosition",value:function(e){var t=u("before"===this.menu.xPosition?["end","start"]:["start","end"],2),n=t[0],i=t[1],r=u("above"===this.menu.yPosition?["bottom","top"]:["top","bottom"],2),a=r[0],o=r[1],s=a,l=o,c=n,d=i,h=0;this.triggersSubmenu()?(d=n="before"===this.menu.xPosition?"start":"end",i=c="end"===n?"start":"end",h="bottom"===a?8:-8):this.menu.overlapTrigger||(s="top"===a?"bottom":"top",l="top"===o?"bottom":"top"),e.withPositions([{originX:n,originY:s,overlayX:c,overlayY:a,offsetY:h},{originX:i,originY:s,overlayX:d,overlayY:a,offsetY:h},{originX:n,originY:l,overlayX:c,overlayY:o,offsetY:-h},{originX:i,originY:l,overlayX:d,overlayY:o,offsetY:-h}])}},{key:"_menuClosingActions",value:function(){var e=this,t=this._overlayRef.backdropClick(),n=this._overlayRef.detachments();return pe(t,this._parentMaterialMenu?this._parentMaterialMenu.closed:xf(),this._parentMaterialMenu?this._parentMaterialMenu._hovered().pipe(Nf(function(t){return t!==e._menuItemInstance}),Nf(function(){return e._menuOpen})):xf(),n)}},{key:"_handleMousedown",value:function(e){Mv(e)||(this._openedBy=0===e.button?"mouse":null,this.triggersSubmenu()&&e.preventDefault())}},{key:"_handleKeydown",value:function(e){var t=e.keyCode;this.triggersSubmenu()&&(39===t&&"ltr"===this.dir||37===t&&"rtl"===this.dir)&&this.openMenu()}},{key:"_handleClick",value:function(e){this.triggersSubmenu()?(e.stopPropagation(),this.openMenu()):this.toggleMenu()}},{key:"_handleHover",value:function(){var e=this;this.triggersSubmenu()&&this._parentMaterialMenu&&(this._hoverSubscription=this._parentMaterialMenu._hovered().pipe(Nf(function(t){return t===e._menuItemInstance&&!t.disabled}),Of(0,dm)).subscribe(function(){e._openedBy="mouse",e.menu instanceof EP&&e.menu._isAnimating?e.menu._animationDone.pipe(Uf(1),Of(0,dm),wm(e._parentMaterialMenu._hovered())).subscribe(function(){return e.openMenu()}):e.openMenu()}))}},{key:"_getPortal",value:function(){return this._portal&&this._portal.templateRef===this.menu.templateRef||(this._portal=new ng(this.menu.templateRef,this._viewContainerRef)),this._portal}},{key:"_deprecatedMatMenuTriggerFor",get:function(){return this.menu},set:function(e){this.menu=e}},{key:"menu",get:function(){return this._menu},set:function(e){var t=this;e!==this._menu&&(this._menu=e,this._menuCloseSubscription.unsubscribe(),e&&(this._menuCloseSubscription=e.close.subscribe(function(e){t._destroyMenu(),"click"!==e&&"tab"!==e||!t._parentMaterialMenu||t._parentMaterialMenu.closed.emit(e)})))}},{key:"menuOpen",get:function(){return this._menuOpen}},{key:"dir",get:function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(Ng),ms(ju),ms(wl),ms(AP),ms(xP,8),ms(TP,10),ms(Gm,8),ms(xv))},e.\u0275dir=gt({type:e,selectors:[["","mat-menu-trigger-for",""],["","matMenuTriggerFor",""]],hostAttrs:["aria-haspopup","true",1,"mat-menu-trigger"],hostVars:2,hostBindings:function(e,t){1&e&&Ls("mousedown",function(e){return t._handleMousedown(e)})("keydown",function(e){return t._handleKeydown(e)})("click",function(e){return t._handleClick(e)}),2&e&&cs("aria-expanded",t.menuOpen||null)("aria-controls",t.menuOpen?t.menu.panelId:null)},inputs:{restoreFocus:["matMenuTriggerRestoreFocus","restoreFocus"],_deprecatedMatMenuTriggerFor:["mat-menu-trigger-for","_deprecatedMatMenuTriggerFor"],menu:["matMenuTriggerFor","menu"],menuData:["matMenuTriggerData","menuData"]},outputs:{menuOpened:"menuOpened",onMenuOpen:"onMenuOpen",menuClosed:"menuClosed",onMenuClose:"onMenuClose"},exportAs:["matMenuTrigger"]}),e}(),FP=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[YP],imports:[Rb]}),e}(),HP=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[YP],imports:[[Ph,Rb,ew,qg,FP],Xm,Rb,FP]}),e}();function jP(e,t){if(1&e){var n=Ss();_s(0,"button",11),Ls("click",function(){return sn(n),As().changelanguage()}),ou(1,"\n "),bs(2,"img",12),ou(3),ys()}if(2&e){var i=As();Pa(2),gs("src","assets/img/lang/"+i.language.iconName,Ar),Pa(1),uu("\n ",i.language.name,"\n ")}}function NP(e,t){if(1&e&&(_s(0,"button",13),ou(1),ys()),2&e){var n=As();gs("disabled",!0),Pa(1),uu(" v",n.appService.nodeVersion," ")}}var BP=function(){return["/settings/network"]},WP=function(){return["/settings/blockchain"]},VP=function(){return["/settings/outputs"]},UP=function(){return["/settings/pending-transactions"]},zP=function(){return["/settings/backup"]},qP=function(e){return{coinName:e}},GP=function(){function e(e,t,n){this.appService=e,this.languageService=t,this.dialog=n}return e.prototype.ngOnInit=function(){var e=this;this.subscription=this.languageService.currentLanguage.subscribe(function(t){return e.language=t})},e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},e.prototype.changelanguage=function(){GC.openDialog(this.dialog)},e.\u0275fac=function(t){return new(t||e)(ms(qp),ms(DC),ms(Aw))},e.\u0275cmp=lt({type:e,selectors:[["app-top-bar"]],inputs:{headline:"headline"},decls:50,vars:37,consts:[[1,"buttons-left"],[1,"title"],[1,"buttons-right"],[3,"overlapTrigger"],["menuMenu","matMenu"],["mat-menu-item","",3,"routerLink"],["mat-menu-item","","target","_blank","rel","noreferrer nofollow noopener",1,"color-primary",3,"href"],[1,"separator"],["mat-menu-item","",3,"click",4,"ngIf"],["mat-menu-item","",3,"disabled",4,"ngIf"],["mat-icon-button","",1,"button",3,"matMenuTriggerFor"],["mat-menu-item","",3,"click"],[1,"flag",3,"src"],["mat-menu-item","",3,"disabled"]],template:function(e,t){if(1&e&&(bs(0,"div",0),ou(1,"\n"),_s(2,"div",1),ou(3),ys(),ou(4,"\n"),_s(5,"div",2),ou(6,"\n "),_s(7,"mat-menu",3,4),ou(9,"\n "),_s(10,"button",5),ou(11),Vl(12,"translate"),ys(),ou(13,"\n "),_s(14,"button",5),ou(15),Vl(16,"translate"),ys(),ou(17,"\n "),_s(18,"button",5),ou(19),Vl(20,"translate"),ys(),ou(21,"\n "),_s(22,"button",5),ou(23),Vl(24,"translate"),ys(),ou(25,"\n "),_s(26,"button",5),ou(27),Vl(28,"translate"),ys(),ou(29,"\n "),_s(30,"a",6),ou(31),Vl(32,"translate"),ys(),ou(33,"\n "),bs(34,"div",7),ou(35,"\n "),fs(36,jP,4,2,"button",8),ou(37,"\n "),bs(38,"div",7),ou(39,"\n "),fs(40,NP,2,2,"button",9),ou(41,"\n "),ys(),ou(42,"\n "),_s(43,"button",10),ou(44,"\n "),_s(45,"mat-icon"),ou(46,"menu"),ys(),ou(47,"\n "),ys(),ou(48,"\n"),ys(),ou(49,"\n")),2&e){var n=ps(8);Pa(3),uu("\n ",t.headline,"\n"),Pa(4),gs("overlapTrigger",!1),Pa(3),gs("routerLink",Il(30,BP)),Pa(1),su(Ul(12,17,"network.title")),Pa(3),gs("routerLink",Il(31,WP)),Pa(1),su(Ul(16,19,"blockchain.title")),Pa(3),gs("routerLink",Il(32,VP)),Pa(1),su(Ul(20,21,"outputs.title")),Pa(3),gs("routerLink",Il(33,UP)),Pa(1),su(Ul(24,23,"pending-txs.title")),Pa(3),gs("routerLink",Il(34,zP)),Pa(1),su(Ul(28,25,"backup.title")),Pa(3),gs("href",t.appService.explorerUrl,Ar),Pa(1),su(zl(32,27,"header.explorer-link",Rl(35,qP,t.appService.fullCoinName))),Pa(5),gs("ngIf",t.language),Pa(4),gs("ngIf",t.appService.nodeVersion),Pa(3),gs("matMenuTriggerFor",n)}},directives:[PP,TP,UT,fh,US,RP,uC],pipes:[oS],styles:["[_nghost-%COMP%]{display:flex;color:#fff;width:100%}.buttons-left[_ngcontent-%COMP%]{padding:0 10px;width:120px}.title[_ngcontent-%COMP%]{font-size:13px;font-weight:700;flex:1 1 auto;letter-spacing:1px;line-height:50px;text-align:center}.buttons-right[_ngcontent-%COMP%]{text-align:right;width:120px}.buttons-right[_ngcontent-%COMP%] .button[_ngcontent-%COMP%]{height:50px;width:50px}.mat-menu-item[_ngcontent-%COMP%]{height:50px;line-height:50px;font-size:14px}.color-primary[_ngcontent-%COMP%]{color:#0072ff}.separator[_ngcontent-%COMP%]{width:100%;height:2px;background-color:rgba(30,34,39,.05);margin:8px 0}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:3px}"]}),e}(),KP=function(e){return e.RightButton="RightButton",e.LeftButton="LeftButton",e}({}),JP=function(){function e(){this.className="",this.changeActiveButtonManually=!1,this.onStateChange=new Zl,this.ButtonStates=KP}return e.prototype.ngOnDestroy=function(){this.onStateChange.complete()},e.prototype.onRightButtonClicked=function(){this.activeButton===KP.LeftButton&&(this.changeActiveButtonManually||(this.activeButton=KP.RightButton),this.onStateChange.emit(KP.RightButton))},e.prototype.onLeftButtonClicked=function(){this.activeButton===KP.RightButton&&(this.changeActiveButtonManually||(this.activeButton=KP.LeftButton),this.onStateChange.emit(KP.LeftButton))},e.\u0275fac=function(t){return new(t||e)},e.\u0275cmp=lt({type:e,selectors:[["app-double-button"]],inputs:{rightButtonText:"rightButtonText",leftButtonText:"leftButtonText",activeButton:"activeButton",className:"className",changeActiveButtonManually:"changeActiveButtonManually"},outputs:{onStateChange:"onStateChange"},decls:9,vars:9,consts:[[1,"-toggle","-small-button",3,"disabled","forceEmitEvents","action"]],template:function(e,t){1&e&&(_s(0,"div"),ou(1,"\n "),_s(2,"app-button",0),Ls("action",function(){return t.onLeftButtonClicked()}),ou(3),ys(),ou(4,"\n "),_s(5,"app-button",0),Ls("action",function(){return t.onRightButtonClicked()}),ou(6),ys(),ou(7,"\n"),ys(),ou(8,"\n")),2&e&&(hu("-buttons-container ",t.className,""),Pa(2),gs("disabled",t.activeButton!==t.ButtonStates.LeftButton)("forceEmitEvents",!0),Pa(1),su(t.leftButtonText),Pa(2),gs("disabled",t.activeButton!==t.ButtonStates.RightButton)("forceEmitEvents",!0),Pa(1),su(t.rightButtonText))},directives:[gC],styles:[".-small-button[_ngcontent-%COMP%] button{width:unset;height:unset;padding:0 10px;min-width:100px;margin:unset;box-shadow:unset;background-color:transparent!important;line-height:1!important;min-height:26px}.-small-button[_ngcontent-%COMP%] button span{color:#1e2227;line-height:unset!important}.-small-button[_ngcontent-%COMP%] button .content-container .content{font-size:13px}.-small-button[_ngcontent-%COMP%] button.enabled{background-color:#1e2227!important}.-small-button[_ngcontent-%COMP%] button.enabled span{color:#fafafa}.-buttons-container[_ngcontent-%COMP%]{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:5px;background:hsla(0,0%,100%,.1);border-radius:100px;margin:0 auto;font-size:1px}.light.-buttons-container[_ngcontent-%COMP%]{background:rgba(30,34,39,.065)}.light[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button.enabled{background-color:#fafafa!important}.light[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button.enabled span{color:#1e2227}@media (max-width:991px){.-buttons-container.navbar.light[_ngcontent-%COMP%]{border-radius:20px}.-buttons-container.navbar.light[_ngcontent-%COMP%] app-button[_ngcontent-%COMP%] .internal-container{display:block}}.small.-buttons-container[_ngcontent-%COMP%]{padding:2px}.small[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button{min-width:70px;min-height:16px}.small[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button .content-container .content{font-size:9px}"]}),e}(),ZP=function(){function e(){this.switchVisibleInternal=!1,this.activeComponentInternal=new Gp(KP.LeftButton),this.switchDiabledInternal=!1}return Object.defineProperty(e.prototype,"switchVisible",{get:function(){return this.switchVisibleInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"activeComponent",{get:function(){return this.activeComponentInternal.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"leftText",{get:function(){return this.leftTextInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"rightText",{get:function(){return this.rightTextInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"switchDiabled",{get:function(){return this.switchDiabledInternal},enumerable:!1,configurable:!0}),e.prototype.setActiveComponent=function(e){this.activeComponentInternal.next(e)},e.prototype.showSwitch=function(e,t,n){void 0===n&&(n=KP.LeftButton),this.setActiveComponent(n),this.switchDiabledInternal=!1,this.switchVisibleInternal=!0,this.leftTextInternal=e,this.rightTextInternal=t},e.prototype.hideSwitch=function(){this.switchVisibleInternal=!1},e.prototype.enableSwitch=function(){this.switchDiabledInternal=!1},e.prototype.disableSwitch=function(){this.switchDiabledInternal=!0},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)}}),e}();function QP(e,t){1&e&&(_s(0,"a",11),ou(1,"\n "),bs(2,"img",12),ou(3,"\n "),_s(4,"span"),ou(5),Vl(6,"translate"),ys(),ou(7,"\n "),ys()),2&e&&(Pa(5),su(Ul(6,1,"buy.title-and-button")))}var XP=function(e){return{"-switch":!0,"element-disabled":e}};function $P(e,t){if(1&e){var n=Ss();_s(0,"app-double-button",13),Ls("onStateChange",function(e){return sn(n),As().changeActiveComponent(e)}),Vl(1,"translate"),Vl(2,"translate"),Vl(3,"async"),ys()}if(2&e){var i=As();gs("ngClass",Rl(10,XP,i.navBarSwitchService.switchDiabled))("leftButtonText",Ul(1,4,i.navBarSwitchService.leftText))("rightButtonText",Ul(2,6,i.navBarSwitchService.rightText))("activeButton",Ul(3,8,i.navBarSwitchService.activeComponent))}}var eA=function(){function e(e,t){this.appService=e,this.navBarSwitchService=t,this.otcEnabled=zp.otcEnabled,this.exchangeEnabled=!0}return e.prototype.changeActiveComponent=function(e){this.navBarSwitchService.setActiveComponent(e)},e.\u0275fac=function(t){return new(t||e)(ms(qp),ms(ZP))},e.\u0275cmp=lt({type:e,selectors:[["app-nav-bar"]],decls:40,vars:11,consts:[[1,"container"],[1,"-buttons"],["routerLink","/wallets","routerLinkActive","full-opacity",1,"-button"],["src","assets/img/wallet-black.png"],["routerLink","/send","routerLinkActive","full-opacity",1,"-button"],["src","assets/img/send-black.png"],["routerLink","/transactions","routerLinkActive","full-opacity",1,"-button"],["src","assets/img/transactions-black.png"],[1,"flex-fill"],["class","-button",4,"ngIf"],["className","light navbar",3,"ngClass","leftButtonText","rightButtonText","activeButton","onStateChange",4,"ngIf"],[1,"-button"],["src","assets/img/money-gold.png"],["className","light navbar",3,"ngClass","leftButtonText","rightButtonText","activeButton","onStateChange"]],template:function(e,t){1&e&&(_s(0,"div",0),ou(1,"\n "),_s(2,"div",1),ou(3,"\n "),_s(4,"a",2),ou(5,"\n "),bs(6,"img",3),ou(7,"\n "),_s(8,"span"),ou(9),Vl(10,"translate"),ys(),ou(11,"\n "),ys(),ou(12,"\n "),_s(13,"a",4),ou(14,"\n "),bs(15,"img",5),ou(16,"\n "),_s(17,"span"),ou(18),Vl(19,"translate"),ys(),ou(20,"\n "),ys(),ou(21,"\n "),_s(22,"a",6),ou(23,"\n "),bs(24,"img",7),ou(25,"\n "),_s(26,"span"),ou(27),Vl(28,"translate"),ys(),ou(29,"\n "),ys(),ou(30,"\n "),bs(31,"div",8),ou(32,"\n "),ou(33,"\n "),fs(34,QP,8,3,"a",9),ou(35,"\n "),fs(36,$P,4,12,"app-double-button",10),ou(37,"\n "),ys(),ou(38,"\n"),ys(),ou(39,"\n")),2&e&&(Pa(9),su(Ul(10,5,"wallet.title-and-button")),Pa(9),su(Ul(19,7,"send.title-and-button")),Pa(9),su(Ul(28,9,"history.title-and-button")),Pa(7),gs("ngIf",t.otcEnabled),Pa(2),gs("ngIf",t.navBarSwitchService.switchVisible))},directives:[zT,GT,fh,JP,lh],pipes:[oS,xh],styles:[".-buttons[_ngcontent-%COMP%]{display:flex;width:100%}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{cursor:pointer;padding:0 20px;opacity:.2;display:block;text-decoration:none;color:#1e2227;display:flex;height:66px;align-items:center}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:hover{opacity:.4}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:active{opacity:.55}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{float:left;height:32px;width:32px}@media (max-width:991px){.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:27.2px;width:27.2px}}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:14px;line-height:1.3;margin:0 5px}@media (max-width:991px){.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:11.9px}}.-buttons[_ngcontent-%COMP%] .-switch[_ngcontent-%COMP%]{align-self:center;padding:0 20px}.full-opacity[_ngcontent-%COMP%]{opacity:1!important}"]}),e}(),tA=["primaryValueBar"],nA=Hb(function e(t){v(this,e),this._elementRef=t},"primary"),iA=new Si("mat-progress-bar-location",{providedIn:"root",factory:function(){var e=Ji(Md),t=e?e.location:null;return{getPathname:function(){return t?t.pathname+t.search:""}}}}),rA=0,aA=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r,a){var o;v(this,n),(o=t.call(this,e))._elementRef=e,o._ngZone=i,o._animationMode=r,o._isNoopAnimation=!1,o._value=0,o._bufferValue=0,o.animationEnd=new Zl,o._animationEndSubscription=L.EMPTY,o.mode="determinate",o.progressbarId="mat-progress-bar-".concat(rA++);var s=a?a.getPathname().split("#")[0]:"";return o._rectangleFillValue="url('".concat(s,"#").concat(o.progressbarId,"')"),o._isNoopAnimation="NoopAnimations"===r,o}return g(n,[{key:"_primaryTransform",value:function(){return{transform:"scale3d(".concat(this.value/100,", 1, 1)")}}},{key:"_bufferTransform",value:function(){return"buffer"===this.mode?{transform:"scale3d(".concat(this.bufferValue/100,", 1, 1)")}:null}},{key:"ngAfterViewInit",value:function(){var e=this;this._ngZone.runOutsideAngular(function(){var t=e._primaryValueBar.nativeElement;e._animationEndSubscription=rm(t,"transitionend").pipe(Nf(function(e){return e.target===t})).subscribe(function(){"determinate"!==e.mode&&"buffer"!==e.mode||e._ngZone.run(function(){return e.animationEnd.next({value:e.value})})})})}},{key:"ngOnDestroy",value:function(){this._animationEndSubscription.unsubscribe()}},{key:"value",get:function(){return this._value},set:function(e){this._value=oA($p(e)||0)}},{key:"bufferValue",get:function(){return this._bufferValue},set:function(e){this._bufferValue=oA(e||0)}}]),n}(nA);return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(Nc),ms(xb,8),ms(iA,8))},e.\u0275cmp=lt({type:e,selectors:[["mat-progress-bar"]],viewQuery:function(e,t){var n;1&e&&cc(tA,!0),2&e&&uc(n=fc())&&(t._primaryValueBar=n.first)},hostAttrs:["role","progressbar","aria-valuemin","0","aria-valuemax","100",1,"mat-progress-bar"],hostVars:4,hostBindings:function(e,t){2&e&&(cs("aria-valuenow","indeterminate"===t.mode||"query"===t.mode?null:t.value)("mode",t.mode),Ks("_mat-animation-noopable",t._isNoopAnimation))},inputs:{color:"color",mode:"mode",value:"value",bufferValue:"bufferValue"},outputs:{animationEnd:"animationEnd"},exportAs:["matProgressBar"],features:[Jo],decls:21,vars:4,consts:[["width","100%","height","4","focusable","false",1,"mat-progress-bar-background","mat-progress-bar-element"],["x","4","y","0","width","8","height","4","patternUnits","userSpaceOnUse",3,"id"],["cx","2","cy","2","r","2"],["width","100%","height","100%"],[1,"mat-progress-bar-buffer","mat-progress-bar-element",3,"ngStyle"],[1,"mat-progress-bar-primary","mat-progress-bar-fill","mat-progress-bar-element",3,"ngStyle"],["primaryValueBar",""],[1,"mat-progress-bar-secondary","mat-progress-bar-fill","mat-progress-bar-element"]],template:function(e,t){1&e&&(ou(0,"\n"),In(),_s(1,"svg",0),ou(2,"\n "),_s(3,"defs"),ou(4,"\n "),_s(5,"pattern",1),ou(6,"\n "),bs(7,"circle",2),ou(8,"\n "),ys(),ou(9,"\n "),ys(),ou(10,"\n "),bs(11,"rect",3),ou(12,"\n"),ys(),ou(13,"\n"),Rn(),bs(14,"div",4),ou(15,"\n"),bs(16,"div",5,6),ou(18,"\n"),bs(19,"div",7),ou(20,"\n")),2&e&&(Pa(5),gs("id",t.progressbarId),Pa(6),cs("fill",t._rectangleFillValue),Pa(3),gs("ngStyle",t._bufferTransform()),Pa(2),gs("ngStyle",t._primaryTransform()))},directives:[bh],styles:['.mat-progress-bar{display:block;height:4px;overflow:hidden;position:relative;transition:opacity 250ms linear;width:100%}._mat-animation-noopable.mat-progress-bar{transition:none;animation:none}.mat-progress-bar .mat-progress-bar-element,.mat-progress-bar .mat-progress-bar-fill::after{height:100%;position:absolute;width:100%}.mat-progress-bar .mat-progress-bar-background{width:calc(100% + 10px)}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-background{display:none}.mat-progress-bar .mat-progress-bar-buffer{transform-origin:top left;transition:transform 250ms ease}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-buffer{border-top:solid 5px;opacity:.5}.mat-progress-bar .mat-progress-bar-secondary{display:none}.mat-progress-bar .mat-progress-bar-fill{animation:none;transform-origin:top left;transition:transform 250ms ease}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-fill{border-top:solid 4px}.mat-progress-bar .mat-progress-bar-fill::after{animation:none;content:"";display:inline-block;left:0}.mat-progress-bar[dir=rtl],[dir=rtl] .mat-progress-bar{transform:rotateY(180deg)}.mat-progress-bar[mode=query]{transform:rotateZ(180deg)}.mat-progress-bar[mode=query][dir=rtl],[dir=rtl] .mat-progress-bar[mode=query]{transform:rotateZ(180deg) rotateY(180deg)}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-fill,.mat-progress-bar[mode=query] .mat-progress-bar-fill{transition:none}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary,.mat-progress-bar[mode=query] .mat-progress-bar-primary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-translate 2000ms infinite linear;left:-145.166611%}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-primary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-scale 2000ms infinite linear}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary,.mat-progress-bar[mode=query] .mat-progress-bar-secondary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-translate 2000ms infinite linear;left:-54.888891%;display:block}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-secondary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-scale 2000ms infinite linear}.mat-progress-bar[mode=buffer] .mat-progress-bar-background{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-background-scroll 250ms infinite linear;display:block}.mat-progress-bar._mat-animation-noopable .mat-progress-bar-fill,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-buffer,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-primary,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-secondary,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-background{animation:none;transition-duration:1ms}@keyframes mat-progress-bar-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mat-progress-bar-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mat-progress-bar-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mat-progress-bar-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mat-progress-bar-background-scroll{to{transform:translateX(-8px)}}\n'],encapsulation:2,changeDetection:0}),e}();function oA(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:100;return Math.max(t,Math.min(n,e))}var sA=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[Ph,Rb],Rb]}),e}();function uA(e,t){1&e&&(_s(0,"p",13),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),su(Ul(2,1,"common.loading")))}function lA(e,t){if(1&e&&(_s(0,"p",14),_s(1,"span"),ou(2),Vl(3,"percent"),ys(),ys()),2&e){var n=As();Pa(2),su(zl(3,1,n.synchronizationPercentage,"1.2-2"))}}function cA(e,t){if(1&e&&(_s(0,"p",14),_s(1,"span"),ou(2),Vl(3,"amount"),ys(),ou(4),Vl(5,"amount"),ys()),2&e){var n=As();Pa(2),su(ql(3,2,n.coins,!0,"first")),Pa(2),uu(" ",ql(5,6,n.coins,!0,"last"),"")}}function dA(e,t){if(1&e&&(_s(0,"span"),ou(1),Vl(2,"currency"),ys()),2&e){var n=As(3);Pa(1),su(Gl(2,1,n.coins*n.price,"USD","symbol","1.2-2"))}}function hA(e,t){1&e&&(_s(0,"span"),ou(1,"-"),ys())}function fA(e,t){if(1&e&&(_s(0,"span"),ou(1,"\n "),fs(2,dA,3,6,"span",10),ou(3,"\n "),fs(4,hA,2,0,"span",10),ou(5),Vl(6,"currency"),ys()),2&e){var n=As(2);Pa(2),gs("ngIf",n.synchronized&&n.balanceObtained),Pa(2),gs("ngIf",!n.synchronized||!n.balanceObtained),Pa(1),uu("\n (",Gl(6,3,n.price,"USD","symbol","1.2-2"),")\n ")}}function pA(e,t){1&e&&(_s(0,"span"),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),su(Ul(2,1,"common.loading")))}function mA(e,t){if(1&e&&(_s(0,"p",15),ou(1,"\n "),fs(2,fA,7,8,"span",10),ou(3,"\n "),fs(4,pA,3,3,"span",10),ou(5,"\n "),ys()),2&e){var n=As();Pa(2),gs("ngIf",n.price),Pa(2),gs("ngIf",!n.price)}}function gA(e,t){1&e&&(_s(0,"p"),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),su(Ul(2,1,"common.loading")))}function vA(e,t){if(1&e&&(_s(0,"p"),ou(1),Vl(2,"translate"),ys()),2&e){var n=As();Pa(1),lu("",Ul(2,2,"header.syncing-blocks")," ","("+n.currentBlock+"/"+n.highestBlock+")","")}}function _A(e,t){if(1&e&&(_s(0,"p"),ou(1),Vl(2,"amount"),ys()),2&e){var n=As();Pa(1),su(zl(2,1,n.hours,!1))}}function yA(e,t){if(1&e&&bs(0,"mat-progress-bar",16),2&e){var n=As();gs("mode","determinate")("value",100*n.synchronizationPercentage)}}function bA(e,t){if(1&e&&(_s(0,"div",17),ou(1,"\n "),_s(2,"div"),ou(3),Vl(4,"translate"),_s(5,"a",18),ou(6),ys(),ou(7),Vl(8,"translate"),ys(),ou(9,"\n "),ys()),2&e){var n=As();Pa(3),uu("\n ",Ul(4,4,"header.warnings.update-part1"),"\n "),Pa(2),gs("href",n.walletDownloadUrl,Ar),Pa(1),uu("v",n.appService.lastestVersion,""),Pa(1),uu("\n ",Ul(8,6,"header.warnings.update-part3"),"\n ")}}function wA(e,t){1&e&&(_s(0,"div",17),ou(1,"\n "),_s(2,"div"),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ys()),2&e&&(Pa(3),su(Ul(4,1,"header.warnings.csrf")))}function kA(e,t){1&e&&(_s(0,"div",17),ou(1,"\n "),_s(2,"div"),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ys()),2&e&&(Pa(3),su(Ul(4,1,"header.warnings.no-connections")))}function MA(e,t){1&e&&(_s(0,"div"),ou(1),Vl(2,"translate"),_s(3,"a",19),ou(4),Vl(5,"translate"),ys(),ou(6),Vl(7,"translate"),ys()),2&e&&(Pa(1),uu("\n ",Ul(2,3,"header.warnings.pending-txs-part1"),"\n "),Pa(3),su(Ul(5,5,"header.warnings.pending-txs-part2")),Pa(2),uu("\n ",Ul(7,7,"header.warnings.pending-txs-part3"),"\n "))}function SA(e,t){1&e&&(_s(0,"div"),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),uu("\n ",Ul(2,1,"header.warnings.synchronizing"),"\n "))}function CA(e,t){if(1&e&&(_s(0,"div",17),ou(1,"\n "),fs(2,MA,8,9,"div",10),ou(3,"\n "),fs(4,SA,3,3,"div",10),ou(5,"\n "),ys()),2&e){var n=As();Pa(2),gs("ngIf",n.hasPendingTxs),Pa(2),gs("ngIf",!n.synchronized&&n.synchronizationInfoObtained&&!n.hasPendingTxs)}}var xA=function(){function e(e,t,n,i,r){this.appService=e,this.networkService=t,this.blockchainService=n,this.priceService=i,this.balanceAndOutputsService=r,this.synchronizationInfoObtained=!1,this.synchronized=!1,this.showPrice=!!zp.priceApiId,this.balanceObtained=!1,this.walletDownloadUrl=zp.walletDownloadUrl,this.subscriptionsGroup=[]}return e.prototype.ngOnInit=function(){var e=this;this.subscriptionsGroup.push(this.blockchainService.progress.pipe(Nf(function(e){return!!e})).subscribe(function(t){e.synchronizationInfoObtained=!0,e.highestBlock=t.highestBlock,e.currentBlock=t.currentBlock,e.synchronizationPercentage=e.currentBlock&&e.highestBlock?e.currentBlock/e.highestBlock:0,e.synchronized=t.synchronized})),this.subscriptionsGroup.push(this.priceService.price.subscribe(function(t){return e.price=t})),this.subscriptionsGroup.push(this.balanceAndOutputsService.walletsWithBalance.subscribe(function(t){var n=new Map;t.forEach(function(e){e.addresses.forEach(function(e){n.has(e.address)?n.get(e.address).coins.isLessThan(e.coins)&&n.set(e.address,e):n.set(e.address,e)})});var i=new Yf.BigNumber(0),r=new Yf.BigNumber(0);n.forEach(function(e){i=i.plus(e.coins),r=r.plus(e.hours)}),e.coins=i.toString(),e.hours=r.toString()})),this.subscriptionsGroup.push(this.balanceAndOutputsService.hasPendingTransactions.subscribe(function(t){e.hasPendingTxs=t})),this.subscriptionsGroup.push(this.balanceAndOutputsService.firstFullUpdateMade.subscribe(function(t){e.balanceObtained=t}))},e.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(e){return e.unsubscribe()})},e.\u0275fac=function(t){return new(t||e)(ms(qp),ms(_P),ms(TO),ms(bP),ms(LO))},e.\u0275cmp=lt({type:e,selectors:[["app-header"]],inputs:{headline:"headline"},decls:48,vars:13,consts:[[1,"-container"],[1,"large-header"],[1,"gradient"],[3,"headline"],[1,"balance-container"],[1,"balance"],["class","loading-header",4,"ngIf"],["class","coins",4,"ngIf"],["class","dollars",4,"ngIf"],[1,"hour-balance"],[4,"ngIf"],["color","primary",3,"mode","value",4,"ngIf"],["class","notification-bar",4,"ngIf"],[1,"loading-header"],[1,"coins"],[1,"dollars"],["color","primary",3,"mode","value"],[1,"notification-bar"],["target","_blank","rel","noreferrer nofollow noopener",3,"href"],["routerLink","/settings/pending-transactions"]],template:function(e,t){1&e&&(_s(0,"div",0),ou(1,"\n "),_s(2,"div",1),ou(3,"\n "),ou(4,"\n "),_s(5,"div",2),ou(6,"\n "),bs(7,"app-top-bar",3),ou(8,"\n "),_s(9,"div",4),ou(10,"\n "),_s(11,"div",5),ou(12,"\n "),fs(13,uA,3,3,"p",6),ou(14,"\n "),fs(15,lA,4,4,"p",7),ou(16,"\n "),fs(17,cA,6,10,"p",7),ou(18,"\n "),fs(19,mA,6,2,"p",8),ou(20,"\n "),ys(),ou(21,"\n "),ys(),ou(22,"\n "),_s(23,"div",9),ou(24,"\n "),fs(25,gA,3,3,"p",10),ou(26,"\n "),fs(27,vA,3,4,"p",10),ou(28,"\n "),fs(29,_A,3,4,"p",10),ou(30,"\n "),ys(),ou(31,"\n "),ys(),ou(32,"\n "),ys(),ou(33,"\n "),bs(34,"app-nav-bar"),ou(35,"\n "),fs(36,yA,1,2,"mat-progress-bar",11),ou(37,"\n "),ou(38,"\n "),fs(39,bA,10,8,"div",12),ou(40,"\n "),fs(41,wA,6,3,"div",12),ou(42,"\n "),fs(43,kA,6,3,"div",12),ou(44,"\n "),fs(45,CA,6,2,"div",12),ou(46,"\n"),ys(),ou(47,"\n")),2&e&&(Pa(7),gs("headline",t.headline),Pa(6),gs("ngIf",!t.synchronizationInfoObtained||t.synchronized&&!t.balanceObtained),Pa(2),gs("ngIf",t.synchronizationInfoObtained&&!t.synchronized),Pa(2),gs("ngIf",t.synchronized&&t.balanceObtained),Pa(2),gs("ngIf",t.showPrice),Pa(6),gs("ngIf",!t.synchronizationInfoObtained||t.synchronized&&!t.balanceObtained),Pa(2),gs("ngIf",t.synchronizationInfoObtained&&!t.synchronized),Pa(2),gs("ngIf",t.synchronized&&t.balanceObtained),Pa(7),gs("ngIf",!t.synchronized&&t.synchronizationInfoObtained),Pa(3),gs("ngIf",t.appService.updateAvailable),Pa(2),gs("ngIf",t.appService.csrfDisabled),Pa(2),gs("ngIf",!t.appService.csrfDisabled&&t.networkService.noConnections),Pa(2),gs("ngIf",t.hasPendingTxs||!t.synchronized&&t.synchronizationInfoObtained))},directives:[GP,fh,eA,aA,zT],pipes:[oS,Th,yS,Dh],styles:[".-container[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:2px solid rgba(30,34,39,.05)}.large-header[_ngcontent-%COMP%]{background-repeat:no-repeat;background-position:50%;background-size:100% auto;background-size:cover;background-image:url(/customize/header.png)}.large-header[_ngcontent-%COMP%] .gradient[_ngcontent-%COMP%]{background-size:100% 100%;display:flex;flex-flow:column;align-items:stretch;min-height:190px;background-image:url(/customize/header-gradient.png)}.balance-container[_ngcontent-%COMP%]{align-items:center;color:#fff;display:flex;flex:1 1 auto;font-size:12px;justify-content:center;text-align:center}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%]{line-height:1;margin:0 0 .5em}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:4em}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .loading-header[_ngcontent-%COMP%]{margin:0 0 .5em;font-size:2em}.balance-container[_ngcontent-%COMP%] .dollars[_ngcontent-%COMP%]{margin:0}.hour-balance[_ngcontent-%COMP%]{text-align:center}.hour-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{background-color:hsla(0,0%,100%,.3);border-radius:1000px;color:#000;display:inline-block;font-size:12px;line-height:1.8;margin:1em 0 2em;padding:0 30px}.notification-bar[_ngcontent-%COMP%]{background-color:#ff004e;color:#fafafa;min-height:64px;display:flex;font-size:18px;padding:15px 30px;text-align:center;line-height:1.2}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{margin:auto}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{text-decoration:underline;color:#fafafa}"]}),e}(),LA=["button"],TA=function(e){return{"red-text":e}};function DA(e,t){if(1&e&&(_s(0,"div",11),ou(1),Vl(2,"translate"),ys()),2&e){var n=As();gs("ngClass",Rl(4,TA,n.data.warning)),Pa(1),su(Ul(2,2,n.data.description))}}function OA(e,t){if(1&e){var n=Ss();_s(0,"div",3),ou(1,"\n "),_s(2,"label",12),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),_s(6,"input",13),Ls("keydown.enter",function(){return sn(n),As().proceed()})("blur",function(){return sn(n),As().validateForm()}),ys(),ou(7,"\n "),ys()}if(2&e){var i=As();Pa(3),su(Ul(4,3,"password.confirm-password-label")),Pa(3),gs("appFormFieldError",i.password2ErrorMsg),cs("disabled",i.working?"true":null)}}var EA=function(e){return{"element-disabled":e}};function PA(e,t){if(1&e&&(_s(0,"a",14),ou(1),Vl(2,"translate"),ys()),2&e){var n=As();gs("ngClass",Rl(5,EA,n.working))("href","#/reset/"+n.data.wallet.id,Ar),Pa(1),su(Ul(2,3,"password.reset-link"))}}var AA=function(e){return{"modal-form-container":e}},YA=function(){function e(e,t,n,i){this.data=e,this.dialogRef=t,this.msgBarService=n,this.changeDetector=i,this.passwordSubmit=new z,this.working=!1,this.password1ErrorMsg="",this.password2ErrorMsg="",this.data=Object.assign({confirm:!1,description:null,warning:!1,title:null,wallet:null},e||{})}return e.openDialog=function(t,n,i){void 0===i&&(i=!0);var r=new bw;return r.data=n,r.autoFocus=!0,r.width=i?"260px":zp.mediumModalWidth,t.open(e,r)},e.prototype.ngOnInit=function(){this.form=new rM({}),this.form.addControl("password",new iM("")),this.form.addControl("confirm_password",new iM("")),this.data.confirm?this.form.get("confirm_password").enable():this.form.get("confirm_password").disable(),this.form.setValidators(this.validateForm.bind(this)),this.data.description&&this.dialogRef.updateSize("400px")},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.passwordSubmit.complete()},e.prototype.proceed=function(){!this.working&&this.form.valid&&(this.msgBarService.hide(),this.button.setLoading(),this.working=!0,this.passwordSubmit.next({password:this.form.get("password").value,close:this.close.bind(this),error:this.error.bind(this)}),this.changeDetector.detectChanges())},e.prototype.validateForm=function(){this.password1ErrorMsg="",this.password2ErrorMsg="";var e=!0;return this.form.get("password").value||(e=!1,this.form.get("password").touched&&(this.password1ErrorMsg="password.password-error-info")),this.data.confirm&&(this.form.get("confirm_password").value||(e=!1,this.form.get("confirm_password").touched&&(this.password2ErrorMsg="password.password-error-info")),e&&this.form.get("password").value!==this.form.get("confirm_password").value&&(e=!1,this.password2ErrorMsg="password.confirm-error-info")),e?null:{Invalid:!0}},e.prototype.close=function(){this.dialogRef.close()},e.prototype.error=function(e){e.type||(e=Hp(e)),e.translatableErrorMsg=e.translatableErrorMsg?e.translatableErrorMsg:"password.decrypting-error",this.msgBarService.showError(e),this.button.resetState(),this.working=!1},e.\u0275fac=function(t){return new(t||e)(ms(Tw),ms(xw),ms(HC),ms(ul))},e.\u0275cmp=lt({type:e,selectors:[["app-password-dialog"]],viewQuery:function(e,t){var n;1&e&&cc(LA,!0),2&e&&uc(n=fc())&&(t.button=n.first)},decls:31,vars:23,consts:[[3,"headline","dialog","disableDismiss"],[3,"ngClass",4,"ngIf"],[3,"ngClass","formGroup"],[1,"form-field"],["for","password"],["formControlName","password","id","password","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],["class","form-field",4,"ngIf"],["class","link",3,"ngClass","href",4,"ngIf"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"],["button",""],[3,"ngClass"],["for","confirm_password"],["formControlName","confirm_password","id","confirm_password","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],[1,"link",3,"ngClass","href"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),Vl(2,"translate"),ou(3,"\n "),fs(4,DA,3,6,"div",1),ou(5,"\n "),_s(6,"div",2),ou(7,"\n "),_s(8,"div",3),ou(9,"\n "),_s(10,"label",4),ou(11),Vl(12,"translate"),ys(),ou(13,"\n "),_s(14,"input",5),Ls("keydown.enter",function(){return t.proceed()})("blur",function(){return t.validateForm()}),ys(),ou(15,"\n "),ys(),ou(16,"\n "),fs(17,OA,8,5,"div",6),ou(18,"\n "),ys(),ou(19,"\n "),fs(20,PA,3,7,"a",7),ou(21,"\n "),_s(22,"div",8),ou(23,"\n "),_s(24,"app-button",9,10),Ls("action",function(){return t.proceed()}),ou(26),Vl(27,"translate"),ys(),ou(28,"\n "),ys(),ou(29,"\n"),ys(),ou(30,"\n")),2&e&&(gs("headline",t.data.title?Ul(1,13,t.data.title):Ul(2,15,"password.title"))("dialog",t.dialogRef)("disableDismiss",t.working),Pa(4),gs("ngIf",t.data.description),Pa(2),gs("ngClass",Rl(21,AA,t.data.description))("formGroup",t.form),Pa(5),su(Ul(12,17,"password.password-label")),Pa(3),gs("appFormFieldError",t.password1ErrorMsg),cs("disabled",t.working?"true":null),Pa(3),gs("ngIf",t.data.confirm),Pa(3),gs("ngIf",t.data.wallet),Pa(4),gs("disabled",!t.form.valid),Pa(2),uu("\n ",Ul(27,19,"password.proceed-button"),"\n "))},directives:[AM,fh,lh,wk,pM,Xw,bk,wM,XD,QD,gC],pipes:[oS],styles:[".link[_ngcontent-%COMP%]{width:100%;display:inline-block;text-align:center}"]}),e}(),IA=["button"],RA=function(){function e(e,t){this.dialogRef=e,this.msgBarService=t,this.createRequested=new Zl,this.inputErrorMsg=""}return e.openDialog=function(t){var n=new bw;return n.autoFocus=!0,n.width=zp.mediumModalWidth,t.open(e,n)},e.prototype.ngOnInit=function(){this.form=new rM({}),this.form.addControl("quantity",new iM(1)),this.form.setValidators(this.validateForm.bind(this))},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.createRequested.complete()},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.continue=function(){var e=this;this.button.isLoading()||(this.msgBarService.hide(),this.button.setLoading(),this.createRequested.emit({howManyAddresses:this.form.value.quantity,callback:function(t,n){void 0===n&&(n=!1),e.button.resetState(),n?e.msgBarService.showError("wallet.add-addresses.error"):t&&e.closePopup()}}))},e.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0,t=this.form.get("quantity").value;return(!t||t<1||t>100||t!==Math.round(t))&&(e=!1,this.form.get("quantity").touched&&(this.inputErrorMsg="wallet.add-addresses.quantity-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ms(xw),ms(HC))},e.\u0275cmp=lt({type:e,selectors:[["app-number-of-addresses"]],viewQuery:function(e,t){var n;1&e&&cc(IA,!0),2&e&&uc(n=fc())&&(t.button=n.first)},outputs:{createRequested:"createRequested"},decls:30,vars:18,consts:[[3,"headline","dialog","disableDismiss"],[3,"formGroup"],[1,"form-field"],["for","quantity"],["formControlName","quantity","id","quantity","type","number","min","1","max","100",3,"appFormFieldError","keydown.enter","blur"],[1,"-buttons"],[3,"disabled","action"],[1,"primary-button",3,"disabled","action"],["button",""]],template:function(e,t){if(1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),_s(4,"div",1),ou(5,"\n "),_s(6,"div",2),ou(7,"\n "),_s(8,"label",3),ou(9),Vl(10,"translate"),ys(),ou(11,"\n "),_s(12,"input",4),Ls("keydown.enter",function(){return t.continue()})("blur",function(){return t.validateForm()}),ys(),ou(13,"\n "),ys(),ou(14,"\n "),ys(),ou(15,"\n "),ou(16,"\n "),_s(17,"div",5),ou(18,"\n "),_s(19,"app-button",6),Ls("action",function(){return t.closePopup()}),ou(20),Vl(21,"translate"),ys(),ou(22,"\n "),_s(23,"app-button",7,8),Ls("action",function(){return t.continue()}),ou(25),Vl(26,"translate"),ys(),ou(27,"\n "),ys(),ou(28,"\n"),ys(),ou(29,"\n")),2&e){var n=ps(24);gs("headline",Ul(1,10,"wallet.add-addresses.title"))("dialog",t.dialogRef)("disableDismiss",n.isLoading()),Pa(4),gs("formGroup",t.form),Pa(5),su(Ul(10,12,"wallet.add-addresses.quantity-label")),Pa(3),gs("appFormFieldError",t.inputErrorMsg),Pa(7),gs("disabled",n&&n.isLoading()),Pa(1),uu("\n ",Ul(21,14,"common.cancel-button"),"\n "),Pa(3),gs("disabled",!t.form.valid),Pa(2),uu("\n ",Ul(26,16,"common.create-button"),"\n ")}},directives:[AM,wk,pM,Xw,Mk,bk,wM,QD,gC],pipes:[oS],styles:[""]}),e}();function FA(e,t){if(1&e&&(bs(0,"app-hw-message",4),Vl(1,"translate")),2&e){var n=As();gs("text",Ul(1,3,"hardware-wallet.confirm-address.instructions"))("lowerBigText",n.data.wallet.addresses[n.data.addressIndex].address)("icon",n.msgIcons.Confirm)}}function HA(e,t){if(1&e&&(bs(0,"app-hw-message",5),Vl(1,"translate")),2&e){var n=As();gs("text",Ul(1,2,n.result.text))("icon",n.result.icon)}}function jA(e,t){if(1&e){var n=Ss();_s(0,"div",6),ou(1,"\n "),_s(2,"app-button",7,8),Ls("action",function(){return sn(n),As().closeModal()}),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()}2&e&&(Pa(4),uu("\n ",Ul(5,1,"common.close-button"),"\n "))}var NA=function(){return function(){}}(),BA=function(e){function t(t,n,i,r){var a=e.call(this,r,n)||this;return a.data=t,a.dialogRef=n,a.hardwareWalletService=i,a.operationSubscription=a.hardwareWalletService.confirmAddress(t.wallet,t.addressIndex).subscribe(function(){a.showResult({text:t.showCompleteConfirmation?"hardware-wallet.confirm-address.confirmation":"hardware-wallet.confirm-address.short-confirmation",icon:a.msgIcons.Success})},function(e){return a.processHwOperationError(e)}),a}return Vw(t,e),t.openDialog=function(e,n){var i=new bw;return i.width="566px",i.autoFocus=!1,i.data=n,e.open(t,i)},t.\u0275fac=function(e){return new(e||t)(ms(Tw),ms(xw),ms(WO),ms(Bw))},t.\u0275cmp=lt({type:t,selectors:[["app-hw-confirm-address-dialog"]],features:[Jo],decls:13,vars:8,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","lowerBigText","icon",4,"ngIf"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","lowerBigText","icon"],[3,"text","icon"],[1,"-buttons"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,FA,2,5,"app-hw-message",1),ou(5,"\n\n "),ou(6,"\n "),fs(7,HA,2,4,"app-hw-message",2),ou(8,"\n\n "),ou(9,"\n "),fs(10,jA,7,3,"div",3),ou(11,"\n"),ys(),ou(12,"\n")),2&e&&(gs("headline",Ul(1,6,"hardware-wallet.confirm-address.title"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Initial),Pa(4),gs("ngIf",t.currentState===t.states.Initial),Pa(3),gs("ngIf",t.currentState===t.states.ShowingResult),Pa(3),gs("ngIf",t.currentState!==t.states.Initial))},directives:[AM,fh,jS,gC],pipes:[oS],styles:[""]}),t}(yC),WA=function(e){return e.new="new",e.scan="scan",e}({}),VA=function(){function e(e){this.dialogRef=e,this.addressOptions=WA}return e.openDialog=function(t){var n=new bw;return n.autoFocus=!1,n.width=zp.mediumModalWidth,t.open(e,n)},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.select=function(e){this.dialogRef.close(e)},e.\u0275fac=function(t){return new(t||e)(ms(xw))},e.\u0275cmp=lt({type:e,selectors:[["app-address-options"]],decls:37,vars:13,consts:[[3,"headline","dialog"],[1,"list-button-container","light-button-theme"],["mat-button","","color","primary",1,"top-line",3,"click"],[1,"content"],["src","assets/img/plus-green.png"],["mat-button","","color","primary",3,"click"],["src","assets/img/search-gold.png"],[1,"help-icon",3,"matTooltip"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),_s(3,"div",1),ou(4,"\n "),ou(5,"\n "),_s(6,"button",2),Ls("click",function(){return t.select(t.addressOptions.new)}),ou(7,"\n "),_s(8,"div",3),ou(9,"\n "),bs(10,"img",4),ou(11,"\n "),_s(12,"span"),ou(13),Vl(14,"translate"),ys(),ou(15,"\n "),ys(),ou(16,"\n "),ys(),ou(17,"\n "),ou(18,"\n "),_s(19,"button",5),Ls("click",function(){return t.select(t.addressOptions.scan)}),ou(20,"\n "),_s(21,"div",3),ou(22,"\n "),bs(23,"img",6),ou(24,"\n "),_s(25,"span"),ou(26),Vl(27,"translate"),_s(28,"mat-icon",7),Vl(29,"translate"),ou(30,"help"),ys(),ou(31,"\n "),ys(),ou(32,"\n "),ys(),ou(33,"\n "),ys(),ou(34,"\n "),ys(),ou(35,"\n"),ys(),ou(36,"\n")),2&e&&(gs("headline",Ul(1,5,"wallet.address-options.title"))("dialog",t.dialogRef),Pa(13),su(Ul(14,7,"wallet.address-options.new")),Pa(13),uu("\n ",Ul(27,9,"wallet.address-options.scan"),"\n "),Pa(2),gs("matTooltip",Ul(29,11,"wallet.address-options.scan-help")))},directives:[AM,US,uC,KD],pipes:[oS],styles:[".content[_ngcontent-%COMP%]{display:flex;align-items:center}.content[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:32px;width:32px;margin-right:5px}.content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}"]}),e}(),UA=n("wd/R"),zA=function(){function e(e,t,n){this.walletsAndAddressesService=e,this.apiService=t,this.storageService=n}return e.prototype.getTransactionsHistory=function(e){var t,n=this,i=new Map;return(e?xf([e]):this.walletsAndAddressesService.allWallets).pipe(ep(),ue(function(e){var t=[];e.forEach(function(e){e.addresses.map(function(n){t.push(n),(!i.has(n.address)||i.get(n.address).addresses.length=zp.maxHardwareWalletAddresses)ID.openDialog(this.dialog,{text:"wallet.max-hardware-wallets-error",headerText:"common.error",defaultButtons:YD.Close});else if(this.msgBarService.hide(),this.wallet.isHardware)this.continueNewAddress(1);else{var t=RA.openDialog(this.dialog),n=zp.maxAddressesGap;this.numberOfAddressesSubscription=t.componentInstance.createRequested.subscribe(function(t){var i=t.howManyAddresses,r=t.callback,a=0;e.wallet.addresses.forEach(function(e,t){e.coins.isGreaterThan(0)&&(a=t)}),e.wallet.addresses.length-(a+1)+i-1}},{key:"_isBadInput",value:function(){var e=this._elementRef.nativeElement.validity;return e&&e.badInput}},{key:"setDescribedByIds",value:function(e){e.length?this._elementRef.nativeElement.setAttribute("aria-describedby",e.join(" ")):this._elementRef.nativeElement.removeAttribute("aria-describedby")}},{key:"onContainerClick",value:function(){this.focused||this.focus()}},{key:"disabled",get:function(){return this.ngControl&&null!==this.ngControl.disabled?this.ngControl.disabled:this._disabled},set:function(e){this._disabled=Xp(e),this.focused&&(this.focused=!1,this.stateChanges.next())}},{key:"id",get:function(){return this._id},set:function(e){this._id=e||this._uid}},{key:"required",get:function(){return this._required},set:function(e){this._required=Xp(e)}},{key:"type",get:function(){return this._type},set:function(e){this._type=e||"text",this._validateType(),!this._isTextarea&&Vm().has(this._type)&&(this._elementRef.nativeElement.type=this._type)}},{key:"value",get:function(){return this._inputValueAccessor.value},set:function(e){e!==this.value&&(this._inputValueAccessor.value=e,this.stateChanges.next())}},{key:"readonly",get:function(){return this._readonly},set:function(e){this._readonly=Xp(e)}},{key:"empty",get:function(){return!(this._isNeverEmpty()||this._elementRef.nativeElement.value||this._isBadInput()||this.autofilled)}},{key:"shouldLabelFloat",get:function(){if(this._isNativeSelect){var e=this._elementRef.nativeElement,t=e.options[0];return this.focused||e.multiple||!this.empty||!!(e.selectedIndex>-1&&t&&t.label)}return this.focused||!this.empty}}]),n}(FY);return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(Nm),ms(_k,10),ms(uM,8),ms(pM,8),ms(Wb),ms(YY,10),ms(DY),ms(Nc),ms(PY,8))},e.\u0275dir=gt({type:e,selectors:[["input","matInput",""],["textarea","matInput",""],["select","matNativeControl",""],["input","matNativeControl",""],["textarea","matNativeControl",""]],hostAttrs:[1,"mat-input-element","mat-form-field-autofill-control"],hostVars:9,hostBindings:function(e,t){1&e&&Ls("focus",function(){return t._focusChanged(!0)})("blur",function(){return t._focusChanged(!1)})("input",function(){return t._onInput()}),2&e&&(fu("disabled",t.disabled)("required",t.required),cs("id",t.id)("data-placeholder",t.placeholder)("readonly",t.readonly&&!t._isNativeSelect||null)("aria-invalid",t.errorState)("aria-required",t.required.toString()),Ks("mat-input-server",t._isServer))},inputs:{id:"id",disabled:"disabled",required:"required",type:"type",value:"value",readonly:"readonly",placeholder:"placeholder",errorStateMatcher:"errorStateMatcher",userAriaDescribedBy:["aria-describedby","userAriaDescribedBy"]},exportAs:["matInput"],features:[Eu([{provide:EY,useExisting:e}]),Jo,Yt]}),e}(),jY=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[Wb],imports:[[OY,AY,Rb],OY,AY]}),e}(),NY=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[Rb],Rb]}),e}(),BY=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[Vb,ew,Rb,nw,Ph],Vb,Rb,nw,NY]}),e}(),WY=["trigger"],VY=["panel"];function UY(e,t){if(1&e&&(_s(0,"span",8),ou(1),ys()),2&e){var n=As();Pa(1),su(n.placeholder||"\xa0")}}function zY(e,t){if(1&e&&(_s(0,"span"),ou(1),ys()),2&e){var n=As(2);Pa(1),su(n.triggerValue||"\xa0")}}function qY(e,t){1&e&&Rs(0,0,["*ngSwitchCase","true"])}function GY(e,t){1&e&&(_s(0,"span",9),ou(1,"\n "),fs(2,zY,2,1,"span",10),ou(3,"\n "),fs(4,qY,1,0,"ng-content",11),ou(5,"\n "),ys()),2&e&&(gs("ngSwitch",!!As().customTrigger),Pa(4),gs("ngSwitchCase",!0))}function KY(e,t){if(1&e){var n=Ss();ou(0,"\n "),_s(1,"div",12),ou(2,"\n "),_s(3,"div",13,14),Ls("@transformPanel.done",function(e){return sn(n),As()._panelDoneAnimatingStream.next(e.toState)})("keydown",function(e){return sn(n),As()._handleKeydown(e)}),ou(5,"\n "),Rs(6,1),ou(7,"\n "),ys(),ou(8,"\n "),ys(),ou(9,"\n")}if(2&e){var i=As();Pa(1),gs("@transformPanelWrap",void 0),Pa(2),hu("mat-select-panel ",i._getPanelTheme(),""),Gs("transform-origin",i._transformOrigin)("font-size",i._triggerFontSize,"px"),gs("ngClass",i.panelClass)("@transformPanel",i.multiple?"showing-multiple":"showing"),cs("id",i.id+"-panel")("aria-multiselectable",i.multiple)("aria-label",i.ariaLabel||null)("aria-labelledby",i._getPanelAriaLabelledby())}}var JY=[[["mat-select-trigger"]],"*"],ZY=["mat-select-trigger","*"],QY={transformPanelWrap:Fv("transformPanelWrap",[Vv("* => void",zv("@transformPanel",[Uv()],{optional:!0}))]),transformPanel:Fv("transformPanel",[Bv("void",Nv({transform:"scaleY(0.8)",minWidth:"100%",opacity:0})),Bv("showing",Nv({opacity:1,minWidth:"calc(100% + 32px)",transform:"scaleY(1)"})),Bv("showing-multiple",Nv({opacity:1,minWidth:"calc(100% + 64px)",transform:"scaleY(1)"})),Vv("void => *",Hv("120ms cubic-bezier(0, 0, 0.2, 1)")),Vv("* => void",Hv("100ms 25ms linear",Nv({opacity:0})))])},XY=0,$Y=256,eI=new Si("mat-select-scroll-strategy"),tI=new Si("MAT_SELECT_CONFIG"),nI={provide:eI,deps:[Ng],useFactory:function(e){return function(){return e.scrollStrategies.reposition()}}},iI=function e(t,n){v(this,e),this.source=t,this.value=n},rI=jb(Nb(Fb(Bb(function e(t,n,i,r,a){v(this,e),this._elementRef=t,this._defaultErrorStateMatcher=n,this._parentForm=i,this._parentFormGroup=r,this.ngControl=a})))),aI=new Si("MatSelectTrigger"),oI=function(){var e=function e(){v(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275dir=gt({type:e,selectors:[["mat-select-trigger"]],features:[Eu([{provide:aI,useExisting:e}])]}),e}(),sI=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r,o,s,u,l,c,h,f,p,m,g,_){var y,b,w,k;return v(this,n),(y=t.call(this,s,o,l,c,f))._viewportRuler=e,y._changeDetectorRef=i,y._ngZone=r,y._dir=u,y._parentFormField=h,y.ngControl=f,y._liveAnnouncer=g,y._defaultOptions=_,y._panelOpen=!1,y._compareWith=function(e,t){return e===t},y._uid="mat-select-".concat(XY++),y._triggerAriaLabelledBy=null,y._destroy=new z,y._onChange=function(){},y._onTouched=function(){},y._valueId="mat-select-value-".concat(XY++),y._panelDoneAnimatingStream=new z,y._overlayPanelClass=(null===(b=y._defaultOptions)||void 0===b?void 0:b.overlayPanelClass)||"",y._focused=!1,y.controlType="mat-select",y._required=!1,y._multiple=!1,y._disableOptionCentering=null!==(k=null===(w=y._defaultOptions)||void 0===w?void 0:w.disableOptionCentering)&&void 0!==k&&k,y.ariaLabel="",y.optionSelectionChanges=_w(function(){var e=y.options;return e?e.changes.pipe(xm(e),Lm(function(){return pe.apply(void 0,d(e.map(function(e){return e.onSelectionChange})))})):y._ngZone.onStable.pipe(Uf(1),Lm(function(){return y.optionSelectionChanges}))}),y.openedChange=new Zl,y._openedStream=y.openedChange.pipe(Nf(function(e){return e}),ie(function(){})),y._closedStream=y.openedChange.pipe(Nf(function(e){return!e}),ie(function(){})),y.selectionChange=new Zl,y.valueChange=new Zl,y.ngControl&&(y.ngControl.valueAccessor=a(y)),null!=(null==_?void 0:_.typeaheadDebounceInterval)&&(y._typeaheadDebounceInterval=_.typeaheadDebounceInterval),y._scrollStrategyFactory=m,y._scrollStrategy=y._scrollStrategyFactory(),y.tabIndex=parseInt(p)||0,y.id=y.id,y}return g(n,[{key:"ngOnInit",value:function(){var e=this;this._selectionModel=new Jm(this.multiple),this.stateChanges.next(),this._panelDoneAnimatingStream.pipe(function(e){return e.lift(new hm(undefined,undefined))},wm(this._destroy)).subscribe(function(){return e._panelDoneAnimating(e.panelOpen)})}},{key:"ngAfterContentInit",value:function(){var e=this;this._initKeyManager(),this._selectionModel.changed.pipe(wm(this._destroy)).subscribe(function(e){e.added.forEach(function(e){return e.select()}),e.removed.forEach(function(e){return e.deselect()})}),this.options.changes.pipe(xm(null),wm(this._destroy)).subscribe(function(){e._resetOptions(),e._initializeSelection()})}},{key:"ngDoCheck",value:function(){var e=this._getTriggerAriaLabelledby();if(e!==this._triggerAriaLabelledBy){var t=this._elementRef.nativeElement;this._triggerAriaLabelledBy=e,e?t.setAttribute("aria-labelledby",e):t.removeAttribute("aria-labelledby")}this.ngControl&&this.updateErrorState()}},{key:"ngOnChanges",value:function(e){e.disabled&&this.stateChanges.next(),e.typeaheadDebounceInterval&&this._keyManager&&this._keyManager.withTypeAhead(this._typeaheadDebounceInterval)}},{key:"ngOnDestroy",value:function(){this._destroy.next(),this._destroy.complete(),this.stateChanges.complete()}},{key:"toggle",value:function(){this.panelOpen?this.close():this.open()}},{key:"open",value:function(){this._canOpen()&&(this._panelOpen=!0,this._keyManager.withHorizontalOrientation(null),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck())}},{key:"close",value:function(){this._panelOpen&&(this._panelOpen=!1,this._keyManager.withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._changeDetectorRef.markForCheck(),this._onTouched())}},{key:"writeValue",value:function(e){this.value=e}},{key:"registerOnChange",value:function(e){this._onChange=e}},{key:"registerOnTouched",value:function(e){this._onTouched=e}},{key:"setDisabledState",value:function(e){this.disabled=e,this._changeDetectorRef.markForCheck(),this.stateChanges.next()}},{key:"_isRtl",value:function(){return!!this._dir&&"rtl"===this._dir.value}},{key:"_handleKeydown",value:function(e){this.disabled||(this.panelOpen?this._handleOpenKeydown(e):this._handleClosedKeydown(e))}},{key:"_handleClosedKeydown",value:function(e){var t=e.keyCode,n=t===hg||t===dg||37===t||39===t,i=13===t||32===t,r=this._keyManager;if(!r.isTyping()&&i&&!fg(e)||(this.multiple||e.altKey)&&n)e.preventDefault(),this.open();else if(!this.multiple){var a=this.selected;r.onKeydown(e);var o=this.selected;o&&a!==o&&this._liveAnnouncer.announce(o.viewValue,1e4)}}},{key:"_handleOpenKeydown",value:function(e){var t=this._keyManager,n=e.keyCode,i=n===hg||n===dg,r=t.isTyping();if(i&&e.altKey)e.preventDefault(),this.close();else if(r||13!==n&&32!==n||!t.activeItem||fg(e))if(!r&&this._multiple&&65===n&&e.ctrlKey){e.preventDefault();var a=this.options.some(function(e){return!e.disabled&&!e.selected});this.options.forEach(function(e){e.disabled||(a?e.select():e.deselect())})}else{var o=t.activeItemIndex;t.onKeydown(e),this._multiple&&i&&e.shiftKey&&t.activeItem&&t.activeItemIndex!==o&&t.activeItem._selectViaInteraction()}else e.preventDefault(),t.activeItem._selectViaInteraction()}},{key:"_onFocus",value:function(){this.disabled||(this._focused=!0,this.stateChanges.next())}},{key:"_onBlur",value:function(){this._focused=!1,this.disabled||this.panelOpen||(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}},{key:"_onAttached",value:function(){var e=this;this.overlayDir.positionChange.pipe(Uf(1)).subscribe(function(){e._changeDetectorRef.detectChanges(),e._positioningSettled()})}},{key:"_getPanelTheme",value:function(){return this._parentFormField?"mat-".concat(this._parentFormField.color):""}},{key:"_initializeSelection",value:function(){var e=this;Promise.resolve().then(function(){e._setSelectionByValue(e.ngControl?e.ngControl.value:e._value),e.stateChanges.next()})}},{key:"_setSelectionByValue",value:function(e){var t=this;if(this._selectionModel.selected.forEach(function(e){return e.setInactiveStyles()}),this._selectionModel.clear(),this.multiple&&e)Array.isArray(e),e.forEach(function(e){return t._selectValue(e)}),this._sortValues();else{var n=this._selectValue(e);n?this._keyManager.updateActiveItem(n):this.panelOpen||this._keyManager.updateActiveItem(-1)}this._changeDetectorRef.markForCheck()}},{key:"_selectValue",value:function(e){var t=this,n=this.options.find(function(n){try{return null!=n.value&&t._compareWith(n.value,e)}catch(i){return!1}});return n&&this._selectionModel.select(n),n}},{key:"_initKeyManager",value:function(){var e=this;this._keyManager=new fv(this.options).withTypeAhead(this._typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl()?"rtl":"ltr").withHomeAndEnd().withAllowedModifierKeys(["shiftKey"]),this._keyManager.tabOut.pipe(wm(this._destroy)).subscribe(function(){e.panelOpen&&(!e.multiple&&e._keyManager.activeItem&&e._keyManager.activeItem._selectViaInteraction(),e.focus(),e.close())}),this._keyManager.change.pipe(wm(this._destroy)).subscribe(function(){e._panelOpen&&e.panel?e._scrollOptionIntoView(e._keyManager.activeItemIndex||0):e._panelOpen||e.multiple||!e._keyManager.activeItem||e._keyManager.activeItem._selectViaInteraction()})}},{key:"_resetOptions",value:function(){var e=this,t=pe(this.options.changes,this._destroy);this.optionSelectionChanges.pipe(wm(t)).subscribe(function(t){e._onSelect(t.source,t.isUserInput),t.isUserInput&&!e.multiple&&e._panelOpen&&(e.close(),e.focus())}),pe.apply(void 0,d(this.options.map(function(e){return e._stateChanges}))).pipe(wm(t)).subscribe(function(){e._changeDetectorRef.markForCheck(),e.stateChanges.next()})}},{key:"_onSelect",value:function(e,t){var n=this._selectionModel.isSelected(e);null!=e.value||this._multiple?(n!==e.selected&&(e.selected?this._selectionModel.select(e):this._selectionModel.deselect(e)),t&&this._keyManager.setActiveItem(e),this.multiple&&(this._sortValues(),t&&this.focus())):(e.deselect(),this._selectionModel.clear(),null!=this.value&&this._propagateChanges(e.value)),n!==this._selectionModel.isSelected(e)&&this._propagateChanges(),this.stateChanges.next()}},{key:"_sortValues",value:function(){var e=this;if(this.multiple){var t=this.options.toArray();this._selectionModel.sort(function(n,i){return e.sortComparator?e.sortComparator(n,i,t):t.indexOf(n)-t.indexOf(i)}),this.stateChanges.next()}}},{key:"_propagateChanges",value:function(e){var t;t=this.multiple?this.selected.map(function(e){return e.value}):this.selected?this.selected.value:e,this._value=t,this.valueChange.emit(t),this._onChange(t),this.selectionChange.emit(this._getChangeEvent(t)),this._changeDetectorRef.markForCheck()}},{key:"_highlightCorrectOption",value:function(){this._keyManager&&(this.empty?this._keyManager.setFirstItemActive():this._keyManager.setActiveItem(this._selectionModel.selected[0]))}},{key:"_canOpen",value:function(){var e;return!this._panelOpen&&!this.disabled&&(null===(e=this.options)||void 0===e?void 0:e.length)>0}},{key:"focus",value:function(e){this._elementRef.nativeElement.focus(e)}},{key:"_getPanelAriaLabelledby",value:function(){if(this.ariaLabel)return null;var e=this._getLabelId();return this.ariaLabelledby?e+" "+this.ariaLabelledby:e}},{key:"_getAriaActiveDescendant",value:function(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null}},{key:"_getLabelId",value:function(){var e;return(null===(e=this._parentFormField)||void 0===e?void 0:e.getLabelId())||""}},{key:"_getTriggerAriaLabelledby",value:function(){if(this.ariaLabel)return null;var e=this._getLabelId()+" "+this._valueId;return this.ariaLabelledby&&(e+=" "+this.ariaLabelledby),e}},{key:"_panelDoneAnimating",value:function(e){this.openedChange.emit(e)}},{key:"setDescribedByIds",value:function(e){this._ariaDescribedby=e.join(" ")}},{key:"onContainerClick",value:function(){this.focus(),this.open()}},{key:"focused",get:function(){return this._focused||this._panelOpen}},{key:"placeholder",get:function(){return this._placeholder},set:function(e){this._placeholder=e,this.stateChanges.next()}},{key:"required",get:function(){return this._required},set:function(e){this._required=Xp(e),this.stateChanges.next()}},{key:"multiple",get:function(){return this._multiple},set:function(e){this._multiple=Xp(e)}},{key:"disableOptionCentering",get:function(){return this._disableOptionCentering},set:function(e){this._disableOptionCentering=Xp(e)}},{key:"compareWith",get:function(){return this._compareWith},set:function(e){this._compareWith=e,this._selectionModel&&this._initializeSelection()}},{key:"value",get:function(){return this._value},set:function(e){e!==this._value&&(this.options&&this._setSelectionByValue(e),this._value=e)}},{key:"typeaheadDebounceInterval",get:function(){return this._typeaheadDebounceInterval},set:function(e){this._typeaheadDebounceInterval=$p(e)}},{key:"id",get:function(){return this._id},set:function(e){this._id=e||this._uid,this.stateChanges.next()}},{key:"panelOpen",get:function(){return this._panelOpen}},{key:"selected",get:function(){return this.multiple?this._selectionModel.selected:this._selectionModel.selected[0]}},{key:"triggerValue",get:function(){if(this.empty)return"";if(this._multiple){var e=this._selectionModel.selected.map(function(e){return e.viewValue});return this._isRtl()&&e.reverse(),e.join(", ")}return this._selectionModel.selected[0].viewValue}},{key:"empty",get:function(){return!this._selectionModel||this._selectionModel.isEmpty()}},{key:"shouldLabelFloat",get:function(){return this._panelOpen||!this.empty}}]),n}(rI);return e.\u0275fac=function(t){return new(t||e)(ms(Qm),ms(ul),ms(Nc),ms(Wb),ms(ju),ms(Gm,8),ms(uM,8),ms(pM,8),ms(PY,8),ms(_k,10),wi("tabindex"),ms(eI),ms(kv),ms(tI,8))},e.\u0275dir=gt({type:e,viewQuery:function(e,t){var n;1&e&&(cc(WY,!0),cc(VY,!0),cc(Ug,!0)),2&e&&(uc(n=fc())&&(t.trigger=n.first),uc(n=fc())&&(t.panel=n.first),uc(n=fc())&&(t.overlayDir=n.first))},inputs:{ariaLabel:["aria-label","ariaLabel"],id:"id",placeholder:"placeholder",required:"required",multiple:"multiple",disableOptionCentering:"disableOptionCentering",compareWith:"compareWith",value:"value",typeaheadDebounceInterval:"typeaheadDebounceInterval",panelClass:"panelClass",ariaLabelledby:["aria-labelledby","ariaLabelledby"],errorStateMatcher:"errorStateMatcher",sortComparator:"sortComparator"},outputs:{openedChange:"openedChange",_openedStream:"opened",_closedStream:"closed",selectionChange:"selectionChange",valueChange:"valueChange"},features:[Jo,Yt]}),e}(),uI=function(){var e=function(e){_(n,e);var t=w(n);function n(){var e;return v(this,n),(e=t.apply(this,arguments))._scrollTop=0,e._triggerFontSize=0,e._transformOrigin="top",e._offsetY=0,e._positions=[{originX:"start",originY:"top",overlayX:"start",overlayY:"top"},{originX:"start",originY:"bottom",overlayX:"start",overlayY:"bottom"}],e}return g(n,[{key:"_calculateOverlayScroll",value:function(e,t,n){var i=this._getItemHeight();return Math.min(Math.max(0,i*e-t+i/2),n)}},{key:"ngOnInit",value:function(){var e=this;r(i(n.prototype),"ngOnInit",this).call(this),this._viewportRuler.change().pipe(wm(this._destroy)).subscribe(function(){e.panelOpen&&(e._triggerRect=e.trigger.nativeElement.getBoundingClientRect(),e._changeDetectorRef.markForCheck())})}},{key:"open",value:function(){var e=this;r(i(n.prototype),"_canOpen",this).call(this)&&(r(i(n.prototype),"open",this).call(this),this._triggerRect=this.trigger.nativeElement.getBoundingClientRect(),this._triggerFontSize=parseInt(getComputedStyle(this.trigger.nativeElement).fontSize||"0"),this._calculateOverlayPosition(),this._ngZone.onStable.pipe(Uf(1)).subscribe(function(){e._triggerFontSize&&e.overlayDir.overlayRef&&e.overlayDir.overlayRef.overlayElement&&(e.overlayDir.overlayRef.overlayElement.style.fontSize="".concat(e._triggerFontSize,"px"))}))}},{key:"_scrollOptionIntoView",value:function(e){var t=mw(e,this.options,this.optionGroups),n=this._getItemHeight();this.panel.nativeElement.scrollTop=gw((e+t)*n,n,this.panel.nativeElement.scrollTop,$Y)}},{key:"_positioningSettled",value:function(){this._calculateOverlayOffsetX(),this.panel.nativeElement.scrollTop=this._scrollTop}},{key:"_panelDoneAnimating",value:function(e){this.panelOpen?this._scrollTop=0:(this.overlayDir.offsetX=0,this._changeDetectorRef.markForCheck()),r(i(n.prototype),"_panelDoneAnimating",this).call(this,e)}},{key:"_getChangeEvent",value:function(e){return new iI(this,e)}},{key:"_calculateOverlayOffsetX",value:function(){var e,t=this.overlayDir.overlayRef.overlayElement.getBoundingClientRect(),n=this._viewportRuler.getViewportSize(),i=this._isRtl(),r=this.multiple?56:32;if(this.multiple)e=40;else{var a=this._selectionModel.selected[0]||this.options.first;e=a&&a.group?32:16}i||(e*=-1);var o=0-(t.left+e-(i?r:0)),s=t.right+e-n.width+(i?0:r);o>0?e+=o+8:s>0&&(e-=s+8),this.overlayDir.offsetX=Math.round(e),this.overlayDir.overlayRef.updatePosition()}},{key:"_calculateOverlayOffsetY",value:function(e,t,n){var i,r=this._getItemHeight(),a=(r-this._triggerRect.height)/2,o=Math.floor($Y/r);return this.disableOptionCentering?0:(i=0===this._scrollTop?e*r:this._scrollTop===n?(e-(this._getItemCount()-o))*r+(r-(this._getItemCount()*r-$Y)%r):t-r/2,Math.round(-1*i-a))}},{key:"_checkOverlayWithinViewport",value:function(e){var t=this._getItemHeight(),n=this._viewportRuler.getViewportSize(),i=this._triggerRect.top-8,r=n.height-this._triggerRect.bottom-8,a=Math.abs(this._offsetY),o=Math.min(this._getItemCount()*t,$Y)-a-this._triggerRect.height;o>r?this._adjustPanelUp(o,r):a>i?this._adjustPanelDown(a,i,e):this._transformOrigin=this._getOriginBasedOnOption()}},{key:"_adjustPanelUp",value:function(e,t){var n=Math.round(e-t);this._scrollTop-=n,this._offsetY-=n,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop<=0&&(this._scrollTop=0,this._offsetY=0,this._transformOrigin="50% bottom 0px")}},{key:"_adjustPanelDown",value:function(e,t,n){var i=Math.round(e-t);if(this._scrollTop+=i,this._offsetY+=i,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop>=n)return this._scrollTop=n,this._offsetY=0,void(this._transformOrigin="50% top 0px")}},{key:"_calculateOverlayPosition",value:function(){var e,t=this._getItemHeight(),n=this._getItemCount(),i=Math.min(n*t,$Y),r=n*t-i;e=this.empty?0:Math.max(this.options.toArray().indexOf(this._selectionModel.selected[0]),0),e+=mw(e,this.options,this.optionGroups);var a=i/2;this._scrollTop=this._calculateOverlayScroll(e,a,r),this._offsetY=this._calculateOverlayOffsetY(e,a,r),this._checkOverlayWithinViewport(r)}},{key:"_getOriginBasedOnOption",value:function(){var e=this._getItemHeight(),t=(e-this._triggerRect.height)/2,n=Math.abs(this._offsetY)-t+e/2;return"50% ".concat(n,"px 0px")}},{key:"_getItemHeight",value:function(){return 3*this._triggerFontSize}},{key:"_getItemCount",value:function(){return this.options.length+this.optionGroups.length}}]),n}(sI);return e.\u0275fac=function(t){return lI(t||e)},e.\u0275cmp=lt({type:e,selectors:[["mat-select"]],contentQueries:function(e,t,n){var i;1&e&&(hc(n,aI,!0),hc(n,pw,!0),hc(n,sw,!0)),2&e&&(uc(i=fc())&&(t.customTrigger=i.first),uc(i=fc())&&(t.options=i),uc(i=fc())&&(t.optionGroups=i))},hostAttrs:["role","combobox","aria-autocomplete","none","aria-haspopup","true",1,"mat-select"],hostVars:20,hostBindings:function(e,t){1&e&&Ls("keydown",function(e){return t._handleKeydown(e)})("focus",function(){return t._onFocus()})("blur",function(){return t._onBlur()}),2&e&&(cs("id",t.id)("tabindex",t.tabIndex)("aria-controls",t.panelOpen?t.id+"-panel":null)("aria-expanded",t.panelOpen)("aria-label",t.ariaLabel||null)("aria-required",t.required.toString())("aria-disabled",t.disabled.toString())("aria-invalid",t.errorState)("aria-describedby",t._ariaDescribedby||null)("aria-activedescendant",t._getAriaActiveDescendant()),Ks("mat-select-disabled",t.disabled)("mat-select-invalid",t.errorState)("mat-select-required",t.required)("mat-select-empty",t.empty)("mat-select-multiple",t.multiple))},inputs:{disabled:"disabled",disableRipple:"disableRipple",tabIndex:"tabIndex"},exportAs:["matSelect"],features:[Eu([{provide:EY,useExisting:e},{provide:hw,useExisting:e}]),Jo],ngContentSelectors:ZY,decls:18,vars:12,consts:[["cdk-overlay-origin","",1,"mat-select-trigger",3,"click"],["origin","cdkOverlayOrigin","trigger",""],[1,"mat-select-value",3,"ngSwitch"],["class","mat-select-placeholder",4,"ngSwitchCase"],["class","mat-select-value-text",3,"ngSwitch",4,"ngSwitchCase"],[1,"mat-select-arrow-wrapper"],[1,"mat-select-arrow"],["cdk-connected-overlay","","cdkConnectedOverlayLockPosition","","cdkConnectedOverlayHasBackdrop","","cdkConnectedOverlayBackdropClass","cdk-overlay-transparent-backdrop",3,"cdkConnectedOverlayPanelClass","cdkConnectedOverlayScrollStrategy","cdkConnectedOverlayOrigin","cdkConnectedOverlayOpen","cdkConnectedOverlayPositions","cdkConnectedOverlayMinWidth","cdkConnectedOverlayOffsetY","backdropClick","attach","detach"],[1,"mat-select-placeholder"],[1,"mat-select-value-text",3,"ngSwitch"],[4,"ngSwitchDefault"],[4,"ngSwitchCase"],[1,"mat-select-panel-wrap"],["role","listbox","tabindex","-1",3,"ngClass","keydown"],["panel",""]],template:function(e,t){if(1&e&&(Is(JY),ou(0,"\n"),_s(1,"div",0,1),Ls("click",function(){return t.toggle()}),ou(4,"\n "),_s(5,"div",2),ou(6,"\n "),fs(7,UY,2,1,"span",3),ou(8,"\n "),fs(9,GY,6,2,"span",4),ou(10,"\n "),ys(),ou(11,"\n\n "),_s(12,"div",5),bs(13,"div",6),ys(),ou(14,"\n"),ys(),ou(15,"\n\n"),fs(16,KY,10,14,"ng-template",7),Ls("backdropClick",function(){return t.close()})("attach",function(){return t._onAttached()})("detach",function(){return t.close()}),ou(17,"\n")),2&e){var n=ps(2);Pa(1),cs("aria-owns",t.panelOpen?t.id+"-panel":null),Pa(4),gs("ngSwitch",t.empty),cs("id",t._valueId),Pa(2),gs("ngSwitchCase",!0),Pa(2),gs("ngSwitchCase",!1),Pa(7),gs("cdkConnectedOverlayPanelClass",t._overlayPanelClass)("cdkConnectedOverlayScrollStrategy",t._scrollStrategy)("cdkConnectedOverlayOrigin",n)("cdkConnectedOverlayOpen",t.panelOpen)("cdkConnectedOverlayPositions",t._positions)("cdkConnectedOverlayMinWidth",null==t._triggerRect?null:t._triggerRect.width)("cdkConnectedOverlayOffsetY",t._offsetY)}},directives:[Vg,vh,_h,Ug,yh,lh],styles:[".mat-select{display:inline-block;width:100%;outline:none}.mat-select-trigger{display:inline-table;cursor:pointer;position:relative;box-sizing:border-box}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-select-value{display:table-cell;max-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{display:table-cell;vertical-align:middle}.mat-form-field-appearance-fill .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:translateY(-25%)}.mat-form-field-appearance-standard.mat-form-field-has-label .mat-select:not(.mat-select-empty) .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:none}.mat-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.mat-select-panel-wrap{flex-basis:100%}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%;border-radius:4px;outline:0}.cdk-high-contrast-active .mat-select-panel{outline:solid 1px}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable .mat-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-select-placeholder{color:transparent;-webkit-text-fill-color:transparent;transition:none;display:block}\n"],encapsulation:2,data:{animation:[QY.transformPanelWrap,QY.transformPanel]},changeDetection:0}),e}(),lI=bi(uI),cI=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[nI],imports:[[Ph,qg,vw,Rb],Xm,AY,vw,Rb]}),e}(),dI=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[Ph,Rb,sg,ew,iv,Pv],Rb]}),e}(),hI=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[Rb],Rb]}),e}(),fI=["panel"];function pI(e,t){if(1&e&&(ou(0,"\n "),_s(1,"div",0,1),ou(3,"\n "),Rs(4),ou(5,"\n "),ys(),ou(6,"\n")),2&e){var n=t.id,i=As();Pa(1),gs("id",i.id)("ngClass",i._classList),cs("aria-label",i.ariaLabel||null)("aria-labelledby",i._getPanelAriaLabelledby(n))}}var mI=["*"],gI=0,vI=function e(t,n){v(this,e),this.source=t,this.option=n},_I=jb(function e(){v(this,e)}),yI=new Si("mat-autocomplete-default-options",{providedIn:"root",factory:function(){return{autoActiveFirstOption:!1}}}),bI=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r){var a;return v(this,n),(a=t.call(this))._changeDetectorRef=e,a._elementRef=i,a._activeOptionChanges=L.EMPTY,a.showPanel=!1,a._isOpen=!1,a.displayWith=null,a.optionSelected=new Zl,a.opened=new Zl,a.closed=new Zl,a.optionActivated=new Zl,a._classList={},a.id="mat-autocomplete-".concat(gI++),a._autoActiveFirstOption=!!r.autoActiveFirstOption,a}return g(n,[{key:"ngAfterContentInit",value:function(){var e=this;this._keyManager=new fv(this.options).withWrap(),this._activeOptionChanges=this._keyManager.change.subscribe(function(t){e.optionActivated.emit({source:e,option:e.options.toArray()[t]||null})}),this._setVisibility()}},{key:"ngOnDestroy",value:function(){this._activeOptionChanges.unsubscribe()}},{key:"_setScrollTop",value:function(e){this.panel&&(this.panel.nativeElement.scrollTop=e)}},{key:"_getScrollTop",value:function(){return this.panel?this.panel.nativeElement.scrollTop:0}},{key:"_setVisibility",value:function(){this.showPanel=!!this.options.length,this._setVisibilityClasses(this._classList),this._changeDetectorRef.markForCheck()}},{key:"_emitSelectEvent",value:function(e){var t=new vI(this,e);this.optionSelected.emit(t)}},{key:"_getPanelAriaLabelledby",value:function(e){return this.ariaLabel?null:this.ariaLabelledby?e+" "+this.ariaLabelledby:e}},{key:"_setVisibilityClasses",value:function(e){e[this._visibleClass]=this.showPanel,e[this._hiddenClass]=!this.showPanel}},{key:"isOpen",get:function(){return this._isOpen&&this.showPanel}},{key:"autoActiveFirstOption",get:function(){return this._autoActiveFirstOption},set:function(e){this._autoActiveFirstOption=Xp(e)}},{key:"classList",set:function(e){this._classList=e&&e.length?function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:/\s+/,n=[];if(null!=e){var i,r=c(Array.isArray(e)?e:"".concat(e).split(t));try{for(r.s();!(i=r.n()).done;){var a="".concat(i.value).trim();a&&n.push(a)}}catch(o){r.e(o)}finally{r.f()}}return n}(e).reduce(function(e,t){return e[t]=!0,e},{}):{},this._setVisibilityClasses(this._classList),this._elementRef.nativeElement.className=""}}]),n}(_I);return e.\u0275fac=function(t){return new(t||e)(ms(ul),ms(ju),ms(yI))},e.\u0275dir=gt({type:e,viewQuery:function(e,t){var n;1&e&&(lc(ml,!0),cc(fI,!0)),2&e&&(uc(n=fc())&&(t.template=n.first),uc(n=fc())&&(t.panel=n.first))},inputs:{displayWith:"displayWith",autoActiveFirstOption:"autoActiveFirstOption",classList:["class","classList"],ariaLabel:["aria-label","ariaLabel"],ariaLabelledby:["aria-labelledby","ariaLabelledby"],panelWidth:"panelWidth"},outputs:{optionSelected:"optionSelected",opened:"opened",closed:"closed",optionActivated:"optionActivated"},features:[Jo]}),e}(),wI=function(){var e=function(e){_(n,e);var t=w(n);function n(){var e;return v(this,n),(e=t.apply(this,arguments))._visibleClass="mat-autocomplete-visible",e._hiddenClass="mat-autocomplete-hidden",e}return n}(bI);return e.\u0275fac=function(t){return kI(t||e)},e.\u0275cmp=lt({type:e,selectors:[["mat-autocomplete"]],contentQueries:function(e,t,n){var i;1&e&&(hc(n,sw,!0),hc(n,pw,!0)),2&e&&(uc(i=fc())&&(t.optionGroups=i),uc(i=fc())&&(t.options=i))},hostAttrs:[1,"mat-autocomplete"],inputs:{disableRipple:"disableRipple"},exportAs:["matAutocomplete"],features:[Eu([{provide:hw,useExisting:e}]),Jo],ngContentSelectors:mI,decls:2,vars:0,consts:[["role","listbox",1,"mat-autocomplete-panel",3,"id","ngClass"],["panel",""]],template:function(e,t){1&e&&(Is(),fs(0,pI,7,4,"ng-template"),ou(1,"\n"))},directives:[lh],styles:[".mat-autocomplete-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;visibility:hidden;max-width:none;max-height:256px;position:relative;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.mat-autocomplete-panel.mat-autocomplete-visible{visibility:visible}.mat-autocomplete-panel.mat-autocomplete-hidden{visibility:hidden}.mat-autocomplete-panel-above .mat-autocomplete-panel{border-radius:0;border-top-left-radius:4px;border-top-right-radius:4px}.mat-autocomplete-panel .mat-divider-horizontal{margin-top:-1px}.cdk-high-contrast-active .mat-autocomplete-panel{outline:solid 1px}\n"],encapsulation:2,changeDetection:0}),e}(),kI=bi(wI),MI=new Si("mat-autocomplete-scroll-strategy"),SI={provide:MI,deps:[Ng],useFactory:function(e){return function(){return e.scrollStrategies.reposition()}}},CI={provide:Gw,useExisting:Te(function(){return LI}),multi:!0},xI=function(){var e=function(){function e(t,n,i,r,a,o,s,u,l,c,h){var f=this;v(this,e),this._element=t,this._overlay=n,this._viewContainerRef=i,this._zone=r,this._changeDetectorRef=a,this._dir=s,this._formField=u,this._document=l,this._viewportRuler=c,this._defaults=h,this._componentDestroyed=!1,this._autocompleteDisabled=!1,this._manuallyFloatingLabel=!1,this._viewportSubscription=L.EMPTY,this._canOpenOnNextFocus=!0,this._closeKeyEventStream=new z,this._windowBlurHandler=function(){f._canOpenOnNextFocus=f._document.activeElement!==f._element.nativeElement||f.panelOpen},this._onChange=function(){},this._onTouched=function(){},this.position="auto",this.autocompleteAttribute="off",this._overlayAttached=!1,this.optionSelections=_w(function(){return f.autocomplete&&f.autocomplete.options?pe.apply(void 0,d(f.autocomplete.options.map(function(e){return e.onSelectionChange}))):f._zone.onStable.pipe(Uf(1),Lm(function(){return f.optionSelections}))}),this._scrollStrategy=o}return g(e,[{key:"ngAfterViewInit",value:function(){var e=this,t=this._getWindow();void 0!==t&&this._zone.runOutsideAngular(function(){return t.addEventListener("blur",e._windowBlurHandler)})}},{key:"ngOnChanges",value:function(e){e.position&&this._positionStrategy&&(this._setStrategyPositions(this._positionStrategy),this.panelOpen&&this._overlayRef.updatePosition())}},{key:"ngOnDestroy",value:function(){var e=this._getWindow();void 0!==e&&e.removeEventListener("blur",this._windowBlurHandler),this._viewportSubscription.unsubscribe(),this._componentDestroyed=!0,this._destroyPanel(),this._closeKeyEventStream.complete()}},{key:"openPanel",value:function(){this._attachOverlay(),this._floatLabel()}},{key:"closePanel",value:function(){this._resetLabel(),this._overlayAttached&&(this.panelOpen&&this.autocomplete.closed.emit(),this.autocomplete._isOpen=this._overlayAttached=!1,this._overlayRef&&this._overlayRef.hasAttached()&&(this._overlayRef.detach(),this._closingActionsSubscription.unsubscribe()),this._componentDestroyed||this._changeDetectorRef.detectChanges())}},{key:"updatePosition",value:function(){this._overlayAttached&&this._overlayRef.updatePosition()}},{key:"_getOutsideClickStream",value:function(){var e=this;return pe(rm(this._document,"click"),rm(this._document,"touchend")).pipe(Nf(function(t){var n=e._isInsideShadowRoot&&t.composedPath?t.composedPath()[0]:t.target,i=e._formField?e._formField._elementRef.nativeElement:null,r=e.connectedTo?e.connectedTo.elementRef.nativeElement:null;return e._overlayAttached&&n!==e._element.nativeElement&&(!i||!i.contains(n))&&(!r||!r.contains(n))&&!!e._overlayRef&&!e._overlayRef.overlayElement.contains(n)}))}},{key:"writeValue",value:function(e){var t=this;Promise.resolve(null).then(function(){return t._setTriggerValue(e)})}},{key:"registerOnChange",value:function(e){this._onChange=e}},{key:"registerOnTouched",value:function(e){this._onTouched=e}},{key:"setDisabledState",value:function(e){this._element.nativeElement.disabled=e}},{key:"_handleKeydown",value:function(e){var t=e.keyCode;if(t!==cg||fg(e)||e.preventDefault(),this.activeOption&&13===t&&this.panelOpen)this.activeOption._selectViaInteraction(),this._resetActiveItem(),e.preventDefault();else if(this.autocomplete){var n=this.autocomplete._keyManager.activeItem,i=t===dg||t===hg;this.panelOpen||9===t?this.autocomplete._keyManager.onKeydown(e):i&&this._canOpen()&&this.openPanel(),(i||this.autocomplete._keyManager.activeItem!==n)&&this._scrollToOption(this.autocomplete._keyManager.activeItemIndex||0)}}},{key:"_handleInput",value:function(e){var t=e.target,n=t.value;"number"===t.type&&(n=""==n?null:parseFloat(n)),this._previousValue!==n&&(this._previousValue=n,this._onChange(n),this._canOpen()&&this._document.activeElement===e.target&&this.openPanel())}},{key:"_handleFocus",value:function(){this._canOpenOnNextFocus?this._canOpen()&&(this._previousValue=this._element.nativeElement.value,this._attachOverlay(),this._floatLabel(!0)):this._canOpenOnNextFocus=!0}},{key:"_floatLabel",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this._formField&&"auto"===this._formField.floatLabel&&(e?this._formField._animateAndLockLabel():this._formField.floatLabel="always",this._manuallyFloatingLabel=!0)}},{key:"_resetLabel",value:function(){this._manuallyFloatingLabel&&(this._formField.floatLabel="auto",this._manuallyFloatingLabel=!1)}},{key:"_subscribeToClosingActions",value:function(){var e=this;return pe(this._zone.onStable.pipe(Uf(1)),this.autocomplete.options.changes.pipe(Gg(function(){return e._positionStrategy.reapplyLastPosition()}),Of(0))).pipe(Lm(function(){var t=e.panelOpen;return e._resetActiveItem(),e.autocomplete._setVisibility(),e.panelOpen&&(e._overlayRef.updatePosition(),t!==e.panelOpen&&e.autocomplete.opened.emit()),e.panelClosingActions}),Uf(1)).subscribe(function(t){return e._setValueAndClose(t)})}},{key:"_destroyPanel",value:function(){this._overlayRef&&(this.closePanel(),this._overlayRef.dispose(),this._overlayRef=null)}},{key:"_setTriggerValue",value:function(e){var t=this.autocomplete&&this.autocomplete.displayWith?this.autocomplete.displayWith(e):e,n=null!=t?t:"";this._formField?this._formField._control.value=n:this._element.nativeElement.value=n,this._previousValue=n}},{key:"_setValueAndClose",value:function(e){e&&e.source&&(this._clearPreviousSelectedOption(e.source),this._setTriggerValue(e.source.value),this._onChange(e.source.value),this._element.nativeElement.focus(),this.autocomplete._emitSelectEvent(e.source)),this.closePanel()}},{key:"_clearPreviousSelectedOption",value:function(e){this.autocomplete.options.forEach(function(t){t!==e&&t.selected&&t.deselect()})}},{key:"_attachOverlay",value:function(){var e,t=this;null==this._isInsideShadowRoot&&(this._isInsideShadowRoot=!!zm(this._element.nativeElement));var n=this._overlayRef;n?(this._positionStrategy.setOrigin(this._getConnectedElement()),n.updateSize({width:this._getPanelWidth()})):(this._portal=new ng(this.autocomplete.template,this._viewContainerRef,{id:null===(e=this._formField)||void 0===e?void 0:e._labelId}),n=this._overlay.create(this._getOverlayConfig()),this._overlayRef=n,n.keydownEvents().subscribe(function(e){(e.keyCode===cg&&!fg(e)||e.keyCode===dg&&fg(e,"altKey"))&&(t._resetActiveItem(),t._closeKeyEventStream.next(),e.stopPropagation(),e.preventDefault())}),this._viewportSubscription=this._viewportRuler.change().subscribe(function(){t.panelOpen&&n&&n.updateSize({width:t._getPanelWidth()})})),n&&!n.hasAttached()&&(n.attach(this._portal),this._closingActionsSubscription=this._subscribeToClosingActions());var i=this.panelOpen;this.autocomplete._setVisibility(),this.autocomplete._isOpen=this._overlayAttached=!0,this.panelOpen&&i!==this.panelOpen&&this.autocomplete.opened.emit()}},{key:"_getOverlayConfig",value:function(){var e;return new wg({positionStrategy:this._getOverlayPosition(),scrollStrategy:this._scrollStrategy(),width:this._getPanelWidth(),direction:this._dir,panelClass:null===(e=this._defaults)||void 0===e?void 0:e.overlayPanelClass})}},{key:"_getOverlayPosition",value:function(){var e=this._overlay.position().flexibleConnectedTo(this._getConnectedElement()).withFlexibleDimensions(!1).withPush(!1);return this._setStrategyPositions(e),this._positionStrategy=e,e}},{key:"_setStrategyPositions",value:function(e){var t,n=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],i=this._aboveClass,r=[{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",panelClass:i},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",panelClass:i}];t="above"===this.position?r:"below"===this.position?n:[].concat(n,r),e.withPositions(t)}},{key:"_getConnectedElement",value:function(){return this.connectedTo?this.connectedTo.elementRef:this._formField?this._formField.getConnectedOverlayOrigin():this._element}},{key:"_getPanelWidth",value:function(){return this.autocomplete.panelWidth||this._getHostWidth()}},{key:"_getHostWidth",value:function(){return this._getConnectedElement().nativeElement.getBoundingClientRect().width}},{key:"_resetActiveItem",value:function(){this.autocomplete._keyManager.setActiveItem(this.autocomplete.autoActiveFirstOption?0:-1)}},{key:"_canOpen",value:function(){var e=this._element.nativeElement;return!e.readOnly&&!e.disabled&&!this._autocompleteDisabled}},{key:"_getWindow",value:function(){var e;return(null===(e=this._document)||void 0===e?void 0:e.defaultView)||window}},{key:"_scrollToOption",value:function(e){var t=this.autocomplete,n=mw(e,t.options,t.optionGroups);if(0===e&&1===n)t._setScrollTop(0);else{var i=t.options.toArray()[e];if(i){var r=i._getHostElement(),a=gw(r.offsetTop,r.offsetHeight,t._getScrollTop(),t.panel.nativeElement.offsetHeight);t._setScrollTop(a)}}}},{key:"autocompleteDisabled",get:function(){return this._autocompleteDisabled},set:function(e){this._autocompleteDisabled=Xp(e)}},{key:"panelOpen",get:function(){return this._overlayAttached&&this.autocomplete.showPanel}},{key:"panelClosingActions",get:function(){var e=this;return pe(this.optionSelections,this.autocomplete._keyManager.tabOut.pipe(Nf(function(){return e._overlayAttached})),this._closeKeyEventStream,this._getOutsideClickStream(),this._overlayRef?this._overlayRef.detachments().pipe(Nf(function(){return e._overlayAttached})):xf()).pipe(ie(function(e){return e instanceof dw?e:null}))}},{key:"activeOption",get:function(){return this.autocomplete&&this.autocomplete._keyManager?this.autocomplete._keyManager.activeItem:null}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(Ng),ms(wl),ms(Nc),ms(ul),ms(MI),ms(Gm,8),ms(PY,9),ms(Md,8),ms(Qm),ms(yI,8))},e.\u0275dir=gt({type:e,inputs:{position:["matAutocompletePosition","position"],autocompleteAttribute:["autocomplete","autocompleteAttribute"],autocompleteDisabled:["matAutocompleteDisabled","autocompleteDisabled"],autocomplete:["matAutocomplete","autocomplete"],connectedTo:["matAutocompleteConnectedTo","connectedTo"]},features:[Yt]}),e}(),LI=function(){var e=function(e){_(n,e);var t=w(n);function n(){var e;return v(this,n),(e=t.apply(this,arguments))._aboveClass="mat-autocomplete-panel-above",e}return n}(xI);return e.\u0275fac=function(t){return TI(t||e)},e.\u0275dir=gt({type:e,selectors:[["input","matAutocomplete",""],["textarea","matAutocomplete",""]],hostAttrs:[1,"mat-autocomplete-trigger"],hostVars:7,hostBindings:function(e,t){1&e&&Ls("focusin",function(){return t._handleFocus()})("blur",function(){return t._onTouched()})("input",function(e){return t._handleInput(e)})("keydown",function(e){return t._handleKeydown(e)}),2&e&&cs("autocomplete",t.autocompleteAttribute)("role",t.autocompleteDisabled?null:"combobox")("aria-autocomplete",t.autocompleteDisabled?null:"list")("aria-activedescendant",t.panelOpen&&t.activeOption?t.activeOption.id:null)("aria-expanded",t.autocompleteDisabled?null:t.panelOpen.toString())("aria-owns",t.autocompleteDisabled||!t.panelOpen||null==t.autocomplete?null:t.autocomplete.id)("aria-haspopup",!t.autocompleteDisabled)},exportAs:["matAutocompleteTrigger"],features:[Eu([CI]),Jo]}),e}(),TI=bi(LI),DI=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[SI],imports:[[qg,vw,Rb,Ph],Xm,vw,Rb]}),e}(),OI=["sliderWrapper"],EI=Um({passive:!1}),PI={provide:Gw,useExisting:Te(function(){return II}),multi:!0},AI=function e(){v(this,e)},YI=Nb(Hb(Fb(function e(t){v(this,e),this._elementRef=t}),"accent")),II=function(){var e=function(e){_(n,e);var t=w(n);function n(e,i,r,a,o,s,u,l){var c;return v(this,n),(c=t.call(this,e))._focusMonitor=i,c._changeDetectorRef=r,c._dir=a,c._ngZone=s,c._animationMode=l,c._invert=!1,c._max=100,c._min=0,c._step=1,c._thumbLabel=!1,c._tickInterval=0,c._value=null,c._vertical=!1,c.change=new Zl,c.input=new Zl,c.valueChange=new Zl,c.onTouched=function(){},c._percent=0,c._isSliding=!1,c._isActive=!1,c._tickIntervalPercent=0,c._sliderDimensions=null,c._controlValueAccessorChangeFn=function(){},c._dirChangeSubscription=L.EMPTY,c._pointerDown=function(e){c.disabled||c._isSliding||!RI(e)&&0!==e.button||c._ngZone.run(function(){var t=c.value,n=FI(e);c._isSliding=!0,c._lastPointerEvent=e,e.preventDefault(),c._focusHostElement(),c._onMouseenter(),c._bindGlobalEvents(e),c._focusHostElement(),c._updateValueFromPosition(n),c._valueOnSlideStart=t,t!=c.value&&c._emitInputEvent()})},c._pointerMove=function(e){if(c._isSliding){e.preventDefault();var t=c.value;c._lastPointerEvent=e,c._updateValueFromPosition(FI(e)),t!=c.value&&c._emitInputEvent()}},c._pointerUp=function(e){c._isSliding&&(e.preventDefault(),c._removeGlobalEvents(),c._isSliding=!1,c._valueOnSlideStart==c.value||c.disabled||c._emitChangeEvent(),c._valueOnSlideStart=c._lastPointerEvent=null)},c._windowBlur=function(){c._lastPointerEvent&&c._pointerUp(c._lastPointerEvent)},c._document=u,c.tabIndex=parseInt(o)||0,s.runOutsideAngular(function(){var t=e.nativeElement;t.addEventListener("mousedown",c._pointerDown,EI),t.addEventListener("touchstart",c._pointerDown,EI)}),c}return g(n,[{key:"focus",value:function(e){this._focusHostElement(e)}},{key:"blur",value:function(){this._blurHostElement()}},{key:"_shouldInvertAxis",value:function(){return this.vertical?!this.invert:this.invert}},{key:"_isMinValue",value:function(){return 0===this.percent}},{key:"_getThumbGap",value:function(){return this.disabled?7:this._isMinValue()&&!this.thumbLabel?this._isActive?10:7:0}},{key:"_getTrackBackgroundStyles",value:function(){var e=this.vertical?"Y":"X",t=this.vertical?"1, ".concat(1-this.percent,", 1"):"".concat(1-this.percent,", 1, 1"),n=this._shouldInvertMouseCoords()?"-":"";return{transform:"translate".concat(e,"(").concat(n).concat(this._getThumbGap(),"px) scale3d(").concat(t,")")}}},{key:"_getTrackFillStyles",value:function(){var e=this.percent,t=this.vertical?"Y":"X",n=this.vertical?"1, ".concat(e,", 1"):"".concat(e,", 1, 1"),i=this._shouldInvertMouseCoords()?"":"-";return{transform:"translate".concat(t,"(").concat(i).concat(this._getThumbGap(),"px) scale3d(").concat(n,")"),display:0===e?"none":""}}},{key:"_getTicksContainerStyles",value:function(){var e=this.vertical?"Y":"X",t=this.vertical||"rtl"!=this._getDirection()?"-":"",n=this._tickIntervalPercent/2*100;return{transform:"translate".concat(e,"(").concat(t).concat(n,"%)")}}},{key:"_getTicksStyles",value:function(){var e=100*this._tickIntervalPercent,t=this.vertical?"2px ".concat(e,"%"):"".concat(e,"% 2px"),n=this.vertical?"Y":"X",i=this.vertical||"rtl"!=this._getDirection()?"":"-",r=this.vertical||"rtl"!=this._getDirection()?"":" rotate(180deg)",a={backgroundSize:t,transform:"translateZ(0) translate".concat(n,"(").concat(i).concat(e/2,"%)").concat(r)};if(this._isMinValue()&&this._getThumbGap()){var o=this._shouldInvertAxis();a["padding".concat(this.vertical?o?"Bottom":"Top":o?"Right":"Left")]="".concat(this._getThumbGap(),"px")}return a}},{key:"_getThumbContainerStyles",value:function(){var e=this._shouldInvertAxis(),t=this.vertical?"Y":"X",n=100*(("rtl"!=this._getDirection()||this.vertical?e:!e)?this.percent:1-this.percent);return{transform:"translate".concat(t,"(-").concat(n,"%)")}}},{key:"_shouldInvertMouseCoords",value:function(){var e=this._shouldInvertAxis();return"rtl"!=this._getDirection()||this.vertical?e:!e}},{key:"_getDirection",value:function(){return this._dir&&"rtl"==this._dir.value?"rtl":"ltr"}},{key:"ngAfterViewInit",value:function(){var e=this;this._focusMonitor.monitor(this._elementRef,!0).subscribe(function(t){e._isActive=!!t&&"keyboard"!==t,e._changeDetectorRef.detectChanges()}),this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(function(){e._changeDetectorRef.markForCheck()}))}},{key:"ngOnDestroy",value:function(){var e=this._elementRef.nativeElement;e.removeEventListener("mousedown",this._pointerDown,EI),e.removeEventListener("touchstart",this._pointerDown,EI),this._lastPointerEvent=null,this._removeGlobalEvents(),this._focusMonitor.stopMonitoring(this._elementRef),this._dirChangeSubscription.unsubscribe()}},{key:"_onMouseenter",value:function(){this.disabled||(this._sliderDimensions=this._getSliderDimensions(),this._updateTickIntervalPercent())}},{key:"_onFocus",value:function(){this._sliderDimensions=this._getSliderDimensions(),this._updateTickIntervalPercent()}},{key:"_onBlur",value:function(){this.onTouched()}},{key:"_onKeydown",value:function(e){if(!this.disabled&&!fg(e)){var t=this.value;switch(e.keyCode){case 33:this._increment(10);break;case 34:this._increment(-10);break;case 35:this.value=this.max;break;case 36:this.value=this.min;break;case 37:this._increment("rtl"==this._getDirection()?1:-1);break;case dg:this._increment(1);break;case 39:this._increment("rtl"==this._getDirection()?-1:1);break;case hg:this._increment(-1);break;default:return}t!=this.value&&(this._emitInputEvent(),this._emitChangeEvent()),this._isSliding=!0,e.preventDefault()}}},{key:"_onKeyup",value:function(){this._isSliding=!1}},{key:"_getWindow",value:function(){return this._document.defaultView||window}},{key:"_bindGlobalEvents",value:function(e){var t=this._document,n=RI(e),i=n?"touchend":"mouseup";t.addEventListener(n?"touchmove":"mousemove",this._pointerMove,EI),t.addEventListener(i,this._pointerUp,EI),n&&t.addEventListener("touchcancel",this._pointerUp,EI);var r=this._getWindow();void 0!==r&&r&&r.addEventListener("blur",this._windowBlur)}},{key:"_removeGlobalEvents",value:function(){var e=this._document;e.removeEventListener("mousemove",this._pointerMove,EI),e.removeEventListener("mouseup",this._pointerUp,EI),e.removeEventListener("touchmove",this._pointerMove,EI),e.removeEventListener("touchend",this._pointerUp,EI),e.removeEventListener("touchcancel",this._pointerUp,EI);var t=this._getWindow();void 0!==t&&t&&t.removeEventListener("blur",this._windowBlur)}},{key:"_increment",value:function(e){this.value=this._clamp((this.value||0)+this.step*e,this.min,this.max)}},{key:"_updateValueFromPosition",value:function(e){if(this._sliderDimensions){var t=this._clamp(((this.vertical?e.y:e.x)-(this.vertical?this._sliderDimensions.top:this._sliderDimensions.left))/(this.vertical?this._sliderDimensions.height:this._sliderDimensions.width));if(this._shouldInvertMouseCoords()&&(t=1-t),0===t)this.value=this.min;else if(1===t)this.value=this.max;else{var n=this._calculateValue(t),i=Math.round((n-this.min)/this.step)*this.step+this.min;this.value=this._clamp(i,this.min,this.max)}}}},{key:"_emitChangeEvent",value:function(){this._controlValueAccessorChangeFn(this.value),this.valueChange.emit(this.value),this.change.emit(this._createChangeEvent())}},{key:"_emitInputEvent",value:function(){this.input.emit(this._createChangeEvent())}},{key:"_updateTickIntervalPercent",value:function(){if(this.tickInterval&&this._sliderDimensions)if("auto"==this.tickInterval){var e=this.vertical?this._sliderDimensions.height:this._sliderDimensions.width,t=Math.ceil(30/(e*this.step/(this.max-this.min)));this._tickIntervalPercent=t*this.step/e}else this._tickIntervalPercent=this.tickInterval*this.step/(this.max-this.min)}},{key:"_createChangeEvent",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.value,t=new AI;return t.source=this,t.value=e,t}},{key:"_calculatePercentage",value:function(e){return((e||0)-this.min)/(this.max-this.min)}},{key:"_calculateValue",value:function(e){return this.min+e*(this.max-this.min)}},{key:"_clamp",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return Math.max(t,Math.min(e,n))}},{key:"_getSliderDimensions",value:function(){return this._sliderWrapper?this._sliderWrapper.nativeElement.getBoundingClientRect():null}},{key:"_focusHostElement",value:function(e){this._elementRef.nativeElement.focus(e)}},{key:"_blurHostElement",value:function(){this._elementRef.nativeElement.blur()}},{key:"writeValue",value:function(e){this.value=e}},{key:"registerOnChange",value:function(e){this._controlValueAccessorChangeFn=e}},{key:"registerOnTouched",value:function(e){this.onTouched=e}},{key:"setDisabledState",value:function(e){this.disabled=e}},{key:"invert",get:function(){return this._invert},set:function(e){this._invert=Xp(e)}},{key:"max",get:function(){return this._max},set:function(e){this._max=$p(e,this._max),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()}},{key:"min",get:function(){return this._min},set:function(e){this._min=$p(e,this._min),null===this._value&&(this.value=this._min),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()}},{key:"step",get:function(){return this._step},set:function(e){this._step=$p(e,this._step),this._step%1!=0&&(this._roundToDecimal=this._step.toString().split(".").pop().length),this._changeDetectorRef.markForCheck()}},{key:"thumbLabel",get:function(){return this._thumbLabel},set:function(e){this._thumbLabel=Xp(e)}},{key:"tickInterval",get:function(){return this._tickInterval},set:function(e){this._tickInterval="auto"===e?"auto":"number"==typeof e||"string"==typeof e?$p(e,this._tickInterval):0}},{key:"value",get:function(){return null===this._value&&(this.value=this._min),this._value},set:function(e){if(e!==this._value){var t=$p(e);this._roundToDecimal&&t!==this.min&&t!==this.max&&(t=parseFloat(t.toFixed(this._roundToDecimal))),this._value=t,this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()}}},{key:"vertical",get:function(){return this._vertical},set:function(e){this._vertical=Xp(e)}},{key:"displayValue",get:function(){return this.displayWith?this.displayWith(this.value):this._roundToDecimal&&this.value&&this.value%1!=0?this.value.toFixed(this._roundToDecimal):this.value||0}},{key:"percent",get:function(){return this._clamp(this._percent)}}]),n}(YI);return e.\u0275fac=function(t){return new(t||e)(ms(ju),ms(xv),ms(ul),ms(Gm,8),wi("tabindex"),ms(Nc),ms(Md),ms(xb,8))},e.\u0275cmp=lt({type:e,selectors:[["mat-slider"]],viewQuery:function(e,t){var n;1&e&&cc(OI,!0),2&e&&uc(n=fc())&&(t._sliderWrapper=n.first)},hostAttrs:["role","slider",1,"mat-slider","mat-focus-indicator"],hostVars:29,hostBindings:function(e,t){1&e&&Ls("focus",function(){return t._onFocus()})("blur",function(){return t._onBlur()})("keydown",function(e){return t._onKeydown(e)})("keyup",function(){return t._onKeyup()})("mouseenter",function(){return t._onMouseenter()})("selectstart",function(e){return e.preventDefault()}),2&e&&(fu("tabIndex",t.tabIndex),cs("aria-disabled",t.disabled)("aria-valuemax",t.max)("aria-valuemin",t.min)("aria-valuenow",t.value)("aria-valuetext",null==t.valueText?t.displayValue:t.valueText)("aria-orientation",t.vertical?"vertical":"horizontal"),Ks("mat-slider-disabled",t.disabled)("mat-slider-has-ticks",t.tickInterval)("mat-slider-horizontal",!t.vertical)("mat-slider-axis-inverted",t._shouldInvertAxis())("mat-slider-invert-mouse-coords",t._shouldInvertMouseCoords())("mat-slider-sliding",t._isSliding)("mat-slider-thumb-label-showing",t.thumbLabel)("mat-slider-vertical",t.vertical)("mat-slider-min-value",t._isMinValue())("mat-slider-hide-last-tick",t.disabled||t._isMinValue()&&t._getThumbGap()&&t._shouldInvertAxis())("_mat-animation-noopable","NoopAnimations"===t._animationMode))},inputs:{disabled:"disabled",color:"color",tabIndex:"tabIndex",invert:"invert",max:"max",min:"min",value:"value",step:"step",thumbLabel:"thumbLabel",tickInterval:"tickInterval",vertical:"vertical",displayWith:"displayWith",valueText:"valueText"},outputs:{change:"change",input:"input",valueChange:"valueChange"},exportAs:["matSlider"],features:[Eu([PI]),Jo],decls:29,vars:6,consts:[[1,"mat-slider-wrapper"],["sliderWrapper",""],[1,"mat-slider-track-wrapper"],[1,"mat-slider-track-background",3,"ngStyle"],[1,"mat-slider-track-fill",3,"ngStyle"],[1,"mat-slider-ticks-container",3,"ngStyle"],[1,"mat-slider-ticks",3,"ngStyle"],[1,"mat-slider-thumb-container",3,"ngStyle"],[1,"mat-slider-focus-ring"],[1,"mat-slider-thumb"],[1,"mat-slider-thumb-label"],[1,"mat-slider-thumb-label-text"]],template:function(e,t){1&e&&(_s(0,"div",0,1),ou(2,"\n "),_s(3,"div",2),ou(4,"\n "),bs(5,"div",3),ou(6,"\n "),bs(7,"div",4),ou(8,"\n "),ys(),ou(9,"\n "),_s(10,"div",5),ou(11,"\n "),bs(12,"div",6),ou(13,"\n "),ys(),ou(14,"\n "),_s(15,"div",7),ou(16,"\n "),bs(17,"div",8),ou(18,"\n "),bs(19,"div",9),ou(20,"\n "),_s(21,"div",10),ou(22,"\n "),_s(23,"span",11),ou(24),ys(),ou(25,"\n "),ys(),ou(26,"\n "),ys(),ou(27,"\n"),ys(),ou(28,"\n")),2&e&&(Pa(5),gs("ngStyle",t._getTrackBackgroundStyles()),Pa(2),gs("ngStyle",t._getTrackFillStyles()),Pa(3),gs("ngStyle",t._getTicksContainerStyles()),Pa(2),gs("ngStyle",t._getTicksStyles()),Pa(3),gs("ngStyle",t._getThumbContainerStyles()),Pa(9),su(t.displayValue))},directives:[bh],styles:['.mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:none;vertical-align:middle}.mat-slider:not(.mat-slider-disabled):active,.mat-slider.mat-slider-sliding:not(.mat-slider-disabled){cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-wrapper{position:absolute}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{background-repeat:repeat;background-clip:content-box;box-sizing:border-box;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider.cdk-keyboard-focused .mat-slider-focus-ring,.mat-slider.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb{cursor:-webkit-grab;cursor:grab}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(0.7);transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-radius 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.cdk-high-contrast-active .mat-slider-thumb-label{outline:solid 1px}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-sliding .mat-slider-track-fill,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-thumb-container{transition-duration:0ms}.mat-slider-has-ticks .mat-slider-wrapper::after{content:"";position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{display:none}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(0.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.cdk-high-contrast-active .mat-slider-horizontal .mat-slider-ticks-container{height:0;outline:solid 2px;top:1px}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(0.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label,.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label-text{transform:none}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.cdk-high-contrast-active .mat-slider-vertical .mat-slider-ticks-container{width:0;outline:solid 2px;left:1px}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(0.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}.mat-slider._mat-animation-noopable .mat-slider-track-fill,.mat-slider._mat-animation-noopable .mat-slider-track-background,.mat-slider._mat-animation-noopable .mat-slider-ticks,.mat-slider._mat-animation-noopable .mat-slider-thumb-container,.mat-slider._mat-animation-noopable .mat-slider-focus-ring,.mat-slider._mat-animation-noopable .mat-slider-thumb,.mat-slider._mat-animation-noopable .mat-slider-thumb-label,.mat-slider._mat-animation-noopable .mat-slider-thumb-label-text,.mat-slider._mat-animation-noopable .mat-slider-has-ticks .mat-slider-wrapper::after{transition:none}\n'],encapsulation:2,changeDetection:0}),e}();function RI(e){return"t"===e.type[0]}function FI(e){var t=RI(e)?e.touches[0]||e.changedTouches[0]:e;return{x:t.clientX,y:t.clientY}}var HI=function(){var e=function e(){v(this,e)};return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[Ph,Rb],Rb]}),e}(),jI=function(){function e(e,t){this.walletsAndAddressesService=e,this.router=t}return e.prototype.canActivate=function(e,t){var n=this;return new Promise(function(e){n.walletsAndAddressesService.allWallets.pipe(ep()).subscribe(function(t){return 0===t.length?(n.router.navigate(["/wizard"]),e(!1)):e(!0)})})},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(ix),Gi(WT))}}),e}();function NI(e,t){if(1&e){var n=Ss();ws(0),ou(1,"\n "),_s(2,"button",6),Ls("click",function(){sn(n);var e=t.$implicit;return As(3).select(e.address)}),ou(3,"\n "),_s(4,"div",7),ou(5),ys(),ou(6,"\n "),_s(7,"div",8),ou(8),Vl(9,"amount"),_s(10,"span",9),ou(11),Vl(12,"amount"),ys(),ou(13),Vl(14,"amount"),_s(15,"span",9),ou(16),Vl(17,"amount"),ys(),ou(18,"\n "),ys(),ou(19,"\n "),ys(),ou(20,"\n "),ks()}if(2&e){var i=t.$implicit;Pa(5),su(i.address),Pa(3),uu("",ql(9,5,i.coins,!0,"first"),"\n "),Pa(3),uu("",ql(12,9,i.coins,!0,"last")," | "),Pa(2),uu("\n ",ql(14,13,i.hours,!1,"first"),"\n "),Pa(3),su(ql(17,17,i.hours,!1,"last"))}}function BI(e,t){if(1&e&&(ws(0),ou(1,"\n "),fs(2,NI,21,21,"ng-container",5),ou(3,"\n "),ks()),2&e){var n=As().$implicit;Pa(2),gs("ngForOf",n.addresses)}}function WI(e,t){1&e&&(ws(0),ou(1,"\n "),_s(2,"div",10),_s(3,"mat-icon",11),ou(4,"error"),ys(),ou(5),Vl(6,"translate"),ys(),ou(7,"\n "),ks()),2&e&&(Pa(3),gs("inline",!0),Pa(2),su(Ul(6,2,"select-address.no-addresses")))}function VI(e,t){if(1&e&&(_s(0,"div",2),ou(1,"\n "),_s(2,"div",3),ou(3),ys(),ou(4,"\n "),fs(5,BI,4,1,"ng-container",4),ou(6,"\n "),fs(7,WI,8,4,"ng-container",4),ou(8,"\n "),ys()),2&e){var n=t.$implicit;Pa(2),Fs("title",n.label),Pa(1),su(n.label),Pa(2),gs("ngIf",n.addresses.length>0),Pa(2),gs("ngIf",0===n.addresses.length)}}var UI=function(){return function(){this.addresses=[]}}(),zI=function(){function e(e,t){var n=this;this.dialogRef=e,this.balanceAndOutputsService=t,this.listElements=[],this.balanceAndOutputsService.walletsWithBalance.pipe(ep()).subscribe(function(e){e.forEach(function(e){var t=new UI;t.label=e.label,e.addresses.forEach(function(n){e.isHardware&&!n.confirmed||t.addresses.push({address:n.address,coins:n.coins,hours:n.hours})}),n.listElements.push(t)})})}return e.openDialog=function(t){var n=new bw;return n.autoFocus=!1,n.width=zp.mediumModalWidth,t.open(e,n)},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.select=function(e){this.dialogRef.close(e)},e.\u0275fac=function(t){return new(t||e)(ms(xw),ms(LO))},e.\u0275cmp=lt({type:e,selectors:[["app-select-address"]],decls:6,vars:5,consts:[[3,"headline","dialog"],["class","wallet-container list-button-container light-button-theme",4,"ngFor","ngForOf"],[1,"wallet-container","list-button-container","light-button-theme"],[1,"title",3,"title"],[4,"ngIf"],[4,"ngFor","ngForOf"],["mat-button","","color","primary",3,"click"],[1,"address"],[1,"balance"],[1,"grey-text"],[1,"no-addresses-msg"],[3,"inline"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),fs(3,VI,9,4,"div",1),ou(4,"\n"),ys(),ou(5,"\n")),2&e&&(gs("headline",Ul(1,3,"select-address.title"))("dialog",t.dialogRef),Pa(3),gs("ngForOf",t.listElements))},directives:[AM,dh,fh,US,uC],pipes:[oS,yS],styles:[".wallet-container[_ngcontent-%COMP%]{padding-top:30px}.wallet-container[_ngcontent-%COMP%]:first-child{padding-top:0}.wallet-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{color:#1e2227;border-bottom:1px solid rgba(30,34,39,.05);padding:0 10px;font-size:18px;line-height:1.8;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.wallet-container[_ngcontent-%COMP%] .address[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}.wallet-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%]{font-size:12px;line-height:1.5;color:#1e2227}.wallet-container[_ngcontent-%COMP%] .no-addresses-msg[_ngcontent-%COMP%]{padding:10px}.wallet-container[_ngcontent-%COMP%] .no-addresses-msg[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:5px;position:relative;top:2px}"]}),e}(),qI=["button"],GI=function(){function e(t,n,i,r,a){this.dialogRef=t,this.data=n,this.formBuilder=i,this.msgBarService=r,this.storageService=a,this.maxNoteChars=e.MAX_NOTE_CHARS,this.busy=!1}return e.openDialog=function(t,n){var i=new bw;return i.data=n,i.autoFocus=!0,i.width=zp.mediumModalWidth,t.open(e,i)},e.prototype.ngOnInit=function(){this.originalNote=this.data.note?this.data.note:"",this.form=this.formBuilder.group({note:[this.data.note]})},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.OperationSubscription&&this.OperationSubscription.unsubscribe()},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.changeNote=function(){var e=this;if(!this.busy){var t=this.form.value.note?this.form.value.note.trim():"";this.originalNote!==t?(this.busy=!0,this.msgBarService.hide(),this.button.setLoading(),this.OperationSubscription=this.storageService.store(xC.NOTES,this.data.id,t).subscribe(function(){e.busy=!1,e.dialogRef.close(t)},function(t){e.busy=!1,e.msgBarService.showError(t),e.button.resetState().setEnabled()})):this.closePopup()}},e.MAX_NOTE_CHARS=64,e.\u0275fac=function(t){return new(t||e)(ms(xw),ms(Tw),ms(TM),ms(HC),ms(LC))},e.\u0275cmp=lt({type:e,selectors:[["app-change-note"]],viewQuery:function(e,t){var n;1&e&&cc(qI,!0),2&e&&uc(n=fc())&&(t.button=n.first)},decls:34,vars:20,consts:[[3,"headline","dialog","disableDismiss"],[3,"formGroup"],[1,"form-field"],["for","note"],[1,"help-icon",3,"matTooltip"],["formControlName","note","id","note",3,"maxlength","keydown.enter"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],["button",""]],template:function(e,t){if(1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),_s(4,"div",1),ou(5,"\n "),_s(6,"div",2),ou(7,"\n "),_s(8,"label",3),ou(9),Vl(10,"translate"),_s(11,"mat-icon",4),Vl(12,"translate"),ou(13,"help"),ys(),ou(14,"\n "),ys(),ou(15,"\n "),_s(16,"input",5),Ls("keydown.enter",function(){return t.changeNote()}),ys(),ou(17,"\n "),ys(),ou(18,"\n "),ys(),ou(19,"\n "),ou(20,"\n "),_s(21,"div",6),ou(22,"\n "),_s(23,"app-button",7),Ls("action",function(){return t.closePopup()}),ou(24),Vl(25,"translate"),ys(),ou(26,"\n "),_s(27,"app-button",8,9),Ls("action",function(){return t.changeNote()}),ou(29),Vl(30,"translate"),ys(),ou(31,"\n "),ys(),ou(32,"\n"),ys(),ou(33,"\n")),2&e){var n=ps(28);gs("headline",Ul(1,10,"edit-note.title"))("dialog",t.dialogRef)("disableDismiss",n&&n.isLoading()),Pa(4),gs("formGroup",t.form),Pa(5),uu("\n ",Ul(10,12,"send.personal-note-label"),"\n "),Pa(2),gs("matTooltip",Ul(12,14,"send.personal-note-help")),Pa(5),gs("maxlength",t.maxNoteChars),cs("disabled",t.busy?"true":null),Pa(8),uu("\n ",Ul(25,16,"common.cancel-button"),"\n "),Pa(5),uu("\n ",Ul(30,18,"edit-note.change-button"),"\n ")}},directives:[AM,wk,pM,uC,KD,Xw,bk,wM,CM,gC],pipes:[oS],styles:[""]}),e}(),KI=function(){function e(e,t,n,i){this.dialogRef=e,this.data=t,this.formBuilder=n,this.msgBarService=i,this.inputErrorMsg=""}return e.openDialog=function(t,n){var i=new bw;return i.data=n,i.autoFocus=!0,i.width=zp.mediumModalWidth,t.open(e,i)},e.prototype.ngOnInit=function(){this.form=this.formBuilder.group({data:[this.data]}),this.form.setValidators(this.validateForm.bind(this))},e.prototype.ngOnDestroy=function(){this.msgBarService.hide()},e.prototype.processData=function(){try{if(0===this.form.value.data.trim().length)return void this.msgBarService.showError("send.bulk-send.no-data-error");var e=this.form.value.data.split(/\r?\n/);if(!e||0===e.length)return void this.msgBarService.showError("send.bulk-send.no-data-error");var t=(e=e.filter(function(e){return e.trim().length>0}))[0].split(",").length;if(2!==t&&3!==t)return void this.msgBarService.showError("send.bulk-send.invalid-data-error");var n=[],i=!0;if(e.forEach(function(e){var r=e.split(","),a={address:r[0].trim(),coins:r[1].trim(),originalAmount:null};a.hours=3===r.length?r[2].trim():void 0,n.push(a),r.length!==t&&(i=!1)}),!i)return void this.msgBarService.showError("send.bulk-send.inconsistent-data-error");this.dialogRef.close(n)}catch(r){this.msgBarService.showError("send.bulk-send.invalid-data-error")}},e.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0;return this.form.get("data").value&&this.form.get("data").value.trim()||(e=!1,this.form.get("data").touched&&(this.inputErrorMsg="send.bulk-send.data-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ms(xw),ms(Tw),ms(TM),ms(HC))},e.\u0275cmp=lt({type:e,selectors:[["app-multiple-destinations-dialog"]],decls:20,vars:13,consts:[[3,"headline","dialog"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],["formControlName","data","id","data","rows","5",3,"appFormFieldError","blur"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2),Vl(3,"translate"),_s(4,"div",1),ou(5,"\n "),_s(6,"div",2),ou(7,"\n "),_s(8,"textarea",3),Ls("blur",function(){return t.validateForm()}),ys(),ou(9,"\n "),ys(),ou(10,"\n "),ys(),ou(11,"\n "),_s(12,"div",4),ou(13,"\n "),_s(14,"app-button",5),Ls("action",function(){return t.processData()}),ou(15),Vl(16,"translate"),ys(),ou(17,"\n "),ys(),ou(18,"\n"),ys(),ou(19,"\n")),2&e&&(gs("headline",Ul(1,7,"send.bulk-send.title"))("dialog",t.dialogRef),Pa(2),uu("\n ",Ul(3,9,"send.bulk-send.indications"),"\n "),Pa(2),gs("formGroup",t.form),Pa(4),gs("appFormFieldError",t.inputErrorMsg),Pa(6),gs("disabled",!t.form.valid),Pa(1),uu("\n ",Ul(16,11,"send.bulk-send.process-button"),"\n "))},directives:[AM,wk,pM,Xw,bk,wM,QD,gC],pipes:[oS],styles:[""]}),e}();function JI(e,t){if(1&e){var n=Ss();_s(0,"div",2),ou(1,"\n "),_s(2,"label",3),ou(3),Vl(4,"translate"),_s(5,"mat-icon",4),Vl(6,"translate"),ou(7,"help"),ys(),ou(8,"\n "),ys(),ou(9,"\n "),_s(10,"input",5),Ls("blur",function(){return sn(n),As().validateForm()}),ys(),ou(11,"\n "),ys()}if(2&e){var i=As();Pa(3),uu("\n ",Ul(4,4,"send.addresses-label"),"\n "),Pa(2),gs("matTooltip",Ul(6,6,"send.addresses-manual-help")),Pa(5),gs("appFormFieldError",i.manualAddressesErrorMsg),cs("disabled",i.busy?"true":null)}}function ZI(e,t){if(1&e&&(ws(0),ou(1,"\n "),_s(2,"option",12),ou(3),Vl(4,"amount"),Vl(5,"amount"),ys(),ou(6,"\n "),ks()),2&e){var n=t.$implicit;Pa(2),gs("disabled",!n.coins||n.coins.isLessThanOrEqualTo(0))("ngValue",n),Pa(1),cu("\n ",n.label," - ",Ul(4,5,n.coins?n.coins:0),"\n (",zl(5,7,n.hours?n.hours:0,!1),")\n ")}}function QI(e,t){if(1&e&&(ws(0),ou(1,"\n "),fs(2,ZI,7,10,"ng-container",11),ou(3,"\n "),ks()),2&e){var n=As(2);Pa(2),gs("ngForOf",n.allWallets)}}function XI(e,t){if(1&e){var n=Ss();_s(0,"div",2),ou(1,"\n "),_s(2,"label",6),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),_s(6,"div",7),ou(7,"\n "),_s(8,"select",8),Ls("blur",function(){return sn(n),As().validateForm()}),ou(9,"\n "),_s(10,"option",9),ou(11),Vl(12,"translate"),ys(),ou(13,"\n "),fs(14,QI,4,1,"ng-container",10),ou(15,"\n "),ys(),ou(16,"\n "),ys(),ou(17,"\n "),ys()}if(2&e){var i=As();Pa(3),su(Ul(4,6,i.selectionMode===i.sourceSelectionModes.Wallet?"send.from-label":"send.wallet-label")),Pa(5),gs("appFormFieldError",i.walletErrorMsg),cs("disabled",i.busy?"true":null),Pa(2),gs("ngValue",""),Pa(1),su(Ul(12,8,"send.select-wallet")),Pa(3),gs("ngIf",i.allWallets)}}function $I(e,t){if(1&e&&(_s(0,"mat-option",17),ou(1),Vl(2,"amount"),Vl(3,"amount"),ys()),2&e){var n=t.$implicit;gs("value",n),Pa(1),cu("\n ",n.address," - ",Ul(2,4,n.coins?n.coins:0),"\n (",zl(3,6,n.hours,!1),")\n ")}}function eR(e,t){if(1&e&&(_s(0,"div"),ou(1),Vl(2,"amount"),Vl(3,"amount"),ys()),2&e){var n=t.$implicit;Pa(1),cu("\n ",n.address," - ",Ul(2,3,n.coins?n.coins:0),"\n (",zl(3,5,n.hours,!1),")\n ")}}var tR=function(e){return{"element-disabled":e}};function nR(e,t){if(1&e){var n=Ss();_s(0,"div",2),ou(1,"\n "),_s(2,"label",13),Ls("click",function(){sn(n);var e=ps(13);return As().busy?null:e.open()}),ou(3),Vl(4,"translate"),_s(5,"mat-icon",4),Vl(6,"translate"),ou(7,"help"),ys(),ou(8,"\n "),ys(),ou(9,"\n "),_s(10,"div",7),ou(11,"\n "),_s(12,"mat-select",14,15),Vl(14,"translate"),ou(15,"\n "),fs(16,$I,4,9,"mat-option",16),ou(17,"\n "),_s(18,"mat-select-trigger"),ou(19,"\n "),fs(20,eR,4,8,"div",11),ou(21,"\n "),ys(),ou(22,"\n "),ys(),ou(23,"\n "),ys(),ou(24,"\n "),ys()}if(2&e){var i=As();Pa(2),gs("for",i.busy?"":"addresses"),Pa(1),uu("\n ",Ul(4,8,"send.addresses-label"),"\n "),Pa(2),gs("matTooltip",Ul(6,10,"send.addresses-help")),Pa(7),gs("placeholder",Ul(14,12,i.addressessPlaceholder))("ngClass",Rl(14,tR,i.busy||i.addresses&&0===i.addresses.length)),cs("disabled",i.busy||i.addresses&&0===i.addresses.length?"true":null),Pa(4),gs("ngForOf",i.addresses),Pa(4),gs("ngForOf",i.form.get("addresses").value)}}function iR(e,t){1&e&&(_s(0,"mat-icon",21),Vl(1,"translate"),ou(2,"error"),ys()),2&e&&gs("matTooltip",Ul(1,1,"send.outputs-error"))}function rR(e,t){1&e&&bs(0,"mat-spinner")}function aR(e,t){if(1&e&&(_s(0,"mat-option",17),ou(1),Vl(2,"amount"),Vl(3,"amount"),ys()),2&e){var n=t.$implicit;gs("value",n),Pa(1),cu("\n ",n.hash," - ",Ul(2,4,n.coins?n.coins:0),"\n (",zl(3,6,n.hours,!1),")\n ")}}function oR(e,t){if(1&e&&(_s(0,"div"),ou(1),Vl(2,"amount"),Vl(3,"amount"),ys()),2&e){var n=t.$implicit;Pa(1),cu("\n ",n.hash," - ",Ul(2,3,n.coins?n.coins:0),"\n (",zl(3,5,n.hours,!1),")\n ")}}function sR(e,t){if(1&e){var n=Ss();_s(0,"div",2),ou(1,"\n "),_s(2,"label",13),Ls("click",function(){sn(n);var e=ps(17);return As().busy?null:e.open()}),ou(3),Vl(4,"translate"),_s(5,"mat-icon",4),Vl(6,"translate"),ou(7,"help"),ys(),ou(8,"\n "),fs(9,iR,3,3,"mat-icon",18),ou(10,"\n "),fs(11,rR,1,0,"mat-spinner",10),ou(12,"\n "),ys(),ou(13,"\n "),_s(14,"div",7),ou(15,"\n "),_s(16,"mat-select",19,20),Vl(18,"translate"),ou(19,"\n "),fs(20,aR,4,9,"mat-option",16),ou(21,"\n "),_s(22,"mat-select-trigger"),ou(23,"\n "),fs(24,oR,4,8,"div",11),ou(25,"\n "),ys(),ou(26,"\n "),ys(),ou(27,"\n "),ys(),ou(28,"\n "),ys()}if(2&e){var i=As();Pa(2),gs("for",i.busy?null:"outputs"),Pa(1),uu("\n ",Ul(4,10,"send.outputs-label"),"\n "),Pa(2),gs("matTooltip",Ul(6,12,"send.outputs-help")),Pa(4),gs("ngIf",i.errorLoadingManualOutputs),Pa(2),gs("ngIf",i.loadingUnspentOutputs),Pa(5),gs("placeholder",Ul(18,14,i.outputsPlaceholder))("ngClass",Rl(16,tR,i.busy||i.unspentOutputs&&0===i.unspentOutputs.length)),cs("disabled",i.busy||i.unspentOutputs&&0===i.unspentOutputs.length?"true":null),Pa(4),gs("ngForOf",i.unspentOutputs),Pa(4),gs("ngForOf",i.form.get("outputs").value)}}var uR=function(){return function(){this.availableCoins=new Yf.BigNumber(0),this.availableHours=new Yf.BigNumber(0),this.minimumFee=new Yf.BigNumber(0),this.loading=!1}}(),lR=function(e){return e.Wallet="Wallet",e.All="All",e.Manual="Manual",e}({}),cR=function(){function e(e,t,n){this.appService=e,this.formBuilder=t,this.balanceAndOutputsService=n,this.onSelectionChanged=new Zl,this.sourceSelectionModes=lR,this.addresses=[],this.manualAddresses=[],this.allUnspentOutputs=[],this.unspentOutputs=[],this.loadingUnspentOutputs=!1,this.errorLoadingManualOutputs=!1,this.manualAddressesErrorMsg="",this.walletErrorMsg="",this.subscriptionsGroup=[]}return Object.defineProperty(e.prototype,"selectionMode",{get:function(){return this.selectionModeInternal},set:function(e){this.selectionModeInternal=e,this.form&&(this.resetForm(),this.form.updateValueAndValidity())},enumerable:!1,configurable:!0}),e.prototype.ngOnInit=function(){var e=this;this.form=this.formBuilder.group({manualAddresses:[""],wallet:[""],addresses:[null],outputs:[null]}),this.form.setValidators(this.validateForm.bind(this)),this.subscriptionsGroup.push(this.form.get("manualAddresses").valueChanges.pipe(Zg(500)).subscribe(function(){var t=e.form.get("manualAddresses").value,n=[];t&&t.trim().length>0&&(n=(n=(n=t.split(",")).map(function(e){return e.trim()})).filter(function(e){return e.length>0}));var i=!1;n.length!==e.manualAddresses.length?i=!0:n.forEach(function(t,n){e.manualAddresses[n]!==t&&(i=!0)}),i&&(e.manualAddresses=n,e.closeGetOutputsSubscription(),e.allUnspentOutputs=[],e.unspentOutputs=[],e.form.get("outputs").setValue(null),e.loadingUnspentOutputs=0!==n.length,e.errorLoadingManualOutputs=!1,e.onSelectionChanged.emit()),0!==n.length&&i&&(e.getOutputsSubscription=e.balanceAndOutputsService.getOutputs(e.form.get("manualAddresses").value.replace(/ /g,"")).pipe(gf(function(t){return t.pipe(ue(function(t){return(t=Hp(t)).originalError&&t.originalError.status&&400===t.originalError.status?(e.errorLoadingManualOutputs=!0,Lf(t)):xf(t)}),Of(4e3))})).subscribe(function(t){e.loadingUnspentOutputs=!1,e.allUnspentOutputs=t,e.unspentOutputs=e.filterUnspentOutputs(),e.onSelectionChanged.emit()},function(){e.loadingUnspentOutputs=!1,e.onSelectionChanged.emit()}))})),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){e.wallet=t,e.closeGetOutputsSubscription(),e.allUnspentOutputs=[],e.unspentOutputs=[],e.form.get("addresses").setValue(null),e.form.get("outputs").setValue(null),e.loadingUnspentOutputs=!1,t&&e.selectionMode===lR.All&&(e.loadingUnspentOutputs=!0,e.getOutputsSubscription=e.balanceAndOutputsService.getWalletUnspentOutputs(t).pipe(gf(function(e){return e.pipe(Of(4e3))})).subscribe(function(t){e.loadingUnspentOutputs=!1,e.allUnspentOutputs=t,e.unspentOutputs=e.filterUnspentOutputs()},function(){return e.loadingUnspentOutputs=!1})),e.addresses=t?t.addresses.filter(function(e){return e.coins>0}):[],e.onSelectionChanged.emit()})),this.subscriptionsGroup.push(this.form.get("addresses").valueChanges.subscribe(function(){e.form.get("outputs").setValue(null),e.unspentOutputs=e.filterUnspentOutputs(),e.onSelectionChanged.emit()})),this.subscriptionsGroup.push(this.form.get("outputs").valueChanges.subscribe(function(){e.onSelectionChanged.emit()})),this.subscriptionsGroup.push(this.balanceAndOutputsService.walletsWithBalance.subscribe(function(t){e.allWallets=t,1===t.length&&setTimeout(function(){try{e.form.get("wallet").setValue(t[0])}catch(n){}})}))},e.prototype.ngOnDestroy=function(){this.closeGetOutputsSubscription(),this.subscriptionsGroup.forEach(function(e){return e.unsubscribe()}),this.onSelectionChanged.complete()},e.prototype.resetForm=function(){this.form.get("manualAddresses").setValue(""),this.form.get("wallet").setValue(""),this.form.get("addresses").setValue(null),this.form.get("outputs").setValue(null),this.wallet=null},e.prototype.fill=function(e){var t=this;setTimeout(function(){if(t.selectionMode===lR.Manual){var n="",i=e.form.manualAddresses;i.forEach(function(e,t){n+=e,t0){var t=this.form.get("outputs").value;t&&t.length>0?t.map(function(t){e.availableCoins=e.availableCoins.plus(t.coins),e.availableHours=e.availableHours.plus(t.hours)}):this.unspentOutputs.forEach(function(t){e.availableCoins=e.availableCoins.plus(t.coins),e.availableHours=e.availableHours.plus(t.hours)})}if(this.selectionMode===lR.Manual&&(e.loading=this.loadingUnspentOutputs),this.form.get("wallet").value){var n=this.form.get("outputs").value,i=this.form.get("addresses").value;if(n&&n.length>0)n.map(function(t){e.availableCoins=e.availableCoins.plus(t.coins),e.availableHours=e.availableHours.plus(t.hours)});else if(i&&i.length>0)i.map(function(t){e.availableCoins=e.availableCoins.plus(t.coins),e.availableHours=e.availableHours.plus(t.hours)});else if(this.form.get("wallet").value){var r=this.form.get("wallet").value;e.availableCoins=r.coins,e.availableHours=r.hours}}if(e.availableCoins.isGreaterThan(0)){var a=new Yf.BigNumber(1).minus(new Yf.BigNumber(1).dividedBy(this.appService.burnRate)),o=e.availableHours.multipliedBy(a).decimalPlaces(0,Yf.BigNumber.ROUND_FLOOR);e.minimumFee=e.availableHours.minus(o),e.availableHours=o}return e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selectedSources",{get:function(){return this.selectionMode===lR.Manual?{wallet:null,manualAddresses:this.manualAddresses,unspentOutputs:this.form.get("outputs").value}:{wallet:this.form.get("wallet").value,addresses:this.form.get("addresses").value,unspentOutputs:this.form.get("outputs").value}},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"unspentOutputsList",{get:function(){return this.loadingUnspentOutputs?null:this.allUnspentOutputs},enumerable:!1,configurable:!0}),e.prototype.filterUnspentOutputs=function(){if(this.selectionMode===lR.Manual)return this.allUnspentOutputs;if(0===this.allUnspentOutputs.length)return[];if(this.form.get("addresses").value&&0!==this.form.get("addresses").value.length){var e=new Map;return this.form.get("addresses").value.forEach(function(t){return e.set(t.address,!0)}),this.allUnspentOutputs.filter(function(t){return e.has(t.address)})}return this.allUnspentOutputs},e.prototype.closeGetOutputsSubscription=function(){this.loadingUnspentOutputs=!1,this.getOutputsSubscription&&this.getOutputsSubscription.unsubscribe()},e.prototype.validateForm=function(){this.manualAddressesErrorMsg="",this.walletErrorMsg="";var e=!0;return this.selectionMode===lR.Manual?(!this.form.get("manualAddresses").value||this.form.get("manualAddresses").value.length<20)&&(e=!1,this.form.get("manualAddresses").touched&&(this.manualAddressesErrorMsg="send.addresses-error-info")):this.form.get("wallet").value||(e=!1,this.form.get("wallet").touched&&(this.walletErrorMsg="send.wallet-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ms(qp),ms(TM),ms(LO))},e.\u0275cmp=lt({type:e,selectors:[["app-form-source-selection"]],inputs:{busy:"busy",selectionMode:"selectionMode"},outputs:{onSelectionChanged:"onSelectionChanged"},decls:15,vars:5,consts:[[3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","manualAddresses"],[1,"help-icon",3,"matTooltip"],["formControlName","manualAddresses","id","manualAddresses",3,"appFormFieldError","blur"],["for","wallet"],[1,"-select"],["formControlName","wallet","id","wallet",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue"],[4,"ngIf"],[4,"ngFor","ngForOf"],[3,"disabled","ngValue"],[3,"for","click"],["multiple","","formControlName","addresses","id","addresses",3,"placeholder","ngClass"],["selectAddresses",""],[3,"value",4,"ngFor","ngForOf"],[3,"value"],["class","help-icon red-text",3,"matTooltip",4,"ngIf"],["multiple","","formControlName","outputs","id","outputs",3,"placeholder","ngClass"],["selectOutputs",""],[1,"help-icon","red-text",3,"matTooltip"]],template:function(e,t){1&e&&(_s(0,"div",0),ou(1,"\n "),ou(2,"\n "),fs(3,JI,12,8,"div",1),ou(4,"\n "),ou(5,"\n "),fs(6,XI,18,10,"div",1),ou(7,"\n "),ou(8,"\n "),fs(9,nR,25,16,"div",1),ou(10,"\n "),ou(11,"\n "),fs(12,sR,29,18,"div",1),ou(13,"\n"),ys(),ou(14,"\n")),2&e&&(gs("formGroup",t.form),Pa(3),gs("ngIf",t.selectionMode===t.sourceSelectionModes.Manual),Pa(3),gs("ngIf",t.selectionMode!==t.sourceSelectionModes.Manual),Pa(3),gs("ngIf",t.selectionMode===t.sourceSelectionModes.All),Pa(3),gs("ngIf",t.selectionMode!==t.sourceSelectionModes.Wallet))},directives:[wk,pM,fh,uC,KD,Xw,bk,wM,QD,Ek,Pk,Rk,dh,uI,lh,oI,pw,vS],pipes:[oS,yS],styles:[".form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{opacity:.5;margin:0!important;display:inline-block;position:relative;top:2px;margin-left:8px}.form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:12px!important;width:12px!important}"]}),e}(),dR=function(){function e(e,t){this.dialogRef=e,this.formBuilder=t,this.inputErrorMsg=""}return e.openDialog=function(t){var n=new bw;return n.autoFocus=!0,n.width=zp.mediumModalWidth,t.open(e,n)},e.prototype.ngOnInit=function(){this.form=this.formBuilder.group({link:[""]}),this.form.setValidators(this.validateForm.bind(this))},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.process=function(){this.form.valid&&this.dialogRef.close(this.form.get("link").value)},e.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0;return Up(this.form.get("link").value)||(e=!1,this.form.get("link").touched&&(this.inputErrorMsg="send.fill-with-link.link-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ms(xw),ms(TM))},e.\u0275cmp=lt({type:e,selectors:[["app-enter-link"]],decls:34,vars:19,consts:[[3,"headline","dialog"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],["for","link"],["formControlName","link","id","link",3,"appFormFieldError","keydown.enter","blur"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"disabled","action"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),_s(4,"div"),ou(5),Vl(6,"translate"),ys(),ou(7,"\n "),ou(8,"\n "),_s(9,"div",1),ou(10,"\n "),_s(11,"div",2),ou(12,"\n "),_s(13,"label",3),ou(14),Vl(15,"translate"),ys(),ou(16,"\n "),_s(17,"input",4),Ls("keydown.enter",function(){return t.process()})("blur",function(){return t.validateForm()}),ys(),ou(18,"\n "),ys(),ou(19,"\n "),ys(),ou(20,"\n "),ou(21,"\n "),_s(22,"div",5),ou(23,"\n "),_s(24,"app-button",6),Ls("action",function(){return t.closePopup()}),ou(25),Vl(26,"translate"),ys(),ou(27,"\n "),_s(28,"app-button",7),Ls("action",function(){return t.process()}),ou(29),Vl(30,"translate"),ys(),ou(31,"\n "),ys(),ou(32,"\n"),ys(),ou(33,"\n")),2&e&&(gs("headline",Ul(1,9,"send.fill-with-link.title"))("dialog",t.dialogRef),Pa(5),uu("\n ",Ul(6,11,"send.fill-with-link.link-info"),"\n "),Pa(4),gs("formGroup",t.form),Pa(5),su(Ul(15,13,"send.fill-with-link.link-label")),Pa(3),gs("appFormFieldError",t.inputErrorMsg),Pa(8),uu("\n ",Ul(26,15,"common.cancel-button"),"\n "),Pa(3),gs("disabled",!t.form.valid),Pa(1),uu("\n ",Ul(30,17,"send.fill-with-link.process-button"),"\n "))},directives:[AM,wk,pM,Xw,bk,wM,QD,gC],pipes:[oS],styles:[""]}),e}(),hR=function(e){return e.bulk="bulk",e.link="link",e}({}),fR=function(){function e(e){this.dialogRef=e,this.destinationTools=hR}return e.openDialog=function(t){var n=new bw;return n.autoFocus=!1,n.width=zp.mediumModalWidth,t.open(e,n)},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.select=function(e){this.dialogRef.close(e)},e.\u0275fac=function(t){return new(t||e)(ms(xw))},e.\u0275cmp=lt({type:e,selectors:[["app-destination-tools"]],decls:31,vars:10,consts:[[3,"headline","dialog"],[1,"list-button-container","light-button-theme"],["mat-button","","color","primary",1,"top-line",3,"click"],[1,"content"],["src","assets/img/list-purple.png"],["mat-button","","color","primary",3,"click"],["src","assets/img/link-blue.png"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),_s(3,"div",1),ou(4,"\n "),_s(5,"button",2),Ls("click",function(){return t.select(t.destinationTools.bulk)}),ou(6,"\n "),_s(7,"div",3),ou(8,"\n "),bs(9,"img",4),ou(10,"\n "),_s(11,"span"),ou(12),Vl(13,"translate"),ys(),ou(14,"\n "),ys(),ou(15,"\n "),ys(),ou(16,"\n "),_s(17,"button",5),Ls("click",function(){return t.select(t.destinationTools.link)}),ou(18,"\n "),_s(19,"div",3),ou(20,"\n "),bs(21,"img",6),ou(22,"\n "),_s(23,"span"),ou(24),Vl(25,"translate"),ys(),ou(26,"\n "),ys(),ou(27,"\n "),ys(),ou(28,"\n "),ys(),ou(29,"\n"),ys(),ou(30,"\n")),2&e&&(gs("headline",Ul(1,4,"send.destination-tools-title"))("dialog",t.dialogRef),Pa(12),su(Ul(13,6,"send.bulk-send.title")),Pa(12),uu("\n ",Ul(25,8,"send.fill-with-link.title"),"\n "))},directives:[AM,US],pipes:[oS],styles:[".content[_ngcontent-%COMP%]{display:flex;align-items:center}.content[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:32px;width:32px;margin-right:5px}.content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}"]}),e}(),pR=function(){function e(e){this.appService=e}return e.prototype.transform=function(e){return"hours"===e?this.appService.hoursName:"coin"===e?this.appService.coinName:"coinFull"===e?this.appService.fullCoinName:""},e.\u0275fac=function(t){return new(t||e)(ms(qp))},e.\u0275pipe=vt({name:"commonText",type:e,pure:!1}),e}();function mR(e,t){if(1&e){var n=Ss();_s(0,"div",2),ou(1,"\n "),_s(2,"label",10),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),_s(6,"input",11),Ls("blur",function(){return sn(n),As().validateForm()}),ys(),ou(7,"\n "),ys()}if(2&e){var i=As();Pa(3),su(Ul(4,3,"send.to-label")),Pa(3),gs("appFormFieldError",i.isAddressValid(0)?i.singleAddressErrorMsg:"send.invalid-addresses-error"),cs("disabled",i.busy?"true":null)}}function gR(e,t){1&e&&(_s(0,"mat-icon",12),Vl(1,"translate"),ou(2,"help"),ys()),2&e&&gs("matTooltip",Ul(1,1,"send.destinations-help"+(As().showHourFields?"2":"1")))}var vR=function(e){return{"element-disabled":e}};function _R(e,t){if(1&e){var n=Ss();_s(0,"div",13),ou(1,"\n "),_s(2,"app-double-button",14),Ls("onStateChange",function(e){return sn(n),As().changeActiveCurrency(e)}),Vl(3,"commonText"),Vl(4,"translate"),ys(),ou(5,"\n "),ys()}if(2&e){var i=As();gs("ngClass",Rl(8,vR,i.busy)),Pa(2),gs("leftButtonText",Ul(3,4,"coin"))("rightButtonText",Ul(4,6,"common.usd"))("activeButton",i.selectedCurrency)}}function yR(e,t){if(1&e){var n=Ss();_s(0,"app-arrow-link",15),Ls("pressed",function(){return sn(n),As().showDestinationTools()}),ou(1,"\n "),ys()}if(2&e){var i=As();gs("text","send.destination-tools-title")("ngClass",Rl(2,vR,i.busy))}}function bR(e,t){if(1&e){var n=Ss();_s(0,"app-arrow-link",15),Ls("pressed",function(){return sn(n),As().openLinkModalWindow()}),ou(1,"\n "),ys()}if(2&e){var i=As();gs("text","send.fill-with-link.title")("ngClass",Rl(2,vR,i.busy))}}function wR(e,t){if(1&e){var n=Ss();_s(0,"div",27),ou(1,"\n "),_s(2,"input",28),Ls("blur",function(){return sn(n),As(2).validateForm()}),ys(),ou(3,"\n "),ys()}if(2&e){var i=As().index,r=As();Pa(2),gs("id",0===i?"destination":"address"+i)("appFormFieldError",r.isAddressValid(i)?r.addressErrorMsgs[i]:"send.invalid-addresses-error"),cs("disabled",r.busy?"true":null)}}function kR(e,t){1&e&&(_s(0,"span"),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),su(Ul(2,1,"send.invalid-amount")))}function MR(e,t){if(1&e&&(_s(0,"span"),ou(1),Vl(2,"number"),Vl(3,"translate"),ys()),2&e){var n=As().index,i=As();Pa(1),lu("\n ~ ",zl(2,2,i.values[n].toString(),"1.0-2")," ",Ul(3,5,"common.usd"),"\n ")}}function SR(e,t){if(1&e&&(_s(0,"span"),ou(1),Vl(2,"amount"),ys()),2&e){var n=As().index,i=As();Pa(1),uu("\n ~ ",Ul(2,1,i.values[n]),"\n ")}}var CR=function(e){return{"-input-addon":!0,"d-none":e}};function xR(e,t){if(1&e){var n=Ss();_s(0,"div",29),ou(1,"\n "),_s(2,"div",19),ou(3,"\n "),_s(4,"input",30),Ls("blur",function(){return sn(n),As(2).validateForm()}),ys(),ou(5,"\n "),_s(6,"span"),ou(7),Vl(8,"commonText"),ys(),ou(9,"\n "),ys(),ou(10,"\n "),ys()}if(2&e){var i=As().index,r=As();Pa(2),gs("ngClass",Rl(6,CR,!r.showHourFields)),Pa(2),gs("appFormFieldError",r.gethoursErrorMsg(i)),cs("disabled",r.busy?"true":null),Pa(3),su(Ul(8,4,"hours"))}}function LR(e,t){if(1&e){var n=Ss();_s(0,"img",34),Ls("click",function(){return sn(n),As(3).addDestination()}),ys()}}function TR(e,t){if(1&e){var n=Ss();_s(0,"img",35),Ls("click",function(){sn(n);var e=As(2).index;return As().removeDestination(e)}),ys()}}function DR(e,t){if(1&e&&(_s(0,"div",31),ou(1,"\n "),fs(2,LR,1,0,"img",32),ou(3,"\n "),fs(4,TR,1,0,"img",33),ou(5,"\n "),ys()),2&e){var n=As().index,i=As();gs("ngClass",Rl(3,vR,i.busy)),Pa(2),gs("ngIf",0===n),Pa(2),gs("ngIf",0!==n)}}var OR=function(e,t){return{"col-md-3":e,"col-md-12":t}},ER=function(e){return{"centerd-link":e}};function PR(e,t){if(1&e){var n=Ss();_s(0,"div",16),ou(1,"\n "),_s(2,"div",17),ou(3,"\n "),ou(4,"\n "),fs(5,wR,4,3,"div",18),ou(6,"\n "),ou(7,"\n "),_s(8,"div",19),ou(9,"\n "),_s(10,"div",20),ou(11,"\n "),_s(12,"input",21),Ls("blur",function(){return sn(n),As().validateForm()}),ys(),ou(13,"\n "),_s(14,"span"),ou(15),Vl(16,"commonText"),Vl(17,"translate"),ys(),ou(18,"\n "),ys(),ou(19,"\n "),ou(20,"\n "),_s(21,"div",22),ou(22,"\n "),fs(23,kR,3,3,"span",23),ou(24,"\n "),fs(25,MR,4,7,"span",23),ou(26,"\n "),fs(27,SR,3,3,"span",23),ou(28,"\n "),_s(29,"div",24),Ls("click",function(){sn(n);var e=t.index;return As().assignAll(e)}),ou(30),Vl(31,"translate"),ys(),ou(32,"\n "),ys(),ou(33,"\n "),ys(),ou(34,"\n "),ou(35,"\n "),fs(36,xR,11,8,"div",25),ou(37,"\n "),fs(38,DR,6,5,"div",26),ou(39,"\n "),ys(),ou(40,"\n "),ys()}if(2&e){var i=t.index,r=As();Pa(2),gs("formGroupName",i),Pa(3),gs("ngIf",!r.showSimpleForm),Pa(3),gs("ngClass",Fl(19,OR,!r.showSimpleForm,r.showSimpleForm)),Pa(4),gs("appFormFieldError",r.getCoinsErrorMsg(i)),cs("disabled",r.busy?"true":null),Pa(3),su(r.selectedCurrency===r.doubleButtonActive.LeftButton?Ul(16,13,"coin"):Ul(17,15,"common.usd")),Pa(8),gs("ngIf",r.price&&r.values[i].isLessThanOrEqualTo(0)),Pa(2),gs("ngIf",r.price&&r.values[i].isGreaterThan(0)&&r.selectedCurrency===r.doubleButtonActive.LeftButton),Pa(2),gs("ngIf",r.price&&r.values[i].isGreaterThan(0)&&r.selectedCurrency===r.doubleButtonActive.RightButton),Pa(2),gs("ngClass",Rl(22,ER,!r.price)),Pa(1),uu("(",Ul(31,17,"send.send-all-available-coins-link"),")"),Pa(6),gs("ngIf",!r.showSimpleForm),Pa(2),gs("ngIf",!r.showSimpleForm)}}function AR(e,t){if(1&e&&(ws(0),ou(1),Vl(2,"number"),Vl(3,"translate"),ks()),2&e){var n=As(2);Pa(1),lu("/ ",zl(2,2,n.totalFiat.toString(),"1.0-2")," ",Ul(3,5,"common.usd"),"")}}var YR=function(e){return{"error-coins-value":e}};function IR(e,t){if(1&e&&(_s(0,"div",29),ou(1,"\n "),_s(2,"div",38),Vl(3,"translate"),ou(4,"\n "),_s(5,"span"),ou(6),Vl(7,"translate"),ys(),ou(8),Vl(9,"amount"),ys(),ou(10,"\n "),ys()),2&e){var n=As(2);Pa(2),gs("ngClass",Rl(11,YR,n.insufficientHours))("matTooltip",n.insufficientHours?Ul(3,4,"send.insufficient-funds-error-info"):""),Pa(4),su(Ul(7,6,"send.total-to-send")),Pa(2),uu(" ",zl(9,8,n.totalHours,!1),"\n ")}}function RR(e,t){if(1&e&&(_s(0,"div",36),ou(1,"\n "),bs(2,"div",27),ou(3,"\n "),_s(4,"div",37),ou(5,"\n "),_s(6,"div",38),Vl(7,"translate"),ou(8,"\n "),_s(9,"span"),ou(10),Vl(11,"translate"),ys(),ou(12),Vl(13,"amount"),fs(14,AR,4,7,"ng-container",23),ou(15,"\n "),ys(),ou(16,"\n "),ys(),ou(17,"\n "),fs(18,IR,11,13,"div",25),ou(19,"\n "),ys()),2&e){var n=As();Pa(6),gs("ngClass",Rl(12,YR,n.insufficientCoins))("matTooltip",n.insufficientCoins?Ul(7,6,"send.insufficient-funds-error-info"):""),Pa(4),su(Ul(11,8,"send.total-to-send")),Pa(2),uu(" ",Ul(13,10,n.totalCoins),"\n "),Pa(2),gs("ngIf",n.price),Pa(4),gs("ngIf",n.showHourFields)}}var FR=function(e){return{"simple-form-hours-error":e}};function HR(e,t){if(1&e){var n=Ss();_s(0,"div",39),ou(1,"\n "),_s(2,"span",40),Vl(3,"translate"),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),_s(7,"mat-icon",41),Ls("click",function(){return sn(n),As().removeSimpleFormhours()}),Vl(8,"translate"),ou(9,"clear"),ys(),ou(10,"\n "),ys()}if(2&e){var i=As();Pa(2),gs("ngClass",Rl(12,FR,i.simpleFormHoursErrorMsg))("matTooltip",Ul(3,6,i.simpleFormHoursErrorMsg?i.simpleFormHoursErrorMsg:"")),Pa(2),lu("",Ul(5,8,"send.specific-hours")," ",i.simpleFormSpecificHours.toString(),""),Pa(3),gs("inline",!0)("matTooltip",Ul(8,10,"send.remove-specific-hours-info"))}}var jR=function(){function e(e,t,n,i,r,a){this.appService=e,this.formBuilder=t,this.dialog=n,this.msgBarService=i,this.translate=r,this.priceService=a,this.onChanges=new Zl,this.onBulkRequested=new Zl,this.newNoteRequested=new Zl,this.manualHoursRequested=new Zl,this.hoursAddedToSimpleForm=new Zl,this.doubleButtonActive=KP,this.selectedCurrency=KP.LeftButton,this.totalCoins=new Yf.BigNumber(0),this.totalFiat=new Yf.BigNumber(0),this.totalHours=new Yf.BigNumber(0),this.addressErrorMsgs=[],this.coinsErrorMsgs=[],this.hoursErrorMsgs=[],this.singleAddressErrorMsg="",this.simpleFormHoursErrorMsg="",this.insufficientCoins=!1,this.insufficientHours=!1,this.destinationSubscriptions=[]}return Object.defineProperty(e.prototype,"showHourFields",{get:function(){return this.showHourFieldsInternal},set:function(e){e!==this.showHourFieldsInternal&&(this.showHourFieldsInternal=e,this.form&&this.destControls.forEach(function(e){e.get("hours").setValue("")}))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"showSimpleForm",{get:function(){return this.showSimpleFormInternal},set:function(e){this.showSimpleFormInternal=e,this.form&&(e?this.form.get("address").setValidators(rk.required):this.form.get("address").clearValidators(),this.form.get("address").updateValueAndValidity(),this.form.get("destinations").updateValueAndValidity())},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"destControls",{get:function(){return this.form.get("destinations").controls},enumerable:!1,configurable:!0}),e.prototype.ngOnInit=function(){var e=this;this.form=this.formBuilder.group({address:[""],destinations:this.formBuilder.array([])}),this.form.setValidators(this.validateForm.bind(this)),this.addDestination(),this.addressSubscription=this.form.get("address").valueChanges.subscribe(function(){e.onChanges.emit()}),this.priceSubscription=this.priceService.price.subscribe(function(t){e.price=t,e.updateValuesAndValidity()})},e.prototype.ngOnDestroy=function(){this.addressSubscription.unsubscribe(),this.priceSubscription.unsubscribe(),this.destinationSubscriptions.forEach(function(e){return e.unsubscribe()}),this.onChanges.complete(),this.onBulkRequested.complete(),this.newNoteRequested.complete(),this.manualHoursRequested.complete(),this.hoursAddedToSimpleForm.complete()},e.prototype.changeActiveCurrency=function(e){e!==this.selectedCurrency&&(this.selectedCurrency=e,this.askIfConvertAmount(),this.updateValuesAndValidity(),this.form.get("destinations").updateValueAndValidity())},e.prototype.askIfConvertAmount=function(){var e=this,t=0;if(this.destControls.forEach(function(e){var n=e.get("coins").value;n=n?n.trim():n;var i=new Yf.BigNumber(n);n&&!i.isNaN()&&(t+=1)}),0!==t){var n,i,r=this.translate.instant("common.usd"),a=this.appService.coinName;this.selectedCurrency===KP.LeftButton?(n=r,i=a):(n=a,i=r);var o={text:this.translate.instant(1===t?"send.convert-confirmation":"send.convert-confirmation-plural",{from:n,to:i}),defaultButtons:YD.YesNo};ID.openDialog(this.dialog,o).afterClosed().subscribe(function(t){t&&e.convertAmounts()})}},e.prototype.convertAmounts=function(){var t=this;this.msgBarService.hide();var n=0,i=0;this.destControls.forEach(function(r){var a=r.get("coins").value;a=a?a.trim():a;var o=new Yf.BigNumber(a);if(a){if(o.isNaN())return void(n+=1);var s;t.selectedCurrency===KP.LeftButton?((s=o.dividedBy(t.price).decimalPlaces(t.appService.currentMaxDecimals)).multipliedBy(t.price).decimalPlaces(e.MaxUsdDecimals,Yf.BigNumber.ROUND_FLOOR).isEqualTo(o)||(i+=1),r.get("coins").setValue(s.toString())):((s=o.multipliedBy(t.price).decimalPlaces(e.MaxUsdDecimals,Yf.BigNumber.ROUND_FLOOR)).dividedBy(t.price).decimalPlaces(t.appService.currentMaxDecimals).isEqualTo(o)||(i+=1),r.get("coins").setValue(s.toString()))}}),n>0&&i>0?this.msgBarService.showWarning(this.translate.instant("send.multiple-problems-warning")):1===n?this.msgBarService.showWarning(this.translate.instant("send.invaid-amount-warning")):n>1?this.msgBarService.showWarning(this.translate.instant("send.invaid-amounts-warning")):1===i?this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")):i>1&&this.msgBarService.showWarning(this.translate.instant("send.precision-errors-warning"))},e.prototype.assignAll=function(t){var n=this;if(this.msgBarService.hide(),this.availableBalance.availableCoins.isEqualTo(0))this.msgBarService.showError(this.translate.instant("send.no-wallet-selected-error"));else{var i=this.availableBalance.availableCoins;this.selectedCurrency===KP.RightButton&&(i=i.multipliedBy(this.price).decimalPlaces(e.MaxUsdDecimals,Yf.BigNumber.ROUND_FLOOR)),this.destControls.forEach(function(e,r){if(r!==t){var a=n.getAmount(e.get("coins").value.trim(),!0);if(!a||a.isNaN())return;i=i.minus(a)}}),(i=i.decimalPlaces(this.selectedCurrency===KP.LeftButton?this.appService.currentMaxDecimals:e.MaxUsdDecimals,Yf.BigNumber.ROUND_FLOOR)).isLessThanOrEqualTo(0)?this.msgBarService.showError(this.translate.instant("send.no-coins-left-error")):this.destControls[t].get("coins").setValue(i.toString())}},e.prototype.updateValuesAndValidity=function(){var e=this,t=this.selectedCurrency!==KP.LeftButton,n=this.price;this.price||(t=!1,n=0),this.values=[],this.totalCoins=new Yf.BigNumber(0),this.totalFiat=new Yf.BigNumber(0),this.totalHours=new Yf.BigNumber(0),this.destControls.forEach(function(i,r){var a=i.get("coins").value,o=e.getAmount(a,!0);if(o)if(t)s=o.dividedBy(n).decimalPlaces(e.appService.currentMaxDecimals),e.totalCoins=e.totalCoins.plus(s),e.totalFiat=e.totalFiat.plus(o),e.values[r]=s;else{var s=o.multipliedBy(n).decimalPlaces(2);e.totalCoins=e.totalCoins.plus(o),e.totalFiat=e.totalFiat.plus(s),e.values[r]=s}else e.values[r]=new Yf.BigNumber(-1);e.showHourFields&&(a=i.get("hours").value,(o=e.getAmount(a,!1))&&(e.totalHours=e.totalHours.plus(o)))}),setTimeout(function(){e.form.get("destinations").updateValueAndValidity(),e.onChanges.emit()})},e.prototype.addDestination=function(){var e=this,t=this.formBuilder.group({address:"",coins:"",hours:""});this.destinationSubscriptions.push(t.valueChanges.subscribe(function(){e.updateValuesAndValidity()})),this.form.get("destinations").push(t),this.addressErrorMsgs.push(""),this.coinsErrorMsgs.push(""),this.hoursErrorMsgs.push(""),this.updateValuesAndValidity()},e.prototype.removeDestination=function(e){this.form.get("destinations").removeAt(e),this.validAddressesList&&this.validAddressesList.length>e&&this.validAddressesList.splice(e,1),this.addressErrorMsgs&&this.addressErrorMsgs.length>e&&this.addressErrorMsgs.splice(e,1),this.coinsErrorMsgs&&this.coinsErrorMsgs.length>e&&this.coinsErrorMsgs.splice(e,1),this.hoursErrorMsgs&&this.hoursErrorMsgs.length>e&&this.hoursErrorMsgs.splice(e,1),this.destinationSubscriptions[e].unsubscribe(),this.destinationSubscriptions.splice(e,1),this.updateValuesAndValidity()},e.prototype.requestBulkSend=function(){this.onBulkRequested.emit()},e.prototype.showDestinationTools=function(){var e=this;fR.openDialog(this.dialog).afterClosed().subscribe(function(t){t===hR.bulk?e.requestBulkSend():t===hR.link&&e.openLinkModalWindow()})},e.prototype.openLinkModalWindow=function(){var e=this;dR.openDialog(this.dialog).afterClosed().subscribe(function(t){t&&e.processRequestLink(t)})},e.prototype.processRequestLink=function(e){var t=Up(e);if(t){if(this.showSimpleForm&&t.hours&&!this.getAmount(t.hours,!1))return void this.msgBarService.showError("send.fill-with-link.invalid-link-hours-error");this.checkChangesBeforeUsingLink(t)}else this.msgBarService.showError("send.fill-with-link.invalid-link-error")},e.prototype.checkChangesBeforeUsingLink=function(e){var t=this,n=!1;this.showSimpleForm?this.form.get("address").value&&(n=!0):(this.destControls[0].get("address").value&&(n=!0),e.hours&&this.destControls[0].get("hours").value&&(n=!0)),e.coins&&this.destControls[0].get("coins").value&&(n=!0),n?ID.openDialog(this.dialog,{text:"send.fill-with-link.data-overwritten-alert",defaultButtons:YD.YesNo}).afterClosed().subscribe(function(n){n&&t.finishUsingRequestLink(e)}):this.finishUsingRequestLink(e)},e.prototype.finishUsingRequestLink=function(e){var t=this;this.showSimpleForm?(this.form.get("address").setValue(e.address),this.form.get("address").markAsTouched(),e.hours?(this.simpleFormSpecificHours=this.getAmount(e.hours,!1),this.hoursAddedToSimpleForm.next(!0)):this.hoursAddedToSimpleForm.next(!1)):(this.destControls[0].get("address").setValue(e.address),this.destControls[0].get("address").markAsTouched(),e.hours&&(this.manualHoursRequested.next(),setTimeout(function(){t.destControls[0].get("hours").setValue(e.hours),t.destControls[0].get("hours").markAsTouched()}))),e.coins&&(this.destControls[0].get("coins").setValue(e.coins),this.destControls[0].get("coins").markAsTouched()),e.message&&this.newNoteRequested.next(e.message),this.form.updateValueAndValidity(),this.msgBarService.showDone("send.fill-with-link.confirmation")},e.prototype.removeSimpleFormhours=function(){var e=this;ID.openDialog(this.dialog,{text:"send.remove-specific-hours-confirmation",defaultButtons:YD.YesNo}).afterClosed().subscribe(function(t){t&&(e.simpleFormSpecificHours=null,e.hoursAddedToSimpleForm.next(!1))})},e.prototype.fill=function(e){var t=this;setTimeout(function(){t.selectedCurrency=e.form.currency;for(var n=0;n0;)this.form.get("destinations").removeAt(0);e.forEach(function(e,n){t.addDestination(),t.destControls[n].get("address").setValue(e.address),t.destControls[n].get("coins").setValue(e.coins),e.hours&&t.destControls[n].get("hours").setValue(e.hours)})},Object.defineProperty(e.prototype,"valid",{get:function(){return this.form.valid},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentlySelectedCurrency",{get:function(){return this.selectedCurrency},enumerable:!1,configurable:!0}),e.prototype.setValidAddressesList=function(e){this.validAddressesList=e,this.validAddressesList&&this.validAddressesList.length>this.destControls.length&&(this.validAddressesList=this.validAddressesList.slice(0,this.destControls.length))},e.prototype.isAddressValid=function(e){return!(this.validAddressesList&&this.validAddressesList.length>e)||this.validAddressesList[e]},e.prototype.getCoinsErrorMsg=function(e){if(ethis.destControls.length;)e.pop();for(;e.lengththis.appService.currentMaxDecimals)return null}else if(2===r.length&&r[1].length>e.MaxUsdDecimals)return null}else if(!i.isEqualTo(i.decimalPlaces(0)))return null;return i},e.prototype.resetForm=function(){for(this.form.get("address").setValue("");this.destControls.length>0;)this.form.get("destinations").removeAt(0);this.addDestination(),this.updateValuesAndValidity()},e.MaxUsdDecimals=6,e.\u0275fac=function(t){return new(t||e)(ms(qp),ms(TM),ms(Aw),ms(HC),ms(aS),ms(bP))},e.\u0275cmp=lt({type:e,selectors:[["app-form-destination"]],inputs:{availableBalance:"availableBalance",busy:"busy",showHourFields:"showHourFields",showSimpleForm:"showSimpleForm"},outputs:{onChanges:"onChanges",onBulkRequested:"onBulkRequested",newNoteRequested:"newNoteRequested",manualHoursRequested:"manualHoursRequested",hoursAddedToSimpleForm:"hoursAddedToSimpleForm"},decls:33,vars:12,consts:[[3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","destination",1,"destinations-label"],["class","help-icon",3,"matTooltip",4,"ngIf"],["class","coin-selector-container",3,"ngClass",4,"ngIf"],[3,"text","ngClass","pressed",4,"ngIf"],["formArrayName","destinations","class","-destination",4,"ngFor","ngForOf"],["class","row",4,"ngIf"],["class","form-field simple-form-hours",4,"ngIf"],["for","address"],["formControlName","address","id","address",3,"appFormFieldError","blur"],[1,"help-icon",3,"matTooltip"],[1,"coin-selector-container",3,"ngClass"],["className","light small",3,"leftButtonText","rightButtonText","activeButton","onStateChange"],[3,"text","ngClass","pressed"],["formArrayName","destinations",1,"-destination"],[1,"row",3,"formGroupName"],["class","col-lg-5 col-md-4",4,"ngIf"],[3,"ngClass"],[1,"-input-addon"],["formControlName","coins",3,"appFormFieldError","blur"],[1,"coins-value-label"],[4,"ngIf"],[1,"link",3,"ngClass","click"],["class","col-lg-3 col-md-4",4,"ngIf"],["class","col-md-1 -icons",3,"ngClass",4,"ngIf"],[1,"col-lg-5","col-md-4"],["formControlName","address",3,"id","appFormFieldError","blur"],[1,"col-lg-3","col-md-4"],["formControlName","hours",3,"appFormFieldError","blur"],[1,"col-md-1","-icons",3,"ngClass"],["class","image-button","src","assets/img/plus-green.png","alt","plus",3,"click",4,"ngIf"],["class","image-button","src","assets/img/minus-grey.png","alt","minus",3,"click",4,"ngIf"],["src","assets/img/plus-green.png","alt","plus",1,"image-button",3,"click"],["src","assets/img/minus-grey.png","alt","minus",1,"image-button",3,"click"],[1,"row"],[1,"col-md-3"],["matTooltipClass","error-tooltip",1,"coins-value-label",3,"ngClass","matTooltip"],[1,"form-field","simple-form-hours"],["matTooltipClass","error-tooltip",3,"ngClass","matTooltip"],[1,"remove-icon",3,"inline","matTooltip","click"]],template:function(e,t){1&e&&(_s(0,"div",0),ou(1,"\n "),ou(2,"\n "),fs(3,mR,8,5,"div",1),ou(4,"\n\n "),_s(5,"div",2),ou(6,"\n "),ou(7,"\n "),_s(8,"label",3),ou(9),Vl(10,"translate"),fs(11,gR,3,3,"mat-icon",4),ou(12,"\n "),ys(),ou(13,"\n "),ou(14,"\n "),fs(15,_R,6,10,"div",5),ou(16,"\n\n "),ou(17,"\n "),fs(18,yR,2,4,"app-arrow-link",6),ou(19,"\n\n "),ou(20,"\n "),fs(21,bR,2,4,"app-arrow-link",6),ou(22,"\n\n "),ou(23,"\n "),fs(24,PR,41,24,"div",7),ou(25,"\n "),fs(26,RR,20,14,"div",8),ou(27,"\n "),ys(),ou(28,"\n\n "),ou(29,"\n "),fs(30,HR,11,14,"div",9),ou(31,"\n"),ys(),ou(32,"\n")),2&e&&(gs("formGroup",t.form),Pa(3),gs("ngIf",t.showSimpleForm),Pa(6),uu("\n ",Ul(10,10,t.showSimpleForm?"send.amount-label":"send.destinations-label"),"\n "),Pa(2),gs("ngIf",!t.showSimpleForm),Pa(4),gs("ngIf",t.price),Pa(3),gs("ngIf",!t.showSimpleForm),Pa(3),gs("ngIf",t.showSimpleForm),Pa(3),gs("ngForOf",t.destControls),Pa(2),gs("ngIf",t.destControls.length>1),Pa(4),gs("ngIf",t.showSimpleForm&&t.simpleFormSpecificHours))},directives:[wk,pM,fh,dh,Xw,bk,wM,QD,uC,KD,lh,JP,GA,_M,gM],pipes:[oS,pR,Lh,yS],styles:[".-destination[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%]{text-align:right;padding-top:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.destinations-label[_ngcontent-%COMP%]{display:inline-block}.coin-selector-container[_ngcontent-%COMP%]{display:inline-block;margin-left:5px;margin-bottom:5px}.coins-value-label[_ngcontent-%COMP%]{font-size:11px;margin-top:1px;padding:3px 10px;background-color:#f7f7f7;border-radius:6px}.coins-value-label[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{opacity:.5}.coins-value-label[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{display:inline-block;margin-bottom:3px;margin-top:-5px}.coins-value-label[_ngcontent-%COMP%] .centerd-link[_ngcontent-%COMP%]{width:100%;text-align:center}.error-coins-value[_ngcontent-%COMP%]{background-color:#ff004e!important;color:#fafafa!important}.-input-addon[_ngcontent-%COMP%]{display:flex}.-input-addon[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{border-top-right-radius:0;border-bottom-right-radius:0}.-input-addon[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border:2px;border-radius:0 6px 6px 0;background:rgba(30,34,39,.05);padding:0 10px;line-height:44px;color:rgba(30,34,39,.5);font-size:13px;flex-shrink:0}.simple-form-hours[_ngcontent-%COMP%]{display:flex;align-items:center}.simple-form-hours[_ngcontent-%COMP%] .remove-icon[_ngcontent-%COMP%]{margin-left:2px;color:#ff004e;cursor:pointer}.simple-form-hours-error[_ngcontent-%COMP%]{color:#ff004e}"]}),e}(),NR=["okButton"],BR=function(e){return e.Loading="Loading",e.ErrorLoading="ErrorLoading",e.ShowingForm="ShowingForm",e}({}),WR=function(){function e(e){this.working=!1,this.currentState=BR.Loading,this.states=BR,this.validateForm=!1,this.title="",this.text="",this.dropdownLabel="",this.defaultDropdownText="",this.inputLabel="",this.contents="",this.cancelButtonText="",this.okButtonText="",this.dropdownErrorMsg="",this.inputErrorMsg="",this.form=e.group({dropdown:[""],input:[""]}),this.form.setValidators(this.validate.bind(this))}return e.prototype.validate=function(){this.dropdownErrorMsg="",this.inputErrorMsg="";var e=!0;this.form.get("dropdown").value||(e=!1,this.form.get("dropdown").touched&&(this.dropdownErrorMsg="offline-transactions.wallet-error-info"));var t=this.form.get("input").value;return(!t||t.length<300||!/^[0-9a-fA-F]+$/.test(t))&&(e=!1,this.form.get("input").touched&&(this.inputErrorMsg="offline-transactions.tx-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ms(TM))},e.\u0275cmp=lt({type:e,selectors:[["ng-component"]],viewQuery:function(e,t){var n;1&e&&cc(NR,!0),2&e&&uc(n=fc())&&(t.okButton=n.first)},decls:0,vars:0,template:function(e,t){},encapsulation:2}),e}();function VR(e,t){1&e&&(_s(0,"div"),ou(1,"\n "),bs(2,"mat-spinner",2),ou(3,"\n "),_s(4,"p"),ou(5),Vl(6,"translate"),ys(),ou(7,"\n "),ys()),2&e&&(Pa(2),gs("diameter",40),Pa(3),su(Ul(6,2,"common.loading")))}function UR(e,t){if(1&e&&(_s(0,"div"),ou(1,"\n "),_s(2,"i",3),ou(3,"announcement"),ys(),ou(4,"\n "),_s(5,"p"),ou(6),Vl(7,"translate"),ys(),ou(8,"\n "),ys()),2&e){var n=As();Pa(6),su(Ul(7,1,n.noDataText))}}var zR=function(){function e(){this.isLoading=!0}return e.\u0275fac=function(t){return new(t||e)},e.\u0275cmp=lt({type:e,selectors:[["app-loading-content"]],inputs:{isLoading:"isLoading",noDataText:"noDataText"},decls:7,vars:2,consts:[[1,"-content"],[4,"ngIf"],[3,"diameter"],[1,"material-icons"]],template:function(e,t){1&e&&(_s(0,"div",0),ou(1,"\n "),fs(2,VR,8,4,"div",1),ou(3,"\n "),fs(4,UR,9,3,"div",1),ou(5,"\n"),ys(),ou(6,"\n")),2&e&&(Pa(2),gs("ngIf",t.isLoading),Pa(2),gs("ngIf",!t.isLoading))},directives:[fh,vS],pipes:[oS],styles:[".-content[_ngcontent-%COMP%]{text-align:center;margin:50px 0;font-size:13px;opacity:.5}.-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:15px}.-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:40px;opacity:.5}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block;opacity:.5}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.5)}"]}),e}();function qR(e,t){if(1&e&&bs(0,"app-loading-content",3),2&e){var n=As();gs("isLoading",n.currentState===n.states.Loading)("noDataText","offline-transactions.loading-problem")}}function GR(e,t){if(1&e&&(_s(0,"label",19),ou(1),Vl(2,"translate"),ys()),2&e){var n=As(3);Pa(1),su(Ul(2,1,n.dropdownLabel))}}function KR(e,t){if(1&e&&(_s(0,"option",20),ou(1),Vl(2,"translate"),ys()),2&e){var n=As(3);gs("ngValue",""),Pa(1),su(Ul(2,2,n.defaultDropdownText))}}function JR(e,t){if(1&e&&(ws(0),ou(1,"\n "),_s(2,"option",22),ou(3),ys(),ou(4,"\n "),ks()),2&e){var n=t.$implicit;Pa(2),gs("ngValue",n.value),Pa(1),uu("\n ",n.name,"\n ")}}function ZR(e,t){if(1&e&&(ws(0),ou(1,"\n "),fs(2,JR,5,2,"ng-container",21),ou(3,"\n "),ks()),2&e){var n=As(3);Pa(2),gs("ngForOf",n.dropdownElements)}}function QR(e,t){if(1&e){var n=Ss();_s(0,"div",6),ou(1,"\n "),fs(2,GR,3,3,"label",15),ou(3,"\n "),_s(4,"div",16),ou(5,"\n "),_s(6,"select",17),Ls("blur",function(){return sn(n),As(2).validate()}),ou(7,"\n "),fs(8,KR,3,4,"option",18),ou(9,"\n "),fs(10,ZR,4,1,"ng-container",2),ou(11,"\n "),ys(),ou(12,"\n "),ys(),ou(13,"\n "),ys()}if(2&e){var i=As(2);Pa(2),gs("ngIf",i.dropdownLabel),Pa(4),gs("appFormFieldError",i.dropdownErrorMsg),cs("disabled",i.working?"true":null),Pa(2),gs("ngIf",i.defaultDropdownText),Pa(2),gs("ngIf",i.dropdownElements)}}function XR(e,t){if(1&e&&(_s(0,"label",23),ou(1),Vl(2,"translate"),ys()),2&e){var n=As(2);Pa(1),su(Ul(2,1,n.inputLabel))}}function $R(e,t){if(1&e&&(_s(0,"textarea",24),ou(1),ys()),2&e){var n=As(2);gs("readonly",!0),Pa(1),su(n.contents)}}function eF(e,t){if(1&e){var n=Ss();_s(0,"textarea",25),Ls("blur",function(){return sn(n),As(2).validate()}),ys()}if(2&e){var i=As(2);gs("appFormFieldError",i.inputErrorMsg),cs("disabled",i.working?"true":null)}}function tF(e,t){if(1&e){var n=Ss();ws(0),ou(1,"\n "),ou(2),Vl(3,"translate"),_s(4,"div",4),ou(5,"\n "),ou(6,"\n "),fs(7,QR,14,5,"div",5),ou(8,"\n "),ou(9,"\n "),_s(10,"div",6),ou(11,"\n "),fs(12,XR,3,3,"label",7),ou(13,"\n "),fs(14,$R,2,2,"textarea",8),ou(15,"\n "),fs(16,eF,1,2,"textarea",9),ou(17,"\n "),ys(),ou(18,"\n "),ys(),ou(19,"\n "),ou(20,"\n "),_s(21,"div",10),ou(22,"\n "),_s(23,"app-button",11,12),Ls("action",function(){return sn(n),As().cancelPressed()}),ou(25),Vl(26,"translate"),ys(),ou(27,"\n "),_s(28,"app-button",13,14),Ls("action",function(){return sn(n),As().okPressed()}),ou(30),Vl(31,"translate"),ys(),ou(32,"\n "),ys(),ou(33,"\n "),ks()}if(2&e){var i=As();Pa(2),uu("\n ",Ul(3,10,i.text),"\n "),Pa(2),gs("formGroup",i.form),Pa(3),gs("ngIf",i.dropdownElements),Pa(5),gs("ngIf",i.inputLabel),Pa(2),gs("ngIf",!!i.contents),Pa(2),gs("ngIf",!i.contents),Pa(7),gs("disabled",i.working),Pa(2),uu("\n ",Ul(26,12,i.cancelButtonText),"\n "),Pa(3),gs("disabled",i.validateForm&&!i.form.valid||i.working),Pa(2),uu("\n ",Ul(31,14,i.okButtonText),"\n ")}}var nF=function(e){function t(t,n,i,r){var a=e.call(this,r)||this;return a.data=t,a.dialogRef=n,a.msgBarService=i,a.cancelButtonText="common.close-button",a.okButtonText="offline-transactions.copy-tx.copy-button",a.inputLabel="offline-transactions.copy-tx.input-label",a.title="offline-transactions.copy-tx."+(t.isUnsigned?"unsigned":"signed")+"-title",a.text="offline-transactions.copy-tx.text-"+(t.isUnsigned?"unsigned":"signed"),a.contents=t.rawTx,a.currentState=BR.ShowingForm,a}return Vw(t,e),t.openDialog=function(e,n){var i=new bw;return i.data=n,i.autoFocus=!0,i.width=zp.mediumModalWidth,e.open(t,i)},t.prototype.ngOnInit=function(){var e=this;setTimeout(function(){e.okButton.focus()})},t.prototype.cancelPressed=function(){this.dialogRef.close()},t.prototype.okPressed=function(){Wp(this.data.rawTx),this.msgBarService.showDone("common.copied",4e3)},t.\u0275fac=function(e){return new(e||t)(ms(Tw),ms(xw),ms(HC),ms(TM))},t.\u0275cmp=lt({type:t,selectors:[["app-copy-raw-tx"]],features:[Jo],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[3,"isLoading","noDataText",4,"ngIf"],[4,"ngIf"],[3,"isLoading","noDataText"],[1,"modal-form-container",3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","input",4,"ngIf"],["rows","5",3,"readonly",4,"ngIf"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur",4,"ngIf"],[1,"-buttons"],[3,"disabled","action"],["cancelButton",""],[1,"primary-button",3,"disabled","action"],["okButton",""],["for","dropdown",4,"ngIf"],[1,"-select"],["formControlName","dropdown","id","dropdown",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue",4,"ngIf"],["for","dropdown"],["disabled","","hidden","",3,"ngValue"],[4,"ngFor","ngForOf"],[3,"ngValue"],["for","input"],["rows","5",3,"readonly"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,qR,1,2,"app-loading-content",1),ou(5,"\n\n "),fs(6,tF,34,16,"ng-container",2),ou(7,"\n"),ys(),ou(8,"\n")),2&e&&(gs("headline",Ul(1,5,t.title))("dialog",t.dialogRef)("disableDismiss",t.working),Pa(4),gs("ngIf",t.currentState===t.states.Loading||t.currentState===t.states.ErrorLoading),Pa(2),gs("ngIf",t.currentState===t.states.ShowingForm))},directives:[AM,fh,zR,wk,pM,gC,Ek,bk,wM,QD,Pk,Rk,dh,Xw],pipes:[oS],styles:[""]}),t}(WR),iF=n("I2Jj"),rF=function(){function e(){}return e.encode=function(e,t,n,i,r){var a=this;if(void 0===r&&(r=0),e.length!==n.length)throw new Error("Invalid number of signatures.");var o=this.encodeSizeTransaction(e,t,n).toNumber(),s=new ArrayBuffer(o),u=new DataView(s),l=0;if(u.setUint32(l,o,!0),u.setUint8(l+=4,r),l+=1,this.convertToBytes(i).forEach(function(e){u.setUint8(l,e),l+=1}),n.length>65535)throw new Error("Too many signatures.");if(u.setUint32(l,n.length,!0),l+=4,n.forEach(function(e){a.convertToBytes(e).forEach(function(e){u.setUint8(l,e),l+=1})}),e.length>65535)throw new Error("Too many inputs.");if(u.setUint32(l,e.length,!0),l+=4,e.forEach(function(e){a.convertToBytes(e.hash).forEach(function(e){u.setUint8(l,e),l+=1})}),t.length>65535)throw new Error("Too many outputs.");u.setUint32(l,t.length,!0),l+=4;var c=iF("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");return t.forEach(function(e){var t=c.decode(e.address);u.setUint8(l,t[20]),l+=1;for(var n=0;n<20;n++)u.setUint8(l,t[n]),l+=1;l=a.setUint64(u,l,new If.a(e.coins).multipliedBy(1e6).decimalPlaces(0)),l=a.setUint64(u,l,new If.a(e.hours))}),this.convertToHex(s)},e.encodeSizeTransaction=function(e,t,n){var i=new If.a(0);return(i=(i=(i=(i=(i=(i=(i=(i=i.plus(4)).plus(1)).plus(32)).plus(4)).plus(new If.a(65).multipliedBy(n.length))).plus(4)).plus(new If.a(32).multipliedBy(e.length))).plus(4)).plus(new If.a(37).multipliedBy(t.length))},e.setUint64=function(e,t,n){var i=n.toString(16);i.length%2!=0&&(i="0"+i);for(var r=this.convertToBytes(i),a=r.length-1;a>=0;a--)e.setUint8(t,r[a]),t+=1;for(a=0;a<8-r.length;a++)e.setUint8(t,0),t+=1;return t},e.convertToBytes=function(e){if(e.length%2!=0)throw new Error("Invalid hex string.");for(var t=[],n=0;n8)throw new Error(u.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"));if(n.transaction.outputs.length>8)throw new Error(u.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"))}var r=new Yf.BigNumber(0);i.map(function(e){return r=r.plus(e.coins)});var a=new Yf.BigNumber(0);return n.transaction.outputs.filter(function(e){return i.map(function(e){return e.address}).find(function(t){return t===e.address})}).map(function(e){return a=a.plus(new Yf.BigNumber(e.hours))}),{inputs:n.transaction.inputs.map(function(e){return{hash:e.uxid,address:e.address,coins:new Yf.BigNumber(e.coins),hours:new Yf.BigNumber(e.calculated_hours)}}),outputs:n.transaction.outputs.map(function(e){return{hash:e.uxid,address:e.address,coins:new Yf.BigNumber(e.coins),hours:new Yf.BigNumber(e.hours)}}),coinsToSend:r,hoursToSend:a,hoursBurned:new Yf.BigNumber(n.transaction.fee),from:l,to:i.map(function(e){return e.address}).join(", "),wallet:e,encoded:n.encoded_transaction,innerHash:n.transaction.inner_hash}}));return e&&e.isHardware&&!s&&(f=f.pipe(ue(function(t){return h=t,u.signTransaction(e,null,t)})).pipe(ie(function(e){return h.encoded=e,h}))),f},e.prototype.signTransaction=function(e,t,n,i){if(void 0===i&&(i=""),e.isHardware){if(i)throw new Error("Raw transactions not allowed.");var r=[],a=[],o=new Map;if(e.addresses.forEach(function(e,t){return o.set(e.address,t)}),n.outputs.forEach(function(e){r.push({address:e.address,coins:new Yf.BigNumber(e.coins).toString(),hours:new Yf.BigNumber(e.hours).toFixed(0)})}),n.inputs.forEach(function(e){a.push({hash:e.hash,index:o.get(e.address)})}),r.length>1)for(var s=r.length-1;s>=0;s--)if(r[s].address===e.addresses[0].address){r[s].address_index=0;break}return this.hwWalletService.signTransaction(a,r).pipe(ie(function(e){return rF.encode(a,r,e.rawResponse,n.innerHash)}))}return this.apiService.post("wallet/transaction/sign",{wallet_id:e.id,password:t,encoded_transaction:i||n.encoded},{useV2:!0}).pipe(ie(function(e){return e.data.encoded_transaction}))},e.prototype.injectTransaction=function(e,t){var n=this;return this.apiService.post("injectTransaction",{rawtx:e},{sendDataAsJson:!0}).pipe(ue(function(e){return setTimeout(function(){return n.balanceAndOutputsService.refreshBalance()},32),t?n.storageService.store(xC.NOTES,e,t).pipe(gf(function(e){return Cm(e.pipe(Of(1e3),Uf(3)),Lf(-1))}),Rf(function(e){return-1===e?xf(-1):e}),ie(function(e){return-1!==e})):xf(!1)}))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(LO),Gi(Bp),Gi(Bw),Gi(aS),Gi(LC))}}),e}(),sF=["formSourceSelection"],uF=["formMultipleDestinations"],lF=["previewButton"],cF=["sendButton"],dF=function(e){return{"element-disabled":e}};function hF(e,t){if(1&e){var n=Ss();_s(0,"div",15),ou(1,"\n "),ou(2,"\n "),_s(3,"app-double-button",16),Ls("onStateChange",function(e){return sn(n),As().changeFormType(e)}),Vl(4,"translate"),Vl(5,"translate"),ys(),ou(6,"\n"),ys()}if(2&e){var i=As();Pa(3),gs("changeActiveButtonManually",!0)("leftButtonText",Ul(4,5,"send.signed-button"))("rightButtonText",Ul(5,7,"send.unsigned-button"))("activeButton",i.showForManualUnsigned?i.doubleButtonActive.RightButton:i.doubleButtonActive.LeftButton)("ngClass",Rl(9,dF,i.busy))}}function fF(e,t){if(1&e&&(ws(0),ou(1,"\n "),_s(2,"span"),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),_s(6,"span",19),ou(7),Vl(8,"amount"),ys(),ou(9,"\n "),_s(10,"span"),ou(11),Vl(12,"translate"),ys(),ou(13,"\n "),_s(14,"span",19),ou(15),Vl(16,"amount"),ys(),ou(17,"\n "),_s(18,"span"),ou(19),Vl(20,"translate"),ys(),ou(21,"\n "),_s(22,"span",19),ou(23),Vl(24,"amount"),ys(),ou(25,"\n "),_s(26,"span"),ou(27),Vl(28,"translate"),ys(),ou(29,"\n "),ks()),2&e){var n=As(2);Pa(3),su(Ul(4,7,"send.available-funds-msg-part1")),Pa(4),uu("\n ",Ul(8,9,n.availableBalance.availableCoins),"\n "),Pa(4),su(Ul(12,11,"send.available-funds-msg-part2")),Pa(4),uu("\n ",zl(16,13,n.availableBalance.availableHours,!1),"\n "),Pa(4),su(Ul(20,16,"send.available-funds-msg-part3")),Pa(4),uu("\n ",zl(24,18,n.availableBalance.minimumFee,!1),"\n "),Pa(4),su(Ul(28,21,"send.available-funds-msg-part4"))}}function pF(e,t){1&e&&(ws(0),ou(1,"\n "),_s(2,"span"),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ks()),2&e&&(Pa(3),su(Ul(4,1,"common.loading")))}function mF(e,t){if(1&e&&(_s(0,"div",17),ou(1,"\n "),fs(2,fF,30,23,"ng-container",18),ou(3,"\n "),fs(4,pF,6,3,"ng-container",18),ou(5,"\n "),ys()),2&e){var n=As();Pa(2),gs("ngIf",!n.availableBalance.loading),Pa(2),gs("ngIf",n.availableBalance.loading)}}function gF(e,t){if(1&e){var n=Ss();_s(0,"div",20),ou(1,"\n "),_s(2,"label",21),ou(3),Vl(4,"translate"),_s(5,"mat-icon",22),Vl(6,"translate"),ou(7,"help"),ys(),ou(8,"\n "),_s(9,"app-arrow-link",23),Ls("pressed",function(e){return sn(n),As().selectChangeAddress(e)}),ou(10,"\n "),ys(),ou(11,"\n "),ys(),ou(12,"\n "),_s(13,"input",24),Ls("keydown.enter",function(){sn(n);var e=As();return e.showForManualUnsigned?e.preview():null})("blur",function(){return sn(n),As().validateForm()}),ys(),ou(14,"\n "),ys()}if(2&e){var i=As();Pa(3),uu("\n ",Ul(4,6,"send.change-address-label"),"\n "),Pa(2),gs("matTooltip",Ul(6,8,"send.change-address-help")),Pa(4),gs("text","send.change-address-select-from-list-link")("ngClass",Rl(10,dF,i.busy)),Pa(4),gs("appFormFieldError",i.invalidChangeAddress?"send.invalid-addresses-error":i.changeAddressErrorMsg),cs("disabled",i.busy?"true":null)}}function vF(e,t){if(1&e){var n=Ss();_s(0,"div",20),ou(1,"\n "),_s(2,"label",25),ou(3),Vl(4,"translate"),_s(5,"mat-icon",22),Vl(6,"translate"),ou(7,"help"),ys(),ou(8,"\n "),ys(),ou(9,"\n "),_s(10,"input",26),Ls("keydown.enter",function(){return sn(n),As().preview()}),ys(),ou(11,"\n "),ys()}if(2&e){var i=As();Pa(3),uu("\n ",Ul(4,4,"send.personal-note-label"),"\n "),Pa(2),gs("matTooltip",Ul(6,6,"send.personal-note-help")),Pa(5),gs("maxlength",i.maxNoteChars),cs("disabled",i.busy?"true":null)}}function _F(e,t){if(1&e){var n=Ss();_s(0,"app-arrow-link",28),Ls("pressed",function(e){return sn(n),As(2).toggleOptions(e)}),ou(1,"\n "),ys()}if(2&e){var i=As(2);gs("noPadding",!0)("text","send.coin-hours-options-link")("pointDown",!i.showAutoHourDistributionOptions)}}function yF(e,t){if(1&e&&(_s(0,"div",20),ou(1,"\n "),fs(2,_F,2,3,"app-arrow-link",27),ou(3,"\n "),ys()),2&e){var n=As();Pa(2),gs("ngIf",n.showSimpleForm)}}function bF(e,t){1&e&&Ms(0)}var wF=function(e){return{"d-none":e}};function kF(e,t){if(1&e&&(_s(0,"div",29),ou(1,"\n "),fs(2,bF,1,0,"ng-container",30),ou(3,"\n "),ys()),2&e){var n=As(),i=ps(47);gs("ngClass",Rl(2,wF,!n.showAutoHourDistributionOptions)),Pa(2),gs("ngTemplateOutlet",i)}}function MF(e,t){if(1&e){var n=Ss();_s(0,"app-arrow-link",36),Ls("mousedown",function(e){return e.stopPropagation()})("pressed",function(e){return sn(n),As(2).toggleOptions(e)}),ou(1,"\n "),ys()}if(2&e){var i=As(2);gs("text","send.options-link")("pointDown",!i.showAutoHourDistributionOptions)}}function SF(e,t){1&e&&Ms(0)}var CF=function(e){return{coinHoursName:e}},xF=function(e){return{"row -options-wrapper":!0,"d-none":e}};function LF(e,t){if(1&e){var n=Ss();_s(0,"div",20),ou(1,"\n "),_s(2,"div",31),ou(3,"\n "),_s(4,"div",32),ou(5,"\n "),_s(6,"mat-checkbox",33),Ls("change",function(e){return sn(n),As().setAutoHours(e)}),ou(7,"\n "),_s(8,"span"),ou(9),Vl(10,"translate"),ys(),ou(11,"\n "),fs(12,MF,2,2,"app-arrow-link",34),ou(13,"\n "),ys(),ou(14,"\n "),ys(),ou(15,"\n "),ys(),ou(16,"\n\n "),ou(17,"\n "),_s(18,"div",35),ou(19,"\n "),fs(20,SF,1,0,"ng-container",30),ou(21,"\n "),ys(),ou(22,"\n "),ys()}if(2&e){var i=As(),r=ps(47);Pa(2),gs("ngClass",Rl(9,dF,i.busy)),Pa(4),gs("checked",i.autoHours),Pa(3),su(zl(10,6,"send.hours-allocation-check",Rl(11,CF,i.appService.hoursName))),Pa(3),gs("ngIf",i.autoHours),Pa(6),gs("ngClass",Rl(13,xF,!i.showAutoHourDistributionOptions)),Pa(2),gs("ngTemplateOutlet",r)}}function TF(e,t){if(1&e){var n=Ss();ou(0,"\n "),_s(1,"div",37),ou(2,"\n "),_s(3,"div",20),ou(4,"\n "),_s(5,"label",38),ou(6,"\n "),_s(7,"span"),ou(8),Vl(9,"translate"),_s(10,"mat-icon",22),Vl(11,"translate"),ou(12,"help"),ys(),ou(13,"\n "),ys(),ou(14,"\n "),_s(15,"span"),ou(16),Vl(17,"number"),ys(),ou(18,"\n "),ys(),ou(19,"\n "),_s(20,"mat-slider",39),Ls("input",function(e){return sn(n),As().setShareValue(e)}),ys(),ou(21,"\n "),ys(),ou(22,"\n "),ys(),ou(23,"\n")}if(2&e){var i=As();Pa(8),uu("\n ",zl(9,5,"send.hours-share-factor-label",Rl(14,CF,i.appService.hoursName)),"\n "),Pa(2),gs("matTooltip",zl(11,8,"send.hours-share-factor-help",Rl(16,CF,i.appService.hoursName))),Pa(6),su(zl(17,11,i.autoShareValue,"1.0-2")),Pa(4),gs("value",i.autoShareValue)("ngClass",Rl(18,dF,i.busy))}}var DF=function(){function e(e,t,n,i,r,a,o,s,u,l){this.appService=e,this.blockchainService=t,this.dialog=n,this.msgBarService=i,this.navBarSwitchService=r,this.hwWalletService=a,this.translate=o,this.changeDetector=s,this.spendingService=u,this.walletsAndAddressesService=l,this.defaultAutoShareValue="0.5",this.onFormSubmitted=new Zl,this.sourceSelectionModes=lR,this.doubleButtonActive=KP,this.maxNoteChars=GI.MAX_NOTE_CHARS,this.availableBalance=new uR,this.autoHours=!0,this.hoursAddedToSimpleForm=!1,this.showAutoHourDistributionOptions=!1,this.autoShareValue=this.defaultAutoShareValue,this.busy=!1,this.showForManualUnsigned=!1,this.changeAddressErrorMsg="",this.invalidChangeAddress=!1}return e.prototype.ngOnInit=function(){var e=this;this.form=new rM({}),this.form.addControl("changeAddress",new iM("")),this.form.addControl("note",new iM("")),this.form.setValidators(this.validateForm.bind(this)),this.formData&&setTimeout(function(){return e.fillForm()})},e.prototype.ngOnDestroy=function(){this.processingSubscription&&!this.processingSubscription.closed&&this.processingSubscription.unsubscribe(),this.closeSyncCheckSubscription(),this.msgBarService.hide()},e.prototype.sourceSelectionChanged=function(){this.selectedSources=this.formSourceSelection.selectedSources,this.availableBalance=this.formSourceSelection.availableBalance,this.formMultipleDestinations.updateValuesAndValidity(),this.form.updateValueAndValidity()},e.prototype.destinationsChanged=function(){var e=this;setTimeout(function(){e.form.updateValueAndValidity()})},e.prototype.preview=function(){this.checkBeforeCreatingTx(!0),this.changeDetector.detectChanges()},e.prototype.send=function(){this.checkBeforeCreatingTx(!1)},e.prototype.changeFormType=function(e){var t=this;e===KP.LeftButton&&!this.showForManualUnsigned||e===KP.RightButton&&this.showForManualUnsigned||(e===KP.RightButton?ID.openDialog(this.dialog,{text:"send.unsigned-confirmation",defaultButtons:YD.YesNo}).afterClosed().subscribe(function(e){e&&(t.showForManualUnsigned=!0)}):this.showForManualUnsigned=!1)},e.prototype.setShareValue=function(e){this.autoShareValue=parseFloat(e.value).toFixed(2)},e.prototype.selectChangeAddress=function(){var e=this;zI.openDialog(this.dialog).afterClosed().subscribe(function(t){t&&e.form.get("changeAddress").setValue(t)})},e.prototype.openMultipleDestinationsPopup=function(){var e=this,t="";this.formMultipleDestinations.getDestinations(!1).map(function(n){(n.address.trim().length>0||n.originalAmount.trim().length>0||!e.autoHours&&n.hours.trim().length>0)&&(t+=n.address.replace(",",""),t+=", "+n.originalAmount.replace(",",""),e.autoHours||(t+=", "+n.hours.replace(",","")),t+="\r\n")}),KI.openDialog(this.dialog,t).afterClosed().subscribe(function(t){t&&(t.length>0?(e.autoHours=void 0===t[0].hours,setTimeout(function(){return e.formMultipleDestinations.setDestinations(t)})):e.formMultipleDestinations.resetForm())})},e.prototype.changeNote=function(e){this.form.get("note").setValue(e),this.form.get("note").markAsTouched(),this.form.updateValueAndValidity()},e.prototype.setManualHours=function(){this.autoHours=!1},e.prototype.changeHoursAddedToSimpleForm=function(e){this.hoursAddedToSimpleForm=e},e.prototype.toggleOptions=function(e){var t=this;e.stopPropagation(),e.preventDefault(),this.showAutoHourDistributionOptions&&this.autoShareValue!==this.defaultAutoShareValue?ID.openDialog(this.dialog,{text:"send.close-hours-share-factor-alert",defaultButtons:YD.YesNo}).afterClosed().subscribe(function(e){e&&(t.autoShareValue=t.defaultAutoShareValue,t.showAutoHourDistributionOptions=!t.showAutoHourDistributionOptions)}):(this.autoShareValue=this.defaultAutoShareValue,this.showAutoHourDistributionOptions=!this.showAutoHourDistributionOptions)},e.prototype.setAutoHours=function(e){this.autoHours=e.checked,this.formMultipleDestinations.updateValuesAndValidity(),this.autoHours||(this.showAutoHourDistributionOptions=!1)},e.prototype.fillForm=function(){var e=this;this.showForManualUnsigned=this.formData.showForManualUnsigned,this.formSourceSelection.fill(this.formData),this.formMultipleDestinations.fill(this.formData),["changeAddress","note"].forEach(function(t){e.form.get(t).setValue(e.formData.form[t])}),this.showSimpleForm||this.formData.form.hoursSelection.type===aF.Auto?(this.autoShareValue=this.formData.form.hoursSelection.share_factor?this.formData.form.hoursSelection.share_factor:this.defaultAutoShareValue,this.autoHours=!0):this.autoHours=!1,this.showAutoHourDistributionOptions=this.formData.form.showAutoHourDistributionOptions},e.prototype.validateForm=function(){this.changeAddressErrorMsg="";var e=!0,t=this.form.get("changeAddress").value;return t&&t.length<20&&(e=!1,this.form.get("changeAddress").touched&&(this.changeAddressErrorMsg="send.address-error-info")),this.formSourceSelection&&this.formSourceSelection.valid&&this.formMultipleDestinations&&this.formMultipleDestinations.valid||(e=!1),e?null:{Invalid:!0}},e.prototype.checkBeforeCreatingTx=function(e){var t=this;!this.form.valid||this.previewButton.isLoading()||this.sendButton.isLoading()||(this.closeSyncCheckSubscription(),this.syncCheckSubscription=this.blockchainService.progress.pipe(ep()).subscribe(function(n){n.synchronized?t.checkHoursBeforeCreatingTx(e):ID.openDialog(t.dialog,{text:"send.synchronizing-warning",defaultButtons:YD.YesNo}).afterClosed().subscribe(function(n){n&&t.checkHoursBeforeCreatingTx(e)})}))},e.prototype.checkHoursBeforeCreatingTx=function(e){var t=this;if(this.form.valid&&!this.previewButton.isLoading()&&!this.sendButton.isLoading()){var n,i=new Yf.BigNumber(0),r=new Yf.BigNumber(0);if(this.formMultipleDestinations.getDestinations(!0).forEach(function(e){i=i.plus(e.coins),t.autoHours||(r=r.plus(e.hours))}),i.isEqualTo(this.availableBalance.availableCoins)||r.isEqualTo(this.availableBalance.availableHours)||1===Number(this.autoShareValue)&&this.autoHours)n=r.isEqualTo(this.availableBalance.availableHours)?"send.sending-all-hours-waning":i.isEqualTo(this.availableBalance.availableCoins)?this.formSourceSelection.wallet.coins.isEqualTo(this.availableBalance.availableCoins)?"send.sending-all-hours-with-coins-waning":"send.advanced-sending-all-hours-with-coins-waning":this.formSourceSelection.wallet.coins.isEqualTo(this.availableBalance.availableCoins)?"send.high-hours-share-waning":"send.advanced-high-hours-share-waning",ID.openDialog(this.dialog,{headerText:"common.warning-title",redTitle:!0,text:n,defaultButtons:YD.YesNo}).afterClosed().subscribe(function(n){n&&t.prepareTransaction(e)});else this.prepareTransaction(e)}},e.prototype.prepareTransaction=function(e){var t=this;this.msgBarService.hide(),this.previewButton.resetState(),this.sendButton.resetState(),this.showForManualUnsigned||!this.selectedSources.wallet.encrypted||this.selectedSources.wallet.isHardware||e?e||this.showForManualUnsigned||!this.selectedSources.wallet.isHardware?this.createTransaction(e):(this.showBusy(e),this.processingSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.selectedSources.wallet.addresses[0].address).subscribe(function(){return t.createTransaction(e)},function(e){return t.showError(e)})):YA.openDialog(this.dialog,{wallet:this.selectedSources.wallet}).componentInstance.passwordSubmit.subscribe(function(n){t.createTransaction(e,n)})},e.prototype.createTransaction=function(e,t){var n,i=this;this.showBusy(e),n=this.showForManualUnsigned?this.selectedSources.manualAddresses:this.selectedSources.addresses&&this.selectedSources.addresses.length>0?this.selectedSources.addresses.map(function(e){return e.address}):null;var r=this.selectedSources.unspentOutputs&&this.selectedSources.unspentOutputs.length>0?this.selectedSources.unspentOutputs.map(function(e){return e.hash}):null,a=this.formMultipleDestinations.getDestinations(!0);this.formMultipleDestinations.setValidAddressesList(null),this.invalidChangeAddress=!1;var o=this.form.get("changeAddress").value,s=a.map(function(e){return e.address});o&&s.push(o),this.processingSubscription=zw(s.map(function(e){return i.walletsAndAddressesService.verifyAddress(e)})).pipe(ue(function(s){if(o&&(i.invalidChangeAddress=!s.pop(),i.invalidChangeAddress))return Lf(i.translate.instant("send.change-address-error-info"));var u=0;return s.forEach(function(e){e||(u+=1)}),0===u?i.spendingService.createTransaction(i.selectedSources.wallet,n||i.selectedSources.wallet.addresses.map(function(e){return e.address}),r,a,i.hoursSelection,i.form.get("changeAddress").value?i.form.get("changeAddress").value:null,t?t.password:null,e||i.showForManualUnsigned):(i.formMultipleDestinations.setValidAddressesList(s),Lf(i.translate.instant(a.length>1?u===a.length?"send.all-addresses-invalid-error":1===u?"send.one-invalid-address-error":"send.various-invalid-addresses-error":"send.invalid-address-error")))})).subscribe(function(n){t&&t.close();var r=i.form.value.note.trim();if(n.note=r,e){var o=new Yf.BigNumber("0");a.map(function(e){return o=o.plus(e.coins)}),i.onFormSubmitted.emit({form:{wallet:i.selectedSources.wallet,addresses:i.selectedSources.addresses,manualAddresses:i.selectedSources.manualAddresses,changeAddress:i.form.get("changeAddress").value,destinations:a,hoursSelection:i.hoursSelection,showAutoHourDistributionOptions:i.showAutoHourDistributionOptions,allUnspentOutputs:i.formSourceSelection.unspentOutputsList,outputs:i.selectedSources.unspentOutputs,currency:i.formMultipleDestinations.currentlySelectedCurrency,note:r},amount:o,to:a.map(function(e){return e.address}),transaction:n,showForManualUnsigned:i.showForManualUnsigned}),i.busy=!1,i.navBarSwitchService.enableSwitch()}else i.showForManualUnsigned?nF.openDialog(i.dialog,{rawTx:n.encoded,isUnsigned:!0}).afterClosed().subscribe(function(){i.resetState(),ID.openDialog(i.dialog,{text:"offline-transactions.copy-tx.reset-confirmation",defaultButtons:YD.YesNo}).afterClosed().subscribe(function(e){e&&(i.resetForm(),i.msgBarService.showDone("offline-transactions.copy-tx.reset-done",4e3))})}):i.processingSubscription=i.spendingService.injectTransaction(n.encoded,r).subscribe(function(e){var t=!0;r&&!e&&(i.msgBarService.showWarning(i.translate.instant("send.saving-note-error")),t=!1),i.showSuccess(t)},function(e){return i.showError(e)})},function(e){t&&t.error(e),i.showError(e)})},e.prototype.resetForm=function(){this.formSourceSelection.resetForm(),this.formMultipleDestinations.resetForm(),this.form.get("changeAddress").setValue(""),this.form.get("note").setValue(""),this.autoHours=!0,this.showAutoHourDistributionOptions=!1,this.autoShareValue=this.defaultAutoShareValue},Object.defineProperty(e.prototype,"hoursSelection",{get:function(){var e={type:aF.Manual};return this.autoHours&&!this.hoursAddedToSimpleForm&&(e={type:aF.Auto,mode:"share",share_factor:this.autoShareValue}),e},enumerable:!1,configurable:!0}),e.prototype.closeSyncCheckSubscription=function(){this.syncCheckSubscription&&this.syncCheckSubscription.unsubscribe()},e.prototype.showBusy=function(e){e?(this.previewButton.setLoading(),this.sendButton.setDisabled()):(this.sendButton.setLoading(),this.previewButton.setDisabled()),this.busy=!0,this.navBarSwitchService.disableSwitch()},e.prototype.showSuccess=function(e){var t=this;this.busy=!1,this.navBarSwitchService.enableSwitch(),this.resetForm(),e?(this.msgBarService.showDone("send.sent"),this.sendButton.resetState()):(this.sendButton.setSuccess(),setTimeout(function(){t.sendButton.resetState()},3e3))},e.prototype.showError=function(e){this.busy=!1,this.msgBarService.showError(e),this.navBarSwitchService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},e.prototype.resetState=function(){this.busy=!1,this.navBarSwitchService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},e.\u0275fac=function(t){return new(t||e)(ms(qp),ms(TO),ms(Aw),ms(HC),ms(ZP),ms(Bw),ms(aS),ms(ul),ms(oF),ms(ix))},e.\u0275cmp=lt({type:e,selectors:[["app-send-coins-form"]],viewQuery:function(e,t){if(1&e&&(cc(sF,!0),cc(uF,!0),cc(lF,!0),cc(cF,!0)),2&e){var n=void 0;uc(n=fc())&&(t.formSourceSelection=n.first),uc(n=fc())&&(t.formMultipleDestinations=n.first),uc(n=fc())&&(t.previewButton=n.first),uc(n=fc())&&(t.sendButton=n.first)}},inputs:{formData:"formData",showSimpleForm:"showSimpleForm"},outputs:{onFormSubmitted:"onFormSubmitted"},decls:49,vars:22,consts:[["class","mode-selector",4,"ngIf"],[3,"formGroup"],[3,"busy","selectionMode","onSelectionChanged"],["formSourceSelection",""],["class","form-field -available-msg",4,"ngIf"],[3,"availableBalance","busy","showHourFields","showSimpleForm","onChanges","onBulkRequested","newNoteRequested","manualHoursRequested","hoursAddedToSimpleForm"],["formMultipleDestinations",""],["class","form-field",4,"ngIf"],["class","form-field row -options-wrapper",3,"ngClass",4,"ngIf"],[1,"text-center"],[3,"disabled","action"],["previewButton",""],[1,"primary-button",3,"disabled","action"],["sendButton",""],["hoursSelector",""],[1,"mode-selector"],["className","light small",3,"changeActiveButtonManually","leftButtonText","rightButtonText","activeButton","ngClass","onStateChange"],[1,"form-field","-available-msg"],[4,"ngIf"],[1,"value"],[1,"form-field"],["for","change-address"],[1,"help-icon",3,"matTooltip"],[3,"text","ngClass","pressed"],["formControlName","changeAddress","id","change-address",3,"appFormFieldError","keydown.enter","blur"],["for","note"],["formControlName","note","id","note",3,"maxlength","keydown.enter"],[3,"noPadding","text","pointDown","pressed",4,"ngIf"],[3,"noPadding","text","pointDown","pressed"],[1,"form-field","row","-options-wrapper",3,"ngClass"],[4,"ngTemplateOutlet"],[1,"row",3,"ngClass"],[1,"col-12"],[1,"-check",3,"checked","change"],[3,"text","pointDown","mousedown","pressed",4,"ngIf"],[3,"ngClass"],[3,"text","pointDown","mousedown","pressed"],[1,"col-md-7"],["for","value",1,"-space-between"],["min","0","max","1","step","0.01","id","value",3,"value","ngClass","input"]],template:function(e,t){1&e&&(fs(0,hF,7,11,"div",0),ou(1,"\n\n"),_s(2,"div",1),ou(3,"\n "),ou(4,"\n "),_s(5,"app-form-source-selection",2,3),Ls("onSelectionChanged",function(){return t.sourceSelectionChanged()}),ou(7,"\n "),ys(),ou(8,"\n\n "),ou(9,"\n "),fs(10,mF,6,2,"div",4),ou(11,"\n\n "),ou(12,"\n "),_s(13,"app-form-destination",5,6),Ls("onChanges",function(){return t.destinationsChanged()})("onBulkRequested",function(){return t.openMultipleDestinationsPopup()})("newNoteRequested",function(e){return t.changeNote(e)})("manualHoursRequested",function(){return t.setManualHours()})("hoursAddedToSimpleForm",function(e){return t.changeHoursAddedToSimpleForm(e)}),ou(15,"\n "),ys(),ou(16,"\n\n "),ou(17,"\n "),fs(18,gF,15,12,"div",7),ou(19,"\n\n "),ou(20,"\n "),fs(21,vF,12,8,"div",7),ou(22,"\n\n "),ou(23,"\n "),fs(24,yF,4,1,"div",7),ou(25,"\n\n "),fs(26,kF,4,4,"div",8),ou(27,"\n\n "),ou(28,"\n "),fs(29,LF,23,15,"div",7),ou(30,"\n"),ys(),ou(31,"\n\n"),ou(32,"\n"),_s(33,"div",9),ou(34,"\n "),_s(35,"app-button",10,11),Ls("action",function(){return t.preview()}),ou(37),Vl(38,"translate"),ys(),ou(39,"\n "),_s(40,"app-button",12,13),Ls("action",function(){return t.send()}),ou(42),Vl(43,"translate"),ys(),ou(44,"\n"),ys(),ou(45,"\n\n"),fs(46,TF,24,20,"ng-template",null,14,vc),ou(48,"\n")),2&e&&(gs("ngIf",!t.showSimpleForm),Pa(2),gs("formGroup",t.form),Pa(3),gs("busy",t.busy)("selectionMode",t.showSimpleForm?t.sourceSelectionModes.Wallet:t.showForManualUnsigned?t.sourceSelectionModes.Manual:t.sourceSelectionModes.All),Pa(5),gs("ngIf",!t.showSimpleForm),Pa(3),gs("availableBalance",t.availableBalance)("busy",t.busy)("showHourFields",!t.autoHours)("showSimpleForm",t.showSimpleForm),Pa(5),gs("ngIf",!t.showSimpleForm),Pa(3),gs("ngIf",!t.showForManualUnsigned),Pa(3),gs("ngIf",t.showSimpleForm&&!t.hoursAddedToSimpleForm),Pa(2),gs("ngIf",t.showSimpleForm&&!t.hoursAddedToSimpleForm),Pa(3),gs("ngIf",!t.showSimpleForm),Pa(6),gs("disabled",!t.form.valid),Pa(2),uu("\n ",Ul(38,18,"send.preview-button"),"\n "),Pa(3),gs("disabled",!t.form.valid),Pa(2),uu("\n ",Ul(43,20,"send."+(t.showForManualUnsigned?"show":"send")+"-button"),"\n "))},styles:[".mode-selector[_ngcontent-%COMP%]{text-align:right;height:0}.mode-selector[_ngcontent-%COMP%] app-double-button[_ngcontent-%COMP%]{display:inline-block;position:relative;top:-27px;right:-27px}.-options-wrapper[_ngcontent-%COMP%]{margin-top:20px}.-space-between[_ngcontent-%COMP%]{display:flex;justify-content:space-between}.-available-msg[_ngcontent-%COMP%]{background-color:#f7f7f7;border:1px dotted rgba(30,34,39,.2);border-radius:6px;padding:10px;font-size:11px;text-align:center}.-available-msg[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{opacity:.7}.-available-msg[_ngcontent-%COMP%] .value[_ngcontent-%COMP%]{opacity:1!important;font-weight:700;font-size:13px}"]}),e}(),OF=function(){function e(e,t){var n=this;this.http=e,this.storageService=t,this.API_ENDPOINT="https://swaplab.cc/api/v3",this.STORAGE_KEY="exchange-orders",this.LAST_VIEWED_STORAGE_KEY="last-viewed-order",this.API_KEY=yd,this.TEST_MODE=false,this.lastViewedOrderLoaded=new Gp(!1),t.get(xC.CLIENT,this.LAST_VIEWED_STORAGE_KEY).subscribe(function(e){n.lastViewedOrder=JSON.parse(e.data),n.lastViewedOrderLoaded.next(!0)},function(){n.lastViewedOrderLoaded.next(!0)})}return Object.defineProperty(e.prototype,"lastViewedOrder",{get:function(){return this._lastViewedOrder},set:function(e){this._lastViewedOrder=e,this.saveLastViewedSubscription&&this.saveLastViewedSubscription.unsubscribe(),this.saveLastViewedSubscription=this.storageService.store(xC.CLIENT,this.LAST_VIEWED_STORAGE_KEY,JSON.stringify(e)).subscribe()},enumerable:!1,configurable:!0}),e.prototype.tradingPairs=function(){return this.post("trading_pairs").pipe(ie(function(e){return e.result}))},e.prototype.exchange=function(e,t,n,i){var r,a=this;return this.post("orders",{pair:e,fromAmount:t,toAddress:n}).pipe(ue(function(e){return a.storeOrder(r=e.result,i)}),ie(function(){return r}))},e.prototype.status=function(e,t){return this.TEST_MODE&&!t&&(t="user_waiting"),this.post("orders/status",{id:e},this.TEST_MODE?{status:t}:null).pipe(gf(function(e){return e.pipe(ue(function(e){return e.originalError&&e.originalError.status&&404===e.originalError.status?Lf(e):xf(e)}),Of(3e3))}),ie(function(e){return e.result}))},e.prototype.history=function(){return this.storageService.get(xC.CLIENT,this.STORAGE_KEY).pipe(ie(function(e){return JSON.parse(e.data)}))},e.prototype.isOrderFinished=function(e){return["complete","error","user_deposit_timeout"].indexOf(e.status)>-1},e.prototype.post=function(e,t,n){return this.http.post(this.buildUrl(e),t,{responseType:"json",headers:new rp(Uw({"api-key":this.API_KEY,Accept:"application/json"},n))}).pipe(Rf(function(e){return Lf(Hp(e))}))},e.prototype.buildUrl=function(e){return this.TEST_MODE&&"trading_pairs"!==e?this.API_ENDPOINT+"sandbox/"+e:this.API_ENDPOINT+"/"+e},e.prototype.storeOrder=function(e,t){var n=this;return this.history().pipe(Rf(function(e){try{if(e.originalError&&e.originalError.status&&404===e.originalError.status)return xf([])}catch(t){}return Lf(e)}),ue(function(i){var r={id:e.id,pair:e.pair,fromAmount:e.fromAmount,toAmount:e.toAmount,address:e.toAddress,timestamp:UA().unix(),price:t};i.push(r);var a=JSON.stringify(i);return i.pop(),n.storageService.store(xC.CLIENT,n.STORAGE_KEY,a).pipe(Gg(function(){return i.push(r)}))}))},e.\u0275prov=Ee({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Gi(yp),Gi(LC))}}),e}();function EF(e,t){if(1&e&&bs(0,"app-loading-content",3),2&e){var n=As();gs("isLoading",n.currentState===n.states.Loading)("noDataText","offline-transactions.loading-problem")}}function PF(e,t){if(1&e&&(_s(0,"label",19),ou(1),Vl(2,"translate"),ys()),2&e){var n=As(3);Pa(1),su(Ul(2,1,n.dropdownLabel))}}function AF(e,t){if(1&e&&(_s(0,"option",20),ou(1),Vl(2,"translate"),ys()),2&e){var n=As(3);gs("ngValue",""),Pa(1),su(Ul(2,2,n.defaultDropdownText))}}function YF(e,t){if(1&e&&(ws(0),ou(1,"\n "),_s(2,"option",22),ou(3),ys(),ou(4,"\n "),ks()),2&e){var n=t.$implicit;Pa(2),gs("ngValue",n.value),Pa(1),uu("\n ",n.name,"\n ")}}function IF(e,t){if(1&e&&(ws(0),ou(1,"\n "),fs(2,YF,5,2,"ng-container",21),ou(3,"\n "),ks()),2&e){var n=As(3);Pa(2),gs("ngForOf",n.dropdownElements)}}function RF(e,t){if(1&e){var n=Ss();_s(0,"div",6),ou(1,"\n "),fs(2,PF,3,3,"label",15),ou(3,"\n "),_s(4,"div",16),ou(5,"\n "),_s(6,"select",17),Ls("blur",function(){return sn(n),As(2).validate()}),ou(7,"\n "),fs(8,AF,3,4,"option",18),ou(9,"\n "),fs(10,IF,4,1,"ng-container",2),ou(11,"\n "),ys(),ou(12,"\n "),ys(),ou(13,"\n "),ys()}if(2&e){var i=As(2);Pa(2),gs("ngIf",i.dropdownLabel),Pa(4),gs("appFormFieldError",i.dropdownErrorMsg),cs("disabled",i.working?"true":null),Pa(2),gs("ngIf",i.defaultDropdownText),Pa(2),gs("ngIf",i.dropdownElements)}}function FF(e,t){if(1&e&&(_s(0,"label",23),ou(1),Vl(2,"translate"),ys()),2&e){var n=As(2);Pa(1),su(Ul(2,1,n.inputLabel))}}function HF(e,t){if(1&e&&(_s(0,"textarea",24),ou(1),ys()),2&e){var n=As(2);gs("readonly",!0),Pa(1),su(n.contents)}}function jF(e,t){if(1&e){var n=Ss();_s(0,"textarea",25),Ls("blur",function(){return sn(n),As(2).validate()}),ys()}if(2&e){var i=As(2);gs("appFormFieldError",i.inputErrorMsg),cs("disabled",i.working?"true":null)}}function NF(e,t){if(1&e){var n=Ss();ws(0),ou(1,"\n "),ou(2),Vl(3,"translate"),_s(4,"div",4),ou(5,"\n "),ou(6,"\n "),fs(7,RF,14,5,"div",5),ou(8,"\n "),ou(9,"\n "),_s(10,"div",6),ou(11,"\n "),fs(12,FF,3,3,"label",7),ou(13,"\n "),fs(14,HF,2,2,"textarea",8),ou(15,"\n "),fs(16,jF,1,2,"textarea",9),ou(17,"\n "),ys(),ou(18,"\n "),ys(),ou(19,"\n "),ou(20,"\n "),_s(21,"div",10),ou(22,"\n "),_s(23,"app-button",11,12),Ls("action",function(){return sn(n),As().cancelPressed()}),ou(25),Vl(26,"translate"),ys(),ou(27,"\n "),_s(28,"app-button",13,14),Ls("action",function(){return sn(n),As().okPressed()}),ou(30),Vl(31,"translate"),ys(),ou(32,"\n "),ys(),ou(33,"\n "),ks()}if(2&e){var i=As();Pa(2),uu("\n ",Ul(3,10,i.text),"\n "),Pa(2),gs("formGroup",i.form),Pa(3),gs("ngIf",i.dropdownElements),Pa(5),gs("ngIf",i.inputLabel),Pa(2),gs("ngIf",!!i.contents),Pa(2),gs("ngIf",!i.contents),Pa(7),gs("disabled",i.working),Pa(2),uu("\n ",Ul(26,12,i.cancelButtonText),"\n "),Pa(3),gs("disabled",i.validateForm&&!i.form.valid||i.working),Pa(2),uu("\n ",Ul(31,14,i.okButtonText),"\n ")}}var BF=function(e){function t(t,n,i,r,a,o){var s=e.call(this,o)||this;return s.dialogRef=t,s.msgBarService=n,s.dialog=i,s.spendingService=r,s.walletsAndAddressesService=a,s.title="offline-transactions.sign-tx.title",s.text="offline-transactions.sign-tx.text",s.dropdownLabel="offline-transactions.sign-tx.wallet-label",s.defaultDropdownText="offline-transactions.sign-tx.select-wallet",s.inputLabel="offline-transactions.sign-tx.input-label",s.cancelButtonText="common.cancel-button",s.okButtonText="offline-transactions.sign-tx.sign-button",s.validateForm=!0,s.currentState=BR.Loading,s}return Vw(t,e),t.openDialog=function(e){var n=new bw;return n.autoFocus=!0,n.width=zp.mediumModalWidth,e.open(t,n)},t.prototype.ngOnInit=function(){var e=this;this.walletsSubscription=this.walletsAndAddressesService.allWallets.pipe(ep()).subscribe(function(t){t?(e.dropdownElements=[],t.forEach(function(t){t.isHardware||e.dropdownElements.push({name:t.label,value:t})}),e.currentState=BR.ShowingForm,setTimeout(function(){try{1===t.length&&e.form.get("dropdown").setValue(t[0])}catch(n){}})):e.currentState=BR.ErrorLoading},function(){return e.currentState=BR.ErrorLoading})},t.prototype.ngOnDestroy=function(){this.walletsSubscription.unsubscribe(),this.closeOperationSubscription(),this.msgBarService.hide()},t.prototype.cancelPressed=function(){this.dialogRef.close()},t.prototype.okPressed=function(){var e=this;this.working||(this.msgBarService.hide(),this.form.get("dropdown").value.encrypted?YA.openDialog(this.dialog,{wallet:this.form.get("dropdown").value}).componentInstance.passwordSubmit.subscribe(function(t){t.close(),e.signTransaction(t.password)}):this.signTransaction(null))},t.prototype.signTransaction=function(e){var t=this;this.working=!0,this.okButton.setLoading(),this.closeOperationSubscription(),this.operationSubscription=this.spendingService.signTransaction(this.form.get("dropdown").value,e,null,this.form.get("input").value).subscribe(function(e){t.cancelPressed(),setTimeout(function(){return t.msgBarService.showDone("offline-transactions.sign-tx.signed")}),setTimeout(function(){nF.openDialog(t.dialog,{rawTx:e,isUnsigned:!1})},500)},function(e){t.working=!1,t.okButton.resetState(),t.msgBarService.showError(e)})},t.prototype.closeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(ms(xw),ms(HC),ms(Aw),ms(oF),ms(ix),ms(TM))},t.\u0275cmp=lt({type:t,selectors:[["app-sign-raw-tx"]],features:[Jo],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[3,"isLoading","noDataText",4,"ngIf"],[4,"ngIf"],[3,"isLoading","noDataText"],[1,"modal-form-container",3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","input",4,"ngIf"],["rows","5",3,"readonly",4,"ngIf"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur",4,"ngIf"],[1,"-buttons"],[3,"disabled","action"],["cancelButton",""],[1,"primary-button",3,"disabled","action"],["okButton",""],["for","dropdown",4,"ngIf"],[1,"-select"],["formControlName","dropdown","id","dropdown",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue",4,"ngIf"],["for","dropdown"],["disabled","","hidden","",3,"ngValue"],[4,"ngFor","ngForOf"],[3,"ngValue"],["for","input"],["rows","5",3,"readonly"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,EF,1,2,"app-loading-content",1),ou(5,"\n\n "),fs(6,NF,34,16,"ng-container",2),ou(7,"\n"),ys(),ou(8,"\n")),2&e&&(gs("headline",Ul(1,5,t.title))("dialog",t.dialogRef)("disableDismiss",t.working),Pa(4),gs("ngIf",t.currentState===t.states.Loading||t.currentState===t.states.ErrorLoading),Pa(2),gs("ngIf",t.currentState===t.states.ShowingForm))},directives:[AM,fh,zR,wk,pM,gC,Ek,bk,wM,QD,Pk,Rk,dh,Xw],pipes:[oS],styles:[""]}),t}(WR);function WF(e,t){if(1&e&&bs(0,"app-loading-content",3),2&e){var n=As();gs("isLoading",n.currentState===n.states.Loading)("noDataText","offline-transactions.loading-problem")}}function VF(e,t){if(1&e&&(_s(0,"label",19),ou(1),Vl(2,"translate"),ys()),2&e){var n=As(3);Pa(1),su(Ul(2,1,n.dropdownLabel))}}function UF(e,t){if(1&e&&(_s(0,"option",20),ou(1),Vl(2,"translate"),ys()),2&e){var n=As(3);gs("ngValue",""),Pa(1),su(Ul(2,2,n.defaultDropdownText))}}function zF(e,t){if(1&e&&(ws(0),ou(1,"\n "),_s(2,"option",22),ou(3),ys(),ou(4,"\n "),ks()),2&e){var n=t.$implicit;Pa(2),gs("ngValue",n.value),Pa(1),uu("\n ",n.name,"\n ")}}function qF(e,t){if(1&e&&(ws(0),ou(1,"\n "),fs(2,zF,5,2,"ng-container",21),ou(3,"\n "),ks()),2&e){var n=As(3);Pa(2),gs("ngForOf",n.dropdownElements)}}function GF(e,t){if(1&e){var n=Ss();_s(0,"div",6),ou(1,"\n "),fs(2,VF,3,3,"label",15),ou(3,"\n "),_s(4,"div",16),ou(5,"\n "),_s(6,"select",17),Ls("blur",function(){return sn(n),As(2).validate()}),ou(7,"\n "),fs(8,UF,3,4,"option",18),ou(9,"\n "),fs(10,qF,4,1,"ng-container",2),ou(11,"\n "),ys(),ou(12,"\n "),ys(),ou(13,"\n "),ys()}if(2&e){var i=As(2);Pa(2),gs("ngIf",i.dropdownLabel),Pa(4),gs("appFormFieldError",i.dropdownErrorMsg),cs("disabled",i.working?"true":null),Pa(2),gs("ngIf",i.defaultDropdownText),Pa(2),gs("ngIf",i.dropdownElements)}}function KF(e,t){if(1&e&&(_s(0,"label",23),ou(1),Vl(2,"translate"),ys()),2&e){var n=As(2);Pa(1),su(Ul(2,1,n.inputLabel))}}function JF(e,t){if(1&e&&(_s(0,"textarea",24),ou(1),ys()),2&e){var n=As(2);gs("readonly",!0),Pa(1),su(n.contents)}}function ZF(e,t){if(1&e){var n=Ss();_s(0,"textarea",25),Ls("blur",function(){return sn(n),As(2).validate()}),ys()}if(2&e){var i=As(2);gs("appFormFieldError",i.inputErrorMsg),cs("disabled",i.working?"true":null)}}function QF(e,t){if(1&e){var n=Ss();ws(0),ou(1,"\n "),ou(2),Vl(3,"translate"),_s(4,"div",4),ou(5,"\n "),ou(6,"\n "),fs(7,GF,14,5,"div",5),ou(8,"\n "),ou(9,"\n "),_s(10,"div",6),ou(11,"\n "),fs(12,KF,3,3,"label",7),ou(13,"\n "),fs(14,JF,2,2,"textarea",8),ou(15,"\n "),fs(16,ZF,1,2,"textarea",9),ou(17,"\n "),ys(),ou(18,"\n "),ys(),ou(19,"\n "),ou(20,"\n "),_s(21,"div",10),ou(22,"\n "),_s(23,"app-button",11,12),Ls("action",function(){return sn(n),As().cancelPressed()}),ou(25),Vl(26,"translate"),ys(),ou(27,"\n "),_s(28,"app-button",13,14),Ls("action",function(){return sn(n),As().okPressed()}),ou(30),Vl(31,"translate"),ys(),ou(32,"\n "),ys(),ou(33,"\n "),ks()}if(2&e){var i=As();Pa(2),uu("\n ",Ul(3,10,i.text),"\n "),Pa(2),gs("formGroup",i.form),Pa(3),gs("ngIf",i.dropdownElements),Pa(5),gs("ngIf",i.inputLabel),Pa(2),gs("ngIf",!!i.contents),Pa(2),gs("ngIf",!i.contents),Pa(7),gs("disabled",i.working),Pa(2),uu("\n ",Ul(26,12,i.cancelButtonText),"\n "),Pa(3),gs("disabled",i.validateForm&&!i.form.valid||i.working),Pa(2),uu("\n ",Ul(31,14,i.okButtonText),"\n ")}}var XF=function(e){function t(t,n,i,r,a){var o=e.call(this,a)||this;return o.dialogRef=t,o.msgBarService=n,o.balanceAndOutputsService=i,o.spendingService=r,o.title="offline-transactions.broadcast-tx.title",o.text="offline-transactions.broadcast-tx.text",o.inputLabel="offline-transactions.broadcast-tx.input-label",o.cancelButtonText="common.cancel-button",o.okButtonText="offline-transactions.broadcast-tx.send-button",o.validateForm=!0,o.currentState=BR.ShowingForm,o}return Vw(t,e),t.openDialog=function(e){var n=new bw;return n.autoFocus=!0,n.width=zp.mediumModalWidth,e.open(t,n)},t.prototype.ngOnInit=function(){this.form.get("dropdown").setValue("dummy")},t.prototype.ngOnDestroy=function(){this.closeOperationSubscription()},t.prototype.cancelPressed=function(){this.dialogRef.close()},t.prototype.okPressed=function(){var e=this;this.working||(this.msgBarService.hide(),this.working=!0,this.okButton.setLoading(),this.closeOperationSubscription(),this.operationSubscription=this.spendingService.injectTransaction(this.form.get("input").value,null).subscribe(function(){e.balanceAndOutputsService.refreshBalance(),e.msgBarService.showDone("offline-transactions.broadcast-tx.sent"),e.cancelPressed()},function(t){e.working=!1,e.okButton.resetState(),e.msgBarService.showError(t)}))},t.prototype.closeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(ms(xw),ms(HC),ms(LO),ms(oF),ms(TM))},t.\u0275cmp=lt({type:t,selectors:[["app-broadcast-raw-tx"]],features:[Jo],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[3,"isLoading","noDataText",4,"ngIf"],[4,"ngIf"],[3,"isLoading","noDataText"],[1,"modal-form-container",3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","input",4,"ngIf"],["rows","5",3,"readonly",4,"ngIf"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur",4,"ngIf"],[1,"-buttons"],[3,"disabled","action"],["cancelButton",""],[1,"primary-button",3,"disabled","action"],["okButton",""],["for","dropdown",4,"ngIf"],[1,"-select"],["formControlName","dropdown","id","dropdown",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue",4,"ngIf"],["for","dropdown"],["disabled","","hidden","",3,"ngValue"],[4,"ngFor","ngForOf"],[3,"ngValue"],["for","input"],["rows","5",3,"readonly"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),ou(3,"\n "),fs(4,WF,1,2,"app-loading-content",1),ou(5,"\n\n "),fs(6,QF,34,16,"ng-container",2),ou(7,"\n"),ys(),ou(8,"\n")),2&e&&(gs("headline",Ul(1,5,t.title))("dialog",t.dialogRef)("disableDismiss",t.working),Pa(4),gs("ngIf",t.currentState===t.states.Loading||t.currentState===t.states.ErrorLoading),Pa(2),gs("ngIf",t.currentState===t.states.ShowingForm))},directives:[AM,fh,zR,wk,pM,gC,Ek,bk,wM,QD,Pk,Rk,dh,Xw],pipes:[oS],styles:[""]}),t}(WR),$F=function(){function e(){}return e.prototype.transform=function(e){return UA.unix(e).format("YYYY-MM-DD HH:mm")},e.\u0275fac=function(t){return new(t||e)},e.\u0275pipe=vt({name:"dateTime",type:e,pure:!0}),e}();function eH(e,t){1&e&&(_s(0,"h4"),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),su(Ul(2,1,"tx.confirm-transaction-title")))}function tH(e,t){1&e&&(_s(0,"h4"),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),su(Ul(2,1,"tx.transaction-title")))}function nH(e,t){if(1&e&&(ws(0),ou(1,"\n "),_s(2,"div",4),ou(3,"\n "),_s(4,"span"),ou(5),Vl(6,"translate"),ys(),ou(7," "),_s(8,"span"),ou(9),ys(),ou(10,"\n "),ys(),ou(11,"\n "),_s(12,"div",4),ou(13,"\n "),_s(14,"span"),ou(15),Vl(16,"translate"),ys(),ou(17," "),_s(18,"span"),ou(19),ys(),ou(20,"\n "),ys(),ou(21,"\n "),ks()),2&e){var n=As();Pa(5),su(Ul(6,4,"tx.from-small-label")),Pa(4),su(n.transaction.from),Pa(6),su(Ul(16,6,"tx.to-small-label")),Pa(4),su(n.transaction.to)}}function iH(e,t){if(1&e&&(ws(0),ou(1,"\n "),_s(2,"div",4),ou(3,"\n "),_s(4,"span"),ou(5),Vl(6,"translate"),ys(),ou(7," "),_s(8,"span"),ou(9),Vl(10,"dateTime"),ys(),ou(11,"\n "),ys(),ou(12,"\n "),_s(13,"div",4),ou(14,"\n "),_s(15,"span"),ou(16),Vl(17,"translate"),ys(),ou(18," "),_s(19,"span"),ou(20),Vl(21,"translate"),ys(),ou(22,"\n "),ys(),ou(23,"\n "),ks()),2&e){var n=As();Pa(5),su(Ul(6,4,"tx.date-small-label")),Pa(4),su(Ul(10,6,n.transaction.timestamp)),Pa(7),su(Ul(17,8,"tx.status-small-label")),Pa(4),su(Ul(21,10,n.transaction.confirmed?"tx.confirmed-transaction":"tx.pending-transaction"))}}function rH(e,t){if(1&e&&(_s(0,"div",4),ou(1,"\n "),_s(2,"span"),ou(3),Vl(4,"translate"),ys(),ou(5," "),_s(6,"span"),ou(7),ys(),ou(8,"\n "),ys()),2&e){var n=As();Pa(3),su(Ul(4,2,"tx.id-small-label")),Pa(4),su(n.transaction.id)}}function aH(e,t){if(1&e&&(_s(0,"span"),ou(1),ys()),2&e){var n=As(2);Pa(1),su(n.transaction.note)}}function oH(e,t){1&e&&(_s(0,"span",13),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),su(Ul(2,1,"tx.without-note")))}function sH(e,t){if(1&e){var n=Ss();_s(0,"mat-icon",14),Ls("click",function(){return sn(n),As(2).editNote()}),ou(1,"edit"),ys()}}function uH(e,t){if(1&e&&(_s(0,"div",4),ou(1,"\n "),_s(2,"span"),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),fs(6,aH,2,1,"span",2),ou(7,"\n "),fs(8,oH,3,3,"span",11),ou(9,"\n "),fs(10,sH,2,0,"mat-icon",12),ou(11,"\n "),ys()),2&e){var n=As();Pa(3),su(Ul(4,4,"tx.note-small-label")),Pa(3),gs("ngIf",n.transaction.note),Pa(2),gs("ngIf",!n.transaction.note),Pa(2),gs("ngIf",!n.isPreview)}}function lH(e,t){1&e&&(_s(0,"span"),ou(1,"*"),ys())}function cH(e,t){if(1&e&&(_s(0,"p",15),Vl(1,"translate"),ou(2),Vl(3,"currency"),fs(4,lH,2,0,"span",2),ou(5,"\n "),ys()),2&e){var n=As();gs("matTooltip",n.isPreview?"":Ul(1,3,"tx.current-rate-help")),Pa(2),uu("\n ",Gl(3,5,n.balanceToShow.multipliedBy(n.price).toString(),"USD","symbol","1.2-2"),""),Pa(2),gs("ngIf",!n.isPreview)}}function dH(e,t){if(1&e){var n=Ss();_s(0,"div",16),ou(1,"\n "),_s(2,"app-arrow-link",17),Ls("pressed",function(e){return sn(n),As().toggleInputsOutputs(e)}),ou(3,"\n "),ys(),ou(4,"\n "),ys()}2&e&&(Pa(2),gs("noPadding",!0)("text","tx.show-more-link"))}function hH(e,t){if(1&e&&(_s(0,"div",20),ou(1,"\n "),_s(2,"div",21),ou(3),ys(),ou(4,"\n "),_s(5,"div",22),ou(6,"\n "),_s(7,"div",23),ou(8),ys(),ou(9,"\n "),_s(10,"div",4),ou(11,"\n "),_s(12,"span"),ou(13),Vl(14,"translate"),ys(),ou(15),Vl(16,"amount"),ys(),ou(17,"\n "),_s(18,"div",4),ou(19,"\n "),_s(20,"span"),ou(21),Vl(22,"translate"),ys(),ou(23),Vl(24,"amount"),ys(),ou(25,"\n "),ys(),ou(26,"\n "),ys()),2&e){var n=t.$implicit,i=t.index;Pa(3),su(i+1),Pa(5),su(n.address),Pa(5),su(Ul(14,6,"tx.coins-small-label")),Pa(2),uu(" ",ql(16,8,n.coins,!0,"first"),"\n "),Pa(6),su(Ul(22,12,"tx.hours-small-label")),Pa(2),uu(" ",ql(24,14,n.hours,!1,"first"),"\n ")}}function fH(e,t){if(1&e&&(_s(0,"div",20),ou(1,"\n "),_s(2,"div",21),ou(3),ys(),ou(4,"\n "),_s(5,"div",22),ou(6,"\n "),_s(7,"div",23),ou(8),ys(),ou(9,"\n "),_s(10,"div",4),ou(11,"\n "),_s(12,"span"),ou(13),Vl(14,"translate"),ys(),ou(15),Vl(16,"amount"),ys(),ou(17,"\n "),_s(18,"div",4),ou(19,"\n "),_s(20,"span"),ou(21),Vl(22,"translate"),ys(),ou(23),Vl(24,"amount"),ys(),ou(25,"\n "),ys(),ou(26,"\n "),ys()),2&e){var n=t.$implicit,i=t.index;Pa(3),su(i+1),Pa(5),su(n.address),Pa(5),su(Ul(14,6,"tx.coins-small-label")),Pa(2),uu(" ",ql(16,8,n.coins,!0,"first"),"\n "),Pa(6),su(Ul(22,12,"tx.hours-small-label")),Pa(2),uu(" ",ql(24,14,n.hours,!1,"first"),"\n ")}}function pH(e,t){if(1&e&&(ws(0),ou(1,"\n "),ou(2,"\n "),_s(3,"div",18),ou(4,"\n "),_s(5,"h4"),ou(6),Vl(7,"translate"),ys(),ou(8,"\n\n "),fs(9,hH,27,18,"div",19),ou(10,"\n "),ys(),ou(11,"\n "),ou(12,"\n "),_s(13,"div",18),ou(14,"\n "),_s(15,"h4"),ou(16),Vl(17,"translate"),ys(),ou(18,"\n\n "),fs(19,fH,27,18,"div",19),ou(20,"\n "),ys(),ou(21,"\n "),ks()),2&e){var n=As();Pa(6),su(Ul(7,4,"tx.inputs-title")),Pa(3),gs("ngForOf",n.transaction.inputs),Pa(7),su(Ul(17,6,"tx.outputs-title")),Pa(3),gs("ngForOf",n.transaction.outputs)}}var mH=function(){function e(e,t){var n=this;this.priceService=e,this.dialog=t,this.showInputsOutputs=!1,this.subscription=this.priceService.price.subscribe(function(e){return n.price=e})}return Object.defineProperty(e.prototype,"hoursText",{get:function(){if(!this.isPreview){if(this.transaction.coinsMovedInternally)return"tx.hours-moved";if(this.transaction.balance.isGreaterThan(0))return"tx.hours-received"}return"tx.hours-sent"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sentOrReceivedHours",{get:function(){return this.isPreview?this.transaction.hoursToSend:this.transaction.hoursBalance},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"shouldShowIncomingIcon",{get:function(){return!this.isPreview&&this.transaction.balance.isGreaterThan(0)&&!this.transaction.coinsMovedInternally},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"balanceToShow",{get:function(){return this.isPreview?this.transaction.coinsToSend:this.transaction.balance},enumerable:!1,configurable:!0}),e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},e.prototype.toggleInputsOutputs=function(e){e.preventDefault(),this.showInputsOutputs=!this.showInputsOutputs},e.prototype.editNote=function(){var e=this;GI.openDialog(this.dialog,this.transaction).afterClosed().subscribe(function(t){(t||""===t)&&(e.transaction.note=t)})},e.\u0275fac=function(t){return new(t||e)(ms(bP),ms(Aw))},e.\u0275cmp=lt({type:e,selectors:[["app-transaction-info"]],inputs:{transaction:"transaction",isPreview:"isPreview"},decls:61,vars:32,consts:[[1,"row"],[1,"col-md-12"],[4,"ngIf"],[1,"col-md-9","-tx-meta"],[1,"-data"],["class","-data",4,"ngIf"],[1,"col-md-3","-tx-price"],[1,"-icon"],[3,"src"],[3,"matTooltip",4,"ngIf"],["class","-data -more",4,"ngIf"],["class","grey-text",4,"ngIf"],["class","edit-button image-button",3,"click",4,"ngIf"],[1,"grey-text"],[1,"edit-button","image-button",3,"click"],[3,"matTooltip"],[1,"-data","-more"],[3,"noPadding","text","pressed"],[1,"col-md-6","-margin-top"],["class","-item",4,"ngFor","ngForOf"],[1,"-item"],[1,"-number"],[1,"-info"],[1,"-address"]],template:function(e,t){1&e&&(_s(0,"div",0),ou(1,"\n "),_s(2,"div",1),ou(3,"\n "),ou(4,"\n "),fs(5,eH,3,3,"h4",2),ou(6,"\n "),fs(7,tH,3,3,"h4",2),ou(8,"\n "),_s(9,"div",0),ou(10,"\n "),ou(11,"\n "),_s(12,"div",3),ou(13,"\n "),fs(14,nH,22,8,"ng-container",2),ou(15,"\n "),fs(16,iH,24,12,"ng-container",2),ou(17,"\n "),_s(18,"div",4),ou(19,"\n "),_s(20,"span"),ou(21),Vl(22,"translate"),ys(),ou(23,"\n "),_s(24,"span"),ou(25),Vl(26,"amount"),Vl(27,"translate"),Vl(28,"amount"),Vl(29,"translate"),ys(),ou(30,"\n "),ys(),ou(31,"\n "),fs(32,rH,9,4,"div",5),ou(33,"\n "),fs(34,uH,12,6,"div",5),ou(35,"\n "),ys(),ou(36,"\n\n "),ou(37,"\n "),_s(38,"div",6),ou(39,"\n "),_s(40,"div",7),ou(41,"\n "),bs(42,"img",8),ou(43,"\n "),ys(),ou(44,"\n "),_s(45,"h4"),ou(46),Vl(47,"amount"),ys(),ou(48,"\n "),fs(49,cH,6,10,"p",9),ou(50,"\n "),ys(),ou(51,"\n "),ys(),ou(52,"\n\n "),ou(53,"\n "),fs(54,dH,5,2,"div",10),ou(55,"\n "),ys(),ou(56,"\n\n "),ou(57,"\n "),fs(58,pH,22,8,"ng-container",2),ou(59,"\n"),ys(),ou(60,"\n")),2&e&&(Pa(5),gs("ngIf",t.isPreview),Pa(2),gs("ngIf",!t.isPreview),Pa(7),gs("ngIf",t.isPreview),Pa(2),gs("ngIf",!t.isPreview),Pa(5),su(Ul(22,16,"tx.hours-small-label")),Pa(4),du("\n ",ql(26,18,t.sentOrReceivedHours,!1,"first")," ",Ul(27,22,t.hoursText),"\n |\n ",ql(28,24,t.transaction.hoursBurned,!1,"first")," ",Ul(29,28,"tx.hours-burned"),"\n "),Pa(7),gs("ngIf",!t.isPreview),Pa(2),gs("ngIf",t.transaction.note||!t.isPreview),Pa(8),gs("src","assets/img/"+(t.shouldShowIncomingIcon?"received":"sent")+"-blue.png",Ar),Pa(4),su(Ul(47,30,t.balanceToShow)),Pa(3),gs("ngIf",t.price),Pa(5),gs("ngIf",!t.showInputsOutputs),Pa(4),gs("ngIf",t.showInputsOutputs))},directives:[fh,uC,KD,GA,dh],pipes:[oS,yS,$F,Dh],styles:["h4[_ngcontent-%COMP%]{font-size:14px;margin:0 0 30px}.-item[_ngcontent-%COMP%]{display:flex;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}.-item[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{padding:10px;background:#f7f7f7;align-self:flex-start;border-radius:10px}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin-left:10px;display:flex;flex-direction:column;word-break:break-all}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{padding:10px 0;margin-bottom:5px}.-data[_ngcontent-%COMP%]{font-size:13px;display:flex}.-data[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:first-child{color:rgba(30,34,39,.5);width:70px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(2){word-break:break-word}.-data.-more[_ngcontent-%COMP%]{margin-top:20px}.edit-button[_ngcontent-%COMP%]{font-size:20px;padding-left:5px;color:#0072ff}.-tx-meta[_ngcontent-%COMP%] .-data[_ngcontent-%COMP%]{margin-bottom:10px}.-tx-price[_ngcontent-%COMP%]{text-align:center;display:flex;flex-direction:column;justify-content:center}.-tx-price[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:30px}.-tx-price[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:18px;font-weight:700;margin:10px 0 5px;word-break:break-word}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:13px;margin:0}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}.-margin-top[_ngcontent-%COMP%]{margin-top:30px}"]}),e}(),gH=["sendButton"],vH=["backButton"],_H=function(){function e(e,t,n,i,r,a){this.msgBarService=e,this.dialog=t,this.hwWalletService=n,this.translate=i,this.balanceAndOutputsService=r,this.spendingService=a,this.onBack=new Zl}return e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.sendSubscription&&this.sendSubscription.unsubscribe(),this.onBack.complete()},e.prototype.back=function(){this.onBack.emit(!1)},e.prototype.send=function(){var e=this;this.sendButton.isLoading()||(this.msgBarService.hide(),this.sendButton.resetState(),this.transaction.wallet?this.transaction.wallet.encrypted&&!this.transaction.wallet.isHardware?YA.openDialog(this.dialog,{wallet:this.transaction.wallet}).componentInstance.passwordSubmit.subscribe(function(t){e.finishSending(t)}):this.transaction.wallet.isHardware?(this.showBusy(),this.sendSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.transaction.wallet.addresses[0].address).subscribe(function(){return e.finishSending()},function(t){return e.showError(t)})):this.finishSending():nF.openDialog(this.dialog,{rawTx:this.transaction.encoded,isUnsigned:!0}).afterClosed().subscribe(function(){ID.openDialog(e.dialog,{text:"offline-transactions.copy-tx.reset-confirmation",defaultButtons:YD.YesNo}).afterClosed().subscribe(function(t){t&&e.onBack.emit(!0)})}))},e.prototype.finishSending=function(e){var t=this;this.showBusy();var n=this.transaction.note.trim();this.sendSubscription=this.spendingService.signTransaction(this.transaction.wallet,e?e.password:null,this.transaction).pipe(ue(function(i){return e&&e.close(),t.spendingService.injectTransaction(i,n)})).subscribe(function(e){n&&!e?setTimeout(function(){return t.msgBarService.showWarning(t.translate.instant("send.saving-note-error"))}):setTimeout(function(){return t.msgBarService.showDone("send.sent")}),t.balanceAndOutputsService.refreshBalance(),t.onBack.emit(!0)},function(n){e&&e.error(n),t.showError(n)})},e.prototype.showBusy=function(){this.sendButton.setLoading(),this.backButton.setDisabled()},e.prototype.showError=function(e){this.msgBarService.showError(e),this.sendButton.resetState(),this.backButton.resetState().setEnabled()},e.\u0275fac=function(t){return new(t||e)(ms(HC),ms(Aw),ms(Bw),ms(aS),ms(LO),ms(oF))},e.\u0275cmp=lt({type:e,selectors:[["app-send-preview"]],viewQuery:function(e,t){if(1&e&&(cc(gH,!0),cc(vH,!0)),2&e){var n=void 0;uc(n=fc())&&(t.sendButton=n.first),uc(n=fc())&&(t.backButton=n.first)}},inputs:{transaction:"transaction"},outputs:{onBack:"onBack"},decls:15,vars:8,consts:[[3,"transaction","isPreview"],[1,"-buttons"],[3,"action"],["backButton",""],[1,"primary-button",3,"action"],["sendButton",""]],template:function(e,t){1&e&&(bs(0,"app-transaction-info",0),ou(1,"\n\n"),_s(2,"div",1),ou(3,"\n "),_s(4,"app-button",2,3),Ls("action",function(){return t.back()}),ou(6),Vl(7,"translate"),ys(),ou(8,"\n "),_s(9,"app-button",4,5),Ls("action",function(){return t.send()}),ou(11),Vl(12,"translate"),ys(),ou(13,"\n"),ys(),ou(14,"\n")),2&e&&(gs("transaction",t.transaction)("isPreview",!0),Pa(6),su(Ul(7,4,"common.back-button")),Pa(5),uu("\n ",Ul(12,6,"send."+(t.transaction&&!t.transaction.wallet?"show":"send")+"-button"),"\n "))},directives:[mH,gC],pipes:[oS],styles:[".-buttons[_ngcontent-%COMP%]{margin-top:10px;text-align:center}"]}),e}();function yH(e,t){if(1&e){var n=Ss();_s(0,"app-send-coins-form",9),Ls("onFormSubmitted",function(e){return sn(n),As().onFormSubmitted(e)}),ys()}2&e&&gs("formData",As().formData)("showSimpleForm",!0)}function bH(e,t){if(1&e){var n=Ss();_s(0,"app-send-coins-form",9),Ls("onFormSubmitted",function(e){return sn(n),As().onFormSubmitted(e)}),ys()}2&e&&gs("formData",As().formData)("showSimpleForm",!1)}function wH(e,t){if(1&e){var n=Ss();_s(0,"app-send-preview",10),Ls("onBack",function(e){return sn(n),As().onBack(e)}),ys()}2&e&&gs("transaction",As().formData.transaction)}var kH=function(){function e(e,t,n){var i=this;this.navBarSwitchService=e,this.changeDetector=t,this.dialog=n,this.showForm=!0,this.activeForms=KP,this.navBarSwitchService.showSwitch("send.simple-form-button","send.advanced-form-button",KP.LeftButton),this.subscription=e.activeComponent.subscribe(function(e){i.activeForm!==e&&(i.activeForm=e,i.formData=null)})}return e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe(),this.navBarSwitchService.hideSwitch()},e.prototype.onFormSubmitted=function(e){this.formData=e,this.showForm=!1},e.prototype.onBack=function(e){e&&(this.formData=null),this.showForm=!0,this.changeDetector.detectChanges()},e.prototype.signTransaction=function(){BF.openDialog(this.dialog)},e.prototype.broadcastTransaction=function(){XF.openDialog(this.dialog)},e.\u0275fac=function(t){return new(t||e)(ms(ZP),ms(ul),ms(Aw))},e.\u0275cmp=lt({type:e,selectors:[["app-send-skycoin"]],decls:35,vars:12,consts:[[3,"headline"],[1,"container"],[1,"paper"],[3,"formData","showSimpleForm","onFormSubmitted",4,"ngIf"],[3,"transaction","onBack",4,"ngIf"],[1,"-links"],[1,"link",3,"click"],[1,"separator"],[1,"final-element"],[3,"formData","showSimpleForm","onFormSubmitted"],[3,"transaction","onBack"]],template:function(e,t){1&e&&(bs(0,"app-header",0),Vl(1,"translate"),ou(2,"\n"),_s(3,"div",1),ou(4,"\n "),_s(5,"div",2),ou(6,"\n "),ou(7,"\n "),fs(8,yH,1,2,"app-send-coins-form",3),ou(9,"\n "),fs(10,bH,1,2,"app-send-coins-form",3),ou(11,"\n "),ou(12,"\n "),fs(13,wH,1,1,"app-send-preview",4),ou(14,"\n "),ys(),ou(15,"\n "),ou(16,"\n "),_s(17,"div",5),ou(18,"\n "),_s(19,"span",6),Ls("click",function(){return t.signTransaction()}),ou(20),Vl(21,"translate"),ys(),ou(22,"\n "),_s(23,"span",7),ou(24," / "),ys(),ou(25,"\n "),_s(26,"span",6),Ls("click",function(){return t.broadcastTransaction()}),ou(27),Vl(28,"translate"),ys(),ou(29,"\n "),ys(),ou(30,"\n "),ou(31,"\n "),bs(32,"div",8),ou(33,"\n"),ys(),ou(34,"\n")),2&e&&(gs("headline",Ul(1,6,"send.title-and-button")),Pa(8),gs("ngIf",t.showForm&&t.activeForm===t.activeForms.LeftButton),Pa(2),gs("ngIf",t.showForm&&t.activeForm===t.activeForms.RightButton),Pa(3),gs("ngIf",!t.showForm),Pa(7),su(Ul(21,8,"offline-transactions.sign-tx.title")),Pa(7),su(Ul(28,10,"offline-transactions.broadcast-tx.title")))},directives:[xA,fh,DF,_H],pipes:[oS],styles:[".-links[_ngcontent-%COMP%]{text-align:center;font-size:13px;margin-top:-15px;margin-bottom:15px}.-links[_ngcontent-%COMP%] .separator[_ngcontent-%COMP%]{margin:0 10px}"]}),e}();function MH(e,t){1&e&&bs(0,"app-loading-content",4),2&e&&gs("isLoading",!As().transactions)}function SH(e,t){if(1&e&&(_s(0,"div",13),ou(1,"\n "),_s(2,"div",14),ou(3),ys(),ou(4,"\n "),_s(5,"div",9),ou(6),Vl(7,"amount"),ys(),ou(8,"\n "),_s(9,"div",9),ou(10),Vl(11,"amount"),ys(),ou(12,"\n "),_s(13,"div",15),ou(14),Vl(15,"dateTime"),ys(),ou(16,"\n "),ys()),2&e){var n=t.$implicit;Pa(3),su(n.id),Pa(3),su(ql(7,4,n.coins,!0,"first")),Pa(4),su(ql(11,8,n.hours,!1,"first")),Pa(4),su(Ul(15,12,n.timestamp))}}function CH(e,t){if(1&e&&(_s(0,"div",5),ou(1,"\n "),_s(2,"div",6),ou(3,"\n "),_s(4,"div",7),ou(5,"\n "),_s(6,"div",8),ou(7),Vl(8,"translate"),ys(),ou(9,"\n "),_s(10,"div",9),ou(11),Vl(12,"commonText"),ys(),ou(13,"\n "),_s(14,"div",9),ou(15),Vl(16,"commonText"),ys(),ou(17,"\n "),_s(18,"div",10),ou(19),Vl(20,"translate"),ys(),ou(21,"\n "),ys(),ou(22,"\n "),_s(23,"div",11),ou(24,"\n "),fs(25,SH,17,14,"div",12),ou(26,"\n "),ys(),ou(27,"\n "),ys(),ou(28,"\n "),ys()),2&e){var n=As();Pa(7),su(Ul(8,5,"pending-txs.txid-table-label")),Pa(4),su(Ul(12,7,"coin")),Pa(4),su(Ul(16,9,"hours")),Pa(4),su(Ul(20,11,"pending-txs.timestamp-table-label")),Pa(6),gs("ngForOf",n.transactions)}}var xH=function(){function e(e,t){var n=this;this.navBarSwitchService=e,this.historyService=t,this.transactions=null,this.updatePeriod=1e4,this.errorUpdatePeriod=2e3,this.navbarSubscription=this.navBarSwitchService.activeComponent.subscribe(function(e){n.selectedNavbarOption=e,n.transactions=null,n.startDataRefreshSubscription(0)})}return e.prototype.ngOnInit=function(){this.navBarSwitchService.showSwitch("pending-txs.my-transactions-button","pending-txs.all-transactions-button")},e.prototype.ngOnDestroy=function(){this.navbarSubscription.unsubscribe(),this.removeTransactionsSubscription(),this.navBarSwitchService.hideSwitch()},e.prototype.startDataRefreshSubscription=function(e){var t=this;this.removeTransactionsSubscription(),this.transactionsSubscription=xf(0).pipe(Of(e),ue(function(){return t.historyService.getPendingTransactions()})).subscribe(function(e){t.transactions=t.selectedNavbarOption===KP.LeftButton?e.user:e.all,t.startDataRefreshSubscription(t.updatePeriod)},function(){return t.startDataRefreshSubscription(t.errorUpdatePeriod)})},e.prototype.removeTransactionsSubscription=function(){this.transactionsSubscription&&this.transactionsSubscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(ms(ZP),ms(zA))},e.\u0275cmp=lt({type:e,selectors:[["app-pending-transactions"]],decls:13,vars:5,consts:[[3,"headline"],["noDataText","pending-txs.none",3,"isLoading",4,"ngIf"],["class","container",4,"ngIf"],[1,"final-element"],["noDataText","pending-txs.none",3,"isLoading"],[1,"container"],[1,"-table"],[1,"-headers"],[1,"-flex-fill"],[1,"-width-150","text-right"],[1,"-width-150"],[1,"-body"],["class","-row",4,"ngFor","ngForOf"],[1,"-row"],[1,"-flex-fill","break-all"],[1,"-width-150","grey-text"]],template:function(e,t){1&e&&(_s(0,"div"),ou(1,"\n "),bs(2,"app-header",0),Vl(3,"translate"),ou(4,"\n\n "),fs(5,MH,1,1,"app-loading-content",1),ou(6,"\n\n "),fs(7,CH,29,13,"div",2),ou(8,"\n "),ou(9,"\n "),bs(10,"div",3),ou(11,"\n"),ys(),ou(12,"\n")),2&e&&(Pa(2),gs("headline",Ul(3,3,"pending-txs.title")),Pa(3),gs("ngIf",!t.transactions||0===t.transactions.length),Pa(2),gs("ngIf",t.transactions&&t.transactions.length>0))},directives:[xA,fh,zR,dh],pipes:[oS,pR,yS,$F],styles:[""]}),e}();function LH(e,t){1&e&&bs(0,"app-loading-content",4),2&e&&gs("isLoading",!As().wallets)}function TH(e,t){if(1&e&&(_s(0,"div",13),ou(1,"\n "),_s(2,"div",18),ou(3),ys(),ou(4,"\n "),_s(5,"div",10),ou(6),Vl(7,"amount"),ys(),ou(8,"\n "),_s(9,"div",19),ou(10),Vl(11,"amount"),ys(),ou(12,"\n "),ys()),2&e){var n=t.$implicit;Pa(3),su(n.hash),Pa(3),su(ql(7,3,n.coins,!0,"first")),Pa(4),su(ql(11,7,n.hours,!1,"first"))}}function DH(e,t){if(1&e&&(ws(0),ou(1,"\n "),_s(2,"div",13),ou(3,"\n "),_s(4,"div",14),ou(5,"\n "),bs(6,"app-qr-code-button",15),ou(7,"\n "),_s(8,"span",16),ou(9),ys(),ou(10,"\n "),ys(),ou(11,"\n "),ys(),ou(12,"\n "),fs(13,TH,13,11,"div",17),ou(14,"\n "),ks()),2&e){var n=t.$implicit;Pa(6),gs("address",n.address),Pa(3),su(n.address),Pa(4),gs("ngForOf",n.outputs)}}function OH(e,t){if(1&e&&(_s(0,"div",7),ou(1,"\n "),_s(2,"div",8),ou(3,"\n "),_s(4,"div",9),ou(5),ys(),ou(6,"\n "),_s(7,"div",10),ou(8),Vl(9,"commonText"),ys(),ou(10,"\n "),_s(11,"div",10),ou(12),Vl(13,"commonText"),ys(),ou(14,"\n "),ys(),ou(15,"\n "),_s(16,"div",11),ou(17,"\n "),fs(18,DH,15,3,"ng-container",12),ou(19,"\n "),ys(),ou(20,"\n "),ys()),2&e){var n=t.$implicit;Pa(4),cs("title",n.label),Pa(1),su(n.label),Pa(3),su(Ul(9,5,"coin")),Pa(4),su(Ul(13,7,"hours")),Pa(6),gs("ngForOf",n.addresses)}}function EH(e,t){if(1&e&&(_s(0,"div",5),ou(1,"\n "),fs(2,OH,21,9,"div",6),ou(3,"\n "),ys()),2&e){var n=As();Pa(2),gs("ngForOf",n.wallets)}}var PH=function(){function e(e,t){var n=this;this.balanceAndOutputsService=t,e.queryParams.subscribe(function(e){n.wallets=null,n.loadData(e)})}return e.prototype.ngOnDestroy=function(){this.removeOutputsSubscription()},e.prototype.loadData=function(e){var t=this,n=e.addr;this.removeOutputsSubscription(),this.outputsSubscription=this.balanceAndOutputsService.outputsWithWallets.subscribe(function(e){t.wallets=e.map(function(e){return e.addresses=e.addresses.filter(function(e){if(e.outputs.length>0)return!n||e.address===n}),e}).filter(function(e){return e.addresses.length>0})})},e.prototype.removeOutputsSubscription=function(){this.outputsSubscription&&this.outputsSubscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(ms(fL),ms(LO))},e.\u0275cmp=lt({type:e,selectors:[["app-outputs"]],decls:13,vars:5,consts:[[3,"headline"],["noDataText","outputs.error-no-outputs",3,"isLoading",4,"ngIf"],["class","container",4,"ngIf"],[1,"final-element"],["noDataText","outputs.error-no-outputs",3,"isLoading"],[1,"container"],["class","-table",4,"ngFor","ngForOf"],[1,"-table"],[1,"-headers"],[1,"-flex-fill","text-truncate"],[1,"-width-150","text-right"],[1,"-body"],[4,"ngFor","ngForOf"],[1,"-row"],[1,"-flex-fill","grey-text","text-truncate"],[3,"address"],[1,"address"],["class","-row",4,"ngFor","ngForOf"],[1,"-flex-fill","-hash"],[1,"-width-150","text-right","grey-text"]],template:function(e,t){1&e&&(_s(0,"div"),ou(1,"\n "),bs(2,"app-header",0),Vl(3,"translate"),ou(4,"\n\n "),fs(5,LH,1,1,"app-loading-content",1),ou(6,"\n\n "),fs(7,EH,4,1,"div",2),ou(8,"\n "),ou(9,"\n "),bs(10,"div",3),ou(11,"\n"),ys(),ou(12,"\n")),2&e&&(Pa(2),gs("headline",Ul(3,3,"outputs.title")),Pa(3),gs("ngIf",!t.wallets||0===t.wallets.length||0===t.wallets[0].addresses[0].outputs.length),Pa(2),gs("ngIf",t.wallets&&t.wallets.length>0))},directives:[xA,fh,zR,dh,iY],pipes:[oS,pR,yS],styles:[".-hash[_ngcontent-%COMP%]{margin-left:27px;word-break:break-all}app-qr-code-button[_ngcontent-%COMP%]{margin-right:10px}.address[_ngcontent-%COMP%], app-qr-code-button[_ngcontent-%COMP%]{vertical-align:middle}"]}),e}();function AH(e,t){1&e&&bs(0,"app-loading-content")}var YH=function(e){return{coinName:e}},IH=function(e){return{coinHoursName:e}};function RH(e,t){if(1&e&&(_s(0,"div",4),ou(1,"\n "),_s(2,"div",5),ou(3,"\n "),ou(4,"\n "),_s(5,"div",6),ou(6,"\n "),_s(7,"div",7),ou(8,"\n "),_s(9,"div",8),ou(10,"\n "),_s(11,"div",9),ou(12),Vl(13,"translate"),ys(),ou(14,"\n "),_s(15,"div",10),ou(16),Vl(17,"number"),ys(),ou(18,"\n "),ys(),ou(19,"\n "),_s(20,"div",8),ou(21,"\n "),_s(22,"div",9),ou(23),Vl(24,"translate"),ys(),ou(25,"\n "),_s(26,"div",10),ou(27),Vl(28,"dateTime"),ys(),ou(29,"\n "),ys(),ou(30,"\n "),_s(31,"div",8),ou(32,"\n "),_s(33,"div",9),ou(34),Vl(35,"translate"),ys(),ou(36,"\n "),_s(37,"div",10),ou(38),ys(),ou(39,"\n "),ys(),ou(40,"\n "),ys(),ou(41,"\n "),ys(),ou(42,"\n "),ou(43,"\n "),_s(44,"div",11),ou(45,"\n "),_s(46,"div",7),ou(47,"\n "),_s(48,"div",12),ou(49,"\n "),_s(50,"div",13),ou(51,"\n "),_s(52,"div",8),ou(53,"\n "),_s(54,"div",9),ou(55),Vl(56,"translate"),ys(),ou(57,"\n "),_s(58,"div",10),ou(59),Vl(60,"amount"),ys(),ou(61,"\n "),ys(),ou(62,"\n "),_s(63,"div",8),ou(64,"\n "),_s(65,"div",9),ou(66),Vl(67,"translate"),ys(),ou(68,"\n "),_s(69,"div",10),ou(70),Vl(71,"amount"),ys(),ou(72,"\n "),ys(),ou(73,"\n "),ys(),ou(74,"\n "),_s(75,"div",13),ou(76,"\n "),_s(77,"div",8),ou(78,"\n "),_s(79,"div",9),ou(80),Vl(81,"translate"),ys(),ou(82,"\n "),_s(83,"div",10),ou(84),Vl(85,"amount"),ys(),ou(86,"\n "),ys(),ou(87,"\n "),_s(88,"div",8),ou(89,"\n "),_s(90,"div",9),ou(91),Vl(92,"translate"),ys(),ou(93,"\n "),_s(94,"div",10),ou(95),Vl(96,"amount"),ys(),ou(97,"\n "),ys(),ou(98,"\n "),ys(),ou(99,"\n "),ys(),ou(100,"\n "),ys(),ou(101,"\n "),ys(),ou(102,"\n "),ys(),ou(103,"\n "),ys()),2&e){var n=As();Pa(12),su(Ul(13,14,"blockchain.blocks-label")),Pa(4),su(Ul(17,16,n.block.seq)),Pa(7),su(Ul(24,18,"blockchain.time-label")),Pa(4),su(Ul(28,20,n.block.timestamp)),Pa(7),su(Ul(35,22,"blockchain.hash-label")),Pa(4),su(n.block.hash),Pa(17),su(zl(56,24,"blockchain.current-supply-label",Rl(52,YH,n.appService.coinName))),Pa(4),su(ql(60,27,n.coinSupply.currentSupply,!0,"first")),Pa(7),su(zl(67,31,"blockchain.total-supply-label",Rl(54,YH,n.appService.coinName))),Pa(4),su(ql(71,34,n.coinSupply.totalSupply,!0,"first")),Pa(10),su(zl(81,38,"blockchain.current-coinhour-supply-label",Rl(56,IH,n.appService.hoursName))),Pa(4),su(ql(85,41,n.coinSupply.currentCoinhourSupply,!1,"first")),Pa(7),su(zl(92,45,"blockchain.total-coinhour-supply-label",Rl(58,IH,n.appService.hoursName))),Pa(4),su(ql(96,48,n.coinSupply.totalCoinhourSupply,!1,"first"))}}var FH=function(){function e(e,t){this.appService=e,this.blockchainService=t,this.updatePeriod=5e3,this.errorUpdatePeriod=2e3}return e.prototype.ngOnInit=function(){this.startDataRefreshSubscription(0)},e.prototype.startDataRefreshSubscription=function(e){var t=this;this.removeOperationSubscription(),this.operationSubscription=xf(0).pipe(Of(e),ue(function(){return t.blockchainService.getLastBlock()}),ue(function(e){return t.block=e,t.blockchainService.getCoinSupply()})).subscribe(function(e){t.coinSupply=e,t.startDataRefreshSubscription(t.updatePeriod)},function(){return t.startDataRefreshSubscription(t.errorUpdatePeriod)})},e.prototype.ngOnDestroy=function(){this.removeOperationSubscription()},e.prototype.removeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(ms(qp),ms(TO))},e.\u0275cmp=lt({type:e,selectors:[["app-blockchain"]],decls:13,vars:5,consts:[[3,"headline"],[4,"ngIf"],["class","container",4,"ngIf"],[1,"final-element"],[1,"container"],[1,"row","-wrapper"],[1,"col-md-6","pl-0"],[1,"paper"],[1,"-item"],[1,"-key"],[1,"break-all"],[1,"col-md-6","pr-0"],[1,"row"],[1,"col-md-6"]],template:function(e,t){1&e&&(_s(0,"div"),ou(1,"\n "),bs(2,"app-header",0),Vl(3,"translate"),ou(4,"\n\n "),fs(5,AH,1,0,"app-loading-content",1),ou(6,"\n\n "),fs(7,RH,104,60,"div",2),ou(8,"\n "),ou(9,"\n "),bs(10,"div",3),ou(11,"\n"),ys(),ou(12,"\n")),2&e&&(Pa(2),gs("headline",Ul(3,3,"blockchain.title")),Pa(3),gs("ngIf",!(t.block&&t.coinSupply)),Pa(2),gs("ngIf",t.block&&t.coinSupply))},directives:[xA,fh,zR],pipes:[oS,Lh,$F,yS],styles:[".-wrapper[_ngcontent-%COMP%]{margin:30px}.paper[_ngcontent-%COMP%]{margin:0}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}"]}),e}(),HH=function(){function e(e,t){this.data=e,this.dialogRef=t}return e.openDialog=function(t,n){var i=new bw;return i.data=n,i.autoFocus=!0,i.width=zp.mediumModalWidth,t.open(e,i)},e.\u0275fac=function(t){return new(t||e)(ms(Tw),ms(xw))},e.\u0275cmp=lt({type:e,selectors:[["app-seed-modal"]],decls:21,vars:11,consts:[[3,"headline","dialog"],[1,"form-field"],["for","seed"],["id","seed","readonly",""],[1,"-buttons"],[1,"primary-button",3,"action"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),_s(3,"div",1),ou(4,"\n "),_s(5,"label",2),ou(6),Vl(7,"translate"),ys(),ou(8,"\n "),_s(9,"textarea",3),ou(10),ys(),ou(11,"\n "),ys(),ou(12,"\n "),_s(13,"div",4),ou(14,"\n "),_s(15,"app-button",5),Ls("action",function(){return t.dialogRef.close()}),ou(16),Vl(17,"translate"),ys(),ou(18,"\n "),ys(),ou(19,"\n"),ys(),ou(20,"\n")),2&e&&(gs("headline",Ul(1,5,"backup.seed-modal-window.title"))("dialog",t.dialogRef),Pa(6),su(Ul(7,7,"backup.seed-modal-window.seed-label")),Pa(4),su(t.data),Pa(6),uu("\n ",Ul(17,9,"common.close-button"),"\n "))},directives:[AM,gC],pipes:[oS],styles:[""]}),e}();function jH(e,t){1&e&&bs(0,"app-loading-content",9),2&e&&gs("isLoading",!1)}function NH(e,t){if(1&e){var n=Ss();_s(0,"div",23),Ls("click",function(){sn(n);var e=As().$implicit;return As(2).showSeed(e)}),ou(1),Vl(2,"translate"),ys()}2&e&&(Pa(1),su(Ul(2,1,"backup.show-seed-button")))}function BH(e,t){1&e&&(_s(0,"mat-icon",25),Vl(1,"translate"),ou(2,"help"),ys()),2&e&&gs("matTooltip",Ul(1,1,"backup.unencrypted-info"))}function WH(e,t){1&e&&(_s(0,"mat-icon",25),Vl(1,"translate"),ou(2,"help"),ys()),2&e&&gs("matTooltip",Ul(1,1,"backup.hw-wallet-info"))}function VH(e,t){if(1&e&&(_s(0,"div"),ou(1,"\n "),fs(2,BH,3,3,"mat-icon",24),ou(3,"\n "),fs(4,WH,3,3,"mat-icon",24),ou(5),Vl(6,"translate"),ys()),2&e){var n=As().$implicit;Pa(2),gs("ngIf",!n.encrypted&&!n.isHardware),Pa(2),gs("ngIf",n.isHardware),Pa(1),uu("\n ",Ul(6,3,"backup.show-seed-button"),"\n ")}}function UH(e,t){if(1&e){var n=Ss();_s(0,"div",17),ou(1,"\n "),_s(2,"div",18),ou(3),ys(),ou(4,"\n "),_s(5,"div",13),ou(6),ys(),ou(7,"\n "),ou(8,"\n "),_s(9,"div",19),ou(10,"\n "),_s(11,"div",20),Ls("click",function(){sn(n);var e=t.$implicit;return As(2).saveAddresses(e)}),ou(12),Vl(13,"translate"),ys(),ou(14,"\n "),fs(15,NH,3,3,"div",21),ou(16,"\n "),fs(17,VH,7,5,"div",22),ou(18,"\n "),ys(),ou(19,"\n "),ys()}if(2&e){var i=t.$implicit;Pa(2),cs("title",i.label),Pa(1),su(i.label),Pa(3),su(i.id),Pa(6),su(Ul(13,6,"backup.save-addresses-button")),Pa(3),gs("ngIf",i.encrypted&&!i.isHardware),Pa(2),gs("ngIf",!i.encrypted||i.isHardware)}}function zH(e,t){if(1&e&&(_s(0,"div",10),ou(1,"\n "),_s(2,"div",11),ou(3,"\n "),_s(4,"div",12),ou(5),Vl(6,"translate"),ys(),ou(7,"\n "),_s(8,"div",13),ou(9),Vl(10,"translate"),ys(),ou(11,"\n "),bs(12,"div",14),ou(13,"\n "),ys(),ou(14,"\n "),_s(15,"div",15),ou(16,"\n "),fs(17,UH,20,8,"div",16),ou(18,"\n "),ys(),ou(19,"\n "),ys()),2&e){var n=As();Pa(5),su(Ul(6,3,"backup.wallet-table-label")),Pa(4),su(Ul(10,5,"backup.filename-table-label")),Pa(8),gs("ngForOf",n.wallets)}}var qH=function(){function e(e,t,n,i){this.dialog=e,this.walletsAndAddressesService=t,this.softwareWalletService=n,this.msgBarService=i,this.wallets=[]}return e.prototype.ngOnInit=function(){var e=this;this.folderSubscription=this.walletsAndAddressesService.folder().subscribe(function(t){e.folder=t},function(t){e.folder="?",e.msgBarService.showError(t)}),this.walletSubscription=this.walletsAndAddressesService.allWallets.subscribe(function(t){e.wallets=t})},e.prototype.ngOnDestroy=function(){this.folderSubscription.unsubscribe(),this.walletSubscription.unsubscribe()},e.prototype.saveAddresses=function(e){var t="";e.addresses.forEach(function(e){t+=e.address+"\n"}),t=t.substr(0,t.length-1);var n=new Blob([t],{type:"text/csv;charset=utf-8;"}),i=document.createElement("a");if(void 0!==i.download){var r=URL.createObjectURL(n);i.setAttribute("href",r),i.setAttribute("download",e.label+".csv"),i.style.visibility="hidden",document.body.appendChild(i),i.click(),document.body.removeChild(i)}else this.msgBarService.showError("backup.not-compatible-error")},e.prototype.showSeed=function(e){var t=this;YA.openDialog(this.dialog,{wallet:e}).componentInstance.passwordSubmit.subscribe(function(n){t.softwareWalletService.getWalletSeed(e,n.password).subscribe(function(e){n.close(),HH.openDialog(t.dialog,e)},function(e){return n.error(e)})})},e.\u0275fac=function(t){return new(t||e)(ms(Aw),ms(ix),ms(NO),ms(HC))},e.\u0275cmp=lt({type:e,selectors:[["app-backup"]],decls:35,vars:15,consts:[[3,"headline"],[1,"container"],[1,"paper","small-padding","mb-0"],[1,"mt-0"],[1,"grey-text","mb-0"],[3,"innerHtml"],["noDataText","backup.no-wallets",3,"isLoading",4,"ngIf"],["class","-table",4,"ngIf"],[1,"final-element"],["noDataText","backup.no-wallets",3,"isLoading"],[1,"-table"],[1,"-headers"],[1,"-width-250"],[1,"-width-150"],[1,"-flex-fill"],[1,"-body"],["class","-row",4,"ngFor","ngForOf"],[1,"-row"],[1,"-width-250","text-truncate"],[1,"-flex-fill","text-right"],[1,"link","address-link",3,"click"],["class","link",3,"click",4,"ngIf"],[4,"ngIf"],[1,"link",3,"click"],["class","help-icon",3,"matTooltip",4,"ngIf"],[1,"help-icon",3,"matTooltip"]],template:function(e,t){1&e&&(_s(0,"div"),ou(1,"\n "),bs(2,"app-header",0),Vl(3,"translate"),ou(4,"\n\n "),ou(5,"\n "),_s(6,"div",1),ou(7,"\n "),_s(8,"div",2),ou(9,"\n "),_s(10,"p",3),ou(11),Vl(12,"translate"),ys(),ou(13,"\n "),_s(14,"p"),ou(15),Vl(16,"translate"),ys(),ou(17,"\n "),_s(18,"p",4),ou(19,"\n "),bs(20,"small",5),Vl(21,"translate"),ou(22,"\n "),ys(),ou(23,"\n "),ys(),ou(24,"\n\n "),fs(25,jH,1,1,"app-loading-content",6),ou(26,"\n\n "),ou(27,"\n "),fs(28,zH,20,7,"div",7),ou(29,"\n "),ys(),ou(30,"\n "),ou(31,"\n "),bs(32,"div",8),ou(33,"\n"),ys(),ou(34,"\n")),2&e&&(Pa(2),gs("headline",Ul(3,7,"backup.title")),Pa(9),lu("",Ul(12,9,"backup.wallet-directory")," ",t.folder,""),Pa(4),su(Ul(16,11,"backup.seed-warning")),Pa(5),gs("innerHtml",Ul(21,13,"backup.desc"),Pr),Pa(5),gs("ngIf",0===t.wallets.length),Pa(3),gs("ngIf",t.wallets.length>0))},directives:[xA,fh,zR,dh,uC,KD],pipes:[oS],styles:[".address-link[_ngcontent-%COMP%]{margin-bottom:2px}"]}),e}(),GH=function(){function e(e){this.translateService=e}return e.prototype.transform=function(e){var t=UA().unix()-e;return t<60?this.translateService.instant("time-from-now.few-seconds"):t<120?this.translateService.instant("time-from-now.minute"):t<3600?this.translateService.instant("time-from-now.minutes",{time:Math.floor(t/60)}):t<7200?this.translateService.instant("time-from-now.hour"):t<86400?this.translateService.instant("time-from-now.hours",{time:Math.floor(t/3600)}):t<172800?this.translateService.instant("time-from-now.day"):this.translateService.instant("time-from-now.days",{time:Math.floor(t/86400)})},e.\u0275fac=function(t){return new(t||e)(ms(aS))},e.\u0275pipe=vt({name:"dateFromNow",type:e,pure:!1}),e}();function KH(e,t){1&e&&bs(0,"app-loading-content",4),2&e&&gs("isLoading",!As().peers)}function JH(e,t){1&e&&(bs(0,"img",27),Vl(1,"translate")),2&e&&gs("matTooltip",Ul(1,1,"network.out-help"))}function ZH(e,t){1&e&&(bs(0,"img",28),Vl(1,"translate")),2&e&&gs("matTooltip",Ul(1,1,"network.in-help"))}function QH(e,t){if(1&e&&(_s(0,"div",16),ou(1,"\n "),_s(2,"div",17),ou(3,"\n "),fs(4,JH,2,3,"img",18),ou(5,"\n "),fs(6,ZH,2,3,"img",19),ou(7,"\n "),ys(),ou(8,"\n "),_s(9,"div",20),ou(10),_s(11,"span",21),ou(12),ys(),ou(13,"\n "),ys(),ou(14,"\n "),_s(15,"div",22),ou(16),Vl(17,"translate"),ys(),ou(18,"\n "),_s(19,"div",23),ou(20),ys(),ou(21,"\n "),_s(22,"div",24),ou(23,"\n "),_s(24,"div",25),ou(25,"\n "),_s(26,"mat-icon",26),Vl(27,"translate"),ou(28,"keyboard_arrow_up"),ys(),ou(29),Vl(30,"dateFromNow"),ys(),ou(31,"\n "),_s(32,"div",25),ou(33,"\n "),_s(34,"mat-icon",26),Vl(35,"translate"),ou(36,"keyboard_arrow_down"),ys(),ou(37),Vl(38,"dateFromNow"),ys(),ou(39,"\n "),ys(),ou(40,"\n "),ys()),2&e){var n=t.$implicit;Pa(4),gs("ngIf",n.outgoing),Pa(2),gs("ngIf",!n.outgoing),Pa(4),uu("\n ",n.address.split(":")[0],""),Pa(2),uu(":",n.listenPort,""),Pa(4),su(Ul(17,10,"network.sources."+n.source)),Pa(4),su(n.height),Pa(6),gs("matTooltip",Ul(27,12,"network.last-sent-help")),Pa(3),uu("\n ",Ul(30,14,n.lastSent),"\n "),Pa(5),gs("matTooltip",Ul(35,16,"network.last-received-help")),Pa(3),uu("\n ",Ul(38,18,n.lastReceived),"\n ")}}function XH(e,t){if(1&e&&(_s(0,"div",5),ou(1,"\n "),_s(2,"div",6),ou(3,"\n "),_s(4,"div",7),ou(5,"\n "),bs(6,"div",8),ou(7,"\n "),_s(8,"div",9),ou(9),Vl(10,"translate"),ys(),ou(11,"\n "),_s(12,"div",10),ou(13),Vl(14,"translate"),ys(),ou(15,"\n "),_s(16,"div",11),ou(17),Vl(18,"translate"),ys(),ou(19,"\n "),_s(20,"div",12),ou(21),Vl(22,"translate"),ys(),ou(23,"\n "),_s(24,"div",13),ou(25),Vl(26,"translate"),ys(),ou(27,"\n "),ys(),ou(28,"\n "),_s(29,"div",14),ou(30,"\n "),fs(31,QH,41,20,"div",15),ou(32,"\n "),ys(),ou(33,"\n "),ys(),ou(34,"\n "),ys()),2&e){var n=As();Pa(9),su(Ul(10,6,"network.peer-small-table-label")),Pa(4),su(Ul(14,8,"network.source-small-table-label")),Pa(4),su(Ul(18,10,"network.block-height-small-table-label")),Pa(4),su(Ul(22,12,"network.block-height-short-small-table-label")),Pa(4),su(Ul(26,14,"network.last-seen-small-table-label")),Pa(6),gs("ngForOf",n.peers)}}var $H=function(){function e(e){this.networkService=e}return e.prototype.ngOnInit=function(){var e=this;this.subscription=this.networkService.connections().subscribe(function(t){return e.peers=t})},e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(ms(_P))},e.\u0275cmp=lt({type:e,selectors:[["app-network"]],decls:13,vars:5,consts:[[3,"headline"],["noDataText","network.error-no-connections",3,"isLoading",4,"ngIf"],["class","container",4,"ngIf"],[1,"final-element"],["noDataText","network.error-no-connections",3,"isLoading"],[1,"container"],[1,"-table"],[1,"-headers"],[1,"-direction-cell"],[1,"-address-cell"],[1,"-flex-fill"],[1,"d-none","d-lg-block","-block-cell"],[1,"d-lg-none","-block-cell"],[1,"-last-seen-cell"],[1,"-body"],["class","-row",4,"ngFor","ngForOf"],[1,"-row"],[1,"-direction-cell","-direction-container"],["src","assets/img/sent-blue.png",3,"matTooltip",4,"ngIf"],["src","assets/img/received-blue.png",3,"matTooltip",4,"ngIf"],[1,"-address-cell","break-all"],[1,"grey-text"],[1,"-flex-fill","grey-text"],[1,"-block-cell","break-all"],[1,"-last-seen-cell","-last-seen-container","grey-text"],[1,"text-truncate"],[3,"matTooltip"],["src","assets/img/sent-blue.png",3,"matTooltip"],["src","assets/img/received-blue.png",3,"matTooltip"]],template:function(e,t){1&e&&(_s(0,"div"),ou(1,"\n "),bs(2,"app-header",0),Vl(3,"translate"),ou(4,"\n\n "),fs(5,KH,1,1,"app-loading-content",1),ou(6,"\n\n "),fs(7,XH,35,16,"div",2),ou(8,"\n "),ou(9,"\n "),bs(10,"div",3),ou(11,"\n"),ys(),ou(12,"\n")),2&e&&(Pa(2),gs("headline",Ul(3,3,"network.title")),Pa(3),gs("ngIf",!t.peers||0===t.peers.length),Pa(2),gs("ngIf",t.peers&&t.peers.length>0))},directives:[xA,fh,zR,dh,uC,KD],pipes:[oS,GH],styles:[".-direction-cell[_ngcontent-%COMP%]{width:72px;flex-shrink:0}.-direction-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center}.-direction-container[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-last-seen-cell[_ngcontent-%COMP%]{width:180px;flex-shrink:0}.-last-seen-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;font-size:11px;line-height:1;justify-content:center}.-last-seen-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:12px;display:inline;vertical-align:middle;padding-right:5px}.-address-cell[_ngcontent-%COMP%]{width:200px;flex-shrink:0;padding-left:0!important}.-block-cell[_ngcontent-%COMP%]{width:150px;flex-shrink:0;text-align:right}@media (max-width:991px){.-row[_ngcontent-%COMP%]{font-size:12px!important}.-address-cell[_ngcontent-%COMP%]{width:160px!important}.-block-cell[_ngcontent-%COMP%]{width:100px}}"]}),e}(),ej=function(){function e(){this.statuses=["done","waiting_confirm","waiting_deposit","waiting_send"]}return e.prototype.transform=function(e){return this.statuses.find(function(t){return t===e})?"teller."+e.replace("_","-"):"teller.unknown"},e.\u0275fac=function(t){return new(t||e)},e.\u0275pipe=vt({name:"tellerStatus",type:e,pure:!0}),e}(),tj=["button"];function nj(e,t){if(1&e&&(_s(0,"option",16),ou(1),_s(2,"span",17),ou(3),Vl(4,"amount"),ys(),ou(5,"\n "),ys()),2&e){var n=t.$implicit;gs("value",n.id),Pa(1),uu("\n ",n.label," - "),Pa(2),su(Ul(4,3,n.coins))}}var ij=function(e){return{rate:e}};function rj(e,t){if(1&e&&(_s(0,"div",5),ou(1,"\n "),_s(2,"div",6),ou(3,"\n "),_s(4,"span",7),ou(5,"2"),ys(),ou(6,"\n "),ys(),ou(7,"\n "),_s(8,"div",8),ou(9,"\n "),_s(10,"h3"),ou(11),Vl(12,"translate"),ys(),ou(13,"\n "),_s(14,"p"),ou(15),Vl(16,"translate"),ys(),ou(17,"\n "),_s(18,"span",18),ou(19),ys(),ou(20,"\n "),_s(21,"span",14),ou(22),Vl(23,"translate"),ys(),ou(24,"\n "),ys(),ou(25,"\n "),ys()),2&e){var n=As(2);Pa(11),su(Ul(12,4,"buy.send")),Pa(4),su(zl(16,6,"buy.send-desc",Rl(11,ij,n.config.sky_btc_exchange_rate))),Pa(4),uu("\n ",n.order.deposit_address,"\n "),Pa(3),su(Ul(23,9,"buy.fraction-warning"))}}function aj(e,t){if(1&e){var n=Ss();_s(0,"div",5),ou(1,"\n "),_s(2,"div",6),ou(3,"\n "),_s(4,"span",7),ou(5,"3"),ys(),ou(6,"\n "),ys(),ou(7,"\n "),_s(8,"div",8),ou(9,"\n "),_s(10,"h3"),ou(11),Vl(12,"translate"),ys(),ou(13,"\n "),_s(14,"p"),ou(15),Vl(16,"translate"),ys(),ou(17,"\n "),_s(18,"span",19),ou(19),Vl(20,"translate"),Vl(21,"translate"),Vl(22,"tellerStatus"),ys(),ou(23,"\n "),_s(24,"app-button",20,21),Ls("action",function(){return sn(n),As(2).checkStatus()}),ou(26),Vl(27,"translate"),ys(),ou(28,"\n "),_s(29,"app-button",22,21),Ls("action",function(){return sn(n),As(2).removeOrder()}),ou(31),Vl(32,"translate"),ys(),ou(33,"\n "),ys(),ou(34,"\n "),ys()}if(2&e){var i=As(2);Pa(11),su(Ul(12,6,"buy.receive")),Pa(4),su(Ul(16,8,"buy.receive-desc")),Pa(4),lu("\n ",Ul(20,10,"buy.status-button")," ",Ul(21,12,Ul(22,14,i.order.status)),"\n "),Pa(7),uu("\n ",Ul(27,16,"buy.check-status-button"),"\n "),Pa(5),uu("\n ",Ul(32,18,"buy.new-order-button"),"\n ")}}function oj(e,t){if(1&e&&(_s(0,"div",4),ou(1,"\n "),_s(2,"div",5),ou(3,"\n "),_s(4,"div",6),ou(5,"\n "),_s(6,"span",7),ou(7,"1"),ys(),ou(8,"\n "),ys(),ou(9,"\n "),_s(10,"div",8),ou(11,"\n "),_s(12,"h3"),ou(13),Vl(14,"translate"),ys(),ou(15,"\n "),_s(16,"p"),ou(17),Vl(18,"translate"),ys(),ou(19,"\n "),_s(20,"div",9),ou(21,"\n "),_s(22,"div",10),ou(23,"\n "),_s(24,"select",11),ou(25,"\n "),_s(26,"option",12),ou(27),Vl(28,"translate"),ys(),ou(29,"\n "),fs(30,nj,6,5,"option",13),ou(31,"\n "),ys(),ou(32,"\n "),ys(),ou(33,"\n "),ys(),ou(34,"\n "),_s(35,"span",14),ou(36),Vl(37,"translate"),ys(),ou(38,"\n "),ys(),ou(39,"\n "),ys(),ou(40,"\n "),fs(41,rj,26,13,"div",15),ou(42,"\n "),fs(43,aj,35,20,"div",15),ou(44,"\n "),ys()),2&e){var n=As();gs("formGroup",n.form),Pa(13),su(Ul(14,8,"buy.deposit-location")),Pa(4),su(Ul(18,10,"buy.deposit-location-desc")),Pa(10),su(Ul(28,12,"buy.make-choice")),Pa(3),gs("ngForOf",n.wallets),Pa(6),su(Ul(37,14,"buy.wallets-desc")),Pa(5),gs("ngIf",n.order),Pa(2),gs("ngIf",n.order)}}var sj=function(){function e(e,t,n,i){this.formBuilder=e,this.purchaseService=t,this.msgBarService=n,this.walletsAndAddressesService=i,this.subscriptionsGroup=[]}return e.prototype.ngOnInit=function(){this.initForm(),this.loadData()},e.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(e){return e.unsubscribe()})},e.prototype.checkStatus=function(){var e=this;this.button.setLoading(),this.purchaseService.scan(this.order.recipient_address).subscribe(function(t){e.button.setSuccess(),e.order.status=t.status},function(t){return e.button.resetState()})},e.prototype.removeOrder=function(){window.localStorage.removeItem("purchaseOrder"),this.order=null},e.prototype.initForm=function(){var e=this;this.form=this.formBuilder.group({wallet:["",rk.required]}),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){var n=e.wallets.find(function(e){return e.id===t});console.log("changing wallet value",t),e.purchaseService.generate(n).subscribe(function(t){return e.saveData(t)},function(t){return e.msgBarService.showError(t.toString())})}))},e.prototype.loadConfig=function(){var e=this;this.purchaseService.config().pipe(Nf(function(e){return!!e&&!!e.sky_btc_exchange_rate}),ep()).subscribe(function(t){return e.config=t})},e.prototype.loadData=function(){var e=this;this.loadConfig(),this.loadOrder(),this.subscriptionsGroup.push(this.walletsAndAddressesService.allWallets.subscribe(function(t){e.wallets=t,e.order&&e.form.get("wallet").setValue(e.order.filename,{emitEvent:!1})}))},e.prototype.loadOrder=function(){var e=JSON.parse(window.localStorage.getItem("purchaseOrder"));e&&(this.order=e,this.updateOrder())},e.prototype.saveData=function(e){this.order=e,window.localStorage.setItem("purchaseOrder",JSON.stringify(e))},e.prototype.updateOrder=function(){var e=this;this.purchaseService.scan(this.order.recipient_address).pipe(ep()).subscribe(function(t){return e.order.status=t.status},function(e){return console.log(e)})},e.\u0275fac=function(t){return new(t||e)(ms(TM),ms(yP),ms(HC),ms(ix))},e.\u0275cmp=lt({type:e,selectors:[["app-buy"]],viewQuery:function(e,t){var n;1&e&&cc(tj,!0),2&e&&uc(n=fc())&&(t.button=n.first)},decls:13,vars:1,consts:[[1,"-background-container"],[1,"container"],["class","-paper",3,"formGroup",4,"ngIf"],["src","../../../../assets/img/otc-background.jpg",1,"-background-image"],[1,"-paper",3,"formGroup"],[1,"-step"],[1,"-number"],[1,"primary-gradient-background"],[1,"-instructions","flex-fill"],[1,"form-field"],[1,"-select"],["formControlName","wallet","id","wallet","required","",1,"-wallet"],["disabled","","selected",""],[3,"value",4,"ngFor","ngForOf"],[1,"-subtitle"],["class","-step",4,"ngIf"],[3,"value"],[1,"-coins"],[1,"-address"],[1,"-status"],[1,"primary-button",3,"action"],["button",""],[3,"action"]],template:function(e,t){1&e&&(ou(0,"\n"),bs(1,"app-header"),ou(2,"\n"),_s(3,"div",0),ou(4,"\n "),_s(5,"div",1),ou(6,"\n "),fs(7,oj,45,16,"div",2),ou(8,"\n "),bs(9,"img",3),ou(10,"\n "),ys(),ou(11,"\n"),ys(),ou(12,"\n")),2&e&&(Pa(7),gs("ngIf",t.config))},directives:[xA,fh,wk,pM,Ek,bk,wM,MM,Pk,Rk,dh,gC],pipes:[oS,yS,ej],styles:[".-background-container[_ngcontent-%COMP%]{background-color:#fbfbfb;padding-top:30px;max-width:100%;min-height:calc(100% - 190px);overflow:hidden;position:relative}.-background-image[_ngcontent-%COMP%]{display:none}@media (min-width:768px){.-background-image[_ngcontent-%COMP%]{display:block;left:50%;width:80%;position:absolute;top:0}}@media (min-width:992px){.-background-image[_ngcontent-%COMP%]{left:40%;width:90%;max-width:850px}}@media (min-width:1200px){.-background-image[_ngcontent-%COMP%]{left:40%;width:80%;max-width:850px}}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;position:relative;margin-top:30px;max-width:540px;z-index:5}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%]{display:flex;margin-bottom:30px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{width:60px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border-radius:50%;color:#fff;display:inline-block;font-size:16px;font-weight:700;height:40px;line-height:46px;text-align:center;width:40px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%]{flex:1 1}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] button{margin-left:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:0;line-height:46px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px;font-weight:300;line-height:20px;margin-top:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%], .-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%]{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;box-sizing:border-box;color:rgba(30,34,39,.8);display:block;font-size:14px;line-height:20px;margin-bottom:15px;padding:10px;width:100%}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#0072ff}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .form-field[_ngcontent-%COMP%]{margin-bottom:15px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-subtitle[_ngcontent-%COMP%]{color:#8c8e90;font-size:12px;line-height:18px;font-weight:300;opacity:.8}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-wallet[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px}"]}),e}(),uj=function(){function e(e,t){this.transaction=e,this.dialogRef=t}return e.openDialog=function(t,n){var i=new bw;return i.data=n,i.autoFocus=!1,i.width="800px",t.open(e,i)},e.prototype.closePopup=function(){this.dialogRef.close()},e.\u0275fac=function(t){return new(t||e)(ms(Tw),ms(xw))},e.\u0275cmp=lt({type:e,selectors:[["app-transaction-detail"]],decls:6,vars:6,consts:[[3,"headline","dialog"],[3,"transaction","isPreview"]],template:function(e,t){1&e&&(_s(0,"app-modal",0),Vl(1,"translate"),ou(2,"\n "),_s(3,"app-transaction-info",1),ou(4,"\n "),ys(),ou(5,"\n"),ys()),2&e&&(gs("headline",Ul(1,4,"history.tx-detail-title"))("dialog",t.dialogRef),Pa(3),gs("transaction",t.transaction)("isPreview",!1))},directives:[AM,mH],pipes:[oS],styles:["app-transaction-info[_ngcontent-%COMP%]{color:#1e2227}"]}),e}();function lj(e,t){1&e&&(_s(0,"mat-option",15),ou(1),Vl(2,"translate"),ys()),2&e&&(gs("value",As().$implicit),Pa(1),uu("\n ",Ul(2,2,"history.all-addresses"),"\n "))}function cj(e,t){if(1&e&&(_s(0,"mat-option",16),ou(1),Vl(2,"amount"),Vl(3,"amount"),ys()),2&e){var n=t.$implicit,i=As().$implicit;gs("value",n)("disabled",i.allAddressesSelected),Pa(1),cu("\n ",n.address," - ",Ul(2,5,n.coins),"\n (",zl(3,7,n.hours,!1),")\n ")}}function dj(e,t){if(1&e&&(_s(0,"mat-optgroup",12),Vl(1,"amount"),Vl(2,"amount"),ou(3,"\n "),fs(4,lj,3,4,"mat-option",13),ou(5,"\n "),fs(6,cj,4,10,"mat-option",14),ou(7,"\n "),ys()),2&e){var n=t.$implicit;js("label","\n ",n.label," - ",Ul(1,5,n.coins),"\n (",zl(2,7,n.hours,!1),")\n "),Pa(4),gs("ngIf",n.addresses.length>1),Pa(2),gs("ngForOf",n.addresses)}}function hj(e,t){1&e&&(_s(0,"span"),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),su(Ul(2,1,"history.filter")))}function fj(e,t){1&e&&(_s(0,"span"),ou(1),Vl(2,"translate"),ys()),2&e&&(Pa(1),su(Ul(2,1,"history.filters")))}function pj(e,t){if(1&e&&(_s(0,"span"),ou(1),ys()),2&e){var n=As(2).$implicit;Pa(1),su(n.label)}}function mj(e,t){if(1&e&&(_s(0,"span"),ou(1),ys()),2&e){var n=As(2).$implicit;Pa(1),su(n.address)}}function gj(e,t){if(1&e&&(_s(0,"div",18),ou(1,"\n "),fs(2,pj,2,1,"span",9),ou(3,"\n "),fs(4,mj,2,1,"span",9),ou(5),Vl(6,"amount"),Vl(7,"amount"),ys()),2&e){var n=As().$implicit;Pa(2),gs("ngIf",n.label),Pa(2),gs("ngIf",!n.label),Pa(1),lu("\n - ",Ul(6,4,n.coins),"\n (",zl(7,6,n.hours,!1),")\n ")}}function vj(e,t){if(1&e&&(ws(0),ou(1,"\n "),fs(2,gj,8,9,"div",17),ou(3,"\n "),ks()),2&e){var n=t.$implicit;Pa(2),gs("ngIf",n.label||!n.showingWholeWallet)}}function _j(e,t){if(1&e){var n=Ss();_s(0,"img",19),Ls("click",function(){return sn(n),As(2).removeFilters()}),ys()}}var yj=function(e){return{"bottom-line":e}};function bj(e,t){if(1&e&&(_s(0,"div",6),ou(1,"\n "),_s(2,"mat-select",7),Vl(3,"translate"),ou(4,"\n "),ou(5,"\n "),fs(6,dj,8,10,"mat-optgroup",8),ou(7,"\n "),ou(8,"\n "),_s(9,"mat-select-trigger"),ou(10,"\n "),fs(11,hj,3,3,"span",9),ou(12,"\n "),fs(13,fj,3,3,"span",9),ou(14,"\n "),fs(15,vj,4,1,"ng-container",10),ou(16,"\n "),ys(),ou(17,"\n "),ys(),ou(18,"\n "),fs(19,_j,1,0,"img",11),ou(20,"\n "),ys()),2&e){var n=As();gs("formGroup",n.form)("ngClass",Rl(10,yj,!n.transactions||0===n.transactions.length)),Pa(2),gs("placeholder",Ul(3,8,"history.no-filter")),Pa(4),gs("ngForOf",n.wallets),Pa(5),gs("ngIf",1===n.form.get("filter").value.length),Pa(2),gs("ngIf",n.form.get("filter").value.length>1),Pa(2),gs("ngForOf",n.form.get("filter").value),Pa(4),gs("ngIf",n.form.get("filter").value.length>0)}}function wj(e,t){if(1&e&&bs(0,"app-loading-content",20),2&e){var n=As();gs("isLoading",!n.transactionsLoaded)("noDataText",n.allTransactions&&0!==n.allTransactions.length?"history.no-txs-filter":"history.no-txs")}}var kj=function(e){return{coinName:e}};function Mj(e,t){if(1&e&&(_s(0,"h4"),ou(1),Vl(2,"translate"),_s(3,"span",31),ou(4),Vl(5,"dateTime"),ys(),ou(6,"\n "),ys()),2&e){var n=As(2).$implicit,i=As(2);Pa(1),uu("\n ",zl(2,2,"history.sent",Rl(7,kj,i.appService.coinName)),"\n "),Pa(3),su(Ul(5,5,n.timestamp))}}function Sj(e,t){if(1&e&&(_s(0,"h4"),ou(1),Vl(2,"translate"),_s(3,"span",32),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()),2&e){var n=As(4);Pa(1),uu("\n ",zl(2,2,"history.sending",Rl(7,kj,n.appService.coinName)),"\n "),Pa(3),su(Ul(5,5,"history.pending-indication"))}}function Cj(e,t){if(1&e&&(_s(0,"h4"),ou(1),Vl(2,"translate"),_s(3,"span",31),ou(4),Vl(5,"dateTime"),ys(),ou(6,"\n "),ys()),2&e){var n=As(2).$implicit,i=As(2);Pa(1),uu("\n ",zl(2,2,"history.received",Rl(7,kj,i.appService.coinName)),"\n "),Pa(3),su(Ul(5,5,n.timestamp))}}function xj(e,t){if(1&e&&(_s(0,"h4"),ou(1),Vl(2,"translate"),_s(3,"span",32),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()),2&e){var n=As(4);Pa(1),uu("\n ",zl(2,2,"history.receiving",Rl(7,kj,n.appService.coinName)),"\n "),Pa(3),su(Ul(5,5,"history.pending-indication"))}}function Lj(e,t){if(1&e&&(ws(0),ou(1,"\n "),fs(2,Mj,7,9,"h4",9),ou(3,"\n "),fs(4,Sj,7,9,"h4",9),ou(5,"\n "),fs(6,Cj,7,9,"h4",9),ou(7,"\n "),fs(8,xj,7,9,"h4",9),ou(9,"\n "),ks()),2&e){var n=As().$implicit;Pa(2),gs("ngIf",n.balance.isLessThan(0)&&n.confirmed),Pa(2),gs("ngIf",n.balance.isLessThan(0)&&!n.confirmed),Pa(2),gs("ngIf",n.balance.isGreaterThan(0)&&n.confirmed),Pa(2),gs("ngIf",n.balance.isGreaterThan(0)&&!n.confirmed)}}function Tj(e,t){if(1&e&&(_s(0,"h4"),ou(1),Vl(2,"translate"),_s(3,"span",31),ou(4),Vl(5,"dateTime"),ys(),ou(6,"\n "),ys()),2&e){var n=As(2).$implicit,i=As(2);Pa(1),uu("\n ",zl(2,2,"history.moved",Rl(7,kj,i.appService.coinName)),"\n "),Pa(3),su(Ul(5,5,n.timestamp))}}function Dj(e,t){if(1&e&&(_s(0,"h4"),ou(1),Vl(2,"translate"),_s(3,"span",32),ou(4),Vl(5,"translate"),ys(),ou(6,"\n "),ys()),2&e){var n=As(4);Pa(1),uu("\n ",zl(2,2,"history.moving",Rl(7,kj,n.appService.coinName)),"\n "),Pa(3),su(Ul(5,5,"history.pending-indication"))}}function Oj(e,t){if(1&e&&(ws(0),ou(1,"\n "),fs(2,Tj,7,9,"h4",9),ou(3,"\n "),fs(4,Dj,7,9,"h4",9),ou(5,"\n "),ks()),2&e){var n=As().$implicit;Pa(2),gs("ngIf",n.confirmed),Pa(2),gs("ngIf",!n.confirmed)}}function Ej(e,t){if(1&e&&(_s(0,"div",33),ou(1,"\n "),bs(2,"app-qr-code-button",34),ou(3,"\n "),_s(4,"span",35),ou(5),ys(),ou(6,"\n "),ys()),2&e){var n=t.$implicit;Pa(2),gs("address",n),Pa(3),su(n)}}function Pj(e,t){if(1&e&&(_s(0,"div",33),ou(1,"\n "),_s(2,"span"),ou(3),Vl(4,"translate"),_s(5,"span",36),ou(6),ys(),ys(),ou(7,"\n "),ys()),2&e){var n=As().$implicit;Pa(3),uu("",Ul(4,2,"history.transaction-note-small-label")," "),Pa(3),su(n.note)}}function Aj(e,t){if(1&e&&(_s(0,"p",37),Vl(1,"translate"),ou(2),Vl(3,"currency"),_s(4,"span"),ou(5,"*"),ys(),ou(6,"\n "),ys()),2&e){var n=As().$implicit,i=As(2);gs("matTooltip",Ul(1,2,"tx.current-rate-help")),Pa(2),uu("\n ",Gl(3,4,n.balance*i.price,"USD","symbol","1.2-2"),"")}}var Yj=function(e){return{"-pending":e}};function Ij(e,t){if(1&e){var n=Ss();ws(0),ou(1,"\n "),_s(2,"div",23),Ls("click",function(){sn(n);var e=t.$implicit;return As(2).showTransaction(e)}),ou(3,"\n "),_s(4,"div",24),ou(5,"\n "),bs(6,"img",25),ou(7,"\n "),ys(),ou(8,"\n "),_s(9,"div",26),ou(10,"\n "),fs(11,Lj,10,4,"ng-container",9),ou(12,"\n "),fs(13,Oj,6,2,"ng-container",9),ou(14,"\n "),fs(15,Ej,7,2,"div",27),ou(16,"\n "),fs(17,Pj,8,4,"div",28),ou(18,"\n "),ys(),ou(19,"\n "),_s(20,"div",29),ou(21,"\n "),_s(22,"h4"),ou(23),Vl(24,"amount"),ys(),ou(25,"\n "),fs(26,Aj,7,9,"p",30),ou(27,"\n "),ys(),ou(28,"\n "),ys(),ou(29,"\n "),ks()}if(2&e){var i=t.$implicit,r=As(2);Pa(4),gs("ngClass",Rl(10,Yj,!i.confirmed)),Pa(2),gs("src","assets/img/"+(i.balance.isGreaterThan(0)&&!i.coinsMovedInternally?"received":"sent")+"-blue.png",Ar),Pa(5),gs("ngIf",!i.coinsMovedInternally),Pa(2),gs("ngIf",i.coinsMovedInternally),Pa(2),gs("ngForOf",i.relevantAddresses),Pa(2),gs("ngIf",i.note),Pa(6),su(Ul(24,8,i.balance.toString())),Pa(3),gs("ngIf",r.price)}}var Rj=function(e){return{number:e}};function Fj(e,t){if(1&e){var n=Ss();_s(0,"div",38),Ls("click",function(){return sn(n),As(2).showAll()}),ou(1),Vl(2,"translate"),ys()}if(2&e){var i=As(2);Pa(1),su(zl(2,1,"history.view-all",Rl(4,Rj,i.totalElements)))}}function Hj(e,t){if(1&e&&(_s(0,"div",21),ou(1,"\n "),fs(2,Ij,30,12,"ng-container",10),ou(3,"\n "),fs(4,Fj,3,6,"div",22),ou(5,"\n "),ys()),2&e){var n=As();Pa(2),gs("ngForOf",n.transactions),Pa(2),gs("ngIf",n.viewingTruncatedList)}}var jj=function(){function e(e,t,n,i,r,a,o){var s=this;this.appService=e,this.dialog=t,this.priceService=n,this.formBuilder=i,this.historyService=r,this.transactionsLoaded=!1,this.maxInitialElements=40,this.viewAll=!1,this.viewingTruncatedList=!1,this.form=this.formBuilder.group({filter:[[]]}),this.routeSubscription=o.queryParams.subscribe(function(e){var t=e.addr?e.addr.split(","):[],n=e.wal?e.wal.split(","):[];t=t.map(function(e){return"a-"+e}),n=n.map(function(e){return"w-"+e}),s.viewAll=!1,s.requestedFilters=t.concat(n),s.showRequestedFilters()}),this.walletsSubscription=a.walletsWithBalance.subscribe(function(e){var t=new Map,n=new Map;s.form.get("filter").value.forEach(function(e){e.addresses?n.set(e.id,!0):t.set(e.walletID+"/"+e.address,!0)});var i=[];s.wallets=[],e.forEach(function(e){var r={id:e.id,label:e.label,coins:e.coins.decimalPlaces(6).toString(),hours:e.hours.decimalPlaces(0).toString(),addresses:[],allAddressesSelected:n.has(e.id)};s.wallets.push(r),n.has(e.id)&&i.push(r),e.addresses.forEach(function(r){var a={walletID:e.id,address:r.address,coins:r.coins.decimalPlaces(6).toString(),hours:r.hours.decimalPlaces(0).toString(),showingWholeWallet:n.has(e.id)};s.wallets[s.wallets.length-1].addresses.push(a),t.has(e.id+"/"+r.address)&&i.push(a)})}),s.form.get("filter").setValue(i,{emitEvent:!1}),s.loadTransactions(0)})}return e.prototype.ngOnInit=function(){var e=this;this.priceSubscription=this.priceService.price.subscribe(function(t){return e.price=t}),this.filterSubscription=this.form.get("filter").valueChanges.subscribe(function(){e.viewAll=!1,e.filterTransactions()})},e.prototype.ngOnDestroy=function(){this.priceSubscription.unsubscribe(),this.filterSubscription.unsubscribe(),this.walletsSubscription.unsubscribe(),this.routeSubscription.unsubscribe(),this.removeTransactionsSubscription()},e.prototype.showAll=function(){this.viewAll||(this.viewAll=!0,this.filterTransactions())},e.prototype.showTransaction=function(e){uj.openDialog(this.dialog,e)},e.prototype.removeFilters=function(){this.form.get("filter").setValue([])},e.prototype.loadTransactions=function(e){var t=this;this.removeTransactionsSubscription(),this.transactionsSubscription=xf(1).pipe(Of(e),ue(function(){return t.historyService.getTransactionsHistory(null)})).subscribe(function(e){t.allTransactions=e,t.transactionsLoaded=!0,t.showRequestedFilters(),t.filterTransactions()},function(){return t.loadTransactions(2e3)})},e.prototype.filterTransactions=function(){var e=this.form.get("filter").value;if(this.wallets.forEach(function(e){e.allAddressesSelected=!1,e.addresses.forEach(function(e){return e.showingWholeWallet=!1})}),0===e.length)this.transactions=this.allTransactions;else{var t=new Map;e.forEach(function(e){e.addresses?(e.addresses.forEach(function(e){t.set(e.address,!0),e.showingWholeWallet=!0}),e.allAddressesSelected=!0):t.set(e.address,!0)}),this.transactions=this.allTransactions.filter(function(e){return e.inputs.some(function(e){return t.has(e.address)})||e.outputs.some(function(e){return t.has(e.address)})})}this.totalElements=this.transactions.length,!this.viewAll&&this.totalElements>this.maxInitialElements?(this.transactions=this.transactions.slice(0,this.maxInitialElements),this.viewingTruncatedList=!0):this.viewingTruncatedList=!1},e.prototype.showRequestedFilters=function(){var e=this;if(this.transactionsLoaded&&this.wallets&&0!==this.wallets.length&&null!=this.requestedFilters){if(this.requestedFilters.length>0){var t=[];this.requestedFilters.forEach(function(n){var i=n.substr(2,n.length-2);e.wallets.forEach(function(e){n.startsWith("w-")?i===e.id&&t.push(e):n.startsWith("a-")&&e.addresses.forEach(function(e){i===e.address&&t.push(e)})})}),this.form.get("filter").setValue(t)}else this.form.get("filter").setValue([]);this.requestedFilters=null}},e.prototype.removeTransactionsSubscription=function(){this.transactionsSubscription&&this.transactionsSubscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(ms(qp),ms(Aw),ms(bP),ms(TM),ms(zA),ms(LO),ms(fL))},e.\u0275cmp=lt({type:e,selectors:[["app-transaction-list"]],decls:17,vars:6,consts:[[3,"headline"],[1,"container"],["class","form-field",3,"formGroup","ngClass",4,"ngIf"],[3,"isLoading","noDataText",4,"ngIf"],["class","paper",4,"ngIf"],[1,"final-element"],[1,"form-field",3,"formGroup","ngClass"],["multiple","","formControlName","filter","id","filter",3,"placeholder"],[3,"label",4,"ngFor","ngForOf"],[4,"ngIf"],[4,"ngFor","ngForOf"],["class","x-button image-button","src","assets/img/delete-grey.png",3,"click",4,"ngIf"],[3,"label"],[3,"value",4,"ngIf"],[3,"value","disabled",4,"ngFor","ngForOf"],[3,"value"],[3,"value","disabled"],["class","filter text-truncate",4,"ngIf"],[1,"filter","text-truncate"],["src","assets/img/delete-grey.png",1,"x-button","image-button",3,"click"],[3,"isLoading","noDataText"],[1,"paper"],["class","view-all-button",3,"click",4,"ngIf"],[1,"-transaction",3,"click"],[1,"-icon",3,"ngClass"],[3,"src"],[1,"-address"],["class","-item",4,"ngFor","ngForOf"],["class","-item",4,"ngIf"],[1,"-balance"],[3,"matTooltip",4,"ngIf"],[1,"-timestamp"],[1,"-pending"],[1,"-item"],[3,"address"],[1,"break-all"],[1,"note"],[3,"matTooltip"],[1,"view-all-button",3,"click"]],template:function(e,t){1&e&&(bs(0,"app-header",0),Vl(1,"translate"),ou(2,"\n"),_s(3,"div",1),ou(4,"\n "),ou(5,"\n "),fs(6,bj,21,12,"div",2),ou(7,"\n\n "),fs(8,wj,1,2,"app-loading-content",3),ou(9,"\n\n "),ou(10,"\n "),fs(11,Hj,6,2,"div",4),ou(12,"\n "),ou(13,"\n "),bs(14,"div",5),ou(15,"\n"),ys(),ou(16,"\n")),2&e&&(gs("headline",Ul(1,4,"history.title-and-button")),Pa(6),gs("ngIf",t.transactionsLoaded),Pa(2),gs("ngIf",!t.transactions||0===t.transactions.length),Pa(3),gs("ngIf",t.transactions&&t.transactions.length>0))},directives:[xA,fh,wk,pM,lh,uI,bk,wM,dh,oI,uw,pw,zR,iY,KD],pipes:[oS,yS,$F,Dh],styles:['.form-field[_ngcontent-%COMP%]{margin:10px 30px -21px;display:flex}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%]{background:transparent;border:0;border-radius:0}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .mat-select-value{font-size:13px;line-height:1.7}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .left-icon[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .mat-select-placeholder:before, .form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] mat-select-trigger[_ngcontent-%COMP%]:before{content:"filter_list";font-family:Material Icons;font-weight:400;font-style:normal;font-size:13px;margin-right:10px;position:relative;top:1px}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .mat-select-placeholder{color:rgba(30,34,39,.5)!important}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .filter[_ngcontent-%COMP%]{font-size:13px;margin-left:28px;color:rgba(30,34,39,.5)}.form-field[_ngcontent-%COMP%] .x-button[_ngcontent-%COMP%]{width:24px;height:24px;margin-top:10px}.bottom-line[_ngcontent-%COMP%]{border-bottom:2px solid rgba(30,34,39,.05)}.paper[_ngcontent-%COMP%]{padding:0}.-transaction[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid rgba(30,34,39,.05);cursor:pointer;display:flex;padding:20px 12px}.-transaction[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0 8px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%]{margin-top:5px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-transaction[_ngcontent-%COMP%] .-icon.-pending[_ngcontent-%COMP%]{opacity:.5}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{flex:1}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:1.15;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:11px;line-height:1.2;padding-left:5px;font-weight:300}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-pending[_ngcontent-%COMP%]{color:#ffc125}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] app-qr-code-button[_ngcontent-%COMP%]{vertical-align:middle;margin-right:4px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:13px;line-height:1.15}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] .note[_ngcontent-%COMP%]{color:#1e2227;word-break:break-word}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%]{width:200px;text-align:right;font-size:13px;line-height:1.15}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-weight:700;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;margin:0}.-transaction[_ngcontent-%COMP%]:hover{background-color:#f7f7f7}.view-all-button[_ngcontent-%COMP%]{color:#0072ff;font-size:13px;text-align:center;padding:20px;cursor:pointer}']}),e}(),Nj=["button"],Bj=function(e){return{"element-disabled":e}},Wj=function(e){return{"d-none":e}},Vj=function(){function e(e,t){this.formBuilder=e,this.changeDetector=t,this.onPasswordCreated=new Zl,this.onBack=new Zl,this.password1ErrorMsg="",this.password2ErrorMsg=""}return e.prototype.ngOnInit=function(){this.form=this.formBuilder.group({password:new iM(""),confirm:new iM("")}),this.form.setValidators(this.validateForm.bind(this))},e.prototype.ngOnDestroy=function(){this.onPasswordCreated.complete(),this.onBack.complete()},e.prototype.setEncrypt=function(e){e.checked?this.form.enable():this.form.disable()},e.prototype.emitCreatedPassword=function(){this.form.enabled&&!this.form.valid||this.button.isLoading()||(this.button.setLoading(),this.onPasswordCreated.emit(this.form.enabled?this.form.get("password").value:null),this.changeDetector.detectChanges())},e.prototype.emitBack=function(){this.onBack.emit()},e.prototype.resetButton=function(){this.button.resetState()},Object.defineProperty(e.prototype,"isWorking",{get:function(){return!!this.button&&this.button.isLoading()},enumerable:!1,configurable:!0}),e.prototype.validateForm=function(){this.password1ErrorMsg="",this.password2ErrorMsg="";var e=!0;return this.form.get("password").value||(e=!1,this.form.get("password").touched&&(this.password1ErrorMsg="password.password-error-info")),this.form.get("confirm").value||(e=!1,this.form.get("confirm").touched&&(this.password2ErrorMsg="password.password-error-info")),e&&this.form.get("password").value!==this.form.get("confirm").value&&(e=!1,this.password2ErrorMsg="password.confirm-error-info"),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ms(TM),ms(ul))},e.\u0275cmp=lt({type:e,selectors:[["app-onboarding-encrypt-wallet"]],viewQuery:function(e,t){var n;1&e&&cc(Nj,!0),2&e&&uc(n=fc())&&(t.button=n.first)},outputs:{onPasswordCreated:"onPasswordCreated",onBack:"onBack"},decls:81,vars:40,consts:[[1,"onboarding-container"],[1,"row"],[1,"row-container"],[1,"-header"],[1,"-description"],[1,"row-container","-check-container"],["type","checkbox","id","encrypt",1,"-check",3,"checked","ngClass","change"],[1,"img-label-container"],["src","assets/img/lock-gold.png"],[3,"formGroup"],[1,"form-field"],["for","password"],["type","password","appDontSavePassword","","formControlName","password","id","password",1,"-input",3,"ngClass","appFormFieldError","blur"],["for","confirm"],["type","password","appDontSavePassword","","formControlName","confirm","id","confirm",1,"-input",3,"ngClass","appFormFieldError","keydown.enter","blur"],[1,"row","-buttons-footer"],[1,"dark-button","-button-min-margin",3,"disabled","action"],["button",""],[1,"ghost-button","-button-min-margin",3,"ngClass","action"]],template:function(e,t){1&e&&(_s(0,"div",0),ou(1,"\n "),ou(2,"\n "),_s(3,"div",1),ou(4,"\n "),_s(5,"div",2),ou(6,"\n "),_s(7,"div",3),ou(8,"\n "),_s(9,"span"),ou(10),Vl(11,"translate"),ys(),ou(12,"\n "),ys(),ou(13,"\n "),_s(14,"div",4),ou(15,"\n "),_s(16,"p"),ou(17),Vl(18,"translate"),ys(),ou(19,"\n "),ys(),ou(20,"\n "),ys(),ou(21,"\n "),ys(),ou(22,"\n "),ou(23,"\n "),_s(24,"div",1),ou(25,"\n "),_s(26,"div",5),ou(27,"\n "),_s(28,"mat-checkbox",6),Ls("change",function(e){return t.setEncrypt(e)}),ou(29,"\n "),_s(30,"span",7),ou(31,"\n "),bs(32,"img",8),ou(33),Vl(34,"translate"),ys(),ou(35,"\n "),ys(),ou(36,"\n "),ys(),ou(37,"\n "),ys(),ou(38,"\n "),ou(39,"\n "),_s(40,"div",1),ou(41,"\n "),_s(42,"div",2),ou(43,"\n "),_s(44,"form",9),ou(45,"\n "),_s(46,"div",10),ou(47,"\n "),_s(48,"label",11),ou(49),Vl(50,"translate"),ys(),ou(51,"\n "),_s(52,"input",12),Ls("blur",function(){return t.validateForm()}),ys(),ou(53,"\n "),ys(),ou(54,"\n "),_s(55,"div",10),ou(56,"\n "),_s(57,"label",13),ou(58),Vl(59,"translate"),ys(),ou(60,"\n "),_s(61,"input",14),Ls("keydown.enter",function(){return t.emitCreatedPassword()})("blur",function(){return t.validateForm()}),ys(),ou(62,"\n "),ys(),ou(63,"\n "),ys(),ou(64,"\n "),ys(),ou(65,"\n "),ys(),ou(66,"\n "),ou(67,"\n "),_s(68,"div",15),ou(69,"\n "),_s(70,"app-button",16,17),Ls("action",function(){return t.emitCreatedPassword()}),ou(72),Vl(73,"translate"),ys(),ou(74,"\n "),_s(75,"app-button",18),Ls("action",function(){return t.emitBack()}),ou(76),Vl(77,"translate"),ys(),ou(78,"\n "),ys(),ou(79,"\n"),ys(),ou(80,"\n")),2&e&&(Pa(10),su(Ul(11,18,"wizard.encrypt-title")),Pa(7),su(Ul(18,20,"wizard.encrypt-desc")),Pa(11),gs("checked",!0)("ngClass",Rl(32,Bj,t.isWorking)),Pa(5),uu("\n ",Ul(34,22,"wallet.new.encrypt-check"),"\n "),Pa(11),gs("formGroup",t.form),Pa(5),su(Ul(50,24,"password.password-label")),Pa(3),gs("ngClass",Rl(34,Bj,t.form.disabled))("appFormFieldError",t.password1ErrorMsg),cs("disabled",t.isWorking?"true":null),Pa(6),su(Ul(59,26,"password.confirm-password-label")),Pa(3),gs("ngClass",Rl(36,Bj,t.form.disabled))("appFormFieldError",t.password2ErrorMsg),cs("disabled",t.isWorking?"true":null),Pa(9),gs("disabled",t.form.enabled&&!t.form.valid),Pa(2),uu("\n ",Ul(73,28,"wizard.finish-button"),"\n "),Pa(3),gs("ngClass",Rl(38,Wj,t.isWorking)),Pa(1),uu("\n ",Ul(77,30,"common.back-button"),"\n "))},directives:[LD,lh,dM,wk,pM,Xw,XD,bk,wM,QD,gC],pipes:[oS],styles:[".-check-container[_ngcontent-%COMP%]{margin:10px auto}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{stroke:#fafafa!important}"]}),e}(),Uj=["formControl"];function zj(e,t){if(1&e){var n=Ss();_s(0,"div",12),ou(1,"\n "),_s(2,"span",13),Ls("click",function(){return sn(n),As().useHardwareWallet()}),ou(3),Vl(4,"translate"),ys(),ou(5,"\n "),ys()}2&e&&(Pa(3),su(Ul(4,1,"wizard.hardware-wallet-link")))}var qj=function(e){return{coinName:e}},Gj=function(){function e(e,t,n,i,r){var a=this;this.appService=e,this.dialog=t,this.router=n,this.fill=null,this.onLabelAndSeedCreated=new Zl,this.currentFormSelection=KP.LeftButton,this.hwCompatibilityActivated=!1,this.doubleButtonActive=KP,this.synchronized=!0,this.hwCompatibilityActivated=i.hwWalletCompatibilityActivated,this.blockchainSubscription=r.progress.subscribe(function(e){return a.synchronized=e.synchronized})}return e.prototype.ngOnInit=function(){var e=this;setTimeout(function(){e.formControl.initForm(null,e.fill)}),this.fill&&(this.currentFormSelection=this.fill.creatingNewWallet?KP.LeftButton:KP.RightButton)},e.prototype.ngOnDestroy=function(){this.blockchainSubscription.unsubscribe(),this.onLabelAndSeedCreated.complete()},e.prototype.changeForm=function(e){this.currentFormSelection=e,this.fill=null,this.formControl.initForm(this.currentFormSelection===KP.LeftButton,this.fill)},e.prototype.createWallet=function(){var e=this;ID.openDialog(this.dialog,{headerText:"wizard.confirm.title",redTitle:!0,text:"wizard.confirm.desc",checkboxText:"wizard.confirm.checkbox",confirmButtonText:"common.continue-button"}).afterClosed().subscribe(function(t){t&&e.emitCreatedData()})},e.prototype.loadWallet=function(){var e=this;this.synchronized?this.emitCreatedData():ID.openDialog(this.dialog,{headerText:"common.warning-title",text:"wallet.new.synchronizing-warning-text",defaultButtons:YD.ContinueCancel,redTitle:!0}).afterClosed().subscribe(function(t){t&&e.emitCreatedData()})},e.prototype.useHardwareWallet=function(){var e=this;aP.openDialog(this.dialog,!0).afterClosed().subscribe(function(t){t&&e.router.navigate(["/wallets"])})},e.prototype.emitCreatedData=function(){this.onLabelAndSeedCreated.emit(this.formControl.getData())},e.\u0275fac=function(t){return new(t||e)(ms(qp),ms(Aw),ms(WT),ms(Bw),ms(TO))},e.\u0275cmp=lt({type:e,selectors:[["app-onboarding-create-wallet"]],viewQuery:function(e,t){var n;1&e&&cc(Uj,!0),2&e&&uc(n=fc())&&(t.formControl=n.first)},inputs:{fill:"fill"},outputs:{onLabelAndSeedCreated:"onLabelAndSeedCreated"},decls:56,vars:23,consts:[[1,"onboarding-container"],[1,"row"],[1,"row-container"],[1,"-header"],[1,"-description"],[1,"row-container","-toggle-container"],[3,"leftButtonText","rightButtonText","activeButton","onStateChange"],[3,"create","onboarding"],["formControl",""],["class","row justify-content-center",4,"ngIf"],[1,"row","-buttons-footer"],[1,"dark-button","-button-min-margin",3,"disabled","action"],[1,"row","justify-content-center"],[1,"hw-link",3,"click"]],template:function(e,t){if(1&e&&(_s(0,"div",0),ou(1,"\n "),ou(2,"\n "),_s(3,"div",1),ou(4,"\n "),_s(5,"div",2),ou(6,"\n "),_s(7,"div",3),ou(8,"\n "),_s(9,"span"),ou(10),Vl(11,"translate"),ys(),ou(12,"\n "),ys(),ou(13,"\n "),_s(14,"div",4),ou(15,"\n "),_s(16,"p"),ou(17),Vl(18,"translate"),ys(),ou(19,"\n "),ys(),ou(20,"\n "),ys(),ou(21,"\n "),ys(),ou(22,"\n "),ou(23,"\n "),_s(24,"div",1),ou(25,"\n "),_s(26,"div",5),ou(27,"\n "),_s(28,"app-double-button",6),Ls("onStateChange",function(e){return t.changeForm(e)}),Vl(29,"translate"),Vl(30,"translate"),ys(),ou(31,"\n "),ys(),ou(32,"\n "),ys(),ou(33,"\n "),ou(34,"\n "),_s(35,"div",1),ou(36,"\n "),_s(37,"div",2),ou(38,"\n "),bs(39,"app-create-wallet-form",7,8),ou(41,"\n "),ys(),ou(42,"\n "),ys(),ou(43,"\n "),ou(44,"\n "),fs(45,zj,6,3,"div",9),ou(46,"\n "),ou(47,"\n "),_s(48,"div",10),ou(49,"\n "),_s(50,"app-button",11),Ls("action",function(){return t.currentFormSelection===t.doubleButtonActive.LeftButton?t.createWallet():t.loadWallet()}),ou(51),Vl(52,"translate"),ys(),ou(53,"\n "),ys(),ou(54,"\n"),ys(),ou(55,"\n")),2&e){var n=ps(40);Pa(10),su(Ul(11,10,"wizard.create-title")),Pa(7),su(zl(18,12,"wizard.create-desc",Rl(21,qj,t.appService.fullCoinName))),Pa(11),gs("leftButtonText",Ul(29,15,"wizard.new-button"))("rightButtonText",Ul(30,17,"wizard.load-button"))("activeButton",t.currentFormSelection),Pa(11),gs("create",t.currentFormSelection===t.doubleButtonActive.LeftButton)("onboarding",!0),Pa(6),gs("ngIf",t.hwCompatibilityActivated),Pa(5),gs("disabled",!n.isValid),Pa(1),uu("\n ",Ul(52,19,"common.create-button"),"\n ")}},directives:[JP,xO,fh,gC],pipes:[oS],styles:[".-toggle-container[_ngcontent-%COMP%]{margin:10px auto}.hw-link[_ngcontent-%COMP%]{cursor:pointer;color:#fafafa;font-size:13px;margin-bottom:20px}"]}),e}(),Kj=["encryptForm"];function Jj(e,t){if(1&e){var n=Ss();_s(0,"button",3),Ls("click",function(){return sn(n),As().changelanguage()}),ou(1,"\n "),bs(2,"img",4),ou(3,"\n"),ys()}if(2&e){var i=As();Pa(2),gs("src","assets/img/lang/"+i.language.iconName,Ar)}}function Zj(e,t){if(1&e){var n=Ss();_s(0,"app-onboarding-create-wallet",5),Ls("onLabelAndSeedCreated",function(e){return sn(n),As().onLabelAndSeedCreated(e)}),ys()}2&e&&gs("fill",As().formData)}function Qj(e,t){if(1&e){var n=Ss();_s(0,"app-onboarding-encrypt-wallet",6,7),Ls("onPasswordCreated",function(e){return sn(n),As().onPasswordCreated(e)})("onBack",function(){return sn(n),As().onBack()}),ys()}}var Xj=["resetButton"],$j=function(e){return{"element-disabled":e}},eN=[{path:"",redirectTo:"wallets",pathMatch:"full"},{path:"wallets",component:gP,canActivate:[jI]},{path:"send",component:kH,canActivate:[jI]},{path:"transactions",component:jj,canActivate:[jI]},{path:"buy",component:sj,canActivate:[jI]},{path:"settings",children:[{path:"backup",component:qH},{path:"blockchain",component:FH},{path:"network",component:$H},{path:"outputs",component:PH},{path:"pending-transactions",component:xH}],canActivate:[jI]},{path:"wizard",component:function(){function e(e,t,n,i,r){this.router=e,this.languageService=t,this.dialog=n,this.msgBarService=i,this.walletsAndAddressesService=r,this.step=1}return e.prototype.ngOnInit=function(){var e=this;this.subscription=this.languageService.currentLanguage.subscribe(function(t){return e.language=t})},e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},e.prototype.onLabelAndSeedCreated=function(e){this.formData=e,this.step=2},e.prototype.onPasswordCreated=function(e){var t=this;this.walletsAndAddressesService.createSoftwareWallet(this.formData.label,this.formData.seed,e).subscribe(function(){t.router.navigate(["/wallets"])},function(e){t.msgBarService.showError(e),t.encryptForm.resetButton()})},e.prototype.onBack=function(){this.step=1},e.prototype.changelanguage=function(){GC.openDialog(this.dialog)},e.\u0275fac=function(t){return new(t||e)(ms(WT),ms(DC),ms(Aw),ms(HC),ms(ix))},e.\u0275cmp=lt({type:e,selectors:[["app-onboarding"]],viewQuery:function(e,t){var n;1&e&&cc(Kj,!0),2&e&&uc(n=fc())&&(t.encryptForm=n.first)},decls:9,vars:3,consts:[["mat-icon-button","",3,"click",4,"ngIf"],[3,"fill","onLabelAndSeedCreated",4,"ngIf"],[3,"onPasswordCreated","onBack",4,"ngIf"],["mat-icon-button","",3,"click"],[1,"flag",3,"src"],[3,"fill","onLabelAndSeedCreated"],[3,"onPasswordCreated","onBack"],["encryptForm",""]],template:function(e,t){1&e&&(ou(0,"\n"),fs(1,Jj,4,1,"button",0),ou(2,"\n\n"),ou(3,"\n"),fs(4,Zj,1,1,"app-onboarding-create-wallet",1),ou(5,"\n\n"),ou(6,"\n"),fs(7,Qj,2,0,"app-onboarding-encrypt-wallet",2),ou(8,"\n")),2&e&&(Pa(1),gs("ngIf",t.language),Pa(3),gs("ngIf",1===t.step),Pa(3),gs("ngIf",2===t.step))},directives:[fh,US,Gj,Vj],styles:["button[_ngcontent-%COMP%]{position:fixed;right:30px;top:20px;background-color:#fafafa!important}button[_ngcontent-%COMP%]:hover{background-color:#f7f7f7!important}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:-3px}"]}),e}()},{path:"reset/:id",component:function(){function e(e,t,n,i,r,a,o){var s=this;this.formBuilder=e,this.route=t,this.router=n,this.msgBarService=i,this.softwareWalletService=r,this.walletsAndAddressesService=a,this.changeDetector=o,this.busy=!0,this.seedErrorMsg="",this.passwordErrorMsg="",this.done=!1,this.hideBarWhenClosing=!0,this.initForm(),this.subscription=ax([this.route.params,this.walletsAndAddressesService.allWallets]).pipe(ie(function(e){var t=e[0],n=e[1].find(function(e){return e.id===t.id});n?(s.wallet=n,s.form.get("wallet").setValue(n.label),s.busy=!1):setTimeout(function(){return s.router.navigate([""],{skipLocationChange:!0})})})).subscribe()}return e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe(),this.hideBarWhenClosing&&this.msgBarService.hide()},e.prototype.initForm=function(){this.form=new rM({}),this.form.addControl("wallet",new iM),this.form.addControl("seed",new iM("")),this.form.addControl("password",new iM("")),this.form.addControl("confirm",new iM("")),this.form.setValidators(this.validateForm.bind(this))},e.prototype.reset=function(){var e=this;!this.form.valid||this.busy||this.done||(this.busy=!0,this.msgBarService.hide(),this.resetButton.setLoading(),this.softwareWalletService.resetPassword(this.wallet,this.form.value.seed,""!==this.form.value.password?this.form.value.password:null).subscribe(function(){e.resetButton.setSuccess(),e.resetButton.setDisabled(),e.done=!0,e.msgBarService.showDone("reset.done"),e.hideBarWhenClosing=!1,setTimeout(function(){e.router.navigate([""])},2e3)},function(t){e.busy=!1,e.resetButton.resetState(),e.msgBarService.showError(t)}),this.changeDetector.detectChanges())},e.prototype.validateForm=function(){this.seedErrorMsg="",this.passwordErrorMsg="";var e=!0;return this.form.get("seed").value||(e=!1,this.form.get("seed").touched&&(this.seedErrorMsg="reset.seed-error-info")),this.form.get("password").value!==this.form.get("confirm").value&&(e=!1,this.form.get("confirm").touched&&(this.passwordErrorMsg="reset.confirm-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ms(TM),ms(fL),ms(WT),ms(HC),ms(NO),ms(ix),ms(ul))},e.\u0275cmp=lt({type:e,selectors:[["app-reset-password"]],viewQuery:function(e,t){var n;1&e&&cc(Xj,!0),2&e&&uc(n=fc())&&(t.resetButton=n.first)},decls:62,vars:28,consts:[[3,"headline"],[1,"container"],[1,"paper"],[3,"formGroup"],[1,"form-field"],["for","wallet"],[1,"-not-allowed"],["formControlName","wallet","id","wallet","readonly","",3,"ngClass"],["for","seed"],["formControlName","seed","id","seed","row","2",3,"appFormFieldError","blur"],["for","password"],["formControlName","password","id","password","type","password","appDontSavePassword",""],["for","confirm"],["formControlName","confirm","id","confirm","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],[1,"text-center"],[1,"primary-button",3,"disabled","action"],["resetButton",""],[1,"final-element"]],template:function(e,t){1&e&&(bs(0,"app-header",0),Vl(1,"translate"),ou(2,"\n"),_s(3,"div",1),ou(4,"\n "),_s(5,"div",2),ou(6,"\n "),_s(7,"div",3),ou(8,"\n "),ou(9,"\n "),_s(10,"div",4),ou(11,"\n "),_s(12,"label",5),ou(13),Vl(14,"translate"),ys(),ou(15,"\n "),_s(16,"div",6),bs(17,"input",7),ys(),ou(18,"\n "),ys(),ou(19,"\n "),_s(20,"div",4),ou(21,"\n "),_s(22,"label",8),ou(23),Vl(24,"translate"),ys(),ou(25,"\n "),_s(26,"textarea",9),Ls("blur",function(){return t.validateForm()}),ys(),ou(27,"\n "),ys(),ou(28,"\n "),_s(29,"div",4),ou(30,"\n "),_s(31,"label",10),ou(32),Vl(33,"translate"),ys(),ou(34,"\n "),bs(35,"input",11),ou(36,"\n "),ys(),ou(37,"\n "),_s(38,"div",4),ou(39,"\n "),_s(40,"label",12),ou(41),Vl(42,"translate"),ys(),ou(43,"\n "),_s(44,"input",13),Ls("keydown.enter",function(){return t.reset()})("blur",function(){return t.validateForm()}),ys(),ou(45,"\n "),ys(),ou(46,"\n "),ou(47,"\n "),_s(48,"div",14),ou(49,"\n "),_s(50,"app-button",15,16),Ls("action",function(){return t.reset()}),ou(52),Vl(53,"translate"),ys(),ou(54,"\n "),ys(),ou(55,"\n "),ys(),ou(56,"\n "),ys(),ou(57,"\n "),ou(58,"\n "),bs(59,"div",17),ou(60,"\n"),ys(),ou(61,"\n")),2&e&&(gs("headline",Ul(1,14,"reset.title")),Pa(7),gs("formGroup",t.form),Pa(6),su(Ul(14,16,"reset.wallet-label")),Pa(4),gs("ngClass",Rl(26,$j,t.busy)),Pa(6),su(Ul(24,18,"reset.seed-label")),Pa(3),gs("appFormFieldError",t.seedErrorMsg),cs("disabled",t.busy?"true":null),Pa(6),su(Ul(33,20,"reset.password-label")),Pa(3),cs("disabled",t.busy?"true":null),Pa(6),su(Ul(42,22,"reset.confirm-label")),Pa(3),gs("appFormFieldError",t.passwordErrorMsg),cs("disabled",t.busy?"true":null),Pa(6),gs("disabled",!t.form.valid),Pa(2),uu("\n ",Ul(53,24,"reset.reset-button"),"\n "))},directives:[xA,wk,pM,Xw,bk,wM,lh,QD,XD,gC],pipes:[oS],styles:[""]}),e}()}],tN=function(){function e(){}return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[aD.forRoot(eN,{useHash:!0})],aD]}),e}(),nN=function(){function e(){}return e.prototype.getTranslation=function(e){return se(n("5ey7")("./"+e+".json"))},e}(),iN=function(){function e(){}return e.\u0275mod=pt({type:e}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},imports:[[sS.forRoot({loader:{provide:BM,useClass:nN}})],sS]}),e}(),rN=function(){function e(){}return e.\u0275mod=pt({type:e,bootstrap:[gD]}),e.\u0275inj=Pe({factory:function(t){return new(t||e)},providers:[Bp,qp,TO,OF,ZP,_P,bP,yP,jI,Bw,SC,jw,Fw,Hw,DC,LC,HC,Lh,ix,NO,WO,LO,oF,zA,{provide:mS,useValue:{_forceAnimations:!0}}],imports:[[iN,tN,mf,Yp,zS,SY,Iw,xY,LY,lC,jY,BY,HP,sA,_S,cI,dI,hI,ZD,DD,HI,DI,Db,DM]]}),e}();ct(gP,[xA,dh,fh,KD,lh,MY,US],[oS,pR,yS]),ct(DF,[fh,JP,lh,wk,pM,cR,jR,uC,KD,GA,Xw,bk,wM,QD,CM,wh,LD,gC,II],[oS,yS,Lh]),ct(zC,[AM,fh,jS,wk,pM,HY,Xw,LI,bk,wM,QD,wI,dh,pw,gC],[oS,xh]),function(){if(Xc)throw new Error("Cannot enable prod mode after platform setup.");Qc=!1}(),ff().bootstrapModule(rN,{preserveWhitespaces:!0})},zx6S:function(e,t,n){!function(e){"use strict";var t={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,n,i){var r=t.words[i];return 1===i.length?n?r[0]:r[1]:e+" "+t.correctGrammaticalCase(e,r)}};e.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("wd/R"))}},[[0,0]]]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.c10691d5e28b636af8ce.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.c10691d5e28b636af8ce.js new file mode 100644 index 0000000000..fc944c66f9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/main.c10691d5e28b636af8ce.js @@ -0,0 +1 @@ +(self.webpackChunkdesktopwallet=self.webpackChunkdesktopwallet||[]).push([[179],{98255:function(e){function t(e){return Promise.resolve().then(function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t})}t.keys=function(){return[]},t.resolve=t,t.id=98255,e.exports=t},61295:function(e,t,n){var i=n(27015).Buffer;e.exports=function(e){if(e.length>=255)throw new TypeError("Alphabet too long");var t=new Uint8Array(256);t.fill(255);for(var n=0;n>>0,c=new Uint8Array(l);e[n];){var d=t[e.charCodeAt(n)];if(255===d)return;for(var h=0,f=l-1;(0!==d||h>>0)%256>>>0,d=d/256>>>0;if(0!==d)throw new Error("Non-zero carry");a=h,n++}if(" "!==e[n]){for(var p=l-a;p!==l&&0===c[p];)p++;var m=i.allocUnsafe(r+(l-p));m.fill(0,0,r);for(var g=r;p!==l;)m[g++]=c[p++];return m}}}return{encode:function(t){if(!i.isBuffer(t))throw new TypeError("Expected Buffer");if(0===t.length)return"";for(var n=0,r=0,a=0,u=t.length;a!==u&&0===t[a];)a++,n++;for(var c=(u-a)*l+1>>>0,d=new Uint8Array(c);a!==u;){for(var h=t[a],f=0,p=c-1;(0!==h||f>>0)%o>>>0,h=h/o>>>0;if(0!==h)throw new Error("Non-zero carry");r=f,a++}for(var m=c-r;m!==c&&0===d[m];)m++;for(var g=s.repeat(n);m0?o-4:o;for(n=0;n>16&255,l[c++]=t>>8&255,l[c++]=255&t;return 2===s&&(t=i[e.charCodeAt(n)]<<2|i[e.charCodeAt(n+1)]>>4,l[c++]=255&t),1===s&&(t=i[e.charCodeAt(n)]<<10|i[e.charCodeAt(n+1)]<<4|i[e.charCodeAt(n+2)]>>2,l[c++]=t>>8&255,l[c++]=255&t),l},t.fromByteArray=function(e){for(var t,i=e.length,r=i%3,a=[],o=16383,s=0,u=i-r;su?u:s+o));return 1===r?a.push(n[(t=e[i-1])>>2]+n[t<<4&63]+"=="):2===r&&a.push(n[(t=(e[i-2]<<8)+e[i-1])>>10]+n[t>>4&63]+n[t<<2&63]+"="),a.join("")};for(var n=[],i=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,s=a.length;o0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function l(e,t,i){for(var r,a=[],o=t;o>18&63]+n[r>>12&63]+n[r>>6&63]+n[63&r]);return a.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},61287:function(e,t,n){var i;!function(r){"use strict";var a,o=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,s=Math.ceil,u=Math.floor,l="[BigNumber Error] ",c=l+"Number primitive has more than 15 significant digits: ",d=1e14,h=14,f=9007199254740991,p=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],m=1e7,g=1e9;function v(e){var t=0|e;return e>0||e===t?t:t-1}function _(e){for(var t,n,i=1,r=e.length,a=e[0]+"";il^n?1:-1;for(s=(u=r.length)<(l=a.length)?u:l,o=0;oa[o]^n?1:-1;return u==l?0:u>l^n?1:-1}function b(e,t,n,i){if(en||e!==(e<0?s(e):u(e)))throw Error(l+(i||"Argument")+("number"==typeof e?en?" out of range: ":" not an integer: ":" not a primitive number: ")+e)}function w(e){return"[object Array]"==Object.prototype.toString.call(e)}function k(e){var t=e.c.length-1;return v(e.e/h)==t&&e.c[t]%2!=0}function M(e,t){return(e.length>1?e.charAt(0)+"."+e.slice(1):e)+(t<0?"e":"e+")+t}function S(e,t,n){var i,r;if(t<0){for(r=n+".";++t;r+=n);e=r+e}else if(++t>(i=e.length)){for(r=n,t-=i;--t;r+=n);e+=r}else t=10;d/=10,l++);return v.e=l,void(v.c=[e])}g=e+""}else{if(!o.test(g=e+""))return r(v,g,p);v.s=45==g.charCodeAt(0)?(g=g.slice(1),-1):1}(l=g.indexOf("."))>-1&&(g=g.replace(".","")),(d=g.search(/e/i))>0?(l<0&&(l=d),l+=+g.slice(d+1),g=g.substring(0,d)):l<0&&(l=g.length)}else{if(b(t,2,V.length,"Base"),g=e+"",10==t)return K(v=new U(e instanceof U?e:g),P+v.e+1,A);if(p="number"==typeof e){if(0*e!=0)return r(v,g,p,t);if(v.s=1/e<0?(g=g.slice(1),-1):1,U.DEBUG&&g.replace(/^0\.0*|\./,"").length>15)throw Error(c+e);p=!1}else v.s=45===g.charCodeAt(0)?(g=g.slice(1),-1):1;for(n=V.slice(0,t),l=d=0,m=g.length;dl){l=m;continue}}else if(!s&&(g==g.toUpperCase()&&(g=g.toLowerCase())||g==g.toLowerCase()&&(g=g.toUpperCase()))){s=!0,d=-1,l=0;continue}return r(v,e+"",p,t)}(l=(g=i(g,t,10,v.s)).indexOf("."))>-1?g=g.replace(".",""):l=g.length}for(d=0;48===g.charCodeAt(d);d++);for(m=g.length;48===g.charCodeAt(--m););if(g=g.slice(d,++m)){if(m-=d,p&&U.DEBUG&&m>15&&(e>f||e!==u(e)))throw Error(c+v.s*e);if((l=l-d-1)>H)v.c=v.e=null;else if(ls){if(--t>0)for(u+=".";t--;u+="0");}else if((t+=a-s)>0)for(a+1==s&&(u+=".");t--;u+="0");return e.s<0&&r?"-"+u:u}function q(e,t){var n,i,r=0;for(w(e[0])&&(e=e[0]),n=new U(e[0]);++r=10;r/=10,i++);return(n=i+n*h-1)>H?e.c=e.e=null:n=10;l/=10,r++);if((a=t-r)<0)a+=h,m=(c=g[f=0])/v[r-(o=t)-1]%10|0;else if((f=s((a+1)/h))>=g.length){if(!i)break e;for(;g.length<=f;g.push(0));c=m=0,r=1,o=(a%=h)-h+1}else{for(c=l=g[f],r=1;l>=10;l/=10,r++);m=(o=(a%=h)-h+r)<0?0:c/v[r-o-1]%10|0}if(i=i||t<0||null!=g[f+1]||(o<0?c:c%v[r-o-1]),i=n<4?(m||i)&&(0==n||n==(e.s<0?3:2)):m>5||5==m&&(4==n||i||6==n&&(a>0?o>0?c/v[r-o]:0:g[f-1])%10&1||n==(e.s<0?8:7)),t<1||!g[0])return g.length=0,i?(g[0]=v[(h-(t-=e.e+1)%h)%h],e.e=-t||0):g[0]=e.e=0,e;if(0==a?(g.length=f,l=1,f--):(g.length=f+1,l=v[h-a],g[f]=o>0?u(c/v[r-o]%v[o])*l:0),i)for(;;){if(0==f){for(a=1,o=g[0];o>=10;o/=10,a++);for(o=g[0]+=l,l=1;o>=10;o/=10,l++);a!=l&&(e.e++,g[0]==d&&(g[0]=1));break}if(g[f]+=l,g[f]!=d)break;g[f--]=0,l=1}for(a=g.length;0===g[--a];g.pop());}e.e>H?e.c=e.e=null:e.e>>11))>=9e15?(n=crypto.getRandomValues(new Uint32Array(2)),t[o]=n[0],t[o+1]=n[1]):(c.push(a%1e14),o+=2);o=r/2}else{if(!crypto.randomBytes)throw j=!1,Error(l+"crypto unavailable");for(t=crypto.randomBytes(r*=7);o=9e15?crypto.randomBytes(7).copy(t,o):(c.push(a%1e14),o+=7);o=r/7}if(!j)for(;o=10;a/=10,o++);on-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/n|0,o[r]%=n)}return o.reverse()}return function(i,r,a,o,s){var u,l,c,d,h,f,p,m,g=i.indexOf("."),v=P,y=A;for(g>=0&&(d=B,B=0,i=i.replace(".",""),f=(m=new U(r)).pow(i.length-g),B=d,m.c=t(S(_(f.c),f.e,"0"),10,a,e),m.e=m.c.length),c=d=(p=t(i,r,a,s?(u=V,e):(u=e,V))).length;0==p[--d];p.pop());if(!p[0])return u.charAt(0);if(g<0?--c:(f.c=p,f.e=c,f.s=o,p=(f=n(f,m,v,y,a)).c,h=f.r,c=f.e),g=p[l=c+v+1],d=a/2,h=h||l<0||null!=p[l+1],h=y<4?(null!=g||h)&&(0==y||y==(f.s<0?3:2)):g>d||g==d&&(4==y||h||6==y&&1&p[l-1]||y==(f.s<0?8:7)),l<1||!p[0])i=h?S(u.charAt(1),-v,u.charAt(0)):u.charAt(0);else{if(p.length=l,h)for(--a;++p[--l]>a;)p[l]=0,l||(++c,p=[1].concat(p));for(d=p.length;!p[--d];);for(g=0,i="";g<=d;i+=u.charAt(p[g++]));i=S(i,c,u.charAt(0))}return i}}(),n=function(){function e(e,t,n){var i,r,a,o,s=0,u=e.length,l=t%m,c=t/m|0;for(e=e.slice();u--;)s=((r=l*(a=e[u]%m)+(i=c*a+(o=e[u]/m|0)*l)%m*m+s)/n|0)+(i/m|0)+c*o,e[u]=r%n;return s&&(e=[s].concat(e)),e}function t(e,t,n,i){var r,a;if(n!=i)a=n>i?1:-1;else for(r=a=0;rt[r]?1:-1;break}return a}function n(e,t,n,i){for(var r=0;n--;)e[n]-=r,e[n]=(r=e[n]1;e.splice(0,1));}return function(i,r,a,o,s){var l,c,f,p,m,g,_,y,b,w,k,M,S,C,L,x,T,D=i.s==r.s?1:-1,O=i.c,E=r.c;if(!(O&&O[0]&&E&&E[0]))return new U(i.s&&r.s&&(O?!E||O[0]!=E[0]:E)?O&&0==O[0]||!E?0*D:D/0:NaN);for(b=(y=new U(D)).c=[],D=a+(c=i.e-r.e)+1,s||(s=d,c=v(i.e/h)-v(r.e/h),D=D/h|0),f=0;E[f]==(O[f]||0);f++);if(E[f]>(O[f]||0)&&c--,D<0)b.push(1),p=!0;else{for(C=O.length,x=E.length,f=0,D+=2,(m=u(s/(E[0]+1)))>1&&(E=e(E,m,s),O=e(O,m,s),x=E.length,C=O.length),S=x,k=(w=O.slice(0,x)).length;k=s/2&&L++;do{if(m=0,(l=t(E,w,x,k))<0){if(M=w[0],x!=k&&(M=M*s+(w[1]||0)),(m=u(M/L))>1)for(m>=s&&(m=s-1),_=(g=e(E,m,s)).length,k=w.length;1==t(g,w,_,k);)m--,n(g,x<_?T:E,_,s),_=g.length,l=1;else 0==m&&(l=m=1),_=(g=E.slice()).length;if(_=10;D/=10,f++);K(y,a+(y.e=f+c*h-1)+1,o,p)}else y.e=c,y.r=+p;return y}}(),L=/^(-?)0([xbo])(?=\w[\w.]*$)/i,x=/^([^.]+)\.$/,T=/^\.([^.]+)$/,D=/^-?(Infinity|NaN)$/,O=/^\s*\+(?=[\w.])|^\s+|\s+$/g,r=function(e,t,n,i){var r,a=n?t:t.replace(O,"");if(D.test(a))e.s=isNaN(a)?null:a<0?-1:1,e.c=e.e=null;else{if(!n&&(a=a.replace(L,function(e,t,n){return r="x"==(n=n.toLowerCase())?16:"b"==n?2:8,i&&i!=r?e:t}),i&&(r=i,a=a.replace(x,"$1").replace(T,"0.$1")),t!=a))return new U(a,r);if(U.DEBUG)throw Error(l+"Not a"+(i?" base "+i:"")+" number: "+t);e.c=e.e=e.s=null}},E.absoluteValue=E.abs=function(){var e=new U(this);return e.s<0&&(e.s=1),e},E.comparedTo=function(e,t){return y(this,new U(e,t))},E.decimalPlaces=E.dp=function(e,t){var n,i,r,a=this;if(null!=e)return b(e,0,g),null==t?t=A:b(t,0,8),K(new U(a),e+a.e+1,t);if(!(n=a.c))return null;if(i=((r=n.length-1)-v(this.e/h))*h,r=n[r])for(;r%10==0;r/=10,i--);return i<0&&(i=0),i},E.dividedBy=E.div=function(e,t){return n(this,new U(e,t),P,A)},E.dividedToIntegerBy=E.idiv=function(e,t){return n(this,new U(e,t),0,1)},E.exponentiatedBy=E.pow=function(e,t){var n,i,r,a,o,c,d,f=this;if((e=new U(e)).c&&!e.isInteger())throw Error(l+"Exponent not an integer: "+e);if(null!=t&&(t=new U(t)),a=e.e>14,!f.c||!f.c[0]||1==f.c[0]&&!f.e&&1==f.c.length||!e.c||!e.c[0])return d=new U(Math.pow(+f.valueOf(),a?2-k(e):+e)),t?d.mod(t):d;if(o=e.s<0,t){if(t.c?!t.c[0]:!t.s)return new U(NaN);(i=!o&&f.isInteger()&&t.isInteger())&&(f=f.mod(t))}else{if(e.e>9&&(f.e>0||f.e<-1||(0==f.e?f.c[0]>1||a&&f.c[1]>=24e7:f.c[0]<8e13||a&&f.c[0]<=9999975e7)))return r=f.s<0&&k(e)?-0:0,f.e>-1&&(r=1/r),new U(o?1/r:r);B&&(r=s(B/h+2))}for(a?(n=new U(.5),c=k(e)):c=e%2,o&&(e.s=1),d=new U(Y);;){if(c){if(!(d=d.times(f)).c)break;r?d.c.length>r&&(d.c.length=r):i&&(d=d.mod(t))}if(a){if(K(e=e.times(n),e.e+1,1),!e.c[0])break;a=e.e>14,c=k(e)}else{if(!(e=u(e/2)))break;c=e%2}f=f.times(f),r?f.c&&f.c.length>r&&(f.c.length=r):i&&(f=f.mod(t))}return i?d:(o&&(d=Y.div(d)),t?d.mod(t):r?K(d,B,A,void 0):d)},E.integerValue=function(e){var t=new U(this);return null==e?e=A:b(e,0,8),K(t,t.e+1,e)},E.isEqualTo=E.eq=function(e,t){return 0===y(this,new U(e,t))},E.isFinite=function(){return!!this.c},E.isGreaterThan=E.gt=function(e,t){return y(this,new U(e,t))>0},E.isGreaterThanOrEqualTo=E.gte=function(e,t){return 1===(t=y(this,new U(e,t)))||0===t},E.isInteger=function(){return!!this.c&&v(this.e/h)>this.c.length-2},E.isLessThan=E.lt=function(e,t){return y(this,new U(e,t))<0},E.isLessThanOrEqualTo=E.lte=function(e,t){return-1===(t=y(this,new U(e,t)))||0===t},E.isNaN=function(){return!this.s},E.isNegative=function(){return this.s<0},E.isPositive=function(){return this.s>0},E.isZero=function(){return!!this.c&&0==this.c[0]},E.minus=function(e,t){var n,i,r,a,o=this,s=o.s;if(t=(e=new U(e,t)).s,!s||!t)return new U(NaN);if(s!=t)return e.s=-t,o.plus(e);var u=o.e/h,l=e.e/h,c=o.c,f=e.c;if(!u||!l){if(!c||!f)return c?(e.s=-t,e):new U(f?o:NaN);if(!c[0]||!f[0])return f[0]?(e.s=-t,e):new U(c[0]?o:3==A?-0:0)}if(u=v(u),l=v(l),c=c.slice(),s=u-l){for((a=s<0)?(s=-s,r=c):(l=u,r=f),r.reverse(),t=s;t--;r.push(0));r.reverse()}else for(i=(a=(s=c.length)<(t=f.length))?s:t,s=t=0;t0)for(;t--;c[n++]=0);for(t=d-1;i>s;){if(c[--i]=0;){for(n=0,p=M[r]%b,g=M[r]/b|0,a=r+(o=u);a>r;)n=((l=p*(l=k[--o]%b)+(s=g*l+(c=k[o]/b|0)*p)%b*b+_[a]+n)/y|0)+(s/b|0)+g*c,_[a--]=l%y;_[a]=n}return n?++i:_.splice(0,1),G(e,_,i)},E.negated=function(){var e=new U(this);return e.s=-e.s||null,e},E.plus=function(e,t){var n,i=this,r=i.s;if(t=(e=new U(e,t)).s,!r||!t)return new U(NaN);if(r!=t)return e.s=-t,i.minus(e);var a=i.e/h,o=e.e/h,s=i.c,u=e.c;if(!a||!o){if(!s||!u)return new U(r/0);if(!s[0]||!u[0])return u[0]?e:new U(s[0]?i:0*r)}if(a=v(a),o=v(o),s=s.slice(),r=a-o){for(r>0?(o=a,n=u):(r=-r,n=s),n.reverse();r--;n.push(0));n.reverse()}for((r=s.length)-(t=u.length)<0&&(n=u,u=s,s=n,t=r),r=0;t;)r=(s[--t]=s[t]+u[t]+r)/d|0,s[t]=d===s[t]?0:s[t]%d;return r&&(s=[r].concat(s),++o),G(e,s,o)},E.precision=E.sd=function(e,t){var n,i,r,a=this;if(null!=e&&e!==!!e)return b(e,1,g),null==t?t=A:b(t,0,8),K(new U(a),e,t);if(!(n=a.c))return null;if(i=(r=n.length-1)*h+1,r=n[r]){for(;r%10==0;r/=10,i--);for(r=n[0];r>=10;r/=10,i++);}return e&&a.e+1>i&&(i=a.e+1),i},E.shiftedBy=function(e){return b(e,-9007199254740991,f),this.times("1e"+e)},E.squareRoot=E.sqrt=function(){var e,t,i,r,a,o=this,s=o.c,u=o.s,l=o.e,c=P+4,d=new U("0.5");if(1!==u||!s||!s[0])return new U(!u||u<0&&(!s||s[0])?NaN:s?o:1/0);if(0==(u=Math.sqrt(+o))||u==1/0?(((t=_(s)).length+l)%2==0&&(t+="0"),u=Math.sqrt(t),l=v((l+1)/2)-(l<0||l%2),i=new U(t=u==1/0?"1e"+l:(t=u.toExponential()).slice(0,t.indexOf("e")+1)+l)):i=new U(u+""),i.c[0])for((u=(l=i.e)+c)<3&&(u=0);;)if(i=d.times((a=i).plus(n(o,a,c,1))),_(a.c).slice(0,u)===(t=_(i.c)).slice(0,u)){if(i.e0&&h>0){for(u=d.substr(0,i=h%a||a);i0&&(u+=s+d.slice(i)),c&&(u="-"+u)}n=l?u+W.decimalSeparator+((o=+W.fractionGroupSize)?l.replace(new RegExp("\\d{"+o+"}\\B","g"),"$&"+W.fractionGroupSeparator):l):u}return n},E.toFraction=function(e){var t,i,r,a,o,s,u,c,d,f,m,g,v=this,y=v.c;if(null!=e&&(!(c=new U(e)).isInteger()&&(c.c||1!==c.s)||c.lt(Y)))throw Error(l+"Argument "+(c.isInteger()?"out of range: ":"not an integer: ")+e);if(!y)return v.toString();for(i=new U(Y),f=r=new U(Y),a=d=new U(Y),g=_(y),s=i.e=g.length-v.e-1,i.c[0]=p[(u=s%h)<0?h+u:u],e=!e||c.comparedTo(i)>0?s>0?i:f:c,u=H,H=1/0,c=new U(g),d.c[0]=0;m=n(c,i,0,1),1!=(o=r.plus(m.times(a))).comparedTo(e);)r=a,a=o,f=d.plus(m.times(o=f)),d=o,i=c.minus(m.times(o=i)),c=o;return o=n(e.minus(r),a,0,1),d=d.plus(o.times(f)),r=r.plus(o.times(a)),d.s=f.s=v.s,t=n(f,a,s*=2,A).minus(v).abs().comparedTo(n(d,r,s,A).minus(v).abs())<1?[f.toString(),a.toString()]:[d.toString(),r.toString()],H=u,t},E.toNumber=function(){return+this},E.toPrecision=function(e,t){return null!=e&&b(e,1,g),z(this,e,t,2)},E.toString=function(e){var t,n=this,r=n.s,a=n.e;return null===a?r?(t="Infinity",r<0&&(t="-"+t)):t="NaN":(t=_(n.c),null==e?t=a<=I||a>=R?M(t,a):S(t,a,"0"):(b(e,2,V.length,"Base"),t=i(S(t,a,"0"),10,e,r,!0)),r<0&&n.c[0]&&(t="-"+t)),t},E.valueOf=E.toJSON=function(){var e,t=this,n=t.e;return null===n?t.toString():(e=_(t.c),e=n<=I||n>=R?M(e,n):S(e,n,"0"),t.s<0?"-"+e:e)},E._isBigNumber=!0,null!=t&&U.set(t),U}()).default=a.BigNumber=a,void 0===(i=(function(){return a}).call(t,n,t,e))||(e.exports=i)}()},23833:function(e,t,n){"use strict";var i=n(26698),r=n(42390),a="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;t.Buffer=u,t.SlowBuffer=function(e){return+e!=e&&(e=0),u.alloc(+e)},t.INSPECT_MAX_BYTES=50;var o=2147483647;function s(e){if(e>o)throw new RangeError('The value "'+e+'" is invalid for option "size"');var t=new Uint8Array(e);return Object.setPrototypeOf(t,u.prototype),t}function u(e,t,n){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return d(e)}return l(e,t,n)}function l(e,t,n){if("string"==typeof e)return function(e,t){if("string"==typeof t&&""!==t||(t="utf8"),!u.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var n=0|m(e,t),i=s(n),r=i.write(e,t);return r!==n&&(i=i.slice(0,r)),i}(e,t);if(ArrayBuffer.isView(e))return function(e){if(B(e,Uint8Array)){var t=new Uint8Array(e);return f(t.buffer,t.byteOffset,t.byteLength)}return h(e)}(e);if(null==e)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(B(e,ArrayBuffer)||e&&B(e.buffer,ArrayBuffer))return f(e,t,n);if("undefined"!=typeof SharedArrayBuffer&&(B(e,SharedArrayBuffer)||e&&B(e.buffer,SharedArrayBuffer)))return f(e,t,n);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');var i=e.valueOf&&e.valueOf();if(null!=i&&i!==e)return u.from(i,t,n);var r=function(e){if(u.isBuffer(e)){var t=0|p(e.length),n=s(t);return 0===n.length||e.copy(n,0,0,t),n}return void 0!==e.length?"number"!=typeof e.length||W(e.length)?s(0):h(e):"Buffer"===e.type&&Array.isArray(e.data)?h(e.data):void 0}(e);if(r)return r;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof e[Symbol.toPrimitive])return u.from(e[Symbol.toPrimitive]("string"),t,n);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}function c(e){if("number"!=typeof e)throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function d(e){return c(e),s(e<0?0:0|p(e))}function h(e){for(var t=e.length<0?0:0|p(e.length),n=s(t),i=0;i=o)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o.toString(16)+" bytes");return 0|e}function m(e,t){if(u.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||B(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);var n=e.length,i=arguments.length>2&&!0===arguments[2];if(!i&&0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return H(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return j(e).length;default:if(r)return i?-1:H(e).length;t=(""+t).toLowerCase(),r=!0}}function g(e,t,n){var i=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return O(this,t,n);case"utf8":case"utf-8":return L(this,t,n);case"ascii":return T(this,t,n);case"latin1":case"binary":return D(this,t,n);case"base64":return C(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,t,n);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function v(e,t,n){var i=e[t];e[t]=e[n],e[n]=i}function _(e,t,n,i,r){if(0===e.length)return-1;if("string"==typeof n?(i=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),W(n=+n)&&(n=r?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(r)return-1;n=e.length-1}else if(n<0){if(!r)return-1;n=0}if("string"==typeof t&&(t=u.from(t,i)),u.isBuffer(t))return 0===t.length?-1:y(e,t,n,i,r);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,i,r);throw new TypeError("val must be string, number or Buffer")}function y(e,t,n,i,r){var a,o=1,s=e.length,u=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;o=2,s/=2,u/=2,n/=2}function l(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}if(r){var c=-1;for(a=n;as&&(n=s-u),a=n;a>=0;a--){for(var d=!0,h=0;hr&&(i=r):i=r;var a=t.length;i>a/2&&(i=a/2);for(var o=0;o>8,r.push(n%256),r.push(i);return r}(t,e.length-n),e,n,i)}function C(e,t,n){return i.fromByteArray(0===t&&n===e.length?e:e.slice(t,n))}function L(e,t,n){n=Math.min(e.length,n);for(var i=[],r=t;r239?4:l>223?3:l>191?2:1;if(r+d<=n)switch(d){case 1:l<128&&(c=l);break;case 2:128==(192&(a=e[r+1]))&&(u=(31&l)<<6|63&a)>127&&(c=u);break;case 3:o=e[r+2],128==(192&(a=e[r+1]))&&128==(192&o)&&(u=(15&l)<<12|(63&a)<<6|63&o)>2047&&(u<55296||u>57343)&&(c=u);break;case 4:o=e[r+2],s=e[r+3],128==(192&(a=e[r+1]))&&128==(192&o)&&128==(192&s)&&(u=(15&l)<<18|(63&a)<<12|(63&o)<<6|63&s)>65535&&u<1114112&&(c=u)}null===c?(c=65533,d=1):c>65535&&(i.push((c-=65536)>>>10&1023|55296),c=56320|1023&c),i.push(c),r+=d}return function(e){var t=e.length;if(t<=x)return String.fromCharCode.apply(String,e);for(var n="",i=0;ii.length?u.from(a).copy(i,r):Uint8Array.prototype.set.call(i,a,r);else{if(!u.isBuffer(a))throw new TypeError('"list" argument must be an Array of Buffers');a.copy(i,r)}r+=a.length}return i},u.byteLength=m,u.prototype._isBuffer=!0,u.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;tn&&(e+=" ... "),""},a&&(u.prototype[a]=u.prototype.inspect),u.prototype.compare=function(e,t,n,i,r){if(B(e,Uint8Array)&&(e=u.from(e,e.offset,e.byteLength)),!u.isBuffer(e))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===i&&(i=0),void 0===r&&(r=this.length),t<0||n>e.length||i<0||r>this.length)throw new RangeError("out of range index");if(i>=r&&t>=n)return 0;if(i>=r)return-1;if(t>=n)return 1;if(this===e)return 0;for(var a=(r>>>=0)-(i>>>=0),o=(n>>>=0)-(t>>>=0),s=Math.min(a,o),l=this.slice(i,r),c=e.slice(t,n),d=0;d>>=0,isFinite(n)?(n>>>=0,void 0===i&&(i="utf8")):(i=n,n=void 0)}var r=this.length-t;if((void 0===n||n>r)&&(n=r),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var a=!1;;)switch(i){case"hex":return b(this,e,t,n);case"utf8":case"utf-8":return w(this,e,t,n);case"ascii":case"latin1":case"binary":return k(this,e,t,n);case"base64":return M(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,n);default:if(a)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),a=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var x=4096;function T(e,t,n){var i="";n=Math.min(e.length,n);for(var r=t;ri)&&(n=i);for(var r="",a=t;an)throw new RangeError("Trying to access beyond buffer length")}function P(e,t,n,i,r,a){if(!u.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||te.length)throw new RangeError("Index out of range")}function A(e,t,n,i,r,a){if(n+i>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function I(e,t,n,i,a){return t=+t,n>>>=0,a||A(e,0,n,4),r.write(e,t,n,i,23,4),n+4}function R(e,t,n,i,a){return t=+t,n>>>=0,a||A(e,0,n,8),r.write(e,t,n,i,52,8),n+8}u.prototype.slice=function(e,t){var n=this.length;(e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t>>=0,t>>>=0,n||Y(e,t,this.length);for(var i=this[e],r=1,a=0;++a>>=0,t>>>=0,n||Y(e,t,this.length);for(var i=this[e+--t],r=1;t>0&&(r*=256);)i+=this[e+--t]*r;return i},u.prototype.readUint8=u.prototype.readUInt8=function(e,t){return e>>>=0,t||Y(e,1,this.length),this[e]},u.prototype.readUint16LE=u.prototype.readUInt16LE=function(e,t){return e>>>=0,t||Y(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUint16BE=u.prototype.readUInt16BE=function(e,t){return e>>>=0,t||Y(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUint32LE=u.prototype.readUInt32LE=function(e,t){return e>>>=0,t||Y(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUint32BE=u.prototype.readUInt32BE=function(e,t){return e>>>=0,t||Y(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e>>>=0,t>>>=0,n||Y(e,t,this.length);for(var i=this[e],r=1,a=0;++a=(r*=128)&&(i-=Math.pow(2,8*t)),i},u.prototype.readIntBE=function(e,t,n){e>>>=0,t>>>=0,n||Y(e,t,this.length);for(var i=t,r=1,a=this[e+--i];i>0&&(r*=256);)a+=this[e+--i]*r;return a>=(r*=128)&&(a-=Math.pow(2,8*t)),a},u.prototype.readInt8=function(e,t){return e>>>=0,t||Y(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){e>>>=0,t||Y(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){e>>>=0,t||Y(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return e>>>=0,t||Y(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return e>>>=0,t||Y(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return e>>>=0,t||Y(e,4,this.length),r.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return e>>>=0,t||Y(e,4,this.length),r.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return e>>>=0,t||Y(e,8,this.length),r.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return e>>>=0,t||Y(e,8,this.length),r.read(this,e,!1,52,8)},u.prototype.writeUintLE=u.prototype.writeUIntLE=function(e,t,n,i){e=+e,t>>>=0,n>>>=0,i||P(this,e,t,n,Math.pow(2,8*n)-1,0);var r=1,a=0;for(this[t]=255&e;++a>>=0,n>>>=0,i||P(this,e,t,n,Math.pow(2,8*n)-1,0);var r=n-1,a=1;for(this[t+r]=255&e;--r>=0&&(a*=256);)this[t+r]=e/a&255;return t+n},u.prototype.writeUint8=u.prototype.writeUInt8=function(e,t,n){return e=+e,t>>>=0,n||P(this,e,t,1,255,0),this[t]=255&e,t+1},u.prototype.writeUint16LE=u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t>>>=0,n||P(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},u.prototype.writeUint16BE=u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t>>>=0,n||P(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},u.prototype.writeUint32LE=u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t>>>=0,n||P(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},u.prototype.writeUint32BE=u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t>>>=0,n||P(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},u.prototype.writeIntLE=function(e,t,n,i){if(e=+e,t>>>=0,!i){var r=Math.pow(2,8*n-1);P(this,e,t,n,r-1,-r)}var a=0,o=1,s=0;for(this[t]=255&e;++a>0)-s&255;return t+n},u.prototype.writeIntBE=function(e,t,n,i){if(e=+e,t>>>=0,!i){var r=Math.pow(2,8*n-1);P(this,e,t,n,r-1,-r)}var a=n-1,o=1,s=0;for(this[t+a]=255&e;--a>=0&&(o*=256);)e<0&&0===s&&0!==this[t+a+1]&&(s=1),this[t+a]=(e/o>>0)-s&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t>>>=0,n||P(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t>>>=0,n||P(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t>>>=0,n||P(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t>>>=0,n||P(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t>>>=0,n||P(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},u.prototype.writeFloatLE=function(e,t,n){return I(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return I(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return R(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return R(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,i){if(!u.isBuffer(e))throw new TypeError("argument should be a Buffer");if(n||(n=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i=this.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(a=t;a55295&&n<57344){if(!r){if(n>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(o+1===i){(t-=3)>-1&&a.push(239,191,189);continue}r=n;continue}if(n<56320){(t-=3)>-1&&a.push(239,191,189),r=n;continue}n=65536+(r-55296<<10|n-56320)}else r&&(t-=3)>-1&&a.push(239,191,189);if(r=null,n<128){if((t-=1)<0)break;a.push(n)}else if(n<2048){if((t-=2)<0)break;a.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;a.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return a}function j(e){return i.toByteArray(function(e){if((e=(e=e.split("=")[0]).trim().replace(F,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function N(e,t,n,i){for(var r=0;r=t.length||r>=e.length);++r)t[r+n]=e[r];return r}function B(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function W(e){return e!=e}var V=function(){for(var e="0123456789abcdef",t=new Array(256),n=0;n<16;++n)for(var i=16*n,r=0;r<16;++r)t[i+r]=e[n]+e[r];return t}()},42390:function(e,t){t.read=function(e,t,n,i,r){var a,o,s=8*r-i-1,u=(1<>1,c=-7,d=n?r-1:0,h=n?-1:1,f=e[t+d];for(d+=h,a=f&(1<<-c)-1,f>>=-c,c+=s;c>0;a=256*a+e[t+d],d+=h,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=i;c>0;o=256*o+e[t+d],d+=h,c-=8);if(0===a)a=1-l;else{if(a===u)return o?NaN:1/0*(f?-1:1);o+=Math.pow(2,i),a-=l}return(f?-1:1)*o*Math.pow(2,a-i)},t.write=function(e,t,n,i,r,a){var o,s,u,l=8*a-r-1,c=(1<>1,h=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,f=i?0:a-1,p=i?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,o=c):(o=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-o))<1&&(o--,u*=2),(t+=o+d>=1?h/u:h*Math.pow(2,1-d))*u>=2&&(o++,u/=2),o+d>=c?(s=0,o=c):o+d>=1?(s=(t*u-1)*Math.pow(2,r),o+=d):(s=t*Math.pow(2,d-1)*Math.pow(2,r),o=0));r>=8;e[n+f]=255&s,f+=p,s/=256,r-=8);for(o=o<0;e[n+f]=255&o,f+=p,o/=256,l-=8);e[n+f-p]|=128*m}},90776:function(e,t,n){!function(e){"use strict";e.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,t,n){return e<12?n?"vm":"VM":n?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(29609))},42758:function(e,t,n){!function(e){"use strict";var t=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},n={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},i=function(e){return function(i,r,a,o){var s=t(i),u=n[e][t(i)];return 2===s&&(u=u[r?0:1]),u.replace(/%d/i,i)}},r=["\u062c\u0627\u0646\u0641\u064a","\u0641\u064a\u0641\u0631\u064a","\u0645\u0627\u0631\u0633","\u0623\u0641\u0631\u064a\u0644","\u0645\u0627\u064a","\u062c\u0648\u0627\u0646","\u062c\u0648\u064a\u0644\u064a\u0629","\u0623\u0648\u062a","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];e.defineLocale("ar-dz",{months:r,monthsShort:r,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,t,n){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:i("s"),ss:i("s"),m:i("m"),mm:i("m"),h:i("h"),hh:i("h"),d:i("d"),dd:i("d"),M:i("M"),MM:i("M"),y:i("y"),yy:i("y")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:0,doy:4}})}(n(29609))},64980:function(e,t,n){!function(e){"use strict";e.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(n(29609))},9602:function(e,t,n){!function(e){"use strict";var t={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},n=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},i={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},r=function(e){return function(t,r,a,o){var s=n(t),u=i[e][n(t)];return 2===s&&(u=u[r?0:1]),u.replace(/%d/i,t)}},a=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];e.defineLocale("ar-ly",{months:a,monthsShort:a,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,t,n){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:r("s"),ss:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n(29609))},52500:function(e,t,n){!function(e){"use strict";e.defineLocale("ar-ma",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(n(29609))},36909:function(e,t,n){!function(e){"use strict";var t={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};e.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,t,n){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return n[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(n(29609))},92735:function(e,t,n){!function(e){"use strict";e.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(n(29609))},67634:function(e,t,n){!function(e){"use strict";var t={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},i=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},r={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},a=function(e){return function(t,n,a,o){var s=i(t),u=r[e][i(t)];return 2===s&&(u=u[n?0:1]),u.replace(/%d/i,t)}},o=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];e.defineLocale("ar",{months:o,monthsShort:o,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,t,n){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:a("s"),ss:a("s"),m:a("m"),mm:a("m"),h:a("h"),hh:a("h"),d:a("d"),dd:a("d"),M:a("M"),MM:a("M"),y:a("y"),yy:a("y")},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return n[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n(29609))},27798:function(e,t,n){!function(e){"use strict";var t={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-\xfcnc\xfc",4:"-\xfcnc\xfc",100:"-\xfcnc\xfc",6:"-nc\u0131",9:"-uncu",10:"-uncu",30:"-uncu",60:"-\u0131nc\u0131",90:"-\u0131nc\u0131"};e.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ert\u0259si_\xc7\u0259r\u015f\u0259nb\u0259 ax\u015fam\u0131_\xc7\u0259r\u015f\u0259nb\u0259_C\xfcm\u0259 ax\u015fam\u0131_C\xfcm\u0259_\u015e\u0259nb\u0259".split("_"),weekdaysShort:"Baz_BzE_\xc7Ax_\xc7\u0259r_CAx_C\xfcm_\u015e\u0259n".split("_"),weekdaysMin:"Bz_BE_\xc7A_\xc7\u0259_CA_C\xfc_\u015e\u0259".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[g\u0259l\u0259n h\u0259ft\u0259] dddd [saat] LT",lastDay:"[d\xfcn\u0259n] LT",lastWeek:"[ke\xe7\u0259n h\u0259ft\u0259] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \u0259vv\u0259l",s:"bir ne\xe7\u0259 saniy\u0259",ss:"%d saniy\u0259",m:"bir d\u0259qiq\u0259",mm:"%d d\u0259qiq\u0259",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gec\u0259|s\u0259h\u0259r|g\xfcnd\xfcz|ax\u015fam/,isPM:function(e){return/^(g\xfcnd\xfcz|ax\u015fam)$/.test(e)},meridiem:function(e,t,n){return e<4?"gec\u0259":e<12?"s\u0259h\u0259r":e<17?"g\xfcnd\xfcz":"ax\u015fam"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0131nc\u0131|inci|nci|\xfcnc\xfc|nc\u0131|uncu)/,ordinal:function(e){if(0===e)return e+"-\u0131nc\u0131";var n=e%10;return e+(t[n]||t[e%100-n]||t[e>=100?100:null])},week:{dow:1,doy:7}})}(n(29609))},29949:function(e,t,n){!function(e){"use strict";function t(e,t,n){return"m"===n?t?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===n?t?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":e+" "+(i=+e,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:t?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[n].split("_"),i%10==1&&i%100!=11?r[0]:i%10>=2&&i%10<=4&&(i%100<10||i%100>=20)?r[1]:r[2]);var i,r}e.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0423\u0443\u045e] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:t,mm:t,h:t,hh:t,d:"\u0434\u0437\u0435\u043d\u044c",dd:t,M:"\u043c\u0435\u0441\u044f\u0446",MM:t,y:"\u0433\u043e\u0434",yy:t},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(e)},meridiem:function(e,t,n){return e<4?"\u043d\u043e\u0447\u044b":e<12?"\u0440\u0430\u043d\u0456\u0446\u044b":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e%10!=2&&e%10!=3||e%100==12||e%100==13?e+"-\u044b":e+"-\u0456";case"D":return e+"-\u0433\u0430";default:return e}},week:{dow:1,doy:7}})}(n(29609))},44590:function(e,t,n){!function(e){"use strict";e.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0443_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u041c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u041c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",w:"\u0441\u0435\u0434\u043c\u0438\u0446\u0430",ww:"%d \u0441\u0435\u0434\u043c\u0438\u0446\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(e){var t=e%10,n=e%100;return 0===e?e+"-\u0435\u0432":0===n?e+"-\u0435\u043d":n>10&&n<20?e+"-\u0442\u0438":1===t?e+"-\u0432\u0438":2===t?e+"-\u0440\u0438":7===t||8===t?e+"-\u043c\u0438":e+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n(29609))},15938:function(e,t,n){!function(e){"use strict";e.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(n(29609))},51942:function(e,t,n){!function(e){"use strict";var t={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},n={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};e.defineLocale("bn-bd",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u09b0\u09be\u09a4|\u09ad\u09cb\u09b0|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be|\u09b0\u09be\u09a4/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===t?e<4?e:e+12:"\u09ad\u09cb\u09b0"===t||"\u09b8\u0995\u09be\u09b2"===t?e:"\u09a6\u09c1\u09aa\u09c1\u09b0"===t?e>=3?e:e+12:"\u09ac\u09bf\u0995\u09be\u09b2"===t||"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u09b0\u09be\u09a4":e<6?"\u09ad\u09cb\u09b0":e<12?"\u09b8\u0995\u09be\u09b2":e<15?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<18?"\u09ac\u09bf\u0995\u09be\u09b2":e<20?"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(n(29609))},60595:function(e,t,n){!function(e){"use strict";var t={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},n={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};e.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===t&&e>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===t&&e<5||"\u09ac\u09bf\u0995\u09be\u09b2"===t?e+12:e},meridiem:function(e,t,n){return e<4?"\u09b0\u09be\u09a4":e<10?"\u09b8\u0995\u09be\u09b2":e<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(n(29609))},4756:function(e,t,n){!function(e){"use strict";var t={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},n={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};e.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b1_\u0f5f\u0fb3\u0f0b2_\u0f5f\u0fb3\u0f0b3_\u0f5f\u0fb3\u0f0b4_\u0f5f\u0fb3\u0f0b5_\u0f5f\u0fb3\u0f0b6_\u0f5f\u0fb3\u0f0b7_\u0f5f\u0fb3\u0f0b8_\u0f5f\u0fb3\u0f0b9_\u0f5f\u0fb3\u0f0b10_\u0f5f\u0fb3\u0f0b11_\u0f5f\u0fb3\u0f0b12".split("_"),monthsShortRegex:/^(\u0f5f\u0fb3\u0f0b\d{1,2})/,monthsParseExact:!0,weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72_\u0f5f\u0fb3_\u0f58\u0f72\u0f42_\u0f63\u0fb7\u0f42_\u0f55\u0f74\u0f62_\u0f66\u0f44\u0f66_\u0f66\u0fa4\u0f7a\u0f53".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(e){return e.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===t&&e>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===t&&e<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===t?e+12:e},meridiem:function(e,t,n){return e<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":e<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":e<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":e<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(n(29609))},17277:function(e,t,n){!function(e){"use strict";function t(e,t,n){return e+" "+function(e,t){return 2===t?function(e){var t={m:"v",b:"v",d:"z"};return void 0===t[e.charAt(0)]?e:t[e.charAt(0)]+e.substring(1)}(e):e}({mm:"munutenn",MM:"miz",dd:"devezh"}[n],e)}function n(e){return e>9?n(e%10):e}var i=[/^gen/i,/^c[\u02bc\']hwe/i,/^meu/i,/^ebr/i,/^mae/i,/^(mez|eve)/i,/^gou/i,/^eos/i,/^gwe/i,/^her/i,/^du/i,/^ker/i],r=/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,a=[/^Su/i,/^Lu/i,/^Me([^r]|$)/i,/^Mer/i,/^Ya/i,/^Gw/i,/^Sa/i];e.defineLocale("br",{months:"Genver_C\u02bchwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C\u02bchwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc\u02bcher_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParse:a,fullWeekdaysParse:[/^sul/i,/^lun/i,/^meurzh/i,/^merc[\u02bc\']her/i,/^yaou/i,/^gwener/i,/^sadorn/i],shortWeekdaysParse:[/^Sul/i,/^Lun/i,/^Meu/i,/^Mer/i,/^Yao/i,/^Gwe/i,/^Sad/i],minWeekdaysParse:a,monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,monthsShortStrictRegex:/^(gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY HH:mm",LLLL:"dddd, D [a viz] MMMM YYYY HH:mm"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc\u02bchoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec\u02bch da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s \u02bczo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:t,h:"un eur",hh:"%d eur",d:"un devezh",dd:t,M:"ur miz",MM:t,y:"ur bloaz",yy:function(e){switch(n(e)){case 1:case 3:case 4:case 5:case 9:return e+" bloaz";default:return e+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(e){return e+(1===e?"a\xf1":"vet")},week:{dow:1,doy:4},meridiemParse:/a.m.|g.m./,isPM:function(e){return"g.m."===e},meridiem:function(e,t,n){return e<12?"a.m.":"g.m."}})}(n(29609))},4166:function(e,t,n){!function(e){"use strict";function t(e,t,n){var i=e+" ";switch(n){case"ss":return i+(1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi");case"m":return t?"jedna minuta":"jedne minute";case"mm":return i+(1===e?"minuta":2===e||3===e||4===e?"minute":"minuta");case"h":return t?"jedan sat":"jednog sata";case"hh":return i+(1===e?"sat":2===e||3===e||4===e?"sata":"sati");case"dd":return i+(1===e?"dan":"dana");case"MM":return i+(1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci");case"yy":return i+(1===e?"godina":2===e||3===e||4===e?"godine":"godina")}}e.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(29609))},13943:function(e,t,n){!function(e){"use strict";e.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(e,t){var n=1===e?"r":2===e?"n":3===e?"r":4===e?"t":"\xe8";return"w"!==t&&"W"!==t||(n="a"),e+n},week:{dow:1,doy:4}})}(n(29609))},53474:function(e,t,n){!function(e){"use strict";var t="leden_\xfanor_b\u0159ezen_duben_kv\u011bten_\u010derven_\u010dervenec_srpen_z\xe1\u0159\xed_\u0159\xedjen_listopad_prosinec".split("_"),n="led_\xfano_b\u0159e_dub_kv\u011b_\u010dvn_\u010dvc_srp_z\xe1\u0159_\u0159\xedj_lis_pro".split("_"),i=[/^led/i,/^\xfano/i,/^b\u0159e/i,/^dub/i,/^kv\u011b/i,/^(\u010dvn|\u010derven$|\u010dervna)/i,/^(\u010dvc|\u010dervenec|\u010dervence)/i,/^srp/i,/^z\xe1\u0159/i,/^\u0159\xedj/i,/^lis/i,/^pro/i],r=/^(leden|\xfanor|b\u0159ezen|duben|kv\u011bten|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|z\xe1\u0159\xed|\u0159\xedjen|listopad|prosinec|led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i;function a(e){return e>1&&e<5&&1!=~~(e/10)}function o(e,t,n,i){var r=e+" ";switch(n){case"s":return t||i?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return t||i?r+(a(e)?"sekundy":"sekund"):r+"sekundami";case"m":return t?"minuta":i?"minutu":"minutou";case"mm":return t||i?r+(a(e)?"minuty":"minut"):r+"minutami";case"h":return t?"hodina":i?"hodinu":"hodinou";case"hh":return t||i?r+(a(e)?"hodiny":"hodin"):r+"hodinami";case"d":return t||i?"den":"dnem";case"dd":return t||i?r+(a(e)?"dny":"dn\xed"):r+"dny";case"M":return t||i?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return t||i?r+(a(e)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):r+"m\u011bs\xedci";case"y":return t||i?"rok":"rokem";case"yy":return t||i?r+(a(e)?"roky":"let"):r+"lety"}}e.defineLocale("cs",{months:t,monthsShort:n,monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(leden|ledna|\xfanora|\xfanor|b\u0159ezen|b\u0159ezna|duben|dubna|kv\u011bten|kv\u011btna|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|srpna|z\xe1\u0159\xed|\u0159\xedjen|\u0159\xedjna|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:o,ss:o,m:o,mm:o,h:o,hh:o,d:o,dd:o,M:o,MM:o,y:o,yy:o},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},92218:function(e,t,n){!function(e){"use strict";e.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(e){return e+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(e)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(e)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(n(29609))},21061:function(e,t,n){!function(e){"use strict";e.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn \xf4l",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(e){var t="";return e>20?t=40===e||50===e||60===e||80===e||100===e?"fed":"ain":e>0&&(t=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][e]),e+t},week:{dow:1,doy:4}})}(n(29609))},82743:function(e,t,n){!function(e){"use strict";e.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8n_man_tir_ons_tor_fre_l\xf8r".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"p\xe5 dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xe5 sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"et \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},28580:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?r[n][0]:r[n][1]}e.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,w:t,ww:"%d Wochen",M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},3264:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?r[n][0]:r[n][1]}e.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,w:t,ww:"%d Wochen",M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},31899:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?r[n][0]:r[n][1]}e.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,w:t,ww:"%d Wochen",M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},98784:function(e,t,n){!function(e){"use strict";var t=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],n=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];e.defineLocale("dv",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(e){return"\u0789\u078a"===e},meridiem:function(e,t,n){return e<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(n(29609))},54654:function(e,t,n){!function(e){"use strict";e.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(e,t){return e?"string"==typeof t&&/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(e,t,n){return e>11?n?"\u03bc\u03bc":"\u039c\u039c":n?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(e){return"\u03bc"===(e+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,t){var n,i=this._calendarEl[e],r=t&&t.hours();return n=i,("undefined"!=typeof Function&&n instanceof Function||"[object Function]"===Object.prototype.toString.call(n))&&(i=i.apply(t)),i.replace("{}",r%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(n(29609))},56277:function(e,t,n){!function(e){"use strict";e.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:0,doy:4}})}(n(29609))},76896:function(e,t,n){!function(e){"use strict";e.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}})}(n(29609))},71609:function(e,t,n){!function(e){"use strict";e.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n(29609))},24557:function(e,t,n){!function(e){"use strict";e.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n(29609))},15836:function(e,t,n){!function(e){"use strict";e.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}})}(n(29609))},30262:function(e,t,n){!function(e){"use strict";e.defineLocale("en-in",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:0,doy:6}})}(n(29609))},43586:function(e,t,n){!function(e){"use strict";e.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n(29609))},38965:function(e,t,n){!function(e){"use strict";e.defineLocale("en-sg",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n(29609))},62777:function(e,t,n){!function(e){"use strict";e.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mart_apr_maj_jun_jul_a\u016dg_sept_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"[la] D[-an de] MMMM, YYYY",LLL:"[la] D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd[n], [la] D[-an de] MMMM, YYYY HH:mm",llll:"ddd, [la] D[-an de] MMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(e){return"p"===e.charAt(0).toLowerCase()},meridiem:function(e,t,n){return e>11?n?"p.t.m.":"P.T.M.":n?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd[n je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasintan] dddd[n je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"kelkaj sekundoj",ss:"%d sekundoj",m:"unu minuto",mm:"%d minutoj",h:"unu horo",hh:"%d horoj",d:"unu tago",dd:"%d tagoj",M:"unu monato",MM:"%d monatoj",y:"unu jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(n(29609))},3128:function(e,t,n){!function(e){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),i=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;e.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n(29609))},69179:function(e,t,n){!function(e){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),i=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;e.defineLocale("es-mx",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:4},invalidDate:"Fecha inv\xe1lida"})}(n(29609))},83256:function(e,t,n){!function(e){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),i=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;e.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(n(29609))},63357:function(e,t,n){!function(e){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),i=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;e.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4},invalidDate:"Fecha inv\xe1lida"})}(n(29609))},2654:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={s:["m\xf5ne sekundi","m\xf5ni sekund","paar sekundit"],ss:[e+"sekundi",e+"sekundit"],m:["\xfche minuti","\xfcks minut"],mm:[e+" minuti",e+" minutit"],h:["\xfche tunni","tund aega","\xfcks tund"],hh:[e+" tunni",e+" tundi"],d:["\xfche p\xe4eva","\xfcks p\xe4ev"],M:["kuu aja","kuu aega","\xfcks kuu"],MM:[e+" kuu",e+" kuud"],y:["\xfche aasta","aasta","\xfcks aasta"],yy:[e+" aasta",e+" aastat"]};return t?r[n][2]?r[n][2]:r[n][1]:i?r[n][0]:r[n][1]}e.defineLocale("et",{months:"jaanuar_veebruar_m\xe4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xe4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"p\xfchap\xe4ev_esmasp\xe4ev_teisip\xe4ev_kolmap\xe4ev_neljap\xe4ev_reede_laup\xe4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[T\xe4na,] LT",nextDay:"[Homme,] LT",nextWeek:"[J\xe4rgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s p\xe4rast",past:"%s tagasi",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:"%d p\xe4eva",M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},57287:function(e,t,n){!function(e){"use strict";e.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(29609))},73875:function(e,t,n){!function(e){"use strict";var t={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},n={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};e.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(e){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(e)},meridiem:function(e,t,n){return e<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"%d \u062b\u0627\u0646\u06cc\u0647",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/[\u06f0-\u06f9]/g,function(e){return n[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(n(29609))},73431:function(e,t,n){!function(e){"use strict";var t="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),n=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",t[7],t[8],t[9]];function i(e,i,r,a){var o="";switch(r){case"s":return a?"muutaman sekunnin":"muutama sekunti";case"ss":o=a?"sekunnin":"sekuntia";break;case"m":return a?"minuutin":"minuutti";case"mm":o=a?"minuutin":"minuuttia";break;case"h":return a?"tunnin":"tunti";case"hh":o=a?"tunnin":"tuntia";break;case"d":return a?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":o=a?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return a?"kuukauden":"kuukausi";case"MM":o=a?"kuukauden":"kuukautta";break;case"y":return a?"vuoden":"vuosi";case"yy":o=a?"vuoden":"vuotta"}return function(e,i){return e<10?i?n[e]:t[e]:e}(e,a)+" "+o}e.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},39606:function(e,t,n){!function(e){"use strict";e.defineLocale("fil",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}})}(n(29609))},41781:function(e,t,n){!function(e){"use strict";e.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0ur",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},11539:function(e,t,n){!function(e){"use strict";e.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}}})}(n(29609))},19847:function(e,t,n){!function(e){"use strict";e.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}})}(n(29609))},61717:function(e,t,n){!function(e){"use strict";var t=/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?|janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,n=[/^janv/i,/^f\xe9vr/i,/^mars/i,/^avr/i,/^mai/i,/^juin/i,/^juil/i,/^ao\xfbt/i,/^sept/i,/^oct/i,/^nov/i,/^d\xe9c/i];e.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsRegex:t,monthsShortRegex:t,monthsStrictRegex:/^(janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,monthsShortStrictRegex:/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",w:"une semaine",ww:"%d semaines",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(e,t){switch(t){case"D":return e+(1===e?"er":"");default:case"M":case"Q":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}})}(n(29609))},42250:function(e,t,n){!function(e){"use strict";var t="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),n="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");e.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[\xf4fr\xfbne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien min\xfat",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(29609))},47665:function(e,t,n){!function(e){"use strict";e.defineLocale("ga",{months:["Ean\xe1ir","Feabhra","M\xe1rta","Aibre\xe1n","Bealtaine","Meitheamh","I\xfail","L\xfanasa","Me\xe1n F\xf3mhair","Deireadh F\xf3mhair","Samhain","Nollaig"],monthsShort:["Ean","Feabh","M\xe1rt","Aib","Beal","Meith","I\xfail","L\xfan","M.F.","D.F.","Samh","Noll"],monthsParseExact:!0,weekdays:["D\xe9 Domhnaigh","D\xe9 Luain","D\xe9 M\xe1irt","D\xe9 C\xe9adaoin","D\xe9ardaoin","D\xe9 hAoine","D\xe9 Sathairn"],weekdaysShort:["Domh","Luan","M\xe1irt","C\xe9ad","D\xe9ar","Aoine","Sath"],weekdaysMin:["Do","Lu","M\xe1","C\xe9","D\xe9","A","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Am\xe1rach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inn\xe9 ag] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s \xf3 shin",s:"c\xfapla soicind",ss:"%d soicind",m:"n\xf3im\xe9ad",mm:"%d n\xf3im\xe9ad",h:"uair an chloig",hh:"%d uair an chloig",d:"l\xe1",dd:"%d l\xe1",M:"m\xed",MM:"%d m\xedonna",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){return e+(1===e?"d":e%10==2?"na":"mh")},week:{dow:1,doy:4}})}(n(29609))},85214:function(e,t,n){!function(e){"use strict";e.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){return e+(1===e?"d":e%10==2?"na":"mh")},week:{dow:1,doy:4}})}(n(29609))},36154:function(e,t,n){!function(e){"use strict";e.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n(29609))},68222:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={s:["\u0925\u094b\u0921\u092f\u093e \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940","\u0925\u094b\u0921\u0947 \u0938\u0945\u0915\u0902\u0921"],ss:[e+" \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940",e+" \u0938\u0945\u0915\u0902\u0921"],m:["\u090f\u0915\u093e \u092e\u093f\u0923\u091f\u093e\u0928","\u090f\u0915 \u092e\u093f\u0928\u0942\u091f"],mm:[e+" \u092e\u093f\u0923\u091f\u093e\u0902\u0928\u0940",e+" \u092e\u093f\u0923\u091f\u093e\u0902"],h:["\u090f\u0915\u093e \u0935\u0930\u093e\u0928","\u090f\u0915 \u0935\u0930"],hh:[e+" \u0935\u0930\u093e\u0902\u0928\u0940",e+" \u0935\u0930\u093e\u0902"],d:["\u090f\u0915\u093e \u0926\u093f\u0938\u093e\u0928","\u090f\u0915 \u0926\u0940\u0938"],dd:[e+" \u0926\u093f\u0938\u093e\u0902\u0928\u0940",e+" \u0926\u0940\u0938"],M:["\u090f\u0915\u093e \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928","\u090f\u0915 \u092e\u094d\u0939\u092f\u0928\u094b"],MM:[e+" \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928\u0940",e+" \u092e\u094d\u0939\u092f\u0928\u0947"],y:["\u090f\u0915\u093e \u0935\u0930\u094d\u0938\u093e\u0928","\u090f\u0915 \u0935\u0930\u094d\u0938"],yy:[e+" \u0935\u0930\u094d\u0938\u093e\u0902\u0928\u0940",e+" \u0935\u0930\u094d\u0938\u093e\u0902"]};return i?r[n][0]:r[n][1]}e.defineLocale("gom-deva",{months:{standalone:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u092f_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),format:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092e\u093e\u0930\u094d\u091a\u093e\u091a\u094d\u092f\u093e_\u090f\u092a\u094d\u0930\u0940\u0932\u093e\u091a\u094d\u092f\u093e_\u092e\u0947\u092f\u093e\u091a\u094d\u092f\u093e_\u091c\u0942\u0928\u093e\u091a\u094d\u092f\u093e_\u091c\u0941\u0932\u092f\u093e\u091a\u094d\u092f\u093e_\u0911\u0917\u0938\u094d\u091f\u093e\u091a\u094d\u092f\u093e_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0911\u0915\u094d\u091f\u094b\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0921\u093f\u0938\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940._\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u092f\u0924\u093e\u0930_\u0938\u094b\u092e\u093e\u0930_\u092e\u0902\u0917\u0933\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u092c\u093f\u0930\u0947\u0938\u094d\u0924\u093e\u0930_\u0938\u0941\u0915\u094d\u0930\u093e\u0930_\u0936\u0947\u0928\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0906\u092f\u0924._\u0938\u094b\u092e._\u092e\u0902\u0917\u0933._\u092c\u0941\u0927._\u092c\u094d\u0930\u0947\u0938\u094d\u0924._\u0938\u0941\u0915\u094d\u0930._\u0936\u0947\u0928.".split("_"),weekdaysMin:"\u0906_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u092c\u094d\u0930\u0947_\u0938\u0941_\u0936\u0947".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LTS:"A h:mm:ss [\u0935\u093e\u091c\u0924\u093e\u0902]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",llll:"ddd, D MMM YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]"},calendar:{sameDay:"[\u0906\u092f\u091c] LT",nextDay:"[\u092b\u093e\u0932\u094d\u092f\u093e\u0902] LT",nextWeek:"[\u092b\u0941\u0921\u0932\u094b] dddd[,] LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092b\u093e\u091f\u0932\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s \u0906\u0926\u0940\u0902",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}(\u0935\u0947\u0930)/,ordinal:function(e,t){switch(t){case"D":return e+"\u0935\u0947\u0930";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:0,doy:3},meridiemParse:/\u0930\u093e\u0924\u0940|\u0938\u0915\u093e\u0933\u0940\u0902|\u0926\u0928\u092a\u093e\u0930\u093e\u0902|\u0938\u093e\u0902\u091c\u0947/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0930\u093e\u0924\u0940"===t?e<4?e:e+12:"\u0938\u0915\u093e\u0933\u0940\u0902"===t?e:"\u0926\u0928\u092a\u093e\u0930\u093e\u0902"===t?e>12?e:e+12:"\u0938\u093e\u0902\u091c\u0947"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0930\u093e\u0924\u0940":e<12?"\u0938\u0915\u093e\u0933\u0940\u0902":e<16?"\u0926\u0928\u092a\u093e\u0930\u093e\u0902":e<20?"\u0938\u093e\u0902\u091c\u0947":"\u0930\u093e\u0924\u0940"}})}(n(29609))},18518:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={s:["thoddea sekondamni","thodde sekond"],ss:[e+" sekondamni",e+" sekond"],m:["eka mintan","ek minut"],mm:[e+" mintamni",e+" mintam"],h:["eka voran","ek vor"],hh:[e+" voramni",e+" voram"],d:["eka disan","ek dis"],dd:[e+" disamni",e+" dis"],M:["eka mhoinean","ek mhoino"],MM:[e+" mhoineamni",e+" mhoine"],y:["eka vorsan","ek voros"],yy:[e+" vorsamni",e+" vorsam"]};return i?r[n][0]:r[n][1]}e.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),format:"Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Fuddlo] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fattlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(e,t){switch(t){case"D":return e+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:0,doy:3},meridiemParse:/rati|sokallim|donparam|sanje/,meridiemHour:function(e,t){return 12===e&&(e=0),"rati"===t?e<4?e:e+12:"sokallim"===t?e:"donparam"===t?e>12?e:e+12:"sanje"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"rati":e<12?"sokallim":e<16?"donparam":e<20?"sanje":"rati"}})}(n(29609))},89221:function(e,t,n){!function(e){"use strict";var t={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},n={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};e.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ab9\u0ac7\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(e){return e.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0ab0\u0abe\u0aa4"===t?e<4?e:e+12:"\u0ab8\u0ab5\u0abe\u0ab0"===t?e:"\u0aac\u0aaa\u0acb\u0ab0"===t?e>=10?e:e+12:"\u0ab8\u0abe\u0a82\u0a9c"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0ab0\u0abe\u0aa4":e<10?"\u0ab8\u0ab5\u0abe\u0ab0":e<17?"\u0aac\u0aaa\u0acb\u0ab0":e<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(n(29609))},64743:function(e,t,n){!function(e){"use strict";e.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(e){return 2===e?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":e+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(e){return 2===e?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":e+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(e){return 2===e?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":e+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(e){return 2===e?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":e%10==0&&10!==e?e+" \u05e9\u05e0\u05d4":e+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(e){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(e)},meridiem:function(e,t,n){return e<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":e<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":e<12?n?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":e<18?n?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(n(29609))},77339:function(e,t,n){!function(e){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"},i=[/^\u091c\u0928/i,/^\u092b\u093c\u0930|\u092b\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924\u0902|\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935|\u0928\u0935\u0902/i,/^\u0926\u093f\u0938\u0902|\u0926\u093f\u0938/i];e.defineLocale("hi",{months:{format:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),standalone:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u0902\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u0902\u092c\u0930_\u0926\u093f\u0938\u0902\u092c\u0930".split("_")},monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},monthsParse:i,longMonthsParse:i,shortMonthsParse:[/^\u091c\u0928/i,/^\u092b\u093c\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935/i,/^\u0926\u093f\u0938/i],monthsRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsShortRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsStrictRegex:/^(\u091c\u0928\u0935\u0930\u0940?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908?|\u0905\u0917\u0938\u094d\u0924?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924?\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930?)/i,monthsShortStrictRegex:/^(\u091c\u0928\.?|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\.?|\u0905\u0917\.?|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\.?|\u0926\u093f\u0938\.?)/i,calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0930\u093e\u0924"===t?e<4?e:e+12:"\u0938\u0941\u092c\u0939"===t?e:"\u0926\u094b\u092a\u0939\u0930"===t?e>=10?e:e+12:"\u0936\u093e\u092e"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0930\u093e\u0924":e<10?"\u0938\u0941\u092c\u0939":e<17?"\u0926\u094b\u092a\u0939\u0930":e<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(n(29609))},13224:function(e,t,n){!function(e){"use strict";function t(e,t,n){var i=e+" ";switch(n){case"ss":return i+(1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi");case"m":return t?"jedna minuta":"jedne minute";case"mm":return i+(1===e?"minuta":2===e||3===e||4===e?"minute":"minuta");case"h":return t?"jedan sat":"jednog sata";case"hh":return i+(1===e?"sat":2===e||3===e||4===e?"sata":"sati");case"dd":return i+(1===e?"dan":"dana");case"MM":return i+(1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci");case"yy":return i+(1===e?"godina":2===e||3===e||4===e?"godine":"godina")}}e.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"Do MMMM YYYY",LLL:"Do MMMM YYYY H:mm",LLLL:"dddd, Do MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:return"[pro\u0161lu] [nedjelju] [u] LT";case 3:return"[pro\u0161lu] [srijedu] [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(29609))},50856:function(e,t,n){!function(e){"use strict";var t="vas\xe1rnap h\xe9tf\u0151n kedden szerd\xe1n cs\xfct\xf6rt\xf6k\xf6n p\xe9nteken szombaton".split(" ");function n(e,t,n,i){var r=e;switch(n){case"s":return i||t?"n\xe9h\xe1ny m\xe1sodperc":"n\xe9h\xe1ny m\xe1sodperce";case"ss":return r+(i||t)?" m\xe1sodperc":" m\xe1sodperce";case"m":return"egy"+(i||t?" perc":" perce");case"mm":return r+(i||t?" perc":" perce");case"h":return"egy"+(i||t?" \xf3ra":" \xf3r\xe1ja");case"hh":return r+(i||t?" \xf3ra":" \xf3r\xe1ja");case"d":return"egy"+(i||t?" nap":" napja");case"dd":return r+(i||t?" nap":" napja");case"M":return"egy"+(i||t?" h\xf3nap":" h\xf3napja");case"MM":return r+(i||t?" h\xf3nap":" h\xf3napja");case"y":return"egy"+(i||t?" \xe9v":" \xe9ve");case"yy":return r+(i||t?" \xe9v":" \xe9ve")}return""}function i(e){return(e?"":"[m\xfalt] ")+"["+t[this.day()]+"] LT[-kor]"}e.defineLocale("hu",{months:"janu\xe1r_febru\xe1r_m\xe1rcius_\xe1prilis_m\xe1jus_j\xfanius_j\xfalius_augusztus_szeptember_okt\xf3ber_november_december".split("_"),monthsShort:"jan._feb._m\xe1rc._\xe1pr._m\xe1j._j\xfan._j\xfal._aug._szept._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"vas\xe1rnap_h\xe9tf\u0151_kedd_szerda_cs\xfct\xf6rt\xf6k_p\xe9ntek_szombat".split("_"),weekdaysShort:"vas_h\xe9t_kedd_sze_cs\xfct_p\xe9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,t,n){return e<12?!0===n?"de":"DE":!0===n?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return i.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return i.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s m\xfalva",past:"%s",s:n,ss:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},76855:function(e,t,n){!function(e){"use strict";e.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(e){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(e)},meridiem:function(e){return e<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":e<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":e<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(e,t){switch(t){case"DDD":case"w":case"W":case"DDDo":return 1===e?e+"-\u056b\u0576":e+"-\u0580\u0564";default:return e}},week:{dow:1,doy:7}})}(n(29609))},2190:function(e,t,n){!function(e){"use strict";e.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,t){return 12===e&&(e=0),"pagi"===t?e:"siang"===t?e>=11?e:e+12:"sore"===t||"malam"===t?e+12:void 0},meridiem:function(e,t,n){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:0,doy:6}})}(n(29609))},53887:function(e,t,n){!function(e){"use strict";function t(e){return e%100==11||e%10!=1}function n(e,n,i,r){var a=e+" ";switch(i){case"s":return n||r?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return t(e)?a+(n||r?"sek\xfandur":"sek\xfandum"):a+"sek\xfanda";case"m":return n?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return t(e)?a+(n||r?"m\xedn\xfatur":"m\xedn\xfatum"):n?a+"m\xedn\xfata":a+"m\xedn\xfatu";case"hh":return t(e)?a+(n||r?"klukkustundir":"klukkustundum"):a+"klukkustund";case"d":return n?"dagur":r?"dag":"degi";case"dd":return t(e)?n?a+"dagar":a+(r?"daga":"d\xf6gum"):n?a+"dagur":a+(r?"dag":"degi");case"M":return n?"m\xe1nu\xf0ur":r?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return t(e)?n?a+"m\xe1nu\xf0ir":a+(r?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):n?a+"m\xe1nu\xf0ur":a+(r?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return n||r?"\xe1r":"\xe1ri";case"yy":return t(e)?a+(n||r?"\xe1r":"\xe1rum"):a+(n||r?"\xe1r":"\xe1ri")}}e.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:n,ss:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},85890:function(e,t,n){!function(e){"use strict";e.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n(29609))},19270:function(e,t,n){!function(e){"use strict";e.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:function(){return"[Oggi a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextDay:function(){return"[Domani a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextWeek:function(){return"dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastDay:function(){return"[Ieri a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastWeek:function(){switch(this.day()){case 0:return"[La scorsa] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT";default:return"[Lo scorso] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"}},sameElse:"L"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",w:"una settimana",ww:"%d settimane",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n(29609))},46595:function(e,t,n){!function(e){"use strict";e.defineLocale("ja",{eras:[{since:"2019-05-01",offset:1,name:"\u4ee4\u548c",narrow:"\u32ff",abbr:"R"},{since:"1989-01-08",until:"2019-04-30",offset:1,name:"\u5e73\u6210",narrow:"\u337b",abbr:"H"},{since:"1926-12-25",until:"1989-01-07",offset:1,name:"\u662d\u548c",narrow:"\u337c",abbr:"S"},{since:"1912-07-30",until:"1926-12-24",offset:1,name:"\u5927\u6b63",narrow:"\u337d",abbr:"T"},{since:"1873-01-01",until:"1912-07-29",offset:6,name:"\u660e\u6cbb",narrow:"\u337e",abbr:"M"},{since:"0001-01-01",until:"1873-12-31",offset:1,name:"\u897f\u66a6",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"\u7d00\u5143\u524d",narrow:"BC",abbr:"BC"}],eraYearOrdinalRegex:/(\u5143|\d+)\u5e74/,eraYearOrdinalParse:function(e,t){return"\u5143"===t[1]?1:parseInt(t[1]||e,10)},months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5(ddd) HH:mm"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(e){return"\u5348\u5f8c"===e},meridiem:function(e,t,n){return e<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:function(e){return e.week()!==this.week()?"[\u6765\u9031]dddd LT":"dddd LT"},lastDay:"[\u6628\u65e5] LT",lastWeek:function(e){return this.week()!==e.week()?"[\u5148\u9031]dddd LT":"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(e,t){switch(t){case"y":return 1===e?"\u5143\u5e74":e+"\u5e74";case"d":case"D":case"DDD":return e+"\u65e5";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}})}(n(29609))},93081:function(e,t,n){!function(e){"use strict";e.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(e,t){return 12===e&&(e=0),"enjing"===t?e:"siyang"===t?e>=11?e:e+12:"sonten"===t||"ndalu"===t?e+12:void 0},meridiem:function(e,t,n){return e<11?"enjing":e<15?"siyang":e<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(n(29609))},27477:function(e,t,n){!function(e){"use strict";e.defineLocale("ka",{months:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(e){return e.replace(/(\u10ec\u10d0\u10db|\u10ec\u10e3\u10d7|\u10e1\u10d0\u10d0\u10d7|\u10ec\u10d4\u10da|\u10d3\u10e6|\u10d7\u10d5)(\u10d8|\u10d4)/,function(e,t,n){return"\u10d8"===n?t+"\u10e8\u10d8":t+n+"\u10e8\u10d8"})},past:function(e){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(e)?e.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10ec\u10d8\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(e)?e.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10ec\u10d8\u10dc"):e},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(e){return 0===e?e:1===e?e+"-\u10da\u10d8":e<20||e<=100&&e%20==0||e%100==0?"\u10db\u10d4-"+e:e+"-\u10d4"},week:{dow:1,doy:7}})}(n(29609))},13978:function(e,t,n){!function(e){"use strict";var t={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};e.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(e){return e+(t[e]||t[e%10]||t[e>=100?100:null])},week:{dow:1,doy:7}})}(n(29609))},19205:function(e,t,n){!function(e){"use strict";var t={1:"\u17e1",2:"\u17e2",3:"\u17e3",4:"\u17e4",5:"\u17e5",6:"\u17e6",7:"\u17e7",8:"\u17e8",9:"\u17e9",0:"\u17e0"},n={"\u17e1":"1","\u17e2":"2","\u17e3":"3","\u17e4":"4","\u17e5":"5","\u17e6":"6","\u17e7":"7","\u17e8":"8","\u17e9":"9","\u17e0":"0"};e.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysMin:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u1796\u17d2\u179a\u17b9\u1780|\u179b\u17d2\u1784\u17b6\u1785/,isPM:function(e){return"\u179b\u17d2\u1784\u17b6\u1785"===e},meridiem:function(e,t,n){return e<12?"\u1796\u17d2\u179a\u17b9\u1780":"\u179b\u17d2\u1784\u17b6\u1785"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},dayOfMonthOrdinalParse:/\u1791\u17b8\d{1,2}/,ordinal:"\u1791\u17b8%d",preparse:function(e){return e.replace(/[\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u17e0]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},week:{dow:1,doy:4}})}(n(29609))},60025:function(e,t,n){!function(e){"use strict";var t={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},n={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};e.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(e){return e.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===t?e<4?e:e+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===t?e:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===t?e>=10?e:e+12:"\u0cb8\u0c82\u0c9c\u0cc6"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":e<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":e<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":e<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(e){return e+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(n(29609))},50427:function(e,t,n){!function(e){"use strict";e.defineLocale("ko",{months:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),monthsShort:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),weekdays:"\uc77c\uc694\uc77c_\uc6d4\uc694\uc77c_\ud654\uc694\uc77c_\uc218\uc694\uc77c_\ubaa9\uc694\uc77c_\uae08\uc694\uc77c_\ud1a0\uc694\uc77c".split("_"),weekdaysShort:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),weekdaysMin:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY\ub144 MMMM D\uc77c",LLL:"YYYY\ub144 MMMM D\uc77c A h:mm",LLLL:"YYYY\ub144 MMMM D\uc77c dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY\ub144 MMMM D\uc77c",lll:"YYYY\ub144 MMMM D\uc77c A h:mm",llll:"YYYY\ub144 MMMM D\uc77c dddd A h:mm"},calendar:{sameDay:"\uc624\ub298 LT",nextDay:"\ub0b4\uc77c LT",nextWeek:"dddd LT",lastDay:"\uc5b4\uc81c LT",lastWeek:"\uc9c0\ub09c\uc8fc dddd LT",sameElse:"L"},relativeTime:{future:"%s \ud6c4",past:"%s \uc804",s:"\uba87 \ucd08",ss:"%d\ucd08",m:"1\ubd84",mm:"%d\ubd84",h:"\ud55c \uc2dc\uac04",hh:"%d\uc2dc\uac04",d:"\ud558\ub8e8",dd:"%d\uc77c",M:"\ud55c \ub2ec",MM:"%d\ub2ec",y:"\uc77c \ub144",yy:"%d\ub144"},dayOfMonthOrdinalParse:/\d{1,2}(\uc77c|\uc6d4|\uc8fc)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"\uc77c";case"M":return e+"\uc6d4";case"w":case"W":return e+"\uc8fc";default:return e}},meridiemParse:/\uc624\uc804|\uc624\ud6c4/,isPM:function(e){return"\uc624\ud6c4"===e},meridiem:function(e,t,n){return e<12?"\uc624\uc804":"\uc624\ud6c4"}})}(n(29609))},79089:function(e,t,n){!function(e){"use strict";var t={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},i=["\u06a9\u0627\u0646\u0648\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0634\u0648\u0628\u0627\u062a","\u0626\u0627\u0632\u0627\u0631","\u0646\u06cc\u0633\u0627\u0646","\u0626\u0627\u06cc\u0627\u0631","\u062d\u0648\u0632\u06d5\u06cc\u0631\u0627\u0646","\u062a\u06d5\u0645\u0645\u0648\u0632","\u0626\u0627\u0628","\u0626\u06d5\u06cc\u0644\u0648\u0648\u0644","\u062a\u0634\u0631\u06cc\u0646\u06cc \u06cc\u06d5\u0643\u06d5\u0645","\u062a\u0634\u0631\u06cc\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0643\u0627\u0646\u0648\u0646\u06cc \u06cc\u06d5\u06a9\u06d5\u0645"];e.defineLocale("ku",{months:i,monthsShort:i,weekdays:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u062f\u0648\u0648\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0633\u06ce\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysShort:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645_\u062f\u0648\u0648\u0634\u0647\u200c\u0645_\u0633\u06ce\u0634\u0647\u200c\u0645_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u0647_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c|\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc/,isPM:function(e){return/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c/.test(e)},meridiem:function(e,t,n){return e<12?"\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc":"\u0626\u06ce\u0648\u0627\u0631\u0647\u200c"},calendar:{sameDay:"[\u0626\u0647\u200c\u0645\u0631\u06c6 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextDay:"[\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastDay:"[\u062f\u0648\u06ce\u0646\u06ce \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",sameElse:"L"},relativeTime:{future:"\u0644\u0647\u200c %s",past:"%s",s:"\u0686\u0647\u200c\u0646\u062f \u0686\u0631\u0643\u0647\u200c\u06cc\u0647\u200c\u0643",ss:"\u0686\u0631\u0643\u0647\u200c %d",m:"\u06cc\u0647\u200c\u0643 \u062e\u0648\u0644\u0647\u200c\u0643",mm:"%d \u062e\u0648\u0644\u0647\u200c\u0643",h:"\u06cc\u0647\u200c\u0643 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",hh:"%d \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",d:"\u06cc\u0647\u200c\u0643 \u0695\u06c6\u0698",dd:"%d \u0695\u06c6\u0698",M:"\u06cc\u0647\u200c\u0643 \u0645\u0627\u0646\u06af",MM:"%d \u0645\u0627\u0646\u06af",y:"\u06cc\u0647\u200c\u0643 \u0633\u0627\u06b5",yy:"%d \u0633\u0627\u06b5"},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return n[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n(29609))},19314:function(e,t,n){!function(e){"use strict";var t={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};e.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u044d\u044d \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u04e9\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(e){return e+(t[e]||t[e%10]||t[e>=100?100:null])},week:{dow:1,doy:7}})}(n(29609))},23136:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return t?r[n][0]:r[n][1]}function n(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;if(e<100){var t=e%10;return n(0===t?e/10:t)}if(e<1e4){for(;e>=10;)e/=10;return n(e)}return n(e/=1e3)}e.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(e){return n(e.substr(0,e.indexOf(" ")))?"a "+e:"an "+e},past:function(e){return n(e.substr(0,e.indexOf(" ")))?"viru "+e:"virun "+e},s:"e puer Sekonnen",ss:"%d Sekonnen",m:t,mm:"%d Minutten",h:t,hh:"%d Stonnen",d:t,dd:"%d Deeg",M:t,MM:"%d M\xe9int",y:t,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},29115:function(e,t,n){!function(e){"use strict";e.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(e){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===e},meridiem:function(e,t,n){return e<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(e){return"\u0e97\u0eb5\u0ec8"+e}})}(n(29609))},27087:function(e,t,n){!function(e){"use strict";var t={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function n(e,t,n,i){return t?r(n)[0]:i?r(n)[1]:r(n)[2]}function i(e){return e%10==0||e>10&&e<20}function r(e){return t[e].split("_")}function a(e,t,a,o){var s=e+" ";return 1===e?s+n(0,t,a[0],o):t?s+(i(e)?r(a)[1]:r(a)[0]):o?s+r(a)[1]:s+(i(e)?r(a)[1]:r(a)[2])}e.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(e,t,n,i){return t?"kelios sekund\u0117s":i?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:a,m:n,mm:a,h:n,hh:a,d:n,dd:a,M:n,MM:a,y:n,yy:a},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}})}(n(29609))},95683:function(e,t,n){!function(e){"use strict";var t={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function n(e,t,n){return n?t%10==1&&t%100!=11?e[2]:e[3]:t%10==1&&t%100!=11?e[0]:e[1]}function i(e,i,r){return e+" "+n(t[r],e,i)}function r(e,i,r){return n(t[r],e,i)}e.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(e,t){return t?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:i,m:r,mm:i,h:r,hh:i,d:r,dd:i,M:r,MM:i,y:r,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},79454:function(e,t,n){!function(e){"use strict";var t={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,n,i){var r=t.words[i];return 1===i.length?n?r[0]:r[1]:e+" "+t.correctGrammaticalCase(e,r)}};e.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mjesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(29609))},35507:function(e,t,n){!function(e){"use strict";e.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n(29609))},98466:function(e,t,n){!function(e){"use strict";e.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u0435\u0434\u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0435\u0434\u0435\u043d \u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0435\u0434\u0435\u043d \u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u0435\u0434\u0435\u043d \u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0435\u0434\u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(e){var t=e%10,n=e%100;return 0===e?e+"-\u0435\u0432":0===n?e+"-\u0435\u043d":n>10&&n<20?e+"-\u0442\u0438":1===t?e+"-\u0432\u0438":2===t?e+"-\u0440\u0438":7===t||8===t?e+"-\u043c\u0438":e+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n(29609))},82933:function(e,t,n){!function(e){"use strict";e.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===t&&e>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===t||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===t?e+12:e},meridiem:function(e,t,n){return e<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":e<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":e<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":e<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(n(29609))},19477:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){switch(n){case"s":return t?"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434":"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d";case"ss":return e+(t?" \u0441\u0435\u043a\u0443\u043d\u0434":" \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d");case"m":case"mm":return e+(t?" \u043c\u0438\u043d\u0443\u0442":" \u043c\u0438\u043d\u0443\u0442\u044b\u043d");case"h":case"hh":return e+(t?" \u0446\u0430\u0433":" \u0446\u0430\u0433\u0438\u0439\u043d");case"d":case"dd":return e+(t?" \u04e9\u0434\u04e9\u0440":" \u04e9\u0434\u0440\u0438\u0439\u043d");case"M":case"MM":return e+(t?" \u0441\u0430\u0440":" \u0441\u0430\u0440\u044b\u043d");case"y":case"yy":return e+(t?" \u0436\u0438\u043b":" \u0436\u0438\u043b\u0438\u0439\u043d");default:return e}}e.defineLocale("mn",{months:"\u041d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0425\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0413\u0443\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u04e9\u0440\u04e9\u0432\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0422\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0417\u0443\u0440\u0433\u0430\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u043e\u043b\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u041d\u0430\u0439\u043c\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0415\u0441\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u043d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u0445\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440".split("_"),monthsShort:"1 \u0441\u0430\u0440_2 \u0441\u0430\u0440_3 \u0441\u0430\u0440_4 \u0441\u0430\u0440_5 \u0441\u0430\u0440_6 \u0441\u0430\u0440_7 \u0441\u0430\u0440_8 \u0441\u0430\u0440_9 \u0441\u0430\u0440_10 \u0441\u0430\u0440_11 \u0441\u0430\u0440_12 \u0441\u0430\u0440".split("_"),monthsParseExact:!0,weekdays:"\u041d\u044f\u043c_\u0414\u0430\u0432\u0430\u0430_\u041c\u044f\u0433\u043c\u0430\u0440_\u041b\u0445\u0430\u0433\u0432\u0430_\u041f\u04af\u0440\u044d\u0432_\u0411\u0430\u0430\u0441\u0430\u043d_\u0411\u044f\u043c\u0431\u0430".split("_"),weekdaysShort:"\u041d\u044f\u043c_\u0414\u0430\u0432_\u041c\u044f\u0433_\u041b\u0445\u0430_\u041f\u04af\u0440_\u0411\u0430\u0430_\u0411\u044f\u043c".split("_"),weekdaysMin:"\u041d\u044f_\u0414\u0430_\u041c\u044f_\u041b\u0445_\u041f\u04af_\u0411\u0430_\u0411\u044f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D",LLL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm",LLLL:"dddd, YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm"},meridiemParse:/\u04ae\u04e8|\u04ae\u0425/i,isPM:function(e){return"\u04ae\u0425"===e},meridiem:function(e,t,n){return e<12?"\u04ae\u04e8":"\u04ae\u0425"},calendar:{sameDay:"[\u04e8\u043d\u04e9\u04e9\u0434\u04e9\u0440] LT",nextDay:"[\u041c\u0430\u0440\u0433\u0430\u0430\u0448] LT",nextWeek:"[\u0418\u0440\u044d\u0445] dddd LT",lastDay:"[\u04e8\u0447\u0438\u0433\u0434\u04e9\u0440] LT",lastWeek:"[\u04e8\u043d\u0433\u04e9\u0440\u0441\u04e9\u043d] dddd LT",sameElse:"L"},relativeTime:{future:"%s \u0434\u0430\u0440\u0430\u0430",past:"%s \u04e9\u043c\u043d\u04e9",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2} \u04e9\u0434\u04e9\u0440/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+" \u04e9\u0434\u04e9\u0440";default:return e}}})}(n(29609))},43597:function(e,t,n){!function(e){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function i(e,t,n,i){var r="";if(t)switch(n){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":r="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":r="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":r="%d \u0924\u093e\u0938";break;case"d":r="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":r="%d \u0926\u093f\u0935\u0938";break;case"M":r="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":r="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u0947"}else switch(n){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":r="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":r="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":r="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":r="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":r="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":r="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":r="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return r.replace(/%d/i,e)}e.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u092a\u0939\u093e\u091f\u0947|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940|\u0930\u093e\u0924\u094d\u0930\u0940/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u092a\u0939\u093e\u091f\u0947"===t||"\u0938\u0915\u093e\u0933\u0940"===t?e:"\u0926\u0941\u092a\u093e\u0930\u0940"===t||"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===t||"\u0930\u093e\u0924\u094d\u0930\u0940"===t?e>=12?e:e+12:void 0},meridiem:function(e,t,n){return e>=0&&e<6?"\u092a\u0939\u093e\u091f\u0947":e<12?"\u0938\u0915\u093e\u0933\u0940":e<17?"\u0926\u0941\u092a\u093e\u0930\u0940":e<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(n(29609))},99965:function(e,t,n){!function(e){"use strict";e.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,t){return 12===e&&(e=0),"pagi"===t?e:"tengahari"===t?e>=11?e:e+12:"petang"===t||"malam"===t?e+12:void 0},meridiem:function(e,t,n){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n(29609))},85529:function(e,t,n){!function(e){"use strict";e.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,t){return 12===e&&(e=0),"pagi"===t?e:"tengahari"===t?e>=11?e:e+12:"petang"===t||"malam"===t?e+12:void 0},meridiem:function(e,t,n){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n(29609))},30259:function(e,t,n){!function(e){"use strict";e.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n(29609))},88061:function(e,t,n){!function(e){"use strict";var t={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},n={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};e.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(e){return e.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},week:{dow:1,doy:4}})}(n(29609))},72618:function(e,t,n){!function(e){"use strict";e.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",w:"en uke",ww:"%d uker",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},28452:function(e,t,n){!function(e){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};e.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0930\u093e\u0924\u093f"===t?e<4?e:e+12:"\u092c\u093f\u0939\u093e\u0928"===t?e:"\u0926\u093f\u0909\u0901\u0938\u094b"===t?e>=10?e:e+12:"\u0938\u093e\u0901\u091d"===t?e+12:void 0},meridiem:function(e,t,n){return e<3?"\u0930\u093e\u0924\u093f":e<12?"\u092c\u093f\u0939\u093e\u0928":e<16?"\u0926\u093f\u0909\u0901\u0938\u094b":e<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(n(29609))},60413:function(e,t,n){!function(e){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),i=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;e.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(29609))},1885:function(e,t,n){!function(e){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),i=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;e.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,i){return e?/-MMM-/.test(i)?n[e.month()]:t[e.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",w:"\xe9\xe9n week",ww:"%d weken",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(n(29609))},45107:function(e,t,n){!function(e){"use strict";e.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"su._m\xe5._ty._on._to._fr._lau.".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_la".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",w:"ei veke",ww:"%d veker",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},71763:function(e,t,n){!function(e){"use strict";e.defineLocale("oc-lnc",{months:{standalone:"geni\xe8r_febri\xe8r_mar\xe7_abril_mai_junh_julhet_agost_setembre_oct\xf2bre_novembre_decembre".split("_"),format:"de geni\xe8r_de febri\xe8r_de mar\xe7_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'oct\xf2bre_de novembre_de decembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._mai_junh_julh._ago._set._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"dimenge_diluns_dimars_dim\xe8cres_dij\xf2us_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dm._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:"[u\xe8i a] LT",nextDay:"[deman a] LT",nextWeek:"dddd [a] LT",lastDay:"[i\xe8r a] LT",lastWeek:"dddd [passat a] LT",sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"unas segondas",ss:"%d segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(e,t){var n=1===e?"r":2===e?"n":3===e?"r":4===e?"t":"\xe8";return"w"!==t&&"W"!==t||(n="a"),e+n},week:{dow:1,doy:4}})}(n(29609))},702:function(e,t,n){!function(e){"use strict";var t={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},n={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};e.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"[\u0a05\u0a17\u0a32\u0a3e] dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(e){return e.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0a30\u0a3e\u0a24"===t?e<4?e:e+12:"\u0a38\u0a35\u0a47\u0a30"===t?e:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===t?e>=10?e:e+12:"\u0a38\u0a3c\u0a3e\u0a2e"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0a30\u0a3e\u0a24":e<10?"\u0a38\u0a35\u0a47\u0a30":e<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":e<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(n(29609))},31711:function(e,t,n){!function(e){"use strict";var t="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_"),i=[/^sty/i,/^lut/i,/^mar/i,/^kwi/i,/^maj/i,/^cze/i,/^lip/i,/^sie/i,/^wrz/i,/^pa\u017a/i,/^lis/i,/^gru/i];function r(e){return e%10<5&&e%10>1&&~~(e/10)%10!=1}function a(e,t,n){var i=e+" ";switch(n){case"ss":return i+(r(e)?"sekundy":"sekund");case"m":return t?"minuta":"minut\u0119";case"mm":return i+(r(e)?"minuty":"minut");case"h":return t?"godzina":"godzin\u0119";case"hh":return i+(r(e)?"godziny":"godzin");case"ww":return i+(r(e)?"tygodnie":"tygodni");case"MM":return i+(r(e)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return i+(r(e)?"lata":"lat")}}e.defineLocale("pl",{months:function(e,i){return e?/D MMMM/.test(i)?n[e.month()]:t[e.month()]:t},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),monthsParse:i,longMonthsParse:i,shortMonthsParse:i,weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:a,m:a,mm:a,h:a,hh:a,d:"1 dzie\u0144",dd:"%d dni",w:"tydzie\u0144",ww:a,M:"miesi\u0105c",MM:a,y:"rok",yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},58238:function(e,t,n){!function(e){"use strict";e.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_ter\xe7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xe1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_s\xe1b".split("_"),weekdaysMin:"do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",invalidDate:"Data inv\xe1lida"})}(n(29609))},10594:function(e,t,n){!function(e){"use strict";e.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",w:"uma semana",ww:"%d semanas",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n(29609))},74681:function(e,t,n){!function(e){"use strict";function t(e,t,n){var i=" ";return(e%100>=20||e>=100&&e%100==0)&&(i=" de "),e+i+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",ww:"s\u0103pt\u0103m\xe2ni",MM:"luni",yy:"ani"}[n]}e.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:t,m:"un minut",mm:t,h:"o or\u0103",hh:t,d:"o zi",dd:t,w:"o s\u0103pt\u0103m\xe2n\u0103",ww:t,M:"o lun\u0103",MM:t,y:"un an",yy:t},week:{dow:1,doy:7}})}(n(29609))},16201:function(e,t,n){!function(e){"use strict";function t(e,t,n){return"m"===n?t?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":e+" "+(i=+e,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",ww:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043d\u0435\u0434\u0435\u043b\u0438_\u043d\u0435\u0434\u0435\u043b\u044c",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[n].split("_"),i%10==1&&i%100!=11?r[0]:i%10>=2&&i%10<=4&&(i%100<10||i%100>=20)?r[1]:r[2]);var i,r}var n=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];e.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f, \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430, \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430, \u0432] LT",nextWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd, [\u0432] LT"}},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd, [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:t,m:t,mm:t,h:"\u0447\u0430\u0441",hh:t,d:"\u0434\u0435\u043d\u044c",dd:t,w:"\u043d\u0435\u0434\u0435\u043b\u044f",ww:t,M:"\u043c\u0435\u0441\u044f\u0446",MM:t,y:"\u0433\u043e\u0434",yy:t},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(e)},meridiem:function(e,t,n){return e<4?"\u043d\u043e\u0447\u0438":e<12?"\u0443\u0442\u0440\u0430":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":return e+"-\u0439";case"D":return e+"-\u0433\u043e";case"w":case"W":return e+"-\u044f";default:return e}},week:{dow:1,doy:4}})}(n(29609))},62912:function(e,t,n){!function(e){"use strict";var t=["\u062c\u0646\u0648\u0631\u064a","\u0641\u064a\u0628\u0631\u0648\u0631\u064a","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u064a\u0644","\u0645\u0626\u064a","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0621\u0650","\u0622\u06af\u0633\u067d","\u0633\u064a\u067e\u067d\u0645\u0628\u0631","\u0622\u06aa\u067d\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u068a\u0633\u0645\u0628\u0631"],n=["\u0622\u0686\u0631","\u0633\u0648\u0645\u0631","\u0627\u06b1\u0627\u0631\u0648","\u0627\u0631\u0628\u0639","\u062e\u0645\u064a\u0633","\u062c\u0645\u0639","\u0687\u0646\u0687\u0631"];e.defineLocale("sd",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,t,n){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0627\u0684] LT",nextDay:"[\u0633\u0680\u0627\u06bb\u064a] LT",nextWeek:"dddd [\u0627\u06b3\u064a\u0646 \u0647\u0641\u062a\u064a \u062a\u064a] LT",lastDay:"[\u06aa\u0627\u0644\u0647\u0647] LT",lastWeek:"[\u06af\u0632\u0631\u064a\u0644 \u0647\u0641\u062a\u064a] dddd [\u062a\u064a] LT",sameElse:"L"},relativeTime:{future:"%s \u067e\u0648\u0621",past:"%s \u0627\u06b3",s:"\u0686\u0646\u062f \u0633\u064a\u06aa\u0646\u068a",ss:"%d \u0633\u064a\u06aa\u0646\u068a",m:"\u0647\u06aa \u0645\u0646\u067d",mm:"%d \u0645\u0646\u067d",h:"\u0647\u06aa \u06aa\u0644\u0627\u06aa",hh:"%d \u06aa\u0644\u0627\u06aa",d:"\u0647\u06aa \u068f\u064a\u0646\u0647\u0646",dd:"%d \u068f\u064a\u0646\u0647\u0646",M:"\u0647\u06aa \u0645\u0647\u064a\u0646\u0648",MM:"%d \u0645\u0647\u064a\u0646\u0627",y:"\u0647\u06aa \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(n(29609))},6002:function(e,t,n){!function(e){"use strict";e.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},67942:function(e,t,n){!function(e){"use strict";e.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(e){return e+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(e){return"\u0db4.\u0dc0."===e||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===e},meridiem:function(e,t,n){return e>11?n?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":n?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(n(29609))},25577:function(e,t,n){!function(e){"use strict";var t="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),n="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function i(e){return e>1&&e<5}function r(e,t,n,r){var a=e+" ";switch(n){case"s":return t||r?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return t||r?a+(i(e)?"sekundy":"sek\xfand"):a+"sekundami";case"m":return t?"min\xfata":r?"min\xfatu":"min\xfatou";case"mm":return t||r?a+(i(e)?"min\xfaty":"min\xfat"):a+"min\xfatami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?a+(i(e)?"hodiny":"hod\xedn"):a+"hodinami";case"d":return t||r?"de\u0148":"d\u0148om";case"dd":return t||r?a+(i(e)?"dni":"dn\xed"):a+"d\u0148ami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?a+(i(e)?"mesiace":"mesiacov"):a+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?a+(i(e)?"roky":"rokov"):a+"rokmi"}}e.defineLocale("sk",{months:t,monthsShort:n,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},41775:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r=e+" ";switch(n){case"s":return t||i?"nekaj sekund":"nekaj sekundami";case"ss":return r+(1===e?t?"sekundo":"sekundi":2===e?t||i?"sekundi":"sekundah":e<5?t||i?"sekunde":"sekundah":"sekund");case"m":return t?"ena minuta":"eno minuto";case"mm":return r+(1===e?t?"minuta":"minuto":2===e?t||i?"minuti":"minutama":e<5?t||i?"minute":"minutami":t||i?"minut":"minutami");case"h":return t?"ena ura":"eno uro";case"hh":return r+(1===e?t?"ura":"uro":2===e?t||i?"uri":"urama":e<5?t||i?"ure":"urami":t||i?"ur":"urami");case"d":return t||i?"en dan":"enim dnem";case"dd":return r+(1===e?t||i?"dan":"dnem":2===e?t||i?"dni":"dnevoma":t||i?"dni":"dnevi");case"M":return t||i?"en mesec":"enim mesecem";case"MM":return r+(1===e?t||i?"mesec":"mesecem":2===e?t||i?"meseca":"mesecema":e<5?t||i?"mesece":"meseci":t||i?"mesecev":"meseci");case"y":return t||i?"eno leto":"enim letom";case"yy":return r+(1===e?t||i?"leto":"letom":2===e?t||i?"leti":"letoma":e<5?t||i?"leta":"leti":t||i?"let":"leti")}}e.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(29609))},36823:function(e,t,n){!function(e){"use strict";e.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(e){return"M"===e.charAt(0)},meridiem:function(e,t,n){return e<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},83848:function(e,t,n){!function(e){"use strict";var t={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u0435 \u043c\u0438\u043d\u0443\u0442\u0435"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0435","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],yy:["\u0433\u043e\u0434\u0438\u043d\u0430","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,n,i){var r=t.words[i];return 1===i.length?n?r[0]:r[1]:e+" "+t.correctGrammaticalCase(e,r)}};e.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"\u0434\u0430\u043d",dd:t.translate,M:"\u043c\u0435\u0441\u0435\u0446",MM:t.translate,y:"\u0433\u043e\u0434\u0438\u043d\u0443",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(29609))},59038:function(e,t,n){!function(e){"use strict";var t={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&e<=4?t[1]:t[2]},translate:function(e,n,i){var r=t.words[i];return 1===i.length?n?r[0]:r[1]:e+" "+t.correctGrammaticalCase(e,r)}};e.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n(29609))},96173:function(e,t,n){!function(e){"use strict";e.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(e,t,n){return e<11?"ekuseni":e<15?"emini":e<19?"entsambama":"ebusuku"},meridiemHour:function(e,t){return 12===e&&(e=0),"ekuseni"===t?e:"emini"===t?e>=11?e:e+12:"entsambama"===t||"ebusuku"===t?0===e?0:e+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(n(29609))},5788:function(e,t,n){!function(e){"use strict";e.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(\:e|\:a)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?":e":1===t||2===t?":a":":e")},week:{dow:1,doy:4}})}(n(29609))},76882:function(e,t,n){!function(e){"use strict";e.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"hh:mm A",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"siku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(n(29609))},82678:function(e,t,n){!function(e){"use strict";var t={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},n={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};e.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(e){return e+"\u0bb5\u0ba4\u0bc1"},preparse:function(e){return e.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(e){return n[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return t[e]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(e,t,n){return e<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":e<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":e<10?" \u0b95\u0bbe\u0bb2\u0bc8":e<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":e<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":e<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(e,t){return 12===e&&(e=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===t?e<2?e:e+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===t||"\u0b95\u0bbe\u0bb2\u0bc8"===t||"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===t&&e>=10?e:e+12},week:{dow:0,doy:6}})}(n(29609))},82797:function(e,t,n){!function(e){"use strict";e.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===t?e<4?e:e+12:"\u0c09\u0c26\u0c2f\u0c02"===t?e:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===t?e>=10?e:e+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":e<10?"\u0c09\u0c26\u0c2f\u0c02":e<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":e<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(n(29609))},52447:function(e,t,n){!function(e){"use strict";e.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"segundu balun",ss:"segundu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n(29609))},31335:function(e,t,n){!function(e){"use strict";var t={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};e.defineLocale("tg",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0430\u043b\u0438_\u043c\u0430\u0440\u0442\u0438_\u0430\u043f\u0440\u0435\u043b\u0438_\u043c\u0430\u0439\u0438_\u0438\u044e\u043d\u0438_\u0438\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442\u0438_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0438_\u043e\u043a\u0442\u044f\u0431\u0440\u0438_\u043d\u043e\u044f\u0431\u0440\u0438_\u0434\u0435\u043a\u0430\u0431\u0440\u0438".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_")},monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u0424\u0430\u0440\u0434\u043e \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u0448\u0430\u0431"===t?e<4?e:e+12:"\u0441\u0443\u0431\u04b3"===t?e:"\u0440\u04ef\u0437"===t?e>=11?e:e+12:"\u0431\u0435\u0433\u043e\u04b3"===t?e+12:void 0},meridiem:function(e,t,n){return e<4?"\u0448\u0430\u0431":e<11?"\u0441\u0443\u0431\u04b3":e<16?"\u0440\u04ef\u0437":e<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(e){return e+(t[e]||t[e%10]||t[e>=100?100:null])},week:{dow:1,doy:7}})}(n(29609))},68667:function(e,t,n){!function(e){"use strict";e.defineLocale("th",{months:"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21_\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c_\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21_\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19_\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21_\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19_\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21_\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21_\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19_\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21_\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19_\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split("_"),monthsShort:"\u0e21.\u0e04._\u0e01.\u0e1e._\u0e21\u0e35.\u0e04._\u0e40\u0e21.\u0e22._\u0e1e.\u0e04._\u0e21\u0e34.\u0e22._\u0e01.\u0e04._\u0e2a.\u0e04._\u0e01.\u0e22._\u0e15.\u0e04._\u0e1e.\u0e22._\u0e18.\u0e04.".split("_"),monthsParseExact:!0,weekdays:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysShort:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysMin:"\u0e2d\u0e32._\u0e08._\u0e2d._\u0e1e._\u0e1e\u0e24._\u0e28._\u0e2a.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm",LLLL:"\u0e27\u0e31\u0e19dddd\u0e17\u0e35\u0e48 D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm"},meridiemParse:/\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07|\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07/,isPM:function(e){return"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"===e},meridiem:function(e,t,n){return e<12?"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07":"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"},calendar:{sameDay:"[\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextDay:"[\u0e1e\u0e23\u0e38\u0e48\u0e07\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextWeek:"dddd[\u0e2b\u0e19\u0e49\u0e32 \u0e40\u0e27\u0e25\u0e32] LT",lastDay:"[\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",lastWeek:"[\u0e27\u0e31\u0e19]dddd[\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 \u0e40\u0e27\u0e25\u0e32] LT",sameElse:"L"},relativeTime:{future:"\u0e2d\u0e35\u0e01 %s",past:"%s\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27",s:"\u0e44\u0e21\u0e48\u0e01\u0e35\u0e48\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",ss:"%d \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",m:"1 \u0e19\u0e32\u0e17\u0e35",mm:"%d \u0e19\u0e32\u0e17\u0e35",h:"1 \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",hh:"%d \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",d:"1 \u0e27\u0e31\u0e19",dd:"%d \u0e27\u0e31\u0e19",w:"1 \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",ww:"%d \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",M:"1 \u0e40\u0e14\u0e37\u0e2d\u0e19",MM:"%d \u0e40\u0e14\u0e37\u0e2d\u0e19",y:"1 \u0e1b\u0e35",yy:"%d \u0e1b\u0e35"}})}(n(29609))},9222:function(e,t,n){!function(e){"use strict";var t={1:"'inji",5:"'inji",8:"'inji",70:"'inji",80:"'inji",2:"'nji",7:"'nji",20:"'nji",50:"'nji",3:"'\xfcnji",4:"'\xfcnji",100:"'\xfcnji",6:"'njy",9:"'unjy",10:"'unjy",30:"'unjy",60:"'ynjy",90:"'ynjy"};e.defineLocale("tk",{months:"\xddanwar_Fewral_Mart_Aprel_Ma\xfd_I\xfdun_I\xfdul_Awgust_Sent\xfdabr_Okt\xfdabr_No\xfdabr_Dekabr".split("_"),monthsShort:"\xddan_Few_Mar_Apr_Ma\xfd_I\xfdn_I\xfdl_Awg_Sen_Okt_No\xfd_Dek".split("_"),weekdays:"\xddek\u015fenbe_Du\u015fenbe_Si\u015fenbe_\xc7ar\u015fenbe_Pen\u015fenbe_Anna_\u015eenbe".split("_"),weekdaysShort:"\xddek_Du\u015f_Si\u015f_\xc7ar_Pen_Ann_\u015een".split("_"),weekdaysMin:"\xddk_D\u015f_S\u015f_\xc7r_Pn_An_\u015en".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn sagat] LT",nextDay:"[ertir sagat] LT",nextWeek:"[indiki] dddd [sagat] LT",lastDay:"[d\xfc\xfdn] LT",lastWeek:"[ge\xe7en] dddd [sagat] LT",sameElse:"L"},relativeTime:{future:"%s so\u0148",past:"%s \xf6\u0148",s:"birn\xe4\xe7e sekunt",m:"bir minut",mm:"%d minut",h:"bir sagat",hh:"%d sagat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir a\xfd",MM:"%d a\xfd",y:"bir \xfdyl",yy:"%d \xfdyl"},ordinal:function(e,n){switch(n){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'unjy";var i=e%10;return e+(t[i]||t[e%100-i]||t[e>=100?100:null])}},week:{dow:1,doy:7}})}(n(29609))},99914:function(e,t,n){!function(e){"use strict";e.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}})}(n(29609))},71389:function(e,t,n){!function(e){"use strict";var t="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function n(e,n,i,r){var a=function(e){var n=Math.floor(e%1e3/100),i=Math.floor(e%100/10),r=e%10,a="";return n>0&&(a+=t[n]+"vatlh"),i>0&&(a+=(""!==a?" ":"")+t[i]+"maH"),r>0&&(a+=(""!==a?" ":"")+t[r]),""===a?"pagh":a}(e);switch(i){case"ss":return a+" lup";case"mm":return a+" tup";case"hh":return a+" rep";case"dd":return a+" jaj";case"MM":return a+" jar";case"yy":return a+" DIS"}}e.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(e){var t=e;return-1!==e.indexOf("jaj")?t.slice(0,-3)+"leS":-1!==e.indexOf("jar")?t.slice(0,-3)+"waQ":-1!==e.indexOf("DIS")?t.slice(0,-3)+"nem":t+" pIq"},past:function(e){var t=e;return-1!==e.indexOf("jaj")?t.slice(0,-3)+"Hu\u2019":-1!==e.indexOf("jar")?t.slice(0,-3)+"wen":-1!==e.indexOf("DIS")?t.slice(0,-3)+"ben":t+" ret"},s:"puS lup",ss:n,m:"wa\u2019 tup",mm:n,h:"wa\u2019 rep",hh:n,d:"wa\u2019 jaj",dd:n,M:"wa\u2019 jar",MM:n,y:"wa\u2019 DIS",yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},3578:function(e,t,n){!function(e){"use strict";var t={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};e.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xc7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),meridiem:function(e,t,n){return e<12?n?"\xf6\xf6":"\xd6\xd6":n?"\xf6s":"\xd6S"},meridiemParse:/\xf6\xf6|\xd6\xd6|\xf6s|\xd6S/,isPM:function(e){return"\xf6s"===e||"\xd6S"===e},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",w:"bir hafta",ww:"%d hafta",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(e,n){switch(n){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'\u0131nc\u0131";var i=e%10;return e+(t[i]||t[e%100-i]||t[e>=100?100:null])}},week:{dow:1,doy:7}})}(n(29609))},36969:function(e,t,n){!function(e){"use strict";function t(e,t,n,i){var r={s:["viensas secunds","'iensas secunds"],ss:[e+" secunds",e+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[e+" m\xeduts",e+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[e+" \xfeoras",e+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[e+" ziuas",e+" ziuas"],M:["'n mes","'iens mes"],MM:[e+" mesen",e+" mesen"],y:["'n ar","'iens ar"],yy:[e+" ars",e+" ars"]};return i||t?r[n][0]:r[n][1]}e.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(e){return"d'o"===e.toLowerCase()},meridiem:function(e,t,n){return e>11?n?"d'o":"D'O":n?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n(29609))},690:function(e,t,n){!function(e){"use strict";e.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(n(29609))},76509:function(e,t,n){!function(e){"use strict";e.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(n(29609))},20055:function(e,t,n){!function(e){"use strict";e.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===t||"\u0633\u06d5\u06be\u06d5\u0631"===t||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===t?e:"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"===t||"\u0643\u06d5\u0686"===t?e+12:e>=11?e:e+12},meridiem:function(e,t,n){var i=100*e+t;return i<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":i<900?"\u0633\u06d5\u06be\u06d5\u0631":i<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":i<1230?"\u0686\u06c8\u0634":i<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return e+"-\u06be\u06d5\u067e\u062a\u06d5";default:return e}},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(n(29609))},22452:function(e,t,n){!function(e){"use strict";function t(e,t,n){return"m"===n?t?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===n?t?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":e+" "+(i=+e,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:t?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[n].split("_"),i%10==1&&i%100!=11?r[0]:i%10>=2&&i%10<=4&&(i%100<10||i%100>=20)?r[1]:r[2]);var i,r}function n(e){return function(){return e+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}e.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(e,t){var n={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return!0===e?n.nominative.slice(1,7).concat(n.nominative.slice(0,1)):e?n[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(t)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(t)?"genitive":"nominative"][e.day()]:n.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:n("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:n("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:n("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:n("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:t,m:t,mm:t,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:t,d:"\u0434\u0435\u043d\u044c",dd:t,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:t,y:"\u0440\u0456\u043a",yy:t},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(e)},meridiem:function(e,t,n){return e<4?"\u043d\u043e\u0447\u0456":e<12?"\u0440\u0430\u043d\u043a\u0443":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e+"-\u0439";case"D":return e+"-\u0433\u043e";default:return e}},week:{dow:1,doy:7}})}(n(29609))},91151:function(e,t,n){!function(e){"use strict";var t=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],n=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];e.defineLocale("ur",{months:t,monthsShort:t,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,t,n){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(n(29609))},46547:function(e,t,n){!function(e){"use strict";e.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(n(29609))},31555:function(e,t,n){!function(e){"use strict";e.defineLocale("uz",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u042f\u043a\u0448\u0430\u043d\u0431\u0430_\u0414\u0443\u0448\u0430\u043d\u0431\u0430_\u0421\u0435\u0448\u0430\u043d\u0431\u0430_\u0427\u043e\u0440\u0448\u0430\u043d\u0431\u0430_\u041f\u0430\u0439\u0448\u0430\u043d\u0431\u0430_\u0416\u0443\u043c\u0430_\u0428\u0430\u043d\u0431\u0430".split("_"),weekdaysShort:"\u042f\u043a\u0448_\u0414\u0443\u0448_\u0421\u0435\u0448_\u0427\u043e\u0440_\u041f\u0430\u0439_\u0416\u0443\u043c_\u0428\u0430\u043d".split("_"),weekdaysMin:"\u042f\u043a_\u0414\u0443_\u0421\u0435_\u0427\u043e_\u041f\u0430_\u0416\u0443_\u0428\u0430".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[\u0411\u0443\u0433\u0443\u043d \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",nextDay:"[\u042d\u0440\u0442\u0430\u0433\u0430] LT [\u0434\u0430]",nextWeek:"dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastDay:"[\u041a\u0435\u0447\u0430 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastWeek:"[\u0423\u0442\u0433\u0430\u043d] dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",sameElse:"L"},relativeTime:{future:"\u042f\u043a\u0438\u043d %s \u0438\u0447\u0438\u0434\u0430",past:"\u0411\u0438\u0440 \u043d\u0435\u0447\u0430 %s \u043e\u043b\u0434\u0438\u043d",s:"\u0444\u0443\u0440\u0441\u0430\u0442",ss:"%d \u0444\u0443\u0440\u0441\u0430\u0442",m:"\u0431\u0438\u0440 \u0434\u0430\u043a\u0438\u043a\u0430",mm:"%d \u0434\u0430\u043a\u0438\u043a\u0430",h:"\u0431\u0438\u0440 \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u0431\u0438\u0440 \u043e\u0439",MM:"%d \u043e\u0439",y:"\u0431\u0438\u0440 \u0439\u0438\u043b",yy:"%d \u0439\u0438\u043b"},week:{dow:1,doy:7}})}(n(29609))},16541:function(e,t,n){!function(e){"use strict";e.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,t,n){return e<12?n?"sa":"SA":n?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n tr\u01b0\u1edbc l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",w:"m\u1ed9t tu\u1ea7n",ww:"%d tu\u1ea7n",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}})}(n(29609))},42401:function(e,t,n){!function(e){"use strict";e.defineLocale("x-pseudo",{months:"J~\xe1\xf1\xfa\xe1~r\xfd_F~\xe9br\xfa~\xe1r\xfd_~M\xe1rc~h_\xc1p~r\xedl_~M\xe1\xfd_~J\xfa\xf1\xe9~_J\xfal~\xfd_\xc1\xfa~g\xfast~_S\xe9p~t\xe9mb~\xe9r_\xd3~ct\xf3b~\xe9r_\xd1~\xf3v\xe9m~b\xe9r_~D\xe9c\xe9~mb\xe9r".split("_"),monthsShort:"J~\xe1\xf1_~F\xe9b_~M\xe1r_~\xc1pr_~M\xe1\xfd_~J\xfa\xf1_~J\xfal_~\xc1\xfag_~S\xe9p_~\xd3ct_~\xd1\xf3v_~D\xe9c".split("_"),monthsParseExact:!0,weekdays:"S~\xfa\xf1d\xe1~\xfd_M\xf3~\xf1d\xe1\xfd~_T\xfa\xe9~sd\xe1\xfd~_W\xe9d~\xf1\xe9sd~\xe1\xfd_T~h\xfars~d\xe1\xfd_~Fr\xedd~\xe1\xfd_S~\xe1t\xfar~d\xe1\xfd".split("_"),weekdaysShort:"S~\xfa\xf1_~M\xf3\xf1_~T\xfa\xe9_~W\xe9d_~Th\xfa_~Fr\xed_~S\xe1t".split("_"),weekdaysMin:"S~\xfa_M\xf3~_T\xfa_~W\xe9_T~h_Fr~_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~\xf3d\xe1~\xfd \xe1t] LT",nextDay:"[T~\xf3m\xf3~rr\xf3~w \xe1t] LT",nextWeek:"dddd [\xe1t] LT",lastDay:"[\xdd~\xe9st~\xe9rd\xe1~\xfd \xe1t] LT",lastWeek:"[L~\xe1st] dddd [\xe1t] LT",sameElse:"L"},relativeTime:{future:"\xed~\xf1 %s",past:"%s \xe1~g\xf3",s:"\xe1 ~f\xe9w ~s\xe9c\xf3~\xf1ds",ss:"%d s~\xe9c\xf3\xf1~ds",m:"\xe1 ~m\xed\xf1~\xfat\xe9",mm:"%d m~\xed\xf1\xfa~t\xe9s",h:"\xe1~\xf1 h\xf3~\xfar",hh:"%d h~\xf3\xfars",d:"\xe1 ~d\xe1\xfd",dd:"%d d~\xe1\xfds",M:"\xe1 ~m\xf3\xf1~th",MM:"%d m~\xf3\xf1t~hs",y:"\xe1 ~\xfd\xe9\xe1r",yy:"%d \xfd~\xe9\xe1rs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(n(29609))},2341:function(e,t,n){!function(e){"use strict";e.defineLocale("yo",{months:"S\u1eb9\u0301r\u1eb9\u0301_E\u0300re\u0300le\u0300_\u1eb8r\u1eb9\u0300na\u0300_I\u0300gbe\u0301_E\u0300bibi_O\u0300ku\u0300du_Ag\u1eb9mo_O\u0300gu\u0301n_Owewe_\u1ecc\u0300wa\u0300ra\u0300_Be\u0301lu\u0301_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),monthsShort:"S\u1eb9\u0301r_E\u0300rl_\u1eb8rn_I\u0300gb_E\u0300bi_O\u0300ku\u0300_Ag\u1eb9_O\u0300gu\u0301_Owe_\u1ecc\u0300wa\u0300_Be\u0301l_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),weekdays:"A\u0300i\u0300ku\u0301_Aje\u0301_I\u0300s\u1eb9\u0301gun_\u1eccj\u1ecd\u0301ru\u0301_\u1eccj\u1ecd\u0301b\u1ecd_\u1eb8ti\u0300_A\u0300ba\u0301m\u1eb9\u0301ta".split("_"),weekdaysShort:"A\u0300i\u0300k_Aje\u0301_I\u0300s\u1eb9\u0301_\u1eccjr_\u1eccjb_\u1eb8ti\u0300_A\u0300ba\u0301".split("_"),weekdaysMin:"A\u0300i\u0300_Aj_I\u0300s_\u1eccr_\u1eccb_\u1eb8t_A\u0300b".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[O\u0300ni\u0300 ni] LT",nextDay:"[\u1ecc\u0300la ni] LT",nextWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301n'b\u1ecd] [ni] LT",lastDay:"[A\u0300na ni] LT",lastWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301l\u1ecd\u0301] [ni] LT",sameElse:"L"},relativeTime:{future:"ni\u0301 %s",past:"%s k\u1ecdja\u0301",s:"i\u0300s\u1eb9ju\u0301 aaya\u0301 die",ss:"aaya\u0301 %d",m:"i\u0300s\u1eb9ju\u0301 kan",mm:"i\u0300s\u1eb9ju\u0301 %d",h:"wa\u0301kati kan",hh:"wa\u0301kati %d",d:"\u1ecdj\u1ecd\u0301 kan",dd:"\u1ecdj\u1ecd\u0301 %d",M:"osu\u0300 kan",MM:"osu\u0300 %d",y:"\u1ecddu\u0301n kan",yy:"\u1ecddu\u0301n %d"},dayOfMonthOrdinalParse:/\u1ecdj\u1ecd\u0301\s\d{1,2}/,ordinal:"\u1ecdj\u1ecd\u0301 %d",week:{dow:1,doy:4}})}(n(29609))},80619:function(e,t,n){!function(e){"use strict";e.defineLocale("zh-cn",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u5468\u65e5_\u5468\u4e00_\u5468\u4e8c_\u5468\u4e09_\u5468\u56db_\u5468\u4e94_\u5468\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5Ah\u70b9mm\u5206",LLLL:"YYYY\u5e74M\u6708D\u65e5ddddAh\u70b9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?e:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?e+12:e>=11?e:e+12},meridiem:function(e,t,n){var i=100*e+t;return i<600?"\u51cc\u6668":i<900?"\u65e9\u4e0a":i<1130?"\u4e0a\u5348":i<1230?"\u4e2d\u5348":i<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:function(e){return e.week()!==this.week()?"[\u4e0b]dddLT":"[\u672c]dddLT"},lastDay:"[\u6628\u5929]LT",lastWeek:function(e){return this.week()!==e.week()?"[\u4e0a]dddLT":"[\u672c]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u5468";default:return e}},relativeTime:{future:"%s\u540e",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",w:"1 \u5468",ww:"%d \u5468",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(n(29609))},67058:function(e,t,n){!function(e){"use strict";e.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?e:"\u4e2d\u5348"===t?e>=11?e:e+12:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?e+12:void 0},meridiem:function(e,t,n){var i=100*e+t;return i<600?"\u51cc\u6668":i<900?"\u65e9\u4e0a":i<1200?"\u4e0a\u5348":1200===i?"\u4e2d\u5348":i<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n(29609))},89141:function(e,t,n){!function(e){"use strict";e.defineLocale("zh-mo",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"D/M/YYYY",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?e:"\u4e2d\u5348"===t?e>=11?e:e+12:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?e+12:void 0},meridiem:function(e,t,n){var i=100*e+t;return i<600?"\u51cc\u6668":i<900?"\u65e9\u4e0a":i<1130?"\u4e0a\u5348":i<1230?"\u4e2d\u5348":i<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n(29609))},22782:function(e,t,n){!function(e){"use strict";e.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,t){return 12===e&&(e=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?e:"\u4e2d\u5348"===t?e>=11?e:e+12:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?e+12:void 0},meridiem:function(e,t,n){var i=100*e+t;return i<600?"\u51cc\u6668":i<900?"\u65e9\u4e0a":i<1130?"\u4e0a\u5348":i<1230?"\u4e2d\u5348":i<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n(29609))},29609:function(e,t,n){(e=n.nmd(e)).exports=function(){"use strict";var t,i;function r(){return t.apply(null,arguments)}function a(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function o(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function s(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function u(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(s(e,t))return!1;return!0}function l(e){return void 0===e}function c(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function h(e,t){var n,i=[];for(n=0;n>>0;for(t=0;t0)for(n=0;n<_.length;n++)l(r=t[i=_[n]])||(e[i]=r);return e}function w(e){b(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===y&&(y=!0,r.updateOffset(this),y=!1)}function k(e){return e instanceof w||null!=e&&null!=e._isAMomentObject}function M(e){!1===r.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function S(e,t){var n=!0;return f(function(){if(null!=r.deprecationHandler&&r.deprecationHandler(null,e),n){var i,a,o,u=[];for(a=0;a=0?n?"+":"":"-")+Math.pow(10,Math.max(0,t-i.length)).toString().substr(1)+i}r.suppressDeprecationWarnings=!1,r.deprecationHandler=null,C=Object.keys?Object.keys:function(e){var t,n=[];for(t in e)s(e,t)&&n.push(t);return n};var Y=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,P=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,A={},I={};function R(e,t,n,i){var r=i;"string"==typeof i&&(r=function(){return this[i]()}),e&&(I[e]=r),t&&(I[t[0]]=function(){return E(r.apply(this,arguments),t[1],t[2])}),n&&(I[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),e)})}function F(e,t){return e.isValid()?(t=H(t,e.localeData()),A[t]=A[t]||function(e){var t,n,i,r=e.match(Y);for(t=0,n=r.length;t=0&&P.test(e);)e=e.replace(P,i),P.lastIndex=0,n-=1;return e}var j={};function N(e,t){var n=e.toLowerCase();j[n]=j[n+"s"]=j[t]=e}function B(e){return"string"==typeof e?j[e]||j[e.toLowerCase()]:void 0}function W(e){var t,n,i={};for(n in e)s(e,n)&&(t=B(n))&&(i[t]=e[n]);return i}var V={};function U(e,t){V[e]=t}function z(e){return e%4==0&&e%100!=0||e%400==0}function q(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function G(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=q(t)),n}function K(e,t){return function(n){return null!=n?(Z(this,e,n),r.updateOffset(this,t),this):J(this,e)}}function J(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function Z(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&z(e.year())&&1===e.month()&&29===e.date()?(n=G(n),e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),ke(n,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](n))}var $,X=/\d/,Q=/\d\d/,ee=/\d{3}/,te=/\d{4}/,ne=/[+-]?\d{6}/,ie=/\d\d?/,re=/\d\d\d\d?/,ae=/\d\d\d\d\d\d?/,oe=/\d{1,3}/,se=/\d{1,4}/,ue=/[+-]?\d{1,6}/,le=/\d+/,ce=/[+-]?\d+/,de=/Z|[+-]\d\d:?\d\d/gi,he=/Z|[+-]\d\d(?::?\d\d)?/gi,fe=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;function pe(e,t,n){$[e]=T(t)?t:function(e,i){return e&&n?n:t}}function me(e,t){return s($,e)?$[e](t._strict,t._locale):new RegExp(ge(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,i,r){return t||n||i||r})))}function ge(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}$={};var ve,_e={};function ye(e,t){var n,i=t;for("string"==typeof e&&(e=[e]),c(t)&&(i=function(e,n){n[t]=G(e)}),n=0;n68?1900:2e3)};var Pe=K("FullYear",!0);function Ae(e,t,n,i,r,a,o){var s;return e<100&&e>=0?(s=new Date(e+400,t,n,i,r,a,o),isFinite(s.getFullYear())&&s.setFullYear(e)):s=new Date(e,t,n,i,r,a,o),s}function Ie(e){var t,n;return e<100&&e>=0?((n=Array.prototype.slice.call(arguments))[0]=e+400,t=new Date(Date.UTC.apply(null,n)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function Re(e,t,n){var i=7+t-n;return-(7+Ie(e,0,i).getUTCDay()-t)%7+i-1}function Fe(e,t,n,i,r){var a,o,s=1+7*(t-1)+(7+n-i)%7+Re(e,i,r);return s<=0?o=Ye(a=e-1)+s:s>Ye(e)?(a=e+1,o=s-Ye(e)):(a=e,o=s),{year:a,dayOfYear:o}}function He(e,t,n){var i,r,a=Re(e.year(),t,n),o=Math.floor((e.dayOfYear()-a-1)/7)+1;return o<1?i=o+je(r=e.year()-1,t,n):o>je(e.year(),t,n)?(i=o-je(e.year(),t,n),r=e.year()+1):(r=e.year(),i=o),{week:i,year:r}}function je(e,t,n){var i=Re(e,t,n),r=Re(e+1,t,n);return(Ye(e)-i+r)/7}function Ne(e,t){return e.slice(t,7).concat(e.slice(0,t))}R("w",["ww",2],"wo","week"),R("W",["WW",2],"Wo","isoWeek"),N("week","w"),N("isoWeek","W"),U("week",5),U("isoWeek",5),pe("w",ie),pe("ww",ie,Q),pe("W",ie),pe("WW",ie,Q),be(["w","ww","W","WW"],function(e,t,n,i){t[i.substr(0,1)]=G(e)}),R("d",0,"do","day"),R("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),R("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),R("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),R("e",0,0,"weekday"),R("E",0,0,"isoWeekday"),N("day","d"),N("weekday","e"),N("isoWeekday","E"),U("day",11),U("weekday",11),U("isoWeekday",11),pe("d",ie),pe("e",ie),pe("E",ie),pe("dd",function(e,t){return t.weekdaysMinRegex(e)}),pe("ddd",function(e,t){return t.weekdaysShortRegex(e)}),pe("dddd",function(e,t){return t.weekdaysRegex(e)}),be(["dd","ddd","dddd"],function(e,t,n,i){var r=n._locale.weekdaysParse(e,i,n._strict);null!=r?t.d=r:m(n).invalidWeekday=e}),be(["d","e","E"],function(e,t,n,i){t[i]=G(e)});var Be="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),We="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ve="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Ue=fe,ze=fe,qe=fe;function Ge(e,t,n){var i,r,a,o=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)a=p([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(a,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(a,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(a,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(r=ve.call(this._weekdaysParse,o))?r:null:"ddd"===t?-1!==(r=ve.call(this._shortWeekdaysParse,o))?r:null:-1!==(r=ve.call(this._minWeekdaysParse,o))?r:null:"dddd"===t?-1!==(r=ve.call(this._weekdaysParse,o))||-1!==(r=ve.call(this._shortWeekdaysParse,o))||-1!==(r=ve.call(this._minWeekdaysParse,o))?r:null:"ddd"===t?-1!==(r=ve.call(this._shortWeekdaysParse,o))||-1!==(r=ve.call(this._weekdaysParse,o))||-1!==(r=ve.call(this._minWeekdaysParse,o))?r:null:-1!==(r=ve.call(this._minWeekdaysParse,o))||-1!==(r=ve.call(this._weekdaysParse,o))||-1!==(r=ve.call(this._shortWeekdaysParse,o))?r:null}function Ke(){function e(e,t){return t.length-e.length}var t,n,i,r,a,o=[],s=[],u=[],l=[];for(t=0;t<7;t++)n=p([2e3,1]).day(t),i=ge(this.weekdaysMin(n,"")),r=ge(this.weekdaysShort(n,"")),a=ge(this.weekdays(n,"")),o.push(i),s.push(r),u.push(a),l.push(i),l.push(r),l.push(a);o.sort(e),s.sort(e),u.sort(e),l.sort(e),this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function Je(){return this.hours()%12||12}function Ze(e,t){R(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function $e(e,t){return t._meridiemParse}R("H",["HH",2],0,"hour"),R("h",["hh",2],0,Je),R("k",["kk",2],0,function(){return this.hours()||24}),R("hmm",0,0,function(){return""+Je.apply(this)+E(this.minutes(),2)}),R("hmmss",0,0,function(){return""+Je.apply(this)+E(this.minutes(),2)+E(this.seconds(),2)}),R("Hmm",0,0,function(){return""+this.hours()+E(this.minutes(),2)}),R("Hmmss",0,0,function(){return""+this.hours()+E(this.minutes(),2)+E(this.seconds(),2)}),Ze("a",!0),Ze("A",!1),N("hour","h"),U("hour",13),pe("a",$e),pe("A",$e),pe("H",ie),pe("h",ie),pe("k",ie),pe("HH",ie,Q),pe("hh",ie,Q),pe("kk",ie,Q),pe("hmm",re),pe("hmmss",ae),pe("Hmm",re),pe("Hmmss",ae),ye(["H","HH"],3),ye(["k","kk"],function(e,t,n){var i=G(e);t[3]=24===i?0:i}),ye(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ye(["h","hh"],function(e,t,n){t[3]=G(e),m(n).bigHour=!0}),ye("hmm",function(e,t,n){var i=e.length-2;t[3]=G(e.substr(0,i)),t[4]=G(e.substr(i)),m(n).bigHour=!0}),ye("hmmss",function(e,t,n){var i=e.length-4,r=e.length-2;t[3]=G(e.substr(0,i)),t[4]=G(e.substr(i,2)),t[5]=G(e.substr(r)),m(n).bigHour=!0}),ye("Hmm",function(e,t,n){var i=e.length-2;t[3]=G(e.substr(0,i)),t[4]=G(e.substr(i))}),ye("Hmmss",function(e,t,n){var i=e.length-4,r=e.length-2;t[3]=G(e.substr(0,i)),t[4]=G(e.substr(i,2)),t[5]=G(e.substr(r))});var Xe,Qe=K("Hours",!0),et={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Me,monthsShort:Se,week:{dow:0,doy:6},weekdays:Be,weekdaysMin:Ve,weekdaysShort:We,meridiemParse:/[ap]\.?m?\.?/i},tt={},nt={};function it(e,t){var n,i=Math.min(e.length,t.length);for(n=0;n0;){if(i=at(r.slice(0,t).join("-")))return i;if(n&&n.length>=t&&it(r,n)>=t-1)break;t--}a++}return Xe}(e)}function lt(e){var t,n=e._a;return n&&-2===m(e).overflow&&(t=n[1]<0||n[1]>11?1:n[2]<1||n[2]>ke(n[0],n[1])?2:n[3]<0||n[3]>24||24===n[3]&&(0!==n[4]||0!==n[5]||0!==n[6])?3:n[4]<0||n[4]>59?4:n[5]<0||n[5]>59?5:n[6]<0||n[6]>999?6:-1,m(e)._overflowDayOfYear&&(t<0||t>2)&&(t=2),m(e)._overflowWeeks&&-1===t&&(t=7),m(e)._overflowWeekday&&-1===t&&(t=8),m(e).overflow=t),e}var ct=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,dt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ht=/Z|[+-]\d\d(?::?\d\d)?/,ft=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],pt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],mt=/^\/?Date\((-?\d+)/i,gt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,vt={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function _t(e){var t,n,i,r,a,o,s=e._i,u=ct.exec(s)||dt.exec(s);if(u){for(m(e).iso=!0,t=0,n=ft.length;t7)&&(u=!0)):(a=e._locale._week.dow,o=e._locale._week.doy,l=He(Ct(),a,o),n=bt(t.gg,e._a[0],l.year),i=bt(t.w,l.week),null!=t.d?((r=t.d)<0||r>6)&&(u=!0):null!=t.e?(r=t.e+a,(t.e<0||t.e>6)&&(u=!0)):r=a),i<1||i>je(n,a,o)?m(e)._overflowWeeks=!0:null!=u?m(e)._overflowWeekday=!0:(s=Fe(n,i,r,a,o),e._a[0]=s.year,e._dayOfYear=s.dayOfYear)}(e),null!=e._dayOfYear&&(o=bt(e._a[0],i[0]),(e._dayOfYear>Ye(o)||0===e._dayOfYear)&&(m(e)._overflowDayOfYear=!0),n=Ie(o,0,e._dayOfYear),e._a[1]=n.getUTCMonth(),e._a[2]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=s[t]=i[t];for(;t<7;t++)e._a[t]=s[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[3]&&0===e._a[4]&&0===e._a[5]&&0===e._a[6]&&(e._nextDay=!0,e._a[3]=0),e._d=(e._useUTC?Ie:Ae).apply(null,s),a=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[3]=24),e._w&&void 0!==e._w.d&&e._w.d!==a&&(m(e).weekdayMismatch=!0)}}function kt(e){if(e._f!==r.ISO_8601)if(e._f!==r.RFC_2822){e._a=[],m(e).empty=!0;var t,n,i,a,o,s,u=""+e._i,l=u.length,c=0;for(i=H(e._f,e._locale).match(Y)||[],t=0;t0&&m(e).unusedInput.push(o),u=u.slice(u.indexOf(n)+n.length),c+=n.length),I[a]?(n?m(e).empty=!1:m(e).unusedTokens.push(a),we(a,n,e)):e._strict&&!n&&m(e).unusedTokens.push(a);m(e).charsLeftOver=l-c,u.length>0&&m(e).unusedInput.push(u),e._a[3]<=12&&!0===m(e).bigHour&&e._a[3]>0&&(m(e).bigHour=void 0),m(e).parsedDateParts=e._a.slice(0),m(e).meridiem=e._meridiem,e._a[3]=function(e,t,n){var i;return null==n?t:null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((i=e.isPM(n))&&t<12&&(t+=12),i||12!==t||(t=0),t):t}(e._locale,e._a[3],e._meridiem),null!==(s=m(e).era)&&(e._a[0]=e._locale.erasConvertYear(s,e._a[0])),wt(e),lt(e)}else yt(e);else _t(e)}function Mt(e){var t=e._i,n=e._f;return e._locale=e._locale||ut(e._l),null===t||void 0===n&&""===t?v({nullInput:!0}):("string"==typeof t&&(e._i=t=e._locale.preparse(t)),k(t)?new w(lt(t)):(d(t)?e._d=t:a(n)?function(e){var t,n,i,r,a,o,s=!1;if(0===e._f.length)return m(e).invalidFormat=!0,void(e._d=new Date(NaN));for(r=0;rthis?this:e:v()});function Tt(e,t){var n,i;if(1===t.length&&a(t[0])&&(t=t[0]),!t.length)return Ct();for(n=t[0],i=1;i=0?new Date(e+400,t,n)-an:new Date(e,t,n).valueOf()}function un(e,t,n){return e<100&&e>=0?Date.UTC(e+400,t,n)-an:Date.UTC(e,t,n)}function ln(e,t){return t.erasAbbrRegex(e)}function cn(){var e,t,n=[],i=[],r=[],a=[],o=this.eras();for(e=0,t=o.length;e(a=je(e,i,r))&&(t=a),fn.call(this,e,t,n,i,r))}function fn(e,t,n,i,r){var a=Fe(e,t,n,i,r),o=Ie(a.year,0,a.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}R("N",0,0,"eraAbbr"),R("NN",0,0,"eraAbbr"),R("NNN",0,0,"eraAbbr"),R("NNNN",0,0,"eraName"),R("NNNNN",0,0,"eraNarrow"),R("y",["y",1],"yo","eraYear"),R("y",["yy",2],0,"eraYear"),R("y",["yyy",3],0,"eraYear"),R("y",["yyyy",4],0,"eraYear"),pe("N",ln),pe("NN",ln),pe("NNN",ln),pe("NNNN",function(e,t){return t.erasNameRegex(e)}),pe("NNNNN",function(e,t){return t.erasNarrowRegex(e)}),ye(["N","NN","NNN","NNNN","NNNNN"],function(e,t,n,i){var r=n._locale.erasParse(e,i,n._strict);r?m(n).era=r:m(n).invalidEra=e}),pe("y",le),pe("yy",le),pe("yyy",le),pe("yyyy",le),pe("yo",function(e,t){return t._eraYearOrdinalRegex||le}),ye(["y","yy","yyy","yyyy"],0),ye(["yo"],function(e,t,n,i){var r;n._locale._eraYearOrdinalRegex&&(r=e.match(n._locale._eraYearOrdinalRegex)),t[0]=n._locale.eraYearOrdinalParse?n._locale.eraYearOrdinalParse(e,r):parseInt(e,10)}),R(0,["gg",2],0,function(){return this.weekYear()%100}),R(0,["GG",2],0,function(){return this.isoWeekYear()%100}),dn("gggg","weekYear"),dn("ggggg","weekYear"),dn("GGGG","isoWeekYear"),dn("GGGGG","isoWeekYear"),N("weekYear","gg"),N("isoWeekYear","GG"),U("weekYear",1),U("isoWeekYear",1),pe("G",ce),pe("g",ce),pe("GG",ie,Q),pe("gg",ie,Q),pe("GGGG",se,te),pe("gggg",se,te),pe("GGGGG",ue,ne),pe("ggggg",ue,ne),be(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,i){t[i.substr(0,2)]=G(e)}),be(["gg","GG"],function(e,t,n,i){t[i]=r.parseTwoDigitYear(e)}),R("Q",0,"Qo","quarter"),N("quarter","Q"),U("quarter",7),pe("Q",X),ye("Q",function(e,t){t[1]=3*(G(e)-1)}),R("D",["DD",2],"Do","date"),N("date","D"),U("date",9),pe("D",ie),pe("DD",ie,Q),pe("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),ye(["D","DD"],2),ye("Do",function(e,t){t[2]=G(e.match(ie)[0])});var pn=K("Date",!0);R("DDD",["DDDD",3],"DDDo","dayOfYear"),N("dayOfYear","DDD"),U("dayOfYear",4),pe("DDD",oe),pe("DDDD",ee),ye(["DDD","DDDD"],function(e,t,n){n._dayOfYear=G(e)}),R("m",["mm",2],0,"minute"),N("minute","m"),U("minute",14),pe("m",ie),pe("mm",ie,Q),ye(["m","mm"],4);var mn=K("Minutes",!1);R("s",["ss",2],0,"second"),N("second","s"),U("second",15),pe("s",ie),pe("ss",ie,Q),ye(["s","ss"],5);var gn,vn,_n=K("Seconds",!1);for(R("S",0,0,function(){return~~(this.millisecond()/100)}),R(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),R(0,["SSS",3],0,"millisecond"),R(0,["SSSS",4],0,function(){return 10*this.millisecond()}),R(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),R(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),R(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),R(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),R(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),N("millisecond","ms"),U("millisecond",16),pe("S",oe,X),pe("SS",oe,Q),pe("SSS",oe,ee),gn="SSSS";gn.length<=9;gn+="S")pe(gn,le);function yn(e,t){t[6]=G(1e3*("0."+e))}for(gn="S";gn.length<=9;gn+="S")ye(gn,yn);vn=K("Milliseconds",!1),R("z",0,0,"zoneAbbr"),R("zz",0,0,"zoneName");var bn=w.prototype;function wn(e){return e}bn.add=qt,bn.calendar=function(e,t){1===arguments.length&&(arguments[0]?Jt(arguments[0])?(e=arguments[0],t=void 0):Zt(arguments[0])&&(t=arguments[0],e=void 0):(e=void 0,t=void 0));var n=e||Ct(),i=Rt(n,this).startOf("day"),a=r.calendarFormat(this,i)||"sameElse",o=t&&(T(t[a])?t[a].call(this,n):t[a]);return this.format(o||this.localeData().calendar(a,this,Ct(n)))},bn.clone=function(){return new w(this)},bn.diff=function(e,t,n){var i,r,a;if(!this.isValid())return NaN;if(!(i=Rt(e,this)).isValid())return NaN;switch(r=6e4*(i.utcOffset()-this.utcOffset()),t=B(t)){case"year":a=$t(this,i)/12;break;case"month":a=$t(this,i);break;case"quarter":a=$t(this,i)/3;break;case"second":a=(this-i)/1e3;break;case"minute":a=(this-i)/6e4;break;case"hour":a=(this-i)/36e5;break;case"day":a=(this-i-r)/864e5;break;case"week":a=(this-i-r)/6048e5;break;default:a=this-i}return n?a:q(a)},bn.endOf=function(e){var t,n;if(void 0===(e=B(e))||"millisecond"===e||!this.isValid())return this;switch(n=this._isUTC?un:sn,e){case"year":t=n(this.year()+1,0,1)-1;break;case"quarter":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=n(this.year(),this.month()+1,1)-1;break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=rn-on(t+(this._isUTC?0:this.utcOffset()*nn),rn)-1;break;case"minute":t=this._d.valueOf(),t+=nn-on(t,nn)-1;break;case"second":t=this._d.valueOf(),t+=tn-on(t,tn)-1}return this._d.setTime(t),r.updateOffset(this,!0),this},bn.format=function(e){e||(e=this.isUtc()?r.defaultFormatUtc:r.defaultFormat);var t=F(this,e);return this.localeData().postformat(t)},bn.from=function(e,t){return this.isValid()&&(k(e)&&e.isValid()||Ct(e).isValid())?Bt({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},bn.fromNow=function(e){return this.from(Ct(),e)},bn.to=function(e,t){return this.isValid()&&(k(e)&&e.isValid()||Ct(e).isValid())?Bt({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},bn.toNow=function(e){return this.to(Ct(),e)},bn.get=function(e){return T(this[e=B(e)])?this[e]():this},bn.invalidAt=function(){return m(this).overflow},bn.isAfter=function(e,t){var n=k(e)?e:Ct(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=B(t)||"millisecond")?this.valueOf()>n.valueOf():n.valueOf()9999?F(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):T(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",F(n,"Z")):F(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},bn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e,t,n="moment",i="";return this.isLocal()||(n=0===this.utcOffset()?"moment.utc":"moment.parseZone",i="Z"),e="["+n+'("]',t=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",this.format(e+t+"-MM-DD[T]HH:mm:ss.SSS"+i+'[")]')},"undefined"!=typeof Symbol&&null!=Symbol.for&&(bn[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),bn.toJSON=function(){return this.isValid()?this.toISOString():null},bn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},bn.unix=function(){return Math.floor(this.valueOf()/1e3)},bn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},bn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},bn.eraName=function(){var e,t,n,i=this.localeData().eras();for(e=0,t=i.length;ethis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},bn.isLocal=function(){return!!this.isValid()&&!this._isUTC},bn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},bn.isUtc=Ht,bn.isUTC=Ht,bn.zoneAbbr=function(){return this._isUTC?"UTC":""},bn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},bn.dates=S("dates accessor is deprecated. Use date instead.",pn),bn.months=S("months accessor is deprecated. Use month instead",Oe),bn.years=S("years accessor is deprecated. Use year instead",Pe),bn.zone=S("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),bn.isDSTShifted=S("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e,t={};return b(t,this),(t=Mt(t))._a?(e=t._isUTC?p(t._a):Ct(t._a),this._isDSTShifted=this.isValid()&&function(e,t,n){var i,r=Math.min(e.length,t.length),a=Math.abs(e.length-t.length),o=0;for(i=0;i0):this._isDSTShifted=!1,this._isDSTShifted});var kn=O.prototype;function Mn(e,t,n,i){var r=ut(),a=p().set(i,t);return r[n](a,e)}function Sn(e,t,n){if(c(e)&&(t=e,e=void 0),e=e||"",null!=t)return Mn(e,t,n,"month");var i,r=[];for(i=0;i<12;i++)r[i]=Mn(e,i,n,"month");return r}function Cn(e,t,n,i){"boolean"==typeof e?(c(t)&&(n=t,t=void 0),t=t||""):(n=t=e,e=!1,c(t)&&(n=t,t=void 0),t=t||"");var r,a=ut(),o=e?a._week.dow:0,s=[];if(null!=n)return Mn(t,(n+o)%7,i,"day");for(r=0;r<7;r++)s[r]=Mn(t,(r+o)%7,i,"day");return s}kn.calendar=function(e,t,n){var i=this._calendar[e]||this._calendar.sameElse;return T(i)?i.call(t,n):i},kn.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match(Y).map(function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e}).join(""),this._longDateFormat[e])},kn.invalidDate=function(){return this._invalidDate},kn.ordinal=function(e){return this._ordinal.replace("%d",e)},kn.preparse=wn,kn.postformat=wn,kn.relativeTime=function(e,t,n,i){var r=this._relativeTime[n];return T(r)?r(e,t,n,i):r.replace(/%d/i,e)},kn.pastFuture=function(e,t){var n=this._relativeTime[e>0?"future":"past"];return T(n)?n(t):n.replace(/%s/i,t)},kn.set=function(e){var t,n;for(n in e)s(e,n)&&(T(t=e[n])?this[n]=t:this["_"+n]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},kn.eras=function(e,t){var n,i,a,o=this._eras||ut("en")._eras;for(n=0,i=o.length;n=0)return u[i]},kn.erasConvertYear=function(e,t){var n=e.since<=e.until?1:-1;return void 0===t?r(e.since).year():r(e.since).year()+(t-e.offset)*n},kn.erasAbbrRegex=function(e){return s(this,"_erasAbbrRegex")||cn.call(this),e?this._erasAbbrRegex:this._erasRegex},kn.erasNameRegex=function(e){return s(this,"_erasNameRegex")||cn.call(this),e?this._erasNameRegex:this._erasRegex},kn.erasNarrowRegex=function(e){return s(this,"_erasNarrowRegex")||cn.call(this),e?this._erasNarrowRegex:this._erasRegex},kn.months=function(e,t){return e?a(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||Ce).test(t)?"format":"standalone"][e.month()]:a(this._months)?this._months:this._months.standalone},kn.monthsShort=function(e,t){return e?a(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[Ce.test(t)?"format":"standalone"][e.month()]:a(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},kn.monthsParse=function(e,t,n){var i,r,a;if(this._monthsParseExact)return Te.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(r=p([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(r,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(r,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(a="^"+this.months(r,"")+"|^"+this.monthsShort(r,""),this._monthsParse[i]=new RegExp(a.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[i].test(e))return i;if(n&&"MMM"===t&&this._shortMonthsParse[i].test(e))return i;if(!n&&this._monthsParse[i].test(e))return i}},kn.monthsRegex=function(e){return this._monthsParseExact?(s(this,"_monthsRegex")||Ee.call(this),e?this._monthsStrictRegex:this._monthsRegex):(s(this,"_monthsRegex")||(this._monthsRegex=xe),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},kn.monthsShortRegex=function(e){return this._monthsParseExact?(s(this,"_monthsRegex")||Ee.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(s(this,"_monthsShortRegex")||(this._monthsShortRegex=Le),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},kn.week=function(e){return He(e,this._week.dow,this._week.doy).week},kn.firstDayOfYear=function(){return this._week.doy},kn.firstDayOfWeek=function(){return this._week.dow},kn.weekdays=function(e,t){var n=a(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"];return!0===e?Ne(n,this._week.dow):e?n[e.day()]:n},kn.weekdaysMin=function(e){return!0===e?Ne(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin},kn.weekdaysShort=function(e){return!0===e?Ne(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort},kn.weekdaysParse=function(e,t,n){var i,r,a;if(this._weekdaysParseExact)return Ge.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(r=p([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(r,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(r,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(r,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[i]||(a="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[i]=new RegExp(a.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[i].test(e))return i;if(n&&"ddd"===t&&this._shortWeekdaysParse[i].test(e))return i;if(n&&"dd"===t&&this._minWeekdaysParse[i].test(e))return i;if(!n&&this._weekdaysParse[i].test(e))return i}},kn.weekdaysRegex=function(e){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||Ke.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(s(this,"_weekdaysRegex")||(this._weekdaysRegex=Ue),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},kn.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||Ke.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(s(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ze),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},kn.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||Ke.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(s(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=qe),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},kn.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},kn.meridiem=function(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"},ot("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===G(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),r.lang=S("moment.lang is deprecated. Use moment.locale instead.",ot),r.langData=S("moment.langData is deprecated. Use moment.localeData instead.",ut);var Ln=Math.abs;function xn(e,t,n,i){var r=Bt(t,n);return e._milliseconds+=i*r._milliseconds,e._days+=i*r._days,e._months+=i*r._months,e._bubble()}function Tn(e){return e<0?Math.floor(e):Math.ceil(e)}function Dn(e){return 4800*e/146097}function On(e){return 146097*e/4800}function En(e){return function(){return this.as(e)}}var Yn=En("ms"),Pn=En("s"),An=En("m"),In=En("h"),Rn=En("d"),Fn=En("w"),Hn=En("M"),jn=En("Q"),Nn=En("y");function Bn(e){return function(){return this.isValid()?this._data[e]:NaN}}var Wn=Bn("milliseconds"),Vn=Bn("seconds"),Un=Bn("minutes"),zn=Bn("hours"),qn=Bn("days"),Gn=Bn("months"),Kn=Bn("years"),Jn=Math.round,Zn={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function $n(e,t,n,i,r){return r.relativeTime(t||1,!!n,e,i)}var Xn=Math.abs;function Qn(e){return(e>0)-(e<0)||+e}function ei(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,i,r,a,o,s,u=Xn(this._milliseconds)/1e3,l=Xn(this._days),c=Xn(this._months),d=this.asSeconds();return d?(e=q(u/60),t=q(e/60),u%=60,e%=60,n=q(c/12),c%=12,i=u?u.toFixed(3).replace(/\.?0+$/,""):"",r=d<0?"-":"",a=Qn(this._months)!==Qn(d)?"-":"",o=Qn(this._days)!==Qn(d)?"-":"",s=Qn(this._milliseconds)!==Qn(d)?"-":"",r+"P"+(n?a+n+"Y":"")+(c?a+c+"M":"")+(l?o+l+"D":"")+(t||e||u?"T":"")+(t?s+t+"H":"")+(e?s+e+"M":"")+(u?s+i+"S":"")):"P0D"}var ti=Ot.prototype;return ti.isValid=function(){return this._isValid},ti.abs=function(){var e=this._data;return this._milliseconds=Ln(this._milliseconds),this._days=Ln(this._days),this._months=Ln(this._months),e.milliseconds=Ln(e.milliseconds),e.seconds=Ln(e.seconds),e.minutes=Ln(e.minutes),e.hours=Ln(e.hours),e.months=Ln(e.months),e.years=Ln(e.years),this},ti.add=function(e,t){return xn(this,e,t,1)},ti.subtract=function(e,t){return xn(this,e,t,-1)},ti.as=function(e){if(!this.isValid())return NaN;var t,n,i=this._milliseconds;if("month"===(e=B(e))||"quarter"===e||"year"===e)switch(n=this._months+Dn(t=this._days+i/864e5),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(On(this._months)),e){case"week":return t/7+i/6048e5;case"day":return t+i/864e5;case"hour":return 24*t+i/36e5;case"minute":return 1440*t+i/6e4;case"second":return 86400*t+i/1e3;case"millisecond":return Math.floor(864e5*t)+i;default:throw new Error("Unknown unit "+e)}},ti.asMilliseconds=Yn,ti.asSeconds=Pn,ti.asMinutes=An,ti.asHours=In,ti.asDays=Rn,ti.asWeeks=Fn,ti.asMonths=Hn,ti.asQuarters=jn,ti.asYears=Nn,ti.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*G(this._months/12):NaN},ti._bubble=function(){var e,t,n,i,r,a=this._milliseconds,o=this._days,s=this._months,u=this._data;return a>=0&&o>=0&&s>=0||a<=0&&o<=0&&s<=0||(a+=864e5*Tn(On(s)+o),o=0,s=0),u.milliseconds=a%1e3,e=q(a/1e3),u.seconds=e%60,t=q(e/60),u.minutes=t%60,n=q(t/60),u.hours=n%24,o+=q(n/24),s+=r=q(Dn(o)),o-=Tn(On(r)),i=q(s/12),s%=12,u.days=o,u.months=s,u.years=i,this},ti.clone=function(){return Bt(this)},ti.get=function(e){return e=B(e),this.isValid()?this[e+"s"]():NaN},ti.milliseconds=Wn,ti.seconds=Vn,ti.minutes=Un,ti.hours=zn,ti.days=qn,ti.weeks=function(){return q(this.days()/7)},ti.months=Gn,ti.years=Kn,ti.humanize=function(e,t){if(!this.isValid())return this.localeData().invalidDate();var n,i,r=!1,a=Zn;return"object"==typeof e&&(t=e,e=!1),"boolean"==typeof e&&(r=e),"object"==typeof t&&(a=Object.assign({},Zn,t),null!=t.s&&null==t.ss&&(a.ss=t.s-1)),i=function(e,t,n,i){var r=Bt(e).abs(),a=Jn(r.as("s")),o=Jn(r.as("m")),s=Jn(r.as("h")),u=Jn(r.as("d")),l=Jn(r.as("M")),c=Jn(r.as("w")),d=Jn(r.as("y")),h=a<=n.ss&&["s",a]||a0,h[4]=i,$n.apply(null,h)}(this,!r,a,n=this.localeData()),r&&(i=n.pastFuture(+this,i)),n.postformat(i)},ti.toISOString=ei,ti.toString=ei,ti.toJSON=ei,ti.locale=Xt,ti.localeData=en,ti.toIsoString=S("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ei),ti.lang=Qt,R("X",0,0,"unix"),R("x",0,0,"valueOf"),pe("x",ce),pe("X",/[+-]?\d+(\.\d{1,3})?/),ye("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e))}),ye("x",function(e,t,n){n._d=new Date(G(e))}),r.version="2.29.1",t=Ct,r.fn=bn,r.min=function(){return Tt("isBefore",[].slice.call(arguments,0))},r.max=function(){return Tt("isAfter",[].slice.call(arguments,0))},r.now=function(){return Date.now?Date.now():+new Date},r.utc=p,r.unix=function(e){return Ct(1e3*e)},r.months=function(e,t){return Sn(e,t,"months")},r.isDate=d,r.locale=ot,r.invalid=v,r.duration=Bt,r.isMoment=k,r.weekdays=function(e,t,n){return Cn(e,t,n,"weekdays")},r.parseZone=function(){return Ct.apply(null,arguments).parseZone()},r.localeData=ut,r.isDuration=Et,r.monthsShort=function(e,t){return Sn(e,t,"monthsShort")},r.weekdaysMin=function(e,t,n){return Cn(e,t,n,"weekdaysMin")},r.defineLocale=st,r.updateLocale=function(e,t){if(null!=t){var n,i,r=et;null!=tt[e]&&null!=tt[e].parentLocale?tt[e].set(D(tt[e]._config,t)):(null!=(i=at(e))&&(r=i._config),t=D(r,t),null==i&&(t.abbr=e),(n=new O(t)).parentLocale=tt[e],tt[e]=n),ot(e)}else null!=tt[e]&&(null!=tt[e].parentLocale?(tt[e]=tt[e].parentLocale,e===ot()&&ot(e)):null!=tt[e]&&delete tt[e]);return tt[e]},r.locales=function(){return C(tt)},r.weekdaysShort=function(e,t,n){return Cn(e,t,n,"weekdaysShort")},r.normalizeUnits=B,r.relativeTimeRounding=function(e){return void 0===e?Jn:"function"==typeof e&&(Jn=e,!0)},r.relativeTimeThreshold=function(e,t){return void 0!==Zn[e]&&(void 0===t?Zn[e]:(Zn[e]=t,"s"===e&&(Zn.ss=t-1),!0))},r.calendarFormat=function(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},r.prototype=bn,r.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},r}()},27015:function(e,t,n){var i=n(23833),r=i.Buffer;function a(e,t){for(var n in e)t[n]=e[n]}function o(e,t,n){return r(e,t,n)}r.from&&r.alloc&&r.allocUnsafe&&r.allocUnsafeSlow?e.exports=i:(a(i,t),t.Buffer=o),o.prototype=Object.create(r.prototype),a(r,o),o.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return r(e,t,n)},o.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var i=r(e);return void 0!==t?"string"==typeof n?i.fill(t,n):i.fill(t):i.fill(0),i},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i.SlowBuffer(e)}},58819:function(e,t,n){"use strict";function i(e){return(i=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function r(e,t,n){return(r="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(e,t,n){var r=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=i(e)););return e}(e,t);if(r){var a=Object.getOwnPropertyDescriptor(r,t);return a.get?a.get.call(n):a.value}})(e,t,n||e)}function a(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,i=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw a}}}}function _(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=e&&("undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"]);if(null!=n){var i,r,a=[],o=!0,s=!1;try{for(n=n.call(e);!(o=(i=n.next()).done)&&(a.push(i.value),!t||a.length!==t);o=!0);}catch(u){s=!0,r=u}finally{try{o||null==n.return||n.return()}finally{if(s)throw r}}return a}}(e,t)||g(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function y(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function b(e){return function(e){if(Array.isArray(e))return m(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||g(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function w(e,t,n){return(w=c()?Reflect.construct:function(e,t,n){var i=[null];i.push.apply(i,t);var r=new(Function.bind.apply(e,i));return n&&u(r,n.prototype),r}).apply(null,arguments)}function k(e){var t="function"==typeof Map?new Map:void 0;return(k=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return w(e,arguments,i(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),u(n,e)})(e)}var M=function(){return Array.isArray||function(e){return e&&"number"==typeof e.length}}();function S(e){return null!==e&&"object"==typeof e}function C(e){return"function"==typeof e}var L=function(){function e(e){return Error.call(this),this.message=e?"".concat(e.length," errors occurred during unsubscription:\n").concat(e.map(function(e,t){return"".concat(t+1,") ").concat(e.toString())}).join("\n ")):"",this.name="UnsubscriptionError",this.errors=e,this}return e.prototype=Object.create(Error.prototype),e}(),x=function(){var e=function(){function e(t){s(this,e),this.closed=!1,this._parentOrParents=null,this._subscriptions=null,t&&(this._ctorUnsubscribe=!0,this._unsubscribe=t)}return o(e,[{key:"unsubscribe",value:function(){var t;if(!this.closed){var n=this._parentOrParents,i=this._ctorUnsubscribe,r=this._unsubscribe,a=this._subscriptions;if(this.closed=!0,this._parentOrParents=null,this._subscriptions=null,n instanceof e)n.remove(this);else if(null!==n)for(var o=0;o2&&void 0!==arguments[2]?arguments[2]:Number.POSITIVE_INFINITY;return"function"==typeof t?function(i){return i.pipe(ue(function(n,i){return re(e(n,i)).pipe(K(function(e,r){return t(n,e,i,r)}))},n))}:("number"==typeof t&&(n=t),function(t){return t.lift(new le(e,n))})}var le=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.POSITIVE_INFINITY;s(this,e),this.project=t,this.concurrent=n}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new ce(e,this.project,this.concurrent))}}]),e}(),ce=function(e){l(n,e);var t=p(n);function n(e,i){var r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Number.POSITIVE_INFINITY;return s(this,n),(r=t.call(this,e)).project=i,r.concurrent=a,r.hasCompleted=!1,r.buffer=[],r.active=0,r.index=0,r}return o(n,[{key:"_next",value:function(e){this.active0?this._next(e.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()}}]),n}(oe),de=ue;function he(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Number.POSITIVE_INFINITY;return ue(F,e)}function fe(e,t){return t?ie(e,t):new N($(e))}function pe(){for(var e=Number.POSITIVE_INFINITY,t=null,n=arguments.length,i=new Array(n),r=0;r1&&"number"==typeof i[i.length-1]&&(e=i.pop())):"number"==typeof a&&(e=i.pop()),null===t&&1===i.length&&i[0]instanceof N?i[0]:he(e)(fe(i,t))}function me(){return function(e){return e.lift(new ge(e))}}var ge=function(){function e(t){s(this,e),this.connectable=t}return o(e,[{key:"call",value:function(e,t){var n=this.connectable;n._refCount++;var i=new ve(e,n),r=t.subscribe(i);return i.closed||(i.connection=n.connect()),r}}]),e}(),ve=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e)).connectable=i,r}return o(n,[{key:"_unsubscribe",value:function(){var e=this.connectable;if(e){this.connectable=null;var t=e._refCount;if(t<=0)this.connection=null;else if(e._refCount=t-1,t>1)this.connection=null;else{var n=this.connection,i=e._connection;this.connection=null,!i||n&&i!==n||i.unsubscribe()}}else this.connection=null}}]),n}(A),_e=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this)).source=e,r.subjectFactory=i,r._refCount=0,r._isComplete=!1,r}return o(n,[{key:"_subscribe",value:function(e){return this.getSubject().subscribe(e)}},{key:"getSubject",value:function(){var e=this._subject;return e&&!e.isStopped||(this._subject=this.subjectFactory()),this._subject}},{key:"connect",value:function(){var e=this._connection;return e||(this._isComplete=!1,(e=this._connection=new x).add(this.source.subscribe(new be(this.getSubject(),this))),e.closed&&(this._connection=null,e=x.EMPTY)),e}},{key:"refCount",value:function(){return me()(this)}}]),n}(N),ye=function(){var e=_e.prototype;return{operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:e._subscribe},_isComplete:{value:e._isComplete,writable:!0},getSubject:{value:e.getSubject},connect:{value:e.connect},refCount:{value:e.refCount}}}(),be=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e)).connectable=i,r}return o(n,[{key:"_error",value:function(e){this._unsubscribe(),r(i(n.prototype),"_error",this).call(this,e)}},{key:"_complete",value:function(){this.connectable._isComplete=!0,this._unsubscribe(),r(i(n.prototype),"_complete",this).call(this)}},{key:"_unsubscribe",value:function(){var e=this.connectable;if(e){this.connectable=null;var t=e._connection;e._refCount=0,e._subject=null,e._connection=null,t&&t.unsubscribe()}}}]),n}(U);function we(){return new z}function ke(){return function(e){return me()((t=we,function(e){var n;n="function"==typeof t?t:function(){return t};var i=Object.create(e,ye);return i.source=e,i.subjectFactory=n,i})(e));var t}}function Me(e){for(var t in e)if(e[t]===Me)return t;throw Error("Could not find renamed property on target object.")}function Se(e,t){for(var n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n])}function Ce(e){if("string"==typeof e)return e;if(Array.isArray(e))return"["+e.map(Ce).join(", ")+"]";if(null==e)return""+e;if(e.overriddenName)return"".concat(e.overriddenName);if(e.name)return"".concat(e.name);var t=e.toString();if(null==t)return""+t;var n=t.indexOf("\n");return-1===n?t:t.substring(0,n)}function Le(e,t){return null==e||""===e?null===t?"":t:null==t||""===t?e:e+" "+t}var xe=Me({__forward_ref__:Me});function Te(e){return e.__forward_ref__=Te,e.toString=function(){return Ce(this())},e}function De(e){return Oe(e)?e():e}function Oe(e){return"function"==typeof e&&e.hasOwnProperty(xe)&&e.__forward_ref__===Te}var Ee=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,function(e,t){var n=e?"NG0".concat(e,": "):"";return"".concat(n).concat(t)}(e,i))).code=e,r}return n}(k(Error));function Ye(e){return"string"==typeof e?e:null==e?"":String(e)}function Pe(e){return"function"==typeof e?e.name||e.toString():"object"==typeof e&&null!=e&&"function"==typeof e.type?e.type.name||e.type.toString():Ye(e)}function Ae(e,t){var n=t?" in ".concat(t):"";throw new Ee("201","No provider for ".concat(Pe(e)," found").concat(n))}function Ie(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function Re(e){return{providers:e.providers||[],imports:e.imports||[]}}function Fe(e){return He(e,Be)||He(e,Ve)}function He(e,t){return e.hasOwnProperty(t)?e[t]:null}function je(e){return e&&(e.hasOwnProperty(We)||e.hasOwnProperty(Ue))?e[We]:null}var Ne,Be=Me({"\u0275prov":Me}),We=Me({"\u0275inj":Me}),Ve=Me({ngInjectableDef:Me}),Ue=Me({ngInjectorDef:Me}),ze=function(e){return e[e.Default=0]="Default",e[e.Host=1]="Host",e[e.Self=2]="Self",e[e.SkipSelf=4]="SkipSelf",e[e.Optional=8]="Optional",e}({});function qe(){return Ne}function Ge(e){var t=Ne;return Ne=e,t}function Ke(e,t,n){var i=Fe(e);return i&&"root"==i.providedIn?void 0===i.value?i.value=i.factory():i.value:n&ze.Optional?null:void 0!==t?t:void Ae(Ce(e),"Injector")}function Je(e){return{toString:e}.toString()}var Ze=function(e){return e[e.OnPush=0]="OnPush",e[e.Default=1]="Default",e}({}),$e=function(e){return e[e.Emulated=0]="Emulated",e[e.None=2]="None",e[e.ShadowDom=3]="ShadowDom",e}({}),Xe="undefined"!=typeof globalThis&&globalThis,Qe="undefined"!=typeof window&&window,et="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,tt="undefined"!=typeof global&&global,nt=Xe||tt||Qe||et,it={},rt=[],at=Me({"\u0275cmp":Me}),ot=Me({"\u0275dir":Me}),st=Me({"\u0275pipe":Me}),ut=Me({"\u0275mod":Me}),lt=Me({"\u0275loc":Me}),ct=Me({"\u0275fac":Me}),dt=Me({__NG_ELEMENT_ID__:Me}),ht=0;function ft(e){return Je(function(){var t={},n={type:e.type,providersResolver:null,decls:e.decls,vars:e.vars,factory:null,template:e.template||null,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:t,inputs:null,outputs:null,exportAs:e.exportAs||null,onPush:e.changeDetection===Ze.OnPush,directiveDefs:null,pipeDefs:null,selectors:e.selectors||rt,viewQuery:e.viewQuery||null,features:e.features||null,data:e.data||{},encapsulation:e.encapsulation||$e.Emulated,id:"c",styles:e.styles||rt,_:null,setInput:null,schemas:e.schemas||null,tView:null},i=e.directives,r=e.features,a=e.pipes;return n.id+=ht++,n.inputs=yt(e.inputs,t),n.outputs=yt(e.outputs),r&&r.forEach(function(e){return e(n)}),n.directiveDefs=i?function(){return("function"==typeof i?i():i).map(mt)}:null,n.pipeDefs=a?function(){return("function"==typeof a?a():a).map(gt)}:null,n})}function pt(e,t,n){var i=e.\u0275cmp;i.directiveDefs=function(){return t.map(mt)},i.pipeDefs=function(){return n.map(gt)}}function mt(e){return kt(e)||function(e){return e[ot]||null}(e)}function gt(e){return function(e){return e[st]||null}(e)}var vt={};function _t(e){return Je(function(){var t={type:e.type,bootstrap:e.bootstrap||rt,declarations:e.declarations||rt,imports:e.imports||rt,exports:e.exports||rt,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null};return null!=e.id&&(vt[e.id]=e.type),t})}function yt(e,t){if(null==e)return it;var n={};for(var i in e)if(e.hasOwnProperty(i)){var r=e[i],a=r;Array.isArray(r)&&(a=r[1],r=r[0]),n[r]=i,t&&(t[r]=a)}return n}var bt=ft;function wt(e){return{type:e.type,name:e.name,factory:null,pure:!1!==e.pure,onDestroy:e.type.prototype.ngOnDestroy||null}}function kt(e){return e[at]||null}function Mt(e,t){var n=e[ut]||null;if(!n&&!0===t)throw new Error("Type ".concat(Ce(e)," does not have '\u0275mod' property."));return n}var St=20,Ct=10;function Lt(e){return Array.isArray(e)&&"object"==typeof e[1]}function xt(e){return Array.isArray(e)&&!0===e[1]}function Tt(e){return 0!=(8&e.flags)}function Dt(e){return 2==(2&e.flags)}function Ot(e){return 1==(1&e.flags)}function Et(e){return null!==e.template}function Yt(e,t){return e.hasOwnProperty(ct)?e[ct]:null}var Pt=function(){function e(t,n,i){s(this,e),this.previousValue=t,this.currentValue=n,this.firstChange=i}return o(e,[{key:"isFirstChange",value:function(){return this.firstChange}}]),e}();function At(){return It}function It(e){return e.type.prototype.ngOnChanges&&(e.setInput=Ft),Rt}function Rt(){var e=Ht(this),t=null==e?void 0:e.current;if(t){var n=e.previous;if(n===it)e.previous=t;else for(var i in t)n[i]=t[i];e.current=null,this.ngOnChanges(t)}}function Ft(e,t,n,i){var r=Ht(e)||function(e,t){return e.__ngSimpleChanges__=t}(e,{previous:it,current:null}),a=r.current||(r.current={}),o=r.previous,s=this.declaredInputs[n],u=o[s];a[s]=new Pt(u&&u.currentValue,t,o===it),e[i]=t}function Ht(e){return e.__ngSimpleChanges__||null}At.ngInherit=!0;var jt="http://www.w3.org/2000/svg",Nt=void 0;function Bt(){return void 0!==Nt?Nt:"undefined"!=typeof document?document:void 0}function Wt(e){return!!e.listen}var Vt={createRenderer:function(e,t){return Bt()}};function Ut(e){for(;Array.isArray(e);)e=e[0];return e}function zt(e,t){return Ut(t[e])}function qt(e,t){return Ut(t[e.index])}function Gt(e,t){return e.data[t]}function Kt(e,t){return e[t]}function Jt(e,t){var n=t[e];return Lt(n)?n:n[0]}function Zt(e){return 4==(4&e[2])}function $t(e){return 128==(128&e[2])}function Xt(e,t){return null==t?null:e[t]}function Qt(e){e[18]=0}function en(e,t){e[5]+=t;for(var n=e,i=e[3];null!==i&&(1===t&&1===n[5]||-1===t&&0===n[5]);)i[5]+=t,n=i,i=i[3]}var tn={lFrame:Ln(null),bindingsEnabled:!0,isInCheckNoChangesMode:!1};function nn(){return tn.bindingsEnabled}function rn(){return tn.lFrame.lView}function an(){return tn.lFrame.tView}function on(e){return tn.lFrame.contextLView=e,e[8]}function sn(){for(var e=un();null!==e&&64===e.type;)e=e.parent;return e}function un(){return tn.lFrame.currentTNode}function ln(e,t){var n=tn.lFrame;n.currentTNode=e,n.isParent=t}function cn(){return tn.lFrame.isParent}function dn(){tn.lFrame.isParent=!1}function hn(){return tn.isInCheckNoChangesMode}function fn(e){tn.isInCheckNoChangesMode=e}function pn(){var e=tn.lFrame,t=e.bindingRootIndex;return-1===t&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function mn(){return tn.lFrame.bindingIndex}function gn(){return tn.lFrame.bindingIndex++}function vn(e){var t=tn.lFrame,n=t.bindingIndex;return t.bindingIndex=t.bindingIndex+e,n}function _n(e){tn.lFrame.currentDirectiveIndex=e}function yn(e){var t=tn.lFrame.currentDirectiveIndex;return-1===t?null:e[t]}function bn(){return tn.lFrame.currentQueryIndex}function wn(e){tn.lFrame.currentQueryIndex=e}function kn(e){var t=e[1];return 2===t.type?t.declTNode:1===t.type?e[6]:null}function Mn(e,t,n){if(n&ze.SkipSelf){for(var i=t,r=e;!(null!==(i=i.parent)||n&ze.Host||null===(i=kn(r))||(r=r[15],10&i.type)););if(null===i)return!1;t=i,e=r}var a=tn.lFrame=Cn();return a.currentTNode=t,a.lView=e,!0}function Sn(e){var t=Cn(),n=e[1];tn.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function Cn(){var e=tn.lFrame,t=null===e?null:e.child;return null===t?Ln(e):t}function Ln(e){var t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return null!==e&&(e.child=t),t}function xn(){var e=tn.lFrame;return tn.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var Tn=xn;function Dn(){var e=xn();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function On(e){return(tn.lFrame.contextLView=function(e,t){for(;e>0;)t=t[15],e--;return t}(e,tn.lFrame.contextLView))[8]}function En(){return tn.lFrame.selectedIndex}function Yn(e){tn.lFrame.selectedIndex=e}function Pn(){var e=tn.lFrame;return Gt(e.tView,e.selectedIndex)}function An(){tn.lFrame.currentNamespace=jt}function In(){tn.lFrame.currentNamespace=null}function Rn(e,t){for(var n=t.directiveStart,i=t.directiveEnd;n=i)break}else t[s]<0&&(e[18]+=65536),(o>11>16&&(3&e[2])===t){e[2]+=2048;try{a.call(o)}finally{}}}else try{a.call(o)}finally{}}var Wn=-1,Vn=function e(t,n,i){s(this,e),this.factory=t,this.resolving=!1,this.canSeeViewProviders=n,this.injectImpl=i};function Un(e,t,n){for(var i=Wt(e),r=0;rt){o=a-1;break}}}for(;a>16,i=t;n>0;)i=i[15],n--;return i}var Xn=!0;function Qn(e){var t=Xn;return Xn=e,t}var ei=0;function ti(e,t){var n=ii(e,t);if(-1!==n)return n;var i=t[1];i.firstCreatePass&&(e.injectorIndex=t.length,ni(i.data,e),ni(t,null),ni(i.blueprint,null));var r=ri(e,t),a=e.injectorIndex;if(Jn(r))for(var o=Zn(r),s=$n(r,t),u=s[1].data,l=0;l<8;l++)t[a+l]=s[o+l]|u[o+l];return t[a+8]=r,a}function ni(e,t){e.push(0,0,0,0,0,0,0,0,t)}function ii(e,t){return-1===e.injectorIndex||e.parent&&e.parent.injectorIndex===e.injectorIndex||null===t[e.injectorIndex+8]?-1:e.injectorIndex}function ri(e,t){if(e.parent&&-1!==e.parent.injectorIndex)return e.parent.injectorIndex;for(var n=0,i=null,r=t;null!==r;){var a=r[1],o=a.type;if(null===(i=2===o?a.declTNode:1===o?r[6]:null))return Wn;if(n++,r=r[15],-1!==i.injectorIndex)return i.injectorIndex|n<<16}return Wn}function ai(e,t,n){!function(e,t,n){var i;"string"==typeof n?i=n.charCodeAt(0)||0:n.hasOwnProperty(dt)&&(i=n[dt]),null==i&&(i=n[dt]=ei++);var r=255&i;t.data[e+(r>>5)]|=1<3&&void 0!==arguments[3]?arguments[3]:ze.Default,r=arguments.length>4?arguments[4]:void 0;if(null!==e){var a=pi(n);if("function"==typeof a){if(!Mn(t,e,i))return i&ze.Host?oi(r,n,i):si(t,n,i,r);try{var o=a(i);if(null!=o||i&ze.Optional)return o;Ae(n)}finally{Tn()}}else if("number"==typeof a){var s=null,u=ii(e,t),l=Wn,c=i&ze.Host?t[16][6]:null;for((-1===u||i&ze.SkipSelf)&&((l=-1===u?ri(e,t):t[u+8])!==Wn&&gi(i,!1)?(s=t[1],u=Zn(l),t=$n(l,t)):u=-1);-1!==u;){var d=t[1];if(mi(a,u,d.data)){var h=di(u,t,n,s,i,c);if(h!==li)return h}(l=t[u+8])!==Wn&&gi(i,t[1].data[u+8]===c)&&mi(a,u,t)?(s=d,u=Zn(l),t=$n(l,t)):u=-1}}}return si(t,n,i,r)}var li={};function ci(){return new vi(sn(),rn())}function di(e,t,n,i,r,a){var o=t[1],s=o.data[e+8],u=hi(s,o,n,null==i?Dt(s)&&Xn:i!=o&&0!=(3&s.type),r&ze.Host&&a===s);return null!==u?fi(t,o,u,s):li}function hi(e,t,n,i,r){for(var a=e.providerIndexes,o=t.data,s=1048575&a,u=e.directiveStart,l=a>>20,c=r?s+l:e.directiveEnd,d=i?s:s+l;d=u&&h.type===n)return d}if(r){var f=o[u];if(f&&Et(f)&&f.type===n)return u}return null}function fi(e,t,n,i){var r=e[n],a=t.data;if(r instanceof Vn){var o=r;o.resolving&&function(e,t){throw new Ee("200","Circular dependency in DI detected for ".concat(e).concat(""))}(Pe(a[n]));var s=Qn(o.canSeeViewProviders);o.resolving=!0;var u=o.injectImpl?Ge(o.injectImpl):null;Mn(e,i,ze.Default);try{r=e[n]=o.factory(void 0,a,e,i),t.firstCreatePass&&n>=i.directiveStart&&function(e,t,n){var i=t.type.prototype,r=i.ngOnInit,a=i.ngDoCheck;if(i.ngOnChanges){var o=It(t);(n.preOrderHooks||(n.preOrderHooks=[])).push(e,o),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(e,o)}r&&(n.preOrderHooks||(n.preOrderHooks=[])).push(0-e,r),a&&((n.preOrderHooks||(n.preOrderHooks=[])).push(e,a),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(e,a))}(n,a[n],t)}finally{null!==u&&Ge(u),Qn(s),o.resolving=!1,Tn()}}return r}function pi(e){if("string"==typeof e)return e.charCodeAt(0)||0;var t=e.hasOwnProperty(dt)?e[dt]:void 0;return"number"==typeof t?t>=0?255&t:ci:t}function mi(e,t,n){return!!(n[t+(e>>5)]&1<=e.length?e.push(n):e.splice(t,0,n)}function Di(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function Oi(e,t){for(var n=[],i=0;i=0?e[1|i]=n:function(e,t,n,i){var r=e.length;if(r==t)e.push(n,i);else if(1===r)e.push(i,e[0]),e[0]=n;else{for(r--,e.push(e[r-1],e[r]);r>t;)e[r]=e[r-2],r--;e[t]=n,e[t+1]=i}}(e,i=~i,t,n),i}function Yi(e,t){var n=Pi(e,t);if(n>=0)return e[1|n]}function Pi(e,t){return function(e,t,n){for(var i=0,r=e.length>>1;r!==i;){var a=i+(r-i>>1),o=e[a<<1];if(t===o)return a<<1;o>t?r=a:i=a+1}return~(r<<1)}(e,t)}var Ai={},Ii=/\n/gm,Ri="__source",Fi=Me({provide:String,useValue:Me}),Hi=void 0;function ji(e){var t=Hi;return Hi=e,t}function Ni(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ze.Default;if(void 0===Hi)throw new Error("inject() must be called from an injection context");return null===Hi?Ke(e,void 0,t):Hi.get(e,t&ze.Optional?null:void 0,t)}function Bi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ze.Default;return(qe()||Ni)(De(e),t)}var Wi=Bi;function Vi(e){for(var t=[],n=0;n3&&void 0!==arguments[3]?arguments[3]:null;e=e&&"\n"===e.charAt(0)&&"\u0275"==e.charAt(1)?e.substr(2):e;var r=Ce(t);if(Array.isArray(t))r=t.map(Ce).join(" -> ");else if("object"==typeof t){var a=[];for(var o in t)if(t.hasOwnProperty(o)){var s=t[o];a.push(o+":"+("string"==typeof s?JSON.stringify(s):Ce(s)))}r="{".concat(a.join(", "),"}")}return"".concat(n).concat(i?"("+i+")":"","[").concat(r,"]: ").concat(e.replace(Ii,"\n "))}("\n"+e.message,r,n,i),e.ngTokenPath=r,e.ngTempTokenPath=null,e}var qi,Gi,Ki=Ui(ki("Inject",function(e){return{token:e}}),-1),Ji=Ui(ki("Optional"),8),Zi=Ui(ki("SkipSelf"),4);function $i(e){var t;return(null===(t=function(){if(void 0===qi&&(qi=null,nt.trustedTypes))try{qi=nt.trustedTypes.createPolicy("angular",{createHTML:function(e){return e},createScript:function(e){return e},createScriptURL:function(e){return e}})}catch(t){}return qi}())||void 0===t?void 0:t.createHTML(e))||e}function Xi(e){var t;return(null===(t=function(){if(void 0===Gi&&(Gi=null,nt.trustedTypes))try{Gi=nt.trustedTypes.createPolicy("angular#unsafe-bypass",{createHTML:function(e){return e},createScript:function(e){return e},createScriptURL:function(e){return e}})}catch(t){}return Gi}())||void 0===t?void 0:t.createHTML(e))||e}var Qi=function(){function e(t){s(this,e),this.changingThisBreaksApplicationSecurity=t}return o(e,[{key:"toString",value:function(){return"SafeValue must use [property]=binding: ".concat(this.changingThisBreaksApplicationSecurity)+" (see https://g.co/ng/security#xss)"}}]),e}(),er=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"getTypeName",value:function(){return"HTML"}}]),n}(Qi),tr=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"getTypeName",value:function(){return"Style"}}]),n}(Qi),nr=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"getTypeName",value:function(){return"Script"}}]),n}(Qi),ir=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"getTypeName",value:function(){return"URL"}}]),n}(Qi),rr=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"getTypeName",value:function(){return"ResourceURL"}}]),n}(Qi);function ar(e){return e instanceof Qi?e.changingThisBreaksApplicationSecurity:e}function or(e,t){var n=sr(e);if(null!=n&&n!==t){if("ResourceURL"===n&&"URL"===t)return!0;throw new Error("Required a safe ".concat(t,", got a ").concat(n," (see https://g.co/ng/security#xss)"))}return n===t}function sr(e){return e instanceof Qi&&e.getTypeName()||null}var ur=function(){function e(t){s(this,e),this.inertDocumentHelper=t}return o(e,[{key:"getInertBodyElement",value:function(e){e=""+e;try{var t=(new window.DOMParser).parseFromString($i(e),"text/html").body;return null===t?this.inertDocumentHelper.getInertBodyElement(e):(t.removeChild(t.firstChild),t)}catch(n){return null}}}]),e}(),lr=function(){function e(t){if(s(this,e),this.defaultDoc=t,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert"),null==this.inertDocument.body){var n=this.inertDocument.createElement("html");this.inertDocument.appendChild(n);var i=this.inertDocument.createElement("body");n.appendChild(i)}}return o(e,[{key:"getInertBodyElement",value:function(e){var t=this.inertDocument.createElement("template");if("content"in t)return t.innerHTML=$i(e),t;var n=this.inertDocument.createElement("body");return n.innerHTML=$i(e),this.defaultDoc.documentMode&&this.stripCustomNsAttrs(n),n}},{key:"stripCustomNsAttrs",value:function(e){for(var t=e.attributes,n=t.length-1;0"),!0}},{key:"endElement",value:function(e){var t=e.nodeName.toLowerCase();br.hasOwnProperty(t)&&!gr.hasOwnProperty(t)&&(this.buf.push(""))}},{key:"chars",value:function(e){this.buf.push(Tr(e))}},{key:"checkClobberedElement",value:function(e,t){if(t&&(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)===Node.DOCUMENT_POSITION_CONTAINED_BY)throw new Error("Failed to sanitize html because the element is clobbered: ".concat(e.outerHTML));return t}}]),e}(),Lr=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,xr=/([^\#-~ |!])/g;function Tr(e){return e.replace(/&/g,"&").replace(Lr,function(e){return"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";"}).replace(xr,function(e){return"&#"+e.charCodeAt(0)+";"}).replace(//g,">")}function Dr(e,t){var n=null;try{mr=mr||function(e){var t=new lr(e);return function(){try{return!!(new window.DOMParser).parseFromString($i(""),"text/html")}catch(e){return!1}}()?new ur(t):t}(e);var i=t?String(t):"";n=mr.getInertBodyElement(i);var r=5,a=i;do{if(0===r)throw new Error("Failed to sanitize html because the input is unstable");r--,i=a,a=n.innerHTML,n=mr.getInertBodyElement(i)}while(i!==a);return $i((new Cr).sanitizeChildren(Or(n)||n))}finally{if(n)for(var o=Or(n)||n;o.firstChild;)o.removeChild(o.firstChild)}}function Or(e){return"content"in e&&function(e){return e.nodeType===Node.ELEMENT_NODE&&"TEMPLATE"===e.nodeName}(e)?e.content:null}var Er=function(e){return e[e.NONE=0]="NONE",e[e.HTML=1]="HTML",e[e.STYLE=2]="STYLE",e[e.SCRIPT=3]="SCRIPT",e[e.URL=4]="URL",e[e.RESOURCE_URL=5]="RESOURCE_URL",e}({});function Yr(e){var t=Ar();return t?Xi(t.sanitize(Er.HTML,e)||""):or(e,"HTML")?Xi(ar(e)):Dr(Bt(),Ye(e))}function Pr(e){var t=Ar();return t?t.sanitize(Er.URL,e)||"":or(e,"URL")?ar(e):hr(Ye(e))}function Ar(){var e=rn();return e&&e[12]}function Ir(e,t){e.__ngContext__=t}function Rr(e){var t=function(e){return e.__ngContext__||null}(e);return t?Array.isArray(t)?t:t.lView:null}function Fr(e){return e.ngOriginalError}function Hr(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i0&&(e[i-1][4]=r[4]);var o=Di(e,Ct+t);pa(r[1],n=r,n[11],2,null,null),n[0]=null,n[6]=null;var s=o[19];null!==s&&s.detachView(o[1]),r[3]=null,r[4]=null,r[2]&=-129}return r}}function ea(e,t){if(!(256&t[2])){var n=t[11];Wt(n)&&n.destroyNode&&pa(e,t,n,3,null,null),function(e){var t=e[13];if(!t)return ta(e[1],e);for(;t;){var n=null;if(Lt(t))n=t[13];else{var i=t[10];i&&(n=i)}if(!n){for(;t&&!t[4]&&t!==e;)Lt(t)&&ta(t[1],t),t=t[3];null===t&&(t=e),Lt(t)&&ta(t[1],t),n=t&&t[4]}t=n}}(t)}}function ta(e,t){if(!(256&t[2])){t[2]&=-129,t[2]|=256,function(e,t){var n;if(null!=e&&null!=(n=e.destroyHooks))for(var i=0;i=0?i[r=l]():i[r=-l].unsubscribe(),a+=2}else{var c=i[r=n[a+1]];n[a].call(c)}if(null!==i){for(var d=r+1;da?"":r[c+1].toLowerCase();var h=8&i?d:null;if(h&&-1!==ya(h,l,0)||2&i&&l!==d){if(Ca(i))return!1;o=!0}}}}else{if(!o&&!Ca(i)&&!Ca(u))return!1;if(o&&Ca(u))continue;o=!1,i=u|1&i}}return Ca(i)||o}function Ca(e){return 0==(1&e)}function La(e,t,n,i){if(null===t)return-1;var r=0;if(i||!n){for(var a=!1;r-1)for(n++;n2&&void 0!==arguments[2]&&arguments[2],i=0;i0?'="'+s+'"':"")+"]"}else 8&i?r+="."+o:4&i&&(r+=" "+o);else""===r||Ca(o)||(t+=Da(a,r),r=""),i=o,a=a||!Ca(i);n++}return""!==r&&(t+=Da(a,r)),t}var Ea={};function Ya(e){Pa(an(),rn(),En()+e,hn())}function Pa(e,t,n,i){if(!i)if(3==(3&t[2])){var r=e.preOrderCheckHooks;null!==r&&Fn(t,r,n)}else{var a=e.preOrderHooks;null!==a&&Hn(t,a,0,n)}Yn(n)}function Aa(e,t){return e<<17|t<<2}function Ia(e){return e>>17&32767}function Ra(e){return 2|e}function Fa(e){return(131068&e)>>2}function Ha(e,t){return-131069&e|t<<2}function ja(e){return 1|e}function Na(e,t){var n=e.contentQueries;if(null!==n)for(var i=0;iSt&&Pa(e,t,St,hn()),n(i,r)}finally{Yn(a)}}function Ka(e,t,n){if(Tt(t))for(var i=t.directiveEnd,r=t.directiveStart;r2&&void 0!==arguments[2]?arguments[2]:qt,i=t.localNames;if(null!==i)for(var r=t.index+1,a=0;a0;){var n=e[--t];if("number"==typeof n&&n<0)return n}return 0})(s)!=u&&s.push(u),s.push(i,r,o)}}function ro(e,t){null!==e.hostBindings&&e.hostBindings(1,t)}function ao(e,t){t.flags|=2,(e.components||(e.components=[])).push(t.index)}function oo(e,t,n){if(n){if(t.exportAs)for(var i=0;i0&&mo(n)}}function mo(e){for(var t=qr(e);null!==t;t=Gr(t))for(var n=Ct;n0&&mo(i)}var a=e[1].components;if(null!==a)for(var o=0;o0&&mo(s)}}function go(e,t){var n=Jt(t,e),i=n[1];!function(e,t){for(var n=t.length;n1&&void 0!==arguments[1]?arguments[1]:Ai;if(t===Ai){var n=new Error("NullInjectorError: No provider for ".concat(Ce(e),"!"));throw n.name="NullInjectorError",n}return t}}]),e}(),Yo=new Mi("Set Injector scope."),Po={},Ao={},Io=void 0;function Ro(){return void 0===Io&&(Io=new Eo),Io}function Fo(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3?arguments[3]:void 0;return new Ho(e,n,t||Ro(),i)}var Ho=function(){function e(t,n,i){var r=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;s(this,e),this.parent=i,this.records=new Map,this.injectorDefTypes=new Set,this.onDestroy=new Set,this._destroyed=!1;var o=[];n&&xi(n,function(e){return r.processProvider(e,t,n)}),xi([t],function(e){return r.processInjectorType(e,[],o)}),this.records.set(Oo,Bo(void 0,this));var u=this.records.get(Yo);this.scope=null!=u?u.value:null,this.source=a||("object"==typeof t?null:Ce(t))}return o(e,[{key:"destroyed",get:function(){return this._destroyed}},{key:"destroy",value:function(){this.assertNotDestroyed(),this._destroyed=!0;try{this.onDestroy.forEach(function(e){return e.ngOnDestroy()})}finally{this.records.clear(),this.onDestroy.clear(),this.injectorDefTypes.clear()}}},{key:"get",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Ai,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:ze.Default;this.assertNotDestroyed();var i=ji(this),r=Ge(void 0);try{if(!(n&ze.SkipSelf)){var a=this.records.get(e);if(void 0===a){var o=Uo(e)&&Fe(e);a=o&&this.injectableDefInScope(o)?Bo(jo(e),Po):null,this.records.set(e,a)}if(null!=a)return this.hydrate(e,a)}var s=n&ze.Self?Ro():this.parent;return s.get(e,t=n&ze.Optional&&t===Ai?null:t)}catch(l){if("NullInjectorError"===l.name){var u=l.ngTempTokenPath=l.ngTempTokenPath||[];if(u.unshift(Ce(e)),i)throw l;return zi(l,e,"R3InjectorError",this.source)}throw l}finally{Ge(r),ji(i)}}},{key:"_resolveInjectorDefTypes",value:function(){var e=this;this.injectorDefTypes.forEach(function(t){return e.get(t)})}},{key:"toString",value:function(){var e=[];return this.records.forEach(function(t,n){return e.push(Ce(n))}),"R3Injector[".concat(e.join(", "),"]")}},{key:"assertNotDestroyed",value:function(){if(this._destroyed)throw new Error("Injector has already been destroyed.")}},{key:"processInjectorType",value:function(e,t,n){var i=this;if(!(e=De(e)))return!1;var r=je(e),a=null==r&&e.ngModule||void 0,o=void 0===a?e:a,s=-1!==n.indexOf(o);if(void 0!==a&&(r=je(a)),null==r)return!1;if(null!=r.imports&&!s){var u;n.push(o);try{xi(r.imports,function(e){i.processInjectorType(e,t,n)&&(void 0===u&&(u=[]),u.push(e))})}finally{}if(void 0!==u)for(var l=function(e){var t=u[e],n=t.ngModule,r=t.providers;xi(r,function(e){return i.processProvider(e,n,r||rt)})},c=0;c0){var n=Oi(t,"?");throw new Error("Can't resolve all parameters for ".concat(Ce(e),": (").concat(n.join(", "),")."))}var i=function(e){var t=e&&(e[Be]||e[Ve]);if(t){var n=function(e){if(e.hasOwnProperty("name"))return e.name;var t=(""+e).match(/^function\s*([^\s(]+)/);return null===t?"":t[1]}(e);return console.warn('DEPRECATED: DI is instantiating a token "'.concat(n,'" that inherits its @Injectable decorator but does not provide one itself.\n')+'This will become an error in a future version of Angular. Please add @Injectable() to the "'.concat(n,'" class.')),t}return null}(e);return null!==i?function(){return i.factory(e)}:function(){return new e}}(e);throw new Error("unreachable")}function No(e,t,n){var i,r=void 0;if(Vo(e)){var a=De(e);return Yt(a)||jo(a)}if(Wo(e))r=function(){return De(e.useValue)};else if((i=e)&&i.useFactory)r=function(){return e.useFactory.apply(e,b(Vi(e.deps||[])))};else if(function(e){return!(!e||!e.useExisting)}(e))r=function(){return Bi(De(e.useExisting))};else{var o=De(e&&(e.useClass||e.provide));if(!function(e){return!!e.deps}(e))return Yt(o)||jo(o);r=function(){return w(o,b(Vi(e.deps)))}}return r}function Bo(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return{factory:e,value:t,multi:n?[]:void 0}}function Wo(e){return null!==e&&"object"==typeof e&&Fi in e}function Vo(e){return"function"==typeof e}function Uo(e){return"function"==typeof e||"object"==typeof e&&e instanceof Mi}var zo=function(e,t,n){return function(e){var t=Fo(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,arguments.length>3?arguments[3]:void 0);return t._resolveInjectorDefTypes(),t}({name:n},t,e,n)},qo=function(){var e=function(){function e(){s(this,e)}return o(e,null,[{key:"create",value:function(e,t){return Array.isArray(e)?zo(e,t,""):zo(e.providers,e.parent,e.name||"")}}]),e}();return e.THROW_IF_NOT_FOUND=Ai,e.NULL=new Eo,e.\u0275prov=Ie({token:e,providedIn:"any",factory:function(){return Bi(Oo)}}),e.__NG_ELEMENT_ID__=-1,e}();function Go(e,t){Rn(Rr(e)[1],sn())}function Ko(e){for(var t=Object.getPrototypeOf(e.type.prototype).constructor,n=!0,i=[e];t;){var r=void 0;if(Et(e))r=t.\u0275cmp||t.\u0275dir;else{if(t.\u0275cmp)throw new Error("Directives cannot inherit Components");r=t.\u0275dir}if(r){if(n){i.push(r);var a=e;a.inputs=Jo(e.inputs),a.declaredInputs=Jo(e.declaredInputs),a.outputs=Jo(e.outputs);var o=r.hostBindings;o&&Xo(e,o);var s=r.viewQuery,u=r.contentQueries;if(s&&Zo(e,s),u&&$o(e,u),Se(e.inputs,r.inputs),Se(e.declaredInputs,r.declaredInputs),Se(e.outputs,r.outputs),Et(r)&&r.data.animation){var l=e.data;l.animation=(l.animation||[]).concat(r.data.animation)}}var c=r.features;if(c)for(var d=0;d=0;i--){var r=e[i];r.hostVars=t+=r.hostVars,r.hostAttrs=Gn(r.hostAttrs,n=Gn(n,r.hostAttrs))}}(i)}function Jo(e){return e===it?{}:e===rt?[]:e}function Zo(e,t){var n=e.viewQuery;e.viewQuery=n?function(e,i){t(e,i),n(e,i)}:t}function $o(e,t){var n=e.contentQueries;e.contentQueries=n?function(e,i,r){t(e,i,r),n(e,i,r)}:t}function Xo(e,t){var n=e.hostBindings;e.hostBindings=n?function(e,i){t(e,i),n(e,i)}:t}var Qo=null;function es(){if(!Qo){var e=nt.Symbol;if(e&&e.iterator)Qo=e.iterator;else for(var t=Object.getOwnPropertyNames(Map.prototype),n=0;n1&&void 0!==arguments[1]?arguments[1]:ze.Default,n=rn();if(null===n)return Bi(e,t);var i=sn();return ui(i,n,De(e),t)}function ms(e,t,n){var i=rn();return as(i,gn(),t)&&to(an(),Pn(),i,e,t,i[11],n,!1),ms}function gs(e,t,n,i,r){var a=r?"class":"style";xo(e,n,t.inputs[a],a,i)}function vs(e,t,n,i){var r=rn(),a=an(),o=St+e,s=r[11],u=r[o]=$r(s,t,tn.lFrame.currentNamespace),l=a.firstCreatePass?function(e,t,n,i,r,a,o){var s=t.consts,u=Wa(t,e,2,r,Xt(s,a));return no(t,n,u,Xt(s,o)),null!==u.attrs&&Do(u,u.attrs,!1),null!==u.mergedAttrs&&Do(u,u.mergedAttrs,!0),null!==t.queries&&t.queries.elementStart(t,u),u}(o,a,r,0,t,n,i):a.data[o];ln(l,!0);var c=l.mergedAttrs;null!==c&&Un(s,u,c);var d=l.classes;null!==d&&_a(s,u,d);var h=l.styles;null!==h&&va(s,u,h),64!=(64&l.flags)&&la(a,r,u,l),0===tn.lFrame.elementDepthCount&&Ir(u,r),tn.lFrame.elementDepthCount++,Ot(l)&&(Ja(a,r,l),Ka(a,l,r)),null!==i&&Za(r,l)}function _s(){var e=sn();cn()?dn():ln(e=e.parent,!1);var t=e;tn.lFrame.elementDepthCount--;var n=an();n.firstCreatePass&&(Rn(n,e),Tt(e)&&n.queries.elementEnd(e)),null!=t.classesWithoutHost&&function(e){return 0!=(16&e.flags)}(t)&&gs(n,t,rn(),t.classesWithoutHost,!0),null!=t.stylesWithoutHost&&function(e){return 0!=(32&e.flags)}(t)&&gs(n,t,rn(),t.stylesWithoutHost,!1)}function ys(e,t,n,i){vs(e,t,n,i),_s()}function bs(e,t,n){var i=rn(),r=an(),a=e+St,o=r.firstCreatePass?function(e,t,n,i,r){var a=t.consts,o=Xt(a,i),s=Wa(t,e,8,"ng-container",o);return null!==o&&Do(s,o,!0),no(t,n,s,Xt(a,r)),null!==t.queries&&t.queries.elementStart(t,s),s}(a,r,i,t,n):r.data[a];ln(o,!0);var s=i[a]=i[11].createComment("");la(r,i,s,o),Ir(s,i),Ot(o)&&(Ja(r,i,o),Ka(r,o,i)),null!=n&&Za(i,o)}function ws(){var e=sn(),t=an();cn()?dn():ln(e=e.parent,!1),t.firstCreatePass&&(Rn(t,e),Tt(e)&&t.queries.elementEnd(e))}function ks(e,t,n){bs(e,t,n),ws()}function Ms(){return rn()}function Ss(e){return!!e&&"function"==typeof e.then}function Cs(e){return!!e&&"function"==typeof e.subscribe}var Ls=Cs;function xs(e,t,n,i){var r=rn(),a=an(),o=sn();return Ds(a,r,r[11],o,e,t,!!n,i),xs}function Ts(e,t){var n=sn(),i=rn(),r=an();return Ds(r,i,Co(yn(r.data),n,i),n,e,t,!1),Ts}function Ds(e,t,n,i,r,a,o,s){var u=Ot(i),l=e.firstCreatePass&&So(e),c=Mo(t),d=!0;if(3&i.type||s){var h=qt(i,t),f=s?s(h):h,p=c.length,m=s?function(e){return s(Ut(e[i.index]))}:i.index;if(Wt(n)){var g=null;if(!s&&u&&(g=function(e,t,n,i){var r=e.cleanup;if(null!=r)for(var a=0;au?s[u]:null}"string"==typeof o&&(a+=2)}return null}(e,t,r,i.index)),null!==g)(g.__ngLastListenerFn__||g).__ngNextListenerFn__=a,g.__ngLastListenerFn__=a,d=!1;else{a=Es(i,t,0,a,!1);var v=n.listen(f,r,a);c.push(a,v),l&&l.push(r,m,p,p+1)}}else a=Es(i,t,0,a,!0),f.addEventListener(r,a,o),c.push(a),l&&l.push(r,m,p,o)}else a=Es(i,t,0,a,!1);var _,y=i.outputs;if(d&&null!==y&&(_=y[r])){var b=_.length;if(b)for(var w=0;w0&&void 0!==arguments[0]?arguments[0]:1;return On(e)}function Ps(e,t){for(var n=null,i=function(e){var t=e.attrs;if(null!=t){var n=t.indexOf(5);if(0==(1&n))return t[n+1]}return null}(e),r=0;r1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0,i=rn(),r=an(),a=Wa(r,St+e,16,null,n||null);null===a.projection&&(a.projection=t),dn(),64!=(64&a.flags)&&ma(r,i,a)}function Rs(e,t,n){return Fs(e,"",t,"",n),Rs}function Fs(e,t,n,i,r){var a=rn(),o=cs(a,t,n,i);return o!==Ea&&to(an(),Pn(),a,e,o,a[11],r,!1),Fs}function Hs(e,t,n,i,r,a,o,s,u){var l=rn(),c=ds(l,t,n,i,r,a,o,s);return c!==Ea&&to(an(),Pn(),l,e,c,l[11],u,!1),Hs}function js(e,t,n,i,r){for(var a=e[n+1],o=null===t,s=i?Ia(a):Fa(a),u=!1;0!==s&&(!1===u||o);){var l=e[s+1];Ns(e[s],t)&&(u=!0,e[s+1]=i?ja(l):Ra(l)),s=i?Ia(l):Fa(l)}u&&(e[n+1]=i?Ra(a):ja(a))}function Ns(e,t){return null===e||null==t||(Array.isArray(e)?e[1]:e)===t||!(!Array.isArray(e)||"string"!=typeof t)&&Pi(e,t)>=0}var Bs={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function Ws(e){return e.substring(Bs.key,Bs.keyEnd)}function Vs(e,t){var n=Bs.textEnd;return n===t?-1:(t=Bs.keyEnd=function(e,t,n){for(;t32;)t++;return t}(e,Bs.key=t,n),Us(e,t,n))}function Us(e,t,n){for(;t=0;n=Vs(t,n))Ei(e,Ws(t),!0)}function Ks(e,t,n,i){var r=rn(),a=an(),o=vn(2);a.firstUpdatePass&&$s(a,e,o,i),t!==Ea&&as(r,o,t)&&eu(a,a.data[En()],r,r[11],e,r[o+1]=function(e,t){return null==e||("string"==typeof t?e+=t:"object"==typeof e&&(e=Ce(ar(e)))),e}(t,n),i,o)}function Js(e,t,n,i){var r=an(),a=vn(2);r.firstUpdatePass&&$s(r,null,a,i);var o=rn();if(n!==Ea&&as(o,a,n)){var s=r.data[En()];if(iu(s,i)&&!Zs(r,a)){var u=i?s.classesWithoutHost:s.stylesWithoutHost;null!==u&&(n=Le(u,n||"")),gs(r,s,o,n,i)}else!function(e,t,n,i,r,a,o,s){r===Ea&&(r=rt);for(var u=0,l=0,c=0=e.expandoStartIndex}function $s(e,t,n,i){var r=e.data;if(null===r[n+1]){var a=r[En()],o=Zs(e,n);iu(a,i)&&null===t&&!o&&(t=!1),t=function(e,t,n,i){var r=yn(e),a=i?t.residualClasses:t.residualStyles;if(null===r)0===(i?t.classBindings:t.styleBindings)&&(n=Qs(n=Xs(null,e,t,n,i),t.attrs,i),a=null);else{var o=t.directiveStylingLast;if(-1===o||e[o]!==r)if(n=Xs(r,e,t,n,i),null===a){var s=function(e,t,n){var i=n?t.classBindings:t.styleBindings;if(0!==Fa(i))return e[Ia(i)]}(e,t,i);void 0!==s&&Array.isArray(s)&&function(e,t,n,i){e[Ia(n?t.classBindings:t.styleBindings)]=i}(e,t,i,s=Qs(s=Xs(null,e,t,s[1],i),t.attrs,i))}else a=function(e,t,n){for(var i=void 0,r=t.directiveEnd,a=1+t.directiveStylingLast;a0)&&(c=!0):l=n,r)if(0!==u){var d=Ia(e[s+1]);e[i+1]=Aa(d,s),0!==d&&(e[d+1]=Ha(e[d+1],i)),e[s+1]=131071&e[s+1]|i<<17}else e[i+1]=Aa(s,0),0!==s&&(e[s+1]=Ha(e[s+1],i)),s=i;else e[i+1]=Aa(u,0),0===s?s=i:e[u+1]=Ha(e[u+1],i),u=i;c&&(e[i+1]=Ra(e[i+1])),js(e,l,i,!0),js(e,l,i,!1),function(e,t,n,i,r){var a=r?e.residualClasses:e.residualStyles;null!=a&&"string"==typeof t&&Pi(a,t)>=0&&(n[i+1]=ja(n[i+1]))}(t,l,e,i,a),o=Aa(s,u),a?t.classBindings=o:t.styleBindings=o}(r,a,t,n,o,i)}}function Xs(e,t,n,i,r){var a=null,o=n.directiveEnd,s=n.directiveStylingLast;for(-1===s?s=n.directiveStart:s++;s0;){var u=e[r],l=Array.isArray(u),c=l?u[1]:u,d=null===c,h=n[r+1];h===Ea&&(h=d?rt:void 0);var f=d?Yi(h,i):c===i?h:void 0;if(l&&!nu(f)&&(f=Yi(u,i)),nu(f)&&(s=f,o))return s;var p=e[r+1];r=o?Ia(p):Fa(p)}if(null!==t){var m=a?t.residualClasses:t.residualStyles;null!=m&&(s=Yi(m,i))}return s}function nu(e){return void 0!==e}function iu(e,t){return 0!=(e.flags&(t?16:32))}function ru(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=rn(),i=an(),r=e+St,a=i.firstCreatePass?Wa(i,r,1,t,null):i.data[r],o=n[r]=Zr(n[11],t);la(i,n,o,a),ln(a,!1)}function au(e){return ou("",e,""),au}function ou(e,t,n){var i=rn(),r=cs(i,e,t,n);return r!==Ea&&To(i,En(),r),ou}function su(e,t,n,i,r){var a=rn(),o=function(e,t,n,i,r,a){var o=os(e,mn(),n,r);return vn(2),o?t+Ye(n)+i+Ye(r)+a:Ea}(a,e,t,n,i,r);return o!==Ea&&To(a,En(),o),su}function uu(e,t,n,i,r,a,o){var s=rn(),u=ds(s,e,t,n,i,r,a,o);return u!==Ea&&To(s,En(),u),uu}function lu(e,t,n,i,r,a,o,s,u){var l=rn(),c=function(e,t,n,i,r,a,o,s,u,l){var c=us(e,mn(),n,r,o,u);return vn(4),c?t+Ye(n)+i+Ye(r)+a+Ye(o)+s+Ye(u)+l:Ea}(l,e,t,n,i,r,a,o,s,u);return c!==Ea&&To(l,En(),c),lu}function cu(e,t,n){Js(Ei,Gs,cs(rn(),e,t,n),!0)}function du(e,t,n){var i=rn();return as(i,gn(),t)&&to(an(),Pn(),i,e,t,i[11],n,!0),du}function hu(e,t,n){var i=rn();if(as(i,gn(),t)){var r=an(),a=Pn();to(r,a,i,e,t,Co(yn(r.data),a,i),n,!0)}return hu}var fu=void 0,pu=["en",[["a","p"],["AM","PM"],fu],[["AM","PM"],fu,fu],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],fu,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],fu,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",fu,"{1} 'at' {0}",fu],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"USD","$","US Dollar",{},"ltr",function(e){var t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,"").length;return 1===t&&0===n?1:5}],mu={};function gu(e){var t=function(e){return e.toLowerCase().replace(/_/g,"-")}(e),n=vu(t);if(n)return n;var i=t.split("-")[0];if(n=vu(i))return n;if("en"===i)return pu;throw new Error('Missing locale data for the locale "'.concat(e,'".'))}function vu(e){return e in mu||(mu[e]=nt.ng&&nt.ng.common&&nt.ng.common.locales&&nt.ng.common.locales[e]),mu[e]}var _u=function(e){return e[e.LocaleId=0]="LocaleId",e[e.DayPeriodsFormat=1]="DayPeriodsFormat",e[e.DayPeriodsStandalone=2]="DayPeriodsStandalone",e[e.DaysFormat=3]="DaysFormat",e[e.DaysStandalone=4]="DaysStandalone",e[e.MonthsFormat=5]="MonthsFormat",e[e.MonthsStandalone=6]="MonthsStandalone",e[e.Eras=7]="Eras",e[e.FirstDayOfWeek=8]="FirstDayOfWeek",e[e.WeekendRange=9]="WeekendRange",e[e.DateFormat=10]="DateFormat",e[e.TimeFormat=11]="TimeFormat",e[e.DateTimeFormat=12]="DateTimeFormat",e[e.NumberSymbols=13]="NumberSymbols",e[e.NumberFormats=14]="NumberFormats",e[e.CurrencyCode=15]="CurrencyCode",e[e.CurrencySymbol=16]="CurrencySymbol",e[e.CurrencyName=17]="CurrencyName",e[e.Currencies=18]="Currencies",e[e.Directionality=19]="Directionality",e[e.PluralCase=20]="PluralCase",e[e.ExtraData=21]="ExtraData",e}({}),yu="en-US";function bu(e){var t,n;n="Expected localeId to be defined",null==(t=e)&&function(e,t,n,i){throw new Error("ASSERTION ERROR: ".concat(e)+" [Expected=> ".concat(null," ").concat("!="," ").concat(t," <=Actual]"))}(n,t),"string"==typeof e&&e.toLowerCase().replace(/_/g,"-")}function wu(e,t,n){var i=an();if(i.firstCreatePass){var r=Et(e);ku(n,i.data,i.blueprint,r,!0),ku(t,i.data,i.blueprint,r,!1)}}function ku(e,t,n,i,r){if(e=De(e),Array.isArray(e))for(var a=0;a>20;if(Vo(e)||!e.multi){var p=new Vn(l,r,ps),m=Cu(u,t,r?d:d+f,h);-1===m?(ai(ti(c,s),o,u),Mu(o,e,t.length),t.push(u),c.directiveStart++,c.directiveEnd++,r&&(c.providerIndexes+=1048576),n.push(p),s.push(p)):(n[m]=p,s[m]=p)}else{var g=Cu(u,t,d+f,h),v=Cu(u,t,d,d+f),_=v>=0&&n[v];if(r&&!_||!r&&!(g>=0&&n[g])){ai(ti(c,s),o,u);var y=function(e,t,n,i,r){var a=new Vn(e,n,ps);return a.multi=[],a.index=t,a.componentProviders=0,Su(a,r,i&&!n),a}(r?xu:Lu,n.length,r,i,l);!r&&_&&(n[v].providerFactory=y),Mu(o,e,t.length,0),t.push(u),c.directiveStart++,c.directiveEnd++,r&&(c.providerIndexes+=1048576),n.push(y),s.push(y)}else Mu(o,e,g>-1?g:v,Su(n[r?v:g],l,!r&&i));!r&&i&&_&&n[v].componentProviders++}}}function Mu(e,t,n,i){var r=Vo(t);if(r||t.useClass){var a=(t.useClass||t).prototype.ngOnDestroy;if(a){var o=e.destroyHooks||(e.destroyHooks=[]);if(!r&&t.multi){var s=o.indexOf(n);-1===s?o.push(n,[i,a]):o[s+1].push(i,a)}else o.push(n,a)}}}function Su(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function Cu(e,t,n,i){for(var r=n;r1&&void 0!==arguments[1]?arguments[1]:[];return function(n){n.providersResolver=function(n,i){return wu(n,i?i(e):e,t)}}}var Ou=function e(){s(this,e)},Eu=function e(){s(this,e)},Yu=function(){function e(){s(this,e)}return o(e,[{key:"resolveComponentFactory",value:function(e){throw function(e){var t=Error("No component factory found for ".concat(Ce(e),". Did you add it to @NgModule.entryComponents?"));return t.ngComponent=e,t}(e)}}]),e}(),Pu=function(){var e=function e(){s(this,e)};return e.NULL=new Yu,e}();function Au(){}function Iu(e,t){return new Fu(qt(e,t))}var Ru=function(){return Iu(sn(),rn())},Fu=function(){var e=function e(t){s(this,e),this.nativeElement=t};return e.__NG_ELEMENT_ID__=Ru,e}();function Hu(e){return e instanceof Fu?e.nativeElement:e}var ju=function e(){s(this,e)},Nu=function(){var e=function e(){s(this,e)};return e.__NG_ELEMENT_ID__=function(){return Bu()},e}(),Bu=function(){var e=rn(),t=Jt(sn().index,e);return function(e){return e[11]}(Lt(t)?t:e)},Wu=function(){var e=function e(){s(this,e)};return e.\u0275prov=Ie({token:e,providedIn:"root",factory:function(){return null}}),e}(),Vu=function e(t){s(this,e),this.full=t,this.major=t.split(".")[0],this.minor=t.split(".")[1],this.patch=t.split(".").slice(2).join(".")},Uu=new Vu("12.2.3"),zu=function(){function e(){s(this,e)}return o(e,[{key:"supports",value:function(e){return ns(e)}},{key:"create",value:function(e){return new Gu(e)}}]),e}(),qu=function(e,t){return t},Gu=function(){function e(t){s(this,e),this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=t||qu}return o(e,[{key:"forEachItem",value:function(e){var t;for(t=this._itHead;null!==t;t=t._next)e(t)}},{key:"forEachOperation",value:function(e){for(var t=this._itHead,n=this._removalsHead,i=0,r=null;t||n;){var a=!n||t&&t.currentIndex<$u(n,i,r)?t:n,o=$u(a,i,r),s=a.currentIndex;if(a===n)i--,n=n._nextRemoved;else if(t=t._next,null==a.previousIndex)i++;else{r||(r=[]);var u=o-i,l=s-i;if(u!=l){for(var c=0;c4&&void 0!==arguments[4]&&arguments[4];null!==n;){var a=t[n.index];if(null!==a&&i.push(Ut(a)),xt(a))for(var o=Ct;o-1&&(Qr(e,n),Di(t,n))}this._attachedToViewContainer=!1}ea(this._lView[1],this._lView)}},{key:"onDestroy",value:function(e){Qa(this._lView[1],this._lView,null,e)}},{key:"markForCheck",value:function(){_o(this._cdRefInjectingView||this._lView)}},{key:"detach",value:function(){this._lView[2]&=-129}},{key:"reattach",value:function(){this._lView[2]|=128}},{key:"detectChanges",value:function(){yo(this._lView[1],this._lView,this.context)}},{key:"checkNoChanges",value:function(){!function(e,t,n){fn(!0);try{yo(e,t,n)}finally{fn(!1)}}(this._lView[1],this._lView,this.context)}},{key:"attachToViewContainerRef",value:function(){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._attachedToViewContainer=!0}},{key:"detachFromAppRef",value:function(){var e;this._appRef=null,pa(this._lView[1],e=this._lView,e[11],2,null,null)}},{key:"attachToAppRef",value:function(e){if(this._attachedToViewContainer)throw new Error("This view is already attached to a ViewContainer!");this._appRef=e}}]),e}(),sl=function(e){l(n,e);var t=p(n);function n(e){var i;return s(this,n),(i=t.call(this,e))._view=e,i}return o(n,[{key:"detectChanges",value:function(){bo(this._view)}},{key:"checkNoChanges",value:function(){!function(e){fn(!0);try{bo(e)}finally{fn(!1)}}(this._view)}},{key:"context",get:function(){return null}}]),n}(ol),ul=function(e){return function(e,t,n){if(Dt(e)&&!n){var i=Jt(e.index,t);return new ol(i,i)}return 47&e.type?new ol(t[16],t):null}(sn(),rn(),16==(16&e))},ll=function(){var e=function e(){s(this,e)};return e.__NG_ELEMENT_ID__=ul,e}(),cl=[new Xu],dl=new nl([new zu]),hl=new rl(cl),fl=function(){return gl(sn(),rn())},pl=function(){var e=function e(){s(this,e)};return e.__NG_ELEMENT_ID__=fl,e}(),ml=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this))._declarationLView=e,a._declarationTContainer=i,a.elementRef=r,a}return o(n,[{key:"createEmbeddedView",value:function(e){var t=this._declarationTContainer.tViews,n=Ba(this._declarationLView,t,e,16,null,t.declTNode,null,null,null,null);n[17]=this._declarationLView[this._declarationTContainer.index];var i=this._declarationLView[19];return null!==i&&(n[19]=i.createEmbeddedView(t)),Ua(t,n,e),new ol(n)}}]),n}(pl);function gl(e,t){return 4&e.type?new ml(t,e,Iu(e,t)):null}var vl=function e(){s(this,e)},_l=function e(){s(this,e)},yl=function(){return Sl(sn(),rn())},bl=function(){var e=function e(){s(this,e)};return e.__NG_ELEMENT_ID__=yl,e}(),wl=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this))._lContainer=e,a._hostTNode=i,a._hostLView=r,a}return o(n,[{key:"element",get:function(){return Iu(this._hostTNode,this._hostLView)}},{key:"injector",get:function(){return new vi(this._hostTNode,this._hostLView)}},{key:"parentInjector",get:function(){var e=ri(this._hostTNode,this._hostLView);if(Jn(e)){var t=$n(e,this._hostLView),n=Zn(e);return new vi(t[1].data[n+8],t)}return new vi(null,this._hostLView)}},{key:"clear",value:function(){for(;this.length>0;)this.remove(this.length-1)}},{key:"get",value:function(e){var t=kl(this._lContainer);return null!==t&&t[e]||null}},{key:"length",get:function(){return this._lContainer.length-Ct}},{key:"createEmbeddedView",value:function(e,t,n){var i=e.createEmbeddedView(t||{});return this.insert(i,n),i}},{key:"createComponent",value:function(e,t,n,i,r){var a=n||this.parentInjector;if(!r&&null==e.ngModule&&a){var o=a.get(vl,null);o&&(r=o)}var s=e.create(a,i,void 0,r);return this.insert(s.hostView,t),s}},{key:"insert",value:function(e,t){var n=e._lView,i=n[1];if(xt(n[3])){var r=this.indexOf(e);if(-1!==r)this.detach(r);else{var a=n[3],o=new wl(a,a[6],a[3]);o.detach(o.indexOf(e))}}var s=this._adjustIndex(t),u=this._lContainer;!function(e,t,n,i){var r=Ct+i,a=n.length;i>0&&(n[r-1][4]=t),i1&&void 0!==arguments[1]?arguments[1]:0;return null==e?this.length+t:e}}]),n}(bl);function kl(e){return e[8]}function Ml(e){return e[8]||(e[8]=[])}function Sl(e,t){var n,i=t[e.index];if(xt(i))n=i;else{var r;if(8&e.type)r=Ut(i);else{var a=t[11];r=a.createComment("");var o=qt(e,t);ia(a,oa(a,o),r,function(e,t){return Wt(e)?e.nextSibling(t):t.nextSibling}(a,o),!1)}t[e.index]=n=fo(i,t,r,e),vo(t,n)}return new wl(n,e,t)}var Cl={},Ll=function(e){l(n,e);var t=p(n);function n(e){var i;return s(this,n),(i=t.call(this)).ngModule=e,i}return o(n,[{key:"resolveComponentFactory",value:function(e){var t=kt(e);return new Dl(t,this.ngModule)}}]),n}(Pu);function xl(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push({propName:e[n],templateName:n});return t}var Tl=new Mi("SCHEDULER_TOKEN",{providedIn:"root",factory:function(){return Nr}}),Dl=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this)).componentDef=e,r.ngModule=i,r.componentType=e.type,r.selector=e.selectors.map(Oa).join(","),r.ngContentSelectors=e.ngContentSelectors?e.ngContentSelectors:[],r.isBoundToModule=!!i,r}return o(n,[{key:"inputs",get:function(){return xl(this.componentDef.inputs)}},{key:"outputs",get:function(){return xl(this.componentDef.outputs)}},{key:"create",value:function(e,t,n,i){var r,a,o=(i=i||this.ngModule)?function(e,t){return{get:function(n,i,r){var a=e.get(n,Cl,r);return a!==Cl||i===Cl?a:t.get(n,i,r)}}}(e,i.injector):e,s=o.get(ju,Vt),u=o.get(Wu,null),l=s.createRenderer(null,this.componentDef),c=this.componentDef.selectors[0][0]||"div",d=n?function(e,t,n){if(Wt(e))return e.selectRootElement(t,n===$e.ShadowDom);var i="string"==typeof t?e.querySelector(t):t;return i.textContent="",i}(l,n,this.componentDef.encapsulation):$r(s.createRenderer(null,this.componentDef),c,function(e){var t=e.toLowerCase();return"svg"===t?jt:"math"===t?"http://www.w3.org/1998/MathML/":null}(c)),h=this.componentDef.onPush?576:528,f={components:[],scheduler:Nr,clean:ko,playerHandler:null,flags:0},p=Xa(0,null,null,1,0,null,null,null,null,null),m=Ba(null,p,f,h,null,null,s,l,u,o);Sn(m);try{var g=function(e,t,n,i,r,a){var o=n[1];n[20]=e;var s=Wa(o,20,2,"#host",null),u=s.mergedAttrs=t.hostAttrs;null!==u&&(Do(s,u,!0),null!==e&&(Un(r,e,u),null!==s.classes&&_a(r,e,s.classes),null!==s.styles&&va(r,e,s.styles)));var l=i.createRenderer(e,t),c=Ba(n,$a(t),null,t.onPush?64:16,n[20],s,i,l,null,null);return o.firstCreatePass&&(ai(ti(s,n),o,t.type),ao(o,s),so(s,n.length,1)),vo(n,c),n[20]=c}(d,this.componentDef,m,s,l);if(d)if(n)Un(l,d,["ng-version",Uu.full]);else{var v=function(e){for(var t=[],n=[],i=1,r=2;i0&&_a(l,d,y.join(" "))}if(a=Gt(p,St),void 0!==t)for(var b=a.projection=[],w=0;w1&&void 0!==arguments[1]?arguments[1]:qo.THROW_IF_NOT_FOUND,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:ze.Default;return e===qo||e===vl||e===Oo?this:this._r3Injector.get(e,t,n)}},{key:"destroy",value:function(){var e=this._r3Injector;!e.destroyed&&e.destroy(),this.destroyCbs.forEach(function(e){return e()}),this.destroyCbs=null}},{key:"onDestroy",value:function(e){this.destroyCbs.push(e)}}]),n}(vl),Pl=function(e){l(n,e);var t=p(n);function n(e){var i,r,a;return s(this,n),(i=t.call(this)).moduleType=e,null!==Mt(e)&&(r=e,a=new Set,function e(t){var n=Mt(t,!0),i=n.id;null!==i&&(function(e,t,n){if(t&&t!==n)throw new Error("Duplicate module registered for ".concat(e," - ").concat(Ce(t)," vs ").concat(Ce(t.name)))}(i,El.get(i),t),El.set(i,t));var r,o=v(Wr(n.imports));try{for(o.s();!(r=o.n()).done;){var s=r.value;a.has(s)||(a.add(s),e(s))}}catch(u){o.e(u)}finally{o.f()}}(r)),i}return o(n,[{key:"create",value:function(e){return new Yl(this.moduleType,e)}}]),n}(_l);function Al(e,t,n){var i=pn()+e,r=rn();return r[i]===Ea?rs(r,i,n?t.call(n):t()):function(e,t){return e[t]}(r,i)}function Il(e,t,n,i){return jl(rn(),pn(),e,t,n,i)}function Rl(e,t,n,i,r){return Nl(rn(),pn(),e,t,n,i,r)}function Fl(e,t,n,i,r,a){return Bl(rn(),pn(),e,t,n,i,r,a)}function Hl(e,t){var n=e[t];return n===Ea?void 0:n}function jl(e,t,n,i,r,a){var o=t+n;return as(e,o,r)?rs(e,o+1,a?i.call(a,r):i(r)):Hl(e,o+1)}function Nl(e,t,n,i,r,a,o){var s=t+n;return os(e,s,r,a)?rs(e,s+2,o?i.call(o,r,a):i(r,a)):Hl(e,s+2)}function Bl(e,t,n,i,r,a,o,s){var u=t+n;return ss(e,u,r,a,o)?rs(e,u+3,s?i.call(s,r,a,o):i(r,a,o)):Hl(e,u+3)}function Wl(e,t){var n,i=an(),r=e+St;i.firstCreatePass?(n=function(e,t){if(t)for(var n=t.length-1;n>=0;n--){var i=t[n];if(e===i.name)return i}throw new Ee("302","The pipe '".concat(e,"' could not be found!"))}(t,i.pipeRegistry),i.data[r]=n,n.onDestroy&&(i.destroyHooks||(i.destroyHooks=[])).push(r,n.onDestroy)):n=i.data[r];var a=n.factory||(n.factory=Yt(n.type)),o=Ge(ps);try{var s=Qn(!1),u=a();return Qn(s),function(e,t,n,i){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=i}(i,rn(),r,u),u}finally{Ge(o)}}function Vl(e,t,n){var i=e+St,r=rn(),a=Kt(r,i);return Kl(r,Gl(r,i)?jl(r,pn(),t,a.transform,n,a):a.transform(n))}function Ul(e,t,n,i){var r=e+St,a=rn(),o=Kt(a,r);return Kl(a,Gl(a,r)?Nl(a,pn(),t,o.transform,n,i,o):o.transform(n,i))}function zl(e,t,n,i,r){var a=e+St,o=rn(),s=Kt(o,a);return Kl(o,Gl(o,a)?Bl(o,pn(),t,s.transform,n,i,r,s):s.transform(n,i,r))}function ql(e,t,n,i,r,a){var o=e+St,s=rn(),u=Kt(s,o);return Kl(s,Gl(s,o)?function(e,t,n,i,r,a,o,s,u){var l=t+n;return us(e,l,r,a,o,s)?rs(e,l+4,u?i.call(u,r,a,o,s):i(r,a,o,s)):Hl(e,l+4)}(s,pn(),t,u.transform,n,i,r,a,u):u.transform(n,i,r,a))}function Gl(e,t){return e[1].data[t].pure}function Kl(e,t){return ts.isWrapped(t)&&(t=ts.unwrap(t),e[mn()]=Ea),t}function Jl(e){return function(t){setTimeout(e,void 0,t)}}var Zl=function(e){l(n,e);var t=p(n);function n(){var e,i=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return s(this,n),(e=t.call(this)).__isAsync=i,e}return o(n,[{key:"emit",value:function(e){r(i(n.prototype),"next",this).call(this,e)}},{key:"subscribe",value:function(e,t,a){var o,s,u,l=e,c=t||function(){return null},d=a;if(e&&"object"==typeof e){var h=e;l=null===(o=h.next)||void 0===o?void 0:o.bind(h),c=null===(s=h.error)||void 0===s?void 0:s.bind(h),d=null===(u=h.complete)||void 0===u?void 0:u.bind(h)}this.__isAsync&&(c=Jl(c),l&&(l=Jl(l)),d&&(d=Jl(d)));var f=r(i(n.prototype),"subscribe",this).call(this,{next:l,error:c,complete:d});return e instanceof x&&e.add(f),f}}]),n}(z);function $l(){return this._results[es()]()}var Xl=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];s(this,e),this._emitDistinctChangesOnly=t,this.dirty=!0,this._results=[],this._changesDetected=!1,this._changes=null,this.length=0,this.first=void 0,this.last=void 0;var n=es(),i=e.prototype;i[n]||(i[n]=$l)}return o(e,[{key:"changes",get:function(){return this._changes||(this._changes=new Zl)}},{key:"get",value:function(e){return this._results[e]}},{key:"map",value:function(e){return this._results.map(e)}},{key:"filter",value:function(e){return this._results.filter(e)}},{key:"find",value:function(e){return this._results.find(e)}},{key:"reduce",value:function(e,t){return this._results.reduce(e,t)}},{key:"forEach",value:function(e){this._results.forEach(e)}},{key:"some",value:function(e){return this._results.some(e)}},{key:"toArray",value:function(){return this._results.slice()}},{key:"toString",value:function(){return this._results.toString()}},{key:"reset",value:function(e,t){var n=this;n.dirty=!1;var i=Li(e);(this._changesDetected=!function(e,t,n){if(e.length!==t.length)return!1;for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:[];s(this,e),this.queries=t}return o(e,[{key:"createEmbeddedView",value:function(t){var n=t.queries;if(null!==n){for(var i=null!==t.contentQueries?t.contentQueries[0]:n.length,r=[],a=0;a2&&void 0!==arguments[2]?arguments[2]:null;s(this,e),this.predicate=t,this.flags=n,this.read=i},nc=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];s(this,e),this.queries=t}return o(e,[{key:"elementStart",value:function(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:-1;s(this,e),this.metadata=t,this.matches=null,this.indexInDeclarationView=-1,this.crossesNgTemplate=!1,this._appliesToNextNode=!0,this._declarationNodeIndex=n}return o(e,[{key:"elementStart",value:function(e,t){this.isApplyingToNode(t)&&this.matchTNode(e,t)}},{key:"elementEnd",value:function(e){this._declarationNodeIndex===e.index&&(this._appliesToNextNode=!1)}},{key:"template",value:function(e,t){this.elementStart(e,t)}},{key:"embeddedTView",value:function(t,n){return this.isApplyingToNode(t)?(this.crossesNgTemplate=!0,this.addMatch(-t.index,n),new e(this.metadata)):null}},{key:"isApplyingToNode",value:function(e){if(this._appliesToNextNode&&1!=(1&this.metadata.flags)){for(var t=this._declarationNodeIndex,n=e.parent;null!==n&&8&n.type&&n.index!==t;)n=n.parent;return t===(null!==n?n.index:-1)}return this._appliesToNextNode}},{key:"matchTNode",value:function(e,t){var n=this.metadata.predicate;if(Array.isArray(n))for(var i=0;i0)i.push(o[s/2]);else{for(var l=a[s+1],c=t[-u],d=Ct;d0&&(r=setTimeout(function(){i._callbacks=i._callbacks.filter(function(e){return e.timeoutId!==r}),e(i._didWork,i.getPendingTasks())},t)),this._callbacks.push({doneCb:e,timeoutId:r,updateCb:n})}},{key:"whenStable",value:function(e,t,n){if(n&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(e,t,n),this._runCallbacksIfReady()}},{key:"getPendingRequestCount",value:function(){return this._pendingCount}},{key:"findProviders",value:function(e,t,n){return[]}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(Fc))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),qc=function(){var e=function(){function e(){s(this,e),this._applications=new Map,Gc.addToWindow(this)}return o(e,[{key:"registerApplication",value:function(e,t){this._applications.set(e,t)}},{key:"unregisterApplication",value:function(e){this._applications.delete(e)}},{key:"unregisterAllApplications",value:function(){this._applications.clear()}},{key:"getTestability",value:function(e){return this._applications.get(e)||null}},{key:"getAllTestabilities",value:function(){return Array.from(this._applications.values())}},{key:"getAllRootElements",value:function(){return Array.from(this._applications.keys())}},{key:"findTestabilityInTree",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return Gc.findTestabilityInTree(this,e,t)}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),Gc=new(function(){function e(){s(this,e)}return o(e,[{key:"addToWindow",value:function(e){}},{key:"findTestabilityInTree",value:function(e,t,n){return null}}]),e}()),Kc=!0,Jc=!1;function Zc(){return Jc=!0,Kc}var $c=function(e,t,n){var i=new Pl(n);return Promise.resolve(i)},Xc=new Mi("AllowMultipleToken"),Qc=function e(t,n){s(this,e),this.name=t,this.token=n};function ed(e){if(Vc&&!Vc.destroyed&&!Vc.injector.get(Xc,!1))throw new Error("There can be only one platform. Destroy the previous one to create a new one.");Vc=e.get(rd);var t=e.get(wc,null);return t&&t.forEach(function(e){return e()}),Vc}function td(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],i="Platform: ".concat(t),r=new Mi(i);return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],a=id();if(!a||a.injector.get(Xc,!1))if(e)e(n.concat(t).concat({provide:r,useValue:!0}));else{var o=n.concat(t).concat({provide:r,useValue:!0},{provide:Yo,useValue:"platform"});ed(qo.create({providers:o,name:i}))}return nd(r)}}function nd(e){var t=id();if(!t)throw new Error("No platform exists!");if(!t.injector.get(e,null))throw new Error("A platform with a different configuration has been created. Please destroy it first.");return t}function id(){return Vc&&!Vc.destroyed?Vc:null}var rd=function(){var e=function(){function e(t){s(this,e),this._injector=t,this._modules=[],this._destroyListeners=[],this._destroyed=!1}return o(e,[{key:"bootstrapModuleFactory",value:function(e,t){var n,i,r=this,a=(i={ngZoneEventCoalescing:t&&t.ngZoneEventCoalescing||!1,ngZoneRunCoalescing:t&&t.ngZoneRunCoalescing||!1},"noop"===(n=t?t.ngZone:void 0)?new Uc:("zone.js"===n?void 0:n)||new Fc({enableLongStackTrace:Zc(),shouldCoalesceEventChangeDetection:!!(null==i?void 0:i.ngZoneEventCoalescing),shouldCoalesceRunChangeDetection:!!(null==i?void 0:i.ngZoneRunCoalescing)})),o=[{provide:Fc,useValue:a}];return a.run(function(){var t=qo.create({providers:o,parent:r.injector,name:e.moduleType.name}),n=e.create(t),i=n.injector.get(jr,null);if(!i)throw new Error("No ErrorHandler. Is platform module (BrowserModule) included?");return a.runOutsideAngular(function(){var e=a.onError.subscribe({next:function(e){i.handleError(e)}});n.onDestroy(function(){sd(r._modules,n),e.unsubscribe()})}),function(e,t,i){try{var a=((o=n.injector.get(vc)).runInitializers(),o.donePromise.then(function(){return bu(n.injector.get(Cc,yu)||yu),r._moduleDoBootstrap(n),n}));return Ss(a)?a.catch(function(n){throw t.runOutsideAngular(function(){return e.handleError(n)}),n}):a}catch(s){throw t.runOutsideAngular(function(){return e.handleError(s)}),s}var o}(i,a)})}},{key:"bootstrapModule",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],i=ad({},n);return $c(0,0,e).then(function(e){return t.bootstrapModuleFactory(e,i)})}},{key:"_moduleDoBootstrap",value:function(e){var t=e.injector.get(od);if(e._bootstrapComponents.length>0)e._bootstrapComponents.forEach(function(e){return t.bootstrap(e)});else{if(!e.instance.ngDoBootstrap)throw new Error("The module ".concat(Ce(e.instance.constructor),' was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. ')+"Please define one of these.");e.instance.ngDoBootstrap(t)}this._modules.push(e)}},{key:"onDestroy",value:function(e){this._destroyListeners.push(e)}},{key:"injector",get:function(){return this._injector}},{key:"destroy",value:function(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(function(e){return e.destroy()}),this._destroyListeners.forEach(function(e){return e()}),this._destroyed=!0}},{key:"destroyed",get:function(){return this._destroyed}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(qo))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}();function ad(e,t){return Array.isArray(t)?t.reduce(ad,e):Object.assign(Object.assign({},e),t)}var od=function(){var e=function(){function e(t,n,i,r,a){var o=this;s(this,e),this._zone=t,this._injector=n,this._exceptionHandler=i,this._componentFactoryResolver=r,this._initStatus=a,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._onMicrotaskEmptySubscription=this._zone.onMicrotaskEmpty.subscribe({next:function(){o._zone.run(function(){o.tick()})}});var u=new N(function(e){o._stable=o._zone.isStable&&!o._zone.hasPendingMacrotasks&&!o._zone.hasPendingMicrotasks,o._zone.runOutsideAngular(function(){e.next(o._stable),e.complete()})}),l=new N(function(e){var t;o._zone.runOutsideAngular(function(){t=o._zone.onStable.subscribe(function(){Fc.assertNotInAngularZone(),Rc(function(){o._stable||o._zone.hasPendingMacrotasks||o._zone.hasPendingMicrotasks||(o._stable=!0,e.next(!0))})})});var n=o._zone.onUnstable.subscribe(function(){Fc.assertInAngularZone(),o._stable&&(o._stable=!1,o._zone.runOutsideAngular(function(){e.next(!1)}))});return function(){t.unsubscribe(),n.unsubscribe()}});this.isStable=pe(u,l.pipe(ke()))}return o(e,[{key:"bootstrap",value:function(e,t){var n,i=this;if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");n=e instanceof Eu?e:this._componentFactoryResolver.resolveComponentFactory(e),this.componentTypes.push(n.componentType);var r=n.isBoundToModule?void 0:this._injector.get(vl),a=n.create(qo.NULL,[],t||n.selector,r),o=a.location.nativeElement,s=a.injector.get(zc,null),u=s&&a.injector.get(qc);return s&&u&&u.registerApplication(o,s),a.onDestroy(function(){i.detachView(a.hostView),sd(i.components,a),u&&u.unregisterApplication(o)}),this._loadComponent(a),a}},{key:"tick",value:function(){var e=this;if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");try{this._runningTick=!0;var t,n=v(this._views);try{for(n.s();!(t=n.n()).done;)t.value.detectChanges()}catch(i){n.e(i)}finally{n.f()}}catch(r){this._zone.runOutsideAngular(function(){return e._exceptionHandler.handleError(r)})}finally{this._runningTick=!1}}},{key:"attachView",value:function(e){var t=e;this._views.push(t),t.attachToAppRef(this)}},{key:"detachView",value:function(e){var t=e;sd(this._views,t),t.detachFromAppRef()}},{key:"_loadComponent",value:function(e){this.attachView(e.hostView),this.tick(),this.components.push(e),this._injector.get(Mc,[]).concat(this._bootstrapListeners).forEach(function(t){return t(e)})}},{key:"ngOnDestroy",value:function(){this._views.slice().forEach(function(e){return e.destroy()}),this._onMicrotaskEmptySubscription.unsubscribe()}},{key:"viewCount",get:function(){return this._views.length}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(Fc),Bi(qo),Bi(jr),Bi(Pu),Bi(vc))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}();function sd(e,t){var n=e.indexOf(t);n>-1&&e.splice(n,1)}var ud=function e(){s(this,e)},ld=function e(){s(this,e)},cd={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"},dd=function(){var e=function(){function e(t,n){s(this,e),this._compiler=t,this._config=n||cd}return o(e,[{key:"load",value:function(e){return this.loadAndCompile(e)}},{key:"loadAndCompile",value:function(e){var t=this,i=_(e.split("#"),2),r=i[0],a=i[1];return void 0===a&&(a="default"),n(98255)(r).then(function(e){return e[a]}).then(function(e){return hd(e,r,a)}).then(function(e){return t._compiler.compileModuleAsync(e)})}},{key:"loadFactory",value:function(e){var t=_(e.split("#"),2),i=t[0],r=t[1],a="NgFactory";return void 0===r&&(r="default",a=""),n(98255)(this._config.factoryPathPrefix+i+this._config.factoryPathSuffix).then(function(e){return e[r+a]}).then(function(e){return hd(e,i,r)})}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(Ac),Bi(ld,8))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}();function hd(e,t,n){if(!e)throw new Error("Cannot find '".concat(n,"' in '").concat(t,"'"));return e}var fd=td(null,"core",[{provide:kc,useValue:"unknown"},{provide:rd,deps:[qo]},{provide:qc,deps:[]},{provide:Sc,deps:[]}]),pd=[{provide:od,useClass:od,deps:[Fc,qo,jr,Pu,vc]},{provide:Tl,deps:[Fc],useFactory:function(e){var t=[];return e.onStable.subscribe(function(){for(;t.length;)t.pop()()}),function(e){t.push(e)}}},{provide:vc,useClass:vc,deps:[[new Ji,gc]]},{provide:Ac,useClass:Ac,deps:[]},yc,{provide:nl,useFactory:function(){return dl},deps:[]},{provide:rl,useFactory:function(){return hl},deps:[]},{provide:Cc,useFactory:function(e){return bu(e=e||"undefined"!=typeof $localize&&$localize.locale||yu),e},deps:[[new Ki(Cc),new Ji,new Zi]]},{provide:Lc,useValue:"USD"}],md=function(){var e=function e(t){s(this,e)};return e.\u0275fac=function(t){return new(t||e)(Bi(od))},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:pd}),e}(),gd=null;function vd(){return gd}var _d=function e(){s(this,e)},yd=new Mi("DocumentToken"),bd=function(){var e=function(){function e(){s(this,e)}return o(e,[{key:"historyGo",value:function(e){throw new Error("Not implemented")}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ie({factory:wd,token:e,providedIn:"platform"}),e}();function wd(){return Bi(Md)}var kd=new Mi("Location Initialized"),Md=function(){var e=function(e){l(n,e);var t=p(n);function n(e){var i;return s(this,n),(i=t.call(this))._doc=e,i._init(),i}return o(n,[{key:"_init",value:function(){this.location=window.location,this._history=window.history}},{key:"getBaseHrefFromDOM",value:function(){return vd().getBaseHref(this._doc)}},{key:"onPopState",value:function(e){var t=vd().getGlobalEventTarget(this._doc,"window");return t.addEventListener("popstate",e,!1),function(){return t.removeEventListener("popstate",e)}}},{key:"onHashChange",value:function(e){var t=vd().getGlobalEventTarget(this._doc,"window");return t.addEventListener("hashchange",e,!1),function(){return t.removeEventListener("hashchange",e)}}},{key:"href",get:function(){return this.location.href}},{key:"protocol",get:function(){return this.location.protocol}},{key:"hostname",get:function(){return this.location.hostname}},{key:"port",get:function(){return this.location.port}},{key:"pathname",get:function(){return this.location.pathname},set:function(e){this.location.pathname=e}},{key:"search",get:function(){return this.location.search}},{key:"hash",get:function(){return this.location.hash}},{key:"pushState",value:function(e,t,n){Sd()?this._history.pushState(e,t,n):this.location.hash=n}},{key:"replaceState",value:function(e,t,n){Sd()?this._history.replaceState(e,t,n):this.location.hash=n}},{key:"forward",value:function(){this._history.forward()}},{key:"back",value:function(){this._history.back()}},{key:"historyGo",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this._history.go(e)}},{key:"getState",value:function(){return this._history.state}}]),n}(bd);return e.\u0275fac=function(t){return new(t||e)(Bi(yd))},e.\u0275prov=Ie({factory:Cd,token:e,providedIn:"platform"}),e}();function Sd(){return!!window.history.pushState}function Cd(){return new Md(Bi(yd))}function Ld(e,t){if(0==e.length)return t;if(0==t.length)return e;var n=0;return e.endsWith("/")&&n++,t.startsWith("/")&&n++,2==n?e+t.substring(1):1==n?e+t:e+"/"+t}function xd(e){var t=e.match(/#|\?|$/),n=t&&t.index||e.length;return e.slice(0,n-("/"===e[n-1]?1:0))+e.slice(n)}function Td(e){return e&&"?"!==e[0]?"?"+e:e}var Dd=function(){var e=function(){function e(){s(this,e)}return o(e,[{key:"historyGo",value:function(e){throw new Error("Not implemented")}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ie({factory:Od,token:e,providedIn:"root"}),e}();function Od(e){var t=Bi(yd).location;return new Yd(Bi(bd),t&&t.origin||"")}var Ed=new Mi("appBaseHref"),Yd=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i){var r;if(s(this,n),(r=t.call(this))._platformLocation=e,r._removeListenerFns=[],null==i&&(i=r._platformLocation.getBaseHrefFromDOM()),null==i)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return r._baseHref=i,r}return o(n,[{key:"ngOnDestroy",value:function(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}},{key:"onPopState",value:function(e){this._removeListenerFns.push(this._platformLocation.onPopState(e),this._platformLocation.onHashChange(e))}},{key:"getBaseHref",value:function(){return this._baseHref}},{key:"prepareExternalUrl",value:function(e){return Ld(this._baseHref,e)}},{key:"path",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this._platformLocation.pathname+Td(this._platformLocation.search),n=this._platformLocation.hash;return n&&e?"".concat(t).concat(n):t}},{key:"pushState",value:function(e,t,n,i){var r=this.prepareExternalUrl(n+Td(i));this._platformLocation.pushState(e,t,r)}},{key:"replaceState",value:function(e,t,n,i){var r=this.prepareExternalUrl(n+Td(i));this._platformLocation.replaceState(e,t,r)}},{key:"forward",value:function(){this._platformLocation.forward()}},{key:"back",value:function(){this._platformLocation.back()}},{key:"historyGo",value:function(){var e,t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;null===(t=(e=this._platformLocation).historyGo)||void 0===t||t.call(e,n)}}]),n}(Dd);return e.\u0275fac=function(t){return new(t||e)(Bi(bd),Bi(Ed,8))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),Pd=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this))._platformLocation=e,r._baseHref="",r._removeListenerFns=[],null!=i&&(r._baseHref=i),r}return o(n,[{key:"ngOnDestroy",value:function(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}},{key:"onPopState",value:function(e){this._removeListenerFns.push(this._platformLocation.onPopState(e),this._platformLocation.onHashChange(e))}},{key:"getBaseHref",value:function(){return this._baseHref}},{key:"path",value:function(){var e=this._platformLocation.hash;return null==e&&(e="#"),e.length>0?e.substring(1):e}},{key:"prepareExternalUrl",value:function(e){var t=Ld(this._baseHref,e);return t.length>0?"#"+t:t}},{key:"pushState",value:function(e,t,n,i){var r=this.prepareExternalUrl(n+Td(i));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.pushState(e,t,r)}},{key:"replaceState",value:function(e,t,n,i){var r=this.prepareExternalUrl(n+Td(i));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.replaceState(e,t,r)}},{key:"forward",value:function(){this._platformLocation.forward()}},{key:"back",value:function(){this._platformLocation.back()}},{key:"historyGo",value:function(){var e,t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;null===(t=(e=this._platformLocation).historyGo)||void 0===t||t.call(e,n)}}]),n}(Dd);return e.\u0275fac=function(t){return new(t||e)(Bi(bd),Bi(Ed,8))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),Ad=function(){var e=function(){function e(t,n){var i=this;s(this,e),this._subject=new Zl,this._urlChangeListeners=[],this._platformStrategy=t;var r=this._platformStrategy.getBaseHref();this._platformLocation=n,this._baseHref=xd(Rd(r)),this._platformStrategy.onPopState(function(e){i._subject.emit({url:i.path(!0),pop:!0,state:e.state,type:e.type})})}return o(e,[{key:"path",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.normalize(this._platformStrategy.path(e))}},{key:"getState",value:function(){return this._platformLocation.getState()}},{key:"isCurrentPathEqualTo",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return this.path()==this.normalize(e+Td(t))}},{key:"normalize",value:function(t){return e.stripTrailingSlash(function(e,t){return e&&t.startsWith(e)?t.substring(e.length):t}(this._baseHref,Rd(t)))}},{key:"prepareExternalUrl",value:function(e){return e&&"/"!==e[0]&&(e="/"+e),this._platformStrategy.prepareExternalUrl(e)}},{key:"go",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;this._platformStrategy.pushState(n,"",e,t),this._notifyUrlChangeListeners(this.prepareExternalUrl(e+Td(t)),n)}},{key:"replaceState",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;this._platformStrategy.replaceState(n,"",e,t),this._notifyUrlChangeListeners(this.prepareExternalUrl(e+Td(t)),n)}},{key:"forward",value:function(){this._platformStrategy.forward()}},{key:"back",value:function(){this._platformStrategy.back()}},{key:"historyGo",value:function(){var e,t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;null===(t=(e=this._platformStrategy).historyGo)||void 0===t||t.call(e,n)}},{key:"onUrlChange",value:function(e){var t=this;this._urlChangeListeners.push(e),this._urlChangeSubscription||(this._urlChangeSubscription=this.subscribe(function(e){t._notifyUrlChangeListeners(e.url,e.state)}))}},{key:"_notifyUrlChangeListeners",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0;this._urlChangeListeners.forEach(function(n){return n(e,t)})}},{key:"subscribe",value:function(e,t,n){return this._subject.subscribe({next:e,error:t,complete:n})}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(Dd),Bi(bd))},e.normalizeQueryParams=Td,e.joinWithSlash=Ld,e.stripTrailingSlash=xd,e.\u0275prov=Ie({factory:Id,token:e,providedIn:"root"}),e}();function Id(){return new Ad(Bi(Dd),Bi(bd))}function Rd(e){return e.replace(/\/index.html$/,"")}var Fd={ADP:[void 0,void 0,0],AFN:[void 0,void 0,0],ALL:[void 0,void 0,0],AMD:[void 0,void 0,2],AOA:[void 0,"Kz"],ARS:[void 0,"$"],AUD:["A$","$"],BAM:[void 0,"KM"],BBD:[void 0,"$"],BDT:[void 0,"\u09f3"],BHD:[void 0,void 0,3],BIF:[void 0,void 0,0],BMD:[void 0,"$"],BND:[void 0,"$"],BOB:[void 0,"Bs"],BRL:["R$"],BSD:[void 0,"$"],BWP:[void 0,"P"],BYN:[void 0,"\u0440.",2],BYR:[void 0,void 0,0],BZD:[void 0,"$"],CAD:["CA$","$",2],CHF:[void 0,void 0,2],CLF:[void 0,void 0,4],CLP:[void 0,"$",0],CNY:["CN\xa5","\xa5"],COP:[void 0,"$",2],CRC:[void 0,"\u20a1",2],CUC:[void 0,"$"],CUP:[void 0,"$"],CZK:[void 0,"K\u010d",2],DJF:[void 0,void 0,0],DKK:[void 0,"kr",2],DOP:[void 0,"$"],EGP:[void 0,"E\xa3"],ESP:[void 0,"\u20a7",0],EUR:["\u20ac"],FJD:[void 0,"$"],FKP:[void 0,"\xa3"],GBP:["\xa3"],GEL:[void 0,"\u20be"],GIP:[void 0,"\xa3"],GNF:[void 0,"FG",0],GTQ:[void 0,"Q"],GYD:[void 0,"$",2],HKD:["HK$","$"],HNL:[void 0,"L"],HRK:[void 0,"kn"],HUF:[void 0,"Ft",2],IDR:[void 0,"Rp",2],ILS:["\u20aa"],INR:["\u20b9"],IQD:[void 0,void 0,0],IRR:[void 0,void 0,0],ISK:[void 0,"kr",0],ITL:[void 0,void 0,0],JMD:[void 0,"$"],JOD:[void 0,void 0,3],JPY:["\xa5",void 0,0],KHR:[void 0,"\u17db"],KMF:[void 0,"CF",0],KPW:[void 0,"\u20a9",0],KRW:["\u20a9",void 0,0],KWD:[void 0,void 0,3],KYD:[void 0,"$"],KZT:[void 0,"\u20b8"],LAK:[void 0,"\u20ad",0],LBP:[void 0,"L\xa3",0],LKR:[void 0,"Rs"],LRD:[void 0,"$"],LTL:[void 0,"Lt"],LUF:[void 0,void 0,0],LVL:[void 0,"Ls"],LYD:[void 0,void 0,3],MGA:[void 0,"Ar",0],MGF:[void 0,void 0,0],MMK:[void 0,"K",0],MNT:[void 0,"\u20ae",2],MRO:[void 0,void 0,0],MUR:[void 0,"Rs",2],MXN:["MX$","$"],MYR:[void 0,"RM"],NAD:[void 0,"$"],NGN:[void 0,"\u20a6"],NIO:[void 0,"C$"],NOK:[void 0,"kr",2],NPR:[void 0,"Rs"],NZD:["NZ$","$"],OMR:[void 0,void 0,3],PHP:[void 0,"\u20b1"],PKR:[void 0,"Rs",2],PLN:[void 0,"z\u0142"],PYG:[void 0,"\u20b2",0],RON:[void 0,"lei"],RSD:[void 0,void 0,0],RUB:[void 0,"\u20bd"],RUR:[void 0,"\u0440."],RWF:[void 0,"RF",0],SBD:[void 0,"$"],SEK:[void 0,"kr",2],SGD:[void 0,"$"],SHP:[void 0,"\xa3"],SLL:[void 0,void 0,0],SOS:[void 0,void 0,0],SRD:[void 0,"$"],SSP:[void 0,"\xa3"],STD:[void 0,void 0,0],STN:[void 0,"Db"],SYP:[void 0,"\xa3",0],THB:[void 0,"\u0e3f"],TMM:[void 0,void 0,0],TND:[void 0,void 0,3],TOP:[void 0,"T$"],TRL:[void 0,void 0,0],TRY:[void 0,"\u20ba"],TTD:[void 0,"$"],TWD:["NT$","$",2],TZS:[void 0,void 0,2],UAH:[void 0,"\u20b4"],UGX:[void 0,void 0,0],USD:["$"],UYI:[void 0,void 0,0],UYU:[void 0,"$"],UYW:[void 0,void 0,4],UZS:[void 0,void 0,2],VEF:[void 0,"Bs",2],VND:["\u20ab",void 0,0],VUV:[void 0,void 0,0],XAF:["FCFA",void 0,0],XCD:["EC$","$"],XOF:["CFA",void 0,0],XPF:["CFPF",void 0,0],XXX:["\xa4"],YER:[void 0,void 0,0],ZAR:[void 0,"R"],ZMK:[void 0,void 0,0],ZMW:[void 0,"ZK"],ZWD:[void 0,void 0,0]},Hd=function(e){return e[e.Decimal=0]="Decimal",e[e.Percent=1]="Percent",e[e.Currency=2]="Currency",e[e.Scientific=3]="Scientific",e}({}),jd=function(e){return e[e.Zero=0]="Zero",e[e.One=1]="One",e[e.Two=2]="Two",e[e.Few=3]="Few",e[e.Many=4]="Many",e[e.Other=5]="Other",e}({}),Nd=function(e){return e[e.Decimal=0]="Decimal",e[e.Group=1]="Group",e[e.List=2]="List",e[e.PercentSign=3]="PercentSign",e[e.PlusSign=4]="PlusSign",e[e.MinusSign=5]="MinusSign",e[e.Exponential=6]="Exponential",e[e.SuperscriptingExponent=7]="SuperscriptingExponent",e[e.PerMille=8]="PerMille",e[e[1/0]=9]="Infinity",e[e.NaN=10]="NaN",e[e.TimeSeparator=11]="TimeSeparator",e[e.CurrencyDecimal=12]="CurrencyDecimal",e[e.CurrencyGroup=13]="CurrencyGroup",e}({});function Bd(e,t){var n=gu(e),i=n[_u.NumberSymbols][t];if(void 0===i){if(t===Nd.CurrencyDecimal)return n[_u.NumberSymbols][Nd.Decimal];if(t===Nd.CurrencyGroup)return n[_u.NumberSymbols][Nd.Group]}return i}function Wd(e,t){return gu(e)[_u.NumberFormats][t]}function Vd(e){return gu(e)[_u.Currencies]}function Ud(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"en",i=Vd(n)[e]||Fd[e]||[],r=i[1];return"narrow"===t&&"string"==typeof r?r:i[0]||e}var zd=/^(\d+)?\.((\d+)(-(\d+))?)?$/,qd=".",Gd="0",Kd="#";function Jd(e,t,n,i,r,a){var o=arguments.length>6&&void 0!==arguments[6]&&arguments[6],s="",u=!1;if(isFinite(e)){var l=Qd(e);o&&(l=Xd(l));var c=t.minInt,d=t.minFrac,h=t.maxFrac;if(a){var f=a.match(zd);if(null===f)throw new Error("".concat(a," is not a valid digit info"));var p=f[1],m=f[3],g=f[5];null!=p&&(c=th(p)),null!=m&&(d=th(m)),null!=g?h=th(g):null!=m&&d>h&&(h=d)}eh(l,d,h);var v=l.digits,_=l.integerLen,y=l.exponent,b=[];for(u=v.every(function(e){return!e});_0?b=v.splice(_,v.length):(b=v,v=[0]);var w=[];for(v.length>=t.lgSize&&w.unshift(v.splice(-t.lgSize,v.length).join(""));v.length>t.gSize;)w.unshift(v.splice(-t.gSize,v.length).join(""));v.length&&w.unshift(v.join("")),s=w.join(Bd(n,i)),b.length&&(s+=Bd(n,r)+b.join("")),y&&(s+=Bd(n,Nd.Exponential)+"+"+y)}else s=Bd(n,Nd.Infinity);return e<0&&!u?t.negPre+s+t.negSuf:t.posPre+s+t.posSuf}function Zd(e,t,n,i,r){var a=$d(Wd(t,Hd.Currency),Bd(t,Nd.MinusSign));return a.minFrac=function(e){var t,n=Fd[e];return n&&(t=n[2]),"number"==typeof t?t:2}(i),a.maxFrac=a.minFrac,Jd(e,a,t,Nd.CurrencyGroup,Nd.CurrencyDecimal,r).replace("\xa4",n).replace("\xa4","").trim()}function $d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"-",n={minInt:1,minFrac:0,maxFrac:0,posPre:"",posSuf:"",negPre:"",negSuf:"",gSize:0,lgSize:0},i=e.split(";"),r=i[0],a=i[1],o=-1!==r.indexOf(qd)?r.split(qd):[r.substring(0,r.lastIndexOf(Gd)+1),r.substring(r.lastIndexOf(Gd)+1)],s=o[0],u=o[1]||"";n.posPre=s.substr(0,s.indexOf(Kd));for(var l=0;l-1&&(o=o.replace(qd,"")),(i=o.search(/e/i))>0?(n<0&&(n=i),n+=+o.slice(i+1),o=o.substring(0,i)):n<0&&(n=o.length),i=0;o.charAt(i)===Gd;i++);if(i===(a=o.length))t=[0],n=1;else{for(a--;o.charAt(a)===Gd;)a--;for(n-=i,t=[],r=0;i<=a;i++,r++)t[r]=Number(o.charAt(i))}return n>22&&(t=t.splice(0,21),s=n-1,n=1),{digits:t,exponent:s,integerLen:n}}function eh(e,t,n){if(t>n)throw new Error("The minimum number of digits after fraction (".concat(t,") is higher than the maximum (").concat(n,")."));var i=e.digits,r=i.length-e.integerLen,a=Math.min(Math.max(t,r),n),o=a+e.integerLen,s=i[o];if(o>0){i.splice(Math.max(e.integerLen,o));for(var u=o;u=5)if(o-1<0){for(var c=0;c>o;c--)i.unshift(0),e.integerLen++;i.unshift(1),e.integerLen++}else i[o-1]++;for(;r=h?i.pop():d=!1),t>=10?1:0},0);f&&(i.unshift(f),e.integerLen++)}function th(e){var t=parseInt(e);if(isNaN(t))throw new Error("Invalid integer literal when parsing "+e);return t}var nh=function e(){s(this,e)},ih=function(){var e=function(e){l(n,e);var t=p(n);function n(e){var i;return s(this,n),(i=t.call(this)).locale=e,i}return o(n,[{key:"getPluralCategory",value:function(e,t){switch(function(e){return gu(e)[_u.PluralCase]}(t||this.locale)(e)){case jd.Zero:return"zero";case jd.One:return"one";case jd.Two:return"two";case jd.Few:return"few";case jd.Many:return"many";default:return"other"}}}]),n}(nh);return e.\u0275fac=function(t){return new(t||e)(Bi(Cc))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}();function rh(e,t){t=encodeURIComponent(t);var n,i=v(e.split(";"));try{for(i.s();!(n=i.n()).done;){var r=n.value,a=r.indexOf("="),o=_(-1==a?[r,""]:[r.slice(0,a),r.slice(a+1)],2),s=o[1];if(o[0].trim()===t)return decodeURIComponent(s)}}catch(u){i.e(u)}finally{i.f()}return null}var ah=function(){var e=function(){function e(t,n,i,r){s(this,e),this._iterableDiffers=t,this._keyValueDiffers=n,this._ngEl=i,this._renderer=r,this._iterableDiffer=null,this._keyValueDiffer=null,this._initialClasses=[],this._rawClass=null}return o(e,[{key:"klass",set:function(e){this._removeClasses(this._initialClasses),this._initialClasses="string"==typeof e?e.split(/\s+/):[],this._applyClasses(this._initialClasses),this._applyClasses(this._rawClass)}},{key:"ngClass",set:function(e){this._removeClasses(this._rawClass),this._applyClasses(this._initialClasses),this._iterableDiffer=null,this._keyValueDiffer=null,this._rawClass="string"==typeof e?e.split(/\s+/):e,this._rawClass&&(ns(this._rawClass)?this._iterableDiffer=this._iterableDiffers.find(this._rawClass).create():this._keyValueDiffer=this._keyValueDiffers.find(this._rawClass).create())}},{key:"ngDoCheck",value:function(){if(this._iterableDiffer){var e=this._iterableDiffer.diff(this._rawClass);e&&this._applyIterableChanges(e)}else if(this._keyValueDiffer){var t=this._keyValueDiffer.diff(this._rawClass);t&&this._applyKeyValueChanges(t)}}},{key:"_applyKeyValueChanges",value:function(e){var t=this;e.forEachAddedItem(function(e){return t._toggleClass(e.key,e.currentValue)}),e.forEachChangedItem(function(e){return t._toggleClass(e.key,e.currentValue)}),e.forEachRemovedItem(function(e){e.previousValue&&t._toggleClass(e.key,!1)})}},{key:"_applyIterableChanges",value:function(e){var t=this;e.forEachAddedItem(function(e){if("string"!=typeof e.item)throw new Error("NgClass can only toggle CSS classes expressed as strings, got ".concat(Ce(e.item)));t._toggleClass(e.item,!0)}),e.forEachRemovedItem(function(e){return t._toggleClass(e.item,!1)})}},{key:"_applyClasses",value:function(e){var t=this;e&&(Array.isArray(e)||e instanceof Set?e.forEach(function(e){return t._toggleClass(e,!0)}):Object.keys(e).forEach(function(n){return t._toggleClass(n,!!e[n])}))}},{key:"_removeClasses",value:function(e){var t=this;e&&(Array.isArray(e)||e instanceof Set?e.forEach(function(e){return t._toggleClass(e,!1)}):Object.keys(e).forEach(function(e){return t._toggleClass(e,!1)}))}},{key:"_toggleClass",value:function(e,t){var n=this;(e=e.trim())&&e.split(/\s+/g).forEach(function(e){t?n._renderer.addClass(n._ngEl.nativeElement,e):n._renderer.removeClass(n._ngEl.nativeElement,e)})}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(nl),ps(rl),ps(Fu),ps(Nu))},e.\u0275dir=bt({type:e,selectors:[["","ngClass",""]],inputs:{klass:["class","klass"],ngClass:"ngClass"}}),e}(),oh=function(){function e(t,n,i,r){s(this,e),this.$implicit=t,this.ngForOf=n,this.index=i,this.count=r}return o(e,[{key:"first",get:function(){return 0===this.index}},{key:"last",get:function(){return this.index===this.count-1}},{key:"even",get:function(){return this.index%2==0}},{key:"odd",get:function(){return!this.even}}]),e}(),sh=function(){var e=function(){function e(t,n,i){s(this,e),this._viewContainer=t,this._template=n,this._differs=i,this._ngForOf=null,this._ngForOfDirty=!0,this._differ=null}return o(e,[{key:"ngForOf",set:function(e){this._ngForOf=e,this._ngForOfDirty=!0}},{key:"ngForTrackBy",get:function(){return this._trackByFn},set:function(e){this._trackByFn=e}},{key:"ngForTemplate",set:function(e){e&&(this._template=e)}},{key:"ngDoCheck",value:function(){if(this._ngForOfDirty){this._ngForOfDirty=!1;var e=this._ngForOf;if(!this._differ&&e)try{this._differ=this._differs.find(e).create(this.ngForTrackBy)}catch(i){throw new Error("Cannot find a differ supporting object '".concat(e,"' of type '").concat((t=e).name||typeof t,"'. NgFor only supports binding to Iterables such as Arrays."))}}var t;if(this._differ){var n=this._differ.diff(this._ngForOf);n&&this._applyChanges(n)}}},{key:"_applyChanges",value:function(e){var t=this,n=[];e.forEachOperation(function(e,i,r){if(null==e.previousIndex){var a=t._viewContainer.createEmbeddedView(t._template,new oh(null,t._ngForOf,-1,-1),null===r?void 0:r),o=new uh(e,a);n.push(o)}else if(null==r)t._viewContainer.remove(null===i?void 0:i);else if(null!==i){var s=t._viewContainer.get(i);t._viewContainer.move(s,r);var u=new uh(e,s);n.push(u)}});for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:"USD";s(this,e),this._locale=t,this._defaultCurrencyCode=n}return o(e,[{key:"transform",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._defaultCurrencyCode,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"symbol",r=arguments.length>3?arguments[3]:void 0,a=arguments.length>4?arguments[4]:void 0;if(!Lh(t))return null;a=a||this._locale,"boolean"==typeof i&&(i=i?"symbol":"code");var o=n||this._defaultCurrencyCode;"code"!==i&&(o="symbol"===i||"symbol-narrow"===i?Ud(o,"symbol"===i?"wide":"narrow",a):i);try{var s=xh(t);return Zd(s,a,o,n,r)}catch(u){throw _h(e,u.message)}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(Cc,16),ps(Lc,16))},e.\u0275pipe=wt({name:"currency",type:e,pure:!0}),e}();function Lh(e){return!(null==e||""===e||e!=e)}function xh(e){if("string"==typeof e&&!isNaN(Number(e)-parseFloat(e)))return Number(e);if("number"!=typeof e)throw new Error("".concat(e," is not a number"));return e}var Th=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[{provide:nh,useClass:ih}]}),e}(),Dh=function(){var e=function e(){s(this,e)};return e.\u0275prov=Ie({token:e,providedIn:"root",factory:function(){return new Oh(Bi(yd),window)}}),e}(),Oh=function(){function e(t,n){s(this,e),this.document=t,this.window=n,this.offset=function(){return[0,0]}}return o(e,[{key:"setOffset",value:function(e){this.offset=Array.isArray(e)?function(){return e}:e}},{key:"getScrollPosition",value:function(){return this.supportsScrolling()?[this.window.pageXOffset,this.window.pageYOffset]:[0,0]}},{key:"scrollToPosition",value:function(e){this.supportsScrolling()&&this.window.scrollTo(e[0],e[1])}},{key:"scrollToAnchor",value:function(e){if(this.supportsScrolling()){var t=function(e,t){var n=e.getElementById(t)||e.getElementsByName(t)[0];if(n)return n;if("function"==typeof e.createTreeWalker&&e.body&&(e.body.createShadowRoot||e.body.attachShadow))for(var i=e.createTreeWalker(e.body,NodeFilter.SHOW_ELEMENT),r=i.currentNode;r;){var a=r.shadowRoot;if(a){var o=a.getElementById(t)||a.querySelector('[name="'.concat(t,'"]'));if(o)return o}r=i.nextNode()}return null}(this.document,e);t&&(this.scrollToElement(t),this.attemptFocus(t))}}},{key:"setHistoryScrollRestoration",value:function(e){if(this.supportScrollRestoration()){var t=this.window.history;t&&t.scrollRestoration&&(t.scrollRestoration=e)}}},{key:"scrollToElement",value:function(e){var t=e.getBoundingClientRect(),n=t.left+this.window.pageXOffset,i=t.top+this.window.pageYOffset,r=this.offset();this.window.scrollTo(n-r[0],i-r[1])}},{key:"attemptFocus",value:function(e){return e.focus(),this.document.activeElement===e}},{key:"supportScrollRestoration",value:function(){try{if(!this.supportsScrolling())return!1;var e=Eh(this.window.history)||Eh(Object.getPrototypeOf(this.window.history));return!(!e||!e.writable&&!e.set)}catch(t){return!1}}},{key:"supportsScrolling",value:function(){try{return!!this.window&&!!this.window.scrollTo&&"pageXOffset"in this.window}catch(e){return!1}}}]),e}();function Eh(e){return Object.getOwnPropertyDescriptor(e,"scrollRestoration")}var Yh,Ph=function e(){s(this,e)},Ah=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"onAndCancel",value:function(e,t,n){return e.addEventListener(t,n,!1),function(){e.removeEventListener(t,n,!1)}}},{key:"dispatchEvent",value:function(e,t){e.dispatchEvent(t)}},{key:"remove",value:function(e){e.parentNode&&e.parentNode.removeChild(e)}},{key:"createElement",value:function(e,t){return(t=t||this.getDefaultDocument()).createElement(e)}},{key:"createHtmlDocument",value:function(){return document.implementation.createHTMLDocument("fakeTitle")}},{key:"getDefaultDocument",value:function(){return document}},{key:"isElementNode",value:function(e){return e.nodeType===Node.ELEMENT_NODE}},{key:"isShadowRoot",value:function(e){return e instanceof DocumentFragment}},{key:"getGlobalEventTarget",value:function(e,t){return"window"===t?window:"document"===t?e:"body"===t?e.body:null}},{key:"getBaseHref",value:function(e){var t=(Ih=Ih||document.querySelector("base"))?Ih.getAttribute("href"):null;return null==t?null:function(e){(Yh=Yh||document.createElement("a")).setAttribute("href",e);var t=Yh.pathname;return"/"===t.charAt(0)?t:"/".concat(t)}(t)}},{key:"resetBaseElement",value:function(){Ih=null}},{key:"getUserAgent",value:function(){return window.navigator.userAgent}},{key:"getCookie",value:function(e){return rh(document.cookie,e)}}],[{key:"makeCurrent",value:function(){var e;e=new n,gd||(gd=e)}}]),n}(function(e){l(n,e);var t=p(n);function n(){var e;return s(this,n),(e=t.apply(this,arguments)).supportsDOMEvents=!0,e}return n}(_d)),Ih=null,Rh=new Mi("TRANSITION_ID"),Fh=[{provide:gc,useFactory:function(e,t,n){return function(){n.get(vc).donePromise.then(function(){for(var n=vd(),i=t.querySelectorAll('style[ng-transition="'.concat(e,'"]')),r=0;r1&&void 0!==arguments[1])||arguments[1],i=e.findTestabilityInTree(t,n);if(null==i)throw new Error("Could not find testability for element.");return i},nt.getAllAngularTestabilities=function(){return e.getAllTestabilities()},nt.getAllAngularRootElements=function(){return e.getAllRootElements()},nt.frameworkStabilizers||(nt.frameworkStabilizers=[]),nt.frameworkStabilizers.push(function(e){var t=nt.getAllAngularTestabilities(),n=t.length,i=!1,r=function(t){i=i||t,0==--n&&e(i)};t.forEach(function(e){e.whenStable(r)})})}},{key:"findTestabilityInTree",value:function(e,t,n){if(null==t)return null;var i=e.getTestability(t);return null!=i?i:n?vd().isShadowRoot(t)?this.findTestabilityInTree(e,t.host,!0):this.findTestabilityInTree(e,t.parentElement,!0):null}}],[{key:"init",value:function(){var t;t=new e,Gc=t}}]),e}(),jh=function(){var e=function(){function e(){s(this,e)}return o(e,[{key:"build",value:function(){return new XMLHttpRequest}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),Nh=new Mi("EventManagerPlugins"),Bh=function(){var e=function(){function e(t,n){var i=this;s(this,e),this._zone=n,this._eventNameToPlugin=new Map,t.forEach(function(e){return e.manager=i}),this._plugins=t.slice().reverse()}return o(e,[{key:"addEventListener",value:function(e,t,n){return this._findPluginFor(t).addEventListener(e,t,n)}},{key:"addGlobalEventListener",value:function(e,t,n){return this._findPluginFor(t).addGlobalEventListener(e,t,n)}},{key:"getZone",value:function(){return this._zone}},{key:"_findPluginFor",value:function(e){var t=this._eventNameToPlugin.get(e);if(t)return t;for(var n=this._plugins,i=0;i-1&&(t.splice(n,1),a+=e+".")}),a+=r,0!=t.length||0===r.length)return null;var o={};return o.domEventName=i,o.fullKey=a,o}},{key:"getEventFullKey",value:function(e){var t="",n=function(e){var t=e.key;if(null==t){if(null==(t=e.keyIdentifier))return"Unidentified";t.startsWith("U+")&&(t=String.fromCharCode(parseInt(t.substring(2),16)),3===e.location&&sf.hasOwnProperty(t)&&(t=sf[t]))}return of[t]||t}(e);return" "===(n=n.toLowerCase())?n="space":"."===n&&(n="dot"),af.forEach(function(i){i!=n&&(0,uf[i])(e)&&(t+=i+".")}),t+=n}},{key:"eventCallback",value:function(e,t,i){return function(r){n.getEventFullKey(r)===e&&i.runGuarded(function(){return t(r)})}}},{key:"_normalizeKey",value:function(e){switch(e){case"esc":return"escape";default:return e}}}]),n}(Wh);return e.\u0275fac=function(t){return new(t||e)(Bi(yd))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),cf=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ie({factory:function(){return Bi(hf)},token:e,providedIn:"root"}),e}();function df(e){return new hf(e.get(yd))}var hf=function(){var e=function(e){l(n,e);var t=p(n);function n(e){var i;return s(this,n),(i=t.call(this))._doc=e,i}return o(n,[{key:"sanitize",value:function(e,t){if(null==t)return null;switch(e){case Er.NONE:return t;case Er.HTML:return or(t,"HTML")?ar(t):Dr(this._doc,String(t)).toString();case Er.STYLE:return or(t,"Style")?ar(t):t;case Er.SCRIPT:if(or(t,"Script"))return ar(t);throw new Error("unsafe value used in a script context");case Er.URL:return sr(t),or(t,"URL")?ar(t):hr(String(t));case Er.RESOURCE_URL:if(or(t,"ResourceURL"))return ar(t);throw new Error("unsafe value used in a resource URL context (see https://g.co/ng/security#xss)");default:throw new Error("Unexpected SecurityContext ".concat(e," (see https://g.co/ng/security#xss)"))}}},{key:"bypassSecurityTrustHtml",value:function(e){return new er(e)}},{key:"bypassSecurityTrustStyle",value:function(e){return new tr(e)}},{key:"bypassSecurityTrustScript",value:function(e){return new nr(e)}},{key:"bypassSecurityTrustUrl",value:function(e){return new ir(e)}},{key:"bypassSecurityTrustResourceUrl",value:function(e){return new rr(e)}}]),n}(cf);return e.\u0275fac=function(t){return new(t||e)(Bi(yd))},e.\u0275prov=Ie({factory:function(){return df(Bi(Oo))},token:e,providedIn:"root"}),e}(),ff=td(fd,"browser",[{provide:kc,useValue:"browser"},{provide:wc,useValue:function(){Ah.makeCurrent(),Hh.init()},multi:!0},{provide:yd,useFactory:function(){return function(e){Nt=e}(document),document},deps:[]}]),pf=[[],{provide:Yo,useValue:"root"},{provide:jr,useFactory:function(){return new jr},deps:[]},{provide:Nh,useClass:rf,multi:!0,deps:[yd,Fc,kc]},{provide:Nh,useClass:lf,multi:!0,deps:[yd]},[],{provide:Qh,useClass:Qh,deps:[Bh,Uh,_c]},{provide:ju,useExisting:Qh},{provide:Vh,useExisting:Uh},{provide:Uh,useClass:Uh,deps:[yd]},{provide:zc,useClass:zc,deps:[Fc]},{provide:Bh,useClass:Bh,deps:[Nh,Fc]},{provide:Ph,useClass:jh,deps:[]},[]],mf=function(){var e=function(){function e(t){if(s(this,e),t)throw new Error("BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.")}return o(e,null,[{key:"withServerTransition",value:function(t){return{ngModule:e,providers:[{provide:_c,useValue:t.appId},{provide:Rh,useExisting:_c},Fh]}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(e,12))},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:pf,imports:[Th,md]}),e}();"undefined"!=typeof window&&window;var gf=function(e,t){return(gf=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function vf(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}gf(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var _f=function(){return(_f=Object.assign||function(e){for(var t,n=1,i=arguments.length;ne?{max:{max:e,actual:t.value}}:null}}function If(e){return xf(e.value)?{required:!0}:null}function Rf(e){return function(t){return Tf(t.value)&&t.value.length>e?{maxlength:{requiredLength:e,actualLength:t.value.length}}:null}}function Ff(e){return null}function Hf(e){return null!=e}function jf(e){var t=Ss(e)?re(e):e;return Ls(t),t}function Nf(e){var t={};return e.forEach(function(e){t=null!=e?Object.assign(Object.assign({},t),e):t}),0===Object.keys(t).length?null:t}function Bf(e,t){return t.map(function(t){return t(e)})}function Wf(e){return e.map(function(e){return function(e){return!e.validate}(e)?e:function(t){return e.validate(t)}})}function Vf(e){if(!e)return null;var t=e.filter(Hf);return 0==t.length?null:function(e){return Nf(Bf(e,t))}}function Uf(e){return null!=e?Vf(Wf(e)):null}function zf(e){if(!e)return null;var t=e.filter(Hf);return 0==t.length?null:function(e){return yf(Bf(e,t).map(jf)).pipe(K(Nf))}}function qf(e){return null!=e?zf(Wf(e)):null}function Gf(e,t){return null===e?[t]:Array.isArray(e)?[].concat(b(e),[t]):[e,t]}function Kf(e){return e._rawValidators}function Jf(e){return e._rawAsyncValidators}function Zf(e){return e?Array.isArray(e)?e:[e]:[]}function $f(e,t){return Array.isArray(e)?e.includes(t):e===t}function Xf(e,t){var n=Zf(t);return Zf(e).forEach(function(e){$f(n,e)||n.push(e)}),n}function Qf(e,t){return Zf(t).filter(function(t){return!$f(e,t)})}var ep=function(){var e=function(){function e(){s(this,e),this._rawValidators=[],this._rawAsyncValidators=[],this._onDestroyCallbacks=[]}return o(e,[{key:"value",get:function(){return this.control?this.control.value:null}},{key:"valid",get:function(){return this.control?this.control.valid:null}},{key:"invalid",get:function(){return this.control?this.control.invalid:null}},{key:"pending",get:function(){return this.control?this.control.pending:null}},{key:"disabled",get:function(){return this.control?this.control.disabled:null}},{key:"enabled",get:function(){return this.control?this.control.enabled:null}},{key:"errors",get:function(){return this.control?this.control.errors:null}},{key:"pristine",get:function(){return this.control?this.control.pristine:null}},{key:"dirty",get:function(){return this.control?this.control.dirty:null}},{key:"touched",get:function(){return this.control?this.control.touched:null}},{key:"status",get:function(){return this.control?this.control.status:null}},{key:"untouched",get:function(){return this.control?this.control.untouched:null}},{key:"statusChanges",get:function(){return this.control?this.control.statusChanges:null}},{key:"valueChanges",get:function(){return this.control?this.control.valueChanges:null}},{key:"path",get:function(){return null}},{key:"_setValidators",value:function(e){this._rawValidators=e||[],this._composedValidatorFn=Uf(this._rawValidators)}},{key:"_setAsyncValidators",value:function(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=qf(this._rawAsyncValidators)}},{key:"validator",get:function(){return this._composedValidatorFn||null}},{key:"asyncValidator",get:function(){return this._composedAsyncValidatorFn||null}},{key:"_registerOnDestroy",value:function(e){this._onDestroyCallbacks.push(e)}},{key:"_invokeOnDestroyCallbacks",value:function(){this._onDestroyCallbacks.forEach(function(e){return e()}),this._onDestroyCallbacks=[]}},{key:"reset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;this.control&&this.control.reset(e)}},{key:"hasError",value:function(e,t){return!!this.control&&this.control.hasError(e,t)}},{key:"getError",value:function(e,t){return this.control?this.control.getError(e,t):null}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275dir=bt({type:e}),e}(),tp=function(){var e=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"formDirective",get:function(){return null}},{key:"path",get:function(){return null}}]),n}(ep);return e.\u0275fac=function(){var t;return function(n){return(t||(t=_i(e)))(n||e)}}(),e.\u0275dir=bt({type:e,features:[Ko]}),e}(),np=function(e){l(n,e);var t=p(n);function n(){var e;return s(this,n),(e=t.apply(this,arguments))._parent=null,e.name=null,e.valueAccessor=null,e}return n}(ep),ip=function(){function e(t){s(this,e),this._cd=t}return o(e,[{key:"is",value:function(e){var t,n,i;return"submitted"===e?!!(null===(t=this._cd)||void 0===t?void 0:t.submitted):!!(null===(i=null===(n=this._cd)||void 0===n?void 0:n.control)||void 0===i?void 0:i[e])}}]),e}(),rp=function(){var e=function(e){l(n,e);var t=p(n);function n(e){return s(this,n),t.call(this,e)}return n}(ip);return e.\u0275fac=function(t){return new(t||e)(ps(np,2))},e.\u0275dir=bt({type:e,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(e,t){2&e&&qs("ng-untouched",t.is("untouched"))("ng-touched",t.is("touched"))("ng-pristine",t.is("pristine"))("ng-dirty",t.is("dirty"))("ng-valid",t.is("valid"))("ng-invalid",t.is("invalid"))("ng-pending",t.is("pending"))},features:[Ko]}),e}(),ap=function(){var e=function(e){l(n,e);var t=p(n);function n(e){return s(this,n),t.call(this,e)}return n}(ip);return e.\u0275fac=function(t){return new(t||e)(ps(tp,10))},e.\u0275dir=bt({type:e,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(e,t){2&e&&qs("ng-untouched",t.is("untouched"))("ng-touched",t.is("touched"))("ng-pristine",t.is("pristine"))("ng-dirty",t.is("dirty"))("ng-valid",t.is("valid"))("ng-invalid",t.is("invalid"))("ng-pending",t.is("pending"))("ng-submitted",t.is("submitted"))},features:[Ko]}),e}();function op(e,t){return[].concat(b(t.path),[e])}function sp(e,t){cp(e,t),t.valueAccessor.writeValue(e.value),function(e,t){t.valueAccessor.registerOnChange(function(n){e._pendingValue=n,e._pendingChange=!0,e._pendingDirty=!0,"change"===e.updateOn&&hp(e,t)})}(e,t),function(e,t){var n=function(e,n){t.valueAccessor.writeValue(e),n&&t.viewToModelUpdate(e)};e.registerOnChange(n),t._registerOnDestroy(function(){e._unregisterOnChange(n)})}(e,t),function(e,t){t.valueAccessor.registerOnTouched(function(){e._pendingTouched=!0,"blur"===e.updateOn&&e._pendingChange&&hp(e,t),"submit"!==e.updateOn&&e.markAsTouched()})}(e,t),function(e,t){if(t.valueAccessor.setDisabledState){var n=function(e){t.valueAccessor.setDisabledState(e)};e.registerOnDisabledChange(n),t._registerOnDestroy(function(){e._unregisterOnDisabledChange(n)})}}(e,t)}function up(e,t){var n=function(){};t.valueAccessor&&(t.valueAccessor.registerOnChange(n),t.valueAccessor.registerOnTouched(n)),dp(e,t),e&&(t._invokeOnDestroyCallbacks(),e._registerOnCollectionChange(function(){}))}function lp(e,t){e.forEach(function(e){e.registerOnValidatorChange&&e.registerOnValidatorChange(t)})}function cp(e,t){var n=Kf(e);null!==t.validator?e.setValidators(Gf(n,t.validator)):"function"==typeof n&&e.setValidators([n]);var i=Jf(e);null!==t.asyncValidator?e.setAsyncValidators(Gf(i,t.asyncValidator)):"function"==typeof i&&e.setAsyncValidators([i]);var r=function(){return e.updateValueAndValidity()};lp(t._rawValidators,r),lp(t._rawAsyncValidators,r)}function dp(e,t){var n=!1;if(null!==e){if(null!==t.validator){var i=Kf(e);if(Array.isArray(i)&&i.length>0){var r=i.filter(function(e){return e!==t.validator});r.length!==i.length&&(n=!0,e.setValidators(r))}}if(null!==t.asyncValidator){var a=Jf(e);if(Array.isArray(a)&&a.length>0){var o=a.filter(function(e){return e!==t.asyncValidator});o.length!==a.length&&(n=!0,e.setAsyncValidators(o))}}}var s=function(){};return lp(t._rawValidators,s),lp(t._rawAsyncValidators,s),n}function hp(e,t){e._pendingDirty&&e.markAsDirty(),e.setValue(e._pendingValue,{emitModelToViewChange:!1}),t.viewToModelUpdate(e._pendingValue),e._pendingChange=!1}function fp(e,t){cp(e,t)}function pp(e,t){e._syncPendingControls(),t.forEach(function(e){var t=e.control;"submit"===t.updateOn&&t._pendingChange&&(e.viewToModelUpdate(t._pendingValue),t._pendingChange=!1)})}function mp(e,t){var n=e.indexOf(t);n>-1&&e.splice(n,1)}var gp="VALID",vp="INVALID",_p="PENDING",yp="DISABLED";function bp(e){return(Sp(e)?e.validators:e)||null}function wp(e){return Array.isArray(e)?Uf(e):e||null}function kp(e,t){return(Sp(t)?t.asyncValidators:e)||null}function Mp(e){return Array.isArray(e)?qf(e):e||null}function Sp(e){return null!=e&&!Array.isArray(e)&&"object"==typeof e}var Cp=function(){function e(t,n){s(this,e),this._hasOwnPendingAsyncValidator=!1,this._onCollectionChange=function(){},this._parent=null,this.pristine=!0,this.touched=!1,this._onDisabledChange=[],this._rawValidators=t,this._rawAsyncValidators=n,this._composedValidatorFn=wp(this._rawValidators),this._composedAsyncValidatorFn=Mp(this._rawAsyncValidators)}return o(e,[{key:"validator",get:function(){return this._composedValidatorFn},set:function(e){this._rawValidators=this._composedValidatorFn=e}},{key:"asyncValidator",get:function(){return this._composedAsyncValidatorFn},set:function(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}},{key:"parent",get:function(){return this._parent}},{key:"valid",get:function(){return this.status===gp}},{key:"invalid",get:function(){return this.status===vp}},{key:"pending",get:function(){return this.status==_p}},{key:"disabled",get:function(){return this.status===yp}},{key:"enabled",get:function(){return this.status!==yp}},{key:"dirty",get:function(){return!this.pristine}},{key:"untouched",get:function(){return!this.touched}},{key:"updateOn",get:function(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}},{key:"setValidators",value:function(e){this._rawValidators=e,this._composedValidatorFn=wp(e)}},{key:"setAsyncValidators",value:function(e){this._rawAsyncValidators=e,this._composedAsyncValidatorFn=Mp(e)}},{key:"addValidators",value:function(e){this.setValidators(Xf(e,this._rawValidators))}},{key:"addAsyncValidators",value:function(e){this.setAsyncValidators(Xf(e,this._rawAsyncValidators))}},{key:"removeValidators",value:function(e){this.setValidators(Qf(e,this._rawValidators))}},{key:"removeAsyncValidators",value:function(e){this.setAsyncValidators(Qf(e,this._rawAsyncValidators))}},{key:"hasValidator",value:function(e){return $f(this._rawValidators,e)}},{key:"hasAsyncValidator",value:function(e){return $f(this._rawAsyncValidators,e)}},{key:"clearValidators",value:function(){this.validator=null}},{key:"clearAsyncValidators",value:function(){this.asyncValidator=null}},{key:"markAsTouched",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.touched=!0,this._parent&&!e.onlySelf&&this._parent.markAsTouched(e)}},{key:"markAllAsTouched",value:function(){this.markAsTouched({onlySelf:!0}),this._forEachChild(function(e){return e.markAllAsTouched()})}},{key:"markAsUntouched",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.touched=!1,this._pendingTouched=!1,this._forEachChild(function(e){e.markAsUntouched({onlySelf:!0})}),this._parent&&!e.onlySelf&&this._parent._updateTouched(e)}},{key:"markAsDirty",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.pristine=!1,this._parent&&!e.onlySelf&&this._parent.markAsDirty(e)}},{key:"markAsPristine",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.pristine=!0,this._pendingDirty=!1,this._forEachChild(function(e){e.markAsPristine({onlySelf:!0})}),this._parent&&!e.onlySelf&&this._parent._updatePristine(e)}},{key:"markAsPending",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.status=_p,!1!==e.emitEvent&&this.statusChanges.emit(this.status),this._parent&&!e.onlySelf&&this._parent.markAsPending(e)}},{key:"disable",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this._parentMarkedDirty(e.onlySelf);this.status=yp,this.errors=null,this._forEachChild(function(t){t.disable(Object.assign(Object.assign({},e),{onlySelf:!0}))}),this._updateValue(),!1!==e.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Object.assign(Object.assign({},e),{skipPristineCheck:t})),this._onDisabledChange.forEach(function(e){return e(!0)})}},{key:"enable",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this._parentMarkedDirty(e.onlySelf);this.status=gp,this._forEachChild(function(t){t.enable(Object.assign(Object.assign({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(Object.assign(Object.assign({},e),{skipPristineCheck:t})),this._onDisabledChange.forEach(function(e){return e(!1)})}},{key:"_updateAncestors",value:function(e){this._parent&&!e.onlySelf&&(this._parent.updateValueAndValidity(e),e.skipPristineCheck||this._parent._updatePristine(),this._parent._updateTouched())}},{key:"setParent",value:function(e){this._parent=e}},{key:"updateValueAndValidity",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),this.status!==gp&&this.status!==_p||this._runAsyncValidator(e.emitEvent)),!1!==e.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.updateValueAndValidity(e)}},{key:"_updateTreeValidity",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{emitEvent:!0};this._forEachChild(function(t){return t._updateTreeValidity(e)}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}},{key:"_setInitialStatus",value:function(){this.status=this._allControlsDisabled()?yp:gp}},{key:"_runValidator",value:function(){return this.validator?this.validator(this):null}},{key:"_runAsyncValidator",value:function(e){var t=this;if(this.asyncValidator){this.status=_p,this._hasOwnPendingAsyncValidator=!0;var n=jf(this.asyncValidator(this));this._asyncValidationSubscription=n.subscribe(function(n){t._hasOwnPendingAsyncValidator=!1,t.setErrors(n,{emitEvent:e})})}}},{key:"_cancelExistingSubscription",value:function(){this._asyncValidationSubscription&&(this._asyncValidationSubscription.unsubscribe(),this._hasOwnPendingAsyncValidator=!1)}},{key:"setErrors",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.errors=e,this._updateControlsErrors(!1!==t.emitEvent)}},{key:"get",value:function(e){return function(e,t,n){if(null==t)return null;if(Array.isArray(t)||(t=t.split(".")),Array.isArray(t)&&0===t.length)return null;var i=e;return t.forEach(function(e){i=i instanceof xp?i.controls.hasOwnProperty(e)?i.controls[e]:null:i instanceof Tp&&i.at(e)||null}),i}(this,e)}},{key:"getError",value:function(e,t){var n=t?this.get(t):this;return n&&n.errors?n.errors[e]:null}},{key:"hasError",value:function(e,t){return!!this.getError(e,t)}},{key:"root",get:function(){for(var e=this;e._parent;)e=e._parent;return e}},{key:"_updateControlsErrors",value:function(e){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(e)}},{key:"_initObservables",value:function(){this.valueChanges=new Zl,this.statusChanges=new Zl}},{key:"_calculateStatus",value:function(){return this._allControlsDisabled()?yp:this.errors?vp:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(_p)?_p:this._anyControlsHaveStatus(vp)?vp:gp}},{key:"_anyControlsHaveStatus",value:function(e){return this._anyControls(function(t){return t.status===e})}},{key:"_anyControlsDirty",value:function(){return this._anyControls(function(e){return e.dirty})}},{key:"_anyControlsTouched",value:function(){return this._anyControls(function(e){return e.touched})}},{key:"_updatePristine",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.pristine=!this._anyControlsDirty(),this._parent&&!e.onlySelf&&this._parent._updatePristine(e)}},{key:"_updateTouched",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.touched=this._anyControlsTouched(),this._parent&&!e.onlySelf&&this._parent._updateTouched(e)}},{key:"_isBoxedValue",value:function(e){return"object"==typeof e&&null!==e&&2===Object.keys(e).length&&"value"in e&&"disabled"in e}},{key:"_registerOnCollectionChange",value:function(e){this._onCollectionChange=e}},{key:"_setUpdateStrategy",value:function(e){Sp(e)&&null!=e.updateOn&&(this._updateOn=e.updateOn)}},{key:"_parentMarkedDirty",value:function(e){return!e&&!(!this._parent||!this._parent.dirty)&&!this._parent._anyControlsDirty()}}]),e}(),Lp=function(e){l(n,e);var t=p(n);function n(){var e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,r=arguments.length>1?arguments[1]:void 0,a=arguments.length>2?arguments[2]:void 0;return s(this,n),(e=t.call(this,bp(r),kp(a,r)))._onChange=[],e._applyFormState(i),e._setUpdateStrategy(r),e._initObservables(),e.updateValueAndValidity({onlySelf:!0,emitEvent:!!e.asyncValidator}),e}return o(n,[{key:"setValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.value=this._pendingValue=e,this._onChange.length&&!1!==n.emitModelToViewChange&&this._onChange.forEach(function(e){return e(t.value,!1!==n.emitViewToModelChange)}),this.updateValueAndValidity(n)}},{key:"patchValue",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.setValue(e,t)}},{key:"reset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._applyFormState(e),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),this._pendingChange=!1}},{key:"_updateValue",value:function(){}},{key:"_anyControls",value:function(e){return!1}},{key:"_allControlsDisabled",value:function(){return this.disabled}},{key:"registerOnChange",value:function(e){this._onChange.push(e)}},{key:"_unregisterOnChange",value:function(e){mp(this._onChange,e)}},{key:"registerOnDisabledChange",value:function(e){this._onDisabledChange.push(e)}},{key:"_unregisterOnDisabledChange",value:function(e){mp(this._onDisabledChange,e)}},{key:"_forEachChild",value:function(e){}},{key:"_syncPendingControls",value:function(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))}},{key:"_applyFormState",value:function(e){this._isBoxedValue(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}}]),n}(Cp),xp=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,bp(i),kp(r,i))).controls=e,a._initObservables(),a._setUpdateStrategy(i),a._setUpControls(),a.updateValueAndValidity({onlySelf:!0,emitEvent:!!a.asyncValidator}),a}return o(n,[{key:"registerControl",value:function(e,t){return this.controls[e]?this.controls[e]:(this.controls[e]=t,t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange),t)}},{key:"addControl",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};this.registerControl(e,t),this.updateValueAndValidity({emitEvent:n.emitEvent}),this._onCollectionChange()}},{key:"removeControl",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),delete this.controls[e],this.updateValueAndValidity({emitEvent:t.emitEvent}),this._onCollectionChange()}},{key:"setControl",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),delete this.controls[e],t&&this.registerControl(e,t),this.updateValueAndValidity({emitEvent:n.emitEvent}),this._onCollectionChange()}},{key:"contains",value:function(e){return this.controls.hasOwnProperty(e)&&this.controls[e].enabled}},{key:"setValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._checkAllValuesPresent(e),Object.keys(e).forEach(function(i){t._throwIfControlMissing(i),t.controls[i].setValue(e[i],{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n)}},{key:"patchValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};null!=e&&(Object.keys(e).forEach(function(i){t.controls[i]&&t.controls[i].patchValue(e[i],{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n))}},{key:"reset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._forEachChild(function(n,i){n.reset(e[i],{onlySelf:!0,emitEvent:t.emitEvent})}),this._updatePristine(t),this._updateTouched(t),this.updateValueAndValidity(t)}},{key:"getRawValue",value:function(){return this._reduceChildren({},function(e,t,n){return e[n]=t instanceof Lp?t.value:t.getRawValue(),e})}},{key:"_syncPendingControls",value:function(){var e=this._reduceChildren(!1,function(e,t){return!!t._syncPendingControls()||e});return e&&this.updateValueAndValidity({onlySelf:!0}),e}},{key:"_throwIfControlMissing",value:function(e){if(!Object.keys(this.controls).length)throw new Error("\n There are no form controls registered with this group yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.controls[e])throw new Error("Cannot find form control with name: ".concat(e,"."))}},{key:"_forEachChild",value:function(e){var t=this;Object.keys(this.controls).forEach(function(n){var i=t.controls[n];i&&e(i,n)})}},{key:"_setUpControls",value:function(){var e=this;this._forEachChild(function(t){t.setParent(e),t._registerOnCollectionChange(e._onCollectionChange)})}},{key:"_updateValue",value:function(){this.value=this._reduceValue()}},{key:"_anyControls",value:function(e){for(var t=0,n=Object.keys(this.controls);t0||this.disabled}},{key:"_checkAllValuesPresent",value:function(e){this._forEachChild(function(t,n){if(void 0===e[n])throw new Error("Must supply a value for form control with name: '".concat(n,"'."))})}}]),n}(Cp),Tp=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,bp(i),kp(r,i))).controls=e,a._initObservables(),a._setUpdateStrategy(i),a._setUpControls(),a.updateValueAndValidity({onlySelf:!0,emitEvent:!!a.asyncValidator}),a}return o(n,[{key:"at",value:function(e){return this.controls[e]}},{key:"push",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.controls.push(e),this._registerControl(e),this.updateValueAndValidity({emitEvent:t.emitEvent}),this._onCollectionChange()}},{key:"insert",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};this.controls.splice(e,0,t),this._registerControl(t),this.updateValueAndValidity({emitEvent:n.emitEvent})}},{key:"removeAt",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),this.controls.splice(e,1),this.updateValueAndValidity({emitEvent:t.emitEvent})}},{key:"setControl",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),this.controls.splice(e,1),t&&(this.controls.splice(e,0,t),this._registerControl(t)),this.updateValueAndValidity({emitEvent:n.emitEvent}),this._onCollectionChange()}},{key:"length",get:function(){return this.controls.length}},{key:"setValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._checkAllValuesPresent(e),e.forEach(function(e,i){t._throwIfControlMissing(i),t.at(i).setValue(e,{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n)}},{key:"patchValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};null!=e&&(e.forEach(function(e,i){t.at(i)&&t.at(i).patchValue(e,{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n))}},{key:"reset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this._forEachChild(function(n,i){n.reset(e[i],{onlySelf:!0,emitEvent:t.emitEvent})}),this._updatePristine(t),this._updateTouched(t),this.updateValueAndValidity(t)}},{key:"getRawValue",value:function(){return this.controls.map(function(e){return e instanceof Lp?e.value:e.getRawValue()})}},{key:"clear",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.controls.length<1||(this._forEachChild(function(e){return e._registerOnCollectionChange(function(){})}),this.controls.splice(0),this.updateValueAndValidity({emitEvent:e.emitEvent}))}},{key:"_syncPendingControls",value:function(){var e=this.controls.reduce(function(e,t){return!!t._syncPendingControls()||e},!1);return e&&this.updateValueAndValidity({onlySelf:!0}),e}},{key:"_throwIfControlMissing",value:function(e){if(!this.controls.length)throw new Error("\n There are no form controls registered with this array yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.at(e))throw new Error("Cannot find form control at index ".concat(e))}},{key:"_forEachChild",value:function(e){this.controls.forEach(function(t,n){e(t,n)})}},{key:"_updateValue",value:function(){var e=this;this.value=this.controls.filter(function(t){return t.enabled||e.disabled}).map(function(e){return e.value})}},{key:"_anyControls",value:function(e){return this.controls.some(function(t){return t.enabled&&e(t)})}},{key:"_setUpControls",value:function(){var e=this;this._forEachChild(function(t){return e._registerControl(t)})}},{key:"_checkAllValuesPresent",value:function(e){this._forEachChild(function(t,n){if(void 0===e[n])throw new Error("Must supply a value for form control at index: ".concat(n,"."))})}},{key:"_allControlsDisabled",value:function(){var e,t=v(this.controls);try{for(t.s();!(e=t.n()).done;)if(e.value.enabled)return!1}catch(n){t.e(n)}finally{t.f()}return this.controls.length>0||this.disabled}},{key:"_registerControl",value:function(e){e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)}}]),n}(Cp),Dp={provide:tp,useExisting:Te(function(){return Ep})},Op=function(){return Promise.resolve(null)}(),Ep=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this)).submitted=!1,r._directives=[],r.ngSubmit=new Zl,r.form=new xp({},Uf(e),qf(i)),r}return o(n,[{key:"ngAfterViewInit",value:function(){this._setUpdateStrategy()}},{key:"formDirective",get:function(){return this}},{key:"control",get:function(){return this.form}},{key:"path",get:function(){return[]}},{key:"controls",get:function(){return this.form.controls}},{key:"addControl",value:function(e){var t=this;Op.then(function(){var n=t._findContainer(e.path);e.control=n.registerControl(e.name,e.control),sp(e.control,e),e.control.updateValueAndValidity({emitEvent:!1}),t._directives.push(e)})}},{key:"getControl",value:function(e){return this.form.get(e.path)}},{key:"removeControl",value:function(e){var t=this;Op.then(function(){var n=t._findContainer(e.path);n&&n.removeControl(e.name),mp(t._directives,e)})}},{key:"addFormGroup",value:function(e){var t=this;Op.then(function(){var n=t._findContainer(e.path),i=new xp({});fp(i,e),n.registerControl(e.name,i),i.updateValueAndValidity({emitEvent:!1})})}},{key:"removeFormGroup",value:function(e){var t=this;Op.then(function(){var n=t._findContainer(e.path);n&&n.removeControl(e.name)})}},{key:"getFormGroup",value:function(e){return this.form.get(e.path)}},{key:"updateModel",value:function(e,t){var n=this;Op.then(function(){n.form.get(e.path).setValue(t)})}},{key:"setValue",value:function(e){this.control.setValue(e)}},{key:"onSubmit",value:function(e){return this.submitted=!0,pp(this.form,this._directives),this.ngSubmit.emit(e),!1}},{key:"onReset",value:function(){this.resetForm()}},{key:"resetForm",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;this.form.reset(e),this.submitted=!1}},{key:"_setUpdateStrategy",value:function(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)}},{key:"_findContainer",value:function(e){return e.pop(),e.length?this.form.get(e):this.form}}]),n}(tp);return e.\u0275fac=function(t){return new(t||e)(ps(Df,10),ps(Of,10))},e.\u0275dir=bt({type:e,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(e,t){1&e&&xs("submit",function(e){return t.onSubmit(e)})("reset",function(){return t.onReset()})},inputs:{options:["ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[Du([Dp]),Ko]}),e}(),Yp=function(){var e=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"ngOnInit",value:function(){this._checkParentType(),this.formDirective.addFormGroup(this)}},{key:"ngOnDestroy",value:function(){this.formDirective&&this.formDirective.removeFormGroup(this)}},{key:"control",get:function(){return this.formDirective.getFormGroup(this)}},{key:"path",get:function(){return op(null==this.name?this.name:this.name.toString(),this._parent)}},{key:"formDirective",get:function(){return this._parent?this._parent.formDirective:null}},{key:"_checkParentType",value:function(){}}]),n}(tp);return e.\u0275fac=function(){var t;return function(n){return(t||(t=_i(e)))(n||e)}}(),e.\u0275dir=bt({type:e,features:[Ko]}),e}(),Pp=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275dir=bt({type:e,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""]}),e}(),Ap={provide:Mf,useExisting:Te(function(){return Ip}),multi:!0},Ip=function(){var e=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"writeValue",value:function(e){this.setProperty("value",null==e?"":e)}},{key:"registerOnChange",value:function(e){this.onChange=function(t){e(""==t?null:parseFloat(t))}}}]),n}(kf);return e.\u0275fac=function(){var t;return function(n){return(t||(t=_i(e)))(n||e)}}(),e.\u0275dir=bt({type:e,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(e,t){1&e&&xs("input",function(e){return t.onChange(e.target.value)})("blur",function(){return t.onTouched()})},features:[Du([Ap]),Ko]}),e}(),Rp=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({}),e}(),Fp=new Mi("NgModelWithFormControlWarning"),Hp={provide:tp,useExisting:Te(function(){return jp})},jp=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this)).validators=e,r.asyncValidators=i,r.submitted=!1,r._onCollectionChange=function(){return r._updateDomValue()},r.directives=[],r.form=null,r.ngSubmit=new Zl,r._setValidators(e),r._setAsyncValidators(i),r}return o(n,[{key:"ngOnChanges",value:function(e){this._checkFormPresent(),e.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}},{key:"ngOnDestroy",value:function(){this.form&&(dp(this.form,this),this.form._onCollectionChange===this._onCollectionChange&&this.form._registerOnCollectionChange(function(){}))}},{key:"formDirective",get:function(){return this}},{key:"control",get:function(){return this.form}},{key:"path",get:function(){return[]}},{key:"addControl",value:function(e){var t=this.form.get(e.path);return sp(t,e),t.updateValueAndValidity({emitEvent:!1}),this.directives.push(e),t}},{key:"getControl",value:function(e){return this.form.get(e.path)}},{key:"removeControl",value:function(e){up(e.control||null,e),mp(this.directives,e)}},{key:"addFormGroup",value:function(e){this._setUpFormContainer(e)}},{key:"removeFormGroup",value:function(e){this._cleanUpFormContainer(e)}},{key:"getFormGroup",value:function(e){return this.form.get(e.path)}},{key:"addFormArray",value:function(e){this._setUpFormContainer(e)}},{key:"removeFormArray",value:function(e){this._cleanUpFormContainer(e)}},{key:"getFormArray",value:function(e){return this.form.get(e.path)}},{key:"updateModel",value:function(e,t){this.form.get(e.path).setValue(t)}},{key:"onSubmit",value:function(e){return this.submitted=!0,pp(this.form,this.directives),this.ngSubmit.emit(e),!1}},{key:"onReset",value:function(){this.resetForm()}},{key:"resetForm",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;this.form.reset(e),this.submitted=!1}},{key:"_updateDomValue",value:function(){var e=this;this.directives.forEach(function(t){var n=t.control,i=e.form.get(t.path);n!==i&&(up(n||null,t),i instanceof Lp&&(sp(i,t),t.control=i))}),this.form._updateTreeValidity({emitEvent:!1})}},{key:"_setUpFormContainer",value:function(e){var t=this.form.get(e.path);fp(t,e),t.updateValueAndValidity({emitEvent:!1})}},{key:"_cleanUpFormContainer",value:function(e){if(this.form){var t=this.form.get(e.path);t&&function(e,t){return dp(e,t)}(t,e)&&t.updateValueAndValidity({emitEvent:!1})}}},{key:"_updateRegistrations",value:function(){this.form._registerOnCollectionChange(this._onCollectionChange),this._oldForm&&this._oldForm._registerOnCollectionChange(function(){})}},{key:"_updateValidators",value:function(){cp(this.form,this),this._oldForm&&dp(this._oldForm,this)}},{key:"_checkFormPresent",value:function(){}}]),n}(tp);return e.\u0275fac=function(t){return new(t||e)(ps(Df,10),ps(Of,10))},e.\u0275dir=bt({type:e,selectors:[["","formGroup",""]],hostBindings:function(e,t){1&e&&xs("submit",function(e){return t.onSubmit(e)})("reset",function(){return t.onReset()})},inputs:{form:["formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[Du([Hp]),Ko,At]}),e}(),Np={provide:tp,useExisting:Te(function(){return Bp})},Bp=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this))._parent=e,a._setValidators(i),a._setAsyncValidators(r),a}return o(n,[{key:"_checkParentType",value:function(){Up(this._parent)}}]),n}(Yp);return e.\u0275fac=function(t){return new(t||e)(ps(tp,13),ps(Df,10),ps(Of,10))},e.\u0275dir=bt({type:e,selectors:[["","formGroupName",""]],inputs:{name:["formGroupName","name"]},features:[Du([Np]),Ko]}),e}(),Wp={provide:tp,useExisting:Te(function(){return Vp})},Vp=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this))._parent=e,a._setValidators(i),a._setAsyncValidators(r),a}return o(n,[{key:"ngOnInit",value:function(){this._checkParentType(),this.formDirective.addFormArray(this)}},{key:"ngOnDestroy",value:function(){this.formDirective&&this.formDirective.removeFormArray(this)}},{key:"control",get:function(){return this.formDirective.getFormArray(this)}},{key:"formDirective",get:function(){return this._parent?this._parent.formDirective:null}},{key:"path",get:function(){return op(null==this.name?this.name:this.name.toString(),this._parent)}},{key:"_checkParentType",value:function(){Up(this._parent)}}]),n}(tp);return e.\u0275fac=function(t){return new(t||e)(ps(tp,13),ps(Df,10),ps(Of,10))},e.\u0275dir=bt({type:e,selectors:[["","formArrayName",""]],inputs:{name:["formArrayName","name"]},features:[Du([Wp]),Ko]}),e}();function Up(e){return!(e instanceof Bp||e instanceof jp||e instanceof Vp)}var zp={provide:np,useExisting:Te(function(){return qp})},qp=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o){var u;return s(this,n),(u=t.call(this))._ngModelWarningConfig=o,u._added=!1,u.update=new Zl,u._ngModelWarningSent=!1,u._parent=e,u._setValidators(i),u._setAsyncValidators(r),u.valueAccessor=function(e,t){if(!t)return null;Array.isArray(t);var n=void 0,i=void 0,r=void 0;return t.forEach(function(e){e.constructor===Lf?n=e:Object.getPrototypeOf(e.constructor)===kf?i=e:r=e}),r||i||n||null}(h(u),a),u}return o(n,[{key:"isDisabled",set:function(e){}},{key:"ngOnChanges",value:function(e){this._added||this._setUpControl(),function(e,t){if(!e.hasOwnProperty("model"))return!1;var n=e.model;return!!n.isFirstChange()||!Object.is(t,n.currentValue)}(e,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}},{key:"ngOnDestroy",value:function(){this.formDirective&&this.formDirective.removeControl(this)}},{key:"viewToModelUpdate",value:function(e){this.viewModel=e,this.update.emit(e)}},{key:"path",get:function(){return op(null==this.name?this.name:this.name.toString(),this._parent)}},{key:"formDirective",get:function(){return this._parent?this._parent.formDirective:null}},{key:"_checkParentType",value:function(){}},{key:"_setUpControl",value:function(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0}}]),n}(np);return e.\u0275fac=function(t){return new(t||e)(ps(tp,13),ps(Df,10),ps(Of,10),ps(Mf,10),ps(Fp,8))},e.\u0275dir=bt({type:e,selectors:[["","formControlName",""]],inputs:{isDisabled:["disabled","isDisabled"],name:["formControlName","name"],model:["ngModel","model"]},outputs:{update:"ngModelChange"},features:[Du([zp]),Ko,At]}),e._ngModelWarningSentOnce=!1,e}(),Gp={provide:Mf,useExisting:Te(function(){return Jp}),multi:!0};function Kp(e,t){return null==e?"".concat(t):(t&&"object"==typeof t&&(t="Object"),"".concat(e,": ").concat(t).slice(0,50))}var Jp=function(){var e=function(e){l(n,e);var t=p(n);function n(){var e;return s(this,n),(e=t.apply(this,arguments))._optionMap=new Map,e._idCounter=0,e._compareWith=Object.is,e}return o(n,[{key:"compareWith",set:function(e){this._compareWith=e}},{key:"writeValue",value:function(e){this.value=e;var t=this._getOptionId(e);null==t&&this.setProperty("selectedIndex",-1);var n=Kp(t,e);this.setProperty("value",n)}},{key:"registerOnChange",value:function(e){var t=this;this.onChange=function(n){t.value=t._getOptionValue(n),e(t.value)}}},{key:"_registerOption",value:function(){return(this._idCounter++).toString()}},{key:"_getOptionId",value:function(e){for(var t=0,n=Array.from(this._optionMap.keys());t-1)}}else t=function(e,t){e._setSelected(!1)};this._optionMap.forEach(t)}},{key:"registerOnChange",value:function(e){var t=this;this.onChange=function(n){var i=[];if(void 0!==n.selectedOptions)for(var r=n.selectedOptions,a=0;a1&&void 0!==arguments[1]?arguments[1]:null,n=this._reduceControls(e),i=null,r=null,a=void 0;return null!=t&&(hm(t)?(i=null!=t.validators?t.validators:null,r=null!=t.asyncValidators?t.asyncValidators:null,a=null!=t.updateOn?t.updateOn:void 0):(i=null!=t.validator?t.validator:null,r=null!=t.asyncValidator?t.asyncValidator:null)),new xp(n,{asyncValidators:r,updateOn:a,validators:i})}},{key:"control",value:function(e,t,n){return new Lp(e,t,n)}},{key:"array",value:function(e,t,n){var i=this,r=e.map(function(e){return i._createControl(e)});return new Tp(r,t,n)}},{key:"_reduceControls",value:function(e){var t=this,n={};return Object.keys(e).forEach(function(i){n[i]=t._createControl(e[i])}),n}},{key:"_createControl",value:function(e){return e instanceof Lp||e instanceof xp||e instanceof Tp?e:Array.isArray(e)?this.control(e[0],e.length>1?e[1]:null,e.length>2?e[2]:null):this.control(e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ie({factory:function(){return new e},token:e,providedIn:dm}),e}();function pm(e){return null!=e&&"false"!=="".concat(e)}function mm(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return gm(e)?Number(e):t}function gm(e){return!isNaN(parseFloat(e))&&!isNaN(Number(e))}function vm(e){return Array.isArray(e)?e:[e]}function _m(e){return null==e?"":"string"==typeof e?e:"".concat(e,"px")}function ym(e){return e instanceof Fu?e.nativeElement:e}function bm(){for(var e=arguments.length,t=new Array(e),n=0;n1?Array.prototype.slice.call(arguments):e)},i,n)})}function km(e,t,n,i,r){var a;if(function(e){return e&&"function"==typeof e.addEventListener&&"function"==typeof e.removeEventListener}(e)){var o=e;e.addEventListener(t,n,r),a=function(){return o.removeEventListener(t,n,r)}}else if(function(e){return e&&"function"==typeof e.on&&"function"==typeof e.off}(e)){var s=e;e.on(t,n),a=function(){return s.off(t,n)}}else if(function(e){return e&&"function"==typeof e.addListener&&"function"==typeof e.removeListener}(e)){var u=e;e.addListener(t,n),a=function(){return u.removeListener(t,n)}}else{if(!e||!e.length)throw new TypeError("Invalid event target");for(var l=0,c=e.length;l1&&void 0!==arguments[1]?arguments[1]:0;if(this.closed)return this;this.state=e;var n=this.id,i=this.scheduler;return null!=n&&(this.id=this.recycleAsyncId(i,n,t)),this.pending=!0,this.delay=t,this.id=this.id||this.requestAsyncId(i,this.id,t),this}},{key:"requestAsyncId",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return setInterval(e.flush.bind(e,this),n)}},{key:"recycleAsyncId",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(null!==n&&this.delay===n&&!1===this.pending)return t;clearInterval(t)}},{key:"execute",value:function(e,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var n=this._execute(e,t);if(n)return n;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))}},{key:"_execute",value:function(e,t){var n=!1,i=void 0;try{this.work(e)}catch(r){n=!0,i=!!r&&r||new Error(r)}if(n)return this.unsubscribe(),i}},{key:"_unsubscribe",value:function(){var e=this.id,t=this.scheduler,n=t.actions,i=n.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==i&&n.splice(i,1),null!=e&&(this.id=this.recycleAsyncId(t,e,null)),this.delay=null}}]),n}(function(e){l(n,e);var t=p(n);function n(e,i){return s(this,n),t.call(this)}return o(n,[{key:"schedule",value:function(e){return this}}]),n}(x)),Sm=function(){var e=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e.now;s(this,e),this.SchedulerAction=t,this.now=n}return o(e,[{key:"schedule",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0;return new this.SchedulerAction(this,e).schedule(n,t)}}]),e}();return e.now=function(){return Date.now()},e}(),Cm=function(e){l(n,e);var t=p(n);function n(e){var i,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Sm.now;return s(this,n),(i=t.call(this,e,function(){return n.delegate&&n.delegate!==h(i)?n.delegate.now():r()})).actions=[],i.active=!1,i.scheduled=void 0,i}return o(n,[{key:"schedule",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2?arguments[2]:void 0;return n.delegate&&n.delegate!==this?n.delegate.schedule(e,t,a):r(i(n.prototype),"schedule",this).call(this,e,t,a)}},{key:"flush",value:function(e){var t=this.actions;if(this.active)t.push(e);else{var n;this.active=!0;do{if(n=e.execute(e.state,e.delay))break}while(e=t.shift());if(this.active=!1,n){for(;e=t.shift();)e.unsubscribe();throw n}}}}]),n}(Sm),Lm=1,xm=function(){return Promise.resolve()}(),Tm={};function Dm(e){return e in Tm&&(delete Tm[e],!0)}var Om=function(e){var t=Lm++;return Tm[t]=!0,xm.then(function(){return Dm(t)&&e()}),t},Em=function(e){Dm(e)},Ym=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e,i)).scheduler=e,r.work=i,r}return o(n,[{key:"requestAsyncId",value:function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return null!==a&&a>0?r(i(n.prototype),"requestAsyncId",this).call(this,e,t,a):(e.actions.push(this),e.scheduled||(e.scheduled=Om(e.flush.bind(e,null))))}},{key:"recycleAsyncId",value:function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(null!==a&&a>0||null===a&&this.delay>0)return r(i(n.prototype),"recycleAsyncId",this).call(this,e,t,a);0===e.actions.length&&(Em(t),e.scheduled=void 0)}}]),n}(Mm),Pm=new(function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"flush",value:function(e){this.active=!0,this.scheduled=void 0;var t,n=this.actions,i=-1,r=n.length;e=e||n.shift();do{if(t=e.execute(e.state,e.delay))break}while(++i=0}function Wm(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,i=-1;return Bm(t)?i=Number(t)<1?1:Number(t):G(t)&&(n=t),G(n)||(n=Fm),new N(function(t){var r=Bm(e)?e:+e-n.now();return n.schedule(Vm,r,{index:0,period:i,subscriber:t})})}function Vm(e){var t=e.index,n=e.period,i=e.subscriber;if(i.next(t),!i.closed){if(-1===n)return i.complete();e.index=t+1,this.schedule(e,n)}}function Um(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Fm;return Hm(function(){return Wm(e,t)})}function zm(e,t){return function(n){return n.lift(new qm(e,t))}}var qm=function(){function e(t,n){s(this,e),this.predicate=t,this.thisArg=n}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new Gm(e,this.predicate,this.thisArg))}}]),e}(),Gm=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,e)).predicate=i,a.thisArg=r,a.count=0,a}return o(n,[{key:"_next",value:function(e){var t;try{t=this.predicate.call(this.thisArg,e,this.count++)}catch(n){return void this.destination.error(n)}t&&this.destination.next(e)}}]),n}(A);function Km(e){return function(t){return t.lift(new Jm(e))}}var Jm=function(){function e(t){s(this,e),this.notifier=t}return o(e,[{key:"call",value:function(e,t){var n=new Zm(e),i=se(this.notifier,new ae(n));return i&&!n.seenValue?(n.add(i),t.subscribe(n)):n}}]),e}(),Zm=function(e){l(n,e);var t=p(n);function n(e){var i;return s(this,n),(i=t.call(this,e)).seenValue=!1,i}return o(n,[{key:"notifyNext",value:function(){this.seenValue=!0,this.complete()}},{key:"notifyComplete",value:function(){}}]),n}(oe);function $m(){return he(1)}function Xm(){return $m()(bm.apply(void 0,arguments))}function Qm(){for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:0;return t>0?r(i(n.prototype),"schedule",this).call(this,e,t):(this.delay=t,this.state=e,this.scheduler.flush(this),this)}},{key:"execute",value:function(e,t){return t>0||this.closed?r(i(n.prototype),"execute",this).call(this,e,t):this._execute(e,t)}},{key:"requestAsyncId",value:function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return null!==a&&a>0||null===a&&this.delay>0?r(i(n.prototype),"requestAsyncId",this).call(this,e,t,a):e.flush(this)}}]),n}(Mm),rg=new(function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return n}(Cm))(ig),ag=new N(function(e){return e.complete()});function og(e){return e?function(e){return new N(function(t){return e.schedule(function(){return t.complete()})})}(e):ag}function sg(e,t){return new N(t?function(n){return t.schedule(ug,0,{error:e,subscriber:n})}:function(t){return t.error(e)})}function ug(e){e.subscriber.error(e.error)}var lg,cg=function(){var e=function(){function e(t,n,i){s(this,e),this.kind=t,this.value=n,this.error=i,this.hasValue="N"===t}return o(e,[{key:"observe",value:function(e){switch(this.kind){case"N":return e.next&&e.next(this.value);case"E":return e.error&&e.error(this.error);case"C":return e.complete&&e.complete()}}},{key:"do",value:function(e,t,n){switch(this.kind){case"N":return e&&e(this.value);case"E":return t&&t(this.error);case"C":return n&&n()}}},{key:"accept",value:function(e,t,n){return e&&"function"==typeof e.next?this.observe(e):this.do(e,t,n)}},{key:"toObservable",value:function(){switch(this.kind){case"N":return bm(this.value);case"E":return sg(this.error);case"C":return og()}throw new Error("unexpected notification kind value")}}],[{key:"createNext",value:function(t){return void 0!==t?new e("N",t):e.undefinedValueNotification}},{key:"createError",value:function(t){return new e("E",void 0,t)}},{key:"createComplete",value:function(){return e.completeNotification}}]),e}();return e.completeNotification=new e("C"),e.undefinedValueNotification=new e("N",void 0),e}(),dg=function(e){l(n,e);var t=p(n);function n(e,i){var r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return s(this,n),(r=t.call(this,e)).scheduler=i,r.delay=a,r}return o(n,[{key:"scheduleMessage",value:function(e){this.destination.add(this.scheduler.schedule(n.dispatch,this.delay,new hg(e,this.destination)))}},{key:"_next",value:function(e){this.scheduleMessage(cg.createNext(e))}},{key:"_error",value:function(e){this.scheduleMessage(cg.createError(e)),this.unsubscribe()}},{key:"_complete",value:function(){this.scheduleMessage(cg.createComplete()),this.unsubscribe()}}],[{key:"dispatch",value:function(e){e.notification.observe(e.destination),this.unsubscribe()}}]),n}(A),hg=function e(t,n){s(this,e),this.notification=t,this.destination=n},fg=function(e){l(n,e);var t=p(n);function n(){var e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Number.POSITIVE_INFINITY,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.POSITIVE_INFINITY,a=arguments.length>2?arguments[2]:void 0;return s(this,n),(e=t.call(this)).scheduler=a,e._events=[],e._infiniteTimeWindow=!1,e._bufferSize=i<1?1:i,e._windowTime=r<1?1:r,r===Number.POSITIVE_INFINITY?(e._infiniteTimeWindow=!0,e.next=e.nextInfiniteTimeWindow):e.next=e.nextTimeWindow,e}return o(n,[{key:"nextInfiniteTimeWindow",value:function(e){if(!this.isStopped){var t=this._events;t.push(e),t.length>this._bufferSize&&t.shift()}r(i(n.prototype),"next",this).call(this,e)}},{key:"nextTimeWindow",value:function(e){this.isStopped||(this._events.push(new pg(this._getNow(),e)),this._trimBufferThenGetEvents()),r(i(n.prototype),"next",this).call(this,e)}},{key:"_subscribe",value:function(e){var t,n=this._infiniteTimeWindow,i=n?this._events:this._trimBufferThenGetEvents(),r=this.scheduler,a=i.length;if(this.closed)throw new W;if(this.isStopped||this.hasError?t=x.EMPTY:(this.observers.push(e),t=new V(this,e)),r&&e.add(e=new dg(e,r)),n)for(var o=0;ot&&(a=Math.max(a,r-t)),a>0&&i.splice(0,a),i}}]),n}(z),pg=function e(t,n){s(this,e),this.time=t,this.value=n};try{lg="undefined"!=typeof Intl&&Intl.v8BreakIterator}catch(ZN){lg=!1}var mg,gg,vg,_g,yg=function(){var e=function e(t){s(this,e),this._platformId=t,this.isBrowser=this._platformId?"browser"===this._platformId:"object"==typeof document&&!!document,this.EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent),this.TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent),this.BLINK=this.isBrowser&&!(!window.chrome&&!lg)&&"undefined"!=typeof CSS&&!this.EDGE&&!this.TRIDENT,this.WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT,this.IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window),this.FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent),this.ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT,this.SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT};return e.\u0275fac=function(t){return new(t||e)(Bi(kc))},e.\u0275prov=Ie({factory:function(){return new e(Bi(kc))},token:e,providedIn:"root"}),e}(),bg=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({}),e}(),wg=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function kg(){if(mg)return mg;if("object"!=typeof document||!document)return mg=new Set(wg);var e=document.createElement("input");return mg=new Set(wg.filter(function(t){return e.setAttribute("type",t),e.type===t}))}function Mg(e){return function(){if(null==gg&&"undefined"!=typeof window)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){return gg=!0}}))}finally{gg=gg||!1}return gg}()?e:!!e.capture}function Sg(){if(null==vg){if("object"!=typeof document||!document||"function"!=typeof Element||!Element)return vg=!1;if("scrollBehavior"in document.documentElement.style)vg=!0;else{var e=Element.prototype.scrollTo;vg=!!e&&!/\{\s*\[native code\]\s*\}/.test(e.toString())}}return vg}function Cg(e){if(function(){if(null==_g){var e="undefined"!=typeof document?document.head:null;_g=!(!e||!e.createShadowRoot&&!e.attachShadow)}return _g}()){var t=e.getRootNode?e.getRootNode():null;if("undefined"!=typeof ShadowRoot&&ShadowRoot&&t instanceof ShadowRoot)return t}return null}function Lg(){for(var e="undefined"!=typeof document&&document?document.activeElement:null;e&&e.shadowRoot;){var t=e.shadowRoot.activeElement;if(t===e)break;e=t}return e}function xg(e){return e.composedPath?e.composedPath()[0]:e.target}var Tg=new Mi("cdk-dir-doc",{providedIn:"root",factory:function(){return Wi(yd)}}),Dg=function(){var e=function(){function e(t){if(s(this,e),this.value="ltr",this.change=new Zl,t){var n=(t.body?t.body.dir:null)||(t.documentElement?t.documentElement.dir:null);this.value="ltr"===n||"rtl"===n?n:"ltr"}}return o(e,[{key:"ngOnDestroy",value:function(){this.change.complete()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(Tg,8))},e.\u0275prov=Ie({factory:function(){return new e(Bi(Tg,8))},token:e,providedIn:"root"}),e}(),Og=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({}),e}(),Eg=function(){function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=arguments.length>1?arguments[1]:void 0,r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];s(this,e),this._multiple=n,this._emitChanges=r,this._selection=new Set,this._deselectedToEmit=[],this._selectedToEmit=[],this.changed=new z,i&&i.length&&(n?i.forEach(function(e){return t._markSelected(e)}):this._markSelected(i[0]),this._selectedToEmit.length=0)}return o(e,[{key:"selected",get:function(){return this._selected||(this._selected=Array.from(this._selection.values())),this._selected}},{key:"select",value:function(){for(var e=this,t=arguments.length,n=new Array(t),i=0;i0&&void 0!==arguments[0]?arguments[0]:20;return this._platform.isBrowser?new N(function(n){e._globalSubscription||e._addGlobalListener();var i=t>0?e._scrolled.pipe(Um(t)).subscribe(n):e._scrolled.subscribe(n);return e._scrolledCount++,function(){i.unsubscribe(),e._scrolledCount--,e._scrolledCount||e._removeGlobalListener()}}):bm()}},{key:"ngOnDestroy",value:function(){var e=this;this._removeGlobalListener(),this.scrollContainers.forEach(function(t,n){return e.deregister(n)}),this._scrolled.complete()}},{key:"ancestorScrolled",value:function(e,t){var n=this.getAncestorScrollContainers(e);return this.scrolled(t).pipe(zm(function(e){return!e||n.indexOf(e)>-1}))}},{key:"getAncestorScrollContainers",value:function(e){var t=this,n=[];return this.scrollContainers.forEach(function(i,r){t._scrollableContainsElement(r,e)&&n.push(r)}),n}},{key:"_getWindow",value:function(){return this._document.defaultView||window}},{key:"_scrollableContainsElement",value:function(e,t){var n=ym(t),i=e.getElementRef().nativeElement;do{if(n==i)return!0}while(n=n.parentElement);return!1}},{key:"_addGlobalListener",value:function(){var e=this;this._globalSubscription=this._ngZone.runOutsideAngular(function(){return wm(e._getWindow().document,"scroll").subscribe(function(){return e._scrolled.next()})})}},{key:"_removeGlobalListener",value:function(){this._globalSubscription&&(this._globalSubscription.unsubscribe(),this._globalSubscription=null)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(Fc),Bi(yg),Bi(yd,8))},e.\u0275prov=Ie({factory:function(){return new e(Bi(Fc),Bi(yg),Bi(yd,8))},token:e,providedIn:"root"}),e}(),Pg=function(){var e=function(){function e(t,n,i){var r=this;s(this,e),this._platform=t,this._change=new z,this._changeListener=function(e){r._change.next(e)},this._document=i,n.runOutsideAngular(function(){if(t.isBrowser){var e=r._getWindow();e.addEventListener("resize",r._changeListener),e.addEventListener("orientationchange",r._changeListener)}r.change().subscribe(function(){return r._viewportSize=null})})}return o(e,[{key:"ngOnDestroy",value:function(){if(this._platform.isBrowser){var e=this._getWindow();e.removeEventListener("resize",this._changeListener),e.removeEventListener("orientationchange",this._changeListener)}this._change.complete()}},{key:"getViewportSize",value:function(){this._viewportSize||this._updateViewportSize();var e={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),e}},{key:"getViewportRect",value:function(){var e=this.getViewportScrollPosition(),t=this.getViewportSize(),n=t.width,i=t.height;return{top:e.top,left:e.left,bottom:e.top+i,right:e.left+n,height:i,width:n}}},{key:"getViewportScrollPosition",value:function(){if(!this._platform.isBrowser)return{top:0,left:0};var e=this._document,t=this._getWindow(),n=e.documentElement,i=n.getBoundingClientRect();return{top:-i.top||e.body.scrollTop||t.scrollY||n.scrollTop||0,left:-i.left||e.body.scrollLeft||t.scrollX||n.scrollLeft||0}}},{key:"change",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:20;return e>0?this._change.pipe(Um(e)):this._change}},{key:"_getWindow",value:function(){return this._document.defaultView||window}},{key:"_updateViewportSize",value:function(){var e=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:e.innerWidth,height:e.innerHeight}:{width:0,height:0}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(yg),Bi(Fc),Bi(yd,8))},e.\u0275prov=Ie({factory:function(){return new e(Bi(yg),Bi(Fc),Bi(yd,8))},token:e,providedIn:"root"}),e}(),Ag=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({}),e}(),Ig=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[Og,bg,Ag],Og,Ag]}),e}(),Rg=function(){function e(){s(this,e)}return o(e,[{key:"attach",value:function(e){return this._attachedHost=e,e.attach(this)}},{key:"detach",value:function(){var e=this._attachedHost;null!=e&&(this._attachedHost=null,e.detach())}},{key:"isAttached",get:function(){return null!=this._attachedHost}},{key:"setAttachedHost",value:function(e){this._attachedHost=e}}]),e}(),Fg=function(e){l(n,e);var t=p(n);function n(e,i,r,a){var o;return s(this,n),(o=t.call(this)).component=e,o.viewContainerRef=i,o.injector=r,o.componentFactoryResolver=a,o}return n}(Rg),Hg=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this)).templateRef=e,a.viewContainerRef=i,a.context=r,a}return o(n,[{key:"origin",get:function(){return this.templateRef.elementRef}},{key:"attach",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.context;return this.context=t,r(i(n.prototype),"attach",this).call(this,e)}},{key:"detach",value:function(){return this.context=void 0,r(i(n.prototype),"detach",this).call(this)}}]),n}(Rg),jg=function(e){l(n,e);var t=p(n);function n(e){var i;return s(this,n),(i=t.call(this)).element=e instanceof Fu?e.nativeElement:e,i}return n}(Rg),Ng=function(){function e(){s(this,e),this._isDisposed=!1,this.attachDomPortal=null}return o(e,[{key:"hasAttached",value:function(){return!!this._attachedPortal}},{key:"attach",value:function(e){return e instanceof Fg?(this._attachedPortal=e,this.attachComponentPortal(e)):e instanceof Hg?(this._attachedPortal=e,this.attachTemplatePortal(e)):this.attachDomPortal&&e instanceof jg?(this._attachedPortal=e,this.attachDomPortal(e)):void 0}},{key:"detach",value:function(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()}},{key:"dispose",value:function(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0}},{key:"setDisposeFn",value:function(e){this._disposeFn=e}},{key:"_invokeDisposeFn",value:function(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)}}]),e}(),Bg=function(e){l(n,e);var t=p(n);function n(e,a,o,u,l){var c,d;return s(this,n),(d=t.call(this)).outletElement=e,d._componentFactoryResolver=a,d._appRef=o,d._defaultInjector=u,d.attachDomPortal=function(e){var t=e.element,a=d._document.createComment("dom-portal");t.parentNode.insertBefore(a,t),d.outletElement.appendChild(t),d._attachedPortal=e,r((c=h(d),i(n.prototype)),"setDisposeFn",c).call(c,function(){a.parentNode&&a.parentNode.replaceChild(t,a)})},d._document=l,d}return o(n,[{key:"attachComponentPortal",value:function(e){var t,n=this,i=(e.componentFactoryResolver||this._componentFactoryResolver).resolveComponentFactory(e.component);return e.viewContainerRef?(t=e.viewContainerRef.createComponent(i,e.viewContainerRef.length,e.injector||e.viewContainerRef.injector),this.setDisposeFn(function(){return t.destroy()})):(t=i.create(e.injector||this._defaultInjector),this._appRef.attachView(t.hostView),this.setDisposeFn(function(){n._appRef.detachView(t.hostView),t.destroy()})),this.outletElement.appendChild(this._getComponentRootNode(t)),this._attachedPortal=e,t}},{key:"attachTemplatePortal",value:function(e){var t=this,n=e.viewContainerRef,i=n.createEmbeddedView(e.templateRef,e.context);return i.rootNodes.forEach(function(e){return t.outletElement.appendChild(e)}),i.detectChanges(),this.setDisposeFn(function(){var e=n.indexOf(i);-1!==e&&n.remove(e)}),this._attachedPortal=e,i}},{key:"dispose",value:function(){r(i(n.prototype),"dispose",this).call(this),null!=this.outletElement.parentNode&&this.outletElement.parentNode.removeChild(this.outletElement)}},{key:"_getComponentRootNode",value:function(e){return e.hostView.rootNodes[0]}}]),n}(Ng),Wg=function(){var e=function(e){l(n,e);var t=p(n);function n(e,a,o){var u,l;return s(this,n),(l=t.call(this))._componentFactoryResolver=e,l._viewContainerRef=a,l._isInitialized=!1,l.attached=new Zl,l.attachDomPortal=function(e){var t=e.element,a=l._document.createComment("dom-portal");e.setAttachedHost(h(l)),t.parentNode.insertBefore(a,t),l._getRootNode().appendChild(t),l._attachedPortal=e,r((u=h(l),i(n.prototype)),"setDisposeFn",u).call(u,function(){a.parentNode&&a.parentNode.replaceChild(t,a)})},l._document=o,l}return o(n,[{key:"portal",get:function(){return this._attachedPortal},set:function(e){(!this.hasAttached()||e||this._isInitialized)&&(this.hasAttached()&&r(i(n.prototype),"detach",this).call(this),e&&r(i(n.prototype),"attach",this).call(this,e),this._attachedPortal=e)}},{key:"attachedRef",get:function(){return this._attachedRef}},{key:"ngOnInit",value:function(){this._isInitialized=!0}},{key:"ngOnDestroy",value:function(){r(i(n.prototype),"dispose",this).call(this),this._attachedPortal=null,this._attachedRef=null}},{key:"attachComponentPortal",value:function(e){e.setAttachedHost(this);var t=null!=e.viewContainerRef?e.viewContainerRef:this._viewContainerRef,a=(e.componentFactoryResolver||this._componentFactoryResolver).resolveComponentFactory(e.component),o=t.createComponent(a,t.length,e.injector||t.injector);return t!==this._viewContainerRef&&this._getRootNode().appendChild(o.hostView.rootNodes[0]),r(i(n.prototype),"setDisposeFn",this).call(this,function(){return o.destroy()}),this._attachedPortal=e,this._attachedRef=o,this.attached.emit(o),o}},{key:"attachTemplatePortal",value:function(e){var t=this;e.setAttachedHost(this);var a=this._viewContainerRef.createEmbeddedView(e.templateRef,e.context);return r(i(n.prototype),"setDisposeFn",this).call(this,function(){return t._viewContainerRef.clear()}),this._attachedPortal=e,this._attachedRef=a,this.attached.emit(a),a}},{key:"_getRootNode",value:function(){var e=this._viewContainerRef.element.nativeElement;return e.nodeType===e.ELEMENT_NODE?e:e.parentNode}}]),n}(Ng);return e.\u0275fac=function(t){return new(t||e)(ps(Pu),ps(bl),ps(yd))},e.\u0275dir=bt({type:e,selectors:[["","cdkPortalOutlet",""]],inputs:{portal:["cdkPortalOutlet","portal"]},outputs:{attached:"attached"},exportAs:["cdkPortalOutlet"],features:[Ko]}),e}(),Vg=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({}),e}(),Ug=function(){function e(){return Error.call(this),this.message="argument out of range",this.name="ArgumentOutOfRangeError",this}return e.prototype=Object.create(Error.prototype),e}();function zg(e){return function(t){return 0===e?og():t.lift(new qg(e))}}var qg=function(){function e(t){if(s(this,e),this.total=t,this.total<0)throw new Ug}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new Gg(e,this.total))}}]),e}(),Gg=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e)).total=i,r.count=0,r}return o(n,[{key:"_next",value:function(e){var t=this.total,n=++this.count;n<=t&&(this.destination.next(e),n===t&&(this.destination.complete(),this.unsubscribe()))}}]),n}(A),Kg=function(){function e(t,n){s(this,e),this.predicate=t,this.inclusive=n}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new Jg(e,this.predicate,this.inclusive))}}]),e}(),Jg=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,e)).predicate=i,a.inclusive=r,a.index=0,a}return o(n,[{key:"_next",value:function(e){var t,n=this.destination;try{t=this.predicate(e,this.index++)}catch(i){return void n.error(i)}this.nextOrComplete(e,t)}},{key:"nextOrComplete",value:function(e,t){var n=this.destination;Boolean(t)?n.next(e):(this.inclusive&&n.next(e),n.complete())}}]),n}(A),Zg=27,$g=38,Xg=40;function Qg(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;it.height||e.scrollWidth>t.width}}]),e}(),nv=function(){function e(t,n,i,r){var a=this;s(this,e),this._scrollDispatcher=t,this._ngZone=n,this._viewportRuler=i,this._config=r,this._scrollSubscription=null,this._detach=function(){a.disable(),a._overlayRef.hasAttached()&&a._ngZone.run(function(){return a._overlayRef.detach()})}}return o(e,[{key:"attach",value:function(e){this._overlayRef=e}},{key:"enable",value:function(){var e=this;if(!this._scrollSubscription){var t=this._scrollDispatcher.scrolled(0);this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=t.subscribe(function(){var t=e._viewportRuler.getViewportScrollPosition().top;Math.abs(t-e._initialScrollPosition)>e._config.threshold?e._detach():e._overlayRef.updatePosition()})):this._scrollSubscription=t.subscribe(this._detach)}}},{key:"disable",value:function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}},{key:"detach",value:function(){this.disable(),this._overlayRef=null}}]),e}(),iv=function(){function e(){s(this,e)}return o(e,[{key:"enable",value:function(){}},{key:"disable",value:function(){}},{key:"attach",value:function(){}}]),e}();function rv(e,t){return t.some(function(t){return e.bottomt.bottom||e.rightt.right})}function av(e,t){return t.some(function(t){return e.topt.bottom||e.leftt.right})}var ov=function(){function e(t,n,i,r){s(this,e),this._scrollDispatcher=t,this._viewportRuler=n,this._ngZone=i,this._config=r,this._scrollSubscription=null}return o(e,[{key:"attach",value:function(e){this._overlayRef=e}},{key:"enable",value:function(){var e=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(this._config?this._config.scrollThrottle:0).subscribe(function(){if(e._overlayRef.updatePosition(),e._config&&e._config.autoClose){var t=e._overlayRef.overlayElement.getBoundingClientRect(),n=e._viewportRuler.getViewportSize(),i=n.width,r=n.height;rv(t,[{width:i,height:r,bottom:r,right:i,top:0,left:0}])&&(e.disable(),e._ngZone.run(function(){return e._overlayRef.detach()}))}}))}},{key:"disable",value:function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}},{key:"detach",value:function(){this.disable(),this._overlayRef=null}}]),e}(),sv=function(){var e=function e(t,n,i,r){var a=this;s(this,e),this._scrollDispatcher=t,this._viewportRuler=n,this._ngZone=i,this.noop=function(){return new iv},this.close=function(e){return new nv(a._scrollDispatcher,a._ngZone,a._viewportRuler,e)},this.block=function(){return new tv(a._viewportRuler,a._document)},this.reposition=function(e){return new ov(a._scrollDispatcher,a._viewportRuler,a._ngZone,e)},this._document=r};return e.\u0275fac=function(t){return new(t||e)(Bi(Yg),Bi(Pg),Bi(Fc),Bi(yd))},e.\u0275prov=Ie({factory:function(){return new e(Bi(Yg),Bi(Pg),Bi(Fc),Bi(yd))},token:e,providedIn:"root"}),e}(),uv=function e(t){if(s(this,e),this.scrollStrategy=new iv,this.panelClass="",this.hasBackdrop=!1,this.backdropClass="cdk-overlay-dark-backdrop",this.disposeOnNavigation=!1,t)for(var n=0,i=Object.keys(t);n-1&&this._attachedOverlays.splice(t,1),0===this._attachedOverlays.length&&this.detach()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(yd))},e.\u0275prov=Ie({factory:function(){return new e(Bi(yd))},token:e,providedIn:"root"}),e}(),hv=function(){var e=function(e){l(n,e);var t=p(n);function n(e){var i;return s(this,n),(i=t.call(this,e))._keydownListener=function(e){for(var t=i._attachedOverlays,n=t.length-1;n>-1;n--)if(t[n]._keydownEvents.observers.length>0){t[n]._keydownEvents.next(e);break}},i}return o(n,[{key:"add",value:function(e){r(i(n.prototype),"add",this).call(this,e),this._isAttached||(this._document.body.addEventListener("keydown",this._keydownListener),this._isAttached=!0)}},{key:"detach",value:function(){this._isAttached&&(this._document.body.removeEventListener("keydown",this._keydownListener),this._isAttached=!1)}}]),n}(dv);return e.\u0275fac=function(t){return new(t||e)(Bi(yd))},e.\u0275prov=Ie({factory:function(){return new e(Bi(yd))},token:e,providedIn:"root"}),e}(),fv=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e))._platform=i,r._cursorStyleIsSet=!1,r._clickListener=function(e){for(var t=xg(e),n=r._attachedOverlays.slice(),i=n.length-1;i>-1;i--){var a=n[i];if(!(a._outsidePointerEvents.observers.length<1)&&a.hasAttached()){if(a.overlayElement.contains(t))break;a._outsidePointerEvents.next(e)}}},r}return o(n,[{key:"add",value:function(e){if(r(i(n.prototype),"add",this).call(this,e),!this._isAttached){var t=this._document.body;t.addEventListener("click",this._clickListener,!0),t.addEventListener("auxclick",this._clickListener,!0),t.addEventListener("contextmenu",this._clickListener,!0),this._platform.IOS&&!this._cursorStyleIsSet&&(this._cursorOriginalValue=t.style.cursor,t.style.cursor="pointer",this._cursorStyleIsSet=!0),this._isAttached=!0}}},{key:"detach",value:function(){if(this._isAttached){var e=this._document.body;e.removeEventListener("click",this._clickListener,!0),e.removeEventListener("auxclick",this._clickListener,!0),e.removeEventListener("contextmenu",this._clickListener,!0),this._platform.IOS&&this._cursorStyleIsSet&&(e.style.cursor=this._cursorOriginalValue,this._cursorStyleIsSet=!1),this._isAttached=!1}}}]),n}(dv);return e.\u0275fac=function(t){return new(t||e)(Bi(yd),Bi(yg))},e.\u0275prov=Ie({factory:function(){return new e(Bi(yd),Bi(yg))},token:e,providedIn:"root"}),e}(),pv="undefined"!=typeof window?window:{},mv=void 0!==pv.__karma__&&!!pv.__karma__||void 0!==pv.jasmine&&!!pv.jasmine||void 0!==pv.jest&&!!pv.jest||void 0!==pv.Mocha&&!!pv.Mocha,gv=function(){var e=function(){function e(t,n){s(this,e),this._platform=n,this._document=t}return o(e,[{key:"ngOnDestroy",value:function(){var e=this._containerElement;e&&e.parentNode&&e.parentNode.removeChild(e)}},{key:"getContainerElement",value:function(){return this._containerElement||this._createContainer(),this._containerElement}},{key:"_createContainer",value:function(){var e="cdk-overlay-container";if(this._platform.isBrowser||mv)for(var t=this._document.querySelectorAll(".".concat(e,'[platform="server"], ')+".".concat(e,'[platform="test"]')),n=0;nf&&(f=g,h=m)}}catch(_){p.e(_)}finally{p.f()}return this._isPushed=!1,void this._applyPosition(h.position,h.origin)}if(this._canPush)return this._isPushed=!0,void this._applyPosition(e.position,e.originPoint);this._applyPosition(e.position,e.originPoint)}}},{key:"detach",value:function(){this._clearPanelClasses(),this._lastPosition=null,this._previousPushAmount=null,this._resizeSubscription.unsubscribe()}},{key:"dispose",value:function(){this._isDisposed||(this._boundingBox&&wv(this._boundingBox.style,{top:"",left:"",right:"",bottom:"",height:"",width:"",alignItems:"",justifyContent:""}),this._pane&&this._resetOverlayElementStyles(),this._overlayRef&&this._overlayRef.hostElement.classList.remove(_v),this.detach(),this._positionChanges.complete(),this._overlayRef=this._boundingBox=null,this._isDisposed=!0)}},{key:"reapplyLastPosition",value:function(){if(!this._isDisposed&&(!this._platform||this._platform.isBrowser)){this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._viewportRect=this._getNarrowedViewportRect();var e=this._lastPosition||this._preferredPositions[0],t=this._getOriginPoint(this._originRect,e);this._applyPosition(e,t)}}},{key:"withScrollableContainers",value:function(e){return this._scrollables=e,this}},{key:"withPositions",value:function(e){return this._preferredPositions=e,-1===e.indexOf(this._lastPosition)&&(this._lastPosition=null),this._validatePositions(),this}},{key:"withViewportMargin",value:function(e){return this._viewportMargin=e,this}},{key:"withFlexibleDimensions",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._hasFlexibleDimensions=e,this}},{key:"withGrowAfterOpen",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._growAfterOpen=e,this}},{key:"withPush",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._canPush=e,this}},{key:"withLockedPosition",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._positionLocked=e,this}},{key:"setOrigin",value:function(e){return this._origin=e,this}},{key:"withDefaultOffsetX",value:function(e){return this._offsetX=e,this}},{key:"withDefaultOffsetY",value:function(e){return this._offsetY=e,this}},{key:"withTransformOriginOn",value:function(e){return this._transformOriginSelector=e,this}},{key:"_getOriginPoint",value:function(e,t){var n;if("center"==t.originX)n=e.left+e.width/2;else{var i=this._isRtl()?e.right:e.left,r=this._isRtl()?e.left:e.right;n="start"==t.originX?i:r}return{x:n,y:"center"==t.originY?e.top+e.height/2:"top"==t.originY?e.top:e.bottom}}},{key:"_getOverlayPoint",value:function(e,t,n){var i;return i="center"==n.overlayX?-t.width/2:"start"===n.overlayX?this._isRtl()?-t.width:0:this._isRtl()?0:-t.width,{x:e.x+i,y:e.y+("center"==n.overlayY?-t.height/2:"top"==n.overlayY?0:-t.height)}}},{key:"_getOverlayFit",value:function(e,t,n,i){var r=Mv(t),a=e.x,o=e.y,s=this._getOffset(i,"x"),u=this._getOffset(i,"y");s&&(a+=s),u&&(o+=u);var l=0-o,c=o+r.height-n.height,d=this._subtractOverflows(r.width,0-a,a+r.width-n.width),h=this._subtractOverflows(r.height,l,c),f=d*h;return{visibleArea:f,isCompletelyWithinViewport:r.width*r.height===f,fitsInViewportVertically:h===r.height,fitsInViewportHorizontally:d==r.width}}},{key:"_canFitWithFlexibleDimensions",value:function(e,t,n){if(this._hasFlexibleDimensions){var i=n.bottom-t.y,r=n.right-t.x,a=kv(this._overlayRef.getConfig().minHeight),o=kv(this._overlayRef.getConfig().minWidth);return(e.fitsInViewportVertically||null!=a&&a<=i)&&(e.fitsInViewportHorizontally||null!=o&&o<=r)}return!1}},{key:"_pushOverlayOnScreen",value:function(e,t,n){if(this._previousPushAmount&&this._positionLocked)return{x:e.x+this._previousPushAmount.x,y:e.y+this._previousPushAmount.y};var i,r,a=Mv(t),o=this._viewportRect,s=Math.max(e.x+a.width-o.width,0),u=Math.max(e.y+a.height-o.height,0),l=Math.max(o.top-n.top-e.y,0),c=Math.max(o.left-n.left-e.x,0);return this._previousPushAmount={x:i=a.width<=o.width?c||-s:e.xd&&!this._isInitialRender&&!this._growAfterOpen&&(i=e.y-d/2)}if("end"===t.overlayX&&!l||"start"===t.overlayX&&l)s=u.width-e.x+this._viewportMargin,a=e.x-this._viewportMargin;else if("start"===t.overlayX&&!l||"end"===t.overlayX&&l)o=e.x,a=u.right-e.x;else{var h=Math.min(u.right-e.x+u.left,e.x),f=this._lastBoundingBoxSize.width;o=e.x-h,(a=2*h)>f&&!this._isInitialRender&&!this._growAfterOpen&&(o=e.x-f/2)}return{top:i,left:o,bottom:r,right:s,width:a,height:n}}},{key:"_setBoundingBoxStyles",value:function(e,t){var n=this._calculateBoundingBoxRect(e,t);this._isInitialRender||this._growAfterOpen||(n.height=Math.min(n.height,this._lastBoundingBoxSize.height),n.width=Math.min(n.width,this._lastBoundingBoxSize.width));var i={};if(this._hasExactPosition())i.top=i.left="0",i.bottom=i.right=i.maxHeight=i.maxWidth="",i.width=i.height="100%";else{var r=this._overlayRef.getConfig().maxHeight,a=this._overlayRef.getConfig().maxWidth;i.height=_m(n.height),i.top=_m(n.top),i.bottom=_m(n.bottom),i.width=_m(n.width),i.left=_m(n.left),i.right=_m(n.right),i.alignItems="center"===t.overlayX?"center":"end"===t.overlayX?"flex-end":"flex-start",i.justifyContent="center"===t.overlayY?"center":"bottom"===t.overlayY?"flex-end":"flex-start",r&&(i.maxHeight=_m(r)),a&&(i.maxWidth=_m(a))}this._lastBoundingBoxSize=n,wv(this._boundingBox.style,i)}},{key:"_resetBoundingBoxStyles",value:function(){wv(this._boundingBox.style,{top:"0",left:"0",right:"0",bottom:"0",height:"",width:"",alignItems:"",justifyContent:""})}},{key:"_resetOverlayElementStyles",value:function(){wv(this._pane.style,{top:"",left:"",bottom:"",right:"",position:"",transform:""})}},{key:"_setOverlayElementStyles",value:function(e,t){var n={},i=this._hasExactPosition(),r=this._hasFlexibleDimensions,a=this._overlayRef.getConfig();if(i){var o=this._viewportRuler.getViewportScrollPosition();wv(n,this._getExactOverlayY(t,e,o)),wv(n,this._getExactOverlayX(t,e,o))}else n.position="static";var s="",u=this._getOffset(t,"x"),l=this._getOffset(t,"y");u&&(s+="translateX(".concat(u,"px) ")),l&&(s+="translateY(".concat(l,"px)")),n.transform=s.trim(),a.maxHeight&&(i?n.maxHeight=_m(a.maxHeight):r&&(n.maxHeight="")),a.maxWidth&&(i?n.maxWidth=_m(a.maxWidth):r&&(n.maxWidth="")),wv(this._pane.style,n)}},{key:"_getExactOverlayY",value:function(e,t,n){var i={top:"",bottom:""},r=this._getOverlayPoint(t,this._overlayRect,e);this._isPushed&&(r=this._pushOverlayOnScreen(r,this._overlayRect,n));var a=this._overlayContainer.getContainerElement().getBoundingClientRect().top;return r.y-=a,"bottom"===e.overlayY?i.bottom="".concat(this._document.documentElement.clientHeight-(r.y+this._overlayRect.height),"px"):i.top=_m(r.y),i}},{key:"_getExactOverlayX",value:function(e,t,n){var i={left:"",right:""},r=this._getOverlayPoint(t,this._overlayRect,e);return this._isPushed&&(r=this._pushOverlayOnScreen(r,this._overlayRect,n)),"right"==(this._isRtl()?"end"===e.overlayX?"left":"right":"end"===e.overlayX?"right":"left")?i.right="".concat(this._document.documentElement.clientWidth-(r.x+this._overlayRect.width),"px"):i.left=_m(r.x),i}},{key:"_getScrollVisibility",value:function(){var e=this._getOriginRect(),t=this._pane.getBoundingClientRect(),n=this._scrollables.map(function(e){return e.getElementRef().nativeElement.getBoundingClientRect()});return{isOriginClipped:av(e,n),isOriginOutsideView:rv(e,n),isOverlayClipped:av(t,n),isOverlayOutsideView:rv(t,n)}}},{key:"_subtractOverflows",value:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i0&&void 0!==arguments[0]?arguments[0]:"";return this._bottomOffset="",this._topOffset=e,this._alignItems="flex-start",this}},{key:"left",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._rightOffset="",this._leftOffset=e,this._justifyContent="flex-start",this}},{key:"bottom",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._topOffset="",this._bottomOffset=e,this._alignItems="flex-end",this}},{key:"right",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._leftOffset="",this._rightOffset=e,this._justifyContent="flex-end",this}},{key:"width",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._overlayRef?this._overlayRef.updateSize({width:e}):this._width=e,this}},{key:"height",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this._overlayRef?this._overlayRef.updateSize({height:e}):this._height=e,this}},{key:"centerHorizontally",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this.left(e),this._justifyContent="center",this}},{key:"centerVertically",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return this.top(e),this._alignItems="center",this}},{key:"apply",value:function(){if(this._overlayRef&&this._overlayRef.hasAttached()){var e=this._overlayRef.overlayElement.style,t=this._overlayRef.hostElement.style,n=this._overlayRef.getConfig(),i=n.width,r=n.height,a=n.maxWidth,o=n.maxHeight,s=!("100%"!==i&&"100vw"!==i||a&&"100%"!==a&&"100vw"!==a),u=!("100%"!==r&&"100vh"!==r||o&&"100%"!==o&&"100vh"!==o);e.position=this._cssPosition,e.marginLeft=s?"0":this._leftOffset,e.marginTop=u?"0":this._topOffset,e.marginBottom=this._bottomOffset,e.marginRight=this._rightOffset,s?t.justifyContent="flex-start":"center"===this._justifyContent?t.justifyContent="center":"rtl"===this._overlayRef.getConfig().direction?"flex-start"===this._justifyContent?t.justifyContent="flex-end":"flex-end"===this._justifyContent&&(t.justifyContent="flex-start"):t.justifyContent=this._justifyContent,t.alignItems=u?"flex-start":this._alignItems}}},{key:"dispose",value:function(){if(!this._isDisposed&&this._overlayRef){var e=this._overlayRef.overlayElement.style,t=this._overlayRef.hostElement,n=t.style;t.classList.remove(Cv),n.justifyContent=n.alignItems=e.marginTop=e.marginBottom=e.marginLeft=e.marginRight=e.position="",this._overlayRef=null,this._isDisposed=!0}}}]),e}(),xv=function(){var e=function(){function e(t,n,i,r){s(this,e),this._viewportRuler=t,this._document=n,this._platform=i,this._overlayContainer=r}return o(e,[{key:"global",value:function(){return new Lv}},{key:"connectedTo",value:function(e,t,n){return new Sv(t,n,e,this._viewportRuler,this._document,this._platform,this._overlayContainer)}},{key:"flexibleConnectedTo",value:function(e){return new bv(e,this._viewportRuler,this._document,this._platform,this._overlayContainer)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(Pg),Bi(yd),Bi(yg),Bi(gv))},e.\u0275prov=Ie({factory:function(){return new e(Bi(Pg),Bi(yd),Bi(yg),Bi(gv))},token:e,providedIn:"root"}),e}(),Tv=0,Dv=function(){var e=function(){function e(t,n,i,r,a,o,u,l,c,d,h){s(this,e),this.scrollStrategies=t,this._overlayContainer=n,this._componentFactoryResolver=i,this._positionBuilder=r,this._keyboardDispatcher=a,this._injector=o,this._ngZone=u,this._document=l,this._directionality=c,this._location=d,this._outsideClickDispatcher=h}return o(e,[{key:"create",value:function(e){var t=this._createHostElement(),n=this._createPaneElement(t),i=this._createPortalOutlet(n),r=new uv(e);return r.direction=r.direction||this._directionality.value,new vv(i,t,n,r,this._ngZone,this._keyboardDispatcher,this._document,this._location,this._outsideClickDispatcher)}},{key:"position",value:function(){return this._positionBuilder}},{key:"_createPaneElement",value:function(e){var t=this._document.createElement("div");return t.id="cdk-overlay-".concat(Tv++),t.classList.add("cdk-overlay-pane"),e.appendChild(t),t}},{key:"_createHostElement",value:function(){var e=this._document.createElement("div");return this._overlayContainer.getContainerElement().appendChild(e),e}},{key:"_createPortalOutlet",value:function(e){return this._appRef||(this._appRef=this._injector.get(od)),new Bg(e,this._componentFactoryResolver,this._appRef,this._injector,this._document)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(sv),Bi(gv),Bi(Pu),Bi(xv),Bi(hv),Bi(qo),Bi(Fc),Bi(yd),Bi(Dg),Bi(Ad),Bi(fv))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),Ov=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],Ev=new Mi("cdk-connected-overlay-scroll-strategy"),Yv=function(){var e=function e(t){s(this,e),this.elementRef=t};return e.\u0275fac=function(t){return new(t||e)(ps(Fu))},e.\u0275dir=bt({type:e,selectors:[["","cdk-overlay-origin",""],["","overlay-origin",""],["","cdkOverlayOrigin",""]],exportAs:["cdkOverlayOrigin"]}),e}(),Pv=function(){var e=function(){function e(t,n,i,r,a){s(this,e),this._overlay=t,this._dir=a,this._hasBackdrop=!1,this._lockPosition=!1,this._growAfterOpen=!1,this._flexibleDimensions=!1,this._push=!1,this._backdropSubscription=x.EMPTY,this._attachSubscription=x.EMPTY,this._detachSubscription=x.EMPTY,this._positionSubscription=x.EMPTY,this.viewportMargin=0,this.open=!1,this.disableClose=!1,this.backdropClick=new Zl,this.positionChange=new Zl,this.attach=new Zl,this.detach=new Zl,this.overlayKeydown=new Zl,this.overlayOutsideClick=new Zl,this._templatePortal=new Hg(n,i),this._scrollStrategyFactory=r,this.scrollStrategy=this._scrollStrategyFactory()}return o(e,[{key:"offsetX",get:function(){return this._offsetX},set:function(e){this._offsetX=e,this._position&&this._updatePositionStrategy(this._position)}},{key:"offsetY",get:function(){return this._offsetY},set:function(e){this._offsetY=e,this._position&&this._updatePositionStrategy(this._position)}},{key:"hasBackdrop",get:function(){return this._hasBackdrop},set:function(e){this._hasBackdrop=pm(e)}},{key:"lockPosition",get:function(){return this._lockPosition},set:function(e){this._lockPosition=pm(e)}},{key:"flexibleDimensions",get:function(){return this._flexibleDimensions},set:function(e){this._flexibleDimensions=pm(e)}},{key:"growAfterOpen",get:function(){return this._growAfterOpen},set:function(e){this._growAfterOpen=pm(e)}},{key:"push",get:function(){return this._push},set:function(e){this._push=pm(e)}},{key:"overlayRef",get:function(){return this._overlayRef}},{key:"dir",get:function(){return this._dir?this._dir.value:"ltr"}},{key:"ngOnDestroy",value:function(){this._attachSubscription.unsubscribe(),this._detachSubscription.unsubscribe(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._overlayRef&&this._overlayRef.dispose()}},{key:"ngOnChanges",value:function(e){this._position&&(this._updatePositionStrategy(this._position),this._overlayRef.updateSize({width:this.width,minWidth:this.minWidth,height:this.height,minHeight:this.minHeight}),e.origin&&this.open&&this._position.apply()),e.open&&(this.open?this._attachOverlay():this._detachOverlay())}},{key:"_createOverlay",value:function(){var e=this;this.positions&&this.positions.length||(this.positions=Ov);var t=this._overlayRef=this._overlay.create(this._buildConfig());this._attachSubscription=t.attachments().subscribe(function(){return e.attach.emit()}),this._detachSubscription=t.detachments().subscribe(function(){return e.detach.emit()}),t.keydownEvents().subscribe(function(t){e.overlayKeydown.next(t),t.keyCode!==Zg||e.disableClose||Qg(t)||(t.preventDefault(),e._detachOverlay())}),this._overlayRef.outsidePointerEvents().subscribe(function(t){e.overlayOutsideClick.next(t)})}},{key:"_buildConfig",value:function(){var e=this._position=this.positionStrategy||this._createPositionStrategy(),t=new uv({direction:this._dir,positionStrategy:e,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop});return(this.width||0===this.width)&&(t.width=this.width),(this.height||0===this.height)&&(t.height=this.height),(this.minWidth||0===this.minWidth)&&(t.minWidth=this.minWidth),(this.minHeight||0===this.minHeight)&&(t.minHeight=this.minHeight),this.backdropClass&&(t.backdropClass=this.backdropClass),this.panelClass&&(t.panelClass=this.panelClass),t}},{key:"_updatePositionStrategy",value:function(e){var t=this,n=this.positions.map(function(e){return{originX:e.originX,originY:e.originY,overlayX:e.overlayX,overlayY:e.overlayY,offsetX:e.offsetX||t.offsetX,offsetY:e.offsetY||t.offsetY,panelClass:e.panelClass||void 0}});return e.setOrigin(this.origin.elementRef).withPositions(n).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector)}},{key:"_createPositionStrategy",value:function(){var e=this._overlay.position().flexibleConnectedTo(this.origin.elementRef);return this._updatePositionStrategy(e),e}},{key:"_attachOverlay",value:function(){var e=this;this._overlayRef?this._overlayRef.getConfig().hasBackdrop=this.hasBackdrop:this._createOverlay(),this._overlayRef.hasAttached()||this._overlayRef.attach(this._templatePortal),this.hasBackdrop?this._backdropSubscription=this._overlayRef.backdropClick().subscribe(function(t){e.backdropClick.emit(t)}):this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.positionChange.observers.length>0&&(this._positionSubscription=this._position.positionChanges.pipe(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return function(n){return n.lift(new Kg(e,t))}}(function(){return e.positionChange.observers.length>0})).subscribe(function(t){e.positionChange.emit(t),0===e.positionChange.observers.length&&e._positionSubscription.unsubscribe()}))}},{key:"_detachOverlay",value:function(){this._overlayRef&&this._overlayRef.detach(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(Dv),ps(pl),ps(bl),ps(Ev),ps(Dg,8))},e.\u0275dir=bt({type:e,selectors:[["","cdk-connected-overlay",""],["","connected-overlay",""],["","cdkConnectedOverlay",""]],inputs:{viewportMargin:["cdkConnectedOverlayViewportMargin","viewportMargin"],open:["cdkConnectedOverlayOpen","open"],disableClose:["cdkConnectedOverlayDisableClose","disableClose"],scrollStrategy:["cdkConnectedOverlayScrollStrategy","scrollStrategy"],offsetX:["cdkConnectedOverlayOffsetX","offsetX"],offsetY:["cdkConnectedOverlayOffsetY","offsetY"],hasBackdrop:["cdkConnectedOverlayHasBackdrop","hasBackdrop"],lockPosition:["cdkConnectedOverlayLockPosition","lockPosition"],flexibleDimensions:["cdkConnectedOverlayFlexibleDimensions","flexibleDimensions"],growAfterOpen:["cdkConnectedOverlayGrowAfterOpen","growAfterOpen"],push:["cdkConnectedOverlayPush","push"],positions:["cdkConnectedOverlayPositions","positions"],origin:["cdkConnectedOverlayOrigin","origin"],positionStrategy:["cdkConnectedOverlayPositionStrategy","positionStrategy"],width:["cdkConnectedOverlayWidth","width"],height:["cdkConnectedOverlayHeight","height"],minWidth:["cdkConnectedOverlayMinWidth","minWidth"],minHeight:["cdkConnectedOverlayMinHeight","minHeight"],backdropClass:["cdkConnectedOverlayBackdropClass","backdropClass"],panelClass:["cdkConnectedOverlayPanelClass","panelClass"],transformOriginSelector:["cdkConnectedOverlayTransformOriginOn","transformOriginSelector"]},outputs:{backdropClick:"backdropClick",positionChange:"positionChange",attach:"attach",detach:"detach",overlayKeydown:"overlayKeydown",overlayOutsideClick:"overlayOutsideClick"},exportAs:["cdkConnectedOverlay"],features:[At]}),e}(),Av={provide:Ev,deps:[Dv],useFactory:function(e){return function(){return e.scrollStrategies.reposition()}}},Iv=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[Dv,Av],imports:[[Og,Vg,Ig],Ig]}),e}(),Rv=function(e){l(n,e);var t=p(n);function n(e){var i;return s(this,n),(i=t.call(this))._value=e,i}return o(n,[{key:"value",get:function(){return this.getValue()}},{key:"_subscribe",value:function(e){var t=r(i(n.prototype),"_subscribe",this).call(this,e);return t&&!t.closed&&e.next(this._value),t}},{key:"getValue",value:function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new W;return this._value}},{key:"next",value:function(e){r(i(n.prototype),"next",this).call(this,this._value=e)}}]),n}(z);function Fv(){}function Hv(e,t,n){return function(i){return i.lift(new jv(e,t,n))}}var jv=function(){function e(t,n,i){s(this,e),this.nextOrObserver=t,this.error=n,this.complete=i}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new Nv(e,this.nextOrObserver,this.error,this.complete))}}]),e}(),Nv=function(e){l(n,e);var t=p(n);function n(e,i,r,a){var o;return s(this,n),(o=t.call(this,e))._tapNext=Fv,o._tapError=Fv,o._tapComplete=Fv,o._tapError=r||Fv,o._tapComplete=a||Fv,C(i)?(o._context=h(o),o._tapNext=i):i&&(o._context=i,o._tapNext=i.next||Fv,o._tapError=i.error||Fv,o._tapComplete=i.complete||Fv),o}return o(n,[{key:"_next",value:function(e){try{this._tapNext.call(this._context,e)}catch(t){return void this.destination.error(t)}this.destination.next(e)}},{key:"_error",value:function(e){try{this._tapError.call(this._context,e)}catch(e){return void this.destination.error(e)}this.destination.error(e)}},{key:"_complete",value:function(){try{this._tapComplete.call(this._context)}catch(e){return void this.destination.error(e)}return this.destination.complete()}}]),n}(A);function Bv(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Fm;return function(n){return n.lift(new Wv(e,t))}}var Wv=function(){function e(t,n){s(this,e),this.dueTime=t,this.scheduler=n}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new Vv(e,this.dueTime,this.scheduler))}}]),e}(),Vv=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,e)).dueTime=i,a.scheduler=r,a.debouncedSubscription=null,a.lastValue=null,a.hasValue=!1,a}return o(n,[{key:"_next",value:function(e){this.clearDebounce(),this.lastValue=e,this.hasValue=!0,this.add(this.debouncedSubscription=this.scheduler.schedule(Uv,this.dueTime,this))}},{key:"_complete",value:function(){this.debouncedNext(),this.destination.complete()}},{key:"debouncedNext",value:function(){if(this.clearDebounce(),this.hasValue){var e=this.lastValue;this.lastValue=null,this.hasValue=!1,this.destination.next(e)}}},{key:"clearDebounce",value:function(){var e=this.debouncedSubscription;null!==e&&(this.remove(e),e.unsubscribe(),this.debouncedSubscription=null)}}]),n}(A);function Uv(e){e.debouncedNext()}function zv(e){return function(t){return t.lift(new qv(e))}}var qv=function(){function e(t){s(this,e),this.total=t}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new Gv(e,this.total))}}]),e}(),Gv=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e)).total=i,r.count=0,r}return o(n,[{key:"_next",value:function(e){++this.count>this.total&&this.destination.next(e)}}]),n}(A),Kv=function(){var e=function(){function e(){s(this,e)}return o(e,[{key:"create",value:function(e){return"undefined"==typeof MutationObserver?null:new MutationObserver(e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ie({factory:function(){return new e},token:e,providedIn:"root"}),e}(),Jv=function(){var e=function(){function e(t){s(this,e),this._mutationObserverFactory=t,this._observedElements=new Map}return o(e,[{key:"ngOnDestroy",value:function(){var e=this;this._observedElements.forEach(function(t,n){return e._cleanupObserver(n)})}},{key:"observe",value:function(e){var t=this,n=ym(e);return new N(function(e){var i=t._observeElement(n).subscribe(e);return function(){i.unsubscribe(),t._unobserveElement(n)}})}},{key:"_observeElement",value:function(e){if(this._observedElements.has(e))this._observedElements.get(e).count++;else{var t=new z,n=this._mutationObserverFactory.create(function(e){return t.next(e)});n&&n.observe(e,{characterData:!0,childList:!0,subtree:!0}),this._observedElements.set(e,{observer:n,stream:t,count:1})}return this._observedElements.get(e).stream}},{key:"_unobserveElement",value:function(e){this._observedElements.has(e)&&(this._observedElements.get(e).count--,this._observedElements.get(e).count||this._cleanupObserver(e))}},{key:"_cleanupObserver",value:function(e){if(this._observedElements.has(e)){var t=this._observedElements.get(e),n=t.observer,i=t.stream;n&&n.disconnect(),i.complete(),this._observedElements.delete(e)}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(Kv))},e.\u0275prov=Ie({factory:function(){return new e(Bi(Kv))},token:e,providedIn:"root"}),e}(),Zv=function(){var e=function(){function e(t,n,i){s(this,e),this._contentObserver=t,this._elementRef=n,this._ngZone=i,this.event=new Zl,this._disabled=!1,this._currentSubscription=null}return o(e,[{key:"disabled",get:function(){return this._disabled},set:function(e){this._disabled=pm(e),this._disabled?this._unsubscribe():this._subscribe()}},{key:"debounce",get:function(){return this._debounce},set:function(e){this._debounce=mm(e),this._subscribe()}},{key:"ngAfterContentInit",value:function(){this._currentSubscription||this.disabled||this._subscribe()}},{key:"ngOnDestroy",value:function(){this._unsubscribe()}},{key:"_subscribe",value:function(){var e=this;this._unsubscribe();var t=this._contentObserver.observe(this._elementRef);this._ngZone.runOutsideAngular(function(){e._currentSubscription=(e.debounce?t.pipe(Bv(e.debounce)):t).subscribe(e.event)})}},{key:"_unsubscribe",value:function(){var e;null===(e=this._currentSubscription)||void 0===e||e.unsubscribe()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(Jv),ps(Fu),ps(Fc))},e.\u0275dir=bt({type:e,selectors:[["","cdkObserveContent",""]],inputs:{disabled:["cdkObserveContentDisabled","disabled"],debounce:"debounce"},outputs:{event:"cdkObserveContent"},exportAs:["cdkObserveContent"]}),e}(),$v=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[Kv]}),e}();function Xv(e,t){return(e.getAttribute(t)||"").match(/\S+/g)||[]}var Qv="cdk-describedby-message-container",e_="cdk-describedby-message",t_="cdk-describedby-host",n_=0,i_=new Map,r_=null,a_=function(){var e=function(){function e(t){s(this,e),this._document=t}return o(e,[{key:"describe",value:function(e,t,n){if(this._canBeDescribed(e,t)){var i=o_(t,n);"string"!=typeof t?(s_(t),i_.set(i,{messageElement:t,referenceCount:0})):i_.has(i)||this._createMessageElement(t,n),this._isElementDescribedByMessage(e,i)||this._addMessageReference(e,i)}}},{key:"removeDescription",value:function(e,t,n){if(t&&this._isElementNode(e)){var i=o_(t,n);if(this._isElementDescribedByMessage(e,i)&&this._removeMessageReference(e,i),"string"==typeof t){var r=i_.get(i);r&&0===r.referenceCount&&this._deleteMessageElement(i)}r_&&0===r_.childNodes.length&&this._deleteMessagesContainer()}}},{key:"ngOnDestroy",value:function(){for(var e=this._document.querySelectorAll("[".concat(t_,"]")),t=0;t-1&&t!==n._activeItemIndex&&(n._activeItemIndex=t)}})}return o(e,[{key:"skipPredicate",value:function(e){return this._skipPredicateFn=e,this}},{key:"withWrap",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._wrap=e,this}},{key:"withVerticalOrientation",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._vertical=e,this}},{key:"withHorizontalOrientation",value:function(e){return this._horizontal=e,this}},{key:"withAllowedModifierKeys",value:function(e){return this._allowedModifierKeys=e,this}},{key:"withTypeAhead",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:200;return this._typeaheadSubscription.unsubscribe(),this._typeaheadSubscription=this._letterKeyStream.pipe(Hv(function(t){return e._pressedLetters.push(t)}),Bv(t),zm(function(){return e._pressedLetters.length>0}),K(function(){return e._pressedLetters.join("")})).subscribe(function(t){for(var n=e._getItemsArray(),i=1;i0&&void 0!==arguments[0])||arguments[0];return this._homeAndEnd=e,this}},{key:"setActiveItem",value:function(e){var t=this._activeItem;this.updateActiveItem(e),this._activeItem!==t&&this.change.next(this._activeItemIndex)}},{key:"onKeydown",value:function(e){var t=this,n=e.keyCode,i=["altKey","ctrlKey","metaKey","shiftKey"].every(function(n){return!e[n]||t._allowedModifierKeys.indexOf(n)>-1});switch(n){case 9:return void this.tabOut.next();case Xg:if(this._vertical&&i){this.setNextItemActive();break}return;case $g:if(this._vertical&&i){this.setPreviousItemActive();break}return;case 39:if(this._horizontal&&i){"rtl"===this._horizontal?this.setPreviousItemActive():this.setNextItemActive();break}return;case 37:if(this._horizontal&&i){"rtl"===this._horizontal?this.setNextItemActive():this.setPreviousItemActive();break}return;case 36:if(this._homeAndEnd&&i){this.setFirstItemActive();break}return;case 35:if(this._homeAndEnd&&i){this.setLastItemActive();break}return;default:return void((i||Qg(e,"shiftKey"))&&(e.key&&1===e.key.length?this._letterKeyStream.next(e.key.toLocaleUpperCase()):(n>=65&&n<=90||n>=48&&n<=57)&&this._letterKeyStream.next(String.fromCharCode(n))))}this._pressedLetters=[],e.preventDefault()}},{key:"activeItemIndex",get:function(){return this._activeItemIndex}},{key:"activeItem",get:function(){return this._activeItem}},{key:"isTyping",value:function(){return this._pressedLetters.length>0}},{key:"setFirstItemActive",value:function(){this._setActiveItemByIndex(0,1)}},{key:"setLastItemActive",value:function(){this._setActiveItemByIndex(this._items.length-1,-1)}},{key:"setNextItemActive",value:function(){this._activeItemIndex<0?this.setFirstItemActive():this._setActiveItemByDelta(1)}},{key:"setPreviousItemActive",value:function(){this._activeItemIndex<0&&this._wrap?this.setLastItemActive():this._setActiveItemByDelta(-1)}},{key:"updateActiveItem",value:function(e){var t=this._getItemsArray(),n="number"==typeof e?e:t.indexOf(e),i=t[n];this._activeItem=null==i?null:i,this._activeItemIndex=n}},{key:"_setActiveItemByDelta",value:function(e){this._wrap?this._setActiveInWrapMode(e):this._setActiveInDefaultMode(e)}},{key:"_setActiveInWrapMode",value:function(e){for(var t=this._getItemsArray(),n=1;n<=t.length;n++){var i=(this._activeItemIndex+e*n+t.length)%t.length;if(!this._skipPredicateFn(t[i]))return void this.setActiveItem(i)}}},{key:"_setActiveInDefaultMode",value:function(e){this._setActiveItemByIndex(this._activeItemIndex+e,e)}},{key:"_setActiveItemByIndex",value:function(e,t){var n=this._getItemsArray();if(n[e]){for(;this._skipPredicateFn(n[e]);)if(!n[e+=t])return;this.setActiveItem(e)}}},{key:"_getItemsArray",value:function(){return this._items instanceof Xl?this._items.toArray():this._items}}]),e}(),l_=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"setActiveItem",value:function(e){this.activeItem&&this.activeItem.setInactiveStyles(),r(i(n.prototype),"setActiveItem",this).call(this,e),this.activeItem&&this.activeItem.setActiveStyles()}}]),n}(u_),c_=function(e){l(n,e);var t=p(n);function n(){var e;return s(this,n),(e=t.apply(this,arguments))._origin="program",e}return o(n,[{key:"setFocusOrigin",value:function(e){return this._origin=e,this}},{key:"setActiveItem",value:function(e){r(i(n.prototype),"setActiveItem",this).call(this,e),this.activeItem&&this.activeItem.focus(this._origin)}}]),n}(u_),d_=function(){var e=function(){function e(t){s(this,e),this._platform=t}return o(e,[{key:"isDisabled",value:function(e){return e.hasAttribute("disabled")}},{key:"isVisible",value:function(e){return function(e){return!!(e.offsetWidth||e.offsetHeight||"function"==typeof e.getClientRects&&e.getClientRects().length)}(e)&&"visible"===getComputedStyle(e).visibility}},{key:"isTabbable",value:function(e){if(!this._platform.isBrowser)return!1;var t,n=function(e){try{return e.frameElement}catch(ZN){return null}}((t=e).ownerDocument&&t.ownerDocument.defaultView||window);if(n){if(-1===f_(n))return!1;if(!this.isVisible(n))return!1}var i=e.nodeName.toLowerCase(),r=f_(e);return e.hasAttribute("contenteditable")?-1!==r:"iframe"!==i&&"object"!==i&&!(this._platform.WEBKIT&&this._platform.IOS&&!function(e){var t=e.nodeName.toLowerCase(),n="input"===t&&e.type;return"text"===n||"password"===n||"select"===t||"textarea"===t}(e))&&("audio"===i?!!e.hasAttribute("controls")&&-1!==r:"video"===i?-1!==r&&(null!==r||this._platform.FIREFOX||e.hasAttribute("controls")):e.tabIndex>=0)}},{key:"isFocusable",value:function(e,t){return function(e){return!function(e){return function(e){return"input"==e.nodeName.toLowerCase()}(e)&&"hidden"==e.type}(e)&&(function(e){var t=e.nodeName.toLowerCase();return"input"===t||"select"===t||"button"===t||"textarea"===t}(e)||function(e){return function(e){return"a"==e.nodeName.toLowerCase()}(e)&&e.hasAttribute("href")}(e)||e.hasAttribute("contenteditable")||h_(e))}(e)&&!this.isDisabled(e)&&((null==t?void 0:t.ignoreVisibility)||this.isVisible(e))}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(yg))},e.\u0275prov=Ie({factory:function(){return new e(Bi(yg))},token:e,providedIn:"root"}),e}();function h_(e){if(!e.hasAttribute("tabindex")||void 0===e.tabIndex)return!1;var t=e.getAttribute("tabindex");return"-32768"!=t&&!(!t||isNaN(parseInt(t,10)))}function f_(e){if(!h_(e))return null;var t=parseInt(e.getAttribute("tabindex")||"",10);return isNaN(t)?-1:t}var p_=function(){function e(t,n,i,r){var a=this,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];s(this,e),this._element=t,this._checker=n,this._ngZone=i,this._document=r,this._hasAttached=!1,this.startAnchorListener=function(){return a.focusLastTabbableElement()},this.endAnchorListener=function(){return a.focusFirstTabbableElement()},this._enabled=!0,o||this.attachAnchors()}return o(e,[{key:"enabled",get:function(){return this._enabled},set:function(e){this._enabled=e,this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}},{key:"destroy",value:function(){var e=this._startAnchor,t=this._endAnchor;e&&(e.removeEventListener("focus",this.startAnchorListener),e.parentNode&&e.parentNode.removeChild(e)),t&&(t.removeEventListener("focus",this.endAnchorListener),t.parentNode&&t.parentNode.removeChild(t)),this._startAnchor=this._endAnchor=null,this._hasAttached=!1}},{key:"attachAnchors",value:function(){var e=this;return!!this._hasAttached||(this._ngZone.runOutsideAngular(function(){e._startAnchor||(e._startAnchor=e._createAnchor(),e._startAnchor.addEventListener("focus",e.startAnchorListener)),e._endAnchor||(e._endAnchor=e._createAnchor(),e._endAnchor.addEventListener("focus",e.endAnchorListener))}),this._element.parentNode&&(this._element.parentNode.insertBefore(this._startAnchor,this._element),this._element.parentNode.insertBefore(this._endAnchor,this._element.nextSibling),this._hasAttached=!0),this._hasAttached)}},{key:"focusInitialElementWhenReady",value:function(e){var t=this;return new Promise(function(n){t._executeOnStable(function(){return n(t.focusInitialElement(e))})})}},{key:"focusFirstTabbableElementWhenReady",value:function(e){var t=this;return new Promise(function(n){t._executeOnStable(function(){return n(t.focusFirstTabbableElement(e))})})}},{key:"focusLastTabbableElementWhenReady",value:function(e){var t=this;return new Promise(function(n){t._executeOnStable(function(){return n(t.focusLastTabbableElement(e))})})}},{key:"_getRegionBoundary",value:function(e){for(var t=this._element.querySelectorAll("[cdk-focus-region-".concat(e,"], ")+"[cdkFocusRegion".concat(e,"], ")+"[cdk-focus-".concat(e,"]")),n=0;n=0;n--){var i=t[n].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(t[n]):null;if(i)return i}return null}},{key:"_createAnchor",value:function(){var e=this._document.createElement("div");return this._toggleAnchorTabIndex(this._enabled,e),e.classList.add("cdk-visually-hidden"),e.classList.add("cdk-focus-trap-anchor"),e.setAttribute("aria-hidden","true"),e}},{key:"_toggleAnchorTabIndex",value:function(e,t){e?t.setAttribute("tabindex","0"):t.removeAttribute("tabindex")}},{key:"toggleAnchors",value:function(e){this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}},{key:"_executeOnStable",value:function(e){this._ngZone.isStable?e():this._ngZone.onStable.pipe(zg(1)).subscribe(e)}}]),e}(),m_=function(){var e=function(){function e(t,n,i){s(this,e),this._checker=t,this._ngZone=n,this._document=i}return o(e,[{key:"create",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return new p_(e,this._checker,this._ngZone,this._document,t)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(d_),Bi(Fc),Bi(yd))},e.\u0275prov=Ie({factory:function(){return new e(Bi(d_),Bi(Fc),Bi(yd))},token:e,providedIn:"root"}),e}();function g_(e){return 0===e.offsetX&&0===e.offsetY}function v_(e){var t=e.touches&&e.touches[0]||e.changedTouches&&e.changedTouches[0];return!(!t||-1!==t.identifier||null!=t.radiusX&&1!==t.radiusX||null!=t.radiusY&&1!==t.radiusY)}"undefined"!=typeof Element&∈var __=new Mi("cdk-input-modality-detector-options"),y_={ignoreKeys:[18,17,224,91,16]},b_=Mg({passive:!0,capture:!0}),w_=function(){var e=function(){function e(t,n,i,r){var a=this;s(this,e),this._platform=t,this._mostRecentTarget=null,this._modality=new Rv(null),this._lastTouchMs=0,this._onKeydown=function(e){var t,n;(null===(n=null===(t=a._options)||void 0===t?void 0:t.ignoreKeys)||void 0===n?void 0:n.some(function(t){return t===e.keyCode}))||(a._modality.next("keyboard"),a._mostRecentTarget=xg(e))},this._onMousedown=function(e){Date.now()-a._lastTouchMs<650||(a._modality.next(g_(e)?"keyboard":"mouse"),a._mostRecentTarget=xg(e))},this._onTouchstart=function(e){v_(e)?a._modality.next("keyboard"):(a._lastTouchMs=Date.now(),a._modality.next("touch"),a._mostRecentTarget=xg(e))},this._options=Object.assign(Object.assign({},y_),r),this.modalityDetected=this._modality.pipe(zv(1)),this.modalityChanged=this.modalityDetected.pipe(Am()),t.isBrowser&&n.runOutsideAngular(function(){i.addEventListener("keydown",a._onKeydown,b_),i.addEventListener("mousedown",a._onMousedown,b_),i.addEventListener("touchstart",a._onTouchstart,b_)})}return o(e,[{key:"mostRecentModality",get:function(){return this._modality.value}},{key:"ngOnDestroy",value:function(){this._platform.isBrowser&&(document.removeEventListener("keydown",this._onKeydown,b_),document.removeEventListener("mousedown",this._onMousedown,b_),document.removeEventListener("touchstart",this._onTouchstart,b_))}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(yg),Bi(Fc),Bi(yd),Bi(__,8))},e.\u0275prov=Ie({factory:function(){return new e(Bi(yg),Bi(Fc),Bi(yd),Bi(__,8))},token:e,providedIn:"root"}),e}(),k_=new Mi("liveAnnouncerElement",{providedIn:"root",factory:function(){return null}}),M_=new Mi("LIVE_ANNOUNCER_DEFAULT_OPTIONS"),S_=function(){var e=function(){function e(t,n,i,r){s(this,e),this._ngZone=n,this._defaultOptions=r,this._document=i,this._liveElement=t||this._createLiveElement()}return o(e,[{key:"announce",value:function(e){for(var t,n,i=this,r=this._defaultOptions,a=arguments.length,o=new Array(a>1?a-1:0),s=1;s1&&void 0!==arguments[1]&&arguments[1],n=ym(e);if(!this._platform.isBrowser||1!==n.nodeType)return bm(null);var i=Cg(n)||this._getDocument(),r=this._elementInfo.get(n);if(r)return t&&(r.checkChildren=!0),r.subject;var a={checkChildren:t,subject:new z,rootNode:i};return this._elementInfo.set(n,a),this._registerGlobalListeners(a),a.subject}},{key:"stopMonitoring",value:function(e){var t=ym(e),n=this._elementInfo.get(t);n&&(n.subject.complete(),this._setClasses(t),this._elementInfo.delete(t),this._removeGlobalListeners(n))}},{key:"focusVia",value:function(e,t,n){var i=this,r=ym(e);r===this._getDocument().activeElement?this._getClosestElementsInfo(r).forEach(function(e){var n=_(e,2);return i._originChanged(n[0],t,n[1])}):(this._setOrigin(t),"function"==typeof r.focus&&r.focus(n))}},{key:"ngOnDestroy",value:function(){var e=this;this._elementInfo.forEach(function(t,n){return e.stopMonitoring(n)})}},{key:"_getDocument",value:function(){return this._document||document}},{key:"_getWindow",value:function(){return this._getDocument().defaultView||window}},{key:"_toggleClass",value:function(e,t,n){n?e.classList.add(t):e.classList.remove(t)}},{key:"_getFocusOrigin",value:function(e){return this._origin?this._originFromTouchInteraction?this._shouldBeAttributedToTouch(e)?"touch":"program":this._origin:this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:"program"}},{key:"_shouldBeAttributedToTouch",value:function(e){return 1===this._detectionMode||!!(null==e?void 0:e.contains(this._inputModalityDetector._mostRecentTarget))}},{key:"_setClasses",value:function(e,t){this._toggleClass(e,"cdk-focused",!!t),this._toggleClass(e,"cdk-touch-focused","touch"===t),this._toggleClass(e,"cdk-keyboard-focused","keyboard"===t),this._toggleClass(e,"cdk-mouse-focused","mouse"===t),this._toggleClass(e,"cdk-program-focused","program"===t)}},{key:"_setOrigin",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this._ngZone.runOutsideAngular(function(){t._origin=e,t._originFromTouchInteraction="touch"===e&&n,0===t._detectionMode&&(clearTimeout(t._originTimeoutId),t._originTimeoutId=setTimeout(function(){return t._origin=null},t._originFromTouchInteraction?650:1))})}},{key:"_onFocus",value:function(e,t){var n=this._elementInfo.get(t),i=xg(e);n&&(n.checkChildren||t===i)&&this._originChanged(t,this._getFocusOrigin(i),n)}},{key:"_onBlur",value:function(e,t){var n=this._elementInfo.get(t);!n||n.checkChildren&&e.relatedTarget instanceof Node&&t.contains(e.relatedTarget)||(this._setClasses(t),this._emitOrigin(n.subject,null))}},{key:"_emitOrigin",value:function(e,t){this._ngZone.run(function(){return e.next(t)})}},{key:"_registerGlobalListeners",value:function(e){var t=this;if(this._platform.isBrowser){var n=e.rootNode,i=this._rootNodeFocusListenerCount.get(n)||0;i||this._ngZone.runOutsideAngular(function(){n.addEventListener("focus",t._rootNodeFocusAndBlurListener,L_),n.addEventListener("blur",t._rootNodeFocusAndBlurListener,L_)}),this._rootNodeFocusListenerCount.set(n,i+1),1==++this._monitoredElementCount&&(this._ngZone.runOutsideAngular(function(){t._getWindow().addEventListener("focus",t._windowFocusListener)}),this._inputModalityDetector.modalityDetected.pipe(Km(this._stopInputModalityDetector)).subscribe(function(e){t._setOrigin(e,!0)}))}}},{key:"_removeGlobalListeners",value:function(e){var t=e.rootNode;if(this._rootNodeFocusListenerCount.has(t)){var n=this._rootNodeFocusListenerCount.get(t);n>1?this._rootNodeFocusListenerCount.set(t,n-1):(t.removeEventListener("focus",this._rootNodeFocusAndBlurListener,L_),t.removeEventListener("blur",this._rootNodeFocusAndBlurListener,L_),this._rootNodeFocusListenerCount.delete(t))}--this._monitoredElementCount||(this._getWindow().removeEventListener("focus",this._windowFocusListener),this._stopInputModalityDetector.next(),clearTimeout(this._windowFocusTimeoutId),clearTimeout(this._originTimeoutId))}},{key:"_originChanged",value:function(e,t,n){this._setClasses(e,t),this._emitOrigin(n.subject,t),this._lastFocusOrigin=t}},{key:"_getClosestElementsInfo",value:function(e){var t=[];return this._elementInfo.forEach(function(n,i){(i===e||n.checkChildren&&i.contains(e))&&t.push([i,n])}),t}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(Fc),Bi(yg),Bi(w_),Bi(yd,8),Bi(C_,8))},e.\u0275prov=Ie({factory:function(){return new e(Bi(Fc),Bi(yg),Bi(w_),Bi(yd,8),Bi(C_,8))},token:e,providedIn:"root"}),e}(),T_="cdk-high-contrast-black-on-white",D_="cdk-high-contrast-white-on-black",O_="cdk-high-contrast-active",E_=function(){var e=function(){function e(t,n){s(this,e),this._platform=t,this._document=n}return o(e,[{key:"getHighContrastMode",value:function(){if(!this._platform.isBrowser)return 0;var e=this._document.createElement("div");e.style.backgroundColor="rgb(1,2,3)",e.style.position="absolute",this._document.body.appendChild(e);var t=this._document.defaultView||window,n=t&&t.getComputedStyle?t.getComputedStyle(e):null,i=(n&&n.backgroundColor||"").replace(/ /g,"");switch(this._document.body.removeChild(e),i){case"rgb(0,0,0)":return 2;case"rgb(255,255,255)":return 1}return 0}},{key:"_applyBodyHighContrastModeCssClasses",value:function(){if(!this._hasCheckedHighContrastMode&&this._platform.isBrowser&&this._document.body){var e=this._document.body.classList;e.remove(O_),e.remove(T_),e.remove(D_),this._hasCheckedHighContrastMode=!0;var t=this.getHighContrastMode();1===t?(e.add(O_),e.add(T_)):2===t&&(e.add(O_),e.add(D_))}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(yg),Bi(yd))},e.\u0275prov=Ie({factory:function(){return new e(Bi(yg),Bi(yd))},token:e,providedIn:"root"}),e}(),Y_=function(){var e=function e(t){s(this,e),t._applyBodyHighContrastModeCssClasses()};return e.\u0275fac=function(t){return new(t||e)(Bi(E_))},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[bg,$v]]}),e}(),P_=new Vu("12.2.3"),A_=function e(){s(this,e)},I_=function e(){s(this,e)},R_="*";function F_(e,t){return{type:7,name:e,definitions:t,options:{}}}function H_(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return{type:4,styles:t,timings:e}}function j_(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return{type:2,steps:e,options:t}}function N_(e){return{type:6,styles:e,offset:null}}function B_(e,t,n){return{type:0,name:e,styles:t,options:n}}function W_(e){return{type:5,steps:e}}function V_(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return{type:1,expr:e,animation:t,options:n}}function U_(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return{type:9,options:e}}function z_(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return{type:11,selector:e,animation:t,options:n}}function q_(e){Promise.resolve(null).then(e)}var G_=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;s(this,e),this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this._position=0,this.parentPlayer=null,this.totalTime=t+n}return o(e,[{key:"_onFinish",value:function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])}},{key:"onStart",value:function(e){this._onStartFns.push(e)}},{key:"onDone",value:function(e){this._onDoneFns.push(e)}},{key:"onDestroy",value:function(e){this._onDestroyFns.push(e)}},{key:"hasStarted",value:function(){return this._started}},{key:"init",value:function(){}},{key:"play",value:function(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}},{key:"triggerMicrotask",value:function(){var e=this;q_(function(){return e._onFinish()})}},{key:"_onStart",value:function(){this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[]}},{key:"pause",value:function(){}},{key:"restart",value:function(){}},{key:"finish",value:function(){this._onFinish()}},{key:"destroy",value:function(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])}},{key:"reset",value:function(){this._started=!1}},{key:"setPosition",value:function(e){this._position=this.totalTime?e*this.totalTime:1}},{key:"getPosition",value:function(){return this.totalTime?this._position/this.totalTime:1}},{key:"triggerCallback",value:function(e){var t="start"==e?this._onStartFns:this._onDoneFns;t.forEach(function(e){return e()}),t.length=0}}]),e}(),K_=function(){function e(t){var n=this;s(this,e),this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=t;var i=0,r=0,a=0,o=this.players.length;0==o?q_(function(){return n._onFinish()}):this.players.forEach(function(e){e.onDone(function(){++i==o&&n._onFinish()}),e.onDestroy(function(){++r==o&&n._onDestroy()}),e.onStart(function(){++a==o&&n._onStart()})}),this.totalTime=this.players.reduce(function(e,t){return Math.max(e,t.totalTime)},0)}return o(e,[{key:"_onFinish",value:function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])}},{key:"init",value:function(){this.players.forEach(function(e){return e.init()})}},{key:"onStart",value:function(e){this._onStartFns.push(e)}},{key:"_onStart",value:function(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[])}},{key:"onDone",value:function(e){this._onDoneFns.push(e)}},{key:"onDestroy",value:function(e){this._onDestroyFns.push(e)}},{key:"hasStarted",value:function(){return this._started}},{key:"play",value:function(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(function(e){return e.play()})}},{key:"pause",value:function(){this.players.forEach(function(e){return e.pause()})}},{key:"restart",value:function(){this.players.forEach(function(e){return e.restart()})}},{key:"finish",value:function(){this._onFinish(),this.players.forEach(function(e){return e.finish()})}},{key:"destroy",value:function(){this._onDestroy()}},{key:"_onDestroy",value:function(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(function(e){return e.destroy()}),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])}},{key:"reset",value:function(){this.players.forEach(function(e){return e.reset()}),this._destroyed=!1,this._finished=!1,this._started=!1}},{key:"setPosition",value:function(e){var t=e*this.totalTime;this.players.forEach(function(e){var n=e.totalTime?Math.min(1,t/e.totalTime):1;e.setPosition(n)})}},{key:"getPosition",value:function(){var e=this.players.reduce(function(e,t){return null===e||t.totalTime>e.totalTime?t:e},null);return null!=e?e.getPosition():0}},{key:"beforeDestroy",value:function(){this.players.forEach(function(e){e.beforeDestroy&&e.beforeDestroy()})}},{key:"triggerCallback",value:function(e){var t="start"==e?this._onStartFns:this._onDoneFns;t.forEach(function(e){return e()}),t.length=0}}]),e}(),J_="!";function Z_(){return"undefined"!=typeof window&&void 0!==window.document}function $_(){return"undefined"!=typeof process&&"[object process]"==={}.toString.call(process)}function X_(e){switch(e.length){case 0:return new G_;case 1:return e[0];default:return new K_(e)}}function Q_(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},o=[],s=[],u=-1,l=null;if(i.forEach(function(e){var n=e.offset,i=n==u,c=i&&l||{};Object.keys(e).forEach(function(n){var i=n,s=e[n];if("offset"!==n)switch(i=t.normalizePropertyName(i,o),s){case J_:s=r[n];break;case R_:s=a[n];break;default:s=t.normalizeStyleValue(n,i,s,o)}c[i]=s}),i||s.push(c),l=c,u=n}),o.length){var c="\n - ";throw new Error("Unable to animate due to the following errors:".concat(c).concat(o.join(c)))}return s}function ey(e,t,n,i){switch(t){case"start":e.onStart(function(){return i(n&&ty(n,"start",e))});break;case"done":e.onDone(function(){return i(n&&ty(n,"done",e))});break;case"destroy":e.onDestroy(function(){return i(n&&ty(n,"destroy",e))})}}function ty(e,t,n){var i=n.totalTime,r=ny(e.element,e.triggerName,e.fromState,e.toState,t||e.phaseName,null==i?e.totalTime:i,!!n.disabled),a=e._data;return null!=a&&(r._data=a),r}function ny(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,o=arguments.length>6?arguments[6]:void 0;return{element:e,triggerName:t,fromState:n,toState:i,phaseName:r,totalTime:a,disabled:!!o}}function iy(e,t,n){var i;return e instanceof Map?(i=e.get(t))||e.set(t,i=n):(i=e[t])||(i=e[t]=n),i}function ry(e){var t=e.indexOf(":");return[e.substring(1,t),e.substr(t+1)]}var ay=function(e,t){return!1},oy=function(e,t){return!1},sy=function(e,t,n){return[]},uy=$_();(uy||"undefined"!=typeof Element)&&(ay=Z_()?function(e,t){for(;t&&t!==document.documentElement;){if(t===e)return!0;t=t.parentNode||t.host}return!1}:function(e,t){return e.contains(t)},oy=function(){if(uy||Element.prototype.matches)return function(e,t){return e.matches(t)};var e=Element.prototype,t=e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;return t?function(e,n){return t.apply(e,[n])}:oy}(),sy=function(e,t,n){var i=[];if(n)for(var r=e.querySelectorAll(t),a=0;a1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).forEach(function(n){t[n]=e[n]}),t}function Ty(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(t)for(var i in e)n[i]=e[i];else xy(e,n);return n}function Dy(e,t,n){return n?t+":"+n+";":""}function Oy(e){for(var t="",n=0;n *";case":leave":return"* => void";case":increment":return function(e,t){return parseFloat(t)>parseFloat(e)};case":decrement":return function(e,t){return parseFloat(t) *"}}(e,n);if("function"==typeof i)return void t.push(i);e=i}var r=e.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(null==r||r.length<4)return n.push('The provided transition expression "'.concat(e,'" is not supported')),t;var a=r[1],o=r[2],s=r[3];t.push(Gy(a,s)),"<"!=o[0]||a==Uy&&s==Uy||t.push(Gy(s,a))}(e,r,i)}):r.push(n),r),animation:a,queryCount:t.queryCount,depCount:t.depCount,options:eb(e.options)}}},{key:"visitSequence",value:function(e,t){var n=this;return{type:2,steps:e.steps.map(function(e){return Wy(n,e,t)}),options:eb(e.options)}}},{key:"visitGroup",value:function(e,t){var n=this,i=t.currentTime,r=0,a=e.steps.map(function(e){t.currentTime=i;var a=Wy(n,e,t);return r=Math.max(r,t.currentTime),a});return t.currentTime=r,{type:3,steps:a,options:eb(e.options)}}},{key:"visitAnimate",value:function(e,t){var n,i=function(e,t){var n=null;if(e.hasOwnProperty("duration"))n=e;else if("number"==typeof e)return tb(Ly(e,t).duration,0,"");var i=e;if(i.split(/\s+/).some(function(e){return"{"==e.charAt(0)&&"{"==e.charAt(1)})){var r=tb(0,0,"");return r.dynamic=!0,r.strValue=i,r}return tb((n=n||Ly(i,t)).duration,n.delay,n.easing)}(e.timings,t.errors);t.currentAnimateTimings=i;var r=e.styles?e.styles:N_({});if(5==r.type)n=this.visitKeyframes(r,t);else{var a=e.styles,o=!1;if(!a){o=!0;var s={};i.easing&&(s.easing=i.easing),a=N_(s)}t.currentTime+=i.duration+i.delay;var u=this.visitStyle(a,t);u.isEmptyStep=o,n=u}return t.currentAnimateTimings=null,{type:4,timings:i,style:n,options:null}}},{key:"visitStyle",value:function(e,t){var n=this._makeStyleAst(e,t);return this._validateStyleAst(n,t),n}},{key:"_makeStyleAst",value:function(e,t){var n=[];Array.isArray(e.styles)?e.styles.forEach(function(e){"string"==typeof e?e==R_?n.push(e):t.errors.push("The provided style string value ".concat(e," is not allowed.")):n.push(e)}):n.push(e.styles);var i=!1,r=null;return n.forEach(function(e){if(Qy(e)){var t=e,n=t.easing;if(n&&(r=n,delete t.easing),!i)for(var a in t)if(t[a].toString().indexOf("{{")>=0){i=!0;break}}}),{type:6,styles:n,easing:r,offset:e.offset,containsDynamicStyles:i,options:null}}},{key:"_validateStyleAst",value:function(e,t){var n=this,i=t.currentAnimateTimings,r=t.currentTime,a=t.currentTime;i&&a>0&&(a-=i.duration+i.delay),e.styles.forEach(function(e){"string"!=typeof e&&Object.keys(e).forEach(function(i){if(n._driver.validateStyleProperty(i)){var o=t.collectedStyles[t.currentQuerySelector],s=o[i],u=!0;s&&(a!=r&&a>=s.startTime&&r<=s.endTime&&(t.errors.push('The CSS property "'.concat(i,'" that exists between the times of "').concat(s.startTime,'ms" and "').concat(s.endTime,'ms" is also being animated in a parallel animation between the times of "').concat(a,'ms" and "').concat(r,'ms"')),u=!1),a=s.startTime),u&&(o[i]={startTime:a,endTime:r}),t.options&&(l=t.errors,c=t.options.params||{},(d=Iy(e[i])).length&&d.forEach(function(e){c.hasOwnProperty(e)||l.push("Unable to resolve the local animation param ".concat(e," in the given list of values"))}))}else t.errors.push('The provided animation property "'.concat(i,'" is not a supported CSS property for animations'));var l,c,d})})}},{key:"visitKeyframes",value:function(e,t){var n=this,i={type:5,styles:[],options:null};if(!t.currentAnimateTimings)return t.errors.push("keyframes() must be placed inside of a call to animate()"),i;var r=0,a=[],o=!1,s=!1,u=0,l=e.steps.map(function(e){var i=n._makeStyleAst(e,t),l=null!=i.offset?i.offset:function(e){if("string"==typeof e)return null;var t=null;if(Array.isArray(e))e.forEach(function(e){if(Qy(e)&&e.hasOwnProperty("offset")){var n=e;t=parseFloat(n.offset),delete n.offset}});else if(Qy(e)&&e.hasOwnProperty("offset")){var n=e;t=parseFloat(n.offset),delete n.offset}return t}(i.styles),c=0;return null!=l&&(r++,c=i.offset=l),s=s||c<0||c>1,o=o||c0&&r0?r==h?1:d*r:a[r],s=o*m;t.currentTime=f+p.delay+s,p.duration=s,n._validateStyleAst(e,t),e.offset=o,i.styles.push(e)}),i}},{key:"visitReference",value:function(e,t){return{type:8,animation:Wy(this,Py(e.animation),t),options:eb(e.options)}}},{key:"visitAnimateChild",value:function(e,t){return t.depCount++,{type:9,options:eb(e.options)}}},{key:"visitAnimateRef",value:function(e,t){return{type:10,animation:this.visitReference(e.animation,t),options:eb(e.options)}}},{key:"visitQuery",value:function(e,t){var n=t.currentQuerySelector,i=e.options||{};t.queryCount++,t.currentQuery=e;var r=_(function(e){var t=!!e.split(/\s*,\s*/).find(function(e){return e==Ky});return t&&(e=e.replace(Jy,"")),[e=e.replace(/@\*/g,wy).replace(/@\w+/g,function(e){return".ng-trigger-"+e.substr(1)}).replace(/:animating/g,My),t]}(e.selector),2),a=r[0],o=r[1];t.currentQuerySelector=n.length?n+" "+a:a,iy(t.collectedStyles,t.currentQuerySelector,{});var s=Wy(this,Py(e.animation),t);return t.currentQuery=null,t.currentQuerySelector=n,{type:11,selector:a,limit:i.limit||0,optional:!!i.optional,includeSelf:o,animation:s,originalSelector:e.selector,options:eb(e.options)}}},{key:"visitStagger",value:function(e,t){t.currentQuery||t.errors.push("stagger() can only be used inside of query()");var n="full"===e.timings?{duration:0,delay:0,easing:"full"}:Ly(e.timings,t.errors,!0);return{type:12,animation:Wy(this,Py(e.animation),t),timings:n,options:null}}}]),e}(),Xy=function e(t){s(this,e),this.errors=t,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null};function Qy(e){return!Array.isArray(e)&&"object"==typeof e}function eb(e){var t;return e?(e=xy(e)).params&&(e.params=(t=e.params)?xy(t):null):e={},e}function tb(e,t,n){return{duration:e,delay:t,easing:n}}function nb(e,t,n,i,r,a){var o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:null,s=arguments.length>7&&void 0!==arguments[7]&&arguments[7];return{type:1,element:e,keyframes:t,preStyleProps:n,postStyleProps:i,duration:r,delay:a,totalTime:r+a,easing:o,subTimeline:s}}var ib=function(){function e(){s(this,e),this._map=new Map}return o(e,[{key:"consume",value:function(e){var t=this._map.get(e);return t?this._map.delete(e):t=[],t}},{key:"append",value:function(e,t){var n,i=this._map.get(e);i||this._map.set(e,i=[]),(n=i).push.apply(n,b(t))}},{key:"has",value:function(e){return this._map.has(e)}},{key:"clear",value:function(){this._map.clear()}}]),e}(),rb=new RegExp(":enter","g"),ab=new RegExp(":leave","g");function ob(e,t,n,i,r){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},s=arguments.length>7?arguments[7]:void 0,u=arguments.length>8?arguments[8]:void 0,l=arguments.length>9&&void 0!==arguments[9]?arguments[9]:[];return(new sb).buildKeyframes(e,t,n,i,r,a,o,s,u,l)}var sb=function(){function e(){s(this,e)}return o(e,[{key:"buildKeyframes",value:function(e,t,n,i,r,a,o,s,u){var l=arguments.length>9&&void 0!==arguments[9]?arguments[9]:[];u=u||new ib;var c=new lb(e,t,u,i,r,l,[]);c.options=s,c.currentTimeline.setStyles([a],null,c.errors,s),Wy(this,n,c);var d=c.timelines.filter(function(e){return e.containsAnimation()});if(d.length&&Object.keys(o).length){var h=d[d.length-1];h.allowOnlyTimelineStyles()||h.setStyles([o],null,c.errors,s)}return d.length?d.map(function(e){return e.buildKeyframes()}):[nb(t,[],[],[],0,0,"",!1)]}},{key:"visitTrigger",value:function(e,t){}},{key:"visitState",value:function(e,t){}},{key:"visitTransition",value:function(e,t){}},{key:"visitAnimateChild",value:function(e,t){var n=t.subInstructions.consume(t.element);if(n){var i=t.createSubContext(e.options),r=t.currentTimeline.currentTime,a=this._visitSubInstructions(n,i,i.options);r!=a&&t.transformIntoNewTimeline(a)}t.previousNode=e}},{key:"visitAnimateRef",value:function(e,t){var n=t.createSubContext(e.options);n.transformIntoNewTimeline(),this.visitReference(e.animation,n),t.transformIntoNewTimeline(n.currentTimeline.currentTime),t.previousNode=e}},{key:"_visitSubInstructions",value:function(e,t,n){var i=t.currentTimeline.currentTime,r=null!=n.duration?Sy(n.duration):null,a=null!=n.delay?Sy(n.delay):null;return 0!==r&&e.forEach(function(e){var n=t.appendInstructionToTimeline(e,r,a);i=Math.max(i,n.duration+n.delay)}),i}},{key:"visitReference",value:function(e,t){t.updateOptions(e.options,!0),Wy(this,e.animation,t),t.previousNode=e}},{key:"visitSequence",value:function(e,t){var n=this,i=t.subContextCount,r=t,a=e.options;if(a&&(a.params||a.delay)&&((r=t.createSubContext(a)).transformIntoNewTimeline(),null!=a.delay)){6==r.previousNode.type&&(r.currentTimeline.snapshotCurrentStyles(),r.previousNode=ub);var o=Sy(a.delay);r.delayNextStep(o)}e.steps.length&&(e.steps.forEach(function(e){return Wy(n,e,r)}),r.currentTimeline.applyStylesToKeyframe(),r.subContextCount>i&&r.transformIntoNewTimeline()),t.previousNode=e}},{key:"visitGroup",value:function(e,t){var n=this,i=[],r=t.currentTimeline.currentTime,a=e.options&&e.options.delay?Sy(e.options.delay):0;e.steps.forEach(function(o){var s=t.createSubContext(e.options);a&&s.delayNextStep(a),Wy(n,o,s),r=Math.max(r,s.currentTimeline.currentTime),i.push(s.currentTimeline)}),i.forEach(function(e){return t.currentTimeline.mergeTimelineCollectedStyles(e)}),t.transformIntoNewTimeline(r),t.previousNode=e}},{key:"_visitTiming",value:function(e,t){if(e.dynamic){var n=e.strValue;return Ly(t.params?Ry(n,t.params,t.errors):n,t.errors)}return{duration:e.duration,delay:e.delay,easing:e.easing}}},{key:"visitAnimate",value:function(e,t){var n=t.currentAnimateTimings=this._visitTiming(e.timings,t),i=t.currentTimeline;n.delay&&(t.incrementTime(n.delay),i.snapshotCurrentStyles());var r=e.style;5==r.type?this.visitKeyframes(r,t):(t.incrementTime(n.duration),this.visitStyle(r,t),i.applyStylesToKeyframe()),t.currentAnimateTimings=null,t.previousNode=e}},{key:"visitStyle",value:function(e,t){var n=t.currentTimeline,i=t.currentAnimateTimings;!i&&n.getCurrentStyleProperties().length&&n.forwardFrame();var r=i&&i.easing||e.easing;e.isEmptyStep?n.applyEmptyStep(r):n.setStyles(e.styles,r,t.errors,t.options),t.previousNode=e}},{key:"visitKeyframes",value:function(e,t){var n=t.currentAnimateTimings,i=t.currentTimeline.duration,r=n.duration,a=t.createSubContext().currentTimeline;a.easing=n.easing,e.styles.forEach(function(e){a.forwardTime((e.offset||0)*r),a.setStyles(e.styles,e.easing,t.errors,t.options),a.applyStylesToKeyframe()}),t.currentTimeline.mergeTimelineCollectedStyles(a),t.transformIntoNewTimeline(i+r),t.previousNode=e}},{key:"visitQuery",value:function(e,t){var n=this,i=t.currentTimeline.currentTime,r=e.options||{},a=r.delay?Sy(r.delay):0;a&&(6===t.previousNode.type||0==i&&t.currentTimeline.getCurrentStyleProperties().length)&&(t.currentTimeline.snapshotCurrentStyles(),t.previousNode=ub);var o=i,s=t.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!r.optional,t.errors);t.currentQueryTotal=s.length;var u=null;s.forEach(function(i,r){t.currentQueryIndex=r;var s=t.createSubContext(e.options,i);a&&s.delayNextStep(a),i===t.element&&(u=s.currentTimeline),Wy(n,e.animation,s),s.currentTimeline.applyStylesToKeyframe(),o=Math.max(o,s.currentTimeline.currentTime)}),t.currentQueryIndex=0,t.currentQueryTotal=0,t.transformIntoNewTimeline(o),u&&(t.currentTimeline.mergeTimelineCollectedStyles(u),t.currentTimeline.snapshotCurrentStyles()),t.previousNode=e}},{key:"visitStagger",value:function(e,t){var n=t.parentContext,i=t.currentTimeline,r=e.timings,a=Math.abs(r.duration),o=a*(t.currentQueryTotal-1),s=a*t.currentQueryIndex;switch(r.duration<0?"reverse":r.easing){case"reverse":s=o-s;break;case"full":s=n.currentStaggerTime}var u=t.currentTimeline;s&&u.delayNextStep(s);var l=u.currentTime;Wy(this,e.animation,t),t.previousNode=e,n.currentStaggerTime=i.currentTime-l+(i.startTime-n.currentTimeline.startTime)}}]),e}(),ub={},lb=function(){function e(t,n,i,r,a,o,u,l){s(this,e),this._driver=t,this.element=n,this.subInstructions=i,this._enterClassName=r,this._leaveClassName=a,this.errors=o,this.timelines=u,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=ub,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=l||new cb(this._driver,n,0),u.push(this.currentTimeline)}return o(e,[{key:"params",get:function(){return this.options.params}},{key:"updateOptions",value:function(e,t){var n=this;if(e){var i=e,r=this.options;null!=i.duration&&(r.duration=Sy(i.duration)),null!=i.delay&&(r.delay=Sy(i.delay));var a=i.params;if(a){var o=r.params;o||(o=this.options.params={}),Object.keys(a).forEach(function(e){t&&o.hasOwnProperty(e)||(o[e]=Ry(a[e],o,n.errors))})}}}},{key:"_copyOptions",value:function(){var e={};if(this.options){var t=this.options.params;if(t){var n=e.params={};Object.keys(t).forEach(function(e){n[e]=t[e]})}}return e}},{key:"createSubContext",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,n=arguments.length>1?arguments[1]:void 0,i=arguments.length>2?arguments[2]:void 0,r=n||this.element,a=new e(this._driver,r,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(r,i||0));return a.previousNode=this.previousNode,a.currentAnimateTimings=this.currentAnimateTimings,a.options=this._copyOptions(),a.updateOptions(t),a.currentQueryIndex=this.currentQueryIndex,a.currentQueryTotal=this.currentQueryTotal,a.parentContext=this,this.subContextCount++,a}},{key:"transformIntoNewTimeline",value:function(e){return this.previousNode=ub,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline}},{key:"appendInstructionToTimeline",value:function(e,t,n){var i={duration:null!=t?t:e.duration,delay:this.currentTimeline.currentTime+(null!=n?n:0)+e.delay,easing:""},r=new db(this._driver,e.element,e.keyframes,e.preStyleProps,e.postStyleProps,i,e.stretchStartingKeyframe);return this.timelines.push(r),i}},{key:"incrementTime",value:function(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)}},{key:"delayNextStep",value:function(e){e>0&&this.currentTimeline.delayNextStep(e)}},{key:"invokeQuery",value:function(e,t,n,i,r,a){var o=[];if(i&&o.push(this.element),e.length>0){e=(e=e.replace(rb,"."+this._enterClassName)).replace(ab,"."+this._leaveClassName);var s=this._driver.query(this.element,e,1!=n);0!==n&&(s=n<0?s.slice(s.length+n,s.length):s.slice(0,n)),o.push.apply(o,b(s))}return r||0!=o.length||a.push('`query("'.concat(t,'")` returned zero elements. (Use `query("').concat(t,'", { optional: true })` if you wish to allow this.)')),o}}]),e}(),cb=function(){function e(t,n,i,r){s(this,e),this._driver=t,this.element=n,this.startTime=i,this._elementTimelineStylesLookup=r,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(n),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(n,this._localTimelineStyles)),this._loadKeyframe()}return o(e,[{key:"containsAnimation",value:function(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}}},{key:"getCurrentStyleProperties",value:function(){return Object.keys(this._currentKeyframe)}},{key:"currentTime",get:function(){return this.startTime+this.duration}},{key:"delayNextStep",value:function(e){var t=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||t?(this.forwardTime(this.currentTime+e),t&&this.snapshotCurrentStyles()):this.startTime+=e}},{key:"fork",value:function(t,n){return this.applyStylesToKeyframe(),new e(this._driver,t,n||this.currentTime,this._elementTimelineStylesLookup)}},{key:"_loadKeyframe",value:function(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))}},{key:"forwardFrame",value:function(){this.duration+=1,this._loadKeyframe()}},{key:"forwardTime",value:function(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()}},{key:"_updateStyle",value:function(e,t){this._localTimelineStyles[e]=t,this._globalTimelineStyles[e]=t,this._styleSummary[e]={time:this.currentTime,value:t}}},{key:"allowOnlyTimelineStyles",value:function(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}},{key:"applyEmptyStep",value:function(e){var t=this;e&&(this._previousKeyframe.easing=e),Object.keys(this._globalTimelineStyles).forEach(function(e){t._backFill[e]=t._globalTimelineStyles[e]||R_,t._currentKeyframe[e]=R_}),this._currentEmptyStepKeyframe=this._currentKeyframe}},{key:"setStyles",value:function(e,t,n,i){var r=this;t&&(this._previousKeyframe.easing=t);var a=i&&i.params||{},o=function(e,t){var n,i={};return e.forEach(function(e){"*"===e?(n=n||Object.keys(t)).forEach(function(e){i[e]=R_}):Ty(e,!1,i)}),i}(e,this._globalTimelineStyles);Object.keys(o).forEach(function(e){var t=Ry(o[e],a,n);r._pendingStyles[e]=t,r._localTimelineStyles.hasOwnProperty(e)||(r._backFill[e]=r._globalTimelineStyles.hasOwnProperty(e)?r._globalTimelineStyles[e]:R_),r._updateStyle(e,t)})}},{key:"applyStylesToKeyframe",value:function(){var e=this,t=this._pendingStyles,n=Object.keys(t);0!=n.length&&(this._pendingStyles={},n.forEach(function(n){e._currentKeyframe[n]=t[n]}),Object.keys(this._localTimelineStyles).forEach(function(t){e._currentKeyframe.hasOwnProperty(t)||(e._currentKeyframe[t]=e._localTimelineStyles[t])}))}},{key:"snapshotCurrentStyles",value:function(){var e=this;Object.keys(this._localTimelineStyles).forEach(function(t){var n=e._localTimelineStyles[t];e._pendingStyles[t]=n,e._updateStyle(t,n)})}},{key:"getFinalKeyframe",value:function(){return this._keyframes.get(this.duration)}},{key:"properties",get:function(){var e=[];for(var t in this._currentKeyframe)e.push(t);return e}},{key:"mergeTimelineCollectedStyles",value:function(e){var t=this;Object.keys(e._styleSummary).forEach(function(n){var i=t._styleSummary[n],r=e._styleSummary[n];(!i||r.time>i.time)&&t._updateStyle(n,r.value)})}},{key:"buildKeyframes",value:function(){var e=this;this.applyStylesToKeyframe();var t=new Set,n=new Set,i=1===this._keyframes.size&&0===this.duration,r=[];this._keyframes.forEach(function(a,o){var s=Ty(a,!0);Object.keys(s).forEach(function(e){var i=s[e];i==J_?t.add(e):i==R_&&n.add(e)}),i||(s.offset=o/e.duration),r.push(s)});var a=t.size?Fy(t.values()):[],o=n.size?Fy(n.values()):[];if(i){var s=r[0],u=xy(s);s.offset=0,u.offset=1,r=[s,u]}return nb(this.element,r,a,o,this.duration,this.startTime,this.easing,!1)}}]),e}(),db=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o,u){var l,c=arguments.length>6&&void 0!==arguments[6]&&arguments[6];return s(this,n),(l=t.call(this,e,i,u.delay)).keyframes=r,l.preStyleProps=a,l.postStyleProps=o,l._stretchStartingKeyframe=c,l.timings={duration:u.duration,delay:u.delay,easing:u.easing},l}return o(n,[{key:"containsAnimation",value:function(){return this.keyframes.length>1}},{key:"buildKeyframes",value:function(){var e=this.keyframes,t=this.timings,n=t.delay,i=t.duration,r=t.easing;if(this._stretchStartingKeyframe&&n){var a=[],o=i+n,s=n/o,u=Ty(e[0],!1);u.offset=0,a.push(u);var l=Ty(e[0],!1);l.offset=hb(s),a.push(l);for(var c=e.length-1,d=1;d<=c;d++){var h=Ty(e[d],!1);h.offset=hb((n+h.offset*i)/o),a.push(h)}i=o,n=0,r="",e=a}return nb(this.element,e,this.preStyleProps,this.postStyleProps,i,n,r,!0)}}]),n}(cb);function hb(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=Math.pow(10,t-1);return Math.round(e*n)/n}var fb=function e(){s(this,e)},pb=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"normalizePropertyName",value:function(e,t){return jy(e)}},{key:"normalizeStyleValue",value:function(e,t,n,i){var r="",a=n.toString().trim();if(mb[t]&&0!==n&&"0"!==n)if("number"==typeof n)r="px";else{var o=n.match(/^[+-]?[\d\.]+([a-z]*)$/);o&&0==o[1].length&&i.push("Please provide a CSS unit value for ".concat(e,":").concat(n))}return a+r}}]),n}(fb),mb=function(){return function(e){var t={};return e.forEach(function(e){return t[e]=!0}),t}("width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(","))}();function gb(e,t,n,i,r,a,o,s,u,l,c,d,h){return{type:0,element:e,triggerName:t,isRemovalTransition:r,fromState:n,fromStyles:a,toState:i,toStyles:o,timelines:s,queriedElements:u,preStyleProps:l,postStyleProps:c,totalTime:d,errors:h}}var vb={},_b=function(){function e(t,n,i){s(this,e),this._triggerName=t,this.ast=n,this._stateStyles=i}return o(e,[{key:"match",value:function(e,t,n,i){return function(e,t,n,i,r){return e.some(function(e){return e(t,n,i,r)})}(this.ast.matchers,e,t,n,i)}},{key:"buildStyles",value:function(e,t,n){var i=this._stateStyles["*"],r=this._stateStyles[e],a=i?i.buildStyles(t,n):{};return r?r.buildStyles(t,n):a}},{key:"build",value:function(e,t,n,i,r,a,o,s,u,l){var c=[],d=this.ast.options&&this.ast.options.params||vb,h=this.buildStyles(n,o&&o.params||vb,c),f=s&&s.params||vb,p=this.buildStyles(i,f,c),m=new Set,g=new Map,v=new Map,_="void"===i,y={params:Object.assign(Object.assign({},d),f)},b=l?[]:ob(e,t,this.ast.animation,r,a,h,p,y,u,c),w=0;if(b.forEach(function(e){w=Math.max(e.duration+e.delay,w)}),c.length)return gb(t,this._triggerName,n,i,_,h,p,[],[],g,v,w,c);b.forEach(function(e){var n=e.element,i=iy(g,n,{});e.preStyleProps.forEach(function(e){return i[e]=!0});var r=iy(v,n,{});e.postStyleProps.forEach(function(e){return r[e]=!0}),n!==t&&m.add(n)});var k=Fy(m.values());return gb(t,this._triggerName,n,i,_,h,p,b,k,g,v,w)}}]),e}(),yb=function(){function e(t,n,i){s(this,e),this.styles=t,this.defaultParams=n,this.normalizer=i}return o(e,[{key:"buildStyles",value:function(e,t){var n=this,i={},r=xy(this.defaultParams);return Object.keys(e).forEach(function(t){var n=e[t];null!=n&&(r[t]=n)}),this.styles.styles.forEach(function(e){if("string"!=typeof e){var a=e;Object.keys(a).forEach(function(e){var o=a[e];o.length>1&&(o=Ry(o,r,t));var s=n.normalizer.normalizePropertyName(e,t);o=n.normalizer.normalizeStyleValue(e,s,o,t),i[s]=o})}}),i}}]),e}(),bb=function(){function e(t,n,i){var r=this;s(this,e),this.name=t,this.ast=n,this._normalizer=i,this.transitionFactories=[],this.states={},n.states.forEach(function(e){r.states[e.name]=new yb(e.style,e.options&&e.options.params||{},i)}),wb(this.states,"true","1"),wb(this.states,"false","0"),n.transitions.forEach(function(e){r.transitionFactories.push(new _b(t,e,r.states))}),this.fallbackTransition=new _b(t,{type:1,animation:{type:2,steps:[],options:null},matchers:[function(e,t){return!0}],options:null,queryCount:0,depCount:0},this.states)}return o(e,[{key:"containsQueries",get:function(){return this.ast.queryCount>0}},{key:"matchTransition",value:function(e,t,n,i){return this.transitionFactories.find(function(r){return r.match(e,t,n,i)})||null}},{key:"matchStyles",value:function(e,t,n){return this.fallbackTransition.buildStyles(e,t,n)}}]),e}();function wb(e,t,n){e.hasOwnProperty(t)?e.hasOwnProperty(n)||(e[n]=e[t]):e.hasOwnProperty(n)&&(e[t]=e[n])}var kb=new ib,Mb=function(){function e(t,n,i){s(this,e),this.bodyNode=t,this._driver=n,this._normalizer=i,this._animations={},this._playersById={},this.players=[]}return o(e,[{key:"register",value:function(e,t){var n=[],i=Zy(this._driver,t,n);if(n.length)throw new Error("Unable to build the animation due to the following errors: ".concat(n.join("\n")));this._animations[e]=i}},{key:"_buildPlayer",value:function(e,t,n){var i=e.element,r=Q_(this._driver,this._normalizer,i,e.keyframes,t,n);return this._driver.animate(i,r,e.duration,e.delay,e.easing,[],!0)}},{key:"create",value:function(e,t){var n,i=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=[],o=this._animations[e],s=new Map;if(o?(n=ob(this._driver,t,o,_y,yy,{},{},r,kb,a)).forEach(function(e){var t=iy(s,e.element,{});e.postStyleProps.forEach(function(e){return t[e]=null})}):(a.push("The requested animation doesn't exist or has already been destroyed"),n=[]),a.length)throw new Error("Unable to create the animation due to the following errors: ".concat(a.join("\n")));s.forEach(function(e,t){Object.keys(e).forEach(function(n){e[n]=i._driver.computeStyle(t,n,R_)})});var u=n.map(function(e){var t=s.get(e.element);return i._buildPlayer(e,{},t)}),l=X_(u);return this._playersById[e]=l,l.onDestroy(function(){return i.destroy(e)}),this.players.push(l),l}},{key:"destroy",value:function(e){var t=this._getPlayer(e);t.destroy(),delete this._playersById[e];var n=this.players.indexOf(t);n>=0&&this.players.splice(n,1)}},{key:"_getPlayer",value:function(e){var t=this._playersById[e];if(!t)throw new Error("Unable to find the timeline player referenced by ".concat(e));return t}},{key:"listen",value:function(e,t,n,i){var r=ny(t,"","","");return ey(this._getPlayer(e),n,r,i),function(){}}},{key:"command",value:function(e,t,n,i){if("register"!=n)if("create"!=n){var r=this._getPlayer(e);switch(n){case"play":r.play();break;case"pause":r.pause();break;case"reset":r.reset();break;case"restart":r.restart();break;case"finish":r.finish();break;case"init":r.init();break;case"setPosition":r.setPosition(parseFloat(i[0]));break;case"destroy":this.destroy(e)}}else this.create(e,t,i[0]||{});else this.register(e,i[0])}}]),e}(),Sb="ng-animate-queued",Cb="ng-animate-disabled",Lb=".ng-animate-disabled",xb="ng-star-inserted",Tb=[],Db={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},Ob={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},Eb=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";s(this,e),this.namespaceId=n;var i=t&&t.hasOwnProperty("value"),r=i?t.value:t;if(this.value=Fb(r),i){var a=xy(t);delete a.value,this.options=a}else this.options={};this.options.params||(this.options.params={})}return o(e,[{key:"params",get:function(){return this.options.params}},{key:"absorbOptions",value:function(e){var t=e.params;if(t){var n=this.options.params;Object.keys(t).forEach(function(e){null==n[e]&&(n[e]=t[e])})}}}]),e}(),Yb="void",Pb=new Eb(Yb),Ab=function(){function e(t,n,i){s(this,e),this.id=t,this.hostElement=n,this._engine=i,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+t,Wb(n,this._hostClassName)}return o(e,[{key:"listen",value:function(e,t,n,i){var r,a=this;if(!this._triggers.hasOwnProperty(t))throw new Error('Unable to listen on the animation trigger event "'.concat(n,'" because the animation trigger "').concat(t,"\" doesn't exist!"));if(null==n||0==n.length)throw new Error('Unable to listen on the animation trigger "'.concat(t,'" because the provided event is undefined!'));if("start"!=(r=n)&&"done"!=r)throw new Error('The provided animation trigger event "'.concat(n,'" for the animation trigger "').concat(t,'" is not supported!'));var o=iy(this._elementListeners,e,[]),s={name:t,phase:n,callback:i};o.push(s);var u=iy(this._engine.statesByElement,e,{});return u.hasOwnProperty(t)||(Wb(e,by),Wb(e,"ng-trigger-"+t),u[t]=Pb),function(){a._engine.afterFlush(function(){var e=o.indexOf(s);e>=0&&o.splice(e,1),a._triggers[t]||delete u[t]})}}},{key:"register",value:function(e,t){return!this._triggers[e]&&(this._triggers[e]=t,!0)}},{key:"_getTrigger",value:function(e){var t=this._triggers[e];if(!t)throw new Error('The provided animation trigger "'.concat(e,'" has not been registered!'));return t}},{key:"trigger",value:function(e,t,n){var i=this,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=this._getTrigger(t),o=new Rb(this.id,t,e),s=this._engine.statesByElement.get(e);s||(Wb(e,by),Wb(e,"ng-trigger-"+t),this._engine.statesByElement.set(e,s={}));var u=s[t],l=new Eb(n,this.id),c=n&&n.hasOwnProperty("value");!c&&u&&l.absorbOptions(u.options),s[t]=l,u||(u=Pb);var d=l.value===Yb;if(d||u.value!==l.value){var h=iy(this._engine.playersByElement,e,[]);h.forEach(function(e){e.namespaceId==i.id&&e.triggerName==t&&e.queued&&e.destroy()});var f=a.matchTransition(u.value,l.value,e,l.params),p=!1;if(!f){if(!r)return;f=a.fallbackTransition,p=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:t,transition:f,fromState:u,toState:l,player:o,isFallbackTransition:p}),p||(Wb(e,Sb),o.onStart(function(){Vb(e,Sb)})),o.onDone(function(){var t=i.players.indexOf(o);t>=0&&i.players.splice(t,1);var n=i._engine.playersByElement.get(e);if(n){var r=n.indexOf(o);r>=0&&n.splice(r,1)}}),this.players.push(o),h.push(o),o}if(!qb(u.params,l.params)){var m=[],g=a.matchStyles(u.value,u.params,m),v=a.matchStyles(l.value,l.params,m);m.length?this._engine.reportError(m):this._engine.afterFlush(function(){Yy(e,g),Ey(e,v)})}}},{key:"deregister",value:function(e){var t=this;delete this._triggers[e],this._engine.statesByElement.forEach(function(t,n){delete t[e]}),this._elementListeners.forEach(function(n,i){t._elementListeners.set(i,n.filter(function(t){return t.name!=e}))})}},{key:"clearElementCache",value:function(e){this._engine.statesByElement.delete(e),this._elementListeners.delete(e);var t=this._engine.playersByElement.get(e);t&&(t.forEach(function(e){return e.destroy()}),this._engine.playersByElement.delete(e))}},{key:"_signalRemovalForInnerTriggers",value:function(e,t){var n=this,i=this._engine.driver.query(e,wy,!0);i.forEach(function(e){if(!e.__ng_removed){var i=n._engine.fetchNamespacesByElement(e);i.size?i.forEach(function(n){return n.triggerLeaveAnimation(e,t,!1,!0)}):n.clearElementCache(e)}}),this._engine.afterFlushAnimationsDone(function(){return i.forEach(function(e){return n.clearElementCache(e)})})}},{key:"triggerLeaveAnimation",value:function(e,t,n,i){var r=this,a=this._engine.statesByElement.get(e);if(a){var o=[];if(Object.keys(a).forEach(function(t){if(r._triggers[t]){var n=r.trigger(e,t,Yb,i);n&&o.push(n)}}),o.length)return this._engine.markElementAsRemoved(this.id,e,!0,t),n&&X_(o).onDone(function(){return r._engine.processLeaveNode(e)}),!0}return!1}},{key:"prepareLeaveAnimationListeners",value:function(e){var t=this,n=this._elementListeners.get(e),i=this._engine.statesByElement.get(e);if(n&&i){var r=new Set;n.forEach(function(n){var a=n.name;if(!r.has(a)){r.add(a);var o=t._triggers[a].fallbackTransition,s=i[a]||Pb,u=new Eb(Yb),l=new Rb(t.id,a,e);t._engine.totalQueuedPlayers++,t._queue.push({element:e,triggerName:a,transition:o,fromState:s,toState:u,player:l,isFallbackTransition:!0})}})}}},{key:"removeNode",value:function(e,t){var n=this,i=this._engine;if(e.childElementCount&&this._signalRemovalForInnerTriggers(e,t),!this.triggerLeaveAnimation(e,t,!0)){var r=!1;if(i.totalAnimations){var a=i.players.length?i.playersByQueriedElement.get(e):[];if(a&&a.length)r=!0;else for(var o=e;o=o.parentNode;)if(i.statesByElement.get(o)){r=!0;break}}if(this.prepareLeaveAnimationListeners(e),r)i.markElementAsRemoved(this.id,e,!1,t);else{var s=e.__ng_removed;s&&s!==Db||(i.afterFlush(function(){return n.clearElementCache(e)}),i.destroyInnerAnimations(e),i._onRemovalComplete(e,t))}}}},{key:"insertNode",value:function(e,t){Wb(e,this._hostClassName)}},{key:"drainQueuedTransitions",value:function(e){var t=this,n=[];return this._queue.forEach(function(i){var r=i.player;if(!r.destroyed){var a=i.element,o=t._elementListeners.get(a);o&&o.forEach(function(t){if(t.name==i.triggerName){var n=ny(a,i.triggerName,i.fromState.value,i.toState.value);n._data=e,ey(i.player,t.phase,n,t.callback)}}),r.markedForDestroy?t._engine.afterFlush(function(){r.destroy()}):n.push(i)}}),this._queue=[],n.sort(function(e,n){var i=e.transition.ast.depCount,r=n.transition.ast.depCount;return 0==i||0==r?i-r:t._engine.driver.containsElement(e.element,n.element)?1:-1})}},{key:"destroy",value:function(e){this.players.forEach(function(e){return e.destroy()}),this._signalRemovalForInnerTriggers(this.hostElement,e)}},{key:"elementContainsData",value:function(e){var t=!1;return this._elementListeners.has(e)&&(t=!0),!!this._queue.find(function(t){return t.element===e})||t}}]),e}(),Ib=function(){function e(t,n,i){s(this,e),this.bodyNode=t,this.driver=n,this._normalizer=i,this.players=[],this.newHostElements=new Map,this.playersByElement=new Map,this.playersByQueriedElement=new Map,this.statesByElement=new Map,this.disabledNodes=new Set,this.totalAnimations=0,this.totalQueuedPlayers=0,this._namespaceLookup={},this._namespaceList=[],this._flushFns=[],this._whenQuietFns=[],this.namespacesByHostElement=new Map,this.collectedEnterElements=[],this.collectedLeaveElements=[],this.onRemovalComplete=function(e,t){}}return o(e,[{key:"_onRemovalComplete",value:function(e,t){this.onRemovalComplete(e,t)}},{key:"queuedPlayers",get:function(){var e=[];return this._namespaceList.forEach(function(t){t.players.forEach(function(t){t.queued&&e.push(t)})}),e}},{key:"createNamespace",value:function(e,t){var n=new Ab(e,t,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,t)?this._balanceNamespaceList(n,t):(this.newHostElements.set(t,n),this.collectEnterElement(t)),this._namespaceLookup[e]=n}},{key:"_balanceNamespaceList",value:function(e,t){var n=this._namespaceList.length-1;if(n>=0){for(var i=!1,r=n;r>=0;r--)if(this.driver.containsElement(this._namespaceList[r].hostElement,t)){this._namespaceList.splice(r+1,0,e),i=!0;break}i||this._namespaceList.splice(0,0,e)}else this._namespaceList.push(e);return this.namespacesByHostElement.set(t,e),e}},{key:"register",value:function(e,t){var n=this._namespaceLookup[e];return n||(n=this.createNamespace(e,t)),n}},{key:"registerTrigger",value:function(e,t,n){var i=this._namespaceLookup[e];i&&i.register(t,n)&&this.totalAnimations++}},{key:"destroy",value:function(e,t){var n=this;if(e){var i=this._fetchNamespace(e);this.afterFlush(function(){n.namespacesByHostElement.delete(i.hostElement),delete n._namespaceLookup[e];var t=n._namespaceList.indexOf(i);t>=0&&n._namespaceList.splice(t,1)}),this.afterFlushAnimationsDone(function(){return i.destroy(t)})}}},{key:"_fetchNamespace",value:function(e){return this._namespaceLookup[e]}},{key:"fetchNamespacesByElement",value:function(e){var t=new Set,n=this.statesByElement.get(e);if(n)for(var i=Object.keys(n),r=0;r=0&&this.collectedLeaveElements.splice(a,1)}if(e){var o=this._fetchNamespace(e);o&&o.insertNode(t,n)}i&&this.collectEnterElement(t)}}},{key:"collectEnterElement",value:function(e){this.collectedEnterElements.push(e)}},{key:"markElementAsDisabled",value:function(e,t){t?this.disabledNodes.has(e)||(this.disabledNodes.add(e),Wb(e,Cb)):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),Vb(e,Cb))}},{key:"removeNode",value:function(e,t,n,i){if(Hb(t)){var r=e?this._fetchNamespace(e):null;if(r?r.removeNode(t,i):this.markElementAsRemoved(e,t,!1,i),n){var a=this.namespacesByHostElement.get(t);a&&a.id!==e&&a.removeNode(t,i)}}else this._onRemovalComplete(t,i)}},{key:"markElementAsRemoved",value:function(e,t,n,i){this.collectedLeaveElements.push(t),t.__ng_removed={namespaceId:e,setForRemoval:i,hasAnimation:n,removedBeforeQueried:!1}}},{key:"listen",value:function(e,t,n,i,r){return Hb(t)?this._fetchNamespace(e).listen(t,n,i,r):function(){}}},{key:"_buildInstruction",value:function(e,t,n,i,r){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,n,i,e.fromState.options,e.toState.options,t,r)}},{key:"destroyInnerAnimations",value:function(e){var t=this,n=this.driver.query(e,wy,!0);n.forEach(function(e){return t.destroyActiveAnimationsForElement(e)}),0!=this.playersByQueriedElement.size&&(n=this.driver.query(e,My,!0)).forEach(function(e){return t.finishActiveQueriedAnimationOnElement(e)})}},{key:"destroyActiveAnimationsForElement",value:function(e){var t=this.playersByElement.get(e);t&&t.forEach(function(e){e.queued?e.markedForDestroy=!0:e.destroy()})}},{key:"finishActiveQueriedAnimationOnElement",value:function(e){var t=this.playersByQueriedElement.get(e);t&&t.forEach(function(e){return e.finish()})}},{key:"whenRenderingDone",value:function(){var e=this;return new Promise(function(t){if(e.players.length)return X_(e.players).onDone(function(){return t()});t()})}},{key:"processLeaveNode",value:function(e){var t=this,n=e.__ng_removed;if(n&&n.setForRemoval){if(e.__ng_removed=Db,n.namespaceId){this.destroyInnerAnimations(e);var i=this._fetchNamespace(n.namespaceId);i&&i.clearElementCache(e)}this._onRemovalComplete(e,n.setForRemoval)}this.driver.matchesElement(e,Lb)&&this.markElementAsDisabled(e,!1),this.driver.query(e,Lb,!0).forEach(function(e){t.markElementAsDisabled(e,!1)})}},{key:"flush",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1,n=[];if(this.newHostElements.size&&(this.newHostElements.forEach(function(t,n){return e._balanceNamespaceList(t,n)}),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(var i=0;i=0;x--)this._namespaceList[x].drainQueuedTransitions(t).forEach(function(e){var t=e.player,a=e.element;if(C.push(t),n.collectedEnterElements.length){var c=a.__ng_removed;if(c&&c.setForMove)return void t.destroy()}var h=!d||!n.driver.containsElement(d,a),f=M.get(a),m=p.get(a),g=n._buildInstruction(e,i,m,f,h);if(g.errors&&g.errors.length)L.push(g);else{if(h)return t.onStart(function(){return Yy(a,g.fromStyles)}),t.onDestroy(function(){return Ey(a,g.toStyles)}),void r.push(t);if(e.isFallbackTransition)return t.onStart(function(){return Yy(a,g.fromStyles)}),t.onDestroy(function(){return Ey(a,g.toStyles)}),void r.push(t);g.timelines.forEach(function(e){return e.stretchStartingKeyframe=!0}),i.append(a,g.timelines),o.push({instruction:g,player:t,element:a}),g.queriedElements.forEach(function(e){return iy(s,e,[]).push(t)}),g.preStyleProps.forEach(function(e,t){var n=Object.keys(e);if(n.length){var i=u.get(t);i||u.set(t,i=new Set),n.forEach(function(e){return i.add(e)})}}),g.postStyleProps.forEach(function(e,t){var n=Object.keys(e),i=l.get(t);i||l.set(t,i=new Set),n.forEach(function(e){return i.add(e)})})}});if(L.length){var T=[];L.forEach(function(e){T.push("@".concat(e.triggerName," has failed due to:\n")),e.errors.forEach(function(e){return T.push("- ".concat(e,"\n"))})}),C.forEach(function(e){return e.destroy()}),this.reportError(T)}var D=new Map,O=new Map;o.forEach(function(e){var t=e.element;i.has(t)&&(O.set(t,t),n._beforeAnimationBuild(e.player.namespaceId,e.instruction,D))}),r.forEach(function(e){var t=e.element;n._getPreviousPlayers(t,!1,e.namespaceId,e.triggerName,null).forEach(function(e){iy(D,t,[]).push(e),e.destroy()})});var E=g.filter(function(e){return Gb(e,u,l)}),Y=new Map;Nb(Y,this.driver,_,l,R_).forEach(function(e){Gb(e,u,l)&&E.push(e)});var P=new Map;f.forEach(function(e,t){Nb(P,n.driver,new Set(e),u,J_)}),E.forEach(function(e){var t=Y.get(e),n=P.get(e);Y.set(e,Object.assign(Object.assign({},t),n))});var A=[],I=[],R={};o.forEach(function(e){var t=e.element,o=e.player,s=e.instruction;if(i.has(t)){if(c.has(t))return o.onDestroy(function(){return Ey(t,s.toStyles)}),o.disabled=!0,o.overrideTotalTime(s.totalTime),void r.push(o);var u=R;if(O.size>1){for(var l=t,d=[];l=l.parentNode;){var h=O.get(l);if(h){u=h;break}d.push(l)}d.forEach(function(e){return O.set(e,u)})}var f=n._buildAnimation(o.namespaceId,s,D,a,P,Y);if(o.setRealPlayer(f),u===R)A.push(o);else{var p=n.playersByElement.get(u);p&&p.length&&(o.parentPlayer=X_(p)),r.push(o)}}else Yy(t,s.fromStyles),o.onDestroy(function(){return Ey(t,s.toStyles)}),I.push(o),c.has(t)&&r.push(o)}),I.forEach(function(e){var t=a.get(e.element);if(t&&t.length){var n=X_(t);e.setRealPlayer(n)}}),r.forEach(function(e){e.parentPlayer?e.syncPlayerEvents(e.parentPlayer):e.destroy()});for(var F=0;F0?this.driver.animate(e.element,t,e.duration,e.delay,e.easing,n):new G_(e.duration,e.delay)}}]),e}(),Rb=function(){function e(t,n,i){s(this,e),this.namespaceId=t,this.triggerName=n,this.element=i,this._player=new G_,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1,this.disabled=!1,this.queued=!0,this.totalTime=0}return o(e,[{key:"setRealPlayer",value:function(e){var t=this;this._containsRealPlayer||(this._player=e,Object.keys(this._queuedCallbacks).forEach(function(n){t._queuedCallbacks[n].forEach(function(t){return ey(e,n,void 0,t)})}),this._queuedCallbacks={},this._containsRealPlayer=!0,this.overrideTotalTime(e.totalTime),this.queued=!1)}},{key:"getRealPlayer",value:function(){return this._player}},{key:"overrideTotalTime",value:function(e){this.totalTime=e}},{key:"syncPlayerEvents",value:function(e){var t=this,n=this._player;n.triggerCallback&&e.onStart(function(){return n.triggerCallback("start")}),e.onDone(function(){return t.finish()}),e.onDestroy(function(){return t.destroy()})}},{key:"_queueEvent",value:function(e,t){iy(this._queuedCallbacks,e,[]).push(t)}},{key:"onDone",value:function(e){this.queued&&this._queueEvent("done",e),this._player.onDone(e)}},{key:"onStart",value:function(e){this.queued&&this._queueEvent("start",e),this._player.onStart(e)}},{key:"onDestroy",value:function(e){this.queued&&this._queueEvent("destroy",e),this._player.onDestroy(e)}},{key:"init",value:function(){this._player.init()}},{key:"hasStarted",value:function(){return!this.queued&&this._player.hasStarted()}},{key:"play",value:function(){!this.queued&&this._player.play()}},{key:"pause",value:function(){!this.queued&&this._player.pause()}},{key:"restart",value:function(){!this.queued&&this._player.restart()}},{key:"finish",value:function(){this._player.finish()}},{key:"destroy",value:function(){this.destroyed=!0,this._player.destroy()}},{key:"reset",value:function(){!this.queued&&this._player.reset()}},{key:"setPosition",value:function(e){this.queued||this._player.setPosition(e)}},{key:"getPosition",value:function(){return this.queued?0:this._player.getPosition()}},{key:"triggerCallback",value:function(e){var t=this._player;t.triggerCallback&&t.triggerCallback(e)}}]),e}();function Fb(e){return null!=e?e:null}function Hb(e){return e&&1===e.nodeType}function jb(e,t){var n=e.style.display;return e.style.display=null!=t?t:"none",n}function Nb(e,t,n,i,r){var a=[];n.forEach(function(e){return a.push(jb(e))});var o=[];i.forEach(function(n,i){var a={};n.forEach(function(e){var n=a[e]=t.computeStyle(i,e,r);n&&0!=n.length||(i.__ng_removed=Ob,o.push(i))}),e.set(i,a)});var s=0;return n.forEach(function(e){return jb(e,a[s++])}),o}function Bb(e,t){var n=new Map;if(e.forEach(function(e){return n.set(e,[])}),0==t.length)return n;var i=new Set(t),r=new Map;function a(e){if(!e)return 1;var t=r.get(e);if(t)return t;var o=e.parentNode;return t=n.has(o)?o:i.has(o)?1:a(o),r.set(e,t),t}return t.forEach(function(e){var t=a(e);1!==t&&n.get(t).push(e)}),n}function Wb(e,t){if(e.classList)e.classList.add(t);else{var n=e.$$classes;n||(n=e.$$classes={}),n[t]=!0}}function Vb(e,t){if(e.classList)e.classList.remove(t);else{var n=e.$$classes;n&&delete n[t]}}function Ub(e,t,n){X_(n).onDone(function(){return e.processLeaveNode(t)})}function zb(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:-1;this._transitionEngine.flush(e)}},{key:"players",get:function(){return this._transitionEngine.players.concat(this._timelineEngine.players)}},{key:"whenRenderingDone",value:function(){return this._transitionEngine.whenRenderingDone()}}]),e}();function Jb(e,t){var n=null,i=null;return Array.isArray(t)&&t.length?(n=$b(t[0]),t.length>1&&(i=$b(t[t.length-1]))):t&&(n=$b(t)),n||i?new Zb(e,n,i):null}var Zb=function(){var e=function(){function e(t,n,i){s(this,e),this._element=t,this._startStyles=n,this._endStyles=i,this._state=0;var r=e.initialStylesByElement.get(t);r||e.initialStylesByElement.set(t,r={}),this._initialStyles=r}return o(e,[{key:"start",value:function(){this._state<1&&(this._startStyles&&Ey(this._element,this._startStyles,this._initialStyles),this._state=1)}},{key:"finish",value:function(){this.start(),this._state<2&&(Ey(this._element,this._initialStyles),this._endStyles&&(Ey(this._element,this._endStyles),this._endStyles=null),this._state=1)}},{key:"destroy",value:function(){this.finish(),this._state<3&&(e.initialStylesByElement.delete(this._element),this._startStyles&&(Yy(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(Yy(this._element,this._endStyles),this._endStyles=null),Ey(this._element,this._initialStyles),this._state=3)}}]),e}();return e.initialStylesByElement=new WeakMap,e}();function $b(e){for(var t=null,n=Object.keys(e),i=0;i=this._delay&&n>=this._duration&&this.finish()}},{key:"finish",value:function(){this._finished||(this._finished=!0,this._onDoneFn(),aw(this._element,this._eventFn,!0))}},{key:"destroy",value:function(){var e,t,n,i;this._destroyed||(this._destroyed=!0,this.finish(),t=this._name,(i=rw(n=sw(e=this._element,"").split(","),t))>=0&&(n.splice(i,1),ow(e,"",n.join(","))))}}]),e}();function nw(e,t,n){ow(e,"PlayState",n,iw(e,t))}function iw(e,t){var n=sw(e,"");return n.indexOf(",")>0?rw(n.split(","),t):rw([n],t)}function rw(e,t){for(var n=0;n=0)return n;return-1}function aw(e,t,n){n?e.removeEventListener(ew,t):e.addEventListener(ew,t)}function ow(e,t,n,i){var r=Qb+t;if(null!=i){var a=e.style[r];if(a.length){var o=a.split(",");o[i]=n,n=o.join(",")}}e.style[r]=n}function sw(e,t){return e.style[Qb+t]||""}var uw=function(){function e(t,n,i,r,a,o,u,l){s(this,e),this.element=t,this.keyframes=n,this.animationName=i,this._duration=r,this._delay=a,this._finalStyles=u,this._specialStyles=l,this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this.currentSnapshot={},this._state=0,this.easing=o||"linear",this.totalTime=r+a,this._buildStyler()}return o(e,[{key:"onStart",value:function(e){this._onStartFns.push(e)}},{key:"onDone",value:function(e){this._onDoneFns.push(e)}},{key:"onDestroy",value:function(e){this._onDestroyFns.push(e)}},{key:"destroy",value:function(){this.init(),this._state>=4||(this._state=4,this._styler.destroy(),this._flushStartFns(),this._flushDoneFns(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])}},{key:"_flushDoneFns",value:function(){this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[]}},{key:"_flushStartFns",value:function(){this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[]}},{key:"finish",value:function(){this.init(),this._state>=3||(this._state=3,this._styler.finish(),this._flushStartFns(),this._specialStyles&&this._specialStyles.finish(),this._flushDoneFns())}},{key:"setPosition",value:function(e){this._styler.setPosition(e)}},{key:"getPosition",value:function(){return this._styler.getPosition()}},{key:"hasStarted",value:function(){return this._state>=2}},{key:"init",value:function(){this._state>=1||(this._state=1,this._styler.apply(),this._delay&&this._styler.pause())}},{key:"play",value:function(){this.init(),this.hasStarted()||(this._flushStartFns(),this._state=2,this._specialStyles&&this._specialStyles.start()),this._styler.resume()}},{key:"pause",value:function(){this.init(),this._styler.pause()}},{key:"restart",value:function(){this.reset(),this.play()}},{key:"reset",value:function(){this._state=0,this._styler.destroy(),this._buildStyler(),this._styler.apply()}},{key:"_buildStyler",value:function(){var e=this;this._styler=new tw(this.element,this.animationName,this._duration,this._delay,this.easing,"forwards",function(){return e.finish()})}},{key:"triggerCallback",value:function(e){var t="start"==e?this._onStartFns:this._onDoneFns;t.forEach(function(e){return e()}),t.length=0}},{key:"beforeDestroy",value:function(){var e=this;this.init();var t={};if(this.hasStarted()){var n=this._state>=3;Object.keys(this._finalStyles).forEach(function(i){"offset"!=i&&(t[i]=n?e._finalStyles[i]:Vy(e.element,i))})}this.currentSnapshot=t}}]),e}(),lw=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this)).element=e,r._startingStyles={},r.__initialized=!1,r._styles=my(i),r}return o(n,[{key:"init",value:function(){var e=this;!this.__initialized&&this._startingStyles&&(this.__initialized=!0,Object.keys(this._styles).forEach(function(t){e._startingStyles[t]=e.element.style[t]}),r(i(n.prototype),"init",this).call(this))}},{key:"play",value:function(){var e=this;this._startingStyles&&(this.init(),Object.keys(this._styles).forEach(function(t){return e.element.style.setProperty(t,e._styles[t])}),r(i(n.prototype),"play",this).call(this))}},{key:"destroy",value:function(){var e=this;this._startingStyles&&(Object.keys(this._startingStyles).forEach(function(t){var n=e._startingStyles[t];n?e.element.style.setProperty(t,n):e.element.style.removeProperty(t)}),this._startingStyles=null,r(i(n.prototype),"destroy",this).call(this))}}]),n}(G_),cw="gen_css_kf_",dw=function(){function e(){s(this,e),this._count=0}return o(e,[{key:"validateStyleProperty",value:function(e){return dy(e)}},{key:"matchesElement",value:function(e,t){return hy(e,t)}},{key:"containsElement",value:function(e,t){return fy(e,t)}},{key:"query",value:function(e,t,n){return py(e,t,n)}},{key:"computeStyle",value:function(e,t,n){return window.getComputedStyle(e)[t]}},{key:"buildKeyframeElement",value:function(e,t,n){n=n.map(function(e){return my(e)});var i="@keyframes ".concat(t," {\n"),r="";n.forEach(function(e){r=" ";var t=parseFloat(e.offset);i+="".concat(r).concat(100*t,"% {\n"),r+=" ",Object.keys(e).forEach(function(t){var n=e[t];switch(t){case"offset":return;case"easing":return void(n&&(i+="".concat(r,"animation-timing-function: ").concat(n,";\n")));default:return void(i+="".concat(r).concat(t,": ").concat(n,";\n"))}}),i+="".concat(r,"}\n")}),i+="}\n";var a=document.createElement("style");return a.textContent=i,a}},{key:"animate",value:function(e,t,n,i,r){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:[],o=a.filter(function(e){return e instanceof uw}),s={};Ny(n,i)&&o.forEach(function(e){var t=e.currentSnapshot;Object.keys(t).forEach(function(e){return s[e]=t[e]})});var u=fw(t=By(e,t,s));if(0==n)return new lw(e,u);var l="".concat(cw).concat(this._count++),c=this.buildKeyframeElement(e,l,t),d=hw(e);d.appendChild(c);var h=Jb(e,t),f=new uw(e,t,l,n,i,r,u,h);return f.onDestroy(function(){return pw(c)}),f}}]),e}();function hw(e){var t,n=null===(t=e.getRootNode)||void 0===t?void 0:t.call(e);return"undefined"!=typeof ShadowRoot&&n instanceof ShadowRoot?n:document.head}function fw(e){var t={};return e&&(Array.isArray(e)?e:[e]).forEach(function(e){Object.keys(e).forEach(function(n){"offset"!=n&&"easing"!=n&&(t[n]=e[n])})}),t}function pw(e){e.parentNode.removeChild(e)}var mw=function(){function e(t,n,i,r){s(this,e),this.element=t,this.keyframes=n,this.options=i,this._specialStyles=r,this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._initialized=!1,this._finished=!1,this._started=!1,this._destroyed=!1,this.time=0,this.parentPlayer=null,this.currentSnapshot={},this._duration=i.duration,this._delay=i.delay||0,this.time=this._duration+this._delay}return o(e,[{key:"_onFinish",value:function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])}},{key:"init",value:function(){this._buildPlayer(),this._preparePlayerBeforeStart()}},{key:"_buildPlayer",value:function(){var e=this;if(!this._initialized){this._initialized=!0;var t=this.keyframes;this.domPlayer=this._triggerWebAnimation(this.element,t,this.options),this._finalKeyframe=t.length?t[t.length-1]:{},this.domPlayer.addEventListener("finish",function(){return e._onFinish()})}}},{key:"_preparePlayerBeforeStart",value:function(){this._delay?this._resetDomPlayerState():this.domPlayer.pause()}},{key:"_triggerWebAnimation",value:function(e,t,n){return e.animate(t,n)}},{key:"onStart",value:function(e){this._onStartFns.push(e)}},{key:"onDone",value:function(e){this._onDoneFns.push(e)}},{key:"onDestroy",value:function(e){this._onDestroyFns.push(e)}},{key:"play",value:function(){this._buildPlayer(),this.hasStarted()||(this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),this.domPlayer.play()}},{key:"pause",value:function(){this.init(),this.domPlayer.pause()}},{key:"finish",value:function(){this.init(),this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish()}},{key:"reset",value:function(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1}},{key:"_resetDomPlayerState",value:function(){this.domPlayer&&this.domPlayer.cancel()}},{key:"restart",value:function(){this.reset(),this.play()}},{key:"hasStarted",value:function(){return this._started}},{key:"destroy",value:function(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])}},{key:"setPosition",value:function(e){void 0===this.domPlayer&&this.init(),this.domPlayer.currentTime=e*this.time}},{key:"getPosition",value:function(){return this.domPlayer.currentTime/this.time}},{key:"totalTime",get:function(){return this._delay+this._duration}},{key:"beforeDestroy",value:function(){var e=this,t={};this.hasStarted()&&Object.keys(this._finalKeyframe).forEach(function(n){"offset"!=n&&(t[n]=e._finished?e._finalKeyframe[n]:Vy(e.element,n))}),this.currentSnapshot=t}},{key:"triggerCallback",value:function(e){var t="start"==e?this._onStartFns:this._onDoneFns;t.forEach(function(e){return e()}),t.length=0}}]),e}(),gw=function(){function e(){s(this,e),this._isNativeImpl=/\{\s*\[native\s+code\]\s*\}/.test(vw().toString()),this._cssKeyframesDriver=new dw}return o(e,[{key:"validateStyleProperty",value:function(e){return dy(e)}},{key:"matchesElement",value:function(e,t){return hy(e,t)}},{key:"containsElement",value:function(e,t){return fy(e,t)}},{key:"query",value:function(e,t,n){return py(e,t,n)}},{key:"computeStyle",value:function(e,t,n){return window.getComputedStyle(e)[t]}},{key:"overrideWebAnimationsSupport",value:function(e){this._isNativeImpl=e}},{key:"animate",value:function(e,t,n,i,r){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:[],o=arguments.length>6?arguments[6]:void 0,s=!o&&!this._isNativeImpl;if(s)return this._cssKeyframesDriver.animate(e,t,n,i,r,a);var u=0==i?"both":"forwards",l={duration:n,delay:i,fill:u};r&&(l.easing=r);var c={},d=a.filter(function(e){return e instanceof mw});Ny(n,i)&&d.forEach(function(e){var t=e.currentSnapshot;Object.keys(t).forEach(function(e){return c[e]=t[e]})});var h=Jb(e,t=By(e,t=t.map(function(e){return Ty(e,!1)}),c));return new mw(e,t,l,h)}}]),e}();function vw(){return Z_()&&Element.prototype.animate||{}}var _w=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this))._nextAnimationId=0,r._renderer=e.createRenderer(i.body,{id:"0",encapsulation:$e.None,styles:[],data:{animation:[]}}),r}return o(n,[{key:"build",value:function(e){var t=this._nextAnimationId.toString();this._nextAnimationId++;var n=Array.isArray(e)?j_(e):e;return ww(this._renderer,null,t,"register",[n]),new yw(t,this._renderer)}}]),n}(A_);return e.\u0275fac=function(t){return new(t||e)(Bi(ju),Bi(yd))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),yw=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this))._id=e,r._renderer=i,r}return o(n,[{key:"create",value:function(e,t){return new bw(this._id,e,t||{},this._renderer)}}]),n}(I_),bw=function(){function e(t,n,i,r){s(this,e),this.id=t,this.element=n,this._renderer=r,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",i)}return o(e,[{key:"_listen",value:function(e,t){return this._renderer.listen(this.element,"@@".concat(this.id,":").concat(e),t)}},{key:"_command",value:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i=0&&e3&&void 0!==arguments[3])||arguments[3];this.delegate.insertBefore(e,t,n),this.engine.onInsert(this.namespaceId,t,e,i)}},{key:"removeChild",value:function(e,t,n){this.engine.onRemove(this.namespaceId,t,this.delegate,n)}},{key:"selectRootElement",value:function(e,t){return this.delegate.selectRootElement(e,t)}},{key:"parentNode",value:function(e){return this.delegate.parentNode(e)}},{key:"nextSibling",value:function(e){return this.delegate.nextSibling(e)}},{key:"setAttribute",value:function(e,t,n,i){this.delegate.setAttribute(e,t,n,i)}},{key:"removeAttribute",value:function(e,t,n){this.delegate.removeAttribute(e,t,n)}},{key:"addClass",value:function(e,t){this.delegate.addClass(e,t)}},{key:"removeClass",value:function(e,t){this.delegate.removeClass(e,t)}},{key:"setStyle",value:function(e,t,n,i){this.delegate.setStyle(e,t,n,i)}},{key:"removeStyle",value:function(e,t,n){this.delegate.removeStyle(e,t,n)}},{key:"setProperty",value:function(e,t,n){t.charAt(0)==kw&&t==Mw?this.disableAnimations(e,!!n):this.delegate.setProperty(e,t,n)}},{key:"setValue",value:function(e,t){this.delegate.setValue(e,t)}},{key:"listen",value:function(e,t,n){return this.delegate.listen(e,t,n)}},{key:"disableAnimations",value:function(e,t){this.engine.disableAnimations(e,t)}}]),e}(),Lw=function(e){l(n,e);var t=p(n);function n(e,i,r,a){var o;return s(this,n),(o=t.call(this,i,r,a)).factory=e,o.namespaceId=i,o}return o(n,[{key:"setProperty",value:function(e,t,n){t.charAt(0)==kw?"."==t.charAt(1)&&t==Mw?this.disableAnimations(e,n=void 0===n||!!n):this.engine.process(this.namespaceId,e,t.substr(1),n):this.delegate.setProperty(e,t,n)}},{key:"listen",value:function(e,t,n){var i,r,a=this;if(t.charAt(0)==kw){var o=function(e){switch(e){case"body":return document.body;case"document":return document;case"window":return window;default:return e}}(e),s=t.substr(1),u="";if(s.charAt(0)!=kw){var l=_((r=(i=s).indexOf("."),[i.substring(0,r),i.substr(r+1)]),2);s=l[0],u=l[1]}return this.engine.listen(this.namespaceId,o,s,u,function(e){a.factory.scheduleListenerCallback(e._data||-1,n,e)})}return this.delegate.listen(e,t,n)}}]),n}(Cw),xw=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r){return s(this,n),t.call(this,e.body,i,r)}return o(n,[{key:"ngOnDestroy",value:function(){this.flush()}}]),n}(Kb);return e.\u0275fac=function(t){return new(t||e)(Bi(yd),Bi(vy),Bi(fb))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),Tw=new Mi("AnimationModuleType"),Dw=[{provide:A_,useClass:_w},{provide:fb,useFactory:function(){return new pb}},{provide:Kb,useClass:xw},{provide:ju,useFactory:function(e,t,n){return new Sw(e,t,n)},deps:[Qh,Kb,Fc]}],Ow=([{provide:vy,useFactory:function(){return"function"==typeof vw()?new gw:new dw}},{provide:Tw,useValue:"BrowserAnimations"}].concat(Dw),[{provide:vy,useClass:gy},{provide:Tw,useValue:"NoopAnimations"}].concat(Dw)),Ew=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:Ow,imports:[mf]}),e}(),Yw=["*",[["mat-option"],["ng-container"]]],Pw=["*","mat-option, ng-container"];function Aw(e,t){if(1&e&&ys(0,"mat-pseudo-checkbox",4),2&e){var n=Ys();ms("state",n.selected?"checked":"unchecked")("disabled",n.disabled)}}function Iw(e,t){if(1&e&&(vs(0,"span",5),ru(1),_s()),2&e){var n=Ys();Ya(1),ou("(",n.group.label,")")}}var Rw=["*"],Fw=new Vu("12.2.3"),Hw=new Mi("mat-sanity-checks",{providedIn:"root",factory:function(){return!0}}),jw=function(){var e=function(){function e(t,n,i){s(this,e),this._hasDoneGlobalChecks=!1,this._document=i,t._applyBodyHighContrastModeCssClasses(),this._sanityChecks=n,this._hasDoneGlobalChecks||(this._checkDoctypeIsDefined(),this._checkThemeIsPresent(),this._checkCdkVersionMatch(),this._hasDoneGlobalChecks=!0)}return o(e,[{key:"_getWindow",value:function(){var e=this._document.defaultView||window;return"object"==typeof e&&e?e:null}},{key:"_checkIsEnabled",value:function(e){return!(!Zc()||this._isTestEnv())&&("boolean"==typeof this._sanityChecks?this._sanityChecks:!!this._sanityChecks[e])}},{key:"_isTestEnv",value:function(){var e=this._getWindow();return e&&(e.__karma__||e.jasmine)}},{key:"_checkDoctypeIsDefined",value:function(){this._checkIsEnabled("doctype")&&!this._document.doctype&&console.warn("Current document does not have a doctype. This may cause some Angular Material components not to behave as expected.")}},{key:"_checkThemeIsPresent",value:function(){if(this._checkIsEnabled("theme")&&this._document.body&&"function"==typeof getComputedStyle){var e=this._document.createElement("div");e.classList.add("mat-theme-loaded-marker"),this._document.body.appendChild(e);var t=getComputedStyle(e);t&&"none"!==t.display&&console.warn("Could not find Angular Material core theme. Most Material components may not work as expected. For more info refer to the theming guide: https://material.angular.io/guide/theming"),this._document.body.removeChild(e)}}},{key:"_checkCdkVersionMatch",value:function(){this._checkIsEnabled("version")&&Fw.full!==P_.full&&console.warn("The Angular Material version ("+Fw.full+") does not match the Angular CDK version ("+P_.full+").\nPlease ensure the versions of these two packages exactly match.")}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(E_),Bi(Hw,8),Bi(yd))},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[Og],Og]}),e}();function Nw(e){return function(e){l(n,e);var t=p(n);function n(){var e;s(this,n);for(var i=arguments.length,r=new Array(i),a=0;a1&&void 0!==arguments[1]?arguments[1]:0;return function(e){l(i,e);var n=p(i);function i(){var e;s(this,i);for(var r=arguments.length,a=new Array(r),o=0;o2&&void 0!==arguments[2]?arguments[2]:{},r=this._containerRect=this._containerRect||this._containerElement.getBoundingClientRect(),a=Object.assign(Object.assign({},Kw),i.animation);i.centered&&(e=r.left+r.width/2,t=r.top+r.height/2);var o=i.radius||ek(e,t,r),s=e-r.left,u=t-r.top,l=a.enterDuration,c=document.createElement("div");c.classList.add("mat-ripple-element"),c.style.left="".concat(s-o,"px"),c.style.top="".concat(u-o,"px"),c.style.height="".concat(2*o,"px"),c.style.width="".concat(2*o,"px"),null!=i.color&&(c.style.backgroundColor=i.color),c.style.transitionDuration="".concat(l,"ms"),this._containerElement.appendChild(c),Qw(c),c.style.transform="scale(1)";var d=new Gw(this,c,i);return d.state=0,this._activeRipples.add(d),i.persistent||(this._mostRecentTransientRipple=d),this._runTimeoutOutsideZone(function(){var e=d===n._mostRecentTransientRipple;d.state=1,i.persistent||e&&n._isPointerDown||d.fadeOut()},l),d}},{key:"fadeOutRipple",value:function(e){var t=this._activeRipples.delete(e);if(e===this._mostRecentTransientRipple&&(this._mostRecentTransientRipple=null),this._activeRipples.size||(this._containerRect=null),t){var n=e.element,i=Object.assign(Object.assign({},Kw),e.config.animation);n.style.transitionDuration="".concat(i.exitDuration,"ms"),n.style.opacity="0",e.state=2,this._runTimeoutOutsideZone(function(){e.state=3,n.parentNode.removeChild(n)},i.exitDuration)}}},{key:"fadeOutAll",value:function(){this._activeRipples.forEach(function(e){return e.fadeOut()})}},{key:"fadeOutAllNonPersistent",value:function(){this._activeRipples.forEach(function(e){e.config.persistent||e.fadeOut()})}},{key:"setupTriggerEvents",value:function(e){var t=ym(e);t&&t!==this._triggerElement&&(this._removeTriggerEvents(),this._triggerElement=t,this._registerEvents(Zw))}},{key:"handleEvent",value:function(e){"mousedown"===e.type?this._onMousedown(e):"touchstart"===e.type?this._onTouchStart(e):this._onPointerUp(),this._pointerUpEventsRegistered||(this._registerEvents($w),this._pointerUpEventsRegistered=!0)}},{key:"_onMousedown",value:function(e){var t=g_(e),n=this._lastTouchStartEvent&&Date.now()1&&void 0!==arguments[1]?arguments[1]:0;this._ngZone.runOutsideAngular(function(){return setTimeout(e,t)})}},{key:"_registerEvents",value:function(e){var t=this;this._ngZone.runOutsideAngular(function(){e.forEach(function(e){t._triggerElement.addEventListener(e,t,Jw)})})}},{key:"_removeTriggerEvents",value:function(){var e=this;this._triggerElement&&(Zw.forEach(function(t){e._triggerElement.removeEventListener(t,e,Jw)}),this._pointerUpEventsRegistered&&$w.forEach(function(t){e._triggerElement.removeEventListener(t,e,Jw)}))}}]),e}();function Qw(e){window.getComputedStyle(e).getPropertyValue("opacity")}function ek(e,t,n){var i=Math.max(Math.abs(e-n.left),Math.abs(e-n.right)),r=Math.max(Math.abs(t-n.top),Math.abs(t-n.bottom));return Math.sqrt(i*i+r*r)}var tk=new Mi("mat-ripple-global-options"),nk=function(){var e=function(){function e(t,n,i,r,a){s(this,e),this._elementRef=t,this._animationMode=a,this.radius=0,this._disabled=!1,this._isInitialized=!1,this._globalOptions=r||{},this._rippleRenderer=new Xw(this,n,t,i)}return o(e,[{key:"disabled",get:function(){return this._disabled},set:function(e){e&&this.fadeOutAllNonPersistent(),this._disabled=e,this._setupTriggerEventsIfEnabled()}},{key:"trigger",get:function(){return this._trigger||this._elementRef.nativeElement},set:function(e){this._trigger=e,this._setupTriggerEventsIfEnabled()}},{key:"ngOnInit",value:function(){this._isInitialized=!0,this._setupTriggerEventsIfEnabled()}},{key:"ngOnDestroy",value:function(){this._rippleRenderer._removeTriggerEvents()}},{key:"fadeOutAll",value:function(){this._rippleRenderer.fadeOutAll()}},{key:"fadeOutAllNonPersistent",value:function(){this._rippleRenderer.fadeOutAllNonPersistent()}},{key:"rippleConfig",get:function(){return{centered:this.centered,radius:this.radius,color:this.color,animation:Object.assign(Object.assign(Object.assign({},this._globalOptions.animation),"NoopAnimations"===this._animationMode?{enterDuration:0,exitDuration:0}:{}),this.animation),terminateOnPointerUp:this._globalOptions.terminateOnPointerUp}}},{key:"rippleDisabled",get:function(){return this.disabled||!!this._globalOptions.disabled}},{key:"_setupTriggerEventsIfEnabled",value:function(){!this.disabled&&this._isInitialized&&this._rippleRenderer.setupTriggerEvents(this.trigger)}},{key:"launch",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0;return"number"==typeof e?this._rippleRenderer.fadeInRipple(e,t,Object.assign(Object.assign({},this.rippleConfig),n)):this._rippleRenderer.fadeInRipple(0,0,Object.assign(Object.assign({},this.rippleConfig),e))}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(Fc),ps(yg),ps(tk,8),ps(Tw,8))},e.\u0275dir=bt({type:e,selectors:[["","mat-ripple",""],["","matRipple",""]],hostAttrs:[1,"mat-ripple"],hostVars:2,hostBindings:function(e,t){2&e&&qs("mat-ripple-unbounded",t.unbounded)},inputs:{radius:["matRippleRadius","radius"],disabled:["matRippleDisabled","disabled"],trigger:["matRippleTrigger","trigger"],color:["matRippleColor","color"],unbounded:["matRippleUnbounded","unbounded"],centered:["matRippleCentered","centered"],animation:["matRippleAnimation","animation"]},exportAs:["matRipple"]}),e}(),ik=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[jw,bg],jw]}),e}(),rk=function(){var e=function e(t){s(this,e),this._animationMode=t,this.state="unchecked",this.disabled=!1};return e.\u0275fac=function(t){return new(t||e)(ps(Tw,8))},e.\u0275cmp=ft({type:e,selectors:[["mat-pseudo-checkbox"]],hostAttrs:[1,"mat-pseudo-checkbox"],hostVars:8,hostBindings:function(e,t){2&e&&qs("mat-pseudo-checkbox-indeterminate","indeterminate"===t.state)("mat-pseudo-checkbox-checked","checked"===t.state)("mat-pseudo-checkbox-disabled",t.disabled)("_mat-animation-noopable","NoopAnimations"===t._animationMode)},inputs:{state:"state",disabled:"disabled"},decls:0,vars:0,template:function(e,t){},styles:['.mat-pseudo-checkbox{width:16px;height:16px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border-color:transparent}._mat-animation-noopable.mat-pseudo-checkbox{transition:none;animation:none}._mat-animation-noopable.mat-pseudo-checkbox::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:5px;left:1px;width:10px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{top:2.4px;left:1px;width:8px;height:3px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}\n'],encapsulation:2,changeDetection:0}),e}(),ak=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[jw]]}),e}(),ok=new Mi("MAT_OPTION_PARENT_COMPONENT"),sk=Nw(function(){return function e(){s(this,e)}}()),uk=0,lk=function(){var e=function(e){l(n,e);var t=p(n);function n(e){var i,r;return s(this,n),(i=t.call(this))._labelId="mat-optgroup-label-".concat(uk++),i._inert=null!==(r=null==e?void 0:e.inertGroups)&&void 0!==r&&r,i}return n}(sk);return e.\u0275fac=function(t){return new(t||e)(ps(ok,8))},e.\u0275dir=bt({type:e,inputs:{label:"label"},features:[Ko]}),e}(),ck=new Mi("MatOptgroup"),dk=function(){var e=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return n}(lk);return e.\u0275fac=function(){var t;return function(n){return(t||(t=_i(e)))(n||e)}}(),e.\u0275cmp=ft({type:e,selectors:[["mat-optgroup"]],hostAttrs:[1,"mat-optgroup"],hostVars:5,hostBindings:function(e,t){2&e&&(ls("role",t._inert?null:"group")("aria-disabled",t._inert?null:t.disabled.toString())("aria-labelledby",t._inert?null:t._labelId),qs("mat-optgroup-disabled",t.disabled))},inputs:{disabled:"disabled"},exportAs:["matOptgroup"],features:[Du([{provide:ck,useExisting:e}]),Ko],ngContentSelectors:Pw,decls:6,vars:2,consts:[["aria-hidden","true",1,"mat-optgroup-label",3,"id"]],template:function(e,t){1&e&&(As(Yw),vs(0,"span",0),ru(1),Is(2),_s(),ru(3,"\n"),Is(4,1),ru(5,"\n")),2&e&&(ms("id",t._labelId),Ya(1),ou("",t.label," "))},styles:[".mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px;vertical-align:middle}.mat-optgroup-label .mat-icon svg{vertical-align:top}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}\n"],encapsulation:2,changeDetection:0}),e}(),hk=0,fk=function e(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];s(this,e),this.source=t,this.isUserInput=n},pk=function(){var e=function(){function e(t,n,i,r){s(this,e),this._element=t,this._changeDetectorRef=n,this._parent=i,this.group=r,this._selected=!1,this._active=!1,this._disabled=!1,this._mostRecentViewValue="",this.id="mat-option-".concat(hk++),this.onSelectionChange=new Zl,this._stateChanges=new z}return o(e,[{key:"multiple",get:function(){return this._parent&&this._parent.multiple}},{key:"selected",get:function(){return this._selected}},{key:"disabled",get:function(){return this.group&&this.group.disabled||this._disabled},set:function(e){this._disabled=pm(e)}},{key:"disableRipple",get:function(){return this._parent&&this._parent.disableRipple}},{key:"active",get:function(){return this._active}},{key:"viewValue",get:function(){return(this._getHostElement().textContent||"").trim()}},{key:"select",value:function(){this._selected||(this._selected=!0,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent())}},{key:"deselect",value:function(){this._selected&&(this._selected=!1,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent())}},{key:"focus",value:function(e,t){var n=this._getHostElement();"function"==typeof n.focus&&n.focus(t)}},{key:"setActiveStyles",value:function(){this._active||(this._active=!0,this._changeDetectorRef.markForCheck())}},{key:"setInactiveStyles",value:function(){this._active&&(this._active=!1,this._changeDetectorRef.markForCheck())}},{key:"getLabel",value:function(){return this.viewValue}},{key:"_handleKeydown",value:function(e){13!==e.keyCode&&32!==e.keyCode||Qg(e)||(this._selectViaInteraction(),e.preventDefault())}},{key:"_selectViaInteraction",value:function(){this.disabled||(this._selected=!this.multiple||!this._selected,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent(!0))}},{key:"_getAriaSelected",value:function(){return this.selected||!this.multiple&&null}},{key:"_getTabIndex",value:function(){return this.disabled?"-1":"0"}},{key:"_getHostElement",value:function(){return this._element.nativeElement}},{key:"ngAfterViewChecked",value:function(){if(this._selected){var e=this.viewValue;e!==this._mostRecentViewValue&&(this._mostRecentViewValue=e,this._stateChanges.next())}}},{key:"ngOnDestroy",value:function(){this._stateChanges.complete()}},{key:"_emitSelectionChangeEvent",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.onSelectionChange.emit(new fk(this,e))}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(ll),ps(void 0),ps(lk))},e.\u0275dir=bt({type:e,inputs:{id:"id",disabled:"disabled",value:"value"},outputs:{onSelectionChange:"onSelectionChange"}}),e}(),mk=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a){return s(this,n),t.call(this,e,i,r,a)}return n}(pk);return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(ll),ps(ok,8),ps(ck,8))},e.\u0275cmp=ft({type:e,selectors:[["mat-option"]],hostAttrs:["role","option",1,"mat-option","mat-focus-indicator"],hostVars:12,hostBindings:function(e,t){1&e&&xs("click",function(){return t._selectViaInteraction()})("keydown",function(e){return t._handleKeydown(e)}),2&e&&(du("id",t.id),ls("tabindex",t._getTabIndex())("aria-selected",t._getAriaSelected())("aria-disabled",t.disabled.toString()),qs("mat-selected",t.selected)("mat-option-multiple",t.multiple)("mat-active",t.active)("mat-option-disabled",t.disabled))},exportAs:["matOption"],features:[Ko],ngContentSelectors:Rw,decls:11,vars:4,consts:[["class","mat-option-pseudo-checkbox",3,"state","disabled",4,"ngIf"],[1,"mat-option-text"],["class","cdk-visually-hidden",4,"ngIf"],["mat-ripple","",1,"mat-option-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mat-option-pseudo-checkbox",3,"state","disabled"],[1,"cdk-visually-hidden"]],template:function(e,t){1&e&&(As(),hs(0,Aw,1,2,"mat-pseudo-checkbox",0),ru(1,"\n\n"),vs(2,"span",1),Is(3),_s(),ru(4,"\n\n"),ru(5,"\n"),hs(6,Iw,2,1,"span",2),ru(7,"\n\n"),vs(8,"div",3),ru(9,"\n"),_s(),ru(10,"\n")),2&e&&(ms("ngIf",t.multiple),Ya(6),ms("ngIf",t.group&&t.group._inert),Ya(2),ms("matRippleTrigger",t._getHostElement())("matRippleDisabled",t.disabled||t.disableRipple))},directives:[lh,nk,rk],styles:[".mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;position:relative;cursor:pointer;outline:none;display:flex;flex-direction:row;max-width:100%;box-sizing:border-box;align-items:center;-webkit-tap-highlight-color:transparent}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px;vertical-align:middle}.mat-option .mat-icon svg{vertical-align:top}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.cdk-high-contrast-active .mat-option{margin:0 1px}.cdk-high-contrast-active .mat-option.mat-active{border:solid 1px currentColor;margin:0}.cdk-high-contrast-active .mat-option[aria-disabled=true]{opacity:.5}.mat-option-text{display:inline-block;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option .mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}\n"],encapsulation:2,changeDetection:0}),e}();function gk(e,t,n){if(n.length){for(var i=t.toArray(),r=n.toArray(),a=0,o=0;on+i?Math.max(0,e-i+t):n}var _k=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[ik,Th,jw,ak]]}),e}();function yk(e){return new N(function(t){var n;try{n=e()}catch(i){return void t.error(i)}return(n?re(n):og()).subscribe(t)})}function bk(e,t){}var wk=function e(){s(this,e),this.role="dialog",this.panelClass="",this.hasBackdrop=!0,this.backdropClass="",this.disableClose=!1,this.width="",this.height="",this.maxWidth="80vw",this.data=null,this.ariaDescribedBy=null,this.ariaLabelledBy=null,this.ariaLabel=null,this.autoFocus=!0,this.restoreFocus=!0,this.closeOnNavigation=!0},kk={dialogContainer:F_("dialogContainer",[B_("void, exit",N_({opacity:0,transform:"scale(0.7)"})),B_("enter",N_({transform:"none"})),V_("* => enter",H_("150ms cubic-bezier(0, 0, 0.2, 1)",N_({transform:"none",opacity:1}))),V_("* => void, * => exit",H_("75ms cubic-bezier(0.4, 0.0, 0.2, 1)",N_({opacity:0})))])},Mk=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o,u){var l;return s(this,n),(l=t.call(this))._elementRef=e,l._focusTrapFactory=i,l._changeDetectorRef=r,l._config=o,l._focusMonitor=u,l._animationStateChanged=new Zl,l._elementFocusedBeforeDialogWasOpened=null,l._closeInteractionType=null,l.attachDomPortal=function(e){return l._portalOutlet.hasAttached(),l._portalOutlet.attachDomPortal(e)},l._ariaLabelledBy=o.ariaLabelledBy||null,l._document=a,l}return o(n,[{key:"_initializeWithAttachedContent",value:function(){this._setupFocusTrap(),this._capturePreviouslyFocusedElement(),this._focusDialogContainer()}},{key:"attachComponentPortal",value:function(e){return this._portalOutlet.hasAttached(),this._portalOutlet.attachComponentPortal(e)}},{key:"attachTemplatePortal",value:function(e){return this._portalOutlet.hasAttached(),this._portalOutlet.attachTemplatePortal(e)}},{key:"_recaptureFocus",value:function(){this._containsFocus()||(!this._config.autoFocus||!this._focusTrap.focusInitialElement())&&this._elementRef.nativeElement.focus()}},{key:"_trapFocus",value:function(){this._config.autoFocus?this._focusTrap.focusInitialElementWhenReady():this._containsFocus()||this._elementRef.nativeElement.focus()}},{key:"_restoreFocus",value:function(){var e=this._elementFocusedBeforeDialogWasOpened;if(this._config.restoreFocus&&e&&"function"==typeof e.focus){var t=Lg(),n=this._elementRef.nativeElement;t&&t!==this._document.body&&t!==n&&!n.contains(t)||(this._focusMonitor?(this._focusMonitor.focusVia(e,this._closeInteractionType),this._closeInteractionType=null):e.focus())}this._focusTrap&&this._focusTrap.destroy()}},{key:"_setupFocusTrap",value:function(){this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement)}},{key:"_capturePreviouslyFocusedElement",value:function(){this._document&&(this._elementFocusedBeforeDialogWasOpened=Lg())}},{key:"_focusDialogContainer",value:function(){this._elementRef.nativeElement.focus&&this._elementRef.nativeElement.focus()}},{key:"_containsFocus",value:function(){var e=this._elementRef.nativeElement,t=Lg();return e===t||e.contains(t)}}]),n}(Ng);return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(m_),ps(ll),ps(yd,8),ps(wk),ps(x_))},e.\u0275dir=bt({type:e,viewQuery:function(e,t){var n;1&e&&lc(Wg,7),2&e&&uc(n=dc())&&(t._portalOutlet=n.first)},features:[Ko]}),e}(),Sk=function(){var e=function(e){l(n,e);var t=p(n);function n(){var e;return s(this,n),(e=t.apply(this,arguments))._state="enter",e}return o(n,[{key:"_onAnimationDone",value:function(e){var t=e.toState,n=e.totalTime;"enter"===t?(this._trapFocus(),this._animationStateChanged.next({state:"opened",totalTime:n})):"exit"===t&&(this._restoreFocus(),this._animationStateChanged.next({state:"closed",totalTime:n}))}},{key:"_onAnimationStart",value:function(e){var t=e.toState,n=e.totalTime;"enter"===t?this._animationStateChanged.next({state:"opening",totalTime:n}):"exit"!==t&&"void"!==t||this._animationStateChanged.next({state:"closing",totalTime:n})}},{key:"_startExitAnimation",value:function(){this._state="exit",this._changeDetectorRef.markForCheck()}}]),n}(Mk);return e.\u0275fac=function(){var t;return function(n){return(t||(t=_i(e)))(n||e)}}(),e.\u0275cmp=ft({type:e,selectors:[["mat-dialog-container"]],hostAttrs:["tabindex","-1","aria-modal","true",1,"mat-dialog-container"],hostVars:6,hostBindings:function(e,t){1&e&&Ts("@dialogContainer.start",function(e){return t._onAnimationStart(e)})("@dialogContainer.done",function(e){return t._onAnimationDone(e)}),2&e&&(du("id",t._id),ls("role",t._config.role)("aria-labelledby",t._config.ariaLabel?null:t._ariaLabelledBy)("aria-label",t._config.ariaLabel)("aria-describedby",t._config.ariaDescribedBy||null),hu("@dialogContainer",t._state))},features:[Ko],decls:2,vars:0,consts:[["cdkPortalOutlet",""]],template:function(e,t){1&e&&(hs(0,bk,0,0,"ng-template",0),ru(1,"\n"))},directives:[Wg],styles:[".mat-dialog-container{display:block;padding:24px;border-radius:4px;box-sizing:border-box;overflow:auto;outline:0;width:100%;height:100%;min-height:inherit;max-height:inherit}.cdk-high-contrast-active .mat-dialog-container{outline:solid 1px}.mat-dialog-content{display:block;margin:0 -24px;padding:0 24px;max-height:65vh;overflow:auto;-webkit-overflow-scrolling:touch}.mat-dialog-title{margin:0 0 20px;display:block}.mat-dialog-actions{padding:8px 0;display:flex;flex-wrap:wrap;min-height:52px;align-items:center;box-sizing:content-box;margin-bottom:-24px}.mat-dialog-actions[align=end]{justify-content:flex-end}.mat-dialog-actions[align=center]{justify-content:center}.mat-dialog-actions .mat-button-base+.mat-button-base,.mat-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-dialog-actions .mat-button-base+.mat-button-base,[dir=rtl] .mat-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"],encapsulation:2,data:{animation:[kk.dialogContainer]}}),e}(),Ck=0,Lk=function(){function e(t,n){var i=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"mat-dialog-".concat(Ck++);s(this,e),this._overlayRef=t,this._containerInstance=n,this.id=r,this.disableClose=this._containerInstance._config.disableClose,this._afterOpened=new z,this._afterClosed=new z,this._beforeClosed=new z,this._state=0,n._id=r,n._animationStateChanged.pipe(zm(function(e){return"opened"===e.state}),zg(1)).subscribe(function(){i._afterOpened.next(),i._afterOpened.complete()}),n._animationStateChanged.pipe(zm(function(e){return"closed"===e.state}),zg(1)).subscribe(function(){clearTimeout(i._closeFallbackTimeout),i._finishDialogClose()}),t.detachments().subscribe(function(){i._beforeClosed.next(i._result),i._beforeClosed.complete(),i._afterClosed.next(i._result),i._afterClosed.complete(),i.componentInstance=null,i._overlayRef.dispose()}),t.keydownEvents().pipe(zm(function(e){return e.keyCode===Zg&&!i.disableClose&&!Qg(e)})).subscribe(function(e){e.preventDefault(),xk(i,"keyboard")}),t.backdropClick().subscribe(function(){i.disableClose?i._containerInstance._recaptureFocus():xk(i,"mouse")})}return o(e,[{key:"close",value:function(e){var t=this;this._result=e,this._containerInstance._animationStateChanged.pipe(zm(function(e){return"closing"===e.state}),zg(1)).subscribe(function(n){t._beforeClosed.next(e),t._beforeClosed.complete(),t._overlayRef.detachBackdrop(),t._closeFallbackTimeout=setTimeout(function(){return t._finishDialogClose()},n.totalTime+100)}),this._state=1,this._containerInstance._startExitAnimation()}},{key:"afterOpened",value:function(){return this._afterOpened}},{key:"afterClosed",value:function(){return this._afterClosed}},{key:"beforeClosed",value:function(){return this._beforeClosed}},{key:"backdropClick",value:function(){return this._overlayRef.backdropClick()}},{key:"keydownEvents",value:function(){return this._overlayRef.keydownEvents()}},{key:"updatePosition",value:function(e){var t=this._getPositionStrategy();return e&&(e.left||e.right)?e.left?t.left(e.left):t.right(e.right):t.centerHorizontally(),e&&(e.top||e.bottom)?e.top?t.top(e.top):t.bottom(e.bottom):t.centerVertically(),this._overlayRef.updatePosition(),this}},{key:"updateSize",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return this._overlayRef.updateSize({width:e,height:t}),this._overlayRef.updatePosition(),this}},{key:"addPanelClass",value:function(e){return this._overlayRef.addPanelClass(e),this}},{key:"removePanelClass",value:function(e){return this._overlayRef.removePanelClass(e),this}},{key:"getState",value:function(){return this._state}},{key:"_finishDialogClose",value:function(){this._state=2,this._overlayRef.dispose()}},{key:"_getPositionStrategy",value:function(){return this._overlayRef.getConfig().positionStrategy}}]),e}();function xk(e,t,n){return void 0!==e._containerInstance&&(e._containerInstance._closeInteractionType=t),e.close(n)}var Tk=new Mi("MatDialogData"),Dk=new Mi("mat-dialog-default-options"),Ok=new Mi("mat-dialog-scroll-strategy"),Ek={provide:Ok,deps:[Dv],useFactory:function(e){return function(){return e.scrollStrategies.block()}}},Yk=function(){var e=function(){function e(t,n,i,r,a,o,u,l,c){var d=this;s(this,e),this._overlay=t,this._injector=n,this._defaultOptions=i,this._parentDialog=r,this._overlayContainer=a,this._dialogRefConstructor=u,this._dialogContainerType=l,this._dialogDataToken=c,this._openDialogsAtThisLevel=[],this._afterAllClosedAtThisLevel=new z,this._afterOpenedAtThisLevel=new z,this._ariaHiddenElements=new Map,this.afterAllClosed=yk(function(){return d.openDialogs.length?d._getAfterAllClosed():d._getAfterAllClosed().pipe(Qm(void 0))}),this._scrollStrategy=o}return o(e,[{key:"openDialogs",get:function(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}},{key:"afterOpened",get:function(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}},{key:"_getAfterAllClosed",value:function(){var e=this._parentDialog;return e?e._getAfterAllClosed():this._afterAllClosedAtThisLevel}},{key:"open",value:function(e,t){var n=this;(t=function(e,t){return Object.assign(Object.assign({},t),e)}(t,this._defaultOptions||new wk)).id&&this.getDialogById(t.id);var i=this._createOverlay(t),r=this._attachDialogContainer(i,t),a=this._attachDialogContent(e,r,i,t);return this.openDialogs.length||this._hideNonDialogContentFromAssistiveTechnology(),this.openDialogs.push(a),a.afterClosed().subscribe(function(){return n._removeOpenDialog(a)}),this.afterOpened.next(a),r._initializeWithAttachedContent(),a}},{key:"closeAll",value:function(){this._closeDialogs(this.openDialogs)}},{key:"getDialogById",value:function(e){return this.openDialogs.find(function(t){return t.id===e})}},{key:"ngOnDestroy",value:function(){this._closeDialogs(this._openDialogsAtThisLevel),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete()}},{key:"_createOverlay",value:function(e){var t=this._getOverlayConfig(e);return this._overlay.create(t)}},{key:"_getOverlayConfig",value:function(e){var t=new uv({positionStrategy:this._overlay.position().global(),scrollStrategy:e.scrollStrategy||this._scrollStrategy(),panelClass:e.panelClass,hasBackdrop:e.hasBackdrop,direction:e.direction,minWidth:e.minWidth,minHeight:e.minHeight,maxWidth:e.maxWidth,maxHeight:e.maxHeight,disposeOnNavigation:e.closeOnNavigation});return e.backdropClass&&(t.backdropClass=e.backdropClass),t}},{key:"_attachDialogContainer",value:function(e,t){var n=qo.create({parent:t&&t.viewContainerRef&&t.viewContainerRef.injector||this._injector,providers:[{provide:wk,useValue:t}]}),i=new Fg(this._dialogContainerType,t.viewContainerRef,n,t.componentFactoryResolver);return e.attach(i).instance}},{key:"_attachDialogContent",value:function(e,t,n,i){var r=new this._dialogRefConstructor(n,t,i.id);if(e instanceof pl)t.attachTemplatePortal(new Hg(e,null,{$implicit:i.data,dialogRef:r}));else{var a=this._createInjector(i,r,t),o=t.attachComponentPortal(new Fg(e,i.viewContainerRef,a));r.componentInstance=o.instance}return r.updateSize(i.width,i.height).updatePosition(i.position),r}},{key:"_createInjector",value:function(e,t,n){var i=e&&e.viewContainerRef&&e.viewContainerRef.injector,r=[{provide:this._dialogContainerType,useValue:n},{provide:this._dialogDataToken,useValue:e.data},{provide:this._dialogRefConstructor,useValue:t}];return!e.direction||i&&i.get(Dg,null,ze.Optional)||r.push({provide:Dg,useValue:{value:e.direction,change:bm()}}),qo.create({parent:i||this._injector,providers:r})}},{key:"_removeOpenDialog",value:function(e){var t=this.openDialogs.indexOf(e);t>-1&&(this.openDialogs.splice(t,1),this.openDialogs.length||(this._ariaHiddenElements.forEach(function(e,t){e?t.setAttribute("aria-hidden",e):t.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),this._getAfterAllClosed().next()))}},{key:"_hideNonDialogContentFromAssistiveTechnology",value:function(){var e=this._overlayContainer.getContainerElement();if(e.parentElement)for(var t=e.parentElement.children,n=t.length-1;n>-1;n--){var i=t[n];i===e||"SCRIPT"===i.nodeName||"STYLE"===i.nodeName||i.hasAttribute("aria-live")||(this._ariaHiddenElements.set(i,i.getAttribute("aria-hidden")),i.setAttribute("aria-hidden","true"))}}},{key:"_closeDialogs",value:function(e){for(var t=e.length;t--;)e[t].close()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(Dv),ps(qo),ps(void 0),ps(void 0),ps(gv),ps(void 0),ps(Ci),ps(Ci),ps(Mi))},e.\u0275dir=bt({type:e}),e}(),Pk=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o,u,l){return s(this,n),t.call(this,e,i,a,u,l,o,Lk,Sk,Tk)}return n}(Yk);return e.\u0275fac=function(t){return new(t||e)(Bi(Dv),Bi(qo),Bi(Ad,8),Bi(Dk,8),Bi(Ok),Bi(e,12),Bi(gv))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),Ak=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275dir=bt({type:e,selectors:[["","mat-dialog-content",""],["mat-dialog-content"],["","matDialogContent",""]],hostAttrs:[1,"mat-dialog-content"]}),e}(),Ik=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[Pk,Ek],imports:[[Iv,Vg,jw],jw]}),e}();function Rk(e,t){if(1&e){var n=Ms();vs(0,"img",3),xs("click",function(){return on(n),Ys().closePopup()}),_s()}}var Fk=function(e){return{"red-title":e}},Hk=["*"],jk=function(){function e(e){this.matDialog=e,this.useRedTitle=!1}return Object.defineProperty(e.prototype,"dialog",{set:function(e){e.disableClose=!0,this.dialogInternal=e},enumerable:!1,configurable:!0}),e.prototype.onKeyUp=function(){this.closePopup()},e.prototype.closePopup=function(){this.disableDismiss||this.matDialog.openDialogs[this.matDialog.openDialogs.length-1].id===this.dialogInternal.id&&this.dialogInternal.close()},e.\u0275fac=function(t){return new(t||e)(ps(Pk))},e.\u0275cmp=ft({type:e,selectors:[["app-modal"]],hostBindings:function(e,t){1&e&&xs("keyup.esc",function(){return t.onKeyUp()},!1,Br)},inputs:{useRedTitle:"useRedTitle",headline:"headline",disableDismiss:"disableDismiss",dialog:"dialog"},ngContentSelectors:Hk,decls:13,vars:5,consts:[[1,"-header",3,"ngClass"],["class","image-button","src","assets/img/delete-grey.png",3,"click",4,"ngIf"],[1,"modal"],["src","assets/img/delete-grey.png",1,"image-button",3,"click"]],template:function(e,t){1&e&&(As(),vs(0,"div",0),ru(1),hs(2,Rk,1,0,"img",1),ru(3,"\n"),_s(),ru(4,"\n"),vs(5,"div",2),ru(6,"\n "),vs(7,"mat-dialog-content"),ru(8,"\n "),Is(9),ru(10,"\n "),_s(),ru(11,"\n"),_s(),ru(12,"\n")),2&e&&(ms("ngClass",Il(3,Fk,t.useRedTitle)),Ya(1),ou("\n ",t.headline,"\n "),Ya(1),ms("ngIf",!t.disableDismiss))},directives:[ah,lh,Ak],styles:['.-header[_ngcontent-%COMP%]{background-color:#f7f7f7;line-height:50px;position:relative;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 32px;font-size:14px}.-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:32px;position:absolute;right:9px;top:9px}mat-dialog-content[_ngcontent-%COMP%]:after, mat-dialog-content[_ngcontent-%COMP%]:before{content:"";padding-top:24px;height:0;display:block}.red-title[_ngcontent-%COMP%]{text-transform:uppercase;font-weight:700;letter-spacing:1px;color:#ff004e}']}),e}();function Nk(e,t){var n=!1;return arguments.length>=2&&(n=!0),function(i){return i.lift(new Bk(e,t,n))}}var Bk=function(){function e(t,n){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];s(this,e),this.accumulator=t,this.seed=n,this.hasSeed=i}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new Wk(e,this.accumulator,this.seed,this.hasSeed))}}]),e}(),Wk=function(e){l(n,e);var t=p(n);function n(e,i,r,a){var o;return s(this,n),(o=t.call(this,e)).accumulator=i,o._seed=r,o.hasSeed=a,o.index=0,o}return o(n,[{key:"seed",get:function(){return this._seed},set:function(e){this.hasSeed=!0,this._seed=e}},{key:"_next",value:function(e){if(this.hasSeed)return this._tryNext(e);this.seed=e,this.destination.next(e)}},{key:"_tryNext",value:function(e){var t,n=this.index++;try{t=this.accumulator(this.seed,e,n)}catch(i){this.destination.error(i)}this.seed=t,this.destination.next(t)}}]),n}(A);function Vk(e){return function(t){return 0===e?og():t.lift(new Uk(e))}}var Uk=function(){function e(t){if(s(this,e),this.total=t,this.total<0)throw new Ug}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new zk(e,this.total))}}]),e}(),zk=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e)).total=i,r.ring=new Array,r.count=0,r}return o(n,[{key:"_next",value:function(e){var t=this.ring,n=this.total,i=this.count++;t.length0)for(var n=this.count>=this.total?this.total:this.count,i=this.ring,r=0;r0&&void 0!==arguments[0]?arguments[0]:null;return function(t){return t.lift(new Gk(e))}}var Gk=function(){function e(t){s(this,e),this.defaultValue=t}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new Kk(e,this.defaultValue))}}]),e}(),Kk=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e)).defaultValue=i,r.isEmpty=!0,r}return o(n,[{key:"_next",value:function(e){this.isEmpty=!1,this.destination.next(e)}},{key:"_complete",value:function(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()}}]),n}(A);function Jk(e,t,n){return 0===n?[t]:(e.push(t),e)}var Zk=function e(){s(this,e)},$k=function(){var e=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"getTranslation",value:function(e){return bm({})}}]),n}(Zk);return e.\u0275fac=function(){var t;return function(n){return(t||(t=_i(e)))(n||e)}}(),e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),Xk=function e(){s(this,e)},Qk=function(){var e=function(){function e(){s(this,e)}return o(e,[{key:"handle",value:function(e){return e.key}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),eM=function e(){s(this,e)},tM=function(){var e=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return o(n,[{key:"compile",value:function(e,t){return e}},{key:"compileTranslations",value:function(e,t){return e}}]),n}(eM);return e.\u0275fac=function(){var t;return function(n){return(t||(t=_i(e)))(n||e)}}(),e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}();function nM(e,t){if(e===t)return!0;if(null===e||null===t)return!1;if(e!=e&&t!=t)return!0;var n,i,r,a=typeof e;if(a==typeof t&&"object"==a){if(!Array.isArray(e)){if(Array.isArray(t))return!1;for(i in r=Object.create(null),e){if(!nM(e[i],t[i]))return!1;r[i]=!0}for(i in t)if(!(i in r)&&void 0!==t[i])return!1;return!0}if(!Array.isArray(t))return!1;if((n=e.length)==t.length){for(i=0;i5&&void 0!==arguments[5])||arguments[5],u=arguments.length>6&&void 0!==arguments[6]&&arguments[6];s(this,e),this.store=t,this.currentLoader=n,this.compiler=i,this.parser=r,this.missingTranslationHandler=a,this.useDefaultLang=o,this.isolate=u,this.pending=!1,this._onTranslationChange=new Zl,this._onLangChange=new Zl,this._onDefaultLangChange=new Zl,this._langs=[],this._translations={},this._translationRequests={}}return o(e,[{key:"onTranslationChange",get:function(){return this.isolate?this._onTranslationChange:this.store.onTranslationChange}},{key:"onLangChange",get:function(){return this.isolate?this._onLangChange:this.store.onLangChange}},{key:"onDefaultLangChange",get:function(){return this.isolate?this._onDefaultLangChange:this.store.onDefaultLangChange}},{key:"defaultLang",get:function(){return this.isolate?this._defaultLang:this.store.defaultLang},set:function(e){this.isolate?this._defaultLang=e:this.store.defaultLang=e}},{key:"currentLang",get:function(){return this.isolate?this._currentLang:this.store.currentLang},set:function(e){this.isolate?this._currentLang=e:this.store.currentLang=e}},{key:"langs",get:function(){return this.isolate?this._langs:this.store.langs},set:function(e){this.isolate?this._langs=e:this.store.langs=e}},{key:"translations",get:function(){return this.isolate?this._translations:this.store.translations},set:function(e){this.isolate?this._translations=e:this.store.translations=e}},{key:"setDefaultLang",value:function(e){var t=this;if(e!==this.defaultLang){var n=this.retrieveTranslations(e);void 0!==n?(this.defaultLang||(this.defaultLang=e),n.pipe(zg(1)).subscribe(function(n){t.changeDefaultLang(e)})):this.changeDefaultLang(e)}}},{key:"getDefaultLang",value:function(){return this.defaultLang}},{key:"use",value:function(e){var t=this;if(e===this.currentLang)return bm(this.translations[e]);var n=this.retrieveTranslations(e);return void 0!==n?(this.currentLang||(this.currentLang=e),n.pipe(zg(1)).subscribe(function(n){t.changeLang(e)}),n):(this.changeLang(e),bm(this.translations[e]))}},{key:"retrieveTranslations",value:function(e){var t;return void 0===this.translations[e]&&(this._translationRequests[e]=this._translationRequests[e]||this.getTranslation(e),t=this._translationRequests[e]),t}},{key:"getTranslation",value:function(e){var t=this;return this.pending=!0,this.loadingTranslations=this.currentLoader.getTranslation(e).pipe(ke()),this.loadingTranslations.pipe(zg(1)).subscribe(function(n){t.translations[e]=t.compiler.compileTranslations(n,e),t.updateLangs(),t.pending=!1},function(e){t.pending=!1}),this.loadingTranslations}},{key:"setTranslation",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];t=this.compiler.compileTranslations(t,e),this.translations[e]=n&&this.translations[e]?aM(this.translations[e],t):t,this.updateLangs(),this.onTranslationChange.emit({lang:e,translations:this.translations[e]})}},{key:"getLangs",value:function(){return this.langs}},{key:"addLangs",value:function(e){var t=this;e.forEach(function(e){-1===t.langs.indexOf(e)&&t.langs.push(e)})}},{key:"updateLangs",value:function(){this.addLangs(Object.keys(this.translations))}},{key:"getParsedResult",value:function(e,t,n){var i;if(t instanceof Array){var r,a={},o=!1,s=v(t);try{for(s.s();!(r=s.n()).done;){var u=r.value;a[u]=this.getParsedResult(e,u,n),"function"==typeof a[u].subscribe&&(o=!0)}}catch(m){s.e(m)}finally{s.f()}if(o){var l,c,d=v(t);try{for(d.s();!(c=d.n()).done;){var h=c.value,f="function"==typeof a[h].subscribe?a[h]:bm(a[h]);l=void 0===l?f:pe(l,f)}}catch(m){d.e(m)}finally{d.f()}return l.pipe(function(e,t){return arguments.length>=2?function(n){return H(Nk(e,t),Vk(1),qk(t))(n)}:function(t){return H(Nk(function(t,n,i){return e(t,n,i+1)}),Vk(1))(t)}}(Jk,[]),K(function(e){var n={};return e.forEach(function(e,i){n[t[i]]=e}),n}))}return a}if(e&&(i=this.parser.interpolate(this.parser.getValue(e,t),n)),void 0===i&&this.defaultLang&&this.defaultLang!==this.currentLang&&this.useDefaultLang&&(i=this.parser.interpolate(this.parser.getValue(this.translations[this.defaultLang],t),n)),void 0===i){var p={key:t,translateService:this};void 0!==n&&(p.interpolateParams=n),i=this.missingTranslationHandler.handle(p)}return void 0!==i?i:t}},{key:"get",value:function(e,t){var n=this;if(!iM(e)||!e.length)throw new Error('Parameter "key" required');if(this.pending)return N.create(function(i){var r=function(e){i.next(e),i.complete()},a=function(e){i.error(e)};n.loadingTranslations.subscribe(function(i){"function"==typeof(i=n.getParsedResult(n.compiler.compileTranslations(i,n.currentLang),e,t)).subscribe?i.subscribe(r,a):r(i)},a)});var i=this.getParsedResult(this.translations[this.currentLang],e,t);return"function"==typeof i.subscribe?i:bm(i)}},{key:"stream",value:function(e,t){var n=this;if(!iM(e)||!e.length)throw new Error('Parameter "key" required');return Xm(this.get(e,t),this.onLangChange.pipe(eg(function(i){var r=n.getParsedResult(i.translations,e,t);return"function"==typeof r.subscribe?r:bm(r)})))}},{key:"instant",value:function(e,t){if(!iM(e)||!e.length)throw new Error('Parameter "key" required');var n=this.getParsedResult(this.translations[this.currentLang],e,t);if(void 0!==n.subscribe){if(e instanceof Array){var i={};return e.forEach(function(t,n){i[e[n]]=e[n]}),i}return e}return n}},{key:"set",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.currentLang;this.translations[n][e]=this.compiler.compile(t,n),this.updateLangs(),this.onTranslationChange.emit({lang:n,translations:this.translations[n]})}},{key:"changeLang",value:function(e){this.currentLang=e,this.onLangChange.emit({lang:e,translations:this.translations[e]}),this.defaultLang||this.changeDefaultLang(e)}},{key:"changeDefaultLang",value:function(e){this.defaultLang=e,this.onDefaultLangChange.emit({lang:e,translations:this.translations[e]})}},{key:"reloadLang",value:function(e){return this.resetLang(e),this.getTranslation(e)}},{key:"resetLang",value:function(e){this._translationRequests[e]=void 0,this.translations[e]=void 0}},{key:"getBrowserLang",value:function(){if("undefined"!=typeof window&&void 0!==window.navigator){var e=window.navigator.languages?window.navigator.languages[0]:null;return-1!==(e=e||window.navigator.language||window.navigator.browserLanguage||window.navigator.userLanguage).indexOf("-")&&(e=e.split("-")[0]),-1!==e.indexOf("_")&&(e=e.split("_")[0]),e}}},{key:"getBrowserCultureLang",value:function(){if("undefined"!=typeof window&&void 0!==window.navigator)return(window.navigator.languages?window.navigator.languages[0]:null)||window.navigator.language||window.navigator.browserLanguage||window.navigator.userLanguage}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(uM),Bi(Zk),Bi(eM),Bi(oM),Bi(Xk),Bi(cM),Bi(lM))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),hM=function(){var e=function(){function e(t,n){s(this,e),this.translate=t,this._ref=n,this.value=""}return o(e,[{key:"updateValue",value:function(e,t,n){var i=this,r=function(t){i.value=void 0!==t?t:e,i.lastKey=e,i._ref.markForCheck()};if(n){var a=this.translate.getParsedResult(n,e,t);"function"==typeof a.subscribe?a.subscribe(r):r(a)}this.translate.get(e,t).subscribe(r)}},{key:"transform",value:function(e){var t,n=this;if(!e||0===e.length)return e;for(var i=arguments.length,r=new Array(i>1?i-1:0),a=1;a0&&void 0!==arguments[0]?arguments[0]:{};return{ngModule:e,providers:[t.loader||{provide:Zk,useClass:$k},t.compiler||{provide:eM,useClass:tM},t.parser||{provide:oM,useClass:sM},t.missingTranslationHandler||{provide:Xk,useClass:Qk},uM,{provide:lM,useValue:t.isolate},{provide:cM,useValue:t.useDefaultLang},dM]}}},{key:"forChild",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{ngModule:e,providers:[t.loader||{provide:Zk,useClass:$k},t.compiler||{provide:eM,useClass:tM},t.parser||{provide:oM,useClass:sM},t.missingTranslationHandler||{provide:Xk,useClass:Qk},{provide:lM,useValue:t.isolate},{provide:cM,useValue:t.useDefaultLang},dM]}}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({}),e}(),pM=function(){function e(e){this.dialogRef=e}return e.openDialog=function(t){var n=new wk;return n.autoFocus=!1,n.width="450px",t.open(e,n)},e.\u0275fac=function(t){return new(t||e)(ps(Lk))},e.\u0275cmp=ft({type:e,selectors:[["app-hw-added-dialog"]],decls:16,vars:13,consts:[[3,"headline","dialog"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),vs(3,"p"),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),vs(7,"p"),ru(8),Wl(9,"translate"),_s(),ru(10,"\n "),vs(11,"p"),ru(12),Wl(13,"translate"),_s(),ru(14,"\n"),_s(),ru(15,"\n")),2&e&&(ms("headline",Vl(1,5,"hardware-wallet.pin-help.title"))("dialog",t.dialogRef),Ya(4),au(Vl(5,7,"hardware-wallet.pin-help.part1")),Ya(4),au(Vl(9,9,"hardware-wallet.pin-help.part2")),Ya(4),au(Vl(13,11,"hardware-wallet.pin-help.part3")))},directives:[jk],pipes:[hM],styles:[""]}),e}();function mM(e,t){if(1&e&&(An(),ys(0,"circle",3)),2&e){var n=Ys();zs("animation-name","mat-progress-spinner-stroke-rotate-"+n._spinnerAnimationLabel)("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),ls("r",n._getCircleRadius())}}function gM(e,t){if(1&e&&(An(),ys(0,"circle",3)),2&e){var n=Ys();zs("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),ls("r",n._getCircleRadius())}}function vM(e,t){if(1&e&&(An(),ys(0,"circle",3)),2&e){var n=Ys();zs("animation-name","mat-progress-spinner-stroke-rotate-"+n._spinnerAnimationLabel)("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),ls("r",n._getCircleRadius())}}function _M(e,t){if(1&e&&(An(),ys(0,"circle",3)),2&e){var n=Ys();zs("stroke-dashoffset",n._getStrokeDashOffset(),"px")("stroke-dasharray",n._getStrokeCircumference(),"px")("stroke-width",n._getCircleStrokeWidth(),"%"),ls("r",n._getCircleRadius())}}var yM=".mat-progress-spinner{display:block;position:relative;overflow:hidden}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}._mat-animation-noopable.mat-progress-spinner circle{transition:none;animation:none}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:currentColor;stroke:CanvasText}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4000ms;animation-timing-function:cubic-bezier(0.35, 0, 0.25, 1);animation-iteration-count:infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{animation:mat-progress-spinner-stroke-rotate-fallback 10000ms cubic-bezier(0.87, 0.03, 0.33, 1) infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition:none;animation:none}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.606171575px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.606171575px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.606171575px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.606171575px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0deg)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}\n",bM=Bw(function(){return function e(t){s(this,e),this._elementRef=t}}(),"primary"),wM=new Mi("mat-progress-spinner-default-options",{providedIn:"root",factory:function(){return{diameter:100}}}),kM=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o){var u;s(this,n),(u=t.call(this,e))._document=r,u._diameter=100,u._value=0,u._fallbackAnimation=!1,u.mode="determinate";var l=n._diameters;return u._spinnerAnimationLabel=u._getSpinnerAnimationLabel(),l.has(r.head)||l.set(r.head,new Set([100])),u._fallbackAnimation=i.EDGE||i.TRIDENT,u._noopAnimations="NoopAnimations"===a&&!!o&&!o._forceAnimations,o&&(o.diameter&&(u.diameter=o.diameter),o.strokeWidth&&(u.strokeWidth=o.strokeWidth)),u}return o(n,[{key:"diameter",get:function(){return this._diameter},set:function(e){this._diameter=mm(e),this._spinnerAnimationLabel=this._getSpinnerAnimationLabel(),!this._fallbackAnimation&&this._styleRoot&&this._attachStyleNode()}},{key:"strokeWidth",get:function(){return this._strokeWidth||this.diameter/10},set:function(e){this._strokeWidth=mm(e)}},{key:"value",get:function(){return"determinate"===this.mode?this._value:0},set:function(e){this._value=Math.max(0,Math.min(100,mm(e)))}},{key:"ngOnInit",value:function(){var e=this._elementRef.nativeElement;this._styleRoot=Cg(e)||this._document.head,this._attachStyleNode();var t="mat-progress-spinner-indeterminate".concat(this._fallbackAnimation?"-fallback":"","-animation");e.classList.add(t)}},{key:"_getCircleRadius",value:function(){return(this.diameter-10)/2}},{key:"_getViewBox",value:function(){var e=2*this._getCircleRadius()+this.strokeWidth;return"0 0 ".concat(e," ").concat(e)}},{key:"_getStrokeCircumference",value:function(){return 2*Math.PI*this._getCircleRadius()}},{key:"_getStrokeDashOffset",value:function(){return"determinate"===this.mode?this._getStrokeCircumference()*(100-this._value)/100:this._fallbackAnimation&&"indeterminate"===this.mode?.2*this._getStrokeCircumference():null}},{key:"_getCircleStrokeWidth",value:function(){return this.strokeWidth/this.diameter*100}},{key:"_attachStyleNode",value:function(){var e=this._styleRoot,t=this._diameter,i=n._diameters,r=i.get(e);if(!r||!r.has(t)){var a=this._document.createElement("style");a.setAttribute("mat-spinner-animation",this._spinnerAnimationLabel),a.textContent=this._getAnimationText(),e.appendChild(a),r||(r=new Set,i.set(e,r)),r.add(t)}}},{key:"_getAnimationText",value:function(){var e=this._getStrokeCircumference();return"\n @keyframes mat-progress-spinner-stroke-rotate-DIAMETER {\n 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }\n 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }\n 12.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n\n 25.0001% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }\n 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }\n 37.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n\n 50.0001% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }\n 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }\n 62.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n\n 75.0001% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }\n 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }\n 87.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n }\n".replace(/START_VALUE/g,"".concat(.95*e)).replace(/END_VALUE/g,"".concat(.2*e)).replace(/DIAMETER/g,"".concat(this._spinnerAnimationLabel))}},{key:"_getSpinnerAnimationLabel",value:function(){return this.diameter.toString().replace(".","_")}}]),n}(bM);return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(yg),ps(yd,8),ps(Tw,8),ps(wM))},e.\u0275cmp=ft({type:e,selectors:[["mat-progress-spinner"]],hostAttrs:["role","progressbar","tabindex","-1",1,"mat-progress-spinner"],hostVars:10,hostBindings:function(e,t){2&e&&(ls("aria-valuemin","determinate"===t.mode?0:null)("aria-valuemax","determinate"===t.mode?100:null)("aria-valuenow","determinate"===t.mode?t.value:null)("mode",t.mode),zs("width",t.diameter,"px")("height",t.diameter,"px"),qs("_mat-animation-noopable",t._noopAnimations))},inputs:{color:"color",mode:"mode",diameter:"diameter",strokeWidth:"strokeWidth",value:"value"},exportAs:["matProgressSpinner"],features:[Ko],decls:10,vars:8,consts:[["preserveAspectRatio","xMidYMid meet","focusable","false","aria-hidden","true",3,"ngSwitch"],["cx","50%","cy","50%",3,"animation-name","stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%",3,"stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%"]],template:function(e,t){1&e&&(ru(0,"\n"),ru(1,"\n"),An(),vs(2,"svg",0),ru(3,"\n\n "),ru(4,"\n "),hs(5,mM,1,9,"circle",1),ru(6,"\n\n "),hs(7,gM,1,7,"circle",2),ru(8,"\n"),_s(),ru(9,"\n")),2&e&&(Ya(2),zs("width",t.diameter,"px")("height",t.diameter,"px"),ms("ngSwitch","indeterminate"===t.mode),ls("viewBox",t._getViewBox()),Ya(3),ms("ngSwitchCase",!0),Ya(2),ms("ngSwitchCase",!1))},directives:[fh,ph],styles:[yM],encapsulation:2,changeDetection:0}),e._diameters=new WeakMap,e}(),MM=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o){var u;return s(this,n),(u=t.call(this,e,i,r,a,o)).mode="indeterminate",u}return n}(kM);return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(yg),ps(yd,8),ps(Tw,8),ps(wM))},e.\u0275cmp=ft({type:e,selectors:[["mat-spinner"]],hostAttrs:["role","progressbar","mode","indeterminate",1,"mat-spinner","mat-progress-spinner"],hostVars:6,hostBindings:function(e,t){2&e&&(zs("width",t.diameter,"px")("height",t.diameter,"px"),qs("_mat-animation-noopable",t._noopAnimations))},inputs:{color:"color"},features:[Ko],decls:10,vars:8,consts:[["preserveAspectRatio","xMidYMid meet","focusable","false","aria-hidden","true",3,"ngSwitch"],["cx","50%","cy","50%",3,"animation-name","stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%",3,"stroke-dashoffset","stroke-dasharray","stroke-width",4,"ngSwitchCase"],["cx","50%","cy","50%"]],template:function(e,t){1&e&&(ru(0,"\n"),ru(1,"\n"),An(),vs(2,"svg",0),ru(3,"\n\n "),ru(4,"\n "),hs(5,vM,1,9,"circle",1),ru(6,"\n\n "),hs(7,_M,1,7,"circle",2),ru(8,"\n"),_s(),ru(9,"\n")),2&e&&(Ya(2),zs("width",t.diameter,"px")("height",t.diameter,"px"),ms("ngSwitch","indeterminate"===t.mode),ls("viewBox",t._getViewBox()),Ya(3),ms("ngSwitchCase",!0),Ya(2),ms("ngSwitchCase",!1))},directives:[fh,ph],styles:[yM],encapsulation:2,changeDetection:0}),e}(),SM=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[jw,Th],jw]}),e}(),CM=n(61287),LM=n.n(CM);function xM(e){return function(t){return t.lift(new TM(e,t))}}var TM=function(){function e(t,n){s(this,e),this.notifier=t,this.source=n}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new DM(e,this.notifier,this.source))}}]),e}(),DM=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,e)).notifier=i,a.source=r,a}return o(n,[{key:"error",value:function(e){if(!this.isStopped){var t=this.errors,a=this.retries,o=this.retriesSubscription;if(a)this.errors=void 0,this.retriesSubscription=void 0;else{t=new z;try{a=(0,this.notifier)(t)}catch(s){return r(i(n.prototype),"error",this).call(this,s)}o=se(a,new ae(this))}this._unsubscribeAndRecycle(),this.errors=t,this.retries=a,this.retriesSubscription=o,t.next(e)}}},{key:"_unsubscribe",value:function(){var e=this.errors,t=this.retriesSubscription;e&&(e.unsubscribe(),this.errors=void 0),t&&(t.unsubscribe(),this.retriesSubscription=void 0),this.retries=void 0}},{key:"notifyNext",value:function(){var e=this._unsubscribe;this._unsubscribe=null,this._unsubscribeAndRecycle(),this._unsubscribe=e,this.source.subscribe(this)}}]),n}(oe);function OM(e){return e instanceof Date&&!isNaN(+e)}function EM(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Fm,n=OM(e),i=n?+e-t.now():Math.abs(e);return function(e){return e.lift(new YM(i,t))}}var YM=function(){function e(t,n){s(this,e),this.delay=t,this.scheduler=n}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new PM(e,this.delay,this.scheduler))}}]),e}(),PM=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,e)).delay=i,a.scheduler=r,a.queue=[],a.active=!1,a.errored=!1,a}return o(n,[{key:"_schedule",value:function(e){this.active=!0,this.destination.add(e.schedule(n.dispatch,this.delay,{source:this,destination:this.destination,scheduler:e}))}},{key:"scheduleNotification",value:function(e){if(!0!==this.errored){var t=this.scheduler,n=new AM(t.now()+this.delay,e);this.queue.push(n),!1===this.active&&this._schedule(t)}}},{key:"_next",value:function(e){this.scheduleNotification(cg.createNext(e))}},{key:"_error",value:function(e){this.errored=!0,this.queue=[],this.destination.error(e),this.unsubscribe()}},{key:"_complete",value:function(){this.scheduleNotification(cg.createComplete()),this.unsubscribe()}}],[{key:"dispatch",value:function(e){for(var t=e.source,n=t.queue,i=e.scheduler,r=e.destination;n.length>0&&n[0].time-i.now()<=0;)n.shift().notification.observe(r);if(n.length>0){var a=Math.max(0,n[0].time-i.now());this.schedule(e,a)}else this.unsubscribe(),t.active=!1}}]),n}(A),AM=function e(t,n){s(this,e),this.time=t,this.notification=n};function IM(e){var t=document.createElement("textarea");t.style.position="fixed",t.style.left="0",t.style.top="0",t.style.opacity="0",t.value=e,document.body.appendChild(t),t.focus(),t.select(),document.execCommand("copy"),document.body.removeChild(t)}var RM=function(){return function(){}}();function FM(e){var t;try{t=new URL(e)}catch(i){}if(!t||!t.protocol||"skycoin:"!==t.protocol.toLowerCase()||!t.pathname)return null;var n=new RM;return n.address=t.pathname,n.coins=t.searchParams.get("amount"),n.hours=t.searchParams.get("hours"),n.message=t.searchParams.get("message"),n}function HM(e){if(e){var t=new RegExp(",","g");return e.replace(t,"")}return e}var jM={otcEnabled:!1,maxHardwareWalletAddresses:1,maxAddressesGap:20,priceApiId:"sky-skycoin",uriSpecificatioPrefix:"skycoin",mediumModalWidth:"566px",urlForHwWalletVersionChecking:"https://version.skycoin.com/skywallet/version.txt",hwWalletDownloadUrlAndPrefix:"https://downloads.skycoin.com/skywallet/skywallet-firmware-v",hwWalletDaemonDownloadUrl:"https://www.skycoin.com/downloads/",urlForVersionChecking:"https://version.skycoin.com/skycoin/version.txt",walletDownloadUrl:"https://www.skycoin.com/downloads/",languages:[{code:"en",name:"English",iconName:"en.png"},{code:"zh",name:"\u4e2d\u6587",iconName:"zh.png"},{code:"es",name:"Espa\xf1ol",iconName:"es.png"}],defaultLanguage:"en"},NM=function(e){return e.NoInternet="NoInternet",e.Unauthorized="Unauthorized",e.ApiDisabled="ApiDisabled",e.Unknown="Unknown",e}({}),BM=function(e){return e.Success="Success",e.FailedOrRefused="FailedOrRefused",e.PinMismatch="PinMismatch",e.WithoutSeed="WithoutSeed",e.WrongPin="WrongPin",e.IncorrectHardwareWallet="IncorrectHardwareWallet",e.WrongWord="WrongWord",e.InvalidSeed="InvalidSeed",e.WrongSeed="WrongSeed",e.UndefinedError="UndefinedError",e.Disconnected="Disconnected",e.DaemonConnectionError="DaemonConnectionError",e.InvalidAddress="InvalidAddress",e.Timeout="Timeout",e.NotInBootloaderMode="NotInBootloaderMode",e.AddressGeneratorProblem="AddressGeneratorProblem",e}({}),WM=function(){return function(){}}();function VM(e){if(e.type)return e;var t=new WM;if(t.originalError=e,!e||"string"==typeof e)return t.originalServerErrorMsg=e||"",t.translatableErrorMsg=e||"service.api.unknown-error",t.type=NM.Unknown,t;t.originalServerErrorMsg=UM(e);var n=e;return null!=n.status&&(0===n.status||504===n.status?(t.type=NM.NoInternet,t.translatableErrorMsg="service.api.no-internet-error"):0===n.status||403===n.status?(t.type=NM.ApiDisabled,t.translatableErrorMsg="service.api.api-disabled-error"):400===n.status&&-1!==t.originalServerErrorMsg.toUpperCase().indexOf("Invalid password".toUpperCase())&&(t.type=NM.Unauthorized,t.translatableErrorMsg="service.api.incorrect-password-error")),t.type||(t.type=NM.Unknown,t.translatableErrorMsg=t.originalServerErrorMsg?function(e){if(!e||0===e.length)return e;var t,n,i=(n=null,(t=(t=e).toUpperCase()).includes("CHANGEADDRESS MUST NOT BE THE NULL ADDRESS")?n="null-change-address-error":t.includes("TO IS REQUIRED")?n="to-required-error":t.includes("TO.COINS MUST NOT BE ZERO")?n="zero-coins-error":t.includes("TO.ADDRESS MUST NOT BE THE NULL ADDRESS")?n="null-destination-error":t.includes("TO CONTAINS DUPLICATE VALUES")?n="duplicate-destination-error":t.includes("TO.HOURS MUST BE ZERO FOR AUTO TYPE HOURS SELECTION")?n="hours-in-automatic-mode-error":t.includes("HOURSSELECTION.MODE IS REQUIRED FOR AUTO TYPE HOURS SELECTION")?n="hours-allocation-mode-needed-error":t.includes("INVALID HOURSSELECTION.MODE")?n="invalid-hours-allocation-mode-error":t.includes("HOURSSELECTION.MODE CANNOT BE USED FOR MANUAL TYPE HOURS SELECTION")?n="hours-allocation-mode-not-needed-error":t.includes("INVALID HOURSSELECTION.TYPE")?n="invalid-hours-mode-error":t.includes("HOURSSELECTION.SHAREFACTOR MUST BE SET FOR SHARE MODE")?n="share-factor-needed-error":t.includes("HOURSSELECTION.SHAREFACTOR CAN ONLY BE USED FOR SHARE MODE")?n="share-factor-not-needed-error":t.includes("HOURSSELECTION.SHAREFACTOR MUST BE >= 0 AND <= 1")?n="invalid-share-factor-error":t.includes("TRANSACTION VIOLATES HARD CONSTRAINT: DUPLICATE OUTPUT IN TRANSACTION")?n="change-equal-to-destination-error":t.includes("FINGERPRINT CONFLICT FOR")&&(n="repeated-wallet"),n?"send.known-node-errors."+n:null);if(i)return i;if(-1!==e.indexOf('"error":'))try{e=JSON.parse(e).error.message}catch(o){}if(e.startsWith("400")||e.startsWith("403")){var r=e.split(" - ",2);e=2===r.length?r[1]:e}var a=(e=e.trim()).substr(0,1);return a.toUpperCase()!==a&&(e=a.toUpperCase()+e.substr(1,e.length-1)),e.endsWith(".")||e.endsWith(",")||e.endsWith(":")||e.endsWith(";")||e.endsWith("?")||e.endsWith("!")||(e+="."),e}(t.originalServerErrorMsg):"service.api.unknown-error"),t}function UM(e){if(e){if("string"==typeof e._body)return e._body;if(e.originalServerErrorMsg&&"string"==typeof e.originalServerErrorMsg)return e.originalServerErrorMsg;if(e.error&&"string"==typeof e.error)return e.error;if(e.error&&e.error.error&&e.error.error.message)return e.error.error.message;if(e.error&&e.error.error&&"string"==typeof e.error.error)return e.error.error;if(e.message)return e.message;if(e._body&&e._body.error)return e._body.error;try{return JSON.parse(e._body).error}catch(t){}}return null}function zM(e){window.location.assign("assets/error-alert/index.html?"+e)}function qM(e){return function(t){var n=new GM(e),i=t.lift(n);return n.caught=i}}var GM=function(){function e(t){s(this,e),this.selector=t}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new KM(e,this.selector,this.caught))}}]),e}(),KM=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,e)).selector=i,a.caught=r,a}return o(n,[{key:"error",value:function(e){if(!this.isStopped){var t;try{t=this.selector(e,this.caught)}catch(s){return void r(i(n.prototype),"error",this).call(this,s)}this._unsubscribeAndRecycle();var a=new ae(this);this.add(a);var o=se(t,a);o!==a&&this.add(o)}}}]),n}(oe),JM=function(){function e(){return Error.call(this),this.message="no elements in sequence",this.name="EmptyError",this}return e.prototype=Object.create(Error.prototype),e}();function ZM(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:QM;return function(t){return t.lift(new $M(e))}}var $M=function(){function e(t){s(this,e),this.errorFactory=t}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new XM(e,this.errorFactory))}}]),e}(),XM=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e)).errorFactory=i,r.hasValue=!1,r}return o(n,[{key:"_next",value:function(e){this.hasValue=!0,this.destination.next(e)}},{key:"_complete",value:function(){if(this.hasValue)return this.destination.complete();var e;try{e=this.errorFactory()}catch(t){e=t}this.destination.error(e)}}]),n}(A);function QM(){return new JM}function eS(e,t){var n=arguments.length>=2;return function(i){return i.pipe(e?zm(function(t,n){return e(t,n,i)}):F,zg(1),n?qk(t):ZM(function(){return new JM}))}}function tS(e,t){return ue(e,t,1)}var nS=function e(){s(this,e)},iS=function e(){s(this,e)},rS=function(){function e(t){var n=this;s(this,e),this.normalizedNames=new Map,this.lazyUpdate=null,t?this.lazyInit="string"==typeof t?function(){n.headers=new Map,t.split("\n").forEach(function(e){var t=e.indexOf(":");if(t>0){var i=e.slice(0,t),r=i.toLowerCase(),a=e.slice(t+1).trim();n.maybeSetNormalizedName(i,r),n.headers.has(r)?n.headers.get(r).push(a):n.headers.set(r,[a])}})}:function(){n.headers=new Map,Object.keys(t).forEach(function(e){var i=t[e],r=e.toLowerCase();"string"==typeof i&&(i=[i]),i.length>0&&(n.headers.set(r,i),n.maybeSetNormalizedName(e,r))})}:this.headers=new Map}return o(e,[{key:"has",value:function(e){return this.init(),this.headers.has(e.toLowerCase())}},{key:"get",value:function(e){this.init();var t=this.headers.get(e.toLowerCase());return t&&t.length>0?t[0]:null}},{key:"keys",value:function(){return this.init(),Array.from(this.normalizedNames.values())}},{key:"getAll",value:function(e){return this.init(),this.headers.get(e.toLowerCase())||null}},{key:"append",value:function(e,t){return this.clone({name:e,value:t,op:"a"})}},{key:"set",value:function(e,t){return this.clone({name:e,value:t,op:"s"})}},{key:"delete",value:function(e,t){return this.clone({name:e,value:t,op:"d"})}},{key:"maybeSetNormalizedName",value:function(e,t){this.normalizedNames.has(t)||this.normalizedNames.set(t,e)}},{key:"init",value:function(){var t=this;this.lazyInit&&(this.lazyInit instanceof e?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(function(e){return t.applyUpdate(e)}),this.lazyUpdate=null))}},{key:"copyFrom",value:function(e){var t=this;e.init(),Array.from(e.headers.keys()).forEach(function(n){t.headers.set(n,e.headers.get(n)),t.normalizedNames.set(n,e.normalizedNames.get(n))})}},{key:"clone",value:function(t){var n=new e;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof e?this.lazyInit:this,n.lazyUpdate=(this.lazyUpdate||[]).concat([t]),n}},{key:"applyUpdate",value:function(e){var t=e.name.toLowerCase();switch(e.op){case"a":case"s":var n=e.value;if("string"==typeof n&&(n=[n]),0===n.length)return;this.maybeSetNormalizedName(e.name,t);var i=("a"===e.op?this.headers.get(t):void 0)||[];i.push.apply(i,b(n)),this.headers.set(t,i);break;case"d":var r=e.value;if(r){var a=this.headers.get(t);if(!a)return;0===(a=a.filter(function(e){return-1===r.indexOf(e)})).length?(this.headers.delete(t),this.normalizedNames.delete(t)):this.headers.set(t,a)}else this.headers.delete(t),this.normalizedNames.delete(t)}}},{key:"forEach",value:function(e){var t=this;this.init(),Array.from(this.normalizedNames.keys()).forEach(function(n){return e(t.normalizedNames.get(n),t.headers.get(n))})}}]),e}(),aS=function(){function e(){s(this,e)}return o(e,[{key:"encodeKey",value:function(e){return lS(e)}},{key:"encodeValue",value:function(e){return lS(e)}},{key:"decodeKey",value:function(e){return decodeURIComponent(e)}},{key:"decodeValue",value:function(e){return decodeURIComponent(e)}}]),e}();function oS(e,t){var n=new Map;return e.length>0&&e.replace(/^\?/,"").split("&").forEach(function(e){var i=e.indexOf("="),r=_(-1==i?[t.decodeKey(e),""]:[t.decodeKey(e.slice(0,i)),t.decodeValue(e.slice(i+1))],2),a=r[0],o=r[1],s=n.get(a)||[];s.push(o),n.set(a,s)}),n}var sS=/%(\d[a-f0-9])/gi,uS={40:"@","3A":":",24:"$","2C":",","3B":";","2B":"+","3D":"=","3F":"?","2F":"/"};function lS(e){return encodeURIComponent(e).replace(sS,function(e,t){var n;return null!==(n=uS[t])&&void 0!==n?n:e})}function cS(e){return"".concat(e)}var dS=function(){function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(s(this,e),this.updates=null,this.cloneFrom=null,this.encoder=n.encoder||new aS,n.fromString){if(n.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=oS(n.fromString,this.encoder)}else n.fromObject?(this.map=new Map,Object.keys(n.fromObject).forEach(function(e){var i=n.fromObject[e];t.map.set(e,Array.isArray(i)?i:[i])})):this.map=null}return o(e,[{key:"has",value:function(e){return this.init(),this.map.has(e)}},{key:"get",value:function(e){this.init();var t=this.map.get(e);return t?t[0]:null}},{key:"getAll",value:function(e){return this.init(),this.map.get(e)||null}},{key:"keys",value:function(){return this.init(),Array.from(this.map.keys())}},{key:"append",value:function(e,t){return this.clone({param:e,value:t,op:"a"})}},{key:"appendAll",value:function(e){var t=[];return Object.keys(e).forEach(function(n){var i=e[n];Array.isArray(i)?i.forEach(function(e){t.push({param:n,value:e,op:"a"})}):t.push({param:n,value:i,op:"a"})}),this.clone(t)}},{key:"set",value:function(e,t){return this.clone({param:e,value:t,op:"s"})}},{key:"delete",value:function(e,t){return this.clone({param:e,value:t,op:"d"})}},{key:"toString",value:function(){var e=this;return this.init(),this.keys().map(function(t){var n=e.encoder.encodeKey(t);return e.map.get(t).map(function(t){return n+"="+e.encoder.encodeValue(t)}).join("&")}).filter(function(e){return""!==e}).join("&")}},{key:"clone",value:function(t){var n=new e({encoder:this.encoder});return n.cloneFrom=this.cloneFrom||this,n.updates=(this.updates||[]).concat(t),n}},{key:"init",value:function(){var e=this;null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(function(t){return e.map.set(t,e.cloneFrom.map.get(t))}),this.updates.forEach(function(t){switch(t.op){case"a":case"s":var n=("a"===t.op?e.map.get(t.param):void 0)||[];n.push(cS(t.value)),e.map.set(t.param,n);break;case"d":if(void 0===t.value){e.map.delete(t.param);break}var i=e.map.get(t.param)||[],r=i.indexOf(cS(t.value));-1!==r&&i.splice(r,1),i.length>0?e.map.set(t.param,i):e.map.delete(t.param)}}),this.cloneFrom=this.updates=null)}}]),e}(),hS=function(){function e(){s(this,e),this.map=new Map}return o(e,[{key:"set",value:function(e,t){return this.map.set(e,t),this}},{key:"get",value:function(e){return this.map.has(e)||this.map.set(e,e.defaultValue()),this.map.get(e)}},{key:"delete",value:function(e){return this.map.delete(e),this}},{key:"keys",value:function(){return this.map.keys()}}]),e}();function fS(e){return"undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer}function pS(e){return"undefined"!=typeof Blob&&e instanceof Blob}function mS(e){return"undefined"!=typeof FormData&&e instanceof FormData}var gS=function(){function e(t,n,i,r){var a;if(s(this,e),this.url=n,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=t.toUpperCase(),function(e){switch(e){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||r?(this.body=void 0!==i?i:null,a=r):a=i,a&&(this.reportProgress=!!a.reportProgress,this.withCredentials=!!a.withCredentials,a.responseType&&(this.responseType=a.responseType),a.headers&&(this.headers=a.headers),a.context&&(this.context=a.context),a.params&&(this.params=a.params)),this.headers||(this.headers=new rS),this.context||(this.context=new hS),this.params){var o=this.params.toString();if(0===o.length)this.urlWithParams=n;else{var u=n.indexOf("?");this.urlWithParams=n+(-1===u?"?":u0&&void 0!==arguments[0]?arguments[0]:{},i=n.method||this.method,r=n.url||this.url,a=n.responseType||this.responseType,o=void 0!==n.body?n.body:this.body,s=void 0!==n.withCredentials?n.withCredentials:this.withCredentials,u=void 0!==n.reportProgress?n.reportProgress:this.reportProgress,l=n.headers||this.headers,c=n.params||this.params,d=null!==(t=n.context)&&void 0!==t?t:this.context;return void 0!==n.setHeaders&&(l=Object.keys(n.setHeaders).reduce(function(e,t){return e.set(t,n.setHeaders[t])},l)),n.setParams&&(c=Object.keys(n.setParams).reduce(function(e,t){return e.set(t,n.setParams[t])},c)),new e(i,r,o,{params:c,headers:l,context:d,reportProgress:u,responseType:a,withCredentials:s})}}]),e}(),vS=function(e){return e[e.Sent=0]="Sent",e[e.UploadProgress=1]="UploadProgress",e[e.ResponseHeader=2]="ResponseHeader",e[e.DownloadProgress=3]="DownloadProgress",e[e.Response=4]="Response",e[e.User=5]="User",e}({}),_S=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:200,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"OK";s(this,e),this.headers=t.headers||new rS,this.status=void 0!==t.status?t.status:n,this.statusText=t.statusText||i,this.url=t.url||null,this.ok=this.status>=200&&this.status<300},yS=function(e){l(n,e);var t=p(n);function n(){var e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return s(this,n),(e=t.call(this,i)).type=vS.ResponseHeader,e}return o(n,[{key:"clone",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return new n({headers:e.headers||this.headers,status:void 0!==e.status?e.status:this.status,statusText:e.statusText||this.statusText,url:e.url||this.url||void 0})}}]),n}(_S),bS=function(e){l(n,e);var t=p(n);function n(){var e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return s(this,n),(e=t.call(this,i)).type=vS.Response,e.body=void 0!==i.body?i.body:null,e}return o(n,[{key:"clone",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return new n({body:void 0!==e.body?e.body:this.body,headers:e.headers||this.headers,status:void 0!==e.status?e.status:this.status,statusText:e.statusText||this.statusText,url:e.url||this.url||void 0})}}]),n}(_S),wS=function(e){l(n,e);var t=p(n);function n(e){var i;return s(this,n),(i=t.call(this,e,0,"Unknown Error")).name="HttpErrorResponse",i.ok=!1,i.message=i.status>=200&&i.status<300?"Http failure during parsing for ".concat(e.url||"(unknown url)"):"Http failure response for ".concat(e.url||"(unknown url)",": ").concat(e.status," ").concat(e.statusText),i.error=e.error||null,i}return n}(_S);function kS(e,t){return{body:t,headers:e.headers,context:e.context,observe:e.observe,params:e.params,reportProgress:e.reportProgress,responseType:e.responseType,withCredentials:e.withCredentials}}var MS=function(){var e=function(){function e(t){s(this,e),this.handler=t}return o(e,[{key:"request",value:function(e,t){var n,i=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e instanceof gS)n=e;else{var a=void 0;a=r.headers instanceof rS?r.headers:new rS(r.headers);var o=void 0;r.params&&(o=r.params instanceof dS?r.params:new dS({fromObject:r.params})),n=new gS(e,t,void 0!==r.body?r.body:null,{headers:a,context:r.context,params:o,reportProgress:r.reportProgress,responseType:r.responseType||"json",withCredentials:r.withCredentials})}var s=bm(n).pipe(tS(function(e){return i.handler.handle(e)}));if(e instanceof gS||"events"===r.observe)return s;var u=s.pipe(zm(function(e){return e instanceof bS}));switch(r.observe||"body"){case"body":switch(n.responseType){case"arraybuffer":return u.pipe(K(function(e){if(null!==e.body&&!(e.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return e.body}));case"blob":return u.pipe(K(function(e){if(null!==e.body&&!(e.body instanceof Blob))throw new Error("Response is not a Blob.");return e.body}));case"text":return u.pipe(K(function(e){if(null!==e.body&&"string"!=typeof e.body)throw new Error("Response is not a string.");return e.body}));case"json":default:return u.pipe(K(function(e){return e.body}))}case"response":return u;default:throw new Error("Unreachable: unhandled observe type ".concat(r.observe,"}"))}}},{key:"delete",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("DELETE",e,t)}},{key:"get",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("GET",e,t)}},{key:"head",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("HEAD",e,t)}},{key:"jsonp",value:function(e,t){return this.request("JSONP",e,{params:(new dS).append(t,"JSONP_CALLBACK"),observe:"body",responseType:"json"})}},{key:"options",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.request("OPTIONS",e,t)}},{key:"patch",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.request("PATCH",e,kS(n,t))}},{key:"post",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.request("POST",e,kS(n,t))}},{key:"put",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.request("PUT",e,kS(n,t))}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(nS))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),SS=function(){function e(t,n){s(this,e),this.next=t,this.interceptor=n}return o(e,[{key:"handle",value:function(e){return this.interceptor.intercept(e,this.next)}}]),e}(),CS=new Mi("HTTP_INTERCEPTORS"),LS=function(){var e=function(){function e(){s(this,e)}return o(e,[{key:"intercept",value:function(e,t){return t.handle(e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),xS=/^\)\]\}',?\n/,TS=function(){var e=function(){function e(t){s(this,e),this.xhrFactory=t}return o(e,[{key:"handle",value:function(e){var t=this;if("JSONP"===e.method)throw new Error("Attempted to construct Jsonp request without HttpClientJsonpModule installed.");return new N(function(n){var i=t.xhrFactory.build();if(i.open(e.method,e.urlWithParams),e.withCredentials&&(i.withCredentials=!0),e.headers.forEach(function(e,t){return i.setRequestHeader(e,t.join(","))}),e.headers.has("Accept")||i.setRequestHeader("Accept","application/json, text/plain, */*"),!e.headers.has("Content-Type")){var r=e.detectContentTypeHeader();null!==r&&i.setRequestHeader("Content-Type",r)}if(e.responseType){var a=e.responseType.toLowerCase();i.responseType="json"!==a?a:"text"}var o=e.serializeBody(),s=null,u=function(){if(null!==s)return s;var t=1223===i.status?204:i.status,n=i.statusText||"OK",r=new rS(i.getAllResponseHeaders()),a=function(e){return"responseURL"in e&&e.responseURL?e.responseURL:/^X-Request-URL:/m.test(e.getAllResponseHeaders())?e.getResponseHeader("X-Request-URL"):null}(i)||e.url;return s=new yS({headers:r,status:t,statusText:n,url:a})},l=function(){var t=u(),r=t.headers,a=t.status,o=t.statusText,s=t.url,l=null;204!==a&&(l=void 0===i.response?i.responseText:i.response),0===a&&(a=l?200:0);var c=a>=200&&a<300;if("json"===e.responseType&&"string"==typeof l){var d=l;l=l.replace(xS,"");try{l=""!==l?JSON.parse(l):null}catch(h){l=d,c&&(c=!1,l={error:h,text:l})}}c?(n.next(new bS({body:l,headers:r,status:a,statusText:o,url:s||void 0})),n.complete()):n.error(new wS({error:l,headers:r,status:a,statusText:o,url:s||void 0}))},c=function(e){var t=u(),r=new wS({error:e,status:i.status||0,statusText:i.statusText||"Unknown Error",url:t.url||void 0});n.error(r)},d=!1,h=function(t){d||(n.next(u()),d=!0);var r={type:vS.DownloadProgress,loaded:t.loaded};t.lengthComputable&&(r.total=t.total),"text"===e.responseType&&i.responseText&&(r.partialText=i.responseText),n.next(r)},f=function(e){var t={type:vS.UploadProgress,loaded:e.loaded};e.lengthComputable&&(t.total=e.total),n.next(t)};return i.addEventListener("load",l),i.addEventListener("error",c),i.addEventListener("timeout",c),i.addEventListener("abort",c),e.reportProgress&&(i.addEventListener("progress",h),null!==o&&i.upload&&i.upload.addEventListener("progress",f)),i.send(o),n.next({type:vS.Sent}),function(){i.removeEventListener("error",c),i.removeEventListener("abort",c),i.removeEventListener("load",l),i.removeEventListener("timeout",c),e.reportProgress&&(i.removeEventListener("progress",h),null!==o&&i.upload&&i.upload.removeEventListener("progress",f)),i.readyState!==i.DONE&&i.abort()}})}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(Ph))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),DS=new Mi("XSRF_COOKIE_NAME"),OS=new Mi("XSRF_HEADER_NAME"),ES=function e(){s(this,e)},YS=function(){var e=function(){function e(t,n,i){s(this,e),this.doc=t,this.platform=n,this.cookieName=i,this.lastCookieString="",this.lastToken=null,this.parseCount=0}return o(e,[{key:"getToken",value:function(){if("server"===this.platform)return null;var e=this.doc.cookie||"";return e!==this.lastCookieString&&(this.parseCount++,this.lastToken=rh(e,this.cookieName),this.lastCookieString=e),this.lastToken}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(yd),Bi(kc),Bi(DS))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),PS=function(){var e=function(){function e(t,n){s(this,e),this.tokenService=t,this.headerName=n}return o(e,[{key:"intercept",value:function(e,t){var n=e.url.toLowerCase();if("GET"===e.method||"HEAD"===e.method||n.startsWith("http://")||n.startsWith("https://"))return t.handle(e);var i=this.tokenService.getToken();return null===i||e.headers.has(this.headerName)||(e=e.clone({headers:e.headers.set(this.headerName,i)})),t.handle(e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(ES),Bi(OS))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),AS=function(){var e=function(){function e(t,n){s(this,e),this.backend=t,this.injector=n,this.chain=null}return o(e,[{key:"handle",value:function(e){if(null===this.chain){var t=this.injector.get(CS,[]);this.chain=t.reduceRight(function(e,t){return new SS(e,t)},this.backend)}return this.chain.handle(e)}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(iS),Bi(qo))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),IS=function(){var e=function(){function e(){s(this,e)}return o(e,null,[{key:"disable",value:function(){return{ngModule:e,providers:[{provide:PS,useClass:LS}]}}},{key:"withOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{ngModule:e,providers:[t.cookieName?{provide:DS,useValue:t.cookieName}:[],t.headerName?{provide:OS,useValue:t.headerName}:[]]}}}]),e}();return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[PS,{provide:CS,useExisting:PS,multi:!0},{provide:ES,useClass:YS},{provide:DS,useValue:"XSRF-TOKEN"},{provide:OS,useValue:"X-XSRF-TOKEN"}]}),e}(),RS=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[MS,{provide:nS,useClass:AS},TS,{provide:iS,useExisting:TS}],imports:[[IS.withOptions({cookieName:"XSRF-TOKEN",headerName:"X-XSRF-TOKEN"})]]}),e}(),FS="w4bxe2tbf9beb72r",HS=function(){function e(e){this.http=e,this.url="/api/"}return e.prototype.get=function(e,t,n){var i=this;return void 0===t&&(t=null),void 0===n&&(n=null),n=n?Object.assign(this.createDefaultRequestOptions(),n):this.createDefaultRequestOptions(),this.http.get(this.getUrl(e,t,n.useV2),this.returnRequestOptions(n,null)).pipe(qM(function(e){return i.processConnectionError(e)}))},e.prototype.post=function(e,t,n){var i=this;return void 0===t&&(t=null),void 0===n&&(n=null),n=n?Object.assign(this.createDefaultRequestOptions(),n):this.createDefaultRequestOptions(),this.getCsrf().pipe(eS(),ue(function(r){return n.useV2&&(n.sendDataAsJson=!0),i.http.post(i.getUrl(e,null,n.useV2),n.sendDataAsJson?t?JSON.stringify(t):"":i.getQueryString(t),i.returnRequestOptions(n,r)).pipe(qM(function(e){return i.processConnectionError(e)}))}))},e.prototype.createDefaultRequestOptions=function(){return{useV2:!1,sendDataAsJson:!1}},e.prototype.getCsrf=function(){return this.get("csrf").pipe(K(function(e){return e.csrf_token}))},e.prototype.returnRequestOptions=function(e,t){var n={};return n.headers=new rS,n.headers=n.headers.append("Content-Type",e.sendDataAsJson?"application/json":"application/x-www-form-urlencoded"),t&&(n.headers=n.headers.append("X-CSRF-Token",t)),n},e.prototype.getQueryString=function(e){return void 0===e&&(e=null),e?Object.keys(e).reduce(function(t,n){return t.push(n+"="+encodeURIComponent(e[n])),t},[]).join("&"):""},e.prototype.getUrl=function(e,t,n){return void 0===t&&(t=null),void 0===n&&(n=!1),e.startsWith("/")&&(e=e.substr(1,e.length-1)),this.url+(n?"v2/":"v1/")+e+"?"+this.getQueryString(t)},e.prototype.processConnectionError=function(e){return sg(VM(e))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(MS))}}),e}(),jS=function(){function e(e,t){this.apiService=e,this.http=t,this.csrfDisabledInternal=!1,this.fullCoinNameInternal=" ",this.coinNameInternal=" ",this.hoursNameInternal=" ",this.hoursNameSingularInternal=" ",this.explorerUrlInternal=" ",this.currentMaxDecimalsInternal=6,this.burnRateInternal=new CM.BigNumber(2),this.updateAvailableInternal=!1,this.lastestVersionInternal="",this.uriSpecificatioPrefixInternal=""}return Object.defineProperty(e.prototype,"csrfDisabled",{get:function(){return this.csrfDisabledInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"nodeVersion",{get:function(){return this.nodeVersionInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"fullCoinName",{get:function(){return this.fullCoinNameInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"coinName",{get:function(){return this.coinNameInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hoursName",{get:function(){return this.hoursNameInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hoursNameSingular",{get:function(){return this.hoursNameSingularInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"explorerUrl",{get:function(){return this.explorerUrlInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentMaxDecimals",{get:function(){return this.currentMaxDecimalsInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"burnRate",{get:function(){return this.burnRateInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"updateAvailable",{get:function(){return this.updateAvailableInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"lastestVersion",{get:function(){return this.lastestVersionInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"uriSpecificatioPrefix",{get:function(){return this.uriSpecificatioPrefixInternal},enumerable:!1,configurable:!0}),e.prototype.UpdateData=function(){var e=this;this.apiService.get("health").subscribe(function(t){e.nodeVersionInternal=t.version.version,e.burnRateInternal=new CM.BigNumber(t.user_verify_transaction.burn_factor),e.currentMaxDecimalsInternal=t.user_verify_transaction.max_decimals,e.detectUpdateAvailable(),e.fullCoinNameInternal=t.fiber.display_name,e.coinNameInternal=t.fiber.ticker,e.hoursNameInternal=t.fiber.coin_hours_display_name,e.hoursNameSingularInternal=t.fiber.coin_hours_display_name_singular,e.explorerUrlInternal=t.fiber.explorer_url,e.uriSpecificatioPrefixInternal=t.fiber.qr_uri_prefix,e.explorerUrlInternal.endsWith("/")&&(e.explorerUrlInternal=e.explorerUrlInternal.substr(0,e.explorerUrl.length-1)),t.csrf_enabled||(e.csrfDisabledInternal=!0)},function(){return zM(2)})},e.prototype.detectUpdateAvailable=function(){var e=this;jM.urlForVersionChecking&&this.http.get(jM.urlForVersionChecking,{responseType:"text"}).pipe(xM(function(e){return e.pipe(EM(3e4))})).subscribe(function(t){e.lastestVersionInternal=t.trim(),e.lastestVersionInternal.startsWith("v")&&(e.lastestVersionInternal=e.lastestVersionInternal.substr(1)),e.updateAvailableInternal=function(e,t){for(var n=t.split("."),i=e.split("-"),r=i[0].split("."),a=0;a<3;a++){var o=Number(n[a]),s=Number(r[a]);if(o>s)return!0;if(o2&&void 0!==arguments[2]?arguments[2]:Fm;return function(i){var r=OM(e),a=r?+e-n.now():Math.abs(e);return i.lift(new dC(a,r,t,n))}}var dC=function(){function e(t,n,i,r){s(this,e),this.waitFor=t,this.absoluteTimeout=n,this.withObservable=i,this.scheduler=r}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new hC(e,this.absoluteTimeout,this.waitFor,this.withObservable,this.scheduler))}}]),e}(),hC=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o){var u;return s(this,n),(u=t.call(this,e)).absoluteTimeout=i,u.waitFor=r,u.withObservable=a,u.scheduler=o,u.scheduleTimeout(),u}return o(n,[{key:"scheduleTimeout",value:function(){var e=this.action;e?this.action=e.schedule(this,this.waitFor):this.add(this.action=this.scheduler.schedule(n.dispatchTimeout,this.waitFor,this))}},{key:"_next",value:function(e){this.absoluteTimeout||this.scheduleTimeout(),r(i(n.prototype),"_next",this).call(this,e)}},{key:"_unsubscribe",value:function(){this.action=void 0,this.scheduler=null,this.withObservable=null}}],[{key:"dispatchTimeout",value:function(e){var t=e.withObservable;e._unsubscribeAndRecycle(),e.add(se(t,new ae(e)))}}]),n}(oe),fC=function(){function e(e){this.dialog=e}return Object.defineProperty(e.prototype,"requestWordComponent",{set:function(e){this.requestWordComponentInternal=e},enumerable:!1,configurable:!0}),e.prototype.requestWord=function(){return this.requestWordComponentInternal.openDialog(this.dialog,{reason:"HWWalletOperation"}).afterClosed().pipe(K(function(e){return e}))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(Pk))}}),e}(),pC=function(){function e(e,t,n,i){this.http=e,this.hwWalletPinService=t,this.hwWalletSeedWordService=n,this.ngZone=i,this.url="http://127.0.0.1:9510/api/v1/",this.timeoutMs=55e3,this.connectionEventSubject=new Rv(!1),this.hwConnected=!1,this.disconnectedChecks=0,this.maxFastDisconnectedChecks=32,this.updatePeriod=1e4,this.fastUpdatePeriod=2e3}return Object.defineProperty(e.prototype,"connectionEvent",{get:function(){return this.connectionEventSubject.asObservable()},enumerable:!1,configurable:!0}),e.prototype.get=function(e){return this.checkResponse(this.http.get(this.getUrl(e),this.returnRequestOptions()),e.includes("/available"))},e.prototype.post=function(e,t){return void 0===t&&(t=null),t||(t={}),this.checkResponse(this.http.post(this.getUrl(e),JSON.stringify(t),this.returnRequestOptions()))},e.prototype.put=function(e,t,n){return void 0===t&&(t=null),void 0===n&&(n=!1),this.checkResponse(this.http.put(this.getUrl(e),t,this.returnRequestOptions(n)),!1)},e.prototype.delete=function(e){return this.checkResponse(this.http.delete(this.getUrl(e),this.returnRequestOptions()))},e.prototype.checkResponse=function(e,t){var n=this;return void 0===t&&(t=!1),e.pipe(function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Fm;return cC(e,sg(new lC),t)}(this.timeoutMs),ue(function(e){return e.data&&e.data.length&&1===e.data.length&&(e.data=e.data[0]),t?n.ngZone.run(function(){return n.updateHwConnected(!!e.data)}):n.updateHwConnected(!0),"string"==typeof e.data&&-1!==e.data.indexOf("PinMatrixRequest")?n.hwWalletPinService.requestPin().pipe(ue(function(e){return e?n.post("/intermediate/pin_matrix",{pin:e}):n.put("/cancel").pipe(ue(function(){var e=new WM;return e.originalError=null,e.originalServerErrorMsg="",e.type=BM.FailedOrRefused,e.translatableErrorMsg=n.getHardwareWalletErrorMsg(e.type),sg(e)}))})):"string"==typeof e.data&&-1!==e.data.indexOf("WordRequest")?n.hwWalletSeedWordService.requestWord().pipe(ue(function(e){return e?n.post("/intermediate/word",{word:e}):n.put("/cancel").pipe(ue(function(){var e=new WM;return e.originalError=null,e.originalServerErrorMsg="",e.type=BM.FailedOrRefused,e.translatableErrorMsg=n.getHardwareWalletErrorMsg(e.type),sg(e)}))})):"string"==typeof e.data&&-1!==e.data.indexOf("ButtonRequest")?n.post("/intermediate/button"):bm(e)}),qM(function(e){if(e.type)return sg(e);var t=new WM;return t.originalError=e,e&&e.name&&"TimeoutError"===e.name?(n.put("/cancel").subscribe(),t.originalServerErrorMsg=e.name,t.type=BM.Timeout,t.translatableErrorMsg=n.getHardwareWalletErrorMsg(t.type),sg(t)):null==e.status||0!==e.status&&504!==e.status?(t.originalServerErrorMsg=UM(e),t.type=n.getHardwareWalletErrorType(t.originalServerErrorMsg),t.translatableErrorMsg=n.getHardwareWalletErrorMsg(t.type),sg(t)):(t.originalServerErrorMsg=UM(e),t.type=BM.DaemonConnectionError,t.translatableErrorMsg=n.getHardwareWalletErrorMsg(t.type),sg(t))}))},e.prototype.returnRequestOptions=function(e){void 0===e&&(e=!1);var t={};return t.headers=new rS,e||(t.headers=t.headers.append("Content-Type","application/json")),t},e.prototype.checkHw=function(e){var t=this;this.checkHwSubscription&&this.checkHwSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){t.checkHwSubscription=bm(1).pipe(EM(e?t.hwConnected||t.disconnectedChecks*,.mat-flat-button .mat-button-wrapper>*,.mat-stroked-button .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*{vertical-align:middle}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button{display:inline-flex;justify-content:center;align-items:center;font-size:inherit;width:2.5em;height:2.5em}.cdk-high-contrast-active .mat-button,.cdk-high-contrast-active .mat-flat-button,.cdk-high-contrast-active .mat-raised-button,.cdk-high-contrast-active .mat-icon-button,.cdk-high-contrast-active .mat-fab,.cdk-high-contrast-active .mat-mini-fab{outline:solid 1px}.cdk-high-contrast-active .mat-button-base.cdk-keyboard-focused,.cdk-high-contrast-active .mat-button-base.cdk-program-focused{outline:solid 3px}\n"],encapsulation:2,changeDetection:0}),e}(),CC=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[ik,jw],jw]}),e}();function LC(e){return function(t){return t.lift(new xC(e))}}var xC=function(){function e(t){s(this,e),this.callback=t}return o(e,[{key:"call",value:function(e,t){return t.subscribe(new TC(e,this.callback))}}]),e}(),TC=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e)).add(new x(i)),r}return n}(A),DC=["*"];function OC(e){return Error('Unable to find icon with the name "'.concat(e,'"'))}function EC(e){return Error("The URL provided to MatIconRegistry was not trusted as a resource URL "+"via Angular's DomSanitizer. Attempted URL was \"".concat(e,'".'))}function YC(e){return Error("The literal provided to MatIconRegistry was not trusted as safe HTML by "+"Angular's DomSanitizer. Attempted literal was \"".concat(e,'".'))}var PC=function e(t,n,i){s(this,e),this.url=t,this.svgText=n,this.options=i},AC=function(){var e=function(){function e(t,n,i,r){s(this,e),this._httpClient=t,this._sanitizer=n,this._errorHandler=r,this._svgIconConfigs=new Map,this._iconSetConfigs=new Map,this._cachedIconsByUrl=new Map,this._inProgressUrlFetches=new Map,this._fontCssClassesByAlias=new Map,this._resolvers=[],this._defaultFontSetClass="material-icons",this._document=i}return o(e,[{key:"addSvgIcon",value:function(e,t,n){return this.addSvgIconInNamespace("",e,t,n)}},{key:"addSvgIconLiteral",value:function(e,t,n){return this.addSvgIconLiteralInNamespace("",e,t,n)}},{key:"addSvgIconInNamespace",value:function(e,t,n,i){return this._addSvgIconConfig(e,t,new PC(n,null,i))}},{key:"addSvgIconResolver",value:function(e){return this._resolvers.push(e),this}},{key:"addSvgIconLiteralInNamespace",value:function(e,t,n,i){var r=this._sanitizer.sanitize(Er.HTML,n);if(!r)throw YC(n);return this._addSvgIconConfig(e,t,new PC("",r,i))}},{key:"addSvgIconSet",value:function(e,t){return this.addSvgIconSetInNamespace("",e,t)}},{key:"addSvgIconSetLiteral",value:function(e,t){return this.addSvgIconSetLiteralInNamespace("",e,t)}},{key:"addSvgIconSetInNamespace",value:function(e,t,n){return this._addSvgIconSetConfig(e,new PC(t,null,n))}},{key:"addSvgIconSetLiteralInNamespace",value:function(e,t,n){var i=this._sanitizer.sanitize(Er.HTML,t);if(!i)throw YC(t);return this._addSvgIconSetConfig(e,new PC("",i,n))}},{key:"registerFontClassAlias",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;return this._fontCssClassesByAlias.set(e,t),this}},{key:"classNameForFontAlias",value:function(e){return this._fontCssClassesByAlias.get(e)||e}},{key:"setDefaultFontSetClass",value:function(e){return this._defaultFontSetClass=e,this}},{key:"getDefaultFontSetClass",value:function(){return this._defaultFontSetClass}},{key:"getSvgIconFromUrl",value:function(e){var t=this,n=this._sanitizer.sanitize(Er.RESOURCE_URL,e);if(!n)throw EC(e);var i=this._cachedIconsByUrl.get(n);return i?bm(IC(i)):this._loadSvgIconFromConfig(new PC(e,null)).pipe(Hv(function(e){return t._cachedIconsByUrl.set(n,e)}),K(function(e){return IC(e)}))}},{key:"getNamedSvgIcon",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=RC(t,e),i=this._svgIconConfigs.get(n);if(i)return this._getSvgFromConfig(i);if(i=this._getIconConfigFromResolvers(t,e))return this._svgIconConfigs.set(n,i),this._getSvgFromConfig(i);var r=this._iconSetConfigs.get(t);return r?this._getSvgFromIconSetConfigs(e,r):sg(OC(n))}},{key:"ngOnDestroy",value:function(){this._resolvers=[],this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}},{key:"_getSvgFromConfig",value:function(e){return e.svgText?bm(IC(this._svgElementFromConfig(e))):this._loadSvgIconFromConfig(e).pipe(K(function(e){return IC(e)}))}},{key:"_getSvgFromIconSetConfigs",value:function(e,t){var n=this,i=this._extractIconWithNameFromAnySet(e,t);return i?bm(i):yf(t.filter(function(e){return!e.svgText}).map(function(e){return n._loadSvgIconSetFromConfig(e).pipe(qM(function(t){var i=n._sanitizer.sanitize(Er.RESOURCE_URL,e.url),r="Loading icon set URL: ".concat(i," failed: ").concat(t.message);return n._errorHandler.handleError(new Error(r)),bm(null)}))})).pipe(K(function(){var i=n._extractIconWithNameFromAnySet(e,t);if(!i)throw OC(e);return i}))}},{key:"_extractIconWithNameFromAnySet",value:function(e,t){for(var n=t.length-1;n>=0;n--){var i=t[n];if(i.svgText&&i.svgText.indexOf(e)>-1){var r=this._svgElementFromConfig(i),a=this._extractSvgIconFromSet(r,e,i.options);if(a)return a}}return null}},{key:"_loadSvgIconFromConfig",value:function(e){var t=this;return this._fetchIcon(e).pipe(Hv(function(t){return e.svgText=t}),K(function(){return t._svgElementFromConfig(e)}))}},{key:"_loadSvgIconSetFromConfig",value:function(e){return e.svgText?bm(null):this._fetchIcon(e).pipe(Hv(function(t){return e.svgText=t}))}},{key:"_extractSvgIconFromSet",value:function(e,t,n){var i=e.querySelector('[id="'.concat(t,'"]'));if(!i)return null;var r=i.cloneNode(!0);if(r.removeAttribute("id"),"svg"===r.nodeName.toLowerCase())return this._setSvgAttributes(r,n);if("symbol"===r.nodeName.toLowerCase())return this._setSvgAttributes(this._toSvgElement(r),n);var a=this._svgElementFromString("");return a.appendChild(r),this._setSvgAttributes(a,n)}},{key:"_svgElementFromString",value:function(e){var t=this._document.createElement("DIV");t.innerHTML=e;var n=t.querySelector("svg");if(!n)throw Error(" tag not found");return n}},{key:"_toSvgElement",value:function(e){for(var t=this._svgElementFromString(""),n=e.attributes,i=0;i0&&t<10?this.addNumber(t.toString()):8===e.keyCode?this.removeNumber():13===e.keyCode&&this.sendPin()},t.prototype.addNumber=function(e){var t=this.form.value.pin;t.length<8&&this.form.get("pin").setValue(t+e)},t.prototype.removeNumber=function(){var e=this.form.value.pin;this.form.get("pin").setValue(e.substring(0,e.length-1))},t.prototype.sendPin=function(){this.form.valid&&this.dialogRef.close(this.form.value.pin)},t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(fm),ps(Pk),ps(gC))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-pin-dialog"]],hostBindings:function(e,t){1&e&&xs("keyup",function(e){return t.keyEvent(e)},!1,Br)},features:[Ko],decls:90,vars:24,consts:[[3,"headline","dialog"],[3,"formGroup"],[1,"form-field","text-center"],[4,"ngIf"],[1,"link",3,"click"],["formControlName","pin","id","pin","type","password","readonly",""],[1,"light-button-theme"],[1,"num-pad-row"],["mat-button","","color","primary",3,"click"],[1,"material-icons"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n\n "),ru(3,"\n "),vs(4,"div",1),ru(5,"\n "),vs(6,"div",2),ru(7,"\n "),vs(8,"div"),ru(9,"\n "),hs(10,$C,3,3,"span",3),ru(11,"\n "),hs(12,XC,3,3,"span",3),ru(13,"\n "),hs(14,QC,3,3,"span",3),ru(15,"\n "),vs(16,"span",4),xs("click",function(){return t.openHelp()}),ru(17),Wl(18,"translate"),_s(),ru(19,"\n "),_s(),ru(20,"\n "),ys(21,"input",5),ru(22,"\n "),_s(),ru(23,"\n "),_s(),ru(24,"\n\n "),ru(25,"\n "),vs(26,"div",6),ru(27,"\n "),vs(28,"div",7),ru(29,"\n "),vs(30,"button",8),xs("click",function(){return t.addNumber("7")}),vs(31,"span"),ru(32),_s(),_s(),ru(33,"\n "),vs(34,"button",8),xs("click",function(){return t.addNumber("8")}),vs(35,"span"),ru(36),_s(),_s(),ru(37,"\n "),vs(38,"button",8),xs("click",function(){return t.addNumber("9")}),vs(39,"span"),ru(40),_s(),_s(),ru(41,"\n "),_s(),ru(42,"\n "),vs(43,"div",7),ru(44,"\n "),vs(45,"button",8),xs("click",function(){return t.addNumber("4")}),vs(46,"span"),ru(47),_s(),_s(),ru(48,"\n "),vs(49,"button",8),xs("click",function(){return t.addNumber("5")}),vs(50,"span"),ru(51),_s(),_s(),ru(52,"\n "),vs(53,"button",8),xs("click",function(){return t.addNumber("6")}),vs(54,"span"),ru(55),_s(),_s(),ru(56,"\n "),_s(),ru(57,"\n "),vs(58,"div",7),ru(59,"\n "),vs(60,"button",8),xs("click",function(){return t.addNumber("1")}),vs(61,"span"),ru(62),_s(),_s(),ru(63,"\n "),vs(64,"button",8),xs("click",function(){return t.addNumber("2")}),vs(65,"span"),ru(66),_s(),_s(),ru(67,"\n "),vs(68,"button",8),xs("click",function(){return t.addNumber("3")}),vs(69,"span"),ru(70),_s(),_s(),ru(71,"\n "),_s(),ru(72,"\n "),vs(73,"div",7),ru(74,"\n "),vs(75,"button",8),xs("click",function(){return t.removeNumber()}),vs(76,"span",9),ru(77,"backspace"),_s(),_s(),ru(78,"\n "),_s(),ru(79,"\n "),_s(),ru(80,"\n\n "),ru(81,"\n "),vs(82,"div",10),ru(83,"\n "),vs(84,"app-button",11),xs("action",function(){return t.sendPin()}),ru(85),Wl(86,"translate"),_s(),ru(87,"\n "),_s(),ru(88,"\n"),_s(),ru(89,"\n")),2&e&&(ms("headline",Vl(1,18,t.title))("dialog",t.dialogRef),Ya(4),ms("formGroup",t.form),Ya(6),ms("ngIf",t.data.signingTx&&!t.data.changingPin),Ya(2),ms("ngIf",t.data.changingPin&&t.data.changePinState===t.changePinStates.RequestingNewPin),Ya(2),ms("ngIf",!(t.data.signingTx||t.data.changingPin&&t.data.changePinState===t.changePinStates.RequestingNewPin)),Ya(3),au(Vl(18,20,"hardware-wallet.enter-pin.help")),Ya(15),au(t.buttonsContent),Ya(4),au(t.buttonsContent),Ya(4),au(t.buttonsContent),Ya(7),au(t.buttonsContent),Ya(4),au(t.buttonsContent),Ya(4),au(t.buttonsContent),Ya(7),au(t.buttonsContent),Ya(4),au(t.buttonsContent),Ya(4),au(t.buttonsContent),Ya(14),ms("disabled",!t.form.valid),Ya(1),ou("\n ",Vl(86,22,"common.continue-button"),"\n "))},directives:[jk,ap,jp,lh,Lf,rp,qp,SC,ZC],pipes:[hM],styles:["mat-form-field[_ngcontent-%COMP%]{width:100%}.form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{font-size:25px;line-height:1;letter-spacing:15px;text-align:center;margin-top:5px}.num-pad-row[_ngcontent-%COMP%]{display:flex}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{flex-grow:1;height:50px;border:1px solid rgba(30,34,39,.05);margin:2px}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#1e2227}"]}),t}(yC),tL=function(e){function t(t,n,i){var r=e.call(this,i,n)||this;return r.data=t,r.dialogRef=n,r}return vf(t,e),t.openDialog=function(e,n){var i=new wk;return i.data=n,i.autoFocus=!1,i.width="600px",e.open(t,i)},t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(gC))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-confirm-tx-dialog"]],features:[Ko],decls:9,vars:13,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","lowerText","icon","outputsList"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),ys(4,"app-hw-message",1),Wl(5,"translate"),Wl(6,"translate"),ru(7,"\n"),_s(),ru(8,"\n")),2&e&&(ms("headline",Vl(1,7,"hardware-wallet.create-tx.title"))("dialog",t.dialogRef)("disableDismiss",!0),Ya(4),ms("text",Vl(5,9,"hardware-wallet.create-tx.upper-text"))("lowerText",Vl(6,11,"hardware-wallet.create-tx.lower-text"))("icon",t.msgIcons.Confirm)("outputsList",t.data))},directives:[jk,oC],pipes:[hM],styles:[""]}),t}(yC),nL=function(){function e(){this.lastSearchTerm="",this.searchRequestSubject=new z,this.wordMap=new Map}return Object.defineProperty(e.prototype,"searchResults",{get:function(){var e=this;return this.searchRequestSubject.asObservable().pipe(Bv(100),K(function(t){return t.length>1&&e.wordList?e.wordList.filter(function(e){return e.startsWith(t)}):[]}))},enumerable:!1,configurable:!0}),e.prototype.initialize=function(){var e=this;re(n(69769)("./bip39-word-list.json")).subscribe(function(t){e.wordList=t.list,e.wordList.forEach(function(t){e.wordMap.set(t,!0)}),e.searchRequestSubject.next(e.lastSearchTerm)})},e.prototype.setSearchTerm=function(e){this.lastSearchTerm=e,this.wordList&&this.searchRequestSubject.next(e)},e.prototype.validateWord=function(e){return this.wordList?!!this.wordMap.has(e):null},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)}}),e}();function iL(e,t){if(1&e&&(vs(0,"div",9),vs(1,"mat-icon"),ru(2),_s(),_s()),2&e){var n=Ys(2);Ya(2),au(n.config.icon)}}function rL(e,t){if(1&e&&(vs(0,"div",10),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys(2);Ya(1),au(Vl(2,1,n.config.title))}}function aL(e,t){if(1&e&&(vs(0,"a",11),ru(1),_s()),2&e){var n=Ys(2);ms("href",n.config.link,Pr),Ya(1),au(n.config.link)}}function oL(e,t){if(1&e){var n=Ms();vs(0,"div",1),ru(1,"\n "),vs(2,"div"),ru(3,"\n "),hs(4,iL,3,1,"div",2),ru(5,"\n "),vs(6,"div",3),ru(7,"\n "),hs(8,rL,3,3,"div",4),ru(9,"\n "),vs(10,"div",5),ru(11),Wl(12,"translate"),hs(13,aL,2,2,"a",6),_s(),ru(14,"\n "),_s(),ru(15,"\n "),vs(16,"div",7),vs(17,"mat-icon",8),xs("click",function(){return on(n),Ys().hide()}),ru(18,"close"),_s(),_s(),ru(19,"\n "),_s(),ru(20,"\n"),_s()}if(2&e){var i=Ys();Ya(2),Js(Ei,Gs,"internal-container "+(i.config.color?i.config.color:"red-background"),!0),Ya(2),ms("ngIf",i.config.icon),Ya(4),ms("ngIf",i.config.title),Ya(3),ou("",Vl(12,6,i.config.text),"\n "),Ya(2),ms("ngIf",i.config.link)}}var sL=function(e){return e.Error="error",e.Done="done",e.Warning="warning",e}({}),uL=function(e){return e.Red="red-background",e.Green="green-background",e.Yellow="yellow-background",e}({}),lL=function(){return function(){}}(),cL=function(){function e(){this.config=new lL,this.visible=!1}return e.prototype.show=function(){var e=this;this.visible?(this.visible=!1,setTimeout(function(){return e.visible=!0},32)):this.visible=!0},e.prototype.hide=function(){this.visible=!1},e.\u0275fac=function(t){return new(t||e)},e.\u0275cmp=ft({type:e,selectors:[["app-msg-bar"]],decls:2,vars:1,consts:[["class","main-container",4,"ngIf"],[1,"main-container"],["class","icon-container",4,"ngIf"],[1,"text-container"],["class","title",4,"ngIf"],[1,"text"],["class","link","target","_blank","rel","noreferrer nofollow noopener",3,"href",4,"ngIf"],[1,"close-container"],[1,"image-button",3,"click"],[1,"icon-container"],[1,"title"],["target","_blank","rel","noreferrer nofollow noopener",1,"link",3,"href"]],template:function(e,t){1&e&&(hs(0,oL,21,8,"div",0),ru(1,"\n")),2&e&&ms("ngIf",t.visible)},directives:[lh,WC],pipes:[hM],styles:[".main-container[_ngcontent-%COMP%]{position:fixed;bottom:0;width:100%;z-index:1000000;display:flex;flex-direction:row;justify-content:center}.internal-container[_ngcontent-%COMP%]{color:#fff;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;min-width:40%;max-width:90%;display:flex;padding:10px;border-top-left-radius:6px;border-top-right-radius:6px}.red-background[_ngcontent-%COMP%]{background-color:rgba(255,0,0,.7)}.green-background[_ngcontent-%COMP%]{background-color:rgba(31,177,31,.7)}.yellow-background[_ngcontent-%COMP%]{background-color:rgba(255,94,0,.7)}.icon-container[_ngcontent-%COMP%], .text-container[_ngcontent-%COMP%]{margin-right:10px}.text-container[_ngcontent-%COMP%]{flex-grow:1}.text-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-size:15px;margin-top:-1px}.text-container[_ngcontent-%COMP%] .text[_ngcontent-%COMP%]{font-size:13px;margin-top:2px}.text-container[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:#fff}"]}),e}(),dL=function(){function e(){}return Object.defineProperty(e.prototype,"msgBarComponent",{set:function(e){this.msgBarComponentInternal=e},enumerable:!1,configurable:!0}),e.prototype.hide=function(){this.msgBarComponentInternal&&this.msgBarComponentInternal.hide()},e.prototype.showError=function(e,t){void 0===t&&(t=2e4);var n=new lL;n.text=VM(e).translatableErrorMsg,n.title="common.error-title",n.icon=sL.Error,n.color=uL.Red,e.type&&e.type===BM.DaemonConnectionError&&(n.text="hardware-wallet.errors.daemon-connection-with-configurable-link",n.link=jM.hwWalletDaemonDownloadUrl),this.show(n),this.setTimer(t)},e.prototype.showWarning=function(e,t){void 0===t&&(t=2e4);var n=new lL;n.text=VM(e).translatableErrorMsg,n.title="common.warning-title",n.icon=sL.Warning,n.color=uL.Yellow,this.show(n),this.setTimer(t)},e.prototype.showDone=function(e,t){void 0===t&&(t=1e4);var n=new lL;n.text=e,n.title="common.done-title",n.icon=sL.Done,n.color=uL.Green,this.show(n),this.setTimer(t)},e.prototype.show=function(e){this.msgBarComponentInternal&&(this.msgBarComponentInternal.config=e,this.msgBarComponentInternal.show())},e.prototype.setTimer=function(e){var t=this;void 0===e&&(e=1e4),this.timeSubscription&&this.timeSubscription.unsubscribe(),this.timeSubscription=bm(1).pipe(EM(e)).subscribe(function(){return t.hide()})},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)}}),e}();function hL(e,t){1&e&&(ys(0,"app-hw-message",11),Wl(1,"translate"),Wl(2,"translate")),2&e&&ms("upperBigText",Vl(1,2,"hardware-wallet.seed-word.enter-word"))("text",Vl(2,4,"hardware-wallet.seed-word.info"))}var fL=function(e){return{number:e}};function pL(e,t){if(1&e&&(ys(0,"app-hw-message",11),Wl(1,"translate"),Wl(2,"translate")),2&e){var n=Ys();ms("upperBigText",Ul(1,2,"wallet.new.seed.enter-word",Il(7,fL,n.data.wordNumber)))("text",Vl(2,5,n.data.reason===n.wordAskedReasons.CreatingSoftwareWallet?"wallet.new.seed.new-seed-info":"wallet.new.seed.recover-seed-info"))}}function mL(e,t){1&e&&(vs(0,"label",12),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"hardware-wallet.seed-word.word-label")))}function gL(e,t){if(1&e){var n=Ms();vs(0,"mat-option",13),xs("click",function(){return on(n),Ys().sendWord()}),ru(1),_s()}if(2&e){var i=t.$implicit;ms("value",i),Ya(1),au(i)}}var vL=function(e){return e.HWWalletOperation="HWWalletOperation",e.CreatingSoftwareWallet="CreatingSoftwareWallet",e.RecoveringSoftwareWallet="RecoveringSoftwareWallet",e}({}),_L=function(){function e(e,t,n,i,r,a,o){var s=this;this.data=e,this.dialogRef=t,this.formBuilder=n,this.bip38WordList=i,this.msgBarService=r,this.translateService=a,this.msgIcons=aC,this.wordAskedReasons=vL,this.inputErrorMsg="",this.sendingWord=!1,e.reason===vL.HWWalletOperation&&(this.hwConnectionSubscription=o.walletConnectedAsyncEvent.subscribe(function(e){e||s.dialogRef.close()}))}return e.openDialog=function(t,n){var i=new wk;return i.data=n,i.autoFocus=!0,i.width="350px",t.open(e,i)},e.prototype.ngOnInit=function(){var e=this;this.form=this.formBuilder.group({word:[""]}),this.form.setValidators(this.validateForm.bind(this)),this.valueChangeSubscription=this.form.controls.word.valueChanges.subscribe(function(t){e.bip38WordList.setSearchTerm(t.trim().toLowerCase())}),this.filteredOptions=this.bip38WordList.searchResults.pipe(K(function(e){return e}))},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.valueChangeSubscription.unsubscribe(),this.hwConnectionSubscription&&this.hwConnectionSubscription.unsubscribe()},e.prototype.sendWord=function(){var e=this;this.sendingWord||(this.sendingWord=!0,this.msgBarService.hide(),setTimeout(function(){if(e.form.valid){var t=e.bip38WordList.validateWord(e.form.value.word.trim().toLowerCase());t?e.dialogRef.close(e.form.value.word.trim().toLowerCase()):e.msgBarService.showError(e.translateService.instant(null===t?"hardware-wallet.seed-word.error-loading-words":"hardware-wallet.seed-word.error-invalid-word"))}e.sendingWord=!1},32))},e.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0;return this.form.get("word").value||(e=!1,this.form.get("word").touched&&(this.inputErrorMsg="wallet.new.seed.word-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ps(Tk),ps(Lk),ps(fm),ps(nL),ps(dL),ps(dM),ps(gC))},e.\u0275cmp=ft({type:e,selectors:[["app-seed-word-dialog"]],decls:34,vars:18,consts:[[3,"headline","dialog"],[3,"upperBigText","text",4,"ngIf"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],["for","word",4,"ngIf"],["matInput","","formControlName","word","id","word",3,"matAutocomplete","appFormFieldError","keydown.enter","blur"],[3,"autoActiveFirstOption"],["auto","matAutocomplete"],["class","option",3,"value","click",4,"ngFor","ngForOf"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"],[3,"upperBigText","text"],["for","word"],[1,"option",3,"value","click"]],template:function(e,t){if(1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,hL,3,6,"app-hw-message",1),ru(5,"\n "),hs(6,pL,3,9,"app-hw-message",1),ru(7,"\n\n "),ru(8,"\n "),vs(9,"div",2),ru(10,"\n "),vs(11,"div",3),ru(12,"\n "),hs(13,mL,3,3,"label",4),ru(14,"\n "),vs(15,"input",5),xs("keydown.enter",function(){return t.sendWord()})("blur",function(){return t.validateForm()}),_s(),ru(16,"\n "),vs(17,"mat-autocomplete",6,7),ru(19,"\n "),hs(20,gL,2,2,"mat-option",8),Wl(21,"async"),ru(22,"\n "),_s(),ru(23,"\n "),_s(),ru(24,"\n "),_s(),ru(25,"\n "),vs(26,"div",9),ru(27,"\n "),vs(28,"app-button",10),xs("action",function(){return t.sendWord()}),ru(29),Wl(30,"translate"),_s(),ru(31,"\n "),_s(),ru(32,"\n"),_s(),ru(33,"\n")),2&e){var n=fs(18);ms("headline",Vl(1,12,t.data.reason===t.wordAskedReasons.HWWalletOperation?"hardware-wallet.seed-word.title":"wallet.new.seed-label"))("dialog",t.dialogRef),Ya(4),ms("ngIf",t.data.reason===t.wordAskedReasons.HWWalletOperation),Ya(2),ms("ngIf",t.data.reason!==t.wordAskedReasons.HWWalletOperation),Ya(3),ms("formGroup",t.form),Ya(4),ms("ngIf",t.data.reason===t.wordAskedReasons.HWWalletOperation),Ya(2),ms("matAutocomplete",n)("appFormFieldError",t.inputErrorMsg),Ya(2),ms("autoActiveFirstOption",!0),Ya(3),ms("ngForOf",Vl(21,14,t.filteredOptions)),Ya(8),ms("disabled",!t.form.valid),Ya(1),ou("\n ",Vl(30,16,"common.continue-button"),"\n ")}},styles:[".option[_ngcontent-%COMP%]{font-size:13px;height:42px}"]}),e}(),yL=function(e){return e.CLIENT="client",e.NOTES="txid",e}({}),bL=function(){function e(e){this.apiService=e}return e.prototype.get=function(e,t){var n={type:e};return t&&(n.key=t),this.apiService.get("data",n,{useV2:!0})},e.prototype.store=function(e,t,n){return this.apiService.post("data",{type:e,key:t,val:n},{useV2:!0})},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(HS))}}),e}(),wL=function(){return function(e){Object.assign(this,e)}}(),kL=function(){function e(e,t){this.translate=e,this.storageService=t,this.currentLanguageInternal=new fg(1),this.savedSelectedLanguageLoadedInternal=new fg(1),this.languagesInternal=[],this.storageKey="lang"}return Object.defineProperty(e.prototype,"currentLanguage",{get:function(){return this.currentLanguageInternal.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"savedSelectedLanguageLoaded",{get:function(){return this.savedSelectedLanguageLoadedInternal.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"languages",{get:function(){return this.languagesInternal},enumerable:!1,configurable:!0}),e.prototype.initialize=function(){var e=this,t=[];jM.languages.forEach(function(n){var i=new wL(n);e.languagesInternal.push(i),t.push(i.code)}),this.translate.addLangs(t),this.translate.setDefaultLang(jM.defaultLanguage),this.translate.onLangChange.subscribe(function(t){return e.onLanguageChanged(t)}),this.loadCurrentLanguage()},e.prototype.changeLanguage=function(e){this.translate.use(e)},e.prototype.onLanguageChanged=function(e){this.currentLanguageInternal.next(this.languages.find(function(t){return t.code===e.lang})),this.subscription&&this.subscription.unsubscribe(),this.subscription=this.storageService.store(yL.CLIENT,this.storageKey,e.lang).subscribe()},e.prototype.loadCurrentLanguage=function(){var e=this;this.storageService.get(yL.CLIENT,this.storageKey).subscribe(function(t){t.data&&-1!==e.translate.getLangs().indexOf(t.data)?(setTimeout(function(){e.changeLanguage(t.data)},16),e.savedSelectedLanguageLoadedInternal.next(!0)):e.savedSelectedLanguageLoadedInternal.next(!1)},function(){e.savedSelectedLanguageLoadedInternal.next(!1)})},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(dM),Bi(bL))}}),e}();function ML(e,t){if(1&e){var n=Ms();vs(0,"button",3),xs("click",function(){var e=on(n).$implicit;return Ys().closePopup(e)}),ru(1,"\n "),ys(2,"img",4),ru(3,"\n "),vs(4,"div",5),ru(5),_s(),ru(6,"\n "),_s()}if(2&e){var i=t.$implicit;Ya(2),ms("src","assets/img/lang/"+i.iconName,Pr),Ya(3),au(i.name)}}var SL=function(){function e(e,t){this.dialogRef=e,this.languageService=t}return e.openDialog=function(t,n){void 0===n&&(n=!1);var i=new wk;return i.autoFocus=!1,i.disableClose=n,i.width="600px",t.open(e,i)},e.prototype.ngOnInit=function(){this.disableDismiss=this.dialogRef.disableClose,this.languages=this.languageService.languages},e.prototype.closePopup=function(e){void 0===e&&(e=null),e&&this.languageService.changeLanguage(e.code),this.dialogRef.close()},e.\u0275fac=function(t){return new(t||e)(ps(Lk),ps(kL))},e.\u0275cmp=ft({type:e,selectors:[["app-select-language"]],decls:9,vars:6,consts:[[1,"e2e-language-modal",3,"headline","disableDismiss","dialog"],[1,"options-container","light-button-theme"],["mat-button","","color","primary","class","button",3,"click",4,"ngFor","ngForOf"],["mat-button","","color","primary",1,"button",3,"click"],[3,"src"],[1,"label"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),vs(3,"div",1),ru(4,"\n "),hs(5,ML,7,2,"button",2),ru(6,"\n "),_s(),ru(7,"\n"),_s(),ru(8,"\n")),2&e&&(ms("headline",Vl(1,4,"language.title"))("disableDismiss",t.disableDismiss)("dialog",t.dialogRef),Ya(5),ms("ngForOf",t.languages))},directives:[jk,sh,SC],pipes:[hM],styles:[".options-container[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%]{width:118px;margin:20px;font-size:12px;line-height:1.4;padding:0;min-width:0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:64px;height:64px;margin:10px 0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);padding:4px 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#1e2227}"]}),e}(),CL=function(){return function(){this.label="",this.id="",this.addresses=[],this.encrypted=!1,this.temporal=!1,this.isHardware=!1,this.hasHwSecurityWarnings=!1,this.stopShowingHwSecurityPopup=!1}}(),LL=function(){return function(){this.address="",this.confirmed=!1}}();function xL(e,t){var n=new CL;return Object.assign(n,e),DL(!0,n),n.addresses=[],t&&e.addresses.forEach(function(e){n.addresses.push(TL(e))}),n}function TL(e){var t=new LL;return Object.assign(t,e),DL(!1,t),t}function DL(e,t){var n=new Map,i=e?new CL:new LL;Object.keys(i).forEach(function(e){n.set(e,!0)});var r=[];Object.keys(t).forEach(function(e){n.has(e)||r.push(e)}),r.forEach(function(e){delete t[e]})}var OL=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.coins=new(LM())(0),t.hours=new(LM())(0),t.addresses=[],t}return vf(t,e),t}(CL),EL=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.coins=new(LM())(0),t.hours=new(LM())(0),t}return vf(t,e),t}(LL),YL=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.addresses=[],t}return vf(t,e),t}(CL),PL=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.outputs=[],t}return vf(t,e),t}(LL),AL=function(){function e(e,t,n,i){this.apiService=e,this.hwWalletService=t,this.translate=n,this.storageService=i,this.hwWalletsDataStorageKey="hw-wallets",this.walletsSubject=new fg(1),this.initialLoadFailed=new Rv(!1),this.loadWallets()}return Object.defineProperty(e.prototype,"errorDuringinitialLoad",{get:function(){return this.initialLoadFailed.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"allWallets",{get:function(){return this.walletsSubject.asObservable()},enumerable:!1,configurable:!0}),e.prototype.addAddressesToWallet=function(e,t,n){var i=this;if(e.isHardware)return this.hwWalletService.getAddresses(t,e.addresses.length).pipe(K(function(t){var n=i.walletsList.find(function(t){return t.id===e.id}),r=[];return t.rawResponse.forEach(function(e){var t={address:e,confirmed:!1};r.push(t),n.addresses.push(t)}),i.saveHardwareWalletsAndInformUpdate(),r}));var r=new Object;return r.id=e.id,r.num=t,n&&(r.password=n),this.apiService.post("wallet/newAddress",r).pipe(K(function(t){var n=i.walletsList.find(function(t){return t.id===e.id}),r=[];return t.addresses.forEach(function(e){var t={address:e,confirmed:!0};r.push(t),n.addresses.push(t)}),i.informDataUpdated(),r}))},e.prototype.scanAddresses=function(e,t){var n=this;if(e.isHardware)return bm(!1);var i=new Object;return i.id=e.id,t&&(i.password=t),this.apiService.post("wallet/scan",i).pipe(K(function(t){var i=n.walletsList.find(function(t){return t.id===e.id}),r=t.addresses;return!!(r&&r.length>0)&&(r.forEach(function(e){i.addresses.push({address:e,confirmed:!0})}),n.informDataUpdated(),!0)}))},e.prototype.informValuesUpdated=function(e){var t=this.walletsList.findIndex(function(t){return t.id===e.id});if(-1!==t){var n=xL(e,!0);this.walletsList[t]=n,e.isHardware?this.saveHardwareWalletsAndInformUpdate():this.informDataUpdated()}},e.prototype.createSoftwareWallet=function(e,t,n,i){var r=this,a={label:t||"undefined",seed:n=n.replace(/(\n|\r\n)$/,""),scan:100,type:"deterministic"};return!e&&i&&(a.password=i,a.encrypt=!0),this.apiService.post(e?"wallet/createTemp":"wallet/create",a).pipe(K(function(t){var n={label:t.meta.label,id:t.meta.filename,addresses:[],encrypted:t.meta.encrypted,temporal:e,isHardware:!1,hasHwSecurityWarnings:!1,stopShowingHwSecurityPopup:!0};t.entries.forEach(function(e){return n.addresses.push({address:e.address,confirmed:!0})}),r.walletsList.push(n),r.informDataUpdated()}))},e.prototype.createHardwareWallet=function(){var e,t=this,n=0,i=new Map,r=new Map;return this.hwWalletService.getAddresses(jM.maxHardwareWalletAddresses,0).pipe(ue(function(n){(e=n.rawResponse).forEach(function(e){i.set(e,!0)});var r=!1;if(t.walletsList.forEach(function(e){i.has(e.id)&&(r=!0)}),r)return sg(VM("The wallet already exists"));var a=e.join(",");return t.apiService.post("transactions",{addrs:a})}),K(function(a){a.forEach(function(e){e.txn.outputs.forEach(function(e){i.has(e.dst)&&r.set(e.dst,!0)})}),e.forEach(function(e,t){r.has(e)&&(n=t)});var o=t.createHardwareWalletData(t.translate.instant("hardware-wallet.general.default-wallet-name"),e.slice(0,n+1).map(function(e){return{address:e,confirmed:!1}}),!0,!1);o.id=o.addresses[0].address;for(var s=t.walletsList.length-1,u=0;u4&&void 0!==arguments[4]?arguments[4]:new RL(e,n,i);if(!r.closed)return t instanceof N?t.subscribe(r):ne(t)(r)}var HL={};function jL(){for(var e=arguments.length,t=new Array(e),n=0;n2&&void 0!==arguments[2]?arguments[2]:"imperative",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;return s(this,n),(r=t.call(this,e,i)).navigationTrigger=a,r.restoredState=o,r}return o(n,[{key:"toString",value:function(){return"NavigationStart(id: ".concat(this.id,", url: '").concat(this.url,"')")}}]),n}(WL),UL=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,e,i)).urlAfterRedirects=r,a}return o(n,[{key:"toString",value:function(){return"NavigationEnd(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"')")}}]),n}(WL),zL=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,e,i)).reason=r,a}return o(n,[{key:"toString",value:function(){return"NavigationCancel(id: ".concat(this.id,", url: '").concat(this.url,"')")}}]),n}(WL),qL=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,e,i)).error=r,a}return o(n,[{key:"toString",value:function(){return"NavigationError(id: ".concat(this.id,", url: '").concat(this.url,"', error: ").concat(this.error,")")}}]),n}(WL),GL=function(e){l(n,e);var t=p(n);function n(e,i,r,a){var o;return s(this,n),(o=t.call(this,e,i)).urlAfterRedirects=r,o.state=a,o}return o(n,[{key:"toString",value:function(){return"RoutesRecognized(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(WL),KL=function(e){l(n,e);var t=p(n);function n(e,i,r,a){var o;return s(this,n),(o=t.call(this,e,i)).urlAfterRedirects=r,o.state=a,o}return o(n,[{key:"toString",value:function(){return"GuardsCheckStart(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(WL),JL=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o){var u;return s(this,n),(u=t.call(this,e,i)).urlAfterRedirects=r,u.state=a,u.shouldActivate=o,u}return o(n,[{key:"toString",value:function(){return"GuardsCheckEnd(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,", shouldActivate: ").concat(this.shouldActivate,")")}}]),n}(WL),ZL=function(e){l(n,e);var t=p(n);function n(e,i,r,a){var o;return s(this,n),(o=t.call(this,e,i)).urlAfterRedirects=r,o.state=a,o}return o(n,[{key:"toString",value:function(){return"ResolveStart(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(WL),$L=function(e){l(n,e);var t=p(n);function n(e,i,r,a){var o;return s(this,n),(o=t.call(this,e,i)).urlAfterRedirects=r,o.state=a,o}return o(n,[{key:"toString",value:function(){return"ResolveEnd(id: ".concat(this.id,", url: '").concat(this.url,"', urlAfterRedirects: '").concat(this.urlAfterRedirects,"', state: ").concat(this.state,")")}}]),n}(WL),XL=function(){function e(t){s(this,e),this.route=t}return o(e,[{key:"toString",value:function(){return"RouteConfigLoadStart(path: ".concat(this.route.path,")")}}]),e}(),QL=function(){function e(t){s(this,e),this.route=t}return o(e,[{key:"toString",value:function(){return"RouteConfigLoadEnd(path: ".concat(this.route.path,")")}}]),e}(),ex=function(){function e(t){s(this,e),this.snapshot=t}return o(e,[{key:"toString",value:function(){return"ChildActivationStart(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),e}(),tx=function(){function e(t){s(this,e),this.snapshot=t}return o(e,[{key:"toString",value:function(){return"ChildActivationEnd(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),e}(),nx=function(){function e(t){s(this,e),this.snapshot=t}return o(e,[{key:"toString",value:function(){return"ActivationStart(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),e}(),ix=function(){function e(t){s(this,e),this.snapshot=t}return o(e,[{key:"toString",value:function(){return"ActivationEnd(path: '".concat(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"","')")}}]),e}(),rx=function(){function e(t,n,i){s(this,e),this.routerEvent=t,this.position=n,this.anchor=i}return o(e,[{key:"toString",value:function(){var e=this.position?"".concat(this.position[0],", ").concat(this.position[1]):null;return"Scroll(anchor: '".concat(this.anchor,"', position: '").concat(e,"')")}}]),e}(),ax="primary",ox=function(){function e(t){s(this,e),this.params=t||{}}return o(e,[{key:"has",value:function(e){return Object.prototype.hasOwnProperty.call(this.params,e)}},{key:"get",value:function(e){if(this.has(e)){var t=this.params[e];return Array.isArray(t)?t[0]:t}return null}},{key:"getAll",value:function(e){if(this.has(e)){var t=this.params[e];return Array.isArray(t)?t:[t]}return[]}},{key:"keys",get:function(){return Object.keys(this.params)}}]),e}();function sx(e){return new ox(e)}function ux(e){var t=Error("NavigationCancelingError: "+e);return t.ngNavigationCancelingError=!0,t}function lx(e,t,n){var i=n.path.split("/");if(i.length>e.length)return null;if("full"===n.pathMatch&&(t.hasChildren()||i.length0?e[e.length-1]:null}function px(e,t){for(var n in e)e.hasOwnProperty(n)&&t(e[n],n)}function mx(e){return Ls(e)?e:Ss(e)?re(Promise.resolve(e)):bm(e)}var gx={exact:function e(t,n,i){if(!Cx(t.segments,n.segments))return!1;if(!wx(t.segments,n.segments,i))return!1;if(t.numberOfChildren!==n.numberOfChildren)return!1;for(var r in n.children){if(!t.children[r])return!1;if(!e(t.children[r],n.children[r],i))return!1}return!0},subset:yx},vx={exact:function(e,t){return cx(e,t)},subset:function(e,t){return Object.keys(t).length<=Object.keys(e).length&&Object.keys(t).every(function(n){return dx(e[n],t[n])})},ignored:function(){return!0}};function _x(e,t,n){return gx[n.paths](e.root,t.root,n.matrixParams)&&vx[n.queryParams](e.queryParams,t.queryParams)&&!("exact"===n.fragment&&e.fragment!==t.fragment)}function yx(e,t,n){return bx(e,t,t.segments,n)}function bx(e,t,n,i){if(e.segments.length>n.length){var r=e.segments.slice(0,n.length);return!!Cx(r,n)&&!t.hasChildren()&&!!wx(r,n,i)}if(e.segments.length===n.length){if(!Cx(e.segments,n))return!1;if(!wx(e.segments,n,i))return!1;for(var a in t.children){if(!e.children[a])return!1;if(!yx(e.children[a],t.children[a],i))return!1}return!0}var o=n.slice(0,e.segments.length),s=n.slice(e.segments.length);return!!Cx(e.segments,o)&&!!wx(e.segments,o,i)&&!!e.children.primary&&bx(e.children.primary,t,s,i)}function wx(e,t,n){return t.every(function(t,i){return vx[n](e[i].parameters,t.parameters)})}var kx=function(){function e(t,n,i){s(this,e),this.root=t,this.queryParams=n,this.fragment=i}return o(e,[{key:"queryParamMap",get:function(){return this._queryParamMap||(this._queryParamMap=sx(this.queryParams)),this._queryParamMap}},{key:"toString",value:function(){return Tx.serialize(this)}}]),e}(),Mx=function(){function e(t,n){var i=this;s(this,e),this.segments=t,this.children=n,this.parent=null,px(n,function(e,t){return e.parent=i})}return o(e,[{key:"hasChildren",value:function(){return this.numberOfChildren>0}},{key:"numberOfChildren",get:function(){return Object.keys(this.children).length}},{key:"toString",value:function(){return Dx(this)}}]),e}(),Sx=function(){function e(t,n){s(this,e),this.path=t,this.parameters=n}return o(e,[{key:"parameterMap",get:function(){return this._parameterMap||(this._parameterMap=sx(this.parameters)),this._parameterMap}},{key:"toString",value:function(){return Rx(this)}}]),e}();function Cx(e,t){return e.length===t.length&&e.every(function(e,n){return e.path===t[n].path})}var Lx=function e(){s(this,e)},xx=function(){function e(){s(this,e)}return o(e,[{key:"parse",value:function(e){var t=new Bx(e);return new kx(t.parseRootSegment(),t.parseQueryParams(),t.parseFragment())}},{key:"serialize",value:function(e){var t,n,i="/".concat(Ox(e.root,!0)),r=(t=e.queryParams,(n=Object.keys(t).map(function(e){var n=t[e];return Array.isArray(n)?n.map(function(t){return"".concat(Yx(e),"=").concat(Yx(t))}).join("&"):"".concat(Yx(e),"=").concat(Yx(n))}).filter(function(e){return!!e})).length?"?".concat(n.join("&")):""),a="string"==typeof e.fragment?"#".concat(encodeURI(e.fragment)):"";return"".concat(i).concat(r).concat(a)}}]),e}(),Tx=new xx;function Dx(e){return e.segments.map(function(e){return Rx(e)}).join("/")}function Ox(e,t){if(!e.hasChildren())return Dx(e);if(t){var n=e.children.primary?Ox(e.children.primary,!1):"",i=[];return px(e.children,function(e,t){t!==ax&&i.push("".concat(t,":").concat(Ox(e,!1)))}),i.length>0?"".concat(n,"(").concat(i.join("//"),")"):n}var r=function(e,t){var n=[];return px(e.children,function(e,i){i===ax&&(n=n.concat(t(e,i)))}),px(e.children,function(e,i){i!==ax&&(n=n.concat(t(e,i)))}),n}(e,function(t,n){return n===ax?[Ox(e.children.primary,!1)]:["".concat(n,":").concat(Ox(t,!1))]});return 1===Object.keys(e.children).length&&null!=e.children.primary?"".concat(Dx(e),"/").concat(r[0]):"".concat(Dx(e),"/(").concat(r.join("//"),")")}function Ex(e){return encodeURIComponent(e).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function Yx(e){return Ex(e).replace(/%3B/gi,";")}function Px(e){return Ex(e).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function Ax(e){return decodeURIComponent(e)}function Ix(e){return Ax(e.replace(/\+/g,"%20"))}function Rx(e){return"".concat(Px(e.path)).concat((t=e.parameters,Object.keys(t).map(function(e){return";".concat(Px(e),"=").concat(Px(t[e]))}).join("")));var t}var Fx=/^[^\/()?;=#]+/;function Hx(e){var t=e.match(Fx);return t?t[0]:""}var jx=/^[^=?&#]+/,Nx=/^[^?&#]+/,Bx=function(){function e(t){s(this,e),this.url=t,this.remaining=t}return o(e,[{key:"parseRootSegment",value:function(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new Mx([],{}):new Mx([],this.parseChildren())}},{key:"parseQueryParams",value:function(){var e={};if(this.consumeOptional("?"))do{this.parseQueryParam(e)}while(this.consumeOptional("&"));return e}},{key:"parseFragment",value:function(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}},{key:"parseChildren",value:function(){if(""===this.remaining)return{};this.consumeOptional("/");var e=[];for(this.peekStartsWith("(")||e.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),e.push(this.parseSegment());var t={};this.peekStartsWith("/(")&&(this.capture("/"),t=this.parseParens(!0));var n={};return this.peekStartsWith("(")&&(n=this.parseParens(!1)),(e.length>0||Object.keys(t).length>0)&&(n.primary=new Mx(e,t)),n}},{key:"parseSegment",value:function(){var e=Hx(this.remaining);if(""===e&&this.peekStartsWith(";"))throw new Error("Empty path url segment cannot have parameters: '".concat(this.remaining,"'."));return this.capture(e),new Sx(Ax(e),this.parseMatrixParams())}},{key:"parseMatrixParams",value:function(){for(var e={};this.consumeOptional(";");)this.parseParam(e);return e}},{key:"parseParam",value:function(e){var t=Hx(this.remaining);if(t){this.capture(t);var n="";if(this.consumeOptional("=")){var i=Hx(this.remaining);i&&this.capture(n=i)}e[Ax(t)]=Ax(n)}}},{key:"parseQueryParam",value:function(e){var t=function(e){var t=e.match(jx);return t?t[0]:""}(this.remaining);if(t){this.capture(t);var n="";if(this.consumeOptional("=")){var i=function(e){var t=e.match(Nx);return t?t[0]:""}(this.remaining);i&&this.capture(n=i)}var r=Ix(t),a=Ix(n);if(e.hasOwnProperty(r)){var o=e[r];Array.isArray(o)||(e[r]=o=[o]),o.push(a)}else e[r]=a}}},{key:"parseParens",value:function(e){var t={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){var n=Hx(this.remaining),i=this.remaining[n.length];if("/"!==i&&")"!==i&&";"!==i)throw new Error("Cannot parse url '".concat(this.url,"'"));var r=void 0;n.indexOf(":")>-1?(r=n.substr(0,n.indexOf(":")),this.capture(r),this.capture(":")):e&&(r=ax);var a=this.parseChildren();t[r]=1===Object.keys(a).length?a.primary:new Mx([],a),this.consumeOptional("//")}return t}},{key:"peekStartsWith",value:function(e){return this.remaining.startsWith(e)}},{key:"consumeOptional",value:function(e){return!!this.peekStartsWith(e)&&(this.remaining=this.remaining.substring(e.length),!0)}},{key:"capture",value:function(e){if(!this.consumeOptional(e))throw new Error('Expected "'.concat(e,'".'))}}]),e}(),Wx=function(){function e(t){s(this,e),this._root=t}return o(e,[{key:"root",get:function(){return this._root.value}},{key:"parent",value:function(e){var t=this.pathFromRoot(e);return t.length>1?t[t.length-2]:null}},{key:"children",value:function(e){var t=Vx(e,this._root);return t?t.children.map(function(e){return e.value}):[]}},{key:"firstChild",value:function(e){var t=Vx(e,this._root);return t&&t.children.length>0?t.children[0].value:null}},{key:"siblings",value:function(e){var t=Ux(e,this._root);return t.length<2?[]:t[t.length-2].children.map(function(e){return e.value}).filter(function(t){return t!==e})}},{key:"pathFromRoot",value:function(e){return Ux(e,this._root).map(function(e){return e.value})}}]),e}();function Vx(e,t){if(e===t.value)return t;var n,i=v(t.children);try{for(i.s();!(n=i.n()).done;){var r=Vx(e,n.value);if(r)return r}}catch(a){i.e(a)}finally{i.f()}return null}function Ux(e,t){if(e===t.value)return[t];var n,i=v(t.children);try{for(i.s();!(n=i.n()).done;){var r=Ux(e,n.value);if(r.length)return r.unshift(t),r}}catch(a){i.e(a)}finally{i.f()}return[]}var zx=function(){function e(t,n){s(this,e),this.value=t,this.children=n}return o(e,[{key:"toString",value:function(){return"TreeNode(".concat(this.value,")")}}]),e}();function qx(e){var t={};return e&&e.children.forEach(function(e){return t[e.value.outlet]=e}),t}var Gx=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e)).snapshot=i,eT(h(r),e),r}return o(n,[{key:"toString",value:function(){return this.snapshot.toString()}}]),n}(Wx);function Kx(e,t){var n=function(e,t){var n=new Xx([],{},{},"",{},ax,t,null,e.root,-1,{});return new Qx("",new zx(n,[]))}(e,t),i=new Rv([new Sx("",{})]),r=new Rv({}),a=new Rv({}),o=new Rv({}),s=new Rv(""),u=new Jx(i,r,o,s,a,ax,t,n.root);return u.snapshot=n.root,new Gx(new zx(u,[]),n)}var Jx=function(){function e(t,n,i,r,a,o,u,l){s(this,e),this.url=t,this.params=n,this.queryParams=i,this.fragment=r,this.data=a,this.outlet=o,this.component=u,this._futureSnapshot=l}return o(e,[{key:"routeConfig",get:function(){return this._futureSnapshot.routeConfig}},{key:"root",get:function(){return this._routerState.root}},{key:"parent",get:function(){return this._routerState.parent(this)}},{key:"firstChild",get:function(){return this._routerState.firstChild(this)}},{key:"children",get:function(){return this._routerState.children(this)}},{key:"pathFromRoot",get:function(){return this._routerState.pathFromRoot(this)}},{key:"paramMap",get:function(){return this._paramMap||(this._paramMap=this.params.pipe(K(function(e){return sx(e)}))),this._paramMap}},{key:"queryParamMap",get:function(){return this._queryParamMap||(this._queryParamMap=this.queryParams.pipe(K(function(e){return sx(e)}))),this._queryParamMap}},{key:"toString",value:function(){return this.snapshot?this.snapshot.toString():"Future(".concat(this._futureSnapshot,")")}}]),e}();function Zx(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"emptyOnly",n=e.pathFromRoot,i=0;if("always"!==t)for(i=n.length-1;i>=1;){var r=n[i],a=n[i-1];if(r.routeConfig&&""===r.routeConfig.path)i--;else{if(a.component)break;i--}}return $x(n.slice(i))}function $x(e){return e.reduce(function(e,t){return{params:Object.assign(Object.assign({},e.params),t.params),data:Object.assign(Object.assign({},e.data),t.data),resolve:Object.assign(Object.assign({},e.resolve),t._resolvedData)}},{params:{},data:{},resolve:{}})}var Xx=function(){function e(t,n,i,r,a,o,u,l,c,d,h){s(this,e),this.url=t,this.params=n,this.queryParams=i,this.fragment=r,this.data=a,this.outlet=o,this.component=u,this.routeConfig=l,this._urlSegment=c,this._lastPathIndex=d,this._resolve=h}return o(e,[{key:"root",get:function(){return this._routerState.root}},{key:"parent",get:function(){return this._routerState.parent(this)}},{key:"firstChild",get:function(){return this._routerState.firstChild(this)}},{key:"children",get:function(){return this._routerState.children(this)}},{key:"pathFromRoot",get:function(){return this._routerState.pathFromRoot(this)}},{key:"paramMap",get:function(){return this._paramMap||(this._paramMap=sx(this.params)),this._paramMap}},{key:"queryParamMap",get:function(){return this._queryParamMap||(this._queryParamMap=sx(this.queryParams)),this._queryParamMap}},{key:"toString",value:function(){var e=this.url.map(function(e){return e.toString()}).join("/"),t=this.routeConfig?this.routeConfig.path:"";return"Route(url:'".concat(e,"', path:'").concat(t,"')")}}]),e}(),Qx=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,i)).url=e,eT(h(r),i),r}return o(n,[{key:"toString",value:function(){return tT(this._root)}}]),n}(Wx);function eT(e,t){t.value._routerState=e,t.children.forEach(function(t){return eT(e,t)})}function tT(e){var t=e.children.length>0?" { ".concat(e.children.map(tT).join(", ")," } "):"";return"".concat(e.value).concat(t)}function nT(e){if(e.snapshot){var t=e.snapshot,n=e._futureSnapshot;e.snapshot=n,cx(t.queryParams,n.queryParams)||e.queryParams.next(n.queryParams),t.fragment!==n.fragment&&e.fragment.next(n.fragment),cx(t.params,n.params)||e.params.next(n.params),function(e,t){if(e.length!==t.length)return!1;for(var n=0;nr;){if(a-=r,!(i=i.parent))throw new Error("Invalid number of '../'");r=i.segments.length}return new hT(i,!1,r-a)}(n.snapshot._urlSegment,n.snapshot._lastPathIndex+r,e.numberOfDoubleDots)}(a,t,e),s=o.processChildren?pT(o.segmentGroup,o.index,a.commands):fT(o.segmentGroup,o.index,a.commands);return lT(o.segmentGroup,s,t,i,r)}function sT(e){return"object"==typeof e&&null!=e&&!e.outlets&&!e.segmentPath}function uT(e){return"object"==typeof e&&null!=e&&e.outlets}function lT(e,t,n,i,r){var a={};return i&&px(i,function(e,t){a[t]=Array.isArray(e)?e.map(function(e){return"".concat(e)}):"".concat(e)}),new kx(n.root===e?t:cT(n.root,e,t),a,r)}function cT(e,t,n){var i={};return px(e.children,function(e,r){i[r]=e===t?n:cT(e,t,n)}),new Mx(e.segments,i)}var dT=function(){function e(t,n,i){if(s(this,e),this.isAbsolute=t,this.numberOfDoubleDots=n,this.commands=i,t&&i.length>0&&sT(i[0]))throw new Error("Root segment cannot have matrix parameters");var r=i.find(uT);if(r&&r!==fx(i))throw new Error("{outlets:{}} has to be the last command")}return o(e,[{key:"toRoot",value:function(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]}}]),e}(),hT=function e(t,n,i){s(this,e),this.segmentGroup=t,this.processChildren=n,this.index=i};function fT(e,t,n){if(e||(e=new Mx([],{})),0===e.segments.length&&e.hasChildren())return pT(e,t,n);var i=function(e,t,n){for(var i=0,r=t,a={match:!1,pathIndex:0,commandIndex:0};r=n.length)return a;var o=e.segments[r],s=n[i];if(uT(s))break;var u="".concat(s),l=i0&&void 0===u)break;if(u&&l&&"object"==typeof l&&void 0===l.outlets){if(!_T(u,l,o))return a;i+=2}else{if(!_T(u,{},o))return a;i++}r++}return{match:!0,pathIndex:r,commandIndex:i}}(e,t,n),r=n.slice(i.commandIndex);if(i.match&&i.pathIndex1&&void 0!==arguments[1]?arguments[1]:"",n=0;n0)?Object.assign({},PT):{matched:!0,consumedSegments:[],lastChild:0,parameters:{},positionalParamSegments:{}};var r=(t.matcher||lx)(n,e,t);if(!r)return Object.assign({},PT);var a={};px(r.posParams,function(e,t){a[t]=e.path});var o=r.consumed.length>0?Object.assign(Object.assign({},a),r.consumed[r.consumed.length-1].parameters):a;return{matched:!0,consumedSegments:r.consumed,lastChild:r.consumed.length,parameters:o,positionalParamSegments:null!==(i=r.posParams)&&void 0!==i?i:{}}}function IT(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"corrected";if(n.length>0&&HT(e,n,i)){var a=new Mx(t,FT(e,t,i,new Mx(n,e.children)));return a._sourceSegment=e,a._segmentIndexShift=t.length,{segmentGroup:a,slicedSegments:[]}}if(0===n.length&&jT(e,n,i)){var o=new Mx(e.segments,RT(e,t,n,i,e.children,r));return o._sourceSegment=e,o._segmentIndexShift=t.length,{segmentGroup:o,slicedSegments:n}}var s=new Mx(e.segments,e.children);return s._sourceSegment=e,s._segmentIndexShift=t.length,{segmentGroup:s,slicedSegments:n}}function RT(e,t,n,i,r,a){var o,s={},u=v(i);try{for(u.s();!(o=u.n()).done;){var l=o.value;if(NT(e,n,l)&&!r[ET(l)]){var c=new Mx([],{});c._sourceSegment=e,c._segmentIndexShift="legacy"===a?e.segments.length:t.length,s[ET(l)]=c}}}catch(d){u.e(d)}finally{u.f()}return Object.assign(Object.assign({},r),s)}function FT(e,t,n,i){var r={};r.primary=i,i._sourceSegment=e,i._segmentIndexShift=t.length;var a,o=v(n);try{for(o.s();!(a=o.n()).done;){var s=a.value;if(""===s.path&&ET(s)!==ax){var u=new Mx([],{});u._sourceSegment=e,u._segmentIndexShift=t.length,r[ET(s)]=u}}}catch(l){o.e(l)}finally{o.f()}return r}function HT(e,t,n){return n.some(function(n){return NT(e,t,n)&&ET(n)!==ax})}function jT(e,t,n){return n.some(function(n){return NT(e,t,n)})}function NT(e,t,n){return(!(e.hasChildren()||t.length>0)||"full"!==n.pathMatch)&&""===n.path}function BT(e,t,n,i){return!!(ET(e)===i||i!==ax&&NT(t,n,e))&&("**"===e.path||AT(t,e,n).matched)}function WT(e,t,n){return 0===t.length&&!e.children[n]}var VT=function e(t){s(this,e),this.segmentGroup=t||null},UT=function e(t){s(this,e),this.urlTree=t};function zT(e){return new N(function(t){return t.error(new VT(e))})}function qT(e){return new N(function(t){return t.error(new UT(e))})}function GT(e){return new N(function(t){return t.error(new Error("Only absolute redirects can have named outlets. redirectTo: '".concat(e,"'")))})}var KT=function(){function e(t,n,i,r,a){s(this,e),this.configLoader=n,this.urlSerializer=i,this.urlTree=r,this.config=a,this.allowRedirects=!0,this.ngModule=t.get(vl)}return o(e,[{key:"apply",value:function(){var e=this,t=IT(this.urlTree.root,[],[],this.config).segmentGroup,n=new Mx(t.segments,t.children);return this.expandSegmentGroup(this.ngModule,this.config,n,ax).pipe(K(function(t){return e.createUrlTree(JT(t),e.urlTree.queryParams,e.urlTree.fragment)})).pipe(qM(function(t){if(t instanceof UT)return e.allowRedirects=!1,e.match(t.urlTree);if(t instanceof VT)throw e.noMatchError(t);throw t}))}},{key:"match",value:function(e){var t=this;return this.expandSegmentGroup(this.ngModule,this.config,e.root,ax).pipe(K(function(n){return t.createUrlTree(JT(n),e.queryParams,e.fragment)})).pipe(qM(function(e){if(e instanceof VT)throw t.noMatchError(e);throw e}))}},{key:"noMatchError",value:function(e){return new Error("Cannot match any routes. URL Segment: '".concat(e.segmentGroup,"'"))}},{key:"createUrlTree",value:function(e,t,n){var i=e.segments.length>0?new Mx([],y({},ax,e)):e;return new kx(i,t,n)}},{key:"expandSegmentGroup",value:function(e,t,n,i){return 0===n.segments.length&&n.hasChildren()?this.expandChildren(e,t,n).pipe(K(function(e){return new Mx([],e)})):this.expandSegment(e,n,t,n.segments,i,!0)}},{key:"expandChildren",value:function(e,t,n){for(var i=this,r=[],a=0,o=Object.keys(n.children);a=2;return function(i){return i.pipe(e?zm(function(t,n){return e(t,n,i)}):F,Vk(1),n?qk(t):ZM(function(){return new JM}))}}())}},{key:"expandSegment",value:function(e,t,n,i,r,a){var o=this;return re(n).pipe(tS(function(s){return o.expandSegmentAgainstRoute(e,t,n,s,i,r,a).pipe(qM(function(e){if(e instanceof VT)return bm(null);throw e}))}),eS(function(e){return!!e}),qM(function(e,n){if(e instanceof JM||"EmptyError"===e.name){if(WT(t,i,r))return bm(new Mx([],{}));throw new VT(t)}throw e}))}},{key:"expandSegmentAgainstRoute",value:function(e,t,n,i,r,a,o){return BT(i,t,r,a)?void 0===i.redirectTo?this.matchSegmentAgainstRoute(e,t,i,r,a):o&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(e,t,n,i,r,a):zT(t):zT(t)}},{key:"expandSegmentAgainstRouteUsingRedirect",value:function(e,t,n,i,r,a){return"**"===i.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(e,n,i,a):this.expandRegularSegmentAgainstRouteUsingRedirect(e,t,n,i,r,a)}},{key:"expandWildCardWithParamsAgainstRouteUsingRedirect",value:function(e,t,n,i){var r=this,a=this.applyRedirectCommands([],n.redirectTo,{});return n.redirectTo.startsWith("/")?qT(a):this.lineralizeSegments(n,a).pipe(ue(function(n){var a=new Mx(n,{});return r.expandSegment(e,a,t,n,i,!1)}))}},{key:"expandRegularSegmentAgainstRouteUsingRedirect",value:function(e,t,n,i,r,a){var o=this,s=AT(t,i,r),u=s.consumedSegments,l=s.lastChild,c=s.positionalParamSegments;if(!s.matched)return zT(t);var d=this.applyRedirectCommands(u,i.redirectTo,c);return i.redirectTo.startsWith("/")?qT(d):this.lineralizeSegments(i,d).pipe(ue(function(i){return o.expandSegment(e,t,n,i.concat(r.slice(l)),a,!1)}))}},{key:"matchSegmentAgainstRoute",value:function(e,t,n,i,r){var a=this;if("**"===n.path)return n.loadChildren?(n._loadedConfig?bm(n._loadedConfig):this.configLoader.load(e.injector,n)).pipe(K(function(e){return n._loadedConfig=e,new Mx(i,{})})):bm(new Mx(i,{}));var o=AT(t,n,i),s=o.consumedSegments,u=o.lastChild;if(!o.matched)return zT(t);var l=i.slice(u);return this.getChildConfig(e,n,i).pipe(ue(function(e){var i=e.module,o=e.routes,u=IT(t,s,l,o),c=u.segmentGroup,d=u.slicedSegments,h=new Mx(c.segments,c.children);if(0===d.length&&h.hasChildren())return a.expandChildren(i,o,h).pipe(K(function(e){return new Mx(s,e)}));if(0===o.length&&0===d.length)return bm(new Mx(s,{}));var f=ET(n)===r;return a.expandSegment(i,h,o,d,f?ax:r,!0).pipe(K(function(e){return new Mx(s.concat(e.segments),e.children)}))}))}},{key:"getChildConfig",value:function(e,t,n){var i=this;return t.children?bm(new wT(t.children,e)):t.loadChildren?void 0!==t._loadedConfig?bm(t._loadedConfig):this.runCanLoadGuards(e.injector,t,n).pipe(ue(function(n){return n?i.configLoader.load(e.injector,t).pipe(K(function(e){return t._loadedConfig=e,e})):function(e){return new N(function(t){return t.error(ux("Cannot load children because the guard of the route \"path: '".concat(e.path,"'\" returned false")))})}(t)})):bm(new wT([],e))}},{key:"runCanLoadGuards",value:function(e,t,n){var i=this,r=t.canLoad;return r&&0!==r.length?bm(r.map(function(i){var r,a=e.get(i);if(function(e){return e&&kT(e.canLoad)}(a))r=a.canLoad(t,n);else{if(!kT(a))throw new Error("Invalid CanLoad guard");r=a(t,n)}return mx(r)})).pipe(CT(),Hv(function(e){if(MT(e)){var t=ux('Redirecting to "'.concat(i.urlSerializer.serialize(e),'"'));throw t.url=e,t}}),K(function(e){return!0===e})):bm(!0)}},{key:"lineralizeSegments",value:function(e,t){for(var n=[],i=t.root;;){if(n=n.concat(i.segments),0===i.numberOfChildren)return bm(n);if(i.numberOfChildren>1||!i.children.primary)return GT(e.redirectTo);i=i.children.primary}}},{key:"applyRedirectCommands",value:function(e,t,n){return this.applyRedirectCreatreUrlTree(t,this.urlSerializer.parse(t),e,n)}},{key:"applyRedirectCreatreUrlTree",value:function(e,t,n,i){var r=this.createSegmentGroup(e,t.root,n,i);return new kx(r,this.createQueryParams(t.queryParams,this.urlTree.queryParams),t.fragment)}},{key:"createQueryParams",value:function(e,t){var n={};return px(e,function(e,i){if("string"==typeof e&&e.startsWith(":")){var r=e.substring(1);n[i]=t[r]}else n[i]=e}),n}},{key:"createSegmentGroup",value:function(e,t,n,i){var r=this,a=this.createSegments(e,t.segments,n,i),o={};return px(t.children,function(t,a){o[a]=r.createSegmentGroup(e,t,n,i)}),new Mx(a,o)}},{key:"createSegments",value:function(e,t,n,i){var r=this;return t.map(function(t){return t.path.startsWith(":")?r.findPosParam(e,t,i):r.findOrReturn(t,n)})}},{key:"findPosParam",value:function(e,t,n){var i=n[t.path.substring(1)];if(!i)throw new Error("Cannot redirect to '".concat(e,"'. Cannot find '").concat(t.path,"'."));return i}},{key:"findOrReturn",value:function(e,t){var n,i=0,r=v(t);try{for(r.s();!(n=r.n()).done;){var a=n.value;if(a.path===e.path)return t.splice(i),a;i++}}catch(o){r.e(o)}finally{r.f()}return e}}]),e}();function JT(e){for(var t={},n=0,i=Object.keys(e.children);n0||a.hasChildren())&&(t[r]=a)}return function(e){if(1===e.numberOfChildren&&e.children.primary){var t=e.children.primary;return new Mx(e.segments.concat(t.segments),t.children)}return e}(new Mx(e.segments,t))}var ZT=function e(t){s(this,e),this.path=t,this.route=this.path[this.path.length-1]},$T=function e(t,n){s(this,e),this.component=t,this.route=n};function XT(e,t,n){var i=function(e){if(!e)return null;for(var t=e.parent;t;t=t.parent){var n=t.routeConfig;if(n&&n._loadedConfig)return n._loadedConfig}return null}(t);return(i?i.module.injector:n).get(e)}function QT(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{canDeactivateChecks:[],canActivateChecks:[]},a=qx(t);return e.children.forEach(function(e){eD(e,a[e.value.outlet],n,i.concat([e.value]),r),delete a[e.value.outlet]}),px(a,function(e,t){return nD(e,n.getContext(t),r)}),r}function eD(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{canDeactivateChecks:[],canActivateChecks:[]},a=e.value,o=t?t.value:null,s=n?n.getContext(e.value.outlet):null;if(o&&a.routeConfig===o.routeConfig){var u=tD(o,a,a.routeConfig.runGuardsAndResolvers);u?r.canActivateChecks.push(new ZT(i)):(a.data=o.data,a._resolvedData=o._resolvedData),QT(e,t,a.component?s?s.children:null:n,i,r),u&&s&&s.outlet&&s.outlet.isActivated&&r.canDeactivateChecks.push(new $T(s.outlet.component,o))}else o&&nD(t,s,r),r.canActivateChecks.push(new ZT(i)),QT(e,null,a.component?s?s.children:null:n,i,r);return r}function tD(e,t,n){if("function"==typeof n)return n(e,t);switch(n){case"pathParamsChange":return!Cx(e.url,t.url);case"pathParamsOrQueryParamsChange":return!Cx(e.url,t.url)||!cx(e.queryParams,t.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!iT(e,t)||!cx(e.queryParams,t.queryParams);case"paramsChange":default:return!iT(e,t)}}function nD(e,t,n){var i=qx(e),r=e.value;px(i,function(e,i){nD(e,r.component?t?t.children.getContext(i):null:t,n)}),n.canDeactivateChecks.push(new $T(r.component&&t&&t.outlet&&t.outlet.isActivated?t.outlet.component:null,r))}var iD=function e(){s(this,e)};function rD(e){return new N(function(t){return t.error(e)})}var aD=function(){function e(t,n,i,r,a,o){s(this,e),this.rootComponentType=t,this.config=n,this.urlTree=i,this.url=r,this.paramsInheritanceStrategy=a,this.relativeLinkResolution=o}return o(e,[{key:"recognize",value:function(){var e=IT(this.urlTree.root,[],[],this.config.filter(function(e){return void 0===e.redirectTo}),this.relativeLinkResolution).segmentGroup,t=this.processSegmentGroup(this.config,e,ax);if(null===t)return null;var n=new Xx([],Object.freeze({}),Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,{},ax,this.rootComponentType,null,this.urlTree.root,-1,{}),i=new zx(n,t),r=new Qx(this.url,i);return this.inheritParamsAndData(r._root),r}},{key:"inheritParamsAndData",value:function(e){var t=this,n=e.value,i=Zx(n,this.paramsInheritanceStrategy);n.params=Object.freeze(i.params),n.data=Object.freeze(i.data),e.children.forEach(function(e){return t.inheritParamsAndData(e)})}},{key:"processSegmentGroup",value:function(e,t,n){return 0===t.segments.length&&t.hasChildren()?this.processChildren(e,t):this.processSegment(e,t,t.segments,n)}},{key:"processChildren",value:function(e,t){for(var n=[],i=0,r=Object.keys(t.children);i0?fx(n).parameters:{};r=new Xx(n,s,Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,lD(e),ET(e),e.component,e,sD(t),uD(t)+n.length,cD(e))}else{var u=AT(t,e,n);if(!u.matched)return null;a=u.consumedSegments,o=n.slice(u.lastChild),r=new Xx(a,u.parameters,Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,lD(e),ET(e),e.component,e,sD(t),uD(t)+a.length,cD(e))}var l=function(e){return e.children?e.children:e.loadChildren?e._loadedConfig.routes:[]}(e),c=IT(t,a,o,l.filter(function(e){return void 0===e.redirectTo}),this.relativeLinkResolution),d=c.segmentGroup,h=c.slicedSegments;if(0===h.length&&d.hasChildren()){var f=this.processChildren(l,d);return null===f?null:[new zx(r,f)]}if(0===l.length&&0===h.length)return[new zx(r,[])];var p=ET(e)===i,m=this.processSegment(l,d,h,p?ax:i);return null===m?null:[new zx(r,m)]}}]),e}();function oD(e){var t,n=[],i=new Set,r=v(e);try{var a=function(){var e=t.value;if(!function(e){var t=e.value.routeConfig;return t&&""===t.path&&void 0===t.redirectTo}(e))return n.push(e),"continue";var r,a=n.find(function(t){return e.value.routeConfig===t.value.routeConfig});void 0!==a?((r=a.children).push.apply(r,b(e.children)),i.add(a)):n.push(e)};for(r.s();!(t=r.n()).done;)a()}catch(c){r.e(c)}finally{r.f()}var o,s=v(i);try{for(s.s();!(o=s.n()).done;){var u=o.value,l=oD(u.children);n.push(new zx(u.value,l))}}catch(c){s.e(c)}finally{s.f()}return n.filter(function(e){return!i.has(e)})}function sD(e){for(var t=e;t._sourceSegment;)t=t._sourceSegment;return t}function uD(e){for(var t=e,n=t._segmentIndexShift?t._segmentIndexShift:0;t._sourceSegment;)n+=(t=t._sourceSegment)._segmentIndexShift?t._segmentIndexShift:0;return n-1}function lD(e){return e.data||{}}function cD(e){return e.resolve||{}}function dD(e){return eg(function(t){var n=e(t);return n?re(n).pipe(K(function(){return t})):bm(t)})}var hD=function(e){l(n,e);var t=p(n);function n(){return s(this,n),t.apply(this,arguments)}return n}(function(){function e(){s(this,e)}return o(e,[{key:"shouldDetach",value:function(e){return!1}},{key:"store",value:function(e,t){}},{key:"shouldAttach",value:function(e){return!1}},{key:"retrieve",value:function(e){return null}},{key:"shouldReuseRoute",value:function(e,t){return e.routeConfig===t.routeConfig}}]),e}()),fD=new Mi("ROUTES"),pD=function(){function e(t,n,i,r){s(this,e),this.loader=t,this.compiler=n,this.onLoadStartListener=i,this.onLoadEndListener=r}return o(e,[{key:"load",value:function(e,t){var n=this;if(t._loader$)return t._loader$;this.onLoadStartListener&&this.onLoadStartListener(t);var i=this.loadModuleFactory(t.loadChildren).pipe(K(function(i){n.onLoadEndListener&&n.onLoadEndListener(t);var r=i.create(e);return new wT(hx(r.injector.get(fD,void 0,ze.Self|ze.Optional)).map(OT),r)}),qM(function(e){throw t._loader$=void 0,e}));return t._loader$=new _e(i,function(){return new z}).pipe(me()),t._loader$}},{key:"loadModuleFactory",value:function(e){var t=this;return"string"==typeof e?re(this.loader.load(e)):mx(e()).pipe(ue(function(e){return e instanceof _l?bm(e):re(t.compiler.compileModuleAsync(e))}))}}]),e}(),mD=function e(){s(this,e),this.outlet=null,this.route=null,this.resolver=null,this.children=new gD,this.attachRef=null},gD=function(){function e(){s(this,e),this.contexts=new Map}return o(e,[{key:"onChildOutletCreated",value:function(e,t){var n=this.getOrCreateContext(e);n.outlet=t,this.contexts.set(e,n)}},{key:"onChildOutletDestroyed",value:function(e){var t=this.getContext(e);t&&(t.outlet=null)}},{key:"onOutletDeactivated",value:function(){var e=this.contexts;return this.contexts=new Map,e}},{key:"onOutletReAttached",value:function(e){this.contexts=e}},{key:"getOrCreateContext",value:function(e){var t=this.getContext(e);return t||(t=new mD,this.contexts.set(e,t)),t}},{key:"getContext",value:function(e){return this.contexts.get(e)||null}}]),e}(),vD=function(){function e(){s(this,e)}return o(e,[{key:"shouldProcessUrl",value:function(e){return!0}},{key:"extract",value:function(e){return e}},{key:"merge",value:function(e,t){return e}}]),e}();function _D(e){throw e}function yD(e,t,n){return t.parse("/")}function bD(e,t){return bm(null)}var wD={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},kD={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"},MD=function(){var e=function(){function e(t,n,i,r,a,o,u,l){var c=this;s(this,e),this.rootComponentType=t,this.urlSerializer=n,this.rootContexts=i,this.location=r,this.config=l,this.lastSuccessfulNavigation=null,this.currentNavigation=null,this.disposed=!1,this.lastLocationChangeInfo=null,this.navigationId=0,this.currentPageId=0,this.isNgZoneEnabled=!1,this.events=new z,this.errorHandler=_D,this.malformedUriErrorHandler=yD,this.navigated=!1,this.lastSuccessfulId=-1,this.hooks={beforePreactivation:bD,afterPreactivation:bD},this.urlHandlingStrategy=new vD,this.routeReuseStrategy=new hD,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.urlUpdateStrategy="deferred",this.relativeLinkResolution="corrected",this.canceledNavigationResolution="replace",this.ngModule=a.get(vl),this.console=a.get(Sc);var d=a.get(Fc);this.isNgZoneEnabled=d instanceof Fc&&Fc.isInAngularZone(),this.resetConfig(l),this.currentUrlTree=new kx(new Mx([],{}),{},null),this.rawUrlTree=this.currentUrlTree,this.browserUrlTree=this.currentUrlTree,this.configLoader=new pD(o,u,function(e){return c.triggerEvent(new XL(e))},function(e){return c.triggerEvent(new QL(e))}),this.routerState=Kx(this.currentUrlTree,this.rootComponentType),this.transitions=new Rv({id:0,targetPageId:0,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,extractedUrl:this.urlHandlingStrategy.extract(this.currentUrlTree),urlAfterRedirects:this.urlHandlingStrategy.extract(this.currentUrlTree),rawUrl:this.currentUrlTree,extras:{},resolve:null,reject:null,promise:Promise.resolve(!0),source:"imperative",restoredState:null,currentSnapshot:this.routerState.snapshot,targetSnapshot:null,currentRouterState:this.routerState,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null}),this.navigations=this.setupNavigations(this.transitions),this.processNavigations()}return o(e,[{key:"browserPageId",get:function(){var e;return null===(e=this.location.getState())||void 0===e?void 0:e.\u0275routerPageId}},{key:"setupNavigations",value:function(e){var t=this,n=this.events;return e.pipe(zm(function(e){return 0!==e.id}),K(function(e){return Object.assign(Object.assign({},e),{extractedUrl:t.urlHandlingStrategy.extract(e.rawUrl)})}),eg(function(e){var i,r,a,o=!1,s=!1;return bm(e).pipe(Hv(function(e){t.currentNavigation={id:e.id,initialUrl:e.currentRawUrl,extractedUrl:e.extractedUrl,trigger:e.source,extras:e.extras,previousNavigation:t.lastSuccessfulNavigation?Object.assign(Object.assign({},t.lastSuccessfulNavigation),{previousNavigation:null}):null}}),eg(function(e){var i=!t.navigated||e.extractedUrl.toString()!==t.browserUrlTree.toString(),r=("reload"===t.onSameUrlNavigation||i)&&t.urlHandlingStrategy.shouldProcessUrl(e.rawUrl);if(CD(e.source)&&(t.browserUrlTree=e.rawUrl),r)return bm(e).pipe(eg(function(e){var i=t.transitions.getValue();return n.next(new VL(e.id,t.serializeUrl(e.extractedUrl),e.source,e.restoredState)),i!==t.transitions.getValue()?ag:Promise.resolve(e)}),function(e,t,n,i){return eg(function(r){return function(e,t,n,i,r){return new KT(e,t,n,i,r).apply()}(e,t,n,r.extractedUrl,i).pipe(K(function(e){return Object.assign(Object.assign({},r),{urlAfterRedirects:e})}))})}(t.ngModule.injector,t.configLoader,t.urlSerializer,t.config),Hv(function(e){t.currentNavigation=Object.assign(Object.assign({},t.currentNavigation),{finalUrl:e.urlAfterRedirects})}),function(e,n,i,r,a){return ue(function(i){return function(e,t,n,i){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"emptyOnly",a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"legacy";try{var o=new aD(e,t,n,i,r,a).recognize();return null===o?rD(new iD):bm(o)}catch(s){return rD(s)}}(e,n,i.urlAfterRedirects,(o=i.urlAfterRedirects,t.serializeUrl(o)),r,a).pipe(K(function(e){return Object.assign(Object.assign({},i),{targetSnapshot:e})}));var o})}(t.rootComponentType,t.config,0,t.paramsInheritanceStrategy,t.relativeLinkResolution),Hv(function(e){"eager"===t.urlUpdateStrategy&&(e.extras.skipLocationChange||t.setBrowserUrl(e.urlAfterRedirects,e),t.browserUrlTree=e.urlAfterRedirects);var i=new GL(e.id,t.serializeUrl(e.extractedUrl),t.serializeUrl(e.urlAfterRedirects),e.targetSnapshot);n.next(i)}));if(i&&t.rawUrlTree&&t.urlHandlingStrategy.shouldProcessUrl(t.rawUrlTree)){var a=e.extractedUrl,o=e.source,s=e.restoredState,u=e.extras,l=new VL(e.id,t.serializeUrl(a),o,s);n.next(l);var c=Kx(a,t.rootComponentType).snapshot;return bm(Object.assign(Object.assign({},e),{targetSnapshot:c,urlAfterRedirects:a,extras:Object.assign(Object.assign({},u),{skipLocationChange:!1,replaceUrl:!1})}))}return t.rawUrlTree=e.rawUrl,t.browserUrlTree=e.urlAfterRedirects,e.resolve(null),ag}),dD(function(e){var n=e.extras;return t.hooks.beforePreactivation(e.targetSnapshot,{navigationId:e.id,appliedUrlTree:e.extractedUrl,rawUrlTree:e.rawUrl,skipLocationChange:!!n.skipLocationChange,replaceUrl:!!n.replaceUrl})}),Hv(function(e){var n=new KL(e.id,t.serializeUrl(e.extractedUrl),t.serializeUrl(e.urlAfterRedirects),e.targetSnapshot);t.triggerEvent(n)}),K(function(e){return Object.assign(Object.assign({},e),{guards:(n=e.targetSnapshot,i=e.currentSnapshot,r=t.rootContexts,a=n._root,QT(a,i?i._root:null,r,[a.value]))});var n,i,r,a}),function(e,t){return ue(function(n){var i=n.targetSnapshot,r=n.currentSnapshot,a=n.guards,o=a.canActivateChecks,s=a.canDeactivateChecks;return 0===s.length&&0===o.length?bm(Object.assign(Object.assign({},n),{guardsResult:!0})):function(e,t,n,i){return re(e).pipe(ue(function(e){return function(e,t,n,i,r){var a=t&&t.routeConfig?t.routeConfig.canDeactivate:null;return a&&0!==a.length?bm(a.map(function(a){var o,s=XT(a,t,r);if(function(e){return e&&kT(e.canDeactivate)}(s))o=mx(s.canDeactivate(e,t,n,i));else{if(!kT(s))throw new Error("Invalid CanDeactivate guard");o=mx(s(e,t,n,i))}return o.pipe(eS())})).pipe(CT()):bm(!0)}(e.component,e.route,n,t,i)}),eS(function(e){return!0!==e},!0))}(s,i,r,e).pipe(ue(function(n){return n&&"boolean"==typeof n?function(e,t,n,i){return re(t).pipe(tS(function(t){return Xm(function(e,t){return null!==e&&t&&t(new ex(e)),bm(!0)}(t.route.parent,i),function(e,t){return null!==e&&t&&t(new nx(e)),bm(!0)}(t.route,i),function(e,t,n){var i=t[t.length-1],r=t.slice(0,t.length-1).reverse().map(function(e){return function(e){var t=e.routeConfig?e.routeConfig.canActivateChild:null;return t&&0!==t.length?{node:e,guards:t}:null}(e)}).filter(function(e){return null!==e}).map(function(t){return yk(function(){return bm(t.guards.map(function(r){var a,o=XT(r,t.node,n);if(function(e){return e&&kT(e.canActivateChild)}(o))a=mx(o.canActivateChild(i,e));else{if(!kT(o))throw new Error("Invalid CanActivateChild guard");a=mx(o(i,e))}return a.pipe(eS())})).pipe(CT())})});return bm(r).pipe(CT())}(e,t.path,n),function(e,t,n){var i=t.routeConfig?t.routeConfig.canActivate:null;return i&&0!==i.length?bm(i.map(function(i){return yk(function(){var r,a=XT(i,t,n);if(function(e){return e&&kT(e.canActivate)}(a))r=mx(a.canActivate(t,e));else{if(!kT(a))throw new Error("Invalid CanActivate guard");r=mx(a(t,e))}return r.pipe(eS())})})).pipe(CT()):bm(!0)}(e,t.route,n))}),eS(function(e){return!0!==e},!0))}(i,o,e,t):bm(n)}),K(function(e){return Object.assign(Object.assign({},n),{guardsResult:e})}))})}(t.ngModule.injector,function(e){return t.triggerEvent(e)}),Hv(function(e){if(MT(e.guardsResult)){var n=ux('Redirecting to "'.concat(t.serializeUrl(e.guardsResult),'"'));throw n.url=e.guardsResult,n}var i=new JL(e.id,t.serializeUrl(e.extractedUrl),t.serializeUrl(e.urlAfterRedirects),e.targetSnapshot,!!e.guardsResult);t.triggerEvent(i)}),zm(function(e){return!!e.guardsResult||(t.restoreHistory(e),t.cancelNavigationTransition(e,""),!1)}),dD(function(e){if(e.guards.canActivateChecks.length)return bm(e).pipe(Hv(function(e){var n=new ZL(e.id,t.serializeUrl(e.extractedUrl),t.serializeUrl(e.urlAfterRedirects),e.targetSnapshot);t.triggerEvent(n)}),eg(function(e){var n,i,r=!1;return bm(e).pipe((n=t.paramsInheritanceStrategy,i=t.ngModule.injector,ue(function(e){var t=e.targetSnapshot,r=e.guards.canActivateChecks;if(!r.length)return bm(e);var a=0;return re(r).pipe(tS(function(e){return function(e,t,n,i){return function(e,t,n,i){var r=Object.keys(e);if(0===r.length)return bm({});var a={};return re(r).pipe(ue(function(r){return function(e,t,n,i){var r=XT(e,t,i);return mx(r.resolve?r.resolve(t,n):r(t,n))}(e[r],t,n,i).pipe(Hv(function(e){a[r]=e}))}),Vk(1),ue(function(){return Object.keys(a).length===r.length?bm(a):ag}))}(e._resolve,e,t,i).pipe(K(function(t){return e._resolvedData=t,e.data=Object.assign(Object.assign({},e.data),Zx(e,n).resolve),null}))}(e.route,t,n,i)}),Hv(function(){return a++}),Vk(1),ue(function(t){return a===r.length?bm(e):ag}))})),Hv({next:function(){return r=!0},complete:function(){r||(t.restoreHistory(e),t.cancelNavigationTransition(e,"At least one route resolver didn't emit any value."))}}))}),Hv(function(e){var n=new $L(e.id,t.serializeUrl(e.extractedUrl),t.serializeUrl(e.urlAfterRedirects),e.targetSnapshot);t.triggerEvent(n)}))}),dD(function(e){var n=e.extras;return t.hooks.afterPreactivation(e.targetSnapshot,{navigationId:e.id,appliedUrlTree:e.extractedUrl,rawUrlTree:e.rawUrl,skipLocationChange:!!n.skipLocationChange,replaceUrl:!!n.replaceUrl})}),K(function(e){var n,i,r,a=(r=rT(t.routeReuseStrategy,(n=e.targetSnapshot)._root,(i=e.currentRouterState)?i._root:void 0),new Gx(r,n));return Object.assign(Object.assign({},e),{targetRouterState:a})}),Hv(function(e){t.currentUrlTree=e.urlAfterRedirects,t.rawUrlTree=t.urlHandlingStrategy.merge(t.currentUrlTree,e.rawUrl),t.routerState=e.targetRouterState,"deferred"===t.urlUpdateStrategy&&(e.extras.skipLocationChange||t.setBrowserUrl(t.rawUrlTree,e),t.browserUrlTree=e.urlAfterRedirects)}),(i=t.rootContexts,r=t.routeReuseStrategy,a=function(e){return t.triggerEvent(e)},K(function(e){return new yT(r,e.targetRouterState,e.currentRouterState,a).activate(i),e})),Hv({next:function(){o=!0},complete:function(){o=!0}}),LC(function(){if(!o&&!s){var n="Navigation ID ".concat(e.id," is not equal to the current navigation id ").concat(t.navigationId);"replace"===t.canceledNavigationResolution?(t.restoreHistory(e),t.cancelNavigationTransition(e,n)):t.cancelNavigationTransition(e,n)}t.currentNavigation=null}),qM(function(i){if(s=!0,(u=i)&&u.ngNavigationCancelingError){var r=MT(i.url);r||(t.navigated=!0,t.restoreHistory(e,!0));var a=new zL(e.id,t.serializeUrl(e.extractedUrl),i.message);n.next(a),r?setTimeout(function(){var n=t.urlHandlingStrategy.merge(i.url,t.rawUrlTree),r={skipLocationChange:e.extras.skipLocationChange,replaceUrl:"eager"===t.urlUpdateStrategy||CD(e.source)};t.scheduleNavigation(n,"imperative",null,r,{resolve:e.resolve,reject:e.reject,promise:e.promise})},0):e.resolve(!1)}else{t.restoreHistory(e,!0);var o=new qL(e.id,t.serializeUrl(e.extractedUrl),i);n.next(o);try{e.resolve(t.errorHandler(i))}catch(l){e.reject(l)}}var u;return ag}))}))}},{key:"resetRootComponentType",value:function(e){this.rootComponentType=e,this.routerState.root.component=this.rootComponentType}},{key:"getTransition",value:function(){var e=this.transitions.value;return e.urlAfterRedirects=this.browserUrlTree,e}},{key:"setTransition",value:function(e){this.transitions.next(Object.assign(Object.assign({},this.getTransition()),e))}},{key:"initialNavigation",value:function(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})}},{key:"setUpLocationChangeListener",value:function(){var e=this;this.locationSubscription||(this.locationSubscription=this.location.subscribe(function(t){var n=e.extractLocationChangeInfoFromEvent(t);e.shouldScheduleNavigation(e.lastLocationChangeInfo,n)&&setTimeout(function(){var t=n.source,i=n.state,r=n.urlTree,a={replaceUrl:!0};if(i){var o=Object.assign({},i);delete o.navigationId,delete o.\u0275routerPageId,0!==Object.keys(o).length&&(a.state=o)}e.scheduleNavigation(r,t,i,a)},0),e.lastLocationChangeInfo=n}))}},{key:"extractLocationChangeInfoFromEvent",value:function(e){var t;return{source:"popstate"===e.type?"popstate":"hashchange",urlTree:this.parseUrl(e.url),state:(null===(t=e.state)||void 0===t?void 0:t.navigationId)?e.state:null,transitionId:this.getTransition().id}}},{key:"shouldScheduleNavigation",value:function(e,t){if(!e)return!0;var n=t.urlTree.toString()===e.urlTree.toString();return!(t.transitionId===e.transitionId&&n&&("hashchange"===t.source&&"popstate"===e.source||"popstate"===t.source&&"hashchange"===e.source))}},{key:"url",get:function(){return this.serializeUrl(this.currentUrlTree)}},{key:"getCurrentNavigation",value:function(){return this.currentNavigation}},{key:"triggerEvent",value:function(e){this.events.next(e)}},{key:"resetConfig",value:function(e){xT(e),this.config=e.map(OT),this.navigated=!1,this.lastSuccessfulId=-1}},{key:"ngOnDestroy",value:function(){this.dispose()}},{key:"dispose",value:function(){this.transitions.complete(),this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=void 0),this.disposed=!0}},{key:"createUrlTree",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.relativeTo,i=t.queryParams,r=t.fragment,a=t.queryParamsHandling,o=t.preserveFragment,s=n||this.routerState.root,u=o?this.currentUrlTree.fragment:r,l=null;switch(a){case"merge":l=Object.assign(Object.assign({},this.currentUrlTree.queryParams),i);break;case"preserve":l=this.currentUrlTree.queryParams;break;default:l=i||null}return null!==l&&(l=this.removeEmptyProps(l)),oT(s,this.currentUrlTree,e,l,null!=u?u:null)}},{key:"navigateByUrl",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{skipLocationChange:!1},n=MT(e)?e:this.parseUrl(e),i=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(i,"imperative",null,t)}},{key:"navigate",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{skipLocationChange:!1};return SD(e),this.navigateByUrl(this.createUrlTree(e,t),t)}},{key:"serializeUrl",value:function(e){return this.urlSerializer.serialize(e)}},{key:"parseUrl",value:function(e){var t;try{t=this.urlSerializer.parse(e)}catch(n){t=this.malformedUriErrorHandler(n,this.urlSerializer,e)}return t}},{key:"isActive",value:function(e,t){var n;if(n=!0===t?Object.assign({},wD):!1===t?Object.assign({},kD):t,MT(e))return _x(this.currentUrlTree,e,n);var i=this.parseUrl(e);return _x(this.currentUrlTree,i,n)}},{key:"removeEmptyProps",value:function(e){return Object.keys(e).reduce(function(t,n){var i=e[n];return null!=i&&(t[n]=i),t},{})}},{key:"processNavigations",value:function(){var e=this;this.navigations.subscribe(function(t){e.navigated=!0,e.lastSuccessfulId=t.id,e.currentPageId=t.targetPageId,e.events.next(new UL(t.id,e.serializeUrl(t.extractedUrl),e.serializeUrl(e.currentUrlTree))),e.lastSuccessfulNavigation=e.currentNavigation,t.resolve(!0)},function(t){e.console.warn("Unhandled Navigation Error: ")})}},{key:"scheduleNavigation",value:function(e,t,n,i,r){var a,o;if(this.disposed)return Promise.resolve(!1);var s,u,l,c=this.getTransition(),d=CD(t)&&c&&!CD(c.source),h=(this.lastSuccessfulId===c.id||this.currentNavigation?c.rawUrl:c.urlAfterRedirects).toString()===e.toString();if(d&&h)return Promise.resolve(!0);r?(s=r.resolve,u=r.reject,l=r.promise):l=new Promise(function(e,t){s=e,u=t});var f,p=++this.navigationId;return"computed"===this.canceledNavigationResolution?(0===this.currentPageId&&(n=this.location.getState()),f=n&&n.\u0275routerPageId?n.\u0275routerPageId:i.replaceUrl||i.skipLocationChange?null!==(a=this.browserPageId)&&void 0!==a?a:0:(null!==(o=this.browserPageId)&&void 0!==o?o:0)+1):f=0,this.setTransition({id:p,targetPageId:f,source:t,restoredState:n,currentUrlTree:this.currentUrlTree,currentRawUrl:this.rawUrlTree,rawUrl:e,extras:i,resolve:s,reject:u,promise:l,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),l.catch(function(e){return Promise.reject(e)})}},{key:"setBrowserUrl",value:function(e,t){var n=this.urlSerializer.serialize(e),i=Object.assign(Object.assign({},t.extras.state),this.generateNgRouterState(t.id,t.targetPageId));this.location.isCurrentPathEqualTo(n)||t.extras.replaceUrl?this.location.replaceState(n,"",i):this.location.go(n,"",i)}},{key:"restoreHistory",value:function(e){var t,n,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if("computed"===this.canceledNavigationResolution){var r=this.currentPageId-e.targetPageId,a="popstate"===e.source||"eager"===this.urlUpdateStrategy||this.currentUrlTree===(null===(t=this.currentNavigation)||void 0===t?void 0:t.finalUrl);a&&0!==r?this.location.historyGo(r):this.currentUrlTree===(null===(n=this.currentNavigation)||void 0===n?void 0:n.finalUrl)&&0===r&&(this.resetState(e),this.browserUrlTree=e.currentUrlTree,this.resetUrlToCurrentUrlTree())}else"replace"===this.canceledNavigationResolution&&(i&&this.resetState(e),this.resetUrlToCurrentUrlTree())}},{key:"resetState",value:function(e){this.routerState=e.currentRouterState,this.currentUrlTree=e.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,e.rawUrl)}},{key:"resetUrlToCurrentUrlTree",value:function(){this.location.replaceState(this.urlSerializer.serialize(this.rawUrlTree),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}},{key:"cancelNavigationTransition",value:function(e,t){var n=new zL(e.id,this.serializeUrl(e.extractedUrl),t);this.triggerEvent(n),e.resolve(!1)}},{key:"generateNgRouterState",value:function(e,t){return"computed"===this.canceledNavigationResolution?{navigationId:e,"\u0275routerPageId":t}:{navigationId:e}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(Ci),Bi(Lx),Bi(gD),Bi(Ad),Bi(qo),Bi(ud),Bi(Ac),Bi(void 0))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}();function SD(e){for(var t=0;t2&&void 0!==arguments[2]?arguments[2]:{};s(this,e),this.router=t,this.viewportScroller=n,this.options=i,this.lastId=0,this.lastSource="imperative",this.restoredId=0,this.store={},i.scrollPositionRestoration=i.scrollPositionRestoration||"disabled",i.anchorScrolling=i.anchorScrolling||"disabled"}return o(e,[{key:"init",value:function(){"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}},{key:"createScrollEvents",value:function(){var e=this;return this.router.events.subscribe(function(t){t instanceof VL?(e.store[e.lastId]=e.viewportScroller.getScrollPosition(),e.lastSource=t.navigationTrigger,e.restoredId=t.restoredState?t.restoredState.navigationId:0):t instanceof UL&&(e.lastId=t.id,e.scheduleScrollEvent(t,e.router.parseUrl(t.urlAfterRedirects).fragment))})}},{key:"consumeScrollEvents",value:function(){var e=this;return this.router.events.subscribe(function(t){t instanceof rx&&(t.position?"top"===e.options.scrollPositionRestoration?e.viewportScroller.scrollToPosition([0,0]):"enabled"===e.options.scrollPositionRestoration&&e.viewportScroller.scrollToPosition(t.position):t.anchor&&"enabled"===e.options.anchorScrolling?e.viewportScroller.scrollToAnchor(t.anchor):"disabled"!==e.options.scrollPositionRestoration&&e.viewportScroller.scrollToPosition([0,0]))})}},{key:"scheduleScrollEvent",value:function(e,t){this.router.triggerEvent(new rx(e,"popstate"===this.lastSource?this.store[this.restoredId]:null,t))}},{key:"ngOnDestroy",value:function(){this.routerEventsSubscription&&this.routerEventsSubscription.unsubscribe(),this.scrollEventsSubscription&&this.scrollEventsSubscription.unsubscribe()}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(MD),Bi(Dh),Bi(void 0))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}(),FD=new Mi("ROUTER_CONFIGURATION"),HD=new Mi("ROUTER_FORROOT_GUARD"),jD=[Ad,{provide:Lx,useClass:xx},{provide:MD,useFactory:function(e,t,n,i,r,a,o){var s=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},u=arguments.length>8?arguments[8]:void 0,l=arguments.length>9?arguments[9]:void 0,c=new MD(null,e,t,n,i,r,a,hx(o));return u&&(c.urlHandlingStrategy=u),l&&(c.routeReuseStrategy=l),qD(s,c),s.enableTracing&&c.events.subscribe(function(e){var t,n;null===(t=console.group)||void 0===t||t.call(console,"Router Event: ".concat(e.constructor.name)),console.log(e.toString()),console.log(e),null===(n=console.groupEnd)||void 0===n||n.call(console)}),c},deps:[Lx,gD,Ad,qo,ud,Ac,fD,FD,[function e(){s(this,e)},new Ji],[function e(){s(this,e)},new Ji]]},gD,{provide:Jx,useFactory:function(e){return e.routerState.root},deps:[MD]},{provide:ud,useClass:dd},ID,AD,PD,{provide:FD,useValue:{enableTracing:!1}}];function ND(){return new Qc("Router",MD)}var BD=function(){var e=function(){function e(t,n){s(this,e)}return o(e,null,[{key:"forRoot",value:function(t,n){return{ngModule:e,providers:[jD,zD(t),{provide:HD,useFactory:UD,deps:[[MD,new Ji,new Zi]]},{provide:FD,useValue:n||{}},{provide:Dd,useFactory:VD,deps:[bd,[new Ki(Ed),new Ji],FD]},{provide:RD,useFactory:WD,deps:[MD,Dh,FD]},{provide:YD,useExisting:n&&n.preloadingStrategy?n.preloadingStrategy:AD},{provide:Qc,multi:!0,useFactory:ND},[GD,{provide:gc,multi:!0,useFactory:KD,deps:[GD]},{provide:ZD,useFactory:JD,deps:[GD]},{provide:Mc,multi:!0,useExisting:ZD}]]}}},{key:"forChild",value:function(t){return{ngModule:e,providers:[zD(t)]}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(HD,8),Bi(MD,8))},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({}),e}();function WD(e,t,n){return n.scrollOffset&&t.setOffset(n.scrollOffset),new RD(e,t,n)}function VD(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.useHash?new Pd(e,t):new Yd(e,t)}function UD(e){return"guarded"}function zD(e){return[{provide:Si,multi:!0,useValue:e},{provide:fD,multi:!0,useValue:e}]}function qD(e,t){e.errorHandler&&(t.errorHandler=e.errorHandler),e.malformedUriErrorHandler&&(t.malformedUriErrorHandler=e.malformedUriErrorHandler),e.onSameUrlNavigation&&(t.onSameUrlNavigation=e.onSameUrlNavigation),e.paramsInheritanceStrategy&&(t.paramsInheritanceStrategy=e.paramsInheritanceStrategy),e.relativeLinkResolution&&(t.relativeLinkResolution=e.relativeLinkResolution),e.urlUpdateStrategy&&(t.urlUpdateStrategy=e.urlUpdateStrategy)}var GD=function(){var e=function(){function e(t){s(this,e),this.injector=t,this.initNavigation=!1,this.destroyed=!1,this.resultOfPreactivationDone=new z}return o(e,[{key:"appInitializer",value:function(){var e=this;return this.injector.get(kd,Promise.resolve(null)).then(function(){if(e.destroyed)return Promise.resolve(!0);var t=null,n=new Promise(function(e){return t=e}),i=e.injector.get(MD),r=e.injector.get(FD);return"disabled"===r.initialNavigation?(i.setUpLocationChangeListener(),t(!0)):"enabled"===r.initialNavigation||"enabledBlocking"===r.initialNavigation?(i.hooks.afterPreactivation=function(){return e.initNavigation?bm(null):(e.initNavigation=!0,t(!0),e.resultOfPreactivationDone)},i.initialNavigation()):t(!0),n})}},{key:"bootstrapListener",value:function(e){var t=this.injector.get(FD),n=this.injector.get(ID),i=this.injector.get(RD),r=this.injector.get(MD),a=this.injector.get(od);e===a.components[0]&&("enabledNonBlocking"!==t.initialNavigation&&void 0!==t.initialNavigation||r.initialNavigation(),n.setUpPreloading(),i.init(),r.resetRootComponentType(a.componentTypes[0]),this.resultOfPreactivationDone.next(null),this.resultOfPreactivationDone.complete())}},{key:"ngOnDestroy",value:function(){this.destroyed=!0}}]),e}();return e.\u0275fac=function(t){return new(t||e)(Bi(qo))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac}),e}();function KD(e){return e.appInitializer.bind(e)}function JD(e){return e.bootstrapListener.bind(e)}var ZD=new Mi("Router Initializer"),$D=["msgBar"],XD=function(){function e(e,t,n,i,r,a,o,s,u){this.appService=e,this.languageService=t,this.dialog=n,this.msgBarService=i,a.requestPinComponent=eL,o.requestWordComponent=_L,r.signTransactionConfirmationComponent=tL,u.initialize(),s.errorDuringinitialLoad.subscribe(function(e){e&&zM(2)})}return e.prototype.ngOnInit=function(){var e=this;this.appService.UpdateData(),this.languageService.initialize();var t=this.languageService.savedSelectedLanguageLoaded.subscribe(function(n){n||SL.openDialog(e.dialog,!0),t.unsubscribe()});setTimeout(function(){e.msgBarService.msgBarComponent=e.msgBar})},e.\u0275fac=function(t){return new(t||e)(ps(jS),ps(kL),ps(Pk),ps(dL),ps(gC),ps(uC),ps(fC),ps(AL),ps(nL))},e.\u0275cmp=ft({type:e,selectors:[["app-root"]],viewQuery:function(e,t){var n;1&e&&lc($D,5),2&e&&uc(n=dc())&&(t.msgBar=n.first)},decls:19,vars:3,consts:[[1,"size-alert","d-md-none"],["src","assets/img/size-alert.png"],[1,"background-fixer"],["msgBar",""]],template:function(e,t){1&e&&(vs(0,"div",0),ru(1,"\n "),vs(2,"div"),ru(3,"\n "),ys(4,"img",1),ru(5,"\n "),vs(6,"div"),ru(7),Wl(8,"translate"),_s(),ru(9,"\n "),_s(),ru(10,"\n"),_s(),ru(11,"\n"),ru(12,"\n"),ys(13,"div",2),ru(14,"\n"),ys(15,"router-outlet"),ru(16,"\n"),ys(17,"app-msg-bar",null,3)),2&e&&(Ya(7),au(Vl(8,1,"errors.window-size")))},directives:[OD,cL],pipes:[hM],styles:[".size-alert[_ngcontent-%COMP%]{background-color:rgba(0,0,0,.85);position:fixed;top:0;left:0;width:100%;height:100%;z-index:10000;display:inline-flex;align-items:center;justify-content:center;text-align:center;color:#fff}.size-alert[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{margin:0 40px;max-width:400px}"]}),e}(),QD=["input"],eO=function(e){return{enterDuration:e}},tO=["*"],nO=new Mi("mat-checkbox-default-options",{providedIn:"root",factory:iO});function iO(){return{color:"accent",clickAction:"check-indeterminate"}}var rO=0,aO=iO(),oO={provide:Mf,useExisting:Te(function(){return lO}),multi:!0},sO=function e(){s(this,e)},uO=Vw(Bw(Ww(Nw(function(){return function e(t){s(this,e),this._elementRef=t}}())))),lO=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o,u,l){var c;return s(this,n),(c=t.call(this,e))._changeDetectorRef=i,c._focusMonitor=r,c._ngZone=a,c._animationMode=u,c._options=l,c.ariaLabel="",c.ariaLabelledby=null,c._uniqueId="mat-checkbox-".concat(++rO),c.id=c._uniqueId,c.labelPosition="after",c.name=null,c.change=new Zl,c.indeterminateChange=new Zl,c._onTouched=function(){},c._currentAnimationClass="",c._currentCheckState=0,c._controlValueAccessorChangeFn=function(){},c._checked=!1,c._disabled=!1,c._indeterminate=!1,c._options=c._options||aO,c.color=c.defaultColor=c._options.color||aO.color,c.tabIndex=parseInt(o)||0,c}return o(n,[{key:"inputId",get:function(){return"".concat(this.id||this._uniqueId,"-input")}},{key:"required",get:function(){return this._required},set:function(e){this._required=pm(e)}},{key:"ngAfterViewInit",value:function(){var e=this;this._focusMonitor.monitor(this._elementRef,!0).subscribe(function(t){t||Promise.resolve().then(function(){e._onTouched(),e._changeDetectorRef.markForCheck()})}),this._syncIndeterminate(this._indeterminate)}},{key:"ngAfterViewChecked",value:function(){}},{key:"ngOnDestroy",value:function(){this._focusMonitor.stopMonitoring(this._elementRef)}},{key:"checked",get:function(){return this._checked},set:function(e){e!=this.checked&&(this._checked=e,this._changeDetectorRef.markForCheck())}},{key:"disabled",get:function(){return this._disabled},set:function(e){var t=pm(e);t!==this.disabled&&(this._disabled=t,this._changeDetectorRef.markForCheck())}},{key:"indeterminate",get:function(){return this._indeterminate},set:function(e){var t=e!=this._indeterminate;this._indeterminate=pm(e),t&&(this._transitionCheckState(this._indeterminate?3:this.checked?1:2),this.indeterminateChange.emit(this._indeterminate)),this._syncIndeterminate(this._indeterminate)}},{key:"_isRippleDisabled",value:function(){return this.disableRipple||this.disabled}},{key:"_onLabelTextChange",value:function(){this._changeDetectorRef.detectChanges()}},{key:"writeValue",value:function(e){this.checked=!!e}},{key:"registerOnChange",value:function(e){this._controlValueAccessorChangeFn=e}},{key:"registerOnTouched",value:function(e){this._onTouched=e}},{key:"setDisabledState",value:function(e){this.disabled=e}},{key:"_getAriaChecked",value:function(){return this.checked?"true":this.indeterminate?"mixed":"false"}},{key:"_transitionCheckState",value:function(e){var t=this._currentCheckState,n=this._elementRef.nativeElement;if(t!==e&&(this._currentAnimationClass.length>0&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(t,e),this._currentCheckState=e,this._currentAnimationClass.length>0)){n.classList.add(this._currentAnimationClass);var i=this._currentAnimationClass;this._ngZone.runOutsideAngular(function(){setTimeout(function(){n.classList.remove(i)},1e3)})}}},{key:"_emitChangeEvent",value:function(){var e=new sO;e.source=this,e.checked=this.checked,this._controlValueAccessorChangeFn(this.checked),this.change.emit(e),this._inputElement&&(this._inputElement.nativeElement.checked=this.checked)}},{key:"toggle",value:function(){this.checked=!this.checked}},{key:"_onInputClick",value:function(e){var t,n=this,i=null===(t=this._options)||void 0===t?void 0:t.clickAction;e.stopPropagation(),this.disabled||"noop"===i?this.disabled||"noop"!==i||(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate):(this.indeterminate&&"check"!==i&&Promise.resolve().then(function(){n._indeterminate=!1,n.indeterminateChange.emit(n._indeterminate)}),this.toggle(),this._transitionCheckState(this._checked?1:2),this._emitChangeEvent())}},{key:"focus",value:function(e,t){e?this._focusMonitor.focusVia(this._inputElement,e,t):this._inputElement.nativeElement.focus(t)}},{key:"_onInteractionEvent",value:function(e){e.stopPropagation()}},{key:"_getAnimationClassForCheckStateTransition",value:function(e,t){if("NoopAnimations"===this._animationMode)return"";var n="";switch(e){case 0:if(1===t)n="unchecked-checked";else{if(3!=t)return"";n="unchecked-indeterminate"}break;case 2:n=1===t?"unchecked-checked":"unchecked-indeterminate";break;case 1:n=2===t?"checked-unchecked":"checked-indeterminate";break;case 3:n=1===t?"indeterminate-checked":"indeterminate-unchecked"}return"mat-checkbox-anim-".concat(n)}},{key:"_syncIndeterminate",value:function(e){var t=this._inputElement;t&&(t.nativeElement.indeterminate=e)}}]),n}(uO);return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(ll),ps(x_),ps(Fc),bi("tabindex"),ps(Tw,8),ps(nO,8))},e.\u0275cmp=ft({type:e,selectors:[["mat-checkbox"]],viewQuery:function(e,t){var n;1&e&&(lc(QD,5),lc(nk,5)),2&e&&(uc(n=dc())&&(t._inputElement=n.first),uc(n=dc())&&(t.ripple=n.first))},hostAttrs:[1,"mat-checkbox"],hostVars:12,hostBindings:function(e,t){2&e&&(du("id",t.id),ls("tabindex",null),qs("mat-checkbox-indeterminate",t.indeterminate)("mat-checkbox-checked",t.checked)("mat-checkbox-disabled",t.disabled)("mat-checkbox-label-before","before"==t.labelPosition)("_mat-animation-noopable","NoopAnimations"===t._animationMode))},inputs:{disableRipple:"disableRipple",color:"color",tabIndex:"tabIndex",ariaLabel:["aria-label","ariaLabel"],ariaLabelledby:["aria-labelledby","ariaLabelledby"],id:"id",labelPosition:"labelPosition",name:"name",required:"required",checked:"checked",disabled:"disabled",indeterminate:"indeterminate",ariaDescribedby:["aria-describedby","ariaDescribedby"],value:"value"},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],features:[Du([oO]),Ko],ngContentSelectors:tO,decls:38,vars:21,consts:[[1,"mat-checkbox-layout"],["label",""],[1,"mat-checkbox-inner-container"],["type","checkbox",1,"mat-checkbox-input","cdk-visually-hidden",3,"id","required","checked","disabled","tabIndex","change","click"],["input",""],["matRipple","",1,"mat-checkbox-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleRadius","matRippleCentered","matRippleAnimation"],[1,"mat-ripple-element","mat-checkbox-persistent-ripple"],[1,"mat-checkbox-frame"],[1,"mat-checkbox-background"],["version","1.1","focusable","false","viewBox","0 0 24 24",0,"xml","space","preserve","aria-hidden","true",1,"mat-checkbox-checkmark"],["fill","none","stroke","white","d","M4.1,12.7 9,17.6 20.3,6.3",1,"mat-checkbox-checkmark-path"],[1,"mat-checkbox-mixedmark"],[1,"mat-checkbox-label",3,"cdkObserveContent"],["checkboxLabel",""],[2,"display","none"]],template:function(e,t){if(1&e&&(As(),vs(0,"label",0,1),ru(2,"\n "),vs(3,"span",2),ru(4,"\n "),vs(5,"input",3,4),xs("change",function(e){return t._onInteractionEvent(e)})("click",function(e){return t._onInputClick(e)}),_s(),ru(7,"\n "),vs(8,"span",5),ru(9,"\n "),ys(10,"span",6),ru(11,"\n "),_s(),ru(12,"\n "),ys(13,"span",7),ru(14,"\n "),vs(15,"span",8),ru(16,"\n "),An(),vs(17,"svg",9),ru(18,"\n "),ys(19,"path",10),ru(20,"\n "),_s(),ru(21,"\n "),ru(22,"\n "),In(),ys(23,"span",11),ru(24,"\n "),_s(),ru(25,"\n "),_s(),ru(26,"\n "),vs(27,"span",12,13),xs("cdkObserveContent",function(){return t._onLabelTextChange()}),ru(29,"\n "),ru(30,"\n "),vs(31,"span",14),ru(32,"\xa0"),_s(),ru(33,"\n "),Is(34),ru(35,"\n "),_s(),ru(36,"\n"),_s(),ru(37,"\n")),2&e){var n=fs(1),i=fs(28);ls("for",t.inputId),Ya(3),qs("mat-checkbox-inner-container-no-side-margin",!i.textContent||!i.textContent.trim()),Ya(2),ms("id",t.inputId)("required",t.required)("checked",t.checked)("disabled",t.disabled)("tabIndex",t.tabIndex),ls("value",t.value)("name",t.name)("aria-label",t.ariaLabel||null)("aria-labelledby",t.ariaLabelledby)("aria-checked",t._getAriaChecked())("aria-describedby",t.ariaDescribedby),Ya(3),ms("matRippleTrigger",n)("matRippleDisabled",t._isRippleDisabled())("matRippleRadius",20)("matRippleCentered",!0)("matRippleAnimation",Il(19,eO,"NoopAnimations"===t._animationMode?0:150))}},directives:[nk,Zv],styles:["@keyframes mat-checkbox-fade-in-background{0%{opacity:0}50%{opacity:1}}@keyframes mat-checkbox-fade-out-background{0%,50%{opacity:1}100%{opacity:0}}@keyframes mat-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:22.910259}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 0.1)}100%{stroke-dashoffset:0}}@keyframes mat-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mat-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);stroke-dashoffset:0}to{stroke-dashoffset:-22.910259}}@keyframes mat-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 0.1);opacity:1;transform:rotate(0deg)}to{opacity:0;transform:rotate(45deg)}}@keyframes mat-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);opacity:0;transform:rotate(45deg)}to{opacity:1;transform:rotate(360deg)}}@keyframes mat-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 0.1);opacity:0;transform:rotate(-45deg)}to{opacity:1;transform:rotate(0deg)}}@keyframes mat-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);opacity:1;transform:rotate(0deg)}to{opacity:0;transform:rotate(315deg)}}@keyframes mat-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;opacity:1;transform:scaleX(1)}32.8%,100%{opacity:0;transform:scaleX(0)}}.mat-checkbox-background,.mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:2px;box-sizing:border-box;pointer-events:none}.mat-checkbox{display:inline-block;transition:background 400ms cubic-bezier(0.25, 0.8, 0.25, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);cursor:pointer;-webkit-tap-highlight-color:transparent}._mat-animation-noopable.mat-checkbox{transition:none;animation:none}.mat-checkbox .mat-ripple-element:not(.mat-checkbox-persistent-ripple){opacity:.16}.mat-checkbox .mat-checkbox-ripple{position:absolute;left:calc(50% - 20px);top:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}.cdk-high-contrast-active .mat-checkbox.cdk-keyboard-focused .mat-checkbox-ripple{outline:solid 3px}.mat-checkbox-layout{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:inherit;align-items:baseline;vertical-align:middle;display:inline-flex;white-space:nowrap}.mat-checkbox-label{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.mat-checkbox-inner-container{display:inline-block;height:16px;line-height:0;margin:auto;margin-right:8px;order:0;position:relative;vertical-align:middle;white-space:nowrap;width:16px;flex-shrink:0}[dir=rtl] .mat-checkbox-inner-container{margin-left:8px;margin-right:auto}.mat-checkbox-inner-container-no-side-margin{margin-left:0;margin-right:0}.mat-checkbox-frame{background-color:transparent;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1);border-width:2px;border-style:solid}._mat-animation-noopable .mat-checkbox-frame{transition:none}.mat-checkbox-background{align-items:center;display:inline-flex;justify-content:center;transition:background-color 90ms cubic-bezier(0, 0, 0.2, 0.1),opacity 90ms cubic-bezier(0, 0, 0.2, 0.1);-webkit-print-color-adjust:exact;color-adjust:exact}._mat-animation-noopable .mat-checkbox-background{transition:none}.cdk-high-contrast-active .mat-checkbox .mat-checkbox-background{background:none}.mat-checkbox-persistent-ripple{display:block;width:100%;height:100%;transform:none}.mat-checkbox-inner-container:hover .mat-checkbox-persistent-ripple{opacity:.04}.mat-checkbox.cdk-keyboard-focused .mat-checkbox-persistent-ripple{opacity:.12}.mat-checkbox-persistent-ripple,.mat-checkbox.mat-checkbox-disabled .mat-checkbox-inner-container:hover .mat-checkbox-persistent-ripple{opacity:0}@media(hover: none){.mat-checkbox-inner-container:hover .mat-checkbox-persistent-ripple{display:none}}.mat-checkbox-checkmark{top:0;left:0;right:0;bottom:0;position:absolute;width:100%}.mat-checkbox-checkmark-path{stroke-dashoffset:22.910259;stroke-dasharray:22.910259;stroke-width:2.1333333333px}.cdk-high-contrast-black-on-white .mat-checkbox-checkmark-path{stroke:#000 !important}.mat-checkbox-mixedmark{width:calc(100% - 6px);height:2px;opacity:0;transform:scaleX(0) rotate(0deg);border-radius:2px}.cdk-high-contrast-active .mat-checkbox-mixedmark{height:0;border-top:solid 2px;margin-top:2px}.mat-checkbox-label-before .mat-checkbox-inner-container{order:1;margin-left:8px;margin-right:auto}[dir=rtl] .mat-checkbox-label-before .mat-checkbox-inner-container{margin-left:auto;margin-right:8px}.mat-checkbox-checked .mat-checkbox-checkmark{opacity:1}.mat-checkbox-checked .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-checked .mat-checkbox-mixedmark{transform:scaleX(1) rotate(-45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark{opacity:0;transform:rotate(45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-indeterminate .mat-checkbox-mixedmark{opacity:1;transform:scaleX(1) rotate(0deg)}.mat-checkbox-unchecked .mat-checkbox-background{background-color:transparent}.mat-checkbox-disabled{cursor:default}.cdk-high-contrast-active .mat-checkbox-disabled{opacity:.5}.mat-checkbox-anim-unchecked-checked .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-checked .mat-checkbox-checkmark-path{animation:180ms linear 0ms mat-checkbox-unchecked-checked-checkmark-path}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0ms mat-checkbox-unchecked-indeterminate-mixedmark}.mat-checkbox-anim-checked-unchecked .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-out-background}.mat-checkbox-anim-checked-unchecked .mat-checkbox-checkmark-path{animation:90ms linear 0ms mat-checkbox-checked-unchecked-checkmark-path}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-checkmark{animation:90ms linear 0ms mat-checkbox-checked-indeterminate-checkmark}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0ms mat-checkbox-checked-indeterminate-mixedmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-checkmark{animation:500ms linear 0ms mat-checkbox-indeterminate-checked-checkmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-mixedmark{animation:500ms linear 0ms mat-checkbox-indeterminate-checked-mixedmark}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-background{animation:180ms linear 0ms mat-checkbox-fade-out-background}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-mixedmark{animation:300ms linear 0ms mat-checkbox-indeterminate-unchecked-mixedmark}.mat-checkbox-input{bottom:0;left:50%}\n"],encapsulation:2,changeDetection:0}),e}(),cO=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({}),e}(),dO=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[ik,jw,$v,cO],jw,cO]}),e}();function hO(e,t){if(1&e){var n=Ms();vs(0,"span",6),xs("click",function(){on(n);var e=Ys();return e.data.linkFunction(),e.closeModal(!1)}),ru(1),Wl(2,"translate"),_s()}if(2&e){var i=Ys();Ya(1),au(Vl(2,1,i.data.linkText))}}function fO(e,t){if(1&e){var n=Ms();vs(0,"div",7),ru(1,"\n "),vs(2,"mat-checkbox",8),xs("change",function(e){return on(n),Ys().setAccept(e)}),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("checked",i.accepted),Ya(1),ou("",Vl(4,2,i.data.checkboxText),"\n ")}}function pO(e,t){if(1&e){var n=Ms();vs(0,"app-button",9),xs("action",function(){return on(n),Ys().closeModal(!1)}),ru(1),Wl(2,"translate"),_s()}if(2&e){var i=Ys();Ya(1),ou("\n ",Vl(2,1,i.data.cancelButtonText),"\n ")}}var mO,gO=function(e){return e.YesNo="YesNo",e.ContinueCancel="ContinueCancel",e.Close="Close",e}({}),vO=function(){function e(e,t){this.dialogRef=e,this.data=t,this.accepted=!1,this.disableDismiss=!1,t.headerText||(t.headerText="confirmation.default-title"),t.defaultButtons&&(t.confirmButtonText=null,t.cancelButtonText=null,t.defaultButtons===gO.Close&&(t.confirmButtonText="common.close-button"),t.defaultButtons===gO.YesNo&&(t.confirmButtonText="confirmation.yes-button",t.cancelButtonText="confirmation.no-button"),t.defaultButtons===gO.ContinueCancel&&(t.confirmButtonText="common.continue-button",t.cancelButtonText="common.cancel-button")),this.disableDismiss=!!t.disableDismiss}return e.openDialog=function(t,n){var i=new wk;return i.data=n,i.autoFocus=!1,i.width="450px",t.open(e,i)},e.prototype.closeModal=function(e){this.dialogRef.close(e)},e.prototype.setAccept=function(e){this.accepted=!!e.checked},e.\u0275fac=function(t){return new(t||e)(ps(Lk),ps(Tk))},e.\u0275cmp=ft({type:e,selectors:[["app-confirmation"]],decls:18,vars:16,consts:[[3,"useRedTitle","headline","dialog","disableDismiss"],["class","link",3,"click",4,"ngIf"],["class","-check-container",4,"ngIf"],[1,"-buttons"],[3,"action",4,"ngIf"],[1,"primary-button",3,"disabled","action"],[1,"link",3,"click"],[1,"-check-container"],["type","checkbox","id","terms",1,"-check","e2e-confirm-checkbox",3,"checked","change"],[3,"action"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2),Wl(3,"translate"),hs(4,hO,3,3,"span",1),ru(5,"\n\n "),hs(6,fO,6,4,"div",2),ru(7,"\n\n "),vs(8,"div",3),ru(9,"\n "),hs(10,pO,3,3,"app-button",4),ru(11,"\n "),vs(12,"app-button",5),xs("action",function(){return t.closeModal(!0)}),ru(13),Wl(14,"translate"),_s(),ru(15,"\n "),_s(),ru(16,"\n"),_s(),ru(17,"\n")),2&e&&(ms("useRedTitle",t.data.redTitle)("headline",Vl(1,10,t.data.headerText))("dialog",t.dialogRef)("disableDismiss",t.disableDismiss),Ya(2),ou("\n ",Vl(3,12,t.data.text),"\n "),Ya(2),ms("ngIf",t.data.linkText&&t.data.linkFunction),Ya(2),ms("ngIf",t.data.checkboxText),Ya(4),ms("ngIf",t.data.cancelButtonText),Ya(2),ms("disabled",t.data.checkboxText&&!t.accepted),Ya(1),ou("\n ",Vl(14,14,t.data.confirmButtonText),"\n "))},directives:[jk,lh,ZC,lO],pipes:[hM],styles:[""]}),e}(),_O=function(){function e(e,t,n){var i=this;this.walletsAndAddressesService=e,this.apiService=t,this.ngZone=n,this.walletsWithBalanceSubject=new fg(1),this.hasPendingTransactionsSubject=new Rv(!1),this.firstFullUpdateMadeSubject=new Rv(!1),this.updatePeriod=1e4,this.errorUpdatePeriod=2e3,this.savedBalanceData=new Map,this.temporalSavedBalanceData=new Map,this.walletsAndAddressesService.allWallets.subscribe(function(e){i.savedWalletsList=e,i.startDataRefreshSubscription(0,!0)})}return Object.defineProperty(e.prototype,"walletsWithBalance",{get:function(){return this.walletsWithBalanceSubject.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasPendingTransactions",{get:function(){return this.hasPendingTransactionsSubject.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"firstFullUpdateMade",{get:function(){return this.firstFullUpdateMadeSubject.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"outputsWithWallets",{get:function(){var e=this;return this.walletsWithBalance.pipe(eg(function(t){var n=t.map(function(e){return e.addresses.map(function(e){return e.address}).join(",")}).join(",");return e.getOutputs(n)}),K(function(t){var n=[];return e.walletsWithBalanceList.forEach(function(e){return n.push(function(e){var t=new YL;return Object.assign(t,xL(e,!1)),e.addresses.forEach(function(e){t.addresses.push(function(e){var t=new PL;return Object.assign(t,TL(e)),t}(e))}),t}(e))}),n.forEach(function(e){e.addresses.forEach(function(e){e.outputs=t.filter(function(t){return t.address===e.address})})}),n}))},enumerable:!1,configurable:!0}),e.prototype.getOutputs=function(e){return e?this.apiService.post("outputs",{addrs:e}).pipe(K(function(e){var t=[];return e.head_outputs.forEach(function(e){var n={address:e.address,coins:new CM.BigNumber(e.coins),hash:e.hash,hours:new CM.BigNumber(e.calculated_hours)};t.push(n)}),t})):bm([])},e.prototype.getWalletUnspentOutputs=function(e){var t=e.addresses.map(function(e){return e.address}).join(",");return this.getOutputs(t)},e.prototype.refreshBalance=function(){this.startDataRefreshSubscription(0,!1)},e.prototype.startDataRefreshSubscription=function(e,t){var n=this;this.dataRefreshSubscription&&this.dataRefreshSubscription.unsubscribe(),this.savedWalletsList&&this.ngZone.runOutsideAngular(function(){n.dataRefreshSubscription=bm(0).pipe(EM(e),ue(function(){return t?n.refreshBalances(n.savedWalletsList,!0):bm(0)}),ue(function(){return n.refreshBalances(n.savedWalletsList,!1)})).subscribe(function(){return n.startDataRefreshSubscription(n.updatePeriod,!1)},function(){return n.startDataRefreshSubscription(n.errorUpdatePeriod,!1)})})},e.prototype.refreshBalances=function(e,t){var n=this;this.gettingBalanceSubscription&&this.gettingBalanceSubscription.unsubscribe();var i=[];return e.forEach(function(e){i.push(function(e){var t=new OL;return Object.assign(t,xL(e,!1)),e.addresses.forEach(function(e){t.addresses.push(function(e){var t=new EL;return Object.assign(t,TL(e)),t}(e))}),t}(e))}),t||(this.temporalSavedBalanceData=new Map),yf(i.map(function(e){return n.retrieveWalletBalance(e,t)})).pipe(Hv(function(e){if(n.hasPendingTransactionsSubject.next(e.some(function(e){return e})),!n.walletsWithBalanceList||t||n.walletsWithBalanceList.length!==i.length)n.walletsWithBalanceList=i,n.informDataUpdated();else{var r=!1;n.walletsWithBalanceList.forEach(function(e,t){e.id!==i[t].id&&(r=!0)}),r?(n.walletsWithBalanceList=i,n.informDataUpdated()):(n.walletsWithBalanceList.forEach(function(e,t){e.coins.isEqualTo(i[t].coins)&&e.hours.isEqualTo(i[t].hours)||(e.coins=i[t].coins,e.hours=i[t].hours,r=!0),e.addresses.length!==i[t].addresses.length?(e.addresses=i[t].addresses,r=!0):e.addresses.forEach(function(e,n){e.coins.isEqualTo(i[t].addresses[n].coins)&&e.hours.isEqualTo(i[t].addresses[n].hours)||(e.coins=i[t].addresses[n].coins,e.hours=i[t].addresses[n].hours,r=!0)})}),r&&n.informDataUpdated())}t||(n.savedBalanceData=n.temporalSavedBalanceData,n.firstFullUpdateMadeSubject.value||n.ngZone.run(function(){n.firstFullUpdateMadeSubject.next(!0)}))}))},e.prototype.retrieveWalletBalance=function(e,t){var n,i=this;if(t)n=this.savedBalanceData.has(e.id)?bm(this.savedBalanceData.get(e.id)):bm({addresses:[]});else if(e.isHardware){var r=e.addresses.map(function(e){return e.address}).join(",");n=this.apiService.post("balance",{addrs:r})}else n=this.apiService.get("wallet/balance",{id:e.id});return n.pipe(K(function(n){return i.temporalSavedBalanceData.set(e.id,n),n.confirmed?(e.coins=new CM.BigNumber(n.confirmed.coins).dividedBy(1e6),e.hours=new CM.BigNumber(n.confirmed.hours)):(e.coins=new CM.BigNumber(0),e.hours=new CM.BigNumber(0)),e.addresses.forEach(function(e){n.addresses[e.address]?(e.coins=new CM.BigNumber(n.addresses[e.address].confirmed.coins).dividedBy(1e6),e.hours=new CM.BigNumber(n.addresses[e.address].confirmed.hours)):(e.coins=new CM.BigNumber(0),e.hours=new CM.BigNumber(0))}),t?i.hasPendingTransactionsSubject.value:!new CM.BigNumber(n.predicted.coins).dividedBy(1e6).isEqualTo(e.coins)||!new CM.BigNumber(n.predicted.hours).isEqualTo(e.hours)}))},e.prototype.informDataUpdated=function(){var e=this;this.ngZone.run(function(){e.walletsWithBalanceSubject.next(e.walletsWithBalanceList)})},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(AL),Bi(HS),Bi(Fc))}}),e}(),yO=function(){function e(e,t,n){this.apiService=e,this.ngZone=t,this.balanceAndOutputsService=n,this.progressSubject=new fg(1),this.lastCurrentBlock=0,this.lastHighestBlock=0,this.nodeSynchronized=!1,this.refreshedBalance=!1,this.updatePeriod=2e3,this.errorUpdatePeriod=2e3,this.startDataRefreshSubscription(0)}return Object.defineProperty(e.prototype,"progress",{get:function(){return this.progressSubject.asObservable()},enumerable:!1,configurable:!0}),e.prototype.getLastBlock=function(){return this.apiService.get("last_blocks",{num:1}).pipe(K(function(e){return{seq:e.blocks[0].header.seq,timestamp:e.blocks[0].header.timestamp,hash:e.blocks[0].header.block_hash}}))},e.prototype.getCoinSupply=function(){return this.apiService.get("coinSupply").pipe(K(function(e){return{currentSupply:e.current_supply,totalSupply:e.total_supply,currentCoinhourSupply:e.current_coinhour_supply,totalCoinhourSupply:e.total_coinhour_supply}}))},e.prototype.startDataRefreshSubscription=function(e){var t=this;this.dataSubscription&&this.dataSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){t.dataSubscription=bm(0).pipe(EM(e),ue(function(){return t.apiService.get("blockchain/progress")})).subscribe(function(e){t.ngZone.run(function(){!e||!e.current||!e.highest||0===e.highest||e.current visible",H_("200ms cubic-bezier(0, 0, 0.2, 1)",W_([N_({opacity:0,transform:"scale(0)",offset:0}),N_({opacity:.5,transform:"scale(0.99)",offset:.5}),N_({opacity:1,transform:"scale(1)",offset:1})]))),V_("* => hidden",H_("100ms cubic-bezier(0, 0, 0.2, 1)",N_({opacity:0})))])},LO="tooltip-panel",xO=Mg({passive:!0}),TO=new Mi("mat-tooltip-scroll-strategy"),DO={provide:TO,deps:[Dv],useFactory:function(e){return function(){return e.scrollStrategies.reposition({scrollThrottle:20})}}},OO=new Mi("mat-tooltip-default-options",{providedIn:"root",factory:function(){return{showDelay:0,hideDelay:0,touchendHideDelay:1500}}}),EO=function(){var e=function(){function e(t,n,i,r,a,o,u,l,c,d,h,f){var p=this;s(this,e),this._overlay=t,this._elementRef=n,this._scrollDispatcher=i,this._viewContainerRef=r,this._ngZone=a,this._platform=o,this._ariaDescriber=u,this._focusMonitor=l,this._dir=d,this._defaultOptions=h,this._position="below",this._disabled=!1,this._viewInitialized=!1,this._pointerExitEventsInitialized=!1,this._viewportMargin=8,this._cssClassPrefix="mat",this.showDelay=this._defaultOptions.showDelay,this.hideDelay=this._defaultOptions.hideDelay,this.touchGestures="auto",this._message="",this._passiveListeners=[],this._destroyed=new z,this._handleKeydown=function(e){p._isTooltipVisible()&&e.keyCode===Zg&&!Qg(e)&&(e.preventDefault(),e.stopPropagation(),p._ngZone.run(function(){return p.hide(0)}))},this._scrollStrategy=c,this._document=f,h&&(h.position&&(this.position=h.position),h.touchGestures&&(this.touchGestures=h.touchGestures)),d.change.pipe(Km(this._destroyed)).subscribe(function(){p._overlayRef&&p._updatePosition(p._overlayRef)}),a.runOutsideAngular(function(){n.nativeElement.addEventListener("keydown",p._handleKeydown)})}return o(e,[{key:"position",get:function(){return this._position},set:function(e){var t;e!==this._position&&(this._position=e,this._overlayRef&&(this._updatePosition(this._overlayRef),null===(t=this._tooltipInstance)||void 0===t||t.show(0),this._overlayRef.updatePosition()))}},{key:"disabled",get:function(){return this._disabled},set:function(e){this._disabled=pm(e),this._disabled?this.hide(0):this._setupPointerEnterEventsIfNeeded()}},{key:"message",get:function(){return this._message},set:function(e){var t=this;this._ariaDescriber.removeDescription(this._elementRef.nativeElement,this._message,"tooltip"),this._message=null!=e?String(e).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._setupPointerEnterEventsIfNeeded(),this._updateTooltipMessage(),this._ngZone.runOutsideAngular(function(){Promise.resolve().then(function(){t._ariaDescriber.describe(t._elementRef.nativeElement,t.message,"tooltip")})}))}},{key:"tooltipClass",get:function(){return this._tooltipClass},set:function(e){this._tooltipClass=e,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)}},{key:"ngAfterViewInit",value:function(){var e=this;this._viewInitialized=!0,this._setupPointerEnterEventsIfNeeded(),this._focusMonitor.monitor(this._elementRef).pipe(Km(this._destroyed)).subscribe(function(t){t?"keyboard"===t&&e._ngZone.run(function(){return e.show()}):e._ngZone.run(function(){return e.hide(0)})})}},{key:"ngOnDestroy",value:function(){var e=this._elementRef.nativeElement;clearTimeout(this._touchstartTimeout),this._overlayRef&&(this._overlayRef.dispose(),this._tooltipInstance=null),e.removeEventListener("keydown",this._handleKeydown),this._passiveListeners.forEach(function(t){var n=_(t,2);e.removeEventListener(n[0],n[1],xO)}),this._passiveListeners.length=0,this._destroyed.next(),this._destroyed.complete(),this._ariaDescriber.removeDescription(e,this.message,"tooltip"),this._focusMonitor.stopMonitoring(e)}},{key:"show",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.showDelay;if(!this.disabled&&this.message&&(!this._isTooltipVisible()||this._tooltipInstance._showTimeoutId||this._tooltipInstance._hideTimeoutId)){var n=this._createOverlay();this._detach(),this._portal=this._portal||new Fg(this._tooltipComponent,this._viewContainerRef),this._tooltipInstance=n.attach(this._portal).instance,this._tooltipInstance.afterHidden().pipe(Km(this._destroyed)).subscribe(function(){return e._detach()}),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),this._tooltipInstance.show(t)}}},{key:"hide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.hideDelay;this._tooltipInstance&&this._tooltipInstance.hide(e)}},{key:"toggle",value:function(){this._isTooltipVisible()?this.hide():this.show()}},{key:"_isTooltipVisible",value:function(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()}},{key:"_createOverlay",value:function(){var e=this;if(this._overlayRef)return this._overlayRef;var t=this._scrollDispatcher.getAncestorScrollContainers(this._elementRef),n=this._overlay.position().flexibleConnectedTo(this._elementRef).withTransformOriginOn(".".concat(this._cssClassPrefix,"-tooltip")).withFlexibleDimensions(!1).withViewportMargin(this._viewportMargin).withScrollableContainers(t);return n.positionChanges.pipe(Km(this._destroyed)).subscribe(function(t){e._updateCurrentPositionClass(t.connectionPair),e._tooltipInstance&&t.scrollableViewProperties.isOverlayClipped&&e._tooltipInstance.isVisible()&&e._ngZone.run(function(){return e.hide(0)})}),this._overlayRef=this._overlay.create({direction:this._dir,positionStrategy:n,panelClass:"".concat(this._cssClassPrefix,"-").concat(LO),scrollStrategy:this._scrollStrategy()}),this._updatePosition(this._overlayRef),this._overlayRef.detachments().pipe(Km(this._destroyed)).subscribe(function(){return e._detach()}),this._overlayRef.outsidePointerEvents().pipe(Km(this._destroyed)).subscribe(function(){var t;return null===(t=e._tooltipInstance)||void 0===t?void 0:t._handleBodyInteraction()}),this._overlayRef}},{key:"_detach",value:function(){this._overlayRef&&this._overlayRef.hasAttached()&&this._overlayRef.detach(),this._tooltipInstance=null}},{key:"_updatePosition",value:function(e){var t=e.getConfig().positionStrategy,n=this._getOrigin(),i=this._getOverlayPosition();t.withPositions([this._addOffset(Object.assign(Object.assign({},n.main),i.main)),this._addOffset(Object.assign(Object.assign({},n.fallback),i.fallback))])}},{key:"_addOffset",value:function(e){return e}},{key:"_getOrigin",value:function(){var e,t=!this._dir||"ltr"==this._dir.value,n=this.position;"above"==n||"below"==n?e={originX:"center",originY:"above"==n?"top":"bottom"}:"before"==n||"left"==n&&t||"right"==n&&!t?e={originX:"start",originY:"center"}:("after"==n||"right"==n&&t||"left"==n&&!t)&&(e={originX:"end",originY:"center"});var i=this._invertPosition(e.originX,e.originY);return{main:e,fallback:{originX:i.x,originY:i.y}}}},{key:"_getOverlayPosition",value:function(){var e,t=!this._dir||"ltr"==this._dir.value,n=this.position;"above"==n?e={overlayX:"center",overlayY:"bottom"}:"below"==n?e={overlayX:"center",overlayY:"top"}:"before"==n||"left"==n&&t||"right"==n&&!t?e={overlayX:"end",overlayY:"center"}:("after"==n||"right"==n&&t||"left"==n&&!t)&&(e={overlayX:"start",overlayY:"center"});var i=this._invertPosition(e.overlayX,e.overlayY);return{main:e,fallback:{overlayX:i.x,overlayY:i.y}}}},{key:"_updateTooltipMessage",value:function(){var e=this;this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),this._ngZone.onMicrotaskEmpty.pipe(zg(1),Km(this._destroyed)).subscribe(function(){e._tooltipInstance&&e._overlayRef.updatePosition()}))}},{key:"_setTooltipClass",value:function(e){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=e,this._tooltipInstance._markForCheck())}},{key:"_invertPosition",value:function(e,t){return"above"===this.position||"below"===this.position?"top"===t?t="bottom":"bottom"===t&&(t="top"):"end"===e?e="start":"start"===e&&(e="end"),{x:e,y:t}}},{key:"_updateCurrentPositionClass",value:function(e){var t,n=e.overlayY,i=e.originX;if((t="center"===n?this._dir&&"rtl"===this._dir.value?"end"===i?"left":"right":"start"===i?"left":"right":"bottom"===n&&"top"===e.originY?"above":"below")!==this._currentPosition){var r=this._overlayRef;if(r){var a="".concat(this._cssClassPrefix,"-").concat(LO,"-");r.removePanelClass(a+this._currentPosition),r.addPanelClass(a+t)}this._currentPosition=t}}},{key:"_setupPointerEnterEventsIfNeeded",value:function(){var e=this;!this._disabled&&this.message&&this._viewInitialized&&!this._passiveListeners.length&&(this._platformSupportsMouseEvents()?this._passiveListeners.push(["mouseenter",function(){e._setupPointerExitEventsIfNeeded(),e.show()}]):"off"!==this.touchGestures&&(this._disableNativeGesturesIfNecessary(),this._passiveListeners.push(["touchstart",function(){e._setupPointerExitEventsIfNeeded(),clearTimeout(e._touchstartTimeout),e._touchstartTimeout=setTimeout(function(){return e.show()},500)}])),this._addListeners(this._passiveListeners))}},{key:"_setupPointerExitEventsIfNeeded",value:function(){var e,t=this;if(!this._pointerExitEventsInitialized){this._pointerExitEventsInitialized=!0;var n=[];if(this._platformSupportsMouseEvents())n.push(["mouseleave",function(){return t.hide()}],["wheel",function(e){return t._wheelListener(e)}]);else if("off"!==this.touchGestures){this._disableNativeGesturesIfNecessary();var i=function(){clearTimeout(t._touchstartTimeout),t.hide(t._defaultOptions.touchendHideDelay)};n.push(["touchend",i],["touchcancel",i])}this._addListeners(n),(e=this._passiveListeners).push.apply(e,n)}}},{key:"_addListeners",value:function(e){var t=this;e.forEach(function(e){var n=_(e,2);t._elementRef.nativeElement.addEventListener(n[0],n[1],xO)})}},{key:"_platformSupportsMouseEvents",value:function(){return!this._platform.IOS&&!this._platform.ANDROID}},{key:"_wheelListener",value:function(e){if(this._isTooltipVisible()){var t=this._document.elementFromPoint(e.clientX,e.clientY),n=this._elementRef.nativeElement;t===n||n.contains(t)||this.hide()}}},{key:"_disableNativeGesturesIfNecessary",value:function(){var e=this.touchGestures;if("off"!==e){var t=this._elementRef.nativeElement,n=t.style;("on"===e||"INPUT"!==t.nodeName&&"TEXTAREA"!==t.nodeName)&&(n.userSelect=n.msUserSelect=n.webkitUserSelect=n.MozUserSelect="none"),"on"!==e&&t.draggable||(n.webkitUserDrag="none"),n.touchAction="none",n.webkitTapHighlightColor="transparent"}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(Dv),ps(Fu),ps(Yg),ps(bl),ps(Fc),ps(yg),ps(a_),ps(x_),ps(void 0),ps(Dg),ps(void 0),ps(yd))},e.\u0275dir=bt({type:e,inputs:{showDelay:["matTooltipShowDelay","showDelay"],hideDelay:["matTooltipHideDelay","hideDelay"],touchGestures:["matTooltipTouchGestures","touchGestures"],position:["matTooltipPosition","position"],disabled:["matTooltipDisabled","disabled"],message:["matTooltip","message"],tooltipClass:["matTooltipClass","tooltipClass"]}}),e}(),YO=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o,u,l,c,d,h,f,p){var m;return s(this,n),(m=t.call(this,e,i,r,a,o,u,l,c,d,h,f,p))._tooltipComponent=AO,m}return n}(EO);return e.\u0275fac=function(t){return new(t||e)(ps(Dv),ps(Fu),ps(Yg),ps(bl),ps(Fc),ps(yg),ps(a_),ps(x_),ps(TO),ps(Dg,8),ps(OO,8),ps(yd))},e.\u0275dir=bt({type:e,selectors:[["","matTooltip",""]],hostAttrs:[1,"mat-tooltip-trigger"],exportAs:["matTooltip"],features:[Ko]}),e}(),PO=function(){var e=function(){function e(t){s(this,e),this._changeDetectorRef=t,this._visibility="initial",this._closeOnInteraction=!1,this._onHide=new z}return o(e,[{key:"show",value:function(e){var t=this;clearTimeout(this._hideTimeoutId),this._closeOnInteraction=!0,this._showTimeoutId=setTimeout(function(){t._visibility="visible",t._showTimeoutId=void 0,t._onShow(),t._markForCheck()},e)}},{key:"hide",value:function(e){var t=this;clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(function(){t._visibility="hidden",t._hideTimeoutId=void 0,t._markForCheck()},e)}},{key:"afterHidden",value:function(){return this._onHide}},{key:"isVisible",value:function(){return"visible"===this._visibility}},{key:"ngOnDestroy",value:function(){clearTimeout(this._showTimeoutId),clearTimeout(this._hideTimeoutId),this._onHide.complete()}},{key:"_animationStart",value:function(){this._closeOnInteraction=!1}},{key:"_animationDone",value:function(e){var t=e.toState;"hidden"!==t||this.isVisible()||this._onHide.next(),"visible"!==t&&"hidden"!==t||(this._closeOnInteraction=!0)}},{key:"_handleBodyInteraction",value:function(){this._closeOnInteraction&&this.hide(0)}},{key:"_markForCheck",value:function(){this._changeDetectorRef.markForCheck()}},{key:"_onShow",value:function(){}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(ll))},e.\u0275dir=bt({type:e}),e}(),AO=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i){var r;return s(this,n),(r=t.call(this,e))._breakpointObserver=i,r._isHandset=r._breakpointObserver.observe("(max-width: 599.98px) and (orientation: portrait), (max-width: 959.98px) and (orientation: landscape)"),r}return n}(PO);return e.\u0275fac=function(t){return new(t||e)(ps(ll),ps(MO))},e.\u0275cmp=ft({type:e,selectors:[["mat-tooltip-component"]],hostAttrs:["aria-hidden","true"],hostVars:2,hostBindings:function(e,t){2&e&&zs("zoom","visible"===t._visibility?1:null)},features:[Ko],decls:4,vars:7,consts:[[1,"mat-tooltip",3,"ngClass"]],template:function(e,t){var n;1&e&&(vs(0,"div",0),xs("@state.start",function(){return t._animationStart()})("@state.done",function(e){return t._animationDone(e)}),Wl(1,"async"),ru(2),_s(),ru(3,"\n")),2&e&&(qs("mat-tooltip-handset",null==(n=Vl(1,5,t._isHandset))?null:n.matches),ms("ngClass",t.tooltipClass)("@state",t._visibility),Ya(2),au(t.message))},directives:[ah],pipes:[kh],styles:[".mat-tooltip-panel{pointer-events:none !important}.mat-tooltip{color:#fff;border-radius:4px;margin:14px;max-width:250px;padding-left:8px;padding-right:8px;overflow:hidden;text-overflow:ellipsis}.cdk-high-contrast-active .mat-tooltip{outline:solid 1px}.mat-tooltip-handset{margin:24px;padding-left:16px;padding-right:16px}\n"],encapsulation:2,data:{animation:[CO.tooltipState]},changeDetection:0}),e}(),IO=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[DO],imports:[[Y_,Th,Iv,jw],jw,Ag]}),e}(),RO=function(e){function t(t,n,i,r,a,o,s,u,l,c,d,h,f,p){var m=e.call(this,r,i,a,o,s,u,l,c,d,h,f,p)||this;return m.translate=t,m.renderer=n,m.elementRef=i,m.tooltipClass="error-tooltip",m}return vf(t,e),Object.defineProperty(t.prototype,"appFormFieldError",{set:function(e){this.message=e?this.translate.instant(e):null,this.updateField()},enumerable:!1,configurable:!0}),t.prototype.updateField=function(){this.message?(this.renderer.addClass(this.elementRef.nativeElement,"red-field"),document.activeElement===this.elementRef.nativeElement&&this.show()):this.renderer.removeClass(this.elementRef.nativeElement,"red-field")},t.\u0275fac=function(e){return new(e||t)(ps(dM),ps(Nu),ps(Fu),ps(Dv),ps(Yg),ps(bl),ps(Fc),ps(yg),ps(a_),ps(x_),ps(TO),ps(Dg,8),ps(OO,8),ps(yd))},t.\u0275dir=bt({type:t,selectors:[["","appFormFieldError",""]],inputs:{appFormFieldError:"appFormFieldError"},features:[Ko]}),t}(YO),FO=function(){function e(e){this.el=e,e.nativeElement.autocomplete="new-password",e.nativeElement.readOnly=!0}return e.prototype.onFocus=function(){this.el.nativeElement.readOnly=!1},e.\u0275fac=function(t){return new(t||e)(ps(Fu))},e.\u0275dir=bt({type:e,selectors:[["","appDontSavePassword",""]],hostBindings:function(e,t){1&e&&xs("focus",function(){return t.onFocus()})}}),e}(),HO=function(e,t){return{"pl-0":e,"white-text":t}},jO=function(){function e(){this.noPadding=!1,this.pointDown=!0,this.text="",this.pressed=new Zl}return e.prototype.onClick=function(e){this.pressed.emit(e)},e.prototype.ngOnDestroy=function(){this.pressed.complete()},e.\u0275fac=function(t){return new(t||e)},e.\u0275cmp=ft({type:e,selectors:[["app-arrow-link"]],inputs:{noPadding:"noPadding",pointDown:"pointDown",text:"text",whiteText:"whiteText"},outputs:{pressed:"pressed"},decls:7,vars:8,consts:[[1,"link",3,"ngClass","click"]],template:function(e,t){1&e&&(vs(0,"span",0),xs("click",function(e){return t.onClick(e)}),ru(1),Wl(2,"translate"),vs(3,"mat-icon"),ru(4),_s(),ru(5,"\n"),_s(),ru(6,"\n")),2&e&&(ms("ngClass",Rl(5,HO,t.noPadding,t.whiteText)),Ya(1),ou("\n ",Vl(2,3,t.text),"\n "),Ya(3),au(t.pointDown?"keyboard_arrow_down":"keyboard_arrow_up"))},directives:[ah,WC],pipes:[hM],styles:["span[_ngcontent-%COMP%]{padding-left:5px}span[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{padding:0;display:inline;vertical-align:middle;font-size:13px}"]}),e}(),NO=["temporalWalletCheck"];function BO(e,t){if(1&e&&(vs(0,"div",1),ru(1,"\n "),vs(2,"label",10),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),vs(6,"div",11),ru(7,"\n "),vs(8,"select",12),ru(9,"\n "),vs(10,"option",13),ru(11),Wl(12,"translate"),_s(),ru(13,"\n "),vs(14,"option",13),ru(15),Wl(16,"translate"),_s(),ru(17,"\n "),_s(),ru(18,"\n "),_s(),ru(19,"\n "),_s()),2&e){var n=Ys();Ya(3),au(Vl(4,6,"wallet.new.words-number-label")),Ya(5),ls("disabled",n.busy?"true":null),Ya(2),ms("ngValue",12),Ya(1),au(Vl(12,8,"wallet.new.12-words")),Ya(3),ms("ngValue",24),Ya(1),au(Vl(16,10,"wallet.new.24-words"))}}var WO=function(e,t){return{"-white-text":e,"element-disabled":t}};function VO(e,t){if(1&e){var n=Ms();vs(0,"span",14),ru(1,"\n "),vs(2,"span",15),xs("click",function(){return on(n),Ys().generateSeed(128)}),Wl(3,"translate"),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),vs(7,"span",16),ru(8,"|"),_s(),ru(9,"\n "),vs(10,"span",15),xs("click",function(){return on(n),Ys().generateSeed(256)}),Wl(11,"translate"),ru(12),Wl(13,"translate"),_s(),ru(14,"\n "),_s()}if(2&e){var i=Ys();ms("ngClass",Rl(13,WO,i.onboarding,i.busy)),Ya(2),ms("matTooltip",Vl(3,5,"wallet.new.generate-12-help")),Ya(2),ou("\n ",Vl(5,7,"wallet.new.12-words"),"\n "),Ya(6),ms("matTooltip",Vl(11,9,"wallet.new.generate-24-help")),Ya(2),ou("\n ",Vl(13,11,"wallet.new.24-words"),"\n ")}}var UO=function(e){return{"white-mat-spinner":e}};function zO(e,t){if(1&e&&(vs(0,"div",25),ys(1,"mat-spinner"),_s()),2&e){var n=Ys(2);ms("ngClass",Il(1,UO,n.onboarding))}}function qO(e,t){if(1&e&&(vs(0,"span",26),ru(1),_s()),2&e){var n=Ys(2);Ya(1),au(n.lastAssistedSeed)}}var GO=function(e){return{"transparent-text":e}};function KO(e,t){if(1&e&&(vs(0,"div",27),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys(2);ms("ngClass",Il(4,GO,n.onboarding)),Ya(1),au(Vl(2,2,"wallet.new.seed.change-seed"))}}function JO(e,t){if(1&e&&(vs(0,"div",28),ru(1,"\n "),vs(2,"mat-icon",29),ru(3,"touch_app"),_s(),vs(4,"span",27),ru(5),Wl(6,"translate"),_s(),ru(7,"\n "),_s()),2&e){var n=Ys(2);Ya(4),ms("ngClass",Il(4,GO,n.onboarding)),Ya(1),au(Vl(6,2,"wallet.new.seed.enter-seed"))}}var ZO=function(e,t,n){return{"onboarding-version":e,"show-pointer":t,"element-disabled":n}},$O=function(e){return{"element-disabled":e}},XO=function(e){return{"-white-text":e}};function QO(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),vs(2,"div",17),xs("click",function(){return on(n),Ys().enterSeed()}),ru(3,"\n "),hs(4,zO,2,3,"div",18),ru(5,"\n "),hs(6,qO,2,1,"span",19),ru(7,"\n "),hs(8,KO,3,6,"div",20),ru(9,"\n "),hs(10,JO,8,6,"div",21),ru(11,"\n "),_s(),ru(12,"\n "),vs(13,"div",22),ru(14,"\n "),vs(15,"span",23),xs("click",function(){return on(n),Ys().changeSeedType()}),ru(16,"\n "),vs(17,"mat-icon",24),ru(18,"edit"),_s(),ru(19),Wl(20,"translate"),_s(),ru(21,"\n "),_s(),ru(22,"\n "),ws()}if(2&e){var i=Ys();Ya(2),ms("ngClass",Fl(11,ZO,i.onboarding,!i.create,i.busy)),Ya(2),ms("ngIf",i.checkingAssistedSeed),Ya(2),ms("ngIf",i.create||i.lastAssistedSeed),Ya(2),ms("ngIf",!i.create&&i.lastAssistedSeed),Ya(2),ms("ngIf",!i.create&&!i.lastAssistedSeed),Ya(3),ms("ngClass",Il(15,$O,i.busy)),Ya(2),ms("ngClass",Il(17,XO,i.onboarding)),Ya(2),ms("inline",!0),Ya(2),ou("\n ",Vl(20,9,"wallet.new.seed.use-custom"),"\n ")}}function eE(e,t){1&e&&(vs(0,"div",32),ys(1,"mat-spinner"),_s())}function tE(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),hs(2,eE,2,0,"div",30),ru(3,"\n "),vs(4,"textarea",31),xs("blur",function(){return on(n),Ys().validateForm()}),_s(),ru(5,"\n "),vs(6,"div",22),ru(7,"\n "),vs(8,"span",23),xs("click",function(){return on(n),Ys().changeSeedType()}),ru(9,"\n "),vs(10,"mat-icon",24),ru(11,"format_list_numbered"),_s(),ru(12),Wl(13,"translate"),_s(),ru(14,"\n "),_s(),ru(15,"\n "),ws()}if(2&e){var i=Ys();Ya(2),ms("ngIf",i.checkingCustomSeed),Ya(2),ms("appFormFieldError",i.seed1ErrorMsg),ls("disabled",i.busy?"true":null),Ya(2),ms("ngClass",Il(9,$O,i.busy)),Ya(2),ms("ngClass",Il(11,XO,i.onboarding)),Ya(2),ms("inline",!0),Ya(2),ou("\n ",Vl(13,7,"wallet.new.seed.use-normal"),"\n ")}}var nE=function(e,t){return{"red-text":e,"white-text transparent-text":t}};function iE(e,t){if(1&e&&(vs(0,"p",33),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys();ms("ngClass",Rl(4,nE,!n.onboarding,n.onboarding)),Ya(1),ou("\n ",Vl(2,2,"wallet.new.seed-warning"),"\n ")}}function rE(e,t){if(1&e&&(vs(0,"div",28),ru(1,"\n "),vs(2,"mat-icon",29),ru(3,"touch_app"),_s(),vs(4,"span",27),ru(5),Wl(6,"translate"),_s(),ru(7,"\n "),_s()),2&e){var n=Ys(3);Ya(4),ms("ngClass",Il(4,GO,n.onboarding)),Ya(1),au(Vl(6,2,"wallet.new.seed.confirm-seed"))}}function aE(e,t){if(1&e&&(vs(0,"div",28),ru(1,"\n "),vs(2,"mat-icon",35),ru(3,"done"),_s(),ru(4," "),vs(5,"span",27),ru(6),Wl(7,"translate"),_s(),ru(8,"\n "),_s()),2&e){var n=Ys(3);Ya(5),ms("ngClass",Il(4,GO,n.onboarding)),Ya(1),au(Vl(7,2,"wallet.new.seed.confirmed-seed"))}}function oE(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),vs(2,"div",17),xs("click",function(){return on(n),Ys(2).confirmSeed()}),ru(3,"\n "),hs(4,rE,8,6,"div",21),ru(5,"\n "),hs(6,aE,9,6,"div",21),ru(7,"\n "),_s(),ru(8,"\n "),ws()}if(2&e){var i=Ys(2);Ya(2),ms("ngClass",Fl(3,ZO,i.onboarding,!i.assistedSeedConfirmed,i.busy)),Ya(2),ms("ngIf",!i.assistedSeedConfirmed),Ya(2),ms("ngIf",i.assistedSeedConfirmed)}}function sE(e,t){1&e&&(vs(0,"div",32),ys(1,"mat-spinner"),_s())}function uE(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),hs(2,sE,2,0,"div",30),ru(3,"\n "),vs(4,"textarea",36),xs("blur",function(){return on(n),Ys(2).validateForm()}),_s(),ru(5,"\n "),ws()}if(2&e){var i=Ys(2);Ya(2),ms("ngIf",i.checkingCustomSeed),Ya(2),ms("appFormFieldError",i.seed2ErrorMsg),ls("disabled",i.busy?"true":null)}}function lE(e,t){if(1&e&&(vs(0,"div",1),ru(1,"\n "),vs(2,"label",34),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),ru(6,"\n "),hs(7,oE,9,7,"ng-container",7),ru(8,"\n\n "),ru(9,"\n "),hs(10,uE,6,3,"ng-container",7),ru(11,"\n "),_s()),2&e){var n=Ys();Ya(3),au(Vl(4,3,"wallet.new.confirm-seed-label")),Ya(4),ms("ngIf",n.enterSeedWithAssistance),Ya(3),ms("ngIf",!n.enterSeedWithAssistance)}}function cE(e,t){if(1&e){var n=Ms();vs(0,"div",44),ru(1,"\n "),vs(2,"div",1),ru(3,"\n "),vs(4,"label",45),ru(5),Wl(6,"translate"),_s(),ru(7,"\n "),vs(8,"input",46),xs("blur",function(){return on(n),Ys(2).validateForm()}),_s(),ru(9,"\n "),_s(),ru(10,"\n "),_s()}if(2&e){var i=Ys(2);Ya(5),au(Vl(6,3,"password.password-label")),Ya(3),ms("appFormFieldError",i.password1ErrorMsg),ls("disabled",i.busy?"true":null)}}function dE(e,t){if(1&e){var n=Ms();vs(0,"div",44),ru(1,"\n "),vs(2,"div",1),ru(3,"\n "),vs(4,"label",47),ru(5),Wl(6,"translate"),_s(),ru(7,"\n "),vs(8,"input",48),xs("keydown.enter",function(){return on(n),Ys(2).requestCreation()})("blur",function(){return on(n),Ys(2).validateForm()}),_s(),ru(9,"\n "),_s(),ru(10,"\n "),_s()}if(2&e){var i=Ys(2);Ya(5),au(Vl(6,3,"password.confirm-password-label")),Ya(3),ms("appFormFieldError",i.password2ErrorMsg),ls("disabled",i.busy?"true":null)}}function hE(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),vs(2,"div"),ru(3,"\n "),ru(4,"\n "),vs(5,"mat-checkbox",37),xs("change",function(e){return on(n),Ys().setEncrypt(e)}),ru(6,"\n "),vs(7,"span",38),ys(8,"img",39),ru(9),Wl(10,"translate"),_s(),ru(11,"\n "),_s(),ru(12,"\n "),_s(),ru(13,"\n "),vs(14,"div",40),ru(15,"\n "),vs(16,"div",41),ru(17,"\n "),vs(18,"p",42),ru(19),Wl(20,"translate"),_s(),ru(21,"\n "),_s(),ru(22,"\n "),ru(23,"\n "),hs(24,cE,11,5,"div",43),ru(25,"\n "),hs(26,dE,11,5,"div",43),ru(27,"\n "),_s(),ru(28,"\n "),_s()}if(2&e){var i=Ys();Ya(5),ms("checked",!0)("ngClass",Il(10,$O,i.busy)),Ya(4),ou(" ",Vl(10,6,"wallet.new.encrypt-check"),""),Ya(10),au(Vl(20,8,"wallet.new.encrypt-warning")),Ya(5),ms("ngIf",i.encrypt),Ya(2),ms("ngIf",i.encrypt)}}var fE=function(e,t){return{"element-disabled":e,"-white-check":t}},pE=function(e,t){return{"-info":e,"white-text transparent-text":t}};function mE(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),vs(2,"mat-checkbox",50,51),xs("change",function(e){return on(n),Ys(2).setTemporal(e)}),ru(4,"\n "),vs(5,"span",38),ys(6,"img",52),ru(7),Wl(8,"translate"),_s(),ru(9,"\n "),_s(),ru(10,"\n "),vs(11,"div",40),ru(12,"\n "),vs(13,"div",41),ru(14,"\n "),vs(15,"p",27),ru(16),Wl(17,"translate"),_s(),ru(18,"\n "),_s(),ru(19,"\n "),_s(),ru(20,"\n "),_s()}if(2&e){var i=Ys(2);Ya(2),ms("checked",i.loadTemporarily)("ngClass",Rl(9,fE,i.busy,i.onboarding)),Ya(5),ou(" ",Vl(8,5,"wallet.new.temporal-check"),""),Ya(8),ms("ngClass",Rl(12,pE,!i.onboarding,i.onboarding)),Ya(1),au(Vl(17,7,"wallet.new.temporal-info"))}}function gE(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),vs(2,"div",1),ru(3,"\n "),vs(4,"app-arrow-link",49),xs("pressed",function(){return on(n),Ys().toggleAdvancedOptions()}),ru(5,"\n "),_s(),ru(6,"\n "),_s(),ru(7,"\n\n "),hs(8,mE,21,15,"div",7),ru(9,"\n "),_s()}if(2&e){var i=Ys();Ya(4),ms("pointDown",!i.showAdvancedOptions)("noPadding",!0)("whiteText",i.onboarding)("ngClass",Il(5,$O,i.busy)),Ya(4),ms("ngIf",i.showAdvancedOptions)}}function vE(e,t){if(1&e){var n=Ms();vs(0,"div",53),ru(1,"\n "),vs(2,"mat-icon"),ru(3,"error"),_s(),ru(4,"\n "),vs(5,"div"),ru(6,"\n "),vs(7,"div",54),ru(8),Wl(9,"translate"),_s(),ru(10,"\n "),vs(11,"div"),ru(12),Wl(13,"translate"),_s(),ru(14,"\n "),vs(15,"mat-checkbox",50,55),xs("change",function(e){return on(n),Ys().onCustomSeedAcceptance(e)}),ru(17),Wl(18,"translate"),_s(),ru(19,"\n "),_s(),ru(20,"\n"),_s()}if(2&e){var i=Ys();Ya(8),au(Vl(9,5,"wallet.new.unconventional-seed-title")),Ya(4),au(Vl(13,7,"wallet.new.unconventional-seed-text")),Ya(3),ms("checked",i.customSeedAccepted)("ngClass",Il(11,$O,i.busy)),Ya(2),ou("\n ",Vl(18,9,"wallet.new.unconventional-seed-check"),"\n ")}}var _E=function(){function e(e,t,n){this.apiService=e,this.dialog=t,this.msgBarService=n,this.busy=!1,this.createRequested=new Zl,this.enterSeedWithAssistance=!0,this.assistedSeedConfirmed=!1,this.customSeedIsNormal=!0,this.customSeedAccepted=!1,this.encrypt=!0,this.showAdvancedOptions=!1,this.loadTemporarily=!1,this.lastAssistedSeed="",this.numberOfAutogeneratedWords=0,this.checkingCustomSeed=!1,this.checkingAssistedSeed=!1,this.labelErrorMsg="",this.seed1ErrorMsg="",this.seed2ErrorMsg="",this.password1ErrorMsg="",this.password2ErrorMsg="",this.seed=new z}return e.prototype.ngOnInit=function(){this.onboarding?this.initForm(!1,null):this.initForm()},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.statusSubscription.unsubscribe(),this.seedValiditySubscription.unsubscribe(),this.createRequested.complete()},Object.defineProperty(e.prototype,"isValid",{get:function(){return this.form.valid&&!this.checkingCustomSeed&&(!this.enterSeedWithAssistance&&(this.customSeedIsNormal||this.customSeedAccepted)||this.create&&this.enterSeedWithAssistance&&this.assistedSeedConfirmed||!this.create&&this.enterSeedWithAssistance&&this.lastAssistedSeed.length>2)},enumerable:!1,configurable:!0}),e.prototype.onCustomSeedAcceptance=function(e){this.customSeedAccepted=e.checked},e.prototype.setEncrypt=function(e){this.encrypt=e.checked,this.form.updateValueAndValidity()},e.prototype.toggleAdvancedOptions=function(){!0===this.showAdvancedOptions&&this.loadTemporarily?this.msgBarService.showError("wallet.new.close-advanced-error"):this.showAdvancedOptions=!this.showAdvancedOptions},e.prototype.setTemporal=function(e){var t=this;e.checked?(this.temporalWalletCheck.checked=!1,vO.openDialog(this.dialog,{text:"wallet.new.temporal-warning",headerText:"common.warning-title",defaultButtons:gO.ContinueCancel,redTitle:!0}).afterClosed().subscribe(function(e){e&&(t.loadTemporarily=!0,t.form.updateValueAndValidity())})):(this.loadTemporarily=!1,this.form.updateValueAndValidity())},e.prototype.getData=function(){return{creatingNewWallet:this.create,label:this.form.value.label,seed:this.enterSeedWithAssistance?this.lastAssistedSeed:this.form.value.seed,password:!this.onboarding&&this.encrypt?this.form.value.password:null,enterSeedWithAssistance:this.enterSeedWithAssistance,lastAssistedSeed:this.lastAssistedSeed,lastCustomSeed:this.form.value.seed,numberOfWords:this.create?this.numberOfAutogeneratedWords:this.form.value.number_of_words,customSeedIsNormal:this.customSeedIsNormal,advancedOptionsShown:this.showAdvancedOptions,loadTemporarily:this.loadTemporarily}},e.prototype.changeSeedType=function(){var e=this;this.msgBarService.hide(),this.enterSeedWithAssistance?vO.openDialog(this.dialog,{text:this.create?"wallet.new.seed.custom-seed-warning-text":"wallet.new.seed.custom-seed-warning-text-recovering",headerText:"common.warning-title",checkboxText:this.create?"common.generic-confirmation-check":null,defaultButtons:gO.ContinueCancel,redTitle:!0}).afterClosed().subscribe(function(t){t&&(e.enterSeedWithAssistance=!1,e.removeConfirmations())}):(this.enterSeedWithAssistance=!0,this.removeConfirmations())},e.prototype.enterSeed=function(){this.create||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},e.prototype.confirmSeed=function(){this.assistedSeedConfirmed||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},e.prototype.askForWord=function(e){var t=this;return _L.openDialog(this.dialog,{reason:this.create?vL.CreatingSoftwareWallet:vL.RecoveringSoftwareWallet,wordNumber:e+1}).afterClosed().subscribe(function(n){if(n){if(t.create&&n!==t.lastAssistedSeed.split(" ")[e])return void t.msgBarService.showError("wallet.new.seed.incorrect-word-error");if(t.partialSeed[e]=n,e+=1,t.create&&e0&&(!e.create||e.seedsAreEqual())?(e.checkingCustomSeed=!0,bm(0).pipe(EM(500),de(function(){return e.apiService.post("wallet/seed/verify",{seed:t},{useV2:!0})}))):bm(0)})).subscribe(function(t){e.customSeedIsNormal=0!==t,e.checkingCustomSeed=!1},function(t){e.checkingCustomSeed=!1,(t=VM(t))&&t.originalError&&422===t.originalError.status?e.customSeedIsNormal=!1:(e.customSeedIsNormal=!0,e.msgBarService.showWarning("wallet.new.seed-checking-error")),e.subscribeToSeedValidation()})},e.prototype.seedsAreEqual=function(){return this.form&&this.form.get("seed")&&this.form.get("confirm_seed")?this.form.get("seed").value===this.form.get("confirm_seed").value:(this.customSeedIsNormal=!0,!1)},e.prototype.validateForm=function(){this.labelErrorMsg="",this.seed1ErrorMsg="",this.seed2ErrorMsg="",this.password1ErrorMsg="",this.password2ErrorMsg="";var e=!0;if(this.form.get("label").value||(e=!1,this.form.get("label").touched&&(this.labelErrorMsg="wallet.new.name-error-info")),!this.enterSeedWithAssistance){var t=!0;this.form.get("seed").value||(e=!1,t=!1,this.customSeedIsNormal=!0,this.form.get("seed").touched&&(this.seed1ErrorMsg="wallet.new.seed-error-info")),this.create&&(this.form.get("confirm_seed").value||(e=!1,t=!1,this.customSeedIsNormal=!0,this.form.get("confirm_seed").touched&&(this.seed2ErrorMsg="wallet.new.seed-error-info")),t&&(this.seed2ErrorMsg||this.seedsAreEqual()||(e=!1,this.customSeedIsNormal=!0,this.seed2ErrorMsg="wallet.new.confirm-seed-error-info")))}if(this.encrypt&&!this.loadTemporarily&&!this.onboarding){var n=!0;this.form.get("password").value||(e=!1,n=!1,this.form.get("password").touched&&(this.password1ErrorMsg="password.password-error-info")),this.form.get("confirm_password").value||(e=!1,n=!1,this.form.get("confirm_password").touched&&(this.password2ErrorMsg="password.password-error-info")),n&&(this.password2ErrorMsg||this.form.get("password").value===this.form.get("confirm_password").value||(e=!1,this.password2ErrorMsg="password.confirm-error-info"))}return e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ps(HS),ps(Pk),ps(dL))},e.\u0275cmp=ft({type:e,selectors:[["app-create-wallet-form"]],viewQuery:function(e,t){var n;1&e&&lc(NO,5),2&e&&uc(n=dc())&&(t.temporalWalletCheck=n.first)},inputs:{create:"create",onboarding:"onboarding",busy:"busy"},outputs:{createRequested:"createRequested"},decls:48,vars:18,consts:[[1,"main-container",3,"formGroup"],[1,"form-field"],["for","label"],["formControlName","label","id","label",3,"appFormFieldError","blur"],["class","form-field",4,"ngIf"],["for","seed"],["class","generators",3,"ngClass",4,"ngIf"],[4,"ngIf"],["class","disclaimer-box",3,"ngClass",4,"ngIf"],["class","alert-box",4,"ngIf"],["for","number_of_words"],[1,"-select"],["formControlName","number_of_words","id","number_of_words"],[3,"ngValue"],[1,"generators",3,"ngClass"],[1,"link",3,"matTooltip","click"],[1,"divider"],[1,"dashed-border","non-editable-field",3,"ngClass","click"],["class","seed-spinner assisted-seed-spinner",3,"ngClass",4,"ngIf"],["class","normal-seed-field",4,"ngIf"],[3,"ngClass",4,"ngIf"],["class","text-with-icon-container",4,"ngIf"],[1,"seed-type-button",3,"ngClass"],[1,"link",3,"ngClass","click"],[3,"inline"],[1,"seed-spinner","assisted-seed-spinner",3,"ngClass"],[1,"normal-seed-field"],[3,"ngClass"],[1,"text-with-icon-container"],[1,"yellow-text"],["class","seed-spinner",4,"ngIf"],["formControlName","seed","id","seed","rows","2",3,"appFormFieldError","blur"],[1,"seed-spinner"],[1,"disclaimer-box",3,"ngClass"],["for","confirm_seed"],[1,"green-text"],["formControlName","confirm_seed","id","confirm_seed","rows","2",3,"appFormFieldError","blur"],["type","checkbox","id","encrypt",1,"-check",3,"checked","ngClass","change"],[1,"img-label-container"],["src","assets/img/lock-gold.png"],[1,"row","-passwords"],[1,"col-md-12"],[1,"-info"],["class","col-md-6",4,"ngIf"],[1,"col-md-6"],["for","password"],["formControlName","password","id","password","type","password","appDontSavePassword","",3,"appFormFieldError","blur"],["for","confirm_password"],["formControlName","confirm_password","id","confirm_password","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],["text","wallet.new.advanced-options-link",3,"pointDown","noPadding","whiteText","ngClass","pressed"],["type","checkbox",1,"-check",3,"checked","ngClass","change"],["temporalWalletCheck",""],["src","assets/img/temporal-gold.png"],[1,"alert-box"],[1,"title"],["seedCheck",""]],template:function(e,t){1&e&&(vs(0,"div",0),ru(1,"\n "),ru(2,"\n "),vs(3,"div",1),ru(4,"\n "),vs(5,"label",2),ru(6),Wl(7,"translate"),_s(),ru(8,"\n "),vs(9,"input",3),xs("blur",function(){return t.validateForm()}),_s(),ru(10,"\n "),_s(),ru(11,"\n "),ru(12,"\n "),hs(13,BO,20,12,"div",4),ru(14,"\n "),vs(15,"div",1),ru(16,"\n "),ru(17,"\n "),vs(18,"label",5),ru(19,"\n "),vs(20,"span"),ru(21),Wl(22,"translate"),_s(),ru(23,"\n "),hs(24,VO,15,16,"span",6),ru(25,"\n "),_s(),ru(26,"\n\n "),ru(27,"\n "),hs(28,QO,23,19,"ng-container",7),ru(29,"\n\n "),ru(30,"\n "),hs(31,tE,16,13,"ng-container",7),ru(32,"\n\n "),hs(33,iE,3,7,"p",8),ru(34,"\n "),_s(),ru(35,"\n "),hs(36,lE,12,5,"div",4),ru(37,"\n "),ru(38,"\n "),hs(39,hE,29,12,"div",7),ru(40,"\n\n "),ru(41,"\n "),hs(42,gE,10,7,"div",7),ru(43,"\n"),_s(),ru(44,"\n\n"),ru(45,"\n"),hs(46,vE,21,13,"div",9),ru(47,"\n")),2&e&&(ms("formGroup",t.form),Ya(6),au(Vl(7,14,"wallet.new.name-label")),Ya(3),ms("appFormFieldError",t.labelErrorMsg),ls("disabled",t.busy?"true":null),Ya(4),ms("ngIf",!t.create&&t.enterSeedWithAssistance),Ya(8),au(Vl(22,16,"wallet.new.seed-label")),Ya(3),ms("ngIf",t.create),Ya(4),ms("ngIf",t.enterSeedWithAssistance),Ya(3),ms("ngIf",!t.enterSeedWithAssistance),Ya(2),ms("ngIf",t.create),Ya(3),ms("ngIf",t.create),Ya(3),ms("ngIf",!t.onboarding&&!t.loadTemporarily),Ya(3),ms("ngIf",!t.create),Ya(4),ms("ngIf",t.form.valid&&!t.customSeedIsNormal&&!t.checkingCustomSeed&&!t.enterSeedWithAssistance))},directives:[ap,jp,Lf,rp,qp,RO,lh,Jp,Zp,em,ah,YO,WC,MM,lO,FO,jO],pipes:[hM],styles:[".main-container[_ngcontent-%COMP%]{font-size:12px}.dashed-border[_ngcontent-%COMP%]{border:2px dashed rgba(30,34,39,.05)}.show-pointer[_ngcontent-%COMP%]{cursor:pointer}.non-editable-field[_ngcontent-%COMP%]{text-align:center;padding:15px;border-radius:6px;color:#1e2227}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%]{display:inline-flex;align-items:center}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:5px;opacity:1}.normal-seed-field[_ngcontent-%COMP%]{font-size:14px}.seed-type-button[_ngcontent-%COMP%], .seed-type-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{position:relative;top:2px}.onboarding-version[_ngcontent-%COMP%]{border:2px dashed hsla(0,0%,100%,.25);color:#fafafa}.transparent-text[_ngcontent-%COMP%]{opacity:.75}.disclaimer-box[_ngcontent-%COMP%]{padding:0 10px;line-height:1.5}label[for=seed][_ngcontent-%COMP%]{display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px;color:#1e2227}.-white-text[_ngcontent-%COMP%], .-white-text[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fafafa!important}.-passwords[_ngcontent-%COMP%]{margin-left:24px}.-passwords[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin:5px 0 15px;color:rgba(30,34,39,.5);line-height:1.5}.seed-spinner[_ngcontent-%COMP%]{height:0;position:relative;top:2px;left:2px}.seed-spinner[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{position:absolute;height:10px!important;width:10px!important}.seed-spinner[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:10px!important;width:10px!important}.white-mat-spinner[_ngcontent-%COMP%] svg circle{stroke:#fafafa}.assisted-seed-spinner[_ngcontent-%COMP%]{top:-14px!important;left:-14px!important}.-white-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{stroke:#fafafa!important}"]}),e}(),yE=["formControl"],bE=["createButton"],wE=["cancelButton"],kE=function(){function e(e,t,n,i,r,a,o){var s=this;this.data=e,this.dialogRef=t,this.dialog=n,this.msgBarService=i,this.walletsAndAddressesService=r,this.changeDetector=a,this.disableDismiss=!1,this.busy=!1,this.synchronized=!0,this.blockchainSubscription=o.progress.subscribe(function(e){return s.synchronized=e.synchronized})}return e.openDialog=function(t,n){var i=new wk;return i.data=n,i.autoFocus=!0,i.width=jM.mediumModalWidth,t.open(e,i)},e.prototype.ngOnDestroy=function(){this.blockchainSubscription.unsubscribe(),this.msgBarService.hide()},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.checkAndCreateWallet=function(){var e=this;this.formControl.isValid&&!this.busy&&(this.msgBarService.hide(),this.synchronized||this.data.create?this.continueCreating():vO.openDialog(this.dialog,{headerText:"common.warning-title",text:"wallet.new.synchronizing-warning-text",defaultButtons:gO.ContinueCancel,redTitle:!0}).afterClosed().subscribe(function(t){t&&e.continueCreating()}),this.changeDetector.detectChanges())},e.prototype.continueCreating=function(){var e=this;this.busy=!0;var t=this.formControl.getData();this.createButton.resetState(),this.createButton.setLoading(),this.cancelButton.setDisabled(),this.disableDismiss=!0,this.walletsAndAddressesService.createSoftwareWallet(t.loadTemporarily,t.label,t.seed,t.password).subscribe(function(){e.busy=!1,setTimeout(function(){return e.msgBarService.showDone("wallet.new.wallet-created")}),e.dialogRef.close()},function(t){e.busy=!1,e.msgBarService.showError(t),e.createButton.resetState(),e.cancelButton.setEnabled(),e.disableDismiss=!1})},e.\u0275fac=function(t){return new(t||e)(ps(Tk),ps(Lk),ps(Pk),ps(dL),ps(AL),ps(ll),ps(yO))},e.\u0275cmp=ft({type:e,selectors:[["app-create-wallet"]],viewQuery:function(e,t){if(1&e&&(lc(yE,5),lc(bE,5),lc(wE,5)),2&e){var n=void 0;uc(n=dc())&&(t.formControl=n.first),uc(n=dc())&&(t.createButton=n.first),uc(n=dc())&&(t.cancelButton=n.first)}},decls:22,vars:15,consts:[[3,"headline","dialog","disableDismiss"],[3,"create","onboarding","busy","createRequested"],["formControl",""],[1,"-buttons"],[3,"action"],["cancelButton",""],[1,"primary-button",3,"disabled","action"],["createButton",""]],template:function(e,t){if(1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),vs(4,"app-create-wallet-form",1,2),xs("createRequested",function(){return t.checkAndCreateWallet()}),_s(),ru(6,"\n "),ru(7,"\n "),vs(8,"div",3),ru(9,"\n "),vs(10,"app-button",4,5),xs("action",function(){return t.closePopup()}),ru(12),Wl(13,"translate"),_s(),ru(14,"\n "),vs(15,"app-button",6,7),xs("action",function(){return t.checkAndCreateWallet()}),ru(17),Wl(18,"translate"),_s(),ru(19,"\n "),_s(),ru(20,"\n"),_s(),ru(21,"\n")),2&e){var n=fs(5);ms("headline",Vl(1,9,"wallet.new."+(t.data.create?"create":"load")+"-title"))("dialog",t.dialogRef)("disableDismiss",t.disableDismiss),Ya(4),ms("create",t.data.create)("onboarding",!1)("busy",t.busy),Ya(8),ou("\n ",Vl(13,11,"common.cancel-button"),"\n "),Ya(3),ms("disabled",!n.isValid),Ya(2),ou("\n ",Vl(18,13,"common."+(t.data.create?"create":"load")+"-button"),"\n ")}},directives:[jk,_E,ZC],pipes:[hM],styles:[""]}),e}();function ME(e,t){if(1&e){var n=Ms();vs(0,"div",7),ru(1,"\n "),vs(2,"mat-checkbox",8),xs("change",function(e){return on(n),Ys(2).setDeleteFromList(e)}),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}if(2&e){var i=Ys(2);Ya(2),ms("checked",i.deleteFromList),Ya(1),ou("",Vl(4,2,"hardware-wallet.wipe.confirm-delete-check"),"\n ")}}function SE(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),ys(2,"app-hw-message",2),Wl(3,"translate"),ru(4,"\n\n "),hs(5,ME,6,4,"div",3),ru(6,"\n\n "),vs(7,"div",4),ru(8,"\n "),vs(9,"app-button",5),xs("action",function(){return on(n),Ys().closeModal()}),ru(10),Wl(11,"translate"),_s(),ru(12,"\n "),vs(13,"app-button",6),xs("action",function(){return on(n),Ys().requestWipe()}),ru(14),Wl(15,"translate"),_s(),ru(16,"\n "),_s(),ru(17,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("text",Vl(3,5,"hardware-wallet.wipe.warning"))("icon",i.msgIcons.Warning),Ya(3),ms("ngIf",i.showDeleteFromList),Ya(5),ou("\n ",Vl(11,7,"common.cancel-button"),"\n "),Ya(4),ou("\n ",Vl(15,9,"common.continue-button"),"\n ")}}function CE(e,t){if(1&e&&(ys(0,"app-hw-message",2),Wl(1,"translate")),2&e){var n=Ys(2);ms("text",Vl(1,2,"hardware-wallet.general.confirm"))("icon",n.msgIcons.Confirm)}}function LE(e,t){if(1&e&&(ys(0,"app-hw-message",2),Wl(1,"translate")),2&e){var n=Ys(2);ms("text",Vl(1,2,n.result.text))("icon",n.result.icon)}}function xE(e,t){if(1&e){var n=Ms();vs(0,"div",4),ru(1,"\n "),vs(2,"app-button",6,11),xs("action",function(){return on(n),Ys(2).closeModal()}),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()}2&e&&(Ya(4),ou("\n ",Vl(5,1,"common.close-button"),"\n "))}function TE(e,t){if(1&e&&(vs(0,"div"),ru(1,"\n "),ru(2,"\n "),hs(3,CE,2,4,"app-hw-message",9),ru(4,"\n\n "),ru(5,"\n "),hs(6,LE,2,4,"app-hw-message",9),ru(7,"\n\n "),ru(8,"\n "),hs(9,xE,7,3,"div",10),ru(10,"\n "),_s()),2&e){var n=Ys();Ya(3),ms("ngIf",n.currentState===n.states.Processing),Ya(3),ms("ngIf",n.currentState===n.states.ShowingResult),Ya(3),ms("ngIf",n.currentState!==n.states.Processing)}}var DE=function(e){function t(t,n,i,r){var a=e.call(this,i,n)||this;return a.data=t,a.dialogRef=n,a.hwWalletService=i,a.walletsAndAddressesService=r,a.showDeleteFromList=!0,a.deleteFromList=!0,t.wallet||(a.showDeleteFromList=!1,a.deleteFromList=!1),a}return vf(t,e),t.prototype.setDeleteFromList=function(e){this.deleteFromList=e.checked},t.prototype.requestWipe=function(){var e=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.wipe().subscribe(function(){e.showResult({text:"hardware-wallet.general.completed",icon:e.msgIcons.Success}),e.data.requestOptionsComponentRefresh(),e.deleteFromList&&e.walletsAndAddressesService.deleteHardwareWallet(e.data.wallet.id)},function(t){return e.processHwOperationError(t)})},t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(gC),ps(AL))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-wipe-dialog"]],features:[Ko],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon"],["class","-check-container",4,"ngIf"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],[1,"-check-container"],["type","checkbox",1,"-check",3,"checked","change"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],["closeButton",""]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,SE,18,11,"div",1),ru(5,"\n\n "),hs(6,TE,11,3,"div",1),ru(7,"\n"),_s(),ru(8,"\n")),2&e&&(ms("headline",Vl(1,5,"hardware-wallet.options.wipe"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Processing),Ya(4),ms("ngIf",t.currentState===t.states.Initial),Ya(2),ms("ngIf",t.currentState!==t.states.Initial))},directives:[jk,lh,oC,ZC,lO],pipes:[hM],styles:[""]}),t}(yC),OE=function(){function e(e,t){this.walletsAndAddressesService=e,this.apiService=t}return e.prototype.renameWallet=function(e,t){var n=this;return this.apiService.post("wallet/update",{id:e.id,label:t}).pipe(K(function(){e.label=t,n.walletsAndAddressesService.informValuesUpdated(e)}))},e.prototype.toggleEncryption=function(e,t){var n=this;return this.apiService.post("wallet/"+(e.encrypted?"decrypt":"encrypt"),{id:e.id,password:t}).pipe(K(function(t){e.encrypted=t.meta.encrypted,n.walletsAndAddressesService.informValuesUpdated(e)}))},e.prototype.resetPassword=function(e,t,n){var i=this,r=new Object;return r.id=e.id,r.seed=t,n&&(r.password=n),this.apiService.post("wallet/recover",r,{useV2:!0}).pipe(K(function(t){e.encrypted=t.data.meta.encrypted,i.walletsAndAddressesService.informValuesUpdated(e)}))},e.prototype.getWalletSeed=function(e,t){return this.apiService.post("wallet/seed",{id:e.id,password:t}).pipe(K(function(e){return e.seed}))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(AL),Bi(HS))}}),e}(),EE=function(e){return e.NeedsBackup="NeedsBackup",e.NeedsPin="NeedsPin",e.FirmwareVersionNotVerified="FirmwareVersionNotVerified",e.OutdatedFirmware="OutdatedFirmware",e}({}),YE=function(){function e(e,t,n){this.walletsAndAddressesService=e,this.hwWalletService=t,this.http=n}return e.prototype.getFeaturesAndUpdateData=function(e){var t,n=this;return!e||e.isHardware?this.http.get(jM.urlForHwWalletVersionChecking,{responseType:"text"}).pipe(qM(function(){return bm(null)}),ue(function(e){return t=e||null,n.hwWalletService.getFeatures()}),K(function(i){var r=!1,a=!1;if(t){var o=(t=t.trim()).split(".");if(3===o.length){r=!0;var s=o.map(function(e){return Number.parseInt(e.replace(/\D/g,""),10)}),u=i.rawResponse.fw_major,l=i.rawResponse.fw_minor;(u>s[0]||u===s[0]&&(l>s[1]||l===s[1]&&i.rawResponse.fw_patch>=s[2]))&&(a=!0)}}var c=[],d=!1;i.rawResponse.needs_backup&&(c.push(EE.NeedsBackup),d=!0),i.rawResponse.pin_protection||(c.push(EE.NeedsPin),d=!0),r?a||(c.push(EE.OutdatedFirmware),d=!0):c.push(EE.FirmwareVersionNotVerified);var h=!1;if(e){var f=!1,p=i.rawResponse.label?i.rawResponse.label:i.rawResponse.deviceId?i.rawResponse.deviceId:i.rawResponse.device_id;e.label!==p&&(e.label=p,h=!0,f=!0),e.hasHwSecurityWarnings!==d&&(e.hasHwSecurityWarnings=d,f=!0),f&&n.walletsAndAddressesService.informValuesUpdated(e)}return{features:i.rawResponse,securityWarnings:c,walletNameUpdated:h}})):null},e.prototype.confirmAddress=function(e,t){var n=this;return this.hwWalletService.checkIfCorrectHwConnected(e.id).pipe(ue(function(){return n.hwWalletService.confirmAddress(t)}),K(function(){e.addresses[t].confirmed=!0,n.walletsAndAddressesService.informValuesUpdated(e)}))},e.prototype.changeLabel=function(e,t){var n=this;return this.hwWalletService.checkIfCorrectHwConnected(e.id).pipe(ue(function(){return n.hwWalletService.changeLabel(t)}),K(function(){e.label=t,n.walletsAndAddressesService.informValuesUpdated(e)}))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(AL),Bi(gC),Bi(MS))}}),e}(),PE=["button"];function AE(e,t){1&e&&(vs(0,"div"),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),ou("\n ",Vl(2,1,"hardware-wallet.added.characters-warning"),"\n "))}var IE=function(e){return{"modal-form-container":e}};function RE(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),hs(2,AE,3,3,"div",1),ru(3,"\n "),vs(4,"div",3),ru(5,"\n "),ru(6,"\n "),vs(7,"div",4),ru(8,"\n "),vs(9,"label",5),ru(10),Wl(11,"translate"),_s(),ru(12,"\n "),vs(13,"input",6),xs("keydown.enter",function(){return on(n),Ys().rename()})("blur",function(){return on(n),Ys().validateForm()}),_s(),ru(14,"\n "),_s(),ru(15,"\n "),_s(),ru(16,"\n "),ru(17,"\n "),vs(18,"div",7),ru(19,"\n "),vs(20,"app-button",8),xs("action",function(){return on(n),Ys().closePopup()}),ru(21),Wl(22,"translate"),_s(),ru(23,"\n "),vs(24,"app-button",9,10),xs("action",function(){return on(n),Ys().rename()}),ru(26),Wl(27,"translate"),_s(),ru(28,"\n "),_s(),ru(29,"\n "),ws()}if(2&e){var i=fs(25),r=Ys();Ya(2),ms("ngIf",r.data.wallet.isHardware),Ya(2),ms("ngClass",Il(17,IE,r.data.wallet.isHardware))("formGroup",r.form),Ya(6),au(Vl(11,11,"wallet.rename.name-label")),Ya(3),ms("maxlength",r.data.wallet.isHardware?r.maxHwWalletLabelLength:null)("appFormFieldError",r.inputErrorMsg),ls("disabled",r.working?"true":null),Ya(7),ms("disabled",i&&i.isLoading()),Ya(1),ou("\n ",Vl(22,13,"common.cancel-button"),"\n "),Ya(3),ms("disabled",!r.form.valid),Ya(2),ou("\n ",Vl(27,15,"wallet.rename.rename-button"),"\n ")}}function FE(e,t){if(1&e&&(ys(0,"app-hw-message",11),Wl(1,"translate")),2&e){var n=Ys();ms("text",Vl(1,2,"hardware-wallet.general.confirm"))("icon",n.msgIcons.Confirm)}}var HE=function(e){return e.Initial="Initial",e.WaitingForConfirmation="WaitingForConfirmation",e}({}),jE=function(){return function(){}}(),NE=function(){return function(){}}(),BE=function(){function e(e,t,n,i,r,a,o,s){this.dialogRef=e,this.data=t,this.formBuilder=n,this.hwWalletService=i,this.msgBarService=r,this.softwareWalletService=a,this.hardwareWalletService=o,this.changeDetector=s,this.currentState=HE.Initial,this.states=HE,this.msgIcons=aC,this.maxHwWalletLabelLength=gC.maxLabelLength,this.working=!1,this.inputErrorMsg=""}return e.openDialog=function(t,n,i){var r=new wk;return r.data=n,r.autoFocus=!0,r.width=i?"400px":jM.mediumModalWidth,t.open(e,r)},e.prototype.ngOnInit=function(){var e=this;this.data.newName?this.finishRenaming(this.data.newName):(this.form=this.formBuilder.group({label:[this.data.wallet.label]}),this.form.setValidators(this.validateForm.bind(this))),this.data.wallet.isHardware&&(this.hwConnectionSubscription=this.hwWalletService.walletConnectedAsyncEvent.subscribe(function(t){t||e.closePopup()}))},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.hwConnectionSubscription&&this.hwConnectionSubscription.unsubscribe(),this.operationSubscription&&this.operationSubscription.unsubscribe()},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.rename=function(){this.form.valid&&!this.button.isLoading()&&(this.msgBarService.hide(),this.button.setLoading(),this.finishRenaming(this.form.value.label),this.changeDetector.detectChanges())},e.prototype.finishRenaming=function(e){var t=this;this.working=!0,this.data.wallet.isHardware?(this.currentState=HE.WaitingForConfirmation,this.operationSubscription=this.hardwareWalletService.changeLabel(this.data.wallet,e).subscribe(function(){t.working=!1,t.dialogRef.close(e),t.data.newName||setTimeout(function(){return t.msgBarService.showDone("common.changes-made")})},function(e){if(t.working=!1,t.data.newName){var n=new NE;n.errorMsg=VM(e).translatableErrorMsg,t.dialogRef.close(n)}else t.msgBarService.showError(e),t.currentState=HE.Initial,t.button&&t.button.resetState()})):this.operationSubscription=this.softwareWalletService.renameWallet(this.data.wallet,e).subscribe(function(){t.working=!1,t.dialogRef.close(e),setTimeout(function(){return t.msgBarService.showDone("common.changes-made")})},function(e){t.working=!1,t.msgBarService.showError(e),t.button&&t.button.resetState()})},e.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0;return this.form.get("label").value&&0!==this.form.get("label").value.trim().length||(e=!1,this.form.get("label").touched&&(this.inputErrorMsg="wallet.rename.label-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ps(Lk),ps(Tk),ps(fm),ps(gC),ps(dL),ps(OE),ps(YE),ps(ll))},e.\u0275cmp=ft({type:e,selectors:[["app-change-name"]],viewQuery:function(e,t){var n;1&e&&lc(PE,5),2&e&&uc(n=dc())&&(t.button=n.first)},decls:10,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon",4,"ngIf"],[3,"ngClass","formGroup"],[1,"form-field"],["for","label"],["formControlName","label","id","label",3,"maxlength","appFormFieldError","keydown.enter","blur"],[1,"-buttons"],[3,"disabled","action"],[1,"primary-button",3,"disabled","action"],["button",""],[3,"text","icon"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,RE,30,19,"ng-container",1),ru(5,"\n\n "),ru(6,"\n "),hs(7,FE,2,4,"app-hw-message",2),ru(8,"\n"),_s(),ru(9,"\n")),2&e&&(ms("headline",Vl(1,5,"wallet.rename.title"))("dialog",t.dialogRef)("disableDismiss",t.button&&t.button.isLoading()||t.currentState===t.states.WaitingForConfirmation),Ya(4),ms("ngIf",t.currentState===t.states.Initial),Ya(3),ms("ngIf",t.currentState===t.states.WaitingForConfirmation))},directives:[jk,lh,ah,ap,jp,Lf,rp,qp,lm,RO,ZC,oC],pipes:[hM],styles:[""]}),e}(),WE=["input"];function VE(e,t){if(1&e&&(ys(0,"app-hw-message",4),Wl(1,"translate")),2&e){var n=Ys();ms("text",Vl(1,2,"hardware-wallet.added.configuring"))("icon",n.msgIcons.Spinner)}}function UE(e,t){if(1&e&&(ys(0,"app-hw-message",4),Wl(1,"translate")),2&e){var n=Ys();ms("text",Vl(1,2,n.result.text))("icon",n.result.icon)}}function zE(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),ys(2,"app-hw-message",5),Wl(3,"translate"),ru(4,"\n "),vs(5,"div",6),ru(6),Wl(7,"translate"),_s(),ru(8,"\n "),vs(9,"div",7),ru(10,"\n "),vs(11,"div",8),ru(12,"\n "),vs(13,"input",9,10),xs("keydown.enter",function(){return on(n),Ys().saveNameAndCloseModal()})("blur",function(){return on(n),Ys().validateForm()}),_s(),ru(15,"\n "),_s(),ru(16,"\n "),_s(),ru(17,"\n "),vs(18,"div",11),ru(19),Wl(20,"translate"),_s(),ru(21,"\n \n "),vs(22,"div"),ru(23),Wl(24,"translate"),_s(),ru(25,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("upperBigText",Vl(3,8,"hardware-wallet.added.done"))("icon",i.msgIcons.Success),Ya(4),au(Vl(7,10,"hardware-wallet.added.added1")),Ya(3),ms("formGroup",i.form),Ya(4),ms("maxlength",i.maxHwWalletLabelLength)("appFormFieldError",i.inputErrorMsg),Ya(6),au(Vl(20,12,"hardware-wallet.added.characters-warning")),Ya(4),au(Vl(24,14,"hardware-wallet.added.added2"))}}function qE(e,t){if(1&e){var n=Ms();vs(0,"div",12),ru(1,"\n "),vs(2,"app-button",13,14),xs("action",function(){on(n);var e=Ys();return e.currentState===e.states.Finished?e.saveNameAndCloseModal():e.closeModal()}),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("disabled",i.currentState===i.states.Finished&&!i.form.valid),Ya(2),ou("\n ",Vl(5,2,i.currentState===i.states.Finished?"common.continue-button":"common.close-button"),"\n ")}}var GE=function(e){function t(t,n,i,r,a,o,s,u){var l=e.call(this,i,n)||this;return l.data=t,l.dialogRef=n,l.formBuilder=r,l.dialog=a,l.msgBarService=o,l.walletsAndAddressesService=s,l.hardwareWalletService=u,l.maxHwWalletLabelLength=gC.maxLabelLength,l.inputErrorMsg="",l.operationSubscription=l.walletsAndAddressesService.createHardwareWallet().subscribe(function(e){l.operationSubscription=l.hardwareWalletService.getFeaturesAndUpdateData(e).subscribe(function(){l.wallet=e,l.initialLabel=e.label,l.form=l.formBuilder.group({label:[e.label]}),l.form.setValidators(l.validateForm.bind(l)),l.currentState=l.states.Finished,l.data.requestOptionsComponentRefresh(),setTimeout(function(){return l.input.nativeElement.focus()})},function(e){return l.processError(e)})},function(e){return l.processError(e)}),l}return vf(t,e),t.prototype.processError=function(e){e=VM(e),this.processHwOperationError(e),this.data.requestOptionsComponentRefresh(e.translatableErrorMsg)},t.prototype.ngOnDestroy=function(){e.prototype.ngOnDestroy.call(this),this.msgBarService.hide()},t.prototype.saveNameAndCloseModal=function(){var e=this;if(this.form.value.label===this.initialLabel)this.closeModal();else{this.msgBarService.hide();var t=new jE;t.wallet=this.wallet,t.newName=this.form.value.label,BE.openDialog(this.dialog,t,!0).afterClosed().subscribe(function(t){t&&!t.errorMsg?e.closeModal():t&&t.errorMsg&&e.msgBarService.showError(t.errorMsg)})}},t.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0;return this.form.get("label").value||(e=!1,this.form.get("label").touched&&(this.inputErrorMsg="hardware-wallet.added.added-error-info")),e?null:{Invalid:!0}},t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(gC),ps(fm),ps(Pk),ps(dL),ps(AL),ps(YE))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-added-dialog"]],viewQuery:function(e,t){var n;1&e&&lc(WE,5),2&e&&uc(n=dc())&&(t.input=n.first)},features:[Ko],decls:15,vars:9,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","icon",4,"ngIf"],[4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","icon"],[3,"upperBigText","icon"],[1,"upper-text"],[3,"formGroup"],[1,"form-field"],["formControlName","label","id","label",3,"maxlength","appFormFieldError","keydown.enter","blur"],["input",""],[1,"warning"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"],["closeButton",""]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,VE,2,4,"app-hw-message",1),ru(5,"\n\n "),ru(6,"\n "),hs(7,UE,2,4,"app-hw-message",1),ru(8,"\n\n "),ru(9,"\n "),hs(10,zE,26,16,"div",2),ru(11,"\n\n "),hs(12,qE,7,4,"div",3),ru(13,"\n"),_s(),ru(14,"\n")),2&e&&(ms("headline",Vl(1,7,"hardware-wallet.added.title"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Initial),Ya(4),ms("ngIf",t.currentState===t.states.Initial),Ya(3),ms("ngIf",t.currentState===t.states.ShowingResult),Ya(3),ms("ngIf",t.currentState===t.states.Finished),Ya(2),ms("ngIf",t.currentState===t.states.Finished||t.currentState===t.states.ShowingResult))},directives:[jk,lh,oC,ap,jp,Lf,rp,qp,lm,RO,ZC],pipes:[hM],styles:[".upper-text[_ngcontent-%COMP%]{margin-top:10px;margin-bottom:10px}.warning[_ngcontent-%COMP%]{margin:-20px 0 20px;color:rgba(30,34,39,.5)}"]}),t}(yC);function KE(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),ys(2,"app-hw-message",4),Wl(3,"translate"),ru(4,"\n\n "),vs(5,"div",5),ru(6,"\n "),vs(7,"div",6),ru(8,"\n "),vs(9,"div",7),ru(10,"\n "),vs(11,"select",8),ru(12,"\n "),vs(13,"option",9),ru(14),Wl(15,"translate"),_s(),ru(16,"\n "),vs(17,"option",9),ru(18),Wl(19,"translate"),_s(),ru(20,"\n "),_s(),ru(21,"\n "),_s(),ru(22,"\n "),_s(),ru(23,"\n "),_s(),ru(24,"\n\n "),vs(25,"div",10),ru(26,"\n "),vs(27,"app-button",11),xs("action",function(){return on(n),Ys().closeModal()}),ru(28),Wl(29,"translate"),_s(),ru(30,"\n "),vs(31,"app-button",12),xs("action",function(){return on(n),Ys().startOperation()}),ru(32),Wl(33,"translate"),_s(),ru(34,"\n "),_s(),ru(35,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("text",Vl(3,8,"hardware-wallet.generate-seed.text")),Ya(3),ms("formGroup",i.form),Ya(8),ms("ngValue",12),Ya(1),au(Vl(15,10,"wallet.new.12-words")),Ya(3),ms("ngValue",24),Ya(1),au(Vl(19,12,"wallet.new.24-words")),Ya(10),ou("\n ",Vl(29,14,"common.cancel-button"),"\n "),Ya(4),ou("\n ",Vl(33,16,"common.continue-button"),"\n ")}}function JE(e,t){if(1&e&&(ys(0,"app-hw-message",13),Wl(1,"translate")),2&e){var n=Ys();ms("text",Vl(1,2,"hardware-wallet.generate-seed.configuring"))("icon",n.msgIcons.Spinner)}}function ZE(e,t){if(1&e&&(ys(0,"app-hw-message",13),Wl(1,"translate")),2&e){var n=Ys();ms("text",Vl(1,2,n.result.text))("icon",n.result.icon)}}function $E(e,t){if(1&e){var n=Ms();vs(0,"div",10),ru(1,"\n "),vs(2,"app-button",12,14),xs("action",function(){return on(n),Ys().closeModal()}),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()}2&e&&(Ya(4),ou("\n ",Vl(5,1,"common.close-button"),"\n "))}var XE=function(e){function t(t,n,i,r){var a=e.call(this,i,n)||this;return a.data=t,a.dialogRef=n,a.hwWalletService=i,a.form=r.group({words:[24,Yf.required]}),a}return vf(t,e),t.prototype.startOperation=function(){var e=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.generateMnemonic(this.form.controls.words.value).subscribe(function(){e.data.requestOptionsComponentRefresh(),e.closeModal()},function(t){return e.processHwOperationError(t)})},t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(gC),ps(fm))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-generate-seed-dialog"]],features:[Ko],decls:16,vars:9,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],[1,"-select"],["formControlName","words","id","words"],[3,"ngValue"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],[3,"text","icon"],["closeButton",""]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,KE,36,18,"div",1),ru(5,"\n\n "),ru(6,"\n "),hs(7,JE,2,4,"app-hw-message",2),ru(8,"\n\n "),ru(9,"\n "),hs(10,ZE,2,4,"app-hw-message",2),ru(11,"\n\n "),ru(12,"\n "),hs(13,$E,7,3,"div",3),ru(14,"\n"),_s(),ru(15,"\n")),2&e&&(ms("headline",Vl(1,7,"hardware-wallet.options.configure-automatically"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Processing),Ya(4),ms("ngIf",t.currentState===t.states.Initial),Ya(3),ms("ngIf",t.currentState===t.states.Processing),Ya(3),ms("ngIf",t.currentState===t.states.ShowingResult),Ya(3),ms("ngIf",t.currentState!==t.states.Initial&&t.currentState!==t.states.Processing))},directives:[jk,lh,oC,ap,jp,Jp,rp,qp,Zp,em,ZC],pipes:[hM],styles:[""]}),t}(yC);function QE(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),ys(2,"app-hw-message",2),Wl(3,"translate"),ru(4,"\n\n "),vs(5,"div",3),ru(6,"\n "),vs(7,"app-button",4),xs("action",function(){return on(n),Ys().closeModal()}),ru(8),Wl(9,"translate"),_s(),ru(10,"\n "),vs(11,"app-button",5),xs("action",function(){return on(n),Ys().requestBackup()}),ru(12),Wl(13,"translate"),_s(),ru(14,"\n "),_s(),ru(15,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("text",Vl(3,4,"hardware-wallet.create-backup.warning"))("icon",i.msgIcons.Warning),Ya(6),ou("\n ",Vl(9,6,"common.cancel-button"),"\n "),Ya(4),ou("\n ",Vl(13,8,"common.continue-button"),"\n ")}}function eY(e,t){if(1&e&&(ys(0,"app-hw-message",2),Wl(1,"translate")),2&e){var n=Ys(2);ms("text",Vl(1,2,"hardware-wallet.create-backup.instructions"))("icon",n.msgIcons.Confirm)}}function tY(e,t){if(1&e&&(ys(0,"app-hw-message",2),Wl(1,"translate")),2&e){var n=Ys(2);ms("text",Vl(1,2,n.result.text))("icon",n.result.icon)}}function nY(e,t){if(1&e){var n=Ms();vs(0,"div",3),ru(1,"\n "),vs(2,"app-button",5,8),xs("action",function(){return on(n),Ys(2).closeModal()}),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()}2&e&&(Ya(4),ou("\n ",Vl(5,1,"common.close-button"),"\n "))}function iY(e,t){if(1&e&&(vs(0,"div"),ru(1,"\n "),ru(2,"\n "),hs(3,eY,2,4,"app-hw-message",6),ru(4,"\n\n "),ru(5,"\n "),hs(6,tY,2,4,"app-hw-message",6),ru(7,"\n\n "),ru(8,"\n "),hs(9,nY,7,3,"div",7),ru(10,"\n "),_s()),2&e){var n=Ys();Ya(3),ms("ngIf",n.currentState===n.states.Processing),Ya(3),ms("ngIf",n.currentState===n.states.ShowingResult),Ya(3),ms("ngIf",n.currentState!==n.states.Processing)}}var rY=function(e){function t(t,n,i){var r=e.call(this,i,n)||this;return r.data=t,r.dialogRef=n,r.hwWalletService=i,r}return vf(t,e),t.prototype.requestBackup=function(){var e=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.backup().subscribe(function(){e.showResult({text:"hardware-wallet.general.completed",icon:e.msgIcons.Success}),e.data.requestOptionsComponentRefresh(null,!0)},function(t){return e.processHwOperationError(t)})},t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(gC))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-backup-dialog"]],features:[Ko],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],["closeButton",""]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,QE,16,10,"div",1),ru(5,"\n\n "),hs(6,iY,11,3,"div",1),ru(7,"\n"),_s(),ru(8,"\n")),2&e&&(ms("headline",Vl(1,5,"hardware-wallet.options.create-backup"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Processing),Ya(4),ms("ngIf",t.currentState===t.states.Initial),Ya(2),ms("ngIf",t.currentState!==t.states.Initial))},directives:[jk,lh,oC,ZC],pipes:[hM],styles:[""]}),t}(yC);function aY(e,t){if(1&e&&(ys(0,"app-hw-message",3),Wl(1,"translate")),2&e){var n=Ys();ms("text",Vl(1,2,"hardware-wallet.general.confirm"))("icon",n.msgIcons.Confirm)}}function oY(e,t){if(1&e&&(ys(0,"app-hw-message",3),Wl(1,"translate")),2&e){var n=Ys();ms("text",Vl(1,2,n.result.text))("icon",n.result.icon)}}function sY(e,t){if(1&e){var n=Ms();vs(0,"div",4),ru(1,"\n "),vs(2,"app-button",5,6),xs("action",function(){return on(n),Ys().closeModal()}),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()}2&e&&(Ya(4),ou("\n ",Vl(5,1,"common.close-button"),"\n "))}var uY=function(e){function t(t,n,i){var r=e.call(this,i,n)||this;return r.data=t,r.dialogRef=n,r.hwWalletService=i,r.changingExistingPin=t.walletHasPin,r.operationSubscription=r.hwWalletService.getFeatures().pipe(ue(function(e){return r.changingExistingPin=e.rawResponse.pin_protection,r.hwWalletService.changePin(e.rawResponse.pin_protection)})).subscribe(function(){r.showResult({text:"hardware-wallet.general.completed",icon:r.msgIcons.Success}),r.data.requestOptionsComponentRefresh(null,!0)},function(e){return r.processHwOperationError(e)}),r}return vf(t,e),t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(gC))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-change-pin-dialog"]],features:[Ko],decls:13,vars:8,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","icon"],[1,"-buttons"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,aY,2,4,"app-hw-message",1),ru(5,"\n\n "),ru(6,"\n "),hs(7,oY,2,4,"app-hw-message",1),ru(8,"\n\n "),ru(9,"\n "),hs(10,sY,7,3,"div",2),ru(11,"\n"),_s(),ru(12,"\n")),2&e&&(ms("headline",Vl(1,6,t.changingExistingPin?"hardware-wallet.options.change-pin":"hardware-wallet.options.create-pin"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Initial),Ya(4),ms("ngIf",t.currentState===t.states.Initial),Ya(3),ms("ngIf",t.currentState===t.states.ShowingResult),Ya(3),ms("ngIf",t.currentState!==t.states.Initial))},directives:[jk,lh,oC,ZC],pipes:[hM],styles:[""]}),t}(yC);function lY(e,t){1&e&&(vs(0,"div",14),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"hardware-wallet.restore-seed.warning")))}function cY(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),ys(2,"app-hw-message",4),Wl(3,"translate"),ru(4,"\n\n "),vs(5,"div",5),ru(6,"\n "),vs(7,"div",6),ru(8,"\n "),vs(9,"div",7),ru(10,"\n "),vs(11,"select",8),ru(12,"\n "),vs(13,"option",9),ru(14),Wl(15,"translate"),_s(),ru(16,"\n "),vs(17,"option",9),ru(18),Wl(19,"translate"),_s(),ru(20,"\n "),_s(),ru(21,"\n "),_s(),ru(22,"\n "),_s(),ru(23,"\n "),_s(),ru(24,"\n\n "),hs(25,lY,3,3,"div",10),ru(26,"\n\n "),vs(27,"div",11),ru(28,"\n "),vs(29,"app-button",12),xs("action",function(){return on(n),Ys().closeModal()}),ru(30),Wl(31,"translate"),_s(),ru(32,"\n "),vs(33,"app-button",13),xs("action",function(){return on(n),Ys().startOperation()}),ru(34),Wl(35,"translate"),_s(),ru(36,"\n "),_s(),ru(37,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("text",Vl(3,9,i.justCheckingSeed?"hardware-wallet.restore-seed.check-text":"hardware-wallet.restore-seed.text")),Ya(3),ms("formGroup",i.form),Ya(8),ms("ngValue",12),Ya(1),au(Vl(15,11,"wallet.new.12-words")),Ya(3),ms("ngValue",24),Ya(1),au(Vl(19,13,"wallet.new.24-words")),Ya(7),ms("ngIf",!i.justCheckingSeed),Ya(5),ou("\n ",Vl(31,15,"common.cancel-button"),"\n "),Ya(4),ou("\n ",Vl(35,17,"common.continue-button"),"\n ")}}function dY(e,t){if(1&e&&(ys(0,"app-hw-message",15),Wl(1,"translate")),2&e){var n=Ys();ms("text",Vl(1,2,n.justCheckingSeed?"hardware-wallet.general.follow":"hardware-wallet.general.confirm-and-more"))("icon",n.msgIcons.Confirm)}}function hY(e,t){if(1&e&&(ys(0,"app-hw-message",15),Wl(1,"translate")),2&e){var n=Ys();ms("text",Vl(1,2,n.result.text))("icon",n.result.icon)}}function fY(e,t){if(1&e){var n=Ms();vs(0,"div",11),ru(1,"\n "),vs(2,"app-button",13,16),xs("action",function(){return on(n),Ys().closeModal()}),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()}2&e&&(Ya(4),ou("\n ",Vl(5,1,"common.close-button"),"\n "))}var pY=function(e){function t(t,n,i,r){var a=e.call(this,i,n)||this;return a.data=t,a.dialogRef=n,a.hwWalletService=i,a.form=r.group({words:[24,Yf.required]}),a.justCheckingSeed=!!a.data.wallet,a}return vf(t,e),t.prototype.startOperation=function(){var e=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.recoverMnemonic(this.form.controls.words.value,this.justCheckingSeed).subscribe(function(){e.justCheckingSeed?e.showResult({text:"hardware-wallet.restore-seed.correct-seed",icon:e.msgIcons.Success}):(e.data.requestOptionsComponentRefresh(),e.closeModal())},function(t){return e.processHwOperationError(t)})},t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(gC),ps(fm))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-restore-seed-dialog"]],features:[Ko],decls:16,vars:9,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],[1,"-select"],["formControlName","words","id","words"],[3,"ngValue"],["class","warning",4,"ngIf"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],[1,"warning"],[3,"text","icon"],["closeButton",""]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n\n "),ru(3,"\n "),hs(4,cY,38,19,"div",1),ru(5,"\n\n "),ru(6,"\n "),hs(7,dY,2,4,"app-hw-message",2),ru(8,"\n\n "),ru(9,"\n "),hs(10,hY,2,4,"app-hw-message",2),ru(11,"\n\n "),ru(12,"\n "),hs(13,fY,7,3,"div",3),ru(14,"\n"),_s(),ru(15,"\n")),2&e&&(ms("headline",Vl(1,7,t.justCheckingSeed?"hardware-wallet.options.confirm-seed":"hardware-wallet.options.restore-backup"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Processing),Ya(4),ms("ngIf",t.currentState===t.states.Initial),Ya(3),ms("ngIf",t.currentState===t.states.Processing),Ya(3),ms("ngIf",t.currentState===t.states.ShowingResult),Ya(3),ms("ngIf",t.currentState!==t.states.Initial&&t.currentState!==t.states.Processing))},directives:[jk,lh,oC,ap,jp,Jp,rp,qp,Zp,em,ZC],pipes:[hM],styles:[".warning[_ngcontent-%COMP%]{margin-top:15px;color:#ff004e;text-align:center}"]}),t}(yC);function mY(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),ys(2,"app-hw-message",2),Wl(3,"translate"),ru(4,"\n\n "),vs(5,"div",3),ru(6,"\n "),vs(7,"mat-checkbox",4),xs("change",function(e){return on(n),Ys().setConfirmed(e)}),ru(8),Wl(9,"translate"),_s(),ru(10,"\n "),_s(),ru(11,"\n\n "),vs(12,"div",5),ru(13,"\n "),vs(14,"app-button",6),xs("action",function(){return on(n),Ys().closeModal()}),ru(15),Wl(16,"translate"),_s(),ru(17,"\n "),vs(18,"app-button",7),xs("action",function(){return on(n),Ys().requestRemoval()}),ru(19),Wl(20,"translate"),_s(),ru(21,"\n "),_s(),ru(22,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("text",Vl(3,7,"hardware-wallet.remove-pin.warning"))("icon",i.msgIcons.Warning),Ya(5),ms("checked",i.confirmed),Ya(1),ou("",Vl(9,9,"common.generic-confirmation-check"),"\n "),Ya(7),ou("\n ",Vl(16,11,"common.cancel-button"),"\n "),Ya(3),ms("disabled",!i.confirmed),Ya(1),ou("\n ",Vl(20,13,"common.continue-button"),"\n ")}}function gY(e,t){if(1&e&&(ys(0,"app-hw-message",2),Wl(1,"translate")),2&e){var n=Ys(2);ms("text",Vl(1,2,"hardware-wallet.general.confirm"))("icon",n.msgIcons.Confirm)}}function vY(e,t){if(1&e&&(ys(0,"app-hw-message",2),Wl(1,"translate")),2&e){var n=Ys(2);ms("text",Vl(1,2,n.result.text))("icon",n.result.icon)}}function _Y(e,t){if(1&e){var n=Ms();vs(0,"div",5),ru(1,"\n "),vs(2,"app-button",10,11),xs("action",function(){return on(n),Ys(2).closeModal()}),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()}2&e&&(Ya(4),ou("\n ",Vl(5,1,"common.close-button"),"\n "))}function yY(e,t){if(1&e&&(vs(0,"div"),ru(1,"\n "),ru(2,"\n "),hs(3,gY,2,4,"app-hw-message",8),ru(4,"\n\n "),ru(5,"\n "),hs(6,vY,2,4,"app-hw-message",8),ru(7,"\n\n "),ru(8,"\n "),hs(9,_Y,7,3,"div",9),ru(10,"\n "),_s()),2&e){var n=Ys();Ya(3),ms("ngIf",n.currentState===n.states.Processing),Ya(3),ms("ngIf",n.currentState===n.states.ShowingResult),Ya(3),ms("ngIf",n.currentState!==n.states.Processing)}}var bY=function(e){function t(t,n,i){var r=e.call(this,i,n)||this;return r.data=t,r.dialogRef=n,r.hwWalletService=i,r.confirmed=!1,r}return vf(t,e),t.prototype.setConfirmed=function(e){this.confirmed=e.checked},t.prototype.requestRemoval=function(){var e=this;this.currentState=this.states.Processing,this.operationSubscription=this.hwWalletService.removePin().subscribe(function(){e.showResult({text:"hardware-wallet.general.completed",icon:e.msgIcons.Success}),e.data.requestOptionsComponentRefresh(null,!0)},function(t){return e.processHwOperationError(t)})},t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(gC))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-remove-pin-dialog"]],features:[Ko],decls:8,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon"],[1,"-check-container"],["type","checkbox",1,"-check",3,"checked","change"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"disabled","action"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,mY,23,15,"div",1),ru(5,"\n\n "),hs(6,yY,11,3,"div",1),ru(7,"\n"),_s()),2&e&&(ms("headline",Vl(1,5,"hardware-wallet.options.delete-pin"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Processing),Ya(4),ms("ngIf",t.currentState===t.states.Initial),Ya(2),ms("ngIf",t.currentState!==t.states.Initial))},directives:[jk,lh,oC,lO,ZC],pipes:[hM],styles:[""]}),t}(yC);function wY(e,t){if(1&e){var n=Ms();vs(0,"div",7),ru(1,"\n "),vs(2,"mat-checkbox",8),xs("change",function(e){return on(n),Ys(2).setConfirmed(e)}),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}if(2&e){var i=Ys(2);Ya(2),ms("checked",i.confirmed),Ya(1),ou("",Vl(4,2,"common.generic-confirmation-check"),"\n ")}}function kY(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),ys(2,"app-hw-message",2),Wl(3,"translate"),ru(4,"\n\n "),hs(5,wY,6,4,"div",3),ru(6,"\n\n "),vs(7,"div",4),ru(8,"\n "),vs(9,"app-button",5),xs("action",function(){return on(n),Ys().closeModal()}),ru(10),Wl(11,"translate"),_s(),ru(12,"\n "),vs(13,"app-button",6),xs("action",function(){return on(n),Ys().startUpdating()}),ru(14),Wl(15,"translate"),_s(),ru(16,"\n "),_s(),ru(17,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("text",Vl(3,6,i.text))("icon",i.deviceHasFirmware?i.msgIcons.Warning:i.msgIcons.HardwareWallet),Ya(3),ms("ngIf",i.deviceHasFirmware),Ya(5),ou("\n ",Vl(11,8,"common.cancel-button"),"\n "),Ya(3),ms("disabled",i.deviceHasFirmware&&!i.confirmed),Ya(1),ou("\n ",Vl(15,10,"common.continue-button"),"\n ")}}function MY(e,t){if(1&e&&(ys(0,"app-hw-message",2),Wl(1,"translate")),2&e){var n=Ys(2);ms("text",Vl(1,2,"hardware-wallet.update-firmware.title-connecting"))("icon",n.msgIcons.Spinner)}}function SY(e,t){if(1&e&&(ys(0,"app-hw-message",2),Wl(1,"translate")),2&e){var n=Ys(2);ms("text",Vl(1,2,"hardware-wallet.update-firmware.follow"))("icon",n.msgIcons.Confirm)}}function CY(e,t){if(1&e&&(ys(0,"app-hw-message",2),Wl(1,"translate")),2&e){var n=Ys(2);ms("text",Vl(1,2,n.result.text))("icon",n.result.icon)}}function LY(e,t){if(1&e){var n=Ms();vs(0,"div",4),ru(1,"\n "),vs(2,"app-button",11,12),xs("action",function(){return on(n),Ys(2).closeModal()}),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()}2&e&&(Ya(4),ou("\n ",Vl(5,1,"common.close-button"),"\n "))}function xY(e,t){if(1&e&&(vs(0,"div"),ru(1,"\n "),ru(2,"\n "),hs(3,MY,2,4,"app-hw-message",9),ru(4,"\n\n "),ru(5,"\n "),hs(6,SY,2,4,"app-hw-message",9),ru(7,"\n\n "),ru(8,"\n "),hs(9,CY,2,4,"app-hw-message",9),ru(10,"\n\n "),ru(11,"\n "),hs(12,LY,7,3,"div",10),ru(13,"\n "),_s()),2&e){var n=Ys();Ya(3),ms("ngIf",n.currentState===n.states.Connecting),Ya(3),ms("ngIf",n.currentState===n.states.Processing),Ya(3),ms("ngIf",n.currentState===n.states.ShowingResult),Ya(3),ms("ngIf",n.currentState!==n.states.Processing)}}var TY=function(e){function t(t,n,i){var r=e.call(this,n,t)||this;return r.dialogRef=t,r.hwWalletService=n,r.msgBarService=i,r.closeIfHwDisconnected=!1,r.currentState=r.states.Connecting,r.confirmed=!1,r.deviceInBootloaderMode=!1,r.deviceHasFirmware=!0,r.checkDevice(!1),r}return vf(t,e),Object.defineProperty(t.prototype,"title",{get:function(){return this.currentState===this.states.Connecting?"hardware-wallet.update-firmware.title-connecting":this.deviceHasFirmware?"hardware-wallet.update-firmware.title-update":"hardware-wallet.update-firmware.title-install"},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"text",{get:function(){return this.deviceHasFirmware?this.deviceInBootloaderMode?"hardware-wallet.update-firmware.text-bootloader":"hardware-wallet.update-firmware.text-not-bootloader":"hardware-wallet.update-firmware.text-no-firmware"},enumerable:!1,configurable:!0}),t.openDialog=function(e){var n=new wk;return n.autoFocus=!1,n.width="450px",e.open(t,n)},t.prototype.ngOnDestroy=function(){e.prototype.ngOnDestroy.call(this),this.msgBarService.hide(),this.closeCheckDeviceSubscription()},t.prototype.setConfirmed=function(e){this.confirmed=e.checked},t.prototype.startUpdating=function(){var e=this;this.msgBarService.hide(),this.showResult({text:"hardware-wallet.update-firmware.text-downloading",icon:this.msgIcons.Spinner}),this.closeCheckDeviceSubscription(),this.operationSubscription=this.hwWalletService.updateFirmware(function(){return e.currentState=e.states.Processing}).subscribe(function(){e.showResult({text:"hardware-wallet.update-firmware.finished",icon:e.msgIcons.Success})},function(t){(t=VM(t)).type===BM.Success?e.showResult({text:"hardware-wallet.update-firmware.finished",icon:e.msgIcons.Success}):t.type===BM.Timeout?e.showResult({text:"hardware-wallet.update-firmware.timeout",icon:e.msgIcons.Error}):(setTimeout(function(){e.msgBarService.showError(t)}),e.checkDevice(!1),e.currentState=e.states.Initial)})},t.prototype.checkDevice=function(e){var t=this;void 0===e&&(e=!0),this.closeCheckDeviceSubscription(),this.checkDeviceSubscription=bm(0).pipe(EM(e?1e3:0),ue(function(){return t.hwWalletService.getFeatures(!1)})).subscribe(function(e){t.deviceInBootloaderMode=e.rawResponse.bootloader_mode,t.deviceHasFirmware=!t.deviceInBootloaderMode||e.rawResponse.firmware_present,t.currentState===t.states.Connecting&&(t.currentState=t.states.Initial),t.checkDevice()},function(){t.deviceInBootloaderMode=!1,t.deviceHasFirmware=!0,t.currentState===t.states.Connecting&&(t.currentState=t.states.Initial),t.checkDevice()})},t.prototype.closeCheckDeviceSubscription=function(){this.checkDeviceSubscription&&this.checkDeviceSubscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(ps(Lk),ps(gC),ps(dL))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-update-firmware-dialog"]],features:[Ko],decls:8,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[4,"ngIf"],[3,"text","icon"],["class","-check-container",4,"ngIf"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"disabled","action"],[1,"-check-container"],["type","checkbox",1,"-check",3,"checked","change"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,kY,18,12,"div",1),ru(5,"\n\n "),hs(6,xY,14,4,"div",1),ru(7,"\n"),_s()),2&e&&(ms("headline",Vl(1,5,t.title))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Processing),Ya(4),ms("ngIf",t.currentState===t.states.Initial),Ya(2),ms("ngIf",t.currentState!==t.states.Initial))},directives:[jk,lh,oC,ZC,lO],pipes:[hM],styles:[""]}),t}(yC),DY=function(e){function t(t,n){var i=e.call(this,n,t)||this;return i.dialogRef=t,i}return vf(t,e),t.openDialog=function(e){var n=new wk;return n.autoFocus=!1,n.width="450px",e.open(t,n)},t.prototype.update=function(){this._dialogRef.close(!0)},t.\u0275fac=function(e){return new(e||t)(ps(Lk),ps(gC))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-update-alert-dialog"]],features:[Ko],decls:18,vars:14,consts:[[3,"headline","dialog"],[3,"text","icon"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ys(3,"app-hw-message",1),Wl(4,"translate"),ru(5,"\n\n "),vs(6,"div",2),ru(7,"\n "),vs(8,"app-button",3),xs("action",function(){return t.closeModal()}),ru(9),Wl(10,"translate"),_s(),ru(11,"\n "),vs(12,"app-button",4),xs("action",function(){return t.update()}),ru(13),Wl(14,"translate"),_s(),ru(15,"\n "),_s(),ru(16,"\n"),_s(),ru(17,"\n")),2&e&&(ms("headline",Vl(1,6,"hardware-wallet.update-firmware-warning.title"))("dialog",t.dialogRef),Ya(3),ms("text",Vl(4,8,"hardware-wallet.update-firmware-warning.text"))("icon",t.msgIcons.Warning),Ya(6),ou("\n ",Vl(10,10,"common.cancel-button"),"\n "),Ya(4),ou("\n ",Vl(14,12,"hardware-wallet.update-firmware-warning.update"),"\n "))},directives:[jk,oC,ZC],pipes:[hM],styles:[""]}),t}(yC);function OY(e,t){if(1&e&&(ys(0,"app-hw-message",7),Wl(1,"translate"),Wl(2,"translate")),2&e){var n=Ys();ms("text",Vl(1,6,n.result.text))("linkText",n.result.linkText?Vl(2,8,n.result.linkText):null)("link",n.result.link)("linkIsUrl",!0)("linkIsInternal",n.result.linkIsInternal)("icon",n.result.icon)}}function EY(e,t){if(1&e){var n=Ms();vs(0,"app-hw-message",8),xs("linkClicked",function(){return on(n),Ys().wipe()}),Wl(1,"translate"),Wl(2,"translate"),Wl(3,"translate"),_s()}if(2&e){var i=Ys();ms("text",Vl(1,3,"hardware-wallet.errors.refused")+" "+Vl(2,5,"hardware-wallet.options.forgotten-pin-part1"))("linkText",Vl(3,7,"hardware-wallet.options.forgotten-pin-part2"))("icon",i.msgIcons.Error)}}function YY(e,t){if(1&e){var n=Ms();vs(0,"app-hw-message",8),xs("linkClicked",function(){return on(n),Ys().wipe()}),Wl(1,"translate"),Wl(2,"translate"),Wl(3,"translate"),_s()}if(2&e){var i=Ys();ms("text",Vl(1,3,"hardware-wallet.errors.incorrect-pin")+" "+Vl(2,5,"hardware-wallet.options.forgotten-pin-part1"))("linkText",Vl(3,7,"hardware-wallet.options.forgotten-pin-part2"))("icon",i.msgIcons.Error)}}function PY(e,t){if(1&e&&(ys(0,"app-hw-message",17),Wl(1,"translate"),Wl(2,"translate"),Wl(3,"translate")),2&e){var n=Ys(2);ms("upperBigText",Vl(1,4,"hardware-wallet.options.unconfigured-detected-title"))("lowerLightText",Vl(2,6,"hardware-wallet.options.firmware-version")+" "+n.firmwareVersion)("text",Vl(3,8,"hardware-wallet.options.unconfigured-detected"))("icon",n.msgIcons.HardwareWallet)}}function AY(e,t){if(1&e&&(ys(0,"app-hw-message",18),Wl(1,"translate"),Wl(2,"translate")),2&e){var n=Ys(2);ms("text",Vl(1,4,"hardware-wallet.options.configured-detected"))("lowerLightText",Vl(2,6,"hardware-wallet.options.firmware-version")+" "+n.firmwareVersion)("lowerBigText",n.wallet.label)("icon",n.msgIcons.HardwareWallet)}}function IY(e,t){1&e&&ys(0,"br")}function RY(e,t){if(1&e&&(bs(0),ru(1,"\n "),vs(2,"div"),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),hs(6,IY,1,0,"br",16),ru(7,"\n "),ws()),2&e){var n=t.$implicit,i=t.index,r=Ys(3);Ya(3),su("",r.securityWarnings.length>1?i+1+")":""," ",Vl(4,3,n),""),Ya(3),ms("ngIf",i1?"hardware-wallet.options.security-warnings-title":"hardware-wallet.options.security-warning-title")),Ya(3),ms("ngForOf",n.securityWarnings)}}function HY(e,t){if(1&e){var n=Ms();vs(0,"button",22),xs("click",function(){return on(n),Ys(2).update()}),ru(1,"\n "),vs(2,"div",23),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}2&e&&(Ya(3),au(Vl(4,1,"hardware-wallet.options.update-firmware")))}function jY(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),vs(2,"button",22),xs("click",function(){return on(n),Ys(2).generateMnemonic()}),ru(3,"\n "),vs(4,"div",24),ru(5),Wl(6,"translate"),_s(),ru(7,"\n "),_s(),ru(8,"\n "),vs(9,"button",22),xs("click",function(){return on(n),Ys(2).restoreMnemonic()}),ru(10,"\n "),vs(11,"div",24),ru(12),Wl(13,"translate"),_s(),ru(14,"\n "),_s(),ru(15,"\n "),_s()}2&e&&(Ya(5),au(Vl(6,2,"hardware-wallet.options.configure-automatically")),Ya(7),au(Vl(13,4,"hardware-wallet.options.restore-backup")))}function NY(e,t){if(1&e){var n=Ms();vs(0,"button",22),xs("click",function(){return on(n),Ys(3).backup()}),ru(1,"\n "),vs(2,"div",24),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}2&e&&(Ya(3),au(Vl(4,1,"hardware-wallet.options.create-backup")))}function BY(e,t){if(1&e){var n=Ms();vs(0,"button",22),xs("click",function(){return on(n),Ys(3).confirmSeed()}),ru(1,"\n "),vs(2,"div",24),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}2&e&&(Ya(3),au(Vl(4,1,"hardware-wallet.options.confirm-seed")))}function WY(e,t){if(1&e){var n=Ms();vs(0,"button",22),xs("click",function(){return on(n),Ys(3).removePin()}),ru(1,"\n "),vs(2,"div",25),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}2&e&&(Ya(3),au(Vl(4,1,"hardware-wallet.options.delete-pin")))}function VY(e,t){if(1&e){var n=Ms();vs(0,"div"),ru(1,"\n "),hs(2,NY,6,3,"button",15),ru(3,"\n "),hs(4,BY,6,3,"button",15),ru(5,"\n "),vs(6,"button",22),xs("click",function(){return on(n),Ys(2).changePin()}),ru(7,"\n "),vs(8,"div",24),ru(9),Wl(10,"translate"),_s(),ru(11,"\n "),_s(),ru(12,"\n "),hs(13,WY,6,3,"button",15),ru(14,"\n "),vs(15,"button",22),xs("click",function(){return on(n),Ys(2).wipe()}),ru(16,"\n "),vs(17,"div",25),ru(18),Wl(19,"translate"),_s(),ru(20,"\n "),_s(),ru(21,"\n "),_s()}if(2&e){var i=Ys(2);Ya(2),ms("ngIf",i.needsBackup),Ya(2),ms("ngIf",!i.needsBackup),Ya(5),au(Vl(10,5,i.needsPin?"hardware-wallet.options.create-pin":"hardware-wallet.options.change-pin")),Ya(4),ms("ngIf",!i.needsPin),Ya(5),au(Vl(19,7,"hardware-wallet.options.wipe"))}}var UY=function(e){return{disabled:e}};function zY(e,t){if(1&e&&(vs(0,"div",9),ru(1,"\n "),hs(2,PY,4,10,"app-hw-message",10),ru(3,"\n\n "),hs(4,AY,3,8,"app-hw-message",11),ru(5,"\n\n "),hs(6,FY,14,4,"div",12),ru(7,"\n\n "),vs(8,"div",13),ru(9),Wl(10,"translate"),_s(),ru(11,"\n "),vs(12,"div",14),ru(13,"\n "),hs(14,HY,6,3,"button",15),ru(15,"\n "),hs(16,jY,16,6,"div",16),ru(17,"\n "),hs(18,VY,22,9,"div",16),ru(19,"\n "),_s(),ru(20,"\n "),_s()),2&e){var n=Ys();ms("ngClass",Il(10,UY,n.refreshingWarnings)),Ya(2),ms("ngIf",n.newWalletConnected),Ya(2),ms("ngIf",!n.newWalletConnected),Ya(2),ms("ngIf",n.securityWarnings.length>0),Ya(3),au(Vl(10,8,"hardware-wallet.options.options")),Ya(5),ms("ngIf",n.outdatedFirmware),Ya(2),ms("ngIf",n.newWalletConnected),Ya(2),ms("ngIf",!n.newWalletConnected)}}function qY(e,t){1&e&&(vs(0,"div",26),ru(1,"\n "),ys(2,"mat-spinner"),ru(3),Wl(4,"translate"),_s()),2&e&&(Ya(3),ou("\n ",Vl(4,1,"common.loading"),"\n "))}function GY(e,t){if(1&e){var n=Ms();vs(0,"div",27),ru(1,"\n "),vs(2,"app-button",28),xs("action",function(){return on(n),Ys().closeModal()}),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}if(2&e){var i=Ys();ms("ngClass",Il(4,UY,i.refreshingWarnings)),Ya(3),ou("\n ",Vl(4,2,"common.close-button"),"\n ")}}function KY(e,t){if(1&e){var n=Ms();vs(0,"div",29),ru(1,"\n "),vs(2,"app-button",28,30),xs("action",function(){return on(n),Ys().closeModal()}),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()}2&e&&(Ya(4),ou("\n ",Vl(5,1,"common.close-button"),"\n "))}var JY=function(e){function t(t,n,i,r,a,o,s){var u=e.call(this,i,n)||this;return u.onboarding=t,u.dialogRef=n,u.hwWalletService=i,u.dialog=r,u.msgBarService=a,u.hardwareWalletService=o,u.walletsAndAddressesService=s,u.closeIfHwDisconnected=!1,u.newWalletConnected=!1,u.otherStateBecauseWrongPin=!1,u.firmwareVersion="",u.securityWarnings=[],u.refreshingWarnings=!1,u.completeRecheckRequested=!1,u.recheckSecurityOnlyRequested=!1,u.showErrorRequested=!1,u.customErrorMsg="",u.checkWallet(!0),u}return vf(t,e),t.openDialog=function(e,n){var i=new wk;return i.data=n,i.autoFocus=!1,i.width=jM.mediumModalWidth,e.open(t,i)},t.prototype.ngOnDestroy=function(){e.prototype.ngOnDestroy.call(this),this.removeDialogSubscription(),this.removeOperationSubscription(),this.msgBarService.hide()},t.prototype.hwConnectionChanged=function(e){this.checkWallet(!0)},t.prototype.update=function(){this.openUpdateDialog()},t.prototype.generateMnemonic=function(){this.openDialog(XE)},t.prototype.restoreMnemonic=function(){this.openDialog(pY)},t.prototype.changePin=function(){this.openDialog(uY)},t.prototype.removePin=function(){this.openDialog(bY)},t.prototype.backup=function(){this.openDialog(rY)},t.prototype.wipe=function(){this.openDialog(DE)},t.prototype.confirmSeed=function(){this.openDialog(pY)},t.prototype.openDialog=function(e){var t=this;this.customErrorMsg="",this.removeDialogSubscription();var n=new wk;n.width="450px",n.autoFocus=!1,n.data={wallet:this.wallet,walletHasPin:!this.needsPin,requestOptionsComponentRefresh:function(e,n){void 0===e&&(e=null),void 0===n&&(n=!1),e?(t.showErrorRequested=!0,t.customErrorMsg=e):n?t.recheckSecurityOnlyRequested=!0:t.completeRecheckRequested=!0}},this.dialogSubscription=this.dialog.open(e,n).afterClosed().subscribe(function(){t.completeRecheckRequested?t.checkWallet():t.recheckSecurityOnlyRequested?t.updateSecurityWarningsAndData().subscribe():t.showErrorRequested&&t.showError(),t.completeRecheckRequested=!1,t.recheckSecurityOnlyRequested=!1,t.showErrorRequested=!1})},t.prototype.removeDialogSubscription=function(){this.dialogSubscription&&this.dialogSubscription.unsubscribe()},t.prototype.updateSecurityWarningsAndData=function(){var e=this;return bm(1).pipe(Hv(function(){return e.refreshingWarnings=!0}),ue(function(){return e.hardwareWalletService.getFeaturesAndUpdateData(e.wallet)}),K(function(t){return e.refreshingWarnings=!1,e.securityWarnings=[],t.securityWarnings.includes(EE.FirmwareVersionNotVerified)?(e.firmwareVersionNotVerified=!0,e.securityWarnings.push("hardware-wallet.options.unchecked-version-warning")):e.firmwareVersionNotVerified=!1,t.securityWarnings.includes(EE.OutdatedFirmware)?(e.outdatedFirmware=!0,e.securityWarnings.push("hardware-wallet.options.outdated-version-warning")):e.outdatedFirmware=!1,e.wallet&&t.securityWarnings.includes(EE.NeedsBackup)?(e.needsBackup=!0,e.securityWarnings.push("hardware-wallet.options.backup-warning")):e.needsBackup=!1,e.wallet&&t.securityWarnings.includes(EE.NeedsPin)?(e.needsPin=!0,e.securityWarnings.push("hardware-wallet.options.pin-warning")):e.needsPin=!1,t.walletNameUpdated&&e.msgBarService.showWarning("hardware-wallet.general.name-updated"),e.firmwareVersion=t.features.fw_major+"."+t.features.fw_minor+"."+t.features.fw_patch,t}))},t.prototype.checkWallet=function(e){var t=this;void 0===e&&(e=!1),this.wallet=null,this.showResult({text:"hardware-wallet.options.connecting",icon:this.msgIcons.Spinner},!1),this.removeOperationSubscription(),this.operationSubscription=this.hwWalletService.getDeviceConnected().subscribe(function(n){n?t.operationSubscription=t.hwWalletService.getFeatures(!1).subscribe(function(n){n.rawResponse.bootloader_mode?t.openUpdateDialog():t.continueCheckingWallet(e)},function(){return t.continueCheckingWallet(e)}):t.showResult({text:"hardware-wallet.options.disconnected",icon:t.msgIcons.Usb})},function(e){t.processHwOperationError(e)})},t.prototype.continueCheckingWallet=function(e){var t=this;this.operationSubscription=this.hwWalletService.getAddresses(1,0).subscribe(function(n){t.operationSubscription=t.walletsAndAddressesService.allWallets.pipe(eS()).subscribe(function(i){i.some(function(e){var i=e.addresses[0].address===n.rawResponse[0]&&e.isHardware;return i&&(t.wallet=e),i})?t.operationSubscription=t.updateSecurityWarningsAndData().subscribe(function(n){e&&n.securityWarnings.find(function(e){return e===EE.OutdatedFirmware})&&t.openUpdateWarning(),t.onboarding?(t.hwWalletService.showOptionsWhenPossible=!0,t.dialogRef.close(!0)):(t.currentState=t.states.Finished,t.newWalletConnected=!1)},function(e){return t.processHwOperationError(e)}):t.openDialog(GE)})},function(n){(n=VM(n)).type===BM.WithoutSeed?t.operationSubscription=t.updateSecurityWarningsAndData().subscribe(function(n){t.currentState=t.states.Finished,t.newWalletConnected=!0,e&&n.securityWarnings.find(function(e){return e===EE.OutdatedFirmware})&&t.openUpdateWarning()},function(e){return t.processHwOperationError(e)}):n.type===BM.FailedOrRefused?(t.currentState=t.states.Other,t.otherStateBecauseWrongPin=!1):n.type===BM.WrongPin?(t.currentState=t.states.Other,t.otherStateBecauseWrongPin=!0):t.processHwOperationError(n)})},t.prototype.removeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},t.prototype.openUpdateWarning=function(){var e=this;DY.openDialog(this.dialog).afterClosed().subscribe(function(t){t&&e.openUpdateDialog()})},t.prototype.openUpdateDialog=function(){TY.openDialog(this.dialog),this.closeModal()},t.prototype.showError=function(){this.showResult({text:this.customErrorMsg?this.customErrorMsg:"hardware-wallet.errors.generic-error",icon:this.msgIcons.Error}),this.customErrorMsg=""},t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(gC),ps(Pk),ps(dL),ps(YE),ps(AL))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-options-dialog"]],features:[Ko],decls:18,vars:11,consts:[[3,"headline","dialog"],[3,"text","linkText","link","linkIsUrl","linkIsInternal","icon",4,"ngIf"],[3,"text","linkText","icon","linkClicked",4,"ngIf"],[3,"ngClass",4,"ngIf"],["class","loading-indicator",4,"ngIf"],["class","-buttons",3,"ngClass",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","linkText","link","linkIsUrl","linkIsInternal","icon"],[3,"text","linkText","icon","linkClicked"],[3,"ngClass"],[3,"upperBigText","lowerLightText","text","icon",4,"ngIf"],[3,"text","lowerLightText","lowerBigText","icon",4,"ngIf"],["class","alert-box",4,"ngIf"],[1,"options-label"],[1,"option-buttons-container","light-button-theme"],["mat-button","","color","primary",3,"click",4,"ngIf"],[4,"ngIf"],[3,"upperBigText","lowerLightText","text","icon"],[3,"text","lowerLightText","lowerBigText","icon"],[1,"alert-box"],[1,"title"],[4,"ngFor","ngForOf"],["mat-button","","color","primary",3,"click"],[1,"label","-blinking"],[1,"label"],[1,"label","red-text"],[1,"loading-indicator"],[1,"-buttons",3,"ngClass"],[1,"primary-button",3,"action"],[1,"-buttons"],["closeButton",""]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),hs(3,OY,3,10,"app-hw-message",1),ru(4,"\n\n "),hs(5,EY,4,9,"app-hw-message",2),ru(6,"\n\n "),hs(7,YY,4,9,"app-hw-message",2),ru(8,"\n\n "),hs(9,zY,21,12,"div",3),ru(10,"\n\n "),hs(11,qY,5,3,"div",4),ru(12,"\n\n "),hs(13,GY,6,6,"div",5),ru(14,"\n\n "),hs(15,KY,7,3,"div",6),ru(16,"\n"),_s(),ru(17,"\n")),2&e&&(ms("headline",Vl(1,9,"wallet.hardware-wallet-button"))("dialog",t.dialogRef),Ya(3),ms("ngIf",t.currentState===t.states.ShowingResult),Ya(2),ms("ngIf",t.currentState===t.states.Other&&!t.otherStateBecauseWrongPin),Ya(2),ms("ngIf",t.currentState===t.states.Other&&t.otherStateBecauseWrongPin),Ya(2),ms("ngIf",t.currentState===t.states.Finished),Ya(2),ms("ngIf",t.currentState===t.states.Finished&&t.refreshingWarnings),Ya(2),ms("ngIf",t.currentState===t.states.Finished),Ya(2),ms("ngIf",t.currentState!==t.states.Finished))},directives:[jk,lh,oC,ah,WC,sh,SC,MM,ZC],pipes:[hM],styles:[".alert-box[_ngcontent-%COMP%], .options-label[_ngcontent-%COMP%]{margin-top:25px}.options-label[_ngcontent-%COMP%]{margin-bottom:10px;font-weight:700}.option-buttons-container[_ngcontent-%COMP%]{margin:0 -10px}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid rgba(30,34,39,.05)}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:first-child{border-top:1px solid rgba(30,34,39,.05)}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}.-blinking[_ngcontent-%COMP%]{-webkit-animation:alert-blinking 1s linear infinite;animation:alert-blinking 1s linear infinite}.loading-indicator[_ngcontent-%COMP%]{width:100px;height:40px;left:calc(50% - 50px);top:calc(50% - 20px);position:absolute;display:flex;justify-content:center;align-items:center}.loading-indicator[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{margin-left:7px;margin-right:12px;height:18px!important;width:18px!important}.loading-indicator[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:18px!important;width:18px!important}.loading-indicator[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg circle{stroke:rgba(30,34,39,.2)}.disabled[_ngcontent-%COMP%]{opacity:.3;cursor:default;pointer-events:none}"]}),t}(yC);function ZY(e,t){1&e&&(ys(0,"img",29),Wl(1,"translate")),2&e&&ms("matTooltip",Vl(1,1,"wallet.encryption-enabled"))}function $Y(e,t){1&e&&(ys(0,"img",30),Wl(1,"translate")),2&e&&ms("matTooltip",Vl(1,1,"wallet.encryption-disabled"))}function XY(e,t){1&e&&(ys(0,"img",31),Wl(1,"translate")),2&e&&ms("matTooltip",Vl(1,1,"wallet.temporal"))}function QY(e,t){1&e&&(ys(0,"img",32),Wl(1,"translate")),2&e&&ms("matTooltip",Vl(1,1,"wallet.warning-hw-security"))}function eP(e,t){1&e&&ys(0,"app-wallet-detail",33),2&e&&ms("wallet",Ys().$implicit)}var tP=function(e,t){return{"rotate-270":e,"rotate-90":t}};function nP(e,t){if(1&e){var n=Ms();vs(0,"div",16),ru(1,"\n "),vs(2,"div",17),ru(3,"\n "),vs(4,"div",18),xs("click",function(){var e=on(n).$implicit;return Ys(3).toggleWallet(e)}),ru(5,"\n "),ru(6,"\n "),vs(7,"div",19),ru(8),_s(),ru(9,"\n "),ru(10,"\n "),vs(11,"div",20),ru(12,"\n "),hs(13,ZY,2,3,"img",21),ru(14,"\n "),hs(15,$Y,2,3,"img",22),ru(16,"\n "),hs(17,XY,2,3,"img",23),ru(18,"\n "),hs(19,QY,2,3,"img",24),ru(20,"\n "),_s(),ru(21,"\n "),ru(22,"\n "),vs(23,"div",13),ru(24),Wl(25,"amount"),_s(),ru(26,"\n "),vs(27,"div",25),ru(28),Wl(29,"amount"),_s(),ru(30,"\n "),ru(31,"\n "),vs(32,"div",26),ru(33,"\n "),ys(34,"img",27),ru(35,"\n "),_s(),ru(36,"\n "),_s(),ru(37,"\n "),ru(38,"\n "),hs(39,eP,1,1,"app-wallet-detail",28),ru(40,"\n "),_s(),ru(41,"\n "),_s()}if(2&e){var i=t.$implicit,r=Ys(3);Ya(7),ls("title",i.label),Ya(1),au(i.label),Ya(5),ms("ngIf",i.encrypted&&!i.isHardware&&!i.temporal),Ya(2),ms("ngIf",!i.encrypted&&!i.isHardware&&!i.temporal),Ya(2),ms("ngIf",!i.isHardware&&i.temporal),Ya(2),ms("ngIf",i.hasHwSecurityWarnings&&i.isHardware),Ya(5),au(zl(25,10,i.coins?i.coins:0,!0,"first")),Ya(4),au(zl(29,14,i.hours?i.hours:0,!1,"first")),Ya(6),ms("ngClass",Rl(18,tP,r.walletsOpenedState.get(i.id),!r.walletsOpenedState.get(i.id))),Ya(5),ms("ngIf",r.walletsOpenedState.get(i.id))}}function iP(e,t){if(1&e&&(bs(0),ru(1,"\n "),ru(2,"\n "),vs(3,"div",10),ru(4,"\n "),vs(5,"div",11),ru(6),Wl(7,"translate"),_s(),ru(8,"\n "),ys(9,"div",12),ru(10,"\n "),vs(11,"div",13),ru(12),Wl(13,"commonText"),_s(),ru(14,"\n "),vs(15,"div",13),ru(16),Wl(17,"commonText"),_s(),ru(18,"\n "),ys(19,"div",14),ru(20,"\n "),_s(),ru(21,"\n\n "),ru(22,"\n "),hs(23,nP,42,21,"div",15),ru(24,"\n "),ws()),2&e){var n=Ys().$implicit,i=Ys();Ya(6),au(Vl(7,4,0===n?"wallet.hardware-wallet-table-label":"wallet.wallet-table-label")),Ya(6),au(Vl(13,6,"coin")),Ya(4),au(Vl(17,8,"hours")),Ya(7),ms("ngForOf",0===n?i.hardwareWallets:i.wallets)}}function rP(e,t){if(1&e&&(vs(0,"div",8),ru(1,"\n "),hs(2,iP,25,10,"ng-container",9),ru(3,"\n "),_s()),2&e){var n=t.$implicit,i=Ys();Ya(2),ms("ngIf",0===n&&i.hardwareWallets.length>0||1===n&&i.wallets.length>0)}}function aP(e,t){if(1&e){var n=Ms();vs(0,"button",4),xs("click",function(){return on(n),Ys().adminHwWallet()}),ru(1,"\n "),ys(2,"img",34),ru(3),Wl(4,"translate"),_s()}2&e&&(Ya(3),ou(" ",Vl(4,1,"wallet.hardware-wallet-button"),"\n "))}var oP=function(){return[0,1]},sP=function(){function e(e,t,n,i,r){var a=this;this.hwWalletService=e,this.dialog=t,this.router=n,this.walletsAndAddressesService=i,this.balanceAndOutputsService=r,this.hwCompatibilityActivated=!1,this.wallets=[],this.hardwareWallets=[],this.walletsOpenedState=new Map,this.hwCompatibilityActivated=this.hwWalletService.hwWalletCompatibilityActivated,this.subscription=this.balanceAndOutputsService.walletsWithBalance.subscribe(function(e){a.wallets=[],a.hardwareWallets=[];var t=new Map;e.forEach(function(e){t.set(e.id,!0),e.isHardware?a.hardwareWallets.push(e):a.wallets.push(e),a.walletsOpenedState.has(e.id)||a.walletsOpenedState.set(e.id,!1)});var n=[];a.walletsOpenedState.forEach(function(e,i){t.has(i)||n.push(i)}),n.forEach(function(e){a.walletsOpenedState.delete(e)})})}return e.prototype.ngOnInit=function(){var e=this;this.hwWalletService.showOptionsWhenPossible&&setTimeout(function(){e.hwWalletService.showOptionsWhenPossible=!1,e.adminHwWallet()})},e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe(),e.busy=!1},e.prototype.addWallet=function(e){kE.openDialog(this.dialog,{create:e})},e.prototype.adminHwWallet=function(){var e=this;JY.openDialog(this.dialog,!1).afterClosed().subscribe(function(){e.walletsAndAddressesService.allWallets.pipe(eS()).subscribe(function(t){0===t.length&&setTimeout(function(){return e.router.navigate(["/wizard"])},500)})})},e.prototype.toggleWallet=function(e){var t=this;if(e.isHardware&&e.hasHwSecurityWarnings&&!e.stopShowingHwSecurityPopup&&!this.walletsOpenedState.get(e.id)){var n={headerText:"hardware-wallet.security-warning.title",text:"hardware-wallet.security-warning.text",checkboxText:"common.generic-confirmation-check",defaultButtons:gO.ContinueCancel,linkText:"hardware-wallet.security-warning.link",linkFunction:this.adminHwWallet.bind(this)};vO.openDialog(this.dialog,n).afterClosed().subscribe(function(n){n&&(e.stopShowingHwSecurityPopup=!0,t.walletsAndAddressesService.informValuesUpdated(e),t.walletsOpenedState.set(e.id,!0))})}else this.walletsOpenedState.set(e.id,!this.walletsOpenedState.get(e.id))},e.busy=!1,e.\u0275fac=function(t){return new(t||e)(ps(gC),ps(Pk),ps(MD),ps(AL),ps(_O))},e.\u0275cmp=ft({type:e,selectors:[["app-wallets"]],decls:30,vars:12,consts:[[3,"headline"],[1,"container"],["class","-table",4,"ngFor","ngForOf"],[1,"action-buttons"],["mat-button","",3,"click"],["src","assets/img/plus-gold.png"],["src","assets/img/load-gold.png"],["mat-button","",3,"click",4,"ngIf"],[1,"-table"],[4,"ngIf"],[1,"-headers"],[1,"-width-250","text-truncate"],[1,"-flex-fill"],[1,"-width-130","text-right"],[1,"-width-85"],["class","e2e-wallets",4,"ngFor","ngForOf"],[1,"e2e-wallets"],[1,"-body"],[1,"-row",3,"click"],[1,"-width-250","text-truncate","e2e-label"],[1,"-flex-fill","-encryption","d-flex"],["src","assets/img/lock-gold.png",3,"matTooltip",4,"ngIf"],["src","assets/img/unlock-grey.png",3,"matTooltip",4,"ngIf"],["src","assets/img/temporal-grey.png",3,"matTooltip",4,"ngIf"],["src","assets/img/alert-red.png",3,"matTooltip",4,"ngIf"],[1,"-width-130","text-right","grey-text"],[1,"-width-85","-expand"],["src","assets/img/chevron-right-grey.png",3,"ngClass"],[3,"wallet",4,"ngIf"],["src","assets/img/lock-gold.png",3,"matTooltip"],["src","assets/img/unlock-grey.png",3,"matTooltip"],["src","assets/img/temporal-grey.png",3,"matTooltip"],["src","assets/img/alert-red.png",3,"matTooltip"],[3,"wallet"],["src","assets/img/hw-gold.png"]],template:function(e,t){1&e&&(vs(0,"div"),ru(1,"\n "),ys(2,"app-header",0),Wl(3,"translate"),ru(4,"\n\n "),vs(5,"div",1),ru(6,"\n "),ru(7,"\n "),hs(8,rP,4,1,"div",2),ru(9,"\n\n "),ru(10,"\n "),vs(11,"div",3),ru(12,"\n "),vs(13,"button",4),xs("click",function(){return t.addWallet(!0)}),ru(14,"\n "),ys(15,"img",5),ru(16),Wl(17,"translate"),_s(),ru(18,"\n "),vs(19,"button",4),xs("click",function(){return t.addWallet(!1)}),ru(20,"\n "),ys(21,"img",6),ru(22),Wl(23,"translate"),_s(),ru(24,"\n "),hs(25,aP,5,3,"button",7),ru(26,"\n "),_s(),ru(27,"\n "),_s(),ru(28,"\n"),_s(),ru(29,"\n")),2&e&&(Ya(2),ms("headline",Vl(3,5,"wallet.title-and-button")),Ya(6),ms("ngForOf",Al(11,oP)),Ya(8),ou(" ",Vl(17,7,"wallet.add-button"),"\n "),Ya(6),ou(" ",Vl(23,9,"wallet.load-button"),"\n "),Ya(3),ms("ngIf",t.hwCompatibilityActivated))},styles:[".-width-85[_ngcontent-%COMP%]{padding-right:20px!important}.-width-250[_ngcontent-%COMP%]{padding-left:20px!important}@media (max-width:991px){.-width-250[_ngcontent-%COMP%]{width:200px;flex-shrink:0}}.-headers[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0}.-body[_ngcontent-%COMP%]{margin-bottom:10px;color:#1e2227;background-color:transparent!important}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]{font-size:13px;line-height:60px;height:60px;background-color:#fafafa;cursor:pointer}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-hours[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);text-align:right}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{text-align:right}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%]{padding-left:20px!important}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{border-radius:50%;background-color:#f7f7f7;display:inline-block;height:38px;padding:3px;width:38px}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px;height:32px;opacity:.7}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]:hover{background-color:#f7f7f7}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]:hover .-expand[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{opacity:1}.-body[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]:hover .-encryption[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{background-color:#f4f4f4}.action-buttons[_ngcontent-%COMP%]{padding:40px 0;text-align:center}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:13px;margin:0 5px;min-width:140px}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:28px;margin-left:-4px;width:28px}.rotate-90[_ngcontent-%COMP%]{transform:rotate(90deg)}.rotate-270[_ngcontent-%COMP%]{transform:rotate(270deg)}"]}),e}(),uP=function(e){return e.Default="default",e.Exchange="exchange",e}({}),lP=function(){function e(e,t){this.apiService=e,this.ngZone=t,this.noConnections=!1,this.updatePeriod=5e3,this.errorUpdatePeriod=5e3,this.connectionsSubject=new Rv([]),this.startDataRefreshSubscription(0)}return e.prototype.connections=function(){return this.connectionsSubject.asObservable()},e.prototype.startDataRefreshSubscription=function(e){var t=this;this.dataRefreshSubscription&&this.dataRefreshSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){t.dataRefreshSubscription=bm(0).pipe(EM(e),ue(function(){return t.trustedAddresses?bm(t.trustedAddresses):t.apiService.get("network/defaultConnections")}),ue(function(e){return t.trustedAddresses=e,t.apiService.get("network/connections")})).subscribe(function(e){if(null===e.connections||0===e.connections.length)return t.noConnections=!0,t.ngZone.run(function(){return t.connectionsSubject.next([])}),void t.startDataRefreshSubscription(t.updatePeriod);t.noConnections=!1;var n=e.connections.map(function(e){return{address:e.address,listenPort:e.listen_port,outgoing:e.outgoing,height:e.height,lastSent:e.last_sent,lastReceived:e.last_received,source:t.trustedAddresses.find(function(t){return t===e.address})?uP.Default:uP.Exchange}}).sort(function(e,t){return e.address.localeCompare(t.address)});t.ngZone.run(function(){return t.connectionsSubject.next(n)}),t.startDataRefreshSubscription(t.updatePeriod)},function(){return t.startDataRefreshSubscription(t.errorUpdatePeriod)})})},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(HS),Bi(Fc))}}),e}(),cP=function(){function e(e,t){this.httpClient=e,this.walletsAndAddressesService=t,this.configSubject=new Rv(null),this.purchaseOrders=new Rv([]),this.purchaseUrl="https://event.skycoin.com/api/",this.getConfig()}return e.prototype.all=function(){return this.purchaseOrders.asObservable()},e.prototype.config=function(){return this.configSubject.asObservable()},e.prototype.getConfig=function(){var e=this;return this.get("config").pipe(K(function(e){return{enabled:!0,sky_btc_exchange_rate:parseFloat(e.sky_btc_exchange_rate)}})).subscribe(function(t){return e.configSubject.next(t)})},e.prototype.generate=function(e){var t=this;return this.walletsAndAddressesService.addAddressesToWallet(e,1).pipe(ue(function(n){return t.post("bind",{skyaddr:n[0].address,coin_type:"BTC"}).pipe(K(function(t){return{coin_type:t.coin_type,deposit_address:t.deposit_address,filename:e.id,recipient_address:n[0].address,status:"waiting_deposit"}}))}))},e.prototype.scan=function(e){return this.get("status?skyaddr="+e).pipe(K(function(e){if(!e.statuses||e.statuses.length>1)throw new Error("too many purchase orders found");return e.statuses[0]}))},e.prototype.get=function(e){return this.httpClient.get(this.purchaseUrl+e)},e.prototype.post=function(e,t){return void 0===t&&(t={}),this.httpClient.post(this.purchaseUrl+e,t)},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(MS),Bi(AL))}}),e}(),dP=function(){function e(e,t){this.http=e,this.ngZone=t,this.PRICE_API_ID=jM.priceApiId,this.priceInternal=new Rv(null),this.updatePeriod=6e5,this.errorUpdatePeriod=3e4,this.startDataRefreshSubscription(0)}return Object.defineProperty(e.prototype,"price",{get:function(){return this.priceInternal.asObservable()},enumerable:!1,configurable:!0}),e.prototype.startDataRefreshSubscription=function(e){var t=this;this.PRICE_API_ID&&(this.priceSubscription&&this.priceSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){t.priceSubscription=bm(0).pipe(EM(e),ue(function(){return t.http.get("https://api.coinpaprika.com/v1/tickers/"+t.PRICE_API_ID+"?quotes=USD")})).subscribe(function(e){t.ngZone.run(function(){return t.priceInternal.next(e.quotes.USD.price)}),t.startDataRefreshSubscription(t.updatePeriod)},function(){t.startDataRefreshSubscription(t.errorUpdatePeriod)})}))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(MS),Bi(Fc))}}),e}(),hP=["mat-menu-item",""];function fP(e,t){1&e&&(An(),vs(0,"svg",2),ys(1,"polygon",3),_s())}var pP=["*"];function mP(e,t){if(1&e){var n=Ms();ru(0,"\n "),vs(1,"div",0),xs("keydown",function(e){return on(n),Ys()._handleKeydown(e)})("click",function(){return on(n),Ys().closed.emit("click")})("@transformMenu.start",function(e){return on(n),Ys()._onAnimationStart(e)})("@transformMenu.done",function(e){return on(n),Ys()._onAnimationDone(e)}),ru(2,"\n "),vs(3,"div",1),ru(4,"\n "),Is(5),ru(6,"\n "),_s(),ru(7,"\n "),_s(),ru(8,"\n")}if(2&e){var i=Ys();Ya(1),ms("id",i.panelId)("ngClass",i._classList)("@transformMenu",i._panelAnimationState),ls("aria-label",i.ariaLabel||null)("aria-labelledby",i.ariaLabelledby||null)("aria-describedby",i.ariaDescribedby||null)}}var gP={transformMenu:F_("transformMenu",[B_("void",N_({opacity:0,transform:"scale(0.8)"})),V_("void => enter",H_("120ms cubic-bezier(0, 0, 0.2, 1)",N_({opacity:1,transform:"scale(1)"}))),V_("* => void",H_("100ms 25ms linear",N_({opacity:0})))]),fadeInItems:F_("fadeInItems",[B_("showing",N_({opacity:1})),V_("void => *",[N_({opacity:0}),H_("400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)")])])},vP=new Mi("MatMenuContent"),_P=new Mi("MAT_MENU_PANEL"),yP=Ww(Nw(function(){return function e(){s(this,e)}}())),bP=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o){var u;return s(this,n),(u=t.call(this))._elementRef=e,u._focusMonitor=r,u._parentMenu=a,u._changeDetectorRef=o,u.role="menuitem",u._hovered=new z,u._focused=new z,u._highlighted=!1,u._triggersSubmenu=!1,a&&a.addItem&&a.addItem(h(u)),u}return o(n,[{key:"focus",value:function(e,t){this._focusMonitor&&e?this._focusMonitor.focusVia(this._getHostElement(),e,t):this._getHostElement().focus(t),this._focused.next(this)}},{key:"ngAfterViewInit",value:function(){this._focusMonitor&&this._focusMonitor.monitor(this._elementRef,!1)}},{key:"ngOnDestroy",value:function(){this._focusMonitor&&this._focusMonitor.stopMonitoring(this._elementRef),this._parentMenu&&this._parentMenu.removeItem&&this._parentMenu.removeItem(this),this._hovered.complete(),this._focused.complete()}},{key:"_getTabIndex",value:function(){return this.disabled?"-1":"0"}},{key:"_getHostElement",value:function(){return this._elementRef.nativeElement}},{key:"_checkDisabled",value:function(e){this.disabled&&(e.preventDefault(),e.stopPropagation())}},{key:"_handleMouseEnter",value:function(){this._hovered.next(this)}},{key:"getLabel",value:function(){for(var e,t,n=this._elementRef.nativeElement.cloneNode(!0),i=n.querySelectorAll("mat-icon, .material-icons"),r=0;r0&&void 0!==arguments[0]?arguments[0]:"program";this.lazyContent?this._ngZone.onStable.pipe(zg(1)).subscribe(function(){return e._focusFirstItem(t)}):this._focusFirstItem(t)}},{key:"_focusFirstItem",value:function(e){var t=this._keyManager;if(t.setFocusOrigin(e).setFirstItemActive(),!t.activeItem&&this._directDescendantItems.length)for(var n=this._directDescendantItems.first._getHostElement().parentElement;n;){if("menu"===n.getAttribute("role")){n.focus();break}n=n.parentElement}}},{key:"resetActiveItem",value:function(){this._keyManager.setActiveItem(-1)}},{key:"setElevation",value:function(e){var t=this,n=Math.min(this._baseElevation+e,24),i="".concat(this._elevationPrefix).concat(n),r=Object.keys(this._classList).find(function(e){return e.startsWith(t._elevationPrefix)});r&&r!==this._previousElevation||(this._previousElevation&&(this._classList[this._previousElevation]=!1),this._classList[i]=!0,this._previousElevation=i)}},{key:"setPositionClasses",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.xPosition,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.yPosition,n=this._classList;n["mat-menu-before"]="before"===e,n["mat-menu-after"]="after"===e,n["mat-menu-above"]="above"===t,n["mat-menu-below"]="below"===t}},{key:"_startAnimation",value:function(){this._panelAnimationState="enter"}},{key:"_resetAnimation",value:function(){this._panelAnimationState="void"}},{key:"_onAnimationDone",value:function(e){this._animationDone.next(e),this._isAnimating=!1}},{key:"_onAnimationStart",value:function(e){this._isAnimating=!0,"enter"===e.toState&&0===this._keyManager.activeItemIndex&&(e.element.scrollTop=0)}},{key:"_updateDirectDescendants",value:function(){var e=this;this._allItems.changes.pipe(Qm(this._allItems)).subscribe(function(t){e._directDescendantItems.reset(t.filter(function(t){return t._parentMenu===e})),e._directDescendantItems.notifyOnChanges()})}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(Fc),ps(wP))},e.\u0275dir=bt({type:e,contentQueries:function(e,t,n){var i;1&e&&(cc(n,vP,5),cc(n,bP,5),cc(n,bP,4)),2&e&&(uc(i=dc())&&(t.lazyContent=i.first),uc(i=dc())&&(t._allItems=i),uc(i=dc())&&(t.items=i))},viewQuery:function(e,t){var n;1&e&&lc(pl,5),2&e&&uc(n=dc())&&(t.templateRef=n.first)},inputs:{backdropClass:"backdropClass",xPosition:"xPosition",yPosition:"yPosition",overlapTrigger:"overlapTrigger",hasBackdrop:"hasBackdrop",panelClass:["class","panelClass"],classList:"classList",ariaLabel:["aria-label","ariaLabel"],ariaLabelledby:["aria-labelledby","ariaLabelledby"],ariaDescribedby:["aria-describedby","ariaDescribedby"]},outputs:{closed:"closed",close:"close"}}),e}(),SP=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r){var a;return s(this,n),(a=t.call(this,e,i,r))._elevationPrefix="mat-elevation-z",a._baseElevation=4,a}return n}(MP);return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(Fc),ps(wP))},e.\u0275cmp=ft({type:e,selectors:[["mat-menu"]],hostVars:3,hostBindings:function(e,t){2&e&&ls("aria-label",null)("aria-labelledby",null)("aria-describedby",null)},exportAs:["matMenu"],features:[Du([{provide:_P,useExisting:e}]),Ko],ngContentSelectors:pP,decls:2,vars:0,consts:[["tabindex","-1","role","menu",1,"mat-menu-panel",3,"id","ngClass","keydown","click"],[1,"mat-menu-content"]],template:function(e,t){1&e&&(As(),hs(0,mP,9,6,"ng-template"),ru(1,"\n"))},directives:[ah],styles:["mat-menu{display:none}.mat-menu-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh - 48px);border-radius:4px;outline:0;min-height:64px}.mat-menu-panel.ng-animating{pointer-events:none}.cdk-high-contrast-active .mat-menu-panel{outline:solid 1px}.mat-menu-content:not(:empty){padding-top:8px;padding-bottom:8px}.mat-menu-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;max-width:100%;position:relative}.mat-menu-item::-moz-focus-inner{border:0}.mat-menu-item[disabled]{cursor:default}[dir=rtl] .mat-menu-item{text-align:right}.mat-menu-item .mat-icon{margin-right:16px;vertical-align:middle}.mat-menu-item .mat-icon svg{vertical-align:top}[dir=rtl] .mat-menu-item .mat-icon{margin-left:16px;margin-right:0}.mat-menu-item[disabled]{pointer-events:none}.cdk-high-contrast-active .mat-menu-item{margin-top:1px}.cdk-high-contrast-active .mat-menu-item.cdk-program-focused,.cdk-high-contrast-active .mat-menu-item.cdk-keyboard-focused,.cdk-high-contrast-active .mat-menu-item-highlighted{outline:dotted 1px}.mat-menu-item-submenu-trigger{padding-right:32px}[dir=rtl] .mat-menu-item-submenu-trigger{padding-right:16px;padding-left:32px}.mat-menu-submenu-icon{position:absolute;top:50%;right:16px;transform:translateY(-50%);width:5px;height:10px;fill:currentColor}[dir=rtl] .mat-menu-submenu-icon{right:auto;left:16px;transform:translateY(-50%) scaleX(-1)}.cdk-high-contrast-active .mat-menu-submenu-icon{fill:CanvasText}button.mat-menu-item{width:100%}.mat-menu-item .mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}\n"],encapsulation:2,data:{animation:[gP.transformMenu,gP.fadeInItems]},changeDetection:0}),e}(),CP=new Mi("mat-menu-scroll-strategy"),LP={provide:CP,deps:[Dv],useFactory:function(e){return function(){return e.scrollStrategies.reposition()}}},xP=Mg({passive:!0}),TP=function(){var e=function(){function e(t,n,i,r,a,o,u,l){var c=this;s(this,e),this._overlay=t,this._element=n,this._viewContainerRef=i,this._menuItemInstance=o,this._dir=u,this._focusMonitor=l,this._overlayRef=null,this._menuOpen=!1,this._closingActionsSubscription=x.EMPTY,this._hoverSubscription=x.EMPTY,this._menuCloseSubscription=x.EMPTY,this._handleTouchStart=function(e){v_(e)||(c._openedBy="touch")},this._openedBy=void 0,this.restoreFocus=!0,this.menuOpened=new Zl,this.onMenuOpen=this.menuOpened,this.menuClosed=new Zl,this.onMenuClose=this.menuClosed,this._scrollStrategy=r,this._parentMaterialMenu=a instanceof MP?a:void 0,n.nativeElement.addEventListener("touchstart",this._handleTouchStart,xP),o&&(o._triggersSubmenu=this.triggersSubmenu())}return o(e,[{key:"_deprecatedMatMenuTriggerFor",get:function(){return this.menu},set:function(e){this.menu=e}},{key:"menu",get:function(){return this._menu},set:function(e){var t=this;e!==this._menu&&(this._menu=e,this._menuCloseSubscription.unsubscribe(),e&&(this._menuCloseSubscription=e.close.subscribe(function(e){t._destroyMenu(e),"click"!==e&&"tab"!==e||!t._parentMaterialMenu||t._parentMaterialMenu.closed.emit(e)})))}},{key:"ngAfterContentInit",value:function(){this._checkMenu(),this._handleHover()}},{key:"ngOnDestroy",value:function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._element.nativeElement.removeEventListener("touchstart",this._handleTouchStart,xP),this._menuCloseSubscription.unsubscribe(),this._closingActionsSubscription.unsubscribe(),this._hoverSubscription.unsubscribe()}},{key:"menuOpen",get:function(){return this._menuOpen}},{key:"dir",get:function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"}},{key:"triggersSubmenu",value:function(){return!(!this._menuItemInstance||!this._parentMaterialMenu)}},{key:"toggleMenu",value:function(){return this._menuOpen?this.closeMenu():this.openMenu()}},{key:"openMenu",value:function(){var e=this;if(!this._menuOpen){this._checkMenu();var t=this._createOverlay(),n=t.getConfig();this._setPosition(n.positionStrategy),n.hasBackdrop=null==this.menu.hasBackdrop?!this.triggersSubmenu():this.menu.hasBackdrop,t.attach(this._getPortal()),this.menu.lazyContent&&this.menu.lazyContent.attach(this.menuData),this._closingActionsSubscription=this._menuClosingActions().subscribe(function(){return e.closeMenu()}),this._initMenu(),this.menu instanceof MP&&this.menu._startAnimation()}}},{key:"closeMenu",value:function(){this.menu.close.emit()}},{key:"focus",value:function(e,t){this._focusMonitor&&e?this._focusMonitor.focusVia(this._element,e,t):this._element.nativeElement.focus(t)}},{key:"updatePosition",value:function(){var e;null===(e=this._overlayRef)||void 0===e||e.updatePosition()}},{key:"_destroyMenu",value:function(e){var t=this;if(this._overlayRef&&this.menuOpen){var n=this.menu;this._closingActionsSubscription.unsubscribe(),this._overlayRef.detach(),!this.restoreFocus||"keydown"!==e&&this._openedBy&&this.triggersSubmenu()||this.focus(this._openedBy),this._openedBy=void 0,n instanceof MP?(n._resetAnimation(),n.lazyContent?n._animationDone.pipe(zm(function(e){return"void"===e.toState}),zg(1),Km(n.lazyContent._attached)).subscribe({next:function(){return n.lazyContent.detach()},complete:function(){return t._setIsMenuOpen(!1)}}):this._setIsMenuOpen(!1)):(this._setIsMenuOpen(!1),n.lazyContent&&n.lazyContent.detach())}}},{key:"_initMenu",value:function(){this.menu.parentMenu=this.triggersSubmenu()?this._parentMaterialMenu:void 0,this.menu.direction=this.dir,this._setMenuElevation(),this.menu.focusFirstItem(this._openedBy||"program"),this._setIsMenuOpen(!0)}},{key:"_setMenuElevation",value:function(){if(this.menu.setElevation){for(var e=0,t=this.menu.parentMenu;t;)e++,t=t.parentMenu;this.menu.setElevation(e)}}},{key:"_setIsMenuOpen",value:function(e){this._menuOpen=e,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this.triggersSubmenu()&&this._menuItemInstance._setHighlighted(e)}},{key:"_checkMenu",value:function(){}},{key:"_createOverlay",value:function(){if(!this._overlayRef){var e=this._getOverlayConfig();this._subscribeToPositions(e.positionStrategy),this._overlayRef=this._overlay.create(e),this._overlayRef.keydownEvents().subscribe()}return this._overlayRef}},{key:"_getOverlayConfig",value:function(){return new uv({positionStrategy:this._overlay.position().flexibleConnectedTo(this._element).withLockedPosition().withGrowAfterOpen().withTransformOriginOn(".mat-menu-panel, .mat-mdc-menu-panel"),backdropClass:this.menu.backdropClass||"cdk-overlay-transparent-backdrop",panelClass:this.menu.overlayPanelClass,scrollStrategy:this._scrollStrategy(),direction:this._dir})}},{key:"_subscribeToPositions",value:function(e){var t=this;this.menu.setPositionClasses&&e.positionChanges.subscribe(function(e){t.menu.setPositionClasses("start"===e.connectionPair.overlayX?"after":"before","top"===e.connectionPair.overlayY?"below":"above")})}},{key:"_setPosition",value:function(e){var t=_("before"===this.menu.xPosition?["end","start"]:["start","end"],2),n=t[0],i=t[1],r=_("above"===this.menu.yPosition?["bottom","top"]:["top","bottom"],2),a=r[0],o=r[1],s=a,u=o,l=n,c=i,d=0;this.triggersSubmenu()?(c=n="before"===this.menu.xPosition?"start":"end",i=l="end"===n?"start":"end",d="bottom"===a?8:-8):this.menu.overlapTrigger||(s="top"===a?"bottom":"top",u="top"===o?"bottom":"top"),e.withPositions([{originX:n,originY:s,overlayX:l,overlayY:a,offsetY:d},{originX:i,originY:s,overlayX:c,overlayY:a,offsetY:d},{originX:n,originY:u,overlayX:l,overlayY:o,offsetY:-d},{originX:i,originY:u,overlayX:c,overlayY:o,offsetY:-d}])}},{key:"_menuClosingActions",value:function(){var e=this,t=this._overlayRef.backdropClick(),n=this._overlayRef.detachments();return pe(t,this._parentMaterialMenu?this._parentMaterialMenu.closed:bm(),this._parentMaterialMenu?this._parentMaterialMenu._hovered().pipe(zm(function(t){return t!==e._menuItemInstance}),zm(function(){return e._menuOpen})):bm(),n)}},{key:"_handleMousedown",value:function(e){g_(e)||(this._openedBy=0===e.button?"mouse":void 0,this.triggersSubmenu()&&e.preventDefault())}},{key:"_handleKeydown",value:function(e){var t=e.keyCode;13!==t&&32!==t||(this._openedBy="keyboard"),this.triggersSubmenu()&&(39===t&&"ltr"===this.dir||37===t&&"rtl"===this.dir)&&(this._openedBy="keyboard",this.openMenu())}},{key:"_handleClick",value:function(e){this.triggersSubmenu()?(e.stopPropagation(),this.openMenu()):this.toggleMenu()}},{key:"_handleHover",value:function(){var e=this;this.triggersSubmenu()&&this._parentMaterialMenu&&(this._hoverSubscription=this._parentMaterialMenu._hovered().pipe(zm(function(t){return t===e._menuItemInstance&&!t.disabled}),EM(0,Pm)).subscribe(function(){e._openedBy="mouse",e.menu instanceof MP&&e.menu._isAnimating?e.menu._animationDone.pipe(zg(1),EM(0,Pm),Km(e._parentMaterialMenu._hovered())).subscribe(function(){return e.openMenu()}):e.openMenu()}))}},{key:"_getPortal",value:function(){return this._portal&&this._portal.templateRef===this.menu.templateRef||(this._portal=new Hg(this.menu.templateRef,this._viewContainerRef)),this._portal}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(Dv),ps(Fu),ps(bl),ps(CP),ps(_P,8),ps(bP,10),ps(Dg,8),ps(x_))},e.\u0275dir=bt({type:e,selectors:[["","mat-menu-trigger-for",""],["","matMenuTriggerFor",""]],hostAttrs:["aria-haspopup","true",1,"mat-menu-trigger"],hostVars:2,hostBindings:function(e,t){1&e&&xs("mousedown",function(e){return t._handleMousedown(e)})("keydown",function(e){return t._handleKeydown(e)})("click",function(e){return t._handleClick(e)}),2&e&&ls("aria-expanded",t.menuOpen||null)("aria-controls",t.menuOpen?t.menu.panelId:null)},inputs:{restoreFocus:["matMenuTriggerRestoreFocus","restoreFocus"],_deprecatedMatMenuTriggerFor:["mat-menu-trigger-for","_deprecatedMatMenuTriggerFor"],menu:["matMenuTriggerFor","menu"],menuData:["matMenuTriggerData","menuData"]},outputs:{menuOpened:"menuOpened",onMenuOpen:"onMenuOpen",menuClosed:"menuClosed",onMenuClose:"onMenuClose"},exportAs:["matMenuTrigger"]}),e}(),DP=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[LP],imports:[jw]}),e}(),OP=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[LP],imports:[[Th,jw,ik,Iv,DP],Ag,jw,DP]}),e}();function EP(e,t){if(1&e){var n=Ms();vs(0,"button",11),xs("click",function(){return on(n),Ys().changelanguage()}),ru(1,"\n "),ys(2,"img",12),ru(3),_s()}if(2&e){var i=Ys();Ya(2),ms("src","assets/img/lang/"+i.language.iconName,Pr),Ya(1),ou("\n ",i.language.name,"\n ")}}function YP(e,t){if(1&e&&(vs(0,"button",13),ru(1),_s()),2&e){var n=Ys();ms("disabled",!0),Ya(1),ou(" v",n.appService.nodeVersion," ")}}var PP=function(){return["/settings/network"]},AP=function(){return["/settings/blockchain"]},IP=function(){return["/settings/outputs"]},RP=function(){return["/settings/pending-transactions"]},FP=function(){return["/settings/backup"]},HP=function(e){return{coinName:e}},jP=function(){function e(e,t,n){this.appService=e,this.languageService=t,this.dialog=n}return e.prototype.ngOnInit=function(){var e=this;this.subscription=this.languageService.currentLanguage.subscribe(function(t){return e.language=t})},e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},e.prototype.changelanguage=function(){SL.openDialog(this.dialog)},e.\u0275fac=function(t){return new(t||e)(ps(jS),ps(kL),ps(Pk))},e.\u0275cmp=ft({type:e,selectors:[["app-top-bar"]],inputs:{headline:"headline"},decls:50,vars:37,consts:[[1,"buttons-left"],[1,"title"],[1,"buttons-right"],[3,"overlapTrigger"],["menuMenu","matMenu"],["mat-menu-item","",3,"routerLink"],["mat-menu-item","","target","_blank","rel","noreferrer nofollow noopener",1,"color-primary",3,"href"],[1,"separator"],["mat-menu-item","",3,"click",4,"ngIf"],["mat-menu-item","",3,"disabled",4,"ngIf"],["mat-icon-button","",1,"button",3,"matMenuTriggerFor"],["mat-menu-item","",3,"click"],[1,"flag",3,"src"],["mat-menu-item","",3,"disabled"]],template:function(e,t){if(1&e&&(ys(0,"div",0),ru(1,"\n"),vs(2,"div",1),ru(3),_s(),ru(4,"\n"),vs(5,"div",2),ru(6,"\n "),vs(7,"mat-menu",3,4),ru(9,"\n "),vs(10,"button",5),ru(11),Wl(12,"translate"),_s(),ru(13,"\n "),vs(14,"button",5),ru(15),Wl(16,"translate"),_s(),ru(17,"\n "),vs(18,"button",5),ru(19),Wl(20,"translate"),_s(),ru(21,"\n "),vs(22,"button",5),ru(23),Wl(24,"translate"),_s(),ru(25,"\n "),vs(26,"button",5),ru(27),Wl(28,"translate"),_s(),ru(29,"\n "),vs(30,"a",6),ru(31),Wl(32,"translate"),_s(),ru(33,"\n "),ys(34,"div",7),ru(35,"\n "),hs(36,EP,4,2,"button",8),ru(37,"\n "),ys(38,"div",7),ru(39,"\n "),hs(40,YP,2,2,"button",9),ru(41,"\n "),_s(),ru(42,"\n "),vs(43,"button",10),ru(44,"\n "),vs(45,"mat-icon"),ru(46,"menu"),_s(),ru(47,"\n "),_s(),ru(48,"\n"),_s(),ru(49,"\n")),2&e){var n=fs(8);Ya(3),ou("\n ",t.headline,"\n"),Ya(4),ms("overlapTrigger",!1),Ya(3),ms("routerLink",Al(30,PP)),Ya(1),au(Vl(12,17,"network.title")),Ya(3),ms("routerLink",Al(31,AP)),Ya(1),au(Vl(16,19,"blockchain.title")),Ya(3),ms("routerLink",Al(32,IP)),Ya(1),au(Vl(20,21,"outputs.title")),Ya(3),ms("routerLink",Al(33,RP)),Ya(1),au(Vl(24,23,"pending-txs.title")),Ya(3),ms("routerLink",Al(34,FP)),Ya(1),au(Vl(28,25,"backup.title")),Ya(3),ms("href",t.appService.explorerUrl,Pr),Ya(1),au(Ul(32,27,"header.explorer-link",Il(35,HP,t.appService.fullCoinName))),Ya(5),ms("ngIf",t.language),Ya(4),ms("ngIf",t.appService.nodeVersion),Ya(3),ms("matMenuTriggerFor",n)}},directives:[SP,bP,LD,lh,SC,TP,WC],pipes:[hM],styles:["[_nghost-%COMP%]{display:flex;color:#fff;width:100%}.buttons-left[_ngcontent-%COMP%]{padding:0 10px;width:120px}.title[_ngcontent-%COMP%]{font-size:13px;font-weight:700;flex:1 1 auto;letter-spacing:1px;line-height:50px;text-align:center}.buttons-right[_ngcontent-%COMP%]{text-align:right;width:120px}.buttons-right[_ngcontent-%COMP%] .button[_ngcontent-%COMP%]{height:50px;width:50px}.mat-menu-item[_ngcontent-%COMP%]{height:50px;line-height:50px;font-size:14px}.color-primary[_ngcontent-%COMP%]{color:#0072ff}.separator[_ngcontent-%COMP%]{width:100%;height:2px;background-color:rgba(30,34,39,.05);margin:8px 0}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:3px}"]}),e}(),NP=function(e){return e.RightButton="RightButton",e.LeftButton="LeftButton",e}({}),BP=function(){function e(){this.className="",this.changeActiveButtonManually=!1,this.onStateChange=new Zl,this.ButtonStates=NP}return e.prototype.ngOnDestroy=function(){this.onStateChange.complete()},e.prototype.onRightButtonClicked=function(){this.activeButton===NP.LeftButton&&(this.changeActiveButtonManually||(this.activeButton=NP.RightButton),this.onStateChange.emit(NP.RightButton))},e.prototype.onLeftButtonClicked=function(){this.activeButton===NP.RightButton&&(this.changeActiveButtonManually||(this.activeButton=NP.LeftButton),this.onStateChange.emit(NP.LeftButton))},e.\u0275fac=function(t){return new(t||e)},e.\u0275cmp=ft({type:e,selectors:[["app-double-button"]],inputs:{rightButtonText:"rightButtonText",leftButtonText:"leftButtonText",activeButton:"activeButton",className:"className",changeActiveButtonManually:"changeActiveButtonManually"},outputs:{onStateChange:"onStateChange"},decls:9,vars:9,consts:[[1,"-toggle","-small-button",3,"disabled","forceEmitEvents","action"]],template:function(e,t){1&e&&(vs(0,"div"),ru(1,"\n "),vs(2,"app-button",0),xs("action",function(){return t.onLeftButtonClicked()}),ru(3),_s(),ru(4,"\n "),vs(5,"app-button",0),xs("action",function(){return t.onRightButtonClicked()}),ru(6),_s(),ru(7,"\n"),_s(),ru(8,"\n")),2&e&&(cu("-buttons-container ",t.className,""),Ya(2),ms("disabled",t.activeButton!==t.ButtonStates.LeftButton)("forceEmitEvents",!0),Ya(1),au(t.leftButtonText),Ya(2),ms("disabled",t.activeButton!==t.ButtonStates.RightButton)("forceEmitEvents",!0),Ya(1),au(t.rightButtonText))},directives:[ZC],styles:[".-small-button[_ngcontent-%COMP%] button{width:unset;height:unset;padding:0 10px;min-width:100px;margin:unset;box-shadow:unset;background-color:transparent!important;line-height:1!important;min-height:26px}.-small-button[_ngcontent-%COMP%] button span{color:#1e2227;line-height:unset!important}.-small-button[_ngcontent-%COMP%] button .content-container .content{font-size:13px}.-small-button[_ngcontent-%COMP%] button.enabled{background-color:#1e2227!important}.-small-button[_ngcontent-%COMP%] button.enabled span{color:#fafafa}.-buttons-container[_ngcontent-%COMP%]{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:5px;background:hsla(0,0%,100%,.1);border-radius:100px;margin:0 auto;font-size:1px}.light.-buttons-container[_ngcontent-%COMP%]{background:rgba(30,34,39,.065)}.light[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button.enabled{background-color:#fafafa!important}.light[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button.enabled span{color:#1e2227}@media (max-width:991px){.-buttons-container.navbar.light[_ngcontent-%COMP%]{border-radius:20px}.-buttons-container.navbar.light[_ngcontent-%COMP%] app-button[_ngcontent-%COMP%] .internal-container{display:block}}.small.-buttons-container[_ngcontent-%COMP%]{padding:2px}.small[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button{min-width:70px;min-height:16px}.small[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button .content-container .content{font-size:9px}"]}),e}(),WP=function(){function e(){this.switchVisibleInternal=!1,this.activeComponentInternal=new Rv(NP.LeftButton),this.switchDiabledInternal=!1}return Object.defineProperty(e.prototype,"switchVisible",{get:function(){return this.switchVisibleInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"activeComponent",{get:function(){return this.activeComponentInternal.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"leftText",{get:function(){return this.leftTextInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"rightText",{get:function(){return this.rightTextInternal},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"switchDiabled",{get:function(){return this.switchDiabledInternal},enumerable:!1,configurable:!0}),e.prototype.setActiveComponent=function(e){this.activeComponentInternal.next(e)},e.prototype.showSwitch=function(e,t,n){void 0===n&&(n=NP.LeftButton),this.setActiveComponent(n),this.switchDiabledInternal=!1,this.switchVisibleInternal=!0,this.leftTextInternal=e,this.rightTextInternal=t},e.prototype.hideSwitch=function(){this.switchVisibleInternal=!1},e.prototype.enableSwitch=function(){this.switchDiabledInternal=!1},e.prototype.disableSwitch=function(){this.switchDiabledInternal=!0},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)}}),e}();function VP(e,t){1&e&&(vs(0,"a",11),ru(1,"\n "),ys(2,"img",12),ru(3,"\n "),vs(4,"span"),ru(5),Wl(6,"translate"),_s(),ru(7,"\n "),_s()),2&e&&(Ya(5),au(Vl(6,1,"buy.title-and-button")))}var UP=function(e){return{"-switch":!0,"element-disabled":e}};function zP(e,t){if(1&e){var n=Ms();vs(0,"app-double-button",13),xs("onStateChange",function(e){return on(n),Ys().changeActiveComponent(e)}),Wl(1,"translate"),Wl(2,"translate"),Wl(3,"async"),_s()}if(2&e){var i=Ys();ms("ngClass",Il(10,UP,i.navBarSwitchService.switchDiabled))("leftButtonText",Vl(1,4,i.navBarSwitchService.leftText))("rightButtonText",Vl(2,6,i.navBarSwitchService.rightText))("activeButton",Vl(3,8,i.navBarSwitchService.activeComponent))}}var qP=function(){function e(e,t){this.appService=e,this.navBarSwitchService=t,this.otcEnabled=jM.otcEnabled,this.exchangeEnabled=!0}return e.prototype.changeActiveComponent=function(e){this.navBarSwitchService.setActiveComponent(e)},e.\u0275fac=function(t){return new(t||e)(ps(jS),ps(WP))},e.\u0275cmp=ft({type:e,selectors:[["app-nav-bar"]],decls:40,vars:11,consts:[[1,"container"],[1,"-buttons"],["routerLink","/wallets","routerLinkActive","full-opacity",1,"-button"],["src","assets/img/wallet-black.png"],["routerLink","/send","routerLinkActive","full-opacity",1,"-button"],["src","assets/img/send-black.png"],["routerLink","/transactions","routerLinkActive","full-opacity",1,"-button"],["src","assets/img/transactions-black.png"],[1,"flex-fill"],["class","-button",4,"ngIf"],["className","light navbar",3,"ngClass","leftButtonText","rightButtonText","activeButton","onStateChange",4,"ngIf"],[1,"-button"],["src","assets/img/money-gold.png"],["className","light navbar",3,"ngClass","leftButtonText","rightButtonText","activeButton","onStateChange"]],template:function(e,t){1&e&&(vs(0,"div",0),ru(1,"\n "),vs(2,"div",1),ru(3,"\n "),vs(4,"a",2),ru(5,"\n "),ys(6,"img",3),ru(7,"\n "),vs(8,"span"),ru(9),Wl(10,"translate"),_s(),ru(11,"\n "),_s(),ru(12,"\n "),vs(13,"a",4),ru(14,"\n "),ys(15,"img",5),ru(16,"\n "),vs(17,"span"),ru(18),Wl(19,"translate"),_s(),ru(20,"\n "),_s(),ru(21,"\n "),vs(22,"a",6),ru(23,"\n "),ys(24,"img",7),ru(25,"\n "),vs(26,"span"),ru(27),Wl(28,"translate"),_s(),ru(29,"\n "),_s(),ru(30,"\n "),ys(31,"div",8),ru(32,"\n "),ru(33,"\n "),hs(34,VP,8,3,"a",9),ru(35,"\n "),hs(36,zP,4,12,"app-double-button",10),ru(37,"\n "),_s(),ru(38,"\n"),_s(),ru(39,"\n")),2&e&&(Ya(9),au(Vl(10,5,"wallet.title-and-button")),Ya(9),au(Vl(19,7,"send.title-and-button")),Ya(9),au(Vl(28,9,"history.title-and-button")),Ya(7),ms("ngIf",t.otcEnabled),Ya(2),ms("ngIf",t.navBarSwitchService.switchVisible))},directives:[xD,DD,lh,BP,ah],pipes:[hM,kh],styles:[".-buttons[_ngcontent-%COMP%]{display:flex;width:100%}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{cursor:pointer;padding:0 20px;opacity:.2;display:block;text-decoration:none;color:#1e2227;display:flex;height:66px;align-items:center}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:hover{opacity:.4}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:active{opacity:.55}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{float:left;height:32px;width:32px}@media (max-width:991px){.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:27.2px;width:27.2px}}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:14px;line-height:1.3;margin:0 5px}@media (max-width:991px){.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:11.9px}}.-buttons[_ngcontent-%COMP%] .-switch[_ngcontent-%COMP%]{align-self:center;padding:0 20px}.full-opacity[_ngcontent-%COMP%]{opacity:1!important}"]}),e}(),GP=["primaryValueBar"],KP=Bw(function(){return function e(t){s(this,e),this._elementRef=t}}(),"primary"),JP=new Mi("mat-progress-bar-location",{providedIn:"root",factory:function(){var e=Wi(yd),t=e?e.location:null;return{getPathname:function(){return t?t.pathname+t.search:""}}}}),ZP=0,$P=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a){var o;s(this,n),(o=t.call(this,e))._ngZone=i,o._animationMode=r,o._isNoopAnimation=!1,o._value=0,o._bufferValue=0,o.animationEnd=new Zl,o._animationEndSubscription=x.EMPTY,o.mode="determinate",o.progressbarId="mat-progress-bar-".concat(ZP++);var u=a?a.getPathname().split("#")[0]:"";return o._rectangleFillValue="url('".concat(u,"#").concat(o.progressbarId,"')"),o._isNoopAnimation="NoopAnimations"===r,o}return o(n,[{key:"value",get:function(){return this._value},set:function(e){this._value=XP(mm(e)||0)}},{key:"bufferValue",get:function(){return this._bufferValue},set:function(e){this._bufferValue=XP(e||0)}},{key:"_primaryTransform",value:function(){return{transform:"scale3d(".concat(this.value/100,", 1, 1)")}}},{key:"_bufferTransform",value:function(){return"buffer"===this.mode?{transform:"scale3d(".concat(this.bufferValue/100,", 1, 1)")}:null}},{key:"ngAfterViewInit",value:function(){var e=this;this._ngZone.runOutsideAngular(function(){var t=e._primaryValueBar.nativeElement;e._animationEndSubscription=wm(t,"transitionend").pipe(zm(function(e){return e.target===t})).subscribe(function(){"determinate"!==e.mode&&"buffer"!==e.mode||e._ngZone.run(function(){return e.animationEnd.next({value:e.value})})})})}},{key:"ngOnDestroy",value:function(){this._animationEndSubscription.unsubscribe()}}]),n}(KP);return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(Fc),ps(Tw,8),ps(JP,8))},e.\u0275cmp=ft({type:e,selectors:[["mat-progress-bar"]],viewQuery:function(e,t){var n;1&e&&lc(GP,5),2&e&&uc(n=dc())&&(t._primaryValueBar=n.first)},hostAttrs:["role","progressbar","aria-valuemin","0","aria-valuemax","100","tabindex","-1",1,"mat-progress-bar"],hostVars:4,hostBindings:function(e,t){2&e&&(ls("aria-valuenow","indeterminate"===t.mode||"query"===t.mode?null:t.value)("mode",t.mode),qs("_mat-animation-noopable",t._isNoopAnimation))},inputs:{color:"color",mode:"mode",value:"value",bufferValue:"bufferValue"},outputs:{animationEnd:"animationEnd"},exportAs:["matProgressBar"],features:[Ko],decls:25,vars:4,consts:[["aria-hidden","true"],["width","100%","height","4","focusable","false",1,"mat-progress-bar-background","mat-progress-bar-element"],["x","4","y","0","width","8","height","4","patternUnits","userSpaceOnUse",3,"id"],["cx","2","cy","2","r","2"],["width","100%","height","100%"],[1,"mat-progress-bar-buffer","mat-progress-bar-element",3,"ngStyle"],[1,"mat-progress-bar-primary","mat-progress-bar-fill","mat-progress-bar-element",3,"ngStyle"],["primaryValueBar",""],[1,"mat-progress-bar-secondary","mat-progress-bar-fill","mat-progress-bar-element"]],template:function(e,t){1&e&&(ru(0,"\n"),vs(1,"div",0),ru(2,"\n "),An(),vs(3,"svg",1),ru(4,"\n "),vs(5,"defs"),ru(6,"\n "),vs(7,"pattern",2),ru(8,"\n "),ys(9,"circle",3),ru(10,"\n "),_s(),ru(11,"\n "),_s(),ru(12,"\n "),ys(13,"rect",4),ru(14,"\n "),_s(),ru(15,"\n "),ru(16,"\n "),In(),ys(17,"div",5),ru(18,"\n "),ys(19,"div",6,7),ru(21,"\n "),ys(22,"div",8),ru(23,"\n"),_s(),ru(24,"\n")),2&e&&(Ya(7),ms("id",t.progressbarId),Ya(6),ls("fill",t._rectangleFillValue),Ya(4),ms("ngStyle",t._bufferTransform()),Ya(2),ms("ngStyle",t._primaryTransform()))},directives:[gh],styles:['.mat-progress-bar{display:block;height:4px;overflow:hidden;position:relative;transition:opacity 250ms linear;width:100%}._mat-animation-noopable.mat-progress-bar{transition:none;animation:none}.mat-progress-bar .mat-progress-bar-element,.mat-progress-bar .mat-progress-bar-fill::after{height:100%;position:absolute;width:100%}.mat-progress-bar .mat-progress-bar-background{width:calc(100% + 10px)}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-background{display:none}.mat-progress-bar .mat-progress-bar-buffer{transform-origin:top left;transition:transform 250ms ease}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-buffer{border-top:solid 5px;opacity:.5}.mat-progress-bar .mat-progress-bar-secondary{display:none}.mat-progress-bar .mat-progress-bar-fill{animation:none;transform-origin:top left;transition:transform 250ms ease}.cdk-high-contrast-active .mat-progress-bar .mat-progress-bar-fill{border-top:solid 4px}.mat-progress-bar .mat-progress-bar-fill::after{animation:none;content:"";display:inline-block;left:0}.mat-progress-bar[dir=rtl],[dir=rtl] .mat-progress-bar{transform:rotateY(180deg)}.mat-progress-bar[mode=query]{transform:rotateZ(180deg)}.mat-progress-bar[mode=query][dir=rtl],[dir=rtl] .mat-progress-bar[mode=query]{transform:rotateZ(180deg) rotateY(180deg)}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-fill,.mat-progress-bar[mode=query] .mat-progress-bar-fill{transition:none}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary,.mat-progress-bar[mode=query] .mat-progress-bar-primary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-translate 2000ms infinite linear;left:-145.166611%}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-primary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-scale 2000ms infinite linear}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary,.mat-progress-bar[mode=query] .mat-progress-bar-secondary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-translate 2000ms infinite linear;left:-54.888891%;display:block}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-secondary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-scale 2000ms infinite linear}.mat-progress-bar[mode=buffer] .mat-progress-bar-background{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-background-scroll 250ms infinite linear;display:block}.mat-progress-bar._mat-animation-noopable .mat-progress-bar-fill,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-buffer,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-primary,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-secondary,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar._mat-animation-noopable .mat-progress-bar-background{animation:none;transition-duration:1ms}@keyframes mat-progress-bar-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mat-progress-bar-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mat-progress-bar-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mat-progress-bar-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mat-progress-bar-background-scroll{to{transform:translateX(-8px)}}\n'],encapsulation:2,changeDetection:0}),e}();function XP(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:100;return Math.max(t,Math.min(n,e))}var QP=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[Th,jw],jw]}),e}();function eA(e,t){1&e&&(vs(0,"p",13),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"common.loading")))}function tA(e,t){if(1&e&&(vs(0,"p",14),vs(1,"span"),ru(2),Wl(3,"percent"),_s(),_s()),2&e){var n=Ys();Ya(2),au(Ul(3,1,n.synchronizationPercentage,"1.2-2"))}}function nA(e,t){if(1&e&&(vs(0,"p",14),vs(1,"span"),ru(2),Wl(3,"amount"),_s(),ru(4),Wl(5,"amount"),_s()),2&e){var n=Ys();Ya(2),au(zl(3,2,n.coins,!0,"first")),Ya(2),ou(" ",zl(5,6,n.coins,!0,"last"),"")}}function iA(e,t){if(1&e&&(vs(0,"span"),ru(1),Wl(2,"currency"),_s()),2&e){var n=Ys(3);Ya(1),au(ql(2,1,n.coins*n.price,"USD","symbol","1.2-2"))}}function rA(e,t){1&e&&(vs(0,"span"),ru(1,"-"),_s())}function aA(e,t){if(1&e&&(vs(0,"span"),ru(1,"\n "),hs(2,iA,3,6,"span",10),ru(3,"\n "),hs(4,rA,2,0,"span",10),ru(5),Wl(6,"currency"),_s()),2&e){var n=Ys(2);Ya(2),ms("ngIf",n.synchronized&&n.balanceObtained),Ya(2),ms("ngIf",!n.synchronized||!n.balanceObtained),Ya(1),ou("\n (",ql(6,3,n.price,"USD","symbol","1.2-2"),")\n ")}}function oA(e,t){1&e&&(vs(0,"span"),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"common.loading")))}function sA(e,t){if(1&e&&(vs(0,"p",15),ru(1,"\n "),hs(2,aA,7,8,"span",10),ru(3,"\n "),hs(4,oA,3,3,"span",10),ru(5,"\n "),_s()),2&e){var n=Ys();Ya(2),ms("ngIf",n.price),Ya(2),ms("ngIf",!n.price)}}function uA(e,t){1&e&&(vs(0,"p"),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"common.loading")))}function lA(e,t){if(1&e&&(vs(0,"p"),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys();Ya(1),su("",Vl(2,2,"header.syncing-blocks")," ","("+n.currentBlock+"/"+n.highestBlock+")","")}}function cA(e,t){if(1&e&&(vs(0,"p"),ru(1),Wl(2,"amount"),_s()),2&e){var n=Ys();Ya(1),au(Ul(2,1,n.hours,!1))}}function dA(e,t){if(1&e&&ys(0,"mat-progress-bar",16),2&e){var n=Ys();ms("mode","determinate")("value",100*n.synchronizationPercentage)}}function hA(e,t){if(1&e&&(vs(0,"div",17),ru(1,"\n "),vs(2,"div"),ru(3),Wl(4,"translate"),vs(5,"a",18),ru(6),_s(),ru(7),Wl(8,"translate"),_s(),ru(9,"\n "),_s()),2&e){var n=Ys();Ya(3),ou("\n ",Vl(4,4,"header.warnings.update-part1"),"\n "),Ya(2),ms("href",n.walletDownloadUrl,Pr),Ya(1),ou("v",n.appService.lastestVersion,""),Ya(1),ou("\n ",Vl(8,6,"header.warnings.update-part3"),"\n ")}}function fA(e,t){1&e&&(vs(0,"div",17),ru(1,"\n "),vs(2,"div"),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()),2&e&&(Ya(3),au(Vl(4,1,"header.warnings.csrf")))}function pA(e,t){1&e&&(vs(0,"div",17),ru(1,"\n "),vs(2,"div"),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()),2&e&&(Ya(3),au(Vl(4,1,"header.warnings.no-connections")))}function mA(e,t){1&e&&(vs(0,"div"),ru(1),Wl(2,"translate"),vs(3,"a",19),ru(4),Wl(5,"translate"),_s(),ru(6),Wl(7,"translate"),_s()),2&e&&(Ya(1),ou("\n ",Vl(2,3,"header.warnings.pending-txs-part1"),"\n "),Ya(3),au(Vl(5,5,"header.warnings.pending-txs-part2")),Ya(2),ou("\n ",Vl(7,7,"header.warnings.pending-txs-part3"),"\n "))}function gA(e,t){1&e&&(vs(0,"div"),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),ou("\n ",Vl(2,1,"header.warnings.synchronizing"),"\n "))}function vA(e,t){if(1&e&&(vs(0,"div",17),ru(1,"\n "),hs(2,mA,8,9,"div",10),ru(3,"\n "),hs(4,gA,3,3,"div",10),ru(5,"\n "),_s()),2&e){var n=Ys();Ya(2),ms("ngIf",n.hasPendingTxs),Ya(2),ms("ngIf",!n.synchronized&&n.synchronizationInfoObtained&&!n.hasPendingTxs)}}var _A=function(){function e(e,t,n,i,r){this.appService=e,this.networkService=t,this.blockchainService=n,this.priceService=i,this.balanceAndOutputsService=r,this.synchronizationInfoObtained=!1,this.synchronized=!1,this.showPrice=!!jM.priceApiId,this.balanceObtained=!1,this.walletDownloadUrl=jM.walletDownloadUrl,this.subscriptionsGroup=[]}return e.prototype.ngOnInit=function(){var e=this;this.subscriptionsGroup.push(this.blockchainService.progress.pipe(zm(function(e){return!!e})).subscribe(function(t){e.synchronizationInfoObtained=!0,e.highestBlock=t.highestBlock,e.currentBlock=t.currentBlock,e.synchronizationPercentage=e.currentBlock&&e.highestBlock?e.currentBlock/e.highestBlock:0,e.synchronized=t.synchronized})),this.subscriptionsGroup.push(this.priceService.price.subscribe(function(t){return e.price=t})),this.subscriptionsGroup.push(this.balanceAndOutputsService.walletsWithBalance.subscribe(function(t){var n=new Map;t.forEach(function(e){e.addresses.forEach(function(e){n.has(e.address)?n.get(e.address).coins.isLessThan(e.coins)&&n.set(e.address,e):n.set(e.address,e)})});var i=new CM.BigNumber(0),r=new CM.BigNumber(0);n.forEach(function(e){i=i.plus(e.coins),r=r.plus(e.hours)}),e.coins=i.toString(),e.hours=r.toString()})),this.subscriptionsGroup.push(this.balanceAndOutputsService.hasPendingTransactions.subscribe(function(t){e.hasPendingTxs=t})),this.subscriptionsGroup.push(this.balanceAndOutputsService.firstFullUpdateMade.subscribe(function(t){e.balanceObtained=t}))},e.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(e){return e.unsubscribe()})},e.\u0275fac=function(t){return new(t||e)(ps(jS),ps(lP),ps(yO),ps(dP),ps(_O))},e.\u0275cmp=ft({type:e,selectors:[["app-header"]],inputs:{headline:"headline"},decls:48,vars:13,consts:[[1,"-container"],[1,"large-header"],[1,"gradient"],[3,"headline"],[1,"balance-container"],[1,"balance"],["class","loading-header",4,"ngIf"],["class","coins",4,"ngIf"],["class","dollars",4,"ngIf"],[1,"hour-balance"],[4,"ngIf"],["color","primary",3,"mode","value",4,"ngIf"],["class","notification-bar",4,"ngIf"],[1,"loading-header"],[1,"coins"],[1,"dollars"],["color","primary",3,"mode","value"],[1,"notification-bar"],["target","_blank","rel","noreferrer nofollow noopener",3,"href"],["routerLink","/settings/pending-transactions"]],template:function(e,t){1&e&&(vs(0,"div",0),ru(1,"\n "),vs(2,"div",1),ru(3,"\n "),ru(4,"\n "),vs(5,"div",2),ru(6,"\n "),ys(7,"app-top-bar",3),ru(8,"\n "),vs(9,"div",4),ru(10,"\n "),vs(11,"div",5),ru(12,"\n "),hs(13,eA,3,3,"p",6),ru(14,"\n "),hs(15,tA,4,4,"p",7),ru(16,"\n "),hs(17,nA,6,10,"p",7),ru(18,"\n "),hs(19,sA,6,2,"p",8),ru(20,"\n "),_s(),ru(21,"\n "),_s(),ru(22,"\n "),vs(23,"div",9),ru(24,"\n "),hs(25,uA,3,3,"p",10),ru(26,"\n "),hs(27,lA,3,4,"p",10),ru(28,"\n "),hs(29,cA,3,4,"p",10),ru(30,"\n "),_s(),ru(31,"\n "),_s(),ru(32,"\n "),_s(),ru(33,"\n "),ys(34,"app-nav-bar"),ru(35,"\n "),hs(36,dA,1,2,"mat-progress-bar",11),ru(37,"\n "),ru(38,"\n "),hs(39,hA,10,8,"div",12),ru(40,"\n "),hs(41,fA,6,3,"div",12),ru(42,"\n "),hs(43,pA,6,3,"div",12),ru(44,"\n "),hs(45,vA,6,2,"div",12),ru(46,"\n"),_s(),ru(47,"\n")),2&e&&(Ya(7),ms("headline",t.headline),Ya(6),ms("ngIf",!t.synchronizationInfoObtained||t.synchronized&&!t.balanceObtained),Ya(2),ms("ngIf",t.synchronizationInfoObtained&&!t.synchronized),Ya(2),ms("ngIf",t.synchronized&&t.balanceObtained),Ya(2),ms("ngIf",t.showPrice),Ya(6),ms("ngIf",!t.synchronizationInfoObtained||t.synchronized&&!t.balanceObtained),Ya(2),ms("ngIf",t.synchronizationInfoObtained&&!t.synchronized),Ya(2),ms("ngIf",t.synchronized&&t.balanceObtained),Ya(7),ms("ngIf",!t.synchronized&&t.synchronizationInfoObtained),Ya(3),ms("ngIf",t.appService.updateAvailable),Ya(2),ms("ngIf",t.appService.csrfDisabled),Ya(2),ms("ngIf",!t.appService.csrfDisabled&&t.networkService.noConnections),Ya(2),ms("ngIf",t.hasPendingTxs||!t.synchronized&&t.synchronizationInfoObtained))},directives:[jP,lh,qP,$P,xD],pipes:[hM,Sh,NS,Ch],styles:[".-container[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:2px solid rgba(30,34,39,.05)}.large-header[_ngcontent-%COMP%]{background-repeat:no-repeat;background-position:50%;background-size:100% auto;background-size:cover;background-image:url(/customize/header.png)}.large-header[_ngcontent-%COMP%] .gradient[_ngcontent-%COMP%]{background-size:100% 100%;display:flex;flex-flow:column;align-items:stretch;min-height:190px;background-image:url(/customize/header-gradient.png)}.balance-container[_ngcontent-%COMP%]{align-items:center;color:#fff;display:flex;flex:1 1 auto;font-size:12px;justify-content:center;text-align:center}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%]{line-height:1;margin:0 0 .5em}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:4em}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .loading-header[_ngcontent-%COMP%]{margin:0 0 .5em;font-size:2em}.balance-container[_ngcontent-%COMP%] .dollars[_ngcontent-%COMP%]{margin:0}.hour-balance[_ngcontent-%COMP%]{text-align:center}.hour-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{background-color:hsla(0,0%,100%,.3);border-radius:1000px;color:#000;display:inline-block;font-size:12px;line-height:1.8;margin:1em 0 2em;padding:0 30px}.notification-bar[_ngcontent-%COMP%]{background-color:#ff004e;color:#fafafa;min-height:64px;display:flex;font-size:18px;padding:15px 30px;text-align:center;line-height:1.2}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{margin:auto}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{text-decoration:underline;color:#fafafa}"]}),e}(),yA=["button"],bA=function(e){return{"red-text":e}};function wA(e,t){if(1&e&&(vs(0,"div",11),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys();ms("ngClass",Il(4,bA,n.data.warning)),Ya(1),au(Vl(2,2,n.data.description))}}function kA(e,t){if(1&e){var n=Ms();vs(0,"div",3),ru(1,"\n "),vs(2,"label",12),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),vs(6,"input",13),xs("keydown.enter",function(){return on(n),Ys().proceed()})("blur",function(){return on(n),Ys().validateForm()}),_s(),ru(7,"\n "),_s()}if(2&e){var i=Ys();Ya(3),au(Vl(4,3,"password.confirm-password-label")),Ya(3),ms("appFormFieldError",i.password2ErrorMsg),ls("disabled",i.working?"true":null)}}var MA=function(e){return{"element-disabled":e}};function SA(e,t){if(1&e&&(vs(0,"a",14),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys();ms("ngClass",Il(5,MA,n.working))("href","#/reset/"+n.data.wallet.id,Pr),Ya(1),au(Vl(2,3,"password.reset-link"))}}var CA=function(e){return{"modal-form-container":e}},LA=function(){function e(e,t,n,i){this.data=e,this.dialogRef=t,this.msgBarService=n,this.changeDetector=i,this.passwordSubmit=new z,this.working=!1,this.password1ErrorMsg="",this.password2ErrorMsg="",this.data=Object.assign({confirm:!1,description:null,warning:!1,title:null,wallet:null},e||{})}return e.openDialog=function(t,n,i){void 0===i&&(i=!0);var r=new wk;return r.data=n,r.autoFocus=!0,r.width=i?"260px":jM.mediumModalWidth,t.open(e,r)},e.prototype.ngOnInit=function(){this.form=new xp({}),this.form.addControl("password",new Lp("")),this.form.addControl("confirm_password",new Lp("")),this.data.confirm?this.form.get("confirm_password").enable():this.form.get("confirm_password").disable(),this.form.setValidators(this.validateForm.bind(this)),this.data.description&&this.dialogRef.updateSize("400px")},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.passwordSubmit.complete()},e.prototype.proceed=function(){!this.working&&this.form.valid&&(this.msgBarService.hide(),this.button.setLoading(),this.working=!0,this.passwordSubmit.next({password:this.form.get("password").value,close:this.close.bind(this),error:this.error.bind(this)}),this.changeDetector.detectChanges())},e.prototype.validateForm=function(){this.password1ErrorMsg="",this.password2ErrorMsg="";var e=!0;return this.form.get("password").value||(e=!1,this.form.get("password").touched&&(this.password1ErrorMsg="password.password-error-info")),this.data.confirm&&(this.form.get("confirm_password").value||(e=!1,this.form.get("confirm_password").touched&&(this.password2ErrorMsg="password.password-error-info")),e&&this.form.get("password").value!==this.form.get("confirm_password").value&&(e=!1,this.password2ErrorMsg="password.confirm-error-info")),e?null:{Invalid:!0}},e.prototype.close=function(){this.dialogRef.close()},e.prototype.error=function(e){e.type||(e=VM(e)),e.translatableErrorMsg=e.translatableErrorMsg?e.translatableErrorMsg:"password.decrypting-error",this.msgBarService.showError(e),this.button.resetState(),this.working=!1},e.\u0275fac=function(t){return new(t||e)(ps(Tk),ps(Lk),ps(dL),ps(ll))},e.\u0275cmp=ft({type:e,selectors:[["app-password-dialog"]],viewQuery:function(e,t){var n;1&e&&lc(yA,5),2&e&&uc(n=dc())&&(t.button=n.first)},decls:31,vars:23,consts:[[3,"headline","dialog","disableDismiss"],[3,"ngClass",4,"ngIf"],[3,"ngClass","formGroup"],[1,"form-field"],["for","password"],["formControlName","password","id","password","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],["class","form-field",4,"ngIf"],["class","link",3,"ngClass","href",4,"ngIf"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"],["button",""],[3,"ngClass"],["for","confirm_password"],["formControlName","confirm_password","id","confirm_password","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],[1,"link",3,"ngClass","href"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),Wl(2,"translate"),ru(3,"\n "),hs(4,wA,3,6,"div",1),ru(5,"\n "),vs(6,"div",2),ru(7,"\n "),vs(8,"div",3),ru(9,"\n "),vs(10,"label",4),ru(11),Wl(12,"translate"),_s(),ru(13,"\n "),vs(14,"input",5),xs("keydown.enter",function(){return t.proceed()})("blur",function(){return t.validateForm()}),_s(),ru(15,"\n "),_s(),ru(16,"\n "),hs(17,kA,8,5,"div",6),ru(18,"\n "),_s(),ru(19,"\n "),hs(20,SA,3,7,"a",7),ru(21,"\n "),vs(22,"div",8),ru(23,"\n "),vs(24,"app-button",9,10),xs("action",function(){return t.proceed()}),ru(26),Wl(27,"translate"),_s(),ru(28,"\n "),_s(),ru(29,"\n"),_s(),ru(30,"\n")),2&e&&(ms("headline",t.data.title?Vl(1,13,t.data.title):Vl(2,15,"password.title"))("dialog",t.dialogRef)("disableDismiss",t.working),Ya(4),ms("ngIf",t.data.description),Ya(2),ms("ngClass",Il(21,CA,t.data.description))("formGroup",t.form),Ya(5),au(Vl(12,17,"password.password-label")),Ya(3),ms("appFormFieldError",t.password1ErrorMsg),ls("disabled",t.working?"true":null),Ya(3),ms("ngIf",t.data.confirm),Ya(3),ms("ngIf",t.data.wallet),Ya(4),ms("disabled",!t.form.valid),Ya(2),ou("\n ",Vl(27,19,"password.proceed-button"),"\n "))},directives:[jk,lh,ah,ap,jp,Lf,rp,qp,FO,RO,ZC],pipes:[hM],styles:[".link[_ngcontent-%COMP%]{width:100%;display:inline-block;text-align:center}"]}),e}(),xA=["button"],TA=function(){function e(e,t){this.dialogRef=e,this.msgBarService=t,this.createRequested=new Zl,this.inputErrorMsg=""}return e.openDialog=function(t){var n=new wk;return n.autoFocus=!0,n.width=jM.mediumModalWidth,t.open(e,n)},e.prototype.ngOnInit=function(){this.form=new xp({}),this.form.addControl("quantity",new Lp(1)),this.form.setValidators(this.validateForm.bind(this))},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.createRequested.complete()},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.continue=function(){var e=this;this.button.isLoading()||(this.msgBarService.hide(),this.button.setLoading(),this.createRequested.emit({howManyAddresses:this.form.value.quantity,callback:function(t,n){void 0===n&&(n=!1),e.button.resetState(),n?e.msgBarService.showError("wallet.add-addresses.error"):t&&e.closePopup()}}))},e.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0,t=this.form.get("quantity").value;return(!t||t<1||t>100||t!==Math.round(t))&&(e=!1,this.form.get("quantity").touched&&(this.inputErrorMsg="wallet.add-addresses.quantity-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ps(Lk),ps(dL))},e.\u0275cmp=ft({type:e,selectors:[["app-number-of-addresses"]],viewQuery:function(e,t){var n;1&e&&lc(xA,5),2&e&&uc(n=dc())&&(t.button=n.first)},outputs:{createRequested:"createRequested"},decls:30,vars:18,consts:[[3,"headline","dialog","disableDismiss"],[3,"formGroup"],[1,"form-field"],["for","quantity"],["formControlName","quantity","id","quantity","type","number","min","1","max","100",3,"appFormFieldError","keydown.enter","blur"],[1,"-buttons"],[3,"disabled","action"],[1,"primary-button",3,"disabled","action"],["button",""]],template:function(e,t){if(1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),vs(4,"div",1),ru(5,"\n "),vs(6,"div",2),ru(7,"\n "),vs(8,"label",3),ru(9),Wl(10,"translate"),_s(),ru(11,"\n "),vs(12,"input",4),xs("keydown.enter",function(){return t.continue()})("blur",function(){return t.validateForm()}),_s(),ru(13,"\n "),_s(),ru(14,"\n "),_s(),ru(15,"\n "),ru(16,"\n "),vs(17,"div",5),ru(18,"\n "),vs(19,"app-button",6),xs("action",function(){return t.closePopup()}),ru(20),Wl(21,"translate"),_s(),ru(22,"\n "),vs(23,"app-button",7,8),xs("action",function(){return t.continue()}),ru(25),Wl(26,"translate"),_s(),ru(27,"\n "),_s(),ru(28,"\n"),_s(),ru(29,"\n")),2&e){var n=fs(24);ms("headline",Vl(1,10,"wallet.add-addresses.title"))("dialog",t.dialogRef)("disableDismiss",n.isLoading()),Ya(4),ms("formGroup",t.form),Ya(5),au(Vl(10,12,"wallet.add-addresses.quantity-label")),Ya(3),ms("appFormFieldError",t.inputErrorMsg),Ya(7),ms("disabled",n&&n.isLoading()),Ya(1),ou("\n ",Vl(21,14,"common.cancel-button"),"\n "),Ya(3),ms("disabled",!t.form.valid),Ya(2),ou("\n ",Vl(26,16,"common.create-button"),"\n ")}},directives:[jk,ap,jp,Lf,Ip,am,im,rp,qp,RO,ZC],pipes:[hM],styles:[""]}),e}();function DA(e,t){if(1&e&&(ys(0,"app-hw-message",4),Wl(1,"translate")),2&e){var n=Ys();ms("text",Vl(1,3,"hardware-wallet.confirm-address.instructions"))("lowerBigText",n.data.wallet.addresses[n.data.addressIndex].address)("icon",n.msgIcons.Confirm)}}function OA(e,t){if(1&e&&(ys(0,"app-hw-message",5),Wl(1,"translate")),2&e){var n=Ys();ms("text",Vl(1,2,n.result.text))("icon",n.result.icon)}}function EA(e,t){if(1&e){var n=Ms();vs(0,"div",6),ru(1,"\n "),vs(2,"app-button",7,8),xs("action",function(){return on(n),Ys().closeModal()}),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()}2&e&&(Ya(4),ou("\n ",Vl(5,1,"common.close-button"),"\n "))}var YA=function(){return function(){}}(),PA=function(e){function t(t,n,i,r){var a=e.call(this,r,n)||this;return a.data=t,a.dialogRef=n,a.hardwareWalletService=i,a.operationSubscription=a.hardwareWalletService.confirmAddress(t.wallet,t.addressIndex).subscribe(function(){a.showResult({text:t.showCompleteConfirmation?"hardware-wallet.confirm-address.confirmation":"hardware-wallet.confirm-address.short-confirmation",icon:a.msgIcons.Success})},function(e){return a.processHwOperationError(e)}),a}return vf(t,e),t.openDialog=function(e,n){var i=new wk;return i.width="566px",i.autoFocus=!1,i.data=n,e.open(t,i)},t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(YE),ps(gC))},t.\u0275cmp=ft({type:t,selectors:[["app-hw-confirm-address-dialog"]],features:[Ko],decls:13,vars:8,consts:[[3,"headline","dialog","disableDismiss"],[3,"text","lowerBigText","icon",4,"ngIf"],[3,"text","icon",4,"ngIf"],["class","-buttons",4,"ngIf"],[3,"text","lowerBigText","icon"],[3,"text","icon"],[1,"-buttons"],[1,"primary-button",3,"action"],["closeButton",""]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,DA,2,5,"app-hw-message",1),ru(5,"\n\n "),ru(6,"\n "),hs(7,OA,2,4,"app-hw-message",2),ru(8,"\n\n "),ru(9,"\n "),hs(10,EA,7,3,"div",3),ru(11,"\n"),_s(),ru(12,"\n")),2&e&&(ms("headline",Vl(1,6,"hardware-wallet.confirm-address.title"))("dialog",t.dialogRef)("disableDismiss",t.currentState===t.states.Initial),Ya(4),ms("ngIf",t.currentState===t.states.Initial),Ya(3),ms("ngIf",t.currentState===t.states.ShowingResult),Ya(3),ms("ngIf",t.currentState!==t.states.Initial))},directives:[jk,lh,oC,ZC],pipes:[hM],styles:[""]}),t}(yC),AA=function(e){return e.new="new",e.scan="scan",e}({}),IA=function(){function e(e){this.dialogRef=e,this.addressOptions=AA}return e.openDialog=function(t){var n=new wk;return n.autoFocus=!1,n.width=jM.mediumModalWidth,t.open(e,n)},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.select=function(e){this.dialogRef.close(e)},e.\u0275fac=function(t){return new(t||e)(ps(Lk))},e.\u0275cmp=ft({type:e,selectors:[["app-address-options"]],decls:37,vars:13,consts:[[3,"headline","dialog"],[1,"list-button-container","light-button-theme"],["mat-button","","color","primary",1,"top-line",3,"click"],[1,"content"],["src","assets/img/plus-green.png"],["mat-button","","color","primary",3,"click"],["src","assets/img/search-gold.png"],[1,"help-icon",3,"matTooltip"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),vs(3,"div",1),ru(4,"\n "),ru(5,"\n "),vs(6,"button",2),xs("click",function(){return t.select(t.addressOptions.new)}),ru(7,"\n "),vs(8,"div",3),ru(9,"\n "),ys(10,"img",4),ru(11,"\n "),vs(12,"span"),ru(13),Wl(14,"translate"),_s(),ru(15,"\n "),_s(),ru(16,"\n "),_s(),ru(17,"\n "),ru(18,"\n "),vs(19,"button",5),xs("click",function(){return t.select(t.addressOptions.scan)}),ru(20,"\n "),vs(21,"div",3),ru(22,"\n "),ys(23,"img",6),ru(24,"\n "),vs(25,"span"),ru(26),Wl(27,"translate"),vs(28,"mat-icon",7),Wl(29,"translate"),ru(30,"help"),_s(),ru(31,"\n "),_s(),ru(32,"\n "),_s(),ru(33,"\n "),_s(),ru(34,"\n "),_s(),ru(35,"\n"),_s(),ru(36,"\n")),2&e&&(ms("headline",Vl(1,5,"wallet.address-options.title"))("dialog",t.dialogRef),Ya(13),au(Vl(14,7,"wallet.address-options.new")),Ya(13),ou("\n ",Vl(27,9,"wallet.address-options.scan"),"\n "),Ya(2),ms("matTooltip",Vl(29,11,"wallet.address-options.scan-help")))},directives:[jk,SC,WC,YO],pipes:[hM],styles:[".content[_ngcontent-%COMP%]{display:flex;align-items:center}.content[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:32px;width:32px;margin-right:5px}.content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}"]}),e}(),RA=n(29609),FA=function(){function e(e,t,n){this.walletsAndAddressesService=e,this.apiService=t,this.storageService=n}return e.prototype.getTransactionsHistory=function(e){var t,n=this,i=new Map;return(e?bm([e]):this.walletsAndAddressesService.allWallets).pipe(eS(),ue(function(e){var t=[];e.forEach(function(e){e.addresses.map(function(n){t.push(n),(!i.has(n.address)||i.get(n.address).addresses.length0&&r.length<3){var a=r[0];for(i=r[0].length-3;i>0;i-=3)a=a.substr(0,i)+","+a.substr(i),i<=t&&(t+=1);var o=0;this.lastBackspaceDate&&(new Date).getTime()-this.lastBackspaceDate<30&&","===a.charAt(t-1)&&(o+=1),this.el.nativeElement.value=a+(r.length>1?"."+r[1]:""),this.el.nativeElement.selectionStart=t-o,this.el.nativeElement.selectionEnd=t-o}}}},e.prototype.p1=function(e){this.lastBackspaceDate=8===e.keyCode?(new Date).getTime():null},e.\u0275fac=function(t){return new(t||e)(ps(Fu))},e.\u0275dir=bt({type:e,selectors:[["","appFormatNumber",""]],hostBindings:function(e,t){1&e&&xs("ngModelChange",function(){return t.onChange()})("keydown",function(e){return t.p1(e)})}}),e}(),jA=["qrArea"];function NA(e,t){if(1&e){var n=Ms();vs(0,"div",6),ru(1,"\n "),vs(2,"div",7),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),vs(6,"div",8),xs("click",function(){on(n);var e=Ys();return e.copyText(e.currentQrContent)}),vs(7,"span",9),ru(8),_s(),vs(9,"span",10),ru(10,"\uf0c5"),_s(),_s(),ru(11,"\n "),_s()}if(2&e){var i=Ys();Ya(3),au(Vl(4,2,"qr.data-label")),Ya(5),au(i.currentQrContent)}}function BA(e,t){if(1&e){var n=Ms();vs(0,"app-arrow-link",14),xs("pressed",function(){return on(n),Ys().showForm()}),ru(1,"\n "),_s()}2&e&&ms("text","qr.request-link")("noPadding",!0)}function WA(e,t){1&e&&ys(0,"div",15)}function VA(e,t){1&e&&(vs(0,"span",25),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"qr.invalid")))}function UA(e,t){1&e&&(vs(0,"span",25),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"qr.invalid")))}function zA(e,t){if(1&e&&(vs(0,"div",16),ru(1,"\n "),vs(2,"div",17),ru(3,"\n "),vs(4,"label",18),ru(5),Wl(6,"translate"),hs(7,VA,3,3,"span",19),ru(8,"\n "),_s(),ru(9,"\n "),ys(10,"input",20),ru(11,"\n "),_s(),ru(12,"\n "),vs(13,"div",17),ru(14,"\n "),vs(15,"label",21),ru(16),Wl(17,"translate"),hs(18,UA,3,3,"span",19),ru(19,"\n "),_s(),ru(20,"\n "),ys(21,"input",22),ru(22,"\n "),_s(),ru(23,"\n "),vs(24,"div",17),ru(25,"\n "),vs(26,"label",23),ru(27),Wl(28,"translate"),_s(),ru(29,"\n "),ys(30,"input",24),ru(31,"\n "),_s(),ru(32,"\n "),_s()),2&e){var n=Ys();ms("formGroup",n.form),Ya(5),ou("\n ",Vl(6,6,"qr.amount-label")," "),Ya(2),ms("ngIf",n.invalidCoins),Ya(9),ou("\n ",Vl(17,8,"qr.hours-label")," "),Ya(2),ms("ngIf",n.invalidHours),Ya(9),ou("\n ",Vl(28,10,"qr.message-label"),"\n ")}}var qA=function(){function e(){}return e.size=180,e.level="M",e.colordark="#000000",e.colorlight="#ffffff",e.usesvg=!1,e}(),GA=function(){function e(e,t,n,i,r){this.data=e,this.dialogRef=t,this.formBuilder=n,this.msgBarService=i,this.appService=r,this.formVisible=!1,this.invalidCoins=!1,this.invalidHours=!1,this.subscriptionsGroup=[],this.updateQrEvent=new z}return e.openDialog=function(t,n){var i=new wk;i.data=n,i.width="390px",t.open(e,i)},e.prototype.ngOnInit=function(){var e=this;setTimeout(function(){e.initForm(),e.updateQrContent()})},e.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(e){return e.unsubscribe()}),this.msgBarService.hide()},e.prototype.showForm=function(){this.formVisible=!0},e.prototype.copyText=function(e){IM(e),this.msgBarService.showDone("common.copied",4e3)},e.prototype.initForm=function(){var e=this;this.form=this.formBuilder.group({coins:[""],hours:[""],note:[""]}),this.subscriptionsGroup.push(this.form.get("coins").valueChanges.subscribe(this.reportValueChanged.bind(this))),this.subscriptionsGroup.push(this.form.get("hours").valueChanges.subscribe(this.reportValueChanged.bind(this))),this.subscriptionsGroup.push(this.form.get("note").valueChanges.subscribe(this.reportValueChanged.bind(this))),this.subscriptionsGroup.push(this.updateQrEvent.pipe(Bv(500)).subscribe(function(){e.updateQrContent()}))},e.prototype.reportValueChanged=function(){this.updateQrEvent.next(!0)},e.prototype.updateQrContent=function(){if(this.data.showAddressOnly)return this.currentQrContent=this.data.address,void this.updateQrCode();this.currentQrContent=this.appService.uriSpecificatioPrefix.toLowerCase()+":"+this.data.address,this.invalidCoins=!1,this.invalidHours=!1;var e="?";if(this.form.get("coins").value){var t=new CM.BigNumber(HM(this.form.get("coins").value));!t.isNaN()&&t.isGreaterThan(0)&&t.decimalPlaces()<=this.appService.currentMaxDecimals?(this.currentQrContent+=e+"amount="+t.toString(),e="&"):this.invalidCoins=!0}if(this.form.get("hours").value){var n=new CM.BigNumber(HM(this.form.get("hours").value));!n.isNaN()&&n.isGreaterThan(0)&&0===n.decimalPlaces()?(this.currentQrContent+=e+"hours="+n.toString(),e="&"):this.invalidHours=!0}var i=this.form.get("note").value;i&&(this.currentQrContent+=e+"message="+encodeURIComponent(i)),this.updateQrCode()},e.prototype.updateQrCode=function(){this.qrArea.nativeElement.innerHTML="",new QRCode(this.qrArea.nativeElement,{text:this.currentQrContent,width:qA.size,height:qA.size,colorDark:qA.colordark,colorLight:qA.colorlight,useSVG:qA.usesvg,correctLevel:QRCode.CorrectLevel[qA.level]})},e.\u0275fac=function(t){return new(t||e)(ps(Tk),ps(Lk),ps(fm),ps(dL),ps(jS))},e.\u0275cmp=ft({type:e,selectors:[["app-qr-code"]],viewQuery:function(e,t){var n;1&e&&lc(jA,5),2&e&&uc(n=dc())&&(t.qrArea=n.first)},decls:36,vars:12,consts:[[3,"headline","dialog"],[1,"qr-container"],[1,"qr"],["qrArea",""],[1,"separator"],["class","data-container",4,"ngIf"],[1,"data-container"],[1,"title"],[1,"data",3,"click"],[1,"text"],[1,"fa","copy"],[3,"text","noPadding","pressed",4,"ngIf"],["class","separator form-separator",4,"ngIf"],[3,"formGroup",4,"ngIf"],[3,"text","noPadding","pressed"],[1,"separator","form-separator"],[3,"formGroup"],[1,"form-field"],["for","coins"],["class","red-text",4,"ngIf"],["appFormatNumber","","maxlength","20","formControlName","coins","id","coins"],["for","hours"],["appFormatNumber","","maxlength","20","formControlName","hours","id","hours"],["for","note"],["maxlength","100","formControlName","note","id","note"],[1,"red-text"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),vs(4,"div",1),ru(5,"\n "),ys(6,"div",2,3),ru(8,"\n "),_s(),ru(9,"\n "),ru(10,"\n "),ys(11,"div",4),ru(12,"\n "),hs(13,NA,12,4,"div",5),ru(14,"\n "),vs(15,"div",6),ru(16,"\n "),vs(17,"div",7),ru(18),Wl(19,"translate"),_s(),ru(20,"\n "),vs(21,"div",8),xs("click",function(){return t.copyText(t.data.address)}),vs(22,"span",9),ru(23),_s(),vs(24,"span",10),ru(25,"\uf0c5"),_s(),_s(),ru(26,"\n "),_s(),ru(27,"\n\n "),hs(28,BA,2,2,"app-arrow-link",11),ru(29,"\n\n "),ru(30,"\n "),hs(31,WA,1,0,"div",12),ru(32,"\n "),hs(33,zA,33,12,"div",13),ru(34,"\n"),_s(),ru(35,"\n")),2&e&&(ms("headline",Vl(1,8,"qr.title"))("dialog",t.dialogRef),Ya(13),ms("ngIf",!t.data.showAddressOnly),Ya(5),au(Vl(19,10,"qr.address-label")),Ya(5),au(t.data.address),Ya(5),ms("ngIf",!t.formVisible&&!t.data.showAddressOnly),Ya(3),ms("ngIf",t.formVisible),Ya(2),ms("ngIf",t.formVisible))},directives:[jk,lh,jO,ap,jp,Lf,HA,lm,rp,qp],pipes:[hM],styles:[".qr-container[_ngcontent-%COMP%]{text-align:center;margin-bottom:24px}.qr-container[_ngcontent-%COMP%] .qr[_ngcontent-%COMP%]{height:180px;width:180px;display:inline-block}.separator[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.2);height:1px;width:100%}.form-separator[_ngcontent-%COMP%]{margin-bottom:14px}.data-container[_ngcontent-%COMP%]{margin:14px 0}.data-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]{color:#1e2227;cursor:pointer}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%] .text[_ngcontent-%COMP%]{margin-right:5px;word-break:break-word}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%] .copy[_ngcontent-%COMP%]{opacity:.25}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]:hover .copy[_ngcontent-%COMP%]{opacity:.75}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]:active .copy[_ngcontent-%COMP%]{opacity:1}"]}),e}(),KA=function(){function e(e){this.dialog=e,this.showAddressOnly=!1}return e.prototype.showQrCode=function(e){e.stopPropagation(),GA.openDialog(this.dialog,{address:this.address,showAddressOnly:this.showAddressOnly})},e.\u0275fac=function(t){return new(t||e)(ps(Pk))},e.\u0275cmp=ft({type:e,selectors:[["app-qr-code-button"]],inputs:{address:"address",showAddressOnly:"showAddressOnly"},decls:2,vars:0,consts:[["src","assets/img/qr-code-black.png",3,"click"]],template:function(e,t){1&e&&(vs(0,"img",0),xs("click",function(e){return t.showQrCode(e)}),_s(),ru(1,"\n"))},styles:[".primary-button[_ngcontent-%COMP%] button.enabled[_ngcontent-%COMP%], .primary-gradient-background[_ngcontent-%COMP%]{background:#0072ff;background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.primary-button[_ngcontent-%COMP%] button.enabled[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .primary-gradient-background[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fff}.dark-button[_ngcontent-%COMP%] button.enabled[_ngcontent-%COMP%]{background-color:#1e2227!important}.dark-button[_ngcontent-%COMP%] button.enabled[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fff}.ghost-button[_ngcontent-%COMP%] button.enabled[_ngcontent-%COMP%]{background-color:transparent!important}.ghost-button[_ngcontent-%COMP%] button.enabled[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#000}.image-button[_ngcontent-%COMP%], img[_ngcontent-%COMP%]{cursor:pointer;opacity:.5}.image-button[_ngcontent-%COMP%]:hover, img[_ngcontent-%COMP%]:hover{opacity:.75}.image-button[_ngcontent-%COMP%]:active, img[_ngcontent-%COMP%]:active{opacity:1}[_nghost-%COMP%]{display:inline-flex;flex-shrink:0}img[_ngcontent-%COMP%]{width:17px}"]}),e}();function JA(e,t){1&e&&ys(0,"mat-spinner")}var ZA=function(e,t){return{"-img -address-options":e,"-disabled-span":t}},$A=function(e,t){return{"-img":!0,"-show-empty":e,"-hide-empty":t}};function XA(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),vs(2,"div",5),xs("click",function(){return on(n),Ys().openAddressOptions()}),ru(3,"\n "),vs(4,"span",6),ru(5,"\n "),hs(6,JA,1,0,"mat-spinner",1),ru(7),Wl(8,"translate"),_s(),ru(9,"\n "),_s(),ru(10,"\n "),vs(11,"div",5),xs("click",function(){return on(n),Ys().toggleEmpty()}),ru(12,"\n "),vs(13,"span",6),ru(14),Wl(15,"translate"),_s(),ru(16,"\n "),_s(),ru(17,"\n "),ws()}if(2&e){var i=Ys();Ya(4),ms("ngClass",Rl(9,ZA,!i.workingWithAddresses,i.workingWithAddresses)),Ya(2),ms("ngIf",i.workingWithAddresses),Ya(1),ou("\n ",Vl(8,5,"wallet.address-options.title"),"\n "),Ya(6),ms("ngClass",Rl(12,$A,i.hideEmpty,!i.hideEmpty)),Ya(1),ou("\n ",Vl(15,7,"wallet."+(i.hideEmpty?"show":"hide")+"-empty-button"),"\n ")}}function QA(e,t){if(1&e){var n=Ms();vs(0,"div",8),xs("click",function(){return on(n),Ys().deleteHwWallet()}),ru(1,"\n "),vs(2,"span",9),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}2&e&&(Ya(3),au(Vl(4,1,"wallet.delete-button")))}var eI=function(e,t){return{"-img":!0,"-enable-encryption":e,"-disable-encryption":t}};function tI(e,t){if(1&e){var n=Ms();vs(0,"div",5),xs("click",function(){return on(n),Ys().toggleEncryption()}),ru(1,"\n "),vs(2,"span",6),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("ngClass",Rl(4,eI,!i.wallet.encrypted,i.wallet.encrypted)),Ya(1),ou("\n ",Vl(4,2,"wallet."+(i.wallet.encrypted?"decrypt":"encrypt")+"-button"),"\n ")}}function nI(e,t){1&e&&ys(0,"mat-spinner")}function iI(e,t){1&e&&ys(0,"mat-spinner")}var rI=function(e){return{copying:e}};function aI(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),ys(2,"app-qr-code-button",23),ru(3,"\n "),vs(4,"p",24),xs("click",function(e){on(n);var t=Ys(2).$implicit;return Ys().copyAddress(e,t)})("mouseleave",function(){on(n);var e=Ys(2).$implicit;return Ys().copying.delete(e.address)}),ru(5),hs(6,iI,1,0,"mat-spinner",1),ru(7,"\n "),vs(8,"span",25),Wl(9,"translate"),ru(10),Wl(11,"translate"),_s(),ru(12,"\n "),_s(),ru(13,"\n "),ws()}if(2&e){var i=Ys(2),r=i.$implicit,a=i.index,o=Ys();Ya(2),ms("address",r.address),Ya(2),ms("ngClass",Il(10,rI,o.copying.has(r.address))),Ya(1),ou("\n ",r.address,"\n "),Ya(1),ms("ngIf",o.confirmingIndex===a),Ya(2),ls("data-label",Vl(9,6,"wallet.address.copied")),Ya(2),ou("\n ",Vl(11,8,"wallet.address.copy"),"\n ")}}function oI(e,t){1&e&&ys(0,"mat-spinner")}function sI(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),vs(2,"p",26),xs("click",function(){on(n);var e=Ys(2).index,t=Ys();return t.confirmAddress(t.wallet,e,!0)}),ru(3,"\n "),vs(4,"span",27),ru(5),_s(),ru(6,"\n "),vs(7,"span",28),ru(8),Wl(9,"translate"),hs(10,oI,1,0,"mat-spinner",1),ru(11,"\n "),_s(),ru(12,"\n "),_s(),ru(13,"\n "),ws()}if(2&e){var i=Ys(2),r=i.$implicit,a=i.index,o=Ys();Ya(5),au(r.address),Ya(3),ou("\n ",Vl(9,3,"wallet.address.show"),"\n "),Ya(2),ms("ngIf",o.confirmingIndex===a)}}function uI(e,t){if(1&e){var n=Ms();vs(0,"button",29),xs("click",function(e){on(n);var t=Ys(2).$implicit;return Ys().copyAddress(e,t,1e3)}),ru(1),Wl(2,"translate"),_s()}if(2&e){var i=Ys(2).$implicit,r=Ys();Ya(1),ou("\n ",Vl(2,1,"wallet.address."+(r.copying.has(i.address)?"copied":"copy-address")),"\n ")}}function lI(e,t){if(1&e){var n=Ms();vs(0,"button",29),xs("click",function(){on(n);var e=Ys(2),t=e.index,i=e.$implicit,r=Ys();return r.confirmAddress(r.wallet,t,!i.confirmed)}),ru(1),Wl(2,"translate"),_s()}2&e&&(Ya(1),ou("\n ",Vl(2,1,"wallet.address.confirm"),"\n "))}var cI=function(e){return{addr:e}};function dI(e,t){if(1&e&&(vs(0,"div",11),ru(1,"\n "),ru(2,"\n "),vs(3,"div",12),ru(4),_s(),ru(5,"\n "),ru(6,"\n "),vs(7,"div",13),ru(8,"\n "),ru(9,"\n "),hs(10,aI,14,12,"ng-container",1),ru(11,"\n "),ru(12,"\n "),hs(13,sI,14,5,"ng-container",1),ru(14,"\n "),_s(),ru(15,"\n "),ru(16,"\n "),vs(17,"div",14),ru(18),Wl(19,"amount"),_s(),ru(20,"\n "),vs(21,"div",15),ru(22),Wl(23,"amount"),_s(),ru(24,"\n "),ru(25,"\n "),vs(26,"div",16),ru(27,"\n "),vs(28,"mat-icon",17),ru(29,"more_vert"),_s(),ru(30,"\n "),vs(31,"mat-menu",18,19),ru(33,"\n "),hs(34,uI,3,3,"button",20),ru(35,"\n "),hs(36,lI,3,3,"button",20),ru(37,"\n "),vs(38,"button",21),ru(39),Wl(40,"translate"),_s(),ru(41,"\n "),vs(42,"button",22),ru(43),Wl(44,"translate"),_s(),ru(45,"\n "),_s(),ru(46,"\n "),_s(),ru(47,"\n "),_s()),2&e){var n=fs(32),i=Ys(),r=i.index,a=i.$implicit,o=Ys();Ya(4),au(r+1),Ya(6),ms("ngIf",!o.wallet.isHardware||a.confirmed),Ya(3),ms("ngIf",o.wallet.isHardware&&!a.confirmed),Ya(5),au(zl(19,13,a.coins?a.coins:0,!0,"first")),Ya(4),au(zl(23,17,a.hours?a.hours:0,!1,"first")),Ya(6),ms("matMenuTriggerFor",n),Ya(3),ms("overlapTrigger",!1),Ya(3),ms("ngIf",!o.wallet.isHardware||a.confirmed),Ya(2),ms("ngIf",o.wallet.isHardware),Ya(2),ms("queryParams",Il(25,cI,a.address)),Ya(1),ou("\n ",Vl(40,21,"wallet.address.outputs"),"\n "),Ya(3),ms("queryParams",Il(27,cI,a.address)),Ya(1),ou("\n ",Vl(44,23,"wallet.address.history"),"\n ")}}function hI(e,t){if(1&e&&(bs(0),ru(1,"\n "),hs(2,dI,48,29,"div",10),ru(3,"\n"),ws()),2&e){var n=t.$implicit,i=Ys();Ya(2),ms("ngIf",!i.hideEmpty||n.coins.isGreaterThan(0))}}var fI=function(e,t){return{"-img -rename-wallet":e,"-disabled-span":t}},pI=function(){function e(e,t,n,i,r,a,o,s,u){this.dialog=e,this.msgBarService=t,this.hwWalletService=n,this.translateService=i,this.router=r,this.walletsAndAddressesService=a,this.softwareWalletService=o,this.hardwareWalletService=s,this.historyService=u,this.confirmingIndex=null,this.workingWithAddresses=!1,this.preparingToRename=!1,this.hideEmpty=!1,this.copying=new Map}return e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.renameSubscription&&this.renameSubscription.unsubscribe(),this.confirmSubscription&&this.confirmSubscription.unsubscribe(),this.txHistorySubscription&&this.txHistorySubscription.unsubscribe(),this.numberOfAddressesSubscription&&this.numberOfAddressesSubscription.unsubscribe(),this.scanSubscription&&this.scanSubscription.unsubscribe(),this.addAddressesSubscription&&this.addAddressesSubscription.unsubscribe()},e.prototype.renameWallet=function(){var e=this;this.preparingToRename||(sP.busy?this.msgBarService.showError("wallet.busy-error"):(this.msgBarService.hide(),this.wallet.isHardware?(this.preparingToRename=!0,sP.busy=!0,this.renameSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).pipe(ue(function(){return e.hardwareWalletService.getFeaturesAndUpdateData(e.wallet)})).subscribe(function(t){e.continueRenameWallet(),e.preparingToRename=!1,sP.busy=!1,t.walletNameUpdated&&e.msgBarService.showWarning("hardware-wallet.general.name-updated")},function(t){e.msgBarService.showError(t),e.preparingToRename=!1,sP.busy=!1})):this.continueRenameWallet()))},e.prototype.openAddressOptions=function(){var e=this;this.workingWithAddresses||(sP.busy?this.msgBarService.showError("wallet.busy-error"):IA.openDialog(this.dialog).afterClosed().subscribe(function(t){t===AA.new?e.newAddresses():t===AA.scan&&e.scanAddresses()}))},e.prototype.newAddresses=function(){var e=this;if(!this.workingWithAddresses)if(sP.busy)this.msgBarService.showError("wallet.busy-error");else if(this.wallet.isHardware&&this.wallet.addresses.length>=jM.maxHardwareWalletAddresses)vO.openDialog(this.dialog,{text:"wallet.max-hardware-wallets-error",headerText:"common.error",defaultButtons:gO.Close});else if(this.msgBarService.hide(),this.wallet.isHardware)this.continueNewAddress(1);else{var t=TA.openDialog(this.dialog),n=jM.maxAddressesGap;this.numberOfAddressesSubscription=t.componentInstance.createRequested.subscribe(function(t){var i=t.howManyAddresses,r=t.callback,a=0;e.wallet.addresses.forEach(function(e,t){e.coins.isGreaterThan(0)&&(a=t)}),e.wallet.addresses.length-(a+1)+i-1}},{key:"_isBadInput",value:function(){var e=this._elementRef.nativeElement.validity;return e&&e.badInput}},{key:"empty",get:function(){return!(this._isNeverEmpty()||this._elementRef.nativeElement.value||this._isBadInput()||this.autofilled)}},{key:"shouldLabelFloat",get:function(){if(this._isNativeSelect){var e=this._elementRef.nativeElement,t=e.options[0];return this.focused||e.multiple||!this.empty||!!(e.selectedIndex>-1&&t&&t.label)}return this.focused||!this.empty}},{key:"setDescribedByIds",value:function(e){e.length?this._elementRef.nativeElement.setAttribute("aria-describedby",e.join(" ")):this._elementRef.nativeElement.removeAttribute("aria-describedby")}},{key:"onContainerClick",value:function(){this.focused||this.focus()}}]),n}(TI);return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(yg),ps(np,10),ps(Ep,8),ps(jp,8),ps(zw),ps(CI,10),ps(bI),ps(Fc),ps(MI,8))},e.\u0275dir=bt({type:e,selectors:[["input","matInput",""],["textarea","matInput",""],["select","matNativeControl",""],["input","matNativeControl",""],["textarea","matNativeControl",""]],hostAttrs:[1,"mat-input-element","mat-form-field-autofill-control"],hostVars:9,hostBindings:function(e,t){1&e&&xs("focus",function(){return t._focusChanged(!0)})("blur",function(){return t._focusChanged(!1)})("input",function(){return t._onInput()}),2&e&&(du("disabled",t.disabled)("required",t.required),ls("id",t.id)("data-placeholder",t.placeholder)("readonly",t.readonly&&!t._isNativeSelect||null)("aria-invalid",t.empty&&t.required?null:t.errorState)("aria-required",t.required),qs("mat-input-server",t._isServer))},inputs:{id:"id",disabled:"disabled",required:"required",type:"type",value:"value",readonly:"readonly",placeholder:"placeholder",errorStateMatcher:"errorStateMatcher",userAriaDescribedBy:["aria-describedby","userAriaDescribedBy"]},exportAs:["matInput"],features:[Du([{provide:kI,useExisting:e}]),Ko,At]}),e}(),OI=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[zw],imports:[[wI,SI,jw],wI,SI]}),e}(),EI=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[jw],jw]}),e}(),YI=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[qw,ik,jw,ak,Th],qw,jw,ak,EI]}),e}(),PI=["trigger"],AI=["panel"];function II(e,t){if(1&e&&(vs(0,"span",8),ru(1),_s()),2&e){var n=Ys();Ya(1),au(n.placeholder)}}function RI(e,t){if(1&e&&(vs(0,"span",12),ru(1),_s()),2&e){var n=Ys(2);Ya(1),au(n.triggerValue)}}function FI(e,t){1&e&&Is(0,0,["*ngSwitchCase","true"])}function HI(e,t){1&e&&(vs(0,"span",9),ru(1,"\n "),hs(2,RI,2,1,"span",10),ru(3,"\n "),hs(4,FI,1,0,"ng-content",11),ru(5,"\n "),_s()),2&e&&(ms("ngSwitch",!!Ys().customTrigger),Ya(4),ms("ngSwitchCase",!0))}function jI(e,t){if(1&e){var n=Ms();ru(0,"\n "),vs(1,"div",13),ru(2,"\n "),vs(3,"div",14,15),xs("@transformPanel.done",function(e){return on(n),Ys()._panelDoneAnimatingStream.next(e.toState)})("keydown",function(e){return on(n),Ys()._handleKeydown(e)}),ru(5,"\n "),Is(6,1),ru(7,"\n "),_s(),ru(8,"\n "),_s(),ru(9,"\n")}if(2&e){var i=Ys();Ya(1),ms("@transformPanelWrap",void 0),Ya(2),cu("mat-select-panel ",i._getPanelTheme(),""),zs("transform-origin",i._transformOrigin)("font-size",i._triggerFontSize,"px"),ms("ngClass",i.panelClass)("@transformPanel",i.multiple?"showing-multiple":"showing"),ls("id",i.id+"-panel")("aria-multiselectable",i.multiple)("aria-label",i.ariaLabel||null)("aria-labelledby",i._getPanelAriaLabelledby())}}var NI=[[["mat-select-trigger"]],"*"],BI=["mat-select-trigger","*"],WI={transformPanelWrap:F_("transformPanelWrap",[V_("* => void",z_("@transformPanel",[U_()],{optional:!0}))]),transformPanel:F_("transformPanel",[B_("void",N_({transform:"scaleY(0.8)",minWidth:"100%",opacity:0})),B_("showing",N_({opacity:1,minWidth:"calc(100% + 32px)",transform:"scaleY(1)"})),B_("showing-multiple",N_({opacity:1,minWidth:"calc(100% + 64px)",transform:"scaleY(1)"})),V_("void => *",H_("120ms cubic-bezier(0, 0, 0.2, 1)")),V_("* => void",H_("100ms 25ms linear",N_({opacity:0})))])},VI=0,UI=256,zI=new Mi("mat-select-scroll-strategy"),qI=new Mi("MAT_SELECT_CONFIG"),GI={provide:zI,deps:[Dv],useFactory:function(e){return function(){return e.scrollStrategies.reposition()}}},KI=function e(t,n){s(this,e),this.source=t,this.value=n},JI=Ww(Vw(Nw(Uw(function(){return function e(t,n,i,r,a){s(this,e),this._elementRef=t,this._defaultErrorStateMatcher=n,this._parentForm=i,this._parentFormGroup=r,this.ngControl=a}}())))),ZI=new Mi("MatSelectTrigger"),$I=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275dir=bt({type:e,selectors:[["mat-select-trigger"]],features:[Du([{provide:ZI,useExisting:e}])]}),e}(),XI=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o,u,l,c,d,f,p,m,g,v){var _,y,w,k;return s(this,n),(_=t.call(this,o,a,l,c,f))._viewportRuler=e,_._changeDetectorRef=i,_._ngZone=r,_._dir=u,_._parentFormField=d,_._liveAnnouncer=g,_._defaultOptions=v,_._panelOpen=!1,_._compareWith=function(e,t){return e===t},_._uid="mat-select-".concat(VI++),_._triggerAriaLabelledBy=null,_._destroy=new z,_._onChange=function(){},_._onTouched=function(){},_._valueId="mat-select-value-".concat(VI++),_._panelDoneAnimatingStream=new z,_._overlayPanelClass=(null===(y=_._defaultOptions)||void 0===y?void 0:y.overlayPanelClass)||"",_._focused=!1,_.controlType="mat-select",_._required=!1,_._multiple=!1,_._disableOptionCentering=null!==(k=null===(w=_._defaultOptions)||void 0===w?void 0:w.disableOptionCentering)&&void 0!==k&&k,_.ariaLabel="",_.optionSelectionChanges=yk(function(){var e=_.options;return e?e.changes.pipe(Qm(e),eg(function(){return pe.apply(void 0,b(e.map(function(e){return e.onSelectionChange})))})):_._ngZone.onStable.pipe(zg(1),eg(function(){return _.optionSelectionChanges}))}),_.openedChange=new Zl,_._openedStream=_.openedChange.pipe(zm(function(e){return e}),K(function(){})),_._closedStream=_.openedChange.pipe(zm(function(e){return!e}),K(function(){})),_.selectionChange=new Zl,_.valueChange=new Zl,_.ngControl&&(_.ngControl.valueAccessor=h(_)),null!=(null==v?void 0:v.typeaheadDebounceInterval)&&(_._typeaheadDebounceInterval=v.typeaheadDebounceInterval),_._scrollStrategyFactory=m,_._scrollStrategy=_._scrollStrategyFactory(),_.tabIndex=parseInt(p)||0,_.id=_.id,_}return o(n,[{key:"focused",get:function(){return this._focused||this._panelOpen}},{key:"placeholder",get:function(){return this._placeholder},set:function(e){this._placeholder=e,this.stateChanges.next()}},{key:"required",get:function(){return this._required},set:function(e){this._required=pm(e),this.stateChanges.next()}},{key:"multiple",get:function(){return this._multiple},set:function(e){this._multiple=pm(e)}},{key:"disableOptionCentering",get:function(){return this._disableOptionCentering},set:function(e){this._disableOptionCentering=pm(e)}},{key:"compareWith",get:function(){return this._compareWith},set:function(e){this._compareWith=e,this._selectionModel&&this._initializeSelection()}},{key:"value",get:function(){return this._value},set:function(e){(e!==this._value||this._multiple&&Array.isArray(e))&&(this.options&&this._setSelectionByValue(e),this._value=e)}},{key:"typeaheadDebounceInterval",get:function(){return this._typeaheadDebounceInterval},set:function(e){this._typeaheadDebounceInterval=mm(e)}},{key:"id",get:function(){return this._id},set:function(e){this._id=e||this._uid,this.stateChanges.next()}},{key:"ngOnInit",value:function(){var e=this;this._selectionModel=new Eg(this.multiple),this.stateChanges.next(),this._panelDoneAnimatingStream.pipe(Am(),Km(this._destroy)).subscribe(function(){return e._panelDoneAnimating(e.panelOpen)})}},{key:"ngAfterContentInit",value:function(){var e=this;this._initKeyManager(),this._selectionModel.changed.pipe(Km(this._destroy)).subscribe(function(e){e.added.forEach(function(e){return e.select()}),e.removed.forEach(function(e){return e.deselect()})}),this.options.changes.pipe(Qm(null),Km(this._destroy)).subscribe(function(){e._resetOptions(),e._initializeSelection()})}},{key:"ngDoCheck",value:function(){var e=this._getTriggerAriaLabelledby();if(e!==this._triggerAriaLabelledBy){var t=this._elementRef.nativeElement;this._triggerAriaLabelledBy=e,e?t.setAttribute("aria-labelledby",e):t.removeAttribute("aria-labelledby")}this.ngControl&&this.updateErrorState()}},{key:"ngOnChanges",value:function(e){e.disabled&&this.stateChanges.next(),e.typeaheadDebounceInterval&&this._keyManager&&this._keyManager.withTypeAhead(this._typeaheadDebounceInterval)}},{key:"ngOnDestroy",value:function(){this._destroy.next(),this._destroy.complete(),this.stateChanges.complete()}},{key:"toggle",value:function(){this.panelOpen?this.close():this.open()}},{key:"open",value:function(){this._canOpen()&&(this._panelOpen=!0,this._keyManager.withHorizontalOrientation(null),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck())}},{key:"close",value:function(){this._panelOpen&&(this._panelOpen=!1,this._keyManager.withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._changeDetectorRef.markForCheck(),this._onTouched())}},{key:"writeValue",value:function(e){this.value=e}},{key:"registerOnChange",value:function(e){this._onChange=e}},{key:"registerOnTouched",value:function(e){this._onTouched=e}},{key:"setDisabledState",value:function(e){this.disabled=e,this._changeDetectorRef.markForCheck(),this.stateChanges.next()}},{key:"panelOpen",get:function(){return this._panelOpen}},{key:"selected",get:function(){return this.multiple?this._selectionModel.selected:this._selectionModel.selected[0]}},{key:"triggerValue",get:function(){if(this.empty)return"";if(this._multiple){var e=this._selectionModel.selected.map(function(e){return e.viewValue});return this._isRtl()&&e.reverse(),e.join(", ")}return this._selectionModel.selected[0].viewValue}},{key:"_isRtl",value:function(){return!!this._dir&&"rtl"===this._dir.value}},{key:"_handleKeydown",value:function(e){this.disabled||(this.panelOpen?this._handleOpenKeydown(e):this._handleClosedKeydown(e))}},{key:"_handleClosedKeydown",value:function(e){var t=e.keyCode,n=t===Xg||t===$g||37===t||39===t,i=13===t||32===t,r=this._keyManager;if(!r.isTyping()&&i&&!Qg(e)||(this.multiple||e.altKey)&&n)e.preventDefault(),this.open();else if(!this.multiple){var a=this.selected;r.onKeydown(e);var o=this.selected;o&&a!==o&&this._liveAnnouncer.announce(o.viewValue,1e4)}}},{key:"_handleOpenKeydown",value:function(e){var t=this._keyManager,n=e.keyCode,i=n===Xg||n===$g,r=t.isTyping();if(i&&e.altKey)e.preventDefault(),this.close();else if(r||13!==n&&32!==n||!t.activeItem||Qg(e))if(!r&&this._multiple&&65===n&&e.ctrlKey){e.preventDefault();var a=this.options.some(function(e){return!e.disabled&&!e.selected});this.options.forEach(function(e){e.disabled||(a?e.select():e.deselect())})}else{var o=t.activeItemIndex;t.onKeydown(e),this._multiple&&i&&e.shiftKey&&t.activeItem&&t.activeItemIndex!==o&&t.activeItem._selectViaInteraction()}else e.preventDefault(),t.activeItem._selectViaInteraction()}},{key:"_onFocus",value:function(){this.disabled||(this._focused=!0,this.stateChanges.next())}},{key:"_onBlur",value:function(){this._focused=!1,this.disabled||this.panelOpen||(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}},{key:"_onAttached",value:function(){var e=this;this._overlayDir.positionChange.pipe(zg(1)).subscribe(function(){e._changeDetectorRef.detectChanges(),e._positioningSettled()})}},{key:"_getPanelTheme",value:function(){return this._parentFormField?"mat-".concat(this._parentFormField.color):""}},{key:"empty",get:function(){return!this._selectionModel||this._selectionModel.isEmpty()}},{key:"_initializeSelection",value:function(){var e=this;Promise.resolve().then(function(){e._setSelectionByValue(e.ngControl?e.ngControl.value:e._value),e.stateChanges.next()})}},{key:"_setSelectionByValue",value:function(e){var t=this;if(this._selectionModel.selected.forEach(function(e){return e.setInactiveStyles()}),this._selectionModel.clear(),this.multiple&&e)Array.isArray(e),e.forEach(function(e){return t._selectValue(e)}),this._sortValues();else{var n=this._selectValue(e);n?this._keyManager.updateActiveItem(n):this.panelOpen||this._keyManager.updateActiveItem(-1)}this._changeDetectorRef.markForCheck()}},{key:"_selectValue",value:function(e){var t=this,n=this.options.find(function(n){if(t._selectionModel.isSelected(n))return!1;try{return null!=n.value&&t._compareWith(n.value,e)}catch(i){return!1}});return n&&this._selectionModel.select(n),n}},{key:"_initKeyManager",value:function(){var e=this;this._keyManager=new l_(this.options).withTypeAhead(this._typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl()?"rtl":"ltr").withHomeAndEnd().withAllowedModifierKeys(["shiftKey"]),this._keyManager.tabOut.pipe(Km(this._destroy)).subscribe(function(){e.panelOpen&&(!e.multiple&&e._keyManager.activeItem&&e._keyManager.activeItem._selectViaInteraction(),e.focus(),e.close())}),this._keyManager.change.pipe(Km(this._destroy)).subscribe(function(){e._panelOpen&&e.panel?e._scrollOptionIntoView(e._keyManager.activeItemIndex||0):e._panelOpen||e.multiple||!e._keyManager.activeItem||e._keyManager.activeItem._selectViaInteraction()})}},{key:"_resetOptions",value:function(){var e=this,t=pe(this.options.changes,this._destroy);this.optionSelectionChanges.pipe(Km(t)).subscribe(function(t){e._onSelect(t.source,t.isUserInput),t.isUserInput&&!e.multiple&&e._panelOpen&&(e.close(),e.focus())}),pe.apply(void 0,b(this.options.map(function(e){return e._stateChanges}))).pipe(Km(t)).subscribe(function(){e._changeDetectorRef.markForCheck(),e.stateChanges.next()})}},{key:"_onSelect",value:function(e,t){var n=this._selectionModel.isSelected(e);null!=e.value||this._multiple?(n!==e.selected&&(e.selected?this._selectionModel.select(e):this._selectionModel.deselect(e)),t&&this._keyManager.setActiveItem(e),this.multiple&&(this._sortValues(),t&&this.focus())):(e.deselect(),this._selectionModel.clear(),null!=this.value&&this._propagateChanges(e.value)),n!==this._selectionModel.isSelected(e)&&this._propagateChanges(),this.stateChanges.next()}},{key:"_sortValues",value:function(){var e=this;if(this.multiple){var t=this.options.toArray();this._selectionModel.sort(function(n,i){return e.sortComparator?e.sortComparator(n,i,t):t.indexOf(n)-t.indexOf(i)}),this.stateChanges.next()}}},{key:"_propagateChanges",value:function(e){var t;t=this.multiple?this.selected.map(function(e){return e.value}):this.selected?this.selected.value:e,this._value=t,this.valueChange.emit(t),this._onChange(t),this.selectionChange.emit(this._getChangeEvent(t)),this._changeDetectorRef.markForCheck()}},{key:"_highlightCorrectOption",value:function(){this._keyManager&&(this.empty?this._keyManager.setFirstItemActive():this._keyManager.setActiveItem(this._selectionModel.selected[0]))}},{key:"_canOpen",value:function(){var e;return!this._panelOpen&&!this.disabled&&(null===(e=this.options)||void 0===e?void 0:e.length)>0}},{key:"focus",value:function(e){this._elementRef.nativeElement.focus(e)}},{key:"_getPanelAriaLabelledby",value:function(){var e;if(this.ariaLabel)return null;var t=null===(e=this._parentFormField)||void 0===e?void 0:e.getLabelId();return this.ariaLabelledby?(t?t+" ":"")+this.ariaLabelledby:t}},{key:"_getAriaActiveDescendant",value:function(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null}},{key:"_getTriggerAriaLabelledby",value:function(){var e;if(this.ariaLabel)return null;var t=null===(e=this._parentFormField)||void 0===e?void 0:e.getLabelId(),n=(t?t+" ":"")+this._valueId;return this.ariaLabelledby&&(n+=" "+this.ariaLabelledby),n}},{key:"_panelDoneAnimating",value:function(e){this.openedChange.emit(e)}},{key:"setDescribedByIds",value:function(e){this._ariaDescribedby=e.join(" ")}},{key:"onContainerClick",value:function(){this.focus(),this.open()}},{key:"shouldLabelFloat",get:function(){return this._panelOpen||!this.empty||this._focused&&!!this._placeholder}}]),n}(JI);return e.\u0275fac=function(t){return new(t||e)(ps(Pg),ps(ll),ps(Fc),ps(zw),ps(Fu),ps(Dg,8),ps(Ep,8),ps(jp,8),ps(MI,8),ps(np,10),bi("tabindex"),ps(zI),ps(S_),ps(qI,8))},e.\u0275dir=bt({type:e,viewQuery:function(e,t){var n;1&e&&(lc(PI,5),lc(AI,5),lc(Pv,5)),2&e&&(uc(n=dc())&&(t.trigger=n.first),uc(n=dc())&&(t.panel=n.first),uc(n=dc())&&(t._overlayDir=n.first))},inputs:{ariaLabel:["aria-label","ariaLabel"],id:"id",placeholder:"placeholder",required:"required",multiple:"multiple",disableOptionCentering:"disableOptionCentering",compareWith:"compareWith",value:"value",typeaheadDebounceInterval:"typeaheadDebounceInterval",panelClass:"panelClass",ariaLabelledby:["aria-labelledby","ariaLabelledby"],errorStateMatcher:"errorStateMatcher",sortComparator:"sortComparator"},outputs:{openedChange:"openedChange",_openedStream:"opened",_closedStream:"closed",selectionChange:"selectionChange",valueChange:"valueChange"},features:[Ko,At]}),e}(),QI=function(){var e=function(e){l(n,e);var t=p(n);function n(){var e;return s(this,n),(e=t.apply(this,arguments))._scrollTop=0,e._triggerFontSize=0,e._transformOrigin="top",e._offsetY=0,e._positions=[{originX:"start",originY:"top",overlayX:"start",overlayY:"top"},{originX:"start",originY:"bottom",overlayX:"start",overlayY:"bottom"}],e}return o(n,[{key:"_calculateOverlayScroll",value:function(e,t,n){var i=this._getItemHeight();return Math.min(Math.max(0,i*e-t+i/2),n)}},{key:"ngOnInit",value:function(){var e=this;r(i(n.prototype),"ngOnInit",this).call(this),this._viewportRuler.change().pipe(Km(this._destroy)).subscribe(function(){e.panelOpen&&(e._triggerRect=e.trigger.nativeElement.getBoundingClientRect(),e._changeDetectorRef.markForCheck())})}},{key:"open",value:function(){var e=this;r(i(n.prototype),"_canOpen",this).call(this)&&(r(i(n.prototype),"open",this).call(this),this._triggerRect=this.trigger.nativeElement.getBoundingClientRect(),this._triggerFontSize=parseInt(getComputedStyle(this.trigger.nativeElement).fontSize||"0"),this._calculateOverlayPosition(),this._ngZone.onStable.pipe(zg(1)).subscribe(function(){e._triggerFontSize&&e._overlayDir.overlayRef&&e._overlayDir.overlayRef.overlayElement&&(e._overlayDir.overlayRef.overlayElement.style.fontSize="".concat(e._triggerFontSize,"px"))}))}},{key:"_scrollOptionIntoView",value:function(e){var t=gk(e,this.options,this.optionGroups),n=this._getItemHeight();this.panel.nativeElement.scrollTop=0===e&&1===t?0:vk((e+t)*n,n,this.panel.nativeElement.scrollTop,UI)}},{key:"_positioningSettled",value:function(){this._calculateOverlayOffsetX(),this.panel.nativeElement.scrollTop=this._scrollTop}},{key:"_panelDoneAnimating",value:function(e){this.panelOpen?this._scrollTop=0:(this._overlayDir.offsetX=0,this._changeDetectorRef.markForCheck()),r(i(n.prototype),"_panelDoneAnimating",this).call(this,e)}},{key:"_getChangeEvent",value:function(e){return new KI(this,e)}},{key:"_calculateOverlayOffsetX",value:function(){var e,t=this._overlayDir.overlayRef.overlayElement.getBoundingClientRect(),n=this._viewportRuler.getViewportSize(),i=this._isRtl(),r=this.multiple?56:32;if(this.multiple)e=40;else if(this.disableOptionCentering)e=16;else{var a=this._selectionModel.selected[0]||this.options.first;e=a&&a.group?32:16}i||(e*=-1);var o=0-(t.left+e-(i?r:0)),s=t.right+e-n.width+(i?0:r);o>0?e+=o+8:s>0&&(e-=s+8),this._overlayDir.offsetX=Math.round(e),this._overlayDir.overlayRef.updatePosition()}},{key:"_calculateOverlayOffsetY",value:function(e,t,n){var i,r=this._getItemHeight(),a=(r-this._triggerRect.height)/2,o=Math.floor(UI/r);return this.disableOptionCentering?0:(i=0===this._scrollTop?e*r:this._scrollTop===n?(e-(this._getItemCount()-o))*r+(r-(this._getItemCount()*r-UI)%r):t-r/2,Math.round(-1*i-a))}},{key:"_checkOverlayWithinViewport",value:function(e){var t=this._getItemHeight(),n=this._viewportRuler.getViewportSize(),i=this._triggerRect.top-8,r=n.height-this._triggerRect.bottom-8,a=Math.abs(this._offsetY),o=Math.min(this._getItemCount()*t,UI)-a-this._triggerRect.height;o>r?this._adjustPanelUp(o,r):a>i?this._adjustPanelDown(a,i,e):this._transformOrigin=this._getOriginBasedOnOption()}},{key:"_adjustPanelUp",value:function(e,t){var n=Math.round(e-t);this._scrollTop-=n,this._offsetY-=n,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop<=0&&(this._scrollTop=0,this._offsetY=0,this._transformOrigin="50% bottom 0px")}},{key:"_adjustPanelDown",value:function(e,t,n){var i=Math.round(e-t);if(this._scrollTop+=i,this._offsetY+=i,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop>=n)return this._scrollTop=n,this._offsetY=0,void(this._transformOrigin="50% top 0px")}},{key:"_calculateOverlayPosition",value:function(){var e,t=this._getItemHeight(),n=this._getItemCount(),i=Math.min(n*t,UI),r=n*t-i;e=this.empty?0:Math.max(this.options.toArray().indexOf(this._selectionModel.selected[0]),0),e+=gk(e,this.options,this.optionGroups);var a=i/2;this._scrollTop=this._calculateOverlayScroll(e,a,r),this._offsetY=this._calculateOverlayOffsetY(e,a,r),this._checkOverlayWithinViewport(r)}},{key:"_getOriginBasedOnOption",value:function(){var e=this._getItemHeight(),t=(e-this._triggerRect.height)/2,n=Math.abs(this._offsetY)-t+e/2;return"50% ".concat(n,"px 0px")}},{key:"_getItemHeight",value:function(){return 3*this._triggerFontSize}},{key:"_getItemCount",value:function(){return this.options.length+this.optionGroups.length}}]),n}(XI);return e.\u0275fac=function(){var t;return function(n){return(t||(t=_i(e)))(n||e)}}(),e.\u0275cmp=ft({type:e,selectors:[["mat-select"]],contentQueries:function(e,t,n){var i;1&e&&(cc(n,ZI,5),cc(n,mk,5),cc(n,ck,5)),2&e&&(uc(i=dc())&&(t.customTrigger=i.first),uc(i=dc())&&(t.options=i),uc(i=dc())&&(t.optionGroups=i))},hostAttrs:["role","combobox","aria-autocomplete","none","aria-haspopup","true",1,"mat-select"],hostVars:20,hostBindings:function(e,t){1&e&&xs("keydown",function(e){return t._handleKeydown(e)})("focus",function(){return t._onFocus()})("blur",function(){return t._onBlur()}),2&e&&(ls("id",t.id)("tabindex",t.tabIndex)("aria-controls",t.panelOpen?t.id+"-panel":null)("aria-expanded",t.panelOpen)("aria-label",t.ariaLabel||null)("aria-required",t.required.toString())("aria-disabled",t.disabled.toString())("aria-invalid",t.errorState)("aria-describedby",t._ariaDescribedby||null)("aria-activedescendant",t._getAriaActiveDescendant()),qs("mat-select-disabled",t.disabled)("mat-select-invalid",t.errorState)("mat-select-required",t.required)("mat-select-empty",t.empty)("mat-select-multiple",t.multiple))},inputs:{disabled:"disabled",disableRipple:"disableRipple",tabIndex:"tabIndex"},exportAs:["matSelect"],features:[Du([{provide:kI,useExisting:e},{provide:ok,useExisting:e}]),Ko],ngContentSelectors:BI,decls:18,vars:12,consts:[["cdk-overlay-origin","",1,"mat-select-trigger",3,"click"],["origin","cdkOverlayOrigin","trigger",""],[1,"mat-select-value",3,"ngSwitch"],["class","mat-select-placeholder mat-select-min-line",4,"ngSwitchCase"],["class","mat-select-value-text",3,"ngSwitch",4,"ngSwitchCase"],[1,"mat-select-arrow-wrapper"],[1,"mat-select-arrow"],["cdk-connected-overlay","","cdkConnectedOverlayLockPosition","","cdkConnectedOverlayHasBackdrop","","cdkConnectedOverlayBackdropClass","cdk-overlay-transparent-backdrop",3,"cdkConnectedOverlayPanelClass","cdkConnectedOverlayScrollStrategy","cdkConnectedOverlayOrigin","cdkConnectedOverlayOpen","cdkConnectedOverlayPositions","cdkConnectedOverlayMinWidth","cdkConnectedOverlayOffsetY","backdropClick","attach","detach"],[1,"mat-select-placeholder","mat-select-min-line"],[1,"mat-select-value-text",3,"ngSwitch"],["class","mat-select-min-line",4,"ngSwitchDefault"],[4,"ngSwitchCase"],[1,"mat-select-min-line"],[1,"mat-select-panel-wrap"],["role","listbox","tabindex","-1",3,"ngClass","keydown"],["panel",""]],template:function(e,t){if(1&e&&(As(NI),ru(0,"\n"),vs(1,"div",0,1),xs("click",function(){return t.toggle()}),ru(4,"\n "),vs(5,"div",2),ru(6,"\n "),hs(7,II,2,1,"span",3),ru(8,"\n "),hs(9,HI,6,2,"span",4),ru(10,"\n "),_s(),ru(11,"\n\n "),vs(12,"div",5),ys(13,"div",6),_s(),ru(14,"\n"),_s(),ru(15,"\n\n"),hs(16,jI,10,14,"ng-template",7),xs("backdropClick",function(){return t.close()})("attach",function(){return t._onAttached()})("detach",function(){return t.close()}),ru(17,"\n")),2&e){var n=fs(2);Ya(1),ls("aria-owns",t.panelOpen?t.id+"-panel":null),Ya(4),ms("ngSwitch",t.empty),ls("id",t._valueId),Ya(2),ms("ngSwitchCase",!0),Ya(2),ms("ngSwitchCase",!1),Ya(7),ms("cdkConnectedOverlayPanelClass",t._overlayPanelClass)("cdkConnectedOverlayScrollStrategy",t._scrollStrategy)("cdkConnectedOverlayOrigin",n)("cdkConnectedOverlayOpen",t.panelOpen)("cdkConnectedOverlayPositions",t._positions)("cdkConnectedOverlayMinWidth",null==t._triggerRect?null:t._triggerRect.width)("cdkConnectedOverlayOffsetY",t._offsetY)}},directives:[Yv,fh,ph,Pv,mh,ah],styles:['.mat-select{display:inline-block;width:100%;outline:none}.mat-select-trigger{display:inline-table;cursor:pointer;position:relative;box-sizing:border-box}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-select-value{display:table-cell;max-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{display:table-cell;vertical-align:middle}.mat-form-field-appearance-fill .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:translateY(-25%)}.mat-form-field-appearance-standard.mat-form-field-has-label .mat-select:not(.mat-select-empty) .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:none}.mat-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.mat-select-panel-wrap{flex-basis:100%}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%;border-radius:4px;outline:0}.cdk-high-contrast-active .mat-select-panel{outline:solid 1px}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable .mat-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-select-placeholder{color:transparent;-webkit-text-fill-color:transparent;transition:none;display:block}.mat-select-min-line:empty::before{content:" ";white-space:pre;width:1px;display:inline-block;opacity:0}\n'],encapsulation:2,data:{animation:[WI.transformPanelWrap,WI.transformPanel]},changeDetection:0}),e}(),eR=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[GI],imports:[[Th,Iv,_k,jw],Ag,SI,_k,jw]}),e}(),tR=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[Th,jw,Vg,ik,$v,Y_],jw]}),e}(),nR=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[jw],jw]}),e}(),iR=["panel"];function rR(e,t){if(1&e&&(ru(0,"\n "),vs(1,"div",0,1),ru(3,"\n "),Is(4),ru(5,"\n "),_s(),ru(6,"\n")),2&e){var n=t.id,i=Ys();Ya(1),ms("id",i.id)("ngClass",i._classList),ls("aria-label",i.ariaLabel||null)("aria-labelledby",i._getPanelAriaLabelledby(n))}}var aR=["*"],oR=0,sR=function e(t,n){s(this,e),this.source=t,this.option=n},uR=Ww(function(){return function e(){s(this,e)}}()),lR=new Mi("mat-autocomplete-default-options",{providedIn:"root",factory:function(){return{autoActiveFirstOption:!1}}}),cR=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a){var o;return s(this,n),(o=t.call(this))._changeDetectorRef=e,o._elementRef=i,o._activeOptionChanges=x.EMPTY,o.showPanel=!1,o._isOpen=!1,o.displayWith=null,o.optionSelected=new Zl,o.opened=new Zl,o.closed=new Zl,o.optionActivated=new Zl,o._classList={},o.id="mat-autocomplete-".concat(oR++),o.inertGroups=(null==a?void 0:a.SAFARI)||!1,o._autoActiveFirstOption=!!r.autoActiveFirstOption,o}return o(n,[{key:"isOpen",get:function(){return this._isOpen&&this.showPanel}},{key:"autoActiveFirstOption",get:function(){return this._autoActiveFirstOption},set:function(e){this._autoActiveFirstOption=pm(e)}},{key:"classList",set:function(e){this._classList=e&&e.length?function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:/\s+/,n=[];if(null!=e){var i,r=v(Array.isArray(e)?e:"".concat(e).split(t));try{for(r.s();!(i=r.n()).done;){var a="".concat(i.value).trim();a&&n.push(a)}}catch(o){r.e(o)}finally{r.f()}}return n}(e).reduce(function(e,t){return e[t]=!0,e},{}):{},this._setVisibilityClasses(this._classList),this._elementRef.nativeElement.className=""}},{key:"ngAfterContentInit",value:function(){var e=this;this._keyManager=new l_(this.options).withWrap(),this._activeOptionChanges=this._keyManager.change.subscribe(function(t){e.optionActivated.emit({source:e,option:e.options.toArray()[t]||null})}),this._setVisibility()}},{key:"ngOnDestroy",value:function(){this._activeOptionChanges.unsubscribe()}},{key:"_setScrollTop",value:function(e){this.panel&&(this.panel.nativeElement.scrollTop=e)}},{key:"_getScrollTop",value:function(){return this.panel?this.panel.nativeElement.scrollTop:0}},{key:"_setVisibility",value:function(){this.showPanel=!!this.options.length,this._setVisibilityClasses(this._classList),this._changeDetectorRef.markForCheck()}},{key:"_emitSelectEvent",value:function(e){var t=new sR(this,e);this.optionSelected.emit(t)}},{key:"_getPanelAriaLabelledby",value:function(e){return this.ariaLabel?null:this.ariaLabelledby?(e?e+" ":"")+this.ariaLabelledby:e}},{key:"_setVisibilityClasses",value:function(e){e[this._visibleClass]=this.showPanel,e[this._hiddenClass]=!this.showPanel}}]),n}(uR);return e.\u0275fac=function(t){return new(t||e)(ps(ll),ps(Fu),ps(lR),ps(yg))},e.\u0275dir=bt({type:e,viewQuery:function(e,t){var n;1&e&&(lc(pl,7),lc(iR,5)),2&e&&(uc(n=dc())&&(t.template=n.first),uc(n=dc())&&(t.panel=n.first))},inputs:{displayWith:"displayWith",autoActiveFirstOption:"autoActiveFirstOption",classList:["class","classList"],ariaLabel:["aria-label","ariaLabel"],ariaLabelledby:["aria-labelledby","ariaLabelledby"],panelWidth:"panelWidth"},outputs:{optionSelected:"optionSelected",opened:"opened",closed:"closed",optionActivated:"optionActivated"},features:[Ko]}),e}(),dR=function(){var e=function(e){l(n,e);var t=p(n);function n(){var e;return s(this,n),(e=t.apply(this,arguments))._visibleClass="mat-autocomplete-visible",e._hiddenClass="mat-autocomplete-hidden",e}return n}(cR);return e.\u0275fac=function(){var t;return function(n){return(t||(t=_i(e)))(n||e)}}(),e.\u0275cmp=ft({type:e,selectors:[["mat-autocomplete"]],contentQueries:function(e,t,n){var i;1&e&&(cc(n,ck,5),cc(n,mk,5)),2&e&&(uc(i=dc())&&(t.optionGroups=i),uc(i=dc())&&(t.options=i))},hostAttrs:[1,"mat-autocomplete"],inputs:{disableRipple:"disableRipple"},exportAs:["matAutocomplete"],features:[Du([{provide:ok,useExisting:e}]),Ko],ngContentSelectors:aR,decls:2,vars:0,consts:[["role","listbox",1,"mat-autocomplete-panel",3,"id","ngClass"],["panel",""]],template:function(e,t){1&e&&(As(),hs(0,rR,7,4,"ng-template"),ru(1,"\n"))},directives:[ah],styles:[".mat-autocomplete-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;visibility:hidden;max-width:none;max-height:256px;position:relative;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.mat-autocomplete-panel.mat-autocomplete-visible{visibility:visible}.mat-autocomplete-panel.mat-autocomplete-hidden{visibility:hidden}.mat-autocomplete-panel-above .mat-autocomplete-panel{border-radius:0;border-top-left-radius:4px;border-top-right-radius:4px}.mat-autocomplete-panel .mat-divider-horizontal{margin-top:-1px}.cdk-high-contrast-active .mat-autocomplete-panel{outline:solid 1px}mat-autocomplete{display:none}\n"],encapsulation:2,changeDetection:0}),e}(),hR=new Mi("mat-autocomplete-scroll-strategy"),fR={provide:hR,deps:[Dv],useFactory:function(e){return function(){return e.scrollStrategies.reposition()}}},pR={provide:Mf,useExisting:Te(function(){return gR}),multi:!0},mR=function(){var e=function(){function e(t,n,i,r,a,o,u,l,c,d,h){var f=this;s(this,e),this._element=t,this._overlay=n,this._viewContainerRef=i,this._zone=r,this._changeDetectorRef=a,this._dir=u,this._formField=l,this._document=c,this._viewportRuler=d,this._defaults=h,this._componentDestroyed=!1,this._autocompleteDisabled=!1,this._manuallyFloatingLabel=!1,this._viewportSubscription=x.EMPTY,this._canOpenOnNextFocus=!0,this._closeKeyEventStream=new z,this._windowBlurHandler=function(){f._canOpenOnNextFocus=f._document.activeElement!==f._element.nativeElement||f.panelOpen},this._onChange=function(){},this._onTouched=function(){},this.position="auto",this.autocompleteAttribute="off",this._overlayAttached=!1,this.optionSelections=yk(function(){return f.autocomplete&&f.autocomplete.options?pe.apply(void 0,b(f.autocomplete.options.map(function(e){return e.onSelectionChange}))):f._zone.onStable.pipe(zg(1),eg(function(){return f.optionSelections}))}),this._scrollStrategy=o}return o(e,[{key:"autocompleteDisabled",get:function(){return this._autocompleteDisabled},set:function(e){this._autocompleteDisabled=pm(e)}},{key:"ngAfterViewInit",value:function(){var e=this,t=this._getWindow();void 0!==t&&this._zone.runOutsideAngular(function(){return t.addEventListener("blur",e._windowBlurHandler)})}},{key:"ngOnChanges",value:function(e){e.position&&this._positionStrategy&&(this._setStrategyPositions(this._positionStrategy),this.panelOpen&&this._overlayRef.updatePosition())}},{key:"ngOnDestroy",value:function(){var e=this._getWindow();void 0!==e&&e.removeEventListener("blur",this._windowBlurHandler),this._viewportSubscription.unsubscribe(),this._componentDestroyed=!0,this._destroyPanel(),this._closeKeyEventStream.complete()}},{key:"panelOpen",get:function(){return this._overlayAttached&&this.autocomplete.showPanel}},{key:"openPanel",value:function(){this._attachOverlay(),this._floatLabel()}},{key:"closePanel",value:function(){this._resetLabel(),this._overlayAttached&&(this.panelOpen&&this.autocomplete.closed.emit(),this.autocomplete._isOpen=this._overlayAttached=!1,this._overlayRef&&this._overlayRef.hasAttached()&&(this._overlayRef.detach(),this._closingActionsSubscription.unsubscribe()),this._componentDestroyed||this._changeDetectorRef.detectChanges())}},{key:"updatePosition",value:function(){this._overlayAttached&&this._overlayRef.updatePosition()}},{key:"panelClosingActions",get:function(){var e=this;return pe(this.optionSelections,this.autocomplete._keyManager.tabOut.pipe(zm(function(){return e._overlayAttached})),this._closeKeyEventStream,this._getOutsideClickStream(),this._overlayRef?this._overlayRef.detachments().pipe(zm(function(){return e._overlayAttached})):bm()).pipe(K(function(e){return e instanceof fk?e:null}))}},{key:"activeOption",get:function(){return this.autocomplete&&this.autocomplete._keyManager?this.autocomplete._keyManager.activeItem:null}},{key:"_getOutsideClickStream",value:function(){var e=this;return pe(wm(this._document,"click"),wm(this._document,"auxclick"),wm(this._document,"touchend")).pipe(zm(function(t){var n=xg(t),i=e._formField?e._formField._elementRef.nativeElement:null,r=e.connectedTo?e.connectedTo.elementRef.nativeElement:null;return e._overlayAttached&&n!==e._element.nativeElement&&(!i||!i.contains(n))&&(!r||!r.contains(n))&&!!e._overlayRef&&!e._overlayRef.overlayElement.contains(n)}))}},{key:"writeValue",value:function(e){var t=this;Promise.resolve(null).then(function(){return t._setTriggerValue(e)})}},{key:"registerOnChange",value:function(e){this._onChange=e}},{key:"registerOnTouched",value:function(e){this._onTouched=e}},{key:"setDisabledState",value:function(e){this._element.nativeElement.disabled=e}},{key:"_handleKeydown",value:function(e){var t=e.keyCode;if(t!==Zg||Qg(e)||e.preventDefault(),this.activeOption&&13===t&&this.panelOpen)this.activeOption._selectViaInteraction(),this._resetActiveItem(),e.preventDefault();else if(this.autocomplete){var n=this.autocomplete._keyManager.activeItem,i=t===$g||t===Xg;this.panelOpen||9===t?this.autocomplete._keyManager.onKeydown(e):i&&this._canOpen()&&this.openPanel(),(i||this.autocomplete._keyManager.activeItem!==n)&&this._scrollToOption(this.autocomplete._keyManager.activeItemIndex||0)}}},{key:"_handleInput",value:function(e){var t=e.target,n=t.value;"number"===t.type&&(n=""==n?null:parseFloat(n)),this._previousValue!==n&&(this._previousValue=n,this._onChange(n),this._canOpen()&&this._document.activeElement===e.target&&this.openPanel())}},{key:"_handleFocus",value:function(){this._canOpenOnNextFocus?this._canOpen()&&(this._previousValue=this._element.nativeElement.value,this._attachOverlay(),this._floatLabel(!0)):this._canOpenOnNextFocus=!0}},{key:"_floatLabel",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this._formField&&"auto"===this._formField.floatLabel&&(e?this._formField._animateAndLockLabel():this._formField.floatLabel="always",this._manuallyFloatingLabel=!0)}},{key:"_resetLabel",value:function(){this._manuallyFloatingLabel&&(this._formField.floatLabel="auto",this._manuallyFloatingLabel=!1)}},{key:"_subscribeToClosingActions",value:function(){var e=this;return pe(this._zone.onStable.pipe(zg(1)),this.autocomplete.options.changes.pipe(Hv(function(){return e._positionStrategy.reapplyLastPosition()}),EM(0))).pipe(eg(function(){var t=e.panelOpen;return e._resetActiveItem(),e.autocomplete._setVisibility(),e.panelOpen&&(e._overlayRef.updatePosition(),t!==e.panelOpen&&e.autocomplete.opened.emit()),e.panelClosingActions}),zg(1)).subscribe(function(t){return e._setValueAndClose(t)})}},{key:"_destroyPanel",value:function(){this._overlayRef&&(this.closePanel(),this._overlayRef.dispose(),this._overlayRef=null)}},{key:"_setTriggerValue",value:function(e){var t=this.autocomplete&&this.autocomplete.displayWith?this.autocomplete.displayWith(e):e,n=null!=t?t:"";this._formField?this._formField._control.value=n:this._element.nativeElement.value=n,this._previousValue=n}},{key:"_setValueAndClose",value:function(e){e&&e.source&&(this._clearPreviousSelectedOption(e.source),this._setTriggerValue(e.source.value),this._onChange(e.source.value),this._element.nativeElement.focus(),this.autocomplete._emitSelectEvent(e.source)),this.closePanel()}},{key:"_clearPreviousSelectedOption",value:function(e){this.autocomplete.options.forEach(function(t){t!==e&&t.selected&&t.deselect()})}},{key:"_attachOverlay",value:function(){var e,t=this,n=this._overlayRef;n?(this._positionStrategy.setOrigin(this._getConnectedElement()),n.updateSize({width:this._getPanelWidth()})):(this._portal=new Hg(this.autocomplete.template,this._viewContainerRef,{id:null===(e=this._formField)||void 0===e?void 0:e.getLabelId()}),n=this._overlay.create(this._getOverlayConfig()),this._overlayRef=n,n.keydownEvents().subscribe(function(e){(e.keyCode===Zg&&!Qg(e)||e.keyCode===$g&&Qg(e,"altKey"))&&(t._resetActiveItem(),t._closeKeyEventStream.next(),e.stopPropagation(),e.preventDefault())}),this._viewportSubscription=this._viewportRuler.change().subscribe(function(){t.panelOpen&&n&&n.updateSize({width:t._getPanelWidth()})})),n&&!n.hasAttached()&&(n.attach(this._portal),this._closingActionsSubscription=this._subscribeToClosingActions());var i=this.panelOpen;this.autocomplete._setVisibility(),this.autocomplete._isOpen=this._overlayAttached=!0,this.panelOpen&&i!==this.panelOpen&&this.autocomplete.opened.emit()}},{key:"_getOverlayConfig",value:function(){var e;return new uv({positionStrategy:this._getOverlayPosition(),scrollStrategy:this._scrollStrategy(),width:this._getPanelWidth(),direction:this._dir,panelClass:null===(e=this._defaults)||void 0===e?void 0:e.overlayPanelClass})}},{key:"_getOverlayPosition",value:function(){var e=this._overlay.position().flexibleConnectedTo(this._getConnectedElement()).withFlexibleDimensions(!1).withPush(!1);return this._setStrategyPositions(e),this._positionStrategy=e,e}},{key:"_setStrategyPositions",value:function(e){var t,n=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],i=this._aboveClass,r=[{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",panelClass:i},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",panelClass:i}];t="above"===this.position?r:"below"===this.position?n:[].concat(n,r),e.withPositions(t)}},{key:"_getConnectedElement",value:function(){return this.connectedTo?this.connectedTo.elementRef:this._formField?this._formField.getConnectedOverlayOrigin():this._element}},{key:"_getPanelWidth",value:function(){return this.autocomplete.panelWidth||this._getHostWidth()}},{key:"_getHostWidth",value:function(){return this._getConnectedElement().nativeElement.getBoundingClientRect().width}},{key:"_resetActiveItem",value:function(){var e=this.autocomplete;e.autoActiveFirstOption?e._keyManager.setFirstItemActive():e._keyManager.setActiveItem(-1)}},{key:"_canOpen",value:function(){var e=this._element.nativeElement;return!e.readOnly&&!e.disabled&&!this._autocompleteDisabled}},{key:"_getWindow",value:function(){var e;return(null===(e=this._document)||void 0===e?void 0:e.defaultView)||window}},{key:"_scrollToOption",value:function(e){var t=this.autocomplete,n=gk(e,t.options,t.optionGroups);if(0===e&&1===n)t._setScrollTop(0);else if(t.panel){var i=t.options.toArray()[e];if(i){var r=i._getHostElement(),a=vk(r.offsetTop,r.offsetHeight,t._getScrollTop(),t.panel.nativeElement.offsetHeight);t._setScrollTop(a)}}}}]),e}();return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(Dv),ps(bl),ps(Fc),ps(ll),ps(hR),ps(Dg,8),ps(MI,9),ps(yd,8),ps(Pg),ps(lR,8))},e.\u0275dir=bt({type:e,inputs:{position:["matAutocompletePosition","position"],autocompleteAttribute:["autocomplete","autocompleteAttribute"],autocompleteDisabled:["matAutocompleteDisabled","autocompleteDisabled"],autocomplete:["matAutocomplete","autocomplete"],connectedTo:["matAutocompleteConnectedTo","connectedTo"]},features:[At]}),e}(),gR=function(){var e=function(e){l(n,e);var t=p(n);function n(){var e;return s(this,n),(e=t.apply(this,arguments))._aboveClass="mat-autocomplete-panel-above",e}return n}(mR);return e.\u0275fac=function(){var t;return function(n){return(t||(t=_i(e)))(n||e)}}(),e.\u0275dir=bt({type:e,selectors:[["input","matAutocomplete",""],["textarea","matAutocomplete",""]],hostAttrs:[1,"mat-autocomplete-trigger"],hostVars:7,hostBindings:function(e,t){1&e&&xs("focusin",function(){return t._handleFocus()})("blur",function(){return t._onTouched()})("input",function(e){return t._handleInput(e)})("keydown",function(e){return t._handleKeydown(e)}),2&e&&ls("autocomplete",t.autocompleteAttribute)("role",t.autocompleteDisabled?null:"combobox")("aria-autocomplete",t.autocompleteDisabled?null:"list")("aria-activedescendant",t.panelOpen&&t.activeOption?t.activeOption.id:null)("aria-expanded",t.autocompleteDisabled?null:t.panelOpen.toString())("aria-owns",t.autocompleteDisabled||!t.panelOpen||null==t.autocomplete?null:t.autocomplete.id)("aria-haspopup",!t.autocompleteDisabled)},exportAs:["matAutocompleteTrigger"],features:[Du([pR]),Ko]}),e}(),vR=function(){var e=function e(){s(this,e)};return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({providers:[fR],imports:[[Iv,_k,jw,Th],Ag,_k,jw]}),e}(),_R=["sliderWrapper"],yR=Mg({passive:!1}),bR={provide:Mf,useExisting:Te(function(){return MR}),multi:!0},wR=function e(){s(this,e)},kR=Vw(Bw(Nw(function(){return function e(t){s(this,e),this._elementRef=t}}()),"accent")),MR=function(){var e=function(e){l(n,e);var t=p(n);function n(e,i,r,a,o,u,l,c){var d;return s(this,n),(d=t.call(this,e))._focusMonitor=i,d._changeDetectorRef=r,d._dir=a,d._ngZone=u,d._animationMode=c,d._invert=!1,d._max=100,d._min=0,d._step=1,d._thumbLabel=!1,d._tickInterval=0,d._value=null,d._vertical=!1,d.change=new Zl,d.input=new Zl,d.valueChange=new Zl,d.onTouched=function(){},d._percent=0,d._isSliding=null,d._isActive=!1,d._tickIntervalPercent=0,d._sliderDimensions=null,d._controlValueAccessorChangeFn=function(){},d._dirChangeSubscription=x.EMPTY,d._pointerDown=function(e){d.disabled||d._isSliding||!SR(e)&&0!==e.button||d._ngZone.run(function(){d._touchId=SR(e)?function(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:this.value,t=new wR;return t.source=this,t.value=e,t}},{key:"_calculatePercentage",value:function(e){return((e||0)-this.min)/(this.max-this.min)}},{key:"_calculateValue",value:function(e){return this.min+e*(this.max-this.min)}},{key:"_clamp",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return Math.max(t,Math.min(e,n))}},{key:"_getSliderDimensions",value:function(){return this._sliderWrapper?this._sliderWrapper.nativeElement.getBoundingClientRect():null}},{key:"_focusHostElement",value:function(e){this._elementRef.nativeElement.focus(e)}},{key:"_blurHostElement",value:function(){this._elementRef.nativeElement.blur()}},{key:"writeValue",value:function(e){this.value=e}},{key:"registerOnChange",value:function(e){this._controlValueAccessorChangeFn=e}},{key:"registerOnTouched",value:function(e){this.onTouched=e}},{key:"setDisabledState",value:function(e){this.disabled=e}}]),n}(kR);return e.\u0275fac=function(t){return new(t||e)(ps(Fu),ps(x_),ps(ll),ps(Dg,8),bi("tabindex"),ps(Fc),ps(yd),ps(Tw,8))},e.\u0275cmp=ft({type:e,selectors:[["mat-slider"]],viewQuery:function(e,t){var n;1&e&&lc(_R,5),2&e&&uc(n=dc())&&(t._sliderWrapper=n.first)},hostAttrs:["role","slider",1,"mat-slider","mat-focus-indicator"],hostVars:29,hostBindings:function(e,t){1&e&&xs("focus",function(){return t._onFocus()})("blur",function(){return t._onBlur()})("keydown",function(e){return t._onKeydown(e)})("keyup",function(){return t._onKeyup()})("mouseenter",function(){return t._onMouseenter()})("selectstart",function(e){return e.preventDefault()}),2&e&&(du("tabIndex",t.tabIndex),ls("aria-disabled",t.disabled)("aria-valuemax",t.max)("aria-valuemin",t.min)("aria-valuenow",t.value)("aria-valuetext",null==t.valueText?t.displayValue:t.valueText)("aria-orientation",t.vertical?"vertical":"horizontal"),qs("mat-slider-disabled",t.disabled)("mat-slider-has-ticks",t.tickInterval)("mat-slider-horizontal",!t.vertical)("mat-slider-axis-inverted",t._shouldInvertAxis())("mat-slider-invert-mouse-coords",t._shouldInvertMouseCoords())("mat-slider-sliding",t._isSliding)("mat-slider-thumb-label-showing",t.thumbLabel)("mat-slider-vertical",t.vertical)("mat-slider-min-value",t._isMinValue())("mat-slider-hide-last-tick",t.disabled||t._isMinValue()&&t._getThumbGap()&&t._shouldInvertAxis())("_mat-animation-noopable","NoopAnimations"===t._animationMode))},inputs:{disabled:"disabled",color:"color",tabIndex:"tabIndex",invert:"invert",max:"max",min:"min",step:"step",thumbLabel:"thumbLabel",tickInterval:"tickInterval",value:"value",vertical:"vertical",displayWith:"displayWith",valueText:"valueText"},outputs:{change:"change",input:"input",valueChange:"valueChange"},exportAs:["matSlider"],features:[Du([bR]),Ko],decls:29,vars:6,consts:[[1,"mat-slider-wrapper"],["sliderWrapper",""],[1,"mat-slider-track-wrapper"],[1,"mat-slider-track-background",3,"ngStyle"],[1,"mat-slider-track-fill",3,"ngStyle"],[1,"mat-slider-ticks-container",3,"ngStyle"],[1,"mat-slider-ticks",3,"ngStyle"],[1,"mat-slider-thumb-container",3,"ngStyle"],[1,"mat-slider-focus-ring"],[1,"mat-slider-thumb"],[1,"mat-slider-thumb-label"],[1,"mat-slider-thumb-label-text"]],template:function(e,t){1&e&&(vs(0,"div",0,1),ru(2,"\n "),vs(3,"div",2),ru(4,"\n "),ys(5,"div",3),ru(6,"\n "),ys(7,"div",4),ru(8,"\n "),_s(),ru(9,"\n "),vs(10,"div",5),ru(11,"\n "),ys(12,"div",6),ru(13,"\n "),_s(),ru(14,"\n "),vs(15,"div",7),ru(16,"\n "),ys(17,"div",8),ru(18,"\n "),ys(19,"div",9),ru(20,"\n "),vs(21,"div",10),ru(22,"\n "),vs(23,"span",11),ru(24),_s(),ru(25,"\n "),_s(),ru(26,"\n "),_s(),ru(27,"\n"),_s(),ru(28,"\n")),2&e&&(Ya(5),ms("ngStyle",t._getTrackBackgroundStyles()),Ya(2),ms("ngStyle",t._getTrackFillStyles()),Ya(3),ms("ngStyle",t._getTicksContainerStyles()),Ya(2),ms("ngStyle",t._getTicksStyles()),Ya(3),ms("ngStyle",t._getThumbContainerStyles()),Ya(9),au(t.displayValue))},directives:[gh],styles:['.mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:none;vertical-align:middle}.mat-slider:not(.mat-slider-disabled):active,.mat-slider.mat-slider-sliding:not(.mat-slider-disabled){cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-wrapper{-webkit-print-color-adjust:exact;color-adjust:exact;position:absolute}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{-webkit-background-clip:content-box;background-clip:content-box;background-repeat:repeat;box-sizing:border-box;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider.cdk-keyboard-focused .mat-slider-focus-ring,.mat-slider.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled):not(.mat-slider-sliding) .mat-slider-thumb{cursor:-webkit-grab;cursor:grab}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(0.7);transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),border-radius 400ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.cdk-high-contrast-active .mat-slider-thumb-label{outline:solid 1px}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-sliding .mat-slider-track-fill,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-thumb-container{transition-duration:0ms}.mat-slider-has-ticks .mat-slider-wrapper::after{content:"";position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{display:none}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(0.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.cdk-high-contrast-active .mat-slider-horizontal .mat-slider-ticks-container{height:0;outline:solid 2px;top:1px}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(0.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label,.cdk-high-contrast-active .mat-slider-horizontal.cdk-focused .mat-slider-thumb-label-text{transform:none}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.cdk-high-contrast-active .mat-slider-vertical .mat-slider-ticks-container{width:0;outline:solid 2px;left:1px}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(0.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}.mat-slider._mat-animation-noopable .mat-slider-track-fill,.mat-slider._mat-animation-noopable .mat-slider-track-background,.mat-slider._mat-animation-noopable .mat-slider-ticks,.mat-slider._mat-animation-noopable .mat-slider-thumb-container,.mat-slider._mat-animation-noopable .mat-slider-focus-ring,.mat-slider._mat-animation-noopable .mat-slider-thumb,.mat-slider._mat-animation-noopable .mat-slider-thumb-label,.mat-slider._mat-animation-noopable .mat-slider-thumb-label-text,.mat-slider._mat-animation-noopable .mat-slider-has-ticks .mat-slider-wrapper::after{transition:none}\n'],encapsulation:2,changeDetection:0}),e}();function SR(e){return"t"===e.type[0]}function CR(e,t){var n;return(n=SR(e)?"number"==typeof t?LR(e.touches,t)||LR(e.changedTouches,t):e.touches[0]||e.changedTouches[0]:e)?{x:n.clientX,y:n.clientY}:void 0}function LR(e,t){for(var n=0;n0),Ya(2),ms("ngIf",0===n.addresses.length)}}var PR=function(){return function(){this.addresses=[]}}(),AR=function(){function e(e,t){var n=this;this.dialogRef=e,this.balanceAndOutputsService=t,this.listElements=[],this.balanceAndOutputsService.walletsWithBalance.pipe(eS()).subscribe(function(e){e.forEach(function(e){var t=new PR;t.label=e.label,e.addresses.forEach(function(n){e.isHardware&&!n.confirmed||t.addresses.push({address:n.address,coins:n.coins,hours:n.hours})}),n.listElements.push(t)})})}return e.openDialog=function(t){var n=new wk;return n.autoFocus=!1,n.width=jM.mediumModalWidth,t.open(e,n)},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.select=function(e){this.dialogRef.close(e)},e.\u0275fac=function(t){return new(t||e)(ps(Lk),ps(_O))},e.\u0275cmp=ft({type:e,selectors:[["app-select-address"]],decls:6,vars:5,consts:[[3,"headline","dialog"],["class","wallet-container list-button-container light-button-theme",4,"ngFor","ngForOf"],[1,"wallet-container","list-button-container","light-button-theme"],[1,"title",3,"title"],[4,"ngIf"],[4,"ngFor","ngForOf"],["mat-button","","color","primary",3,"click"],[1,"address"],[1,"balance"],[1,"grey-text"],[1,"no-addresses-msg"],[3,"inline"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),hs(3,YR,9,4,"div",1),ru(4,"\n"),_s(),ru(5,"\n")),2&e&&(ms("headline",Vl(1,3,"select-address.title"))("dialog",t.dialogRef),Ya(3),ms("ngForOf",t.listElements))},directives:[jk,sh,lh,SC,WC],pipes:[hM,NS],styles:[".wallet-container[_ngcontent-%COMP%]{padding-top:30px}.wallet-container[_ngcontent-%COMP%]:first-child{padding-top:0}.wallet-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{color:#1e2227;border-bottom:1px solid rgba(30,34,39,.05);padding:0 10px;font-size:18px;line-height:1.8;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.wallet-container[_ngcontent-%COMP%] .address[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}.wallet-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%]{font-size:12px;line-height:1.5;color:#1e2227}.wallet-container[_ngcontent-%COMP%] .no-addresses-msg[_ngcontent-%COMP%]{padding:10px}.wallet-container[_ngcontent-%COMP%] .no-addresses-msg[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:5px;position:relative;top:2px}"]}),e}(),IR=["button"],RR=function(){function e(t,n,i,r,a){this.dialogRef=t,this.data=n,this.formBuilder=i,this.msgBarService=r,this.storageService=a,this.maxNoteChars=e.MAX_NOTE_CHARS,this.busy=!1}return e.openDialog=function(t,n){var i=new wk;return i.data=n,i.autoFocus=!0,i.width=jM.mediumModalWidth,t.open(e,i)},e.prototype.ngOnInit=function(){this.originalNote=this.data.note?this.data.note:"",this.form=this.formBuilder.group({note:[this.data.note]})},e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.OperationSubscription&&this.OperationSubscription.unsubscribe()},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.changeNote=function(){var e=this;if(!this.busy){var t=this.form.value.note?this.form.value.note.trim():"";this.originalNote!==t?(this.busy=!0,this.msgBarService.hide(),this.button.setLoading(),this.OperationSubscription=this.storageService.store(yL.NOTES,this.data.id,t).subscribe(function(){e.busy=!1,e.dialogRef.close(t)},function(t){e.busy=!1,e.msgBarService.showError(t),e.button.resetState().setEnabled()})):this.closePopup()}},e.MAX_NOTE_CHARS=64,e.\u0275fac=function(t){return new(t||e)(ps(Lk),ps(Tk),ps(fm),ps(dL),ps(bL))},e.\u0275cmp=ft({type:e,selectors:[["app-change-note"]],viewQuery:function(e,t){var n;1&e&&lc(IR,5),2&e&&uc(n=dc())&&(t.button=n.first)},decls:34,vars:20,consts:[[3,"headline","dialog","disableDismiss"],[3,"formGroup"],[1,"form-field"],["for","note"],[1,"help-icon",3,"matTooltip"],["formControlName","note","id","note",3,"maxlength","keydown.enter"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"action"],["button",""]],template:function(e,t){if(1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),vs(4,"div",1),ru(5,"\n "),vs(6,"div",2),ru(7,"\n "),vs(8,"label",3),ru(9),Wl(10,"translate"),vs(11,"mat-icon",4),Wl(12,"translate"),ru(13,"help"),_s(),ru(14,"\n "),_s(),ru(15,"\n "),vs(16,"input",5),xs("keydown.enter",function(){return t.changeNote()}),_s(),ru(17,"\n "),_s(),ru(18,"\n "),_s(),ru(19,"\n "),ru(20,"\n "),vs(21,"div",6),ru(22,"\n "),vs(23,"app-button",7),xs("action",function(){return t.closePopup()}),ru(24),Wl(25,"translate"),_s(),ru(26,"\n "),vs(27,"app-button",8,9),xs("action",function(){return t.changeNote()}),ru(29),Wl(30,"translate"),_s(),ru(31,"\n "),_s(),ru(32,"\n"),_s(),ru(33,"\n")),2&e){var n=fs(28);ms("headline",Vl(1,10,"edit-note.title"))("dialog",t.dialogRef)("disableDismiss",n&&n.isLoading()),Ya(4),ms("formGroup",t.form),Ya(5),ou("\n ",Vl(10,12,"send.personal-note-label"),"\n "),Ya(2),ms("matTooltip",Vl(12,14,"send.personal-note-help")),Ya(5),ms("maxlength",t.maxNoteChars),ls("disabled",t.busy?"true":null),Ya(8),ou("\n ",Vl(25,16,"common.cancel-button"),"\n "),Ya(5),ou("\n ",Vl(30,18,"edit-note.change-button"),"\n ")}},directives:[jk,ap,jp,WC,YO,Lf,rp,qp,lm,ZC],pipes:[hM],styles:[""]}),e}(),FR=function(){function e(e,t,n,i){this.dialogRef=e,this.data=t,this.formBuilder=n,this.msgBarService=i,this.inputErrorMsg=""}return e.openDialog=function(t,n){var i=new wk;return i.data=n,i.autoFocus=!0,i.width=jM.mediumModalWidth,t.open(e,i)},e.prototype.ngOnInit=function(){this.form=this.formBuilder.group({data:[this.data]}),this.form.setValidators(this.validateForm.bind(this))},e.prototype.ngOnDestroy=function(){this.msgBarService.hide()},e.prototype.processData=function(){try{if(0===this.form.value.data.trim().length)return void this.msgBarService.showError("send.bulk-send.no-data-error");var e=this.form.value.data.split(/\r?\n/);if(!e||0===e.length)return void this.msgBarService.showError("send.bulk-send.no-data-error");var t=(e=e.filter(function(e){return e.trim().length>0}))[0].split(",").length;if(2!==t&&3!==t)return void this.msgBarService.showError("send.bulk-send.invalid-data-error");var n=[],i=!0;if(e.forEach(function(e){var r=e.split(","),a={address:r[0].trim(),coins:r[1].trim(),originalAmount:null};a.hours=3===r.length?r[2].trim():void 0,n.push(a),r.length!==t&&(i=!1)}),!i)return void this.msgBarService.showError("send.bulk-send.inconsistent-data-error");this.dialogRef.close(n)}catch(r){this.msgBarService.showError("send.bulk-send.invalid-data-error")}},e.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0;return this.form.get("data").value&&this.form.get("data").value.trim()||(e=!1,this.form.get("data").touched&&(this.inputErrorMsg="send.bulk-send.data-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ps(Lk),ps(Tk),ps(fm),ps(dL))},e.\u0275cmp=ft({type:e,selectors:[["app-multiple-destinations-dialog"]],decls:20,vars:13,consts:[[3,"headline","dialog"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],["formControlName","data","id","data","rows","5",3,"appFormFieldError","blur"],[1,"-buttons"],[1,"primary-button",3,"disabled","action"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2),Wl(3,"translate"),vs(4,"div",1),ru(5,"\n "),vs(6,"div",2),ru(7,"\n "),vs(8,"textarea",3),xs("blur",function(){return t.validateForm()}),_s(),ru(9,"\n "),_s(),ru(10,"\n "),_s(),ru(11,"\n "),vs(12,"div",4),ru(13,"\n "),vs(14,"app-button",5),xs("action",function(){return t.processData()}),ru(15),Wl(16,"translate"),_s(),ru(17,"\n "),_s(),ru(18,"\n"),_s(),ru(19,"\n")),2&e&&(ms("headline",Vl(1,7,"send.bulk-send.title"))("dialog",t.dialogRef),Ya(2),ou("\n ",Vl(3,9,"send.bulk-send.indications"),"\n "),Ya(2),ms("formGroup",t.form),Ya(4),ms("appFormFieldError",t.inputErrorMsg),Ya(6),ms("disabled",!t.form.valid),Ya(1),ou("\n ",Vl(16,11,"send.bulk-send.process-button"),"\n "))},directives:[jk,ap,jp,Lf,rp,qp,RO,ZC],pipes:[hM],styles:[""]}),e}();function HR(e,t){if(1&e){var n=Ms();vs(0,"div",2),ru(1,"\n "),vs(2,"label",3),ru(3),Wl(4,"translate"),vs(5,"mat-icon",4),Wl(6,"translate"),ru(7,"help"),_s(),ru(8,"\n "),_s(),ru(9,"\n "),vs(10,"input",5),xs("blur",function(){return on(n),Ys().validateForm()}),_s(),ru(11,"\n "),_s()}if(2&e){var i=Ys();Ya(3),ou("\n ",Vl(4,4,"send.addresses-label"),"\n "),Ya(2),ms("matTooltip",Vl(6,6,"send.addresses-manual-help")),Ya(5),ms("appFormFieldError",i.manualAddressesErrorMsg),ls("disabled",i.busy?"true":null)}}function jR(e,t){if(1&e&&(bs(0),ru(1,"\n "),vs(2,"option",12),ru(3),Wl(4,"amount"),Wl(5,"amount"),_s(),ru(6,"\n "),ws()),2&e){var n=t.$implicit;Ya(2),ms("disabled",!n.coins||n.coins.isLessThanOrEqualTo(0))("ngValue",n),Ya(1),uu("\n ",n.label," - ",Vl(4,5,n.coins?n.coins:0),"\n (",Ul(5,7,n.hours?n.hours:0,!1),")\n ")}}function NR(e,t){if(1&e&&(bs(0),ru(1,"\n "),hs(2,jR,7,10,"ng-container",11),ru(3,"\n "),ws()),2&e){var n=Ys(2);Ya(2),ms("ngForOf",n.allWallets)}}function BR(e,t){if(1&e){var n=Ms();vs(0,"div",2),ru(1,"\n "),vs(2,"label",6),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),vs(6,"div",7),ru(7,"\n "),vs(8,"select",8),xs("blur",function(){return on(n),Ys().validateForm()}),ru(9,"\n "),vs(10,"option",9),ru(11),Wl(12,"translate"),_s(),ru(13,"\n "),hs(14,NR,4,1,"ng-container",10),ru(15,"\n "),_s(),ru(16,"\n "),_s(),ru(17,"\n "),_s()}if(2&e){var i=Ys();Ya(3),au(Vl(4,6,i.selectionMode===i.sourceSelectionModes.Wallet?"send.from-label":"send.wallet-label")),Ya(5),ms("appFormFieldError",i.walletErrorMsg),ls("disabled",i.busy?"true":null),Ya(2),ms("ngValue",""),Ya(1),au(Vl(12,8,"send.select-wallet")),Ya(3),ms("ngIf",i.allWallets)}}function WR(e,t){if(1&e&&(vs(0,"mat-option",17),ru(1),Wl(2,"amount"),Wl(3,"amount"),_s()),2&e){var n=t.$implicit;ms("value",n),Ya(1),uu("\n ",n.address," - ",Vl(2,4,n.coins?n.coins:0),"\n (",Ul(3,6,n.hours,!1),")\n ")}}function VR(e,t){if(1&e&&(vs(0,"div"),ru(1),Wl(2,"amount"),Wl(3,"amount"),_s()),2&e){var n=t.$implicit;Ya(1),uu("\n ",n.address," - ",Vl(2,3,n.coins?n.coins:0),"\n (",Ul(3,5,n.hours,!1),")\n ")}}var UR=function(e){return{"element-disabled":e}};function zR(e,t){if(1&e){var n=Ms();vs(0,"div",2),ru(1,"\n "),vs(2,"label",13),xs("click",function(){on(n);var e=fs(13);return Ys().busy?null:e.open()}),ru(3),Wl(4,"translate"),vs(5,"mat-icon",4),Wl(6,"translate"),ru(7,"help"),_s(),ru(8,"\n "),_s(),ru(9,"\n "),vs(10,"div",7),ru(11,"\n "),vs(12,"mat-select",14,15),Wl(14,"translate"),ru(15,"\n "),hs(16,WR,4,9,"mat-option",16),ru(17,"\n "),vs(18,"mat-select-trigger"),ru(19,"\n "),hs(20,VR,4,8,"div",11),ru(21,"\n "),_s(),ru(22,"\n "),_s(),ru(23,"\n "),_s(),ru(24,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("for",i.busy?"":"addresses"),Ya(1),ou("\n ",Vl(4,8,"send.addresses-label"),"\n "),Ya(2),ms("matTooltip",Vl(6,10,"send.addresses-help")),Ya(7),ms("placeholder",Vl(14,12,i.addressessPlaceholder))("ngClass",Il(14,UR,i.busy||i.addresses&&0===i.addresses.length)),ls("disabled",i.busy||i.addresses&&0===i.addresses.length?"true":null),Ya(4),ms("ngForOf",i.addresses),Ya(4),ms("ngForOf",i.form.get("addresses").value)}}function qR(e,t){1&e&&(vs(0,"mat-icon",21),Wl(1,"translate"),ru(2,"error"),_s()),2&e&&ms("matTooltip",Vl(1,1,"send.outputs-error"))}function GR(e,t){1&e&&ys(0,"mat-spinner")}function KR(e,t){if(1&e&&(vs(0,"mat-option",17),ru(1),Wl(2,"amount"),Wl(3,"amount"),_s()),2&e){var n=t.$implicit;ms("value",n),Ya(1),uu("\n ",n.hash," - ",Vl(2,4,n.coins?n.coins:0),"\n (",Ul(3,6,n.hours,!1),")\n ")}}function JR(e,t){if(1&e&&(vs(0,"div"),ru(1),Wl(2,"amount"),Wl(3,"amount"),_s()),2&e){var n=t.$implicit;Ya(1),uu("\n ",n.hash," - ",Vl(2,3,n.coins?n.coins:0),"\n (",Ul(3,5,n.hours,!1),")\n ")}}function ZR(e,t){if(1&e){var n=Ms();vs(0,"div",2),ru(1,"\n "),vs(2,"label",13),xs("click",function(){on(n);var e=fs(17);return Ys().busy?null:e.open()}),ru(3),Wl(4,"translate"),vs(5,"mat-icon",4),Wl(6,"translate"),ru(7,"help"),_s(),ru(8,"\n "),hs(9,qR,3,3,"mat-icon",18),ru(10,"\n "),hs(11,GR,1,0,"mat-spinner",10),ru(12,"\n "),_s(),ru(13,"\n "),vs(14,"div",7),ru(15,"\n "),vs(16,"mat-select",19,20),Wl(18,"translate"),ru(19,"\n "),hs(20,KR,4,9,"mat-option",16),ru(21,"\n "),vs(22,"mat-select-trigger"),ru(23,"\n "),hs(24,JR,4,8,"div",11),ru(25,"\n "),_s(),ru(26,"\n "),_s(),ru(27,"\n "),_s(),ru(28,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("for",i.busy?null:"outputs"),Ya(1),ou("\n ",Vl(4,10,"send.outputs-label"),"\n "),Ya(2),ms("matTooltip",Vl(6,12,"send.outputs-help")),Ya(4),ms("ngIf",i.errorLoadingManualOutputs),Ya(2),ms("ngIf",i.loadingUnspentOutputs),Ya(5),ms("placeholder",Vl(18,14,i.outputsPlaceholder))("ngClass",Il(16,UR,i.busy||i.unspentOutputs&&0===i.unspentOutputs.length)),ls("disabled",i.busy||i.unspentOutputs&&0===i.unspentOutputs.length?"true":null),Ya(4),ms("ngForOf",i.unspentOutputs),Ya(4),ms("ngForOf",i.form.get("outputs").value)}}var $R=function(){return function(){this.availableCoins=new CM.BigNumber(0),this.availableHours=new CM.BigNumber(0),this.minimumFee=new CM.BigNumber(0),this.loading=!1}}(),XR=function(e){return e.Wallet="Wallet",e.All="All",e.Manual="Manual",e}({}),QR=function(){function e(e,t,n){this.appService=e,this.formBuilder=t,this.balanceAndOutputsService=n,this.onSelectionChanged=new Zl,this.sourceSelectionModes=XR,this.addresses=[],this.manualAddresses=[],this.allUnspentOutputs=[],this.unspentOutputs=[],this.loadingUnspentOutputs=!1,this.errorLoadingManualOutputs=!1,this.manualAddressesErrorMsg="",this.walletErrorMsg="",this.subscriptionsGroup=[]}return Object.defineProperty(e.prototype,"selectionMode",{get:function(){return this.selectionModeInternal},set:function(e){this.selectionModeInternal=e,this.form&&(this.resetForm(),this.form.updateValueAndValidity())},enumerable:!1,configurable:!0}),e.prototype.ngOnInit=function(){var e=this;this.form=this.formBuilder.group({manualAddresses:[""],wallet:[""],addresses:[null],outputs:[null]}),this.form.setValidators(this.validateForm.bind(this)),this.subscriptionsGroup.push(this.form.get("manualAddresses").valueChanges.pipe(Bv(500)).subscribe(function(){var t=e.form.get("manualAddresses").value,n=[];t&&t.trim().length>0&&(n=(n=(n=t.split(",")).map(function(e){return e.trim()})).filter(function(e){return e.length>0}));var i=!1;n.length!==e.manualAddresses.length?i=!0:n.forEach(function(t,n){e.manualAddresses[n]!==t&&(i=!0)}),i&&(e.manualAddresses=n,e.closeGetOutputsSubscription(),e.allUnspentOutputs=[],e.unspentOutputs=[],e.form.get("outputs").setValue(null),e.loadingUnspentOutputs=0!==n.length,e.errorLoadingManualOutputs=!1,e.onSelectionChanged.emit()),0!==n.length&&i&&(e.getOutputsSubscription=e.balanceAndOutputsService.getOutputs(e.form.get("manualAddresses").value.replace(/ /g,"")).pipe(xM(function(t){return t.pipe(ue(function(t){return(t=VM(t)).originalError&&t.originalError.status&&400===t.originalError.status?(e.errorLoadingManualOutputs=!0,sg(t)):bm(t)}),EM(4e3))})).subscribe(function(t){e.loadingUnspentOutputs=!1,e.allUnspentOutputs=t,e.unspentOutputs=e.filterUnspentOutputs(),e.onSelectionChanged.emit()},function(){e.loadingUnspentOutputs=!1,e.onSelectionChanged.emit()}))})),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){e.wallet=t,e.closeGetOutputsSubscription(),e.allUnspentOutputs=[],e.unspentOutputs=[],e.form.get("addresses").setValue(null),e.form.get("outputs").setValue(null),e.loadingUnspentOutputs=!1,t&&e.selectionMode===XR.All&&(e.loadingUnspentOutputs=!0,e.getOutputsSubscription=e.balanceAndOutputsService.getWalletUnspentOutputs(t).pipe(xM(function(e){return e.pipe(EM(4e3))})).subscribe(function(t){e.loadingUnspentOutputs=!1,e.allUnspentOutputs=t,e.unspentOutputs=e.filterUnspentOutputs()},function(){return e.loadingUnspentOutputs=!1})),e.addresses=t?t.addresses.filter(function(e){return e.coins>0}):[],e.onSelectionChanged.emit()})),this.subscriptionsGroup.push(this.form.get("addresses").valueChanges.subscribe(function(){e.form.get("outputs").setValue(null),e.unspentOutputs=e.filterUnspentOutputs(),e.onSelectionChanged.emit()})),this.subscriptionsGroup.push(this.form.get("outputs").valueChanges.subscribe(function(){e.onSelectionChanged.emit()})),this.subscriptionsGroup.push(this.balanceAndOutputsService.walletsWithBalance.subscribe(function(t){e.allWallets=t,1===t.length&&setTimeout(function(){try{e.form.get("wallet").setValue(t[0])}catch(n){}})}))},e.prototype.ngOnDestroy=function(){this.closeGetOutputsSubscription(),this.subscriptionsGroup.forEach(function(e){return e.unsubscribe()}),this.onSelectionChanged.complete()},e.prototype.resetForm=function(){this.form.get("manualAddresses").setValue(""),this.form.get("wallet").setValue(""),this.form.get("addresses").setValue(null),this.form.get("outputs").setValue(null),this.wallet=null},e.prototype.fill=function(e){var t=this;setTimeout(function(){if(t.selectionMode===XR.Manual){var n="",i=e.form.manualAddresses;i.forEach(function(e,t){n+=e,t0){var t=this.form.get("outputs").value;t&&t.length>0?t.map(function(t){e.availableCoins=e.availableCoins.plus(t.coins),e.availableHours=e.availableHours.plus(t.hours)}):this.unspentOutputs.forEach(function(t){e.availableCoins=e.availableCoins.plus(t.coins),e.availableHours=e.availableHours.plus(t.hours)})}if(this.selectionMode===XR.Manual&&(e.loading=this.loadingUnspentOutputs),this.form.get("wallet").value){var n=this.form.get("outputs").value,i=this.form.get("addresses").value;if(n&&n.length>0)n.map(function(t){e.availableCoins=e.availableCoins.plus(t.coins),e.availableHours=e.availableHours.plus(t.hours)});else if(i&&i.length>0)i.map(function(t){e.availableCoins=e.availableCoins.plus(t.coins),e.availableHours=e.availableHours.plus(t.hours)});else if(this.form.get("wallet").value){var r=this.form.get("wallet").value;e.availableCoins=r.coins,e.availableHours=r.hours}}if(e.availableCoins.isGreaterThan(0)){var a=new CM.BigNumber(1).minus(new CM.BigNumber(1).dividedBy(this.appService.burnRate)),o=e.availableHours.multipliedBy(a).decimalPlaces(0,CM.BigNumber.ROUND_FLOOR);e.minimumFee=e.availableHours.minus(o),e.availableHours=o}return e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selectedSources",{get:function(){return this.selectionMode===XR.Manual?{wallet:null,manualAddresses:this.manualAddresses,unspentOutputs:this.form.get("outputs").value}:{wallet:this.form.get("wallet").value,addresses:this.form.get("addresses").value,unspentOutputs:this.form.get("outputs").value}},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"unspentOutputsList",{get:function(){return this.loadingUnspentOutputs?null:this.allUnspentOutputs},enumerable:!1,configurable:!0}),e.prototype.filterUnspentOutputs=function(){if(this.selectionMode===XR.Manual)return this.allUnspentOutputs;if(0===this.allUnspentOutputs.length)return[];if(this.form.get("addresses").value&&0!==this.form.get("addresses").value.length){var e=new Map;return this.form.get("addresses").value.forEach(function(t){return e.set(t.address,!0)}),this.allUnspentOutputs.filter(function(t){return e.has(t.address)})}return this.allUnspentOutputs},e.prototype.closeGetOutputsSubscription=function(){this.loadingUnspentOutputs=!1,this.getOutputsSubscription&&this.getOutputsSubscription.unsubscribe()},e.prototype.validateForm=function(){this.manualAddressesErrorMsg="",this.walletErrorMsg="";var e=!0;return this.selectionMode===XR.Manual?(!this.form.get("manualAddresses").value||this.form.get("manualAddresses").value.length<20)&&(e=!1,this.form.get("manualAddresses").touched&&(this.manualAddressesErrorMsg="send.addresses-error-info")):this.form.get("wallet").value||(e=!1,this.form.get("wallet").touched&&(this.walletErrorMsg="send.wallet-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ps(jS),ps(fm),ps(_O))},e.\u0275cmp=ft({type:e,selectors:[["app-form-source-selection"]],inputs:{busy:"busy",selectionMode:"selectionMode"},outputs:{onSelectionChanged:"onSelectionChanged"},decls:15,vars:5,consts:[[3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","manualAddresses"],[1,"help-icon",3,"matTooltip"],["formControlName","manualAddresses","id","manualAddresses",3,"appFormFieldError","blur"],["for","wallet"],[1,"-select"],["formControlName","wallet","id","wallet",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue"],[4,"ngIf"],[4,"ngFor","ngForOf"],[3,"disabled","ngValue"],[3,"for","click"],["multiple","","formControlName","addresses","id","addresses",3,"placeholder","ngClass"],["selectAddresses",""],[3,"value",4,"ngFor","ngForOf"],[3,"value"],["class","help-icon red-text",3,"matTooltip",4,"ngIf"],["multiple","","formControlName","outputs","id","outputs",3,"placeholder","ngClass"],["selectOutputs",""],[1,"help-icon","red-text",3,"matTooltip"]],template:function(e,t){1&e&&(vs(0,"div",0),ru(1,"\n "),ru(2,"\n "),hs(3,HR,12,8,"div",1),ru(4,"\n "),ru(5,"\n "),hs(6,BR,18,10,"div",1),ru(7,"\n "),ru(8,"\n "),hs(9,zR,25,16,"div",1),ru(10,"\n "),ru(11,"\n "),hs(12,ZR,29,18,"div",1),ru(13,"\n"),_s(),ru(14,"\n")),2&e&&(ms("formGroup",t.form),Ya(3),ms("ngIf",t.selectionMode===t.sourceSelectionModes.Manual),Ya(3),ms("ngIf",t.selectionMode!==t.sourceSelectionModes.Manual),Ya(3),ms("ngIf",t.selectionMode===t.sourceSelectionModes.All),Ya(3),ms("ngIf",t.selectionMode!==t.sourceSelectionModes.Wallet))},directives:[ap,jp,lh,WC,YO,Lf,rp,qp,RO,Jp,Zp,em,sh,QI,ah,$I,mk,MM],pipes:[hM,NS],styles:[".form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{height:12px!important;width:12px!important;opacity:.5;margin:0!important;display:inline-block;position:relative;top:2px;margin-left:8px}.form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:12px!important;width:12px!important}"]}),e}(),eF=["okButton"],tF=function(e){return e.Loading="Loading",e.ErrorLoading="ErrorLoading",e.ShowingForm="ShowingForm",e}({}),nF=function(){function e(e){this.working=!1,this.currentState=tF.Loading,this.states=tF,this.validateForm=!1,this.title="",this.text="",this.dropdownLabel="",this.defaultDropdownText="",this.inputLabel="",this.contents="",this.cancelButtonText="",this.okButtonText="",this.dropdownErrorMsg="",this.inputErrorMsg="",this.form=e.group({dropdown:[""],input:[""]}),this.form.setValidators(this.validate.bind(this))}return e.prototype.validate=function(){this.dropdownErrorMsg="",this.inputErrorMsg="";var e=!0;this.form.get("dropdown").value||(e=!1,this.form.get("dropdown").touched&&(this.dropdownErrorMsg="offline-transactions.wallet-error-info"));var t=this.form.get("input").value;return(!t||t.length<300||!/^[0-9a-fA-F]+$/.test(t))&&(e=!1,this.form.get("input").touched&&(this.inputErrorMsg="offline-transactions.tx-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ps(fm))},e.\u0275cmp=ft({type:e,selectors:[["ng-component"]],viewQuery:function(e,t){var n;1&e&&lc(eF,5),2&e&&uc(n=dc())&&(t.okButton=n.first)},decls:0,vars:0,template:function(e,t){},encapsulation:2}),e}();function iF(e,t){1&e&&(vs(0,"div"),ru(1,"\n "),ys(2,"mat-spinner",2),ru(3,"\n "),vs(4,"p"),ru(5),Wl(6,"translate"),_s(),ru(7,"\n "),_s()),2&e&&(Ya(2),ms("diameter",40),Ya(3),au(Vl(6,2,"common.loading")))}function rF(e,t){if(1&e&&(vs(0,"div"),ru(1,"\n "),vs(2,"i",3),ru(3,"announcement"),_s(),ru(4,"\n "),vs(5,"p"),ru(6),Wl(7,"translate"),_s(),ru(8,"\n "),_s()),2&e){var n=Ys();Ya(6),au(Vl(7,1,n.noDataText))}}var aF=function(){function e(){this.isLoading=!0}return e.\u0275fac=function(t){return new(t||e)},e.\u0275cmp=ft({type:e,selectors:[["app-loading-content"]],inputs:{isLoading:"isLoading",noDataText:"noDataText"},decls:7,vars:2,consts:[[1,"-content"],[4,"ngIf"],[3,"diameter"],[1,"material-icons"]],template:function(e,t){1&e&&(vs(0,"div",0),ru(1,"\n "),hs(2,iF,8,4,"div",1),ru(3,"\n "),hs(4,rF,9,3,"div",1),ru(5,"\n"),_s(),ru(6,"\n")),2&e&&(Ya(2),ms("ngIf",t.isLoading),Ya(2),ms("ngIf",!t.isLoading))},directives:[lh,MM],pipes:[hM],styles:[".-content[_ngcontent-%COMP%]{text-align:center;margin:50px 0;font-size:13px;opacity:.5}.-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:15px}.-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:40px;opacity:.5}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block;opacity:.5}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.5)}"]}),e}();function oF(e,t){if(1&e&&ys(0,"app-loading-content",3),2&e){var n=Ys();ms("isLoading",n.currentState===n.states.Loading)("noDataText","offline-transactions.loading-problem")}}function sF(e,t){if(1&e&&(vs(0,"label",19),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys(3);Ya(1),au(Vl(2,1,n.dropdownLabel))}}function uF(e,t){if(1&e&&(vs(0,"option",20),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys(3);ms("ngValue",""),Ya(1),au(Vl(2,2,n.defaultDropdownText))}}function lF(e,t){if(1&e&&(bs(0),ru(1,"\n "),vs(2,"option",22),ru(3),_s(),ru(4,"\n "),ws()),2&e){var n=t.$implicit;Ya(2),ms("ngValue",n.value),Ya(1),ou("\n ",n.name,"\n ")}}function cF(e,t){if(1&e&&(bs(0),ru(1,"\n "),hs(2,lF,5,2,"ng-container",21),ru(3,"\n "),ws()),2&e){var n=Ys(3);Ya(2),ms("ngForOf",n.dropdownElements)}}function dF(e,t){if(1&e){var n=Ms();vs(0,"div",6),ru(1,"\n "),hs(2,sF,3,3,"label",15),ru(3,"\n "),vs(4,"div",16),ru(5,"\n "),vs(6,"select",17),xs("blur",function(){return on(n),Ys(2).validate()}),ru(7,"\n "),hs(8,uF,3,4,"option",18),ru(9,"\n "),hs(10,cF,4,1,"ng-container",2),ru(11,"\n "),_s(),ru(12,"\n "),_s(),ru(13,"\n "),_s()}if(2&e){var i=Ys(2);Ya(2),ms("ngIf",i.dropdownLabel),Ya(4),ms("appFormFieldError",i.dropdownErrorMsg),ls("disabled",i.working?"true":null),Ya(2),ms("ngIf",i.defaultDropdownText),Ya(2),ms("ngIf",i.dropdownElements)}}function hF(e,t){if(1&e&&(vs(0,"label",23),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys(2);Ya(1),au(Vl(2,1,n.inputLabel))}}function fF(e,t){if(1&e&&(vs(0,"textarea",24),ru(1),_s()),2&e){var n=Ys(2);ms("readonly",!0),Ya(1),au(n.contents)}}function pF(e,t){if(1&e){var n=Ms();vs(0,"textarea",25),xs("blur",function(){return on(n),Ys(2).validate()}),_s()}if(2&e){var i=Ys(2);ms("appFormFieldError",i.inputErrorMsg),ls("disabled",i.working?"true":null)}}function mF(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),ru(2),Wl(3,"translate"),vs(4,"div",4),ru(5,"\n "),ru(6,"\n "),hs(7,dF,14,5,"div",5),ru(8,"\n "),ru(9,"\n "),vs(10,"div",6),ru(11,"\n "),hs(12,hF,3,3,"label",7),ru(13,"\n "),hs(14,fF,2,2,"textarea",8),ru(15,"\n "),hs(16,pF,1,2,"textarea",9),ru(17,"\n "),_s(),ru(18,"\n "),_s(),ru(19,"\n "),ru(20,"\n "),vs(21,"div",10),ru(22,"\n "),vs(23,"app-button",11,12),xs("action",function(){return on(n),Ys().cancelPressed()}),ru(25),Wl(26,"translate"),_s(),ru(27,"\n "),vs(28,"app-button",13,14),xs("action",function(){return on(n),Ys().okPressed()}),ru(30),Wl(31,"translate"),_s(),ru(32,"\n "),_s(),ru(33,"\n "),ws()}if(2&e){var i=Ys();Ya(2),ou("\n ",Vl(3,10,i.text),"\n "),Ya(2),ms("formGroup",i.form),Ya(3),ms("ngIf",i.dropdownElements),Ya(5),ms("ngIf",i.inputLabel),Ya(2),ms("ngIf",!!i.contents),Ya(2),ms("ngIf",!i.contents),Ya(7),ms("disabled",i.working),Ya(2),ou("\n ",Vl(26,12,i.cancelButtonText),"\n "),Ya(3),ms("disabled",i.validateForm&&!i.form.valid||i.working),Ya(2),ou("\n ",Vl(31,14,i.okButtonText),"\n ")}}var gF=function(e){function t(t,n,i,r){var a=e.call(this,r)||this;return a.data=t,a.dialogRef=n,a.msgBarService=i,a.cancelButtonText="common.close-button",a.okButtonText="offline-transactions.copy-tx.copy-button",a.inputLabel="offline-transactions.copy-tx.input-label",a.title="offline-transactions.copy-tx."+(t.isUnsigned?"unsigned":"signed")+"-title",a.text="offline-transactions.copy-tx.text-"+(t.isUnsigned?"unsigned":"signed"),a.contents=t.rawTx,a.currentState=tF.ShowingForm,a}return vf(t,e),t.openDialog=function(e,n){var i=new wk;return i.data=n,i.autoFocus=!0,i.width=jM.mediumModalWidth,e.open(t,i)},t.prototype.ngOnInit=function(){var e=this;setTimeout(function(){e.okButton.focus()})},t.prototype.cancelPressed=function(){this.dialogRef.close()},t.prototype.okPressed=function(){IM(this.data.rawTx),this.msgBarService.showDone("common.copied",4e3)},t.\u0275fac=function(e){return new(e||t)(ps(Tk),ps(Lk),ps(dL),ps(fm))},t.\u0275cmp=ft({type:t,selectors:[["app-copy-raw-tx"]],features:[Ko],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[3,"isLoading","noDataText",4,"ngIf"],[4,"ngIf"],[3,"isLoading","noDataText"],[1,"modal-form-container",3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","input",4,"ngIf"],["rows","5",3,"readonly",4,"ngIf"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur",4,"ngIf"],[1,"-buttons"],[3,"disabled","action"],["cancelButton",""],[1,"primary-button",3,"disabled","action"],["okButton",""],["for","dropdown",4,"ngIf"],[1,"-select"],["formControlName","dropdown","id","dropdown",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue",4,"ngIf"],["for","dropdown"],["disabled","","hidden","",3,"ngValue"],[4,"ngFor","ngForOf"],[3,"ngValue"],["for","input"],["rows","5",3,"readonly"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,oF,1,2,"app-loading-content",1),ru(5,"\n\n "),hs(6,mF,34,16,"ng-container",2),ru(7,"\n"),_s(),ru(8,"\n")),2&e&&(ms("headline",Vl(1,5,t.title))("dialog",t.dialogRef)("disableDismiss",t.working),Ya(4),ms("ngIf",t.currentState===t.states.Loading||t.currentState===t.states.ErrorLoading),Ya(2),ms("ngIf",t.currentState===t.states.ShowingForm))},directives:[jk,lh,aF,ap,jp,ZC,Jp,rp,qp,RO,Zp,em,sh,Lf],pipes:[hM],styles:[""]}),t}(nF),vF=n(61295),_F=function(){function e(){}return e.encode=function(e,t,n,i,r){var a=this;if(void 0===r&&(r=0),e.length!==n.length)throw new Error("Invalid number of signatures.");var o=this.encodeSizeTransaction(e,t,n).toNumber(),s=new ArrayBuffer(o),u=new DataView(s),l=0;if(u.setUint32(l,o,!0),u.setUint8(l+=4,r),l+=1,this.convertToBytes(i).forEach(function(e){u.setUint8(l,e),l+=1}),n.length>65535)throw new Error("Too many signatures.");if(u.setUint32(l,n.length,!0),l+=4,n.forEach(function(e){a.convertToBytes(e).forEach(function(e){u.setUint8(l,e),l+=1})}),e.length>65535)throw new Error("Too many inputs.");if(u.setUint32(l,e.length,!0),l+=4,e.forEach(function(e){a.convertToBytes(e.hash).forEach(function(e){u.setUint8(l,e),l+=1})}),t.length>65535)throw new Error("Too many outputs.");u.setUint32(l,t.length,!0),l+=4;var c=vF("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");return t.forEach(function(e){var t=c.decode(e.address);u.setUint8(l,t[20]),l+=1;for(var n=0;n<20;n++)u.setUint8(l,t[n]),l+=1;l=a.setUint64(u,l,new(LM())(e.coins).multipliedBy(1e6).decimalPlaces(0)),l=a.setUint64(u,l,new(LM())(e.hours))}),this.convertToHex(s)},e.encodeSizeTransaction=function(e,t,n){var i=new(LM())(0);return(i=(i=(i=(i=(i=(i=(i=(i=i.plus(4)).plus(1)).plus(32)).plus(4)).plus(new(LM())(65).multipliedBy(n.length))).plus(4)).plus(new(LM())(32).multipliedBy(e.length))).plus(4)).plus(new(LM())(37).multipliedBy(t.length))},e.setUint64=function(e,t,n){var i=n.toString(16);i.length%2!=0&&(i="0"+i);for(var r=this.convertToBytes(i),a=r.length-1;a>=0;a--)e.setUint8(t,r[a]),t+=1;for(a=0;a<8-r.length;a++)e.setUint8(t,0),t+=1;return t},e.convertToBytes=function(e){if(e.length%2!=0)throw new Error("Invalid hex string.");for(var t=[],n=0;n8)throw new Error(u.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"));if(n.transaction.outputs.length>8)throw new Error(u.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"))}var r=new CM.BigNumber(0);i.map(function(e){return r=r.plus(e.coins)});var a=new CM.BigNumber(0);return n.transaction.outputs.filter(function(e){return i.map(function(e){return e.address}).find(function(t){return t===e.address})}).map(function(e){return a=a.plus(new CM.BigNumber(e.hours))}),{inputs:n.transaction.inputs.map(function(e){return{hash:e.uxid,address:e.address,coins:new CM.BigNumber(e.coins),hours:new CM.BigNumber(e.calculated_hours)}}),outputs:n.transaction.outputs.map(function(e){return{hash:e.uxid,address:e.address,coins:new CM.BigNumber(e.coins),hours:new CM.BigNumber(e.hours)}}),coinsToSend:r,hoursToSend:a,hoursBurned:new CM.BigNumber(n.transaction.fee),from:l,to:i.map(function(e){return e.address}).join(", "),wallet:e,encoded:n.encoded_transaction,innerHash:n.transaction.inner_hash}}));return e&&e.isHardware&&!s&&(f=f.pipe(ue(function(t){return h=t,u.signTransaction(e,null,t)})).pipe(K(function(e){return h.encoded=e,h}))),f},e.prototype.signTransaction=function(e,t,n,i){if(void 0===i&&(i=""),e.isHardware){if(i)throw new Error("Raw transactions not allowed.");var r=[],a=[],o=new Map;if(e.addresses.forEach(function(e,t){return o.set(e.address,t)}),n.outputs.forEach(function(e){r.push({address:e.address,coins:new CM.BigNumber(e.coins).toString(),hours:new CM.BigNumber(e.hours).toFixed(0)})}),n.inputs.forEach(function(e){a.push({hash:e.hash,index:o.get(e.address)})}),r.length>1)for(var s=r.length-1;s>=0;s--)if(r[s].address===e.addresses[0].address){r[s].address_index=0;break}return this.hwWalletService.signTransaction(a,r).pipe(K(function(e){return _F.encode(a,r,e.rawResponse,n.innerHash)}))}return this.apiService.post("wallet/transaction/sign",{wallet_id:e.id,password:t,encoded_transaction:i||n.encoded},{useV2:!0}).pipe(K(function(e){return e.data.encoded_transaction}))},e.prototype.injectTransaction=function(e,t){var n=this;return this.apiService.post("injectTransaction",{rawtx:e},{sendDataAsJson:!0}).pipe(ue(function(e){return setTimeout(function(){return n.balanceAndOutputsService.refreshBalance()},32),t?n.storageService.store(yL.NOTES,e,t).pipe(xM(function(e){return Xm(e.pipe(EM(1e3),zg(3)),sg(-1))}),qM(function(e){return-1===e?bm(-1):e}),K(function(e){return-1!==e})):bm(!1)}))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(_O),Bi(HS),Bi(gC),Bi(dM),Bi(bL))}}),e}(),wF=["formSourceSelection"],kF=["formMultipleDestinations"],MF=["previewButton"],SF=["sendButton"],CF=function(e){return{"element-disabled":e}};function LF(e,t){if(1&e){var n=Ms();vs(0,"div",15),ru(1,"\n "),ru(2,"\n "),vs(3,"app-double-button",16),xs("onStateChange",function(e){return on(n),Ys().changeFormType(e)}),Wl(4,"translate"),Wl(5,"translate"),_s(),ru(6,"\n"),_s()}if(2&e){var i=Ys();Ya(3),ms("changeActiveButtonManually",!0)("leftButtonText",Vl(4,5,"send.signed-button"))("rightButtonText",Vl(5,7,"send.unsigned-button"))("activeButton",i.showForManualUnsigned?i.doubleButtonActive.RightButton:i.doubleButtonActive.LeftButton)("ngClass",Il(9,CF,i.busy))}}function xF(e,t){if(1&e&&(bs(0),ru(1,"\n "),vs(2,"span"),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),vs(6,"span",19),ru(7),Wl(8,"amount"),_s(),ru(9,"\n "),vs(10,"span"),ru(11),Wl(12,"translate"),_s(),ru(13,"\n "),vs(14,"span",19),ru(15),Wl(16,"amount"),_s(),ru(17,"\n "),vs(18,"span"),ru(19),Wl(20,"translate"),_s(),ru(21,"\n "),vs(22,"span",19),ru(23),Wl(24,"amount"),_s(),ru(25,"\n "),vs(26,"span"),ru(27),Wl(28,"translate"),_s(),ru(29,"\n "),ws()),2&e){var n=Ys(2);Ya(3),au(Vl(4,7,"send.available-funds-msg-part1")),Ya(4),ou("\n ",Vl(8,9,n.availableBalance.availableCoins),"\n "),Ya(4),au(Vl(12,11,"send.available-funds-msg-part2")),Ya(4),ou("\n ",Ul(16,13,n.availableBalance.availableHours,!1),"\n "),Ya(4),au(Vl(20,16,"send.available-funds-msg-part3")),Ya(4),ou("\n ",Ul(24,18,n.availableBalance.minimumFee,!1),"\n "),Ya(4),au(Vl(28,21,"send.available-funds-msg-part4"))}}function TF(e,t){1&e&&(bs(0),ru(1,"\n "),vs(2,"span"),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),ws()),2&e&&(Ya(3),au(Vl(4,1,"common.loading")))}function DF(e,t){if(1&e&&(vs(0,"div",17),ru(1,"\n "),hs(2,xF,30,23,"ng-container",18),ru(3,"\n "),hs(4,TF,6,3,"ng-container",18),ru(5,"\n "),_s()),2&e){var n=Ys();Ya(2),ms("ngIf",!n.availableBalance.loading),Ya(2),ms("ngIf",n.availableBalance.loading)}}function OF(e,t){if(1&e){var n=Ms();vs(0,"div",20),ru(1,"\n "),vs(2,"label",21),ru(3),Wl(4,"translate"),vs(5,"mat-icon",22),Wl(6,"translate"),ru(7,"help"),_s(),ru(8,"\n "),vs(9,"app-arrow-link",23),xs("pressed",function(e){return on(n),Ys().selectChangeAddress(e)}),ru(10,"\n "),_s(),ru(11,"\n "),_s(),ru(12,"\n "),vs(13,"input",24),xs("keydown.enter",function(){on(n);var e=Ys();return e.showForManualUnsigned?e.preview():null})("blur",function(){return on(n),Ys().validateForm()}),_s(),ru(14,"\n "),_s()}if(2&e){var i=Ys();Ya(3),ou("\n ",Vl(4,6,"send.change-address-label"),"\n "),Ya(2),ms("matTooltip",Vl(6,8,"send.change-address-help")),Ya(4),ms("text","send.change-address-select-from-list-link")("ngClass",Il(10,CF,i.busy)),Ya(4),ms("appFormFieldError",i.invalidChangeAddress?"send.invalid-addresses-error":i.changeAddressErrorMsg),ls("disabled",i.busy?"true":null)}}function EF(e,t){if(1&e){var n=Ms();vs(0,"div",20),ru(1,"\n "),vs(2,"label",25),ru(3),Wl(4,"translate"),vs(5,"mat-icon",22),Wl(6,"translate"),ru(7,"help"),_s(),ru(8,"\n "),_s(),ru(9,"\n "),vs(10,"input",26),xs("keydown.enter",function(){return on(n),Ys().preview()}),_s(),ru(11,"\n "),_s()}if(2&e){var i=Ys();Ya(3),ou("\n ",Vl(4,4,"send.personal-note-label"),"\n "),Ya(2),ms("matTooltip",Vl(6,6,"send.personal-note-help")),Ya(5),ms("maxlength",i.maxNoteChars),ls("disabled",i.busy?"true":null)}}function YF(e,t){if(1&e){var n=Ms();vs(0,"app-arrow-link",28),xs("pressed",function(e){return on(n),Ys(2).toggleOptions(e)}),ru(1,"\n "),_s()}if(2&e){var i=Ys(2);ms("noPadding",!0)("text","send.coin-hours-options-link")("pointDown",!i.showAutoHourDistributionOptions)}}function PF(e,t){if(1&e&&(vs(0,"div",20),ru(1,"\n "),hs(2,YF,2,3,"app-arrow-link",27),ru(3,"\n "),_s()),2&e){var n=Ys();Ya(2),ms("ngIf",n.showSimpleForm)}}function AF(e,t){1&e&&ks(0)}var IF=function(e){return{"d-none":e}};function RF(e,t){if(1&e&&(vs(0,"div",29),ru(1,"\n "),hs(2,AF,1,0,"ng-container",30),ru(3,"\n "),_s()),2&e){var n=Ys(),i=fs(47);ms("ngClass",Il(2,IF,!n.showAutoHourDistributionOptions)),Ya(2),ms("ngTemplateOutlet",i)}}function FF(e,t){if(1&e){var n=Ms();vs(0,"app-arrow-link",36),xs("mousedown",function(e){return e.stopPropagation()})("pressed",function(e){return on(n),Ys(2).toggleOptions(e)}),ru(1,"\n "),_s()}if(2&e){var i=Ys(2);ms("text","send.options-link")("pointDown",!i.showAutoHourDistributionOptions)}}function HF(e,t){1&e&&ks(0)}var jF=function(e){return{coinHoursName:e}},NF=function(e){return{"row -options-wrapper":!0,"d-none":e}};function BF(e,t){if(1&e){var n=Ms();vs(0,"div",20),ru(1,"\n "),vs(2,"div",31),ru(3,"\n "),vs(4,"div",32),ru(5,"\n "),vs(6,"mat-checkbox",33),xs("change",function(e){return on(n),Ys().setAutoHours(e)}),ru(7,"\n "),vs(8,"span"),ru(9),Wl(10,"translate"),_s(),ru(11,"\n "),hs(12,FF,2,2,"app-arrow-link",34),ru(13,"\n "),_s(),ru(14,"\n "),_s(),ru(15,"\n "),_s(),ru(16,"\n\n "),ru(17,"\n "),vs(18,"div",35),ru(19,"\n "),hs(20,HF,1,0,"ng-container",30),ru(21,"\n "),_s(),ru(22,"\n "),_s()}if(2&e){var i=Ys(),r=fs(47);Ya(2),ms("ngClass",Il(9,CF,i.busy)),Ya(4),ms("checked",i.autoHours),Ya(3),au(Ul(10,6,"send.hours-allocation-check",Il(11,jF,i.appService.hoursName))),Ya(3),ms("ngIf",i.autoHours),Ya(6),ms("ngClass",Il(13,NF,!i.showAutoHourDistributionOptions)),Ya(2),ms("ngTemplateOutlet",r)}}function WF(e,t){if(1&e){var n=Ms();ru(0,"\n "),vs(1,"div",37),ru(2,"\n "),vs(3,"div",20),ru(4,"\n "),vs(5,"label",38),ru(6,"\n "),vs(7,"span"),ru(8),Wl(9,"translate"),vs(10,"mat-icon",22),Wl(11,"translate"),ru(12,"help"),_s(),ru(13,"\n "),_s(),ru(14,"\n "),vs(15,"span"),ru(16),Wl(17,"number"),_s(),ru(18,"\n "),_s(),ru(19,"\n "),vs(20,"mat-slider",39),xs("input",function(e){return on(n),Ys().setShareValue(e)}),_s(),ru(21,"\n "),_s(),ru(22,"\n "),_s(),ru(23,"\n")}if(2&e){var i=Ys();Ya(8),ou("\n ",Ul(9,5,"send.hours-share-factor-label",Il(14,jF,i.appService.hoursName)),"\n "),Ya(2),ms("matTooltip",Ul(11,8,"send.hours-share-factor-help",Il(16,jF,i.appService.hoursName))),Ya(6),au(Ul(17,11,i.autoShareValue,"1.0-2")),Ya(4),ms("value",i.autoShareValue)("ngClass",Il(18,CF,i.busy))}}var VF=function(){function e(e,t,n,i,r,a,o,s,u,l){this.appService=e,this.blockchainService=t,this.dialog=n,this.msgBarService=i,this.navBarSwitchService=r,this.hwWalletService=a,this.translate=o,this.changeDetector=s,this.spendingService=u,this.walletsAndAddressesService=l,this.defaultAutoShareValue="0.5",this.onFormSubmitted=new Zl,this.sourceSelectionModes=XR,this.doubleButtonActive=NP,this.maxNoteChars=RR.MAX_NOTE_CHARS,this.availableBalance=new $R,this.autoHours=!0,this.hoursAddedToSimpleForm=!1,this.showAutoHourDistributionOptions=!1,this.autoShareValue=this.defaultAutoShareValue,this.busy=!1,this.showForManualUnsigned=!1,this.changeAddressErrorMsg="",this.invalidChangeAddress=!1}return e.prototype.ngOnInit=function(){var e=this;this.form=new xp({}),this.form.addControl("changeAddress",new Lp("")),this.form.addControl("note",new Lp("")),this.form.setValidators(this.validateForm.bind(this)),this.formData&&setTimeout(function(){return e.fillForm()})},e.prototype.ngOnDestroy=function(){this.processingSubscription&&!this.processingSubscription.closed&&this.processingSubscription.unsubscribe(),this.closeSyncCheckSubscription(),this.msgBarService.hide()},e.prototype.sourceSelectionChanged=function(){this.selectedSources=this.formSourceSelection.selectedSources,this.availableBalance=this.formSourceSelection.availableBalance,this.formMultipleDestinations.updateValuesAndValidity(),this.form.updateValueAndValidity()},e.prototype.destinationsChanged=function(){var e=this;setTimeout(function(){e.form.updateValueAndValidity()})},e.prototype.preview=function(){this.checkBeforeCreatingTx(!0),this.changeDetector.detectChanges()},e.prototype.send=function(){this.checkBeforeCreatingTx(!1)},e.prototype.changeFormType=function(e){var t=this;e===NP.LeftButton&&!this.showForManualUnsigned||e===NP.RightButton&&this.showForManualUnsigned||(e===NP.RightButton?vO.openDialog(this.dialog,{text:"send.unsigned-confirmation",defaultButtons:gO.YesNo}).afterClosed().subscribe(function(e){e&&(t.showForManualUnsigned=!0)}):this.showForManualUnsigned=!1)},e.prototype.setShareValue=function(e){this.autoShareValue=parseFloat(e.value).toFixed(2)},e.prototype.selectChangeAddress=function(){var e=this;AR.openDialog(this.dialog).afterClosed().subscribe(function(t){t&&e.form.get("changeAddress").setValue(t)})},e.prototype.openMultipleDestinationsPopup=function(){var e=this,t="";this.formMultipleDestinations.getDestinations(!1).map(function(n){(n.address.trim().length>0||n.originalAmount.trim().length>0||!e.autoHours&&n.hours.trim().length>0)&&(t+=n.address.replace(",",""),t+=", "+n.originalAmount.replace(",",""),e.autoHours||(t+=", "+n.hours.replace(",","")),t+="\r\n")}),FR.openDialog(this.dialog,t).afterClosed().subscribe(function(t){t&&(t.length>0?(e.autoHours=void 0===t[0].hours,setTimeout(function(){return e.formMultipleDestinations.setDestinations(t)})):e.formMultipleDestinations.resetForm())})},e.prototype.changeNote=function(e){this.form.get("note").setValue(e),this.form.get("note").markAsTouched(),this.form.updateValueAndValidity()},e.prototype.setManualHours=function(){this.autoHours=!1},e.prototype.changeHoursAddedToSimpleForm=function(e){this.hoursAddedToSimpleForm=e},e.prototype.toggleOptions=function(e){var t=this;e.stopPropagation(),e.preventDefault(),this.showAutoHourDistributionOptions&&this.autoShareValue!==this.defaultAutoShareValue?vO.openDialog(this.dialog,{text:"send.close-hours-share-factor-alert",defaultButtons:gO.YesNo}).afterClosed().subscribe(function(e){e&&(t.autoShareValue=t.defaultAutoShareValue,t.showAutoHourDistributionOptions=!t.showAutoHourDistributionOptions)}):(this.autoShareValue=this.defaultAutoShareValue,this.showAutoHourDistributionOptions=!this.showAutoHourDistributionOptions)},e.prototype.setAutoHours=function(e){this.autoHours=e.checked,this.formMultipleDestinations.updateValuesAndValidity(),this.autoHours||(this.showAutoHourDistributionOptions=!1)},e.prototype.fillForm=function(){var e=this;this.showForManualUnsigned=this.formData.showForManualUnsigned,this.formSourceSelection.fill(this.formData),this.formMultipleDestinations.fill(this.formData),["changeAddress","note"].forEach(function(t){e.form.get(t).setValue(e.formData.form[t])}),this.showSimpleForm||this.formData.form.hoursSelection.type===yF.Auto?(this.autoShareValue=this.formData.form.hoursSelection.share_factor?this.formData.form.hoursSelection.share_factor:this.defaultAutoShareValue,this.autoHours=!0):this.autoHours=!1,this.showAutoHourDistributionOptions=this.formData.form.showAutoHourDistributionOptions},e.prototype.validateForm=function(){this.changeAddressErrorMsg="";var e=!0,t=this.form.get("changeAddress").value;return t&&t.length<20&&(e=!1,this.form.get("changeAddress").touched&&(this.changeAddressErrorMsg="send.address-error-info")),this.formSourceSelection&&this.formSourceSelection.valid&&this.formMultipleDestinations&&this.formMultipleDestinations.valid||(e=!1),e?null:{Invalid:!0}},e.prototype.checkBeforeCreatingTx=function(e){var t=this;!this.form.valid||this.previewButton.isLoading()||this.sendButton.isLoading()||(this.closeSyncCheckSubscription(),this.syncCheckSubscription=this.blockchainService.progress.pipe(eS()).subscribe(function(n){n.synchronized?t.checkHoursBeforeCreatingTx(e):vO.openDialog(t.dialog,{text:"send.synchronizing-warning",defaultButtons:gO.YesNo}).afterClosed().subscribe(function(n){n&&t.checkHoursBeforeCreatingTx(e)})}))},e.prototype.checkHoursBeforeCreatingTx=function(e){var t=this;if(this.form.valid&&!this.previewButton.isLoading()&&!this.sendButton.isLoading()){var n,i=new CM.BigNumber(0),r=new CM.BigNumber(0);if(this.formMultipleDestinations.getDestinations(!0).forEach(function(e){i=i.plus(e.coins),t.autoHours||(r=r.plus(e.hours))}),i.isEqualTo(this.availableBalance.availableCoins)||r.isEqualTo(this.availableBalance.availableHours)||1===Number(this.autoShareValue)&&this.autoHours)n=r.isEqualTo(this.availableBalance.availableHours)?"send.sending-all-hours-waning":i.isEqualTo(this.availableBalance.availableCoins)?this.formSourceSelection.wallet.coins.isEqualTo(this.availableBalance.availableCoins)?"send.sending-all-hours-with-coins-waning":"send.advanced-sending-all-hours-with-coins-waning":this.formSourceSelection.wallet.coins.isEqualTo(this.availableBalance.availableCoins)?"send.high-hours-share-waning":"send.advanced-high-hours-share-waning",vO.openDialog(this.dialog,{headerText:"common.warning-title",redTitle:!0,text:n,defaultButtons:gO.YesNo}).afterClosed().subscribe(function(n){n&&t.prepareTransaction(e)});else this.prepareTransaction(e)}},e.prototype.prepareTransaction=function(e){var t=this;this.msgBarService.hide(),this.previewButton.resetState(),this.sendButton.resetState(),this.showForManualUnsigned||!this.selectedSources.wallet.encrypted||this.selectedSources.wallet.isHardware||e?e||this.showForManualUnsigned||!this.selectedSources.wallet.isHardware?this.createTransaction(e):(this.showBusy(e),this.processingSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.selectedSources.wallet.addresses[0].address).subscribe(function(){return t.createTransaction(e)},function(e){return t.showError(e)})):LA.openDialog(this.dialog,{wallet:this.selectedSources.wallet}).componentInstance.passwordSubmit.subscribe(function(n){t.createTransaction(e,n)})},e.prototype.createTransaction=function(e,t){var n,i=this;this.showBusy(e),n=this.showForManualUnsigned?this.selectedSources.manualAddresses:this.selectedSources.addresses&&this.selectedSources.addresses.length>0?this.selectedSources.addresses.map(function(e){return e.address}):null;var r=this.selectedSources.unspentOutputs&&this.selectedSources.unspentOutputs.length>0?this.selectedSources.unspentOutputs.map(function(e){return e.hash}):null,a=this.formMultipleDestinations.getDestinations(!0);this.formMultipleDestinations.setValidAddressesList(null),this.invalidChangeAddress=!1;var o=this.form.get("changeAddress").value,s=a.map(function(e){return e.address});o&&s.push(o),this.processingSubscription=yf(s.map(function(e){return i.walletsAndAddressesService.verifyAddress(e)})).pipe(ue(function(s){if(o&&(i.invalidChangeAddress=!s.pop(),i.invalidChangeAddress))return sg(i.translate.instant("send.change-address-error-info"));var u=0;return s.forEach(function(e){e||(u+=1)}),0===u?i.spendingService.createTransaction(i.selectedSources.wallet,n||i.selectedSources.wallet.addresses.map(function(e){return e.address}),r,a,i.hoursSelection,i.form.get("changeAddress").value?i.form.get("changeAddress").value:null,t?t.password:null,e||i.showForManualUnsigned):(i.formMultipleDestinations.setValidAddressesList(s),sg(i.translate.instant(a.length>1?u===a.length?"send.all-addresses-invalid-error":1===u?"send.one-invalid-address-error":"send.various-invalid-addresses-error":"send.invalid-address-error")))})).subscribe(function(n){t&&t.close();var r=i.form.value.note.trim();if(n.note=r,e){var o=new CM.BigNumber("0");a.map(function(e){return o=o.plus(e.coins)}),i.onFormSubmitted.emit({form:{wallet:i.selectedSources.wallet,addresses:i.selectedSources.addresses,manualAddresses:i.selectedSources.manualAddresses,changeAddress:i.form.get("changeAddress").value,destinations:a,hoursSelection:i.hoursSelection,showAutoHourDistributionOptions:i.showAutoHourDistributionOptions,allUnspentOutputs:i.formSourceSelection.unspentOutputsList,outputs:i.selectedSources.unspentOutputs,currency:i.formMultipleDestinations.currentlySelectedCurrency,note:r},amount:o,to:a.map(function(e){return e.address}),transaction:n,showForManualUnsigned:i.showForManualUnsigned}),i.busy=!1,i.navBarSwitchService.enableSwitch()}else i.showForManualUnsigned?gF.openDialog(i.dialog,{rawTx:n.encoded,isUnsigned:!0}).afterClosed().subscribe(function(){i.resetState(),vO.openDialog(i.dialog,{text:"offline-transactions.copy-tx.reset-confirmation",defaultButtons:gO.YesNo}).afterClosed().subscribe(function(e){e&&(i.resetForm(),i.msgBarService.showDone("offline-transactions.copy-tx.reset-done",4e3))})}):i.processingSubscription=i.spendingService.injectTransaction(n.encoded,r).subscribe(function(e){var t=!0;r&&!e&&(i.msgBarService.showWarning(i.translate.instant("send.saving-note-error")),t=!1),i.showSuccess(t)},function(e){return i.showError(e)})},function(e){t&&t.error(e),i.showError(e)})},e.prototype.resetForm=function(){this.formSourceSelection.resetForm(),this.formMultipleDestinations.resetForm(),this.form.get("changeAddress").setValue(""),this.form.get("note").setValue(""),this.autoHours=!0,this.showAutoHourDistributionOptions=!1,this.autoShareValue=this.defaultAutoShareValue},Object.defineProperty(e.prototype,"hoursSelection",{get:function(){var e={type:yF.Manual};return this.autoHours&&!this.hoursAddedToSimpleForm&&(e={type:yF.Auto,mode:"share",share_factor:this.autoShareValue}),e},enumerable:!1,configurable:!0}),e.prototype.closeSyncCheckSubscription=function(){this.syncCheckSubscription&&this.syncCheckSubscription.unsubscribe()},e.prototype.showBusy=function(e){e?(this.previewButton.setLoading(),this.sendButton.setDisabled()):(this.sendButton.setLoading(),this.previewButton.setDisabled()),this.busy=!0,this.navBarSwitchService.disableSwitch()},e.prototype.showSuccess=function(e){var t=this;this.busy=!1,this.navBarSwitchService.enableSwitch(),this.resetForm(),e?(this.msgBarService.showDone("send.sent"),this.sendButton.resetState()):(this.sendButton.setSuccess(),setTimeout(function(){t.sendButton.resetState()},3e3))},e.prototype.showError=function(e){this.busy=!1,this.msgBarService.showError(e),this.navBarSwitchService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},e.prototype.resetState=function(){this.busy=!1,this.navBarSwitchService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},e.\u0275fac=function(t){return new(t||e)(ps(jS),ps(yO),ps(Pk),ps(dL),ps(WP),ps(gC),ps(dM),ps(ll),ps(bF),ps(AL))},e.\u0275cmp=ft({type:e,selectors:[["app-send-coins-form"]],viewQuery:function(e,t){if(1&e&&(lc(wF,5),lc(kF,5),lc(MF,5),lc(SF,5)),2&e){var n=void 0;uc(n=dc())&&(t.formSourceSelection=n.first),uc(n=dc())&&(t.formMultipleDestinations=n.first),uc(n=dc())&&(t.previewButton=n.first),uc(n=dc())&&(t.sendButton=n.first)}},inputs:{formData:"formData",showSimpleForm:"showSimpleForm"},outputs:{onFormSubmitted:"onFormSubmitted"},decls:49,vars:22,consts:[["class","mode-selector",4,"ngIf"],[3,"formGroup"],[3,"busy","selectionMode","onSelectionChanged"],["formSourceSelection",""],["class","form-field -available-msg",4,"ngIf"],[3,"availableBalance","busy","showHourFields","showSimpleForm","onChanges","onBulkRequested","newNoteRequested","manualHoursRequested","hoursAddedToSimpleForm"],["formMultipleDestinations",""],["class","form-field",4,"ngIf"],["class","form-field row -options-wrapper",3,"ngClass",4,"ngIf"],[1,"text-center"],[3,"disabled","action"],["previewButton",""],[1,"primary-button",3,"disabled","action"],["sendButton",""],["hoursSelector",""],[1,"mode-selector"],["className","light small",3,"changeActiveButtonManually","leftButtonText","rightButtonText","activeButton","ngClass","onStateChange"],[1,"form-field","-available-msg"],[4,"ngIf"],[1,"value"],[1,"form-field"],["for","change-address"],[1,"help-icon",3,"matTooltip"],[3,"text","ngClass","pressed"],["formControlName","changeAddress","id","change-address",3,"appFormFieldError","keydown.enter","blur"],["for","note"],["formControlName","note","id","note",3,"maxlength","keydown.enter"],[3,"noPadding","text","pointDown","pressed",4,"ngIf"],[3,"noPadding","text","pointDown","pressed"],[1,"form-field","row","-options-wrapper",3,"ngClass"],[4,"ngTemplateOutlet"],[1,"row",3,"ngClass"],[1,"col-12"],[1,"-check",3,"checked","change"],[3,"text","pointDown","mousedown","pressed",4,"ngIf"],[3,"ngClass"],[3,"text","pointDown","mousedown","pressed"],[1,"col-md-7"],["for","value",1,"-space-between"],["min","0","max","1","step","0.01","id","value",3,"value","ngClass","input"]],template:function(e,t){1&e&&(hs(0,LF,7,11,"div",0),ru(1,"\n\n"),vs(2,"div",1),ru(3,"\n "),ru(4,"\n "),vs(5,"app-form-source-selection",2,3),xs("onSelectionChanged",function(){return t.sourceSelectionChanged()}),ru(7,"\n "),_s(),ru(8,"\n\n "),ru(9,"\n "),hs(10,DF,6,2,"div",4),ru(11,"\n\n "),ru(12,"\n "),vs(13,"app-form-destination",5,6),xs("onChanges",function(){return t.destinationsChanged()})("onBulkRequested",function(){return t.openMultipleDestinationsPopup()})("newNoteRequested",function(e){return t.changeNote(e)})("manualHoursRequested",function(){return t.setManualHours()})("hoursAddedToSimpleForm",function(e){return t.changeHoursAddedToSimpleForm(e)}),ru(15,"\n "),_s(),ru(16,"\n\n "),ru(17,"\n "),hs(18,OF,15,12,"div",7),ru(19,"\n\n "),ru(20,"\n "),hs(21,EF,12,8,"div",7),ru(22,"\n\n "),ru(23,"\n "),hs(24,PF,4,1,"div",7),ru(25,"\n\n "),hs(26,RF,4,4,"div",8),ru(27,"\n\n "),ru(28,"\n "),hs(29,BF,23,15,"div",7),ru(30,"\n"),_s(),ru(31,"\n\n"),ru(32,"\n"),vs(33,"div",9),ru(34,"\n "),vs(35,"app-button",10,11),xs("action",function(){return t.preview()}),ru(37),Wl(38,"translate"),_s(),ru(39,"\n "),vs(40,"app-button",12,13),xs("action",function(){return t.send()}),ru(42),Wl(43,"translate"),_s(),ru(44,"\n"),_s(),ru(45,"\n\n"),hs(46,WF,24,20,"ng-template",null,14,mc),ru(48,"\n")),2&e&&(ms("ngIf",!t.showSimpleForm),Ya(2),ms("formGroup",t.form),Ya(3),ms("busy",t.busy)("selectionMode",t.showSimpleForm?t.sourceSelectionModes.Wallet:t.showForManualUnsigned?t.sourceSelectionModes.Manual:t.sourceSelectionModes.All),Ya(5),ms("ngIf",!t.showSimpleForm),Ya(3),ms("availableBalance",t.availableBalance)("busy",t.busy)("showHourFields",!t.autoHours)("showSimpleForm",t.showSimpleForm),Ya(5),ms("ngIf",!t.showSimpleForm),Ya(3),ms("ngIf",!t.showForManualUnsigned),Ya(3),ms("ngIf",t.showSimpleForm&&!t.hoursAddedToSimpleForm),Ya(2),ms("ngIf",t.showSimpleForm&&!t.hoursAddedToSimpleForm),Ya(3),ms("ngIf",!t.showSimpleForm),Ya(6),ms("disabled",!t.form.valid),Ya(2),ou("\n ",Vl(38,18,"send.preview-button"),"\n "),Ya(3),ms("disabled",!t.form.valid),Ya(2),ou("\n ",Vl(43,20,"send."+(t.showForManualUnsigned?"show":"send")+"-button"),"\n "))},styles:[".mode-selector[_ngcontent-%COMP%]{text-align:right;height:0}.mode-selector[_ngcontent-%COMP%] app-double-button[_ngcontent-%COMP%]{display:inline-block;position:relative;top:-27px;right:-27px}.-options-wrapper[_ngcontent-%COMP%]{margin-top:20px}.-space-between[_ngcontent-%COMP%]{display:flex;justify-content:space-between}.-available-msg[_ngcontent-%COMP%]{background-color:#f7f7f7;border:1px dotted rgba(30,34,39,.2);border-radius:6px;padding:10px;font-size:11px;text-align:center}.-available-msg[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{opacity:.7}.-available-msg[_ngcontent-%COMP%] .value[_ngcontent-%COMP%]{opacity:1!important;font-weight:700;font-size:13px}"]}),e}(),UF=function(){function e(e,t){var n=this;this.http=e,this.storageService=t,this.API_ENDPOINT="https://swaplab.cc/api/v3",this.STORAGE_KEY="exchange-orders",this.LAST_VIEWED_STORAGE_KEY="last-viewed-order",this.API_KEY=FS,this.TEST_MODE=false,this.lastViewedOrderLoaded=new Rv(!1),t.get(yL.CLIENT,this.LAST_VIEWED_STORAGE_KEY).subscribe(function(e){n.lastViewedOrder=JSON.parse(e.data),n.lastViewedOrderLoaded.next(!0)},function(){n.lastViewedOrderLoaded.next(!0)})}return Object.defineProperty(e.prototype,"lastViewedOrder",{get:function(){return this._lastViewedOrder},set:function(e){this._lastViewedOrder=e,this.saveLastViewedSubscription&&this.saveLastViewedSubscription.unsubscribe(),this.saveLastViewedSubscription=this.storageService.store(yL.CLIENT,this.LAST_VIEWED_STORAGE_KEY,JSON.stringify(e)).subscribe()},enumerable:!1,configurable:!0}),e.prototype.tradingPairs=function(){return this.post("trading_pairs").pipe(K(function(e){return e.result}))},e.prototype.exchange=function(e,t,n,i){var r,a=this;return this.post("orders",{pair:e,fromAmount:t,toAddress:n}).pipe(ue(function(e){return a.storeOrder(r=e.result,i)}),K(function(){return r}))},e.prototype.status=function(e,t){return this.TEST_MODE&&!t&&(t="user_waiting"),this.post("orders/status",{id:e},this.TEST_MODE?{status:t}:null).pipe(xM(function(e){return e.pipe(ue(function(e){return e.originalError&&e.originalError.status&&404===e.originalError.status?sg(e):bm(e)}),EM(3e3))}),K(function(e){return e.result}))},e.prototype.history=function(){return this.storageService.get(yL.CLIENT,this.STORAGE_KEY).pipe(K(function(e){return JSON.parse(e.data)}))},e.prototype.isOrderFinished=function(e){return["complete","error","user_deposit_timeout"].indexOf(e.status)>-1},e.prototype.post=function(e,t,n){return this.http.post(this.buildUrl(e),t,{responseType:"json",headers:new rS(_f({"api-key":this.API_KEY,Accept:"application/json"},n))}).pipe(qM(function(e){return sg(VM(e))}))},e.prototype.buildUrl=function(e){return this.TEST_MODE&&"trading_pairs"!==e?this.API_ENDPOINT+"sandbox/"+e:this.API_ENDPOINT+"/"+e},e.prototype.storeOrder=function(e,t){var n=this;return this.history().pipe(qM(function(e){try{if(e.originalError&&e.originalError.status&&404===e.originalError.status)return bm([])}catch(t){}return sg(e)}),ue(function(i){var r={id:e.id,pair:e.pair,fromAmount:e.fromAmount,toAmount:e.toAmount,address:e.toAddress,timestamp:RA().unix(),price:t};i.push(r);var a=JSON.stringify(i);return i.pop(),n.storageService.store(yL.CLIENT,n.STORAGE_KEY,a).pipe(Hv(function(){return i.push(r)}))}))},e.\u0275prov=Ie({token:e,factory:e.\u0275fac=function(t){return new(t||e)(Bi(MS),Bi(bL))}}),e}(),zF=function(){function e(e){this.appService=e}return e.prototype.transform=function(e){return"hours"===e?this.appService.hoursName:"coin"===e?this.appService.coinName:"coinFull"===e?this.appService.fullCoinName:""},e.\u0275fac=function(t){return new(t||e)(ps(jS,16))},e.\u0275pipe=wt({name:"commonText",type:e,pure:!1}),e}(),qF=function(){function e(e,t){this.dialogRef=e,this.formBuilder=t,this.inputErrorMsg=""}return e.openDialog=function(t){var n=new wk;return n.autoFocus=!0,n.width=jM.mediumModalWidth,t.open(e,n)},e.prototype.ngOnInit=function(){this.form=this.formBuilder.group({link:[""]}),this.form.setValidators(this.validateForm.bind(this))},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.process=function(){this.form.valid&&this.dialogRef.close(this.form.get("link").value)},e.prototype.validateForm=function(){this.inputErrorMsg="";var e=!0;return FM(this.form.get("link").value)||(e=!1,this.form.get("link").touched&&(this.inputErrorMsg="send.fill-with-link.link-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ps(Lk),ps(fm))},e.\u0275cmp=ft({type:e,selectors:[["app-enter-link"]],decls:34,vars:19,consts:[[3,"headline","dialog"],[1,"modal-form-container",3,"formGroup"],[1,"form-field"],["for","link"],["formControlName","link","id","link",3,"appFormFieldError","keydown.enter","blur"],[1,"-buttons"],[3,"action"],[1,"primary-button",3,"disabled","action"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),vs(4,"div"),ru(5),Wl(6,"translate"),_s(),ru(7,"\n "),ru(8,"\n "),vs(9,"div",1),ru(10,"\n "),vs(11,"div",2),ru(12,"\n "),vs(13,"label",3),ru(14),Wl(15,"translate"),_s(),ru(16,"\n "),vs(17,"input",4),xs("keydown.enter",function(){return t.process()})("blur",function(){return t.validateForm()}),_s(),ru(18,"\n "),_s(),ru(19,"\n "),_s(),ru(20,"\n "),ru(21,"\n "),vs(22,"div",5),ru(23,"\n "),vs(24,"app-button",6),xs("action",function(){return t.closePopup()}),ru(25),Wl(26,"translate"),_s(),ru(27,"\n "),vs(28,"app-button",7),xs("action",function(){return t.process()}),ru(29),Wl(30,"translate"),_s(),ru(31,"\n "),_s(),ru(32,"\n"),_s(),ru(33,"\n")),2&e&&(ms("headline",Vl(1,9,"send.fill-with-link.title"))("dialog",t.dialogRef),Ya(5),ou("\n ",Vl(6,11,"send.fill-with-link.link-info"),"\n "),Ya(4),ms("formGroup",t.form),Ya(5),au(Vl(15,13,"send.fill-with-link.link-label")),Ya(3),ms("appFormFieldError",t.inputErrorMsg),Ya(8),ou("\n ",Vl(26,15,"common.cancel-button"),"\n "),Ya(3),ms("disabled",!t.form.valid),Ya(1),ou("\n ",Vl(30,17,"send.fill-with-link.process-button"),"\n "))},directives:[jk,ap,jp,Lf,rp,qp,RO,ZC],pipes:[hM],styles:[""]}),e}(),GF=function(e){return e.bulk="bulk",e.link="link",e}({}),KF=function(){function e(e){this.dialogRef=e,this.destinationTools=GF}return e.openDialog=function(t){var n=new wk;return n.autoFocus=!1,n.width=jM.mediumModalWidth,t.open(e,n)},e.prototype.closePopup=function(){this.dialogRef.close()},e.prototype.select=function(e){this.dialogRef.close(e)},e.\u0275fac=function(t){return new(t||e)(ps(Lk))},e.\u0275cmp=ft({type:e,selectors:[["app-destination-tools"]],decls:31,vars:10,consts:[[3,"headline","dialog"],[1,"list-button-container","light-button-theme"],["mat-button","","color","primary",1,"top-line",3,"click"],[1,"content"],["src","assets/img/list-purple.png"],["mat-button","","color","primary",3,"click"],["src","assets/img/link-blue.png"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),vs(3,"div",1),ru(4,"\n "),vs(5,"button",2),xs("click",function(){return t.select(t.destinationTools.bulk)}),ru(6,"\n "),vs(7,"div",3),ru(8,"\n "),ys(9,"img",4),ru(10,"\n "),vs(11,"span"),ru(12),Wl(13,"translate"),_s(),ru(14,"\n "),_s(),ru(15,"\n "),_s(),ru(16,"\n "),vs(17,"button",5),xs("click",function(){return t.select(t.destinationTools.link)}),ru(18,"\n "),vs(19,"div",3),ru(20,"\n "),ys(21,"img",6),ru(22,"\n "),vs(23,"span"),ru(24),Wl(25,"translate"),_s(),ru(26,"\n "),_s(),ru(27,"\n "),_s(),ru(28,"\n "),_s(),ru(29,"\n"),_s(),ru(30,"\n")),2&e&&(ms("headline",Vl(1,4,"send.destination-tools-title"))("dialog",t.dialogRef),Ya(12),au(Vl(13,6,"send.bulk-send.title")),Ya(12),ou("\n ",Vl(25,8,"send.fill-with-link.title"),"\n "))},directives:[jk,SC],pipes:[hM],styles:[".content[_ngcontent-%COMP%]{display:flex;align-items:center}.content[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:32px;width:32px;margin-right:5px}.content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:13px;line-height:1.7;color:#1e2227}"]}),e}();function JF(e,t){if(1&e){var n=Ms();vs(0,"div",2),ru(1,"\n "),vs(2,"label",10),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),vs(6,"input",11),xs("blur",function(){return on(n),Ys().validateForm()}),_s(),ru(7,"\n "),_s()}if(2&e){var i=Ys();Ya(3),au(Vl(4,3,"send.to-label")),Ya(3),ms("appFormFieldError",i.isAddressValid(0)?i.singleAddressErrorMsg:"send.invalid-addresses-error"),ls("disabled",i.busy?"true":null)}}function ZF(e,t){1&e&&(vs(0,"mat-icon",12),Wl(1,"translate"),ru(2,"help"),_s()),2&e&&ms("matTooltip",Vl(1,1,"send.destinations-help"+(Ys().showHourFields?"2":"1")))}var $F=function(e){return{"element-disabled":e}};function XF(e,t){if(1&e){var n=Ms();vs(0,"div",13),ru(1,"\n "),vs(2,"app-double-button",14),xs("onStateChange",function(e){return on(n),Ys().changeActiveCurrency(e)}),Wl(3,"commonText"),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}if(2&e){var i=Ys();ms("ngClass",Il(8,$F,i.busy)),Ya(2),ms("leftButtonText",Vl(3,4,"coin"))("rightButtonText",Vl(4,6,"common.usd"))("activeButton",i.selectedCurrency)}}function QF(e,t){if(1&e){var n=Ms();vs(0,"app-arrow-link",15),xs("pressed",function(){return on(n),Ys().showDestinationTools()}),ru(1,"\n "),_s()}if(2&e){var i=Ys();ms("text","send.destination-tools-title")("ngClass",Il(2,$F,i.busy))}}function eH(e,t){if(1&e){var n=Ms();vs(0,"app-arrow-link",15),xs("pressed",function(){return on(n),Ys().openLinkModalWindow()}),ru(1,"\n "),_s()}if(2&e){var i=Ys();ms("text","send.fill-with-link.title")("ngClass",Il(2,$F,i.busy))}}function tH(e,t){if(1&e){var n=Ms();vs(0,"div",27),ru(1,"\n "),vs(2,"input",28),xs("blur",function(){return on(n),Ys(2).validateForm()}),_s(),ru(3,"\n "),_s()}if(2&e){var i=Ys().index,r=Ys();Ya(2),ms("id",0===i?"destination":"address"+i)("appFormFieldError",r.isAddressValid(i)?r.addressErrorMsgs[i]:"send.invalid-addresses-error"),ls("disabled",r.busy?"true":null)}}function nH(e,t){1&e&&(vs(0,"span"),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"send.invalid-amount")))}function iH(e,t){if(1&e&&(vs(0,"span"),ru(1),Wl(2,"number"),Wl(3,"translate"),_s()),2&e){var n=Ys().index,i=Ys();Ya(1),su("\n ~ ",Ul(2,2,i.values[n].toString(),"1.0-2")," ",Vl(3,5,"common.usd"),"\n ")}}function rH(e,t){if(1&e&&(vs(0,"span"),ru(1),Wl(2,"amount"),_s()),2&e){var n=Ys().index,i=Ys();Ya(1),ou("\n ~ ",Vl(2,1,i.values[n]),"\n ")}}var aH=function(e){return{"-input-addon":!0,"d-none":e}};function oH(e,t){if(1&e){var n=Ms();vs(0,"div",29),ru(1,"\n "),vs(2,"div",19),ru(3,"\n "),vs(4,"input",30),xs("blur",function(){return on(n),Ys(2).validateForm()}),_s(),ru(5,"\n "),vs(6,"span"),ru(7),Wl(8,"commonText"),_s(),ru(9,"\n "),_s(),ru(10,"\n "),_s()}if(2&e){var i=Ys().index,r=Ys();Ya(2),ms("ngClass",Il(6,aH,!r.showHourFields)),Ya(2),ms("appFormFieldError",r.gethoursErrorMsg(i)),ls("disabled",r.busy?"true":null),Ya(3),au(Vl(8,4,"hours"))}}function sH(e,t){if(1&e){var n=Ms();vs(0,"img",34),xs("click",function(){return on(n),Ys(3).addDestination()}),_s()}}function uH(e,t){if(1&e){var n=Ms();vs(0,"img",35),xs("click",function(){on(n);var e=Ys(2).index;return Ys().removeDestination(e)}),_s()}}function lH(e,t){if(1&e&&(vs(0,"div",31),ru(1,"\n "),hs(2,sH,1,0,"img",32),ru(3,"\n "),hs(4,uH,1,0,"img",33),ru(5,"\n "),_s()),2&e){var n=Ys().index,i=Ys();ms("ngClass",Il(3,$F,i.busy)),Ya(2),ms("ngIf",0===n),Ya(2),ms("ngIf",0!==n)}}var cH=function(e,t){return{"col-md-3":e,"col-md-12":t}},dH=function(e){return{"centerd-link":e}};function hH(e,t){if(1&e){var n=Ms();vs(0,"div",16),ru(1,"\n "),vs(2,"div",17),ru(3,"\n "),ru(4,"\n "),hs(5,tH,4,3,"div",18),ru(6,"\n "),ru(7,"\n "),vs(8,"div",19),ru(9,"\n "),vs(10,"div",20),ru(11,"\n "),vs(12,"input",21),xs("blur",function(){return on(n),Ys().validateForm()}),_s(),ru(13,"\n "),vs(14,"span"),ru(15),Wl(16,"commonText"),Wl(17,"translate"),_s(),ru(18,"\n "),_s(),ru(19,"\n "),ru(20,"\n "),vs(21,"div",22),ru(22,"\n "),hs(23,nH,3,3,"span",23),ru(24,"\n "),hs(25,iH,4,7,"span",23),ru(26,"\n "),hs(27,rH,3,3,"span",23),ru(28,"\n "),vs(29,"div",24),xs("click",function(){var e=on(n).index;return Ys().assignAll(e)}),ru(30),Wl(31,"translate"),_s(),ru(32,"\n "),_s(),ru(33,"\n "),_s(),ru(34,"\n "),ru(35,"\n "),hs(36,oH,11,8,"div",25),ru(37,"\n "),hs(38,lH,6,5,"div",26),ru(39,"\n "),_s(),ru(40,"\n "),_s()}if(2&e){var i=t.index,r=Ys();Ya(2),ms("formGroupName",i),Ya(3),ms("ngIf",!r.showSimpleForm),Ya(3),ms("ngClass",Rl(19,cH,!r.showSimpleForm,r.showSimpleForm)),Ya(4),ms("appFormFieldError",r.getCoinsErrorMsg(i)),ls("disabled",r.busy?"true":null),Ya(3),au(r.selectedCurrency===r.doubleButtonActive.LeftButton?Vl(16,13,"coin"):Vl(17,15,"common.usd")),Ya(8),ms("ngIf",r.price&&r.values[i].isLessThanOrEqualTo(0)),Ya(2),ms("ngIf",r.price&&r.values[i].isGreaterThan(0)&&r.selectedCurrency===r.doubleButtonActive.LeftButton),Ya(2),ms("ngIf",r.price&&r.values[i].isGreaterThan(0)&&r.selectedCurrency===r.doubleButtonActive.RightButton),Ya(2),ms("ngClass",Il(22,dH,!r.price)),Ya(1),ou("(",Vl(31,17,"send.send-all-available-coins-link"),")"),Ya(6),ms("ngIf",!r.showSimpleForm),Ya(2),ms("ngIf",!r.showSimpleForm)}}function fH(e,t){if(1&e&&(bs(0),ru(1),Wl(2,"number"),Wl(3,"translate"),ws()),2&e){var n=Ys(2);Ya(1),su("/ ",Ul(2,2,n.totalFiat.toString(),"1.0-2")," ",Vl(3,5,"common.usd"),"")}}var pH=function(e){return{"error-coins-value":e}};function mH(e,t){if(1&e&&(vs(0,"div",29),ru(1,"\n "),vs(2,"div",38),Wl(3,"translate"),ru(4,"\n "),vs(5,"span"),ru(6),Wl(7,"translate"),_s(),ru(8),Wl(9,"amount"),_s(),ru(10,"\n "),_s()),2&e){var n=Ys(2);Ya(2),ms("ngClass",Il(11,pH,n.insufficientHours))("matTooltip",n.insufficientHours?Vl(3,4,"send.insufficient-funds-error-info"):""),Ya(4),au(Vl(7,6,"send.total-to-send")),Ya(2),ou(" ",Ul(9,8,n.totalHours,!1),"\n ")}}function gH(e,t){if(1&e&&(vs(0,"div",36),ru(1,"\n "),ys(2,"div",27),ru(3,"\n "),vs(4,"div",37),ru(5,"\n "),vs(6,"div",38),Wl(7,"translate"),ru(8,"\n "),vs(9,"span"),ru(10),Wl(11,"translate"),_s(),ru(12),Wl(13,"amount"),hs(14,fH,4,7,"ng-container",23),ru(15,"\n "),_s(),ru(16,"\n "),_s(),ru(17,"\n "),hs(18,mH,11,13,"div",25),ru(19,"\n "),_s()),2&e){var n=Ys();Ya(6),ms("ngClass",Il(12,pH,n.insufficientCoins))("matTooltip",n.insufficientCoins?Vl(7,6,"send.insufficient-funds-error-info"):""),Ya(4),au(Vl(11,8,"send.total-to-send")),Ya(2),ou(" ",Vl(13,10,n.totalCoins),"\n "),Ya(2),ms("ngIf",n.price),Ya(4),ms("ngIf",n.showHourFields)}}var vH=function(e){return{"simple-form-hours-error":e}};function _H(e,t){if(1&e){var n=Ms();vs(0,"div",39),ru(1,"\n "),vs(2,"span",40),Wl(3,"translate"),ru(4),Wl(5,"translate"),Wl(6,"amount"),_s(),ru(7,"\n "),vs(8,"mat-icon",41),xs("click",function(){return on(n),Ys().removeSimpleFormhours()}),Wl(9,"translate"),ru(10,"clear"),_s(),ru(11,"\n "),_s()}if(2&e){var i=Ys();Ya(2),ms("ngClass",Il(16,vH,i.simpleFormHoursErrorMsg))("matTooltip",Vl(3,6,i.simpleFormHoursErrorMsg?i.simpleFormHoursErrorMsg:"")),Ya(2),su("",Vl(5,8,"send.specific-hours")," ",zl(6,10,i.simpleFormSpecificHours.toString(),!1,"first"),""),Ya(4),ms("inline",!0)("matTooltip",Vl(9,14,"send.remove-specific-hours-info"))}}var yH=function(){function e(e,t,n,i,r,a){this.appService=e,this.formBuilder=t,this.dialog=n,this.msgBarService=i,this.translate=r,this.priceService=a,this.onChanges=new Zl,this.onBulkRequested=new Zl,this.newNoteRequested=new Zl,this.manualHoursRequested=new Zl,this.hoursAddedToSimpleForm=new Zl,this.doubleButtonActive=NP,this.selectedCurrency=NP.LeftButton,this.totalCoins=new CM.BigNumber(0),this.totalFiat=new CM.BigNumber(0),this.totalHours=new CM.BigNumber(0),this.addressErrorMsgs=[],this.coinsErrorMsgs=[],this.hoursErrorMsgs=[],this.singleAddressErrorMsg="",this.simpleFormHoursErrorMsg="",this.insufficientCoins=!1,this.insufficientHours=!1,this.destinationSubscriptions=[]}return Object.defineProperty(e.prototype,"showHourFields",{get:function(){return this.showHourFieldsInternal},set:function(e){e!==this.showHourFieldsInternal&&(this.showHourFieldsInternal=e,this.form&&this.destControls.forEach(function(e){e.get("hours").setValue("")}))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"showSimpleForm",{get:function(){return this.showSimpleFormInternal},set:function(e){this.showSimpleFormInternal=e,this.form&&(e?this.form.get("address").setValidators(Yf.required):this.form.get("address").clearValidators(),this.form.get("address").updateValueAndValidity(),this.form.get("destinations").updateValueAndValidity())},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"destControls",{get:function(){return this.form.get("destinations").controls},enumerable:!1,configurable:!0}),e.prototype.ngOnInit=function(){var e=this;this.form=this.formBuilder.group({address:[""],destinations:this.formBuilder.array([])}),this.form.setValidators(this.validateForm.bind(this)),this.addDestination(),this.addressSubscription=this.form.get("address").valueChanges.subscribe(function(){e.onChanges.emit()}),this.priceSubscription=this.priceService.price.subscribe(function(t){e.price=t,e.updateValuesAndValidity()})},e.prototype.ngOnDestroy=function(){this.addressSubscription.unsubscribe(),this.priceSubscription.unsubscribe(),this.destinationSubscriptions.forEach(function(e){return e.unsubscribe()}),this.onChanges.complete(),this.onBulkRequested.complete(),this.newNoteRequested.complete(),this.manualHoursRequested.complete(),this.hoursAddedToSimpleForm.complete()},e.prototype.changeActiveCurrency=function(e){e!==this.selectedCurrency&&(this.selectedCurrency=e,this.askIfConvertAmount(),this.updateValuesAndValidity(),this.form.get("destinations").updateValueAndValidity())},e.prototype.askIfConvertAmount=function(){var e=this,t=0;if(this.destControls.forEach(function(e){var n=HM(e.get("coins").value);n=n?n.trim():n;var i=new CM.BigNumber(n);n&&!i.isNaN()&&(t+=1)}),0!==t){var n,i,r=this.translate.instant("common.usd"),a=this.appService.coinName;this.selectedCurrency===NP.LeftButton?(n=r,i=a):(n=a,i=r);var o={text:this.translate.instant(1===t?"send.convert-confirmation":"send.convert-confirmation-plural",{from:n,to:i}),defaultButtons:gO.YesNo};vO.openDialog(this.dialog,o).afterClosed().subscribe(function(t){t&&e.convertAmounts()})}},e.prototype.convertAmounts=function(){var t=this;this.msgBarService.hide();var n=0,i=0;this.destControls.forEach(function(r){var a=HM(r.get("coins").value);a=a?a.trim():a;var o=new CM.BigNumber(a);if(a){if(o.isNaN())return void(n+=1);var s;t.selectedCurrency===NP.LeftButton?((s=o.dividedBy(t.price).decimalPlaces(t.appService.currentMaxDecimals)).multipliedBy(t.price).decimalPlaces(e.MaxUsdDecimals,CM.BigNumber.ROUND_FLOOR).isEqualTo(o)||(i+=1),r.get("coins").setValue(s.toString())):((s=o.multipliedBy(t.price).decimalPlaces(e.MaxUsdDecimals,CM.BigNumber.ROUND_FLOOR)).dividedBy(t.price).decimalPlaces(t.appService.currentMaxDecimals).isEqualTo(o)||(i+=1),r.get("coins").setValue(s.toString()))}}),n>0&&i>0?this.msgBarService.showWarning(this.translate.instant("send.multiple-problems-warning")):1===n?this.msgBarService.showWarning(this.translate.instant("send.invaid-amount-warning")):n>1?this.msgBarService.showWarning(this.translate.instant("send.invaid-amounts-warning")):1===i?this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")):i>1&&this.msgBarService.showWarning(this.translate.instant("send.precision-errors-warning"))},e.prototype.assignAll=function(t){var n=this;if(this.msgBarService.hide(),this.availableBalance.availableCoins.isEqualTo(0))this.msgBarService.showError(this.translate.instant("send.no-wallet-selected-error"));else{var i=this.availableBalance.availableCoins;this.selectedCurrency===NP.RightButton&&(i=i.multipliedBy(this.price).decimalPlaces(e.MaxUsdDecimals,CM.BigNumber.ROUND_FLOOR)),this.destControls.forEach(function(e,r){if(r!==t){var a=n.getAmount(HM(e.get("coins").value).trim(),!0);if(!a||a.isNaN())return;i=i.minus(a)}}),(i=i.decimalPlaces(this.selectedCurrency===NP.LeftButton?this.appService.currentMaxDecimals:e.MaxUsdDecimals,CM.BigNumber.ROUND_FLOOR)).isLessThanOrEqualTo(0)?this.msgBarService.showError(this.translate.instant("send.no-coins-left-error")):this.destControls[t].get("coins").setValue(i.toString())}},e.prototype.updateValuesAndValidity=function(){var e=this,t=this.selectedCurrency!==NP.LeftButton,n=this.price;this.price||(t=!1,n=0),this.values=[],this.totalCoins=new CM.BigNumber(0),this.totalFiat=new CM.BigNumber(0),this.totalHours=new CM.BigNumber(0),this.destControls.forEach(function(i,r){var a=HM(i.get("coins").value),o=e.getAmount(a,!0);if(o)if(t)s=o.dividedBy(n).decimalPlaces(e.appService.currentMaxDecimals),e.totalCoins=e.totalCoins.plus(s),e.totalFiat=e.totalFiat.plus(o),e.values[r]=s;else{var s=o.multipliedBy(n).decimalPlaces(2);e.totalCoins=e.totalCoins.plus(o),e.totalFiat=e.totalFiat.plus(s),e.values[r]=s}else e.values[r]=new CM.BigNumber(-1);e.showHourFields&&(a=HM(i.get("hours").value),(o=e.getAmount(a,!1))&&(e.totalHours=e.totalHours.plus(o)))}),setTimeout(function(){e.form.get("destinations").updateValueAndValidity(),e.onChanges.emit()})},e.prototype.addDestination=function(){var e=this,t=this.formBuilder.group({address:"",coins:"",hours:""});this.destinationSubscriptions.push(t.valueChanges.subscribe(function(){e.updateValuesAndValidity()})),this.form.get("destinations").push(t),this.addressErrorMsgs.push(""),this.coinsErrorMsgs.push(""),this.hoursErrorMsgs.push(""),this.updateValuesAndValidity()},e.prototype.removeDestination=function(e){this.form.get("destinations").removeAt(e),this.validAddressesList&&this.validAddressesList.length>e&&this.validAddressesList.splice(e,1),this.addressErrorMsgs&&this.addressErrorMsgs.length>e&&this.addressErrorMsgs.splice(e,1),this.coinsErrorMsgs&&this.coinsErrorMsgs.length>e&&this.coinsErrorMsgs.splice(e,1),this.hoursErrorMsgs&&this.hoursErrorMsgs.length>e&&this.hoursErrorMsgs.splice(e,1),this.destinationSubscriptions[e].unsubscribe(),this.destinationSubscriptions.splice(e,1),this.updateValuesAndValidity()},e.prototype.requestBulkSend=function(){this.onBulkRequested.emit()},e.prototype.showDestinationTools=function(){var e=this;KF.openDialog(this.dialog).afterClosed().subscribe(function(t){t===GF.bulk?e.requestBulkSend():t===GF.link&&e.openLinkModalWindow()})},e.prototype.openLinkModalWindow=function(){var e=this;qF.openDialog(this.dialog).afterClosed().subscribe(function(t){t&&e.processRequestLink(t)})},e.prototype.processRequestLink=function(e){var t=FM(e);if(t){if(this.showSimpleForm&&t.hours&&!this.getAmount(t.hours,!1))return void this.msgBarService.showError("send.fill-with-link.invalid-link-hours-error");this.checkChangesBeforeUsingLink(t)}else this.msgBarService.showError("send.fill-with-link.invalid-link-error")},e.prototype.checkChangesBeforeUsingLink=function(e){var t=this,n=!1;this.showSimpleForm?this.form.get("address").value&&(n=!0):(this.destControls[0].get("address").value&&(n=!0),e.hours&&this.destControls[0].get("hours").value&&(n=!0)),e.coins&&this.destControls[0].get("coins").value&&(n=!0),n?vO.openDialog(this.dialog,{text:"send.fill-with-link.data-overwritten-alert",defaultButtons:gO.YesNo}).afterClosed().subscribe(function(n){n&&t.finishUsingRequestLink(e)}):this.finishUsingRequestLink(e)},e.prototype.finishUsingRequestLink=function(e){var t=this;this.showSimpleForm?(this.form.get("address").setValue(e.address),this.form.get("address").markAsTouched(),e.hours?(this.simpleFormSpecificHours=this.getAmount(e.hours,!1),this.hoursAddedToSimpleForm.next(!0)):this.hoursAddedToSimpleForm.next(!1)):(this.destControls[0].get("address").setValue(e.address),this.destControls[0].get("address").markAsTouched(),e.hours&&(this.manualHoursRequested.next(),setTimeout(function(){t.destControls[0].get("hours").setValue(e.hours),t.destControls[0].get("hours").markAsTouched()}))),e.coins&&(this.destControls[0].get("coins").setValue(e.coins),this.destControls[0].get("coins").markAsTouched()),e.message&&this.newNoteRequested.next(e.message),this.form.updateValueAndValidity(),this.msgBarService.showDone("send.fill-with-link.confirmation")},e.prototype.removeSimpleFormhours=function(){var e=this;vO.openDialog(this.dialog,{text:"send.remove-specific-hours-confirmation",defaultButtons:gO.YesNo}).afterClosed().subscribe(function(t){t&&(e.simpleFormSpecificHours=null,e.hoursAddedToSimpleForm.next(!1))})},e.prototype.fill=function(e){var t=this;setTimeout(function(){t.selectedCurrency=e.form.currency;for(var n=0;n0;)this.form.get("destinations").removeAt(0);e.forEach(function(e,n){t.addDestination(),t.destControls[n].get("address").setValue(e.address),t.destControls[n].get("coins").setValue(e.coins),e.hours&&t.destControls[n].get("hours").setValue(e.hours)})},Object.defineProperty(e.prototype,"valid",{get:function(){return this.form.valid},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentlySelectedCurrency",{get:function(){return this.selectedCurrency},enumerable:!1,configurable:!0}),e.prototype.setValidAddressesList=function(e){this.validAddressesList=e,this.validAddressesList&&this.validAddressesList.length>this.destControls.length&&(this.validAddressesList=this.validAddressesList.slice(0,this.destControls.length))},e.prototype.isAddressValid=function(e){return!(this.validAddressesList&&this.validAddressesList.length>e)||this.validAddressesList[e]},e.prototype.getCoinsErrorMsg=function(e){if(ethis.destControls.length;)e.pop();for(;e.lengththis.appService.currentMaxDecimals)return null}else if(2===r.length&&r[1].length>e.MaxUsdDecimals)return null}else if(!i.isEqualTo(i.decimalPlaces(0)))return null;return i},e.prototype.resetForm=function(){for(this.form.get("address").setValue("");this.destControls.length>0;)this.form.get("destinations").removeAt(0);this.addDestination(),this.updateValuesAndValidity()},e.MaxUsdDecimals=6,e.\u0275fac=function(t){return new(t||e)(ps(jS),ps(fm),ps(Pk),ps(dL),ps(dM),ps(dP))},e.\u0275cmp=ft({type:e,selectors:[["app-form-destination"]],inputs:{availableBalance:"availableBalance",busy:"busy",showHourFields:"showHourFields",showSimpleForm:"showSimpleForm"},outputs:{onChanges:"onChanges",onBulkRequested:"onBulkRequested",newNoteRequested:"newNoteRequested",manualHoursRequested:"manualHoursRequested",hoursAddedToSimpleForm:"hoursAddedToSimpleForm"},decls:33,vars:12,consts:[[3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","destination",1,"destinations-label"],["class","help-icon",3,"matTooltip",4,"ngIf"],["class","coin-selector-container",3,"ngClass",4,"ngIf"],[3,"text","ngClass","pressed",4,"ngIf"],["formArrayName","destinations","class","-destination",4,"ngFor","ngForOf"],["class","row",4,"ngIf"],["class","form-field simple-form-hours",4,"ngIf"],["for","address"],["formControlName","address","id","address",3,"appFormFieldError","blur"],[1,"help-icon",3,"matTooltip"],[1,"coin-selector-container",3,"ngClass"],["className","light small",3,"leftButtonText","rightButtonText","activeButton","onStateChange"],[3,"text","ngClass","pressed"],["formArrayName","destinations",1,"-destination"],[1,"row",3,"formGroupName"],["class","col-lg-5 col-md-4",4,"ngIf"],[3,"ngClass"],[1,"-input-addon"],["appFormatNumber","","formControlName","coins",3,"appFormFieldError","blur"],[1,"coins-value-label"],[4,"ngIf"],[1,"link",3,"ngClass","click"],["class","col-lg-3 col-md-4",4,"ngIf"],["class","col-md-1 -icons",3,"ngClass",4,"ngIf"],[1,"col-lg-5","col-md-4"],["formControlName","address",3,"id","appFormFieldError","blur"],[1,"col-lg-3","col-md-4"],["appFormatNumber","","formControlName","hours",3,"appFormFieldError","blur"],[1,"col-md-1","-icons",3,"ngClass"],["class","image-button","src","assets/img/plus-green.png","alt","plus",3,"click",4,"ngIf"],["class","image-button","src","assets/img/minus-grey.png","alt","minus",3,"click",4,"ngIf"],["src","assets/img/plus-green.png","alt","plus",1,"image-button",3,"click"],["src","assets/img/minus-grey.png","alt","minus",1,"image-button",3,"click"],[1,"row"],[1,"col-md-3"],["matTooltipClass","error-tooltip",1,"coins-value-label",3,"ngClass","matTooltip"],[1,"form-field","simple-form-hours"],["matTooltipClass","error-tooltip",3,"ngClass","matTooltip"],[1,"remove-icon",3,"inline","matTooltip","click"]],template:function(e,t){1&e&&(vs(0,"div",0),ru(1,"\n "),ru(2,"\n "),hs(3,JF,8,5,"div",1),ru(4,"\n\n "),vs(5,"div",2),ru(6,"\n "),ru(7,"\n "),vs(8,"label",3),ru(9),Wl(10,"translate"),hs(11,ZF,3,3,"mat-icon",4),ru(12,"\n "),_s(),ru(13,"\n "),ru(14,"\n "),hs(15,XF,6,10,"div",5),ru(16,"\n\n "),ru(17,"\n "),hs(18,QF,2,4,"app-arrow-link",6),ru(19,"\n\n "),ru(20,"\n "),hs(21,eH,2,4,"app-arrow-link",6),ru(22,"\n\n "),ru(23,"\n "),hs(24,hH,41,24,"div",7),ru(25,"\n "),hs(26,gH,20,14,"div",8),ru(27,"\n "),_s(),ru(28,"\n\n "),ru(29,"\n "),hs(30,_H,12,18,"div",9),ru(31,"\n"),_s(),ru(32,"\n")),2&e&&(ms("formGroup",t.form),Ya(3),ms("ngIf",t.showSimpleForm),Ya(6),ou("\n ",Vl(10,10,t.showSimpleForm?"send.amount-label":"send.destinations-label"),"\n "),Ya(2),ms("ngIf",!t.showSimpleForm),Ya(4),ms("ngIf",t.price),Ya(3),ms("ngIf",!t.showSimpleForm),Ya(3),ms("ngIf",t.showSimpleForm),Ya(3),ms("ngForOf",t.destControls),Ya(2),ms("ngIf",t.destControls.length>1),Ya(4),ms("ngIf",t.showSimpleForm&&t.simpleFormSpecificHours))},directives:[ap,jp,lh,sh,Lf,rp,qp,RO,WC,YO,ah,BP,jO,Vp,Bp,HA],pipes:[hM,zF,Mh,NS],styles:[".-destination[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%]{text-align:right;padding-top:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.destinations-label[_ngcontent-%COMP%]{display:inline-block}.coin-selector-container[_ngcontent-%COMP%]{display:inline-block;margin-left:5px;margin-bottom:5px}.coins-value-label[_ngcontent-%COMP%]{font-size:11px;margin-top:1px;padding:3px 10px;background-color:#f7f7f7;border-radius:6px}.coins-value-label[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{opacity:.5}.coins-value-label[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{display:inline-block;margin-bottom:3px;margin-top:-5px}.coins-value-label[_ngcontent-%COMP%] .centerd-link[_ngcontent-%COMP%]{width:100%;text-align:center}.error-coins-value[_ngcontent-%COMP%]{background-color:#ff004e!important;color:#fafafa!important}.-input-addon[_ngcontent-%COMP%]{display:flex}.-input-addon[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{border-top-right-radius:0;border-bottom-right-radius:0}.-input-addon[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border:2px;border-radius:0 6px 6px 0;background:rgba(30,34,39,.05);padding:0 10px;line-height:44px;color:rgba(30,34,39,.5);font-size:13px;flex-shrink:0}.simple-form-hours[_ngcontent-%COMP%]{display:flex;align-items:center}.simple-form-hours[_ngcontent-%COMP%] .remove-icon[_ngcontent-%COMP%]{margin-left:2px;color:#ff004e;cursor:pointer}.simple-form-hours-error[_ngcontent-%COMP%]{color:#ff004e}"]}),e}();function bH(e,t){if(1&e&&ys(0,"app-loading-content",3),2&e){var n=Ys();ms("isLoading",n.currentState===n.states.Loading)("noDataText","offline-transactions.loading-problem")}}function wH(e,t){if(1&e&&(vs(0,"label",19),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys(3);Ya(1),au(Vl(2,1,n.dropdownLabel))}}function kH(e,t){if(1&e&&(vs(0,"option",20),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys(3);ms("ngValue",""),Ya(1),au(Vl(2,2,n.defaultDropdownText))}}function MH(e,t){if(1&e&&(bs(0),ru(1,"\n "),vs(2,"option",22),ru(3),_s(),ru(4,"\n "),ws()),2&e){var n=t.$implicit;Ya(2),ms("ngValue",n.value),Ya(1),ou("\n ",n.name,"\n ")}}function SH(e,t){if(1&e&&(bs(0),ru(1,"\n "),hs(2,MH,5,2,"ng-container",21),ru(3,"\n "),ws()),2&e){var n=Ys(3);Ya(2),ms("ngForOf",n.dropdownElements)}}function CH(e,t){if(1&e){var n=Ms();vs(0,"div",6),ru(1,"\n "),hs(2,wH,3,3,"label",15),ru(3,"\n "),vs(4,"div",16),ru(5,"\n "),vs(6,"select",17),xs("blur",function(){return on(n),Ys(2).validate()}),ru(7,"\n "),hs(8,kH,3,4,"option",18),ru(9,"\n "),hs(10,SH,4,1,"ng-container",2),ru(11,"\n "),_s(),ru(12,"\n "),_s(),ru(13,"\n "),_s()}if(2&e){var i=Ys(2);Ya(2),ms("ngIf",i.dropdownLabel),Ya(4),ms("appFormFieldError",i.dropdownErrorMsg),ls("disabled",i.working?"true":null),Ya(2),ms("ngIf",i.defaultDropdownText),Ya(2),ms("ngIf",i.dropdownElements)}}function LH(e,t){if(1&e&&(vs(0,"label",23),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys(2);Ya(1),au(Vl(2,1,n.inputLabel))}}function xH(e,t){if(1&e&&(vs(0,"textarea",24),ru(1),_s()),2&e){var n=Ys(2);ms("readonly",!0),Ya(1),au(n.contents)}}function TH(e,t){if(1&e){var n=Ms();vs(0,"textarea",25),xs("blur",function(){return on(n),Ys(2).validate()}),_s()}if(2&e){var i=Ys(2);ms("appFormFieldError",i.inputErrorMsg),ls("disabled",i.working?"true":null)}}function DH(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),ru(2),Wl(3,"translate"),vs(4,"div",4),ru(5,"\n "),ru(6,"\n "),hs(7,CH,14,5,"div",5),ru(8,"\n "),ru(9,"\n "),vs(10,"div",6),ru(11,"\n "),hs(12,LH,3,3,"label",7),ru(13,"\n "),hs(14,xH,2,2,"textarea",8),ru(15,"\n "),hs(16,TH,1,2,"textarea",9),ru(17,"\n "),_s(),ru(18,"\n "),_s(),ru(19,"\n "),ru(20,"\n "),vs(21,"div",10),ru(22,"\n "),vs(23,"app-button",11,12),xs("action",function(){return on(n),Ys().cancelPressed()}),ru(25),Wl(26,"translate"),_s(),ru(27,"\n "),vs(28,"app-button",13,14),xs("action",function(){return on(n),Ys().okPressed()}),ru(30),Wl(31,"translate"),_s(),ru(32,"\n "),_s(),ru(33,"\n "),ws()}if(2&e){var i=Ys();Ya(2),ou("\n ",Vl(3,10,i.text),"\n "),Ya(2),ms("formGroup",i.form),Ya(3),ms("ngIf",i.dropdownElements),Ya(5),ms("ngIf",i.inputLabel),Ya(2),ms("ngIf",!!i.contents),Ya(2),ms("ngIf",!i.contents),Ya(7),ms("disabled",i.working),Ya(2),ou("\n ",Vl(26,12,i.cancelButtonText),"\n "),Ya(3),ms("disabled",i.validateForm&&!i.form.valid||i.working),Ya(2),ou("\n ",Vl(31,14,i.okButtonText),"\n ")}}var OH=function(e){function t(t,n,i,r,a,o){var s=e.call(this,o)||this;return s.dialogRef=t,s.msgBarService=n,s.dialog=i,s.spendingService=r,s.walletsAndAddressesService=a,s.title="offline-transactions.sign-tx.title",s.text="offline-transactions.sign-tx.text",s.dropdownLabel="offline-transactions.sign-tx.wallet-label",s.defaultDropdownText="offline-transactions.sign-tx.select-wallet",s.inputLabel="offline-transactions.sign-tx.input-label",s.cancelButtonText="common.cancel-button",s.okButtonText="offline-transactions.sign-tx.sign-button",s.validateForm=!0,s.currentState=tF.Loading,s}return vf(t,e),t.openDialog=function(e){var n=new wk;return n.autoFocus=!0,n.width=jM.mediumModalWidth,e.open(t,n)},t.prototype.ngOnInit=function(){var e=this;this.walletsSubscription=this.walletsAndAddressesService.allWallets.pipe(eS()).subscribe(function(t){t?(e.dropdownElements=[],t.forEach(function(t){t.isHardware||e.dropdownElements.push({name:t.label,value:t})}),e.currentState=tF.ShowingForm,setTimeout(function(){try{1===t.length&&e.form.get("dropdown").setValue(t[0])}catch(n){}})):e.currentState=tF.ErrorLoading},function(){return e.currentState=tF.ErrorLoading})},t.prototype.ngOnDestroy=function(){this.walletsSubscription.unsubscribe(),this.closeOperationSubscription(),this.msgBarService.hide()},t.prototype.cancelPressed=function(){this.dialogRef.close()},t.prototype.okPressed=function(){var e=this;this.working||(this.msgBarService.hide(),this.form.get("dropdown").value.encrypted?LA.openDialog(this.dialog,{wallet:this.form.get("dropdown").value}).componentInstance.passwordSubmit.subscribe(function(t){t.close(),e.signTransaction(t.password)}):this.signTransaction(null))},t.prototype.signTransaction=function(e){var t=this;this.working=!0,this.okButton.setLoading(),this.closeOperationSubscription(),this.operationSubscription=this.spendingService.signTransaction(this.form.get("dropdown").value,e,null,this.form.get("input").value).subscribe(function(e){t.cancelPressed(),setTimeout(function(){return t.msgBarService.showDone("offline-transactions.sign-tx.signed")}),setTimeout(function(){gF.openDialog(t.dialog,{rawTx:e,isUnsigned:!1})},500)},function(e){t.working=!1,t.okButton.resetState(),t.msgBarService.showError(e)})},t.prototype.closeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(ps(Lk),ps(dL),ps(Pk),ps(bF),ps(AL),ps(fm))},t.\u0275cmp=ft({type:t,selectors:[["app-sign-raw-tx"]],features:[Ko],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[3,"isLoading","noDataText",4,"ngIf"],[4,"ngIf"],[3,"isLoading","noDataText"],[1,"modal-form-container",3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","input",4,"ngIf"],["rows","5",3,"readonly",4,"ngIf"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur",4,"ngIf"],[1,"-buttons"],[3,"disabled","action"],["cancelButton",""],[1,"primary-button",3,"disabled","action"],["okButton",""],["for","dropdown",4,"ngIf"],[1,"-select"],["formControlName","dropdown","id","dropdown",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue",4,"ngIf"],["for","dropdown"],["disabled","","hidden","",3,"ngValue"],[4,"ngFor","ngForOf"],[3,"ngValue"],["for","input"],["rows","5",3,"readonly"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,bH,1,2,"app-loading-content",1),ru(5,"\n\n "),hs(6,DH,34,16,"ng-container",2),ru(7,"\n"),_s(),ru(8,"\n")),2&e&&(ms("headline",Vl(1,5,t.title))("dialog",t.dialogRef)("disableDismiss",t.working),Ya(4),ms("ngIf",t.currentState===t.states.Loading||t.currentState===t.states.ErrorLoading),Ya(2),ms("ngIf",t.currentState===t.states.ShowingForm))},directives:[jk,lh,aF,ap,jp,ZC,Jp,rp,qp,RO,Zp,em,sh,Lf],pipes:[hM],styles:[""]}),t}(nF);function EH(e,t){if(1&e&&ys(0,"app-loading-content",3),2&e){var n=Ys();ms("isLoading",n.currentState===n.states.Loading)("noDataText","offline-transactions.loading-problem")}}function YH(e,t){if(1&e&&(vs(0,"label",19),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys(3);Ya(1),au(Vl(2,1,n.dropdownLabel))}}function PH(e,t){if(1&e&&(vs(0,"option",20),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys(3);ms("ngValue",""),Ya(1),au(Vl(2,2,n.defaultDropdownText))}}function AH(e,t){if(1&e&&(bs(0),ru(1,"\n "),vs(2,"option",22),ru(3),_s(),ru(4,"\n "),ws()),2&e){var n=t.$implicit;Ya(2),ms("ngValue",n.value),Ya(1),ou("\n ",n.name,"\n ")}}function IH(e,t){if(1&e&&(bs(0),ru(1,"\n "),hs(2,AH,5,2,"ng-container",21),ru(3,"\n "),ws()),2&e){var n=Ys(3);Ya(2),ms("ngForOf",n.dropdownElements)}}function RH(e,t){if(1&e){var n=Ms();vs(0,"div",6),ru(1,"\n "),hs(2,YH,3,3,"label",15),ru(3,"\n "),vs(4,"div",16),ru(5,"\n "),vs(6,"select",17),xs("blur",function(){return on(n),Ys(2).validate()}),ru(7,"\n "),hs(8,PH,3,4,"option",18),ru(9,"\n "),hs(10,IH,4,1,"ng-container",2),ru(11,"\n "),_s(),ru(12,"\n "),_s(),ru(13,"\n "),_s()}if(2&e){var i=Ys(2);Ya(2),ms("ngIf",i.dropdownLabel),Ya(4),ms("appFormFieldError",i.dropdownErrorMsg),ls("disabled",i.working?"true":null),Ya(2),ms("ngIf",i.defaultDropdownText),Ya(2),ms("ngIf",i.dropdownElements)}}function FH(e,t){if(1&e&&(vs(0,"label",23),ru(1),Wl(2,"translate"),_s()),2&e){var n=Ys(2);Ya(1),au(Vl(2,1,n.inputLabel))}}function HH(e,t){if(1&e&&(vs(0,"textarea",24),ru(1),_s()),2&e){var n=Ys(2);ms("readonly",!0),Ya(1),au(n.contents)}}function jH(e,t){if(1&e){var n=Ms();vs(0,"textarea",25),xs("blur",function(){return on(n),Ys(2).validate()}),_s()}if(2&e){var i=Ys(2);ms("appFormFieldError",i.inputErrorMsg),ls("disabled",i.working?"true":null)}}function NH(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),ru(2),Wl(3,"translate"),vs(4,"div",4),ru(5,"\n "),ru(6,"\n "),hs(7,RH,14,5,"div",5),ru(8,"\n "),ru(9,"\n "),vs(10,"div",6),ru(11,"\n "),hs(12,FH,3,3,"label",7),ru(13,"\n "),hs(14,HH,2,2,"textarea",8),ru(15,"\n "),hs(16,jH,1,2,"textarea",9),ru(17,"\n "),_s(),ru(18,"\n "),_s(),ru(19,"\n "),ru(20,"\n "),vs(21,"div",10),ru(22,"\n "),vs(23,"app-button",11,12),xs("action",function(){return on(n),Ys().cancelPressed()}),ru(25),Wl(26,"translate"),_s(),ru(27,"\n "),vs(28,"app-button",13,14),xs("action",function(){return on(n),Ys().okPressed()}),ru(30),Wl(31,"translate"),_s(),ru(32,"\n "),_s(),ru(33,"\n "),ws()}if(2&e){var i=Ys();Ya(2),ou("\n ",Vl(3,10,i.text),"\n "),Ya(2),ms("formGroup",i.form),Ya(3),ms("ngIf",i.dropdownElements),Ya(5),ms("ngIf",i.inputLabel),Ya(2),ms("ngIf",!!i.contents),Ya(2),ms("ngIf",!i.contents),Ya(7),ms("disabled",i.working),Ya(2),ou("\n ",Vl(26,12,i.cancelButtonText),"\n "),Ya(3),ms("disabled",i.validateForm&&!i.form.valid||i.working),Ya(2),ou("\n ",Vl(31,14,i.okButtonText),"\n ")}}var BH=function(e){function t(t,n,i,r,a){var o=e.call(this,a)||this;return o.dialogRef=t,o.msgBarService=n,o.balanceAndOutputsService=i,o.spendingService=r,o.title="offline-transactions.broadcast-tx.title",o.text="offline-transactions.broadcast-tx.text",o.inputLabel="offline-transactions.broadcast-tx.input-label",o.cancelButtonText="common.cancel-button",o.okButtonText="offline-transactions.broadcast-tx.send-button",o.validateForm=!0,o.currentState=tF.ShowingForm,o}return vf(t,e),t.openDialog=function(e){var n=new wk;return n.autoFocus=!0,n.width=jM.mediumModalWidth,e.open(t,n)},t.prototype.ngOnInit=function(){this.form.get("dropdown").setValue("dummy")},t.prototype.ngOnDestroy=function(){this.closeOperationSubscription()},t.prototype.cancelPressed=function(){this.dialogRef.close()},t.prototype.okPressed=function(){var e=this;this.working||(this.msgBarService.hide(),this.working=!0,this.okButton.setLoading(),this.closeOperationSubscription(),this.operationSubscription=this.spendingService.injectTransaction(this.form.get("input").value,null).subscribe(function(){e.balanceAndOutputsService.refreshBalance(),e.msgBarService.showDone("offline-transactions.broadcast-tx.sent"),e.cancelPressed()},function(t){e.working=!1,e.okButton.resetState(),e.msgBarService.showError(t)}))},t.prototype.closeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},t.\u0275fac=function(e){return new(e||t)(ps(Lk),ps(dL),ps(_O),ps(bF),ps(fm))},t.\u0275cmp=ft({type:t,selectors:[["app-broadcast-raw-tx"]],features:[Ko],decls:9,vars:7,consts:[[3,"headline","dialog","disableDismiss"],[3,"isLoading","noDataText",4,"ngIf"],[4,"ngIf"],[3,"isLoading","noDataText"],[1,"modal-form-container",3,"formGroup"],["class","form-field",4,"ngIf"],[1,"form-field"],["for","input",4,"ngIf"],["rows","5",3,"readonly",4,"ngIf"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur",4,"ngIf"],[1,"-buttons"],[3,"disabled","action"],["cancelButton",""],[1,"primary-button",3,"disabled","action"],["okButton",""],["for","dropdown",4,"ngIf"],[1,"-select"],["formControlName","dropdown","id","dropdown",3,"appFormFieldError","blur"],["disabled","","hidden","",3,"ngValue",4,"ngIf"],["for","dropdown"],["disabled","","hidden","",3,"ngValue"],[4,"ngFor","ngForOf"],[3,"ngValue"],["for","input"],["rows","5",3,"readonly"],["formControlName","input","id","input","rows","5",3,"appFormFieldError","blur"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),ru(3,"\n "),hs(4,EH,1,2,"app-loading-content",1),ru(5,"\n\n "),hs(6,NH,34,16,"ng-container",2),ru(7,"\n"),_s(),ru(8,"\n")),2&e&&(ms("headline",Vl(1,5,t.title))("dialog",t.dialogRef)("disableDismiss",t.working),Ya(4),ms("ngIf",t.currentState===t.states.Loading||t.currentState===t.states.ErrorLoading),Ya(2),ms("ngIf",t.currentState===t.states.ShowingForm))},directives:[jk,lh,aF,ap,jp,ZC,Jp,rp,qp,RO,Zp,em,sh,Lf],pipes:[hM],styles:[""]}),t}(nF),WH=function(){function e(){}return e.prototype.transform=function(e){return RA.unix(e).format("YYYY-MM-DD HH:mm")},e.\u0275fac=function(t){return new(t||e)},e.\u0275pipe=wt({name:"dateTime",type:e,pure:!0}),e}();function VH(e,t){1&e&&(vs(0,"h4"),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"tx.confirm-transaction-title")))}function UH(e,t){1&e&&(vs(0,"h4"),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"tx.transaction-title")))}function zH(e,t){if(1&e&&(bs(0),ru(1,"\n "),vs(2,"div",4),ru(3,"\n "),vs(4,"span"),ru(5),Wl(6,"translate"),_s(),ru(7," "),vs(8,"span"),ru(9),_s(),ru(10,"\n "),_s(),ru(11,"\n "),vs(12,"div",4),ru(13,"\n "),vs(14,"span"),ru(15),Wl(16,"translate"),_s(),ru(17," "),vs(18,"span"),ru(19),_s(),ru(20,"\n "),_s(),ru(21,"\n "),ws()),2&e){var n=Ys();Ya(5),au(Vl(6,4,"tx.from-small-label")),Ya(4),au(n.transaction.from),Ya(6),au(Vl(16,6,"tx.to-small-label")),Ya(4),au(n.transaction.to)}}function qH(e,t){if(1&e&&(bs(0),ru(1,"\n "),vs(2,"div",4),ru(3,"\n "),vs(4,"span"),ru(5),Wl(6,"translate"),_s(),ru(7," "),vs(8,"span"),ru(9),Wl(10,"dateTime"),_s(),ru(11,"\n "),_s(),ru(12,"\n "),vs(13,"div",4),ru(14,"\n "),vs(15,"span"),ru(16),Wl(17,"translate"),_s(),ru(18," "),vs(19,"span"),ru(20),Wl(21,"translate"),_s(),ru(22,"\n "),_s(),ru(23,"\n "),ws()),2&e){var n=Ys();Ya(5),au(Vl(6,4,"tx.date-small-label")),Ya(4),au(Vl(10,6,n.transaction.timestamp)),Ya(7),au(Vl(17,8,"tx.status-small-label")),Ya(4),au(Vl(21,10,n.transaction.confirmed?"tx.confirmed-transaction":"tx.pending-transaction"))}}function GH(e,t){if(1&e&&(vs(0,"div",4),ru(1,"\n "),vs(2,"span"),ru(3),Wl(4,"translate"),_s(),ru(5," "),vs(6,"span"),ru(7),_s(),ru(8,"\n "),_s()),2&e){var n=Ys();Ya(3),au(Vl(4,2,"tx.id-small-label")),Ya(4),au(n.transaction.id)}}function KH(e,t){if(1&e&&(vs(0,"span"),ru(1),_s()),2&e){var n=Ys(2);Ya(1),au(n.transaction.note)}}function JH(e,t){1&e&&(vs(0,"span",13),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"tx.without-note")))}function ZH(e,t){if(1&e){var n=Ms();vs(0,"mat-icon",14),xs("click",function(){return on(n),Ys(2).editNote()}),ru(1,"edit"),_s()}}function $H(e,t){if(1&e&&(vs(0,"div",4),ru(1,"\n "),vs(2,"span"),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),hs(6,KH,2,1,"span",2),ru(7,"\n "),hs(8,JH,3,3,"span",11),ru(9,"\n "),hs(10,ZH,2,0,"mat-icon",12),ru(11,"\n "),_s()),2&e){var n=Ys();Ya(3),au(Vl(4,4,"tx.note-small-label")),Ya(3),ms("ngIf",n.transaction.note),Ya(2),ms("ngIf",!n.transaction.note),Ya(2),ms("ngIf",!n.isPreview)}}function XH(e,t){1&e&&(vs(0,"span"),ru(1,"*"),_s())}function QH(e,t){if(1&e&&(vs(0,"p",15),Wl(1,"translate"),ru(2),Wl(3,"currency"),hs(4,XH,2,0,"span",2),ru(5,"\n "),_s()),2&e){var n=Ys();ms("matTooltip",n.isPreview?"":Vl(1,3,"tx.current-rate-help")),Ya(2),ou("\n ",ql(3,5,n.balanceToShow.multipliedBy(n.price).toString(),"USD","symbol","1.2-2"),""),Ya(2),ms("ngIf",!n.isPreview)}}function ej(e,t){if(1&e){var n=Ms();vs(0,"div",16),ru(1,"\n "),vs(2,"app-arrow-link",17),xs("pressed",function(e){return on(n),Ys().toggleInputsOutputs(e)}),ru(3,"\n "),_s(),ru(4,"\n "),_s()}2&e&&(Ya(2),ms("noPadding",!0)("text","tx.show-more-link"))}function tj(e,t){if(1&e&&(vs(0,"div",20),ru(1,"\n "),vs(2,"div",21),ru(3),_s(),ru(4,"\n "),vs(5,"div",22),ru(6,"\n "),vs(7,"div",23),ru(8),_s(),ru(9,"\n "),vs(10,"div",4),ru(11,"\n "),vs(12,"span"),ru(13),Wl(14,"translate"),_s(),ru(15),Wl(16,"amount"),_s(),ru(17,"\n "),vs(18,"div",4),ru(19,"\n "),vs(20,"span"),ru(21),Wl(22,"translate"),_s(),ru(23),Wl(24,"amount"),_s(),ru(25,"\n "),_s(),ru(26,"\n "),_s()),2&e){var n=t.$implicit,i=t.index;Ya(3),au(i+1),Ya(5),au(n.address),Ya(5),au(Vl(14,6,"tx.coins-small-label")),Ya(2),ou(" ",zl(16,8,n.coins,!0,"first"),"\n "),Ya(6),au(Vl(22,12,"tx.hours-small-label")),Ya(2),ou(" ",zl(24,14,n.hours,!1,"first"),"\n ")}}function nj(e,t){if(1&e&&(vs(0,"div",20),ru(1,"\n "),vs(2,"div",21),ru(3),_s(),ru(4,"\n "),vs(5,"div",22),ru(6,"\n "),vs(7,"div",23),ru(8),_s(),ru(9,"\n "),vs(10,"div",4),ru(11,"\n "),vs(12,"span"),ru(13),Wl(14,"translate"),_s(),ru(15),Wl(16,"amount"),_s(),ru(17,"\n "),vs(18,"div",4),ru(19,"\n "),vs(20,"span"),ru(21),Wl(22,"translate"),_s(),ru(23),Wl(24,"amount"),_s(),ru(25,"\n "),_s(),ru(26,"\n "),_s()),2&e){var n=t.$implicit,i=t.index;Ya(3),au(i+1),Ya(5),au(n.address),Ya(5),au(Vl(14,6,"tx.coins-small-label")),Ya(2),ou(" ",zl(16,8,n.coins,!0,"first"),"\n "),Ya(6),au(Vl(22,12,"tx.hours-small-label")),Ya(2),ou(" ",zl(24,14,n.hours,!1,"first"),"\n ")}}function ij(e,t){if(1&e&&(bs(0),ru(1,"\n "),ru(2,"\n "),vs(3,"div",18),ru(4,"\n "),vs(5,"h4"),ru(6),Wl(7,"translate"),_s(),ru(8,"\n\n "),hs(9,tj,27,18,"div",19),ru(10,"\n "),_s(),ru(11,"\n "),ru(12,"\n "),vs(13,"div",18),ru(14,"\n "),vs(15,"h4"),ru(16),Wl(17,"translate"),_s(),ru(18,"\n\n "),hs(19,nj,27,18,"div",19),ru(20,"\n "),_s(),ru(21,"\n "),ws()),2&e){var n=Ys();Ya(6),au(Vl(7,4,"tx.inputs-title")),Ya(3),ms("ngForOf",n.transaction.inputs),Ya(7),au(Vl(17,6,"tx.outputs-title")),Ya(3),ms("ngForOf",n.transaction.outputs)}}var rj=function(){function e(e,t){var n=this;this.priceService=e,this.dialog=t,this.showInputsOutputs=!1,this.subscription=this.priceService.price.subscribe(function(e){return n.price=e})}return Object.defineProperty(e.prototype,"hoursText",{get:function(){if(!this.isPreview){if(this.transaction.coinsMovedInternally)return"tx.hours-moved";if(this.transaction.balance.isGreaterThan(0))return"tx.hours-received"}return"tx.hours-sent"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sentOrReceivedHours",{get:function(){return this.isPreview?this.transaction.hoursToSend:this.transaction.hoursBalance},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"shouldShowIncomingIcon",{get:function(){return!this.isPreview&&this.transaction.balance.isGreaterThan(0)&&!this.transaction.coinsMovedInternally},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"balanceToShow",{get:function(){return this.isPreview?this.transaction.coinsToSend:this.transaction.balance},enumerable:!1,configurable:!0}),e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},e.prototype.toggleInputsOutputs=function(e){e.preventDefault(),this.showInputsOutputs=!this.showInputsOutputs},e.prototype.editNote=function(){var e=this;RR.openDialog(this.dialog,this.transaction).afterClosed().subscribe(function(t){(t||""===t)&&(e.transaction.note=t)})},e.\u0275fac=function(t){return new(t||e)(ps(dP),ps(Pk))},e.\u0275cmp=ft({type:e,selectors:[["app-transaction-info"]],inputs:{transaction:"transaction",isPreview:"isPreview"},decls:61,vars:32,consts:[[1,"row"],[1,"col-md-12"],[4,"ngIf"],[1,"col-md-9","-tx-meta"],[1,"-data"],["class","-data",4,"ngIf"],[1,"col-md-3","-tx-price"],[1,"-icon"],[3,"src"],[3,"matTooltip",4,"ngIf"],["class","-data -more",4,"ngIf"],["class","grey-text",4,"ngIf"],["class","edit-button image-button",3,"click",4,"ngIf"],[1,"grey-text"],[1,"edit-button","image-button",3,"click"],[3,"matTooltip"],[1,"-data","-more"],[3,"noPadding","text","pressed"],[1,"col-md-6","-margin-top"],["class","-item",4,"ngFor","ngForOf"],[1,"-item"],[1,"-number"],[1,"-info"],[1,"-address"]],template:function(e,t){1&e&&(vs(0,"div",0),ru(1,"\n "),vs(2,"div",1),ru(3,"\n "),ru(4,"\n "),hs(5,VH,3,3,"h4",2),ru(6,"\n "),hs(7,UH,3,3,"h4",2),ru(8,"\n "),vs(9,"div",0),ru(10,"\n "),ru(11,"\n "),vs(12,"div",3),ru(13,"\n "),hs(14,zH,22,8,"ng-container",2),ru(15,"\n "),hs(16,qH,24,12,"ng-container",2),ru(17,"\n "),vs(18,"div",4),ru(19,"\n "),vs(20,"span"),ru(21),Wl(22,"translate"),_s(),ru(23,"\n "),vs(24,"span"),ru(25),Wl(26,"amount"),Wl(27,"translate"),Wl(28,"amount"),Wl(29,"translate"),_s(),ru(30,"\n "),_s(),ru(31,"\n "),hs(32,GH,9,4,"div",5),ru(33,"\n "),hs(34,$H,12,6,"div",5),ru(35,"\n "),_s(),ru(36,"\n\n "),ru(37,"\n "),vs(38,"div",6),ru(39,"\n "),vs(40,"div",7),ru(41,"\n "),ys(42,"img",8),ru(43,"\n "),_s(),ru(44,"\n "),vs(45,"h4"),ru(46),Wl(47,"amount"),_s(),ru(48,"\n "),hs(49,QH,6,10,"p",9),ru(50,"\n "),_s(),ru(51,"\n "),_s(),ru(52,"\n\n "),ru(53,"\n "),hs(54,ej,5,2,"div",10),ru(55,"\n "),_s(),ru(56,"\n\n "),ru(57,"\n "),hs(58,ij,22,8,"ng-container",2),ru(59,"\n"),_s(),ru(60,"\n")),2&e&&(Ya(5),ms("ngIf",t.isPreview),Ya(2),ms("ngIf",!t.isPreview),Ya(7),ms("ngIf",t.isPreview),Ya(2),ms("ngIf",!t.isPreview),Ya(5),au(Vl(22,16,"tx.hours-small-label")),Ya(4),lu("\n ",zl(26,18,t.sentOrReceivedHours,!1,"first")," ",Vl(27,22,t.hoursText),"\n |\n ",zl(28,24,t.transaction.hoursBurned,!1,"first")," ",Vl(29,28,"tx.hours-burned"),"\n "),Ya(7),ms("ngIf",!t.isPreview),Ya(2),ms("ngIf",t.transaction.note||!t.isPreview),Ya(8),ms("src","assets/img/"+(t.shouldShowIncomingIcon?"received":"sent")+"-blue.png",Pr),Ya(4),au(Vl(47,30,t.balanceToShow)),Ya(3),ms("ngIf",t.price),Ya(5),ms("ngIf",!t.showInputsOutputs),Ya(4),ms("ngIf",t.showInputsOutputs))},directives:[lh,WC,YO,jO,sh],pipes:[hM,NS,WH,Ch],styles:["h4[_ngcontent-%COMP%]{font-size:14px;margin:0 0 30px}.-item[_ngcontent-%COMP%]{display:flex;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}.-item[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{padding:10px;background:#f7f7f7;align-self:flex-start;border-radius:10px}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin-left:10px;display:flex;flex-direction:column;word-break:break-all}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{padding:10px 0;margin-bottom:5px}.-data[_ngcontent-%COMP%]{font-size:13px;display:flex}.-data[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:first-child{color:rgba(30,34,39,.5);width:70px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(2){word-break:break-word}.-data.-more[_ngcontent-%COMP%]{margin-top:20px}.edit-button[_ngcontent-%COMP%]{font-size:20px;padding-left:5px;color:#0072ff}.-tx-meta[_ngcontent-%COMP%] .-data[_ngcontent-%COMP%]{margin-bottom:10px}.-tx-price[_ngcontent-%COMP%]{text-align:center;display:flex;flex-direction:column;justify-content:center}.-tx-price[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:30px}.-tx-price[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:18px;font-weight:700;margin:10px 0 5px;word-break:break-word}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:13px;margin:0}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}.-margin-top[_ngcontent-%COMP%]{margin-top:30px}"]}),e}(),aj=["sendButton"],oj=["backButton"],sj=function(){function e(e,t,n,i,r,a){this.msgBarService=e,this.dialog=t,this.hwWalletService=n,this.translate=i,this.balanceAndOutputsService=r,this.spendingService=a,this.onBack=new Zl}return e.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.sendSubscription&&this.sendSubscription.unsubscribe(),this.onBack.complete()},e.prototype.back=function(){this.onBack.emit(!1)},e.prototype.send=function(){var e=this;this.sendButton.isLoading()||(this.msgBarService.hide(),this.sendButton.resetState(),this.transaction.wallet?this.transaction.wallet.encrypted&&!this.transaction.wallet.isHardware?LA.openDialog(this.dialog,{wallet:this.transaction.wallet}).componentInstance.passwordSubmit.subscribe(function(t){e.finishSending(t)}):this.transaction.wallet.isHardware?(this.showBusy(),this.sendSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.transaction.wallet.addresses[0].address).subscribe(function(){return e.finishSending()},function(t){return e.showError(t)})):this.finishSending():gF.openDialog(this.dialog,{rawTx:this.transaction.encoded,isUnsigned:!0}).afterClosed().subscribe(function(){vO.openDialog(e.dialog,{text:"offline-transactions.copy-tx.reset-confirmation",defaultButtons:gO.YesNo}).afterClosed().subscribe(function(t){t&&e.onBack.emit(!0)})}))},e.prototype.finishSending=function(e){var t=this;this.showBusy();var n=this.transaction.note.trim();this.sendSubscription=this.spendingService.signTransaction(this.transaction.wallet,e?e.password:null,this.transaction).pipe(ue(function(i){return e&&e.close(),t.spendingService.injectTransaction(i,n)})).subscribe(function(e){n&&!e?setTimeout(function(){return t.msgBarService.showWarning(t.translate.instant("send.saving-note-error"))}):setTimeout(function(){return t.msgBarService.showDone("send.sent")}),t.balanceAndOutputsService.refreshBalance(),t.onBack.emit(!0)},function(n){e&&e.error(n),t.showError(n)})},e.prototype.showBusy=function(){this.sendButton.setLoading(),this.backButton.setDisabled()},e.prototype.showError=function(e){this.msgBarService.showError(e),this.sendButton.resetState(),this.backButton.resetState().setEnabled()},e.\u0275fac=function(t){return new(t||e)(ps(dL),ps(Pk),ps(gC),ps(dM),ps(_O),ps(bF))},e.\u0275cmp=ft({type:e,selectors:[["app-send-preview"]],viewQuery:function(e,t){if(1&e&&(lc(aj,5),lc(oj,5)),2&e){var n=void 0;uc(n=dc())&&(t.sendButton=n.first),uc(n=dc())&&(t.backButton=n.first)}},inputs:{transaction:"transaction"},outputs:{onBack:"onBack"},decls:15,vars:8,consts:[[3,"transaction","isPreview"],[1,"-buttons"],[3,"action"],["backButton",""],[1,"primary-button",3,"action"],["sendButton",""]],template:function(e,t){1&e&&(ys(0,"app-transaction-info",0),ru(1,"\n\n"),vs(2,"div",1),ru(3,"\n "),vs(4,"app-button",2,3),xs("action",function(){return t.back()}),ru(6),Wl(7,"translate"),_s(),ru(8,"\n "),vs(9,"app-button",4,5),xs("action",function(){return t.send()}),ru(11),Wl(12,"translate"),_s(),ru(13,"\n"),_s(),ru(14,"\n")),2&e&&(ms("transaction",t.transaction)("isPreview",!0),Ya(6),au(Vl(7,4,"common.back-button")),Ya(5),ou("\n ",Vl(12,6,"send."+(t.transaction&&!t.transaction.wallet?"show":"send")+"-button"),"\n "))},directives:[rj,ZC],pipes:[hM],styles:[".-buttons[_ngcontent-%COMP%]{margin-top:10px;text-align:center}"]}),e}();function uj(e,t){if(1&e){var n=Ms();vs(0,"app-send-coins-form",9),xs("onFormSubmitted",function(e){return on(n),Ys().onFormSubmitted(e)}),_s()}2&e&&ms("formData",Ys().formData)("showSimpleForm",!0)}function lj(e,t){if(1&e){var n=Ms();vs(0,"app-send-coins-form",9),xs("onFormSubmitted",function(e){return on(n),Ys().onFormSubmitted(e)}),_s()}2&e&&ms("formData",Ys().formData)("showSimpleForm",!1)}function cj(e,t){if(1&e){var n=Ms();vs(0,"app-send-preview",10),xs("onBack",function(e){return on(n),Ys().onBack(e)}),_s()}2&e&&ms("transaction",Ys().formData.transaction)}var dj=function(){function e(e,t,n){var i=this;this.navBarSwitchService=e,this.changeDetector=t,this.dialog=n,this.showForm=!0,this.activeForms=NP,this.navBarSwitchService.showSwitch("send.simple-form-button","send.advanced-form-button",NP.LeftButton),this.subscription=e.activeComponent.subscribe(function(e){i.activeForm!==e&&(i.activeForm=e,i.formData=null)})}return e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe(),this.navBarSwitchService.hideSwitch()},e.prototype.onFormSubmitted=function(e){this.formData=e,this.showForm=!1},e.prototype.onBack=function(e){e&&(this.formData=null),this.showForm=!0,this.changeDetector.detectChanges()},e.prototype.signTransaction=function(){OH.openDialog(this.dialog)},e.prototype.broadcastTransaction=function(){BH.openDialog(this.dialog)},e.\u0275fac=function(t){return new(t||e)(ps(WP),ps(ll),ps(Pk))},e.\u0275cmp=ft({type:e,selectors:[["app-send-skycoin"]],decls:35,vars:12,consts:[[3,"headline"],[1,"container"],[1,"paper"],[3,"formData","showSimpleForm","onFormSubmitted",4,"ngIf"],[3,"transaction","onBack",4,"ngIf"],[1,"-links"],[1,"link",3,"click"],[1,"separator"],[1,"final-element"],[3,"formData","showSimpleForm","onFormSubmitted"],[3,"transaction","onBack"]],template:function(e,t){1&e&&(ys(0,"app-header",0),Wl(1,"translate"),ru(2,"\n"),vs(3,"div",1),ru(4,"\n "),vs(5,"div",2),ru(6,"\n "),ru(7,"\n "),hs(8,uj,1,2,"app-send-coins-form",3),ru(9,"\n "),hs(10,lj,1,2,"app-send-coins-form",3),ru(11,"\n "),ru(12,"\n "),hs(13,cj,1,1,"app-send-preview",4),ru(14,"\n "),_s(),ru(15,"\n "),ru(16,"\n "),vs(17,"div",5),ru(18,"\n "),vs(19,"span",6),xs("click",function(){return t.signTransaction()}),ru(20),Wl(21,"translate"),_s(),ru(22,"\n "),vs(23,"span",7),ru(24," / "),_s(),ru(25,"\n "),vs(26,"span",6),xs("click",function(){return t.broadcastTransaction()}),ru(27),Wl(28,"translate"),_s(),ru(29,"\n "),_s(),ru(30,"\n "),ru(31,"\n "),ys(32,"div",8),ru(33,"\n"),_s(),ru(34,"\n")),2&e&&(ms("headline",Vl(1,6,"send.title-and-button")),Ya(8),ms("ngIf",t.showForm&&t.activeForm===t.activeForms.LeftButton),Ya(2),ms("ngIf",t.showForm&&t.activeForm===t.activeForms.RightButton),Ya(3),ms("ngIf",!t.showForm),Ya(7),au(Vl(21,8,"offline-transactions.sign-tx.title")),Ya(7),au(Vl(28,10,"offline-transactions.broadcast-tx.title")))},directives:[_A,lh,VF,sj],pipes:[hM],styles:[".-links[_ngcontent-%COMP%]{text-align:center;font-size:13px;margin-top:-15px;margin-bottom:15px}.-links[_ngcontent-%COMP%] .separator[_ngcontent-%COMP%]{margin:0 10px}"]}),e}();function hj(e,t){1&e&&ys(0,"app-loading-content",4),2&e&&ms("isLoading",!Ys().transactions)}function fj(e,t){if(1&e&&(vs(0,"div",13),ru(1,"\n "),vs(2,"div",14),ru(3),_s(),ru(4,"\n "),vs(5,"div",9),ru(6),Wl(7,"amount"),_s(),ru(8,"\n "),vs(9,"div",9),ru(10),Wl(11,"amount"),_s(),ru(12,"\n "),vs(13,"div",15),ru(14),Wl(15,"dateTime"),_s(),ru(16,"\n "),_s()),2&e){var n=t.$implicit;Ya(3),au(n.id),Ya(3),au(zl(7,4,n.coins,!0,"first")),Ya(4),au(zl(11,8,n.hours,!1,"first")),Ya(4),au(Vl(15,12,n.timestamp))}}function pj(e,t){if(1&e&&(vs(0,"div",5),ru(1,"\n "),vs(2,"div",6),ru(3,"\n "),vs(4,"div",7),ru(5,"\n "),vs(6,"div",8),ru(7),Wl(8,"translate"),_s(),ru(9,"\n "),vs(10,"div",9),ru(11),Wl(12,"commonText"),_s(),ru(13,"\n "),vs(14,"div",9),ru(15),Wl(16,"commonText"),_s(),ru(17,"\n "),vs(18,"div",10),ru(19),Wl(20,"translate"),_s(),ru(21,"\n "),_s(),ru(22,"\n "),vs(23,"div",11),ru(24,"\n "),hs(25,fj,17,14,"div",12),ru(26,"\n "),_s(),ru(27,"\n "),_s(),ru(28,"\n "),_s()),2&e){var n=Ys();Ya(7),au(Vl(8,5,"pending-txs.txid-table-label")),Ya(4),au(Vl(12,7,"coin")),Ya(4),au(Vl(16,9,"hours")),Ya(4),au(Vl(20,11,"pending-txs.timestamp-table-label")),Ya(6),ms("ngForOf",n.transactions)}}var mj=function(){function e(e,t){var n=this;this.navBarSwitchService=e,this.historyService=t,this.transactions=null,this.updatePeriod=1e4,this.errorUpdatePeriod=2e3,this.navbarSubscription=this.navBarSwitchService.activeComponent.subscribe(function(e){n.selectedNavbarOption=e,n.transactions=null,n.startDataRefreshSubscription(0)})}return e.prototype.ngOnInit=function(){this.navBarSwitchService.showSwitch("pending-txs.my-transactions-button","pending-txs.all-transactions-button")},e.prototype.ngOnDestroy=function(){this.navbarSubscription.unsubscribe(),this.removeTransactionsSubscription(),this.navBarSwitchService.hideSwitch()},e.prototype.startDataRefreshSubscription=function(e){var t=this;this.removeTransactionsSubscription(),this.transactionsSubscription=bm(0).pipe(EM(e),ue(function(){return t.historyService.getPendingTransactions()})).subscribe(function(e){t.transactions=t.selectedNavbarOption===NP.LeftButton?e.user:e.all,t.startDataRefreshSubscription(t.updatePeriod)},function(){return t.startDataRefreshSubscription(t.errorUpdatePeriod)})},e.prototype.removeTransactionsSubscription=function(){this.transactionsSubscription&&this.transactionsSubscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(ps(WP),ps(FA))},e.\u0275cmp=ft({type:e,selectors:[["app-pending-transactions"]],decls:13,vars:5,consts:[[3,"headline"],["noDataText","pending-txs.none",3,"isLoading",4,"ngIf"],["class","container",4,"ngIf"],[1,"final-element"],["noDataText","pending-txs.none",3,"isLoading"],[1,"container"],[1,"-table"],[1,"-headers"],[1,"-flex-fill"],[1,"-width-150","text-right"],[1,"-width-150"],[1,"-body"],["class","-row",4,"ngFor","ngForOf"],[1,"-row"],[1,"-flex-fill","break-all"],[1,"-width-150","grey-text"]],template:function(e,t){1&e&&(vs(0,"div"),ru(1,"\n "),ys(2,"app-header",0),Wl(3,"translate"),ru(4,"\n\n "),hs(5,hj,1,1,"app-loading-content",1),ru(6,"\n\n "),hs(7,pj,29,13,"div",2),ru(8,"\n "),ru(9,"\n "),ys(10,"div",3),ru(11,"\n"),_s(),ru(12,"\n")),2&e&&(Ya(2),ms("headline",Vl(3,3,"pending-txs.title")),Ya(3),ms("ngIf",!t.transactions||0===t.transactions.length),Ya(2),ms("ngIf",t.transactions&&t.transactions.length>0))},directives:[_A,lh,aF,sh],pipes:[hM,zF,NS,WH],styles:[""]}),e}();function gj(e,t){1&e&&ys(0,"app-loading-content",4),2&e&&ms("isLoading",!Ys().wallets)}function vj(e,t){if(1&e&&(vs(0,"div",13),ru(1,"\n "),vs(2,"div",18),ru(3),_s(),ru(4,"\n "),vs(5,"div",10),ru(6),Wl(7,"amount"),_s(),ru(8,"\n "),vs(9,"div",19),ru(10),Wl(11,"amount"),_s(),ru(12,"\n "),_s()),2&e){var n=t.$implicit;Ya(3),au(n.hash),Ya(3),au(zl(7,3,n.coins,!0,"first")),Ya(4),au(zl(11,7,n.hours,!1,"first"))}}function _j(e,t){if(1&e&&(bs(0),ru(1,"\n "),vs(2,"div",13),ru(3,"\n "),vs(4,"div",14),ru(5,"\n "),ys(6,"app-qr-code-button",15),ru(7,"\n "),vs(8,"span",16),ru(9),_s(),ru(10,"\n "),_s(),ru(11,"\n "),_s(),ru(12,"\n "),hs(13,vj,13,11,"div",17),ru(14,"\n "),ws()),2&e){var n=t.$implicit;Ya(6),ms("address",n.address),Ya(3),au(n.address),Ya(4),ms("ngForOf",n.outputs)}}function yj(e,t){if(1&e&&(vs(0,"div",7),ru(1,"\n "),vs(2,"div",8),ru(3,"\n "),vs(4,"div",9),ru(5),_s(),ru(6,"\n "),vs(7,"div",10),ru(8),Wl(9,"commonText"),_s(),ru(10,"\n "),vs(11,"div",10),ru(12),Wl(13,"commonText"),_s(),ru(14,"\n "),_s(),ru(15,"\n "),vs(16,"div",11),ru(17,"\n "),hs(18,_j,15,3,"ng-container",12),ru(19,"\n "),_s(),ru(20,"\n "),_s()),2&e){var n=t.$implicit;Ya(4),ls("title",n.label),Ya(1),au(n.label),Ya(3),au(Vl(9,5,"coin")),Ya(4),au(Vl(13,7,"hours")),Ya(6),ms("ngForOf",n.addresses)}}function bj(e,t){if(1&e&&(vs(0,"div",5),ru(1,"\n "),hs(2,yj,21,9,"div",6),ru(3,"\n "),_s()),2&e){var n=Ys();Ya(2),ms("ngForOf",n.wallets)}}var wj=function(){function e(e,t){var n=this;this.balanceAndOutputsService=t,e.queryParams.subscribe(function(e){n.wallets=null,n.loadData(e)})}return e.prototype.ngOnDestroy=function(){this.removeOutputsSubscription()},e.prototype.loadData=function(e){var t=this,n=e.addr;this.removeOutputsSubscription(),this.outputsSubscription=this.balanceAndOutputsService.outputsWithWallets.subscribe(function(e){t.wallets=e.map(function(e){return e.addresses=e.addresses.filter(function(e){if(e.outputs.length>0)return!n||e.address===n}),e}).filter(function(e){return e.addresses.length>0})})},e.prototype.removeOutputsSubscription=function(){this.outputsSubscription&&this.outputsSubscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(ps(Jx),ps(_O))},e.\u0275cmp=ft({type:e,selectors:[["app-outputs"]],decls:13,vars:5,consts:[[3,"headline"],["noDataText","outputs.error-no-outputs",3,"isLoading",4,"ngIf"],["class","container",4,"ngIf"],[1,"final-element"],["noDataText","outputs.error-no-outputs",3,"isLoading"],[1,"container"],["class","-table",4,"ngFor","ngForOf"],[1,"-table"],[1,"-headers"],[1,"-flex-fill","text-truncate"],[1,"-width-150","text-right"],[1,"-body"],[4,"ngFor","ngForOf"],[1,"-row"],[1,"-flex-fill","grey-text","text-truncate"],[3,"address"],[1,"address"],["class","-row",4,"ngFor","ngForOf"],[1,"-flex-fill","-hash"],[1,"-width-150","text-right","grey-text"]],template:function(e,t){1&e&&(vs(0,"div"),ru(1,"\n "),ys(2,"app-header",0),Wl(3,"translate"),ru(4,"\n\n "),hs(5,gj,1,1,"app-loading-content",1),ru(6,"\n\n "),hs(7,bj,4,1,"div",2),ru(8,"\n "),ru(9,"\n "),ys(10,"div",3),ru(11,"\n"),_s(),ru(12,"\n")),2&e&&(Ya(2),ms("headline",Vl(3,3,"outputs.title")),Ya(3),ms("ngIf",!t.wallets||0===t.wallets.length||0===t.wallets[0].addresses[0].outputs.length),Ya(2),ms("ngIf",t.wallets&&t.wallets.length>0))},directives:[_A,lh,aF,sh,KA],pipes:[hM,zF,NS],styles:[".-hash[_ngcontent-%COMP%]{margin-left:27px;word-break:break-all}app-qr-code-button[_ngcontent-%COMP%]{margin-right:10px}.address[_ngcontent-%COMP%], app-qr-code-button[_ngcontent-%COMP%]{vertical-align:middle}"]}),e}();function kj(e,t){1&e&&ys(0,"app-loading-content")}var Mj=function(e){return{coinName:e}},Sj=function(e){return{coinHoursName:e}};function Cj(e,t){if(1&e&&(vs(0,"div",4),ru(1,"\n "),vs(2,"div",5),ru(3,"\n "),ru(4,"\n "),vs(5,"div",6),ru(6,"\n "),vs(7,"div",7),ru(8,"\n "),vs(9,"div",8),ru(10,"\n "),vs(11,"div",9),ru(12),Wl(13,"translate"),_s(),ru(14,"\n "),vs(15,"div",10),ru(16),Wl(17,"number"),_s(),ru(18,"\n "),_s(),ru(19,"\n "),vs(20,"div",8),ru(21,"\n "),vs(22,"div",9),ru(23),Wl(24,"translate"),_s(),ru(25,"\n "),vs(26,"div",10),ru(27),Wl(28,"dateTime"),_s(),ru(29,"\n "),_s(),ru(30,"\n "),vs(31,"div",8),ru(32,"\n "),vs(33,"div",9),ru(34),Wl(35,"translate"),_s(),ru(36,"\n "),vs(37,"div",10),ru(38),_s(),ru(39,"\n "),_s(),ru(40,"\n "),_s(),ru(41,"\n "),_s(),ru(42,"\n "),ru(43,"\n "),vs(44,"div",11),ru(45,"\n "),vs(46,"div",7),ru(47,"\n "),vs(48,"div",12),ru(49,"\n "),vs(50,"div",13),ru(51,"\n "),vs(52,"div",8),ru(53,"\n "),vs(54,"div",9),ru(55),Wl(56,"translate"),_s(),ru(57,"\n "),vs(58,"div",10),ru(59),Wl(60,"amount"),_s(),ru(61,"\n "),_s(),ru(62,"\n "),vs(63,"div",8),ru(64,"\n "),vs(65,"div",9),ru(66),Wl(67,"translate"),_s(),ru(68,"\n "),vs(69,"div",10),ru(70),Wl(71,"amount"),_s(),ru(72,"\n "),_s(),ru(73,"\n "),_s(),ru(74,"\n "),vs(75,"div",13),ru(76,"\n "),vs(77,"div",8),ru(78,"\n "),vs(79,"div",9),ru(80),Wl(81,"translate"),_s(),ru(82,"\n "),vs(83,"div",10),ru(84),Wl(85,"amount"),_s(),ru(86,"\n "),_s(),ru(87,"\n "),vs(88,"div",8),ru(89,"\n "),vs(90,"div",9),ru(91),Wl(92,"translate"),_s(),ru(93,"\n "),vs(94,"div",10),ru(95),Wl(96,"amount"),_s(),ru(97,"\n "),_s(),ru(98,"\n "),_s(),ru(99,"\n "),_s(),ru(100,"\n "),_s(),ru(101,"\n "),_s(),ru(102,"\n "),_s(),ru(103,"\n "),_s()),2&e){var n=Ys();Ya(12),au(Vl(13,14,"blockchain.blocks-label")),Ya(4),au(Vl(17,16,n.block.seq)),Ya(7),au(Vl(24,18,"blockchain.time-label")),Ya(4),au(Vl(28,20,n.block.timestamp)),Ya(7),au(Vl(35,22,"blockchain.hash-label")),Ya(4),au(n.block.hash),Ya(17),au(Ul(56,24,"blockchain.current-supply-label",Il(52,Mj,n.appService.coinName))),Ya(4),au(zl(60,27,n.coinSupply.currentSupply,!0,"first")),Ya(7),au(Ul(67,31,"blockchain.total-supply-label",Il(54,Mj,n.appService.coinName))),Ya(4),au(zl(71,34,n.coinSupply.totalSupply,!0,"first")),Ya(10),au(Ul(81,38,"blockchain.current-coinhour-supply-label",Il(56,Sj,n.appService.hoursName))),Ya(4),au(zl(85,41,n.coinSupply.currentCoinhourSupply,!1,"first")),Ya(7),au(Ul(92,45,"blockchain.total-coinhour-supply-label",Il(58,Sj,n.appService.hoursName))),Ya(4),au(zl(96,48,n.coinSupply.totalCoinhourSupply,!1,"first"))}}var Lj=function(){function e(e,t){this.appService=e,this.blockchainService=t,this.updatePeriod=5e3,this.errorUpdatePeriod=2e3}return e.prototype.ngOnInit=function(){this.startDataRefreshSubscription(0)},e.prototype.startDataRefreshSubscription=function(e){var t=this;this.removeOperationSubscription(),this.operationSubscription=bm(0).pipe(EM(e),ue(function(){return t.blockchainService.getLastBlock()}),ue(function(e){return t.block=e,t.blockchainService.getCoinSupply()})).subscribe(function(e){t.coinSupply=e,t.startDataRefreshSubscription(t.updatePeriod)},function(){return t.startDataRefreshSubscription(t.errorUpdatePeriod)})},e.prototype.ngOnDestroy=function(){this.removeOperationSubscription()},e.prototype.removeOperationSubscription=function(){this.operationSubscription&&this.operationSubscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(ps(jS),ps(yO))},e.\u0275cmp=ft({type:e,selectors:[["app-blockchain"]],decls:13,vars:5,consts:[[3,"headline"],[4,"ngIf"],["class","container",4,"ngIf"],[1,"final-element"],[1,"container"],[1,"row","-wrapper"],[1,"col-md-6","pl-0"],[1,"paper"],[1,"-item"],[1,"-key"],[1,"break-all"],[1,"col-md-6","pr-0"],[1,"row"],[1,"col-md-6"]],template:function(e,t){1&e&&(vs(0,"div"),ru(1,"\n "),ys(2,"app-header",0),Wl(3,"translate"),ru(4,"\n\n "),hs(5,kj,1,0,"app-loading-content",1),ru(6,"\n\n "),hs(7,Cj,104,60,"div",2),ru(8,"\n "),ru(9,"\n "),ys(10,"div",3),ru(11,"\n"),_s(),ru(12,"\n")),2&e&&(Ya(2),ms("headline",Vl(3,3,"blockchain.title")),Ya(3),ms("ngIf",!(t.block&&t.coinSupply)),Ya(2),ms("ngIf",t.block&&t.coinSupply))},directives:[_A,lh,aF],pipes:[hM,Mh,WH,NS],styles:[".-wrapper[_ngcontent-%COMP%]{margin:30px}.paper[_ngcontent-%COMP%]{margin:0}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}"]}),e}(),xj=function(){function e(e,t){this.data=e,this.dialogRef=t}return e.openDialog=function(t,n){var i=new wk;return i.data=n,i.autoFocus=!0,i.width=jM.mediumModalWidth,t.open(e,i)},e.\u0275fac=function(t){return new(t||e)(ps(Tk),ps(Lk))},e.\u0275cmp=ft({type:e,selectors:[["app-seed-modal"]],decls:21,vars:11,consts:[[3,"headline","dialog"],[1,"form-field"],["for","seed"],["id","seed","readonly",""],[1,"-buttons"],[1,"primary-button",3,"action"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),vs(3,"div",1),ru(4,"\n "),vs(5,"label",2),ru(6),Wl(7,"translate"),_s(),ru(8,"\n "),vs(9,"textarea",3),ru(10),_s(),ru(11,"\n "),_s(),ru(12,"\n "),vs(13,"div",4),ru(14,"\n "),vs(15,"app-button",5),xs("action",function(){return t.dialogRef.close()}),ru(16),Wl(17,"translate"),_s(),ru(18,"\n "),_s(),ru(19,"\n"),_s(),ru(20,"\n")),2&e&&(ms("headline",Vl(1,5,"backup.seed-modal-window.title"))("dialog",t.dialogRef),Ya(6),au(Vl(7,7,"backup.seed-modal-window.seed-label")),Ya(4),au(t.data),Ya(6),ou("\n ",Vl(17,9,"common.close-button"),"\n "))},directives:[jk,ZC],pipes:[hM],styles:[""]}),e}();function Tj(e,t){1&e&&ys(0,"app-loading-content",9),2&e&&ms("isLoading",!1)}function Dj(e,t){if(1&e){var n=Ms();vs(0,"div",23),xs("click",function(){on(n);var e=Ys().$implicit;return Ys(2).showSeed(e)}),ru(1),Wl(2,"translate"),_s()}2&e&&(Ya(1),au(Vl(2,1,"backup.show-seed-button")))}function Oj(e,t){1&e&&(vs(0,"mat-icon",25),Wl(1,"translate"),ru(2,"help"),_s()),2&e&&ms("matTooltip",Vl(1,1,"backup.unencrypted-info"))}function Ej(e,t){1&e&&(vs(0,"mat-icon",25),Wl(1,"translate"),ru(2,"help"),_s()),2&e&&ms("matTooltip",Vl(1,1,"backup.hw-wallet-info"))}function Yj(e,t){if(1&e&&(vs(0,"div"),ru(1,"\n "),hs(2,Oj,3,3,"mat-icon",24),ru(3,"\n "),hs(4,Ej,3,3,"mat-icon",24),ru(5),Wl(6,"translate"),_s()),2&e){var n=Ys().$implicit;Ya(2),ms("ngIf",!n.encrypted&&!n.isHardware),Ya(2),ms("ngIf",n.isHardware),Ya(1),ou("\n ",Vl(6,3,"backup.show-seed-button"),"\n ")}}function Pj(e,t){if(1&e){var n=Ms();vs(0,"div",17),ru(1,"\n "),vs(2,"div",18),ru(3),_s(),ru(4,"\n "),vs(5,"div",13),ru(6),_s(),ru(7,"\n "),ru(8,"\n "),vs(9,"div",19),ru(10,"\n "),vs(11,"div",20),xs("click",function(){var e=on(n).$implicit;return Ys(2).saveAddresses(e)}),ru(12),Wl(13,"translate"),_s(),ru(14,"\n "),hs(15,Dj,3,3,"div",21),ru(16,"\n "),hs(17,Yj,7,5,"div",22),ru(18,"\n "),_s(),ru(19,"\n "),_s()}if(2&e){var i=t.$implicit;Ya(2),ls("title",i.label),Ya(1),au(i.label),Ya(3),au(i.id),Ya(6),au(Vl(13,6,"backup.save-addresses-button")),Ya(3),ms("ngIf",i.encrypted&&!i.isHardware),Ya(2),ms("ngIf",!i.encrypted||i.isHardware)}}function Aj(e,t){if(1&e&&(vs(0,"div",10),ru(1,"\n "),vs(2,"div",11),ru(3,"\n "),vs(4,"div",12),ru(5),Wl(6,"translate"),_s(),ru(7,"\n "),vs(8,"div",13),ru(9),Wl(10,"translate"),_s(),ru(11,"\n "),ys(12,"div",14),ru(13,"\n "),_s(),ru(14,"\n "),vs(15,"div",15),ru(16,"\n "),hs(17,Pj,20,8,"div",16),ru(18,"\n "),_s(),ru(19,"\n "),_s()),2&e){var n=Ys();Ya(5),au(Vl(6,3,"backup.wallet-table-label")),Ya(4),au(Vl(10,5,"backup.filename-table-label")),Ya(8),ms("ngForOf",n.wallets)}}var Ij=function(){function e(e,t,n,i){this.dialog=e,this.walletsAndAddressesService=t,this.softwareWalletService=n,this.msgBarService=i,this.wallets=[]}return e.prototype.ngOnInit=function(){var e=this;this.folderSubscription=this.walletsAndAddressesService.folder().subscribe(function(t){e.folder=t},function(t){e.folder="?",e.msgBarService.showError(t)}),this.walletSubscription=this.walletsAndAddressesService.allWallets.subscribe(function(t){e.wallets=t})},e.prototype.ngOnDestroy=function(){this.folderSubscription.unsubscribe(),this.walletSubscription.unsubscribe()},e.prototype.saveAddresses=function(e){var t="";e.addresses.forEach(function(e){t+=e.address+"\n"}),t=t.substr(0,t.length-1);var n=new Blob([t],{type:"text/csv;charset=utf-8;"}),i=document.createElement("a");if(void 0!==i.download){var r=URL.createObjectURL(n);i.setAttribute("href",r),i.setAttribute("download",e.label+".csv"),i.style.visibility="hidden",document.body.appendChild(i),i.click(),document.body.removeChild(i)}else this.msgBarService.showError("backup.not-compatible-error")},e.prototype.showSeed=function(e){var t=this;LA.openDialog(this.dialog,{wallet:e}).componentInstance.passwordSubmit.subscribe(function(n){t.softwareWalletService.getWalletSeed(e,n.password).subscribe(function(e){n.close(),xj.openDialog(t.dialog,e)},function(e){return n.error(e)})})},e.\u0275fac=function(t){return new(t||e)(ps(Pk),ps(AL),ps(OE),ps(dL))},e.\u0275cmp=ft({type:e,selectors:[["app-backup"]],decls:35,vars:15,consts:[[3,"headline"],[1,"container"],[1,"paper","small-padding","mb-0"],[1,"mt-0"],[1,"grey-text","mb-0"],[3,"innerHtml"],["noDataText","backup.no-wallets",3,"isLoading",4,"ngIf"],["class","-table",4,"ngIf"],[1,"final-element"],["noDataText","backup.no-wallets",3,"isLoading"],[1,"-table"],[1,"-headers"],[1,"-width-250"],[1,"-width-150"],[1,"-flex-fill"],[1,"-body"],["class","-row",4,"ngFor","ngForOf"],[1,"-row"],[1,"-width-250","text-truncate"],[1,"-flex-fill","text-right"],[1,"link","address-link",3,"click"],["class","link",3,"click",4,"ngIf"],[4,"ngIf"],[1,"link",3,"click"],["class","help-icon",3,"matTooltip",4,"ngIf"],[1,"help-icon",3,"matTooltip"]],template:function(e,t){1&e&&(vs(0,"div"),ru(1,"\n "),ys(2,"app-header",0),Wl(3,"translate"),ru(4,"\n\n "),ru(5,"\n "),vs(6,"div",1),ru(7,"\n "),vs(8,"div",2),ru(9,"\n "),vs(10,"p",3),ru(11),Wl(12,"translate"),_s(),ru(13,"\n "),vs(14,"p"),ru(15),Wl(16,"translate"),_s(),ru(17,"\n "),vs(18,"p",4),ru(19,"\n "),ys(20,"small",5),Wl(21,"translate"),ru(22,"\n "),_s(),ru(23,"\n "),_s(),ru(24,"\n\n "),hs(25,Tj,1,1,"app-loading-content",6),ru(26,"\n\n "),ru(27,"\n "),hs(28,Aj,20,7,"div",7),ru(29,"\n "),_s(),ru(30,"\n "),ru(31,"\n "),ys(32,"div",8),ru(33,"\n"),_s(),ru(34,"\n")),2&e&&(Ya(2),ms("headline",Vl(3,7,"backup.title")),Ya(9),su("",Vl(12,9,"backup.wallet-directory")," ",t.folder,""),Ya(4),au(Vl(16,11,"backup.seed-warning")),Ya(5),ms("innerHtml",Vl(21,13,"backup.desc"),Yr),Ya(5),ms("ngIf",0===t.wallets.length),Ya(3),ms("ngIf",t.wallets.length>0))},directives:[_A,lh,aF,sh,WC,YO],pipes:[hM],styles:[".address-link[_ngcontent-%COMP%]{margin-bottom:2px}"]}),e}(),Rj=function(){function e(e){this.translateService=e}return e.prototype.transform=function(e){var t=RA().unix()-e;return t<60?this.translateService.instant("time-from-now.few-seconds"):t<120?this.translateService.instant("time-from-now.minute"):t<3600?this.translateService.instant("time-from-now.minutes",{time:Math.floor(t/60)}):t<7200?this.translateService.instant("time-from-now.hour"):t<86400?this.translateService.instant("time-from-now.hours",{time:Math.floor(t/3600)}):t<172800?this.translateService.instant("time-from-now.day"):this.translateService.instant("time-from-now.days",{time:Math.floor(t/86400)})},e.\u0275fac=function(t){return new(t||e)(ps(dM,16))},e.\u0275pipe=wt({name:"dateFromNow",type:e,pure:!1}),e}();function Fj(e,t){1&e&&ys(0,"app-loading-content",4),2&e&&ms("isLoading",!Ys().peers)}function Hj(e,t){1&e&&(ys(0,"img",27),Wl(1,"translate")),2&e&&ms("matTooltip",Vl(1,1,"network.out-help"))}function jj(e,t){1&e&&(ys(0,"img",28),Wl(1,"translate")),2&e&&ms("matTooltip",Vl(1,1,"network.in-help"))}function Nj(e,t){if(1&e&&(vs(0,"div",16),ru(1,"\n "),vs(2,"div",17),ru(3,"\n "),hs(4,Hj,2,3,"img",18),ru(5,"\n "),hs(6,jj,2,3,"img",19),ru(7,"\n "),_s(),ru(8,"\n "),vs(9,"div",20),ru(10),vs(11,"span",21),ru(12),_s(),ru(13,"\n "),_s(),ru(14,"\n "),vs(15,"div",22),ru(16),Wl(17,"translate"),_s(),ru(18,"\n "),vs(19,"div",23),ru(20),_s(),ru(21,"\n "),vs(22,"div",24),ru(23,"\n "),vs(24,"div",25),ru(25,"\n "),vs(26,"mat-icon",26),Wl(27,"translate"),ru(28,"keyboard_arrow_up"),_s(),ru(29),Wl(30,"dateFromNow"),_s(),ru(31,"\n "),vs(32,"div",25),ru(33,"\n "),vs(34,"mat-icon",26),Wl(35,"translate"),ru(36,"keyboard_arrow_down"),_s(),ru(37),Wl(38,"dateFromNow"),_s(),ru(39,"\n "),_s(),ru(40,"\n "),_s()),2&e){var n=t.$implicit;Ya(4),ms("ngIf",n.outgoing),Ya(2),ms("ngIf",!n.outgoing),Ya(4),ou("\n ",n.address.split(":")[0],""),Ya(2),ou(":",n.listenPort,""),Ya(4),au(Vl(17,10,"network.sources."+n.source)),Ya(4),au(n.height),Ya(6),ms("matTooltip",Vl(27,12,"network.last-sent-help")),Ya(3),ou("\n ",Vl(30,14,n.lastSent),"\n "),Ya(5),ms("matTooltip",Vl(35,16,"network.last-received-help")),Ya(3),ou("\n ",Vl(38,18,n.lastReceived),"\n ")}}function Bj(e,t){if(1&e&&(vs(0,"div",5),ru(1,"\n "),vs(2,"div",6),ru(3,"\n "),vs(4,"div",7),ru(5,"\n "),ys(6,"div",8),ru(7,"\n "),vs(8,"div",9),ru(9),Wl(10,"translate"),_s(),ru(11,"\n "),vs(12,"div",10),ru(13),Wl(14,"translate"),_s(),ru(15,"\n "),vs(16,"div",11),ru(17),Wl(18,"translate"),_s(),ru(19,"\n "),vs(20,"div",12),ru(21),Wl(22,"translate"),_s(),ru(23,"\n "),vs(24,"div",13),ru(25),Wl(26,"translate"),_s(),ru(27,"\n "),_s(),ru(28,"\n "),vs(29,"div",14),ru(30,"\n "),hs(31,Nj,41,20,"div",15),ru(32,"\n "),_s(),ru(33,"\n "),_s(),ru(34,"\n "),_s()),2&e){var n=Ys();Ya(9),au(Vl(10,6,"network.peer-small-table-label")),Ya(4),au(Vl(14,8,"network.source-small-table-label")),Ya(4),au(Vl(18,10,"network.block-height-small-table-label")),Ya(4),au(Vl(22,12,"network.block-height-short-small-table-label")),Ya(4),au(Vl(26,14,"network.last-seen-small-table-label")),Ya(6),ms("ngForOf",n.peers)}}var Wj=function(){function e(e){this.networkService=e}return e.prototype.ngOnInit=function(){var e=this;this.subscription=this.networkService.connections().subscribe(function(t){return e.peers=t})},e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(ps(lP))},e.\u0275cmp=ft({type:e,selectors:[["app-network"]],decls:13,vars:5,consts:[[3,"headline"],["noDataText","network.error-no-connections",3,"isLoading",4,"ngIf"],["class","container",4,"ngIf"],[1,"final-element"],["noDataText","network.error-no-connections",3,"isLoading"],[1,"container"],[1,"-table"],[1,"-headers"],[1,"-direction-cell"],[1,"-address-cell"],[1,"-flex-fill"],[1,"d-none","d-lg-block","-block-cell"],[1,"d-lg-none","-block-cell"],[1,"-last-seen-cell"],[1,"-body"],["class","-row",4,"ngFor","ngForOf"],[1,"-row"],[1,"-direction-cell","-direction-container"],["src","assets/img/sent-blue.png",3,"matTooltip",4,"ngIf"],["src","assets/img/received-blue.png",3,"matTooltip",4,"ngIf"],[1,"-address-cell","break-all"],[1,"grey-text"],[1,"-flex-fill","grey-text"],[1,"-block-cell","break-all"],[1,"-last-seen-cell","-last-seen-container","grey-text"],[1,"text-truncate"],[3,"matTooltip"],["src","assets/img/sent-blue.png",3,"matTooltip"],["src","assets/img/received-blue.png",3,"matTooltip"]],template:function(e,t){1&e&&(vs(0,"div"),ru(1,"\n "),ys(2,"app-header",0),Wl(3,"translate"),ru(4,"\n\n "),hs(5,Fj,1,1,"app-loading-content",1),ru(6,"\n\n "),hs(7,Bj,35,16,"div",2),ru(8,"\n "),ru(9,"\n "),ys(10,"div",3),ru(11,"\n"),_s(),ru(12,"\n")),2&e&&(Ya(2),ms("headline",Vl(3,3,"network.title")),Ya(3),ms("ngIf",!t.peers||0===t.peers.length),Ya(2),ms("ngIf",t.peers&&t.peers.length>0))},directives:[_A,lh,aF,sh,WC,YO],pipes:[hM,Rj],styles:[".-direction-cell[_ngcontent-%COMP%]{width:72px;flex-shrink:0}.-direction-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center}.-direction-container[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-last-seen-cell[_ngcontent-%COMP%]{width:180px;flex-shrink:0}.-last-seen-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;font-size:11px;line-height:1;justify-content:center}.-last-seen-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:12px;display:inline;vertical-align:middle;padding-right:5px}.-address-cell[_ngcontent-%COMP%]{width:200px;flex-shrink:0;padding-left:0!important}.-block-cell[_ngcontent-%COMP%]{width:150px;flex-shrink:0;text-align:right}@media (max-width:991px){.-row[_ngcontent-%COMP%]{font-size:12px!important}.-address-cell[_ngcontent-%COMP%]{width:160px!important}.-block-cell[_ngcontent-%COMP%]{width:100px}}"]}),e}(),Vj=function(){function e(){this.statuses=["done","waiting_confirm","waiting_deposit","waiting_send"]}return e.prototype.transform=function(e){return this.statuses.find(function(t){return t===e})?"teller."+e.replace("_","-"):"teller.unknown"},e.\u0275fac=function(t){return new(t||e)},e.\u0275pipe=wt({name:"tellerStatus",type:e,pure:!0}),e}(),Uj=["button"];function zj(e,t){if(1&e&&(vs(0,"option",16),ru(1),vs(2,"span",17),ru(3),Wl(4,"amount"),_s(),ru(5,"\n "),_s()),2&e){var n=t.$implicit;ms("value",n.id),Ya(1),ou("\n ",n.label," - "),Ya(2),au(Vl(4,3,n.coins))}}var qj=function(e){return{rate:e}};function Gj(e,t){if(1&e&&(vs(0,"div",5),ru(1,"\n "),vs(2,"div",6),ru(3,"\n "),vs(4,"span",7),ru(5,"2"),_s(),ru(6,"\n "),_s(),ru(7,"\n "),vs(8,"div",8),ru(9,"\n "),vs(10,"h3"),ru(11),Wl(12,"translate"),_s(),ru(13,"\n "),vs(14,"p"),ru(15),Wl(16,"translate"),_s(),ru(17,"\n "),vs(18,"span",18),ru(19),_s(),ru(20,"\n "),vs(21,"span",14),ru(22),Wl(23,"translate"),_s(),ru(24,"\n "),_s(),ru(25,"\n "),_s()),2&e){var n=Ys(2);Ya(11),au(Vl(12,4,"buy.send")),Ya(4),au(Ul(16,6,"buy.send-desc",Il(11,qj,n.config.sky_btc_exchange_rate))),Ya(4),ou("\n ",n.order.deposit_address,"\n "),Ya(3),au(Vl(23,9,"buy.fraction-warning"))}}function Kj(e,t){if(1&e){var n=Ms();vs(0,"div",5),ru(1,"\n "),vs(2,"div",6),ru(3,"\n "),vs(4,"span",7),ru(5,"3"),_s(),ru(6,"\n "),_s(),ru(7,"\n "),vs(8,"div",8),ru(9,"\n "),vs(10,"h3"),ru(11),Wl(12,"translate"),_s(),ru(13,"\n "),vs(14,"p"),ru(15),Wl(16,"translate"),_s(),ru(17,"\n "),vs(18,"span",19),ru(19),Wl(20,"translate"),Wl(21,"translate"),Wl(22,"tellerStatus"),_s(),ru(23,"\n "),vs(24,"app-button",20,21),xs("action",function(){return on(n),Ys(2).checkStatus()}),ru(26),Wl(27,"translate"),_s(),ru(28,"\n "),vs(29,"app-button",22,21),xs("action",function(){return on(n),Ys(2).removeOrder()}),ru(31),Wl(32,"translate"),_s(),ru(33,"\n "),_s(),ru(34,"\n "),_s()}if(2&e){var i=Ys(2);Ya(11),au(Vl(12,6,"buy.receive")),Ya(4),au(Vl(16,8,"buy.receive-desc")),Ya(4),su("\n ",Vl(20,10,"buy.status-button")," ",Vl(21,12,Vl(22,14,i.order.status)),"\n "),Ya(7),ou("\n ",Vl(27,16,"buy.check-status-button"),"\n "),Ya(5),ou("\n ",Vl(32,18,"buy.new-order-button"),"\n ")}}function Jj(e,t){if(1&e&&(vs(0,"div",4),ru(1,"\n "),vs(2,"div",5),ru(3,"\n "),vs(4,"div",6),ru(5,"\n "),vs(6,"span",7),ru(7,"1"),_s(),ru(8,"\n "),_s(),ru(9,"\n "),vs(10,"div",8),ru(11,"\n "),vs(12,"h3"),ru(13),Wl(14,"translate"),_s(),ru(15,"\n "),vs(16,"p"),ru(17),Wl(18,"translate"),_s(),ru(19,"\n "),vs(20,"div",9),ru(21,"\n "),vs(22,"div",10),ru(23,"\n "),vs(24,"select",11),ru(25,"\n "),vs(26,"option",12),ru(27),Wl(28,"translate"),_s(),ru(29,"\n "),hs(30,zj,6,5,"option",13),ru(31,"\n "),_s(),ru(32,"\n "),_s(),ru(33,"\n "),_s(),ru(34,"\n "),vs(35,"span",14),ru(36),Wl(37,"translate"),_s(),ru(38,"\n "),_s(),ru(39,"\n "),_s(),ru(40,"\n "),hs(41,Gj,26,13,"div",15),ru(42,"\n "),hs(43,Kj,35,20,"div",15),ru(44,"\n "),_s()),2&e){var n=Ys();ms("formGroup",n.form),Ya(13),au(Vl(14,8,"buy.deposit-location")),Ya(4),au(Vl(18,10,"buy.deposit-location-desc")),Ya(10),au(Vl(28,12,"buy.make-choice")),Ya(3),ms("ngForOf",n.wallets),Ya(6),au(Vl(37,14,"buy.wallets-desc")),Ya(5),ms("ngIf",n.order),Ya(2),ms("ngIf",n.order)}}var Zj=function(){function e(e,t,n,i){this.formBuilder=e,this.purchaseService=t,this.msgBarService=n,this.walletsAndAddressesService=i,this.subscriptionsGroup=[]}return e.prototype.ngOnInit=function(){this.initForm(),this.loadData()},e.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(e){return e.unsubscribe()})},e.prototype.checkStatus=function(){var e=this;this.button.setLoading(),this.purchaseService.scan(this.order.recipient_address).subscribe(function(t){e.button.setSuccess(),e.order.status=t.status},function(t){return e.button.resetState()})},e.prototype.removeOrder=function(){window.localStorage.removeItem("purchaseOrder"),this.order=null},e.prototype.initForm=function(){var e=this;this.form=this.formBuilder.group({wallet:["",Yf.required]}),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){var n=e.wallets.find(function(e){return e.id===t});console.log("changing wallet value",t),e.purchaseService.generate(n).subscribe(function(t){return e.saveData(t)},function(t){return e.msgBarService.showError(t.toString())})}))},e.prototype.loadConfig=function(){var e=this;this.purchaseService.config().pipe(zm(function(e){return!!e&&!!e.sky_btc_exchange_rate}),eS()).subscribe(function(t){return e.config=t})},e.prototype.loadData=function(){var e=this;this.loadConfig(),this.loadOrder(),this.subscriptionsGroup.push(this.walletsAndAddressesService.allWallets.subscribe(function(t){e.wallets=t,e.order&&e.form.get("wallet").setValue(e.order.filename,{emitEvent:!1})}))},e.prototype.loadOrder=function(){var e=JSON.parse(window.localStorage.getItem("purchaseOrder"));e&&(this.order=e,this.updateOrder())},e.prototype.saveData=function(e){this.order=e,window.localStorage.setItem("purchaseOrder",JSON.stringify(e))},e.prototype.updateOrder=function(){var e=this;this.purchaseService.scan(this.order.recipient_address).pipe(eS()).subscribe(function(t){return e.order.status=t.status},function(e){return console.log(e)})},e.\u0275fac=function(t){return new(t||e)(ps(fm),ps(cP),ps(dL),ps(AL))},e.\u0275cmp=ft({type:e,selectors:[["app-buy"]],viewQuery:function(e,t){var n;1&e&&lc(Uj,5),2&e&&uc(n=dc())&&(t.button=n.first)},decls:13,vars:1,consts:[[1,"-background-container"],[1,"container"],["class","-paper",3,"formGroup",4,"ngIf"],["src","../../../../assets/img/otc-background.jpg",1,"-background-image"],[1,"-paper",3,"formGroup"],[1,"-step"],[1,"-number"],[1,"primary-gradient-background"],[1,"-instructions","flex-fill"],[1,"form-field"],[1,"-select"],["formControlName","wallet","id","wallet","required","",1,"-wallet"],["disabled","","selected",""],[3,"value",4,"ngFor","ngForOf"],[1,"-subtitle"],["class","-step",4,"ngIf"],[3,"value"],[1,"-coins"],[1,"-address"],[1,"-status"],[1,"primary-button",3,"action"],["button",""],[3,"action"]],template:function(e,t){1&e&&(ru(0,"\n"),ys(1,"app-header"),ru(2,"\n"),vs(3,"div",0),ru(4,"\n "),vs(5,"div",1),ru(6,"\n "),hs(7,Jj,45,16,"div",2),ru(8,"\n "),ys(9,"img",3),ru(10,"\n "),_s(),ru(11,"\n"),_s(),ru(12,"\n")),2&e&&(Ya(7),ms("ngIf",t.config))},directives:[_A,lh,ap,jp,Jp,rp,qp,sm,Zp,em,sh,ZC],pipes:[hM,NS,Vj],styles:[".-background-container[_ngcontent-%COMP%]{background-color:#fbfbfb;padding-top:30px;max-width:100%;min-height:calc(100% - 190px);overflow:hidden;position:relative}.-background-image[_ngcontent-%COMP%]{display:none}@media (min-width:768px){.-background-image[_ngcontent-%COMP%]{display:block;left:50%;width:80%;position:absolute;top:0}}@media (min-width:992px){.-background-image[_ngcontent-%COMP%]{left:40%;width:90%;max-width:850px}}@media (min-width:1200px){.-background-image[_ngcontent-%COMP%]{left:40%;width:80%;max-width:850px}}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;position:relative;margin-top:30px;max-width:540px;z-index:5}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%]{display:flex;margin-bottom:30px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{width:60px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border-radius:50%;color:#fff;display:inline-block;font-size:16px;font-weight:700;height:40px;line-height:46px;text-align:center;width:40px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%]{flex:1 1}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] button{margin-left:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:0;line-height:46px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px;font-weight:300;line-height:20px;margin-top:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%], .-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%]{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;box-sizing:border-box;color:rgba(30,34,39,.8);display:block;font-size:14px;line-height:20px;margin-bottom:15px;padding:10px;width:100%}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#0072ff}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .form-field[_ngcontent-%COMP%]{margin-bottom:15px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-subtitle[_ngcontent-%COMP%]{color:#8c8e90;font-size:12px;line-height:18px;font-weight:300;opacity:.8}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-wallet[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px}"]}),e}(),$j=function(){function e(e,t){this.transaction=e,this.dialogRef=t}return e.openDialog=function(t,n){var i=new wk;return i.data=n,i.autoFocus=!1,i.width="800px",t.open(e,i)},e.prototype.closePopup=function(){this.dialogRef.close()},e.\u0275fac=function(t){return new(t||e)(ps(Tk),ps(Lk))},e.\u0275cmp=ft({type:e,selectors:[["app-transaction-detail"]],decls:6,vars:6,consts:[[3,"headline","dialog"],[3,"transaction","isPreview"]],template:function(e,t){1&e&&(vs(0,"app-modal",0),Wl(1,"translate"),ru(2,"\n "),vs(3,"app-transaction-info",1),ru(4,"\n "),_s(),ru(5,"\n"),_s()),2&e&&(ms("headline",Vl(1,4,"history.tx-detail-title"))("dialog",t.dialogRef),Ya(3),ms("transaction",t.transaction)("isPreview",!1))},directives:[jk,rj],pipes:[hM],styles:["app-transaction-info[_ngcontent-%COMP%]{color:#1e2227}"]}),e}();function Xj(e,t){1&e&&(vs(0,"mat-option",15),ru(1),Wl(2,"translate"),_s()),2&e&&(ms("value",Ys().$implicit),Ya(1),ou("\n ",Vl(2,2,"history.all-addresses"),"\n "))}function Qj(e,t){if(1&e&&(vs(0,"mat-option",16),ru(1),Wl(2,"amount"),Wl(3,"amount"),_s()),2&e){var n=t.$implicit,i=Ys().$implicit;ms("value",n)("disabled",i.allAddressesSelected),Ya(1),uu("\n ",n.address," - ",Vl(2,5,n.coins),"\n (",Ul(3,7,n.hours,!1),")\n ")}}function eN(e,t){if(1&e&&(vs(0,"mat-optgroup",12),Wl(1,"amount"),Wl(2,"amount"),ru(3,"\n "),hs(4,Xj,3,4,"mat-option",13),ru(5,"\n "),hs(6,Qj,4,10,"mat-option",14),ru(7,"\n "),_s()),2&e){var n=t.$implicit;Hs("label","\n ",n.label," - ",Vl(1,5,n.coins),"\n (",Ul(2,7,n.hours,!1),")\n "),Ya(4),ms("ngIf",n.addresses.length>1),Ya(2),ms("ngForOf",n.addresses)}}function tN(e,t){1&e&&(vs(0,"span"),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"history.filter")))}function nN(e,t){1&e&&(vs(0,"span"),ru(1),Wl(2,"translate"),_s()),2&e&&(Ya(1),au(Vl(2,1,"history.filters")))}function iN(e,t){if(1&e&&(vs(0,"span"),ru(1),_s()),2&e){var n=Ys(2).$implicit;Ya(1),au(n.label)}}function rN(e,t){if(1&e&&(vs(0,"span"),ru(1),_s()),2&e){var n=Ys(2).$implicit;Ya(1),au(n.address)}}function aN(e,t){if(1&e&&(vs(0,"div",18),ru(1,"\n "),hs(2,iN,2,1,"span",9),ru(3,"\n "),hs(4,rN,2,1,"span",9),ru(5),Wl(6,"amount"),Wl(7,"amount"),_s()),2&e){var n=Ys().$implicit;Ya(2),ms("ngIf",n.label),Ya(2),ms("ngIf",!n.label),Ya(1),su("\n - ",Vl(6,4,n.coins),"\n (",Ul(7,6,n.hours,!1),")\n ")}}function oN(e,t){if(1&e&&(bs(0),ru(1,"\n "),hs(2,aN,8,9,"div",17),ru(3,"\n "),ws()),2&e){var n=t.$implicit;Ya(2),ms("ngIf",n.label||!n.showingWholeWallet)}}function sN(e,t){if(1&e){var n=Ms();vs(0,"img",19),xs("click",function(){return on(n),Ys(2).removeFilters()}),_s()}}var uN=function(e){return{"bottom-line":e}};function lN(e,t){if(1&e&&(vs(0,"div",6),ru(1,"\n "),vs(2,"mat-select",7),Wl(3,"translate"),ru(4,"\n "),ru(5,"\n "),hs(6,eN,8,10,"mat-optgroup",8),ru(7,"\n "),ru(8,"\n "),vs(9,"mat-select-trigger"),ru(10,"\n "),hs(11,tN,3,3,"span",9),ru(12,"\n "),hs(13,nN,3,3,"span",9),ru(14,"\n "),hs(15,oN,4,1,"ng-container",10),ru(16,"\n "),_s(),ru(17,"\n "),_s(),ru(18,"\n "),hs(19,sN,1,0,"img",11),ru(20,"\n "),_s()),2&e){var n=Ys();ms("formGroup",n.form)("ngClass",Il(10,uN,!n.transactions||0===n.transactions.length)),Ya(2),ms("placeholder",Vl(3,8,"history.no-filter")),Ya(4),ms("ngForOf",n.wallets),Ya(5),ms("ngIf",1===n.form.get("filter").value.length),Ya(2),ms("ngIf",n.form.get("filter").value.length>1),Ya(2),ms("ngForOf",n.form.get("filter").value),Ya(4),ms("ngIf",n.form.get("filter").value.length>0)}}function cN(e,t){if(1&e&&ys(0,"app-loading-content",20),2&e){var n=Ys();ms("isLoading",!n.transactionsLoaded)("noDataText",n.allTransactions&&0!==n.allTransactions.length?"history.no-txs-filter":"history.no-txs")}}var dN=function(e){return{coinName:e}};function hN(e,t){if(1&e&&(vs(0,"h4"),ru(1),Wl(2,"translate"),vs(3,"span",31),ru(4),Wl(5,"dateTime"),_s(),ru(6,"\n "),_s()),2&e){var n=Ys(2).$implicit,i=Ys(2);Ya(1),ou("\n ",Ul(2,2,"history.sent",Il(7,dN,i.appService.coinName)),"\n "),Ya(3),au(Vl(5,5,n.timestamp))}}function fN(e,t){if(1&e&&(vs(0,"h4"),ru(1),Wl(2,"translate"),vs(3,"span",32),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()),2&e){var n=Ys(4);Ya(1),ou("\n ",Ul(2,2,"history.sending",Il(7,dN,n.appService.coinName)),"\n "),Ya(3),au(Vl(5,5,"history.pending-indication"))}}function pN(e,t){if(1&e&&(vs(0,"h4"),ru(1),Wl(2,"translate"),vs(3,"span",31),ru(4),Wl(5,"dateTime"),_s(),ru(6,"\n "),_s()),2&e){var n=Ys(2).$implicit,i=Ys(2);Ya(1),ou("\n ",Ul(2,2,"history.received",Il(7,dN,i.appService.coinName)),"\n "),Ya(3),au(Vl(5,5,n.timestamp))}}function mN(e,t){if(1&e&&(vs(0,"h4"),ru(1),Wl(2,"translate"),vs(3,"span",32),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()),2&e){var n=Ys(4);Ya(1),ou("\n ",Ul(2,2,"history.receiving",Il(7,dN,n.appService.coinName)),"\n "),Ya(3),au(Vl(5,5,"history.pending-indication"))}}function gN(e,t){if(1&e&&(bs(0),ru(1,"\n "),hs(2,hN,7,9,"h4",9),ru(3,"\n "),hs(4,fN,7,9,"h4",9),ru(5,"\n "),hs(6,pN,7,9,"h4",9),ru(7,"\n "),hs(8,mN,7,9,"h4",9),ru(9,"\n "),ws()),2&e){var n=Ys().$implicit;Ya(2),ms("ngIf",n.balance.isLessThan(0)&&n.confirmed),Ya(2),ms("ngIf",n.balance.isLessThan(0)&&!n.confirmed),Ya(2),ms("ngIf",n.balance.isGreaterThan(0)&&n.confirmed),Ya(2),ms("ngIf",n.balance.isGreaterThan(0)&&!n.confirmed)}}function vN(e,t){if(1&e&&(vs(0,"h4"),ru(1),Wl(2,"translate"),vs(3,"span",31),ru(4),Wl(5,"dateTime"),_s(),ru(6,"\n "),_s()),2&e){var n=Ys(2).$implicit,i=Ys(2);Ya(1),ou("\n ",Ul(2,2,"history.moved",Il(7,dN,i.appService.coinName)),"\n "),Ya(3),au(Vl(5,5,n.timestamp))}}function _N(e,t){if(1&e&&(vs(0,"h4"),ru(1),Wl(2,"translate"),vs(3,"span",32),ru(4),Wl(5,"translate"),_s(),ru(6,"\n "),_s()),2&e){var n=Ys(4);Ya(1),ou("\n ",Ul(2,2,"history.moving",Il(7,dN,n.appService.coinName)),"\n "),Ya(3),au(Vl(5,5,"history.pending-indication"))}}function yN(e,t){if(1&e&&(bs(0),ru(1,"\n "),hs(2,vN,7,9,"h4",9),ru(3,"\n "),hs(4,_N,7,9,"h4",9),ru(5,"\n "),ws()),2&e){var n=Ys().$implicit;Ya(2),ms("ngIf",n.confirmed),Ya(2),ms("ngIf",!n.confirmed)}}function bN(e,t){if(1&e&&(vs(0,"div",33),ru(1,"\n "),ys(2,"app-qr-code-button",34),ru(3,"\n "),vs(4,"span",35),ru(5),_s(),ru(6,"\n "),_s()),2&e){var n=t.$implicit;Ya(2),ms("address",n),Ya(3),au(n)}}function wN(e,t){if(1&e&&(vs(0,"div",33),ru(1,"\n "),vs(2,"span"),ru(3),Wl(4,"translate"),vs(5,"span",36),ru(6),_s(),_s(),ru(7,"\n "),_s()),2&e){var n=Ys().$implicit;Ya(3),ou("",Vl(4,2,"history.transaction-note-small-label")," "),Ya(3),au(n.note)}}function kN(e,t){if(1&e&&(vs(0,"p",37),Wl(1,"translate"),ru(2),Wl(3,"currency"),vs(4,"span"),ru(5,"*"),_s(),ru(6,"\n "),_s()),2&e){var n=Ys().$implicit,i=Ys(2);ms("matTooltip",Vl(1,2,"tx.current-rate-help")),Ya(2),ou("\n ",ql(3,4,n.balance*i.price,"USD","symbol","1.2-2"),"")}}var MN=function(e){return{"-pending":e}};function SN(e,t){if(1&e){var n=Ms();bs(0),ru(1,"\n "),vs(2,"div",23),xs("click",function(){var e=on(n).$implicit;return Ys(2).showTransaction(e)}),ru(3,"\n "),vs(4,"div",24),ru(5,"\n "),ys(6,"img",25),ru(7,"\n "),_s(),ru(8,"\n "),vs(9,"div",26),ru(10,"\n "),hs(11,gN,10,4,"ng-container",9),ru(12,"\n "),hs(13,yN,6,2,"ng-container",9),ru(14,"\n "),hs(15,bN,7,2,"div",27),ru(16,"\n "),hs(17,wN,8,4,"div",28),ru(18,"\n "),_s(),ru(19,"\n "),vs(20,"div",29),ru(21,"\n "),vs(22,"h4"),ru(23),Wl(24,"amount"),_s(),ru(25,"\n "),hs(26,kN,7,9,"p",30),ru(27,"\n "),_s(),ru(28,"\n "),_s(),ru(29,"\n "),ws()}if(2&e){var i=t.$implicit,r=Ys(2);Ya(4),ms("ngClass",Il(10,MN,!i.confirmed)),Ya(2),ms("src","assets/img/"+(i.balance.isGreaterThan(0)&&!i.coinsMovedInternally?"received":"sent")+"-blue.png",Pr),Ya(5),ms("ngIf",!i.coinsMovedInternally),Ya(2),ms("ngIf",i.coinsMovedInternally),Ya(2),ms("ngForOf",i.relevantAddresses),Ya(2),ms("ngIf",i.note),Ya(6),au(Vl(24,8,i.balance.toString())),Ya(3),ms("ngIf",r.price)}}var CN=function(e){return{number:e}};function LN(e,t){if(1&e){var n=Ms();vs(0,"div",38),xs("click",function(){return on(n),Ys(2).showAll()}),ru(1),Wl(2,"translate"),_s()}if(2&e){var i=Ys(2);Ya(1),au(Ul(2,1,"history.view-all",Il(4,CN,i.totalElements)))}}function xN(e,t){if(1&e&&(vs(0,"div",21),ru(1,"\n "),hs(2,SN,30,12,"ng-container",10),ru(3,"\n "),hs(4,LN,3,6,"div",22),ru(5,"\n "),_s()),2&e){var n=Ys();Ya(2),ms("ngForOf",n.transactions),Ya(2),ms("ngIf",n.viewingTruncatedList)}}var TN=function(){function e(e,t,n,i,r,a,o){var s=this;this.appService=e,this.dialog=t,this.priceService=n,this.formBuilder=i,this.historyService=r,this.transactionsLoaded=!1,this.maxInitialElements=40,this.viewAll=!1,this.viewingTruncatedList=!1,this.form=this.formBuilder.group({filter:[[]]}),this.routeSubscription=o.queryParams.subscribe(function(e){var t=e.addr?e.addr.split(","):[],n=e.wal?e.wal.split(","):[];t=t.map(function(e){return"a-"+e}),n=n.map(function(e){return"w-"+e}),s.viewAll=!1,s.requestedFilters=t.concat(n),s.showRequestedFilters()}),this.walletsSubscription=a.walletsWithBalance.subscribe(function(e){var t=new Map,n=new Map;s.form.get("filter").value.forEach(function(e){e.addresses?n.set(e.id,!0):t.set(e.walletID+"/"+e.address,!0)});var i=[];s.wallets=[],e.forEach(function(e){var r={id:e.id,label:e.label,coins:e.coins.decimalPlaces(6).toString(),hours:e.hours.decimalPlaces(0).toString(),addresses:[],allAddressesSelected:n.has(e.id)};s.wallets.push(r),n.has(e.id)&&i.push(r),e.addresses.forEach(function(r){var a={walletID:e.id,address:r.address,coins:r.coins.decimalPlaces(6).toString(),hours:r.hours.decimalPlaces(0).toString(),showingWholeWallet:n.has(e.id)};s.wallets[s.wallets.length-1].addresses.push(a),t.has(e.id+"/"+r.address)&&i.push(a)})}),s.form.get("filter").setValue(i,{emitEvent:!1}),s.loadTransactions(0)})}return e.prototype.ngOnInit=function(){var e=this;this.priceSubscription=this.priceService.price.subscribe(function(t){return e.price=t}),this.filterSubscription=this.form.get("filter").valueChanges.subscribe(function(){e.viewAll=!1,e.filterTransactions()})},e.prototype.ngOnDestroy=function(){this.priceSubscription.unsubscribe(),this.filterSubscription.unsubscribe(),this.walletsSubscription.unsubscribe(),this.routeSubscription.unsubscribe(),this.removeTransactionsSubscription()},e.prototype.showAll=function(){this.viewAll||(this.viewAll=!0,this.filterTransactions())},e.prototype.showTransaction=function(e){$j.openDialog(this.dialog,e)},e.prototype.removeFilters=function(){this.form.get("filter").setValue([])},e.prototype.loadTransactions=function(e){var t=this;this.removeTransactionsSubscription(),this.transactionsSubscription=bm(1).pipe(EM(e),ue(function(){return t.historyService.getTransactionsHistory(null)})).subscribe(function(e){t.allTransactions=e,t.transactionsLoaded=!0,t.showRequestedFilters(),t.filterTransactions()},function(){return t.loadTransactions(2e3)})},e.prototype.filterTransactions=function(){var e=this.form.get("filter").value;if(this.wallets.forEach(function(e){e.allAddressesSelected=!1,e.addresses.forEach(function(e){return e.showingWholeWallet=!1})}),0===e.length)this.transactions=this.allTransactions;else{var t=new Map;e.forEach(function(e){e.addresses?(e.addresses.forEach(function(e){t.set(e.address,!0),e.showingWholeWallet=!0}),e.allAddressesSelected=!0):t.set(e.address,!0)}),this.transactions=this.allTransactions.filter(function(e){return e.inputs.some(function(e){return t.has(e.address)})||e.outputs.some(function(e){return t.has(e.address)})})}this.totalElements=this.transactions.length,!this.viewAll&&this.totalElements>this.maxInitialElements?(this.transactions=this.transactions.slice(0,this.maxInitialElements),this.viewingTruncatedList=!0):this.viewingTruncatedList=!1},e.prototype.showRequestedFilters=function(){var e=this;if(this.transactionsLoaded&&this.wallets&&0!==this.wallets.length&&null!=this.requestedFilters){if(this.requestedFilters.length>0){var t=[];this.requestedFilters.forEach(function(n){var i=n.substr(2,n.length-2);e.wallets.forEach(function(e){n.startsWith("w-")?i===e.id&&t.push(e):n.startsWith("a-")&&e.addresses.forEach(function(e){i===e.address&&t.push(e)})})}),this.form.get("filter").setValue(t)}else this.form.get("filter").setValue([]);this.requestedFilters=null}},e.prototype.removeTransactionsSubscription=function(){this.transactionsSubscription&&this.transactionsSubscription.unsubscribe()},e.\u0275fac=function(t){return new(t||e)(ps(jS),ps(Pk),ps(dP),ps(fm),ps(FA),ps(_O),ps(Jx))},e.\u0275cmp=ft({type:e,selectors:[["app-transaction-list"]],decls:17,vars:6,consts:[[3,"headline"],[1,"container"],["class","form-field",3,"formGroup","ngClass",4,"ngIf"],[3,"isLoading","noDataText",4,"ngIf"],["class","paper",4,"ngIf"],[1,"final-element"],[1,"form-field",3,"formGroup","ngClass"],["multiple","","formControlName","filter","id","filter",3,"placeholder"],[3,"label",4,"ngFor","ngForOf"],[4,"ngIf"],[4,"ngFor","ngForOf"],["class","x-button image-button","src","assets/img/delete-grey.png",3,"click",4,"ngIf"],[3,"label"],[3,"value",4,"ngIf"],[3,"value","disabled",4,"ngFor","ngForOf"],[3,"value"],[3,"value","disabled"],["class","filter text-truncate",4,"ngIf"],[1,"filter","text-truncate"],["src","assets/img/delete-grey.png",1,"x-button","image-button",3,"click"],[3,"isLoading","noDataText"],[1,"paper"],["class","view-all-button",3,"click",4,"ngIf"],[1,"-transaction",3,"click"],[1,"-icon",3,"ngClass"],[3,"src"],[1,"-address"],["class","-item",4,"ngFor","ngForOf"],["class","-item",4,"ngIf"],[1,"-balance"],[3,"matTooltip",4,"ngIf"],[1,"-timestamp"],[1,"-pending"],[1,"-item"],[3,"address"],[1,"break-all"],[1,"note"],[3,"matTooltip"],[1,"view-all-button",3,"click"]],template:function(e,t){1&e&&(ys(0,"app-header",0),Wl(1,"translate"),ru(2,"\n"),vs(3,"div",1),ru(4,"\n "),ru(5,"\n "),hs(6,lN,21,12,"div",2),ru(7,"\n\n "),hs(8,cN,1,2,"app-loading-content",3),ru(9,"\n\n "),ru(10,"\n "),hs(11,xN,6,2,"div",4),ru(12,"\n "),ru(13,"\n "),ys(14,"div",5),ru(15,"\n"),_s(),ru(16,"\n")),2&e&&(ms("headline",Vl(1,4,"history.title-and-button")),Ya(6),ms("ngIf",t.transactionsLoaded),Ya(2),ms("ngIf",!t.transactions||0===t.transactions.length),Ya(3),ms("ngIf",t.transactions&&t.transactions.length>0))},directives:[_A,lh,ap,jp,ah,QI,rp,qp,sh,$I,dk,mk,aF,KA,YO],pipes:[hM,NS,WH,Ch],styles:['.form-field[_ngcontent-%COMP%]{margin:10px 30px -21px;display:flex}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%]{background:transparent;border:0;border-radius:0}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .mat-select-value{font-size:13px;line-height:1.7}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .left-icon[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .mat-select-placeholder:before, .form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] mat-select-trigger[_ngcontent-%COMP%]:before{content:"filter_list";font-family:Material Icons;font-weight:400;font-style:normal;font-size:13px;margin-right:10px;position:relative;top:1px}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .mat-select-placeholder{color:rgba(30,34,39,.5)!important}.form-field[_ngcontent-%COMP%] mat-select[_ngcontent-%COMP%] .filter[_ngcontent-%COMP%]{font-size:13px;margin-left:28px;color:rgba(30,34,39,.5)}.form-field[_ngcontent-%COMP%] .x-button[_ngcontent-%COMP%]{width:24px;height:24px;margin-top:10px}.bottom-line[_ngcontent-%COMP%]{border-bottom:2px solid rgba(30,34,39,.05)}.paper[_ngcontent-%COMP%]{padding:0}.-transaction[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid rgba(30,34,39,.05);cursor:pointer;display:flex;padding:20px 12px}.-transaction[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0 8px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%]{margin-top:5px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-transaction[_ngcontent-%COMP%] .-icon.-pending[_ngcontent-%COMP%]{opacity:.5}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{flex:1}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:1.15;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:11px;line-height:1.2;padding-left:5px;font-weight:300}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-pending[_ngcontent-%COMP%]{color:#ffc125}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] app-qr-code-button[_ngcontent-%COMP%]{vertical-align:middle;margin-right:4px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:13px;line-height:1.15}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] .note[_ngcontent-%COMP%]{color:#1e2227;word-break:break-word}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%]{width:200px;text-align:right;font-size:13px;line-height:1.15}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-weight:700;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;margin:0}.-transaction[_ngcontent-%COMP%]:hover{background-color:#f7f7f7}.view-all-button[_ngcontent-%COMP%]{color:#0072ff;font-size:13px;text-align:center;padding:20px;cursor:pointer}']}),e}(),DN=["formControl"];function ON(e,t){if(1&e){var n=Ms();vs(0,"div",12),ru(1,"\n "),vs(2,"span",13),xs("click",function(){return on(n),Ys().useHardwareWallet()}),ru(3),Wl(4,"translate"),_s(),ru(5,"\n "),_s()}2&e&&(Ya(3),au(Vl(4,1,"wizard.hardware-wallet-link")))}var EN=function(e){return{coinName:e}},YN=function(){function e(e,t,n,i,r){var a=this;this.appService=e,this.dialog=t,this.router=n,this.fill=null,this.onLabelAndSeedCreated=new Zl,this.currentFormSelection=NP.LeftButton,this.hwCompatibilityActivated=!1,this.doubleButtonActive=NP,this.synchronized=!0,this.hwCompatibilityActivated=i.hwWalletCompatibilityActivated,this.blockchainSubscription=r.progress.subscribe(function(e){return a.synchronized=e.synchronized})}return e.prototype.ngOnInit=function(){var e=this;setTimeout(function(){e.formControl.initForm(null,e.fill)}),this.fill&&(this.currentFormSelection=this.fill.creatingNewWallet?NP.LeftButton:NP.RightButton)},e.prototype.ngOnDestroy=function(){this.blockchainSubscription.unsubscribe(),this.onLabelAndSeedCreated.complete()},e.prototype.changeForm=function(e){this.currentFormSelection=e,this.fill=null,this.formControl.initForm(this.currentFormSelection===NP.LeftButton,this.fill)},e.prototype.createWallet=function(){var e=this;vO.openDialog(this.dialog,{headerText:"wizard.confirm.title",redTitle:!0,text:"wizard.confirm.desc",checkboxText:"wizard.confirm.checkbox",confirmButtonText:"common.continue-button"}).afterClosed().subscribe(function(t){t&&e.emitCreatedData()})},e.prototype.loadWallet=function(){var e=this;this.synchronized?this.emitCreatedData():vO.openDialog(this.dialog,{headerText:"common.warning-title",text:"wallet.new.synchronizing-warning-text",defaultButtons:gO.ContinueCancel,redTitle:!0}).afterClosed().subscribe(function(t){t&&e.emitCreatedData()})},e.prototype.useHardwareWallet=function(){var e=this;JY.openDialog(this.dialog,!0).afterClosed().subscribe(function(t){t&&e.router.navigate(["/wallets"])})},e.prototype.emitCreatedData=function(){this.onLabelAndSeedCreated.emit(this.formControl.getData())},e.\u0275fac=function(t){return new(t||e)(ps(jS),ps(Pk),ps(MD),ps(gC),ps(yO))},e.\u0275cmp=ft({type:e,selectors:[["app-onboarding-create-wallet"]],viewQuery:function(e,t){var n;1&e&&lc(DN,5),2&e&&uc(n=dc())&&(t.formControl=n.first)},inputs:{fill:"fill"},outputs:{onLabelAndSeedCreated:"onLabelAndSeedCreated"},decls:56,vars:23,consts:[[1,"onboarding-container"],[1,"row"],[1,"row-container"],[1,"-header"],[1,"-description"],[1,"row-container","-toggle-container"],[3,"leftButtonText","rightButtonText","activeButton","onStateChange"],[3,"create","onboarding"],["formControl",""],["class","row justify-content-center",4,"ngIf"],[1,"row","-buttons-footer"],[1,"dark-button","-button-min-margin",3,"disabled","action"],[1,"row","justify-content-center"],[1,"hw-link",3,"click"]],template:function(e,t){if(1&e&&(vs(0,"div",0),ru(1,"\n "),ru(2,"\n "),vs(3,"div",1),ru(4,"\n "),vs(5,"div",2),ru(6,"\n "),vs(7,"div",3),ru(8,"\n "),vs(9,"span"),ru(10),Wl(11,"translate"),_s(),ru(12,"\n "),_s(),ru(13,"\n "),vs(14,"div",4),ru(15,"\n "),vs(16,"p"),ru(17),Wl(18,"translate"),_s(),ru(19,"\n "),_s(),ru(20,"\n "),_s(),ru(21,"\n "),_s(),ru(22,"\n "),ru(23,"\n "),vs(24,"div",1),ru(25,"\n "),vs(26,"div",5),ru(27,"\n "),vs(28,"app-double-button",6),xs("onStateChange",function(e){return t.changeForm(e)}),Wl(29,"translate"),Wl(30,"translate"),_s(),ru(31,"\n "),_s(),ru(32,"\n "),_s(),ru(33,"\n "),ru(34,"\n "),vs(35,"div",1),ru(36,"\n "),vs(37,"div",2),ru(38,"\n "),ys(39,"app-create-wallet-form",7,8),ru(41,"\n "),_s(),ru(42,"\n "),_s(),ru(43,"\n "),ru(44,"\n "),hs(45,ON,6,3,"div",9),ru(46,"\n "),ru(47,"\n "),vs(48,"div",10),ru(49,"\n "),vs(50,"app-button",11),xs("action",function(){return t.currentFormSelection===t.doubleButtonActive.LeftButton?t.createWallet():t.loadWallet()}),ru(51),Wl(52,"translate"),_s(),ru(53,"\n "),_s(),ru(54,"\n"),_s(),ru(55,"\n")),2&e){var n=fs(40);Ya(10),au(Vl(11,10,"wizard.create-title")),Ya(7),au(Ul(18,12,"wizard.create-desc",Il(21,EN,t.appService.fullCoinName))),Ya(11),ms("leftButtonText",Vl(29,15,"wizard.new-button"))("rightButtonText",Vl(30,17,"wizard.load-button"))("activeButton",t.currentFormSelection),Ya(11),ms("create",t.currentFormSelection===t.doubleButtonActive.LeftButton)("onboarding",!0),Ya(6),ms("ngIf",t.hwCompatibilityActivated),Ya(5),ms("disabled",!n.isValid),Ya(1),ou("\n ",Vl(52,19,"common.create-button"),"\n ")}},directives:[BP,_E,lh,ZC],pipes:[hM],styles:[".-toggle-container[_ngcontent-%COMP%]{margin:10px auto}.hw-link[_ngcontent-%COMP%]{cursor:pointer;color:#fafafa;font-size:13px;margin-bottom:20px}"]}),e}(),PN=["button"],AN=function(e){return{"element-disabled":e}};function IN(e,t){if(1&e){var n=Ms();vs(0,"div",1),ru(1,"\n "),vs(2,"div",10),ru(3,"\n "),vs(4,"mat-checkbox",11),xs("change",function(e){return on(n),Ys().setEncrypt(e)}),ru(5,"\n "),vs(6,"span",12),ru(7,"\n "),ys(8,"img",13),ru(9),Wl(10,"translate"),_s(),ru(11,"\n "),_s(),ru(12,"\n "),_s(),ru(13,"\n "),_s()}if(2&e){var i=Ys();Ya(4),ms("checked",!0)("ngClass",Il(5,AN,i.isWorking)),Ya(5),ou("\n ",Vl(10,3,"wallet.new.encrypt-check"),"\n ")}}function RN(e,t){if(1&e){var n=Ms();vs(0,"div",1),ru(1,"\n "),vs(2,"div",2),ru(3,"\n "),vs(4,"form",14),ru(5,"\n "),vs(6,"div",15),ru(7,"\n "),vs(8,"label",16),ru(9),Wl(10,"translate"),_s(),ru(11,"\n "),vs(12,"input",17),xs("blur",function(){return on(n),Ys().validateForm()}),_s(),ru(13,"\n "),_s(),ru(14,"\n "),vs(15,"div",15),ru(16,"\n "),vs(17,"label",18),ru(18),Wl(19,"translate"),_s(),ru(20,"\n "),vs(21,"input",19),xs("keydown.enter",function(){return on(n),Ys().emitCreatedPassword()})("blur",function(){return on(n),Ys().validateForm()}),_s(),ru(22,"\n "),_s(),ru(23,"\n "),_s(),ru(24,"\n "),_s(),ru(25,"\n "),_s()}if(2&e){var i=Ys();Ya(4),ms("formGroup",i.form),Ya(5),au(Vl(10,9,"password.password-label")),Ya(3),ms("ngClass",Il(13,AN,i.form.disabled))("appFormFieldError",i.password1ErrorMsg),ls("disabled",i.isWorking?"true":null),Ya(6),au(Vl(19,11,"password.confirm-password-label")),Ya(3),ms("ngClass",Il(15,AN,i.form.disabled))("appFormFieldError",i.password2ErrorMsg),ls("disabled",i.isWorking?"true":null)}}var FN=function(e){return{"d-none":e}},HN=function(){function e(e,t){this.formBuilder=e,this.changeDetector=t,this.onPasswordCreated=new Zl,this.onBack=new Zl,this.creatingTemporal_=!1,this.password1ErrorMsg="",this.password2ErrorMsg=""}return Object.defineProperty(e.prototype,"creatingTemporal",{get:function(){return this.creatingTemporal_},set:function(e){var t=this;this.creatingTemporal_=e,setTimeout(function(){t.form&&t.form.updateValueAndValidity()})},enumerable:!1,configurable:!0}),e.prototype.ngOnInit=function(){this.form=this.formBuilder.group({password:new Lp(""),confirm:new Lp("")}),this.form.setValidators(this.validateForm.bind(this))},e.prototype.ngOnDestroy=function(){this.onPasswordCreated.complete(),this.onBack.complete()},e.prototype.setEncrypt=function(e){e.checked?this.form.enable():this.form.disable()},e.prototype.emitCreatedPassword=function(){!this.creatingTemporal&&this.form.enabled&&!this.form.valid||this.button.isLoading()||(this.button.setLoading(),this.onPasswordCreated.emit(!this.creatingTemporal&&this.form.enabled?this.form.get("password").value:null),this.changeDetector.detectChanges())},e.prototype.emitBack=function(){this.onBack.emit()},e.prototype.resetButton=function(){this.button.resetState()},Object.defineProperty(e.prototype,"isWorking",{get:function(){return!!this.button&&this.button.isLoading()},enumerable:!1,configurable:!0}),e.prototype.validateForm=function(){this.password1ErrorMsg="",this.password2ErrorMsg="";var e=!0;return this.form.get("password").value||(e=!1,this.form.get("password").touched&&(this.password1ErrorMsg="password.password-error-info")),this.form.get("confirm").value||(e=!1,this.form.get("confirm").touched&&(this.password2ErrorMsg="password.password-error-info")),e&&this.form.get("password").value!==this.form.get("confirm").value&&(e=!1,this.password2ErrorMsg="password.confirm-error-info"),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ps(fm),ps(ll))},e.\u0275cmp=ft({type:e,selectors:[["app-onboarding-encrypt-wallet"]],viewQuery:function(e,t){var n;1&e&&lc(PN,5),2&e&&uc(n=dc())&&(t.button=n.first)},inputs:{creatingTemporal:"creatingTemporal"},outputs:{onPasswordCreated:"onPasswordCreated",onBack:"onBack"},decls:43,vars:18,consts:[[1,"onboarding-container"],[1,"row"],[1,"row-container"],[1,"-header"],[1,"-description"],["class","row",4,"ngIf"],[1,"row","-buttons-footer"],[1,"dark-button","-button-min-margin",3,"disabled","action"],["button",""],[1,"ghost-button","-button-min-margin",3,"ngClass","action"],[1,"row-container","-check-container"],["type","checkbox","id","encrypt",1,"-check",3,"checked","ngClass","change"],[1,"img-label-container"],["src","assets/img/lock-gold.png"],[3,"formGroup"],[1,"form-field"],["for","password"],["type","password","appDontSavePassword","","formControlName","password","id","password",1,"-input",3,"ngClass","appFormFieldError","blur"],["for","confirm"],["type","password","appDontSavePassword","","formControlName","confirm","id","confirm",1,"-input",3,"ngClass","appFormFieldError","keydown.enter","blur"]],template:function(e,t){1&e&&(vs(0,"div",0),ru(1,"\n "),ru(2,"\n "),vs(3,"div",1),ru(4,"\n "),vs(5,"div",2),ru(6,"\n "),vs(7,"div",3),ru(8,"\n "),vs(9,"span"),ru(10),Wl(11,"translate"),_s(),ru(12,"\n "),_s(),ru(13,"\n "),vs(14,"div",4),ru(15,"\n "),vs(16,"p"),ru(17),Wl(18,"translate"),_s(),ru(19,"\n "),_s(),ru(20,"\n "),_s(),ru(21,"\n "),_s(),ru(22,"\n "),ru(23,"\n "),hs(24,IN,14,7,"div",5),ru(25,"\n "),ru(26,"\n "),hs(27,RN,26,17,"div",5),ru(28,"\n "),ru(29,"\n "),vs(30,"div",6),ru(31,"\n "),vs(32,"app-button",7,8),xs("action",function(){return t.emitCreatedPassword()}),ru(34),Wl(35,"translate"),_s(),ru(36,"\n "),vs(37,"app-button",9),xs("action",function(){return t.emitBack()}),ru(38),Wl(39,"translate"),_s(),ru(40,"\n "),_s(),ru(41,"\n"),_s(),ru(42,"\n")),2&e&&(Ya(10),au(Vl(11,8,t.creatingTemporal?"wizard.finish-temporal-title":"wizard.encrypt-title")),Ya(7),au(Vl(18,10,t.creatingTemporal?"wizard.finish-temporal-desc":"wizard.encrypt-desc")),Ya(7),ms("ngIf",!t.creatingTemporal),Ya(3),ms("ngIf",!t.creatingTemporal),Ya(5),ms("disabled",!t.creatingTemporal&&(!t.form||t.form.enabled&&!t.form.valid)),Ya(2),ou("\n ",Vl(35,12,"wizard.finish-button"),"\n "),Ya(3),ms("ngClass",Il(16,FN,t.isWorking)),Ya(1),ou("\n ",Vl(39,14,"common.back-button"),"\n "))},directives:[lh,ZC,ah,lO,Pp,ap,jp,Lf,FO,rp,qp,RO],pipes:[hM],styles:[".-check-container[_ngcontent-%COMP%]{margin:10px auto}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{stroke:#fafafa!important}"]}),e}(),jN=["encryptForm"];function NN(e,t){if(1&e){var n=Ms();vs(0,"button",3),xs("click",function(){return on(n),Ys().changelanguage()}),ru(1,"\n "),ys(2,"img",4),ru(3,"\n"),_s()}if(2&e){var i=Ys();Ya(2),ms("src","assets/img/lang/"+i.language.iconName,Pr)}}function BN(e,t){if(1&e){var n=Ms();vs(0,"app-onboarding-create-wallet",5),xs("onLabelAndSeedCreated",function(e){return on(n),Ys().onLabelAndSeedCreated(e)}),_s()}2&e&&ms("fill",Ys().formData)}function WN(e,t){if(1&e){var n=Ms();vs(0,"app-onboarding-encrypt-wallet",6,7),xs("onPasswordCreated",function(e){return on(n),Ys().onPasswordCreated(e)})("onBack",function(){return on(n),Ys().onBack()}),_s()}2&e&&ms("creatingTemporal",Ys().formData.loadTemporarily)}var VN=["resetButton"],UN=function(e){return{"element-disabled":e}},zN=[{path:"",redirectTo:"wallets",pathMatch:"full"},{path:"wallets",component:sP,canActivate:[TR]},{path:"send",component:dj,canActivate:[TR]},{path:"transactions",component:TN,canActivate:[TR]},{path:"buy",component:Zj,canActivate:[TR]},{path:"settings",children:[{path:"backup",component:Ij},{path:"blockchain",component:Lj},{path:"network",component:Wj},{path:"outputs",component:wj},{path:"pending-transactions",component:mj}],canActivate:[TR]},{path:"wizard",component:function(){function e(e,t,n,i,r){this.router=e,this.languageService=t,this.dialog=n,this.msgBarService=i,this.walletsAndAddressesService=r,this.step=1}return e.prototype.ngOnInit=function(){var e=this;this.subscription=this.languageService.currentLanguage.subscribe(function(t){return e.language=t})},e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},e.prototype.onLabelAndSeedCreated=function(e){this.formData=e,this.step=2},e.prototype.onPasswordCreated=function(e){var t=this;this.walletsAndAddressesService.createSoftwareWallet(this.formData.loadTemporarily,this.formData.label,this.formData.seed,e).subscribe(function(){t.router.navigate(["/wallets"])},function(e){t.msgBarService.showError(e),t.encryptForm.resetButton()})},e.prototype.onBack=function(){this.step=1},e.prototype.changelanguage=function(){SL.openDialog(this.dialog)},e.\u0275fac=function(t){return new(t||e)(ps(MD),ps(kL),ps(Pk),ps(dL),ps(AL))},e.\u0275cmp=ft({type:e,selectors:[["app-onboarding"]],viewQuery:function(e,t){var n;1&e&&lc(jN,5),2&e&&uc(n=dc())&&(t.encryptForm=n.first)},decls:9,vars:3,consts:[["mat-icon-button","",3,"click",4,"ngIf"],[3,"fill","onLabelAndSeedCreated",4,"ngIf"],[3,"creatingTemporal","onPasswordCreated","onBack",4,"ngIf"],["mat-icon-button","",3,"click"],[1,"flag",3,"src"],[3,"fill","onLabelAndSeedCreated"],[3,"creatingTemporal","onPasswordCreated","onBack"],["encryptForm",""]],template:function(e,t){1&e&&(ru(0,"\n"),hs(1,NN,4,1,"button",0),ru(2,"\n\n"),ru(3,"\n"),hs(4,BN,1,1,"app-onboarding-create-wallet",1),ru(5,"\n\n"),ru(6,"\n"),hs(7,WN,2,1,"app-onboarding-encrypt-wallet",2),ru(8,"\n")),2&e&&(Ya(1),ms("ngIf",t.language),Ya(3),ms("ngIf",1===t.step),Ya(3),ms("ngIf",2===t.step))},directives:[lh,SC,YN,HN],styles:["button[_ngcontent-%COMP%]{position:fixed;right:30px;top:20px;background-color:#fafafa!important}button[_ngcontent-%COMP%]:hover{background-color:#f7f7f7!important}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:-3px}"]}),e}()},{path:"reset/:id",component:function(){function e(e,t,n,i,r,a,o){var s=this;this.formBuilder=e,this.route=t,this.router=n,this.msgBarService=i,this.softwareWalletService=r,this.walletsAndAddressesService=a,this.changeDetector=o,this.busy=!0,this.seedErrorMsg="",this.passwordErrorMsg="",this.done=!1,this.hideBarWhenClosing=!0,this.initForm(),this.subscription=jL([this.route.params,this.walletsAndAddressesService.allWallets]).pipe(K(function(e){var t=e[0],n=e[1].find(function(e){return e.id===t.id});n&&!n.temporal?(s.wallet=n,s.form.get("wallet").setValue(n.label),s.busy=!1):setTimeout(function(){return s.router.navigate([""],{skipLocationChange:!0})})})).subscribe()}return e.prototype.ngOnDestroy=function(){this.subscription.unsubscribe(),this.hideBarWhenClosing&&this.msgBarService.hide()},e.prototype.initForm=function(){this.form=new xp({}),this.form.addControl("wallet",new Lp),this.form.addControl("seed",new Lp("")),this.form.addControl("password",new Lp("")),this.form.addControl("confirm",new Lp("")),this.form.setValidators(this.validateForm.bind(this))},e.prototype.reset=function(){var e=this;!this.form.valid||this.busy||this.done||(this.busy=!0,this.msgBarService.hide(),this.resetButton.setLoading(),this.softwareWalletService.resetPassword(this.wallet,this.form.value.seed,""!==this.form.value.password?this.form.value.password:null).subscribe(function(){e.resetButton.setSuccess(),e.resetButton.setDisabled(),e.done=!0,e.msgBarService.showDone("reset.done"),e.hideBarWhenClosing=!1,setTimeout(function(){e.router.navigate([""])},2e3)},function(t){e.busy=!1,e.resetButton.resetState(),e.msgBarService.showError(t)}),this.changeDetector.detectChanges())},e.prototype.validateForm=function(){this.seedErrorMsg="",this.passwordErrorMsg="";var e=!0;return this.form.get("seed").value||(e=!1,this.form.get("seed").touched&&(this.seedErrorMsg="reset.seed-error-info")),this.form.get("password").value!==this.form.get("confirm").value&&(e=!1,this.form.get("confirm").touched&&(this.passwordErrorMsg="reset.confirm-error-info")),e?null:{Invalid:!0}},e.\u0275fac=function(t){return new(t||e)(ps(fm),ps(Jx),ps(MD),ps(dL),ps(OE),ps(AL),ps(ll))},e.\u0275cmp=ft({type:e,selectors:[["app-reset-password"]],viewQuery:function(e,t){var n;1&e&&lc(VN,5),2&e&&uc(n=dc())&&(t.resetButton=n.first)},decls:62,vars:28,consts:[[3,"headline"],[1,"container"],[1,"paper"],[3,"formGroup"],[1,"form-field"],["for","wallet"],[1,"-not-allowed"],["formControlName","wallet","id","wallet","readonly","",3,"ngClass"],["for","seed"],["formControlName","seed","id","seed","row","2",3,"appFormFieldError","blur"],["for","password"],["formControlName","password","id","password","type","password","appDontSavePassword",""],["for","confirm"],["formControlName","confirm","id","confirm","type","password","appDontSavePassword","",3,"appFormFieldError","keydown.enter","blur"],[1,"text-center"],[1,"primary-button",3,"disabled","action"],["resetButton",""],[1,"final-element"]],template:function(e,t){1&e&&(ys(0,"app-header",0),Wl(1,"translate"),ru(2,"\n"),vs(3,"div",1),ru(4,"\n "),vs(5,"div",2),ru(6,"\n "),vs(7,"div",3),ru(8,"\n "),ru(9,"\n "),vs(10,"div",4),ru(11,"\n "),vs(12,"label",5),ru(13),Wl(14,"translate"),_s(),ru(15,"\n "),vs(16,"div",6),ys(17,"input",7),_s(),ru(18,"\n "),_s(),ru(19,"\n "),vs(20,"div",4),ru(21,"\n "),vs(22,"label",8),ru(23),Wl(24,"translate"),_s(),ru(25,"\n "),vs(26,"textarea",9),xs("blur",function(){return t.validateForm()}),_s(),ru(27,"\n "),_s(),ru(28,"\n "),vs(29,"div",4),ru(30,"\n "),vs(31,"label",10),ru(32),Wl(33,"translate"),_s(),ru(34,"\n "),ys(35,"input",11),ru(36,"\n "),_s(),ru(37,"\n "),vs(38,"div",4),ru(39,"\n "),vs(40,"label",12),ru(41),Wl(42,"translate"),_s(),ru(43,"\n "),vs(44,"input",13),xs("keydown.enter",function(){return t.reset()})("blur",function(){return t.validateForm()}),_s(),ru(45,"\n "),_s(),ru(46,"\n "),ru(47,"\n "),vs(48,"div",14),ru(49,"\n "),vs(50,"app-button",15,16),xs("action",function(){return t.reset()}),ru(52),Wl(53,"translate"),_s(),ru(54,"\n "),_s(),ru(55,"\n "),_s(),ru(56,"\n "),_s(),ru(57,"\n "),ru(58,"\n "),ys(59,"div",17),ru(60,"\n"),_s(),ru(61,"\n")),2&e&&(ms("headline",Vl(1,14,"reset.title")),Ya(7),ms("formGroup",t.form),Ya(6),au(Vl(14,16,"reset.wallet-label")),Ya(4),ms("ngClass",Il(26,UN,t.busy)),Ya(6),au(Vl(24,18,"reset.seed-label")),Ya(3),ms("appFormFieldError",t.seedErrorMsg),ls("disabled",t.busy?"true":null),Ya(6),au(Vl(33,20,"reset.password-label")),Ya(3),ls("disabled",t.busy?"true":null),Ya(6),au(Vl(42,22,"reset.confirm-label")),Ya(3),ms("appFormFieldError",t.passwordErrorMsg),ls("disabled",t.busy?"true":null),Ya(6),ms("disabled",!t.form.valid),Ya(2),ou("\n ",Vl(53,24,"reset.reset-button"),"\n "))},directives:[_A,ap,jp,Lf,rp,qp,ah,RO,FO,ZC],pipes:[hM],styles:[""]}),e}()}],qN=function(){function e(){}return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[BD.forRoot(zN,{useHash:!0})],BD]}),e}(),GN=function(){function e(){}return e.prototype.getTranslation=function(e){return re(n(16297)("./"+e+".json"))},e}(),KN=function(){function e(){}return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=Re({imports:[[fM.forRoot({loader:{provide:Zk,useClass:GN}})],fM]}),e}(),JN=function(){function e(){}return e.\u0275fac=function(t){return new(t||e)},e.\u0275mod=_t({type:e,bootstrap:[XD]}),e.\u0275inj=Re({providers:[HS,jS,yO,UF,WP,lP,dP,cP,TR,gC,nL,pC,uC,fC,kL,bL,dL,Mh,AL,OE,YE,_O,bF,FA,{provide:wM,useValue:{_forceAnimations:!0}}],imports:[[KN,qN,mf,RS,CC,mI,Ik,vI,_I,VC,OI,YI,OP,QP,SM,eR,tR,nR,IO,dO,xR,vR,Ew,dm]]}),e}();pt(sP,[_A,sh,lh,YO,ah,pI,SC],[hM,zF,NS]),pt(VF,[lh,BP,ah,ap,jp,QR,yH,WC,YO,jO,Lf,rp,qp,RO,lm,vh,lO,ZC,MR],[hM,NS,Mh]),pt(_L,[jk,lh,oC,ap,jp,DI,Lf,gR,rp,qp,RO,dR,sh,mk,ZC],[hM,kh]),function(){if(Jc)throw new Error("Cannot enable prod mode after platform setup.");Kc=!1}(),ff().bootstrapModule(JN,{preserveWhitespaces:!0})},46700:function(e,t,n){var i={"./af":90776,"./af.js":90776,"./ar":67634,"./ar-dz":42758,"./ar-dz.js":42758,"./ar-kw":64980,"./ar-kw.js":64980,"./ar-ly":9602,"./ar-ly.js":9602,"./ar-ma":52500,"./ar-ma.js":52500,"./ar-sa":36909,"./ar-sa.js":36909,"./ar-tn":92735,"./ar-tn.js":92735,"./ar.js":67634,"./az":27798,"./az.js":27798,"./be":29949,"./be.js":29949,"./bg":44590,"./bg.js":44590,"./bm":15938,"./bm.js":15938,"./bn":60595,"./bn-bd":51942,"./bn-bd.js":51942,"./bn.js":60595,"./bo":4756,"./bo.js":4756,"./br":17277,"./br.js":17277,"./bs":4166,"./bs.js":4166,"./ca":13943,"./ca.js":13943,"./cs":53474,"./cs.js":53474,"./cv":92218,"./cv.js":92218,"./cy":21061,"./cy.js":21061,"./da":82743,"./da.js":82743,"./de":31899,"./de-at":28580,"./de-at.js":28580,"./de-ch":3264,"./de-ch.js":3264,"./de.js":31899,"./dv":98784,"./dv.js":98784,"./el":54654,"./el.js":54654,"./en-au":56277,"./en-au.js":56277,"./en-ca":76896,"./en-ca.js":76896,"./en-gb":71609,"./en-gb.js":71609,"./en-ie":24557,"./en-ie.js":24557,"./en-il":15836,"./en-il.js":15836,"./en-in":30262,"./en-in.js":30262,"./en-nz":43586,"./en-nz.js":43586,"./en-sg":38965,"./en-sg.js":38965,"./eo":62777,"./eo.js":62777,"./es":63357,"./es-do":3128,"./es-do.js":3128,"./es-mx":69179,"./es-mx.js":69179,"./es-us":83256,"./es-us.js":83256,"./es.js":63357,"./et":2654,"./et.js":2654,"./eu":57287,"./eu.js":57287,"./fa":73875,"./fa.js":73875,"./fi":73431,"./fi.js":73431,"./fil":39606,"./fil.js":39606,"./fo":41781,"./fo.js":41781,"./fr":61717,"./fr-ca":11539,"./fr-ca.js":11539,"./fr-ch":19847,"./fr-ch.js":19847,"./fr.js":61717,"./fy":42250,"./fy.js":42250,"./ga":47665,"./ga.js":47665,"./gd":85214,"./gd.js":85214,"./gl":36154,"./gl.js":36154,"./gom-deva":68222,"./gom-deva.js":68222,"./gom-latn":18518,"./gom-latn.js":18518,"./gu":89221,"./gu.js":89221,"./he":64743,"./he.js":64743,"./hi":77339,"./hi.js":77339,"./hr":13224,"./hr.js":13224,"./hu":50856,"./hu.js":50856,"./hy-am":76855,"./hy-am.js":76855,"./id":2190,"./id.js":2190,"./is":53887,"./is.js":53887,"./it":19270,"./it-ch":85890,"./it-ch.js":85890,"./it.js":19270,"./ja":46595,"./ja.js":46595,"./jv":93081,"./jv.js":93081,"./ka":27477,"./ka.js":27477,"./kk":13978,"./kk.js":13978,"./km":19205,"./km.js":19205,"./kn":60025,"./kn.js":60025,"./ko":50427,"./ko.js":50427,"./ku":79089,"./ku.js":79089,"./ky":19314,"./ky.js":19314,"./lb":23136,"./lb.js":23136,"./lo":29115,"./lo.js":29115,"./lt":27087,"./lt.js":27087,"./lv":95683,"./lv.js":95683,"./me":79454,"./me.js":79454,"./mi":35507,"./mi.js":35507,"./mk":98466,"./mk.js":98466,"./ml":82933,"./ml.js":82933,"./mn":19477,"./mn.js":19477,"./mr":43597,"./mr.js":43597,"./ms":85529,"./ms-my":99965,"./ms-my.js":99965,"./ms.js":85529,"./mt":30259,"./mt.js":30259,"./my":88061,"./my.js":88061,"./nb":72618,"./nb.js":72618,"./ne":28452,"./ne.js":28452,"./nl":1885,"./nl-be":60413,"./nl-be.js":60413,"./nl.js":1885,"./nn":45107,"./nn.js":45107,"./oc-lnc":71763,"./oc-lnc.js":71763,"./pa-in":702,"./pa-in.js":702,"./pl":31711,"./pl.js":31711,"./pt":10594,"./pt-br":58238,"./pt-br.js":58238,"./pt.js":10594,"./ro":74681,"./ro.js":74681,"./ru":16201,"./ru.js":16201,"./sd":62912,"./sd.js":62912,"./se":6002,"./se.js":6002,"./si":67942,"./si.js":67942,"./sk":25577,"./sk.js":25577,"./sl":41775,"./sl.js":41775,"./sq":36823,"./sq.js":36823,"./sr":59038,"./sr-cyrl":83848,"./sr-cyrl.js":83848,"./sr.js":59038,"./ss":96173,"./ss.js":96173,"./sv":5788,"./sv.js":5788,"./sw":76882,"./sw.js":76882,"./ta":82678,"./ta.js":82678,"./te":82797,"./te.js":82797,"./tet":52447,"./tet.js":52447,"./tg":31335,"./tg.js":31335,"./th":68667,"./th.js":68667,"./tk":9222,"./tk.js":9222,"./tl-ph":99914,"./tl-ph.js":99914,"./tlh":71389,"./tlh.js":71389,"./tr":3578,"./tr.js":3578,"./tzl":36969,"./tzl.js":36969,"./tzm":76509,"./tzm-latn":690,"./tzm-latn.js":690,"./tzm.js":76509,"./ug-cn":20055,"./ug-cn.js":20055,"./uk":22452,"./uk.js":22452,"./ur":91151,"./ur.js":91151,"./uz":31555,"./uz-latn":46547,"./uz-latn.js":46547,"./uz.js":31555,"./vi":16541,"./vi.js":16541,"./x-pseudo":42401,"./x-pseudo.js":42401,"./yo":2341,"./yo.js":2341,"./zh-cn":80619,"./zh-cn.js":80619,"./zh-hk":67058,"./zh-hk.js":67058,"./zh-mo":89141,"./zh-mo.js":89141,"./zh-tw":22782,"./zh-tw.js":22782};function r(e){var t=a(e);return n(t)}function a(e){if(!n.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}r.keys=function(){return Object.keys(i)},r.resolve=a,e.exports=r,r.id=46700},16297:function(e,t,n){var i={"./en.json":[32478,478],"./es.json":[79875,875],"./es_base.json":[61526,526],"./ru.json":[61813,813],"./zh.json":[12736,736],"./zh_base.json":[3118,118]};function r(e){if(!n.o(i,e))return Promise.resolve().then(function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=i[e],r=t[0];return n.e(t[1]).then(function(){return n.t(r,19)})}r.keys=function(){return Object.keys(i)},r.id=16297,e.exports=r},69769:function(e,t,n){var i={"./bip39-word-list.json":[74403,403],"./i18n/en.json":[32478,478],"./i18n/es.json":[79875,875],"./i18n/es_base.json":[61526,526],"./i18n/ru.json":[61813,813],"./i18n/zh.json":[12736,736],"./i18n/zh_base.json":[3118,118]};function r(e){if(!n.o(i,e))return Promise.resolve().then(function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=i[e],r=t[0];return n.e(t[1]).then(function(){return n.t(r,19)})}r.keys=function(){return Object.keys(i)},r.id=69769,e.exports=r}},function(e){"use strict";e(e.s=58819)}]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills-es5.2dce468a73eba67421f8.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills-es5.2dce468a73eba67421f8.js new file mode 100644 index 0000000000..a7a71ddd17 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills-es5.2dce468a73eba67421f8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{"+5Eg":function(t,e,n){var r=n("wA6s"),o=n("6XUM"),i=n("M7Xk").onFreeze,a=n("cZY6"),c=n("rG8t"),u=Object.seal;r({target:"Object",stat:!0,forced:c(function(){u(1)}),sham:!a},{seal:function(t){return u&&o(t)?u(i(t)):t}})},"+IJR":function(t,e,n){n("wA6s")({target:"Number",stat:!0},{isNaN:function(t){return t!=t}})},"+lvF":function(t,e,n){t.exports=n("VTer")("native-function-to-string",Function.toString)},"+rLv":function(t,e,n){var r=n("dyZX").document;t.exports=r&&r.documentElement},"/AsP":function(t,e,n){var r=n("yIiL"),o=n("SDMg"),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},"/Ybd":function(t,e,n){var r=n("T69T"),o=n("XdSI"),i=n("F26l"),a=n("LdO1"),c=Object.defineProperty;e.f=r?c:function(t,e,n){if(i(t),e=a(e,!0),i(n),o)try{return c(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},"0/R4":function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},"0Ds2":function(t,e,n){var r=n("m41k")("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,"/./"[t](e)}catch(o){}}return!1}},"0TWp":function(t,e,n){var r,o;void 0===(o="function"==typeof(r=function(){"use strict";!function(t){var e=t.performance;function n(t){e&&e.mark&&e.mark(t)}function r(t,n){e&&e.measure&&e.measure(t,n)}n("Zone");var o=t.__Zone_symbol_prefix||"__zone_symbol__";function i(t){return o+t}var a=!0===t[i("forceDuplicateZoneCheck")];if(t.Zone){if(a||"function"!=typeof t.Zone.__symbol__)throw new Error("Zone already loaded.");return t.Zone}var c=function(){function e(t,e){this._parent=t,this._name=e?e.name||"unnamed":"",this._properties=e&&e.properties||{},this._zoneDelegate=new f(this,this._parent&&this._parent._zoneDelegate,e)}return e.assertZonePatched=function(){if(t.Promise!==A.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(e,"root",{get:function(){for(var t=e.current;t.parent;)t=t.parent;return t},enumerable:!0,configurable:!0}),Object.defineProperty(e,"current",{get:function(){return P.zone},enumerable:!0,configurable:!0}),Object.defineProperty(e,"currentTask",{get:function(){return I},enumerable:!0,configurable:!0}),e.__load_patch=function(o,i){if(A.hasOwnProperty(o)){if(a)throw Error("Already loaded patch: "+o)}else if(!t["__Zone_disable_"+o]){var c="Zone:"+o;n(c),A[o]=i(t,e,j),r(c,c)}},Object.defineProperty(e.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),e.prototype.get=function(t){var e=this.getZoneWith(t);if(e)return e._properties[t]},e.prototype.getZoneWith=function(t){for(var e=this;e;){if(e._properties.hasOwnProperty(t))return e;e=e._parent}return null},e.prototype.fork=function(t){if(!t)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,t)},e.prototype.wrap=function(t,e){if("function"!=typeof t)throw new Error("Expecting function got: "+t);var n=this._zoneDelegate.intercept(this,t,e),r=this;return function(){return r.runGuarded(n,this,arguments,e)}},e.prototype.run=function(t,e,n,r){P={parent:P,zone:this};try{return this._zoneDelegate.invoke(this,t,e,n,r)}finally{P=P.parent}},e.prototype.runGuarded=function(t,e,n,r){void 0===e&&(e=null),P={parent:P,zone:this};try{try{return this._zoneDelegate.invoke(this,t,e,n,r)}catch(o){if(this._zoneDelegate.handleError(this,o))throw o}}finally{P=P.parent}},e.prototype.runTask=function(t,e,n){if(t.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(t.zone||b).name+"; Execution: "+this.name+")");if(t.state!==w||t.type!==M&&t.type!==T){var r=t.state!=E;r&&t._transitionTo(E,x),t.runCount++;var o=I;I=t,P={parent:P,zone:this};try{t.type==T&&t.data&&!t.data.isPeriodic&&(t.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,t,e,n)}catch(i){if(this._zoneDelegate.handleError(this,i))throw i}}finally{t.state!==w&&t.state!==_&&(t.type==M||t.data&&t.data.isPeriodic?r&&t._transitionTo(x,E):(t.runCount=0,this._updateTaskCount(t,-1),r&&t._transitionTo(w,E,w))),P=P.parent,I=o}}},e.prototype.scheduleTask=function(t){if(t.zone&&t.zone!==this)for(var e=this;e;){if(e===t.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+t.zone.name);e=e.parent}t._transitionTo(k,w);var n=[];t._zoneDelegates=n,t._zone=this;try{t=this._zoneDelegate.scheduleTask(this,t)}catch(r){throw t._transitionTo(_,k,w),this._zoneDelegate.handleError(this,r),r}return t._zoneDelegates===n&&this._updateTaskCount(t,1),t.state==k&&t._transitionTo(x,k),t},e.prototype.scheduleMicroTask=function(t,e,n,r){return this.scheduleTask(new l(O,t,e,n,r,void 0))},e.prototype.scheduleMacroTask=function(t,e,n,r,o){return this.scheduleTask(new l(T,t,e,n,r,o))},e.prototype.scheduleEventTask=function(t,e,n,r,o){return this.scheduleTask(new l(M,t,e,n,r,o))},e.prototype.cancelTask=function(t){if(t.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(t.zone||b).name+"; Execution: "+this.name+")");t._transitionTo(S,x,E);try{this._zoneDelegate.cancelTask(this,t)}catch(e){throw t._transitionTo(_,S),this._zoneDelegate.handleError(this,e),e}return this._updateTaskCount(t,-1),t._transitionTo(w,S),t.runCount=0,t},e.prototype._updateTaskCount=function(t,e){var n=t._zoneDelegates;-1==e&&(t._zoneDelegates=null);for(var r=0;r0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:t})},t}(),l=function(){function e(n,r,o,i,a,c){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=n,this.source=r,this.data=i,this.scheduleFn=a,this.cancelFn=c,!o)throw new Error("callback is not defined");this.callback=o;var u=this;this.invoke=n===M&&i&&i.useG?e.invokeTask:function(){return e.invokeTask.call(t,u,this,arguments)}}return e.invokeTask=function(t,e,n){t||(t=this),C++;try{return t.runCount++,t.zone.runTask(t,e,n)}finally{1==C&&m(),C--}},Object.defineProperty(e.prototype,"zone",{get:function(){return this._zone},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"state",{get:function(){return this._state},enumerable:!0,configurable:!0}),e.prototype.cancelScheduleRequest=function(){this._transitionTo(w,k)},e.prototype._transitionTo=function(t,e,n){if(this._state!==e&&this._state!==n)throw new Error(this.type+" '"+this.source+"': can not transition to '"+t+"', expecting state '"+e+"'"+(n?" or '"+n+"'":"")+", was '"+this._state+"'.");this._state=t,t==w&&(this._zoneDelegates=null)},e.prototype.toString=function(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)},e.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}},e}(),p=i("setTimeout"),h=i("Promise"),v=i("then"),d=[],g=!1;function y(e){if(0===C&&0===d.length)if(u||t[h]&&(u=t[h].resolve(0)),u){var n=u[v];n||(n=u.then),n.call(u,m)}else t[p](m,0);e&&d.push(e)}function m(){if(!g){for(g=!0;d.length;){var t=d;d=[];for(var e=0;e=0;n--)"function"==typeof t[n]&&(t[n]=p(t[n],e+"_"+n));return t}function w(t){return!t||!1!==t.writable&&!("function"==typeof t.get&&void 0===t.set)}var k="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,x=!("nw"in y)&&void 0!==y.process&&"[object process]"==={}.toString.call(y.process),E=!x&&!k&&!(!d||!g.HTMLElement),S=void 0!==y.process&&"[object process]"==={}.toString.call(y.process)&&!k&&!(!d||!g.HTMLElement),_={},O=function(t){if(t=t||y.event){var e=_[t.type];e||(e=_[t.type]=v("ON_PROPERTY"+t.type));var n,r=this||t.target||y,o=r[e];return E&&r===g&&"error"===t.type?!0===(n=o&&o.call(this,t.message,t.filename,t.lineno,t.colno,t.error))&&t.preventDefault():null==(n=o&&o.apply(this,arguments))||n||t.preventDefault(),n}};function T(n,r,o){var i=t(n,r);if(!i&&o&&t(o,r)&&(i={enumerable:!0,configurable:!0}),i&&i.configurable){var a=v("on"+r+"patched");if(!n.hasOwnProperty(a)||!n[a]){delete i.writable,delete i.value;var c=i.get,u=i.set,s=r.substr(2),f=_[s];f||(f=_[s]=v("ON_PROPERTY"+s)),i.set=function(t){var e=this;e||n!==y||(e=y),e&&(e[f]&&e.removeEventListener(s,O),u&&u.apply(e,m),"function"==typeof t?(e[f]=t,e.addEventListener(s,O,!1)):e[f]=null)},i.get=function(){var t=this;if(t||n!==y||(t=y),!t)return null;var e=t[f];if(e)return e;if(c){var o=c&&c.call(this);if(o)return i.set.call(this,o),"function"==typeof t.removeAttribute&&t.removeAttribute(r),o}return null},e(n,r,i),n[a]=!0}}}function M(t,e,n){if(e)for(var r=0;r=0&&"function"==typeof r[i.cbIdx]?h(i.name,r[i.cbIdx],i,o):t.apply(e,r)}})}function C(t,e){t[v("OriginalDelegate")]=e}var R=!1,D=!1;function N(){try{var t=g.navigator.userAgent;if(-1!==t.indexOf("MSIE ")||-1!==t.indexOf("Trident/"))return!0}catch(e){}return!1}function F(){if(R)return D;R=!0;try{var t=g.navigator.userAgent;-1===t.indexOf("MSIE ")&&-1===t.indexOf("Trident/")&&-1===t.indexOf("Edge/")||(D=!0)}catch(e){}return D}Zone.__load_patch("toString",function(t){var e=Function.prototype.toString,n=v("OriginalDelegate"),r=v("Promise"),o=v("Error"),i=function(){if("function"==typeof this){var i=this[n];if(i)return"function"==typeof i?e.call(i):Object.prototype.toString.call(i);if(this===Promise){var a=t[r];if(a)return e.call(a)}if(this===Error){var c=t[o];if(c)return e.call(c)}}return e.call(this)};i[n]=e,Function.prototype.toString=i;var a=Object.prototype.toString;Object.prototype.toString=function(){return this instanceof Promise?"[object Promise]":a.call(this)}});var Z=!1;if("undefined"!=typeof window)try{var L=Object.defineProperty({},"passive",{get:function(){Z=!0}});window.addEventListener("test",L,L),window.removeEventListener("test",L,L)}catch(St){Z=!1}var G={useG:!0},z={},X={},q=new RegExp("^"+l+"(\\w+)(true|false)$"),U=v("propagationStopped");function Y(t,e){var n=(e?e(t):t)+f,r=(e?e(t):t)+s,o=l+n,i=l+r;z[t]={},z[t].false=o,z[t].true=i}function V(t,e,r){var o=r&&r.add||i,c=r&&r.rm||a,u=r&&r.listeners||"eventListeners",p=r&&r.rmAll||"removeAllListeners",h=v(o),d="."+o+":",g=function(t,e,n){if(!t.isRemoved){var r=t.callback;"object"==typeof r&&r.handleEvent&&(t.callback=function(t){return r.handleEvent(t)},t.originalDelegate=r),t.invoke(t,e,[n]);var o=t.options;o&&"object"==typeof o&&o.once&&e[c].call(e,n.type,t.originalDelegate?t.originalDelegate:t.callback,o)}},y=function(e){if(e=e||t.event){var n=this||e.target||t,r=n[z[e.type].false];if(r)if(1===r.length)g(r[0],n,e);else for(var o=r.slice(),i=0;i1?new i(e,n):new i(e),s=t.ObjectGetOwnPropertyDescriptor(u,"onmessage");return s&&!1===s.configurable?(a=t.ObjectCreate(u),c=u,[r,o,"send","close"].forEach(function(e){a[e]=function(){var n=t.ArraySlice.call(arguments);if(e===r||e===o){var i=n.length>0?n[0]:void 0;if(i){var c=Zone.__symbol__("ON_PROPERTY"+i);u[c]=a[c]}}return u[e].apply(u,n)}})):a=u,t.patchOnProperties(a,["close","error","message","open"],c),a};var a=e.WebSocket;for(var c in i)a[c]=i[c]}(t,e),Zone[t.symbol("patchEvents")]=!0}}Zone.__load_patch("util",function(n,c,u){u.patchOnProperties=M,u.patchMethod=P,u.bindArguments=b,u.patchMacroTask=I;var h=c.__symbol__("BLACK_LISTED_EVENTS"),v=c.__symbol__("UNPATCHED_EVENTS");n[v]&&(n[h]=n[v]),n[h]&&(c[h]=c[v]=n[h]),u.patchEventPrototype=H,u.patchEventTarget=V,u.isIEOrEdge=F,u.ObjectDefineProperty=e,u.ObjectGetOwnPropertyDescriptor=t,u.ObjectCreate=r,u.ArraySlice=o,u.patchClass=j,u.wrapWithCurrentZone=p,u.filterProperties=lt,u.attachOriginToPatched=C,u._redefineProperty=Object.defineProperty,u.patchCallbacks=K,u.getGlobalObjects=function(){return{globalSources:X,zoneSymbolEventNames:z,eventNames:ft,isBrowser:E,isMix:S,isNode:x,TRUE_STR:s,FALSE_STR:f,ZONE_SYMBOL_PREFIX:l,ADD_EVENT_LISTENER_STR:i,REMOVE_EVENT_LISTENER_STR:a}}}),function(t){t[("legacyPatch",(t.__Zone_symbol_prefix||"__zone_symbol__")+"legacyPatch")]=function(){var e=t.Zone;e.__load_patch("defineProperty",function(t,e,n){n._redefineProperty=dt,vt()}),e.__load_patch("registerElement",function(t,e,n){!function(t,e){var n=e.getGlobalObjects();(n.isBrowser||n.isMix)&&"registerElement"in t.document&&e.patchCallbacks(e,document,"Document","registerElement",["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"])}(t,n)}),e.__load_patch("EventTargetLegacy",function(t,e,n){bt(t,n),wt(n,t)})}}("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{});var kt=v("zoneTask");function xt(t,e,n,r){var o=null,i=null;n+=r;var a={};function c(e){var n=e.data;return n.args[0]=function(){try{e.invoke.apply(this,arguments)}finally{e.data&&e.data.isPeriodic||("number"==typeof n.handleId?delete a[n.handleId]:n.handleId&&(n.handleId[kt]=null))}},n.handleId=o.apply(t,n.args),e}function u(t){return i(t.data.handleId)}o=P(t,e+=r,function(n){return function(o,i){if("function"==typeof i[0]){var s=h(e,i[0],{isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?i[1]||0:void 0,args:i},c,u);if(!s)return s;var f=s.data.handleId;return"number"==typeof f?a[f]=s:f&&(f[kt]=s),f&&f.ref&&f.unref&&"function"==typeof f.ref&&"function"==typeof f.unref&&(s.ref=f.ref.bind(f),s.unref=f.unref.bind(f)),"number"==typeof f||f?f:s}return n.apply(t,i)}}),i=P(t,n,function(e){return function(n,r){var o,i=r[0];"number"==typeof i?o=a[i]:(o=i&&i[kt])||(o=i),o&&"string"==typeof o.type?"notScheduled"!==o.state&&(o.cancelFn&&o.data.isPeriodic||0===o.runCount)&&("number"==typeof i?delete a[i]:i&&(i[kt]=null),o.zone.cancelTask(o)):e.apply(t,r)}})}function Et(t,e){if(!Zone[e.symbol("patchEventTarget")]){for(var n=e.getGlobalObjects(),r=n.eventNames,o=n.zoneSymbolEventNames,i=n.TRUE_STR,a=n.FALSE_STR,c=n.ZONE_SYMBOL_PREFIX,u=0;u0){var o=t.invoke;t.invoke=function(){for(var n=a[e.__symbol__("loadfalse")],i=0;i"+t+"<\/script>"},h=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(o){}var t,e;h=r?function(t){t.write(p("")),t.close();var e=t.parentWindow.Object;return t=null,e}(r):((e=s("iframe")).style.display="none",u.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write(p("document.F=Object")),t.close(),t.F);for(var n=a.length;n--;)delete h.prototype[a[n]];return h()};c[f]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(l.prototype=o(t),n=new l,l.prototype=null,n[f]=t):n=h(),void 0===e?n:i(n,e)}},"3caY":function(t,e,n){var r=n("wA6s"),o=Math.asinh,i=Math.log,a=Math.sqrt;r({target:"Math",stat:!0,forced:!(o&&1/o(0)>0)},{asinh:function t(e){return isFinite(e=+e)&&0!=e?e<0?-t(-e):i(e+a(e*e+1)):e}})},"3vMK":function(t,e,n){"use strict";var r=n("6XUM"),o=n("/Ybd"),i=n("wIVT"),a=n("m41k")("hasInstance"),c=Function.prototype;a in c||o.f(c,a,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},"3xQm":function(t,e,n){var r,o,i,a,c,u,s,f,l=n("ocAm"),p=n("7gGY").f,h=n("ezU2"),v=n("Ox9q").set,d=n("tuHh"),g=l.MutationObserver||l.WebKitMutationObserver,y=l.process,m=l.Promise,b="process"==h(y),w=p(l,"queueMicrotask"),k=w&&w.value;k||(r=function(){var t,e;for(b&&(t=y.domain)&&t.exit();o;){e=o.fn,o=o.next;try{e()}catch(n){throw o?a():i=void 0,n}}i=void 0,t&&t.enter()},b?a=function(){y.nextTick(r)}:g&&!d?(c=!0,u=document.createTextNode(""),new g(r).observe(u,{characterData:!0}),a=function(){u.data=c=!c}):m&&m.resolve?(s=m.resolve(void 0),f=s.then,a=function(){f.call(s,r)}):a=function(){v.call(l,r)}),t.exports=k||function(t){var e={fn:t,next:void 0};i&&(i.next=e),o||(o=e,a()),i=e}},"3xty":function(t,e,n){var r=n("XKFU"),o=n("2OiF"),i=n("y3w9"),a=(n("dyZX").Reflect||{}).apply,c=Function.apply;r(r.S+r.F*!n("eeVq")(function(){a(function(){})}),"Reflect",{apply:function(t,e,n){var r=o(t),u=i(n);return a?a(r,e,u):c.call(r,e,u)}})},"48xZ":function(t,e,n){var r=n("n/2t"),o=Math.abs,i=Math.pow,a=i(2,-52),c=i(2,-23),u=i(2,127)*(2-c),s=i(2,-126);t.exports=Math.fround||function(t){var e,n,i=o(t),f=r(t);return iu||n!=n?f*(1/0):f*n}},"4GtL":function(t,e,n){"use strict";var r=n("VCQ8"),o=n("7Oj1"),i=n("xpLY"),a=Math.min;t.exports=[].copyWithin||function(t,e){var n=r(this),c=i(n.length),u=o(t,c),s=o(e,c),f=arguments.length>2?arguments[2]:void 0,l=a((void 0===f?c:o(f,c))-s,c-u),p=1;for(s0;)s in n?n[u]=n[s]:delete n[u],u+=p,s+=p;return n}},"4Kt7":function(t,e,n){"use strict";var r=n("wA6s"),o=n("uoca");r({target:"String",proto:!0,forced:n("d8Sw")("sub")},{sub:function(){return o(this,"sub","","")}})},"4NCC":function(t,e,n){var r=n("ocAm"),o=n("jnLS").trim,i=n("xFZC"),a=r.parseInt,c=/^[+-]?0[Xx]/,u=8!==a(i+"08")||22!==a(i+"0x16");t.exports=u?function(t,e){var n=o(String(t));return a(n,e>>>0||(c.test(n)?16:10))}:a},"4PyY":function(t,e,n){var r={};r[n("m41k")("toStringTag")]="z",t.exports="[object z]"===String(r)},"4R4u":function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},"4axp":function(t,e,n){"use strict";var r=n("wA6s"),o=n("uoca");r({target:"String",proto:!0,forced:n("d8Sw")("blink")},{blink:function(){return o(this,"blink","","")}})},"5MmU":function(t,e,n){var r=n("m41k"),o=n("pz+c"),i=r("iterator"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||a[i]===t)}},"5eAq":function(t,e,n){var r=n("wA6s"),o=n("vZCr");r({target:"Number",stat:!0,forced:Number.parseFloat!=o},{parseFloat:o})},"5y2d":function(t,e,n){var r=n("T69T"),o=n("/Ybd"),i=n("F26l"),a=n("ZRqE");t.exports=r?Object.defineProperties:function(t,e){i(t);for(var n,r=a(e),c=r.length,u=0;c>u;)o.f(t,n=r[u++],e[n]);return t}},"5zDw":function(t,e,n){var r=n("wA6s"),o=n("4NCC");r({target:"Number",stat:!0,forced:Number.parseInt!=o},{parseInt:o})},"694e":function(t,e,n){var r=n("EemH"),o=n("XKFU"),i=n("y3w9");o(o.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return r.f(i(t),e)}})},"6CEi":function(t,e,n){"use strict";var r=n("wA6s"),o=n("kk6e").find,i=n("A1Hp"),a=n("w2hq"),c="find",u=!0,s=a(c);c in[]&&Array(1).find(function(){u=!1}),r({target:"Array",proto:!0,forced:u||!s},{find:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i(c)},"6CJb":function(t,e,n){"use strict";var r=n("rG8t");t.exports=function(t,e){var n=[][t];return!!n&&r(function(){n.call(null,e||function(){throw 1},1)})}},"6XUM":function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},"6fhQ":function(t,e,n){"use strict";var r=n("wA6s"),o=n("Neub"),i=n("VCQ8"),a=n("rG8t"),c=n("6CJb"),u=[],s=u.sort,f=a(function(){u.sort(void 0)}),l=a(function(){u.sort(null)}),p=c("sort");r({target:"Array",proto:!0,forced:f||!l||!p},{sort:function(t){return void 0===t?s.call(i(this)):s.call(i(this),o(t))}})},"6lQQ":function(t,e,n){"use strict";var r=n("wA6s"),o=n("OXtp").indexOf,i=n("6CJb"),a=n("w2hq"),c=[].indexOf,u=!!c&&1/[1].indexOf(1,-0)<0,s=i("indexOf"),f=a("indexOf",{ACCESSORS:!0,1:0});r({target:"Array",proto:!0,forced:u||!s||!f},{indexOf:function(t){return u?c.apply(this,arguments)||0:o(this,t,arguments.length>1?arguments[1]:void 0)}})},"6oxo":function(t,e,n){var r=n("wA6s"),o=Math.log,i=Math.LN2;r({target:"Math",stat:!0},{log2:function(t){return o(t)/i}})},"6q6p":function(t,e,n){"use strict";var r=n("wA6s"),o=n("6XUM"),i=n("erNl"),a=n("7Oj1"),c=n("xpLY"),u=n("EMtK"),s=n("DYg9"),f=n("m41k"),l=n("lRyB"),p=n("w2hq"),h=l("slice"),v=p("slice",{ACCESSORS:!0,0:0,1:2}),d=f("species"),g=[].slice,y=Math.max;r({target:"Array",proto:!0,forced:!h||!v},{slice:function(t,e){var n,r,f,l=u(this),p=c(l.length),h=a(t,p),v=a(void 0===e?p:e,p);if(i(l)&&("function"!=typeof(n=l.constructor)||n!==Array&&!i(n.prototype)?o(n)&&null===(n=n[d])&&(n=void 0):n=void 0,n===Array||void 0===n))return g.call(l,h,v);for(r=new(void 0===n?Array:n)(y(v-h,0)),f=0;h=0;)p[e]=s((n+=p[e])/t),n=n%t*1e7},y=function(){for(var t=6,e="";--t>=0;)if(""!==e||0===t||0!==p[t]){var n=String(p[t]);e=""===e?n:e+a.call("0",7-n.length)+n}return e};if(l<0||l>20)throw RangeError("Incorrect fraction digits");if(u!=u)return"NaN";if(u<=-1e21||u>=1e21)return String(u);if(u<0&&(h="-",u=-u),u>1e-21)if(n=(e=function(t){for(var e=0,n=t;n>=4096;)e+=12,n/=4096;for(;n>=2;)e+=1,n/=2;return e}(u*f(2,69,1))-69)<0?u*f(2,-e,1):u/f(2,e,1),n*=4503599627370496,(e=52-e)>0){for(d(0,n),r=l;r>=7;)d(1e7,0),r-=7;for(d(f(10,r,1),0),r=e-1;r>=23;)g(1<<23),r-=23;g(1<0?h+((c=v.length)<=l?"0."+a.call("0",l-c)+v:v.slice(0,c-l)+"."+v.slice(c-l)):h+v}})},"8ydS":function(t,e,n){n("wA6s")({target:"Date",stat:!0},{now:function(){return(new Date).getTime()}})},"94Vg":function(t,e,n){var r=n("E7aN"),o=n("OG5q"),i=n("aGCb"),a=n("/Ybd").f;t.exports=function(t){var e=r.Symbol||(r.Symbol={});o(e,t)||a(e,t,{value:i.f(t)})}},"9kNm":function(t,e,n){n("94Vg")("toPrimitive")},"9rMk":function(t,e,n){var r=n("XKFU");r(r.S,"Reflect",{has:function(t,e){return e in t}})},A1Hp:function(t,e,n){var r=n("m41k"),o=n("2RDa"),i=n("/Ybd"),a=r("unscopables"),c=Array.prototype;null==c[a]&&i.f(c,a,{configurable:!0,value:o(null)}),t.exports=function(t){c[a][t]=!0}},A7hN:function(t,e,n){var r=n("wA6s"),o=n("rG8t"),i=n("VCQ8"),a=n("wIVT"),c=n("cwa4");r({target:"Object",stat:!0,forced:o(function(){a(1)}),sham:!c},{getPrototypeOf:function(t){return a(i(t))}})},"Ay+M":function(t,e,n){var r=n("wA6s"),o=n("vZCr");r({global:!0,forced:parseFloat!=o},{parseFloat:o})},BaTD:function(t,e,n){n("wA6s")({target:"String",proto:!0},{repeat:n("EMWV")})},BcWx:function(t,e,n){"use strict";var r=n("wA6s"),o=n("rG8t"),i=n("DYg9");r({target:"Array",stat:!0,forced:o(function(){function t(){}return!(Array.of.call(t)instanceof t)})},{of:function(){for(var t=0,e=arguments.length,n=new("function"==typeof this?this:Array)(e);e>t;)i(n,t,arguments[t++]);return n.length=e,n}})},BnCb:function(t,e,n){n("wA6s")({target:"Math",stat:!0},{sign:n("n/2t")})},COcp:function(t,e,n){n("wA6s")({target:"Number",stat:!0},{isInteger:n("Nvxz")})},CW9j:function(t,e,n){"use strict";var r=n("F26l"),o=n("LdO1");t.exports=function(t){if("string"!==t&&"number"!==t&&"default"!==t)throw TypeError("Incorrect hint");return o(r(this),"number"!==t)}},CwIO:function(t,e,n){var r=n("wA6s"),o=Math.hypot,i=Math.abs,a=Math.sqrt;r({target:"Math",stat:!0,forced:!!o&&o(1/0,NaN)!==1/0},{hypot:function(t,e){for(var n,r,o=0,c=0,u=arguments.length,s=0;c0?(r=n/s)*r:n;return s===1/0?1/0:s*a(o)}})},"D+RQ":function(t,e,n){"use strict";var r=n("T69T"),o=n("ocAm"),i=n("MkZA"),a=n("2MGJ"),c=n("OG5q"),u=n("ezU2"),s=n("K6ZX"),f=n("LdO1"),l=n("rG8t"),p=n("2RDa"),h=n("KkqW").f,v=n("7gGY").f,d=n("/Ybd").f,g=n("jnLS").trim,y="Number",m=o.Number,b=m.prototype,w=u(p(b))==y,k=function(t){var e,n,r,o,i,a,c,u,s=f(t,!1);if("string"==typeof s&&s.length>2)if(43===(e=(s=g(s)).charCodeAt(0))||45===e){if(88===(n=s.charCodeAt(2))||120===n)return NaN}else if(48===e){switch(s.charCodeAt(1)){case 66:case 98:r=2,o=49;break;case 79:case 111:r=8,o=55;break;default:return+s}for(a=(i=s.slice(2)).length,c=0;co)return NaN;return parseInt(i,r)}return+s};if(i(y,!m(" 0o1")||!m("0b1")||m("+0x1"))){for(var x,E=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof E&&(w?l(function(){b.valueOf.call(n)}):u(n)!=y)?s(new m(k(e)),n,E):k(e)},S=r?h(m):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),_=0;S.length>_;_++)c(m,x=S[_])&&!c(E,x)&&d(E,x,v(m,x));E.prototype=b,b.constructor=E,a(o,y,E)}},D3bo:function(t,e,n){var r,o,i=n("ocAm"),a=n("T/Kj"),c=i.process,u=c&&c.versions,s=u&&u.v8;s?o=(r=s.split("."))[0]+r[1]:a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=r[1]),t.exports=o&&+o},D94X:function(t,e,n){var r=n("wA6s"),o=n("n/2t"),i=Math.abs,a=Math.pow;r({target:"Math",stat:!0},{cbrt:function(t){return o(t=+t)*a(i(t),1/3)}})},DAme:function(t,e,n){"use strict";var r=n("8aNu"),o=n("M7Xk").getWeakData,i=n("F26l"),a=n("6XUM"),c=n("SM6+"),u=n("Rn6E"),s=n("kk6e"),f=n("OG5q"),l=n("XH/I"),p=l.set,h=l.getterFor,v=s.find,d=s.findIndex,g=0,y=function(t){return t.frozen||(t.frozen=new m)},m=function(){this.entries=[]},b=function(t,e){return v(t.entries,function(t){return t[0]===e})};m.prototype={get:function(t){var e=b(this,t);if(e)return e[1]},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.entries.push([t,e])},delete:function(t){var e=d(this.entries,function(e){return e[0]===t});return~e&&this.entries.splice(e,1),!!~e}},t.exports={getConstructor:function(t,e,n,s){var l=t(function(t,r){c(t,l,e),p(t,{type:e,id:g++,frozen:void 0}),null!=r&&u(r,t[s],t,n)}),v=h(e),d=function(t,e,n){var r=v(t),a=o(i(e),!0);return!0===a?y(r).set(e,n):a[r.id]=n,t};return r(l.prototype,{delete:function(t){var e=v(this);if(!a(t))return!1;var n=o(t);return!0===n?y(e).delete(t):n&&f(n,e.id)&&delete n[e.id]},has:function(t){var e=v(this);if(!a(t))return!1;var n=o(t);return!0===n?y(e).has(t):n&&f(n,e.id)}}),r(l.prototype,n?{get:function(t){var e=v(this);if(a(t)){var n=o(t);return!0===n?y(e).get(t):n?n[e.id]:void 0}},set:function(t,e){return d(this,t,e)}}:{add:function(t){return d(this,t,!0)}}),l}}},DGHb:function(t,e,n){"use strict";var r=n("wA6s"),o=n("rG8t"),i=n("VCQ8"),a=n("LdO1");r({target:"Date",proto:!0,forced:o(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})})},{toJSON:function(t){var e=i(this),n=a(e);return"number"!=typeof n||isFinite(n)?e.toISOString():null}})},DVgA:function(t,e,n){var r=n("zhAb"),o=n("4R4u");t.exports=Object.keys||function(t){return r(t,o)}},DYg9:function(t,e,n){"use strict";var r=n("LdO1"),o=n("/Ybd"),i=n("uSMZ");t.exports=function(t,e,n){var a=r(e);a in t?o.f(t,a,i(0,n)):t[a]=n}},Djps:function(t,e,n){n("wA6s")({target:"Math",stat:!0},{log1p:n("O3xq")})},DscF:function(t,e,n){var r=n("wA6s"),o=n("w4Hq"),i=n("A1Hp");r({target:"Array",proto:!0},{fill:o}),i("fill")},E7aN:function(t,e,n){var r=n("ocAm");t.exports=r},E8Ab:function(t,e,n){"use strict";var r=n("Neub"),o=n("6XUM"),i=[].slice,a={},c=function(t,e,n){if(!(e in a)){for(var r=[],o=0;o0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},EMtK:function(t,e,n){var r=n("tUdv"),o=n("hmpk");t.exports=function(t){return r(o(t))}},EQZg:function(t,e){t.exports=Object.is||function(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e}},ERXZ:function(t,e,n){n("94Vg")("match")},EemH:function(t,e,n){var r=n("UqcF"),o=n("RjD/"),i=n("aCFj"),a=n("apmT"),c=n("aagx"),u=n("xpql"),s=Object.getOwnPropertyDescriptor;e.f=n("nh4g")?s:function(t,e){if(t=i(t),e=a(e,!0),u)try{return s(t,e)}catch(n){}if(c(t,e))return o(!r.f.call(t,e),t[e])}},EntM:function(t,e,n){var r=n("wA6s"),o=n("T69T");r({target:"Object",stat:!0,forced:!o,sham:!o},{defineProperties:n("5y2d")})},"Ew/G":function(t,e,n){var r=n("E7aN"),o=n("ocAm"),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},"F/TS":function(t,e,n){var r=n("mN5b"),o=n("pz+c"),i=n("m41k")("iterator");t.exports=function(t){if(null!=t)return t[i]||t["@@iterator"]||o[r(t)]}},F26l:function(t,e,n){var r=n("6XUM");t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},F4rZ:function(t,e,n){"use strict";var r=n("wA6s"),o=n("rG8t"),i=n("erNl"),a=n("6XUM"),c=n("VCQ8"),u=n("xpLY"),s=n("DYg9"),f=n("JafA"),l=n("lRyB"),p=n("m41k"),h=n("D3bo"),v=p("isConcatSpreadable"),d=9007199254740991,g="Maximum allowed index exceeded",y=h>=51||!o(function(){var t=[];return t[v]=!1,t.concat()[0]!==t}),m=l("concat"),b=function(t){if(!a(t))return!1;var e=t[v];return void 0!==e?!!e:i(t)};r({target:"Array",proto:!0,forced:!y||!m},{concat:function(t){var e,n,r,o,i,a=c(this),l=f(a,0),p=0;for(e=-1,r=arguments.length;ed)throw TypeError(g);for(n=0;n=d)throw TypeError(g);s(l,p++,i)}return l.length=p,l}})},FJW5:function(t,e,n){var r=n("hswa"),o=n("y3w9"),i=n("DVgA");t.exports=n("nh4g")?Object.defineProperties:function(t,e){o(t);for(var n,a=i(e),c=a.length,u=0;c>u;)r.f(t,n=a[u++],e[n]);return t}},FU1i:function(t,e,n){"use strict";var r=n("wA6s"),o=n("kk6e").map,i=n("lRyB"),a=n("w2hq"),c=i("map"),u=a("map");r({target:"Array",proto:!0,forced:!c||!u},{map:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},"FeI/":function(t,e,n){"use strict";var r=n("wA6s"),o=n("kk6e").every,i=n("6CJb"),a=n("w2hq"),c=i("every"),u=a("every");r({target:"Array",proto:!0,forced:!c||!u},{every:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},Fqhe:function(t,e,n){var r=n("ocAm"),o=n("aJMj");t.exports=function(t,e){try{o(r,t,e)}catch(n){r[t]=e}return e}},G1Vw:function(t,e,n){"use strict";var r,o,i,a=n("wIVT"),c=n("aJMj"),u=n("OG5q"),s=n("m41k"),f=n("g9hI"),l=s("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(o=a(a(i)))!==Object.prototype&&(r=o):p=!0),null==r&&(r={}),f||u(r,l)||c(r,l,function(){return this}),t.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},G7bs:function(t,e,n){var r=n("vDBE"),o=n("hmpk"),i=function(t){return function(e,n){var i,a,c=String(o(e)),u=r(n),s=c.length;return u<0||u>=s?t?"":void 0:(i=c.charCodeAt(u))<55296||i>56319||u+1===s||(a=c.charCodeAt(u+1))<56320||a>57343?t?c.charAt(u):i:t?c.slice(u,u+2):a-56320+(i-55296<<10)+65536}};t.exports={codeAt:i(!1),charAt:i(!0)}},HSQg:function(t,e,n){"use strict";n("SC6u");var r=n("2MGJ"),o=n("rG8t"),i=n("m41k"),a=n("qjkP"),c=n("aJMj"),u=i("species"),s=!o(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")}),f="$0"==="a".replace(/./,"$0"),l=i("replace"),p=!!/./[l]&&""===/./[l]("a","$0"),h=!o(function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});t.exports=function(t,e,n,l){var v=i(t),d=!o(function(){var e={};return e[v]=function(){return 7},7!=""[t](e)}),g=d&&!o(function(){var e=!1,n=/a/;return"split"===t&&((n={}).constructor={},n.constructor[u]=function(){return n},n.flags="",n[v]=/./[v]),n.exec=function(){return e=!0,null},n[v](""),!e});if(!d||!g||"replace"===t&&(!s||!f||p)||"split"===t&&!h){var y=/./[v],m=n(v,""[t],function(t,e,n,r,o){return e.exec===a?d&&!o?{done:!0,value:y.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}},{REPLACE_KEEPS_$0:f,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:p}),b=m[1];r(String.prototype,t,m[0]),r(RegExp.prototype,v,2==e?function(t,e){return b.call(t,this,e)}:function(t){return b.call(t,this)})}l&&c(RegExp.prototype[v],"sham",!0)}},I5cv:function(t,e,n){var r=n("XKFU"),o=n("Kuth"),i=n("2OiF"),a=n("y3w9"),c=n("0/R4"),u=n("eeVq"),s=n("8MEG"),f=(n("dyZX").Reflect||{}).construct,l=u(function(){function t(){}return!(f(function(){},[],t)instanceof t)}),p=!u(function(){f(function(){})});r(r.S+r.F*(l||p),"Reflect",{construct:function(t,e){i(t),a(e);var n=arguments.length<3?t:i(arguments[2]);if(p&&!l)return f(t,e,n);if(t==n){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var r=[null];return r.push.apply(r,e),new(s.apply(t,r))}var u=n.prototype,h=o(c(u)?u:Object.prototype),v=Function.apply.call(t,h,e);return c(v)?v:h}})},IBH3:function(t,e,n){"use strict";var r=n("tcQx"),o=n("VCQ8"),i=n("ipMl"),a=n("5MmU"),c=n("xpLY"),u=n("DYg9"),s=n("F/TS");t.exports=function(t){var e,n,f,l,p,h,v=o(t),d="function"==typeof this?this:Array,g=arguments.length,y=g>1?arguments[1]:void 0,m=void 0!==y,b=s(v),w=0;if(m&&(y=r(y,g>2?arguments[2]:void 0,2)),null==b||d==Array&&a(b))for(n=new d(e=c(v.length));e>w;w++)h=m?y(v[w],w):v[w],u(n,w,h);else for(p=(l=b.call(v)).next,n=new d;!(f=p.call(l)).done;w++)h=m?i(l,y,[f.value,w],!0):f.value,u(n,w,h);return n.length=w,n}},IPby:function(t,e,n){var r=n("wA6s"),o=n("EMtK"),i=n("xpLY");r({target:"String",stat:!0},{raw:function(t){for(var e=o(t.raw),n=i(e.length),r=arguments.length,a=[],c=0;n>c;)a.push(String(e[c++])),c1?arguments[1]:void 0)}})},IXlp:function(t,e,n){var r=n("wA6s"),o=n("O3xq"),i=Math.acosh,a=Math.log,c=Math.sqrt,u=Math.LN2;r({target:"Math",stat:!0,forced:!i||710!=Math.floor(i(Number.MAX_VALUE))||i(1/0)!=1/0},{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?a(t)+u:o(t-1+c(t-1)*c(t+1))}})},IlFx:function(t,e,n){var r=n("XKFU"),o=n("y3w9"),i=Object.isExtensible;r(r.S,"Reflect",{isExtensible:function(t){return o(t),!i||i(t)}})},Iw71:function(t,e,n){var r=n("0/R4"),o=n("dyZX").document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},IzYO:function(t,e,n){var r=n("wA6s"),o=n("cZY6"),i=n("rG8t"),a=n("6XUM"),c=n("M7Xk").onFreeze,u=Object.freeze;r({target:"Object",stat:!0,forced:i(function(){u(1)}),sham:!o},{freeze:function(t){return u&&a(t)?u(c(t)):t}})},J4zY:function(t,e,n){"use strict";var r=n("wA6s"),o=n("uoca");r({target:"String",proto:!0,forced:n("d8Sw")("fixed")},{fixed:function(){return o(this,"tt","","")}})},JHhb:function(t,e,n){"use strict";var r=n("Ew/G"),o=n("/Ybd"),i=n("m41k"),a=n("T69T"),c=i("species");t.exports=function(t){var e=r(t);a&&e&&!e[c]&&(0,o.f)(e,c,{configurable:!0,get:function(){return this}})}},JI1L:function(t,e,n){var r=n("6XUM");t.exports=function(t){if(!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},JafA:function(t,e,n){var r=n("6XUM"),o=n("erNl"),i=n("m41k")("species");t.exports=function(t,e){var n;return o(t)&&("function"!=typeof(n=t.constructor)||n!==Array&&!o(n.prototype)?r(n)&&null===(n=n[i])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===e?0:e)}},JhPs:function(t,e,n){var r=n("wA6s"),o=n("pn4C");r({target:"Math",stat:!0,forced:o!=Math.expm1},{expm1:o})},JiEa:function(t,e){e.f=Object.getOwnPropertySymbols},JkSk:function(t,e,n){"use strict";var r=n("rG8t");function o(t,e){return RegExp(t,e)}e.UNSUPPORTED_Y=r(function(){var t=o("a","y");return t.lastIndex=2,null!=t.exec("abcd")}),e.BROKEN_CARET=r(function(){var t=o("^r","gy");return t.lastIndex=2,null!=t.exec("str")})},"Jt/z":function(t,e,n){"use strict";var r=n("wA6s"),o=n("kk6e").findIndex,i=n("A1Hp"),a=n("w2hq"),c="findIndex",u=!0,s=a(c);c in[]&&Array(1).findIndex(function(){u=!1}),r({target:"Array",proto:!0,forced:u||!s},{findIndex:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i(c)},K0xU:function(t,e,n){var r=n("VTer")("wks"),o=n("ylqs"),i=n("dyZX").Symbol,a="function"==typeof i;(t.exports=function(t){return r[t]||(r[t]=a&&i[t]||(a?i:o)("Symbol."+t))}).store=r},K1Z7:function(t,e,n){"use strict";var r=n("HSQg"),o=n("F26l"),i=n("xpLY"),a=n("hmpk"),c=n("dPn5"),u=n("unYP");r("match",1,function(t,e,n){return[function(e){var n=a(this),r=null==e?void 0:e[t];return void 0!==r?r.call(e,n):new RegExp(e)[t](String(n))},function(t){var r=n(e,t,this);if(r.done)return r.value;var a=o(t),s=String(this);if(!a.global)return u(a,s);var f=a.unicode;a.lastIndex=0;for(var l,p=[],h=0;null!==(l=u(a,s));){var v=String(l[0]);p[h]=v,""===v&&(a.lastIndex=c(s,i(a.lastIndex),f)),h++}return 0===h?null:p}]})},K1dl:function(t,e,n){var r=n("ocAm");t.exports=r.Promise},K6ZX:function(t,e,n){var r=n("6XUM"),o=n("7/lX");t.exports=function(t,e,n){var i,a;return o&&"function"==typeof(i=e.constructor)&&i!==n&&r(a=i.prototype)&&a!==n.prototype&&o(t,a),t}},KBkW:function(t,e,n){var r=n("ocAm"),o=n("Fqhe"),i="__core-js_shared__",a=r[i]||o(i,{});t.exports=a},KMug:function(t,e,n){var r=n("wA6s"),o=n("rG8t"),i=n("6XUM"),a=Object.isFrozen;r({target:"Object",stat:!0,forced:o(function(){a(1)})},{isFrozen:function(t){return!i(t)||!!a&&a(t)}})},KkqW:function(t,e,n){var r=n("vVmn"),o=n("aAjO").concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},KlhL:function(t,e,n){"use strict";var r=n("T69T"),o=n("rG8t"),i=n("ZRqE"),a=n("busr"),c=n("gn9T"),u=n("VCQ8"),s=n("tUdv"),f=Object.assign,l=Object.defineProperty;t.exports=!f||o(function(){if(r&&1!==f({b:1},f(l({},"a",{enumerable:!0,get:function(){l(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},n=Symbol(),o="abcdefghijklmnopqrst";return t[n]=7,o.split("").forEach(function(t){e[t]=t}),7!=f({},t)[n]||i(f({},e)).join("")!=o})?function(t,e){for(var n=u(t),o=arguments.length,f=1,l=a.f,p=c.f;o>f;)for(var h,v=s(arguments[f++]),d=l?i(v).concat(l(v)):i(v),g=d.length,y=0;g>y;)h=d[y++],r&&!p.call(v,h)||(n[h]=v[h]);return n}:f},KroJ:function(t,e,n){var r=n("dyZX"),o=n("Mukb"),i=n("aagx"),a=n("ylqs")("src"),c=n("+lvF"),u="toString",s=(""+c).split(u);n("g3g5").inspectSource=function(t){return c.call(t)},(t.exports=function(t,e,n,c){var u="function"==typeof n;u&&(i(n,"name")||o(n,"name",e)),t[e]!==n&&(u&&(i(n,a)||o(n,a,t[e]?""+t[e]:s.join(String(e)))),t===r?t[e]=n:c?t[e]?t[e]=n:o(t,e,n):(delete t[e],o(t,e,n)))})(Function.prototype,u,function(){return"function"==typeof this&&this[a]||c.call(this)})},KsdI:function(t,e,n){n("94Vg")("iterator")},Kuth:function(t,e,n){var r=n("y3w9"),o=n("FJW5"),i=n("4R4u"),a=n("YTvA")("IE_PROTO"),c=function(){},u=function(){var t,e=n("Iw71")("iframe"),r=i.length;for(e.style.display="none",n("+rLv").appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write("'],s=0;o>s;s++){a.push("");for(var h=0;o>h;h++)a.push('');a.push("")}a.push("
"),r.innerHTML=a.join("");var u=r.childNodes[0],l=(e.width-u.offsetWidth)/2,f=(e.height-u.offsetHeight)/2;l>0&&f>0&&(u.style.margin=f+"px "+l+"px")},t.prototype.clear=function(){this._el.innerHTML=""},t}();(QRCode=function(t,e){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:s.H},"string"==typeof e&&(e={text:e}),e)for(var r in e)this._htOption[r]=e[r];"string"==typeof t&&(t=document.getElementById(t)),this._android=n(),this._el=t,this._oQRCode=null,this._oDrawing=new c(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)}).prototype.makeCode=function(t){this._oQRCode=new e(function(t,e){for(var r=1,o=function(t){var e=encodeURI(t).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return e.length+(e.length!=t?3:0)}(t),i=0,n=g.length;n>=i;i++){var a=0;switch(e){case s.L:a=g[i][0];break;case s.M:a=g[i][1];break;case s.Q:a=g[i][2];break;case s.H:a=g[i][3]}if(a>=o)break;r++}if(r>g.length)throw new Error("Too long data");return r}(t,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(t),this._oQRCode.make(),this._el.title=t,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=s}(); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/scripts.8c1255aec48c8ec38c00.bundle.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/scripts.8c1255aec48c8ec38c00.bundle.js new file mode 100644 index 0000000000..40d487e396 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/scripts.8c1255aec48c8ec38c00.bundle.js @@ -0,0 +1 @@ +var QRCode;!function(){function t(t){this.mode=a.MODE_8BIT_BYTE,this.data=t,this.parsedData=[];for(var e=[],r=0,o=this.data.length;o>r;r++){var i=this.data.charCodeAt(r);i>65536?(e[0]=240|(1835008&i)>>>18,e[1]=128|(258048&i)>>>12,e[2]=128|(4032&i)>>>6,e[3]=128|63&i):i>2048?(e[0]=224|(61440&i)>>>12,e[1]=128|(4032&i)>>>6,e[2]=128|63&i):i>128?(e[0]=192|(1984&i)>>>6,e[1]=128|63&i):e[0]=i,this.parsedData=this.parsedData.concat(e)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function e(t,e){this.typeNumber=t,this.errorCorrectLevel=e,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function r(t,e){if(void 0==t.length)throw new Error(t.length+"/"+e);for(var r=0;re;e++)t.put(this.parsedData[e],8)}},e.prototype={addData:function(e){var r=new t(e);this.dataList.push(r),this.dataCache=null},isDark:function(t,e){if(0>t||this.moduleCount<=t||0>e||this.moduleCount<=e)throw new Error(t+","+e);return this.modules[t][e]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(t,r){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var o=0;o=7&&this.setupTypeNumber(t),null==this.dataCache&&(this.dataCache=e.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,r)},setupPositionProbePattern:function(t,e){for(var r=-1;7>=r;r++)if(!(-1>=t+r||this.moduleCount<=t+r))for(var o=-1;7>=o;o++)-1>=e+o||this.moduleCount<=e+o||(this.modules[t+r][e+o]=r>=0&&6>=r&&(0==o||6==o)||o>=0&&6>=o&&(0==r||6==r)||r>=2&&4>=r&&o>=2&&4>=o)},getBestMaskPattern:function(){for(var t=0,e=0,r=0;8>r;r++){this.makeImpl(!0,r);var o=u.getLostPoint(this);(0==r||t>o)&&(t=o,e=r)}return e},createMovieClip:function(t,e,r){var o=t.createEmptyMovieClip(e,r);this.make();for(var i=0;i=n;n++)for(var a=-2;2>=a;a++)this.modules[o+n][i+a]=-2==n||2==n||-2==a||2==a||0==n&&0==a}},setupTypeNumber:function(t){for(var e=u.getBCHTypeNumber(this.typeNumber),r=0;18>r;r++){var o=!t&&1==(1&e>>r);this.modules[Math.floor(r/3)][r%3+this.moduleCount-8-3]=o}for(r=0;18>r;r++)o=!t&&1==(1&e>>r),this.modules[r%3+this.moduleCount-8-3][Math.floor(r/3)]=o},setupTypeInfo:function(t,e){for(var r=u.getBCHTypeInfo(this.errorCorrectLevel<<3|e),o=0;15>o;o++){var i=!t&&1==(1&r>>o);6>o?this.modules[o][8]=i:8>o?this.modules[o+1][8]=i:this.modules[this.moduleCount-15+o][8]=i}for(o=0;15>o;o++)i=!t&&1==(1&r>>o),8>o?this.modules[8][this.moduleCount-o-1]=i:9>o?this.modules[8][15-o-1+1]=i:this.modules[8][15-o-1]=i;this.modules[this.moduleCount-8][8]=!t},mapData:function(t,e){for(var r=-1,o=this.moduleCount-1,i=7,n=0,a=this.moduleCount-1;a>0;a-=2)for(6==a&&a--;;){for(var s=0;2>s;s++)if(null==this.modules[o][a-s]){var h=!1;n>>i)),u.getMask(e,o,a-s)&&(h=!h),this.modules[o][a-s]=h,-1==--i&&(n++,i=7)}if(0>(o+=r)||this.moduleCount<=o){o-=r,r=-r;break}}}},e.PAD0=236,e.PAD1=17,e.createData=function(t,r,n){for(var a=o.getRSBlocks(t,r),s=new i,h=0;h8*f)throw new Error("code length overflow. ("+s.getLengthInBits()+">"+8*f+")");for(s.getLengthInBits()+4<=8*f&&s.put(0,4);0!=s.getLengthInBits()%8;)s.putBit(!1);for(;!(s.getLengthInBits()>=8*f||(s.put(e.PAD0,8),s.getLengthInBits()>=8*f));)s.put(e.PAD1,8);return e.createBytes(s,a)},e.createBytes=function(t,e){for(var o=0,i=0,n=0,a=new Array(e.length),s=new Array(e.length),h=0;h=0?c.get(p):0}}var m=0;for(g=0;gg;g++)for(h=0;hg;g++)for(h=0;h=0;)e^=u.G15<=0;)e^=u.G18<>>=1;return e},getPatternPosition:function(t){return u.PATTERN_POSITION_TABLE[t-1]},getMask:function(t,e,r){switch(t){case h.PATTERN000:return 0==(e+r)%2;case h.PATTERN001:return 0==e%2;case h.PATTERN010:return 0==r%3;case h.PATTERN011:return 0==(e+r)%3;case h.PATTERN100:return 0==(Math.floor(e/2)+Math.floor(r/3))%2;case h.PATTERN101:return 0==e*r%2+e*r%3;case h.PATTERN110:return 0==(e*r%2+e*r%3)%2;case h.PATTERN111:return 0==(e*r%3+(e+r)%2)%2;default:throw new Error("bad maskPattern:"+t)}},getErrorCorrectPolynomial:function(t){for(var e=new r([1],0),o=0;t>o;o++)e=e.multiply(new r([1,l.gexp(o)],0));return e},getLengthInBits:function(t,e){if(e>=1&&10>e)switch(t){case a.MODE_NUMBER:return 10;case a.MODE_ALPHA_NUM:return 9;case a.MODE_8BIT_BYTE:case a.MODE_KANJI:return 8;default:throw new Error("mode:"+t)}else if(27>e)switch(t){case a.MODE_NUMBER:return 12;case a.MODE_ALPHA_NUM:return 11;case a.MODE_8BIT_BYTE:return 16;case a.MODE_KANJI:return 10;default:throw new Error("mode:"+t)}else{if(!(41>e))throw new Error("type:"+e);switch(t){case a.MODE_NUMBER:return 14;case a.MODE_ALPHA_NUM:return 13;case a.MODE_8BIT_BYTE:return 16;case a.MODE_KANJI:return 12;default:throw new Error("mode:"+t)}}},getLostPoint:function(t){for(var e=t.getModuleCount(),r=0,o=0;e>o;o++)for(var i=0;e>i;i++){for(var n=0,a=t.isDark(o,i),s=-1;1>=s;s++)if(!(0>o+s||o+s>=e))for(var h=-1;1>=h;h++)0>i+h||i+h>=e||(0!=s||0!=h)&&a==t.isDark(o+s,i+h)&&n++;n>5&&(r+=3+n-5)}for(o=0;e-1>o;o++)for(i=0;e-1>i;i++){var u=0;t.isDark(o,i)&&u++,t.isDark(o+1,i)&&u++,t.isDark(o,i+1)&&u++,t.isDark(o+1,i+1)&&u++,(0==u||4==u)&&(r+=3)}for(o=0;e>o;o++)for(i=0;e-6>i;i++)t.isDark(o,i)&&!t.isDark(o,i+1)&&t.isDark(o,i+2)&&t.isDark(o,i+3)&&t.isDark(o,i+4)&&!t.isDark(o,i+5)&&t.isDark(o,i+6)&&(r+=40);for(i=0;e>i;i++)for(o=0;e-6>o;o++)t.isDark(o,i)&&!t.isDark(o+1,i)&&t.isDark(o+2,i)&&t.isDark(o+3,i)&&t.isDark(o+4,i)&&!t.isDark(o+5,i)&&t.isDark(o+6,i)&&(r+=40);var l=0;for(i=0;e>i;i++)for(o=0;e>o;o++)t.isDark(o,i)&&l++;return r+Math.abs(100*l/e/e-50)/5*10}},l={glog:function(t){if(1>t)throw new Error("glog("+t+")");return l.LOG_TABLE[t]},gexp:function(t){for(;0>t;)t+=255;for(;t>=256;)t-=255;return l.EXP_TABLE[t]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},f=0;8>f;f++)l.EXP_TABLE[f]=1<f;f++)l.EXP_TABLE[f]=l.EXP_TABLE[f-4]^l.EXP_TABLE[f-5]^l.EXP_TABLE[f-6]^l.EXP_TABLE[f-8];for(f=0;255>f;f++)l.LOG_TABLE[l.EXP_TABLE[f]]=f;r.prototype={get:function(t){return this.num[t]},getLength:function(){return this.num.length},multiply:function(t){for(var e=new Array(this.getLength()+t.getLength()-1),o=0;oa;a++)for(var s=r[3*a+0],h=r[3*a+1],u=r[3*a+2],l=0;s>l;l++)n.push(new o(h,u));return n},o.getRsBlockTable=function(t,e){switch(e){case s.L:return o.RS_BLOCK_TABLE[4*(t-1)+0];case s.M:return o.RS_BLOCK_TABLE[4*(t-1)+1];case s.Q:return o.RS_BLOCK_TABLE[4*(t-1)+2];case s.H:return o.RS_BLOCK_TABLE[4*(t-1)+3];default:return}},i.prototype={get:function(t){var e=Math.floor(t/8);return 1==(1&this.buffer[e]>>>7-t%8)},put:function(t,e){for(var r=0;e>r;r++)this.putBit(1==(1&t>>>e-r-1))},getLengthInBits:function(){return this.length},putBit:function(t){var e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),t&&(this.buffer[e]|=128>>>this.length%8),this.length++}};var g=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],d=function(){var t=function(t,e){this._el=t,this._htOption=e};return t.prototype.draw=function(t){function e(t,e){var r=document.createElementNS("http://www.w3.org/2000/svg",t);for(var o in e)e.hasOwnProperty(o)&&r.setAttribute(o,e[o]);return r}var r=this._htOption,o=this._el,i=t.getModuleCount();Math.floor(r.width/i),Math.floor(r.height/i),this.clear();var n=e("svg",{viewBox:"0 0 "+String(i)+" "+String(i),width:"100%",height:"100%",fill:r.colorLight});n.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),o.appendChild(n),n.appendChild(e("rect",{fill:r.colorDark,width:"1",height:"1",id:"template"}));for(var a=0;i>a;a++)for(var s=0;i>s;s++)if(t.isDark(a,s)){var h=e("use",{x:String(a),y:String(s)});h.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),n.appendChild(h)}},t.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},t}(),c="svg"===document.documentElement.tagName.toLowerCase()?d:"undefined"!=typeof CanvasRenderingContext2D?function(){function t(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}if(this._android&&this._android<=2.1){var e=1/window.devicePixelRatio,r=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(t,o,i,n,a,s,h,u){if("nodeName"in t&&/img/i.test(t.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*e;else"undefined"==typeof u&&(arguments[1]*=e,arguments[2]*=e,arguments[3]*=e,arguments[4]*=e);r.apply(this,arguments)}}var o=function(t,e){this._bIsPainted=!1,this._android=n(),this._htOption=e,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=e.width,this._elCanvas.height=e.height,t.appendChild(this._elCanvas),this._el=t,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return o.prototype.draw=function(t){var e=this._elImage,r=this._oContext,o=this._htOption,i=t.getModuleCount(),n=o.width/i,a=o.height/i,s=Math.round(n),h=Math.round(a);e.style.display="none",this.clear();for(var u=0;i>u;u++)for(var l=0;i>l;l++){var f=t.isDark(u,l),g=l*n,d=u*a;r.strokeStyle=f?o.colorDark:o.colorLight,r.lineWidth=1,r.fillStyle=f?o.colorDark:o.colorLight,r.fillRect(g,d,n,a),r.strokeRect(Math.floor(g)+.5,Math.floor(d)+.5,s,h),r.strokeRect(Math.ceil(g)-.5,Math.ceil(d)-.5,s,h)}this._bIsPainted=!0},o.prototype.makeImage=function(){this._bIsPainted&&(function(t,e){var r=this;if(r._fFail=e,r._fSuccess=t,null===r._bSupportDataURI){var o=document.createElement("img"),i=function(){r._bSupportDataURI=!1,r._fFail&&_fFail.call(r)};return o.onabort=i,o.onerror=i,o.onload=function(){r._bSupportDataURI=!0,r._fSuccess&&r._fSuccess.call(r)},void(o.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")}!0===r._bSupportDataURI&&r._fSuccess?r._fSuccess.call(r):!1===r._bSupportDataURI&&r._fFail&&r._fFail.call(r)}).call(this,t)},o.prototype.isPainted=function(){return this._bIsPainted},o.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},o.prototype.round=function(t){return t?Math.floor(1e3*t)/1e3:t},o}():function(){var t=function(t,e){this._el=t,this._htOption=e};return t.prototype.draw=function(t){for(var e=this._htOption,r=this._el,o=t.getModuleCount(),i=Math.floor(e.width/o),n=Math.floor(e.height/o),a=[''],s=0;o>s;s++){a.push("");for(var h=0;o>h;h++)a.push('');a.push("")}a.push("
"),r.innerHTML=a.join("");var u=r.childNodes[0],l=(e.width-u.offsetWidth)/2,f=(e.height-u.offsetHeight)/2;l>0&&f>0&&(u.style.margin=f+"px "+l+"px")},t.prototype.clear=function(){this._el.innerHTML=""},t}();(QRCode=function(t,e){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:s.H},"string"==typeof e&&(e={text:e}),e)for(var r in e)this._htOption[r]=e[r];"string"==typeof t&&(t=document.getElementById(t)),this._android=n(),this._el=t,this._oQRCode=null,this._oDrawing=new c(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)}).prototype.makeCode=function(t){this._oQRCode=new e(function(t,e){for(var r=1,o=function(t){var e=encodeURI(t).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return e.length+(e.length!=t?3:0)}(t),i=0,n=g.length;n>=i;i++){var a=0;switch(e){case s.L:a=g[i][0];break;case s.M:a=g[i][1];break;case s.Q:a=g[i][2];break;case s.H:a=g[i][3]}if(a>=o)break;r++}if(r>g.length)throw new Error("Too long data");return r}(t,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(t),this._oQRCode.make(),this._el.title=t,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=s}(); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.0a54ebf55b758e9dc9cb.css b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.0a54ebf55b758e9dc9cb.css new file mode 100644 index 0000000000..635e3bb574 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.0a54ebf55b758e9dc9cb.css @@ -0,0 +1,14 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.8b43027f47b20503057d.eot?v=4.7.0);src:url(fontawesome-webfont.8b43027f47b20503057d.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(fontawesome-webfont.20fd1704ea223900efa9.woff2?v=4.7.0) format("woff2"),url(fontawesome-webfont.f691f37e57f04c152e23.woff?v=4.7.0) format("woff"),url(fontawesome-webfont.1e59d2330b4c6deb84b3.ttf?v=4.7.0) format("truetype"),url(fontawesome-webfont.c1e38fd9e0e74ba58f7a.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@font-face{font-family:Material Icons;font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.4674f8ded773cb03e824.eot);src:local("Material Icons"),local("MaterialIcons-Regular"),url(MaterialIcons-Regular.cff684e59ffb052d72cb.woff2) format("woff2"),url(MaterialIcons-Regular.83bebaf37c09c7e1c3ee.woff) format("woff"),url(MaterialIcons-Regular.5e7382c63da0098d634a.ttf) format("truetype")}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}.-table .-body,.paper{background-color:#fafafa;border-radius:10px;box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px;font-size:13px;overflow:hidden}.-table .small-padding.-body,.paper.small-padding{padding:20px}.-table:last-of-type{margin-bottom:30px}.-table .-headers{color:rgba(30,34,39,.2);display:flex;font-size:12px;font-weight:700;height:50px;line-height:50px;margin:0 30px}.-table .-headers>div{padding:0 20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.-table .-body{padding:0;margin:0 30px}.-table .-body .-row{font-size:13px;padding:15px 0;display:flex;align-items:center}.-table .-body .-row:not(:last-child){border-bottom:1px solid rgba(30,34,39,.05)}.-table .-body .-row>div{padding:0 20px}.-table .-width-50{width:50px;flex-shrink:0}.-table .-width-70{width:70px;flex-shrink:0}.-table .-width-85{width:85px;flex-shrink:0}.-table .-width-130{width:130px;flex-shrink:0}.-table .-width-150{width:150px;flex-shrink:0}.-table .-width-200{width:200px;flex-shrink:0}.-table .-width-250{width:250px;flex-shrink:0}.mat-dialog-content{max-height:90vh!important}@media (max-height:600px){.mat-dialog-content{max-height:80vh!important}}mat-dialog-container{border-radius:6px!important;overflow:hidden}.mat-dialog-container{padding:0!important}.modal{background-color:#fafafa;padding:0 24px;line-height:1.5;font-size:13px;color:rgba(30,34,39,.7)}.modal .-buttons{text-align:center}.modal app-button button{margin-top:28px}.list-button-container{margin:0 -10px}.list-button-container button.top-line:first-of-type{border-top:1px solid rgba(30,34,39,.05)}.list-button-container button{width:100%;text-align:left;padding:10px;border-bottom:1px solid rgba(30,34,39,.05);cursor:pointer}@font-face{font-family:Skycoin;font-style:normal;font-weight:300;src:url(/assets/fonts/skycoin/Skycoin-Light.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-Light.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:300;src:url(/assets/fonts/skycoin/Skycoin-LightItalic.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-LightItalic.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:400;src:url(/assets/fonts/skycoin/Skycoin-Regular.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-Regular.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:400;src:url(/assets/fonts/skycoin/Skycoin-RegularItalic.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-RegularItalic.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:700;src:url(/assets/fonts/skycoin/Skycoin-Bold.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-Bold.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:700;src:url(/assets/fonts/skycoin/Skycoin-BoldItalic.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-BoldItalic.woff) format("woff")}.form-field{margin-bottom:20px}.form-field label{color:#1e2227;display:block;font-size:13px;line-height:1.5;margin-bottom:2px}.form-field .field-base,.form-field input,.form-field mat-select,.form-field mat-slider,.form-field select,.form-field textarea{color:#1e2227;background-color:#fff;border:2px solid rgba(30,34,39,.05);border-radius:6px;box-sizing:border-box;display:block;font-size:13px;line-height:1.5;padding:10px;width:100%}.form-field select{-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-field select option{color:#1e2227}.form-field select option:disabled{color:rgba(30,34,39,.7)}.form-field mat-slider{padding:0;height:40px}.form-field mat-slider .mat-slider-thumb,.form-field mat-slider .mat-slider-thumb-label{background-color:#0072ff!important;transform:scale(1)!important;border-width:0!important}.form-field mat-slider .mat-slider-thumb{right:-6px;width:12px;height:32px;border-radius:3px}.form-field mat-slider .mat-slider-track-background,.form-field mat-slider .mat-slider-track-fill{background-color:#fff!important}.form-field mat-select{padding:0}.form-field mat-select .mat-select-trigger{padding:10px 40px 10px 10px;display:block;font-size:11px;height:100%;line-height:1.9}.form-field mat-select .mat-select-arrow{border:none}.form-field mat-select .mat-select-placeholder{color:unset!important;transition:unset!important}.form-field .-not-allowed input{cursor:not-allowed}mat-option .mat-pseudo-checkbox-checked{background:#0072ff}.mat-option-disabled .mat-pseudo-checkbox-disabled{opacity:.5}.-select{position:relative}.-select:before{content:"";display:block;position:absolute;top:0;right:0;background:url(/assets/img/chevron-right-grey.png) no-repeat;background-size:32px 32px;width:32px;height:32px;margin:6px;pointer-events:none;transform:rotate(90deg)}textarea{resize:none}.element-disabled,.form-field input:disabled,.form-field select:disabled,.form-field textarea:disabled{pointer-events:none!important;opacity:.5!important}.modal-form-container{margin-top:20px}.-check-container{text-align:center;margin-top:25px}.-check label{font-size:13px;max-width:100%;color:#1e2227;white-space:normal;text-align:left}.-check label .img-label-container{position:relative;top:2px}.-check label .img-label-container img{width:38px;height:38px;vertical-align:middle}.-check .mat-checkbox-label{position:relative;top:2px}.-check .mat-checkbox-checkmark-path{stroke:#0072ff!important}.-check .mat-checkbox-background,.-check .mat-checkbox-frame{width:20px;height:20px;background:rgba(30,34,39,.05)!important;border-radius:6px;border-color:transparent}.-check .mat-checkbox-ripple{top:-11px!important;left:-11px!important}.help-icon{display:inline!important;font-size:14px!important;color:rgba(30,34,39,.5);opacity:.55;vertical-align:text-bottom;padding-left:5px;cursor:default}.onboarding-container{width:100%;height:100%;overflow-x:hidden;background:#0072ff;background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.onboarding-container .row-container{max-width:450px;width:80%;margin:0 auto}.onboarding-container label{color:#fafafa!important}.onboarding-container .-header{color:#fafafa;margin-top:20px;margin-bottom:10px;text-align:center;line-height:1.5;font-size:20px}.onboarding-container .-description{font-size:14px;text-align:center;color:#fafafa;opacity:.5}.onboarding-container .-buttons-footer{align-items:center;flex-flow:column;margin-bottom:20px}.onboarding-container .-buttons-footer button{margin:2px 10px!important}.primary-button button.enabled,.primary-gradient-background{background:#0072ff;background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.primary-button button.enabled span,.primary-gradient-background span{color:#fff}.dark-button button.enabled{background-color:#1e2227!important}.dark-button button.enabled span{color:#fff}.ghost-button button.enabled{background-color:transparent!important}.ghost-button button.enabled span{color:#000}.image-button{cursor:pointer;opacity:.5}.image-button:hover{opacity:.75}.image-button:active{opacity:1}.white-text{color:#fafafa!important}.red-text{color:#ff004e!important}.yellow-text{color:#ffc125!important}.green-text{color:#00df80!important}.grey-light-text{color:rgba(30,34,39,.2)!important}.grey-text{color:rgba(30,34,39,.5)!important}.break-all{word-break:break-all}.mat-menu-panel{border-radius:6px!important;background-color:#fafafa}.mat-menu-panel .mat-menu-item{font-family:Skycoin,Roboto,Helvetica Neue,sans-serif} +/*! + * Bootstrap Grid v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,:after,:before{box-sizing:inherit}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;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}}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.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-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!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}.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}.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}@media (min-width:576px){.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-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!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}.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}.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}}@media (min-width:768px){.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-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!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}.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}.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}}@media (min-width:992px){.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-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!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}.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}.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}}@media (min-width:1200px){.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-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!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}.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}.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}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!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}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!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}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!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}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!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}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!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}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!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}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fafafa!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#00df80!important}a.text-success:focus,a.text-success:hover{color:#009354!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc125!important}a.text-warning:focus,a.text-warning:hover{color:#d89a00!important}.text-danger{color:#ff004e!important}a.text-danger:focus,a.text-danger:hover{color:#b30037!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(30,34,39,.5)!important}.text-white-50{color:hsla(0,0%,98%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,Helvetica Neue,sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * .83) /20px Roboto,Helvetica Neue,sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * .67) /20px Roboto,Helvetica Neue,sans-serif;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-body-1 p,.mat-body p,.mat-typography p{margin:0 0 12px}.mat-caption,.mat-small{font:400 12px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto,Helvetica Neue,sans-serif;letter-spacing:-.05em;margin:0 0 56px}.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto,Helvetica Neue,sans-serif;letter-spacing:-.02em;margin:0 0 64px}.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto,Helvetica Neue,sans-serif;letter-spacing:-.005em;margin:0 0 64px}.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 64px}.mat-bottom-sheet-container{font:400 14px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-button,.mat-fab,.mat-flat-button,.mat-icon-button,.mat-mini-fab,.mat-raised-button,.mat-stroked-button{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500}.mat-button-toggle,.mat-card{font-family:Roboto,Helvetica Neue,sans-serif}.mat-card-title{font-size:24px;font-weight:500}.mat-card-header .mat-card-title{font-size:20px}.mat-card-content,.mat-card-subtitle{font-size:14px}.mat-checkbox{font-family:Roboto,Helvetica Neue,sans-serif}.mat-checkbox-layout .mat-checkbox-label{line-height:24px}.mat-chip{font-size:14px;font-weight:500}.mat-chip .mat-chip-remove.mat-icon,.mat-chip .mat-chip-trailing-icon.mat-icon{font-size:18px}.mat-table{font-family:Roboto,Helvetica Neue,sans-serif}.mat-header-cell{font-size:12px;font-weight:500}.mat-cell,.mat-footer-cell{font-size:14px}.mat-calendar{font-family:Roboto,Helvetica Neue,sans-serif}.mat-calendar-body{font-size:13px}.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}.mat-calendar-table-header th{font-size:11px;font-weight:400}.mat-dialog-title{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-expansion-panel-header{font-family:Roboto,Helvetica Neue,sans-serif;font-size:15px;font-weight:400}.mat-expansion-panel-content{font:400 14px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-form-field{font-size:inherit;font-weight:400;line-height:1.125;font-family:Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-form-field-wrapper{padding-bottom:1.34375em}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}.mat-form-field-infix{padding:.5em 0;border-top:.84375em solid transparent}.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34375em) scale(.75);width:133.3333333333%}.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34374em) scale(.75);width:133.3333433333%}.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}.mat-form-field-label{top:1.34375em}.mat-form-field-underline{bottom:1.34375em}.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.6666666667em;top:calc(100% - 1.7916666667em)}.mat-form-field-appearance-legacy .mat-form-field-wrapper{padding-bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-infix{padding:.4375em 0}.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.3333333333%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.3333433333%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.3333533333%}.mat-form-field-appearance-legacy .mat-form-field-label{top:1.28125em}.mat-form-field-appearance-legacy .mat-form-field-underline{bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper{margin-top:.5416666667em;top:calc(100% - 1.6666666667em)}@media print{.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28122em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28121em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.2812em) scale(.75)}}.mat-form-field-appearance-fill .mat-form-field-infix{padding:.25em 0 .75em}.mat-form-field-appearance-fill .mat-form-field-label{top:1.09375em;margin-top:-.5em}.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-.59375em) scale(.75);width:133.3333333333%}.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-.59374em) scale(.75);width:133.3333433333%}.mat-form-field-appearance-outline .mat-form-field-infix{padding:1em 0}.mat-form-field-appearance-outline .mat-form-field-label{top:1.84375em;margin-top:-.25em}.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59375em) scale(.75);width:133.3333333333%}.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59374em) scale(.75);width:133.3333433333%}.mat-grid-tile-footer,.mat-grid-tile-header{font-size:14px}.mat-grid-tile-footer .mat-line,.mat-grid-tile-header .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-grid-tile-footer .mat-line:nth-child(n+2),.mat-grid-tile-header .mat-line:nth-child(n+2){font-size:12px}input.mat-input-element{margin-top:-.0625em}.mat-menu-item{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:400}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px}.mat-radio-button,.mat-select{font-family:Roboto,Helvetica Neue,sans-serif}.mat-select-trigger{height:1.125em}.mat-slide-toggle-content,.mat-slider-thumb-label-text{font-family:Roboto,Helvetica Neue,sans-serif}.mat-slider-thumb-label-text{font-size:12px;font-weight:500}.mat-stepper-horizontal,.mat-stepper-vertical{font-family:Roboto,Helvetica Neue,sans-serif}.mat-step-label{font-size:14px;font-weight:400}.mat-step-sub-label-error{font-weight:400}.mat-step-label-error{font-size:14px}.mat-step-label-selected{font-size:14px;font-weight:500}.mat-tab-group,.mat-tab-label,.mat-tab-link{font-family:Roboto,Helvetica Neue,sans-serif}.mat-tab-label,.mat-tab-link{font-size:14px;font-weight:500}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0}.mat-tooltip{font-family:Roboto,Helvetica Neue,sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}.mat-tooltip-handset{font-size:14px;padding-top:8px;padding-bottom:8px}.mat-list-item,.mat-list-option{font-family:Roboto,Helvetica Neue,sans-serif}.mat-list-base .mat-list-item{font-size:16px}.mat-list-base .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-item .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-list-option{font-size:16px}.mat-list-base .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-option .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-subheader{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500}.mat-list-base[dense] .mat-list-item{font-size:12px}.mat-list-base[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-list-base[dense] .mat-list-option{font-size:12px}.mat-list-base[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}.mat-list-base[dense] .mat-subheader{font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;font-weight:500}.mat-option{font-family:Roboto,Helvetica Neue,sans-serif;font-size:16px}.mat-optgroup-label{font:500 14px/24px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-simple-snackbar{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px}.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}.mat-tree{font-family:Roboto,Helvetica Neue,sans-serif}.mat-nested-tree-node,.mat-tree-node{font-weight:400;font-size:14px}.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0,0,.2,1);transform:scale(0)}.cdk-high-contrast-active .mat-ripple-element{display:none}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none}.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper,.cdk-overlay-pane{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{pointer-events:auto;box-sizing:border-box;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0!important;box-sizing:content-box!important;height:auto!important;overflow:hidden!important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0!important;box-sizing:content-box!important;height:0!important}@-webkit-keyframes cdk-text-field-autofill-start{ + /*!*/}@keyframes cdk-text-field-autofill-start{ + /*!*/}@-webkit-keyframes cdk-text-field-autofill-end{ + /*!*/}@keyframes cdk-text-field-autofill-end{ + /*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{-webkit-animation:cdk-text-field-autofill-start 0s 1ms;animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){-webkit-animation:cdk-text-field-autofill-end 0s 1ms;animation:cdk-text-field-autofill-end 0s 1ms}.mat-focus-indicator,.mat-mdc-focus-indicator{position:relative}.mat-ripple-element{background-color:rgba(0,0,0,.1)}.mat-option{color:rgba(0,0,0,.87)}.mat-option.mat-active,.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled),.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-option.mat-active{color:rgba(0,0,0,.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#0072ff}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.mat-optgroup-label{color:rgba(0,0,0,.54)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.mat-pseudo-checkbox:after{color:#fafafa}.mat-pseudo-checkbox-disabled{color:#b0b0b0}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#0072ff}.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#ffc125}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-elevation-z0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-elevation-z1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-elevation-z2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-elevation-z3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-elevation-z4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-elevation-z5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.mat-elevation-z6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-elevation-z7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.mat-elevation-z8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-elevation-z9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mat-elevation-z10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.mat-elevation-z11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.mat-elevation-z12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-elevation-z13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.mat-elevation-z14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.mat-elevation-z15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.mat-elevation-z16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-elevation-z17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.mat-elevation-z18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.mat-elevation-z19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.mat-elevation-z20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.mat-elevation-z21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.mat-elevation-z22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.mat-elevation-z23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.mat-elevation-z24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.mat-badge{position:relative}.mat-badge-hidden .mat-badge-content{display:none}.mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform .2s ease-in-out;transform:scale(.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}.mat-badge-content._mat-animation-noopable,.ng-animate-disabled .mat-badge-content{transition:none}.mat-badge-content.mat-badge-active{transform:none}.mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}.mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}.mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}.mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}[dir=rtl] .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}.mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}[dir=rtl] .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}.mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}.mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}.mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}.mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}[dir=rtl] .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}.mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}[dir=rtl] .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}.mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}.mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}.mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}.mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}[dir=rtl] .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}.mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}[dir=rtl] .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}.mat-badge-content{color:#fff;background:#0072ff}.cdk-high-contrast-active .mat-badge-content{outline:1px solid;border-radius:0}.mat-badge-accent .mat-badge-content{background:#ffc125;color:#fff}.mat-badge-warn .mat-badge-content{color:#fff;background:#f44336}.mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,.38)}.mat-bottom-sheet-container{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.mat-button,.mat-icon-button,.mat-stroked-button{color:inherit;background:transparent}.mat-button.mat-primary,.mat-icon-button.mat-primary,.mat-stroked-button.mat-primary{color:#0072ff}.mat-button.mat-accent,.mat-icon-button.mat-accent,.mat-stroked-button.mat-accent{color:#ffc125}.mat-button.mat-warn,.mat-icon-button.mat-warn,.mat-stroked-button.mat-warn{color:#f44336}.mat-button.mat-accent.mat-button-disabled,.mat-button.mat-button-disabled.mat-button-disabled,.mat-button.mat-primary.mat-button-disabled,.mat-button.mat-warn.mat-button-disabled,.mat-icon-button.mat-accent.mat-button-disabled,.mat-icon-button.mat-button-disabled.mat-button-disabled,.mat-icon-button.mat-primary.mat-button-disabled,.mat-icon-button.mat-warn.mat-button-disabled,.mat-stroked-button.mat-accent.mat-button-disabled,.mat-stroked-button.mat-button-disabled.mat-button-disabled,.mat-stroked-button.mat-primary.mat-button-disabled,.mat-stroked-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay,.mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#0072ff}.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay,.mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#ffc125}.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay,.mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#f44336}.mat-button.mat-button-disabled .mat-button-focus-overlay,.mat-icon-button.mat-button-disabled .mat-button-focus-overlay,.mat-stroked-button.mat-button-disabled .mat-button-focus-overlay{background-color:transparent}.mat-button .mat-ripple-element,.mat-icon-button .mat-ripple-element,.mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}.mat-button-focus-overlay{background:#000}.mat-stroked-button:not(.mat-button-disabled){border-color:rgba(0,0,0,.12)}.mat-fab,.mat-flat-button,.mat-mini-fab,.mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.mat-fab.mat-accent,.mat-fab.mat-primary,.mat-fab.mat-warn,.mat-flat-button.mat-accent,.mat-flat-button.mat-primary,.mat-flat-button.mat-warn,.mat-mini-fab.mat-accent,.mat-mini-fab.mat-primary,.mat-mini-fab.mat-warn,.mat-raised-button.mat-accent,.mat-raised-button.mat-primary,.mat-raised-button.mat-warn{color:#fff}.mat-fab.mat-accent.mat-button-disabled,.mat-fab.mat-button-disabled.mat-button-disabled,.mat-fab.mat-primary.mat-button-disabled,.mat-fab.mat-warn.mat-button-disabled,.mat-flat-button.mat-accent.mat-button-disabled,.mat-flat-button.mat-button-disabled.mat-button-disabled,.mat-flat-button.mat-primary.mat-button-disabled,.mat-flat-button.mat-warn.mat-button-disabled,.mat-mini-fab.mat-accent.mat-button-disabled,.mat-mini-fab.mat-button-disabled.mat-button-disabled,.mat-mini-fab.mat-primary.mat-button-disabled,.mat-mini-fab.mat-warn.mat-button-disabled,.mat-raised-button.mat-accent.mat-button-disabled,.mat-raised-button.mat-button-disabled.mat-button-disabled,.mat-raised-button.mat-primary.mat-button-disabled,.mat-raised-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.mat-fab.mat-primary,.mat-flat-button.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{background-color:#0072ff}.mat-fab.mat-accent,.mat-flat-button.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{background-color:#ffc125}.mat-fab.mat-warn,.mat-flat-button.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{background-color:#f44336}.mat-fab.mat-accent.mat-button-disabled,.mat-fab.mat-button-disabled.mat-button-disabled,.mat-fab.mat-primary.mat-button-disabled,.mat-fab.mat-warn.mat-button-disabled,.mat-flat-button.mat-accent.mat-button-disabled,.mat-flat-button.mat-button-disabled.mat-button-disabled,.mat-flat-button.mat-primary.mat-button-disabled,.mat-flat-button.mat-warn.mat-button-disabled,.mat-mini-fab.mat-accent.mat-button-disabled,.mat-mini-fab.mat-button-disabled.mat-button-disabled,.mat-mini-fab.mat-primary.mat-button-disabled,.mat-mini-fab.mat-warn.mat-button-disabled,.mat-raised-button.mat-accent.mat-button-disabled,.mat-raised-button.mat-button-disabled.mat-button-disabled,.mat-raised-button.mat-primary.mat-button-disabled,.mat-raised-button.mat-warn.mat-button-disabled{background-color:rgba(0,0,0,.12)}.mat-fab.mat-accent .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-fab.mat-warn .mat-ripple-element,.mat-flat-button.mat-accent .mat-ripple-element,.mat-flat-button.mat-primary .mat-ripple-element,.mat-flat-button.mat-warn .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-flat-button:not([class*=mat-elevation-z]),.mat-stroked-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-raised-button:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-raised-button.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]),.mat-mini-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab.mat-button-disabled:not([class*=mat-elevation-z]),.mat-mini-fab.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-button-toggle-group,.mat-button-toggle-standalone{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-button-toggle-group-appearance-standard,.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{box-shadow:none}.mat-button-toggle{color:rgba(0,0,0,.38)}.mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.12)}.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87);background:#fff}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}.mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:1px solid rgba(0,0,0,.12)}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:1px solid rgba(0,0,0,.12)}.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87)}.mat-button-toggle-disabled{color:rgba(0,0,0,.26);background-color:#eee}.mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.mat-button-toggle-group-appearance-standard,.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{border:1px solid rgba(0,0,0,.12)}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{line-height:48px}.mat-card{background:#fff;color:rgba(0,0,0,.87)}.mat-card:not([class*=mat-elevation-z]){box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-card.mat-card-flat:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-card-subtitle{color:rgba(0,0,0,.54)}.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.mat-checkbox-checkmark{fill:#fafafa}.mat-checkbox-checkmark-path{stroke:#fafafa!important}.mat-checkbox-mixedmark{background-color:#fafafa}.mat-checkbox-checked.mat-primary .mat-checkbox-background,.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#0072ff}.mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.mat-checkbox-checked.mat-warn .mat-checkbox-background,.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,.54)}.mat-checkbox .mat-ripple-element{background-color:#000}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#0072ff}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#ffc125}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#f44336}.mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,.87)}.mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.4}.mat-chip.mat-standard-chip:after{background:#000}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#0072ff;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-table{background:#fff}.mat-table-sticky,.mat-table tbody,.mat-table tfoot,.mat-table thead,[mat-footer-row],[mat-header-row],[mat-row],mat-footer-row,mat-header-row,mat-row{background:inherit}mat-footer-row,mat-header-row,mat-row,td.mat-cell,td.mat-footer-cell,th.mat-header-cell{border-bottom-color:rgba(0,0,0,.12)}.mat-header-cell{color:rgba(0,0,0,.54)}.mat-cell,.mat-footer-cell{color:rgba(0,0,0,.87)}.mat-calendar-arrow{fill:rgba(0,0,0,.54)}.mat-datepicker-content .mat-calendar-next-button,.mat-datepicker-content .mat-calendar-previous-button,.mat-datepicker-toggle{color:rgba(0,0,0,.54)}.mat-calendar-table-header{color:rgba(0,0,0,.38)}.mat-calendar-table-header-divider:after{background:rgba(0,0,0,.12)}.mat-calendar-body-label{color:rgba(0,0,0,.54)}.mat-calendar-body-cell-content,.mat-date-range-input-separator{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-form-field-disabled .mat-date-range-input-separator{color:rgba(0,0,0,.38)}.mat-calendar-body-in-preview{color:rgba(0,0,0,.24)}.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.38)}.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.18)}.mat-calendar-body-in-range:before{background:rgba(0,114,255,.2)}.mat-calendar-body-comparison-identical,.mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.mat-calendar-body-comparison-bridge-start:before,[dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(0,114,255,.2) 50%,rgba(249,171,0,.2) 0)}.mat-calendar-body-comparison-bridge-end:before,[dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(0,114,255,.2) 50%,rgba(249,171,0,.2) 0)}.mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-calendar-body-selected{background-color:#0072ff;color:#fff}.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(0,114,255,.4)}.mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(0,114,255,.3)}.mat-datepicker-content{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);background-color:#fff;color:rgba(0,0,0,.87)}.mat-datepicker-content.mat-accent .mat-calendar-body-in-range:before{background:rgba(255,193,37,.2)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-start:before,.mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-end:before,.mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.mat-datepicker-content.mat-accent .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#ffc125;color:#fff}.mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,193,37,.4)}.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content.mat-accent .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-accent .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-accent .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(255,193,37,.3)}.mat-datepicker-content.mat-warn .mat-calendar-body-in-range:before{background:rgba(244,67,54,.2)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-start:before,.mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-end:before,.mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.mat-datepicker-content.mat-warn .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#f44336;color:#fff}.mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(244,67,54,.4)}.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content.mat-warn .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-warn .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-datepicker-content.mat-warn .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(244,67,54,.3)}.mat-datepicker-content-touch{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-datepicker-toggle-active{color:#0072ff}.mat-datepicker-toggle-active.mat-accent{color:#ffc125}.mat-datepicker-toggle-active.mat-warn{color:#f44336}.mat-date-range-input-inner[disabled]{color:rgba(0,0,0,.38)}.mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.mat-divider{border-top-color:rgba(0,0,0,.12)}.mat-divider-vertical{border-right-color:rgba(0,0,0,.12)}.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-action-row{border-top-color:rgba(0,0,0,.12)}.mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true]),.mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true]),.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true]){background:rgba(0,0,0,.04)}@media (hover:none){.mat-expansion-panel:not(.mat-expanded):not([aria-disabled=true]) .mat-expansion-panel-header:hover{background:#fff}}.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.mat-expansion-indicator:after,.mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.26)}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.mat-expansion-panel-header{height:48px}.mat-expansion-panel-header.mat-expanded{height:64px}.mat-form-field-label,.mat-hint{color:rgba(0,0,0,.6)}.mat-form-field.mat-focused .mat-form-field-label{color:#0072ff}.mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.mat-focused .mat-form-field-required-marker{color:#ffc125}.mat-form-field-ripple{background-color:rgba(0,0,0,.87)}.mat-form-field.mat-focused .mat-form-field-ripple{background-color:#0072ff}.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#ffc125}.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#f44336}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix:after{color:#0072ff}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix:after{color:#ffc125}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix:after,.mat-form-field.mat-form-field-invalid .mat-form-field-label,.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,.mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker{color:#f44336}.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#f44336}.mat-error{color:#f44336}.mat-form-field-appearance-legacy .mat-form-field-label,.mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,.54)}.mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,.04)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,.02)}.mat-form-field-appearance-fill .mat-form-field-underline:before{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline:before{background-color:transparent}.mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,.12)}.mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,.87)}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#0072ff}.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#ffc125}.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick,.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#f44336}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,.06)}.mat-icon.mat-primary{color:#0072ff}.mat-icon.mat-accent{color:#ffc125}.mat-icon.mat-warn{color:#f44336}.mat-form-field-type-mat-native-select .mat-form-field-infix:after{color:rgba(0,0,0,.54)}.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix:after,.mat-input-element:disabled{color:rgba(0,0,0,.38)}.mat-input-element{caret-color:#0072ff}.mat-input-element::placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-form-field.mat-accent .mat-input-element{caret-color:#ffc125}.mat-form-field-invalid .mat-input-element,.mat-form-field.mat-warn .mat-input-element{caret-color:#f44336}.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix:after{color:#f44336}.mat-list-base .mat-list-item,.mat-list-base .mat-list-option{color:rgba(0,0,0,.87)}.mat-list-base .mat-subheader{color:rgba(0,0,0,.54)}.mat-list-item-disabled{background-color:#eee}.mat-action-list .mat-list-item:focus,.mat-action-list .mat-list-item:hover,.mat-list-option:focus,.mat-list-option:hover,.mat-nav-list .mat-list-item:focus,.mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.mat-list-single-selected-option,.mat-list-single-selected-option:focus,.mat-list-single-selected-option:hover{background:rgba(0,0,0,.12)}.mat-menu-panel{background:#fff}.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-menu-item{background:transparent;color:rgba(0,0,0,.87)}.mat-menu-item[disabled],.mat-menu-item[disabled] .mat-icon-no-color,.mat-menu-item[disabled] .mat-menu-submenu-icon{color:rgba(0,0,0,.38)}.mat-menu-item .mat-icon-no-color,.mat-menu-submenu-icon{color:rgba(0,0,0,.54)}.mat-menu-item-highlighted:not([disabled]),.mat-menu-item.cdk-keyboard-focused:not([disabled]),.mat-menu-item.cdk-program-focused:not([disabled]),.mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.mat-paginator{background:#fff}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.mat-paginator-first,.mat-paginator-last{border-top:2px solid rgba(0,0,0,.54)}.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-first,.mat-icon-button[disabled] .mat-paginator-increment,.mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,.38)}.mat-paginator-container{min-height:56px}.mat-progress-bar-background{fill:#bcd8fb}.mat-progress-bar-buffer{background-color:#bcd8fb}.mat-progress-bar-fill:after{background-color:#0072ff}.mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#fbecc5}.mat-progress-bar.mat-accent .mat-progress-bar-buffer{background-color:#fbecc5}.mat-progress-bar.mat-accent .mat-progress-bar-fill:after{background-color:#ffc125}.mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#f9ccc9}.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#f9ccc9}.mat-progress-bar.mat-warn .mat-progress-bar-fill:after{background-color:#f44336}.mat-progress-spinner circle,.mat-spinner circle{stroke:#0072ff}.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ffc125}.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#0072ff}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-primary .mat-radio-inner-circle,.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#0072ff}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-accent .mat-radio-inner-circle,.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#ffc125}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-warn .mat-radio-inner-circle,.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#f44336}.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle,.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.mat-radio-button .mat-ripple-element{background-color:#000}.mat-select-value{color:rgba(0,0,0,.87)}.mat-select-placeholder{color:rgba(0,0,0,.42)}.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.mat-select-arrow{color:rgba(0,0,0,.54)}.mat-select-panel{background:#fff}.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#0072ff}.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.mat-form-field.mat-focused.mat-warn .mat-select-arrow,.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#f44336}.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-drawer{color:rgba(0,0,0,.87)}.mat-drawer,.mat-drawer.mat-drawer-push{background-color:#fff}.mat-drawer:not(.mat-drawer-side){box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-drawer-side{border-right:1px solid rgba(0,0,0,.12)}.mat-drawer-side.mat-drawer-end,[dir=rtl] .mat-drawer-side{border-left:1px solid rgba(0,0,0,.12);border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#ffc125}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(255,193,37,.54)}.mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#ffc125}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#0072ff}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:rgba(0,114,255,.54)}.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#0072ff}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#f44336}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(244,67,54,.54)}.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#f44336}.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}.mat-slide-toggle-thumb{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa}.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label,.mat-primary .mat-slider-track-fill{background-color:#0072ff}.mat-primary .mat-slider-thumb-label-text{color:#fff}.mat-primary .mat-slider-focus-ring{background-color:rgba(0,114,255,.2)}.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label,.mat-accent .mat-slider-track-fill{background-color:#ffc125}.mat-accent .mat-slider-thumb-label-text{color:#fff}.mat-accent .mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label,.mat-warn .mat-slider-track-fill{background-color:#f44336}.mat-warn .mat-slider-thumb-label-text{color:#fff}.mat-warn .mat-slider-focus-ring{background-color:rgba(244,67,54,.2)}.mat-slider.cdk-focused .mat-slider-track-background,.mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.mat-slider-disabled .mat-slider-thumb,.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.mat-slider-has-ticks .mat-slider-wrapper:after{border-color:rgba(0,0,0,.7)}.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(90deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(180deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover:not([aria-disabled]),.mat-step-header:hover[aria-disabled=false]{background-color:rgba(0,0,0,.04)}.mat-step-header:hover[aria-disabled=true]{cursor:default}@media (hover:none){.mat-step-header:hover{background:none}}.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.54)}.mat-step-header .mat-step-icon{background-color:rgba(0,0,0,.54);color:#fff}.mat-step-header .mat-step-icon-selected,.mat-step-header .mat-step-icon-state-done,.mat-step-header .mat-step-icon-state-edit{background-color:#0072ff;color:#fff}.mat-step-header.mat-accent .mat-step-icon{color:#fff}.mat-step-header.mat-accent .mat-step-icon-selected,.mat-step-header.mat-accent .mat-step-icon-state-done,.mat-step-header.mat-accent .mat-step-icon-state-edit{background-color:#ffc125;color:#fff}.mat-step-header.mat-warn .mat-step-icon{color:#fff}.mat-step-header.mat-warn .mat-step-icon-selected,.mat-step-header.mat-warn .mat-step-icon-state-done,.mat-step-header.mat-warn .mat-step-icon-state-edit{background-color:#f44336;color:#fff}.mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#f44336}.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.mat-step-header .mat-step-label.mat-step-label-error{color:#f44336}.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}.mat-stepper-vertical-line:before{border-left-color:rgba(0,0,0,.12)}.mat-horizontal-stepper-header:after,.mat-horizontal-stepper-header:before,.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.mat-horizontal-stepper-header{height:72px}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header,.mat-vertical-stepper-header{padding:24px}.mat-stepper-vertical-line:before{top:-16px;bottom:-16px}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:after,.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:before,.mat-stepper-label-position-bottom .mat-stepper-horizontal-line{top:36px}.mat-sort-header-arrow{color:#757575}.mat-tab-header,.mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.mat-tab-group-inverted-header .mat-tab-header,.mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#0072ff}.mat-tab-group.mat-primary.mat-background-primary>.mat-tab-header .mat-ink-bar,.mat-tab-group.mat-primary.mat-background-primary>.mat-tab-link-container .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary>.mat-tab-header .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary>.mat-tab-link-container .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.mat-tab-group.mat-accent.mat-background-accent>.mat-tab-header .mat-ink-bar,.mat-tab-group.mat-accent.mat-background-accent>.mat-tab-link-container .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent>.mat-tab-header .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent>.mat-tab-link-container .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.mat-tab-group.mat-warn.mat-background-warn>.mat-tab-header .mat-ink-bar,.mat-tab-group.mat-warn.mat-background-warn>.mat-tab-link-container .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn>.mat-tab-header .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn>.mat-tab-link-container .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-background-primary>.mat-tab-header,.mat-tab-group.mat-background-primary>.mat-tab-header-pagination,.mat-tab-group.mat-background-primary>.mat-tab-link-container,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container{background-color:#0072ff}.mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-label,.mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-tab-link,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-label,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-tab-link{color:#fff}.mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-primary>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-primary>.mat-tab-header .mat-focus-indicator:before,.mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-focus-indicator:before,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-focus-indicator:before,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-focus-indicator:before{border-color:#fff}.mat-tab-group.mat-background-primary>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-primary>.mat-tab-header-pagination .mat-ripple-element,.mat-tab-group.mat-background-primary>.mat-tab-header .mat-ripple-element,.mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-background-accent>.mat-tab-header,.mat-tab-group.mat-background-accent>.mat-tab-header-pagination,.mat-tab-group.mat-background-accent>.mat-tab-link-container,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container{background-color:#ffc125}.mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-label,.mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-tab-link,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-label,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-tab-link{color:#fff}.mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-accent>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-accent>.mat-tab-header .mat-focus-indicator:before,.mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-focus-indicator:before,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-focus-indicator:before,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-focus-indicator:before{border-color:#fff}.mat-tab-group.mat-background-accent>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-accent>.mat-tab-header-pagination .mat-ripple-element,.mat-tab-group.mat-background-accent>.mat-tab-header .mat-ripple-element,.mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-background-warn>.mat-tab-header,.mat-tab-group.mat-background-warn>.mat-tab-header-pagination,.mat-tab-group.mat-background-warn>.mat-tab-link-container,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container{background-color:#f44336}.mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-label,.mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-tab-link,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-label,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-tab-link{color:#fff}.mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-warn>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-warn>.mat-tab-header .mat-focus-indicator:before,.mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-focus-indicator:before,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-focus-indicator:before,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-focus-indicator:before{border-color:#fff}.mat-tab-group.mat-background-warn>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-warn>.mat-tab-header-pagination .mat-ripple-element,.mat-tab-group.mat-background-warn>.mat-tab-header .mat-ripple-element,.mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.mat-toolbar.mat-primary{background:#0072ff;color:#fff}.mat-toolbar.mat-accent{background:#ffc125;color:#fff}.mat-toolbar.mat-warn{background:#f44336;color:#fff}.mat-toolbar .mat-focused .mat-form-field-ripple,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-form-field-underline{background-color:currentColor}.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-select-value{color:inherit}.mat-toolbar .mat-input-element{caret-color:currentColor}.mat-toolbar-multiple-rows{min-height:64px}.mat-toolbar-row,.mat-toolbar-single-row{height:64px}@media (max-width:599px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}.mat-tooltip{background:rgba(97,97,97,.9)}.mat-tree{background:#fff}.mat-nested-tree-node,.mat-tree-node{color:rgba(0,0,0,.87)}.mat-tree-node{min-height:48px}.mat-snack-bar-container{color:hsla(0,0%,100%,.7);background:#323232;box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-simple-snackbar-action{color:#ffc125}.light-button-theme .mat-ripple-element{background-color:rgba(0,0,0,.1)}.light-button-theme .mat-option{color:rgba(0,0,0,.87)}.light-button-theme .mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled),.light-button-theme .mat-option:focus:not(.mat-option-disabled),.light-button-theme .mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.light-button-theme .mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.light-button-theme .mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.light-button-theme .mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#777}.light-button-theme .mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.light-button-theme .mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.light-button-theme .mat-optgroup-label{color:rgba(0,0,0,.54)}.light-button-theme .mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.light-button-theme .mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.light-button-theme .mat-pseudo-checkbox:after{color:#fafafa}.light-button-theme .mat-pseudo-checkbox-disabled{color:#b0b0b0}.light-button-theme .mat-primary .mat-pseudo-checkbox-checked,.light-button-theme .mat-primary .mat-pseudo-checkbox-indeterminate{background:#777}.light-button-theme .mat-accent .mat-pseudo-checkbox-checked,.light-button-theme .mat-accent .mat-pseudo-checkbox-indeterminate,.light-button-theme .mat-pseudo-checkbox-checked,.light-button-theme .mat-pseudo-checkbox-indeterminate{background:#ffc125}.light-button-theme .mat-warn .mat-pseudo-checkbox-checked,.light-button-theme .mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.light-button-theme .mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.light-button-theme .mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.light-button-theme.mat-app-background,.light-button-theme .mat-app-background{background-color:#fafafa;color:rgba(0,0,0,.87)}.light-button-theme .mat-elevation-z0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-theme-loaded-marker{display:none}.light-button-theme .mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.light-button-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.light-button-theme .mat-badge-content{color:#777;background:#777}.cdk-high-contrast-active .light-button-theme .mat-badge-content{outline:1px solid;border-radius:0}.light-button-theme .mat-badge-accent .mat-badge-content{background:#ffc125;color:#fff}.light-button-theme .mat-badge-warn .mat-badge-content{color:#fff;background:#f44336}.light-button-theme .mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,.38)}.light-button-theme .mat-bottom-sheet-container{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-button,.light-button-theme .mat-icon-button,.light-button-theme .mat-stroked-button{color:inherit;background:transparent}.light-button-theme .mat-button.mat-primary,.light-button-theme .mat-icon-button.mat-primary,.light-button-theme .mat-stroked-button.mat-primary{color:#777}.light-button-theme .mat-button.mat-accent,.light-button-theme .mat-icon-button.mat-accent,.light-button-theme .mat-stroked-button.mat-accent{color:#ffc125}.light-button-theme .mat-button.mat-warn,.light-button-theme .mat-icon-button.mat-warn,.light-button-theme .mat-stroked-button.mat-warn{color:#f44336}.light-button-theme .mat-button.mat-accent.mat-button-disabled,.light-button-theme .mat-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-button.mat-primary.mat-button-disabled,.light-button-theme .mat-button.mat-warn.mat-button-disabled,.light-button-theme .mat-icon-button.mat-accent.mat-button-disabled,.light-button-theme .mat-icon-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-icon-button.mat-primary.mat-button-disabled,.light-button-theme .mat-icon-button.mat-warn.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-accent.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-primary.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.light-button-theme .mat-button.mat-primary .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-primary .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#777}.light-button-theme .mat-button.mat-accent .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-accent .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#ffc125}.light-button-theme .mat-button.mat-warn .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-warn .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#f44336}.light-button-theme .mat-button.mat-button-disabled .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-button-disabled .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-button-disabled .mat-button-focus-overlay{background-color:transparent}.light-button-theme .mat-button .mat-ripple-element,.light-button-theme .mat-icon-button .mat-ripple-element,.light-button-theme .mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}.light-button-theme .mat-button-focus-overlay{background:#000}.light-button-theme .mat-stroked-button:not(.mat-button-disabled){border-color:rgba(0,0,0,.12)}.light-button-theme .mat-fab,.light-button-theme .mat-flat-button,.light-button-theme .mat-mini-fab,.light-button-theme .mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.light-button-theme .mat-fab.mat-primary,.light-button-theme .mat-flat-button.mat-primary,.light-button-theme .mat-mini-fab.mat-primary,.light-button-theme .mat-raised-button.mat-primary{color:#777}.light-button-theme .mat-fab.mat-accent,.light-button-theme .mat-fab.mat-warn,.light-button-theme .mat-flat-button.mat-accent,.light-button-theme .mat-flat-button.mat-warn,.light-button-theme .mat-mini-fab.mat-accent,.light-button-theme .mat-mini-fab.mat-warn,.light-button-theme .mat-raised-button.mat-accent,.light-button-theme .mat-raised-button.mat-warn{color:#fff}.light-button-theme .mat-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-flat-button.mat-accent.mat-button-disabled,.light-button-theme .mat-flat-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-flat-button.mat-primary.mat-button-disabled,.light-button-theme .mat-flat-button.mat-warn.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-raised-button.mat-accent.mat-button-disabled,.light-button-theme .mat-raised-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-raised-button.mat-primary.mat-button-disabled,.light-button-theme .mat-raised-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.light-button-theme .mat-fab.mat-primary,.light-button-theme .mat-flat-button.mat-primary,.light-button-theme .mat-mini-fab.mat-primary,.light-button-theme .mat-raised-button.mat-primary{background-color:#777}.light-button-theme .mat-fab.mat-accent,.light-button-theme .mat-flat-button.mat-accent,.light-button-theme .mat-mini-fab.mat-accent,.light-button-theme .mat-raised-button.mat-accent{background-color:#ffc125}.light-button-theme .mat-fab.mat-warn,.light-button-theme .mat-flat-button.mat-warn,.light-button-theme .mat-mini-fab.mat-warn,.light-button-theme .mat-raised-button.mat-warn{background-color:#f44336}.light-button-theme .mat-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-flat-button.mat-accent.mat-button-disabled,.light-button-theme .mat-flat-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-flat-button.mat-primary.mat-button-disabled,.light-button-theme .mat-flat-button.mat-warn.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-raised-button.mat-accent.mat-button-disabled,.light-button-theme .mat-raised-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-raised-button.mat-primary.mat-button-disabled,.light-button-theme .mat-raised-button.mat-warn.mat-button-disabled{background-color:rgba(0,0,0,.12)}.light-button-theme .mat-fab.mat-primary .mat-ripple-element,.light-button-theme .mat-flat-button.mat-primary .mat-ripple-element,.light-button-theme .mat-mini-fab.mat-primary .mat-ripple-element,.light-button-theme .mat-raised-button.mat-primary .mat-ripple-element{background-color:hsla(0,0%,47%,.1)}.light-button-theme .mat-fab.mat-accent .mat-ripple-element,.light-button-theme .mat-fab.mat-warn .mat-ripple-element,.light-button-theme .mat-flat-button.mat-accent .mat-ripple-element,.light-button-theme .mat-flat-button.mat-warn .mat-ripple-element,.light-button-theme .mat-mini-fab.mat-accent .mat-ripple-element,.light-button-theme .mat-mini-fab.mat-warn .mat-ripple-element,.light-button-theme .mat-raised-button.mat-accent .mat-ripple-element,.light-button-theme .mat-raised-button.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.light-button-theme .mat-flat-button:not([class*=mat-elevation-z]),.light-button-theme .mat-stroked-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-raised-button:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.light-button-theme .mat-raised-button.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-fab:not([class*=mat-elevation-z]),.light-button-theme .mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.light-button-theme .mat-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]),.light-button-theme .mat-mini-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.light-button-theme .mat-fab.mat-button-disabled:not([class*=mat-elevation-z]),.light-button-theme .mat-mini-fab.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-group,.light-button-theme .mat-button-toggle-standalone{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-group-appearance-standard,.light-button-theme .mat-button-toggle-standalone.mat-button-toggle-appearance-standard{box-shadow:none}.light-button-theme .mat-button-toggle{color:rgba(0,0,0,.38)}.light-button-theme .mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87);background:#fff}.light-button-theme .mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}.light-button-theme .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:1px solid rgba(0,0,0,.12)}.light-button-theme [dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.light-button-theme .mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87)}.light-button-theme .mat-button-toggle-disabled{color:rgba(0,0,0,.26);background-color:#eee}.light-button-theme .mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}.light-button-theme .mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.light-button-theme .mat-button-toggle-group-appearance-standard,.light-button-theme .mat-button-toggle-standalone.mat-button-toggle-appearance-standard{border:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-card{background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-card:not([class*=mat-elevation-z]){box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.light-button-theme .mat-card.mat-card-flat:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-card-subtitle{color:rgba(0,0,0,.54)}.light-button-theme .mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.light-button-theme .mat-checkbox-checkmark{fill:#fafafa}.light-button-theme .mat-checkbox-checkmark-path{stroke:#fafafa!important}.light-button-theme .mat-checkbox-mixedmark{background-color:#fafafa}.light-button-theme .mat-checkbox-checked.mat-primary .mat-checkbox-background,.light-button-theme .mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#777}.light-button-theme .mat-checkbox-checked.mat-accent .mat-checkbox-background,.light-button-theme .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.light-button-theme .mat-checkbox-checked.mat-warn .mat-checkbox-background,.light-button-theme .mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.light-button-theme .mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.light-button-theme .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.light-button-theme .mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.light-button-theme .mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,.54)}.light-button-theme .mat-checkbox .mat-ripple-element{background-color:#000}.light-button-theme .mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.light-button-theme .mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#777}.light-button-theme .mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.light-button-theme .mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#ffc125}.light-button-theme .mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.light-button-theme .mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#f44336}.light-button-theme .mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,.87)}.light-button-theme .mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.light-button-theme .mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.light-button-theme .mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:.54}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.4}.light-button-theme .mat-chip.mat-standard-chip:after{background:#000}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#777;color:#777}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#777;opacity:.4}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background-color:hsla(0,0%,47%,.1)}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.light-button-theme .mat-table{background:#fff}.light-button-theme .mat-table-sticky,.light-button-theme .mat-table tbody,.light-button-theme .mat-table tfoot,.light-button-theme .mat-table thead,.light-button-theme [mat-footer-row],.light-button-theme [mat-header-row],.light-button-theme [mat-row],.light-button-theme mat-footer-row,.light-button-theme mat-header-row,.light-button-theme mat-row{background:inherit}.light-button-theme mat-footer-row,.light-button-theme mat-header-row,.light-button-theme mat-row,.light-button-theme td.mat-cell,.light-button-theme td.mat-footer-cell,.light-button-theme th.mat-header-cell{border-bottom-color:rgba(0,0,0,.12)}.light-button-theme .mat-header-cell{color:rgba(0,0,0,.54)}.light-button-theme .mat-cell,.light-button-theme .mat-footer-cell{color:rgba(0,0,0,.87)}.light-button-theme .mat-calendar-arrow{fill:rgba(0,0,0,.54)}.light-button-theme .mat-datepicker-content .mat-calendar-next-button,.light-button-theme .mat-datepicker-content .mat-calendar-previous-button,.light-button-theme .mat-datepicker-toggle{color:rgba(0,0,0,.54)}.light-button-theme .mat-calendar-table-header{color:rgba(0,0,0,.38)}.light-button-theme .mat-calendar-table-header-divider:after{background:rgba(0,0,0,.12)}.light-button-theme .mat-calendar-body-label{color:rgba(0,0,0,.54)}.light-button-theme .mat-calendar-body-cell-content,.light-button-theme .mat-date-range-input-separator{color:rgba(0,0,0,.87);border-color:transparent}.light-button-theme .mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .mat-form-field-disabled .mat-date-range-input-separator{color:rgba(0,0,0,.38)}.light-button-theme .mat-calendar-body-in-preview{color:rgba(0,0,0,.24)}.light-button-theme .mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.38)}.light-button-theme .mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.18)}.light-button-theme .mat-calendar-body-in-range:before{background:hsla(0,0%,47%,.2)}.light-button-theme .mat-calendar-body-comparison-identical,.light-button-theme .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.light-button-theme .mat-calendar-body-comparison-bridge-start:before,.light-button-theme [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,hsla(0,0%,47%,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-calendar-body-comparison-bridge-end:before,.light-button-theme [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,hsla(0,0%,47%,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.light-button-theme .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.light-button-theme .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.light-button-theme .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.light-button-theme .mat-calendar-body-selected{background-color:#777;color:#777}.light-button-theme .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:hsla(0,0%,47%,.4)}.light-button-theme .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #777}.light-button-theme .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:hsla(0,0%,47%,.3)}.light-button-theme .mat-datepicker-content{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);background-color:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-range:before{background:rgba(255,193,37,.2)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical,.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-start:before,.light-button-theme .mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-end:before,.light-button-theme .mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#ffc125;color:#fff}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,193,37,.4)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.light-button-theme .mat-datepicker-content.mat-accent .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .mat-datepicker-content.mat-accent .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(255,193,37,.3)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-range:before{background:rgba(244,67,54,.2)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical,.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-start:before,.light-button-theme .mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-end:before,.light-button-theme .mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#f44336;color:#fff}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(244,67,54,.4)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.light-button-theme .mat-datepicker-content.mat-warn .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .mat-datepicker-content.mat-warn .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(244,67,54,.3)}.light-button-theme .mat-datepicker-content-touch{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.light-button-theme .mat-datepicker-toggle-active{color:#777}.light-button-theme .mat-datepicker-toggle-active.mat-accent{color:#ffc125}.light-button-theme .mat-datepicker-toggle-active.mat-warn{color:#f44336}.light-button-theme .mat-date-range-input-inner[disabled]{color:rgba(0,0,0,.38)}.light-button-theme .mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-divider{border-top-color:rgba(0,0,0,.12)}.light-button-theme .mat-divider-vertical{border-right-color:rgba(0,0,0,.12)}.light-button-theme .mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-action-row{border-top-color:rgba(0,0,0,.12)}.light-button-theme .mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true]),.light-button-theme .mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true]),.light-button-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true]){background:rgba(0,0,0,.04)}@media (hover:none){.light-button-theme .mat-expansion-panel:not(.mat-expanded):not([aria-disabled=true]) .mat-expansion-panel-header:hover{background:#fff}}.light-button-theme .mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.light-button-theme .mat-expansion-indicator:after,.light-button-theme .mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.light-button-theme .mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.26)}.light-button-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.light-button-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.light-button-theme .mat-form-field-label,.light-button-theme .mat-hint{color:rgba(0,0,0,.6)}.light-button-theme .mat-form-field.mat-focused .mat-form-field-label{color:#777}.light-button-theme .mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.light-button-theme .mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.light-button-theme .mat-focused .mat-form-field-required-marker{color:#ffc125}.light-button-theme .mat-form-field-ripple{background-color:rgba(0,0,0,.87)}.light-button-theme .mat-form-field.mat-focused .mat-form-field-ripple{background-color:#777}.light-button-theme .mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#ffc125}.light-button-theme .mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#f44336}.light-button-theme .mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix:after{color:#777}.light-button-theme .mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix:after{color:#ffc125}.light-button-theme .mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix:after,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-label,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker{color:#f44336}.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#f44336}.light-button-theme .mat-error{color:#f44336}.light-button-theme .mat-form-field-appearance-legacy .mat-form-field-label,.light-button-theme .mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,.54)}.light-button-theme .mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.light-button-theme .mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.light-button-theme .mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,.04)}.light-button-theme .mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,.02)}.light-button-theme .mat-form-field-appearance-fill .mat-form-field-underline:before{background-color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.light-button-theme .mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline:before{background-color:transparent}.light-button-theme .mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,.12)}.light-button-theme .mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,.87)}.light-button-theme .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#777}.light-button-theme .mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#ffc125}.light-button-theme .mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick,.light-button-theme .mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#f44336}.light-button-theme .mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.light-button-theme .mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,.06)}.light-button-theme .mat-icon.mat-primary{color:#777}.light-button-theme .mat-icon.mat-accent{color:#ffc125}.light-button-theme .mat-icon.mat-warn{color:#f44336}.light-button-theme .mat-form-field-type-mat-native-select .mat-form-field-infix:after{color:rgba(0,0,0,.54)}.light-button-theme .mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix:after,.light-button-theme .mat-input-element:disabled{color:rgba(0,0,0,.38)}.light-button-theme .mat-input-element{caret-color:#777}.light-button-theme .mat-input-element::placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field.mat-accent .mat-input-element{caret-color:#ffc125}.light-button-theme .mat-form-field-invalid .mat-input-element,.light-button-theme .mat-form-field.mat-warn .mat-input-element{caret-color:#f44336}.light-button-theme .mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix:after{color:#f44336}.light-button-theme .mat-list-base .mat-list-item,.light-button-theme .mat-list-base .mat-list-option{color:rgba(0,0,0,.87)}.light-button-theme .mat-list-base .mat-subheader{color:rgba(0,0,0,.54)}.light-button-theme .mat-list-item-disabled{background-color:#eee}.light-button-theme .mat-action-list .mat-list-item:focus,.light-button-theme .mat-action-list .mat-list-item:hover,.light-button-theme .mat-list-option:focus,.light-button-theme .mat-list-option:hover,.light-button-theme .mat-nav-list .mat-list-item:focus,.light-button-theme .mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.light-button-theme .mat-list-single-selected-option,.light-button-theme .mat-list-single-selected-option:focus,.light-button-theme .mat-list-single-selected-option:hover{background:rgba(0,0,0,.12)}.light-button-theme .mat-menu-panel{background:#fff}.light-button-theme .mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-menu-item{background:transparent;color:rgba(0,0,0,.87)}.light-button-theme .mat-menu-item[disabled],.light-button-theme .mat-menu-item[disabled] .mat-icon-no-color,.light-button-theme .mat-menu-item[disabled] .mat-menu-submenu-icon{color:rgba(0,0,0,.38)}.light-button-theme .mat-menu-item .mat-icon-no-color,.light-button-theme .mat-menu-submenu-icon{color:rgba(0,0,0,.54)}.light-button-theme .mat-menu-item-highlighted:not([disabled]),.light-button-theme .mat-menu-item.cdk-keyboard-focused:not([disabled]),.light-button-theme .mat-menu-item.cdk-program-focused:not([disabled]),.light-button-theme .mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.light-button-theme .mat-paginator{background:#fff}.light-button-theme .mat-paginator,.light-button-theme .mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.light-button-theme .mat-paginator-decrement,.light-button-theme .mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.light-button-theme .mat-paginator-first,.light-button-theme .mat-paginator-last{border-top:2px solid rgba(0,0,0,.54)}.light-button-theme .mat-icon-button[disabled] .mat-paginator-decrement,.light-button-theme .mat-icon-button[disabled] .mat-paginator-first,.light-button-theme .mat-icon-button[disabled] .mat-paginator-increment,.light-button-theme .mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-progress-bar-background{fill:#d9d9d9}.light-button-theme .mat-progress-bar-buffer{background-color:#d9d9d9}.light-button-theme .mat-progress-bar-fill:after{background-color:#777}.light-button-theme .mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#fbecc5}.light-button-theme .mat-progress-bar.mat-accent .mat-progress-bar-buffer{background-color:#fbecc5}.light-button-theme .mat-progress-bar.mat-accent .mat-progress-bar-fill:after{background-color:#ffc125}.light-button-theme .mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#f9ccc9}.light-button-theme .mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#f9ccc9}.light-button-theme .mat-progress-bar.mat-warn .mat-progress-bar-fill:after{background-color:#f44336}.light-button-theme .mat-progress-spinner circle,.light-button-theme .mat-spinner circle{stroke:#777}.light-button-theme .mat-progress-spinner.mat-accent circle,.light-button-theme .mat-spinner.mat-accent circle{stroke:#ffc125}.light-button-theme .mat-progress-spinner.mat-warn circle,.light-button-theme .mat-spinner.mat-warn circle{stroke:#f44336}.light-button-theme .mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.light-button-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#777}.light-button-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.light-button-theme .mat-radio-button.mat-primary .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.light-button-theme .mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#777}.light-button-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.light-button-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.light-button-theme .mat-radio-button.mat-accent .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.light-button-theme .mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#ffc125}.light-button-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.light-button-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.light-button-theme .mat-radio-button.mat-warn .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.light-button-theme .mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#f44336}.light-button-theme .mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.light-button-theme .mat-radio-button .mat-ripple-element{background-color:#000}.light-button-theme .mat-select-value{color:rgba(0,0,0,.87)}.light-button-theme .mat-select-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.light-button-theme .mat-select-arrow{color:rgba(0,0,0,.54)}.light-button-theme .mat-select-panel{background:#fff}.light-button-theme .mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.light-button-theme .mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#777}.light-button-theme .mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.light-button-theme .mat-form-field.mat-focused.mat-warn .mat-select-arrow,.light-button-theme .mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#f44336}.light-button-theme .mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.light-button-theme .mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.light-button-theme .mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-drawer.mat-drawer-push{background-color:#fff}.light-button-theme .mat-drawer:not(.mat-drawer-side){box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.light-button-theme .mat-drawer-side{border-right:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-drawer-side.mat-drawer-end,.light-button-theme [dir=rtl] .mat-drawer-side{border-left:1px solid rgba(0,0,0,.12);border-right:none}.light-button-theme [dir=rtl] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.light-button-theme .mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#ffc125}.light-button-theme .mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(255,193,37,.54)}.light-button-theme .mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#ffc125}.light-button-theme .mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#777}.light-button-theme .mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:hsla(0,0%,47%,.54)}.light-button-theme .mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#777}.light-button-theme .mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#f44336}.light-button-theme .mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(244,67,54,.54)}.light-button-theme .mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#f44336}.light-button-theme .mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}.light-button-theme .mat-slide-toggle-thumb{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa}.light-button-theme .mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.light-button-theme .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.light-button-theme .mat-primary .mat-slider-thumb,.light-button-theme .mat-primary .mat-slider-thumb-label,.light-button-theme .mat-primary .mat-slider-track-fill{background-color:#777}.light-button-theme .mat-primary .mat-slider-thumb-label-text{color:#777}.light-button-theme .mat-primary .mat-slider-focus-ring{background-color:hsla(0,0%,47%,.2)}.light-button-theme .mat-accent .mat-slider-thumb,.light-button-theme .mat-accent .mat-slider-thumb-label,.light-button-theme .mat-accent .mat-slider-track-fill{background-color:#ffc125}.light-button-theme .mat-accent .mat-slider-thumb-label-text{color:#fff}.light-button-theme .mat-accent .mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.light-button-theme .mat-warn .mat-slider-thumb,.light-button-theme .mat-warn .mat-slider-thumb-label,.light-button-theme .mat-warn .mat-slider-track-fill{background-color:#f44336}.light-button-theme .mat-warn .mat-slider-thumb-label-text{color:#fff}.light-button-theme .mat-warn .mat-slider-focus-ring{background-color:rgba(244,67,54,.2)}.light-button-theme .mat-slider.cdk-focused .mat-slider-track-background,.light-button-theme .mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.light-button-theme .mat-slider-disabled .mat-slider-thumb,.light-button-theme .mat-slider-disabled .mat-slider-track-background,.light-button-theme .mat-slider-disabled .mat-slider-track-fill,.light-button-theme .mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.light-button-theme .mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.light-button-theme .mat-slider-has-ticks .mat-slider-wrapper:after{border-color:rgba(0,0,0,.7)}.light-button-theme .mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(90deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.light-button-theme .mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(180deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.light-button-theme .mat-step-header.cdk-keyboard-focused,.light-button-theme .mat-step-header.cdk-program-focused,.light-button-theme .mat-step-header:hover:not([aria-disabled]),.light-button-theme .mat-step-header:hover[aria-disabled=false]{background-color:rgba(0,0,0,.04)}.light-button-theme .mat-step-header:hover[aria-disabled=true]{cursor:default}@media (hover:none){.light-button-theme .mat-step-header:hover{background:none}}.light-button-theme .mat-step-header .mat-step-label,.light-button-theme .mat-step-header .mat-step-optional{color:rgba(0,0,0,.54)}.light-button-theme .mat-step-header .mat-step-icon{background-color:rgba(0,0,0,.54);color:#777}.light-button-theme .mat-step-header .mat-step-icon-selected,.light-button-theme .mat-step-header .mat-step-icon-state-done,.light-button-theme .mat-step-header .mat-step-icon-state-edit{background-color:#777;color:#777}.light-button-theme .mat-step-header.mat-accent .mat-step-icon{color:#fff}.light-button-theme .mat-step-header.mat-accent .mat-step-icon-selected,.light-button-theme .mat-step-header.mat-accent .mat-step-icon-state-done,.light-button-theme .mat-step-header.mat-accent .mat-step-icon-state-edit{background-color:#ffc125;color:#fff}.light-button-theme .mat-step-header.mat-warn .mat-step-icon{color:#fff}.light-button-theme .mat-step-header.mat-warn .mat-step-icon-selected,.light-button-theme .mat-step-header.mat-warn .mat-step-icon-state-done,.light-button-theme .mat-step-header.mat-warn .mat-step-icon-state-edit{background-color:#f44336;color:#fff}.light-button-theme .mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#f44336}.light-button-theme .mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.light-button-theme .mat-step-header .mat-step-label.mat-step-label-error{color:#f44336}.light-button-theme .mat-stepper-horizontal,.light-button-theme .mat-stepper-vertical{background-color:#fff}.light-button-theme .mat-stepper-vertical-line:before{border-left-color:rgba(0,0,0,.12)}.light-button-theme .mat-horizontal-stepper-header:after,.light-button-theme .mat-horizontal-stepper-header:before,.light-button-theme .mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.light-button-theme .mat-sort-header-arrow{color:#757575}.light-button-theme .mat-tab-header,.light-button-theme .mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-tab-group-inverted-header .mat-tab-header,.light-button-theme .mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.light-button-theme .mat-tab-label,.light-button-theme .mat-tab-link{color:rgba(0,0,0,.87)}.light-button-theme .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.light-button-theme .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.light-button-theme .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-tab-group[class*=mat-background-] .mat-tab-header,.light-button-theme .mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.light-button-theme .mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:hsla(0,0%,47%,.3)}.light-button-theme .mat-tab-group.mat-primary.mat-background-primary>.mat-tab-header .mat-ink-bar,.light-button-theme .mat-tab-group.mat-primary.mat-background-primary>.mat-tab-link-container .mat-ink-bar,.light-button-theme .mat-tab-group.mat-primary .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-primary.mat-background-primary>.mat-tab-header .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-primary.mat-background-primary>.mat-tab-link-container .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#777}.light-button-theme .mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.light-button-theme .mat-tab-group.mat-accent .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.light-button-theme .mat-tab-group.mat-accent.mat-background-accent>.mat-tab-header .mat-ink-bar,.light-button-theme .mat-tab-group.mat-accent.mat-background-accent>.mat-tab-link-container .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-accent.mat-background-accent>.mat-tab-header .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-accent.mat-background-accent>.mat-tab-link-container .mat-ink-bar{background-color:#fff}.light-button-theme .mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.light-button-theme .mat-tab-group.mat-warn .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.light-button-theme .mat-tab-group.mat-warn.mat-background-warn>.mat-tab-header .mat-ink-bar,.light-button-theme .mat-tab-group.mat-warn.mat-background-warn>.mat-tab-link-container .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-warn.mat-background-warn>.mat-tab-header .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-warn.mat-background-warn>.mat-tab-link-container .mat-ink-bar{background-color:#fff}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:hsla(0,0%,47%,.3)}.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-header,.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-header-pagination,.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-link-container,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-header,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container{background-color:#777}.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-label,.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-tab-link,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-label,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-tab-link{color:#777}.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,47%,.4)}.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-header .mat-focus-indicator:before,.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-focus-indicator:before,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-focus-indicator:before,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-focus-indicator:before{border-color:#777}.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,47%,.4)}.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-header-pagination .mat-ripple-element,.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-header .mat-ripple-element,.light-button-theme .mat-tab-group.mat-background-primary>.mat-tab-link-container .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-header-pagination .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-header .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-primary>.mat-tab-link-container .mat-ripple-element{background-color:hsla(0,0%,47%,.12)}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-header,.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-header-pagination,.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-link-container,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-header,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container{background-color:#ffc125}.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-label,.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-tab-link,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-label,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-tab-link{color:#fff}.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-header .mat-focus-indicator:before,.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-focus-indicator:before,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-focus-indicator:before,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-focus-indicator:before{border-color:#fff}.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-header-pagination .mat-ripple-element,.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-header .mat-ripple-element,.light-button-theme .mat-tab-group.mat-background-accent>.mat-tab-link-container .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-header-pagination .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-header .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-accent>.mat-tab-link-container .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-header,.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-header-pagination,.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-link-container,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-header,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container{background-color:#f44336}.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-label,.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-tab-link,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-label,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-tab-link{color:#fff}.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-tab-link.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-header .mat-focus-indicator:before,.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-focus-indicator:before,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-focus-indicator:before,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-focus-indicator:before{border-color:#fff}.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-header-pagination .mat-ripple-element,.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-header .mat-ripple-element,.light-button-theme .mat-tab-group.mat-background-warn>.mat-tab-link-container .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-header-pagination .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-header .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-warn>.mat-tab-link-container .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.light-button-theme .mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.light-button-theme .mat-toolbar.mat-primary{background:#777;color:#777}.light-button-theme .mat-toolbar.mat-accent{background:#ffc125;color:#fff}.light-button-theme .mat-toolbar.mat-warn{background:#f44336;color:#fff}.light-button-theme .mat-toolbar .mat-focused .mat-form-field-ripple,.light-button-theme .mat-toolbar .mat-form-field-ripple,.light-button-theme .mat-toolbar .mat-form-field-underline{background-color:currentColor}.light-button-theme .mat-toolbar .mat-focused .mat-form-field-label,.light-button-theme .mat-toolbar .mat-form-field-label,.light-button-theme .mat-toolbar .mat-form-field.mat-focused .mat-select-arrow,.light-button-theme .mat-toolbar .mat-select-arrow,.light-button-theme .mat-toolbar .mat-select-value{color:inherit}.light-button-theme .mat-toolbar .mat-input-element{caret-color:currentColor}.light-button-theme .mat-tooltip{background:rgba(97,97,97,.9)}.light-button-theme .mat-tree{background:#fff}.light-button-theme .mat-nested-tree-node,.light-button-theme .mat-tree-node{color:rgba(0,0,0,.87)}.light-button-theme .mat-snack-bar-container{color:hsla(0,0%,100%,.7);background:#323232;box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.light-button-theme .mat-simple-snackbar-action{color:#ffc125}a,body,button,div,h1,h2,h3,h4,h5,h6,mat-option.mat-option,mat-panel-description,mat-panel-title,option,p,select,span{font-family:Skycoin,Roboto,Helvetica Neue,sans-serif}.background-fixer{background-color:#f7f7f7;width:100%;height:100%;position:fixed;top:0;left:0;z-index:-1}body,html{height:100%}body{background-color:#f7f7f7;margin:0;padding:0;color:#1e2227;font-size:13px}.mat-tooltip{font-size:11px!important;line-height:1.3}.-flex-fill,.flex-fill{flex:1 1 auto}.link{color:#0072ff;cursor:pointer;text-decoration:none}.alert-box{color:#ff004e;font-size:12px;line-height:1.5;background-color:#ffdede;padding:15px;display:flex;margin-bottom:20px}.alert-box .title{font-size:18px}.alert-box mat-icon{margin-top:5px;margin-right:10px;-webkit-animation:alert-blinking 1s linear infinite;animation:alert-blinking 1s linear infinite}.alert-box mat-checkbox{margin-top:10px;display:inline-block}.alert-box .-check span{color:#1e2227!important}@-webkit-keyframes alert-blinking{50%{opacity:.2}}@keyframes alert-blinking{50%{opacity:.2}}.red{color:#ff004e}.red-field{border:2px solid #ff004e!important;color:#ff004e!important}.error-tooltip{background-color:#ff004e!important}.final-element{width:1px;height:1px} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.3072000db951801c187c.bundle.css b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.3072000db951801c187c.bundle.css new file mode 100644 index 0000000000..d053976918 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.3072000db951801c187c.bundle.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.674f50d287a8c48dc19b.eot?v=4.7.0);src:url(fontawesome-webfont.674f50d287a8c48dc19b.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(fontawesome-webfont.af7ae505a9eed503f8b8.woff2?v=4.7.0) format('woff2'),url(fontawesome-webfont.fee66e712a8a08eef580.woff?v=4.7.0) format('woff'),url(fontawesome-webfont.b06871f281fee6b241d6.ttf?v=4.7.0) format('truetype'),url(fontawesome-webfont.912ec66d7572ff821749.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:2s linear infinite fa-spin;animation:2s linear infinite fa-spin}.fa-pulse{-webkit-animation:1s steps(8) infinite fa-spin;animation:1s steps(8) infinite fa-spin}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.e79bfd88537def476913.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(MaterialIcons-Regular.570eb83859dc23dd0eec.woff2) format('woff2'),url(MaterialIcons-Regular.012cf6a10129e2275d79.woff) format('woff'),url(MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf) format('truetype')}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;-webkit-font-feature-settings:'liga';font-feature-settings:'liga'}.-table:last-of-type{margin-bottom:30px}.-table .-headers{color:rgba(30,34,39,.2);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;font-weight:700;height:50px;line-height:50px;margin:0 30px}.-table .-headers>div{padding:0 20px}.-table .-body{border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:0 30px}.-table .-body .-row{font-size:13px;padding:15px 0;background:#fafafa;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-table .-body .-row:not(:last-child){border-bottom:1px solid #eff0f0}.-table .-body .-row:first-child{border-top-left-radius:15px;border-top-right-radius:15px}.-table .-body .-row:last-child{border-bottom-left-radius:15px;border-bottom-right-radius:15px}.-table .-body .-row>div{padding:0 20px}.-table .-width-70{width:70px;-ms-flex-negative:0;flex-shrink:0}.-table .-width-150{width:150px;-ms-flex-negative:0;flex-shrink:0}.-table .-width-200{width:200px;-ms-flex-negative:0;flex-shrink:0}.-table .-width-250{width:250px;-ms-flex-negative:0;flex-shrink:0}.modal .-body{line-height:20px;font-size:13px;color:#1e2227;opacity:.8}.modal .big-text{color:#000;font-weight:700;font-size:15px}.modal .-check-container{text-align:center;margin-top:25px}.modal .-check-container .-check label{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.modal .-check-container .-check .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.modal .-check-container .-check .mat-checkbox-background,.modal .-check-container .-check .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.modal .-buttons{text-align:center}.modal app-button button{margin-top:28px}/*! + * Bootstrap Grid v4.0.0-beta.3 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */@-ms-viewport{width:device-width}html{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-overflow-style:scrollbar;height:100%}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.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%}}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.d-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}.d-print-none{display:none!important}}.mat-elevation-z0{-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12);box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-elevation-z1{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-elevation-z2{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-elevation-z3{-webkit-box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12);box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-elevation-z4{-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-elevation-z5{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.mat-elevation-z6{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-elevation-z7{-webkit-box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12);box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.mat-elevation-z8{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-elevation-z9{-webkit-box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12);box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mat-elevation-z10{-webkit-box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12);box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.mat-elevation-z11{-webkit-box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12);box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.mat-elevation-z12{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-elevation-z13{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.mat-elevation-z14{-webkit-box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12);box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.mat-elevation-z15{-webkit-box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12);box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.mat-elevation-z16{-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-elevation-z17{-webkit-box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12);box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.mat-elevation-z18{-webkit-box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12);box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.mat-elevation-z19{-webkit-box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12);box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.mat-elevation-z20{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12);box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.mat-elevation-z21{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12);box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.mat-elevation-z22{-webkit-box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12);box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.mat-elevation-z23{-webkit-box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12);box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.mat-elevation-z24{-webkit-box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h5,.mat-typography h5{font-size:11.62px;font-weight:400;font-family:Roboto,"Helvetica Neue",sans-serif;line-height:20px;margin:0 0 12px}.mat-h6,.mat-typography h6{font-size:9.38px;font-weight:400;font-family:Roboto,"Helvetica Neue",sans-serif;line-height:20px;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-body p,.mat-body-1 p,.mat-typography p{margin:0 0 12px}.mat-caption,.mat-small{font:400 12px/20px Roboto,"Helvetica Neue",sans-serif}.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto,"Helvetica Neue",sans-serif;margin:0 0 56px;letter-spacing:-.05em}.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px;letter-spacing:-.02em}.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px;letter-spacing:-.005em}.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500}.mat-button-toggle,.mat-card{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-card-title{font-size:24px;font-weight:400}.mat-card-content,.mat-card-header .mat-card-title,.mat-card-subtitle{font-size:14px}.mat-checkbox{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-checkbox-layout .mat-checkbox-label{line-height:24px}.mat-chip{font-size:13px;line-height:18px}.mat-chip .mat-chip-remove.mat-icon{font-size:18px}.mat-table{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-header-cell{font-size:12px;font-weight:500}.mat-cell{font-size:14px}.mat-calendar{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-calendar-body{font-size:13px}.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}.mat-calendar-table-header th{font-size:11px;font-weight:400}.mat-dialog-title{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif}.mat-expansion-panel-header{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:15px;font-weight:400}.mat-expansion-panel-content{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-form-field{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:inherit;font-weight:400;line-height:1.125}.mat-form-field-wrapper{padding-bottom:1.25em}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}.mat-form-field-infix{padding:.4375em 0;border-top:.84375em solid transparent}.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.33333333%}.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.33334333%}.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.33335333%}.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}.mat-form-field-label{top:1.28125em}.mat-form-field-underline{bottom:1.25em}.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.54166667em;top:calc(100% - 1.66666667em)}.mat-grid-tile-footer,.mat-grid-tile-header{font-size:14px}.mat-grid-tile-footer .mat-line,.mat-grid-tile-header .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-grid-tile-footer .mat-line:nth-child(n+2),.mat-grid-tile-header .mat-line:nth-child(n+2){font-size:12px}input.mat-input-element{margin-top:-.0625em}.mat-menu-item{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px}.mat-radio-button,.mat-select{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-select-trigger{height:1.125em}.mat-slide-toggle-content{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-slider-thumb-label-text{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px;font-weight:500}.mat-stepper-horizontal,.mat-stepper-vertical{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-step-label{font-size:14px;font-weight:400}.mat-step-label-selected{font-size:14px;font-weight:500}.mat-tab-group{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-tab-label,.mat-tab-link{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0}.mat-tooltip{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}.mat-list-item,.mat-list-option{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-list .mat-list-item,.mat-nav-list .mat-list-item,.mat-selection-list .mat-list-item{font-size:16px}.mat-list .mat-list-item .mat-line,.mat-nav-list .mat-list-item .mat-line,.mat-selection-list .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list .mat-list-item .mat-line:nth-child(n+2),.mat-nav-list .mat-list-item .mat-line:nth-child(n+2),.mat-selection-list .mat-list-item .mat-line:nth-child(n+2){font-size:14px}.mat-list .mat-list-option,.mat-nav-list .mat-list-option,.mat-selection-list .mat-list-option{font-size:16px}.mat-list .mat-list-option .mat-line,.mat-nav-list .mat-list-option .mat-line,.mat-selection-list .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list .mat-list-option .mat-line:nth-child(n+2),.mat-nav-list .mat-list-option .mat-line:nth-child(n+2),.mat-selection-list .mat-list-option .mat-line:nth-child(n+2){font-size:14px}.mat-list[dense] .mat-list-item,.mat-nav-list[dense] .mat-list-item,.mat-selection-list[dense] .mat-list-item{font-size:12px}.mat-list[dense] .mat-list-item .mat-line,.mat-nav-list[dense] .mat-list-item .mat-line,.mat-selection-list[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-list[dense] .mat-list-option,.mat-nav-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-nav-list[dense] .mat-list-option,.mat-selection-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-selection-list[dense] .mat-list-option{font-size:12px}.mat-list[dense] .mat-list-option .mat-line,.mat-nav-list[dense] .mat-list-option .mat-line,.mat-selection-list[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list[dense] .mat-list-option .mat-line:nth-child(n+2),.mat-nav-list[dense] .mat-list-option .mat-line:nth-child(n+2),.mat-selection-list[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}.mat-list[dense] .mat-subheader,.mat-nav-list[dense] .mat-subheader,.mat-selection-list[dense] .mat-subheader{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px;font-weight:500}.mat-option{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:16px}.mat-optgroup-label{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-simple-snackbar{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px}.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}.mat-ripple{overflow:hidden}@media screen and (-ms-high-contrast:active){.mat-ripple{display:none}.mat-option-ripple{opacity:.5}}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;-webkit-transition:opacity,-webkit-transform 0s cubic-bezier(0,0,.2,1);transition:opacity,-webkit-transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1),-webkit-transform 0s cubic-bezier(0,0,.2,1);-webkit-transform:scale(0);transform:scale(0)}.mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative;cursor:pointer;outline:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;max-width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:rgba(0,0,0,.87)}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.mat-option-text{display:inline-block;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}.mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:rgba(0,0,0,.54)}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;-webkit-transition:opacity .4s cubic-bezier(.25,.8,.25,1);transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.6)}.cdk-overlay-transparent-backdrop{background:0 0}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.mat-ripple-element{background-color:rgba(0,0,0,.1)}.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#0072ff}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.mat-pseudo-checkbox::after{color:#fafafa}.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#ffc125}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#0072ff}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fafafa}.mat-theme-loaded-marker{display:none}.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.mat-button,.mat-icon-button{background:0 0}.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay{background-color:rgba(0,114,255,.12)}.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay{background-color:rgba(255,193,37,.12)}.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay{background-color:rgba(244,67,54,.12)}.mat-button[disabled] .mat-button-focus-overlay,.mat-icon-button[disabled] .mat-button-focus-overlay{background-color:transparent}.mat-button.mat-primary,.mat-icon-button.mat-primary{color:#0072ff}.mat-button.mat-accent,.mat-icon-button.mat-accent{color:#ffc125}.mat-button.mat-warn,.mat-icon-button.mat-warn{color:#f44336}.mat-button.mat-accent[disabled],.mat-button.mat-primary[disabled],.mat-button.mat-warn[disabled],.mat-button[disabled][disabled],.mat-icon-button.mat-accent[disabled],.mat-icon-button.mat-primary[disabled],.mat-icon-button.mat-warn[disabled],.mat-icon-button[disabled][disabled]{color:rgba(0,0,0,.38)}.mat-fab,.mat-mini-fab,.mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.mat-fab.mat-accent,.mat-fab.mat-primary,.mat-fab.mat-warn,.mat-mini-fab.mat-accent,.mat-mini-fab.mat-primary,.mat-mini-fab.mat-warn,.mat-raised-button.mat-accent,.mat-raised-button.mat-primary,.mat-raised-button.mat-warn{color:#fff}.mat-fab.mat-accent[disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.38);background-color:rgba(0,0,0,.12)}.mat-fab.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{background-color:#0072ff}.mat-fab.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{background-color:#ffc125}.mat-fab.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{background-color:#f44336}.mat-fab.mat-accent .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-fab.mat-warn .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.2)}.mat-button.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.1)}.mat-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.1)}.mat-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.1)}.mat-icon-button.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.2)}.mat-icon-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.2)}.mat-icon-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.2)}.mat-button-toggle{color:rgba(0,0,0,.38)}.mat-button-toggle.cdk-focused .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.06)}.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.mat-button-toggle-disabled{background-color:#eee;color:rgba(0,0,0,.38)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.mat-card{background:#fff;color:rgba(0,0,0,.87)}.mat-card-subtitle{color:rgba(0,0,0,.54)}.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.mat-checkbox-checkmark{fill:#fafafa}.mat-checkbox-checkmark-path{stroke:#fafafa!important}.mat-checkbox-mixedmark{background-color:#fafafa}.mat-checkbox-checked.mat-primary .mat-checkbox-background,.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#0072ff}.mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.mat-checkbox-checked.mat-warn .mat-checkbox-background,.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.mat-checkbox-disabled .mat-checkbox-label{color:#b0b0b0}.mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(0,114,255,.26)}.mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.mat-chip:not(.mat-basic-chip){background-color:#e0e0e0;color:rgba(0,0,0,.87)}.mat-chip:not(.mat-basic-chip) .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.mat-chip:not(.mat-basic-chip) .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-primary{background-color:#0072ff;color:#fff}.mat-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-primary .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.mat-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-warn .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.mat-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-accent .mat-chip-remove:hover{opacity:.54}.mat-table{background:#fff}.mat-header-row,.mat-row{border-bottom-color:rgba(0,0,0,.12)}.mat-header-cell{color:rgba(0,0,0,.54)}.mat-cell{color:rgba(0,0,0,.87)}.mat-datepicker-content{background-color:#fff;color:rgba(0,0,0,.87)}.mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.mat-calendar-next-button,.mat-calendar-previous-button{color:rgba(0,0,0,.54)}.mat-calendar-table-header{color:rgba(0,0,0,.38)}.mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}.mat-calendar-body-label{color:rgba(0,0,0,.54)}.mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}.mat-calendar-body-selected{background-color:#0072ff;color:#fff}.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(0,114,255,.4)}.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}.mat-calendar-body-today.mat-calendar-body-selected{-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}.mat-dialog-container,.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-action-row{border-top-color:rgba(0,0,0,.12)}.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.mat-expansion-indicator::after,.mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.38)}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.mat-form-field-label,.mat-hint{color:rgba(0,0,0,.54)}.mat-focused .mat-form-field-label{color:#0072ff}.mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.mat-focused .mat-form-field-required-marker{color:#ffc125}.mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-disabled .mat-form-field-underline{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.42)),color-stop(33%,rgba(0,0,0,.42)),color-stop(0,transparent));background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x}.mat-form-field-ripple{background-color:#0072ff}.mat-form-field-ripple.mat-accent{background-color:#ffc125}.mat-form-field-ripple.mat-warn{background-color:#f44336}.mat-form-field-invalid .mat-form-field-label,.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}.mat-form-field-invalid .mat-form-field-ripple{background-color:#f44336}.mat-error{color:#f44336}.mat-icon.mat-primary{color:#0072ff}.mat-icon.mat-accent{color:#ffc125}.mat-icon.mat-warn{color:#f44336}.mat-input-element:disabled{color:rgba(0,0,0,.38)}.mat-input-element{caret-color:#0072ff}.mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-accent .mat-input-element{caret-color:#ffc125}.mat-form-field-invalid .mat-input-element,.mat-warn .mat-input-element{caret-color:#f44336}.mat-list .mat-list-item,.mat-list .mat-list-option,.mat-nav-list .mat-list-item,.mat-nav-list .mat-list-option,.mat-selection-list .mat-list-item,.mat-selection-list .mat-list-option{color:rgba(0,0,0,.87)}.mat-list .mat-subheader,.mat-nav-list .mat-subheader,.mat-selection-list .mat-subheader{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500;color:rgba(0,0,0,.54)}.mat-list-item-disabled{background-color:#eee}.mat-divider{border-top-color:rgba(0,0,0,.12)}.mat-nav-list .mat-list-item{outline:0}.mat-nav-list .mat-list-item.mat-list-item-focus,.mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.mat-list-option{outline:0}.mat-list-option.mat-list-item-focus,.mat-list-option:hover{background:rgba(0,0,0,.04)}.mat-menu-panel{background:#fff}.mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}.mat-menu-item[disabled]{color:rgba(0,0,0,.38)}.mat-menu-item .mat-icon:not([color]),.mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}.mat-menu-item-highlighted:not([disabled]),.mat-menu-item:focus:not([disabled]),.mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.mat-paginator{background:#fff}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-increment{border-color:rgba(0,0,0,.38)}.mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%2300c3ff%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar-buffer{background-color:#00c3ff}.mat-progress-bar-fill::after{background-color:#0072ff}.mat-progress-bar.mat-accent .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffc125%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar.mat-accent .mat-progress-bar-buffer,.mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ffc125}.mat-progress-bar.mat-warn .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffcdd2%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}.mat-progress-spinner circle,.mat-spinner circle{stroke:#0072ff}.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ffc125}.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.mat-radio-disabled .mat-radio-inner-circle,.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#0072ff}.mat-radio-button.mat-primary .mat-radio-inner-circle{background-color:#0072ff}.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,114,255,.26)}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#ffc125}.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.mat-radio-button.mat-warn .mat-radio-inner-circle{background-color:#f44336}.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.mat-select-content,.mat-select-panel-done-animating{background:#fff}.mat-select-value{color:rgba(0,0,0,.87)}.mat-select-placeholder{color:rgba(0,0,0,.42)}.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.mat-select-arrow{color:rgba(0,0,0,.54)}.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#0072ff}.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow,.mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.mat-drawer.mat-drawer-push{background-color:#fff}.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ffc125}.mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(255,193,37,.5)}.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle .mat-ripple-element{background-color:rgba(255,193,37,.12)}.mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#0072ff}.mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(0,114,255,.5)}.mat-slide-toggle.mat-primary:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.12)}.mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#f44336}.mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(244,67,54,.5)}.mat-slide-toggle.mat-warn:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.12)}.mat-disabled .mat-slide-toggle-thumb{background-color:#bdbdbd}.mat-disabled .mat-slide-toggle-bar{background-color:rgba(0,0,0,.1)}.mat-slide-toggle-thumb{background-color:#fafafa}.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label,.mat-primary .mat-slider-track-fill{background-color:#0072ff}.mat-primary .mat-slider-thumb-label-text{color:#fff}.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label,.mat-accent .mat-slider-track-fill{background-color:#ffc125}.mat-accent .mat-slider-thumb-label-text{color:#fff}.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label,.mat-warn .mat-slider-track-fill{background-color:#f44336}.mat-warn .mat-slider-thumb-label-text{color:#fff}.mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.cdk-focused .mat-slider-track-background,.mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.mat-slider-disabled .mat-slider-thumb,.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,.04)}.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.38)}.mat-step-header .mat-step-icon{background-color:#0072ff;color:#fff}.mat-step-header .mat-step-icon-not-touched{background-color:rgba(0,0,0,.38);color:#fff}.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}.mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.mat-tab-header,.mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.mat-tab-group-inverted-header .mat-tab-header,.mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.mat-tab-group.mat-primary .mat-tab-label:focus,.mat-tab-group.mat-primary .mat-tab-link:focus,.mat-tab-nav-bar.mat-primary .mat-tab-label:focus,.mat-tab-nav-bar.mat-primary .mat-tab-link:focus{background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#0072ff}.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-accent .mat-tab-label:focus,.mat-tab-group.mat-accent .mat-tab-link:focus,.mat-tab-nav-bar.mat-accent .mat-tab-label:focus,.mat-tab-nav-bar.mat-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-warn .mat-tab-label:focus,.mat-tab-group.mat-warn .mat-tab-link:focus,.mat-tab-nav-bar.mat-warn .mat-tab-label:focus,.mat-tab-nav-bar.mat-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label:focus,.mat-tab-group.mat-background-primary .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-primary .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-primary .mat-tab-link:focus{background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-background-primary .mat-tab-header,.mat-tab-group.mat-background-primary .mat-tab-links,.mat-tab-nav-bar.mat-background-primary .mat-tab-header,.mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#0072ff}.mat-tab-group.mat-background-primary .mat-tab-label,.mat-tab-group.mat-background-primary .mat-tab-link,.mat-tab-nav-bar.mat-background-primary .mat-tab-label,.mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-primary .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-tab-group.mat-background-accent .mat-tab-label:focus,.mat-tab-group.mat-background-accent .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-accent .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-background-accent .mat-tab-header,.mat-tab-group.mat-background-accent .mat-tab-links,.mat-tab-nav-bar.mat-background-accent .mat-tab-header,.mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffc125}.mat-tab-group.mat-background-accent .mat-tab-label,.mat-tab-group.mat-background-accent .mat-tab-link,.mat-tab-nav-bar.mat-background-accent .mat-tab-label,.mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-accent .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-tab-group.mat-background-warn .mat-tab-label:focus,.mat-tab-group.mat-background-warn .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-warn .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-background-warn .mat-tab-header,.mat-tab-group.mat-background-warn .mat-tab-links,.mat-tab-nav-bar.mat-background-warn .mat-tab-header,.mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.mat-tab-group.mat-background-warn .mat-tab-label,.mat-tab-group.mat-background-warn .mat-tab-link,.mat-tab-nav-bar.mat-background-warn .mat-tab-label,.mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-warn .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.mat-toolbar.mat-primary{background:#0072ff;color:#fff}.mat-toolbar.mat-accent{background:#ffc125;color:#fff}.mat-toolbar.mat-warn{background:#f44336;color:#fff}.mat-tooltip{background:rgba(97,97,97,.9)}.mat-snack-bar-container{background:#323232;color:#fff}.mat-simple-snackbar-action{color:#ffc125}.select-address-theme .mat-ripple-element{background-color:rgba(0,0,0,.1)}.select-address-theme .mat-option{color:rgba(0,0,0,.87)}.select-address-theme .mat-option:focus:not(.mat-option-disabled),.select-address-theme .mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-primary .select-address-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#ddd}.mat-accent .select-address-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.mat-warn .select-address-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.select-address-theme .mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.select-address-theme .mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.select-address-theme .mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.select-address-theme .mat-optgroup-label{color:rgba(0,0,0,.54)}.select-address-theme .mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.select-address-theme .mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.select-address-theme .mat-pseudo-checkbox::after{color:#fafafa}.select-address-theme .mat-accent .mat-pseudo-checkbox-checked,.select-address-theme .mat-accent .mat-pseudo-checkbox-indeterminate,.select-address-theme .mat-pseudo-checkbox-checked,.select-address-theme .mat-pseudo-checkbox-indeterminate{background:#ffc125}.select-address-theme .mat-primary .mat-pseudo-checkbox-checked,.select-address-theme .mat-primary .mat-pseudo-checkbox-indeterminate{background:#ddd}.select-address-theme .mat-warn .mat-pseudo-checkbox-checked,.select-address-theme .mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.select-address-theme .mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.select-address-theme .mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.select-address-theme .mat-app-background{background-color:#fafafa}.select-address-theme .mat-theme-loaded-marker{display:none}.select-address-theme .mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.select-address-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.select-address-theme .mat-button,.select-address-theme .mat-icon-button{background:0 0}.select-address-theme .mat-button.mat-primary .mat-button-focus-overlay,.select-address-theme .mat-icon-button.mat-primary .mat-button-focus-overlay{background-color:rgba(221,221,221,.12)}.select-address-theme .mat-button.mat-accent .mat-button-focus-overlay,.select-address-theme .mat-icon-button.mat-accent .mat-button-focus-overlay{background-color:rgba(255,193,37,.12)}.select-address-theme .mat-button.mat-warn .mat-button-focus-overlay,.select-address-theme .mat-icon-button.mat-warn .mat-button-focus-overlay{background-color:rgba(244,67,54,.12)}.select-address-theme .mat-button[disabled] .mat-button-focus-overlay,.select-address-theme .mat-icon-button[disabled] .mat-button-focus-overlay{background-color:transparent}.select-address-theme .mat-button.mat-primary,.select-address-theme .mat-icon-button.mat-primary{color:#ddd}.select-address-theme .mat-button.mat-accent,.select-address-theme .mat-icon-button.mat-accent{color:#ffc125}.select-address-theme .mat-button.mat-warn,.select-address-theme .mat-icon-button.mat-warn{color:#f44336}.select-address-theme .mat-button.mat-accent[disabled],.select-address-theme .mat-button.mat-primary[disabled],.select-address-theme .mat-button.mat-warn[disabled],.select-address-theme .mat-button[disabled][disabled],.select-address-theme .mat-icon-button.mat-accent[disabled],.select-address-theme .mat-icon-button.mat-primary[disabled],.select-address-theme .mat-icon-button.mat-warn[disabled],.select-address-theme .mat-icon-button[disabled][disabled]{color:rgba(0,0,0,.38)}.select-address-theme .mat-fab,.select-address-theme .mat-mini-fab,.select-address-theme .mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.select-address-theme .mat-fab.mat-primary,.select-address-theme .mat-mini-fab.mat-primary,.select-address-theme .mat-raised-button.mat-primary{color:#ddd;background-color:#ddd}.select-address-theme .mat-fab.mat-accent,.select-address-theme .mat-fab.mat-warn,.select-address-theme .mat-mini-fab.mat-accent,.select-address-theme .mat-mini-fab.mat-warn,.select-address-theme .mat-raised-button.mat-accent,.select-address-theme .mat-raised-button.mat-warn{color:#fff}.select-address-theme .mat-fab.mat-accent[disabled],.select-address-theme .mat-fab.mat-primary[disabled],.select-address-theme .mat-fab.mat-warn[disabled],.select-address-theme .mat-fab[disabled][disabled],.select-address-theme .mat-mini-fab.mat-accent[disabled],.select-address-theme .mat-mini-fab.mat-primary[disabled],.select-address-theme .mat-mini-fab.mat-warn[disabled],.select-address-theme .mat-mini-fab[disabled][disabled],.select-address-theme .mat-raised-button.mat-accent[disabled],.select-address-theme .mat-raised-button.mat-primary[disabled],.select-address-theme .mat-raised-button.mat-warn[disabled],.select-address-theme .mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.38);background-color:rgba(0,0,0,.12)}.select-address-theme .mat-fab.mat-accent,.select-address-theme .mat-mini-fab.mat-accent,.select-address-theme .mat-raised-button.mat-accent{background-color:#ffc125}.select-address-theme .mat-fab.mat-warn,.select-address-theme .mat-mini-fab.mat-warn,.select-address-theme .mat-raised-button.mat-warn{background-color:#f44336}.select-address-theme .mat-fab.mat-primary .mat-ripple-element,.select-address-theme .mat-mini-fab.mat-primary .mat-ripple-element,.select-address-theme .mat-raised-button.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.2)}.select-address-theme .mat-fab.mat-accent .mat-ripple-element,.select-address-theme .mat-fab.mat-warn .mat-ripple-element,.select-address-theme .mat-mini-fab.mat-accent .mat-ripple-element,.select-address-theme .mat-mini-fab.mat-warn .mat-ripple-element,.select-address-theme .mat-raised-button.mat-accent .mat-ripple-element,.select-address-theme .mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.2)}.select-address-theme .mat-button.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.1)}.select-address-theme .mat-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.1)}.select-address-theme .mat-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.1)}.select-address-theme .mat-icon-button.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.2)}.select-address-theme .mat-icon-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.2)}.select-address-theme .mat-icon-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.2)}.select-address-theme .mat-button-toggle{color:rgba(0,0,0,.38)}.select-address-theme .mat-button-toggle.cdk-focused .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.select-address-theme .mat-button-toggle-disabled{background-color:#eee;color:rgba(0,0,0,.38)}.select-address-theme .mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.select-address-theme .mat-card{background:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-card-subtitle{color:rgba(0,0,0,.54)}.select-address-theme .mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.select-address-theme .mat-checkbox-checkmark{fill:#fafafa}.select-address-theme .mat-checkbox-checkmark-path{stroke:#fafafa!important}.select-address-theme .mat-checkbox-mixedmark{background-color:#fafafa}.select-address-theme .mat-checkbox-checked.mat-primary .mat-checkbox-background,.select-address-theme .mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#ddd}.select-address-theme .mat-checkbox-checked.mat-accent .mat-checkbox-background,.select-address-theme .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.select-address-theme .mat-checkbox-checked.mat-warn .mat-checkbox-background,.select-address-theme .mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.select-address-theme .mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.select-address-theme .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.select-address-theme .mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.select-address-theme .mat-checkbox-disabled .mat-checkbox-label{color:#b0b0b0}.select-address-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(221,221,221,.26)}.select-address-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.select-address-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.select-address-theme .mat-chip:not(.mat-basic-chip){background-color:#e0e0e0;color:rgba(0,0,0,.87)}.select-address-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.select-address-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-chip.mat-chip-selected.mat-primary{background-color:#ddd;color:#ddd}.select-address-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#ddd;opacity:.4}.select-address-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.select-address-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.select-address-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.select-address-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.select-address-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-table{background:#fff}.select-address-theme .mat-header-row,.select-address-theme .mat-row{border-bottom-color:rgba(0,0,0,.12)}.select-address-theme .mat-header-cell{color:rgba(0,0,0,.54)}.select-address-theme .mat-cell{color:rgba(0,0,0,.87)}.select-address-theme .mat-datepicker-content{background-color:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.select-address-theme .mat-calendar-next-button,.select-address-theme .mat-calendar-previous-button{color:rgba(0,0,0,.54)}.select-address-theme .mat-calendar-table-header{color:rgba(0,0,0,.38)}.select-address-theme .mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}.select-address-theme .mat-calendar-body-label{color:rgba(0,0,0,.54)}.select-address-theme .mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.select-address-theme .mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}.select-address-theme .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.select-address-theme .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.select-address-theme :not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}.select-address-theme .mat-calendar-body-selected{background-color:#ddd;color:#ddd}.select-address-theme .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(221,221,221,.4)}.select-address-theme .mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}.select-address-theme .mat-calendar-body-today.mat-calendar-body-selected{-webkit-box-shadow:inset 0 0 0 1px #ddd;box-shadow:inset 0 0 0 1px #ddd}.select-address-theme .mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}.select-address-theme .mat-dialog-container,.select-address-theme .mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-action-row{border-top-color:rgba(0,0,0,.12)}.select-address-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.select-address-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.select-address-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.select-address-theme .mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.select-address-theme .mat-expansion-indicator::after,.select-address-theme .mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.select-address-theme .mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.38)}.select-address-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.select-address-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.select-address-theme .mat-form-field-label,.select-address-theme .mat-hint{color:rgba(0,0,0,.54)}.select-address-theme .mat-focused .mat-form-field-label{color:#ddd}.select-address-theme .mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.select-address-theme .mat-focused .mat-form-field-label.mat-warn{color:#f44336}.select-address-theme .mat-focused .mat-form-field-required-marker{color:#ffc125}.select-address-theme .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.select-address-theme .mat-form-field-disabled .mat-form-field-underline{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.42)),color-stop(33%,rgba(0,0,0,.42)),color-stop(0,transparent));background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x}.select-address-theme .mat-form-field-ripple{background-color:#ddd}.select-address-theme .mat-form-field-ripple.mat-accent{background-color:#ffc125}.select-address-theme .mat-form-field-ripple.mat-warn{background-color:#f44336}.select-address-theme .mat-form-field-invalid .mat-form-field-label,.select-address-theme .mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.select-address-theme .mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}.select-address-theme .mat-form-field-invalid .mat-form-field-ripple{background-color:#f44336}.select-address-theme .mat-error{color:#f44336}.select-address-theme .mat-icon.mat-primary{color:#ddd}.select-address-theme .mat-icon.mat-accent{color:#ffc125}.select-address-theme .mat-icon.mat-warn{color:#f44336}.select-address-theme .mat-input-element:disabled{color:rgba(0,0,0,.38)}.select-address-theme .mat-input-element{caret-color:#ddd}.select-address-theme .mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element::placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-accent .mat-input-element{caret-color:#ffc125}.select-address-theme .mat-form-field-invalid .mat-input-element,.select-address-theme .mat-warn .mat-input-element{caret-color:#f44336}.select-address-theme .mat-list .mat-list-item,.select-address-theme .mat-list .mat-list-option,.select-address-theme .mat-nav-list .mat-list-item,.select-address-theme .mat-nav-list .mat-list-option,.select-address-theme .mat-selection-list .mat-list-item,.select-address-theme .mat-selection-list .mat-list-option{color:rgba(0,0,0,.87)}.select-address-theme .mat-list .mat-subheader,.select-address-theme .mat-nav-list .mat-subheader,.select-address-theme .mat-selection-list .mat-subheader{color:rgba(0,0,0,.54)}.select-address-theme .mat-list-item-disabled{background-color:#eee}.select-address-theme .mat-divider{border-top-color:rgba(0,0,0,.12)}.select-address-theme .mat-nav-list .mat-list-item{outline:0}.select-address-theme .mat-nav-list .mat-list-item.mat-list-item-focus,.select-address-theme .mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.select-address-theme .mat-list-option{outline:0}.select-address-theme .mat-list-option.mat-list-item-focus,.select-address-theme .mat-list-option:hover{background:rgba(0,0,0,.04)}.select-address-theme .mat-menu-panel{background:#fff}.select-address-theme .mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}.select-address-theme .mat-menu-item[disabled]{color:rgba(0,0,0,.38)}.select-address-theme .mat-menu-item .mat-icon:not([color]),.select-address-theme .mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}.select-address-theme .mat-menu-item-highlighted:not([disabled]),.select-address-theme .mat-menu-item:focus:not([disabled]),.select-address-theme .mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.select-address-theme .mat-paginator{background:#fff}.select-address-theme .mat-paginator,.select-address-theme .mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.select-address-theme .mat-paginator-decrement,.select-address-theme .mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.select-address-theme .mat-icon-button[disabled] .mat-paginator-decrement,.select-address-theme .mat-icon-button[disabled] .mat-paginator-increment{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23dddddd%27%2F%3E%3C%2Fsvg%3E")}.select-address-theme .mat-progress-bar-buffer,.select-address-theme .mat-progress-bar-fill::after{background-color:#ddd}.select-address-theme .mat-progress-bar.mat-accent .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffc125%27%2F%3E%3C%2Fsvg%3E")}.select-address-theme .mat-progress-bar.mat-accent .mat-progress-bar-buffer,.select-address-theme .mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ffc125}.select-address-theme .mat-progress-bar.mat-warn .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffcdd2%27%2F%3E%3C%2Fsvg%3E")}.select-address-theme .mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.select-address-theme .mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}.select-address-theme .mat-progress-spinner circle,.select-address-theme .mat-spinner circle{stroke:#ddd}.select-address-theme .mat-progress-spinner.mat-accent circle,.select-address-theme .mat-spinner.mat-accent circle{stroke:#ffc125}.select-address-theme .mat-progress-spinner.mat-warn circle,.select-address-theme .mat-spinner.mat-warn circle{stroke:#f44336}.select-address-theme .mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.select-address-theme .mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-radio-disabled .mat-radio-inner-circle,.select-address-theme .mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.select-address-theme .mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.select-address-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#ddd}.select-address-theme .mat-radio-button.mat-primary .mat-radio-inner-circle{background-color:#ddd}.select-address-theme .mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element{background-color:rgba(221,221,221,.26)}.select-address-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.select-address-theme .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#ffc125}.select-address-theme .mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.select-address-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.select-address-theme .mat-radio-button.mat-warn .mat-radio-inner-circle{background-color:#f44336}.select-address-theme .mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.select-address-theme .mat-select-content,.select-address-theme .mat-select-panel-done-animating{background:#fff}.select-address-theme .mat-select-value{color:rgba(0,0,0,.87)}.select-address-theme .mat-select-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.select-address-theme .mat-select-arrow{color:rgba(0,0,0,.54)}.select-address-theme .mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.select-address-theme .mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#ddd}.select-address-theme .mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.select-address-theme .mat-form-field .mat-select.mat-select-invalid .mat-select-arrow,.select-address-theme .mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}.select-address-theme .mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.select-address-theme .mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.select-address-theme .mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-drawer.mat-drawer-push{background-color:#fff}.select-address-theme .mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.select-address-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ffc125}.select-address-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(255,193,37,.5)}.select-address-theme .mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-slide-toggle .mat-ripple-element{background-color:rgba(255,193,37,.12)}.select-address-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ddd}.select-address-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(221,221,221,.5)}.select-address-theme .mat-slide-toggle.mat-primary:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-slide-toggle.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.12)}.select-address-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#f44336}.select-address-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(244,67,54,.5)}.select-address-theme .mat-slide-toggle.mat-warn:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-slide-toggle.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.12)}.select-address-theme .mat-disabled .mat-slide-toggle-thumb{background-color:#bdbdbd}.select-address-theme .mat-disabled .mat-slide-toggle-bar{background-color:rgba(0,0,0,.1)}.select-address-theme .mat-slide-toggle-thumb{background-color:#fafafa}.select-address-theme .mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.select-address-theme .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.select-address-theme .mat-primary .mat-slider-thumb,.select-address-theme .mat-primary .mat-slider-thumb-label,.select-address-theme .mat-primary .mat-slider-track-fill{background-color:#ddd}.select-address-theme .mat-primary .mat-slider-thumb-label-text{color:#ddd}.select-address-theme .mat-accent .mat-slider-thumb,.select-address-theme .mat-accent .mat-slider-thumb-label,.select-address-theme .mat-accent .mat-slider-track-fill{background-color:#ffc125}.select-address-theme .mat-accent .mat-slider-thumb-label-text{color:#fff}.select-address-theme .mat-warn .mat-slider-thumb,.select-address-theme .mat-warn .mat-slider-thumb-label,.select-address-theme .mat-warn .mat-slider-track-fill{background-color:#f44336}.select-address-theme .mat-warn .mat-slider-thumb-label-text{color:#fff}.select-address-theme .mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.select-address-theme .cdk-focused .mat-slider-track-background,.select-address-theme .mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.select-address-theme .mat-slider-disabled .mat-slider-thumb,.select-address-theme .mat-slider-disabled .mat-slider-track-background,.select-address-theme .mat-slider-disabled .mat-slider-track-fill,.select-address-theme .mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.select-address-theme .mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.select-address-theme .mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}.select-address-theme .mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.select-address-theme .mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.select-address-theme .mat-step-header.cdk-keyboard-focused,.select-address-theme .mat-step-header.cdk-program-focused,.select-address-theme .mat-step-header:hover{background-color:rgba(0,0,0,.04)}.select-address-theme .mat-step-header .mat-step-label,.select-address-theme .mat-step-header .mat-step-optional{color:rgba(0,0,0,.38)}.select-address-theme .mat-step-header .mat-step-icon{background-color:#ddd;color:#ddd}.select-address-theme .mat-step-header .mat-step-icon-not-touched{background-color:rgba(0,0,0,.38);color:#ddd}.select-address-theme .mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.select-address-theme .mat-stepper-horizontal,.select-address-theme .mat-stepper-vertical{background-color:#fff}.select-address-theme .mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}.select-address-theme .mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.select-address-theme .mat-tab-header,.select-address-theme .mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.select-address-theme .mat-tab-group-inverted-header .mat-tab-header,.select-address-theme .mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.select-address-theme .mat-tab-label,.select-address-theme .mat-tab-link{color:rgba(0,0,0,.87)}.select-address-theme .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.select-address-theme .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.select-address-theme .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-tab-group[class*=mat-background-] .mat-tab-header,.select-address-theme .mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.select-address-theme .mat-tab-group.mat-primary .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-primary .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-primary .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-primary .mat-tab-link:focus{background-color:rgba(221,221,221,.3)}.select-address-theme .mat-tab-group.mat-primary .mat-ink-bar,.select-address-theme .mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-primary .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#ddd}.select-address-theme .mat-tab-group.mat-accent .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-accent .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-accent .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.select-address-theme .mat-tab-group.mat-accent .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.select-address-theme .mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.select-address-theme .mat-tab-group.mat-warn .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-warn .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-warn .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.select-address-theme .mat-tab-group.mat-warn .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.select-address-theme .mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link:focus{background-color:rgba(221,221,221,.3)}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-header,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-links,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#ddd}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-label,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-link,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#ddd}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(221,221,221,.4)}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#ddd}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(221,221,221,.4)}.select-address-theme .mat-tab-group.mat-background-primary .mat-ripple-element,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(221,221,221,.12)}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-header,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-links,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffc125}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-label,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-link,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-accent .mat-ripple-element,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(255,255,255,.12)}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-header,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-links,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-label,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-link,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-warn .mat-ripple-element,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}.select-address-theme .mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.select-address-theme .mat-toolbar.mat-primary{background:#ddd;color:#ddd}.select-address-theme .mat-toolbar.mat-accent{background:#ffc125;color:#fff}.select-address-theme .mat-toolbar.mat-warn{background:#f44336;color:#fff}.select-address-theme .mat-tooltip{background:rgba(97,97,97,.9)}.select-address-theme .mat-snack-bar-container{background:#323232;color:#fff}.select-address-theme .mat-simple-snackbar-action{color:#ffc125}.subtle-theme .mat-ripple-element{background-color:rgba(0,0,0,.1)}.subtle-theme .mat-option{color:rgba(0,0,0,.87)}.subtle-theme .mat-option:focus:not(.mat-option-disabled),.subtle-theme .mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-primary .subtle-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#fff}.mat-accent .subtle-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#ccc}.mat-warn .subtle-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.subtle-theme .mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.subtle-theme .mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.subtle-theme .mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.subtle-theme .mat-optgroup-label{color:rgba(0,0,0,.54)}.subtle-theme .mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.subtle-theme .mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.subtle-theme .mat-pseudo-checkbox::after{color:#fafafa}.subtle-theme .mat-accent .mat-pseudo-checkbox-checked,.subtle-theme .mat-accent .mat-pseudo-checkbox-indeterminate,.subtle-theme .mat-pseudo-checkbox-checked,.subtle-theme .mat-pseudo-checkbox-indeterminate{background:#ccc}.subtle-theme .mat-primary .mat-pseudo-checkbox-checked,.subtle-theme .mat-primary .mat-pseudo-checkbox-indeterminate{background:#fff}.subtle-theme .mat-warn .mat-pseudo-checkbox-checked,.subtle-theme .mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.subtle-theme .mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.subtle-theme .mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.subtle-theme .mat-app-background{background-color:#fafafa}.subtle-theme .mat-theme-loaded-marker{display:none}.subtle-theme .mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.subtle-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.subtle-theme .mat-button,.subtle-theme .mat-icon-button{background:0 0}.subtle-theme .mat-button.mat-primary .mat-button-focus-overlay,.subtle-theme .mat-icon-button.mat-primary .mat-button-focus-overlay{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-button.mat-accent .mat-button-focus-overlay,.subtle-theme .mat-icon-button.mat-accent .mat-button-focus-overlay{background-color:rgba(204,204,204,.12)}.subtle-theme .mat-button.mat-warn .mat-button-focus-overlay,.subtle-theme .mat-icon-button.mat-warn .mat-button-focus-overlay{background-color:rgba(244,67,54,.12)}.subtle-theme .mat-button[disabled] .mat-button-focus-overlay,.subtle-theme .mat-icon-button[disabled] .mat-button-focus-overlay{background-color:transparent}.subtle-theme .mat-button.mat-primary,.subtle-theme .mat-icon-button.mat-primary{color:#fff}.subtle-theme .mat-button.mat-accent,.subtle-theme .mat-icon-button.mat-accent{color:#ccc}.subtle-theme .mat-button.mat-warn,.subtle-theme .mat-icon-button.mat-warn{color:#f44336}.subtle-theme .mat-button.mat-accent[disabled],.subtle-theme .mat-button.mat-primary[disabled],.subtle-theme .mat-button.mat-warn[disabled],.subtle-theme .mat-button[disabled][disabled],.subtle-theme .mat-icon-button.mat-accent[disabled],.subtle-theme .mat-icon-button.mat-primary[disabled],.subtle-theme .mat-icon-button.mat-warn[disabled],.subtle-theme .mat-icon-button[disabled][disabled]{color:rgba(0,0,0,.38)}.subtle-theme .mat-fab,.subtle-theme .mat-mini-fab,.subtle-theme .mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.subtle-theme .mat-fab.mat-primary,.subtle-theme .mat-mini-fab.mat-primary,.subtle-theme .mat-raised-button.mat-primary{color:#fff;background-color:#fff}.subtle-theme .mat-fab.mat-accent,.subtle-theme .mat-mini-fab.mat-accent,.subtle-theme .mat-raised-button.mat-accent{color:#ccc;background-color:#ccc}.subtle-theme .mat-fab.mat-warn,.subtle-theme .mat-mini-fab.mat-warn,.subtle-theme .mat-raised-button.mat-warn{color:#fff;background-color:#f44336}.subtle-theme .mat-fab.mat-accent[disabled],.subtle-theme .mat-fab.mat-primary[disabled],.subtle-theme .mat-fab.mat-warn[disabled],.subtle-theme .mat-fab[disabled][disabled],.subtle-theme .mat-mini-fab.mat-accent[disabled],.subtle-theme .mat-mini-fab.mat-primary[disabled],.subtle-theme .mat-mini-fab.mat-warn[disabled],.subtle-theme .mat-mini-fab[disabled][disabled],.subtle-theme .mat-raised-button.mat-accent[disabled],.subtle-theme .mat-raised-button.mat-primary[disabled],.subtle-theme .mat-raised-button.mat-warn[disabled],.subtle-theme .mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.38);background-color:rgba(0,0,0,.12)}.subtle-theme .mat-fab.mat-primary .mat-ripple-element,.subtle-theme .mat-mini-fab.mat-primary .mat-ripple-element,.subtle-theme .mat-raised-button.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.2)}.subtle-theme .mat-fab.mat-accent .mat-ripple-element,.subtle-theme .mat-mini-fab.mat-accent .mat-ripple-element,.subtle-theme .mat-raised-button.mat-accent .mat-ripple-element{background-color:rgba(204,204,204,.2)}.subtle-theme .mat-fab.mat-warn .mat-ripple-element,.subtle-theme .mat-mini-fab.mat-warn .mat-ripple-element,.subtle-theme .mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.2)}.subtle-theme .mat-button.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.1)}.subtle-theme .mat-button.mat-accent .mat-ripple-element{background-color:rgba(204,204,204,.1)}.subtle-theme .mat-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.1)}.subtle-theme .mat-icon-button.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.2)}.subtle-theme .mat-icon-button.mat-accent .mat-ripple-element{background-color:rgba(204,204,204,.2)}.subtle-theme .mat-icon-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.2)}.subtle-theme .mat-button-toggle{color:rgba(0,0,0,.38)}.subtle-theme .mat-button-toggle.cdk-focused .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.subtle-theme .mat-button-toggle-disabled{background-color:#eee;color:rgba(0,0,0,.38)}.subtle-theme .mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.subtle-theme .mat-card{background:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-card-subtitle{color:rgba(0,0,0,.54)}.subtle-theme .mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.subtle-theme .mat-checkbox-checkmark{fill:#fafafa}.subtle-theme .mat-checkbox-checkmark-path{stroke:#fafafa!important}.subtle-theme .mat-checkbox-mixedmark{background-color:#fafafa}.subtle-theme .mat-checkbox-checked.mat-primary .mat-checkbox-background,.subtle-theme .mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#fff}.subtle-theme .mat-checkbox-checked.mat-accent .mat-checkbox-background,.subtle-theme .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ccc}.subtle-theme .mat-checkbox-checked.mat-warn .mat-checkbox-background,.subtle-theme .mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.subtle-theme .mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.subtle-theme .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.subtle-theme .mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.subtle-theme .mat-checkbox-disabled .mat-checkbox-label{color:#b0b0b0}.subtle-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(255,255,255,.26)}.subtle-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(204,204,204,.26)}.subtle-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.subtle-theme .mat-chip:not(.mat-basic-chip){background-color:#e0e0e0;color:rgba(0,0,0,.87)}.subtle-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.subtle-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-chip.mat-chip-selected.mat-primary{background-color:#fff;color:#fff}.subtle-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}.subtle-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.subtle-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.subtle-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-chip.mat-chip-selected.mat-accent{background-color:#ccc;color:#ccc}.subtle-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#ccc;opacity:.4}.subtle-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-table{background:#fff}.subtle-theme .mat-header-row,.subtle-theme .mat-row{border-bottom-color:rgba(0,0,0,.12)}.subtle-theme .mat-header-cell{color:rgba(0,0,0,.54)}.subtle-theme .mat-cell{color:rgba(0,0,0,.87)}.subtle-theme .mat-datepicker-content{background-color:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.subtle-theme .mat-calendar-next-button,.subtle-theme .mat-calendar-previous-button{color:rgba(0,0,0,.54)}.subtle-theme .mat-calendar-table-header{color:rgba(0,0,0,.38)}.subtle-theme .mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}.subtle-theme .mat-calendar-body-label{color:rgba(0,0,0,.54)}.subtle-theme .mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.subtle-theme .mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}.subtle-theme .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.subtle-theme .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.subtle-theme :not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}.subtle-theme .mat-calendar-body-selected{background-color:#fff;color:#fff}.subtle-theme .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,255,255,.4)}.subtle-theme .mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}.subtle-theme .mat-calendar-body-today.mat-calendar-body-selected{-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.subtle-theme .mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}.subtle-theme .mat-dialog-container,.subtle-theme .mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-action-row{border-top-color:rgba(0,0,0,.12)}.subtle-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.subtle-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.subtle-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.subtle-theme .mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.subtle-theme .mat-expansion-indicator::after,.subtle-theme .mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.subtle-theme .mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.38)}.subtle-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.subtle-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.subtle-theme .mat-form-field-label,.subtle-theme .mat-hint{color:rgba(0,0,0,.54)}.subtle-theme .mat-focused .mat-form-field-label{color:#fff}.subtle-theme .mat-focused .mat-form-field-label.mat-accent{color:#ccc}.subtle-theme .mat-focused .mat-form-field-label.mat-warn{color:#f44336}.subtle-theme .mat-focused .mat-form-field-required-marker{color:#ccc}.subtle-theme .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.subtle-theme .mat-form-field-disabled .mat-form-field-underline{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.42)),color-stop(33%,rgba(0,0,0,.42)),color-stop(0,transparent));background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x}.subtle-theme .mat-form-field-ripple{background-color:#fff}.subtle-theme .mat-form-field-ripple.mat-accent{background-color:#ccc}.subtle-theme .mat-form-field-ripple.mat-warn{background-color:#f44336}.subtle-theme .mat-form-field-invalid .mat-form-field-label,.subtle-theme .mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.subtle-theme .mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}.subtle-theme .mat-form-field-invalid .mat-form-field-ripple{background-color:#f44336}.subtle-theme .mat-error{color:#f44336}.subtle-theme .mat-icon.mat-primary{color:#fff}.subtle-theme .mat-icon.mat-accent{color:#ccc}.subtle-theme .mat-icon.mat-warn{color:#f44336}.subtle-theme .mat-input-element:disabled{color:rgba(0,0,0,.38)}.subtle-theme .mat-input-element{caret-color:#fff}.subtle-theme .mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element::placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-accent .mat-input-element{caret-color:#ccc}.subtle-theme .mat-form-field-invalid .mat-input-element,.subtle-theme .mat-warn .mat-input-element{caret-color:#f44336}.subtle-theme .mat-list .mat-list-item,.subtle-theme .mat-list .mat-list-option,.subtle-theme .mat-nav-list .mat-list-item,.subtle-theme .mat-nav-list .mat-list-option,.subtle-theme .mat-selection-list .mat-list-item,.subtle-theme .mat-selection-list .mat-list-option{color:rgba(0,0,0,.87)}.subtle-theme .mat-list .mat-subheader,.subtle-theme .mat-nav-list .mat-subheader,.subtle-theme .mat-selection-list .mat-subheader{color:rgba(0,0,0,.54)}.subtle-theme .mat-list-item-disabled{background-color:#eee}.subtle-theme .mat-divider{border-top-color:rgba(0,0,0,.12)}.subtle-theme .mat-nav-list .mat-list-item{outline:0}.subtle-theme .mat-nav-list .mat-list-item.mat-list-item-focus,.subtle-theme .mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.subtle-theme .mat-list-option{outline:0}.subtle-theme .mat-list-option.mat-list-item-focus,.subtle-theme .mat-list-option:hover{background:rgba(0,0,0,.04)}.subtle-theme .mat-menu-panel{background:#fff}.subtle-theme .mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}.subtle-theme .mat-menu-item[disabled]{color:rgba(0,0,0,.38)}.subtle-theme .mat-menu-item .mat-icon:not([color]),.subtle-theme .mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}.subtle-theme .mat-menu-item-highlighted:not([disabled]),.subtle-theme .mat-menu-item:focus:not([disabled]),.subtle-theme .mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.subtle-theme .mat-paginator{background:#fff}.subtle-theme .mat-paginator,.subtle-theme .mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.subtle-theme .mat-paginator-decrement,.subtle-theme .mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.subtle-theme .mat-icon-button[disabled] .mat-paginator-decrement,.subtle-theme .mat-icon-button[disabled] .mat-paginator-increment{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27white%27%2F%3E%3C%2Fsvg%3E")}.subtle-theme .mat-progress-bar-buffer,.subtle-theme .mat-progress-bar-fill::after{background-color:#fff}.subtle-theme .mat-progress-bar.mat-accent .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23cccccc%27%2F%3E%3C%2Fsvg%3E")}.subtle-theme .mat-progress-bar.mat-accent .mat-progress-bar-buffer,.subtle-theme .mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ccc}.subtle-theme .mat-progress-bar.mat-warn .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffcdd2%27%2F%3E%3C%2Fsvg%3E")}.subtle-theme .mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.subtle-theme .mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}.subtle-theme .mat-progress-spinner circle,.subtle-theme .mat-spinner circle{stroke:#fff}.subtle-theme .mat-progress-spinner.mat-accent circle,.subtle-theme .mat-spinner.mat-accent circle{stroke:#ccc}.subtle-theme .mat-progress-spinner.mat-warn circle,.subtle-theme .mat-spinner.mat-warn circle{stroke:#f44336}.subtle-theme .mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.subtle-theme .mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-radio-disabled .mat-radio-inner-circle,.subtle-theme .mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.subtle-theme .mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.subtle-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#fff}.subtle-theme .mat-radio-button.mat-primary .mat-radio-inner-circle{background-color:#fff}.subtle-theme .mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element{background-color:rgba(255,255,255,.26)}.subtle-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ccc}.subtle-theme .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#ccc}.subtle-theme .mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element{background-color:rgba(204,204,204,.26)}.subtle-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.subtle-theme .mat-radio-button.mat-warn .mat-radio-inner-circle{background-color:#f44336}.subtle-theme .mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.subtle-theme .mat-select-content,.subtle-theme .mat-select-panel-done-animating{background:#fff}.subtle-theme .mat-select-value{color:rgba(0,0,0,.87)}.subtle-theme .mat-select-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.subtle-theme .mat-select-arrow{color:rgba(0,0,0,.54)}.subtle-theme .mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.subtle-theme .mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#fff}.subtle-theme .mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ccc}.subtle-theme .mat-form-field .mat-select.mat-select-invalid .mat-select-arrow,.subtle-theme .mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}.subtle-theme .mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.subtle-theme .mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.subtle-theme .mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-drawer.mat-drawer-push{background-color:#fff}.subtle-theme .mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.subtle-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ccc}.subtle-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(204,204,204,.5)}.subtle-theme .mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-slide-toggle .mat-ripple-element{background-color:rgba(204,204,204,.12)}.subtle-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#fff}.subtle-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(255,255,255,.5)}.subtle-theme .mat-slide-toggle.mat-primary:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-slide-toggle.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#f44336}.subtle-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(244,67,54,.5)}.subtle-theme .mat-slide-toggle.mat-warn:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-slide-toggle.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.12)}.subtle-theme .mat-disabled .mat-slide-toggle-thumb{background-color:#bdbdbd}.subtle-theme .mat-disabled .mat-slide-toggle-bar{background-color:rgba(0,0,0,.1)}.subtle-theme .mat-slide-toggle-thumb{background-color:#fafafa}.subtle-theme .mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.subtle-theme .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.subtle-theme .mat-primary .mat-slider-thumb,.subtle-theme .mat-primary .mat-slider-thumb-label,.subtle-theme .mat-primary .mat-slider-track-fill{background-color:#fff}.subtle-theme .mat-primary .mat-slider-thumb-label-text{color:#fff}.subtle-theme .mat-accent .mat-slider-thumb,.subtle-theme .mat-accent .mat-slider-thumb-label,.subtle-theme .mat-accent .mat-slider-track-fill{background-color:#ccc}.subtle-theme .mat-accent .mat-slider-thumb-label-text{color:#ccc}.subtle-theme .mat-warn .mat-slider-thumb,.subtle-theme .mat-warn .mat-slider-thumb-label,.subtle-theme .mat-warn .mat-slider-track-fill{background-color:#f44336}.subtle-theme .mat-warn .mat-slider-thumb-label-text{color:#fff}.subtle-theme .mat-slider-focus-ring{background-color:rgba(204,204,204,.2)}.subtle-theme .cdk-focused .mat-slider-track-background,.subtle-theme .mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.subtle-theme .mat-slider-disabled .mat-slider-thumb,.subtle-theme .mat-slider-disabled .mat-slider-track-background,.subtle-theme .mat-slider-disabled .mat-slider-track-fill,.subtle-theme .mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.subtle-theme .mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.subtle-theme .mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}.subtle-theme .mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.subtle-theme .mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.subtle-theme .mat-step-header.cdk-keyboard-focused,.subtle-theme .mat-step-header.cdk-program-focused,.subtle-theme .mat-step-header:hover{background-color:rgba(0,0,0,.04)}.subtle-theme .mat-step-header .mat-step-label,.subtle-theme .mat-step-header .mat-step-optional{color:rgba(0,0,0,.38)}.subtle-theme .mat-step-header .mat-step-icon{background-color:#fff;color:#fff}.subtle-theme .mat-step-header .mat-step-icon-not-touched{background-color:rgba(0,0,0,.38);color:#fff}.subtle-theme .mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.subtle-theme .mat-stepper-horizontal,.subtle-theme .mat-stepper-vertical{background-color:#fff}.subtle-theme .mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}.subtle-theme .mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.subtle-theme .mat-tab-header,.subtle-theme .mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.subtle-theme .mat-tab-group-inverted-header .mat-tab-header,.subtle-theme .mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.subtle-theme .mat-tab-label,.subtle-theme .mat-tab-link{color:rgba(0,0,0,.87)}.subtle-theme .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.subtle-theme .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.subtle-theme .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-tab-group[class*=mat-background-] .mat-tab-header,.subtle-theme .mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.subtle-theme .mat-tab-group.mat-primary .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-primary .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-primary .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-primary .mat-tab-link:focus{background-color:rgba(255,255,255,.3)}.subtle-theme .mat-tab-group.mat-primary .mat-ink-bar,.subtle-theme .mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-primary .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}.subtle-theme .mat-tab-group.mat-accent .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-accent .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-accent .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-accent .mat-tab-link:focus{background-color:rgba(204,204,204,.3)}.subtle-theme .mat-tab-group.mat-accent .mat-ink-bar,.subtle-theme .mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-accent .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#ccc}.subtle-theme .mat-tab-group.mat-warn .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-warn .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-warn .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.subtle-theme .mat-tab-group.mat-warn .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.subtle-theme .mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link:focus{background-color:rgba(255,255,255,.3)}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-header,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-links,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-label,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-link,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-primary .mat-ripple-element,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link:focus{background-color:rgba(204,204,204,.3)}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-header,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-links,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ccc}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-label,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-link,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#ccc}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(204,204,204,.4)}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#ccc}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(204,204,204,.4)}.subtle-theme .mat-tab-group.mat-background-accent .mat-ripple-element,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(204,204,204,.12)}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-header,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-links,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-label,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-link,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-warn .mat-ripple-element,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.subtle-theme .mat-toolbar.mat-primary{background:#fff;color:#fff}.subtle-theme .mat-toolbar.mat-accent{background:#ccc;color:#ccc}.subtle-theme .mat-toolbar.mat-warn{background:#f44336;color:#fff}.subtle-theme .mat-tooltip{background:rgba(97,97,97,.9)}.subtle-theme .mat-snack-bar-container{background:#323232;color:#fff}.subtle-theme .mat-simple-snackbar-action{color:#ccc}@font-face{font-family:Skycoin;font-style:normal;font-weight:300;src:url(Skycoin-Light.770b27ec05c2f97a1a27.woff2) format("woff2"),url(Skycoin-Light.4be01e4a68be8bf590da.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:300;src:url(Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2) format("woff2"),url(Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:400;src:url(Skycoin-Regular.21b4caaaedc00594e7bd.woff2) format("woff2"),url(Skycoin-Regular.98d953e74f174cf013b4.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:400;src:url(Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2) format("woff2"),url(Skycoin-RegularItalic.9947360f79b09132fd21.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:700;src:url(Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2) format("woff2"),url(Skycoin-Bold.42363955889f2f20c527.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:700;src:url(Skycoin-BoldItalic.c414dad20c4e3020221c.woff2) format("woff2"),url(Skycoin-BoldItalic.923dce74069362d168fe.woff) format("woff")}a,body,button,div,h1,h2,h3,h4,h5,h6,mat-option.mat-option,mat-panel-description,mat-panel-title,option,p,select,span{font-family:Skycoin,sans-serif}body{background-color:#f7f7f7;margin:0;padding:0;height:100%}header{background:url(header.e11f7c6852766b9319d6.png) center center/cover,linear-gradient(-155deg,#686e96 0,#373b5c 100%);width:100%;height:300px}mat-dialog-container{border-radius:5px!important}.mat-dialog-container{padding:0!important}.header-container{max-width:848px;text-align:center;padding-top:40px;margin-right:auto;margin-left:auto}.header-container h1{font-size:3em;color:#fff}.button-line{margin-top:40px;text-align:right}.datatable-row-group{cursor:pointer}button.active{background-color:rgba(0,0,0,.12)}mat-spinner.in-button .mat-spinner path{stroke:#000;opacity:.3}mat-spinner.in-button{display:inline-block;margin-left:10px}mat-spinner.in-button.small,mat-spinner.in-button.small svg{height:18px!important;width:18px!important}mat-spinner.in-text{display:inline-block;height:12px!important;width:12px!important;margin:0 0 0 7px!important}mat-spinner.in-text svg{height:12px!important;width:12px!important}mat-spinner.in-text svg circle{stroke:#0072ff}snack-bar-container{background-color:rgba(255,0,0,.8)!important}mat-panel-title{width:60%;display:block;-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.sky-container{min-width:100%;min-height:100%}.sky-container.sky-container-grey{background-color:#f7f7f7}.-flex-fill,.flex-fill{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.form-field{margin-bottom:20px}.form-field label{color:#1e2227;display:block;font-size:13px;line-height:20px;margin-bottom:2px}.form-field input{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.form-field .-input-addon{display:-webkit-box;display:-ms-flexbox;display:flex}.form-field .-input-addon input{border-top-right-radius:0;border-bottom-right-radius:0}.form-field .-input-addon span{border:2px;border-radius:0 6px 6px 0;background:#f1f1f1;padding:0 10px;line-height:44px;color:rgba(30,34,39,.5);font-size:14px;-ms-flex-negative:0;flex-shrink:0}.form-field select{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-field textarea{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.primary button.enabled,.primary-gradient-background{background:#0072ff;background:-webkit-gradient(linear,left top,right bottom,from(#0072ff),to(#00c3ff));background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.primary button.enabled span,.primary-gradient-background span{color:#fff}.primary-color{color:#0072ff}.secondary-color{color:#ffc125}.no-opacity{opacity:1!important}.light-opacity{opacity:.2}.rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}mat-spinner.in-button svg{height:24px!important;width:24px!important}.empty-row{padding:0 1.2rem!important;line-height:50px!important}.alert-box{color:#ff004e;font-size:12px;padding:15px;line-height:1.5;background-color:#ffdede;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:20px}.alert-box .title{font-size:20px}.alert-box mat-icon{margin-top:5px;margin-right:10px;-webkit-animation:1s linear infinite alert-blinking;animation:1s linear infinite alert-blinking}.alert-box mat-checkbox{margin-top:10px;display:inline-block}@-webkit-keyframes alert-blinking{50%{opacity:.2}}@keyframes alert-blinking{50%{opacity:.2}}.onboarding-container{width:100%;height:100%;overflow-x:hidden;background:#0072ff;background:-webkit-gradient(linear,left top,right bottom,from(#0072ff),to(#00c3ff));background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.onboarding-container .row-container{max-width:450px;width:80%;margin:0 auto}.onboarding-container label{color:#fff}.onboarding-container input{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.onboarding-container select{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%;-webkit-appearance:none}.onboarding-container textarea{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.dark button.enabled{background-color:#171a1d!important}.dark button.enabled span{color:#fff}.ghost button.enabled{background-color:rgba(0,0,0,0)!important}.ghost button.enabled span{color:#000}.-select{position:relative}.-select::after{content:'';display:block;position:absolute;top:0;right:0;background:url(/assets/img/chevron-right-grey.png) 0 0/32px 32px no-repeat;width:32px;height:32px;margin:6px;pointer-events:none;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.mat-menu-panel{border-radius:5px!important;background-color:#fefefe}.mat-menu-panel .mat-menu-item{font-family:Skycoin;line-height:50px}.mat-menu-panel.compact .mat-menu-item{font-size:13px;height:35px;line-height:35px}.qr-code-button{opacity:.6;cursor:pointer}.qr-code-button:hover{opacity:1}.mat-dialog-content{max-height:90vh!important}@media (max-height:600px){.mat-dialog-content{max-height:80vh!important}}.mouse-disabled{pointer-events:none}.coin-selector-container{display:inline-block;margin-left:5px;margin-bottom:5px}.coins-value-label{font-size:10px;margin-top:1px;padding:3px 10px;background-color:#f7f7f7;border-radius:4px}.coins-value-label span{opacity:.5}.coins-value-label .link{color:#0072ff;cursor:pointer;display:inline-block;font-size:11px;margin-bottom:3px;margin-top:-5px}.coins-value-label .centerd-link{width:100%;text-align:center}.red{color:#ff004e}.element-disabled{pointer-events:none;opacity:.5} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.3ef0b8e554b94dd4ced7.css b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.3ef0b8e554b94dd4ced7.css new file mode 100644 index 0000000000..b20b6b5dae --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.3ef0b8e554b94dd4ced7.css @@ -0,0 +1,14 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.8b43027f47b20503057d.eot?v=4.7.0);src:url(fontawesome-webfont.8b43027f47b20503057d.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(fontawesome-webfont.20fd1704ea223900efa9.woff2?v=4.7.0) format("woff2"),url(fontawesome-webfont.f691f37e57f04c152e23.woff?v=4.7.0) format("woff"),url(fontawesome-webfont.1e59d2330b4c6deb84b3.ttf?v=4.7.0) format("truetype"),url(fontawesome-webfont.c1e38fd9e0e74ba58f7a.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@font-face{font-family:Material Icons;font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.4674f8ded773cb03e824.eot);src:local("Material Icons"),local("MaterialIcons-Regular"),url(MaterialIcons-Regular.cff684e59ffb052d72cb.woff2) format("woff2"),url(MaterialIcons-Regular.83bebaf37c09c7e1c3ee.woff) format("woff"),url(MaterialIcons-Regular.5e7382c63da0098d634a.ttf) format("truetype")}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}.-table .-body,.paper{background-color:#fafafa;border-radius:10px;box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px;font-size:13px;overflow:hidden}.-table .small-padding.-body,.paper.small-padding{padding:20px}.-table:last-of-type{margin-bottom:30px}.-table .-headers{color:rgba(30,34,39,.2);display:flex;font-size:12px;font-weight:700;height:50px;line-height:50px;margin:0 30px}.-table .-headers>div{padding:0 20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.-table .-body{padding:0;margin:0 30px}.-table .-body .-row{font-size:13px;padding:15px 0;display:flex;align-items:center}.-table .-body .-row:not(:last-child){border-bottom:1px solid rgba(30,34,39,.05)}.-table .-body .-row>div{padding:0 20px}.-table .-width-50{width:50px;flex-shrink:0}.-table .-width-70{width:70px;flex-shrink:0}.-table .-width-85{width:85px;flex-shrink:0}.-table .-width-130{width:130px;flex-shrink:0}.-table .-width-150{width:150px;flex-shrink:0}.-table .-width-200{width:200px;flex-shrink:0}.-table .-width-250{width:250px;flex-shrink:0}.mat-dialog-content{max-height:90vh!important}@media (max-height:600px){.mat-dialog-content{max-height:80vh!important}}mat-dialog-container{border-radius:6px!important;overflow:hidden}.mat-dialog-container{padding:0!important}.modal{background-color:#fafafa;padding:0 24px;line-height:1.5;font-size:13px;color:rgba(30,34,39,.7)}.modal .-buttons{text-align:center}.modal app-button button{margin-top:28px}.list-button-container{margin:0 -10px}.list-button-container button.top-line:first-of-type{border-top:1px solid rgba(30,34,39,.05)}.list-button-container button{width:100%;text-align:left;padding:10px;border-bottom:1px solid rgba(30,34,39,.05);cursor:pointer}@font-face{font-family:Skycoin;font-style:normal;font-weight:300;src:url(/assets/fonts/skycoin/Skycoin-Light.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-Light.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:300;src:url(/assets/fonts/skycoin/Skycoin-LightItalic.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-LightItalic.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:400;src:url(/assets/fonts/skycoin/Skycoin-Regular.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-Regular.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:400;src:url(/assets/fonts/skycoin/Skycoin-RegularItalic.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-RegularItalic.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:700;src:url(/assets/fonts/skycoin/Skycoin-Bold.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-Bold.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:700;src:url(/assets/fonts/skycoin/Skycoin-BoldItalic.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-BoldItalic.woff) format("woff")}.form-field{margin-bottom:20px}.form-field label{color:#1e2227;display:block;font-size:13px;line-height:1.5;margin-bottom:2px}.form-field .field-base,.form-field input,.form-field mat-select,.form-field mat-slider,.form-field select,.form-field textarea{color:#1e2227;background-color:#fff;border:2px solid rgba(30,34,39,.05);border-radius:6px;box-sizing:border-box;display:block;font-size:13px;line-height:1.5;padding:10px;width:100%}.form-field select{-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-field select option{color:#1e2227}.form-field select option:disabled{color:rgba(30,34,39,.7)}.form-field mat-slider{padding:0;height:40px}.form-field mat-slider .mat-slider-thumb,.form-field mat-slider .mat-slider-thumb-label{background-color:#0072ff!important;transform:scale(1)!important;border-width:0!important}.form-field mat-slider .mat-slider-thumb{right:-6px;width:12px;height:32px;border-radius:3px}.form-field mat-slider .mat-slider-track-background,.form-field mat-slider .mat-slider-track-fill{background-color:#fff!important}.form-field mat-select{padding:0}.form-field mat-select .mat-select-trigger{padding:10px 40px 10px 10px;display:block;font-size:11px;height:100%;line-height:1.9}.form-field mat-select .mat-select-arrow{border:none}.form-field mat-select .mat-select-placeholder{color:unset!important;transition:unset!important}.form-field .-not-allowed input{cursor:not-allowed}mat-option .mat-pseudo-checkbox-checked{background:#0072ff}.mat-option-disabled .mat-pseudo-checkbox-disabled{opacity:.5}.-select{position:relative}.-select:before{content:"";display:block;position:absolute;top:0;right:0;background:url(/assets/img/chevron-right-grey.png) no-repeat;background-size:32px 32px;width:32px;height:32px;margin:6px;pointer-events:none;transform:rotate(90deg)}textarea{resize:none}.element-disabled,.form-field input:disabled,.form-field select:disabled,.form-field textarea:disabled{pointer-events:none!important;opacity:.5!important}.modal-form-container{margin-top:20px}.-check-container{text-align:center;margin-top:25px}.-check label{font-size:13px;max-width:100%;color:#1e2227;white-space:normal;text-align:left}.-check label .img-label-container{position:relative;top:2px}.-check label .img-label-container img{width:38px;height:38px;vertical-align:middle}.-check .mat-checkbox-label{position:relative;top:2px}.-check .mat-checkbox-checkmark-path{stroke:#0072ff!important}.-check .mat-checkbox-background,.-check .mat-checkbox-frame{width:20px;height:20px;background:rgba(30,34,39,.05)!important;border-radius:6px;border-color:transparent}.-check .mat-checkbox-ripple{top:-11px!important;left:-11px!important}.help-icon{display:inline!important;font-size:14px!important;color:rgba(30,34,39,.5);opacity:.55;vertical-align:text-bottom;padding-left:5px;cursor:default}.onboarding-container{width:100%;height:100%;overflow-x:hidden;background:#0072ff;background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.onboarding-container .row-container{max-width:450px;width:80%;margin:0 auto}.onboarding-container label{color:#fafafa!important}.onboarding-container .-header{color:#fafafa;margin-top:20px;margin-bottom:10px;text-align:center;line-height:1.5;font-size:20px}.onboarding-container .-description{font-size:14px;text-align:center;color:#fafafa;opacity:.5}.onboarding-container .-buttons-footer{align-items:center;flex-flow:column;margin-bottom:20px}.onboarding-container .-buttons-footer button{margin:2px 10px!important}.primary-button button.enabled,.primary-gradient-background{background:#0072ff;background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.primary-button button.enabled span,.primary-gradient-background span{color:#fff}.dark-button button.enabled{background-color:#1e2227!important}.dark-button button.enabled span{color:#fff}.ghost-button button.enabled{background-color:transparent!important}.ghost-button button.enabled span{color:#000}.image-button{cursor:pointer;opacity:.5}.image-button:hover{opacity:.75}.image-button:active{opacity:1}.white-text{color:#fafafa!important}.red-text{color:#ff004e!important}.yellow-text{color:#ffc125!important}.green-text{color:#00df80!important}.grey-light-text{color:rgba(30,34,39,.2)!important}.grey-text{color:rgba(30,34,39,.5)!important}.break-all{word-break:break-all}.mat-menu-panel{border-radius:6px!important;background-color:#fafafa}.mat-menu-panel .mat-menu-item{font-family:Skycoin,Roboto,Helvetica Neue,sans-serif} +/*! + * Bootstrap Grid v4.0.0-beta.3 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,:after,:before{box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:none}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:none}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:none}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:none}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:none}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.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-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}.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}@media (min-width:576px){.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-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}.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}}@media (min-width:768px){.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-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}.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}}@media (min-width:992px){.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-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}.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}}@media (min-width:1200px){.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-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}.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}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!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}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!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}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!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}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!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}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!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-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}}@media print{.d-print-none{display:none!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#868e96!important}a.text-secondary:focus,a.text-secondary:hover{color:#6c757d!important}.text-success{color:#00df80!important}a.text-success:focus,a.text-success:hover{color:#00ac63!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc125!important}a.text-warning:focus,a.text-warning:hover{color:#f1ac00!important}.text-danger{color:#ff004e!important}a.text-danger:focus,a.text-danger:hover{color:#cc003e!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#868e96!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,Helvetica Neue,sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * .83)/20px Roboto,Helvetica Neue,sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * .67)/20px Roboto,Helvetica Neue,sans-serif;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-body-1 p,.mat-body p,.mat-typography p{margin:0 0 12px}.mat-caption,.mat-small{font:400 12px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto,Helvetica Neue,sans-serif;letter-spacing:-.05em;margin:0 0 56px}.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto,Helvetica Neue,sans-serif;letter-spacing:-.02em;margin:0 0 64px}.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto,Helvetica Neue,sans-serif;letter-spacing:-.005em;margin:0 0 64px}.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 64px}.mat-bottom-sheet-container{font:400 14px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-button,.mat-fab,.mat-flat-button,.mat-icon-button,.mat-mini-fab,.mat-raised-button,.mat-stroked-button{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500}.mat-button-toggle,.mat-card{font-family:Roboto,Helvetica Neue,sans-serif}.mat-card-title{font-size:24px;font-weight:500}.mat-card-header .mat-card-title{font-size:20px}.mat-card-content,.mat-card-subtitle{font-size:14px}.mat-checkbox{font-family:Roboto,Helvetica Neue,sans-serif}.mat-checkbox-layout .mat-checkbox-label{line-height:24px}.mat-chip{font-size:14px;font-weight:500}.mat-chip .mat-chip-remove.mat-icon,.mat-chip .mat-chip-trailing-icon.mat-icon{font-size:18px}.mat-table{font-family:Roboto,Helvetica Neue,sans-serif}.mat-header-cell{font-size:12px;font-weight:500}.mat-cell,.mat-footer-cell{font-size:14px}.mat-calendar{font-family:Roboto,Helvetica Neue,sans-serif}.mat-calendar-body{font-size:13px}.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}.mat-calendar-table-header th{font-size:11px;font-weight:400}.mat-dialog-title{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-expansion-panel-header{font-family:Roboto,Helvetica Neue,sans-serif;font-size:15px;font-weight:400}.mat-expansion-panel-content{font:400 14px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-form-field{font-size:inherit;font-weight:400;line-height:1.125;font-family:Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-form-field-wrapper{padding-bottom:1.34375em}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}.mat-form-field-infix{padding:.5em 0;border-top:.84375em solid transparent}.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34375em) scale(.75);width:133.3333333333%}.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34374em) scale(.75);width:133.3333433333%}.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}.mat-form-field-label{top:1.34375em}.mat-form-field-underline{bottom:1.34375em}.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.6666666667em;top:calc(100% - 1.7916666667em)}.mat-form-field-appearance-legacy .mat-form-field-wrapper{padding-bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-infix{padding:.4375em 0}.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.3333333333%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.3333433333%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.3333533333%}.mat-form-field-appearance-legacy .mat-form-field-label{top:1.28125em}.mat-form-field-appearance-legacy .mat-form-field-underline{bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper{margin-top:.5416666667em;top:calc(100% - 1.6666666667em)}@media print{.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28122em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28121em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.2812em) scale(.75)}}.mat-form-field-appearance-fill .mat-form-field-infix{padding:.25em 0 .75em}.mat-form-field-appearance-fill .mat-form-field-label{top:1.09375em;margin-top:-.5em}.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-.59375em) scale(.75);width:133.3333333333%}.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-.59374em) scale(.75);width:133.3333433333%}.mat-form-field-appearance-outline .mat-form-field-infix{padding:1em 0}.mat-form-field-appearance-outline .mat-form-field-label{top:1.84375em;margin-top:-.25em}.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59375em) scale(.75);width:133.3333333333%}.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59374em) scale(.75);width:133.3333433333%}.mat-grid-tile-footer,.mat-grid-tile-header{font-size:14px}.mat-grid-tile-footer .mat-line,.mat-grid-tile-header .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-grid-tile-footer .mat-line:nth-child(n+2),.mat-grid-tile-header .mat-line:nth-child(n+2){font-size:12px}input.mat-input-element{margin-top:-.0625em}.mat-menu-item{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:400}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px}.mat-radio-button,.mat-select{font-family:Roboto,Helvetica Neue,sans-serif}.mat-select-trigger{height:1.125em}.mat-slide-toggle-content,.mat-slider-thumb-label-text{font-family:Roboto,Helvetica Neue,sans-serif}.mat-slider-thumb-label-text{font-size:12px;font-weight:500}.mat-stepper-horizontal,.mat-stepper-vertical{font-family:Roboto,Helvetica Neue,sans-serif}.mat-step-label{font-size:14px;font-weight:400}.mat-step-sub-label-error{font-weight:400}.mat-step-label-error{font-size:14px}.mat-step-label-selected{font-size:14px;font-weight:500}.mat-tab-group,.mat-tab-label,.mat-tab-link{font-family:Roboto,Helvetica Neue,sans-serif}.mat-tab-label,.mat-tab-link{font-size:14px;font-weight:500}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0}.mat-tooltip{font-family:Roboto,Helvetica Neue,sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}.mat-tooltip-handset{font-size:14px;padding-top:8px;padding-bottom:8px}.mat-list-item,.mat-list-option{font-family:Roboto,Helvetica Neue,sans-serif}.mat-list-base .mat-list-item{font-size:16px}.mat-list-base .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-item .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-list-option{font-size:16px}.mat-list-base .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-option .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-subheader{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500}.mat-list-base[dense] .mat-list-item{font-size:12px}.mat-list-base[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-list-base[dense] .mat-list-option{font-size:12px}.mat-list-base[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}.mat-list-base[dense] .mat-subheader{font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;font-weight:500}.mat-option{font-family:Roboto,Helvetica Neue,sans-serif;font-size:16px}.mat-optgroup-label{font:500 14px/24px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-simple-snackbar{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px}.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}.mat-tree{font-family:Roboto,Helvetica Neue,sans-serif}.mat-nested-tree-node,.mat-tree-node{font-weight:400;font-size:14px}.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0,0,.2,1);transform:scale(0)}.cdk-high-contrast-active .mat-ripple-element{display:none}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;outline:0;-webkit-appearance:none;-moz-appearance:none}.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper,.cdk-overlay-pane{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{pointer-events:auto;box-sizing:border-box;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}@media screen and (-ms-high-contrast:active){.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}@-webkit-keyframes cdk-text-field-autofill-start{ + /*!*/}@keyframes cdk-text-field-autofill-start{ + /*!*/}@-webkit-keyframes cdk-text-field-autofill-end{ + /*!*/}@keyframes cdk-text-field-autofill-end{ + /*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{-webkit-animation:cdk-text-field-autofill-start 0s 1ms;animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){-webkit-animation:cdk-text-field-autofill-end 0s 1ms;animation:cdk-text-field-autofill-end 0s 1ms}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0!important;box-sizing:content-box!important;height:auto!important;overflow:hidden!important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0!important;box-sizing:content-box!important;height:0!important}.mat-focus-indicator,.mat-mdc-focus-indicator{position:relative}.mat-ripple-element{background-color:rgba(0,0,0,.1)}.mat-option{color:rgba(0,0,0,.87)}.mat-option.mat-active,.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled),.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-option.mat-active{color:rgba(0,0,0,.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#0072ff}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.mat-optgroup-label{color:rgba(0,0,0,.54)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.mat-pseudo-checkbox:after{color:#fafafa}.mat-pseudo-checkbox-disabled{color:#b0b0b0}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#0072ff}.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#ffc125}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-elevation-z0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-elevation-z1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-elevation-z2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-elevation-z3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-elevation-z4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-elevation-z5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.mat-elevation-z6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-elevation-z7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.mat-elevation-z8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-elevation-z9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mat-elevation-z10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.mat-elevation-z11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.mat-elevation-z12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-elevation-z13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.mat-elevation-z14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.mat-elevation-z15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.mat-elevation-z16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-elevation-z17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.mat-elevation-z18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.mat-elevation-z19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.mat-elevation-z20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.mat-elevation-z21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.mat-elevation-z22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.mat-elevation-z23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.mat-elevation-z24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.mat-badge-content{color:#fff;background:#0072ff}.cdk-high-contrast-active .mat-badge-content{outline:1px solid;border-radius:0}.mat-badge-accent .mat-badge-content{background:#ffc125;color:#fff}.mat-badge-warn .mat-badge-content{color:#fff;background:#f44336}.mat-badge{position:relative}.mat-badge-hidden .mat-badge-content{display:none}.mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,.38)}.mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform .2s ease-in-out;transform:scale(.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}.mat-badge-content._mat-animation-noopable,.ng-animate-disabled .mat-badge-content{transition:none}.mat-badge-content.mat-badge-active{transform:none}.mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}.mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}.mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}.mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}[dir=rtl] .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}.mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}[dir=rtl] .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}.mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}.mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}.mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}.mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}[dir=rtl] .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}.mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}[dir=rtl] .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}.mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}.mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}.mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}.mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}[dir=rtl] .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}.mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}[dir=rtl] .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}.mat-bottom-sheet-container{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.mat-button,.mat-icon-button,.mat-stroked-button{color:inherit;background:transparent}.mat-button.mat-primary,.mat-icon-button.mat-primary,.mat-stroked-button.mat-primary{color:#0072ff}.mat-button.mat-accent,.mat-icon-button.mat-accent,.mat-stroked-button.mat-accent{color:#ffc125}.mat-button.mat-warn,.mat-icon-button.mat-warn,.mat-stroked-button.mat-warn{color:#f44336}.mat-button.mat-accent.mat-button-disabled,.mat-button.mat-button-disabled.mat-button-disabled,.mat-button.mat-primary.mat-button-disabled,.mat-button.mat-warn.mat-button-disabled,.mat-icon-button.mat-accent.mat-button-disabled,.mat-icon-button.mat-button-disabled.mat-button-disabled,.mat-icon-button.mat-primary.mat-button-disabled,.mat-icon-button.mat-warn.mat-button-disabled,.mat-stroked-button.mat-accent.mat-button-disabled,.mat-stroked-button.mat-button-disabled.mat-button-disabled,.mat-stroked-button.mat-primary.mat-button-disabled,.mat-stroked-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay,.mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#0072ff}.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay,.mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#ffc125}.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay,.mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#f44336}.mat-button.mat-button-disabled .mat-button-focus-overlay,.mat-icon-button.mat-button-disabled .mat-button-focus-overlay,.mat-stroked-button.mat-button-disabled .mat-button-focus-overlay{background-color:transparent}.mat-button .mat-ripple-element,.mat-icon-button .mat-ripple-element,.mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}.mat-button-focus-overlay{background:#000}.mat-stroked-button:not(.mat-button-disabled){border-color:rgba(0,0,0,.12)}.mat-fab,.mat-flat-button,.mat-mini-fab,.mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.mat-fab.mat-accent,.mat-fab.mat-primary,.mat-fab.mat-warn,.mat-flat-button.mat-accent,.mat-flat-button.mat-primary,.mat-flat-button.mat-warn,.mat-mini-fab.mat-accent,.mat-mini-fab.mat-primary,.mat-mini-fab.mat-warn,.mat-raised-button.mat-accent,.mat-raised-button.mat-primary,.mat-raised-button.mat-warn{color:#fff}.mat-fab.mat-accent.mat-button-disabled,.mat-fab.mat-button-disabled.mat-button-disabled,.mat-fab.mat-primary.mat-button-disabled,.mat-fab.mat-warn.mat-button-disabled,.mat-flat-button.mat-accent.mat-button-disabled,.mat-flat-button.mat-button-disabled.mat-button-disabled,.mat-flat-button.mat-primary.mat-button-disabled,.mat-flat-button.mat-warn.mat-button-disabled,.mat-mini-fab.mat-accent.mat-button-disabled,.mat-mini-fab.mat-button-disabled.mat-button-disabled,.mat-mini-fab.mat-primary.mat-button-disabled,.mat-mini-fab.mat-warn.mat-button-disabled,.mat-raised-button.mat-accent.mat-button-disabled,.mat-raised-button.mat-button-disabled.mat-button-disabled,.mat-raised-button.mat-primary.mat-button-disabled,.mat-raised-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.mat-fab.mat-primary,.mat-flat-button.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{background-color:#0072ff}.mat-fab.mat-accent,.mat-flat-button.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{background-color:#ffc125}.mat-fab.mat-warn,.mat-flat-button.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{background-color:#f44336}.mat-fab.mat-accent.mat-button-disabled,.mat-fab.mat-button-disabled.mat-button-disabled,.mat-fab.mat-primary.mat-button-disabled,.mat-fab.mat-warn.mat-button-disabled,.mat-flat-button.mat-accent.mat-button-disabled,.mat-flat-button.mat-button-disabled.mat-button-disabled,.mat-flat-button.mat-primary.mat-button-disabled,.mat-flat-button.mat-warn.mat-button-disabled,.mat-mini-fab.mat-accent.mat-button-disabled,.mat-mini-fab.mat-button-disabled.mat-button-disabled,.mat-mini-fab.mat-primary.mat-button-disabled,.mat-mini-fab.mat-warn.mat-button-disabled,.mat-raised-button.mat-accent.mat-button-disabled,.mat-raised-button.mat-button-disabled.mat-button-disabled,.mat-raised-button.mat-primary.mat-button-disabled,.mat-raised-button.mat-warn.mat-button-disabled{background-color:rgba(0,0,0,.12)}.mat-fab.mat-accent .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-fab.mat-warn .mat-ripple-element,.mat-flat-button.mat-accent .mat-ripple-element,.mat-flat-button.mat-primary .mat-ripple-element,.mat-flat-button.mat-warn .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-flat-button:not([class*=mat-elevation-z]),.mat-stroked-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-raised-button:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-raised-button.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]),.mat-mini-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab.mat-button-disabled:not([class*=mat-elevation-z]),.mat-mini-fab.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-button-toggle-group,.mat-button-toggle-standalone{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-button-toggle-group-appearance-standard,.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{box-shadow:none}.mat-button-toggle{color:rgba(0,0,0,.38)}.mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.12)}.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87);background:#fff}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}.mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:1px solid rgba(0,0,0,.12)}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:1px solid rgba(0,0,0,.12)}.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87)}.mat-button-toggle-disabled{color:rgba(0,0,0,.26);background-color:#eee}.mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.mat-button-toggle-group-appearance-standard,.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{border:1px solid rgba(0,0,0,.12)}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{line-height:48px}.mat-card{background:#fff;color:rgba(0,0,0,.87)}.mat-card:not([class*=mat-elevation-z]){box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-card.mat-card-flat:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-card-subtitle{color:rgba(0,0,0,.54)}.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.mat-checkbox-checkmark{fill:#fafafa}.mat-checkbox-checkmark-path{stroke:#fafafa!important}.mat-checkbox-mixedmark{background-color:#fafafa}.mat-checkbox-checked.mat-primary .mat-checkbox-background,.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#0072ff}.mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.mat-checkbox-checked.mat-warn .mat-checkbox-background,.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,.54)}.mat-checkbox .mat-ripple-element{background-color:#000}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#0072ff}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#ffc125}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#f44336}.mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,.87)}.mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.4}.mat-chip.mat-standard-chip:after{background:#000}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#0072ff;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-table{background:#fff}.mat-table-sticky,.mat-table tbody,.mat-table tfoot,.mat-table thead,[mat-footer-row],[mat-header-row],[mat-row],mat-footer-row,mat-header-row,mat-row{background:inherit}mat-footer-row,mat-header-row,mat-row,td.mat-cell,td.mat-footer-cell,th.mat-header-cell{border-bottom-color:rgba(0,0,0,.12)}.mat-header-cell{color:rgba(0,0,0,.54)}.mat-cell,.mat-footer-cell{color:rgba(0,0,0,.87)}.mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.mat-datepicker-content .mat-calendar-next-button,.mat-datepicker-content .mat-calendar-previous-button,.mat-datepicker-toggle{color:rgba(0,0,0,.54)}.mat-calendar-table-header{color:rgba(0,0,0,.38)}.mat-calendar-table-header-divider:after{background:rgba(0,0,0,.12)}.mat-calendar-body-label{color:rgba(0,0,0,.54)}.mat-calendar-body-cell-content,.mat-date-range-input-separator{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-form-field-disabled .mat-date-range-input-separator{color:rgba(0,0,0,.38)}.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(0,0,0,.04)}.mat-calendar-body-in-preview{color:rgba(0,0,0,.24)}.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.38)}.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.18)}.mat-calendar-body-in-range:before{background:rgba(0,114,255,.2)}.mat-calendar-body-comparison-identical,.mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.mat-calendar-body-comparison-bridge-start:before,[dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(0,114,255,.2) 50%,rgba(249,171,0,.2) 0)}.mat-calendar-body-comparison-bridge-end:before,[dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(0,114,255,.2) 50%,rgba(249,171,0,.2) 0)}.mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-calendar-body-selected{background-color:#0072ff;color:#fff}.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(0,114,255,.4)}.mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);background-color:#fff;color:rgba(0,0,0,.87)}.mat-datepicker-content.mat-accent .mat-calendar-body-in-range:before{background:rgba(255,193,37,.2)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-start:before,.mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-end:before,.mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.mat-datepicker-content.mat-accent .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#ffc125;color:#fff}.mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,193,37,.4)}.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content.mat-warn .mat-calendar-body-in-range:before{background:rgba(244,67,54,.2)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-start:before,.mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-end:before,.mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.mat-datepicker-content.mat-warn .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#f44336;color:#fff}.mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(244,67,54,.4)}.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content-touch{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-datepicker-toggle-active{color:#0072ff}.mat-datepicker-toggle-active.mat-accent{color:#ffc125}.mat-datepicker-toggle-active.mat-warn{color:#f44336}.mat-date-range-input-inner[disabled]{color:rgba(0,0,0,.38)}.mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.mat-divider{border-top-color:rgba(0,0,0,.12)}.mat-divider-vertical{border-right-color:rgba(0,0,0,.12)}.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-action-row{border-top-color:rgba(0,0,0,.12)}.mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true]),.mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true]),.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true]){background:rgba(0,0,0,.04)}@media (hover:none){.mat-expansion-panel:not(.mat-expanded):not([aria-disabled=true]) .mat-expansion-panel-header:hover{background:#fff}}.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.mat-expansion-indicator:after,.mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.26)}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.mat-expansion-panel-header{height:48px}.mat-expansion-panel-header.mat-expanded{height:64px}.mat-form-field-label,.mat-hint{color:rgba(0,0,0,.6)}.mat-form-field.mat-focused .mat-form-field-label{color:#0072ff}.mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.mat-focused .mat-form-field-required-marker{color:#ffc125}.mat-form-field-ripple{background-color:rgba(0,0,0,.87)}.mat-form-field.mat-focused .mat-form-field-ripple{background-color:#0072ff}.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#ffc125}.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#f44336}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix:after{color:#0072ff}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix:after{color:#ffc125}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix:after,.mat-form-field.mat-form-field-invalid .mat-form-field-label,.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,.mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker{color:#f44336}.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#f44336}.mat-error{color:#f44336}.mat-form-field-appearance-legacy .mat-form-field-label,.mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,.54)}.mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,.04)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,.02)}.mat-form-field-appearance-fill .mat-form-field-underline:before{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline:before{background-color:transparent}.mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,.12)}.mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,.87)}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#0072ff}.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#ffc125}.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick,.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#f44336}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,.06)}.mat-icon.mat-primary{color:#0072ff}.mat-icon.mat-accent{color:#ffc125}.mat-icon.mat-warn{color:#f44336}.mat-form-field-type-mat-native-select .mat-form-field-infix:after{color:rgba(0,0,0,.54)}.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix:after,.mat-input-element:disabled{color:rgba(0,0,0,.38)}.mat-input-element{caret-color:#0072ff}.mat-input-element::placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-form-field.mat-accent .mat-input-element{caret-color:#ffc125}.mat-form-field-invalid .mat-input-element,.mat-form-field.mat-warn .mat-input-element{caret-color:#f44336}.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix:after{color:#f44336}.mat-list-base .mat-list-item,.mat-list-base .mat-list-option{color:rgba(0,0,0,.87)}.mat-list-base .mat-subheader{color:rgba(0,0,0,.54)}.mat-list-item-disabled{background-color:#eee}.mat-action-list .mat-list-item:focus,.mat-action-list .mat-list-item:hover,.mat-list-option:focus,.mat-list-option:hover,.mat-nav-list .mat-list-item:focus,.mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.mat-list-single-selected-option,.mat-list-single-selected-option:focus,.mat-list-single-selected-option:hover{background:rgba(0,0,0,.12)}.mat-menu-panel{background:#fff}.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-menu-item{background:transparent;color:rgba(0,0,0,.87)}.mat-menu-item[disabled],.mat-menu-item[disabled] .mat-icon-no-color,.mat-menu-item[disabled]:after{color:rgba(0,0,0,.38)}.mat-menu-item-submenu-trigger:after,.mat-menu-item .mat-icon-no-color{color:rgba(0,0,0,.54)}.mat-menu-item-highlighted:not([disabled]),.mat-menu-item.cdk-keyboard-focused:not([disabled]),.mat-menu-item.cdk-program-focused:not([disabled]),.mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.mat-paginator{background:#fff}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.mat-paginator-first,.mat-paginator-last{border-top:2px solid rgba(0,0,0,.54)}.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-first,.mat-icon-button[disabled] .mat-paginator-increment,.mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,.38)}.mat-paginator-container{min-height:56px}.mat-progress-bar-background{fill:#00c3ff}.mat-progress-bar-buffer{background-color:#00c3ff}.mat-progress-bar-fill:after{background-color:#0072ff}.mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#ffc125}.mat-progress-bar.mat-accent .mat-progress-bar-buffer,.mat-progress-bar.mat-accent .mat-progress-bar-fill:after{background-color:#ffc125}.mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#ffcdd2}.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.mat-progress-bar.mat-warn .mat-progress-bar-fill:after{background-color:#f44336}.mat-progress-spinner circle,.mat-spinner circle{stroke:#0072ff}.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ffc125}.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#0072ff}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-primary .mat-radio-inner-circle,.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#0072ff}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-accent .mat-radio-inner-circle,.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#ffc125}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-warn .mat-radio-inner-circle,.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#f44336}.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle,.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.mat-radio-button .mat-ripple-element{background-color:#000}.mat-select-value{color:rgba(0,0,0,.87)}.mat-select-placeholder{color:rgba(0,0,0,.42)}.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.mat-select-arrow{color:rgba(0,0,0,.54)}.mat-select-panel{background:#fff}.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#0072ff}.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.mat-form-field.mat-focused.mat-warn .mat-select-arrow,.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#f44336}.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-drawer{color:rgba(0,0,0,.87)}.mat-drawer,.mat-drawer.mat-drawer-push{background-color:#fff}.mat-drawer:not(.mat-drawer-side){box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-drawer-side{border-right:1px solid rgba(0,0,0,.12)}.mat-drawer-side.mat-drawer-end,[dir=rtl] .mat-drawer-side{border-left:1px solid rgba(0,0,0,.12);border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#ffc125}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(255,193,37,.54)}.mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#ffc125}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#0072ff}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:rgba(0,114,255,.54)}.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#0072ff}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#f44336}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(244,67,54,.54)}.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#f44336}.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}.mat-slide-toggle-thumb{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa}.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label,.mat-primary .mat-slider-track-fill{background-color:#0072ff}.mat-primary .mat-slider-thumb-label-text{color:#fff}.mat-primary .mat-slider-focus-ring{background-color:rgba(0,114,255,.2)}.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label,.mat-accent .mat-slider-track-fill{background-color:#ffc125}.mat-accent .mat-slider-thumb-label-text{color:#fff}.mat-accent .mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label,.mat-warn .mat-slider-track-fill{background-color:#f44336}.mat-warn .mat-slider-thumb-label-text{color:#fff}.mat-warn .mat-slider-focus-ring{background-color:rgba(244,67,54,.2)}.cdk-focused .mat-slider-track-background,.mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.mat-slider-disabled .mat-slider-thumb,.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.mat-slider-has-ticks .mat-slider-wrapper:after{border-color:rgba(0,0,0,.7)}.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(90deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(180deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,.04)}@media (hover:none){.mat-step-header:hover{background:none}}.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.54)}.mat-step-header .mat-step-icon{background-color:rgba(0,0,0,.54);color:#fff}.mat-step-header .mat-step-icon-selected,.mat-step-header .mat-step-icon-state-done,.mat-step-header .mat-step-icon-state-edit{background-color:#0072ff;color:#fff}.mat-step-header.mat-accent .mat-step-icon{color:#fff}.mat-step-header.mat-accent .mat-step-icon-selected,.mat-step-header.mat-accent .mat-step-icon-state-done,.mat-step-header.mat-accent .mat-step-icon-state-edit{background-color:#ffc125;color:#fff}.mat-step-header.mat-warn .mat-step-icon{color:#fff}.mat-step-header.mat-warn .mat-step-icon-selected,.mat-step-header.mat-warn .mat-step-icon-state-done,.mat-step-header.mat-warn .mat-step-icon-state-edit{background-color:#f44336;color:#fff}.mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#f44336}.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.mat-step-header .mat-step-label.mat-step-label-error{color:#f44336}.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}.mat-stepper-vertical-line:before{border-left-color:rgba(0,0,0,.12)}.mat-horizontal-stepper-header:after,.mat-horizontal-stepper-header:before,.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.mat-horizontal-stepper-header{height:72px}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header,.mat-vertical-stepper-header{padding:24px}.mat-stepper-vertical-line:before{top:-16px;bottom:-16px}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:after,.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:before,.mat-stepper-label-position-bottom .mat-stepper-horizontal-line{top:36px}.mat-sort-header-arrow{color:#757575}.mat-tab-header,.mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.mat-tab-group-inverted-header .mat-tab-header,.mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#0072ff}.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-background-primary .mat-tab-header,.mat-tab-group.mat-background-primary .mat-tab-header-pagination,.mat-tab-group.mat-background-primary .mat-tab-links,.mat-tab-nav-bar.mat-background-primary .mat-tab-header,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#0072ff}.mat-tab-group.mat-background-primary .mat-tab-label,.mat-tab-group.mat-background-primary .mat-tab-link,.mat-tab-nav-bar.mat-background-primary .mat-tab-label,.mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-primary .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-background-accent .mat-tab-header,.mat-tab-group.mat-background-accent .mat-tab-header-pagination,.mat-tab-group.mat-background-accent .mat-tab-links,.mat-tab-nav-bar.mat-background-accent .mat-tab-header,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffc125}.mat-tab-group.mat-background-accent .mat-tab-label,.mat-tab-group.mat-background-accent .mat-tab-link,.mat-tab-nav-bar.mat-background-accent .mat-tab-label,.mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-accent .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-background-warn .mat-tab-header,.mat-tab-group.mat-background-warn .mat-tab-header-pagination,.mat-tab-group.mat-background-warn .mat-tab-links,.mat-tab-nav-bar.mat-background-warn .mat-tab-header,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.mat-tab-group.mat-background-warn .mat-tab-label,.mat-tab-group.mat-background-warn .mat-tab-link,.mat-tab-nav-bar.mat-background-warn .mat-tab-label,.mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-warn .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.mat-toolbar.mat-primary{background:#0072ff;color:#fff}.mat-toolbar.mat-accent{background:#ffc125;color:#fff}.mat-toolbar.mat-warn{background:#f44336;color:#fff}.mat-toolbar .mat-focused .mat-form-field-ripple,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-form-field-underline{background-color:currentColor}.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-select-value{color:inherit}.mat-toolbar .mat-input-element{caret-color:currentColor}.mat-toolbar-multiple-rows{min-height:64px}.mat-toolbar-row,.mat-toolbar-single-row{height:64px}@media (max-width:599px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}.mat-tooltip{background:rgba(97,97,97,.9)}.mat-tree{background:#fff}.mat-nested-tree-node,.mat-tree-node{color:rgba(0,0,0,.87)}.mat-tree-node{min-height:48px}.mat-snack-bar-container{color:hsla(0,0%,100%,.7);background:#323232;box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-simple-snackbar-action{color:#ffc125}.light-button-theme .mat-ripple-element{background-color:rgba(0,0,0,.1)}.light-button-theme .mat-option{color:rgba(0,0,0,.87)}.light-button-theme .mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled),.light-button-theme .mat-option:focus:not(.mat-option-disabled),.light-button-theme .mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.light-button-theme .mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.light-button-theme .mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.light-button-theme .mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#777}.light-button-theme .mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.light-button-theme .mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.light-button-theme .mat-optgroup-label{color:rgba(0,0,0,.54)}.light-button-theme .mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.light-button-theme .mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.light-button-theme .mat-pseudo-checkbox:after{color:#fafafa}.light-button-theme .mat-pseudo-checkbox-disabled{color:#b0b0b0}.light-button-theme .mat-primary .mat-pseudo-checkbox-checked,.light-button-theme .mat-primary .mat-pseudo-checkbox-indeterminate{background:#777}.light-button-theme .mat-accent .mat-pseudo-checkbox-checked,.light-button-theme .mat-accent .mat-pseudo-checkbox-indeterminate,.light-button-theme .mat-pseudo-checkbox-checked,.light-button-theme .mat-pseudo-checkbox-indeterminate{background:#ffc125}.light-button-theme .mat-warn .mat-pseudo-checkbox-checked,.light-button-theme .mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.light-button-theme .mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.light-button-theme .mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.light-button-theme.mat-app-background,.light-button-theme .mat-app-background{background-color:#fafafa;color:rgba(0,0,0,.87)}.light-button-theme .mat-elevation-z0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-theme-loaded-marker{display:none}.light-button-theme .mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.light-button-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.light-button-theme .mat-badge-content{color:#777;background:#777}.cdk-high-contrast-active .light-button-theme .mat-badge-content{outline:1px solid;border-radius:0}.light-button-theme .mat-badge-accent .mat-badge-content{background:#ffc125;color:#fff}.light-button-theme .mat-badge-warn .mat-badge-content{color:#fff;background:#f44336}.light-button-theme .mat-badge{position:relative}.light-button-theme .mat-badge-hidden .mat-badge-content{display:none}.light-button-theme .mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,.38)}.light-button-theme .mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform .2s ease-in-out;transform:scale(.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}.light-button-theme .mat-badge-content._mat-animation-noopable,.light-button-theme .ng-animate-disabled .mat-badge-content{transition:none}.light-button-theme .mat-badge-content.mat-badge-active{transform:none}.light-button-theme .mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}.light-button-theme .mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}.light-button-theme .mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}.light-button-theme .mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}[dir=rtl] .light-button-theme .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}.light-button-theme .mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}[dir=rtl] .light-button-theme .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}.light-button-theme .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}[dir=rtl] .light-button-theme .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}.light-button-theme .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}[dir=rtl] .light-button-theme .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}.light-button-theme .mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}.light-button-theme .mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}.light-button-theme .mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}.light-button-theme .mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}[dir=rtl] .light-button-theme .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}.light-button-theme .mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}[dir=rtl] .light-button-theme .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}.light-button-theme .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}[dir=rtl] .light-button-theme .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}.light-button-theme .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}[dir=rtl] .light-button-theme .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}.light-button-theme .mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}.light-button-theme .mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}.light-button-theme .mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}.light-button-theme .mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}[dir=rtl] .light-button-theme .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}.light-button-theme .mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}[dir=rtl] .light-button-theme .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}.light-button-theme .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}[dir=rtl] .light-button-theme .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}.light-button-theme .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}[dir=rtl] .light-button-theme .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}.light-button-theme .mat-bottom-sheet-container{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-button,.light-button-theme .mat-icon-button,.light-button-theme .mat-stroked-button{color:inherit;background:transparent}.light-button-theme .mat-button.mat-primary,.light-button-theme .mat-icon-button.mat-primary,.light-button-theme .mat-stroked-button.mat-primary{color:#777}.light-button-theme .mat-button.mat-accent,.light-button-theme .mat-icon-button.mat-accent,.light-button-theme .mat-stroked-button.mat-accent{color:#ffc125}.light-button-theme .mat-button.mat-warn,.light-button-theme .mat-icon-button.mat-warn,.light-button-theme .mat-stroked-button.mat-warn{color:#f44336}.light-button-theme .mat-button.mat-accent.mat-button-disabled,.light-button-theme .mat-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-button.mat-primary.mat-button-disabled,.light-button-theme .mat-button.mat-warn.mat-button-disabled,.light-button-theme .mat-icon-button.mat-accent.mat-button-disabled,.light-button-theme .mat-icon-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-icon-button.mat-primary.mat-button-disabled,.light-button-theme .mat-icon-button.mat-warn.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-accent.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-primary.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.light-button-theme .mat-button.mat-primary .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-primary .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#777}.light-button-theme .mat-button.mat-accent .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-accent .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#ffc125}.light-button-theme .mat-button.mat-warn .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-warn .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#f44336}.light-button-theme .mat-button.mat-button-disabled .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-button-disabled .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-button-disabled .mat-button-focus-overlay{background-color:transparent}.light-button-theme .mat-button .mat-ripple-element,.light-button-theme .mat-icon-button .mat-ripple-element,.light-button-theme .mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}.light-button-theme .mat-button-focus-overlay{background:#000}.light-button-theme .mat-stroked-button:not(.mat-button-disabled){border-color:rgba(0,0,0,.12)}.light-button-theme .mat-fab,.light-button-theme .mat-flat-button,.light-button-theme .mat-mini-fab,.light-button-theme .mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.light-button-theme .mat-fab.mat-primary,.light-button-theme .mat-flat-button.mat-primary,.light-button-theme .mat-mini-fab.mat-primary,.light-button-theme .mat-raised-button.mat-primary{color:#777}.light-button-theme .mat-fab.mat-accent,.light-button-theme .mat-fab.mat-warn,.light-button-theme .mat-flat-button.mat-accent,.light-button-theme .mat-flat-button.mat-warn,.light-button-theme .mat-mini-fab.mat-accent,.light-button-theme .mat-mini-fab.mat-warn,.light-button-theme .mat-raised-button.mat-accent,.light-button-theme .mat-raised-button.mat-warn{color:#fff}.light-button-theme .mat-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-flat-button.mat-accent.mat-button-disabled,.light-button-theme .mat-flat-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-flat-button.mat-primary.mat-button-disabled,.light-button-theme .mat-flat-button.mat-warn.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-raised-button.mat-accent.mat-button-disabled,.light-button-theme .mat-raised-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-raised-button.mat-primary.mat-button-disabled,.light-button-theme .mat-raised-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.light-button-theme .mat-fab.mat-primary,.light-button-theme .mat-flat-button.mat-primary,.light-button-theme .mat-mini-fab.mat-primary,.light-button-theme .mat-raised-button.mat-primary{background-color:#777}.light-button-theme .mat-fab.mat-accent,.light-button-theme .mat-flat-button.mat-accent,.light-button-theme .mat-mini-fab.mat-accent,.light-button-theme .mat-raised-button.mat-accent{background-color:#ffc125}.light-button-theme .mat-fab.mat-warn,.light-button-theme .mat-flat-button.mat-warn,.light-button-theme .mat-mini-fab.mat-warn,.light-button-theme .mat-raised-button.mat-warn{background-color:#f44336}.light-button-theme .mat-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-flat-button.mat-accent.mat-button-disabled,.light-button-theme .mat-flat-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-flat-button.mat-primary.mat-button-disabled,.light-button-theme .mat-flat-button.mat-warn.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-raised-button.mat-accent.mat-button-disabled,.light-button-theme .mat-raised-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-raised-button.mat-primary.mat-button-disabled,.light-button-theme .mat-raised-button.mat-warn.mat-button-disabled{background-color:rgba(0,0,0,.12)}.light-button-theme .mat-fab.mat-primary .mat-ripple-element,.light-button-theme .mat-flat-button.mat-primary .mat-ripple-element,.light-button-theme .mat-mini-fab.mat-primary .mat-ripple-element,.light-button-theme .mat-raised-button.mat-primary .mat-ripple-element{background-color:hsla(0,0%,46.7%,.1)}.light-button-theme .mat-fab.mat-accent .mat-ripple-element,.light-button-theme .mat-fab.mat-warn .mat-ripple-element,.light-button-theme .mat-flat-button.mat-accent .mat-ripple-element,.light-button-theme .mat-flat-button.mat-warn .mat-ripple-element,.light-button-theme .mat-mini-fab.mat-accent .mat-ripple-element,.light-button-theme .mat-mini-fab.mat-warn .mat-ripple-element,.light-button-theme .mat-raised-button.mat-accent .mat-ripple-element,.light-button-theme .mat-raised-button.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.light-button-theme .mat-flat-button:not([class*=mat-elevation-z]),.light-button-theme .mat-stroked-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-raised-button:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.light-button-theme .mat-raised-button.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-fab:not([class*=mat-elevation-z]),.light-button-theme .mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.light-button-theme .mat-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]),.light-button-theme .mat-mini-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.light-button-theme .mat-fab.mat-button-disabled:not([class*=mat-elevation-z]),.light-button-theme .mat-mini-fab.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-group,.light-button-theme .mat-button-toggle-standalone{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-group-appearance-standard,.light-button-theme .mat-button-toggle-standalone.mat-button-toggle-appearance-standard{box-shadow:none}.light-button-theme .mat-button-toggle{color:rgba(0,0,0,.38)}.light-button-theme .mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87);background:#fff}.light-button-theme .mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}.light-button-theme .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:1px solid rgba(0,0,0,.12)}.light-button-theme [dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.light-button-theme .mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87)}.light-button-theme .mat-button-toggle-disabled{color:rgba(0,0,0,.26);background-color:#eee}.light-button-theme .mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}.light-button-theme .mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.light-button-theme .mat-button-toggle-group-appearance-standard,.light-button-theme .mat-button-toggle-standalone.mat-button-toggle-appearance-standard{border:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-card{background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-card:not([class*=mat-elevation-z]){box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.light-button-theme .mat-card.mat-card-flat:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-card-subtitle{color:rgba(0,0,0,.54)}.light-button-theme .mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.light-button-theme .mat-checkbox-checkmark{fill:#fafafa}.light-button-theme .mat-checkbox-checkmark-path{stroke:#fafafa!important}.light-button-theme .mat-checkbox-mixedmark{background-color:#fafafa}.light-button-theme .mat-checkbox-checked.mat-primary .mat-checkbox-background,.light-button-theme .mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#777}.light-button-theme .mat-checkbox-checked.mat-accent .mat-checkbox-background,.light-button-theme .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.light-button-theme .mat-checkbox-checked.mat-warn .mat-checkbox-background,.light-button-theme .mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.light-button-theme .mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.light-button-theme .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.light-button-theme .mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.light-button-theme .mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,.54)}.light-button-theme .mat-checkbox .mat-ripple-element{background-color:#000}.light-button-theme .mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.light-button-theme .mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#777}.light-button-theme .mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.light-button-theme .mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#ffc125}.light-button-theme .mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.light-button-theme .mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#f44336}.light-button-theme .mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,.87)}.light-button-theme .mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.light-button-theme .mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.light-button-theme .mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:.54}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.4}.light-button-theme .mat-chip.mat-standard-chip:after{background:#000}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#777;color:#777}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#777;opacity:.4}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background-color:hsla(0,0%,46.7%,.1)}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.light-button-theme .mat-table{background:#fff}.light-button-theme .mat-table-sticky,.light-button-theme .mat-table tbody,.light-button-theme .mat-table tfoot,.light-button-theme .mat-table thead,.light-button-theme [mat-footer-row],.light-button-theme [mat-header-row],.light-button-theme [mat-row],.light-button-theme mat-footer-row,.light-button-theme mat-header-row,.light-button-theme mat-row{background:inherit}.light-button-theme mat-footer-row,.light-button-theme mat-header-row,.light-button-theme mat-row,.light-button-theme td.mat-cell,.light-button-theme td.mat-footer-cell,.light-button-theme th.mat-header-cell{border-bottom-color:rgba(0,0,0,.12)}.light-button-theme .mat-header-cell{color:rgba(0,0,0,.54)}.light-button-theme .mat-cell,.light-button-theme .mat-footer-cell{color:rgba(0,0,0,.87)}.light-button-theme .mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.light-button-theme .mat-datepicker-content .mat-calendar-next-button,.light-button-theme .mat-datepicker-content .mat-calendar-previous-button,.light-button-theme .mat-datepicker-toggle{color:rgba(0,0,0,.54)}.light-button-theme .mat-calendar-table-header{color:rgba(0,0,0,.38)}.light-button-theme .mat-calendar-table-header-divider:after{background:rgba(0,0,0,.12)}.light-button-theme .mat-calendar-body-label{color:rgba(0,0,0,.54)}.light-button-theme .mat-calendar-body-cell-content,.light-button-theme .mat-date-range-input-separator{color:rgba(0,0,0,.87);border-color:transparent}.light-button-theme .mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .mat-form-field-disabled .mat-date-range-input-separator{color:rgba(0,0,0,.38)}.light-button-theme .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(0,0,0,.04)}.light-button-theme .mat-calendar-body-in-preview{color:rgba(0,0,0,.24)}.light-button-theme .mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.38)}.light-button-theme .mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.18)}.light-button-theme .mat-calendar-body-in-range:before{background:hsla(0,0%,46.7%,.2)}.light-button-theme .mat-calendar-body-comparison-identical,.light-button-theme .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.light-button-theme .mat-calendar-body-comparison-bridge-start:before,.light-button-theme [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,hsla(0,0%,46.7%,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-calendar-body-comparison-bridge-end:before,.light-button-theme [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,hsla(0,0%,46.7%,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.light-button-theme .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.light-button-theme .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.light-button-theme .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.light-button-theme .mat-calendar-body-selected{background-color:#777;color:#777}.light-button-theme .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:hsla(0,0%,46.7%,.4)}.light-button-theme .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #777}.light-button-theme .mat-datepicker-content{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);background-color:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-range:before{background:rgba(255,193,37,.2)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical,.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-start:before,.light-button-theme .mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-end:before,.light-button-theme .mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#ffc125;color:#fff}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,193,37,.4)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-range:before{background:rgba(244,67,54,.2)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical,.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-start:before,.light-button-theme .mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-end:before,.light-button-theme .mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#f44336;color:#fff}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(244,67,54,.4)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.light-button-theme .mat-datepicker-content-touch{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-datepicker-toggle-active{color:#777}.light-button-theme .mat-datepicker-toggle-active.mat-accent{color:#ffc125}.light-button-theme .mat-datepicker-toggle-active.mat-warn{color:#f44336}.light-button-theme .mat-date-range-input-inner[disabled]{color:rgba(0,0,0,.38)}.light-button-theme .mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-divider{border-top-color:rgba(0,0,0,.12)}.light-button-theme .mat-divider-vertical{border-right-color:rgba(0,0,0,.12)}.light-button-theme .mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-action-row{border-top-color:rgba(0,0,0,.12)}.light-button-theme .mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true]),.light-button-theme .mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true]),.light-button-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true]){background:rgba(0,0,0,.04)}@media (hover:none){.light-button-theme .mat-expansion-panel:not(.mat-expanded):not([aria-disabled=true]) .mat-expansion-panel-header:hover{background:#fff}}.light-button-theme .mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.light-button-theme .mat-expansion-indicator:after,.light-button-theme .mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.light-button-theme .mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.26)}.light-button-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.light-button-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.light-button-theme .mat-form-field-label,.light-button-theme .mat-hint{color:rgba(0,0,0,.6)}.light-button-theme .mat-form-field.mat-focused .mat-form-field-label{color:#777}.light-button-theme .mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.light-button-theme .mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.light-button-theme .mat-focused .mat-form-field-required-marker{color:#ffc125}.light-button-theme .mat-form-field-ripple{background-color:rgba(0,0,0,.87)}.light-button-theme .mat-form-field.mat-focused .mat-form-field-ripple{background-color:#777}.light-button-theme .mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#ffc125}.light-button-theme .mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#f44336}.light-button-theme .mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix:after{color:#777}.light-button-theme .mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix:after{color:#ffc125}.light-button-theme .mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix:after,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-label,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker{color:#f44336}.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#f44336}.light-button-theme .mat-error{color:#f44336}.light-button-theme .mat-form-field-appearance-legacy .mat-form-field-label,.light-button-theme .mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,.54)}.light-button-theme .mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.light-button-theme .mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.light-button-theme .mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,.04)}.light-button-theme .mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,.02)}.light-button-theme .mat-form-field-appearance-fill .mat-form-field-underline:before{background-color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.light-button-theme .mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline:before{background-color:transparent}.light-button-theme .mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,.12)}.light-button-theme .mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,.87)}.light-button-theme .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#777}.light-button-theme .mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#ffc125}.light-button-theme .mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick,.light-button-theme .mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#f44336}.light-button-theme .mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.light-button-theme .mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,.06)}.light-button-theme .mat-icon.mat-primary{color:#777}.light-button-theme .mat-icon.mat-accent{color:#ffc125}.light-button-theme .mat-icon.mat-warn{color:#f44336}.light-button-theme .mat-form-field-type-mat-native-select .mat-form-field-infix:after{color:rgba(0,0,0,.54)}.light-button-theme .mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix:after,.light-button-theme .mat-input-element:disabled{color:rgba(0,0,0,.38)}.light-button-theme .mat-input-element{caret-color:#777}.light-button-theme .mat-input-element::placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field.mat-accent .mat-input-element{caret-color:#ffc125}.light-button-theme .mat-form-field-invalid .mat-input-element,.light-button-theme .mat-form-field.mat-warn .mat-input-element{caret-color:#f44336}.light-button-theme .mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix:after{color:#f44336}.light-button-theme .mat-list-base .mat-list-item,.light-button-theme .mat-list-base .mat-list-option{color:rgba(0,0,0,.87)}.light-button-theme .mat-list-base .mat-subheader{color:rgba(0,0,0,.54)}.light-button-theme .mat-list-item-disabled{background-color:#eee}.light-button-theme .mat-action-list .mat-list-item:focus,.light-button-theme .mat-action-list .mat-list-item:hover,.light-button-theme .mat-list-option:focus,.light-button-theme .mat-list-option:hover,.light-button-theme .mat-nav-list .mat-list-item:focus,.light-button-theme .mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.light-button-theme .mat-list-single-selected-option,.light-button-theme .mat-list-single-selected-option:focus,.light-button-theme .mat-list-single-selected-option:hover{background:rgba(0,0,0,.12)}.light-button-theme .mat-menu-panel{background:#fff}.light-button-theme .mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-menu-item{background:transparent;color:rgba(0,0,0,.87)}.light-button-theme .mat-menu-item[disabled],.light-button-theme .mat-menu-item[disabled] .mat-icon-no-color,.light-button-theme .mat-menu-item[disabled]:after{color:rgba(0,0,0,.38)}.light-button-theme .mat-menu-item-submenu-trigger:after,.light-button-theme .mat-menu-item .mat-icon-no-color{color:rgba(0,0,0,.54)}.light-button-theme .mat-menu-item-highlighted:not([disabled]),.light-button-theme .mat-menu-item.cdk-keyboard-focused:not([disabled]),.light-button-theme .mat-menu-item.cdk-program-focused:not([disabled]),.light-button-theme .mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.light-button-theme .mat-paginator{background:#fff}.light-button-theme .mat-paginator,.light-button-theme .mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.light-button-theme .mat-paginator-decrement,.light-button-theme .mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.light-button-theme .mat-paginator-first,.light-button-theme .mat-paginator-last{border-top:2px solid rgba(0,0,0,.54)}.light-button-theme .mat-icon-button[disabled] .mat-paginator-decrement,.light-button-theme .mat-icon-button[disabled] .mat-paginator-first,.light-button-theme .mat-icon-button[disabled] .mat-paginator-increment,.light-button-theme .mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-progress-bar-background{fill:#777}.light-button-theme .mat-progress-bar-buffer,.light-button-theme .mat-progress-bar-fill:after{background-color:#777}.light-button-theme .mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#ffc125}.light-button-theme .mat-progress-bar.mat-accent .mat-progress-bar-buffer,.light-button-theme .mat-progress-bar.mat-accent .mat-progress-bar-fill:after{background-color:#ffc125}.light-button-theme .mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#ffcdd2}.light-button-theme .mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.light-button-theme .mat-progress-bar.mat-warn .mat-progress-bar-fill:after{background-color:#f44336}.light-button-theme .mat-progress-spinner circle,.light-button-theme .mat-spinner circle{stroke:#777}.light-button-theme .mat-progress-spinner.mat-accent circle,.light-button-theme .mat-spinner.mat-accent circle{stroke:#ffc125}.light-button-theme .mat-progress-spinner.mat-warn circle,.light-button-theme .mat-spinner.mat-warn circle{stroke:#f44336}.light-button-theme .mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.light-button-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#777}.light-button-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.light-button-theme .mat-radio-button.mat-primary .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.light-button-theme .mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#777}.light-button-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.light-button-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.light-button-theme .mat-radio-button.mat-accent .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.light-button-theme .mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#ffc125}.light-button-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.light-button-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.light-button-theme .mat-radio-button.mat-warn .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.light-button-theme .mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#f44336}.light-button-theme .mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.light-button-theme .mat-radio-button .mat-ripple-element{background-color:#000}.light-button-theme .mat-select-value{color:rgba(0,0,0,.87)}.light-button-theme .mat-select-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.light-button-theme .mat-select-arrow{color:rgba(0,0,0,.54)}.light-button-theme .mat-select-panel{background:#fff}.light-button-theme .mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.light-button-theme .mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#777}.light-button-theme .mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.light-button-theme .mat-form-field.mat-focused.mat-warn .mat-select-arrow,.light-button-theme .mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#f44336}.light-button-theme .mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.light-button-theme .mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.light-button-theme .mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-drawer.mat-drawer-push{background-color:#fff}.light-button-theme .mat-drawer:not(.mat-drawer-side){box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.light-button-theme .mat-drawer-side{border-right:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-drawer-side.mat-drawer-end,.light-button-theme [dir=rtl] .mat-drawer-side{border-left:1px solid rgba(0,0,0,.12);border-right:none}.light-button-theme [dir=rtl] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.light-button-theme .mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#ffc125}.light-button-theme .mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(255,193,37,.54)}.light-button-theme .mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#ffc125}.light-button-theme .mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#777}.light-button-theme .mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:hsla(0,0%,46.7%,.54)}.light-button-theme .mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#777}.light-button-theme .mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#f44336}.light-button-theme .mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(244,67,54,.54)}.light-button-theme .mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#f44336}.light-button-theme .mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}.light-button-theme .mat-slide-toggle-thumb{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa}.light-button-theme .mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.light-button-theme .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.light-button-theme .mat-primary .mat-slider-thumb,.light-button-theme .mat-primary .mat-slider-thumb-label,.light-button-theme .mat-primary .mat-slider-track-fill{background-color:#777}.light-button-theme .mat-primary .mat-slider-thumb-label-text{color:#777}.light-button-theme .mat-primary .mat-slider-focus-ring{background-color:hsla(0,0%,46.7%,.2)}.light-button-theme .mat-accent .mat-slider-thumb,.light-button-theme .mat-accent .mat-slider-thumb-label,.light-button-theme .mat-accent .mat-slider-track-fill{background-color:#ffc125}.light-button-theme .mat-accent .mat-slider-thumb-label-text{color:#fff}.light-button-theme .mat-accent .mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.light-button-theme .mat-warn .mat-slider-thumb,.light-button-theme .mat-warn .mat-slider-thumb-label,.light-button-theme .mat-warn .mat-slider-track-fill{background-color:#f44336}.light-button-theme .mat-warn .mat-slider-thumb-label-text{color:#fff}.light-button-theme .mat-warn .mat-slider-focus-ring{background-color:rgba(244,67,54,.2)}.light-button-theme .cdk-focused .mat-slider-track-background,.light-button-theme .mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.light-button-theme .mat-slider-disabled .mat-slider-thumb,.light-button-theme .mat-slider-disabled .mat-slider-track-background,.light-button-theme .mat-slider-disabled .mat-slider-track-fill,.light-button-theme .mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.light-button-theme .mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.light-button-theme .mat-slider-has-ticks .mat-slider-wrapper:after{border-color:rgba(0,0,0,.7)}.light-button-theme .mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(90deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.light-button-theme .mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(180deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.light-button-theme .mat-step-header.cdk-keyboard-focused,.light-button-theme .mat-step-header.cdk-program-focused,.light-button-theme .mat-step-header:hover{background-color:rgba(0,0,0,.04)}@media (hover:none){.light-button-theme .mat-step-header:hover{background:none}}.light-button-theme .mat-step-header .mat-step-label,.light-button-theme .mat-step-header .mat-step-optional{color:rgba(0,0,0,.54)}.light-button-theme .mat-step-header .mat-step-icon{background-color:rgba(0,0,0,.54);color:#777}.light-button-theme .mat-step-header .mat-step-icon-selected,.light-button-theme .mat-step-header .mat-step-icon-state-done,.light-button-theme .mat-step-header .mat-step-icon-state-edit{background-color:#777;color:#777}.light-button-theme .mat-step-header.mat-accent .mat-step-icon{color:#fff}.light-button-theme .mat-step-header.mat-accent .mat-step-icon-selected,.light-button-theme .mat-step-header.mat-accent .mat-step-icon-state-done,.light-button-theme .mat-step-header.mat-accent .mat-step-icon-state-edit{background-color:#ffc125;color:#fff}.light-button-theme .mat-step-header.mat-warn .mat-step-icon{color:#fff}.light-button-theme .mat-step-header.mat-warn .mat-step-icon-selected,.light-button-theme .mat-step-header.mat-warn .mat-step-icon-state-done,.light-button-theme .mat-step-header.mat-warn .mat-step-icon-state-edit{background-color:#f44336;color:#fff}.light-button-theme .mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#f44336}.light-button-theme .mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.light-button-theme .mat-step-header .mat-step-label.mat-step-label-error{color:#f44336}.light-button-theme .mat-stepper-horizontal,.light-button-theme .mat-stepper-vertical{background-color:#fff}.light-button-theme .mat-stepper-vertical-line:before{border-left-color:rgba(0,0,0,.12)}.light-button-theme .mat-horizontal-stepper-header:after,.light-button-theme .mat-horizontal-stepper-header:before,.light-button-theme .mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.light-button-theme .mat-sort-header-arrow{color:#757575}.light-button-theme .mat-tab-header,.light-button-theme .mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-tab-group-inverted-header .mat-tab-header,.light-button-theme .mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.light-button-theme .mat-tab-label,.light-button-theme .mat-tab-link{color:rgba(0,0,0,.87)}.light-button-theme .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.light-button-theme .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.light-button-theme .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-tab-group[class*=mat-background-] .mat-tab-header,.light-button-theme .mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.light-button-theme .mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:hsla(0,0%,46.7%,.3)}.light-button-theme .mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.light-button-theme .mat-tab-group.mat-primary .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#777}.light-button-theme .mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.light-button-theme .mat-tab-group.mat-accent .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.light-button-theme .mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.light-button-theme .mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.light-button-theme .mat-tab-group.mat-warn .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.light-button-theme .mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:hsla(0,0%,46.7%,.3)}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-header,.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination,.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-links,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#777}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-label,.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-link,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#777}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,46.7%,.4)}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#777}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,46.7%,.4)}.light-button-theme .mat-tab-group.mat-background-primary .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:hsla(0,0%,46.7%,.12)}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-header,.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination,.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-links,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffc125}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-label,.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-link,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-accent .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-header,.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination,.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-links,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-label,.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-link,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-warn .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.light-button-theme .mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.light-button-theme .mat-toolbar.mat-primary{background:#777;color:#777}.light-button-theme .mat-toolbar.mat-accent{background:#ffc125;color:#fff}.light-button-theme .mat-toolbar.mat-warn{background:#f44336;color:#fff}.light-button-theme .mat-toolbar .mat-focused .mat-form-field-ripple,.light-button-theme .mat-toolbar .mat-form-field-ripple,.light-button-theme .mat-toolbar .mat-form-field-underline{background-color:currentColor}.light-button-theme .mat-toolbar .mat-focused .mat-form-field-label,.light-button-theme .mat-toolbar .mat-form-field-label,.light-button-theme .mat-toolbar .mat-form-field.mat-focused .mat-select-arrow,.light-button-theme .mat-toolbar .mat-select-arrow,.light-button-theme .mat-toolbar .mat-select-value{color:inherit}.light-button-theme .mat-toolbar .mat-input-element{caret-color:currentColor}.light-button-theme .mat-tooltip{background:rgba(97,97,97,.9)}.light-button-theme .mat-tree{background:#fff}.light-button-theme .mat-nested-tree-node,.light-button-theme .mat-tree-node{color:rgba(0,0,0,.87)}.light-button-theme .mat-snack-bar-container{color:hsla(0,0%,100%,.7);background:#323232;box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.light-button-theme .mat-simple-snackbar-action{color:#ffc125}a,body,button,div,h1,h2,h3,h4,h5,h6,mat-option.mat-option,mat-panel-description,mat-panel-title,option,p,select,span{font-family:Skycoin,Roboto,Helvetica Neue,sans-serif}.background-fixer{background-color:#f7f7f7;width:100%;height:100%;position:fixed;top:0;left:0;z-index:-1}body,html{height:100%}body{background-color:#f7f7f7;margin:0;padding:0;color:#1e2227;font-size:13px}.mat-tooltip{font-size:11px!important;line-height:1.3}.-flex-fill,.flex-fill{flex:1 1 auto}.link{color:#0072ff;cursor:pointer;text-decoration:none}.alert-box{color:#ff004e;font-size:12px;line-height:1.5;background-color:#ffdede;padding:15px;display:flex;margin-bottom:20px}.alert-box .title{font-size:18px}.alert-box mat-icon{margin-top:5px;margin-right:10px;-webkit-animation:alert-blinking 1s linear infinite;animation:alert-blinking 1s linear infinite}.alert-box mat-checkbox{margin-top:10px;display:inline-block}.alert-box .-check span{color:#1e2227!important}@-webkit-keyframes alert-blinking{50%{opacity:.2}}@keyframes alert-blinking{50%{opacity:.2}}.red{color:#ff004e}.red-field{border:2px solid #ff004e!important;color:#ff004e!important}.error-tooltip{background-color:#ff004e!important}.final-element{width:1px;height:1px} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.e12d12da5d9fd17e084b.css b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.e12d12da5d9fd17e084b.css new file mode 100644 index 0000000000..8d36ca443b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.e12d12da5d9fd17e084b.css @@ -0,0 +1,14 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.8b43027f47b20503057d.eot?v=4.7.0);src:url(fontawesome-webfont.8b43027f47b20503057d.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(fontawesome-webfont.20fd1704ea223900efa9.woff2?v=4.7.0) format("woff2"),url(fontawesome-webfont.f691f37e57f04c152e23.woff?v=4.7.0) format("woff"),url(fontawesome-webfont.1e59d2330b4c6deb84b3.ttf?v=4.7.0) format("truetype"),url(fontawesome-webfont.c1e38fd9e0e74ba58f7a.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@font-face{font-family:Material Icons;font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.4674f8ded773cb03e824.eot);src:local("Material Icons"),local("MaterialIcons-Regular"),url(MaterialIcons-Regular.cff684e59ffb052d72cb.woff2) format("woff2"),url(MaterialIcons-Regular.83bebaf37c09c7e1c3ee.woff) format("woff"),url(MaterialIcons-Regular.5e7382c63da0098d634a.ttf) format("truetype")}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}.-table .-body,.paper{background-color:#fafafa;border-radius:10px;box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px;font-size:13px;overflow:hidden}.-table .small-padding.-body,.paper.small-padding{padding:20px}.-table:last-of-type{margin-bottom:30px}.-table .-headers{color:rgba(30,34,39,.2);display:flex;font-size:12px;font-weight:700;height:50px;line-height:50px;margin:0 30px}.-table .-headers>div{padding:0 20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.-table .-body{padding:0;margin:0 30px}.-table .-body .-row{font-size:13px;padding:15px 0;display:flex;align-items:center}.-table .-body .-row:not(:last-child){border-bottom:1px solid rgba(30,34,39,.05)}.-table .-body .-row>div{padding:0 20px}.-table .-width-50{width:50px;flex-shrink:0}.-table .-width-70{width:70px;flex-shrink:0}.-table .-width-85{width:85px;flex-shrink:0}.-table .-width-130{width:130px;flex-shrink:0}.-table .-width-150{width:150px;flex-shrink:0}.-table .-width-200{width:200px;flex-shrink:0}.-table .-width-250{width:250px;flex-shrink:0}.mat-dialog-content{max-height:90vh!important}@media (max-height:600px){.mat-dialog-content{max-height:80vh!important}}mat-dialog-container{border-radius:6px!important;overflow:hidden}.mat-dialog-container{padding:0!important}.modal{background-color:#fafafa;padding:0 24px;line-height:1.5;font-size:13px;color:rgba(30,34,39,.7)}.modal .-buttons{text-align:center}.modal app-button button{margin-top:28px}.list-button-container{margin:0 -10px}.list-button-container button.top-line:first-of-type{border-top:1px solid rgba(30,34,39,.05)}.list-button-container button{width:100%;text-align:left;padding:10px;border-bottom:1px solid rgba(30,34,39,.05);cursor:pointer}@font-face{font-family:Skycoin;font-style:normal;font-weight:300;src:url(/assets/fonts/skycoin/Skycoin-Light.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-Light.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:300;src:url(/assets/fonts/skycoin/Skycoin-LightItalic.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-LightItalic.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:400;src:url(/assets/fonts/skycoin/Skycoin-Regular.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-Regular.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:400;src:url(/assets/fonts/skycoin/Skycoin-RegularItalic.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-RegularItalic.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:700;src:url(/assets/fonts/skycoin/Skycoin-Bold.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-Bold.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:700;src:url(/assets/fonts/skycoin/Skycoin-BoldItalic.woff2) format("woff2"),url(/assets/fonts/skycoin/Skycoin-BoldItalic.woff) format("woff")}.form-field{margin-bottom:20px}.form-field label{color:#1e2227;display:block;font-size:13px;line-height:1.5;margin-bottom:2px}.form-field .field-base,.form-field input,.form-field mat-select,.form-field mat-slider,.form-field select,.form-field textarea{color:#1e2227;background-color:#fff;border:2px solid rgba(30,34,39,.05);border-radius:6px;box-sizing:border-box;display:block;font-size:13px;line-height:1.5;padding:10px;width:100%}.form-field select{-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-field select option{color:#1e2227}.form-field select option:disabled{color:rgba(30,34,39,.7)}.form-field mat-slider{padding:0;height:40px}.form-field mat-slider .mat-slider-thumb,.form-field mat-slider .mat-slider-thumb-label{background-color:#0072ff!important;transform:scale(1)!important;border-width:0!important}.form-field mat-slider .mat-slider-thumb{right:-6px;width:12px;height:32px;border-radius:3px}.form-field mat-slider .mat-slider-track-background,.form-field mat-slider .mat-slider-track-fill{background-color:#fff!important}.form-field mat-select{padding:0}.form-field mat-select .mat-select-trigger{padding:10px 40px 10px 10px;display:block;font-size:11px;height:100%;line-height:1.9}.form-field mat-select .mat-select-arrow{border:none}.form-field mat-select .mat-select-placeholder{color:unset!important;transition:unset!important}.form-field .-not-allowed input{cursor:not-allowed}mat-option .mat-pseudo-checkbox-checked{background:#0072ff}.mat-option-disabled .mat-pseudo-checkbox-disabled{opacity:.5}.-select{position:relative}.-select:before{content:"";display:block;position:absolute;top:0;right:0;background:url(/assets/img/chevron-right-grey.png) no-repeat;background-size:32px 32px;width:32px;height:32px;margin:6px;pointer-events:none;transform:rotate(90deg)}textarea{resize:none}.element-disabled,.form-field input:disabled,.form-field select:disabled,.form-field textarea:disabled{pointer-events:none!important;opacity:.5!important}.modal-form-container{margin-top:20px}.-check-container{text-align:center;margin-top:25px}.-check label{font-size:13px;max-width:100%;color:#1e2227;white-space:normal;text-align:left}.-check label .img-label-container{position:relative;top:2px}.-check label .img-label-container img{width:38px;height:38px;vertical-align:middle}.-check .mat-checkbox-label{position:relative;top:2px}.-check .mat-checkbox-checkmark-path{stroke:#0072ff!important}.-check .mat-checkbox-background,.-check .mat-checkbox-frame{width:20px;height:20px;background:rgba(30,34,39,.05)!important;border-radius:6px;border-color:transparent}.-check .mat-checkbox-ripple{top:-11px!important;left:-11px!important}.help-icon{display:inline!important;font-size:14px!important;color:rgba(30,34,39,.5);opacity:.55;vertical-align:text-bottom;padding-left:5px;cursor:default}.onboarding-container{width:100%;height:100%;overflow-x:hidden;background:#0072ff;background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.onboarding-container .row-container{max-width:450px;width:80%;margin:0 auto}.onboarding-container label{color:#fafafa!important}.onboarding-container .-header{color:#fafafa;margin-top:20px;margin-bottom:10px;text-align:center;line-height:1.5;font-size:20px}.onboarding-container .-description{font-size:14px;text-align:center;color:#fafafa;opacity:.5}.onboarding-container .-buttons-footer{align-items:center;flex-flow:column;margin-bottom:20px}.onboarding-container .-buttons-footer button{margin:2px 10px!important}.primary-button button.enabled,.primary-gradient-background{background:#0072ff;background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.primary-button button.enabled span,.primary-gradient-background span{color:#fff}.dark-button button.enabled{background-color:#1e2227!important}.dark-button button.enabled span{color:#fff}.ghost-button button.enabled{background-color:transparent!important}.ghost-button button.enabled span{color:#000}.image-button{cursor:pointer;opacity:.5}.image-button:hover{opacity:.75}.image-button:active{opacity:1}.white-text{color:#fafafa!important}.red-text{color:#ff004e!important}.yellow-text{color:#ffc125!important}.green-text{color:#00df80!important}.grey-light-text{color:rgba(30,34,39,.2)!important}.grey-text{color:rgba(30,34,39,.5)!important}.break-all{word-break:break-all}.mat-menu-panel{border-radius:6px!important;background-color:#fafafa}.mat-menu-panel .mat-menu-item{font-family:Skycoin,Roboto,Helvetica Neue,sans-serif} +/*! + * Bootstrap Grid v4.0.0-beta.3 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,:after,:before{box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:none}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.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%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:none}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.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%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:none}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.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%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:none}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.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%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:none}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.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%}}.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-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}.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}@media (min-width:576px){.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-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}.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}}@media (min-width:768px){.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-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}.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}}@media (min-width:992px){.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-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}.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}}@media (min-width:1200px){.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-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}.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}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!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}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!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}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!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}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!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}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!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-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}}@media print{.d-print-none{display:none!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#868e96!important}a.text-secondary:focus,a.text-secondary:hover{color:#6c757d!important}.text-success{color:#00df80!important}a.text-success:focus,a.text-success:hover{color:#00ac63!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc125!important}a.text-warning:focus,a.text-warning:hover{color:#f1ac00!important}.text-danger{color:#ff004e!important}a.text-danger:focus,a.text-danger:hover{color:#cc003e!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#868e96!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,Helvetica Neue,sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * .83)/20px Roboto,Helvetica Neue,sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * .67)/20px Roboto,Helvetica Neue,sans-serif;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-body-1 p,.mat-body p,.mat-typography p{margin:0 0 12px}.mat-caption,.mat-small{font:400 12px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto,Helvetica Neue,sans-serif;letter-spacing:-.05em;margin:0 0 56px}.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto,Helvetica Neue,sans-serif;letter-spacing:-.02em;margin:0 0 64px}.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto,Helvetica Neue,sans-serif;letter-spacing:-.005em;margin:0 0 64px}.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0 0 64px}.mat-bottom-sheet-container{font:400 14px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-button,.mat-fab,.mat-flat-button,.mat-icon-button,.mat-mini-fab,.mat-raised-button,.mat-stroked-button{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500}.mat-button-toggle,.mat-card{font-family:Roboto,Helvetica Neue,sans-serif}.mat-card-title{font-size:24px;font-weight:500}.mat-card-header .mat-card-title{font-size:20px}.mat-card-content,.mat-card-subtitle{font-size:14px}.mat-checkbox{font-family:Roboto,Helvetica Neue,sans-serif}.mat-checkbox-layout .mat-checkbox-label{line-height:24px}.mat-chip{font-size:14px;font-weight:500}.mat-chip .mat-chip-remove.mat-icon,.mat-chip .mat-chip-trailing-icon.mat-icon{font-size:18px}.mat-table{font-family:Roboto,Helvetica Neue,sans-serif}.mat-header-cell{font-size:12px;font-weight:500}.mat-cell,.mat-footer-cell{font-size:14px}.mat-calendar{font-family:Roboto,Helvetica Neue,sans-serif}.mat-calendar-body{font-size:13px}.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}.mat-calendar-table-header th{font-size:11px;font-weight:400}.mat-dialog-title{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-expansion-panel-header{font-family:Roboto,Helvetica Neue,sans-serif;font-size:15px;font-weight:400}.mat-expansion-panel-content{font:400 14px/20px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-form-field{font-size:inherit;font-weight:400;line-height:1.125;font-family:Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-form-field-wrapper{padding-bottom:1.34375em}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}.mat-form-field-infix{padding:.5em 0;border-top:.84375em solid transparent}.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34375em) scale(.75);width:133.33333333%}.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.34374em) scale(.75);width:133.33334333%}.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}.mat-form-field-label{top:1.34375em}.mat-form-field-underline{bottom:1.34375em}.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.66666667em;top:calc(100% - 1.79166667em)}.mat-form-field-appearance-legacy .mat-form-field-wrapper{padding-bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-infix{padding:.4375em 0}.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.33333333%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.33334333%}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.33335333%}.mat-form-field-appearance-legacy .mat-form-field-label{top:1.28125em}.mat-form-field-appearance-legacy .mat-form-field-underline{bottom:1.25em}.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper{margin-top:.54166667em;top:calc(100% - 1.66666667em)}@media print{.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28122em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.28121em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.2812em) scale(.75)}}.mat-form-field-appearance-fill .mat-form-field-infix{padding:.25em 0 .75em}.mat-form-field-appearance-fill .mat-form-field-label{top:1.09375em;margin-top:-.5em}.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-.59375em) scale(.75);width:133.33333333%}.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-.59374em) scale(.75);width:133.33334333%}.mat-form-field-appearance-outline .mat-form-field-infix{padding:1em 0}.mat-form-field-appearance-outline .mat-form-field-label{top:1.84375em;margin-top:-.25em}.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59375em) scale(.75);width:133.33333333%}.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{transform:translateY(-1.59374em) scale(.75);width:133.33334333%}.mat-grid-tile-footer,.mat-grid-tile-header{font-size:14px}.mat-grid-tile-footer .mat-line,.mat-grid-tile-header .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-grid-tile-footer .mat-line:nth-child(n+2),.mat-grid-tile-header .mat-line:nth-child(n+2){font-size:12px}input.mat-input-element{margin-top:-.0625em}.mat-menu-item{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:400}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px}.mat-radio-button,.mat-select{font-family:Roboto,Helvetica Neue,sans-serif}.mat-select-trigger{height:1.125em}.mat-slide-toggle-content,.mat-slider-thumb-label-text{font-family:Roboto,Helvetica Neue,sans-serif}.mat-slider-thumb-label-text{font-size:12px;font-weight:500}.mat-stepper-horizontal,.mat-stepper-vertical{font-family:Roboto,Helvetica Neue,sans-serif}.mat-step-label{font-size:14px;font-weight:400}.mat-step-sub-label-error{font-weight:400}.mat-step-label-error{font-size:14px}.mat-step-label-selected{font-size:14px;font-weight:500}.mat-tab-group,.mat-tab-label,.mat-tab-link{font-family:Roboto,Helvetica Neue,sans-serif}.mat-tab-label,.mat-tab-link{font-size:14px;font-weight:500}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal;margin:0}.mat-tooltip{font-family:Roboto,Helvetica Neue,sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}.mat-tooltip-handset{font-size:14px;padding-top:8px;padding-bottom:8px}.mat-list-item,.mat-list-option{font-family:Roboto,Helvetica Neue,sans-serif}.mat-list-base .mat-list-item{font-size:16px}.mat-list-base .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-item .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-list-option{font-size:16px}.mat-list-base .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base .mat-list-option .mat-line:nth-child(n+2){font-size:14px}.mat-list-base .mat-subheader{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500}.mat-list-base[dense] .mat-list-item{font-size:12px}.mat-list-base[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-list-base[dense] .mat-list-option{font-size:12px}.mat-list-base[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}.mat-list-base[dense] .mat-subheader{font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;font-weight:500}.mat-option{font-family:Roboto,Helvetica Neue,sans-serif;font-size:16px}.mat-optgroup-label{font:500 14px/24px Roboto,Helvetica Neue,sans-serif;letter-spacing:normal}.mat-simple-snackbar{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px}.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}.mat-tree{font-family:Roboto,Helvetica Neue,sans-serif}.mat-nested-tree-node,.mat-tree-node{font-weight:400;font-size:14px}.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0,0,.2,1);transform:scale(0)}.cdk-high-contrast-active .mat-ripple-element{display:none}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;outline:0;-webkit-appearance:none;-moz-appearance:none}.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper,.cdk-overlay-pane{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{pointer-events:auto;box-sizing:border-box;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}@media screen and (-ms-high-contrast:active){.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}@-webkit-keyframes cdk-text-field-autofill-start{ + /*!*/}@keyframes cdk-text-field-autofill-start{ + /*!*/}@-webkit-keyframes cdk-text-field-autofill-end{ + /*!*/}@keyframes cdk-text-field-autofill-end{ + /*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{-webkit-animation:cdk-text-field-autofill-start 0s 1ms;animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){-webkit-animation:cdk-text-field-autofill-end 0s 1ms;animation:cdk-text-field-autofill-end 0s 1ms}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0!important;box-sizing:content-box!important;height:auto!important;overflow:hidden!important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0!important;box-sizing:content-box!important;height:0!important}.mat-focus-indicator,.mat-mdc-focus-indicator{position:relative}.mat-ripple-element{background-color:rgba(0,0,0,.1)}.mat-option{color:rgba(0,0,0,.87)}.mat-option.mat-active,.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled),.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-option.mat-active{color:rgba(0,0,0,.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#0072ff}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.mat-optgroup-label{color:rgba(0,0,0,.54)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.mat-pseudo-checkbox:after{color:#fafafa}.mat-pseudo-checkbox-disabled{color:#b0b0b0}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#0072ff}.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#ffc125}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-elevation-z0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-elevation-z1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-elevation-z2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-elevation-z3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-elevation-z4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-elevation-z5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.mat-elevation-z6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-elevation-z7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.mat-elevation-z8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-elevation-z9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mat-elevation-z10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.mat-elevation-z11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.mat-elevation-z12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-elevation-z13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.mat-elevation-z14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.mat-elevation-z15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.mat-elevation-z16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-elevation-z17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.mat-elevation-z18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.mat-elevation-z19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.mat-elevation-z20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.mat-elevation-z21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.mat-elevation-z22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.mat-elevation-z23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.mat-elevation-z24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.mat-badge-content{color:#fff;background:#0072ff}.cdk-high-contrast-active .mat-badge-content{outline:1px solid;border-radius:0}.mat-badge-accent .mat-badge-content{background:#ffc125;color:#fff}.mat-badge-warn .mat-badge-content{color:#fff;background:#f44336}.mat-badge{position:relative}.mat-badge-hidden .mat-badge-content{display:none}.mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,.38)}.mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform .2s ease-in-out;transform:scale(.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}.mat-badge-content._mat-animation-noopable,.ng-animate-disabled .mat-badge-content{transition:none}.mat-badge-content.mat-badge-active{transform:none}.mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}.mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}.mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}.mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}[dir=rtl] .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}.mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}[dir=rtl] .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}.mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}.mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}.mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}.mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}[dir=rtl] .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}.mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}[dir=rtl] .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}.mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}.mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}.mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}.mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}[dir=rtl] .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}.mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}[dir=rtl] .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}.mat-bottom-sheet-container{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.mat-button,.mat-icon-button,.mat-stroked-button{color:inherit;background:transparent}.mat-button.mat-primary,.mat-icon-button.mat-primary,.mat-stroked-button.mat-primary{color:#0072ff}.mat-button.mat-accent,.mat-icon-button.mat-accent,.mat-stroked-button.mat-accent{color:#ffc125}.mat-button.mat-warn,.mat-icon-button.mat-warn,.mat-stroked-button.mat-warn{color:#f44336}.mat-button.mat-accent.mat-button-disabled,.mat-button.mat-button-disabled.mat-button-disabled,.mat-button.mat-primary.mat-button-disabled,.mat-button.mat-warn.mat-button-disabled,.mat-icon-button.mat-accent.mat-button-disabled,.mat-icon-button.mat-button-disabled.mat-button-disabled,.mat-icon-button.mat-primary.mat-button-disabled,.mat-icon-button.mat-warn.mat-button-disabled,.mat-stroked-button.mat-accent.mat-button-disabled,.mat-stroked-button.mat-button-disabled.mat-button-disabled,.mat-stroked-button.mat-primary.mat-button-disabled,.mat-stroked-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay,.mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#0072ff}.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay,.mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#ffc125}.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay,.mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#f44336}.mat-button.mat-button-disabled .mat-button-focus-overlay,.mat-icon-button.mat-button-disabled .mat-button-focus-overlay,.mat-stroked-button.mat-button-disabled .mat-button-focus-overlay{background-color:transparent}.mat-button .mat-ripple-element,.mat-icon-button .mat-ripple-element,.mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}.mat-button-focus-overlay{background:#000}.mat-stroked-button:not(.mat-button-disabled){border-color:rgba(0,0,0,.12)}.mat-fab,.mat-flat-button,.mat-mini-fab,.mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.mat-fab.mat-accent,.mat-fab.mat-primary,.mat-fab.mat-warn,.mat-flat-button.mat-accent,.mat-flat-button.mat-primary,.mat-flat-button.mat-warn,.mat-mini-fab.mat-accent,.mat-mini-fab.mat-primary,.mat-mini-fab.mat-warn,.mat-raised-button.mat-accent,.mat-raised-button.mat-primary,.mat-raised-button.mat-warn{color:#fff}.mat-fab.mat-accent.mat-button-disabled,.mat-fab.mat-button-disabled.mat-button-disabled,.mat-fab.mat-primary.mat-button-disabled,.mat-fab.mat-warn.mat-button-disabled,.mat-flat-button.mat-accent.mat-button-disabled,.mat-flat-button.mat-button-disabled.mat-button-disabled,.mat-flat-button.mat-primary.mat-button-disabled,.mat-flat-button.mat-warn.mat-button-disabled,.mat-mini-fab.mat-accent.mat-button-disabled,.mat-mini-fab.mat-button-disabled.mat-button-disabled,.mat-mini-fab.mat-primary.mat-button-disabled,.mat-mini-fab.mat-warn.mat-button-disabled,.mat-raised-button.mat-accent.mat-button-disabled,.mat-raised-button.mat-button-disabled.mat-button-disabled,.mat-raised-button.mat-primary.mat-button-disabled,.mat-raised-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.mat-fab.mat-primary,.mat-flat-button.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{background-color:#0072ff}.mat-fab.mat-accent,.mat-flat-button.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{background-color:#ffc125}.mat-fab.mat-warn,.mat-flat-button.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{background-color:#f44336}.mat-fab.mat-accent.mat-button-disabled,.mat-fab.mat-button-disabled.mat-button-disabled,.mat-fab.mat-primary.mat-button-disabled,.mat-fab.mat-warn.mat-button-disabled,.mat-flat-button.mat-accent.mat-button-disabled,.mat-flat-button.mat-button-disabled.mat-button-disabled,.mat-flat-button.mat-primary.mat-button-disabled,.mat-flat-button.mat-warn.mat-button-disabled,.mat-mini-fab.mat-accent.mat-button-disabled,.mat-mini-fab.mat-button-disabled.mat-button-disabled,.mat-mini-fab.mat-primary.mat-button-disabled,.mat-mini-fab.mat-warn.mat-button-disabled,.mat-raised-button.mat-accent.mat-button-disabled,.mat-raised-button.mat-button-disabled.mat-button-disabled,.mat-raised-button.mat-primary.mat-button-disabled,.mat-raised-button.mat-warn.mat-button-disabled{background-color:rgba(0,0,0,.12)}.mat-fab.mat-accent .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-fab.mat-warn .mat-ripple-element,.mat-flat-button.mat-accent .mat-ripple-element,.mat-flat-button.mat-primary .mat-ripple-element,.mat-flat-button.mat-warn .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-flat-button:not([class*=mat-elevation-z]),.mat-stroked-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-raised-button:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-raised-button.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]),.mat-mini-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab.mat-button-disabled:not([class*=mat-elevation-z]),.mat-mini-fab.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-button-toggle-group,.mat-button-toggle-standalone{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-button-toggle-group-appearance-standard,.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{box-shadow:none}.mat-button-toggle{color:rgba(0,0,0,.38)}.mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.12)}.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87);background:#fff}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}.mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:1px solid rgba(0,0,0,.12)}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:1px solid rgba(0,0,0,.12)}.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87)}.mat-button-toggle-disabled{color:rgba(0,0,0,.26);background-color:#eee}.mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.mat-button-toggle-group-appearance-standard,.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{border:1px solid rgba(0,0,0,.12)}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{line-height:48px}.mat-card{background:#fff;color:rgba(0,0,0,.87)}.mat-card:not([class*=mat-elevation-z]){box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-card.mat-card-flat:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-card-subtitle{color:rgba(0,0,0,.54)}.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.mat-checkbox-checkmark{fill:#fafafa}.mat-checkbox-checkmark-path{stroke:#fafafa!important}.mat-checkbox-mixedmark{background-color:#fafafa}.mat-checkbox-checked.mat-primary .mat-checkbox-background,.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#0072ff}.mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.mat-checkbox-checked.mat-warn .mat-checkbox-background,.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,.54)}.mat-checkbox .mat-ripple-element{background-color:#000}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#0072ff}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#ffc125}.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#f44336}.mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,.87)}.mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.4}.mat-chip.mat-standard-chip:after{background:#000}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#0072ff;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.mat-table{background:#fff}.mat-table-sticky,.mat-table tbody,.mat-table tfoot,.mat-table thead,[mat-footer-row],[mat-header-row],[mat-row],mat-footer-row,mat-header-row,mat-row{background:inherit}mat-footer-row,mat-header-row,mat-row,td.mat-cell,td.mat-footer-cell,th.mat-header-cell{border-bottom-color:rgba(0,0,0,.12)}.mat-header-cell{color:rgba(0,0,0,.54)}.mat-cell,.mat-footer-cell{color:rgba(0,0,0,.87)}.mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.mat-datepicker-content .mat-calendar-next-button,.mat-datepicker-content .mat-calendar-previous-button,.mat-datepicker-toggle{color:rgba(0,0,0,.54)}.mat-calendar-table-header{color:rgba(0,0,0,.38)}.mat-calendar-table-header-divider:after{background:rgba(0,0,0,.12)}.mat-calendar-body-label{color:rgba(0,0,0,.54)}.mat-calendar-body-cell-content,.mat-date-range-input-separator{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-form-field-disabled .mat-date-range-input-separator{color:rgba(0,0,0,.38)}.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(0,0,0,.04)}.mat-calendar-body-in-preview{color:rgba(0,0,0,.24)}.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.38)}.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.18)}.mat-calendar-body-in-range:before{background:rgba(0,114,255,.2)}.mat-calendar-body-comparison-identical,.mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.mat-calendar-body-comparison-bridge-start:before,[dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(0,114,255,.2) 50%,rgba(249,171,0,.2) 0)}.mat-calendar-body-comparison-bridge-end:before,[dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(0,114,255,.2) 50%,rgba(249,171,0,.2) 0)}.mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-calendar-body-selected{background-color:#0072ff;color:#fff}.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(0,114,255,.4)}.mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);background-color:#fff;color:rgba(0,0,0,.87)}.mat-datepicker-content.mat-accent .mat-calendar-body-in-range:before{background:rgba(255,193,37,.2)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-start:before,.mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-end:before,.mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.mat-datepicker-content.mat-accent .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#ffc125;color:#fff}.mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,193,37,.4)}.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content.mat-warn .mat-calendar-body-in-range:before{background:rgba(244,67,54,.2)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-start:before,.mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-end:before,.mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.mat-datepicker-content.mat-warn .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#f44336;color:#fff}.mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(244,67,54,.4)}.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.mat-datepicker-content-touch{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-datepicker-toggle-active{color:#0072ff}.mat-datepicker-toggle-active.mat-accent{color:#ffc125}.mat-datepicker-toggle-active.mat-warn{color:#f44336}.mat-date-range-input-inner[disabled]{color:rgba(0,0,0,.38)}.mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.mat-divider{border-top-color:rgba(0,0,0,.12)}.mat-divider-vertical{border-right-color:rgba(0,0,0,.12)}.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-action-row{border-top-color:rgba(0,0,0,.12)}.mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true]),.mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true]),.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true]){background:rgba(0,0,0,.04)}@media (hover:none){.mat-expansion-panel:not(.mat-expanded):not([aria-disabled=true]) .mat-expansion-panel-header:hover{background:#fff}}.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.mat-expansion-indicator:after,.mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.26)}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.mat-expansion-panel-header{height:48px}.mat-expansion-panel-header.mat-expanded{height:64px}.mat-form-field-label,.mat-hint{color:rgba(0,0,0,.6)}.mat-form-field.mat-focused .mat-form-field-label{color:#0072ff}.mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.mat-focused .mat-form-field-required-marker{color:#ffc125}.mat-form-field-ripple{background-color:rgba(0,0,0,.87)}.mat-form-field.mat-focused .mat-form-field-ripple{background-color:#0072ff}.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#ffc125}.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#f44336}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix:after{color:#0072ff}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix:after{color:#ffc125}.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix:after,.mat-form-field.mat-form-field-invalid .mat-form-field-label,.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,.mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker{color:#f44336}.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#f44336}.mat-error{color:#f44336}.mat-form-field-appearance-legacy .mat-form-field-label,.mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,.54)}.mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,.04)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,.02)}.mat-form-field-appearance-fill .mat-form-field-underline:before{background-color:rgba(0,0,0,.42)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline:before{background-color:transparent}.mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,.12)}.mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,.87)}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#0072ff}.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#ffc125}.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick,.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#f44336}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,.06)}.mat-icon.mat-primary{color:#0072ff}.mat-icon.mat-accent{color:#ffc125}.mat-icon.mat-warn{color:#f44336}.mat-form-field-type-mat-native-select .mat-form-field-infix:after{color:rgba(0,0,0,.54)}.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix:after,.mat-input-element:disabled{color:rgba(0,0,0,.38)}.mat-input-element{caret-color:#0072ff}.mat-input-element::placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-form-field.mat-accent .mat-input-element{caret-color:#ffc125}.mat-form-field-invalid .mat-input-element,.mat-form-field.mat-warn .mat-input-element{caret-color:#f44336}.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix:after{color:#f44336}.mat-list-base .mat-list-item,.mat-list-base .mat-list-option{color:rgba(0,0,0,.87)}.mat-list-base .mat-subheader{color:rgba(0,0,0,.54)}.mat-list-item-disabled{background-color:#eee}.mat-action-list .mat-list-item:focus,.mat-action-list .mat-list-item:hover,.mat-list-option:focus,.mat-list-option:hover,.mat-nav-list .mat-list-item:focus,.mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.mat-list-single-selected-option,.mat-list-single-selected-option:focus,.mat-list-single-selected-option:hover{background:rgba(0,0,0,.12)}.mat-menu-panel{background:#fff}.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-menu-item{background:transparent;color:rgba(0,0,0,.87)}.mat-menu-item[disabled],.mat-menu-item[disabled]:after{color:rgba(0,0,0,.38)}.mat-menu-item-submenu-trigger:after,.mat-menu-item .mat-icon-no-color{color:rgba(0,0,0,.54)}.mat-menu-item-highlighted:not([disabled]),.mat-menu-item.cdk-keyboard-focused:not([disabled]),.mat-menu-item.cdk-program-focused:not([disabled]),.mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.mat-paginator{background:#fff}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.mat-paginator-first,.mat-paginator-last{border-top:2px solid rgba(0,0,0,.54)}.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-first,.mat-icon-button[disabled] .mat-paginator-increment,.mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,.38)}.mat-paginator-container{min-height:56px}.mat-progress-bar-background{fill:#00c3ff}.mat-progress-bar-buffer{background-color:#00c3ff}.mat-progress-bar-fill:after{background-color:#0072ff}.mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#ffc125}.mat-progress-bar.mat-accent .mat-progress-bar-buffer,.mat-progress-bar.mat-accent .mat-progress-bar-fill:after{background-color:#ffc125}.mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#ffcdd2}.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.mat-progress-bar.mat-warn .mat-progress-bar-fill:after{background-color:#f44336}.mat-progress-spinner circle,.mat-spinner circle{stroke:#0072ff}.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ffc125}.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#0072ff}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-primary .mat-radio-inner-circle,.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#0072ff}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-accent .mat-radio-inner-circle,.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#ffc125}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-warn .mat-radio-inner-circle,.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#f44336}.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle,.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.mat-radio-button .mat-ripple-element{background-color:#000}.mat-select-value{color:rgba(0,0,0,.87)}.mat-select-placeholder{color:rgba(0,0,0,.42)}.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.mat-select-arrow{color:rgba(0,0,0,.54)}.mat-select-panel{background:#fff}.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#0072ff}.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.mat-form-field.mat-focused.mat-warn .mat-select-arrow,.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#f44336}.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-drawer{color:rgba(0,0,0,.87)}.mat-drawer,.mat-drawer.mat-drawer-push{background-color:#fff}.mat-drawer:not(.mat-drawer-side){box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-drawer-side{border-right:1px solid rgba(0,0,0,.12)}.mat-drawer-side.mat-drawer-end,[dir=rtl] .mat-drawer-side{border-left:1px solid rgba(0,0,0,.12);border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#ffc125}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(255,193,37,.54)}.mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#ffc125}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#0072ff}.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:rgba(0,114,255,.54)}.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#0072ff}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#f44336}.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(244,67,54,.54)}.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#f44336}.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}.mat-slide-toggle-thumb{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa}.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label,.mat-primary .mat-slider-track-fill{background-color:#0072ff}.mat-primary .mat-slider-thumb-label-text{color:#fff}.mat-primary .mat-slider-focus-ring{background-color:rgba(0,114,255,.2)}.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label,.mat-accent .mat-slider-track-fill{background-color:#ffc125}.mat-accent .mat-slider-thumb-label-text{color:#fff}.mat-accent .mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label,.mat-warn .mat-slider-track-fill{background-color:#f44336}.mat-warn .mat-slider-thumb-label-text{color:#fff}.mat-warn .mat-slider-focus-ring{background-color:rgba(244,67,54,.2)}.cdk-focused .mat-slider-track-background,.mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.mat-slider-disabled .mat-slider-thumb,.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.mat-slider-has-ticks .mat-slider-wrapper:after{border-color:rgba(0,0,0,.7)}.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(90deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(180deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,.04)}@media (hover:none){.mat-step-header:hover{background:none}}.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.54)}.mat-step-header .mat-step-icon{background-color:rgba(0,0,0,.54);color:#fff}.mat-step-header .mat-step-icon-selected,.mat-step-header .mat-step-icon-state-done,.mat-step-header .mat-step-icon-state-edit{background-color:#0072ff;color:#fff}.mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#f44336}.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.mat-step-header .mat-step-label.mat-step-label-error{color:#f44336}.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}.mat-stepper-vertical-line:before{border-left-color:rgba(0,0,0,.12)}.mat-horizontal-stepper-header:after,.mat-horizontal-stepper-header:before,.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.mat-horizontal-stepper-header{height:72px}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header,.mat-vertical-stepper-header{padding:24px}.mat-stepper-vertical-line:before{top:-16px;bottom:-16px}.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:after,.mat-stepper-label-position-bottom .mat-horizontal-stepper-header:before,.mat-stepper-label-position-bottom .mat-stepper-horizontal-line{top:36px}.mat-sort-header-arrow{color:#757575}.mat-tab-header,.mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.mat-tab-group-inverted-header .mat-tab-header,.mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#0072ff}.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-background-primary .mat-tab-header,.mat-tab-group.mat-background-primary .mat-tab-header-pagination,.mat-tab-group.mat-background-primary .mat-tab-links,.mat-tab-nav-bar.mat-background-primary .mat-tab-header,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#0072ff}.mat-tab-group.mat-background-primary .mat-tab-label,.mat-tab-group.mat-background-primary .mat-tab-link,.mat-tab-nav-bar.mat-background-primary .mat-tab-label,.mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-primary .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-background-accent .mat-tab-header,.mat-tab-group.mat-background-accent .mat-tab-header-pagination,.mat-tab-group.mat-background-accent .mat-tab-links,.mat-tab-nav-bar.mat-background-accent .mat-tab-header,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffc125}.mat-tab-group.mat-background-accent .mat-tab-label,.mat-tab-group.mat-background-accent .mat-tab-link,.mat-tab-nav-bar.mat-background-accent .mat-tab-label,.mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-accent .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-background-warn .mat-tab-header,.mat-tab-group.mat-background-warn .mat-tab-header-pagination,.mat-tab-group.mat-background-warn .mat-tab-links,.mat-tab-nav-bar.mat-background-warn .mat-tab-header,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.mat-tab-group.mat-background-warn .mat-tab-label,.mat-tab-group.mat-background-warn .mat-tab-link,.mat-tab-nav-bar.mat-background-warn .mat-tab-label,.mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-warn .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.mat-toolbar.mat-primary{background:#0072ff;color:#fff}.mat-toolbar.mat-accent{background:#ffc125;color:#fff}.mat-toolbar.mat-warn{background:#f44336;color:#fff}.mat-toolbar .mat-focused .mat-form-field-ripple,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-form-field-underline{background-color:currentColor}.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-select-value{color:inherit}.mat-toolbar .mat-input-element{caret-color:currentColor}.mat-toolbar-multiple-rows{min-height:64px}.mat-toolbar-row,.mat-toolbar-single-row{height:64px}@media (max-width:599px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}.mat-tooltip{background:rgba(97,97,97,.9)}.mat-tree{background:#fff}.mat-nested-tree-node,.mat-tree-node{color:rgba(0,0,0,.87)}.mat-tree-node{min-height:48px}.mat-snack-bar-container{color:hsla(0,0%,100%,.7);background:#323232;box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-simple-snackbar-action{color:#ffc125}.light-button-theme .mat-ripple-element{background-color:rgba(0,0,0,.1)}.light-button-theme .mat-option{color:rgba(0,0,0,.87)}.light-button-theme .mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled),.light-button-theme .mat-option:focus:not(.mat-option-disabled),.light-button-theme .mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.light-button-theme .mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.light-button-theme .mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.light-button-theme .mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#777}.light-button-theme .mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.light-button-theme .mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.light-button-theme .mat-optgroup-label{color:rgba(0,0,0,.54)}.light-button-theme .mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.light-button-theme .mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.light-button-theme .mat-pseudo-checkbox:after{color:#fafafa}.light-button-theme .mat-pseudo-checkbox-disabled{color:#b0b0b0}.light-button-theme .mat-primary .mat-pseudo-checkbox-checked,.light-button-theme .mat-primary .mat-pseudo-checkbox-indeterminate{background:#777}.light-button-theme .mat-accent .mat-pseudo-checkbox-checked,.light-button-theme .mat-accent .mat-pseudo-checkbox-indeterminate,.light-button-theme .mat-pseudo-checkbox-checked,.light-button-theme .mat-pseudo-checkbox-indeterminate{background:#ffc125}.light-button-theme .mat-warn .mat-pseudo-checkbox-checked,.light-button-theme .mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.light-button-theme .mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.light-button-theme .mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.light-button-theme.mat-app-background,.light-button-theme .mat-app-background{background-color:#fafafa;color:rgba(0,0,0,.87)}.light-button-theme .mat-elevation-z0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.light-button-theme .mat-elevation-z24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-theme-loaded-marker{display:none}.light-button-theme .mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.light-button-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.light-button-theme .mat-badge-content{color:#777;background:#777}.cdk-high-contrast-active .light-button-theme .mat-badge-content{outline:1px solid;border-radius:0}.light-button-theme .mat-badge-accent .mat-badge-content{background:#ffc125;color:#fff}.light-button-theme .mat-badge-warn .mat-badge-content{color:#fff;background:#f44336}.light-button-theme .mat-badge{position:relative}.light-button-theme .mat-badge-hidden .mat-badge-content{display:none}.light-button-theme .mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,.38)}.light-button-theme .mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform .2s ease-in-out;transform:scale(.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}.light-button-theme .mat-badge-content._mat-animation-noopable,.light-button-theme .ng-animate-disabled .mat-badge-content{transition:none}.light-button-theme .mat-badge-content.mat-badge-active{transform:none}.light-button-theme .mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}.light-button-theme .mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}.light-button-theme .mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}.light-button-theme .mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}[dir=rtl] .light-button-theme .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}.light-button-theme .mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}[dir=rtl] .light-button-theme .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}.light-button-theme .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}[dir=rtl] .light-button-theme .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}.light-button-theme .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}[dir=rtl] .light-button-theme .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}.light-button-theme .mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}.light-button-theme .mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}.light-button-theme .mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}.light-button-theme .mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}[dir=rtl] .light-button-theme .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}.light-button-theme .mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}[dir=rtl] .light-button-theme .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}.light-button-theme .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}[dir=rtl] .light-button-theme .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}.light-button-theme .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}[dir=rtl] .light-button-theme .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}.light-button-theme .mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}.light-button-theme .mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}.light-button-theme .mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}.light-button-theme .mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}[dir=rtl] .light-button-theme .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}.light-button-theme .mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}[dir=rtl] .light-button-theme .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}.light-button-theme .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}[dir=rtl] .light-button-theme .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}.light-button-theme .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}[dir=rtl] .light-button-theme .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}.light-button-theme .mat-bottom-sheet-container{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-button,.light-button-theme .mat-icon-button,.light-button-theme .mat-stroked-button{color:inherit;background:transparent}.light-button-theme .mat-button.mat-primary,.light-button-theme .mat-icon-button.mat-primary,.light-button-theme .mat-stroked-button.mat-primary{color:#777}.light-button-theme .mat-button.mat-accent,.light-button-theme .mat-icon-button.mat-accent,.light-button-theme .mat-stroked-button.mat-accent{color:#ffc125}.light-button-theme .mat-button.mat-warn,.light-button-theme .mat-icon-button.mat-warn,.light-button-theme .mat-stroked-button.mat-warn{color:#f44336}.light-button-theme .mat-button.mat-accent.mat-button-disabled,.light-button-theme .mat-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-button.mat-primary.mat-button-disabled,.light-button-theme .mat-button.mat-warn.mat-button-disabled,.light-button-theme .mat-icon-button.mat-accent.mat-button-disabled,.light-button-theme .mat-icon-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-icon-button.mat-primary.mat-button-disabled,.light-button-theme .mat-icon-button.mat-warn.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-accent.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-primary.mat-button-disabled,.light-button-theme .mat-stroked-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.light-button-theme .mat-button.mat-primary .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-primary .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#777}.light-button-theme .mat-button.mat-accent .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-accent .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#ffc125}.light-button-theme .mat-button.mat-warn .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-warn .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#f44336}.light-button-theme .mat-button.mat-button-disabled .mat-button-focus-overlay,.light-button-theme .mat-icon-button.mat-button-disabled .mat-button-focus-overlay,.light-button-theme .mat-stroked-button.mat-button-disabled .mat-button-focus-overlay{background-color:transparent}.light-button-theme .mat-button .mat-ripple-element,.light-button-theme .mat-icon-button .mat-ripple-element,.light-button-theme .mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}.light-button-theme .mat-button-focus-overlay{background:#000}.light-button-theme .mat-stroked-button:not(.mat-button-disabled){border-color:rgba(0,0,0,.12)}.light-button-theme .mat-fab,.light-button-theme .mat-flat-button,.light-button-theme .mat-mini-fab,.light-button-theme .mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.light-button-theme .mat-fab.mat-primary,.light-button-theme .mat-flat-button.mat-primary,.light-button-theme .mat-mini-fab.mat-primary,.light-button-theme .mat-raised-button.mat-primary{color:#777}.light-button-theme .mat-fab.mat-accent,.light-button-theme .mat-fab.mat-warn,.light-button-theme .mat-flat-button.mat-accent,.light-button-theme .mat-flat-button.mat-warn,.light-button-theme .mat-mini-fab.mat-accent,.light-button-theme .mat-mini-fab.mat-warn,.light-button-theme .mat-raised-button.mat-accent,.light-button-theme .mat-raised-button.mat-warn{color:#fff}.light-button-theme .mat-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-flat-button.mat-accent.mat-button-disabled,.light-button-theme .mat-flat-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-flat-button.mat-primary.mat-button-disabled,.light-button-theme .mat-flat-button.mat-warn.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-raised-button.mat-accent.mat-button-disabled,.light-button-theme .mat-raised-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-raised-button.mat-primary.mat-button-disabled,.light-button-theme .mat-raised-button.mat-warn.mat-button-disabled{color:rgba(0,0,0,.26)}.light-button-theme .mat-fab.mat-primary,.light-button-theme .mat-flat-button.mat-primary,.light-button-theme .mat-mini-fab.mat-primary,.light-button-theme .mat-raised-button.mat-primary{background-color:#777}.light-button-theme .mat-fab.mat-accent,.light-button-theme .mat-flat-button.mat-accent,.light-button-theme .mat-mini-fab.mat-accent,.light-button-theme .mat-raised-button.mat-accent{background-color:#ffc125}.light-button-theme .mat-fab.mat-warn,.light-button-theme .mat-flat-button.mat-warn,.light-button-theme .mat-mini-fab.mat-warn,.light-button-theme .mat-raised-button.mat-warn{background-color:#f44336}.light-button-theme .mat-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-flat-button.mat-accent.mat-button-disabled,.light-button-theme .mat-flat-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-flat-button.mat-primary.mat-button-disabled,.light-button-theme .mat-flat-button.mat-warn.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-accent.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-primary.mat-button-disabled,.light-button-theme .mat-mini-fab.mat-warn.mat-button-disabled,.light-button-theme .mat-raised-button.mat-accent.mat-button-disabled,.light-button-theme .mat-raised-button.mat-button-disabled.mat-button-disabled,.light-button-theme .mat-raised-button.mat-primary.mat-button-disabled,.light-button-theme .mat-raised-button.mat-warn.mat-button-disabled{background-color:rgba(0,0,0,.12)}.light-button-theme .mat-fab.mat-primary .mat-ripple-element,.light-button-theme .mat-flat-button.mat-primary .mat-ripple-element,.light-button-theme .mat-mini-fab.mat-primary .mat-ripple-element,.light-button-theme .mat-raised-button.mat-primary .mat-ripple-element{background-color:hsla(0,0%,46.7%,.1)}.light-button-theme .mat-fab.mat-accent .mat-ripple-element,.light-button-theme .mat-fab.mat-warn .mat-ripple-element,.light-button-theme .mat-flat-button.mat-accent .mat-ripple-element,.light-button-theme .mat-flat-button.mat-warn .mat-ripple-element,.light-button-theme .mat-mini-fab.mat-accent .mat-ripple-element,.light-button-theme .mat-mini-fab.mat-warn .mat-ripple-element,.light-button-theme .mat-raised-button.mat-accent .mat-ripple-element,.light-button-theme .mat-raised-button.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.light-button-theme .mat-flat-button:not([class*=mat-elevation-z]),.light-button-theme .mat-stroked-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-raised-button:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.light-button-theme .mat-raised-button.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-fab:not([class*=mat-elevation-z]),.light-button-theme .mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.light-button-theme .mat-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]),.light-button-theme .mat-mini-fab:not(.mat-button-disabled):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.light-button-theme .mat-fab.mat-button-disabled:not([class*=mat-elevation-z]),.light-button-theme .mat-mini-fab.mat-button-disabled:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-group,.light-button-theme .mat-button-toggle-standalone{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-group-appearance-standard,.light-button-theme .mat-button-toggle-standalone.mat-button-toggle-appearance-standard{box-shadow:none}.light-button-theme .mat-button-toggle{color:rgba(0,0,0,.38)}.light-button-theme .mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87);background:#fff}.light-button-theme .mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}.light-button-theme .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:1px solid rgba(0,0,0,.12)}.light-button-theme [dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.light-button-theme .mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87)}.light-button-theme .mat-button-toggle-disabled{color:rgba(0,0,0,.26);background-color:#eee}.light-button-theme .mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}.light-button-theme .mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.light-button-theme .mat-button-toggle-group-appearance-standard,.light-button-theme .mat-button-toggle-standalone.mat-button-toggle-appearance-standard{border:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-card{background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-card:not([class*=mat-elevation-z]){box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.light-button-theme .mat-card.mat-card-flat:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-card-subtitle{color:rgba(0,0,0,.54)}.light-button-theme .mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.light-button-theme .mat-checkbox-checkmark{fill:#fafafa}.light-button-theme .mat-checkbox-checkmark-path{stroke:#fafafa!important}.light-button-theme .mat-checkbox-mixedmark{background-color:#fafafa}.light-button-theme .mat-checkbox-checked.mat-primary .mat-checkbox-background,.light-button-theme .mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#777}.light-button-theme .mat-checkbox-checked.mat-accent .mat-checkbox-background,.light-button-theme .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.light-button-theme .mat-checkbox-checked.mat-warn .mat-checkbox-background,.light-button-theme .mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.light-button-theme .mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.light-button-theme .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.light-button-theme .mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.light-button-theme .mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,.54)}.light-button-theme .mat-checkbox .mat-ripple-element{background-color:#000}.light-button-theme .mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.light-button-theme .mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#777}.light-button-theme .mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.light-button-theme .mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#ffc125}.light-button-theme .mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.light-button-theme .mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#f44336}.light-button-theme .mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,.87)}.light-button-theme .mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.light-button-theme .mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.light-button-theme .mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:.54}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.4}.light-button-theme .mat-chip.mat-standard-chip:after{background:#000}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#777;color:#777}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#777;opacity:.4}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background-color:hsla(0,0%,46.7%,.1)}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.light-button-theme .mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background-color:hsla(0,0%,100%,.1)}.light-button-theme .mat-table{background:#fff}.light-button-theme .mat-table-sticky,.light-button-theme .mat-table tbody,.light-button-theme .mat-table tfoot,.light-button-theme .mat-table thead,.light-button-theme [mat-footer-row],.light-button-theme [mat-header-row],.light-button-theme [mat-row],.light-button-theme mat-footer-row,.light-button-theme mat-header-row,.light-button-theme mat-row{background:inherit}.light-button-theme mat-footer-row,.light-button-theme mat-header-row,.light-button-theme mat-row,.light-button-theme td.mat-cell,.light-button-theme td.mat-footer-cell,.light-button-theme th.mat-header-cell{border-bottom-color:rgba(0,0,0,.12)}.light-button-theme .mat-header-cell{color:rgba(0,0,0,.54)}.light-button-theme .mat-cell,.light-button-theme .mat-footer-cell{color:rgba(0,0,0,.87)}.light-button-theme .mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.light-button-theme .mat-datepicker-content .mat-calendar-next-button,.light-button-theme .mat-datepicker-content .mat-calendar-previous-button,.light-button-theme .mat-datepicker-toggle{color:rgba(0,0,0,.54)}.light-button-theme .mat-calendar-table-header{color:rgba(0,0,0,.38)}.light-button-theme .mat-calendar-table-header-divider:after{background:rgba(0,0,0,.12)}.light-button-theme .mat-calendar-body-label{color:rgba(0,0,0,.54)}.light-button-theme .mat-calendar-body-cell-content,.light-button-theme .mat-date-range-input-separator{color:rgba(0,0,0,.87);border-color:transparent}.light-button-theme .mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .mat-form-field-disabled .mat-date-range-input-separator{color:rgba(0,0,0,.38)}.light-button-theme .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical),.light-button-theme .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){background-color:rgba(0,0,0,.04)}.light-button-theme .mat-calendar-body-in-preview{color:rgba(0,0,0,.24)}.light-button-theme .mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.38)}.light-button-theme .mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){border-color:rgba(0,0,0,.18)}.light-button-theme .mat-calendar-body-in-range:before{background:hsla(0,0%,46.7%,.2)}.light-button-theme .mat-calendar-body-comparison-identical,.light-button-theme .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.light-button-theme .mat-calendar-body-comparison-bridge-start:before,.light-button-theme [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,hsla(0,0%,46.7%,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-calendar-body-comparison-bridge-end:before,.light-button-theme [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,hsla(0,0%,46.7%,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.light-button-theme .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.light-button-theme .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.light-button-theme .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.light-button-theme .mat-calendar-body-selected{background-color:#777;color:#777}.light-button-theme .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:hsla(0,0%,46.7%,.4)}.light-button-theme .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #777}.light-button-theme .mat-datepicker-content{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);background-color:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-range:before{background:rgba(255,193,37,.2)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical,.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-start:before,.light-button-theme .mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-bridge-end:before,.light-button-theme .mat-datepicker-content.mat-accent [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(255,193,37,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#ffc125;color:#fff}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,193,37,.4)}.light-button-theme .mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-range:before{background:rgba(244,67,54,.2)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical,.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range:before{background:rgba(249,171,0,.2)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-start:before,.light-button-theme .mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-end:before{background:linear-gradient(90deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-bridge-end:before,.light-button-theme .mat-datepicker-content.mat-warn [dir=rtl] .mat-calendar-body-comparison-bridge-start:before{background:linear-gradient(270deg,rgba(244,67,54,.2) 50%,rgba(249,171,0,.2) 0)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range.mat-calendar-body-in-range:after,.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-range>.mat-calendar-body-comparison-identical{background:#a8dab5}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-comparison-identical.mat-calendar-body-selected,.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-in-comparison-range>.mat-calendar-body-selected{background:#46a35e}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#f44336;color:#fff}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(244,67,54,.4)}.light-button-theme .mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}.light-button-theme .mat-datepicker-content-touch{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.light-button-theme .mat-datepicker-toggle-active{color:#777}.light-button-theme .mat-datepicker-toggle-active.mat-accent{color:#ffc125}.light-button-theme .mat-datepicker-toggle-active.mat-warn{color:#f44336}.light-button-theme .mat-date-range-input-inner[disabled]{color:rgba(0,0,0,.38)}.light-button-theme .mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-divider{border-top-color:rgba(0,0,0,.12)}.light-button-theme .mat-divider-vertical{border-right-color:rgba(0,0,0,.12)}.light-button-theme .mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.light-button-theme .mat-action-row{border-top-color:rgba(0,0,0,.12)}.light-button-theme .mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true]),.light-button-theme .mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true]),.light-button-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true]){background:rgba(0,0,0,.04)}@media (hover:none){.light-button-theme .mat-expansion-panel:not(.mat-expanded):not([aria-disabled=true]) .mat-expansion-panel-header:hover{background:#fff}}.light-button-theme .mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.light-button-theme .mat-expansion-indicator:after,.light-button-theme .mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.light-button-theme .mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.26)}.light-button-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.light-button-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.light-button-theme .mat-form-field-label,.light-button-theme .mat-hint{color:rgba(0,0,0,.6)}.light-button-theme .mat-form-field.mat-focused .mat-form-field-label{color:#777}.light-button-theme .mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.light-button-theme .mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.light-button-theme .mat-focused .mat-form-field-required-marker{color:#ffc125}.light-button-theme .mat-form-field-ripple{background-color:rgba(0,0,0,.87)}.light-button-theme .mat-form-field.mat-focused .mat-form-field-ripple{background-color:#777}.light-button-theme .mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#ffc125}.light-button-theme .mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#f44336}.light-button-theme .mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix:after{color:#777}.light-button-theme .mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix:after{color:#ffc125}.light-button-theme .mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix:after,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-label,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker{color:#f44336}.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.light-button-theme .mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#f44336}.light-button-theme .mat-error{color:#f44336}.light-button-theme .mat-form-field-appearance-legacy .mat-form-field-label,.light-button-theme .mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,.54)}.light-button-theme .mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.light-button-theme .mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}.light-button-theme .mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,.04)}.light-button-theme .mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,.02)}.light-button-theme .mat-form-field-appearance-fill .mat-form-field-underline:before{background-color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.light-button-theme .mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline:before{background-color:transparent}.light-button-theme .mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,.12)}.light-button-theme .mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,.87)}.light-button-theme .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#777}.light-button-theme .mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#ffc125}.light-button-theme .mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick,.light-button-theme .mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#f44336}.light-button-theme .mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}.light-button-theme .mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,.06)}.light-button-theme .mat-icon.mat-primary{color:#777}.light-button-theme .mat-icon.mat-accent{color:#ffc125}.light-button-theme .mat-icon.mat-warn{color:#f44336}.light-button-theme .mat-form-field-type-mat-native-select .mat-form-field-infix:after{color:rgba(0,0,0,.54)}.light-button-theme .mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix:after,.light-button-theme .mat-input-element:disabled{color:rgba(0,0,0,.38)}.light-button-theme .mat-input-element{caret-color:#777}.light-button-theme .mat-input-element::placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-form-field.mat-accent .mat-input-element{caret-color:#ffc125}.light-button-theme .mat-form-field-invalid .mat-input-element,.light-button-theme .mat-form-field.mat-warn .mat-input-element{caret-color:#f44336}.light-button-theme .mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix:after{color:#f44336}.light-button-theme .mat-list-base .mat-list-item,.light-button-theme .mat-list-base .mat-list-option{color:rgba(0,0,0,.87)}.light-button-theme .mat-list-base .mat-subheader{color:rgba(0,0,0,.54)}.light-button-theme .mat-list-item-disabled{background-color:#eee}.light-button-theme .mat-action-list .mat-list-item:focus,.light-button-theme .mat-action-list .mat-list-item:hover,.light-button-theme .mat-list-option:focus,.light-button-theme .mat-list-option:hover,.light-button-theme .mat-nav-list .mat-list-item:focus,.light-button-theme .mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.light-button-theme .mat-list-single-selected-option,.light-button-theme .mat-list-single-selected-option:focus,.light-button-theme .mat-list-single-selected-option:hover{background:rgba(0,0,0,.12)}.light-button-theme .mat-menu-panel{background:#fff}.light-button-theme .mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-menu-item{background:transparent;color:rgba(0,0,0,.87)}.light-button-theme .mat-menu-item[disabled],.light-button-theme .mat-menu-item[disabled]:after{color:rgba(0,0,0,.38)}.light-button-theme .mat-menu-item-submenu-trigger:after,.light-button-theme .mat-menu-item .mat-icon-no-color{color:rgba(0,0,0,.54)}.light-button-theme .mat-menu-item-highlighted:not([disabled]),.light-button-theme .mat-menu-item.cdk-keyboard-focused:not([disabled]),.light-button-theme .mat-menu-item.cdk-program-focused:not([disabled]),.light-button-theme .mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.light-button-theme .mat-paginator{background:#fff}.light-button-theme .mat-paginator,.light-button-theme .mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.light-button-theme .mat-paginator-decrement,.light-button-theme .mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.light-button-theme .mat-paginator-first,.light-button-theme .mat-paginator-last{border-top:2px solid rgba(0,0,0,.54)}.light-button-theme .mat-icon-button[disabled] .mat-paginator-decrement,.light-button-theme .mat-icon-button[disabled] .mat-paginator-first,.light-button-theme .mat-icon-button[disabled] .mat-paginator-increment,.light-button-theme .mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-progress-bar-background{fill:#777}.light-button-theme .mat-progress-bar-buffer,.light-button-theme .mat-progress-bar-fill:after{background-color:#777}.light-button-theme .mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#ffc125}.light-button-theme .mat-progress-bar.mat-accent .mat-progress-bar-buffer,.light-button-theme .mat-progress-bar.mat-accent .mat-progress-bar-fill:after{background-color:#ffc125}.light-button-theme .mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#ffcdd2}.light-button-theme .mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.light-button-theme .mat-progress-bar.mat-warn .mat-progress-bar-fill:after{background-color:#f44336}.light-button-theme .mat-progress-spinner circle,.light-button-theme .mat-spinner circle{stroke:#777}.light-button-theme .mat-progress-spinner.mat-accent circle,.light-button-theme .mat-spinner.mat-accent circle{stroke:#ffc125}.light-button-theme .mat-progress-spinner.mat-warn circle,.light-button-theme .mat-spinner.mat-warn circle{stroke:#f44336}.light-button-theme .mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.light-button-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#777}.light-button-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.light-button-theme .mat-radio-button.mat-primary .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.light-button-theme .mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#777}.light-button-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.light-button-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.light-button-theme .mat-radio-button.mat-accent .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.light-button-theme .mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#ffc125}.light-button-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.light-button-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.light-button-theme .mat-radio-button.mat-warn .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.light-button-theme .mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#f44336}.light-button-theme .mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-inner-circle,.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.light-button-theme .mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.light-button-theme .mat-radio-button .mat-ripple-element{background-color:#000}.light-button-theme .mat-select-value{color:rgba(0,0,0,.87)}.light-button-theme .mat-select-placeholder{color:rgba(0,0,0,.42)}.light-button-theme .mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.light-button-theme .mat-select-arrow{color:rgba(0,0,0,.54)}.light-button-theme .mat-select-panel{background:#fff}.light-button-theme .mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.light-button-theme .mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.light-button-theme .mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#777}.light-button-theme .mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.light-button-theme .mat-form-field.mat-focused.mat-warn .mat-select-arrow,.light-button-theme .mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#f44336}.light-button-theme .mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.light-button-theme .mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.light-button-theme .mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.light-button-theme .mat-drawer.mat-drawer-push{background-color:#fff}.light-button-theme .mat-drawer:not(.mat-drawer-side){box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.light-button-theme .mat-drawer-side{border-right:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-drawer-side.mat-drawer-end,.light-button-theme [dir=rtl] .mat-drawer-side{border-left:1px solid rgba(0,0,0,.12);border-right:none}.light-button-theme [dir=rtl] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.light-button-theme .mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#ffc125}.light-button-theme .mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(255,193,37,.54)}.light-button-theme .mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#ffc125}.light-button-theme .mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#777}.light-button-theme .mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:hsla(0,0%,46.7%,.54)}.light-button-theme .mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#777}.light-button-theme .mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#f44336}.light-button-theme .mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(244,67,54,.54)}.light-button-theme .mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#f44336}.light-button-theme .mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}.light-button-theme .mat-slide-toggle-thumb{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa}.light-button-theme .mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.light-button-theme .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.light-button-theme .mat-primary .mat-slider-thumb,.light-button-theme .mat-primary .mat-slider-thumb-label,.light-button-theme .mat-primary .mat-slider-track-fill{background-color:#777}.light-button-theme .mat-primary .mat-slider-thumb-label-text{color:#777}.light-button-theme .mat-primary .mat-slider-focus-ring{background-color:hsla(0,0%,46.7%,.2)}.light-button-theme .mat-accent .mat-slider-thumb,.light-button-theme .mat-accent .mat-slider-thumb-label,.light-button-theme .mat-accent .mat-slider-track-fill{background-color:#ffc125}.light-button-theme .mat-accent .mat-slider-thumb-label-text{color:#fff}.light-button-theme .mat-accent .mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.light-button-theme .mat-warn .mat-slider-thumb,.light-button-theme .mat-warn .mat-slider-thumb-label,.light-button-theme .mat-warn .mat-slider-track-fill{background-color:#f44336}.light-button-theme .mat-warn .mat-slider-thumb-label-text{color:#fff}.light-button-theme .mat-warn .mat-slider-focus-ring{background-color:rgba(244,67,54,.2)}.light-button-theme .cdk-focused .mat-slider-track-background,.light-button-theme .mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.light-button-theme .mat-slider-disabled .mat-slider-thumb,.light-button-theme .mat-slider-disabled .mat-slider-track-background,.light-button-theme .mat-slider-disabled .mat-slider-track-fill,.light-button-theme .mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.light-button-theme .mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.light-button-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.light-button-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.light-button-theme .mat-slider-has-ticks .mat-slider-wrapper:after{border-color:rgba(0,0,0,.7)}.light-button-theme .mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(90deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.light-button-theme .mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(180deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.light-button-theme .mat-step-header.cdk-keyboard-focused,.light-button-theme .mat-step-header.cdk-program-focused,.light-button-theme .mat-step-header:hover{background-color:rgba(0,0,0,.04)}@media (hover:none){.light-button-theme .mat-step-header:hover{background:none}}.light-button-theme .mat-step-header .mat-step-label,.light-button-theme .mat-step-header .mat-step-optional{color:rgba(0,0,0,.54)}.light-button-theme .mat-step-header .mat-step-icon{background-color:rgba(0,0,0,.54);color:#777}.light-button-theme .mat-step-header .mat-step-icon-selected,.light-button-theme .mat-step-header .mat-step-icon-state-done,.light-button-theme .mat-step-header .mat-step-icon-state-edit{background-color:#777;color:#777}.light-button-theme .mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#f44336}.light-button-theme .mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.light-button-theme .mat-step-header .mat-step-label.mat-step-label-error{color:#f44336}.light-button-theme .mat-stepper-horizontal,.light-button-theme .mat-stepper-vertical{background-color:#fff}.light-button-theme .mat-stepper-vertical-line:before{border-left-color:rgba(0,0,0,.12)}.light-button-theme .mat-horizontal-stepper-header:after,.light-button-theme .mat-horizontal-stepper-header:before,.light-button-theme .mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.light-button-theme .mat-sort-header-arrow{color:#757575}.light-button-theme .mat-tab-header,.light-button-theme .mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.light-button-theme .mat-tab-group-inverted-header .mat-tab-header,.light-button-theme .mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.light-button-theme .mat-tab-label,.light-button-theme .mat-tab-link{color:rgba(0,0,0,.87)}.light-button-theme .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.light-button-theme .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.light-button-theme .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.light-button-theme .mat-tab-group[class*=mat-background-] .mat-tab-header,.light-button-theme .mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.light-button-theme .mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:hsla(0,0%,46.7%,.3)}.light-button-theme .mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.light-button-theme .mat-tab-group.mat-primary .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#777}.light-button-theme .mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.light-button-theme .mat-tab-group.mat-accent .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.light-button-theme .mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.light-button-theme .mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.light-button-theme .mat-tab-group.mat-warn .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.light-button-theme .mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.light-button-theme .mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:hsla(0,0%,46.7%,.3)}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-header,.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination,.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-links,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#777}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-label,.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-link,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#777}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,46.7%,.4)}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#777}.light-button-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,46.7%,.4)}.light-button-theme .mat-tab-group.mat-background-primary .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:hsla(0,0%,46.7%,.12)}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,193,37,.3)}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-header,.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination,.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-links,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffc125}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-label,.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-link,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.light-button-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-accent .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-header,.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination,.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-links,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-label,.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-link,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.light-button-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.light-button-theme .mat-tab-group.mat-background-warn .mat-ripple-element,.light-button-theme .mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.light-button-theme .mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.light-button-theme .mat-toolbar.mat-primary{background:#777;color:#777}.light-button-theme .mat-toolbar.mat-accent{background:#ffc125;color:#fff}.light-button-theme .mat-toolbar.mat-warn{background:#f44336;color:#fff}.light-button-theme .mat-toolbar .mat-focused .mat-form-field-ripple,.light-button-theme .mat-toolbar .mat-form-field-ripple,.light-button-theme .mat-toolbar .mat-form-field-underline{background-color:currentColor}.light-button-theme .mat-toolbar .mat-focused .mat-form-field-label,.light-button-theme .mat-toolbar .mat-form-field-label,.light-button-theme .mat-toolbar .mat-form-field.mat-focused .mat-select-arrow,.light-button-theme .mat-toolbar .mat-select-arrow,.light-button-theme .mat-toolbar .mat-select-value{color:inherit}.light-button-theme .mat-toolbar .mat-input-element{caret-color:currentColor}.light-button-theme .mat-tooltip{background:rgba(97,97,97,.9)}.light-button-theme .mat-tree{background:#fff}.light-button-theme .mat-nested-tree-node,.light-button-theme .mat-tree-node{color:rgba(0,0,0,.87)}.light-button-theme .mat-snack-bar-container{color:hsla(0,0%,100%,.7);background:#323232;box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.light-button-theme .mat-simple-snackbar-action{color:#ffc125}a,body,button,div,h1,h2,h3,h4,h5,h6,mat-option.mat-option,mat-panel-description,mat-panel-title,option,p,select,span{font-family:Skycoin,Roboto,Helvetica Neue,sans-serif}.background-fixer{background-color:#f7f7f7;width:100%;height:100%;position:fixed;top:0;left:0;z-index:-1}body,html{height:100%}body{background-color:#f7f7f7;margin:0;padding:0;color:#1e2227;font-size:13px}.mat-tooltip{font-size:11px!important;line-height:1.3}.-flex-fill,.flex-fill{flex:1 1 auto}.link{color:#0072ff;cursor:pointer;text-decoration:none}.alert-box{color:#ff004e;font-size:12px;line-height:1.5;background-color:#ffdede;padding:15px;display:flex;margin-bottom:20px}.alert-box .title{font-size:18px}.alert-box mat-icon{margin-top:5px;margin-right:10px;-webkit-animation:alert-blinking 1s linear infinite;animation:alert-blinking 1s linear infinite}.alert-box mat-checkbox{margin-top:10px;display:inline-block}.alert-box .-check span{color:#1e2227!important}@-webkit-keyframes alert-blinking{50%{opacity:.2}}@keyframes alert-blinking{50%{opacity:.2}}.red{color:#ff004e}.red-field{border:2px solid #ff004e!important;color:#ff004e!important}.error-tooltip{background-color:#ff004e!important} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/kvstorage/empty.go b/vendor/github.com/skycoin/skycoin/src/kvstorage/empty.go new file mode 100644 index 0000000000..d93f2e3f43 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/kvstorage/empty.go @@ -0,0 +1,5 @@ +// Package kvstorage contains the implementation for a +// key-value storage of arbitrary data. `Manager` is used to +// access the storage contents. Each storage is presented by its own `KVStorageType` +// and each type has its own associated file to persist data +package kvstorage diff --git a/vendor/github.com/skycoin/skycoin/src/kvstorage/error.go b/vendor/github.com/skycoin/skycoin/src/kvstorage/error.go new file mode 100644 index 0000000000..ef634dbade --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/kvstorage/error.go @@ -0,0 +1,16 @@ +package kvstorage + +// Error wraps key-value storage related errors. +// It wraps errors caused by user input, but not errors caused by +// programmer input or internal issues. +type Error struct { + error +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + return nil + } + return Error{err} +} diff --git a/vendor/github.com/skycoin/skycoin/src/kvstorage/kvstorage.go b/vendor/github.com/skycoin/skycoin/src/kvstorage/kvstorage.go new file mode 100644 index 0000000000..4165dd12eb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/kvstorage/kvstorage.go @@ -0,0 +1,162 @@ +package kvstorage + +import ( + "crypto/sha256" + "encoding/base64" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "sync" + + "github.com/skycoin/skycoin/src/util/file" +) + +var ( + // ErrNoSuchKey is returned when the specified key does not exist + // in the storage instance + ErrNoSuchKey = NewError(errors.New("no such key exists in the storage")) +) + +// kvStorage is a key-value storage for storing arbitrary data +type kvStorage struct { + fn string + data map[string]string + sync.RWMutex +} + +// newKVStorage constructs new storage instance using the file with the filename +// to persist data +func newKVStorage(fn string) (*kvStorage, error) { + storage := kvStorage{ + fn: fn, + } + + if err := file.LoadJSON(fn, &storage.data); err != nil { + logger.Warningf("newKVStorage LoadJSON(%s) failed: %v", fn, err) + cfp, err := makeCorruptFilePath(fn) + if err != nil { + return nil, fmt.Errorf("Failed to make corrupt file path: %v", err) + } + if err := os.Rename(fn, cfp); err != nil { + return nil, fmt.Errorf("Rename %s to %s failed: %v", fn, cfp, err) + } + logger.Infof("Backup the corrupted file from: %s to %s", fn, cfp) + if err := initEmptyStorage(fn); err != nil { + return nil, err + } + storage.data = make(map[string]string) + } + + return &storage, nil +} + +// makeCorruptFilePath creates a $FILE.corrupt.$HASH string based on file path, +// where $HASH is truncated SHA1 of $FILE. +func makeCorruptFilePath(path string) (string, error) { + fileHash, err := shaFileID(path) + if err != nil { + return "", err + } + + dir, file := filepath.Split(path) + newFile := fmt.Sprintf("%s.corrupt.%s", file, fileHash) + newPath := filepath.Join(dir, newFile) + + return newPath, nil +} + +// shaFileID return the first 8 bytes of the SHA1 hash of the file, +// hex-encoded +func shaFileID(path string) (string, error) { + fi, err := os.Open(path) + if err != nil { + return "", err + } + defer fi.Close() + + h := sha256.New() + if _, err := io.Copy(h, fi); err != nil { + return "", err + } + + sum := h.Sum(nil) + encodedSum := base64.RawURLEncoding.EncodeToString(sum[:8]) + return encodedSum, nil +} + +// get gets the value associated with the `key`. Returns `ErrNoSuchKey` +func (s *kvStorage) get(key string) (string, error) { + s.RLock() + defer s.RUnlock() + + val, ok := s.data[key] + if !ok { + return "", ErrNoSuchKey + } + + return val, nil +} + +// getAll gets the snapshot of the current storage contents +func (s *kvStorage) getAll() map[string]string { + s.RLock() + defer s.RUnlock() + + return copyMap(s.data) +} + +// add adds the `val` value to the storage with the specified `key`. Replaces the +// original value if `key` already exists +func (s *kvStorage) add(key, val string) error { + s.Lock() + defer s.Unlock() + + // save original data + oldVal, oldOk := s.data[key] + + s.data[key] = val + + // try to persist data, fall back to original data on error + if err := s.flush(); err != nil { + if !oldOk { + delete(s.data, key) + } else { + s.data[key] = oldVal + } + + return err + } + + return nil +} + +// remove removes the value associated with the `key`. Returns `ErrNoSuchKey` +func (s *kvStorage) remove(key string) error { + s.Lock() + defer s.Unlock() + + if _, ok := s.data[key]; !ok { + return ErrNoSuchKey + } + + // save original data + oldVal := s.data[key] + + delete(s.data, key) + + // try to persist data, fall back to original data on error + if err := s.flush(); err != nil { + s.data[key] = oldVal + + return err + } + + return nil +} + +// flush persists data to file +func (s *kvStorage) flush() error { + return file.SaveJSON(s.fn, s.data, 0600) +} diff --git a/vendor/github.com/skycoin/skycoin/src/kvstorage/manager.go b/vendor/github.com/skycoin/skycoin/src/kvstorage/manager.go new file mode 100644 index 0000000000..5508fc986a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/kvstorage/manager.go @@ -0,0 +1,252 @@ +package kvstorage + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "strings" + "sync" + + "github.com/skycoin/skycoin/src/util/file" + "github.com/skycoin/skycoin/src/util/logging" +) + +// Type is a type of a key-value storage +type Type string + +const ( + // TypeTxIDNotes is a type of storage containing transaction notes + TypeTxIDNotes Type = "txid" + // TypeGeneral is a type of storage for general user data + TypeGeneral Type = "client" +) + +const storageFileExtension = ".json" + +var ( + // ErrStorageAPIDisabled is returned while trying to do storage actions while + // the EnableStorageAPI option is false + ErrStorageAPIDisabled = NewError(errors.New("Storage API is disabled")) + // ErrNoSuchStorage is returned if no storage with the specified storage type loaded + ErrNoSuchStorage = NewError(errors.New("Storage with such type is not loaded")) + // ErrStorageAlreadyLoaded is returned while trying to load already loaded storage + ErrStorageAlreadyLoaded = NewError(errors.New("Storage with such type is already loaded")) + // ErrUnknownKVStorageType is returned while trying to access the storage of the unknown type + ErrUnknownKVStorageType = NewError(errors.New("Unknown storage type")) + + logger = logging.MustGetLogger("kvstorage") +) + +// Manager is a manager for key-value storage instances +type Manager struct { + config Config + storages map[Type]*kvStorage + sync.Mutex +} + +// NewManager constructs new manager according to the config +func NewManager(c Config) (*Manager, error) { + logger.Info("Creating new KVStorage manager") + + m := &Manager{ + config: c, + storages: make(map[Type]*kvStorage), + } + + if !strings.HasSuffix(m.config.StorageDir, "/") { + m.config.StorageDir += "/" + } + + if !m.config.EnableStorageAPI { + logger.Info("KVStorage is disabled") + return m, nil + } + + if err := os.MkdirAll(m.config.StorageDir, os.FileMode(0700)); err != nil { + return nil, fmt.Errorf("failed to create kvstorage directory %s: %v", m.config.StorageDir, err) + } + + for _, t := range m.config.EnabledStorages { + if err := m.LoadStorage(t); err != nil { + return nil, err + } + } + + return m, nil +} + +// LoadStorage loads a new storage instance for the `storageType` +// into the manager. Returns `ErrStorageAlreadyLoaded`, `ErrStorageAPIDisabled`, +// `ErrUnknownKVStorageType` +func (m *Manager) LoadStorage(storageType Type) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if m.storageExists(storageType) { + return ErrStorageAlreadyLoaded + } + + fn := m.getStorageFilePath(storageType) + + exists, err := file.Exists(fn) + if err != nil { + return fmt.Errorf("Manager.LoadStorage file.Exists failed: %v", err) + } + if !exists { + if err := initEmptyStorage(fn); err != nil { + return fmt.Errorf("Manager.LoadStorage initEmptyStorage failed: %v", err) + } + } + + storage, err := newKVStorage(fn) + if err != nil { + return err + } + + m.storages[storageType] = storage + + return nil +} + +// UnloadStorage unloads the storage instance for the given `storageType` from the manager. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) UnloadStorage(storageType Type) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return ErrNoSuchStorage + } + + delete(m.storages, storageType) + + return nil +} + +// GetStorageValue gets the value associated with the `key` from the storage of `storageType. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) GetStorageValue(storageType Type, key string) (string, error) { + if !isStorageTypeValid(storageType) { + return "", ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return "", ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return "", ErrNoSuchStorage + } + + return m.storages[storageType].get(key) +} + +// GetAllStorageValues gets the snapshot of the current contents from storage of `storageType`. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) GetAllStorageValues(storageType Type) (map[string]string, error) { + if !isStorageTypeValid(storageType) { + return nil, ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return nil, ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return nil, ErrNoSuchStorage + } + + return m.storages[storageType].getAll(), nil +} + +// AddStorageValue adds the `val` with the associated `key` to the storage of `storageType`. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) AddStorageValue(storageType Type, key, val string) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return ErrNoSuchStorage + } + + return m.storages[storageType].add(key, val) +} + +// RemoveStorageValue removes the value with the associated `key` from the storage of `storageType`. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) RemoveStorageValue(storageType Type, key string) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return ErrNoSuchStorage + } + + return m.storages[storageType].remove(key) +} + +// storageExists checks whether the storage of `storageType` exists in the manager +func (m *Manager) storageExists(storageType Type) bool { + _, ok := m.storages[storageType] + + return ok +} + +// getStorageFilePath creates the path to the storage of `storageType` in file system +func (m *Manager) getStorageFilePath(storageType Type) string { + return filepath.Join(m.config.StorageDir, fmt.Sprintf("%s%s", storageType, storageFileExtension)) +} + +// isStorageTypeValid validates the given `storageType` against the predefined available types +func isStorageTypeValid(storageType Type) bool { + switch storageType { + case TypeTxIDNotes, TypeGeneral: + return true + } + + return false +} + +// initEmptyStorage creates a file to persist data +func initEmptyStorage(fn string) error { + return file.SaveJSON(fn, map[string]string{}, 0600) +} diff --git a/vendor/github.com/skycoin/skycoin/src/kvstorage/manager_config.go b/vendor/github.com/skycoin/skycoin/src/kvstorage/manager_config.go new file mode 100644 index 0000000000..82c68a9ffa --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/kvstorage/manager_config.go @@ -0,0 +1,15 @@ +package kvstorage + +// Config is a configuration for storage manager +type Config struct { + StorageDir string + EnabledStorages []Type + EnableStorageAPI bool +} + +// NewConfig creates a default config. +func NewConfig() Config { + return Config{ + StorageDir: "./data/", + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/kvstorage/map.go b/vendor/github.com/skycoin/skycoin/src/kvstorage/map.go new file mode 100644 index 0000000000..3df52771ac --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/kvstorage/map.go @@ -0,0 +1,12 @@ +package kvstorage + +// Copy copies the map contents to the new map +func copyMap(data map[string]string) map[string]string { + copied := make(map[string]string, len(data)) + + for k, v := range data { + copied[k] = v + } + + return copied +} diff --git a/vendor/github.com/skycoin/skycoin/src/params/distribution.go b/vendor/github.com/skycoin/skycoin/src/params/distribution.go new file mode 100644 index 0000000000..b0cf589855 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/params/distribution.go @@ -0,0 +1,153 @@ +package params + +import ( + "errors" + + "github.com/skycoin/skycoin/src/cipher" +) + +// Distribution parameters define the initial coin distribution and unlocking schedule +type Distribution struct { + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds + // Once the InitialUnlockedCount is exhausted, + // UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 + + // Addresses are the distribution addresses that received coins in the + // first block after the genesis block + Addresses []string + addressesDecoded []cipher.Address +} + +// MustValidate validates Distribution parameters, panics on error +func (d *Distribution) MustValidate() { + if err := d.Validate(); err != nil { + panic(err) + } +} + +// Validate validates Distribution parameters +func (d *Distribution) Validate() error { + if d.InitialUnlockedCount > uint64(len(d.Addresses)) { + return errors.New("unlocked addresses > total distribution addresses") + } + + if d.MaxCoinSupply%uint64(len(d.Addresses)) != 0 { + return errors.New("MaxCoinSupply should be perfectly divisible by len(addresses)") + } + + if err := d.decodeAddresses(); err != nil { + return err + } + + return nil +} + +// AddressInitialBalance is the initial balance of each distribution address +func (d *Distribution) AddressInitialBalance() uint64 { + return d.MaxCoinSupply / uint64(len(d.Addresses)) +} + +// UnlockedAddresses returns distribution addresses that are unlocked, i.e. they have spendable outputs +func (d *Distribution) UnlockedAddresses() []string { + // The first InitialUnlockedCount (25) addresses are unlocked by default. + // Subsequent addresses will be unlocked at a rate of UnlockAddressRate (5) per year, + // after the InitialUnlockedCount (25) addresses have no remaining balance. + // The unlock timer will be enabled manually once the + // InitialUnlockedCount (25) addresses are distributed. + + // NOTE: To have automatic unlocking, transaction verification would have + // to be handled in visor rather than in coin.Transactions.Visor(), because + // the coin package is agnostic to the state of the blockchain and cannot reference it. + // Instead of automatic unlocking, we can hardcode the timestamp at which the first 30% + // is distributed, then compute the unlocked addresses easily here. + + addrs := make([]string, d.InitialUnlockedCount) + copy(addrs[:], d.Addresses[:d.InitialUnlockedCount]) + return addrs +} + +// LockedAddresses returns distribution addresses that are locked, i.e. they have unspendable outputs +func (d *Distribution) LockedAddresses() []string { + // TODO -- once we reach 30% distribution, we can hardcode the + // initial timestamp for releasing more coins + addrs := make([]string, d.numLocked()) + copy(addrs, d.Addresses[d.InitialUnlockedCount:]) + return addrs +} + +// AddressesDecoded returns a copy of the hardcoded distribution addresses array. +// Each address has 1,000,000 coins. There are 100 addresses. +func (d *Distribution) AddressesDecoded() []cipher.Address { + d.mustDecodeAddresses() + addrs := make([]cipher.Address, len(d.addressesDecoded)) + copy(addrs, d.addressesDecoded) + return addrs +} + +// UnlockedAddressesDecoded returns distribution addresses that are unlocked, i.e. they have spendable outputs +func (d *Distribution) UnlockedAddressesDecoded() []cipher.Address { + // The first d.InitialUnlockedCount (25) addresses are unlocked by default. + // Subsequent addresses will be unlocked at a rate of UnlockAddressRate (5) per year, + // after the d.InitialUnlockedCount (25) addresses have no remaining balance. + // The unlock timer will be enabled manually once the + // d.InitialUnlockedCount (25) addresses are distributed. + + // NOTE: To have automatic unlocking, transaction verification would have + // to be handled in visor rather than in coin.Transactions.Visor(), because + // the coin package is agnostic to the state of the blockchain and cannot reference it. + // Instead of automatic unlocking, we can hardcode the timestamp at which the first 30% + // is distributed, then compute the unlocked addresses easily here. + d.mustDecodeAddresses() + addrs := make([]cipher.Address, d.InitialUnlockedCount) + copy(addrs[:], d.addressesDecoded[:d.InitialUnlockedCount]) + return addrs +} + +// LockedAddressesDecoded returns distribution addresses that are locked, i.e. they have unspendable outputs +func (d *Distribution) LockedAddressesDecoded() []cipher.Address { + // TODO -- once we reach 30% distribution, we can hardcode the + // initial timestamp for releasing more coins + d.mustDecodeAddresses() + addrs := make([]cipher.Address, d.numLocked()) + copy(addrs, d.addressesDecoded[d.InitialUnlockedCount:]) + return addrs +} + +func (d *Distribution) numLocked() uint64 { + n := uint64(len(d.Addresses)) + if n < d.InitialUnlockedCount { + panic("number of distribution addresses is less than InitialUnlockedCount") + } + return n - d.InitialUnlockedCount +} + +func (d *Distribution) decodeAddresses() error { + if len(d.addressesDecoded) == len(d.Addresses) { + return nil + } + + decodedAddrs := make([]cipher.Address, len(d.Addresses)) + for i, a := range d.Addresses { + var err error + decodedAddrs[i], err = cipher.DecodeBase58Address(a) + if err != nil { + return err + } + } + + d.addressesDecoded = decodedAddrs + return nil +} + +func (d *Distribution) mustDecodeAddresses() { + if err := d.decodeAddresses(); err != nil { + panic(err) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/params/droplet.go b/vendor/github.com/skycoin/skycoin/src/params/droplet.go new file mode 100644 index 0000000000..577a9ed6a6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/params/droplet.go @@ -0,0 +1,34 @@ +package params + +import ( + "errors" + + "github.com/skycoin/skycoin/src/util/droplet" +) + +var ( + // ErrInvalidDecimals is returned by DropletPrecisionCheck if a coin amount has an invalid number of decimal places + ErrInvalidDecimals = errors.New("invalid amount, too many decimal places") +) + +// DropletPrecisionToDivisor converts number of allowed decimal places to the modulus divisor used when checking droplet precision rules +func DropletPrecisionToDivisor(precision uint8) uint64 { + if precision > droplet.Exponent { + panic("precision must be <= droplet.Exponent") + } + + n := droplet.Exponent - precision + var i uint64 = 1 + for k := uint8(0); k < n; k++ { + i = i * 10 + } + return i +} + +// DropletPrecisionCheck checks if an amount of coins is valid given decimal place restrictions +func DropletPrecisionCheck(precision uint8, amount uint64) error { + if amount%DropletPrecisionToDivisor(precision) != 0 { + return ErrInvalidDecimals + } + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/params/init.go b/vendor/github.com/skycoin/skycoin/src/params/init.go new file mode 100644 index 0000000000..7ff9b2ae26 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/params/init.go @@ -0,0 +1,78 @@ +package params + +import ( + "fmt" + "os" + "strconv" + + "github.com/skycoin/skycoin/src/util/droplet" +) + +func init() { + loadUserBurnFactor() + loadUserMaxTransactionSize() + loadUserMaxDecimals() + sanityCheck() +} + +func sanityCheck() { + if err := UserVerifyTxn.Validate(); err != nil { + panic(err) + } + + MainNetDistribution.MustValidate() +} + +func loadUserBurnFactor() { + xs := os.Getenv("USER_BURN_FACTOR") + if xs == "" { + return + } + + x, err := strconv.ParseUint(xs, 10, 32) + if err != nil { + panic(fmt.Sprintf("Invalid USER_BURN_FACTOR %q: %v", xs, err)) + } + + if x < uint64(MinBurnFactor) { + panic(fmt.Sprintf("USER_BURN_FACTOR must be >= %d", MinBurnFactor)) + } + + UserVerifyTxn.BurnFactor = uint32(x) +} + +func loadUserMaxTransactionSize() { + xs := os.Getenv("USER_MAX_TXN_SIZE") + if xs == "" { + return + } + + x, err := strconv.ParseUint(xs, 10, 32) + if err != nil { + panic(fmt.Sprintf("Invalid USER_MAX_TXN_SIZE %q: %v", xs, err)) + } + + if x < uint64(MinTransactionSize) { + panic(fmt.Sprintf("USER_MAX_TXN_SIZE must be >= %d", MinTransactionSize)) + } + + UserVerifyTxn.MaxTransactionSize = uint32(x) +} + +func loadUserMaxDecimals() { + xs := os.Getenv("USER_MAX_DECIMALS") + if xs == "" { + return + } + + x, err := strconv.ParseUint(xs, 10, 8) + if err != nil { + panic(fmt.Sprintf("Invalid USER_MAX_DECIMALS %q: %v", xs, err)) + } + + if x > uint64(droplet.Exponent) { + panic(fmt.Sprintf("USER_MAX_DECIMALS must be <= %d", droplet.Exponent)) + } + + UserVerifyTxn.MaxDropletPrecision = uint8(x) +} diff --git a/vendor/github.com/skycoin/skycoin/src/params/params.go b/vendor/github.com/skycoin/skycoin/src/params/params.go new file mode 100644 index 0000000000..7ae26c12d4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/params/params.go @@ -0,0 +1,128 @@ +package params + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +var ( + // MainNetDistribution Skycoin mainnet coin distribution parameters + MainNetDistribution = Distribution{ + MaxCoinSupply: 100000000, + InitialUnlockedCount: 25, + UnlockAddressRate: 5, + UnlockTimeInterval: 31536000, + Addresses: []string{ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + }, + } + + // UserVerifyTxn transaction verification parameters for user-created transactions + UserVerifyTxn = VerifyTxn{ + // BurnFactor can be overriden with `USER_BURN_FACTOR` env var + BurnFactor: 10, + // MaxTransactionSize can be overriden with `USER_MAX_TXN_SIZE` env var + MaxTransactionSize: 32768, // in bytes + // MaxDropletPrecision can be overriden with `USER_MAX_DECIMALS` env var + MaxDropletPrecision: 3, + } +) diff --git a/vendor/github.com/skycoin/skycoin/src/params/verify_txn.go b/vendor/github.com/skycoin/skycoin/src/params/verify_txn.go new file mode 100644 index 0000000000..4d5030f3f0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/params/verify_txn.go @@ -0,0 +1,55 @@ +package params + +import ( + "errors" + + "github.com/skycoin/skycoin/src/util/droplet" +) + +const ( + // MinBurnFactor minimum value for BurnFactor + MinBurnFactor uint32 = 2 + // MinTransactionSize minimum value for MaxTransactionSize + MinTransactionSize uint32 = 1024 +) + +var ( + // ErrInvalidBurnFactor BurnFactor value is out of range + ErrInvalidBurnFactor = errors.New("BurnFactor value is out of range") + // ErrInvalidMaxTransactionSize MaxTransactionSize value is out of range + ErrInvalidMaxTransactionSize = errors.New("MaxTransactionSize value is out of range") + // ErrInvalidMaxDropletPrecision MaxDropletPrecision value is out of range + ErrInvalidMaxDropletPrecision = errors.New("MaxDropletPrecision value is out of range") +) + +// VerifyTxn are parameters for verifying a transaction +type VerifyTxn struct { + // BurnFactor inverse fraction of coinhours that must be burned + BurnFactor uint32 + // MaxTransactionSize maximum size of a transaction in bytes + MaxTransactionSize uint32 + // MaxDropletPrecision maximum decimal precision of droplets + MaxDropletPrecision uint8 +} + +// MaxDropletDivisor return the modulus divisor used when checking droplet precision rules +func (v VerifyTxn) MaxDropletDivisor() uint64 { + return DropletPrecisionToDivisor(v.MaxDropletPrecision) +} + +// Validate validates the configured parameters +func (v VerifyTxn) Validate() error { + if v.BurnFactor < MinBurnFactor { + return ErrInvalidBurnFactor + } + + if v.MaxTransactionSize < MinTransactionSize { + return ErrInvalidMaxTransactionSize + } + + if v.MaxDropletPrecision > droplet.Exponent { + return ErrInvalidMaxDropletPrecision + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/readable/block.go b/vendor/github.com/skycoin/skycoin/src/readable/block.go new file mode 100644 index 0000000000..560b7ac5ca --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/readable/block.go @@ -0,0 +1,145 @@ +/* +Package readable defines JSON-tagged struct representations of internal binary data structures, +for use by the API and CLI. +*/ +package readable + +import ( + "errors" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" +) + +// BlockHeader represents the readable block header +type BlockHeader struct { + BkSeq uint64 `json:"seq"` + Hash string `json:"block_hash"` + PreviousHash string `json:"previous_block_hash"` + Time uint64 `json:"timestamp"` + Fee uint64 `json:"fee"` + Version uint32 `json:"version"` + BodyHash string `json:"tx_body_hash"` + UxHash string `json:"ux_hash"` +} + +// NewBlockHeader creates a readable block header +func NewBlockHeader(b coin.BlockHeader) BlockHeader { + return BlockHeader{ + BkSeq: b.BkSeq, + Hash: b.Hash().Hex(), + PreviousHash: b.PrevHash.Hex(), + Time: b.Time, + Fee: b.Fee, + Version: b.Version, + BodyHash: b.BodyHash.Hex(), + UxHash: b.UxHash.Hex(), + } +} + +// ToCoinBlockHeader converts BlockHeader back to coin.BlockHeader +func (bh BlockHeader) ToCoinBlockHeader() (coin.BlockHeader, error) { + prevHash, err := cipher.SHA256FromHex(bh.PreviousHash) + if err != nil { + return coin.BlockHeader{}, err + } + + bodyHash, err := cipher.SHA256FromHex(bh.BodyHash) + if err != nil { + return coin.BlockHeader{}, err + } + + uxHash, err := cipher.SHA256FromHex(bh.UxHash) + if err != nil { + return coin.BlockHeader{}, err + } + + headHash, err := cipher.SHA256FromHex(bh.Hash) + if err != nil { + return coin.BlockHeader{}, err + } + + cbh := coin.BlockHeader{ + Version: bh.Version, + Time: bh.Time, + BkSeq: bh.BkSeq, + Fee: bh.Fee, + PrevHash: prevHash, + BodyHash: bodyHash, + UxHash: uxHash, + } + + if cbh.Hash() != headHash { + return coin.BlockHeader{}, errors.New("readable.BlockHeader.Hash != recovered coin.BlockHeader.Hash()") + } + + return cbh, nil +} + +// BlockBody represents a readable block body +type BlockBody struct { + Transactions []Transaction `json:"txns"` +} + +// NewBlockBody creates a readable block body +func NewBlockBody(b coin.Block) (*BlockBody, error) { + txns := make([]Transaction, len(b.Body.Transactions)) + isGenesis := b.Head.BkSeq == 0 + for i := range b.Body.Transactions { + txn, err := NewTransaction(b.Body.Transactions[i], isGenesis) + if err != nil { + return nil, err + } + txns[i] = *txn + } + + return &BlockBody{ + Transactions: txns, + }, nil +} + +// Block represents a readable block +type Block struct { + Head BlockHeader `json:"header"` + Body BlockBody `json:"body"` + Size uint32 `json:"size"` +} + +// NewBlock creates a readable block +func NewBlock(b coin.Block) (*Block, error) { + body, err := NewBlockBody(b) + if err != nil { + return nil, err + } + + size, err := b.Size() + if err != nil { + return nil, err + } + + return &Block{ + Head: NewBlockHeader(b.Head), + Body: *body, + Size: size, + }, nil +} + +// Blocks an array of readable blocks. +type Blocks struct { + Blocks []Block `json:"blocks"` +} + +// NewBlocks converts []coin.SignedBlock to Blocks +func NewBlocks(blocks []coin.SignedBlock) (*Blocks, error) { + rbs := make([]Block, 0, len(blocks)) + for _, b := range blocks { + rb, err := NewBlock(b.Block) + if err != nil { + return nil, err + } + rbs = append(rbs, *rb) + } + return &Blocks{ + Blocks: rbs, + }, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/readable/blockchain.go b/vendor/github.com/skycoin/skycoin/src/readable/blockchain.go new file mode 100644 index 0000000000..baca02f9e5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/readable/blockchain.go @@ -0,0 +1,58 @@ +package readable + +import ( + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" +) + +// BlockchainMetadata encapsulates useful information from the coin.Blockchain +type BlockchainMetadata struct { + // Most recent block's header + Head BlockHeader `json:"head"` + // Number of unspent outputs in the coin.Blockchain + Unspents uint64 `json:"unspents"` + // Number of known unconfirmed txns + Unconfirmed uint64 `json:"unconfirmed"` +} + +// NewBlockchainMetadata creates blockchain metadata +func NewBlockchainMetadata(bm visor.BlockchainMetadata) BlockchainMetadata { + return BlockchainMetadata{ + Head: NewBlockHeader(bm.HeadBlock.Head), + Unspents: bm.Unspents, + Unconfirmed: bm.Unconfirmed, + } +} + +// BlockchainProgress is the current blockchain syncing status +type BlockchainProgress struct { + // Our current blockchain length + Current uint64 `json:"current"` + // Our best guess at true blockchain length + Highest uint64 `json:"highest"` + // Individual blockchain length reports from peers + Peers []PeerBlockchainHeight `json:"peers"` +} + +// PeerBlockchainHeight is a peer's IP address with their reported blockchain height +type PeerBlockchainHeight struct { + Address string `json:"address"` + Height uint64 `json:"height"` +} + +// NewBlockchainProgress copies daemon.BlockchainProgress to a struct with json tags +func NewBlockchainProgress(bp *daemon.BlockchainProgress) BlockchainProgress { + peers := make([]PeerBlockchainHeight, len(bp.Peers)) + for i, p := range bp.Peers { + peers[i] = PeerBlockchainHeight{ + Address: p.Address, + Height: p.Height, + } + } + + return BlockchainProgress{ + Current: bp.Current, + Highest: bp.Highest, + Peers: peers, + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/readable/fiber.go b/vendor/github.com/skycoin/skycoin/src/readable/fiber.go new file mode 100644 index 0000000000..cf4399eaf9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/readable/fiber.go @@ -0,0 +1,17 @@ +package readable + +import "github.com/skycoin/skycoin/src/cipher/bip44" + +// FiberConfig is fiber configuration parameters +type FiberConfig struct { + Name string `json:"name"` + DisplayName string `json:"display_name"` + Ticker string `json:"ticker"` + CoinHoursName string `json:"coin_hours_display_name"` + CoinHoursNameSingular string `json:"coin_hours_display_name_singular"` + CoinHoursTicker string `json:"coin_hours_ticker"` + QrURIPrefix string `json:"qr_uri_prefix"` + ExplorerURL string `json:"explorer_url"` + VersionURL string `json:"version_url"` + Bip44Coin bip44.CoinType `json:"bip44_coin"` +} diff --git a/vendor/github.com/skycoin/skycoin/src/readable/network.go b/vendor/github.com/skycoin/skycoin/src/readable/network.go new file mode 100644 index 0000000000..117632b5db --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/readable/network.go @@ -0,0 +1,73 @@ +package readable + +import ( + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/util/useragent" +) + +// Connection a connection's state within the daemon +type Connection struct { + GnetID uint64 `json:"id"` + Addr string `json:"address"` + LastSent int64 `json:"last_sent"` + LastReceived int64 `json:"last_received"` + ConnectedAt int64 `json:"connected_at"` + Outgoing bool `json:"outgoing"` + State daemon.ConnectionState `json:"state"` + Mirror uint32 `json:"mirror"` + ListenPort uint16 `json:"listen_port"` + Height uint64 `json:"height"` + UserAgent useragent.Data `json:"user_agent"` + IsTrustedPeer bool `json:"is_trusted_peer"` + UnconfirmedVerifyTxn VerifyTxn `json:"unconfirmed_verify_transaction"` +} + +// NewConnection copies daemon.Connection to a struct with json tags +func NewConnection(c *daemon.Connection) Connection { + var lastSent int64 + var lastReceived int64 + var connectedAt int64 + + if !c.Gnet.LastSent.IsZero() { + lastSent = c.Gnet.LastSent.Unix() + } + if !c.Gnet.LastReceived.IsZero() { + lastReceived = c.Gnet.LastReceived.Unix() + } + if !c.ConnectedAt.IsZero() { + connectedAt = c.ConnectedAt.Unix() + } + + return Connection{ + GnetID: c.Gnet.ID, + Addr: c.Addr, + LastSent: lastSent, + LastReceived: lastReceived, + ConnectedAt: connectedAt, + Outgoing: c.Outgoing, + State: c.State, + Mirror: c.Mirror, + ListenPort: c.ListenPort, + Height: c.Height, + UserAgent: c.UserAgent, + IsTrustedPeer: c.Pex.Trusted, + UnconfirmedVerifyTxn: NewVerifyTxn(c.UnconfirmedVerifyTxn), + } +} + +// VerifyTxn transaction verification parameters +type VerifyTxn struct { + BurnFactor uint32 `json:"burn_factor"` + MaxTransactionSize uint32 `json:"max_transaction_size"` + MaxDropletPrecision uint8 `json:"max_decimals"` +} + +// NewVerifyTxn converts params.VerifyTxn to VerifyTxn +func NewVerifyTxn(p params.VerifyTxn) VerifyTxn { + return VerifyTxn{ + BurnFactor: p.BurnFactor, + MaxTransactionSize: p.MaxTransactionSize, + MaxDropletPrecision: p.MaxDropletPrecision, + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/readable/output.go b/vendor/github.com/skycoin/skycoin/src/readable/output.go new file mode 100644 index 0000000000..ab5e5580ee --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/readable/output.go @@ -0,0 +1,298 @@ +package readable + +import ( + "errors" + "fmt" + "sort" + "strings" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/transaction" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/mathutil" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" +) + +// UnspentOutput represents a readable output +type UnspentOutput struct { + Hash string `json:"hash"` + Time uint64 `json:"time"` + BkSeq uint64 `json:"block_seq"` + SourceTransaction string `json:"src_tx"` + Address string `json:"address"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` + CalculatedHours uint64 `json:"calculated_hours"` +} + +// NewUnspentOutput creates a readable output +func NewUnspentOutput(uxOut visor.UnspentOutput) (UnspentOutput, error) { + coinStr, err := droplet.ToString(uxOut.Body.Coins) + if err != nil { + return UnspentOutput{}, err + } + + return UnspentOutput{ + Hash: uxOut.Hash().Hex(), + Time: uxOut.Head.Time, + BkSeq: uxOut.Head.BkSeq, + SourceTransaction: uxOut.Body.SrcTransaction.Hex(), + Address: uxOut.Body.Address.String(), + Coins: coinStr, + Hours: uxOut.Body.Hours, + CalculatedHours: uxOut.CalculatedHours, + }, nil +} + +// UnspentOutputs slice of UnspentOutput +type UnspentOutputs []UnspentOutput + +// NewUnspentOutputs converts unspent outputs to a readable output +func NewUnspentOutputs(uxs []visor.UnspentOutput) (UnspentOutputs, error) { + rxReadables := make(UnspentOutputs, len(uxs)) + for i, ux := range uxs { + out, err := NewUnspentOutput(ux) + if err != nil { + return UnspentOutputs{}, err + } + + rxReadables[i] = out + } + + // Sort UnspentOutputs newest to oldest, using hash to break ties + sort.Slice(rxReadables, func(i, j int) bool { + if rxReadables[i].Time == rxReadables[j].Time { + return strings.Compare(rxReadables[i].Hash, rxReadables[j].Hash) < 0 + } + return rxReadables[i].Time > rxReadables[j].Time + }) + + return rxReadables, nil +} + +// Balance returns the balance in droplets +func (ros UnspentOutputs) Balance() (wallet.Balance, error) { + var bal wallet.Balance + for _, out := range ros { + coins, err := droplet.FromString(out.Coins) + if err != nil { + return wallet.Balance{}, err + } + + bal.Coins, err = mathutil.AddUint64(bal.Coins, coins) + if err != nil { + return wallet.Balance{}, err + } + + bal.Hours, err = mathutil.AddUint64(bal.Hours, out.CalculatedHours) + if err != nil { + return wallet.Balance{}, err + } + } + + return bal, nil +} + +// ToUxArray converts UnspentOutputs to coin.UxArray +func (ros UnspentOutputs) ToUxArray() (coin.UxArray, error) { + var uxs coin.UxArray + for _, o := range ros { + coins, err := droplet.FromString(o.Coins) + if err != nil { + return nil, err + } + + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return nil, err + } + + srcTx, err := cipher.SHA256FromHex(o.SourceTransaction) + if err != nil { + return nil, err + } + + uxs = append(uxs, coin.UxOut{ + Head: coin.UxHead{ + Time: o.Time, + BkSeq: o.BkSeq, + }, + Body: coin.UxBody{ + SrcTransaction: srcTx, + Address: addr, + Coins: coins, + Hours: o.Hours, + }, + }) + } + + return uxs, nil +} + +// OutputsToUxBalances converts UnspentOutputs to []transaction.UxBalance +func OutputsToUxBalances(ros UnspentOutputs) ([]transaction.UxBalance, error) { + uxb := make([]transaction.UxBalance, len(ros)) + for i, ro := range ros { + if ro.Hash == "" { + return nil, errors.New("UnspentOutput missing hash") + } + + hash, err := cipher.SHA256FromHex(ro.Hash) + if err != nil { + return nil, fmt.Errorf("UnspentOutput hash is invalid: %v", err) + } + + coins, err := droplet.FromString(ro.Coins) + if err != nil { + return nil, fmt.Errorf("UnspentOutput coins is invalid: %v", err) + } + + addr, err := cipher.DecodeBase58Address(ro.Address) + if err != nil { + return nil, fmt.Errorf("UnspentOutput address is invalid: %v", err) + } + + srcTx, err := cipher.SHA256FromHex(ro.SourceTransaction) + if err != nil { + return nil, fmt.Errorf("UnspentOutput src_tx is invalid: %v", err) + } + + b := transaction.UxBalance{ + Hash: hash, + Time: ro.Time, + BkSeq: ro.BkSeq, + SrcTransaction: srcTx, + Address: addr, + Coins: coins, + Hours: ro.CalculatedHours, + InitialHours: ro.Hours, + } + + uxb[i] = b + } + + return uxb, nil +} + +// UnspentOutputsSummary records unspent outputs in different status. +type UnspentOutputsSummary struct { + Head BlockHeader `json:"head"` + // HeadOutputs are unspent outputs confirmed in the blockchain + HeadOutputs UnspentOutputs `json:"head_outputs"` + // OutgoingOutputs are unspent outputs being spent in unconfirmed transactions + OutgoingOutputs UnspentOutputs `json:"outgoing_outputs"` + // IncomingOutputs are unspent outputs being created by unconfirmed transactions + IncomingOutputs UnspentOutputs `json:"incoming_outputs"` +} + +// NewUnspentOutputsSummary creates an UnspentOutputsSummary from visor.UnspentOutputsSummary +func NewUnspentOutputsSummary(summary *visor.UnspentOutputsSummary) (*UnspentOutputsSummary, error) { + headOutputs, err := NewUnspentOutputs(summary.Confirmed) + if err != nil { + return nil, err + } + + outgoingOutputs, err := NewUnspentOutputs(summary.Outgoing) + if err != nil { + return nil, err + } + + incomingOutputs, err := NewUnspentOutputs(summary.Incoming) + if err != nil { + return nil, err + } + + return &UnspentOutputsSummary{ + Head: NewBlockHeader(summary.HeadBlock.Head), + HeadOutputs: headOutputs, + OutgoingOutputs: outgoingOutputs, + IncomingOutputs: incomingOutputs, + }, nil +} + +// SpendableOutputs subtracts OutgoingOutputs from HeadOutputs +func (os UnspentOutputsSummary) SpendableOutputs() UnspentOutputs { + if len(os.OutgoingOutputs) == 0 { + return os.HeadOutputs + } + + spending := make(map[string]struct{}, len(os.OutgoingOutputs)) + for _, u := range os.OutgoingOutputs { + spending[u.Hash] = struct{}{} + } + + var outs UnspentOutputs + for i := range os.HeadOutputs { + if _, ok := spending[os.HeadOutputs[i].Hash]; !ok { + outs = append(outs, os.HeadOutputs[i]) + } + } + return outs +} + +// ExpectedOutputs adds IncomingOutputs to SpendableOutputs +func (os UnspentOutputsSummary) ExpectedOutputs() UnspentOutputs { + return append(os.SpendableOutputs(), os.IncomingOutputs...) +} + +// SpentOutput is an unspent output that was spent +type SpentOutput struct { + Uxid string `json:"uxid"` + Time uint64 `json:"time"` + SrcBkSeq uint64 `json:"src_block_seq"` + SrcTx string `json:"src_tx"` + OwnerAddress string `json:"owner_address"` + Coins uint64 `json:"coins"` + Hours uint64 `json:"hours"` + CalculatedHours uint64 `json:"calculated_hours"` + SpentBlockSeq uint64 `json:"spent_block_seq"` // block seq that spent the output. + SpentTxnID string `json:"spent_tx"` // id of tx which spent this output. +} + +// NewSpentOutput creates a SpentOutput from historydb.UxOut +func NewSpentOutput(out *historydb.UxOut, t uint64) (*SpentOutput, error) { + calculatedHours := out.Out.Body.Hours + // calculate the coin hour if the uxout has not been used. + if out.SpentTxnID.Null() { + var err error + calculatedHours, err = out.Out.CoinHours(t) + // Treat overflowing coin hours calculations as a non-error and force hours to 0 + // This affects bad spent outputs which had overflowed hours, spent in knownBadBlockSeqs. + switch err { + case nil: + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + calculatedHours = 0 + default: + return nil, err + } + } + + return &SpentOutput{ + Uxid: out.Hash().Hex(), + Time: out.Out.Head.Time, + SrcBkSeq: out.Out.Head.BkSeq, + SrcTx: out.Out.Body.SrcTransaction.Hex(), + OwnerAddress: out.Out.Body.Address.String(), + Coins: out.Out.Body.Coins, + CalculatedHours: calculatedHours, + Hours: out.Out.Body.Hours, + SpentBlockSeq: out.SpentBlockSeq, + SpentTxnID: out.SpentTxnID.Hex(), + }, nil +} + +// NewSpentOutputs creates []SpentOutput from []historydb.UxOut +func NewSpentOutputs(outs []historydb.UxOut, t uint64) ([]SpentOutput, error) { + spents := make([]SpentOutput, len(outs)) + for i, o := range outs { + spent, err := NewSpentOutput(&o, t) + if err != nil { + return nil, err + } + spents[i] = *spent + } + return spents, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/readable/page.go b/vendor/github.com/skycoin/skycoin/src/readable/page.go new file mode 100644 index 0000000000..c9f3e7cfb1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/readable/page.go @@ -0,0 +1,8 @@ +package readable + +// PageInfo represents the pagination info +type PageInfo struct { + TotalPages uint64 `json:"total_pages"` + PageSize uint64 `json:"page_size"` + CurrentPage uint64 `json:"current_page"` +} diff --git a/vendor/github.com/skycoin/skycoin/src/readable/richlist.go b/vendor/github.com/skycoin/skycoin/src/readable/richlist.go new file mode 100644 index 0000000000..4f87547da4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/readable/richlist.go @@ -0,0 +1,32 @@ +package readable + +import ( + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/visor" +) + +// RichlistBalance holds info an address balance holder +type RichlistBalance struct { + Address string `json:"address"` + Coins string `json:"coins"` + Locked bool `json:"locked"` +} + +// NewRichlistBalances copies from visor.Richlist +func NewRichlistBalances(visorRichlist visor.Richlist) ([]RichlistBalance, error) { + richlist := make([]RichlistBalance, len(visorRichlist)) + for i, v := range visorRichlist { + coins, err := droplet.ToString(v.Coins) + if err != nil { + return nil, err + } + + richlist[i] = RichlistBalance{ + Address: v.Address.String(), + Coins: coins, + Locked: v.Locked, + } + } + + return richlist, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/readable/transaction.go b/vendor/github.com/skycoin/skycoin/src/readable/transaction.go new file mode 100644 index 0000000000..e5a2e0ed3f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/readable/transaction.go @@ -0,0 +1,254 @@ +package readable + +import ( + "errors" + "fmt" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/timeutil" + "github.com/skycoin/skycoin/src/visor" +) + +var logger = logging.MustGetLogger("readable") + +// TransactionStatus represents the transaction status +type TransactionStatus struct { + Confirmed bool `json:"confirmed"` + Unconfirmed bool `json:"unconfirmed"` + // If confirmed, how many blocks deep in the chain it is. Will be at least 1 if confirmed + Height uint64 `json:"height"` + // If confirmed, the sequence of the block in which the transaction was executed + BlockSeq uint64 `json:"block_seq"` +} + +// NewTransactionStatus creates TransactionStatus from visor.TransactionStatus +func NewTransactionStatus(status visor.TransactionStatus) TransactionStatus { + return TransactionStatus{ + Unconfirmed: !status.Confirmed, + Confirmed: status.Confirmed, + Height: status.Height, + BlockSeq: status.BlockSeq, + } +} + +// TransactionOutput readable transaction output +type TransactionOutput struct { + Hash string `json:"uxid"` + Address string `json:"dst"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` +} + +// TransactionInput readable transaction input +type TransactionInput struct { + Hash string `json:"uxid"` + Address string `json:"owner"` + Coins string `json:"coins"` + SrcTxid string `json:"src_txid"` + Hours uint64 `json:"hours"` + CalculatedHours uint64 `json:"calculated_hours"` +} + +// NewTransactionOutput creates a TransactionOutput +func NewTransactionOutput(txn *coin.TransactionOutput, txid cipher.SHA256) (*TransactionOutput, error) { + coinStr, err := droplet.ToString(txn.Coins) + if err != nil { + return nil, err + } + + return &TransactionOutput{ + Hash: txn.UxID(txid).Hex(), + Address: txn.Address.String(), + Coins: coinStr, + Hours: txn.Hours, + }, nil +} + +// NewTransactionInput creates a TransactionInput from a visor.TransactionInput +func NewTransactionInput(input visor.TransactionInput) (TransactionInput, error) { + coinStr, err := droplet.ToString(input.UxOut.Body.Coins) + if err != nil { + logger.Errorf("Failed to convert coins to string: %v", err) + return TransactionInput{}, err + } + + return TransactionInput{ + Hash: input.UxOut.Hash().Hex(), + Address: input.UxOut.Body.Address.String(), + Coins: coinStr, + Hours: input.UxOut.Body.Hours, + SrcTxid: input.UxOut.Body.SrcTransaction.Hex(), + CalculatedHours: input.CalculatedHours, + }, nil +} + +// Transaction represents a readable transaction +type Transaction struct { + Timestamp uint64 `json:"timestamp,omitempty"` + Length uint32 `json:"length"` + Type uint8 `json:"type"` + Hash string `json:"txid"` + InnerHash string `json:"inner_hash"` + + Sigs []string `json:"sigs"` + In []string `json:"inputs"` + Out []TransactionOutput `json:"outputs"` +} + +// NewTransaction creates a readable transaction +func NewTransaction(txn coin.Transaction, isGenesis bool) (*Transaction, error) { + if isGenesis && len(txn.In) != 0 { + return nil, errors.New("NewTransaction: isGenesis=true but Transaction.In is not empty") + } + if !isGenesis && len(txn.In) == 0 { + return nil, errors.New("NewTransaction: isGenesis=false but Transaction.In is empty") + } + + // Genesis transaction uses empty SHA256 as the txid for its outputs [FIXME: requires hardfork] + txID := txn.Hash() + txnOutputTxID := cipher.SHA256{} + if !isGenesis { + txnOutputTxID = txID + } + + sigs := make([]string, len(txn.Sigs)) + for i := range txn.Sigs { + sigs[i] = txn.Sigs[i].Hex() + } + + in := make([]string, len(txn.In)) + for i := range txn.In { + in[i] = txn.In[i].Hex() + } + + out := make([]TransactionOutput, len(txn.Out)) + for i := range txn.Out { + o, err := NewTransactionOutput(&txn.Out[i], txnOutputTxID) + if err != nil { + return nil, err + } + + out[i] = *o + } + + return &Transaction{ + Length: txn.Length, + Type: txn.Type, + Hash: txID.Hex(), + InnerHash: txn.InnerHash.Hex(), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} + +// NewTransactionWithTimestamp creates a readable transaction with its timestamp set +func NewTransactionWithTimestamp(txn coin.Transaction, isGenesis bool, timestamp uint64) (*Transaction, error) { + newTxn, err := NewTransaction(txn, isGenesis) + if err != nil { + return nil, err + } + newTxn.Timestamp = timestamp + return newTxn, nil +} + +// UnconfirmedTransactions represents a readable unconfirmed transaction +type UnconfirmedTransactions struct { + Transaction Transaction `json:"transaction"` + Received time.Time `json:"received"` + Checked time.Time `json:"checked"` + Announced time.Time `json:"announced"` + IsValid bool `json:"is_valid"` +} + +// NewUnconfirmedTransaction creates a readable unconfirmed transaction +func NewUnconfirmedTransaction(unconfirmed *visor.UnconfirmedTransaction) (*UnconfirmedTransactions, error) { + isGenesis := false // unconfirmed transactions are never the genesis transaction + txn, err := NewTransaction(unconfirmed.Transaction, isGenesis) + if err != nil { + return nil, err + } + return &UnconfirmedTransactions{ + Transaction: *txn, + Received: timeutil.NanoToTime(unconfirmed.Received), + Checked: timeutil.NanoToTime(unconfirmed.Checked), + Announced: timeutil.NanoToTime(unconfirmed.Announced), + IsValid: unconfirmed.IsValid == 1, + }, nil +} + +// NewUnconfirmedTransactions converts []visor.UnconfirmedTransaction to []UnconfirmedTransactions +func NewUnconfirmedTransactions(txns []visor.UnconfirmedTransaction) ([]UnconfirmedTransactions, error) { + rut := make([]UnconfirmedTransactions, len(txns)) + for i := range txns { + txn, err := NewUnconfirmedTransaction(&txns[i]) + if err != nil { + return []UnconfirmedTransactions{}, err + } + rut[i] = *txn + } + return rut, nil +} + +// TransactionWithStatus represents transaction result +type TransactionWithStatus struct { + Status TransactionStatus `json:"status"` + Time uint64 `json:"time"` + Transaction Transaction `json:"txn"` +} + +// NewTransactionWithStatus converts visor.Transaction to TransactionWithStatus +func NewTransactionWithStatus(txn *visor.Transaction) (*TransactionWithStatus, error) { + if txn == nil { + return nil, nil + } + + isGenesis := txn.Status.BlockSeq == 0 && txn.Status.Confirmed + rbTxn, err := NewTransactionWithTimestamp(txn.Transaction, isGenesis, txn.Time) + if err != nil { + return nil, err + } + + return &TransactionWithStatus{ + Transaction: *rbTxn, + Status: NewTransactionStatus(txn.Status), + Time: txn.Time, + }, nil +} + +// TransactionWithStatusVerbose represents verbose transaction result +type TransactionWithStatusVerbose struct { + Status TransactionStatus `json:"status"` + Time uint64 `json:"time"` + Transaction TransactionVerbose `json:"txn"` +} + +// NewTransactionWithStatusVerbose converts visor.Transaction to TransactionWithStatusVerbose +func NewTransactionWithStatusVerbose(txn *visor.Transaction, inputs []visor.TransactionInput) (*TransactionWithStatusVerbose, error) { + if txn == nil { + return nil, nil + } + + if len(txn.Transaction.In) != len(inputs) { + return nil, fmt.Errorf("NewTransactionWithStatusVerbose: len(txn.In) != len(inputs) [%d != %d]", len(txn.Transaction.In), len(inputs)) + } + + rbTxn, err := NewTransactionVerbose(*txn, inputs) + if err != nil { + return nil, err + } + + // Force the Status field to be hidden on the inner transaction, to maintain API compatibility + rbTxn.Status = nil + + return &TransactionWithStatusVerbose{ + Transaction: rbTxn, + Status: NewTransactionStatus(txn.Status), + Time: txn.Time, + }, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/readable/verbose.go b/vendor/github.com/skycoin/skycoin/src/readable/verbose.go new file mode 100644 index 0000000000..073e8e2ce9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/readable/verbose.go @@ -0,0 +1,258 @@ +package readable + +import ( + "errors" + "fmt" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/mathutil" + "github.com/skycoin/skycoin/src/util/timeutil" + "github.com/skycoin/skycoin/src/visor" +) + +// BlockBodyVerbose represents a verbose readable block body +type BlockBodyVerbose struct { + Transactions []BlockTransactionVerbose `json:"txns"` +} + +// BlockVerbose represents a readable block with verbose data +type BlockVerbose struct { + Head BlockHeader `json:"header"` + Body BlockBodyVerbose `json:"body"` + Size uint32 `json:"size"` +} + +// NewBlockBodyVerbose creates a verbose readable block body +func NewBlockBodyVerbose(b coin.Block, inputs [][]visor.TransactionInput) (*BlockBodyVerbose, error) { + if len(inputs) != len(b.Body.Transactions) { + return nil, fmt.Errorf("NewBlockBodyVerbose: len(inputs) != len(b.Body.Transactions) (seq=%d)", b.Head.BkSeq) + } + + txns := make([]BlockTransactionVerbose, len(b.Body.Transactions)) + for i := range b.Body.Transactions { + t := b.Body.Transactions[i] + + txn, err := NewBlockTransactionVerbose(t, inputs[i], b.Head.BkSeq == 0) + if err != nil { + return nil, err + } + txns[i] = txn + } + + return &BlockBodyVerbose{ + Transactions: txns, + }, nil +} + +// NewBlockVerbose creates a verbose readable block +func NewBlockVerbose(b coin.Block, inputs [][]visor.TransactionInput) (*BlockVerbose, error) { + body, err := NewBlockBodyVerbose(b, inputs) + if err != nil { + return nil, err + } + + size, err := b.Size() + if err != nil { + return nil, err + } + + return &BlockVerbose{ + Head: NewBlockHeader(b.Head), + Body: *body, + Size: size, + }, nil +} + +// BlocksVerbose an array of verbose readable blocks. +type BlocksVerbose struct { + Blocks []BlockVerbose `json:"blocks"` +} + +// NewBlocksVerbose creates BlocksVerbose from []BlockVerbose +func NewBlocksVerbose(blocks []coin.SignedBlock, inputs [][][]visor.TransactionInput) (*BlocksVerbose, error) { + bs := make([]BlockVerbose, len(blocks)) + for i := range blocks { + if i >= len(inputs) { + return nil, errors.New("NewBlocksVerbose: not enough inputs for blocks") + } + + b, err := NewBlockVerbose(blocks[i].Block, inputs[i]) + if err != nil { + return nil, err + } + + bs[i] = *b + } + + return &BlocksVerbose{ + Blocks: bs, + }, nil +} + +// BlockTransactionVerbose has readable transaction data for transactions inside a block. It differs from Transaction +// in that it includes metadata for transaction inputs and the calculated coinhour fee spent by the block +type BlockTransactionVerbose struct { + Length uint32 `json:"length"` + Type uint8 `json:"type"` + Hash string `json:"txid"` + InnerHash string `json:"inner_hash"` + Fee uint64 `json:"fee"` + + Sigs []string `json:"sigs"` + In []TransactionInput `json:"inputs"` + Out []TransactionOutput `json:"outputs"` +} + +// NewBlockTransactionVerbose creates BlockTransactionVerbose +func NewBlockTransactionVerbose(txn coin.Transaction, inputs []visor.TransactionInput, isGenesis bool) (BlockTransactionVerbose, error) { + if len(inputs) != len(txn.In) { + return BlockTransactionVerbose{}, errors.New("NewBlockTransactionVerbose: len(inputs) != len(txn.In)") + } + + // Genesis transaction uses empty SHA256 as txid + // FIXME: If/when the blockchain is regenerated, use a real hash as the txID for the genesis block. The bkSeq argument can be removed then. + txID := cipher.SHA256{} + if !isGenesis { + txID = txn.Hash() + } + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + out := make([]TransactionOutput, len(txn.Out)) + for i := range txn.Out { + o, err := NewTransactionOutput(&txn.Out[i], txID) + if err != nil { + return BlockTransactionVerbose{}, err + } + + out[i] = *o + } + + var hoursIn uint64 + for _, i := range inputs { + if _, err := mathutil.AddUint64(hoursIn, i.CalculatedHours); err != nil { + logger.Critical().Warningf("Ignoring NewBlockTransactionVerbose summing txn %s input hours error: %v", txID.Hex(), err) + } + hoursIn += i.CalculatedHours + } + + var hoursOut uint64 + for _, o := range txn.Out { + if _, err := mathutil.AddUint64(hoursOut, o.Hours); err != nil { + logger.Critical().Warningf("Ignoring NewBlockTransactionVerbose summing txn %s outputs hours error: %v", txID.Hex(), err) + } + + hoursOut += o.Hours + } + + var fee uint64 + if isGenesis { + if hoursIn != 0 { + err := errors.New("NewBlockTransactionVerbose genesis block should have 0 input hours") + return BlockTransactionVerbose{}, err + } + + fee = 0 + } else { + if hoursIn < hoursOut { + err := fmt.Errorf("NewBlockTransactionVerbose input hours is less than output hours, txid=%s", txID.Hex()) + return BlockTransactionVerbose{}, err + } + + fee = hoursIn - hoursOut + } + + txnInputs := make([]TransactionInput, len(inputs)) + for i, input := range inputs { + var err error + txnInputs[i], err = NewTransactionInput(input) + if err != nil { + return BlockTransactionVerbose{}, err + } + } + + return BlockTransactionVerbose{ + Length: txn.Length, + Type: txn.Type, + Hash: txn.Hash().Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fee, + + Sigs: sigs, + In: txnInputs, + Out: out, + }, nil +} + +// TransactionVerbose has readable transaction data. It adds TransactionStatus to a BlockTransactionVerbose +type TransactionVerbose struct { + Status *TransactionStatus `json:"status,omitempty"` + Timestamp uint64 `json:"timestamp,omitempty"` + BlockTransactionVerbose +} + +// NewTransactionVerbose creates TransactionVerbose +func NewTransactionVerbose(txn visor.Transaction, inputs []visor.TransactionInput) (TransactionVerbose, error) { + rb, err := NewBlockTransactionVerbose(txn.Transaction, inputs, txn.Status.BlockSeq == 0 && txn.Status.Confirmed) + if err != nil { + return TransactionVerbose{}, err + } + + status := NewTransactionStatus(txn.Status) + + return TransactionVerbose{ + Status: &status, + Timestamp: txn.Time, + BlockTransactionVerbose: rb, + }, nil +} + +// UnconfirmedTransactionVerbose represents a verbose readable unconfirmed transaction +type UnconfirmedTransactionVerbose struct { + Transaction BlockTransactionVerbose `json:"transaction"` + Received time.Time `json:"received"` + Checked time.Time `json:"checked"` + Announced time.Time `json:"announced"` + IsValid bool `json:"is_valid"` +} + +// NewUnconfirmedTransactionVerbose creates a verbose readable unconfirmed transaction +func NewUnconfirmedTransactionVerbose(unconfirmed *visor.UnconfirmedTransaction, inputs []visor.TransactionInput) (*UnconfirmedTransactionVerbose, error) { + isGenesis := false // The genesis transaction is never unconfirmed + txn, err := NewBlockTransactionVerbose(unconfirmed.Transaction, inputs, isGenesis) + if err != nil { + return nil, err + } + + return &UnconfirmedTransactionVerbose{ + Transaction: txn, + Received: timeutil.NanoToTime(unconfirmed.Received), + Checked: timeutil.NanoToTime(unconfirmed.Checked), + Announced: timeutil.NanoToTime(unconfirmed.Announced), + IsValid: unconfirmed.IsValid == 1, + }, nil +} + +// NewUnconfirmedTransactionsVerbose creates []UnconfirmedTransactions from []UnconfirmedTransaction and their readable transaction inputs +func NewUnconfirmedTransactionsVerbose(txns []visor.UnconfirmedTransaction, inputs [][]visor.TransactionInput) ([]UnconfirmedTransactionVerbose, error) { + if len(inputs) != len(txns) { + return nil, fmt.Errorf("NewUnconfirmedTransactionsVerbose: len(inputs) != len(txns)") + } + + rTxns := make([]UnconfirmedTransactionVerbose, len(txns)) + for i, txn := range txns { + rTxn, err := NewUnconfirmedTransactionVerbose(&txn, inputs[i]) + if err != nil { + return nil, err + } + + rTxns[i] = *rTxn + } + + return rTxns, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/readable/version.go b/vendor/github.com/skycoin/skycoin/src/readable/version.go new file mode 100644 index 0000000000..d85b1976da --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/readable/version.go @@ -0,0 +1,20 @@ +package readable + +import "github.com/blang/semver" + +// BuildInfo represents the build info +type BuildInfo struct { + Version string `json:"version"` // version number + Commit string `json:"commit"` // git commit id + Branch string `json:"branch"` // git branch name +} + +// Semver returns the parsed semver.Version of the configured Version string +func (b BuildInfo) Semver() (*semver.Version, error) { + sv, err := semver.Make(b.Version) + if err != nil { + return nil, err + } + + return &sv, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/readable/wallet.go b/vendor/github.com/skycoin/skycoin/src/readable/wallet.go new file mode 100644 index 0000000000..0c482425e6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/readable/wallet.go @@ -0,0 +1,70 @@ +package readable + +import ( + "github.com/skycoin/skycoin/src/cipher/bip44" + "github.com/skycoin/skycoin/src/cipher/crypto" + "github.com/skycoin/skycoin/src/wallet" +) + +// Balance has coins and hours +type Balance struct { + Coins uint64 `json:"coins"` + Hours uint64 `json:"hours"` +} + +// NewBalance copies from wallet.Balance +func NewBalance(b wallet.Balance) Balance { + return Balance{ + Coins: b.Coins, + Hours: b.Hours, + } +} + +// BalancePair records the confirmed and predicted balance of an address +type BalancePair struct { + Confirmed Balance `json:"confirmed"` + Predicted Balance `json:"predicted"` // TODO rename "pending" +} + +// NewBalancePair copies from wallet.BalancePair +func NewBalancePair(bp wallet.BalancePair) BalancePair { + return BalancePair{ + Confirmed: NewBalance(bp.Confirmed), + Predicted: NewBalance(bp.Predicted), + } +} + +// AddressBalances represents a map of address balances +type AddressBalances map[string]BalancePair + +// NewAddressBalances copies from wallet.AddressBalances +func NewAddressBalances(wab wallet.AddressBalances) AddressBalances { + ab := make(AddressBalances, len(wab)) + for k, v := range wab { + ab[k] = NewBalancePair(v) + } + return ab +} + +// WalletEntry the wallet entry struct +type WalletEntry struct { + Address string `json:"address"` + Public string `json:"public_key"` + ChildNumber *uint32 `json:"child_number,omitempty"` // For bip32/44 + Change *uint32 `json:"change,omitempty"` // For bip44 +} + +// WalletMeta the wallet meta struct +type WalletMeta struct { + Coin wallet.CoinType `json:"coin"` + Filename string `json:"filename"` + Label string `json:"label"` + Type string `json:"type"` + Version string `json:"version"` + CryptoType crypto.CryptoType `json:"crypto_type"` + Timestamp int64 `json:"timestamp"` + Temp bool `json:"temp"` + Encrypted bool `json:"encrypted"` + Bip44Coin *bip44.CoinType `json:"bip44_coin,omitempty"` // For bip44 + XPub string `json:"xpub,omitempty"` // For xpub +} diff --git a/vendor/github.com/skycoin/skycoin/src/skycoin/config.go b/vendor/github.com/skycoin/skycoin/src/skycoin/config.go new file mode 100644 index 0000000000..ff16669dfd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/skycoin/config.go @@ -0,0 +1,776 @@ +package skycoin + +import ( + "errors" + // "flag" + "fmt" + "math" + + // "os" + "path/filepath" + "runtime" + "strings" + "time" + + "github.com/spf13/cobra" + + "github.com/skycoin/skycoin/src/cipher/crypto" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/fiber" + "github.com/skycoin/skycoin/src/kvstorage" + + "log" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/readable" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/file" + "github.com/skycoin/skycoin/src/util/useragent" +) + +var ( + help = false +) + +// Config records skycoin node and build config +type Config struct { + Node NodeConfig + Build readable.BuildInfo +} + +// NodeConfig records the node's configuration +type NodeConfig struct { + // Name of the coin + CoinName string + + // Disable peer exchange + DisablePEX bool + // Download peer list + DownloadPeerList bool + // Download the peers list from this URL + PeerListURL string + // Don't make any outgoing connections + DisableOutgoingConnections bool + // Don't allowing incoming connections + DisableIncomingConnections bool + // Disables networking altogether + DisableNetworking bool + // Enable GUI + EnableGUI bool + // Disable CSRF check in the wallet API + DisableCSRF bool + // Disable Host, Origin and Referer header check in the wallet API + DisableHeaderCheck bool + // Disable CSP disable content-security-policy in http response + DisableCSP bool + // Comma separated list of API sets enabled on the remote web interface + EnabledAPISets string + // Comma separated list of API sets disabled on the remote web interface + DisabledAPISets string + // Enable all of API sets. Applies before disabling individual sets + EnableAllAPISets bool + + enabledAPISets map[string]struct{} + // Comma separate list of hostnames to accept in the Host header, used to bypass the Host header check which only applies to localhost addresses + HostWhitelist string + hostWhitelist []string + + // Only run on localhost and only connect to others on localhost + LocalhostOnly bool + // Which address to serve on. Leave blank to automatically assign to a + // public interface + Address string + // gnet uses this for TCP incoming and outgoing + Port int + // MaxConnections is the maximum number of total connections allowed + MaxConnections int + // Maximum outgoing connections to maintain + MaxOutgoingConnections int + // Maximum incoming connections to maintain + MaxIncomingConnections int + // Maximum default outgoing connections + MaxDefaultPeerOutgoingConnections int + // How often to make outgoing connections + OutgoingConnectionsRate time.Duration + // MaxOutgoingMessageLength maximum size of outgoing messages + MaxOutgoingMessageLength int + // MaxIncomingMessageLength maximum size of incoming messages + MaxIncomingMessageLength int + // MaxLastBlocksCount maximum number of blocks to response to API /api/v1/last_blocks + MaxLastBlocksCount uint64 + // PeerlistSize represents the maximum number of peers that the pex would maintain + PeerlistSize int + // Wallet Address Version + // AddressVersion string + // Remote web interface + WebInterface bool + // Remote web interface port + WebInterfacePort int + // Remote web interface address + WebInterfaceAddr string + // Remote web interface certificate + WebInterfaceCert string + // Remote web interface key + WebInterfaceKey string + // Remote web interface HTTPS support + WebInterfaceHTTPS bool + // Remote web interface username and password + WebInterfaceUsername string + WebInterfacePassword string + // Allow web interface auth without HTTPS + WebInterfacePlaintextAuth bool + + // Launch System Default Browser after client startup + LaunchBrowser bool + + // Data directory holds app data -- defaults to ~/.skycoin + DataDirectory string + // GUI directory contains assets for the HTML interface + GUIDirectory string + + // Timeouts for the HTTP listener + HTTPReadTimeout time.Duration + HTTPWriteTimeout time.Duration + HTTPIdleTimeout time.Duration + + // Remark to include in user agent sent in the wire protocol introduction + UserAgentRemark string + userAgent useragent.Data + + // Logging + ColorLog bool + // This is the value registered with flag, it is converted to LogLevel after parsing + LogLevel string + // Disable "Reply to ping", "Received pong" log messages + DisablePingPong bool + + // Verify the database integrity after loading + VerifyDB bool + // Reset the database if integrity checks fail, and continue running + ResetCorruptDB bool + + // Transaction verification parameters for unconfirmed transactions + UnconfirmedVerifyTxn params.VerifyTxn + // Transaction verification parameters for transactions when creating blocks + CreateBlockVerifyTxn params.VerifyTxn + // Maximum total size of transactions in a block + MaxBlockTransactionsSize uint32 + + unconfirmedBurnFactor uint64 + maxUnconfirmedTransactionSize uint64 + unconfirmedMaxDropletPrecision uint64 + createBlockBurnFactor uint64 + createBlockMaxTransactionSize uint64 + createBlockMaxDropletPrecision uint64 + maxBlockSize uint64 + + // Wallets + // Defaults to ${DataDirectory}/wallets/ + WalletDirectory string + // Wallet crypto type + WalletCryptoType string + + // Key-value storage + // Default to ${DataDirectory}/data + KVStorageDirectory string + EnabledStorageTypes []kvstorage.Type + + // Disable the hardcoded default peers + DisableDefaultPeers bool + // Load custom peers from disk + CustomPeersFile string + + RunBlockPublisher bool + + /* Developer options */ + + // Enable cpu profiling + ProfileCPU bool + // Where the file is written to + ProfileCPUFile string + // Enable HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) + HTTPProf bool + // Expose HTTP profiling on this interface + HTTPProfHost string + + DBPath string + DBReadOnly bool + LogToFile bool + Version bool // show node version + + GenesisSignatureStr string + GenesisAddressStr string + BlockchainPubkeyStr string + BlockchainSeckeyStr string + GenesisTimestamp uint64 + GenesisCoinVolume uint64 + DefaultConnections []string + + genesisSignature cipher.Sig + genesisAddress cipher.Address + genesisHash cipher.SHA256 + + blockchainPubkey cipher.PubKey + blockchainSeckey cipher.SecKey + + Fiber readable.FiberConfig +} + +// NewNodeConfig returns a new node config instance +func NewNodeConfig(mode string, node fiber.NodeConfig) NodeConfig { + nodeConfig := NodeConfig{ + CoinName: node.CoinName, + GenesisSignatureStr: node.GenesisSignatureStr, + GenesisAddressStr: node.GenesisAddressStr, + GenesisCoinVolume: node.GenesisCoinVolume, + GenesisTimestamp: node.GenesisTimestamp, + BlockchainPubkeyStr: node.BlockchainPubkeyStr, + BlockchainSeckeyStr: node.BlockchainSeckeyStr, + DefaultConnections: node.DefaultConnections, + // Disable peer exchange + DisablePEX: false, + // Don't make any outgoing connections + DisableOutgoingConnections: false, + // Don't allowing incoming connections + DisableIncomingConnections: false, + // Disables networking altogether + DisableNetworking: false, + // Enable GUI + EnableGUI: false, + // Disable CSRF check in the wallet API + DisableCSRF: false, + // Disable Host, Origin and Referer header check in the wallet API + DisableHeaderCheck: false, + // DisableCSP disable content-security-policy in http response + DisableCSP: false, + // Only run on localhost and only connect to others on localhost + LocalhostOnly: false, + // Which address to serve on. Leave blank to automatically assign to a + // public interface + Address: "", + // gnet uses this for TCP incoming and outgoing + Port: node.Port, + // MaxConnections is the maximum number of total connections allowed + MaxConnections: 128, + // MaxOutgoingConnections is the maximum outgoing connections allowed + MaxOutgoingConnections: 8, + // MaxIncomingConnections is the maximum incoming connections allowed + MaxIncomingConnections: 120, + // MaxDefaultOutgoingConnections is the maximum default outgoing connections allowed + MaxDefaultPeerOutgoingConnections: 2, + DownloadPeerList: true, + PeerListURL: node.PeerListURL, + // How often to make outgoing connections, in seconds + OutgoingConnectionsRate: time.Second * 5, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + MaxLastBlocksCount: 256, + PeerlistSize: 65535, + // Wallet Address Version + // AddressVersion: "test", + // Remote web interface + WebInterface: true, + WebInterfacePort: node.WebInterfacePort, + WebInterfaceAddr: "127.0.0.1", + WebInterfaceCert: "", + WebInterfaceKey: "", + WebInterfaceHTTPS: false, + EnabledAPISets: strings.Join([]string{ + api.EndpointsRead, + api.EndpointsTransaction, + }, ","), + DisabledAPISets: "", + EnableAllAPISets: false, + + LaunchBrowser: false, + // Data directory holds app data + DataDirectory: node.DataDirectory, + // Web GUI static resources + GUIDirectory: "./src/gui/static/", + // Logging + ColorLog: true, + LogLevel: "INFO", + LogToFile: false, + DisablePingPong: false, + + VerifyDB: false, + ResetCorruptDB: false, + + // Blockchain/transaction validation + UnconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: node.UnconfirmedBurnFactor, + MaxTransactionSize: node.UnconfirmedMaxTransactionSize, + MaxDropletPrecision: node.UnconfirmedMaxDropletPrecision, + }, + CreateBlockVerifyTxn: params.VerifyTxn{ + BurnFactor: node.CreateBlockBurnFactor, + MaxTransactionSize: node.CreateBlockMaxTransactionSize, + MaxDropletPrecision: node.CreateBlockMaxDropletPrecision, + }, + MaxBlockTransactionsSize: node.MaxBlockTransactionsSize, + + // Wallets + WalletDirectory: "", + WalletCryptoType: string(crypto.DefaultCryptoType), + + // Key-value storage + KVStorageDirectory: "", + EnabledStorageTypes: []kvstorage.Type{ + kvstorage.TypeTxIDNotes, + kvstorage.TypeGeneral, + }, + + // Timeout settings for http.Server + // https://blog.cloudflare.com/the-complete-guide-to-golang-net-http-timeouts/ + HTTPReadTimeout: time.Second * 10, + HTTPWriteTimeout: time.Second * 60, + HTTPIdleTimeout: time.Second * 120, + + RunBlockPublisher: false, + + // Enable cpu profiling + ProfileCPU: false, + // Where the file is written to + ProfileCPUFile: "cpu.prof", + // HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) + HTTPProf: false, + HTTPProfHost: "localhost:6060", + + Fiber: readable.FiberConfig{ + Name: node.CoinName, + DisplayName: node.DisplayName, + Ticker: node.Ticker, + CoinHoursName: node.CoinHoursName, + CoinHoursNameSingular: node.CoinHoursNameSingular, + CoinHoursTicker: node.CoinHoursTicker, + QrURIPrefix: node.QrURIPrefix, + ExplorerURL: node.ExplorerURL, + VersionURL: node.VersionURL, + Bip44Coin: node.Bip44Coin, + }, + } + + nodeConfig.applyConfigMode(mode) + + return nodeConfig +} + +func (c *Config) postProcess() error { + // if help { + // flag.Usage() + // os.Exit(0) + // } + + var err error + if c.Node.GenesisSignatureStr != "" { + c.Node.genesisSignature, err = cipher.SigFromHex(c.Node.GenesisSignatureStr) + panicIfError(err, "Invalid Signature") + } + + if c.Node.GenesisAddressStr != "" { + c.Node.genesisAddress, err = cipher.DecodeBase58Address(c.Node.GenesisAddressStr) + panicIfError(err, "Invalid Address") + } + + // Compute genesis block hash + gb, err := coin.NewGenesisBlock(c.Node.genesisAddress, c.Node.GenesisCoinVolume, c.Node.GenesisTimestamp) + if err != nil { + panicIfError(err, "Create genesis hash failed") + } + c.Node.genesisHash = gb.HashHeader() + + if c.Node.BlockchainPubkeyStr != "" { + c.Node.blockchainPubkey, err = cipher.PubKeyFromHex(c.Node.BlockchainPubkeyStr) + panicIfError(err, "Invalid Pubkey") + } + if c.Node.BlockchainSeckeyStr != "" { + c.Node.blockchainSeckey, err = cipher.SecKeyFromHex(c.Node.BlockchainSeckeyStr) + panicIfError(err, "Invalid Seckey") + c.Node.BlockchainSeckeyStr = "" + } + if c.Node.BlockchainSeckeyStr != "" { + c.Node.blockchainSeckey = cipher.SecKey{} + } + + home := file.UserHome() + c.Node.DataDirectory, err = file.InitDataDir(replaceHome(c.Node.DataDirectory, home)) + panicIfError(err, "Invalid DataDirectory") + + if c.Node.WebInterfaceCert == "" { + c.Node.WebInterfaceCert = filepath.Join(c.Node.DataDirectory, "skycoind.cert") + } else { + c.Node.WebInterfaceCert = replaceHome(c.Node.WebInterfaceCert, home) + } + + if c.Node.WebInterfaceKey == "" { + c.Node.WebInterfaceKey = filepath.Join(c.Node.DataDirectory, "skycoind.key") + } else { + c.Node.WebInterfaceKey = replaceHome(c.Node.WebInterfaceKey, home) + } + + if c.Node.WalletDirectory == "" { + c.Node.WalletDirectory = filepath.Join(c.Node.DataDirectory, "wallets") + } else { + c.Node.WalletDirectory = replaceHome(c.Node.WalletDirectory, home) + } + + if c.Node.KVStorageDirectory == "" { + c.Node.KVStorageDirectory = filepath.Join(c.Node.DataDirectory, "data") + } else { + c.Node.KVStorageDirectory = replaceHome(c.Node.KVStorageDirectory, home) + } + if len(c.Node.EnabledStorageTypes) == 0 { + c.Node.EnabledStorageTypes = []kvstorage.Type{ + kvstorage.TypeGeneral, + kvstorage.TypeTxIDNotes, + } + } + + if c.Node.DBPath == "" { + c.Node.DBPath = filepath.Join(c.Node.DataDirectory, "data.db") + } else { + c.Node.DBPath = replaceHome(c.Node.DBPath, home) + } + + userAgentData := useragent.Data{ + Coin: c.Node.CoinName, + Version: c.Build.Version, + Remark: c.Node.UserAgentRemark, + } + + if _, err := userAgentData.Build(); err != nil { + return err + } + + c.Node.userAgent = userAgentData + + apiSets, err := buildAPISets(c.Node) + if err != nil { + return err + } + + // Don't open browser to load wallets if wallet apis are disabled. + c.Node.enabledAPISets = apiSets + if _, ok := c.Node.enabledAPISets[api.EndpointsWallet]; !ok { + c.Node.EnableGUI = false + c.Node.LaunchBrowser = false + } + + if c.Node.EnableGUI { + c.Node.GUIDirectory = file.ResolveResourceDirectory(c.Node.GUIDirectory) + } + + if c.Node.DisableDefaultPeers { + c.Node.DefaultConnections = nil + } + + if c.Node.HostWhitelist != "" { + if c.Node.DisableHeaderCheck { + return errors.New("host whitelist should be empty when header check is disabled") + } + c.Node.hostWhitelist = strings.Split(c.Node.HostWhitelist, ",") + } + + httpAuthEnabled := c.Node.WebInterfaceUsername != "" || c.Node.WebInterfacePassword != "" + if httpAuthEnabled && !c.Node.WebInterfaceHTTPS && !c.Node.WebInterfacePlaintextAuth { + return errors.New("Web interface auth enabled but HTTPS is not enabled. Use -web-interface-plaintext-auth=true if this is desired") + } + + if c.Node.MaxConnections < c.Node.MaxOutgoingConnections+c.Node.MaxIncomingConnections { + return errors.New("-max-connections must be >= -max-outgoing-connections + -max-incoming-connections") + } + + if c.Node.MaxOutgoingConnections > c.Node.MaxConnections { + return errors.New("-max-outgoing-connections cannot be higher than -max-connections") + } + + if c.Node.MaxIncomingConnections > c.Node.MaxConnections { + return errors.New("-max-incoming-connections cannot be higher than -max-connections") + } + + if c.Node.maxBlockSize > math.MaxUint32 { + return errors.New("-max-block-size exceeds MaxUint32") + } + if c.Node.maxUnconfirmedTransactionSize > math.MaxUint32 { + return errors.New("-max-txn-size-unconfirmed exceeds MaxUint32") + } + if c.Node.unconfirmedBurnFactor > math.MaxUint32 { + return errors.New("-burn-factor-unconfirmed exceeds MaxUint32") + } + if c.Node.createBlockBurnFactor > math.MaxUint32 { + return errors.New("-burn-factor-create-block exceeds MaxUint32") + } + + if c.Node.unconfirmedMaxDropletPrecision > math.MaxUint8 { + return errors.New("-max-decimals-unconfirmed exceeds MaxUint8") + } + if c.Node.createBlockMaxDropletPrecision > math.MaxUint8 { + return errors.New("-max-decimals-create-block exceeds MaxUint8") + } + + if c.Node.MaxLastBlocksCount > math.MaxUint64 { + return fmt.Errorf("-max-last-blocks-count exceeds math.MaxUint64") + } + + c.Node.UnconfirmedVerifyTxn.BurnFactor = uint32(c.Node.unconfirmedBurnFactor) + c.Node.UnconfirmedVerifyTxn.MaxTransactionSize = uint32(c.Node.maxUnconfirmedTransactionSize) + c.Node.UnconfirmedVerifyTxn.MaxDropletPrecision = uint8(c.Node.unconfirmedMaxDropletPrecision) + c.Node.CreateBlockVerifyTxn.BurnFactor = uint32(c.Node.createBlockBurnFactor) + c.Node.CreateBlockVerifyTxn.MaxTransactionSize = uint32(c.Node.createBlockMaxTransactionSize) + c.Node.CreateBlockVerifyTxn.MaxDropletPrecision = uint8(c.Node.createBlockMaxDropletPrecision) + c.Node.MaxBlockTransactionsSize = uint32(c.Node.maxBlockSize) + + if c.Node.UnconfirmedVerifyTxn.MaxTransactionSize < params.MinTransactionSize { + return fmt.Errorf("-max-txn-size-unconfirmed must be >= params.MinTransactionSize (%d)", params.MinTransactionSize) + } + if c.Node.UnconfirmedVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("-max-txn-size-unconfirmed must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + if c.Node.CreateBlockVerifyTxn.MaxTransactionSize < params.MinTransactionSize { + return fmt.Errorf("-max-txn-size-create-block must be >= params.MinTransactionSize (%d)", params.MinTransactionSize) + } + if c.Node.CreateBlockVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("-max-txn-size-create-block must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + + if c.Node.MaxBlockTransactionsSize < params.MinTransactionSize { + return fmt.Errorf("-max-block-size must be >= params.MinTransactionSize (%d)", params.MinTransactionSize) + } + if c.Node.MaxBlockTransactionsSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("-max-block-size must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + if c.Node.MaxBlockTransactionsSize < c.Node.UnconfirmedVerifyTxn.MaxTransactionSize { + return errors.New("-max-block-size must be >= -max-txn-size-unconfirmed") + } + if c.Node.MaxBlockTransactionsSize < c.Node.CreateBlockVerifyTxn.MaxTransactionSize { + return errors.New("-max-block-size must be >= -max-txn-size-create-block") + } + + if c.Node.UnconfirmedVerifyTxn.BurnFactor < params.MinBurnFactor { + return fmt.Errorf("-burn-factor-unconfirmed must be >= params.MinBurnFactor (%d)", params.MinBurnFactor) + } + if c.Node.UnconfirmedVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("-burn-factor-unconfirmed must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.Node.CreateBlockVerifyTxn.BurnFactor < params.MinBurnFactor { + return fmt.Errorf("-burn-factor-create-block must be >= params.MinBurnFactor (%d)", params.MinBurnFactor) + } + if c.Node.CreateBlockVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("-burn-factor-create-block must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.Node.UnconfirmedVerifyTxn.MaxDropletPrecision > droplet.Exponent { + return fmt.Errorf("-max-decimals-unconfirmed must be <= droplet.Exponent (%d)", droplet.Exponent) + } + if c.Node.UnconfirmedVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("-max-decimals-unconfirmed must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + if c.Node.CreateBlockVerifyTxn.MaxDropletPrecision > droplet.Exponent { + return fmt.Errorf("-max-decimals-create-block must be <= droplet.Exponent (%d)", droplet.Exponent) + } + if c.Node.CreateBlockVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("-max-decimals-create-block must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + return nil +} + +// buildAPISets builds the set of enable APIs by the following rules: +// * If EnableAll, all API sets are added +// * For each api set in EnabledAPISets, add +// * For each api set in DisabledAPISets, remove +func buildAPISets(c NodeConfig) (map[string]struct{}, error) { + enabledAPISets := strings.Split(c.EnabledAPISets, ",") + if err := validateAPISets("-enable-api-sets", enabledAPISets); err != nil { + return nil, err + } + + disabledAPISets := strings.Split(c.DisabledAPISets, ",") + if err := validateAPISets("-disable-api-sets", disabledAPISets); err != nil { + return nil, err + } + + apiSets := make(map[string]struct{}) + + allAPISets := []string{ + api.EndpointsRead, + api.EndpointsStatus, + api.EndpointsWallet, + api.EndpointsTransaction, + api.EndpointsNetCtrl, + api.EndpointsStorage, + // Do not include insecure or deprecated API sets, they must always + // be explicitly enabled through -enable-api-sets + } + + if c.EnableAllAPISets { + for _, s := range allAPISets { + apiSets[s] = struct{}{} + } + } + + // Add the enabled API sets + for _, k := range enabledAPISets { + apiSets[k] = struct{}{} + } + + // Remove the disabled API sets + for _, k := range disabledAPISets { + delete(apiSets, k) + } + + return apiSets, nil +} + +func validateAPISets(opt string, apiSets []string) error { + for _, k := range apiSets { + k = strings.ToUpper(strings.TrimSpace(k)) + switch k { + case api.EndpointsRead, + api.EndpointsStatus, + api.EndpointsTransaction, + api.EndpointsWallet, + api.EndpointsInsecureWalletSeed, + api.EndpointsNetCtrl, + api.EndpointsStorage: + case "": + continue + default: + return fmt.Errorf("Invalid value in %s: %q", opt, k) + } + } + return nil +} + +// RegisterFlags binds CLI flags to config values using Cobra +func (c *NodeConfig) RegisterFlags(cmd *cobra.Command) { + // cmd.Flags().BoolVar(&help, "help", false, "Show help") + cmd.Flags().BoolVar(&c.DisablePEX, "disable-pex", c.DisablePEX, "disable PEX peer discovery") + cmd.Flags().BoolVar(&c.DownloadPeerList, "download-peerlist", c.DownloadPeerList, "download a peers.txt from -peerlist-url") + cmd.Flags().StringVar(&c.PeerListURL, "peerlist-url", c.PeerListURL, "with -download-peerlist=true, download a peers.txt file from this url") + cmd.Flags().BoolVar(&c.DisableOutgoingConnections, "disable-outgoing", c.DisableOutgoingConnections, "Don't make outgoing connections") + cmd.Flags().BoolVar(&c.DisableIncomingConnections, "disable-incoming", c.DisableIncomingConnections, "Don't allow incoming connections") + cmd.Flags().BoolVar(&c.DisableNetworking, "disable-networking", c.DisableNetworking, "Disable all network activity") + cmd.Flags().BoolVar(&c.EnableGUI, "enable-gui", c.EnableGUI, "Enable GUI") + cmd.Flags().BoolVar(&c.DisableCSRF, "disable-csrf", c.DisableCSRF, "disable CSRF check") + cmd.Flags().BoolVar(&c.DisableHeaderCheck, "disable-header-check", c.DisableHeaderCheck, "disables the host, origin and referer header checks.") + cmd.Flags().BoolVar(&c.DisableCSP, "disable-csp", c.DisableCSP, "disable content-security-policy in http response") + cmd.Flags().StringVar(&c.Address, "address", c.Address, "IP Address to run application on. Leave empty to default to a public interface") + cmd.Flags().IntVar(&c.Port, "port", c.Port, "Port to run application on") + + cmd.Flags().BoolVar(&c.WebInterface, "web-interface", c.WebInterface, "enable the web interface") + cmd.Flags().IntVar(&c.WebInterfacePort, "web-interface-port", c.WebInterfacePort, "port to serve web interface on") + cmd.Flags().StringVar(&c.WebInterfaceAddr, "web-interface-addr", c.WebInterfaceAddr, "addr to serve web interface on") + cmd.Flags().StringVar(&c.WebInterfaceCert, "web-interface-cert", c.WebInterfaceCert, "skycoind.cert file for web interface HTTPS. If not provided, will autogenerate or use skycoind.cert in --data-dir") + cmd.Flags().StringVar(&c.WebInterfaceKey, "web-interface-key", c.WebInterfaceKey, "skycoind.key file for web interface HTTPS. If not provided, will autogenerate or use skycoind.key in --data-dir") + cmd.Flags().BoolVar(&c.WebInterfaceHTTPS, "web-interface-https", c.WebInterfaceHTTPS, "enable HTTPS for web interface") + cmd.Flags().StringVar(&c.HostWhitelist, "host-whitelist", c.HostWhitelist, "Hostnames to whitelist in the Host header check. Only applies when the web interface is bound to localhost.") + + allAPISets := []string{ + api.EndpointsRead, + api.EndpointsStatus, + api.EndpointsWallet, + api.EndpointsTransaction, + api.EndpointsNetCtrl, + api.EndpointsInsecureWalletSeed, + api.EndpointsStorage, + } + cmd.Flags().StringVar(&c.EnabledAPISets, "enable-api-sets", c.EnabledAPISets, fmt.Sprintf("enable API set. Options are %s. Multiple values should be separated by comma", strings.Join(allAPISets, ", "))) + cmd.Flags().StringVar(&c.DisabledAPISets, "disable-api-sets", c.DisabledAPISets, fmt.Sprintf("disable API set. Options are %s. Multiple values should be separated by comma", strings.Join(allAPISets, ", "))) + cmd.Flags().BoolVar(&c.EnableAllAPISets, "enable-all-api-sets", c.EnableAllAPISets, "enable all API sets, except for deprecated or insecure sets. This option is applied before -disable-api-sets.") + + cmd.Flags().StringVar(&c.WebInterfaceUsername, "web-interface-username", c.WebInterfaceUsername, "username for the web interface") + cmd.Flags().StringVar(&c.WebInterfacePassword, "web-interface-password", c.WebInterfacePassword, "password for the web interface") + cmd.Flags().BoolVar(&c.WebInterfacePlaintextAuth, "web-interface-plaintext-auth", c.WebInterfacePlaintextAuth, "allow web interface auth without https") + + cmd.Flags().BoolVar(&c.LaunchBrowser, "launch-browser", c.LaunchBrowser, "launch system default webbrowser at client startup") + cmd.Flags().StringVar(&c.DataDirectory, "data-dir", c.DataDirectory, "directory to store app data (defaults to ~/.skycoin)") + cmd.Flags().StringVar(&c.DBPath, "db-path", c.DBPath, "path of database file (defaults to ~/.skycoin/data.db)") + cmd.Flags().BoolVar(&c.DBReadOnly, "db-read-only", c.DBReadOnly, "open bolt db read-only") + cmd.Flags().BoolVar(&c.ProfileCPU, "profile-cpu", c.ProfileCPU, "enable cpu profiling") + cmd.Flags().StringVar(&c.ProfileCPUFile, "profile-cpu-file", c.ProfileCPUFile, "where to write the cpu profile file") + cmd.Flags().BoolVar(&c.HTTPProf, "http-prof", c.HTTPProf, "run the HTTP profiling interface") + cmd.Flags().StringVar(&c.HTTPProfHost, "http-prof-host", c.HTTPProfHost, "hostname to bind the HTTP profiling interface to") + cmd.Flags().StringVar(&c.LogLevel, "log-level", c.LogLevel, "Choices are: debug, info, warn, error, fatal, panic") + cmd.Flags().BoolVar(&c.ColorLog, "color-log", c.ColorLog, "Add terminal colors to log output") + cmd.Flags().BoolVar(&c.DisablePingPong, "no-ping-log", c.DisablePingPong, `disable "reply to ping" and "received pong" debug log messages`) + cmd.Flags().BoolVar(&c.LogToFile, "logtofile", c.LogToFile, "log to file") + cmd.Flags().StringVar(&c.GUIDirectory, "gui-dir", c.GUIDirectory, "static content directory for the HTML interface") + + cmd.Flags().BoolVar(&c.VerifyDB, "verify-db", c.VerifyDB, "check the database for corruption") + cmd.Flags().BoolVar(&c.ResetCorruptDB, "reset-corrupt-db", c.ResetCorruptDB, "reset the database if corrupted, and continue running instead of exiting") + + cmd.Flags().BoolVar(&c.DisableDefaultPeers, "disable-default-peers", c.DisableDefaultPeers, "disable the hardcoded default peers") + cmd.Flags().StringVar(&c.CustomPeersFile, "custom-peers-file", c.CustomPeersFile, "load custom peers from a newline separate list of ip:port in a file. Note that this is different from the peers.json file in the data directory") + + cmd.Flags().StringVar(&c.UserAgentRemark, "user-agent-remark", c.UserAgentRemark, "additional remark to include in the user agent sent over the wire protocol") + + cmd.Flags().Uint64Var(&c.maxUnconfirmedTransactionSize, "max-txn-size-unconfirmed", uint64(c.UnconfirmedVerifyTxn.MaxTransactionSize), "maximum size of an unconfirmed transaction") + cmd.Flags().Uint64Var(&c.unconfirmedBurnFactor, "burn-factor-unconfirmed", uint64(c.UnconfirmedVerifyTxn.BurnFactor), "coinhour burn factor applied to unconfirmed transactions") + cmd.Flags().Uint64Var(&c.unconfirmedMaxDropletPrecision, "max-decimals-unconfirmed", uint64(c.UnconfirmedVerifyTxn.MaxDropletPrecision), "max number of decimal places applied to unconfirmed transactions") + cmd.Flags().Uint64Var(&c.createBlockBurnFactor, "burn-factor-create-block", uint64(c.CreateBlockVerifyTxn.BurnFactor), "coinhour burn factor applied when creating blocks") + cmd.Flags().Uint64Var(&c.createBlockMaxTransactionSize, "max-txn-size-create-block", uint64(c.CreateBlockVerifyTxn.MaxTransactionSize), "maximum size of a transaction applied when creating blocks") + cmd.Flags().Uint64Var(&c.createBlockMaxDropletPrecision, "max-decimals-create-block", uint64(c.CreateBlockVerifyTxn.MaxDropletPrecision), "max number of decimal places applied when creating blocks") + cmd.Flags().Uint64Var(&c.maxBlockSize, "max-block-size", uint64(c.MaxBlockTransactionsSize), "maximum total size of transactions in a block") + cmd.Flags().Uint64Var(&c.MaxLastBlocksCount, "max-last-blocks-count", c.MaxLastBlocksCount, "Maximum number of blocks to response for API /api/v1/last_blocks") + + cmd.Flags().BoolVar(&c.RunBlockPublisher, "block-publisher", c.RunBlockPublisher, "run the daemon as a block publisher") + cmd.Flags().StringVar(&c.BlockchainPubkeyStr, "blockchain-public-key", c.BlockchainPubkeyStr, "public key of the blockchain") + cmd.Flags().StringVar(&c.BlockchainSeckeyStr, "blockchain-secret-key", c.BlockchainSeckeyStr, "secret key of the blockchain") + + cmd.Flags().StringVar(&c.GenesisAddressStr, "genesis-address", c.GenesisAddressStr, "genesis address") + cmd.Flags().StringVar(&c.GenesisSignatureStr, "genesis-signature", c.GenesisSignatureStr, "genesis block signature") + cmd.Flags().Uint64Var(&c.GenesisTimestamp, "genesis-timestamp", c.GenesisTimestamp, "genesis block timestamp") + + cmd.Flags().StringVar(&c.WalletDirectory, "wallet-dir", c.WalletDirectory, "location of the wallet files. Defaults to ~/.skycoin/wallet/") + cmd.Flags().StringVar(&c.KVStorageDirectory, "storage-dir", c.KVStorageDirectory, "location of the storage data files. Defaults to ~/.skycoin/data/") + cmd.Flags().IntVar(&c.MaxConnections, "max-connections", c.MaxConnections, "Maximum number of total connections allowed") + cmd.Flags().IntVar(&c.MaxOutgoingConnections, "max-outgoing-connections", c.MaxOutgoingConnections, "Maximum number of outgoing connections allowed") + cmd.Flags().IntVar(&c.MaxIncomingConnections, "max-incoming-connections", c.MaxIncomingConnections, "Maximum number of incoming connections allowed") + cmd.Flags().IntVar(&c.MaxDefaultPeerOutgoingConnections, "max-default-peer-outgoing-connections", c.MaxDefaultPeerOutgoingConnections, "The maximum default peer outgoing connections allowed") + cmd.Flags().IntVar(&c.PeerlistSize, "peerlist-size", c.PeerlistSize, "Max number of peers to track in peerlist") + cmd.Flags().DurationVar(&c.OutgoingConnectionsRate, "connection-rate", c.OutgoingConnectionsRate, "How often to make an outgoing connection") + cmd.Flags().IntVar(&c.MaxOutgoingMessageLength, "max-out-msg-len", c.MaxOutgoingMessageLength, "Maximum length of outgoing wire messages") + cmd.Flags().IntVar(&c.MaxIncomingMessageLength, "max-in-msg-len", c.MaxIncomingMessageLength, "Maximum length of incoming wire messages") + cmd.Flags().BoolVar(&c.LocalhostOnly, "localhost-only", c.LocalhostOnly, "Run on localhost and only connect to localhost peers") + cmd.Flags().StringVar(&c.WalletCryptoType, "wallet-crypto-type", c.WalletCryptoType, "wallet crypto type. Can be sha256-xor or scrypt-chacha20poly1305") + cmd.Flags().BoolVar(&c.Version, "version", false, "show node version") +} + +func (c *NodeConfig) applyConfigMode(configMode string) { + if runtime.GOOS == "windows" { + c.ColorLog = false + } + switch configMode { + case "": + case "STANDALONE_CLIENT": + c.EnableAllAPISets = true + c.EnabledAPISets = api.EndpointsInsecureWalletSeed + c.EnableGUI = true + c.LaunchBrowser = true + c.DisableCSRF = false + c.DisableHeaderCheck = false + c.DisableCSP = false + c.DownloadPeerList = true + c.WebInterface = true + c.LogToFile = false + c.ResetCorruptDB = true + c.WebInterfacePort = 0 // randomize web interface port + default: + panic("Invalid ConfigMode") + } +} + +func panicIfError(err error, msg string, args ...interface{}) { //nolint:unparam + if err != nil { + log.Panicf(msg+": %v", append(args, err)...) + } +} + +func replaceHome(path, home string) string { + return strings.Replace(path, "$HOME", home, 1) +} diff --git a/vendor/github.com/skycoin/skycoin/src/skycoin/db_check.go b/vendor/github.com/skycoin/skycoin/src/skycoin/db_check.go new file mode 100644 index 0000000000..4fb33daf22 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/skycoin/db_check.go @@ -0,0 +1,165 @@ +package skycoin + +import ( + "fmt" + + "github.com/blang/semver" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +type dbAction uint + +const ( + doNothing dbAction = iota + doCheckDB + doResetCorruptDB +) + +// dbCheckConfig contains the parameters for verifying db +type dbCheckConfig struct { + // ForceVerify force verify DB + ForceVerify bool + // ResetCorruptDB reset the DB if it is corrupted + ResetCorruptDB bool + // AppVersion is the current wallet version + AppVersion *semver.Version + // DBCheckpointVersion is the check point db version + DBCheckpointVersion *semver.Version +} + +//go:generate mockery -name dbCheckCorruptResetter -case underscore -inpkg -testonly +type dbCheckCorruptResetter interface { + CheckDatabase(db *dbutil.DB) error + ResetCorruptDB(db *dbutil.DB) (*dbutil.DB, error) + GetDBVersion(db *dbutil.DB) (*semver.Version, error) + SetDBVersion(db *dbutil.DB, v *semver.Version) error +} + +type dbVerify struct { + blockchainPubkey cipher.PubKey + logger *logging.Logger + quit chan struct{} +} + +func (dv dbVerify) CheckDatabase(db *dbutil.DB) error { + if err := visor.CheckDatabase(db, dv.blockchainPubkey, dv.quit); err != nil { + if err != visor.ErrVerifyStopped { + dv.logger.WithError(err).Error("visor.CheckDatabase failed") + } + return err + } + return nil +} + +func (dv *dbVerify) ResetCorruptDB(db *dbutil.DB) (*dbutil.DB, error) { + dv.logger.Info("Checking database and resetting if corrupted") + newDB, err := visor.ResetCorruptDB(db, dv.blockchainPubkey, dv.quit) + if err != nil { + if err != visor.ErrVerifyStopped { + dv.logger.WithError(err).Error("visor.ResetCorruptDB failed") + } + return nil, err + } + + return newDB, nil +} + +func (dv *dbVerify) SetDBVersion(db *dbutil.DB, v *semver.Version) error { + if err := visor.SetDBVersion(db, *v); err != nil { + if err != visor.ErrVerifyStopped { + dv.logger.WithError(err).Error("visor.ResetCorruptDB failed") + } + return err + } + return nil +} + +func (dv dbVerify) GetDBVersion(db *dbutil.DB) (*semver.Version, error) { + dbVersion, err := visor.GetDBVersion(db) + if err != nil { + dv.logger.WithError(err).Error("visor.GetDBVersion failed") + return nil, err + } + + if dbVersion == nil { + dv.logger.Info("DB version not found in DB") + } else { + dv.logger.Infof("DB version: %s", dbVersion) + } + return dbVersion, nil +} + +func checkAndUpdateDB(db *dbutil.DB, c dbCheckConfig, dv dbCheckCorruptResetter) (*dbutil.DB, error) { + dbVersion, err := dv.GetDBVersion(db) + if err != nil { + return nil, err + } + + action, err := checkDB(c, dbVersion) + if err != nil { + return nil, err + } + + switch action { + case doCheckDB: + if err := dv.CheckDatabase(db); err != nil { + return nil, err + } + case doResetCorruptDB: + // Check the database integrity and recreate it if necessary + newDB, err := dv.ResetCorruptDB(db) + if err != nil { + return nil, err + } + db = newDB + } + + // DB version won't be downgraded + if !db.IsReadOnly() { + if err := dv.SetDBVersion(db, c.AppVersion); err != nil { + return nil, err + } + } + + return db, nil +} + +// checkDB checks whether need to verify or reset the DB version +func checkDB(c dbCheckConfig, dbVersion *semver.Version) (dbAction, error) { + // If the saved DB version is higher than the app version, abort. + // Otherwise DB corruption could occur. + if dbVersion != nil && dbVersion.GT(*c.AppVersion) { + return doNothing, fmt.Errorf("Cannot use newer DB version=%v with older software version=%v", dbVersion, c.AppVersion) + } + + // Verify the DB if the version detection says to, or if it was requested on the command line + if shouldVerifyDB(c.AppVersion, dbVersion, c.DBCheckpointVersion) || c.ForceVerify { + if c.ResetCorruptDB { + return doResetCorruptDB, nil + } + + return doCheckDB, nil + } + + return doNothing, nil +} + +func shouldVerifyDB(appVersion, dbVersion, checkpointVersion *semver.Version) bool { + // If the dbVersion is not set, verify + if dbVersion == nil { + return true + } + + // If the dbVersion is less than the verification checkpoint version + // and the appVersion is greater than or equal to the checkpoint version, + // verify + if dbVersion.LT(*checkpointVersion) && appVersion.GTE(*checkpointVersion) { + return true + } + + return false +} diff --git a/vendor/github.com/skycoin/skycoin/src/skycoin/skycoin.go b/vendor/github.com/skycoin/skycoin/src/skycoin/skycoin.go new file mode 100644 index 0000000000..bce47c7040 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/skycoin/skycoin.go @@ -0,0 +1,617 @@ +/* +Package skycoin implements the main daemon cmd's configuration and setup +*/ +package skycoin + +import ( + "errors" + "fmt" + "io/ioutil" + "log" + "net/http" + "os" + "path/filepath" + "runtime" + "runtime/pprof" + "sync" + "time" + + "github.com/blang/semver" + "github.com/toqueteos/webbrowser" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/crypto" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/kvstorage" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/readable" + "github.com/skycoin/skycoin/src/util/apputil" + "github.com/skycoin/skycoin/src/util/certutil" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/wallet" +) + +var ( + // DBVerifyCheckpointVersion is a checkpoint for determining if DB verification should be run. + // Any DB upgrading from less than this version to equal or higher than this version will be forced to verify. + // Update this version checkpoint if a newer version requires a new verification run. + DBVerifyCheckpointVersion = "0.27.1" + dbVerifyCheckpointVersionParsed semver.Version +) + +// Coin represents a fiber coin instance +type Coin struct { + config Config + logger *logging.Logger +} + +// Run starts the node +func (c *Coin) Run() error { + var db *dbutil.DB + var w *wallet.Service + var v *visor.Visor + var d *daemon.Daemon + var s *kvstorage.Manager + var gw *api.Gateway + var webInterface *api.Server + var retErr error + errC := make(chan error, 10) + + if c.config.Node.Version { + fmt.Println(c.config.Build.Version) + return nil + } + + logLevel, err := logging.LevelFromString(c.config.Node.LogLevel) + if err != nil { + err = fmt.Errorf("Invalid -log-level: %v", err) + c.logger.Error(err) + return err + } + + logging.SetLevel(logLevel) + + if c.config.Node.ColorLog { + logging.EnableColors() + } else { + logging.DisableColors() + } + + var logFile *os.File + if c.config.Node.LogToFile { + var err error + logFile, err = c.initLogFile() + if err != nil { + c.logger.Error(err) + return err + } + } + + var fullAddress string + scheme := "http" + if c.config.Node.WebInterfaceHTTPS { + scheme = "https" + } + host := fmt.Sprintf("%s:%d", c.config.Node.WebInterfaceAddr, c.config.Node.WebInterfacePort) + + if c.config.Node.ProfileCPU { + f, err := os.Create(c.config.Node.ProfileCPUFile) + if err != nil { + c.logger.Error(err) + return err + } + + if err := pprof.StartCPUProfile(f); err != nil { + c.logger.Error(err) + return err + } + defer pprof.StopCPUProfile() + } + + if c.config.Node.HTTPProf { + go func() { + if err := http.ListenAndServe(c.config.Node.HTTPProfHost, nil); err != nil { + c.logger.WithError(err).Errorf("Listen on HTTP profiling interface %s failed", c.config.Node.HTTPProfHost) + } + }() + } + + var wg sync.WaitGroup + + quit := make(chan struct{}) + + // Catch SIGINT (CTRL-C) (closes the quit channel) + go apputil.CatchInterrupt(quit) + + // Catch SIGUSR1 (prints runtime stack to stdout) + go apputil.CatchDebug() + + // Parse the current app version + appVersion, err := c.config.Build.Semver() + if err != nil { + c.logger.WithError(err).Errorf("Version %s is not a valid semver", c.config.Build.Version) + return err + } + + c.logger.Infof("App version: %s", appVersion) + c.logger.Infof("OS: %s", runtime.GOOS) + c.logger.Infof("Arch: %s", runtime.GOARCH) + + wconf := c.ConfigureWallet() + dconf := c.ConfigureDaemon() + vconf := c.ConfigureVisor() + sconf := c.ConfigureStorage() + + // Open the database + c.logger.Infof("Opening database %s", c.config.Node.DBPath) + db, err = visor.OpenDB(c.config.Node.DBPath, c.config.Node.DBReadOnly) + if err != nil { + c.logger.Errorf("Database failed to open: %v. Is another skycoin instance running?", err) + return err + } + + defer func() { + if db != nil { + c.logger.Info("Closing database") + if err := db.Close(); err != nil { + c.logger.WithError(err).Error("Failed to close DB") + } + } + + c.logger.Info("Goodbye") + + if logFile != nil { + if err := logFile.Close(); err != nil { + fmt.Println("Failed to close log file") + } + } + }() + + cf := dbCheckConfig{ + ForceVerify: c.config.Node.VerifyDB, + ResetCorruptDB: c.config.Node.ResetCorruptDB, + AppVersion: appVersion, + DBCheckpointVersion: &dbVerifyCheckpointVersionParsed, + } + + dv := dbVerify{ + blockchainPubkey: c.config.Node.blockchainPubkey, + logger: c.logger, + quit: quit, + } + + db, err = checkAndUpdateDB(db, cf, &dv) + if err != nil { + return err + } + + c.logger.Infof("Coinhour burn factor for user transactions is %d", params.UserVerifyTxn.BurnFactor) + c.logger.Infof("Max transaction size for user transactions is %d", params.UserVerifyTxn.MaxTransactionSize) + c.logger.Infof("Max decimals for user transactions is %d", params.UserVerifyTxn.MaxDropletPrecision) + + c.logger.Info("wallet.NewService") + w, err = wallet.NewService(wconf) + if err != nil { + c.logger.WithError(err).Error("wallet.NewService failed") + return err + } + + c.logger.Info("visor.New") + v, err = visor.New(vconf, db, w) + if err != nil { + c.logger.WithError(err).Error("visor.New failed") + return err + } + + c.logger.Info("daemon.New") + d, err = daemon.New(dconf, v) + if err != nil { + c.logger.WithError(err).Error("daemon.New failed") + return err + } + + c.logger.Info("kvstorage.NewManager") + s, err = kvstorage.NewManager(sconf) + if err != nil { + c.logger.WithError(err).Error("kvstorage.NewManager failed") + return err + } + + c.logger.Info("api.NewGateway") + gw = api.NewGateway(d, v, w, s) + + if c.config.Node.WebInterface { + webInterface, err = c.createGUI(gw, host) + if err != nil { + c.logger.WithError(err).Error("c.createGUI failed") + return err + } + + fullAddress = fmt.Sprintf("%s://%s", scheme, webInterface.Addr()) + c.logger.Critical().Infof("Full address: %s", fullAddress) + } + + c.logger.Info("visor.Init") + if err := v.Init(); err != nil { + c.logger.WithError(err).Error("visor.Init failed") + return err + } + + wg.Add(1) + go func() { + defer wg.Done() + + c.logger.Info("daemon.Run") + if err := d.Run(); err != nil { + c.logger.WithError(err).Error("daemon.Run failed") + errC <- err + } + }() + + if c.config.Node.WebInterface { + cancelLaunchBrowser := make(chan struct{}) + + wg.Add(1) + go func() { + defer wg.Done() + + c.logger.Info("webInterface.Serve") + if err := webInterface.Serve(); err != nil { + close(cancelLaunchBrowser) + c.logger.WithError(err).Error("webInterface.Serve failed") + errC <- err + } + }() + + if c.config.Node.LaunchBrowser { + go func() { + select { + case <-cancelLaunchBrowser: + c.logger.Warning("Browser launching canceled") + + // Wait a moment just to make sure the http interface is up + case <-time.After(time.Millisecond * 100): + c.logger.Infof("Launching System Browser with %s", fullAddress) + if err := webbrowser.Open(fullAddress); err != nil { + c.logger.WithError(err).Error("webbrowser.Open failed") + } + } + }() + } + } + + select { + case <-quit: + case retErr = <-errC: + c.logger.WithError(err).Error("Received error from errC (something prior has failed)") + } + + c.logger.Info("Shutting down...") + + if webInterface != nil { + c.logger.Info("Closing web interface") + webInterface.Shutdown() + } + + c.logger.Info("Closing daemon") + d.Shutdown() + + c.logger.Info("Waiting for goroutines to finish") + wg.Wait() + + return retErr +} + +// NewCoin returns a new fiber coin instance +func NewCoin(config Config, logger *logging.Logger) *Coin { + return &Coin{ + config: config, + logger: logger, + } +} + +func (c *Coin) initLogFile() (*os.File, error) { + logDir := filepath.Join(c.config.Node.DataDirectory, "logs") + if err := createDirIfNotExist(logDir); err != nil { + c.logger.WithError(err).Errorf("createDirIfNotExist(%s) failed", logDir) + return nil, fmt.Errorf("createDirIfNotExist(%s) failed: %v", logDir, err) + } + + // open log file + tf := "2006-01-02-030405" + logfile := filepath.Join(logDir, fmt.Sprintf("%s-v%s.log", time.Now().Format(tf), c.config.Build.Version)) + + f, err := os.OpenFile(logfile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600) + if err != nil { + c.logger.WithError(err).Errorf("os.OpenFile(%s) failed", logfile) + return nil, err + } + + hook := logging.NewWriteHook(f) + logging.AddHook(hook) + + return f, nil +} + +// ConfigureVisor sets the visor config values +func (c *Coin) ConfigureVisor() visor.Config { + vc := visor.NewConfig() + + vc.Distribution = params.MainNetDistribution + + vc.IsBlockPublisher = c.config.Node.RunBlockPublisher + vc.Arbitrating = c.config.Node.RunBlockPublisher + + vc.BlockchainPubkey = c.config.Node.blockchainPubkey + vc.BlockchainSeckey = c.config.Node.blockchainSeckey + + vc.UnconfirmedVerifyTxn = c.config.Node.UnconfirmedVerifyTxn + vc.CreateBlockVerifyTxn = c.config.Node.CreateBlockVerifyTxn + vc.MaxBlockTransactionsSize = c.config.Node.MaxBlockTransactionsSize + + vc.GenesisAddress = c.config.Node.genesisAddress + vc.GenesisSignature = c.config.Node.genesisSignature + vc.GenesisTimestamp = c.config.Node.GenesisTimestamp + vc.GenesisCoinVolume = c.config.Node.GenesisCoinVolume + + return vc +} + +// ConfigureWallet sets the wallet config values +func (c *Coin) ConfigureWallet() wallet.Config { + wc := wallet.NewConfig() + + wc.WalletDir = c.config.Node.WalletDirectory + _, wc.EnableWalletAPI = c.config.Node.enabledAPISets[api.EndpointsWallet] + _, wc.EnableSeedAPI = c.config.Node.enabledAPISets[api.EndpointsInsecureWalletSeed] + + // Initialize wallet default crypto type + cryptoType, err := crypto.CryptoTypeFromString(c.config.Node.WalletCryptoType) + if err != nil { + log.Panic(err) + } + + wc.CryptoType = cryptoType + + bc := c.config.Node.Fiber.Bip44Coin + wc.Bip44Coin = &bc + + return wc +} + +// ConfigureStorage sets the key-value storage config values +func (c *Coin) ConfigureStorage() kvstorage.Config { + sc := kvstorage.NewConfig() + + sc.StorageDir = c.config.Node.KVStorageDirectory + _, sc.EnableStorageAPI = c.config.Node.enabledAPISets[api.EndpointsStorage] + sc.EnabledStorages = c.config.Node.EnabledStorageTypes + + return sc +} + +// ConfigureDaemon sets the daemon config values +func (c *Coin) ConfigureDaemon() daemon.Config { + dc := daemon.NewConfig() + + dc.Pool.DefaultConnections = c.config.Node.DefaultConnections + dc.Pool.MaxConnections = c.config.Node.MaxConnections + dc.Pool.MaxOutgoingConnections = c.config.Node.MaxOutgoingConnections + dc.Pool.MaxDefaultPeerOutgoingConnections = c.config.Node.MaxDefaultPeerOutgoingConnections + dc.Pool.MaxIncomingConnections = c.config.Node.MaxIncomingConnections + dc.Pool.MaxIncomingMessageLength = c.config.Node.MaxIncomingMessageLength + dc.Pool.MaxOutgoingMessageLength = c.config.Node.MaxOutgoingMessageLength + + dc.Pex.DataDirectory = c.config.Node.DataDirectory + dc.Pex.Disabled = c.config.Node.DisablePEX + dc.Pex.NetworkDisabled = c.config.Node.DisableNetworking + dc.Pex.Max = c.config.Node.PeerlistSize + dc.Pex.DownloadPeerList = c.config.Node.DownloadPeerList + dc.Pex.PeerListURL = c.config.Node.PeerListURL + dc.Pex.DisableTrustedPeers = c.config.Node.DisableDefaultPeers + dc.Pex.CustomPeersFile = c.config.Node.CustomPeersFile + dc.Pex.DefaultConnections = c.config.Node.DefaultConnections + + dc.Daemon.MaxOutgoingMessageLength = uint64(c.config.Node.MaxOutgoingMessageLength) + dc.Daemon.MaxIncomingMessageLength = uint64(c.config.Node.MaxIncomingMessageLength) + dc.Daemon.MaxBlockTransactionsSize = c.config.Node.MaxBlockTransactionsSize + dc.Daemon.MaxLastBlocksCount = c.config.Node.MaxLastBlocksCount + dc.Daemon.DefaultConnections = c.config.Node.DefaultConnections + dc.Daemon.DisableOutgoingConnections = c.config.Node.DisableOutgoingConnections + dc.Daemon.DisableIncomingConnections = c.config.Node.DisableIncomingConnections + dc.Daemon.DisableNetworking = c.config.Node.DisableNetworking + dc.Daemon.Port = c.config.Node.Port + dc.Daemon.Address = c.config.Node.Address + dc.Daemon.LocalhostOnly = c.config.Node.LocalhostOnly + dc.Daemon.MaxConnections = c.config.Node.MaxConnections + dc.Daemon.MaxOutgoingConnections = c.config.Node.MaxOutgoingConnections + dc.Daemon.DataDirectory = c.config.Node.DataDirectory + dc.Daemon.LogPings = !c.config.Node.DisablePingPong + dc.Daemon.BlockchainPubkey = c.config.Node.blockchainPubkey + dc.Daemon.GenesisHash = c.config.Node.genesisHash + dc.Daemon.UserAgent = c.config.Node.userAgent + dc.Daemon.UnconfirmedVerifyTxn = c.config.Node.UnconfirmedVerifyTxn + + if c.config.Node.OutgoingConnectionsRate == 0 { + c.config.Node.OutgoingConnectionsRate = time.Millisecond + } + dc.Daemon.OutgoingRate = c.config.Node.OutgoingConnectionsRate + + return dc +} + +func (c *Coin) createGUI(gw *api.Gateway, host string) (*api.Server, error) { + config := api.Config{ + StaticDir: c.config.Node.GUIDirectory, + DisableCSRF: c.config.Node.DisableCSRF, + DisableHeaderCheck: c.config.Node.DisableHeaderCheck, + DisableCSP: c.config.Node.DisableCSP, + EnableGUI: c.config.Node.EnableGUI, + ReadTimeout: c.config.Node.HTTPReadTimeout, + WriteTimeout: c.config.Node.HTTPWriteTimeout, + IdleTimeout: c.config.Node.HTTPIdleTimeout, + EnabledAPISets: c.config.Node.enabledAPISets, + HostWhitelist: c.config.Node.hostWhitelist, + Health: api.HealthConfig{ + BuildInfo: readable.BuildInfo{ + Version: c.config.Build.Version, + Commit: c.config.Build.Commit, + Branch: c.config.Build.Branch, + }, + Fiber: c.config.Node.Fiber, + DaemonUserAgent: c.config.Node.userAgent, + BlockPublisher: c.config.Node.RunBlockPublisher, + }, + Username: c.config.Node.WebInterfaceUsername, + Password: c.config.Node.WebInterfacePassword, + } + + var s *api.Server + if c.config.Node.WebInterfaceHTTPS { + // Verify cert/key parameters, and if neither exist, create them + exists, err := checkCertFiles(c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey) + if err != nil { + c.logger.WithError(err).Error("checkCertFiles failed") + return nil, err + } + + if !exists { + c.logger.Infof("Autogenerating HTTP certificate and key files %s, %s", c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey) + if err := createCertFiles(c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey); err != nil { + c.logger.WithError(err).Error("createCertFiles failed") + return nil, err + } + + c.logger.Infof("Created cert file %s", c.config.Node.WebInterfaceCert) + c.logger.Infof("Created key file %s", c.config.Node.WebInterfaceKey) + } + + s, err = api.CreateHTTPS(host, config, gw, c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey) + if err != nil { + c.logger.WithError(err).Error("Failed to start web failed") + return nil, err + } + } else { + var err error + s, err = api.Create(host, config, gw) + if err != nil { + c.logger.WithError(err).Error("Failed to start web failed") + return nil, err + } + } + + return s, nil +} + +// checkCertFiles returns true if both cert and key files exist, false if neither exist, +// or returns an error if only one does not exist +func checkCertFiles(cert, key string) (bool, error) { + doesFileExist := func(f string) (bool, error) { + if _, err := os.Stat(f); err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err + } + return true, nil + } + + certExists, err := doesFileExist(cert) + if err != nil { + return false, err + } + + keyExists, err := doesFileExist(key) + if err != nil { + return false, err + } + + switch { + case certExists && keyExists: + return true, nil + case !certExists && !keyExists: + return false, nil + case certExists && !keyExists: + return false, fmt.Errorf("certfile %s exists but keyfile %s does not", cert, key) + case !certExists && keyExists: + return false, fmt.Errorf("keyfile %s exists but certfile %s does not", key, cert) + default: + log.Panic("unreachable code") + return false, errors.New("unreachable code") + } +} + +func createCertFiles(certFile, keyFile string) error { + org := "skycoin daemon autogenerated cert" + validUntil := time.Now().Add(10 * 365 * 24 * time.Hour) + cert, key, err := certutil.NewTLSCertPair(org, validUntil, nil) + if err != nil { + return err + } + + if err := ioutil.WriteFile(certFile, cert, 0600); err != nil { + return err + } + if err := ioutil.WriteFile(keyFile, key, 0600); err != nil { + os.Remove(certFile) + return err + } + + return nil +} + +// ParseConfig prepare the config +func (c *Coin) ParseConfig() error { + return c.config.postProcess() +} + +// InitTransaction creates the genesis transaction +func InitTransaction(uxID string, genesisSecKey cipher.SecKey, dist params.Distribution) coin.Transaction { + dist.MustValidate() + + var txn coin.Transaction + + output := cipher.MustSHA256FromHex(uxID) + if err := txn.PushInput(output); err != nil { + log.Panic(err) + } + + for _, addr := range dist.AddressesDecoded() { + if err := txn.PushOutput(addr, dist.AddressInitialBalance()*droplet.Multiplier, 1); err != nil { + log.Panic(err) + } + } + + seckeys := make([]cipher.SecKey, 1) + seckey := genesisSecKey.Hex() + seckeys[0] = cipher.MustSecKeyFromHex(seckey) + txn.SignInputs(seckeys) + + if err := txn.UpdateHeader(); err != nil { + log.Panic(err) + } + + if err := txn.Verify(); err != nil { + log.Panic(err) + } + + log.Printf("signature= %s", txn.Sigs[0].Hex()) + return txn +} + +func createDirIfNotExist(dir string) error { + if _, err := os.Stat(dir); !os.IsNotExist(err) { + return nil + } + + return os.Mkdir(dir, 0750) +} + +func init() { + dbVerifyCheckpointVersionParsed = semver.MustParse(DBVerifyCheckpointVersion) +} diff --git a/vendor/github.com/skycoin/skycoin/src/transaction/choose.go b/vendor/github.com/skycoin/skycoin/src/transaction/choose.go new file mode 100644 index 0000000000..544569db3d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/transaction/choose.go @@ -0,0 +1,280 @@ +package transaction + +import ( + "bytes" + "errors" + "sort" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/util/fee" +) + +var ( + // ErrInsufficientBalance is returned if a wallet does not have enough balance for a spend + ErrInsufficientBalance = NewError(errors.New("balance is not sufficient")) + // ErrInsufficientHours is returned if a wallet does not have enough hours for a spend with requested hours + ErrInsufficientHours = NewError(errors.New("hours are not sufficient")) + // ErrZeroSpend is returned if a transaction is trying to spend 0 coins + ErrZeroSpend = NewError(errors.New("zero spend amount")) + // ErrNoUnspents is returned if a Create is called with no unspent outputs + ErrNoUnspents = NewError(errors.New("no unspents to spend")) +) + +// UxBalance is an intermediate representation of a UxOut for sorting and spend choosing +type UxBalance struct { + Hash cipher.SHA256 + BkSeq uint64 + Time uint64 + Address cipher.Address + Coins uint64 + InitialHours uint64 + Hours uint64 + SrcTransaction cipher.SHA256 +} + +// NewUxBalances converts coin.UxArray to []UxBalance. headTime is required to calculate coin hours. +func NewUxBalances(uxa coin.UxArray, headTime uint64) ([]UxBalance, error) { + uxb := make([]UxBalance, len(uxa)) + for i, ux := range uxa { + b, err := NewUxBalance(headTime, ux) + if err != nil { + return nil, err + } + uxb[i] = b + } + + return uxb, nil +} + +// NewUxBalance converts coin.UxOut to UxBalance. headTime is required to calculate coin hours. +func NewUxBalance(headTime uint64, ux coin.UxOut) (UxBalance, error) { + hours, err := ux.CoinHours(headTime) + if err != nil { + return UxBalance{}, err + } + + return UxBalance{ + Hash: ux.Hash(), + BkSeq: ux.Head.BkSeq, + Time: ux.Head.Time, + Address: ux.Body.Address, + Coins: ux.Body.Coins, + InitialHours: ux.Body.Hours, + Hours: hours, + SrcTransaction: ux.Body.SrcTransaction, + }, nil +} + +func uxBalancesSub(a, b []UxBalance) []UxBalance { + var x []UxBalance + + bMap := make(map[cipher.SHA256]struct{}, len(b)) + for _, i := range b { + bMap[i.Hash] = struct{}{} + } + + for _, i := range a { + if _, ok := bMap[i.Hash]; !ok { + x = append(x, i) + } + } + + return x +} + +// ChooseSpendsMinimizeUxOuts chooses uxout spends to satisfy an amount, using the least number of uxouts +// +// -- PRO: Allows more frequent spending, less waiting for confirmations, useful for exchanges. +// -- PRO: When transaction is volume is higher, transactions are prioritized by fee/size. Minimizing uxouts minimizes size. +// -- CON: Would make the unconfirmed pool grow larger. +// +// Users with high transaction frequency will want to use this so that they will not need to wait as frequently +// for unconfirmed spends to complete before sending more. +// Alternatively, or in addition to this, they should batch sends into single transactions. +func ChooseSpendsMinimizeUxOuts(uxa []UxBalance, coins, hours uint64) ([]UxBalance, error) { + return ChooseSpends(uxa, coins, hours, sortSpendsCoinsHighToLow) +} + +// sortSpendsCoinsHighToLow sorts uxout spends with highest balance to lowest +func sortSpendsCoinsHighToLow(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByCoins(uxa, func(a, b uint64) bool { + return a > b + })) +} + +// ChooseSpendsMaximizeUxOuts chooses uxout spends to satisfy an amount, using the most number of uxouts +// See the pros and cons of ChooseSpendsMinimizeUxOuts. +// This should be the default mode, because this keeps the unconfirmed pool smaller which will allow +// the network to scale better. +func ChooseSpendsMaximizeUxOuts(uxa []UxBalance, coins, hours uint64) ([]UxBalance, error) { + return ChooseSpends(uxa, coins, hours, sortSpendsCoinsLowToHigh) +} + +// sortSpendsCoinsLowToHigh sorts uxout spends with lowest balance to highest +func sortSpendsCoinsLowToHigh(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByCoins(uxa, func(a, b uint64) bool { + return a < b + })) +} + +// sortSpendsHoursLowToHigh sorts uxout spends with lowest hours to highest +func sortSpendsHoursLowToHigh(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByHours(uxa, func(a, b uint64) bool { + return a < b + })) +} + +func makeCmpUxOutByCoins(uxa []UxBalance, coinsCmp func(a, b uint64) bool) func(i, j int) bool { + // Sort by: + // coins highest or lowest depending on coinsCmp + // hours lowest + // oldest first + // tie break with hash comparison + return func(i, j int) bool { + a := uxa[i] + b := uxa[j] + + if a.Coins == b.Coins { + if a.Hours == b.Hours { + if a.BkSeq == b.BkSeq { + return cmpUxBalanceByUxID(a, b) + } + return a.BkSeq < b.BkSeq + } + return a.Hours < b.Hours + } + return coinsCmp(a.Coins, b.Coins) + } +} + +func makeCmpUxOutByHours(uxa []UxBalance, hoursCmp func(a, b uint64) bool) func(i, j int) bool { + // Sort by: + // hours highest or lowest depending on hoursCmp + // coins lowest + // oldest first + // tie break with hash comparison + return func(i, j int) bool { + a := uxa[i] + b := uxa[j] + + if a.Hours == b.Hours { + if a.Coins == b.Coins { + if a.BkSeq == b.BkSeq { + return cmpUxBalanceByUxID(a, b) + } + return a.BkSeq < b.BkSeq + } + return a.Coins < b.Coins + } + return hoursCmp(a.Hours, b.Hours) + } +} + +func cmpUxBalanceByUxID(a, b UxBalance) bool { + cmp := bytes.Compare(a.Hash[:], b.Hash[:]) + if cmp == 0 { + logger.Panic("Duplicate UxOut when sorting") + } + return cmp < 0 +} + +// ChooseSpends chooses uxouts from a list of uxouts. +// It first chooses the uxout with the most number of coins that has nonzero coinhours. +// It then chooses uxouts with zero coinhours, ordered by sortStrategy +// It then chooses remaining uxouts with nonzero coinhours, ordered by sortStrategy +func ChooseSpends(uxa []UxBalance, coins, hours uint64, sortStrategy func([]UxBalance)) ([]UxBalance, error) { + if coins == 0 { + return nil, ErrZeroSpend + } + + if len(uxa) == 0 { + return nil, ErrNoUnspents + } + + for _, ux := range uxa { + if ux.Coins == 0 { + logger.Panic("UxOut coins are 0, can't spend") + return nil, errors.New("UxOut coins are 0, can't spend") + } + } + + // Split UxBalances into those with and without hours + var nonzero, zero []UxBalance + for _, ux := range uxa { + if ux.Hours == 0 { + zero = append(zero, ux) + } else { + nonzero = append(nonzero, ux) + } + } + + // Abort if there are no uxouts with non-zero coinhours, they can't be spent yet + if len(nonzero) == 0 { + return nil, fee.ErrTxnNoFee + } + + // Sort uxouts with hours lowest to highest and coins highest to lowest + sortSpendsCoinsHighToLow(nonzero) + + var haveCoins uint64 + var haveHours uint64 + var spending []UxBalance + + // Use the first nonzero output. This output will have the least hours possible + firstNonzero := nonzero[0] + if firstNonzero.Hours == 0 { + logger.Panic("balance has zero hours unexpectedly") + return nil, errors.New("balance has zero hours unexpectedly") + } + + nonzero = nonzero[1:] + + spending = append(spending, firstNonzero) + + haveCoins += firstNonzero.Coins + haveHours += firstNonzero.Hours + + if haveCoins >= coins && fee.RemainingHours(haveHours, params.UserVerifyTxn.BurnFactor) >= hours { + return spending, nil + } + + // Sort uxouts without hours according to the sorting strategy + sortStrategy(zero) + + for _, ux := range zero { + spending = append(spending, ux) + + haveCoins += ux.Coins + haveHours += ux.Hours + + if haveCoins >= coins { + break + } + } + + if haveCoins >= coins && fee.RemainingHours(haveHours, params.UserVerifyTxn.BurnFactor) >= hours { + return spending, nil + } + + // Sort remaining uxouts with hours according to the sorting strategy + sortStrategy(nonzero) + + for _, ux := range nonzero { + spending = append(spending, ux) + + haveCoins += ux.Coins + haveHours += ux.Hours + + if haveCoins >= coins && fee.RemainingHours(haveHours, params.UserVerifyTxn.BurnFactor) >= hours { + return spending, nil + } + } + + if haveCoins < coins { + return nil, ErrInsufficientBalance + } + + return nil, ErrInsufficientHours +} diff --git a/vendor/github.com/skycoin/skycoin/src/transaction/create.go b/vendor/github.com/skycoin/skycoin/src/transaction/create.go new file mode 100644 index 0000000000..1157e60019 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/transaction/create.go @@ -0,0 +1,505 @@ +/* +Package transaction provides methods for creating transactions + +See package coin for the Transaction object itself +*/ +package transaction + +import ( + "bytes" + "errors" + "fmt" + "sort" + + "github.com/shopspring/decimal" + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/mathutil" +) + +var ( + logger = logging.MustGetLogger("txn") +) + +// Create creates an unsigned transaction based upon Params. +// NOTE: Caller must ensure that auxs correspond to params.UxOuts options +// Outputs to spend are chosen from the pool of outputs provided. +// The outputs are chosen by the following procedure: +// - All outputs are merged into one list and are sorted coins highest, hours lowest, with the hash as a tiebreaker +// - Outputs are chosen from the beginning of this list, until the requested amount of coins is met. +// If hours are also specified, selection continues until the requested amount of hours are met. +// - If the total amount of coins in the chosen outputs is exactly equal to the requested amount of coins, +// such that there would be no change output but hours remain as change, another output will be chosen to create change, +// if the coinhour cost of adding that output is less than the coinhours that would be lost as change +// +// If receiving hours are not explicitly specified, hours are allocated amongst the receiving outputs proportional to the number of coins being sent to them. +// If the change address is not specified, the address whose bytes are lexically sorted first is chosen from the owners of the outputs being spent. +func Create(p Params, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []UxBalance, error) { + return create(p, auxs, headTime, 0) +} + +func create(p Params, auxs coin.AddressUxOuts, headTime uint64, callCount int) (*coin.Transaction, []UxBalance, error) { + logger.WithFields(logrus.Fields{ + "params": p, + "nAuxs": len(auxs), + "headTime": headTime, + "callCount": callCount, + }).Info("create requested") + + if err := p.Validate(); err != nil { + return nil, nil, err + } + + txn := &coin.Transaction{} + + // Determine which unspents to spend + uxa := auxs.Flatten() + + uxb, err := NewUxBalances(uxa, headTime) + if err != nil { + return nil, nil, err + } + + // Reverse lookup set to recover the inputs + uxbMap := make(map[cipher.SHA256]UxBalance, len(uxb)) + for _, u := range uxb { + if _, ok := uxbMap[u.Hash]; ok { + return nil, nil, errors.New("Duplicate UxBalance in array") + } + uxbMap[u.Hash] = u + } + + // Calculate total coins and minimum hours to send + var totalOutCoins uint64 + var requestedHours uint64 + for _, to := range p.To { + totalOutCoins, err = mathutil.AddUint64(totalOutCoins, to.Coins) + if err != nil { + return nil, nil, NewError(fmt.Errorf("total output coins error: %v", err)) + } + + requestedHours, err = mathutil.AddUint64(requestedHours, to.Hours) + if err != nil { + return nil, nil, NewError(fmt.Errorf("total output hours error: %v", err)) + } + } + + // Use the MinimizeUxOuts strategy, to use least possible uxouts + // this will allow more frequent spending + // we don't need to check whether we have sufficient balance beforehand as ChooseSpends already checks that + spends, err := ChooseSpendsMinimizeUxOuts(uxb, totalOutCoins, requestedHours) + if err != nil { + return nil, nil, err + } + + // Calculate total coins and hours in spends + var totalInputCoins uint64 + var totalInputHours uint64 + for _, spend := range spends { + totalInputCoins, err = mathutil.AddUint64(totalInputCoins, spend.Coins) + if err != nil { + return nil, nil, err + } + + totalInputHours, err = mathutil.AddUint64(totalInputHours, spend.Hours) + if err != nil { + return nil, nil, err + } + + if err := txn.PushInput(spend.Hash); err != nil { + logger.Critical().WithError(err).Error("PushInput failed") + return nil, nil, err + } + } + + feeHours := fee.RequiredFee(totalInputHours, params.UserVerifyTxn.BurnFactor) + if feeHours == 0 { + // feeHours can only be 0 if totalInputHours is 0, and if totalInputHours was 0 + // then ChooseSpendsMinimizeUxOuts should have already returned an error + err := errors.New("Chosen spends have no coin hours, unexpectedly") + logger.Critical().WithError(err).WithField("totalInputHours", totalInputHours).Error() + return nil, nil, err + } + remainingHours := totalInputHours - feeHours + + switch p.HoursSelection.Type { + case HoursSelectionTypeManual: + for _, o := range p.To { + if err := txn.PushOutput(o.Address, o.Coins, o.Hours); err != nil { + logger.Critical().WithError(err).WithField("selectionType", HoursSelectionTypeManual).Error("PushOutput failed") + return nil, nil, err + } + } + + case HoursSelectionTypeAuto: + var addrHours []uint64 + + switch p.HoursSelection.Mode { + case HoursSelectionModeShare: + // multiply remaining hours after fee burn with share factor + hours, err := mathutil.Uint64ToInt64(remainingHours) + if err != nil { + return nil, nil, err + } + + allocatedHoursInt := p.HoursSelection.ShareFactor.Mul(decimal.New(hours, 0)).IntPart() + allocatedHours, err := mathutil.Int64ToUint64(allocatedHoursInt) + if err != nil { + return nil, nil, err + } + + toCoins := make([]uint64, len(p.To)) + for i, to := range p.To { + toCoins[i] = to.Coins + } + + addrHours, err = DistributeCoinHoursProportional(toCoins, allocatedHours) + if err != nil { + return nil, nil, err + } + default: + // This should have been caught by params.Validate() + logger.Panic("Invalid HoursSelection.Mode") + return nil, nil, errors.New("Invalid HoursSelection.Type") + } + + for i, out := range p.To { + out.Hours = addrHours[i] + if err := txn.PushOutput(out.Address, out.Coins, addrHours[i]); err != nil { + logger.Critical().WithError(err).WithField("selectionType", HoursSelectionTypeAuto).Error("PushOutput failed") + return nil, nil, err + } + } + + default: + // This should have been caught by params.Validate() + logger.Panic("Invalid HoursSelection.Type") + return nil, nil, errors.New("Invalid HoursSelection.Type") + } + + totalOutHours, err := txn.OutputHours() + if err != nil { + return nil, nil, err + } + + // Make sure we have enough coins and coin hours + // If we don't, and we called ChooseSpends, then ChooseSpends has a bug, as it should have returned this error already + if totalOutCoins > totalInputCoins { + logger.Critical().WithError(ErrInsufficientBalance).Error("Insufficient coins after choosing spends, this should not occur") + return nil, nil, ErrInsufficientBalance + } + + if totalOutHours > remainingHours { + logger.Critical().WithError(fee.ErrTxnInsufficientCoinHours).Error("Insufficient hours after choosing spends or distributing hours, this should not occur") + return nil, nil, fee.ErrTxnInsufficientCoinHours + } + + // Create change output + changeCoins := totalInputCoins - totalOutCoins + changeHours := remainingHours - totalOutHours + + logger.WithFields(logrus.Fields{ + "totalOutCoins": totalOutCoins, + "totalOutHours": totalOutHours, + "requestedHours": requestedHours, + "nUnspents": len(uxb), + "totalInputCoins": totalInputCoins, + "totalInputHours": totalInputHours, + "feeHours": feeHours, + "remainingHours": remainingHours, + "changeCoins": changeCoins, + "changeHours": changeHours, + "nSpends": len(spends), + "nInputs": len(txn.In), + }).Info("Calculated spend parameters") + + // If there are no change coins but there are change hours, try to add another + // input to save the change hours. + // This chooses an available input with the least number of coin hours; + // if the extra coin hour fee incurred by this additional input is less than + // the remaining coin hours, the input is added. + if changeCoins == 0 && changeHours > 0 { + logger.Info("Trying to recover change hours by forcing an extra input") + // Find the output with the least coin hours + // If size of the fee for this output is less than the changeHours, add it + // Update changeCoins and changeHours + z := uxBalancesSub(uxb, spends) + sortSpendsHoursLowToHigh(z) + if len(z) > 0 { + logger.Info("Extra input found, evaluating if it can recover change hours") + extra := z[0] + + // Calculate the new hours being spent + newTotalHours, err := mathutil.AddUint64(totalInputHours, extra.Hours) + if err != nil { + return nil, nil, err + } + + // Calculate the new fee for this new amount of hours + newFee := fee.RequiredFee(newTotalHours, params.UserVerifyTxn.BurnFactor) + if newFee < feeHours { + err := errors.New("updated fee after adding extra input for change is unexpectedly less than it was initially") + logger.WithError(err).Error() + return nil, nil, err + } + + // If the cost of adding this extra input is less than the amount of change hours we + // can save, use the input + additionalFee := newFee - feeHours + if additionalFee < changeHours { + logger.Info("Change hours can be recovered by forcing an extra input") + changeCoins = extra.Coins + + if extra.Hours < additionalFee { + err := errors.New("calculated additional fee is unexpectedly higher than the extra input's hours") + logger.WithError(err).Error() + return nil, nil, err + } + + additionalHours := extra.Hours - additionalFee + changeHours, err = mathutil.AddUint64(changeHours, additionalHours) + if err != nil { + return nil, nil, err + } + + spends = append(spends, extra) + + if err := txn.PushInput(extra.Hash); err != nil { + logger.Critical().WithError(err).Error("PushInput failed") + return nil, nil, err + } + + logger.WithFields(logrus.Fields{ + "changeCoins": changeCoins, + "changeHours": changeHours, + "nSpends": len(spends), + "nInputs": len(txn.In), + "newTotalHours": newTotalHours, + "newFee": "newFee", + "additionalFee": additionalFee, + "additionalHours": additionalHours, + }).Info("Recalculated spend parameters after forcing a change output") + } else { + logger.Info("Unable to recover change hours by forcing an extra input") + } + } else { + logger.Info("No more inputs left to use to recover change hours") + } + } + + // With auto share mode, if there are leftover hours and change couldn't be force-added, + // recalculate that share ratio at 100% + if changeCoins == 0 && changeHours > 0 && p.HoursSelection.Type == HoursSelectionTypeAuto && p.HoursSelection.Mode == HoursSelectionModeShare { + logger.Info("Recalculating share factor at 1.0 to avoid burning change hours") + oneDecimal := decimal.New(1, 0) + + if p.HoursSelection.ShareFactor.Equal(oneDecimal) { + err := errors.New("share factor is 1.0 but changeHours > 0 unexpectedly") + logger.Critical().WithError(err).Error() + return nil, nil, err + } + + // Double-check that we haven't already called create() once already - + // if for some reason the previous check fails, we'll end up in an infinite loop + if callCount > 0 { + err := errors.New("transaction.Create already fell back to share ratio 1.0") + logger.Critical().WithError(err).Error() + return nil, nil, err + } + + p.HoursSelection.ShareFactor = &oneDecimal + return create(p, auxs, headTime, 1) + } + + if changeCoins > 0 { + var changeAddress cipher.Address + if p.ChangeAddress != nil { + changeAddress = *p.ChangeAddress + } else { + // Choose a change address from the unspent outputs + // Sort spends by address, comparing bytes, and use the first + // This provides deterministic change address selection from a set of unspent outputs + if len(spends) == 0 { + return nil, nil, errors.New("spends is unexpectedly empty when choosing an automatic change address") + } + + addressBytes := make([][]byte, len(spends)) + for i, s := range spends { + addressBytes[i] = s.Address.Bytes() + } + + sort.Slice(addressBytes, func(i, j int) bool { + return bytes.Compare(addressBytes[i], addressBytes[j]) < 0 + }) + + var err error + changeAddress, err = cipher.AddressFromBytes(addressBytes[0]) + if err != nil { + logger.Critical().WithError(err).Error("cipher.AddressFromBytes failed for change address converted to bytes") + return nil, nil, err + } + + logger.WithField("addr", changeAddress).Info("Automatically selected a change address") + } + + logger.WithFields(logrus.Fields{ + "changeAddress": changeAddress, + "changeCoins": changeCoins, + "changeHours": changeHours, + }).Info("Adding a change output") + + if err := txn.PushOutput(changeAddress, changeCoins, changeHours); err != nil { + logger.Critical().WithError(err).Error("PushOutput failed") + return nil, nil, err + } + } + + // Initialize unsigned transaction + txn.Sigs = make([]cipher.Sig, len(txn.In)) + + if err := txn.UpdateHeader(); err != nil { + logger.Critical().WithError(err).Error("txn.UpdateHeader failed") + return nil, nil, err + } + + inputs := make([]UxBalance, len(txn.In)) + for i, h := range txn.In { + uxBalance, ok := uxbMap[h] + if !ok { + err := errors.New("Created transaction's input is not in the UxBalanceSet, this should not occur") + logger.Critical().WithError(err).Error() + return nil, nil, err + } + inputs[i] = uxBalance + } + + if err := verifyCreatedUnignedInvariants(p, txn, inputs); err != nil { + logger.Critical().WithError(err).Error("CreateTransaction created transaction that violates invariants, aborting") + return nil, nil, fmt.Errorf("Created transaction that violates invariants, this is a bug: %v", err) + } + + return txn, inputs, nil +} + +func verifyCreatedUnignedInvariants(p Params, txn *coin.Transaction, inputs []UxBalance) error { + if !txn.IsFullyUnsigned() { + return errors.New("Transaction is not fully unsigned") + } + + if err := VerifyCreatedInvariants(p, txn, inputs); err != nil { + return err + } + + return nil +} + +// VerifyCreatedInvariants checks that the transaction that was created matches expectations. +// Does not call visor verification methods because that causes import cycle due to the wallet package. +// daemon.Gateway checks that the transaction passes additional visor verification methods. +// TODO -- could fix the import cycle by having visor create the transaction, passing it to the wallet for verifying params and signing +// This method still compares some values of Params against the created txn and doesn't only verify that the txn is well formed +func VerifyCreatedInvariants(p Params, txn *coin.Transaction, inputs []UxBalance) error { + for _, o := range txn.Out { + // No outputs should be sent to the null address + if o.Address.Null() { + return errors.New("Output address is null") + } + + if o.Coins == 0 { + return errors.New("Output coins is 0") + } + } + + if len(txn.Out) != len(p.To) && len(txn.Out) != len(p.To)+1 { + return errors.New("Transaction has unexpected number of outputs") + } + + for i, o := range txn.Out[:len(p.To)] { + if o.Address != p.To[i].Address { + return errors.New("Output address does not match requested address") + } + + if o.Coins != p.To[i].Coins { + return errors.New("Output coins does not match requested coins") + } + + if p.To[i].Hours != 0 && o.Hours != p.To[i].Hours { + return errors.New("Output hours does not match requested hours") + } + } + + if len(txn.Sigs) != len(txn.In) { + return errors.New("Number of signatures does not match number of inputs") + } + + if len(txn.In) != len(inputs) { + return errors.New("Number of UxOut inputs does not match number of transaction inputs") + } + + for i, h := range txn.In { + if inputs[i].Hash != h { + return errors.New("Transaction input hash does not match UxOut inputs hash") + } + } + + inputsMap := make(map[cipher.SHA256]struct{}, len(inputs)) + + for _, i := range inputs { + if i.Hours < i.InitialHours { + return errors.New("Calculated input hours are unexpectedly less than the initial hours") + } + + if i.BkSeq == 0 { + if !i.SrcTransaction.Null() { + return errors.New("Input is the genesis UTXO but its source transaction hash is not null") + } + } else { + if i.SrcTransaction.Null() { + return errors.New("Input's source transaction hash is null") + } + } + + if i.Hash.Null() { + return errors.New("Input's hash is null") + } + + if _, ok := inputsMap[i.Hash]; ok { + return errors.New("Duplicate input in array") + } + + inputsMap[i.Hash] = struct{}{} + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = mathutil.AddUint64(inputHours, i.Hours) + if err != nil { + return err + } + } + + var outputHours uint64 + for _, i := range txn.Out { + var err error + outputHours, err = mathutil.AddUint64(outputHours, i.Hours) + if err != nil { + return err + } + } + + if inputHours < outputHours { + return errors.New("Total input hours is less than the output hours") + } + + if inputHours-outputHours < fee.RequiredFee(inputHours, params.UserVerifyTxn.BurnFactor) { + return errors.New("Transaction will not satisfy required fee") + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/transaction/distribution.go b/vendor/github.com/skycoin/skycoin/src/transaction/distribution.go new file mode 100644 index 0000000000..244dc0f1f7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/transaction/distribution.go @@ -0,0 +1,24 @@ +package transaction + +import ( + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" +) + +// TransactionIsLocked returns true if the transaction spends locked outputs +func TransactionIsLocked(d params.Distribution, inUxs coin.UxArray) bool { + lockedAddrs := d.LockedAddresses() + lockedAddrsMap := make(map[string]struct{}) + for _, a := range lockedAddrs { + lockedAddrsMap[a] = struct{}{} + } + + for _, o := range inUxs { + uxAddr := o.Body.Address.String() + if _, ok := lockedAddrsMap[uxAddr]; ok { + return true + } + } + + return false +} diff --git a/vendor/github.com/skycoin/skycoin/src/transaction/hours.go b/vendor/github.com/skycoin/skycoin/src/transaction/hours.go new file mode 100644 index 0000000000..585b323e9e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/transaction/hours.go @@ -0,0 +1,165 @@ +package transaction + +import ( + "errors" + "math/big" + + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/util/mathutil" +) + +// DistributeSpendHours calculates how many coin hours to transfer to the change address and how +// many to transfer to each of the other destination addresses. +// Input hours are split by BurnFactor (rounded down) to meet the fee requirement. +// The remaining hours are split in half, one half goes to the change address +// and the other half goes to the destination addresses. +// If the remaining hours are an odd number, the change address gets the extra hour. +// If the amount assigned to the destination addresses is not perfectly divisible by the +// number of destination addresses, the extra hours are distributed to some of these addresses. +// Returns the number of hours to send to the change address, +// an array of length nAddrs with the hours to give to each destination address, +// and a sum of these values. +func DistributeSpendHours(inputHours, nAddrs uint64, haveChange bool) (uint64, []uint64, uint64) { + feeHours := fee.RequiredFee(inputHours, params.UserVerifyTxn.BurnFactor) + remainingHours := inputHours - feeHours + + var changeHours uint64 + if haveChange { + // Split the remaining hours between the change output and the other outputs + changeHours = remainingHours / 2 + + // If remainingHours is an odd number, give the extra hour to the change output + if remainingHours%2 == 1 { + changeHours++ + } + } + + // Distribute the remaining hours equally amongst the destination outputs + remainingAddrHours := remainingHours - changeHours + addrHoursShare := remainingAddrHours / nAddrs + + // Due to integer division, extra coin hours might remain after dividing by len(toAddrs) + // Allocate these extra hours to the toAddrs + addrHours := make([]uint64, nAddrs) + for i := range addrHours { + addrHours[i] = addrHoursShare + } + + extraHours := remainingAddrHours - (addrHoursShare * nAddrs) + i := 0 + for extraHours > 0 { + addrHours[i] = addrHours[i] + 1 + i++ + extraHours-- + } + + // Assert that the hour calculation is correct + var spendHours uint64 + for _, h := range addrHours { + spendHours += h + } + spendHours += changeHours + if spendHours != remainingHours { + logger.Panicf("spendHours != remainingHours (%d != %d), calculation error", spendHours, remainingHours) + } + + return changeHours, addrHours, spendHours +} + +// DistributeCoinHoursProportional distributes hours amongst coins proportional to the coins amount +func DistributeCoinHoursProportional(coins []uint64, hours uint64) ([]uint64, error) { + if len(coins) == 0 { + return nil, errors.New("DistributeCoinHoursProportional coins array must not be empty") + } + + coinsInt := make([]*big.Int, len(coins)) + + var total uint64 + for i, c := range coins { + if c == 0 { + return nil, errors.New("DistributeCoinHoursProportional coins array has a zero value") + } + + var err error + total, err = mathutil.AddUint64(total, c) + if err != nil { + return nil, err + } + + cInt64, err := mathutil.Uint64ToInt64(c) + if err != nil { + return nil, err + } + + coinsInt[i] = big.NewInt(cInt64) + } + + totalInt64, err := mathutil.Uint64ToInt64(total) + if err != nil { + return nil, err + } + totalInt := big.NewInt(totalInt64) + + hoursInt64, err := mathutil.Uint64ToInt64(hours) + if err != nil { + return nil, err + } + hoursInt := big.NewInt(hoursInt64) + + var assignedHours uint64 + addrHours := make([]uint64, len(coins)) + for i, c := range coinsInt { + // Scale the ratio of coins to total coins proportionally by calculating + // (coins * totalHours) / totalCoins + // The remainder is truncated, remaining hours are appended after this + num := &big.Int{} + num.Mul(c, hoursInt) + + fracInt := big.Int{} + fracInt.Div(num, totalInt) + + if !fracInt.IsUint64() { + return nil, errors.New("DistributeCoinHoursProportional calculated fractional hours is not representable as a uint64") + } + + fracHours := fracInt.Uint64() + + addrHours[i] = fracHours + assignedHours, err = mathutil.AddUint64(assignedHours, fracHours) + if err != nil { + return nil, err + } + } + + if hours < assignedHours { + return nil, errors.New("DistributeCoinHoursProportional assigned hours exceeding input hours, this is a bug") + } + + remainingHours := hours - assignedHours + + if remainingHours > uint64(len(coins)) { + return nil, errors.New("DistributeCoinHoursProportional remaining hours exceed len(coins), this is a bug") + } + + // For remaining hours lost due to fractional cutoff when scaling, + // first provide at least 1 coin hour to coins that were assigned 0. + i := 0 + for remainingHours > 0 && i < len(coins) { + if addrHours[i] == 0 { + addrHours[i] = 1 + remainingHours-- + } + i++ + } + + // Then, assign the extra coin hours + i = 0 + for remainingHours > 0 { + addrHours[i] = addrHours[i] + 1 + remainingHours-- + i++ + } + + return addrHours, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/transaction/params.go b/vendor/github.com/skycoin/skycoin/src/transaction/params.go new file mode 100644 index 0000000000..139f2e6fd1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/transaction/params.go @@ -0,0 +1,155 @@ +package transaction + +import ( + "errors" + + "github.com/shopspring/decimal" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" +) + +// Error wraps transaction creation-related errors. +// It wraps errors caused by user input, but not errors caused by programmer input or internal issues. +type Error struct { + error +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + return nil + } + return Error{err} +} + +const ( + // HoursSelectionTypeManual is used to specify manual hours selection in advanced spend + HoursSelectionTypeManual = "manual" + // HoursSelectionTypeAuto is used to specify automatic hours selection in advanced spend + HoursSelectionTypeAuto = "auto" + + // HoursSelectionModeShare will distribute coin hours equally amongst destinations + HoursSelectionModeShare = "share" +) + +var ( + // ErrNullChangeAddress ChangeAddress must not be the null address + ErrNullChangeAddress = NewError(errors.New("ChangeAddress must not be the null address")) + // ErrMissingReceivers To is required + ErrMissingReceivers = NewError(errors.New("To is required")) + // ErrZeroCoinsReceiver To.Coins must not be zero + ErrZeroCoinsReceiver = NewError(errors.New("To.Coins must not be zero")) + // ErrNullAddressReceiver To.Address must not be the null address + ErrNullAddressReceiver = NewError(errors.New("To.Address must not be the null address")) + // ErrDuplicateReceiver To contains duplicate values + ErrDuplicateReceiver = NewError(errors.New("To contains duplicate values")) + // ErrReceiverZeroHoursAuto To.Hours must be zero for auto type hours selection + ErrReceiverZeroHoursAuto = NewError(errors.New("To.Hours must be zero for auto type hours selection")) + // ErrMissingHoursSelectionModeAuto HoursSelection.Mode is required for auto type hours selection + ErrMissingHoursSelectionModeAuto = NewError(errors.New("HoursSelection.Mode is required for auto type hours selection")) + // ErrInvalidHoursSelelectionMode Invalid HoursSelection.Mode + ErrInvalidHoursSelelectionMode = NewError(errors.New("Invalid HoursSelection.Mode")) + // ErrInvalidHoursSelectionModeManual HoursSelection.Mode cannot be used for manual type hours selection + ErrInvalidHoursSelectionModeManual = NewError(errors.New("HoursSelection.Mode cannot be used for manual type hours selection")) + // ErrInvalidHoursSelectionType Invalid HoursSelection.Type + ErrInvalidHoursSelectionType = NewError(errors.New("Invalid HoursSelection.Type")) + // ErrMissingShareFactor HoursSelection.ShareFactor must be set for share mode + ErrMissingShareFactor = NewError(errors.New("HoursSelection.ShareFactor must be set for share mode")) + // ErrInvalidShareFactor HoursSelection.ShareFactor can only be used for share mode + ErrInvalidShareFactor = NewError(errors.New("HoursSelection.ShareFactor can only be used for share mode")) + // ErrShareFactorOutOfRange HoursSelection.ShareFactor must be >= 0 and <= 1 + ErrShareFactorOutOfRange = NewError(errors.New("HoursSelection.ShareFactor must be >= 0 and <= 1")) +) + +// HoursSelection defines options for hours distribution +type HoursSelection struct { + Type string + Mode string + ShareFactor *decimal.Decimal +} + +// Params defines control parameters for transaction construction +type Params struct { + HoursSelection HoursSelection + To []coin.TransactionOutput + ChangeAddress *cipher.Address +} + +// Validate validates Params +func (c Params) Validate() error { + if c.ChangeAddress != nil && c.ChangeAddress.Null() { + return ErrNullChangeAddress + } + + if len(c.To) == 0 { + return ErrMissingReceivers + } + + for _, to := range c.To { + if to.Coins == 0 { + return ErrZeroCoinsReceiver + } + + if to.Address.Null() { + return ErrNullAddressReceiver + } + } + + // Check for duplicate outputs, a transaction can't have outputs with + // the same (address, coins, hours) + // Auto mode would distribute hours to the outputs and could hypothetically + // avoid assigning duplicate hours in many cases, but the complexity for doing + // so is very high, so also reject duplicate (address, coins) for auto mode. + outputs := make(map[coin.TransactionOutput]struct{}, len(c.To)) + for _, to := range c.To { + outputs[to] = struct{}{} + } + + if len(outputs) != len(c.To) { + return ErrDuplicateReceiver + } + + switch c.HoursSelection.Type { + case HoursSelectionTypeAuto: + for _, to := range c.To { + if to.Hours != 0 { + return ErrReceiverZeroHoursAuto + } + } + + switch c.HoursSelection.Mode { + case HoursSelectionModeShare: + case "": + return ErrMissingHoursSelectionModeAuto + default: + return ErrInvalidHoursSelelectionMode + } + + case HoursSelectionTypeManual: + if c.HoursSelection.Mode != "" { + return ErrInvalidHoursSelectionModeManual + } + + default: + return ErrInvalidHoursSelectionType + } + + if c.HoursSelection.ShareFactor == nil { + if c.HoursSelection.Mode == HoursSelectionModeShare { + return ErrMissingShareFactor + } + } else { + if c.HoursSelection.Mode != HoursSelectionModeShare { + return ErrInvalidShareFactor + } + + zero := decimal.New(0, 0) + one := decimal.New(1, 0) + if c.HoursSelection.ShareFactor.LessThan(zero) || c.HoursSelection.ShareFactor.GreaterThan(one) { + return ErrShareFactorOutOfRange + } + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/transaction/verify.go b/vendor/github.com/skycoin/skycoin/src/transaction/verify.go new file mode 100644 index 0000000000..392f5a5438 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/transaction/verify.go @@ -0,0 +1,339 @@ +package transaction + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/util/fee" +) + +/* + +verify.go: Methods for handling transaction verification + +There are two levels of transaction constraint: HARD and SOFT +There are two situations in which transactions are verified: + * When included in a block + * When not in a block + +For transactions in a block, use VerifyBlockTxnConstraints. +For transactions outside of a block, use VerifySingleTxnHardConstraints and VerifySingleTxnSoftConstraints. + +VerifyBlockTxnConstraints only checks hard constraints. Soft constraints do not apply for transactions inside of a block. + +Soft and hard constraints have special handling for single transactions. + +When the transaction is received over the network, a transaction is not injected to the pool if it violates the HARD constraints. +If it violates soft constraints, it is still injected to the pool (TODO: with expiration) but is not rebroadcast to peers. +If it does not violate any constraints it is injected and rebroadcast to peers. + +When the transaction is created by the user (with create_rawtx or /spend), SOFT and HARD constraints apply, to prevent +the user from injecting a transaction to their local pool that cannot be confirmed. + +When creating a new block from transactions, SOFT and HARD constraints apply. + +Transactions in the unconfirmed pool are periodically checked for validity. (TODO: audit/implement this feature) +The transaction pool state transfer phases are as follows: + valid -> hard_invalid: remove + valid -> soft_invalid: mark as invalid + soft_invalid -> valid: mark as valid, broadcast + soft_invalid -> hard_invalid: remove + soft_invalid -> expired: remove + +HARD constraints can NEVER be violated. These include: + - Malformed transaction + - Double spends + - NOTE: Double spend verification must be done against the unspent output set, + the methods here do not operate on the unspent output set. + They accept a `uxIn coin.UxArray` argument, which are the unspents associated + with the transaction's inputs. The unspents must be queried from the unspent + output set first, thus if any unspent is not found for the input, it cannot be spent. + +SOFT constraints are based upon mutable parameters. These include: + - Max block size (transaction must not be larger than this value) + - Insufficient coin hour burn fee + - Timelocked distribution addresses + - Decimal place restrictions + +NOTE: Due to a bug which allowed overflowing output coin hours to be included in a block, + overflowing output coin hours are not checked when adding a signed block, so that the existing blocks can be processed. + When creating or receiving a single transaction from the network, it is treated as a HARD constraint. + +These methods should be called via the Blockchain object when possible, +using Blockchain.VerifyBlockTxnConstraints, Blockchain.VerifySingleTxnHardConstraints and Blockchain.VerifySingleTxnSoftHardConstraints +since data from the blockchain and unspent output set are required to fully validate a transaction. + +*/ + +var ( + // ErrTxnExceedsMaxBlockSize transaction size exceeds the max block size + ErrTxnExceedsMaxBlockSize = errors.New("Transaction size bigger than max block size") + // ErrTxnIsLocked transaction has locked address inputs + ErrTxnIsLocked = errors.New("Transaction has locked address inputs") +) + +// TxnSignedFlag indicates if the transaction is unsigned or not +type TxnSignedFlag int + +const ( + // TxnSigned is used for signed transactions + TxnSigned TxnSignedFlag = 1 + // TxnUnsigned is used for unsigned transactions + TxnUnsigned TxnSignedFlag = 2 +) + +// ErrTxnViolatesHardConstraint is returned when a transaction violates hard constraints +type ErrTxnViolatesHardConstraint struct { + Err error +} + +// NewErrTxnViolatesHardConstraint creates ErrTxnViolatesHardConstraint +func NewErrTxnViolatesHardConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesHardConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesHardConstraint) Error() string { + return fmt.Sprintf("Transaction violates hard constraint: %v", e.Err) +} + +// ErrTxnViolatesSoftConstraint is returned when a transaction violates soft constraints +type ErrTxnViolatesSoftConstraint struct { + Err error +} + +// NewErrTxnViolatesSoftConstraint creates ErrTxnViolatesSoftConstraint +func NewErrTxnViolatesSoftConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesSoftConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesSoftConstraint) Error() string { + return fmt.Sprintf("Transaction violates soft constraint: %v", e.Err) +} + +// ErrTxnViolatesUserConstraint is returned when a transaction violates user constraints +type ErrTxnViolatesUserConstraint struct { + Err error +} + +// NewErrTxnViolatesUserConstraint creates ErrTxnViolatesUserConstraint +func NewErrTxnViolatesUserConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesUserConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesUserConstraint) Error() string { + return fmt.Sprintf("Transaction violates user constraint: %v", e.Err) +} + +// VerifySingleTxnSoftConstraints returns an error if any "soft" constraint are violated. +// "soft" constraints are enforced at the network and block publication level, +// but are not enforced at the blockchain level. +// Clients will not accept blocks that violate hard constraints, but will +// accept blocks that violate soft constraints. +// Checks: +// - That the transaction size is not greater than the max block total transaction size +// - That the transaction burn enough coin hours (the fee) +// - That if that transaction does not spend from a locked distribution address +// - That the transaction does not create outputs with a higher decimal precision than is allowed +func VerifySingleTxnSoftConstraints(txn coin.Transaction, headTime uint64, uxIn coin.UxArray, distParams params.Distribution, verifyParams params.VerifyTxn) error { + if err := verifyTxnSoftConstraints(txn, headTime, uxIn, distParams, verifyParams); err != nil { + return NewErrTxnViolatesSoftConstraint(err) + } + + return nil +} + +func verifyTxnSoftConstraints(txn coin.Transaction, headTime uint64, uxIn coin.UxArray, distParams params.Distribution, verifyParams params.VerifyTxn) error { + txnSize, err := txn.Size() + if err != nil { + return ErrTxnExceedsMaxBlockSize + } + + if txnSize > verifyParams.MaxTransactionSize { + return ErrTxnExceedsMaxBlockSize + } + + f, err := fee.TransactionFee(&txn, headTime, uxIn) + if err != nil { + return err + } + + if err := fee.VerifyTransactionFee(&txn, f, verifyParams.BurnFactor); err != nil { + return err + } + + if TransactionIsLocked(distParams, uxIn) { + return ErrTxnIsLocked + } + + // Reject transactions that do not conform to decimal restrictions + for _, o := range txn.Out { + if err := params.DropletPrecisionCheck(verifyParams.MaxDropletPrecision, o.Coins); err != nil { + return err + } + } + + return nil +} + +// VerifySingleTxnHardConstraints returns an error if any "hard" constraints are violated. +// "hard" constraints are always enforced and if violated the transaction +// should not be included in any block and any block that includes such a transaction +// should be rejected. +// Checks: +// - That the inputs to the transaction exist +// - That the transaction does not create or destroy coins +// - That the signatures on the transaction are valid +// - That there are no duplicate ux inputs +// - That there are no duplicate outputs +// - That the transaction input and output coins do not overflow uint64 +// - That the transaction input and output hours do not overflow uint64 +// +// NOTE: Double spends are checked against the unspent output pool when querying for uxIn +func VerifySingleTxnHardConstraints(txn coin.Transaction, head coin.BlockHeader, uxIn coin.UxArray, signed TxnSignedFlag) error { + // Check for output hours overflow + // When verifying a single transaction, this is considered a hard constraint. + // For transactions inside of a block, it is a soft constraint. + // This is due to a bug which allowed some blocks to be published with overflowing hours, + // otherwise this would always be a hard constraint. + if _, err := txn.OutputHours(); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + // Check for input CoinHours calculation overflow, since it is ignored by + // VerifyTransactionHoursSpending + for _, ux := range uxIn { + if _, err := ux.CoinHours(head.Time); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + } + + if err := verifyTxnHardConstraints(txn, head, uxIn, signed); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + return nil +} + +// VerifyBlockTxnConstraints returns an error if any "hard" constraints are violated. +// "hard" constraints are always enforced and if violated the transaction +// should not be included in any block and any block that includes such a transaction +// should be rejected. +// Checks: +// - That the inputs to the transaction exist +// - That the transaction does not create or destroy coins +// - That the signatures on the transaction are valid +// - That there are no duplicate ux inputs +// - That there are no duplicate outputs +// - That the transaction input and output coins do not overflow uint64 +// - That the transaction input hours do not overflow uint64 +// +// NOTE: Double spends are checked against the unspent output pool when querying for uxIn +// NOTE: output hours overflow is treated as a soft constraint for transactions inside of a block, due to a bug +// +// which allowed some blocks to be published with overflowing output hours. +func VerifyBlockTxnConstraints(txn coin.Transaction, head coin.BlockHeader, uxIn coin.UxArray) error { + if err := verifyTxnHardConstraints(txn, head, uxIn, TxnSigned); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + return nil +} + +func verifyTxnHardConstraints(txn coin.Transaction, head coin.BlockHeader, uxIn coin.UxArray, signed TxnSignedFlag) error { + //CHECKLIST: DONE: check for duplicate ux inputs/double spending + // NOTE: Double spends are checked against the unspent output pool when querying for uxIn + + //CHECKLIST: DONE: check that inputs of transaction have not been spent + //CHECKLIST: DONE: check there are no duplicate outputs + + // Q: why are coin hours based on last block time and not + // current time? + // A: no two computers will agree on system time. Need system clock + // indepedent timing that everyone agrees on. fee values would depend on + // local clock + + // Check transaction type and length + // Check for duplicate outputs + // Check for duplicate inputs + // Check for invalid hash + // Check for no inputs + // Check for no outputs + // Check for zero coin outputs + // Check valid looking signatures + + switch signed { + case TxnSigned: + if err := txn.Verify(); err != nil { + return err + } + + // Check that signatures are allowed to spend inputs + if err := txn.VerifyInputSignatures(uxIn); err != nil { + return err + } + case TxnUnsigned: + if err := txn.VerifyUnsigned(); err != nil { + return err + } + + // Check that signatures are allowed to spend inputs for signatures that are not null + if err := txn.VerifyPartialInputSignatures(uxIn); err != nil { + return err + } + default: + logger.Panic("Invalid TxnSignedFlag") + } + + uxOut := coin.CreateUnspents(head, txn) + + // Check that there are any duplicates within this set + // NOTE: This should already be checked by txn.Verify() + if uxOut.HasDupes() { + return errors.New("Duplicate output in transaction") + } + + // Check that no coins are created or destroyed + if err := coin.VerifyTransactionCoinsSpending(uxIn, uxOut); err != nil { + return err + } + + // Check that no hours are created + // NOTE: this check doesn't catch overflow errors in the addition of hours + // Some blocks had their hours overflow, and if this rule was checked here, + // existing blocks would invalidate. + // The hours overflow check is handled as an extra step in the SingleTxnHard constraints, + // to allow existing blocks which violate the overflow rules to pass. + return coin.VerifyTransactionHoursSpending(head.Time, uxIn, uxOut) +} + +// VerifySingleTxnUserConstraints applies additional verification for a +// transaction created by the user. +// This is distinct from transactions created by other users (i.e. received over the network), +// and from transactions included in blocks. +func VerifySingleTxnUserConstraints(txn coin.Transaction) error { + for _, o := range txn.Out { + if o.Address.Null() { + err := errors.New("Transaction output is sent to the null address") + return NewErrTxnViolatesUserConstraint(err) + } + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/apputil/apputil.go b/vendor/github.com/skycoin/skycoin/src/util/apputil/apputil.go new file mode 100644 index 0000000000..caf088ddf8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/apputil/apputil.go @@ -0,0 +1,56 @@ +/* +Package apputil provides utility methods for cmd applications +*/ +package apputil + +import ( + "fmt" + "os" + "os/signal" + "runtime/pprof" + "syscall" +) + +// CatchInterrupt catches CTRL-C and closes the quit channel if it occurs. +// If CTRL-C is called again, the program stack is dumped and the process panics, +// so that shutdown hangs can be diagnosed. +func CatchInterrupt(quit chan<- struct{}) { + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, os.Interrupt) + <-sigchan + signal.Stop(sigchan) + close(quit) + + // If ctrl-c is called again, panic so that the program state can be examined. + // Ctrl-c would be called again if program shutdown was stuck. + go CatchInterruptPanic() +} + +// CatchInterruptPanic catches os.Interrupt and panics +func CatchInterruptPanic() { + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, os.Interrupt) + <-sigchan + signal.Stop(sigchan) + PrintProgramStatus() + panic("SIGINT") +} + +// CatchDebug catches SIGUSR1 and prints internal program state +func CatchDebug() { + sigchan := make(chan os.Signal, 1) + //signal.Notify(sigchan, syscall.SIGUSR1) + signal.Notify(sigchan, syscall.Signal(0xa)) // SIGUSR1 = Signal(0xa) + for range sigchan { + PrintProgramStatus() + } +} + +// PrintProgramStatus prints all goroutine data to stdout +func PrintProgramStatus() { + p := pprof.Lookup("goroutine") + if err := p.WriteTo(os.Stdout, 2); err != nil { + fmt.Println("ERROR:", err) + return + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/certutil/LICENSE b/vendor/github.com/skycoin/skycoin/src/util/certutil/LICENSE new file mode 100644 index 0000000000..a7b7560c86 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/certutil/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2013-2015 The btcsuite developers + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/src/util/certutil/cert.go b/vendor/github.com/skycoin/skycoin/src/util/certutil/cert.go new file mode 100644 index 0000000000..b40b1d61dc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/certutil/cert.go @@ -0,0 +1,150 @@ +// Copyright (c) 2013-2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. +// Any modifications (c) 2018 Skycoin developers + +package certutil + +import ( + "bytes" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + _ "crypto/sha512" // Needed for RegisterHash in init + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "errors" + "fmt" + "math/big" + "net" + "os" + "time" + + "github.com/skycoin/skycoin/src/util/logging" +) + +var logger = logging.MustGetLogger("certutil") + +// NewTLSCertPair returns a new PEM-encoded x.509 certificate pair +// based on a 521-bit ECDSA private key. The machine's local interface +// addresses and all variants of IPv4 and IPv6 localhost are included as +// valid IP addresses. +func NewTLSCertPair(organization string, validUntil time.Time, extraHosts []string) (cert, key []byte, err error) { + now := time.Now() + if validUntil.Before(now) { + return nil, nil, errors.New("validUntil would create an already-expired certificate") + } + + priv, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader) + if err != nil { + return nil, nil, err + } + + // end of ASN.1 time + endOfTime := time.Date(2049, 12, 31, 23, 59, 59, 0, time.UTC) + if validUntil.After(endOfTime) { + validUntil = endOfTime + } + + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) + serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) + if err != nil { + return nil, nil, fmt.Errorf("failed to generate serial number: %s", err) + } + + host, err := os.Hostname() + if err != nil { + return nil, nil, err + } + + ipAddresses := []net.IP{net.ParseIP("127.0.0.1"), net.ParseIP("::1")} + dnsNames := []string{host} + if host != "localhost" { + dnsNames = append(dnsNames, "localhost") + } + + addIP := func(ipAddr net.IP) { + for _, ip := range ipAddresses { + if net.IP.Equal(ip, ipAddr) { + return + } + } + ipAddresses = append(ipAddresses, ipAddr) + } + addHost := func(host string) { + for _, dnsName := range dnsNames { + if host == dnsName { + return + } + } + dnsNames = append(dnsNames, host) + } + + addrs, err := net.InterfaceAddrs() + if err != nil { + // net.InterfaceAddrs will fail on some systems - ignore if this happens + logger.WithError(err).Error("NewTLSCertPair: net.InterfaceAddrs failed") + } + for _, a := range addrs { + ipAddr, _, err := net.ParseCIDR(a.String()) + if err == nil { + addIP(ipAddr) + } + } + + for _, hostStr := range extraHosts { + host, _, err := net.SplitHostPort(hostStr) + if err != nil { + host = hostStr + } + if ip := net.ParseIP(host); ip != nil { + addIP(ip) + } else { + addHost(host) + } + } + + template := x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{ + Organization: []string{organization}, + CommonName: host, + }, + NotBefore: now.Add(-time.Hour * 24), + NotAfter: validUntil, + + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | + x509.KeyUsageCertSign, + IsCA: true, // so can sign self. + BasicConstraintsValid: true, + + DNSNames: dnsNames, + IPAddresses: ipAddresses, + } + + derBytes, err := x509.CreateCertificate(rand.Reader, &template, + &template, &priv.PublicKey, priv) + if err != nil { + return nil, nil, fmt.Errorf("failed to create certificate: %v", err) + } + + certBuf := &bytes.Buffer{} + err = pem.Encode(certBuf, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) + if err != nil { + return nil, nil, fmt.Errorf("failed to encode certificate: %v", err) + } + + keybytes, err := x509.MarshalECPrivateKey(priv) + if err != nil { + return nil, nil, fmt.Errorf("failed to marshal private key: %v", err) + } + + keyBuf := &bytes.Buffer{} + err = pem.Encode(keyBuf, &pem.Block{Type: "EC PRIVATE KEY", Bytes: keybytes}) + if err != nil { + return nil, nil, fmt.Errorf("failed to encode private key: %v", err) + } + + return certBuf.Bytes(), keyBuf.Bytes(), nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/droplet/droplet.go b/vendor/github.com/skycoin/skycoin/src/util/droplet/droplet.go new file mode 100644 index 0000000000..44b4544087 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/droplet/droplet.go @@ -0,0 +1,95 @@ +/* +Package droplet provides methods for handling droplet integers and string. + +A droplet is the smallest possible coin amount in Skycoin, equal to 1/1000000 of a whole skycoin. +*/ +package droplet + +import ( + "errors" + "math" + + "github.com/shopspring/decimal" + + logging "github.com/skycoin/skycoin/src/util/logging" +) + +const ( + // Exponent is the number of decimal places held by droplets + Exponent = 6 + // Multiplier is how much to multiply coins by to get droplets + Multiplier = 1e6 +) + +var ( + // ErrNegativeValue is returned if a balance string is a negative number + ErrNegativeValue = errors.New("Droplet string conversion failed: Negative balance") + // ErrTooManyDecimals is returned if a balance string has more than 6 decimal places + ErrTooManyDecimals = errors.New("Droplet string conversion failed: Too many decimal places") + // ErrTooLarge is returned if a balance string is greater than math.MaxInt64 + ErrTooLarge = errors.New("Droplet string conversion failed: Value is too large") + + logger = logging.MustGetLogger("convert") + maxDecimal decimal.Decimal +) + +func init() { + maxInt64 := "9223372036854775807" + max, err := decimal.NewFromString(maxInt64) + if err != nil { + panic(err) + } + + maxDecimal = max +} + +// FromString converts a skycoin balance string with decimal places to uint64 droplets. +// For example, "123.000456" becomes 123000456 +func FromString(b string) (uint64, error) { + d, err := decimal.NewFromString(b) + if err != nil { + return 0, err + } + + // Values must be zero or positive + if d.Sign() == -1 { + return 0, ErrNegativeValue + } + + // Skycoins have a maximum of 6 decimal places + if d.Exponent() < -Exponent { + return 0, ErrTooManyDecimals + } + + // Multiply the coin balance by 1e6 to obtain droplets amount + e := d.Shift(Exponent) + + // Check that there are no decimal places remaining. This error should not + // occur, because of the earlier check of Exponent() + if e.Exponent() < 0 { + logger.Critical().Errorf("Balance still has decimals after converting to droplets: %s", b) + return 0, ErrTooManyDecimals + } + + // Values greater than math.MaxInt64 will overflow after conversion to int64 + // using decimal.IntPart() + if e.GreaterThan(maxDecimal) { + return 0, ErrTooLarge + } + + return uint64(e.IntPart()), nil +} + +// ToString converts droplets to a skycoin balance fixed-point decimal string. +// String will always have a decimal precision of droplet.Exponent (6). +// For example, 123000456 becomes "123.000456" and +// 123000000 becomes "123.000000". +func ToString(n uint64) (string, error) { + if n > math.MaxInt64 { + return "", ErrTooLarge + } + + d := decimal.New(int64(n), -Exponent) + + return d.StringFixed(Exponent), nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/elapse/elapser.go b/vendor/github.com/skycoin/skycoin/src/util/elapse/elapser.go new file mode 100644 index 0000000000..27fd0a45f2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/elapse/elapser.go @@ -0,0 +1,72 @@ +/* +Package elapse provides time measuring instruments +*/ +package elapse + +import ( + "time" + + "github.com/skycoin/skycoin/src/util/logging" +) + +// Elapser measures time elapsed for an operation. It is not thread-safe, use a different elapser per thread. +type Elapser struct { + name *string + startTime time.Time + elapsedThreshold time.Duration + Done chan bool + logger *logging.Logger +} + +// NewElapser creates an Elapser +func NewElapser(elapsedThreshold time.Duration, logger *logging.Logger) *Elapser { + elapser := &Elapser{ + elapsedThreshold: elapsedThreshold, + Done: make(chan bool, 100), + logger: logger, + } + return elapser +} + +// CheckForDone checks if the elapser has triggered and records the elapsed time +func (e *Elapser) CheckForDone() { + select { + case <-e.Done: + e.Elapsed() + default: + } +} + +// Register begins an operation to measure +func (e *Elapser) Register(name string) { + e.CheckForDone() + e.name = &name + e.startTime = time.Now() + e.Done <- true +} + +// ShowCurrentTime logs the elapsed time so far +func (e *Elapser) ShowCurrentTime(step string) { + stopTime := time.Now() + if e.name == nil { + e.logger.Warning("no registered events for elapsing, but found Elapser.ShowCurrentTime calling") + return + } + elapsed := stopTime.Sub(e.startTime) + e.logger.Infof("%s[%s] elapsed %s", *e.name, step, elapsed) + +} + +// Elapsed stops measuring an operation and logs the elapsed time if it exceeds the configured threshold +func (e *Elapser) Elapsed() { + stopTime := time.Now() + if e.name == nil { + e.logger.Warning("no registered events for elapsing, but found Elapser.Elapsed calling") + return + } + elapsed := stopTime.Sub(e.startTime) + if elapsed >= e.elapsedThreshold { + e.logger.Warningf("%s elapsed %s", *e.name, elapsed) + } + e.name = nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/fee/fee.go b/vendor/github.com/skycoin/skycoin/src/util/fee/fee.go new file mode 100644 index 0000000000..ec5e80bb0f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/fee/fee.go @@ -0,0 +1,99 @@ +/* +Package fee provides methods to calculate and verify transaction fees +*/ +package fee + +import ( + "errors" + + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/mathutil" +) + +var ( + // ErrTxnNoFee is returned if a transaction has no coinhour fee + ErrTxnNoFee = errors.New("Transaction has zero coinhour fee") + + // ErrTxnInsufficientFee is returned if a transaction's coinhour burn fee is not enough + ErrTxnInsufficientFee = errors.New("Transaction coinhour fee minimum not met") + + // ErrTxnInsufficientCoinHours is returned if a transaction has more coinhours in its outputs than its inputs + ErrTxnInsufficientCoinHours = errors.New("Insufficient coinhours for transaction outputs") +) + +// VerifyTransactionFee performs additional transaction verification at the unconfirmed pool level. +// This checks tunable params that should prevent the transaction from +// entering the blockchain, but cannot be done at the blockchain level because +// they may be changed. +func VerifyTransactionFee(t *coin.Transaction, fee uint64, burnFactor uint32) error { + hours, err := t.OutputHours() + if err != nil { + return err + } + return VerifyTransactionFeeForHours(hours, fee, burnFactor) +} + +// VerifyTransactionFeeForHours verifies the fee given fee and hours, +// where hours is the number of hours in a transaction's outputs, +// and hours+fee is the number of hours in a transaction's inputs +func VerifyTransactionFeeForHours(hours, fee uint64, burnFactor uint32) error { + // Require non-zero coinhour fee + if fee == 0 { + return ErrTxnNoFee + } + + // Calculate total number of coinhours + total, err := mathutil.AddUint64(hours, fee) + if err != nil { + return errors.New("Hours and fee overflow") + } + + // Calculate the required fee + requiredFee := RequiredFee(total, burnFactor) + + // Ensure that the required fee is met + if fee < requiredFee { + return ErrTxnInsufficientFee + } + + return nil +} + +// RequiredFee returns the coinhours fee required for an amount of hours +// The required fee is calculated as hours/burnFactor, rounded up. +func RequiredFee(hours uint64, burnFactor uint32) uint64 { + feeHours := hours / uint64(burnFactor) + if hours%uint64(burnFactor) != 0 { + feeHours++ + } + + return feeHours +} + +// RemainingHours returns the amount of coinhours leftover after paying the fee for the input. +func RemainingHours(hours uint64, burnFactor uint32) uint64 { + fee := RequiredFee(hours, burnFactor) + return hours - fee +} + +// TransactionFee calculates the current transaction fee in coinhours of a Transaction. +// Returns ErrTxnInsufficientCoinHours if input hours is less than output hours. +func TransactionFee(tx *coin.Transaction, headTime uint64, inUxs coin.UxArray) (uint64, error) { + // Compute input hours + inHours, err := inUxs.CoinHours(headTime) + if err != nil { + return 0, err + } + + // Compute output hours + outHours, err := tx.OutputHours() + if err != nil { + return 0, err + } + + if inHours < outHours { + return 0, ErrTxnInsufficientCoinHours + } + + return inHours - outHours, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/file/file.go b/vendor/github.com/skycoin/skycoin/src/util/file/file.go new file mode 100644 index 0000000000..b64aa05e42 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/file/file.go @@ -0,0 +1,322 @@ +// Package file provides filesystem related utilities +package file + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "strings" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/logging" +) + +var ( + // ErrEmptyDirectoryName is returned by constructing the full path + // of data directory if the passed argument is empty + ErrEmptyDirectoryName = errors.New("data directory must not be empty") + // ErrDotDirectoryName is returned by constructing the full path of + // data directory if the passed argument is "." + ErrDotDirectoryName = errors.New("data directory must not be equal to \".\"") + + logger = logging.MustGetLogger("file") +) + +// InitDataDir Joins dir with the user's $HOME directory. +// If $HOME cannot be determined, uses the current working directory. +// dir must not be the empty string +func InitDataDir(dir string) (string, error) { + dir, err := buildDataDir(dir) + if err != nil { + return "", err + } + + // check if dir already exists + st, err := os.Stat(dir) + if !os.IsNotExist(err) { + if !st.IsDir() { + return "", fmt.Errorf("%s is not a directory", dir) + } + // dir already exists + return dir, nil + } + + if err := os.MkdirAll(dir, os.FileMode(0700)); err != nil { + logger.Errorf("Failed to create directory %s: %v", dir, err) + return "", err + } + + logger.Infof("Created data directory %s", dir) + return dir, nil +} + +// Construct the full data directory by adding to $HOME or ./ +func buildDataDir(dir string) (string, error) { + if dir == "" { + logger.Error("data directory is empty") + return "", ErrEmptyDirectoryName + } + + home := filepath.Clean(UserHome()) + wd, err := os.Getwd() + if err != nil { + return "", err + } + wd = filepath.Clean(wd) + + fullDir, err := filepath.Abs(dir) + + if err != nil { + return "", err + } + + // The joined directory must not be equal to $HOME or a parent path of $HOME + // The joined directory must not be equal to `pwd` or a parent path of `pwd` + if strings.HasPrefix(home, fullDir) || strings.HasPrefix(wd, fullDir) { + logger.Errorf("join(%[1]s, %[2]s) == %[1]s", home, dir) + return "", ErrDotDirectoryName + } + + return fullDir, nil +} + +// UserHome returns the current user home path +func UserHome() string { + // os/user relies on cgo which is disabled when cross compiling + // use fallbacks for various OSes instead + // usr, err := user.Current() + // if err == nil { + // return usr.HomeDir + // } + if runtime.GOOS == "windows" { + home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + if home == "" { + home = os.Getenv("USERPROFILE") + } + return home + } + + return os.Getenv("HOME") +} + +// LoadJSON load json file +func LoadJSON(filename string, thing interface{}) error { + file, err := os.Open(filename) + if err != nil { + return err + } + defer file.Close() + + dec := json.NewDecoder(file) + dec.UseNumber() + return dec.Decode(thing) +} + +// SaveJSON write value into json file +func SaveJSON(filename string, thing interface{}, mode os.FileMode) error { + data, err := json.MarshalIndent(thing, "", " ") + if err != nil { + return err + } + return SaveBinary(filename, data, mode) +} + +// SaveJSONSafe saves json to disk, but refuses if file already exists +func SaveJSONSafe(filename string, thing interface{}, mode os.FileMode) error { + b, err := json.MarshalIndent(thing, "", " ") + if err != nil { + return err + } + flags := os.O_WRONLY | os.O_CREATE | os.O_EXCL + f, err := os.OpenFile(filename, flags, mode) + if err != nil { + return err + } + defer f.Close() + n, err := f.Write(b) + if n != len(b) && err != nil { + err = errors.New("Failed to save complete file") + } + if err != nil { + if removeErr := os.Remove(filename); removeErr != nil { + logger.WithError(removeErr).Warningf("os.Remove(%s) failed", filename) + } + return err + } + return f.Sync() +} + +// SaveBinary persists data into given file in binary, +// backup the data to `tmp` wallet file and then write data +// to target wallet file. Remove the tmp file in the end of +// this function. In this way, the wallet data would not be lost +func SaveBinary(filename string, data []byte, mode os.FileMode) error { + // Write the new file to a temporary + dataHash := cipher.SumSHA256(data) + tmpname := filename + ".tmp." + dataHash.Hex()[:8] + if err := ioutil.WriteFile(tmpname, data, mode); err != nil { + return err + } + + if err := ioutil.WriteFile(filename, data, mode); err != nil { + return err + } + + return os.Remove(tmpname) +} + +//TODO: require file named after application and then hashcode, in static directory + +// ResolveResourceDirectory searches locations for a research directory and returns absolute path +func ResolveResourceDirectory(path string) string { + workDir, err := filepath.Abs(filepath.Dir(os.Args[0])) + if err != nil { + logger.Panic(err) + } + + _, rtFilename, _, _ := runtime.Caller(1) + rtDirectory := filepath.Dir(rtFilename) + + pathAbs, err := filepath.Abs(path) + if err != nil { + logger.Panic(err) + } + fmt.Println("abs path:", pathAbs) + + fmt.Printf("runtime.Caller= %s \n", rtFilename) + //fmt.Printf("Filepath Raw= %s \n") + fmt.Printf("Filepath Directory= %s \n", filepath.Dir(path)) + fmt.Printf("Filepath Absolute Directory= %s \n", pathAbs) + + fmt.Printf("Working Directory= %s \n", workDir) + fmt.Printf("Runtime Filename= %s \n", rtFilename) + fmt.Printf("Runtime Directory= %s \n", rtDirectory) + + //dir1 := filepath.Join(workDir, filepath.Dir(path)) + //fmt.Printf("Dir1= %s \n", dir1) + + dirs := []string{ + pathAbs, //try direct path first + filepath.Join(workDir, filepath.Dir(path)), //default + //filepath.Join(rt_directory, "./", filepath.Dir(path)), + filepath.Join(rtDirectory, "./", filepath.Dir(path)), + filepath.Join(rtDirectory, "../", filepath.Dir(path)), + filepath.Join(rtDirectory, "../../", filepath.Dir(path)), + filepath.Join(rtDirectory, "../../../", filepath.Dir(path)), + } + + //for i, dir := range dirs { + // fmt.Printf("Dir[%d]= %s \n", i, dir) + //} + + //must be an absolute path + //error and problem and crash if not absolute path + for i := range dirs { + absPath, err := filepath.Abs(dirs[i]) + if err != nil { + logger.WithError(err).Errorf("filepath.Abs(%s) failed", dirs[i]) + continue + } + dirs[i] = absPath + } + + for _, dir := range dirs { + if _, err := os.Stat(dir); !os.IsNotExist(err) { + fmt.Printf("ResolveResourceDirectory: static resource dir= %s \n", dir) + return dir + } + } + logger.Panic("GUI directory not found") + return "" +} + +// DetermineResourcePath DEPRECATE +func DetermineResourcePath(staticDir string, resourceDir string, devDir string) (string, error) { + //check "dev" directory first + appLoc := filepath.Join(staticDir, devDir) + // if !strings.HasPrefix(appLoc, "/") { + // // Prepend the binary's directory path if appLoc is relative + // dir, err := filepath.Abs(filepath.Dir(os.Args[0])) + // if err != nil { + // return "", err + // } + + // appLoc = filepath.Join(dir, appLoc) + // } + if _, err := os.Stat(appLoc); os.IsNotExist(err) { + //check dist directory + appLoc = filepath.Join(staticDir, resourceDir) + // if !strings.HasPrefix(appLoc, "/") { + // // Prepend the binary's directory path if appLoc is relative + // dir, err := filepath.Abs(filepath.Dir(os.Args[0])) + // if err != nil { + // return "", err + // } + + // appLoc = filepath.Join(dir, appLoc) + // } + + if _, err := os.Stat(appLoc); os.IsNotExist(err) { + return "", err + } + } + + return appLoc, nil +} + +// Copy copies file. Will overwrite dst if dst exists. +func Copy(dst, src string) (err error) { + f, err := os.Open(src) + if err != nil { + return err + } + + defer func() { + cerr := f.Close() + if err == nil { + err = cerr + } + }() + + out, err := os.Create(dst) + if err != nil { + return err + } + + defer func() { + cerr := out.Close() + if err == nil { + err = cerr + } + }() + + _, err = io.Copy(out, f) + return +} + +// Exists checks whether the file exists in the file system +func Exists(fn string) (bool, error) { + _, err := os.Stat(fn) + if os.IsNotExist(err) { + return false, nil + } + if err != nil { + return false, err + } + return true, nil +} + +// IsWritable checks if the file is writable +func IsWritable(name string) bool { + f, err := os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + if err != nil && os.IsPermission(err) { + return false + } + f.Close() + return true +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/gziphandler/LICENSE b/vendor/github.com/skycoin/skycoin/src/util/gziphandler/LICENSE new file mode 100644 index 0000000000..da6d91b7ee --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/gziphandler/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2018 CJEnright +Copyright (c) 2020 Skycoin Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/src/util/gziphandler/gziphandler.go b/vendor/github.com/skycoin/skycoin/src/util/gziphandler/gziphandler.go new file mode 100644 index 0000000000..d76c329efe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/gziphandler/gziphandler.go @@ -0,0 +1,53 @@ +package gziphandler + +// https://gist.github.com/CJEnright/bc2d8b8dc0c1389a9feeddb110f822d7 + +import ( + "compress/gzip" + "io" + "io/ioutil" + "net/http" + "strings" + "sync" +) + +var gzPool = sync.Pool{ + New: func() interface{} { + w := gzip.NewWriter(ioutil.Discard) + return w + }, +} + +type gzipResponseWriter struct { + io.Writer + http.ResponseWriter +} + +func (w *gzipResponseWriter) WriteHeader(status int) { + w.Header().Del("Content-Length") + w.ResponseWriter.WriteHeader(status) +} + +func (w *gzipResponseWriter) Write(b []byte) (int, error) { + return w.Writer.Write(b) +} + +// New creates a gzip compression HTTP middleware +func New(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") { + next.ServeHTTP(w, r) + return + } + + w.Header().Set("Content-Encoding", "gzip") + + gz := gzPool.Get().(*gzip.Writer) + defer gzPool.Put(gz) + + gz.Reset(w) + defer gz.Close() + + next.ServeHTTP(&gzipResponseWriter{ResponseWriter: w, Writer: gz}, r) + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/http/error.go b/vendor/github.com/skycoin/skycoin/src/util/http/error.go new file mode 100644 index 0000000000..f9e157620c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/http/error.go @@ -0,0 +1,68 @@ +// Package httphelper provides HTTP related utility methods +package httphelper + +import ( + "fmt" + "net/http" +) + +// ErrorXXX writes an error message with status code +func ErrorXXX(w http.ResponseWriter, status int, msg string) { + httpMsg := fmt.Sprintf("%d %s", status, http.StatusText(status)) + if msg != "" { + httpMsg = fmt.Sprintf("%s - %s", httpMsg, msg) + } + + http.Error(w, httpMsg, status) +} + +// Error400 respond with a 400 error and include a message +func Error400(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusBadRequest, msg) +} + +// Error401 respond with a 401 error +func Error401(w http.ResponseWriter, auth, msg string) { + w.Header().Set("WWW-Authenticate", auth) + ErrorXXX(w, http.StatusUnauthorized, msg) +} + +// Error403 respond with a 403 error and include a message +func Error403(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusForbidden, msg) +} + +// Error404 respond with a 404 error and include a message +func Error404(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusNotFound, msg) +} + +// Error405 respond with a 405 error +func Error405(w http.ResponseWriter) { + ErrorXXX(w, http.StatusMethodNotAllowed, "") +} + +// Error415 respond with a 415 error +func Error415(w http.ResponseWriter) { + ErrorXXX(w, http.StatusUnsupportedMediaType, "") +} + +// Error422 response with a 422 error and include a message +func Error422(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusUnprocessableEntity, msg) +} + +// Error500 respond with a 500 error and include a message +func Error500(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusInternalServerError, msg) +} + +// Error501 respond with a 501 error +func Error501(w http.ResponseWriter) { + ErrorXXX(w, http.StatusNotImplemented, "") +} + +// Error503 respond with a 503 error and include a message +func Error503(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusServiceUnavailable, msg) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/http/json.go b/vendor/github.com/skycoin/skycoin/src/util/http/json.go new file mode 100644 index 0000000000..6ddedfdd9a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/http/json.go @@ -0,0 +1,190 @@ +package httphelper + +// Utilities for sending JSON + +import ( + "encoding/json" + "fmt" + "net/http" + "strconv" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/logging" +) + +// SendJSONOr500 writes an object as JSON, writing a 500 error if it fails +func SendJSONOr500(log *logging.Logger, w http.ResponseWriter, m interface{}) { + out, err := json.MarshalIndent(m, "", " ") + if err != nil { + Error500(w, "json.MarshalIndent failed") + return + } + + w.Header().Add("Content-Type", "application/json") + + if _, err := w.Write(out); err != nil { + log.WithError(err).Error("http Write failed") + } +} + +// Duration JSON type copied from https://github.com/vrischmann/jsonutil, MIT License + +// Duration is a wrapper around time.Duration which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the duration as a string in the format accepted by time.ParseDuration and returned by time.Duration.String. +type Duration struct { + time.Duration +} + +// FromDuration is a convenience factory to create a Duration instance from the +// given time.Duration value. +func FromDuration(d time.Duration) Duration { + return Duration{d} +} + +// MarshalJSON implements the json.Marshaler interface. The duration is a quoted-string in the format accepted by time.ParseDuration and returned by time.Duration.String. +func (d Duration) MarshalJSON() ([]byte, error) { + return []byte(`"` + d.String() + `"`), nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. The duration is expected to be a quoted-string of a duration in the format accepted by time.ParseDuration. +func (d *Duration) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + + tmp, err := time.ParseDuration(s) + if err != nil { + return err + } + + d.Duration = tmp + + return nil +} + +// Address is a wrapper around cipher.Address which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the address as a string +type Address struct { + cipher.Address +} + +// UnmarshalJSON unmarshals a string address to a cipher.Address +func (a *Address) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := cipher.DecodeBase58Address(s) + if err != nil { + return fmt.Errorf("invalid address: %v", err) + } + + a.Address = tmp + + return nil +} + +// MarshalJSON marshals a cipher.Address in its string representation +func (a Address) MarshalJSON() ([]byte, error) { + return []byte(`"` + a.Address.String() + `"`), nil +} + +// SHA256 is a wrapper around cipher.SHA256 which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the address as a string +type SHA256 struct { + cipher.SHA256 +} + +// UnmarshalJSON unmarshals a string address to a cipher.SHA256 +func (a *SHA256) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := cipher.SHA256FromHex(s) + if err != nil { + return fmt.Errorf("invalid SHA256 hash: %v", err) + } + + a.SHA256 = tmp + + return nil +} + +// MarshalJSON marshals a cipher.SHA256 in its string representation +func (a SHA256) MarshalJSON() ([]byte, error) { + return []byte(`"` + a.SHA256.Hex() + `"`), nil +} + +// Coins is a wrapper around uint64 which implements json.Unmarshaler and json.Marshaler. +// It unmarshals a fixed-point decimal string to droplets and vice versa +type Coins uint64 + +// UnmarshalJSON unmarshals a fixed-point decimal string to droplets +func (c *Coins) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := droplet.FromString(s) + if err != nil { + return err + } + + *c = Coins(tmp) + + return nil +} + +// MarshalJSON marshals droplets to a fixed-point decimal string +func (c Coins) MarshalJSON() ([]byte, error) { + s, err := droplet.ToString(uint64(c)) + if err != nil { + return nil, err + } + + return []byte(`"` + s + `"`), nil +} + +// Value returns the underlying uint64 value +func (c Coins) Value() uint64 { + return uint64(c) +} + +// Hours is a wrapper around uint64 which implements json.Unmarshaler and json.Marshaler. +// It unmarshals a fixed-point decimal string to droplets and vice versa +type Hours uint64 + +// UnmarshalJSON unmarshals a fixed-point decimal string to droplets +func (h *Hours) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return fmt.Errorf("invalid hours value: %v", err) + } + + *h = Hours(tmp) + + return nil +} + +// MarshalJSON marshals droplets to a fixed-point decimal string +func (h Hours) MarshalJSON() ([]byte, error) { + s := fmt.Sprint(h) + return []byte(`"` + s + `"`), nil +} + +// Value returns the underlying uint64 value +func (h Hours) Value() uint64 { + return uint64(h) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/http/log.go b/vendor/github.com/skycoin/skycoin/src/util/http/log.go new file mode 100644 index 0000000000..b89744bf76 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/http/log.go @@ -0,0 +1,75 @@ +package httphelper + +import ( + "bytes" + "encoding/json" + "net/http" + "strings" + "time" + + "github.com/sirupsen/logrus" +) + +type responseWithError struct { + Data *json.RawMessage `json:"data,omitempty"` + Error *struct { + Message string `json:"message"` + Code int `json:"code"` + } `json:"error,omitempty"` +} + +// ElapsedHandler records and logs an HTTP request with the elapsed time and status code +func ElapsedHandler(logger logrus.FieldLogger, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + lrw := newWrappedResponseWriter(w) + start := time.Now() + handler.ServeHTTP(lrw, r) + logMethod := logger.Infof + if lrw.statusCode >= 400 { + var errMsg string + if strings.Contains(r.URL.RequestURI(), "v2") { + rsp := responseWithError{} + err := json.NewDecoder(strings.NewReader(lrw.response.String())).Decode(&rsp) + // Incorrect URI address would return "404 Not Found" error, which would fail + // the json decoding. + if err != nil && strings.Contains(err.Error(), "json: cannot unmarshal") { + errMsg = lrw.response.String() + } else { + errMsg = rsp.Error.Message + } + } + + logMethod = logger.WithFields(logrus.Fields{ + "body": strings.TrimSpace(errMsg), + }).Errorf + } + logMethod("%d %s %s %s", lrw.statusCode, r.Method, r.URL.Path, time.Since(start)) + }) +} + +type wrappedResponseWriter struct { + http.ResponseWriter + statusCode int + response bytes.Buffer +} + +func newWrappedResponseWriter(w http.ResponseWriter) *wrappedResponseWriter { + return &wrappedResponseWriter{ + ResponseWriter: w, + statusCode: http.StatusOK, + response: bytes.Buffer{}, + } +} + +func (lrw *wrappedResponseWriter) WriteHeader(code int) { + lrw.statusCode = code + lrw.ResponseWriter.WriteHeader(code) +} + +func (lrw *wrappedResponseWriter) Write(buff []byte) (int, error) { + retVal, err := lrw.ResponseWriter.Write(buff) + if lrw.statusCode >= 400 { + lrw.response.Write(buff) + } + return retVal, err +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/iputil/iputil.go b/vendor/github.com/skycoin/skycoin/src/util/iputil/iputil.go new file mode 100644 index 0000000000..1dccbd9cd0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/iputil/iputil.go @@ -0,0 +1,66 @@ +/* +Package iputil provides IP address related utility methods +*/ +package iputil + +import ( + "errors" + "net" + "strconv" +) + +var ( + // ErrMissingIP IP missing from ip:port string + ErrMissingIP = errors.New("IP missing from ip:port address") + // ErrInvalidPort port invalid in ip:port string + ErrInvalidPort = errors.New("Port invalid in ip:port address") + // ErrNoLocalIP no localhost IP found in system net interfaces + ErrNoLocalIP = errors.New("No local IP found") +) + +// LocalhostIP returns the address for localhost on the machine +func LocalhostIP() (string, error) { + tt, err := net.Interfaces() + if err != nil { + return "", err + } + for _, t := range tt { + aa, err := t.Addrs() + if err != nil { + return "", err + } + for _, a := range aa { + if ipnet, ok := a.(*net.IPNet); ok && ipnet.IP.IsLoopback() { + return ipnet.IP.String(), nil + } + } + } + return "", ErrNoLocalIP +} + +// IsLocalhost returns true if addr is a localhost address +// Works for both ipv4 and ipv6 addresses. +func IsLocalhost(addr string) bool { + return net.ParseIP(addr).IsLoopback() || addr == "localhost" +} + +// SplitAddr splits an ip:port string to ip, port. +// Works for both ipv4 and ipv6 addresses. +// If the IP is not specified, returns an error. +func SplitAddr(addr string) (string, uint16, error) { + ip, port, err := net.SplitHostPort(addr) + if err != nil { + return "", 0, err + } + + if ip == "" { + return "", 0, ErrMissingIP + } + + port64, err := strconv.ParseUint(port, 10, 16) + if err != nil { + return "", 0, ErrInvalidPort + } + + return ip, uint16(port64), nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/mathutil/mathutil.go b/vendor/github.com/skycoin/skycoin/src/util/mathutil/mathutil.go new file mode 100644 index 0000000000..d1b7a191e7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/mathutil/mathutil.go @@ -0,0 +1,81 @@ +// Package mathutil provides math utilities +package mathutil + +import ( + "errors" + "math" +) + +var ( + // ErrUint64MultOverflow is returned if when multiplying uint64 values would overflow uint64 + ErrUint64MultOverflow = errors.New("uint64 multiplication overflow") + // ErrUint64AddOverflow is returned if when adding uint64 values would overflow uint64 + ErrUint64AddOverflow = errors.New("uint64 addition overflow") + // ErrUint32AddOverflow is returned if when adding uint32 values would overflow uint32 + ErrUint32AddOverflow = errors.New("uint32 addition overflow") + // ErrUint64OverflowsInt64 is returned if when converting a uint64 to an int64 would overflow int64 + ErrUint64OverflowsInt64 = errors.New("uint64 overflows int64") + // ErrInt64UnderflowsUint64 is returned if when converting an int64 to a uint64 would underflow uint64 + ErrInt64UnderflowsUint64 = errors.New("int64 underflows uint64") + // ErrIntUnderflowsUint32 is returned if when converting an int to a uint32 would underflow uint32 + ErrIntUnderflowsUint32 = errors.New("int underflows uint32") + // ErrIntOverflowsUint32 is returned if when converting an int to a uint32 would overflow uint32 + ErrIntOverflowsUint32 = errors.New("int overflows uint32") +) + +// MultUint64 multiplies a by b, returning an error if the values would overflow +func MultUint64(a, b uint64) (uint64, error) { + c := a * b + if a != 0 && c/a != b { + return 0, ErrUint64MultOverflow + } + return c, nil +} + +// AddUint64 adds a and b, returning an error if the values would overflow +func AddUint64(a, b uint64) (uint64, error) { + c := a + b + if c < a || c < b { + return 0, ErrUint64AddOverflow + } + return c, nil +} + +// AddUint32 adds a and b, returning an error if the values would overflow +func AddUint32(a, b uint32) (uint32, error) { + c := a + b + if c < a || c < b { + return 0, ErrUint32AddOverflow + } + return c, nil +} + +// Uint64ToInt64 converts a uint64 to an int64, returning an error if the uint64 value overflows int64 +func Uint64ToInt64(a uint64) (int64, error) { + b := int64(a) + if b < 0 { + return 0, ErrUint64OverflowsInt64 + } + return b, nil +} + +// Int64ToUint64 converts an int64 to a uint64, returning an error if the int64 value underflows uint64 +func Int64ToUint64(a int64) (uint64, error) { + if a < 0 { + return 0, ErrInt64UnderflowsUint64 + } + return uint64(a), nil +} + +// IntToUint32 converts int to uint32, returning an error if the int value is negative or overflows uint32 +func IntToUint32(a int) (uint32, error) { + if a < 0 { + return 0, ErrIntUnderflowsUint32 + } + + if uint64(a) > math.MaxUint32 { + return 0, ErrIntOverflowsUint32 + } + + return uint32(a), nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/timeutil/timeutil.go b/vendor/github.com/skycoin/skycoin/src/util/timeutil/timeutil.go new file mode 100644 index 0000000000..75486840ab --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/timeutil/timeutil.go @@ -0,0 +1,15 @@ +/* +Package timeutil provides time related utility methods +*/ +package timeutil + +import "time" + +// NanoToTime converts nanoseconds to time.Time +func NanoToTime(n int64) time.Time { + zeroTime := time.Time{} + if n == zeroTime.UnixNano() { + return zeroTime + } + return time.Unix(n/int64(time.Second), n%int64(time.Second)) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/useragent/useragent.go b/vendor/github.com/skycoin/skycoin/src/util/useragent/useragent.go new file mode 100644 index 0000000000..ed4ee381e5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/useragent/useragent.go @@ -0,0 +1,222 @@ +// Package useragent implements methods for managing Skycoin user agents. +// +// A skycoin user agent has the following format: +// +// `$NAME:$VERSION[$GIT_HASH]($REMARK)` +// +// `$NAME` and `$VERSION` are required. +// +// - `$NAME` is the coin or application's name, e.g. `Skycoin`. It can contain the following characters: `A-Za-z0-9\-_+`. +// - `$VERSION` must be a valid [semver](http://semver.org/) version, e.g. `1.2.3` or `1.2.3-rc1`. +// Semver has the option of including build metadata such as the git commit hash, but this is not included by the default client. +// - `$REMARK` is optional. If not present, the enclosing brackets `()` should be omitted. +// It can contain the following characters: `A-Za-z0-9\-_+;:!$%,.=?~ ` (includes the space character). +package useragent + +import ( + "encoding/json" + "errors" + "fmt" + "regexp" + "strings" + + "github.com/blang/semver" +) + +const ( + // IllegalChars are printable ascii characters forbidden from a user agent string. All other ascii or bytes are also forbidden. + IllegalChars = `<>&"'#@|{}` + "`" + // MaxLen the maximum length of a user agent + MaxLen = 256 + + // NamePattern is the regex pattern for the name portion of the user agent + NamePattern = `[A-Za-z0-9\-_+]+` + // VersionPattern is the regex pattern for the version portion of the user agent + VersionPattern = `[0-9]+\.[0-9]+\.[0-9][A-Za-z0-9\-.+]*` + // RemarkPattern is the regex pattern for the remark portion of the user agent + RemarkPattern = `[A-Za-z0-9\-_+;:!$%,.=?~ ]+` + + // Pattern is the regex pattern for the user agent in entirety + Pattern = `^(` + NamePattern + `):(` + VersionPattern + `)(\(` + RemarkPattern + `\))?$` +) + +var ( + illegalCharsSanitizeRe *regexp.Regexp + illegalCharsCheckRe *regexp.Regexp + re *regexp.Regexp + + // ErrIllegalChars user agent contains illegal characters + ErrIllegalChars = errors.New("User agent has invalid character(s)") + // ErrTooLong user agent exceeds a certain max length + ErrTooLong = errors.New("User agent is too long") + // ErrMalformed user agent does not match the user agent pattern + ErrMalformed = errors.New("User agent is malformed") + // ErrEmpty user agent is an empty string + ErrEmpty = errors.New("User agent is an empty string") +) + +func init() { + illegalCharsSanitizeRe = regexp.MustCompile(fmt.Sprintf("([^[:print:]]|[%s])+", IllegalChars)) + illegalCharsCheckRe = regexp.MustCompile(fmt.Sprintf("[^[:print:]]|[%s]", IllegalChars)) + re = regexp.MustCompile(Pattern) +} + +// Data holds parsed user agent data +type Data struct { + Coin string + Version string + Remark string +} + +// Empty returns true if the Data is empty +func (d Data) Empty() bool { + return d == (Data{}) +} + +// Build builds a user agent string. Returns an error if the user agent would be invalid. +func (d Data) Build() (string, error) { + if d.Coin == "" { + return "", errors.New("missing coin name") + } + if d.Version == "" { + return "", errors.New("missing version") + } + + _, err := semver.Parse(d.Version) + if err != nil { + return "", err + } + + s := d.build() + + if err := validate(s); err != nil { + return "", err + } + + d2, err := Parse(s) + if err != nil { + return "", fmt.Errorf("Built a user agent that fails to parse: %q %v", s, err) + } + + if d2 != d { + return "", errors.New("Built a user agent that does not parse to the original format") + } + + return s, nil +} + +// MustBuild calls Build and panics on error +func (d Data) MustBuild() string { + s, err := d.Build() + if err != nil { + panic(err) + } + return s +} + +func (d Data) build() string { + if d.Coin == "" || d.Version == "" { + return "" + } + + remark := d.Remark + if remark != "" { + remark = fmt.Sprintf("(%s)", remark) + } + + return fmt.Sprintf("%s:%s%s", d.Coin, d.Version, remark) +} + +// MarshalJSON marshals Data as JSON +func (d Data) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, d.build())), nil +} + +// UnmarshalJSON unmarshals []byte to Data +func (d *Data) UnmarshalJSON(v []byte) error { + var s string + if err := json.Unmarshal(v, &s); err != nil { + return err + } + + if s == "" { + return nil + } + + parsed, err := Parse(s) + if err != nil { + return err + } + + *d = parsed + return nil +} + +// Parse parses a user agent string to Data +func Parse(userAgent string) (Data, error) { + if len(userAgent) == 0 { + return Data{}, ErrEmpty + } + + if err := validate(userAgent); err != nil { + return Data{}, err + } + + subs := re.FindAllStringSubmatch(userAgent, -1) + + if len(subs) == 0 { + return Data{}, ErrMalformed + } + + m := subs[0] + + if m[0] != userAgent { + // This should not occur since the pattern has ^$ boundaries applied, but just in case + return Data{}, errors.New("User agent did not match pattern completely") + } + + coin := m[1] + version := m[2] + remark := m[3] + + if _, err := semver.Parse(version); err != nil { + return Data{}, fmt.Errorf("User agent version is not a valid semver: %v", err) + } + + remark = strings.TrimPrefix(remark, "(") + remark = strings.TrimSuffix(remark, ")") + + return Data{ + Coin: coin, + Version: version, + Remark: remark, + }, nil +} + +// MustParse parses and panics on error +func MustParse(userAgent string) Data { + d, err := Parse(userAgent) + if err != nil { + panic(err) + } + + return d +} + +// validate validates a user agent string. The user agent must not contain illegal characters. +func validate(userAgent string) error { + if len(userAgent) > MaxLen { + return ErrTooLong + } + + if illegalCharsCheckRe.MatchString(userAgent) { + return ErrIllegalChars + } + + return nil +} + +// Sanitize removes illegal characters from a user agent string +func Sanitize(userAgent string) string { + return illegalCharsSanitizeRe.ReplaceAllLiteralString(userAgent, "") +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockchain.go b/vendor/github.com/skycoin/skycoin/src/visor/blockchain.go new file mode 100644 index 0000000000..990d2f379c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockchain.go @@ -0,0 +1,853 @@ +package visor + +import ( + "bytes" + "errors" + "fmt" + "sync" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/transaction" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +const ( + // DebugLevel1 checks for extremely unlikely conditions (10e-40) + DebugLevel1 = true + // DebugLevel2 enable checks for impossible conditions + DebugLevel2 = true +) + +var ( + // ErrVerifyStopped is returned when database verification is interrupted + ErrVerifyStopped = errors.New("database verification stopped") +) + +// ErrBlockNotExist may be returned if a block is not found +type ErrBlockNotExist struct { + Seq uint64 +} + +// NewErrBlockNotExist creates an ErrBlockNotExist based on an unknown block sequence +func NewErrBlockNotExist(seq uint64) ErrBlockNotExist { + return ErrBlockNotExist{ + Seq: seq, + } +} + +func (e ErrBlockNotExist) Error() string { + return fmt.Sprintf("block does not exist seq=%d", e.Seq) +} + +//Warning: 10e6 is 10 million, 1e6 is 1 million + +// Note: DebugLevel1 adds additional checks for hash collisions that +// are unlikely to occur. DebugLevel2 adds checks for conditions that +// can only occur through programmer error and malice. + +// Note: a droplet is the base coin unit. Each Skycoin is one million droplets + +//Termonology: +// UXTO - unspent transaction outputs +// UX - outputs10 +// TX - transactions + +//Notes: +// transactions (TX) consume outputs (UX) and produce new outputs (UX) +// Tx.Uxi() - set of outputs consumed by transaction +// Tx.Uxo() - set of outputs created by transaction + +// chainStore +type chainStore interface { + Head(*dbutil.Tx) (*coin.SignedBlock, error) + HeadSeq(*dbutil.Tx) (uint64, bool, error) + Len(*dbutil.Tx) (uint64, error) + AddBlock(*dbutil.Tx, *coin.SignedBlock) error + GetBlockByHash(*dbutil.Tx, cipher.SHA256) (*coin.Block, error) + GetSignedBlockByHash(*dbutil.Tx, cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(*dbutil.Tx, uint64) (*coin.SignedBlock, error) + UnspentPool() blockdb.UnspentPooler + GetGenesisBlock(*dbutil.Tx) (*coin.SignedBlock, error) + GetBlockSignature(*dbutil.Tx, *coin.Block) (cipher.Sig, bool, error) + ForEachBlock(*dbutil.Tx, func(*coin.Block) error) error +} + +// DefaultWalker default blockchain walker +func DefaultWalker(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + if len(hps) == 0 { + return cipher.SHA256{}, false + } + return hps[0].Hash, true +} + +// CreateBuckets creates the buckets used by the blockdb +func CreateBuckets(db *dbutil.DB) error { + return db.Update("CreateBuckets", func(tx *dbutil.Tx) error { + if err := historydb.CreateBuckets(tx); err != nil { + return err + } + + if err := blockdb.CreateBuckets(tx); err != nil { + return err + } + + return dbutil.CreateBuckets(tx, [][]byte{ + UnconfirmedTxnsBkt, + UnconfirmedUnspentsBkt, + }) + }) +} + +// BlockchainConfig configures Blockchain options +type BlockchainConfig struct { + // Arbitrating mode: if in arbitrating mode, when block publishing node execute blocks, + // the invalid transaction will be skipped and continue the next; otherwise, + // node will throw the error and return. + Arbitrating bool + Pubkey cipher.PubKey +} + +// Blockchain maintains blockchain and provides apis for accessing the chain. +type Blockchain struct { + db *dbutil.DB + cfg BlockchainConfig + store chainStore +} + +// NewBlockchain creates a Blockchain +func NewBlockchain(db *dbutil.DB, cfg BlockchainConfig) (*Blockchain, error) { + chainstore, err := blockdb.NewBlockchain(db, DefaultWalker) + if err != nil { + return nil, err + } + + return &Blockchain{ + cfg: cfg, + db: db, + store: chainstore, + }, nil +} + +// GetGenesisBlock returns genesis block +func (bc *Blockchain) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.store.GetGenesisBlock(tx) +} + +// GetSignedBlockByHash returns block of given hash +func (bc *Blockchain) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + return bc.store.GetSignedBlockByHash(tx, hash) +} + +// GetSignedBlockBySeq returns block of given seq +func (bc *Blockchain) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + return bc.store.GetSignedBlockBySeq(tx, seq) +} + +// Head returns the most recent confirmed block +func (bc Blockchain) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.store.Head(tx) +} + +// Unspent returns the unspent outputs pool +func (bc *Blockchain) Unspent() blockdb.UnspentPooler { + return bc.store.UnspentPool() +} + +// Len returns the length of current blockchain. +func (bc Blockchain) Len(tx *dbutil.Tx) (uint64, error) { + return bc.store.Len(tx) +} + +// HeadSeq returns the sequence of head block +func (bc *Blockchain) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + return bc.store.HeadSeq(tx) +} + +// Time returns time of last block +// used as system clock indepedent clock for coin hour calculations +// TODO: Deprecate +func (bc *Blockchain) Time(tx *dbutil.Tx) (uint64, error) { + b, err := bc.Head(tx) + if err != nil { + if err == blockdb.ErrNoHeadBlock { + return 0, nil + } + return 0, err + } + + return b.Time(), nil +} + +// NewBlock creates a Block given an array of Transactions. +// Only hard constraints are applied to transactions in the block. +// The caller of this function should apply any additional soft constraints, +// and choose which transactions to place into the block. +func (bc Blockchain) NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) { + if len(txns) == 0 { + return nil, errors.New("No transactions") + } + + head, err := bc.store.Head(tx) + if err != nil { + return nil, err + } + + if currentTime <= head.Time() { + return nil, errors.New("Time can only move forward") + } + + txns, err = bc.processTransactions(tx, txns) + if err != nil { + return nil, err + } + + uxHash, err := bc.Unspent().GetUxHash(tx) + if err != nil { + return nil, err + } + + feeCalc := bc.TransactionFee(tx, head.Time()) + + b, err := coin.NewBlock(head.Block, currentTime, uxHash, txns, feeCalc) + if err != nil { + return nil, err + } + + // make sure block is valid + if DebugLevel2 { + if err := bc.verifyBlockHeader(tx, *b); err != nil { + return nil, err + } + txns, err := bc.processTransactions(tx, b.Body.Transactions) + if err != nil { + logger.Panicf("bc.processTransactions second verification call failed: %v", err) + } + b.Body.Transactions = txns + } + return b, nil +} + +func (bc *Blockchain) processBlock(tx *dbutil.Tx, b coin.SignedBlock) (coin.SignedBlock, error) { + length, err := bc.Len(tx) + if err != nil { + return coin.SignedBlock{}, err + } + + if length > 0 { + if isGenesis, err := bc.isGenesisBlock(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } else if isGenesis { + err := errors.New("Attempted to process genesis block after blockchain has genesis block") + logger.Warning(err.Error()) + return coin.SignedBlock{}, err + } else { + if err := bc.verifyBlockHeader(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } + + txns, err := bc.processTransactions(tx, b.Body.Transactions) + if err != nil { + return coin.SignedBlock{}, err + } + b.Body.Transactions = txns + + if err := bc.verifyUxHash(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } + + } + } + + return b, nil +} + +// ExecuteBlock attempts to append block to blockchain with *dbutil.Tx +func (bc *Blockchain) ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + length, err := bc.Len(tx) + if err != nil { + return err + } + + if length > 0 { + head, err := bc.Head(tx) + if err != nil { + return err + } + + // TODO -- why do we modify the block here? + sb.Head.PrevHash = head.HashHeader() + } + + nb, err := bc.processBlock(tx, *sb) + if err != nil { + return err + } + + if err := bc.store.AddBlock(tx, &nb); err != nil { + return err + } + + return nil +} + +// VerifyBlock verifies specified block against current state of blockchain. +func (bc *Blockchain) VerifyBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + _, err := bc.processBlock(tx, *sb) + + return err +} + +// isGenesisBlock checks if the block is genesis block +func (bc Blockchain) isGenesisBlock(tx *dbutil.Tx, b coin.Block) (bool, error) { + gb, err := bc.store.GetGenesisBlock(tx) + if err != nil { + return false, err + } + if gb == nil { + return false, nil + } + + return gb.HashHeader() == b.HashHeader(), nil +} + +// Compares the state of the current UxHash hash to state of unspent +// output pool. +func (bc Blockchain) verifyUxHash(tx *dbutil.Tx, b coin.Block) error { + uxHash, err := bc.Unspent().GetUxHash(tx) + if err != nil { + return err + } + + if !bytes.Equal(b.Head.UxHash[:], uxHash[:]) { + return errors.New("UxHash does not match") + } + + return nil +} + +// VerifyBlockTxnConstraints checks that the transaction does not violate hard constraints, +// for transactions that are already included in a block. +func (bc Blockchain) VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + switch err.(type) { + case blockdb.ErrUnspentNotExist: + return transaction.NewErrTxnViolatesHardConstraint(err) + default: + return err + } + } + + head, err := bc.Head(tx) + if err != nil { + return err + } + + return bc.verifyBlockTxnHardConstraints(tx, txn, head, uxIn) +} + +func (bc Blockchain) verifyBlockTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { + if err := transaction.VerifyBlockTxnConstraints(txn, head.Head, uxIn); err != nil { + return err + } + + if DebugLevel1 { + // Check that new unspents don't collide with existing. + // This should not occur but is a sanity check. + // NOTE: this is not in the top-level VerifyBlockTxnConstraints + // because it relies on the unspent pool to check for existence. + // For remote callers such as the CLI, they'd need to download the whole + // unspent pool or make a separate API call to check for duplicate unspents. + uxOuts := coin.CreateUnspents(head.Head, txn) + for i := range uxOuts { + if contains, err := bc.Unspent().Contains(tx, uxOuts[i].Hash()); err != nil { + return err + } else if contains { + err := errors.New("New unspent collides with existing unspent") + return transaction.NewErrTxnViolatesHardConstraint(err) + } + } + } + + return nil +} + +// VerifySingleTxnHardConstraints checks that the transaction does not violate hard constraints. +// for transactions that are not included in a block. +func (bc Blockchain) VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, signed transaction.TxnSignedFlag) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + switch err.(type) { + case blockdb.ErrUnspentNotExist: + return transaction.NewErrTxnViolatesHardConstraint(err) + default: + return err + } + } + + head, err := bc.Head(tx) + if err != nil { + return err + } + + return bc.verifySingleTxnHardConstraints(tx, txn, head, uxIn, signed) +} + +// VerifySingleTxnSoftHardConstraints checks that the transaction does not violate hard or soft constraints, +// for transactions that are not included in a block. +// Hard constraints are checked before soft constraints. +func (bc Blockchain) VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn, signed transaction.TxnSignedFlag) (*coin.SignedBlock, coin.UxArray, error) { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + return nil, nil, transaction.NewErrTxnViolatesHardConstraint(err) + } + + head, err := bc.Head(tx) + if err != nil { + return nil, nil, err + } + + // Hard constraints must be checked before soft constraints + if err := bc.verifySingleTxnHardConstraints(tx, txn, head, uxIn, signed); err != nil { + return nil, nil, err + } + + if err := transaction.VerifySingleTxnSoftConstraints(txn, head.Time(), uxIn, distParams, verifyParams); err != nil { + return nil, nil, err + } + + return head, uxIn, nil +} + +func (bc Blockchain) verifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray, signed transaction.TxnSignedFlag) error { + if err := transaction.VerifySingleTxnHardConstraints(txn, head.Head, uxIn, signed); err != nil { + return err + } + + if DebugLevel1 { + // Check that new unspents don't collide with existing. + // This should not occur but is a sanity check. + // NOTE: this is not in the top-level VerifySingleTxnHardConstraints + // because it relies on the unspent pool to check for existence. + // For remote callers such as the CLI, they'd need to download the whole + // unspent pool or make a separate API call to check for duplicate unspents. + uxOuts := coin.CreateUnspents(head.Head, txn) + for i := range uxOuts { + if contains, err := bc.Unspent().Contains(tx, uxOuts[i].Hash()); err != nil { + return err + } else if contains { + err := errors.New("New unspent collides with existing unspent") + return transaction.NewErrTxnViolatesHardConstraint(err) + } + } + } + + return nil +} + +// GetBlocks returns blocks matching seqs. If any block is not found, returns an error. +func (bc Blockchain) GetBlocks(tx *dbutil.Tx, seqs []uint64) ([]coin.SignedBlock, error) { + blocks := make([]coin.SignedBlock, len(seqs)) + + for i, s := range seqs { + b, err := bc.store.GetSignedBlockBySeq(tx, s) + if err != nil { + return nil, err + } + + if b == nil { + return nil, NewErrBlockNotExist(s) + } + + blocks[i] = *b + } + + return blocks, nil +} + +// GetBlocksInRange return blocks whose seq are in the range of start and end. +func (bc Blockchain) GetBlocksInRange(tx *dbutil.Tx, start, end uint64) ([]coin.SignedBlock, error) { + if start > end { + return nil, nil + } + + var blocks []coin.SignedBlock + for i := start; i <= end; i++ { + b, err := bc.store.GetSignedBlockBySeq(tx, i) + if err != nil { + logger.WithError(err).Error("bc.store.GetSignedBlockBySeq failed") + return nil, err + } + + if b == nil { + break + } + + blocks = append(blocks, *b) + } + + return blocks, nil +} + +// GetLastBlocks return the latest N blocks. +func (bc Blockchain) GetLastBlocks(tx *dbutil.Tx, num uint64) ([]coin.SignedBlock, error) { + if num == 0 { + return nil, nil + } + + end, ok, err := bc.HeadSeq(tx) + if err != nil { + return nil, err + } + if !ok { + return nil, nil + } + + start := int(end-num) + 1 + if start < 0 { + start = 0 + } + + return bc.GetBlocksInRange(tx, uint64(start), end) +} + +/* Private */ + +// Validates a set of Transactions, individually, against each other and +// against the Blockchain. If firstFail is true, it will return an error +// as soon as it encounters one. Else, it will return an array of +// Transactions that are valid as a whole. It may return an error if +// firstFalse is false, if there is no way to filter the txns into a valid +// array, i.e. processTransactions(processTransactions(txn, false), true) +// should not result in an error, unless all txns are invalid. +// TODO: +// - move arbitration to visor +// - blockchain should have strict checking +func (bc Blockchain) processTransactions(tx *dbutil.Tx, txs coin.Transactions) (coin.Transactions, error) { + // copy txs so that the following code won't modify the original txns + txns := make(coin.Transactions, len(txs)) + copy(txns, txs) + + head, err := bc.store.Head(tx) + if err != nil { + return nil, err + } + + // Transactions need to be sorted by fee and hash before arbitrating + if bc.cfg.Arbitrating { + txns, err = coin.SortTransactions(txns, bc.TransactionFee(tx, head.Time())) + if err != nil { + logger.Critical().WithError(err).Error("processTransactions: coin.SortTransactions failed") + return nil, err + } + } + + //TODO: audit + if len(txns) == 0 { + if bc.cfg.Arbitrating { + return txns, nil + } + + // If there are no transactions, a block should not be made + return nil, errors.New("No transactions") + } + + skip := make(map[int]struct{}) + uxHashes := make(coin.UxHashSet, len(txns)) + for i, txn := range txns { + // Check the transaction against itself. This covers the hash, + // signature indices and duplicate spends within itself + if err := bc.VerifyBlockTxnConstraints(tx, txn); err != nil { + switch err.(type) { + case transaction.ErrTxnViolatesSoftConstraint: + logger.Critical().WithError(err).Panic("bc.VerifyBlockTxnConstraints should not return a ErrTxnViolatesSoftConstraint error") + case transaction.ErrTxnViolatesHardConstraint: + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } + } + + return nil, err + } + + // Check that each pending unspent will be unique + uxb := coin.UxBody{ + SrcTransaction: txn.Hash(), + } + + for _, to := range txn.Out { + uxb.Coins = to.Coins + uxb.Hours = to.Hours + uxb.Address = to.Address + + h := uxb.Hash() + _, exists := uxHashes[h] + if exists { + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } else { + return nil, errors.New("Duplicate unspent output across transactions") + } + } + + if DebugLevel1 { + // Check that the expected unspent is not already in the pool. + // This should never happen because its a hash collision + if contains, err := bc.Unspent().Contains(tx, h); err != nil { + return nil, err + } else if contains { + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } else { + return nil, errors.New("Output hash is in the UnspentPool") + } + } + } + + uxHashes[h] = struct{}{} + } + } + + // Filter invalid transactions before arbitrating between colliding ones + if len(skip) > 0 { + newtxns := make(coin.Transactions, len(txns)-len(skip)) + j := 0 + for i := range txns { + if _, shouldSkip := skip[i]; !shouldSkip { + newtxns[j] = txns[i] + j++ + } + } + txns = newtxns + skip = make(map[int]struct{}) + } + + // Check to ensure that there are no duplicate spends in the entire block, + // and that we aren't creating duplicate outputs. Duplicate outputs + // within a single Transaction are already checked by VerifyBlockTxnConstraints + hashes := txns.Hashes() + for i := 0; i < len(txns)-1; i++ { + s := txns[i] + for j := i + 1; j < len(txns); j++ { + t := txns[j] + if DebugLevel1 { + if hashes[i] == hashes[j] { + // This is a non-recoverable error for filtering, and + // should never occur. It indicates a hash collision + // amongst different txns. Duplicate transactions are + // caught earlier, when duplicate expected outputs are + // checked for, and will not trigger this. + return nil, errors.New("Unexpected duplicate transaction") + } + } + for a := range s.In { + for b := range t.In { + if s.In[a] == t.In[b] { + if bc.cfg.Arbitrating { + // The txn with the highest fee and lowest hash + // is chosen when attempting a double spend. + // Since the txns are sorted, we skip the 2nd + // iterable + skip[j] = struct{}{} + } else { + return nil, errors.New("Cannot spend output twice in the same block") + } + } + } + } + } + } + + // Filter the final results, if necessary + if len(skip) > 0 { + newtxns := make(coin.Transactions, 0, len(txns)-len(skip)) + for i := range txns { + if _, shouldSkip := skip[i]; !shouldSkip { + newtxns = append(newtxns, txns[i]) + } + } + return newtxns, nil + } + + return txns, nil +} + +// TransactionFee calculates the current transaction fee in coinhours of a Transaction +func (bc Blockchain) TransactionFee(tx *dbutil.Tx, headTime uint64) coin.FeeCalculator { + return func(txn *coin.Transaction) (uint64, error) { + inUxs, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + return 0, err + } + + return fee.TransactionFee(txn, headTime, inUxs) + } +} + +// VerifySignature checks that BlockSigs state correspond with coin.Blockchain state +// and that all signatures are valid. +func (bc *Blockchain) VerifySignature(block *coin.SignedBlock) error { + err := block.VerifySignature(bc.cfg.Pubkey) + if err != nil { + logger.Errorf("Blockchain signature verification failed for block %d: %v", block.Head.BkSeq, err) + } + return err +} + +// WalkChain walk through the blockchain concurrently +// The quit channel is optional and if closed, this method still stop. +func (bc *Blockchain) WalkChain(workers int, f func(*dbutil.Tx, *coin.SignedBlock) error, quit chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + signedBlockC := make(chan *coin.SignedBlock, 100) + errC := make(chan error, 100) + interrupt := make(chan struct{}) + verifyDone := make(chan struct{}) + + // Verify block signatures in a worker pool + var workerWg sync.WaitGroup + workerWg.Add(workers) + for i := 0; i < workers; i++ { + go func() { + defer workerWg.Done() + if err := bc.db.View("WalkChain verify blocks", func(tx *dbutil.Tx) error { + for b := range signedBlockC { + if err := f(tx, b); err != nil { + // if err := cipher.VerifyPubKeySignedHash(bc.cfg.Pubkey, sh.sig, sh.hash); err != nil { + // logger.Errorf("Signature verification failed: %v", err) + select { + case errC <- err: + default: + } + } + } + return nil + }); err != nil { + logger.WithError(err).Error("WalkChain verify blocks db transaction failed") + } + }() + } + + // Wait for verification worker goroutines to finish + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + workerWg.Wait() + close(verifyDone) + }() + + // Iterate all blocks stored in the "blocks" bucket + // * Detect if a corresponding signature is missing from the signatures bucket + // * Verify the signature for the block + wg.Add(1) + go func() { + if err := bc.db.View("WalkChain get blocks", func(tx *dbutil.Tx) error { + if length, err := bc.Len(tx); err != nil { + return err + } else if length == 0 { + return nil + } + defer wg.Done() + defer close(signedBlockC) + + errInterrupted := errors.New("goroutine was stopped") + + if err := bc.store.ForEachBlock(tx, func(block *coin.Block) error { + sig, ok, err := bc.store.GetBlockSignature(tx, block) + if err != nil { + return err + } + if !ok { + return blockdb.NewErrMissingSignature(block) + } + + signedBlock := &coin.SignedBlock{ + Sig: sig, + Block: *block, + } + + select { + case signedBlockC <- signedBlock: + return nil + case <-quit: + return errInterrupted + case <-interrupt: + return errInterrupted + } + }); err != nil && err != errInterrupted { + switch err.(type) { + case blockdb.ErrMissingSignature: + default: + logger.Errorf("bc.store.ForEachBlock failed: %v", err) + } + select { + case errC <- err: + default: + } + } + return nil + }); err != nil { + logger.WithError(err).Error("WalkChain get blocks db transaction failed") + } + }() + + var err error + select { + case err = <-errC: + if err != nil { + break + } + case <-quit: + err = ErrVerifyStopped + break + case <-verifyDone: + break + } + + close(interrupt) + wg.Wait() + return err +} + +// VerifyBlockHeader Returns error if the BlockHeader is not valid +func (bc Blockchain) verifyBlockHeader(tx *dbutil.Tx, b coin.Block) error { + head, err := bc.Head(tx) + if err != nil { + return err + } + + //check BkSeq + if b.Head.BkSeq != head.Head.BkSeq+1 { + return errors.New("BkSeq invalid") + } + //check Time, only requirement is that its monotonely increasing + if b.Head.Time <= head.Head.Time { + return errors.New("Block time must be > head time") + } + // Check block hash against previous head + if b.Head.PrevHash != head.HashHeader() { + return errors.New("PrevHash does not match current head") + } + + if b.Body.Hash() != b.Head.BodyHash { + return errors.New("Computed body hash does not match") + } + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_skyencoder.go new file mode 100644 index 0000000000..b1a77bca48 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_skyencoder.go @@ -0,0 +1,513 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" +) + +// encodeSizeBlock computes the size of an encoded object of type Block +func encodeSizeBlock(obj *coin.Block) uint64 { + i0 := uint64(0) + + // obj.Head.Version + i0 += 4 + + // obj.Head.Time + i0 += 8 + + // obj.Head.BkSeq + i0 += 8 + + // obj.Head.Fee + i0 += 8 + + // obj.Head.PrevHash + i0 += 32 + + // obj.Head.BodyHash + i0 += 32 + + // obj.Head.UxHash + i0 += 32 + + // obj.Body.Transactions + i0 += 4 + for _, x1 := range obj.Body.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + return i0 +} + +// encodeBlock encodes an object of type Block to a buffer allocated to the exact size +// required to encode the object. +func encodeBlock(obj *coin.Block) ([]byte, error) { + n := encodeSizeBlock(obj) + buf := make([]byte, n) + + if err := encodeBlockToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeBlockToBuffer encodes an object of type Block to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeBlockToBuffer(buf []byte, obj *coin.Block) error { + if uint64(len(buf)) < encodeSizeBlock(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Head.Version + e.Uint32(obj.Head.Version) + + // obj.Head.Time + e.Uint64(obj.Head.Time) + + // obj.Head.BkSeq + e.Uint64(obj.Head.BkSeq) + + // obj.Head.Fee + e.Uint64(obj.Head.Fee) + + // obj.Head.PrevHash + e.CopyBytes(obj.Head.PrevHash[:]) + + // obj.Head.BodyHash + e.CopyBytes(obj.Head.BodyHash[:]) + + // obj.Head.UxHash + e.CopyBytes(obj.Head.UxHash[:]) + + // obj.Body.Transactions maxlen check + if len(obj.Body.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Body.Transactions length check + if uint64(len(obj.Body.Transactions)) > math.MaxUint32 { + return errors.New("obj.Body.Transactions length exceeds math.MaxUint32") + } + + // obj.Body.Transactions length + e.Uint32(uint32(len(obj.Body.Transactions))) + + // obj.Body.Transactions + for _, x := range obj.Body.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + return nil +} + +// decodeBlock decodes an object of type Block from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeBlock(buf []byte, obj *coin.Block) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Head.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Head.Version = i + } + + { + // obj.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.Time = i + } + + { + // obj.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.BkSeq = i + } + + { + // obj.Head.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.Fee = i + } + + { + // obj.Head.PrevHash + if len(d.Buffer) < len(obj.Head.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Head.PrevHash[:], d.Buffer[:len(obj.Head.PrevHash)]) + d.Buffer = d.Buffer[len(obj.Head.PrevHash):] + } + + { + // obj.Head.BodyHash + if len(d.Buffer) < len(obj.Head.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Head.BodyHash[:], d.Buffer[:len(obj.Head.BodyHash)]) + d.Buffer = d.Buffer[len(obj.Head.BodyHash):] + } + + { + // obj.Head.UxHash + if len(d.Buffer) < len(obj.Head.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Head.UxHash[:], d.Buffer[:len(obj.Head.UxHash)]) + d.Buffer = d.Buffer[len(obj.Head.UxHash):] + } + + { + // obj.Body.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions = make([]coin.Transaction, length) + + for z2 := range obj.Body.Transactions { + { + // obj.Body.Transactions[z2].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Length = i + } + + { + // obj.Body.Transactions[z2].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Type = i + } + + { + // obj.Body.Transactions[z2].InnerHash + if len(d.Buffer) < len(obj.Body.Transactions[z2].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].InnerHash[:], d.Buffer[:len(obj.Body.Transactions[z2].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].InnerHash):] + } + + { + // obj.Body.Transactions[z2].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions[z2].Sigs = make([]cipher.Sig, length) + + for z4 := range obj.Body.Transactions[z2].Sigs { + { + // obj.Body.Transactions[z2].Sigs[z4] + if len(d.Buffer) < len(obj.Body.Transactions[z2].Sigs[z4]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].Sigs[z4][:], d.Buffer[:len(obj.Body.Transactions[z2].Sigs[z4])]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].Sigs[z4]):] + } + + } + } + } + + { + // obj.Body.Transactions[z2].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions[z2].In = make([]cipher.SHA256, length) + + for z4 := range obj.Body.Transactions[z2].In { + { + // obj.Body.Transactions[z2].In[z4] + if len(d.Buffer) < len(obj.Body.Transactions[z2].In[z4]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].In[z4][:], d.Buffer[:len(obj.Body.Transactions[z2].In[z4])]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].In[z4]):] + } + + } + } + } + + { + // obj.Body.Transactions[z2].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions[z2].Out = make([]coin.TransactionOutput, length) + + for z4 := range obj.Body.Transactions[z2].Out { + { + // obj.Body.Transactions[z2].Out[z4].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Out[z4].Address.Version = i + } + + { + // obj.Body.Transactions[z2].Out[z4].Address.Key + if len(d.Buffer) < len(obj.Body.Transactions[z2].Out[z4].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].Out[z4].Address.Key[:], d.Buffer[:len(obj.Body.Transactions[z2].Out[z4].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].Out[z4].Address.Key):] + } + + { + // obj.Body.Transactions[z2].Out[z4].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Out[z4].Coins = i + } + + { + // obj.Body.Transactions[z2].Out[z4].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Out[z4].Hours = i + } + + } + } + } + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeBlockExact decodes an object of type Block from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeBlockExact(buf []byte, obj *coin.Block) error { + if n, err := decodeBlock(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_tree.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_tree.go new file mode 100644 index 0000000000..a7b315e0e8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_tree.go @@ -0,0 +1,269 @@ +package blockdb + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + errBlockExist = errors.New("block already exists") + errNoParent = errors.New("block is not genesis and has no parent") + errWrongParent = errors.New("wrong parent") + errHasChild = errors.New("remove block failed, it has children") + + // BlocksBkt holds coin.Blocks + BlocksBkt = []byte("blocks") + // TreeBkt maps block height to a (prev, hash) pair for a block + TreeBkt = []byte("block_tree") +) + +// Walker function for go through blockchain +type Walker func(*dbutil.Tx, []coin.HashPair) (cipher.SHA256, bool) + +// blockTree use the blockdb store all blocks and maintains the block tree struct. +type blockTree struct{} + +// AddBlock adds block with *dbutil.Tx +func (bt *blockTree) AddBlock(tx *dbutil.Tx, b *coin.Block) error { + // can't store block if it's not genesis block and has no parent. + if b.Seq() > 0 && b.Head.PrevHash.Null() { + return errNoParent + } + + // check if the block already exists. + hash := b.HashHeader() + if ok, err := dbutil.BucketHasKey(tx, BlocksBkt, hash[:]); err != nil { + return err + } else if ok { + return errBlockExist + } + + // write block into blocks bucket. + buf, err := encodeBlock(b) + if err != nil { + return err + } + + if err := dbutil.PutBucketValue(tx, BlocksBkt, hash[:], buf); err != nil { + return err + } + + // the pre hash must be in depth - 1. + if b.Seq() > 0 { + parentHashPair, err := getHashPairInDepth(tx, b.Seq()-1, func(hp coin.HashPair) bool { + return hp.Hash == b.Head.PrevHash + }) + if err != nil { + return err + } + if len(parentHashPair) == 0 { + return errWrongParent + } + } + + hp := coin.HashPair{ + Hash: hash, + PrevHash: b.Head.PrevHash, + } + + // get block pairs in the depth + hashPairs, err := getHashPairInDepth(tx, b.Seq(), allPairs) + if err != nil { + return err + } + + if len(hashPairs) == 0 { + // no hash pair exist in the depth. + // write the hash pair into tree. + return setHashPairInDepth(tx, b.Seq(), []coin.HashPair{hp}) + } + + // check dup block + if containHash(hashPairs, hp) { + return errBlockExist + } + + hashPairs = append(hashPairs, hp) + return setHashPairInDepth(tx, b.Seq(), hashPairs) +} + +// RemoveBlock remove block from blocks bucket and tree bucket. +// can't remove block if it has children. +func (bt *blockTree) RemoveBlock(tx *dbutil.Tx, b *coin.Block) error { + // delete block in blocks bucket. + hash := b.HashHeader() + if err := dbutil.Delete(tx, BlocksBkt, hash[:]); err != nil { + return err + } + + // check if this block has children + if has, err := hasChild(tx, *b); err != nil { + return err + } else if has { + return errHasChild + } + + // get block hash pairs in depth + hashPairs, err := getHashPairInDepth(tx, b.Seq(), allPairs) + if err != nil { + return err + } + + // remove block hash pair in tree. + ps := removePairs(hashPairs, coin.HashPair{ + Hash: hash, + PrevHash: b.Head.PrevHash, + }) + + if len(ps) == 0 { + return dbutil.Delete(tx, TreeBkt, dbutil.Itob(b.Seq())) + } + + // update the hash pairs in tree. + return setHashPairInDepth(tx, b.Seq(), ps) +} + +// GetBlock get block by hash, return nil on not found +func (bt *blockTree) GetBlock(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + var b coin.Block + + v, err := dbutil.GetBucketValueNoCopy(tx, BlocksBkt, hash[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeBlockExact(v, &b); err != nil { + return nil, err + } + + if hash != b.HashHeader() { + return nil, fmt.Errorf("DB key %s does not match block hash header %s", hash, b.HashHeader()) + } + + return &b, nil +} + +// GetBlockInDepth get block in depth, return nil on not found, +// the filter is used to choose the appropriate block. +func (bt *blockTree) GetBlockInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (*coin.Block, error) { + hash, ok, err := bt.getHashInDepth(tx, depth, filter) + if err != nil { + return nil, fmt.Errorf("BlockTree.getHashInDepth failed: %v", err) + } else if !ok { + return nil, nil + } + + return bt.GetBlock(tx, hash) +} + +// ForEachBlock iterates all blocks and calls f on them +func (bt *blockTree) ForEachBlock(tx *dbutil.Tx, f func(b *coin.Block) error) error { + return dbutil.ForEach(tx, BlocksBkt, func(_, v []byte) error { + var b coin.Block + if err := decodeBlockExact(v, &b); err != nil { + return err + } + + return f(&b) + }) +} + +func (bt *blockTree) getHashInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (cipher.SHA256, bool, error) { + var pairs hashPairsWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, TreeBkt, dbutil.Itob(depth)) + if err != nil { + return cipher.SHA256{}, false, err + } else if v == nil { + return cipher.SHA256{}, false, nil + } + + if err := decodeHashPairsWrapperExact(v, &pairs); err != nil { + return cipher.SHA256{}, false, err + } + + hash, ok := filter(tx, pairs.HashPairs) + if !ok { + return cipher.SHA256{}, false, errors.New("No hash found in depth") + } + + return hash, true, nil +} + +func containHash(hashPairs []coin.HashPair, pair coin.HashPair) bool { + for _, p := range hashPairs { + if p.Hash == pair.Hash { + return true + } + } + return false +} + +func removePairs(hps []coin.HashPair, pair coin.HashPair) []coin.HashPair { + pairs := []coin.HashPair{} + for _, p := range hps { + if p.Hash == pair.Hash && p.PrevHash == pair.PrevHash { + continue + } + pairs = append(pairs, p) + } + return pairs +} + +func getHashPairInDepth(tx *dbutil.Tx, depth uint64, fn func(hp coin.HashPair) bool) ([]coin.HashPair, error) { + var hps hashPairsWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, TreeBkt, dbutil.Itob(depth)) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashPairsWrapperExact(v, &hps); err != nil { + return nil, err + } + + var pairs []coin.HashPair + for _, ps := range hps.HashPairs { + if fn(ps) { + pairs = append(pairs, ps) + } + } + return pairs, nil +} + +// check if this block has children +func hasChild(tx *dbutil.Tx, b coin.Block) (bool, error) { + // get the child block hash pair, whose pre hash point to current block. + childHashPair, err := getHashPairInDepth(tx, b.Head.BkSeq+1, func(hp coin.HashPair) bool { + return hp.PrevHash == b.HashHeader() + }) + + if err != nil { + return false, err + } + + return len(childHashPair) > 0, nil +} + +func setHashPairInDepth(tx *dbutil.Tx, depth uint64, hps []coin.HashPair) error { + buf, err := encodeHashPairsWrapper(&hashPairsWrapper{ + HashPairs: hps, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, TreeBkt, dbutil.Itob(depth), buf) +} + +func allPairs(hp coin.HashPair) bool { + return true +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blockchain.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blockchain.go new file mode 100644 index 0000000000..f5e5e52468 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blockchain.go @@ -0,0 +1,285 @@ +/* +Package blockdb is the core blockchain database wrapper +*/ +package blockdb + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + logger = logging.MustGetLogger("blockdb") + + // ErrNoHeadBlock is returned when calling Blockchain.Head() when no head block exists + ErrNoHeadBlock = fmt.Errorf("found no head block") +) + +//go:generate skyencoder -unexported -struct Block -output-path . -package blockdb github.com/skycoin/skycoin/src/coin +//go:generate skyencoder -unexported -struct UxOut -output-path . -package blockdb github.com/skycoin/skycoin/src/coin +//go:generate skyencoder -unexported -struct hashPairsWrapper +//go:generate skyencoder -unexported -struct hashesWrapper +//go:generate skyencoder -unexported -struct sigWrapper + +// hashesWrapper wraps []cipher.SHA256 so it can be used by skyencoder +type hashesWrapper struct { + Hashes []cipher.SHA256 +} + +// sigWrapper wraps cipher.Sig in struct so it can be used by skyencoder +type sigWrapper struct { + Sig cipher.Sig +} + +// hashPairsWrapper wraps []coin.HashPair so it can be used by skyencoder +type hashPairsWrapper struct { + HashPairs []coin.HashPair +} + +// ErrMissingSignature is returned if a block in the db does not have a corresponding signature in the db +type ErrMissingSignature struct { + b *coin.Block +} + +// NewErrMissingSignature creates ErrMissingSignature from *coin.Block +func NewErrMissingSignature(b *coin.Block) error { + return ErrMissingSignature{ + b: b, + } +} + +func (e ErrMissingSignature) Error() string { + return fmt.Sprintf("Signature not found for block seq=%d hash=%s", e.b.Head.BkSeq, e.b.HashHeader().Hex()) +} + +// CreateBuckets creates bolt.DB buckets used by the blockdb +func CreateBuckets(tx *dbutil.Tx) error { + return dbutil.CreateBuckets(tx, [][]byte{ + BlockSigsBkt, + BlocksBkt, + TreeBkt, + BlockchainMetaBkt, + UnspentPoolBkt, + UnspentPoolAddrIndexBkt, + UnspentMetaBkt, + }) +} + +// BlockTree block storage +type BlockTree interface { + AddBlock(*dbutil.Tx, *coin.Block) error + GetBlock(*dbutil.Tx, cipher.SHA256) (*coin.Block, error) + GetBlockInDepth(*dbutil.Tx, uint64, Walker) (*coin.Block, error) + ForEachBlock(*dbutil.Tx, func(*coin.Block) error) error +} + +// BlockSigs block signature storage +type BlockSigs interface { + Add(*dbutil.Tx, cipher.SHA256, cipher.Sig) error + Get(*dbutil.Tx, cipher.SHA256) (cipher.Sig, bool, error) + ForEach(*dbutil.Tx, func(cipher.SHA256, cipher.Sig) error) error +} + +//go:generate mockery -name UnspentPooler -case underscore -testonly -inpkg + +// UnspentPooler unspent outputs pool +type UnspentPooler interface { + MaybeBuildIndexes(*dbutil.Tx, uint64) error + Len(*dbutil.Tx) (uint64, error) + Contains(*dbutil.Tx, cipher.SHA256) (bool, error) + Get(*dbutil.Tx, cipher.SHA256) (*coin.UxOut, error) + GetAll(*dbutil.Tx) (coin.UxArray, error) + GetArray(*dbutil.Tx, []cipher.SHA256) (coin.UxArray, error) + GetUxHash(*dbutil.Tx) (cipher.SHA256, error) + GetUnspentsOfAddrs(*dbutil.Tx, []cipher.Address) (coin.AddressUxOuts, error) + GetUnspentHashesOfAddrs(*dbutil.Tx, []cipher.Address) (AddressHashes, error) + ProcessBlock(*dbutil.Tx, *coin.SignedBlock) error + AddressCount(*dbutil.Tx) (uint64, error) +} + +// ChainMeta blockchain metadata +type ChainMeta interface { + GetHeadSeq(*dbutil.Tx) (uint64, bool, error) + SetHeadSeq(*dbutil.Tx, uint64) error +} + +// Blockchain maintain the buckets for blockchain +type Blockchain struct { + db *dbutil.DB + meta ChainMeta + unspent UnspentPooler + tree BlockTree + sigs BlockSigs + walker Walker +} + +// NewBlockchain creates a new blockchain instance +func NewBlockchain(db *dbutil.DB, walker Walker) (*Blockchain, error) { + if db == nil { + return nil, errors.New("db is nil") + } + + if walker == nil { + return nil, errors.New("blockchain walker is nil") + } + + return &Blockchain{ + db: db, + unspent: NewUnspentPool(), + meta: &chainMeta{}, + tree: &blockTree{}, + sigs: &blockSigs{}, + walker: walker, + }, nil +} + +// UnspentPool returns the unspent pool +func (bc *Blockchain) UnspentPool() UnspentPooler { + return bc.unspent +} + +// AddBlock adds signed block +func (bc *Blockchain) AddBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + if err := bc.sigs.Add(tx, sb.HashHeader(), sb.Sig); err != nil { + return fmt.Errorf("save signature failed: %v", err) + } + + if err := bc.tree.AddBlock(tx, &sb.Block); err != nil { + return fmt.Errorf("save block failed: %v", err) + } + + // update block head seq and unspent pool + if err := bc.processBlock(tx, sb); err != nil { + return err + } + + return nil +} + +// processBlock processes a block and updates the db +func (bc *Blockchain) processBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + if err := bc.unspent.ProcessBlock(tx, b); err != nil { + return err + } + + return bc.meta.SetHeadSeq(tx, b.Seq()) +} + +// Head returns head block, returns error if no head block exists +func (bc *Blockchain) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + seq, ok, err := bc.HeadSeq(tx) + if err != nil { + return nil, err + } else if !ok { + return nil, ErrNoHeadBlock + } + + b, err := bc.GetSignedBlockBySeq(tx, seq) + if err != nil { + return nil, err + } + + if b == nil { + return nil, ErrNoHeadBlock + } + + return b, nil +} + +// HeadSeq returns the head block sequence +func (bc *Blockchain) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + return bc.meta.GetHeadSeq(tx) +} + +// Len returns blockchain length +func (bc *Blockchain) Len(tx *dbutil.Tx) (uint64, error) { + seq, ok, err := bc.meta.GetHeadSeq(tx) + if err != nil { + return 0, err + } else if !ok { + return 0, nil + } + + return seq + 1, nil +} + +// GetBlockSignature returns the signature of a block +func (bc *Blockchain) GetBlockSignature(tx *dbutil.Tx, b *coin.Block) (cipher.Sig, bool, error) { + return bc.sigs.Get(tx, b.HashHeader()) +} + +// GetBlockByHash returns block of given hash +func (bc *Blockchain) GetBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + b, err := bc.tree.GetBlock(tx, hash) + if err != nil { + return nil, err + } + + return b, nil +} + +// GetSignedBlockByHash returns signed block of given hash +func (bc *Blockchain) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + b, err := bc.tree.GetBlock(tx, hash) + if err != nil { + return nil, err + } + if b == nil { + return nil, nil + } + + // get signature + sig, ok, err := bc.sigs.Get(tx, hash) + if err != nil { + return nil, fmt.Errorf("find signature of block: %v failed: %v", hash.Hex(), err) + } + + if !ok { + return nil, NewErrMissingSignature(b) + } + + return &coin.SignedBlock{ + Block: *b, + Sig: sig, + }, nil +} + +// GetSignedBlockBySeq returns signed block of given seq +func (bc *Blockchain) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + b, err := bc.tree.GetBlockInDepth(tx, seq, bc.walker) + if err != nil { + return nil, fmt.Errorf("bc.tree.GetBlockInDepth failed: %v", err) + } + if b == nil { + return nil, nil + } + + sig, ok, err := bc.sigs.Get(tx, b.HashHeader()) + if err != nil { + return nil, fmt.Errorf("find signature of block: %v failed: %v", seq, err) + } + + if !ok { + return nil, NewErrMissingSignature(b) + } + + return &coin.SignedBlock{ + Block: *b, + Sig: sig, + }, nil +} + +// GetGenesisBlock returns genesis block +func (bc *Blockchain) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.GetSignedBlockBySeq(tx, 0) +} + +// ForEachBlock iterates all blocks and calls f on them +func (bc *Blockchain) ForEachBlock(tx *dbutil.Tx, f func(b *coin.Block) error) error { + return bc.tree.ForEachBlock(tx, f) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blocksigs.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blocksigs.go new file mode 100644 index 0000000000..132792c3f2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blocksigs.go @@ -0,0 +1,69 @@ +package blockdb + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // BlockSigsBkt holds block signatures + BlockSigsBkt = []byte("block_sigs") +) + +// blockSigs manages known blockSigs as received. +// TODO -- support out of order blocks. This requires a change to the +// message protocol to support ranges similar to bitcoin's locator hashes. +// We also need to keep track of whether a block has been executed so that +// as continuity is established we can execute chains of blocks. +// TODO -- Since we will need to hold blocks that cannot be verified +// immediately against the blockchain, we need to be able to hold multiple +// blockSigs per BkSeq, or use hashes as keys. For now, this is not a +// problem assuming the signed blocks created by a block publisher are valid blocks, +// because we can check the signature independently of the blockchain. +type blockSigs struct{} + +// Get returns the signature of a specific block +func (bs *blockSigs) Get(tx *dbutil.Tx, hash cipher.SHA256) (cipher.Sig, bool, error) { + var sig sigWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, BlockSigsBkt, hash[:]) + if err != nil { + return cipher.Sig{}, false, err + } else if v == nil { + return cipher.Sig{}, false, nil + } + + if err := decodeSigWrapperExact(v, &sig); err != nil { + return cipher.Sig{}, false, err + } + + return sig.Sig, true, nil +} + +// Add adds a signed block to the db +func (bs *blockSigs) Add(tx *dbutil.Tx, hash cipher.SHA256, sig cipher.Sig) error { + buf, err := encodeSigWrapper(&sigWrapper{ + Sig: sig, + }) + if err != nil { + return err + } + return dbutil.PutBucketValue(tx, BlockSigsBkt, hash[:], buf) +} + +// ForEach iterates all signatures and calls f on them +func (bs *blockSigs) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, cipher.Sig) error) error { + return dbutil.ForEach(tx, BlockSigsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + if err != nil { + return err + } + + var sig sigWrapper + if err := decodeSigWrapperExact(v, &sig); err != nil { + return err + } + + return f(hash, sig.Sig) + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/chain_meta.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/chain_meta.go new file mode 100644 index 0000000000..fdfaf3383a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/chain_meta.go @@ -0,0 +1,29 @@ +package blockdb + +import ( + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // BlockchainMetaBkt holds blockchain metadata + BlockchainMetaBkt = []byte("blockchain_meta") + // blockchain head sequence number + headSeqKey = []byte("head_seq") +) + +type chainMeta struct{} + +func (m chainMeta) SetHeadSeq(tx *dbutil.Tx, seq uint64) error { + return dbutil.PutBucketValue(tx, BlockchainMetaBkt, headSeqKey, dbutil.Itob(seq)) +} + +func (m chainMeta) GetHeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, BlockchainMetaBkt, headSeqKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder.go new file mode 100644 index 0000000000..69c7a892a0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder.go @@ -0,0 +1,141 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" +) + +// encodeSizeHashPairsWrapper computes the size of an encoded object of type hashPairsWrapper +func encodeSizeHashPairsWrapper(obj *hashPairsWrapper) uint64 { + i0 := uint64(0) + + // obj.HashPairs + i0 += 4 + { + i1 := uint64(0) + + // x1.Hash + i1 += 32 + + // x1.PrevHash + i1 += 32 + + i0 += uint64(len(obj.HashPairs)) * i1 + } + + return i0 +} + +// encodeHashPairsWrapper encodes an object of type hashPairsWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeHashPairsWrapper(obj *hashPairsWrapper) ([]byte, error) { + n := encodeSizeHashPairsWrapper(obj) + buf := make([]byte, n) + + if err := encodeHashPairsWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeHashPairsWrapperToBuffer encodes an object of type hashPairsWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeHashPairsWrapperToBuffer(buf []byte, obj *hashPairsWrapper) error { + if uint64(len(buf)) < encodeSizeHashPairsWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.HashPairs length check + if uint64(len(obj.HashPairs)) > math.MaxUint32 { + return errors.New("obj.HashPairs length exceeds math.MaxUint32") + } + + // obj.HashPairs length + e.Uint32(uint32(len(obj.HashPairs))) + + // obj.HashPairs + for _, x := range obj.HashPairs { + + // x.Hash + e.CopyBytes(x.Hash[:]) + + // x.PrevHash + e.CopyBytes(x.PrevHash[:]) + + } + + return nil +} + +// decodeHashPairsWrapper decodes an object of type hashPairsWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeHashPairsWrapper(buf []byte, obj *hashPairsWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.HashPairs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.HashPairs = make([]coin.HashPair, length) + + for z1 := range obj.HashPairs { + { + // obj.HashPairs[z1].Hash + if len(d.Buffer) < len(obj.HashPairs[z1].Hash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.HashPairs[z1].Hash[:], d.Buffer[:len(obj.HashPairs[z1].Hash)]) + d.Buffer = d.Buffer[len(obj.HashPairs[z1].Hash):] + } + + { + // obj.HashPairs[z1].PrevHash + if len(d.Buffer) < len(obj.HashPairs[z1].PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.HashPairs[z1].PrevHash[:], d.Buffer[:len(obj.HashPairs[z1].PrevHash)]) + d.Buffer = d.Buffer[len(obj.HashPairs[z1].PrevHash):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeHashPairsWrapperExact decodes an object of type hashPairsWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeHashPairsWrapperExact(buf []byte, obj *hashPairsWrapper) error { + if n, err := decodeHashPairsWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder.go new file mode 100644 index 0000000000..08464d0c84 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder.go @@ -0,0 +1,126 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// encodeSizeHashesWrapper computes the size of an encoded object of type hashesWrapper +func encodeSizeHashesWrapper(obj *hashesWrapper) uint64 { + i0 := uint64(0) + + // obj.Hashes + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Hashes)) * i1 + } + + return i0 +} + +// encodeHashesWrapper encodes an object of type hashesWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeHashesWrapper(obj *hashesWrapper) ([]byte, error) { + n := encodeSizeHashesWrapper(obj) + buf := make([]byte, n) + + if err := encodeHashesWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeHashesWrapperToBuffer encodes an object of type hashesWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeHashesWrapperToBuffer(buf []byte, obj *hashesWrapper) error { + if uint64(len(buf)) < encodeSizeHashesWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Hashes length check + if uint64(len(obj.Hashes)) > math.MaxUint32 { + return errors.New("obj.Hashes length exceeds math.MaxUint32") + } + + // obj.Hashes length + e.Uint32(uint32(len(obj.Hashes))) + + // obj.Hashes + for _, x := range obj.Hashes { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeHashesWrapper decodes an object of type hashesWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeHashesWrapper(buf []byte, obj *hashesWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Hashes + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Hashes = make([]cipher.SHA256, length) + + for z1 := range obj.Hashes { + { + // obj.Hashes[z1] + if len(d.Buffer) < len(obj.Hashes[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Hashes[z1][:], d.Buffer[:len(obj.Hashes[z1])]) + d.Buffer = d.Buffer[len(obj.Hashes[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeHashesWrapperExact decodes an object of type hashesWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeHashesWrapperExact(buf []byte, obj *hashesWrapper) error { + if n, err := decodeHashesWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/sig_wrapper_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/sig_wrapper_skyencoder.go new file mode 100644 index 0000000000..398d886e72 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/sig_wrapper_skyencoder.go @@ -0,0 +1,78 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package blockdb + +import "github.com/skycoin/skycoin/src/cipher/encoder" + +// encodeSizeSigWrapper computes the size of an encoded object of type sigWrapper +func encodeSizeSigWrapper(obj *sigWrapper) uint64 { + i0 := uint64(0) + + // obj.Sig + i0 += 65 + + return i0 +} + +// encodeSigWrapper encodes an object of type sigWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeSigWrapper(obj *sigWrapper) ([]byte, error) { + n := encodeSizeSigWrapper(obj) + buf := make([]byte, n) + + if err := encodeSigWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeSigWrapperToBuffer encodes an object of type sigWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeSigWrapperToBuffer(buf []byte, obj *sigWrapper) error { + if uint64(len(buf)) < encodeSizeSigWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Sig + e.CopyBytes(obj.Sig[:]) + + return nil +} + +// decodeSigWrapper decodes an object of type sigWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeSigWrapper(buf []byte, obj *sigWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Sig + if len(d.Buffer) < len(obj.Sig) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sig[:], d.Buffer[:len(obj.Sig)]) + d.Buffer = d.Buffer[len(obj.Sig):] + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeSigWrapperExact decodes an object of type sigWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeSigWrapperExact(buf []byte, obj *sigWrapper) error { + if n, err := decodeSigWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/unspent.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/unspent.go new file mode 100644 index 0000000000..344a992d58 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/unspent.go @@ -0,0 +1,541 @@ +package blockdb + +import ( + "bytes" + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + xorhashKey = []byte("xorhash") + addrIndexHeightKey = []byte("addr_index_height") + + // UnspentPoolBkt holds unspent outputs, indexed by unspent output hash + UnspentPoolBkt = []byte("unspent_pool") + // UnspentPoolAddrIndexBkt maps addresses to their unspent outputs + UnspentPoolAddrIndexBkt = []byte("unspent_pool_addr_index") + // UnspentMetaBkt holds unspent output metadata + UnspentMetaBkt = []byte("unspent_meta") +) + +// ErrUnspentNotExist is returned if an unspent is not found in the pool +type ErrUnspentNotExist struct { + UxID string +} + +// NewErrUnspentNotExist creates ErrUnspentNotExist from a UxID +func NewErrUnspentNotExist(uxID string) error { + return ErrUnspentNotExist{ + UxID: uxID, + } +} + +func (e ErrUnspentNotExist) Error() string { + return fmt.Sprintf("unspent output of %s does not exist", e.UxID) +} + +// AddressHashes maps addresses to a set of hashes +type AddressHashes map[cipher.Address][]cipher.SHA256 + +// Flatten flattens all hash sets from AddressHashes to one slice +func (a AddressHashes) Flatten() []cipher.SHA256 { + total := 0 + for _, h := range a { + total += len(h) + } + + hashes := make([]cipher.SHA256, total) + + i := 0 + for _, h := range a { + copy(hashes[i:], h) + i += len(h) + } + + return hashes +} + +type unspentMeta struct{} + +func (m unspentMeta) getXorHash(tx *dbutil.Tx) (cipher.SHA256, error) { + v, err := dbutil.GetBucketValue(tx, UnspentMetaBkt, xorhashKey) + if err != nil { + return cipher.SHA256{}, err + } else if v == nil { + return cipher.SHA256{}, nil + } + + return cipher.SHA256FromBytes(v) +} + +func (m *unspentMeta) setXorHash(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.PutBucketValue(tx, UnspentMetaBkt, xorhashKey, hash[:]) +} + +func (m *unspentMeta) getAddrIndexHeight(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, UnspentMetaBkt, addrIndexHeightKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} + +func (m *unspentMeta) setAddrIndexHeight(tx *dbutil.Tx, height uint64) error { + return dbutil.PutBucketValue(tx, UnspentMetaBkt, addrIndexHeightKey, dbutil.Itob(height)) +} + +type pool struct{} + +func (pl pool) get(tx *dbutil.Tx, hash cipher.SHA256) (*coin.UxOut, error) { + var out coin.UxOut + + v, err := dbutil.GetBucketValueNoCopy(tx, UnspentPoolBkt, hash[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeUxOutExact(v, &out); err != nil { + return nil, err + } + + return &out, nil +} + +func (pl pool) getAll(tx *dbutil.Tx) (coin.UxArray, error) { + var uxa coin.UxArray + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(_, v []byte) error { + var ux coin.UxOut + if err := decodeUxOutExact(v, &ux); err != nil { + return err + } + + uxa = append(uxa, ux) + return nil + }); err != nil { + return nil, err + } + + return uxa, nil +} + +func (pl pool) put(tx *dbutil.Tx, hash cipher.SHA256, ux coin.UxOut) error { + buf, err := encodeUxOut(&ux) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnspentPoolBkt, hash[:], buf) +} + +func (pl *pool) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnspentPoolBkt, hash[:]) +} + +type poolAddrIndex struct{} + +func (p poolAddrIndex) get(tx *dbutil.Tx, addr cipher.Address) ([]cipher.SHA256, error) { + var hashes hashesWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, UnspentPoolAddrIndexBkt, addr.Bytes()) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashesWrapperExact(v, &hashes); err != nil { + return nil, err + } + + return hashes.Hashes, nil +} + +func (p poolAddrIndex) put(tx *dbutil.Tx, addr cipher.Address, hashes []cipher.SHA256) error { + if len(hashes) == 0 { + return errors.New("poolAddrIndex.put cannot put empty hash array") + } + + hashesMap := make(map[cipher.SHA256]struct{}, len(hashes)) + for _, h := range hashes { + if _, ok := hashesMap[h]; ok { + return errors.New("poolAddrIndex.put: hashes array contains duplicate") + } + + hashesMap[h] = struct{}{} + } + + buf, err := encodeHashesWrapper(&hashesWrapper{ + Hashes: hashes, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnspentPoolAddrIndexBkt, addr.Bytes(), buf) +} + +// adjust adds and removes hashes from an address -> hashes index +// TODO -- if necessary, this can be optimized further to accept multiple addresses at once, +// so that all get queries can be performed before the set +func (p poolAddrIndex) adjust(tx *dbutil.Tx, addr cipher.Address, addHashes, rmHashes []cipher.SHA256) error { + if len(addHashes) == 0 && len(rmHashes) == 0 { + return nil + } + + existingHashes, err := p.get(tx, addr) + if err != nil { + return err + } + + rmHashesMap := make(map[cipher.SHA256]struct{}, len(rmHashes)) + for _, h := range rmHashes { + rmHashesMap[h] = struct{}{} + } + + if len(rmHashesMap) != len(rmHashes) { + return errors.New("poolAddrIndex.adjust: rmHashes contains duplicates") + } + + newHashesSize := len(existingHashes) - len(rmHashes) + if newHashesSize < 0 { + return errors.New("poolAddrIndex.adjust: rmHashes is longer than existingHashes") + } + + newHashes := make([]cipher.SHA256, 0, newHashesSize) + newHashesMap := make(map[cipher.SHA256]struct{}, newHashesSize) + + rmHashesCount := 0 + for _, h := range existingHashes { + if _, ok := rmHashesMap[h]; ok { + rmHashesCount++ + } else { + newHashes = append(newHashes, h) + newHashesMap[h] = struct{}{} + } + } + + if rmHashesCount != len(rmHashes) { + return fmt.Errorf("poolAddrIndex.adjust: rmHashes contains %d hashes not indexed for address %s", len(rmHashes)-rmHashesCount, addr.String()) + } + + for _, h := range addHashes { + if _, ok := rmHashesMap[h]; ok { + return errors.New("poolAddrIndex.adjust: hash appears in both addHashes and rmHashes") + } + + if _, ok := newHashesMap[h]; !ok { + newHashes = append(newHashes, h) + newHashesMap[h] = struct{}{} + } else { + return fmt.Errorf("poolAddrIndex.adjust: uxout hash %s is already indexed for address %s", h.Hex(), addr.String()) + } + } + + // Delete the row if hashes is empty, so that the length of the bucket can + // be used to determine the number of addresses with unspents + if len(newHashes) == 0 { + return dbutil.Delete(tx, UnspentPoolAddrIndexBkt, addr.Bytes()) + } + + return p.put(tx, addr, newHashes) +} + +// Unspents unspent outputs pool +type Unspents struct { + pool *pool + poolAddrIndex *poolAddrIndex + meta *unspentMeta +} + +// NewUnspentPool creates new unspent pool instance +func NewUnspentPool() *Unspents { + return &Unspents{ + pool: &pool{}, + poolAddrIndex: &poolAddrIndex{}, + meta: &unspentMeta{}, + } +} + +// MaybeBuildIndexes builds indexes if necessary +func (up *Unspents) MaybeBuildIndexes(tx *dbutil.Tx, headSeq uint64) error { + logger.Info("Unspents.MaybeBuildIndexes") + + // Compare the addrIndexHeight to the head block, + // if not equal, rebuild the address index + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + if err != nil { + return err + } + + if ok && addrIndexHeight == headSeq { + return nil + } + + if addrIndexHeight > headSeq { + logger.Critical().Warningf("addrIndexHeight > headSeq (%d > %d)", addrIndexHeight, headSeq) + } + + logger.Infof("Rebuilding unspent_pool_addr_index (addrHeightIndexExists=%v, addrIndexHeight=%d, headSeq=%d)", ok, addrIndexHeight, headSeq) + + return up.buildAddrIndex(tx) +} + +func (up *Unspents) buildAddrIndex(tx *dbutil.Tx) error { + logger.Info("Building unspent address index") + + if err := dbutil.Reset(tx, UnspentPoolAddrIndexBkt); err != nil { + return err + } + + addrHashes := make(map[cipher.Address][]cipher.SHA256) + + var maxBlockSeq uint64 + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(k, v []byte) error { + var ux coin.UxOut + if err := decodeUxOutExact(v, &ux); err != nil { + return err + } + + if ux.Head.BkSeq > maxBlockSeq { + maxBlockSeq = ux.Head.BkSeq + } + + h := ux.Hash() + + if !bytes.Equal(k[:], h[:]) { + return errors.New("Unspent pool uxout.Hash() does not match its key") + } + + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], h) + + return nil + }); err != nil { + return err + } + + if len(addrHashes) == 0 { + logger.Infof("No unspents to index") + return nil + } + + for addr, hashes := range addrHashes { + if err := up.poolAddrIndex.put(tx, addr, hashes); err != nil { + return err + } + } + + if err := up.meta.setAddrIndexHeight(tx, maxBlockSeq); err != nil { + return err + } + + logger.Infof("Indexed unspents for %d addresses", len(addrHashes)) + + return nil +} + +// ProcessBlock adds unspents from a block to the unspent pool +func (up *Unspents) ProcessBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + // Gather all transaction inputs + var inputs []cipher.SHA256 + var txnUxs coin.UxArray + for _, txn := range b.Body.Transactions { + inputs = append(inputs, txn.In...) + txnUxs = append(txnUxs, coin.CreateUnspents(b.Head, txn)...) + } + + uxs, err := up.GetArray(tx, inputs) + if err != nil { + return err + } + + xorHash, err := up.meta.getXorHash(tx) + if err != nil { + return err + } + + // Remove spent outputs + rmAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for _, ux := range uxs { + xorHash = xorHash.Xor(ux.SnapshotHash()) + + h := ux.Hash() + + if err := up.pool.delete(tx, h); err != nil { + return err + } + + rmAddrHashes[ux.Body.Address] = append(rmAddrHashes[ux.Body.Address], h) + } + + // Create new outputs + txnUxHashes := make([]cipher.SHA256, len(txnUxs)) + addAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for i, ux := range txnUxs { + h := ux.Hash() + txnUxHashes[i] = h + addAddrHashes[ux.Body.Address] = append(addAddrHashes[ux.Body.Address], h) + } + + // Check that the uxout exists in the pool already, otherwise xorHash will be calculated wrong + for _, h := range txnUxHashes { + if hasKey, err := up.Contains(tx, h); err != nil { + return err + } else if hasKey { + return fmt.Errorf("attempted to insert uxout:%v twice into the unspent pool", h.Hex()) + } + } + + for i, ux := range txnUxs { + // Add new outputs + if err := up.pool.put(tx, txnUxHashes[i], ux); err != nil { + return err + } + + // Recalculate xorHash + xorHash = xorHash.Xor(ux.SnapshotHash()) + } + + // Set xorHash + if err := up.meta.setXorHash(tx, xorHash); err != nil { + return err + } + + // Update indexes + for addr, rmHashes := range rmAddrHashes { + addHashes := addAddrHashes[addr] + + if err := up.poolAddrIndex.adjust(tx, addr, addHashes, rmHashes); err != nil { + return err + } + + delete(addAddrHashes, addr) + } + + for addr, addHashes := range addAddrHashes { + if err := up.poolAddrIndex.adjust(tx, addr, addHashes, nil); err != nil { + return err + } + } + + // Check that the addrIndexHeight is incremental + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + if err != nil { + return err + } + + if b.Block.Head.BkSeq == 0 { + if ok { + err := errors.New("addrIndexHeight is set but no block has been indexed yet") + logger.Critical().Error(err.Error()) + return err + } + } else if b.Block.Head.BkSeq != addrIndexHeight+1 { + err := errors.New("unspent pool processing blocks out of order") + logger.Critical().Error(err.Error()) + return err + } + + // Update the addrIndexHeight + return up.meta.setAddrIndexHeight(tx, b.Block.Head.BkSeq) +} + +// GetArray returns UxOut for a set of hashes, will return error if any of the hashes do not exist in the pool. +func (up *Unspents) GetArray(tx *dbutil.Tx, hashes []cipher.SHA256) (coin.UxArray, error) { + var uxa coin.UxArray + + for _, h := range hashes { + ux, err := up.pool.get(tx, h) + if err != nil { + return nil, err + } else if ux == nil { + return nil, NewErrUnspentNotExist(h.Hex()) + } + + uxa = append(uxa, *ux) + } + + return uxa, nil +} + +// Get returns the uxout value of given hash +func (up *Unspents) Get(tx *dbutil.Tx, h cipher.SHA256) (*coin.UxOut, error) { + return up.pool.get(tx, h) +} + +// GetAll returns Pool as an array. Note: they are not in any particular order. +func (up *Unspents) GetAll(tx *dbutil.Tx) (coin.UxArray, error) { + return up.pool.getAll(tx) +} + +// Len returns the unspent outputs num +func (up *Unspents) Len(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnspentPoolBkt) +} + +// Contains check if the hash of uxout does exist in the pool +func (up *Unspents) Contains(tx *dbutil.Tx, h cipher.SHA256) (bool, error) { + return dbutil.BucketHasKey(tx, UnspentPoolBkt, h[:]) +} + +// GetUnspentHashesOfAddrs returns a map of addresses to their unspent output hashes +func (up *Unspents) GetUnspentHashesOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (AddressHashes, error) { + addrHashes := make(AddressHashes, len(addrs)) + + for _, addr := range addrs { + hashes, err := up.poolAddrIndex.get(tx, addr) + if err != nil { + return nil, err + } + + addrHashes[addr] = hashes + } + + return addrHashes, nil +} + +// GetUnspentsOfAddrs returns a map of addresses to their unspent outputs +func (up *Unspents) GetUnspentsOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrUxs := make(coin.AddressUxOuts, len(addrs)) + + for _, addr := range addrs { + hashes, err := up.poolAddrIndex.get(tx, addr) + if err != nil { + return nil, err + } + + uxa, err := up.GetArray(tx, hashes) + if err != nil { + switch e := err.(type) { + case ErrUnspentNotExist: + logger.Critical().Errorf("Unspent hash %s indexed under address %s does not exist in unspent pool", e.UxID, addr.String()) + } + return nil, err + } + + addrUxs[addr] = uxa + } + + return addrUxs, nil +} + +// GetUxHash returns unspent output checksum for the Block. +// Must be called after Block is fully initialized, +// and before its outputs are added to the unspent pool +func (up *Unspents) GetUxHash(tx *dbutil.Tx) (cipher.SHA256, error) { + return up.meta.getXorHash(tx) +} + +// AddressCount returns the total number of addresses with unspents +func (up *Unspents) AddressCount(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnspentPoolAddrIndexBkt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/ux_out_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/ux_out_skyencoder.go new file mode 100644 index 0000000000..e428e3925f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/ux_out_skyencoder.go @@ -0,0 +1,171 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" +) + +// encodeSizeUxOut computes the size of an encoded object of type UxOut +func encodeSizeUxOut(obj *coin.UxOut) uint64 { + i0 := uint64(0) + + // obj.Head.Time + i0 += 8 + + // obj.Head.BkSeq + i0 += 8 + + // obj.Body.SrcTransaction + i0 += 32 + + // obj.Body.Address.Version + i0++ + + // obj.Body.Address.Key + i0 += 20 + + // obj.Body.Coins + i0 += 8 + + // obj.Body.Hours + i0 += 8 + + return i0 +} + +// encodeUxOut encodes an object of type UxOut to a buffer allocated to the exact size +// required to encode the object. +func encodeUxOut(obj *coin.UxOut) ([]byte, error) { + n := encodeSizeUxOut(obj) + buf := make([]byte, n) + + if err := encodeUxOutToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxOutToBuffer encodes an object of type UxOut to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxOutToBuffer(buf []byte, obj *coin.UxOut) error { + if uint64(len(buf)) < encodeSizeUxOut(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Head.Time + e.Uint64(obj.Head.Time) + + // obj.Head.BkSeq + e.Uint64(obj.Head.BkSeq) + + // obj.Body.SrcTransaction + e.CopyBytes(obj.Body.SrcTransaction[:]) + + // obj.Body.Address.Version + e.Uint8(obj.Body.Address.Version) + + // obj.Body.Address.Key + e.CopyBytes(obj.Body.Address.Key[:]) + + // obj.Body.Coins + e.Uint64(obj.Body.Coins) + + // obj.Body.Hours + e.Uint64(obj.Body.Hours) + + return nil +} + +// decodeUxOut decodes an object of type UxOut from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxOut(buf []byte, obj *coin.UxOut) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.Time = i + } + + { + // obj.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.BkSeq = i + } + + { + // obj.Body.SrcTransaction + if len(d.Buffer) < len(obj.Body.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.SrcTransaction[:], d.Buffer[:len(obj.Body.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.Body.SrcTransaction):] + } + + { + // obj.Body.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Body.Address.Version = i + } + + { + // obj.Body.Address.Key + if len(d.Buffer) < len(obj.Body.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Address.Key[:], d.Buffer[:len(obj.Body.Address.Key)]) + d.Buffer = d.Buffer[len(obj.Body.Address.Key):] + } + + { + // obj.Body.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Coins = i + } + + { + // obj.Body.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Hours = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxOutExact decodes an object of type UxOut from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxOutExact(buf []byte, obj *coin.UxOut) error { + if n, err := decodeUxOut(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/verify.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/verify.go new file mode 100644 index 0000000000..3ede1c92e4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/verify.go @@ -0,0 +1,156 @@ +package blockdb + +import ( + "errors" + "reflect" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // ErrVerifyStopped is returned when database verification is interrupted + ErrVerifyStopped = errors.New("database verification stopped") +) + +// VerifyDBSkyencoderSafe verifies that the skyencoder generated code has the same result as the encoder +// for all data in the blockchain +func VerifyDBSkyencoderSafe(tx *dbutil.Tx, quit <-chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + if err := dbutil.ForEach(tx, BlockSigsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var sig1 sigWrapper + if err := decodeSigWrapperExact(v, &sig1); err != nil { + return err + } + + var sig2 cipher.Sig + if err := encoder.DeserializeRawExact(v, &sig2); err != nil { + return err + } + + if sig1.Sig != sig2 { + return errors.New("BlockSigsBkt sig decode mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, BlocksBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 coin.Block + if err := decodeBlockExact(v, &b1); err != nil { + return err + } + + var b2 coin.Block + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("BlocksBkt block mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, TreeBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashPairsWrapper + if err := decodeHashPairsWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []coin.HashPair + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.HashPairs, b2) { + return errors.New("TreeBkt hash pairs mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 coin.UxOut + if err := decodeUxOutExact(v, &b1); err != nil { + return err + } + + var b2 coin.UxOut + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("UnspentPoolBkt ux out mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashesWrapper + if err := decodeHashesWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []cipher.SHA256 + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.Hashes, b2) { + return errors.New("UnspentPoolAddrIndexBkt sha256 hashes mismatch") + } + + return nil + }); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/config.go b/vendor/github.com/skycoin/skycoin/src/visor/config.go new file mode 100644 index 0000000000..f29bae3ffe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/config.go @@ -0,0 +1,119 @@ +package visor + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/params" +) + +// Config configuration parameters for the Visor +type Config struct { + // Is this a block publishing node + IsBlockPublisher bool + + // Public key of the blockchain + BlockchainPubkey cipher.PubKey + + // Secret key of the blockchain (required if block publisher) + BlockchainSeckey cipher.SecKey + + // Transaction verification parameters used for unconfirmed transactions + UnconfirmedVerifyTxn params.VerifyTxn + // Transaction verification parameters used when creating a block + CreateBlockVerifyTxn params.VerifyTxn + // Maximum size of a block, in bytes for creating blocks + MaxBlockTransactionsSize uint32 + + // Coin distribution parameters (necessary for txn verification) + Distribution params.Distribution + + // Where the blockchain is saved + BlockchainFile string + // Where the block signatures are saved + BlockSigsFile string + + //address for genesis + GenesisAddress cipher.Address + // Genesis block sig + GenesisSignature cipher.Sig + // Genesis block timestamp + GenesisTimestamp uint64 + // Number of coins in genesis block + GenesisCoinVolume uint64 + // enable arbitrating mode + Arbitrating bool +} + +// NewConfig creates Config +func NewConfig() Config { + c := Config{ + IsBlockPublisher: false, + + BlockchainPubkey: cipher.PubKey{}, + BlockchainSeckey: cipher.SecKey{}, + + UnconfirmedVerifyTxn: params.UserVerifyTxn, + CreateBlockVerifyTxn: params.UserVerifyTxn, + MaxBlockTransactionsSize: params.UserVerifyTxn.MaxTransactionSize, + + GenesisAddress: cipher.Address{}, + GenesisSignature: cipher.Sig{}, + GenesisTimestamp: 0, + GenesisCoinVolume: 0, //100e12, 100e6 * 10e6 + } + + return c +} + +// Verify verifies the configuration +func (c Config) Verify() error { + if c.IsBlockPublisher { + if c.BlockchainPubkey != cipher.MustPubKeyFromSecKey(c.BlockchainSeckey) { + return errors.New("Cannot run as block publisher: invalid seckey for pubkey") + } + } + + if err := c.UnconfirmedVerifyTxn.Validate(); err != nil { + return err + } + + if err := c.CreateBlockVerifyTxn.Validate(); err != nil { + return err + } + + if c.UnconfirmedVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("UnconfirmedVerifyTxn.BurnFactor must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.CreateBlockVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("CreateBlockVerifyTxn.BurnFactor must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.UnconfirmedVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("UnconfirmedVerifyTxn.MaxTransactionSize must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + + if c.CreateBlockVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("CreateBlockVerifyTxn.MaxTransactionSize must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + + if c.UnconfirmedVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("UnconfirmedVerifyTxn.MaxDropletPrecision must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + if c.CreateBlockVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("CreateBlockVerifyTxn.MaxDropletPrecision must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + if c.MaxBlockTransactionsSize < c.CreateBlockVerifyTxn.MaxTransactionSize { + return errors.New("MaxBlockTransactionsSize must be >= CreateBlockVerifyTxn.MaxTransactionSize") + } + + if err := c.Distribution.Validate(); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/db.go b/vendor/github.com/skycoin/skycoin/src/visor/db.go new file mode 100644 index 0000000000..d212de7a9b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/db.go @@ -0,0 +1,401 @@ +package visor + +import ( + "crypto/sha256" + "encoding/base64" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "reflect" + "sync" + "time" + + "github.com/boltdb/bolt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/elapse" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +var ( + // BlockchainVerifyTheadNum number of goroutines to use for signature and historydb verification + BlockchainVerifyTheadNum = 4 +) + +// ErrCorruptDB is returned if the database is corrupted +// The original corruption error is embedded +type ErrCorruptDB struct { + error +} + +// CheckDatabase checks the database for corruption, rebuild history if corrupted +func CheckDatabase(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) error { + elapser := elapse.NewElapser(time.Second*30, logger) + elapser.Register("CheckDatabase") + defer elapser.CheckForDone() + + var blocksBktExist bool + if err := db.View("CheckDatabase", func(tx *dbutil.Tx) error { + blocksBktExist = dbutil.Exists(tx, blockdb.BlocksBkt) + return nil + }); err != nil { + return err + } + + // Don't verify the db if the blocks bucket does not exist + if !blocksBktExist { + return nil + } + + bc, err := NewBlockchain(db, BlockchainConfig{Pubkey: pubkey}) + if err != nil { + return err + } + + history := historydb.New() + indexesMap := historydb.NewIndexesMap() + + var historyVerifyErr error + var lock sync.Mutex + verifyFunc := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + // Verify signature + if err := bc.VerifySignature(b); err != nil { + return err + } + + // Verify historydb, we don't return the error of history.Verify here, + // as we have to check all signature, if we return error early here, the + // potential bad signature won't be detected. + lock.Lock() + defer lock.Unlock() + if historyVerifyErr == nil { + historyVerifyErr = history.Verify(tx, b, indexesMap) + } + return nil + } + + err = bc.WalkChain(BlockchainVerifyTheadNum, verifyFunc, quit) + switch err.(type) { + case nil: + lock.Lock() + err = historyVerifyErr + lock.Unlock() + return err + default: + return err + } +} + +// backup the corrypted db first, then rebuild the history DB. +func rebuildHistoryDB(db *dbutil.DB, history *historydb.HistoryDB, bc *Blockchain, quit chan struct{}) (*dbutil.DB, error) { //nolint:unused,megacheck + db, err := backupDB(db) + if err != nil { + return nil, err + } + + if err := db.Update("Rebuild history db", func(tx *dbutil.Tx) error { + if err := history.Erase(tx); err != nil { + return err + } + + headSeq, ok, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if !ok { + return errors.New("head block does not exist") + } + + for i := uint64(0); i <= headSeq; i++ { + select { + case <-quit: + return nil + default: + b, err := bc.GetSignedBlockBySeq(tx, i) + if err != nil { + return err + } + + if err := history.ParseBlock(tx, b.Block); err != nil { + return err + } + + if i%1000 == 0 { + logger.Critical().Infof("Parse block: %d", i) + } + } + } + return nil + }); err != nil { + return nil, err + } + return db, nil +} + +// backupDB makes a backup copy of the DB +func backupDB(db *dbutil.DB) (*dbutil.DB, error) { //nolint:unused,megacheck + // backup the corrupted database + dbReadOnly := db.IsReadOnly() + + dbPath := db.Path() + + if err := db.Close(); err != nil { + return nil, fmt.Errorf("Failed to close db: %v", err) + } + + corruptDBPath, err := copyCorruptDB(dbPath) + if err != nil { + return nil, fmt.Errorf("Failed to copy corrupted db: %v", err) + } + + logger.Critical().Infof("Copy corrupted db to %s", corruptDBPath) + + // Open the database again + return OpenDB(dbPath, dbReadOnly) +} + +// ResetCorruptDB checks the database for corruption and if one of the following +// error types is found, then the database is deemed to be corrupted: +// - blockdb.ErrMissingSignature, +// - historydb.ErrHistoryDBCorrupted +// - encoder.ErrBufferUnderflow +// - encoder.ErrMaxLenExceeded +// If the database is deemed to be corrupted then it is erased and the db starts over. +// A copy of the corrupted database is saved. +func ResetCorruptDB(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) (*dbutil.DB, error) { + err := CheckDatabase(db, pubkey, quit) + + // Check if an encoder error has been reported. + // These are not types like the errors below so cannot be included in the + // .(type) switch evaluation. + if err == encoder.ErrBufferUnderflow || err == encoder.ErrMaxLenExceeded { + logger.Critical().Errorf("Database is corrupted (encoder error), recreating db: %v", err) + return resetCorruptDB(db) + } + + switch err.(type) { + case nil: + return db, nil + case blockdb.ErrMissingSignature, + historydb.ErrHistoryDBCorrupted: + logger.Critical().Errorf("Database is corrupted, recreating db: %v", err) + return resetCorruptDB(db) + default: + return nil, err + } +} + +func rebuildCorruptDB(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) (*dbutil.DB, error) { //nolint:deadcode,unused,megacheck + history := historydb.New() + bc, err := NewBlockchain(db, BlockchainConfig{Pubkey: pubkey}) + if err != nil { + return nil, err + } + + return rebuildHistoryDB(db, history, bc, quit) +} + +// resetCorruptDB recreates the DB, making a backup copy marked as corrupted +func resetCorruptDB(db *dbutil.DB) (*dbutil.DB, error) { + dbReadOnly := db.IsReadOnly() + dbPath := db.Path() + + if err := db.Close(); err != nil { + return nil, fmt.Errorf("Failed to close db: %v", err) + } + + corruptDBPath, err := moveCorruptDB(dbPath) + if err != nil { + return nil, fmt.Errorf("Failed to copy corrupted db: %v", err) + } + + logger.Critical().Infof("Moved corrupted db to %s", corruptDBPath) + + return OpenDB(dbPath, dbReadOnly) +} + +// OpenDB opens the blockdb +func OpenDB(dbFile string, readOnly bool) (*dbutil.DB, error) { + db, err := bolt.Open(dbFile, 0600, &bolt.Options{ + Timeout: 5000 * time.Millisecond, + ReadOnly: readOnly, + }) + if err != nil { + return nil, fmt.Errorf("Open boltdb failed, %v", err) + } + + return dbutil.WrapDB(db), nil +} + +// moveCorruptDB moves a file to makeCorruptDBPath(dbPath) +func moveCorruptDB(dbPath string) (string, error) { + newDBPath, err := makeCorruptDBPath(dbPath) + if err != nil { + return "", err + } + + if err := os.Rename(dbPath, newDBPath); err != nil { + logger.Errorf("os.Rename(%s, %s) failed: %v", dbPath, newDBPath, err) + return "", err + } + + return newDBPath, nil +} + +// copyCorruptDB copy a file to makeCorruptDBPath(dbPath) +func copyCorruptDB(dbPath string) (string, error) { //nolint:unused,megacheck + newDBPath, err := makeCorruptDBPath(dbPath) + if err != nil { + return "", err + } + + in, err := os.Open(dbPath) + if err != nil { + return "", err + } + defer in.Close() + + out, err := os.Create(newDBPath) + if err != nil { + return "", err + } + defer out.Close() + logger.Critical().Info(out.Name()) + + _, err = io.Copy(in, out) + if err != nil { + return "", err + } + + if err := out.Close(); err != nil { + return "", err + } + + return newDBPath, nil +} + +// makeCorruptDBPath creates a $FILE.corrupt.$HASH string based on dbPath, +// where $HASH is truncated SHA1 of $FILE. +func makeCorruptDBPath(dbPath string) (string, error) { + dbFileHash, err := shaFileID(dbPath) + if err != nil { + return "", err + } + + dbDir, dbFile := filepath.Split(dbPath) + newDBFile := fmt.Sprintf("%s.corrupt.%s", dbFile, dbFileHash) + newDBPath := filepath.Join(dbDir, newDBFile) + + return newDBPath, nil +} + +// shaFileID return the first 8 bytes of the SHA1 hash of the file, +// hex-encoded +func shaFileID(dbPath string) (string, error) { + fi, err := os.Open(dbPath) + if err != nil { + return "", err + } + defer fi.Close() + + h := sha256.New() + if _, err := io.Copy(h, fi); err != nil { + return "", err + } + + sum := h.Sum(nil) + encodedSum := base64.RawURLEncoding.EncodeToString(sum[:8]) + return encodedSum, nil +} + +// VerifyDBSkyencoderSafe verifies that the skyencoder generated code has the same result as the encoder +// for all data in the blockchain +func VerifyDBSkyencoderSafe(db *dbutil.DB, quit <-chan struct{}) error { + return db.View("VerifyDBSkyencoderSafe", func(tx *dbutil.Tx) error { + return verifyDBSkyencoderSafe(tx, quit) + }) +} + +func verifyDBSkyencoderSafe(tx *dbutil.Tx, quit <-chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + // blockdb + if err := blockdb.VerifyDBSkyencoderSafe(tx, quit); err != nil { + if err == blockdb.ErrVerifyStopped { + return ErrVerifyStopped + } + return err + } + + // historydb + if err := historydb.VerifyDBSkyencoderSafe(tx, quit); err != nil { + if err == historydb.ErrVerifyStopped { + return ErrVerifyStopped + } + return err + } + + // visor + if err := dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(v, &b1); err != nil { + return err + } + + var b2 UnconfirmedTransaction + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("UnconfirmedTxnsBkt unconfirmed transaction mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UnconfirmedUnspentsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 UxArray + if err := decodeUxArrayExact(v, &b1); err != nil { + return err + } + + var b2 coin.UxArray + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.UxArray, b2) { + return errors.New("UnconfirmedUnspentsBkt ux out slice mismatch") + } + + return nil + }); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/dbutil/dbutil.go b/vendor/github.com/skycoin/skycoin/src/visor/dbutil/dbutil.go new file mode 100644 index 0000000000..1531356efe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/dbutil/dbutil.go @@ -0,0 +1,363 @@ +/* +Package dbutil provides boltdb utility methods +*/ +package dbutil + +import ( + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "runtime/debug" + "sync" + "time" + + "github.com/boltdb/bolt" + + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/util/logging" +) + +var ( + logger = logging.MustGetLogger("dbutil") + txViewLog = false + txViewTrace = false + txUpdateLog = false + txUpdateTrace = false + txDurationLog = true + txDurationReportingThreshold = time.Millisecond * 100 +) + +// Tx wraps a Tx +type Tx struct { + *bolt.Tx +} + +// String is implemented to prevent a panic when mocking methods with *Tx arguments. +// The mock library forces arguments to be printed with %s which causes Tx to panic. +// See https://github.com/stretchr/testify/pull/596 +func (tx *Tx) String() string { + return fmt.Sprintf("%v", tx.Tx) +} + +// DB wraps a bolt.DB to add logging +type DB struct { + ViewLog bool + ViewTrace bool + UpdateLog bool + UpdateTrace bool + DurationLog bool + DurationReportingThreshold time.Duration + + *bolt.DB + + // shutdownLock is added to prevent closing the database while a View transaction is in progress + // bolt.DB will block for Update transactions but not for View transactions, and if + // the database is closed while in a View transaction, it will panic + // This will be fixed in coreos's bbolt after this PR is merged: + // https://github.com/coreos/bbolt/pull/91 + // When coreos has this feature, we can switch to coreos's bbolt and remove this lock + shutdownLock sync.RWMutex +} + +// WrapDB returns WrapDB +func WrapDB(db *bolt.DB) *DB { + return &DB{ + ViewLog: txViewLog, + UpdateLog: txUpdateLog, + ViewTrace: txViewTrace, + UpdateTrace: txUpdateTrace, + DurationLog: txDurationLog, + DurationReportingThreshold: txDurationReportingThreshold, + DB: db, + } +} + +// View wraps *bolt.DB.View to add logging +func (db *DB) View(name string, f func(*Tx) error) error { + db.shutdownLock.RLock() + defer db.shutdownLock.RUnlock() + + if db.ViewLog { + logger.Debug("db.View [%s] starting", name) + defer logger.Debug("db.View [%s] done", name) + } + if db.ViewTrace { + debug.PrintStack() + } + + t0 := time.Now() + + err := db.DB.View(func(tx *bolt.Tx) error { + return f(&Tx{tx}) + }) + + t1 := time.Now() + delta := t1.Sub(t0) + if db.DurationLog && delta > db.DurationReportingThreshold { + logger.Debugf("db.View [%s] elapsed %s", name, delta) + } + + return err +} + +// Update wraps *bolt.DB.Update to add logging +func (db *DB) Update(name string, f func(*Tx) error) error { + db.shutdownLock.RLock() + defer db.shutdownLock.RUnlock() + + if db.UpdateLog { + logger.Debug("db.Update [%s] starting", name) + defer logger.Debug("db.Update [%s] done", name) + } + if db.UpdateTrace { + debug.PrintStack() + } + + t0 := time.Now() + + err := db.DB.Update(func(tx *bolt.Tx) error { + return f(&Tx{tx}) + }) + + t1 := time.Now() + delta := t1.Sub(t0) + if db.DurationLog && delta > db.DurationReportingThreshold { + logger.Debugf("db.Update [%s] elapsed %s", name, delta) + } + + return err +} + +// Close closes the underlying *bolt.DB +func (db *DB) Close() error { + db.shutdownLock.Lock() + defer db.shutdownLock.Unlock() + + return db.DB.Close() +} + +// ErrCreateBucketFailed is returned if creating a bolt.DB bucket fails +type ErrCreateBucketFailed struct { + Bucket string + Err error +} + +func (e ErrCreateBucketFailed) Error() string { + return fmt.Sprintf("Create bucket \"%s\" failed: %v", e.Bucket, e.Err) +} + +// NewErrCreateBucketFailed returns an ErrCreateBucketFailed +func NewErrCreateBucketFailed(bucket []byte, err error) error { + return ErrCreateBucketFailed{ + Bucket: string(bucket), + Err: err, + } +} + +// ErrBucketNotExist is returned if a bolt.DB bucket does not exist +type ErrBucketNotExist struct { + Bucket string +} + +func (e ErrBucketNotExist) Error() string { + return fmt.Sprintf("Bucket \"%s\" doesn't exist", e.Bucket) +} + +// NewErrBucketNotExist returns an ErrBucketNotExist +func NewErrBucketNotExist(bucket []byte) error { + return ErrBucketNotExist{ + Bucket: string(bucket), + } +} + +// CreateBuckets creates multiple buckets +func CreateBuckets(tx *Tx, buckets [][]byte) error { + for _, b := range buckets { + if _, err := tx.CreateBucketIfNotExists(b); err != nil { + return NewErrCreateBucketFailed(b, err) + } + } + + return nil +} + +// GetBucketObjectDecoded returns an encoder-serialized value from a bucket, decoded to an object +func GetBucketObjectDecoded(tx *Tx, bktName, key []byte, obj interface{}) (bool, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return false, err + } else if v == nil { + return false, nil + } + + if err := encoder.DeserializeRawExact(v, obj); err != nil { + return false, fmt.Errorf("encoder.DeserializeRawExact failed: %v", err) + } + + return true, nil +} + +// GetBucketObjectJSON returns a JSON value from a bucket, unmarshaled to an object +func GetBucketObjectJSON(tx *Tx, bktName, key []byte, obj interface{}) (bool, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return false, err + } else if v == nil { + return false, nil + } + + if err := json.Unmarshal(v, obj); err != nil { + return false, fmt.Errorf("json.Unmarshal failed: %v", err) + } + + return true, nil +} + +// GetBucketString returns a string value from a bucket +func GetBucketString(tx *Tx, bktName, key []byte) (string, bool, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return "", false, err + } else if v == nil { + return "", false, nil + } + + return string(v), true, nil +} + +// GetBucketValue returns a []byte value from a bucket. If the bucket does not exist, +// it returns an error of type ErrBucketNotExist +func GetBucketValue(tx *Tx, bktName, key []byte) ([]byte, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + // Bytes returned from boltdb are not valid outside of the transaction + // they are called in, make a copy + w := make([]byte, len(v)) + copy(w[:], v[:]) + + return w, nil +} + +// GetBucketValueNoCopy returns a value from a bucket. If the bucket does not exist, +// it returns an error of type ErrBucketNotExist. The byte value is not copied so is not valid +// outside of the database transaction +func GetBucketValueNoCopy(tx *Tx, bktName, key []byte) ([]byte, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return nil, NewErrBucketNotExist(bktName) + } + + return bkt.Get(key), nil +} + +// PutBucketValue puts a value into a bucket under key. +func PutBucketValue(tx *Tx, bktName, key, val []byte) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.Put(key, val) +} + +// BucketHasKey returns true if a bucket has a non-nil value for a key +func BucketHasKey(tx *Tx, bktName, key []byte) (bool, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return false, NewErrBucketNotExist(bktName) + } + + v := bkt.Get(key) + return v != nil, nil +} + +// NextSequence returns the NextSequence() from the bucket +func NextSequence(tx *Tx, bktName []byte) (uint64, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return 0, NewErrBucketNotExist(bktName) + } + + return bkt.NextSequence() +} + +// ForEach calls ForEach on the bucket +func ForEach(tx *Tx, bktName []byte, f func(k, v []byte) error) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.ForEach(f) +} + +// Delete deletes from a bucket +func Delete(tx *Tx, bktName, key []byte) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.Delete(key) +} + +// Len returns the number of keys in a bucket +func Len(tx *Tx, bktName []byte) (uint64, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return 0, NewErrBucketNotExist(bktName) + } + + bstats := bkt.Stats() + + if bstats.KeyN < 0 { + return 0, errors.New("Negative length queried from db stats") + } + + return uint64(bstats.KeyN), nil +} + +// IsEmpty returns true if the bucket is empty +func IsEmpty(tx *Tx, bktName []byte) (bool, error) { + b := tx.Bucket(bktName) + if b == nil { + return false, NewErrBucketNotExist(bktName) + } + + c := b.Cursor() + k, _ := c.First() + return k == nil, nil +} + +// Exists returns true if the bucket exists +func Exists(tx *Tx, bktName []byte) bool { + return tx.Bucket(bktName) != nil +} + +// Reset resets the bucket +func Reset(tx *Tx, bktName []byte) error { + if err := tx.DeleteBucket(bktName); err != nil { + return err + } + + _, err := tx.CreateBucket(bktName) + return err +} + +// Itob converts uint64 to bytes +func Itob(v uint64) []byte { + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, v) + return b +} + +// Btoi converts bytes to uint64 +func Btoi(v []byte) uint64 { + return binary.BigEndian.Uint64(v) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_txn.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_txn.go new file mode 100644 index 0000000000..b8b06e0abe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_txn.go @@ -0,0 +1,79 @@ +package historydb + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +//go:generate skyencoder -unexported -struct hashesWrapper + +// hashesWrapper wraps []cipher.SHA256 +type hashesWrapper struct { + Hashes []cipher.SHA256 +} + +// AddressTxnsBkt maps addresses to transaction hashes +var AddressTxnsBkt = []byte("address_txns") + +// addressTxn buckets for storing address related transactions +// address as key, transaction id slice as value +type addressTxns struct{} + +// get returns the transaction hashes of given address +func (atx *addressTxns) get(tx *dbutil.Tx, addr cipher.Address) ([]cipher.SHA256, error) { + var txnHashes hashesWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, AddressTxnsBkt, addr.Bytes()) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashesWrapperExact(v, &txnHashes); err != nil { + return nil, err + } + + return txnHashes.Hashes, nil +} + +// add adds a hash to an address's hash list +func (atx *addressTxns) add(tx *dbutil.Tx, addr cipher.Address, hash cipher.SHA256) error { + hashes, err := atx.get(tx, addr) + if err != nil { + return err + } + + // check for duplicates + for _, u := range hashes { + if u == hash { + return nil + } + } + + hashes = append(hashes, hash) + + buf, err := encodeHashesWrapper(&hashesWrapper{ + Hashes: hashes, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, AddressTxnsBkt, addr.Bytes(), buf) +} + +// contains returns true if an address has transactions +func (atx *addressTxns) contains(tx *dbutil.Tx, addr cipher.Address) (bool, error) { + return dbutil.BucketHasKey(tx, AddressTxnsBkt, addr.Bytes()) +} + +// isEmpty checks if address transactions bucket is empty +func (atx *addressTxns) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, AddressTxnsBkt) +} + +// reset resets the bucket +func (atx *addressTxns) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, AddressTxnsBkt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_uxout.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_uxout.go new file mode 100644 index 0000000000..93782f21c4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_uxout.go @@ -0,0 +1,66 @@ +package historydb + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// AddressUxBkt maps addresses to unspent outputs +var AddressUxBkt = []byte("address_in") + +// bucket for storing address with UxOut, key as address, value as UxOut. +type addressUx struct{} + +// get return nil on not found. +func (au *addressUx) get(tx *dbutil.Tx, addr cipher.Address) ([]cipher.SHA256, error) { + var uxHashes hashesWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, AddressUxBkt, addr.Bytes()) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashesWrapperExact(v, &uxHashes); err != nil { + return nil, err + } + + return uxHashes.Hashes, nil +} + +// add adds a hash to an address's hash list +func (au *addressUx) add(tx *dbutil.Tx, address cipher.Address, uxHash cipher.SHA256) error { + hashes, err := au.get(tx, address) + if err != nil { + return err + } + + // check for duplicate hashes + for _, u := range hashes { + if u == uxHash { + return nil + } + } + + hashes = append(hashes, uxHash) + + buf, err := encodeHashesWrapper(&hashesWrapper{ + Hashes: hashes, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, AddressUxBkt, address.Bytes(), buf) +} + +// isEmpty checks if the addressUx bucket is empty +func (au *addressUx) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, AddressUxBkt) +} + +// reset resets the bucket +func (au *addressUx) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, AddressUxBkt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/hashes_wrapper_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/hashes_wrapper_skyencoder.go new file mode 100644 index 0000000000..711d31aec7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/hashes_wrapper_skyencoder.go @@ -0,0 +1,125 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. +package historydb + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// encodeSizeHashesWrapper computes the size of an encoded object of type hashesWrapper +func encodeSizeHashesWrapper(obj *hashesWrapper) uint64 { + i0 := uint64(0) + + // obj.Hashes + i0 += 4 + { + i1 := uint64(0) + + // x + i1 += 32 + + i0 += uint64(len(obj.Hashes)) * i1 + } + + return i0 +} + +// encodeHashesWrapper encodes an object of type hashesWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeHashesWrapper(obj *hashesWrapper) ([]byte, error) { + n := encodeSizeHashesWrapper(obj) + buf := make([]byte, n) + + if err := encodeHashesWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeHashesWrapperToBuffer encodes an object of type hashesWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeHashesWrapperToBuffer(buf []byte, obj *hashesWrapper) error { + if uint64(len(buf)) < encodeSizeHashesWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Hashes length check + if uint64(len(obj.Hashes)) > math.MaxUint32 { + return errors.New("obj.Hashes length exceeds math.MaxUint32") + } + + // obj.Hashes length + e.Uint32(uint32(len(obj.Hashes))) + + // obj.Hashes + for _, x := range obj.Hashes { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeHashesWrapper decodes an object of type hashesWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeHashesWrapper(buf []byte, obj *hashesWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Hashes + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Hashes = make([]cipher.SHA256, length) + + for z1 := range obj.Hashes { + { + // obj.Hashes[z1] + if len(d.Buffer) < len(obj.Hashes[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Hashes[z1][:], d.Buffer[:len(obj.Hashes[z1])]) + d.Buffer = d.Buffer[len(obj.Hashes[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeHashesWrapperExact decodes an object of type hashesWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeHashesWrapperExact(buf []byte, obj *hashesWrapper) error { + if n, err := decodeHashesWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/history_meta.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/history_meta.go new file mode 100644 index 0000000000..33a49e1643 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/history_meta.go @@ -0,0 +1,36 @@ +package historydb + +import ( + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // HistoryMetaBkt holds history metadata + HistoryMetaBkt = []byte("history_meta") + parsedHeightKey = []byte("parsed_height") +) + +// historyMeta bucket for storing block history meta info +type historyMeta struct{} + +// parsedBlockSeq returns history parsed block seq +func (hm *historyMeta) parsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, HistoryMetaBkt, parsedHeightKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} + +// setParsedBlockSeq updates history parsed block seq +func (hm *historyMeta) setParsedBlockSeq(tx *dbutil.Tx, h uint64) error { + return dbutil.PutBucketValue(tx, HistoryMetaBkt, parsedHeightKey, dbutil.Itob(h)) +} + +// reset resets the bucket +func (hm *historyMeta) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, HistoryMetaBkt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/historydb.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/historydb.go new file mode 100644 index 0000000000..44c421e2a7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/historydb.go @@ -0,0 +1,412 @@ +/* +Package historydb stores historical blockchain data. +*/ +package historydb + +import ( + "errors" + "fmt" + "sync" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var logger = logging.MustGetLogger("historydb") + +// CreateBuckets creates bolt.DB buckets used by the historydb +func CreateBuckets(tx *dbutil.Tx) error { + return dbutil.CreateBuckets(tx, [][]byte{ + AddressTxnsBkt, + AddressUxBkt, + HistoryMetaBkt, + UxOutsBkt, + TransactionsBkt, + }) +} + +// HistoryDB provides APIs for blockchain explorer +type HistoryDB struct { + outputs *uxOuts // outputs bucket + txns *transactions // transactions bucket + addrUx *addressUx // bucket which stores all UxOuts that address received + addrTxns *addressTxns // address related transaction bucket + meta *historyMeta // stores history meta info +} + +// New create HistoryDB instance +func New() *HistoryDB { + return &HistoryDB{ + outputs: &uxOuts{}, + txns: &transactions{}, + addrUx: &addressUx{}, + addrTxns: &addressTxns{}, + meta: &historyMeta{}, + } +} + +// NeedsReset checks if need to reset the parsed block history, +// If we have a new added bucket, we need to reset to parse +// blockchain again to get the new bucket filled. +func (hd *HistoryDB) NeedsReset(tx *dbutil.Tx) (bool, error) { + _, ok, err := hd.meta.parsedBlockSeq(tx) + if err != nil { + return false, err + } else if !ok { + return true, nil + } + + // if any of the following buckets are empty, need to reset + addrTxnsEmpty, err := hd.addrTxns.isEmpty(tx) + if err != nil { + return false, err + } + + addrUxEmpty, err := hd.addrUx.isEmpty(tx) + if err != nil { + return false, err + } + + txnsEmpty, err := hd.txns.isEmpty(tx) + if err != nil { + return false, err + } + + outputsEmpty, err := hd.outputs.isEmpty(tx) + if err != nil { + return false, err + } + + if addrTxnsEmpty || addrUxEmpty || txnsEmpty || outputsEmpty { + return true, nil + } + + return false, nil +} + +// Erase erases the entire HistoryDB +func (hd *HistoryDB) Erase(tx *dbutil.Tx) error { + logger.Debug("HistoryDB.reset") + if err := hd.addrTxns.reset(tx); err != nil { + return err + } + + if err := hd.addrUx.reset(tx); err != nil { + return err + } + + if err := hd.outputs.reset(tx); err != nil { + return err + } + + if err := hd.meta.reset(tx); err != nil { + return err + } + + return hd.txns.reset(tx) +} + +// ParsedBlockSeq returns the block seq up to which the HistoryDB is parsed +func (hd *HistoryDB) ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) { + return hd.meta.parsedBlockSeq(tx) +} + +// SetParsedBlockSeq sets the block seq up to which the HistoryDB is parsed +func (hd *HistoryDB) SetParsedBlockSeq(tx *dbutil.Tx, seq uint64) error { + return hd.meta.setParsedBlockSeq(tx, seq) +} + +// GetUxOuts get UxOut of specific uxIDs. +func (hd *HistoryDB) GetUxOuts(tx *dbutil.Tx, uxIDs []cipher.SHA256) ([]UxOut, error) { + return hd.outputs.getArray(tx, uxIDs) +} + +// ParseBlock builds indexes out of the block data +func (hd *HistoryDB) ParseBlock(tx *dbutil.Tx, b coin.Block) error { + for _, t := range b.Body.Transactions { + txn := Transaction{ + Txn: t, + BlockSeq: b.Seq(), + } + + spentTxnID := t.Hash() + + if err := hd.txns.put(tx, &txn); err != nil { + return err + } + + for _, in := range t.In { + o, err := hd.outputs.get(tx, in) + if err != nil { + return err + } + + if o == nil { + return errors.New("HistoryDB.ParseBlock: transaction input not found in outputs bucket") + } + + // update the output's spent block seq and txid + o.SpentBlockSeq = b.Seq() + o.SpentTxnID = spentTxnID + if err := hd.outputs.put(tx, *o); err != nil { + return err + } + + // store the IN address with txid + if err := hd.addrTxns.add(tx, o.Out.Body.Address, spentTxnID); err != nil { + return err + } + } + + // handle the tx out + uxArray := coin.CreateUnspents(b.Head, t) + for _, ux := range uxArray { + if err := hd.outputs.put(tx, UxOut{ + Out: ux, + }); err != nil { + return err + } + + if err := hd.addrUx.add(tx, ux.Body.Address, ux.Hash()); err != nil { + return err + } + + if err := hd.addrTxns.add(tx, ux.Body.Address, spentTxnID); err != nil { + return err + } + } + } + + return hd.SetParsedBlockSeq(tx, b.Seq()) +} + +// GetTransaction get transaction by hash. +func (hd HistoryDB) GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + return hd.txns.get(tx, hash) +} + +// GetOutputsForAddress get all uxout that the address affected. +func (hd HistoryDB) GetOutputsForAddress(tx *dbutil.Tx, addr cipher.Address) ([]UxOut, error) { + hashes, err := hd.addrUx.get(tx, addr) + if err != nil { + return nil, err + } + + return hd.outputs.getArray(tx, hashes) +} + +// GetTransactionHashesForAddresses returns transaction hashes of related addresses +func (hd HistoryDB) GetTransactionHashesForAddresses(tx *dbutil.Tx, addrs []cipher.Address) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + hashMap := make(map[cipher.SHA256]struct{}) + for _, addr := range addrs { + hs, err := hd.addrTxns.get(tx, addr) + if err != nil { + return nil, err + } + // clear duplicate hashes + for _, h := range hs { + if _, ok := hashMap[h]; ok { + continue + } + hashes = append(hashes, h) + hashMap[h] = struct{}{} + } + } + + return hashes, nil +} + +// AddressSeen returns true if the address appears in the blockchain +func (hd HistoryDB) AddressSeen(tx *dbutil.Tx, addr cipher.Address) (bool, error) { + return hd.addrTxns.contains(tx, addr) +} + +// ForEachTxn traverses the transactions bucket +func (hd HistoryDB) ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *Transaction) error) error { + return hd.txns.forEach(tx, f) +} + +// IndexesMap is a goroutine safe address indexes map +type IndexesMap struct { + value map[cipher.Address]AddressIndexes + lock sync.RWMutex +} + +// NewIndexesMap creates a IndexesMap instance +func NewIndexesMap() *IndexesMap { + return &IndexesMap{ + value: make(map[cipher.Address]AddressIndexes), + } +} + +// Load returns value of given key +func (im *IndexesMap) Load(addr cipher.Address) (AddressIndexes, bool) { + im.lock.RLock() + defer im.lock.RUnlock() + v, ok := im.value[addr] + return v, ok +} + +// Store saves address with indexes +func (im *IndexesMap) Store(addr cipher.Address, indexes AddressIndexes) { + im.lock.Lock() + defer im.lock.Unlock() + im.value[addr] = indexes +} + +// AddressIndexes represents the address indexes struct +type AddressIndexes struct { + TxnHashes map[cipher.SHA256]struct{} + UxHashes map[cipher.SHA256]struct{} +} + +// Verify checks if the historydb is corrupted +func (hd HistoryDB) Verify(tx *dbutil.Tx, b *coin.SignedBlock, indexesMap *IndexesMap) error { + for _, t := range b.Body.Transactions { + txnHash := t.Hash() + txn, err := hd.txns.get(tx, txnHash) + if err != nil { + return err + } + + if txn == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction %v does not exist in historydb", txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + for _, in := range t.In { + // Checks the existence of transaction input + o, err := hd.outputs.get(tx, in) + if err != nil { + return err + } + + if o == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction input %v does not exist in historydb", in.Hex()) + return ErrHistoryDBCorrupted{err} + } + + // Checks the output's spend block seq + if o.SpentBlockSeq != b.Seq() { + err := fmt.Errorf("HistoryDB.Verify: spend block seq of transaction input %v is wrong, should be: %v, but is %v", + in.Hex(), b.Seq(), o.SpentBlockSeq) + return ErrHistoryDBCorrupted{err} + } + + addr := o.Out.Body.Address + txnHashesMap := map[cipher.SHA256]struct{}{} + uxHashesMap := map[cipher.SHA256]struct{}{} + + // Checks if the address indexes already loaded into memory + indexes, ok := indexesMap.Load(addr) + if ok { + txnHashesMap = indexes.TxnHashes + uxHashesMap = indexes.UxHashes + } else { + txnHashes, err := hd.addrTxns.get(tx, addr) + if err != nil { + return err + } + for _, hash := range txnHashes { + txnHashesMap[hash] = struct{}{} + } + + uxHashes, err := hd.addrUx.get(tx, addr) + if err != nil { + return err + } + for _, hash := range uxHashes { + uxHashesMap[hash] = struct{}{} + } + + indexesMap.Store(addr, AddressIndexes{ + TxnHashes: txnHashesMap, + UxHashes: uxHashesMap, + }) + } + + if _, ok := txnHashesMap[txnHash]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address transaction [%s:%s] does not exist in historydb", + addr, txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + if _, ok := uxHashesMap[in]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address uxout [%s:%s] does not exist in historydb", + addr, in.Hex()) + return ErrHistoryDBCorrupted{err} + } + } + + // Checks the transaction outs + uxArray := coin.CreateUnspents(b.Head, t) + for _, ux := range uxArray { + uxHash := ux.Hash() + out, err := hd.outputs.get(tx, uxHash) + if err != nil { + return err + } + + if out == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction output %s does not exist in historydb", uxHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + addr := ux.Body.Address + txnHashesMap := map[cipher.SHA256]struct{}{} + indexes, ok := indexesMap.Load(addr) + if ok { + txnHashesMap = indexes.TxnHashes + } else { + txnHashes, err := hd.addrTxns.get(tx, addr) + if err != nil { + return err + } + for _, hash := range txnHashes { + txnHashesMap[hash] = struct{}{} + } + + uxHashes, err := hd.addrUx.get(tx, addr) + if err != nil { + return err + } + + uxHashesMap := make(map[cipher.SHA256]struct{}, len(uxHashes)) + for _, hash := range uxHashes { + uxHashesMap[hash] = struct{}{} + } + + indexesMap.Store(addr, AddressIndexes{ + TxnHashes: txnHashesMap, + UxHashes: uxHashesMap, + }) + } + + if _, ok := txnHashesMap[txnHash]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address transaction [%s:%s] does not exist in historydb", + addr, txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + } + } + return nil +} + +// GetTransactionsNum returns all transactions number +func (hd HistoryDB) GetTransactionsNum(tx *dbutil.Tx) (uint64, error) { + return hd.txns.len(tx) +} + +// ErrHistoryDBCorrupted is returned when found the historydb is corrupted +type ErrHistoryDBCorrupted struct { + error +} + +// NewErrHistoryDBCorrupted is for user to be able to create ErrHistoryDBCorrupted instance +// outside of the package +func NewErrHistoryDBCorrupted(err error) ErrHistoryDBCorrupted { + return ErrHistoryDBCorrupted{err} +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/output.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/output.go new file mode 100644 index 0000000000..d639a91805 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/output.go @@ -0,0 +1,102 @@ +package historydb + +import ( + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +//go:generate skyencoder -unexported -struct UxOut + +// UxOutsBkt holds unspent outputs +var UxOutsBkt = []byte("uxouts") + +// UxOut expend coin.UxOut struct +type UxOut struct { + Out coin.UxOut + SpentTxnID cipher.SHA256 // id of tx which spent this output. + SpentBlockSeq uint64 // block seq that spent the output. +} + +// Hash returns outhash +func (o UxOut) Hash() cipher.SHA256 { + return o.Out.Hash() +} + +// ErrUxOutNotExist is returned if an uxout is not found in historydb +type ErrUxOutNotExist struct { + UxID string +} + +// NewErrUxOutNotExist creates ErrUxOutNotExist from a UxID +func NewErrUxOutNotExist(uxID string) error { + return ErrUxOutNotExist{ + UxID: uxID, + } +} + +func (e ErrUxOutNotExist) Error() string { + return fmt.Sprintf("uxout of %s does not exist", e.UxID) +} + +// uxOuts bucket stores outputs, UxOut hash as key and Output as value. +type uxOuts struct{} + +// put sets out value +func (ux *uxOuts) put(tx *dbutil.Tx, out UxOut) error { + hash := out.Hash() + + buf, err := encodeUxOut(&out) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UxOutsBkt, hash[:], buf) +} + +// get gets UxOut of given id +func (ux *uxOuts) get(tx *dbutil.Tx, uxID cipher.SHA256) (*UxOut, error) { + var out UxOut + + v, err := dbutil.GetBucketValueNoCopy(tx, UxOutsBkt, uxID[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeUxOutExact(v, &out); err != nil { + return nil, err + } + + return &out, nil +} + +// getArray returns uxOuts for a set of uxids, will return error if any of the uxids do not exist +func (ux *uxOuts) getArray(tx *dbutil.Tx, uxIDs []cipher.SHA256) ([]UxOut, error) { + var outs []UxOut + for _, uxID := range uxIDs { + out, err := ux.get(tx, uxID) + if err != nil { + return nil, err + } else if out == nil { + return nil, NewErrUxOutNotExist(uxID.Hex()) + } + + outs = append(outs, *out) + } + + return outs, nil +} + +// isEmpty checks if the uxout bucekt is empty +func (ux *uxOuts) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, UxOutsBkt) +} + +// reset resets the bucket +func (ux *uxOuts) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, UxOutsBkt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction.go new file mode 100644 index 0000000000..0ea959adc1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction.go @@ -0,0 +1,112 @@ +package historydb + +// transaction.go mainly provides transaction corresponding buckets and apis, +// The transactions bucket, tx hash as key, and tx as value, it's the main bucket that stores the +// transaction value. All other buckets that index different field of transaction will only record the +// transaction hash, and get the tx value from transactions bucket. + +import ( + "errors" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +//go:generate skyencoder -unexported -struct Transaction + +// Transaction contains transaction info and the seq of block which executed this block. +type Transaction struct { + Txn coin.Transaction + BlockSeq uint64 +} + +// Hash return the Txn hash. +func (txn *Transaction) Hash() cipher.SHA256 { + return txn.Txn.Hash() +} + +// TransactionsBkt holds Transactions +var TransactionsBkt = []byte("transactions") + +// Transactions transaction bucket instance. +type transactions struct{} + +// put transaction in the db +func (txs *transactions) put(tx *dbutil.Tx, txn *Transaction) error { + hash := txn.Hash() + buf, err := encodeTransaction(txn) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, TransactionsBkt, hash[:], buf) +} + +// get gets transaction by transaction hash, return nil on not found +func (txs *transactions) get(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + var txn Transaction + + v, err := dbutil.GetBucketValueNoCopy(tx, TransactionsBkt, hash[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeTransactionExact(v, &txn); err != nil { + return nil, err + } + + return &txn, nil +} + +// getArray returns transactions slice of given hashes +func (txs *transactions) getArray(tx *dbutil.Tx, hashes []cipher.SHA256) ([]Transaction, error) { + txns := make([]Transaction, 0, len(hashes)) + for _, h := range hashes { + txn, err := txs.get(tx, h) + if err != nil { + return nil, err + } + if txn == nil { + return nil, errors.New("Transaction not found") + } + + txns = append(txns, *txn) + } + + return txns, nil +} + +// isEmpty checks if transaction bucket is empty +func (txs *transactions) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, TransactionsBkt) +} + +// reset resets the bucket +func (txs *transactions) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, TransactionsBkt) +} + +// forEach traverses the transactions in db +func (txs *transactions) forEach(tx *dbutil.Tx, f func(cipher.SHA256, *Transaction) error) error { + return dbutil.ForEach(tx, TransactionsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + if err != nil { + return err + } + + var txn Transaction + if err := decodeTransactionExact(v, &txn); err != nil { + return err + } + + return f(hash, &txn) + }) +} + +// len returns the total number of all transactions +func (txs *transactions) len(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, TransactionsBkt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction_skyencoder.go new file mode 100644 index 0000000000..e3a56c4f0f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction_skyencoder.go @@ -0,0 +1,372 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. +package historydb + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" +) + +// encodeSizeTransaction computes the size of an encoded object of type Transaction +func encodeSizeTransaction(obj *Transaction) uint64 { + i0 := uint64(0) + + // obj.Txn.Length + i0 += 4 + + // obj.Txn.Type + i0++ + + // obj.Txn.InnerHash + i0 += 32 + + // obj.Txn.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x + i1 += 65 + + i0 += uint64(len(obj.Txn.Sigs)) * i1 + } + + // obj.Txn.In + i0 += 4 + { + i1 := uint64(0) + + // x + i1 += 32 + + i0 += uint64(len(obj.Txn.In)) * i1 + } + + // obj.Txn.Out + i0 += 4 + { + i1 := uint64(0) + + // x.Address.Version + i1++ + + // x.Address.Key + i1 += 20 + + // x.Coins + i1 += 8 + + // x.Hours + i1 += 8 + + i0 += uint64(len(obj.Txn.Out)) * i1 + } + + // obj.BlockSeq + i0 += 8 + + return i0 +} + +// encodeTransaction encodes an object of type Transaction to a buffer allocated to the exact size +// required to encode the object. +func encodeTransaction(obj *Transaction) ([]byte, error) { + n := encodeSizeTransaction(obj) + buf := make([]byte, n) + + if err := encodeTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionToBuffer encodes an object of type Transaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionToBuffer(buf []byte, obj *Transaction) error { + if uint64(len(buf)) < encodeSizeTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Txn.Length + e.Uint32(obj.Txn.Length) + + // obj.Txn.Type + e.Uint8(obj.Txn.Type) + + // obj.Txn.InnerHash + e.CopyBytes(obj.Txn.InnerHash[:]) + + // obj.Txn.Sigs maxlen check + if len(obj.Txn.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Txn.Sigs length check + if uint64(len(obj.Txn.Sigs)) > math.MaxUint32 { + return errors.New("obj.Txn.Sigs length exceeds math.MaxUint32") + } + + // obj.Txn.Sigs length + e.Uint32(uint32(len(obj.Txn.Sigs))) + + // obj.Txn.Sigs + for _, x := range obj.Txn.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Txn.In maxlen check + if len(obj.Txn.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Txn.In length check + if uint64(len(obj.Txn.In)) > math.MaxUint32 { + return errors.New("obj.Txn.In length exceeds math.MaxUint32") + } + + // obj.Txn.In length + e.Uint32(uint32(len(obj.Txn.In))) + + // obj.Txn.In + for _, x := range obj.Txn.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Txn.Out maxlen check + if len(obj.Txn.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Txn.Out length check + if uint64(len(obj.Txn.Out)) > math.MaxUint32 { + return errors.New("obj.Txn.Out length exceeds math.MaxUint32") + } + + // obj.Txn.Out length + e.Uint32(uint32(len(obj.Txn.Out))) + + // obj.Txn.Out + for _, x := range obj.Txn.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + // obj.BlockSeq + e.Uint64(obj.BlockSeq) + + return nil +} + +// decodeTransaction decodes an object of type Transaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransaction(buf []byte, obj *Transaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Txn.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Txn.Length = i + } + + { + // obj.Txn.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Txn.Type = i + } + + { + // obj.Txn.InnerHash + if len(d.Buffer) < len(obj.Txn.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.InnerHash[:], d.Buffer[:len(obj.Txn.InnerHash)]) + d.Buffer = d.Buffer[len(obj.Txn.InnerHash):] + } + + { + // obj.Txn.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Txn.Sigs = make([]cipher.Sig, length) + + for z2 := range obj.Txn.Sigs { + { + // obj.Txn.Sigs[z2] + if len(d.Buffer) < len(obj.Txn.Sigs[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.Sigs[z2][:], d.Buffer[:len(obj.Txn.Sigs[z2])]) + d.Buffer = d.Buffer[len(obj.Txn.Sigs[z2]):] + } + + } + } + } + + { + // obj.Txn.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Txn.In = make([]cipher.SHA256, length) + + for z2 := range obj.Txn.In { + { + // obj.Txn.In[z2] + if len(d.Buffer) < len(obj.Txn.In[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.In[z2][:], d.Buffer[:len(obj.Txn.In[z2])]) + d.Buffer = d.Buffer[len(obj.Txn.In[z2]):] + } + + } + } + } + + { + // obj.Txn.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Txn.Out = make([]coin.TransactionOutput, length) + + for z2 := range obj.Txn.Out { + { + // obj.Txn.Out[z2].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Txn.Out[z2].Address.Version = i + } + + { + // obj.Txn.Out[z2].Address.Key + if len(d.Buffer) < len(obj.Txn.Out[z2].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.Out[z2].Address.Key[:], d.Buffer[:len(obj.Txn.Out[z2].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Txn.Out[z2].Address.Key):] + } + + { + // obj.Txn.Out[z2].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Txn.Out[z2].Coins = i + } + + { + // obj.Txn.Out[z2].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Txn.Out[z2].Hours = i + } + + } + } + } + + { + // obj.BlockSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.BlockSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionExact decodes an object of type Transaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionExact(buf []byte, obj *Transaction) error { + if n, err := decodeTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/ux_out_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/ux_out_skyencoder.go new file mode 100644 index 0000000000..502a79485e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/ux_out_skyencoder.go @@ -0,0 +1,197 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. +package historydb + +import "github.com/skycoin/skycoin/src/cipher/encoder" + +// encodeSizeUxOut computes the size of an encoded object of type UxOut +func encodeSizeUxOut(obj *UxOut) uint64 { + i0 := uint64(0) + + // obj.Out.Head.Time + i0 += 8 + + // obj.Out.Head.BkSeq + i0 += 8 + + // obj.Out.Body.SrcTransaction + i0 += 32 + + // obj.Out.Body.Address.Version + i0++ + + // obj.Out.Body.Address.Key + i0 += 20 + + // obj.Out.Body.Coins + i0 += 8 + + // obj.Out.Body.Hours + i0 += 8 + + // obj.SpentTxnID + i0 += 32 + + // obj.SpentBlockSeq + i0 += 8 + + return i0 +} + +// encodeUxOut encodes an object of type UxOut to a buffer allocated to the exact size +// required to encode the object. +func encodeUxOut(obj *UxOut) ([]byte, error) { + n := encodeSizeUxOut(obj) + buf := make([]byte, n) + + if err := encodeUxOutToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxOutToBuffer encodes an object of type UxOut to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxOutToBuffer(buf []byte, obj *UxOut) error { + if uint64(len(buf)) < encodeSizeUxOut(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Out.Head.Time + e.Uint64(obj.Out.Head.Time) + + // obj.Out.Head.BkSeq + e.Uint64(obj.Out.Head.BkSeq) + + // obj.Out.Body.SrcTransaction + e.CopyBytes(obj.Out.Body.SrcTransaction[:]) + + // obj.Out.Body.Address.Version + e.Uint8(obj.Out.Body.Address.Version) + + // obj.Out.Body.Address.Key + e.CopyBytes(obj.Out.Body.Address.Key[:]) + + // obj.Out.Body.Coins + e.Uint64(obj.Out.Body.Coins) + + // obj.Out.Body.Hours + e.Uint64(obj.Out.Body.Hours) + + // obj.SpentTxnID + e.CopyBytes(obj.SpentTxnID[:]) + + // obj.SpentBlockSeq + e.Uint64(obj.SpentBlockSeq) + + return nil +} + +// decodeUxOut decodes an object of type UxOut from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxOut(buf []byte, obj *UxOut) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Out.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Head.Time = i + } + + { + // obj.Out.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Head.BkSeq = i + } + + { + // obj.Out.Body.SrcTransaction + if len(d.Buffer) < len(obj.Out.Body.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out.Body.SrcTransaction[:], d.Buffer[:len(obj.Out.Body.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.Out.Body.SrcTransaction):] + } + + { + // obj.Out.Body.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out.Body.Address.Version = i + } + + { + // obj.Out.Body.Address.Key + if len(d.Buffer) < len(obj.Out.Body.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out.Body.Address.Key[:], d.Buffer[:len(obj.Out.Body.Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out.Body.Address.Key):] + } + + { + // obj.Out.Body.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Body.Coins = i + } + + { + // obj.Out.Body.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Body.Hours = i + } + + { + // obj.SpentTxnID + if len(d.Buffer) < len(obj.SpentTxnID) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.SpentTxnID[:], d.Buffer[:len(obj.SpentTxnID)]) + d.Buffer = d.Buffer[len(obj.SpentTxnID):] + } + + { + // obj.SpentBlockSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.SpentBlockSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxOutExact decodes an object of type UxOut from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxOutExact(buf []byte, obj *UxOut) error { + if n, err := decodeUxOut(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/verify.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/verify.go new file mode 100644 index 0000000000..27a53c2315 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/verify.go @@ -0,0 +1,129 @@ +package historydb + +import ( + "errors" + "reflect" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // ErrVerifyStopped is returned when database verification is interrupted + ErrVerifyStopped = errors.New("database verification stopped") +) + +// VerifyDBSkyencoderSafe verifies that the skyencoder generated code has the same result as the encoder +// for all data in the blockchain +func VerifyDBSkyencoderSafe(tx *dbutil.Tx, quit <-chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + if err := dbutil.ForEach(tx, AddressTxnsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashesWrapper + if err := decodeHashesWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []cipher.SHA256 + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.Hashes, b2) { + return errors.New("AddressTxnsBkt sha256 hashes mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, AddressUxBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashesWrapper + if err := decodeHashesWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []cipher.SHA256 + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.Hashes, b2) { + return errors.New("AddressUxBkt sha256 hashes mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UxOutsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 UxOut + if err := decodeUxOutExact(v, &b1); err != nil { + return err + } + + var b2 UxOut + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("UxOutsBkt ux out mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, TransactionsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 Transaction + if err := decodeTransactionExact(v, &b1); err != nil { + return err + } + + var b2 Transaction + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("TransactionsBkt ux out mismatch") + } + + return nil + }); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/interfaces.go b/vendor/github.com/skycoin/skycoin/src/visor/interfaces.go new file mode 100644 index 0000000000..23f5494c89 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/interfaces.go @@ -0,0 +1,73 @@ +package visor + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/transaction" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +//go:generate mockery -name Historyer -case underscore -inpkg -testonly +//go:generate mockery -name Blockchainer -case underscore -inpkg -testonly +//go:generate mockery -name UnconfirmedTransactionPooler -case underscore -inpkg -testonly + +// Historyer is the interface that provides methods for accessing history data that are parsed from blockchain. +type Historyer interface { + GetUxOuts(tx *dbutil.Tx, uxids []cipher.SHA256) ([]historydb.UxOut, error) + ParseBlock(tx *dbutil.Tx, b coin.Block) error + GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*historydb.Transaction, error) + GetTransactionsNum(tx *dbutil.Tx) (uint64, error) + GetOutputsForAddress(tx *dbutil.Tx, address cipher.Address) ([]historydb.UxOut, error) + GetTransactionHashesForAddresses(tx *dbutil.Tx, addresses []cipher.Address) ([]cipher.SHA256, error) + AddressSeen(tx *dbutil.Tx, address cipher.Address) (bool, error) + NeedsReset(tx *dbutil.Tx) (bool, error) + Erase(tx *dbutil.Tx) error + ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) + ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *historydb.Transaction) error) error +} + +// Blockchainer is the interface that provides methods for accessing the blockchain data +type Blockchainer interface { + GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) + GetBlocks(tx *dbutil.Tx, seqs []uint64) ([]coin.SignedBlock, error) + GetBlocksInRange(tx *dbutil.Tx, start, end uint64) ([]coin.SignedBlock, error) + GetLastBlocks(tx *dbutil.Tx, n uint64) ([]coin.SignedBlock, error) + GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) + Unspent() blockdb.UnspentPooler + Len(tx *dbutil.Tx) (uint64, error) + Head(tx *dbutil.Tx) (*coin.SignedBlock, error) + HeadSeq(tx *dbutil.Tx) (uint64, bool, error) + Time(tx *dbutil.Tx) (uint64, error) + NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) + ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error + VerifyBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error + VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error + VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, signed transaction.TxnSignedFlag) error + VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn, signed transaction.TxnSignedFlag) (*coin.SignedBlock, coin.UxArray, error) + TransactionFee(tx *dbutil.Tx, hours uint64) coin.FeeCalculator +} + +// UnconfirmedTransactionPooler is the interface that provides methods for +// accessing the unconfirmed transaction pool +type UnconfirmedTransactionPooler interface { + SetTransactionsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error + InjectTransaction(tx *dbutil.Tx, bc Blockchainer, t coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn) (bool, *transaction.ErrTxnViolatesSoftConstraint, error) + AllRawTransactions(tx *dbutil.Tx) (coin.Transactions, error) + RemoveTransactions(tx *dbutil.Tx, txns []cipher.SHA256) error + Refresh(tx *dbutil.Tx, bc Blockchainer, distParams params.Distribution, verifyParams params.VerifyTxn) ([]cipher.SHA256, error) + RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) + FilterKnown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) + GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) + RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) + GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) + Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTransaction, error) + GetFiltered(tx *dbutil.Tx, filter func(tx UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) + GetHashes(tx *dbutil.Tx, filter func(tx UnconfirmedTransaction) bool) ([]cipher.SHA256, error) + ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTransaction) error) error + GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) + Len(tx *dbutil.Tx) (uint64, error) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/meta.go b/vendor/github.com/skycoin/skycoin/src/visor/meta.go new file mode 100644 index 0000000000..54166f51d7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/meta.go @@ -0,0 +1,71 @@ +package visor + +import ( + "fmt" + + "github.com/blang/semver" + + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // MetaBkt stores data about the application DB + MetaBkt = []byte("db_meta") + + versionKey = []byte("version") +) + +// GetDBVersion returns the saved DB version +func GetDBVersion(db *dbutil.DB) (*semver.Version, error) { + var v *semver.Version + if err := db.View("GetDBVersion", func(tx *dbutil.Tx) error { + var err error + v, err = getDBVersion(tx) + return err + }); err != nil { + return nil, err + } + + return v, nil +} + +func getDBVersion(tx *dbutil.Tx) (*semver.Version, error) { + v, err := dbutil.GetBucketValue(tx, MetaBkt, versionKey) + if err != nil { + switch err.(type) { + case dbutil.ErrBucketNotExist: + return nil, nil + default: + return nil, err + } + } else if v == nil { + return nil, nil + } + + sv, err := semver.Make(string(v)) + if err != nil { + return nil, err + } + + return &sv, nil +} + +// SetDBVersion sets the DB version +func SetDBVersion(db *dbutil.DB, version semver.Version) error { + return db.Update("SetDBVersion", func(tx *dbutil.Tx) error { + if _, err := tx.CreateBucketIfNotExists(MetaBkt); err != nil { + return err + } + + oldVersion, err := getDBVersion(tx) + if err != nil { + return err + } + + if oldVersion != nil && oldVersion.GT(version) { + return fmt.Errorf("SetDBVersion cannot regress version from %v to %v", oldVersion, version) + } + + return dbutil.PutBucketValue(tx, MetaBkt, versionKey, []byte(version.String())) + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/objects.go b/vendor/github.com/skycoin/skycoin/src/visor/objects.go new file mode 100644 index 0000000000..d407a08ca9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/objects.go @@ -0,0 +1,213 @@ +package visor + +import ( + "time" + + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/transaction" +) + +// Transaction wraps around coin.Transaction, tagged with its status. This allows us +// to include unconfirmed txns +type Transaction struct { + Transaction coin.Transaction + Status TransactionStatus + Time uint64 +} + +// TransactionStatus represents the transaction status +type TransactionStatus struct { + Confirmed bool + // If confirmed, how many blocks deep in the chain it is. Will be at least 1 if confirmed. + Height uint64 + // If confirmed, the sequence of the block in which the transaction was executed + BlockSeq uint64 +} + +// NewUnconfirmedTransactionStatus creates unconfirmed transaction status +func NewUnconfirmedTransactionStatus() TransactionStatus { + return TransactionStatus{ + Confirmed: false, + Height: 0, + BlockSeq: 0, + } +} + +// NewConfirmedTransactionStatus creates confirmed transaction status +func NewConfirmedTransactionStatus(height, blockSeq uint64) TransactionStatus { + // Height starts at 1 + // TODO -- height should start at 0? + if height == 0 { + logger.Panic("Invalid confirmed transaction height") + } + return TransactionStatus{ + Confirmed: true, + Height: height, + BlockSeq: blockSeq, + } +} + +// TransactionInput includes the UxOut spent in a transaction and the calculated hours of the output at spending time +type TransactionInput struct { + UxOut coin.UxOut + CalculatedHours uint64 +} + +// NewTransactionInput creates a TransactionInput. +// calculateHoursTime is the time against which the CalculatedHours should be computed +func NewTransactionInput(ux coin.UxOut, calculateHoursTime uint64) (TransactionInput, error) { + // The overflow bug causes this to fail for some transactions, allow it to pass + calculatedHours, err := ux.CoinHours(calculateHoursTime) + if err != nil { + logger.Critical().Warningf("Ignoring NewTransactionInput ux.CoinHours failed: %v", err) + calculatedHours = 0 + } + + return TransactionInput{ + UxOut: ux, + CalculatedHours: calculatedHours, + }, nil +} + +// NewTransactionInputs creates []TransactionInput from []coin.UxOut. +// Assumes all coin.UxOuts have their coin hours calculated from the same reference time. +func NewTransactionInputs(uxa []coin.UxOut, calculateHoursTime uint64) ([]TransactionInput, error) { + if len(uxa) == 0 { + return nil, nil + } + + inputs := make([]TransactionInput, len(uxa)) + for i, x := range uxa { + var err error + inputs[i], err = NewTransactionInput(x, calculateHoursTime) + if err != nil { + return nil, err + } + } + + return inputs, nil +} + +// TransactionInputFromUxBalance converts transaction.UxBalance to TransactionInput +func TransactionInputFromUxBalance(x transaction.UxBalance) TransactionInput { + var t TransactionInput + t.CalculatedHours = x.Hours + t.UxOut.Head.BkSeq = x.BkSeq + t.UxOut.Head.Time = x.Time + t.UxOut.Body.Address = x.Address + t.UxOut.Body.Coins = x.Coins + t.UxOut.Body.Hours = x.InitialHours + t.UxOut.Body.SrcTransaction = x.SrcTransaction + + if t.UxOut.Hash() != x.Hash { + logger.Panic("Reconstructed coin.UxOut from transaction.UxBalance hash does not match") + } + + return t +} + +// NewTransactionInputsFromUxBalance converts []transaction.UxBalance to []TransactionInput +func NewTransactionInputsFromUxBalance(uxb []transaction.UxBalance) []TransactionInput { + if len(uxb) == 0 { + return nil + } + + inputs := make([]TransactionInput, len(uxb)) + for i, x := range uxb { + inputs[i] = TransactionInputFromUxBalance(x) + } + + return inputs +} + +// BlockchainMetadata encapsulates useful information from the coin.Blockchain +type BlockchainMetadata struct { + // Most recent block + HeadBlock coin.SignedBlock + // Number of unspent outputs in the coin.Blockchain + Unspents uint64 + // Number of known unconfirmed txns + Unconfirmed uint64 +} + +// NewBlockchainMetadata creates blockchain meta data +func NewBlockchainMetadata(head coin.SignedBlock, unconfirmedLen, unspentsLen uint64) (*BlockchainMetadata, error) { + return &BlockchainMetadata{ + HeadBlock: head, + Unspents: unspentsLen, + Unconfirmed: unconfirmedLen, + }, nil +} + +// UnconfirmedTransaction unconfirmed transaction +type UnconfirmedTransaction struct { + Transaction coin.Transaction + // Time the txn was last received + Received int64 + // Time the txn was last checked against the blockchain + Checked int64 + // Last time we announced this txn + Announced int64 + // If this txn is valid + IsValid int8 +} + +// NewUnconfirmedTransaction creates an UnconfirmedTransaction +func NewUnconfirmedTransaction(txn coin.Transaction) UnconfirmedTransaction { + now := time.Now().UTC() + return UnconfirmedTransaction{ + Transaction: txn, + Received: now.UnixNano(), + Checked: now.UnixNano(), + Announced: time.Time{}.UnixNano(), + IsValid: 0, + } +} + +// UnspentOutput includes coin.UxOut and adds CalculatedHours +type UnspentOutput struct { + coin.UxOut + CalculatedHours uint64 +} + +// NewUnspentOutput creates an UnspentOutput +func NewUnspentOutput(uxOut coin.UxOut, calculateHoursTime uint64) (UnspentOutput, error) { + calculatedHours, err := uxOut.CoinHours(calculateHoursTime) + + // Treat overflowing coin hours calculations as a non-error and force hours to 0 + // This affects one bad spent output which had overflowed hours, spent in block 13277. + switch err { + case nil: + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + calculatedHours = 0 + default: + return UnspentOutput{}, err + } + + return UnspentOutput{ + UxOut: uxOut, + CalculatedHours: calculatedHours, + }, nil +} + +// NewUnspentOutputs creates []UnspentOutput +func NewUnspentOutputs(uxOuts []coin.UxOut, calculateHoursTime uint64) ([]UnspentOutput, error) { + outs := make([]UnspentOutput, len(uxOuts)) + for i, ux := range uxOuts { + u, err := NewUnspentOutput(ux, calculateHoursTime) + if err != nil { + return nil, err + } + outs[i] = u + } + + return outs, nil +} + +// UnspentOutputsSummary includes current unspent outputs and incoming and outgoing unspent outputs +type UnspentOutputsSummary struct { + HeadBlock *coin.SignedBlock + Confirmed []UnspentOutput + Outgoing []UnspentOutput + Incoming []UnspentOutput +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/richlist.go b/vendor/github.com/skycoin/skycoin/src/visor/richlist.go new file mode 100644 index 0000000000..a7a3520ef7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/richlist.go @@ -0,0 +1,64 @@ +package visor + +import ( + "bytes" + "sort" + + "github.com/skycoin/skycoin/src/cipher" +) + +// RichlistBalance holds info an address balance holder +type RichlistBalance struct { + Address cipher.Address + Coins uint64 + Locked bool +} + +// Richlist contains RichlistBalances +type Richlist []RichlistBalance + +// NewRichlist create Richlist via unspent outputs map +func NewRichlist(allAccounts map[cipher.Address]uint64, lockedAddrs map[cipher.Address]struct{}) (Richlist, error) { + richlist := make(Richlist, 0, len(allAccounts)) + + for addr, coins := range allAccounts { + var islocked bool + if _, ok := lockedAddrs[addr]; ok { + islocked = true + } + + richlist = append(richlist, RichlistBalance{ + Address: addr, + Coins: coins, + Locked: islocked, + }) + } + + // Sort order: + // Higher coins + // Locked > unlocked + // Address bytes + sort.Slice(richlist, func(i, j int) bool { + if richlist[i].Coins == richlist[j].Coins { + if richlist[i].Locked == richlist[j].Locked { + return bytes.Compare(richlist[i].Address.Bytes(), richlist[j].Address.Bytes()) < 0 + } + return richlist[i].Locked + } + + return richlist[i].Coins > richlist[j].Coins + }) + + return richlist, nil +} + +// FilterAddresses returns the richlist without addresses from the map +func (r Richlist) FilterAddresses(addrs map[cipher.Address]struct{}) Richlist { + var s Richlist + for _, b := range r { + if _, ok := addrs[b.Address]; !ok { + s = append(s, b) + } + } + return s +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/transaction_model.go b/vendor/github.com/skycoin/skycoin/src/visor/transaction_model.go new file mode 100644 index 0000000000..274d222cef --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/transaction_model.go @@ -0,0 +1,599 @@ +package visor + +import ( + "errors" + "fmt" + "sort" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/timeutil" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +const ( + // DefaultTxnPageSize the default transaction page size + DefaultTxnPageSize = uint64(10) + + // MaxTxnPageSize the maximum transaction page size + MaxTxnPageSize = uint64(100) +) + +// SortOrder represents the sort order +type SortOrder uint8 + +const ( + // UnknownOrder is returned when the sort order does not belong to any of the orders below + UnknownOrder SortOrder = iota + // AscOrder sort in ascending order + AscOrder + // DescOrder sort in descending order + DescOrder +) + +var ( + // ErrZeroPageSize will be returned when page size is zero + ErrZeroPageSize = errors.New("page size must be greater than 0") + // ErrZeroPageNum will be returned when page num is zero + ErrZeroPageNum = errors.New("page number must be greater than 0") + // ErrMaxTxnPageSize will be returned when page size is greater than MaxTxnPageSize + ErrMaxTxnPageSize = fmt.Errorf("transaction page size must be not greater than %d", MaxTxnPageSize) +) + +// PageIndex represents +type PageIndex struct { + size uint64 // Page size + n uint64 // Page number, start from 1 +} + +// NewPageIndex creates a page +func NewPageIndex(size uint64, pageN uint64) (*PageIndex, error) { + if size == 0 { + return nil, ErrZeroPageSize + } + + if pageN == 0 { + return nil, ErrZeroPageNum + } + + if size > MaxTxnPageSize { + return nil, ErrMaxTxnPageSize + } + + return &PageIndex{size: size, n: pageN}, nil +} + +// Cal calculate the slice indexes +func (p PageIndex) Cal(n uint64) (start uint64, end uint64, totalPages uint64, err error) { + if p.size == 0 { + return 0, 0, 0, ErrZeroPageSize + } + + if p.n == 0 { + return 0, 0, 0, ErrZeroPageNum + } + + totalPages = n / p.size + if n%p.size != 0 { + totalPages++ + } + + start = p.size * (p.n - 1) + if start >= n { + return 0, 0, totalPages, nil + } + + end = start + p.size + if end > n { + end = n + } + + return +} + +// Size returns the page size +func (p PageIndex) Size() uint64 { + return p.size +} + +// PageNum returns the page num +func (p PageIndex) PageNum() uint64 { + return p.n +} + +type txnHashConfirm struct { + hash cipher.SHA256 + seq uint64 + isConfirmed bool +} + +type txnHashesContainer struct { + items []txnHashConfirm + m map[cipher.SHA256]struct{} +} + +func newTxnHashesContainer() *txnHashesContainer { + return &txnHashesContainer{ + m: make(map[cipher.SHA256]struct{}), + } +} + +func (s *txnHashesContainer) Add(hash cipher.SHA256, isConfirmed bool, seq uint64) { + // check if the hashes already exists + if _, exist := s.m[hash]; exist { + return + } + + s.m[hash] = struct{}{} + s.items = append(s.items, txnHashConfirm{ + hash: hash, + isConfirmed: isConfirmed, + seq: seq, + }) +} + +func (s *txnHashesContainer) AddItem(item txnHashConfirm) { + if _, exist := s.m[item.hash]; exist { + return + } + s.m[item.hash] = struct{}{} + s.items = append(s.items, item) +} + +func (s *txnHashesContainer) Sort(order SortOrder) error { + lessFunc := func(i, j int) bool { + if s.items[i].seq < s.items[j].seq { + return true + } + + if s.items[i].seq > s.items[j].seq { + return false + } + + // If transactions in the same block, compare the hash string + return s.items[i].hash.Hex() < s.items[j].hash.Hex() + } + + switch order { + case AscOrder: + sort.Slice(s.items, lessFunc) + case DescOrder: + sort.Slice(s.items, func(i, j int) bool { + return lessFunc(j, i) + }) + default: + return errors.New("unknown sort order") + } + + return nil +} + +func (s *txnHashesContainer) Append(c *txnHashesContainer) { + for _, item := range c.items { + if _, exist := s.m[item.hash]; exist { + continue + } + s.AddItem(item) + } +} + +type txnGetFunc func(tx *dbutil.Tx, item txnHashConfirm) (*Transaction, error) + +func (s txnHashesContainer) Filter(tx *dbutil.Tx, flts []TxFilter, getTxn txnGetFunc) (*txnHashesContainer, error) { + if len(flts) == 0 { + return &s, nil + } + + newTxnsHashes := newTxnHashesContainer() + + for _, item := range s.items { + txn, err := getTxn(tx, item) + if err != nil { + return nil, err + } + + if func(txn *Transaction) bool { + for _, flt := range flts { + if !flt.Match(txn) { + return false + } + } + return true + }(txn) { + newTxnsHashes.AddItem(item) + } + } + return newTxnsHashes, nil +} + +func (s txnHashesContainer) Len() uint64 { + return uint64(len(s.items)) +} + +func (s txnHashesContainer) LastItem() (txnHashConfirm, bool) { + if s.Len() == 0 { + return txnHashConfirm{}, false + } + + return s.items[s.Len()-1], true +} + +type txnContainerUpdateFunc func(int, *txnHashConfirm) + +func (s *txnHashesContainer) Update(f txnContainerUpdateFunc) { + for i := 0; i < len(s.items); i++ { + f(i, &s.items[i]) + } +} + +func (s txnHashesContainer) Pagination(page *PageIndex) (*txnHashesContainer, uint64, error) { + if page == nil { + // Returns all transactions if page index is nil; total page is 1. + return &s, 1, nil + } + start, end, total, err := page.Cal(s.Len()) + if err != nil { + return nil, 0, err + } + + newTxnHashes := newTxnHashesContainer() + for _, item := range s.items[start:end] { + newTxnHashes.AddItem(item) + } + return newTxnHashes, total, nil +} + +func (s txnHashesContainer) ToTransactions(tx *dbutil.Tx, f txnGetFunc) ([]Transaction, error) { + var txns []Transaction + for _, item := range s.items { + txn, err := f(tx, item) + if err != nil { + return nil, err + } + txns = append(txns, *txn) + } + return txns, nil +} + +type transactionModel struct { + history Historyer + unconfirmed UnconfirmedTransactionPooler + blockchain Blockchainer +} + +func (tm transactionModel) GetTransactions(tx *dbutil.Tx, flts []TxFilter, order SortOrder, page *PageIndex) ([]Transaction, uint64, error) { + var otherFlts []TxFilter + var txnGetter transactionsGetter = newAllTxnsGetter(tm) + for _, f := range flts { + switch v := f.(type) { + case ConfirmedTxFilter: + if v.Confirmed { + txnGetter = confirmedTxnsGetter{tm} + } else { + txnGetter = unconfirmedTxnsGetter{tm} + } + default: + otherFlts = append(otherFlts, v) + } + } + + return txnGetter.GetTransactions(tx, otherFlts, order, page) +} + +type transactionsGetter interface { + GetTransactions(tx *dbutil.Tx, flts []TxFilter, order SortOrder, page *PageIndex) ([]Transaction, uint64, error) +} + +type confirmedTxnsGetter struct { + transactionModel +} + +func (ct confirmedTxnsGetter) GetTransactions(tx *dbutil.Tx, flts []TxFilter, order SortOrder, page *PageIndex) ([]Transaction, uint64, error) { + addrs, otherFlts := getAddrsFromFlts(flts) + + txnsHashesCon, err := ct.getTxnsHashes(tx, addrs) + if err != nil { + return nil, 0, err + } + + getTxn := func(tx *dbutil.Tx, item txnHashConfirm) (*Transaction, error) { + return ct.getTransaction(tx, item.hash) + } + + // Apply remaining filters + txnsHashesCon, err = txnsHashesCon.Filter(tx, otherFlts, getTxn) + if err != nil { + return nil, 0, err + } + + // Sort the transaction hashes + if err := txnsHashesCon.Sort(order); err != nil { + return nil, 0, err + } + + var totalPages uint64 + txnsHashesCon, totalPages, err = txnsHashesCon.Pagination(page) + if err != nil { + return nil, 0, err + } + + txns, err := txnsHashesCon.ToTransactions(tx, getTxn) + if err != nil { + return nil, 0, err + } + + return txns, totalPages, nil +} + +func (ct confirmedTxnsGetter) getTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + hisTxn, err := ct.history.GetTransaction(tx, hash) + if err != nil { + return nil, err + } + + return ct.convertConfirmedTxn(tx, hisTxn) +} + +func (ct confirmedTxnsGetter) convertConfirmedTxn(tx *dbutil.Tx, hisTxn *historydb.Transaction) (*Transaction, error) { + headBkSeq, ok, err := ct.blockchain.HeadSeq(tx) + if err != nil { + return nil, err + } + + if !ok { + return nil, errors.New("No head block seq") + } + + if headBkSeq < hisTxn.BlockSeq { + err := errors.New("Transaction block sequence is greater than the head block sequence") + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "headBkSeq": headBkSeq, + "txnBlockSeq": hisTxn.BlockSeq, + }).Error() + return nil, err + } + h := headBkSeq - hisTxn.BlockSeq + 1 + + bk, err := ct.blockchain.GetSignedBlockBySeq(tx, hisTxn.BlockSeq) + if err != nil { + return nil, err + } + + if bk == nil { + return nil, fmt.Errorf("block seq=%d doesn't exist", hisTxn.BlockSeq) + } + + return &Transaction{ + Transaction: hisTxn.Txn, + Status: NewConfirmedTransactionStatus(h, hisTxn.BlockSeq), + Time: bk.Time(), + }, nil +} + +func (ct confirmedTxnsGetter) getTxnsHashes(tx *dbutil.Tx, addrs []cipher.Address) (*txnHashesContainer, error) { + hashCon := newTxnHashesContainer() + // if no address is specified, returns all confirmed transaction hashes + if len(addrs) == 0 { + if err := ct.history.ForEachTxn(tx, func(hash cipher.SHA256, txn *historydb.Transaction) error { + hashCon.Add(hash, true, txn.BlockSeq) + return nil + }); err != nil { + return nil, err + } + return hashCon, nil + } + + // Get addresses related transaction hashes + hashes, err := ct.history.GetTransactionHashesForAddresses(tx, addrs) + if err != nil { + return nil, err + } + + // If only one address is specified, the hashes returned are already sorted in ascending order. + if len(addrs) == 1 { + // Address indexed + for i, hash := range hashes { + hashCon.Add(hash, true, uint64(i)) + } + return hashCon, nil + } + + for _, hash := range hashes { + hisTxn, err := ct.history.GetTransaction(tx, hash) + if err != nil { + return nil, err + } + + hashCon.Add(hash, true, hisTxn.BlockSeq) + } + + return hashCon, nil +} + +type unconfirmedTxnsGetter struct { + transactionModel +} + +func (uct unconfirmedTxnsGetter) GetTransactions(tx *dbutil.Tx, flts []TxFilter, order SortOrder, page *PageIndex) ([]Transaction, uint64, error) { + addrs, otherFlts := getAddrsFromFlts(flts) + + txnHashesCon, err := uct.getTxnsHashes(tx, addrs) + if err != nil { + return nil, 0, err + } + + getTxn := func(tx *dbutil.Tx, item txnHashConfirm) (*Transaction, error) { + return uct.getTransaction(tx, item.hash) + } + + txnHashesCon, err = txnHashesCon.Filter(tx, otherFlts, getTxn) + if err != nil { + return nil, 0, err + } + + if err := txnHashesCon.Sort(order); err != nil { + return nil, 0, err + } + + var totalPage uint64 + txnHashesCon, totalPage, err = txnHashesCon.Pagination(page) + if err != nil { + return nil, 0, err + } + + txns, err := txnHashesCon.ToTransactions(tx, getTxn) + if err != nil { + return nil, 0, err + } + + return txns, totalPage, nil +} + +func (uct unconfirmedTxnsGetter) getTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + uncfmTxn, err := uct.unconfirmed.Get(tx, hash) + if err != nil { + return nil, err + } + + return &Transaction{ + Transaction: uncfmTxn.Transaction, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(timeutil.NanoToTime(uncfmTxn.Received).Unix()), + }, nil +} + +func (uct unconfirmedTxnsGetter) getTxnsHashes(tx *dbutil.Tx, addrs []cipher.Address) (*txnHashesContainer, error) { + txnHashCon := newTxnHashesContainer() + + // Return all if there's no address filter + if len(addrs) == 0 { + if err := uct.unconfirmed.ForEach(tx, func(hash cipher.SHA256, txn UnconfirmedTransaction) error { + txnHashCon.Add(hash, false, 0) + return nil + }); err != nil { + return nil, err + } + return txnHashCon, nil + } + + for _, addr := range addrs { + uxs, err := uct.unconfirmed.GetUnspentsOfAddr(tx, addr) + if err != nil { + return nil, err + } + + for _, ux := range uxs { + txnHashCon.Add(ux.Body.SrcTransaction, false, 0) + } + } + + return txnHashCon, nil +} + +type fullTxnsGetter struct { + confirmedTxnsGetter + unconfirmedTxnsGetter +} + +func newAllTxnsGetter(tm transactionModel) *fullTxnsGetter { + return &fullTxnsGetter{ + confirmedTxnsGetter: confirmedTxnsGetter{tm}, + unconfirmedTxnsGetter: unconfirmedTxnsGetter{tm}, + } +} + +func (ft fullTxnsGetter) GetTransactions(tx *dbutil.Tx, flts []TxFilter, order SortOrder, page *PageIndex) ([]Transaction, uint64, error) { + addrs, otherFlts := getAddrsFromFlts(flts) + txnsHashesCon, err := ft.getTxnsHashes(tx, addrs) + if err != nil { + return nil, 0, err + } + + getTxn := func(tx *dbutil.Tx, item txnHashConfirm) (*Transaction, error) { + if item.isConfirmed { + return ft.confirmedTxnsGetter.getTransaction(tx, item.hash) + } + return ft.unconfirmedTxnsGetter.getTransaction(tx, item.hash) + } + + txnsHashesCon, err = txnsHashesCon.Filter(tx, otherFlts, getTxn) + if err != nil { + return nil, 0, err + } + + if err := txnsHashesCon.Sort(order); err != nil { + return nil, 0, err + } + + var totalPages uint64 + txnsHashesCon, totalPages, err = txnsHashesCon.Pagination(page) + if err != nil { + return nil, 0, err + } + + txns, err := txnsHashesCon.ToTransactions(tx, getTxn) + if err != nil { + return nil, 0, err + } + + return txns, totalPages, nil +} + +func (ft fullTxnsGetter) getTxnsHashes(tx *dbutil.Tx, addrs []cipher.Address) (*txnHashesContainer, error) { + txnHashCon, err := ft.confirmedTxnsGetter.getTxnsHashes(tx, addrs) + if err != nil { + return nil, err + } + + unconfirmedTxnHashCon, err := ft.unconfirmedTxnsGetter.getTxnsHashes(tx, addrs) + if err != nil { + return nil, err + } + + // Update the seqs of unconfirmed txn. Unconfirmed txns are always the latest, + // therefore, update to make the unconfirmed txns seqs start from the last confirmed txn seq + 1. + lastItem, ok := txnHashCon.LastItem() + if ok { + unconfirmedTxnHashCon.Update(func(i int, item *txnHashConfirm) { + item.seq = lastItem.seq + 1 + uint64(i) + }) + } + + txnHashCon.Append(unconfirmedTxnHashCon) + return txnHashCon, nil +} + +// get addresses from the filters, returns the addresses and remaining filters +func getAddrsFromFlts(flts []TxFilter) ([]cipher.Address, []TxFilter) { + var addrsFlts []AddrsFilter + var otherFlts []TxFilter + for _, f := range flts { + switch v := f.(type) { + case AddrsFilter: + addrsFlts = append(addrsFlts, v) + default: + otherFlts = append(otherFlts, v) + } + } + + addrs := accumulateAddressInFilter(addrsFlts) + return addrs, otherFlts +} + +func accumulateAddressInFilter(afs []AddrsFilter) []cipher.Address { + // Accumulate all addresses in address filters + addrMap := make(map[cipher.Address]struct{}) + var addrs []cipher.Address + for _, af := range afs { + for _, a := range af.Addrs { + if _, exist := addrMap[a]; exist { + continue + } + addrMap[a] = struct{}{} + addrs = append(addrs, a) + } + } + return addrs +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed.go b/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed.go new file mode 100644 index 0000000000..b31435ba0e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed.go @@ -0,0 +1,562 @@ +package visor + +import ( + "errors" + "fmt" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/transaction" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // UnconfirmedTxnsBkt holds unconfirmed transactions + UnconfirmedTxnsBkt = []byte("unconfirmed_txns") + // UnconfirmedUnspentsBkt holds unconfirmed unspent outputs + UnconfirmedUnspentsBkt = []byte("unconfirmed_unspents") + + errUpdateObjectDoesNotExist = errors.New("object does not exist in bucket") +) + +//go:generate skyencoder -unexported -struct UnconfirmedTransaction +//go:generate skyencoder -unexported -struct UxArray + +// UxArray wraps coin.UxArray +type UxArray struct { + UxArray coin.UxArray +} + +// unconfirmed transactions bucket +type unconfirmedTxns struct{} + +func (utb *unconfirmedTxns) get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTransaction, error) { + var txn UnconfirmedTransaction + + v, err := dbutil.GetBucketValueNoCopy(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeUnconfirmedTransactionExact(v, &txn); err != nil { + return nil, err + } + + txnHash := txn.Transaction.Hash() + if hash != txnHash { + return nil, fmt.Errorf("DB key %s does not match block hash header %s", hash, txnHash) + } + + return &txn, nil +} + +func (utb *unconfirmedTxns) put(tx *dbutil.Tx, v *UnconfirmedTransaction) error { + h := v.Transaction.Hash() + buf, err := encodeUnconfirmedTransaction(v) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnconfirmedTxnsBkt, []byte(h.Hex()), buf) +} + +func (utb *unconfirmedTxns) update(tx *dbutil.Tx, hash cipher.SHA256, f func(v *UnconfirmedTransaction) error) error { + txn, err := utb.get(tx, hash) + if err != nil { + return err + } + + if txn == nil { + return errUpdateObjectDoesNotExist + } + + if err := f(txn); err != nil { + return err + } + + return utb.put(tx, txn) +} + +func (utb *unconfirmedTxns) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) +} + +func (utb *unconfirmedTxns) getAll(tx *dbutil.Tx) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(_, v []byte) error { + var txn UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(v, &txn); err != nil { + return err + } + + txns = append(txns, txn) + return nil + }); err != nil { + return nil, err + } + + return txns, nil +} + +func (utb *unconfirmedTxns) hasKey(tx *dbutil.Tx, hash cipher.SHA256) (bool, error) { + return dbutil.BucketHasKey(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) +} + +func (utb *unconfirmedTxns) forEach(tx *dbutil.Tx, f func(hash cipher.SHA256, tx UnconfirmedTransaction) error) error { + return dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromHex(string(k)) + if err != nil { + return err + } + + var txn UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(v, &txn); err != nil { + return err + } + + return f(hash, txn) + }) +} + +func (utb *unconfirmedTxns) len(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnconfirmedTxnsBkt) +} + +type txnUnspents struct{} + +func (txus *txnUnspents) put(tx *dbutil.Tx, hash cipher.SHA256, uxs coin.UxArray) error { + buf, err := encodeUxArray(&UxArray{ + UxArray: uxs, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex()), buf) +} + +func (txus *txnUnspents) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex())) +} + +func (txus *txnUnspents) getByAddr(tx *dbutil.Tx, a cipher.Address) (coin.UxArray, error) { + var uxo coin.UxArray + + if err := dbutil.ForEach(tx, UnconfirmedUnspentsBkt, func(_, v []byte) error { + var uxa UxArray + if err := decodeUxArrayExact(v, &uxa); err != nil { + return err + } + + for i := range uxa.UxArray { + if uxa.UxArray[i].Body.Address == a { + uxo = append(uxo, uxa.UxArray[i]) + } + } + + return nil + }); err != nil { + return nil, err + } + + return uxo, nil +} + +// UnconfirmedTransactionPool manages unconfirmed transactions +type UnconfirmedTransactionPool struct { + db *dbutil.DB + txns *unconfirmedTxns + // Predicted unspents, assuming txns are valid. Needed to predict + // our future balance and avoid double spending our own coins + // Maps from Transaction.Hash() to UxArray. + unspent *txnUnspents +} + +// NewUnconfirmedTransactionPool creates an UnconfirmedTransactionPool instance +func NewUnconfirmedTransactionPool(db *dbutil.DB) (*UnconfirmedTransactionPool, error) { + if err := db.View("Check unconfirmed txn pool size", func(tx *dbutil.Tx) error { + n, err := dbutil.Len(tx, UnconfirmedTxnsBkt) + if err != nil { + return err + } + + logger.Infof("Unconfirmed transaction pool size: %d", n) + return nil + }); err != nil { + return nil, err + } + + return &UnconfirmedTransactionPool{ + db: db, + txns: &unconfirmedTxns{}, + unspent: &txnUnspents{}, + }, nil +} + +// SetTransactionsAnnounced updates announced time of specific tx +func (utp *UnconfirmedTransactionPool) SetTransactionsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error { + var txns []*UnconfirmedTransaction + for h, t := range hashes { + txn, err := utp.txns.get(tx, h) + if err != nil { + return err + } + + if txn == nil { + logger.Warningf("UnconfirmedTransactionPool.SetTransactionsAnnounced: UnconfirmedTransaction %s not found in DB", h.Hex()) + continue + } + + if t > txn.Announced { + txn.Announced = t + txns = append(txns, txn) + } + } + + for _, txn := range txns { + if err := utp.txns.put(tx, txn); err != nil { + return err + } + } + + return nil +} + +// InjectTransaction adds a coin.Transaction to the pool, or updates an existing one's timestamps +// Returns an error if txn is invalid, and whether the transaction already +// existed in the pool. +// If the transaction violates hard constraints, it is rejected. +// Soft constraints violations mark a txn as invalid, but the txn is inserted. The soft violation is returned. +func (utp *UnconfirmedTransactionPool) InjectTransaction(tx *dbutil.Tx, bc Blockchainer, txn coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn) (bool, *transaction.ErrTxnViolatesSoftConstraint, error) { + var isValid int8 = 1 + var softErr *transaction.ErrTxnViolatesSoftConstraint + if _, _, err := bc.VerifySingleTxnSoftHardConstraints(tx, txn, distParams, verifyParams, transaction.TxnSigned); err != nil { + logger.Warningf("bc.VerifySingleTxnSoftHardConstraints failed for txn %s: %v", txn.Hash().Hex(), err) + switch e := err.(type) { + case transaction.ErrTxnViolatesSoftConstraint: + softErr = &e + isValid = 0 + case transaction.ErrTxnViolatesHardConstraint: + return false, nil, err + default: + return false, nil, err + } + } + + hash := txn.Hash() + known, err := utp.txns.hasKey(tx, hash) + if err != nil { + logger.Errorf("InjectTransaction check txn exists failed: %v", err) + return false, nil, err + } + + // Update if we already have this txn + if known { + if err := utp.txns.update(tx, hash, func(utxn *UnconfirmedTransaction) error { + now := time.Now().UTC().UnixNano() + utxn.Received = now + utxn.Checked = now + utxn.IsValid = isValid + return nil + }); err != nil { + logger.Errorf("InjectTransaction update known txn failed: %v", err) + return false, nil, err + } + + return true, softErr, nil + } + + utx := NewUnconfirmedTransaction(txn) + utx.IsValid = isValid + + // add txn to index + if err := utp.txns.put(tx, &utx); err != nil { + logger.Errorf("InjectTransaction put new unconfirmed txn failed: %v", err) + return false, nil, err + } + + head, err := bc.Head(tx) + if err != nil { + logger.Errorf("InjectTransaction bc.Head() failed: %v", err) + return false, nil, err + } + + // update unconfirmed unspent + createdUnspents := coin.CreateUnspents(head.Head, txn) + if err := utp.unspent.put(tx, hash, createdUnspents); err != nil { + logger.Errorf("InjectTransaction put new unspent outputs: %v", err) + return false, nil, err + } + + return false, softErr, nil +} + +// AllRawTransactions returns underlying coin.Transactions +func (utp *UnconfirmedTransactionPool) AllRawTransactions(tx *dbutil.Tx) (coin.Transactions, error) { + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + txns := make(coin.Transactions, len(utxns)) + for i := range utxns { + txns[i] = utxns[i].Transaction + } + return txns, nil +} + +// Remove a single txn by hash +func (utp *UnconfirmedTransactionPool) removeTransaction(tx *dbutil.Tx, txHash cipher.SHA256) error { + if err := utp.txns.delete(tx, txHash); err != nil { + return err + } + + return utp.unspent.delete(tx, txHash) +} + +// RemoveTransactions remove transactions with dbutil.Tx +func (utp *UnconfirmedTransactionPool) RemoveTransactions(tx *dbutil.Tx, txHashes []cipher.SHA256) error { + for i := range txHashes { + if err := utp.removeTransaction(tx, txHashes[i]); err != nil { + return err + } + } + + return nil +} + +// Refresh checks all unconfirmed txns against the blockchain. +// If the transaction becomes invalid it is marked invalid. +// If the transaction becomes valid it is marked valid and is returned to the caller. +func (utp *UnconfirmedTransactionPool) Refresh(tx *dbutil.Tx, bc Blockchainer, distParams params.Distribution, verifyParams params.VerifyTxn) ([]cipher.SHA256, error) { + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + now := time.Now().UTC() + var nowValid []cipher.SHA256 + + for _, utxn := range utxns { + utxn.Checked = now.UnixNano() + + _, _, err := bc.VerifySingleTxnSoftHardConstraints(tx, utxn.Transaction, distParams, verifyParams, transaction.TxnSigned) + + switch err.(type) { + case transaction.ErrTxnViolatesSoftConstraint, transaction.ErrTxnViolatesHardConstraint: + utxn.IsValid = 0 + case nil: + if utxn.IsValid == 0 { + nowValid = append(nowValid, utxn.Transaction.Hash()) + } + utxn.IsValid = 1 + default: + return nil, err + } + + if err := utp.txns.put(tx, &utxn); err != nil { + return nil, err + } + } + + return nowValid, nil +} + +// RemoveInvalid checks all unconfirmed txns against the blockchain. +// If a transaction violates hard constraints it is removed from the pool. +// The transactions that were removed are returned. +func (utp *UnconfirmedTransactionPool) RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) { + var removeUtxns []cipher.SHA256 + + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + for _, utxn := range utxns { + err := bc.VerifySingleTxnHardConstraints(tx, utxn.Transaction, transaction.TxnSigned) + if err != nil { + switch err.(type) { + case transaction.ErrTxnViolatesHardConstraint: + removeUtxns = append(removeUtxns, utxn.Transaction.Hash()) + default: + return nil, err + } + } + } + + if err := utp.RemoveTransactions(tx, removeUtxns); err != nil { + return nil, err + } + + return removeUtxns, nil +} + +// FilterKnown returns txn hashes with known ones removed +func (utp *UnconfirmedTransactionPool) FilterKnown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) { + var unknown []cipher.SHA256 + + for _, h := range txns { + if hasKey, err := utp.txns.hasKey(tx, h); err != nil { + return nil, err + } else if !hasKey { + unknown = append(unknown, h) + } + } + + return unknown, nil +} + +// GetKnown returns all known transactions from the pool, given hashes to select +func (utp *UnconfirmedTransactionPool) GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) { + var known coin.Transactions + + for _, h := range txns { + if tx, err := utp.txns.get(tx, h); err != nil { + return nil, err + } else if tx != nil { + known = append(known, tx.Transaction) + } + } + + return known, nil +} + +// RecvOfAddresses returns unconfirmed receiving uxouts of addresses +func (utp *UnconfirmedTransactionPool) RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + for i, o := range txn.Transaction.Out { + if _, ok := addrm[o.Address]; ok { + uxout, err := coin.CreateUnspent(bh, txn.Transaction, i) + if err != nil { + return err + } + + auxs[o.Address] = append(auxs[o.Address], uxout) + } + } + return nil + }); err != nil { + return nil, err + } + + return auxs, nil +} + +// txnOutputsForAddrs returns unspent outputs assigned to addresses in addrs, created by a set of transactions +func txnOutputsForAddrs(bh coin.BlockHeader, addrs []cipher.Address, txns []coin.Transaction) (coin.AddressUxOuts, error) { + if len(txns) == 0 || len(addrs) == 0 { + return nil, nil + } + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + + for _, txn := range txns { + for i, o := range txn.Out { + if _, ok := addrm[o.Address]; ok { + uxout, err := coin.CreateUnspent(bh, txn, i) + if err != nil { + return nil, err + } + + auxs[o.Address] = append(auxs[o.Address], uxout) + } + } + } + + return auxs, nil +} + +// GetIncomingOutputs returns all predicted incoming outputs. +func (utp *UnconfirmedTransactionPool) GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) { + var outs coin.UxArray + + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + outs = append(outs, coin.CreateUnspents(bh, txn.Transaction)...) + return nil + }); err != nil { + return nil, err + } + + return outs, nil +} + +// Get returns the unconfirmed transaction of given tx hash. +func (utp *UnconfirmedTransactionPool) Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTransaction, error) { + return utp.txns.get(tx, hash) +} + +// GetFiltered returns all transactions that can pass the filter +func (utp *UnconfirmedTransactionPool) GetFiltered(tx *dbutil.Tx, filter func(UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + if filter(txn) { + txns = append(txns, txn) + } + return nil + }); err != nil { + logger.Errorf("GetFiltered error: %v", err) + return nil, err + } + + return txns, nil +} + +// GetHashes returns transaction hashes that can pass the filter +func (utp *UnconfirmedTransactionPool) GetHashes(tx *dbutil.Tx, filter func(UnconfirmedTransaction) bool) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := utp.txns.forEach(tx, func(hash cipher.SHA256, txn UnconfirmedTransaction) error { + if filter(txn) { + hashes = append(hashes, hash) + } + return nil + }); err != nil { + logger.Errorf("GetHashes error: %v", err) + return nil, err + } + + return hashes, nil +} + +// ForEach iterate the pool with given callback function +func (utp *UnconfirmedTransactionPool) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTransaction) error) error { + return utp.txns.forEach(tx, f) +} + +// GetUnspentsOfAddr returns unspent outputs of given address in unspent tx pool +func (utp *UnconfirmedTransactionPool) GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) { + return utp.unspent.getByAddr(tx, addr) +} + +// IsValid can be used as filter function +func IsValid(tx UnconfirmedTransaction) bool { + return tx.IsValid == 1 +} + +// All use as return all filter +func All(tx UnconfirmedTransaction) bool { + return true +} + +// Len returns the number of unconfirmed transactions +func (utp *UnconfirmedTransactionPool) Len(tx *dbutil.Tx) (uint64, error) { + return utp.txns.len(tx) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed_transaction_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed_transaction_skyencoder.go new file mode 100644 index 0000000000..cb5babc4ec --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed_transaction_skyencoder.go @@ -0,0 +1,417 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. +package visor + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" +) + +// encodeSizeUnconfirmedTransaction computes the size of an encoded object of type UnconfirmedTransaction +func encodeSizeUnconfirmedTransaction(obj *UnconfirmedTransaction) uint64 { + i0 := uint64(0) + + // obj.Transaction.Length + i0 += 4 + + // obj.Transaction.Type + i0++ + + // obj.Transaction.InnerHash + i0 += 32 + + // obj.Transaction.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x + i1 += 65 + + i0 += uint64(len(obj.Transaction.Sigs)) * i1 + } + + // obj.Transaction.In + i0 += 4 + { + i1 := uint64(0) + + // x + i1 += 32 + + i0 += uint64(len(obj.Transaction.In)) * i1 + } + + // obj.Transaction.Out + i0 += 4 + { + i1 := uint64(0) + + // x.Address.Version + i1++ + + // x.Address.Key + i1 += 20 + + // x.Coins + i1 += 8 + + // x.Hours + i1 += 8 + + i0 += uint64(len(obj.Transaction.Out)) * i1 + } + + // obj.Received + i0 += 8 + + // obj.Checked + i0 += 8 + + // obj.Announced + i0 += 8 + + // obj.IsValid + i0++ + + return i0 +} + +// encodeUnconfirmedTransaction encodes an object of type UnconfirmedTransaction to a buffer allocated to the exact size +// required to encode the object. +func encodeUnconfirmedTransaction(obj *UnconfirmedTransaction) ([]byte, error) { + n := encodeSizeUnconfirmedTransaction(obj) + buf := make([]byte, n) + + if err := encodeUnconfirmedTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUnconfirmedTransactionToBuffer encodes an object of type UnconfirmedTransaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUnconfirmedTransactionToBuffer(buf []byte, obj *UnconfirmedTransaction) error { + if uint64(len(buf)) < encodeSizeUnconfirmedTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transaction.Length + e.Uint32(obj.Transaction.Length) + + // obj.Transaction.Type + e.Uint8(obj.Transaction.Type) + + // obj.Transaction.InnerHash + e.CopyBytes(obj.Transaction.InnerHash[:]) + + // obj.Transaction.Sigs maxlen check + if len(obj.Transaction.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transaction.Sigs length check + if uint64(len(obj.Transaction.Sigs)) > math.MaxUint32 { + return errors.New("obj.Transaction.Sigs length exceeds math.MaxUint32") + } + + // obj.Transaction.Sigs length + e.Uint32(uint32(len(obj.Transaction.Sigs))) + + // obj.Transaction.Sigs + for _, x := range obj.Transaction.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Transaction.In maxlen check + if len(obj.Transaction.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transaction.In length check + if uint64(len(obj.Transaction.In)) > math.MaxUint32 { + return errors.New("obj.Transaction.In length exceeds math.MaxUint32") + } + + // obj.Transaction.In length + e.Uint32(uint32(len(obj.Transaction.In))) + + // obj.Transaction.In + for _, x := range obj.Transaction.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Transaction.Out maxlen check + if len(obj.Transaction.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transaction.Out length check + if uint64(len(obj.Transaction.Out)) > math.MaxUint32 { + return errors.New("obj.Transaction.Out length exceeds math.MaxUint32") + } + + // obj.Transaction.Out length + e.Uint32(uint32(len(obj.Transaction.Out))) + + // obj.Transaction.Out + for _, x := range obj.Transaction.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + // obj.Received + e.Int64(obj.Received) + + // obj.Checked + e.Int64(obj.Checked) + + // obj.Announced + e.Int64(obj.Announced) + + // obj.IsValid + e.Int8(obj.IsValid) + + return nil +} + +// decodeUnconfirmedTransaction decodes an object of type UnconfirmedTransaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUnconfirmedTransaction(buf []byte, obj *UnconfirmedTransaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transaction.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Transaction.Length = i + } + + { + // obj.Transaction.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transaction.Type = i + } + + { + // obj.Transaction.InnerHash + if len(d.Buffer) < len(obj.Transaction.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.InnerHash[:], d.Buffer[:len(obj.Transaction.InnerHash)]) + d.Buffer = d.Buffer[len(obj.Transaction.InnerHash):] + } + + { + // obj.Transaction.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transaction.Sigs = make([]cipher.Sig, length) + + for z2 := range obj.Transaction.Sigs { + { + // obj.Transaction.Sigs[z2] + if len(d.Buffer) < len(obj.Transaction.Sigs[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.Sigs[z2][:], d.Buffer[:len(obj.Transaction.Sigs[z2])]) + d.Buffer = d.Buffer[len(obj.Transaction.Sigs[z2]):] + } + + } + } + } + + { + // obj.Transaction.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transaction.In = make([]cipher.SHA256, length) + + for z2 := range obj.Transaction.In { + { + // obj.Transaction.In[z2] + if len(d.Buffer) < len(obj.Transaction.In[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.In[z2][:], d.Buffer[:len(obj.Transaction.In[z2])]) + d.Buffer = d.Buffer[len(obj.Transaction.In[z2]):] + } + + } + } + } + + { + // obj.Transaction.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transaction.Out = make([]coin.TransactionOutput, length) + + for z2 := range obj.Transaction.Out { + { + // obj.Transaction.Out[z2].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transaction.Out[z2].Address.Version = i + } + + { + // obj.Transaction.Out[z2].Address.Key + if len(d.Buffer) < len(obj.Transaction.Out[z2].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.Out[z2].Address.Key[:], d.Buffer[:len(obj.Transaction.Out[z2].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Transaction.Out[z2].Address.Key):] + } + + { + // obj.Transaction.Out[z2].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transaction.Out[z2].Coins = i + } + + { + // obj.Transaction.Out[z2].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transaction.Out[z2].Hours = i + } + + } + } + } + + { + // obj.Received + i, err := d.Int64() + if err != nil { + return 0, err + } + obj.Received = i + } + + { + // obj.Checked + i, err := d.Int64() + if err != nil { + return 0, err + } + obj.Checked = i + } + + { + // obj.Announced + i, err := d.Int64() + if err != nil { + return 0, err + } + obj.Announced = i + } + + { + // obj.IsValid + i, err := d.Int8() + if err != nil { + return 0, err + } + obj.IsValid = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUnconfirmedTransactionExact decodes an object of type UnconfirmedTransaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUnconfirmedTransactionExact(buf []byte, obj *UnconfirmedTransaction) error { + if n, err := decodeUnconfirmedTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/ux_array_skyencoder.go b/vendor/github.com/skycoin/skycoin/src/visor/ux_array_skyencoder.go new file mode 100644 index 0000000000..8ff52a0d36 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/ux_array_skyencoder.go @@ -0,0 +1,215 @@ +// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT. +package visor + +import ( + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" +) + +// encodeSizeUxArray computes the size of an encoded object of type UxArray +func encodeSizeUxArray(obj *UxArray) uint64 { + i0 := uint64(0) + + // obj.UxArray + i0 += 4 + { + i1 := uint64(0) + + // x.Head.Time + i1 += 8 + + // x.Head.BkSeq + i1 += 8 + + // x.Body.SrcTransaction + i1 += 32 + + // x.Body.Address.Version + i1++ + + // x.Body.Address.Key + i1 += 20 + + // x.Body.Coins + i1 += 8 + + // x.Body.Hours + i1 += 8 + + i0 += uint64(len(obj.UxArray)) * i1 + } + + return i0 +} + +// encodeUxArray encodes an object of type UxArray to a buffer allocated to the exact size +// required to encode the object. +func encodeUxArray(obj *UxArray) ([]byte, error) { + n := encodeSizeUxArray(obj) + buf := make([]byte, n) + + if err := encodeUxArrayToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxArrayToBuffer encodes an object of type UxArray to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxArrayToBuffer(buf []byte, obj *UxArray) error { + if uint64(len(buf)) < encodeSizeUxArray(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.UxArray length check + if uint64(len(obj.UxArray)) > math.MaxUint32 { + return errors.New("obj.UxArray length exceeds math.MaxUint32") + } + + // obj.UxArray length + e.Uint32(uint32(len(obj.UxArray))) + + // obj.UxArray + for _, x := range obj.UxArray { + + // x.Head.Time + e.Uint64(x.Head.Time) + + // x.Head.BkSeq + e.Uint64(x.Head.BkSeq) + + // x.Body.SrcTransaction + e.CopyBytes(x.Body.SrcTransaction[:]) + + // x.Body.Address.Version + e.Uint8(x.Body.Address.Version) + + // x.Body.Address.Key + e.CopyBytes(x.Body.Address.Key[:]) + + // x.Body.Coins + e.Uint64(x.Body.Coins) + + // x.Body.Hours + e.Uint64(x.Body.Hours) + + } + + return nil +} + +// decodeUxArray decodes an object of type UxArray from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxArray(buf []byte, obj *UxArray) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.UxArray + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.UxArray = make([]coin.UxOut, length) + + for z1 := range obj.UxArray { + { + // obj.UxArray[z1].Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Head.Time = i + } + + { + // obj.UxArray[z1].Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Head.BkSeq = i + } + + { + // obj.UxArray[z1].Body.SrcTransaction + if len(d.Buffer) < len(obj.UxArray[z1].Body.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.UxArray[z1].Body.SrcTransaction[:], d.Buffer[:len(obj.UxArray[z1].Body.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.UxArray[z1].Body.SrcTransaction):] + } + + { + // obj.UxArray[z1].Body.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.UxArray[z1].Body.Address.Version = i + } + + { + // obj.UxArray[z1].Body.Address.Key + if len(d.Buffer) < len(obj.UxArray[z1].Body.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.UxArray[z1].Body.Address.Key[:], d.Buffer[:len(obj.UxArray[z1].Body.Address.Key)]) + d.Buffer = d.Buffer[len(obj.UxArray[z1].Body.Address.Key):] + } + + { + // obj.UxArray[z1].Body.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Body.Coins = i + } + + { + // obj.UxArray[z1].Body.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Body.Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxArrayExact decodes an object of type UxArray from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxArrayExact(buf []byte, obj *UxArray) error { + if n, err := decodeUxArray(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/visor.go b/vendor/github.com/skycoin/skycoin/src/visor/visor.go new file mode 100644 index 0000000000..694396a4ff --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/visor.go @@ -0,0 +1,2300 @@ +/* +Package visor manages the blockchain database and wallets + +All conceptual database operations must use a database transaction. +Callers of visor methods must ensure they do not make multiple calls without a transaction, +unless it is determined safe to do so. + +Wallet access is also gatewayed by visor, since the wallet data relates to the blockchain database. +Wallets are conceptually a second database. +*/ +package visor + +import ( + "errors" + "fmt" + + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/transaction" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/mathutil" + "github.com/skycoin/skycoin/src/util/timeutil" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" +) + +var logger = logging.MustGetLogger("visor") + +// Visor manages the blockchain +type Visor struct { + Config Config + + startedAt time.Time + db *dbutil.DB + unconfirmed UnconfirmedTransactionPooler + blockchain Blockchainer + history Historyer + wallets *wallet.Service + txns transactionsGetter + tf wallet.TransactionsFinder +} + +// New creates a Visor for managing the blockchain database +func New(c Config, db *dbutil.DB, wltServ *wallet.Service) (*Visor, error) { + logger.Info("Creating new visor") + if c.IsBlockPublisher { + logger.Info("Visor running in block publisher mode") + } + + if err := c.Verify(); err != nil { + return nil, err + } + + logger.Infof("Coinhour burn factor for unconfirmed transactions is %d", c.UnconfirmedVerifyTxn.BurnFactor) + logger.Infof("Max transaction size for unconfirmed transactions is %d", c.UnconfirmedVerifyTxn.MaxTransactionSize) + logger.Infof("Max decimals for unconfirmed transactions is %d", c.UnconfirmedVerifyTxn.MaxDropletPrecision) + logger.Infof("Coinhour burn factor for transactions when creating blocks is %d", c.CreateBlockVerifyTxn.BurnFactor) + logger.Infof("Max transaction size for transactions when creating blocks is %d", c.CreateBlockVerifyTxn.MaxTransactionSize) + logger.Infof("Max decimals for transactions when creating blocks is %d", c.CreateBlockVerifyTxn.MaxDropletPrecision) + logger.Infof("Max block size is %d", c.MaxBlockTransactionsSize) + + if !db.IsReadOnly() { + if err := CreateBuckets(db); err != nil { + logger.WithError(err).Error("CreateBuckets failed") + return nil, err + } + } + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: c.BlockchainPubkey, + Arbitrating: c.Arbitrating, + }) + if err != nil { + return nil, err + } + + history := historydb.New() + + if !db.IsReadOnly() { + if err := db.Update("build unspent indexes and init history", func(tx *dbutil.Tx) error { + headSeq, _, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if err := bc.Unspent().MaybeBuildIndexes(tx, headSeq); err != nil { + return err + } + + return initHistory(tx, bc, history) + }); err != nil { + return nil, err + } + } + + utp, err := NewUnconfirmedTransactionPool(db) + if err != nil { + return nil, err + } + + txns := transactionModel{ + history: history, + unconfirmed: utp, + blockchain: bc, + } + + v := &Visor{ + Config: c, + startedAt: time.Now(), + db: db, + blockchain: bc, + unconfirmed: utp, + history: history, + wallets: wltServ, + txns: &txns, + } + + v.tf = newTransactionsFinder(v) + + return v, nil +} + +// VisorConfig returns Config +func (vs *Visor) VisorConfig() Config { + return vs.Config +} + +// Init initializes starts the visor +func (vs *Visor) Init() error { + logger.Info("Visor init") + + if vs.db.IsReadOnly() { + return nil + } + + return vs.db.Update("visor init", func(tx *dbutil.Tx) error { + if err := vs.maybeCreateGenesisBlock(tx); err != nil { + return err + } + + removed, err := vs.unconfirmed.RemoveInvalid(tx, vs.blockchain) + if err != nil { + return err + } + logger.Infof("Removed %d invalid txns from pool", len(removed)) + + return nil + }) +} + +func initHistory(tx *dbutil.Tx, bc *Blockchain, history *historydb.HistoryDB) error { + logger.Info("Visor initHistory") + + shouldReset, err := history.NeedsReset(tx) + if err != nil { + return err + } + + if !shouldReset { + return nil + } + + logger.Info("Resetting historyDB") + + if err := history.Erase(tx); err != nil { + return err + } + + // Reparse the history up to the blockchain head + headSeq, _, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if err := parseHistoryTo(tx, history, bc, headSeq); err != nil { + logger.WithError(err).Error("parseHistoryTo failed") + return err + } + + return nil +} + +func parseHistoryTo(tx *dbutil.Tx, history *historydb.HistoryDB, bc *Blockchain, height uint64) error { + logger.Info("Visor parseHistoryTo") + + parsedBlockSeq, _, err := history.ParsedBlockSeq(tx) + if err != nil { + return err + } + + for i := uint64(0); i < height-parsedBlockSeq; i++ { + b, err := bc.GetSignedBlockBySeq(tx, parsedBlockSeq+i+1) + if err != nil { + return err + } + + if b == nil { + return fmt.Errorf("no block exists in depth: %d", parsedBlockSeq+i+1) + } + + if err := history.ParseBlock(tx, b.Block); err != nil { + return err + } + } + + return nil +} + +// maybeCreateGenesisBlock creates a genesis block if necessary +func (vs *Visor) maybeCreateGenesisBlock(tx *dbutil.Tx) error { + logger.Info("Visor maybeCreateGenesisBlock") + gb, err := vs.blockchain.GetGenesisBlock(tx) + if err != nil { + return err + } + if gb != nil { + return nil + } + + logger.Info("Create genesis block") + vs.GenesisPreconditions() + b, err := coin.NewGenesisBlock(vs.Config.GenesisAddress, vs.Config.GenesisCoinVolume, vs.Config.GenesisTimestamp) + if err != nil { + return err + } + + var sb coin.SignedBlock + // record the signature of genesis block + if vs.Config.IsBlockPublisher { + sb = vs.signBlock(*b) + logger.Infof("Genesis block signature=%s", sb.Sig.Hex()) + } else { + sb = coin.SignedBlock{ + Block: *b, + Sig: vs.Config.GenesisSignature, + } + } + + return vs.executeSignedBlock(tx, sb) +} + +// GenesisPreconditions panics if conditions for genesis block are not met +func (vs *Visor) GenesisPreconditions() { + if vs.Config.BlockchainSeckey != (cipher.SecKey{}) { + if vs.Config.BlockchainPubkey != cipher.MustPubKeyFromSecKey(vs.Config.BlockchainSeckey) { + logger.Panic("Cannot create genesis block. Invalid secret key for pubkey") + } + } +} + +// StartedAt returns the time that the visor was created +func (vs *Visor) StartedAt() time.Time { + return vs.startedAt +} + +// RefreshUnconfirmed checks unconfirmed txns against the blockchain and returns +// all transaction that turn to valid. +func (vs *Visor) RefreshUnconfirmed() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + if err := vs.db.Update("RefreshUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.Refresh(tx, vs.blockchain, vs.Config.Distribution, vs.Config.UnconfirmedVerifyTxn) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// RemoveInvalidUnconfirmed removes transactions that become permanently invalid +// (by violating hard constraints) from the pool. +// Returns the transaction hashes that were removed. +func (vs *Visor) RemoveInvalidUnconfirmed() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + if err := vs.db.Update("RemoveInvalidUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.RemoveInvalid(tx, vs.blockchain) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// createBlock creates a SignedBlock from pending transactions +func (vs *Visor) createBlock(tx *dbutil.Tx, when uint64) (coin.SignedBlock, error) { + if !vs.Config.IsBlockPublisher { + logger.Panic("Only a block publisher node can create blocks") + } + + // Gather all unconfirmed transactions + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return coin.SignedBlock{}, err + } + + b, err := vs.createBlockFromTxns(tx, txns, when) + if err != nil { + return coin.SignedBlock{}, err + } + + return vs.signBlock(b), nil +} + +// createBlockFromTxns creates a Block from specified set of transactions according to set of determinstic rules. +func (vs *Visor) createBlockFromTxns(tx *dbutil.Tx, txns coin.Transactions, when uint64) (coin.Block, error) { + if len(txns) == 0 { + return coin.Block{}, errors.New("No transactions") + } + + logger.Infof("unconfirmed pool has %d transactions pending", len(txns)) + + // Filter transactions that violate all constraints + var filteredTxns coin.Transactions + for _, txn := range txns { + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, txn, vs.Config.Distribution, vs.Config.CreateBlockVerifyTxn, transaction.TxnSigned); err != nil { + switch err.(type) { + case transaction.ErrTxnViolatesHardConstraint, transaction.ErrTxnViolatesSoftConstraint: + logger.Warningf("Transaction %s violates constraints: %v", txn.Hash().Hex(), err) + default: + return coin.Block{}, err + } + } else { + filteredTxns = append(filteredTxns, txn) + } + } + + nRemoved := len(txns) - len(filteredTxns) + if nRemoved > 0 { + logger.Infof("CreateBlock ignored %d transactions violating constraints", nRemoved) + } + + txns = filteredTxns + + if len(txns) == 0 { + logger.Info("No transactions after filtering for constraint violations") + return coin.Block{}, errors.New("No transactions after filtering for constraint violations") + } + + head, err := vs.blockchain.Head(tx) + if err != nil { + return coin.Block{}, err + } + + // Sort them by highest fee per kilobyte + txns, err = coin.SortTransactions(txns, vs.blockchain.TransactionFee(tx, head.Time())) + if err != nil { + logger.Critical().WithError(err).Error("SortTransactions failed, no block can be made until the offending transaction is removed") + return coin.Block{}, err + } + + // Apply block size transaction limit + txns, err = txns.TruncateBytesTo(vs.Config.MaxBlockTransactionsSize) + if err != nil { + logger.Critical().WithError(err).Error("TruncateBytesTo failed, no block can be made until the offending transaction is removed") + return coin.Block{}, err + } + + if len(txns) > coin.MaxBlockTransactions { + txns = txns[:coin.MaxBlockTransactions] + } + + if len(txns) == 0 { + logger.Panic("TruncateBytesTo removed all transactions") + } + + logger.Infof("Creating new block with %d transactions, head time %d", len(txns), when) + + b, err := vs.blockchain.NewBlock(tx, txns, when) + if err != nil { + logger.Warningf("blockchain.NewBlock failed: %v", err) + return coin.Block{}, err + } + + return *b, nil +} + +// CreateAndExecuteBlock creates a SignedBlock from pending transactions and executes it +func (vs *Visor) CreateAndExecuteBlock() (coin.SignedBlock, error) { + var sb coin.SignedBlock + + err := vs.db.Update("CreateAndExecuteBlock", func(tx *dbutil.Tx) error { + var err error + sb, err = vs.createBlock(tx, uint64(time.Now().UTC().Unix())) + if err != nil { + return err + } + + return vs.executeSignedBlock(tx, sb) + }) + + return sb, err +} + +// CreateBlockFromTxns creates a Block from specified set of transactions according to set of determinstic rules. +func (vs *Visor) CreateBlockFromTxns(txns coin.Transactions, when uint64) (coin.Block, error) { + var sb coin.Block + + err := vs.db.Update("CreateBlockFromTxns", func(tx *dbutil.Tx) error { + var err error + if sb, err = vs.createBlockFromTxns(tx, txns, when); err != nil { + return err + } + + return nil + }) + + return sb, err +} + +// VerifyBlock verifies specified block against local copy of blockchain. +// Signature is not verified. +func (vs *Visor) VerifyBlock(b coin.SignedBlock) error { + return vs.db.View("VerifyBlock", func(tx *dbutil.Tx) error { + return vs.blockchain.VerifyBlock(tx, &b) + }) +} + +// ExecuteSignedBlock adds a block to the blockchain, or returns error. +// Blocks must be executed in sequence, and be signed by a block publisher node. +func (vs *Visor) ExecuteSignedBlock(b coin.SignedBlock) error { + return vs.db.Update("ExecuteSignedBlock", func(tx *dbutil.Tx) error { + return vs.executeSignedBlock(tx, b) + }) +} + +// ExecuteSignedBlockUnsafe adds block to the blockchain, or returns error. +// Blocks must be executed in sequence. Block signature is not verified. +func (vs *Visor) ExecuteSignedBlockUnsafe(b coin.SignedBlock) error { + return vs.db.Update("ExecuteSignedBlockUnsafe", func(tx *dbutil.Tx) error { + return vs.executeSignedBlockUnsafe(tx, b) + }) +} + +// executeSignedBlock adds a block to the blockchain, or returns error. +// Blocks must be executed in sequence, and be signed by a block publisher node. +func (vs *Visor) executeSignedBlock(tx *dbutil.Tx, b coin.SignedBlock) error { + if err := b.VerifySignature(vs.Config.BlockchainPubkey); err != nil { + return err + } + + return vs.executeSignedBlockUnsafe(tx, b) +} + +// executeSignedBlockUnsafe add a block to the blockchain, or returns error. +// Blocks must be executed in sequence. Block signature is not verified. +func (vs *Visor) executeSignedBlockUnsafe(tx *dbutil.Tx, b coin.SignedBlock) error { + if err := vs.blockchain.ExecuteBlock(tx, &b); err != nil { + return err + } + + // Remove the transactions in the Block from the unconfirmed pool + txnHashes := make([]cipher.SHA256, 0, len(b.Block.Body.Transactions)) + for _, txn := range b.Block.Body.Transactions { + txnHashes = append(txnHashes, txn.Hash()) + } + + if err := vs.unconfirmed.RemoveTransactions(tx, txnHashes); err != nil { + return err + } + + // Update the HistoryDB + return vs.history.ParseBlock(tx, b.Block) +} + +// signBlock signs a block for a block publisher node. Will panic if anything is invalid +func (vs *Visor) signBlock(b coin.Block) coin.SignedBlock { + if !vs.Config.IsBlockPublisher { + logger.Panic("Only a block publisher node can sign blocks") + } + + sig := cipher.MustSignHash(b.HashHeader(), vs.Config.BlockchainSeckey) + + return coin.SignedBlock{ + Block: b, + Sig: sig, + } +} + +/* + Return Data +*/ + +// GetAllUnspentOutputs returns all unspent outputs +func (vs *Visor) GetAllUnspentOutputs() (coin.UxArray, error) { + var ux []coin.UxOut + if err := vs.db.View("GetAllUnspentOutputs", func(tx *dbutil.Tx) error { + var err error + ux, err = vs.blockchain.Unspent().GetAll(tx) + return err + }); err != nil { + return nil, err + } + + return ux, nil +} + +// GetUnspentOutputs returns unspent outputs from the pool, queried by hashes. +// If any do not exist, ErrUnspentNotExist is returned +func (vs *Visor) GetUnspentOutputs(hashes []cipher.SHA256) (coin.UxArray, error) { + var outputs coin.UxArray + if err := vs.db.View("GetUnspentOutputs", func(tx *dbutil.Tx) error { + var err error + outputs, err = vs.blockchain.Unspent().GetArray(tx, hashes) + return err + }); err != nil { + return nil, err + } + + return outputs, nil +} + +// UnconfirmedOutgoingOutputs returns all outputs that would be spent by unconfirmed transactions +func (vs *Visor) UnconfirmedOutgoingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.db.View("UnconfirmedOutgoingOutputs", func(tx *dbutil.Tx) error { + var err error + uxa, err = vs.unconfirmedOutgoingOutputs(tx) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +func (vs *Visor) unconfirmedOutgoingOutputs(tx *dbutil.Tx) (coin.UxArray, error) { + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return nil, err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + return vs.blockchain.Unspent().GetArray(tx, inputs) +} + +// UnconfirmedIncomingOutputs returns all outputs that would be created by unconfirmed transactions +func (vs *Visor) UnconfirmedIncomingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.db.View("UnconfirmedIncomingOutputs", func(tx *dbutil.Tx) error { + var err error + uxa, err = vs.unconfirmedIncomingOutputs(tx) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +func (vs *Visor) unconfirmedIncomingOutputs(tx *dbutil.Tx) (coin.UxArray, error) { + head, err := vs.blockchain.Head(tx) + if err != nil { + return nil, err + } + + return vs.unconfirmed.GetIncomingOutputs(tx, head.Head) +} + +// GetSignedBlocksSince returns N signed blocks more recent than Seq. Does not return nil. +func (vs *Visor) GetSignedBlocksSince(seq, ct uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetSignedBlocksSince", func(tx *dbutil.Tx) error { + avail := uint64(0) + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + headSeq := head.Seq() + if headSeq > seq { + avail = headSeq - seq + } + if avail < ct { + ct = avail + } + if ct == 0 { + return nil + } + + blocks = make([]coin.SignedBlock, 0, ct) + for j := uint64(0); j < ct; j++ { + i := seq + 1 + j + b, err := vs.blockchain.GetSignedBlockBySeq(tx, i) + if err != nil { + return err + } + + blocks = append(blocks, *b) + } + + return nil + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// HeadBkSeq returns the highest BkSeq we know, returns false in the 2nd return value +// if the blockchain is empty +func (vs *Visor) HeadBkSeq() (uint64, bool, error) { + var headSeq uint64 + var ok bool + + if err := vs.db.View("HeadBkSeq", func(tx *dbutil.Tx) error { + var err error + headSeq, ok, err = vs.blockchain.HeadSeq(tx) + return err + }); err != nil { + return 0, false, err + } + + return headSeq, ok, nil +} + +// GetBlockchainMetadata returns descriptive blockchain information +func (vs *Visor) GetBlockchainMetadata() (*BlockchainMetadata, error) { + var head *coin.SignedBlock + var unconfirmedLen, unspentsLen uint64 + + if err := vs.db.View("GetBlockchainMetadata", func(tx *dbutil.Tx) error { + var err error + head, err = vs.blockchain.Head(tx) + if err != nil { + return err + } + + unconfirmedLen, err = vs.unconfirmed.Len(tx) + if err != nil { + return err + } + + unspentsLen, err = vs.blockchain.Unspent().Len(tx) + return err + }); err != nil { + return nil, err + } + + return NewBlockchainMetadata(*head, unconfirmedLen, unspentsLen) +} + +// GetBlock returns a copy of the block at seq. Returns error if seq out of range +func (vs *Visor) GetBlock(seq uint64) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.db.View("GetBlock", func(tx *dbutil.Tx) error { + headSeq, ok, err := vs.blockchain.HeadSeq(tx) + if err != nil { + return err + } + + if !ok || seq > headSeq { + return errors.New("Block seq out of range") + } + + b, err = vs.blockchain.GetSignedBlockBySeq(tx, seq) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetBlocks returns blocks matches seqs +func (vs *Visor) GetBlocks(seqs []uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetBlocks", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.blockchain.GetBlocks(tx, seqs) + return err + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// GetBlocksVerbose returns blocks matches seqs along with verbose transaction input data +func (vs *Visor) GetBlocksVerbose(seqs []uint64) ([]coin.SignedBlock, [][][]TransactionInput, error) { + var blocks []coin.SignedBlock + var inputs [][][]TransactionInput + + if err := vs.db.View("GetBlocksVerbose", func(tx *dbutil.Tx) error { + var err error + blocks, inputs, err = vs.getBlocksVerbose(tx, func(tx *dbutil.Tx) ([]coin.SignedBlock, error) { + return vs.blockchain.GetBlocks(tx, seqs) + }) + return err + }); err != nil { + return nil, nil, err + } + + return blocks, inputs, nil +} + +// GetBlocksInRange returns multiple blocks between start and end, including both start and end. +// Returns the empty slice if unable to fulfill request. +func (vs *Visor) GetBlocksInRange(start, end uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetBlocksInRange", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.blockchain.GetBlocksInRange(tx, start, end) + return err + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// GetBlocksInRangeVerbose returns multiple blocks between start and end, including both start and end. +// Also returns the verbose transaction input data for transactions in these blocks. +// Returns the empty slice if unable to fulfill request. +func (vs *Visor) GetBlocksInRangeVerbose(start, end uint64) ([]coin.SignedBlock, [][][]TransactionInput, error) { + var blocks []coin.SignedBlock + var inputs [][][]TransactionInput + + if err := vs.db.View("GetBlocksInRangeVerbose", func(tx *dbutil.Tx) error { + var err error + blocks, inputs, err = vs.getBlocksVerbose(tx, func(tx *dbutil.Tx) ([]coin.SignedBlock, error) { + return vs.blockchain.GetBlocksInRange(tx, start, end) + }) + return err + }); err != nil { + return nil, nil, err + } + + return blocks, inputs, nil +} + +// GetLastBlocks returns last N blocks +func (vs *Visor) GetLastBlocks(num uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetLastBlocks", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.blockchain.GetLastBlocks(tx, num) + return err + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// GetLastBlocksVerbose returns last N blocks with verbose transaction input data +func (vs *Visor) GetLastBlocksVerbose(num uint64) ([]coin.SignedBlock, [][][]TransactionInput, error) { + var blocks []coin.SignedBlock + var inputs [][][]TransactionInput + + if err := vs.db.View("GetLastBlocksVerbose", func(tx *dbutil.Tx) error { + var err error + blocks, inputs, err = vs.getBlocksVerbose(tx, func(tx *dbutil.Tx) ([]coin.SignedBlock, error) { + return vs.blockchain.GetLastBlocks(tx, num) + }) + return err + }); err != nil { + return nil, nil, err + } + + return blocks, inputs, nil +} + +func (vs *Visor) getBlocksVerbose(tx *dbutil.Tx, getBlocks func(*dbutil.Tx) ([]coin.SignedBlock, error)) ([]coin.SignedBlock, [][][]TransactionInput, error) { + blocks, err := getBlocks(tx) + if err != nil { + return nil, nil, err + } + + if len(blocks) == 0 { + return nil, nil, nil + } + + inputs := make([][][]TransactionInput, len(blocks)) + for i, b := range blocks { + blockInputs, err := vs.getBlockInputs(tx, &b) + if err != nil { + return nil, nil, err + } + inputs[i] = blockInputs + } + + return blocks, inputs, nil +} + +// InjectForeignTransaction records a coin.Transaction to the UnconfirmedTransactionPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard constraints, it is rejected, and error will not be nil. +// If the transaction only violates soft constraints, it is still injected, and the soft constraint violation is returned. +// This method is intended for transactions received over the network. +func (vs *Visor) InjectForeignTransaction(txn coin.Transaction) (bool, *transaction.ErrTxnViolatesSoftConstraint, error) { + var known bool + var softErr *transaction.ErrTxnViolatesSoftConstraint + + if err := vs.db.Update("InjectForeignTransaction", func(tx *dbutil.Tx) error { + var err error + known, softErr, err = vs.unconfirmed.InjectTransaction(tx, vs.blockchain, txn, vs.Config.Distribution, vs.Config.UnconfirmedVerifyTxn) + return err + }); err != nil { + return false, nil, err + } + + return known, softErr, nil +} + +// InjectUserTransaction records a coin.Transaction to the UnconfirmedTransactionPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard or soft constraints, it is rejected, and error will not be nil. +func (vs *Visor) InjectUserTransaction(txn coin.Transaction) (bool, *coin.SignedBlock, coin.UxArray, error) { + var known bool + var head *coin.SignedBlock + var inputs coin.UxArray + + if err := vs.db.Update("InjectUserTransaction", func(tx *dbutil.Tx) error { + var err error + known, head, inputs, err = vs.InjectUserTransactionTx(tx, txn) + return err + }); err != nil { + return false, nil, nil, err + } + + return known, head, inputs, nil +} + +// InjectUserTransactionTx records a coin.Transaction to the UnconfirmedTransactionPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard or soft constraints, it is rejected, and error will not be nil. +// This method is only exported for use by the daemon gateway's InjectBroadcastTransaction method. +func (vs *Visor) InjectUserTransactionTx(tx *dbutil.Tx, txn coin.Transaction) (bool, *coin.SignedBlock, coin.UxArray, error) { + if err := transaction.VerifySingleTxnUserConstraints(txn); err != nil { + return false, nil, nil, err + } + + head, inputs, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, txn, vs.Config.Distribution, params.UserVerifyTxn, transaction.TxnSigned) + if err != nil { + return false, nil, nil, err + } + + known, softErr, err := vs.unconfirmed.InjectTransaction(tx, vs.blockchain, txn, vs.Config.Distribution, params.UserVerifyTxn) + if softErr != nil { + logger.WithError(softErr).Warning("InjectUserTransaction vs.unconfirmed.InjectTransaction returned a softErr unexpectedly") + } + + return known, head, inputs, err +} + +// GetTransaction returns a Transaction by hash. +func (vs *Visor) GetTransaction(txnHash cipher.SHA256) (*Transaction, error) { + var txn *Transaction + + if err := vs.db.View("GetTransaction", func(tx *dbutil.Tx) error { + var err error + txn, err = vs.getTransaction(tx, txnHash) + return err + }); err != nil { + return nil, err + } + + return txn, nil +} + +// GetTransactionWithInputs returns a Transaction by hash, along with the unspent outputs of its inputs +func (vs *Visor) GetTransactionWithInputs(txnHash cipher.SHA256) (*Transaction, []TransactionInput, error) { + var txn *Transaction + var inputs []TransactionInput + + if err := vs.db.View("GetTransactionWithInputs", func(tx *dbutil.Tx) error { + var err error + txn, err = vs.getTransaction(tx, txnHash) + if err != nil { + return err + } + + if txn == nil { + return nil + } + + feeCalcTime, err := vs.getFeeCalcTimeForTransaction(tx, *txn) + if err != nil { + return err + } + if feeCalcTime == nil { + return nil + } + + inputs, err = vs.getTransactionInputs(tx, *feeCalcTime, txn.Transaction.In) + return err + }); err != nil { + return nil, nil, err + } + + return txn, inputs, nil +} + +func (vs *Visor) getTransaction(tx *dbutil.Tx, txnHash cipher.SHA256) (*Transaction, error) { + // Look in the unconfirmed pool + utxn, err := vs.unconfirmed.Get(tx, txnHash) + if err != nil { + return nil, err + } + + if utxn != nil { + return &Transaction{ + Transaction: utxn.Transaction, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(timeutil.NanoToTime(utxn.Received).Unix()), + }, nil + } + + htxn, err := vs.history.GetTransaction(tx, txnHash) + if err != nil { + return nil, err + } + + if htxn == nil { + return nil, nil + } + + headSeq, ok, err := vs.blockchain.HeadSeq(tx) + if err != nil { + return nil, err + } else if !ok { + return nil, errors.New("blockchain is empty but history has transactions") + } + + b, err := vs.blockchain.GetSignedBlockBySeq(tx, htxn.BlockSeq) + if err != nil { + return nil, err + } + + if b == nil { + return nil, fmt.Errorf("found no block in seq %v", htxn.BlockSeq) + } + + if headSeq < htxn.BlockSeq { + return nil, fmt.Errorf("blockchain head seq %d is earlier than history txn seq %d", headSeq, htxn.BlockSeq) + } + + confirms := headSeq - htxn.BlockSeq + 1 + return &Transaction{ + Transaction: htxn.Txn, + Status: NewConfirmedTransactionStatus(confirms, htxn.BlockSeq), + Time: b.Time(), + }, nil +} + +// TxFilter transaction filter type +type TxFilter interface { + // Returns whether the transaction is matched + Match(*Transaction) bool +} + +// BaseFilter is a helper struct for generating TxFilter. +type BaseFilter struct { + F func(tx *Transaction) bool +} + +// Match matches the filter based upon F +func (f BaseFilter) Match(tx *Transaction) bool { + return f.F(tx) +} + +// NewAddrsFilter collects all addresses related transactions. +func NewAddrsFilter(addrs []cipher.Address) TxFilter { + return AddrsFilter{Addrs: addrs} +} + +// AddrsFilter filters by addresses +type AddrsFilter struct { + Addrs []cipher.Address +} + +// Match implements the TxFilter interface, this actually won't be used, only the 'Addrs' member is used. +func (af AddrsFilter) Match(tx *Transaction) bool { return true } + +// ConfirmedTxFilter filters transactions base on whether they are confirmed. +type ConfirmedTxFilter struct { + Confirmed bool +} + +// Match implements the TxFilter interface, this actually won't be used, only the value of 'Confirmed' is used. +func (cf ConfirmedTxFilter) Match(tx *Transaction) bool { + return tx.Status.Confirmed == cf.Confirmed +} + +// NewConfirmedTxFilter collects the transaction whose 'Confirmed' status matchs the parameter passed in. +func NewConfirmedTxFilter(isConfirmed bool) TxFilter { + return ConfirmedTxFilter{Confirmed: isConfirmed} +} + +// GetTransactions returns transactions that can pass the filters with page. +// If no filters is provided, returns all transactions. +func (vs *Visor) GetTransactions(flts []TxFilter, order SortOrder, page *PageIndex) ([]Transaction, uint64, error) { + var txns []Transaction + var pages uint64 + if err := vs.db.View("GetTransactions", func(tx *dbutil.Tx) error { + var err error + txns, pages, err = vs.txns.GetTransactions(tx, flts, order, page) + return err + }); err != nil { + return nil, 0, err + } + + return txns, pages, nil +} + +// GetTransactionsWithInputs is the same as GetTransactions but also returns verbose transaction input data +func (vs *Visor) GetTransactionsWithInputs(flts []TxFilter, order SortOrder, page *PageIndex) ([]Transaction, [][]TransactionInput, uint64, error) { + var txns []Transaction + var inputs [][]TransactionInput + var pages uint64 + if err := vs.db.View("GetTransactionsWithInputs", func(tx *dbutil.Tx) error { + var err error + txns, pages, err = vs.txns.GetTransactions(tx, flts, order, page) + if err != nil { + return err + } + + inputs = make([][]TransactionInput, len(txns)) + for i, txn := range txns { + feeCalcTime, err := vs.getFeeCalcTimeForTransaction(tx, txn) + if err != nil { + return err + } + if feeCalcTime == nil { + continue + } + + txnInputs, err := vs.getTransactionInputs(tx, *feeCalcTime, txn.Transaction.In) + if err != nil { + return err + } + + inputs[i] = txnInputs + } + + return nil + }); err != nil { + return nil, nil, 0, err + } + + return txns, inputs, pages, nil +} + +// AddressBalances computes the total balance for cipher.Addresses and their coin.UxOuts +func (vs *Visor) AddressBalances(head *coin.SignedBlock, auxs coin.AddressUxOuts) (uint64, uint64, error) { + prevTime := head.Time() + var coins uint64 + var hours uint64 + for _, uxs := range auxs { + for _, ux := range uxs { + uxHours, err := ux.CoinHours(prevTime) + if err != nil { + return 0, 0, err + } + + coins, err = mathutil.AddUint64(coins, ux.Body.Coins) + if err != nil { + return 0, 0, err + } + + hours, err = mathutil.AddUint64(hours, uxHours) + if err != nil { + return 0, 0, err + } + } + } + return coins, hours, nil +} + +// GetUnconfirmedTransactions gets all confirmed transactions of specific addresses +func (vs *Visor) GetUnconfirmedTransactions(filter func(UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := vs.db.View("GetUnconfirmedTransactions", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, filter) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetUnconfirmedTransactionsVerbose gets all confirmed transactions of specific addresses +func (vs *Visor) GetUnconfirmedTransactionsVerbose(filter func(UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, [][]TransactionInput, error) { + var txns []UnconfirmedTransaction + var inputs [][]TransactionInput + + if err := vs.db.View("GetUnconfirmedTransactionsVerbose", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, filter) + if err != nil { + return err + } + + inputs, err = vs.getTransactionInputsForUnconfirmedTxns(tx, txns) + + return err + }); err != nil { + return nil, nil, err + } + + if len(txns) == 0 { + return nil, nil, nil + } + + return txns, inputs, nil +} + +// SendsToAddresses represents a filter that check if tx has output to the given addresses +func SendsToAddresses(addresses []cipher.Address) func(UnconfirmedTransaction) bool { + return func(tx UnconfirmedTransaction) (isRelated bool) { + for _, out := range tx.Transaction.Out { + for _, address := range addresses { + if out.Address == address { + isRelated = true + return + } + } + } + return + } +} + +// GetAllUnconfirmedTransactions returns all unconfirmed transactions +func (vs *Visor) GetAllUnconfirmedTransactions() ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := vs.db.View("GetAllUnconfirmedTransactions", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, All) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetAllUnconfirmedTransactionsVerbose returns all unconfirmed transactions with verbose transaction input data +func (vs *Visor) GetAllUnconfirmedTransactionsVerbose() ([]UnconfirmedTransaction, [][]TransactionInput, error) { + var txns []UnconfirmedTransaction + var inputs [][]TransactionInput + + if err := vs.db.View("GetAllUnconfirmedTransactionsVerbose", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, All) + if err != nil { + return err + } + + inputs, err = vs.getTransactionInputsForUnconfirmedTxns(tx, txns) + + return err + }); err != nil { + return nil, nil, err + } + + if len(txns) == 0 { + return nil, nil, nil + } + + return txns, inputs, nil +} + +// getTransactionInputsForUnconfirmedTxns returns ReadableTransactionInputs for a set of UnconfirmedTransactions +func (vs *Visor) getTransactionInputsForUnconfirmedTxns(tx *dbutil.Tx, txns []UnconfirmedTransaction) ([][]TransactionInput, error) { + if len(txns) == 0 { + return nil, nil + } + + // Use the current head time to calculate estimated coin hours of unconfirmed transactions + headTime, err := vs.blockchain.Time(tx) + if err != nil { + return nil, err + } + + inputs := make([][]TransactionInput, len(txns)) + for i, txn := range txns { + if len(txn.Transaction.In) == 0 { + logger.Critical().WithField("txid", txn.Transaction.Hash().Hex()).Warning("unconfirmed transaction has no inputs") + continue + } + + txnInputs, err := vs.getTransactionInputs(tx, headTime, txn.Transaction.In) + if err != nil { + return nil, err + } + + inputs[i] = txnInputs + } + + return inputs, nil +} + +// getFeeCalcTimeForTransaction returns the time against which a transaction's fee should be calculated. +// The genesis block has no inputs and thus no fee to calculate, so it returns nil. +// A confirmed transaction's fee was calculated from the previous block's head time, when it was executed. +// An unconfirmed transaction's fee will be calculated from the current block head time, once executed. +func (vs *Visor) getFeeCalcTimeForTransaction(tx *dbutil.Tx, txn Transaction) (*uint64, error) { + // The genesis block has no inputs to calculate, otherwise calculate the inputs + if txn.Status.BlockSeq == 0 && txn.Status.Confirmed { + return nil, nil + } + + feeCalcTime := uint64(0) + if txn.Status.Confirmed { + // Use the previous block head to calculate the coin hours + prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, txn.Status.BlockSeq-1) + if err != nil { + return nil, err + } + + if prevBlock == nil { + err := fmt.Errorf("getFeeCalcTimeForTransaction: prevBlock seq=%d not found", txn.Status.BlockSeq-1) + logger.Critical().WithError(err).Error("getFeeCalcTimeForTransaction") + return nil, err + } + + feeCalcTime = prevBlock.Block.Head.Time + } else { + // Use the current block head to calculate the coin hours + var err error + feeCalcTime, err = vs.blockchain.Time(tx) + if err != nil { + return nil, err + } + } + + return &feeCalcTime, nil +} + +// GetAllValidUnconfirmedTxHashes returns all valid unconfirmed transaction hashes +func (vs *Visor) GetAllValidUnconfirmedTxHashes() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := vs.db.View("GetAllValidUnconfirmedTxHashes", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.GetHashes(tx, IsValid) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// GetConfirmedTransaction returns transaction, which has been already included in some block. +func (vs *Visor) GetConfirmedTransaction(txnHash cipher.SHA256) (*coin.Transaction, error) { + var histTxn *historydb.Transaction + + if err := vs.db.View("GetConfirmedTransaction", func(tx *dbutil.Tx) error { + var err error + histTxn, err = vs.history.GetTransaction(tx, txnHash) + return err + }); err != nil { + return nil, err + } + + // Transaction not found. + if histTxn == nil { + return nil, nil + } + + return &histTxn.Txn, nil +} + +// GetTransactionsNum returns the total number of transactions that have been executed +func (vs *Visor) GetTransactionsNum() (uint64, error) { + var ( + num uint64 + err error + ) + + if err := vs.db.View("GetTransactionsNum", func(tx *dbutil.Tx) error { + num, err = vs.history.GetTransactionsNum(tx) + return err + }); err != nil { + return 0, err + } + + return num, nil +} + +// GetSignedBlockByHash get block of specific hash header, return nil on not found. +func (vs *Visor) GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { + var sb *coin.SignedBlock + + if err := vs.db.View("GetSignedBlockByHash", func(tx *dbutil.Tx) error { + var err error + sb, err = vs.blockchain.GetSignedBlockByHash(tx, hash) + return err + }); err != nil { + return nil, err + } + + return sb, nil +} + +// GetSignedBlockBySeq get block of specific seq, return nil on not found. +func (vs *Visor) GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.db.View("GetSignedBlockBySeq", func(tx *dbutil.Tx) error { + var err error + b, err = vs.blockchain.GetSignedBlockBySeq(tx, seq) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetSignedBlockByHashVerbose returns a coin.SignedBlock and its transactions' input data for a given block hash +func (vs *Visor) GetSignedBlockByHashVerbose(hash cipher.SHA256) (*coin.SignedBlock, [][]TransactionInput, error) { + var b *coin.SignedBlock + var inputs [][]TransactionInput + + if err := vs.db.View("GetSignedBlockByHashVerbose", func(tx *dbutil.Tx) error { + var err error + b, inputs, err = vs.getBlockVerbose(tx, func(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return vs.blockchain.GetSignedBlockByHash(tx, hash) + }) + return err + }); err != nil { + return nil, nil, err + } + + return b, inputs, nil +} + +// GetSignedBlockBySeqVerbose returns a coin.SignedBlock and its transactions' input data for a given block hash +func (vs *Visor) GetSignedBlockBySeqVerbose(seq uint64) (*coin.SignedBlock, [][]TransactionInput, error) { + var b *coin.SignedBlock + var inputs [][]TransactionInput + + if err := vs.db.View("GetSignedBlockBySeqVerbose", func(tx *dbutil.Tx) error { + var err error + b, inputs, err = vs.getBlockVerbose(tx, func(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return vs.blockchain.GetSignedBlockBySeq(tx, seq) + }) + return err + }); err != nil { + return nil, nil, err + } + + return b, inputs, nil +} + +func (vs *Visor) getBlockVerbose(tx *dbutil.Tx, getBlock func(*dbutil.Tx) (*coin.SignedBlock, error)) (*coin.SignedBlock, [][]TransactionInput, error) { + b, err := getBlock(tx) + if err != nil { + return nil, nil, err + } + + if b == nil { + return nil, nil, nil + } + + inputs, err := vs.getBlockInputs(tx, b) + if err != nil { + return nil, nil, err + } + + return b, inputs, nil +} + +func (vs *Visor) getBlockInputs(tx *dbutil.Tx, b *coin.SignedBlock) ([][]TransactionInput, error) { + if b == nil { + return nil, nil + } + + // The genesis block has no inputs to query or to calculate fees from + if b.Block.Head.BkSeq == 0 { + if len(b.Block.Body.Transactions) != 1 { + logger.Panicf("Genesis block should have only 1 transaction (has %d)", len(b.Block.Body.Transactions)) + } + + if len(b.Block.Body.Transactions[0].In) != 0 { + logger.Panic("Genesis block transaction should not have inputs") + } + + inputs := make([][]TransactionInput, 1) + + return inputs, nil + } + + // When a transaction was added to a block, its coinhour fee was + // calculated based upon the time of the head block. + // So we need to look at the previous block + prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, b.Head.BkSeq-1) + if err != nil { + return nil, err + } + + if prevBlock == nil { + err := fmt.Errorf("getBlockInputs: prevBlock seq %d not found", b.Head.BkSeq-1) + logger.Critical().WithError(err).Error() + return nil, err + } + + var inputs [][]TransactionInput + for _, txn := range b.Block.Body.Transactions { + i, err := vs.getTransactionInputs(tx, prevBlock.Block.Head.Time, txn.In) + if err != nil { + return nil, err + } + + inputs = append(inputs, i) + } + + return inputs, nil +} + +// getTransactionInputs returns []TransactionInput for a given set of spent output hashes. +// feeCalcTime is the time against which to calculate the coinhours of the output +func (vs *Visor) getTransactionInputs(tx *dbutil.Tx, feeCalcTime uint64, inputs []cipher.SHA256) ([]TransactionInput, error) { + if len(inputs) == 0 { + err := errors.New("getTransactionInputs: inputs is empty only the genesis block transaction has no inputs, which shouldn't call this method") + logger.WithError(err).Error() + return nil, err + } + + uxOuts, err := vs.history.GetUxOuts(tx, inputs) + if err != nil { + logger.WithError(err).Error("getTransactionInputs GetUxOuts failed") + return nil, err + } + + ret := make([]TransactionInput, len(inputs)) + for i, o := range uxOuts { + r, err := NewTransactionInput(o.Out, feeCalcTime) + if err != nil { + logger.WithError(err).Error("getTransactionInputs NewTransactionInput failed") + return nil, err + } + ret[i] = r + } + + return ret, nil +} + +// GetHeadBlock gets head block. +func (vs Visor) GetHeadBlock() (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.db.View("GetHeadBlock", func(tx *dbutil.Tx) error { + var err error + b, err = vs.blockchain.Head(tx) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetHeadBlockTime returns the time of the head block. +func (vs Visor) GetHeadBlockTime() (uint64, error) { + var t uint64 + + if err := vs.db.View("GetHeadBlockTime", func(tx *dbutil.Tx) error { + var err error + t, err = vs.blockchain.Time(tx) + return err + }); err != nil { + return 0, err + } + + return t, nil +} + +// GetUxOutByID gets UxOut by hash id. +// return values: +// +// first: uxout of the provided id, return nil if does not exist, no error would be returned. +// second: current head block time +// third: error +func (vs Visor) GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, uint64, error) { + var outs []historydb.UxOut + var headTime uint64 + + if err := vs.db.View("GetUxOutByID", func(tx *dbutil.Tx) error { + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + headTime = head.Time() + + outs, err = vs.history.GetUxOuts(tx, []cipher.SHA256{id}) + if err != nil { + return err + } + + return err + }); err != nil { + return nil, 0, err + } + + if len(outs) == 0 { + return nil, 0, nil + } + + return &outs[0], headTime, nil +} + +// GetSpentOutputsForAddresses gets all the spent outputs of a set of addresses +// return values: +// +// first: addresses related uxouts +// second: current head block time +// third: error +func (vs Visor) GetSpentOutputsForAddresses(addresses []cipher.Address) ([][]historydb.UxOut, uint64, error) { + out := make([][]historydb.UxOut, len(addresses)) + var headTime uint64 + + if err := vs.db.View("GetSpentOutputsForAddresses", func(tx *dbutil.Tx) error { + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + headTime = head.Time() + + for i, addr := range addresses { + addrUxOuts, err := vs.history.GetOutputsForAddress(tx, addr) + if err != nil { + return err + } + + out[i] = addrUxOuts + } + + return nil + }); err != nil { + return nil, 0, err + } + + return out, headTime, nil +} + +// RecvOfAddresses returns unconfirmed receiving uxouts of addresses +func (vs *Visor) RecvOfAddresses(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var uxouts coin.AddressUxOuts + + if err := vs.db.View("RecvOfAddresses", func(tx *dbutil.Tx) error { + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + uxouts, err = vs.unconfirmed.RecvOfAddresses(tx, head.Head, addrs) + return err + }); err != nil { + return nil, err + } + + return uxouts, nil +} + +// GetIncomingOutputs returns all predicted outputs that are in pending tx pool +func (vs *Visor) GetIncomingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.db.View("GetIncomingOutputs", func(tx *dbutil.Tx) error { + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + uxa, err = vs.unconfirmed.GetIncomingOutputs(tx, head.Head) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +// GetUnconfirmedTxn gets an unconfirmed transaction from the DB +func (vs *Visor) GetUnconfirmedTxn(hash cipher.SHA256) (*UnconfirmedTransaction, error) { + var txn *UnconfirmedTransaction + + if err := vs.db.View("GetUnconfirmedTxn", func(tx *dbutil.Tx) error { + var err error + txn, err = vs.unconfirmed.Get(tx, hash) + return err + }); err != nil { + return nil, err + } + + return txn, nil +} + +// FilterKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (vs *Visor) FilterKnownUnconfirmed(txns []cipher.SHA256) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := vs.db.View("FilterKnownUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.FilterKnown(tx, txns) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// GetKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (vs *Visor) GetKnownUnconfirmed(txns []cipher.SHA256) (coin.Transactions, error) { + var hashes coin.Transactions + + if err := vs.db.View("GetKnownUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.GetKnown(tx, txns) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// UnconfirmedSpendsOfAddresses returns all unconfirmed coin.UxOut spends of addresses +func (vs *Visor) UnconfirmedSpendsOfAddresses(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var outs coin.AddressUxOuts + + if err := vs.db.View("UnconfirmedSpendsOfAddresses", func(tx *dbutil.Tx) error { + var err error + outs, err = vs.unconfirmedSpendsOfAddresses(tx, addrs) + return err + }); err != nil { + return nil, err + } + + return outs, nil +} + +// unconfirmedSpendsOfAddresses returns all unconfirmed coin.UxOut spends of addresses +func (vs *Visor) unconfirmedSpendsOfAddresses(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return nil, err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + uxa, err := vs.blockchain.Unspent().GetArray(tx, inputs) + if err != nil { + return nil, err + } + + outs := make(coin.AddressUxOuts, len(addrs)) + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + for _, ux := range uxa { + if _, ok := addrm[ux.Body.Address]; ok { + outs[ux.Body.Address] = append(outs[ux.Body.Address], ux) + } + } + + return outs, nil +} + +// SetTransactionsAnnounced updates announced time of specific tx +func (vs *Visor) SetTransactionsAnnounced(hashes map[cipher.SHA256]int64) error { + if len(hashes) == 0 { + return nil + } + + return vs.db.Update("SetTransactionsAnnounced", func(tx *dbutil.Tx) error { + return vs.unconfirmed.SetTransactionsAnnounced(tx, hashes) + }) +} + +// GetBalanceOfAddresses returns balance pairs of given addreses +func (vs Visor) GetBalanceOfAddresses(addrs []cipher.Address) ([]wallet.BalancePair, error) { + if len(addrs) == 0 { + return nil, nil + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + recvUxs := make(coin.AddressUxOuts, len(addrs)) + var uxa coin.UxArray + var head *coin.SignedBlock + + if err := vs.db.View("GetBalanceOfAddresses", func(tx *dbutil.Tx) error { + var err error + head, err = vs.blockchain.Head(tx) + if err != nil { + return err + } + + // Get all transactions from the unconfirmed pool + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return err + } + + // Create predicted unspent outputs from the unconfirmed transactions + recvUxs, err = txnOutputsForAddrs(head.Head, addrs, txns) + if err != nil { + return err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + // Get unspents for the inputs being spent + uxa, err = vs.blockchain.Unspent().GetArray(tx, inputs) + if err != nil { + return fmt.Errorf("GetArray failed when checking addresses balance: %v", err) + } + + // Get unspents owned by the addresses + auxs, err = vs.blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + if err != nil { + return fmt.Errorf("GetUnspentsOfAddrs failed when checking addresses balance: %v", err) + } + + return nil + }); err != nil { + return nil, err + } + + // Build all unconfirmed transaction inputs that are associated with the addresses + spendUxs := make(coin.AddressUxOuts, len(addrs)) + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + for _, ux := range uxa { + if _, ok := addrm[ux.Body.Address]; ok { + spendUxs[ux.Body.Address] = append(spendUxs[ux.Body.Address], ux) + } + } + + var bps []wallet.BalancePair + + headTime := head.Time() + for _, addr := range addrs { + uxs, ok := auxs[addr] + if !ok { + bps = append(bps, wallet.BalancePair{}) + continue + } + + outUxs := spendUxs[addr] + inUxs := recvUxs[addr] + predictedUxs := uxs.Sub(outUxs).Add(inUxs) + + coins, err := uxs.Coins() + if err != nil { + return nil, fmt.Errorf("uxs.Coins failed: %v", err) + } + + coinHours, err := uxs.CoinHours(headTime) + if err != nil { + switch err { + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + coinHours = 0 + default: + return nil, fmt.Errorf("uxs.CoinHours failed: %v", err) + } + } + + pcoins, err := predictedUxs.Coins() + if err != nil { + return nil, fmt.Errorf("predictedUxs.Coins failed: %v", err) + } + + pcoinHours, err := predictedUxs.CoinHours(headTime) + if err != nil { + switch err { + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + coinHours = 0 + default: + return nil, fmt.Errorf("predictedUxs.CoinHours failed: %v", err) + } + } + + bp := wallet.BalancePair{ + Confirmed: wallet.Balance{ + Coins: coins, + Hours: coinHours, + }, + Predicted: wallet.Balance{ + Coins: pcoins, + Hours: pcoinHours, + }, + } + + bps = append(bps, bp) + } + + return bps, nil +} + +// GetUnspentsOfAddrs returns unspent outputs of multiple addresses +func (vs *Visor) GetUnspentsOfAddrs(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var uxa coin.AddressUxOuts + + if err := vs.db.View("GetUnspentsOfAddrs", func(tx *dbutil.Tx) error { + var err error + uxa, err = vs.blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +// VerifyTxnVerbose verifies a transaction, it returns transaction's input uxouts, whether the +// transaction is confirmed, and error if any +func (vs *Visor) VerifyTxnVerbose(txn *coin.Transaction, signed transaction.TxnSignedFlag) ([]TransactionInput, bool, error) { + var uxa coin.UxArray + var isTxnConfirmed bool + var feeCalcTime uint64 + + verifyErr := vs.db.View("VerifyTxnVerbose", func(tx *dbutil.Tx) error { + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + uxa, err = vs.blockchain.Unspent().GetArray(tx, txn.In) + switch e := err.(type) { + case nil: + // For unconfirmed transactions, use the blockchain head time to calculate hours + feeCalcTime = head.Time() + + case blockdb.ErrUnspentNotExist: + // Gets uxouts of txn.In from historydb + outs, err := vs.history.GetUxOuts(tx, txn.In) + if err != nil { + return err + } + + if len(outs) == 0 { + err = fmt.Errorf("transaction input of %s does not exist in either unspent pool or historydb", e.UxID) + return transaction.NewErrTxnViolatesHardConstraint(err) + } + + uxa = coin.UxArray{} + for _, out := range outs { + uxa = append(uxa, out.Out) + } + + // Checks if the transaction is confirmed + txnHash := txn.Hash() + historyTxn, err := vs.history.GetTransaction(tx, txnHash) + if err != nil { + return fmt.Errorf("get transaction of %v from historydb failed: %v", txnHash, err) + } + + if historyTxn != nil { + // Transaction is confirmed + isTxnConfirmed = true + } + + // For confirmed transactions, use the previous block time to calculate hours and fees, + // except for the genesis block which has no previous block and has no inputs nor fees. + feeCalcTime = 0 + if historyTxn.BlockSeq > 0 { + if isTxnConfirmed { + prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, historyTxn.BlockSeq-1) + if err != nil { + return err + } + if prevBlock == nil { + return fmt.Errorf("VerifyTxnVerbose: previous block seq=%d not found", historyTxn.BlockSeq-1) + } + + feeCalcTime = prevBlock.Block.Head.Time + } + } + + return nil + default: + return err + } + + if err := transaction.VerifySingleTxnUserConstraints(*txn); err != nil { + return err + } + + if err := transaction.VerifySingleTxnSoftConstraints(*txn, feeCalcTime, uxa, vs.Config.Distribution, params.UserVerifyTxn); err != nil { + return err + } + + return transaction.VerifySingleTxnHardConstraints(*txn, head.Head, uxa, signed) + }) + + // If we were able to query the inputs, return the verbose inputs to the caller + // even if the transaction failed validation + var inputs []TransactionInput + if len(uxa) != 0 && feeCalcTime != 0 { + var err error + inputs, err = NewTransactionInputs(uxa, feeCalcTime) + if err != nil { + return nil, isTxnConfirmed, err + } + } + + return inputs, isTxnConfirmed, verifyErr +} + +// AddressCount returns the total number of addresses with unspents +func (vs *Visor) AddressCount() (uint64, error) { + var count uint64 + if err := vs.db.View("AddressCount", func(tx *dbutil.Tx) error { + var err error + count, err = vs.blockchain.Unspent().AddressCount(tx) + return err + }); err != nil { + return 0, err + } + + return count, nil +} + +// GetVerboseTransactionsForAddress returns verbose transaction data for a given address +// func (vs *Visor) GetVerboseTransactionsForAddress(a cipher.Address) ([]Transaction, [][]TransactionInput, error) { +// var txns []Transaction +// var inputs [][]TransactionInput + +// if err := vs.db.View("GetVerboseTransactionsForAddress", func(tx *dbutil.Tx) error { +// var err error +// txns, _, err = vs.getTransactionsForAddresses(tx, []cipher.Address{a}, nil) +// if err != nil { +// logger.Errorf("GetVerboseTransactionsForAddress: vs.GetTransactionsForAddress failed: %v", err) +// return err +// } + +// if len(txns) == 0 { +// return nil +// } + +// head, err := vs.blockchain.Head(tx) +// if err != nil { +// logger.Errorf("GetVerboseTransactionsForAddress: vs.blockchain.Head failed: %v", err) +// return err +// } + +// inputs = make([][]TransactionInput, len(txns)) + +// for i, txn := range txns { +// // If the txn is confirmed, use the time of the block previous +// // to the block in which the transaction was executed, +// // else use the head time for unconfirmed blocks. +// t := head.Time() +// if txn.Status.Confirmed && txn.Status.BlockSeq > 0 { +// prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, txn.Status.BlockSeq-1) +// if err != nil { +// return err +// } + +// if prevBlock == nil { +// return fmt.Errorf("GetVerboseTransactionsForAddress prevBlock seq=%d missing", txn.Status.BlockSeq-1) +// } + +// t = prevBlock.Block.Head.Time +// } + +// txnInputs := make([]TransactionInput, len(txn.Transaction.In)) +// for j, inputID := range txn.Transaction.In { +// uxOuts, err := vs.history.GetUxOuts(tx, []cipher.SHA256{inputID}) +// if err != nil { +// logger.Errorf("GetVerboseTransactionsForAddress: vs.history.GetUxOuts failed: %v", err) +// return err +// } +// if len(uxOuts) == 0 { +// err := fmt.Errorf("uxout of %v does not exist in history db", inputID.Hex()) +// logger.Critical().Error(err) +// return err +// } + +// input, err := NewTransactionInput(uxOuts[0].Out, t) +// if err != nil { +// logger.Errorf("GetVerboseTransactionsForAddress: NewTransactionInput failed: %v", err) +// return err +// } + +// txnInputs[j] = input +// } + +// inputs[i] = txnInputs +// } + +// return nil +// }); err != nil { +// return nil, nil, err +// } + +// return txns, inputs, nil +// } + +// OutputsFilter used as optional arguments in GetUnspentOutputs method +type OutputsFilter func(outputs coin.UxArray) coin.UxArray + +// FbyAddressesNotIncluded filters the unspent outputs that are not owned by the addresses +func FbyAddressesNotIncluded(addrs []cipher.Address) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + addrMatch := coin.UxArray{} + addrMap := newAddrSet(addrs) + + for _, u := range outputs { + if _, ok := addrMap[u.Body.Address]; !ok { + addrMatch = append(addrMatch, u) + } + } + return addrMatch + } +} + +// FbyAddresses filters the unspent outputs that owned by the addresses +func FbyAddresses(addrs []cipher.Address) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + addrMatch := coin.UxArray{} + addrMap := newAddrSet(addrs) + + for _, u := range outputs { + if _, ok := addrMap[u.Body.Address]; ok { + addrMatch = append(addrMatch, u) + } + } + return addrMatch + } +} + +// FbyHashes filters the unspent outputs that have hashes matched. +func FbyHashes(hashes []cipher.SHA256) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + hsMatch := coin.UxArray{} + hsMap := newSHA256Set(hashes) + + for _, u := range outputs { + if _, ok := hsMap[u.Hash()]; ok { + hsMatch = append(hsMatch, u) + } + } + return hsMatch + } +} + +func newAddrSet(keys []cipher.Address) map[cipher.Address]struct{} { + s := make(map[cipher.Address]struct{}, len(keys)) + for _, k := range keys { + s[k] = struct{}{} + } + return s +} + +// newSHA256Set returns a map-based set for string lookup +func newSHA256Set(keys []cipher.SHA256) map[cipher.SHA256]struct{} { + s := make(map[cipher.SHA256]struct{}, len(keys)) + for _, k := range keys { + s[k] = struct{}{} + } + return s +} + +// GetUnspentOutputsSummary gets unspent outputs and returns the filtered results, +// Note: all filters will be executed as the pending sequence in 'AND' mode. +func (vs *Visor) GetUnspentOutputsSummary(filters []OutputsFilter) (*UnspentOutputsSummary, error) { + var confirmedOutputs []coin.UxOut + var outgoingOutputs coin.UxArray + var incomingOutputs coin.UxArray + var head *coin.SignedBlock + + if err := vs.db.View("GetUnspentOutputsSummary", func(tx *dbutil.Tx) error { + var err error + head, err = vs.blockchain.Head(tx) + if err != nil { + return fmt.Errorf("vs.blockchain.Head failed: %v", err) + } + + confirmedOutputs, err = vs.blockchain.Unspent().GetAll(tx) + if err != nil { + return fmt.Errorf("vs.blockchain.Unspent().GetAll failed: %v", err) + } + + outgoingOutputs, err = vs.unconfirmedOutgoingOutputs(tx) + if err != nil { + return fmt.Errorf("vs.unconfirmedOutgoingOutputs failed: %v", err) + } + + incomingOutputs, err = vs.unconfirmedIncomingOutputs(tx) + if err != nil { + return fmt.Errorf("vs.unconfirmedIncomingOutputs failed: %v", err) + } + + return nil + }); err != nil { + return nil, err + } + + for _, flt := range filters { + confirmedOutputs = flt(confirmedOutputs) + outgoingOutputs = flt(outgoingOutputs) + incomingOutputs = flt(incomingOutputs) + } + + confirmed, err := NewUnspentOutputs(confirmedOutputs, head.Time()) + if err != nil { + return nil, err + } + + outgoing, err := NewUnspentOutputs(outgoingOutputs, head.Time()) + if err != nil { + return nil, err + } + + incoming, err := NewUnspentOutputs(incomingOutputs, head.Time()) + if err != nil { + return nil, err + } + + return &UnspentOutputsSummary{ + HeadBlock: head, + Confirmed: confirmed, + Outgoing: outgoing, + Incoming: incoming, + }, nil +} + +// GetRichlist returns a Richlist +func (vs *Visor) GetRichlist(includeDistribution bool) (Richlist, error) { + rbOuts, err := vs.GetUnspentOutputsSummary(nil) + if err != nil { + return nil, err + } + + // Build a map from addresses to total coins held + allAccounts := map[cipher.Address]uint64{} + for _, out := range rbOuts.Confirmed { + if _, ok := allAccounts[out.Body.Address]; ok { + var err error + allAccounts[out.Body.Address], err = mathutil.AddUint64(allAccounts[out.Body.Address], out.Body.Coins) + if err != nil { + return nil, err + } + } else { + allAccounts[out.Body.Address] = out.Body.Coins + } + } + + lockedAddrs := vs.Config.Distribution.LockedAddressesDecoded() + addrsMap := make(map[cipher.Address]struct{}, len(lockedAddrs)) + for _, a := range lockedAddrs { + addrsMap[a] = struct{}{} + } + + richlist, err := NewRichlist(allAccounts, addrsMap) + if err != nil { + return nil, err + } + + if !includeDistribution { + unlockedAddrs := vs.Config.Distribution.UnlockedAddressesDecoded() + for _, a := range unlockedAddrs { + addrsMap[a] = struct{}{} + } + richlist = richlist.FilterAddresses(addrsMap) + } + + return richlist, nil +} + +// WithUpdateTx executes a function inside of a db.Update transaction. +// This is exported for use by the daemon gateway's InjectBroadcastTransaction method. +// Do not use it for other purposes. +func (vs *Visor) WithUpdateTx(name string, f func(tx *dbutil.Tx) error) error { + return vs.db.Update(name, func(tx *dbutil.Tx) error { + return f(tx) + }) +} + +// ScanWalletAddresses scan addresses ahead in a wallet to find addresses with transactions +func (vs *Visor) ScanWalletAddresses(wltID string, password []byte, num uint64) ([]cipher.Address, error) { + return vs.wallets.ScanAddresses(wltID, password, num, vs.tf) +} + +// TransactionsFinder returns a transactions finder +func (vs *Visor) TransactionsFinder() wallet.TransactionsFinder { + return newTransactionsFinder(vs) +} + +// TransactionsFinder implements the wallet.TransactionsFinder interface +type TransactionsFinder struct { + db *dbutil.DB + history Historyer + unconfirmed UnconfirmedTransactionPooler +} + +func newTransactionsFinder(v *Visor) *TransactionsFinder { + return &TransactionsFinder{ + db: v.db, + history: v.history, + unconfirmed: v.unconfirmed, + } +} + +// AddressesActivity implements the methods of wallet.TransactionsFinder interface +func (tf *TransactionsFinder) AddressesActivity(addrs []cipher.Addresser) ([]bool, error) { + if len(addrs) == 0 { + return nil, nil + } + + skyAddrs := make([]cipher.Address, len(addrs)) + // convert to skycoin addresses + for i, a := range addrs { + addr, ok := a.(cipher.Address) + if !ok { + return nil, errors.New("invalid skycoin address") + } + skyAddrs[i] = addr + } + + active := make([]bool, len(addrs)) + addrsMap := make(map[cipher.Address]int, len(addrs)) + for i, a := range skyAddrs { + addrsMap[a] = i + } + + if len(addrsMap) != len(addrs) { + return nil, errors.New("duplicates addresses not allowed") + } + + if err := tf.db.View("AddressActivity", func(tx *dbutil.Tx) error { + // Check if the addresses appear in the blockchain + // scan from the last to first, break once find an address with transactions. + for i := len(skyAddrs) - 1; i >= 0; i-- { + ok, err := tf.history.AddressSeen(tx, skyAddrs[i]) + if err != nil { + return err + } + + if ok { + active[i] = true + break + } + } + + // Check if the addresses appears in the unconfirmed pool + // NOTE: if this needs to be optimized, add an index to the unconfirmed pool + return tf.unconfirmed.ForEach(tx, func(h cipher.SHA256, ut UnconfirmedTransaction) error { + // Only transaction outputs need to be checked; if the address is associated + // with an input, it must have appeared in a transaction in the blockchain history + for _, o := range ut.Transaction.Out { + if i, ok := addrsMap[o.Address]; ok { + active[i] = true + } + } + return nil + }) + }); err != nil { + return nil, err + } + + return active, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/wallet.go b/vendor/github.com/skycoin/skycoin/src/visor/wallet.go new file mode 100644 index 0000000000..a7613161f5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/wallet.go @@ -0,0 +1,615 @@ +package visor + +// This file contains Visor method that require wallet access + +import ( + "errors" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/params" + "github.com/skycoin/skycoin/src/transaction" + "github.com/skycoin/skycoin/src/util/mathutil" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/wallet" + "github.com/skycoin/skycoin/src/wallet/bip44wallet" +) + +// UserError wraps user input-related errors. +// Errors caused by programmer input or internal issues should not use this wrapper. +// Some knowledge of the HTTP API layer may be necessary to decide when to use UserError or not. +type UserError struct { + error +} + +// NewUserError creates an Error +func NewUserError(err error) error { + if err == nil { + return nil + } + return UserError{err} +} + +var ( + // ErrSpendingUnconfirmed is returned if caller attempts to spend unconfirmed outputs + ErrSpendingUnconfirmed = NewUserError(errors.New("Please spend after your pending transaction is confirmed")) + // ErrDuplicateUxOuts UxOuts contains duplicate values + ErrDuplicateUxOuts = NewUserError(errors.New("UxOuts contains duplicate values")) + // ErrIncludesNullAddress Addresses must not contain the null address + ErrIncludesNullAddress = NewUserError(errors.New("Addresses must not contain the null address")) + // ErrDuplicateAddresses Addresses contains duplicate values + ErrDuplicateAddresses = NewUserError(errors.New("Addresses contains duplicate values")) + // ErrCreateTransactionParamsConflict UxOuts and Addresses cannot be combined + ErrCreateTransactionParamsConflict = NewUserError(errors.New("UxOuts and Addresses cannot be combined")) + // ErrTransactionAlreadySigned attempted to sign a transaction that is already fully signed + ErrTransactionAlreadySigned = NewUserError(errors.New("Transaction is already fully signed")) + // ErrUxOutsOrAddressesRequired Both Addresses and UxOuts are empty + ErrUxOutsOrAddressesRequired = NewUserError(errors.New("UxOuts or Addresses must not be empty")) + // ErrNoSpendableOutputs after filtering unconfirmed spend outputs, there are no remaining outputs available for transaction creation + ErrNoSpendableOutputs = NewUserError(errors.New("All selected outputs are unavailable for spending")) +) + +// GetWalletBalance returns balance pairs of specific wallet +func (vs *Visor) GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalances, error) { + var addressBalances wallet.AddressBalances + var walletBalance wallet.BalancePair + var addrsBalanceList []wallet.BalancePair + var addrs []cipher.Address + + if err := vs.wallets.View(wltID, func(w wallet.Wallet) error { + var err error + addrs, err = func() ([]cipher.Address, error) { + addrs, err := w.GetAddresses() + if err != nil { + return nil, err + } + return wallet.SkycoinAddresses(addrs), nil + }() + + addrsBalanceList, err = vs.GetBalanceOfAddresses(addrs) + return err + }); err != nil { + return walletBalance, addressBalances, err + } + + // create map of address to balance + addressBalances = make(wallet.AddressBalances, len(addrs)) + for i, addr := range addrs { + addressBalances[addr.String()] = addrsBalanceList[i] + } + + // compute the sum of all addresses + for _, addrBalance := range addressBalances { + var err error + // compute confirmed balance + walletBalance.Confirmed.Coins, err = mathutil.AddUint64(walletBalance.Confirmed.Coins, addrBalance.Confirmed.Coins) + if err != nil { + return walletBalance, addressBalances, err + } + walletBalance.Confirmed.Hours, err = mathutil.AddUint64(walletBalance.Confirmed.Hours, addrBalance.Confirmed.Hours) + if err != nil { + return walletBalance, addressBalances, err + } + + // compute predicted balance + walletBalance.Predicted.Coins, err = mathutil.AddUint64(walletBalance.Predicted.Coins, addrBalance.Predicted.Coins) + if err != nil { + return walletBalance, addressBalances, err + } + walletBalance.Predicted.Hours, err = mathutil.AddUint64(walletBalance.Predicted.Hours, addrBalance.Predicted.Hours) + if err != nil { + return walletBalance, addressBalances, err + } + } + + return walletBalance, addressBalances, nil +} + +// GetWalletUnconfirmedTransactions returns all unconfirmed transactions in given wallet +func (vs *Visor) GetWalletUnconfirmedTransactions(wltID string) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := vs.wallets.View(wltID, func(w wallet.Wallet) error { + addrs, err := w.GetAddresses() + if err != nil { + return err + } + + txns, err = vs.GetUnconfirmedTransactions(SendsToAddresses(wallet.SkycoinAddresses(addrs))) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetWalletUnconfirmedTransactionsVerbose returns all unconfirmed transactions in given wallet +func (vs *Visor) GetWalletUnconfirmedTransactionsVerbose(wltID string) ([]UnconfirmedTransaction, [][]TransactionInput, error) { + var txns []UnconfirmedTransaction + var inputs [][]TransactionInput + + if err := vs.wallets.View(wltID, func(w wallet.Wallet) error { + addrs, err := func() ([]cipher.Address, error) { + addrs, err := w.GetAddresses() + if err != nil { + return nil, err + } + return wallet.SkycoinAddresses(addrs), nil + }() + if err != nil { + return err + } + + txns, inputs, err = vs.GetUnconfirmedTransactionsVerbose(SendsToAddresses(addrs)) + return err + }); err != nil { + return nil, nil, err + } + + return txns, inputs, nil +} + +// WalletSignTransaction signs a transaction. Specific inputs may be signed by specifying signIndexes. +// If signIndexes is empty, all inputs will be signed. The transaction must be fully valid and spendable. +func (vs *Visor) WalletSignTransaction(wltID string, password []byte, txn *coin.Transaction, signIndexes []int) (*coin.Transaction, []TransactionInput, error) { + var inputs []TransactionInput + var signedTxn *coin.Transaction + + if txn.IsFullySigned() { + return nil, nil, ErrTransactionAlreadySigned + } + + if err := vs.wallets.ViewSecrets(wltID, password, func(w wallet.Wallet) error { + return vs.db.View("WalletSignTransaction", func(tx *dbutil.Tx) error { + // Verify the transaction before signing + if err := transaction.VerifySingleTxnUserConstraints(*txn); err != nil { + return err + } + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.Distribution, params.UserVerifyTxn, transaction.TxnUnsigned); err != nil { + return err + } + + headTime, err := vs.blockchain.Time(tx) + if err != nil { + logger.WithError(err).Error("blockchain.Time failed") + return err + } + + inputs, err = vs.getTransactionInputs(tx, headTime, txn.In) + if err != nil { + return err + } + + uxOuts := make([]coin.UxOut, len(inputs)) + for i, in := range inputs { + uxOuts[i] = in.UxOut + } + + signedTxn, err = wallet.SignTransaction(w, txn, signIndexes, uxOuts) + if err != nil { + logger.WithError(err).Error("wallet.SignTransaction failed") + return err + } + + signed := transaction.TxnSigned + if !signedTxn.IsFullySigned() { + signed = transaction.TxnUnsigned + } + + if err := transaction.VerifySingleTxnUserConstraints(*signedTxn); err != nil { + // This shouldn't happen since we verified in the beginning; if it does, then wallet.SignTransaction has a bug + logger.Critical().WithError(err).Error("Signed transaction violates transaction user constraints") + return err + } + + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *signedTxn, vs.Config.Distribution, params.UserVerifyTxn, signed); err != nil { + // This shouldn't happen since we verified in the beginning; if it does, then wallet.SignTransaction has a bug + logger.Critical().WithError(err).Error("Signed transaction violates transaction constraints") + return err + } + + return nil + }) + }); err != nil { + return nil, nil, err + } + + return signedTxn, inputs, nil +} + +// CreateTransactionParams parameters for transaction creation +type CreateTransactionParams struct { + UxOuts []cipher.SHA256 + Addresses []cipher.Address + // IgnoreUnconfirmed if true, outputs matching Addresses or UxOuts spent by + // an unconfirmed transactions will be ignored, otherwise an error will be returned + IgnoreUnconfirmed bool +} + +// Validate validates params +func (p CreateTransactionParams) Validate() error { + if len(p.UxOuts) != 0 && len(p.Addresses) != 0 { + return ErrCreateTransactionParamsConflict + } + + // Check for duplicate addresses + addressMap := make(map[cipher.Address]struct{}, len(p.Addresses)) + for _, a := range p.Addresses { + if a.Null() { + return ErrIncludesNullAddress + } + + if _, ok := addressMap[a]; ok { + return ErrDuplicateAddresses + } + + addressMap[a] = struct{}{} + } + + // Check for duplicate spending uxouts + uxOuts := make(map[cipher.SHA256]struct{}, len(p.UxOuts)) + for _, o := range p.UxOuts { + if _, ok := uxOuts[o]; ok { + return ErrDuplicateUxOuts + } + uxOuts[o] = struct{}{} + } + + return nil +} + +// WalletCreateTransactionSigned creates a signed transaction based upon the parameters in CreateTransactionParams +func (vs *Visor) WalletCreateTransactionSigned(wltID string, password []byte, p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []TransactionInput, error) { + // Validate params before unlocking wallet + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + + var txn *coin.Transaction + var inputs []TransactionInput + w, err := vs.wallets.GetWallet(wltID) + if err != nil { + return nil, nil, err + } + + if p.ChangeAddress == nil && w.Type() == wallet.WalletTypeBip44 { + // TODO: Maybe add the `PeekChangeAddress` to wallet.Wallet interface, and + // only bip44 wallet will implement it, all others do nothing. In this way + // we don't have to explicitly check the wallet type here. + // + // For bip44 wallet, peek a change address if p.ChangeAddress is nill + if err := vs.wallets.Update(wltID, func(w wallet.Wallet) error { + addr, err := w.(*bip44wallet.Wallet).PeekChangeAddress(vs.tf) + if err != nil { + logger.Critical().WithError(err).Error("PeekChangeAddress failed") + return err + } + skyAddr := addr.(cipher.Address) + p.ChangeAddress = &skyAddr + return nil + }); err != nil { + return nil, nil, err + } + } + + if err := vs.wallets.ViewSecrets(wltID, password, func(w wallet.Wallet) error { + var err error + txn, inputs, err = vs.walletCreateTransaction("WalletCreateTransactionSigned", w, p, wp, transaction.TxnSigned) + return err + }); err != nil { + return nil, nil, err + } + + return txn, inputs, nil +} + +// WalletCreateTransaction creates a transaction based upon the parameters in CreateTransactionParams +// TODO: Only referenced by tests, vs.walletCreateTransaction +func (vs *Visor) WalletCreateTransaction(wltID string, p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []TransactionInput, error) { + // Validate params before opening wallet + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + + var txn *coin.Transaction + var inputs []TransactionInput + + if err := vs.wallets.Update(wltID, func(w wallet.Wallet) error { + if p.ChangeAddress == nil && w.Type() == wallet.WalletTypeBip44 { + // TODO: Maybe add the `PeekChangeAddress` to wallet.Wallet interface, and + // only bip44 wallet will implement it, all others do nothing. In this way + // we don't have to explicitly check the wallet type here. + // + // For bip44 wallet, peek a change address if p.ChangeAddress is nill + addr, err := w.(*bip44wallet.Wallet).PeekChangeAddress(vs.tf) + if err != nil { + logger.Critical().WithError(err).Error("PeekChangeAddress failed") + return err + } + skyAddr := addr.(cipher.Address) + p.ChangeAddress = &skyAddr + } + + var err error + txn, inputs, err = vs.walletCreateTransaction("WalletCreateTransaction", w, p, wp, transaction.TxnUnsigned) + return err + }); err != nil { + return nil, nil, err + } + + return txn, inputs, nil +} + +func (vs *Visor) walletCreateTransaction(methodName string, w wallet.Wallet, p transaction.Params, wp CreateTransactionParams, signed transaction.TxnSignedFlag) (*coin.Transaction, []TransactionInput, error) { + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + + // Get all addresses from the wallet for checking params against + walletAddresses, err := func() ([]cipher.Address, error) { + addrs, err := w.GetAddresses() + if err != nil { + return nil, err + } + return wallet.SkycoinAddresses(addrs), nil + }() + if err != nil { + return nil, nil, err + } + + walletAddressesMap := make(map[cipher.Address]struct{}, len(walletAddresses)) + for _, a := range walletAddresses { + walletAddressesMap[a] = struct{}{} + } + + addrs := wp.Addresses + if len(addrs) == 0 { + // Use all wallet addresses if no addresses or uxouts specified + addrs = walletAddresses + } else { + // Check that requested addresses are in the wallet + for _, a := range addrs { + if _, ok := walletAddressesMap[a]; !ok { + return nil, nil, wallet.ErrUnknownAddress + } + } + } + + var txn *coin.Transaction + var uxb []transaction.UxBalance + + if err := vs.db.View(methodName, func(tx *dbutil.Tx) error { + var err error + txn, uxb, err = vs.walletCreateTransactionTx(tx, methodName, w, p, wp, signed, addrs, walletAddressesMap) + return err + }); err != nil { + return nil, nil, err + } + + inputs := NewTransactionInputsFromUxBalance(uxb) + + return txn, inputs, nil +} + +func (vs *Visor) walletCreateTransactionTx(tx *dbutil.Tx, methodName string, + w wallet.Wallet, p transaction.Params, wp CreateTransactionParams, signed transaction.TxnSignedFlag, + addrs []cipher.Address, walletAddressesMap map[cipher.Address]struct{}) (*coin.Transaction, []transaction.UxBalance, error) { + // Note: assumes inputs have already been validated by walletCreateTransaction + + head, err := vs.blockchain.Head(tx) + if err != nil { + logger.WithError(err).Error("blockchain.Head failed") + return nil, nil, err + } + + // Get mapping of addresses to uxOuts based upon CreateTransactionParams + var auxs coin.AddressUxOuts + if len(wp.UxOuts) != 0 { + var err error + auxs, err = vs.getCreateTransactionAuxsUxOut(tx, wp.UxOuts, wp.IgnoreUnconfirmed) + if err != nil { + return nil, nil, err + } + + // Check that UxOut addresses are in the wallet, + for a := range auxs { + if _, ok := walletAddressesMap[a]; !ok { + return nil, nil, wallet.ErrUnknownUxOut + } + } + } else { + var err error + auxs, err = vs.getCreateTransactionAuxsAddress(tx, addrs, wp.IgnoreUnconfirmed) + if err != nil { + return nil, nil, err + } + } + + // Create and sign transaction + var txn *coin.Transaction + var uxb []transaction.UxBalance + + switch signed { + case transaction.TxnSigned: + txn, uxb, err = wallet.CreateTransactionSigned(w, p, auxs, head.Time()) + case transaction.TxnUnsigned: + txn, uxb, err = wallet.CreateTransaction(w, p, auxs, head.Time()) + default: + logger.Panic("Invalid TxnSignedFlag") + } + if err != nil { + logger.Critical().WithError(err).Errorf("%s failed", methodName) + return nil, nil, err + } + + if err := transaction.VerifySingleTxnUserConstraints(*txn); err != nil { + logger.WithError(err).Error("Created transaction violates transaction user constraints") + return nil, nil, err + } + + // The wallet can create transactions that would not pass all validation, such as the decimal restriction, + // because the wallet is not aware of visor-level constraints. + // Check that the transaction is valid before returning it to the caller. + // TODO -- decimal restriction was moved to params/ package so the wallet can verify now. Move visor/verify to new package? + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.Distribution, params.UserVerifyTxn, signed); err != nil { + logger.WithError(err).Error("Created transaction violates transaction soft/hard constraints") + return nil, nil, err + } + + return txn, uxb, nil +} + +// CreateTransaction creates an unsigned transaction from requested coin.UxOut hashes +func (vs *Visor) CreateTransaction(p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []TransactionInput, error) { + // Validate parameters before starting database transaction + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + if len(wp.Addresses) == 0 && len(wp.UxOuts) == 0 { + return nil, nil, ErrUxOutsOrAddressesRequired + } + + var txn *coin.Transaction + var uxb []transaction.UxBalance + + if err := vs.db.View("CreateTransaction", func(tx *dbutil.Tx) error { + var err error + txn, uxb, err = vs.createTransactionTx(tx, p, wp) + return err + }); err != nil { + return nil, nil, err + } + + inputs := NewTransactionInputsFromUxBalance(uxb) + + return txn, inputs, nil +} + +func (vs *Visor) createTransactionTx(tx *dbutil.Tx, p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []transaction.UxBalance, error) { + // Note: assumes inputs have already been validated by walletCreateTransaction + head, err := vs.blockchain.Head(tx) + if err != nil { + logger.WithError(err).Error("blockchain.Head failed") + return nil, nil, err + } + + // Get mapping of addresses to uxOuts based upon CreateTransactionParams + var auxs coin.AddressUxOuts + if len(wp.UxOuts) != 0 { + auxs, err = vs.getCreateTransactionAuxsUxOut(tx, wp.UxOuts, wp.IgnoreUnconfirmed) + } else { + auxs, err = vs.getCreateTransactionAuxsAddress(tx, wp.Addresses, wp.IgnoreUnconfirmed) + } + if err != nil { + return nil, nil, err + } + + txn, uxb, err := transaction.Create(p, auxs, head.Time()) + if err != nil { + return nil, nil, err + } + + if err := transaction.VerifySingleTxnUserConstraints(*txn); err != nil { + logger.WithError(err).Error("Created transaction violates transaction user constraints") + return nil, nil, err + } + + // The wallet can create transactions that would not pass all validation, such as the decimal restriction, + // because the wallet is not aware of visor-level constraints. + // Check that the transaction is valid before returning it to the caller. + // TODO -- decimal restriction was moved to params/ package so the wallet can verify now. Move visor/verify to new package? + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.Distribution, params.UserVerifyTxn, transaction.TxnUnsigned); err != nil { + logger.WithError(err).Error("Created transaction violates transaction soft/hard constraints") + return nil, nil, err + } + + return txn, uxb, nil +} + +// getCreateTransactionAuxsUxOut returns a map of addresses to their unspent outputs, +// given a list of unspent output hashes. +// If ignoreUnconfirmed is true, outputs being spent by unconfirmed transactions are ignored and excluded from the return value. +// If ignoreUnconfirmed is false, an error is return if any of the specified unspent outputs are spent by an unconfirmed transaction. +func (vs *Visor) getCreateTransactionAuxsUxOut(tx *dbutil.Tx, uxOutHashes []cipher.SHA256, ignoreUnconfirmed bool) (coin.AddressUxOuts, error) { + hashesMap := make(map[cipher.SHA256]struct{}, len(uxOutHashes)) + for _, h := range uxOutHashes { + hashesMap[h] = struct{}{} + } + + // Check if any of the outputs are spent by an unconfirmed transaction + unconfirmedHashesMap := make(map[cipher.SHA256]struct{}) + if err := vs.unconfirmed.ForEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + for _, h := range txn.Transaction.In { + if _, ok := hashesMap[h]; ok { + if !ignoreUnconfirmed { + return ErrSpendingUnconfirmed + } + unconfirmedHashesMap[h] = struct{}{} + } + } + return nil + }); err != nil { + return nil, err + } + + if !ignoreUnconfirmed && len(unconfirmedHashesMap) != 0 { + logger.Panic("ignoreUnconfirmed is false but unconfirmedHashesMap is not empty") + } + + // Filter unconfirmed spends + if len(unconfirmedHashesMap) != 0 { + filteredUxOutHashes := uxOutHashes[:0] + for _, h := range uxOutHashes { + if _, ok := unconfirmedHashesMap[h]; ok { + delete(hashesMap, h) + } else { + filteredUxOutHashes = append(filteredUxOutHashes, h) + } + } + uxOutHashes = filteredUxOutHashes + } + + if len(uxOutHashes) == 0 { + return nil, ErrNoSpendableOutputs + } + + // Retrieve the uxouts from the pool. + // An error is returned if any do not exist + uxOuts, err := vs.blockchain.Unspent().GetArray(tx, uxOutHashes) + if err != nil { + return nil, err + } + + // Build coin.AddressUxOuts map + return coin.NewAddressUxOuts(uxOuts), nil +} + +// getCreateTransactionAuxsAddress returns a map of the addresses to their unspent outputs, +// filtering or erroring on unconfirmed outputs depending on the value of ignoreUnconfirmed +func (vs *Visor) getCreateTransactionAuxsAddress(tx *dbutil.Tx, addrs []cipher.Address, ignoreUnconfirmed bool) (coin.AddressUxOuts, error) { + // Get all address unspent hashes + addrHashes, err := vs.blockchain.Unspent().GetUnspentHashesOfAddrs(tx, addrs) + if err != nil { + return nil, err + } + + hashes := addrHashes.Flatten() + if len(hashes) == 0 { + return nil, transaction.ErrNoUnspents + } + + return vs.getCreateTransactionAuxsUxOut(tx, hashes, ignoreUnconfirmed) +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/balance.go b/vendor/github.com/skycoin/skycoin/src/wallet/balance.go new file mode 100644 index 0000000000..6066f983a3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/balance.go @@ -0,0 +1,87 @@ +package wallet + +import ( + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/mathutil" +) + +/* +Do not show balances or outputs that have not cleared yet +- should only allow spends against outputs that are on head +*/ + +// BalancePair records the confirmed and predicted balance of an address +type BalancePair struct { + Confirmed Balance + Predicted Balance +} + +// AddressBalances represents a map of address balances +type AddressBalances map[string]BalancePair + +// Balance has coins and hours +type Balance struct { + Coins uint64 + Hours uint64 +} + +// NewBalance creates balance +func NewBalance(coins, hours uint64) Balance { + return Balance{ + Coins: coins, + Hours: hours, + } +} + +// NewBalanceFromUxOut creates Balance from UxOut +func NewBalanceFromUxOut(headTime uint64, ux *coin.UxOut) (Balance, error) { + hours, err := ux.CoinHours(headTime) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: ux.Body.Coins, + Hours: hours, + }, nil +} + +// Add adds two Balances +func (bal Balance) Add(other Balance) (Balance, error) { + coins, err := mathutil.AddUint64(bal.Coins, other.Coins) + if err != nil { + return Balance{}, err + } + + hours, err := mathutil.AddUint64(bal.Hours, other.Hours) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: coins, + Hours: hours, + }, nil +} + +// Sub subtracts other from self and returns the new Balance. Will panic if +// other is greater than balance, because Coins and Hours are unsigned. +func (bal Balance) Sub(other Balance) Balance { + if other.Coins > bal.Coins || other.Hours > bal.Hours { + logger.Panic("Cannot subtract balances, second balance is too large") + } + return Balance{ + Coins: bal.Coins - other.Coins, + Hours: bal.Hours - other.Hours, + } +} + +// Equals compares two Balances +func (bal Balance) Equals(other Balance) bool { + return bal.Coins == other.Coins && bal.Hours == other.Hours +} + +// IsZero returns true if the Balance is empty (both coins and hours) +func (bal Balance) IsZero() bool { + return bal.Coins == 0 && bal.Hours == 0 +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/account.go b/vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/account.go new file mode 100644 index 0000000000..e581e43be4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/account.go @@ -0,0 +1,544 @@ +package bip44wallet + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/bip32" + "github.com/skycoin/skycoin/src/cipher/bip39" + "github.com/skycoin/skycoin/src/cipher/bip44" + "github.com/skycoin/skycoin/src/util/mathutil" + "github.com/skycoin/skycoin/src/wallet" +) + +const ( + secretBip44AccountPrivateKey = "bip44AccountPrivateKey" +) + +// bip44Account records the bip44 wallet account info +type bip44Account struct { + bip44.Account + Name string // Account name + Index uint32 // Account index + CoinType wallet.CoinType // Account coin type, determins the way to generate addresses + Chains []bip44Chain // Chains, external chain with index value of 0, and internal(change) chain with index value of 1. +} + +type bip44AccountCreateOptions struct { + name string + index uint32 + seed string + seedPassphrase string + coinType wallet.CoinType + bip44CoinType *bip44.CoinType +} + +func newBip44Account(opts bip44AccountCreateOptions) (*bip44Account, error) { + // opts.seed must return a valid bip39 mnemonic + seed, err := bip39.NewSeed(opts.seed, opts.seedPassphrase) + if err != nil { + return nil, err + } + + if opts.bip44CoinType == nil { + return nil, errors.New("newBip44Account missing bip44 coin type") + } + + c, err := bip44.NewCoin(seed, *opts.bip44CoinType) + if err != nil { + logger.Critical().WithError(err).Error("Failed to derive the bip44 purpose node") + if bip32.IsImpossibleChildError(err) { + logger.Critical().Error("ImpossibleChild: this seed cannot be used for bip44") + } + return nil, err + } + a, err := c.Account(opts.index) + if err != nil { + return nil, err + } + + externalChainKey, changeChainKey, err := makeChainPubKeys(a) + if err != nil { + return nil, err + } + + ba := &bip44Account{ + Account: *a, + Name: opts.name, + Index: opts.index, + CoinType: opts.coinType, + } + + // init the external chain + ba.Chains = append(ba.Chains, bip44Chain{ + PubKey: *externalChainKey, + ChainIndex: bip44.ExternalChainIndex, + }) + // init the change chain + ba.Chains = append(ba.Chains, bip44Chain{ + PubKey: *changeChainKey, + ChainIndex: bip44.ChangeChainIndex, + }) + return ba, nil +} + +func (a *bip44Account) newAddresses(chainIndex, num uint32) ([]cipher.Addresser, error) { + // chain index can only be 0 or 1. + switch chainIndex { + case bip44.ExternalChainIndex, bip44.ChangeChainIndex: + ad := wallet.ResolveAddressDecoder(a.CoinType) + return a.Chains[chainIndex].newAddresses(num, a.PrivateKey, ad.AddressFromPubKey) + default: + return nil, fmt.Errorf("invalid chain index: %d", chainIndex) + } +} + +// erase wipes sensitive data +func (a *bip44Account) erase() { + if a.Account.PrivateKey != nil { + for i := range a.Account.Key { + a.Account.Key[i] = 0 + } + a.Account.PrivateKey = nil + a.Account = bip44.Account{} + } + + for i := range a.Chains { + a.Chains[i].erase() + } +} + +// syncSecrets ensure that the secrets covers all addresses in the account, +// otherwise, generate related secrets and pack to the secrets storage. +func (a *bip44Account) syncSecrets(ss wallet.Secrets) error { + v, ok := ss.Get(a.accountKeyName()) + if !ok { + return errors.New("account private key does not exist in secrets") + } + + key, err := bip32.DeserializeEncodedPrivateKey(v) + if err != nil { + return err + } + + for _, c := range a.Chains { + if err := c.syncSecrets(ss, key); err != nil { + return err + } + } + + return nil +} + +func (a *bip44Account) dropLastEntriesN(chain, n uint32) error { + switch chain { + case bip44.ExternalChainIndex, bip44.ChangeChainIndex: + return a.Chains[chain].dropLastEntriesN(n) + default: + return fmt.Errorf("invalid chain index %d", chain) + } +} + +func secretFromPrivateKey(privateKey *bip32.PrivateKey, chain, index uint32) (cipher.SecKey, error) { + chainSecKey, err := privateKey.NewPrivateChildKey(chain) + if err != nil { + return cipher.SecKey{}, err + } + + k, err := chainSecKey.NewPrivateChildKey(index) + if err != nil { + return cipher.SecKey{}, err + } + + return cipher.NewSecKey(k.Key) +} + +func (a *bip44Account) accountKeyName() string { + return fmt.Sprintf("%s-%d", secretBip44AccountPrivateKey, a.Index) +} + +// packSecrets packs the secrets of secrets into Secrets +func (a *bip44Account) packSecrets(ss wallet.Secrets) { + if a.Account.PrivateKey != nil { + // packs the account private key. + ss.Set(a.accountKeyName(), a.Account.String()) + } + + // packs the secrets in chains + for _, c := range a.Chains { + c.packSecrets(ss) + } +} + +func (a *bip44Account) unpackSecrets(ss wallet.Secrets) error { + prvKey, ok := ss.Get(a.accountKeyName()) + if !ok { + return errors.New("missing bip44 account private key when unpacking secrets") + } + + key, err := bip32.DeserializeEncodedPrivateKey(prvKey) + if err != nil { + return err + } + + a.Account.PrivateKey = key + + for i := range a.Chains { + if err := a.Chains[i].unpackSecrets(ss); err != nil { + return err + } + } + return nil +} + +func (a bip44Account) entries(chain uint32) (wallet.Entries, error) { + switch chain { + case bip44.ExternalChainIndex, bip44.ChangeChainIndex: + es := a.Chains[chain].Entries.Clone() + for i := range es { + es[i].Change = chain + } + return es, nil + default: + return nil, fmt.Errorf("invalid chain index: %d", chain) + } +} + +func (a bip44Account) entriesLen(chain uint32) (uint32, error) { + switch chain { + case bip44.ExternalChainIndex, bip44.ChangeChainIndex: + return uint32(len(a.Chains[chain].Entries)), nil + default: + return 0, fmt.Errorf("invalid chain index: %d", chain) + } +} + +func (a bip44Account) entryAt(chain, i uint32) (wallet.Entry, error) { + switch chain { + case bip44.ExternalChainIndex, bip44.ChangeChainIndex: + if i >= uint32(len(a.Chains[chain].Entries)) { + return wallet.Entry{}, fmt.Errorf("entry index %d out of range", i) + } + return a.Chains[chain].Entries[i], nil + default: + return wallet.Entry{}, fmt.Errorf("invalid chain index: %d", chain) + } +} + +func (a bip44Account) getEntry(address cipher.Addresser) (wallet.Entry, bool) { + for _, c := range a.Chains { + for _, e := range c.Entries { + if e.Address == address { + return e, true + } + } + } + + return wallet.Entry{}, false +} + +// Clone clones the bip44Account, it would also hide the +// bip44.Account.Clone() function so that user would not +// call it mistakenly. +func (a bip44Account) Clone() bip44Account { + na := bip44Account{ + Account: a.Account.Clone(), + Name: a.Name, + Index: a.Index, + CoinType: a.CoinType, + } + + na.Chains = make([]bip44Chain, len(a.Chains)) + for i, c := range a.Chains { + cc := c.clone() + na.Chains[i] = cc + } + return na +} + +// reset resets all entries +func (a *bip44Account) reset() { + for i := range a.Chains { + a.Chains[i].Entries = wallet.Entries{} + } +} + +// bip44Chain bip44 address chain +type bip44Chain struct { + PubKey bip32.PublicKey + Entries wallet.Entries + ChainIndex uint32 +} + +// newAddresses generates addresses on the chain. +// private key is optional, if not provided, addresses will be generated using the public key. +func (c *bip44Chain) newAddresses(num uint32, seckey *bip32.PrivateKey, addressFromPubKey func(key cipher.PubKey) cipher.Addresser) ([]cipher.Addresser, error) { + if c == nil { + return nil, errors.New("can not generate new addresses on nil chain") + } + + var addrs []cipher.Addresser + initLen := uint32(len(c.Entries)) + _, err := mathutil.AddUint32(initLen, num) + if err != nil { + return nil, fmt.Errorf("can not create %d more addresses, current addresses number %d, err: %v", num, initLen, err) + } + + for i := uint32(0); i < num; i++ { + index := initLen + i + pk, err := c.PubKey.NewPublicChildKey(index) + if err != nil { + return nil, fmt.Errorf("bip44 chain generate address with index %d failed, err: %v", index, err) + } + cpk, err := cipher.NewPubKey(pk.Key) + if err != nil { + return nil, err + } + + addr := addressFromPubKey(cpk) + e := wallet.Entry{ + Address: addr, + Public: cpk, + ChildNumber: index, + } + + if seckey != nil { + k, err := secretFromPrivateKey(seckey, c.ChainIndex, index) + if err != nil { + return nil, err + } + e.Secret = k + } + + c.Entries = append(c.Entries, e) + addrs = append(addrs, addr) + } + return addrs, nil +} + +func (c *bip44Chain) syncSecrets(ss wallet.Secrets, privateKey *bip32.PrivateKey) error { + for i, e := range c.Entries { + addr := e.Address.String() + if _, ok := ss.Get(addr); !ok { + k, err := secretFromPrivateKey(privateKey, c.ChainIndex, uint32(i)) + if err != nil { + return err + } + ss.Set(addr, k.Hex()) + } + } + return nil +} + +func (c *bip44Chain) packSecrets(ss wallet.Secrets) { + for _, e := range c.Entries { + ss.Set(e.Address.String(), e.Secret.Hex()) + } +} + +func (c *bip44Chain) unpackSecrets(ss wallet.Secrets) error { + return c.Entries.UnpackSecretKeys(ss) +} + +func (c *bip44Chain) erase() { + c.Entries.Erase() +} + +func (c bip44Chain) clone() bip44Chain { + return bip44Chain{ + PubKey: c.PubKey.Clone(), + ChainIndex: c.ChainIndex, + Entries: c.Entries.Clone(), + } +} + +func (c *bip44Chain) dropLastEntriesN(n uint32) error { + l := uint32(len(c.Entries)) + if n > l { + return errors.New("bip44Chain.dropLastEntriesN param 'n' is out of range") + } + + c.Entries = c.Entries[:l-n] + return nil +} + +// bip44Accounts implements the accountManager interface +type bip44Accounts struct { + accounts []*bip44Account +} + +func (a bip44Accounts) len() uint32 { + return uint32(len(a.accounts)) +} + +func (a *bip44Accounts) newAddresses(account, chain, num uint32) ([]cipher.Addresser, error) { + act, err := a.account(account) + if err != nil { + return nil, err + } + + return act.newAddresses(chain, num) +} + +// account returns the pinter of the account by index, +// this should not be used outside the accounts management in case of +// unsafe behaviour. +func (a bip44Accounts) account(index uint32) (*bip44Account, error) { + accountLen := len(a.accounts) + if int(index) >= accountLen { + return nil, fmt.Errorf("account index %d out of range", index) + } + + act := a.accounts[index] + if act == nil { + return nil, fmt.Errorf("account of index %d not found", index) + } + + return act, nil +} + +// new creates a bip44 account with options. +// Notice: the option.index won't be applied, the bip44Accounts manages +// the index and will generate a index for the new account. +func (a *bip44Accounts) new(opts bip44AccountCreateOptions) (uint32, error) { + accountIndex, err := a.nextIndex() + if err != nil { + return 0, err + } + + // assign the account index + opts.index = accountIndex + + // create a bip44 account + ba, err := newBip44Account(opts) + if err != nil { + return 0, err + } + + a.accounts = append(a.accounts, ba) + return accountIndex, nil +} + +func (a *bip44Accounts) nextIndex() (uint32, error) { + // Try to get next account index, return error if the + // account is full. + if _, err := mathutil.AddUint32(uint32(len(a.accounts)), 1); err != nil { + return 0, errors.New("maximum bip44 account number reached") + } + + return uint32(len(a.accounts)), nil +} + +func (a bip44Accounts) clone() accountManager { + nas := &bip44Accounts{} + for i := range a.accounts { + na := a.accounts[i].Clone() + nas.accounts = append(nas.accounts, &na) + } + return nas +} + +func (a *bip44Accounts) packSecrets(ss wallet.Secrets) { + for i := range a.accounts { + a.accounts[i].packSecrets(ss) + } +} + +func (a *bip44Accounts) unpackSecrets(ss wallet.Secrets) error { + for i := range a.accounts { + if err := a.accounts[i].unpackSecrets(ss); err != nil { + return err + } + } + return nil +} + +func (a *bip44Accounts) erase() { + for i := range a.accounts { + a.accounts[i].erase() + } +} + +func (a bip44Accounts) entries(account, chain uint32) (wallet.Entries, error) { + act, err := a.account(account) + if err != nil { + return nil, err + } + + switch chain { + case bip44.ExternalChainIndex, bip44.ChangeChainIndex: + return act.entries(chain) + default: + return nil, fmt.Errorf("invalid chain index: %d", chain) + } +} + +func (a bip44Accounts) entriesLen(account, chain uint32) (uint32, error) { + if len(a.accounts) == 0 { + return 0, nil + } + + act, err := a.account(account) + if err != nil { + return 0, err + } + + switch chain { + case bip44.ExternalChainIndex, bip44.ChangeChainIndex: + return act.entriesLen(chain) + default: + return 0, fmt.Errorf("invalid chain index: %d", chain) + } +} + +func (a bip44Accounts) entryAt(account, chain, i uint32) (wallet.Entry, error) { + act, err := a.account(account) + if err != nil { + return wallet.Entry{}, err + } + + switch chain { + case bip44.ExternalChainIndex, bip44.ChangeChainIndex: + return act.entryAt(chain, i) + default: + return wallet.Entry{}, fmt.Errorf("invalid chain index: %d", chain) + } +} + +func (a bip44Accounts) getEntry(account uint32, address cipher.Addresser) (wallet.Entry, bool, error) { + act, err := a.account(account) + if err != nil { + return wallet.Entry{}, false, err + } + + e, ok := act.getEntry(address) + return e, ok, nil +} + +func (a *bip44Accounts) syncSecrets(ss wallet.Secrets) error { + for _, act := range a.accounts { + if err := act.syncSecrets(ss); err != nil { + return err + } + } + return nil +} + +func (a bip44Accounts) all() []wallet.Bip44Account { + as := make([]wallet.Bip44Account, len(a.accounts)) + for i, act := range a.accounts { + as[i] = wallet.Bip44Account{ + Name: act.Name, + Index: act.Index, + } + } + return as +} + +// rest resets all the entries +func (a *bip44Accounts) reset() { + for _, act := range a.accounts { + act.reset() + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/decoder.go b/vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/decoder.go new file mode 100644 index 0000000000..4f2cb05675 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/decoder.go @@ -0,0 +1,268 @@ +package bip44wallet + +import ( + "encoding/json" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/bip32" + "github.com/skycoin/skycoin/src/cipher/bip44" + "github.com/skycoin/skycoin/src/wallet" +) + +const metaAccountsHash = "metaAccountsHash" + +// JSONDecoder implements the Decoder interface, +// which provides methods for encoding and decoding a bip44 wallet in JSON format. +type JSONDecoder struct{} + +// Encode encodes the bip44 wallet to []byte, and error, if any. +func (d JSONDecoder) Encode(w wallet.Wallet) ([]byte, error) { + rw, err := newReadableBip44WalletNew(w.(*Wallet)) + if err != nil { + return nil, err + } + return json.MarshalIndent(rw, "", " ") +} + +// Decode decodes the []byte to a bip44 wallet. +func (d JSONDecoder) Decode(b []byte) (wallet.Wallet, error) { + var rw readableBip44WalletNew + if err := json.Unmarshal(b, &rw); err != nil { + return nil, err + } + + return rw.toWallet() +} + +// readableBip44WalletNew readable bip44 wallet +// there will have an `accountsHash` in the meta info, which indicates the hash +// of the accounts. It is used for verifying the integrity of the wallet accounts, +// so that the wallet won't break after user edit the wallet file mistakenly. +type readableBip44WalletNew struct { + wallet.Meta `json:"meta"` + Accounts readableBip44Accounts `json:"accounts"` +} + +// newReadableBip44WalletNew creates a readable bip44 wallet +func newReadableBip44WalletNew(w *Wallet) (*readableBip44WalletNew, error) { + ra, err := newReadableBip44Accounts(w.accountManager.(*bip44Accounts)) + if err != nil { + return nil, err + } + + return &readableBip44WalletNew{ + Meta: w.Meta.Clone(), + Accounts: *ra, + }, nil +} + +// toWallet converts the readable bip44 wallet to a bip44 wallet +func (rw readableBip44WalletNew) toWallet() (*Wallet, error) { + // resolve the coin adapter base on coin type + d := wallet.ResolveAddressSecKeyDecoder(rw.Coin()) + + accounts, err := rw.Accounts.toBip44Accounts(d) + if err != nil { + return nil, err + } + + return &Wallet{ + Meta: rw.Meta.Clone(), + accountManager: accounts, + decoder: &JSONDecoder{}, + }, nil +} + +// readableBip44Accounts is the JSON representation of accounts +type readableBip44Accounts []*readableBip44Account + +// ToBip44Accounts converts readable bip44 accounts to bip44 accounts +func (ras readableBip44Accounts) toBip44Accounts(d wallet.AddressSecKeyDecoder) (*bip44Accounts, error) { + as := bip44Accounts{} + for _, ra := range ras { + a := bip44Account{ + Name: ra.Name, + Index: ra.Index, + CoinType: wallet.CoinType(ra.CoinType), + } + + // decode private key if not empty + if ra.PrivateKey != "" { + key, err := bip32.DeserializeEncodedPrivateKey(ra.PrivateKey) + if err != nil { + return nil, err + } + a.PrivateKey = key + } + + for _, rc := range ra.Chains { + c, err := rc.toBip44Chain(d) + if err != nil { + return nil, err + } + a.Chains = append(a.Chains, *c) + } + + as.accounts = append(as.accounts, &a) + } + + return &as, nil +} + +// ReadableBip44Account is the JSON representation of account +type readableBip44Account struct { + PrivateKey string `json:"private_key,omitempty"` + Name string `json:"name"` // Account name + Index uint32 `json:"index"` // Account index + CoinType string `json:"coin_type"` // Account coin type, determins the way to generate addresses + Chains []readableBip44Chain `json:"chains"` // Chains, external chain with index value of 0, and internal(change) chain with index value of 1. +} + +// ReadableBip44Chain bip44 chain with JSON tags +type readableBip44Chain struct { + PubKey string `json:"public_key"` + Chain string `json:"chain"` + Entries []readableBip44Entry `json:"entries"` +} + +func (rc readableBip44Chain) toBip44Chain(d wallet.AddressSecKeyDecoder) (*bip44Chain, error) { + pubkey, err := bip32.DeserializeEncodedPublicKey(rc.PubKey) + if err != nil { + return nil, err + } + + ci, err := stringToChainIndex(rc.Chain) + if err != nil { + return nil, err + } + + c := bip44Chain{ + PubKey: *pubkey, + ChainIndex: uint32(ci), + } + + for _, re := range rc.Entries { + e, err := newBip44EntryFromReadable(re, d) + if err != nil { + return nil, err + } + c.Entries = append(c.Entries, *e) + } + return &c, nil +} + +func chainIndexToString(index uint32) (string, error) { + switch index { + case bip44.ExternalChainIndex: + return "external", nil + case bip44.ChangeChainIndex: + return "change", nil + default: + return "", fmt.Errorf("Invalid bip44 chain index: %d", index) + } +} + +func stringToChainIndex(s string) (int, error) { + switch s { + case "external": + return int(bip44.ExternalChainIndex), nil + case "change": + return int(bip44.ChangeChainIndex), nil + default: + return -1, fmt.Errorf("Invalid bip44 chain: %s", s) + } +} + +func newBip44EntryFromReadable(re readableBip44Entry, d wallet.AddressSecKeyDecoder) (*wallet.Entry, error) { + addr, err := d.DecodeBase58Address(re.Address) + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(re.Public) + if err != nil { + return nil, err + } + + var secKey cipher.SecKey + if re.Secret != "" { + var err error + secKey, err = d.SecKeyFromHex(re.Secret) + if err != nil { + return nil, err + } + } + + return &wallet.Entry{ + Address: addr, + Public: p, + Secret: secKey, + ChildNumber: re.ChildNumber, + }, nil +} + +// ReadableBip44Entry bip44 entry with JSON tags +type readableBip44Entry struct { + Address string `json:"address"` + Public string `json:"public"` + Secret string `json:"secret"` + ChildNumber uint32 `json:"child_number"` // For bip32/bip44 +} + +// newReadableBip44Accounts converts bip44Accounts to ReadableBip44Accounts +func newReadableBip44Accounts(as *bip44Accounts) (*readableBip44Accounts, error) { + var ras readableBip44Accounts + for _, a := range as.accounts { + d := wallet.ResolveSecKeyDecoder(a.CoinType) + + rc, err := newReadableBip44Chains(a.Chains, d) + if err != nil { + return nil, err + } + var privateKey string + if a.Account.PrivateKey != nil { + privateKey = a.Account.String() + } + ras = append(ras, &readableBip44Account{ + PrivateKey: privateKey, + Name: a.Name, + Index: a.Index, + CoinType: string(a.CoinType), + Chains: rc, + }) + } + + return &ras, nil +} + +func newReadableBip44Chains(cs []bip44Chain, d wallet.SecKeyDecoder) ([]readableBip44Chain, error) { + var rcs []readableBip44Chain + for _, c := range cs { + chainIndexStr, err := chainIndexToString(c.ChainIndex) + if err != nil { + return nil, err + } + rc := readableBip44Chain{ + PubKey: c.PubKey.String(), + Chain: chainIndexStr, + } + + for _, e := range c.Entries { + var secret string + if !e.Secret.Null() { + secret = d.SecKeyToHex(e.Secret) + } + + rc.Entries = append(rc.Entries, readableBip44Entry{ + Address: e.Address.String(), + Public: e.Public.Hex(), + ChildNumber: e.ChildNumber, + Secret: secret, + }) + } + rcs = append(rcs, rc) + } + + return rcs, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/wallet.go b/vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/wallet.go new file mode 100644 index 0000000000..e4b48dab17 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/bip44wallet/wallet.go @@ -0,0 +1,906 @@ +// This file is still under refactoring, once it gets done, we will replace the +// old bip44_wallet.go. + +package bip44wallet + +import ( + "errors" + "fmt" + "strconv" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/crypto" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/wallet" + + "github.com/skycoin/skycoin/src/cipher/bip32" + "github.com/skycoin/skycoin/src/cipher/bip39" + "github.com/skycoin/skycoin/src/cipher/bip44" +) + +const ( + // WalletType represents the bip44 wallet type + WalletType = "bip44" + // DefaultAccountName is the default bip44 account name + DefaultAccountName = "default" +) + +var ( + // defaultWalletDecoder is the default bip44 wallet decoder + defaultWalletDecoder = &JSONDecoder{} +) + +var logger = logging.MustGetLogger("bip44wallet") + +func init() { + if err := wallet.RegisterCreator(WalletType, &Creator{}); err != nil { + panic(err) + } + + if err := wallet.RegisterLoader(WalletType, &Loader{}); err != nil { + panic(err) + } +} + +// Wallet manages keys using the original Skycoin deterministic +// keypair generator method. +type Wallet struct { + //Meta wallet meta data + wallet.Meta + // accounts bip44 wallet accounts + accountManager + // decoder is used to encode/decode bip44 wallet to/from []byte + decoder wallet.Decoder +} + +// accountManager is the interface that manages the bip44 wallet accounts. +type accountManager interface { + // new creates a new account, returns the account index, and error, if any + new(opts bip44AccountCreateOptions) (uint32, error) + // newAddresses generates addresses on selected account + newAddresses(account, chain, num uint32) ([]cipher.Addresser, error) + // entries returns entries of specific chain of the selected account + entries(account, chain uint32) (wallet.Entries, error) + // entriesLen returns the entries length of specific chain of selected account + entriesLen(account, chain uint32) (uint32, error) + // entryAt returns the entry of specific index + entryAt(account, chain, index uint32) (wallet.Entry, error) + // getEntry returns the entry of given address + getEntry(account uint32, address cipher.Addresser) (wallet.Entry, bool, error) + // len returns the account number + len() uint32 + // clone returns a deep clone accounts manager + clone() accountManager + // syncSecrets checks if there are any addresses that do not have secrets associated with, + // if yes, generate the secrets for those addresses + syncSecrets(ss wallet.Secrets) error + // packSecrets packs secrets + packSecrets(ss wallet.Secrets) + // unpackSecrets unpacks secrets + unpackSecrets(ss wallet.Secrets) error + // erase wipes secrets + erase() + account(account uint32) (*bip44Account, error) + // all returns all accounts in wallet.Account format + all() []wallet.Bip44Account + // reset reset all accounts' entries + reset() +} + +// ChainEntry represents an item on the bip44 wallet chain +type ChainEntry struct { + Address cipher.Addresser +} + +// NewWallet create a bip44 wallet with options +// also, a default address will be generated +func NewWallet(filename, label, seed, seedPassphrase string, options ...wallet.Option) (*Wallet, error) { + if label == "" { + return nil, wallet.ErrMissingLabel + } + + if seed == "" { + return nil, wallet.ErrMissingSeed + } + + wlt := &Wallet{ + Meta: wallet.Meta{ + wallet.MetaFilename: filename, + wallet.MetaLabel: label, + wallet.MetaSeed: seed, + wallet.MetaSeedPassphrase: seedPassphrase, + wallet.MetaEncrypted: "false", + wallet.MetaType: WalletType, + wallet.MetaVersion: wallet.Version, + wallet.MetaCoin: string(wallet.CoinTypeSkycoin), + wallet.MetaCryptoType: string(crypto.DefaultCryptoType), + wallet.MetaTimestamp: strconv.FormatInt(time.Now().Unix(), 10), + }, + accountManager: &bip44Accounts{}, + decoder: defaultWalletDecoder, + } + + advOpts := wallet.AdvancedOptions{} + // apply options to wallet and AdvancedOptions + for _, opt := range options { + opt(wlt) + opt(&advOpts) + } + + if wlt.Bip44Coin() == nil { + switch wlt.Coin() { + case wallet.CoinTypeSkycoin: + wlt.SetBip44Coin(bip44.CoinTypeSkycoin) + case wallet.CoinTypeBitcoin: + wlt.SetBip44Coin(bip44.CoinTypeBitcoin) + default: + return nil, errors.New("bip44 coin type not set") + } + } + + // validateMeta wallet before encrypting + if err := validateMeta(wlt.Meta); err != nil { + return nil, err + } + + // generates a default account + var accountName = DefaultAccountName + if advOpts.DefaultBip44AccountName != "" { + accountName = advOpts.DefaultBip44AccountName + } + + _, err := wlt.NewAccount(accountName) + if err != nil { + return nil, fmt.Errorf("generate default account failed: %v", err) + } + + // Generate addresses if options.GenrateN > 0 + generateN := advOpts.GenerateN + if generateN == 0 { + generateN = 1 + } + + if _, err := wlt.GenerateAddresses(wallet.OptionGenerateN(generateN)); err != nil { + return nil, err + } + + // Generate a default change address + if _, err := wlt.GenerateAddresses(wallet.OptionGenerateN(1), wallet.OptionChange()); err != nil { + return nil, err + } + + scanN := advOpts.ScanN + if scanN > 0 { + if advOpts.TF == nil { + return nil, errors.New("missing transaction finder for scanning addresses") + } + + if scanN > generateN { + scanN = scanN - generateN + } + + _, err := wlt.ScanAddresses(scanN, advOpts.TF) + if err != nil { + return nil, err + } + } + + // encrypts wallet if options.Encrypt is true + if advOpts.Encrypt { + if wlt.IsTemp() { + return nil, wallet.ErrEncryptTempWallet + } + + if len(advOpts.Password) == 0 { + return nil, errors.New("missing password for encrypting wallet") + } + + if err := wlt.Lock(advOpts.Password); err != nil { + return nil, err + } + } + + // validateMeta the wallet again after encrypted + if err := validateMeta(wlt.Meta); err != nil { + return nil, err + } + return wlt, nil +} + +func validateMeta(m wallet.Meta) error { + if m[wallet.MetaType] != WalletType { + return wallet.ErrInvalidWalletType + } + + if s := m[wallet.MetaBip44Coin]; s == "" { + return errors.New("missing bip44 coin type") + } else if _, err := strconv.ParseUint(s, 10, 32); err != nil { + return fmt.Errorf("invalid bip44 coin type: %v", err) + } + + if err := wallet.ValidateMeta(m); err != nil { + return err + } + + if s := m[wallet.MetaSeed]; s != "" { + if err := bip39.ValidateMnemonic(s); err != nil { + return err + } + } + + if err := wallet.ValidateMetaCryptoType(m); err != nil { + return err + } + + return wallet.ValidateMetaSeed(m) +} + +// SetDecoder sets the wallet decoder +func (w *Wallet) SetDecoder(d wallet.Decoder) { + w.decoder = d +} + +// NewAccount create a bip44 wallet account, returns account index and +// error, if any. +func (w *Wallet) NewAccount(name string) (uint32, error) { + return w.accountManager.new(bip44AccountCreateOptions{ + name: name, + seed: w.Seed(), + seedPassphrase: w.SeedPassphrase(), + coinType: w.Coin(), + bip44CoinType: w.Bip44Coin(), + }) +} + +// newExternalAddresses generates addresses on external chain of selected account +func (w *Wallet) newExternalAddresses(account, n uint32) ([]cipher.Addresser, error) { + return w.newAddresses(account, bip44.ExternalChainIndex, n) +} + +// NewChangeAddresses generates addresses on change chain of selected account +func (w *Wallet) newChangeAddresses(account, n uint32) ([]cipher.Addresser, error) { + return w.newAddresses(account, bip44.ChangeChainIndex, n) +} + +// externalEntries returns the entries on external chain +func (w *Wallet) externalEntries(account uint32) (wallet.Entries, error) { + return w.entries(account, bip44.ExternalChainIndex) +} + +// +//// ChangeEntries returns the entries on change chain +//func (w *Wallet) ChangeEntries(account uint32) (wallet.Entries, error) { +// return w.accounts.entries(account, bip44.ChangeChainIndex) +//} +// +//// ExternalEntriesLen returns the external chain entries length of selected account +//func (w *Wallet) ExternalEntriesLen(account uint32) (uint32, error) { +// return w.accounts.entriesLen(account, bip44.ExternalChainIndex) +//} +// +//// ChangeEntriesLen returns the change chain entries length of selected account +//func (w *Wallet) ChangeEntriesLen(account uint32) (uint32, error) { +// return w.accounts.entriesLen(account, bip44.ChangeChainIndex) +//} +// +//// ExternalEntryAt returns the entry at the given index on external chain of selected account +//func (w *Wallet) ExternalEntryAt(account, i uint32) (wallet.Entry, error) { +// return w.accounts.entryAt(account, bip44.ExternalChainIndex, i) +//} +// +//// ChangeEntryAt returns the entry at the given index on change chain of selected account +//func (w *Wallet) ChangeEntryAt(account, i uint32) (wallet.Entry, error) { +// return w.accounts.entryAt(account, bip44.ChangeChainIndex, i) +//} +// +//// GetEntry returns the entry of given address on selected account +//func (w *Wallet) GetEntry(account uint32, address cipher.Addresser) (wallet.Entry, bool, error) { +// return w.accounts.getEntry(account, address) +//} + +// Serialize encodes the bip44 wallet to []byte +func (w Wallet) Serialize() ([]byte, error) { + if w.decoder == nil { + w.decoder = defaultWalletDecoder + } + return w.decoder.Encode(&w) +} + +// Deserialize decodes the []byte to a bip44 wallet +func (w *Wallet) Deserialize(b []byte) error { + if w.decoder == nil { + w.decoder = defaultWalletDecoder + } + toW, err := w.decoder.Decode(b) + if err != nil { + return err + } + toW2 := toW.(*Wallet) + + toW2.decoder = w.decoder + *w = *toW2 + return nil +} + +// IsEncrypted returns whether the wallet is encrypted +func (w Wallet) IsEncrypted() bool { + return w.Meta.IsEncrypted() +} + +// Lock encrypts the wallet if it is unencrypted, return false +// if it is already encrypted. +func (w *Wallet) Lock(password []byte) error { + if w.IsTemp() { + return wallet.ErrEncryptTempWallet + } + + if len(password) == 0 { + return wallet.ErrMissingPassword + } + + if w.IsEncrypted() { + return wallet.ErrWalletEncrypted + } + + wlt := w.Clone().(*Wallet) + + ss := make(wallet.Secrets) + defer func() { + ss.Erase() + wlt.Erase() + }() + + wlt.packSecrets(ss) + + sb, err := ss.Serialize() + if err != nil { + return err + } + + cryptoType := wlt.Meta.CryptoType() + if cryptoType == "" { + cryptoType = crypto.DefaultCryptoType + } + + cryptor, err := crypto.GetCrypto(cryptoType) + if err != nil { + return err + } + + encSecret, err := cryptor.Encrypt(sb, password) + if err != nil { + return err + } + + // Sets wallet as encrypted, updates secret field. + wlt.SetEncrypted(cryptoType, string(encSecret)) + + // Wipes the secret fields in wlt + wlt.Erase() + + // Wipes the secret fields in w + w.Erase() + + w.copyFrom(wlt) + return nil +} + +// Unlock decrypt the wallet +func (w *Wallet) Unlock(password []byte) (wallet.Wallet, error) { + if !w.IsEncrypted() { + return nil, wallet.ErrWalletNotEncrypted + } + + if len(password) == 0 { + return nil, wallet.ErrMissingPassword + } + + sstr := w.Secrets() + if sstr == "" { + return nil, errors.New("wallet.Secrets missing from wallet") + } + + ct := w.CryptoType() + if ct == "" { + return nil, errors.New("missing crypto type") + } + + cryptor, err := crypto.GetCrypto(ct) + if err != nil { + return nil, err + } + + sb, err := cryptor.Decrypt([]byte(sstr), password) + if err != nil { + return nil, wallet.ErrInvalidPassword + } + + defer func() { + // Wipes the data from secrets bytes buffer + for i := range sb { + sb[i] = 0 + } + }() + + ss := make(wallet.Secrets) + defer ss.Erase() + if err := ss.Deserialize(sb); err != nil { + return nil, err + } + + cw := w.Clone().(*Wallet) + + initSSLen := len(ss) + // fills secrets for those new generated addresses + if err := cw.syncSecrets(ss); err != nil { + return nil, err + } + + if len(ss) > initSSLen { + // new secrets generated, update the secrets field of the locked wallet + sb, err := ss.Serialize() + if err != nil { + return nil, err + } + + encSecret, err := cryptor.Encrypt(sb, password) + if err != nil { + return nil, err + } + + // Sets wallet as encrypted, updates secret field. + w.SetEncrypted(ct, string(encSecret)) + } + + if err := cw.unpackSecrets(ss); err != nil { + return nil, err + } + cw.SetDecrypted() + return cw, nil +} + +// Fingerprint returns a unique ID fingerprint for this wallet, composed of its wallet type and initial address +func (w Wallet) Fingerprint() string { + addr := "" + cw := w.Clone().(*Wallet) + if w.accountManager.len() == 0 { + // Due to the value receiver of the Wallet, the new account should not be applied to + // the wallet. + _, err := cw.NewAccount(DefaultAccountName) + if err != nil { + panic(err) + } + } + + entries, err := cw.externalEntries(0) + if err != nil { + logger.WithError(err).Panic("Fingerprint get external entries failed") + return "" + } + + if len(entries) == 0 { + if !cw.IsEncrypted() { + addrs, err := cw.newExternalAddresses(0, 1) + if err != nil { + logger.WithError(err).Panic("Fingerprint failed to generate initial entry for empty wallet") + } + addr = addrs[0].String() + } + } else { + addr = entries[0].Address.String() + } + return fmt.Sprintf("%s-%s", cw.Type(), addr) +} + +// Clone deep clone of the bip44 wallet +func (w Wallet) Clone() wallet.Wallet { + return &Wallet{ + Meta: w.Meta.Clone(), + accountManager: w.accountManager.clone(), + decoder: w.decoder, + } +} + +func (w *Wallet) copyFrom(wlt *Wallet) { + w.Meta = wlt.Meta.Clone() + w.accountManager = wlt.accountManager.clone() + w.decoder = wlt.decoder +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *Wallet) CopyFromRef(src wallet.Wallet) { + *w = *(src.(*Wallet)) +} + +// Accounts returns the list of accounts +func (w *Wallet) Accounts() []wallet.Bip44Account { + return w.accountManager.all() +} + +// GetEntries provides entries service to access the external chain of given account +func (w *Wallet) GetEntries(options ...wallet.Option) (wallet.Entries, error) { + opts := getBip44Options(options...) + + var entries wallet.Entries + switch opts.ChainMode { + case wallet.DefaultChain, wallet.AllChains: + ees, err := w.entries(opts.Account, bip44.ExternalChainIndex) + if err != nil { + return nil, fmt.Errorf("failed to get external chain, err: %v", err) + } + + ces, err := w.entries(opts.Account, bip44.ChangeChainIndex) + if err != nil { + return nil, fmt.Errorf("failed to get change chain, err: %v", err) + } + + entries = append(ees, ces...) + case wallet.ExternalChain: + es, err := w.entries(opts.Account, bip44.ExternalChainIndex) + if err != nil { + return nil, fmt.Errorf("failed to get external chain, err: %v", err) + } + entries = es + case wallet.ChangeChain: + es, err := w.entries(opts.Account, bip44.ChangeChainIndex) + if err != nil { + return nil, fmt.Errorf("failed to get change chain, err: %v", err) + } + entries = es + default: + return nil, fmt.Errorf("unknown chain mode: %d", opts.ChainMode) + } + return entries, nil +} + +// Erase wipes all sensitive data +func (w *Wallet) Erase() { + w.SetSeed("") + w.SetSeedPassphrase("") + w.accountManager.erase() +} + +// syncSecrets synchronize the secrets with all addresses, ensure that +// each address has the secret key stored in the secrets +func (w Wallet) syncSecrets(ss wallet.Secrets) error { + return w.accountManager.syncSecrets(ss) +} + +// packSecrets saves all sensitive data to the secrets map. +func (w Wallet) packSecrets(ss wallet.Secrets) { + ss.Set(wallet.SecretSeed, w.Meta.Seed()) + ss.Set(wallet.SecretSeedPassphrase, w.Meta.SeedPassphrase()) + w.accountManager.packSecrets(ss) +} + +func (w *Wallet) unpackSecrets(ss wallet.Secrets) error { + seed, ok := ss.Get(wallet.SecretSeed) + if !ok { + return errors.New("seed does not exist in secrets") + } + w.Meta.SetSeed(seed) + + passphrase, _ := ss.Get(wallet.SecretSeedPassphrase) + w.Meta.SetSeedPassphrase(passphrase) + + return w.accountManager.unpackSecrets(ss) +} + +func getBip44Options(options ...wallet.Option) *wallet.Bip44EntriesOptions { + v := &wallet.Bip44EntriesOptions{} + for _, opt := range options { + opt(v) + } + + return v +} + +// ScanAddresses scans both the external and change addresses to find addresses with +// transactions. +// Only external addresses will be returned. +func (w *Wallet) ScanAddresses(scanN uint64, tf wallet.TransactionsFinder) ([]cipher.Addresser, error) { + if scanN == 0 { + return nil, nil + } + + w2 := w.Clone().(*Wallet) + + accounts := w2.Accounts() + scanAddresses := func(account, chain uint32) ([]cipher.Addresser, int, int, error) { + nExistingAddrs, err := w2.entriesLen(account, chain) + if err != nil { + return nil, 0, 0, err + } + + // generates the addresses to scan + addrs, err := w2.accountManager.newAddresses(account, chain, uint32(scanN)) + if err != nil { + return nil, 0, 0, err + } + + // finds if these addresses had any activity + active, err := tf.AddressesActivity(addrs) + if err != nil { + return nil, 0, 0, err + } + + // checks activity from the last one until we find the address that has activity + var keepNum uint64 + for i := len(active) - 1; i >= 0; i-- { + if active[i] { + keepNum = uint64(i + 1) + break + } + } + + return addrs[:keepNum], int(nExistingAddrs), int(keepNum), nil + } + + // [accounts][chains] array + generateAddresses := make([][]uint32, len(accounts)) + + // only external addresses will be returned + var retAddrs []cipher.Addresser + + for i, a := range accounts { + addrs, initLen, keepNum, err := scanAddresses(a.Index, bip44.ExternalChainIndex) + if err != nil { + return nil, err + } + + retAddrs = append(retAddrs, addrs...) + + generateAddresses[i] = append(generateAddresses[i], uint32(initLen+keepNum)) + + _, initLen, keepNum, err = scanAddresses(a.Index, bip44.ChangeChainIndex) + if err != nil { + return nil, err + } + + generateAddresses[i] = append(generateAddresses[i], uint32(initLen+keepNum)) + } + + w2.reset() + for i, a := range accounts { + // generate addresses on external chains + for _, c := range []uint32{bip44.ExternalChainIndex, bip44.ChangeChainIndex} { + _, err := w2.newAddresses(a.Index, c, generateAddresses[i][c]) + if err != nil { + return nil, err + } + } + } + + *w = *w2 + + return retAddrs, nil +} + +// GetAddresses returns all addresses on selected account and chain, +// if no options ware provided, addresses on external chain of account 0 will be returned. +func (w *Wallet) GetAddresses(options ...wallet.Option) ([]cipher.Addresser, error) { + entries, err := w.GetEntries(options...) + if err != nil { + return nil, err + } + + var addrs []cipher.Addresser + for _, e := range entries { + addrs = append(addrs, e.Address) + } + + return addrs, nil +} + +// GenerateAddresses generates addresses on selected account and chain, +// if no options are provided, addresses will be generated on external chain of account 0. +func (w *Wallet) GenerateAddresses(options ...wallet.Option) ([]cipher.Addresser, error) { + num := wallet.GetGenerateNFromOptions(options...) + opts := getBip44Options(options...) + switch opts.ChainMode { + case wallet.DefaultChain, wallet.ExternalChain: + return w.newAddresses(opts.Account, bip44.ExternalChainIndex, uint32(num)) + case wallet.ChangeChain: + return w.newAddresses(opts.Account, bip44.ChangeChainIndex, uint32(num)) + case wallet.AllChains: + return nil, errors.New("could not generate new addresses on both external and internal chains at once") + default: + return nil, fmt.Errorf("unknown chain mode: %d", opts.ChainMode) + } +} + +// GetEntryAt returns the entry at specified index of selected chain. +// If no chain is specified, the entry of append(external, change)[index] will be returned. +func (w *Wallet) GetEntryAt(i int, options ...wallet.Option) (wallet.Entry, error) { + entries, err := w.GetEntries(options...) + if err != nil { + return wallet.Entry{}, err + } + + if i >= len(entries) { + return wallet.Entry{}, fmt.Errorf("entry index %d out of range", i) + } + + return entries[i], nil +} + +// GetEntry returns the entry of given address on selected account and chain, +// if no options are provided, check the external chain of account 0. +func (w *Wallet) GetEntry(addr cipher.Addresser, options ...wallet.Option) (wallet.Entry, error) { + opts := getBip44Options(options...) + e, ok, err := w.getEntry(opts.Account, addr) + if err != nil { + return wallet.Entry{}, err + } + + if !ok { + return wallet.Entry{}, wallet.ErrEntryNotFound + } + + return e, nil +} + +// HasEntry checks whether the entry of given address exists on selected account and chain, +// if no options are provided, check the external chain of account 0. +func (w *Wallet) HasEntry(addr cipher.Addresser, options ...wallet.Option) (bool, error) { + opts := getBip44Options(options...) + _, ok, err := w.getEntry(opts.Account, addr) + if err != nil { + return false, err + } + + return ok, nil +} + +// EntriesLen returns the entries length of selected account and chain, +// if no options are provided, entries length of all chains will +// be returned. +func (w *Wallet) EntriesLen(options ...wallet.Option) (int, error) { + opts := getBip44Options(options...) + switch opts.ChainMode { + case wallet.ExternalChain: + l, err := w.entriesLen(opts.Account, bip44.ExternalChainIndex) + return int(l), err + case wallet.ChangeChain: + l, err := w.entriesLen(opts.Account, bip44.ChangeChainIndex) + return int(l), err + case wallet.DefaultChain, wallet.AllChains: + el, err := w.entriesLen(opts.Account, bip44.ExternalChainIndex) + if err != nil { + return 0, fmt.Errorf("failed to get entries length of external chain, err: %v", err) + } + + cl, err := w.entriesLen(opts.Account, bip44.ChangeChainIndex) + if err != nil { + return 0, fmt.Errorf("failed to get entries length of change chain, err: %v", err) + } + return int(el + cl), err + default: + return 0, fmt.Errorf("unknown chain mode: %d", opts.ChainMode) + } +} + +func (w *Wallet) reset() { + w.accountManager.reset() +} + +// PeekChangeAddress returns the last entry address on change chain if +// no transactions are found, otherwise, returns with a new address. +func (w *Wallet) PeekChangeAddress(tf wallet.TransactionsFinder) (cipher.Addresser, error) { + onChangeChain := wallet.OptionChange() + entries, err := w.GetEntries(onChangeChain) + if err != nil { + return nil, err + } + + if len(entries) == 0 { + // generate a new address and return + addrs, err := w.GenerateAddresses(wallet.OptionGenerateN(1), onChangeChain) + if err != nil { + return nil, err + } + + return addrs[0], nil + } + + // checks if the last entry address has transactions + addr := entries[len(entries)-1].Address + oks, err := tf.AddressesActivity([]cipher.Addresser{addr}) + if err != nil { + return nil, err + } + + if oks[0] == false { + return addr, nil + } + + // generate a new address and return it + addrs, err := w.GenerateAddresses(wallet.OptionGenerateN(1), onChangeChain) + if err != nil { + return nil, err + } + return addrs[0], nil +} + +func makeChainPubKeys(a *bip44.Account) (*bip32.PublicKey, *bip32.PublicKey, error) { + external, err := a.NewPublicChildKey(0) + if err != nil { + return nil, nil, fmt.Errorf("Create external chain public key failed: %v", err) + } + + change, err := a.NewPublicChildKey(1) + if err != nil { + return nil, nil, fmt.Errorf("Create change chain public key failed: %v", err) + } + return external, change, nil +} + +// Loader implements the wallet.Loader interface +type Loader struct{} + +// Load implements the Load method of the wallet.Loader interface +func (l Loader) Load(data []byte) (wallet.Wallet, error) { + w := &Wallet{} + if err := w.Deserialize(data); err != nil { + return nil, err + } + + return w, nil +} + +// Creator implements the wallet.Creator interface +type Creator struct{} + +// Create implements the Create method of wallet.Creator interface +func (c Creator) Create(filename, label, seed string, options wallet.Options) (wallet.Wallet, error) { + opts := convertOptions(options) + return NewWallet( + filename, + label, + seed, + options.SeedPassphrase, + opts...) +} + +// convertOptions collects the cared fields from wallet.Options +// and converts them to an wallet.Option slice +func convertOptions(options wallet.Options) []wallet.Option { + var opts []wallet.Option + + if options.Coin != "" { + opts = append(opts, wallet.OptionCoinType(options.Coin)) + } + + if options.Bip44Coin != nil { + opts = append(opts, wallet.OptionBip44Coin(options.Bip44Coin)) + } + + if options.CryptoType != "" { + opts = append(opts, wallet.OptionCryptoType(options.CryptoType)) + } + + if options.Decoder != nil { + opts = append(opts, wallet.OptionDecoder(options.Decoder)) + } + + if options.Encrypt { + opts = append(opts, wallet.OptionEncrypt(true)) + opts = append(opts, wallet.OptionPassword(options.Password)) + } + + if options.GenerateN > 0 { + opts = append(opts, wallet.OptionGenerateN(options.GenerateN)) + } + + if options.ScanN > 0 { + opts = append(opts, wallet.OptionScanN(options.ScanN)) + opts = append(opts, wallet.OptionTransactionsFinder(options.TF)) + } + + if options.Temp { + opts = append(opts, wallet.OptionTemp(true)) + } + + return opts +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/collection/decoder.go b/vendor/github.com/skycoin/skycoin/src/wallet/collection/decoder.go new file mode 100644 index 0000000000..575c2eed8d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/collection/decoder.go @@ -0,0 +1,176 @@ +package collection + +import ( + "encoding/json" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/wallet" +) + +// JSONDecoder implements the Decoder interface for deterministic wallet +type JSONDecoder struct{} + +// Encode encodes the deterministic wallet to []byte, and error if any +func (d JSONDecoder) Encode(w wallet.Wallet) ([]byte, error) { + rw := newReadableDeterministicWallet(w.(*Wallet)) + return json.MarshalIndent(rw, "", " ") +} + +// Decode decodes the deterministic wallet to []byte, and error if any +func (d JSONDecoder) Decode(b []byte) (wallet.Wallet, error) { + var rw readableDeterministicWallet + if err := json.Unmarshal(b, &rw); err != nil { + return nil, err + } + + return rw.toWallet() +} + +// readableEntry wallet entry with json tags +type readableEntry struct { + Address string `json:"address"` + Public string `json:"public_key"` + Secret string `json:"secret_key"` +} + +// newReadableEntry creates readable wallet entry +func newReadableEntry(coinType wallet.CoinType, e wallet.Entry) readableEntry { + re := readableEntry{} + if !e.Address.Null() { + re.Address = e.Address.String() + } + + if !e.Public.Null() { + re.Public = e.Public.Hex() + } + + if !e.Secret.Null() { + d := wallet.ResolveSecKeyDecoder(coinType) + re.Secret = d.SecKeyToHex(e.Secret) + } + + return re +} + +// readableEntries array of readableEntry +type readableEntries []readableEntry + +func newReadableEntries(entries wallet.Entries, coinType wallet.CoinType) readableEntries { + re := make(readableEntries, len(entries)) + for i, e := range entries { + re[i] = newReadableEntry(coinType, e) + } + return re +} + +// toWalletEntries convert readable entries to entries +// converts base on the wallet version. +func (res readableEntries) toWalletEntries(coinType wallet.CoinType, isEncrypted bool) ([]wallet.Entry, error) { + entries := make([]wallet.Entry, len(res)) + for i, re := range res { + e, err := newEntryFromReadable(coinType, &re) + if err != nil { + return []wallet.Entry{}, err + } + + // Verify the wallet if it's not encrypted + if !isEncrypted && re.Secret != "" { + if err := e.Verify(); err != nil { + return nil, err + } + } + + entries[i] = *e + } + return entries, nil +} + +// newEntryFromReadable creates WalletEntry base one ReadableWalletEntry +func newEntryFromReadable(coinType wallet.CoinType, re *readableEntry) (*wallet.Entry, error) { + var a cipher.Addresser + var err error + + switch coinType { + case wallet.CoinTypeSkycoin: + a, err = cipher.DecodeBase58Address(re.Address) + case wallet.CoinTypeBitcoin: + a, err = cipher.DecodeBase58BitcoinAddress(re.Address) + default: + panic(fmt.Errorf("invalid coin type %q", coinType)) + } + + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(re.Public) + if err != nil { + return nil, err + } + + // Decodes the secret hex string if any + var secret cipher.SecKey + if re.Secret != "" { + switch coinType { + case wallet.CoinTypeSkycoin: + secret, err = cipher.SecKeyFromHex(re.Secret) + case wallet.CoinTypeBitcoin: + secret, err = cipher.SecKeyFromBitcoinWalletImportFormat(re.Secret) + default: + panic(fmt.Errorf("invalid coin type %q", coinType)) + } + if err != nil { + return nil, err + } + } + + return &wallet.Entry{ + Address: a, + Public: p, + Secret: secret, + }, nil +} + +// readableDeterministicWallet used for [de]serialization of a deterministic wallet +type readableDeterministicWallet struct { + wallet.Meta `json:"meta"` + Entries readableEntries `json:"entries"` +} + +// newReadableDeterministicWallet creates readable wallet +func newReadableDeterministicWallet(w *Wallet) *readableDeterministicWallet { + return &readableDeterministicWallet{ + Meta: w.Meta.Clone(), + Entries: newReadableEntries(w.entries, w.Meta.Coin()), + } +} + +// toWallet convert readable wallet to Wallet +func (rw *readableDeterministicWallet) toWallet() (wallet.Wallet, error) { + w := &Wallet{ + Meta: rw.Meta.Clone(), + } + + // make sure "sky", "btc" normalize to "skycoin", "bitcoin" + ct, err := wallet.ResolveCoinType(string(w.Meta.Coin())) + if err != nil { + return nil, err + } + + w.SetCoin(ct) + + if err := w.Validate(); err != nil { + err := fmt.Errorf("invalid wallet %q: %v", w.Filename(), err) + return nil, err + } + + ets, err := rw.Entries.toWalletEntries(w.Meta.Coin(), w.Meta.IsEncrypted()) + if err != nil { + return nil, err + } + + w.entries = ets + + return w, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/collection/wallet.go b/vendor/github.com/skycoin/skycoin/src/wallet/collection/wallet.go new file mode 100644 index 0000000000..97f58be786 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/collection/wallet.go @@ -0,0 +1,486 @@ +package collection + +import ( + "errors" + "fmt" + "strconv" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/crypto" + "github.com/skycoin/skycoin/src/wallet" +) + +const ( + // WalletType represents the collection wallet type + WalletType = "collection" +) + +var defaultWalletDecoder = &JSONDecoder{} + +func init() { + if err := wallet.RegisterCreator(WalletType, &Creator{}); err != nil { + panic(err) + } + + if err := wallet.RegisterLoader(WalletType, &Loader{}); err != nil { + panic(err) + } +} + +// Wallet manages keys as an arbitrary collection. +// It has no defined keypair generator. The only way to add keys to the +// wallet is to explicitly add them. +// This wallet does not support address scanning or generation. +// This wallet does not use seeds. +type Wallet struct { + wallet.Meta + entries wallet.Entries + decoder wallet.Decoder +} + +// NewWallet creates a collection wallet +func NewWallet(filename, label string, options ...wallet.Option) (*Wallet, error) { + if label == "" { + return nil, wallet.ErrMissingLabel + } + + var wlt = &Wallet{ + Meta: wallet.Meta{ + wallet.MetaFilename: filename, + wallet.MetaLabel: label, + wallet.MetaEncrypted: "false", + wallet.MetaType: WalletType, + wallet.MetaVersion: wallet.Version, + wallet.MetaCoin: string(wallet.CoinTypeSkycoin), + wallet.MetaCryptoType: string(crypto.DefaultCryptoType), + wallet.MetaTimestamp: strconv.FormatInt(time.Now().Unix(), 10), + }, + entries: wallet.Entries{}, + decoder: defaultWalletDecoder, + } + + advOpts := &wallet.AdvancedOptions{} + for _, opt := range options { + opt(wlt) + opt(advOpts) + } + + // validateMeta wallet before encryption + if err := validateMeta(wlt.Meta); err != nil { + return nil, err + } + + if advOpts.GenerateN != 0 || advOpts.ScanN != 0 { + return nil, wallet.NewError(fmt.Errorf("wallet scanning is not defined for %q wallet", WalletType)) + } + + if len(advOpts.PrivateKeys) > 0 { + wlt.entries = make([]wallet.Entry, 0, len(advOpts.PrivateKeys)) + // generate new entries from private keys and add them to wallet + for _, sk := range advOpts.PrivateKeys { + pk, err := cipher.PubKeyFromSecKey(sk) + if err != nil { + return nil, wallet.NewError(errors.New("invalid wallet private key")) + } + + wlt.entries = append(wlt.entries, wallet.Entry{ + Address: cipher.AddressFromPubKey(pk), + Public: pk, + Secret: sk, + }) + } + } + + if advOpts.Encrypt { + if wlt.IsTemp() { + return nil, wallet.ErrEncryptTempWallet + } + + if len(advOpts.Password) == 0 { + return nil, wallet.ErrMissingPassword + } + + if err := wlt.Lock(advOpts.Password); err != nil { + return nil, err + } + } else { + if len(advOpts.Password) > 0 { + return nil, wallet.ErrMissingEncrypt + } + } + + if err := validateMeta(wlt.Meta); err != nil { + return nil, err + } + + return wlt, nil +} + +func validateMeta(m wallet.Meta) error { + if m[wallet.MetaType] != WalletType { + return wallet.ErrInvalidWalletType + } + + if m[wallet.MetaSeed] != "" { + return wallet.NewError(fmt.Errorf("seed should not be provided for %q wallets", WalletType)) + } + if err := wallet.ValidateMetaCryptoType(m); err != nil { + return err + } + + return wallet.ValidateMeta(m) +} + +// SetDecoder sets the decoder +func (w *Wallet) SetDecoder(d wallet.Decoder) { + w.decoder = d +} + +// Serialize encode the wallet to byte slice +func (w Wallet) Serialize() ([]byte, error) { + if w.decoder == nil { + w.decoder = defaultWalletDecoder + } + + return w.decoder.Encode(&w) +} + +// Deserialize decodes wallet from byte slice +func (w *Wallet) Deserialize(data []byte) error { + if w.decoder == nil { + w.decoder = defaultWalletDecoder + } + + wlt, err := w.decoder.Decode(data) + if err != nil { + return err + } + + w2 := wlt.(*Wallet) + w2.decoder = w.decoder + *w = *w2 + return nil +} + +// Lock encrypts the wallet secrets +func (w *Wallet) Lock(password []byte) error { + if w.IsTemp() { + return wallet.ErrEncryptTempWallet + } + + if len(password) == 0 { + return wallet.ErrMissingPassword + } + + if w.IsEncrypted() { + return wallet.ErrWalletEncrypted + } + + wlt := w.Clone().(*Wallet) + + ss := make(wallet.Secrets) + defer func() { + ss.Erase() + wlt.Erase() + }() + + wlt.packSecrets(ss) + + sb, err := ss.Serialize() + if err != nil { + return err + } + + cryptoType := wlt.CryptoType() + if cryptoType == "" { + cryptoType = crypto.DefaultCryptoType + } + + cryptor, err := crypto.GetCrypto(cryptoType) + if err != nil { + return err + } + + encSecret, err := cryptor.Encrypt(sb, password) + if err != nil { + return err + } + + wlt.SetEncrypted(cryptoType, string(encSecret)) + + wlt.Erase() + w.Erase() + w.copyFrom(wlt) + return nil +} + +// Unlock unlocks the encrypted wallet +func (w *Wallet) Unlock(password []byte) (wallet.Wallet, error) { + if !w.IsEncrypted() { + return nil, wallet.ErrWalletNotEncrypted + } + + if len(password) == 0 { + return nil, wallet.ErrMissingPassword + } + + sstr := w.Secrets() + if sstr == "" { + return nil, errors.New("missing secrets") + } + + ct := w.CryptoType() + if ct == "" { + return nil, errors.New("missing crypto type") + } + + cryptor, err := crypto.GetCrypto(ct) + if err != nil { + return nil, err + } + + sb, err := cryptor.Decrypt([]byte(sstr), password) + if err != nil { + return nil, wallet.ErrInvalidPassword + } + + defer func() { + // Wipes the data from secrets bytes buffer + for i := range sb { + sb[i] = 0 + } + }() + + ss := make(wallet.Secrets) + defer ss.Erase() + if err := ss.Deserialize(sb); err != nil { + return nil, err + } + + cw := w.Clone().(*Wallet) + if err := cw.unpackSecrets(ss); err != nil { + return nil, err + } + cw.SetDecrypted() + return cw, nil +} + +// packSecrets copies data from decrypted wallets into the secrets container +func (w *Wallet) packSecrets(ss wallet.Secrets) { + // ss.Set(wallet.SecretSeed, w.Meta.Seed()) + // ss.Set(wallet.SecretLastSeed, w.Meta.LastSeed()) + + // Saves entry secret keys in secrets + for _, e := range w.entries { + ss.Set(e.Address.String(), e.Secret.Hex()) + } +} + +// UnpackSecrets copies data from decrypted secrets into the wallet +func (w *Wallet) unpackSecrets(ss wallet.Secrets) error { + return w.entries.UnpackSecretKeys(ss) +} + +// Fingerprint returns an empty string; fingerprints are only defined for +// wallets with a seed +func (w *Wallet) Fingerprint() string { + return "" +} + +// Clone clones the wallet a new wallet object +func (w *Wallet) Clone() wallet.Wallet { + return &Wallet{ + Meta: w.Meta.Clone(), + entries: w.entries.Clone(), + decoder: w.decoder, + } +} + +// copyFrom copies the src wallet by reallocating +func (w *Wallet) copyFrom(src *Wallet) { + w.Meta = src.Meta.Clone() + w.entries = src.entries.Clone() +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *Wallet) CopyFromRef(src wallet.Wallet) { + *w = *(src.(*Wallet)) +} + +// Accounts is not defined for collection wallet +func (w *Wallet) Accounts() []wallet.Bip44Account { + return nil +} + +// Erase wipes secret fields in wallet +func (w *Wallet) Erase() { + // w.Meta.EraseSeeds() + w.entries.Erase() +} + +// Validate validates the wallet +func (w *Wallet) Validate() error { + if err := w.Meta.Validate(); err != nil { + return err + } + + if w.Type() != WalletType { + return wallet.ErrInvalidWalletType + } + + if s := w.Meta[wallet.MetaSeed]; s != "" { + return errors.New("seed should not be in collection wallets") + } + + if s := w.Meta[wallet.MetaLastSeed]; s != "" { + return errors.New("lastSeed should not be in collection wallets") + } + return nil +} + +// ScanAddresses is a no-op for "collection" wallets +func (w *Wallet) ScanAddresses(scanN uint64, tf wallet.TransactionsFinder) ([]cipher.Addresser, error) { + return nil, wallet.NewError(errors.New("A collection wallet does not implement ScanAddresses")) +} + +// GenerateAddresses generates new addresses base on private keys parsed from options +func (w *Wallet) GenerateAddresses(options ...wallet.Option) ([]cipher.Addresser, error) { + privateKeys := wallet.GetPrivateKeysFromOptions(options...) + addrs := make([]cipher.Addresser, 0, len(privateKeys)) + for i, k := range privateKeys { + pk, err := cipher.PubKeyFromSecKey(k) + if err != nil { + return nil, err + } + addr := cipher.AddressFromPubKey(pk) + addrs = append(addrs, addr) + w.entries = append(w.entries, wallet.Entry{ + Address: addr, + Public: pk, + Secret: privateKeys[i], + }) + } + return addrs, nil +} + +// GetAddresses returns all addresses in wallet +func (w *Wallet) GetAddresses(_ ...wallet.Option) ([]cipher.Addresser, error) { + return w.entries.GetAddresses(), nil +} + +// GetEntries returns a copy of all entries held by the wallet +func (w *Wallet) GetEntries(_ ...wallet.Option) (wallet.Entries, error) { + return w.entries.Clone(), nil +} + +// GetEntryAt returns entry at a given index in the entries array +func (w *Wallet) GetEntryAt(i int, _ ...wallet.Option) (wallet.Entry, error) { + if i < 0 || i >= len(w.entries) { + return wallet.Entry{}, fmt.Errorf("entry index %d is out of range", i) + } + return w.entries[i], nil +} + +// GetEntry returns entry of given address +func (w *Wallet) GetEntry(a cipher.Addresser, _ ...wallet.Option) (wallet.Entry, error) { + e, ok := w.entries.Get(a) + if !ok { + return wallet.Entry{}, wallet.ErrEntryNotFound + } + return e, nil +} + +// HasEntry returns true if the wallet has an entry.Entry with a given cipher.Address. +func (w *Wallet) HasEntry(a cipher.Addresser, _ ...wallet.Option) (bool, error) { + return w.entries.Has(a), nil +} + +// EntriesLen returns the number of entries in the wallet +func (w *Wallet) EntriesLen(_ ...wallet.Option) (int, error) { + return len(w.entries), nil +} + +//// GenerateSkycoinAddresses is a no-op for "collection" wallets +//func (w *Wallet) GenerateSkycoinAddresses(num uint64) ([]cipher.Address, error) { +// return nil, wallet.NewError(errors.New("A collection wallet does not implement GenerateSkycoinAddresses")) +//} +// +//// GetSkycoinAddresses returns all Skycoin addresses in wallet. The wallet's coin type must be Skycoin. +//func (w *Wallet) GetSkycoinAddresses() ([]cipher.Address, error) { +// if w.Meta.Coin() != wallet.CoinTypeSkycoin { +// return nil, errors.New("Wallet coin type is not skycoin") +// } +// +// return w.Entries.GetSkycoinAddresses(), nil +//} + +// AddEntry adds a new entry to the wallet. +func (w *Wallet) AddEntry(e wallet.Entry) error { + if w.IsEncrypted() { + return wallet.ErrWalletEncrypted + } + + if err := e.Verify(); err != nil { + return err + } + + for _, entry := range w.entries { + if e.SkycoinAddress() == entry.SkycoinAddress() { + return errors.New("wallet already contains entry with this address") + } + } + + w.entries = append(w.entries, e) + return nil +} + +// Loader implements the wallet.Loader interface +type Loader struct{} + +// Load loads wallet from byte slice +func (l Loader) Load(data []byte) (wallet.Wallet, error) { + w := &Wallet{} + if err := w.Deserialize(data); err != nil { + return nil, err + } + return w, nil +} + +// Creator implements the wallet.Creator interface +type Creator struct{} + +// Create implements the wallet.Creator interface +func (c Creator) Create(filename, label, _ string, options wallet.Options) (wallet.Wallet, error) { + return NewWallet(filename, label, convertOptions(options)...) +} + +func convertOptions(options wallet.Options) []wallet.Option { + var opts []wallet.Option + if options.Coin != "" { + opts = append(opts, wallet.OptionCoinType(options.Coin)) + } + + if options.CryptoType != "" { + opts = append(opts, wallet.OptionCryptoType(options.CryptoType)) + } + + if options.Decoder != nil { + opts = append(opts, wallet.OptionDecoder(options.Decoder)) + } + + if options.Encrypt { + opts = append(opts, wallet.OptionEncrypt(true)) + opts = append(opts, wallet.OptionPassword(options.Password)) + } + + if options.Temp { + opts = append(opts, wallet.OptionTemp(true)) + } + + if len(options.CollectionPrivateKeys) > 0 { + opts = append(opts, wallet.OptionCollectionPrivateKeys(options.CollectionPrivateKeys)) + } + + return opts +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/creators.go b/vendor/github.com/skycoin/skycoin/src/wallet/creators.go new file mode 100644 index 0000000000..3da24386e4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/creators.go @@ -0,0 +1,53 @@ +package wallet + +import ( + "fmt" + "sync" +) + +var walletCreators creators + +// RegisterCreator register wallet creator +func RegisterCreator(walletType string, c Creator) error { + return walletCreators.add(walletType, c) +} + +func getCreator(walletType string) (Creator, bool) { + return walletCreators.get(walletType) +} + +// Creator is the interface that wraps the Create and Type methods. +// +// Create creates a wallet base on the parameters +type Creator interface { + Create(filename, label, seed string, options Options) (Wallet, error) +} + +type creators struct { + l sync.Mutex + wcs map[string]Creator +} + +// Add add a new creator to the wallet creator list +func (cs *creators) add(walletType string, c Creator) error { + cs.l.Lock() + defer cs.l.Unlock() + if cs.wcs == nil { + cs.wcs = map[string]Creator{} + } + + if _, ok := cs.wcs[walletType]; ok { + return fmt.Errorf("wallet creator for %s already exists", walletType) + } + + cs.wcs[walletType] = c + return nil +} + +// Get returns the wallet creator base on the type +func (cs *creators) get(walletType string) (Creator, bool) { + cs.l.Lock() + defer cs.l.Unlock() + c, ok := cs.wcs[walletType] + return c, ok +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/decoders.go b/vendor/github.com/skycoin/skycoin/src/wallet/decoders.go new file mode 100644 index 0000000000..f7fecf1ea0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/decoders.go @@ -0,0 +1,114 @@ +package wallet + +import ( + "fmt" + + "github.com/skycoin/skycoin/src/cipher" +) + +var registeredAddressSecKeyDecoders = initAddressSecKeyDecoders() + +type addressSecKeyDecoders struct { + adapters map[CoinType]AddressSecKeyDecoder +} + +func initAddressSecKeyDecoders() addressSecKeyDecoders { + return addressSecKeyDecoders{ + adapters: map[CoinType]AddressSecKeyDecoder{ + CoinTypeSkycoin: skycoinDecoder{}, + CoinTypeBitcoin: bitcoinDecoder{}, + }, + } +} + +func (a addressSecKeyDecoders) get(coinType CoinType) AddressSecKeyDecoder { + adpt, ok := a.adapters[coinType] + if !ok { + return skycoinDecoder{} + } + return adpt +} + +func (a addressSecKeyDecoders) add(coinType CoinType, ca AddressSecKeyDecoder) error { + if _, ok := a.adapters[coinType]; ok { + return fmt.Errorf("coin adapter for %s already registered", coinType) + } + a.adapters[coinType] = ca + return nil +} + +// RegisterAddressSecKeyDecoder registers an address and seckey decoder +func RegisterAddressSecKeyDecoder(coinType CoinType, d AddressSecKeyDecoder) error { + return registeredAddressSecKeyDecoders.add(coinType, d) +} + +// ResolveAddressSecKeyDecoder returns an address and seckey decoder by coin type, +// if the corresponding decoder of is not found, returns +// the skycoin decoder. +func ResolveAddressSecKeyDecoder(coinType CoinType) AddressSecKeyDecoder { + return registeredAddressSecKeyDecoders.get(coinType) +} + +// ResolveAddressDecoder returns an address decoder by coin type. +func ResolveAddressDecoder(coinType CoinType) AddressDecoder { + return registeredAddressSecKeyDecoders.get(coinType) +} + +// ResolveSecKeyDecoder returns a SecKey decoder +func ResolveSecKeyDecoder(coinType CoinType) SecKeyDecoder { + return registeredAddressSecKeyDecoders.get(coinType) +} + +// AddressDecoder interface that wraps methods for encoding/decoding cipher.Addresser +type AddressDecoder interface { + DecodeBase58Address(addr string) (cipher.Addresser, error) + AddressFromPubKey(key cipher.PubKey) cipher.Addresser +} + +// SecKeyDecoder interface that wraps the methods for encoding/decoding cipher.SecKey +type SecKeyDecoder interface { + SecKeyToHex(key cipher.SecKey) string + SecKeyFromHex(key string) (cipher.SecKey, error) +} + +// AddressSecKeyDecoder interface that embedes the AddressDecoder and SecKeyDecoder +type AddressSecKeyDecoder interface { + AddressDecoder + SecKeyDecoder +} + +type skycoinDecoder struct{} + +func (s skycoinDecoder) AddressFromPubKey(key cipher.PubKey) cipher.Addresser { + return cipher.AddressFromPubKey(key) +} + +func (s skycoinDecoder) DecodeBase58Address(addr string) (cipher.Addresser, error) { + return cipher.DecodeBase58Address(addr) +} + +func (s skycoinDecoder) SecKeyToHex(secKey cipher.SecKey) string { + return secKey.Hex() +} + +func (s skycoinDecoder) SecKeyFromHex(secKey string) (cipher.SecKey, error) { + return cipher.SecKeyFromHex(secKey) +} + +type bitcoinDecoder struct{} + +func (b bitcoinDecoder) AddressFromPubKey(key cipher.PubKey) cipher.Addresser { + return cipher.BitcoinAddressFromPubKey(key) +} + +func (b bitcoinDecoder) DecodeBase58Address(addr string) (cipher.Addresser, error) { + return cipher.DecodeBase58BitcoinAddress(addr) +} + +func (b bitcoinDecoder) SecKeyToHex(secKey cipher.SecKey) string { + return cipher.BitcoinWalletImportFormatFromSeckey(secKey) +} + +func (b bitcoinDecoder) SecKeyFromHex(secKey string) (cipher.SecKey, error) { + return cipher.SecKeyFromBitcoinWalletImportFormat(secKey) +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/deterministic/decoder.go b/vendor/github.com/skycoin/skycoin/src/wallet/deterministic/decoder.go new file mode 100644 index 0000000000..b1903b7b3f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/deterministic/decoder.go @@ -0,0 +1,178 @@ +package deterministic + +import ( + "encoding/json" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/wallet" +) + +// JSONDecoder implements the Decoder interface for deterministic wallet +type JSONDecoder struct{} + +// Encode encodes the deterministic wallet to []byte, and error if any +func (d JSONDecoder) Encode(w wallet.Wallet) ([]byte, error) { + rw := newReadableDeterministicWallet(w.(*Wallet)) + return json.MarshalIndent(rw, "", " ") +} + +// Decode decodes the deterministic wallet from byte slice +func (d JSONDecoder) Decode(b []byte) (wallet.Wallet, error) { + var rw readableDeterministicWallet + if err := json.Unmarshal(b, &rw); err != nil { + return nil, err + } + + return rw.toWallet() +} + +// readableEntry wallet entry with json tags +type readableEntry struct { + Address string `json:"address"` + Public string `json:"public_key"` + Secret string `json:"secret_key"` +} + +// newReadableEntry creates readable wallet entry +func newReadableEntry(coinType wallet.CoinType, e wallet.Entry) readableEntry { + re := readableEntry{} + if !e.Address.Null() { + re.Address = e.Address.String() + } + + if !e.Public.Null() { + re.Public = e.Public.Hex() + } + + if !e.Secret.Null() { + d := wallet.ResolveSecKeyDecoder(coinType) + re.Secret = d.SecKeyToHex(e.Secret) + } + + return re +} + +// readableEntries array of readableEntry +type readableEntries []readableEntry + +func newReadableEntries(entries wallet.Entries, coinType wallet.CoinType) readableEntries { + re := make(readableEntries, len(entries)) + for i, e := range entries { + re[i] = newReadableEntry(coinType, e) + } + return re +} + +// toWalletEntries convert readable entries to entries +// converts base on the wallet version. +func (res readableEntries) toWalletEntries(coinType wallet.CoinType, isEncrypted bool) ([]wallet.Entry, error) { + entries := make([]wallet.Entry, len(res)) + for i, re := range res { + e, err := newEntryFromReadable(coinType, &re) + if err != nil { + return []wallet.Entry{}, err + } + + // Verify the wallet if it's not encrypted + if !isEncrypted && re.Secret != "" { + if err := e.Verify(); err != nil { + return nil, err + } + } + + entries[i] = *e + } + return entries, nil +} + +// newEntryFromReadable creates WalletEntry base one ReadableWalletEntry +func newEntryFromReadable(coinType wallet.CoinType, re *readableEntry) (*wallet.Entry, error) { + var a cipher.Addresser + var err error + + switch coinType { + case wallet.CoinTypeSkycoin: + a, err = cipher.DecodeBase58Address(re.Address) + case wallet.CoinTypeBitcoin: + a, err = cipher.DecodeBase58BitcoinAddress(re.Address) + default: + panic(fmt.Errorf("invalid coin type %q", coinType)) + } + + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(re.Public) + if err != nil { + return nil, err + } + + // Decodes the secret hex string if any + var secret cipher.SecKey + if re.Secret != "" { + switch coinType { + case wallet.CoinTypeSkycoin: + secret, err = cipher.SecKeyFromHex(re.Secret) + case wallet.CoinTypeBitcoin: + secret, err = cipher.SecKeyFromBitcoinWalletImportFormat(re.Secret) + default: + panic(fmt.Errorf("invalid coin type %q", coinType)) + } + if err != nil { + return nil, err + } + } + + return &wallet.Entry{ + Address: a, + Public: p, + Secret: secret, + }, nil +} + +// readableDeterministicWallet used for [de]serialization of a deterministic wallet +type readableDeterministicWallet struct { + wallet.Meta `json:"meta"` + Entries readableEntries `json:"entries"` +} + +// newReadableDeterministicWallet creates readable wallet +func newReadableDeterministicWallet(w *Wallet) *readableDeterministicWallet { + return &readableDeterministicWallet{ + Meta: w.Meta.Clone(), + Entries: newReadableEntries(w.entries, w.Meta.Coin()), + } +} + +// toWallet convert readable wallet to Wallet +func (rw *readableDeterministicWallet) toWallet() (wallet.Wallet, error) { + w := &Wallet{ + Meta: rw.Meta.Clone(), + } + + // make sure "sky", "btc" normalize to "skycoin", "bitcoin" + ct, err := wallet.ResolveCoinType(string(w.Meta.Coin())) + if err != nil { + return nil, err + } + + w.SetCoin(ct) + + if err := w.Validate(); err != nil { + err := fmt.Errorf("invalid wallet %q: %v", w.Filename(), err) + //wallet.logger.WithError(err).Error("readableDeterministicWallet.ToWallet Validate failed") + return nil, err + } + + ets, err := rw.Entries.toWalletEntries(w.Meta.Coin(), w.Meta.IsEncrypted()) + if err != nil { + //wallet.logger.WithError(err).Error("readableDeterministicWallet.ToWallet toWalletEntries failed") + return nil, err + } + + w.entries = ets + + return w, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/deterministic/wallet.go b/vendor/github.com/skycoin/skycoin/src/wallet/deterministic/wallet.go new file mode 100644 index 0000000000..b04799c9ac --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/deterministic/wallet.go @@ -0,0 +1,569 @@ +package deterministic + +import ( + "encoding/hex" + "errors" + "fmt" + "strconv" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/crypto" + "github.com/skycoin/skycoin/src/wallet" +) + +// WalletType represents the deterministic wallet type +const WalletType = "deterministic" + +var defaultWalletDecoder = &JSONDecoder{} + +func init() { + if err := wallet.RegisterCreator(WalletType, &Creator{}); err != nil { + panic(err) + } + + if err := wallet.RegisterLoader(WalletType, &Loader{}); err != nil { + panic(err) + } +} + +// Wallet manages keys using the original Skycoin deterministic +// keypair generator method. +// With this generator, a single chain of addresses is created, each one dependent +// on the previous. +type Wallet struct { + wallet.Meta + entries wallet.Entries + decoder wallet.Decoder +} + +// NewWallet creates a deterministic wallet +func NewWallet(filename, label, seed string, options ...wallet.Option) (*Wallet, error) { + if label == "" { + return nil, wallet.ErrMissingLabel + } + + if seed == "" { + return nil, wallet.ErrMissingSeed + } + + var wlt = &Wallet{ + Meta: wallet.Meta{ + wallet.MetaFilename: filename, + wallet.MetaLabel: label, + wallet.MetaSeed: seed, + wallet.MetaLastSeed: seed, + wallet.MetaEncrypted: "false", + wallet.MetaType: WalletType, + wallet.MetaVersion: wallet.Version, + wallet.MetaCoin: string(wallet.CoinTypeSkycoin), + wallet.MetaCryptoType: string(crypto.DefaultCryptoType), + wallet.MetaTimestamp: strconv.FormatInt(time.Now().Unix(), 10), + }, + entries: wallet.Entries{}, + decoder: defaultWalletDecoder, + } + + advOpts := &wallet.AdvancedOptions{} + for _, opt := range options { + opt(wlt) + opt(advOpts) + } + + // validateMeta wallet before encrypting + if err := validateMeta(wlt.Meta); err != nil { + return nil, err + } + + generateN := advOpts.GenerateN + if generateN > 0 { + _, err := wlt.GenerateAddresses(wallet.OptionGenerateN(generateN)) + if err != nil { + return nil, err + } + } + + scanN := advOpts.ScanN + if scanN > 0 { + if advOpts.TF == nil { + return nil, errors.New("missing transaction finder for scanning addresses") + } + + if scanN > generateN { + scanN = scanN - generateN + } + + _, err := wlt.ScanAddresses(scanN, advOpts.TF) + if err != nil { + return nil, err + } + } + + // encrypts wallet if options.Encrypt is true + if advOpts.Encrypt { + if wlt.IsTemp() { + return nil, wallet.ErrEncryptTempWallet + } + + if len(advOpts.Password) == 0 { + return nil, wallet.ErrMissingPassword + } + + if err := wlt.Lock(advOpts.Password); err != nil { + return nil, err + } + } else { + if len(advOpts.Password) > 0 { + return nil, wallet.ErrMissingEncrypt + } + } + + // validateMeta again after encrypted + if err := validateMeta(wlt.Meta); err != nil { + return nil, err + } + + return wlt, nil +} + +func validateMeta(m wallet.Meta) error { + if m[wallet.MetaType] != WalletType { + return wallet.ErrInvalidWalletType + } + + if err := wallet.ValidateMeta(m); err != nil { + return err + } + + if err := wallet.ValidateMetaCryptoType(m); err != nil { + return err + } + + return wallet.ValidateMetaSeed(m) +} + +// SetDecoder sets the decoder +func (w *Wallet) SetDecoder(d wallet.Decoder) { + w.decoder = d +} + +// Serialize encodes the wallet into bytes +func (w Wallet) Serialize() ([]byte, error) { + if w.decoder == nil { + w.decoder = defaultWalletDecoder + } + + return w.decoder.Encode(&w) +} + +// Deserialize decodes the wallet from bytes +func (w *Wallet) Deserialize(data []byte) error { + if w.decoder == nil { + w.decoder = defaultWalletDecoder + } + + wlt, err := w.decoder.Decode(data) + if err != nil { + return err + } + + w2 := wlt.(*Wallet) + w2.decoder = w.decoder + *w = *w2 + return nil +} + +// Lock encrypts the sensitive data of the wallet +func (w *Wallet) Lock(password []byte) error { + if w.IsTemp() { + return wallet.ErrEncryptTempWallet + } + + if len(password) == 0 { + return wallet.ErrMissingPassword + } + + if w.IsEncrypted() { + return wallet.ErrWalletEncrypted + } + + wlt := w.Clone().(*Wallet) + + ss := make(wallet.Secrets) + defer func() { + ss.Erase() + wlt.Erase() + }() + + wlt.packSecrets(ss) + + sb, err := ss.Serialize() + if err != nil { + return err + } + + cryptoType := wlt.CryptoType() + if cryptoType == "" { + cryptoType = crypto.DefaultCryptoType + } + + cryptor, err := crypto.GetCrypto(cryptoType) + if err != nil { + return err + } + + encSecret, err := cryptor.Encrypt(sb, password) + if err != nil { + return err + } + + wlt.SetEncrypted(cryptoType, string(encSecret)) + + wlt.Erase() + + w.Erase() + + w.copyFrom(wlt) + return nil +} + +// Unlock unlock the encrypted wallet +func (w *Wallet) Unlock(password []byte) (wallet.Wallet, error) { + if !w.IsEncrypted() { + return nil, wallet.ErrWalletNotEncrypted + } + + if len(password) == 0 { + return nil, wallet.ErrMissingPassword + } + + sstr := w.Secrets() + if sstr == "" { + return nil, errors.New("missing secrets") + } + + ct := w.CryptoType() + if ct == "" { + return nil, errors.New("missing crypto type") + } + + cryptor, err := crypto.GetCrypto(ct) + if err != nil { + return nil, err + } + + sb, err := cryptor.Decrypt([]byte(sstr), password) + if err != nil { + return nil, wallet.ErrInvalidPassword + } + + defer func() { + // Wipes the data from secrets bytes buffer + for i := range sb { + sb[i] = 0 + } + }() + + ss := make(wallet.Secrets) + defer ss.Erase() + if err := ss.Deserialize(sb); err != nil { + return nil, err + } + + cw := w.Clone().(*Wallet) + if err := cw.unpackSecrets(ss); err != nil { + return nil, err + } + cw.SetDecrypted() + return cw, nil +} + +// packSecrets copies data from decrypted wallets into the wallet container +func (w *Wallet) packSecrets(ss wallet.Secrets) { + ss.Set(wallet.SecretSeed, w.Seed()) + ss.Set(wallet.SecretLastSeed, w.LastSeed()) + + // Saves entry secret keys in wallet + for _, e := range w.entries { + ss.Set(e.Address.String(), e.Secret.Hex()) + } +} + +// unpackSecrets copies data from decrypted wallet into the wallet +func (w *Wallet) unpackSecrets(ss wallet.Secrets) error { + seed, ok := ss.Get(wallet.SecretSeed) + if !ok { + return errors.New("seed doesn't exist in wallet") + } + w.SetSeed(seed) + + lastSeed, ok := ss.Get(wallet.SecretLastSeed) + if !ok { + return errors.New("lastSeed doesn't exist in wallet") + } + w.SetLastSeed(lastSeed) + + return w.entries.UnpackSecretKeys(ss) +} + +// Fingerprint returns a unique ID fingerprint for this wallet, composed of its initial address +// and wallet type +func (w *Wallet) Fingerprint() string { + addr := "" + if len(w.entries) == 0 { + if !w.IsEncrypted() { + _, pk, _ := cipher.MustDeterministicKeyPairIterator([]byte(w.Meta.Seed())) + addr = wallet.AddressConstructor(w.Meta)(pk).String() + } + } else { + addr = w.entries[0].Address.String() + } + return fmt.Sprintf("%s-%s", w.Type(), addr) +} + +// Clone clones the wallet a new wallet object +func (w *Wallet) Clone() wallet.Wallet { + return &Wallet{ + Meta: w.Meta.Clone(), + entries: w.entries.Clone(), + decoder: w.decoder, + } +} + +// copyFrom copies the src wallet to w +func (w *Wallet) copyFrom(src *Wallet) { + w.Meta = src.Meta.Clone() + w.entries = src.entries.Clone() +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *Wallet) CopyFromRef(src wallet.Wallet) { + *w = *(src.(*Wallet)) +} + +// Accounts is not implemented, it is an interface for bip44 wallet. +func (w *Wallet) Accounts() []wallet.Bip44Account { + return nil +} + +// Erase wipes secret fields in wallet +func (w *Wallet) Erase() { + w.Meta.EraseSeeds() + w.Meta.SetLastSeed("") + w.entries.Erase() +} + +// Validate validates the wallet +func (w *Wallet) Validate() error { + if err := w.Meta.Validate(); err != nil { + return err + } + + walletType := w.Meta.Type() + if !wallet.IsValidWalletType(walletType) { + return wallet.ErrInvalidWalletType + } + + if !w.IsEncrypted() { + if s := w.Seed(); s == "" { + return errors.New("seed missing in unencrypted deterministic wallet") + } + + if s := w.LastSeed(); s == "" { + return errors.New("lastSeed missing in unencrypted deterministic wallet") + } + } + return nil +} + +// ScanAddresses scans ahead N addresses, truncating up to the highest address with any transaction history. +func (w *Wallet) ScanAddresses(scanN uint64, tf wallet.TransactionsFinder) ([]cipher.Addresser, error) { + if w.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + + if scanN == 0 { + return nil, nil + } + + w2 := w.Clone().(*Wallet) + + nExistingAddrs := uint64(len(w2.entries)) + + // Generate the addresses to scan + addrs, err := w2.GenerateAddresses(wallet.OptionGenerateN(scanN)) + if err != nil { + return nil, err + } + + // Find if these addresses had any activity + active, err := tf.AddressesActivity(addrs) + if err != nil { + return nil, err + } + + // Check activity from the last one until we find the address that has activity + var keepNum uint64 + for i := len(active) - 1; i >= 0; i-- { + if active[i] { + keepNum = uint64(i + 1) + break + } + } + + // Regenerate addresses up to nExistingAddrs + nAddAddrs. + // This is necessary to keep the lastSeed updated. + w2.reset() + //if _, err := w2.GenerateSkycoinAddresses(nExistingAddrs + keepNum); err != nil { + // return nil, err + //} + + if _, err := w2.GenerateAddresses(wallet.OptionGenerateN(nExistingAddrs + keepNum)); err != nil { + return nil, err + } + + *w = *w2 + + return addrs[:keepNum], nil +} + +// GenerateAddresses generates N addresses +func (w *Wallet) GenerateAddresses(options ...wallet.Option) ([]cipher.Addresser, error) { + if w.Meta.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + + num := wallet.GetGenerateNFromOptions(options...) + if num == 0 { + return nil, nil + } + + var seckeys []cipher.SecKey + var seed []byte + if len(w.entries) == 0 { + seed, seckeys = cipher.MustGenerateDeterministicKeyPairsSeed([]byte(w.Meta.Seed()), int(num)) + } else { + sd, err := hex.DecodeString(w.Meta.LastSeed()) + if err != nil { + return nil, fmt.Errorf("decode hex seed failed: %v", err) + } + seed, seckeys = cipher.MustGenerateDeterministicKeyPairsSeed(sd, int(num)) + } + + w.Meta.SetLastSeed(hex.EncodeToString(seed)) + + addrs := make([]cipher.Addresser, len(seckeys)) + makeAddress := wallet.AddressConstructor(w.Meta) + for i, s := range seckeys { + p := cipher.MustPubKeyFromSecKey(s) + a := makeAddress(p) + addrs[i] = a + w.entries = append(w.entries, wallet.Entry{ + Address: a, + Secret: s, + Public: p, + }) + } + return addrs, nil +} + +// GetAddresses returns all addresses in wallet +func (w *Wallet) GetAddresses(_ ...wallet.Option) ([]cipher.Addresser, error) { + return w.entries.GetAddresses(), nil +} + +// GetEntries returns a copy of all entries held by the wallet +func (w *Wallet) GetEntries(_ ...wallet.Option) (wallet.Entries, error) { + return w.entries.Clone(), nil +} + +// GetEntryAt returns entry at a given index in the entries array +func (w *Wallet) GetEntryAt(i int, _ ...wallet.Option) (wallet.Entry, error) { + if i < 0 || i >= len(w.entries) { + return wallet.Entry{}, fmt.Errorf("entry index %d is out of range", i) + } + + return w.entries[i], nil +} + +// GetEntry returns entry of given address +func (w *Wallet) GetEntry(a cipher.Addresser, _ ...wallet.Option) (wallet.Entry, error) { + e, ok := w.entries.Get(a) + if !ok { + return wallet.Entry{}, wallet.ErrEntryNotFound + } + return e, nil +} + +// HasEntry returns true if the wallet has an Entry with a given cipher.Address. +func (w *Wallet) HasEntry(a cipher.Addresser, _ ...wallet.Option) (bool, error) { + return w.entries.Has(a), nil +} + +// EntriesLen returns the number of entries in the wallet +func (w *Wallet) EntriesLen(_ ...wallet.Option) (int, error) { + return len(w.entries), nil +} + +// reset resets the wallet entries and move the lastSeed to origin +func (w *Wallet) reset() { + w.entries = wallet.Entries{} + w.Meta.SetLastSeed(w.Meta.Seed()) +} + +// Loader implements the wallet.Loader interface +type Loader struct{} + +// Load loads a determinisitc wallet from bytes +func (l Loader) Load(data []byte) (wallet.Wallet, error) { + w := &Wallet{} + if err := w.Deserialize(data); err != nil { + return nil, err + } + + return w, nil +} + +// Creator implements the wallet.Creator interface +type Creator struct{} + +// Create creates a deterministic wallet +func (c Creator) Create(filename, label, seed string, options wallet.Options) (wallet.Wallet, error) { + return NewWallet(filename, label, seed, convertOptions(options)...) +} + +func convertOptions(options wallet.Options) []wallet.Option { + var opts []wallet.Option + + if options.Coin != "" { + opts = append(opts, wallet.OptionCoinType(options.Coin)) + } + + if options.CryptoType != "" { + opts = append(opts, wallet.OptionCryptoType(options.CryptoType)) + } + + if options.Decoder != nil { + opts = append(opts, wallet.OptionDecoder(options.Decoder)) + } + + if options.Encrypt { + opts = append(opts, wallet.OptionEncrypt(true)) + opts = append(opts, wallet.OptionPassword(options.Password)) + } + + if options.GenerateN > 0 { + opts = append(opts, wallet.OptionGenerateN(options.GenerateN)) + } + + if options.ScanN > 0 { + opts = append(opts, wallet.OptionScanN(options.ScanN)) + opts = append(opts, wallet.OptionTransactionsFinder(options.TF)) + } + + if options.Temp { + opts = append(opts, wallet.OptionTemp(true)) + } + + return opts +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/entry.go b/vendor/github.com/skycoin/skycoin/src/wallet/entry.go new file mode 100644 index 0000000000..4bb0a3bc0b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/entry.go @@ -0,0 +1,122 @@ +package wallet + +import ( + "encoding/hex" + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" +) + +// Entry represents the wallet entry +type Entry struct { + Address cipher.Addresser + Public cipher.PubKey + Secret cipher.SecKey + ChildNumber uint32 // For bip32/bip44 + Change uint32 // For bip44 +} + +// SkycoinAddress returns the Skycoin address of an entry. Panics if Address is not a Skycoin address +func (we Entry) SkycoinAddress() cipher.Address { + return we.Address.(cipher.Address) +} + +// BitcoinAddress returns the Skycoin address of an entry. Panics if Address is not a Bitcoin address +func (we Entry) BitcoinAddress() cipher.BitcoinAddress { + return we.Address.(cipher.BitcoinAddress) +} + +// Verify checks that the public key is derivable from the secret key, +// and that the public key is associated with the address +func (we *Entry) Verify() error { + pk, err := cipher.PubKeyFromSecKey(we.Secret) + if err != nil { + return err + } + + if pk != we.Public { + return errors.New("invalid public key for secret key") + } + + return we.VerifyPublic() +} + +// VerifyPublic checks that the public key is associated with the address +func (we *Entry) VerifyPublic() error { + if err := we.Public.Verify(); err != nil { + return err + } + return we.Address.Verify(we.Public) +} + +// Entries are an array of wallet entries +type Entries []Entry + +// Clone make an copy of the entire entries. +func (entries Entries) Clone() Entries { + if len(entries) == 0 { + return nil + } + return append(Entries{}, entries...) +} + +// Has checks if entries contains the entry with specified address +func (entries Entries) Has(a cipher.Addresser) bool { + // This doesn't use getEntry() to avoid copying an Entry in the return value, + // which may contain a secret key + for _, e := range entries { + if e.Address == a { + return true + } + } + return false +} + +// Get returns the entry of specific address +func (entries Entries) Get(a cipher.Addresser) (Entry, bool) { + for _, e := range entries { + if e.Address == a { + return e, true + } + } + return Entry{}, false +} + +// GetAddresses returns all addresses +func (entries Entries) GetAddresses() []cipher.Addresser { + addrs := make([]cipher.Addresser, len(entries)) + for i, e := range entries { + addrs[i] = e.Address + } + return addrs +} + +// Erase wipes private keys in entries +func (entries Entries) Erase() { + for i := range entries { + for j := range entries[i].Secret { + entries[i].Secret[j] = 0 + } + entries[i].Secret = cipher.SecKey{} + } +} + +// UnpackSecretKeys for each entry, look for the secret key in the Secrets dict, keyed by address +func (entries Entries) UnpackSecretKeys(ss Secrets) error { + for i, e := range entries { + sstr, ok := ss.Get(e.Address.String()) + if !ok { + return fmt.Errorf("secret of address %s doesn't exist in secrets", e.Address) + } + + s, err := hex.DecodeString(sstr) + if err != nil { + return fmt.Errorf("decode secret hex string failed: %v", err) + } + + copy(entries[i].Secret[:], s[:]) + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/loaders.go b/vendor/github.com/skycoin/skycoin/src/wallet/loaders.go new file mode 100644 index 0000000000..93a5cb606c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/loaders.go @@ -0,0 +1,53 @@ +package wallet + +import ( + "fmt" + "sync" +) + +var walletLoaders loaders + +// RegisterLoader registers a wallet Loader +func RegisterLoader(walletType string, l Loader) error { + return walletLoaders.add(walletType, l) +} + +func getLoader(walletType string) (Loader, bool) { + return walletLoaders.get(walletType) +} + +// Loader is the interface that wraps the Load method. +// +// Load loads wallet from data bytes +type Loader interface { + Load(data []byte) (Wallet, error) +} + +type loaders struct { + sync.Mutex + wls map[string]Loader +} + +// Add add a new wallet type Loader +func (ls *loaders) add(walletType string, l Loader) error { + ls.Lock() + defer ls.Unlock() + if ls.wls == nil { + ls.wls = map[string]Loader{} + } + + if _, ok := ls.wls[walletType]; ok { + return fmt.Errorf("wallet loader for %s already exists", walletType) + } + + ls.wls[walletType] = l + return nil +} + +// Get returns the wallet Loader base on wallet type +func (ls *loaders) get(walletType string) (Loader, bool) { + ls.Lock() + defer ls.Unlock() + c, ok := ls.wls[walletType] + return c, ok +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/meta.go b/vendor/github.com/skycoin/skycoin/src/wallet/meta.go new file mode 100644 index 0000000000..0c2eca445b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/meta.go @@ -0,0 +1,348 @@ +package wallet + +import ( + "errors" + "strconv" + "strings" + + "github.com/skycoin/skycoin/src/cipher/bip44" + "github.com/skycoin/skycoin/src/cipher/crypto" +) + +// wallet meta fields +const ( + MetaVersion = "version" // wallet version + MetaFilename = "filename" // wallet file name + MetaLabel = "label" // wallet label + MetaTimestamp = "tm" // the timestamp when creating the wallet + MetaType = "type" // wallet type + MetaCoin = "coin" // coin type + MetaEncrypted = "encrypted" // whether the wallet is encrypted + MetaCryptoType = "cryptoType" // encryption/decryption type + MetaSeed = "seed" // wallet seed + MetaLastSeed = "lastSeed" // seed for generating next address [deterministic wallets] + MetaSecrets = "secrets" // secrets which records the encrypted seeds and secrets of address entries + MetaBip44Coin = "bip44Coin" // bip44 coin type + MetaAccountsHash = "accountsHash" // accounts hash + MetaSeedPassphrase = "seedPassphrase" // seed passphrase [bip44 wallets] + MetaXPub = "xpub" // xpub key [xpub wallets] + MetaTemp = "temp" // whether the wallet is a temporary wallet +) + +//const ( +// // CoinTypeSkycoin skycoin type +// CoinTypeSkycoin CoinType = "skycoin" +// // CoinTypeBitcoin bitcoin type +// CoinTypeBitcoin CoinType = "bitcoin" +//) + +// CoinType represents the wallet coin type, which refers to the pubkey2addr method used +//type CoinType string + +// Meta holds wallet metadata +type Meta map[string]string + +// Clone make an copy of the Meta +func (m Meta) Clone() Meta { + mm := make(Meta, len(m)) + for k, v := range m { + mm[k] = v + } + return mm +} + +// EraseSeeds wipes the seed and last seed +func (m Meta) EraseSeeds() { + m.SetSeed("") +} + +// Find returns a key value from the metadata map +func (m Meta) Find(k string) string { + return m[k] +} + +// Type gets the wallet type +func (m Meta) Type() string { + return m[MetaType] +} + +// Version gets the wallet version +func (m Meta) Version() string { + return m[MetaVersion] +} + +// SetVersion sets the wallet version +func (m Meta) SetVersion(v string) { + m[MetaVersion] = v +} + +// Filename gets the wallet filename +func (m Meta) Filename() string { + return m[MetaFilename] +} + +// SetFilename sets the wallet filename +func (m Meta) SetFilename(fn string) { + m[MetaFilename] = fn +} + +// Label gets the wallet label +func (m Meta) Label() string { + return m[MetaLabel] +} + +// SetLabel sets the wallet label +func (m Meta) SetLabel(label string) { + m[MetaLabel] = label +} + +// LastSeed returns the last seed +func (m Meta) LastSeed() string { + return m[MetaLastSeed] +} + +// SetLastSeed sets or updates the last seed +func (m Meta) SetLastSeed(lseed string) { + m[MetaLastSeed] = lseed +} + +// Seed returns the seed +func (m Meta) Seed() string { + return m[MetaSeed] +} + +// SetSeed sets the seed +func (m Meta) SetSeed(seed string) { + m[MetaSeed] = seed +} + +// SeedPassphrase returns the seed passphrase +func (m Meta) SeedPassphrase() string { + return m[MetaSeedPassphrase] +} + +// SetSeedPassphrase sets the seed passphrase +func (m Meta) SetSeedPassphrase(p string) { + m[MetaSeedPassphrase] = p +} + +// Coin returns the wallet's coin type +func (m Meta) Coin() CoinType { + return CoinType(m[MetaCoin]) +} + +// SetCoin sets the wallet's coin type +func (m Meta) SetCoin(ct CoinType) { + m[MetaCoin] = string(ct) +} + +// Bip44Coin returns the bip44 coin type, please +// check the second return value to see if it does +// exist in the Meta data before using it. +func (m Meta) Bip44Coin() *bip44.CoinType { + c, ok := m[MetaBip44Coin] + if !ok { + return nil + } + x, err := strconv.ParseUint(c, 10, 32) + if err != nil { + panic(err) + } + t := bip44.CoinType(x) + + return &t +} + +// SetBip44Coin sets the bip44 coin type code +func (m Meta) SetBip44Coin(ct bip44.CoinType) { + m[MetaBip44Coin] = strconv.FormatUint(uint64(ct), 10) +} + +func (m Meta) setIsEncrypted(encrypt bool) { + m[MetaEncrypted] = strconv.FormatBool(encrypt) +} + +// SetEncrypted sets encryption fields +func (m Meta) SetEncrypted(cryptoType crypto.CryptoType, encryptedSecrets string) { + m.setCryptoType(cryptoType) + m.setSecrets(encryptedSecrets) + m.setIsEncrypted(true) +} + +// SetDecrypted unsets encryption fields +func (m Meta) SetDecrypted() { + m.setIsEncrypted(false) + m.setSecrets("") + delete(m, MetaSecrets) +} + +// IsEncrypted checks whether the wallet is encrypted. +func (m Meta) IsEncrypted() bool { + encStr, ok := m[MetaEncrypted] + if !ok { + return false + } + + b, err := strconv.ParseBool(encStr) + if err != nil { + // This can't happen, the meta.encrypted value is either set by + // setEncrypted() method or converted in ReadableWallet.toWallet(). + // toWallet() method will throw error if the meta.encrypted string is invalid. + // logger.Critical().WithError(err).Error("parse wallet.meta.encrypted string failed") + panic(err) + } + return b +} + +func (m Meta) setCryptoType(tp crypto.CryptoType) { + m[MetaCryptoType] = string(tp) +} + +// CryptoType returns the encryption type +func (m Meta) CryptoType() crypto.CryptoType { + return crypto.CryptoType(m[MetaCryptoType]) +} + +// SetCryptoType sets the encryption type +func (m Meta) SetCryptoType(ct crypto.CryptoType) { + m[MetaCryptoType] = string(ct) +} + +// Secrets returns the encrypted wallet secrets +func (m Meta) Secrets() string { + return m[MetaSecrets] +} + +func (m Meta) setSecrets(s string) { + m[MetaSecrets] = s +} + +// Timestamp returns the timestamp +func (m Meta) Timestamp() int64 { + // Intentionally ignore the error when parsing the timestamp, + // if it isn't valid or is missing it will be set to 0. + // Also, this value is validated by wallet.validate() + x, _ := strconv.ParseInt(m[MetaTimestamp], 10, 64) //nolint:errcheck + return x +} + +// SetTimestamp sets the timestamp +func (m Meta) SetTimestamp(t int64) { + m[MetaTimestamp] = strconv.FormatInt(t, 10) +} + +// AddressConstructor returns a function to create a cipher.Addresser from a cipher.PubKey +// func (m Meta) AddressConstructor() func(cipher.PubKey) cipher.Addresser { +// switch m.Coin() { +// case CoinTypeSkycoin: +// return func(pk cipher.PubKey) cipher.Addresser { +// return cipher.AddressFromPubKey(pk) +// } +// case CoinTypeBitcoin: +// return func(pk cipher.PubKey) cipher.Addresser { +// return cipher.BitcoinAddressFromPubKey(pk) +// } +// default: +// logger.Panicf("Invalid wallet coin type %q", m.Coin()) +// return nil +// } +// } + +// SetXPub sets xpub +func (m Meta) SetXPub(xpub string) { + m[MetaXPub] = xpub +} + +// XPub returns the wallet's configured XPub key +func (m Meta) XPub() string { + return m[MetaXPub] +} + +// Validate validates the meta data +func (m Meta) Validate() error { + if fn := m[MetaFilename]; fn == "" { + return errors.New("filename not set") + } + + if tm := m[MetaTimestamp]; tm != "" { + _, err := strconv.ParseInt(tm, 10, 64) + if err != nil { + return errors.New("invalid timestamp") + } + } + + _, ok := m[MetaType] + if !ok { + return errors.New("type field not set") + } + + if coinType := m[MetaCoin]; coinType == "" { + return errors.New("coin field not set") + } + + var isEncrypted bool + if encStr, ok := m[MetaEncrypted]; ok { + // validate the encrypted value + var err error + isEncrypted, err = strconv.ParseBool(encStr) + if err != nil { + return errors.New("encrypted field is not a valid bool") + } + } + + if isEncrypted { + cryptoType, ok := m[MetaCryptoType] + if !ok { + return errors.New("crypto type field not set") + } + + if _, err := crypto.GetCrypto(crypto.CryptoType(cryptoType)); err != nil { + return errors.New("unknown crypto type") + } + + if s := m[MetaSecrets]; s == "" { + return errors.New("wallet is encrypted, but secrets field not set") + } + + if s := m[MetaSeed]; s != "" { + return errors.New("seed should not be visible in encrypted wallets") + } + + if s := m[MetaLastSeed]; s != "" { + return errors.New("lastSeed should not be visible in encrypted wallets") + } + } else { + if s := m[MetaSecrets]; s != "" { + return errors.New("secrets should not be in unencrypted wallets") + } + } + return nil +} + +// ResolveCoinType normalizes a coin type string to a CoinType constant +func ResolveCoinType(s string) (CoinType, error) { + switch strings.ToLower(s) { + case "sky", "skycoin": + return CoinTypeSkycoin, nil + case "btc", "bitcoin": + return CoinTypeBitcoin, nil + default: + return CoinType(""), errors.New("invalid coin type") + } +} + +// SetTemp sets temp +func (m Meta) SetTemp(temp bool) { + if temp { + m[MetaTemp] = "true" + } +} + +// IsTemp returns whether the wallet is a temporary wallet +func (m Meta) IsTemp() bool { + if m[MetaTemp] == "true" { + return true + } + + return false +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/options.go b/vendor/github.com/skycoin/skycoin/src/wallet/options.go new file mode 100644 index 0000000000..db9d2e392c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/options.go @@ -0,0 +1,183 @@ +package wallet + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/bip44" + "github.com/skycoin/skycoin/src/cipher/crypto" +) + +// ChainMode represents the bip44 chain mode. AllChains = ExternalChain | ChangeChain +type ChainMode uint32 + +const ( + DefaultChain ChainMode = 0 // indicates the default chain when no chain is specified. + ExternalChain = 1 // indicates the external chain + ChangeChain = 2 // indicates the change chain + AllChains = 3 // indicates both external and change chains +) + +// Option represents the general options, it can be used to set optional +// parameters while creating a new wallet. Also, can be used to get +// entries service of a wallet. +type Option func(interface{}) + +// Bip44EntriesOptions represents the options that will be used +// by bip44 to get entries service +type Bip44EntriesOptions struct { + Account uint32 + ChainMode ChainMode +} + +// OptionAccount is the option type for specifying a bip44 account +func OptionAccount(index uint32) Option { + return func(opts interface{}) { + bip44, ok := opts.(*Bip44EntriesOptions) + if !ok { + return + } + bip44.Account = index + } +} + +// OptionChange is the option for selecting the change chain +func OptionChange() Option { + return func(opts interface{}) { + o, ok := opts.(*Bip44EntriesOptions) + if !ok { + return + } + + o.ChainMode += ChangeChain + } +} + +// OptionExternal is the option type for selecting the external chain +func OptionExternal() Option { + return func(opts interface{}) { + o, ok := opts.(*Bip44EntriesOptions) + if !ok { + return + } + + o.ChainMode += ExternalChain + } +} + +func walletOptionFunc(f func(Wallet)) Option { + return func(v interface{}) { + w, ok := v.(Wallet) + if !ok { + return + } + f(w) + } +} + +// OptionCryptoType is the option type for setting wallet crypto type +func OptionCryptoType(cryptoType crypto.CryptoType) Option { + return walletOptionFunc(func(w Wallet) { + w.SetCryptoType(cryptoType) + }) +} + +// OptionCoinType is the option type for setting wallet coin type +func OptionCoinType(coinType CoinType) Option { + return walletOptionFunc(func(w Wallet) { + w.SetCoin(coinType) + }) +} + +// OptionDecoder is the option type for setting wallet decoder +func OptionDecoder(d Decoder) Option { + return walletOptionFunc(func(w Wallet) { + w.SetDecoder(d) + }) +} + +// OptionTemp is the option for setting whether wallet is a temporary wallet +func OptionTemp(temp bool) Option { + return walletOptionFunc(func(w Wallet) { + w.SetTemp(temp) + }) +} + +// OptionBip44Coin is the option type for setting bip44 coin type for bip44 wallet +func OptionBip44Coin(ct *bip44.CoinType) Option { + return walletOptionFunc(func(w Wallet) { + w.SetBip44Coin(*ct) + }) +} + +// AdvancedOptions are advanced options that can be used when creating a new wallet +type AdvancedOptions struct { + DefaultBip44AccountName string + Encrypt bool + Password []byte + GenerateN uint64 + ScanN uint64 + TF TransactionsFinder + PrivateKeys []cipher.SecKey // private keys of collection wallet +} + +// advancedOptionFunc is a helper function that assert the +// interface in wallet.Option to AdvancedOptions, so that +// the caller can use AdvancedOptions directly. +func advancedOptionFunc(f func(*AdvancedOptions)) Option { + return func(v interface{}) { + o, ok := v.(*AdvancedOptions) + if !ok { + return + } + f(o) + } +} + +// OptionDefaultBip44AccountName can be used to set the bip44 default account name +func OptionDefaultBip44AccountName(name string) Option { + return advancedOptionFunc(func(opts *AdvancedOptions) { + opts.DefaultBip44AccountName = name + }) +} + +// OptionEncrypt can be used to set whether the wallet should be encrypted when creating a new wallet +func OptionEncrypt(encrypt bool) Option { + return advancedOptionFunc(func(opts *AdvancedOptions) { + opts.Encrypt = encrypt + }) +} + +// OptionPassword can be used to set the password for encrypting when creating a new wallet. +func OptionPassword(password []byte) Option { + return advancedOptionFunc(func(opts *AdvancedOptions) { + opts.Password = password + }) +} + +// OptionScanN can be used to set the scanning number when creating a new wallet +func OptionScanN(n uint64) Option { + return advancedOptionFunc(func(opts *AdvancedOptions) { + opts.ScanN = n + }) +} + +// OptionTransactionsFinder can be used to set the transactions finder when creating a new wallet +func OptionTransactionsFinder(tf TransactionsFinder) Option { + return advancedOptionFunc(func(opts *AdvancedOptions) { + opts.TF = tf + }) +} + +// OptionGenerateN can be used to set the initial number of addresses to generate +// when creating a new wallet +func OptionGenerateN(n uint64) Option { + return advancedOptionFunc(func(opts *AdvancedOptions) { + opts.GenerateN = n + }) +} + +// OptionCollectionPrivateKeys can be used to set the private keys when creating a collection wallet +func OptionCollectionPrivateKeys(keys []cipher.SecKey) Option { + return advancedOptionFunc(func(opts *AdvancedOptions) { + opts.PrivateKeys = keys + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/secrets.go b/vendor/github.com/skycoin/skycoin/src/wallet/secrets.go new file mode 100644 index 0000000000..c38de399ee --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/secrets.go @@ -0,0 +1,46 @@ +package wallet + +import ( + "encoding/json" +) + +const ( + // SecretSeed key of seed in Secrets + SecretSeed = "seed" + // SecretLastSeed key of last sees in Secrets + SecretLastSeed = "lastSeed" + // SecretSeedPassphrase key of seed passphrase in Secrets + SecretSeedPassphrase = "seedPassphrase" +) + +// Secrets hold secret data, to be encrypted +type Secrets map[string]string + +// Get returns the secret value of given key +func (s Secrets) Get(key string) (string, bool) { + v, ok := s[key] + return v, ok +} + +// Set sets the secret key and value +func (s Secrets) Set(key, v string) { + s[key] = v +} + +// Serialize encodes the secrets into []bytes +func (s Secrets) Serialize() ([]byte, error) { + return json.Marshal(s) +} + +// Deserialize decodes the secrets from []bytes +func (s Secrets) Deserialize(data []byte) error { + return json.Unmarshal(data, &s) +} + +// Erase wipes all secrets +func (s Secrets) Erase() { + for k := range s { + s[k] = "" + delete(s, k) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/service.go b/vendor/github.com/skycoin/skycoin/src/wallet/service.go new file mode 100644 index 0000000000..c07e972d22 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/service.go @@ -0,0 +1,870 @@ +package wallet + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + "sync" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/bip44" + "github.com/skycoin/skycoin/src/cipher/crypto" + "github.com/skycoin/skycoin/src/util/file" +) + +// TransactionsFinder interface for finding address related transaction hashes +type TransactionsFinder interface { + AddressesActivity(addrs []cipher.Addresser) ([]bool, error) +} + +// Service wallet service struct +type Service struct { + sync.RWMutex + wallets Wallets + config Config + // fingerprints is used to check for duplicate deterministic wallets + fingerprints map[string]string +} + +// Config wallet service config +type Config struct { + WalletDir string + CryptoType crypto.CryptoType + EnableWalletAPI bool + EnableSeedAPI bool + Bip44Coin *bip44.CoinType +} + +// NewConfig creates a default Config +func NewConfig() Config { + bc := bip44.CoinTypeSkycoin + return Config{ + WalletDir: "./", + CryptoType: crypto.DefaultCryptoType, + EnableWalletAPI: false, + EnableSeedAPI: false, + Bip44Coin: &bc, + } +} + +// NewService new wallet service +func NewService(c Config) (*Service, error) { + serv := &Service{ + config: c, + fingerprints: make(map[string]string), + } + + if !serv.config.EnableWalletAPI { + return serv, nil + } + + if err := os.MkdirAll(c.WalletDir, os.FileMode(0700)); err != nil { + return nil, fmt.Errorf("failed to create wallet directory %s: %v", c.WalletDir, err) + } + + // Removes .wlt.bak files before loading wallets + if err := removeBackupFiles(serv.config.WalletDir); err != nil { + return nil, fmt.Errorf("remove .wlt.bak files in %v failed: %v", serv.config.WalletDir, err) + } + + // Load all wallets from disk + w, err := serv.loadWallets() + if err != nil { + return nil, fmt.Errorf("failed to load all wallets: %v", err) + } + + // Abort if there are duplicate wallets (identified by fingerprint) on disk + if wltID, fp, hasDup := w.containsDuplicate(); hasDup { + return nil, fmt.Errorf("duplicate wallet found with fingerprint %s in file %q", fp, wltID) + } + + // Abort if there are empty deterministic wallets on disk + if wltID, hasEmpty := w.containsEmpty(); hasEmpty { + return nil, fmt.Errorf("empty wallet file found: %q", wltID) + } + + serv.setWallets(w) + + fields := logrus.Fields{ + "walletDir": serv.config.WalletDir, + } + if serv.config.Bip44Coin != nil { + fields["bip44Coin"] = *serv.config.Bip44Coin + } + logger.WithFields(fields).Debug("wallet.NewService complete") + + return serv, nil +} + +// WalletDir returns the configured wallet directory +func (serv *Service) WalletDir() (string, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return "", ErrWalletAPIDisabled + } + return serv.config.WalletDir, nil +} + +// SetEnableWalletAPI sets whether or not enables the wallet related APIs +func (serv *Service) SetEnableWalletAPI(enable bool) { + serv.config.EnableWalletAPI = enable +} + +func (serv *Service) loadWallets() (Wallets, error) { + dir := serv.config.WalletDir + entries, err := ioutil.ReadDir(dir) + if err != nil { + logger.WithError(err).WithField("dir", dir).Error("loadWallets: ioutil.ReadDir failed") + return nil, err + } + + wallets := Wallets{} + for _, e := range entries { + if e.Mode().IsRegular() { + name := e.Name() + if !strings.HasSuffix(name, WalletExt) { + logger.WithField("filename", name).Info("loadWallets: skipping file") + continue + } + + fullPath := filepath.Join(serv.config.WalletDir, name) + w, err := serv.Load(fullPath) + if err != nil { + logger.WithError(err).WithField("filename", fullPath).Error("loadWallets: loadWallet failed") + return nil, err + } + + if w == nil { + logger.WithField("filename", fullPath).Warning("wallet loading skipped") + continue + } + + logger.WithField("filename", fullPath).Info("loadWallets: loaded wallet") + + wallets[name] = w + } + } + + for name, w := range wallets { + if w.Coin() != CoinTypeSkycoin { + err := fmt.Errorf("LoadWallets only support skycoin wallets, %s is a %s wallet", name, w.Coin()) + logger.WithError(err).WithField("name", name).Error() + return nil, err + } + } + + return wallets, nil +} + +// Load loads wallet from the given wallet file, it won't not affect the +// state of the service it self, the loaded wallet will be returned. +func (serv *Service) Load(filename string) (Wallet, error) { + return Load(filename) +} + +func (serv *Service) updateOptions(opts Options) Options { + // Apply service-configured default settings for wallet options + if opts.Encrypt && opts.CryptoType == "" { + opts.CryptoType = serv.config.CryptoType + } + + if opts.Type == WalletTypeBip44 && opts.Bip44Coin == nil && serv.config.Bip44Coin != nil { + c := *serv.config.Bip44Coin + opts.Bip44Coin = &c + } + + // generate one default address if options.GenerateN is 0 + if opts.GenerateN == 0 { + opts.GenerateN = 1 + } + return opts +} + +// CreateWallet creates a wallet with the given wallet file name and options. +// A address will be automatically generated by default. +func (serv *Service) CreateWallet(wltName string, options Options) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + if wltName == "" { + wltName = serv.generateUniqueWalletFilename() + } + + return serv.loadWallet(wltName, options) +} + +func (serv *Service) createWallet(wltName string, options Options) (Wallet, error) { + if err := options.Validate(); err != nil { + return nil, err + } + + creator, ok := getCreator(options.Type) + if !ok { + return nil, ErrInvalidWalletType + } + + return creator.Create(wltName, options.Label, options.Seed, options) +} + +// loadWallet loads wallet from seed and scan the first N addresses +func (serv *Service) loadWallet(wltName string, options Options) (Wallet, error) { + options = serv.updateOptions(options) + + w, err := serv.createWallet(wltName, options) + if err != nil { + return nil, err + } + + fingerprint := w.Fingerprint() + // Note: collection wallets do not have fingerprints + if fingerprint != "" { + if _, ok := serv.fingerprints[fingerprint]; ok { + logger.WithFields(logrus.Fields{ + "walletType": w.Type(), + "fingerprint": fingerprint, + }).Error("fingerprint conflict") + return nil, NewError(fmt.Errorf("fingerprint conflict for %q wallet", w.Type())) + } + } + + if err := serv.wallets.add(w); err != nil { + return nil, err + } + + if err := Save(w, serv.config.WalletDir); err != nil { + // If save fails, remove the added wallet + serv.wallets.remove(w.Filename()) + return nil, err + } + + if fingerprint != "" { + serv.fingerprints[fingerprint] = w.Filename() + } + + return w.Clone(), nil +} + +func (serv *Service) generateUniqueWalletFilename() string { + wltName := NewWalletFilename() + for { + if w := serv.wallets.get(wltName); w == nil { + break + } + wltName = NewWalletFilename() + } + + return wltName +} + +// EncryptWallet encrypts wallet with password +func (serv *Service) EncryptWallet(wltID string, password []byte) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + if w.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if err := w.Lock(password); err != nil { + return nil, err + } + + // Saves to disk + if err := Save(w, serv.config.WalletDir); err != nil { + return nil, err + } + + // Updates wallets in memory + serv.wallets.set(w) + return w, nil +} + +// DecryptWallet decrypts wallet with password +// TODO: this function will be deprecated in future. +func (serv *Service) DecryptWallet(wltID string, password []byte) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + // Returns error if wallet is not encrypted + if !w.IsEncrypted() { + return nil, ErrWalletNotEncrypted + } + + // Unlocks the wallet + unlockWlt, err := w.Unlock(password) + if err != nil { + return nil, err + } + + // Updates the wallet file + if err := Save(unlockWlt, serv.config.WalletDir); err != nil { + return nil, err + } + + // Sets the decrypted wallet in memory + serv.wallets.set(unlockWlt) + return unlockWlt, nil +} + +// NewAddresses generate address entries in given wallet, +// return nil if wallet does not exist. +// Set password as nil if the wallet is not encrypted, otherwise the password must be provided. +// func (serv *Service) NewAddresses(wltID string, password []byte, num uint64) ([]cipher.Address, error) { +// serv.Lock() +// defer serv.Unlock() + +// if !serv.config.EnableWalletAPI { +// return nil, ErrWalletAPIDisabled +// } + +// w, err := serv.getWallet(wltID) +// if err != nil { +// return nil, err +// } + +// var addrs []cipher.Address +// f := func(wlt Wallet) error { +// var err error +// addrs, err = wlt.GenerateSkycoinAddresses(num) +// return err +// } + +// if w.IsEncrypted() { +// if err := GuardUpdate(w, password, f); err != nil { +// return nil, err +// } +// } else { +// if len(password) != 0 { +// return nil, ErrWalletNotEncrypted +// } + +// if err := f(w); err != nil { +// return nil, err +// } +// } + +// // Checks if the wallet file is writable +// wf := filepath.Join(serv.config.WalletDir, w.Filename()) +// if !file.IsWritable(wf) { +// return nil, ErrWalletPermission +// } + +// // Save the wallet first +// if err := Save(w, serv.config.WalletDir); err != nil { +// return nil, err +// } + +// serv.wallets.set(w) + +// return addrs, nil +// } + +// NewAddresses generate addresses +func (serv *Service) NewAddresses(wltID string, password []byte, options ...Option) ([]cipher.Address, error) { + serv.Lock() + defer serv.Unlock() + + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + var addrs []cipher.Addresser + f := func(w Wallet) error { + var err error + addrs, err = w.GenerateAddresses(options...) + return err + } + + // TODO: Test this + if w.IsEncrypted() { + // Bip44 can generate addresses without unlocking the wallet + // This will generate addresses on bip44 external chain + if w.Type() == WalletTypeBip44 { + if err := f(w); err != nil { + return nil, err + } + } else { + if err := GuardUpdate(w, password, f); err != nil { + return nil, err + } + } + } else { + if len(password) != 0 { + return nil, ErrWalletNotEncrypted + } + + if err := f(w); err != nil { + return nil, err + } + } + + // check if wallet is writable only when it's not a temporary wallet. + // this checking would create a temp file + if !w.IsTemp() { + // Checks if the wallet file is writable + wf := filepath.Join(serv.config.WalletDir, w.Filename()) + if !file.IsWritable(wf) { + return nil, ErrWalletPermission + } + + // Save the wallet + if err := Save(w, serv.config.WalletDir); err != nil { + return nil, err + } + } + + serv.wallets.set(w) + return SkycoinAddresses(addrs), nil +} + +// ScanAddresses scan ahead addresses to see if contains balance. +func (serv *Service) ScanAddresses(wltID string, password []byte, num uint64, tf TransactionsFinder) ([]cipher.Address, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + var addrs []cipher.Addresser + f := func(w Wallet) error { + var err error + addrs, err = w.ScanAddresses(num, tf) + return err + } + + // For bip44 wallets, there is no need to unlock the wallets even it is encrypted. + if w.Type() == WalletTypeBip44 { + if len(password) != 0 { + return nil, NewError(errors.New("password is not required for scanning bip44 wallet addresses")) + } + + if err := f(w); err != nil { + return nil, err + } + } else { + if w.IsEncrypted() { + if err := GuardUpdate(w, password, f); err != nil { + return nil, err + } + } else { + if len(password) != 0 { + return nil, ErrWalletNotEncrypted + } + + if err := f(w); err != nil { + return nil, err + } + } + } + + // Checks if the wallet file is writable + if !w.IsTemp() { + wf := filepath.Join(serv.config.WalletDir, w.Filename()) + if !file.IsWritable(wf) { + return nil, ErrWalletPermission + } + + // Saves the wallet to disk + if err := Save(w, serv.config.WalletDir); err != nil { + return nil, err + } + } + + // Updates wallet in memory + serv.wallets.set(w) + + // return new generated addresses + return SkycoinAddresses(addrs), nil +} + +// GetSkycoinAddresses returns all addresses in given wallet +// func (serv *Service) GetSkycoinAddresses(wltID string) ([]cipher.Address, error) { +// serv.RLock() +// defer serv.RUnlock() +// if !serv.config.EnableWalletAPI { +// return nil, ErrWalletAPIDisabled +// } + +// w, err := serv.getWallet(wltID) +// if err != nil { +// return nil, err +// } + +// return w.GetSkycoinAddresses() +// } + +// GetAddresses returns all addresses of the selected wallet +func (serv *Service) GetAddresses(wltID string, options ...Option) ([]cipher.Address, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + addrs, err := w.GetAddresses(options...) + if err != nil { + return nil, err + } + + return SkycoinAddresses(addrs), nil +} + +// GetWallet returns wallet by id +func (serv *Service) GetWallet(wltID string) (Wallet, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + return serv.getWallet(wltID) +} + +// returns the clone of the wallet of given id +func (serv *Service) getWallet(wltID string) (Wallet, error) { + w := serv.wallets.get(wltID) + if w == nil { + return nil, ErrWalletNotExist + } + return w.Clone(), nil +} + +// GetWallets returns all wallet clones +func (serv *Service) GetWallets() (Wallets, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + wlts := make(Wallets, len(serv.wallets)) + for k, w := range serv.wallets { + wlts[k] = w.Clone() + } + return wlts, nil +} + +// UpdateWalletLabel updates the wallet label +func (serv *Service) UpdateWalletLabel(wltID, label string) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + w.SetLabel(label) + + if err := Save(w, serv.config.WalletDir); err != nil { + return err + } + + serv.wallets.set(w) + return nil +} + +// UnloadWallet removes wallet of given wallet id from the service +func (serv *Service) UnloadWallet(wltID string) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + wlt := serv.wallets.get(wltID) + if wlt != nil { + if fp := wlt.Fingerprint(); fp != "" { + delete(serv.fingerprints, fp) + } + } + + serv.wallets.remove(wltID) + return nil +} + +func (serv *Service) setWallets(wlts Wallets) { + serv.wallets = wlts + + for wltID, wlt := range wlts { + if fp := wlt.Fingerprint(); fp != "" { + serv.fingerprints[fp] = wltID + } + } +} + +// GetWalletSeed returns seed and seed passphrase of encrypted wallet of given wallet id +// Returns ErrWalletNotEncrypted if it's not encrypted +func (serv *Service) GetWalletSeed(wltID string, password []byte) (string, string, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return "", "", ErrWalletAPIDisabled + } + + if !serv.config.EnableSeedAPI { + return "", "", ErrSeedAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return "", "", err + } + + if !w.IsEncrypted() { + return "", "", ErrWalletNotEncrypted + } + + var seed, seedPassphrase string + if err := GuardView(w, password, func(wlt Wallet) error { + seed = wlt.Seed() + seedPassphrase = wlt.SeedPassphrase() + return nil + }); err != nil { + return "", "", err + } + + return seed, seedPassphrase, nil +} + +// UpdateSecrets opens a wallet for modification of secret data and saves it safely +func (serv *Service) UpdateSecrets(wltID string, password []byte, f func(Wallet) error) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + if w.IsEncrypted() { + if err := GuardUpdate(w, password, f); err != nil { + return err + } + } else if len(password) != 0 { + return ErrWalletNotEncrypted + } else { + if err := f(w); err != nil { + return err + } + } + + // Save the wallet to disk + if err := Save(w, serv.config.WalletDir); err != nil { + return err + } + + serv.wallets.set(w) + + return nil +} + +// Update opens a wallet for modification of non-secret data and saves it safely +func (serv *Service) Update(wltID string, f func(Wallet) error) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + if err := f(w); err != nil { + return err + } + + // Save the wallet to disk + if err := Save(w, serv.config.WalletDir); err != nil { + return err + } + + serv.wallets.set(w) + + return nil +} + +// ViewSecrets opens a wallet for reading secret data +func (serv *Service) ViewSecrets(wltID string, password []byte, f func(Wallet) error) error { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + if w.IsEncrypted() { + return GuardView(w, password, f) + } else if len(password) != 0 { + return ErrWalletNotEncrypted + } else { + return f(w) + } +} + +// View opens a wallet for reading non-secret data +func (serv *Service) View(wltID string, f func(Wallet) error) error { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + return f(w) +} + +// RecoverWallet recovers an encrypted wallet from seed. +// The recovered wallet will be encrypted with the new password, if provided. +func (serv *Service) RecoverWallet(wltName, seed, seedPassphrase string, + password []byte) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltName) + if err != nil { + return nil, err + } + + if !w.IsEncrypted() { + return nil, ErrWalletNotEncrypted + } + + switch w.Type() { + case WalletTypeBip44, WalletTypeDeterministic: + default: + return nil, ErrWalletTypeNotRecoverable + } + + // Create a wallet from this seed and compare the fingerprint + w2, err := serv.createWallet(wltName, Options{ + Type: w.Type(), + Coin: w.Coin(), + Bip44Coin: w.Bip44Coin(), + Label: w.Label(), + Seed: seed, + SeedPassphrase: seedPassphrase, + GenerateN: 1, + }) + if err != nil { + err = NewError(fmt.Errorf("RecoverWallet failed to create temporary wallet for fingerprint comparison: %v", err)) + logger.Critical().WithError(err).Error() + return nil, err + } + if w.Fingerprint() != w2.Fingerprint() { + return nil, ErrWalletRecoverSeedWrong + } + + var options []Option + if w.Type() == WalletTypeBip44 { + // regenerate external address for bip44 wallet when creating the wallet + options = append(options, OptionExternal()) + } + + l, err := w.EntriesLen(options...) + if err != nil { + return nil, err + } + + // Create a new wallet with the same number of addresses, encrypting if needed + w3, err := serv.createWallet(wltName, Options{ + Type: w.Type(), + Coin: w.Coin(), + Label: w.Label(), + Seed: seed, + SeedPassphrase: seedPassphrase, + Encrypt: len(password) != 0, + Password: password, + CryptoType: w.CryptoType(), + Bip44Coin: w.Bip44Coin(), + GenerateN: uint64(l), + }) + if err != nil { + return nil, err + } + + if w.Type() == WalletTypeBip44 { + // regenerate external address for bip44 wallet when creating the wallet + cl, err := w.EntriesLen(OptionChange()) + if err != nil { + return nil, err + } + + // regenerate the change addresses + if cl > 1 { + _, err := w3.GenerateAddresses(OptionGenerateN(uint64(cl-1)), OptionChange()) + if err != nil { + return nil, err + } + } + } + + // Preserve the timestamp of the old wallet + w3.SetTimestamp(w.Timestamp()) + + // Save to disk + if err := Save(w3, serv.config.WalletDir); err != nil { + return nil, err + } + + serv.wallets.set(w3) + + return w3.Clone(), nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/transaction.go b/vendor/github.com/skycoin/skycoin/src/wallet/transaction.go new file mode 100644 index 0000000000..10f0936aad --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/transaction.go @@ -0,0 +1,279 @@ +package wallet + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/transaction" +) + +var ( + // ErrUnknownAddress is returned if an address is not found in a wallet + ErrUnknownAddress = NewError(errors.New("address not found in wallet")) + // ErrUnknownUxOut is returned if a uxout is not owned by any address in a wallet + ErrUnknownUxOut = NewError(errors.New("uxout is not owned by any address in the wallet")) + // ErrWalletCantSign is returned is attempting to sign a transaction with a wallet + // that does not have the capability to sign transactions (e.g. an xpub or watch wallet) + ErrWalletCantSign = NewError(errors.New("wallet does not have the signing capability")) +) + +func validateSignIndexes(x []int, uxOuts []coin.UxOut) error { + if len(x) > len(uxOuts) { + return errors.New("Number of signature indexes exceeds number of inputs") + } + + for _, i := range x { + if i >= len(uxOuts) || i < 0 { + return errors.New("Signature index out of range") + } + } + + m := make(map[int]struct{}, len(x)) + for _, i := range x { + if _, ok := m[i]; ok { + return errors.New("Duplicate value in signature indexes") + } + m[i] = struct{}{} + } + + return nil +} + +func copyTransaction(txn *coin.Transaction) *coin.Transaction { + txnHash := txn.Hash() + txnInnerHash := txn.HashInner() + + txn2 := *txn + txn2.Sigs = make([]cipher.Sig, len(txn.Sigs)) + copy(txn2.Sigs, txn.Sigs) + txn2.In = make([]cipher.SHA256, len(txn.In)) + copy(txn2.In, txn.In) + txn2.Out = make([]coin.TransactionOutput, len(txn.Out)) + copy(txn2.Out, txn.Out) + + if txnInnerHash != txn2.HashInner() { + logger.Panic("copyTransaction copy broke InnerHash") + } + if txnHash != txn2.Hash() { + logger.Panic("copyTransaction copy broke Hash") + } + + return &txn2 +} + +// SignTransaction signs a transaction. Specific inputs may be signed by specifying signIndexes. +// If signIndexes is empty, all inputs will be signed. +// The transaction should already have a valid header. The transaction may be partially signed, +// but a valid existing signature cannot be overwritten. +// Clients should avoid signing the same transaction multiple times. +func SignTransaction(w Wallet, txn *coin.Transaction, signIndexes []int, uxOuts []coin.UxOut) (*coin.Transaction, error) { + switch w.Type() { + case WalletTypeXPub: + return nil, ErrWalletCantSign + } + + signedTxn := copyTransaction(txn) + txnInnerHash := signedTxn.HashInner() + + if w.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if txnInnerHash != signedTxn.InnerHash { + return nil, NewError(errors.New("Transaction inner hash does not match computed inner hash")) + } + + if len(signedTxn.Sigs) == 0 { + return nil, NewError(errors.New("Transaction signatures array is empty")) + } + if signedTxn.IsFullySigned() { + return nil, NewError(errors.New("Transaction is fully signed")) + } + + if len(signedTxn.In) == 0 { + return nil, NewError(errors.New("No transaction inputs to sign")) + } + if len(uxOuts) != len(signedTxn.In) { + return nil, errors.New("len(uxOuts) != len(txn.In)") + } + if err := validateSignIndexes(signIndexes, uxOuts); err != nil { + return nil, NewError(err) + } + + nMissingSigs := 0 + for _, s := range signedTxn.Sigs { + if s.Null() { + nMissingSigs++ + } + } + + // Build a mapping of addresses to the inputs that need to be signed + addrsMap := make(map[cipher.Address][]int) + if len(signIndexes) > 0 { + for _, in := range signIndexes { + if !signedTxn.Sigs[in].Null() { + return nil, NewError(fmt.Errorf("Transaction is already signed at index %d", in)) + } + addrsMap[uxOuts[in].Body.Address] = append(addrsMap[uxOuts[in].Body.Address], in) + } + } else { + for i, o := range uxOuts { + if !signedTxn.Sigs[i].Null() { + continue + } + addrsMap[o.Body.Address] = append(addrsMap[o.Body.Address], i) + } + } + + // Check that the wallet has all addresses needed for signing + toSign := make(map[cipher.SecKey][]int) + entries, err := w.GetEntries() + if err != nil { + return nil, err + } + for _, e := range entries { + if len(toSign) == len(addrsMap) { + break + } + addr := e.SkycoinAddress() + if x, ok := addrsMap[addr]; ok { + toSign[e.Secret] = x + } + } + + if len(toSign) != len(addrsMap) { + return nil, NewError(errors.New("Wallet cannot sign all requested inputs")) + } + + // Sign the selected inputs + for k, v := range toSign { + for _, x := range v { + if !signedTxn.Sigs[x].Null() { + return nil, NewError(fmt.Errorf("Transaction is already signed at index %d", x)) + } + + if err := signedTxn.SignInput(k, x); err != nil { + return nil, err + } + } + } + + if err := signedTxn.UpdateHeader(); err != nil { + return nil, err + } + + // Sanity check + if txnInnerHash != signedTxn.HashInner() { + err := errors.New("Transaction inner hash modified in the process of signing") + logger.Critical().WithError(err).Error() + return nil, err + } + + if len(signIndexes) == 0 || len(signIndexes) == nMissingSigs { + if !signedTxn.IsFullySigned() { + return nil, errors.New("Transaction is not fully signed, but should be") + } + } else { + if signedTxn.IsFullySigned() { + return nil, errors.New("Transaction is fully signed, but shouldn't be") + } + } + + return signedTxn, nil +} + +// CreateTransaction creates an unsigned transaction based upon transaction.Params. +// Set the password as nil if the wallet is not encrypted, otherwise the password must be provided. +// NOTE: Caller must ensure that auxs correspond to params.Wallet.Addresses and params.Wallet.UxOuts options +// Outputs to spend are chosen from the pool of outputs provided. +// The outputs are chosen by the following procedure: +// - All outputs are merged into one list and are sorted coins highest, hours lowest, with the hash as a tiebreaker +// - Outputs are chosen from the beginning of this list, until the requested amount of coins is met. +// If hours are also specified, selection continues until the requested amount of hours are met. +// - If the total amount of coins in the chosen outputs is exactly equal to the requested amount of coins, +// such that there would be no change output but hours remain as change, another output will be chosen to create change, +// if the coinhour cost of adding that output is less than the coinhours that would be lost as change +// +// If receiving hours are not explicitly specified, hours are allocated amongst the receiving outputs proportional to the number of coins being sent to them. +// If the change address is not specified, the address whose bytes are lexically sorted first is chosen from the owners of the outputs being spent. +// WARNING: This method is not concurrent-safe if operating on the same wallet. Use Service.View or Service.ViewSecrets to lock the wallet, or use your own lock. +func CreateTransaction(w Wallet, p transaction.Params, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []transaction.UxBalance, error) { + if err := p.Validate(); err != nil { + return nil, nil, err + } + + // Check that auxs does not contain addresses that are not known to this wallet + for a := range auxs { + has, err := w.HasEntry(a) + if err != nil { + return nil, nil, err + } + if !has { + return nil, nil, fmt.Errorf("Address %s from auxs not found in wallet", a) + } + } + + // Generate a new change address for bip44 wallets + if p.ChangeAddress == nil && w.Type() == WalletTypeBip44 { + err := errors.New("change address must not be nil") + logger.Critical().WithError(err).Error("CreateTransaction change address must not be nil for bip44 wallet") + return nil, nil, err + } + + return transaction.Create(p, auxs, headTime) +} + +// CreateTransactionSigned creates and signs a transaction based upon transaction.Params. +// Set the password as nil if the wallet is not encrypted, otherwise the password must be provided. +// Refer to CreateTransaction for information about transaction creation. +func CreateTransactionSigned(w Wallet, p transaction.Params, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []transaction.UxBalance, error) { + txn, uxb, err := CreateTransaction(w, p, auxs, headTime) + if err != nil { + return nil, nil, err + } + + logger.Infof("CreateTransactionSigned: signing %d inputs", len(uxb)) + + // Sign the transaction + entriesMap := make(map[cipher.Address]Entry) + for i, s := range uxb { + entry, ok := entriesMap[s.Address] + if !ok { + var err error + entry, err = w.GetEntry(s.Address) + if err == ErrEntryNotFound { + // This should not occur because CreateTransaction should have checked it already + err := fmt.Errorf("Chosen spend address %s not found in wallet", s.Address) + logger.Critical().WithError(err).Error() + return nil, nil, err + } + entriesMap[s.Address] = entry + } + + if err := txn.SignInput(entry.Secret, i); err != nil { + logger.Critical().WithError(err).Errorf("CreateTransaction SignInput(%d) failed", i) + return nil, nil, err + } + } + + // Sanity check the signed transaction + if err := verifyCreatedSignedInvariants(p, txn, uxb); err != nil { + return nil, nil, err + } + + return txn, uxb, nil +} + +func verifyCreatedSignedInvariants(p transaction.Params, txn *coin.Transaction, inputs []transaction.UxBalance) error { + if !txn.IsFullySigned() { + return errors.New("Transaction is not fully signed") + } + + if err := transaction.VerifyCreatedInvariants(p, txn, inputs); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/wallet.go b/vendor/github.com/skycoin/skycoin/src/wallet/wallet.go new file mode 100644 index 0000000000..1387c6f923 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/wallet.go @@ -0,0 +1,622 @@ +/* +Package wallet implements wallets and the wallet database service + +Values of the Wallet interface can be created by calling function NewWallet, +or by loading from `[]byte` that containing wallet data of type such as +"deterministic", "collection", "bip44" or "xpubwallet". Loading any particular +type of wallet requires the prior registration of a loader. Registration is typically +automatic as a side effect of initializing that wallet's package so that, to load a +"deterministic" wallet, it suffices to have + + import _ "github.com/skycoin/skycoin/src/wallet/deterministic" + +in a program's main package. The _ means to import a package purely for its +initialization side effects. +*/ +package wallet + +import ( + "encoding/hex" + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/bip44" + "github.com/skycoin/skycoin/src/cipher/crypto" + "github.com/skycoin/skycoin/src/util/file" + "github.com/skycoin/skycoin/src/util/logging" +) + +// Error wraps wallet-related errors. +// It wraps errors caused by user input, but not errors caused by programmer input or internal issues. +type Error struct { + error +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + return nil + } + return Error{err} +} + +var ( + // Version represents the current wallet version + Version = "0.4" + + logger = logging.MustGetLogger("wallet") + + // ErrInvalidEncryptedField is returned if a wallet's Meta.encrypted value is invalid. + ErrInvalidEncryptedField = NewError(errors.New(`encrypted field value is not valid, must be "true", "false" or ""`)) + // ErrWalletEncrypted is returned when trying to generate addresses or sign tx in encrypted wallet + ErrWalletEncrypted = NewError(errors.New("wallet is encrypted")) + // ErrWalletNotEncrypted is returned when trying to decrypt unencrypted wallet + ErrWalletNotEncrypted = NewError(errors.New("wallet is not encrypted")) + // ErrMissingPassword is returned when trying to create wallet with encryption, but password is not provided. + ErrMissingPassword = NewError(errors.New("missing password")) + // ErrMissingEncrypt is returned when trying to create wallet with password, but options.Encrypt is not set. + ErrMissingEncrypt = NewError(errors.New("missing encrypt")) + // ErrInvalidPassword is returned if decrypts secrets failed + ErrInvalidPassword = NewError(errors.New("invalid password")) + // ErrMissingSeed is returned when trying to create wallet without a seed + ErrMissingSeed = NewError(errors.New("missing seed")) + // ErrMissingLabel is returned when trying to create wallet without label + ErrMissingLabel = NewError(errors.New("missing label")) + // ErrMissingAuthenticated is returned if try to decrypt a scrypt chacha20poly1305 encrypted wallet, and find no authenticated metadata. + ErrMissingAuthenticated = NewError(errors.New("missing authenticated metadata")) + // ErrMissingXPub is returned if try to create a XPub wallet without providing xpub key + ErrMissingXPub = NewError(errors.New("missing xpub")) + // ErrWrongCryptoType is returned when decrypting wallet with wrong crypto method + ErrWrongCryptoType = NewError(errors.New("wrong crypto type")) + // ErrWalletNotExist is returned if a wallet does not exist + ErrWalletNotExist = NewError(errors.New("wallet doesn't exist")) + // ErrSeedUsed is returned if a wallet already exists with the same seed + ErrSeedUsed = NewError(errors.New("a wallet already exists with this seed")) + // ErrXPubKeyUsed is returned if a wallet already exists with the same xpub key + ErrXPubKeyUsed = NewError(errors.New("a wallet already exists with this xpub key")) + // ErrWalletAPIDisabled is returned when trying to do wallet actions while the EnableWalletAPI option is false + ErrWalletAPIDisabled = NewError(errors.New("wallet api is disabled")) + // ErrSeedAPIDisabled is returned when trying to get seed of wallet while the EnableWalletAPI or EnableSeedAPI is false + ErrSeedAPIDisabled = NewError(errors.New("wallet seed api is disabled")) + // ErrWalletNameConflict represents the wallet name conflict error + ErrWalletNameConflict = NewError(errors.New("wallet name would conflict with existing wallet, renaming")) + // ErrWalletRecoverSeedWrong is returned if the seed or seed passphrase does not match the specified wallet when recovering + ErrWalletRecoverSeedWrong = NewError(errors.New("wallet recovery seed or seed passphrase is wrong")) + // ErrWalletSeedPassphrase is returned when using seed passphrase for none bip44 wallet + ErrWalletSeedPassphrase = NewError(errors.New("seedPassphrase is only used for \"bip44\" wallets")) + // ErrNilTransactionsFinder is returned if Options.ScanN > 0 but a nil TransactionsFinder was provided + ErrNilTransactionsFinder = NewError(errors.New("scan ahead requested but balance getter is nil")) + // ErrInvalidCoinType is returned for invalid coin types + ErrInvalidCoinType = NewError(errors.New("invalid coin type")) + // ErrInvalidWalletType is returned for invalid wallet types + ErrInvalidWalletType = NewError(errors.New("invalid wallet type")) + // ErrWalletTypeNotRecoverable is returned by RecoverWallet is the wallet type does not support recovery + ErrWalletTypeNotRecoverable = NewError(errors.New("wallet type is not recoverable")) + // ErrWalletPermission is returned when updating a wallet without writing permission + ErrWalletPermission = NewError(errors.New("saving wallet permission denied")) + // ErrInvalidPrivateKeys is returned when creating a collection wallet with invalid private keys + ErrInvalidPrivateKeys = NewError(errors.New("invalid private keys")) + + // ErrEntryNotFound is returned by GetEntry is the wallet does not contains the entry + ErrEntryNotFound = errors.New("entry not found") + // ErrEncryptTempWallet is returned when trying to encrypt a temporary wallet + ErrEncryptTempWallet = errors.New("temporary wallet does not support encryption") +) + +const ( + // WalletExt wallet file extension + WalletExt = "wlt" + + // WalletTimestampFormat wallet timestamp layout + WalletTimestampFormat = "2006_01_02" + + // CoinTypeSkycoin skycoin type + CoinTypeSkycoin CoinType = "skycoin" + // CoinTypeBitcoin bitcoin type + CoinTypeBitcoin CoinType = "bitcoin" + + // WalletTypeDeterministic deterministic wallet type. + // Uses the original Skycoin deterministic key generator. + WalletTypeDeterministic = "deterministic" + // WalletTypeCollection collection wallet type. + // Does not use any key generator; keys must be added explicitly + WalletTypeCollection = "collection" + // WalletTypeBip44 bip44 HD wallet type. + // Follow the bip44 spec. + WalletTypeBip44 = "bip44" + // WalletTypeXPub xpub HD wallet type. + // Allows generating addresses without a secret key + WalletTypeXPub = "xpub" +) + +// CoinType represents the wallet coin type, which refers to the pubkey2addr method used +type CoinType string + +// NewWalletFilename generates a filename from the current time and random bytes +func NewWalletFilename() string { + timestamp := time.Now().Format(WalletTimestampFormat) + // should read in wallet files and make sure does not exist + padding := hex.EncodeToString(cipher.RandByte(2)) + return fmt.Sprintf("%s_%s.%s", timestamp, padding, WalletExt) +} + +// Options options that could be used when creating a wallet +type Options struct { + Version string + Type string // wallet type: deterministic, collection. Refers to which key generation mechanism is used. + Coin CoinType // coin type: skycoin, bitcoin, etc. Refers to which pubkey2addr method is used. + Bip44Coin *bip44.CoinType // bip44 path coin type + Label string // wallet label + Seed string // wallet seed + SeedPassphrase string // wallet seed passphrase (bip44 wallets only) + Encrypt bool // whether the wallet need to be encrypted. + Password []byte // password that would be used for encryption, and would only be used when 'Encrypt' is true. + CryptoType crypto.CryptoType // wallet encryption type, scrypt-chacha20poly1305 or sha256-xor. + ScanN uint64 // number of addresses that're going to be scanned for a balance. The highest address with a balance will be used. + GenerateN uint64 // number of addresses to generate, regardless of balance + XPub string // xpub key (xpub wallets only) + Decoder Decoder + TF TransactionsFinder + Temp bool // whether the wallet is created temporary in memory. + CollectionPrivateKeys []cipher.SecKey // private keys for collection wallet +} + +func (opts Options) Validate() error { + if opts.Type == WalletTypeDeterministic && opts.SeedPassphrase != "" { + return ErrWalletSeedPassphrase + } + return nil +} + +//go:generate mockery -name Wallet -case underscore -inpkg -testonly + +// Wallet defines the wallet API +type Wallet interface { + Seed() string + LastSeed() string + SeedPassphrase() string + Timestamp() int64 + SetTimestamp(int64) + Coin() CoinType + SetCoin(coinType CoinType) + // Type returns the wallet type, e.g. bip44, deterministic, collection + Type() string + // Bip44Coin returns the coin_type part of bip44 path + Bip44Coin() *bip44.CoinType + SetBip44Coin(ct bip44.CoinType) + Label() string + SetLabel(string) + Filename() string + SetFilename(string) + IsEncrypted() bool + // CryptoType returns the crypto type for encrypting/decrypting the wallet + CryptoType() crypto.CryptoType + SetCryptoType(ct crypto.CryptoType) + // SetDecoder sets the wallet decoder + SetDecoder(d Decoder) + // Version returns the wallet version + Version() string + // Secrets returns the wallet secrets data + Secrets() string + // XPub returns the xpub key of a xpub wallet + XPub() string + // Lock encrypts the wallet + Lock(password []byte) error + // Unlock decrypts the wallets, returns an copy of the decrypted wallet + Unlock(password []byte) (Wallet, error) + // Erase wipes sensitive data + Erase() + // Clone returns a copy of the wallet + Clone() Wallet + // CopyFrom copies the src wallet to w + // CopyFrom(src Wallet) + // CopyFromRef copies the src wallet with a pointer dereference + CopyFromRef(src Wallet) + Fingerprint() string + // ScanAddresses scans ahead given number of addresses + ScanAddresses(scanN uint64, tf TransactionsFinder) ([]cipher.Addresser, error) + // GetAddresses returns all addresses. + // for bip44 wallet, if no options are specified, addresses on external chain of account + // with index 0 will be returned. + GetAddresses(options ...Option) ([]cipher.Addresser, error) + // GenerateAddresses generates N addresses, + // for bip44 wallet, if no options are specified, addresses will be generated + // on external chain of account with index 0. + GenerateAddresses(options ...Option) ([]cipher.Addresser, error) + // GetEntries returns entries, + // for bip44 wallet if no options are used, entries on external chain of account + // with index 0 will be returned. + GetEntries(options ...Option) (Entries, error) + // GetEntryAt returns the entry of given index, + // for bip44 wallet, if no options are specified, the entry on external chain of the account + // with index 0 will be returned. + GetEntryAt(i int, options ...Option) (Entry, error) + // GetEntry return the entry by address + // for bip44 wallet, if no options are specified, it will search the external chain of account + // of index 0. + GetEntry(addr cipher.Addresser, options ...Option) (Entry, error) + // HasEntry returns whether the entry exists in the wallet + // for bip44 wallet, if no options are specified, it will check the external chain of account + // of index 0. + HasEntry(addr cipher.Addresser, options ...Option) (bool, error) + // EntriesLen returns the entries length + // for bip44 wallet, if no options are specified, the length of the entries on external chain of account + // with index 0 will be returned. + EntriesLen(options ...Option) (int, error) + // Accounts returns the list of account for bip44 wallet + Accounts() []Bip44Account + // Serialize serialize the wallet to bytes, and error if any + Serialize() ([]byte, error) + // Deserialize deserialize the data to a Wallet, and error if any + Deserialize(data []byte) error + // IsTemp returns whether the wallet is a temporary wallet + IsTemp() bool + // SetTemp sets wallet temporary flag + SetTemp(temp bool) +} + +// Decoder is the interface that wraps the Encode and Decode methods. +// Encode method encodes the wallet to bytes, Decode method decodes bytes to bip44 wallet. +type Decoder interface { + Encode(w Wallet) ([]byte, error) + Decode(b []byte) (Wallet, error) +} + +// NewWallet creates a new wallet +func NewWallet(filename, label, seed string, options Options) (Wallet, error) { + if err := options.Validate(); err != nil { + return nil, err + } + + c, ok := getCreator(options.Type) + if !ok { + return nil, fmt.Errorf("wallet.NewWallet failed, wallet type %q is not supported", options.Type) + } + + return c.Create(filename, label, seed, options) +} + +// Bip44Account represents the wallet account +type Bip44Account struct { + Name string + Index uint32 +} + +// GuardUpdate executes a function within the context of a read-write managed decrypted wallet. +// Returns ErrWalletNotEncrypted if wallet is not encrypted. +func GuardUpdate(w Wallet, password []byte, fn func(w Wallet) error) error { + if !w.IsEncrypted() { + return ErrWalletNotEncrypted + } + + if len(password) == 0 { + return ErrMissingPassword + } + + wlt, err := w.Unlock(password) + if err != nil { + return err + } + + defer wlt.Erase() + + if err := fn(wlt); err != nil { + return err + } + + if err := wlt.Lock(password); err != nil { + return err + } + + w.CopyFromRef(wlt) + + // Wipes all sensitive data + w.Erase() + return nil +} + +// GuardView executes a function within the context of a read-only managed decrypted wallet. +// Returns ErrWalletNotEncrypted if wallet is not encrypted. +func GuardView(w Wallet, password []byte, f func(w Wallet) error) error { + if !w.IsEncrypted() { + return ErrWalletNotEncrypted + } + + if len(password) == 0 { + return ErrMissingPassword + } + + wlt, err := w.Unlock(password) + if err != nil { + return err + } + + // TODO: consider to catch panic and erase sensitive data in recovery function + // in case the f(wlt) function get panic + + defer wlt.Erase() + + return f(wlt) +} + +type walletLoadMeta struct { + Meta struct { + Type string `json:"type"` + Version string `json:"version"` + } `json:"meta"` +} + +// Save saves the wallet to a directory. The wallet's filename is read from its metadata. +func Save(w Wallet, dir string) error { + if w.IsTemp() { + return nil + } + + data, err := w.Serialize() + if err != nil { + return err + } + return file.SaveBinary(filepath.Join(dir, w.Filename()), data, 0600) +} + +// Load loads wallet from a file +func Load(filename string) (Wallet, error) { + if _, err := os.Stat(filename); os.IsNotExist(err) { + return nil, fmt.Errorf("wallet %q doesn't exist", filename) + } + + // Load the wallet meta type field from JSON + m, err := loadWalletMeta(filename) + if err != nil { + return nil, err + } + + if m.Meta.Type == "" { + err := errors.New("missing meta.type field") + logger.WithError(err).WithField("filename", filename) + return nil, err + } + + // Depending on the wallet type in the wallet metadata header, load the full wallet data + l, ok := getLoader(m.Meta.Type) + if !ok { + logger.Errorf("wallet loader for type of %q not found", m.Meta.Type) + return nil, nil + } + + data, err := ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + + w, err := l.Load(data) + if err != nil { + return nil, err + } + + w.SetFilename(filepath.Base(filename)) + return w, nil +} + +// removeBackupFiles removes any *.wlt.bak files whom have version 0.1 and *.wlt matched in the given directory +func removeBackupFiles(dir string) error { + fs, err := filterDir(dir, ".wlt") + if err != nil { + return err + } + + // Creates the .wlt file map + fm := make(map[string]struct{}) + for _, f := range fs { + fm[f] = struct{}{} + } + + // Filters all .wlt.bak files in the directory + bakFs, err := filterDir(dir, ".wlt.bak") + if err != nil { + return err + } + + // Removes the .wlt.bak file that has .wlt matched. + for _, bf := range bakFs { + f := strings.TrimRight(bf, ".bak") + if _, ok := fm[f]; ok { + // Load and check the wallet version + m, err := loadWalletMeta(f) + if err != nil { + return err + } + + if m.Meta.Version == "0.1" { + if err := os.Remove(bf); err != nil { + return err + } + } + } + } + + return nil +} + +func loadWalletMeta(filename string) (*walletLoadMeta, error) { + var m walletLoadMeta + if err := file.LoadJSON(filename, &m); err != nil { + logger.WithError(err).WithField("filename", filename).Error("Load: file.LoadJSON failed") + return nil, err + } + + return &m, nil +} + +func filterDir(dir string, suffix string) ([]string, error) { + files, err := ioutil.ReadDir(dir) + if err != nil { + return nil, err + } + res := []string{} + for _, f := range files { + if !f.IsDir() && strings.HasSuffix(f.Name(), suffix) { + res = append(res, filepath.Join(dir, f.Name())) + } + } + return res, nil +} + +// IsValidWalletType returns true if a wallet type is recognized +func IsValidWalletType(t string) bool { + switch t { + case WalletTypeDeterministic, + WalletTypeCollection, + WalletTypeBip44, + WalletTypeXPub: + return true + default: + return false + } +} + +// AddressConstructor returns a function to create a cipher.Addresser from a cipher.PubKey +func AddressConstructor(m Meta) func(cipher.PubKey) cipher.Addresser { + switch m.Coin() { + case CoinTypeSkycoin: + return func(pk cipher.PubKey) cipher.Addresser { + return cipher.AddressFromPubKey(pk) + } + case CoinTypeBitcoin: + return func(pk cipher.PubKey) cipher.Addresser { + return cipher.BitcoinAddressFromPubKey(pk) + } + default: + logger.Panicf("Invalid wallet coin type %q", m.Coin()) + return nil + } +} + +// ValidateMeta validates the common meta data when initializing a wallet +func ValidateMeta(m Meta) error { + if fn := m[MetaFilename]; fn == "" { + return errors.New("filename not set") + } + + if tm := m[MetaTimestamp]; tm != "" { + _, err := strconv.ParseInt(tm, 10, 64) + if err != nil { + return errors.New("invalid timestamp") + } + } + + if tp := m[MetaType]; tp == "" { + return errors.New("type field not set") + } + + if coinType := m[MetaCoin]; coinType == "" { + return errors.New("coin field not set") + } + + var isEncrypted bool + if encStr, ok := m[MetaEncrypted]; ok { + // validate the encrypted value + var err error + isEncrypted, err = strconv.ParseBool(encStr) + if err != nil { + return errors.New("encrypted field is not a valid bool") + } + } + + if isEncrypted { + if s := m[MetaSecrets]; s == "" { + return errors.New("wallet is encrypted, but secrets field not set") + } + } else { + if s := m[MetaSecrets]; s != "" { + return errors.New("secrets should not be in unencrypted wallets") + } + } + + return nil +} + +// ValidateMetaCryptoType validates meta crypto type +func ValidateMetaCryptoType(m Meta) error { + cryptoType, ok := m[MetaCryptoType] + if !ok { + return errors.New("crypto type field not set") + } + + if _, err := crypto.GetCrypto(crypto.CryptoType(cryptoType)); err != nil { + return errors.New("unknown crypto type") + } + + return nil +} + +// ValidateMetaSeed validate meta seed +func ValidateMetaSeed(m Meta) error { + if m.IsEncrypted() { + if s := m[MetaSeed]; s != "" { + return errors.New("seed should not be visible in encrypted wallets") + } + } else { + if s := m[MetaSeed]; s == "" { + return ErrMissingSeed + } + } + return nil +} + +// SkycoinAddresses converts the addresses to skycoin addresses +func SkycoinAddresses(addrs []cipher.Addresser) []cipher.Address { + skyAddrs := make([]cipher.Address, len(addrs)) + for i, a := range addrs { + skyAddrs[i] = a.(cipher.Address) + } + return skyAddrs +} + +// ParsePrivateKeys parse private keys from a string +// keys must be joined with commas +func ParsePrivateKeys(keys string) ([]cipher.SecKey, error) { + if keys == "" { + return nil, nil + } + + ss := strings.Split(keys, ",") + secKeys := make([]cipher.SecKey, 0, len(ss)) + for _, s := range ss { + v := strings.TrimSpace(s) + if len(v) > 0 { + sk, err := cipher.SecKeyFromHex(v) + if err != nil { + return nil, fmt.Errorf("invalid private key: %v", err) + } + secKeys = append(secKeys, sk) + } + } + return secKeys, nil +} + +func applyAdvancedOptions(options ...Option) *AdvancedOptions { + var advOpts AdvancedOptions + for _, f := range options { + f(&advOpts) + } + + return &advOpts +} + +// GetGenerateNFromOptions gets generateN from options +func GetGenerateNFromOptions(options ...Option) uint64 { + return applyAdvancedOptions(options...).GenerateN +} + +// GetPrivateKeysFromOptions gets private keys from options +func GetPrivateKeysFromOptions(options ...Option) []cipher.SecKey { + return applyAdvancedOptions(options...).PrivateKeys +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/wallets.go b/vendor/github.com/skycoin/skycoin/src/wallet/wallets.go new file mode 100644 index 0000000000..bae402f51e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/wallets.go @@ -0,0 +1,146 @@ +package wallet + +import ( + "fmt" + "io/ioutil" + "path/filepath" + "strings" +) + +// Wallets wallets map +type Wallets map[string]Wallet + +// loadWallets Loads all wallets contained in wallet dir. If any regular file in wallet +// dir fails to load, loading is aborted and error returned. Only files with +// extension WalletExt are considered. +func loadWallets(dir string, loader Loader) (Wallets, error) { + entries, err := ioutil.ReadDir(dir) + if err != nil { + logger.WithError(err).WithField("dir", dir).Error("loadWallets: ioutil.ReadDir failed") + return nil, err + } + + wallets := Wallets{} + for _, e := range entries { + if e.Mode().IsRegular() { + name := e.Name() + if !strings.HasSuffix(name, WalletExt) { + logger.WithField("filename", name).Info("loadWallets: skipping file") + continue + } + + fullpath := filepath.Join(dir, name) + data, err := ioutil.ReadFile(fullpath) + if err != nil { + return nil, err + } + w, err := loader.Load(data) + if err != nil { + logger.WithError(err).WithField("filename", fullpath).Error("loadWallets: loadWallet failed") + return nil, err + } + + logger.WithField("filename", fullpath).Info("loadWallets: loaded wallet") + + wallets[name] = w + } + } + + for name, w := range wallets { + // TODO: do validate when creating wallet + // if err := w.Validate(); err != nil { + // logger.WithError(err).WithField("name", name).Error("loadWallets: wallet.Validate failed") + // return nil, err + // } + + if w.Coin() != CoinTypeSkycoin { + err := fmt.Errorf("LoadWallets only support skycoin wallets, %s is a %s wallet", name, w.Coin()) + logger.WithError(err).WithField("name", name).Error() + return nil, err + } + } + + return wallets, nil +} + +// add add wallet to current wallet +func (wlts Wallets) add(w Wallet) error { + if _, dup := wlts[w.Filename()]; dup { + return ErrWalletNameConflict + } + + wlts[w.Filename()] = w + return nil +} + +// remove wallet of specific id +func (wlts Wallets) remove(id string) { + delete(wlts, id) +} + +// get returns wallet by wallet id +func (wlts Wallets) get(id string) Wallet { + return wlts[id] +} + +// set sets a wallet into the map +func (wlts Wallets) set(w Wallet) { + wlts[w.Filename()] = w.Clone() +} + +// containsDuplicate returns true if there is a duplicate wallet identified by +// the wallet's fingerprint. This is to detect duplicate generative wallets; +// wallets with no defined generation method do not have a concept of being +// a duplicate of another wallet +func (wlts Wallets) containsDuplicate() (string, string, bool) { + m := make(map[string]struct{}, len(wlts)) + for wltID, wlt := range wlts { + fp := wlt.Fingerprint() + if fp == "" { + continue + } + + if _, ok := m[fp]; ok { + return wltID, fp, true + } + + m[fp] = struct{}{} + } + + return "", "", false +} + +// containsEmpty returns true there is an empty wallet and the ID of that wallet if true. +// Does not apply to collection wallets +func (wlts Wallets) containsEmpty() (string, bool) { + for wltID, wlt := range wlts { + switch wlt.Type() { + case WalletTypeCollection: + continue + case WalletTypeBip44: + var l int + // gets the external entries length + for _, a := range wlt.Accounts() { + el, err := wlt.EntriesLen(OptionAccount(a.Index)) + if err != nil { + panic(err) + } + l += el + } + + if l == 0 { + return wltID, true + } + default: + l, err := wlt.EntriesLen() + if err != nil { + panic(err) + } + + if l == 0 { + return wltID, true + } + } + } + return "", false +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/xpubwallet/decoder.go b/vendor/github.com/skycoin/skycoin/src/wallet/xpubwallet/decoder.go new file mode 100644 index 0000000000..88ab0fd617 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/xpubwallet/decoder.go @@ -0,0 +1,112 @@ +package xpubwallet + +import ( + "encoding/json" + "errors" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/wallet" +) + +// TODO: test this + +// JSONDecoder implements the the WalletDecoder interface, +// which provides methods for encoding and decoding a XPub wallet in JSON format. +type JSONDecoder struct{} + +// Encode encodes the XPub wallet to []byte, and error if any +func (d JSONDecoder) Encode(w wallet.Wallet) ([]byte, error) { + return json.MarshalIndent(newReadableWallet(w.(*Wallet)), "", " ") +} + +// Decode decodes the XPub wallet from byte slice +func (d JSONDecoder) Decode(b []byte) (wallet.Wallet, error) { + rw := readableWallet{} + if err := json.Unmarshal(b, &rw); err != nil { + return nil, err + } + + return rw.toWallet() +} + +type readableWallet struct { + wallet.Meta `json:"meta"` + Entries readableXPubEntries `json:"entries"` +} + +func (w readableWallet) toWallet() (*Wallet, error) { + ad := wallet.ResolveAddressDecoder(w.Coin()) + entries, err := w.Entries.toXPubEntries(ad) + if err != nil { + return nil, err + } + + xpubStr := w.Meta[wallet.MetaXPub] + if xpubStr == "" { + return nil, errors.New("missing xpub meta field") + } + + xPub, err := parseXPub(xpubStr) + if err != nil { + return nil, err + } + + return &Wallet{ + Meta: w.Meta.Clone(), + entries: entries, + xpub: xPub, + decoder: &JSONDecoder{}, + }, nil +} + +func newReadableWallet(w *Wallet) *readableWallet { + return &readableWallet{ + Meta: w.Meta.Clone(), + Entries: newReadableEntries(w.entries), + } +} + +type readableXPubEntries []readableXPubEntry + +func (es readableXPubEntries) toXPubEntries(ad wallet.AddressDecoder) (wallet.Entries, error) { + entries := make(wallet.Entries, len(es)) + for i, e := range es { + addr, err := ad.DecodeBase58Address(e.Address) + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(e.Public) + if err != nil { + return nil, err + } + + entries[i] = wallet.Entry{ + Address: addr, + Public: p, + ChildNumber: e.ChildNumber, + } + } + + return entries, nil +} + +func newReadableEntries(entries wallet.Entries) readableXPubEntries { + var res readableXPubEntries + res = make([]readableXPubEntry, len(entries)) + for i, e := range entries { + res[i] = readableXPubEntry{ + Address: e.Address.String(), + Public: e.Public.Hex(), + ChildNumber: e.ChildNumber, + } + } + + return res +} + +type readableXPubEntry struct { + Address string `json:"address"` + Public string `json:"public"` + ChildNumber uint32 `json:"child_number"` // For bip32/bip44 +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/xpubwallet/wallet.go b/vendor/github.com/skycoin/skycoin/src/wallet/xpubwallet/wallet.go new file mode 100644 index 0000000000..3e5dd9d461 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/xpubwallet/wallet.go @@ -0,0 +1,472 @@ +package xpubwallet + +import ( + "errors" + "fmt" + "math" + "strconv" + "time" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/bip32" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/mathutil" + "github.com/skycoin/skycoin/src/wallet" +) + +// WalletType represents the xpub wallet type +const WalletType = "xpub" + +var defaultWalletDecoder = &JSONDecoder{} +var logger = logging.MustGetLogger("xpubwallet") + +func init() { + if err := wallet.RegisterCreator(WalletType, &Creator{}); err != nil { + panic(err) + } + + if err := wallet.RegisterLoader(WalletType, &Loader{}); err != nil { + panic(err) + } +} + +// Wallet holds a single xpub (extended public key) and derives child public keys from it. +// Refer to the bip32 spec to understand xpub keys. +// XPub wallets can generate new addresses and receive coins, but can't spend coins +// because the private keys are not available. +type Wallet struct { + wallet.Meta + entries wallet.Entries + xpub *bip32.PublicKey + decoder wallet.Decoder +} + +// NewWallet creates a xpub wallet with options +func NewWallet(filename, label, xPub string, options ...wallet.Option) (*Wallet, error) { + if xPub == "" { + return nil, wallet.ErrMissingXPub + } + + key, err := parseXPub(xPub) + if err != nil { + return nil, wallet.NewError(err) + } + + wlt := &Wallet{ + Meta: wallet.Meta{ + wallet.MetaFilename: filename, + wallet.MetaLabel: label, + wallet.MetaType: WalletType, + wallet.MetaVersion: wallet.Version, + wallet.MetaCoin: string(wallet.CoinTypeSkycoin), + wallet.MetaXPub: xPub, + wallet.MetaTimestamp: strconv.FormatInt(time.Now().Unix(), 10), + }, + decoder: defaultWalletDecoder, + xpub: key, + } + + advOpts := &wallet.AdvancedOptions{} + for _, opt := range options { + opt(wlt) + opt(advOpts) + } + + if err := validateMeta(wlt.Meta); err != nil { + return nil, err + } + + generateN := advOpts.GenerateN + if generateN > 0 { + _, err := wlt.GenerateAddresses(wallet.OptionGenerateN(generateN)) + if err != nil { + return nil, err + } + } + + scanN := advOpts.ScanN + if scanN > 0 { + if advOpts.TF == nil { + return nil, errors.New("missing transaction finder for scanning addresses") + } + + if scanN > generateN { + scanN = scanN - generateN + } + + if _, err := wlt.ScanAddresses(scanN, advOpts.TF); err != nil { + return nil, err + } + } + + return wlt, nil +} + +// SetDecoder sets the wallet decoder +func (w *Wallet) SetDecoder(d wallet.Decoder) { + w.decoder = d +} + +func validateMeta(m wallet.Meta) error { + if m[wallet.MetaType] != WalletType { + return wallet.ErrInvalidWalletType + } + + return wallet.ValidateMeta(m) +} + +// Serialize encodes the xpub wallet to []byte +func (w Wallet) Serialize() ([]byte, error) { + if w.decoder == nil { + w.decoder = defaultWalletDecoder + } + + return w.decoder.Encode(&w) +} + +// Deserialize decodes the []byte to a xpub wallet +func (w *Wallet) Deserialize(b []byte) error { + if w.decoder == nil { + w.decoder = defaultWalletDecoder + } + + toW, err := w.decoder.Decode(b) + if err != nil { + return err + } + + toW2 := toW.(*Wallet) + toW2.decoder = w.decoder + *w = *toW2 + return nil +} + +// IsEncrypted returns whether the wallet is encrypted +func (w Wallet) IsEncrypted() bool { + return w.Meta.IsEncrypted() +} + +// Lock will do nothing to the xpub wallet +func (w Wallet) Lock(_ []byte) error { + return wallet.NewError(errors.New("xpub wallet does not support encryption")) +} + +// Unlock will return the origin xpub wallet +func (w *Wallet) Unlock(_ []byte) (wallet.Wallet, error) { + return nil, wallet.NewError(errors.New("xpub wallet does not support encryption")) +} + +// Fingerprint returns a unique ID fingerprint for this wallet, using the first +// child address of the xpub key +func (w *Wallet) Fingerprint() string { + // Note: the xpub key is not used as the fingerprint, because it is + // partially sensitive data + addr := "" + if len(w.entries) == 0 { + entries, err := w.generateEntries(1, 0) + if err != nil { + logger.WithError(err).Panic("Fingerprint failed to generate initial entry for empty wallet") + } + addr = entries[0].Address.String() + } else { + addr = w.entries[0].Address.String() + } + + return fmt.Sprintf("%s-%s", w.Type(), addr) +} + +func (w *Wallet) generateEntries(num uint64, initialChildIdx uint32) (wallet.Entries, error) { + if num > math.MaxUint32 { + return nil, wallet.NewError(errors.New("XPubWallet.generateEntries num too large")) + } + + // Cap `num` in case it would exceed the maximum child index number + if math.MaxUint32-initialChildIdx < uint32(num) { + num = uint64(math.MaxUint32 - initialChildIdx) + } + + if num == 0 { + return nil, nil + } + + // Generate `num` secret keys from the external chain HDNode, skipping any children that + // are invalid (note that this has probability ~2^-128) + var pubkeys []*bip32.PublicKey + var addressIndices []uint32 + j := initialChildIdx + for i := uint32(0); i < uint32(num); i++ { + k, err := w.xpub.NewPublicChildKey(j) + + var addErr error + j, addErr = mathutil.AddUint32(j, 1) + if addErr != nil { + logger.Critical().WithError(addErr).WithFields(logrus.Fields{ + "num": num, + "initialChildIdx": initialChildIdx, + "childIdx": j, + "i": i, + }).Error("childIdx can't be incremented any further") + return nil, errors.New("childIdx can't be incremented any further") + } + + if err != nil { + if bip32.IsImpossibleChildError(err) { + logger.Critical().WithError(err).WithField("childIdx", j).Error("ImpossibleChild for xpub child element") + continue + } else { + logger.Critical().WithError(err).WithField("childIdx", j).Error("NewPublicChildKey failed unexpectedly") + return nil, err + } + } + + pubkeys = append(pubkeys, k) + addressIndices = append(addressIndices, j-1) + } + + entries := make(wallet.Entries, len(pubkeys)) + addressFromPubKey := wallet.ResolveAddressDecoder(w.Coin()).AddressFromPubKey + for i, xp := range pubkeys { + pk := cipher.MustNewPubKey(xp.Key) + entries[i] = wallet.Entry{ + Address: addressFromPubKey(pk), + Public: pk, + ChildNumber: addressIndices[i], + } + } + + return entries, nil +} + +// Clone returns a copy of the wallet +func (w Wallet) Clone() wallet.Wallet { + xpub := w.xpub.Clone() + return &Wallet{ + Meta: w.Meta.Clone(), + entries: w.entries.Clone(), + xpub: &xpub, + decoder: w.decoder, + } +} + +// CopyFrom copy wallet from specific wallet +func (w *Wallet) CopyFrom(src wallet.Wallet) { + w.copyFrom(src.(*Wallet)) +} + +func (w *Wallet) copyFrom(wlt *Wallet) { + w.Meta = wlt.Meta.Clone() + w.entries = wlt.entries.Clone() + w.decoder = wlt.decoder +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *Wallet) CopyFromRef(src wallet.Wallet) { + *w = *(src.(*Wallet)) +} + +// Accounts is not implemented for xpub wallet +func (w *Wallet) Accounts() []wallet.Bip44Account { + return nil +} + +// GetEntries returns a copy of all entries held by the wallet +func (w *Wallet) GetEntries(_ ...wallet.Option) (wallet.Entries, error) { + return w.entries.Clone(), nil +} + +// Erase removes sensitive data +func (w *Wallet) Erase() { +} + +// ScanAddresses scans ahead N addresses, truncating up to the highest address with any transaction history. +func (w *Wallet) ScanAddresses(scanN uint64, tf wallet.TransactionsFinder) ([]cipher.Addresser, error) { + if scanN == 0 { + return nil, nil + } + + w2 := w.Clone().(*Wallet) + + nExistingAddrs := uint64(len(w2.entries)) + + // Generate the addresses to scan + addrs, err := w2.GenerateAddresses(wallet.OptionGenerateN(scanN)) + if err != nil { + return nil, err + } + + // Find if these addresses had any activity + active, err := tf.AddressesActivity(addrs) + if err != nil { + return nil, err + } + + // Check activity from the last one until we find the address that has activity + var keepNum uint64 + for i := len(active) - 1; i >= 0; i-- { + if active[i] { + keepNum = uint64(i + 1) + break + } + } + + w2.reset() + if _, err := w2.GenerateAddresses(wallet.OptionGenerateN(nExistingAddrs + keepNum)); err != nil { + return nil, err + } + + *w = *w2 + + return addrs[:keepNum], nil +} + +// GetAddresses returns all addresses of the wallet +func (w *Wallet) GetAddresses(_ ...wallet.Option) ([]cipher.Addresser, error) { + return w.entries.GetAddresses(), nil +} + +// GenerateAddresses generates addresses for the external chain, and appends them to the wallet's entries array +func (w *Wallet) GenerateAddresses(options ...wallet.Option) ([]cipher.Addresser, error) { + num := wallet.GetGenerateNFromOptions(options...) + if num > math.MaxUint32 { + return nil, wallet.NewError(errors.New("XPubWallet.GenerateAddresses num too large")) + } + + var addrs []cipher.Addresser + initLen := uint32(len(w.entries)) + _, err := mathutil.AddUint32(initLen, uint32(num)) + if err != nil { + return nil, fmt.Errorf("generate %d more addresses failed: %v", num, err) + } + + makeAddress := wallet.ResolveAddressDecoder(w.Coin()) + + for i := uint32(0); i < uint32(num); i++ { + index := initLen + i + pk, err := w.xpub.NewPublicChildKey(index) + if err != nil { + return nil, err + } + cpk, err := cipher.NewPubKey(pk.Key) + if err != nil { + return nil, err + } + + addr := makeAddress.AddressFromPubKey(cpk) + e := wallet.Entry{ + Address: addr, + Public: cpk, + ChildNumber: index, + } + + w.entries = append(w.entries, e) + addrs = append(addrs, addr) + } + return addrs, nil +} + +func parseXPub(xp string) (*bip32.PublicKey, error) { + xPub, err := bip32.DeserializeEncodedPublicKey(xp) + if err != nil { + return nil, fmt.Errorf("invalid xpub key: %v", err) + } + + return xPub, nil +} + +// GetEntryAt returns the entry at a given index in the entries array +func (w *Wallet) GetEntryAt(i int, _ ...wallet.Option) (wallet.Entry, error) { + if i < 0 || i >= len(w.entries) { + return wallet.Entry{}, fmt.Errorf("entry index %d is out of range", i) + } + return w.entries[i], nil +} + +// GetEntry returns a entry of given address +func (w *Wallet) GetEntry(addr cipher.Addresser, _ ...wallet.Option) (wallet.Entry, error) { + e, ok := w.entries.Get(addr) + if !ok { + return wallet.Entry{}, wallet.ErrEntryNotFound + } + return e, nil +} + +// HasEntry returns true if the wallet has an Entry with a given address +func (w *Wallet) HasEntry(addr cipher.Addresser, _ ...wallet.Option) (bool, error) { + return w.entries.Has(addr), nil +} + +// EntriesLen returns the number of entries in the wallet +func (w *Wallet) EntriesLen(_ ...wallet.Option) (int, error) { + return len(w.entries), nil +} + +// reset resets the wallet entries and move the lastSeed to origin +func (w *Wallet) reset() { + w.entries = wallet.Entries{} +} + +// Loader implements the wallet.Loader interface +type Loader struct{} + +// Load loads the xpub wallet from byte slice +func (l Loader) Load(data []byte) (wallet.Wallet, error) { + w := &Wallet{} + if err := w.Deserialize(data); err != nil { + return nil, err + } + + return w, nil +} + +// Creator implements the wallet.Creator interface +type Creator struct{} + +// Create creates a xpub wallet +func (c Creator) Create(filename, label, _ string, options wallet.Options) (wallet.Wallet, error) { + if err := validateOptions(options); err != nil { + return nil, err + } + + return NewWallet( + filename, + label, + options.XPub, + convertOptions(options)...) +} + +func validateOptions(options wallet.Options) error { + if options.Encrypt { + return wallet.NewError(errors.New("xpub wallet does not support encryption")) + } + + return nil +} + +func convertOptions(options wallet.Options) []wallet.Option { + var opts []wallet.Option + + if options.Coin != "" { + opts = append(opts, wallet.OptionCoinType(options.Coin)) + } + + if options.Decoder != nil { + opts = append(opts, wallet.OptionDecoder(options.Decoder)) + } + + if options.GenerateN > 0 { + opts = append(opts, wallet.OptionGenerateN(options.GenerateN)) + } + + if options.ScanN > 0 { + opts = append(opts, wallet.OptionScanN(options.ScanN)) + opts = append(opts, wallet.OptionTransactionsFinder(options.TF)) + } + + if options.Temp { + opts = append(opts, wallet.OptionTemp(true)) + } + + return opts +} diff --git a/vendor/github.com/sourcegraph/conc/.golangci.yml b/vendor/github.com/sourcegraph/conc/.golangci.yml new file mode 100644 index 0000000000..ae65a760a9 --- /dev/null +++ b/vendor/github.com/sourcegraph/conc/.golangci.yml @@ -0,0 +1,11 @@ +linters: + disable-all: true + enable: + - errcheck + - godot + - gosimple + - govet + - ineffassign + - staticcheck + - typecheck + - unused diff --git a/vendor/github.com/sourcegraph/conc/LICENSE b/vendor/github.com/sourcegraph/conc/LICENSE new file mode 100644 index 0000000000..1081f4ef4a --- /dev/null +++ b/vendor/github.com/sourcegraph/conc/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Sourcegraph + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/sourcegraph/conc/README.md b/vendor/github.com/sourcegraph/conc/README.md new file mode 100644 index 0000000000..1c87c3c969 --- /dev/null +++ b/vendor/github.com/sourcegraph/conc/README.md @@ -0,0 +1,464 @@ +![conch](https://user-images.githubusercontent.com/12631702/210295964-785cc63d-d697-420c-99ff-f492eb81dec9.svg) + +# `conc`: better structured concurrency for go + +[![Go Reference](https://pkg.go.dev/badge/github.com/sourcegraph/conc.svg)](https://pkg.go.dev/github.com/sourcegraph/conc) +[![Sourcegraph](https://img.shields.io/badge/view%20on-sourcegraph-A112FE?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAEZklEQVRoQ+2aXWgUZxSG3292sxtNN43BhBakFPyhxSujRSxiU1pr7SaGXqgUxOIEW0IFkeYighYUxAuLUlq0lrq2iCDpjWtmFVtoG6QVNOCFVShVLyxIk0DVjZLMxt3xTGTccd2ZOd/8JBHci0CY9zvnPPN+/7sCIXwKavOwAcy2QgngQiIztDSE0OwQlDPYR1ebiaH6J5kZChyfW12gRG4QVgGTBfMchMbFP9Sn5nlZL2D0JjLD6710lc+z0NfqSGTXQRQ4bX07Mq423yoBL3OSyHSvUxirMuaEvgbJWrdcvkHMoJwxYuq4INUhyuWvQa1jvdMGxAvCxJlyEC9XOBCWL04wwRzpbDoDQ7wfZJzIQLi5Eggk6DiRhZgWIAbE3NrM4A3LPT8Q7UgqAqLqTmLSHLGPkyzG/qXEczhd0q6RH+zaSBfaUoc4iQx19pIClIscrTkNZzG6gd7qMY6eC2Hqyo705ZfTf+eqJmhMzcSbYtQpOXc92ZsZjLVAL4YNUQbJ5Ttg4CQrQdGYj44Xr9m1XJCzmZusFDJOWNpHjmh5x624a2ZFtOKDVL+uNo2TuXE3bZQQZUf8gtgqP31uI94Z/rMqix+IGiRfWw3xN9dCgVx+L3WrHm4Dju6PXz/EkjuXJ6R+IGgyOE1TbZqTq9y1eo0EZo7oMo1ktPu3xjHvuiLT5AFNszUyDULtWpzE2/fEsey8O5TbWuGWwxrs5rS7nFNMWJrNh2No74s9Ec4vRNmRRzPXMP19fBMSVsGcOJ98G8N3Wl2gXcbTjbX7vUBxLaeASDQCm5Cu/0E2tvtb0Ea+BowtskFD0wvlc6Rf2M+Jx7dTu7ubFr2dnKDRaMQe2v/tcIrNB7FH0O50AcrBaApmRDVwFO31ql3pD8QW4dP0feNwl/Q+kFEtRyIGyaWXnpy1OO0qNJWHo1y6iCmAGkBb/Ru+HenDWIF2mo4r8G+tRRzoniSn2uqFLxANhe9LKHVyTbz6egk9+x5w5fK6ulSNNMhZ/Feno+GebLZV6isTTa6k5qNl5RnZ5u56Ib6SBvFzaWBBVFZzvnERWlt/Cg4l27XChLCqFyLekjhy6xJyoytgjPf7opIB8QPx7sYFiMXHPGt76m741MhCKMZfng0nBOIjmoJPsLqWHwgFpe6V6qtfcopxveR2Oy+J0ntIN/zCWkf8QNAJ7y6d8Bq4lxLc2/qJl5K7t432XwcqX5CrI34gzATWuYILQtdQPyePDK3iuOekCR3Efjhig1B1Uq5UoXEEoZX7d1q535J5S9VOeFyYyEBku5XTMXXKQTToX5Rg7OI44nbW5oKYeYK4EniMeF0YFNSmb+grhc84LyRCEP1/OurOcipCQbKxDeK2V5FcVyIDMQvsgz5gwFhcWWwKyRlvQ3gv29RwWoDYAbIofNyBxI9eDlQ+n3YgsgCWnr4MStGXQXmv9pF2La/k3OccV54JEBM4yp9EsXa/3LfO0dGPcYq0Y7DfZB8nJzZw2rppHgKgVHs8L5wvRwAAAABJRU5ErkJggg==)](https://sourcegraph.com/github.com/sourcegraph/conc) +[![Go Report Card](https://goreportcard.com/badge/github.com/sourcegraph/conc)](https://goreportcard.com/report/github.com/sourcegraph/conc) +[![codecov](https://codecov.io/gh/sourcegraph/conc/branch/main/graph/badge.svg?token=MQZTEA1QWT)](https://codecov.io/gh/sourcegraph/conc) +[![Discord](https://img.shields.io/badge/discord-chat-%235765F2)](https://discord.gg/bvXQXmtRjN) + +`conc` is your toolbelt for structured concurrency in go, making common tasks +easier and safer. + +```sh +go get github.com/sourcegraph/conc +``` + +# At a glance + +- Use [`conc.WaitGroup`](https://pkg.go.dev/github.com/sourcegraph/conc#WaitGroup) if you just want a safer version of `sync.WaitGroup` +- Use [`pool.Pool`](https://pkg.go.dev/github.com/sourcegraph/conc/pool#Pool) if you want a concurrency-limited task runner +- Use [`pool.ResultPool`](https://pkg.go.dev/github.com/sourcegraph/conc/pool#ResultPool) if you want a concurrent task runner that collects task results +- Use [`pool.(Result)?ErrorPool`](https://pkg.go.dev/github.com/sourcegraph/conc/pool#ErrorPool) if your tasks are fallible +- Use [`pool.(Result)?ContextPool`](https://pkg.go.dev/github.com/sourcegraph/conc/pool#ContextPool) if your tasks should be canceled on failure +- Use [`stream.Stream`](https://pkg.go.dev/github.com/sourcegraph/conc/stream#Stream) if you want to process an ordered stream of tasks in parallel with serial callbacks +- Use [`iter.Map`](https://pkg.go.dev/github.com/sourcegraph/conc/iter#Map) if you want to concurrently map a slice +- Use [`iter.ForEach`](https://pkg.go.dev/github.com/sourcegraph/conc/iter#ForEach) if you want to concurrently iterate over a slice +- Use [`panics.Catcher`](https://pkg.go.dev/github.com/sourcegraph/conc/panics#Catcher) if you want to catch panics in your own goroutines + +All pools are created with +[`pool.New()`](https://pkg.go.dev/github.com/sourcegraph/conc/pool#New) +or +[`pool.NewWithResults[T]()`](https://pkg.go.dev/github.com/sourcegraph/conc/pool#NewWithResults), +then configured with methods: + +- [`p.WithMaxGoroutines()`](https://pkg.go.dev/github.com/sourcegraph/conc/pool#Pool.MaxGoroutines) configures the maximum number of goroutines in the pool +- [`p.WithErrors()`](https://pkg.go.dev/github.com/sourcegraph/conc/pool#Pool.WithErrors) configures the pool to run tasks that return errors +- [`p.WithContext(ctx)`](https://pkg.go.dev/github.com/sourcegraph/conc/pool#Pool.WithContext) configures the pool to run tasks that should be canceled on first error +- [`p.WithFirstError()`](https://pkg.go.dev/github.com/sourcegraph/conc/pool#ErrorPool.WithFirstError) configures error pools to only keep the first returned error rather than an aggregated error +- [`p.WithCollectErrored()`](https://pkg.go.dev/github.com/sourcegraph/conc/pool#ResultContextPool.WithCollectErrored) configures result pools to collect results even when the task errored + +# Goals + +The main goals of the package are: +1) Make it harder to leak goroutines +2) Handle panics gracefully +3) Make concurrent code easier to read + +## Goal #1: Make it harder to leak goroutines + +A common pain point when working with goroutines is cleaning them up. It's +really easy to fire off a `go` statement and fail to properly wait for it to +complete. + +`conc` takes the opinionated stance that all concurrency should be scoped. +That is, goroutines should have an owner and that owner should always +ensure that its owned goroutines exit properly. + +In `conc`, the owner of a goroutine is always a `conc.WaitGroup`. Goroutines +are spawned in a `WaitGroup` with `(*WaitGroup).Go()`, and +`(*WaitGroup).Wait()` should always be called before the `WaitGroup` goes out +of scope. + +In some cases, you might want a spawned goroutine to outlast the scope of the +caller. In that case, you could pass a `WaitGroup` into the spawning function. + +```go +func main() { + var wg conc.WaitGroup + defer wg.Wait() + + startTheThing(&wg) +} + +func startTheThing(wg *conc.WaitGroup) { + wg.Go(func() { ... }) +} +``` + +For some more discussion on why scoped concurrency is nice, check out [this +blog +post](https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/). + +## Goal #2: Handle panics gracefully + +A frequent problem with goroutines in long-running applications is handling +panics. A goroutine spawned without a panic handler will crash the whole process +on panic. This is usually undesirable. + +However, if you do add a panic handler to a goroutine, what do you do with the +panic once you catch it? Some options: +1) Ignore it +2) Log it +3) Turn it into an error and return that to the goroutine spawner +4) Propagate the panic to the goroutine spawner + +Ignoring panics is a bad idea since panics usually mean there is actually +something wrong and someone should fix it. + +Just logging panics isn't great either because then there is no indication to the spawner +that something bad happened, and it might just continue on as normal even though your +program is in a really bad state. + +Both (3) and (4) are reasonable options, but both require the goroutine to have +an owner that can actually receive the message that something went wrong. This +is generally not true with a goroutine spawned with `go`, but in the `conc` +package, all goroutines have an owner that must collect the spawned goroutine. +In the conc package, any call to `Wait()` will panic if any of the spawned goroutines +panicked. Additionally, it decorates the panic value with a stacktrace from the child +goroutine so that you don't lose information about what caused the panic. + +Doing this all correctly every time you spawn something with `go` is not +trivial and it requires a lot of boilerplate that makes the important parts of +the code more difficult to read, so `conc` does this for you. + + + + + + + + + + +
stdlibconc
+ +```go +type caughtPanicError struct { + val any + stack []byte +} + +func (e *caughtPanicError) Error() string { + return fmt.Sprintf( + "panic: %q\n%s", + e.val, + string(e.stack) + ) +} + +func main() { + done := make(chan error) + go func() { + defer func() { + if v := recover(); v != nil { + done <- &caughtPanicError{ + val: v, + stack: debug.Stack() + } + } else { + done <- nil + } + }() + doSomethingThatMightPanic() + }() + err := <-done + if err != nil { + panic(err) + } +} +``` + + +```go +func main() { + var wg conc.WaitGroup + wg.Go(doSomethingThatMightPanic) + // panics with a nice stacktrace + wg.Wait() +} +``` +
+ +## Goal #3: Make concurrent code easier to read + +Doing concurrency correctly is difficult. Doing it in a way that doesn't +obfuscate what the code is actually doing is more difficult. The `conc` package +attempts to make common operations easier by abstracting as much boilerplate +complexity as possible. + +Want to run a set of concurrent tasks with a bounded set of goroutines? Use +`pool.New()`. Want to process an ordered stream of results concurrently, but +still maintain order? Try `stream.New()`. What about a concurrent map over +a slice? Take a peek at `iter.Map()`. + +Browse some examples below for some comparisons with doing these by hand. + +# Examples + +Each of these examples forgoes propagating panics for simplicity. To see +what kind of complexity that would add, check out the "Goal #2" header above. + +Spawn a set of goroutines and waiting for them to finish: + + + + + + + + + + +
stdlibconc
+ +```go +func main() { + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + // crashes on panic! + doSomething() + }() + } + wg.Wait() +} +``` + + +```go +func main() { + var wg conc.WaitGroup + for i := 0; i < 10; i++ { + wg.Go(doSomething) + } + wg.Wait() +} +``` +
+ +Process each element of a stream in a static pool of goroutines: + + + + + + + + + + +
stdlibconc
+ +```go +func process(stream chan int) { + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for elem := range stream { + handle(elem) + } + }() + } + wg.Wait() +} +``` + + +```go +func process(stream chan int) { + p := pool.New().WithMaxGoroutines(10) + for elem := range stream { + elem := elem + p.Go(func() { + handle(elem) + }) + } + p.Wait() +} +``` +
+ +Process each element of a slice in a static pool of goroutines: + + + + + + + + + + +
stdlibconc
+ +```go +func process(values []int) { + feeder := make(chan int, 8) + + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for elem := range feeder { + handle(elem) + } + }() + } + + for _, value := range values { + feeder <- value + } + close(feeder) + wg.Wait() +} +``` + + +```go +func process(values []int) { + iter.ForEach(values, handle) +} +``` +
+ +Concurrently map a slice: + + + + + + + + + + +
stdlibconc
+ +```go +func concMap( + input []int, + f func(int) int, +) []int { + res := make([]int, len(input)) + var idx atomic.Int64 + + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + for { + i := int(idx.Add(1) - 1) + if i >= len(input) { + return + } + + res[i] = f(input[i]) + } + }() + } + wg.Wait() + return res +} +``` + + +```go +func concMap( + input []int, + f func(*int) int, +) []int { + return iter.Map(input, f) +} +``` +
+ +Process an ordered stream concurrently: + + + + + + + + + + + +
stdlibconc
+ +```go +func mapStream( + in chan int, + out chan int, + f func(int) int, +) { + tasks := make(chan func()) + taskResults := make(chan chan int) + + // Worker goroutines + var workerWg sync.WaitGroup + for i := 0; i < 10; i++ { + workerWg.Add(1) + go func() { + defer workerWg.Done() + for task := range tasks { + task() + } + }() + } + + // Ordered reader goroutines + var readerWg sync.WaitGroup + readerWg.Add(1) + go func() { + defer readerWg.Done() + for result := range taskResults { + item := <-result + out <- item + } + }() + + // Feed the workers with tasks + for elem := range in { + resultCh := make(chan int, 1) + taskResults <- resultCh + tasks <- func() { + resultCh <- f(elem) + } + } + + // We've exhausted input. + // Wait for everything to finish + close(tasks) + workerWg.Wait() + close(taskResults) + readerWg.Wait() +} +``` + + +```go +func mapStream( + in chan int, + out chan int, + f func(int) int, +) { + s := stream.New().WithMaxGoroutines(10) + for elem := range in { + elem := elem + s.Go(func() stream.Callback { + res := f(elem) + return func() { out <- res } + }) + } + s.Wait() +} +``` +
+ +# Status + +This package is currently pre-1.0. There are likely to be minor breaking +changes before a 1.0 release as we stabilize the APIs and tweak defaults. +Please open an issue if you have questions, concerns, or requests that you'd +like addressed before the 1.0 release. Currently, a 1.0 is targeted for +March 2023. diff --git a/vendor/github.com/sourcegraph/conc/internal/multierror/multierror_go119.go b/vendor/github.com/sourcegraph/conc/internal/multierror/multierror_go119.go new file mode 100644 index 0000000000..7087e32a8f --- /dev/null +++ b/vendor/github.com/sourcegraph/conc/internal/multierror/multierror_go119.go @@ -0,0 +1,10 @@ +//go:build !go1.20 +// +build !go1.20 + +package multierror + +import "go.uber.org/multierr" + +var ( + Join = multierr.Combine +) diff --git a/vendor/github.com/sourcegraph/conc/internal/multierror/multierror_go120.go b/vendor/github.com/sourcegraph/conc/internal/multierror/multierror_go120.go new file mode 100644 index 0000000000..39cff829ac --- /dev/null +++ b/vendor/github.com/sourcegraph/conc/internal/multierror/multierror_go120.go @@ -0,0 +1,10 @@ +//go:build go1.20 +// +build go1.20 + +package multierror + +import "errors" + +var ( + Join = errors.Join +) diff --git a/vendor/github.com/sourcegraph/conc/iter/iter.go b/vendor/github.com/sourcegraph/conc/iter/iter.go new file mode 100644 index 0000000000..124b4f9400 --- /dev/null +++ b/vendor/github.com/sourcegraph/conc/iter/iter.go @@ -0,0 +1,85 @@ +package iter + +import ( + "runtime" + "sync/atomic" + + "github.com/sourcegraph/conc" +) + +// defaultMaxGoroutines returns the default maximum number of +// goroutines to use within this package. +func defaultMaxGoroutines() int { return runtime.GOMAXPROCS(0) } + +// Iterator can be used to configure the behaviour of ForEach +// and ForEachIdx. The zero value is safe to use with reasonable +// defaults. +// +// Iterator is also safe for reuse and concurrent use. +type Iterator[T any] struct { + // MaxGoroutines controls the maximum number of goroutines + // to use on this Iterator's methods. + // + // If unset, MaxGoroutines defaults to runtime.GOMAXPROCS(0). + MaxGoroutines int +} + +// ForEach executes f in parallel over each element in input. +// +// It is safe to mutate the input parameter, which makes it +// possible to map in place. +// +// ForEach always uses at most runtime.GOMAXPROCS goroutines. +// It takes roughly 2µs to start up the goroutines and adds +// an overhead of roughly 50ns per element of input. For +// a configurable goroutine limit, use a custom Iterator. +func ForEach[T any](input []T, f func(*T)) { Iterator[T]{}.ForEach(input, f) } + +// ForEach executes f in parallel over each element in input, +// using up to the Iterator's configured maximum number of +// goroutines. +// +// It is safe to mutate the input parameter, which makes it +// possible to map in place. +// +// It takes roughly 2µs to start up the goroutines and adds +// an overhead of roughly 50ns per element of input. +func (iter Iterator[T]) ForEach(input []T, f func(*T)) { + iter.ForEachIdx(input, func(_ int, t *T) { + f(t) + }) +} + +// ForEachIdx is the same as ForEach except it also provides the +// index of the element to the callback. +func ForEachIdx[T any](input []T, f func(int, *T)) { Iterator[T]{}.ForEachIdx(input, f) } + +// ForEachIdx is the same as ForEach except it also provides the +// index of the element to the callback. +func (iter Iterator[T]) ForEachIdx(input []T, f func(int, *T)) { + if iter.MaxGoroutines == 0 { + // iter is a value receiver and is hence safe to mutate + iter.MaxGoroutines = defaultMaxGoroutines() + } + + numInput := len(input) + if iter.MaxGoroutines > numInput { + // No more concurrent tasks than the number of input items. + iter.MaxGoroutines = numInput + } + + var idx atomic.Int64 + // Create the task outside the loop to avoid extra closure allocations. + task := func() { + i := int(idx.Add(1) - 1) + for ; i < numInput; i = int(idx.Add(1) - 1) { + f(i, &input[i]) + } + } + + var wg conc.WaitGroup + for i := 0; i < iter.MaxGoroutines; i++ { + wg.Go(task) + } + wg.Wait() +} diff --git a/vendor/github.com/sourcegraph/conc/iter/map.go b/vendor/github.com/sourcegraph/conc/iter/map.go new file mode 100644 index 0000000000..efbe6bfaf1 --- /dev/null +++ b/vendor/github.com/sourcegraph/conc/iter/map.go @@ -0,0 +1,65 @@ +package iter + +import ( + "sync" + + "github.com/sourcegraph/conc/internal/multierror" +) + +// Mapper is an Iterator with a result type R. It can be used to configure +// the behaviour of Map and MapErr. The zero value is safe to use with +// reasonable defaults. +// +// Mapper is also safe for reuse and concurrent use. +type Mapper[T, R any] Iterator[T] + +// Map applies f to each element of input, returning the mapped result. +// +// Map always uses at most runtime.GOMAXPROCS goroutines. For a configurable +// goroutine limit, use a custom Mapper. +func Map[T, R any](input []T, f func(*T) R) []R { + return Mapper[T, R]{}.Map(input, f) +} + +// Map applies f to each element of input, returning the mapped result. +// +// Map uses up to the configured Mapper's maximum number of goroutines. +func (m Mapper[T, R]) Map(input []T, f func(*T) R) []R { + res := make([]R, len(input)) + Iterator[T](m).ForEachIdx(input, func(i int, t *T) { + res[i] = f(t) + }) + return res +} + +// MapErr applies f to each element of the input, returning the mapped result +// and a combined error of all returned errors. +// +// Map always uses at most runtime.GOMAXPROCS goroutines. For a configurable +// goroutine limit, use a custom Mapper. +func MapErr[T, R any](input []T, f func(*T) (R, error)) ([]R, error) { + return Mapper[T, R]{}.MapErr(input, f) +} + +// MapErr applies f to each element of the input, returning the mapped result +// and a combined error of all returned errors. +// +// Map uses up to the configured Mapper's maximum number of goroutines. +func (m Mapper[T, R]) MapErr(input []T, f func(*T) (R, error)) ([]R, error) { + var ( + res = make([]R, len(input)) + errMux sync.Mutex + errs error + ) + Iterator[T](m).ForEachIdx(input, func(i int, t *T) { + var err error + res[i], err = f(t) + if err != nil { + errMux.Lock() + // TODO: use stdlib errors once multierrors land in go 1.20 + errs = multierror.Join(errs, err) + errMux.Unlock() + } + }) + return res, errs +} diff --git a/vendor/github.com/sourcegraph/conc/panics/panics.go b/vendor/github.com/sourcegraph/conc/panics/panics.go new file mode 100644 index 0000000000..abbed7fa05 --- /dev/null +++ b/vendor/github.com/sourcegraph/conc/panics/panics.go @@ -0,0 +1,102 @@ +package panics + +import ( + "fmt" + "runtime" + "runtime/debug" + "sync/atomic" +) + +// Catcher is used to catch panics. You can execute a function with Try, +// which will catch any spawned panic. Try can be called any number of times, +// from any number of goroutines. Once all calls to Try have completed, you can +// get the value of the first panic (if any) with Recovered(), or you can just +// propagate the panic (re-panic) with Repanic(). +type Catcher struct { + recovered atomic.Pointer[Recovered] +} + +// Try executes f, catching any panic it might spawn. It is safe +// to call from multiple goroutines simultaneously. +func (p *Catcher) Try(f func()) { + defer p.tryRecover() + f() +} + +func (p *Catcher) tryRecover() { + if val := recover(); val != nil { + rp := NewRecovered(1, val) + p.recovered.CompareAndSwap(nil, &rp) + } +} + +// Repanic panics if any calls to Try caught a panic. It will panic with the +// value of the first panic caught, wrapped in a panics.Recovered with caller +// information. +func (p *Catcher) Repanic() { + if val := p.Recovered(); val != nil { + panic(val) + } +} + +// Recovered returns the value of the first panic caught by Try, or nil if +// no calls to Try panicked. +func (p *Catcher) Recovered() *Recovered { + return p.recovered.Load() +} + +// NewRecovered creates a panics.Recovered from a panic value and a collected +// stacktrace. The skip parameter allows the caller to skip stack frames when +// collecting the stacktrace. Calling with a skip of 0 means include the call to +// NewRecovered in the stacktrace. +func NewRecovered(skip int, value any) Recovered { + // 64 frames should be plenty + var callers [64]uintptr + n := runtime.Callers(skip+1, callers[:]) + return Recovered{ + Value: value, + Callers: callers[:n], + Stack: debug.Stack(), + } +} + +// Recovered is a panic that was caught with recover(). +type Recovered struct { + // The original value of the panic. + Value any + // The caller list as returned by runtime.Callers when the panic was + // recovered. Can be used to produce a more detailed stack information with + // runtime.CallersFrames. + Callers []uintptr + // The formatted stacktrace from the goroutine where the panic was recovered. + // Easier to use than Callers. + Stack []byte +} + +// String renders a human-readable formatting of the panic. +func (p *Recovered) String() string { + return fmt.Sprintf("panic: %v\nstacktrace:\n%s\n", p.Value, p.Stack) +} + +// AsError casts the panic into an error implementation. The implementation +// is unwrappable with the cause of the panic, if the panic was provided one. +func (p *Recovered) AsError() error { + if p == nil { + return nil + } + return &ErrRecovered{*p} +} + +// ErrRecovered wraps a panics.Recovered in an error implementation. +type ErrRecovered struct{ Recovered } + +var _ error = (*ErrRecovered)(nil) + +func (p *ErrRecovered) Error() string { return p.String() } + +func (p *ErrRecovered) Unwrap() error { + if err, ok := p.Value.(error); ok { + return err + } + return nil +} diff --git a/vendor/github.com/sourcegraph/conc/panics/try.go b/vendor/github.com/sourcegraph/conc/panics/try.go new file mode 100644 index 0000000000..4ded92a1cb --- /dev/null +++ b/vendor/github.com/sourcegraph/conc/panics/try.go @@ -0,0 +1,11 @@ +package panics + +// Try executes f, catching and returning any panic it might spawn. +// +// The recovered panic can be propagated with panic(), or handled as a normal error with +// (*panics.Recovered).AsError(). +func Try(f func()) *Recovered { + var c Catcher + c.Try(f) + return c.Recovered() +} diff --git a/vendor/github.com/sourcegraph/conc/waitgroup.go b/vendor/github.com/sourcegraph/conc/waitgroup.go new file mode 100644 index 0000000000..47b1bc1a5c --- /dev/null +++ b/vendor/github.com/sourcegraph/conc/waitgroup.go @@ -0,0 +1,52 @@ +package conc + +import ( + "sync" + + "github.com/sourcegraph/conc/panics" +) + +// NewWaitGroup creates a new WaitGroup. +func NewWaitGroup() *WaitGroup { + return &WaitGroup{} +} + +// WaitGroup is the primary building block for scoped concurrency. +// Goroutines can be spawned in the WaitGroup with the Go method, +// and calling Wait() will ensure that each of those goroutines exits +// before continuing. Any panics in a child goroutine will be caught +// and propagated to the caller of Wait(). +// +// The zero value of WaitGroup is usable, just like sync.WaitGroup. +// Also like sync.WaitGroup, it must not be copied after first use. +type WaitGroup struct { + wg sync.WaitGroup + pc panics.Catcher +} + +// Go spawns a new goroutine in the WaitGroup. +func (h *WaitGroup) Go(f func()) { + h.wg.Add(1) + go func() { + defer h.wg.Done() + h.pc.Try(f) + }() +} + +// Wait will block until all goroutines spawned with Go exit and will +// propagate any panics spawned in a child goroutine. +func (h *WaitGroup) Wait() { + h.wg.Wait() + + // Propagate a panic if we caught one from a child goroutine. + h.pc.Repanic() +} + +// WaitAndRecover will block until all goroutines spawned with Go exit and +// will return a *panics.Recovered if one of the child goroutines panics. +func (h *WaitGroup) WaitAndRecover() *panics.Recovered { + h.wg.Wait() + + // Return a recovered panic if we caught one from a child goroutine. + return h.pc.Recovered() +} diff --git a/vendor/github.com/spf13/afero/.gitignore b/vendor/github.com/spf13/afero/.gitignore new file mode 100644 index 0000000000..9c1d986118 --- /dev/null +++ b/vendor/github.com/spf13/afero/.gitignore @@ -0,0 +1,2 @@ +sftpfs/file1 +sftpfs/test/ diff --git a/vendor/github.com/spf13/afero/LICENSE.txt b/vendor/github.com/spf13/afero/LICENSE.txt new file mode 100644 index 0000000000..298f0e2665 --- /dev/null +++ b/vendor/github.com/spf13/afero/LICENSE.txt @@ -0,0 +1,174 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. diff --git a/vendor/github.com/spf13/afero/README.md b/vendor/github.com/spf13/afero/README.md new file mode 100644 index 0000000000..3bafbfdfca --- /dev/null +++ b/vendor/github.com/spf13/afero/README.md @@ -0,0 +1,442 @@ +![afero logo-sm](https://cloud.githubusercontent.com/assets/173412/11490338/d50e16dc-97a5-11e5-8b12-019a300d0fcb.png) + +A FileSystem Abstraction System for Go + +[![Test](https://github.com/spf13/afero/actions/workflows/test.yml/badge.svg)](https://github.com/spf13/afero/actions/workflows/test.yml) [![GoDoc](https://godoc.org/github.com/spf13/afero?status.svg)](https://godoc.org/github.com/spf13/afero) [![Join the chat at https://gitter.im/spf13/afero](https://badges.gitter.im/Dev%20Chat.svg)](https://gitter.im/spf13/afero?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +# Overview + +Afero is a filesystem framework providing a simple, uniform and universal API +interacting with any filesystem, as an abstraction layer providing interfaces, +types and methods. Afero has an exceptionally clean interface and simple design +without needless constructors or initialization methods. + +Afero is also a library providing a base set of interoperable backend +filesystems that make it easy to work with afero while retaining all the power +and benefit of the os and ioutil packages. + +Afero provides significant improvements over using the os package alone, most +notably the ability to create mock and testing filesystems without relying on the disk. + +It is suitable for use in any situation where you would consider using the OS +package as it provides an additional abstraction that makes it easy to use a +memory backed file system during testing. It also adds support for the http +filesystem for full interoperability. + + +## Afero Features + +* A single consistent API for accessing a variety of filesystems +* Interoperation between a variety of file system types +* A set of interfaces to encourage and enforce interoperability between backends +* An atomic cross platform memory backed file system +* Support for compositional (union) file systems by combining multiple file systems acting as one +* Specialized backends which modify existing filesystems (Read Only, Regexp filtered) +* A set of utility functions ported from io, ioutil & hugo to be afero aware +* Wrapper for go 1.16 filesystem abstraction `io/fs.FS` + +# Using Afero + +Afero is easy to use and easier to adopt. + +A few different ways you could use Afero: + +* Use the interfaces alone to define your own file system. +* Wrapper for the OS packages. +* Define different filesystems for different parts of your application. +* Use Afero for mock filesystems while testing + +## Step 1: Install Afero + +First use go get to install the latest version of the library. + + $ go get github.com/spf13/afero + +Next include Afero in your application. +```go +import "github.com/spf13/afero" +``` + +## Step 2: Declare a backend + +First define a package variable and set it to a pointer to a filesystem. +```go +var AppFs = afero.NewMemMapFs() + +or + +var AppFs = afero.NewOsFs() +``` +It is important to note that if you repeat the composite literal you +will be using a completely new and isolated filesystem. In the case of +OsFs it will still use the same underlying filesystem but will reduce +the ability to drop in other filesystems as desired. + +## Step 3: Use it like you would the OS package + +Throughout your application use any function and method like you normally +would. + +So if my application before had: +```go +os.Open("/tmp/foo") +``` +We would replace it with: +```go +AppFs.Open("/tmp/foo") +``` + +`AppFs` being the variable we defined above. + + +## List of all available functions + +File System Methods Available: +```go +Chmod(name string, mode os.FileMode) : error +Chown(name string, uid, gid int) : error +Chtimes(name string, atime time.Time, mtime time.Time) : error +Create(name string) : File, error +Mkdir(name string, perm os.FileMode) : error +MkdirAll(path string, perm os.FileMode) : error +Name() : string +Open(name string) : File, error +OpenFile(name string, flag int, perm os.FileMode) : File, error +Remove(name string) : error +RemoveAll(path string) : error +Rename(oldname, newname string) : error +Stat(name string) : os.FileInfo, error +``` +File Interfaces and Methods Available: +```go +io.Closer +io.Reader +io.ReaderAt +io.Seeker +io.Writer +io.WriterAt + +Name() : string +Readdir(count int) : []os.FileInfo, error +Readdirnames(n int) : []string, error +Stat() : os.FileInfo, error +Sync() : error +Truncate(size int64) : error +WriteString(s string) : ret int, err error +``` +In some applications it may make sense to define a new package that +simply exports the file system variable for easy access from anywhere. + +## Using Afero's utility functions + +Afero provides a set of functions to make it easier to use the underlying file systems. +These functions have been primarily ported from io & ioutil with some developed for Hugo. + +The afero utilities support all afero compatible backends. + +The list of utilities includes: + +```go +DirExists(path string) (bool, error) +Exists(path string) (bool, error) +FileContainsBytes(filename string, subslice []byte) (bool, error) +GetTempDir(subPath string) string +IsDir(path string) (bool, error) +IsEmpty(path string) (bool, error) +ReadDir(dirname string) ([]os.FileInfo, error) +ReadFile(filename string) ([]byte, error) +SafeWriteReader(path string, r io.Reader) (err error) +TempDir(dir, prefix string) (name string, err error) +TempFile(dir, prefix string) (f File, err error) +Walk(root string, walkFn filepath.WalkFunc) error +WriteFile(filename string, data []byte, perm os.FileMode) error +WriteReader(path string, r io.Reader) (err error) +``` +For a complete list see [Afero's GoDoc](https://godoc.org/github.com/spf13/afero) + +They are available under two different approaches to use. You can either call +them directly where the first parameter of each function will be the file +system, or you can declare a new `Afero`, a custom type used to bind these +functions as methods to a given filesystem. + +### Calling utilities directly + +```go +fs := new(afero.MemMapFs) +f, err := afero.TempFile(fs,"", "ioutil-test") + +``` + +### Calling via Afero + +```go +fs := afero.NewMemMapFs() +afs := &afero.Afero{Fs: fs} +f, err := afs.TempFile("", "ioutil-test") +``` + +## Using Afero for Testing + +There is a large benefit to using a mock filesystem for testing. It has a +completely blank state every time it is initialized and can be easily +reproducible regardless of OS. You could create files to your heart’s content +and the file access would be fast while also saving you from all the annoying +issues with deleting temporary files, Windows file locking, etc. The MemMapFs +backend is perfect for testing. + +* Much faster than performing I/O operations on disk +* Avoid security issues and permissions +* Far more control. 'rm -rf /' with confidence +* Test setup is far more easier to do +* No test cleanup needed + +One way to accomplish this is to define a variable as mentioned above. +In your application this will be set to afero.NewOsFs() during testing you +can set it to afero.NewMemMapFs(). + +It wouldn't be uncommon to have each test initialize a blank slate memory +backend. To do this I would define my `appFS = afero.NewOsFs()` somewhere +appropriate in my application code. This approach ensures that Tests are order +independent, with no test relying on the state left by an earlier test. + +Then in my tests I would initialize a new MemMapFs for each test: +```go +func TestExist(t *testing.T) { + appFS := afero.NewMemMapFs() + // create test files and directories + appFS.MkdirAll("src/a", 0755) + afero.WriteFile(appFS, "src/a/b", []byte("file b"), 0644) + afero.WriteFile(appFS, "src/c", []byte("file c"), 0644) + name := "src/c" + _, err := appFS.Stat(name) + if os.IsNotExist(err) { + t.Errorf("file \"%s\" does not exist.\n", name) + } +} +``` + +# Available Backends + +## Operating System Native + +### OsFs + +The first is simply a wrapper around the native OS calls. This makes it +very easy to use as all of the calls are the same as the existing OS +calls. It also makes it trivial to have your code use the OS during +operation and a mock filesystem during testing or as needed. + +```go +appfs := afero.NewOsFs() +appfs.MkdirAll("src/a", 0755) +``` + +## Memory Backed Storage + +### MemMapFs + +Afero also provides a fully atomic memory backed filesystem perfect for use in +mocking and to speed up unnecessary disk io when persistence isn’t +necessary. It is fully concurrent and will work within go routines +safely. + +```go +mm := afero.NewMemMapFs() +mm.MkdirAll("src/a", 0755) +``` + +#### InMemoryFile + +As part of MemMapFs, Afero also provides an atomic, fully concurrent memory +backed file implementation. This can be used in other memory backed file +systems with ease. Plans are to add a radix tree memory stored file +system using InMemoryFile. + +## Network Interfaces + +### SftpFs + +Afero has experimental support for secure file transfer protocol (sftp). Which can +be used to perform file operations over a encrypted channel. + +### GCSFs + +Afero has experimental support for Google Cloud Storage (GCS). You can either set the +`GOOGLE_APPLICATION_CREDENTIALS_JSON` env variable to your JSON credentials or use `opts` in +`NewGcsFS` to configure access to your GCS bucket. + +Some known limitations of the existing implementation: +* No Chmod support - The GCS ACL could probably be mapped to *nix style permissions but that would add another level of complexity and is ignored in this version. +* No Chtimes support - Could be simulated with attributes (gcs a/m-times are set implicitly) but that's is left for another version. +* Not thread safe - Also assumes all file operations are done through the same instance of the GcsFs. File operations between different GcsFs instances are not guaranteed to be consistent. + + +## Filtering Backends + +### BasePathFs + +The BasePathFs restricts all operations to a given path within an Fs. +The given file name to the operations on this Fs will be prepended with +the base path before calling the source Fs. + +```go +bp := afero.NewBasePathFs(afero.NewOsFs(), "/base/path") +``` + +### ReadOnlyFs + +A thin wrapper around the source Fs providing a read only view. + +```go +fs := afero.NewReadOnlyFs(afero.NewOsFs()) +_, err := fs.Create("/file.txt") +// err = syscall.EPERM +``` + +# RegexpFs + +A filtered view on file names, any file NOT matching +the passed regexp will be treated as non-existing. +Files not matching the regexp provided will not be created. +Directories are not filtered. + +```go +fs := afero.NewRegexpFs(afero.NewMemMapFs(), regexp.MustCompile(`\.txt$`)) +_, err := fs.Create("/file.html") +// err = syscall.ENOENT +``` + +### HttpFs + +Afero provides an http compatible backend which can wrap any of the existing +backends. + +The Http package requires a slightly specific version of Open which +returns an http.File type. + +Afero provides an httpFs file system which satisfies this requirement. +Any Afero FileSystem can be used as an httpFs. + +```go +httpFs := afero.NewHttpFs() +fileserver := http.FileServer(httpFs.Dir()) +http.Handle("/", fileserver) +``` + +## Composite Backends + +Afero provides the ability have two filesystems (or more) act as a single +file system. + +### CacheOnReadFs + +The CacheOnReadFs will lazily make copies of any accessed files from the base +layer into the overlay. Subsequent reads will be pulled from the overlay +directly permitting the request is within the cache duration of when it was +created in the overlay. + +If the base filesystem is writeable, any changes to files will be +done first to the base, then to the overlay layer. Write calls to open file +handles like `Write()` or `Truncate()` to the overlay first. + +To writing files to the overlay only, you can use the overlay Fs directly (not +via the union Fs). + +Cache files in the layer for the given time.Duration, a cache duration of 0 +means "forever" meaning the file will not be re-requested from the base ever. + +A read-only base will make the overlay also read-only but still copy files +from the base to the overlay when they're not present (or outdated) in the +caching layer. + +```go +base := afero.NewOsFs() +layer := afero.NewMemMapFs() +ufs := afero.NewCacheOnReadFs(base, layer, 100 * time.Second) +``` + +### CopyOnWriteFs() + +The CopyOnWriteFs is a read only base file system with a potentially +writeable layer on top. + +Read operations will first look in the overlay and if not found there, will +serve the file from the base. + +Changes to the file system will only be made in the overlay. + +Any attempt to modify a file found only in the base will copy the file to the +overlay layer before modification (including opening a file with a writable +handle). + +Removing and Renaming files present only in the base layer is not currently +permitted. If a file is present in the base layer and the overlay, only the +overlay will be removed/renamed. + +```go + base := afero.NewOsFs() + roBase := afero.NewReadOnlyFs(base) + ufs := afero.NewCopyOnWriteFs(roBase, afero.NewMemMapFs()) + + fh, _ = ufs.Create("/home/test/file2.txt") + fh.WriteString("This is a test") + fh.Close() +``` + +In this example all write operations will only occur in memory (MemMapFs) +leaving the base filesystem (OsFs) untouched. + + +## Desired/possible backends + +The following is a short list of possible backends we hope someone will +implement: + +* SSH +* S3 + +# About the project + +## What's in the name + +Afero comes from the latin roots Ad-Facere. + +**"Ad"** is a prefix meaning "to". + +**"Facere"** is a form of the root "faciō" making "make or do". + +The literal meaning of afero is "to make" or "to do" which seems very fitting +for a library that allows one to make files and directories and do things with them. + +The English word that shares the same roots as Afero is "affair". Affair shares +the same concept but as a noun it means "something that is made or done" or "an +object of a particular type". + +It's also nice that unlike some of my other libraries (hugo, cobra, viper) it +Googles very well. + +## Release Notes + +See the [Releases Page](https://github.com/spf13/afero/releases). + +## Contributing + +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new Pull Request + +## Contributors + +Names in no particular order: + +* [spf13](https://github.com/spf13) +* [jaqx0r](https://github.com/jaqx0r) +* [mbertschler](https://github.com/mbertschler) +* [xor-gate](https://github.com/xor-gate) + +## License + +Afero is released under the Apache 2.0 license. See +[LICENSE.txt](https://github.com/spf13/afero/blob/master/LICENSE.txt) diff --git a/vendor/github.com/spf13/afero/afero.go b/vendor/github.com/spf13/afero/afero.go new file mode 100644 index 0000000000..39f6585209 --- /dev/null +++ b/vendor/github.com/spf13/afero/afero.go @@ -0,0 +1,111 @@ +// Copyright © 2014 Steve Francia . +// Copyright 2013 tsuru authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package afero provides types and methods for interacting with the filesystem, +// as an abstraction layer. + +// Afero also provides a few implementations that are mostly interoperable. One that +// uses the operating system filesystem, one that uses memory to store files +// (cross platform) and an interface that should be implemented if you want to +// provide your own filesystem. + +package afero + +import ( + "errors" + "io" + "os" + "time" +) + +type Afero struct { + Fs +} + +// File represents a file in the filesystem. +type File interface { + io.Closer + io.Reader + io.ReaderAt + io.Seeker + io.Writer + io.WriterAt + + Name() string + Readdir(count int) ([]os.FileInfo, error) + Readdirnames(n int) ([]string, error) + Stat() (os.FileInfo, error) + Sync() error + Truncate(size int64) error + WriteString(s string) (ret int, err error) +} + +// Fs is the filesystem interface. +// +// Any simulated or real filesystem should implement this interface. +type Fs interface { + // Create creates a file in the filesystem, returning the file and an + // error, if any happens. + Create(name string) (File, error) + + // Mkdir creates a directory in the filesystem, return an error if any + // happens. + Mkdir(name string, perm os.FileMode) error + + // MkdirAll creates a directory path and all parents that does not exist + // yet. + MkdirAll(path string, perm os.FileMode) error + + // Open opens a file, returning it or an error, if any happens. + Open(name string) (File, error) + + // OpenFile opens a file using the given flags and the given mode. + OpenFile(name string, flag int, perm os.FileMode) (File, error) + + // Remove removes a file identified by name, returning an error, if any + // happens. + Remove(name string) error + + // RemoveAll removes a directory path and any children it contains. It + // does not fail if the path does not exist (return nil). + RemoveAll(path string) error + + // Rename renames a file. + Rename(oldname, newname string) error + + // Stat returns a FileInfo describing the named file, or an error, if any + // happens. + Stat(name string) (os.FileInfo, error) + + // The name of this FileSystem + Name() string + + // Chmod changes the mode of the named file to mode. + Chmod(name string, mode os.FileMode) error + + // Chown changes the uid and gid of the named file. + Chown(name string, uid, gid int) error + + // Chtimes changes the access and modification times of the named file + Chtimes(name string, atime time.Time, mtime time.Time) error +} + +var ( + ErrFileClosed = errors.New("File is closed") + ErrOutOfRange = errors.New("out of range") + ErrTooLarge = errors.New("too large") + ErrFileNotFound = os.ErrNotExist + ErrFileExists = os.ErrExist + ErrDestinationExists = os.ErrExist +) diff --git a/vendor/github.com/spf13/afero/appveyor.yml b/vendor/github.com/spf13/afero/appveyor.yml new file mode 100644 index 0000000000..65e20e8ca3 --- /dev/null +++ b/vendor/github.com/spf13/afero/appveyor.yml @@ -0,0 +1,10 @@ +# This currently does nothing. We have moved to GitHub action, but this is kept +# until spf13 has disabled this project in AppVeyor. +version: '{build}' +clone_folder: C:\gopath\src\github.com\spf13\afero +environment: + GOPATH: C:\gopath +build_script: +- cmd: >- + go version + diff --git a/vendor/github.com/spf13/afero/basepath.go b/vendor/github.com/spf13/afero/basepath.go new file mode 100644 index 0000000000..2e72793a3e --- /dev/null +++ b/vendor/github.com/spf13/afero/basepath.go @@ -0,0 +1,222 @@ +package afero + +import ( + "io/fs" + "os" + "path/filepath" + "runtime" + "strings" + "time" +) + +var ( + _ Lstater = (*BasePathFs)(nil) + _ fs.ReadDirFile = (*BasePathFile)(nil) +) + +// The BasePathFs restricts all operations to a given path within an Fs. +// The given file name to the operations on this Fs will be prepended with +// the base path before calling the base Fs. +// Any file name (after filepath.Clean()) outside this base path will be +// treated as non existing file. +// +// Note that it does not clean the error messages on return, so you may +// reveal the real path on errors. +type BasePathFs struct { + source Fs + path string +} + +type BasePathFile struct { + File + path string +} + +func (f *BasePathFile) Name() string { + sourcename := f.File.Name() + return strings.TrimPrefix(sourcename, filepath.Clean(f.path)) +} + +func (f *BasePathFile) ReadDir(n int) ([]fs.DirEntry, error) { + if rdf, ok := f.File.(fs.ReadDirFile); ok { + return rdf.ReadDir(n) + } + return readDirFile{f.File}.ReadDir(n) +} + +func NewBasePathFs(source Fs, path string) Fs { + return &BasePathFs{source: source, path: path} +} + +// on a file outside the base path it returns the given file name and an error, +// else the given file with the base path prepended +func (b *BasePathFs) RealPath(name string) (path string, err error) { + if err := validateBasePathName(name); err != nil { + return name, err + } + + bpath := filepath.Clean(b.path) + path = filepath.Clean(filepath.Join(bpath, name)) + if !strings.HasPrefix(path, bpath) { + return name, os.ErrNotExist + } + + return path, nil +} + +func validateBasePathName(name string) error { + if runtime.GOOS != "windows" { + // Not much to do here; + // the virtual file paths all look absolute on *nix. + return nil + } + + // On Windows a common mistake would be to provide an absolute OS path + // We could strip out the base part, but that would not be very portable. + if filepath.IsAbs(name) { + return os.ErrNotExist + } + + return nil +} + +func (b *BasePathFs) Chtimes(name string, atime, mtime time.Time) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "chtimes", Path: name, Err: err} + } + return b.source.Chtimes(name, atime, mtime) +} + +func (b *BasePathFs) Chmod(name string, mode os.FileMode) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "chmod", Path: name, Err: err} + } + return b.source.Chmod(name, mode) +} + +func (b *BasePathFs) Chown(name string, uid, gid int) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "chown", Path: name, Err: err} + } + return b.source.Chown(name, uid, gid) +} + +func (b *BasePathFs) Name() string { + return "BasePathFs" +} + +func (b *BasePathFs) Stat(name string) (fi os.FileInfo, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "stat", Path: name, Err: err} + } + return b.source.Stat(name) +} + +func (b *BasePathFs) Rename(oldname, newname string) (err error) { + if oldname, err = b.RealPath(oldname); err != nil { + return &os.PathError{Op: "rename", Path: oldname, Err: err} + } + if newname, err = b.RealPath(newname); err != nil { + return &os.PathError{Op: "rename", Path: newname, Err: err} + } + return b.source.Rename(oldname, newname) +} + +func (b *BasePathFs) RemoveAll(name string) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "remove_all", Path: name, Err: err} + } + return b.source.RemoveAll(name) +} + +func (b *BasePathFs) Remove(name string) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "remove", Path: name, Err: err} + } + return b.source.Remove(name) +} + +func (b *BasePathFs) OpenFile(name string, flag int, mode os.FileMode) (f File, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "openfile", Path: name, Err: err} + } + sourcef, err := b.source.OpenFile(name, flag, mode) + if err != nil { + return nil, err + } + return &BasePathFile{sourcef, b.path}, nil +} + +func (b *BasePathFs) Open(name string) (f File, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "open", Path: name, Err: err} + } + sourcef, err := b.source.Open(name) + if err != nil { + return nil, err + } + return &BasePathFile{File: sourcef, path: b.path}, nil +} + +func (b *BasePathFs) Mkdir(name string, mode os.FileMode) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "mkdir", Path: name, Err: err} + } + return b.source.Mkdir(name, mode) +} + +func (b *BasePathFs) MkdirAll(name string, mode os.FileMode) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "mkdir", Path: name, Err: err} + } + return b.source.MkdirAll(name, mode) +} + +func (b *BasePathFs) Create(name string) (f File, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "create", Path: name, Err: err} + } + sourcef, err := b.source.Create(name) + if err != nil { + return nil, err + } + return &BasePathFile{File: sourcef, path: b.path}, nil +} + +func (b *BasePathFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + name, err := b.RealPath(name) + if err != nil { + return nil, false, &os.PathError{Op: "lstat", Path: name, Err: err} + } + if lstater, ok := b.source.(Lstater); ok { + return lstater.LstatIfPossible(name) + } + fi, err := b.source.Stat(name) + return fi, false, err +} + +func (b *BasePathFs) SymlinkIfPossible(oldname, newname string) error { + oldname, err := b.RealPath(oldname) + if err != nil { + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: err} + } + newname, err = b.RealPath(newname) + if err != nil { + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: err} + } + if linker, ok := b.source.(Linker); ok { + return linker.SymlinkIfPossible(oldname, newname) + } + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink} +} + +func (b *BasePathFs) ReadlinkIfPossible(name string) (string, error) { + name, err := b.RealPath(name) + if err != nil { + return "", &os.PathError{Op: "readlink", Path: name, Err: err} + } + if reader, ok := b.source.(LinkReader); ok { + return reader.ReadlinkIfPossible(name) + } + return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink} +} diff --git a/vendor/github.com/spf13/afero/cacheOnReadFs.go b/vendor/github.com/spf13/afero/cacheOnReadFs.go new file mode 100644 index 0000000000..017d344fd5 --- /dev/null +++ b/vendor/github.com/spf13/afero/cacheOnReadFs.go @@ -0,0 +1,315 @@ +package afero + +import ( + "os" + "syscall" + "time" +) + +// If the cache duration is 0, cache time will be unlimited, i.e. once +// a file is in the layer, the base will never be read again for this file. +// +// For cache times greater than 0, the modification time of a file is +// checked. Note that a lot of file system implementations only allow a +// resolution of a second for timestamps... or as the godoc for os.Chtimes() +// states: "The underlying filesystem may truncate or round the values to a +// less precise time unit." +// +// This caching union will forward all write calls also to the base file +// system first. To prevent writing to the base Fs, wrap it in a read-only +// filter - Note: this will also make the overlay read-only, for writing files +// in the overlay, use the overlay Fs directly, not via the union Fs. +type CacheOnReadFs struct { + base Fs + layer Fs + cacheTime time.Duration +} + +func NewCacheOnReadFs(base Fs, layer Fs, cacheTime time.Duration) Fs { + return &CacheOnReadFs{base: base, layer: layer, cacheTime: cacheTime} +} + +type cacheState int + +const ( + // not present in the overlay, unknown if it exists in the base: + cacheMiss cacheState = iota + // present in the overlay and in base, base file is newer: + cacheStale + // present in the overlay - with cache time == 0 it may exist in the base, + // with cacheTime > 0 it exists in the base and is same age or newer in the + // overlay + cacheHit + // happens if someone writes directly to the overlay without + // going through this union + cacheLocal +) + +func (u *CacheOnReadFs) cacheStatus(name string) (state cacheState, fi os.FileInfo, err error) { + var lfi, bfi os.FileInfo + lfi, err = u.layer.Stat(name) + if err == nil { + if u.cacheTime == 0 { + return cacheHit, lfi, nil + } + if lfi.ModTime().Add(u.cacheTime).Before(time.Now()) { + bfi, err = u.base.Stat(name) + if err != nil { + return cacheLocal, lfi, nil + } + if bfi.ModTime().After(lfi.ModTime()) { + return cacheStale, bfi, nil + } + } + return cacheHit, lfi, nil + } + + if err == syscall.ENOENT || os.IsNotExist(err) { + return cacheMiss, nil, nil + } + + return cacheMiss, nil, err +} + +func (u *CacheOnReadFs) copyToLayer(name string) error { + return copyToLayer(u.base, u.layer, name) +} + +func (u *CacheOnReadFs) copyFileToLayer(name string, flag int, perm os.FileMode) error { + return copyFileToLayer(u.base, u.layer, name, flag, perm) +} + +func (u *CacheOnReadFs) Chtimes(name string, atime, mtime time.Time) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit: + err = u.base.Chtimes(name, atime, mtime) + case cacheStale, cacheMiss: + if err := u.copyToLayer(name); err != nil { + return err + } + err = u.base.Chtimes(name, atime, mtime) + } + if err != nil { + return err + } + return u.layer.Chtimes(name, atime, mtime) +} + +func (u *CacheOnReadFs) Chmod(name string, mode os.FileMode) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit: + err = u.base.Chmod(name, mode) + case cacheStale, cacheMiss: + if err := u.copyToLayer(name); err != nil { + return err + } + err = u.base.Chmod(name, mode) + } + if err != nil { + return err + } + return u.layer.Chmod(name, mode) +} + +func (u *CacheOnReadFs) Chown(name string, uid, gid int) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit: + err = u.base.Chown(name, uid, gid) + case cacheStale, cacheMiss: + if err := u.copyToLayer(name); err != nil { + return err + } + err = u.base.Chown(name, uid, gid) + } + if err != nil { + return err + } + return u.layer.Chown(name, uid, gid) +} + +func (u *CacheOnReadFs) Stat(name string) (os.FileInfo, error) { + st, fi, err := u.cacheStatus(name) + if err != nil { + return nil, err + } + switch st { + case cacheMiss: + return u.base.Stat(name) + default: // cacheStale has base, cacheHit and cacheLocal the layer os.FileInfo + return fi, nil + } +} + +func (u *CacheOnReadFs) Rename(oldname, newname string) error { + st, _, err := u.cacheStatus(oldname) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit: + err = u.base.Rename(oldname, newname) + case cacheStale, cacheMiss: + if err := u.copyToLayer(oldname); err != nil { + return err + } + err = u.base.Rename(oldname, newname) + } + if err != nil { + return err + } + return u.layer.Rename(oldname, newname) +} + +func (u *CacheOnReadFs) Remove(name string) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit, cacheStale, cacheMiss: + err = u.base.Remove(name) + } + if err != nil { + return err + } + return u.layer.Remove(name) +} + +func (u *CacheOnReadFs) RemoveAll(name string) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit, cacheStale, cacheMiss: + err = u.base.RemoveAll(name) + } + if err != nil { + return err + } + return u.layer.RemoveAll(name) +} + +func (u *CacheOnReadFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + st, _, err := u.cacheStatus(name) + if err != nil { + return nil, err + } + switch st { + case cacheLocal, cacheHit: + default: + if err := u.copyFileToLayer(name, flag, perm); err != nil { + return nil, err + } + } + if flag&(os.O_WRONLY|syscall.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 { + bfi, err := u.base.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + lfi, err := u.layer.OpenFile(name, flag, perm) + if err != nil { + bfi.Close() // oops, what if O_TRUNC was set and file opening in the layer failed...? + return nil, err + } + return &UnionFile{Base: bfi, Layer: lfi}, nil + } + return u.layer.OpenFile(name, flag, perm) +} + +func (u *CacheOnReadFs) Open(name string) (File, error) { + st, fi, err := u.cacheStatus(name) + if err != nil { + return nil, err + } + + switch st { + case cacheLocal: + return u.layer.Open(name) + + case cacheMiss: + bfi, err := u.base.Stat(name) + if err != nil { + return nil, err + } + if bfi.IsDir() { + return u.base.Open(name) + } + if err := u.copyToLayer(name); err != nil { + return nil, err + } + return u.layer.Open(name) + + case cacheStale: + if !fi.IsDir() { + if err := u.copyToLayer(name); err != nil { + return nil, err + } + return u.layer.Open(name) + } + case cacheHit: + if !fi.IsDir() { + return u.layer.Open(name) + } + } + // the dirs from cacheHit, cacheStale fall down here: + bfile, _ := u.base.Open(name) + lfile, err := u.layer.Open(name) + if err != nil && bfile == nil { + return nil, err + } + return &UnionFile{Base: bfile, Layer: lfile}, nil +} + +func (u *CacheOnReadFs) Mkdir(name string, perm os.FileMode) error { + err := u.base.Mkdir(name, perm) + if err != nil { + return err + } + return u.layer.MkdirAll(name, perm) // yes, MkdirAll... we cannot assume it exists in the cache +} + +func (u *CacheOnReadFs) Name() string { + return "CacheOnReadFs" +} + +func (u *CacheOnReadFs) MkdirAll(name string, perm os.FileMode) error { + err := u.base.MkdirAll(name, perm) + if err != nil { + return err + } + return u.layer.MkdirAll(name, perm) +} + +func (u *CacheOnReadFs) Create(name string) (File, error) { + bfh, err := u.base.Create(name) + if err != nil { + return nil, err + } + lfh, err := u.layer.Create(name) + if err != nil { + // oops, see comment about OS_TRUNC above, should we remove? then we have to + // remember if the file did not exist before + bfh.Close() + return nil, err + } + return &UnionFile{Base: bfh, Layer: lfh}, nil +} diff --git a/vendor/github.com/spf13/afero/const_bsds.go b/vendor/github.com/spf13/afero/const_bsds.go new file mode 100644 index 0000000000..30855de572 --- /dev/null +++ b/vendor/github.com/spf13/afero/const_bsds.go @@ -0,0 +1,23 @@ +// Copyright © 2016 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build aix || darwin || openbsd || freebsd || netbsd || dragonfly || zos +// +build aix darwin openbsd freebsd netbsd dragonfly zos + +package afero + +import ( + "syscall" +) + +const BADFD = syscall.EBADF diff --git a/vendor/github.com/spf13/afero/const_win_unix.go b/vendor/github.com/spf13/afero/const_win_unix.go new file mode 100644 index 0000000000..12792d21e2 --- /dev/null +++ b/vendor/github.com/spf13/afero/const_win_unix.go @@ -0,0 +1,22 @@ +// Copyright © 2016 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//go:build !darwin && !openbsd && !freebsd && !dragonfly && !netbsd && !aix && !zos +// +build !darwin,!openbsd,!freebsd,!dragonfly,!netbsd,!aix,!zos + +package afero + +import ( + "syscall" +) + +const BADFD = syscall.EBADFD diff --git a/vendor/github.com/spf13/afero/copyOnWriteFs.go b/vendor/github.com/spf13/afero/copyOnWriteFs.go new file mode 100644 index 0000000000..184d6dd702 --- /dev/null +++ b/vendor/github.com/spf13/afero/copyOnWriteFs.go @@ -0,0 +1,327 @@ +package afero + +import ( + "fmt" + "os" + "path/filepath" + "syscall" + "time" +) + +var _ Lstater = (*CopyOnWriteFs)(nil) + +// The CopyOnWriteFs is a union filesystem: a read only base file system with +// a possibly writeable layer on top. Changes to the file system will only +// be made in the overlay: Changing an existing file in the base layer which +// is not present in the overlay will copy the file to the overlay ("changing" +// includes also calls to e.g. Chtimes(), Chmod() and Chown()). +// +// Reading directories is currently only supported via Open(), not OpenFile(). +type CopyOnWriteFs struct { + base Fs + layer Fs +} + +func NewCopyOnWriteFs(base Fs, layer Fs) Fs { + return &CopyOnWriteFs{base: base, layer: layer} +} + +// Returns true if the file is not in the overlay +func (u *CopyOnWriteFs) isBaseFile(name string) (bool, error) { + if _, err := u.layer.Stat(name); err == nil { + return false, nil + } + _, err := u.base.Stat(name) + if err != nil { + if oerr, ok := err.(*os.PathError); ok { + if oerr.Err == os.ErrNotExist || oerr.Err == syscall.ENOENT || oerr.Err == syscall.ENOTDIR { + return false, nil + } + } + if err == syscall.ENOENT { + return false, nil + } + } + return true, err +} + +func (u *CopyOnWriteFs) copyToLayer(name string) error { + return copyToLayer(u.base, u.layer, name) +} + +func (u *CopyOnWriteFs) Chtimes(name string, atime, mtime time.Time) error { + b, err := u.isBaseFile(name) + if err != nil { + return err + } + if b { + if err := u.copyToLayer(name); err != nil { + return err + } + } + return u.layer.Chtimes(name, atime, mtime) +} + +func (u *CopyOnWriteFs) Chmod(name string, mode os.FileMode) error { + b, err := u.isBaseFile(name) + if err != nil { + return err + } + if b { + if err := u.copyToLayer(name); err != nil { + return err + } + } + return u.layer.Chmod(name, mode) +} + +func (u *CopyOnWriteFs) Chown(name string, uid, gid int) error { + b, err := u.isBaseFile(name) + if err != nil { + return err + } + if b { + if err := u.copyToLayer(name); err != nil { + return err + } + } + return u.layer.Chown(name, uid, gid) +} + +func (u *CopyOnWriteFs) Stat(name string) (os.FileInfo, error) { + fi, err := u.layer.Stat(name) + if err != nil { + isNotExist := u.isNotExist(err) + if isNotExist { + return u.base.Stat(name) + } + return nil, err + } + return fi, nil +} + +func (u *CopyOnWriteFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + llayer, ok1 := u.layer.(Lstater) + lbase, ok2 := u.base.(Lstater) + + if ok1 { + fi, b, err := llayer.LstatIfPossible(name) + if err == nil { + return fi, b, nil + } + + if !u.isNotExist(err) { + return nil, b, err + } + } + + if ok2 { + fi, b, err := lbase.LstatIfPossible(name) + if err == nil { + return fi, b, nil + } + if !u.isNotExist(err) { + return nil, b, err + } + } + + fi, err := u.Stat(name) + + return fi, false, err +} + +func (u *CopyOnWriteFs) SymlinkIfPossible(oldname, newname string) error { + if slayer, ok := u.layer.(Linker); ok { + return slayer.SymlinkIfPossible(oldname, newname) + } + + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink} +} + +func (u *CopyOnWriteFs) ReadlinkIfPossible(name string) (string, error) { + if rlayer, ok := u.layer.(LinkReader); ok { + return rlayer.ReadlinkIfPossible(name) + } + + if rbase, ok := u.base.(LinkReader); ok { + return rbase.ReadlinkIfPossible(name) + } + + return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink} +} + +func (u *CopyOnWriteFs) isNotExist(err error) bool { + if e, ok := err.(*os.PathError); ok { + err = e.Err + } + if err == os.ErrNotExist || err == syscall.ENOENT || err == syscall.ENOTDIR { + return true + } + return false +} + +// Renaming files present only in the base layer is not permitted +func (u *CopyOnWriteFs) Rename(oldname, newname string) error { + b, err := u.isBaseFile(oldname) + if err != nil { + return err + } + if b { + return syscall.EPERM + } + return u.layer.Rename(oldname, newname) +} + +// Removing files present only in the base layer is not permitted. If +// a file is present in the base layer and the overlay, only the overlay +// will be removed. +func (u *CopyOnWriteFs) Remove(name string) error { + err := u.layer.Remove(name) + switch err { + case syscall.ENOENT: + _, err = u.base.Stat(name) + if err == nil { + return syscall.EPERM + } + return syscall.ENOENT + default: + return err + } +} + +func (u *CopyOnWriteFs) RemoveAll(name string) error { + err := u.layer.RemoveAll(name) + switch err { + case syscall.ENOENT: + _, err = u.base.Stat(name) + if err == nil { + return syscall.EPERM + } + return syscall.ENOENT + default: + return err + } +} + +func (u *CopyOnWriteFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + b, err := u.isBaseFile(name) + if err != nil { + return nil, err + } + + if flag&(os.O_WRONLY|os.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 { + if b { + if err = u.copyToLayer(name); err != nil { + return nil, err + } + return u.layer.OpenFile(name, flag, perm) + } + + dir := filepath.Dir(name) + isaDir, err := IsDir(u.base, dir) + if err != nil && !os.IsNotExist(err) { + return nil, err + } + if isaDir { + if err = u.layer.MkdirAll(dir, 0o777); err != nil { + return nil, err + } + return u.layer.OpenFile(name, flag, perm) + } + + isaDir, err = IsDir(u.layer, dir) + if err != nil { + return nil, err + } + if isaDir { + return u.layer.OpenFile(name, flag, perm) + } + + return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOTDIR} // ...or os.ErrNotExist? + } + if b { + return u.base.OpenFile(name, flag, perm) + } + return u.layer.OpenFile(name, flag, perm) +} + +// This function handles the 9 different possibilities caused +// by the union which are the intersection of the following... +// +// layer: doesn't exist, exists as a file, and exists as a directory +// base: doesn't exist, exists as a file, and exists as a directory +func (u *CopyOnWriteFs) Open(name string) (File, error) { + // Since the overlay overrides the base we check that first + b, err := u.isBaseFile(name) + if err != nil { + return nil, err + } + + // If overlay doesn't exist, return the base (base state irrelevant) + if b { + return u.base.Open(name) + } + + // If overlay is a file, return it (base state irrelevant) + dir, err := IsDir(u.layer, name) + if err != nil { + return nil, err + } + if !dir { + return u.layer.Open(name) + } + + // Overlay is a directory, base state now matters. + // Base state has 3 states to check but 2 outcomes: + // A. It's a file or non-readable in the base (return just the overlay) + // B. It's an accessible directory in the base (return a UnionFile) + + // If base is file or nonreadable, return overlay + dir, err = IsDir(u.base, name) + if !dir || err != nil { + return u.layer.Open(name) + } + + // Both base & layer are directories + // Return union file (if opens are without error) + bfile, bErr := u.base.Open(name) + lfile, lErr := u.layer.Open(name) + + // If either have errors at this point something is very wrong. Return nil and the errors + if bErr != nil || lErr != nil { + return nil, fmt.Errorf("BaseErr: %v\nOverlayErr: %v", bErr, lErr) + } + + return &UnionFile{Base: bfile, Layer: lfile}, nil +} + +func (u *CopyOnWriteFs) Mkdir(name string, perm os.FileMode) error { + dir, err := IsDir(u.base, name) + if err != nil { + return u.layer.MkdirAll(name, perm) + } + if dir { + return ErrFileExists + } + return u.layer.MkdirAll(name, perm) +} + +func (u *CopyOnWriteFs) Name() string { + return "CopyOnWriteFs" +} + +func (u *CopyOnWriteFs) MkdirAll(name string, perm os.FileMode) error { + dir, err := IsDir(u.base, name) + if err != nil { + return u.layer.MkdirAll(name, perm) + } + if dir { + // This is in line with how os.MkdirAll behaves. + return nil + } + return u.layer.MkdirAll(name, perm) +} + +func (u *CopyOnWriteFs) Create(name string) (File, error) { + return u.OpenFile(name, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0o666) +} diff --git a/vendor/github.com/spf13/afero/httpFs.go b/vendor/github.com/spf13/afero/httpFs.go new file mode 100644 index 0000000000..ac0de6d51f --- /dev/null +++ b/vendor/github.com/spf13/afero/httpFs.go @@ -0,0 +1,114 @@ +// Copyright © 2014 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "errors" + "net/http" + "os" + "path" + "path/filepath" + "strings" + "time" +) + +type httpDir struct { + basePath string + fs HttpFs +} + +func (d httpDir) Open(name string) (http.File, error) { + if filepath.Separator != '/' && strings.ContainsRune(name, filepath.Separator) || + strings.Contains(name, "\x00") { + return nil, errors.New("http: invalid character in file path") + } + dir := string(d.basePath) + if dir == "" { + dir = "." + } + + f, err := d.fs.Open(filepath.Join(dir, filepath.FromSlash(path.Clean("/"+name)))) + if err != nil { + return nil, err + } + return f, nil +} + +type HttpFs struct { + source Fs +} + +func NewHttpFs(source Fs) *HttpFs { + return &HttpFs{source: source} +} + +func (h HttpFs) Dir(s string) *httpDir { + return &httpDir{basePath: s, fs: h} +} + +func (h HttpFs) Name() string { return "h HttpFs" } + +func (h HttpFs) Create(name string) (File, error) { + return h.source.Create(name) +} + +func (h HttpFs) Chmod(name string, mode os.FileMode) error { + return h.source.Chmod(name, mode) +} + +func (h HttpFs) Chown(name string, uid, gid int) error { + return h.source.Chown(name, uid, gid) +} + +func (h HttpFs) Chtimes(name string, atime time.Time, mtime time.Time) error { + return h.source.Chtimes(name, atime, mtime) +} + +func (h HttpFs) Mkdir(name string, perm os.FileMode) error { + return h.source.Mkdir(name, perm) +} + +func (h HttpFs) MkdirAll(path string, perm os.FileMode) error { + return h.source.MkdirAll(path, perm) +} + +func (h HttpFs) Open(name string) (http.File, error) { + f, err := h.source.Open(name) + if err == nil { + if httpfile, ok := f.(http.File); ok { + return httpfile, nil + } + } + return nil, err +} + +func (h HttpFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + return h.source.OpenFile(name, flag, perm) +} + +func (h HttpFs) Remove(name string) error { + return h.source.Remove(name) +} + +func (h HttpFs) RemoveAll(path string) error { + return h.source.RemoveAll(path) +} + +func (h HttpFs) Rename(oldname, newname string) error { + return h.source.Rename(oldname, newname) +} + +func (h HttpFs) Stat(name string) (os.FileInfo, error) { + return h.source.Stat(name) +} diff --git a/vendor/github.com/spf13/afero/internal/common/adapters.go b/vendor/github.com/spf13/afero/internal/common/adapters.go new file mode 100644 index 0000000000..60685caa54 --- /dev/null +++ b/vendor/github.com/spf13/afero/internal/common/adapters.go @@ -0,0 +1,27 @@ +// Copyright © 2022 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package common + +import "io/fs" + +// FileInfoDirEntry provides an adapter from os.FileInfo to fs.DirEntry +type FileInfoDirEntry struct { + fs.FileInfo +} + +var _ fs.DirEntry = FileInfoDirEntry{} + +func (d FileInfoDirEntry) Type() fs.FileMode { return d.FileInfo.Mode().Type() } + +func (d FileInfoDirEntry) Info() (fs.FileInfo, error) { return d.FileInfo, nil } diff --git a/vendor/github.com/spf13/afero/iofs.go b/vendor/github.com/spf13/afero/iofs.go new file mode 100644 index 0000000000..938b9316e6 --- /dev/null +++ b/vendor/github.com/spf13/afero/iofs.go @@ -0,0 +1,298 @@ +//go:build go1.16 +// +build go1.16 + +package afero + +import ( + "io" + "io/fs" + "os" + "path" + "sort" + "time" + + "github.com/spf13/afero/internal/common" +) + +// IOFS adopts afero.Fs to stdlib io/fs.FS +type IOFS struct { + Fs +} + +func NewIOFS(fs Fs) IOFS { + return IOFS{Fs: fs} +} + +var ( + _ fs.FS = IOFS{} + _ fs.GlobFS = IOFS{} + _ fs.ReadDirFS = IOFS{} + _ fs.ReadFileFS = IOFS{} + _ fs.StatFS = IOFS{} + _ fs.SubFS = IOFS{} +) + +func (iofs IOFS) Open(name string) (fs.File, error) { + const op = "open" + + // by convention for fs.FS implementations we should perform this check + if !fs.ValidPath(name) { + return nil, iofs.wrapError(op, name, fs.ErrInvalid) + } + + file, err := iofs.Fs.Open(name) + if err != nil { + return nil, iofs.wrapError(op, name, err) + } + + // file should implement fs.ReadDirFile + if _, ok := file.(fs.ReadDirFile); !ok { + file = readDirFile{file} + } + + return file, nil +} + +func (iofs IOFS) Glob(pattern string) ([]string, error) { + const op = "glob" + + // afero.Glob does not perform this check but it's required for implementations + if _, err := path.Match(pattern, ""); err != nil { + return nil, iofs.wrapError(op, pattern, err) + } + + items, err := Glob(iofs.Fs, pattern) + if err != nil { + return nil, iofs.wrapError(op, pattern, err) + } + + return items, nil +} + +func (iofs IOFS) ReadDir(name string) ([]fs.DirEntry, error) { + f, err := iofs.Fs.Open(name) + if err != nil { + return nil, iofs.wrapError("readdir", name, err) + } + + defer f.Close() + + if rdf, ok := f.(fs.ReadDirFile); ok { + items, err := rdf.ReadDir(-1) + if err != nil { + return nil, iofs.wrapError("readdir", name, err) + } + sort.Slice(items, func(i, j int) bool { return items[i].Name() < items[j].Name() }) + return items, nil + } + + items, err := f.Readdir(-1) + if err != nil { + return nil, iofs.wrapError("readdir", name, err) + } + sort.Sort(byName(items)) + + ret := make([]fs.DirEntry, len(items)) + for i := range items { + ret[i] = common.FileInfoDirEntry{FileInfo: items[i]} + } + + return ret, nil +} + +func (iofs IOFS) ReadFile(name string) ([]byte, error) { + const op = "readfile" + + if !fs.ValidPath(name) { + return nil, iofs.wrapError(op, name, fs.ErrInvalid) + } + + bytes, err := ReadFile(iofs.Fs, name) + if err != nil { + return nil, iofs.wrapError(op, name, err) + } + + return bytes, nil +} + +func (iofs IOFS) Sub(dir string) (fs.FS, error) { return IOFS{NewBasePathFs(iofs.Fs, dir)}, nil } + +func (IOFS) wrapError(op, path string, err error) error { + if _, ok := err.(*fs.PathError); ok { + return err // don't need to wrap again + } + + return &fs.PathError{ + Op: op, + Path: path, + Err: err, + } +} + +// readDirFile provides adapter from afero.File to fs.ReadDirFile needed for correct Open +type readDirFile struct { + File +} + +var _ fs.ReadDirFile = readDirFile{} + +func (r readDirFile) ReadDir(n int) ([]fs.DirEntry, error) { + items, err := r.File.Readdir(n) + if err != nil { + return nil, err + } + + ret := make([]fs.DirEntry, len(items)) + for i := range items { + ret[i] = common.FileInfoDirEntry{FileInfo: items[i]} + } + + return ret, nil +} + +// FromIOFS adopts io/fs.FS to use it as afero.Fs +// Note that io/fs.FS is read-only so all mutating methods will return fs.PathError with fs.ErrPermission +// To store modifications you may use afero.CopyOnWriteFs +type FromIOFS struct { + fs.FS +} + +var _ Fs = FromIOFS{} + +func (f FromIOFS) Create(name string) (File, error) { return nil, notImplemented("create", name) } + +func (f FromIOFS) Mkdir(name string, perm os.FileMode) error { return notImplemented("mkdir", name) } + +func (f FromIOFS) MkdirAll(path string, perm os.FileMode) error { + return notImplemented("mkdirall", path) +} + +func (f FromIOFS) Open(name string) (File, error) { + file, err := f.FS.Open(name) + if err != nil { + return nil, err + } + + return fromIOFSFile{File: file, name: name}, nil +} + +func (f FromIOFS) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + return f.Open(name) +} + +func (f FromIOFS) Remove(name string) error { + return notImplemented("remove", name) +} + +func (f FromIOFS) RemoveAll(path string) error { + return notImplemented("removeall", path) +} + +func (f FromIOFS) Rename(oldname, newname string) error { + return notImplemented("rename", oldname) +} + +func (f FromIOFS) Stat(name string) (os.FileInfo, error) { return fs.Stat(f.FS, name) } + +func (f FromIOFS) Name() string { return "fromiofs" } + +func (f FromIOFS) Chmod(name string, mode os.FileMode) error { + return notImplemented("chmod", name) +} + +func (f FromIOFS) Chown(name string, uid, gid int) error { + return notImplemented("chown", name) +} + +func (f FromIOFS) Chtimes(name string, atime time.Time, mtime time.Time) error { + return notImplemented("chtimes", name) +} + +type fromIOFSFile struct { + fs.File + name string +} + +func (f fromIOFSFile) ReadAt(p []byte, off int64) (n int, err error) { + readerAt, ok := f.File.(io.ReaderAt) + if !ok { + return -1, notImplemented("readat", f.name) + } + + return readerAt.ReadAt(p, off) +} + +func (f fromIOFSFile) Seek(offset int64, whence int) (int64, error) { + seeker, ok := f.File.(io.Seeker) + if !ok { + return -1, notImplemented("seek", f.name) + } + + return seeker.Seek(offset, whence) +} + +func (f fromIOFSFile) Write(p []byte) (n int, err error) { + return -1, notImplemented("write", f.name) +} + +func (f fromIOFSFile) WriteAt(p []byte, off int64) (n int, err error) { + return -1, notImplemented("writeat", f.name) +} + +func (f fromIOFSFile) Name() string { return f.name } + +func (f fromIOFSFile) Readdir(count int) ([]os.FileInfo, error) { + rdfile, ok := f.File.(fs.ReadDirFile) + if !ok { + return nil, notImplemented("readdir", f.name) + } + + entries, err := rdfile.ReadDir(count) + if err != nil { + return nil, err + } + + ret := make([]os.FileInfo, len(entries)) + for i := range entries { + ret[i], err = entries[i].Info() + + if err != nil { + return nil, err + } + } + + return ret, nil +} + +func (f fromIOFSFile) Readdirnames(n int) ([]string, error) { + rdfile, ok := f.File.(fs.ReadDirFile) + if !ok { + return nil, notImplemented("readdir", f.name) + } + + entries, err := rdfile.ReadDir(n) + if err != nil { + return nil, err + } + + ret := make([]string, len(entries)) + for i := range entries { + ret[i] = entries[i].Name() + } + + return ret, nil +} + +func (f fromIOFSFile) Sync() error { return nil } + +func (f fromIOFSFile) Truncate(size int64) error { + return notImplemented("truncate", f.name) +} + +func (f fromIOFSFile) WriteString(s string) (ret int, err error) { + return -1, notImplemented("writestring", f.name) +} + +func notImplemented(op, path string) error { + return &fs.PathError{Op: op, Path: path, Err: fs.ErrPermission} +} diff --git a/vendor/github.com/spf13/afero/ioutil.go b/vendor/github.com/spf13/afero/ioutil.go new file mode 100644 index 0000000000..fa6abe1eee --- /dev/null +++ b/vendor/github.com/spf13/afero/ioutil.go @@ -0,0 +1,243 @@ +// Copyright ©2015 The Go Authors +// Copyright ©2015 Steve Francia +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "bytes" + "io" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "sync" + "time" +) + +// byName implements sort.Interface. +type byName []os.FileInfo + +func (f byName) Len() int { return len(f) } +func (f byName) Less(i, j int) bool { return f[i].Name() < f[j].Name() } +func (f byName) Swap(i, j int) { f[i], f[j] = f[j], f[i] } + +// ReadDir reads the directory named by dirname and returns +// a list of sorted directory entries. +func (a Afero) ReadDir(dirname string) ([]os.FileInfo, error) { + return ReadDir(a.Fs, dirname) +} + +func ReadDir(fs Fs, dirname string) ([]os.FileInfo, error) { + f, err := fs.Open(dirname) + if err != nil { + return nil, err + } + list, err := f.Readdir(-1) + f.Close() + if err != nil { + return nil, err + } + sort.Sort(byName(list)) + return list, nil +} + +// ReadFile reads the file named by filename and returns the contents. +// A successful call returns err == nil, not err == EOF. Because ReadFile +// reads the whole file, it does not treat an EOF from Read as an error +// to be reported. +func (a Afero) ReadFile(filename string) ([]byte, error) { + return ReadFile(a.Fs, filename) +} + +func ReadFile(fs Fs, filename string) ([]byte, error) { + f, err := fs.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + // It's a good but not certain bet that FileInfo will tell us exactly how much to + // read, so let's try it but be prepared for the answer to be wrong. + var n int64 + + if fi, err := f.Stat(); err == nil { + // Don't preallocate a huge buffer, just in case. + if size := fi.Size(); size < 1e9 { + n = size + } + } + // As initial capacity for readAll, use n + a little extra in case Size is zero, + // and to avoid another allocation after Read has filled the buffer. The readAll + // call will read into its allocated internal buffer cheaply. If the size was + // wrong, we'll either waste some space off the end or reallocate as needed, but + // in the overwhelmingly common case we'll get it just right. + return readAll(f, n+bytes.MinRead) +} + +// readAll reads from r until an error or EOF and returns the data it read +// from the internal buffer allocated with a specified capacity. +func readAll(r io.Reader, capacity int64) (b []byte, err error) { + buf := bytes.NewBuffer(make([]byte, 0, capacity)) + // If the buffer overflows, we will get bytes.ErrTooLarge. + // Return that as an error. Any other panic remains. + defer func() { + e := recover() + if e == nil { + return + } + if panicErr, ok := e.(error); ok && panicErr == bytes.ErrTooLarge { + err = panicErr + } else { + panic(e) + } + }() + _, err = buf.ReadFrom(r) + return buf.Bytes(), err +} + +// ReadAll reads from r until an error or EOF and returns the data it read. +// A successful call returns err == nil, not err == EOF. Because ReadAll is +// defined to read from src until EOF, it does not treat an EOF from Read +// as an error to be reported. +func ReadAll(r io.Reader) ([]byte, error) { + return readAll(r, bytes.MinRead) +} + +// WriteFile writes data to a file named by filename. +// If the file does not exist, WriteFile creates it with permissions perm; +// otherwise WriteFile truncates it before writing. +func (a Afero) WriteFile(filename string, data []byte, perm os.FileMode) error { + return WriteFile(a.Fs, filename, data, perm) +} + +func WriteFile(fs Fs, filename string, data []byte, perm os.FileMode) error { + f, err := fs.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) + if err != nil { + return err + } + n, err := f.Write(data) + if err == nil && n < len(data) { + err = io.ErrShortWrite + } + if err1 := f.Close(); err == nil { + err = err1 + } + return err +} + +// Random number state. +// We generate random temporary file names so that there's a good +// chance the file doesn't exist yet - keeps the number of tries in +// TempFile to a minimum. +var ( + randNum uint32 + randmu sync.Mutex +) + +func reseed() uint32 { + return uint32(time.Now().UnixNano() + int64(os.Getpid())) +} + +func nextRandom() string { + randmu.Lock() + r := randNum + if r == 0 { + r = reseed() + } + r = r*1664525 + 1013904223 // constants from Numerical Recipes + randNum = r + randmu.Unlock() + return strconv.Itoa(int(1e9 + r%1e9))[1:] +} + +// TempFile creates a new temporary file in the directory dir, +// opens the file for reading and writing, and returns the resulting *os.File. +// The filename is generated by taking pattern and adding a random +// string to the end. If pattern includes a "*", the random string +// replaces the last "*". +// If dir is the empty string, TempFile uses the default directory +// for temporary files (see os.TempDir). +// Multiple programs calling TempFile simultaneously +// will not choose the same file. The caller can use f.Name() +// to find the pathname of the file. It is the caller's responsibility +// to remove the file when no longer needed. +func (a Afero) TempFile(dir, pattern string) (f File, err error) { + return TempFile(a.Fs, dir, pattern) +} + +func TempFile(fs Fs, dir, pattern string) (f File, err error) { + if dir == "" { + dir = os.TempDir() + } + + var prefix, suffix string + if pos := strings.LastIndex(pattern, "*"); pos != -1 { + prefix, suffix = pattern[:pos], pattern[pos+1:] + } else { + prefix = pattern + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + name := filepath.Join(dir, prefix+nextRandom()+suffix) + f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0o600) + if os.IsExist(err) { + if nconflict++; nconflict > 10 { + randmu.Lock() + randNum = reseed() + randmu.Unlock() + } + continue + } + break + } + return +} + +// TempDir creates a new temporary directory in the directory dir +// with a name beginning with prefix and returns the path of the +// new directory. If dir is the empty string, TempDir uses the +// default directory for temporary files (see os.TempDir). +// Multiple programs calling TempDir simultaneously +// will not choose the same directory. It is the caller's responsibility +// to remove the directory when no longer needed. +func (a Afero) TempDir(dir, prefix string) (name string, err error) { + return TempDir(a.Fs, dir, prefix) +} + +func TempDir(fs Fs, dir, prefix string) (name string, err error) { + if dir == "" { + dir = os.TempDir() + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + try := filepath.Join(dir, prefix+nextRandom()) + err = fs.Mkdir(try, 0o700) + if os.IsExist(err) { + if nconflict++; nconflict > 10 { + randmu.Lock() + randNum = reseed() + randmu.Unlock() + } + continue + } + if err == nil { + name = try + } + break + } + return +} diff --git a/vendor/github.com/spf13/afero/lstater.go b/vendor/github.com/spf13/afero/lstater.go new file mode 100644 index 0000000000..89c1bfc0a7 --- /dev/null +++ b/vendor/github.com/spf13/afero/lstater.go @@ -0,0 +1,27 @@ +// Copyright © 2018 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "os" +) + +// Lstater is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +// It will call Lstat if the filesystem iself is, or it delegates to, the os filesystem. +// Else it will call Stat. +// In addtion to the FileInfo, it will return a boolean telling whether Lstat was called or not. +type Lstater interface { + LstatIfPossible(name string) (os.FileInfo, bool, error) +} diff --git a/vendor/github.com/spf13/afero/match.go b/vendor/github.com/spf13/afero/match.go new file mode 100644 index 0000000000..7db4b7de6e --- /dev/null +++ b/vendor/github.com/spf13/afero/match.go @@ -0,0 +1,110 @@ +// Copyright © 2014 Steve Francia . +// Copyright 2009 The Go Authors. All rights reserved. + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "path/filepath" + "sort" + "strings" +) + +// Glob returns the names of all files matching pattern or nil +// if there is no matching file. The syntax of patterns is the same +// as in Match. The pattern may describe hierarchical names such as +// /usr/*/bin/ed (assuming the Separator is '/'). +// +// Glob ignores file system errors such as I/O errors reading directories. +// The only possible returned error is ErrBadPattern, when pattern +// is malformed. +// +// This was adapted from (http://golang.org/pkg/path/filepath) and uses several +// built-ins from that package. +func Glob(fs Fs, pattern string) (matches []string, err error) { + if !hasMeta(pattern) { + // Lstat not supported by a ll filesystems. + if _, err = lstatIfPossible(fs, pattern); err != nil { + return nil, nil + } + return []string{pattern}, nil + } + + dir, file := filepath.Split(pattern) + switch dir { + case "": + dir = "." + case string(filepath.Separator): + // nothing + default: + dir = dir[0 : len(dir)-1] // chop off trailing separator + } + + if !hasMeta(dir) { + return glob(fs, dir, file, nil) + } + + var m []string + m, err = Glob(fs, dir) + if err != nil { + return + } + for _, d := range m { + matches, err = glob(fs, d, file, matches) + if err != nil { + return + } + } + return +} + +// glob searches for files matching pattern in the directory dir +// and appends them to matches. If the directory cannot be +// opened, it returns the existing matches. New matches are +// added in lexicographical order. +func glob(fs Fs, dir, pattern string, matches []string) (m []string, e error) { + m = matches + fi, err := fs.Stat(dir) + if err != nil { + return + } + if !fi.IsDir() { + return + } + d, err := fs.Open(dir) + if err != nil { + return + } + defer d.Close() + + names, _ := d.Readdirnames(-1) + sort.Strings(names) + + for _, n := range names { + matched, err := filepath.Match(pattern, n) + if err != nil { + return m, err + } + if matched { + m = append(m, filepath.Join(dir, n)) + } + } + return +} + +// hasMeta reports whether path contains any of the magic characters +// recognized by Match. +func hasMeta(path string) bool { + // TODO(niemeyer): Should other magic characters be added here? + return strings.ContainsAny(path, "*?[") +} diff --git a/vendor/github.com/spf13/afero/mem/dir.go b/vendor/github.com/spf13/afero/mem/dir.go new file mode 100644 index 0000000000..e104013f45 --- /dev/null +++ b/vendor/github.com/spf13/afero/mem/dir.go @@ -0,0 +1,37 @@ +// Copyright © 2014 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mem + +type Dir interface { + Len() int + Names() []string + Files() []*FileData + Add(*FileData) + Remove(*FileData) +} + +func RemoveFromMemDir(dir *FileData, f *FileData) { + dir.memDir.Remove(f) +} + +func AddToMemDir(dir *FileData, f *FileData) { + dir.memDir.Add(f) +} + +func InitializeDir(d *FileData) { + if d.memDir == nil { + d.dir = true + d.memDir = &DirMap{} + } +} diff --git a/vendor/github.com/spf13/afero/mem/dirmap.go b/vendor/github.com/spf13/afero/mem/dirmap.go new file mode 100644 index 0000000000..03a57ee5b5 --- /dev/null +++ b/vendor/github.com/spf13/afero/mem/dirmap.go @@ -0,0 +1,43 @@ +// Copyright © 2015 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mem + +import "sort" + +type DirMap map[string]*FileData + +func (m DirMap) Len() int { return len(m) } +func (m DirMap) Add(f *FileData) { m[f.name] = f } +func (m DirMap) Remove(f *FileData) { delete(m, f.name) } +func (m DirMap) Files() (files []*FileData) { + for _, f := range m { + files = append(files, f) + } + sort.Sort(filesSorter(files)) + return files +} + +// implement sort.Interface for []*FileData +type filesSorter []*FileData + +func (s filesSorter) Len() int { return len(s) } +func (s filesSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s filesSorter) Less(i, j int) bool { return s[i].name < s[j].name } + +func (m DirMap) Names() (names []string) { + for x := range m { + names = append(names, x) + } + return names +} diff --git a/vendor/github.com/spf13/afero/mem/file.go b/vendor/github.com/spf13/afero/mem/file.go new file mode 100644 index 0000000000..62fe4498e1 --- /dev/null +++ b/vendor/github.com/spf13/afero/mem/file.go @@ -0,0 +1,359 @@ +// Copyright © 2015 Steve Francia . +// Copyright 2013 tsuru authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mem + +import ( + "bytes" + "errors" + "io" + "io/fs" + "os" + "path/filepath" + "sync" + "sync/atomic" + "time" + + "github.com/spf13/afero/internal/common" +) + +const FilePathSeparator = string(filepath.Separator) + +var _ fs.ReadDirFile = &File{} + +type File struct { + // atomic requires 64-bit alignment for struct field access + at int64 + readDirCount int64 + closed bool + readOnly bool + fileData *FileData +} + +func NewFileHandle(data *FileData) *File { + return &File{fileData: data} +} + +func NewReadOnlyFileHandle(data *FileData) *File { + return &File{fileData: data, readOnly: true} +} + +func (f File) Data() *FileData { + return f.fileData +} + +type FileData struct { + sync.Mutex + name string + data []byte + memDir Dir + dir bool + mode os.FileMode + modtime time.Time + uid int + gid int +} + +func (d *FileData) Name() string { + d.Lock() + defer d.Unlock() + return d.name +} + +func CreateFile(name string) *FileData { + return &FileData{name: name, mode: os.ModeTemporary, modtime: time.Now()} +} + +func CreateDir(name string) *FileData { + return &FileData{name: name, memDir: &DirMap{}, dir: true, modtime: time.Now()} +} + +func ChangeFileName(f *FileData, newname string) { + f.Lock() + f.name = newname + f.Unlock() +} + +func SetMode(f *FileData, mode os.FileMode) { + f.Lock() + f.mode = mode + f.Unlock() +} + +func SetModTime(f *FileData, mtime time.Time) { + f.Lock() + setModTime(f, mtime) + f.Unlock() +} + +func setModTime(f *FileData, mtime time.Time) { + f.modtime = mtime +} + +func SetUID(f *FileData, uid int) { + f.Lock() + f.uid = uid + f.Unlock() +} + +func SetGID(f *FileData, gid int) { + f.Lock() + f.gid = gid + f.Unlock() +} + +func GetFileInfo(f *FileData) *FileInfo { + return &FileInfo{f} +} + +func (f *File) Open() error { + atomic.StoreInt64(&f.at, 0) + atomic.StoreInt64(&f.readDirCount, 0) + f.fileData.Lock() + f.closed = false + f.fileData.Unlock() + return nil +} + +func (f *File) Close() error { + f.fileData.Lock() + f.closed = true + if !f.readOnly { + setModTime(f.fileData, time.Now()) + } + f.fileData.Unlock() + return nil +} + +func (f *File) Name() string { + return f.fileData.Name() +} + +func (f *File) Stat() (os.FileInfo, error) { + return &FileInfo{f.fileData}, nil +} + +func (f *File) Sync() error { + return nil +} + +func (f *File) Readdir(count int) (res []os.FileInfo, err error) { + if !f.fileData.dir { + return nil, &os.PathError{Op: "readdir", Path: f.fileData.name, Err: errors.New("not a dir")} + } + var outLength int64 + + f.fileData.Lock() + files := f.fileData.memDir.Files()[f.readDirCount:] + if count > 0 { + if len(files) < count { + outLength = int64(len(files)) + } else { + outLength = int64(count) + } + if len(files) == 0 { + err = io.EOF + } + } else { + outLength = int64(len(files)) + } + f.readDirCount += outLength + f.fileData.Unlock() + + res = make([]os.FileInfo, outLength) + for i := range res { + res[i] = &FileInfo{files[i]} + } + + return res, err +} + +func (f *File) Readdirnames(n int) (names []string, err error) { + fi, err := f.Readdir(n) + names = make([]string, len(fi)) + for i, f := range fi { + _, names[i] = filepath.Split(f.Name()) + } + return names, err +} + +// Implements fs.ReadDirFile +func (f *File) ReadDir(n int) ([]fs.DirEntry, error) { + fi, err := f.Readdir(n) + if err != nil { + return nil, err + } + di := make([]fs.DirEntry, len(fi)) + for i, f := range fi { + di[i] = common.FileInfoDirEntry{FileInfo: f} + } + return di, nil +} + +func (f *File) Read(b []byte) (n int, err error) { + f.fileData.Lock() + defer f.fileData.Unlock() + if f.closed { + return 0, ErrFileClosed + } + if len(b) > 0 && int(f.at) == len(f.fileData.data) { + return 0, io.EOF + } + if int(f.at) > len(f.fileData.data) { + return 0, io.ErrUnexpectedEOF + } + if len(f.fileData.data)-int(f.at) >= len(b) { + n = len(b) + } else { + n = len(f.fileData.data) - int(f.at) + } + copy(b, f.fileData.data[f.at:f.at+int64(n)]) + atomic.AddInt64(&f.at, int64(n)) + return +} + +func (f *File) ReadAt(b []byte, off int64) (n int, err error) { + prev := atomic.LoadInt64(&f.at) + atomic.StoreInt64(&f.at, off) + n, err = f.Read(b) + atomic.StoreInt64(&f.at, prev) + return +} + +func (f *File) Truncate(size int64) error { + if f.closed { + return ErrFileClosed + } + if f.readOnly { + return &os.PathError{Op: "truncate", Path: f.fileData.name, Err: errors.New("file handle is read only")} + } + if size < 0 { + return ErrOutOfRange + } + f.fileData.Lock() + defer f.fileData.Unlock() + if size > int64(len(f.fileData.data)) { + diff := size - int64(len(f.fileData.data)) + f.fileData.data = append(f.fileData.data, bytes.Repeat([]byte{0o0}, int(diff))...) + } else { + f.fileData.data = f.fileData.data[0:size] + } + setModTime(f.fileData, time.Now()) + return nil +} + +func (f *File) Seek(offset int64, whence int) (int64, error) { + if f.closed { + return 0, ErrFileClosed + } + switch whence { + case io.SeekStart: + atomic.StoreInt64(&f.at, offset) + case io.SeekCurrent: + atomic.AddInt64(&f.at, offset) + case io.SeekEnd: + atomic.StoreInt64(&f.at, int64(len(f.fileData.data))+offset) + } + return f.at, nil +} + +func (f *File) Write(b []byte) (n int, err error) { + if f.closed { + return 0, ErrFileClosed + } + if f.readOnly { + return 0, &os.PathError{Op: "write", Path: f.fileData.name, Err: errors.New("file handle is read only")} + } + n = len(b) + cur := atomic.LoadInt64(&f.at) + f.fileData.Lock() + defer f.fileData.Unlock() + diff := cur - int64(len(f.fileData.data)) + var tail []byte + if n+int(cur) < len(f.fileData.data) { + tail = f.fileData.data[n+int(cur):] + } + if diff > 0 { + f.fileData.data = append(f.fileData.data, append(bytes.Repeat([]byte{0o0}, int(diff)), b...)...) + f.fileData.data = append(f.fileData.data, tail...) + } else { + f.fileData.data = append(f.fileData.data[:cur], b...) + f.fileData.data = append(f.fileData.data, tail...) + } + setModTime(f.fileData, time.Now()) + + atomic.AddInt64(&f.at, int64(n)) + return +} + +func (f *File) WriteAt(b []byte, off int64) (n int, err error) { + atomic.StoreInt64(&f.at, off) + return f.Write(b) +} + +func (f *File) WriteString(s string) (ret int, err error) { + return f.Write([]byte(s)) +} + +func (f *File) Info() *FileInfo { + return &FileInfo{f.fileData} +} + +type FileInfo struct { + *FileData +} + +// Implements os.FileInfo +func (s *FileInfo) Name() string { + s.Lock() + _, name := filepath.Split(s.name) + s.Unlock() + return name +} + +func (s *FileInfo) Mode() os.FileMode { + s.Lock() + defer s.Unlock() + return s.mode +} + +func (s *FileInfo) ModTime() time.Time { + s.Lock() + defer s.Unlock() + return s.modtime +} + +func (s *FileInfo) IsDir() bool { + s.Lock() + defer s.Unlock() + return s.dir +} +func (s *FileInfo) Sys() interface{} { return nil } +func (s *FileInfo) Size() int64 { + if s.IsDir() { + return int64(42) + } + s.Lock() + defer s.Unlock() + return int64(len(s.data)) +} + +var ( + ErrFileClosed = errors.New("File is closed") + ErrOutOfRange = errors.New("out of range") + ErrTooLarge = errors.New("too large") + ErrFileNotFound = os.ErrNotExist + ErrFileExists = os.ErrExist + ErrDestinationExists = os.ErrExist +) diff --git a/vendor/github.com/spf13/afero/memmap.go b/vendor/github.com/spf13/afero/memmap.go new file mode 100644 index 0000000000..d6c744e8d5 --- /dev/null +++ b/vendor/github.com/spf13/afero/memmap.go @@ -0,0 +1,465 @@ +// Copyright © 2014 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "fmt" + "io" + + "log" + "os" + "path/filepath" + + "sort" + "strings" + "sync" + "time" + + "github.com/spf13/afero/mem" +) + +const chmodBits = os.ModePerm | os.ModeSetuid | os.ModeSetgid | os.ModeSticky // Only a subset of bits are allowed to be changed. Documented under os.Chmod() + +type MemMapFs struct { + mu sync.RWMutex + data map[string]*mem.FileData + init sync.Once +} + +func NewMemMapFs() Fs { + return &MemMapFs{} +} + +func (m *MemMapFs) getData() map[string]*mem.FileData { + m.init.Do(func() { + m.data = make(map[string]*mem.FileData) + // Root should always exist, right? + // TODO: what about windows? + root := mem.CreateDir(FilePathSeparator) + mem.SetMode(root, os.ModeDir|0o755) + m.data[FilePathSeparator] = root + }) + return m.data +} + +func (*MemMapFs) Name() string { return "MemMapFS" } + +func (m *MemMapFs) Create(name string) (File, error) { + name = normalizePath(name) + m.mu.Lock() + file := mem.CreateFile(name) + m.getData()[name] = file + m.registerWithParent(file, 0) + m.mu.Unlock() + return mem.NewFileHandle(file), nil +} + +func (m *MemMapFs) unRegisterWithParent(fileName string) error { + f, err := m.lockfreeOpen(fileName) + if err != nil { + return err + } + parent := m.findParent(f) + if parent == nil { + log.Panic("parent of ", f.Name(), " is nil") + } + + parent.Lock() + mem.RemoveFromMemDir(parent, f) + parent.Unlock() + return nil +} + +func (m *MemMapFs) findParent(f *mem.FileData) *mem.FileData { + pdir, _ := filepath.Split(f.Name()) + pdir = filepath.Clean(pdir) + pfile, err := m.lockfreeOpen(pdir) + if err != nil { + return nil + } + return pfile +} + +func (m *MemMapFs) findDescendants(name string) []*mem.FileData { + fData := m.getData() + descendants := make([]*mem.FileData, 0, len(fData)) + for p, dFile := range fData { + if strings.HasPrefix(p, name+FilePathSeparator) { + descendants = append(descendants, dFile) + } + } + + sort.Slice(descendants, func(i, j int) bool { + cur := len(strings.Split(descendants[i].Name(), FilePathSeparator)) + next := len(strings.Split(descendants[j].Name(), FilePathSeparator)) + return cur < next + }) + + return descendants +} + +func (m *MemMapFs) registerWithParent(f *mem.FileData, perm os.FileMode) { + if f == nil { + return + } + parent := m.findParent(f) + if parent == nil { + pdir := filepath.Dir(filepath.Clean(f.Name())) + err := m.lockfreeMkdir(pdir, perm) + if err != nil { + // log.Println("Mkdir error:", err) + return + } + parent, err = m.lockfreeOpen(pdir) + if err != nil { + // log.Println("Open after Mkdir error:", err) + return + } + } + + parent.Lock() + mem.InitializeDir(parent) + mem.AddToMemDir(parent, f) + parent.Unlock() +} + +func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error { + name = normalizePath(name) + x, ok := m.getData()[name] + if ok { + // Only return ErrFileExists if it's a file, not a directory. + i := mem.FileInfo{FileData: x} + if !i.IsDir() { + return ErrFileExists + } + } else { + item := mem.CreateDir(name) + mem.SetMode(item, os.ModeDir|perm) + m.getData()[name] = item + m.registerWithParent(item, perm) + } + return nil +} + +func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error { + perm &= chmodBits + name = normalizePath(name) + + m.mu.RLock() + _, ok := m.getData()[name] + m.mu.RUnlock() + if ok { + return &os.PathError{Op: "mkdir", Path: name, Err: ErrFileExists} + } + + m.mu.Lock() + // Dobule check that it doesn't exist. + if _, ok := m.getData()[name]; ok { + m.mu.Unlock() + return &os.PathError{Op: "mkdir", Path: name, Err: ErrFileExists} + } + item := mem.CreateDir(name) + mem.SetMode(item, os.ModeDir|perm) + m.getData()[name] = item + m.registerWithParent(item, perm) + m.mu.Unlock() + + return m.setFileMode(name, perm|os.ModeDir) +} + +func (m *MemMapFs) MkdirAll(path string, perm os.FileMode) error { + err := m.Mkdir(path, perm) + if err != nil { + if err.(*os.PathError).Err == ErrFileExists { + return nil + } + return err + } + return nil +} + +// Handle some relative paths +func normalizePath(path string) string { + path = filepath.Clean(path) + + switch path { + case ".": + return FilePathSeparator + case "..": + return FilePathSeparator + default: + return path + } +} + +func (m *MemMapFs) Open(name string) (File, error) { + f, err := m.open(name) + if f != nil { + return mem.NewReadOnlyFileHandle(f), err + } + return nil, err +} + +func (m *MemMapFs) openWrite(name string) (File, error) { + f, err := m.open(name) + if f != nil { + return mem.NewFileHandle(f), err + } + return nil, err +} + +func (m *MemMapFs) open(name string) (*mem.FileData, error) { + name = normalizePath(name) + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return nil, &os.PathError{Op: "open", Path: name, Err: ErrFileNotFound} + } + return f, nil +} + +func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) { + name = normalizePath(name) + f, ok := m.getData()[name] + if ok { + return f, nil + } else { + return nil, ErrFileNotFound + } +} + +func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + perm &= chmodBits + chmod := false + file, err := m.openWrite(name) + if err == nil && (flag&os.O_EXCL > 0) { + return nil, &os.PathError{Op: "open", Path: name, Err: ErrFileExists} + } + if os.IsNotExist(err) && (flag&os.O_CREATE > 0) { + file, err = m.Create(name) + chmod = true + } + if err != nil { + return nil, err + } + if flag == os.O_RDONLY { + file = mem.NewReadOnlyFileHandle(file.(*mem.File).Data()) + } + if flag&os.O_APPEND > 0 { + _, err = file.Seek(0, io.SeekEnd) + if err != nil { + file.Close() + return nil, err + } + } + if flag&os.O_TRUNC > 0 && flag&(os.O_RDWR|os.O_WRONLY) > 0 { + err = file.Truncate(0) + if err != nil { + file.Close() + return nil, err + } + } + if chmod { + return file, m.setFileMode(name, perm) + } + return file, nil +} + +func (m *MemMapFs) Remove(name string) error { + name = normalizePath(name) + + m.mu.Lock() + defer m.mu.Unlock() + + if _, ok := m.getData()[name]; ok { + err := m.unRegisterWithParent(name) + if err != nil { + return &os.PathError{Op: "remove", Path: name, Err: err} + } + delete(m.getData(), name) + } else { + return &os.PathError{Op: "remove", Path: name, Err: os.ErrNotExist} + } + return nil +} + +func (m *MemMapFs) RemoveAll(path string) error { + path = normalizePath(path) + m.mu.Lock() + m.unRegisterWithParent(path) + m.mu.Unlock() + + m.mu.RLock() + defer m.mu.RUnlock() + + for p := range m.getData() { + if p == path || strings.HasPrefix(p, path+FilePathSeparator) { + m.mu.RUnlock() + m.mu.Lock() + delete(m.getData(), p) + m.mu.Unlock() + m.mu.RLock() + } + } + return nil +} + +func (m *MemMapFs) Rename(oldname, newname string) error { + oldname = normalizePath(oldname) + newname = normalizePath(newname) + + if oldname == newname { + return nil + } + + m.mu.RLock() + defer m.mu.RUnlock() + if _, ok := m.getData()[oldname]; ok { + m.mu.RUnlock() + m.mu.Lock() + err := m.unRegisterWithParent(oldname) + if err != nil { + return err + } + + fileData := m.getData()[oldname] + mem.ChangeFileName(fileData, newname) + m.getData()[newname] = fileData + + err = m.renameDescendants(oldname, newname) + if err != nil { + return err + } + + delete(m.getData(), oldname) + + m.registerWithParent(fileData, 0) + m.mu.Unlock() + m.mu.RLock() + } else { + return &os.PathError{Op: "rename", Path: oldname, Err: ErrFileNotFound} + } + return nil +} + +func (m *MemMapFs) renameDescendants(oldname, newname string) error { + descendants := m.findDescendants(oldname) + removes := make([]string, 0, len(descendants)) + for _, desc := range descendants { + descNewName := strings.Replace(desc.Name(), oldname, newname, 1) + err := m.unRegisterWithParent(desc.Name()) + if err != nil { + return err + } + + removes = append(removes, desc.Name()) + mem.ChangeFileName(desc, descNewName) + m.getData()[descNewName] = desc + + m.registerWithParent(desc, 0) + } + for _, r := range removes { + delete(m.getData(), r) + } + + return nil +} + +func (m *MemMapFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + fileInfo, err := m.Stat(name) + return fileInfo, false, err +} + +func (m *MemMapFs) Stat(name string) (os.FileInfo, error) { + f, err := m.Open(name) + if err != nil { + return nil, err + } + fi := mem.GetFileInfo(f.(*mem.File).Data()) + return fi, nil +} + +func (m *MemMapFs) Chmod(name string, mode os.FileMode) error { + mode &= chmodBits + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return &os.PathError{Op: "chmod", Path: name, Err: ErrFileNotFound} + } + prevOtherBits := mem.GetFileInfo(f).Mode() & ^chmodBits + + mode = prevOtherBits | mode + return m.setFileMode(name, mode) +} + +func (m *MemMapFs) setFileMode(name string, mode os.FileMode) error { + name = normalizePath(name) + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return &os.PathError{Op: "chmod", Path: name, Err: ErrFileNotFound} + } + + m.mu.Lock() + mem.SetMode(f, mode) + m.mu.Unlock() + + return nil +} + +func (m *MemMapFs) Chown(name string, uid, gid int) error { + name = normalizePath(name) + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return &os.PathError{Op: "chown", Path: name, Err: ErrFileNotFound} + } + + mem.SetUID(f, uid) + mem.SetGID(f, gid) + + return nil +} + +func (m *MemMapFs) Chtimes(name string, atime time.Time, mtime time.Time) error { + name = normalizePath(name) + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return &os.PathError{Op: "chtimes", Path: name, Err: ErrFileNotFound} + } + + m.mu.Lock() + mem.SetModTime(f, mtime) + m.mu.Unlock() + + return nil +} + +func (m *MemMapFs) List() { + for _, x := range m.data { + y := mem.FileInfo{FileData: x} + fmt.Println(x.Name(), y.Size()) + } +} diff --git a/vendor/github.com/spf13/afero/os.go b/vendor/github.com/spf13/afero/os.go new file mode 100644 index 0000000000..f1366321ec --- /dev/null +++ b/vendor/github.com/spf13/afero/os.go @@ -0,0 +1,113 @@ +// Copyright © 2014 Steve Francia . +// Copyright 2013 tsuru authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "os" + "time" +) + +var _ Lstater = (*OsFs)(nil) + +// OsFs is a Fs implementation that uses functions provided by the os package. +// +// For details in any method, check the documentation of the os package +// (http://golang.org/pkg/os/). +type OsFs struct{} + +func NewOsFs() Fs { + return &OsFs{} +} + +func (OsFs) Name() string { return "OsFs" } + +func (OsFs) Create(name string) (File, error) { + f, e := os.Create(name) + if f == nil { + // while this looks strange, we need to return a bare nil (of type nil) not + // a nil value of type *os.File or nil won't be nil + return nil, e + } + return f, e +} + +func (OsFs) Mkdir(name string, perm os.FileMode) error { + return os.Mkdir(name, perm) +} + +func (OsFs) MkdirAll(path string, perm os.FileMode) error { + return os.MkdirAll(path, perm) +} + +func (OsFs) Open(name string) (File, error) { + f, e := os.Open(name) + if f == nil { + // while this looks strange, we need to return a bare nil (of type nil) not + // a nil value of type *os.File or nil won't be nil + return nil, e + } + return f, e +} + +func (OsFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + f, e := os.OpenFile(name, flag, perm) + if f == nil { + // while this looks strange, we need to return a bare nil (of type nil) not + // a nil value of type *os.File or nil won't be nil + return nil, e + } + return f, e +} + +func (OsFs) Remove(name string) error { + return os.Remove(name) +} + +func (OsFs) RemoveAll(path string) error { + return os.RemoveAll(path) +} + +func (OsFs) Rename(oldname, newname string) error { + return os.Rename(oldname, newname) +} + +func (OsFs) Stat(name string) (os.FileInfo, error) { + return os.Stat(name) +} + +func (OsFs) Chmod(name string, mode os.FileMode) error { + return os.Chmod(name, mode) +} + +func (OsFs) Chown(name string, uid, gid int) error { + return os.Chown(name, uid, gid) +} + +func (OsFs) Chtimes(name string, atime time.Time, mtime time.Time) error { + return os.Chtimes(name, atime, mtime) +} + +func (OsFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + fi, err := os.Lstat(name) + return fi, true, err +} + +func (OsFs) SymlinkIfPossible(oldname, newname string) error { + return os.Symlink(oldname, newname) +} + +func (OsFs) ReadlinkIfPossible(name string) (string, error) { + return os.Readlink(name) +} diff --git a/vendor/github.com/spf13/afero/path.go b/vendor/github.com/spf13/afero/path.go new file mode 100644 index 0000000000..18f60a0f6b --- /dev/null +++ b/vendor/github.com/spf13/afero/path.go @@ -0,0 +1,106 @@ +// Copyright ©2015 The Go Authors +// Copyright ©2015 Steve Francia +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "os" + "path/filepath" + "sort" +) + +// readDirNames reads the directory named by dirname and returns +// a sorted list of directory entries. +// adapted from https://golang.org/src/path/filepath/path.go +func readDirNames(fs Fs, dirname string) ([]string, error) { + f, err := fs.Open(dirname) + if err != nil { + return nil, err + } + names, err := f.Readdirnames(-1) + f.Close() + if err != nil { + return nil, err + } + sort.Strings(names) + return names, nil +} + +// walk recursively descends path, calling walkFn +// adapted from https://golang.org/src/path/filepath/path.go +func walk(fs Fs, path string, info os.FileInfo, walkFn filepath.WalkFunc) error { + err := walkFn(path, info, nil) + if err != nil { + if info.IsDir() && err == filepath.SkipDir { + return nil + } + return err + } + + if !info.IsDir() { + return nil + } + + names, err := readDirNames(fs, path) + if err != nil { + return walkFn(path, info, err) + } + + for _, name := range names { + filename := filepath.Join(path, name) + fileInfo, err := lstatIfPossible(fs, filename) + if err != nil { + if err := walkFn(filename, fileInfo, err); err != nil && err != filepath.SkipDir { + return err + } + } else { + err = walk(fs, filename, fileInfo, walkFn) + if err != nil { + if !fileInfo.IsDir() || err != filepath.SkipDir { + return err + } + } + } + } + return nil +} + +// if the filesystem supports it, use Lstat, else use fs.Stat +func lstatIfPossible(fs Fs, path string) (os.FileInfo, error) { + if lfs, ok := fs.(Lstater); ok { + fi, _, err := lfs.LstatIfPossible(path) + return fi, err + } + return fs.Stat(path) +} + +// Walk walks the file tree rooted at root, calling walkFn for each file or +// directory in the tree, including root. All errors that arise visiting files +// and directories are filtered by walkFn. The files are walked in lexical +// order, which makes the output deterministic but means that for very +// large directories Walk can be inefficient. +// Walk does not follow symbolic links. + +func (a Afero) Walk(root string, walkFn filepath.WalkFunc) error { + return Walk(a.Fs, root, walkFn) +} + +func Walk(fs Fs, root string, walkFn filepath.WalkFunc) error { + info, err := lstatIfPossible(fs, root) + if err != nil { + return walkFn(root, nil, err) + } + return walk(fs, root, info, walkFn) +} diff --git a/vendor/github.com/spf13/afero/readonlyfs.go b/vendor/github.com/spf13/afero/readonlyfs.go new file mode 100644 index 0000000000..bd8f9264dd --- /dev/null +++ b/vendor/github.com/spf13/afero/readonlyfs.go @@ -0,0 +1,96 @@ +package afero + +import ( + "os" + "syscall" + "time" +) + +var _ Lstater = (*ReadOnlyFs)(nil) + +type ReadOnlyFs struct { + source Fs +} + +func NewReadOnlyFs(source Fs) Fs { + return &ReadOnlyFs{source: source} +} + +func (r *ReadOnlyFs) ReadDir(name string) ([]os.FileInfo, error) { + return ReadDir(r.source, name) +} + +func (r *ReadOnlyFs) Chtimes(n string, a, m time.Time) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Chmod(n string, m os.FileMode) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Chown(n string, uid, gid int) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Name() string { + return "ReadOnlyFilter" +} + +func (r *ReadOnlyFs) Stat(name string) (os.FileInfo, error) { + return r.source.Stat(name) +} + +func (r *ReadOnlyFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + if lsf, ok := r.source.(Lstater); ok { + return lsf.LstatIfPossible(name) + } + fi, err := r.Stat(name) + return fi, false, err +} + +func (r *ReadOnlyFs) SymlinkIfPossible(oldname, newname string) error { + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink} +} + +func (r *ReadOnlyFs) ReadlinkIfPossible(name string) (string, error) { + if srdr, ok := r.source.(LinkReader); ok { + return srdr.ReadlinkIfPossible(name) + } + + return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink} +} + +func (r *ReadOnlyFs) Rename(o, n string) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) RemoveAll(p string) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Remove(n string) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + if flag&(os.O_WRONLY|syscall.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 { + return nil, syscall.EPERM + } + return r.source.OpenFile(name, flag, perm) +} + +func (r *ReadOnlyFs) Open(n string) (File, error) { + return r.source.Open(n) +} + +func (r *ReadOnlyFs) Mkdir(n string, p os.FileMode) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) MkdirAll(n string, p os.FileMode) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Create(n string) (File, error) { + return nil, syscall.EPERM +} diff --git a/vendor/github.com/spf13/afero/regexpfs.go b/vendor/github.com/spf13/afero/regexpfs.go new file mode 100644 index 0000000000..218f3b235b --- /dev/null +++ b/vendor/github.com/spf13/afero/regexpfs.go @@ -0,0 +1,223 @@ +package afero + +import ( + "os" + "regexp" + "syscall" + "time" +) + +// The RegexpFs filters files (not directories) by regular expression. Only +// files matching the given regexp will be allowed, all others get a ENOENT error ( +// "No such file or directory"). +type RegexpFs struct { + re *regexp.Regexp + source Fs +} + +func NewRegexpFs(source Fs, re *regexp.Regexp) Fs { + return &RegexpFs{source: source, re: re} +} + +type RegexpFile struct { + f File + re *regexp.Regexp +} + +func (r *RegexpFs) matchesName(name string) error { + if r.re == nil { + return nil + } + if r.re.MatchString(name) { + return nil + } + return syscall.ENOENT +} + +func (r *RegexpFs) dirOrMatches(name string) error { + dir, err := IsDir(r.source, name) + if err != nil { + return err + } + if dir { + return nil + } + return r.matchesName(name) +} + +func (r *RegexpFs) Chtimes(name string, a, m time.Time) error { + if err := r.dirOrMatches(name); err != nil { + return err + } + return r.source.Chtimes(name, a, m) +} + +func (r *RegexpFs) Chmod(name string, mode os.FileMode) error { + if err := r.dirOrMatches(name); err != nil { + return err + } + return r.source.Chmod(name, mode) +} + +func (r *RegexpFs) Chown(name string, uid, gid int) error { + if err := r.dirOrMatches(name); err != nil { + return err + } + return r.source.Chown(name, uid, gid) +} + +func (r *RegexpFs) Name() string { + return "RegexpFs" +} + +func (r *RegexpFs) Stat(name string) (os.FileInfo, error) { + if err := r.dirOrMatches(name); err != nil { + return nil, err + } + return r.source.Stat(name) +} + +func (r *RegexpFs) Rename(oldname, newname string) error { + dir, err := IsDir(r.source, oldname) + if err != nil { + return err + } + if dir { + return nil + } + if err := r.matchesName(oldname); err != nil { + return err + } + if err := r.matchesName(newname); err != nil { + return err + } + return r.source.Rename(oldname, newname) +} + +func (r *RegexpFs) RemoveAll(p string) error { + dir, err := IsDir(r.source, p) + if err != nil { + return err + } + if !dir { + if err := r.matchesName(p); err != nil { + return err + } + } + return r.source.RemoveAll(p) +} + +func (r *RegexpFs) Remove(name string) error { + if err := r.dirOrMatches(name); err != nil { + return err + } + return r.source.Remove(name) +} + +func (r *RegexpFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + if err := r.dirOrMatches(name); err != nil { + return nil, err + } + return r.source.OpenFile(name, flag, perm) +} + +func (r *RegexpFs) Open(name string) (File, error) { + dir, err := IsDir(r.source, name) + if err != nil { + return nil, err + } + if !dir { + if err := r.matchesName(name); err != nil { + return nil, err + } + } + f, err := r.source.Open(name) + if err != nil { + return nil, err + } + return &RegexpFile{f: f, re: r.re}, nil +} + +func (r *RegexpFs) Mkdir(n string, p os.FileMode) error { + return r.source.Mkdir(n, p) +} + +func (r *RegexpFs) MkdirAll(n string, p os.FileMode) error { + return r.source.MkdirAll(n, p) +} + +func (r *RegexpFs) Create(name string) (File, error) { + if err := r.matchesName(name); err != nil { + return nil, err + } + return r.source.Create(name) +} + +func (f *RegexpFile) Close() error { + return f.f.Close() +} + +func (f *RegexpFile) Read(s []byte) (int, error) { + return f.f.Read(s) +} + +func (f *RegexpFile) ReadAt(s []byte, o int64) (int, error) { + return f.f.ReadAt(s, o) +} + +func (f *RegexpFile) Seek(o int64, w int) (int64, error) { + return f.f.Seek(o, w) +} + +func (f *RegexpFile) Write(s []byte) (int, error) { + return f.f.Write(s) +} + +func (f *RegexpFile) WriteAt(s []byte, o int64) (int, error) { + return f.f.WriteAt(s, o) +} + +func (f *RegexpFile) Name() string { + return f.f.Name() +} + +func (f *RegexpFile) Readdir(c int) (fi []os.FileInfo, err error) { + var rfi []os.FileInfo + rfi, err = f.f.Readdir(c) + if err != nil { + return nil, err + } + for _, i := range rfi { + if i.IsDir() || f.re.MatchString(i.Name()) { + fi = append(fi, i) + } + } + return fi, nil +} + +func (f *RegexpFile) Readdirnames(c int) (n []string, err error) { + fi, err := f.Readdir(c) + if err != nil { + return nil, err + } + for _, s := range fi { + n = append(n, s.Name()) + } + return n, nil +} + +func (f *RegexpFile) Stat() (os.FileInfo, error) { + return f.f.Stat() +} + +func (f *RegexpFile) Sync() error { + return f.f.Sync() +} + +func (f *RegexpFile) Truncate(s int64) error { + return f.f.Truncate(s) +} + +func (f *RegexpFile) WriteString(s string) (int, error) { + return f.f.WriteString(s) +} diff --git a/vendor/github.com/spf13/afero/symlink.go b/vendor/github.com/spf13/afero/symlink.go new file mode 100644 index 0000000000..aa6ae125b6 --- /dev/null +++ b/vendor/github.com/spf13/afero/symlink.go @@ -0,0 +1,55 @@ +// Copyright © 2018 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "errors" +) + +// Symlinker is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +// It indicates support for 3 symlink related interfaces that implement the +// behaviors of the os methods: +// - Lstat +// - Symlink, and +// - Readlink +type Symlinker interface { + Lstater + Linker + LinkReader +} + +// Linker is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +// It will call Symlink if the filesystem itself is, or it delegates to, the os filesystem, +// or the filesystem otherwise supports Symlink's. +type Linker interface { + SymlinkIfPossible(oldname, newname string) error +} + +// ErrNoSymlink is the error that will be wrapped in an os.LinkError if a file system +// does not support Symlink's either directly or through its delegated filesystem. +// As expressed by support for the Linker interface. +var ErrNoSymlink = errors.New("symlink not supported") + +// LinkReader is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +type LinkReader interface { + ReadlinkIfPossible(name string) (string, error) +} + +// ErrNoReadlink is the error that will be wrapped in an os.Path if a file system +// does not support the readlink operation either directly or through its delegated filesystem. +// As expressed by support for the LinkReader interface. +var ErrNoReadlink = errors.New("readlink not supported") diff --git a/vendor/github.com/spf13/afero/unionFile.go b/vendor/github.com/spf13/afero/unionFile.go new file mode 100644 index 0000000000..62dd6c93c8 --- /dev/null +++ b/vendor/github.com/spf13/afero/unionFile.go @@ -0,0 +1,330 @@ +package afero + +import ( + "io" + "os" + "path/filepath" + "syscall" +) + +// The UnionFile implements the afero.File interface and will be returned +// when reading a directory present at least in the overlay or opening a file +// for writing. +// +// The calls to +// Readdir() and Readdirnames() merge the file os.FileInfo / names from the +// base and the overlay - for files present in both layers, only those +// from the overlay will be used. +// +// When opening files for writing (Create() / OpenFile() with the right flags) +// the operations will be done in both layers, starting with the overlay. A +// successful read in the overlay will move the cursor position in the base layer +// by the number of bytes read. +type UnionFile struct { + Base File + Layer File + Merger DirsMerger + off int + files []os.FileInfo +} + +func (f *UnionFile) Close() error { + // first close base, so we have a newer timestamp in the overlay. If we'd close + // the overlay first, we'd get a cacheStale the next time we access this file + // -> cache would be useless ;-) + if f.Base != nil { + f.Base.Close() + } + if f.Layer != nil { + return f.Layer.Close() + } + return BADFD +} + +func (f *UnionFile) Read(s []byte) (int, error) { + if f.Layer != nil { + n, err := f.Layer.Read(s) + if (err == nil || err == io.EOF) && f.Base != nil { + // advance the file position also in the base file, the next + // call may be a write at this position (or a seek with SEEK_CUR) + if _, seekErr := f.Base.Seek(int64(n), io.SeekCurrent); seekErr != nil { + // only overwrite err in case the seek fails: we need to + // report an eventual io.EOF to the caller + err = seekErr + } + } + return n, err + } + if f.Base != nil { + return f.Base.Read(s) + } + return 0, BADFD +} + +func (f *UnionFile) ReadAt(s []byte, o int64) (int, error) { + if f.Layer != nil { + n, err := f.Layer.ReadAt(s, o) + if (err == nil || err == io.EOF) && f.Base != nil { + _, err = f.Base.Seek(o+int64(n), io.SeekStart) + } + return n, err + } + if f.Base != nil { + return f.Base.ReadAt(s, o) + } + return 0, BADFD +} + +func (f *UnionFile) Seek(o int64, w int) (pos int64, err error) { + if f.Layer != nil { + pos, err = f.Layer.Seek(o, w) + if (err == nil || err == io.EOF) && f.Base != nil { + _, err = f.Base.Seek(o, w) + } + return pos, err + } + if f.Base != nil { + return f.Base.Seek(o, w) + } + return 0, BADFD +} + +func (f *UnionFile) Write(s []byte) (n int, err error) { + if f.Layer != nil { + n, err = f.Layer.Write(s) + if err == nil && f.Base != nil { // hmm, do we have fixed size files where a write may hit the EOF mark? + _, err = f.Base.Write(s) + } + return n, err + } + if f.Base != nil { + return f.Base.Write(s) + } + return 0, BADFD +} + +func (f *UnionFile) WriteAt(s []byte, o int64) (n int, err error) { + if f.Layer != nil { + n, err = f.Layer.WriteAt(s, o) + if err == nil && f.Base != nil { + _, err = f.Base.WriteAt(s, o) + } + return n, err + } + if f.Base != nil { + return f.Base.WriteAt(s, o) + } + return 0, BADFD +} + +func (f *UnionFile) Name() string { + if f.Layer != nil { + return f.Layer.Name() + } + return f.Base.Name() +} + +// DirsMerger is how UnionFile weaves two directories together. +// It takes the FileInfo slices from the layer and the base and returns a +// single view. +type DirsMerger func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error) + +var defaultUnionMergeDirsFn = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error) { + files := make(map[string]os.FileInfo) + + for _, fi := range lofi { + files[fi.Name()] = fi + } + + for _, fi := range bofi { + if _, exists := files[fi.Name()]; !exists { + files[fi.Name()] = fi + } + } + + rfi := make([]os.FileInfo, len(files)) + + i := 0 + for _, fi := range files { + rfi[i] = fi + i++ + } + + return rfi, nil +} + +// Readdir will weave the two directories together and +// return a single view of the overlayed directories. +// At the end of the directory view, the error is io.EOF if c > 0. +func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) { + var merge DirsMerger = f.Merger + if merge == nil { + merge = defaultUnionMergeDirsFn + } + + if f.off == 0 { + var lfi []os.FileInfo + if f.Layer != nil { + lfi, err = f.Layer.Readdir(-1) + if err != nil { + return nil, err + } + } + + var bfi []os.FileInfo + if f.Base != nil { + bfi, err = f.Base.Readdir(-1) + if err != nil { + return nil, err + } + + } + merged, err := merge(lfi, bfi) + if err != nil { + return nil, err + } + f.files = append(f.files, merged...) + } + files := f.files[f.off:] + + if c <= 0 { + return files, nil + } + + if len(files) == 0 { + return nil, io.EOF + } + + if c > len(files) { + c = len(files) + } + + defer func() { f.off += c }() + return files[:c], nil +} + +func (f *UnionFile) Readdirnames(c int) ([]string, error) { + rfi, err := f.Readdir(c) + if err != nil { + return nil, err + } + var names []string + for _, fi := range rfi { + names = append(names, fi.Name()) + } + return names, nil +} + +func (f *UnionFile) Stat() (os.FileInfo, error) { + if f.Layer != nil { + return f.Layer.Stat() + } + if f.Base != nil { + return f.Base.Stat() + } + return nil, BADFD +} + +func (f *UnionFile) Sync() (err error) { + if f.Layer != nil { + err = f.Layer.Sync() + if err == nil && f.Base != nil { + err = f.Base.Sync() + } + return err + } + if f.Base != nil { + return f.Base.Sync() + } + return BADFD +} + +func (f *UnionFile) Truncate(s int64) (err error) { + if f.Layer != nil { + err = f.Layer.Truncate(s) + if err == nil && f.Base != nil { + err = f.Base.Truncate(s) + } + return err + } + if f.Base != nil { + return f.Base.Truncate(s) + } + return BADFD +} + +func (f *UnionFile) WriteString(s string) (n int, err error) { + if f.Layer != nil { + n, err = f.Layer.WriteString(s) + if err == nil && f.Base != nil { + _, err = f.Base.WriteString(s) + } + return n, err + } + if f.Base != nil { + return f.Base.WriteString(s) + } + return 0, BADFD +} + +func copyFile(base Fs, layer Fs, name string, bfh File) error { + // First make sure the directory exists + exists, err := Exists(layer, filepath.Dir(name)) + if err != nil { + return err + } + if !exists { + err = layer.MkdirAll(filepath.Dir(name), 0o777) // FIXME? + if err != nil { + return err + } + } + + // Create the file on the overlay + lfh, err := layer.Create(name) + if err != nil { + return err + } + n, err := io.Copy(lfh, bfh) + if err != nil { + // If anything fails, clean up the file + layer.Remove(name) + lfh.Close() + return err + } + + bfi, err := bfh.Stat() + if err != nil || bfi.Size() != n { + layer.Remove(name) + lfh.Close() + return syscall.EIO + } + + err = lfh.Close() + if err != nil { + layer.Remove(name) + lfh.Close() + return err + } + return layer.Chtimes(name, bfi.ModTime(), bfi.ModTime()) +} + +func copyToLayer(base Fs, layer Fs, name string) error { + bfh, err := base.Open(name) + if err != nil { + return err + } + defer bfh.Close() + + return copyFile(base, layer, name, bfh) +} + +func copyFileToLayer(base Fs, layer Fs, name string, flag int, perm os.FileMode) error { + bfh, err := base.OpenFile(name, flag, perm) + if err != nil { + return err + } + defer bfh.Close() + + return copyFile(base, layer, name, bfh) +} diff --git a/vendor/github.com/spf13/afero/util.go b/vendor/github.com/spf13/afero/util.go new file mode 100644 index 0000000000..9e4cba2746 --- /dev/null +++ b/vendor/github.com/spf13/afero/util.go @@ -0,0 +1,329 @@ +// Copyright ©2015 Steve Francia +// Portions Copyright ©2015 The Hugo Authors +// Portions Copyright 2016-present Bjørn Erik Pedersen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "bytes" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "unicode" + + "golang.org/x/text/runes" + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" +) + +// Filepath separator defined by os.Separator. +const FilePathSeparator = string(filepath.Separator) + +// Takes a reader and a path and writes the content +func (a Afero) WriteReader(path string, r io.Reader) (err error) { + return WriteReader(a.Fs, path, r) +} + +func WriteReader(fs Fs, path string, r io.Reader) (err error) { + dir, _ := filepath.Split(path) + ospath := filepath.FromSlash(dir) + + if ospath != "" { + err = fs.MkdirAll(ospath, 0o777) // rwx, rw, r + if err != nil { + if err != os.ErrExist { + return err + } + } + } + + file, err := fs.Create(path) + if err != nil { + return + } + defer file.Close() + + _, err = io.Copy(file, r) + return +} + +// Same as WriteReader but checks to see if file/directory already exists. +func (a Afero) SafeWriteReader(path string, r io.Reader) (err error) { + return SafeWriteReader(a.Fs, path, r) +} + +func SafeWriteReader(fs Fs, path string, r io.Reader) (err error) { + dir, _ := filepath.Split(path) + ospath := filepath.FromSlash(dir) + + if ospath != "" { + err = fs.MkdirAll(ospath, 0o777) // rwx, rw, r + if err != nil { + return + } + } + + exists, err := Exists(fs, path) + if err != nil { + return + } + if exists { + return fmt.Errorf("%v already exists", path) + } + + file, err := fs.Create(path) + if err != nil { + return + } + defer file.Close() + + _, err = io.Copy(file, r) + return +} + +func (a Afero) GetTempDir(subPath string) string { + return GetTempDir(a.Fs, subPath) +} + +// GetTempDir returns the default temp directory with trailing slash +// if subPath is not empty then it will be created recursively with mode 777 rwx rwx rwx +func GetTempDir(fs Fs, subPath string) string { + addSlash := func(p string) string { + if FilePathSeparator != p[len(p)-1:] { + p = p + FilePathSeparator + } + return p + } + dir := addSlash(os.TempDir()) + + if subPath != "" { + // preserve windows backslash :-( + if FilePathSeparator == "\\" { + subPath = strings.Replace(subPath, "\\", "____", -1) + } + dir = dir + UnicodeSanitize((subPath)) + if FilePathSeparator == "\\" { + dir = strings.Replace(dir, "____", "\\", -1) + } + + if exists, _ := Exists(fs, dir); exists { + return addSlash(dir) + } + + err := fs.MkdirAll(dir, 0o777) + if err != nil { + panic(err) + } + dir = addSlash(dir) + } + return dir +} + +// Rewrite string to remove non-standard path characters +func UnicodeSanitize(s string) string { + source := []rune(s) + target := make([]rune, 0, len(source)) + + for _, r := range source { + if unicode.IsLetter(r) || + unicode.IsDigit(r) || + unicode.IsMark(r) || + r == '.' || + r == '/' || + r == '\\' || + r == '_' || + r == '-' || + r == '%' || + r == ' ' || + r == '#' { + target = append(target, r) + } + } + + return string(target) +} + +// Transform characters with accents into plain forms. +func NeuterAccents(s string) string { + t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC) + result, _, _ := transform.String(t, string(s)) + + return result +} + +func (a Afero) FileContainsBytes(filename string, subslice []byte) (bool, error) { + return FileContainsBytes(a.Fs, filename, subslice) +} + +// Check if a file contains a specified byte slice. +func FileContainsBytes(fs Fs, filename string, subslice []byte) (bool, error) { + f, err := fs.Open(filename) + if err != nil { + return false, err + } + defer f.Close() + + return readerContainsAny(f, subslice), nil +} + +func (a Afero) FileContainsAnyBytes(filename string, subslices [][]byte) (bool, error) { + return FileContainsAnyBytes(a.Fs, filename, subslices) +} + +// Check if a file contains any of the specified byte slices. +func FileContainsAnyBytes(fs Fs, filename string, subslices [][]byte) (bool, error) { + f, err := fs.Open(filename) + if err != nil { + return false, err + } + defer f.Close() + + return readerContainsAny(f, subslices...), nil +} + +// readerContains reports whether any of the subslices is within r. +func readerContainsAny(r io.Reader, subslices ...[]byte) bool { + if r == nil || len(subslices) == 0 { + return false + } + + largestSlice := 0 + + for _, sl := range subslices { + if len(sl) > largestSlice { + largestSlice = len(sl) + } + } + + if largestSlice == 0 { + return false + } + + bufflen := largestSlice * 4 + halflen := bufflen / 2 + buff := make([]byte, bufflen) + var err error + var n, i int + + for { + i++ + if i == 1 { + n, err = io.ReadAtLeast(r, buff[:halflen], halflen) + } else { + if i != 2 { + // shift left to catch overlapping matches + copy(buff[:], buff[halflen:]) + } + n, err = io.ReadAtLeast(r, buff[halflen:], halflen) + } + + if n > 0 { + for _, sl := range subslices { + if bytes.Contains(buff, sl) { + return true + } + } + } + + if err != nil { + break + } + } + return false +} + +func (a Afero) DirExists(path string) (bool, error) { + return DirExists(a.Fs, path) +} + +// DirExists checks if a path exists and is a directory. +func DirExists(fs Fs, path string) (bool, error) { + fi, err := fs.Stat(path) + if err == nil && fi.IsDir() { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} + +func (a Afero) IsDir(path string) (bool, error) { + return IsDir(a.Fs, path) +} + +// IsDir checks if a given path is a directory. +func IsDir(fs Fs, path string) (bool, error) { + fi, err := fs.Stat(path) + if err != nil { + return false, err + } + return fi.IsDir(), nil +} + +func (a Afero) IsEmpty(path string) (bool, error) { + return IsEmpty(a.Fs, path) +} + +// IsEmpty checks if a given file or directory is empty. +func IsEmpty(fs Fs, path string) (bool, error) { + if b, _ := Exists(fs, path); !b { + return false, fmt.Errorf("%q path does not exist", path) + } + fi, err := fs.Stat(path) + if err != nil { + return false, err + } + if fi.IsDir() { + f, err := fs.Open(path) + if err != nil { + return false, err + } + defer f.Close() + list, err := f.Readdir(-1) + if err != nil { + return false, err + } + return len(list) == 0, nil + } + return fi.Size() == 0, nil +} + +func (a Afero) Exists(path string) (bool, error) { + return Exists(a.Fs, path) +} + +// Check if a file or directory exists. +func Exists(fs Fs, path string) (bool, error) { + _, err := fs.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} + +func FullBaseFsPath(basePathFs *BasePathFs, relativePath string) string { + combinedPath := filepath.Join(basePathFs.path, relativePath) + if parent, ok := basePathFs.source.(*BasePathFs); ok { + return FullBaseFsPath(parent, combinedPath) + } + + return combinedPath +} diff --git a/vendor/github.com/spf13/cast/.gitignore b/vendor/github.com/spf13/cast/.gitignore new file mode 100644 index 0000000000..53053a8ac5 --- /dev/null +++ b/vendor/github.com/spf13/cast/.gitignore @@ -0,0 +1,25 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test + +*.bench diff --git a/vendor/github.com/spf13/cast/LICENSE b/vendor/github.com/spf13/cast/LICENSE new file mode 100644 index 0000000000..4527efb9c0 --- /dev/null +++ b/vendor/github.com/spf13/cast/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Steve Francia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/spf13/cast/Makefile b/vendor/github.com/spf13/cast/Makefile new file mode 100644 index 0000000000..f01a5dbb6e --- /dev/null +++ b/vendor/github.com/spf13/cast/Makefile @@ -0,0 +1,40 @@ +GOVERSION := $(shell go version | cut -d ' ' -f 3 | cut -d '.' -f 2) + +.PHONY: check fmt lint test test-race vet test-cover-html help +.DEFAULT_GOAL := help + +check: test-race fmt vet lint ## Run tests and linters + +test: ## Run tests + go test ./... + +test-race: ## Run tests with race detector + go test -race ./... + +fmt: ## Run gofmt linter +ifeq "$(GOVERSION)" "12" + @for d in `go list` ; do \ + if [ "`gofmt -l -s $$GOPATH/src/$$d | tee /dev/stderr`" ]; then \ + echo "^ improperly formatted go files" && echo && exit 1; \ + fi \ + done +endif + +lint: ## Run golint linter + @for d in `go list` ; do \ + if [ "`golint $$d | tee /dev/stderr`" ]; then \ + echo "^ golint errors!" && echo && exit 1; \ + fi \ + done + +vet: ## Run go vet linter + @if [ "`go vet | tee /dev/stderr`" ]; then \ + echo "^ go vet errors!" && echo && exit 1; \ + fi + +test-cover-html: ## Generate test coverage report + go test -coverprofile=coverage.out -covermode=count + go tool cover -func=coverage.out + +help: + @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/vendor/github.com/spf13/cast/README.md b/vendor/github.com/spf13/cast/README.md new file mode 100644 index 0000000000..0e9e145935 --- /dev/null +++ b/vendor/github.com/spf13/cast/README.md @@ -0,0 +1,75 @@ +# cast + +[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/spf13/cast/ci.yaml?branch=master&style=flat-square)](https://github.com/spf13/cast/actions/workflows/ci.yaml) +[![PkgGoDev](https://pkg.go.dev/badge/mod/github.com/spf13/cast)](https://pkg.go.dev/mod/github.com/spf13/cast) +![Go Version](https://img.shields.io/badge/go%20version-%3E=1.16-61CFDD.svg?style=flat-square) +[![Go Report Card](https://goreportcard.com/badge/github.com/spf13/cast?style=flat-square)](https://goreportcard.com/report/github.com/spf13/cast) + +Easy and safe casting from one type to another in Go + +Don’t Panic! ... Cast + +## What is Cast? + +Cast is a library to convert between different go types in a consistent and easy way. + +Cast provides simple functions to easily convert a number to a string, an +interface into a bool, etc. Cast does this intelligently when an obvious +conversion is possible. It doesn’t make any attempts to guess what you meant, +for example you can only convert a string to an int when it is a string +representation of an int such as “8”. Cast was developed for use in +[Hugo](https://gohugo.io), a website engine which uses YAML, TOML or JSON +for meta data. + +## Why use Cast? + +When working with dynamic data in Go you often need to cast or convert the data +from one type into another. Cast goes beyond just using type assertion (though +it uses that when possible) to provide a very straightforward and convenient +library. + +If you are working with interfaces to handle things like dynamic content +you’ll need an easy way to convert an interface into a given type. This +is the library for you. + +If you are taking in data from YAML, TOML or JSON or other formats which lack +full types, then Cast is the library for you. + +## Usage + +Cast provides a handful of To_____ methods. These methods will always return +the desired type. **If input is provided that will not convert to that type, the +0 or nil value for that type will be returned**. + +Cast also provides identical methods To_____E. These return the same result as +the To_____ methods, plus an additional error which tells you if it successfully +converted. Using these methods you can tell the difference between when the +input matched the zero value or when the conversion failed and the zero value +was returned. + +The following examples are merely a sample of what is available. Please review +the code for a complete set. + +### Example ‘ToString’: + + cast.ToString("mayonegg") // "mayonegg" + cast.ToString(8) // "8" + cast.ToString(8.31) // "8.31" + cast.ToString([]byte("one time")) // "one time" + cast.ToString(nil) // "" + + var foo interface{} = "one more time" + cast.ToString(foo) // "one more time" + + +### Example ‘ToInt’: + + cast.ToInt(8) // 8 + cast.ToInt(8.31) // 8 + cast.ToInt("8") // 8 + cast.ToInt(true) // 1 + cast.ToInt(false) // 0 + + var eight interface{} = 8 + cast.ToInt(eight) // 8 + cast.ToInt(nil) // 0 diff --git a/vendor/github.com/spf13/cast/cast.go b/vendor/github.com/spf13/cast/cast.go new file mode 100644 index 0000000000..0cfe9418de --- /dev/null +++ b/vendor/github.com/spf13/cast/cast.go @@ -0,0 +1,176 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// Package cast provides easy and safe casting in Go. +package cast + +import "time" + +// ToBool casts an interface to a bool type. +func ToBool(i interface{}) bool { + v, _ := ToBoolE(i) + return v +} + +// ToTime casts an interface to a time.Time type. +func ToTime(i interface{}) time.Time { + v, _ := ToTimeE(i) + return v +} + +func ToTimeInDefaultLocation(i interface{}, location *time.Location) time.Time { + v, _ := ToTimeInDefaultLocationE(i, location) + return v +} + +// ToDuration casts an interface to a time.Duration type. +func ToDuration(i interface{}) time.Duration { + v, _ := ToDurationE(i) + return v +} + +// ToFloat64 casts an interface to a float64 type. +func ToFloat64(i interface{}) float64 { + v, _ := ToFloat64E(i) + return v +} + +// ToFloat32 casts an interface to a float32 type. +func ToFloat32(i interface{}) float32 { + v, _ := ToFloat32E(i) + return v +} + +// ToInt64 casts an interface to an int64 type. +func ToInt64(i interface{}) int64 { + v, _ := ToInt64E(i) + return v +} + +// ToInt32 casts an interface to an int32 type. +func ToInt32(i interface{}) int32 { + v, _ := ToInt32E(i) + return v +} + +// ToInt16 casts an interface to an int16 type. +func ToInt16(i interface{}) int16 { + v, _ := ToInt16E(i) + return v +} + +// ToInt8 casts an interface to an int8 type. +func ToInt8(i interface{}) int8 { + v, _ := ToInt8E(i) + return v +} + +// ToInt casts an interface to an int type. +func ToInt(i interface{}) int { + v, _ := ToIntE(i) + return v +} + +// ToUint casts an interface to a uint type. +func ToUint(i interface{}) uint { + v, _ := ToUintE(i) + return v +} + +// ToUint64 casts an interface to a uint64 type. +func ToUint64(i interface{}) uint64 { + v, _ := ToUint64E(i) + return v +} + +// ToUint32 casts an interface to a uint32 type. +func ToUint32(i interface{}) uint32 { + v, _ := ToUint32E(i) + return v +} + +// ToUint16 casts an interface to a uint16 type. +func ToUint16(i interface{}) uint16 { + v, _ := ToUint16E(i) + return v +} + +// ToUint8 casts an interface to a uint8 type. +func ToUint8(i interface{}) uint8 { + v, _ := ToUint8E(i) + return v +} + +// ToString casts an interface to a string type. +func ToString(i interface{}) string { + v, _ := ToStringE(i) + return v +} + +// ToStringMapString casts an interface to a map[string]string type. +func ToStringMapString(i interface{}) map[string]string { + v, _ := ToStringMapStringE(i) + return v +} + +// ToStringMapStringSlice casts an interface to a map[string][]string type. +func ToStringMapStringSlice(i interface{}) map[string][]string { + v, _ := ToStringMapStringSliceE(i) + return v +} + +// ToStringMapBool casts an interface to a map[string]bool type. +func ToStringMapBool(i interface{}) map[string]bool { + v, _ := ToStringMapBoolE(i) + return v +} + +// ToStringMapInt casts an interface to a map[string]int type. +func ToStringMapInt(i interface{}) map[string]int { + v, _ := ToStringMapIntE(i) + return v +} + +// ToStringMapInt64 casts an interface to a map[string]int64 type. +func ToStringMapInt64(i interface{}) map[string]int64 { + v, _ := ToStringMapInt64E(i) + return v +} + +// ToStringMap casts an interface to a map[string]interface{} type. +func ToStringMap(i interface{}) map[string]interface{} { + v, _ := ToStringMapE(i) + return v +} + +// ToSlice casts an interface to a []interface{} type. +func ToSlice(i interface{}) []interface{} { + v, _ := ToSliceE(i) + return v +} + +// ToBoolSlice casts an interface to a []bool type. +func ToBoolSlice(i interface{}) []bool { + v, _ := ToBoolSliceE(i) + return v +} + +// ToStringSlice casts an interface to a []string type. +func ToStringSlice(i interface{}) []string { + v, _ := ToStringSliceE(i) + return v +} + +// ToIntSlice casts an interface to a []int type. +func ToIntSlice(i interface{}) []int { + v, _ := ToIntSliceE(i) + return v +} + +// ToDurationSlice casts an interface to a []time.Duration type. +func ToDurationSlice(i interface{}) []time.Duration { + v, _ := ToDurationSliceE(i) + return v +} diff --git a/vendor/github.com/spf13/cast/caste.go b/vendor/github.com/spf13/cast/caste.go new file mode 100644 index 0000000000..cd9c04885a --- /dev/null +++ b/vendor/github.com/spf13/cast/caste.go @@ -0,0 +1,1510 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package cast + +import ( + "encoding/json" + "errors" + "fmt" + "html/template" + "reflect" + "strconv" + "strings" + "time" +) + +var errNegativeNotAllowed = errors.New("unable to cast negative value") + +type float64EProvider interface { + Float64() (float64, error) +} + +type float64Provider interface { + Float64() float64 +} + +// ToTimeE casts an interface to a time.Time type. +func ToTimeE(i interface{}) (tim time.Time, err error) { + return ToTimeInDefaultLocationE(i, time.UTC) +} + +// ToTimeInDefaultLocationE casts an empty interface to time.Time, +// interpreting inputs without a timezone to be in the given location, +// or the local timezone if nil. +func ToTimeInDefaultLocationE(i interface{}, location *time.Location) (tim time.Time, err error) { + i = indirect(i) + + switch v := i.(type) { + case time.Time: + return v, nil + case string: + return StringToDateInDefaultLocation(v, location) + case json.Number: + s, err1 := ToInt64E(v) + if err1 != nil { + return time.Time{}, fmt.Errorf("unable to cast %#v of type %T to Time", i, i) + } + return time.Unix(s, 0), nil + case int: + return time.Unix(int64(v), 0), nil + case int64: + return time.Unix(v, 0), nil + case int32: + return time.Unix(int64(v), 0), nil + case uint: + return time.Unix(int64(v), 0), nil + case uint64: + return time.Unix(int64(v), 0), nil + case uint32: + return time.Unix(int64(v), 0), nil + default: + return time.Time{}, fmt.Errorf("unable to cast %#v of type %T to Time", i, i) + } +} + +// ToDurationE casts an interface to a time.Duration type. +func ToDurationE(i interface{}) (d time.Duration, err error) { + i = indirect(i) + + switch s := i.(type) { + case time.Duration: + return s, nil + case int, int64, int32, int16, int8, uint, uint64, uint32, uint16, uint8: + d = time.Duration(ToInt64(s)) + return + case float32, float64: + d = time.Duration(ToFloat64(s)) + return + case string: + if strings.ContainsAny(s, "nsuµmh") { + d, err = time.ParseDuration(s) + } else { + d, err = time.ParseDuration(s + "ns") + } + return + case float64EProvider: + var v float64 + v, err = s.Float64() + d = time.Duration(v) + return + case float64Provider: + d = time.Duration(s.Float64()) + return + default: + err = fmt.Errorf("unable to cast %#v of type %T to Duration", i, i) + return + } +} + +// ToBoolE casts an interface to a bool type. +func ToBoolE(i interface{}) (bool, error) { + i = indirect(i) + + switch b := i.(type) { + case bool: + return b, nil + case nil: + return false, nil + case int: + return b != 0, nil + case int64: + return b != 0, nil + case int32: + return b != 0, nil + case int16: + return b != 0, nil + case int8: + return b != 0, nil + case uint: + return b != 0, nil + case uint64: + return b != 0, nil + case uint32: + return b != 0, nil + case uint16: + return b != 0, nil + case uint8: + return b != 0, nil + case float64: + return b != 0, nil + case float32: + return b != 0, nil + case time.Duration: + return b != 0, nil + case string: + return strconv.ParseBool(i.(string)) + case json.Number: + v, err := ToInt64E(b) + if err == nil { + return v != 0, nil + } + return false, fmt.Errorf("unable to cast %#v of type %T to bool", i, i) + default: + return false, fmt.Errorf("unable to cast %#v of type %T to bool", i, i) + } +} + +// ToFloat64E casts an interface to a float64 type. +func ToFloat64E(i interface{}) (float64, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + return float64(intv), nil + } + + switch s := i.(type) { + case float64: + return s, nil + case float32: + return float64(s), nil + case int64: + return float64(s), nil + case int32: + return float64(s), nil + case int16: + return float64(s), nil + case int8: + return float64(s), nil + case uint: + return float64(s), nil + case uint64: + return float64(s), nil + case uint32: + return float64(s), nil + case uint16: + return float64(s), nil + case uint8: + return float64(s), nil + case string: + v, err := strconv.ParseFloat(s, 64) + if err == nil { + return v, nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i) + case float64EProvider: + v, err := s.Float64() + if err == nil { + return v, nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i) + case float64Provider: + return s.Float64(), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i) + } +} + +// ToFloat32E casts an interface to a float32 type. +func ToFloat32E(i interface{}) (float32, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + return float32(intv), nil + } + + switch s := i.(type) { + case float64: + return float32(s), nil + case float32: + return s, nil + case int64: + return float32(s), nil + case int32: + return float32(s), nil + case int16: + return float32(s), nil + case int8: + return float32(s), nil + case uint: + return float32(s), nil + case uint64: + return float32(s), nil + case uint32: + return float32(s), nil + case uint16: + return float32(s), nil + case uint8: + return float32(s), nil + case string: + v, err := strconv.ParseFloat(s, 32) + if err == nil { + return float32(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to float32", i, i) + case float64EProvider: + v, err := s.Float64() + if err == nil { + return float32(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to float32", i, i) + case float64Provider: + return float32(s.Float64()), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to float32", i, i) + } +} + +// ToInt64E casts an interface to an int64 type. +func ToInt64E(i interface{}) (int64, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + return int64(intv), nil + } + + switch s := i.(type) { + case int64: + return s, nil + case int32: + return int64(s), nil + case int16: + return int64(s), nil + case int8: + return int64(s), nil + case uint: + return int64(s), nil + case uint64: + return int64(s), nil + case uint32: + return int64(s), nil + case uint16: + return int64(s), nil + case uint8: + return int64(s), nil + case float64: + return int64(s), nil + case float32: + return int64(s), nil + case string: + v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) + if err == nil { + return v, nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int64", i, i) + case json.Number: + return ToInt64E(string(s)) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int64", i, i) + } +} + +// ToInt32E casts an interface to an int32 type. +func ToInt32E(i interface{}) (int32, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + return int32(intv), nil + } + + switch s := i.(type) { + case int64: + return int32(s), nil + case int32: + return s, nil + case int16: + return int32(s), nil + case int8: + return int32(s), nil + case uint: + return int32(s), nil + case uint64: + return int32(s), nil + case uint32: + return int32(s), nil + case uint16: + return int32(s), nil + case uint8: + return int32(s), nil + case float64: + return int32(s), nil + case float32: + return int32(s), nil + case string: + v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) + if err == nil { + return int32(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int32", i, i) + case json.Number: + return ToInt32E(string(s)) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int32", i, i) + } +} + +// ToInt16E casts an interface to an int16 type. +func ToInt16E(i interface{}) (int16, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + return int16(intv), nil + } + + switch s := i.(type) { + case int64: + return int16(s), nil + case int32: + return int16(s), nil + case int16: + return s, nil + case int8: + return int16(s), nil + case uint: + return int16(s), nil + case uint64: + return int16(s), nil + case uint32: + return int16(s), nil + case uint16: + return int16(s), nil + case uint8: + return int16(s), nil + case float64: + return int16(s), nil + case float32: + return int16(s), nil + case string: + v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) + if err == nil { + return int16(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int16", i, i) + case json.Number: + return ToInt16E(string(s)) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int16", i, i) + } +} + +// ToInt8E casts an interface to an int8 type. +func ToInt8E(i interface{}) (int8, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + return int8(intv), nil + } + + switch s := i.(type) { + case int64: + return int8(s), nil + case int32: + return int8(s), nil + case int16: + return int8(s), nil + case int8: + return s, nil + case uint: + return int8(s), nil + case uint64: + return int8(s), nil + case uint32: + return int8(s), nil + case uint16: + return int8(s), nil + case uint8: + return int8(s), nil + case float64: + return int8(s), nil + case float32: + return int8(s), nil + case string: + v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) + if err == nil { + return int8(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int8", i, i) + case json.Number: + return ToInt8E(string(s)) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int8", i, i) + } +} + +// ToIntE casts an interface to an int type. +func ToIntE(i interface{}) (int, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + return intv, nil + } + + switch s := i.(type) { + case int64: + return int(s), nil + case int32: + return int(s), nil + case int16: + return int(s), nil + case int8: + return int(s), nil + case uint: + return int(s), nil + case uint64: + return int(s), nil + case uint32: + return int(s), nil + case uint16: + return int(s), nil + case uint8: + return int(s), nil + case float64: + return int(s), nil + case float32: + return int(s), nil + case string: + v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) + if err == nil { + return int(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int64", i, i) + case json.Number: + return ToIntE(string(s)) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int", i, i) + } +} + +// ToUintE casts an interface to a uint type. +func ToUintE(i interface{}) (uint, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + if intv < 0 { + return 0, errNegativeNotAllowed + } + return uint(intv), nil + } + + switch s := i.(type) { + case string: + v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) + if err == nil { + if v < 0 { + return 0, errNegativeNotAllowed + } + return uint(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to uint", i, i) + case json.Number: + return ToUintE(string(s)) + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case uint: + return s, nil + case uint64: + return uint(s), nil + case uint32: + return uint(s), nil + case uint16: + return uint(s), nil + case uint8: + return uint(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint", i, i) + } +} + +// ToUint64E casts an interface to a uint64 type. +func ToUint64E(i interface{}) (uint64, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + if intv < 0 { + return 0, errNegativeNotAllowed + } + return uint64(intv), nil + } + + switch s := i.(type) { + case string: + v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) + if err == nil { + if v < 0 { + return 0, errNegativeNotAllowed + } + return uint64(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to uint64", i, i) + case json.Number: + return ToUint64E(string(s)) + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case uint: + return uint64(s), nil + case uint64: + return s, nil + case uint32: + return uint64(s), nil + case uint16: + return uint64(s), nil + case uint8: + return uint64(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint64", i, i) + } +} + +// ToUint32E casts an interface to a uint32 type. +func ToUint32E(i interface{}) (uint32, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + if intv < 0 { + return 0, errNegativeNotAllowed + } + return uint32(intv), nil + } + + switch s := i.(type) { + case string: + v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) + if err == nil { + if v < 0 { + return 0, errNegativeNotAllowed + } + return uint32(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to uint32", i, i) + case json.Number: + return ToUint32E(string(s)) + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case uint: + return uint32(s), nil + case uint64: + return uint32(s), nil + case uint32: + return s, nil + case uint16: + return uint32(s), nil + case uint8: + return uint32(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint32", i, i) + } +} + +// ToUint16E casts an interface to a uint16 type. +func ToUint16E(i interface{}) (uint16, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + if intv < 0 { + return 0, errNegativeNotAllowed + } + return uint16(intv), nil + } + + switch s := i.(type) { + case string: + v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) + if err == nil { + if v < 0 { + return 0, errNegativeNotAllowed + } + return uint16(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to uint16", i, i) + case json.Number: + return ToUint16E(string(s)) + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case uint: + return uint16(s), nil + case uint64: + return uint16(s), nil + case uint32: + return uint16(s), nil + case uint16: + return s, nil + case uint8: + return uint16(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint16", i, i) + } +} + +// ToUint8E casts an interface to a uint type. +func ToUint8E(i interface{}) (uint8, error) { + i = indirect(i) + + intv, ok := toInt(i) + if ok { + if intv < 0 { + return 0, errNegativeNotAllowed + } + return uint8(intv), nil + } + + switch s := i.(type) { + case string: + v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) + if err == nil { + if v < 0 { + return 0, errNegativeNotAllowed + } + return uint8(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to uint8", i, i) + case json.Number: + return ToUint8E(string(s)) + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case uint: + return uint8(s), nil + case uint64: + return uint8(s), nil + case uint32: + return uint8(s), nil + case uint16: + return uint8(s), nil + case uint8: + return s, nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint8", i, i) + } +} + +// From html/template/content.go +// Copyright 2011 The Go Authors. All rights reserved. +// indirect returns the value, after dereferencing as many times +// as necessary to reach the base type (or nil). +func indirect(a interface{}) interface{} { + if a == nil { + return nil + } + if t := reflect.TypeOf(a); t.Kind() != reflect.Ptr { + // Avoid creating a reflect.Value if it's not a pointer. + return a + } + v := reflect.ValueOf(a) + for v.Kind() == reflect.Ptr && !v.IsNil() { + v = v.Elem() + } + return v.Interface() +} + +// From html/template/content.go +// Copyright 2011 The Go Authors. All rights reserved. +// indirectToStringerOrError returns the value, after dereferencing as many times +// as necessary to reach the base type (or nil) or an implementation of fmt.Stringer +// or error, +func indirectToStringerOrError(a interface{}) interface{} { + if a == nil { + return nil + } + + errorType := reflect.TypeOf((*error)(nil)).Elem() + fmtStringerType := reflect.TypeOf((*fmt.Stringer)(nil)).Elem() + + v := reflect.ValueOf(a) + for !v.Type().Implements(fmtStringerType) && !v.Type().Implements(errorType) && v.Kind() == reflect.Ptr && !v.IsNil() { + v = v.Elem() + } + return v.Interface() +} + +// ToStringE casts an interface to a string type. +func ToStringE(i interface{}) (string, error) { + i = indirectToStringerOrError(i) + + switch s := i.(type) { + case string: + return s, nil + case bool: + return strconv.FormatBool(s), nil + case float64: + return strconv.FormatFloat(s, 'f', -1, 64), nil + case float32: + return strconv.FormatFloat(float64(s), 'f', -1, 32), nil + case int: + return strconv.Itoa(s), nil + case int64: + return strconv.FormatInt(s, 10), nil + case int32: + return strconv.Itoa(int(s)), nil + case int16: + return strconv.FormatInt(int64(s), 10), nil + case int8: + return strconv.FormatInt(int64(s), 10), nil + case uint: + return strconv.FormatUint(uint64(s), 10), nil + case uint64: + return strconv.FormatUint(uint64(s), 10), nil + case uint32: + return strconv.FormatUint(uint64(s), 10), nil + case uint16: + return strconv.FormatUint(uint64(s), 10), nil + case uint8: + return strconv.FormatUint(uint64(s), 10), nil + case json.Number: + return s.String(), nil + case []byte: + return string(s), nil + case template.HTML: + return string(s), nil + case template.URL: + return string(s), nil + case template.JS: + return string(s), nil + case template.CSS: + return string(s), nil + case template.HTMLAttr: + return string(s), nil + case nil: + return "", nil + case fmt.Stringer: + return s.String(), nil + case error: + return s.Error(), nil + default: + return "", fmt.Errorf("unable to cast %#v of type %T to string", i, i) + } +} + +// ToStringMapStringE casts an interface to a map[string]string type. +func ToStringMapStringE(i interface{}) (map[string]string, error) { + m := map[string]string{} + + switch v := i.(type) { + case map[string]string: + return v, nil + case map[string]interface{}: + for k, val := range v { + m[ToString(k)] = ToString(val) + } + return m, nil + case map[interface{}]string: + for k, val := range v { + m[ToString(k)] = ToString(val) + } + return m, nil + case map[interface{}]interface{}: + for k, val := range v { + m[ToString(k)] = ToString(val) + } + return m, nil + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]string", i, i) + } +} + +// ToStringMapStringSliceE casts an interface to a map[string][]string type. +func ToStringMapStringSliceE(i interface{}) (map[string][]string, error) { + m := map[string][]string{} + + switch v := i.(type) { + case map[string][]string: + return v, nil + case map[string][]interface{}: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[string]string: + for k, val := range v { + m[ToString(k)] = []string{val} + } + case map[string]interface{}: + for k, val := range v { + switch vt := val.(type) { + case []interface{}: + m[ToString(k)] = ToStringSlice(vt) + case []string: + m[ToString(k)] = vt + default: + m[ToString(k)] = []string{ToString(val)} + } + } + return m, nil + case map[interface{}][]string: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[interface{}]string: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[interface{}][]interface{}: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[interface{}]interface{}: + for k, val := range v { + key, err := ToStringE(k) + if err != nil { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i) + } + value, err := ToStringSliceE(val) + if err != nil { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i) + } + m[key] = value + } + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i) + } + return m, nil +} + +// ToStringMapBoolE casts an interface to a map[string]bool type. +func ToStringMapBoolE(i interface{}) (map[string]bool, error) { + m := map[string]bool{} + + switch v := i.(type) { + case map[interface{}]interface{}: + for k, val := range v { + m[ToString(k)] = ToBool(val) + } + return m, nil + case map[string]interface{}: + for k, val := range v { + m[ToString(k)] = ToBool(val) + } + return m, nil + case map[string]bool: + return v, nil + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]bool", i, i) + } +} + +// ToStringMapE casts an interface to a map[string]interface{} type. +func ToStringMapE(i interface{}) (map[string]interface{}, error) { + m := map[string]interface{}{} + + switch v := i.(type) { + case map[interface{}]interface{}: + for k, val := range v { + m[ToString(k)] = val + } + return m, nil + case map[string]interface{}: + return v, nil + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]interface{}", i, i) + } +} + +// ToStringMapIntE casts an interface to a map[string]int{} type. +func ToStringMapIntE(i interface{}) (map[string]int, error) { + m := map[string]int{} + if i == nil { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]int", i, i) + } + + switch v := i.(type) { + case map[interface{}]interface{}: + for k, val := range v { + m[ToString(k)] = ToInt(val) + } + return m, nil + case map[string]interface{}: + for k, val := range v { + m[k] = ToInt(val) + } + return m, nil + case map[string]int: + return v, nil + case string: + err := jsonStringToObject(v, &m) + return m, err + } + + if reflect.TypeOf(i).Kind() != reflect.Map { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]int", i, i) + } + + mVal := reflect.ValueOf(m) + v := reflect.ValueOf(i) + for _, keyVal := range v.MapKeys() { + val, err := ToIntE(v.MapIndex(keyVal).Interface()) + if err != nil { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]int", i, i) + } + mVal.SetMapIndex(keyVal, reflect.ValueOf(val)) + } + return m, nil +} + +// ToStringMapInt64E casts an interface to a map[string]int64{} type. +func ToStringMapInt64E(i interface{}) (map[string]int64, error) { + m := map[string]int64{} + if i == nil { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]int64", i, i) + } + + switch v := i.(type) { + case map[interface{}]interface{}: + for k, val := range v { + m[ToString(k)] = ToInt64(val) + } + return m, nil + case map[string]interface{}: + for k, val := range v { + m[k] = ToInt64(val) + } + return m, nil + case map[string]int64: + return v, nil + case string: + err := jsonStringToObject(v, &m) + return m, err + } + + if reflect.TypeOf(i).Kind() != reflect.Map { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]int64", i, i) + } + mVal := reflect.ValueOf(m) + v := reflect.ValueOf(i) + for _, keyVal := range v.MapKeys() { + val, err := ToInt64E(v.MapIndex(keyVal).Interface()) + if err != nil { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]int64", i, i) + } + mVal.SetMapIndex(keyVal, reflect.ValueOf(val)) + } + return m, nil +} + +// ToSliceE casts an interface to a []interface{} type. +func ToSliceE(i interface{}) ([]interface{}, error) { + var s []interface{} + + switch v := i.(type) { + case []interface{}: + return append(s, v...), nil + case []map[string]interface{}: + for _, u := range v { + s = append(s, u) + } + return s, nil + default: + return s, fmt.Errorf("unable to cast %#v of type %T to []interface{}", i, i) + } +} + +// ToBoolSliceE casts an interface to a []bool type. +func ToBoolSliceE(i interface{}) ([]bool, error) { + if i == nil { + return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i) + } + + switch v := i.(type) { + case []bool: + return v, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + s := reflect.ValueOf(i) + a := make([]bool, s.Len()) + for j := 0; j < s.Len(); j++ { + val, err := ToBoolE(s.Index(j).Interface()) + if err != nil { + return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i) + } + a[j] = val + } + return a, nil + default: + return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i) + } +} + +// ToStringSliceE casts an interface to a []string type. +func ToStringSliceE(i interface{}) ([]string, error) { + var a []string + + switch v := i.(type) { + case []interface{}: + for _, u := range v { + a = append(a, ToString(u)) + } + return a, nil + case []string: + return v, nil + case []int8: + for _, u := range v { + a = append(a, ToString(u)) + } + return a, nil + case []int: + for _, u := range v { + a = append(a, ToString(u)) + } + return a, nil + case []int32: + for _, u := range v { + a = append(a, ToString(u)) + } + return a, nil + case []int64: + for _, u := range v { + a = append(a, ToString(u)) + } + return a, nil + case []float32: + for _, u := range v { + a = append(a, ToString(u)) + } + return a, nil + case []float64: + for _, u := range v { + a = append(a, ToString(u)) + } + return a, nil + case string: + return strings.Fields(v), nil + case []error: + for _, err := range i.([]error) { + a = append(a, err.Error()) + } + return a, nil + case interface{}: + str, err := ToStringE(v) + if err != nil { + return a, fmt.Errorf("unable to cast %#v of type %T to []string", i, i) + } + return []string{str}, nil + default: + return a, fmt.Errorf("unable to cast %#v of type %T to []string", i, i) + } +} + +// ToIntSliceE casts an interface to a []int type. +func ToIntSliceE(i interface{}) ([]int, error) { + if i == nil { + return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i) + } + + switch v := i.(type) { + case []int: + return v, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + s := reflect.ValueOf(i) + a := make([]int, s.Len()) + for j := 0; j < s.Len(); j++ { + val, err := ToIntE(s.Index(j).Interface()) + if err != nil { + return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i) + } + a[j] = val + } + return a, nil + default: + return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i) + } +} + +// ToDurationSliceE casts an interface to a []time.Duration type. +func ToDurationSliceE(i interface{}) ([]time.Duration, error) { + if i == nil { + return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i) + } + + switch v := i.(type) { + case []time.Duration: + return v, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + s := reflect.ValueOf(i) + a := make([]time.Duration, s.Len()) + for j := 0; j < s.Len(); j++ { + val, err := ToDurationE(s.Index(j).Interface()) + if err != nil { + return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i) + } + a[j] = val + } + return a, nil + default: + return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i) + } +} + +// StringToDate attempts to parse a string into a time.Time type using a +// predefined list of formats. If no suitable format is found, an error is +// returned. +func StringToDate(s string) (time.Time, error) { + return parseDateWith(s, time.UTC, timeFormats) +} + +// StringToDateInDefaultLocation casts an empty interface to a time.Time, +// interpreting inputs without a timezone to be in the given location, +// or the local timezone if nil. +func StringToDateInDefaultLocation(s string, location *time.Location) (time.Time, error) { + return parseDateWith(s, location, timeFormats) +} + +type timeFormatType int + +const ( + timeFormatNoTimezone timeFormatType = iota + timeFormatNamedTimezone + timeFormatNumericTimezone + timeFormatNumericAndNamedTimezone + timeFormatTimeOnly +) + +type timeFormat struct { + format string + typ timeFormatType +} + +func (f timeFormat) hasTimezone() bool { + // We don't include the formats with only named timezones, see + // https://github.com/golang/go/issues/19694#issuecomment-289103522 + return f.typ >= timeFormatNumericTimezone && f.typ <= timeFormatNumericAndNamedTimezone +} + +var timeFormats = []timeFormat{ + // Keep common formats at the top. + {"2006-01-02", timeFormatNoTimezone}, + {time.RFC3339, timeFormatNumericTimezone}, + {"2006-01-02T15:04:05", timeFormatNoTimezone}, // iso8601 without timezone + {time.RFC1123Z, timeFormatNumericTimezone}, + {time.RFC1123, timeFormatNamedTimezone}, + {time.RFC822Z, timeFormatNumericTimezone}, + {time.RFC822, timeFormatNamedTimezone}, + {time.RFC850, timeFormatNamedTimezone}, + {"2006-01-02 15:04:05.999999999 -0700 MST", timeFormatNumericAndNamedTimezone}, // Time.String() + {"2006-01-02T15:04:05-0700", timeFormatNumericTimezone}, // RFC3339 without timezone hh:mm colon + {"2006-01-02 15:04:05Z0700", timeFormatNumericTimezone}, // RFC3339 without T or timezone hh:mm colon + {"2006-01-02 15:04:05", timeFormatNoTimezone}, + {time.ANSIC, timeFormatNoTimezone}, + {time.UnixDate, timeFormatNamedTimezone}, + {time.RubyDate, timeFormatNumericTimezone}, + {"2006-01-02 15:04:05Z07:00", timeFormatNumericTimezone}, + {"02 Jan 2006", timeFormatNoTimezone}, + {"2006-01-02 15:04:05 -07:00", timeFormatNumericTimezone}, + {"2006-01-02 15:04:05 -0700", timeFormatNumericTimezone}, + {time.Kitchen, timeFormatTimeOnly}, + {time.Stamp, timeFormatTimeOnly}, + {time.StampMilli, timeFormatTimeOnly}, + {time.StampMicro, timeFormatTimeOnly}, + {time.StampNano, timeFormatTimeOnly}, +} + +func parseDateWith(s string, location *time.Location, formats []timeFormat) (d time.Time, e error) { + for _, format := range formats { + if d, e = time.Parse(format.format, s); e == nil { + + // Some time formats have a zone name, but no offset, so it gets + // put in that zone name (not the default one passed in to us), but + // without that zone's offset. So set the location manually. + if format.typ <= timeFormatNamedTimezone { + if location == nil { + location = time.Local + } + year, month, day := d.Date() + hour, min, sec := d.Clock() + d = time.Date(year, month, day, hour, min, sec, d.Nanosecond(), location) + } + + return + } + } + return d, fmt.Errorf("unable to parse date: %s", s) +} + +// jsonStringToObject attempts to unmarshall a string as JSON into +// the object passed as pointer. +func jsonStringToObject(s string, v interface{}) error { + data := []byte(s) + return json.Unmarshal(data, v) +} + +// toInt returns the int value of v if v or v's underlying type +// is an int. +// Note that this will return false for int64 etc. types. +func toInt(v interface{}) (int, bool) { + switch v := v.(type) { + case int: + return v, true + case time.Weekday: + return int(v), true + case time.Month: + return int(v), true + default: + return 0, false + } +} + +func trimZeroDecimal(s string) string { + var foundZero bool + for i := len(s); i > 0; i-- { + switch s[i-1] { + case '.': + if foundZero { + return s[:i-1] + } + case '0': + foundZero = true + default: + return s + } + } + return s +} diff --git a/vendor/github.com/spf13/cast/timeformattype_string.go b/vendor/github.com/spf13/cast/timeformattype_string.go new file mode 100644 index 0000000000..1524fc82ce --- /dev/null +++ b/vendor/github.com/spf13/cast/timeformattype_string.go @@ -0,0 +1,27 @@ +// Code generated by "stringer -type timeFormatType"; DO NOT EDIT. + +package cast + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[timeFormatNoTimezone-0] + _ = x[timeFormatNamedTimezone-1] + _ = x[timeFormatNumericTimezone-2] + _ = x[timeFormatNumericAndNamedTimezone-3] + _ = x[timeFormatTimeOnly-4] +} + +const _timeFormatType_name = "timeFormatNoTimezonetimeFormatNamedTimezonetimeFormatNumericTimezonetimeFormatNumericAndNamedTimezonetimeFormatTimeOnly" + +var _timeFormatType_index = [...]uint8{0, 20, 43, 68, 101, 119} + +func (i timeFormatType) String() string { + if i < 0 || i >= timeFormatType(len(_timeFormatType_index)-1) { + return "timeFormatType(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _timeFormatType_name[_timeFormatType_index[i]:_timeFormatType_index[i+1]] +} diff --git a/vendor/github.com/spf13/viper/.editorconfig b/vendor/github.com/spf13/viper/.editorconfig new file mode 100644 index 0000000000..1f664d13a5 --- /dev/null +++ b/vendor/github.com/spf13/viper/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.go] +indent_style = tab + +[{Makefile,*.mk}] +indent_style = tab + +[*.nix] +indent_size = 2 diff --git a/vendor/github.com/spf13/viper/.envrc b/vendor/github.com/spf13/viper/.envrc new file mode 100644 index 0000000000..3ce7171a3c --- /dev/null +++ b/vendor/github.com/spf13/viper/.envrc @@ -0,0 +1,4 @@ +if ! has nix_direnv_version || ! nix_direnv_version 2.3.0; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.3.0/direnvrc" "sha256-Dmd+j63L84wuzgyjITIfSxSD57Tx7v51DMxVZOsiUD8=" +fi +use flake . --impure diff --git a/vendor/github.com/spf13/viper/.gitignore b/vendor/github.com/spf13/viper/.gitignore new file mode 100644 index 0000000000..f1bbd42803 --- /dev/null +++ b/vendor/github.com/spf13/viper/.gitignore @@ -0,0 +1,8 @@ +/.devenv/ +/.direnv/ +/.idea/ +/.pre-commit-config.yaml +/bin/ +/build/ +/var/ +/vendor/ diff --git a/vendor/github.com/spf13/viper/.golangci.yaml b/vendor/github.com/spf13/viper/.golangci.yaml new file mode 100644 index 0000000000..1faeae42c7 --- /dev/null +++ b/vendor/github.com/spf13/viper/.golangci.yaml @@ -0,0 +1,108 @@ +run: + timeout: 5m + +linters-settings: + gci: + sections: + - standard + - default + - prefix(github.com/spf13/viper) + gocritic: + # Enable multiple checks by tags. See "Tags" section in https://github.com/go-critic/go-critic#usage. + enabled-tags: + - diagnostic + - experimental + - opinionated + - style + disabled-checks: + - importShadow + - unnamedResult + golint: + min-confidence: 0 + goimports: + local-prefixes: github.com/spf13/viper + +linters: + disable-all: true + enable: + - bodyclose + - dogsled + - dupl + - durationcheck + - exhaustive + - exportloopref + - gci + - gocritic + - godot + - gofmt + - gofumpt + - goimports + - gomoddirectives + - goprintffuncname + - govet + - importas + - ineffassign + - makezero + - misspell + - nakedret + - nilerr + - noctx + - nolintlint + - prealloc + - predeclared + - revive + - rowserrcheck + - sqlclosecheck + - staticcheck + - stylecheck + - tparallel + - typecheck + - unconvert + - unparam + - unused + - wastedassign + - whitespace + + # fixme + # - cyclop + # - errcheck + # - errorlint + # - exhaustivestruct + # - forbidigo + # - forcetypeassert + # - gochecknoglobals + # - gochecknoinits + # - gocognit + # - goconst + # - gocyclo + # - gosec + # - gosimple + # - ifshort + # - lll + # - nlreturn + # - paralleltest + # - scopelint + # - thelper + # - wrapcheck + + # unused + # - depguard + # - goheader + # - gomodguard + + # deprecated + # - deadcode + # - structcheck + # - varcheck + + # don't enable: + # - asciicheck + # - funlen + # - godox + # - goerr113 + # - gomnd + # - interfacer + # - maligned + # - nestif + # - testpackage + # - wsl diff --git a/vendor/github.com/spf13/viper/.yamlignore b/vendor/github.com/spf13/viper/.yamlignore new file mode 100644 index 0000000000..c04c4dead1 --- /dev/null +++ b/vendor/github.com/spf13/viper/.yamlignore @@ -0,0 +1,2 @@ +# TODO: FIXME +/.github/ diff --git a/vendor/github.com/spf13/viper/.yamllint.yaml b/vendor/github.com/spf13/viper/.yamllint.yaml new file mode 100644 index 0000000000..bac19ce18b --- /dev/null +++ b/vendor/github.com/spf13/viper/.yamllint.yaml @@ -0,0 +1,6 @@ +ignore-from-file: [.gitignore, .yamlignore] + +extends: default + +rules: + line-length: disable diff --git a/vendor/github.com/spf13/viper/LICENSE b/vendor/github.com/spf13/viper/LICENSE new file mode 100644 index 0000000000..4527efb9c0 --- /dev/null +++ b/vendor/github.com/spf13/viper/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Steve Francia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/spf13/viper/Makefile b/vendor/github.com/spf13/viper/Makefile new file mode 100644 index 0000000000..a77b9c81c1 --- /dev/null +++ b/vendor/github.com/spf13/viper/Makefile @@ -0,0 +1,87 @@ +# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html + +OS = $(shell uname | tr A-Z a-z) +export PATH := $(abspath bin/):${PATH} + +# Build variables +BUILD_DIR ?= build +export CGO_ENABLED ?= 0 +export GOOS = $(shell go env GOOS) +ifeq (${VERBOSE}, 1) +ifeq ($(filter -v,${GOARGS}),) + GOARGS += -v +endif +TEST_FORMAT = short-verbose +endif + +# Dependency versions +GOTESTSUM_VERSION = 1.9.0 +GOLANGCI_VERSION = 1.53.3 + +# Add the ability to override some variables +# Use with care +-include override.mk + +.PHONY: clear +clear: ## Clear the working area and the project + rm -rf bin/ + +.PHONY: check +check: test lint ## Run tests and linters + + +TEST_PKGS ?= ./... +.PHONY: test +test: TEST_FORMAT ?= short +test: SHELL = /bin/bash +test: export CGO_ENABLED=1 +test: bin/gotestsum ## Run tests + @mkdir -p ${BUILD_DIR} + bin/gotestsum --no-summary=skipped --junitfile ${BUILD_DIR}/coverage.xml --format ${TEST_FORMAT} -- -race -coverprofile=${BUILD_DIR}/coverage.txt -covermode=atomic $(filter-out -v,${GOARGS}) $(if ${TEST_PKGS},${TEST_PKGS},./...) + +.PHONY: lint +lint: lint-go lint-yaml +lint: ## Run linters + +.PHONY: lint-go +lint-go: + golangci-lint run $(if ${CI},--out-format github-actions,) + +.PHONY: lint-yaml +lint-yaml: + yamllint $(if ${CI},-f github,) --no-warnings . + +.PHONY: fmt +fmt: ## Format code + golangci-lint run --fix + +deps: bin/golangci-lint bin/gotestsum yamllint +deps: ## Install dependencies + +bin/gotestsum: + @mkdir -p bin + curl -L https://github.com/gotestyourself/gotestsum/releases/download/v${GOTESTSUM_VERSION}/gotestsum_${GOTESTSUM_VERSION}_${OS}_amd64.tar.gz | tar -zOxf - gotestsum > ./bin/gotestsum && chmod +x ./bin/gotestsum + +bin/golangci-lint: + @mkdir -p bin + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | bash -s -- v${GOLANGCI_VERSION} + +.PHONY: yamllint +yamllint: + pip3 install --user yamllint + +# Add custom targets here +-include custom.mk + +.PHONY: list +list: ## List all make targets + @${MAKE} -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | sort + +.PHONY: help +.DEFAULT_GOAL := help +help: + @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +# Variable outputting/exporting rules +var-%: ; @echo $($*) +varexport-%: ; @echo $*=$($*) diff --git a/vendor/github.com/spf13/viper/README.md b/vendor/github.com/spf13/viper/README.md new file mode 100644 index 0000000000..3fc7d84f16 --- /dev/null +++ b/vendor/github.com/spf13/viper/README.md @@ -0,0 +1,928 @@ +> ## Viper v2 feedback +> Viper is heading towards v2 and we would love to hear what _**you**_ would like to see in it. Share your thoughts here: https://forms.gle/R6faU74qPRPAzchZ9 +> +> **Thank you!** + +![Viper](.github/logo.png?raw=true) + +[![Mentioned in Awesome Go](https://awesome.re/mentioned-badge-flat.svg)](https://github.com/avelino/awesome-go#configuration) +[![run on repl.it](https://repl.it/badge/github/sagikazarmark/Viper-example)](https://repl.it/@sagikazarmark/Viper-example#main.go) + +[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/spf13/viper/ci.yaml?branch=master&style=flat-square)](https://github.com/spf13/viper/actions?query=workflow%3ACI) +[![Join the chat at https://gitter.im/spf13/viper](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/spf13/viper?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Go Report Card](https://goreportcard.com/badge/github.com/spf13/viper?style=flat-square)](https://goreportcard.com/report/github.com/spf13/viper) +![Go Version](https://img.shields.io/badge/go%20version-%3E=1.20-61CFDD.svg?style=flat-square) +[![PkgGoDev](https://pkg.go.dev/badge/mod/github.com/spf13/viper)](https://pkg.go.dev/mod/github.com/spf13/viper) + +**Go configuration with fangs!** + +Many Go projects are built using Viper including: + +* [Hugo](http://gohugo.io) +* [EMC RexRay](http://rexray.readthedocs.org/en/stable/) +* [Imgur’s Incus](https://github.com/Imgur/incus) +* [Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack) +* [Docker Notary](https://github.com/docker/Notary) +* [BloomApi](https://www.bloomapi.com/) +* [doctl](https://github.com/digitalocean/doctl) +* [Clairctl](https://github.com/jgsqware/clairctl) +* [Mercure](https://mercure.rocks) +* [Meshery](https://github.com/meshery/meshery) +* [Bearer](https://github.com/bearer/bearer) +* [Coder](https://github.com/coder/coder) +* [Vitess](https://vitess.io/) + + +## Install + +```shell +go get github.com/spf13/viper +``` + +**Note:** Viper uses [Go Modules](https://go.dev/wiki/Modules) to manage dependencies. + + +## What is Viper? + +Viper is a complete configuration solution for Go applications including [12-Factor apps](https://12factor.net/#the_twelve_factors). +It is designed to work within an application, and can handle all types of configuration needs +and formats. It supports: + +* setting defaults +* reading from JSON, TOML, YAML, HCL, envfile and Java properties config files +* live watching and re-reading of config files (optional) +* reading from environment variables +* reading from remote config systems (etcd or Consul), and watching changes +* reading from command line flags +* reading from buffer +* setting explicit values + +Viper can be thought of as a registry for all of your applications configuration needs. + + +## Why Viper? + +When building a modern application, you don’t want to worry about +configuration file formats; you want to focus on building awesome software. +Viper is here to help with that. + +Viper does the following for you: + +1. Find, load, and unmarshal a configuration file in JSON, TOML, YAML, HCL, INI, envfile or Java properties formats. +2. Provide a mechanism to set default values for your different configuration options. +3. Provide a mechanism to set override values for options specified through command line flags. +4. Provide an alias system to easily rename parameters without breaking existing code. +5. Make it easy to tell the difference between when a user has provided a command line or config file which is the same as the default. + +Viper uses the following precedence order. Each item takes precedence over the item below it: + + * explicit call to `Set` + * flag + * env + * config + * key/value store + * default + +**Important:** Viper configuration keys are case insensitive. +There are ongoing discussions about making that optional. + + +## Putting Values into Viper + +### Establishing Defaults + +A good configuration system will support default values. A default value is not +required for a key, but it’s useful in the event that a key hasn't been set via +config file, environment variable, remote configuration or flag. + +Examples: + +```go +viper.SetDefault("ContentDir", "content") +viper.SetDefault("LayoutDir", "layouts") +viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"}) +``` + +### Reading Config Files + +Viper requires minimal configuration so it knows where to look for config files. +Viper supports JSON, TOML, YAML, HCL, INI, envfile and Java Properties files. Viper can search multiple paths, but +currently a single Viper instance only supports a single configuration file. +Viper does not default to any configuration search paths leaving defaults decision +to an application. + +Here is an example of how to use Viper to search for and read a configuration file. +None of the specific paths are required, but at least one path should be provided +where a configuration file is expected. + +```go +viper.SetConfigName("config") // name of config file (without extension) +viper.SetConfigType("yaml") // REQUIRED if the config file does not have the extension in the name +viper.AddConfigPath("/etc/appname/") // path to look for the config file in +viper.AddConfigPath("$HOME/.appname") // call multiple times to add many search paths +viper.AddConfigPath(".") // optionally look for config in the working directory +err := viper.ReadInConfig() // Find and read the config file +if err != nil { // Handle errors reading the config file + panic(fmt.Errorf("fatal error config file: %w", err)) +} +``` + +You can handle the specific case where no config file is found like this: + +```go +if err := viper.ReadInConfig(); err != nil { + if _, ok := err.(viper.ConfigFileNotFoundError); ok { + // Config file not found; ignore error if desired + } else { + // Config file was found but another error was produced + } +} + +// Config file found and successfully parsed +``` + +*NOTE [since 1.6]:* You can also have a file without an extension and specify the format programmatically. For those configuration files that lie in the home of the user without any extension like `.bashrc` + +### Writing Config Files + +Reading from config files is useful, but at times you want to store all modifications made at run time. +For that, a bunch of commands are available, each with its own purpose: + +* WriteConfig - writes the current viper configuration to the predefined path, if exists. Errors if no predefined path. Will overwrite the current config file, if it exists. +* SafeWriteConfig - writes the current viper configuration to the predefined path. Errors if no predefined path. Will not overwrite the current config file, if it exists. +* WriteConfigAs - writes the current viper configuration to the given filepath. Will overwrite the given file, if it exists. +* SafeWriteConfigAs - writes the current viper configuration to the given filepath. Will not overwrite the given file, if it exists. + +As a rule of the thumb, everything marked with safe won't overwrite any file, but just create if not existent, whilst the default behavior is to create or truncate. + +A small examples section: + +```go +viper.WriteConfig() // writes current config to predefined path set by 'viper.AddConfigPath()' and 'viper.SetConfigName' +viper.SafeWriteConfig() +viper.WriteConfigAs("/path/to/my/.config") +viper.SafeWriteConfigAs("/path/to/my/.config") // will error since it has already been written +viper.SafeWriteConfigAs("/path/to/my/.other_config") +``` + +### Watching and re-reading config files + +Viper supports the ability to have your application live read a config file while running. + +Gone are the days of needing to restart a server to have a config take effect, +viper powered applications can read an update to a config file while running and +not miss a beat. + +Simply tell the viper instance to watchConfig. +Optionally you can provide a function for Viper to run each time a change occurs. + +**Make sure you add all of the configPaths prior to calling `WatchConfig()`** + +```go +viper.OnConfigChange(func(e fsnotify.Event) { + fmt.Println("Config file changed:", e.Name) +}) +viper.WatchConfig() +``` + +### Reading Config from io.Reader + +Viper predefines many configuration sources such as files, environment +variables, flags, and remote K/V store, but you are not bound to them. You can +also implement your own required configuration source and feed it to viper. + +```go +viper.SetConfigType("yaml") // or viper.SetConfigType("YAML") + +// any approach to require this configuration into your program. +var yamlExample = []byte(` +Hacker: true +name: steve +hobbies: +- skateboarding +- snowboarding +- go +clothing: + jacket: leather + trousers: denim +age: 35 +eyes : brown +beard: true +`) + +viper.ReadConfig(bytes.NewBuffer(yamlExample)) + +viper.Get("name") // this would be "steve" +``` + +### Setting Overrides + +These could be from a command line flag, or from your own application logic. + +```go +viper.Set("Verbose", true) +viper.Set("LogFile", LogFile) +viper.Set("host.port", 5899) // set subset +``` + +### Registering and Using Aliases + +Aliases permit a single value to be referenced by multiple keys + +```go +viper.RegisterAlias("loud", "Verbose") + +viper.Set("verbose", true) // same result as next line +viper.Set("loud", true) // same result as prior line + +viper.GetBool("loud") // true +viper.GetBool("verbose") // true +``` + +### Working with Environment Variables + +Viper has full support for environment variables. This enables 12 factor +applications out of the box. There are five methods that exist to aid working +with ENV: + + * `AutomaticEnv()` + * `BindEnv(string...) : error` + * `SetEnvPrefix(string)` + * `SetEnvKeyReplacer(string...) *strings.Replacer` + * `AllowEmptyEnv(bool)` + +_When working with ENV variables, it’s important to recognize that Viper +treats ENV variables as case sensitive._ + +Viper provides a mechanism to try to ensure that ENV variables are unique. By +using `SetEnvPrefix`, you can tell Viper to use a prefix while reading from +the environment variables. Both `BindEnv` and `AutomaticEnv` will use this +prefix. + +`BindEnv` takes one or more parameters. The first parameter is the key name, the +rest are the name of the environment variables to bind to this key. If more than +one are provided, they will take precedence in the specified order. The name of +the environment variable is case sensitive. If the ENV variable name is not provided, then +Viper will automatically assume that the ENV variable matches the following format: prefix + "_" + the key name in ALL CAPS. When you explicitly provide the ENV variable name (the second parameter), +it **does not** automatically add the prefix. For example if the second parameter is "id", +Viper will look for the ENV variable "ID". + +One important thing to recognize when working with ENV variables is that the +value will be read each time it is accessed. Viper does not fix the value when +the `BindEnv` is called. + +`AutomaticEnv` is a powerful helper especially when combined with +`SetEnvPrefix`. When called, Viper will check for an environment variable any +time a `viper.Get` request is made. It will apply the following rules. It will +check for an environment variable with a name matching the key uppercased and +prefixed with the `EnvPrefix` if set. + +`SetEnvKeyReplacer` allows you to use a `strings.Replacer` object to rewrite Env +keys to an extent. This is useful if you want to use `-` or something in your +`Get()` calls, but want your environmental variables to use `_` delimiters. An +example of using it can be found in `viper_test.go`. + +Alternatively, you can use `EnvKeyReplacer` with `NewWithOptions` factory function. +Unlike `SetEnvKeyReplacer`, it accepts a `StringReplacer` interface allowing you to write custom string replacing logic. + +By default empty environment variables are considered unset and will fall back to +the next configuration source. To treat empty environment variables as set, use +the `AllowEmptyEnv` method. + +#### Env example + +```go +SetEnvPrefix("spf") // will be uppercased automatically +BindEnv("id") + +os.Setenv("SPF_ID", "13") // typically done outside of the app + +id := Get("id") // 13 +``` + +### Working with Flags + +Viper has the ability to bind to flags. Specifically, Viper supports `Pflags` +as used in the [Cobra](https://github.com/spf13/cobra) library. + +Like `BindEnv`, the value is not set when the binding method is called, but when +it is accessed. This means you can bind as early as you want, even in an +`init()` function. + +For individual flags, the `BindPFlag()` method provides this functionality. + +Example: + +```go +serverCmd.Flags().Int("port", 1138, "Port to run Application server on") +viper.BindPFlag("port", serverCmd.Flags().Lookup("port")) +``` + +You can also bind an existing set of pflags (pflag.FlagSet): + +Example: + +```go +pflag.Int("flagname", 1234, "help message for flagname") + +pflag.Parse() +viper.BindPFlags(pflag.CommandLine) + +i := viper.GetInt("flagname") // retrieve values from viper instead of pflag +``` + +The use of [pflag](https://github.com/spf13/pflag/) in Viper does not preclude +the use of other packages that use the [flag](https://golang.org/pkg/flag/) +package from the standard library. The pflag package can handle the flags +defined for the flag package by importing these flags. This is accomplished +by a calling a convenience function provided by the pflag package called +AddGoFlagSet(). + +Example: + +```go +package main + +import ( + "flag" + "github.com/spf13/pflag" +) + +func main() { + + // using standard library "flag" package + flag.Int("flagname", 1234, "help message for flagname") + + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + pflag.Parse() + viper.BindPFlags(pflag.CommandLine) + + i := viper.GetInt("flagname") // retrieve value from viper + + // ... +} +``` + +#### Flag interfaces + +Viper provides two Go interfaces to bind other flag systems if you don’t use `Pflags`. + +`FlagValue` represents a single flag. This is a very simple example on how to implement this interface: + +```go +type myFlag struct {} +func (f myFlag) HasChanged() bool { return false } +func (f myFlag) Name() string { return "my-flag-name" } +func (f myFlag) ValueString() string { return "my-flag-value" } +func (f myFlag) ValueType() string { return "string" } +``` + +Once your flag implements this interface, you can simply tell Viper to bind it: + +```go +viper.BindFlagValue("my-flag-name", myFlag{}) +``` + +`FlagValueSet` represents a group of flags. This is a very simple example on how to implement this interface: + +```go +type myFlagSet struct { + flags []myFlag +} + +func (f myFlagSet) VisitAll(fn func(FlagValue)) { + for _, flag := range flags { + fn(flag) + } +} +``` + +Once your flag set implements this interface, you can simply tell Viper to bind it: + +```go +fSet := myFlagSet{ + flags: []myFlag{myFlag{}, myFlag{}}, +} +viper.BindFlagValues("my-flags", fSet) +``` + +### Remote Key/Value Store Support + +To enable remote support in Viper, do a blank import of the `viper/remote` +package: + +`import _ "github.com/spf13/viper/remote"` + +Viper will read a config string (as JSON, TOML, YAML, HCL or envfile) retrieved from a path +in a Key/Value store such as etcd or Consul. These values take precedence over +default values, but are overridden by configuration values retrieved from disk, +flags, or environment variables. + +Viper supports multiple hosts. To use, pass a list of endpoints separated by `;`. For example `http://127.0.0.1:4001;http://127.0.0.1:4002`. + +Viper uses [crypt](https://github.com/sagikazarmark/crypt) to retrieve +configuration from the K/V store, which means that you can store your +configuration values encrypted and have them automatically decrypted if you have +the correct gpg keyring. Encryption is optional. + +You can use remote configuration in conjunction with local configuration, or +independently of it. + +`crypt` has a command-line helper that you can use to put configurations in your +K/V store. `crypt` defaults to etcd on http://127.0.0.1:4001. + +```bash +$ go get github.com/sagikazarmark/crypt/bin/crypt +$ crypt set -plaintext /config/hugo.json /Users/hugo/settings/config.json +``` + +Confirm that your value was set: + +```bash +$ crypt get -plaintext /config/hugo.json +``` + +See the `crypt` documentation for examples of how to set encrypted values, or +how to use Consul. + +### Remote Key/Value Store Example - Unencrypted + +#### etcd +```go +viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001","/config/hugo.json") +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" +err := viper.ReadRemoteConfig() +``` + +#### etcd3 +```go +viper.AddRemoteProvider("etcd3", "http://127.0.0.1:4001","/config/hugo.json") +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" +err := viper.ReadRemoteConfig() +``` + +#### Consul +You need to set a key to Consul key/value storage with JSON value containing your desired config. +For example, create a Consul key/value store key `MY_CONSUL_KEY` with value: + +```json +{ + "port": 8080, + "hostname": "myhostname.com" +} +``` + +```go +viper.AddRemoteProvider("consul", "localhost:8500", "MY_CONSUL_KEY") +viper.SetConfigType("json") // Need to explicitly set this to json +err := viper.ReadRemoteConfig() + +fmt.Println(viper.Get("port")) // 8080 +fmt.Println(viper.Get("hostname")) // myhostname.com +``` + +#### Firestore + +```go +viper.AddRemoteProvider("firestore", "google-cloud-project-id", "collection/document") +viper.SetConfigType("json") // Config's format: "json", "toml", "yaml", "yml" +err := viper.ReadRemoteConfig() +``` + +Of course, you're allowed to use `SecureRemoteProvider` also + + +#### NATS + +```go +viper.AddRemoteProvider("nats", "nats://127.0.0.1:4222", "myapp.config") +viper.SetConfigType("json") +err := viper.ReadRemoteConfig() +``` + +### Remote Key/Value Store Example - Encrypted + +```go +viper.AddSecureRemoteProvider("etcd","http://127.0.0.1:4001","/config/hugo.json","/etc/secrets/mykeyring.gpg") +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" +err := viper.ReadRemoteConfig() +``` + +### Watching Changes in etcd - Unencrypted + +```go +// alternatively, you can create a new viper instance. +var runtime_viper = viper.New() + +runtime_viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hugo.yml") +runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" + +// read from remote config the first time. +err := runtime_viper.ReadRemoteConfig() + +// unmarshal config +runtime_viper.Unmarshal(&runtime_conf) + +// open a goroutine to watch remote changes forever +go func(){ + for { + time.Sleep(time.Second * 5) // delay after each request + + // currently, only tested with etcd support + err := runtime_viper.WatchRemoteConfig() + if err != nil { + log.Errorf("unable to read remote config: %v", err) + continue + } + + // unmarshal new config into our runtime config struct. you can also use channel + // to implement a signal to notify the system of the changes + runtime_viper.Unmarshal(&runtime_conf) + } +}() +``` + +## Getting Values From Viper + +In Viper, there are a few ways to get a value depending on the value’s type. +The following functions and methods exist: + + * `Get(key string) : any` + * `GetBool(key string) : bool` + * `GetFloat64(key string) : float64` + * `GetInt(key string) : int` + * `GetIntSlice(key string) : []int` + * `GetString(key string) : string` + * `GetStringMap(key string) : map[string]any` + * `GetStringMapString(key string) : map[string]string` + * `GetStringSlice(key string) : []string` + * `GetTime(key string) : time.Time` + * `GetDuration(key string) : time.Duration` + * `IsSet(key string) : bool` + * `AllSettings() : map[string]any` + +One important thing to recognize is that each Get function will return a zero +value if it’s not found. To check if a given key exists, the `IsSet()` method +has been provided. + +The zero value will also be returned if the value is set, but fails to parse +as the requested type. + +Example: +```go +viper.GetString("logfile") // case-insensitive Setting & Getting +if viper.GetBool("verbose") { + fmt.Println("verbose enabled") +} +``` +### Accessing nested keys + +The accessor methods also accept formatted paths to deeply nested keys. For +example, if the following JSON file is loaded: + +```json +{ + "host": { + "address": "localhost", + "port": 5799 + }, + "datastore": { + "metric": { + "host": "127.0.0.1", + "port": 3099 + }, + "warehouse": { + "host": "198.0.0.1", + "port": 2112 + } + } +} + +``` + +Viper can access a nested field by passing a `.` delimited path of keys: + +```go +GetString("datastore.metric.host") // (returns "127.0.0.1") +``` + +This obeys the precedence rules established above; the search for the path +will cascade through the remaining configuration registries until found. + +For example, given this configuration file, both `datastore.metric.host` and +`datastore.metric.port` are already defined (and may be overridden). If in addition +`datastore.metric.protocol` was defined in the defaults, Viper would also find it. + +However, if `datastore.metric` was overridden (by a flag, an environment variable, +the `Set()` method, …) with an immediate value, then all sub-keys of +`datastore.metric` become undefined, they are “shadowed” by the higher-priority +configuration level. + +Viper can access array indices by using numbers in the path. For example: + +```jsonc +{ + "host": { + "address": "localhost", + "ports": [ + 5799, + 6029 + ] + }, + "datastore": { + "metric": { + "host": "127.0.0.1", + "port": 3099 + }, + "warehouse": { + "host": "198.0.0.1", + "port": 2112 + } + } +} + +GetInt("host.ports.1") // returns 6029 + +``` + +Lastly, if there exists a key that matches the delimited key path, its value +will be returned instead. E.g. + +```jsonc +{ + "datastore.metric.host": "0.0.0.0", + "host": { + "address": "localhost", + "port": 5799 + }, + "datastore": { + "metric": { + "host": "127.0.0.1", + "port": 3099 + }, + "warehouse": { + "host": "198.0.0.1", + "port": 2112 + } + } +} + +GetString("datastore.metric.host") // returns "0.0.0.0" +``` + +### Extracting a sub-tree + +When developing reusable modules, it's often useful to extract a subset of the configuration +and pass it to a module. This way the module can be instantiated more than once, with different configurations. + +For example, an application might use multiple different cache stores for different purposes: + +```yaml +cache: + cache1: + max-items: 100 + item-size: 64 + cache2: + max-items: 200 + item-size: 80 +``` + +We could pass the cache name to a module (eg. `NewCache("cache1")`), +but it would require weird concatenation for accessing config keys and would be less separated from the global config. + +So instead of doing that let's pass a Viper instance to the constructor that represents a subset of the configuration: + +```go +cache1Config := viper.Sub("cache.cache1") +if cache1Config == nil { // Sub returns nil if the key cannot be found + panic("cache configuration not found") +} + +cache1 := NewCache(cache1Config) +``` + +**Note:** Always check the return value of `Sub`. It returns `nil` if a key cannot be found. + +Internally, the `NewCache` function can address `max-items` and `item-size` keys directly: + +```go +func NewCache(v *Viper) *Cache { + return &Cache{ + MaxItems: v.GetInt("max-items"), + ItemSize: v.GetInt("item-size"), + } +} +``` + +The resulting code is easy to test, since it's decoupled from the main config structure, +and easier to reuse (for the same reason). + + +### Unmarshaling + +You also have the option of Unmarshaling all or a specific value to a struct, map, +etc. + +There are two methods to do this: + + * `Unmarshal(rawVal any) : error` + * `UnmarshalKey(key string, rawVal any) : error` + +Example: + +```go +type config struct { + Port int + Name string + PathMap string `mapstructure:"path_map"` +} + +var C config + +err := viper.Unmarshal(&C) +if err != nil { + t.Fatalf("unable to decode into struct, %v", err) +} +``` + +If you want to unmarshal configuration where the keys themselves contain dot (the default key delimiter), +you have to change the delimiter: + +```go +v := viper.NewWithOptions(viper.KeyDelimiter("::")) + +v.SetDefault("chart::values", map[string]any{ + "ingress": map[string]any{ + "annotations": map[string]any{ + "traefik.frontend.rule.type": "PathPrefix", + "traefik.ingress.kubernetes.io/ssl-redirect": "true", + }, + }, +}) + +type config struct { + Chart struct{ + Values map[string]any + } +} + +var C config + +v.Unmarshal(&C) +``` + +Viper also supports unmarshaling into embedded structs: + +```go +/* +Example config: + +module: + enabled: true + token: 89h3f98hbwf987h3f98wenf89ehf +*/ +type config struct { + Module struct { + Enabled bool + + moduleConfig `mapstructure:",squash"` + } +} + +// moduleConfig could be in a module specific package +type moduleConfig struct { + Token string +} + +var C config + +err := viper.Unmarshal(&C) +if err != nil { + t.Fatalf("unable to decode into struct, %v", err) +} +``` + +Viper uses [github.com/mitchellh/mapstructure](https://github.com/mitchellh/mapstructure) under the hood for unmarshaling values which uses `mapstructure` tags by default. + +### Decoding custom formats + +A frequently requested feature for Viper is adding more value formats and decoders. +For example, parsing character (dot, comma, semicolon, etc) separated strings into slices. + +This is already available in Viper using mapstructure decode hooks. + +Read more about the details in [this blog post](https://sagikazarmark.hu/blog/decoding-custom-formats-with-viper/). + +### Marshalling to string + +You may need to marshal all the settings held in viper into a string rather than write them to a file. +You can use your favorite format's marshaller with the config returned by `AllSettings()`. + +```go +import ( + yaml "gopkg.in/yaml.v2" + // ... +) + +func yamlStringSettings() string { + c := viper.AllSettings() + bs, err := yaml.Marshal(c) + if err != nil { + log.Fatalf("unable to marshal config to YAML: %v", err) + } + return string(bs) +} +``` + +## Viper or Vipers? + +Viper comes ready to use out of the box. There is no configuration or +initialization needed to begin using Viper. Since most applications will want +to use a single central repository for their configuration, the viper package +provides this. It is similar to a singleton. + +In all of the examples above, they demonstrate using viper in its singleton +style approach. + +### Working with multiple vipers + +You can also create many different vipers for use in your application. Each will +have its own unique set of configurations and values. Each can read from a +different config file, key value store, etc. All of the functions that viper +package supports are mirrored as methods on a viper. + +Example: + +```go +x := viper.New() +y := viper.New() + +x.SetDefault("ContentDir", "content") +y.SetDefault("ContentDir", "foobar") + +//... +``` + +When working with multiple vipers, it is up to the user to keep track of the +different vipers. + + +## Q & A + +### Why is it called “Viper”? + +A: Viper is designed to be a [companion](http://en.wikipedia.org/wiki/Viper_(G.I._Joe)) +to [Cobra](https://github.com/spf13/cobra). While both can operate completely +independently, together they make a powerful pair to handle much of your +application foundation needs. + +### Why is it called “Cobra”? + +Is there a better name for a [commander](http://en.wikipedia.org/wiki/Cobra_Commander)? + +### Does Viper support case sensitive keys? + +**tl;dr:** No. + +Viper merges configuration from various sources, many of which are either case insensitive or uses different casing than the rest of the sources (eg. env vars). +In order to provide the best experience when using multiple sources, the decision has been made to make all keys case insensitive. + +There has been several attempts to implement case sensitivity, but unfortunately it's not that trivial. We might take a stab at implementing it in [Viper v2](https://github.com/spf13/viper/issues/772), but despite the initial noise, it does not seem to be requested that much. + +You can vote for case sensitivity by filling out this feedback form: https://forms.gle/R6faU74qPRPAzchZ9 + +### Is it safe to concurrently read and write to a viper? + +No, you will need to synchronize access to the viper yourself (for example by using the `sync` package). Concurrent reads and writes can cause a panic. + +## Troubleshooting + +See [TROUBLESHOOTING.md](TROUBLESHOOTING.md). + +## Development + +**For an optimal developer experience, it is recommended to install [Nix](https://nixos.org/download.html) and [direnv](https://direnv.net/docs/installation.html).** + +_Alternatively, install [Go](https://go.dev/dl/) on your computer then run `make deps` to install the rest of the dependencies._ + +Run the test suite: + +```shell +make test +``` + +Run linters: + +```shell +make lint # pass -j option to run them in parallel +``` + +Some linter violations can automatically be fixed: + +```shell +make fmt +``` + +## License + +The project is licensed under the [MIT License](LICENSE). diff --git a/vendor/github.com/spf13/viper/TROUBLESHOOTING.md b/vendor/github.com/spf13/viper/TROUBLESHOOTING.md new file mode 100644 index 0000000000..b68993d412 --- /dev/null +++ b/vendor/github.com/spf13/viper/TROUBLESHOOTING.md @@ -0,0 +1,32 @@ +# Troubleshooting + +## Unmarshaling doesn't work + +The most common reason for this issue is improper use of struct tags (eg. `yaml` or `json`). Viper uses [github.com/mitchellh/mapstructure](https://github.com/mitchellh/mapstructure) under the hood for unmarshaling values which uses `mapstructure` tags by default. Please refer to the library's documentation for using other struct tags. + +## Cannot find package + +Viper installation seems to fail a lot lately with the following (or a similar) error: + +``` +cannot find package "github.com/hashicorp/hcl/tree/hcl1" in any of: +/usr/local/Cellar/go/1.15.7_1/libexec/src/github.com/hashicorp/hcl/tree/hcl1 (from $GOROOT) +/Users/user/go/src/github.com/hashicorp/hcl/tree/hcl1 (from $GOPATH) +``` + +As the error message suggests, Go tries to look up dependencies in `GOPATH` mode (as it's commonly called) from the `GOPATH`. +Viper opted to use [Go Modules](https://go.dev/wiki/Modules) to manage its dependencies. While in many cases the two methods are interchangeable, once a dependency releases new (major) versions, `GOPATH` mode is no longer able to decide which version to use, so it'll either use one that's already present or pick a version (usually the `master` branch). + +The solution is easy: switch to using Go Modules. +Please refer to the [wiki](https://go.dev/wiki/Modules) on how to do that. + +**tl;dr* `export GO111MODULE=on` + +## Unquoted 'y' and 'n' characters get replaced with _true_ and _false_ when reading a YAML file + +This is a YAML 1.1 feature according to [go-yaml/yaml#740](https://github.com/go-yaml/yaml/issues/740). + +Potential solutions are: + +1. Quoting values resolved as boolean +1. Upgrading to YAML v3 (for the time being this is possible by passing the `viper_yaml3` tag to your build) diff --git a/vendor/github.com/spf13/viper/file.go b/vendor/github.com/spf13/viper/file.go new file mode 100644 index 0000000000..a54fe5a7a8 --- /dev/null +++ b/vendor/github.com/spf13/viper/file.go @@ -0,0 +1,56 @@ +//go:build !finder + +package viper + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/spf13/afero" +) + +// Search all configPaths for any config file. +// Returns the first path that exists (and is a config file). +func (v *Viper) findConfigFile() (string, error) { + v.logger.Info("searching for config in paths", "paths", v.configPaths) + + for _, cp := range v.configPaths { + file := v.searchInPath(cp) + if file != "" { + return file, nil + } + } + return "", ConfigFileNotFoundError{v.configName, fmt.Sprintf("%s", v.configPaths)} +} + +func (v *Viper) searchInPath(in string) (filename string) { + v.logger.Debug("searching for config in path", "path", in) + for _, ext := range SupportedExts { + v.logger.Debug("checking if file exists", "file", filepath.Join(in, v.configName+"."+ext)) + if b, _ := exists(v.fs, filepath.Join(in, v.configName+"."+ext)); b { + v.logger.Debug("found file", "file", filepath.Join(in, v.configName+"."+ext)) + return filepath.Join(in, v.configName+"."+ext) + } + } + + if v.configType != "" { + if b, _ := exists(v.fs, filepath.Join(in, v.configName)); b { + return filepath.Join(in, v.configName) + } + } + + return "" +} + +// exists checks if file exists. +func exists(fs afero.Fs, path string) (bool, error) { + stat, err := fs.Stat(path) + if err == nil { + return !stat.IsDir(), nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} diff --git a/vendor/github.com/spf13/viper/file_finder.go b/vendor/github.com/spf13/viper/file_finder.go new file mode 100644 index 0000000000..d96a1bd223 --- /dev/null +++ b/vendor/github.com/spf13/viper/file_finder.go @@ -0,0 +1,38 @@ +//go:build finder + +package viper + +import ( + "fmt" + + "github.com/sagikazarmark/locafero" +) + +// Search all configPaths for any config file. +// Returns the first path that exists (and is a config file). +func (v *Viper) findConfigFile() (string, error) { + var names []string + + if v.configType != "" { + names = locafero.NameWithOptionalExtensions(v.configName, SupportedExts...) + } else { + names = locafero.NameWithExtensions(v.configName, SupportedExts...) + } + + finder := locafero.Finder{ + Paths: v.configPaths, + Names: names, + Type: locafero.FileTypeFile, + } + + results, err := finder.Find(v.fs) + if err != nil { + return "", err + } + + if len(results) == 0 { + return "", ConfigFileNotFoundError{v.configName, fmt.Sprintf("%s", v.configPaths)} + } + + return results[0], nil +} diff --git a/vendor/github.com/spf13/viper/flags.go b/vendor/github.com/spf13/viper/flags.go new file mode 100644 index 0000000000..de033ed58f --- /dev/null +++ b/vendor/github.com/spf13/viper/flags.go @@ -0,0 +1,57 @@ +package viper + +import "github.com/spf13/pflag" + +// FlagValueSet is an interface that users can implement +// to bind a set of flags to viper. +type FlagValueSet interface { + VisitAll(fn func(FlagValue)) +} + +// FlagValue is an interface that users can implement +// to bind different flags to viper. +type FlagValue interface { + HasChanged() bool + Name() string + ValueString() string + ValueType() string +} + +// pflagValueSet is a wrapper around *pflag.ValueSet +// that implements FlagValueSet. +type pflagValueSet struct { + flags *pflag.FlagSet +} + +// VisitAll iterates over all *pflag.Flag inside the *pflag.FlagSet. +func (p pflagValueSet) VisitAll(fn func(flag FlagValue)) { + p.flags.VisitAll(func(flag *pflag.Flag) { + fn(pflagValue{flag}) + }) +} + +// pflagValue is a wrapper around *pflag.flag +// that implements FlagValue. +type pflagValue struct { + flag *pflag.Flag +} + +// HasChanged returns whether the flag has changes or not. +func (p pflagValue) HasChanged() bool { + return p.flag.Changed +} + +// Name returns the name of the flag. +func (p pflagValue) Name() string { + return p.flag.Name +} + +// ValueString returns the value of the flag as a string. +func (p pflagValue) ValueString() string { + return p.flag.Value.String() +} + +// ValueType returns the type of the flag as a string. +func (p pflagValue) ValueType() string { + return p.flag.Value.Type() +} diff --git a/vendor/github.com/spf13/viper/flake.lock b/vendor/github.com/spf13/viper/flake.lock new file mode 100644 index 0000000000..3840614fa2 --- /dev/null +++ b/vendor/github.com/spf13/viper/flake.lock @@ -0,0 +1,273 @@ +{ + "nodes": { + "devenv": { + "inputs": { + "flake-compat": "flake-compat", + "nix": "nix", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1707817777, + "narHash": "sha256-vHyIs1OULQ3/91wD6xOiuayfI71JXALGA5KLnDKAcy0=", + "owner": "cachix", + "repo": "devenv", + "rev": "5a30b9e5ac7c6167e61b1f4193d5130bb9f8defa", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1706830856, + "narHash": "sha256-a0NYyp+h9hlb7ddVz4LUn1vT/PLwqfrWYcHMvFB1xYg=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "b253292d9c0a5ead9bc98c4e9a26c6312e27d69f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1685518550, + "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "devenv", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "lowdown-src": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "nix": { + "inputs": { + "lowdown-src": "lowdown-src", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression" + }, + "locked": { + "lastModified": 1676545802, + "narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=", + "owner": "domenkozar", + "repo": "nix", + "rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "relaxed-flakes", + "repo": "nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1678875422, + "narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1706550542, + "narHash": "sha256-UcsnCG6wx++23yeER4Hg18CXWbgNpqNXcHIo5/1Y+hc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "97b17f32362e475016f942bbdfda4a4a72a8a652", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-regression": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1685801374, + "narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c37ca420157f4abc31e26f436c1145f8951ff373", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1707939175, + "narHash": "sha256-D1xan0lgxbmXDyzVqXTiSYHLmAMrMRdD+alKzEO/p3w=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f7e8132daca31b1e3859ac0fb49741754375ac3d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "flake-utils": "flake-utils", + "gitignore": "gitignore", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1704725188, + "narHash": "sha256-qq8NbkhRZF1vVYQFt1s8Mbgo8knj+83+QlL5LBnYGpI=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "ea96f0c05924341c551a797aaba8126334c505d2", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs_2" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/vendor/github.com/spf13/viper/flake.nix b/vendor/github.com/spf13/viper/flake.nix new file mode 100644 index 0000000000..0230668cff --- /dev/null +++ b/vendor/github.com/spf13/viper/flake.nix @@ -0,0 +1,57 @@ +{ + description = "Viper"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + flake-parts.url = "github:hercules-ci/flake-parts"; + devenv.url = "github:cachix/devenv"; + }; + + outputs = inputs@{ flake-parts, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ + inputs.devenv.flakeModule + ]; + + systems = [ "x86_64-linux" "x86_64-darwin" "aarch64-darwin" ]; + + perSystem = { config, self', inputs', pkgs, system, ... }: rec { + devenv.shells = { + default = { + languages = { + go.enable = true; + go.package = pkgs.go_1_22; + }; + + pre-commit.hooks = { + nixpkgs-fmt.enable = true; + yamllint.enable = true; + }; + + packages = with pkgs; [ + gnumake + + golangci-lint + yamllint + ]; + + scripts = { + versions.exec = '' + go version + golangci-lint version + ''; + }; + + enterShell = '' + versions + ''; + + # https://github.com/cachix/devenv/issues/528#issuecomment-1556108767 + containers = pkgs.lib.mkForce { }; + }; + + ci = devenv.shells.default; + }; + }; + }; +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/decoder.go b/vendor/github.com/spf13/viper/internal/encoding/decoder.go new file mode 100644 index 0000000000..8a7b1dbc91 --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/decoder.go @@ -0,0 +1,61 @@ +package encoding + +import ( + "sync" +) + +// Decoder decodes the contents of b into v. +// It's primarily used for decoding contents of a file into a map[string]any. +type Decoder interface { + Decode(b []byte, v map[string]any) error +} + +const ( + // ErrDecoderNotFound is returned when there is no decoder registered for a format. + ErrDecoderNotFound = encodingError("decoder not found for this format") + + // ErrDecoderFormatAlreadyRegistered is returned when an decoder is already registered for a format. + ErrDecoderFormatAlreadyRegistered = encodingError("decoder already registered for this format") +) + +// DecoderRegistry can choose an appropriate Decoder based on the provided format. +type DecoderRegistry struct { + decoders map[string]Decoder + + mu sync.RWMutex +} + +// NewDecoderRegistry returns a new, initialized DecoderRegistry. +func NewDecoderRegistry() *DecoderRegistry { + return &DecoderRegistry{ + decoders: make(map[string]Decoder), + } +} + +// RegisterDecoder registers a Decoder for a format. +// Registering a Decoder for an already existing format is not supported. +func (e *DecoderRegistry) RegisterDecoder(format string, enc Decoder) error { + e.mu.Lock() + defer e.mu.Unlock() + + if _, ok := e.decoders[format]; ok { + return ErrDecoderFormatAlreadyRegistered + } + + e.decoders[format] = enc + + return nil +} + +// Decode calls the underlying Decoder based on the format. +func (e *DecoderRegistry) Decode(format string, b []byte, v map[string]any) error { + e.mu.RLock() + decoder, ok := e.decoders[format] + e.mu.RUnlock() + + if !ok { + return ErrDecoderNotFound + } + + return decoder.Decode(b, v) +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/dotenv/codec.go b/vendor/github.com/spf13/viper/internal/encoding/dotenv/codec.go new file mode 100644 index 0000000000..3ebc76f029 --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/dotenv/codec.go @@ -0,0 +1,61 @@ +package dotenv + +import ( + "bytes" + "fmt" + "sort" + "strings" + + "github.com/subosito/gotenv" +) + +const keyDelimiter = "_" + +// Codec implements the encoding.Encoder and encoding.Decoder interfaces for encoding data containing environment variables +// (commonly called as dotenv format). +type Codec struct{} + +func (Codec) Encode(v map[string]any) ([]byte, error) { + flattened := map[string]any{} + + flattened = flattenAndMergeMap(flattened, v, "", keyDelimiter) + + keys := make([]string, 0, len(flattened)) + + for key := range flattened { + keys = append(keys, key) + } + + sort.Strings(keys) + + var buf bytes.Buffer + + for _, key := range keys { + _, err := buf.WriteString(fmt.Sprintf("%v=%v\n", strings.ToUpper(key), flattened[key])) + if err != nil { + return nil, err + } + } + + return buf.Bytes(), nil +} + +func (Codec) Decode(b []byte, v map[string]any) error { + var buf bytes.Buffer + + _, err := buf.Write(b) + if err != nil { + return err + } + + env, err := gotenv.StrictParse(&buf) + if err != nil { + return err + } + + for key, value := range env { + v[key] = value + } + + return nil +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/dotenv/map_utils.go b/vendor/github.com/spf13/viper/internal/encoding/dotenv/map_utils.go new file mode 100644 index 0000000000..8bfe0a9de2 --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/dotenv/map_utils.go @@ -0,0 +1,41 @@ +package dotenv + +import ( + "strings" + + "github.com/spf13/cast" +) + +// flattenAndMergeMap recursively flattens the given map into a new map +// Code is based on the function with the same name in the main package. +// TODO: move it to a common place. +func flattenAndMergeMap(shadow, m map[string]any, prefix, delimiter string) map[string]any { + if shadow != nil && prefix != "" && shadow[prefix] != nil { + // prefix is shadowed => nothing more to flatten + return shadow + } + if shadow == nil { + shadow = make(map[string]any) + } + + var m2 map[string]any + if prefix != "" { + prefix += delimiter + } + for k, val := range m { + fullKey := prefix + k + switch val := val.(type) { + case map[string]any: + m2 = val + case map[any]any: + m2 = cast.ToStringMap(val) + default: + // immediate value + shadow[strings.ToLower(fullKey)] = val + continue + } + // recursively merge to shadow map + shadow = flattenAndMergeMap(shadow, m2, fullKey, delimiter) + } + return shadow +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/encoder.go b/vendor/github.com/spf13/viper/internal/encoding/encoder.go new file mode 100644 index 0000000000..659585962c --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/encoder.go @@ -0,0 +1,60 @@ +package encoding + +import ( + "sync" +) + +// Encoder encodes the contents of v into a byte representation. +// It's primarily used for encoding a map[string]any into a file format. +type Encoder interface { + Encode(v map[string]any) ([]byte, error) +} + +const ( + // ErrEncoderNotFound is returned when there is no encoder registered for a format. + ErrEncoderNotFound = encodingError("encoder not found for this format") + + // ErrEncoderFormatAlreadyRegistered is returned when an encoder is already registered for a format. + ErrEncoderFormatAlreadyRegistered = encodingError("encoder already registered for this format") +) + +// EncoderRegistry can choose an appropriate Encoder based on the provided format. +type EncoderRegistry struct { + encoders map[string]Encoder + + mu sync.RWMutex +} + +// NewEncoderRegistry returns a new, initialized EncoderRegistry. +func NewEncoderRegistry() *EncoderRegistry { + return &EncoderRegistry{ + encoders: make(map[string]Encoder), + } +} + +// RegisterEncoder registers an Encoder for a format. +// Registering a Encoder for an already existing format is not supported. +func (e *EncoderRegistry) RegisterEncoder(format string, enc Encoder) error { + e.mu.Lock() + defer e.mu.Unlock() + + if _, ok := e.encoders[format]; ok { + return ErrEncoderFormatAlreadyRegistered + } + + e.encoders[format] = enc + + return nil +} + +func (e *EncoderRegistry) Encode(format string, v map[string]any) ([]byte, error) { + e.mu.RLock() + encoder, ok := e.encoders[format] + e.mu.RUnlock() + + if !ok { + return nil, ErrEncoderNotFound + } + + return encoder.Encode(v) +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/error.go b/vendor/github.com/spf13/viper/internal/encoding/error.go new file mode 100644 index 0000000000..e4cde02d7b --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/error.go @@ -0,0 +1,7 @@ +package encoding + +type encodingError string + +func (e encodingError) Error() string { + return string(e) +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/hcl/codec.go b/vendor/github.com/spf13/viper/internal/encoding/hcl/codec.go new file mode 100644 index 0000000000..d7fa8a1b7a --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/hcl/codec.go @@ -0,0 +1,40 @@ +package hcl + +import ( + "bytes" + "encoding/json" + + "github.com/hashicorp/hcl" + "github.com/hashicorp/hcl/hcl/printer" +) + +// Codec implements the encoding.Encoder and encoding.Decoder interfaces for HCL encoding. +// TODO: add printer config to the codec? +type Codec struct{} + +func (Codec) Encode(v map[string]any) ([]byte, error) { + b, err := json.Marshal(v) + if err != nil { + return nil, err + } + + // TODO: use printer.Format? Is the trailing newline an issue? + + ast, err := hcl.Parse(string(b)) + if err != nil { + return nil, err + } + + var buf bytes.Buffer + + err = printer.Fprint(&buf, ast.Node) + if err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func (Codec) Decode(b []byte, v map[string]any) error { + return hcl.Unmarshal(b, &v) +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/ini/codec.go b/vendor/github.com/spf13/viper/internal/encoding/ini/codec.go new file mode 100644 index 0000000000..d91cf59d2b --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/ini/codec.go @@ -0,0 +1,99 @@ +package ini + +import ( + "bytes" + "sort" + "strings" + + "github.com/spf13/cast" + "gopkg.in/ini.v1" +) + +// LoadOptions contains all customized options used for load data source(s). +// This type is added here for convenience: this way consumers can import a single package called "ini". +type LoadOptions = ini.LoadOptions + +// Codec implements the encoding.Encoder and encoding.Decoder interfaces for INI encoding. +type Codec struct { + KeyDelimiter string + LoadOptions LoadOptions +} + +func (c Codec) Encode(v map[string]any) ([]byte, error) { + cfg := ini.Empty() + ini.PrettyFormat = false + + flattened := map[string]any{} + + flattened = flattenAndMergeMap(flattened, v, "", c.keyDelimiter()) + + keys := make([]string, 0, len(flattened)) + + for key := range flattened { + keys = append(keys, key) + } + + sort.Strings(keys) + + for _, key := range keys { + sectionName, keyName := "", key + + lastSep := strings.LastIndex(key, ".") + if lastSep != -1 { + sectionName = key[:(lastSep)] + keyName = key[(lastSep + 1):] + } + + // TODO: is this a good idea? + if sectionName == "default" { + sectionName = "" + } + + cfg.Section(sectionName).Key(keyName).SetValue(cast.ToString(flattened[key])) + } + + var buf bytes.Buffer + + _, err := cfg.WriteTo(&buf) + if err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func (c Codec) Decode(b []byte, v map[string]any) error { + cfg := ini.Empty(c.LoadOptions) + + err := cfg.Append(b) + if err != nil { + return err + } + + sections := cfg.Sections() + + for i := 0; i < len(sections); i++ { + section := sections[i] + keys := section.Keys() + + for j := 0; j < len(keys); j++ { + key := keys[j] + value := cfg.Section(section.Name()).Key(key.Name()).String() + + deepestMap := deepSearch(v, strings.Split(section.Name(), c.keyDelimiter())) + + // set innermost value + deepestMap[key.Name()] = value + } + } + + return nil +} + +func (c Codec) keyDelimiter() string { + if c.KeyDelimiter == "" { + return "." + } + + return c.KeyDelimiter +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/ini/map_utils.go b/vendor/github.com/spf13/viper/internal/encoding/ini/map_utils.go new file mode 100644 index 0000000000..490ab594ec --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/ini/map_utils.go @@ -0,0 +1,74 @@ +package ini + +import ( + "strings" + + "github.com/spf13/cast" +) + +// THIS CODE IS COPIED HERE: IT SHOULD NOT BE MODIFIED +// AT SOME POINT IT WILL BE MOVED TO A COMMON PLACE +// deepSearch scans deep maps, following the key indexes listed in the +// sequence "path". +// The last value is expected to be another map, and is returned. +// +// In case intermediate keys do not exist, or map to a non-map value, +// a new map is created and inserted, and the search continues from there: +// the initial map "m" may be modified! +func deepSearch(m map[string]any, path []string) map[string]any { + for _, k := range path { + m2, ok := m[k] + if !ok { + // intermediate key does not exist + // => create it and continue from there + m3 := make(map[string]any) + m[k] = m3 + m = m3 + continue + } + m3, ok := m2.(map[string]any) + if !ok { + // intermediate key is a value + // => replace with a new map + m3 = make(map[string]any) + m[k] = m3 + } + // continue search from here + m = m3 + } + return m +} + +// flattenAndMergeMap recursively flattens the given map into a new map +// Code is based on the function with the same name in the main package. +// TODO: move it to a common place. +func flattenAndMergeMap(shadow, m map[string]any, prefix, delimiter string) map[string]any { + if shadow != nil && prefix != "" && shadow[prefix] != nil { + // prefix is shadowed => nothing more to flatten + return shadow + } + if shadow == nil { + shadow = make(map[string]any) + } + + var m2 map[string]any + if prefix != "" { + prefix += delimiter + } + for k, val := range m { + fullKey := prefix + k + switch val := val.(type) { + case map[string]any: + m2 = val + case map[any]any: + m2 = cast.ToStringMap(val) + default: + // immediate value + shadow[strings.ToLower(fullKey)] = val + continue + } + // recursively merge to shadow map + shadow = flattenAndMergeMap(shadow, m2, fullKey, delimiter) + } + return shadow +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/javaproperties/codec.go b/vendor/github.com/spf13/viper/internal/encoding/javaproperties/codec.go new file mode 100644 index 0000000000..e92e5172c1 --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/javaproperties/codec.go @@ -0,0 +1,86 @@ +package javaproperties + +import ( + "bytes" + "sort" + "strings" + + "github.com/magiconair/properties" + "github.com/spf13/cast" +) + +// Codec implements the encoding.Encoder and encoding.Decoder interfaces for Java properties encoding. +type Codec struct { + KeyDelimiter string + + // Store read properties on the object so that we can write back in order with comments. + // This will only be used if the configuration read is a properties file. + // TODO: drop this feature in v2 + // TODO: make use of the global properties object optional + Properties *properties.Properties +} + +func (c *Codec) Encode(v map[string]any) ([]byte, error) { + if c.Properties == nil { + c.Properties = properties.NewProperties() + } + + flattened := map[string]any{} + + flattened = flattenAndMergeMap(flattened, v, "", c.keyDelimiter()) + + keys := make([]string, 0, len(flattened)) + + for key := range flattened { + keys = append(keys, key) + } + + sort.Strings(keys) + + for _, key := range keys { + _, _, err := c.Properties.Set(key, cast.ToString(flattened[key])) + if err != nil { + return nil, err + } + } + + var buf bytes.Buffer + + _, err := c.Properties.WriteComment(&buf, "#", properties.UTF8) + if err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func (c *Codec) Decode(b []byte, v map[string]any) error { + var err error + c.Properties, err = properties.Load(b, properties.UTF8) + if err != nil { + return err + } + + for _, key := range c.Properties.Keys() { + // ignore existence check: we know it's there + value, _ := c.Properties.Get(key) + + // recursively build nested maps + path := strings.Split(key, c.keyDelimiter()) + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(v, path[0:len(path)-1]) + + // set innermost value + deepestMap[lastKey] = value + } + + return nil +} + +func (c Codec) keyDelimiter() string { + if c.KeyDelimiter == "" { + return "." + } + + return c.KeyDelimiter +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/javaproperties/map_utils.go b/vendor/github.com/spf13/viper/internal/encoding/javaproperties/map_utils.go new file mode 100644 index 0000000000..6e1aff2236 --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/javaproperties/map_utils.go @@ -0,0 +1,74 @@ +package javaproperties + +import ( + "strings" + + "github.com/spf13/cast" +) + +// THIS CODE IS COPIED HERE: IT SHOULD NOT BE MODIFIED +// AT SOME POINT IT WILL BE MOVED TO A COMMON PLACE +// deepSearch scans deep maps, following the key indexes listed in the +// sequence "path". +// The last value is expected to be another map, and is returned. +// +// In case intermediate keys do not exist, or map to a non-map value, +// a new map is created and inserted, and the search continues from there: +// the initial map "m" may be modified! +func deepSearch(m map[string]any, path []string) map[string]any { + for _, k := range path { + m2, ok := m[k] + if !ok { + // intermediate key does not exist + // => create it and continue from there + m3 := make(map[string]any) + m[k] = m3 + m = m3 + continue + } + m3, ok := m2.(map[string]any) + if !ok { + // intermediate key is a value + // => replace with a new map + m3 = make(map[string]any) + m[k] = m3 + } + // continue search from here + m = m3 + } + return m +} + +// flattenAndMergeMap recursively flattens the given map into a new map +// Code is based on the function with the same name in the main package. +// TODO: move it to a common place. +func flattenAndMergeMap(shadow, m map[string]any, prefix, delimiter string) map[string]any { + if shadow != nil && prefix != "" && shadow[prefix] != nil { + // prefix is shadowed => nothing more to flatten + return shadow + } + if shadow == nil { + shadow = make(map[string]any) + } + + var m2 map[string]any + if prefix != "" { + prefix += delimiter + } + for k, val := range m { + fullKey := prefix + k + switch val := val.(type) { + case map[string]any: + m2 = val + case map[any]any: + m2 = cast.ToStringMap(val) + default: + // immediate value + shadow[strings.ToLower(fullKey)] = val + continue + } + // recursively merge to shadow map + shadow = flattenAndMergeMap(shadow, m2, fullKey, delimiter) + } + return shadow +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/json/codec.go b/vendor/github.com/spf13/viper/internal/encoding/json/codec.go new file mode 100644 index 0000000000..da7546b5a1 --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/json/codec.go @@ -0,0 +1,17 @@ +package json + +import ( + "encoding/json" +) + +// Codec implements the encoding.Encoder and encoding.Decoder interfaces for JSON encoding. +type Codec struct{} + +func (Codec) Encode(v map[string]any) ([]byte, error) { + // TODO: expose prefix and indent in the Codec as setting? + return json.MarshalIndent(v, "", " ") +} + +func (Codec) Decode(b []byte, v map[string]any) error { + return json.Unmarshal(b, &v) +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/toml/codec.go b/vendor/github.com/spf13/viper/internal/encoding/toml/codec.go new file mode 100644 index 0000000000..c70aa8d280 --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/toml/codec.go @@ -0,0 +1,16 @@ +package toml + +import ( + "github.com/pelletier/go-toml/v2" +) + +// Codec implements the encoding.Encoder and encoding.Decoder interfaces for TOML encoding. +type Codec struct{} + +func (Codec) Encode(v map[string]any) ([]byte, error) { + return toml.Marshal(v) +} + +func (Codec) Decode(b []byte, v map[string]any) error { + return toml.Unmarshal(b, &v) +} diff --git a/vendor/github.com/spf13/viper/internal/encoding/yaml/codec.go b/vendor/github.com/spf13/viper/internal/encoding/yaml/codec.go new file mode 100644 index 0000000000..0368792499 --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/encoding/yaml/codec.go @@ -0,0 +1,14 @@ +package yaml + +import "gopkg.in/yaml.v3" + +// Codec implements the encoding.Encoder and encoding.Decoder interfaces for YAML encoding. +type Codec struct{} + +func (Codec) Encode(v map[string]any) ([]byte, error) { + return yaml.Marshal(v) +} + +func (Codec) Decode(b []byte, v map[string]any) error { + return yaml.Unmarshal(b, &v) +} diff --git a/vendor/github.com/spf13/viper/internal/features/bind_struct.go b/vendor/github.com/spf13/viper/internal/features/bind_struct.go new file mode 100644 index 0000000000..89302c2164 --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/features/bind_struct.go @@ -0,0 +1,5 @@ +//go:build viper_bind_struct + +package features + +const BindStruct = true diff --git a/vendor/github.com/spf13/viper/internal/features/bind_struct_default.go b/vendor/github.com/spf13/viper/internal/features/bind_struct_default.go new file mode 100644 index 0000000000..edfaf73b64 --- /dev/null +++ b/vendor/github.com/spf13/viper/internal/features/bind_struct_default.go @@ -0,0 +1,5 @@ +//go:build !viper_bind_struct + +package features + +const BindStruct = false diff --git a/vendor/github.com/spf13/viper/logger.go b/vendor/github.com/spf13/viper/logger.go new file mode 100644 index 0000000000..8938053b31 --- /dev/null +++ b/vendor/github.com/spf13/viper/logger.go @@ -0,0 +1,68 @@ +package viper + +import ( + "context" + + slog "github.com/sagikazarmark/slog-shim" +) + +// Logger is a unified interface for various logging use cases and practices, including: +// - leveled logging +// - structured logging +// +// Deprecated: use `log/slog` instead. +type Logger interface { + // Trace logs a Trace event. + // + // Even more fine-grained information than Debug events. + // Loggers not supporting this level should fall back to Debug. + Trace(msg string, keyvals ...any) + + // Debug logs a Debug event. + // + // A verbose series of information events. + // They are useful when debugging the system. + Debug(msg string, keyvals ...any) + + // Info logs an Info event. + // + // General information about what's happening inside the system. + Info(msg string, keyvals ...any) + + // Warn logs a Warn(ing) event. + // + // Non-critical events that should be looked at. + Warn(msg string, keyvals ...any) + + // Error logs an Error event. + // + // Critical events that require immediate attention. + // Loggers commonly provide Fatal and Panic levels above Error level, + // but exiting and panicking is out of scope for a logging library. + Error(msg string, keyvals ...any) +} + +// WithLogger sets a custom logger. +func WithLogger(l *slog.Logger) Option { + return optionFunc(func(v *Viper) { + v.logger = l + }) +} + +type discardHandler struct{} + +func (n *discardHandler) Enabled(_ context.Context, _ slog.Level) bool { + return false +} + +func (n *discardHandler) Handle(_ context.Context, _ slog.Record) error { + return nil +} + +func (n *discardHandler) WithAttrs(_ []slog.Attr) slog.Handler { + return n +} + +func (n *discardHandler) WithGroup(_ string) slog.Handler { + return n +} diff --git a/vendor/github.com/spf13/viper/util.go b/vendor/github.com/spf13/viper/util.go new file mode 100644 index 0000000000..117c6ac312 --- /dev/null +++ b/vendor/github.com/spf13/viper/util.go @@ -0,0 +1,223 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// Viper is a application configuration system. +// It believes that applications can be configured a variety of ways +// via flags, ENVIRONMENT variables, configuration files retrieved +// from the file system, or a remote key/value store. + +package viper + +import ( + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + "unicode" + + slog "github.com/sagikazarmark/slog-shim" + "github.com/spf13/cast" +) + +// ConfigParseError denotes failing to parse configuration file. +type ConfigParseError struct { + err error +} + +// Error returns the formatted configuration error. +func (pe ConfigParseError) Error() string { + return fmt.Sprintf("While parsing config: %s", pe.err.Error()) +} + +// Unwrap returns the wrapped error. +func (pe ConfigParseError) Unwrap() error { + return pe.err +} + +// toCaseInsensitiveValue checks if the value is a map; +// if so, create a copy and lower-case the keys recursively. +func toCaseInsensitiveValue(value any) any { + switch v := value.(type) { + case map[any]any: + value = copyAndInsensitiviseMap(cast.ToStringMap(v)) + case map[string]any: + value = copyAndInsensitiviseMap(v) + } + + return value +} + +// copyAndInsensitiviseMap behaves like insensitiviseMap, but creates a copy of +// any map it makes case insensitive. +func copyAndInsensitiviseMap(m map[string]any) map[string]any { + nm := make(map[string]any) + + for key, val := range m { + lkey := strings.ToLower(key) + switch v := val.(type) { + case map[any]any: + nm[lkey] = copyAndInsensitiviseMap(cast.ToStringMap(v)) + case map[string]any: + nm[lkey] = copyAndInsensitiviseMap(v) + default: + nm[lkey] = v + } + } + + return nm +} + +func insensitiviseVal(val any) any { + switch v := val.(type) { + case map[any]any: + // nested map: cast and recursively insensitivise + val = cast.ToStringMap(val) + insensitiviseMap(val.(map[string]any)) + case map[string]any: + // nested map: recursively insensitivise + insensitiviseMap(v) + case []any: + // nested array: recursively insensitivise + insensitiveArray(v) + } + return val +} + +func insensitiviseMap(m map[string]any) { + for key, val := range m { + val = insensitiviseVal(val) + lower := strings.ToLower(key) + if key != lower { + // remove old key (not lower-cased) + delete(m, key) + } + // update map + m[lower] = val + } +} + +func insensitiveArray(a []any) { + for i, val := range a { + a[i] = insensitiviseVal(val) + } +} + +func absPathify(logger *slog.Logger, inPath string) string { + logger.Info("trying to resolve absolute path", "path", inPath) + + if inPath == "$HOME" || strings.HasPrefix(inPath, "$HOME"+string(os.PathSeparator)) { + inPath = userHomeDir() + inPath[5:] + } + + inPath = os.ExpandEnv(inPath) + + if filepath.IsAbs(inPath) { + return filepath.Clean(inPath) + } + + p, err := filepath.Abs(inPath) + if err == nil { + return filepath.Clean(p) + } + + logger.Error(fmt.Errorf("could not discover absolute path: %w", err).Error()) + + return "" +} + +func stringInSlice(a string, list []string) bool { + for _, b := range list { + if b == a { + return true + } + } + return false +} + +func userHomeDir() string { + if runtime.GOOS == "windows" { + home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + if home == "" { + home = os.Getenv("USERPROFILE") + } + return home + } + return os.Getenv("HOME") +} + +func safeMul(a, b uint) uint { + c := a * b + if a > 1 && b > 1 && c/b != a { + return 0 + } + return c +} + +// parseSizeInBytes converts strings like 1GB or 12 mb into an unsigned integer number of bytes. +func parseSizeInBytes(sizeStr string) uint { + sizeStr = strings.TrimSpace(sizeStr) + lastChar := len(sizeStr) - 1 + multiplier := uint(1) + + if lastChar > 0 { + if sizeStr[lastChar] == 'b' || sizeStr[lastChar] == 'B' { + if lastChar > 1 { + switch unicode.ToLower(rune(sizeStr[lastChar-1])) { + case 'k': + multiplier = 1 << 10 + sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) + case 'm': + multiplier = 1 << 20 + sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) + case 'g': + multiplier = 1 << 30 + sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) + default: + multiplier = 1 + sizeStr = strings.TrimSpace(sizeStr[:lastChar]) + } + } + } + } + + size := cast.ToInt(sizeStr) + if size < 0 { + size = 0 + } + + return safeMul(uint(size), multiplier) +} + +// deepSearch scans deep maps, following the key indexes listed in the +// sequence "path". +// The last value is expected to be another map, and is returned. +// +// In case intermediate keys do not exist, or map to a non-map value, +// a new map is created and inserted, and the search continues from there: +// the initial map "m" may be modified! +func deepSearch(m map[string]any, path []string) map[string]any { + for _, k := range path { + m2, ok := m[k] + if !ok { + // intermediate key does not exist + // => create it and continue from there + m3 := make(map[string]any) + m[k] = m3 + m = m3 + continue + } + m3, ok := m2.(map[string]any) + if !ok { + // intermediate key is a value + // => replace with a new map + m3 = make(map[string]any) + m[k] = m3 + } + // continue search from here + m = m3 + } + return m +} diff --git a/vendor/github.com/spf13/viper/viper.go b/vendor/github.com/spf13/viper/viper.go new file mode 100644 index 0000000000..da68d9944c --- /dev/null +++ b/vendor/github.com/spf13/viper/viper.go @@ -0,0 +1,2252 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// Viper is an application configuration system. +// It believes that applications can be configured a variety of ways +// via flags, ENVIRONMENT variables, configuration files retrieved +// from the file system, or a remote key/value store. + +// Each item takes precedence over the item below it: + +// overrides +// flag +// env +// config +// key/value store +// default + +package viper + +import ( + "bytes" + "encoding/csv" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "reflect" + "strconv" + "strings" + "sync" + "time" + + "github.com/fsnotify/fsnotify" + "github.com/mitchellh/mapstructure" + slog "github.com/sagikazarmark/slog-shim" + "github.com/spf13/afero" + "github.com/spf13/cast" + "github.com/spf13/pflag" + + "github.com/spf13/viper/internal/encoding" + "github.com/spf13/viper/internal/encoding/dotenv" + "github.com/spf13/viper/internal/encoding/hcl" + "github.com/spf13/viper/internal/encoding/ini" + "github.com/spf13/viper/internal/encoding/javaproperties" + "github.com/spf13/viper/internal/encoding/json" + "github.com/spf13/viper/internal/encoding/toml" + "github.com/spf13/viper/internal/encoding/yaml" + "github.com/spf13/viper/internal/features" +) + +// ConfigMarshalError happens when failing to marshal the configuration. +type ConfigMarshalError struct { + err error +} + +// Error returns the formatted configuration error. +func (e ConfigMarshalError) Error() string { + return fmt.Sprintf("While marshaling config: %s", e.err.Error()) +} + +var v *Viper + +type RemoteResponse struct { + Value []byte + Error error +} + +func init() { + v = New() +} + +type remoteConfigFactory interface { + Get(rp RemoteProvider) (io.Reader, error) + Watch(rp RemoteProvider) (io.Reader, error) + WatchChannel(rp RemoteProvider) (<-chan *RemoteResponse, chan bool) +} + +// RemoteConfig is optional, see the remote package. +var RemoteConfig remoteConfigFactory + +// UnsupportedConfigError denotes encountering an unsupported +// configuration filetype. +type UnsupportedConfigError string + +// Error returns the formatted configuration error. +func (str UnsupportedConfigError) Error() string { + return fmt.Sprintf("Unsupported Config Type %q", string(str)) +} + +// UnsupportedRemoteProviderError denotes encountering an unsupported remote +// provider. Currently only etcd and Consul are supported. +type UnsupportedRemoteProviderError string + +// Error returns the formatted remote provider error. +func (str UnsupportedRemoteProviderError) Error() string { + return fmt.Sprintf("Unsupported Remote Provider Type %q", string(str)) +} + +// RemoteConfigError denotes encountering an error while trying to +// pull the configuration from the remote provider. +type RemoteConfigError string + +// Error returns the formatted remote provider error. +func (rce RemoteConfigError) Error() string { + return fmt.Sprintf("Remote Configurations Error: %s", string(rce)) +} + +// ConfigFileNotFoundError denotes failing to find configuration file. +type ConfigFileNotFoundError struct { + name, locations string +} + +// Error returns the formatted configuration error. +func (fnfe ConfigFileNotFoundError) Error() string { + return fmt.Sprintf("Config File %q Not Found in %q", fnfe.name, fnfe.locations) +} + +// ConfigFileAlreadyExistsError denotes failure to write new configuration file. +type ConfigFileAlreadyExistsError string + +// Error returns the formatted error when configuration already exists. +func (faee ConfigFileAlreadyExistsError) Error() string { + return fmt.Sprintf("Config File %q Already Exists", string(faee)) +} + +// A DecoderConfigOption can be passed to viper.Unmarshal to configure +// mapstructure.DecoderConfig options. +type DecoderConfigOption func(*mapstructure.DecoderConfig) + +// DecodeHook returns a DecoderConfigOption which overrides the default +// DecoderConfig.DecodeHook value, the default is: +// +// mapstructure.ComposeDecodeHookFunc( +// mapstructure.StringToTimeDurationHookFunc(), +// mapstructure.StringToSliceHookFunc(","), +// ) +func DecodeHook(hook mapstructure.DecodeHookFunc) DecoderConfigOption { + return func(c *mapstructure.DecoderConfig) { + c.DecodeHook = hook + } +} + +// Viper is a prioritized configuration registry. It +// maintains a set of configuration sources, fetches +// values to populate those, and provides them according +// to the source's priority. +// The priority of the sources is the following: +// 1. overrides +// 2. flags +// 3. env. variables +// 4. config file +// 5. key/value store +// 6. defaults +// +// For example, if values from the following sources were loaded: +// +// Defaults : { +// "secret": "", +// "user": "default", +// "endpoint": "https://localhost" +// } +// Config : { +// "user": "root" +// "secret": "defaultsecret" +// } +// Env : { +// "secret": "somesecretkey" +// } +// +// The resulting config will have the following values: +// +// { +// "secret": "somesecretkey", +// "user": "root", +// "endpoint": "https://localhost" +// } +// +// Note: Vipers are not safe for concurrent Get() and Set() operations. +type Viper struct { + // Delimiter that separates a list of keys + // used to access a nested value in one go + keyDelim string + + // A set of paths to look for the config file in + configPaths []string + + // The filesystem to read config from. + fs afero.Fs + + // A set of remote providers to search for the configuration + remoteProviders []*defaultRemoteProvider + + // Name of file to look for inside the path + configName string + configFile string + configType string + configPermissions os.FileMode + envPrefix string + + // Specific commands for ini parsing + iniLoadOptions ini.LoadOptions + + automaticEnvApplied bool + envKeyReplacer StringReplacer + allowEmptyEnv bool + + parents []string + config map[string]any + override map[string]any + defaults map[string]any + kvstore map[string]any + pflags map[string]FlagValue + env map[string][]string + aliases map[string]string + typeByDefValue bool + + onConfigChange func(fsnotify.Event) + + logger *slog.Logger + + // TODO: should probably be protected with a mutex + encoderRegistry *encoding.EncoderRegistry + decoderRegistry *encoding.DecoderRegistry +} + +// New returns an initialized Viper instance. +func New() *Viper { + v := new(Viper) + v.keyDelim = "." + v.configName = "config" + v.configPermissions = os.FileMode(0o644) + v.fs = afero.NewOsFs() + v.config = make(map[string]any) + v.parents = []string{} + v.override = make(map[string]any) + v.defaults = make(map[string]any) + v.kvstore = make(map[string]any) + v.pflags = make(map[string]FlagValue) + v.env = make(map[string][]string) + v.aliases = make(map[string]string) + v.typeByDefValue = false + v.logger = slog.New(&discardHandler{}) + + v.resetEncoding() + + return v +} + +// Option configures Viper using the functional options paradigm popularized by Rob Pike and Dave Cheney. +// If you're unfamiliar with this style, +// see https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html and +// https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis. +type Option interface { + apply(v *Viper) +} + +type optionFunc func(v *Viper) + +func (fn optionFunc) apply(v *Viper) { + fn(v) +} + +// KeyDelimiter sets the delimiter used for determining key parts. +// By default it's value is ".". +func KeyDelimiter(d string) Option { + return optionFunc(func(v *Viper) { + v.keyDelim = d + }) +} + +// StringReplacer applies a set of replacements to a string. +type StringReplacer interface { + // Replace returns a copy of s with all replacements performed. + Replace(s string) string +} + +// EnvKeyReplacer sets a replacer used for mapping environment variables to internal keys. +func EnvKeyReplacer(r StringReplacer) Option { + return optionFunc(func(v *Viper) { + v.envKeyReplacer = r + }) +} + +// NewWithOptions creates a new Viper instance. +func NewWithOptions(opts ...Option) *Viper { + v := New() + + for _, opt := range opts { + opt.apply(v) + } + + v.resetEncoding() + + return v +} + +// Reset is intended for testing, will reset all to default settings. +// In the public interface for the viper package so applications +// can use it in their testing as well. +func Reset() { + v = New() + SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "tfvars", "dotenv", "env", "ini"} + SupportedRemoteProviders = []string{"etcd", "etcd3", "consul", "firestore", "nats"} +} + +// TODO: make this lazy initialization instead. +func (v *Viper) resetEncoding() { + encoderRegistry := encoding.NewEncoderRegistry() + decoderRegistry := encoding.NewDecoderRegistry() + + { + codec := yaml.Codec{} + + encoderRegistry.RegisterEncoder("yaml", codec) + decoderRegistry.RegisterDecoder("yaml", codec) + + encoderRegistry.RegisterEncoder("yml", codec) + decoderRegistry.RegisterDecoder("yml", codec) + } + + { + codec := json.Codec{} + + encoderRegistry.RegisterEncoder("json", codec) + decoderRegistry.RegisterDecoder("json", codec) + } + + { + codec := toml.Codec{} + + encoderRegistry.RegisterEncoder("toml", codec) + decoderRegistry.RegisterDecoder("toml", codec) + } + + { + codec := hcl.Codec{} + + encoderRegistry.RegisterEncoder("hcl", codec) + decoderRegistry.RegisterDecoder("hcl", codec) + + encoderRegistry.RegisterEncoder("tfvars", codec) + decoderRegistry.RegisterDecoder("tfvars", codec) + } + + { + codec := ini.Codec{ + KeyDelimiter: v.keyDelim, + LoadOptions: v.iniLoadOptions, + } + + encoderRegistry.RegisterEncoder("ini", codec) + decoderRegistry.RegisterDecoder("ini", codec) + } + + { + codec := &javaproperties.Codec{ + KeyDelimiter: v.keyDelim, + } + + encoderRegistry.RegisterEncoder("properties", codec) + decoderRegistry.RegisterDecoder("properties", codec) + + encoderRegistry.RegisterEncoder("props", codec) + decoderRegistry.RegisterDecoder("props", codec) + + encoderRegistry.RegisterEncoder("prop", codec) + decoderRegistry.RegisterDecoder("prop", codec) + } + + { + codec := &dotenv.Codec{} + + encoderRegistry.RegisterEncoder("dotenv", codec) + decoderRegistry.RegisterDecoder("dotenv", codec) + + encoderRegistry.RegisterEncoder("env", codec) + decoderRegistry.RegisterDecoder("env", codec) + } + + v.encoderRegistry = encoderRegistry + v.decoderRegistry = decoderRegistry +} + +type defaultRemoteProvider struct { + provider string + endpoint string + path string + secretKeyring string +} + +func (rp defaultRemoteProvider) Provider() string { + return rp.provider +} + +func (rp defaultRemoteProvider) Endpoint() string { + return rp.endpoint +} + +func (rp defaultRemoteProvider) Path() string { + return rp.path +} + +func (rp defaultRemoteProvider) SecretKeyring() string { + return rp.secretKeyring +} + +// RemoteProvider stores the configuration necessary +// to connect to a remote key/value store. +// Optional secretKeyring to unencrypt encrypted values +// can be provided. +type RemoteProvider interface { + Provider() string + Endpoint() string + Path() string + SecretKeyring() string +} + +// SupportedExts are universally supported extensions. +var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "tfvars", "dotenv", "env", "ini"} + +// SupportedRemoteProviders are universally supported remote providers. +var SupportedRemoteProviders = []string{"etcd", "etcd3", "consul", "firestore", "nats"} + +// OnConfigChange sets the event handler that is called when a config file changes. +func OnConfigChange(run func(in fsnotify.Event)) { v.OnConfigChange(run) } + +// OnConfigChange sets the event handler that is called when a config file changes. +func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) { + v.onConfigChange = run +} + +// WatchConfig starts watching a config file for changes. +func WatchConfig() { v.WatchConfig() } + +// WatchConfig starts watching a config file for changes. +func (v *Viper) WatchConfig() { + initWG := sync.WaitGroup{} + initWG.Add(1) + go func() { + watcher, err := fsnotify.NewWatcher() + if err != nil { + v.logger.Error(fmt.Sprintf("failed to create watcher: %s", err)) + os.Exit(1) + } + defer watcher.Close() + // we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way + filename, err := v.getConfigFile() + if err != nil { + v.logger.Error(fmt.Sprintf("get config file: %s", err)) + initWG.Done() + return + } + + configFile := filepath.Clean(filename) + configDir, _ := filepath.Split(configFile) + realConfigFile, _ := filepath.EvalSymlinks(filename) + + eventsWG := sync.WaitGroup{} + eventsWG.Add(1) + go func() { + for { + select { + case event, ok := <-watcher.Events: + if !ok { // 'Events' channel is closed + eventsWG.Done() + return + } + currentConfigFile, _ := filepath.EvalSymlinks(filename) + // we only care about the config file with the following cases: + // 1 - if the config file was modified or created + // 2 - if the real path to the config file changed (eg: k8s ConfigMap replacement) + if (filepath.Clean(event.Name) == configFile && + (event.Has(fsnotify.Write) || event.Has(fsnotify.Create))) || + (currentConfigFile != "" && currentConfigFile != realConfigFile) { + realConfigFile = currentConfigFile + err := v.ReadInConfig() + if err != nil { + v.logger.Error(fmt.Sprintf("read config file: %s", err)) + } + if v.onConfigChange != nil { + v.onConfigChange(event) + } + } else if filepath.Clean(event.Name) == configFile && event.Has(fsnotify.Remove) { + eventsWG.Done() + return + } + + case err, ok := <-watcher.Errors: + if ok { // 'Errors' channel is not closed + v.logger.Error(fmt.Sprintf("watcher error: %s", err)) + } + eventsWG.Done() + return + } + } + }() + watcher.Add(configDir) + initWG.Done() // done initializing the watch in this go routine, so the parent routine can move on... + eventsWG.Wait() // now, wait for event loop to end in this go-routine... + }() + initWG.Wait() // make sure that the go routine above fully ended before returning +} + +// SetConfigFile explicitly defines the path, name and extension of the config file. +// Viper will use this and not check any of the config paths. +func SetConfigFile(in string) { v.SetConfigFile(in) } + +func (v *Viper) SetConfigFile(in string) { + if in != "" { + v.configFile = in + } +} + +// SetEnvPrefix defines a prefix that ENVIRONMENT variables will use. +// E.g. if your prefix is "spf", the env registry will look for env +// variables that start with "SPF_". +func SetEnvPrefix(in string) { v.SetEnvPrefix(in) } + +func (v *Viper) SetEnvPrefix(in string) { + if in != "" { + v.envPrefix = in + } +} + +func GetEnvPrefix() string { return v.GetEnvPrefix() } + +func (v *Viper) GetEnvPrefix() string { + return v.envPrefix +} + +func (v *Viper) mergeWithEnvPrefix(in string) string { + if v.envPrefix != "" { + return strings.ToUpper(v.envPrefix + "_" + in) + } + + return strings.ToUpper(in) +} + +// AllowEmptyEnv tells Viper to consider set, +// but empty environment variables as valid values instead of falling back. +// For backward compatibility reasons this is false by default. +func AllowEmptyEnv(allowEmptyEnv bool) { v.AllowEmptyEnv(allowEmptyEnv) } + +func (v *Viper) AllowEmptyEnv(allowEmptyEnv bool) { + v.allowEmptyEnv = allowEmptyEnv +} + +// TODO: should getEnv logic be moved into find(). Can generalize the use of +// rewriting keys many things, Ex: Get('someKey') -> some_key +// (camel case to snake case for JSON keys perhaps) + +// getEnv is a wrapper around os.Getenv which replaces characters in the original +// key. This allows env vars which have different keys than the config object +// keys. +func (v *Viper) getEnv(key string) (string, bool) { + if v.envKeyReplacer != nil { + key = v.envKeyReplacer.Replace(key) + } + + val, ok := os.LookupEnv(key) + + return val, ok && (v.allowEmptyEnv || val != "") +} + +// ConfigFileUsed returns the file used to populate the config registry. +func ConfigFileUsed() string { return v.ConfigFileUsed() } +func (v *Viper) ConfigFileUsed() string { return v.configFile } + +// AddConfigPath adds a path for Viper to search for the config file in. +// Can be called multiple times to define multiple search paths. +func AddConfigPath(in string) { v.AddConfigPath(in) } + +func (v *Viper) AddConfigPath(in string) { + if in != "" { + absin := absPathify(v.logger, in) + + v.logger.Info("adding path to search paths", "path", absin) + if !stringInSlice(absin, v.configPaths) { + v.configPaths = append(v.configPaths, absin) + } + } +} + +// AddRemoteProvider adds a remote configuration source. +// Remote Providers are searched in the order they are added. +// provider is a string value: "etcd", "etcd3", "consul", "firestore" or "nats" are currently supported. +// endpoint is the url. etcd requires http://ip:port, consul requires ip:port, nats requires nats://ip:port +// path is the path in the k/v store to retrieve configuration +// To retrieve a config file called myapp.json from /configs/myapp.json +// you should set path to /configs and set config name (SetConfigName()) to +// "myapp". +func AddRemoteProvider(provider, endpoint, path string) error { + return v.AddRemoteProvider(provider, endpoint, path) +} + +func (v *Viper) AddRemoteProvider(provider, endpoint, path string) error { + if !stringInSlice(provider, SupportedRemoteProviders) { + return UnsupportedRemoteProviderError(provider) + } + if provider != "" && endpoint != "" { + v.logger.Info("adding remote provider", "provider", provider, "endpoint", endpoint) + + rp := &defaultRemoteProvider{ + endpoint: endpoint, + provider: provider, + path: path, + } + if !v.providerPathExists(rp) { + v.remoteProviders = append(v.remoteProviders, rp) + } + } + return nil +} + +// AddSecureRemoteProvider adds a remote configuration source. +// Secure Remote Providers are searched in the order they are added. +// provider is a string value: "etcd", "etcd3", "consul", "firestore" or "nats" are currently supported. +// endpoint is the url. etcd requires http://ip:port consul requires ip:port +// secretkeyring is the filepath to your openpgp secret keyring. e.g. /etc/secrets/myring.gpg +// path is the path in the k/v store to retrieve configuration +// To retrieve a config file called myapp.json from /configs/myapp.json +// you should set path to /configs and set config name (SetConfigName()) to +// "myapp". +// Secure Remote Providers are implemented with github.com/sagikazarmark/crypt. +func AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error { + return v.AddSecureRemoteProvider(provider, endpoint, path, secretkeyring) +} + +func (v *Viper) AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error { + if !stringInSlice(provider, SupportedRemoteProviders) { + return UnsupportedRemoteProviderError(provider) + } + if provider != "" && endpoint != "" { + v.logger.Info("adding remote provider", "provider", provider, "endpoint", endpoint) + + rp := &defaultRemoteProvider{ + endpoint: endpoint, + provider: provider, + path: path, + secretKeyring: secretkeyring, + } + if !v.providerPathExists(rp) { + v.remoteProviders = append(v.remoteProviders, rp) + } + } + return nil +} + +func (v *Viper) providerPathExists(p *defaultRemoteProvider) bool { + for _, y := range v.remoteProviders { + if reflect.DeepEqual(y, p) { + return true + } + } + return false +} + +// searchMap recursively searches for a value for path in source map. +// Returns nil if not found. +// Note: This assumes that the path entries and map keys are lower cased. +func (v *Viper) searchMap(source map[string]any, path []string) any { + if len(path) == 0 { + return source + } + + next, ok := source[path[0]] + if ok { + // Fast path + if len(path) == 1 { + return next + } + + // Nested case + switch next := next.(type) { + case map[any]any: + return v.searchMap(cast.ToStringMap(next), path[1:]) + case map[string]any: + // Type assertion is safe here since it is only reached + // if the type of `next` is the same as the type being asserted + return v.searchMap(next, path[1:]) + default: + // got a value but nested key expected, return "nil" for not found + return nil + } + } + return nil +} + +// searchIndexableWithPathPrefixes recursively searches for a value for path in source map/slice. +// +// While searchMap() considers each path element as a single map key or slice index, this +// function searches for, and prioritizes, merged path elements. +// e.g., if in the source, "foo" is defined with a sub-key "bar", and "foo.bar" +// is also defined, this latter value is returned for path ["foo", "bar"]. +// +// This should be useful only at config level (other maps may not contain dots +// in their keys). +// +// Note: This assumes that the path entries and map keys are lower cased. +func (v *Viper) searchIndexableWithPathPrefixes(source any, path []string) any { + if len(path) == 0 { + return source + } + + // search for path prefixes, starting from the longest one + for i := len(path); i > 0; i-- { + prefixKey := strings.ToLower(strings.Join(path[0:i], v.keyDelim)) + + var val any + switch sourceIndexable := source.(type) { + case []any: + val = v.searchSliceWithPathPrefixes(sourceIndexable, prefixKey, i, path) + case map[string]any: + val = v.searchMapWithPathPrefixes(sourceIndexable, prefixKey, i, path) + } + if val != nil { + return val + } + } + + // not found + return nil +} + +// searchSliceWithPathPrefixes searches for a value for path in sourceSlice +// +// This function is part of the searchIndexableWithPathPrefixes recurring search and +// should not be called directly from functions other than searchIndexableWithPathPrefixes. +func (v *Viper) searchSliceWithPathPrefixes( + sourceSlice []any, + prefixKey string, + pathIndex int, + path []string, +) any { + // if the prefixKey is not a number or it is out of bounds of the slice + index, err := strconv.Atoi(prefixKey) + if err != nil || len(sourceSlice) <= index { + return nil + } + + next := sourceSlice[index] + + // Fast path + if pathIndex == len(path) { + return next + } + + switch n := next.(type) { + case map[any]any: + return v.searchIndexableWithPathPrefixes(cast.ToStringMap(n), path[pathIndex:]) + case map[string]any, []any: + return v.searchIndexableWithPathPrefixes(n, path[pathIndex:]) + default: + // got a value but nested key expected, do nothing and look for next prefix + } + + // not found + return nil +} + +// searchMapWithPathPrefixes searches for a value for path in sourceMap +// +// This function is part of the searchIndexableWithPathPrefixes recurring search and +// should not be called directly from functions other than searchIndexableWithPathPrefixes. +func (v *Viper) searchMapWithPathPrefixes( + sourceMap map[string]any, + prefixKey string, + pathIndex int, + path []string, +) any { + next, ok := sourceMap[prefixKey] + if !ok { + return nil + } + + // Fast path + if pathIndex == len(path) { + return next + } + + // Nested case + switch n := next.(type) { + case map[any]any: + return v.searchIndexableWithPathPrefixes(cast.ToStringMap(n), path[pathIndex:]) + case map[string]any, []any: + return v.searchIndexableWithPathPrefixes(n, path[pathIndex:]) + default: + // got a value but nested key expected, do nothing and look for next prefix + } + + // not found + return nil +} + +// isPathShadowedInDeepMap makes sure the given path is not shadowed somewhere +// on its path in the map. +// e.g., if "foo.bar" has a value in the given map, it “shadows” +// +// "foo.bar.baz" in a lower-priority map +func (v *Viper) isPathShadowedInDeepMap(path []string, m map[string]any) string { + var parentVal any + for i := 1; i < len(path); i++ { + parentVal = v.searchMap(m, path[0:i]) + if parentVal == nil { + // not found, no need to add more path elements + return "" + } + switch parentVal.(type) { + case map[any]any: + continue + case map[string]any: + continue + default: + // parentVal is a regular value which shadows "path" + return strings.Join(path[0:i], v.keyDelim) + } + } + return "" +} + +// isPathShadowedInFlatMap makes sure the given path is not shadowed somewhere +// in a sub-path of the map. +// e.g., if "foo.bar" has a value in the given map, it “shadows” +// +// "foo.bar.baz" in a lower-priority map +func (v *Viper) isPathShadowedInFlatMap(path []string, mi any) string { + // unify input map + var m map[string]interface{} + switch miv := mi.(type) { + case map[string]string: + m = castMapStringToMapInterface(miv) + case map[string]FlagValue: + m = castMapFlagToMapInterface(miv) + default: + return "" + } + + // scan paths + var parentKey string + for i := 1; i < len(path); i++ { + parentKey = strings.Join(path[0:i], v.keyDelim) + if _, ok := m[parentKey]; ok { + return parentKey + } + } + return "" +} + +// isPathShadowedInAutoEnv makes sure the given path is not shadowed somewhere +// in the environment, when automatic env is on. +// e.g., if "foo.bar" has a value in the environment, it “shadows” +// +// "foo.bar.baz" in a lower-priority map +func (v *Viper) isPathShadowedInAutoEnv(path []string) string { + var parentKey string + for i := 1; i < len(path); i++ { + parentKey = strings.Join(path[0:i], v.keyDelim) + if _, ok := v.getEnv(v.mergeWithEnvPrefix(parentKey)); ok { + return parentKey + } + } + return "" +} + +// SetTypeByDefaultValue enables or disables the inference of a key value's +// type when the Get function is used based upon a key's default value as +// opposed to the value returned based on the normal fetch logic. +// +// For example, if a key has a default value of []string{} and the same key +// is set via an environment variable to "a b c", a call to the Get function +// would return a string slice for the key if the key's type is inferred by +// the default value and the Get function would return: +// +// []string {"a", "b", "c"} +// +// Otherwise the Get function would return: +// +// "a b c" +func SetTypeByDefaultValue(enable bool) { v.SetTypeByDefaultValue(enable) } + +func (v *Viper) SetTypeByDefaultValue(enable bool) { + v.typeByDefValue = enable +} + +// GetViper gets the global Viper instance. +func GetViper() *Viper { + return v +} + +// Get can retrieve any value given the key to use. +// Get is case-insensitive for a key. +// Get has the behavior of returning the value associated with the first +// place from where it is set. Viper will check in the following order: +// override, flag, env, config file, key/value store, default +// +// Get returns an interface. For a specific value use one of the Get____ methods. +func Get(key string) any { return v.Get(key) } + +func (v *Viper) Get(key string) any { + lcaseKey := strings.ToLower(key) + val := v.find(lcaseKey, true) + if val == nil { + return nil + } + + if v.typeByDefValue { + // TODO(bep) this branch isn't covered by a single test. + valType := val + path := strings.Split(lcaseKey, v.keyDelim) + defVal := v.searchMap(v.defaults, path) + if defVal != nil { + valType = defVal + } + + switch valType.(type) { + case bool: + return cast.ToBool(val) + case string: + return cast.ToString(val) + case int32, int16, int8, int: + return cast.ToInt(val) + case uint: + return cast.ToUint(val) + case uint32: + return cast.ToUint32(val) + case uint64: + return cast.ToUint64(val) + case int64: + return cast.ToInt64(val) + case float64, float32: + return cast.ToFloat64(val) + case time.Time: + return cast.ToTime(val) + case time.Duration: + return cast.ToDuration(val) + case []string: + return cast.ToStringSlice(val) + case []int: + return cast.ToIntSlice(val) + case []time.Duration: + return cast.ToDurationSlice(val) + } + } + + return val +} + +// Sub returns new Viper instance representing a sub tree of this instance. +// Sub is case-insensitive for a key. +func Sub(key string) *Viper { return v.Sub(key) } + +func (v *Viper) Sub(key string) *Viper { + subv := New() + data := v.Get(key) + if data == nil { + return nil + } + + if reflect.TypeOf(data).Kind() == reflect.Map { + subv.parents = append([]string(nil), v.parents...) + subv.parents = append(subv.parents, strings.ToLower(key)) + subv.automaticEnvApplied = v.automaticEnvApplied + subv.envPrefix = v.envPrefix + subv.envKeyReplacer = v.envKeyReplacer + subv.config = cast.ToStringMap(data) + return subv + } + return nil +} + +// GetString returns the value associated with the key as a string. +func GetString(key string) string { return v.GetString(key) } + +func (v *Viper) GetString(key string) string { + return cast.ToString(v.Get(key)) +} + +// GetBool returns the value associated with the key as a boolean. +func GetBool(key string) bool { return v.GetBool(key) } + +func (v *Viper) GetBool(key string) bool { + return cast.ToBool(v.Get(key)) +} + +// GetInt returns the value associated with the key as an integer. +func GetInt(key string) int { return v.GetInt(key) } + +func (v *Viper) GetInt(key string) int { + return cast.ToInt(v.Get(key)) +} + +// GetInt32 returns the value associated with the key as an integer. +func GetInt32(key string) int32 { return v.GetInt32(key) } + +func (v *Viper) GetInt32(key string) int32 { + return cast.ToInt32(v.Get(key)) +} + +// GetInt64 returns the value associated with the key as an integer. +func GetInt64(key string) int64 { return v.GetInt64(key) } + +func (v *Viper) GetInt64(key string) int64 { + return cast.ToInt64(v.Get(key)) +} + +// GetUint returns the value associated with the key as an unsigned integer. +func GetUint(key string) uint { return v.GetUint(key) } + +func (v *Viper) GetUint(key string) uint { + return cast.ToUint(v.Get(key)) +} + +// GetUint16 returns the value associated with the key as an unsigned integer. +func GetUint16(key string) uint16 { return v.GetUint16(key) } + +func (v *Viper) GetUint16(key string) uint16 { + return cast.ToUint16(v.Get(key)) +} + +// GetUint32 returns the value associated with the key as an unsigned integer. +func GetUint32(key string) uint32 { return v.GetUint32(key) } + +func (v *Viper) GetUint32(key string) uint32 { + return cast.ToUint32(v.Get(key)) +} + +// GetUint64 returns the value associated with the key as an unsigned integer. +func GetUint64(key string) uint64 { return v.GetUint64(key) } + +func (v *Viper) GetUint64(key string) uint64 { + return cast.ToUint64(v.Get(key)) +} + +// GetFloat64 returns the value associated with the key as a float64. +func GetFloat64(key string) float64 { return v.GetFloat64(key) } + +func (v *Viper) GetFloat64(key string) float64 { + return cast.ToFloat64(v.Get(key)) +} + +// GetTime returns the value associated with the key as time. +func GetTime(key string) time.Time { return v.GetTime(key) } + +func (v *Viper) GetTime(key string) time.Time { + return cast.ToTime(v.Get(key)) +} + +// GetDuration returns the value associated with the key as a duration. +func GetDuration(key string) time.Duration { return v.GetDuration(key) } + +func (v *Viper) GetDuration(key string) time.Duration { + return cast.ToDuration(v.Get(key)) +} + +// GetIntSlice returns the value associated with the key as a slice of int values. +func GetIntSlice(key string) []int { return v.GetIntSlice(key) } + +func (v *Viper) GetIntSlice(key string) []int { + return cast.ToIntSlice(v.Get(key)) +} + +// GetStringSlice returns the value associated with the key as a slice of strings. +func GetStringSlice(key string) []string { return v.GetStringSlice(key) } + +func (v *Viper) GetStringSlice(key string) []string { + return cast.ToStringSlice(v.Get(key)) +} + +// GetStringMap returns the value associated with the key as a map of interfaces. +func GetStringMap(key string) map[string]any { return v.GetStringMap(key) } + +func (v *Viper) GetStringMap(key string) map[string]any { + return cast.ToStringMap(v.Get(key)) +} + +// GetStringMapString returns the value associated with the key as a map of strings. +func GetStringMapString(key string) map[string]string { return v.GetStringMapString(key) } + +func (v *Viper) GetStringMapString(key string) map[string]string { + return cast.ToStringMapString(v.Get(key)) +} + +// GetStringMapStringSlice returns the value associated with the key as a map to a slice of strings. +func GetStringMapStringSlice(key string) map[string][]string { return v.GetStringMapStringSlice(key) } + +func (v *Viper) GetStringMapStringSlice(key string) map[string][]string { + return cast.ToStringMapStringSlice(v.Get(key)) +} + +// GetSizeInBytes returns the size of the value associated with the given key +// in bytes. +func GetSizeInBytes(key string) uint { return v.GetSizeInBytes(key) } + +func (v *Viper) GetSizeInBytes(key string) uint { + sizeStr := cast.ToString(v.Get(key)) + return parseSizeInBytes(sizeStr) +} + +// UnmarshalKey takes a single key and unmarshals it into a Struct. +func UnmarshalKey(key string, rawVal any, opts ...DecoderConfigOption) error { + return v.UnmarshalKey(key, rawVal, opts...) +} + +func (v *Viper) UnmarshalKey(key string, rawVal any, opts ...DecoderConfigOption) error { + return decode(v.Get(key), defaultDecoderConfig(rawVal, opts...)) +} + +// Unmarshal unmarshals the config into a Struct. Make sure that the tags +// on the fields of the structure are properly set. +func Unmarshal(rawVal any, opts ...DecoderConfigOption) error { + return v.Unmarshal(rawVal, opts...) +} + +func (v *Viper) Unmarshal(rawVal any, opts ...DecoderConfigOption) error { + keys := v.AllKeys() + + if features.BindStruct { + // TODO: make this optional? + structKeys, err := v.decodeStructKeys(rawVal, opts...) + if err != nil { + return err + } + + keys = append(keys, structKeys...) + } + + // TODO: struct keys should be enough? + return decode(v.getSettings(keys), defaultDecoderConfig(rawVal, opts...)) +} + +func (v *Viper) decodeStructKeys(input any, opts ...DecoderConfigOption) ([]string, error) { + var structKeyMap map[string]any + + err := decode(input, defaultDecoderConfig(&structKeyMap, opts...)) + if err != nil { + return nil, err + } + + flattenedStructKeyMap := v.flattenAndMergeMap(map[string]bool{}, structKeyMap, "") + + r := make([]string, 0, len(flattenedStructKeyMap)) + for v := range flattenedStructKeyMap { + r = append(r, v) + } + + return r, nil +} + +// defaultDecoderConfig returns default mapstructure.DecoderConfig with support +// of time.Duration values & string slices. +func defaultDecoderConfig(output any, opts ...DecoderConfigOption) *mapstructure.DecoderConfig { + c := &mapstructure.DecoderConfig{ + Metadata: nil, + Result: output, + WeaklyTypedInput: true, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + ), + } + for _, opt := range opts { + opt(c) + } + return c +} + +// decode is a wrapper around mapstructure.Decode that mimics the WeakDecode functionality. +func decode(input any, config *mapstructure.DecoderConfig) error { + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + return decoder.Decode(input) +} + +// UnmarshalExact unmarshals the config into a Struct, erroring if a field is nonexistent +// in the destination struct. +func UnmarshalExact(rawVal any, opts ...DecoderConfigOption) error { + return v.UnmarshalExact(rawVal, opts...) +} + +func (v *Viper) UnmarshalExact(rawVal any, opts ...DecoderConfigOption) error { + config := defaultDecoderConfig(rawVal, opts...) + config.ErrorUnused = true + + keys := v.AllKeys() + + if features.BindStruct { + // TODO: make this optional? + structKeys, err := v.decodeStructKeys(rawVal, opts...) + if err != nil { + return err + } + + keys = append(keys, structKeys...) + } + + // TODO: struct keys should be enough? + return decode(v.getSettings(keys), config) +} + +// BindPFlags binds a full flag set to the configuration, using each flag's long +// name as the config key. +func BindPFlags(flags *pflag.FlagSet) error { return v.BindPFlags(flags) } + +func (v *Viper) BindPFlags(flags *pflag.FlagSet) error { + return v.BindFlagValues(pflagValueSet{flags}) +} + +// BindPFlag binds a specific key to a pflag (as used by cobra). +// Example (where serverCmd is a Cobra instance): +// +// serverCmd.Flags().Int("port", 1138, "Port to run Application server on") +// Viper.BindPFlag("port", serverCmd.Flags().Lookup("port")) +func BindPFlag(key string, flag *pflag.Flag) error { return v.BindPFlag(key, flag) } + +func (v *Viper) BindPFlag(key string, flag *pflag.Flag) error { + if flag == nil { + return fmt.Errorf("flag for %q is nil", key) + } + return v.BindFlagValue(key, pflagValue{flag}) +} + +// BindFlagValues binds a full FlagValue set to the configuration, using each flag's long +// name as the config key. +func BindFlagValues(flags FlagValueSet) error { return v.BindFlagValues(flags) } + +func (v *Viper) BindFlagValues(flags FlagValueSet) (err error) { + flags.VisitAll(func(flag FlagValue) { + if err = v.BindFlagValue(flag.Name(), flag); err != nil { + return + } + }) + return nil +} + +// BindFlagValue binds a specific key to a FlagValue. +func BindFlagValue(key string, flag FlagValue) error { return v.BindFlagValue(key, flag) } + +func (v *Viper) BindFlagValue(key string, flag FlagValue) error { + if flag == nil { + return fmt.Errorf("flag for %q is nil", key) + } + v.pflags[strings.ToLower(key)] = flag + return nil +} + +// BindEnv binds a Viper key to a ENV variable. +// ENV variables are case sensitive. +// If only a key is provided, it will use the env key matching the key, uppercased. +// If more arguments are provided, they will represent the env variable names that +// should bind to this key and will be taken in the specified order. +// EnvPrefix will be used when set when env name is not provided. +func BindEnv(input ...string) error { return v.BindEnv(input...) } + +func (v *Viper) BindEnv(input ...string) error { + if len(input) == 0 { + return fmt.Errorf("missing key to bind to") + } + + key := strings.ToLower(input[0]) + + if len(input) == 1 { + v.env[key] = append(v.env[key], v.mergeWithEnvPrefix(key)) + } else { + v.env[key] = append(v.env[key], input[1:]...) + } + + return nil +} + +// MustBindEnv wraps BindEnv in a panic. +// If there is an error binding an environment variable, MustBindEnv will +// panic. +func MustBindEnv(input ...string) { v.MustBindEnv(input...) } + +func (v *Viper) MustBindEnv(input ...string) { + if err := v.BindEnv(input...); err != nil { + panic(fmt.Sprintf("error while binding environment variable: %v", err)) + } +} + +// Given a key, find the value. +// +// Viper will check to see if an alias exists first. +// Viper will then check in the following order: +// flag, env, config file, key/value store. +// Lastly, if no value was found and flagDefault is true, and if the key +// corresponds to a flag, the flag's default value is returned. +// +// Note: this assumes a lower-cased key given. +func (v *Viper) find(lcaseKey string, flagDefault bool) any { + var ( + val any + exists bool + path = strings.Split(lcaseKey, v.keyDelim) + nested = len(path) > 1 + ) + + // compute the path through the nested maps to the nested value + if nested && v.isPathShadowedInDeepMap(path, castMapStringToMapInterface(v.aliases)) != "" { + return nil + } + + // if the requested key is an alias, then return the proper key + lcaseKey = v.realKey(lcaseKey) + path = strings.Split(lcaseKey, v.keyDelim) + nested = len(path) > 1 + + // Set() override first + val = v.searchMap(v.override, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.override) != "" { + return nil + } + + // PFlag override next + flag, exists := v.pflags[lcaseKey] + if exists && flag.HasChanged() { + switch flag.ValueType() { + case "int", "int8", "int16", "int32", "int64": + return cast.ToInt(flag.ValueString()) + case "bool": + return cast.ToBool(flag.ValueString()) + case "stringSlice", "stringArray": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return res + case "intSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return cast.ToIntSlice(res) + case "durationSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + slice := strings.Split(s, ",") + return cast.ToDurationSlice(slice) + case "stringToString": + return stringToStringConv(flag.ValueString()) + case "stringToInt": + return stringToIntConv(flag.ValueString()) + default: + return flag.ValueString() + } + } + if nested && v.isPathShadowedInFlatMap(path, v.pflags) != "" { + return nil + } + + // Env override next + if v.automaticEnvApplied { + envKey := strings.Join(append(v.parents, lcaseKey), ".") + // even if it hasn't been registered, if automaticEnv is used, + // check any Get request + if val, ok := v.getEnv(v.mergeWithEnvPrefix(envKey)); ok { + return val + } + if nested && v.isPathShadowedInAutoEnv(path) != "" { + return nil + } + } + envkeys, exists := v.env[lcaseKey] + if exists { + for _, envkey := range envkeys { + if val, ok := v.getEnv(envkey); ok { + return val + } + } + } + if nested && v.isPathShadowedInFlatMap(path, v.env) != "" { + return nil + } + + // Config file next + val = v.searchIndexableWithPathPrefixes(v.config, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.config) != "" { + return nil + } + + // K/V store next + val = v.searchMap(v.kvstore, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.kvstore) != "" { + return nil + } + + // Default next + val = v.searchMap(v.defaults, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.defaults) != "" { + return nil + } + + if flagDefault { + // last chance: if no value is found and a flag does exist for the key, + // get the flag's default value even if the flag's value has not been set. + if flag, exists := v.pflags[lcaseKey]; exists { + switch flag.ValueType() { + case "int", "int8", "int16", "int32", "int64": + return cast.ToInt(flag.ValueString()) + case "bool": + return cast.ToBool(flag.ValueString()) + case "stringSlice", "stringArray": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return res + case "intSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return cast.ToIntSlice(res) + case "stringToString": + return stringToStringConv(flag.ValueString()) + case "stringToInt": + return stringToIntConv(flag.ValueString()) + case "durationSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + slice := strings.Split(s, ",") + return cast.ToDurationSlice(slice) + default: + return flag.ValueString() + } + } + // last item, no need to check shadowing + } + + return nil +} + +func readAsCSV(val string) ([]string, error) { + if val == "" { + return []string{}, nil + } + stringReader := strings.NewReader(val) + csvReader := csv.NewReader(stringReader) + return csvReader.Read() +} + +// mostly copied from pflag's implementation of this operation here https://github.com/spf13/pflag/blob/master/string_to_string.go#L79 +// alterations are: errors are swallowed, map[string]any is returned in order to enable cast.ToStringMap. +func stringToStringConv(val string) any { + val = strings.Trim(val, "[]") + // An empty string would cause an empty map + if val == "" { + return map[string]any{} + } + r := csv.NewReader(strings.NewReader(val)) + ss, err := r.Read() + if err != nil { + return nil + } + out := make(map[string]any, len(ss)) + for _, pair := range ss { + k, vv, found := strings.Cut(pair, "=") + if !found { + return nil + } + out[k] = vv + } + return out +} + +// mostly copied from pflag's implementation of this operation here https://github.com/spf13/pflag/blob/d5e0c0615acee7028e1e2740a11102313be88de1/string_to_int.go#L68 +// alterations are: errors are swallowed, map[string]any is returned in order to enable cast.ToStringMap. +func stringToIntConv(val string) any { + val = strings.Trim(val, "[]") + // An empty string would cause an empty map + if val == "" { + return map[string]any{} + } + ss := strings.Split(val, ",") + out := make(map[string]any, len(ss)) + for _, pair := range ss { + k, vv, found := strings.Cut(pair, "=") + if !found { + return nil + } + var err error + out[k], err = strconv.Atoi(vv) + if err != nil { + return nil + } + } + return out +} + +// IsSet checks to see if the key has been set in any of the data locations. +// IsSet is case-insensitive for a key. +func IsSet(key string) bool { return v.IsSet(key) } + +func (v *Viper) IsSet(key string) bool { + lcaseKey := strings.ToLower(key) + val := v.find(lcaseKey, false) + return val != nil +} + +// AutomaticEnv makes Viper check if environment variables match any of the existing keys +// (config, default or flags). If matching env vars are found, they are loaded into Viper. +func AutomaticEnv() { v.AutomaticEnv() } + +func (v *Viper) AutomaticEnv() { + v.automaticEnvApplied = true +} + +// SetEnvKeyReplacer sets the strings.Replacer on the viper object +// Useful for mapping an environmental variable to a key that does +// not match it. +func SetEnvKeyReplacer(r *strings.Replacer) { v.SetEnvKeyReplacer(r) } + +func (v *Viper) SetEnvKeyReplacer(r *strings.Replacer) { + v.envKeyReplacer = r +} + +// RegisterAlias creates an alias that provides another accessor for the same key. +// This enables one to change a name without breaking the application. +func RegisterAlias(alias, key string) { v.RegisterAlias(alias, key) } + +func (v *Viper) RegisterAlias(alias, key string) { + v.registerAlias(alias, strings.ToLower(key)) +} + +func (v *Viper) registerAlias(alias, key string) { + alias = strings.ToLower(alias) + if alias != key && alias != v.realKey(key) { + _, exists := v.aliases[alias] + + if !exists { + // if we alias something that exists in one of the maps to another + // name, we'll never be able to get that value using the original + // name, so move the config value to the new realkey. + if val, ok := v.config[alias]; ok { + delete(v.config, alias) + v.config[key] = val + } + if val, ok := v.kvstore[alias]; ok { + delete(v.kvstore, alias) + v.kvstore[key] = val + } + if val, ok := v.defaults[alias]; ok { + delete(v.defaults, alias) + v.defaults[key] = val + } + if val, ok := v.override[alias]; ok { + delete(v.override, alias) + v.override[key] = val + } + v.aliases[alias] = key + } + } else { + v.logger.Warn("creating circular reference alias", "alias", alias, "key", key, "real_key", v.realKey(key)) + } +} + +func (v *Viper) realKey(key string) string { + newkey, exists := v.aliases[key] + if exists { + v.logger.Debug("key is an alias", "alias", key, "to", newkey) + + return v.realKey(newkey) + } + return key +} + +// InConfig checks to see if the given key (or an alias) is in the config file. +func InConfig(key string) bool { return v.InConfig(key) } + +func (v *Viper) InConfig(key string) bool { + lcaseKey := strings.ToLower(key) + + // if the requested key is an alias, then return the proper key + lcaseKey = v.realKey(lcaseKey) + path := strings.Split(lcaseKey, v.keyDelim) + + return v.searchIndexableWithPathPrefixes(v.config, path) != nil +} + +// SetDefault sets the default value for this key. +// SetDefault is case-insensitive for a key. +// Default only used when no value is provided by the user via flag, config or ENV. +func SetDefault(key string, value any) { v.SetDefault(key, value) } + +func (v *Viper) SetDefault(key string, value any) { + // If alias passed in, then set the proper default + key = v.realKey(strings.ToLower(key)) + value = toCaseInsensitiveValue(value) + + path := strings.Split(key, v.keyDelim) + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(v.defaults, path[0:len(path)-1]) + + // set innermost value + deepestMap[lastKey] = value +} + +// Set sets the value for the key in the override register. +// Set is case-insensitive for a key. +// Will be used instead of values obtained via +// flags, config file, ENV, default, or key/value store. +func Set(key string, value any) { v.Set(key, value) } + +func (v *Viper) Set(key string, value any) { + // If alias passed in, then set the proper override + key = v.realKey(strings.ToLower(key)) + value = toCaseInsensitiveValue(value) + + path := strings.Split(key, v.keyDelim) + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(v.override, path[0:len(path)-1]) + + // set innermost value + deepestMap[lastKey] = value +} + +// ReadInConfig will discover and load the configuration file from disk +// and key/value stores, searching in one of the defined paths. +func ReadInConfig() error { return v.ReadInConfig() } + +func (v *Viper) ReadInConfig() error { + v.logger.Info("attempting to read in config file") + filename, err := v.getConfigFile() + if err != nil { + return err + } + + if !stringInSlice(v.getConfigType(), SupportedExts) { + return UnsupportedConfigError(v.getConfigType()) + } + + v.logger.Debug("reading file", "file", filename) + file, err := afero.ReadFile(v.fs, filename) + if err != nil { + return err + } + + config := make(map[string]any) + + err = v.unmarshalReader(bytes.NewReader(file), config) + if err != nil { + return err + } + + v.config = config + return nil +} + +// MergeInConfig merges a new configuration with an existing config. +func MergeInConfig() error { return v.MergeInConfig() } + +func (v *Viper) MergeInConfig() error { + v.logger.Info("attempting to merge in config file") + filename, err := v.getConfigFile() + if err != nil { + return err + } + + if !stringInSlice(v.getConfigType(), SupportedExts) { + return UnsupportedConfigError(v.getConfigType()) + } + + file, err := afero.ReadFile(v.fs, filename) + if err != nil { + return err + } + + return v.MergeConfig(bytes.NewReader(file)) +} + +// ReadConfig will read a configuration file, setting existing keys to nil if the +// key does not exist in the file. +func ReadConfig(in io.Reader) error { return v.ReadConfig(in) } + +func (v *Viper) ReadConfig(in io.Reader) error { + v.config = make(map[string]any) + return v.unmarshalReader(in, v.config) +} + +// MergeConfig merges a new configuration with an existing config. +func MergeConfig(in io.Reader) error { return v.MergeConfig(in) } + +func (v *Viper) MergeConfig(in io.Reader) error { + cfg := make(map[string]any) + if err := v.unmarshalReader(in, cfg); err != nil { + return err + } + return v.MergeConfigMap(cfg) +} + +// MergeConfigMap merges the configuration from the map given with an existing config. +// Note that the map given may be modified. +func MergeConfigMap(cfg map[string]any) error { return v.MergeConfigMap(cfg) } + +func (v *Viper) MergeConfigMap(cfg map[string]any) error { + if v.config == nil { + v.config = make(map[string]any) + } + insensitiviseMap(cfg) + mergeMaps(cfg, v.config, nil) + return nil +} + +// WriteConfig writes the current configuration to a file. +func WriteConfig() error { return v.WriteConfig() } + +func (v *Viper) WriteConfig() error { + filename, err := v.getConfigFile() + if err != nil { + return err + } + return v.writeConfig(filename, true) +} + +// SafeWriteConfig writes current configuration to file only if the file does not exist. +func SafeWriteConfig() error { return v.SafeWriteConfig() } + +func (v *Viper) SafeWriteConfig() error { + if len(v.configPaths) < 1 { + return errors.New("missing configuration for 'configPath'") + } + return v.SafeWriteConfigAs(filepath.Join(v.configPaths[0], v.configName+"."+v.configType)) +} + +// WriteConfigAs writes current configuration to a given filename. +func WriteConfigAs(filename string) error { return v.WriteConfigAs(filename) } + +func (v *Viper) WriteConfigAs(filename string) error { + return v.writeConfig(filename, true) +} + +// SafeWriteConfigAs writes current configuration to a given filename if it does not exist. +func SafeWriteConfigAs(filename string) error { return v.SafeWriteConfigAs(filename) } + +func (v *Viper) SafeWriteConfigAs(filename string) error { + alreadyExists, err := afero.Exists(v.fs, filename) + if alreadyExists && err == nil { + return ConfigFileAlreadyExistsError(filename) + } + return v.writeConfig(filename, false) +} + +func (v *Viper) writeConfig(filename string, force bool) error { + v.logger.Info("attempting to write configuration to file") + + var configType string + + ext := filepath.Ext(filename) + if ext != "" && ext != filepath.Base(filename) { + configType = ext[1:] + } else { + configType = v.configType + } + if configType == "" { + return fmt.Errorf("config type could not be determined for %s", filename) + } + + if !stringInSlice(configType, SupportedExts) { + return UnsupportedConfigError(configType) + } + if v.config == nil { + v.config = make(map[string]any) + } + flags := os.O_CREATE | os.O_TRUNC | os.O_WRONLY + if !force { + flags |= os.O_EXCL + } + f, err := v.fs.OpenFile(filename, flags, v.configPermissions) + if err != nil { + return err + } + defer f.Close() + + if err := v.marshalWriter(f, configType); err != nil { + return err + } + + return f.Sync() +} + +func (v *Viper) unmarshalReader(in io.Reader, c map[string]any) error { + buf := new(bytes.Buffer) + buf.ReadFrom(in) + + switch format := strings.ToLower(v.getConfigType()); format { + case "yaml", "yml", "json", "toml", "hcl", "tfvars", "ini", "properties", "props", "prop", "dotenv", "env": + err := v.decoderRegistry.Decode(format, buf.Bytes(), c) + if err != nil { + return ConfigParseError{err} + } + } + + insensitiviseMap(c) + return nil +} + +// Marshal a map into Writer. +func (v *Viper) marshalWriter(f afero.File, configType string) error { + c := v.AllSettings() + switch configType { + case "yaml", "yml", "json", "toml", "hcl", "tfvars", "ini", "prop", "props", "properties", "dotenv", "env": + b, err := v.encoderRegistry.Encode(configType, c) + if err != nil { + return ConfigMarshalError{err} + } + + _, err = f.WriteString(string(b)) + if err != nil { + return ConfigMarshalError{err} + } + } + return nil +} + +func keyExists(k string, m map[string]any) string { + lk := strings.ToLower(k) + for mk := range m { + lmk := strings.ToLower(mk) + if lmk == lk { + return mk + } + } + return "" +} + +func castToMapStringInterface( + src map[any]any, +) map[string]any { + tgt := map[string]any{} + for k, v := range src { + tgt[fmt.Sprintf("%v", k)] = v + } + return tgt +} + +func castMapStringSliceToMapInterface(src map[string][]string) map[string]any { + tgt := map[string]any{} + for k, v := range src { + tgt[k] = v + } + return tgt +} + +func castMapStringToMapInterface(src map[string]string) map[string]any { + tgt := map[string]any{} + for k, v := range src { + tgt[k] = v + } + return tgt +} + +func castMapFlagToMapInterface(src map[string]FlagValue) map[string]any { + tgt := map[string]any{} + for k, v := range src { + tgt[k] = v + } + return tgt +} + +// mergeMaps merges two maps. The `itgt` parameter is for handling go-yaml's +// insistence on parsing nested structures as `map[any]any` +// instead of using a `string` as the key for nest structures beyond one level +// deep. Both map types are supported as there is a go-yaml fork that uses +// `map[string]any` instead. +func mergeMaps(src, tgt map[string]any, itgt map[any]any) { + for sk, sv := range src { + tk := keyExists(sk, tgt) + if tk == "" { + v.logger.Debug("", "tk", "\"\"", fmt.Sprintf("tgt[%s]", sk), sv) + tgt[sk] = sv + if itgt != nil { + itgt[sk] = sv + } + continue + } + + tv, ok := tgt[tk] + if !ok { + v.logger.Debug("", fmt.Sprintf("ok[%s]", tk), false, fmt.Sprintf("tgt[%s]", sk), sv) + tgt[sk] = sv + if itgt != nil { + itgt[sk] = sv + } + continue + } + + svType := reflect.TypeOf(sv) + tvType := reflect.TypeOf(tv) + + v.logger.Debug( + "processing", + "key", sk, + "st", svType, + "tt", tvType, + "sv", sv, + "tv", tv, + ) + + switch ttv := tv.(type) { + case map[any]any: + v.logger.Debug("merging maps (must convert)") + tsv, ok := sv.(map[any]any) + if !ok { + v.logger.Error( + "Could not cast sv to map[any]any", + "key", sk, + "st", svType, + "tt", tvType, + "sv", sv, + "tv", tv, + ) + continue + } + + ssv := castToMapStringInterface(tsv) + stv := castToMapStringInterface(ttv) + mergeMaps(ssv, stv, ttv) + case map[string]any: + v.logger.Debug("merging maps") + tsv, ok := sv.(map[string]any) + if !ok { + v.logger.Error( + "Could not cast sv to map[string]any", + "key", sk, + "st", svType, + "tt", tvType, + "sv", sv, + "tv", tv, + ) + continue + } + mergeMaps(tsv, ttv, nil) + default: + v.logger.Debug("setting value") + tgt[tk] = sv + if itgt != nil { + itgt[tk] = sv + } + } + } +} + +// ReadRemoteConfig attempts to get configuration from a remote source +// and read it in the remote configuration registry. +func ReadRemoteConfig() error { return v.ReadRemoteConfig() } + +func (v *Viper) ReadRemoteConfig() error { + return v.getKeyValueConfig() +} + +func WatchRemoteConfig() error { return v.WatchRemoteConfig() } +func (v *Viper) WatchRemoteConfig() error { + return v.watchKeyValueConfig() +} + +func (v *Viper) WatchRemoteConfigOnChannel() error { + return v.watchKeyValueConfigOnChannel() +} + +// Retrieve the first found remote configuration. +func (v *Viper) getKeyValueConfig() error { + if RemoteConfig == nil { + return RemoteConfigError("Enable the remote features by doing a blank import of the viper/remote package: '_ github.com/spf13/viper/remote'") + } + + if len(v.remoteProviders) == 0 { + return RemoteConfigError("No Remote Providers") + } + + for _, rp := range v.remoteProviders { + val, err := v.getRemoteConfig(rp) + if err != nil { + v.logger.Error(fmt.Errorf("get remote config: %w", err).Error()) + + continue + } + + v.kvstore = val + + return nil + } + return RemoteConfigError("No Files Found") +} + +func (v *Viper) getRemoteConfig(provider RemoteProvider) (map[string]any, error) { + reader, err := RemoteConfig.Get(provider) + if err != nil { + return nil, err + } + err = v.unmarshalReader(reader, v.kvstore) + return v.kvstore, err +} + +// Retrieve the first found remote configuration. +func (v *Viper) watchKeyValueConfigOnChannel() error { + if len(v.remoteProviders) == 0 { + return RemoteConfigError("No Remote Providers") + } + + for _, rp := range v.remoteProviders { + respc, _ := RemoteConfig.WatchChannel(rp) + // Todo: Add quit channel + go func(rc <-chan *RemoteResponse) { + for { + b := <-rc + reader := bytes.NewReader(b.Value) + v.unmarshalReader(reader, v.kvstore) + } + }(respc) + return nil + } + return RemoteConfigError("No Files Found") +} + +// Retrieve the first found remote configuration. +func (v *Viper) watchKeyValueConfig() error { + if len(v.remoteProviders) == 0 { + return RemoteConfigError("No Remote Providers") + } + + for _, rp := range v.remoteProviders { + val, err := v.watchRemoteConfig(rp) + if err != nil { + v.logger.Error(fmt.Errorf("watch remote config: %w", err).Error()) + + continue + } + v.kvstore = val + return nil + } + return RemoteConfigError("No Files Found") +} + +func (v *Viper) watchRemoteConfig(provider RemoteProvider) (map[string]any, error) { + reader, err := RemoteConfig.Watch(provider) + if err != nil { + return nil, err + } + err = v.unmarshalReader(reader, v.kvstore) + return v.kvstore, err +} + +// AllKeys returns all keys holding a value, regardless of where they are set. +// Nested keys are returned with a v.keyDelim separator. +func AllKeys() []string { return v.AllKeys() } + +func (v *Viper) AllKeys() []string { + m := map[string]bool{} + // add all paths, by order of descending priority to ensure correct shadowing + m = v.flattenAndMergeMap(m, castMapStringToMapInterface(v.aliases), "") + m = v.flattenAndMergeMap(m, v.override, "") + m = v.mergeFlatMap(m, castMapFlagToMapInterface(v.pflags)) + m = v.mergeFlatMap(m, castMapStringSliceToMapInterface(v.env)) + m = v.flattenAndMergeMap(m, v.config, "") + m = v.flattenAndMergeMap(m, v.kvstore, "") + m = v.flattenAndMergeMap(m, v.defaults, "") + + // convert set of paths to list + a := make([]string, 0, len(m)) + for x := range m { + a = append(a, x) + } + return a +} + +// flattenAndMergeMap recursively flattens the given map into a map[string]bool +// of key paths (used as a set, easier to manipulate than a []string): +// - each path is merged into a single key string, delimited with v.keyDelim +// - if a path is shadowed by an earlier value in the initial shadow map, +// it is skipped. +// +// The resulting set of paths is merged to the given shadow set at the same time. +func (v *Viper) flattenAndMergeMap(shadow map[string]bool, m map[string]any, prefix string) map[string]bool { + if shadow != nil && prefix != "" && shadow[prefix] { + // prefix is shadowed => nothing more to flatten + return shadow + } + if shadow == nil { + shadow = make(map[string]bool) + } + + var m2 map[string]any + if prefix != "" { + prefix += v.keyDelim + } + for k, val := range m { + fullKey := prefix + k + switch val := val.(type) { + case map[string]any: + m2 = val + case map[any]any: + m2 = cast.ToStringMap(val) + default: + // immediate value + shadow[strings.ToLower(fullKey)] = true + continue + } + // recursively merge to shadow map + shadow = v.flattenAndMergeMap(shadow, m2, fullKey) + } + return shadow +} + +// mergeFlatMap merges the given maps, excluding values of the second map +// shadowed by values from the first map. +func (v *Viper) mergeFlatMap(shadow map[string]bool, m map[string]any) map[string]bool { + // scan keys +outer: + for k := range m { + path := strings.Split(k, v.keyDelim) + // scan intermediate paths + var parentKey string + for i := 1; i < len(path); i++ { + parentKey = strings.Join(path[0:i], v.keyDelim) + if shadow[parentKey] { + // path is shadowed, continue + continue outer + } + } + // add key + shadow[strings.ToLower(k)] = true + } + return shadow +} + +// AllSettings merges all settings and returns them as a map[string]any. +func AllSettings() map[string]any { return v.AllSettings() } + +func (v *Viper) AllSettings() map[string]any { + return v.getSettings(v.AllKeys()) +} + +func (v *Viper) getSettings(keys []string) map[string]any { + m := map[string]any{} + // start from the list of keys, and construct the map one value at a time + for _, k := range keys { + value := v.Get(k) + if value == nil { + // should not happen, since AllKeys() returns only keys holding a value, + // check just in case anything changes + continue + } + path := strings.Split(k, v.keyDelim) + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(m, path[0:len(path)-1]) + // set innermost value + deepestMap[lastKey] = value + } + return m +} + +// SetFs sets the filesystem to use to read configuration. +func SetFs(fs afero.Fs) { v.SetFs(fs) } + +func (v *Viper) SetFs(fs afero.Fs) { + v.fs = fs +} + +// SetConfigName sets name for the config file. +// Does not include extension. +func SetConfigName(in string) { v.SetConfigName(in) } + +func (v *Viper) SetConfigName(in string) { + if in != "" { + v.configName = in + v.configFile = "" + } +} + +// SetConfigType sets the type of the configuration returned by the +// remote source, e.g. "json". +func SetConfigType(in string) { v.SetConfigType(in) } + +func (v *Viper) SetConfigType(in string) { + if in != "" { + v.configType = in + } +} + +// SetConfigPermissions sets the permissions for the config file. +func SetConfigPermissions(perm os.FileMode) { v.SetConfigPermissions(perm) } + +func (v *Viper) SetConfigPermissions(perm os.FileMode) { + v.configPermissions = perm.Perm() +} + +// IniLoadOptions sets the load options for ini parsing. +func IniLoadOptions(in ini.LoadOptions) Option { + return optionFunc(func(v *Viper) { + v.iniLoadOptions = in + }) +} + +func (v *Viper) getConfigType() string { + if v.configType != "" { + return v.configType + } + + cf, err := v.getConfigFile() + if err != nil { + return "" + } + + ext := filepath.Ext(cf) + + if len(ext) > 1 { + return ext[1:] + } + + return "" +} + +func (v *Viper) getConfigFile() (string, error) { + if v.configFile == "" { + cf, err := v.findConfigFile() + if err != nil { + return "", err + } + v.configFile = cf + } + return v.configFile, nil +} + +// Debug prints all configuration registries for debugging +// purposes. +func Debug() { v.Debug() } +func DebugTo(w io.Writer) { v.DebugTo(w) } + +func (v *Viper) Debug() { v.DebugTo(os.Stdout) } + +func (v *Viper) DebugTo(w io.Writer) { + fmt.Fprintf(w, "Aliases:\n%#v\n", v.aliases) + fmt.Fprintf(w, "Override:\n%#v\n", v.override) + fmt.Fprintf(w, "PFlags:\n%#v\n", v.pflags) + fmt.Fprintf(w, "Env:\n%#v\n", v.env) + fmt.Fprintf(w, "Key/Value Store:\n%#v\n", v.kvstore) + fmt.Fprintf(w, "Config:\n%#v\n", v.config) + fmt.Fprintf(w, "Defaults:\n%#v\n", v.defaults) +} diff --git a/vendor/github.com/subosito/gotenv/.env b/vendor/github.com/subosito/gotenv/.env new file mode 100644 index 0000000000..6405eca71f --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.env @@ -0,0 +1 @@ +HELLO=world diff --git a/vendor/github.com/subosito/gotenv/.env.invalid b/vendor/github.com/subosito/gotenv/.env.invalid new file mode 100644 index 0000000000..016d5e0cea --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.env.invalid @@ -0,0 +1 @@ +lol$wut diff --git a/vendor/github.com/subosito/gotenv/.gitignore b/vendor/github.com/subosito/gotenv/.gitignore new file mode 100644 index 0000000000..7db37c1db4 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.gitignore @@ -0,0 +1,4 @@ +*.test +*.out +annotate.json +profile.cov diff --git a/vendor/github.com/subosito/gotenv/.golangci.yaml b/vendor/github.com/subosito/gotenv/.golangci.yaml new file mode 100644 index 0000000000..8c82a762e2 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.golangci.yaml @@ -0,0 +1,7 @@ +# Options for analysis running. +run: + timeout: 1m + +linters-settings: + gofmt: + simplify: true diff --git a/vendor/github.com/subosito/gotenv/CHANGELOG.md b/vendor/github.com/subosito/gotenv/CHANGELOG.md new file mode 100644 index 0000000000..c4fe7d3268 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/CHANGELOG.md @@ -0,0 +1,105 @@ +# Changelog + +## [1.5.0] - 2023-08-15 + +### Fixed + +- Use io.Reader instead of custom Reader + +## [1.5.0] - 2023-08-15 + +### Added + +- Support for reading UTF16 files + +### Fixed + +- Scanner error handling +- Reader error handling + +## [1.4.2] - 2023-01-11 + +### Fixed + +- Env var initialization + +### Changed + +- More consitent line splitting + +## [1.4.1] - 2022-08-23 + +### Fixed + +- Missing file close + +### Changed + +- Updated dependencies + +## [1.4.0] - 2022-06-02 + +### Added + +- Add `Marshal` and `Unmarshal` helpers + +### Changed + +- The CI will now run a linter and the tests on PRs. + +## [1.3.0] - 2022-05-23 + +### Added + +- Support = within double-quoted strings +- Add support for multiline values + +### Changed + +- `OverLoad` prefer environment variables over local variables + +## [1.2.0] - 2019-08-03 + +### Added + +- Add `Must` helper to raise an error as panic. It can be used with `Load` and `OverLoad`. +- Add more tests to be 100% coverage. +- Add CHANGELOG +- Add more OS for the test: OSX and Windows + +### Changed + +- Reduce complexity and improve source code for having `A+` score in [goreportcard](https://goreportcard.com/report/github.com/subosito/gotenv). +- Updated README with mentions to all available functions + +### Removed + +- Remove `ErrFormat` +- Remove `MustLoad` and `MustOverload`, replaced with `Must` helper. + +## [1.1.1] - 2018-06-05 + +### Changed + +- Replace `os.Getenv` with `os.LookupEnv` to ensure that the environment variable is not set, by [radding](https://github.com/radding) + +## [1.1.0] - 2017-03-20 + +### Added + +- Supports carriage return in env +- Handle files with UTF-8 BOM + +### Changed + +- Whitespace handling + +### Fixed + +- Incorrect variable expansion +- Handling escaped '$' characters + +## [1.0.0] - 2014-10-05 + +First stable release. + diff --git a/vendor/github.com/subosito/gotenv/LICENSE b/vendor/github.com/subosito/gotenv/LICENSE new file mode 100644 index 0000000000..f64ccaedc3 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Alif Rachmawadi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/subosito/gotenv/README.md b/vendor/github.com/subosito/gotenv/README.md new file mode 100644 index 0000000000..fc9616e3b0 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/README.md @@ -0,0 +1,129 @@ +# gotenv + +[![Build Status](https://github.com/subosito/gotenv/workflows/Go%20workflow/badge.svg)](https://github.com/subosito/gotenv/actions) +[![Coverage Status](https://badgen.net/codecov/c/github/subosito/gotenv)](https://codecov.io/gh/subosito/gotenv) +[![Go Report Card](https://goreportcard.com/badge/github.com/subosito/gotenv)](https://goreportcard.com/report/github.com/subosito/gotenv) +[![GoDoc](https://godoc.org/github.com/subosito/gotenv?status.svg)](https://godoc.org/github.com/subosito/gotenv) + +Load environment variables from `.env` or `io.Reader` in Go. + +## Usage + +Put the gotenv package on your `import` statement: + +```go +import "github.com/subosito/gotenv" +``` + +To modify your app environment variables, `gotenv` expose 2 main functions: + +- `gotenv.Load` +- `gotenv.Apply` + +By default, `gotenv.Load` will look for a file called `.env` in the current working directory. + +Behind the scene, it will then load `.env` file and export the valid variables to the environment variables. Make sure you call the method as soon as possible to ensure it loads all variables, say, put it on `init()` function. + +Once loaded you can use `os.Getenv()` to get the value of the variable. + +Let's say you have `.env` file: + +```sh +APP_ID=1234567 +APP_SECRET=abcdef +``` + +Here's the example of your app: + +```go +package main + +import ( + "github.com/subosito/gotenv" + "log" + "os" +) + +func init() { + gotenv.Load() +} + +func main() { + log.Println(os.Getenv("APP_ID")) // "1234567" + log.Println(os.Getenv("APP_SECRET")) // "abcdef" +} +``` + +You can also load other than `.env` file if you wish. Just supply filenames when calling `Load()`. It will load them in order and the first value set for a variable will win.: + +```go +gotenv.Load(".env.production", "credentials") +``` + +While `gotenv.Load` loads entries from `.env` file, `gotenv.Apply` allows you to use any `io.Reader`: + +```go +gotenv.Apply(strings.NewReader("APP_ID=1234567")) + +log.Println(os.Getenv("APP_ID")) +// Output: "1234567" +``` + +Both `gotenv.Load` and `gotenv.Apply` **DO NOT** overrides existing environment variables. If you want to override existing ones, you can see section below. + +### Environment Overrides + +Besides above functions, `gotenv` also provides another functions that overrides existing: + +- `gotenv.OverLoad` +- `gotenv.OverApply` + +Here's the example of this overrides behavior: + +```go +os.Setenv("HELLO", "world") + +// NOTE: using Apply existing value will be reserved +gotenv.Apply(strings.NewReader("HELLO=universe")) +fmt.Println(os.Getenv("HELLO")) +// Output: "world" + +// NOTE: using OverApply existing value will be overridden +gotenv.OverApply(strings.NewReader("HELLO=universe")) +fmt.Println(os.Getenv("HELLO")) +// Output: "universe" +``` + +### Throw a Panic + +Both `gotenv.Load` and `gotenv.OverLoad` returns an error on something wrong occurred, like your env file is not exist, and so on. To make it easier to use, `gotenv` also provides `gotenv.Must` helper, to let it panic when an error returned. + +```go +err := gotenv.Load(".env-is-not-exist") +fmt.Println("error", err) +// error: open .env-is-not-exist: no such file or directory + +gotenv.Must(gotenv.Load, ".env-is-not-exist") +// it will throw a panic +// panic: open .env-is-not-exist: no such file or directory +``` + +### Another Scenario + +Just in case you want to parse environment variables from any `io.Reader`, gotenv keeps its `Parse` and `StrictParse` function as public API so you can use that. + +```go +// import "strings" + +pairs := gotenv.Parse(strings.NewReader("FOO=test\nBAR=$FOO")) +// gotenv.Env{"FOO": "test", "BAR": "test"} + +pairs, err := gotenv.StrictParse(strings.NewReader(`FOO="bar"`)) +// gotenv.Env{"FOO": "bar"} +``` + +`Parse` ignores invalid lines and returns `Env` of valid environment variables, while `StrictParse` returns an error for invalid lines. + +## Notes + +The gotenv package is a Go port of [`dotenv`](https://github.com/bkeepers/dotenv) project with some additions made for Go. For general features, it aims to be compatible as close as possible. diff --git a/vendor/github.com/subosito/gotenv/gotenv.go b/vendor/github.com/subosito/gotenv/gotenv.go new file mode 100644 index 0000000000..1191d35874 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/gotenv.go @@ -0,0 +1,409 @@ +// Package gotenv provides functionality to dynamically load the environment variables +package gotenv + +import ( + "bufio" + "bytes" + "fmt" + "io" + "os" + "path/filepath" + "regexp" + "sort" + "strconv" + "strings" + + "golang.org/x/text/encoding/unicode" + "golang.org/x/text/transform" +) + +const ( + // Pattern for detecting valid line format + linePattern = `\A\s*(?:export\s+)?([\w\.]+)(?:\s*=\s*|:\s+?)('(?:\'|[^'])*'|"(?:\"|[^"])*"|[^#\n]+)?\s*(?:\s*\#.*)?\z` + + // Pattern for detecting valid variable within a value + variablePattern = `(\\)?(\$)(\{?([A-Z0-9_]+)?\}?)` +) + +// Byte order mark character +var ( + bomUTF8 = []byte("\xEF\xBB\xBF") + bomUTF16LE = []byte("\xFF\xFE") + bomUTF16BE = []byte("\xFE\xFF") +) + +// Env holds key/value pair of valid environment variable +type Env map[string]string + +// Load is a function to load a file or multiple files and then export the valid variables into environment variables if they do not exist. +// When it's called with no argument, it will load `.env` file on the current path and set the environment variables. +// Otherwise, it will loop over the filenames parameter and set the proper environment variables. +func Load(filenames ...string) error { + return loadenv(false, filenames...) +} + +// OverLoad is a function to load a file or multiple files and then export and override the valid variables into environment variables. +func OverLoad(filenames ...string) error { + return loadenv(true, filenames...) +} + +// Must is wrapper function that will panic when supplied function returns an error. +func Must(fn func(filenames ...string) error, filenames ...string) { + if err := fn(filenames...); err != nil { + panic(err.Error()) + } +} + +// Apply is a function to load an io Reader then export the valid variables into environment variables if they do not exist. +func Apply(r io.Reader) error { + return parset(r, false) +} + +// OverApply is a function to load an io Reader then export and override the valid variables into environment variables. +func OverApply(r io.Reader) error { + return parset(r, true) +} + +func loadenv(override bool, filenames ...string) error { + if len(filenames) == 0 { + filenames = []string{".env"} + } + + for _, filename := range filenames { + f, err := os.Open(filename) + if err != nil { + return err + } + + err = parset(f, override) + f.Close() + if err != nil { + return err + } + } + + return nil +} + +// parse and set :) +func parset(r io.Reader, override bool) error { + env, err := strictParse(r, override) + if err != nil { + return err + } + + for key, val := range env { + setenv(key, val, override) + } + + return nil +} + +func setenv(key, val string, override bool) { + if override { + os.Setenv(key, val) + } else { + if _, present := os.LookupEnv(key); !present { + os.Setenv(key, val) + } + } +} + +// Parse is a function to parse line by line any io.Reader supplied and returns the valid Env key/value pair of valid variables. +// It expands the value of a variable from the environment variable but does not set the value to the environment itself. +// This function is skipping any invalid lines and only processing the valid one. +func Parse(r io.Reader) Env { + env, _ := strictParse(r, false) + return env +} + +// StrictParse is a function to parse line by line any io.Reader supplied and returns the valid Env key/value pair of valid variables. +// It expands the value of a variable from the environment variable but does not set the value to the environment itself. +// This function is returning an error if there are any invalid lines. +func StrictParse(r io.Reader) (Env, error) { + return strictParse(r, false) +} + +// Read is a function to parse a file line by line and returns the valid Env key/value pair of valid variables. +// It expands the value of a variable from the environment variable but does not set the value to the environment itself. +// This function is skipping any invalid lines and only processing the valid one. +func Read(filename string) (Env, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + return strictParse(f, false) +} + +// Unmarshal reads a string line by line and returns the valid Env key/value pair of valid variables. +// It expands the value of a variable from the environment variable but does not set the value to the environment itself. +// This function is returning an error if there are any invalid lines. +func Unmarshal(str string) (Env, error) { + return strictParse(strings.NewReader(str), false) +} + +// Marshal outputs the given environment as a env file. +// Variables will be sorted by name. +func Marshal(env Env) (string, error) { + lines := make([]string, 0, len(env)) + for k, v := range env { + if d, err := strconv.Atoi(v); err == nil { + lines = append(lines, fmt.Sprintf(`%s=%d`, k, d)) + } else { + lines = append(lines, fmt.Sprintf(`%s=%q`, k, v)) + } + } + sort.Strings(lines) + return strings.Join(lines, "\n"), nil +} + +// Write serializes the given environment and writes it to a file +func Write(env Env, filename string) error { + content, err := Marshal(env) + if err != nil { + return err + } + // ensure the path exists + if err := os.MkdirAll(filepath.Dir(filename), 0o775); err != nil { + return err + } + // create or truncate the file + file, err := os.Create(filename) + if err != nil { + return err + } + defer file.Close() + _, err = file.WriteString(content + "\n") + if err != nil { + return err + } + + return file.Sync() +} + +// splitLines is a valid SplitFunc for a bufio.Scanner. It will split lines on CR ('\r'), LF ('\n') or CRLF (any of the three sequences). +// If a CR is immediately followed by a LF, it is treated as a CRLF (one single line break). +func splitLines(data []byte, atEOF bool) (advance int, token []byte, err error) { + if atEOF && len(data) == 0 { + return 0, nil, bufio.ErrFinalToken + } + + idx := bytes.IndexAny(data, "\r\n") + switch { + case atEOF && idx < 0: + return len(data), data, bufio.ErrFinalToken + + case idx < 0: + return 0, nil, nil + } + + // consume CR or LF + eol := idx + 1 + // detect CRLF + if len(data) > eol && data[eol-1] == '\r' && data[eol] == '\n' { + eol++ + } + + return eol, data[:idx], nil +} + +func strictParse(r io.Reader, override bool) (Env, error) { + env := make(Env) + + buf := new(bytes.Buffer) + tee := io.TeeReader(r, buf) + + // There can be a maximum of 3 BOM bytes. + bomByteBuffer := make([]byte, 3) + _, err := tee.Read(bomByteBuffer) + if err != nil && err != io.EOF { + return env, err + } + + z := io.MultiReader(buf, r) + + // We chooes a different scanner depending on file encoding. + var scanner *bufio.Scanner + + if bytes.HasPrefix(bomByteBuffer, bomUTF8) { + scanner = bufio.NewScanner(transform.NewReader(z, unicode.UTF8BOM.NewDecoder())) + } else if bytes.HasPrefix(bomByteBuffer, bomUTF16LE) { + scanner = bufio.NewScanner(transform.NewReader(z, unicode.UTF16(unicode.LittleEndian, unicode.ExpectBOM).NewDecoder())) + } else if bytes.HasPrefix(bomByteBuffer, bomUTF16BE) { + scanner = bufio.NewScanner(transform.NewReader(z, unicode.UTF16(unicode.BigEndian, unicode.ExpectBOM).NewDecoder())) + } else { + scanner = bufio.NewScanner(z) + } + + scanner.Split(splitLines) + + for scanner.Scan() { + if err := scanner.Err(); err != nil { + return env, err + } + + line := strings.TrimSpace(scanner.Text()) + if line == "" || line[0] == '#' { + continue + } + + quote := "" + // look for the delimiter character + idx := strings.Index(line, "=") + if idx == -1 { + idx = strings.Index(line, ":") + } + // look for a quote character + if idx > 0 && idx < len(line)-1 { + val := strings.TrimSpace(line[idx+1:]) + if val[0] == '"' || val[0] == '\'' { + quote = val[:1] + // look for the closing quote character within the same line + idx = strings.LastIndex(strings.TrimSpace(val[1:]), quote) + if idx >= 0 && val[idx] != '\\' { + quote = "" + } + } + } + // look for the closing quote character + for quote != "" && scanner.Scan() { + l := scanner.Text() + line += "\n" + l + idx := strings.LastIndex(l, quote) + if idx > 0 && l[idx-1] == '\\' { + // foud a matching quote character but it's escaped + continue + } + if idx >= 0 { + // foud a matching quote + quote = "" + } + } + + if quote != "" { + return env, fmt.Errorf("missing quotes") + } + + err := parseLine(line, env, override) + if err != nil { + return env, err + } + } + + return env, scanner.Err() +} + +var ( + lineRgx = regexp.MustCompile(linePattern) + unescapeRgx = regexp.MustCompile(`\\([^$])`) + varRgx = regexp.MustCompile(variablePattern) +) + +func parseLine(s string, env Env, override bool) error { + rm := lineRgx.FindStringSubmatch(s) + + if len(rm) == 0 { + return checkFormat(s, env) + } + + key := strings.TrimSpace(rm[1]) + val := strings.TrimSpace(rm[2]) + + var hsq, hdq bool + + // check if the value is quoted + if l := len(val); l >= 2 { + l -= 1 + // has double quotes + hdq = val[0] == '"' && val[l] == '"' + // has single quotes + hsq = val[0] == '\'' && val[l] == '\'' + + // remove quotes '' or "" + if hsq || hdq { + val = val[1:l] + } + } + + if hdq { + val = strings.ReplaceAll(val, `\n`, "\n") + val = strings.ReplaceAll(val, `\r`, "\r") + + // Unescape all characters except $ so variables can be escaped properly + val = unescapeRgx.ReplaceAllString(val, "$1") + } + + if !hsq { + fv := func(s string) string { + return varReplacement(s, hsq, env, override) + } + val = varRgx.ReplaceAllStringFunc(val, fv) + } + + env[key] = val + return nil +} + +func parseExport(st string, env Env) error { + if strings.HasPrefix(st, "export") { + vs := strings.SplitN(st, " ", 2) + + if len(vs) > 1 { + if _, ok := env[vs[1]]; !ok { + return fmt.Errorf("line `%s` has an unset variable", st) + } + } + } + + return nil +} + +var varNameRgx = regexp.MustCompile(`(\$)(\{?([A-Z0-9_]+)\}?)`) + +func varReplacement(s string, hsq bool, env Env, override bool) string { + if s == "" { + return s + } + + if s[0] == '\\' { + // the dollar sign is escaped + return s[1:] + } + + if hsq { + return s + } + + mn := varNameRgx.FindStringSubmatch(s) + + if len(mn) == 0 { + return s + } + + v := mn[3] + + if replace, ok := os.LookupEnv(v); ok && !override { + return replace + } + + if replace, ok := env[v]; ok { + return replace + } + + return os.Getenv(v) +} + +func checkFormat(s string, env Env) error { + st := strings.TrimSpace(s) + + if st == "" || st[0] == '#' { + return nil + } + + if err := parseExport(st, env); err != nil { + return err + } + + return fmt.Errorf("line `%s` doesn't match format", s) +} diff --git a/vendor/go.uber.org/multierr/.codecov.yml b/vendor/go.uber.org/multierr/.codecov.yml new file mode 100644 index 0000000000..6d4d1be7b5 --- /dev/null +++ b/vendor/go.uber.org/multierr/.codecov.yml @@ -0,0 +1,15 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 100 # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure + diff --git a/vendor/go.uber.org/multierr/.gitignore b/vendor/go.uber.org/multierr/.gitignore new file mode 100644 index 0000000000..b9a05e3da0 --- /dev/null +++ b/vendor/go.uber.org/multierr/.gitignore @@ -0,0 +1,4 @@ +/vendor +cover.html +cover.out +/bin diff --git a/vendor/go.uber.org/multierr/CHANGELOG.md b/vendor/go.uber.org/multierr/CHANGELOG.md new file mode 100644 index 0000000000..f8177b978c --- /dev/null +++ b/vendor/go.uber.org/multierr/CHANGELOG.md @@ -0,0 +1,95 @@ +Releases +======== + +v1.11.0 (2023-03-28) +==================== +- `Errors` now supports any error that implements multiple-error + interface. +- Add `Every` function to allow checking if all errors in the chain + satisfies `errors.Is` against the target error. + +v1.10.0 (2023-03-08) +==================== + +- Comply with Go 1.20's multiple-error interface. +- Drop Go 1.18 support. + Per the support policy, only Go 1.19 and 1.20 are supported now. +- Drop all non-test external dependencies. + +v1.9.0 (2022-12-12) +=================== + +- Add `AppendFunc` that allow passsing functions to similar to + `AppendInvoke`. + +- Bump up yaml.v3 dependency to 3.0.1. + +v1.8.0 (2022-02-28) +=================== + +- `Combine`: perform zero allocations when there are no errors. + + +v1.7.0 (2021-05-06) +=================== + +- Add `AppendInvoke` to append into errors from `defer` blocks. + + +v1.6.0 (2020-09-14) +=================== + +- Actually drop library dependency on development-time tooling. + + +v1.5.0 (2020-02-24) +=================== + +- Drop library dependency on development-time tooling. + + +v1.4.0 (2019-11-04) +=================== + +- Add `AppendInto` function to more ergonomically build errors inside a + loop. + + +v1.3.0 (2019-10-29) +=================== + +- Switch to Go modules. + + +v1.2.0 (2019-09-26) +=================== + +- Support extracting and matching against wrapped errors with `errors.As` + and `errors.Is`. + + +v1.1.0 (2017-06-30) +=================== + +- Added an `Errors(error) []error` function to extract the underlying list of + errors for a multierr error. + + +v1.0.0 (2017-05-31) +=================== + +No changes since v0.2.0. This release is committing to making no breaking +changes to the current API in the 1.X series. + + +v0.2.0 (2017-04-11) +=================== + +- Repeatedly appending to the same error is now faster due to fewer + allocations. + + +v0.1.0 (2017-31-03) +=================== + +- Initial release diff --git a/vendor/go.uber.org/multierr/LICENSE.txt b/vendor/go.uber.org/multierr/LICENSE.txt new file mode 100644 index 0000000000..413e30f7ce --- /dev/null +++ b/vendor/go.uber.org/multierr/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2017-2021 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/go.uber.org/multierr/Makefile b/vendor/go.uber.org/multierr/Makefile new file mode 100644 index 0000000000..dcb6fe723c --- /dev/null +++ b/vendor/go.uber.org/multierr/Makefile @@ -0,0 +1,38 @@ +# Directory to put `go install`ed binaries in. +export GOBIN ?= $(shell pwd)/bin + +GO_FILES := $(shell \ + find . '(' -path '*/.*' -o -path './vendor' ')' -prune \ + -o -name '*.go' -print | cut -b3-) + +.PHONY: build +build: + go build ./... + +.PHONY: test +test: + go test -race ./... + +.PHONY: gofmt +gofmt: + $(eval FMT_LOG := $(shell mktemp -t gofmt.XXXXX)) + @gofmt -e -s -l $(GO_FILES) > $(FMT_LOG) || true + @[ ! -s "$(FMT_LOG)" ] || (echo "gofmt failed:" | cat - $(FMT_LOG) && false) + +.PHONY: golint +golint: + @cd tools && go install golang.org/x/lint/golint + @$(GOBIN)/golint ./... + +.PHONY: staticcheck +staticcheck: + @cd tools && go install honnef.co/go/tools/cmd/staticcheck + @$(GOBIN)/staticcheck ./... + +.PHONY: lint +lint: gofmt golint staticcheck + +.PHONY: cover +cover: + go test -race -coverprofile=cover.out -coverpkg=./... -v ./... + go tool cover -html=cover.out -o cover.html diff --git a/vendor/go.uber.org/multierr/README.md b/vendor/go.uber.org/multierr/README.md new file mode 100644 index 0000000000..5ab6ac40f4 --- /dev/null +++ b/vendor/go.uber.org/multierr/README.md @@ -0,0 +1,43 @@ +# multierr [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +`multierr` allows combining one or more Go `error`s together. + +## Features + +- **Idiomatic**: + multierr follows best practices in Go, and keeps your code idiomatic. + - It keeps the underlying error type hidden, + allowing you to deal in `error` values exclusively. + - It provides APIs to safely append into an error from a `defer` statement. +- **Performant**: + multierr is optimized for performance: + - It avoids allocations where possible. + - It utilizes slice resizing semantics to optimize common cases + like appending into the same error object from a loop. +- **Interoperable**: + multierr interoperates with the Go standard library's error APIs seamlessly: + - The `errors.Is` and `errors.As` functions *just work*. +- **Lightweight**: + multierr comes with virtually no dependencies. + +## Installation + +```bash +go get -u go.uber.org/multierr@latest +``` + +## Status + +Stable: No breaking changes will be made before 2.0. + +------------------------------------------------------------------------------- + +Released under the [MIT License]. + +[MIT License]: LICENSE.txt +[doc-img]: https://pkg.go.dev/badge/go.uber.org/multierr +[doc]: https://pkg.go.dev/go.uber.org/multierr +[ci-img]: https://github.com/uber-go/multierr/actions/workflows/go.yml/badge.svg +[cov-img]: https://codecov.io/gh/uber-go/multierr/branch/master/graph/badge.svg +[ci]: https://github.com/uber-go/multierr/actions/workflows/go.yml +[cov]: https://codecov.io/gh/uber-go/multierr diff --git a/vendor/go.uber.org/multierr/error.go b/vendor/go.uber.org/multierr/error.go new file mode 100644 index 0000000000..3a828b2dff --- /dev/null +++ b/vendor/go.uber.org/multierr/error.go @@ -0,0 +1,646 @@ +// Copyright (c) 2017-2023 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package multierr allows combining one or more errors together. +// +// # Overview +// +// Errors can be combined with the use of the Combine function. +// +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// conn.Close(), +// ) +// +// If only two errors are being combined, the Append function may be used +// instead. +// +// err = multierr.Append(reader.Close(), writer.Close()) +// +// The underlying list of errors for a returned error object may be retrieved +// with the Errors function. +// +// errors := multierr.Errors(err) +// if len(errors) > 0 { +// fmt.Println("The following errors occurred:", errors) +// } +// +// # Appending from a loop +// +// You sometimes need to append into an error from a loop. +// +// var err error +// for _, item := range items { +// err = multierr.Append(err, process(item)) +// } +// +// Cases like this may require knowledge of whether an individual instance +// failed. This usually requires introduction of a new variable. +// +// var err error +// for _, item := range items { +// if perr := process(item); perr != nil { +// log.Warn("skipping item", item) +// err = multierr.Append(err, perr) +// } +// } +// +// multierr includes AppendInto to simplify cases like this. +// +// var err error +// for _, item := range items { +// if multierr.AppendInto(&err, process(item)) { +// log.Warn("skipping item", item) +// } +// } +// +// This will append the error into the err variable, and return true if that +// individual error was non-nil. +// +// See [AppendInto] for more information. +// +// # Deferred Functions +// +// Go makes it possible to modify the return value of a function in a defer +// block if the function was using named returns. This makes it possible to +// record resource cleanup failures from deferred blocks. +// +// func sendRequest(req Request) (err error) { +// conn, err := openConnection() +// if err != nil { +// return err +// } +// defer func() { +// err = multierr.Append(err, conn.Close()) +// }() +// // ... +// } +// +// multierr provides the Invoker type and AppendInvoke function to make cases +// like the above simpler and obviate the need for a closure. The following is +// roughly equivalent to the example above. +// +// func sendRequest(req Request) (err error) { +// conn, err := openConnection() +// if err != nil { +// return err +// } +// defer multierr.AppendInvoke(&err, multierr.Close(conn)) +// // ... +// } +// +// See [AppendInvoke] and [Invoker] for more information. +// +// NOTE: If you're modifying an error from inside a defer, you MUST use a named +// return value for that function. +// +// # Advanced Usage +// +// Errors returned by Combine and Append MAY implement the following +// interface. +// +// type errorGroup interface { +// // Returns a slice containing the underlying list of errors. +// // +// // This slice MUST NOT be modified by the caller. +// Errors() []error +// } +// +// Note that if you need access to list of errors behind a multierr error, you +// should prefer using the Errors function. That said, if you need cheap +// read-only access to the underlying errors slice, you can attempt to cast +// the error to this interface. You MUST handle the failure case gracefully +// because errors returned by Combine and Append are not guaranteed to +// implement this interface. +// +// var errors []error +// group, ok := err.(errorGroup) +// if ok { +// errors = group.Errors() +// } else { +// errors = []error{err} +// } +package multierr // import "go.uber.org/multierr" + +import ( + "bytes" + "errors" + "fmt" + "io" + "strings" + "sync" + "sync/atomic" +) + +var ( + // Separator for single-line error messages. + _singlelineSeparator = []byte("; ") + + // Prefix for multi-line messages + _multilinePrefix = []byte("the following errors occurred:") + + // Prefix for the first and following lines of an item in a list of + // multi-line error messages. + // + // For example, if a single item is: + // + // foo + // bar + // + // It will become, + // + // - foo + // bar + _multilineSeparator = []byte("\n - ") + _multilineIndent = []byte(" ") +) + +// _bufferPool is a pool of bytes.Buffers. +var _bufferPool = sync.Pool{ + New: func() interface{} { + return &bytes.Buffer{} + }, +} + +type errorGroup interface { + Errors() []error +} + +// Errors returns a slice containing zero or more errors that the supplied +// error is composed of. If the error is nil, a nil slice is returned. +// +// err := multierr.Append(r.Close(), w.Close()) +// errors := multierr.Errors(err) +// +// If the error is not composed of other errors, the returned slice contains +// just the error that was passed in. +// +// Callers of this function are free to modify the returned slice. +func Errors(err error) []error { + return extractErrors(err) +} + +// multiError is an error that holds one or more errors. +// +// An instance of this is guaranteed to be non-empty and flattened. That is, +// none of the errors inside multiError are other multiErrors. +// +// multiError formats to a semi-colon delimited list of error messages with +// %v and with a more readable multi-line format with %+v. +type multiError struct { + copyNeeded atomic.Bool + errors []error +} + +// Errors returns the list of underlying errors. +// +// This slice MUST NOT be modified. +func (merr *multiError) Errors() []error { + if merr == nil { + return nil + } + return merr.errors +} + +func (merr *multiError) Error() string { + if merr == nil { + return "" + } + + buff := _bufferPool.Get().(*bytes.Buffer) + buff.Reset() + + merr.writeSingleline(buff) + + result := buff.String() + _bufferPool.Put(buff) + return result +} + +// Every compares every error in the given err against the given target error +// using [errors.Is], and returns true only if every comparison returned true. +func Every(err error, target error) bool { + for _, e := range extractErrors(err) { + if !errors.Is(e, target) { + return false + } + } + return true +} + +func (merr *multiError) Format(f fmt.State, c rune) { + if c == 'v' && f.Flag('+') { + merr.writeMultiline(f) + } else { + merr.writeSingleline(f) + } +} + +func (merr *multiError) writeSingleline(w io.Writer) { + first := true + for _, item := range merr.errors { + if first { + first = false + } else { + w.Write(_singlelineSeparator) + } + io.WriteString(w, item.Error()) + } +} + +func (merr *multiError) writeMultiline(w io.Writer) { + w.Write(_multilinePrefix) + for _, item := range merr.errors { + w.Write(_multilineSeparator) + writePrefixLine(w, _multilineIndent, fmt.Sprintf("%+v", item)) + } +} + +// Writes s to the writer with the given prefix added before each line after +// the first. +func writePrefixLine(w io.Writer, prefix []byte, s string) { + first := true + for len(s) > 0 { + if first { + first = false + } else { + w.Write(prefix) + } + + idx := strings.IndexByte(s, '\n') + if idx < 0 { + idx = len(s) - 1 + } + + io.WriteString(w, s[:idx+1]) + s = s[idx+1:] + } +} + +type inspectResult struct { + // Number of top-level non-nil errors + Count int + + // Total number of errors including multiErrors + Capacity int + + // Index of the first non-nil error in the list. Value is meaningless if + // Count is zero. + FirstErrorIdx int + + // Whether the list contains at least one multiError + ContainsMultiError bool +} + +// Inspects the given slice of errors so that we can efficiently allocate +// space for it. +func inspect(errors []error) (res inspectResult) { + first := true + for i, err := range errors { + if err == nil { + continue + } + + res.Count++ + if first { + first = false + res.FirstErrorIdx = i + } + + if merr, ok := err.(*multiError); ok { + res.Capacity += len(merr.errors) + res.ContainsMultiError = true + } else { + res.Capacity++ + } + } + return +} + +// fromSlice converts the given list of errors into a single error. +func fromSlice(errors []error) error { + // Don't pay to inspect small slices. + switch len(errors) { + case 0: + return nil + case 1: + return errors[0] + } + + res := inspect(errors) + switch res.Count { + case 0: + return nil + case 1: + // only one non-nil entry + return errors[res.FirstErrorIdx] + case len(errors): + if !res.ContainsMultiError { + // Error list is flat. Make a copy of it + // Otherwise "errors" escapes to the heap + // unconditionally for all other cases. + // This lets us optimize for the "no errors" case. + out := append(([]error)(nil), errors...) + return &multiError{errors: out} + } + } + + nonNilErrs := make([]error, 0, res.Capacity) + for _, err := range errors[res.FirstErrorIdx:] { + if err == nil { + continue + } + + if nested, ok := err.(*multiError); ok { + nonNilErrs = append(nonNilErrs, nested.errors...) + } else { + nonNilErrs = append(nonNilErrs, err) + } + } + + return &multiError{errors: nonNilErrs} +} + +// Combine combines the passed errors into a single error. +// +// If zero arguments were passed or if all items are nil, a nil error is +// returned. +// +// Combine(nil, nil) // == nil +// +// If only a single error was passed, it is returned as-is. +// +// Combine(err) // == err +// +// Combine skips over nil arguments so this function may be used to combine +// together errors from operations that fail independently of each other. +// +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// pipe.Close(), +// ) +// +// If any of the passed errors is a multierr error, it will be flattened along +// with the other errors. +// +// multierr.Combine(multierr.Combine(err1, err2), err3) +// // is the same as +// multierr.Combine(err1, err2, err3) +// +// The returned error formats into a readable multi-line error message if +// formatted with %+v. +// +// fmt.Sprintf("%+v", multierr.Combine(err1, err2)) +func Combine(errors ...error) error { + return fromSlice(errors) +} + +// Append appends the given errors together. Either value may be nil. +// +// This function is a specialization of Combine for the common case where +// there are only two errors. +// +// err = multierr.Append(reader.Close(), writer.Close()) +// +// The following pattern may also be used to record failure of deferred +// operations without losing information about the original error. +// +// func doSomething(..) (err error) { +// f := acquireResource() +// defer func() { +// err = multierr.Append(err, f.Close()) +// }() +// +// Note that the variable MUST be a named return to append an error to it from +// the defer statement. See also [AppendInvoke]. +func Append(left error, right error) error { + switch { + case left == nil: + return right + case right == nil: + return left + } + + if _, ok := right.(*multiError); !ok { + if l, ok := left.(*multiError); ok && !l.copyNeeded.Swap(true) { + // Common case where the error on the left is constantly being + // appended to. + errs := append(l.errors, right) + return &multiError{errors: errs} + } else if !ok { + // Both errors are single errors. + return &multiError{errors: []error{left, right}} + } + } + + // Either right or both, left and right, are multiErrors. Rely on usual + // expensive logic. + errors := [2]error{left, right} + return fromSlice(errors[0:]) +} + +// AppendInto appends an error into the destination of an error pointer and +// returns whether the error being appended was non-nil. +// +// var err error +// multierr.AppendInto(&err, r.Close()) +// multierr.AppendInto(&err, w.Close()) +// +// The above is equivalent to, +// +// err := multierr.Append(r.Close(), w.Close()) +// +// As AppendInto reports whether the provided error was non-nil, it may be +// used to build a multierr error in a loop more ergonomically. For example: +// +// var err error +// for line := range lines { +// var item Item +// if multierr.AppendInto(&err, parse(line, &item)) { +// continue +// } +// items = append(items, item) +// } +// +// Compare this with a version that relies solely on Append: +// +// var err error +// for line := range lines { +// var item Item +// if parseErr := parse(line, &item); parseErr != nil { +// err = multierr.Append(err, parseErr) +// continue +// } +// items = append(items, item) +// } +func AppendInto(into *error, err error) (errored bool) { + if into == nil { + // We panic if 'into' is nil. This is not documented above + // because suggesting that the pointer must be non-nil may + // confuse users into thinking that the error that it points + // to must be non-nil. + panic("misuse of multierr.AppendInto: into pointer must not be nil") + } + + if err == nil { + return false + } + *into = Append(*into, err) + return true +} + +// Invoker is an operation that may fail with an error. Use it with +// AppendInvoke to append the result of calling the function into an error. +// This allows you to conveniently defer capture of failing operations. +// +// See also, [Close] and [Invoke]. +type Invoker interface { + Invoke() error +} + +// Invoke wraps a function which may fail with an error to match the Invoker +// interface. Use it to supply functions matching this signature to +// AppendInvoke. +// +// For example, +// +// func processReader(r io.Reader) (err error) { +// scanner := bufio.NewScanner(r) +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +// for scanner.Scan() { +// // ... +// } +// // ... +// } +// +// In this example, the following line will construct the Invoker right away, +// but defer the invocation of scanner.Err() until the function returns. +// +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +// +// Note that the error you're appending to from the defer statement MUST be a +// named return. +type Invoke func() error + +// Invoke calls the supplied function and returns its result. +func (i Invoke) Invoke() error { return i() } + +// Close builds an Invoker that closes the provided io.Closer. Use it with +// AppendInvoke to close io.Closers and append their results into an error. +// +// For example, +// +// func processFile(path string) (err error) { +// f, err := os.Open(path) +// if err != nil { +// return err +// } +// defer multierr.AppendInvoke(&err, multierr.Close(f)) +// return processReader(f) +// } +// +// In this example, multierr.Close will construct the Invoker right away, but +// defer the invocation of f.Close until the function returns. +// +// defer multierr.AppendInvoke(&err, multierr.Close(f)) +// +// Note that the error you're appending to from the defer statement MUST be a +// named return. +func Close(closer io.Closer) Invoker { + return Invoke(closer.Close) +} + +// AppendInvoke appends the result of calling the given Invoker into the +// provided error pointer. Use it with named returns to safely defer +// invocation of fallible operations until a function returns, and capture the +// resulting errors. +// +// func doSomething(...) (err error) { +// // ... +// f, err := openFile(..) +// if err != nil { +// return err +// } +// +// // multierr will call f.Close() when this function returns and +// // if the operation fails, its append its error into the +// // returned error. +// defer multierr.AppendInvoke(&err, multierr.Close(f)) +// +// scanner := bufio.NewScanner(f) +// // Similarly, this scheduled scanner.Err to be called and +// // inspected when the function returns and append its error +// // into the returned error. +// defer multierr.AppendInvoke(&err, multierr.Invoke(scanner.Err)) +// +// // ... +// } +// +// NOTE: If used with a defer, the error variable MUST be a named return. +// +// Without defer, AppendInvoke behaves exactly like AppendInto. +// +// err := // ... +// multierr.AppendInvoke(&err, mutltierr.Invoke(foo)) +// +// // ...is roughly equivalent to... +// +// err := // ... +// multierr.AppendInto(&err, foo()) +// +// The advantage of the indirection introduced by Invoker is to make it easy +// to defer the invocation of a function. Without this indirection, the +// invoked function will be evaluated at the time of the defer block rather +// than when the function returns. +// +// // BAD: This is likely not what the caller intended. This will evaluate +// // foo() right away and append its result into the error when the +// // function returns. +// defer multierr.AppendInto(&err, foo()) +// +// // GOOD: This will defer invocation of foo unutil the function returns. +// defer multierr.AppendInvoke(&err, multierr.Invoke(foo)) +// +// multierr provides a few Invoker implementations out of the box for +// convenience. See [Invoker] for more information. +func AppendInvoke(into *error, invoker Invoker) { + AppendInto(into, invoker.Invoke()) +} + +// AppendFunc is a shorthand for [AppendInvoke]. +// It allows using function or method value directly +// without having to wrap it into an [Invoker] interface. +// +// func doSomething(...) (err error) { +// w, err := startWorker(...) +// if err != nil { +// return err +// } +// +// // multierr will call w.Stop() when this function returns and +// // if the operation fails, it appends its error into the +// // returned error. +// defer multierr.AppendFunc(&err, w.Stop) +// } +func AppendFunc(into *error, fn func() error) { + AppendInvoke(into, Invoke(fn)) +} diff --git a/vendor/go.uber.org/multierr/error_post_go120.go b/vendor/go.uber.org/multierr/error_post_go120.go new file mode 100644 index 0000000000..a173f9c251 --- /dev/null +++ b/vendor/go.uber.org/multierr/error_post_go120.go @@ -0,0 +1,48 @@ +// Copyright (c) 2017-2023 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +//go:build go1.20 +// +build go1.20 + +package multierr + +// Unwrap returns a list of errors wrapped by this multierr. +func (merr *multiError) Unwrap() []error { + return merr.Errors() +} + +type multipleErrors interface { + Unwrap() []error +} + +func extractErrors(err error) []error { + if err == nil { + return nil + } + + // check if the given err is an Unwrapable error that + // implements multipleErrors interface. + eg, ok := err.(multipleErrors) + if !ok { + return []error{err} + } + + return append(([]error)(nil), eg.Unwrap()...) +} diff --git a/vendor/go.uber.org/multierr/error_pre_go120.go b/vendor/go.uber.org/multierr/error_pre_go120.go new file mode 100644 index 0000000000..93872a3fcd --- /dev/null +++ b/vendor/go.uber.org/multierr/error_pre_go120.go @@ -0,0 +1,79 @@ +// Copyright (c) 2017-2023 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +//go:build !go1.20 +// +build !go1.20 + +package multierr + +import "errors" + +// Versions of Go before 1.20 did not support the Unwrap() []error method. +// This provides a similar behavior by implementing the Is(..) and As(..) +// methods. +// See the errors.Join proposal for details: +// https://github.com/golang/go/issues/53435 + +// As attempts to find the first error in the error list that matches the type +// of the value that target points to. +// +// This function allows errors.As to traverse the values stored on the +// multierr error. +func (merr *multiError) As(target interface{}) bool { + for _, err := range merr.Errors() { + if errors.As(err, target) { + return true + } + } + return false +} + +// Is attempts to match the provided error against errors in the error list. +// +// This function allows errors.Is to traverse the values stored on the +// multierr error. +func (merr *multiError) Is(target error) bool { + for _, err := range merr.Errors() { + if errors.Is(err, target) { + return true + } + } + return false +} + +func extractErrors(err error) []error { + if err == nil { + return nil + } + + // Note that we're casting to multiError, not errorGroup. Our contract is + // that returned errors MAY implement errorGroup. Errors, however, only + // has special behavior for multierr-specific error objects. + // + // This behavior can be expanded in the future but I think it's prudent to + // start with as little as possible in terms of contract and possibility + // of misuse. + eg, ok := err.(*multiError) + if !ok { + return []error{err} + } + + return append(([]error)(nil), eg.Errors()...) +} diff --git a/vendor/golang.org/x/exp/constraints/constraints.go b/vendor/golang.org/x/exp/constraints/constraints.go new file mode 100644 index 0000000000..2c033dff47 --- /dev/null +++ b/vendor/golang.org/x/exp/constraints/constraints.go @@ -0,0 +1,50 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package constraints defines a set of useful constraints to be used +// with type parameters. +package constraints + +// Signed is a constraint that permits any signed integer type. +// If future releases of Go add new predeclared signed integer types, +// this constraint will be modified to include them. +type Signed interface { + ~int | ~int8 | ~int16 | ~int32 | ~int64 +} + +// Unsigned is a constraint that permits any unsigned integer type. +// If future releases of Go add new predeclared unsigned integer types, +// this constraint will be modified to include them. +type Unsigned interface { + ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr +} + +// Integer is a constraint that permits any integer type. +// If future releases of Go add new predeclared integer types, +// this constraint will be modified to include them. +type Integer interface { + Signed | Unsigned +} + +// Float is a constraint that permits any floating-point type. +// If future releases of Go add new predeclared floating-point types, +// this constraint will be modified to include them. +type Float interface { + ~float32 | ~float64 +} + +// Complex is a constraint that permits any complex numeric type. +// If future releases of Go add new predeclared complex numeric types, +// this constraint will be modified to include them. +type Complex interface { + ~complex64 | ~complex128 +} + +// Ordered is a constraint that permits any ordered type: any type +// that supports the operators < <= >= >. +// If future releases of Go add new ordered types, +// this constraint will be modified to include them. +type Ordered interface { + Integer | Float | ~string +} diff --git a/vendor/golang.org/x/exp/slices/cmp.go b/vendor/golang.org/x/exp/slices/cmp.go new file mode 100644 index 0000000000..fbf1934a06 --- /dev/null +++ b/vendor/golang.org/x/exp/slices/cmp.go @@ -0,0 +1,44 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slices + +import "golang.org/x/exp/constraints" + +// min is a version of the predeclared function from the Go 1.21 release. +func min[T constraints.Ordered](a, b T) T { + if a < b || isNaN(a) { + return a + } + return b +} + +// max is a version of the predeclared function from the Go 1.21 release. +func max[T constraints.Ordered](a, b T) T { + if a > b || isNaN(a) { + return a + } + return b +} + +// cmpLess is a copy of cmp.Less from the Go 1.21 release. +func cmpLess[T constraints.Ordered](x, y T) bool { + return (isNaN(x) && !isNaN(y)) || x < y +} + +// cmpCompare is a copy of cmp.Compare from the Go 1.21 release. +func cmpCompare[T constraints.Ordered](x, y T) int { + xNaN := isNaN(x) + yNaN := isNaN(y) + if xNaN && yNaN { + return 0 + } + if xNaN || x < y { + return -1 + } + if yNaN || x > y { + return +1 + } + return 0 +} diff --git a/vendor/golang.org/x/exp/slices/slices.go b/vendor/golang.org/x/exp/slices/slices.go new file mode 100644 index 0000000000..46ceac3439 --- /dev/null +++ b/vendor/golang.org/x/exp/slices/slices.go @@ -0,0 +1,515 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package slices defines various functions useful with slices of any type. +package slices + +import ( + "unsafe" + + "golang.org/x/exp/constraints" +) + +// Equal reports whether two slices are equal: the same length and all +// elements equal. If the lengths are different, Equal returns false. +// Otherwise, the elements are compared in increasing index order, and the +// comparison stops at the first unequal pair. +// Floating point NaNs are not considered equal. +func Equal[S ~[]E, E comparable](s1, s2 S) bool { + if len(s1) != len(s2) { + return false + } + for i := range s1 { + if s1[i] != s2[i] { + return false + } + } + return true +} + +// EqualFunc reports whether two slices are equal using an equality +// function on each pair of elements. If the lengths are different, +// EqualFunc returns false. Otherwise, the elements are compared in +// increasing index order, and the comparison stops at the first index +// for which eq returns false. +func EqualFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, eq func(E1, E2) bool) bool { + if len(s1) != len(s2) { + return false + } + for i, v1 := range s1 { + v2 := s2[i] + if !eq(v1, v2) { + return false + } + } + return true +} + +// Compare compares the elements of s1 and s2, using [cmp.Compare] on each pair +// of elements. The elements are compared sequentially, starting at index 0, +// until one element is not equal to the other. +// The result of comparing the first non-matching elements is returned. +// If both slices are equal until one of them ends, the shorter slice is +// considered less than the longer one. +// The result is 0 if s1 == s2, -1 if s1 < s2, and +1 if s1 > s2. +func Compare[S ~[]E, E constraints.Ordered](s1, s2 S) int { + for i, v1 := range s1 { + if i >= len(s2) { + return +1 + } + v2 := s2[i] + if c := cmpCompare(v1, v2); c != 0 { + return c + } + } + if len(s1) < len(s2) { + return -1 + } + return 0 +} + +// CompareFunc is like [Compare] but uses a custom comparison function on each +// pair of elements. +// The result is the first non-zero result of cmp; if cmp always +// returns 0 the result is 0 if len(s1) == len(s2), -1 if len(s1) < len(s2), +// and +1 if len(s1) > len(s2). +func CompareFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, cmp func(E1, E2) int) int { + for i, v1 := range s1 { + if i >= len(s2) { + return +1 + } + v2 := s2[i] + if c := cmp(v1, v2); c != 0 { + return c + } + } + if len(s1) < len(s2) { + return -1 + } + return 0 +} + +// Index returns the index of the first occurrence of v in s, +// or -1 if not present. +func Index[S ~[]E, E comparable](s S, v E) int { + for i := range s { + if v == s[i] { + return i + } + } + return -1 +} + +// IndexFunc returns the first index i satisfying f(s[i]), +// or -1 if none do. +func IndexFunc[S ~[]E, E any](s S, f func(E) bool) int { + for i := range s { + if f(s[i]) { + return i + } + } + return -1 +} + +// Contains reports whether v is present in s. +func Contains[S ~[]E, E comparable](s S, v E) bool { + return Index(s, v) >= 0 +} + +// ContainsFunc reports whether at least one +// element e of s satisfies f(e). +func ContainsFunc[S ~[]E, E any](s S, f func(E) bool) bool { + return IndexFunc(s, f) >= 0 +} + +// Insert inserts the values v... into s at index i, +// returning the modified slice. +// The elements at s[i:] are shifted up to make room. +// In the returned slice r, r[i] == v[0], +// and r[i+len(v)] == value originally at r[i]. +// Insert panics if i is out of range. +// This function is O(len(s) + len(v)). +func Insert[S ~[]E, E any](s S, i int, v ...E) S { + m := len(v) + if m == 0 { + return s + } + n := len(s) + if i == n { + return append(s, v...) + } + if n+m > cap(s) { + // Use append rather than make so that we bump the size of + // the slice up to the next storage class. + // This is what Grow does but we don't call Grow because + // that might copy the values twice. + s2 := append(s[:i], make(S, n+m-i)...) + copy(s2[i:], v) + copy(s2[i+m:], s[i:]) + return s2 + } + s = s[:n+m] + + // before: + // s: aaaaaaaabbbbccccccccdddd + // ^ ^ ^ ^ + // i i+m n n+m + // after: + // s: aaaaaaaavvvvbbbbcccccccc + // ^ ^ ^ ^ + // i i+m n n+m + // + // a are the values that don't move in s. + // v are the values copied in from v. + // b and c are the values from s that are shifted up in index. + // d are the values that get overwritten, never to be seen again. + + if !overlaps(v, s[i+m:]) { + // Easy case - v does not overlap either the c or d regions. + // (It might be in some of a or b, or elsewhere entirely.) + // The data we copy up doesn't write to v at all, so just do it. + + copy(s[i+m:], s[i:]) + + // Now we have + // s: aaaaaaaabbbbbbbbcccccccc + // ^ ^ ^ ^ + // i i+m n n+m + // Note the b values are duplicated. + + copy(s[i:], v) + + // Now we have + // s: aaaaaaaavvvvbbbbcccccccc + // ^ ^ ^ ^ + // i i+m n n+m + // That's the result we want. + return s + } + + // The hard case - v overlaps c or d. We can't just shift up + // the data because we'd move or clobber the values we're trying + // to insert. + // So instead, write v on top of d, then rotate. + copy(s[n:], v) + + // Now we have + // s: aaaaaaaabbbbccccccccvvvv + // ^ ^ ^ ^ + // i i+m n n+m + + rotateRight(s[i:], m) + + // Now we have + // s: aaaaaaaavvvvbbbbcccccccc + // ^ ^ ^ ^ + // i i+m n n+m + // That's the result we want. + return s +} + +// clearSlice sets all elements up to the length of s to the zero value of E. +// We may use the builtin clear func instead, and remove clearSlice, when upgrading +// to Go 1.21+. +func clearSlice[S ~[]E, E any](s S) { + var zero E + for i := range s { + s[i] = zero + } +} + +// Delete removes the elements s[i:j] from s, returning the modified slice. +// Delete panics if j > len(s) or s[i:j] is not a valid slice of s. +// Delete is O(len(s)-i), so if many items must be deleted, it is better to +// make a single call deleting them all together than to delete one at a time. +// Delete zeroes the elements s[len(s)-(j-i):len(s)]. +func Delete[S ~[]E, E any](s S, i, j int) S { + _ = s[i:j:len(s)] // bounds check + + if i == j { + return s + } + + oldlen := len(s) + s = append(s[:i], s[j:]...) + clearSlice(s[len(s):oldlen]) // zero/nil out the obsolete elements, for GC + return s +} + +// DeleteFunc removes any elements from s for which del returns true, +// returning the modified slice. +// DeleteFunc zeroes the elements between the new length and the original length. +func DeleteFunc[S ~[]E, E any](s S, del func(E) bool) S { + i := IndexFunc(s, del) + if i == -1 { + return s + } + // Don't start copying elements until we find one to delete. + for j := i + 1; j < len(s); j++ { + if v := s[j]; !del(v) { + s[i] = v + i++ + } + } + clearSlice(s[i:]) // zero/nil out the obsolete elements, for GC + return s[:i] +} + +// Replace replaces the elements s[i:j] by the given v, and returns the +// modified slice. Replace panics if s[i:j] is not a valid slice of s. +// When len(v) < (j-i), Replace zeroes the elements between the new length and the original length. +func Replace[S ~[]E, E any](s S, i, j int, v ...E) S { + _ = s[i:j] // verify that i:j is a valid subslice + + if i == j { + return Insert(s, i, v...) + } + if j == len(s) { + return append(s[:i], v...) + } + + tot := len(s[:i]) + len(v) + len(s[j:]) + if tot > cap(s) { + // Too big to fit, allocate and copy over. + s2 := append(s[:i], make(S, tot-i)...) // See Insert + copy(s2[i:], v) + copy(s2[i+len(v):], s[j:]) + return s2 + } + + r := s[:tot] + + if i+len(v) <= j { + // Easy, as v fits in the deleted portion. + copy(r[i:], v) + if i+len(v) != j { + copy(r[i+len(v):], s[j:]) + } + clearSlice(s[tot:]) // zero/nil out the obsolete elements, for GC + return r + } + + // We are expanding (v is bigger than j-i). + // The situation is something like this: + // (example has i=4,j=8,len(s)=16,len(v)=6) + // s: aaaaxxxxbbbbbbbbyy + // ^ ^ ^ ^ + // i j len(s) tot + // a: prefix of s + // x: deleted range + // b: more of s + // y: area to expand into + + if !overlaps(r[i+len(v):], v) { + // Easy, as v is not clobbered by the first copy. + copy(r[i+len(v):], s[j:]) + copy(r[i:], v) + return r + } + + // This is a situation where we don't have a single place to which + // we can copy v. Parts of it need to go to two different places. + // We want to copy the prefix of v into y and the suffix into x, then + // rotate |y| spots to the right. + // + // v[2:] v[:2] + // | | + // s: aaaavvvvbbbbbbbbvv + // ^ ^ ^ ^ + // i j len(s) tot + // + // If either of those two destinations don't alias v, then we're good. + y := len(v) - (j - i) // length of y portion + + if !overlaps(r[i:j], v) { + copy(r[i:j], v[y:]) + copy(r[len(s):], v[:y]) + rotateRight(r[i:], y) + return r + } + if !overlaps(r[len(s):], v) { + copy(r[len(s):], v[:y]) + copy(r[i:j], v[y:]) + rotateRight(r[i:], y) + return r + } + + // Now we know that v overlaps both x and y. + // That means that the entirety of b is *inside* v. + // So we don't need to preserve b at all; instead we + // can copy v first, then copy the b part of v out of + // v to the right destination. + k := startIdx(v, s[j:]) + copy(r[i:], v) + copy(r[i+len(v):], r[i+k:]) + return r +} + +// Clone returns a copy of the slice. +// The elements are copied using assignment, so this is a shallow clone. +func Clone[S ~[]E, E any](s S) S { + // Preserve nil in case it matters. + if s == nil { + return nil + } + return append(S([]E{}), s...) +} + +// Compact replaces consecutive runs of equal elements with a single copy. +// This is like the uniq command found on Unix. +// Compact modifies the contents of the slice s and returns the modified slice, +// which may have a smaller length. +// Compact zeroes the elements between the new length and the original length. +func Compact[S ~[]E, E comparable](s S) S { + if len(s) < 2 { + return s + } + i := 1 + for k := 1; k < len(s); k++ { + if s[k] != s[k-1] { + if i != k { + s[i] = s[k] + } + i++ + } + } + clearSlice(s[i:]) // zero/nil out the obsolete elements, for GC + return s[:i] +} + +// CompactFunc is like [Compact] but uses an equality function to compare elements. +// For runs of elements that compare equal, CompactFunc keeps the first one. +// CompactFunc zeroes the elements between the new length and the original length. +func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S { + if len(s) < 2 { + return s + } + i := 1 + for k := 1; k < len(s); k++ { + if !eq(s[k], s[k-1]) { + if i != k { + s[i] = s[k] + } + i++ + } + } + clearSlice(s[i:]) // zero/nil out the obsolete elements, for GC + return s[:i] +} + +// Grow increases the slice's capacity, if necessary, to guarantee space for +// another n elements. After Grow(n), at least n elements can be appended +// to the slice without another allocation. If n is negative or too large to +// allocate the memory, Grow panics. +func Grow[S ~[]E, E any](s S, n int) S { + if n < 0 { + panic("cannot be negative") + } + if n -= cap(s) - len(s); n > 0 { + // TODO(https://go.dev/issue/53888): Make using []E instead of S + // to workaround a compiler bug where the runtime.growslice optimization + // does not take effect. Revert when the compiler is fixed. + s = append([]E(s)[:cap(s)], make([]E, n)...)[:len(s)] + } + return s +} + +// Clip removes unused capacity from the slice, returning s[:len(s):len(s)]. +func Clip[S ~[]E, E any](s S) S { + return s[:len(s):len(s)] +} + +// Rotation algorithm explanation: +// +// rotate left by 2 +// start with +// 0123456789 +// split up like this +// 01 234567 89 +// swap first 2 and last 2 +// 89 234567 01 +// join first parts +// 89234567 01 +// recursively rotate first left part by 2 +// 23456789 01 +// join at the end +// 2345678901 +// +// rotate left by 8 +// start with +// 0123456789 +// split up like this +// 01 234567 89 +// swap first 2 and last 2 +// 89 234567 01 +// join last parts +// 89 23456701 +// recursively rotate second part left by 6 +// 89 01234567 +// join at the end +// 8901234567 + +// TODO: There are other rotate algorithms. +// This algorithm has the desirable property that it moves each element exactly twice. +// The triple-reverse algorithm is simpler and more cache friendly, but takes more writes. +// The follow-cycles algorithm can be 1-write but it is not very cache friendly. + +// rotateLeft rotates b left by n spaces. +// s_final[i] = s_orig[i+r], wrapping around. +func rotateLeft[E any](s []E, r int) { + for r != 0 && r != len(s) { + if r*2 <= len(s) { + swap(s[:r], s[len(s)-r:]) + s = s[:len(s)-r] + } else { + swap(s[:len(s)-r], s[r:]) + s, r = s[len(s)-r:], r*2-len(s) + } + } +} +func rotateRight[E any](s []E, r int) { + rotateLeft(s, len(s)-r) +} + +// swap swaps the contents of x and y. x and y must be equal length and disjoint. +func swap[E any](x, y []E) { + for i := 0; i < len(x); i++ { + x[i], y[i] = y[i], x[i] + } +} + +// overlaps reports whether the memory ranges a[0:len(a)] and b[0:len(b)] overlap. +func overlaps[E any](a, b []E) bool { + if len(a) == 0 || len(b) == 0 { + return false + } + elemSize := unsafe.Sizeof(a[0]) + if elemSize == 0 { + return false + } + // TODO: use a runtime/unsafe facility once one becomes available. See issue 12445. + // Also see crypto/internal/alias/alias.go:AnyOverlap + return uintptr(unsafe.Pointer(&a[0])) <= uintptr(unsafe.Pointer(&b[len(b)-1]))+(elemSize-1) && + uintptr(unsafe.Pointer(&b[0])) <= uintptr(unsafe.Pointer(&a[len(a)-1]))+(elemSize-1) +} + +// startIdx returns the index in haystack where the needle starts. +// prerequisite: the needle must be aliased entirely inside the haystack. +func startIdx[E any](haystack, needle []E) int { + p := &needle[0] + for i := range haystack { + if p == &haystack[i] { + return i + } + } + // TODO: what if the overlap is by a non-integral number of Es? + panic("needle not found") +} + +// Reverse reverses the elements of the slice in place. +func Reverse[S ~[]E, E any](s S) { + for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } +} diff --git a/vendor/golang.org/x/exp/slices/sort.go b/vendor/golang.org/x/exp/slices/sort.go new file mode 100644 index 0000000000..f58bbc7ba4 --- /dev/null +++ b/vendor/golang.org/x/exp/slices/sort.go @@ -0,0 +1,197 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:generate go run $GOROOT/src/sort/gen_sort_variants.go -exp + +package slices + +import ( + "math/bits" + + "golang.org/x/exp/constraints" +) + +// Sort sorts a slice of any ordered type in ascending order. +// When sorting floating-point numbers, NaNs are ordered before other values. +func Sort[S ~[]E, E constraints.Ordered](x S) { + n := len(x) + pdqsortOrdered(x, 0, n, bits.Len(uint(n))) +} + +// SortFunc sorts the slice x in ascending order as determined by the cmp +// function. This sort is not guaranteed to be stable. +// cmp(a, b) should return a negative number when a < b, a positive number when +// a > b and zero when a == b or when a is not comparable to b in the sense +// of the formal definition of Strict Weak Ordering. +// +// SortFunc requires that cmp is a strict weak ordering. +// See https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings. +// To indicate 'uncomparable', return 0 from the function. +func SortFunc[S ~[]E, E any](x S, cmp func(a, b E) int) { + n := len(x) + pdqsortCmpFunc(x, 0, n, bits.Len(uint(n)), cmp) +} + +// SortStableFunc sorts the slice x while keeping the original order of equal +// elements, using cmp to compare elements in the same way as [SortFunc]. +func SortStableFunc[S ~[]E, E any](x S, cmp func(a, b E) int) { + stableCmpFunc(x, len(x), cmp) +} + +// IsSorted reports whether x is sorted in ascending order. +func IsSorted[S ~[]E, E constraints.Ordered](x S) bool { + for i := len(x) - 1; i > 0; i-- { + if cmpLess(x[i], x[i-1]) { + return false + } + } + return true +} + +// IsSortedFunc reports whether x is sorted in ascending order, with cmp as the +// comparison function as defined by [SortFunc]. +func IsSortedFunc[S ~[]E, E any](x S, cmp func(a, b E) int) bool { + for i := len(x) - 1; i > 0; i-- { + if cmp(x[i], x[i-1]) < 0 { + return false + } + } + return true +} + +// Min returns the minimal value in x. It panics if x is empty. +// For floating-point numbers, Min propagates NaNs (any NaN value in x +// forces the output to be NaN). +func Min[S ~[]E, E constraints.Ordered](x S) E { + if len(x) < 1 { + panic("slices.Min: empty list") + } + m := x[0] + for i := 1; i < len(x); i++ { + m = min(m, x[i]) + } + return m +} + +// MinFunc returns the minimal value in x, using cmp to compare elements. +// It panics if x is empty. If there is more than one minimal element +// according to the cmp function, MinFunc returns the first one. +func MinFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E { + if len(x) < 1 { + panic("slices.MinFunc: empty list") + } + m := x[0] + for i := 1; i < len(x); i++ { + if cmp(x[i], m) < 0 { + m = x[i] + } + } + return m +} + +// Max returns the maximal value in x. It panics if x is empty. +// For floating-point E, Max propagates NaNs (any NaN value in x +// forces the output to be NaN). +func Max[S ~[]E, E constraints.Ordered](x S) E { + if len(x) < 1 { + panic("slices.Max: empty list") + } + m := x[0] + for i := 1; i < len(x); i++ { + m = max(m, x[i]) + } + return m +} + +// MaxFunc returns the maximal value in x, using cmp to compare elements. +// It panics if x is empty. If there is more than one maximal element +// according to the cmp function, MaxFunc returns the first one. +func MaxFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E { + if len(x) < 1 { + panic("slices.MaxFunc: empty list") + } + m := x[0] + for i := 1; i < len(x); i++ { + if cmp(x[i], m) > 0 { + m = x[i] + } + } + return m +} + +// BinarySearch searches for target in a sorted slice and returns the position +// where target is found, or the position where target would appear in the +// sort order; it also returns a bool saying whether the target is really found +// in the slice. The slice must be sorted in increasing order. +func BinarySearch[S ~[]E, E constraints.Ordered](x S, target E) (int, bool) { + // Inlining is faster than calling BinarySearchFunc with a lambda. + n := len(x) + // Define x[-1] < target and x[n] >= target. + // Invariant: x[i-1] < target, x[j] >= target. + i, j := 0, n + for i < j { + h := int(uint(i+j) >> 1) // avoid overflow when computing h + // i ≤ h < j + if cmpLess(x[h], target) { + i = h + 1 // preserves x[i-1] < target + } else { + j = h // preserves x[j] >= target + } + } + // i == j, x[i-1] < target, and x[j] (= x[i]) >= target => answer is i. + return i, i < n && (x[i] == target || (isNaN(x[i]) && isNaN(target))) +} + +// BinarySearchFunc works like [BinarySearch], but uses a custom comparison +// function. The slice must be sorted in increasing order, where "increasing" +// is defined by cmp. cmp should return 0 if the slice element matches +// the target, a negative number if the slice element precedes the target, +// or a positive number if the slice element follows the target. +// cmp must implement the same ordering as the slice, such that if +// cmp(a, t) < 0 and cmp(b, t) >= 0, then a must precede b in the slice. +func BinarySearchFunc[S ~[]E, E, T any](x S, target T, cmp func(E, T) int) (int, bool) { + n := len(x) + // Define cmp(x[-1], target) < 0 and cmp(x[n], target) >= 0 . + // Invariant: cmp(x[i - 1], target) < 0, cmp(x[j], target) >= 0. + i, j := 0, n + for i < j { + h := int(uint(i+j) >> 1) // avoid overflow when computing h + // i ≤ h < j + if cmp(x[h], target) < 0 { + i = h + 1 // preserves cmp(x[i - 1], target) < 0 + } else { + j = h // preserves cmp(x[j], target) >= 0 + } + } + // i == j, cmp(x[i-1], target) < 0, and cmp(x[j], target) (= cmp(x[i], target)) >= 0 => answer is i. + return i, i < n && cmp(x[i], target) == 0 +} + +type sortedHint int // hint for pdqsort when choosing the pivot + +const ( + unknownHint sortedHint = iota + increasingHint + decreasingHint +) + +// xorshift paper: https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf +type xorshift uint64 + +func (r *xorshift) Next() uint64 { + *r ^= *r << 13 + *r ^= *r >> 17 + *r ^= *r << 5 + return uint64(*r) +} + +func nextPowerOfTwo(length int) uint { + return 1 << bits.Len(uint(length)) +} + +// isNaN reports whether x is a NaN without requiring the math package. +// This will always return false if T is not floating-point. +func isNaN[T constraints.Ordered](x T) bool { + return x != x +} diff --git a/vendor/golang.org/x/exp/slices/zsortanyfunc.go b/vendor/golang.org/x/exp/slices/zsortanyfunc.go new file mode 100644 index 0000000000..06f2c7a248 --- /dev/null +++ b/vendor/golang.org/x/exp/slices/zsortanyfunc.go @@ -0,0 +1,479 @@ +// Code generated by gen_sort_variants.go; DO NOT EDIT. + +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slices + +// insertionSortCmpFunc sorts data[a:b] using insertion sort. +func insertionSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + for i := a + 1; i < b; i++ { + for j := i; j > a && (cmp(data[j], data[j-1]) < 0); j-- { + data[j], data[j-1] = data[j-1], data[j] + } + } +} + +// siftDownCmpFunc implements the heap property on data[lo:hi]. +// first is an offset into the array where the root of the heap lies. +func siftDownCmpFunc[E any](data []E, lo, hi, first int, cmp func(a, b E) int) { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && (cmp(data[first+child], data[first+child+1]) < 0) { + child++ + } + if !(cmp(data[first+root], data[first+child]) < 0) { + return + } + data[first+root], data[first+child] = data[first+child], data[first+root] + root = child + } +} + +func heapSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + first := a + lo := 0 + hi := b - a + + // Build heap with greatest element at top. + for i := (hi - 1) / 2; i >= 0; i-- { + siftDownCmpFunc(data, i, hi, first, cmp) + } + + // Pop elements, largest first, into end of data. + for i := hi - 1; i >= 0; i-- { + data[first], data[first+i] = data[first+i], data[first] + siftDownCmpFunc(data, lo, i, first, cmp) + } +} + +// pdqsortCmpFunc sorts data[a:b]. +// The algorithm based on pattern-defeating quicksort(pdqsort), but without the optimizations from BlockQuicksort. +// pdqsort paper: https://arxiv.org/pdf/2106.05123.pdf +// C++ implementation: https://github.com/orlp/pdqsort +// Rust implementation: https://docs.rs/pdqsort/latest/pdqsort/ +// limit is the number of allowed bad (very unbalanced) pivots before falling back to heapsort. +func pdqsortCmpFunc[E any](data []E, a, b, limit int, cmp func(a, b E) int) { + const maxInsertion = 12 + + var ( + wasBalanced = true // whether the last partitioning was reasonably balanced + wasPartitioned = true // whether the slice was already partitioned + ) + + for { + length := b - a + + if length <= maxInsertion { + insertionSortCmpFunc(data, a, b, cmp) + return + } + + // Fall back to heapsort if too many bad choices were made. + if limit == 0 { + heapSortCmpFunc(data, a, b, cmp) + return + } + + // If the last partitioning was imbalanced, we need to breaking patterns. + if !wasBalanced { + breakPatternsCmpFunc(data, a, b, cmp) + limit-- + } + + pivot, hint := choosePivotCmpFunc(data, a, b, cmp) + if hint == decreasingHint { + reverseRangeCmpFunc(data, a, b, cmp) + // The chosen pivot was pivot-a elements after the start of the array. + // After reversing it is pivot-a elements before the end of the array. + // The idea came from Rust's implementation. + pivot = (b - 1) - (pivot - a) + hint = increasingHint + } + + // The slice is likely already sorted. + if wasBalanced && wasPartitioned && hint == increasingHint { + if partialInsertionSortCmpFunc(data, a, b, cmp) { + return + } + } + + // Probably the slice contains many duplicate elements, partition the slice into + // elements equal to and elements greater than the pivot. + if a > 0 && !(cmp(data[a-1], data[pivot]) < 0) { + mid := partitionEqualCmpFunc(data, a, b, pivot, cmp) + a = mid + continue + } + + mid, alreadyPartitioned := partitionCmpFunc(data, a, b, pivot, cmp) + wasPartitioned = alreadyPartitioned + + leftLen, rightLen := mid-a, b-mid + balanceThreshold := length / 8 + if leftLen < rightLen { + wasBalanced = leftLen >= balanceThreshold + pdqsortCmpFunc(data, a, mid, limit, cmp) + a = mid + 1 + } else { + wasBalanced = rightLen >= balanceThreshold + pdqsortCmpFunc(data, mid+1, b, limit, cmp) + b = mid + } + } +} + +// partitionCmpFunc does one quicksort partition. +// Let p = data[pivot] +// Moves elements in data[a:b] around, so that data[i]

=p for inewpivot. +// On return, data[newpivot] = p +func partitionCmpFunc[E any](data []E, a, b, pivot int, cmp func(a, b E) int) (newpivot int, alreadyPartitioned bool) { + data[a], data[pivot] = data[pivot], data[a] + i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned + + for i <= j && (cmp(data[i], data[a]) < 0) { + i++ + } + for i <= j && !(cmp(data[j], data[a]) < 0) { + j-- + } + if i > j { + data[j], data[a] = data[a], data[j] + return j, true + } + data[i], data[j] = data[j], data[i] + i++ + j-- + + for { + for i <= j && (cmp(data[i], data[a]) < 0) { + i++ + } + for i <= j && !(cmp(data[j], data[a]) < 0) { + j-- + } + if i > j { + break + } + data[i], data[j] = data[j], data[i] + i++ + j-- + } + data[j], data[a] = data[a], data[j] + return j, false +} + +// partitionEqualCmpFunc partitions data[a:b] into elements equal to data[pivot] followed by elements greater than data[pivot]. +// It assumed that data[a:b] does not contain elements smaller than the data[pivot]. +func partitionEqualCmpFunc[E any](data []E, a, b, pivot int, cmp func(a, b E) int) (newpivot int) { + data[a], data[pivot] = data[pivot], data[a] + i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned + + for { + for i <= j && !(cmp(data[a], data[i]) < 0) { + i++ + } + for i <= j && (cmp(data[a], data[j]) < 0) { + j-- + } + if i > j { + break + } + data[i], data[j] = data[j], data[i] + i++ + j-- + } + return i +} + +// partialInsertionSortCmpFunc partially sorts a slice, returns true if the slice is sorted at the end. +func partialInsertionSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) bool { + const ( + maxSteps = 5 // maximum number of adjacent out-of-order pairs that will get shifted + shortestShifting = 50 // don't shift any elements on short arrays + ) + i := a + 1 + for j := 0; j < maxSteps; j++ { + for i < b && !(cmp(data[i], data[i-1]) < 0) { + i++ + } + + if i == b { + return true + } + + if b-a < shortestShifting { + return false + } + + data[i], data[i-1] = data[i-1], data[i] + + // Shift the smaller one to the left. + if i-a >= 2 { + for j := i - 1; j >= 1; j-- { + if !(cmp(data[j], data[j-1]) < 0) { + break + } + data[j], data[j-1] = data[j-1], data[j] + } + } + // Shift the greater one to the right. + if b-i >= 2 { + for j := i + 1; j < b; j++ { + if !(cmp(data[j], data[j-1]) < 0) { + break + } + data[j], data[j-1] = data[j-1], data[j] + } + } + } + return false +} + +// breakPatternsCmpFunc scatters some elements around in an attempt to break some patterns +// that might cause imbalanced partitions in quicksort. +func breakPatternsCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + length := b - a + if length >= 8 { + random := xorshift(length) + modulus := nextPowerOfTwo(length) + + for idx := a + (length/4)*2 - 1; idx <= a+(length/4)*2+1; idx++ { + other := int(uint(random.Next()) & (modulus - 1)) + if other >= length { + other -= length + } + data[idx], data[a+other] = data[a+other], data[idx] + } + } +} + +// choosePivotCmpFunc chooses a pivot in data[a:b]. +// +// [0,8): chooses a static pivot. +// [8,shortestNinther): uses the simple median-of-three method. +// [shortestNinther,∞): uses the Tukey ninther method. +func choosePivotCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) (pivot int, hint sortedHint) { + const ( + shortestNinther = 50 + maxSwaps = 4 * 3 + ) + + l := b - a + + var ( + swaps int + i = a + l/4*1 + j = a + l/4*2 + k = a + l/4*3 + ) + + if l >= 8 { + if l >= shortestNinther { + // Tukey ninther method, the idea came from Rust's implementation. + i = medianAdjacentCmpFunc(data, i, &swaps, cmp) + j = medianAdjacentCmpFunc(data, j, &swaps, cmp) + k = medianAdjacentCmpFunc(data, k, &swaps, cmp) + } + // Find the median among i, j, k and stores it into j. + j = medianCmpFunc(data, i, j, k, &swaps, cmp) + } + + switch swaps { + case 0: + return j, increasingHint + case maxSwaps: + return j, decreasingHint + default: + return j, unknownHint + } +} + +// order2CmpFunc returns x,y where data[x] <= data[y], where x,y=a,b or x,y=b,a. +func order2CmpFunc[E any](data []E, a, b int, swaps *int, cmp func(a, b E) int) (int, int) { + if cmp(data[b], data[a]) < 0 { + *swaps++ + return b, a + } + return a, b +} + +// medianCmpFunc returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c. +func medianCmpFunc[E any](data []E, a, b, c int, swaps *int, cmp func(a, b E) int) int { + a, b = order2CmpFunc(data, a, b, swaps, cmp) + b, c = order2CmpFunc(data, b, c, swaps, cmp) + a, b = order2CmpFunc(data, a, b, swaps, cmp) + return b +} + +// medianAdjacentCmpFunc finds the median of data[a - 1], data[a], data[a + 1] and stores the index into a. +func medianAdjacentCmpFunc[E any](data []E, a int, swaps *int, cmp func(a, b E) int) int { + return medianCmpFunc(data, a-1, a, a+1, swaps, cmp) +} + +func reverseRangeCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + i := a + j := b - 1 + for i < j { + data[i], data[j] = data[j], data[i] + i++ + j-- + } +} + +func swapRangeCmpFunc[E any](data []E, a, b, n int, cmp func(a, b E) int) { + for i := 0; i < n; i++ { + data[a+i], data[b+i] = data[b+i], data[a+i] + } +} + +func stableCmpFunc[E any](data []E, n int, cmp func(a, b E) int) { + blockSize := 20 // must be > 0 + a, b := 0, blockSize + for b <= n { + insertionSortCmpFunc(data, a, b, cmp) + a = b + b += blockSize + } + insertionSortCmpFunc(data, a, n, cmp) + + for blockSize < n { + a, b = 0, 2*blockSize + for b <= n { + symMergeCmpFunc(data, a, a+blockSize, b, cmp) + a = b + b += 2 * blockSize + } + if m := a + blockSize; m < n { + symMergeCmpFunc(data, a, m, n, cmp) + } + blockSize *= 2 + } +} + +// symMergeCmpFunc merges the two sorted subsequences data[a:m] and data[m:b] using +// the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum +// Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz +// Radzik, editors, Algorithms - ESA 2004, volume 3221 of Lecture Notes in +// Computer Science, pages 714-723. Springer, 2004. +// +// Let M = m-a and N = b-n. Wolog M < N. +// The recursion depth is bound by ceil(log(N+M)). +// The algorithm needs O(M*log(N/M + 1)) calls to data.Less. +// The algorithm needs O((M+N)*log(M)) calls to data.Swap. +// +// The paper gives O((M+N)*log(M)) as the number of assignments assuming a +// rotation algorithm which uses O(M+N+gcd(M+N)) assignments. The argumentation +// in the paper carries through for Swap operations, especially as the block +// swapping rotate uses only O(M+N) Swaps. +// +// symMerge assumes non-degenerate arguments: a < m && m < b. +// Having the caller check this condition eliminates many leaf recursion calls, +// which improves performance. +func symMergeCmpFunc[E any](data []E, a, m, b int, cmp func(a, b E) int) { + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[a] into data[m:b] + // if data[a:m] only contains one element. + if m-a == 1 { + // Use binary search to find the lowest index i + // such that data[i] >= data[a] for m <= i < b. + // Exit the search loop with i == b in case no such index exists. + i := m + j := b + for i < j { + h := int(uint(i+j) >> 1) + if cmp(data[h], data[a]) < 0 { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[a] reaches the position before i. + for k := a; k < i-1; k++ { + data[k], data[k+1] = data[k+1], data[k] + } + return + } + + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[m] into data[a:m] + // if data[m:b] only contains one element. + if b-m == 1 { + // Use binary search to find the lowest index i + // such that data[i] > data[m] for a <= i < m. + // Exit the search loop with i == m in case no such index exists. + i := a + j := m + for i < j { + h := int(uint(i+j) >> 1) + if !(cmp(data[m], data[h]) < 0) { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[m] reaches the position i. + for k := m; k > i; k-- { + data[k], data[k-1] = data[k-1], data[k] + } + return + } + + mid := int(uint(a+b) >> 1) + n := mid + m + var start, r int + if m > mid { + start = n - b + r = mid + } else { + start = a + r = m + } + p := n - 1 + + for start < r { + c := int(uint(start+r) >> 1) + if !(cmp(data[p-c], data[c]) < 0) { + start = c + 1 + } else { + r = c + } + } + + end := n - start + if start < m && m < end { + rotateCmpFunc(data, start, m, end, cmp) + } + if a < start && start < mid { + symMergeCmpFunc(data, a, start, mid, cmp) + } + if mid < end && end < b { + symMergeCmpFunc(data, mid, end, b, cmp) + } +} + +// rotateCmpFunc rotates two consecutive blocks u = data[a:m] and v = data[m:b] in data: +// Data of the form 'x u v y' is changed to 'x v u y'. +// rotate performs at most b-a many calls to data.Swap, +// and it assumes non-degenerate arguments: a < m && m < b. +func rotateCmpFunc[E any](data []E, a, m, b int, cmp func(a, b E) int) { + i := m - a + j := b - m + + for i != j { + if i > j { + swapRangeCmpFunc(data, m-i, m, j, cmp) + i -= j + } else { + swapRangeCmpFunc(data, m-i, m+j-i, i, cmp) + j -= i + } + } + // i == j + swapRangeCmpFunc(data, m-i, m, i, cmp) +} diff --git a/vendor/golang.org/x/exp/slices/zsortordered.go b/vendor/golang.org/x/exp/slices/zsortordered.go new file mode 100644 index 0000000000..99b47c3986 --- /dev/null +++ b/vendor/golang.org/x/exp/slices/zsortordered.go @@ -0,0 +1,481 @@ +// Code generated by gen_sort_variants.go; DO NOT EDIT. + +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slices + +import "golang.org/x/exp/constraints" + +// insertionSortOrdered sorts data[a:b] using insertion sort. +func insertionSortOrdered[E constraints.Ordered](data []E, a, b int) { + for i := a + 1; i < b; i++ { + for j := i; j > a && cmpLess(data[j], data[j-1]); j-- { + data[j], data[j-1] = data[j-1], data[j] + } + } +} + +// siftDownOrdered implements the heap property on data[lo:hi]. +// first is an offset into the array where the root of the heap lies. +func siftDownOrdered[E constraints.Ordered](data []E, lo, hi, first int) { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && cmpLess(data[first+child], data[first+child+1]) { + child++ + } + if !cmpLess(data[first+root], data[first+child]) { + return + } + data[first+root], data[first+child] = data[first+child], data[first+root] + root = child + } +} + +func heapSortOrdered[E constraints.Ordered](data []E, a, b int) { + first := a + lo := 0 + hi := b - a + + // Build heap with greatest element at top. + for i := (hi - 1) / 2; i >= 0; i-- { + siftDownOrdered(data, i, hi, first) + } + + // Pop elements, largest first, into end of data. + for i := hi - 1; i >= 0; i-- { + data[first], data[first+i] = data[first+i], data[first] + siftDownOrdered(data, lo, i, first) + } +} + +// pdqsortOrdered sorts data[a:b]. +// The algorithm based on pattern-defeating quicksort(pdqsort), but without the optimizations from BlockQuicksort. +// pdqsort paper: https://arxiv.org/pdf/2106.05123.pdf +// C++ implementation: https://github.com/orlp/pdqsort +// Rust implementation: https://docs.rs/pdqsort/latest/pdqsort/ +// limit is the number of allowed bad (very unbalanced) pivots before falling back to heapsort. +func pdqsortOrdered[E constraints.Ordered](data []E, a, b, limit int) { + const maxInsertion = 12 + + var ( + wasBalanced = true // whether the last partitioning was reasonably balanced + wasPartitioned = true // whether the slice was already partitioned + ) + + for { + length := b - a + + if length <= maxInsertion { + insertionSortOrdered(data, a, b) + return + } + + // Fall back to heapsort if too many bad choices were made. + if limit == 0 { + heapSortOrdered(data, a, b) + return + } + + // If the last partitioning was imbalanced, we need to breaking patterns. + if !wasBalanced { + breakPatternsOrdered(data, a, b) + limit-- + } + + pivot, hint := choosePivotOrdered(data, a, b) + if hint == decreasingHint { + reverseRangeOrdered(data, a, b) + // The chosen pivot was pivot-a elements after the start of the array. + // After reversing it is pivot-a elements before the end of the array. + // The idea came from Rust's implementation. + pivot = (b - 1) - (pivot - a) + hint = increasingHint + } + + // The slice is likely already sorted. + if wasBalanced && wasPartitioned && hint == increasingHint { + if partialInsertionSortOrdered(data, a, b) { + return + } + } + + // Probably the slice contains many duplicate elements, partition the slice into + // elements equal to and elements greater than the pivot. + if a > 0 && !cmpLess(data[a-1], data[pivot]) { + mid := partitionEqualOrdered(data, a, b, pivot) + a = mid + continue + } + + mid, alreadyPartitioned := partitionOrdered(data, a, b, pivot) + wasPartitioned = alreadyPartitioned + + leftLen, rightLen := mid-a, b-mid + balanceThreshold := length / 8 + if leftLen < rightLen { + wasBalanced = leftLen >= balanceThreshold + pdqsortOrdered(data, a, mid, limit) + a = mid + 1 + } else { + wasBalanced = rightLen >= balanceThreshold + pdqsortOrdered(data, mid+1, b, limit) + b = mid + } + } +} + +// partitionOrdered does one quicksort partition. +// Let p = data[pivot] +// Moves elements in data[a:b] around, so that data[i]

=p for inewpivot. +// On return, data[newpivot] = p +func partitionOrdered[E constraints.Ordered](data []E, a, b, pivot int) (newpivot int, alreadyPartitioned bool) { + data[a], data[pivot] = data[pivot], data[a] + i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned + + for i <= j && cmpLess(data[i], data[a]) { + i++ + } + for i <= j && !cmpLess(data[j], data[a]) { + j-- + } + if i > j { + data[j], data[a] = data[a], data[j] + return j, true + } + data[i], data[j] = data[j], data[i] + i++ + j-- + + for { + for i <= j && cmpLess(data[i], data[a]) { + i++ + } + for i <= j && !cmpLess(data[j], data[a]) { + j-- + } + if i > j { + break + } + data[i], data[j] = data[j], data[i] + i++ + j-- + } + data[j], data[a] = data[a], data[j] + return j, false +} + +// partitionEqualOrdered partitions data[a:b] into elements equal to data[pivot] followed by elements greater than data[pivot]. +// It assumed that data[a:b] does not contain elements smaller than the data[pivot]. +func partitionEqualOrdered[E constraints.Ordered](data []E, a, b, pivot int) (newpivot int) { + data[a], data[pivot] = data[pivot], data[a] + i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned + + for { + for i <= j && !cmpLess(data[a], data[i]) { + i++ + } + for i <= j && cmpLess(data[a], data[j]) { + j-- + } + if i > j { + break + } + data[i], data[j] = data[j], data[i] + i++ + j-- + } + return i +} + +// partialInsertionSortOrdered partially sorts a slice, returns true if the slice is sorted at the end. +func partialInsertionSortOrdered[E constraints.Ordered](data []E, a, b int) bool { + const ( + maxSteps = 5 // maximum number of adjacent out-of-order pairs that will get shifted + shortestShifting = 50 // don't shift any elements on short arrays + ) + i := a + 1 + for j := 0; j < maxSteps; j++ { + for i < b && !cmpLess(data[i], data[i-1]) { + i++ + } + + if i == b { + return true + } + + if b-a < shortestShifting { + return false + } + + data[i], data[i-1] = data[i-1], data[i] + + // Shift the smaller one to the left. + if i-a >= 2 { + for j := i - 1; j >= 1; j-- { + if !cmpLess(data[j], data[j-1]) { + break + } + data[j], data[j-1] = data[j-1], data[j] + } + } + // Shift the greater one to the right. + if b-i >= 2 { + for j := i + 1; j < b; j++ { + if !cmpLess(data[j], data[j-1]) { + break + } + data[j], data[j-1] = data[j-1], data[j] + } + } + } + return false +} + +// breakPatternsOrdered scatters some elements around in an attempt to break some patterns +// that might cause imbalanced partitions in quicksort. +func breakPatternsOrdered[E constraints.Ordered](data []E, a, b int) { + length := b - a + if length >= 8 { + random := xorshift(length) + modulus := nextPowerOfTwo(length) + + for idx := a + (length/4)*2 - 1; idx <= a+(length/4)*2+1; idx++ { + other := int(uint(random.Next()) & (modulus - 1)) + if other >= length { + other -= length + } + data[idx], data[a+other] = data[a+other], data[idx] + } + } +} + +// choosePivotOrdered chooses a pivot in data[a:b]. +// +// [0,8): chooses a static pivot. +// [8,shortestNinther): uses the simple median-of-three method. +// [shortestNinther,∞): uses the Tukey ninther method. +func choosePivotOrdered[E constraints.Ordered](data []E, a, b int) (pivot int, hint sortedHint) { + const ( + shortestNinther = 50 + maxSwaps = 4 * 3 + ) + + l := b - a + + var ( + swaps int + i = a + l/4*1 + j = a + l/4*2 + k = a + l/4*3 + ) + + if l >= 8 { + if l >= shortestNinther { + // Tukey ninther method, the idea came from Rust's implementation. + i = medianAdjacentOrdered(data, i, &swaps) + j = medianAdjacentOrdered(data, j, &swaps) + k = medianAdjacentOrdered(data, k, &swaps) + } + // Find the median among i, j, k and stores it into j. + j = medianOrdered(data, i, j, k, &swaps) + } + + switch swaps { + case 0: + return j, increasingHint + case maxSwaps: + return j, decreasingHint + default: + return j, unknownHint + } +} + +// order2Ordered returns x,y where data[x] <= data[y], where x,y=a,b or x,y=b,a. +func order2Ordered[E constraints.Ordered](data []E, a, b int, swaps *int) (int, int) { + if cmpLess(data[b], data[a]) { + *swaps++ + return b, a + } + return a, b +} + +// medianOrdered returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c. +func medianOrdered[E constraints.Ordered](data []E, a, b, c int, swaps *int) int { + a, b = order2Ordered(data, a, b, swaps) + b, c = order2Ordered(data, b, c, swaps) + a, b = order2Ordered(data, a, b, swaps) + return b +} + +// medianAdjacentOrdered finds the median of data[a - 1], data[a], data[a + 1] and stores the index into a. +func medianAdjacentOrdered[E constraints.Ordered](data []E, a int, swaps *int) int { + return medianOrdered(data, a-1, a, a+1, swaps) +} + +func reverseRangeOrdered[E constraints.Ordered](data []E, a, b int) { + i := a + j := b - 1 + for i < j { + data[i], data[j] = data[j], data[i] + i++ + j-- + } +} + +func swapRangeOrdered[E constraints.Ordered](data []E, a, b, n int) { + for i := 0; i < n; i++ { + data[a+i], data[b+i] = data[b+i], data[a+i] + } +} + +func stableOrdered[E constraints.Ordered](data []E, n int) { + blockSize := 20 // must be > 0 + a, b := 0, blockSize + for b <= n { + insertionSortOrdered(data, a, b) + a = b + b += blockSize + } + insertionSortOrdered(data, a, n) + + for blockSize < n { + a, b = 0, 2*blockSize + for b <= n { + symMergeOrdered(data, a, a+blockSize, b) + a = b + b += 2 * blockSize + } + if m := a + blockSize; m < n { + symMergeOrdered(data, a, m, n) + } + blockSize *= 2 + } +} + +// symMergeOrdered merges the two sorted subsequences data[a:m] and data[m:b] using +// the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum +// Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz +// Radzik, editors, Algorithms - ESA 2004, volume 3221 of Lecture Notes in +// Computer Science, pages 714-723. Springer, 2004. +// +// Let M = m-a and N = b-n. Wolog M < N. +// The recursion depth is bound by ceil(log(N+M)). +// The algorithm needs O(M*log(N/M + 1)) calls to data.Less. +// The algorithm needs O((M+N)*log(M)) calls to data.Swap. +// +// The paper gives O((M+N)*log(M)) as the number of assignments assuming a +// rotation algorithm which uses O(M+N+gcd(M+N)) assignments. The argumentation +// in the paper carries through for Swap operations, especially as the block +// swapping rotate uses only O(M+N) Swaps. +// +// symMerge assumes non-degenerate arguments: a < m && m < b. +// Having the caller check this condition eliminates many leaf recursion calls, +// which improves performance. +func symMergeOrdered[E constraints.Ordered](data []E, a, m, b int) { + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[a] into data[m:b] + // if data[a:m] only contains one element. + if m-a == 1 { + // Use binary search to find the lowest index i + // such that data[i] >= data[a] for m <= i < b. + // Exit the search loop with i == b in case no such index exists. + i := m + j := b + for i < j { + h := int(uint(i+j) >> 1) + if cmpLess(data[h], data[a]) { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[a] reaches the position before i. + for k := a; k < i-1; k++ { + data[k], data[k+1] = data[k+1], data[k] + } + return + } + + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[m] into data[a:m] + // if data[m:b] only contains one element. + if b-m == 1 { + // Use binary search to find the lowest index i + // such that data[i] > data[m] for a <= i < m. + // Exit the search loop with i == m in case no such index exists. + i := a + j := m + for i < j { + h := int(uint(i+j) >> 1) + if !cmpLess(data[m], data[h]) { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[m] reaches the position i. + for k := m; k > i; k-- { + data[k], data[k-1] = data[k-1], data[k] + } + return + } + + mid := int(uint(a+b) >> 1) + n := mid + m + var start, r int + if m > mid { + start = n - b + r = mid + } else { + start = a + r = m + } + p := n - 1 + + for start < r { + c := int(uint(start+r) >> 1) + if !cmpLess(data[p-c], data[c]) { + start = c + 1 + } else { + r = c + } + } + + end := n - start + if start < m && m < end { + rotateOrdered(data, start, m, end) + } + if a < start && start < mid { + symMergeOrdered(data, a, start, mid) + } + if mid < end && end < b { + symMergeOrdered(data, mid, end, b) + } +} + +// rotateOrdered rotates two consecutive blocks u = data[a:m] and v = data[m:b] in data: +// Data of the form 'x u v y' is changed to 'x v u y'. +// rotate performs at most b-a many calls to data.Swap, +// and it assumes non-degenerate arguments: a < m && m < b. +func rotateOrdered[E constraints.Ordered](data []E, a, m, b int) { + i := m - a + j := b - m + + for i != j { + if i > j { + swapRangeOrdered(data, m-i, m, j) + i -= j + } else { + swapRangeOrdered(data, m-i, m+j-i, i) + j -= i + } + } + // i == j + swapRangeOrdered(data, m-i, m, i) +} diff --git a/vendor/golang.org/x/exp/slog/attr.go b/vendor/golang.org/x/exp/slog/attr.go new file mode 100644 index 0000000000..a180d0e1d3 --- /dev/null +++ b/vendor/golang.org/x/exp/slog/attr.go @@ -0,0 +1,102 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slog + +import ( + "fmt" + "time" +) + +// An Attr is a key-value pair. +type Attr struct { + Key string + Value Value +} + +// String returns an Attr for a string value. +func String(key, value string) Attr { + return Attr{key, StringValue(value)} +} + +// Int64 returns an Attr for an int64. +func Int64(key string, value int64) Attr { + return Attr{key, Int64Value(value)} +} + +// Int converts an int to an int64 and returns +// an Attr with that value. +func Int(key string, value int) Attr { + return Int64(key, int64(value)) +} + +// Uint64 returns an Attr for a uint64. +func Uint64(key string, v uint64) Attr { + return Attr{key, Uint64Value(v)} +} + +// Float64 returns an Attr for a floating-point number. +func Float64(key string, v float64) Attr { + return Attr{key, Float64Value(v)} +} + +// Bool returns an Attr for a bool. +func Bool(key string, v bool) Attr { + return Attr{key, BoolValue(v)} +} + +// Time returns an Attr for a time.Time. +// It discards the monotonic portion. +func Time(key string, v time.Time) Attr { + return Attr{key, TimeValue(v)} +} + +// Duration returns an Attr for a time.Duration. +func Duration(key string, v time.Duration) Attr { + return Attr{key, DurationValue(v)} +} + +// Group returns an Attr for a Group Value. +// The first argument is the key; the remaining arguments +// are converted to Attrs as in [Logger.Log]. +// +// Use Group to collect several key-value pairs under a single +// key on a log line, or as the result of LogValue +// in order to log a single value as multiple Attrs. +func Group(key string, args ...any) Attr { + return Attr{key, GroupValue(argsToAttrSlice(args)...)} +} + +func argsToAttrSlice(args []any) []Attr { + var ( + attr Attr + attrs []Attr + ) + for len(args) > 0 { + attr, args = argsToAttr(args) + attrs = append(attrs, attr) + } + return attrs +} + +// Any returns an Attr for the supplied value. +// See [Value.AnyValue] for how values are treated. +func Any(key string, value any) Attr { + return Attr{key, AnyValue(value)} +} + +// Equal reports whether a and b have equal keys and values. +func (a Attr) Equal(b Attr) bool { + return a.Key == b.Key && a.Value.Equal(b.Value) +} + +func (a Attr) String() string { + return fmt.Sprintf("%s=%s", a.Key, a.Value) +} + +// isEmpty reports whether a has an empty key and a nil value. +// That can be written as Attr{} or Any("", nil). +func (a Attr) isEmpty() bool { + return a.Key == "" && a.Value.num == 0 && a.Value.any == nil +} diff --git a/vendor/golang.org/x/exp/slog/doc.go b/vendor/golang.org/x/exp/slog/doc.go new file mode 100644 index 0000000000..4beaf86748 --- /dev/null +++ b/vendor/golang.org/x/exp/slog/doc.go @@ -0,0 +1,316 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package slog provides structured logging, +in which log records include a message, +a severity level, and various other attributes +expressed as key-value pairs. + +It defines a type, [Logger], +which provides several methods (such as [Logger.Info] and [Logger.Error]) +for reporting events of interest. + +Each Logger is associated with a [Handler]. +A Logger output method creates a [Record] from the method arguments +and passes it to the Handler, which decides how to handle it. +There is a default Logger accessible through top-level functions +(such as [Info] and [Error]) that call the corresponding Logger methods. + +A log record consists of a time, a level, a message, and a set of key-value +pairs, where the keys are strings and the values may be of any type. +As an example, + + slog.Info("hello", "count", 3) + +creates a record containing the time of the call, +a level of Info, the message "hello", and a single +pair with key "count" and value 3. + +The [Info] top-level function calls the [Logger.Info] method on the default Logger. +In addition to [Logger.Info], there are methods for Debug, Warn and Error levels. +Besides these convenience methods for common levels, +there is also a [Logger.Log] method which takes the level as an argument. +Each of these methods has a corresponding top-level function that uses the +default logger. + +The default handler formats the log record's message, time, level, and attributes +as a string and passes it to the [log] package. + + 2022/11/08 15:28:26 INFO hello count=3 + +For more control over the output format, create a logger with a different handler. +This statement uses [New] to create a new logger with a TextHandler +that writes structured records in text form to standard error: + + logger := slog.New(slog.NewTextHandler(os.Stderr, nil)) + +[TextHandler] output is a sequence of key=value pairs, easily and unambiguously +parsed by machine. This statement: + + logger.Info("hello", "count", 3) + +produces this output: + + time=2022-11-08T15:28:26.000-05:00 level=INFO msg=hello count=3 + +The package also provides [JSONHandler], whose output is line-delimited JSON: + + logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) + logger.Info("hello", "count", 3) + +produces this output: + + {"time":"2022-11-08T15:28:26.000000000-05:00","level":"INFO","msg":"hello","count":3} + +Both [TextHandler] and [JSONHandler] can be configured with [HandlerOptions]. +There are options for setting the minimum level (see Levels, below), +displaying the source file and line of the log call, and +modifying attributes before they are logged. + +Setting a logger as the default with + + slog.SetDefault(logger) + +will cause the top-level functions like [Info] to use it. +[SetDefault] also updates the default logger used by the [log] package, +so that existing applications that use [log.Printf] and related functions +will send log records to the logger's handler without needing to be rewritten. + +Some attributes are common to many log calls. +For example, you may wish to include the URL or trace identifier of a server request +with all log events arising from the request. +Rather than repeat the attribute with every log call, you can use [Logger.With] +to construct a new Logger containing the attributes: + + logger2 := logger.With("url", r.URL) + +The arguments to With are the same key-value pairs used in [Logger.Info]. +The result is a new Logger with the same handler as the original, but additional +attributes that will appear in the output of every call. + +# Levels + +A [Level] is an integer representing the importance or severity of a log event. +The higher the level, the more severe the event. +This package defines constants for the most common levels, +but any int can be used as a level. + +In an application, you may wish to log messages only at a certain level or greater. +One common configuration is to log messages at Info or higher levels, +suppressing debug logging until it is needed. +The built-in handlers can be configured with the minimum level to output by +setting [HandlerOptions.Level]. +The program's `main` function typically does this. +The default value is LevelInfo. + +Setting the [HandlerOptions.Level] field to a [Level] value +fixes the handler's minimum level throughout its lifetime. +Setting it to a [LevelVar] allows the level to be varied dynamically. +A LevelVar holds a Level and is safe to read or write from multiple +goroutines. +To vary the level dynamically for an entire program, first initialize +a global LevelVar: + + var programLevel = new(slog.LevelVar) // Info by default + +Then use the LevelVar to construct a handler, and make it the default: + + h := slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{Level: programLevel}) + slog.SetDefault(slog.New(h)) + +Now the program can change its logging level with a single statement: + + programLevel.Set(slog.LevelDebug) + +# Groups + +Attributes can be collected into groups. +A group has a name that is used to qualify the names of its attributes. +How this qualification is displayed depends on the handler. +[TextHandler] separates the group and attribute names with a dot. +[JSONHandler] treats each group as a separate JSON object, with the group name as the key. + +Use [Group] to create a Group attribute from a name and a list of key-value pairs: + + slog.Group("request", + "method", r.Method, + "url", r.URL) + +TextHandler would display this group as + + request.method=GET request.url=http://example.com + +JSONHandler would display it as + + "request":{"method":"GET","url":"http://example.com"} + +Use [Logger.WithGroup] to qualify all of a Logger's output +with a group name. Calling WithGroup on a Logger results in a +new Logger with the same Handler as the original, but with all +its attributes qualified by the group name. + +This can help prevent duplicate attribute keys in large systems, +where subsystems might use the same keys. +Pass each subsystem a different Logger with its own group name so that +potential duplicates are qualified: + + logger := slog.Default().With("id", systemID) + parserLogger := logger.WithGroup("parser") + parseInput(input, parserLogger) + +When parseInput logs with parserLogger, its keys will be qualified with "parser", +so even if it uses the common key "id", the log line will have distinct keys. + +# Contexts + +Some handlers may wish to include information from the [context.Context] that is +available at the call site. One example of such information +is the identifier for the current span when tracing is enabled. + +The [Logger.Log] and [Logger.LogAttrs] methods take a context as a first +argument, as do their corresponding top-level functions. + +Although the convenience methods on Logger (Info and so on) and the +corresponding top-level functions do not take a context, the alternatives ending +in "Context" do. For example, + + slog.InfoContext(ctx, "message") + +It is recommended to pass a context to an output method if one is available. + +# Attrs and Values + +An [Attr] is a key-value pair. The Logger output methods accept Attrs as well as +alternating keys and values. The statement + + slog.Info("hello", slog.Int("count", 3)) + +behaves the same as + + slog.Info("hello", "count", 3) + +There are convenience constructors for [Attr] such as [Int], [String], and [Bool] +for common types, as well as the function [Any] for constructing Attrs of any +type. + +The value part of an Attr is a type called [Value]. +Like an [any], a Value can hold any Go value, +but it can represent typical values, including all numbers and strings, +without an allocation. + +For the most efficient log output, use [Logger.LogAttrs]. +It is similar to [Logger.Log] but accepts only Attrs, not alternating +keys and values; this allows it, too, to avoid allocation. + +The call + + logger.LogAttrs(nil, slog.LevelInfo, "hello", slog.Int("count", 3)) + +is the most efficient way to achieve the same output as + + slog.Info("hello", "count", 3) + +# Customizing a type's logging behavior + +If a type implements the [LogValuer] interface, the [Value] returned from its LogValue +method is used for logging. You can use this to control how values of the type +appear in logs. For example, you can redact secret information like passwords, +or gather a struct's fields in a Group. See the examples under [LogValuer] for +details. + +A LogValue method may return a Value that itself implements [LogValuer]. The [Value.Resolve] +method handles these cases carefully, avoiding infinite loops and unbounded recursion. +Handler authors and others may wish to use Value.Resolve instead of calling LogValue directly. + +# Wrapping output methods + +The logger functions use reflection over the call stack to find the file name +and line number of the logging call within the application. This can produce +incorrect source information for functions that wrap slog. For instance, if you +define this function in file mylog.go: + + func Infof(format string, args ...any) { + slog.Default().Info(fmt.Sprintf(format, args...)) + } + +and you call it like this in main.go: + + Infof(slog.Default(), "hello, %s", "world") + +then slog will report the source file as mylog.go, not main.go. + +A correct implementation of Infof will obtain the source location +(pc) and pass it to NewRecord. +The Infof function in the package-level example called "wrapping" +demonstrates how to do this. + +# Working with Records + +Sometimes a Handler will need to modify a Record +before passing it on to another Handler or backend. +A Record contains a mixture of simple public fields (e.g. Time, Level, Message) +and hidden fields that refer to state (such as attributes) indirectly. This +means that modifying a simple copy of a Record (e.g. by calling +[Record.Add] or [Record.AddAttrs] to add attributes) +may have unexpected effects on the original. +Before modifying a Record, use [Clone] to +create a copy that shares no state with the original, +or create a new Record with [NewRecord] +and build up its Attrs by traversing the old ones with [Record.Attrs]. + +# Performance considerations + +If profiling your application demonstrates that logging is taking significant time, +the following suggestions may help. + +If many log lines have a common attribute, use [Logger.With] to create a Logger with +that attribute. The built-in handlers will format that attribute only once, at the +call to [Logger.With]. The [Handler] interface is designed to allow that optimization, +and a well-written Handler should take advantage of it. + +The arguments to a log call are always evaluated, even if the log event is discarded. +If possible, defer computation so that it happens only if the value is actually logged. +For example, consider the call + + slog.Info("starting request", "url", r.URL.String()) // may compute String unnecessarily + +The URL.String method will be called even if the logger discards Info-level events. +Instead, pass the URL directly: + + slog.Info("starting request", "url", &r.URL) // calls URL.String only if needed + +The built-in [TextHandler] will call its String method, but only +if the log event is enabled. +Avoiding the call to String also preserves the structure of the underlying value. +For example [JSONHandler] emits the components of the parsed URL as a JSON object. +If you want to avoid eagerly paying the cost of the String call +without causing the handler to potentially inspect the structure of the value, +wrap the value in a fmt.Stringer implementation that hides its Marshal methods. + +You can also use the [LogValuer] interface to avoid unnecessary work in disabled log +calls. Say you need to log some expensive value: + + slog.Debug("frobbing", "value", computeExpensiveValue(arg)) + +Even if this line is disabled, computeExpensiveValue will be called. +To avoid that, define a type implementing LogValuer: + + type expensive struct { arg int } + + func (e expensive) LogValue() slog.Value { + return slog.AnyValue(computeExpensiveValue(e.arg)) + } + +Then use a value of that type in log calls: + + slog.Debug("frobbing", "value", expensive{arg}) + +Now computeExpensiveValue will only be called when the line is enabled. + +The built-in handlers acquire a lock before calling [io.Writer.Write] +to ensure that each record is written in one piece. User-defined +handlers are responsible for their own locking. +*/ +package slog diff --git a/vendor/golang.org/x/exp/slog/handler.go b/vendor/golang.org/x/exp/slog/handler.go new file mode 100644 index 0000000000..bd635cb818 --- /dev/null +++ b/vendor/golang.org/x/exp/slog/handler.go @@ -0,0 +1,577 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slog + +import ( + "context" + "fmt" + "io" + "reflect" + "strconv" + "sync" + "time" + + "golang.org/x/exp/slices" + "golang.org/x/exp/slog/internal/buffer" +) + +// A Handler handles log records produced by a Logger.. +// +// A typical handler may print log records to standard error, +// or write them to a file or database, or perhaps augment them +// with additional attributes and pass them on to another handler. +// +// Any of the Handler's methods may be called concurrently with itself +// or with other methods. It is the responsibility of the Handler to +// manage this concurrency. +// +// Users of the slog package should not invoke Handler methods directly. +// They should use the methods of [Logger] instead. +type Handler interface { + // Enabled reports whether the handler handles records at the given level. + // The handler ignores records whose level is lower. + // It is called early, before any arguments are processed, + // to save effort if the log event should be discarded. + // If called from a Logger method, the first argument is the context + // passed to that method, or context.Background() if nil was passed + // or the method does not take a context. + // The context is passed so Enabled can use its values + // to make a decision. + Enabled(context.Context, Level) bool + + // Handle handles the Record. + // It will only be called when Enabled returns true. + // The Context argument is as for Enabled. + // It is present solely to provide Handlers access to the context's values. + // Canceling the context should not affect record processing. + // (Among other things, log messages may be necessary to debug a + // cancellation-related problem.) + // + // Handle methods that produce output should observe the following rules: + // - If r.Time is the zero time, ignore the time. + // - If r.PC is zero, ignore it. + // - Attr's values should be resolved. + // - If an Attr's key and value are both the zero value, ignore the Attr. + // This can be tested with attr.Equal(Attr{}). + // - If a group's key is empty, inline the group's Attrs. + // - If a group has no Attrs (even if it has a non-empty key), + // ignore it. + Handle(context.Context, Record) error + + // WithAttrs returns a new Handler whose attributes consist of + // both the receiver's attributes and the arguments. + // The Handler owns the slice: it may retain, modify or discard it. + WithAttrs(attrs []Attr) Handler + + // WithGroup returns a new Handler with the given group appended to + // the receiver's existing groups. + // The keys of all subsequent attributes, whether added by With or in a + // Record, should be qualified by the sequence of group names. + // + // How this qualification happens is up to the Handler, so long as + // this Handler's attribute keys differ from those of another Handler + // with a different sequence of group names. + // + // A Handler should treat WithGroup as starting a Group of Attrs that ends + // at the end of the log event. That is, + // + // logger.WithGroup("s").LogAttrs(level, msg, slog.Int("a", 1), slog.Int("b", 2)) + // + // should behave like + // + // logger.LogAttrs(level, msg, slog.Group("s", slog.Int("a", 1), slog.Int("b", 2))) + // + // If the name is empty, WithGroup returns the receiver. + WithGroup(name string) Handler +} + +type defaultHandler struct { + ch *commonHandler + // log.Output, except for testing + output func(calldepth int, message string) error +} + +func newDefaultHandler(output func(int, string) error) *defaultHandler { + return &defaultHandler{ + ch: &commonHandler{json: false}, + output: output, + } +} + +func (*defaultHandler) Enabled(_ context.Context, l Level) bool { + return l >= LevelInfo +} + +// Collect the level, attributes and message in a string and +// write it with the default log.Logger. +// Let the log.Logger handle time and file/line. +func (h *defaultHandler) Handle(ctx context.Context, r Record) error { + buf := buffer.New() + buf.WriteString(r.Level.String()) + buf.WriteByte(' ') + buf.WriteString(r.Message) + state := h.ch.newHandleState(buf, true, " ", nil) + defer state.free() + state.appendNonBuiltIns(r) + + // skip [h.output, defaultHandler.Handle, handlerWriter.Write, log.Output] + return h.output(4, buf.String()) +} + +func (h *defaultHandler) WithAttrs(as []Attr) Handler { + return &defaultHandler{h.ch.withAttrs(as), h.output} +} + +func (h *defaultHandler) WithGroup(name string) Handler { + return &defaultHandler{h.ch.withGroup(name), h.output} +} + +// HandlerOptions are options for a TextHandler or JSONHandler. +// A zero HandlerOptions consists entirely of default values. +type HandlerOptions struct { + // AddSource causes the handler to compute the source code position + // of the log statement and add a SourceKey attribute to the output. + AddSource bool + + // Level reports the minimum record level that will be logged. + // The handler discards records with lower levels. + // If Level is nil, the handler assumes LevelInfo. + // The handler calls Level.Level for each record processed; + // to adjust the minimum level dynamically, use a LevelVar. + Level Leveler + + // ReplaceAttr is called to rewrite each non-group attribute before it is logged. + // The attribute's value has been resolved (see [Value.Resolve]). + // If ReplaceAttr returns an Attr with Key == "", the attribute is discarded. + // + // The built-in attributes with keys "time", "level", "source", and "msg" + // are passed to this function, except that time is omitted + // if zero, and source is omitted if AddSource is false. + // + // The first argument is a list of currently open groups that contain the + // Attr. It must not be retained or modified. ReplaceAttr is never called + // for Group attributes, only their contents. For example, the attribute + // list + // + // Int("a", 1), Group("g", Int("b", 2)), Int("c", 3) + // + // results in consecutive calls to ReplaceAttr with the following arguments: + // + // nil, Int("a", 1) + // []string{"g"}, Int("b", 2) + // nil, Int("c", 3) + // + // ReplaceAttr can be used to change the default keys of the built-in + // attributes, convert types (for example, to replace a `time.Time` with the + // integer seconds since the Unix epoch), sanitize personal information, or + // remove attributes from the output. + ReplaceAttr func(groups []string, a Attr) Attr +} + +// Keys for "built-in" attributes. +const ( + // TimeKey is the key used by the built-in handlers for the time + // when the log method is called. The associated Value is a [time.Time]. + TimeKey = "time" + // LevelKey is the key used by the built-in handlers for the level + // of the log call. The associated value is a [Level]. + LevelKey = "level" + // MessageKey is the key used by the built-in handlers for the + // message of the log call. The associated value is a string. + MessageKey = "msg" + // SourceKey is the key used by the built-in handlers for the source file + // and line of the log call. The associated value is a string. + SourceKey = "source" +) + +type commonHandler struct { + json bool // true => output JSON; false => output text + opts HandlerOptions + preformattedAttrs []byte + groupPrefix string // for text: prefix of groups opened in preformatting + groups []string // all groups started from WithGroup + nOpenGroups int // the number of groups opened in preformattedAttrs + mu sync.Mutex + w io.Writer +} + +func (h *commonHandler) clone() *commonHandler { + // We can't use assignment because we can't copy the mutex. + return &commonHandler{ + json: h.json, + opts: h.opts, + preformattedAttrs: slices.Clip(h.preformattedAttrs), + groupPrefix: h.groupPrefix, + groups: slices.Clip(h.groups), + nOpenGroups: h.nOpenGroups, + w: h.w, + } +} + +// enabled reports whether l is greater than or equal to the +// minimum level. +func (h *commonHandler) enabled(l Level) bool { + minLevel := LevelInfo + if h.opts.Level != nil { + minLevel = h.opts.Level.Level() + } + return l >= minLevel +} + +func (h *commonHandler) withAttrs(as []Attr) *commonHandler { + h2 := h.clone() + // Pre-format the attributes as an optimization. + prefix := buffer.New() + defer prefix.Free() + prefix.WriteString(h.groupPrefix) + state := h2.newHandleState((*buffer.Buffer)(&h2.preformattedAttrs), false, "", prefix) + defer state.free() + if len(h2.preformattedAttrs) > 0 { + state.sep = h.attrSep() + } + state.openGroups() + for _, a := range as { + state.appendAttr(a) + } + // Remember the new prefix for later keys. + h2.groupPrefix = state.prefix.String() + // Remember how many opened groups are in preformattedAttrs, + // so we don't open them again when we handle a Record. + h2.nOpenGroups = len(h2.groups) + return h2 +} + +func (h *commonHandler) withGroup(name string) *commonHandler { + if name == "" { + return h + } + h2 := h.clone() + h2.groups = append(h2.groups, name) + return h2 +} + +func (h *commonHandler) handle(r Record) error { + state := h.newHandleState(buffer.New(), true, "", nil) + defer state.free() + if h.json { + state.buf.WriteByte('{') + } + // Built-in attributes. They are not in a group. + stateGroups := state.groups + state.groups = nil // So ReplaceAttrs sees no groups instead of the pre groups. + rep := h.opts.ReplaceAttr + // time + if !r.Time.IsZero() { + key := TimeKey + val := r.Time.Round(0) // strip monotonic to match Attr behavior + if rep == nil { + state.appendKey(key) + state.appendTime(val) + } else { + state.appendAttr(Time(key, val)) + } + } + // level + key := LevelKey + val := r.Level + if rep == nil { + state.appendKey(key) + state.appendString(val.String()) + } else { + state.appendAttr(Any(key, val)) + } + // source + if h.opts.AddSource { + state.appendAttr(Any(SourceKey, r.source())) + } + key = MessageKey + msg := r.Message + if rep == nil { + state.appendKey(key) + state.appendString(msg) + } else { + state.appendAttr(String(key, msg)) + } + state.groups = stateGroups // Restore groups passed to ReplaceAttrs. + state.appendNonBuiltIns(r) + state.buf.WriteByte('\n') + + h.mu.Lock() + defer h.mu.Unlock() + _, err := h.w.Write(*state.buf) + return err +} + +func (s *handleState) appendNonBuiltIns(r Record) { + // preformatted Attrs + if len(s.h.preformattedAttrs) > 0 { + s.buf.WriteString(s.sep) + s.buf.Write(s.h.preformattedAttrs) + s.sep = s.h.attrSep() + } + // Attrs in Record -- unlike the built-in ones, they are in groups started + // from WithGroup. + s.prefix = buffer.New() + defer s.prefix.Free() + s.prefix.WriteString(s.h.groupPrefix) + s.openGroups() + r.Attrs(func(a Attr) bool { + s.appendAttr(a) + return true + }) + if s.h.json { + // Close all open groups. + for range s.h.groups { + s.buf.WriteByte('}') + } + // Close the top-level object. + s.buf.WriteByte('}') + } +} + +// attrSep returns the separator between attributes. +func (h *commonHandler) attrSep() string { + if h.json { + return "," + } + return " " +} + +// handleState holds state for a single call to commonHandler.handle. +// The initial value of sep determines whether to emit a separator +// before the next key, after which it stays true. +type handleState struct { + h *commonHandler + buf *buffer.Buffer + freeBuf bool // should buf be freed? + sep string // separator to write before next key + prefix *buffer.Buffer // for text: key prefix + groups *[]string // pool-allocated slice of active groups, for ReplaceAttr +} + +var groupPool = sync.Pool{New: func() any { + s := make([]string, 0, 10) + return &s +}} + +func (h *commonHandler) newHandleState(buf *buffer.Buffer, freeBuf bool, sep string, prefix *buffer.Buffer) handleState { + s := handleState{ + h: h, + buf: buf, + freeBuf: freeBuf, + sep: sep, + prefix: prefix, + } + if h.opts.ReplaceAttr != nil { + s.groups = groupPool.Get().(*[]string) + *s.groups = append(*s.groups, h.groups[:h.nOpenGroups]...) + } + return s +} + +func (s *handleState) free() { + if s.freeBuf { + s.buf.Free() + } + if gs := s.groups; gs != nil { + *gs = (*gs)[:0] + groupPool.Put(gs) + } +} + +func (s *handleState) openGroups() { + for _, n := range s.h.groups[s.h.nOpenGroups:] { + s.openGroup(n) + } +} + +// Separator for group names and keys. +const keyComponentSep = '.' + +// openGroup starts a new group of attributes +// with the given name. +func (s *handleState) openGroup(name string) { + if s.h.json { + s.appendKey(name) + s.buf.WriteByte('{') + s.sep = "" + } else { + s.prefix.WriteString(name) + s.prefix.WriteByte(keyComponentSep) + } + // Collect group names for ReplaceAttr. + if s.groups != nil { + *s.groups = append(*s.groups, name) + } +} + +// closeGroup ends the group with the given name. +func (s *handleState) closeGroup(name string) { + if s.h.json { + s.buf.WriteByte('}') + } else { + (*s.prefix) = (*s.prefix)[:len(*s.prefix)-len(name)-1 /* for keyComponentSep */] + } + s.sep = s.h.attrSep() + if s.groups != nil { + *s.groups = (*s.groups)[:len(*s.groups)-1] + } +} + +// appendAttr appends the Attr's key and value using app. +// It handles replacement and checking for an empty key. +// after replacement). +func (s *handleState) appendAttr(a Attr) { + if rep := s.h.opts.ReplaceAttr; rep != nil && a.Value.Kind() != KindGroup { + var gs []string + if s.groups != nil { + gs = *s.groups + } + // Resolve before calling ReplaceAttr, so the user doesn't have to. + a.Value = a.Value.Resolve() + a = rep(gs, a) + } + a.Value = a.Value.Resolve() + // Elide empty Attrs. + if a.isEmpty() { + return + } + // Special case: Source. + if v := a.Value; v.Kind() == KindAny { + if src, ok := v.Any().(*Source); ok { + if s.h.json { + a.Value = src.group() + } else { + a.Value = StringValue(fmt.Sprintf("%s:%d", src.File, src.Line)) + } + } + } + if a.Value.Kind() == KindGroup { + attrs := a.Value.Group() + // Output only non-empty groups. + if len(attrs) > 0 { + // Inline a group with an empty key. + if a.Key != "" { + s.openGroup(a.Key) + } + for _, aa := range attrs { + s.appendAttr(aa) + } + if a.Key != "" { + s.closeGroup(a.Key) + } + } + } else { + s.appendKey(a.Key) + s.appendValue(a.Value) + } +} + +func (s *handleState) appendError(err error) { + s.appendString(fmt.Sprintf("!ERROR:%v", err)) +} + +func (s *handleState) appendKey(key string) { + s.buf.WriteString(s.sep) + if s.prefix != nil { + // TODO: optimize by avoiding allocation. + s.appendString(string(*s.prefix) + key) + } else { + s.appendString(key) + } + if s.h.json { + s.buf.WriteByte(':') + } else { + s.buf.WriteByte('=') + } + s.sep = s.h.attrSep() +} + +func (s *handleState) appendString(str string) { + if s.h.json { + s.buf.WriteByte('"') + *s.buf = appendEscapedJSONString(*s.buf, str) + s.buf.WriteByte('"') + } else { + // text + if needsQuoting(str) { + *s.buf = strconv.AppendQuote(*s.buf, str) + } else { + s.buf.WriteString(str) + } + } +} + +func (s *handleState) appendValue(v Value) { + defer func() { + if r := recover(); r != nil { + // If it panics with a nil pointer, the most likely cases are + // an encoding.TextMarshaler or error fails to guard against nil, + // in which case "" seems to be the feasible choice. + // + // Adapted from the code in fmt/print.go. + if v := reflect.ValueOf(v.any); v.Kind() == reflect.Pointer && v.IsNil() { + s.appendString("") + return + } + + // Otherwise just print the original panic message. + s.appendString(fmt.Sprintf("!PANIC: %v", r)) + } + }() + + var err error + if s.h.json { + err = appendJSONValue(s, v) + } else { + err = appendTextValue(s, v) + } + if err != nil { + s.appendError(err) + } +} + +func (s *handleState) appendTime(t time.Time) { + if s.h.json { + appendJSONTime(s, t) + } else { + writeTimeRFC3339Millis(s.buf, t) + } +} + +// This takes half the time of Time.AppendFormat. +func writeTimeRFC3339Millis(buf *buffer.Buffer, t time.Time) { + year, month, day := t.Date() + buf.WritePosIntWidth(year, 4) + buf.WriteByte('-') + buf.WritePosIntWidth(int(month), 2) + buf.WriteByte('-') + buf.WritePosIntWidth(day, 2) + buf.WriteByte('T') + hour, min, sec := t.Clock() + buf.WritePosIntWidth(hour, 2) + buf.WriteByte(':') + buf.WritePosIntWidth(min, 2) + buf.WriteByte(':') + buf.WritePosIntWidth(sec, 2) + ns := t.Nanosecond() + buf.WriteByte('.') + buf.WritePosIntWidth(ns/1e6, 3) + _, offsetSeconds := t.Zone() + if offsetSeconds == 0 { + buf.WriteByte('Z') + } else { + offsetMinutes := offsetSeconds / 60 + if offsetMinutes < 0 { + buf.WriteByte('-') + offsetMinutes = -offsetMinutes + } else { + buf.WriteByte('+') + } + buf.WritePosIntWidth(offsetMinutes/60, 2) + buf.WriteByte(':') + buf.WritePosIntWidth(offsetMinutes%60, 2) + } +} diff --git a/vendor/golang.org/x/exp/slog/internal/buffer/buffer.go b/vendor/golang.org/x/exp/slog/internal/buffer/buffer.go new file mode 100644 index 0000000000..7786c166e0 --- /dev/null +++ b/vendor/golang.org/x/exp/slog/internal/buffer/buffer.go @@ -0,0 +1,84 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package buffer provides a pool-allocated byte buffer. +package buffer + +import ( + "sync" +) + +// Buffer adapted from go/src/fmt/print.go +type Buffer []byte + +// Having an initial size gives a dramatic speedup. +var bufPool = sync.Pool{ + New: func() any { + b := make([]byte, 0, 1024) + return (*Buffer)(&b) + }, +} + +func New() *Buffer { + return bufPool.Get().(*Buffer) +} + +func (b *Buffer) Free() { + // To reduce peak allocation, return only smaller buffers to the pool. + const maxBufferSize = 16 << 10 + if cap(*b) <= maxBufferSize { + *b = (*b)[:0] + bufPool.Put(b) + } +} + +func (b *Buffer) Reset() { + *b = (*b)[:0] +} + +func (b *Buffer) Write(p []byte) (int, error) { + *b = append(*b, p...) + return len(p), nil +} + +func (b *Buffer) WriteString(s string) { + *b = append(*b, s...) +} + +func (b *Buffer) WriteByte(c byte) { + *b = append(*b, c) +} + +func (b *Buffer) WritePosInt(i int) { + b.WritePosIntWidth(i, 0) +} + +// WritePosIntWidth writes non-negative integer i to the buffer, padded on the left +// by zeroes to the given width. Use a width of 0 to omit padding. +func (b *Buffer) WritePosIntWidth(i, width int) { + // Cheap integer to fixed-width decimal ASCII. + // Copied from log/log.go. + + if i < 0 { + panic("negative int") + } + + // Assemble decimal in reverse order. + var bb [20]byte + bp := len(bb) - 1 + for i >= 10 || width > 1 { + width-- + q := i / 10 + bb[bp] = byte('0' + i - q*10) + bp-- + i = q + } + // i < 10 + bb[bp] = byte('0' + i) + b.Write(bb[bp:]) +} + +func (b *Buffer) String() string { + return string(*b) +} diff --git a/vendor/golang.org/x/exp/slog/internal/ignorepc.go b/vendor/golang.org/x/exp/slog/internal/ignorepc.go new file mode 100644 index 0000000000..d1256426ff --- /dev/null +++ b/vendor/golang.org/x/exp/slog/internal/ignorepc.go @@ -0,0 +1,9 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package internal + +// If IgnorePC is true, do not invoke runtime.Callers to get the pc. +// This is solely for benchmarking the slowdown from runtime.Callers. +var IgnorePC = false diff --git a/vendor/golang.org/x/exp/slog/json_handler.go b/vendor/golang.org/x/exp/slog/json_handler.go new file mode 100644 index 0000000000..157ada8692 --- /dev/null +++ b/vendor/golang.org/x/exp/slog/json_handler.go @@ -0,0 +1,336 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slog + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "strconv" + "time" + "unicode/utf8" + + "golang.org/x/exp/slog/internal/buffer" +) + +// JSONHandler is a Handler that writes Records to an io.Writer as +// line-delimited JSON objects. +type JSONHandler struct { + *commonHandler +} + +// NewJSONHandler creates a JSONHandler that writes to w, +// using the given options. +// If opts is nil, the default options are used. +func NewJSONHandler(w io.Writer, opts *HandlerOptions) *JSONHandler { + if opts == nil { + opts = &HandlerOptions{} + } + return &JSONHandler{ + &commonHandler{ + json: true, + w: w, + opts: *opts, + }, + } +} + +// Enabled reports whether the handler handles records at the given level. +// The handler ignores records whose level is lower. +func (h *JSONHandler) Enabled(_ context.Context, level Level) bool { + return h.commonHandler.enabled(level) +} + +// WithAttrs returns a new JSONHandler whose attributes consists +// of h's attributes followed by attrs. +func (h *JSONHandler) WithAttrs(attrs []Attr) Handler { + return &JSONHandler{commonHandler: h.commonHandler.withAttrs(attrs)} +} + +func (h *JSONHandler) WithGroup(name string) Handler { + return &JSONHandler{commonHandler: h.commonHandler.withGroup(name)} +} + +// Handle formats its argument Record as a JSON object on a single line. +// +// If the Record's time is zero, the time is omitted. +// Otherwise, the key is "time" +// and the value is output as with json.Marshal. +// +// If the Record's level is zero, the level is omitted. +// Otherwise, the key is "level" +// and the value of [Level.String] is output. +// +// If the AddSource option is set and source information is available, +// the key is "source" +// and the value is output as "FILE:LINE". +// +// The message's key is "msg". +// +// To modify these or other attributes, or remove them from the output, use +// [HandlerOptions.ReplaceAttr]. +// +// Values are formatted as with an [encoding/json.Encoder] with SetEscapeHTML(false), +// with two exceptions. +// +// First, an Attr whose Value is of type error is formatted as a string, by +// calling its Error method. Only errors in Attrs receive this special treatment, +// not errors embedded in structs, slices, maps or other data structures that +// are processed by the encoding/json package. +// +// Second, an encoding failure does not cause Handle to return an error. +// Instead, the error message is formatted as a string. +// +// Each call to Handle results in a single serialized call to io.Writer.Write. +func (h *JSONHandler) Handle(_ context.Context, r Record) error { + return h.commonHandler.handle(r) +} + +// Adapted from time.Time.MarshalJSON to avoid allocation. +func appendJSONTime(s *handleState, t time.Time) { + if y := t.Year(); y < 0 || y >= 10000 { + // RFC 3339 is clear that years are 4 digits exactly. + // See golang.org/issue/4556#c15 for more discussion. + s.appendError(errors.New("time.Time year outside of range [0,9999]")) + } + s.buf.WriteByte('"') + *s.buf = t.AppendFormat(*s.buf, time.RFC3339Nano) + s.buf.WriteByte('"') +} + +func appendJSONValue(s *handleState, v Value) error { + switch v.Kind() { + case KindString: + s.appendString(v.str()) + case KindInt64: + *s.buf = strconv.AppendInt(*s.buf, v.Int64(), 10) + case KindUint64: + *s.buf = strconv.AppendUint(*s.buf, v.Uint64(), 10) + case KindFloat64: + // json.Marshal is funny about floats; it doesn't + // always match strconv.AppendFloat. So just call it. + // That's expensive, but floats are rare. + if err := appendJSONMarshal(s.buf, v.Float64()); err != nil { + return err + } + case KindBool: + *s.buf = strconv.AppendBool(*s.buf, v.Bool()) + case KindDuration: + // Do what json.Marshal does. + *s.buf = strconv.AppendInt(*s.buf, int64(v.Duration()), 10) + case KindTime: + s.appendTime(v.Time()) + case KindAny: + a := v.Any() + _, jm := a.(json.Marshaler) + if err, ok := a.(error); ok && !jm { + s.appendString(err.Error()) + } else { + return appendJSONMarshal(s.buf, a) + } + default: + panic(fmt.Sprintf("bad kind: %s", v.Kind())) + } + return nil +} + +func appendJSONMarshal(buf *buffer.Buffer, v any) error { + // Use a json.Encoder to avoid escaping HTML. + var bb bytes.Buffer + enc := json.NewEncoder(&bb) + enc.SetEscapeHTML(false) + if err := enc.Encode(v); err != nil { + return err + } + bs := bb.Bytes() + buf.Write(bs[:len(bs)-1]) // remove final newline + return nil +} + +// appendEscapedJSONString escapes s for JSON and appends it to buf. +// It does not surround the string in quotation marks. +// +// Modified from encoding/json/encode.go:encodeState.string, +// with escapeHTML set to false. +func appendEscapedJSONString(buf []byte, s string) []byte { + char := func(b byte) { buf = append(buf, b) } + str := func(s string) { buf = append(buf, s...) } + + start := 0 + for i := 0; i < len(s); { + if b := s[i]; b < utf8.RuneSelf { + if safeSet[b] { + i++ + continue + } + if start < i { + str(s[start:i]) + } + char('\\') + switch b { + case '\\', '"': + char(b) + case '\n': + char('n') + case '\r': + char('r') + case '\t': + char('t') + default: + // This encodes bytes < 0x20 except for \t, \n and \r. + str(`u00`) + char(hex[b>>4]) + char(hex[b&0xF]) + } + i++ + start = i + continue + } + c, size := utf8.DecodeRuneInString(s[i:]) + if c == utf8.RuneError && size == 1 { + if start < i { + str(s[start:i]) + } + str(`\ufffd`) + i += size + start = i + continue + } + // U+2028 is LINE SEPARATOR. + // U+2029 is PARAGRAPH SEPARATOR. + // They are both technically valid characters in JSON strings, + // but don't work in JSONP, which has to be evaluated as JavaScript, + // and can lead to security holes there. It is valid JSON to + // escape them, so we do so unconditionally. + // See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion. + if c == '\u2028' || c == '\u2029' { + if start < i { + str(s[start:i]) + } + str(`\u202`) + char(hex[c&0xF]) + i += size + start = i + continue + } + i += size + } + if start < len(s) { + str(s[start:]) + } + return buf +} + +var hex = "0123456789abcdef" + +// Copied from encoding/json/tables.go. +// +// safeSet holds the value true if the ASCII character with the given array +// position can be represented inside a JSON string without any further +// escaping. +// +// All values are true except for the ASCII control characters (0-31), the +// double quote ("), and the backslash character ("\"). +var safeSet = [utf8.RuneSelf]bool{ + ' ': true, + '!': true, + '"': false, + '#': true, + '$': true, + '%': true, + '&': true, + '\'': true, + '(': true, + ')': true, + '*': true, + '+': true, + ',': true, + '-': true, + '.': true, + '/': true, + '0': true, + '1': true, + '2': true, + '3': true, + '4': true, + '5': true, + '6': true, + '7': true, + '8': true, + '9': true, + ':': true, + ';': true, + '<': true, + '=': true, + '>': true, + '?': true, + '@': true, + 'A': true, + 'B': true, + 'C': true, + 'D': true, + 'E': true, + 'F': true, + 'G': true, + 'H': true, + 'I': true, + 'J': true, + 'K': true, + 'L': true, + 'M': true, + 'N': true, + 'O': true, + 'P': true, + 'Q': true, + 'R': true, + 'S': true, + 'T': true, + 'U': true, + 'V': true, + 'W': true, + 'X': true, + 'Y': true, + 'Z': true, + '[': true, + '\\': false, + ']': true, + '^': true, + '_': true, + '`': true, + 'a': true, + 'b': true, + 'c': true, + 'd': true, + 'e': true, + 'f': true, + 'g': true, + 'h': true, + 'i': true, + 'j': true, + 'k': true, + 'l': true, + 'm': true, + 'n': true, + 'o': true, + 'p': true, + 'q': true, + 'r': true, + 's': true, + 't': true, + 'u': true, + 'v': true, + 'w': true, + 'x': true, + 'y': true, + 'z': true, + '{': true, + '|': true, + '}': true, + '~': true, + '\u007f': true, +} diff --git a/vendor/golang.org/x/exp/slog/level.go b/vendor/golang.org/x/exp/slog/level.go new file mode 100644 index 0000000000..b2365f0aa5 --- /dev/null +++ b/vendor/golang.org/x/exp/slog/level.go @@ -0,0 +1,201 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slog + +import ( + "errors" + "fmt" + "strconv" + "strings" + "sync/atomic" +) + +// A Level is the importance or severity of a log event. +// The higher the level, the more important or severe the event. +type Level int + +// Level numbers are inherently arbitrary, +// but we picked them to satisfy three constraints. +// Any system can map them to another numbering scheme if it wishes. +// +// First, we wanted the default level to be Info, Since Levels are ints, Info is +// the default value for int, zero. +// + +// Second, we wanted to make it easy to use levels to specify logger verbosity. +// Since a larger level means a more severe event, a logger that accepts events +// with smaller (or more negative) level means a more verbose logger. Logger +// verbosity is thus the negation of event severity, and the default verbosity +// of 0 accepts all events at least as severe as INFO. +// +// Third, we wanted some room between levels to accommodate schemes with named +// levels between ours. For example, Google Cloud Logging defines a Notice level +// between Info and Warn. Since there are only a few of these intermediate +// levels, the gap between the numbers need not be large. Our gap of 4 matches +// OpenTelemetry's mapping. Subtracting 9 from an OpenTelemetry level in the +// DEBUG, INFO, WARN and ERROR ranges converts it to the corresponding slog +// Level range. OpenTelemetry also has the names TRACE and FATAL, which slog +// does not. But those OpenTelemetry levels can still be represented as slog +// Levels by using the appropriate integers. +// +// Names for common levels. +const ( + LevelDebug Level = -4 + LevelInfo Level = 0 + LevelWarn Level = 4 + LevelError Level = 8 +) + +// String returns a name for the level. +// If the level has a name, then that name +// in uppercase is returned. +// If the level is between named values, then +// an integer is appended to the uppercased name. +// Examples: +// +// LevelWarn.String() => "WARN" +// (LevelInfo+2).String() => "INFO+2" +func (l Level) String() string { + str := func(base string, val Level) string { + if val == 0 { + return base + } + return fmt.Sprintf("%s%+d", base, val) + } + + switch { + case l < LevelInfo: + return str("DEBUG", l-LevelDebug) + case l < LevelWarn: + return str("INFO", l-LevelInfo) + case l < LevelError: + return str("WARN", l-LevelWarn) + default: + return str("ERROR", l-LevelError) + } +} + +// MarshalJSON implements [encoding/json.Marshaler] +// by quoting the output of [Level.String]. +func (l Level) MarshalJSON() ([]byte, error) { + // AppendQuote is sufficient for JSON-encoding all Level strings. + // They don't contain any runes that would produce invalid JSON + // when escaped. + return strconv.AppendQuote(nil, l.String()), nil +} + +// UnmarshalJSON implements [encoding/json.Unmarshaler] +// It accepts any string produced by [Level.MarshalJSON], +// ignoring case. +// It also accepts numeric offsets that would result in a different string on +// output. For example, "Error-8" would marshal as "INFO". +func (l *Level) UnmarshalJSON(data []byte) error { + s, err := strconv.Unquote(string(data)) + if err != nil { + return err + } + return l.parse(s) +} + +// MarshalText implements [encoding.TextMarshaler] +// by calling [Level.String]. +func (l Level) MarshalText() ([]byte, error) { + return []byte(l.String()), nil +} + +// UnmarshalText implements [encoding.TextUnmarshaler]. +// It accepts any string produced by [Level.MarshalText], +// ignoring case. +// It also accepts numeric offsets that would result in a different string on +// output. For example, "Error-8" would marshal as "INFO". +func (l *Level) UnmarshalText(data []byte) error { + return l.parse(string(data)) +} + +func (l *Level) parse(s string) (err error) { + defer func() { + if err != nil { + err = fmt.Errorf("slog: level string %q: %w", s, err) + } + }() + + name := s + offset := 0 + if i := strings.IndexAny(s, "+-"); i >= 0 { + name = s[:i] + offset, err = strconv.Atoi(s[i:]) + if err != nil { + return err + } + } + switch strings.ToUpper(name) { + case "DEBUG": + *l = LevelDebug + case "INFO": + *l = LevelInfo + case "WARN": + *l = LevelWarn + case "ERROR": + *l = LevelError + default: + return errors.New("unknown name") + } + *l += Level(offset) + return nil +} + +// Level returns the receiver. +// It implements Leveler. +func (l Level) Level() Level { return l } + +// A LevelVar is a Level variable, to allow a Handler level to change +// dynamically. +// It implements Leveler as well as a Set method, +// and it is safe for use by multiple goroutines. +// The zero LevelVar corresponds to LevelInfo. +type LevelVar struct { + val atomic.Int64 +} + +// Level returns v's level. +func (v *LevelVar) Level() Level { + return Level(int(v.val.Load())) +} + +// Set sets v's level to l. +func (v *LevelVar) Set(l Level) { + v.val.Store(int64(l)) +} + +func (v *LevelVar) String() string { + return fmt.Sprintf("LevelVar(%s)", v.Level()) +} + +// MarshalText implements [encoding.TextMarshaler] +// by calling [Level.MarshalText]. +func (v *LevelVar) MarshalText() ([]byte, error) { + return v.Level().MarshalText() +} + +// UnmarshalText implements [encoding.TextUnmarshaler] +// by calling [Level.UnmarshalText]. +func (v *LevelVar) UnmarshalText(data []byte) error { + var l Level + if err := l.UnmarshalText(data); err != nil { + return err + } + v.Set(l) + return nil +} + +// A Leveler provides a Level value. +// +// As Level itself implements Leveler, clients typically supply +// a Level value wherever a Leveler is needed, such as in HandlerOptions. +// Clients who need to vary the level dynamically can provide a more complex +// Leveler implementation such as *LevelVar. +type Leveler interface { + Level() Level +} diff --git a/vendor/golang.org/x/exp/slog/logger.go b/vendor/golang.org/x/exp/slog/logger.go new file mode 100644 index 0000000000..e87ec9936c --- /dev/null +++ b/vendor/golang.org/x/exp/slog/logger.go @@ -0,0 +1,343 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slog + +import ( + "context" + "log" + "runtime" + "sync/atomic" + "time" + + "golang.org/x/exp/slog/internal" +) + +var defaultLogger atomic.Value + +func init() { + defaultLogger.Store(New(newDefaultHandler(log.Output))) +} + +// Default returns the default Logger. +func Default() *Logger { return defaultLogger.Load().(*Logger) } + +// SetDefault makes l the default Logger. +// After this call, output from the log package's default Logger +// (as with [log.Print], etc.) will be logged at LevelInfo using l's Handler. +func SetDefault(l *Logger) { + defaultLogger.Store(l) + // If the default's handler is a defaultHandler, then don't use a handleWriter, + // or we'll deadlock as they both try to acquire the log default mutex. + // The defaultHandler will use whatever the log default writer is currently + // set to, which is correct. + // This can occur with SetDefault(Default()). + // See TestSetDefault. + if _, ok := l.Handler().(*defaultHandler); !ok { + capturePC := log.Flags()&(log.Lshortfile|log.Llongfile) != 0 + log.SetOutput(&handlerWriter{l.Handler(), LevelInfo, capturePC}) + log.SetFlags(0) // we want just the log message, no time or location + } +} + +// handlerWriter is an io.Writer that calls a Handler. +// It is used to link the default log.Logger to the default slog.Logger. +type handlerWriter struct { + h Handler + level Level + capturePC bool +} + +func (w *handlerWriter) Write(buf []byte) (int, error) { + if !w.h.Enabled(context.Background(), w.level) { + return 0, nil + } + var pc uintptr + if !internal.IgnorePC && w.capturePC { + // skip [runtime.Callers, w.Write, Logger.Output, log.Print] + var pcs [1]uintptr + runtime.Callers(4, pcs[:]) + pc = pcs[0] + } + + // Remove final newline. + origLen := len(buf) // Report that the entire buf was written. + if len(buf) > 0 && buf[len(buf)-1] == '\n' { + buf = buf[:len(buf)-1] + } + r := NewRecord(time.Now(), w.level, string(buf), pc) + return origLen, w.h.Handle(context.Background(), r) +} + +// A Logger records structured information about each call to its +// Log, Debug, Info, Warn, and Error methods. +// For each call, it creates a Record and passes it to a Handler. +// +// To create a new Logger, call [New] or a Logger method +// that begins "With". +type Logger struct { + handler Handler // for structured logging +} + +func (l *Logger) clone() *Logger { + c := *l + return &c +} + +// Handler returns l's Handler. +func (l *Logger) Handler() Handler { return l.handler } + +// With returns a new Logger that includes the given arguments, converted to +// Attrs as in [Logger.Log]. +// The Attrs will be added to each output from the Logger. +// The new Logger shares the old Logger's context. +// The new Logger's handler is the result of calling WithAttrs on the receiver's +// handler. +func (l *Logger) With(args ...any) *Logger { + c := l.clone() + c.handler = l.handler.WithAttrs(argsToAttrSlice(args)) + return c +} + +// WithGroup returns a new Logger that starts a group. The keys of all +// attributes added to the Logger will be qualified by the given name. +// (How that qualification happens depends on the [Handler.WithGroup] +// method of the Logger's Handler.) +// The new Logger shares the old Logger's context. +// +// The new Logger's handler is the result of calling WithGroup on the receiver's +// handler. +func (l *Logger) WithGroup(name string) *Logger { + c := l.clone() + c.handler = l.handler.WithGroup(name) + return c + +} + +// New creates a new Logger with the given non-nil Handler and a nil context. +func New(h Handler) *Logger { + if h == nil { + panic("nil Handler") + } + return &Logger{handler: h} +} + +// With calls Logger.With on the default logger. +func With(args ...any) *Logger { + return Default().With(args...) +} + +// Enabled reports whether l emits log records at the given context and level. +func (l *Logger) Enabled(ctx context.Context, level Level) bool { + if ctx == nil { + ctx = context.Background() + } + return l.Handler().Enabled(ctx, level) +} + +// NewLogLogger returns a new log.Logger such that each call to its Output method +// dispatches a Record to the specified handler. The logger acts as a bridge from +// the older log API to newer structured logging handlers. +func NewLogLogger(h Handler, level Level) *log.Logger { + return log.New(&handlerWriter{h, level, true}, "", 0) +} + +// Log emits a log record with the current time and the given level and message. +// The Record's Attrs consist of the Logger's attributes followed by +// the Attrs specified by args. +// +// The attribute arguments are processed as follows: +// - If an argument is an Attr, it is used as is. +// - If an argument is a string and this is not the last argument, +// the following argument is treated as the value and the two are combined +// into an Attr. +// - Otherwise, the argument is treated as a value with key "!BADKEY". +func (l *Logger) Log(ctx context.Context, level Level, msg string, args ...any) { + l.log(ctx, level, msg, args...) +} + +// LogAttrs is a more efficient version of [Logger.Log] that accepts only Attrs. +func (l *Logger) LogAttrs(ctx context.Context, level Level, msg string, attrs ...Attr) { + l.logAttrs(ctx, level, msg, attrs...) +} + +// Debug logs at LevelDebug. +func (l *Logger) Debug(msg string, args ...any) { + l.log(nil, LevelDebug, msg, args...) +} + +// DebugContext logs at LevelDebug with the given context. +func (l *Logger) DebugContext(ctx context.Context, msg string, args ...any) { + l.log(ctx, LevelDebug, msg, args...) +} + +// DebugCtx logs at LevelDebug with the given context. +// Deprecated: Use Logger.DebugContext. +func (l *Logger) DebugCtx(ctx context.Context, msg string, args ...any) { + l.log(ctx, LevelDebug, msg, args...) +} + +// Info logs at LevelInfo. +func (l *Logger) Info(msg string, args ...any) { + l.log(nil, LevelInfo, msg, args...) +} + +// InfoContext logs at LevelInfo with the given context. +func (l *Logger) InfoContext(ctx context.Context, msg string, args ...any) { + l.log(ctx, LevelInfo, msg, args...) +} + +// InfoCtx logs at LevelInfo with the given context. +// Deprecated: Use Logger.InfoContext. +func (l *Logger) InfoCtx(ctx context.Context, msg string, args ...any) { + l.log(ctx, LevelInfo, msg, args...) +} + +// Warn logs at LevelWarn. +func (l *Logger) Warn(msg string, args ...any) { + l.log(nil, LevelWarn, msg, args...) +} + +// WarnContext logs at LevelWarn with the given context. +func (l *Logger) WarnContext(ctx context.Context, msg string, args ...any) { + l.log(ctx, LevelWarn, msg, args...) +} + +// WarnCtx logs at LevelWarn with the given context. +// Deprecated: Use Logger.WarnContext. +func (l *Logger) WarnCtx(ctx context.Context, msg string, args ...any) { + l.log(ctx, LevelWarn, msg, args...) +} + +// Error logs at LevelError. +func (l *Logger) Error(msg string, args ...any) { + l.log(nil, LevelError, msg, args...) +} + +// ErrorContext logs at LevelError with the given context. +func (l *Logger) ErrorContext(ctx context.Context, msg string, args ...any) { + l.log(ctx, LevelError, msg, args...) +} + +// ErrorCtx logs at LevelError with the given context. +// Deprecated: Use Logger.ErrorContext. +func (l *Logger) ErrorCtx(ctx context.Context, msg string, args ...any) { + l.log(ctx, LevelError, msg, args...) +} + +// log is the low-level logging method for methods that take ...any. +// It must always be called directly by an exported logging method +// or function, because it uses a fixed call depth to obtain the pc. +func (l *Logger) log(ctx context.Context, level Level, msg string, args ...any) { + if !l.Enabled(ctx, level) { + return + } + var pc uintptr + if !internal.IgnorePC { + var pcs [1]uintptr + // skip [runtime.Callers, this function, this function's caller] + runtime.Callers(3, pcs[:]) + pc = pcs[0] + } + r := NewRecord(time.Now(), level, msg, pc) + r.Add(args...) + if ctx == nil { + ctx = context.Background() + } + _ = l.Handler().Handle(ctx, r) +} + +// logAttrs is like [Logger.log], but for methods that take ...Attr. +func (l *Logger) logAttrs(ctx context.Context, level Level, msg string, attrs ...Attr) { + if !l.Enabled(ctx, level) { + return + } + var pc uintptr + if !internal.IgnorePC { + var pcs [1]uintptr + // skip [runtime.Callers, this function, this function's caller] + runtime.Callers(3, pcs[:]) + pc = pcs[0] + } + r := NewRecord(time.Now(), level, msg, pc) + r.AddAttrs(attrs...) + if ctx == nil { + ctx = context.Background() + } + _ = l.Handler().Handle(ctx, r) +} + +// Debug calls Logger.Debug on the default logger. +func Debug(msg string, args ...any) { + Default().log(nil, LevelDebug, msg, args...) +} + +// DebugContext calls Logger.DebugContext on the default logger. +func DebugContext(ctx context.Context, msg string, args ...any) { + Default().log(ctx, LevelDebug, msg, args...) +} + +// Info calls Logger.Info on the default logger. +func Info(msg string, args ...any) { + Default().log(nil, LevelInfo, msg, args...) +} + +// InfoContext calls Logger.InfoContext on the default logger. +func InfoContext(ctx context.Context, msg string, args ...any) { + Default().log(ctx, LevelInfo, msg, args...) +} + +// Warn calls Logger.Warn on the default logger. +func Warn(msg string, args ...any) { + Default().log(nil, LevelWarn, msg, args...) +} + +// WarnContext calls Logger.WarnContext on the default logger. +func WarnContext(ctx context.Context, msg string, args ...any) { + Default().log(ctx, LevelWarn, msg, args...) +} + +// Error calls Logger.Error on the default logger. +func Error(msg string, args ...any) { + Default().log(nil, LevelError, msg, args...) +} + +// ErrorContext calls Logger.ErrorContext on the default logger. +func ErrorContext(ctx context.Context, msg string, args ...any) { + Default().log(ctx, LevelError, msg, args...) +} + +// DebugCtx calls Logger.DebugContext on the default logger. +// Deprecated: call DebugContext. +func DebugCtx(ctx context.Context, msg string, args ...any) { + Default().log(ctx, LevelDebug, msg, args...) +} + +// InfoCtx calls Logger.InfoContext on the default logger. +// Deprecated: call InfoContext. +func InfoCtx(ctx context.Context, msg string, args ...any) { + Default().log(ctx, LevelInfo, msg, args...) +} + +// WarnCtx calls Logger.WarnContext on the default logger. +// Deprecated: call WarnContext. +func WarnCtx(ctx context.Context, msg string, args ...any) { + Default().log(ctx, LevelWarn, msg, args...) +} + +// ErrorCtx calls Logger.ErrorContext on the default logger. +// Deprecated: call ErrorContext. +func ErrorCtx(ctx context.Context, msg string, args ...any) { + Default().log(ctx, LevelError, msg, args...) +} + +// Log calls Logger.Log on the default logger. +func Log(ctx context.Context, level Level, msg string, args ...any) { + Default().log(ctx, level, msg, args...) +} + +// LogAttrs calls Logger.LogAttrs on the default logger. +func LogAttrs(ctx context.Context, level Level, msg string, attrs ...Attr) { + Default().logAttrs(ctx, level, msg, attrs...) +} diff --git a/vendor/golang.org/x/exp/slog/noplog.bench b/vendor/golang.org/x/exp/slog/noplog.bench new file mode 100644 index 0000000000..ed9296ff61 --- /dev/null +++ b/vendor/golang.org/x/exp/slog/noplog.bench @@ -0,0 +1,36 @@ +goos: linux +goarch: amd64 +pkg: golang.org/x/exp/slog +cpu: Intel(R) Xeon(R) CPU @ 2.20GHz +BenchmarkNopLog/attrs-8 1000000 1090 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/attrs-8 1000000 1097 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/attrs-8 1000000 1078 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/attrs-8 1000000 1095 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/attrs-8 1000000 1096 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/attrs-parallel-8 4007268 308.2 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/attrs-parallel-8 4016138 299.7 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/attrs-parallel-8 4020529 305.9 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/attrs-parallel-8 3977829 303.4 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/attrs-parallel-8 3225438 318.5 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/keys-values-8 1179256 994.2 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/keys-values-8 1000000 1002 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/keys-values-8 1216710 993.2 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/keys-values-8 1000000 1013 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/keys-values-8 1000000 1016 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/WithContext-8 989066 1163 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/WithContext-8 994116 1163 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/WithContext-8 1000000 1152 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/WithContext-8 991675 1165 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/WithContext-8 965268 1166 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/WithContext-parallel-8 3955503 303.3 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/WithContext-parallel-8 3861188 307.8 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/WithContext-parallel-8 3967752 303.9 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/WithContext-parallel-8 3955203 302.7 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/WithContext-parallel-8 3948278 301.1 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/Ctx-8 940622 1247 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/Ctx-8 936381 1257 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/Ctx-8 959730 1266 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/Ctx-8 943473 1290 ns/op 0 B/op 0 allocs/op +BenchmarkNopLog/Ctx-8 919414 1259 ns/op 0 B/op 0 allocs/op +PASS +ok golang.org/x/exp/slog 40.566s diff --git a/vendor/golang.org/x/exp/slog/record.go b/vendor/golang.org/x/exp/slog/record.go new file mode 100644 index 0000000000..38b3440f77 --- /dev/null +++ b/vendor/golang.org/x/exp/slog/record.go @@ -0,0 +1,207 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slog + +import ( + "runtime" + "time" + + "golang.org/x/exp/slices" +) + +const nAttrsInline = 5 + +// A Record holds information about a log event. +// Copies of a Record share state. +// Do not modify a Record after handing out a copy to it. +// Use [Record.Clone] to create a copy with no shared state. +type Record struct { + // The time at which the output method (Log, Info, etc.) was called. + Time time.Time + + // The log message. + Message string + + // The level of the event. + Level Level + + // The program counter at the time the record was constructed, as determined + // by runtime.Callers. If zero, no program counter is available. + // + // The only valid use for this value is as an argument to + // [runtime.CallersFrames]. In particular, it must not be passed to + // [runtime.FuncForPC]. + PC uintptr + + // Allocation optimization: an inline array sized to hold + // the majority of log calls (based on examination of open-source + // code). It holds the start of the list of Attrs. + front [nAttrsInline]Attr + + // The number of Attrs in front. + nFront int + + // The list of Attrs except for those in front. + // Invariants: + // - len(back) > 0 iff nFront == len(front) + // - Unused array elements are zero. Used to detect mistakes. + back []Attr +} + +// NewRecord creates a Record from the given arguments. +// Use [Record.AddAttrs] to add attributes to the Record. +// +// NewRecord is intended for logging APIs that want to support a [Handler] as +// a backend. +func NewRecord(t time.Time, level Level, msg string, pc uintptr) Record { + return Record{ + Time: t, + Message: msg, + Level: level, + PC: pc, + } +} + +// Clone returns a copy of the record with no shared state. +// The original record and the clone can both be modified +// without interfering with each other. +func (r Record) Clone() Record { + r.back = slices.Clip(r.back) // prevent append from mutating shared array + return r +} + +// NumAttrs returns the number of attributes in the Record. +func (r Record) NumAttrs() int { + return r.nFront + len(r.back) +} + +// Attrs calls f on each Attr in the Record. +// Iteration stops if f returns false. +func (r Record) Attrs(f func(Attr) bool) { + for i := 0; i < r.nFront; i++ { + if !f(r.front[i]) { + return + } + } + for _, a := range r.back { + if !f(a) { + return + } + } +} + +// AddAttrs appends the given Attrs to the Record's list of Attrs. +func (r *Record) AddAttrs(attrs ...Attr) { + n := copy(r.front[r.nFront:], attrs) + r.nFront += n + // Check if a copy was modified by slicing past the end + // and seeing if the Attr there is non-zero. + if cap(r.back) > len(r.back) { + end := r.back[:len(r.back)+1][len(r.back)] + if !end.isEmpty() { + panic("copies of a slog.Record were both modified") + } + } + r.back = append(r.back, attrs[n:]...) +} + +// Add converts the args to Attrs as described in [Logger.Log], +// then appends the Attrs to the Record's list of Attrs. +func (r *Record) Add(args ...any) { + var a Attr + for len(args) > 0 { + a, args = argsToAttr(args) + if r.nFront < len(r.front) { + r.front[r.nFront] = a + r.nFront++ + } else { + if r.back == nil { + r.back = make([]Attr, 0, countAttrs(args)) + } + r.back = append(r.back, a) + } + } + +} + +// countAttrs returns the number of Attrs that would be created from args. +func countAttrs(args []any) int { + n := 0 + for i := 0; i < len(args); i++ { + n++ + if _, ok := args[i].(string); ok { + i++ + } + } + return n +} + +const badKey = "!BADKEY" + +// argsToAttr turns a prefix of the nonempty args slice into an Attr +// and returns the unconsumed portion of the slice. +// If args[0] is an Attr, it returns it. +// If args[0] is a string, it treats the first two elements as +// a key-value pair. +// Otherwise, it treats args[0] as a value with a missing key. +func argsToAttr(args []any) (Attr, []any) { + switch x := args[0].(type) { + case string: + if len(args) == 1 { + return String(badKey, x), nil + } + return Any(x, args[1]), args[2:] + + case Attr: + return x, args[1:] + + default: + return Any(badKey, x), args[1:] + } +} + +// Source describes the location of a line of source code. +type Source struct { + // Function is the package path-qualified function name containing the + // source line. If non-empty, this string uniquely identifies a single + // function in the program. This may be the empty string if not known. + Function string `json:"function"` + // File and Line are the file name and line number (1-based) of the source + // line. These may be the empty string and zero, respectively, if not known. + File string `json:"file"` + Line int `json:"line"` +} + +// attrs returns the non-zero fields of s as a slice of attrs. +// It is similar to a LogValue method, but we don't want Source +// to implement LogValuer because it would be resolved before +// the ReplaceAttr function was called. +func (s *Source) group() Value { + var as []Attr + if s.Function != "" { + as = append(as, String("function", s.Function)) + } + if s.File != "" { + as = append(as, String("file", s.File)) + } + if s.Line != 0 { + as = append(as, Int("line", s.Line)) + } + return GroupValue(as...) +} + +// source returns a Source for the log event. +// If the Record was created without the necessary information, +// or if the location is unavailable, it returns a non-nil *Source +// with zero fields. +func (r Record) source() *Source { + fs := runtime.CallersFrames([]uintptr{r.PC}) + f, _ := fs.Next() + return &Source{ + Function: f.Function, + File: f.File, + Line: f.Line, + } +} diff --git a/vendor/golang.org/x/exp/slog/text_handler.go b/vendor/golang.org/x/exp/slog/text_handler.go new file mode 100644 index 0000000000..75b66b716f --- /dev/null +++ b/vendor/golang.org/x/exp/slog/text_handler.go @@ -0,0 +1,161 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slog + +import ( + "context" + "encoding" + "fmt" + "io" + "reflect" + "strconv" + "unicode" + "unicode/utf8" +) + +// TextHandler is a Handler that writes Records to an io.Writer as a +// sequence of key=value pairs separated by spaces and followed by a newline. +type TextHandler struct { + *commonHandler +} + +// NewTextHandler creates a TextHandler that writes to w, +// using the given options. +// If opts is nil, the default options are used. +func NewTextHandler(w io.Writer, opts *HandlerOptions) *TextHandler { + if opts == nil { + opts = &HandlerOptions{} + } + return &TextHandler{ + &commonHandler{ + json: false, + w: w, + opts: *opts, + }, + } +} + +// Enabled reports whether the handler handles records at the given level. +// The handler ignores records whose level is lower. +func (h *TextHandler) Enabled(_ context.Context, level Level) bool { + return h.commonHandler.enabled(level) +} + +// WithAttrs returns a new TextHandler whose attributes consists +// of h's attributes followed by attrs. +func (h *TextHandler) WithAttrs(attrs []Attr) Handler { + return &TextHandler{commonHandler: h.commonHandler.withAttrs(attrs)} +} + +func (h *TextHandler) WithGroup(name string) Handler { + return &TextHandler{commonHandler: h.commonHandler.withGroup(name)} +} + +// Handle formats its argument Record as a single line of space-separated +// key=value items. +// +// If the Record's time is zero, the time is omitted. +// Otherwise, the key is "time" +// and the value is output in RFC3339 format with millisecond precision. +// +// If the Record's level is zero, the level is omitted. +// Otherwise, the key is "level" +// and the value of [Level.String] is output. +// +// If the AddSource option is set and source information is available, +// the key is "source" and the value is output as FILE:LINE. +// +// The message's key is "msg". +// +// To modify these or other attributes, or remove them from the output, use +// [HandlerOptions.ReplaceAttr]. +// +// If a value implements [encoding.TextMarshaler], the result of MarshalText is +// written. Otherwise, the result of fmt.Sprint is written. +// +// Keys and values are quoted with [strconv.Quote] if they contain Unicode space +// characters, non-printing characters, '"' or '='. +// +// Keys inside groups consist of components (keys or group names) separated by +// dots. No further escaping is performed. +// Thus there is no way to determine from the key "a.b.c" whether there +// are two groups "a" and "b" and a key "c", or a single group "a.b" and a key "c", +// or single group "a" and a key "b.c". +// If it is necessary to reconstruct the group structure of a key +// even in the presence of dots inside components, use +// [HandlerOptions.ReplaceAttr] to encode that information in the key. +// +// Each call to Handle results in a single serialized call to +// io.Writer.Write. +func (h *TextHandler) Handle(_ context.Context, r Record) error { + return h.commonHandler.handle(r) +} + +func appendTextValue(s *handleState, v Value) error { + switch v.Kind() { + case KindString: + s.appendString(v.str()) + case KindTime: + s.appendTime(v.time()) + case KindAny: + if tm, ok := v.any.(encoding.TextMarshaler); ok { + data, err := tm.MarshalText() + if err != nil { + return err + } + // TODO: avoid the conversion to string. + s.appendString(string(data)) + return nil + } + if bs, ok := byteSlice(v.any); ok { + // As of Go 1.19, this only allocates for strings longer than 32 bytes. + s.buf.WriteString(strconv.Quote(string(bs))) + return nil + } + s.appendString(fmt.Sprintf("%+v", v.Any())) + default: + *s.buf = v.append(*s.buf) + } + return nil +} + +// byteSlice returns its argument as a []byte if the argument's +// underlying type is []byte, along with a second return value of true. +// Otherwise it returns nil, false. +func byteSlice(a any) ([]byte, bool) { + if bs, ok := a.([]byte); ok { + return bs, true + } + // Like Printf's %s, we allow both the slice type and the byte element type to be named. + t := reflect.TypeOf(a) + if t != nil && t.Kind() == reflect.Slice && t.Elem().Kind() == reflect.Uint8 { + return reflect.ValueOf(a).Bytes(), true + } + return nil, false +} + +func needsQuoting(s string) bool { + if len(s) == 0 { + return true + } + for i := 0; i < len(s); { + b := s[i] + if b < utf8.RuneSelf { + // Quote anything except a backslash that would need quoting in a + // JSON string, as well as space and '=' + if b != '\\' && (b == ' ' || b == '=' || !safeSet[b]) { + return true + } + i++ + continue + } + r, size := utf8.DecodeRuneInString(s[i:]) + if r == utf8.RuneError || unicode.IsSpace(r) || !unicode.IsPrint(r) { + return true + } + i += size + } + return false +} diff --git a/vendor/golang.org/x/exp/slog/value.go b/vendor/golang.org/x/exp/slog/value.go new file mode 100644 index 0000000000..3550c46fc0 --- /dev/null +++ b/vendor/golang.org/x/exp/slog/value.go @@ -0,0 +1,456 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slog + +import ( + "fmt" + "math" + "runtime" + "strconv" + "strings" + "time" + "unsafe" + + "golang.org/x/exp/slices" +) + +// A Value can represent any Go value, but unlike type any, +// it can represent most small values without an allocation. +// The zero Value corresponds to nil. +type Value struct { + _ [0]func() // disallow == + // num holds the value for Kinds Int64, Uint64, Float64, Bool and Duration, + // the string length for KindString, and nanoseconds since the epoch for KindTime. + num uint64 + // If any is of type Kind, then the value is in num as described above. + // If any is of type *time.Location, then the Kind is Time and time.Time value + // can be constructed from the Unix nanos in num and the location (monotonic time + // is not preserved). + // If any is of type stringptr, then the Kind is String and the string value + // consists of the length in num and the pointer in any. + // Otherwise, the Kind is Any and any is the value. + // (This implies that Attrs cannot store values of type Kind, *time.Location + // or stringptr.) + any any +} + +// Kind is the kind of a Value. +type Kind int + +// The following list is sorted alphabetically, but it's also important that +// KindAny is 0 so that a zero Value represents nil. + +const ( + KindAny Kind = iota + KindBool + KindDuration + KindFloat64 + KindInt64 + KindString + KindTime + KindUint64 + KindGroup + KindLogValuer +) + +var kindStrings = []string{ + "Any", + "Bool", + "Duration", + "Float64", + "Int64", + "String", + "Time", + "Uint64", + "Group", + "LogValuer", +} + +func (k Kind) String() string { + if k >= 0 && int(k) < len(kindStrings) { + return kindStrings[k] + } + return "" +} + +// Unexported version of Kind, just so we can store Kinds in Values. +// (No user-provided value has this type.) +type kind Kind + +// Kind returns v's Kind. +func (v Value) Kind() Kind { + switch x := v.any.(type) { + case Kind: + return x + case stringptr: + return KindString + case timeLocation: + return KindTime + case groupptr: + return KindGroup + case LogValuer: + return KindLogValuer + case kind: // a kind is just a wrapper for a Kind + return KindAny + default: + return KindAny + } +} + +//////////////// Constructors + +// IntValue returns a Value for an int. +func IntValue(v int) Value { + return Int64Value(int64(v)) +} + +// Int64Value returns a Value for an int64. +func Int64Value(v int64) Value { + return Value{num: uint64(v), any: KindInt64} +} + +// Uint64Value returns a Value for a uint64. +func Uint64Value(v uint64) Value { + return Value{num: v, any: KindUint64} +} + +// Float64Value returns a Value for a floating-point number. +func Float64Value(v float64) Value { + return Value{num: math.Float64bits(v), any: KindFloat64} +} + +// BoolValue returns a Value for a bool. +func BoolValue(v bool) Value { + u := uint64(0) + if v { + u = 1 + } + return Value{num: u, any: KindBool} +} + +// Unexported version of *time.Location, just so we can store *time.Locations in +// Values. (No user-provided value has this type.) +type timeLocation *time.Location + +// TimeValue returns a Value for a time.Time. +// It discards the monotonic portion. +func TimeValue(v time.Time) Value { + if v.IsZero() { + // UnixNano on the zero time is undefined, so represent the zero time + // with a nil *time.Location instead. time.Time.Location method never + // returns nil, so a Value with any == timeLocation(nil) cannot be + // mistaken for any other Value, time.Time or otherwise. + return Value{any: timeLocation(nil)} + } + return Value{num: uint64(v.UnixNano()), any: timeLocation(v.Location())} +} + +// DurationValue returns a Value for a time.Duration. +func DurationValue(v time.Duration) Value { + return Value{num: uint64(v.Nanoseconds()), any: KindDuration} +} + +// AnyValue returns a Value for the supplied value. +// +// If the supplied value is of type Value, it is returned +// unmodified. +// +// Given a value of one of Go's predeclared string, bool, or +// (non-complex) numeric types, AnyValue returns a Value of kind +// String, Bool, Uint64, Int64, or Float64. The width of the +// original numeric type is not preserved. +// +// Given a time.Time or time.Duration value, AnyValue returns a Value of kind +// KindTime or KindDuration. The monotonic time is not preserved. +// +// For nil, or values of all other types, including named types whose +// underlying type is numeric, AnyValue returns a value of kind KindAny. +func AnyValue(v any) Value { + switch v := v.(type) { + case string: + return StringValue(v) + case int: + return Int64Value(int64(v)) + case uint: + return Uint64Value(uint64(v)) + case int64: + return Int64Value(v) + case uint64: + return Uint64Value(v) + case bool: + return BoolValue(v) + case time.Duration: + return DurationValue(v) + case time.Time: + return TimeValue(v) + case uint8: + return Uint64Value(uint64(v)) + case uint16: + return Uint64Value(uint64(v)) + case uint32: + return Uint64Value(uint64(v)) + case uintptr: + return Uint64Value(uint64(v)) + case int8: + return Int64Value(int64(v)) + case int16: + return Int64Value(int64(v)) + case int32: + return Int64Value(int64(v)) + case float64: + return Float64Value(v) + case float32: + return Float64Value(float64(v)) + case []Attr: + return GroupValue(v...) + case Kind: + return Value{any: kind(v)} + case Value: + return v + default: + return Value{any: v} + } +} + +//////////////// Accessors + +// Any returns v's value as an any. +func (v Value) Any() any { + switch v.Kind() { + case KindAny: + if k, ok := v.any.(kind); ok { + return Kind(k) + } + return v.any + case KindLogValuer: + return v.any + case KindGroup: + return v.group() + case KindInt64: + return int64(v.num) + case KindUint64: + return v.num + case KindFloat64: + return v.float() + case KindString: + return v.str() + case KindBool: + return v.bool() + case KindDuration: + return v.duration() + case KindTime: + return v.time() + default: + panic(fmt.Sprintf("bad kind: %s", v.Kind())) + } +} + +// Int64 returns v's value as an int64. It panics +// if v is not a signed integer. +func (v Value) Int64() int64 { + if g, w := v.Kind(), KindInt64; g != w { + panic(fmt.Sprintf("Value kind is %s, not %s", g, w)) + } + return int64(v.num) +} + +// Uint64 returns v's value as a uint64. It panics +// if v is not an unsigned integer. +func (v Value) Uint64() uint64 { + if g, w := v.Kind(), KindUint64; g != w { + panic(fmt.Sprintf("Value kind is %s, not %s", g, w)) + } + return v.num +} + +// Bool returns v's value as a bool. It panics +// if v is not a bool. +func (v Value) Bool() bool { + if g, w := v.Kind(), KindBool; g != w { + panic(fmt.Sprintf("Value kind is %s, not %s", g, w)) + } + return v.bool() +} + +func (v Value) bool() bool { + return v.num == 1 +} + +// Duration returns v's value as a time.Duration. It panics +// if v is not a time.Duration. +func (v Value) Duration() time.Duration { + if g, w := v.Kind(), KindDuration; g != w { + panic(fmt.Sprintf("Value kind is %s, not %s", g, w)) + } + + return v.duration() +} + +func (v Value) duration() time.Duration { + return time.Duration(int64(v.num)) +} + +// Float64 returns v's value as a float64. It panics +// if v is not a float64. +func (v Value) Float64() float64 { + if g, w := v.Kind(), KindFloat64; g != w { + panic(fmt.Sprintf("Value kind is %s, not %s", g, w)) + } + + return v.float() +} + +func (v Value) float() float64 { + return math.Float64frombits(v.num) +} + +// Time returns v's value as a time.Time. It panics +// if v is not a time.Time. +func (v Value) Time() time.Time { + if g, w := v.Kind(), KindTime; g != w { + panic(fmt.Sprintf("Value kind is %s, not %s", g, w)) + } + return v.time() +} + +func (v Value) time() time.Time { + loc := v.any.(timeLocation) + if loc == nil { + return time.Time{} + } + return time.Unix(0, int64(v.num)).In(loc) +} + +// LogValuer returns v's value as a LogValuer. It panics +// if v is not a LogValuer. +func (v Value) LogValuer() LogValuer { + return v.any.(LogValuer) +} + +// Group returns v's value as a []Attr. +// It panics if v's Kind is not KindGroup. +func (v Value) Group() []Attr { + if sp, ok := v.any.(groupptr); ok { + return unsafe.Slice((*Attr)(sp), v.num) + } + panic("Group: bad kind") +} + +func (v Value) group() []Attr { + return unsafe.Slice((*Attr)(v.any.(groupptr)), v.num) +} + +//////////////// Other + +// Equal reports whether v and w represent the same Go value. +func (v Value) Equal(w Value) bool { + k1 := v.Kind() + k2 := w.Kind() + if k1 != k2 { + return false + } + switch k1 { + case KindInt64, KindUint64, KindBool, KindDuration: + return v.num == w.num + case KindString: + return v.str() == w.str() + case KindFloat64: + return v.float() == w.float() + case KindTime: + return v.time().Equal(w.time()) + case KindAny, KindLogValuer: + return v.any == w.any // may panic if non-comparable + case KindGroup: + return slices.EqualFunc(v.group(), w.group(), Attr.Equal) + default: + panic(fmt.Sprintf("bad kind: %s", k1)) + } +} + +// append appends a text representation of v to dst. +// v is formatted as with fmt.Sprint. +func (v Value) append(dst []byte) []byte { + switch v.Kind() { + case KindString: + return append(dst, v.str()...) + case KindInt64: + return strconv.AppendInt(dst, int64(v.num), 10) + case KindUint64: + return strconv.AppendUint(dst, v.num, 10) + case KindFloat64: + return strconv.AppendFloat(dst, v.float(), 'g', -1, 64) + case KindBool: + return strconv.AppendBool(dst, v.bool()) + case KindDuration: + return append(dst, v.duration().String()...) + case KindTime: + return append(dst, v.time().String()...) + case KindGroup: + return fmt.Append(dst, v.group()) + case KindAny, KindLogValuer: + return fmt.Append(dst, v.any) + default: + panic(fmt.Sprintf("bad kind: %s", v.Kind())) + } +} + +// A LogValuer is any Go value that can convert itself into a Value for logging. +// +// This mechanism may be used to defer expensive operations until they are +// needed, or to expand a single value into a sequence of components. +type LogValuer interface { + LogValue() Value +} + +const maxLogValues = 100 + +// Resolve repeatedly calls LogValue on v while it implements LogValuer, +// and returns the result. +// If v resolves to a group, the group's attributes' values are not recursively +// resolved. +// If the number of LogValue calls exceeds a threshold, a Value containing an +// error is returned. +// Resolve's return value is guaranteed not to be of Kind KindLogValuer. +func (v Value) Resolve() (rv Value) { + orig := v + defer func() { + if r := recover(); r != nil { + rv = AnyValue(fmt.Errorf("LogValue panicked\n%s", stack(3, 5))) + } + }() + + for i := 0; i < maxLogValues; i++ { + if v.Kind() != KindLogValuer { + return v + } + v = v.LogValuer().LogValue() + } + err := fmt.Errorf("LogValue called too many times on Value of type %T", orig.Any()) + return AnyValue(err) +} + +func stack(skip, nFrames int) string { + pcs := make([]uintptr, nFrames+1) + n := runtime.Callers(skip+1, pcs) + if n == 0 { + return "(no stack)" + } + frames := runtime.CallersFrames(pcs[:n]) + var b strings.Builder + i := 0 + for { + frame, more := frames.Next() + fmt.Fprintf(&b, "called from %s (%s:%d)\n", frame.Function, frame.File, frame.Line) + if !more { + break + } + i++ + if i >= nFrames { + fmt.Fprintf(&b, "(rest of stack elided)\n") + break + } + } + return b.String() +} diff --git a/vendor/golang.org/x/exp/slog/value_119.go b/vendor/golang.org/x/exp/slog/value_119.go new file mode 100644 index 0000000000..29b0d73292 --- /dev/null +++ b/vendor/golang.org/x/exp/slog/value_119.go @@ -0,0 +1,53 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.19 && !go1.20 + +package slog + +import ( + "reflect" + "unsafe" +) + +type ( + stringptr unsafe.Pointer // used in Value.any when the Value is a string + groupptr unsafe.Pointer // used in Value.any when the Value is a []Attr +) + +// StringValue returns a new Value for a string. +func StringValue(value string) Value { + hdr := (*reflect.StringHeader)(unsafe.Pointer(&value)) + return Value{num: uint64(hdr.Len), any: stringptr(hdr.Data)} +} + +func (v Value) str() string { + var s string + hdr := (*reflect.StringHeader)(unsafe.Pointer(&s)) + hdr.Data = uintptr(v.any.(stringptr)) + hdr.Len = int(v.num) + return s +} + +// String returns Value's value as a string, formatted like fmt.Sprint. Unlike +// the methods Int64, Float64, and so on, which panic if v is of the +// wrong kind, String never panics. +func (v Value) String() string { + if sp, ok := v.any.(stringptr); ok { + // Inlining this code makes a huge difference. + var s string + hdr := (*reflect.StringHeader)(unsafe.Pointer(&s)) + hdr.Data = uintptr(sp) + hdr.Len = int(v.num) + return s + } + return string(v.append(nil)) +} + +// GroupValue returns a new Value for a list of Attrs. +// The caller must not subsequently mutate the argument slice. +func GroupValue(as ...Attr) Value { + hdr := (*reflect.SliceHeader)(unsafe.Pointer(&as)) + return Value{num: uint64(hdr.Len), any: groupptr(hdr.Data)} +} diff --git a/vendor/golang.org/x/exp/slog/value_120.go b/vendor/golang.org/x/exp/slog/value_120.go new file mode 100644 index 0000000000..f7d4c09325 --- /dev/null +++ b/vendor/golang.org/x/exp/slog/value_120.go @@ -0,0 +1,39 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.20 + +package slog + +import "unsafe" + +type ( + stringptr *byte // used in Value.any when the Value is a string + groupptr *Attr // used in Value.any when the Value is a []Attr +) + +// StringValue returns a new Value for a string. +func StringValue(value string) Value { + return Value{num: uint64(len(value)), any: stringptr(unsafe.StringData(value))} +} + +// GroupValue returns a new Value for a list of Attrs. +// The caller must not subsequently mutate the argument slice. +func GroupValue(as ...Attr) Value { + return Value{num: uint64(len(as)), any: groupptr(unsafe.SliceData(as))} +} + +// String returns Value's value as a string, formatted like fmt.Sprint. Unlike +// the methods Int64, Float64, and so on, which panic if v is of the +// wrong kind, String never panics. +func (v Value) String() string { + if sp, ok := v.any.(stringptr); ok { + return unsafe.String(sp, v.num) + } + return string(v.append(nil)) +} + +func (v Value) str() string { + return unsafe.String(v.any.(stringptr), v.num) +} diff --git a/vendor/golang.org/x/text/encoding/encoding.go b/vendor/golang.org/x/text/encoding/encoding.go new file mode 100644 index 0000000000..a0bd7cd4d0 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/encoding.go @@ -0,0 +1,335 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package encoding defines an interface for character encodings, such as Shift +// JIS and Windows 1252, that can convert to and from UTF-8. +// +// Encoding implementations are provided in other packages, such as +// golang.org/x/text/encoding/charmap and +// golang.org/x/text/encoding/japanese. +package encoding // import "golang.org/x/text/encoding" + +import ( + "errors" + "io" + "strconv" + "unicode/utf8" + + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// TODO: +// - There seems to be some inconsistency in when decoders return errors +// and when not. Also documentation seems to suggest they shouldn't return +// errors at all (except for UTF-16). +// - Encoders seem to rely on or at least benefit from the input being in NFC +// normal form. Perhaps add an example how users could prepare their output. + +// Encoding is a character set encoding that can be transformed to and from +// UTF-8. +type Encoding interface { + // NewDecoder returns a Decoder. + NewDecoder() *Decoder + + // NewEncoder returns an Encoder. + NewEncoder() *Encoder +} + +// A Decoder converts bytes to UTF-8. It implements transform.Transformer. +// +// Transforming source bytes that are not of that encoding will not result in an +// error per se. Each byte that cannot be transcoded will be represented in the +// output by the UTF-8 encoding of '\uFFFD', the replacement rune. +type Decoder struct { + transform.Transformer + + // This forces external creators of Decoders to use names in struct + // initializers, allowing for future extendibility without having to break + // code. + _ struct{} +} + +// Bytes converts the given encoded bytes to UTF-8. It returns the converted +// bytes or nil, err if any error occurred. +func (d *Decoder) Bytes(b []byte) ([]byte, error) { + b, _, err := transform.Bytes(d, b) + if err != nil { + return nil, err + } + return b, nil +} + +// String converts the given encoded string to UTF-8. It returns the converted +// string or "", err if any error occurred. +func (d *Decoder) String(s string) (string, error) { + s, _, err := transform.String(d, s) + if err != nil { + return "", err + } + return s, nil +} + +// Reader wraps another Reader to decode its bytes. +// +// The Decoder may not be used for any other operation as long as the returned +// Reader is in use. +func (d *Decoder) Reader(r io.Reader) io.Reader { + return transform.NewReader(r, d) +} + +// An Encoder converts bytes from UTF-8. It implements transform.Transformer. +// +// Each rune that cannot be transcoded will result in an error. In this case, +// the transform will consume all source byte up to, not including the offending +// rune. Transforming source bytes that are not valid UTF-8 will be replaced by +// `\uFFFD`. To return early with an error instead, use transform.Chain to +// preprocess the data with a UTF8Validator. +type Encoder struct { + transform.Transformer + + // This forces external creators of Encoders to use names in struct + // initializers, allowing for future extendibility without having to break + // code. + _ struct{} +} + +// Bytes converts bytes from UTF-8. It returns the converted bytes or nil, err if +// any error occurred. +func (e *Encoder) Bytes(b []byte) ([]byte, error) { + b, _, err := transform.Bytes(e, b) + if err != nil { + return nil, err + } + return b, nil +} + +// String converts a string from UTF-8. It returns the converted string or +// "", err if any error occurred. +func (e *Encoder) String(s string) (string, error) { + s, _, err := transform.String(e, s) + if err != nil { + return "", err + } + return s, nil +} + +// Writer wraps another Writer to encode its UTF-8 output. +// +// The Encoder may not be used for any other operation as long as the returned +// Writer is in use. +func (e *Encoder) Writer(w io.Writer) io.Writer { + return transform.NewWriter(w, e) +} + +// ASCIISub is the ASCII substitute character, as recommended by +// https://unicode.org/reports/tr36/#Text_Comparison +const ASCIISub = '\x1a' + +// Nop is the nop encoding. Its transformed bytes are the same as the source +// bytes; it does not replace invalid UTF-8 sequences. +var Nop Encoding = nop{} + +type nop struct{} + +func (nop) NewDecoder() *Decoder { + return &Decoder{Transformer: transform.Nop} +} +func (nop) NewEncoder() *Encoder { + return &Encoder{Transformer: transform.Nop} +} + +// Replacement is the replacement encoding. Decoding from the replacement +// encoding yields a single '\uFFFD' replacement rune. Encoding from UTF-8 to +// the replacement encoding yields the same as the source bytes except that +// invalid UTF-8 is converted to '\uFFFD'. +// +// It is defined at http://encoding.spec.whatwg.org/#replacement +var Replacement Encoding = replacement{} + +type replacement struct{} + +func (replacement) NewDecoder() *Decoder { + return &Decoder{Transformer: replacementDecoder{}} +} + +func (replacement) NewEncoder() *Encoder { + return &Encoder{Transformer: replacementEncoder{}} +} + +func (replacement) ID() (mib identifier.MIB, other string) { + return identifier.Replacement, "" +} + +type replacementDecoder struct{ transform.NopResetter } + +func (replacementDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if len(dst) < 3 { + return 0, 0, transform.ErrShortDst + } + if atEOF { + const fffd = "\ufffd" + dst[0] = fffd[0] + dst[1] = fffd[1] + dst[2] = fffd[2] + nDst = 3 + } + return nDst, len(src), nil +} + +type replacementEncoder struct{ transform.NopResetter } + +func (replacementEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 + + for ; nSrc < len(src); nSrc += size { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + r = '\ufffd' + } + } + + if nDst+utf8.RuneLen(r) > len(dst) { + err = transform.ErrShortDst + break + } + nDst += utf8.EncodeRune(dst[nDst:], r) + } + return nDst, nSrc, err +} + +// HTMLEscapeUnsupported wraps encoders to replace source runes outside the +// repertoire of the destination encoding with HTML escape sequences. +// +// This wrapper exists to comply to URL and HTML forms requiring a +// non-terminating legacy encoder. The produced sequences may lead to data +// loss as they are indistinguishable from legitimate input. To avoid this +// issue, use UTF-8 encodings whenever possible. +func HTMLEscapeUnsupported(e *Encoder) *Encoder { + return &Encoder{Transformer: &errorHandler{e, errorToHTML}} +} + +// ReplaceUnsupported wraps encoders to replace source runes outside the +// repertoire of the destination encoding with an encoding-specific +// replacement. +// +// This wrapper is only provided for backwards compatibility and legacy +// handling. Its use is strongly discouraged. Use UTF-8 whenever possible. +func ReplaceUnsupported(e *Encoder) *Encoder { + return &Encoder{Transformer: &errorHandler{e, errorToReplacement}} +} + +type errorHandler struct { + *Encoder + handler func(dst []byte, r rune, err repertoireError) (n int, ok bool) +} + +// TODO: consider making this error public in some form. +type repertoireError interface { + Replacement() byte +} + +func (h errorHandler) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + nDst, nSrc, err = h.Transformer.Transform(dst, src, atEOF) + for err != nil { + rerr, ok := err.(repertoireError) + if !ok { + return nDst, nSrc, err + } + r, sz := utf8.DecodeRune(src[nSrc:]) + n, ok := h.handler(dst[nDst:], r, rerr) + if !ok { + return nDst, nSrc, transform.ErrShortDst + } + err = nil + nDst += n + if nSrc += sz; nSrc < len(src) { + var dn, sn int + dn, sn, err = h.Transformer.Transform(dst[nDst:], src[nSrc:], atEOF) + nDst += dn + nSrc += sn + } + } + return nDst, nSrc, err +} + +func errorToHTML(dst []byte, r rune, err repertoireError) (n int, ok bool) { + buf := [8]byte{} + b := strconv.AppendUint(buf[:0], uint64(r), 10) + if n = len(b) + len("&#;"); n >= len(dst) { + return 0, false + } + dst[0] = '&' + dst[1] = '#' + dst[copy(dst[2:], b)+2] = ';' + return n, true +} + +func errorToReplacement(dst []byte, r rune, err repertoireError) (n int, ok bool) { + if len(dst) == 0 { + return 0, false + } + dst[0] = err.Replacement() + return 1, true +} + +// ErrInvalidUTF8 means that a transformer encountered invalid UTF-8. +var ErrInvalidUTF8 = errors.New("encoding: invalid UTF-8") + +// UTF8Validator is a transformer that returns ErrInvalidUTF8 on the first +// input byte that is not valid UTF-8. +var UTF8Validator transform.Transformer = utf8Validator{} + +type utf8Validator struct{ transform.NopResetter } + +func (utf8Validator) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + n := len(src) + if n > len(dst) { + n = len(dst) + } + for i := 0; i < n; { + if c := src[i]; c < utf8.RuneSelf { + dst[i] = c + i++ + continue + } + _, size := utf8.DecodeRune(src[i:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + err = ErrInvalidUTF8 + if !atEOF && !utf8.FullRune(src[i:]) { + err = transform.ErrShortSrc + } + return i, i, err + } + if i+size > len(dst) { + return i, i, transform.ErrShortDst + } + for ; size > 0; size-- { + dst[i] = src[i] + i++ + } + } + if len(src) > len(dst) { + err = transform.ErrShortDst + } + return n, n, err +} diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go b/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go new file mode 100644 index 0000000000..5c9b85c280 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go @@ -0,0 +1,81 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:generate go run gen.go + +// Package identifier defines the contract between implementations of Encoding +// and Index by defining identifiers that uniquely identify standardized coded +// character sets (CCS) and character encoding schemes (CES), which we will +// together refer to as encodings, for which Encoding implementations provide +// converters to and from UTF-8. This package is typically only of concern to +// implementers of Indexes and Encodings. +// +// One part of the identifier is the MIB code, which is defined by IANA and +// uniquely identifies a CCS or CES. Each code is associated with data that +// references authorities, official documentation as well as aliases and MIME +// names. +// +// Not all CESs are covered by the IANA registry. The "other" string that is +// returned by ID can be used to identify other character sets or versions of +// existing ones. +// +// It is recommended that each package that provides a set of Encodings provide +// the All and Common variables to reference all supported encodings and +// commonly used subset. This allows Index implementations to include all +// available encodings without explicitly referencing or knowing about them. +package identifier + +// Note: this package is internal, but could be made public if there is a need +// for writing third-party Indexes and Encodings. + +// References: +// - http://source.icu-project.org/repos/icu/icu/trunk/source/data/mappings/convrtrs.txt +// - http://www.iana.org/assignments/character-sets/character-sets.xhtml +// - http://www.iana.org/assignments/ianacharset-mib/ianacharset-mib +// - http://www.ietf.org/rfc/rfc2978.txt +// - https://www.unicode.org/reports/tr22/ +// - http://www.w3.org/TR/encoding/ +// - https://encoding.spec.whatwg.org/ +// - https://encoding.spec.whatwg.org/encodings.json +// - https://tools.ietf.org/html/rfc6657#section-5 + +// Interface can be implemented by Encodings to define the CCS or CES for which +// it implements conversions. +type Interface interface { + // ID returns an encoding identifier. Exactly one of the mib and other + // values should be non-zero. + // + // In the usual case it is only necessary to indicate the MIB code. The + // other string can be used to specify encodings for which there is no MIB, + // such as "x-mac-dingbat". + // + // The other string may only contain the characters a-z, A-Z, 0-9, - and _. + ID() (mib MIB, other string) + + // NOTE: the restrictions on the encoding are to allow extending the syntax + // with additional information such as versions, vendors and other variants. +} + +// A MIB identifies an encoding. It is derived from the IANA MIB codes and adds +// some identifiers for some encodings that are not covered by the IANA +// standard. +// +// See http://www.iana.org/assignments/ianacharset-mib. +type MIB uint16 + +// These additional MIB types are not defined in IANA. They are added because +// they are common and defined within the text repo. +const ( + // Unofficial marks the start of encodings not registered by IANA. + Unofficial MIB = 10000 + iota + + // Replacement is the WhatWG replacement encoding. + Replacement + + // XUserDefined is the code for x-user-defined. + XUserDefined + + // MacintoshCyrillic is the code for x-mac-cyrillic. + MacintoshCyrillic +) diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/mib.go b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go new file mode 100644 index 0000000000..351fb86e29 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go @@ -0,0 +1,1627 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package identifier + +const ( + // ASCII is the MIB identifier with IANA name US-ASCII (MIME: US-ASCII). + // + // ANSI X3.4-1986 + // Reference: RFC2046 + ASCII MIB = 3 + + // ISOLatin1 is the MIB identifier with IANA name ISO_8859-1:1987 (MIME: ISO-8859-1). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin1 MIB = 4 + + // ISOLatin2 is the MIB identifier with IANA name ISO_8859-2:1987 (MIME: ISO-8859-2). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin2 MIB = 5 + + // ISOLatin3 is the MIB identifier with IANA name ISO_8859-3:1988 (MIME: ISO-8859-3). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin3 MIB = 6 + + // ISOLatin4 is the MIB identifier with IANA name ISO_8859-4:1988 (MIME: ISO-8859-4). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin4 MIB = 7 + + // ISOLatinCyrillic is the MIB identifier with IANA name ISO_8859-5:1988 (MIME: ISO-8859-5). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatinCyrillic MIB = 8 + + // ISOLatinArabic is the MIB identifier with IANA name ISO_8859-6:1987 (MIME: ISO-8859-6). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatinArabic MIB = 9 + + // ISOLatinGreek is the MIB identifier with IANA name ISO_8859-7:1987 (MIME: ISO-8859-7). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1947 + // Reference: RFC1345 + ISOLatinGreek MIB = 10 + + // ISOLatinHebrew is the MIB identifier with IANA name ISO_8859-8:1988 (MIME: ISO-8859-8). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatinHebrew MIB = 11 + + // ISOLatin5 is the MIB identifier with IANA name ISO_8859-9:1989 (MIME: ISO-8859-9). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin5 MIB = 12 + + // ISOLatin6 is the MIB identifier with IANA name ISO-8859-10 (MIME: ISO-8859-10). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin6 MIB = 13 + + // ISOTextComm is the MIB identifier with IANA name ISO_6937-2-add. + // + // ISO-IR: International Register of Escape Sequences and ISO 6937-2:1983 + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOTextComm MIB = 14 + + // HalfWidthKatakana is the MIB identifier with IANA name JIS_X0201. + // + // JIS X 0201-1976. One byte only, this is equivalent to + // JIS/Roman (similar to ASCII) plus eight-bit half-width + // Katakana + // Reference: RFC1345 + HalfWidthKatakana MIB = 15 + + // JISEncoding is the MIB identifier with IANA name JIS_Encoding. + // + // JIS X 0202-1991. Uses ISO 2022 escape sequences to + // shift code sets as documented in JIS X 0202-1991. + JISEncoding MIB = 16 + + // ShiftJIS is the MIB identifier with IANA name Shift_JIS (MIME: Shift_JIS). + // + // This charset is an extension of csHalfWidthKatakana by + // adding graphic characters in JIS X 0208. The CCS's are + // JIS X0201:1997 and JIS X0208:1997. The + // complete definition is shown in Appendix 1 of JIS + // X0208:1997. + // This charset can be used for the top-level media type "text". + ShiftJIS MIB = 17 + + // EUCPkdFmtJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Packed_Format_for_Japanese (MIME: EUC-JP). + // + // Standardized by OSF, UNIX International, and UNIX Systems + // Laboratories Pacific. Uses ISO 2022 rules to select + // code set 0: US-ASCII (a single 7-bit byte set) + // code set 1: JIS X0208-1990 (a double 8-bit byte set) + // restricted to A0-FF in both bytes + // code set 2: Half Width Katakana (a single 7-bit byte set) + // requiring SS2 as the character prefix + // code set 3: JIS X0212-1990 (a double 7-bit byte set) + // restricted to A0-FF in both bytes + // requiring SS3 as the character prefix + EUCPkdFmtJapanese MIB = 18 + + // EUCFixWidJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Fixed_Width_for_Japanese. + // + // Used in Japan. Each character is 2 octets. + // code set 0: US-ASCII (a single 7-bit byte set) + // 1st byte = 00 + // 2nd byte = 20-7E + // code set 1: JIS X0208-1990 (a double 7-bit byte set) + // restricted to A0-FF in both bytes + // code set 2: Half Width Katakana (a single 7-bit byte set) + // 1st byte = 00 + // 2nd byte = A0-FF + // code set 3: JIS X0212-1990 (a double 7-bit byte set) + // restricted to A0-FF in + // the first byte + // and 21-7E in the second byte + EUCFixWidJapanese MIB = 19 + + // ISO4UnitedKingdom is the MIB identifier with IANA name BS_4730. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO4UnitedKingdom MIB = 20 + + // ISO11SwedishForNames is the MIB identifier with IANA name SEN_850200_C. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO11SwedishForNames MIB = 21 + + // ISO15Italian is the MIB identifier with IANA name IT. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO15Italian MIB = 22 + + // ISO17Spanish is the MIB identifier with IANA name ES. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO17Spanish MIB = 23 + + // ISO21German is the MIB identifier with IANA name DIN_66003. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO21German MIB = 24 + + // ISO60Norwegian1 is the MIB identifier with IANA name NS_4551-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO60Norwegian1 MIB = 25 + + // ISO69French is the MIB identifier with IANA name NF_Z_62-010. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO69French MIB = 26 + + // ISO10646UTF1 is the MIB identifier with IANA name ISO-10646-UTF-1. + // + // Universal Transfer Format (1), this is the multibyte + // encoding, that subsets ASCII-7. It does not have byte + // ordering issues. + ISO10646UTF1 MIB = 27 + + // ISO646basic1983 is the MIB identifier with IANA name ISO_646.basic:1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO646basic1983 MIB = 28 + + // INVARIANT is the MIB identifier with IANA name INVARIANT. + // + // Reference: RFC1345 + INVARIANT MIB = 29 + + // ISO2IntlRefVersion is the MIB identifier with IANA name ISO_646.irv:1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO2IntlRefVersion MIB = 30 + + // NATSSEFI is the MIB identifier with IANA name NATS-SEFI. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSSEFI MIB = 31 + + // NATSSEFIADD is the MIB identifier with IANA name NATS-SEFI-ADD. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSSEFIADD MIB = 32 + + // NATSDANO is the MIB identifier with IANA name NATS-DANO. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSDANO MIB = 33 + + // NATSDANOADD is the MIB identifier with IANA name NATS-DANO-ADD. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSDANOADD MIB = 34 + + // ISO10Swedish is the MIB identifier with IANA name SEN_850200_B. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO10Swedish MIB = 35 + + // KSC56011987 is the MIB identifier with IANA name KS_C_5601-1987. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + KSC56011987 MIB = 36 + + // ISO2022KR is the MIB identifier with IANA name ISO-2022-KR (MIME: ISO-2022-KR). + // + // rfc1557 (see also KS_C_5601-1987) + // Reference: RFC1557 + ISO2022KR MIB = 37 + + // EUCKR is the MIB identifier with IANA name EUC-KR (MIME: EUC-KR). + // + // rfc1557 (see also KS_C_5861-1992) + // Reference: RFC1557 + EUCKR MIB = 38 + + // ISO2022JP is the MIB identifier with IANA name ISO-2022-JP (MIME: ISO-2022-JP). + // + // rfc1468 (see also rfc2237 ) + // Reference: RFC1468 + ISO2022JP MIB = 39 + + // ISO2022JP2 is the MIB identifier with IANA name ISO-2022-JP-2 (MIME: ISO-2022-JP-2). + // + // rfc1554 + // Reference: RFC1554 + ISO2022JP2 MIB = 40 + + // ISO13JISC6220jp is the MIB identifier with IANA name JIS_C6220-1969-jp. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO13JISC6220jp MIB = 41 + + // ISO14JISC6220ro is the MIB identifier with IANA name JIS_C6220-1969-ro. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO14JISC6220ro MIB = 42 + + // ISO16Portuguese is the MIB identifier with IANA name PT. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO16Portuguese MIB = 43 + + // ISO18Greek7Old is the MIB identifier with IANA name greek7-old. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO18Greek7Old MIB = 44 + + // ISO19LatinGreek is the MIB identifier with IANA name latin-greek. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO19LatinGreek MIB = 45 + + // ISO25French is the MIB identifier with IANA name NF_Z_62-010_(1973). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO25French MIB = 46 + + // ISO27LatinGreek1 is the MIB identifier with IANA name Latin-greek-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO27LatinGreek1 MIB = 47 + + // ISO5427Cyrillic is the MIB identifier with IANA name ISO_5427. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO5427Cyrillic MIB = 48 + + // ISO42JISC62261978 is the MIB identifier with IANA name JIS_C6226-1978. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO42JISC62261978 MIB = 49 + + // ISO47BSViewdata is the MIB identifier with IANA name BS_viewdata. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO47BSViewdata MIB = 50 + + // ISO49INIS is the MIB identifier with IANA name INIS. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO49INIS MIB = 51 + + // ISO50INIS8 is the MIB identifier with IANA name INIS-8. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO50INIS8 MIB = 52 + + // ISO51INISCyrillic is the MIB identifier with IANA name INIS-cyrillic. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO51INISCyrillic MIB = 53 + + // ISO54271981 is the MIB identifier with IANA name ISO_5427:1981. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO54271981 MIB = 54 + + // ISO5428Greek is the MIB identifier with IANA name ISO_5428:1980. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO5428Greek MIB = 55 + + // ISO57GB1988 is the MIB identifier with IANA name GB_1988-80. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO57GB1988 MIB = 56 + + // ISO58GB231280 is the MIB identifier with IANA name GB_2312-80. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO58GB231280 MIB = 57 + + // ISO61Norwegian2 is the MIB identifier with IANA name NS_4551-2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO61Norwegian2 MIB = 58 + + // ISO70VideotexSupp1 is the MIB identifier with IANA name videotex-suppl. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO70VideotexSupp1 MIB = 59 + + // ISO84Portuguese2 is the MIB identifier with IANA name PT2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO84Portuguese2 MIB = 60 + + // ISO85Spanish2 is the MIB identifier with IANA name ES2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO85Spanish2 MIB = 61 + + // ISO86Hungarian is the MIB identifier with IANA name MSZ_7795.3. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO86Hungarian MIB = 62 + + // ISO87JISX0208 is the MIB identifier with IANA name JIS_C6226-1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO87JISX0208 MIB = 63 + + // ISO88Greek7 is the MIB identifier with IANA name greek7. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO88Greek7 MIB = 64 + + // ISO89ASMO449 is the MIB identifier with IANA name ASMO_449. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO89ASMO449 MIB = 65 + + // ISO90 is the MIB identifier with IANA name iso-ir-90. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO90 MIB = 66 + + // ISO91JISC62291984a is the MIB identifier with IANA name JIS_C6229-1984-a. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO91JISC62291984a MIB = 67 + + // ISO92JISC62991984b is the MIB identifier with IANA name JIS_C6229-1984-b. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO92JISC62991984b MIB = 68 + + // ISO93JIS62291984badd is the MIB identifier with IANA name JIS_C6229-1984-b-add. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO93JIS62291984badd MIB = 69 + + // ISO94JIS62291984hand is the MIB identifier with IANA name JIS_C6229-1984-hand. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO94JIS62291984hand MIB = 70 + + // ISO95JIS62291984handadd is the MIB identifier with IANA name JIS_C6229-1984-hand-add. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO95JIS62291984handadd MIB = 71 + + // ISO96JISC62291984kana is the MIB identifier with IANA name JIS_C6229-1984-kana. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO96JISC62291984kana MIB = 72 + + // ISO2033 is the MIB identifier with IANA name ISO_2033-1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO2033 MIB = 73 + + // ISO99NAPLPS is the MIB identifier with IANA name ANSI_X3.110-1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO99NAPLPS MIB = 74 + + // ISO102T617bit is the MIB identifier with IANA name T.61-7bit. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO102T617bit MIB = 75 + + // ISO103T618bit is the MIB identifier with IANA name T.61-8bit. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO103T618bit MIB = 76 + + // ISO111ECMACyrillic is the MIB identifier with IANA name ECMA-cyrillic. + // + // ISO registry + ISO111ECMACyrillic MIB = 77 + + // ISO121Canadian1 is the MIB identifier with IANA name CSA_Z243.4-1985-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO121Canadian1 MIB = 78 + + // ISO122Canadian2 is the MIB identifier with IANA name CSA_Z243.4-1985-2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO122Canadian2 MIB = 79 + + // ISO123CSAZ24341985gr is the MIB identifier with IANA name CSA_Z243.4-1985-gr. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO123CSAZ24341985gr MIB = 80 + + // ISO88596E is the MIB identifier with IANA name ISO_8859-6-E (MIME: ISO-8859-6-E). + // + // rfc1556 + // Reference: RFC1556 + ISO88596E MIB = 81 + + // ISO88596I is the MIB identifier with IANA name ISO_8859-6-I (MIME: ISO-8859-6-I). + // + // rfc1556 + // Reference: RFC1556 + ISO88596I MIB = 82 + + // ISO128T101G2 is the MIB identifier with IANA name T.101-G2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO128T101G2 MIB = 83 + + // ISO88598E is the MIB identifier with IANA name ISO_8859-8-E (MIME: ISO-8859-8-E). + // + // rfc1556 + // Reference: RFC1556 + ISO88598E MIB = 84 + + // ISO88598I is the MIB identifier with IANA name ISO_8859-8-I (MIME: ISO-8859-8-I). + // + // rfc1556 + // Reference: RFC1556 + ISO88598I MIB = 85 + + // ISO139CSN369103 is the MIB identifier with IANA name CSN_369103. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO139CSN369103 MIB = 86 + + // ISO141JUSIB1002 is the MIB identifier with IANA name JUS_I.B1.002. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO141JUSIB1002 MIB = 87 + + // ISO143IECP271 is the MIB identifier with IANA name IEC_P27-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO143IECP271 MIB = 88 + + // ISO146Serbian is the MIB identifier with IANA name JUS_I.B1.003-serb. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO146Serbian MIB = 89 + + // ISO147Macedonian is the MIB identifier with IANA name JUS_I.B1.003-mac. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO147Macedonian MIB = 90 + + // ISO150GreekCCITT is the MIB identifier with IANA name greek-ccitt. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO150GreekCCITT MIB = 91 + + // ISO151Cuba is the MIB identifier with IANA name NC_NC00-10:81. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO151Cuba MIB = 92 + + // ISO6937Add is the MIB identifier with IANA name ISO_6937-2-25. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO6937Add MIB = 93 + + // ISO153GOST1976874 is the MIB identifier with IANA name GOST_19768-74. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO153GOST1976874 MIB = 94 + + // ISO8859Supp is the MIB identifier with IANA name ISO_8859-supp. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO8859Supp MIB = 95 + + // ISO10367Box is the MIB identifier with IANA name ISO_10367-box. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO10367Box MIB = 96 + + // ISO158Lap is the MIB identifier with IANA name latin-lap. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO158Lap MIB = 97 + + // ISO159JISX02121990 is the MIB identifier with IANA name JIS_X0212-1990. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO159JISX02121990 MIB = 98 + + // ISO646Danish is the MIB identifier with IANA name DS_2089. + // + // Danish Standard, DS 2089, February 1974 + // Reference: RFC1345 + ISO646Danish MIB = 99 + + // USDK is the MIB identifier with IANA name us-dk. + // + // Reference: RFC1345 + USDK MIB = 100 + + // DKUS is the MIB identifier with IANA name dk-us. + // + // Reference: RFC1345 + DKUS MIB = 101 + + // KSC5636 is the MIB identifier with IANA name KSC5636. + // + // Reference: RFC1345 + KSC5636 MIB = 102 + + // Unicode11UTF7 is the MIB identifier with IANA name UNICODE-1-1-UTF-7. + // + // rfc1642 + // Reference: RFC1642 + Unicode11UTF7 MIB = 103 + + // ISO2022CN is the MIB identifier with IANA name ISO-2022-CN. + // + // rfc1922 + // Reference: RFC1922 + ISO2022CN MIB = 104 + + // ISO2022CNEXT is the MIB identifier with IANA name ISO-2022-CN-EXT. + // + // rfc1922 + // Reference: RFC1922 + ISO2022CNEXT MIB = 105 + + // UTF8 is the MIB identifier with IANA name UTF-8. + // + // rfc3629 + // Reference: RFC3629 + UTF8 MIB = 106 + + // ISO885913 is the MIB identifier with IANA name ISO-8859-13. + // + // ISO See https://www.iana.org/assignments/charset-reg/ISO-8859-13 https://www.iana.org/assignments/charset-reg/ISO-8859-13 + ISO885913 MIB = 109 + + // ISO885914 is the MIB identifier with IANA name ISO-8859-14. + // + // ISO See https://www.iana.org/assignments/charset-reg/ISO-8859-14 + ISO885914 MIB = 110 + + // ISO885915 is the MIB identifier with IANA name ISO-8859-15. + // + // ISO + // Please see: https://www.iana.org/assignments/charset-reg/ISO-8859-15 + ISO885915 MIB = 111 + + // ISO885916 is the MIB identifier with IANA name ISO-8859-16. + // + // ISO + ISO885916 MIB = 112 + + // GBK is the MIB identifier with IANA name GBK. + // + // Chinese IT Standardization Technical Committee + // Please see: https://www.iana.org/assignments/charset-reg/GBK + GBK MIB = 113 + + // GB18030 is the MIB identifier with IANA name GB18030. + // + // Chinese IT Standardization Technical Committee + // Please see: https://www.iana.org/assignments/charset-reg/GB18030 + GB18030 MIB = 114 + + // OSDEBCDICDF0415 is the MIB identifier with IANA name OSD_EBCDIC_DF04_15. + // + // Fujitsu-Siemens standard mainframe EBCDIC encoding + // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-15 + OSDEBCDICDF0415 MIB = 115 + + // OSDEBCDICDF03IRV is the MIB identifier with IANA name OSD_EBCDIC_DF03_IRV. + // + // Fujitsu-Siemens standard mainframe EBCDIC encoding + // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF03-IRV + OSDEBCDICDF03IRV MIB = 116 + + // OSDEBCDICDF041 is the MIB identifier with IANA name OSD_EBCDIC_DF04_1. + // + // Fujitsu-Siemens standard mainframe EBCDIC encoding + // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-1 + OSDEBCDICDF041 MIB = 117 + + // ISO115481 is the MIB identifier with IANA name ISO-11548-1. + // + // See https://www.iana.org/assignments/charset-reg/ISO-11548-1 + ISO115481 MIB = 118 + + // KZ1048 is the MIB identifier with IANA name KZ-1048. + // + // See https://www.iana.org/assignments/charset-reg/KZ-1048 + KZ1048 MIB = 119 + + // Unicode is the MIB identifier with IANA name ISO-10646-UCS-2. + // + // the 2-octet Basic Multilingual Plane, aka Unicode + // this needs to specify network byte order: the standard + // does not specify (it is a 16-bit integer space) + Unicode MIB = 1000 + + // UCS4 is the MIB identifier with IANA name ISO-10646-UCS-4. + // + // the full code space. (same comment about byte order, + // these are 31-bit numbers. + UCS4 MIB = 1001 + + // UnicodeASCII is the MIB identifier with IANA name ISO-10646-UCS-Basic. + // + // ASCII subset of Unicode. Basic Latin = collection 1 + // See ISO 10646, Appendix A + UnicodeASCII MIB = 1002 + + // UnicodeLatin1 is the MIB identifier with IANA name ISO-10646-Unicode-Latin1. + // + // ISO Latin-1 subset of Unicode. Basic Latin and Latin-1 + // Supplement = collections 1 and 2. See ISO 10646, + // Appendix A. See rfc1815 . + UnicodeLatin1 MIB = 1003 + + // UnicodeJapanese is the MIB identifier with IANA name ISO-10646-J-1. + // + // ISO 10646 Japanese, see rfc1815 . + UnicodeJapanese MIB = 1004 + + // UnicodeIBM1261 is the MIB identifier with IANA name ISO-Unicode-IBM-1261. + // + // IBM Latin-2, -3, -5, Extended Presentation Set, GCSGID: 1261 + UnicodeIBM1261 MIB = 1005 + + // UnicodeIBM1268 is the MIB identifier with IANA name ISO-Unicode-IBM-1268. + // + // IBM Latin-4 Extended Presentation Set, GCSGID: 1268 + UnicodeIBM1268 MIB = 1006 + + // UnicodeIBM1276 is the MIB identifier with IANA name ISO-Unicode-IBM-1276. + // + // IBM Cyrillic Greek Extended Presentation Set, GCSGID: 1276 + UnicodeIBM1276 MIB = 1007 + + // UnicodeIBM1264 is the MIB identifier with IANA name ISO-Unicode-IBM-1264. + // + // IBM Arabic Presentation Set, GCSGID: 1264 + UnicodeIBM1264 MIB = 1008 + + // UnicodeIBM1265 is the MIB identifier with IANA name ISO-Unicode-IBM-1265. + // + // IBM Hebrew Presentation Set, GCSGID: 1265 + UnicodeIBM1265 MIB = 1009 + + // Unicode11 is the MIB identifier with IANA name UNICODE-1-1. + // + // rfc1641 + // Reference: RFC1641 + Unicode11 MIB = 1010 + + // SCSU is the MIB identifier with IANA name SCSU. + // + // SCSU See https://www.iana.org/assignments/charset-reg/SCSU + SCSU MIB = 1011 + + // UTF7 is the MIB identifier with IANA name UTF-7. + // + // rfc2152 + // Reference: RFC2152 + UTF7 MIB = 1012 + + // UTF16BE is the MIB identifier with IANA name UTF-16BE. + // + // rfc2781 + // Reference: RFC2781 + UTF16BE MIB = 1013 + + // UTF16LE is the MIB identifier with IANA name UTF-16LE. + // + // rfc2781 + // Reference: RFC2781 + UTF16LE MIB = 1014 + + // UTF16 is the MIB identifier with IANA name UTF-16. + // + // rfc2781 + // Reference: RFC2781 + UTF16 MIB = 1015 + + // CESU8 is the MIB identifier with IANA name CESU-8. + // + // https://www.unicode.org/reports/tr26 + CESU8 MIB = 1016 + + // UTF32 is the MIB identifier with IANA name UTF-32. + // + // https://www.unicode.org/reports/tr19/ + UTF32 MIB = 1017 + + // UTF32BE is the MIB identifier with IANA name UTF-32BE. + // + // https://www.unicode.org/reports/tr19/ + UTF32BE MIB = 1018 + + // UTF32LE is the MIB identifier with IANA name UTF-32LE. + // + // https://www.unicode.org/reports/tr19/ + UTF32LE MIB = 1019 + + // BOCU1 is the MIB identifier with IANA name BOCU-1. + // + // https://www.unicode.org/notes/tn6/ + BOCU1 MIB = 1020 + + // UTF7IMAP is the MIB identifier with IANA name UTF-7-IMAP. + // + // Note: This charset is used to encode Unicode in IMAP mailbox names; + // see section 5.1.3 of rfc3501 . It should never be used + // outside this context. A name has been assigned so that charset processing + // implementations can refer to it in a consistent way. + UTF7IMAP MIB = 1021 + + // Windows30Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.0-Latin-1. + // + // Extended ISO 8859-1 Latin-1 for Windows 3.0. + // PCL Symbol Set id: 9U + Windows30Latin1 MIB = 2000 + + // Windows31Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.1-Latin-1. + // + // Extended ISO 8859-1 Latin-1 for Windows 3.1. + // PCL Symbol Set id: 19U + Windows31Latin1 MIB = 2001 + + // Windows31Latin2 is the MIB identifier with IANA name ISO-8859-2-Windows-Latin-2. + // + // Extended ISO 8859-2. Latin-2 for Windows 3.1. + // PCL Symbol Set id: 9E + Windows31Latin2 MIB = 2002 + + // Windows31Latin5 is the MIB identifier with IANA name ISO-8859-9-Windows-Latin-5. + // + // Extended ISO 8859-9. Latin-5 for Windows 3.1 + // PCL Symbol Set id: 5T + Windows31Latin5 MIB = 2003 + + // HPRoman8 is the MIB identifier with IANA name hp-roman8. + // + // LaserJet IIP Printer User's Manual, + // HP part no 33471-90901, Hewlet-Packard, June 1989. + // Reference: RFC1345 + HPRoman8 MIB = 2004 + + // AdobeStandardEncoding is the MIB identifier with IANA name Adobe-Standard-Encoding. + // + // PostScript Language Reference Manual + // PCL Symbol Set id: 10J + AdobeStandardEncoding MIB = 2005 + + // VenturaUS is the MIB identifier with IANA name Ventura-US. + // + // Ventura US. ASCII plus characters typically used in + // publishing, like pilcrow, copyright, registered, trade mark, + // section, dagger, and double dagger in the range A0 (hex) + // to FF (hex). + // PCL Symbol Set id: 14J + VenturaUS MIB = 2006 + + // VenturaInternational is the MIB identifier with IANA name Ventura-International. + // + // Ventura International. ASCII plus coded characters similar + // to Roman8. + // PCL Symbol Set id: 13J + VenturaInternational MIB = 2007 + + // DECMCS is the MIB identifier with IANA name DEC-MCS. + // + // VAX/VMS User's Manual, + // Order Number: AI-Y517A-TE, April 1986. + // Reference: RFC1345 + DECMCS MIB = 2008 + + // PC850Multilingual is the MIB identifier with IANA name IBM850. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PC850Multilingual MIB = 2009 + + // PC8DanishNorwegian is the MIB identifier with IANA name PC8-Danish-Norwegian. + // + // PC Danish Norwegian + // 8-bit PC set for Danish Norwegian + // PCL Symbol Set id: 11U + PC8DanishNorwegian MIB = 2012 + + // PC862LatinHebrew is the MIB identifier with IANA name IBM862. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PC862LatinHebrew MIB = 2013 + + // PC8Turkish is the MIB identifier with IANA name PC8-Turkish. + // + // PC Latin Turkish. PCL Symbol Set id: 9T + PC8Turkish MIB = 2014 + + // IBMSymbols is the MIB identifier with IANA name IBM-Symbols. + // + // Presentation Set, CPGID: 259 + IBMSymbols MIB = 2015 + + // IBMThai is the MIB identifier with IANA name IBM-Thai. + // + // Presentation Set, CPGID: 838 + IBMThai MIB = 2016 + + // HPLegal is the MIB identifier with IANA name HP-Legal. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 1U + HPLegal MIB = 2017 + + // HPPiFont is the MIB identifier with IANA name HP-Pi-font. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 15U + HPPiFont MIB = 2018 + + // HPMath8 is the MIB identifier with IANA name HP-Math8. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 8M + HPMath8 MIB = 2019 + + // HPPSMath is the MIB identifier with IANA name Adobe-Symbol-Encoding. + // + // PostScript Language Reference Manual + // PCL Symbol Set id: 5M + HPPSMath MIB = 2020 + + // HPDesktop is the MIB identifier with IANA name HP-DeskTop. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 7J + HPDesktop MIB = 2021 + + // VenturaMath is the MIB identifier with IANA name Ventura-Math. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 6M + VenturaMath MIB = 2022 + + // MicrosoftPublishing is the MIB identifier with IANA name Microsoft-Publishing. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 6J + MicrosoftPublishing MIB = 2023 + + // Windows31J is the MIB identifier with IANA name Windows-31J. + // + // Windows Japanese. A further extension of Shift_JIS + // to include NEC special characters (Row 13), NEC + // selection of IBM extensions (Rows 89 to 92), and IBM + // extensions (Rows 115 to 119). The CCS's are + // JIS X0201:1997, JIS X0208:1997, and these extensions. + // This charset can be used for the top-level media type "text", + // but it is of limited or specialized use (see rfc2278 ). + // PCL Symbol Set id: 19K + Windows31J MIB = 2024 + + // GB2312 is the MIB identifier with IANA name GB2312 (MIME: GB2312). + // + // Chinese for People's Republic of China (PRC) mixed one byte, + // two byte set: + // 20-7E = one byte ASCII + // A1-FE = two byte PRC Kanji + // See GB 2312-80 + // PCL Symbol Set Id: 18C + GB2312 MIB = 2025 + + // Big5 is the MIB identifier with IANA name Big5 (MIME: Big5). + // + // Chinese for Taiwan Multi-byte set. + // PCL Symbol Set Id: 18T + Big5 MIB = 2026 + + // Macintosh is the MIB identifier with IANA name macintosh. + // + // The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991 + // Reference: RFC1345 + Macintosh MIB = 2027 + + // IBM037 is the MIB identifier with IANA name IBM037. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM037 MIB = 2028 + + // IBM038 is the MIB identifier with IANA name IBM038. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM038 MIB = 2029 + + // IBM273 is the MIB identifier with IANA name IBM273. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM273 MIB = 2030 + + // IBM274 is the MIB identifier with IANA name IBM274. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM274 MIB = 2031 + + // IBM275 is the MIB identifier with IANA name IBM275. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM275 MIB = 2032 + + // IBM277 is the MIB identifier with IANA name IBM277. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM277 MIB = 2033 + + // IBM278 is the MIB identifier with IANA name IBM278. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM278 MIB = 2034 + + // IBM280 is the MIB identifier with IANA name IBM280. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM280 MIB = 2035 + + // IBM281 is the MIB identifier with IANA name IBM281. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM281 MIB = 2036 + + // IBM284 is the MIB identifier with IANA name IBM284. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM284 MIB = 2037 + + // IBM285 is the MIB identifier with IANA name IBM285. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM285 MIB = 2038 + + // IBM290 is the MIB identifier with IANA name IBM290. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM290 MIB = 2039 + + // IBM297 is the MIB identifier with IANA name IBM297. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM297 MIB = 2040 + + // IBM420 is the MIB identifier with IANA name IBM420. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990, + // IBM NLS RM p 11-11 + // Reference: RFC1345 + IBM420 MIB = 2041 + + // IBM423 is the MIB identifier with IANA name IBM423. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM423 MIB = 2042 + + // IBM424 is the MIB identifier with IANA name IBM424. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM424 MIB = 2043 + + // PC8CodePage437 is the MIB identifier with IANA name IBM437. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PC8CodePage437 MIB = 2011 + + // IBM500 is the MIB identifier with IANA name IBM500. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM500 MIB = 2044 + + // IBM851 is the MIB identifier with IANA name IBM851. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM851 MIB = 2045 + + // PCp852 is the MIB identifier with IANA name IBM852. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PCp852 MIB = 2010 + + // IBM855 is the MIB identifier with IANA name IBM855. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM855 MIB = 2046 + + // IBM857 is the MIB identifier with IANA name IBM857. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM857 MIB = 2047 + + // IBM860 is the MIB identifier with IANA name IBM860. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM860 MIB = 2048 + + // IBM861 is the MIB identifier with IANA name IBM861. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM861 MIB = 2049 + + // IBM863 is the MIB identifier with IANA name IBM863. + // + // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 + // Reference: RFC1345 + IBM863 MIB = 2050 + + // IBM864 is the MIB identifier with IANA name IBM864. + // + // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 + // Reference: RFC1345 + IBM864 MIB = 2051 + + // IBM865 is the MIB identifier with IANA name IBM865. + // + // IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987) + // Reference: RFC1345 + IBM865 MIB = 2052 + + // IBM868 is the MIB identifier with IANA name IBM868. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM868 MIB = 2053 + + // IBM869 is the MIB identifier with IANA name IBM869. + // + // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 + // Reference: RFC1345 + IBM869 MIB = 2054 + + // IBM870 is the MIB identifier with IANA name IBM870. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM870 MIB = 2055 + + // IBM871 is the MIB identifier with IANA name IBM871. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM871 MIB = 2056 + + // IBM880 is the MIB identifier with IANA name IBM880. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM880 MIB = 2057 + + // IBM891 is the MIB identifier with IANA name IBM891. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM891 MIB = 2058 + + // IBM903 is the MIB identifier with IANA name IBM903. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM903 MIB = 2059 + + // IBBM904 is the MIB identifier with IANA name IBM904. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBBM904 MIB = 2060 + + // IBM905 is the MIB identifier with IANA name IBM905. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM905 MIB = 2061 + + // IBM918 is the MIB identifier with IANA name IBM918. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM918 MIB = 2062 + + // IBM1026 is the MIB identifier with IANA name IBM1026. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM1026 MIB = 2063 + + // IBMEBCDICATDE is the MIB identifier with IANA name EBCDIC-AT-DE. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + IBMEBCDICATDE MIB = 2064 + + // EBCDICATDEA is the MIB identifier with IANA name EBCDIC-AT-DE-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICATDEA MIB = 2065 + + // EBCDICCAFR is the MIB identifier with IANA name EBCDIC-CA-FR. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICCAFR MIB = 2066 + + // EBCDICDKNO is the MIB identifier with IANA name EBCDIC-DK-NO. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICDKNO MIB = 2067 + + // EBCDICDKNOA is the MIB identifier with IANA name EBCDIC-DK-NO-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICDKNOA MIB = 2068 + + // EBCDICFISE is the MIB identifier with IANA name EBCDIC-FI-SE. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICFISE MIB = 2069 + + // EBCDICFISEA is the MIB identifier with IANA name EBCDIC-FI-SE-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICFISEA MIB = 2070 + + // EBCDICFR is the MIB identifier with IANA name EBCDIC-FR. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICFR MIB = 2071 + + // EBCDICIT is the MIB identifier with IANA name EBCDIC-IT. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICIT MIB = 2072 + + // EBCDICPT is the MIB identifier with IANA name EBCDIC-PT. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICPT MIB = 2073 + + // EBCDICES is the MIB identifier with IANA name EBCDIC-ES. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICES MIB = 2074 + + // EBCDICESA is the MIB identifier with IANA name EBCDIC-ES-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICESA MIB = 2075 + + // EBCDICESS is the MIB identifier with IANA name EBCDIC-ES-S. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICESS MIB = 2076 + + // EBCDICUK is the MIB identifier with IANA name EBCDIC-UK. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICUK MIB = 2077 + + // EBCDICUS is the MIB identifier with IANA name EBCDIC-US. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICUS MIB = 2078 + + // Unknown8BiT is the MIB identifier with IANA name UNKNOWN-8BIT. + // + // Reference: RFC1428 + Unknown8BiT MIB = 2079 + + // Mnemonic is the MIB identifier with IANA name MNEMONIC. + // + // rfc1345 , also known as "mnemonic+ascii+38" + // Reference: RFC1345 + Mnemonic MIB = 2080 + + // Mnem is the MIB identifier with IANA name MNEM. + // + // rfc1345 , also known as "mnemonic+ascii+8200" + // Reference: RFC1345 + Mnem MIB = 2081 + + // VISCII is the MIB identifier with IANA name VISCII. + // + // rfc1456 + // Reference: RFC1456 + VISCII MIB = 2082 + + // VIQR is the MIB identifier with IANA name VIQR. + // + // rfc1456 + // Reference: RFC1456 + VIQR MIB = 2083 + + // KOI8R is the MIB identifier with IANA name KOI8-R (MIME: KOI8-R). + // + // rfc1489 , based on GOST-19768-74, ISO-6937/8, + // INIS-Cyrillic, ISO-5427. + // Reference: RFC1489 + KOI8R MIB = 2084 + + // HZGB2312 is the MIB identifier with IANA name HZ-GB-2312. + // + // rfc1842 , rfc1843 rfc1843 rfc1842 + HZGB2312 MIB = 2085 + + // IBM866 is the MIB identifier with IANA name IBM866. + // + // IBM NLDG Volume 2 (SE09-8002-03) August 1994 + IBM866 MIB = 2086 + + // PC775Baltic is the MIB identifier with IANA name IBM775. + // + // HP PCL 5 Comparison Guide (P/N 5021-0329) pp B-13, 1996 + PC775Baltic MIB = 2087 + + // KOI8U is the MIB identifier with IANA name KOI8-U. + // + // rfc2319 + // Reference: RFC2319 + KOI8U MIB = 2088 + + // IBM00858 is the MIB identifier with IANA name IBM00858. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM00858 + IBM00858 MIB = 2089 + + // IBM00924 is the MIB identifier with IANA name IBM00924. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM00924 + IBM00924 MIB = 2090 + + // IBM01140 is the MIB identifier with IANA name IBM01140. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01140 + IBM01140 MIB = 2091 + + // IBM01141 is the MIB identifier with IANA name IBM01141. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01141 + IBM01141 MIB = 2092 + + // IBM01142 is the MIB identifier with IANA name IBM01142. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01142 + IBM01142 MIB = 2093 + + // IBM01143 is the MIB identifier with IANA name IBM01143. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01143 + IBM01143 MIB = 2094 + + // IBM01144 is the MIB identifier with IANA name IBM01144. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01144 + IBM01144 MIB = 2095 + + // IBM01145 is the MIB identifier with IANA name IBM01145. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01145 + IBM01145 MIB = 2096 + + // IBM01146 is the MIB identifier with IANA name IBM01146. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01146 + IBM01146 MIB = 2097 + + // IBM01147 is the MIB identifier with IANA name IBM01147. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01147 + IBM01147 MIB = 2098 + + // IBM01148 is the MIB identifier with IANA name IBM01148. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01148 + IBM01148 MIB = 2099 + + // IBM01149 is the MIB identifier with IANA name IBM01149. + // + // IBM See https://www.iana.org/assignments/charset-reg/IBM01149 + IBM01149 MIB = 2100 + + // Big5HKSCS is the MIB identifier with IANA name Big5-HKSCS. + // + // See https://www.iana.org/assignments/charset-reg/Big5-HKSCS + Big5HKSCS MIB = 2101 + + // IBM1047 is the MIB identifier with IANA name IBM1047. + // + // IBM1047 (EBCDIC Latin 1/Open Systems) https://www-1.ibm.com/servers/eserver/iseries/software/globalization/pdf/cp01047z.pdf + IBM1047 MIB = 2102 + + // PTCP154 is the MIB identifier with IANA name PTCP154. + // + // See https://www.iana.org/assignments/charset-reg/PTCP154 + PTCP154 MIB = 2103 + + // Amiga1251 is the MIB identifier with IANA name Amiga-1251. + // + // See https://www.amiga.ultranet.ru/Amiga-1251.html + Amiga1251 MIB = 2104 + + // KOI7switched is the MIB identifier with IANA name KOI7-switched. + // + // See https://www.iana.org/assignments/charset-reg/KOI7-switched + KOI7switched MIB = 2105 + + // BRF is the MIB identifier with IANA name BRF. + // + // See https://www.iana.org/assignments/charset-reg/BRF + BRF MIB = 2106 + + // TSCII is the MIB identifier with IANA name TSCII. + // + // See https://www.iana.org/assignments/charset-reg/TSCII + TSCII MIB = 2107 + + // CP51932 is the MIB identifier with IANA name CP51932. + // + // See https://www.iana.org/assignments/charset-reg/CP51932 + CP51932 MIB = 2108 + + // Windows874 is the MIB identifier with IANA name windows-874. + // + // See https://www.iana.org/assignments/charset-reg/windows-874 + Windows874 MIB = 2109 + + // Windows1250 is the MIB identifier with IANA name windows-1250. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1250 + Windows1250 MIB = 2250 + + // Windows1251 is the MIB identifier with IANA name windows-1251. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1251 + Windows1251 MIB = 2251 + + // Windows1252 is the MIB identifier with IANA name windows-1252. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1252 + Windows1252 MIB = 2252 + + // Windows1253 is the MIB identifier with IANA name windows-1253. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1253 + Windows1253 MIB = 2253 + + // Windows1254 is the MIB identifier with IANA name windows-1254. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1254 + Windows1254 MIB = 2254 + + // Windows1255 is the MIB identifier with IANA name windows-1255. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1255 + Windows1255 MIB = 2255 + + // Windows1256 is the MIB identifier with IANA name windows-1256. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1256 + Windows1256 MIB = 2256 + + // Windows1257 is the MIB identifier with IANA name windows-1257. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1257 + Windows1257 MIB = 2257 + + // Windows1258 is the MIB identifier with IANA name windows-1258. + // + // Microsoft https://www.iana.org/assignments/charset-reg/windows-1258 + Windows1258 MIB = 2258 + + // TIS620 is the MIB identifier with IANA name TIS-620. + // + // Thai Industrial Standards Institute (TISI) + TIS620 MIB = 2259 + + // CP50220 is the MIB identifier with IANA name CP50220. + // + // See https://www.iana.org/assignments/charset-reg/CP50220 + CP50220 MIB = 2260 +) diff --git a/vendor/golang.org/x/text/encoding/internal/internal.go b/vendor/golang.org/x/text/encoding/internal/internal.go new file mode 100644 index 0000000000..413e6fc6d7 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/internal/internal.go @@ -0,0 +1,75 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package internal contains code that is shared among encoding implementations. +package internal + +import ( + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// Encoding is an implementation of the Encoding interface that adds the String +// and ID methods to an existing encoding. +type Encoding struct { + encoding.Encoding + Name string + MIB identifier.MIB +} + +// _ verifies that Encoding implements identifier.Interface. +var _ identifier.Interface = (*Encoding)(nil) + +func (e *Encoding) String() string { + return e.Name +} + +func (e *Encoding) ID() (mib identifier.MIB, other string) { + return e.MIB, "" +} + +// SimpleEncoding is an Encoding that combines two Transformers. +type SimpleEncoding struct { + Decoder transform.Transformer + Encoder transform.Transformer +} + +func (e *SimpleEncoding) NewDecoder() *encoding.Decoder { + return &encoding.Decoder{Transformer: e.Decoder} +} + +func (e *SimpleEncoding) NewEncoder() *encoding.Encoder { + return &encoding.Encoder{Transformer: e.Encoder} +} + +// FuncEncoding is an Encoding that combines two functions returning a new +// Transformer. +type FuncEncoding struct { + Decoder func() transform.Transformer + Encoder func() transform.Transformer +} + +func (e FuncEncoding) NewDecoder() *encoding.Decoder { + return &encoding.Decoder{Transformer: e.Decoder()} +} + +func (e FuncEncoding) NewEncoder() *encoding.Encoder { + return &encoding.Encoder{Transformer: e.Encoder()} +} + +// A RepertoireError indicates a rune is not in the repertoire of a destination +// encoding. It is associated with an encoding-specific suggested replacement +// byte. +type RepertoireError byte + +// Error implements the error interface. +func (r RepertoireError) Error() string { + return "encoding: rune not supported by encoding." +} + +// Replacement returns the replacement string associated with this error. +func (r RepertoireError) Replacement() byte { return byte(r) } + +var ErrASCIIReplacement = RepertoireError(encoding.ASCIISub) diff --git a/vendor/golang.org/x/text/encoding/unicode/override.go b/vendor/golang.org/x/text/encoding/unicode/override.go new file mode 100644 index 0000000000..35d62fcc99 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/unicode/override.go @@ -0,0 +1,82 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unicode + +import ( + "golang.org/x/text/transform" +) + +// BOMOverride returns a new decoder transformer that is identical to fallback, +// except that the presence of a Byte Order Mark at the start of the input +// causes it to switch to the corresponding Unicode decoding. It will only +// consider BOMs for UTF-8, UTF-16BE, and UTF-16LE. +// +// This differs from using ExpectBOM by allowing a BOM to switch to UTF-8, not +// just UTF-16 variants, and allowing falling back to any encoding scheme. +// +// This technique is recommended by the W3C for use in HTML 5: "For +// compatibility with deployed content, the byte order mark (also known as BOM) +// is considered more authoritative than anything else." +// http://www.w3.org/TR/encoding/#specification-hooks +// +// Using BOMOverride is mostly intended for use cases where the first characters +// of a fallback encoding are known to not be a BOM, for example, for valid HTML +// and most encodings. +func BOMOverride(fallback transform.Transformer) transform.Transformer { + // TODO: possibly allow a variadic argument of unicode encodings to allow + // specifying details of which fallbacks are supported as well as + // specifying the details of the implementations. This would also allow for + // support for UTF-32, which should not be supported by default. + return &bomOverride{fallback: fallback} +} + +type bomOverride struct { + fallback transform.Transformer + current transform.Transformer +} + +func (d *bomOverride) Reset() { + d.current = nil + d.fallback.Reset() +} + +var ( + // TODO: we could use decode functions here, instead of allocating a new + // decoder on every NewDecoder as IgnoreBOM decoders can be stateless. + utf16le = UTF16(LittleEndian, IgnoreBOM) + utf16be = UTF16(BigEndian, IgnoreBOM) +) + +const utf8BOM = "\ufeff" + +func (d *bomOverride) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if d.current != nil { + return d.current.Transform(dst, src, atEOF) + } + if len(src) < 3 && !atEOF { + return 0, 0, transform.ErrShortSrc + } + d.current = d.fallback + bomSize := 0 + if len(src) >= 2 { + if src[0] == 0xFF && src[1] == 0xFE { + d.current = utf16le.NewDecoder() + bomSize = 2 + } else if src[0] == 0xFE && src[1] == 0xFF { + d.current = utf16be.NewDecoder() + bomSize = 2 + } else if len(src) >= 3 && + src[0] == utf8BOM[0] && + src[1] == utf8BOM[1] && + src[2] == utf8BOM[2] { + d.current = transform.Nop + bomSize = 3 + } + } + if bomSize < len(src) { + nDst, nSrc, err = d.current.Transform(dst, src[bomSize:], atEOF) + } + return nDst, nSrc + bomSize, err +} diff --git a/vendor/golang.org/x/text/encoding/unicode/unicode.go b/vendor/golang.org/x/text/encoding/unicode/unicode.go new file mode 100644 index 0000000000..dd99ad14d3 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/unicode/unicode.go @@ -0,0 +1,512 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package unicode provides Unicode encodings such as UTF-16. +package unicode // import "golang.org/x/text/encoding/unicode" + +import ( + "bytes" + "errors" + "unicode/utf16" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/internal/utf8internal" + "golang.org/x/text/runes" + "golang.org/x/text/transform" +) + +// TODO: I think the Transformers really should return errors on unmatched +// surrogate pairs and odd numbers of bytes. This is not required by RFC 2781, +// which leaves it open, but is suggested by WhatWG. It will allow for all error +// modes as defined by WhatWG: fatal, HTML and Replacement. This would require +// the introduction of some kind of error type for conveying the erroneous code +// point. + +// UTF8 is the UTF-8 encoding. It neither removes nor adds byte order marks. +var UTF8 encoding.Encoding = utf8enc + +// UTF8BOM is an UTF-8 encoding where the decoder strips a leading byte order +// mark while the encoder adds one. +// +// Some editors add a byte order mark as a signature to UTF-8 files. Although +// the byte order mark is not useful for detecting byte order in UTF-8, it is +// sometimes used as a convention to mark UTF-8-encoded files. This relies on +// the observation that the UTF-8 byte order mark is either an illegal or at +// least very unlikely sequence in any other character encoding. +var UTF8BOM encoding.Encoding = utf8bomEncoding{} + +type utf8bomEncoding struct{} + +func (utf8bomEncoding) String() string { + return "UTF-8-BOM" +} + +func (utf8bomEncoding) ID() (identifier.MIB, string) { + return identifier.Unofficial, "x-utf8bom" +} + +func (utf8bomEncoding) NewEncoder() *encoding.Encoder { + return &encoding.Encoder{ + Transformer: &utf8bomEncoder{t: runes.ReplaceIllFormed()}, + } +} + +func (utf8bomEncoding) NewDecoder() *encoding.Decoder { + return &encoding.Decoder{Transformer: &utf8bomDecoder{}} +} + +var utf8enc = &internal.Encoding{ + &internal.SimpleEncoding{utf8Decoder{}, runes.ReplaceIllFormed()}, + "UTF-8", + identifier.UTF8, +} + +type utf8bomDecoder struct { + checked bool +} + +func (t *utf8bomDecoder) Reset() { + t.checked = false +} + +func (t *utf8bomDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if !t.checked { + if !atEOF && len(src) < len(utf8BOM) { + if len(src) == 0 { + return 0, 0, nil + } + return 0, 0, transform.ErrShortSrc + } + if bytes.HasPrefix(src, []byte(utf8BOM)) { + nSrc += len(utf8BOM) + src = src[len(utf8BOM):] + } + t.checked = true + } + nDst, n, err := utf8Decoder.Transform(utf8Decoder{}, dst[nDst:], src, atEOF) + nSrc += n + return nDst, nSrc, err +} + +type utf8bomEncoder struct { + written bool + t transform.Transformer +} + +func (t *utf8bomEncoder) Reset() { + t.written = false + t.t.Reset() +} + +func (t *utf8bomEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if !t.written { + if len(dst) < len(utf8BOM) { + return nDst, 0, transform.ErrShortDst + } + nDst = copy(dst, utf8BOM) + t.written = true + } + n, nSrc, err := utf8Decoder.Transform(utf8Decoder{}, dst[nDst:], src, atEOF) + nDst += n + return nDst, nSrc, err +} + +type utf8Decoder struct{ transform.NopResetter } + +func (utf8Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + var pSrc int // point from which to start copy in src + var accept utf8internal.AcceptRange + + // The decoder can only make the input larger, not smaller. + n := len(src) + if len(dst) < n { + err = transform.ErrShortDst + n = len(dst) + atEOF = false + } + for nSrc < n { + c := src[nSrc] + if c < utf8.RuneSelf { + nSrc++ + continue + } + first := utf8internal.First[c] + size := int(first & utf8internal.SizeMask) + if first == utf8internal.FirstInvalid { + goto handleInvalid // invalid starter byte + } + accept = utf8internal.AcceptRanges[first>>utf8internal.AcceptShift] + if nSrc+size > n { + if !atEOF { + // We may stop earlier than necessary here if the short sequence + // has invalid bytes. Not checking for this simplifies the code + // and may avoid duplicate computations in certain conditions. + if err == nil { + err = transform.ErrShortSrc + } + break + } + // Determine the maximal subpart of an ill-formed subsequence. + switch { + case nSrc+1 >= n || src[nSrc+1] < accept.Lo || accept.Hi < src[nSrc+1]: + size = 1 + case nSrc+2 >= n || src[nSrc+2] < utf8internal.LoCB || utf8internal.HiCB < src[nSrc+2]: + size = 2 + default: + size = 3 // As we are short, the maximum is 3. + } + goto handleInvalid + } + if c = src[nSrc+1]; c < accept.Lo || accept.Hi < c { + size = 1 + goto handleInvalid // invalid continuation byte + } else if size == 2 { + } else if c = src[nSrc+2]; c < utf8internal.LoCB || utf8internal.HiCB < c { + size = 2 + goto handleInvalid // invalid continuation byte + } else if size == 3 { + } else if c = src[nSrc+3]; c < utf8internal.LoCB || utf8internal.HiCB < c { + size = 3 + goto handleInvalid // invalid continuation byte + } + nSrc += size + continue + + handleInvalid: + // Copy the scanned input so far. + nDst += copy(dst[nDst:], src[pSrc:nSrc]) + + // Append RuneError to the destination. + const runeError = "\ufffd" + if nDst+len(runeError) > len(dst) { + return nDst, nSrc, transform.ErrShortDst + } + nDst += copy(dst[nDst:], runeError) + + // Skip the maximal subpart of an ill-formed subsequence according to + // the W3C standard way instead of the Go way. This Transform is + // probably the only place in the text repo where it is warranted. + nSrc += size + pSrc = nSrc + + // Recompute the maximum source length. + if sz := len(dst) - nDst; sz < len(src)-nSrc { + err = transform.ErrShortDst + n = nSrc + sz + atEOF = false + } + } + return nDst + copy(dst[nDst:], src[pSrc:nSrc]), nSrc, err +} + +// UTF16 returns a UTF-16 Encoding for the given default endianness and byte +// order mark (BOM) policy. +// +// When decoding from UTF-16 to UTF-8, if the BOMPolicy is IgnoreBOM then +// neither BOMs U+FEFF nor noncharacters U+FFFE in the input stream will affect +// the endianness used for decoding, and will instead be output as their +// standard UTF-8 encodings: "\xef\xbb\xbf" and "\xef\xbf\xbe". If the BOMPolicy +// is UseBOM or ExpectBOM a staring BOM is not written to the UTF-8 output. +// Instead, it overrides the default endianness e for the remainder of the +// transformation. Any subsequent BOMs U+FEFF or noncharacters U+FFFE will not +// affect the endianness used, and will instead be output as their standard +// UTF-8 encodings. For UseBOM, if there is no starting BOM, it will proceed +// with the default Endianness. For ExpectBOM, in that case, the transformation +// will return early with an ErrMissingBOM error. +// +// When encoding from UTF-8 to UTF-16, a BOM will be inserted at the start of +// the output if the BOMPolicy is UseBOM or ExpectBOM. Otherwise, a BOM will not +// be inserted. The UTF-8 input does not need to contain a BOM. +// +// There is no concept of a 'native' endianness. If the UTF-16 data is produced +// and consumed in a greater context that implies a certain endianness, use +// IgnoreBOM. Otherwise, use ExpectBOM and always produce and consume a BOM. +// +// In the language of https://www.unicode.org/faq/utf_bom.html#bom10, IgnoreBOM +// corresponds to "Where the precise type of the data stream is known... the +// BOM should not be used" and ExpectBOM corresponds to "A particular +// protocol... may require use of the BOM". +func UTF16(e Endianness, b BOMPolicy) encoding.Encoding { + return utf16Encoding{config{e, b}, mibValue[e][b&bomMask]} +} + +// mibValue maps Endianness and BOMPolicy settings to MIB constants. Note that +// some configurations map to the same MIB identifier. RFC 2781 has requirements +// and recommendations. Some of the "configurations" are merely recommendations, +// so multiple configurations could match. +var mibValue = map[Endianness][numBOMValues]identifier.MIB{ + BigEndian: [numBOMValues]identifier.MIB{ + IgnoreBOM: identifier.UTF16BE, + UseBOM: identifier.UTF16, // BigEnding default is preferred by RFC 2781. + // TODO: acceptBOM | strictBOM would map to UTF16BE as well. + }, + LittleEndian: [numBOMValues]identifier.MIB{ + IgnoreBOM: identifier.UTF16LE, + UseBOM: identifier.UTF16, // LittleEndian default is allowed and preferred on Windows. + // TODO: acceptBOM | strictBOM would map to UTF16LE as well. + }, + // ExpectBOM is not widely used and has no valid MIB identifier. +} + +// All lists a configuration for each IANA-defined UTF-16 variant. +var All = []encoding.Encoding{ + UTF8, + UTF16(BigEndian, UseBOM), + UTF16(BigEndian, IgnoreBOM), + UTF16(LittleEndian, IgnoreBOM), +} + +// BOMPolicy is a UTF-16 encoding's byte order mark policy. +type BOMPolicy uint8 + +const ( + writeBOM BOMPolicy = 0x01 + acceptBOM BOMPolicy = 0x02 + requireBOM BOMPolicy = 0x04 + bomMask BOMPolicy = 0x07 + + // HACK: numBOMValues == 8 triggers a bug in the 1.4 compiler (cannot have a + // map of an array of length 8 of a type that is also used as a key or value + // in another map). See golang.org/issue/11354. + // TODO: consider changing this value back to 8 if the use of 1.4.* has + // been minimized. + numBOMValues = 8 + 1 + + // IgnoreBOM means to ignore any byte order marks. + IgnoreBOM BOMPolicy = 0 + // Common and RFC 2781-compliant interpretation for UTF-16BE/LE. + + // UseBOM means that the UTF-16 form may start with a byte order mark, which + // will be used to override the default encoding. + UseBOM BOMPolicy = writeBOM | acceptBOM + // Common and RFC 2781-compliant interpretation for UTF-16. + + // ExpectBOM means that the UTF-16 form must start with a byte order mark, + // which will be used to override the default encoding. + ExpectBOM BOMPolicy = writeBOM | acceptBOM | requireBOM + // Used in Java as Unicode (not to be confused with Java's UTF-16) and + // ICU's UTF-16,version=1. Not compliant with RFC 2781. + + // TODO (maybe): strictBOM: BOM must match Endianness. This would allow: + // - UTF-16(B|L)E,version=1: writeBOM | acceptBOM | requireBOM | strictBOM + // (UnicodeBig and UnicodeLittle in Java) + // - RFC 2781-compliant, but less common interpretation for UTF-16(B|L)E: + // acceptBOM | strictBOM (e.g. assigned to CheckBOM). + // This addition would be consistent with supporting ExpectBOM. +) + +// Endianness is a UTF-16 encoding's default endianness. +type Endianness bool + +const ( + // BigEndian is UTF-16BE. + BigEndian Endianness = false + // LittleEndian is UTF-16LE. + LittleEndian Endianness = true +) + +// ErrMissingBOM means that decoding UTF-16 input with ExpectBOM did not find a +// starting byte order mark. +var ErrMissingBOM = errors.New("encoding: missing byte order mark") + +type utf16Encoding struct { + config + mib identifier.MIB +} + +type config struct { + endianness Endianness + bomPolicy BOMPolicy +} + +func (u utf16Encoding) NewDecoder() *encoding.Decoder { + return &encoding.Decoder{Transformer: &utf16Decoder{ + initial: u.config, + current: u.config, + }} +} + +func (u utf16Encoding) NewEncoder() *encoding.Encoder { + return &encoding.Encoder{Transformer: &utf16Encoder{ + endianness: u.endianness, + initialBOMPolicy: u.bomPolicy, + currentBOMPolicy: u.bomPolicy, + }} +} + +func (u utf16Encoding) ID() (mib identifier.MIB, other string) { + return u.mib, "" +} + +func (u utf16Encoding) String() string { + e, b := "B", "" + if u.endianness == LittleEndian { + e = "L" + } + switch u.bomPolicy { + case ExpectBOM: + b = "Expect" + case UseBOM: + b = "Use" + case IgnoreBOM: + b = "Ignore" + } + return "UTF-16" + e + "E (" + b + " BOM)" +} + +type utf16Decoder struct { + initial config + current config +} + +func (u *utf16Decoder) Reset() { + u.current = u.initial +} + +func (u *utf16Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if len(src) < 2 && atEOF && u.current.bomPolicy&requireBOM != 0 { + return 0, 0, ErrMissingBOM + } + if len(src) == 0 { + return 0, 0, nil + } + if len(src) >= 2 && u.current.bomPolicy&acceptBOM != 0 { + switch { + case src[0] == 0xfe && src[1] == 0xff: + u.current.endianness = BigEndian + nSrc = 2 + case src[0] == 0xff && src[1] == 0xfe: + u.current.endianness = LittleEndian + nSrc = 2 + default: + if u.current.bomPolicy&requireBOM != 0 { + return 0, 0, ErrMissingBOM + } + } + u.current.bomPolicy = IgnoreBOM + } + + var r rune + var dSize, sSize int + for nSrc < len(src) { + if nSrc+1 < len(src) { + x := uint16(src[nSrc+0])<<8 | uint16(src[nSrc+1]) + if u.current.endianness == LittleEndian { + x = x>>8 | x<<8 + } + r, sSize = rune(x), 2 + if utf16.IsSurrogate(r) { + if nSrc+3 < len(src) { + x = uint16(src[nSrc+2])<<8 | uint16(src[nSrc+3]) + if u.current.endianness == LittleEndian { + x = x>>8 | x<<8 + } + // Save for next iteration if it is not a high surrogate. + if isHighSurrogate(rune(x)) { + r, sSize = utf16.DecodeRune(r, rune(x)), 4 + } + } else if !atEOF { + err = transform.ErrShortSrc + break + } + } + if dSize = utf8.RuneLen(r); dSize < 0 { + r, dSize = utf8.RuneError, 3 + } + } else if atEOF { + // Single trailing byte. + r, dSize, sSize = utf8.RuneError, 3, 1 + } else { + err = transform.ErrShortSrc + break + } + if nDst+dSize > len(dst) { + err = transform.ErrShortDst + break + } + nDst += utf8.EncodeRune(dst[nDst:], r) + nSrc += sSize + } + return nDst, nSrc, err +} + +func isHighSurrogate(r rune) bool { + return 0xDC00 <= r && r <= 0xDFFF +} + +type utf16Encoder struct { + endianness Endianness + initialBOMPolicy BOMPolicy + currentBOMPolicy BOMPolicy +} + +func (u *utf16Encoder) Reset() { + u.currentBOMPolicy = u.initialBOMPolicy +} + +func (u *utf16Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if u.currentBOMPolicy&writeBOM != 0 { + if len(dst) < 2 { + return 0, 0, transform.ErrShortDst + } + dst[0], dst[1] = 0xfe, 0xff + u.currentBOMPolicy = IgnoreBOM + nDst = 2 + } + + r, size := rune(0), 0 + for nSrc < len(src) { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + } + } + + if r <= 0xffff { + if nDst+2 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = uint8(r >> 8) + dst[nDst+1] = uint8(r) + nDst += 2 + } else { + if nDst+4 > len(dst) { + err = transform.ErrShortDst + break + } + r1, r2 := utf16.EncodeRune(r) + dst[nDst+0] = uint8(r1 >> 8) + dst[nDst+1] = uint8(r1) + dst[nDst+2] = uint8(r2 >> 8) + dst[nDst+3] = uint8(r2) + nDst += 4 + } + nSrc += size + } + + if u.endianness == LittleEndian { + for i := 0; i < nDst; i += 2 { + dst[i], dst[i+1] = dst[i+1], dst[i] + } + } + return nDst, nSrc, err +} diff --git a/vendor/golang.org/x/text/internal/utf8internal/utf8internal.go b/vendor/golang.org/x/text/internal/utf8internal/utf8internal.go new file mode 100644 index 0000000000..e5c53b1b3e --- /dev/null +++ b/vendor/golang.org/x/text/internal/utf8internal/utf8internal.go @@ -0,0 +1,87 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package utf8internal contains low-level utf8-related constants, tables, etc. +// that are used internally by the text package. +package utf8internal + +// The default lowest and highest continuation byte. +const ( + LoCB = 0x80 // 1000 0000 + HiCB = 0xBF // 1011 1111 +) + +// Constants related to getting information of first bytes of UTF-8 sequences. +const ( + // ASCII identifies a UTF-8 byte as ASCII. + ASCII = as + + // FirstInvalid indicates a byte is invalid as a first byte of a UTF-8 + // sequence. + FirstInvalid = xx + + // SizeMask is a mask for the size bits. Use use x&SizeMask to get the size. + SizeMask = 7 + + // AcceptShift is the right-shift count for the first byte info byte to get + // the index into the AcceptRanges table. See AcceptRanges. + AcceptShift = 4 + + // The names of these constants are chosen to give nice alignment in the + // table below. The first nibble is an index into acceptRanges or F for + // special one-byte cases. The second nibble is the Rune length or the + // Status for the special one-byte case. + xx = 0xF1 // invalid: size 1 + as = 0xF0 // ASCII: size 1 + s1 = 0x02 // accept 0, size 2 + s2 = 0x13 // accept 1, size 3 + s3 = 0x03 // accept 0, size 3 + s4 = 0x23 // accept 2, size 3 + s5 = 0x34 // accept 3, size 4 + s6 = 0x04 // accept 0, size 4 + s7 = 0x44 // accept 4, size 4 +) + +// First is information about the first byte in a UTF-8 sequence. +var First = [256]uint8{ + // 1 2 3 4 5 6 7 8 9 A B C D E F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x00-0x0F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x10-0x1F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x20-0x2F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x30-0x3F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x40-0x4F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x50-0x5F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x60-0x6F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x70-0x7F + // 1 2 3 4 5 6 7 8 9 A B C D E F + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x80-0x8F + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x90-0x9F + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xA0-0xAF + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xB0-0xBF + xx, xx, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xC0-0xCF + s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xD0-0xDF + s2, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s4, s3, s3, // 0xE0-0xEF + s5, s6, s6, s6, s7, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xF0-0xFF +} + +// AcceptRange gives the range of valid values for the second byte in a UTF-8 +// sequence for any value for First that is not ASCII or FirstInvalid. +type AcceptRange struct { + Lo uint8 // lowest value for second byte. + Hi uint8 // highest value for second byte. +} + +// AcceptRanges is a slice of AcceptRange values. For a given byte sequence b +// +// AcceptRanges[First[b[0]]>>AcceptShift] +// +// will give the value of AcceptRange for the multi-byte UTF-8 sequence starting +// at b[0]. +var AcceptRanges = [...]AcceptRange{ + 0: {LoCB, HiCB}, + 1: {0xA0, HiCB}, + 2: {LoCB, 0x9F}, + 3: {0x90, HiCB}, + 4: {LoCB, 0x8F}, +} diff --git a/vendor/gopkg.in/ini.v1/.editorconfig b/vendor/gopkg.in/ini.v1/.editorconfig new file mode 100644 index 0000000000..4a2d9180f9 --- /dev/null +++ b/vendor/gopkg.in/ini.v1/.editorconfig @@ -0,0 +1,12 @@ +# http://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*_test.go] +trim_trailing_whitespace = false diff --git a/vendor/gopkg.in/ini.v1/.gitignore b/vendor/gopkg.in/ini.v1/.gitignore new file mode 100644 index 0000000000..588388bda2 --- /dev/null +++ b/vendor/gopkg.in/ini.v1/.gitignore @@ -0,0 +1,7 @@ +testdata/conf_out.ini +ini.sublime-project +ini.sublime-workspace +testdata/conf_reflect.ini +.idea +/.vscode +.DS_Store diff --git a/vendor/gopkg.in/ini.v1/.golangci.yml b/vendor/gopkg.in/ini.v1/.golangci.yml new file mode 100644 index 0000000000..631e369254 --- /dev/null +++ b/vendor/gopkg.in/ini.v1/.golangci.yml @@ -0,0 +1,27 @@ +linters-settings: + staticcheck: + checks: [ + "all", + "-SA1019" # There are valid use cases of strings.Title + ] + nakedret: + max-func-lines: 0 # Disallow any unnamed return statement + +linters: + enable: + - deadcode + - errcheck + - gosimple + - govet + - ineffassign + - staticcheck + - structcheck + - typecheck + - unused + - varcheck + - nakedret + - gofmt + - rowserrcheck + - unconvert + - goimports + - unparam diff --git a/vendor/gopkg.in/ini.v1/LICENSE b/vendor/gopkg.in/ini.v1/LICENSE new file mode 100644 index 0000000000..d361bbcdf5 --- /dev/null +++ b/vendor/gopkg.in/ini.v1/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright 2014 Unknwon + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/gopkg.in/ini.v1/Makefile b/vendor/gopkg.in/ini.v1/Makefile new file mode 100644 index 0000000000..f3b0dae2d2 --- /dev/null +++ b/vendor/gopkg.in/ini.v1/Makefile @@ -0,0 +1,15 @@ +.PHONY: build test bench vet coverage + +build: vet bench + +test: + go test -v -cover -race + +bench: + go test -v -cover -test.bench=. -test.benchmem + +vet: + go vet + +coverage: + go test -coverprofile=c.out && go tool cover -html=c.out && rm c.out diff --git a/vendor/gopkg.in/ini.v1/README.md b/vendor/gopkg.in/ini.v1/README.md new file mode 100644 index 0000000000..30606d9700 --- /dev/null +++ b/vendor/gopkg.in/ini.v1/README.md @@ -0,0 +1,43 @@ +# INI + +[![GitHub Workflow Status](https://img.shields.io/github/checks-status/go-ini/ini/main?logo=github&style=for-the-badge)](https://github.com/go-ini/ini/actions?query=branch%3Amain) +[![codecov](https://img.shields.io/codecov/c/github/go-ini/ini/master?logo=codecov&style=for-the-badge)](https://codecov.io/gh/go-ini/ini) +[![GoDoc](https://img.shields.io/badge/GoDoc-Reference-blue?style=for-the-badge&logo=go)](https://pkg.go.dev/github.com/go-ini/ini?tab=doc) +[![Sourcegraph](https://img.shields.io/badge/view%20on-Sourcegraph-brightgreen.svg?style=for-the-badge&logo=sourcegraph)](https://sourcegraph.com/github.com/go-ini/ini) + +![](https://avatars0.githubusercontent.com/u/10216035?v=3&s=200) + +Package ini provides INI file read and write functionality in Go. + +## Features + +- Load from multiple data sources(file, `[]byte`, `io.Reader` and `io.ReadCloser`) with overwrites. +- Read with recursion values. +- Read with parent-child sections. +- Read with auto-increment key names. +- Read with multiple-line values. +- Read with tons of helper methods. +- Read and convert values to Go types. +- Read and **WRITE** comments of sections and keys. +- Manipulate sections, keys and comments with ease. +- Keep sections and keys in order as you parse and save. + +## Installation + +The minimum requirement of Go is **1.13**. + +```sh +$ go get gopkg.in/ini.v1 +``` + +Please add `-u` flag to update in the future. + +## Getting Help + +- [Getting Started](https://ini.unknwon.io/docs/intro/getting_started) +- [API Documentation](https://gowalker.org/gopkg.in/ini.v1) +- 中国大陆镜像:https://ini.unknwon.cn + +## License + +This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text. diff --git a/vendor/gopkg.in/ini.v1/codecov.yml b/vendor/gopkg.in/ini.v1/codecov.yml new file mode 100644 index 0000000000..e02ec84bc0 --- /dev/null +++ b/vendor/gopkg.in/ini.v1/codecov.yml @@ -0,0 +1,16 @@ +coverage: + range: "60...95" + status: + project: + default: + threshold: 1% + informational: true + patch: + defualt: + only_pulls: true + informational: true + +comment: + layout: 'diff' + +github_checks: false diff --git a/vendor/gopkg.in/ini.v1/data_source.go b/vendor/gopkg.in/ini.v1/data_source.go new file mode 100644 index 0000000000..c3a541f1d1 --- /dev/null +++ b/vendor/gopkg.in/ini.v1/data_source.go @@ -0,0 +1,76 @@ +// Copyright 2019 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package ini + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "os" +) + +var ( + _ dataSource = (*sourceFile)(nil) + _ dataSource = (*sourceData)(nil) + _ dataSource = (*sourceReadCloser)(nil) +) + +// dataSource is an interface that returns object which can be read and closed. +type dataSource interface { + ReadCloser() (io.ReadCloser, error) +} + +// sourceFile represents an object that contains content on the local file system. +type sourceFile struct { + name string +} + +func (s sourceFile) ReadCloser() (_ io.ReadCloser, err error) { + return os.Open(s.name) +} + +// sourceData represents an object that contains content in memory. +type sourceData struct { + data []byte +} + +func (s *sourceData) ReadCloser() (io.ReadCloser, error) { + return ioutil.NopCloser(bytes.NewReader(s.data)), nil +} + +// sourceReadCloser represents an input stream with Close method. +type sourceReadCloser struct { + reader io.ReadCloser +} + +func (s *sourceReadCloser) ReadCloser() (io.ReadCloser, error) { + return s.reader, nil +} + +func parseDataSource(source interface{}) (dataSource, error) { + switch s := source.(type) { + case string: + return sourceFile{s}, nil + case []byte: + return &sourceData{s}, nil + case io.ReadCloser: + return &sourceReadCloser{s}, nil + case io.Reader: + return &sourceReadCloser{ioutil.NopCloser(s)}, nil + default: + return nil, fmt.Errorf("error parsing data source: unknown type %q", s) + } +} diff --git a/vendor/gopkg.in/ini.v1/deprecated.go b/vendor/gopkg.in/ini.v1/deprecated.go new file mode 100644 index 0000000000..48b8e66d6d --- /dev/null +++ b/vendor/gopkg.in/ini.v1/deprecated.go @@ -0,0 +1,22 @@ +// Copyright 2019 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package ini + +var ( + // Deprecated: Use "DefaultSection" instead. + DEFAULT_SECTION = DefaultSection + // Deprecated: AllCapsUnderscore converts to format ALL_CAPS_UNDERSCORE. + AllCapsUnderscore = SnackCase +) diff --git a/vendor/gopkg.in/ini.v1/error.go b/vendor/gopkg.in/ini.v1/error.go new file mode 100644 index 0000000000..f66bc94b8b --- /dev/null +++ b/vendor/gopkg.in/ini.v1/error.go @@ -0,0 +1,49 @@ +// Copyright 2016 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package ini + +import ( + "fmt" +) + +// ErrDelimiterNotFound indicates the error type of no delimiter is found which there should be one. +type ErrDelimiterNotFound struct { + Line string +} + +// IsErrDelimiterNotFound returns true if the given error is an instance of ErrDelimiterNotFound. +func IsErrDelimiterNotFound(err error) bool { + _, ok := err.(ErrDelimiterNotFound) + return ok +} + +func (err ErrDelimiterNotFound) Error() string { + return fmt.Sprintf("key-value delimiter not found: %s", err.Line) +} + +// ErrEmptyKeyName indicates the error type of no key name is found which there should be one. +type ErrEmptyKeyName struct { + Line string +} + +// IsErrEmptyKeyName returns true if the given error is an instance of ErrEmptyKeyName. +func IsErrEmptyKeyName(err error) bool { + _, ok := err.(ErrEmptyKeyName) + return ok +} + +func (err ErrEmptyKeyName) Error() string { + return fmt.Sprintf("empty key name: %s", err.Line) +} diff --git a/vendor/gopkg.in/ini.v1/file.go b/vendor/gopkg.in/ini.v1/file.go new file mode 100644 index 0000000000..f8b22408be --- /dev/null +++ b/vendor/gopkg.in/ini.v1/file.go @@ -0,0 +1,541 @@ +// Copyright 2017 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package ini + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "strings" + "sync" +) + +// File represents a combination of one or more INI files in memory. +type File struct { + options LoadOptions + dataSources []dataSource + + // Should make things safe, but sometimes doesn't matter. + BlockMode bool + lock sync.RWMutex + + // To keep data in order. + sectionList []string + // To keep track of the index of a section with same name. + // This meta list is only used with non-unique section names are allowed. + sectionIndexes []int + + // Actual data is stored here. + sections map[string][]*Section + + NameMapper + ValueMapper +} + +// newFile initializes File object with given data sources. +func newFile(dataSources []dataSource, opts LoadOptions) *File { + if len(opts.KeyValueDelimiters) == 0 { + opts.KeyValueDelimiters = "=:" + } + if len(opts.KeyValueDelimiterOnWrite) == 0 { + opts.KeyValueDelimiterOnWrite = "=" + } + if len(opts.ChildSectionDelimiter) == 0 { + opts.ChildSectionDelimiter = "." + } + + return &File{ + BlockMode: true, + dataSources: dataSources, + sections: make(map[string][]*Section), + options: opts, + } +} + +// Empty returns an empty file object. +func Empty(opts ...LoadOptions) *File { + var opt LoadOptions + if len(opts) > 0 { + opt = opts[0] + } + + // Ignore error here, we are sure our data is good. + f, _ := LoadSources(opt, []byte("")) + return f +} + +// NewSection creates a new section. +func (f *File) NewSection(name string) (*Section, error) { + if len(name) == 0 { + return nil, errors.New("empty section name") + } + + if (f.options.Insensitive || f.options.InsensitiveSections) && name != DefaultSection { + name = strings.ToLower(name) + } + + if f.BlockMode { + f.lock.Lock() + defer f.lock.Unlock() + } + + if !f.options.AllowNonUniqueSections && inSlice(name, f.sectionList) { + return f.sections[name][0], nil + } + + f.sectionList = append(f.sectionList, name) + + // NOTE: Append to indexes must happen before appending to sections, + // otherwise index will have off-by-one problem. + f.sectionIndexes = append(f.sectionIndexes, len(f.sections[name])) + + sec := newSection(f, name) + f.sections[name] = append(f.sections[name], sec) + + return sec, nil +} + +// NewRawSection creates a new section with an unparseable body. +func (f *File) NewRawSection(name, body string) (*Section, error) { + section, err := f.NewSection(name) + if err != nil { + return nil, err + } + + section.isRawSection = true + section.rawBody = body + return section, nil +} + +// NewSections creates a list of sections. +func (f *File) NewSections(names ...string) (err error) { + for _, name := range names { + if _, err = f.NewSection(name); err != nil { + return err + } + } + return nil +} + +// GetSection returns section by given name. +func (f *File) GetSection(name string) (*Section, error) { + secs, err := f.SectionsByName(name) + if err != nil { + return nil, err + } + + return secs[0], err +} + +// HasSection returns true if the file contains a section with given name. +func (f *File) HasSection(name string) bool { + section, _ := f.GetSection(name) + return section != nil +} + +// SectionsByName returns all sections with given name. +func (f *File) SectionsByName(name string) ([]*Section, error) { + if len(name) == 0 { + name = DefaultSection + } + if f.options.Insensitive || f.options.InsensitiveSections { + name = strings.ToLower(name) + } + + if f.BlockMode { + f.lock.RLock() + defer f.lock.RUnlock() + } + + secs := f.sections[name] + if len(secs) == 0 { + return nil, fmt.Errorf("section %q does not exist", name) + } + + return secs, nil +} + +// Section assumes named section exists and returns a zero-value when not. +func (f *File) Section(name string) *Section { + sec, err := f.GetSection(name) + if err != nil { + if name == "" { + name = DefaultSection + } + sec, _ = f.NewSection(name) + return sec + } + return sec +} + +// SectionWithIndex assumes named section exists and returns a new section when not. +func (f *File) SectionWithIndex(name string, index int) *Section { + secs, err := f.SectionsByName(name) + if err != nil || len(secs) <= index { + // NOTE: It's OK here because the only possible error is empty section name, + // but if it's empty, this piece of code won't be executed. + newSec, _ := f.NewSection(name) + return newSec + } + + return secs[index] +} + +// Sections returns a list of Section stored in the current instance. +func (f *File) Sections() []*Section { + if f.BlockMode { + f.lock.RLock() + defer f.lock.RUnlock() + } + + sections := make([]*Section, len(f.sectionList)) + for i, name := range f.sectionList { + sections[i] = f.sections[name][f.sectionIndexes[i]] + } + return sections +} + +// ChildSections returns a list of child sections of given section name. +func (f *File) ChildSections(name string) []*Section { + return f.Section(name).ChildSections() +} + +// SectionStrings returns list of section names. +func (f *File) SectionStrings() []string { + list := make([]string, len(f.sectionList)) + copy(list, f.sectionList) + return list +} + +// DeleteSection deletes a section or all sections with given name. +func (f *File) DeleteSection(name string) { + secs, err := f.SectionsByName(name) + if err != nil { + return + } + + for i := 0; i < len(secs); i++ { + // For non-unique sections, it is always needed to remove the first one so + // in the next iteration, the subsequent section continue having index 0. + // Ignoring the error as index 0 never returns an error. + _ = f.DeleteSectionWithIndex(name, 0) + } +} + +// DeleteSectionWithIndex deletes a section with given name and index. +func (f *File) DeleteSectionWithIndex(name string, index int) error { + if !f.options.AllowNonUniqueSections && index != 0 { + return fmt.Errorf("delete section with non-zero index is only allowed when non-unique sections is enabled") + } + + if len(name) == 0 { + name = DefaultSection + } + if f.options.Insensitive || f.options.InsensitiveSections { + name = strings.ToLower(name) + } + + if f.BlockMode { + f.lock.Lock() + defer f.lock.Unlock() + } + + // Count occurrences of the sections + occurrences := 0 + + sectionListCopy := make([]string, len(f.sectionList)) + copy(sectionListCopy, f.sectionList) + + for i, s := range sectionListCopy { + if s != name { + continue + } + + if occurrences == index { + if len(f.sections[name]) <= 1 { + delete(f.sections, name) // The last one in the map + } else { + f.sections[name] = append(f.sections[name][:index], f.sections[name][index+1:]...) + } + + // Fix section lists + f.sectionList = append(f.sectionList[:i], f.sectionList[i+1:]...) + f.sectionIndexes = append(f.sectionIndexes[:i], f.sectionIndexes[i+1:]...) + + } else if occurrences > index { + // Fix the indices of all following sections with this name. + f.sectionIndexes[i-1]-- + } + + occurrences++ + } + + return nil +} + +func (f *File) reload(s dataSource) error { + r, err := s.ReadCloser() + if err != nil { + return err + } + defer r.Close() + + return f.parse(r) +} + +// Reload reloads and parses all data sources. +func (f *File) Reload() (err error) { + for _, s := range f.dataSources { + if err = f.reload(s); err != nil { + // In loose mode, we create an empty default section for nonexistent files. + if os.IsNotExist(err) && f.options.Loose { + _ = f.parse(bytes.NewBuffer(nil)) + continue + } + return err + } + if f.options.ShortCircuit { + return nil + } + } + return nil +} + +// Append appends one or more data sources and reloads automatically. +func (f *File) Append(source interface{}, others ...interface{}) error { + ds, err := parseDataSource(source) + if err != nil { + return err + } + f.dataSources = append(f.dataSources, ds) + for _, s := range others { + ds, err = parseDataSource(s) + if err != nil { + return err + } + f.dataSources = append(f.dataSources, ds) + } + return f.Reload() +} + +func (f *File) writeToBuffer(indent string) (*bytes.Buffer, error) { + equalSign := DefaultFormatLeft + f.options.KeyValueDelimiterOnWrite + DefaultFormatRight + + if PrettyFormat || PrettyEqual { + equalSign = fmt.Sprintf(" %s ", f.options.KeyValueDelimiterOnWrite) + } + + // Use buffer to make sure target is safe until finish encoding. + buf := bytes.NewBuffer(nil) + lastSectionIdx := len(f.sectionList) - 1 + for i, sname := range f.sectionList { + sec := f.SectionWithIndex(sname, f.sectionIndexes[i]) + if len(sec.Comment) > 0 { + // Support multiline comments + lines := strings.Split(sec.Comment, LineBreak) + for i := range lines { + if lines[i][0] != '#' && lines[i][0] != ';' { + lines[i] = "; " + lines[i] + } else { + lines[i] = lines[i][:1] + " " + strings.TrimSpace(lines[i][1:]) + } + + if _, err := buf.WriteString(lines[i] + LineBreak); err != nil { + return nil, err + } + } + } + + if i > 0 || DefaultHeader || (i == 0 && strings.ToUpper(sec.name) != DefaultSection) { + if _, err := buf.WriteString("[" + sname + "]" + LineBreak); err != nil { + return nil, err + } + } else { + // Write nothing if default section is empty + if len(sec.keyList) == 0 { + continue + } + } + + isLastSection := i == lastSectionIdx + if sec.isRawSection { + if _, err := buf.WriteString(sec.rawBody); err != nil { + return nil, err + } + + if PrettySection && !isLastSection { + // Put a line between sections + if _, err := buf.WriteString(LineBreak); err != nil { + return nil, err + } + } + continue + } + + // Count and generate alignment length and buffer spaces using the + // longest key. Keys may be modified if they contain certain characters so + // we need to take that into account in our calculation. + alignLength := 0 + if PrettyFormat { + for _, kname := range sec.keyList { + keyLength := len(kname) + // First case will surround key by ` and second by """ + if strings.Contains(kname, "\"") || strings.ContainsAny(kname, f.options.KeyValueDelimiters) { + keyLength += 2 + } else if strings.Contains(kname, "`") { + keyLength += 6 + } + + if keyLength > alignLength { + alignLength = keyLength + } + } + } + alignSpaces := bytes.Repeat([]byte(" "), alignLength) + + KeyList: + for _, kname := range sec.keyList { + key := sec.Key(kname) + if len(key.Comment) > 0 { + if len(indent) > 0 && sname != DefaultSection { + buf.WriteString(indent) + } + + // Support multiline comments + lines := strings.Split(key.Comment, LineBreak) + for i := range lines { + if lines[i][0] != '#' && lines[i][0] != ';' { + lines[i] = "; " + strings.TrimSpace(lines[i]) + } else { + lines[i] = lines[i][:1] + " " + strings.TrimSpace(lines[i][1:]) + } + + if _, err := buf.WriteString(lines[i] + LineBreak); err != nil { + return nil, err + } + } + } + + if len(indent) > 0 && sname != DefaultSection { + buf.WriteString(indent) + } + + switch { + case key.isAutoIncrement: + kname = "-" + case strings.Contains(kname, "\"") || strings.ContainsAny(kname, f.options.KeyValueDelimiters): + kname = "`" + kname + "`" + case strings.Contains(kname, "`"): + kname = `"""` + kname + `"""` + } + + writeKeyValue := func(val string) (bool, error) { + if _, err := buf.WriteString(kname); err != nil { + return false, err + } + + if key.isBooleanType { + buf.WriteString(LineBreak) + return true, nil + } + + // Write out alignment spaces before "=" sign + if PrettyFormat { + buf.Write(alignSpaces[:alignLength-len(kname)]) + } + + // In case key value contains "\n", "`", "\"", "#" or ";" + if strings.ContainsAny(val, "\n`") { + val = `"""` + val + `"""` + } else if !f.options.IgnoreInlineComment && strings.ContainsAny(val, "#;") { + val = "`" + val + "`" + } else if len(strings.TrimSpace(val)) != len(val) { + val = `"` + val + `"` + } + if _, err := buf.WriteString(equalSign + val + LineBreak); err != nil { + return false, err + } + return false, nil + } + + shadows := key.ValueWithShadows() + if len(shadows) == 0 { + if _, err := writeKeyValue(""); err != nil { + return nil, err + } + } + + for _, val := range shadows { + exitLoop, err := writeKeyValue(val) + if err != nil { + return nil, err + } else if exitLoop { + continue KeyList + } + } + + for _, val := range key.nestedValues { + if _, err := buf.WriteString(indent + " " + val + LineBreak); err != nil { + return nil, err + } + } + } + + if PrettySection && !isLastSection { + // Put a line between sections + if _, err := buf.WriteString(LineBreak); err != nil { + return nil, err + } + } + } + + return buf, nil +} + +// WriteToIndent writes content into io.Writer with given indention. +// If PrettyFormat has been set to be true, +// it will align "=" sign with spaces under each section. +func (f *File) WriteToIndent(w io.Writer, indent string) (int64, error) { + buf, err := f.writeToBuffer(indent) + if err != nil { + return 0, err + } + return buf.WriteTo(w) +} + +// WriteTo writes file content into io.Writer. +func (f *File) WriteTo(w io.Writer) (int64, error) { + return f.WriteToIndent(w, "") +} + +// SaveToIndent writes content to file system with given value indention. +func (f *File) SaveToIndent(filename, indent string) error { + // Note: Because we are truncating with os.Create, + // so it's safer to save to a temporary file location and rename after done. + buf, err := f.writeToBuffer(indent) + if err != nil { + return err + } + + return ioutil.WriteFile(filename, buf.Bytes(), 0666) +} + +// SaveTo writes content to file system. +func (f *File) SaveTo(filename string) error { + return f.SaveToIndent(filename, "") +} diff --git a/vendor/gopkg.in/ini.v1/helper.go b/vendor/gopkg.in/ini.v1/helper.go new file mode 100644 index 0000000000..f9d80a682a --- /dev/null +++ b/vendor/gopkg.in/ini.v1/helper.go @@ -0,0 +1,24 @@ +// Copyright 2019 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package ini + +func inSlice(str string, s []string) bool { + for _, v := range s { + if str == v { + return true + } + } + return false +} diff --git a/vendor/gopkg.in/ini.v1/ini.go b/vendor/gopkg.in/ini.v1/ini.go new file mode 100644 index 0000000000..99e7f86511 --- /dev/null +++ b/vendor/gopkg.in/ini.v1/ini.go @@ -0,0 +1,176 @@ +// Copyright 2014 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +// Package ini provides INI file read and write functionality in Go. +package ini + +import ( + "os" + "regexp" + "runtime" + "strings" +) + +const ( + // Maximum allowed depth when recursively substituing variable names. + depthValues = 99 +) + +var ( + // DefaultSection is the name of default section. You can use this var or the string literal. + // In most of cases, an empty string is all you need to access the section. + DefaultSection = "DEFAULT" + + // LineBreak is the delimiter to determine or compose a new line. + // This variable will be changed to "\r\n" automatically on Windows at package init time. + LineBreak = "\n" + + // Variable regexp pattern: %(variable)s + varPattern = regexp.MustCompile(`%\(([^)]+)\)s`) + + // DefaultHeader explicitly writes default section header. + DefaultHeader = false + + // PrettySection indicates whether to put a line between sections. + PrettySection = true + // PrettyFormat indicates whether to align "=" sign with spaces to produce pretty output + // or reduce all possible spaces for compact format. + PrettyFormat = true + // PrettyEqual places spaces around "=" sign even when PrettyFormat is false. + PrettyEqual = false + // DefaultFormatLeft places custom spaces on the left when PrettyFormat and PrettyEqual are both disabled. + DefaultFormatLeft = "" + // DefaultFormatRight places custom spaces on the right when PrettyFormat and PrettyEqual are both disabled. + DefaultFormatRight = "" +) + +var inTest = len(os.Args) > 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test") + +func init() { + if runtime.GOOS == "windows" && !inTest { + LineBreak = "\r\n" + } +} + +// LoadOptions contains all customized options used for load data source(s). +type LoadOptions struct { + // Loose indicates whether the parser should ignore nonexistent files or return error. + Loose bool + // Insensitive indicates whether the parser forces all section and key names to lowercase. + Insensitive bool + // InsensitiveSections indicates whether the parser forces all section to lowercase. + InsensitiveSections bool + // InsensitiveKeys indicates whether the parser forces all key names to lowercase. + InsensitiveKeys bool + // IgnoreContinuation indicates whether to ignore continuation lines while parsing. + IgnoreContinuation bool + // IgnoreInlineComment indicates whether to ignore comments at the end of value and treat it as part of value. + IgnoreInlineComment bool + // SkipUnrecognizableLines indicates whether to skip unrecognizable lines that do not conform to key/value pairs. + SkipUnrecognizableLines bool + // ShortCircuit indicates whether to ignore other configuration sources after loaded the first available configuration source. + ShortCircuit bool + // AllowBooleanKeys indicates whether to allow boolean type keys or treat as value is missing. + // This type of keys are mostly used in my.cnf. + AllowBooleanKeys bool + // AllowShadows indicates whether to keep track of keys with same name under same section. + AllowShadows bool + // AllowNestedValues indicates whether to allow AWS-like nested values. + // Docs: http://docs.aws.amazon.com/cli/latest/topic/config-vars.html#nested-values + AllowNestedValues bool + // AllowPythonMultilineValues indicates whether to allow Python-like multi-line values. + // Docs: https://docs.python.org/3/library/configparser.html#supported-ini-file-structure + // Relevant quote: Values can also span multiple lines, as long as they are indented deeper + // than the first line of the value. + AllowPythonMultilineValues bool + // SpaceBeforeInlineComment indicates whether to allow comment symbols (\# and \;) inside value. + // Docs: https://docs.python.org/2/library/configparser.html + // Quote: Comments may appear on their own in an otherwise empty line, or may be entered in lines holding values or section names. + // In the latter case, they need to be preceded by a whitespace character to be recognized as a comment. + SpaceBeforeInlineComment bool + // UnescapeValueDoubleQuotes indicates whether to unescape double quotes inside value to regular format + // when value is surrounded by double quotes, e.g. key="a \"value\"" => key=a "value" + UnescapeValueDoubleQuotes bool + // UnescapeValueCommentSymbols indicates to unescape comment symbols (\# and \;) inside value to regular format + // when value is NOT surrounded by any quotes. + // Note: UNSTABLE, behavior might change to only unescape inside double quotes but may noy necessary at all. + UnescapeValueCommentSymbols bool + // UnparseableSections stores a list of blocks that are allowed with raw content which do not otherwise + // conform to key/value pairs. Specify the names of those blocks here. + UnparseableSections []string + // KeyValueDelimiters is the sequence of delimiters that are used to separate key and value. By default, it is "=:". + KeyValueDelimiters string + // KeyValueDelimiterOnWrite is the delimiter that are used to separate key and value output. By default, it is "=". + KeyValueDelimiterOnWrite string + // ChildSectionDelimiter is the delimiter that is used to separate child sections. By default, it is ".". + ChildSectionDelimiter string + // PreserveSurroundedQuote indicates whether to preserve surrounded quote (single and double quotes). + PreserveSurroundedQuote bool + // DebugFunc is called to collect debug information (currently only useful to debug parsing Python-style multiline values). + DebugFunc DebugFunc + // ReaderBufferSize is the buffer size of the reader in bytes. + ReaderBufferSize int + // AllowNonUniqueSections indicates whether to allow sections with the same name multiple times. + AllowNonUniqueSections bool + // AllowDuplicateShadowValues indicates whether values for shadowed keys should be deduplicated. + AllowDuplicateShadowValues bool +} + +// DebugFunc is the type of function called to log parse events. +type DebugFunc func(message string) + +// LoadSources allows caller to apply customized options for loading from data source(s). +func LoadSources(opts LoadOptions, source interface{}, others ...interface{}) (_ *File, err error) { + sources := make([]dataSource, len(others)+1) + sources[0], err = parseDataSource(source) + if err != nil { + return nil, err + } + for i := range others { + sources[i+1], err = parseDataSource(others[i]) + if err != nil { + return nil, err + } + } + f := newFile(sources, opts) + if err = f.Reload(); err != nil { + return nil, err + } + return f, nil +} + +// Load loads and parses from INI data sources. +// Arguments can be mixed of file name with string type, or raw data in []byte. +// It will return error if list contains nonexistent files. +func Load(source interface{}, others ...interface{}) (*File, error) { + return LoadSources(LoadOptions{}, source, others...) +} + +// LooseLoad has exactly same functionality as Load function +// except it ignores nonexistent files instead of returning error. +func LooseLoad(source interface{}, others ...interface{}) (*File, error) { + return LoadSources(LoadOptions{Loose: true}, source, others...) +} + +// InsensitiveLoad has exactly same functionality as Load function +// except it forces all section and key names to be lowercased. +func InsensitiveLoad(source interface{}, others ...interface{}) (*File, error) { + return LoadSources(LoadOptions{Insensitive: true}, source, others...) +} + +// ShadowLoad has exactly same functionality as Load function +// except it allows have shadow keys. +func ShadowLoad(source interface{}, others ...interface{}) (*File, error) { + return LoadSources(LoadOptions{AllowShadows: true}, source, others...) +} diff --git a/vendor/gopkg.in/ini.v1/key.go b/vendor/gopkg.in/ini.v1/key.go new file mode 100644 index 0000000000..a19d9f38ef --- /dev/null +++ b/vendor/gopkg.in/ini.v1/key.go @@ -0,0 +1,837 @@ +// Copyright 2014 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package ini + +import ( + "bytes" + "errors" + "fmt" + "strconv" + "strings" + "time" +) + +// Key represents a key under a section. +type Key struct { + s *Section + Comment string + name string + value string + isAutoIncrement bool + isBooleanType bool + + isShadow bool + shadows []*Key + + nestedValues []string +} + +// newKey simply return a key object with given values. +func newKey(s *Section, name, val string) *Key { + return &Key{ + s: s, + name: name, + value: val, + } +} + +func (k *Key) addShadow(val string) error { + if k.isShadow { + return errors.New("cannot add shadow to another shadow key") + } else if k.isAutoIncrement || k.isBooleanType { + return errors.New("cannot add shadow to auto-increment or boolean key") + } + + if !k.s.f.options.AllowDuplicateShadowValues { + // Deduplicate shadows based on their values. + if k.value == val { + return nil + } + for i := range k.shadows { + if k.shadows[i].value == val { + return nil + } + } + } + + shadow := newKey(k.s, k.name, val) + shadow.isShadow = true + k.shadows = append(k.shadows, shadow) + return nil +} + +// AddShadow adds a new shadow key to itself. +func (k *Key) AddShadow(val string) error { + if !k.s.f.options.AllowShadows { + return errors.New("shadow key is not allowed") + } + return k.addShadow(val) +} + +func (k *Key) addNestedValue(val string) error { + if k.isAutoIncrement || k.isBooleanType { + return errors.New("cannot add nested value to auto-increment or boolean key") + } + + k.nestedValues = append(k.nestedValues, val) + return nil +} + +// AddNestedValue adds a nested value to the key. +func (k *Key) AddNestedValue(val string) error { + if !k.s.f.options.AllowNestedValues { + return errors.New("nested value is not allowed") + } + return k.addNestedValue(val) +} + +// ValueMapper represents a mapping function for values, e.g. os.ExpandEnv +type ValueMapper func(string) string + +// Name returns name of key. +func (k *Key) Name() string { + return k.name +} + +// Value returns raw value of key for performance purpose. +func (k *Key) Value() string { + return k.value +} + +// ValueWithShadows returns raw values of key and its shadows if any. Shadow +// keys with empty values are ignored from the returned list. +func (k *Key) ValueWithShadows() []string { + if len(k.shadows) == 0 { + if k.value == "" { + return []string{} + } + return []string{k.value} + } + + vals := make([]string, 0, len(k.shadows)+1) + if k.value != "" { + vals = append(vals, k.value) + } + for _, s := range k.shadows { + if s.value != "" { + vals = append(vals, s.value) + } + } + return vals +} + +// NestedValues returns nested values stored in the key. +// It is possible returned value is nil if no nested values stored in the key. +func (k *Key) NestedValues() []string { + return k.nestedValues +} + +// transformValue takes a raw value and transforms to its final string. +func (k *Key) transformValue(val string) string { + if k.s.f.ValueMapper != nil { + val = k.s.f.ValueMapper(val) + } + + // Fail-fast if no indicate char found for recursive value + if !strings.Contains(val, "%") { + return val + } + for i := 0; i < depthValues; i++ { + vr := varPattern.FindString(val) + if len(vr) == 0 { + break + } + + // Take off leading '%(' and trailing ')s'. + noption := vr[2 : len(vr)-2] + + // Search in the same section. + // If not found or found the key itself, then search again in default section. + nk, err := k.s.GetKey(noption) + if err != nil || k == nk { + nk, _ = k.s.f.Section("").GetKey(noption) + if nk == nil { + // Stop when no results found in the default section, + // and returns the value as-is. + break + } + } + + // Substitute by new value and take off leading '%(' and trailing ')s'. + val = strings.Replace(val, vr, nk.value, -1) + } + return val +} + +// String returns string representation of value. +func (k *Key) String() string { + return k.transformValue(k.value) +} + +// Validate accepts a validate function which can +// return modifed result as key value. +func (k *Key) Validate(fn func(string) string) string { + return fn(k.String()) +} + +// parseBool returns the boolean value represented by the string. +// +// It accepts 1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On, +// 0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off. +// Any other value returns an error. +func parseBool(str string) (value bool, err error) { + switch str { + case "1", "t", "T", "true", "TRUE", "True", "YES", "yes", "Yes", "y", "ON", "on", "On": + return true, nil + case "0", "f", "F", "false", "FALSE", "False", "NO", "no", "No", "n", "OFF", "off", "Off": + return false, nil + } + return false, fmt.Errorf("parsing \"%s\": invalid syntax", str) +} + +// Bool returns bool type value. +func (k *Key) Bool() (bool, error) { + return parseBool(k.String()) +} + +// Float64 returns float64 type value. +func (k *Key) Float64() (float64, error) { + return strconv.ParseFloat(k.String(), 64) +} + +// Int returns int type value. +func (k *Key) Int() (int, error) { + v, err := strconv.ParseInt(k.String(), 0, 64) + return int(v), err +} + +// Int64 returns int64 type value. +func (k *Key) Int64() (int64, error) { + return strconv.ParseInt(k.String(), 0, 64) +} + +// Uint returns uint type valued. +func (k *Key) Uint() (uint, error) { + u, e := strconv.ParseUint(k.String(), 0, 64) + return uint(u), e +} + +// Uint64 returns uint64 type value. +func (k *Key) Uint64() (uint64, error) { + return strconv.ParseUint(k.String(), 0, 64) +} + +// Duration returns time.Duration type value. +func (k *Key) Duration() (time.Duration, error) { + return time.ParseDuration(k.String()) +} + +// TimeFormat parses with given format and returns time.Time type value. +func (k *Key) TimeFormat(format string) (time.Time, error) { + return time.Parse(format, k.String()) +} + +// Time parses with RFC3339 format and returns time.Time type value. +func (k *Key) Time() (time.Time, error) { + return k.TimeFormat(time.RFC3339) +} + +// MustString returns default value if key value is empty. +func (k *Key) MustString(defaultVal string) string { + val := k.String() + if len(val) == 0 { + k.value = defaultVal + return defaultVal + } + return val +} + +// MustBool always returns value without error, +// it returns false if error occurs. +func (k *Key) MustBool(defaultVal ...bool) bool { + val, err := k.Bool() + if len(defaultVal) > 0 && err != nil { + k.value = strconv.FormatBool(defaultVal[0]) + return defaultVal[0] + } + return val +} + +// MustFloat64 always returns value without error, +// it returns 0.0 if error occurs. +func (k *Key) MustFloat64(defaultVal ...float64) float64 { + val, err := k.Float64() + if len(defaultVal) > 0 && err != nil { + k.value = strconv.FormatFloat(defaultVal[0], 'f', -1, 64) + return defaultVal[0] + } + return val +} + +// MustInt always returns value without error, +// it returns 0 if error occurs. +func (k *Key) MustInt(defaultVal ...int) int { + val, err := k.Int() + if len(defaultVal) > 0 && err != nil { + k.value = strconv.FormatInt(int64(defaultVal[0]), 10) + return defaultVal[0] + } + return val +} + +// MustInt64 always returns value without error, +// it returns 0 if error occurs. +func (k *Key) MustInt64(defaultVal ...int64) int64 { + val, err := k.Int64() + if len(defaultVal) > 0 && err != nil { + k.value = strconv.FormatInt(defaultVal[0], 10) + return defaultVal[0] + } + return val +} + +// MustUint always returns value without error, +// it returns 0 if error occurs. +func (k *Key) MustUint(defaultVal ...uint) uint { + val, err := k.Uint() + if len(defaultVal) > 0 && err != nil { + k.value = strconv.FormatUint(uint64(defaultVal[0]), 10) + return defaultVal[0] + } + return val +} + +// MustUint64 always returns value without error, +// it returns 0 if error occurs. +func (k *Key) MustUint64(defaultVal ...uint64) uint64 { + val, err := k.Uint64() + if len(defaultVal) > 0 && err != nil { + k.value = strconv.FormatUint(defaultVal[0], 10) + return defaultVal[0] + } + return val +} + +// MustDuration always returns value without error, +// it returns zero value if error occurs. +func (k *Key) MustDuration(defaultVal ...time.Duration) time.Duration { + val, err := k.Duration() + if len(defaultVal) > 0 && err != nil { + k.value = defaultVal[0].String() + return defaultVal[0] + } + return val +} + +// MustTimeFormat always parses with given format and returns value without error, +// it returns zero value if error occurs. +func (k *Key) MustTimeFormat(format string, defaultVal ...time.Time) time.Time { + val, err := k.TimeFormat(format) + if len(defaultVal) > 0 && err != nil { + k.value = defaultVal[0].Format(format) + return defaultVal[0] + } + return val +} + +// MustTime always parses with RFC3339 format and returns value without error, +// it returns zero value if error occurs. +func (k *Key) MustTime(defaultVal ...time.Time) time.Time { + return k.MustTimeFormat(time.RFC3339, defaultVal...) +} + +// In always returns value without error, +// it returns default value if error occurs or doesn't fit into candidates. +func (k *Key) In(defaultVal string, candidates []string) string { + val := k.String() + for _, cand := range candidates { + if val == cand { + return val + } + } + return defaultVal +} + +// InFloat64 always returns value without error, +// it returns default value if error occurs or doesn't fit into candidates. +func (k *Key) InFloat64(defaultVal float64, candidates []float64) float64 { + val := k.MustFloat64() + for _, cand := range candidates { + if val == cand { + return val + } + } + return defaultVal +} + +// InInt always returns value without error, +// it returns default value if error occurs or doesn't fit into candidates. +func (k *Key) InInt(defaultVal int, candidates []int) int { + val := k.MustInt() + for _, cand := range candidates { + if val == cand { + return val + } + } + return defaultVal +} + +// InInt64 always returns value without error, +// it returns default value if error occurs or doesn't fit into candidates. +func (k *Key) InInt64(defaultVal int64, candidates []int64) int64 { + val := k.MustInt64() + for _, cand := range candidates { + if val == cand { + return val + } + } + return defaultVal +} + +// InUint always returns value without error, +// it returns default value if error occurs or doesn't fit into candidates. +func (k *Key) InUint(defaultVal uint, candidates []uint) uint { + val := k.MustUint() + for _, cand := range candidates { + if val == cand { + return val + } + } + return defaultVal +} + +// InUint64 always returns value without error, +// it returns default value if error occurs or doesn't fit into candidates. +func (k *Key) InUint64(defaultVal uint64, candidates []uint64) uint64 { + val := k.MustUint64() + for _, cand := range candidates { + if val == cand { + return val + } + } + return defaultVal +} + +// InTimeFormat always parses with given format and returns value without error, +// it returns default value if error occurs or doesn't fit into candidates. +func (k *Key) InTimeFormat(format string, defaultVal time.Time, candidates []time.Time) time.Time { + val := k.MustTimeFormat(format) + for _, cand := range candidates { + if val == cand { + return val + } + } + return defaultVal +} + +// InTime always parses with RFC3339 format and returns value without error, +// it returns default value if error occurs or doesn't fit into candidates. +func (k *Key) InTime(defaultVal time.Time, candidates []time.Time) time.Time { + return k.InTimeFormat(time.RFC3339, defaultVal, candidates) +} + +// RangeFloat64 checks if value is in given range inclusively, +// and returns default value if it's not. +func (k *Key) RangeFloat64(defaultVal, min, max float64) float64 { + val := k.MustFloat64() + if val < min || val > max { + return defaultVal + } + return val +} + +// RangeInt checks if value is in given range inclusively, +// and returns default value if it's not. +func (k *Key) RangeInt(defaultVal, min, max int) int { + val := k.MustInt() + if val < min || val > max { + return defaultVal + } + return val +} + +// RangeInt64 checks if value is in given range inclusively, +// and returns default value if it's not. +func (k *Key) RangeInt64(defaultVal, min, max int64) int64 { + val := k.MustInt64() + if val < min || val > max { + return defaultVal + } + return val +} + +// RangeTimeFormat checks if value with given format is in given range inclusively, +// and returns default value if it's not. +func (k *Key) RangeTimeFormat(format string, defaultVal, min, max time.Time) time.Time { + val := k.MustTimeFormat(format) + if val.Unix() < min.Unix() || val.Unix() > max.Unix() { + return defaultVal + } + return val +} + +// RangeTime checks if value with RFC3339 format is in given range inclusively, +// and returns default value if it's not. +func (k *Key) RangeTime(defaultVal, min, max time.Time) time.Time { + return k.RangeTimeFormat(time.RFC3339, defaultVal, min, max) +} + +// Strings returns list of string divided by given delimiter. +func (k *Key) Strings(delim string) []string { + str := k.String() + if len(str) == 0 { + return []string{} + } + + runes := []rune(str) + vals := make([]string, 0, 2) + var buf bytes.Buffer + escape := false + idx := 0 + for { + if escape { + escape = false + if runes[idx] != '\\' && !strings.HasPrefix(string(runes[idx:]), delim) { + buf.WriteRune('\\') + } + buf.WriteRune(runes[idx]) + } else { + if runes[idx] == '\\' { + escape = true + } else if strings.HasPrefix(string(runes[idx:]), delim) { + idx += len(delim) - 1 + vals = append(vals, strings.TrimSpace(buf.String())) + buf.Reset() + } else { + buf.WriteRune(runes[idx]) + } + } + idx++ + if idx == len(runes) { + break + } + } + + if buf.Len() > 0 { + vals = append(vals, strings.TrimSpace(buf.String())) + } + + return vals +} + +// StringsWithShadows returns list of string divided by given delimiter. +// Shadows will also be appended if any. +func (k *Key) StringsWithShadows(delim string) []string { + vals := k.ValueWithShadows() + results := make([]string, 0, len(vals)*2) + for i := range vals { + if len(vals) == 0 { + continue + } + + results = append(results, strings.Split(vals[i], delim)...) + } + + for i := range results { + results[i] = k.transformValue(strings.TrimSpace(results[i])) + } + return results +} + +// Float64s returns list of float64 divided by given delimiter. Any invalid input will be treated as zero value. +func (k *Key) Float64s(delim string) []float64 { + vals, _ := k.parseFloat64s(k.Strings(delim), true, false) + return vals +} + +// Ints returns list of int divided by given delimiter. Any invalid input will be treated as zero value. +func (k *Key) Ints(delim string) []int { + vals, _ := k.parseInts(k.Strings(delim), true, false) + return vals +} + +// Int64s returns list of int64 divided by given delimiter. Any invalid input will be treated as zero value. +func (k *Key) Int64s(delim string) []int64 { + vals, _ := k.parseInt64s(k.Strings(delim), true, false) + return vals +} + +// Uints returns list of uint divided by given delimiter. Any invalid input will be treated as zero value. +func (k *Key) Uints(delim string) []uint { + vals, _ := k.parseUints(k.Strings(delim), true, false) + return vals +} + +// Uint64s returns list of uint64 divided by given delimiter. Any invalid input will be treated as zero value. +func (k *Key) Uint64s(delim string) []uint64 { + vals, _ := k.parseUint64s(k.Strings(delim), true, false) + return vals +} + +// Bools returns list of bool divided by given delimiter. Any invalid input will be treated as zero value. +func (k *Key) Bools(delim string) []bool { + vals, _ := k.parseBools(k.Strings(delim), true, false) + return vals +} + +// TimesFormat parses with given format and returns list of time.Time divided by given delimiter. +// Any invalid input will be treated as zero value (0001-01-01 00:00:00 +0000 UTC). +func (k *Key) TimesFormat(format, delim string) []time.Time { + vals, _ := k.parseTimesFormat(format, k.Strings(delim), true, false) + return vals +} + +// Times parses with RFC3339 format and returns list of time.Time divided by given delimiter. +// Any invalid input will be treated as zero value (0001-01-01 00:00:00 +0000 UTC). +func (k *Key) Times(delim string) []time.Time { + return k.TimesFormat(time.RFC3339, delim) +} + +// ValidFloat64s returns list of float64 divided by given delimiter. If some value is not float, then +// it will not be included to result list. +func (k *Key) ValidFloat64s(delim string) []float64 { + vals, _ := k.parseFloat64s(k.Strings(delim), false, false) + return vals +} + +// ValidInts returns list of int divided by given delimiter. If some value is not integer, then it will +// not be included to result list. +func (k *Key) ValidInts(delim string) []int { + vals, _ := k.parseInts(k.Strings(delim), false, false) + return vals +} + +// ValidInt64s returns list of int64 divided by given delimiter. If some value is not 64-bit integer, +// then it will not be included to result list. +func (k *Key) ValidInt64s(delim string) []int64 { + vals, _ := k.parseInt64s(k.Strings(delim), false, false) + return vals +} + +// ValidUints returns list of uint divided by given delimiter. If some value is not unsigned integer, +// then it will not be included to result list. +func (k *Key) ValidUints(delim string) []uint { + vals, _ := k.parseUints(k.Strings(delim), false, false) + return vals +} + +// ValidUint64s returns list of uint64 divided by given delimiter. If some value is not 64-bit unsigned +// integer, then it will not be included to result list. +func (k *Key) ValidUint64s(delim string) []uint64 { + vals, _ := k.parseUint64s(k.Strings(delim), false, false) + return vals +} + +// ValidBools returns list of bool divided by given delimiter. If some value is not 64-bit unsigned +// integer, then it will not be included to result list. +func (k *Key) ValidBools(delim string) []bool { + vals, _ := k.parseBools(k.Strings(delim), false, false) + return vals +} + +// ValidTimesFormat parses with given format and returns list of time.Time divided by given delimiter. +func (k *Key) ValidTimesFormat(format, delim string) []time.Time { + vals, _ := k.parseTimesFormat(format, k.Strings(delim), false, false) + return vals +} + +// ValidTimes parses with RFC3339 format and returns list of time.Time divided by given delimiter. +func (k *Key) ValidTimes(delim string) []time.Time { + return k.ValidTimesFormat(time.RFC3339, delim) +} + +// StrictFloat64s returns list of float64 divided by given delimiter or error on first invalid input. +func (k *Key) StrictFloat64s(delim string) ([]float64, error) { + return k.parseFloat64s(k.Strings(delim), false, true) +} + +// StrictInts returns list of int divided by given delimiter or error on first invalid input. +func (k *Key) StrictInts(delim string) ([]int, error) { + return k.parseInts(k.Strings(delim), false, true) +} + +// StrictInt64s returns list of int64 divided by given delimiter or error on first invalid input. +func (k *Key) StrictInt64s(delim string) ([]int64, error) { + return k.parseInt64s(k.Strings(delim), false, true) +} + +// StrictUints returns list of uint divided by given delimiter or error on first invalid input. +func (k *Key) StrictUints(delim string) ([]uint, error) { + return k.parseUints(k.Strings(delim), false, true) +} + +// StrictUint64s returns list of uint64 divided by given delimiter or error on first invalid input. +func (k *Key) StrictUint64s(delim string) ([]uint64, error) { + return k.parseUint64s(k.Strings(delim), false, true) +} + +// StrictBools returns list of bool divided by given delimiter or error on first invalid input. +func (k *Key) StrictBools(delim string) ([]bool, error) { + return k.parseBools(k.Strings(delim), false, true) +} + +// StrictTimesFormat parses with given format and returns list of time.Time divided by given delimiter +// or error on first invalid input. +func (k *Key) StrictTimesFormat(format, delim string) ([]time.Time, error) { + return k.parseTimesFormat(format, k.Strings(delim), false, true) +} + +// StrictTimes parses with RFC3339 format and returns list of time.Time divided by given delimiter +// or error on first invalid input. +func (k *Key) StrictTimes(delim string) ([]time.Time, error) { + return k.StrictTimesFormat(time.RFC3339, delim) +} + +// parseBools transforms strings to bools. +func (k *Key) parseBools(strs []string, addInvalid, returnOnInvalid bool) ([]bool, error) { + vals := make([]bool, 0, len(strs)) + parser := func(str string) (interface{}, error) { + val, err := parseBool(str) + return val, err + } + rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser) + if err == nil { + for _, val := range rawVals { + vals = append(vals, val.(bool)) + } + } + return vals, err +} + +// parseFloat64s transforms strings to float64s. +func (k *Key) parseFloat64s(strs []string, addInvalid, returnOnInvalid bool) ([]float64, error) { + vals := make([]float64, 0, len(strs)) + parser := func(str string) (interface{}, error) { + val, err := strconv.ParseFloat(str, 64) + return val, err + } + rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser) + if err == nil { + for _, val := range rawVals { + vals = append(vals, val.(float64)) + } + } + return vals, err +} + +// parseInts transforms strings to ints. +func (k *Key) parseInts(strs []string, addInvalid, returnOnInvalid bool) ([]int, error) { + vals := make([]int, 0, len(strs)) + parser := func(str string) (interface{}, error) { + val, err := strconv.ParseInt(str, 0, 64) + return val, err + } + rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser) + if err == nil { + for _, val := range rawVals { + vals = append(vals, int(val.(int64))) + } + } + return vals, err +} + +// parseInt64s transforms strings to int64s. +func (k *Key) parseInt64s(strs []string, addInvalid, returnOnInvalid bool) ([]int64, error) { + vals := make([]int64, 0, len(strs)) + parser := func(str string) (interface{}, error) { + val, err := strconv.ParseInt(str, 0, 64) + return val, err + } + + rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser) + if err == nil { + for _, val := range rawVals { + vals = append(vals, val.(int64)) + } + } + return vals, err +} + +// parseUints transforms strings to uints. +func (k *Key) parseUints(strs []string, addInvalid, returnOnInvalid bool) ([]uint, error) { + vals := make([]uint, 0, len(strs)) + parser := func(str string) (interface{}, error) { + val, err := strconv.ParseUint(str, 0, 64) + return val, err + } + + rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser) + if err == nil { + for _, val := range rawVals { + vals = append(vals, uint(val.(uint64))) + } + } + return vals, err +} + +// parseUint64s transforms strings to uint64s. +func (k *Key) parseUint64s(strs []string, addInvalid, returnOnInvalid bool) ([]uint64, error) { + vals := make([]uint64, 0, len(strs)) + parser := func(str string) (interface{}, error) { + val, err := strconv.ParseUint(str, 0, 64) + return val, err + } + rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser) + if err == nil { + for _, val := range rawVals { + vals = append(vals, val.(uint64)) + } + } + return vals, err +} + +type Parser func(str string) (interface{}, error) + +// parseTimesFormat transforms strings to times in given format. +func (k *Key) parseTimesFormat(format string, strs []string, addInvalid, returnOnInvalid bool) ([]time.Time, error) { + vals := make([]time.Time, 0, len(strs)) + parser := func(str string) (interface{}, error) { + val, err := time.Parse(format, str) + return val, err + } + rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser) + if err == nil { + for _, val := range rawVals { + vals = append(vals, val.(time.Time)) + } + } + return vals, err +} + +// doParse transforms strings to different types +func (k *Key) doParse(strs []string, addInvalid, returnOnInvalid bool, parser Parser) ([]interface{}, error) { + vals := make([]interface{}, 0, len(strs)) + for _, str := range strs { + val, err := parser(str) + if err != nil && returnOnInvalid { + return nil, err + } + if err == nil || addInvalid { + vals = append(vals, val) + } + } + return vals, nil +} + +// SetValue changes key value. +func (k *Key) SetValue(v string) { + if k.s.f.BlockMode { + k.s.f.lock.Lock() + defer k.s.f.lock.Unlock() + } + + k.value = v + k.s.keysHash[k.name] = v +} diff --git a/vendor/gopkg.in/ini.v1/parser.go b/vendor/gopkg.in/ini.v1/parser.go new file mode 100644 index 0000000000..44fc526c2c --- /dev/null +++ b/vendor/gopkg.in/ini.v1/parser.go @@ -0,0 +1,520 @@ +// Copyright 2015 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package ini + +import ( + "bufio" + "bytes" + "fmt" + "io" + "regexp" + "strconv" + "strings" + "unicode" +) + +const minReaderBufferSize = 4096 + +var pythonMultiline = regexp.MustCompile(`^([\t\f ]+)(.*)`) + +type parserOptions struct { + IgnoreContinuation bool + IgnoreInlineComment bool + AllowPythonMultilineValues bool + SpaceBeforeInlineComment bool + UnescapeValueDoubleQuotes bool + UnescapeValueCommentSymbols bool + PreserveSurroundedQuote bool + DebugFunc DebugFunc + ReaderBufferSize int +} + +type parser struct { + buf *bufio.Reader + options parserOptions + + isEOF bool + count int + comment *bytes.Buffer +} + +func (p *parser) debug(format string, args ...interface{}) { + if p.options.DebugFunc != nil { + p.options.DebugFunc(fmt.Sprintf(format, args...)) + } +} + +func newParser(r io.Reader, opts parserOptions) *parser { + size := opts.ReaderBufferSize + if size < minReaderBufferSize { + size = minReaderBufferSize + } + + return &parser{ + buf: bufio.NewReaderSize(r, size), + options: opts, + count: 1, + comment: &bytes.Buffer{}, + } +} + +// BOM handles header of UTF-8, UTF-16 LE and UTF-16 BE's BOM format. +// http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding +func (p *parser) BOM() error { + mask, err := p.buf.Peek(2) + if err != nil && err != io.EOF { + return err + } else if len(mask) < 2 { + return nil + } + + switch { + case mask[0] == 254 && mask[1] == 255: + fallthrough + case mask[0] == 255 && mask[1] == 254: + _, err = p.buf.Read(mask) + if err != nil { + return err + } + case mask[0] == 239 && mask[1] == 187: + mask, err := p.buf.Peek(3) + if err != nil && err != io.EOF { + return err + } else if len(mask) < 3 { + return nil + } + if mask[2] == 191 { + _, err = p.buf.Read(mask) + if err != nil { + return err + } + } + } + return nil +} + +func (p *parser) readUntil(delim byte) ([]byte, error) { + data, err := p.buf.ReadBytes(delim) + if err != nil { + if err == io.EOF { + p.isEOF = true + } else { + return nil, err + } + } + return data, nil +} + +func cleanComment(in []byte) ([]byte, bool) { + i := bytes.IndexAny(in, "#;") + if i == -1 { + return nil, false + } + return in[i:], true +} + +func readKeyName(delimiters string, in []byte) (string, int, error) { + line := string(in) + + // Check if key name surrounded by quotes. + var keyQuote string + if line[0] == '"' { + if len(line) > 6 && line[0:3] == `"""` { + keyQuote = `"""` + } else { + keyQuote = `"` + } + } else if line[0] == '`' { + keyQuote = "`" + } + + // Get out key name + var endIdx int + if len(keyQuote) > 0 { + startIdx := len(keyQuote) + // FIXME: fail case -> """"""name"""=value + pos := strings.Index(line[startIdx:], keyQuote) + if pos == -1 { + return "", -1, fmt.Errorf("missing closing key quote: %s", line) + } + pos += startIdx + + // Find key-value delimiter + i := strings.IndexAny(line[pos+startIdx:], delimiters) + if i < 0 { + return "", -1, ErrDelimiterNotFound{line} + } + endIdx = pos + i + return strings.TrimSpace(line[startIdx:pos]), endIdx + startIdx + 1, nil + } + + endIdx = strings.IndexAny(line, delimiters) + if endIdx < 0 { + return "", -1, ErrDelimiterNotFound{line} + } + if endIdx == 0 { + return "", -1, ErrEmptyKeyName{line} + } + + return strings.TrimSpace(line[0:endIdx]), endIdx + 1, nil +} + +func (p *parser) readMultilines(line, val, valQuote string) (string, error) { + for { + data, err := p.readUntil('\n') + if err != nil { + return "", err + } + next := string(data) + + pos := strings.LastIndex(next, valQuote) + if pos > -1 { + val += next[:pos] + + comment, has := cleanComment([]byte(next[pos:])) + if has { + p.comment.Write(bytes.TrimSpace(comment)) + } + break + } + val += next + if p.isEOF { + return "", fmt.Errorf("missing closing key quote from %q to %q", line, next) + } + } + return val, nil +} + +func (p *parser) readContinuationLines(val string) (string, error) { + for { + data, err := p.readUntil('\n') + if err != nil { + return "", err + } + next := strings.TrimSpace(string(data)) + + if len(next) == 0 { + break + } + val += next + if val[len(val)-1] != '\\' { + break + } + val = val[:len(val)-1] + } + return val, nil +} + +// hasSurroundedQuote check if and only if the first and last characters +// are quotes \" or \'. +// It returns false if any other parts also contain same kind of quotes. +func hasSurroundedQuote(in string, quote byte) bool { + return len(in) >= 2 && in[0] == quote && in[len(in)-1] == quote && + strings.IndexByte(in[1:], quote) == len(in)-2 +} + +func (p *parser) readValue(in []byte, bufferSize int) (string, error) { + + line := strings.TrimLeftFunc(string(in), unicode.IsSpace) + if len(line) == 0 { + if p.options.AllowPythonMultilineValues && len(in) > 0 && in[len(in)-1] == '\n' { + return p.readPythonMultilines(line, bufferSize) + } + return "", nil + } + + var valQuote string + if len(line) > 3 && line[0:3] == `"""` { + valQuote = `"""` + } else if line[0] == '`' { + valQuote = "`" + } else if p.options.UnescapeValueDoubleQuotes && line[0] == '"' { + valQuote = `"` + } + + if len(valQuote) > 0 { + startIdx := len(valQuote) + pos := strings.LastIndex(line[startIdx:], valQuote) + // Check for multi-line value + if pos == -1 { + return p.readMultilines(line, line[startIdx:], valQuote) + } + + if p.options.UnescapeValueDoubleQuotes && valQuote == `"` { + return strings.Replace(line[startIdx:pos+startIdx], `\"`, `"`, -1), nil + } + return line[startIdx : pos+startIdx], nil + } + + lastChar := line[len(line)-1] + // Won't be able to reach here if value only contains whitespace + line = strings.TrimSpace(line) + trimmedLastChar := line[len(line)-1] + + // Check continuation lines when desired + if !p.options.IgnoreContinuation && trimmedLastChar == '\\' { + return p.readContinuationLines(line[:len(line)-1]) + } + + // Check if ignore inline comment + if !p.options.IgnoreInlineComment { + var i int + if p.options.SpaceBeforeInlineComment { + i = strings.Index(line, " #") + if i == -1 { + i = strings.Index(line, " ;") + } + + } else { + i = strings.IndexAny(line, "#;") + } + + if i > -1 { + p.comment.WriteString(line[i:]) + line = strings.TrimSpace(line[:i]) + } + + } + + // Trim single and double quotes + if (hasSurroundedQuote(line, '\'') || + hasSurroundedQuote(line, '"')) && !p.options.PreserveSurroundedQuote { + line = line[1 : len(line)-1] + } else if len(valQuote) == 0 && p.options.UnescapeValueCommentSymbols { + line = strings.ReplaceAll(line, `\;`, ";") + line = strings.ReplaceAll(line, `\#`, "#") + } else if p.options.AllowPythonMultilineValues && lastChar == '\n' { + return p.readPythonMultilines(line, bufferSize) + } + + return line, nil +} + +func (p *parser) readPythonMultilines(line string, bufferSize int) (string, error) { + parserBufferPeekResult, _ := p.buf.Peek(bufferSize) + peekBuffer := bytes.NewBuffer(parserBufferPeekResult) + + for { + peekData, peekErr := peekBuffer.ReadBytes('\n') + if peekErr != nil && peekErr != io.EOF { + p.debug("readPythonMultilines: failed to peek with error: %v", peekErr) + return "", peekErr + } + + p.debug("readPythonMultilines: parsing %q", string(peekData)) + + peekMatches := pythonMultiline.FindStringSubmatch(string(peekData)) + p.debug("readPythonMultilines: matched %d parts", len(peekMatches)) + for n, v := range peekMatches { + p.debug(" %d: %q", n, v) + } + + // Return if not a Python multiline value. + if len(peekMatches) != 3 { + p.debug("readPythonMultilines: end of value, got: %q", line) + return line, nil + } + + // Advance the parser reader (buffer) in-sync with the peek buffer. + _, err := p.buf.Discard(len(peekData)) + if err != nil { + p.debug("readPythonMultilines: failed to skip to the end, returning error") + return "", err + } + + line += "\n" + peekMatches[0] + } +} + +// parse parses data through an io.Reader. +func (f *File) parse(reader io.Reader) (err error) { + p := newParser(reader, parserOptions{ + IgnoreContinuation: f.options.IgnoreContinuation, + IgnoreInlineComment: f.options.IgnoreInlineComment, + AllowPythonMultilineValues: f.options.AllowPythonMultilineValues, + SpaceBeforeInlineComment: f.options.SpaceBeforeInlineComment, + UnescapeValueDoubleQuotes: f.options.UnescapeValueDoubleQuotes, + UnescapeValueCommentSymbols: f.options.UnescapeValueCommentSymbols, + PreserveSurroundedQuote: f.options.PreserveSurroundedQuote, + DebugFunc: f.options.DebugFunc, + ReaderBufferSize: f.options.ReaderBufferSize, + }) + if err = p.BOM(); err != nil { + return fmt.Errorf("BOM: %v", err) + } + + // Ignore error because default section name is never empty string. + name := DefaultSection + if f.options.Insensitive || f.options.InsensitiveSections { + name = strings.ToLower(DefaultSection) + } + section, _ := f.NewSection(name) + + // This "last" is not strictly equivalent to "previous one" if current key is not the first nested key + var isLastValueEmpty bool + var lastRegularKey *Key + + var line []byte + var inUnparseableSection bool + + // NOTE: Iterate and increase `currentPeekSize` until + // the size of the parser buffer is found. + // TODO(unknwon): When Golang 1.10 is the lowest version supported, replace with `parserBufferSize := p.buf.Size()`. + parserBufferSize := 0 + // NOTE: Peek 4kb at a time. + currentPeekSize := minReaderBufferSize + + if f.options.AllowPythonMultilineValues { + for { + peekBytes, _ := p.buf.Peek(currentPeekSize) + peekBytesLength := len(peekBytes) + + if parserBufferSize >= peekBytesLength { + break + } + + currentPeekSize *= 2 + parserBufferSize = peekBytesLength + } + } + + for !p.isEOF { + line, err = p.readUntil('\n') + if err != nil { + return err + } + + if f.options.AllowNestedValues && + isLastValueEmpty && len(line) > 0 { + if line[0] == ' ' || line[0] == '\t' { + err = lastRegularKey.addNestedValue(string(bytes.TrimSpace(line))) + if err != nil { + return err + } + continue + } + } + + line = bytes.TrimLeftFunc(line, unicode.IsSpace) + if len(line) == 0 { + continue + } + + // Comments + if line[0] == '#' || line[0] == ';' { + // Note: we do not care ending line break, + // it is needed for adding second line, + // so just clean it once at the end when set to value. + p.comment.Write(line) + continue + } + + // Section + if line[0] == '[' { + // Read to the next ']' (TODO: support quoted strings) + closeIdx := bytes.LastIndexByte(line, ']') + if closeIdx == -1 { + return fmt.Errorf("unclosed section: %s", line) + } + + name := string(line[1:closeIdx]) + section, err = f.NewSection(name) + if err != nil { + return err + } + + comment, has := cleanComment(line[closeIdx+1:]) + if has { + p.comment.Write(comment) + } + + section.Comment = strings.TrimSpace(p.comment.String()) + + // Reset auto-counter and comments + p.comment.Reset() + p.count = 1 + // Nested values can't span sections + isLastValueEmpty = false + + inUnparseableSection = false + for i := range f.options.UnparseableSections { + if f.options.UnparseableSections[i] == name || + ((f.options.Insensitive || f.options.InsensitiveSections) && strings.EqualFold(f.options.UnparseableSections[i], name)) { + inUnparseableSection = true + continue + } + } + continue + } + + if inUnparseableSection { + section.isRawSection = true + section.rawBody += string(line) + continue + } + + kname, offset, err := readKeyName(f.options.KeyValueDelimiters, line) + if err != nil { + switch { + // Treat as boolean key when desired, and whole line is key name. + case IsErrDelimiterNotFound(err): + switch { + case f.options.AllowBooleanKeys: + kname, err := p.readValue(line, parserBufferSize) + if err != nil { + return err + } + key, err := section.NewBooleanKey(kname) + if err != nil { + return err + } + key.Comment = strings.TrimSpace(p.comment.String()) + p.comment.Reset() + continue + + case f.options.SkipUnrecognizableLines: + continue + } + case IsErrEmptyKeyName(err) && f.options.SkipUnrecognizableLines: + continue + } + return err + } + + // Auto increment. + isAutoIncr := false + if kname == "-" { + isAutoIncr = true + kname = "#" + strconv.Itoa(p.count) + p.count++ + } + + value, err := p.readValue(line[offset:], parserBufferSize) + if err != nil { + return err + } + isLastValueEmpty = len(value) == 0 + + key, err := section.NewKey(kname, value) + if err != nil { + return err + } + key.isAutoIncrement = isAutoIncr + key.Comment = strings.TrimSpace(p.comment.String()) + p.comment.Reset() + lastRegularKey = key + } + return nil +} diff --git a/vendor/gopkg.in/ini.v1/section.go b/vendor/gopkg.in/ini.v1/section.go new file mode 100644 index 0000000000..a3615d820b --- /dev/null +++ b/vendor/gopkg.in/ini.v1/section.go @@ -0,0 +1,256 @@ +// Copyright 2014 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package ini + +import ( + "errors" + "fmt" + "strings" +) + +// Section represents a config section. +type Section struct { + f *File + Comment string + name string + keys map[string]*Key + keyList []string + keysHash map[string]string + + isRawSection bool + rawBody string +} + +func newSection(f *File, name string) *Section { + return &Section{ + f: f, + name: name, + keys: make(map[string]*Key), + keyList: make([]string, 0, 10), + keysHash: make(map[string]string), + } +} + +// Name returns name of Section. +func (s *Section) Name() string { + return s.name +} + +// Body returns rawBody of Section if the section was marked as unparseable. +// It still follows the other rules of the INI format surrounding leading/trailing whitespace. +func (s *Section) Body() string { + return strings.TrimSpace(s.rawBody) +} + +// SetBody updates body content only if section is raw. +func (s *Section) SetBody(body string) { + if !s.isRawSection { + return + } + s.rawBody = body +} + +// NewKey creates a new key to given section. +func (s *Section) NewKey(name, val string) (*Key, error) { + if len(name) == 0 { + return nil, errors.New("error creating new key: empty key name") + } else if s.f.options.Insensitive || s.f.options.InsensitiveKeys { + name = strings.ToLower(name) + } + + if s.f.BlockMode { + s.f.lock.Lock() + defer s.f.lock.Unlock() + } + + if inSlice(name, s.keyList) { + if s.f.options.AllowShadows { + if err := s.keys[name].addShadow(val); err != nil { + return nil, err + } + } else { + s.keys[name].value = val + s.keysHash[name] = val + } + return s.keys[name], nil + } + + s.keyList = append(s.keyList, name) + s.keys[name] = newKey(s, name, val) + s.keysHash[name] = val + return s.keys[name], nil +} + +// NewBooleanKey creates a new boolean type key to given section. +func (s *Section) NewBooleanKey(name string) (*Key, error) { + key, err := s.NewKey(name, "true") + if err != nil { + return nil, err + } + + key.isBooleanType = true + return key, nil +} + +// GetKey returns key in section by given name. +func (s *Section) GetKey(name string) (*Key, error) { + if s.f.BlockMode { + s.f.lock.RLock() + } + if s.f.options.Insensitive || s.f.options.InsensitiveKeys { + name = strings.ToLower(name) + } + key := s.keys[name] + if s.f.BlockMode { + s.f.lock.RUnlock() + } + + if key == nil { + // Check if it is a child-section. + sname := s.name + for { + if i := strings.LastIndex(sname, s.f.options.ChildSectionDelimiter); i > -1 { + sname = sname[:i] + sec, err := s.f.GetSection(sname) + if err != nil { + continue + } + return sec.GetKey(name) + } + break + } + return nil, fmt.Errorf("error when getting key of section %q: key %q not exists", s.name, name) + } + return key, nil +} + +// HasKey returns true if section contains a key with given name. +func (s *Section) HasKey(name string) bool { + key, _ := s.GetKey(name) + return key != nil +} + +// Deprecated: Use "HasKey" instead. +func (s *Section) Haskey(name string) bool { + return s.HasKey(name) +} + +// HasValue returns true if section contains given raw value. +func (s *Section) HasValue(value string) bool { + if s.f.BlockMode { + s.f.lock.RLock() + defer s.f.lock.RUnlock() + } + + for _, k := range s.keys { + if value == k.value { + return true + } + } + return false +} + +// Key assumes named Key exists in section and returns a zero-value when not. +func (s *Section) Key(name string) *Key { + key, err := s.GetKey(name) + if err != nil { + // It's OK here because the only possible error is empty key name, + // but if it's empty, this piece of code won't be executed. + key, _ = s.NewKey(name, "") + return key + } + return key +} + +// Keys returns list of keys of section. +func (s *Section) Keys() []*Key { + keys := make([]*Key, len(s.keyList)) + for i := range s.keyList { + keys[i] = s.Key(s.keyList[i]) + } + return keys +} + +// ParentKeys returns list of keys of parent section. +func (s *Section) ParentKeys() []*Key { + var parentKeys []*Key + sname := s.name + for { + if i := strings.LastIndex(sname, s.f.options.ChildSectionDelimiter); i > -1 { + sname = sname[:i] + sec, err := s.f.GetSection(sname) + if err != nil { + continue + } + parentKeys = append(parentKeys, sec.Keys()...) + } else { + break + } + + } + return parentKeys +} + +// KeyStrings returns list of key names of section. +func (s *Section) KeyStrings() []string { + list := make([]string, len(s.keyList)) + copy(list, s.keyList) + return list +} + +// KeysHash returns keys hash consisting of names and values. +func (s *Section) KeysHash() map[string]string { + if s.f.BlockMode { + s.f.lock.RLock() + defer s.f.lock.RUnlock() + } + + hash := make(map[string]string, len(s.keysHash)) + for key, value := range s.keysHash { + hash[key] = value + } + return hash +} + +// DeleteKey deletes a key from section. +func (s *Section) DeleteKey(name string) { + if s.f.BlockMode { + s.f.lock.Lock() + defer s.f.lock.Unlock() + } + + for i, k := range s.keyList { + if k == name { + s.keyList = append(s.keyList[:i], s.keyList[i+1:]...) + delete(s.keys, name) + delete(s.keysHash, name) + return + } + } +} + +// ChildSections returns a list of child sections of current section. +// For example, "[parent.child1]" and "[parent.child12]" are child sections +// of section "[parent]". +func (s *Section) ChildSections() []*Section { + prefix := s.name + s.f.options.ChildSectionDelimiter + children := make([]*Section, 0, 3) + for _, name := range s.f.sectionList { + if strings.HasPrefix(name, prefix) { + children = append(children, s.f.sections[name]...) + } + } + return children +} diff --git a/vendor/gopkg.in/ini.v1/struct.go b/vendor/gopkg.in/ini.v1/struct.go new file mode 100644 index 0000000000..a486b2fe0f --- /dev/null +++ b/vendor/gopkg.in/ini.v1/struct.go @@ -0,0 +1,747 @@ +// Copyright 2014 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package ini + +import ( + "bytes" + "errors" + "fmt" + "reflect" + "strings" + "time" + "unicode" +) + +// NameMapper represents a ini tag name mapper. +type NameMapper func(string) string + +// Built-in name getters. +var ( + // SnackCase converts to format SNACK_CASE. + SnackCase NameMapper = func(raw string) string { + newstr := make([]rune, 0, len(raw)) + for i, chr := range raw { + if isUpper := 'A' <= chr && chr <= 'Z'; isUpper { + if i > 0 { + newstr = append(newstr, '_') + } + } + newstr = append(newstr, unicode.ToUpper(chr)) + } + return string(newstr) + } + // TitleUnderscore converts to format title_underscore. + TitleUnderscore NameMapper = func(raw string) string { + newstr := make([]rune, 0, len(raw)) + for i, chr := range raw { + if isUpper := 'A' <= chr && chr <= 'Z'; isUpper { + if i > 0 { + newstr = append(newstr, '_') + } + chr -= 'A' - 'a' + } + newstr = append(newstr, chr) + } + return string(newstr) + } +) + +func (s *Section) parseFieldName(raw, actual string) string { + if len(actual) > 0 { + return actual + } + if s.f.NameMapper != nil { + return s.f.NameMapper(raw) + } + return raw +} + +func parseDelim(actual string) string { + if len(actual) > 0 { + return actual + } + return "," +} + +var reflectTime = reflect.TypeOf(time.Now()).Kind() + +// setSliceWithProperType sets proper values to slice based on its type. +func setSliceWithProperType(key *Key, field reflect.Value, delim string, allowShadow, isStrict bool) error { + var strs []string + if allowShadow { + strs = key.StringsWithShadows(delim) + } else { + strs = key.Strings(delim) + } + + numVals := len(strs) + if numVals == 0 { + return nil + } + + var vals interface{} + var err error + + sliceOf := field.Type().Elem().Kind() + switch sliceOf { + case reflect.String: + vals = strs + case reflect.Int: + vals, err = key.parseInts(strs, true, false) + case reflect.Int64: + vals, err = key.parseInt64s(strs, true, false) + case reflect.Uint: + vals, err = key.parseUints(strs, true, false) + case reflect.Uint64: + vals, err = key.parseUint64s(strs, true, false) + case reflect.Float64: + vals, err = key.parseFloat64s(strs, true, false) + case reflect.Bool: + vals, err = key.parseBools(strs, true, false) + case reflectTime: + vals, err = key.parseTimesFormat(time.RFC3339, strs, true, false) + default: + return fmt.Errorf("unsupported type '[]%s'", sliceOf) + } + if err != nil && isStrict { + return err + } + + slice := reflect.MakeSlice(field.Type(), numVals, numVals) + for i := 0; i < numVals; i++ { + switch sliceOf { + case reflect.String: + slice.Index(i).Set(reflect.ValueOf(vals.([]string)[i])) + case reflect.Int: + slice.Index(i).Set(reflect.ValueOf(vals.([]int)[i])) + case reflect.Int64: + slice.Index(i).Set(reflect.ValueOf(vals.([]int64)[i])) + case reflect.Uint: + slice.Index(i).Set(reflect.ValueOf(vals.([]uint)[i])) + case reflect.Uint64: + slice.Index(i).Set(reflect.ValueOf(vals.([]uint64)[i])) + case reflect.Float64: + slice.Index(i).Set(reflect.ValueOf(vals.([]float64)[i])) + case reflect.Bool: + slice.Index(i).Set(reflect.ValueOf(vals.([]bool)[i])) + case reflectTime: + slice.Index(i).Set(reflect.ValueOf(vals.([]time.Time)[i])) + } + } + field.Set(slice) + return nil +} + +func wrapStrictError(err error, isStrict bool) error { + if isStrict { + return err + } + return nil +} + +// setWithProperType sets proper value to field based on its type, +// but it does not return error for failing parsing, +// because we want to use default value that is already assigned to struct. +func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string, allowShadow, isStrict bool) error { + vt := t + isPtr := t.Kind() == reflect.Ptr + if isPtr { + vt = t.Elem() + } + switch vt.Kind() { + case reflect.String: + stringVal := key.String() + if isPtr { + field.Set(reflect.ValueOf(&stringVal)) + } else if len(stringVal) > 0 { + field.SetString(key.String()) + } + case reflect.Bool: + boolVal, err := key.Bool() + if err != nil { + return wrapStrictError(err, isStrict) + } + if isPtr { + field.Set(reflect.ValueOf(&boolVal)) + } else { + field.SetBool(boolVal) + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + // ParseDuration will not return err for `0`, so check the type name + if vt.Name() == "Duration" { + durationVal, err := key.Duration() + if err != nil { + if intVal, err := key.Int64(); err == nil { + field.SetInt(intVal) + return nil + } + return wrapStrictError(err, isStrict) + } + if isPtr { + field.Set(reflect.ValueOf(&durationVal)) + } else if int64(durationVal) > 0 { + field.Set(reflect.ValueOf(durationVal)) + } + return nil + } + + intVal, err := key.Int64() + if err != nil { + return wrapStrictError(err, isStrict) + } + if isPtr { + pv := reflect.New(t.Elem()) + pv.Elem().SetInt(intVal) + field.Set(pv) + } else { + field.SetInt(intVal) + } + // byte is an alias for uint8, so supporting uint8 breaks support for byte + case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64: + durationVal, err := key.Duration() + // Skip zero value + if err == nil && uint64(durationVal) > 0 { + if isPtr { + field.Set(reflect.ValueOf(&durationVal)) + } else { + field.Set(reflect.ValueOf(durationVal)) + } + return nil + } + + uintVal, err := key.Uint64() + if err != nil { + return wrapStrictError(err, isStrict) + } + if isPtr { + pv := reflect.New(t.Elem()) + pv.Elem().SetUint(uintVal) + field.Set(pv) + } else { + field.SetUint(uintVal) + } + + case reflect.Float32, reflect.Float64: + floatVal, err := key.Float64() + if err != nil { + return wrapStrictError(err, isStrict) + } + if isPtr { + pv := reflect.New(t.Elem()) + pv.Elem().SetFloat(floatVal) + field.Set(pv) + } else { + field.SetFloat(floatVal) + } + case reflectTime: + timeVal, err := key.Time() + if err != nil { + return wrapStrictError(err, isStrict) + } + if isPtr { + field.Set(reflect.ValueOf(&timeVal)) + } else { + field.Set(reflect.ValueOf(timeVal)) + } + case reflect.Slice: + return setSliceWithProperType(key, field, delim, allowShadow, isStrict) + default: + return fmt.Errorf("unsupported type %q", t) + } + return nil +} + +func parseTagOptions(tag string) (rawName string, omitEmpty bool, allowShadow bool, allowNonUnique bool, extends bool) { + opts := strings.SplitN(tag, ",", 5) + rawName = opts[0] + for _, opt := range opts[1:] { + omitEmpty = omitEmpty || (opt == "omitempty") + allowShadow = allowShadow || (opt == "allowshadow") + allowNonUnique = allowNonUnique || (opt == "nonunique") + extends = extends || (opt == "extends") + } + return rawName, omitEmpty, allowShadow, allowNonUnique, extends +} + +// mapToField maps the given value to the matching field of the given section. +// The sectionIndex is the index (if non unique sections are enabled) to which the value should be added. +func (s *Section) mapToField(val reflect.Value, isStrict bool, sectionIndex int, sectionName string) error { + if val.Kind() == reflect.Ptr { + val = val.Elem() + } + typ := val.Type() + + for i := 0; i < typ.NumField(); i++ { + field := val.Field(i) + tpField := typ.Field(i) + + tag := tpField.Tag.Get("ini") + if tag == "-" { + continue + } + + rawName, _, allowShadow, allowNonUnique, extends := parseTagOptions(tag) + fieldName := s.parseFieldName(tpField.Name, rawName) + if len(fieldName) == 0 || !field.CanSet() { + continue + } + + isStruct := tpField.Type.Kind() == reflect.Struct + isStructPtr := tpField.Type.Kind() == reflect.Ptr && tpField.Type.Elem().Kind() == reflect.Struct + isAnonymousPtr := tpField.Type.Kind() == reflect.Ptr && tpField.Anonymous + if isAnonymousPtr { + field.Set(reflect.New(tpField.Type.Elem())) + } + + if extends && (isAnonymousPtr || (isStruct && tpField.Anonymous)) { + if isStructPtr && field.IsNil() { + field.Set(reflect.New(tpField.Type.Elem())) + } + fieldSection := s + if rawName != "" { + sectionName = s.name + s.f.options.ChildSectionDelimiter + rawName + if secs, err := s.f.SectionsByName(sectionName); err == nil && sectionIndex < len(secs) { + fieldSection = secs[sectionIndex] + } + } + if err := fieldSection.mapToField(field, isStrict, sectionIndex, sectionName); err != nil { + return fmt.Errorf("map to field %q: %v", fieldName, err) + } + } else if isAnonymousPtr || isStruct || isStructPtr { + if secs, err := s.f.SectionsByName(fieldName); err == nil { + if len(secs) <= sectionIndex { + return fmt.Errorf("there are not enough sections (%d <= %d) for the field %q", len(secs), sectionIndex, fieldName) + } + // Only set the field to non-nil struct value if we have a section for it. + // Otherwise, we end up with a non-nil struct ptr even though there is no data. + if isStructPtr && field.IsNil() { + field.Set(reflect.New(tpField.Type.Elem())) + } + if err = secs[sectionIndex].mapToField(field, isStrict, sectionIndex, fieldName); err != nil { + return fmt.Errorf("map to field %q: %v", fieldName, err) + } + continue + } + } + + // Map non-unique sections + if allowNonUnique && tpField.Type.Kind() == reflect.Slice { + newField, err := s.mapToSlice(fieldName, field, isStrict) + if err != nil { + return fmt.Errorf("map to slice %q: %v", fieldName, err) + } + + field.Set(newField) + continue + } + + if key, err := s.GetKey(fieldName); err == nil { + delim := parseDelim(tpField.Tag.Get("delim")) + if err = setWithProperType(tpField.Type, key, field, delim, allowShadow, isStrict); err != nil { + return fmt.Errorf("set field %q: %v", fieldName, err) + } + } + } + return nil +} + +// mapToSlice maps all sections with the same name and returns the new value. +// The type of the Value must be a slice. +func (s *Section) mapToSlice(secName string, val reflect.Value, isStrict bool) (reflect.Value, error) { + secs, err := s.f.SectionsByName(secName) + if err != nil { + return reflect.Value{}, err + } + + typ := val.Type().Elem() + for i, sec := range secs { + elem := reflect.New(typ) + if err = sec.mapToField(elem, isStrict, i, sec.name); err != nil { + return reflect.Value{}, fmt.Errorf("map to field from section %q: %v", secName, err) + } + + val = reflect.Append(val, elem.Elem()) + } + return val, nil +} + +// mapTo maps a section to object v. +func (s *Section) mapTo(v interface{}, isStrict bool) error { + typ := reflect.TypeOf(v) + val := reflect.ValueOf(v) + if typ.Kind() == reflect.Ptr { + typ = typ.Elem() + val = val.Elem() + } else { + return errors.New("not a pointer to a struct") + } + + if typ.Kind() == reflect.Slice { + newField, err := s.mapToSlice(s.name, val, isStrict) + if err != nil { + return err + } + + val.Set(newField) + return nil + } + + return s.mapToField(val, isStrict, 0, s.name) +} + +// MapTo maps section to given struct. +func (s *Section) MapTo(v interface{}) error { + return s.mapTo(v, false) +} + +// StrictMapTo maps section to given struct in strict mode, +// which returns all possible error including value parsing error. +func (s *Section) StrictMapTo(v interface{}) error { + return s.mapTo(v, true) +} + +// MapTo maps file to given struct. +func (f *File) MapTo(v interface{}) error { + return f.Section("").MapTo(v) +} + +// StrictMapTo maps file to given struct in strict mode, +// which returns all possible error including value parsing error. +func (f *File) StrictMapTo(v interface{}) error { + return f.Section("").StrictMapTo(v) +} + +// MapToWithMapper maps data sources to given struct with name mapper. +func MapToWithMapper(v interface{}, mapper NameMapper, source interface{}, others ...interface{}) error { + cfg, err := Load(source, others...) + if err != nil { + return err + } + cfg.NameMapper = mapper + return cfg.MapTo(v) +} + +// StrictMapToWithMapper maps data sources to given struct with name mapper in strict mode, +// which returns all possible error including value parsing error. +func StrictMapToWithMapper(v interface{}, mapper NameMapper, source interface{}, others ...interface{}) error { + cfg, err := Load(source, others...) + if err != nil { + return err + } + cfg.NameMapper = mapper + return cfg.StrictMapTo(v) +} + +// MapTo maps data sources to given struct. +func MapTo(v, source interface{}, others ...interface{}) error { + return MapToWithMapper(v, nil, source, others...) +} + +// StrictMapTo maps data sources to given struct in strict mode, +// which returns all possible error including value parsing error. +func StrictMapTo(v, source interface{}, others ...interface{}) error { + return StrictMapToWithMapper(v, nil, source, others...) +} + +// reflectSliceWithProperType does the opposite thing as setSliceWithProperType. +func reflectSliceWithProperType(key *Key, field reflect.Value, delim string, allowShadow bool) error { + slice := field.Slice(0, field.Len()) + if field.Len() == 0 { + return nil + } + sliceOf := field.Type().Elem().Kind() + + if allowShadow { + var keyWithShadows *Key + for i := 0; i < field.Len(); i++ { + var val string + switch sliceOf { + case reflect.String: + val = slice.Index(i).String() + case reflect.Int, reflect.Int64: + val = fmt.Sprint(slice.Index(i).Int()) + case reflect.Uint, reflect.Uint64: + val = fmt.Sprint(slice.Index(i).Uint()) + case reflect.Float64: + val = fmt.Sprint(slice.Index(i).Float()) + case reflect.Bool: + val = fmt.Sprint(slice.Index(i).Bool()) + case reflectTime: + val = slice.Index(i).Interface().(time.Time).Format(time.RFC3339) + default: + return fmt.Errorf("unsupported type '[]%s'", sliceOf) + } + + if i == 0 { + keyWithShadows = newKey(key.s, key.name, val) + } else { + _ = keyWithShadows.AddShadow(val) + } + } + *key = *keyWithShadows + return nil + } + + var buf bytes.Buffer + for i := 0; i < field.Len(); i++ { + switch sliceOf { + case reflect.String: + buf.WriteString(slice.Index(i).String()) + case reflect.Int, reflect.Int64: + buf.WriteString(fmt.Sprint(slice.Index(i).Int())) + case reflect.Uint, reflect.Uint64: + buf.WriteString(fmt.Sprint(slice.Index(i).Uint())) + case reflect.Float64: + buf.WriteString(fmt.Sprint(slice.Index(i).Float())) + case reflect.Bool: + buf.WriteString(fmt.Sprint(slice.Index(i).Bool())) + case reflectTime: + buf.WriteString(slice.Index(i).Interface().(time.Time).Format(time.RFC3339)) + default: + return fmt.Errorf("unsupported type '[]%s'", sliceOf) + } + buf.WriteString(delim) + } + key.SetValue(buf.String()[:buf.Len()-len(delim)]) + return nil +} + +// reflectWithProperType does the opposite thing as setWithProperType. +func reflectWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string, allowShadow bool) error { + switch t.Kind() { + case reflect.String: + key.SetValue(field.String()) + case reflect.Bool: + key.SetValue(fmt.Sprint(field.Bool())) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + key.SetValue(fmt.Sprint(field.Int())) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + key.SetValue(fmt.Sprint(field.Uint())) + case reflect.Float32, reflect.Float64: + key.SetValue(fmt.Sprint(field.Float())) + case reflectTime: + key.SetValue(fmt.Sprint(field.Interface().(time.Time).Format(time.RFC3339))) + case reflect.Slice: + return reflectSliceWithProperType(key, field, delim, allowShadow) + case reflect.Ptr: + if !field.IsNil() { + return reflectWithProperType(t.Elem(), key, field.Elem(), delim, allowShadow) + } + default: + return fmt.Errorf("unsupported type %q", t) + } + return nil +} + +// CR: copied from encoding/json/encode.go with modifications of time.Time support. +// TODO: add more test coverage. +func isEmptyValue(v reflect.Value) bool { + switch v.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + case reflectTime: + t, ok := v.Interface().(time.Time) + return ok && t.IsZero() + } + return false +} + +// StructReflector is the interface implemented by struct types that can extract themselves into INI objects. +type StructReflector interface { + ReflectINIStruct(*File) error +} + +func (s *Section) reflectFrom(val reflect.Value) error { + if val.Kind() == reflect.Ptr { + val = val.Elem() + } + typ := val.Type() + + for i := 0; i < typ.NumField(); i++ { + if !val.Field(i).CanInterface() { + continue + } + + field := val.Field(i) + tpField := typ.Field(i) + + tag := tpField.Tag.Get("ini") + if tag == "-" { + continue + } + + rawName, omitEmpty, allowShadow, allowNonUnique, extends := parseTagOptions(tag) + if omitEmpty && isEmptyValue(field) { + continue + } + + if r, ok := field.Interface().(StructReflector); ok { + return r.ReflectINIStruct(s.f) + } + + fieldName := s.parseFieldName(tpField.Name, rawName) + if len(fieldName) == 0 || !field.CanSet() { + continue + } + + if extends && tpField.Anonymous && (tpField.Type.Kind() == reflect.Ptr || tpField.Type.Kind() == reflect.Struct) { + if err := s.reflectFrom(field); err != nil { + return fmt.Errorf("reflect from field %q: %v", fieldName, err) + } + continue + } + + if (tpField.Type.Kind() == reflect.Ptr && tpField.Type.Elem().Kind() == reflect.Struct) || + (tpField.Type.Kind() == reflect.Struct && tpField.Type.Name() != "Time") { + // Note: The only error here is section doesn't exist. + sec, err := s.f.GetSection(fieldName) + if err != nil { + // Note: fieldName can never be empty here, ignore error. + sec, _ = s.f.NewSection(fieldName) + } + + // Add comment from comment tag + if len(sec.Comment) == 0 { + sec.Comment = tpField.Tag.Get("comment") + } + + if err = sec.reflectFrom(field); err != nil { + return fmt.Errorf("reflect from field %q: %v", fieldName, err) + } + continue + } + + if allowNonUnique && tpField.Type.Kind() == reflect.Slice { + slice := field.Slice(0, field.Len()) + if field.Len() == 0 { + return nil + } + sliceOf := field.Type().Elem().Kind() + + for i := 0; i < field.Len(); i++ { + if sliceOf != reflect.Struct && sliceOf != reflect.Ptr { + return fmt.Errorf("field %q is not a slice of pointer or struct", fieldName) + } + + sec, err := s.f.NewSection(fieldName) + if err != nil { + return err + } + + // Add comment from comment tag + if len(sec.Comment) == 0 { + sec.Comment = tpField.Tag.Get("comment") + } + + if err := sec.reflectFrom(slice.Index(i)); err != nil { + return fmt.Errorf("reflect from field %q: %v", fieldName, err) + } + } + continue + } + + // Note: Same reason as section. + key, err := s.GetKey(fieldName) + if err != nil { + key, _ = s.NewKey(fieldName, "") + } + + // Add comment from comment tag + if len(key.Comment) == 0 { + key.Comment = tpField.Tag.Get("comment") + } + + delim := parseDelim(tpField.Tag.Get("delim")) + if err = reflectWithProperType(tpField.Type, key, field, delim, allowShadow); err != nil { + return fmt.Errorf("reflect field %q: %v", fieldName, err) + } + + } + return nil +} + +// ReflectFrom reflects section from given struct. It overwrites existing ones. +func (s *Section) ReflectFrom(v interface{}) error { + typ := reflect.TypeOf(v) + val := reflect.ValueOf(v) + + if s.name != DefaultSection && s.f.options.AllowNonUniqueSections && + (typ.Kind() == reflect.Slice || typ.Kind() == reflect.Ptr) { + // Clear sections to make sure none exists before adding the new ones + s.f.DeleteSection(s.name) + + if typ.Kind() == reflect.Ptr { + sec, err := s.f.NewSection(s.name) + if err != nil { + return err + } + return sec.reflectFrom(val.Elem()) + } + + slice := val.Slice(0, val.Len()) + sliceOf := val.Type().Elem().Kind() + if sliceOf != reflect.Ptr { + return fmt.Errorf("not a slice of pointers") + } + + for i := 0; i < slice.Len(); i++ { + sec, err := s.f.NewSection(s.name) + if err != nil { + return err + } + + err = sec.reflectFrom(slice.Index(i)) + if err != nil { + return fmt.Errorf("reflect from %dth field: %v", i, err) + } + } + + return nil + } + + if typ.Kind() == reflect.Ptr { + val = val.Elem() + } else { + return errors.New("not a pointer to a struct") + } + + return s.reflectFrom(val) +} + +// ReflectFrom reflects file from given struct. +func (f *File) ReflectFrom(v interface{}) error { + return f.Section("").ReflectFrom(v) +} + +// ReflectFromWithMapper reflects data sources from given struct with name mapper. +func ReflectFromWithMapper(cfg *File, v interface{}, mapper NameMapper) error { + cfg.NameMapper = mapper + return cfg.ReflectFrom(v) +} + +// ReflectFrom reflects data sources from given struct. +func ReflectFrom(cfg *File, v interface{}) error { + return ReflectFromWithMapper(cfg, v, nil) +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 04a027e81c..5197569f96 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -80,9 +80,15 @@ github.com/armon/go-socks5 # github.com/bitfield/script v0.23.0 ## explicit; go 1.18 github.com/bitfield/script +# github.com/blang/semver v3.5.1+incompatible +## explicit +github.com/blang/semver # github.com/blang/semver/v4 v4.0.0 ## explicit; go 1.14 github.com/blang/semver/v4 +# github.com/boltdb/bolt v1.3.1 +## explicit +github.com/boltdb/bolt # github.com/bytedance/sonic v1.12.3 ## explicit; go 1.17 github.com/bytedance/sonic @@ -124,6 +130,9 @@ github.com/bytedance/sonic/loader/internal/rt # github.com/ccding/go-stun/stun v0.0.0-20200514191101-4dc67bcdb029 ## explicit; go 1.14 github.com/ccding/go-stun/stun +# github.com/cenkalti/backoff v2.2.1+incompatible +## explicit +github.com/cenkalti/backoff # github.com/cespare/xxhash v1.1.0 ## explicit github.com/cespare/xxhash @@ -157,7 +166,7 @@ github.com/containerd/console # github.com/creack/pty v1.1.23 ## explicit; go 1.18 github.com/creack/pty -# github.com/davecgh/go-spew v1.1.1 +# github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc ## explicit github.com/davecgh/go-spew/spew # github.com/dgraph-io/badger/v3 v3.2103.2 @@ -194,11 +203,12 @@ github.com/elazarl/goproxy # github.com/eliukblau/pixterm/pkg/ansimage v0.0.0-20191210081756-9fb6cf8c2f75 ## explicit; go 1.13 github.com/eliukblau/pixterm/pkg/ansimage -# github.com/fatih/color v1.17.0 +# github.com/fatih/color v1.18.0 ## explicit; go 1.17 github.com/fatih/color -# github.com/fsnotify/fsnotify v1.6.0 -## explicit; go 1.16 +# github.com/fsnotify/fsnotify v1.7.0 +## explicit; go 1.17 +github.com/fsnotify/fsnotify # github.com/gabriel-vasile/mimetype v1.4.6 ## explicit; go 1.20 github.com/gabriel-vasile/mimetype @@ -330,6 +340,18 @@ github.com/gorilla/securecookie # github.com/hashicorp/go-version v1.7.0 ## explicit github.com/hashicorp/go-version +# github.com/hashicorp/hcl v1.0.0 +## explicit +github.com/hashicorp/hcl +github.com/hashicorp/hcl/hcl/ast +github.com/hashicorp/hcl/hcl/parser +github.com/hashicorp/hcl/hcl/printer +github.com/hashicorp/hcl/hcl/scanner +github.com/hashicorp/hcl/hcl/strconv +github.com/hashicorp/hcl/hcl/token +github.com/hashicorp/hcl/json/parser +github.com/hashicorp/hcl/json/scanner +github.com/hashicorp/hcl/json/token # github.com/hashicorp/yamux v0.1.2 ## explicit; go 1.20 github.com/hashicorp/yamux @@ -440,6 +462,9 @@ github.com/lithammer/fuzzysearch/fuzzy # github.com/lucasb-eyer/go-colorful v1.2.0 ## explicit; go 1.12 github.com/lucasb-eyer/go-colorful +# github.com/magiconair/properties v1.8.7 +## explicit; go 1.19 +github.com/magiconair/properties # github.com/mattn/go-colorable v0.1.13 ## explicit; go 1.15 github.com/mattn/go-colorable @@ -455,6 +480,9 @@ github.com/mgutz/ansi # github.com/mitchellh/go-homedir v1.1.0 ## explicit github.com/mitchellh/go-homedir +# github.com/mitchellh/mapstructure v1.5.0 +## explicit; go 1.14 +github.com/mitchellh/mapstructure # github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd ## explicit github.com/modern-go/concurrent @@ -495,7 +523,7 @@ github.com/pires/go-proxyproto # github.com/pkg/errors v0.9.1 ## explicit github.com/pkg/errors -# github.com/pmezard/go-difflib v1.0.0 +# github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 ## explicit github.com/pmezard/go-difflib/difflib # github.com/pterm/pterm v0.12.79 @@ -529,6 +557,15 @@ github.com/robert-nix/ansihtml ## explicit; go 1.13 github.com/rs/cors github.com/rs/cors/internal +# github.com/sagikazarmark/locafero v0.6.0 +## explicit; go 1.20 +github.com/sagikazarmark/locafero +# github.com/sagikazarmark/slog-shim v0.1.0 +## explicit; go 1.20 +github.com/sagikazarmark/slog-shim +# github.com/shopspring/decimal v1.4.0 +## explicit; go 1.10 +github.com/shopspring/decimal # github.com/sirupsen/logrus v1.9.3 ## explicit; go 1.13 github.com/sirupsen/logrus @@ -568,14 +605,65 @@ github.com/skycoin/dmsg/pkg/noise # github.com/skycoin/noise v0.0.0-20180327030543-2492fe189ae6 ## explicit github.com/skycoin/noise -# github.com/skycoin/skycoin v0.28.0 -## explicit; go 1.14 +# github.com/skycoin/skycoin v0.28.1-0.20241104170131-96e4203814d4 +## explicit; go 1.22.0 +github.com/skycoin/skycoin +github.com/skycoin/skycoin/cmd/newcoin/commands +github.com/skycoin/skycoin/cmd/skycoin-cli/commands +github.com/skycoin/skycoin/cmd/skycoin-wallet/commands +github.com/skycoin/skycoin/cmd/skycoin/commands +github.com/skycoin/skycoin/src/api github.com/skycoin/skycoin/src/cipher github.com/skycoin/skycoin/src/cipher/base58 +github.com/skycoin/skycoin/src/cipher/bip32 +github.com/skycoin/skycoin/src/cipher/bip39 +github.com/skycoin/skycoin/src/cipher/bip39/wordlists +github.com/skycoin/skycoin/src/cipher/bip44 +github.com/skycoin/skycoin/src/cipher/chacha20poly1305 +github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20 +github.com/skycoin/skycoin/src/cipher/crypto +github.com/skycoin/skycoin/src/cipher/encoder +github.com/skycoin/skycoin/src/cipher/encrypt +github.com/skycoin/skycoin/src/cipher/pbkdf2 +github.com/skycoin/skycoin/src/cipher/poly1305 github.com/skycoin/skycoin/src/cipher/ripemd160 +github.com/skycoin/skycoin/src/cipher/scrypt github.com/skycoin/skycoin/src/cipher/secp256k1-go github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2 +github.com/skycoin/skycoin/src/cli +github.com/skycoin/skycoin/src/coin +github.com/skycoin/skycoin/src/daemon +github.com/skycoin/skycoin/src/daemon/gnet +github.com/skycoin/skycoin/src/daemon/pex +github.com/skycoin/skycoin/src/daemon/strand +github.com/skycoin/skycoin/src/fiber +github.com/skycoin/skycoin/src/kvstorage +github.com/skycoin/skycoin/src/params +github.com/skycoin/skycoin/src/readable +github.com/skycoin/skycoin/src/skycoin +github.com/skycoin/skycoin/src/transaction +github.com/skycoin/skycoin/src/util/apputil +github.com/skycoin/skycoin/src/util/certutil +github.com/skycoin/skycoin/src/util/droplet +github.com/skycoin/skycoin/src/util/elapse +github.com/skycoin/skycoin/src/util/fee +github.com/skycoin/skycoin/src/util/file +github.com/skycoin/skycoin/src/util/gziphandler +github.com/skycoin/skycoin/src/util/http +github.com/skycoin/skycoin/src/util/iputil github.com/skycoin/skycoin/src/util/logging +github.com/skycoin/skycoin/src/util/mathutil +github.com/skycoin/skycoin/src/util/timeutil +github.com/skycoin/skycoin/src/util/useragent +github.com/skycoin/skycoin/src/visor +github.com/skycoin/skycoin/src/visor/blockdb +github.com/skycoin/skycoin/src/visor/dbutil +github.com/skycoin/skycoin/src/visor/historydb +github.com/skycoin/skycoin/src/wallet +github.com/skycoin/skycoin/src/wallet/bip44wallet +github.com/skycoin/skycoin/src/wallet/collection +github.com/skycoin/skycoin/src/wallet/deterministic +github.com/skycoin/skycoin/src/wallet/xpubwallet # github.com/skycoin/skycoin-service-discovery v1.3.29-0.20241019190420-233c2d68bce0 ## explicit; go 1.22.0 github.com/skycoin/skycoin-service-discovery/cmd/service-discovery/commands @@ -634,12 +722,38 @@ github.com/skycoin/systray/internal/generated/notifier # github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8 ## explicit github.com/songgao/water +# github.com/sourcegraph/conc v0.3.0 +## explicit; go 1.19 +github.com/sourcegraph/conc +github.com/sourcegraph/conc/internal/multierror +github.com/sourcegraph/conc/iter +github.com/sourcegraph/conc/panics +# github.com/spf13/afero v1.11.0 +## explicit; go 1.19 +github.com/spf13/afero +github.com/spf13/afero/internal/common +github.com/spf13/afero/mem +# github.com/spf13/cast v1.7.0 +## explicit; go 1.19 +github.com/spf13/cast # github.com/spf13/cobra v1.8.1 ## explicit; go 1.15 github.com/spf13/cobra # github.com/spf13/pflag v1.0.5 ## explicit; go 1.12 github.com/spf13/pflag +# github.com/spf13/viper v1.19.0 +## explicit; go 1.20 +github.com/spf13/viper +github.com/spf13/viper/internal/encoding +github.com/spf13/viper/internal/encoding/dotenv +github.com/spf13/viper/internal/encoding/hcl +github.com/spf13/viper/internal/encoding/ini +github.com/spf13/viper/internal/encoding/javaproperties +github.com/spf13/viper/internal/encoding/json +github.com/spf13/viper/internal/encoding/toml +github.com/spf13/viper/internal/encoding/yaml +github.com/spf13/viper/internal/features # github.com/stretchr/objx v0.5.2 ## explicit; go 1.20 github.com/stretchr/objx @@ -648,6 +762,9 @@ github.com/stretchr/objx github.com/stretchr/testify/assert github.com/stretchr/testify/mock github.com/stretchr/testify/require +# github.com/subosito/gotenv v1.6.0 +## explicit; go 1.18 +github.com/subosito/gotenv # github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 ## explicit github.com/syndtr/gocapability/capability @@ -731,6 +848,9 @@ go.opencensus.io/trace/tracestate ## explicit; go 1.22 go.uber.org/mock/mockgen go.uber.org/mock/mockgen/model +# go.uber.org/multierr v1.11.0 +## explicit; go 1.19 +go.uber.org/multierr # golang.org/x/arch v0.11.0 ## explicit; go 1.18 golang.org/x/arch/x86/x86asm @@ -756,7 +876,12 @@ golang.org/x/crypto/twofish golang.org/x/crypto/xtea # golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c ## explicit; go 1.22.0 +golang.org/x/exp/constraints golang.org/x/exp/rand +golang.org/x/exp/slices +golang.org/x/exp/slog +golang.org/x/exp/slog/internal +golang.org/x/exp/slog/internal/buffer # golang.org/x/image v0.21.0 ## explicit; go 1.18 golang.org/x/image/bmp @@ -810,10 +935,15 @@ golang.org/x/term # golang.org/x/text v0.19.0 ## explicit; go 1.18 golang.org/x/text/cases +golang.org/x/text/encoding +golang.org/x/text/encoding/internal +golang.org/x/text/encoding/internal/identifier +golang.org/x/text/encoding/unicode golang.org/x/text/internal golang.org/x/text/internal/language golang.org/x/text/internal/language/compact golang.org/x/text/internal/tag +golang.org/x/text/internal/utf8internal golang.org/x/text/language golang.org/x/text/runes golang.org/x/text/secure/bidirule @@ -888,6 +1018,9 @@ google.golang.org/protobuf/runtime/protoiface google.golang.org/protobuf/runtime/protoimpl google.golang.org/protobuf/types/descriptorpb google.golang.org/protobuf/types/gofeaturespb +# gopkg.in/ini.v1 v1.67.0 +## explicit +gopkg.in/ini.v1 # gopkg.in/natefinch/lumberjack.v2 v2.2.1 ## explicit; go 1.13 gopkg.in/natefinch/lumberjack.v2 From 16b69f56376e28858392ab9ee845002234d599d2 Mon Sep 17 00:00:00 2001 From: Moses Narrow Date: Tue, 5 Nov 2024 06:48:38 -0600 Subject: [PATCH 2/4] update skywire-services dep ; update Makefile --- Makefile | 2 +- go.mod | 14 +- go.sum | 50 +- vendor/github.com/cespare/xxhash/LICENSE.txt | 22 - vendor/github.com/cespare/xxhash/README.md | 50 - vendor/github.com/cespare/xxhash/rotate.go | 14 - vendor/github.com/cespare/xxhash/rotate19.go | 14 - vendor/github.com/cespare/xxhash/xxhash.go | 168 - .../github.com/cespare/xxhash/xxhash_amd64.go | 12 - .../github.com/cespare/xxhash/xxhash_amd64.s | 233 - .../github.com/cespare/xxhash/xxhash_other.go | 75 - .../github.com/cespare/xxhash/xxhash_safe.go | 10 - .../cespare/xxhash/xxhash_unsafe.go | 30 - .../dgraph-io/badger/v3/.deepsource.toml | 18 - .../github.com/dgraph-io/badger/v3/.gitignore | 5 - .../dgraph-io/badger/v3/.golangci.yml | 27 - .../dgraph-io/badger/v3/.travis.yml | 48 - .../dgraph-io/badger/v3/CHANGELOG.md | 645 -- .../dgraph-io/badger/v3/CODE_OF_CONDUCT.md | 5 - .../dgraph-io/badger/v3/CONTRIBUTING.md | 107 - vendor/github.com/dgraph-io/badger/v3/LICENSE | 176 - .../github.com/dgraph-io/badger/v3/README.md | 203 - .../dgraph-io/badger/v3/VERSIONING.md | 47 - .../dgraph-io/badger/v3/appveyor.yml | 49 - .../github.com/dgraph-io/badger/v3/backup.go | 289 - .../github.com/dgraph-io/badger/v3/batch.go | 245 - .../github.com/dgraph-io/badger/v3/changes.sh | 18 - .../dgraph-io/badger/v3/compaction.go | 249 - vendor/github.com/dgraph-io/badger/v3/db.go | 2058 ------ .../dgraph-io/badger/v3/dir_plan9.go | 150 - .../dgraph-io/badger/v3/dir_unix.go | 118 - .../dgraph-io/badger/v3/dir_windows.go | 110 - .../github.com/dgraph-io/badger/v3/discard.go | 168 - vendor/github.com/dgraph-io/badger/v3/doc.go | 28 - .../github.com/dgraph-io/badger/v3/errors.go | 126 - .../dgraph-io/badger/v3/fb/BlockOffset.go | 104 - .../dgraph-io/badger/v3/fb/TableIndex.go | 175 - .../dgraph-io/badger/v3/fb/flatbuffer.fbs | 36 - .../github.com/dgraph-io/badger/v3/fb/gen.sh | 12 - .../badger/v3/fb/install_flatbuffers.sh | 47 - .../dgraph-io/badger/v3/histogram.go | 169 - .../dgraph-io/badger/v3/iterator.go | 788 --- .../dgraph-io/badger/v3/key_registry.go | 424 -- .../dgraph-io/badger/v3/level_handler.go | 353 - .../github.com/dgraph-io/badger/v3/levels.go | 1761 ----- .../github.com/dgraph-io/badger/v3/logger.go | 105 - .../dgraph-io/badger/v3/managed_db.go | 89 - .../dgraph-io/badger/v3/manifest.go | 475 -- .../dgraph-io/badger/v3/memtable.go | 633 -- .../github.com/dgraph-io/badger/v3/merge.go | 181 - .../github.com/dgraph-io/badger/v3/options.go | 791 --- .../dgraph-io/badger/v3/options/options.go | 44 - .../dgraph-io/badger/v3/pb/badgerpb3.pb.go | 2164 ------- .../dgraph-io/badger/v3/pb/badgerpb3.proto | 86 - .../github.com/dgraph-io/badger/v3/pb/gen.sh | 8 - .../dgraph-io/badger/v3/publisher.go | 177 - .../dgraph-io/badger/v3/skl/README.md | 113 - .../dgraph-io/badger/v3/skl/arena.go | 135 - .../github.com/dgraph-io/badger/v3/skl/skl.go | 524 -- .../github.com/dgraph-io/badger/v3/stream.go | 491 -- .../dgraph-io/badger/v3/stream_writer.go | 459 -- .../github.com/dgraph-io/badger/v3/structs.go | 225 - .../dgraph-io/badger/v3/table/README.md | 108 - .../dgraph-io/badger/v3/table/builder.go | 591 -- .../dgraph-io/badger/v3/table/iterator.go | 568 -- .../badger/v3/table/merge_iterator.go | 231 - .../dgraph-io/badger/v3/table/table.go | 842 --- vendor/github.com/dgraph-io/badger/v3/test.sh | 120 - .../dgraph-io/badger/v3/trie/trie.go | 262 - vendor/github.com/dgraph-io/badger/v3/txn.go | 827 --- vendor/github.com/dgraph-io/badger/v3/util.go | 117 - .../github.com/dgraph-io/badger/v3/value.go | 1193 ---- .../github.com/dgraph-io/badger/v3/y/bloom.go | 170 - .../dgraph-io/badger/v3/y/checksum.go | 50 - .../dgraph-io/badger/v3/y/encrypt.go | 67 - .../github.com/dgraph-io/badger/v3/y/error.go | 86 - .../dgraph-io/badger/v3/y/event_log.go | 31 - .../dgraph-io/badger/v3/y/file_dsync.go | 25 - .../dgraph-io/badger/v3/y/file_nodsync.go | 25 - .../dgraph-io/badger/v3/y/iterator.go | 95 - .../dgraph-io/badger/v3/y/metrics.go | 169 - .../dgraph-io/badger/v3/y/watermark.go | 240 - vendor/github.com/dgraph-io/badger/v3/y/y.go | 582 -- .../github.com/dgraph-io/badger/v3/y/zstd.go | 64 - .../dgraph-io/ristretto/.deepsource.toml | 17 - .../dgraph-io/ristretto/CHANGELOG.md | 172 - vendor/github.com/dgraph-io/ristretto/LICENSE | 176 - .../github.com/dgraph-io/ristretto/README.md | 220 - .../github.com/dgraph-io/ristretto/cache.go | 719 --- .../github.com/dgraph-io/ristretto/policy.go | 423 -- vendor/github.com/dgraph-io/ristretto/ring.go | 91 - .../github.com/dgraph-io/ristretto/sketch.go | 155 - .../github.com/dgraph-io/ristretto/store.go | 242 - vendor/github.com/dgraph-io/ristretto/test.sh | 20 - vendor/github.com/dgraph-io/ristretto/ttl.go | 147 - .../github.com/dgraph-io/ristretto/z/LICENSE | 64 - .../dgraph-io/ristretto/z/README.md | 129 - .../dgraph-io/ristretto/z/allocator.go | 403 -- .../dgraph-io/ristretto/z/bbloom.go | 211 - .../github.com/dgraph-io/ristretto/z/btree.go | 710 -- .../dgraph-io/ristretto/z/buffer.go | 544 -- .../dgraph-io/ristretto/z/calloc.go | 42 - .../dgraph-io/ristretto/z/calloc_32bit.go | 14 - .../dgraph-io/ristretto/z/calloc_64bit.go | 14 - .../dgraph-io/ristretto/z/calloc_jemalloc.go | 172 - .../ristretto/z/calloc_nojemalloc.go | 37 - .../github.com/dgraph-io/ristretto/z/file.go | 217 - .../dgraph-io/ristretto/z/file_default.go | 39 - .../dgraph-io/ristretto/z/file_linux.go | 37 - .../github.com/dgraph-io/ristretto/z/flags.go | 311 - .../dgraph-io/ristretto/z/histogram.go | 205 - .../github.com/dgraph-io/ristretto/z/mmap.go | 44 - .../dgraph-io/ristretto/z/mmap_darwin.go | 59 - .../dgraph-io/ristretto/z/mmap_linux.go | 101 - .../dgraph-io/ristretto/z/mmap_plan9.go | 44 - .../dgraph-io/ristretto/z/mmap_unix.go | 55 - .../dgraph-io/ristretto/z/mmap_windows.go | 96 - .../dgraph-io/ristretto/z/rtutil.go | 75 - .../github.com/dgraph-io/ristretto/z/rtutil.s | 0 .../dgraph-io/ristretto/z/simd/baseline.go | 127 - .../dgraph-io/ristretto/z/simd/search.go | 51 - .../dgraph-io/ristretto/z/simd/search_amd64.s | 60 - .../ristretto/z/simd/stub_search_amd64.go | 6 - vendor/github.com/dgraph-io/ristretto/z/z.go | 151 - .../github.com/dustin/go-humanize/.travis.yml | 21 - vendor/github.com/dustin/go-humanize/LICENSE | 21 - .../dustin/go-humanize/README.markdown | 124 - vendor/github.com/dustin/go-humanize/big.go | 31 - .../github.com/dustin/go-humanize/bigbytes.go | 189 - vendor/github.com/dustin/go-humanize/bytes.go | 143 - vendor/github.com/dustin/go-humanize/comma.go | 116 - .../github.com/dustin/go-humanize/commaf.go | 41 - vendor/github.com/dustin/go-humanize/ftoa.go | 49 - .../github.com/dustin/go-humanize/humanize.go | 8 - .../github.com/dustin/go-humanize/number.go | 192 - .../github.com/dustin/go-humanize/ordinals.go | 25 - vendor/github.com/dustin/go-humanize/si.go | 127 - vendor/github.com/dustin/go-humanize/times.go | 117 - vendor/github.com/gogo/protobuf/AUTHORS | 15 - vendor/github.com/gogo/protobuf/CONTRIBUTORS | 23 - vendor/github.com/gogo/protobuf/LICENSE | 35 - .../github.com/gogo/protobuf/proto/Makefile | 43 - .../github.com/gogo/protobuf/proto/clone.go | 258 - .../gogo/protobuf/proto/custom_gogo.go | 39 - .../github.com/gogo/protobuf/proto/decode.go | 427 -- .../gogo/protobuf/proto/deprecated.go | 63 - .../github.com/gogo/protobuf/proto/discard.go | 350 - .../gogo/protobuf/proto/duration.go | 100 - .../gogo/protobuf/proto/duration_gogo.go | 49 - .../github.com/gogo/protobuf/proto/encode.go | 205 - .../gogo/protobuf/proto/encode_gogo.go | 33 - .../github.com/gogo/protobuf/proto/equal.go | 300 - .../gogo/protobuf/proto/extensions.go | 605 -- .../gogo/protobuf/proto/extensions_gogo.go | 389 -- vendor/github.com/gogo/protobuf/proto/lib.go | 973 --- .../gogo/protobuf/proto/lib_gogo.go | 50 - .../gogo/protobuf/proto/message_set.go | 181 - .../gogo/protobuf/proto/pointer_reflect.go | 357 - .../protobuf/proto/pointer_reflect_gogo.go | 59 - .../gogo/protobuf/proto/pointer_unsafe.go | 308 - .../protobuf/proto/pointer_unsafe_gogo.go | 56 - .../gogo/protobuf/proto/properties.go | 610 -- .../gogo/protobuf/proto/properties_gogo.go | 36 - .../gogo/protobuf/proto/skip_gogo.go | 119 - .../gogo/protobuf/proto/table_marshal.go | 3009 --------- .../gogo/protobuf/proto/table_marshal_gogo.go | 388 -- .../gogo/protobuf/proto/table_merge.go | 676 -- .../gogo/protobuf/proto/table_unmarshal.go | 2249 ------- .../protobuf/proto/table_unmarshal_gogo.go | 385 -- vendor/github.com/gogo/protobuf/proto/text.go | 930 --- .../gogo/protobuf/proto/text_gogo.go | 57 - .../gogo/protobuf/proto/text_parser.go | 1018 --- .../gogo/protobuf/proto/timestamp.go | 113 - .../gogo/protobuf/proto/timestamp_gogo.go | 49 - .../gogo/protobuf/proto/wrappers.go | 1888 ------ .../gogo/protobuf/proto/wrappers_gogo.go | 113 - vendor/github.com/golang/glog/LICENSE | 191 - vendor/github.com/golang/glog/README | 44 - vendor/github.com/golang/glog/glog.go | 1180 ---- vendor/github.com/golang/glog/glog_file.go | 124 - vendor/github.com/golang/groupcache/LICENSE | 191 - .../github.com/golang/groupcache/lru/lru.go | 133 - vendor/github.com/golang/protobuf/AUTHORS | 3 - .../github.com/golang/protobuf/CONTRIBUTORS | 3 - vendor/github.com/golang/protobuf/LICENSE | 28 - .../golang/protobuf/proto/buffer.go | 324 - .../golang/protobuf/proto/defaults.go | 63 - .../golang/protobuf/proto/deprecated.go | 113 - .../golang/protobuf/proto/discard.go | 58 - .../golang/protobuf/proto/extensions.go | 356 - .../golang/protobuf/proto/properties.go | 306 - .../github.com/golang/protobuf/proto/proto.go | 167 - .../golang/protobuf/proto/registry.go | 317 - .../golang/protobuf/proto/text_decode.go | 801 --- .../golang/protobuf/proto/text_encode.go | 560 -- .../github.com/golang/protobuf/proto/wire.go | 78 - .../golang/protobuf/proto/wrappers.go | 34 - vendor/github.com/golang/snappy/.gitignore | 16 - vendor/github.com/golang/snappy/AUTHORS | 18 - vendor/github.com/golang/snappy/CONTRIBUTORS | 41 - vendor/github.com/golang/snappy/LICENSE | 27 - vendor/github.com/golang/snappy/README | 107 - vendor/github.com/golang/snappy/decode.go | 264 - .../github.com/golang/snappy/decode_amd64.s | 490 -- .../github.com/golang/snappy/decode_arm64.s | 494 -- vendor/github.com/golang/snappy/decode_asm.go | 15 - .../github.com/golang/snappy/decode_other.go | 115 - vendor/github.com/golang/snappy/encode.go | 289 - .../github.com/golang/snappy/encode_amd64.s | 730 --- .../github.com/golang/snappy/encode_arm64.s | 722 --- vendor/github.com/golang/snappy/encode_asm.go | 30 - .../github.com/golang/snappy/encode_other.go | 238 - vendor/github.com/golang/snappy/snappy.go | 98 - vendor/github.com/google/flatbuffers/LICENSE | 202 - .../google/flatbuffers/go/BUILD.bazel | 23 - .../google/flatbuffers/go/builder.go | 856 --- .../github.com/google/flatbuffers/go/doc.go | 3 - .../google/flatbuffers/go/encode.go | 238 - .../github.com/google/flatbuffers/go/grpc.go | 38 - .../github.com/google/flatbuffers/go/lib.go | 50 - .../github.com/google/flatbuffers/go/sizes.go | 55 - .../google/flatbuffers/go/struct.go | 8 - .../github.com/google/flatbuffers/go/table.go | 505 -- .../klauspost/compress/.gitattributes | 2 - .../github.com/klauspost/compress/.gitignore | 32 - .../klauspost/compress/.goreleaser.yml | 123 - vendor/github.com/klauspost/compress/LICENSE | 304 - .../github.com/klauspost/compress/README.md | 721 --- .../github.com/klauspost/compress/SECURITY.md | 25 - .../klauspost/compress/compressible.go | 85 - .../klauspost/compress/fse/README.md | 79 - .../klauspost/compress/fse/bitreader.go | 122 - .../klauspost/compress/fse/bitwriter.go | 167 - .../klauspost/compress/fse/bytereader.go | 47 - .../klauspost/compress/fse/compress.go | 683 -- .../klauspost/compress/fse/decompress.go | 376 -- .../github.com/klauspost/compress/fse/fse.go | 144 - vendor/github.com/klauspost/compress/gen.sh | 4 - .../klauspost/compress/huff0/.gitignore | 1 - .../klauspost/compress/huff0/README.md | 89 - .../klauspost/compress/huff0/bitreader.go | 229 - .../klauspost/compress/huff0/bitwriter.go | 102 - .../klauspost/compress/huff0/compress.go | 742 --- .../klauspost/compress/huff0/decompress.go | 1167 ---- .../compress/huff0/decompress_amd64.go | 226 - .../compress/huff0/decompress_amd64.s | 830 --- .../compress/huff0/decompress_generic.go | 299 - .../klauspost/compress/huff0/huff0.go | 337 - .../compress/internal/cpuinfo/cpuinfo.go | 34 - .../internal/cpuinfo/cpuinfo_amd64.go | 11 - .../compress/internal/cpuinfo/cpuinfo_amd64.s | 36 - .../compress/internal/snapref/LICENSE | 27 - .../compress/internal/snapref/decode.go | 264 - .../compress/internal/snapref/decode_other.go | 113 - .../compress/internal/snapref/encode.go | 289 - .../compress/internal/snapref/encode_other.go | 250 - .../compress/internal/snapref/snappy.go | 98 - vendor/github.com/klauspost/compress/s2sx.mod | 4 - vendor/github.com/klauspost/compress/s2sx.sum | 0 .../klauspost/compress/zstd/README.md | 441 -- .../klauspost/compress/zstd/bitreader.go | 136 - .../klauspost/compress/zstd/bitwriter.go | 112 - .../klauspost/compress/zstd/blockdec.go | 731 --- .../klauspost/compress/zstd/blockenc.go | 909 --- .../compress/zstd/blocktype_string.go | 85 - .../klauspost/compress/zstd/bytebuf.go | 131 - .../klauspost/compress/zstd/bytereader.go | 82 - .../klauspost/compress/zstd/decodeheader.go | 261 - .../klauspost/compress/zstd/decoder.go | 948 --- .../compress/zstd/decoder_options.go | 169 - .../klauspost/compress/zstd/dict.go | 565 -- .../klauspost/compress/zstd/enc_base.go | 173 - .../klauspost/compress/zstd/enc_best.go | 560 -- .../klauspost/compress/zstd/enc_better.go | 1252 ---- .../klauspost/compress/zstd/enc_dfast.go | 1123 ---- .../klauspost/compress/zstd/enc_fast.go | 891 --- .../klauspost/compress/zstd/encoder.go | 642 -- .../compress/zstd/encoder_options.go | 339 - .../klauspost/compress/zstd/framedec.go | 415 -- .../klauspost/compress/zstd/frameenc.go | 137 - .../klauspost/compress/zstd/fse_decoder.go | 307 - .../compress/zstd/fse_decoder_amd64.go | 65 - .../compress/zstd/fse_decoder_amd64.s | 126 - .../compress/zstd/fse_decoder_generic.go | 73 - .../klauspost/compress/zstd/fse_encoder.go | 701 -- .../klauspost/compress/zstd/fse_predefined.go | 158 - .../klauspost/compress/zstd/hash.go | 35 - .../klauspost/compress/zstd/history.go | 116 - .../compress/zstd/internal/xxhash/LICENSE.txt | 22 - .../compress/zstd/internal/xxhash/README.md | 71 - .../compress/zstd/internal/xxhash/xxhash.go | 230 - .../zstd/internal/xxhash/xxhash_amd64.s | 210 - .../zstd/internal/xxhash/xxhash_arm64.s | 184 - .../zstd/internal/xxhash/xxhash_asm.go | 16 - .../zstd/internal/xxhash/xxhash_other.go | 76 - .../zstd/internal/xxhash/xxhash_safe.go | 11 - .../klauspost/compress/zstd/matchlen_amd64.go | 16 - .../klauspost/compress/zstd/matchlen_amd64.s | 66 - .../compress/zstd/matchlen_generic.go | 33 - .../klauspost/compress/zstd/seqdec.go | 503 -- .../klauspost/compress/zstd/seqdec_amd64.go | 394 -- .../klauspost/compress/zstd/seqdec_amd64.s | 4151 ------------ .../klauspost/compress/zstd/seqdec_generic.go | 237 - .../klauspost/compress/zstd/seqenc.go | 114 - .../klauspost/compress/zstd/snappy.go | 434 -- .../github.com/klauspost/compress/zstd/zip.go | 141 - .../klauspost/compress/zstd/zstd.go | 125 - .../cmd/node-visualizer/commands/root.go | 100 - .../cmd/skywire-services/commands/root.go | 3 - .../pkg/node-visualizer/api/api.go | 270 - .../api/build/asset-manifest.json | 26 - .../pkg/node-visualizer/api/build/favicon.ico | Bin 3870 -> 0 bytes .../pkg/node-visualizer/api/build/favicon.svg | 2 - .../pkg/node-visualizer/api/build/index.html | 1 - .../pkg/node-visualizer/api/build/logo192.png | Bin 5347 -> 0 bytes .../pkg/node-visualizer/api/build/logo512.png | Bin 9664 -> 0 bytes .../node-visualizer/api/build/manifest.json | 25 - .../pkg/node-visualizer/api/build/robots.txt | 3 - .../api/build/static/css/2.da98c186.chunk.css | 2 - .../build/static/css/2.da98c186.chunk.css.map | 1 - .../build/static/css/main.08a4014d.chunk.css | 2 - .../static/css/main.08a4014d.chunk.css.map | 1 - .../api/build/static/js/2.5879b560.chunk.js | 3 - .../static/js/2.5879b560.chunk.js.LICENSE.txt | 64 - .../build/static/js/2.5879b560.chunk.js.map | 1 - .../api/build/static/js/3.c05a463d.chunk.js | 2 - .../build/static/js/3.c05a463d.chunk.js.map | 1 - .../build/static/js/main.588f2c65.chunk.js | 2 - .../static/js/main.588f2c65.chunk.js.map | 1 - .../build/static/js/runtime-main.21703e9e.js | 2 - .../static/js/runtime-main.21703e9e.js.map | 1 - .../build/static/media/marker.8a6e5ca6.svg | 1 - .../pkg/node-visualizer/api/store.go | 115 - vendor/go.opencensus.io/.gitignore | 9 - vendor/go.opencensus.io/AUTHORS | 1 - vendor/go.opencensus.io/CONTRIBUTING.md | 63 - vendor/go.opencensus.io/LICENSE | 202 - vendor/go.opencensus.io/Makefile | 97 - vendor/go.opencensus.io/README.md | 267 - vendor/go.opencensus.io/appveyor.yml | 24 - vendor/go.opencensus.io/internal/internal.go | 37 - vendor/go.opencensus.io/internal/sanitize.go | 50 - .../internal/traceinternals.go | 53 - vendor/go.opencensus.io/opencensus.go | 21 - vendor/go.opencensus.io/trace/basetypes.go | 129 - vendor/go.opencensus.io/trace/config.go | 86 - vendor/go.opencensus.io/trace/doc.go | 52 - vendor/go.opencensus.io/trace/evictedqueue.go | 38 - vendor/go.opencensus.io/trace/export.go | 97 - .../trace/internal/internal.go | 22 - vendor/go.opencensus.io/trace/lrumap.go | 61 - vendor/go.opencensus.io/trace/sampling.go | 75 - vendor/go.opencensus.io/trace/spanbucket.go | 130 - vendor/go.opencensus.io/trace/spanstore.go | 308 - vendor/go.opencensus.io/trace/status_codes.go | 37 - vendor/go.opencensus.io/trace/trace.go | 595 -- vendor/go.opencensus.io/trace/trace_api.go | 265 - vendor/go.opencensus.io/trace/trace_go11.go | 33 - .../go.opencensus.io/trace/trace_nongo11.go | 26 - .../trace/tracestate/tracestate.go | 147 - .../x/net/internal/timeseries/timeseries.go | 525 -- vendor/golang.org/x/net/trace/events.go | 532 -- vendor/golang.org/x/net/trace/histogram.go | 365 -- vendor/golang.org/x/net/trace/trace.go | 1130 ---- .../protobuf/encoding/prototext/decode.go | 772 --- .../protobuf/encoding/prototext/doc.go | 7 - .../protobuf/encoding/prototext/encode.go | 380 -- .../protobuf/internal/descfmt/stringer.go | 414 -- .../protobuf/internal/descopts/options.go | 29 - .../internal/editiondefaults/defaults.go | 12 - .../editiondefaults/editions_defaults.binpb | Bin 93 -> 0 bytes .../internal/editionssupport/editions.go | 13 - .../internal/encoding/defval/default.go | 213 - .../protobuf/internal/encoding/tag/tag.go | 207 - .../protobuf/internal/encoding/text/decode.go | 686 -- .../internal/encoding/text/decode_number.go | 211 - .../internal/encoding/text/decode_string.go | 161 - .../internal/encoding/text/decode_token.go | 373 -- .../protobuf/internal/encoding/text/doc.go | 29 - .../protobuf/internal/encoding/text/encode.go | 272 - .../protobuf/internal/filedesc/build.go | 157 - .../protobuf/internal/filedesc/desc.go | 737 --- .../protobuf/internal/filedesc/desc_init.go | 560 -- .../protobuf/internal/filedesc/desc_lazy.go | 703 -- .../protobuf/internal/filedesc/desc_list.go | 457 -- .../internal/filedesc/desc_list_gen.go | 367 -- .../protobuf/internal/filedesc/editions.go | 156 - .../protobuf/internal/filedesc/placeholder.go | 110 - .../protobuf/internal/filetype/build.go | 296 - .../protobuf/internal/impl/api_export.go | 177 - .../protobuf/internal/impl/checkinit.go | 141 - .../protobuf/internal/impl/codec_extension.go | 228 - .../protobuf/internal/impl/codec_field.go | 863 --- .../protobuf/internal/impl/codec_gen.go | 5724 ----------------- .../protobuf/internal/impl/codec_map.go | 399 -- .../protobuf/internal/impl/codec_map_go111.go | 38 - .../protobuf/internal/impl/codec_map_go112.go | 12 - .../protobuf/internal/impl/codec_message.go | 220 - .../internal/impl/codec_messageset.go | 145 - .../protobuf/internal/impl/codec_tables.go | 557 -- .../protobuf/internal/impl/codec_unsafe.go | 15 - .../protobuf/internal/impl/convert.go | 495 -- .../protobuf/internal/impl/convert_list.go | 141 - .../protobuf/internal/impl/convert_map.go | 121 - .../protobuf/internal/impl/decode.go | 285 - .../protobuf/internal/impl/encode.go | 237 - .../protobuf/internal/impl/enum.go | 21 - .../protobuf/internal/impl/equal.go | 224 - .../protobuf/internal/impl/extension.go | 156 - .../protobuf/internal/impl/legacy_enum.go | 219 - .../protobuf/internal/impl/legacy_export.go | 92 - .../internal/impl/legacy_extension.go | 177 - .../protobuf/internal/impl/legacy_file.go | 81 - .../protobuf/internal/impl/legacy_message.go | 572 -- .../protobuf/internal/impl/merge.go | 176 - .../protobuf/internal/impl/merge_gen.go | 209 - .../protobuf/internal/impl/message.go | 284 - .../protobuf/internal/impl/message_reflect.go | 462 -- .../internal/impl/message_reflect_field.go | 543 -- .../internal/impl/message_reflect_gen.go | 271 - .../protobuf/internal/impl/pointer_unsafe.go | 212 - .../protobuf/internal/impl/validate.go | 576 -- .../protobuf/internal/impl/weak.go | 74 - .../protobuf/internal/set/ints.go | 58 - .../protobuf/internal/version/version.go | 79 - .../protobuf/reflect/protodesc/desc.go | 286 - .../protobuf/reflect/protodesc/desc_init.go | 289 - .../reflect/protodesc/desc_resolve.go | 291 - .../reflect/protodesc/desc_validate.go | 371 -- .../protobuf/reflect/protodesc/editions.go | 145 - .../protobuf/reflect/protodesc/proto.go | 274 - .../protobuf/runtime/protoimpl/impl.go | 44 - .../protobuf/runtime/protoimpl/version.go | 60 - .../types/descriptorpb/descriptor.pb.go | 5341 --------------- .../types/gofeaturespb/go_features.pb.go | 165 - vendor/modules.txt | 78 +- 436 files changed, 5 insertions(+), 119353 deletions(-) delete mode 100644 vendor/github.com/cespare/xxhash/LICENSE.txt delete mode 100644 vendor/github.com/cespare/xxhash/README.md delete mode 100644 vendor/github.com/cespare/xxhash/rotate.go delete mode 100644 vendor/github.com/cespare/xxhash/rotate19.go delete mode 100644 vendor/github.com/cespare/xxhash/xxhash.go delete mode 100644 vendor/github.com/cespare/xxhash/xxhash_amd64.go delete mode 100644 vendor/github.com/cespare/xxhash/xxhash_amd64.s delete mode 100644 vendor/github.com/cespare/xxhash/xxhash_other.go delete mode 100644 vendor/github.com/cespare/xxhash/xxhash_safe.go delete mode 100644 vendor/github.com/cespare/xxhash/xxhash_unsafe.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/.deepsource.toml delete mode 100644 vendor/github.com/dgraph-io/badger/v3/.gitignore delete mode 100644 vendor/github.com/dgraph-io/badger/v3/.golangci.yml delete mode 100644 vendor/github.com/dgraph-io/badger/v3/.travis.yml delete mode 100644 vendor/github.com/dgraph-io/badger/v3/CHANGELOG.md delete mode 100644 vendor/github.com/dgraph-io/badger/v3/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/dgraph-io/badger/v3/CONTRIBUTING.md delete mode 100644 vendor/github.com/dgraph-io/badger/v3/LICENSE delete mode 100644 vendor/github.com/dgraph-io/badger/v3/README.md delete mode 100644 vendor/github.com/dgraph-io/badger/v3/VERSIONING.md delete mode 100644 vendor/github.com/dgraph-io/badger/v3/appveyor.yml delete mode 100644 vendor/github.com/dgraph-io/badger/v3/backup.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/batch.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/changes.sh delete mode 100644 vendor/github.com/dgraph-io/badger/v3/compaction.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/db.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/dir_plan9.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/dir_unix.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/dir_windows.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/discard.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/doc.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/errors.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/fb/BlockOffset.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/fb/TableIndex.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/fb/flatbuffer.fbs delete mode 100644 vendor/github.com/dgraph-io/badger/v3/fb/gen.sh delete mode 100644 vendor/github.com/dgraph-io/badger/v3/fb/install_flatbuffers.sh delete mode 100644 vendor/github.com/dgraph-io/badger/v3/histogram.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/iterator.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/key_registry.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/level_handler.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/levels.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/logger.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/managed_db.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/manifest.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/memtable.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/merge.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/options.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/options/options.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/pb/badgerpb3.pb.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/pb/badgerpb3.proto delete mode 100644 vendor/github.com/dgraph-io/badger/v3/pb/gen.sh delete mode 100644 vendor/github.com/dgraph-io/badger/v3/publisher.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/skl/README.md delete mode 100644 vendor/github.com/dgraph-io/badger/v3/skl/arena.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/skl/skl.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/stream.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/stream_writer.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/structs.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/table/README.md delete mode 100644 vendor/github.com/dgraph-io/badger/v3/table/builder.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/table/iterator.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/table/merge_iterator.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/table/table.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/test.sh delete mode 100644 vendor/github.com/dgraph-io/badger/v3/trie/trie.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/txn.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/util.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/value.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/bloom.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/checksum.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/encrypt.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/error.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/event_log.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/file_dsync.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/file_nodsync.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/iterator.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/metrics.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/watermark.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/y.go delete mode 100644 vendor/github.com/dgraph-io/badger/v3/y/zstd.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/.deepsource.toml delete mode 100644 vendor/github.com/dgraph-io/ristretto/CHANGELOG.md delete mode 100644 vendor/github.com/dgraph-io/ristretto/LICENSE delete mode 100644 vendor/github.com/dgraph-io/ristretto/README.md delete mode 100644 vendor/github.com/dgraph-io/ristretto/cache.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/policy.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/ring.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/sketch.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/store.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/test.sh delete mode 100644 vendor/github.com/dgraph-io/ristretto/ttl.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/LICENSE delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/README.md delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/allocator.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/bbloom.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/btree.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/buffer.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/calloc.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/calloc_32bit.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/calloc_64bit.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/calloc_jemalloc.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/calloc_nojemalloc.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/file.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/file_default.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/file_linux.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/flags.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/histogram.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/mmap.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/mmap_darwin.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/mmap_linux.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/mmap_plan9.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/mmap_unix.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/mmap_windows.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/rtutil.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/rtutil.s delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/simd/baseline.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/simd/search.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/simd/search_amd64.s delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/simd/stub_search_amd64.go delete mode 100644 vendor/github.com/dgraph-io/ristretto/z/z.go delete mode 100644 vendor/github.com/dustin/go-humanize/.travis.yml delete mode 100644 vendor/github.com/dustin/go-humanize/LICENSE delete mode 100644 vendor/github.com/dustin/go-humanize/README.markdown delete mode 100644 vendor/github.com/dustin/go-humanize/big.go delete mode 100644 vendor/github.com/dustin/go-humanize/bigbytes.go delete mode 100644 vendor/github.com/dustin/go-humanize/bytes.go delete mode 100644 vendor/github.com/dustin/go-humanize/comma.go delete mode 100644 vendor/github.com/dustin/go-humanize/commaf.go delete mode 100644 vendor/github.com/dustin/go-humanize/ftoa.go delete mode 100644 vendor/github.com/dustin/go-humanize/humanize.go delete mode 100644 vendor/github.com/dustin/go-humanize/number.go delete mode 100644 vendor/github.com/dustin/go-humanize/ordinals.go delete mode 100644 vendor/github.com/dustin/go-humanize/si.go delete mode 100644 vendor/github.com/dustin/go-humanize/times.go delete mode 100644 vendor/github.com/gogo/protobuf/AUTHORS delete mode 100644 vendor/github.com/gogo/protobuf/CONTRIBUTORS delete mode 100644 vendor/github.com/gogo/protobuf/LICENSE delete mode 100644 vendor/github.com/gogo/protobuf/proto/Makefile delete mode 100644 vendor/github.com/gogo/protobuf/proto/clone.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/custom_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/decode.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/deprecated.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/discard.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/duration.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/duration_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/encode.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/encode_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/equal.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/extensions.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/extensions_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/lib.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/lib_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/message_set.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/properties.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/properties_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/skip_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/table_marshal.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/table_merge.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/table_unmarshal.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/text.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/text_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/text_parser.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/wrappers.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go delete mode 100644 vendor/github.com/golang/glog/LICENSE delete mode 100644 vendor/github.com/golang/glog/README delete mode 100644 vendor/github.com/golang/glog/glog.go delete mode 100644 vendor/github.com/golang/glog/glog_file.go delete mode 100644 vendor/github.com/golang/groupcache/LICENSE delete mode 100644 vendor/github.com/golang/groupcache/lru/lru.go delete mode 100644 vendor/github.com/golang/protobuf/AUTHORS delete mode 100644 vendor/github.com/golang/protobuf/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/protobuf/LICENSE delete mode 100644 vendor/github.com/golang/protobuf/proto/buffer.go delete mode 100644 vendor/github.com/golang/protobuf/proto/defaults.go delete mode 100644 vendor/github.com/golang/protobuf/proto/deprecated.go delete mode 100644 vendor/github.com/golang/protobuf/proto/discard.go delete mode 100644 vendor/github.com/golang/protobuf/proto/extensions.go delete mode 100644 vendor/github.com/golang/protobuf/proto/properties.go delete mode 100644 vendor/github.com/golang/protobuf/proto/proto.go delete mode 100644 vendor/github.com/golang/protobuf/proto/registry.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_decode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_encode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/wire.go delete mode 100644 vendor/github.com/golang/protobuf/proto/wrappers.go delete mode 100644 vendor/github.com/golang/snappy/.gitignore delete mode 100644 vendor/github.com/golang/snappy/AUTHORS delete mode 100644 vendor/github.com/golang/snappy/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/snappy/LICENSE delete mode 100644 vendor/github.com/golang/snappy/README delete mode 100644 vendor/github.com/golang/snappy/decode.go delete mode 100644 vendor/github.com/golang/snappy/decode_amd64.s delete mode 100644 vendor/github.com/golang/snappy/decode_arm64.s delete mode 100644 vendor/github.com/golang/snappy/decode_asm.go delete mode 100644 vendor/github.com/golang/snappy/decode_other.go delete mode 100644 vendor/github.com/golang/snappy/encode.go delete mode 100644 vendor/github.com/golang/snappy/encode_amd64.s delete mode 100644 vendor/github.com/golang/snappy/encode_arm64.s delete mode 100644 vendor/github.com/golang/snappy/encode_asm.go delete mode 100644 vendor/github.com/golang/snappy/encode_other.go delete mode 100644 vendor/github.com/golang/snappy/snappy.go delete mode 100644 vendor/github.com/google/flatbuffers/LICENSE delete mode 100644 vendor/github.com/google/flatbuffers/go/BUILD.bazel delete mode 100644 vendor/github.com/google/flatbuffers/go/builder.go delete mode 100644 vendor/github.com/google/flatbuffers/go/doc.go delete mode 100644 vendor/github.com/google/flatbuffers/go/encode.go delete mode 100644 vendor/github.com/google/flatbuffers/go/grpc.go delete mode 100644 vendor/github.com/google/flatbuffers/go/lib.go delete mode 100644 vendor/github.com/google/flatbuffers/go/sizes.go delete mode 100644 vendor/github.com/google/flatbuffers/go/struct.go delete mode 100644 vendor/github.com/google/flatbuffers/go/table.go delete mode 100644 vendor/github.com/klauspost/compress/.gitattributes delete mode 100644 vendor/github.com/klauspost/compress/.gitignore delete mode 100644 vendor/github.com/klauspost/compress/.goreleaser.yml delete mode 100644 vendor/github.com/klauspost/compress/LICENSE delete mode 100644 vendor/github.com/klauspost/compress/README.md delete mode 100644 vendor/github.com/klauspost/compress/SECURITY.md delete mode 100644 vendor/github.com/klauspost/compress/compressible.go delete mode 100644 vendor/github.com/klauspost/compress/fse/README.md delete mode 100644 vendor/github.com/klauspost/compress/fse/bitreader.go delete mode 100644 vendor/github.com/klauspost/compress/fse/bitwriter.go delete mode 100644 vendor/github.com/klauspost/compress/fse/bytereader.go delete mode 100644 vendor/github.com/klauspost/compress/fse/compress.go delete mode 100644 vendor/github.com/klauspost/compress/fse/decompress.go delete mode 100644 vendor/github.com/klauspost/compress/fse/fse.go delete mode 100644 vendor/github.com/klauspost/compress/gen.sh delete mode 100644 vendor/github.com/klauspost/compress/huff0/.gitignore delete mode 100644 vendor/github.com/klauspost/compress/huff0/README.md delete mode 100644 vendor/github.com/klauspost/compress/huff0/bitreader.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/bitwriter.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/compress.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/decompress.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/decompress_amd64.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/decompress_amd64.s delete mode 100644 vendor/github.com/klauspost/compress/huff0/decompress_generic.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/huff0.go delete mode 100644 vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.go delete mode 100644 vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.go delete mode 100644 vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.s delete mode 100644 vendor/github.com/klauspost/compress/internal/snapref/LICENSE delete mode 100644 vendor/github.com/klauspost/compress/internal/snapref/decode.go delete mode 100644 vendor/github.com/klauspost/compress/internal/snapref/decode_other.go delete mode 100644 vendor/github.com/klauspost/compress/internal/snapref/encode.go delete mode 100644 vendor/github.com/klauspost/compress/internal/snapref/encode_other.go delete mode 100644 vendor/github.com/klauspost/compress/internal/snapref/snappy.go delete mode 100644 vendor/github.com/klauspost/compress/s2sx.mod delete mode 100644 vendor/github.com/klauspost/compress/s2sx.sum delete mode 100644 vendor/github.com/klauspost/compress/zstd/README.md delete mode 100644 vendor/github.com/klauspost/compress/zstd/bitreader.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/bitwriter.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/blockdec.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/blockenc.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/blocktype_string.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/bytebuf.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/bytereader.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/decodeheader.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/decoder.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/decoder_options.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/dict.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/enc_base.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/enc_best.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/enc_better.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/enc_dfast.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/enc_fast.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/encoder.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/encoder_options.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/framedec.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/frameenc.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.s delete mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/fse_encoder.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/fse_predefined.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/hash.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/history.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/LICENSE.txt delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_arm64.s delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_asm.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_safe.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/matchlen_amd64.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/matchlen_amd64.s delete mode 100644 vendor/github.com/klauspost/compress/zstd/matchlen_generic.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s delete mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec_generic.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/seqenc.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/snappy.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/zip.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/zstd.go delete mode 100644 vendor/github.com/skycoin/skywire-services/cmd/node-visualizer/commands/root.go delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/api.go delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/asset-manifest.json delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/favicon.ico delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/favicon.svg delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/index.html delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/logo192.png delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/logo512.png delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/manifest.json delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/robots.txt delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/2.da98c186.chunk.css delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/2.da98c186.chunk.css.map delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/main.08a4014d.chunk.css delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/main.08a4014d.chunk.css.map delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/2.5879b560.chunk.js delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/2.5879b560.chunk.js.LICENSE.txt delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/2.5879b560.chunk.js.map delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/3.c05a463d.chunk.js delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/3.c05a463d.chunk.js.map delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/main.588f2c65.chunk.js delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/main.588f2c65.chunk.js.map delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/runtime-main.21703e9e.js delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/runtime-main.21703e9e.js.map delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/media/marker.8a6e5ca6.svg delete mode 100644 vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/store.go delete mode 100644 vendor/go.opencensus.io/.gitignore delete mode 100644 vendor/go.opencensus.io/AUTHORS delete mode 100644 vendor/go.opencensus.io/CONTRIBUTING.md delete mode 100644 vendor/go.opencensus.io/LICENSE delete mode 100644 vendor/go.opencensus.io/Makefile delete mode 100644 vendor/go.opencensus.io/README.md delete mode 100644 vendor/go.opencensus.io/appveyor.yml delete mode 100644 vendor/go.opencensus.io/internal/internal.go delete mode 100644 vendor/go.opencensus.io/internal/sanitize.go delete mode 100644 vendor/go.opencensus.io/internal/traceinternals.go delete mode 100644 vendor/go.opencensus.io/opencensus.go delete mode 100644 vendor/go.opencensus.io/trace/basetypes.go delete mode 100644 vendor/go.opencensus.io/trace/config.go delete mode 100644 vendor/go.opencensus.io/trace/doc.go delete mode 100644 vendor/go.opencensus.io/trace/evictedqueue.go delete mode 100644 vendor/go.opencensus.io/trace/export.go delete mode 100644 vendor/go.opencensus.io/trace/internal/internal.go delete mode 100644 vendor/go.opencensus.io/trace/lrumap.go delete mode 100644 vendor/go.opencensus.io/trace/sampling.go delete mode 100644 vendor/go.opencensus.io/trace/spanbucket.go delete mode 100644 vendor/go.opencensus.io/trace/spanstore.go delete mode 100644 vendor/go.opencensus.io/trace/status_codes.go delete mode 100644 vendor/go.opencensus.io/trace/trace.go delete mode 100644 vendor/go.opencensus.io/trace/trace_api.go delete mode 100644 vendor/go.opencensus.io/trace/trace_go11.go delete mode 100644 vendor/go.opencensus.io/trace/trace_nongo11.go delete mode 100644 vendor/go.opencensus.io/trace/tracestate/tracestate.go delete mode 100644 vendor/golang.org/x/net/internal/timeseries/timeseries.go delete mode 100644 vendor/golang.org/x/net/trace/events.go delete mode 100644 vendor/golang.org/x/net/trace/histogram.go delete mode 100644 vendor/golang.org/x/net/trace/trace.go delete mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/decode.go delete mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/doc.go delete mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/encode.go delete mode 100644 vendor/google.golang.org/protobuf/internal/descfmt/stringer.go delete mode 100644 vendor/google.golang.org/protobuf/internal/descopts/options.go delete mode 100644 vendor/google.golang.org/protobuf/internal/editiondefaults/defaults.go delete mode 100644 vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb delete mode 100644 vendor/google.golang.org/protobuf/internal/editionssupport/editions.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/defval/default.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/doc.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/encode.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/build.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/editions.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filetype/build.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/api_export.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/checkinit.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_extension.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_field.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_message.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_tables.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert_list.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert_map.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/decode.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/encode.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/enum.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/equal.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/extension.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_export.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_file.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_message.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/merge.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/merge_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/message.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/validate.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/weak.go delete mode 100644 vendor/google.golang.org/protobuf/internal/set/ints.go delete mode 100644 vendor/google.golang.org/protobuf/internal/version/version.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/editions.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/proto.go delete mode 100644 vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go delete mode 100644 vendor/google.golang.org/protobuf/runtime/protoimpl/version.go delete mode 100644 vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go delete mode 100644 vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go diff --git a/Makefile b/Makefile index e9479b704b..de2acee32b 100644 --- a/Makefile +++ b/Makefile @@ -139,7 +139,7 @@ print-run-source: ## Print the command used to go run from source @echo "${OPTS} go run ${BUILD_OPTS} ./cmd/skywire/skywire.go cli config gen -n | sudo ${OPTS} go run ${BUILD_OPTS} ./cmd/skywire/skywire.go visor -n || true" build-merged: ## Install dependencies, build apps and binaries. `go build` with ${OPTS} - ${OPTS} go build ${BUILD_OPTS} -o $(BUILD_PATH)skywire ./cmd/skywire + ${OPTS} go build ${BUILD_OPTS} -o $(BUILD_PATH)skywire ./cmd/skycoin-skywire build-merged-windows: clean-windows powershell '${OPTS} go build ${BUILD_OPTS} -o $(BUILD_PATH)skywire.exe ./cmd/skywire' diff --git a/go.mod b/go.mod index 5ec764fcfb..c5ecd32dce 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/skycoin/dmsg v1.3.29-0.20241019182716-022283c93835 github.com/skycoin/skycoin v0.28.1-0.20241104170131-96e4203814d4 github.com/skycoin/skycoin-service-discovery v1.3.29-0.20241019190420-233c2d68bce0 - github.com/skycoin/skywire-services v1.3.29-0.20241019183828-0d760251ca55 + github.com/skycoin/skywire-services v1.3.29-0.20241105123837-b4869a32c8db github.com/skycoin/skywire-utilities v1.3.25 github.com/skycoin/systray v1.10.0 github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8 @@ -70,7 +70,6 @@ require ( github.com/bytedance/sonic v1.12.3 // indirect github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chen3feng/safecast v0.0.0-20220908170618-81b2ecd47937 // indirect github.com/cloudwego/base64x v0.1.4 // indirect @@ -80,12 +79,9 @@ require ( github.com/containerd/console v1.0.4 // indirect github.com/creack/pty v1.1.23 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dgraph-io/badger/v3 v3.2103.2 // indirect - github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/disintegration/imaging v1.6.2 // indirect github.com/dlclark/regexp2 v1.11.4 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect github.com/eliukblau/pixterm/pkg/ansimage v0.0.0-20191210081756-9fb6cf8c2f75 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.6 // indirect @@ -102,13 +98,7 @@ require ( github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/goccy/go-json v0.10.3 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.4 // indirect github.com/gomarkdown/markdown v0.0.0-20240930133441-72d49d9543d8 // indirect - github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/pprof v0.0.0-20241017200806-017d972448fc // indirect github.com/gookit/color v1.5.4 // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect @@ -124,7 +114,6 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.11 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/klauspost/reedsolomon v1.12.4 // indirect github.com/kyokomi/emoji/v2 v2.2.13 // indirect @@ -167,7 +156,6 @@ require ( github.com/valyala/histogram v1.2.0 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/xtaci/lossyconn v0.0.0-20200209145036-adba10fffc37 // indirect - go.opencensus.io v0.24.0 // indirect go.uber.org/mock v0.5.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.11.0 // indirect diff --git a/go.sum b/go.sum index 4a48b0a169..c908539368 100644 --- a/go.sum +++ b/go.sum @@ -88,7 +88,6 @@ github.com/MichaelMure/go-term-text v0.3.1/go.mod h1:QgVjAEDUnRMlzpS6ky5CGblux7e github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= @@ -108,7 +107,6 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -138,7 +136,6 @@ github.com/ccding/go-stun/stun v0.0.0-20200514191101-4dc67bcdb029/go.mod h1:Rpr5 github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -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.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -171,12 +168,8 @@ github.com/confiant-inc/go-socks5 v0.0.0-20210816151940-c1124825b1d6/go.mod h1:S github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -187,12 +180,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger/v3 v3.2103.2 h1:dpyM5eCJAtQCBcMCZcT4UBZchuTJgCywerHHgmxfxM8= -github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= -github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= -github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= @@ -202,8 +189,6 @@ github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/elazarl/goproxy v0.0.0-20240909085733-6741dbfc16a1 h1:g7YUigN4dW2+zpdusdTTghZ+5Py3BaUMAStvL8Nk+FY= github.com/elazarl/goproxy v0.0.0-20240909085733-6741dbfc16a1/go.mod h1:thX175TtLTzLj3p7N/Q9IiKZ7NF+p72cvL91emV0hzo= github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM= @@ -229,7 +214,6 @@ github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/ github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= @@ -296,14 +280,11 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= 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/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/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= @@ -331,11 +312,7 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomarkdown/markdown v0.0.0-20191123064959-2c17d62f5098/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU= github.com/gomarkdown/markdown v0.0.0-20240930133441-72d49d9543d8 h1:4txT5G2kqVAKMjzidIabL/8KqjIK71yj30YOeuxLn10= github.com/gomarkdown/markdown v0.0.0-20240930133441-72d49d9543d8/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= @@ -343,9 +320,6 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= -github.com/google/flatbuffers v24.3.25+incompatible/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= @@ -484,9 +458,6 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= @@ -521,7 +492,6 @@ github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= @@ -582,7 +552,6 @@ github.com/orandin/lumberjackrus v1.0.1 h1:7ysDQ0MHD79zIFN9/EiDHjUcgopNi5ehtxFDy github.com/orandin/lumberjackrus v1.0.1/go.mod h1:xYLt6H8W93pKnQgUQaxsApS0Eb4BwHLOkxk5DVzf5H0= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= @@ -641,7 +610,6 @@ github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= @@ -671,8 +639,8 @@ github.com/skycoin/skycoin v0.28.1-0.20241104170131-96e4203814d4 h1:dAl3DH6MgY2h github.com/skycoin/skycoin v0.28.1-0.20241104170131-96e4203814d4/go.mod h1:ON+OrsftvWL/HrTi5a6AYxbZFTxRQFqXKwhaSl/WzRk= github.com/skycoin/skycoin-service-discovery v1.3.29-0.20241019190420-233c2d68bce0 h1:2F9JSOHefkyTLsREj8bMMXk1z13fJhnVa0R/XCxbUwM= github.com/skycoin/skycoin-service-discovery v1.3.29-0.20241019190420-233c2d68bce0/go.mod h1:3/WomvXyOLcjEMV4GiLv8b+bueohWa9ceoNwtQSB9KI= -github.com/skycoin/skywire-services v1.3.29-0.20241019183828-0d760251ca55 h1:BqMp8eU21Wg7CCs7IxL8/gGqfGtmta93W/NFfEsYBiY= -github.com/skycoin/skywire-services v1.3.29-0.20241019183828-0d760251ca55/go.mod h1:Q3s3Ea+tcT3M4zkMT89ywk5NmLCdXZWHRsPhNBEo7Zw= +github.com/skycoin/skywire-services v1.3.29-0.20241105123837-b4869a32c8db h1:Uo9I2qYuM4njAS8ZFNKprUlaFx78S8Fz62OkLVXKRns= +github.com/skycoin/skywire-services v1.3.29-0.20241105123837-b4869a32c8db/go.mod h1:Q3s3Ea+tcT3M4zkMT89ywk5NmLCdXZWHRsPhNBEo7Zw= github.com/skycoin/skywire-utilities v1.3.25 h1:mk8dUonFdhVopFF3d9wbOyXXoiuAO+mN1y+ve6SzgX4= github.com/skycoin/skywire-utilities v1.3.25/go.mod h1:yFKWpL1bDRPKU3uK+cTF4PnYUMe+eyIj5N2bk4sF5Cw= github.com/skycoin/systray v1.10.0 h1:fQZJHMylpVvfmOOTLvUssfyHVDoC8Idx6Ba2BlLEuGg= @@ -682,26 +650,18 @@ github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8/go.mod h1:P5HUIBuIWK github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= @@ -741,7 +701,6 @@ github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJ github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/valyala/fastrand v1.1.0 h1:f+5HkLW4rsgzdNoleUOB69hyT9IlD2ZQh9GyDMfb5G8= @@ -751,7 +710,6 @@ github.com/valyala/histogram v1.2.0/go.mod h1:Hb4kBwb4UxsaNbbbh+RRz8ZR6pdodR57tz github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xtaci/kcp-go v5.4.20+incompatible h1:TN1uey3Raw0sTz0Fg8GkfM0uH3YwzhnZWQ1bABv5xAg= github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= github.com/xtaci/lossyconn v0.0.0-20200209145036-adba10fffc37 h1:EWU6Pktpas0n8lLQwDsRyZfmkPeRbdgPtW609es+/9E= @@ -778,8 +736,6 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= @@ -792,7 +748,6 @@ golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90te golang.org/x/arch v0.11.0 h1:KXV8WWKCXm6tRpLirl2szsO5j/oOODwZf4hATmGVNs4= golang.org/x/arch v0.11.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/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= @@ -948,7 +903,6 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/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= diff --git a/vendor/github.com/cespare/xxhash/LICENSE.txt b/vendor/github.com/cespare/xxhash/LICENSE.txt deleted file mode 100644 index 24b53065f4..0000000000 --- a/vendor/github.com/cespare/xxhash/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2016 Caleb Spare - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/cespare/xxhash/README.md b/vendor/github.com/cespare/xxhash/README.md deleted file mode 100644 index 0982fd25e5..0000000000 --- a/vendor/github.com/cespare/xxhash/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# xxhash - -[![GoDoc](https://godoc.org/github.com/cespare/xxhash?status.svg)](https://godoc.org/github.com/cespare/xxhash) - -xxhash is a Go implementation of the 64-bit -[xxHash](http://cyan4973.github.io/xxHash/) algorithm, XXH64. This is a -high-quality hashing algorithm that is much faster than anything in the Go -standard library. - -The API is very small, taking its cue from the other hashing packages in the -standard library: - - $ go doc github.com/cespare/xxhash ! - package xxhash // import "github.com/cespare/xxhash" - - Package xxhash implements the 64-bit variant of xxHash (XXH64) as described - at http://cyan4973.github.io/xxHash/. - - func New() hash.Hash64 - func Sum64(b []byte) uint64 - func Sum64String(s string) uint64 - -This implementation provides a fast pure-Go implementation and an even faster -assembly implementation for amd64. - -## Benchmarks - -Here are some quick benchmarks comparing the pure-Go and assembly -implementations of Sum64 against another popular Go XXH64 implementation, -[github.com/OneOfOne/xxhash](https://github.com/OneOfOne/xxhash): - -| input size | OneOfOne | cespare (purego) | cespare | -| --- | --- | --- | --- | -| 5 B | 416 MB/s | 720 MB/s | 872 MB/s | -| 100 B | 3980 MB/s | 5013 MB/s | 5252 MB/s | -| 4 KB | 12727 MB/s | 12999 MB/s | 13026 MB/s | -| 10 MB | 9879 MB/s | 10775 MB/s | 10913 MB/s | - -These numbers were generated with: - -``` -$ go test -benchtime 10s -bench '/OneOfOne,' -$ go test -tags purego -benchtime 10s -bench '/xxhash,' -$ go test -benchtime 10s -bench '/xxhash,' -``` - -## Projects using this package - -- [InfluxDB](https://github.com/influxdata/influxdb) -- [Prometheus](https://github.com/prometheus/prometheus) diff --git a/vendor/github.com/cespare/xxhash/rotate.go b/vendor/github.com/cespare/xxhash/rotate.go deleted file mode 100644 index f3eac5ebc0..0000000000 --- a/vendor/github.com/cespare/xxhash/rotate.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !go1.9 - -package xxhash - -// TODO(caleb): After Go 1.10 comes out, remove this fallback code. - -func rol1(x uint64) uint64 { return (x << 1) | (x >> (64 - 1)) } -func rol7(x uint64) uint64 { return (x << 7) | (x >> (64 - 7)) } -func rol11(x uint64) uint64 { return (x << 11) | (x >> (64 - 11)) } -func rol12(x uint64) uint64 { return (x << 12) | (x >> (64 - 12)) } -func rol18(x uint64) uint64 { return (x << 18) | (x >> (64 - 18)) } -func rol23(x uint64) uint64 { return (x << 23) | (x >> (64 - 23)) } -func rol27(x uint64) uint64 { return (x << 27) | (x >> (64 - 27)) } -func rol31(x uint64) uint64 { return (x << 31) | (x >> (64 - 31)) } diff --git a/vendor/github.com/cespare/xxhash/rotate19.go b/vendor/github.com/cespare/xxhash/rotate19.go deleted file mode 100644 index b99612bab8..0000000000 --- a/vendor/github.com/cespare/xxhash/rotate19.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build go1.9 - -package xxhash - -import "math/bits" - -func rol1(x uint64) uint64 { return bits.RotateLeft64(x, 1) } -func rol7(x uint64) uint64 { return bits.RotateLeft64(x, 7) } -func rol11(x uint64) uint64 { return bits.RotateLeft64(x, 11) } -func rol12(x uint64) uint64 { return bits.RotateLeft64(x, 12) } -func rol18(x uint64) uint64 { return bits.RotateLeft64(x, 18) } -func rol23(x uint64) uint64 { return bits.RotateLeft64(x, 23) } -func rol27(x uint64) uint64 { return bits.RotateLeft64(x, 27) } -func rol31(x uint64) uint64 { return bits.RotateLeft64(x, 31) } diff --git a/vendor/github.com/cespare/xxhash/xxhash.go b/vendor/github.com/cespare/xxhash/xxhash.go deleted file mode 100644 index f896bd28f0..0000000000 --- a/vendor/github.com/cespare/xxhash/xxhash.go +++ /dev/null @@ -1,168 +0,0 @@ -// Package xxhash implements the 64-bit variant of xxHash (XXH64) as described -// at http://cyan4973.github.io/xxHash/. -package xxhash - -import ( - "encoding/binary" - "hash" -) - -const ( - prime1 uint64 = 11400714785074694791 - prime2 uint64 = 14029467366897019727 - prime3 uint64 = 1609587929392839161 - prime4 uint64 = 9650029242287828579 - prime5 uint64 = 2870177450012600261 -) - -// NOTE(caleb): I'm using both consts and vars of the primes. Using consts where -// possible in the Go code is worth a small (but measurable) performance boost -// by avoiding some MOVQs. Vars are needed for the asm and also are useful for -// convenience in the Go code in a few places where we need to intentionally -// avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the -// result overflows a uint64). -var ( - prime1v = prime1 - prime2v = prime2 - prime3v = prime3 - prime4v = prime4 - prime5v = prime5 -) - -type xxh struct { - v1 uint64 - v2 uint64 - v3 uint64 - v4 uint64 - total int - mem [32]byte - n int // how much of mem is used -} - -// New creates a new hash.Hash64 that implements the 64-bit xxHash algorithm. -func New() hash.Hash64 { - var x xxh - x.Reset() - return &x -} - -func (x *xxh) Reset() { - x.n = 0 - x.total = 0 - x.v1 = prime1v + prime2 - x.v2 = prime2 - x.v3 = 0 - x.v4 = -prime1v -} - -func (x *xxh) Size() int { return 8 } -func (x *xxh) BlockSize() int { return 32 } - -// Write adds more data to x. It always returns len(b), nil. -func (x *xxh) Write(b []byte) (n int, err error) { - n = len(b) - x.total += len(b) - - if x.n+len(b) < 32 { - // This new data doesn't even fill the current block. - copy(x.mem[x.n:], b) - x.n += len(b) - return - } - - if x.n > 0 { - // Finish off the partial block. - copy(x.mem[x.n:], b) - x.v1 = round(x.v1, u64(x.mem[0:8])) - x.v2 = round(x.v2, u64(x.mem[8:16])) - x.v3 = round(x.v3, u64(x.mem[16:24])) - x.v4 = round(x.v4, u64(x.mem[24:32])) - b = b[32-x.n:] - x.n = 0 - } - - if len(b) >= 32 { - // One or more full blocks left. - b = writeBlocks(x, b) - } - - // Store any remaining partial block. - copy(x.mem[:], b) - x.n = len(b) - - return -} - -func (x *xxh) Sum(b []byte) []byte { - s := x.Sum64() - return append( - b, - byte(s>>56), - byte(s>>48), - byte(s>>40), - byte(s>>32), - byte(s>>24), - byte(s>>16), - byte(s>>8), - byte(s), - ) -} - -func (x *xxh) Sum64() uint64 { - var h uint64 - - if x.total >= 32 { - v1, v2, v3, v4 := x.v1, x.v2, x.v3, x.v4 - h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4) - h = mergeRound(h, v1) - h = mergeRound(h, v2) - h = mergeRound(h, v3) - h = mergeRound(h, v4) - } else { - h = x.v3 + prime5 - } - - h += uint64(x.total) - - i, end := 0, x.n - for ; i+8 <= end; i += 8 { - k1 := round(0, u64(x.mem[i:i+8])) - h ^= k1 - h = rol27(h)*prime1 + prime4 - } - if i+4 <= end { - h ^= uint64(u32(x.mem[i:i+4])) * prime1 - h = rol23(h)*prime2 + prime3 - i += 4 - } - for i < end { - h ^= uint64(x.mem[i]) * prime5 - h = rol11(h) * prime1 - i++ - } - - h ^= h >> 33 - h *= prime2 - h ^= h >> 29 - h *= prime3 - h ^= h >> 32 - - return h -} - -func u64(b []byte) uint64 { return binary.LittleEndian.Uint64(b) } -func u32(b []byte) uint32 { return binary.LittleEndian.Uint32(b) } - -func round(acc, input uint64) uint64 { - acc += input * prime2 - acc = rol31(acc) - acc *= prime1 - return acc -} - -func mergeRound(acc, val uint64) uint64 { - val = round(0, val) - acc ^= val - acc = acc*prime1 + prime4 - return acc -} diff --git a/vendor/github.com/cespare/xxhash/xxhash_amd64.go b/vendor/github.com/cespare/xxhash/xxhash_amd64.go deleted file mode 100644 index d617652680..0000000000 --- a/vendor/github.com/cespare/xxhash/xxhash_amd64.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !appengine -// +build gc -// +build !purego - -package xxhash - -// Sum64 computes the 64-bit xxHash digest of b. -// -//go:noescape -func Sum64(b []byte) uint64 - -func writeBlocks(x *xxh, b []byte) []byte diff --git a/vendor/github.com/cespare/xxhash/xxhash_amd64.s b/vendor/github.com/cespare/xxhash/xxhash_amd64.s deleted file mode 100644 index 757f2011f0..0000000000 --- a/vendor/github.com/cespare/xxhash/xxhash_amd64.s +++ /dev/null @@ -1,233 +0,0 @@ -// +build !appengine -// +build gc -// +build !purego - -#include "textflag.h" - -// Register allocation: -// AX h -// CX pointer to advance through b -// DX n -// BX loop end -// R8 v1, k1 -// R9 v2 -// R10 v3 -// R11 v4 -// R12 tmp -// R13 prime1v -// R14 prime2v -// R15 prime4v - -// round reads from and advances the buffer pointer in CX. -// It assumes that R13 has prime1v and R14 has prime2v. -#define round(r) \ - MOVQ (CX), R12 \ - ADDQ $8, CX \ - IMULQ R14, R12 \ - ADDQ R12, r \ - ROLQ $31, r \ - IMULQ R13, r - -// mergeRound applies a merge round on the two registers acc and val. -// It assumes that R13 has prime1v, R14 has prime2v, and R15 has prime4v. -#define mergeRound(acc, val) \ - IMULQ R14, val \ - ROLQ $31, val \ - IMULQ R13, val \ - XORQ val, acc \ - IMULQ R13, acc \ - ADDQ R15, acc - -// func Sum64(b []byte) uint64 -TEXT ·Sum64(SB), NOSPLIT, $0-32 - // Load fixed primes. - MOVQ ·prime1v(SB), R13 - MOVQ ·prime2v(SB), R14 - MOVQ ·prime4v(SB), R15 - - // Load slice. - MOVQ b_base+0(FP), CX - MOVQ b_len+8(FP), DX - LEAQ (CX)(DX*1), BX - - // The first loop limit will be len(b)-32. - SUBQ $32, BX - - // Check whether we have at least one block. - CMPQ DX, $32 - JLT noBlocks - - // Set up initial state (v1, v2, v3, v4). - MOVQ R13, R8 - ADDQ R14, R8 - MOVQ R14, R9 - XORQ R10, R10 - XORQ R11, R11 - SUBQ R13, R11 - - // Loop until CX > BX. -blockLoop: - round(R8) - round(R9) - round(R10) - round(R11) - - CMPQ CX, BX - JLE blockLoop - - MOVQ R8, AX - ROLQ $1, AX - MOVQ R9, R12 - ROLQ $7, R12 - ADDQ R12, AX - MOVQ R10, R12 - ROLQ $12, R12 - ADDQ R12, AX - MOVQ R11, R12 - ROLQ $18, R12 - ADDQ R12, AX - - mergeRound(AX, R8) - mergeRound(AX, R9) - mergeRound(AX, R10) - mergeRound(AX, R11) - - JMP afterBlocks - -noBlocks: - MOVQ ·prime5v(SB), AX - -afterBlocks: - ADDQ DX, AX - - // Right now BX has len(b)-32, and we want to loop until CX > len(b)-8. - ADDQ $24, BX - - CMPQ CX, BX - JG fourByte - -wordLoop: - // Calculate k1. - MOVQ (CX), R8 - ADDQ $8, CX - IMULQ R14, R8 - ROLQ $31, R8 - IMULQ R13, R8 - - XORQ R8, AX - ROLQ $27, AX - IMULQ R13, AX - ADDQ R15, AX - - CMPQ CX, BX - JLE wordLoop - -fourByte: - ADDQ $4, BX - CMPQ CX, BX - JG singles - - MOVL (CX), R8 - ADDQ $4, CX - IMULQ R13, R8 - XORQ R8, AX - - ROLQ $23, AX - IMULQ R14, AX - ADDQ ·prime3v(SB), AX - -singles: - ADDQ $4, BX - CMPQ CX, BX - JGE finalize - -singlesLoop: - MOVBQZX (CX), R12 - ADDQ $1, CX - IMULQ ·prime5v(SB), R12 - XORQ R12, AX - - ROLQ $11, AX - IMULQ R13, AX - - CMPQ CX, BX - JL singlesLoop - -finalize: - MOVQ AX, R12 - SHRQ $33, R12 - XORQ R12, AX - IMULQ R14, AX - MOVQ AX, R12 - SHRQ $29, R12 - XORQ R12, AX - IMULQ ·prime3v(SB), AX - MOVQ AX, R12 - SHRQ $32, R12 - XORQ R12, AX - - MOVQ AX, ret+24(FP) - RET - -// writeBlocks uses the same registers as above except that it uses AX to store -// the x pointer. - -// func writeBlocks(x *xxh, b []byte) []byte -TEXT ·writeBlocks(SB), NOSPLIT, $0-56 - // Load fixed primes needed for round. - MOVQ ·prime1v(SB), R13 - MOVQ ·prime2v(SB), R14 - - // Load slice. - MOVQ b_base+8(FP), CX - MOVQ CX, ret_base+32(FP) // initialize return base pointer; see NOTE below - MOVQ b_len+16(FP), DX - LEAQ (CX)(DX*1), BX - SUBQ $32, BX - - // Load vN from x. - MOVQ x+0(FP), AX - MOVQ 0(AX), R8 // v1 - MOVQ 8(AX), R9 // v2 - MOVQ 16(AX), R10 // v3 - MOVQ 24(AX), R11 // v4 - - // We don't need to check the loop condition here; this function is - // always called with at least one block of data to process. -blockLoop: - round(R8) - round(R9) - round(R10) - round(R11) - - CMPQ CX, BX - JLE blockLoop - - // Copy vN back to x. - MOVQ R8, 0(AX) - MOVQ R9, 8(AX) - MOVQ R10, 16(AX) - MOVQ R11, 24(AX) - - // Construct return slice. - // NOTE: It's important that we don't construct a slice that has a base - // pointer off the end of the original slice, as in Go 1.7+ this will - // cause runtime crashes. (See discussion in, for example, - // https://github.com/golang/go/issues/16772.) - // Therefore, we calculate the length/cap first, and if they're zero, we - // keep the old base. This is what the compiler does as well if you - // write code like - // b = b[len(b):] - - // New length is 32 - (CX - BX) -> BX+32 - CX. - ADDQ $32, BX - SUBQ CX, BX - JZ afterSetBase - - MOVQ CX, ret_base+32(FP) - -afterSetBase: - MOVQ BX, ret_len+40(FP) - MOVQ BX, ret_cap+48(FP) // set cap == len - - RET diff --git a/vendor/github.com/cespare/xxhash/xxhash_other.go b/vendor/github.com/cespare/xxhash/xxhash_other.go deleted file mode 100644 index c68d13f89e..0000000000 --- a/vendor/github.com/cespare/xxhash/xxhash_other.go +++ /dev/null @@ -1,75 +0,0 @@ -// +build !amd64 appengine !gc purego - -package xxhash - -// Sum64 computes the 64-bit xxHash digest of b. -func Sum64(b []byte) uint64 { - // A simpler version would be - // x := New() - // x.Write(b) - // return x.Sum64() - // but this is faster, particularly for small inputs. - - n := len(b) - var h uint64 - - if n >= 32 { - v1 := prime1v + prime2 - v2 := prime2 - v3 := uint64(0) - v4 := -prime1v - for len(b) >= 32 { - v1 = round(v1, u64(b[0:8:len(b)])) - v2 = round(v2, u64(b[8:16:len(b)])) - v3 = round(v3, u64(b[16:24:len(b)])) - v4 = round(v4, u64(b[24:32:len(b)])) - b = b[32:len(b):len(b)] - } - h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4) - h = mergeRound(h, v1) - h = mergeRound(h, v2) - h = mergeRound(h, v3) - h = mergeRound(h, v4) - } else { - h = prime5 - } - - h += uint64(n) - - i, end := 0, len(b) - for ; i+8 <= end; i += 8 { - k1 := round(0, u64(b[i:i+8:len(b)])) - h ^= k1 - h = rol27(h)*prime1 + prime4 - } - if i+4 <= end { - h ^= uint64(u32(b[i:i+4:len(b)])) * prime1 - h = rol23(h)*prime2 + prime3 - i += 4 - } - for ; i < end; i++ { - h ^= uint64(b[i]) * prime5 - h = rol11(h) * prime1 - } - - h ^= h >> 33 - h *= prime2 - h ^= h >> 29 - h *= prime3 - h ^= h >> 32 - - return h -} - -func writeBlocks(x *xxh, b []byte) []byte { - v1, v2, v3, v4 := x.v1, x.v2, x.v3, x.v4 - for len(b) >= 32 { - v1 = round(v1, u64(b[0:8:len(b)])) - v2 = round(v2, u64(b[8:16:len(b)])) - v3 = round(v3, u64(b[16:24:len(b)])) - v4 = round(v4, u64(b[24:32:len(b)])) - b = b[32:len(b):len(b)] - } - x.v1, x.v2, x.v3, x.v4 = v1, v2, v3, v4 - return b -} diff --git a/vendor/github.com/cespare/xxhash/xxhash_safe.go b/vendor/github.com/cespare/xxhash/xxhash_safe.go deleted file mode 100644 index dfa15ab7e2..0000000000 --- a/vendor/github.com/cespare/xxhash/xxhash_safe.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build appengine - -// This file contains the safe implementations of otherwise unsafe-using code. - -package xxhash - -// Sum64String computes the 64-bit xxHash digest of s. -func Sum64String(s string) uint64 { - return Sum64([]byte(s)) -} diff --git a/vendor/github.com/cespare/xxhash/xxhash_unsafe.go b/vendor/github.com/cespare/xxhash/xxhash_unsafe.go deleted file mode 100644 index d2b64e8bb0..0000000000 --- a/vendor/github.com/cespare/xxhash/xxhash_unsafe.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build !appengine - -// This file encapsulates usage of unsafe. -// xxhash_safe.go contains the safe implementations. - -package xxhash - -import ( - "reflect" - "unsafe" -) - -// Sum64String computes the 64-bit xxHash digest of s. -// It may be faster than Sum64([]byte(s)) by avoiding a copy. -// -// TODO(caleb): Consider removing this if an optimization is ever added to make -// it unnecessary: https://golang.org/issue/2205. -// -// TODO(caleb): We still have a function call; we could instead write Go/asm -// copies of Sum64 for strings to squeeze out a bit more speed. -func Sum64String(s string) uint64 { - // See https://groups.google.com/d/msg/golang-nuts/dcjzJy-bSpw/tcZYBzQqAQAJ - // for some discussion about this unsafe conversion. - var b []byte - bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) - bh.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data - bh.Len = len(s) - bh.Cap = len(s) - return Sum64(b) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/.deepsource.toml b/vendor/github.com/dgraph-io/badger/v3/.deepsource.toml deleted file mode 100644 index 266045f0ec..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/.deepsource.toml +++ /dev/null @@ -1,18 +0,0 @@ -version = 1 - -test_patterns = [ - 'integration/testgc/**', - '**/*_test.go' -] - -exclude_patterns = [ - -] - -[[analyzers]] -name = 'go' -enabled = true - - - [analyzers.meta] - import_path = 'github.com/dgraph-io/badger' diff --git a/vendor/github.com/dgraph-io/badger/v3/.gitignore b/vendor/github.com/dgraph-io/badger/v3/.gitignore deleted file mode 100644 index f78c74c4c9..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -p/ -badger-test*/ -.idea/ - -vendor \ No newline at end of file diff --git a/vendor/github.com/dgraph-io/badger/v3/.golangci.yml b/vendor/github.com/dgraph-io/badger/v3/.golangci.yml deleted file mode 100644 index fecb8644b8..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/.golangci.yml +++ /dev/null @@ -1,27 +0,0 @@ -run: - tests: false - -linters-settings: - lll: - line-length: 100 - -linters: - disable-all: true - enable: - - errcheck - - ineffassign - - gas - - gofmt - - golint - - gosimple - - govet - - lll - - varcheck - - unused - -issues: - exclude-rules: - - linters: - - gosec - text: "G404: " - \ No newline at end of file diff --git a/vendor/github.com/dgraph-io/badger/v3/.travis.yml b/vendor/github.com/dgraph-io/badger/v3/.travis.yml deleted file mode 100644 index b671868f3c..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/.travis.yml +++ /dev/null @@ -1,48 +0,0 @@ -language: go - -go: - - "1.12" - - "1.13" - - tip -os: - - osx -env: - jobs: - - GOARCH=386 - - GOARCH=amd64 - global: - - secure: CRkV2+/jlO0gXzzS50XGxfMS117FNwiVjxNY/LeWq06RKD+dDCPxTJl3JCNe3l0cYEPAglV2uMMYukDiTqJ7e+HI4nh4N4mv6lwx39N8dAvJe1x5ITS2T4qk4kTjuQb1Q1vw/ZOxoQqmvNKj2uRmBdJ/HHmysbRJ1OzCWML3OXdUwJf0AYlJzTjpMfkOKr7sTtE4rwyyQtd4tKH1fGdurgI9ZuFd9qvYxK2qcJhsQ6CNqMXt+7FkVkN1rIPmofjjBTNryzUr4COFXuWH95aDAif19DeBW4lbNgo1+FpDsrgmqtuhl6NAuptI8q/imow2KXBYJ8JPXsxW8DVFj0IIp0RCd3GjaEnwBEbxAyiIHLfW7AudyTS/dJOvZffPqXnuJ8xj3OPIdNe4xY0hWl8Ju2HhKfLOAHq7VadHZWd3IHLil70EiL4/JLD1rNbMImUZisFaA8pyrcIvYYebjOnk4TscwKFLedClRSX1XsMjWWd0oykQtrdkHM2IxknnBpaLu7mFnfE07f6dkG0nlpyu4SCLey7hr5FdcEmljA0nIxTSYDg6035fQkBEAbe7hlESOekkVNT9IZPwG+lmt3vU4ofi6NqNbJecOuSB+h36IiZ9s4YQtxYNnLgW14zjuFGGyT5smc3IjBT7qngDjKIgyrSVoRkY/8udy9qbUgvBeW8= - - -jobs: - allow_failures: - - go: tip - exclude: - # Exclude builds for 386 architecture on go 1.12 and tip - # Since we don't want it to run for 32 bit - - go: "1.12" - env: GOARCH=386 - - go: tip - env: GOARCH=386 - include: - # Define one extra linux build, which we use to run cross - # compiled 32 bit tests - - os: linux - arch: arm64 - go: "1.14" - env: go_32=yes - -notifications: - email: false - slack: - secure: X7uBLWYbuUhf8QFE16CoS5z7WvFR8EN9j6cEectMW6mKZ3vwXGwVXRIPsgUq/606DsQdCCx34MR8MRWYGlu6TBolbSe9y0EP0i46yipPz22YtuT7umcVUbGEyx8MZKgG0v1u/zA0O4aCsOBpGAA3gxz8h3JlEHDt+hv6U8xRsSllVLzLSNb5lwxDtcfEDxVVqP47GMEgjLPM28Pyt5qwjk7o5a4YSVzkfdxBXxd3gWzFUWzJ5E3cTacli50dK4GVfiLcQY2aQYoYO7AAvDnvP+TPfjDkBlUEE4MUz5CDIN51Xb+WW33sX7g+r3Bj7V5IRcF973RiYkpEh+3eoiPnyWyxhDZBYilty3b+Hysp6d4Ov/3I3ll7Bcny5+cYjakjkMH3l9w3gs6Y82GlpSLSJshKWS8vPRsxFe0Pstj6QSJXTd9EBaFr+l1ScXjJv/Sya9j8N9FfTuOTESWuaL1auX4Y7zEEVHlA8SCNOO8K0eTfxGZnC/YcIHsR8rePEAcFxfOYQppkyLF/XvAtnb/LMUuu0g4y2qNdme6Oelvyar1tFEMRtbl4mRCdu/krXBFtkrsfUaVY6WTPdvXAGotsFJ0wuA53zGVhlcd3+xAlSlR3c1QX95HIMeivJKb5L4nTjP+xnrmQNtnVk+tG4LSH2ltuwcZSSczModtcBmRefrk= - -script: >- - if [ $TRAVIS_OS_NAME = "linux" ] && [ $go_32 ]; then - uname -a - GOOS=linux GOARCH=arm go test -v ./... - else - go test -v ./... - # Cross-compile for Plan 9 - GOOS=plan9 go build ./... - fi diff --git a/vendor/github.com/dgraph-io/badger/v3/CHANGELOG.md b/vendor/github.com/dgraph-io/badger/v3/CHANGELOG.md deleted file mode 100644 index aae5f0f9b5..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/CHANGELOG.md +++ /dev/null @@ -1,645 +0,0 @@ -# Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - -## [3.2103.2] - 2021-10-07 - -### Fixed - - - fix(compact): close vlog after the compaction at L0 has completed (#1752) - - fix(builder): put the upper limit on reallocation (#1748) - - deps: Bump github.com/google/flatbuffers to v1.12.1 (#1746) - - fix(levels): Avoid a deadlock when acquiring read locks in levels (#1744) - - fix(pubsub): avoid deadlock in publisher and subscriber (#1749) (#1751) - -## [3.2103.1] - 2021-07-08 - -### Fixed - - fix(compaction): copy over the file ID when building tables #1713 - - fix: Fix conflict detection for managed DB (#1716) - - fix(pendingWrites): don't skip the pending entries with version=0 (#1721) - -### Features - - feat(zstd): replace datadog's zstd with Klauspost's zstd (#1709) - -## [3.2103.0] - 2021-06-02 - -### Breaking - - Subscribe: Add option to subscribe with holes in prefixes. (#1658) - -### Fixed - - fix(compaction): Remove compaction backoff mechanism (#1686) - - Add a name to mutexes to make them unexported (#1678) - - fix(merge-operator): don't read the deleted keys (#1675) - - fix(discard): close the discard stats file on db close (#1672) - - fix(iterator): fix iterator when data does not exist in read only mode (#1670) - - fix(badger): Do not reuse variable across badger commands (#1624) - - fix(dropPrefix): check properly if the key is present in a table (#1623) - -### Performance - - Opt(Stream): Optimize how we deduce key ranges for iteration (#1687) - - Increase value threshold from 1 KB to 1 MB (#1664) - - opt(DropPrefix): check if there exist some data to drop before dropping prefixes (#1621) - -### Features - - feat(options): allow special handling and checking when creating options from superflag (#1688) - - overwrite default Options from SuperFlag string (#1663) - - Support SinceTs in iterators (#1653) - - feat(info): Add a flag to parse and print DISCARD file (#1662) - - feat(vlog): making vlog threshold dynamic 6ce3b7c (#1635) - - feat(options): add NumGoroutines option for default Stream.numGo (#1656) - - feat(Trie): Working prefix match with holes (#1654) - - feat: add functionality to ban a prefix (#1638) - - feat(compaction): Support Lmax to Lmax compaction (#1615) - -### New APIs -- Badger.DB - - BanNamespace - - BannedNamespaces - - Ranges -- Badger.Options - - FromSuperFlag - - WithNumGoRoutines - - WithNamespaceOffset - - WithVLogPercentile -- Badger.Trie - - AddMatch - - DeleteMatch -- Badger.Table - - StaleDataSize -- Badger.Table.Builder - - AddStaleKey -- Badger.InitDiscardStats - -### Removed APIs -- Badger.DB - - KeySplits -- Badger.Options - - SkipVlog - -### Changed APIs -- Badger.DB - - Subscribe -- Badger.Options - - WithValueThreshold - -## [3.2011.1] - 2021-01-22 - -### Fixed - - Fix(compaction): Set base level correctly after stream (#1651) - - Fix: update ristretto and use filepath (#1652) - - Fix(badger): Do not reuse variable across badger commands (#1650) - - Fix(build): fix 32-bit build (#1646) - - Fix(table): always sync SST to disk (#1645) - -## [3.2011.0] - 2021-01-15 - -This release is not backward compatible with Badger v2.x.x - -### Breaking: - - opt(compactions): Improve compaction performance (#1574) - - Change how Badger handles WAL (#1555) - - feat(index): Use flatbuffers instead of protobuf (#1546) - -### Fixed: - - Fix(GC): Set bits correctly for moved keys (#1619) - - Fix(tableBuilding): reduce scope of valuePointer (#1617) - - Fix(compaction): fix table size estimation on compaction (#1613) - - Fix(OOM): Reuse pb.KVs in Stream (#1609) - - Fix race condition in L0StallMs variable (#1605) - - Fix(stream): Stop produceKVs on error (#1604) - - Fix(skiplist): Remove z.Buffer from skiplist (#1600) - - Fix(readonly): fix the file opening mode (#1592) - - Fix: Disable CompactL0OnClose by default (#1586) - - Fix(compaction): Don't drop data when split overlaps with top tables (#1587) - - Fix(subcompaction): Close builder before throttle.Done (#1582) - - Fix(table): Add onDisk size (#1569) - - Fix(Stream): Only send done markers if told to do so - - Fix(value log GC): Fix a bug which caused value log files to not be GCed. - - Fix segmentation fault when cache sizes are small. (#1552) - - Fix(builder): Too many small tables when compression is enabled (#1549) - - Fix integer overflow error when building for 386 (#1541) - - Fix(writeBatch): Avoid deadlock in commit callback (#1529) - - Fix(db): Handle nil logger (#1534) - - Fix(maxVersion): Use choosekey instead of KeyToList (#1532) - - Fix(Backup/Restore): Keep all versions (#1462) - - Fix(build): Fix nocgo builds. (#1493) - - Fix(cleanup): Avoid truncating in value.Open on error (#1465) - - Fix(compaction): Don't use cache for table compaction (#1467) - - Fix(compaction): Use separate compactors for L0, L1 (#1466) - - Fix(options): Do not implicitly enable cache (#1458) - - Fix(cleanup): Do not close cache before compaction (#1464) - - Fix(replay): Update head for LSM entires also (#1456) - - fix(levels): Cleanup builder resources on building an empty table (#1414) - -### Performance - - perf(GC): Remove move keys (#1539) - - Keep the cheaper parts of the index within table struct. (#1608) - - Opt(stream): Use z.Buffer to stream data (#1606) - - opt(builder): Use z.Allocator for building tables (#1576) - - opt(memory): Use z.Calloc for allocating KVList (#1563) - - opt: Small memory usage optimizations (#1562) - - KeySplits checks tables and memtables when number of splits is small. (#1544) - - perf: Reduce memory usage by better struct packing (#1528) - - perf(tableIterator): Don't do next on NewIterator (#1512) - - Improvements: Manual Memory allocation via Calloc (#1459) - - Various bug fixes: Break up list and run DropAll func (#1439) - - Add a limit to the size of the batches sent over a stream. (#1412) - - Commit does not panic after Finish, instead returns an error (#1396) - - levels: Compaction incorrectly drops some delete markers (#1422) - - Remove vlog file if bootstrap, syncDir or mmap fails (#1434) - -### Features: - - Use opencensus for tracing (#1566) - - Export functions from Key Registry (#1561) - - Allow sizes of block and index caches to be updated. (#1551) - - Add metric for number of tables being compacted (#1554) - - feat(info): Show index and bloom filter size (#1543) - - feat(db): Add db.MaxVersion API (#1526) - - Expose DB options in Badger. (#1521) - - Feature: Add a Calloc based Buffer (#1471) - - Add command to stream contents of DB into another DB. (#1463) - - Expose NumAlloc metrics via expvar (#1470) - - Support fully disabling the bloom filter (#1319) - - Add --enc-key flag in badger info tool (#1441) - -### New APIs -- Badger.DB - - CacheMaxCost (#1551) - - Levels (#1574) - - LevelsToString (#1574) - - Opts (#1521) -- Badger.Options - - WithBaseLevelSize (#1574) - - WithBaseTableSize (#1574) - - WithMemTableSize (#1574) -- Badger.KeyRegistry - - DataKey (#1561) - - LatestDataKey (#1561) - -### Removed APIs -- Badger.Options - - WithKeepL0InMemory (#1555) - - WithLevelOneSize (#1574) - - WithLoadBloomsOnOpen (#1555) - - WithLogRotatesToFlush (#1574) - - WithMaxTableSize (#1574) - - WithTableLoadingMode (#1555) - - WithTruncate (#1555) - - WithValueLogLoadingMode (#1555) - -## [2.2007.2] - 2020-08-31 - -### Fixed - - Compaction: Use separate compactors for L0, L1 (#1466) - - Rework Block and Index cache (#1473) - - Add IsClosed method (#1478) - - Cleanup: Avoid truncating in vlog.Open on error (#1465) - - Cleanup: Do not close cache before compactions (#1464) - -### New APIs -- Badger.DB - - BlockCacheMetrics (#1473) - - IndexCacheMetrics (#1473) -- Badger.Option - - WithBlockCacheSize (#1473) - - WithIndexCacheSize (#1473) - -### Removed APIs [Breaking Changes] -- Badger.DB - - DataCacheMetrics (#1473) - - BfCacheMetrics (#1473) -- Badger.Option - - WithMaxCacheSize (#1473) - - WithMaxBfCacheSize (#1473) - - WithKeepBlockIndicesInCache (#1473) - - WithKeepBlocksInCache (#1473) - -## [2.2007.1] - 2020-08-19 - -### Fixed - - Remove vlog file if bootstrap, syncDir or mmap fails (#1434) - - levels: Compaction incorrectly drops some delete markers (#1422) - - Replay: Update head for LSM entires also (#1456) - -## [2.2007.0] - 2020-08-10 - -### Fixed - - Add a limit to the size of the batches sent over a stream. (#1412) - - Fix Sequence generates duplicate values (#1281) - - Fix race condition in DoesNotHave (#1287) - - Fail fast if cgo is disabled and compression is ZSTD (#1284) - - Proto: make badger/v2 compatible with v1 (#1293) - - Proto: Rename dgraph.badger.v2.pb to badgerpb2 (#1314) - - Handle duplicates in ManagedWriteBatch (#1315) - - Ensure `bitValuePointer` flag is cleared for LSM entry values written to LSM (#1313) - - DropPrefix: Return error on blocked writes (#1329) - - Confirm `badgerMove` entry required before rewrite (#1302) - - Drop move keys when its key prefix is dropped (#1331) - - Iterator: Always add key to txn.reads (#1328) - - Restore: Account for value size as well (#1358) - - Compaction: Expired keys and delete markers are never purged (#1354) - - GC: Consider size of value while rewriting (#1357) - - Force KeepL0InMemory to be true when InMemory is true (#1375) - - Rework DB.DropPrefix (#1381) - - Update head while replaying value log (#1372) - - Avoid panic on multiple closer.Signal calls (#1401) - - Return error if the vlog writes exceeds more than 4GB (#1400) - -### Performance - - Clean up transaction oracle as we go (#1275) - - Use cache for storing block offsets (#1336) - -### Features - - Support disabling conflict detection (#1344) - - Add leveled logging (#1249) - - Support entry version in Write batch (#1310) - - Add Write method to batch write (#1321) - - Support multiple iterators in read-write transactions (#1286) - -### New APIs -- Badger.DB - - NewManagedWriteBatch (#1310) - - DropPrefix (#1381) -- Badger.Option - - WithDetectConflicts (#1344) - - WithKeepBlockIndicesInCache (#1336) - - WithKeepBlocksInCache (#1336) -- Badger.WriteBatch - - DeleteAt (#1310) - - SetEntryAt (#1310) - - Write (#1321) - -### Changes to Default Options - - DefaultOptions: Set KeepL0InMemory to false (#1345) - - Increase default valueThreshold from 32B to 1KB (#1346) - -### Deprecated -- Badger.Option - - WithEventLogging (#1203) - -### Reverts -This sections lists the changes which were reverted because of non-reproducible crashes. -- Compress/Encrypt Blocks in the background (#1227) - - -## [2.0.3] - 2020-03-24 - -### Fixed - -- Add support for watching nil prefix in subscribe API (#1246) - -### Performance - -- Compress/Encrypt Blocks in the background (#1227) -- Disable cache by default (#1257) - -### Features - -- Add BypassDirLock option (#1243) -- Add separate cache for bloomfilters (#1260) - -### New APIs -- badger.DB - - BfCacheMetrics (#1260) - - DataCacheMetrics (#1260) -- badger.Options - - WithBypassLockGuard (#1243) - - WithLoadBloomsOnOpen (#1260) - - WithMaxBfCacheSize (#1260) - -## [2.0.3] - 2020-03-24 - -### Fixed - -- Add support for watching nil prefix in subscribe API (#1246) - -### Performance - -- Compress/Encrypt Blocks in the background (#1227) -- Disable cache by default (#1257) - -### Features - -- Add BypassDirLock option (#1243) -- Add separate cache for bloomfilters (#1260) - -### New APIs -- badger.DB - - BfCacheMetrics (#1260) - - DataCacheMetrics (#1260) -- badger.Options - - WithBypassLockGuard (#1243) - - WithLoadBloomsOnOpen (#1260) - - WithMaxBfCacheSize (#1260) - -## [2.0.2] - 2020-03-02 - -### Fixed - -- Cast sz to uint32 to fix compilation on 32 bit. (#1175) -- Fix checkOverlap in compaction. (#1166) -- Avoid sync in inmemory mode. (#1190) -- Support disabling the cache completely. (#1185) -- Add support for caching bloomfilters. (#1204) -- Fix int overflow for 32bit. (#1216) -- Remove the 'this entry should've caught' log from value.go. (#1170) -- Rework concurrency semantics of valueLog.maxFid. (#1187) - -### Performance - -- Use fastRand instead of locked-rand in skiplist. (#1173) -- Improve write stalling on level 0 and 1. (#1186) -- Disable compression and set ZSTD Compression Level to 1. (#1191) - -## [2.0.1] - 2020-01-02 - -### New APIs - -- badger.Options - - WithInMemory (f5b6321) - - WithZSTDCompressionLevel (3eb4e72) - -- Badger.TableInfo - - EstimatedSz (f46f8ea) - -### Features - -- Introduce in-memory mode in badger. (#1113) - -### Fixed - -- Limit manifest's change set size. (#1119) -- Cast idx to uint32 to fix compilation on i386. (#1118) -- Fix request increment ref bug. (#1121) -- Fix windows dataloss issue. (#1134) -- Fix VerifyValueChecksum checks. (#1138) -- Fix encryption in stream writer. (#1146) -- Fix segmentation fault in vlog.Read. (header.Decode) (#1150) -- Fix merge iterator duplicates issue. (#1157) - -### Performance - -- Set level 15 as default compression level in Zstd. (#1111) -- Optimize createTable in stream_writer.go. (#1132) - -## [2.0.0] - 2019-11-12 - -### New APIs - -- badger.DB - - NewWriteBatchAt (7f43769) - - CacheMetrics (b9056f1) - -- badger.Options - - WithMaxCacheSize (b9056f1) - - WithEventLogging (75c6a44) - - WithBlockSize (1439463) - - WithBloomFalsePositive (1439463) - - WithKeepL0InMemory (ee70ff2) - - WithVerifyValueChecksum (ee70ff2) - - WithCompression (5f3b061) - - WithEncryptionKey (a425b0e) - - WithEncryptionKeyRotationDuration (a425b0e) - - WithChecksumVerificationMode (7b4083d) - -### Features - -- Data cache to speed up lookups and iterations. (#1066) -- Data compression. (#1013) -- Data encryption-at-rest. (#1042) - -### Fixed - -- Fix deadlock when flushing discard stats. (#976) -- Set move key's expiresAt for keys with TTL. (#1006) -- Fix unsafe usage in Decode. (#1097) -- Fix race condition on db.orc.nextTxnTs. (#1101) -- Fix level 0 GC dataloss bug. (#1090) -- Fix deadlock in discard stats. (#1070) -- Support checksum verification for values read from vlog. (#1052) -- Store entire L0 in memory. (#963) -- Fix table.Smallest/Biggest and iterator Prefix bug. (#997) -- Use standard proto functions for Marshal/Unmarshal and Size. (#994) -- Fix boundaries on GC batch size. (#987) -- VlogSize to store correct directory name to expvar.Map. (#956) -- Fix transaction too big issue in restore. (#957) -- Fix race condition in updateDiscardStats. (#973) -- Cast results of len to uint32 to fix compilation in i386 arch. (#961) -- Making the stream writer APIs goroutine-safe. (#959) -- Fix prefix bug in key iterator and allow all versions. (#950) -- Drop discard stats if we can't unmarshal it. (#936) -- Fix race condition in flushDiscardStats function. (#921) -- Ensure rewrite in vlog is within transactional limits. (#911) -- Fix discard stats moved by GC bug. (#929) -- Fix busy-wait loop in Watermark. (#920) - -### Performance - -- Introduce fast merge iterator. (#1080) -- Binary search based table picker. (#983) -- Flush vlog buffer if it grows beyond threshold. (#1067) -- Introduce StreamDone in Stream Writer. (#1061) -- Performance Improvements to block iterator. (#977) -- Prevent unnecessary safecopy in iterator parseKV. (#971) -- Use pointers instead of binary encoding. (#965) -- Reuse block iterator inside table iterator. (#972) -- [breaking/format] Remove vlen from entry header. (#945) -- Replace FarmHash with AESHash for Oracle conflicts. (#952) -- [breaking/format] Optimize Bloom filters. (#940) -- [breaking/format] Use varint for header encoding (without header length). (#935) -- Change file picking strategy in compaction. (#894) -- [breaking/format] Block level changes. (#880) -- [breaking/format] Add key-offset index to the end of SST table. (#881) - - -## [1.6.0] - 2019-07-01 - -This is a release including almost 200 commits, so expect many changes - some of them -not backward compatible. - -Regarding backward compatibility in Badger versions, you might be interested on reading -[VERSIONING.md](VERSIONING.md). - -_Note_: The hashes in parentheses correspond to the commits that impacted the given feature. - -### New APIs - -- badger.DB - - DropPrefix (291295e) - - Flatten (7e41bba) - - KeySplits (4751ef1) - - MaxBatchCount (b65e2a3) - - MaxBatchSize (b65e2a3) - - PrintKeyValueHistogram (fd59907) - - Subscribe (26128a7) - - Sync (851e462) - -- badger.DefaultOptions() and badger.LSMOnlyOptions() (91ce687) - - badger.Options.WithX methods - -- badger.Entry (e9447c9) - - NewEntry - - WithMeta - - WithDiscard - - WithTTL - -- badger.Item - - KeySize (fd59907) - - ValueSize (5242a99) - -- badger.IteratorOptions - - PickTable (7d46029, 49a49e3) - - Prefix (7d46029) - -- badger.Logger (fbb2778) - -- badger.Options - - CompactL0OnClose (7e41bba) - - Logger (3f66663) - - LogRotatesToFlush (2237832) - -- badger.Stream (14cbd89, 3258067) -- badger.StreamWriter (7116e16) -- badger.TableInfo.KeyCount (fd59907) -- badger.TableManifest (2017987) -- badger.Tx.NewKeyIterator (49a49e3) -- badger.WriteBatch (6daccf9, 7e78e80) - -### Modified APIs - -#### Breaking changes: - -- badger.DefaultOptions and badger.LSMOnlyOptions are now functions rather than variables (91ce687) -- badger.Item.Value now receives a function that returns an error (439fd46) -- badger.Txn.Commit doesn't receive any params now (6daccf9) -- badger.DB.Tables now receives a boolean (76b5341) - -#### Not breaking changes: - -- badger.LSMOptions changed values (799c33f) -- badger.DB.NewIterator now allows multiple iterators per RO txn (41d9656) -- badger.Options.TableLoadingMode's new default is options.MemoryMap (6b97bac) - -### Removed APIs - -- badger.ManagedDB (d22c0e8) -- badger.Options.DoNotCompact (7e41bba) -- badger.Txn.SetWithX (e9447c9) - -### Tools: - -- badger bank disect (13db058) -- badger bank test (13db058) --mmap (03870e3) -- badger fill (7e41bba) -- badger flatten (7e41bba) -- badger info --histogram (fd59907) --history --lookup --show-keys --show-meta --with-prefix (09e9b63) --show-internal (fb2eed9) -- badger benchmark read (239041e) -- badger benchmark write (6d3b67d) - -## [1.5.5] - 2019-06-20 - -* Introduce support for Go Modules - -## [1.5.3] - 2018-07-11 -Bug Fixes: -* Fix a panic caused due to item.vptr not copying over vs.Value, when looking - for a move key. - -## [1.5.2] - 2018-06-19 -Bug Fixes: -* Fix the way move key gets generated. -* If a transaction has unclosed, or multiple iterators running simultaneously, - throw a panic. Every iterator must be properly closed. At any point in time, - only one iterator per transaction can be running. This is to avoid bugs in a - transaction data structure which is thread unsafe. - -* *Warning: This change might cause panics in user code. Fix is to properly - close your iterators, and only have one running at a time per transaction.* - -## [1.5.1] - 2018-06-04 -Bug Fixes: -* Fix for infinite yieldItemValue recursion. #503 -* Fix recursive addition of `badgerMove` prefix. https://github.com/dgraph-io/badger/commit/2e3a32f0ccac3066fb4206b28deb39c210c5266f -* Use file size based window size for sampling, instead of fixing it to 10MB. #501 - -Cleanup: -* Clarify comments and documentation. -* Move badger tool one directory level up. - -## [1.5.0] - 2018-05-08 -* Introduce `NumVersionsToKeep` option. This option is used to discard many - versions of the same key, which saves space. -* Add a new `SetWithDiscard` method, which would indicate that all the older - versions of the key are now invalid. Those versions would be discarded during - compactions. -* Value log GC moves are now bound to another keyspace to ensure latest versions - of data are always at the top in LSM tree. -* Introduce `ValueLogMaxEntries` to restrict the number of key-value pairs per - value log file. This helps bound the time it takes to garbage collect one - file. - -## [1.4.0] - 2018-05-04 -* Make mmap-ing of value log optional. -* Run GC multiple times, based on recorded discard statistics. -* Add MergeOperator. -* Force compact L0 on clsoe (#439). -* Add truncate option to warn about data loss (#452). -* Discard key versions during compaction (#464). -* Introduce new `LSMOnlyOptions`, to make Badger act like a typical LSM based DB. - -Bug fix: -* (Temporary) Check max version across all tables in Get (removed in next - release). -* Update commit and read ts while loading from backup. -* Ensure all transaction entries are part of the same value log file. -* On commit, run unlock callbacks before doing writes (#413). -* Wait for goroutines to finish before closing iterators (#421). - -## [1.3.0] - 2017-12-12 -* Add `DB.NextSequence()` method to generate monotonically increasing integer - sequences. -* Add `DB.Size()` method to return the size of LSM and value log files. -* Tweaked mmap code to make Windows 32-bit builds work. -* Tweaked build tags on some files to make iOS builds work. -* Fix `DB.PurgeOlderVersions()` to not violate some constraints. - -## [1.2.0] - 2017-11-30 -* Expose a `Txn.SetEntry()` method to allow setting the key-value pair - and all the metadata at the same time. - -## [1.1.1] - 2017-11-28 -* Fix bug where txn.Get was returing key deleted in same transaction. -* Fix race condition while decrementing reference in oracle. -* Update doneCommit in the callback for CommitAsync. -* Iterator see writes of current txn. - -## [1.1.0] - 2017-11-13 -* Create Badger directory if it does not exist when `badger.Open` is called. -* Added `Item.ValueCopy()` to avoid deadlocks in long-running iterations -* Fixed 64-bit alignment issues to make Badger run on Arm v7 - -## [1.0.1] - 2017-11-06 -* Fix an uint16 overflow when resizing key slice - -[Unreleased]: https://github.com/dgraph-io/badger/compare/v2.2007.2...HEAD -[2.2007.2]: https://github.com/dgraph-io/badger/compare/v2.2007.1...v2.2007.2 -[2.2007.1]: https://github.com/dgraph-io/badger/compare/v2.2007.0...v2.2007.1 -[2.2007.0]: https://github.com/dgraph-io/badger/compare/v2.0.3...v2.2007.0 -[2.0.3]: https://github.com/dgraph-io/badger/compare/v2.0.2...v2.0.3 -[2.0.2]: https://github.com/dgraph-io/badger/compare/v2.0.1...v2.0.2 -[2.0.1]: https://github.com/dgraph-io/badger/compare/v2.0.0...v2.0.1 -[2.0.0]: https://github.com/dgraph-io/badger/compare/v1.6.0...v2.0.0 -[1.6.0]: https://github.com/dgraph-io/badger/compare/v1.5.5...v1.6.0 -[1.5.5]: https://github.com/dgraph-io/badger/compare/v1.5.3...v1.5.5 -[1.5.3]: https://github.com/dgraph-io/badger/compare/v1.5.2...v1.5.3 -[1.5.2]: https://github.com/dgraph-io/badger/compare/v1.5.1...v1.5.2 -[1.5.1]: https://github.com/dgraph-io/badger/compare/v1.5.0...v1.5.1 -[1.5.0]: https://github.com/dgraph-io/badger/compare/v1.4.0...v1.5.0 -[1.4.0]: https://github.com/dgraph-io/badger/compare/v1.3.0...v1.4.0 -[1.3.0]: https://github.com/dgraph-io/badger/compare/v1.2.0...v1.3.0 -[1.2.0]: https://github.com/dgraph-io/badger/compare/v1.1.1...v1.2.0 -[1.1.1]: https://github.com/dgraph-io/badger/compare/v1.1.0...v1.1.1 -[1.1.0]: https://github.com/dgraph-io/badger/compare/v1.0.1...v1.1.0 -[1.0.1]: https://github.com/dgraph-io/badger/compare/v1.0.0...v1.0.1 diff --git a/vendor/github.com/dgraph-io/badger/v3/CODE_OF_CONDUCT.md b/vendor/github.com/dgraph-io/badger/v3/CODE_OF_CONDUCT.md deleted file mode 100644 index bf7bbc29dc..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,5 +0,0 @@ -# Code of Conduct - -Our Code of Conduct can be found here: - -https://dgraph.io/conduct diff --git a/vendor/github.com/dgraph-io/badger/v3/CONTRIBUTING.md b/vendor/github.com/dgraph-io/badger/v3/CONTRIBUTING.md deleted file mode 100644 index 30512e9dba..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/CONTRIBUTING.md +++ /dev/null @@ -1,107 +0,0 @@ -# Contribution Guide - -* [Before you get started](#before-you-get-started) - * [Code of Conduct](#code-of-conduct) -* [Your First Contribution](#your-first-contribution) - * [Find a good first topic](#find-a-good-first-topic) -* [Setting up your development environment](#setting-up-your-development-environment) - * [Fork the project](#fork-the-project) - * [Clone the project](#clone-the-project) - * [New branch for a new code](#new-branch-for-a-new-code) - * [Test](#test) - * [Commit and push](#commit-and-push) - * [Create a Pull Request](#create-a-pull-request) - * [Sign the CLA](#sign-the-cla) - * [Get a code review](#get-a-code-review) - -## Before you get started - -### Code of Conduct - -Please make sure to read and observe our [Code of Conduct](./CODE_OF_CONDUCT.md). - -## Your First Contribution - -### Find a good first topic - -You can start by finding an existing issue with the -[good first issue](https://github.com/dgraph-io/badger/labels/good%20first%20issue) or [help wanted](https://github.com/dgraph-io/badger/labels/help%20wanted) labels. These issues are well suited for new contributors. - - -## Setting up your development environment - -Badger uses [`Go Modules`](https://github.com/golang/go/wiki/Modules) -to manage dependencies. The version of Go should be **1.12** or above. - -### Fork the project - -- Visit https://github.com/dgraph-io/badger -- Click the `Fork` button (top right) to create a fork of the repository - -### Clone the project - -```sh -$ git clone https://github.com/$GITHUB_USER/badger -$ cd badger -$ git remote add upstream git@github.com:dgraph-io/badger.git - -# Never push to the upstream master -git remote set-url --push upstream no_push -``` - -### New branch for a new code - -Get your local master up to date: - -```sh -$ git fetch upstream -$ git checkout master -$ git rebase upstream/master -``` - -Create a new branch from the master: - -```sh -$ git checkout -b my_new_feature -``` - -And now you can finally add your changes to project. - -### Test - -Build and run all tests: - -```sh -$ ./test.sh -``` - -### Commit and push - -Commit your changes: - -```sh -$ git commit -``` - -When the changes are ready to review: - -```sh -$ git push origin my_new_feature -``` - -### Create a Pull Request - -Just open `https://github.com/$GITHUB_USER/badger/pull/new/my_new_feature` and -fill the PR description. - -### Sign the CLA - -Click the **Sign in with Github to agree** button to sign the CLA. [An example](https://cla-assistant.io/dgraph-io/badger?pullRequest=1377). - -### Get a code review - -If your pull request (PR) is opened, it will be assigned to one or more -reviewers. Those reviewers will do a code review. - -To address review comments, you should commit the changes to the same branch of -the PR on your fork. diff --git a/vendor/github.com/dgraph-io/badger/v3/LICENSE b/vendor/github.com/dgraph-io/badger/v3/LICENSE deleted file mode 100644 index d9a10c0d8e..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/LICENSE +++ /dev/null @@ -1,176 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/vendor/github.com/dgraph-io/badger/v3/README.md b/vendor/github.com/dgraph-io/badger/v3/README.md deleted file mode 100644 index aef00efc05..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/README.md +++ /dev/null @@ -1,203 +0,0 @@ -# BadgerDB [![Go Reference](https://pkg.go.dev/badge/github.com/dgraph-io/badger/v3.svg)](https://pkg.go.dev/github.com/dgraph-io/badger/v3) [![Go Report Card](https://goreportcard.com/badge/github.com/dgraph-io/badger)](https://goreportcard.com/report/github.com/dgraph-io/badger) [![Sourcegraph](https://sourcegraph.com/github.com/dgraph-io/badger/-/badge.svg)](https://sourcegraph.com/github.com/dgraph-io/badger?badge) [![Build Status](https://teamcity.dgraph.io/guestAuth/app/rest/builds/buildType:(id:Badger_UnitTests)/statusIcon.svg)](https://teamcity.dgraph.io/viewLog.html?buildTypeId=Badger_UnitTests&buildId=lastFinished&guest=1) ![Appveyor](https://ci.appveyor.com/api/projects/status/github/dgraph-io/badger?branch=master&svg=true) [![Coverage Status](https://coveralls.io/repos/github/dgraph-io/badger/badge.svg?branch=master)](https://coveralls.io/github/dgraph-io/badger?branch=master) - -![Badger mascot](images/diggy-shadow.png) - -BadgerDB is an embeddable, persistent and fast key-value (KV) database written -in pure Go. It is the underlying database for [Dgraph](https://dgraph.io), a -fast, distributed graph database. It's meant to be a performant alternative to -non-Go-based key-value stores like RocksDB. - -**Use [Discuss Issues](https://discuss.dgraph.io/c/issues/badger/37) for reporting issues about this repository.** - -## Project Status [March 24, 2020] - -Badger is stable and is being used to serve data sets worth hundreds of -terabytes. Badger supports concurrent ACID transactions with serializable -snapshot isolation (SSI) guarantees. A Jepsen-style bank test runs nightly for -8h, with `--race` flag and ensures the maintenance of transactional guarantees. -Badger has also been tested to work with filesystem level anomalies, to ensure -persistence and consistency. Badger is being used by a number of projects which -includes Dgraph, Jaeger Tracing, UsenetExpress, and many more. - -The list of projects using Badger can be found [here](#projects-using-badger). - -Badger v1.0 was released in Nov 2017, and the latest version that is data-compatible -with v1.0 is v1.6.0. - -Badger v2.0 was released in Nov 2019 with a new storage format which won't -be compatible with all of the v1.x. Badger v2.0 supports compression, encryption and uses a cache to speed up lookup. - -The [Changelog] is kept fairly up-to-date. - -For more details on our version naming schema please read [Choosing a version](#choosing-a-version). - -[Changelog]:https://github.com/dgraph-io/badger/blob/master/CHANGELOG.md - -## Table of Contents - * [Getting Started](#getting-started) - + [Installing](#installing) - - [Installing Badger Command Line Tool](#installing-badger-command-line-tool) - - [Choosing a version](#choosing-a-version) - * [Badger Documentation](#badger-documentation) - * [Resources](#resources) - + [Blog Posts](#blog-posts) - * [Design](#design) - + [Comparisons](#comparisons) - + [Benchmarks](#benchmarks) - * [Projects Using Badger](#projects-using-badger) - * [Contributing](#contributing) - * [Contact](#contact) - -## Getting Started - -### Installing -To start using Badger, install Go 1.12 or above. Badger v2 needs go modules. Run the following command to retrieve the library. - -```sh -$ go get github.com/dgraph-io/badger/v3 -``` -This will retrieve the library. - -#### Installing Badger Command Line Tool - -Download and extract the latest Badger DB release from https://github.com/dgraph-io/badger/releases and then run the following commands. - -```sh -$ cd badger-/badger -$ go install -``` -This will install the badger command line utility into your $GOBIN path. - -#### Choosing a version - -BadgerDB is a pretty special package from the point of view that the most important change we can -make to it is not on its API but rather on how data is stored on disk. - -This is why we follow a version naming schema that differs from Semantic Versioning. - -- New major versions are released when the data format on disk changes in an incompatible way. -- New minor versions are released whenever the API changes but data compatibility is maintained. - Note that the changes on the API could be backward-incompatible - unlike Semantic Versioning. -- New patch versions are released when there's no changes to the data format nor the API. - -Following these rules: - -- v1.5.0 and v1.6.0 can be used on top of the same files without any concerns, as their major - version is the same, therefore the data format on disk is compatible. -- v1.6.0 and v2.0.0 are data incompatible as their major version implies, so files created with - v1.6.0 will need to be converted into the new format before they can be used by v2.0.0. - -For a longer explanation on the reasons behind using a new versioning naming schema, you can read -[VERSIONING.md](VERSIONING.md). - -## Badger Documentation - -Badger Documentation is available at https://dgraph.io/docs/badger - -## Resources - -### Blog Posts -1. [Introducing Badger: A fast key-value store written natively in -Go](https://open.dgraph.io/post/badger/) -2. [Make Badger crash resilient with ALICE](https://blog.dgraph.io/post/alice/) -3. [Badger vs LMDB vs BoltDB: Benchmarking key-value databases in Go](https://blog.dgraph.io/post/badger-lmdb-boltdb/) -4. [Concurrent ACID Transactions in Badger](https://blog.dgraph.io/post/badger-txn/) - -## Design -Badger was written with these design goals in mind: - -- Write a key-value database in pure Go. -- Use latest research to build the fastest KV database for data sets spanning terabytes. -- Optimize for SSDs. - -Badger’s design is based on a paper titled _[WiscKey: Separating Keys from -Values in SSD-conscious Storage][wisckey]_. - -[wisckey]: https://www.usenix.org/system/files/conference/fast16/fast16-papers-lu.pdf - -### Comparisons -| Feature | Badger | RocksDB | BoltDB | -| ------- | ------ | ------- | ------ | -| Design | LSM tree with value log | LSM tree only | B+ tree | -| High Read throughput | Yes | No | Yes | -| High Write throughput | Yes | Yes | No | -| Designed for SSDs | Yes (with latest research 1) | Not specifically 2 | No | -| Embeddable | Yes | Yes | Yes | -| Sorted KV access | Yes | Yes | Yes | -| Pure Go (no Cgo) | Yes | No | Yes | -| Transactions | Yes, ACID, concurrent with SSI3 | Yes (but non-ACID) | Yes, ACID | -| Snapshots | Yes | Yes | Yes | -| TTL support | Yes | Yes | No | -| 3D access (key-value-version) | Yes4 | No | No | - -1 The [WISCKEY paper][wisckey] (on which Badger is based) saw big -wins with separating values from keys, significantly reducing the write -amplification compared to a typical LSM tree. - -2 RocksDB is an SSD optimized version of LevelDB, which was designed specifically for rotating disks. -As such RocksDB's design isn't aimed at SSDs. - -3 SSI: Serializable Snapshot Isolation. For more details, see the blog post [Concurrent ACID Transactions in Badger](https://blog.dgraph.io/post/badger-txn/) - -4 Badger provides direct access to value versions via its Iterator API. -Users can also specify how many versions to keep per key via Options. - -### Benchmarks -We have run comprehensive benchmarks against RocksDB, Bolt and LMDB. The -benchmarking code, and the detailed logs for the benchmarks can be found in the -[badger-bench] repo. More explanation, including graphs can be found the blog posts (linked -above). - -[badger-bench]: https://github.com/dgraph-io/badger-bench - -## Projects Using Badger -Below is a list of known projects that use Badger: - -* [Dgraph](https://github.com/dgraph-io/dgraph) - Distributed graph database. -* [Jaeger](https://github.com/jaegertracing/jaeger) - Distributed tracing platform. -* [go-ipfs](https://github.com/ipfs/go-ipfs) - Go client for the InterPlanetary File System (IPFS), a new hypermedia distribution protocol. -* [Riot](https://github.com/go-ego/riot) - An open-source, distributed search engine. -* [emitter](https://github.com/emitter-io/emitter) - Scalable, low latency, distributed pub/sub broker with message storage, uses MQTT, gossip and badger. -* [OctoSQL](https://github.com/cube2222/octosql) - Query tool that allows you to join, analyse and transform data from multiple databases using SQL. -* [Dkron](https://dkron.io/) - Distributed, fault tolerant job scheduling system. -* [smallstep/certificates](https://github.com/smallstep/certificates) - Step-ca is an online certificate authority for secure, automated certificate management. -* [Sandglass](https://github.com/celrenheit/sandglass) - distributed, horizontally scalable, persistent, time sorted message queue. -* [TalariaDB](https://github.com/grab/talaria) - Grab's Distributed, low latency time-series database. -* [Sloop](https://github.com/salesforce/sloop) - Salesforce's Kubernetes History Visualization Project. -* [Immudb](https://github.com/codenotary/immudb) - Lightweight, high-speed immutable database for systems and applications. -* [Usenet Express](https://usenetexpress.com/) - Serving over 300TB of data with Badger. -* [gorush](https://github.com/appleboy/gorush) - A push notification server written in Go. -* [Dispatch Protocol](https://github.com/dispatchlabs/disgo) - Blockchain protocol for distributed application data analytics. -* [GarageMQ](https://github.com/valinurovam/garagemq) - AMQP server written in Go. -* [RedixDB](https://alash3al.github.io/redix/) - A real-time persistent key-value store with the same redis protocol. -* [BBVA](https://github.com/BBVA/raft-badger) - Raft backend implementation using BadgerDB for Hashicorp raft. -* [Fantom](https://github.com/Fantom-foundation/go-lachesis) - aBFT Consensus platform for distributed applications. -* [decred](https://github.com/decred/dcrdata) - An open, progressive, and self-funding cryptocurrency with a system of community-based governance integrated into its blockchain. -* [OpenNetSys](https://github.com/opennetsys/c3-go) - Create useful dApps in any software language. -* [HoneyTrap](https://github.com/honeytrap/honeytrap) - An extensible and opensource system for running, monitoring and managing honeypots. -* [Insolar](https://github.com/insolar/insolar) - Enterprise-ready blockchain platform. -* [IoTeX](https://github.com/iotexproject/iotex-core) - The next generation of the decentralized network for IoT powered by scalability- and privacy-centric blockchains. -* [go-sessions](https://github.com/kataras/go-sessions) - The sessions manager for Go net/http and fasthttp. -* [Babble](https://github.com/mosaicnetworks/babble) - BFT Consensus platform for distributed applications. -* [Tormenta](https://github.com/jpincas/tormenta) - Embedded object-persistence layer / simple JSON database for Go projects. -* [BadgerHold](https://github.com/timshannon/badgerhold) - An embeddable NoSQL store for querying Go types built on Badger -* [Goblero](https://github.com/didil/goblero) - Pure Go embedded persistent job queue backed by BadgerDB -* [Surfline](https://www.surfline.com) - Serving global wave and weather forecast data with Badger. -* [Cete](https://github.com/mosuka/cete) - Simple and highly available distributed key-value store built on Badger. Makes it easy bringing up a cluster of Badger with Raft consensus algorithm by hashicorp/raft. -* [Volument](https://volument.com/) - A new take on website analytics backed by Badger. -* [KVdb](https://kvdb.io/) - Hosted key-value store and serverless platform built on top of Badger. -* [Terminotes](https://gitlab.com/asad-awadia/terminotes) - Self hosted notes storage and search server - storage powered by BadgerDB -* [Pyroscope](https://github.com/pyroscope-io/pyroscope) - Open source confinuous profiling platform built with BadgerDB -* [Veri](https://github.com/bgokden/veri) - A distributed feature store optimized for Search and Recommendation tasks. - -If you are using Badger in a project please send a pull request to add it to the list. - -## Contributing - -If you're interested in contributing to Badger see [CONTRIBUTING.md](./CONTRIBUTING.md). - -## Contact -- Please use [discuss.dgraph.io](https://discuss.dgraph.io) for questions, feature requests and discussions. -- Please use [Github issue tracker](https://github.com/dgraph-io/badger/issues) for filing bugs or feature requests. -- Follow us on Twitter [@dgraphlabs](https://twitter.com/dgraphlabs). - diff --git a/vendor/github.com/dgraph-io/badger/v3/VERSIONING.md b/vendor/github.com/dgraph-io/badger/v3/VERSIONING.md deleted file mode 100644 index a890a36ffb..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/VERSIONING.md +++ /dev/null @@ -1,47 +0,0 @@ -# Serialization Versioning: Semantic Versioning for databases - -Semantic Versioning, commonly known as SemVer, is a great idea that has been very widely adopted as -a way to decide how to name software versions. The whole concept is very well summarized on -semver.org with the following lines: - -> Given a version number MAJOR.MINOR.PATCH, increment the: -> -> 1. MAJOR version when you make incompatible API changes, -> 2. MINOR version when you add functionality in a backwards-compatible manner, and -> 3. PATCH version when you make backwards-compatible bug fixes. -> -> Additional labels for pre-release and build metadata are available as extensions to the -> MAJOR.MINOR.PATCH format. - -Unfortunately, API changes are not the most important changes for libraries that serialize data for -later consumption. For these libraries, such as BadgerDB, changes to the API are much easier to -handle than change to the data format used to store data on disk. - -## Serialization Version specification - -Serialization Versioning, like Semantic Versioning, uses 3 numbers and also calls them -MAJOR.MINOR.PATCH, but the semantics of the numbers are slightly modified: - -Given a version number MAJOR.MINOR.PATCH, increment the: - -- MAJOR version when you make changes that require a transformation of the dataset before it can be -used again. -- MINOR version when old datasets are still readable but the API might have changed in -backwards-compatible or incompatible ways. -- PATCH version when you make backwards-compatible bug fixes. - -Additional labels for pre-release and build metadata are available as extensions to the -MAJOR.MINOR.PATCH format. - -Following this naming strategy, migration from v1.x to v2.x requires a migration strategy for your -existing dataset, and as such has to be carefully planned. Migrations in between different minor -versions (e.g. v1.5.x and v1.6.x) might break your build, as the API *might* have changed, but once -your code compiles there's no need for any data migration. Lastly, changes in between two different -patch versions should never break your build or dataset. - -For more background on our decision to adopt Serialization Versioning, read the blog post -[Semantic Versioning, Go Modules, and Databases][blog] and the original proposal on -[this comment on Dgraph's Discuss forum][discuss]. - -[blog]: https://blog.dgraph.io/post/serialization-versioning/ -[discuss]: https://discuss.dgraph.io/t/go-modules-on-badger-and-dgraph/4662/7 \ No newline at end of file diff --git a/vendor/github.com/dgraph-io/badger/v3/appveyor.yml b/vendor/github.com/dgraph-io/badger/v3/appveyor.yml deleted file mode 100644 index 1842b117bf..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/appveyor.yml +++ /dev/null @@ -1,49 +0,0 @@ -# version format -version: "{build}" - -# Operating system (build VM template) -os: Windows Server 2012 R2 - -# Platform. -platform: x64 - -clone_folder: c:\gopath\src\github.com\dgraph-io\badger - -# Environment variables -environment: - GOVERSION: 1.12 - GOPATH: c:\gopath - GO111MODULE: on - -# scripts that run after cloning repository -install: - - set PATH=%GOPATH%\bin;c:\go\bin;c:\msys64\mingw64\bin;%PATH% - - go version - - go env - - python --version - - gcc --version - -# To run your custom scripts instead of automatic MSBuild -build_script: - # We need to disable firewall - https://github.com/appveyor/ci/issues/1579#issuecomment-309830648 - - ps: Disable-NetFirewallRule -DisplayName 'File and Printer Sharing (SMB-Out)' - - cd c:\gopath\src\github.com\dgraph-io\badger - - git branch - - go get -t ./... - -# To run your custom scripts instead of automatic tests -test_script: - # Unit tests - - ps: Add-AppveyorTest "Unit Tests" -Outcome Running - - go test -v github.com/dgraph-io/badger/... - - ps: Update-AppveyorTest "Unit Tests" -Outcome Passed - -notifications: - - provider: Email - to: - - pawan@dgraph.io - on_build_failure: true - on_build_status_changed: true -# to disable deployment -deploy: off - diff --git a/vendor/github.com/dgraph-io/badger/v3/backup.go b/vendor/github.com/dgraph-io/badger/v3/backup.go deleted file mode 100644 index 42bdc1791e..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/backup.go +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "bufio" - "bytes" - "context" - "encoding/binary" - "io" - - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" - "github.com/golang/protobuf/proto" - "github.com/pkg/errors" -) - -// flushThreshold determines when a buffer will be flushed. When performing a -// backup/restore, the entries will be batched up until the total size of batch -// is more than flushThreshold or entry size (without the value size) is more -// than the maxBatchSize. -const flushThreshold = 100 << 20 - -// Backup dumps a protobuf-encoded list of all entries in the database into the -// given writer, that are newer than or equal to the specified version. It -// returns a timestamp (version) indicating the version of last entry that is -// dumped, which after incrementing by 1 can be passed into later invocation to -// generate incremental backup of entries that have been added/modified since -// the last invocation of DB.Backup(). -// DB.Backup is a wrapper function over Stream.Backup to generate full and -// incremental backups of the DB. For more control over how many goroutines are -// used to generate the backup, or if you wish to backup only a certain range -// of keys, use Stream.Backup directly. -func (db *DB) Backup(w io.Writer, since uint64) (uint64, error) { - stream := db.NewStream() - stream.LogPrefix = "DB.Backup" - stream.SinceTs = since - return stream.Backup(w, since) -} - -// Backup dumps a protobuf-encoded list of all entries in the database into the -// given writer, that are newer than or equal to the specified version. It returns a -// timestamp(version) indicating the version of last entry that was dumped, which -// after incrementing by 1 can be passed into a later invocation to generate an -// incremental dump of entries that have been added/modified since the last -// invocation of Stream.Backup(). -// -// This can be used to backup the data in a database at a given point in time. -func (stream *Stream) Backup(w io.Writer, since uint64) (uint64, error) { - stream.KeyToList = func(key []byte, itr *Iterator) (*pb.KVList, error) { - list := &pb.KVList{} - a := itr.Alloc - for ; itr.Valid(); itr.Next() { - item := itr.Item() - if !bytes.Equal(item.Key(), key) { - return list, nil - } - if item.Version() < since { - return nil, errors.Errorf("Backup: Item Version: %d less than sinceTs: %d", - item.Version(), since) - } - - var valCopy []byte - if !item.IsDeletedOrExpired() { - // No need to copy value, if item is deleted or expired. - var err error - err = item.Value(func(val []byte) error { - valCopy = a.Copy(val) - return nil - }) - if err != nil { - stream.db.opt.Errorf("Key [%x, %d]. Error while fetching value [%v]\n", - item.Key(), item.Version(), err) - return nil, err - } - } - - // clear txn bits - meta := item.meta &^ (bitTxn | bitFinTxn) - kv := y.NewKV(a) - *kv = pb.KV{ - Key: a.Copy(item.Key()), - Value: valCopy, - UserMeta: a.Copy([]byte{item.UserMeta()}), - Version: item.Version(), - ExpiresAt: item.ExpiresAt(), - Meta: a.Copy([]byte{meta}), - } - list.Kv = append(list.Kv, kv) - - switch { - case item.DiscardEarlierVersions(): - // If we need to discard earlier versions of this item, add a delete - // marker just below the current version. - list.Kv = append(list.Kv, &pb.KV{ - Key: item.KeyCopy(nil), - Version: item.Version() - 1, - Meta: []byte{bitDelete}, - }) - return list, nil - - case item.IsDeletedOrExpired(): - return list, nil - } - } - return list, nil - } - - var maxVersion uint64 - stream.Send = func(buf *z.Buffer) error { - list, err := BufferToKVList(buf) - if err != nil { - return err - } - out := list.Kv[:0] - for _, kv := range list.Kv { - if maxVersion < kv.Version { - maxVersion = kv.Version - } - if !kv.StreamDone { - // Don't pick stream done changes. - out = append(out, kv) - } - } - list.Kv = out - return writeTo(list, w) - } - - if err := stream.Orchestrate(context.Background()); err != nil { - return 0, err - } - return maxVersion, nil -} - -func writeTo(list *pb.KVList, w io.Writer) error { - if err := binary.Write(w, binary.LittleEndian, uint64(proto.Size(list))); err != nil { - return err - } - buf, err := proto.Marshal(list) - if err != nil { - return err - } - _, err = w.Write(buf) - return err -} - -// KVLoader is used to write KVList objects in to badger. It can be used to restore a backup. -type KVLoader struct { - db *DB - throttle *y.Throttle - entries []*Entry - entriesSize int64 - totalSize int64 -} - -// NewKVLoader returns a new instance of KVLoader. -func (db *DB) NewKVLoader(maxPendingWrites int) *KVLoader { - return &KVLoader{ - db: db, - throttle: y.NewThrottle(maxPendingWrites), - entries: make([]*Entry, 0, db.opt.maxBatchCount), - } -} - -// Set writes the key-value pair to the database. -func (l *KVLoader) Set(kv *pb.KV) error { - var userMeta, meta byte - if len(kv.UserMeta) > 0 { - userMeta = kv.UserMeta[0] - } - if len(kv.Meta) > 0 { - meta = kv.Meta[0] - } - e := &Entry{ - Key: y.KeyWithTs(kv.Key, kv.Version), - Value: kv.Value, - UserMeta: userMeta, - ExpiresAt: kv.ExpiresAt, - meta: meta, - } - estimatedSize := e.estimateSizeAndSetThreshold(l.db.valueThreshold()) - // Flush entries if inserting the next entry would overflow the transactional limits. - if int64(len(l.entries))+1 >= l.db.opt.maxBatchCount || - l.entriesSize+estimatedSize >= l.db.opt.maxBatchSize || - l.totalSize >= flushThreshold { - if err := l.send(); err != nil { - return err - } - } - l.entries = append(l.entries, e) - l.entriesSize += estimatedSize - l.totalSize += estimatedSize + int64(len(e.Value)) - return nil -} - -func (l *KVLoader) send() error { - if err := l.throttle.Do(); err != nil { - return err - } - if err := l.db.batchSetAsync(l.entries, func(err error) { - l.throttle.Done(err) - }); err != nil { - return err - } - - l.entries = make([]*Entry, 0, l.db.opt.maxBatchCount) - l.entriesSize = 0 - l.totalSize = 0 - return nil -} - -// Finish is meant to be called after all the key-value pairs have been loaded. -func (l *KVLoader) Finish() error { - if len(l.entries) > 0 { - if err := l.send(); err != nil { - return err - } - } - return l.throttle.Finish() -} - -// Load reads a protobuf-encoded list of all entries from a reader and writes -// them to the database. This can be used to restore the database from a backup -// made by calling DB.Backup(). If more complex logic is needed to restore a badger -// backup, the KVLoader interface should be used instead. -// -// DB.Load() should be called on a database that is not running any other -// concurrent transactions while it is running. -func (db *DB) Load(r io.Reader, maxPendingWrites int) error { - br := bufio.NewReaderSize(r, 16<<10) - unmarshalBuf := make([]byte, 1<<10) - - ldr := db.NewKVLoader(maxPendingWrites) - for { - var sz uint64 - err := binary.Read(br, binary.LittleEndian, &sz) - if err == io.EOF { - break - } else if err != nil { - return err - } - - if cap(unmarshalBuf) < int(sz) { - unmarshalBuf = make([]byte, sz) - } - - if _, err = io.ReadFull(br, unmarshalBuf[:sz]); err != nil { - return err - } - - list := &pb.KVList{} - if err := proto.Unmarshal(unmarshalBuf[:sz], list); err != nil { - return err - } - - for _, kv := range list.Kv { - if err := ldr.Set(kv); err != nil { - return err - } - - // Update nextTxnTs, memtable stores this - // timestamp in badger head when flushed. - if kv.Version >= db.orc.nextTxnTs { - db.orc.nextTxnTs = kv.Version + 1 - } - } - } - - if err := ldr.Finish(); err != nil { - return err - } - db.orc.txnMark.Done(db.orc.nextTxnTs - 1) - return nil -} diff --git a/vendor/github.com/dgraph-io/badger/v3/batch.go b/vendor/github.com/dgraph-io/badger/v3/batch.go deleted file mode 100644 index a57022ea78..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/batch.go +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "sync" - "sync/atomic" - - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" - "github.com/pkg/errors" -) - -// WriteBatch holds the necessary info to perform batched writes. -type WriteBatch struct { - sync.Mutex - txn *Txn - db *DB - throttle *y.Throttle - err atomic.Value - - isManaged bool - commitTs uint64 - finished bool -} - -// NewWriteBatch creates a new WriteBatch. This provides a way to conveniently do a lot of writes, -// batching them up as tightly as possible in a single transaction and using callbacks to avoid -// waiting for them to commit, thus achieving good performance. This API hides away the logic of -// creating and committing transactions. Due to the nature of SSI guaratees provided by Badger, -// blind writes can never encounter transaction conflicts (ErrConflict). -func (db *DB) NewWriteBatch() *WriteBatch { - if db.opt.managedTxns { - panic("cannot use NewWriteBatch in managed mode. Use NewWriteBatchAt instead") - } - return db.newWriteBatch(false) -} - -func (db *DB) newWriteBatch(isManaged bool) *WriteBatch { - return &WriteBatch{ - db: db, - isManaged: isManaged, - txn: db.newTransaction(true, isManaged), - throttle: y.NewThrottle(16), - } -} - -// SetMaxPendingTxns sets a limit on maximum number of pending transactions while writing batches. -// This function should be called before using WriteBatch. Default value of MaxPendingTxns is -// 16 to minimise memory usage. -func (wb *WriteBatch) SetMaxPendingTxns(max int) { - wb.throttle = y.NewThrottle(max) -} - -// Cancel function must be called if there's a chance that Flush might not get -// called. If neither Flush or Cancel is called, the transaction oracle would -// never get a chance to clear out the row commit timestamp map, thus causing an -// unbounded memory consumption. Typically, you can call Cancel as a defer -// statement right after NewWriteBatch is called. -// -// Note that any committed writes would still go through despite calling Cancel. -func (wb *WriteBatch) Cancel() { - wb.Lock() - defer wb.Unlock() - wb.finished = true - if err := wb.throttle.Finish(); err != nil { - wb.db.opt.Errorf("WatchBatch.Cancel error while finishing: %v", err) - } - wb.txn.Discard() -} - -func (wb *WriteBatch) callback(err error) { - // sync.WaitGroup is thread-safe, so it doesn't need to be run inside wb.Lock. - defer wb.throttle.Done(err) - if err == nil { - return - } - if err := wb.Error(); err != nil { - return - } - wb.err.Store(err) -} - -func (wb *WriteBatch) writeKV(kv *pb.KV) error { - e := Entry{Key: kv.Key, Value: kv.Value} - if len(kv.UserMeta) > 0 { - e.UserMeta = kv.UserMeta[0] - } - y.AssertTrue(kv.Version != 0) - e.version = kv.Version - return wb.handleEntry(&e) -} - -func (wb *WriteBatch) Write(buf *z.Buffer) error { - wb.Lock() - defer wb.Unlock() - - err := buf.SliceIterate(func(s []byte) error { - kv := &pb.KV{} - if err := kv.Unmarshal(s); err != nil { - return err - } - return wb.writeKV(kv) - }) - return err -} - -func (wb *WriteBatch) WriteList(kvList *pb.KVList) error { - wb.Lock() - defer wb.Unlock() - for _, kv := range kvList.Kv { - if err := wb.writeKV(kv); err != nil { - return err - } - } - return nil -} - -// SetEntryAt is the equivalent of Txn.SetEntry but it also allows setting version for the entry. -// SetEntryAt can be used only in managed mode. -func (wb *WriteBatch) SetEntryAt(e *Entry, ts uint64) error { - if !wb.db.opt.managedTxns { - return errors.New("SetEntryAt can only be used in managed mode. Use SetEntry instead") - } - e.version = ts - return wb.SetEntry(e) -} - -// Should be called with lock acquired. -func (wb *WriteBatch) handleEntry(e *Entry) error { - if err := wb.txn.SetEntry(e); err != ErrTxnTooBig { - return err - } - // Txn has reached it's zenith. Commit now. - if cerr := wb.commit(); cerr != nil { - return cerr - } - // This time the error must not be ErrTxnTooBig, otherwise, we make the - // error permanent. - if err := wb.txn.SetEntry(e); err != nil { - wb.err.Store(err) - return err - } - return nil -} - -// SetEntry is the equivalent of Txn.SetEntry. -func (wb *WriteBatch) SetEntry(e *Entry) error { - wb.Lock() - defer wb.Unlock() - return wb.handleEntry(e) -} - -// Set is equivalent of Txn.Set(). -func (wb *WriteBatch) Set(k, v []byte) error { - e := &Entry{Key: k, Value: v} - return wb.SetEntry(e) -} - -// DeleteAt is equivalent of Txn.Delete but accepts a delete timestamp. -func (wb *WriteBatch) DeleteAt(k []byte, ts uint64) error { - e := Entry{Key: k, meta: bitDelete, version: ts} - return wb.SetEntry(&e) -} - -// Delete is equivalent of Txn.Delete. -func (wb *WriteBatch) Delete(k []byte) error { - wb.Lock() - defer wb.Unlock() - - if err := wb.txn.Delete(k); err != ErrTxnTooBig { - return err - } - if err := wb.commit(); err != nil { - return err - } - if err := wb.txn.Delete(k); err != nil { - wb.err.Store(err) - return err - } - return nil -} - -// Caller to commit must hold a write lock. -func (wb *WriteBatch) commit() error { - if err := wb.Error(); err != nil { - return err - } - if wb.finished { - return y.ErrCommitAfterFinish - } - if err := wb.throttle.Do(); err != nil { - wb.err.Store(err) - return err - } - wb.txn.CommitWith(wb.callback) - wb.txn = wb.db.newTransaction(true, wb.isManaged) - wb.txn.commitTs = wb.commitTs - return wb.Error() -} - -// Flush must be called at the end to ensure that any pending writes get committed to Badger. Flush -// returns any error stored by WriteBatch. -func (wb *WriteBatch) Flush() error { - wb.Lock() - err := wb.commit() - if err != nil { - wb.Unlock() - return err - } - wb.finished = true - wb.txn.Discard() - wb.Unlock() - - if err := wb.throttle.Finish(); err != nil { - if wb.Error() != nil { - return errors.Errorf("wb.err: %s err: %s", wb.Error(), err) - } - return err - } - - return wb.Error() -} - -// Error returns any errors encountered so far. No commits would be run once an error is detected. -func (wb *WriteBatch) Error() error { - // If the interface conversion fails, the err will be nil. - err, _ := wb.err.Load().(error) - return err -} diff --git a/vendor/github.com/dgraph-io/badger/v3/changes.sh b/vendor/github.com/dgraph-io/badger/v3/changes.sh deleted file mode 100644 index e7cede9151..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/changes.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -set -e -GHORG=${GHORG:-dgraph-io} -GHREPO=${GHREPO:-badger} -cat < 0 { - r.right = kr.right - } - if kr.inf { - r.inf = true - } -} - -func (r keyRange) overlapsWith(dst keyRange) bool { - // Empty keyRange always overlaps. - if r.isEmpty() { - return true - } - // TODO(ibrahim): Do you need this? - // Empty dst doesn't overlap with anything. - if dst.isEmpty() { - return false - } - if r.inf || dst.inf { - return true - } - - // [dst.left, dst.right] ... [r.left, r.right] - // If my left is greater than dst right, we have no overlap. - if y.CompareKeys(r.left, dst.right) > 0 { - return false - } - // [r.left, r.right] ... [dst.left, dst.right] - // If my right is less than dst left, we have no overlap. - if y.CompareKeys(r.right, dst.left) < 0 { - return false - } - // We have overlap. - return true -} - -// getKeyRange returns the smallest and the biggest in the list of tables. -// TODO(naman): Write a test for this. The smallest and the biggest should -// be the smallest of the leftmost table and the biggest of the right most table. -func getKeyRange(tables ...*table.Table) keyRange { - if len(tables) == 0 { - return keyRange{} - } - smallest := tables[0].Smallest() - biggest := tables[0].Biggest() - for i := 1; i < len(tables); i++ { - if y.CompareKeys(tables[i].Smallest(), smallest) < 0 { - smallest = tables[i].Smallest() - } - if y.CompareKeys(tables[i].Biggest(), biggest) > 0 { - biggest = tables[i].Biggest() - } - } - - // We pick all the versions of the smallest and the biggest key. Note that version zero would - // be the rightmost key, considering versions are default sorted in descending order. - return keyRange{ - left: y.KeyWithTs(y.ParseKey(smallest), math.MaxUint64), - right: y.KeyWithTs(y.ParseKey(biggest), 0), - } -} - -type levelCompactStatus struct { - ranges []keyRange - delSize int64 -} - -func (lcs *levelCompactStatus) debug() string { - var b bytes.Buffer - for _, r := range lcs.ranges { - b.WriteString(r.String()) - } - return b.String() -} - -func (lcs *levelCompactStatus) overlapsWith(dst keyRange) bool { - for _, r := range lcs.ranges { - if r.overlapsWith(dst) { - return true - } - } - return false -} - -func (lcs *levelCompactStatus) remove(dst keyRange) bool { - final := lcs.ranges[:0] - var found bool - for _, r := range lcs.ranges { - if !r.equals(dst) { - final = append(final, r) - } else { - found = true - } - } - lcs.ranges = final - return found -} - -type compactStatus struct { - sync.RWMutex - levels []*levelCompactStatus - tables map[uint64]struct{} -} - -func (cs *compactStatus) overlapsWith(level int, this keyRange) bool { - cs.RLock() - defer cs.RUnlock() - - thisLevel := cs.levels[level] - return thisLevel.overlapsWith(this) -} - -func (cs *compactStatus) delSize(l int) int64 { - cs.RLock() - defer cs.RUnlock() - return cs.levels[l].delSize -} - -type thisAndNextLevelRLocked struct{} - -// compareAndAdd will check whether we can run this compactDef. That it doesn't overlap with any -// other running compaction. If it can be run, it would store this run in the compactStatus state. -func (cs *compactStatus) compareAndAdd(_ thisAndNextLevelRLocked, cd compactDef) bool { - cs.Lock() - defer cs.Unlock() - - tl := cd.thisLevel.level - y.AssertTruef(tl < len(cs.levels), "Got level %d. Max levels: %d", tl, len(cs.levels)) - thisLevel := cs.levels[cd.thisLevel.level] - nextLevel := cs.levels[cd.nextLevel.level] - - if thisLevel.overlapsWith(cd.thisRange) { - return false - } - if nextLevel.overlapsWith(cd.nextRange) { - return false - } - // Check whether this level really needs compaction or not. Otherwise, we'll end up - // running parallel compactions for the same level. - // Update: We should not be checking size here. Compaction priority already did the size checks. - // Here we should just be executing the wish of others. - - thisLevel.ranges = append(thisLevel.ranges, cd.thisRange) - nextLevel.ranges = append(nextLevel.ranges, cd.nextRange) - thisLevel.delSize += cd.thisSize - for _, t := range append(cd.top, cd.bot...) { - cs.tables[t.ID()] = struct{}{} - } - return true -} - -func (cs *compactStatus) delete(cd compactDef) { - cs.Lock() - defer cs.Unlock() - - tl := cd.thisLevel.level - y.AssertTruef(tl < len(cs.levels), "Got level %d. Max levels: %d", tl, len(cs.levels)) - - thisLevel := cs.levels[cd.thisLevel.level] - nextLevel := cs.levels[cd.nextLevel.level] - - thisLevel.delSize -= cd.thisSize - found := thisLevel.remove(cd.thisRange) - // The following check makes sense only if we're compacting more than one - // table. In case of the max level, we might rewrite a single table to - // remove stale data. - if cd.thisLevel != cd.nextLevel && !cd.nextRange.isEmpty() { - found = nextLevel.remove(cd.nextRange) && found - } - - if !found { - this := cd.thisRange - next := cd.nextRange - fmt.Printf("Looking for: %s in this level %d.\n", this, tl) - fmt.Printf("This Level:\n%s\n", thisLevel.debug()) - fmt.Println() - fmt.Printf("Looking for: %s in next level %d.\n", next, cd.nextLevel.level) - fmt.Printf("Next Level:\n%s\n", nextLevel.debug()) - log.Fatal("keyRange not found") - } - for _, t := range append(cd.top, cd.bot...) { - _, ok := cs.tables[t.ID()] - y.AssertTrue(ok) - delete(cs.tables, t.ID()) - } -} diff --git a/vendor/github.com/dgraph-io/badger/v3/db.go b/vendor/github.com/dgraph-io/badger/v3/db.go deleted file mode 100644 index 3ac6a2d959..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/db.go +++ /dev/null @@ -1,2058 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "bytes" - "context" - "encoding/binary" - "expvar" - "fmt" - "math" - "os" - "path/filepath" - "sort" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/dgraph-io/badger/v3/options" - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/skl" - "github.com/dgraph-io/badger/v3/table" - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto" - "github.com/dgraph-io/ristretto/z" - humanize "github.com/dustin/go-humanize" - "github.com/pkg/errors" -) - -var ( - badgerPrefix = []byte("!badger!") // Prefix for internal keys used by badger. - txnKey = []byte("!badger!txn") // For indicating end of entries in txn. - bannedNsKey = []byte("!badger!banned") // For storing the banned namespaces. -) - -const ( - maxNumSplits = 128 -) - -type closers struct { - updateSize *z.Closer - compactors *z.Closer - memtable *z.Closer - writes *z.Closer - valueGC *z.Closer - pub *z.Closer - cacheHealth *z.Closer -} - -type lockedKeys struct { - sync.RWMutex - keys map[uint64]struct{} -} - -func (lk *lockedKeys) add(key uint64) { - lk.Lock() - defer lk.Unlock() - lk.keys[key] = struct{}{} -} - -func (lk *lockedKeys) has(key uint64) bool { - lk.RLock() - defer lk.RUnlock() - _, ok := lk.keys[key] - return ok -} - -func (lk *lockedKeys) all() []uint64 { - lk.RLock() - defer lk.RUnlock() - keys := make([]uint64, 0, len(lk.keys)) - for key := range lk.keys { - keys = append(keys, key) - } - return keys -} - -// DB provides the various functions required to interact with Badger. -// DB is thread-safe. -type DB struct { - lock sync.RWMutex // Guards list of inmemory tables, not individual reads and writes. - - dirLockGuard *directoryLockGuard - // nil if Dir and ValueDir are the same - valueDirGuard *directoryLockGuard - - closers closers - - mt *memTable // Our latest (actively written) in-memory table - imm []*memTable // Add here only AFTER pushing to flushChan. - - // Initialized via openMemTables. - nextMemFid int - - opt Options - manifest *manifestFile - lc *levelsController - vlog valueLog - writeCh chan *request - flushChan chan flushTask // For flushing memtables. - closeOnce sync.Once // For closing DB only once. - - blockWrites int32 - isClosed uint32 - - orc *oracle - bannedNamespaces *lockedKeys - threshold *vlogThreshold - - pub *publisher - registry *KeyRegistry - blockCache *ristretto.Cache - indexCache *ristretto.Cache - allocPool *z.AllocatorPool -} - -const ( - kvWriteChCapacity = 1000 -) - -func checkAndSetOptions(opt *Options) error { - // It's okay to have zero compactors which will disable all compactions but - // we cannot have just one compactor otherwise we will end up with all data - // on level 2. - if opt.NumCompactors == 1 { - return errors.New("Cannot have 1 compactor. Need at least 2") - } - - if opt.InMemory && (opt.Dir != "" || opt.ValueDir != "") { - return errors.New("Cannot use badger in Disk-less mode with Dir or ValueDir set") - } - opt.maxBatchSize = (15 * opt.MemTableSize) / 100 - opt.maxBatchCount = opt.maxBatchSize / int64(skl.MaxNodeSize) - - // This is the maximum value, vlogThreshold can have if dynamic thresholding is enabled. - opt.maxValueThreshold = math.Min(maxValueThreshold, float64(opt.maxBatchSize)) - if opt.VLogPercentile < 0.0 || opt.VLogPercentile > 1.0 { - return errors.New("vlogPercentile must be within range of 0.0-1.0") - } - - // We are limiting opt.ValueThreshold to maxValueThreshold for now. - if opt.ValueThreshold > maxValueThreshold { - return errors.Errorf("Invalid ValueThreshold, must be less or equal to %d", - maxValueThreshold) - } - - // If ValueThreshold is greater than opt.maxBatchSize, we won't be able to push any data using - // the transaction APIs. Transaction batches entries into batches of size opt.maxBatchSize. - if opt.ValueThreshold > opt.maxBatchSize { - return errors.Errorf("Valuethreshold %d greater than max batch size of %d. Either "+ - "reduce opt.ValueThreshold or increase opt.MaxTableSize.", - opt.ValueThreshold, opt.maxBatchSize) - } - // ValueLogFileSize should be stricly LESS than 2<<30 otherwise we will - // overflow the uint32 when we mmap it in OpenMemtable. - if !(opt.ValueLogFileSize < 2<<30 && opt.ValueLogFileSize >= 1<<20) { - return ErrValueLogSize - } - - if opt.ReadOnly { - // Do not perform compaction in read only mode. - opt.CompactL0OnClose = false - } - - needCache := (opt.Compression != options.None) || (len(opt.EncryptionKey) > 0) - if needCache && opt.BlockCacheSize == 0 { - panic("BlockCacheSize should be set since compression/encryption are enabled") - } - return nil -} - -// Open returns a new DB object. -func Open(opt Options) (*DB, error) { - if err := checkAndSetOptions(&opt); err != nil { - return nil, err - } - var dirLockGuard, valueDirLockGuard *directoryLockGuard - - // Create directories and acquire lock on it only if badger is not running in InMemory mode. - // We don't have any directories/files in InMemory mode so we don't need to acquire - // any locks on them. - if !opt.InMemory { - if err := createDirs(opt); err != nil { - return nil, err - } - var err error - if !opt.BypassLockGuard { - dirLockGuard, err = acquireDirectoryLock(opt.Dir, lockFile, opt.ReadOnly) - if err != nil { - return nil, err - } - defer func() { - if dirLockGuard != nil { - _ = dirLockGuard.release() - } - }() - absDir, err := filepath.Abs(opt.Dir) - if err != nil { - return nil, err - } - absValueDir, err := filepath.Abs(opt.ValueDir) - if err != nil { - return nil, err - } - if absValueDir != absDir { - valueDirLockGuard, err = acquireDirectoryLock(opt.ValueDir, lockFile, opt.ReadOnly) - if err != nil { - return nil, err - } - defer func() { - if valueDirLockGuard != nil { - _ = valueDirLockGuard.release() - } - }() - } - } - } - - manifestFile, manifest, err := openOrCreateManifestFile(opt) - if err != nil { - return nil, err - } - defer func() { - if manifestFile != nil { - _ = manifestFile.close() - } - }() - - db := &DB{ - imm: make([]*memTable, 0, opt.NumMemtables), - flushChan: make(chan flushTask, opt.NumMemtables), - writeCh: make(chan *request, kvWriteChCapacity), - opt: opt, - manifest: manifestFile, - dirLockGuard: dirLockGuard, - valueDirGuard: valueDirLockGuard, - orc: newOracle(opt), - pub: newPublisher(), - allocPool: z.NewAllocatorPool(8), - bannedNamespaces: &lockedKeys{keys: make(map[uint64]struct{})}, - threshold: initVlogThreshold(&opt), - } - // Cleanup all the goroutines started by badger in case of an error. - defer func() { - if err != nil { - opt.Errorf("Received err: %v. Cleaning up...", err) - db.cleanup() - db = nil - } - }() - - if opt.BlockCacheSize > 0 { - numInCache := opt.BlockCacheSize / int64(opt.BlockSize) - if numInCache == 0 { - // Make the value of this variable at least one since the cache requires - // the number of counters to be greater than zero. - numInCache = 1 - } - - config := ristretto.Config{ - NumCounters: numInCache * 8, - MaxCost: opt.BlockCacheSize, - BufferItems: 64, - Metrics: true, - OnExit: table.BlockEvictHandler, - } - db.blockCache, err = ristretto.NewCache(&config) - if err != nil { - return nil, y.Wrap(err, "failed to create data cache") - } - } - - if opt.IndexCacheSize > 0 { - // Index size is around 5% of the table size. - indexSz := int64(float64(opt.MemTableSize) * 0.05) - numInCache := opt.IndexCacheSize / indexSz - if numInCache == 0 { - // Make the value of this variable at least one since the cache requires - // the number of counters to be greater than zero. - numInCache = 1 - } - - config := ristretto.Config{ - NumCounters: numInCache * 8, - MaxCost: opt.IndexCacheSize, - BufferItems: 64, - Metrics: true, - } - db.indexCache, err = ristretto.NewCache(&config) - if err != nil { - return nil, y.Wrap(err, "failed to create bf cache") - } - } - - db.closers.cacheHealth = z.NewCloser(1) - go db.monitorCache(db.closers.cacheHealth) - - if db.opt.InMemory { - db.opt.SyncWrites = false - // If badger is running in memory mode, push everything into the LSM Tree. - db.opt.ValueThreshold = math.MaxInt32 - } - krOpt := KeyRegistryOptions{ - ReadOnly: opt.ReadOnly, - Dir: opt.Dir, - EncryptionKey: opt.EncryptionKey, - EncryptionKeyRotationDuration: opt.EncryptionKeyRotationDuration, - InMemory: opt.InMemory, - } - - if db.registry, err = OpenKeyRegistry(krOpt); err != nil { - return db, err - } - db.calculateSize() - db.closers.updateSize = z.NewCloser(1) - go db.updateSize(db.closers.updateSize) - - if err := db.openMemTables(db.opt); err != nil { - return nil, y.Wrapf(err, "while opening memtables") - } - - if !db.opt.ReadOnly { - if db.mt, err = db.newMemTable(); err != nil { - return nil, y.Wrapf(err, "cannot create memtable") - } - } - - // newLevelsController potentially loads files in directory. - if db.lc, err = newLevelsController(db, &manifest); err != nil { - return db, err - } - - // Initialize vlog struct. - db.vlog.init(db) - - if !opt.ReadOnly { - db.closers.compactors = z.NewCloser(1) - db.lc.startCompact(db.closers.compactors) - - db.closers.memtable = z.NewCloser(1) - go func() { - _ = db.flushMemtable(db.closers.memtable) // Need levels controller to be up. - }() - // Flush them to disk asap. - for _, mt := range db.imm { - db.flushChan <- flushTask{mt: mt} - } - } - // We do increment nextTxnTs below. So, no need to do it here. - db.orc.nextTxnTs = db.MaxVersion() - db.opt.Infof("Set nextTxnTs to %d", db.orc.nextTxnTs) - - if err = db.vlog.open(db); err != nil { - return db, y.Wrapf(err, "During db.vlog.open") - } - - // Let's advance nextTxnTs to one more than whatever we observed via - // replaying the logs. - db.orc.txnMark.Done(db.orc.nextTxnTs) - // In normal mode, we must update readMark so older versions of keys can be removed during - // compaction when run in offline mode via the flatten tool. - db.orc.readMark.Done(db.orc.nextTxnTs) - db.orc.incrementNextTs() - - go db.threshold.listenForValueThresholdUpdate() - - if err := db.initBannedNamespaces(); err != nil { - return db, errors.Wrapf(err, "While setting banned keys") - } - - db.closers.writes = z.NewCloser(1) - go db.doWrites(db.closers.writes) - - if !db.opt.InMemory { - db.closers.valueGC = z.NewCloser(1) - go db.vlog.waitOnGC(db.closers.valueGC) - } - - db.closers.pub = z.NewCloser(1) - go db.pub.listenForUpdates(db.closers.pub) - - valueDirLockGuard = nil - dirLockGuard = nil - manifestFile = nil - return db, nil -} - -// initBannedNamespaces retrieves the banned namepsaces from the DB and updates in-memory structure. -func (db *DB) initBannedNamespaces() error { - if db.opt.NamespaceOffset < 0 { - return nil - } - return db.View(func(txn *Txn) error { - iopts := DefaultIteratorOptions - iopts.Prefix = bannedNsKey - iopts.PrefetchValues = false - iopts.InternalAccess = true - itr := txn.NewIterator(iopts) - defer itr.Close() - for itr.Rewind(); itr.Valid(); itr.Next() { - key := y.BytesToU64(itr.Item().Key()[len(bannedNsKey):]) - db.bannedNamespaces.add(key) - } - return nil - }) -} - -func (db *DB) MaxVersion() uint64 { - var maxVersion uint64 - update := func(a uint64) { - if a > maxVersion { - maxVersion = a - } - } - db.lock.Lock() - // In read only mode, we do not create new mem table. - if !db.opt.ReadOnly { - update(db.mt.maxVersion) - } - for _, mt := range db.imm { - update(mt.maxVersion) - } - db.lock.Unlock() - for _, ti := range db.Tables() { - update(ti.MaxVersion) - } - return maxVersion -} - -func (db *DB) monitorCache(c *z.Closer) { - defer c.Done() - count := 0 - analyze := func(name string, metrics *ristretto.Metrics) { - // If the mean life expectancy is less than 10 seconds, the cache - // might be too small. - le := metrics.LifeExpectancySeconds() - if le == nil { - return - } - lifeTooShort := le.Count > 0 && float64(le.Sum)/float64(le.Count) < 10 - hitRatioTooLow := metrics.Ratio() > 0 && metrics.Ratio() < 0.4 - if lifeTooShort && hitRatioTooLow { - db.opt.Warningf("%s might be too small. Metrics: %s\n", name, metrics) - db.opt.Warningf("Cache life expectancy (in seconds): %+v\n", le) - - } else if le.Count > 1000 && count%5 == 0 { - db.opt.Infof("%s metrics: %s\n", name, metrics) - } - } - - ticker := time.NewTicker(1 * time.Minute) - defer ticker.Stop() - for { - select { - case <-c.HasBeenClosed(): - return - case <-ticker.C: - } - - analyze("Block cache", db.BlockCacheMetrics()) - analyze("Index cache", db.IndexCacheMetrics()) - count++ - } -} - -// cleanup stops all the goroutines started by badger. This is used in open to -// cleanup goroutines in case of an error. -func (db *DB) cleanup() { - db.stopMemoryFlush() - db.stopCompactions() - - db.blockCache.Close() - db.indexCache.Close() - if db.closers.updateSize != nil { - db.closers.updateSize.Signal() - } - if db.closers.valueGC != nil { - db.closers.valueGC.Signal() - } - if db.closers.writes != nil { - db.closers.writes.Signal() - } - if db.closers.pub != nil { - db.closers.pub.Signal() - } - - db.orc.Stop() - - // Do not use vlog.Close() here. vlog.Close truncates the files. We don't - // want to truncate files unless the user has specified the truncate flag. -} - -// BlockCacheMetrics returns the metrics for the underlying block cache. -func (db *DB) BlockCacheMetrics() *ristretto.Metrics { - if db.blockCache != nil { - return db.blockCache.Metrics - } - return nil -} - -// IndexCacheMetrics returns the metrics for the underlying index cache. -func (db *DB) IndexCacheMetrics() *ristretto.Metrics { - if db.indexCache != nil { - return db.indexCache.Metrics - } - return nil -} - -// Close closes a DB. It's crucial to call it to ensure all the pending updates make their way to -// disk. Calling DB.Close() multiple times would still only close the DB once. -func (db *DB) Close() error { - var err error - db.closeOnce.Do(func() { - err = db.close() - }) - return err -} - -// IsClosed denotes if the badger DB is closed or not. A DB instance should not -// be used after closing it. -func (db *DB) IsClosed() bool { - return atomic.LoadUint32(&db.isClosed) == 1 -} - -func (db *DB) close() (err error) { - defer db.allocPool.Release() - - db.opt.Debugf("Closing database") - db.opt.Infof("Lifetime L0 stalled for: %s\n", time.Duration(atomic.LoadInt64(&db.lc.l0stallsMs))) - - atomic.StoreInt32(&db.blockWrites, 1) - - if !db.opt.InMemory { - // Stop value GC first. - db.closers.valueGC.SignalAndWait() - } - - // Stop writes next. - db.closers.writes.SignalAndWait() - - // Don't accept any more write. - close(db.writeCh) - - db.closers.pub.SignalAndWait() - db.closers.cacheHealth.Signal() - - // Make sure that block writer is done pushing stuff into memtable! - // Otherwise, you will have a race condition: we are trying to flush memtables - // and remove them completely, while the block / memtable writer is still - // trying to push stuff into the memtable. This will also resolve the value - // offset problem: as we push into memtable, we update value offsets there. - if db.mt != nil { - if db.mt.sl.Empty() { - // Remove the memtable if empty. - db.mt.DecrRef() - } else { - db.opt.Debugf("Flushing memtable") - for { - pushedFlushTask := func() bool { - db.lock.Lock() - defer db.lock.Unlock() - y.AssertTrue(db.mt != nil) - select { - case db.flushChan <- flushTask{mt: db.mt}: - db.imm = append(db.imm, db.mt) // Flusher will attempt to remove this from s.imm. - db.mt = nil // Will segfault if we try writing! - db.opt.Debugf("pushed to flush chan\n") - return true - default: - // If we fail to push, we need to unlock and wait for a short while. - // The flushing operation needs to update s.imm. Otherwise, we have a - // deadlock. - // TODO: Think about how to do this more cleanly, maybe without any locks. - } - return false - }() - if pushedFlushTask { - break - } - time.Sleep(10 * time.Millisecond) - } - } - } - db.stopMemoryFlush() - db.stopCompactions() - - // Force Compact L0 - // We don't need to care about cstatus since no parallel compaction is running. - if db.opt.CompactL0OnClose { - err := db.lc.doCompact(173, compactionPriority{level: 0, score: 1.73}) - switch err { - case errFillTables: - // This error only means that there might be enough tables to do a compaction. So, we - // should not report it to the end user to avoid confusing them. - case nil: - db.opt.Debugf("Force compaction on level 0 done") - default: - db.opt.Warningf("While forcing compaction on level 0: %v", err) - } - } - - // Now close the value log. - if vlogErr := db.vlog.Close(); vlogErr != nil { - err = y.Wrap(vlogErr, "DB.Close") - } - - db.opt.Infof(db.LevelsToString()) - if lcErr := db.lc.close(); err == nil { - err = y.Wrap(lcErr, "DB.Close") - } - db.opt.Debugf("Waiting for closer") - db.closers.updateSize.SignalAndWait() - db.orc.Stop() - db.blockCache.Close() - db.indexCache.Close() - - atomic.StoreUint32(&db.isClosed, 1) - db.threshold.close() - - if db.opt.InMemory { - return - } - - if db.dirLockGuard != nil { - if guardErr := db.dirLockGuard.release(); err == nil { - err = y.Wrap(guardErr, "DB.Close") - } - } - if db.valueDirGuard != nil { - if guardErr := db.valueDirGuard.release(); err == nil { - err = y.Wrap(guardErr, "DB.Close") - } - } - if manifestErr := db.manifest.close(); err == nil { - err = y.Wrap(manifestErr, "DB.Close") - } - if registryErr := db.registry.Close(); err == nil { - err = y.Wrap(registryErr, "DB.Close") - } - - // Fsync directories to ensure that lock file, and any other removed files whose directory - // we haven't specifically fsynced, are guaranteed to have their directory entry removal - // persisted to disk. - if syncErr := db.syncDir(db.opt.Dir); err == nil { - err = y.Wrap(syncErr, "DB.Close") - } - if syncErr := db.syncDir(db.opt.ValueDir); err == nil { - err = y.Wrap(syncErr, "DB.Close") - } - - return err -} - -// VerifyChecksum verifies checksum for all tables on all levels. -// This method can be used to verify checksum, if opt.ChecksumVerificationMode is NoVerification. -func (db *DB) VerifyChecksum() error { - return db.lc.verifyChecksum() -} - -const ( - lockFile = "LOCK" -) - -// Sync syncs database content to disk. This function provides -// more control to user to sync data whenever required. -func (db *DB) Sync() error { - return db.vlog.sync() -} - -// getMemtables returns the current memtables and get references. -func (db *DB) getMemTables() ([]*memTable, func()) { - db.lock.RLock() - defer db.lock.RUnlock() - - var tables []*memTable - - // Mutable memtable does not exist in read-only mode. - if !db.opt.ReadOnly { - // Get mutable memtable. - tables = append(tables, db.mt) - db.mt.IncrRef() - } - - // Get immutable memtables. - last := len(db.imm) - 1 - for i := range db.imm { - tables = append(tables, db.imm[last-i]) - db.imm[last-i].IncrRef() - } - return tables, func() { - for _, tbl := range tables { - tbl.DecrRef() - } - } -} - -// get returns the value in memtable or disk for given key. -// Note that value will include meta byte. -// -// IMPORTANT: We should never write an entry with an older timestamp for the same key, We need to -// maintain this invariant to search for the latest value of a key, or else we need to search in all -// tables and find the max version among them. To maintain this invariant, we also need to ensure -// that all versions of a key are always present in the same table from level 1, because compaction -// can push any table down. -// -// Update(23/09/2020) - We have dropped the move key implementation. Earlier we -// were inserting move keys to fix the invalid value pointers but we no longer -// do that. For every get("fooX") call where X is the version, we will search -// for "fooX" in all the levels of the LSM tree. This is expensive but it -// removes the overhead of handling move keys completely. -func (db *DB) get(key []byte) (y.ValueStruct, error) { - if db.IsClosed() { - return y.ValueStruct{}, ErrDBClosed - } - tables, decr := db.getMemTables() // Lock should be released. - defer decr() - - var maxVs y.ValueStruct - version := y.ParseTs(key) - - y.NumGetsAdd(db.opt.MetricsEnabled, 1) - for i := 0; i < len(tables); i++ { - vs := tables[i].sl.Get(key) - y.NumMemtableGetsAdd(db.opt.MetricsEnabled, 1) - if vs.Meta == 0 && vs.Value == nil { - continue - } - // Found the required version of the key, return immediately. - if vs.Version == version { - return vs, nil - } - if maxVs.Version < vs.Version { - maxVs = vs - } - } - return db.lc.get(key, maxVs, 0) -} - -var requestPool = sync.Pool{ - New: func() interface{} { - return new(request) - }, -} - -func (db *DB) writeToLSM(b *request) error { - // We should check the length of b.Prts and b.Entries only when badger is not - // running in InMemory mode. In InMemory mode, we don't write anything to the - // value log and that's why the length of b.Ptrs will always be zero. - if !db.opt.InMemory && len(b.Ptrs) != len(b.Entries) { - return errors.Errorf("Ptrs and Entries don't match: %+v", b) - } - - for i, entry := range b.Entries { - var err error - if entry.skipVlogAndSetThreshold(db.valueThreshold()) { - // Will include deletion / tombstone case. - err = db.mt.Put(entry.Key, - y.ValueStruct{ - Value: entry.Value, - // Ensure value pointer flag is removed. Otherwise, the value will fail - // to be retrieved during iterator prefetch. `bitValuePointer` is only - // known to be set in write to LSM when the entry is loaded from a backup - // with lower ValueThreshold and its value was stored in the value log. - Meta: entry.meta &^ bitValuePointer, - UserMeta: entry.UserMeta, - ExpiresAt: entry.ExpiresAt, - }) - } else { - // Write pointer to Memtable. - err = db.mt.Put(entry.Key, - y.ValueStruct{ - Value: b.Ptrs[i].Encode(), - Meta: entry.meta | bitValuePointer, - UserMeta: entry.UserMeta, - ExpiresAt: entry.ExpiresAt, - }) - } - if err != nil { - return y.Wrapf(err, "while writing to memTable") - } - } - if db.opt.SyncWrites { - return db.mt.SyncWAL() - } - return nil -} - -// writeRequests is called serially by only one goroutine. -func (db *DB) writeRequests(reqs []*request) error { - if len(reqs) == 0 { - return nil - } - - done := func(err error) { - for _, r := range reqs { - r.Err = err - r.Wg.Done() - } - } - db.opt.Debugf("writeRequests called. Writing to value log") - err := db.vlog.write(reqs) - if err != nil { - done(err) - return err - } - - db.opt.Debugf("Sending updates to subscribers") - db.pub.sendUpdates(reqs) - db.opt.Debugf("Writing to memtable") - var count int - for _, b := range reqs { - if len(b.Entries) == 0 { - continue - } - count += len(b.Entries) - var i uint64 - for err = db.ensureRoomForWrite(); err == errNoRoom; err = db.ensureRoomForWrite() { - i++ - if i%100 == 0 { - db.opt.Debugf("Making room for writes") - } - // We need to poll a bit because both hasRoomForWrite and the flusher need access to s.imm. - // When flushChan is full and you are blocked there, and the flusher is trying to update s.imm, - // you will get a deadlock. - time.Sleep(10 * time.Millisecond) - } - if err != nil { - done(err) - return y.Wrap(err, "writeRequests") - } - if err := db.writeToLSM(b); err != nil { - done(err) - return y.Wrap(err, "writeRequests") - } - } - done(nil) - db.opt.Debugf("%d entries written", count) - return nil -} - -func (db *DB) sendToWriteCh(entries []*Entry) (*request, error) { - if atomic.LoadInt32(&db.blockWrites) == 1 { - return nil, ErrBlockedWrites - } - var count, size int64 - for _, e := range entries { - size += e.estimateSizeAndSetThreshold(db.valueThreshold()) - count++ - } - if count >= db.opt.maxBatchCount || size >= db.opt.maxBatchSize { - return nil, ErrTxnTooBig - } - - // We can only service one request because we need each txn to be stored in a contigous section. - // Txns should not interleave among other txns or rewrites. - req := requestPool.Get().(*request) - req.reset() - req.Entries = entries - req.Wg.Add(1) - req.IncrRef() // for db write - db.writeCh <- req // Handled in doWrites. - y.NumPutsAdd(db.opt.MetricsEnabled, int64(len(entries))) - - return req, nil -} - -func (db *DB) doWrites(lc *z.Closer) { - defer lc.Done() - pendingCh := make(chan struct{}, 1) - - writeRequests := func(reqs []*request) { - if err := db.writeRequests(reqs); err != nil { - db.opt.Errorf("writeRequests: %v", err) - } - <-pendingCh - } - - // This variable tracks the number of pending writes. - reqLen := new(expvar.Int) - y.PendingWritesSet(db.opt.MetricsEnabled, db.opt.Dir, reqLen) - - reqs := make([]*request, 0, 10) - for { - var r *request - select { - case r = <-db.writeCh: - case <-lc.HasBeenClosed(): - goto closedCase - } - - for { - reqs = append(reqs, r) - reqLen.Set(int64(len(reqs))) - - if len(reqs) >= 3*kvWriteChCapacity { - pendingCh <- struct{}{} // blocking. - goto writeCase - } - - select { - // Either push to pending, or continue to pick from writeCh. - case r = <-db.writeCh: - case pendingCh <- struct{}{}: - goto writeCase - case <-lc.HasBeenClosed(): - goto closedCase - } - } - - closedCase: - // All the pending request are drained. - // Don't close the writeCh, because it has be used in several places. - for { - select { - case r = <-db.writeCh: - reqs = append(reqs, r) - default: - pendingCh <- struct{}{} // Push to pending before doing a write. - writeRequests(reqs) - return - } - } - - writeCase: - go writeRequests(reqs) - reqs = make([]*request, 0, 10) - reqLen.Set(0) - } -} - -// batchSet applies a list of badger.Entry. If a request level error occurs it -// will be returned. -// Check(kv.BatchSet(entries)) -func (db *DB) batchSet(entries []*Entry) error { - req, err := db.sendToWriteCh(entries) - if err != nil { - return err - } - - return req.Wait() -} - -// batchSetAsync is the asynchronous version of batchSet. It accepts a callback -// function which is called when all the sets are complete. If a request level -// error occurs, it will be passed back via the callback. -// err := kv.BatchSetAsync(entries, func(err error)) { -// Check(err) -// } -func (db *DB) batchSetAsync(entries []*Entry, f func(error)) error { - req, err := db.sendToWriteCh(entries) - if err != nil { - return err - } - go func() { - err := req.Wait() - // Write is complete. Let's call the callback function now. - f(err) - }() - return nil -} - -var errNoRoom = errors.New("No room for write") - -// ensureRoomForWrite is always called serially. -func (db *DB) ensureRoomForWrite() error { - var err error - db.lock.Lock() - defer db.lock.Unlock() - - y.AssertTrue(db.mt != nil) // A nil mt indicates that DB is being closed. - if !db.mt.isFull() { - return nil - } - - select { - case db.flushChan <- flushTask{mt: db.mt}: - db.opt.Debugf("Flushing memtable, mt.size=%d size of flushChan: %d\n", - db.mt.sl.MemSize(), len(db.flushChan)) - // We manage to push this task. Let's modify imm. - db.imm = append(db.imm, db.mt) - db.mt, err = db.newMemTable() - if err != nil { - return y.Wrapf(err, "cannot create new mem table") - } - // New memtable is empty. We certainly have room. - return nil - default: - // We need to do this to unlock and allow the flusher to modify imm. - return errNoRoom - } -} - -func arenaSize(opt Options) int64 { - return opt.MemTableSize + opt.maxBatchSize + opt.maxBatchCount*int64(skl.MaxNodeSize) -} - -// buildL0Table builds a new table from the memtable. -func buildL0Table(ft flushTask, bopts table.Options) *table.Builder { - iter := ft.mt.sl.NewIterator() - defer iter.Close() - b := table.NewTableBuilder(bopts) - for iter.SeekToFirst(); iter.Valid(); iter.Next() { - if len(ft.dropPrefixes) > 0 && hasAnyPrefixes(iter.Key(), ft.dropPrefixes) { - continue - } - vs := iter.Value() - var vp valuePointer - if vs.Meta&bitValuePointer > 0 { - vp.Decode(vs.Value) - } - b.Add(iter.Key(), iter.Value(), vp.Len) - } - return b -} - -type flushTask struct { - mt *memTable - dropPrefixes [][]byte -} - -// handleFlushTask must be run serially. -func (db *DB) handleFlushTask(ft flushTask) error { - // There can be a scenario, when empty memtable is flushed. - if ft.mt.sl.Empty() { - return nil - } - - bopts := buildTableOptions(db) - builder := buildL0Table(ft, bopts) - defer builder.Close() - - // buildL0Table can return nil if the none of the items in the skiplist are - // added to the builder. This can happen when drop prefix is set and all - // the items are skipped. - if builder.Empty() { - builder.Finish() - return nil - } - - fileID := db.lc.reserveFileID() - var tbl *table.Table - var err error - if db.opt.InMemory { - data := builder.Finish() - tbl, err = table.OpenInMemoryTable(data, fileID, &bopts) - } else { - tbl, err = table.CreateTable(table.NewFilename(fileID, db.opt.Dir), builder) - } - if err != nil { - return y.Wrap(err, "error while creating table") - } - // We own a ref on tbl. - err = db.lc.addLevel0Table(tbl) // This will incrRef - _ = tbl.DecrRef() // Releases our ref. - return err -} - -// flushMemtable must keep running until we send it an empty flushTask. If there -// are errors during handling the flush task, we'll retry indefinitely. -func (db *DB) flushMemtable(lc *z.Closer) error { - defer lc.Done() - - for ft := range db.flushChan { - if ft.mt == nil { - // We close db.flushChan now, instead of sending a nil ft.mt. - continue - } - for { - err := db.handleFlushTask(ft) - if err == nil { - // Update s.imm. Need a lock. - db.lock.Lock() - // This is a single-threaded operation. ft.mt corresponds to the head of - // db.imm list. Once we flush it, we advance db.imm. The next ft.mt - // which would arrive here would match db.imm[0], because we acquire a - // lock over DB when pushing to flushChan. - // TODO: This logic is dirty AF. Any change and this could easily break. - y.AssertTrue(ft.mt == db.imm[0]) - db.imm = db.imm[1:] - ft.mt.DecrRef() // Return memory. - db.lock.Unlock() - - break - } - // Encountered error. Retry indefinitely. - db.opt.Errorf("Failure while flushing memtable to disk: %v. Retrying...\n", err) - time.Sleep(time.Second) - } - } - return nil -} - -func exists(path string) (bool, error) { - _, err := os.Stat(path) - if err == nil { - return true, nil - } - if os.IsNotExist(err) { - return false, nil - } - return true, err -} - -// This function does a filewalk, calculates the size of vlog and sst files and stores it in -// y.LSMSize and y.VlogSize. -func (db *DB) calculateSize() { - if db.opt.InMemory { - return - } - newInt := func(val int64) *expvar.Int { - v := new(expvar.Int) - v.Add(val) - return v - } - - totalSize := func(dir string) (int64, int64) { - var lsmSize, vlogSize int64 - err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - ext := filepath.Ext(path) - switch ext { - case ".sst": - lsmSize += info.Size() - case ".vlog": - vlogSize += info.Size() - } - return nil - }) - if err != nil { - db.opt.Debugf("Got error while calculating total size of directory: %s", dir) - } - return lsmSize, vlogSize - } - - lsmSize, vlogSize := totalSize(db.opt.Dir) - y.LSMSizeSet(db.opt.MetricsEnabled, db.opt.Dir, newInt(lsmSize)) - // If valueDir is different from dir, we'd have to do another walk. - if db.opt.ValueDir != db.opt.Dir { - _, vlogSize = totalSize(db.opt.ValueDir) - } - y.VlogSizeSet(db.opt.MetricsEnabled, db.opt.ValueDir, newInt(vlogSize)) -} - -func (db *DB) updateSize(lc *z.Closer) { - defer lc.Done() - if db.opt.InMemory { - return - } - - metricsTicker := time.NewTicker(time.Minute) - defer metricsTicker.Stop() - - for { - select { - case <-metricsTicker.C: - db.calculateSize() - case <-lc.HasBeenClosed(): - return - } - } -} - -// RunValueLogGC triggers a value log garbage collection. -// -// It picks value log files to perform GC based on statistics that are collected -// during compactions. If no such statistics are available, then log files are -// picked in random order. The process stops as soon as the first log file is -// encountered which does not result in garbage collection. -// -// When a log file is picked, it is first sampled. If the sample shows that we -// can discard at least discardRatio space of that file, it would be rewritten. -// -// If a call to RunValueLogGC results in no rewrites, then an ErrNoRewrite is -// thrown indicating that the call resulted in no file rewrites. -// -// We recommend setting discardRatio to 0.5, thus indicating that a file be -// rewritten if half the space can be discarded. This results in a lifetime -// value log write amplification of 2 (1 from original write + 0.5 rewrite + -// 0.25 + 0.125 + ... = 2). Setting it to higher value would result in fewer -// space reclaims, while setting it to a lower value would result in more space -// reclaims at the cost of increased activity on the LSM tree. discardRatio -// must be in the range (0.0, 1.0), both endpoints excluded, otherwise an -// ErrInvalidRequest is returned. -// -// Only one GC is allowed at a time. If another value log GC is running, or DB -// has been closed, this would return an ErrRejected. -// -// Note: Every time GC is run, it would produce a spike of activity on the LSM -// tree. -func (db *DB) RunValueLogGC(discardRatio float64) error { - if db.opt.InMemory { - return ErrGCInMemoryMode - } - if discardRatio >= 1.0 || discardRatio <= 0.0 { - return ErrInvalidRequest - } - - // Pick a log file and run GC - return db.vlog.runGC(discardRatio) -} - -// Size returns the size of lsm and value log files in bytes. It can be used to decide how often to -// call RunValueLogGC. -func (db *DB) Size() (lsm, vlog int64) { - if y.LSMSizeGet(db.opt.MetricsEnabled, db.opt.Dir) == nil { - lsm, vlog = 0, 0 - return - } - lsm = y.LSMSizeGet(db.opt.MetricsEnabled, db.opt.Dir).(*expvar.Int).Value() - vlog = y.VlogSizeGet(db.opt.MetricsEnabled, db.opt.ValueDir).(*expvar.Int).Value() - return -} - -// Sequence represents a Badger sequence. -type Sequence struct { - lock sync.Mutex - db *DB - key []byte - next uint64 - leased uint64 - bandwidth uint64 -} - -// Next would return the next integer in the sequence, updating the lease by running a transaction -// if needed. -func (seq *Sequence) Next() (uint64, error) { - seq.lock.Lock() - defer seq.lock.Unlock() - if seq.next >= seq.leased { - if err := seq.updateLease(); err != nil { - return 0, err - } - } - val := seq.next - seq.next++ - return val, nil -} - -// Release the leased sequence to avoid wasted integers. This should be done right -// before closing the associated DB. However it is valid to use the sequence after -// it was released, causing a new lease with full bandwidth. -func (seq *Sequence) Release() error { - seq.lock.Lock() - defer seq.lock.Unlock() - err := seq.db.Update(func(txn *Txn) error { - item, err := txn.Get(seq.key) - if err != nil { - return err - } - - var num uint64 - if err := item.Value(func(v []byte) error { - num = binary.BigEndian.Uint64(v) - return nil - }); err != nil { - return err - } - - if num == seq.leased { - var buf [8]byte - binary.BigEndian.PutUint64(buf[:], seq.next) - return txn.SetEntry(NewEntry(seq.key, buf[:])) - } - - return nil - }) - if err != nil { - return err - } - seq.leased = seq.next - return nil -} - -func (seq *Sequence) updateLease() error { - return seq.db.Update(func(txn *Txn) error { - item, err := txn.Get(seq.key) - switch { - case err == ErrKeyNotFound: - seq.next = 0 - case err != nil: - return err - default: - var num uint64 - if err := item.Value(func(v []byte) error { - num = binary.BigEndian.Uint64(v) - return nil - }); err != nil { - return err - } - seq.next = num - } - - lease := seq.next + seq.bandwidth - var buf [8]byte - binary.BigEndian.PutUint64(buf[:], lease) - if err = txn.SetEntry(NewEntry(seq.key, buf[:])); err != nil { - return err - } - seq.leased = lease - return nil - }) -} - -// GetSequence would initiate a new sequence object, generating it from the stored lease, if -// available, in the database. Sequence can be used to get a list of monotonically increasing -// integers. Multiple sequences can be created by providing different keys. Bandwidth sets the -// size of the lease, determining how many Next() requests can be served from memory. -// -// GetSequence is not supported on ManagedDB. Calling this would result in a panic. -func (db *DB) GetSequence(key []byte, bandwidth uint64) (*Sequence, error) { - if db.opt.managedTxns { - panic("Cannot use GetSequence with managedDB=true.") - } - - switch { - case len(key) == 0: - return nil, ErrEmptyKey - case bandwidth == 0: - return nil, ErrZeroBandwidth - } - seq := &Sequence{ - db: db, - key: key, - next: 0, - leased: 0, - bandwidth: bandwidth, - } - err := seq.updateLease() - return seq, err -} - -// Tables gets the TableInfo objects from the level controller. If withKeysCount -// is true, TableInfo objects also contain counts of keys for the tables. -func (db *DB) Tables() []TableInfo { - return db.lc.getTableInfo() -} - -// Levels gets the LevelInfo. -func (db *DB) Levels() []LevelInfo { - return db.lc.getLevelInfo() -} - -// EstimateSize can be used to get rough estimate of data size for a given prefix. -func (db *DB) EstimateSize(prefix []byte) (uint64, uint64) { - var onDiskSize, uncompressedSize uint64 - tables := db.Tables() - for _, ti := range tables { - if bytes.HasPrefix(ti.Left, prefix) && bytes.HasPrefix(ti.Right, prefix) { - onDiskSize += uint64(ti.OnDiskSize) - uncompressedSize += uint64(ti.UncompressedSize) - } - } - return onDiskSize, uncompressedSize -} - -// Ranges can be used to get rough key ranges to divide up iteration over the DB. The ranges here -// would consider the prefix, but would not necessarily start or end with the prefix. In fact, the -// first range would have nil as left key, and the last range would have nil as the right key. -func (db *DB) Ranges(prefix []byte, numRanges int) []*keyRange { - var splits []string - tables := db.Tables() - - // We just want table ranges here and not keys count. - for _, ti := range tables { - // We don't use ti.Left, because that has a tendency to store !badger keys. Skip over tables - // at upper levels. Only choose tables from the last level. - if ti.Level != db.opt.MaxLevels-1 { - continue - } - if bytes.HasPrefix(ti.Right, prefix) { - splits = append(splits, string(ti.Right)) - } - } - - // If the number of splits is low, look at the offsets inside the - // tables to generate more splits. - if len(splits) < 32 { - numTables := len(tables) - if numTables == 0 { - numTables = 1 - } - numPerTable := 32 / numTables - if numPerTable == 0 { - numPerTable = 1 - } - splits = db.lc.keySplits(numPerTable, prefix) - } - - // If the number of splits is still < 32, then look at the memtables. - if len(splits) < 32 { - maxPerSplit := 10000 - mtSplits := func(mt *memTable) { - if mt == nil { - return - } - count := 0 - iter := mt.sl.NewIterator() - for iter.SeekToFirst(); iter.Valid(); iter.Next() { - if count%maxPerSplit == 0 { - // Add a split every maxPerSplit keys. - if bytes.HasPrefix(iter.Key(), prefix) { - splits = append(splits, string(iter.Key())) - } - } - count += 1 - } - _ = iter.Close() - } - - db.lock.Lock() - defer db.lock.Unlock() - var memTables []*memTable - memTables = append(memTables, db.imm...) - for _, mt := range memTables { - mtSplits(mt) - } - mtSplits(db.mt) - } - - // We have our splits now. Let's convert them to ranges. - sort.Strings(splits) - var ranges []*keyRange - var start []byte - for _, key := range splits { - ranges = append(ranges, &keyRange{left: start, right: y.SafeCopy(nil, []byte(key))}) - start = y.SafeCopy(nil, []byte(key)) - } - ranges = append(ranges, &keyRange{left: start}) - - // Figure out the approximate table size this range has to deal with. - for _, t := range tables { - tr := keyRange{left: t.Left, right: t.Right} - for _, r := range ranges { - if len(r.left) == 0 || len(r.right) == 0 { - continue - } - if r.overlapsWith(tr) { - r.size += int64(t.UncompressedSize) - } - } - } - - var total int64 - for _, r := range ranges { - total += r.size - } - if total == 0 { - return ranges - } - // Figure out the average size, so we know how to bin the ranges together. - avg := total / int64(numRanges) - - var out []*keyRange - var i int - for i < len(ranges) { - r := ranges[i] - cur := &keyRange{left: r.left, size: r.size, right: r.right} - i++ - for ; i < len(ranges); i++ { - next := ranges[i] - if cur.size+next.size > avg { - break - } - cur.right = next.right - cur.size += next.size - } - out = append(out, cur) - } - return out -} - -// MaxBatchCount returns max possible entries in batch -func (db *DB) MaxBatchCount() int64 { - return db.opt.maxBatchCount -} - -// MaxBatchSize returns max possible batch size -func (db *DB) MaxBatchSize() int64 { - return db.opt.maxBatchSize -} - -func (db *DB) stopMemoryFlush() { - // Stop memtable flushes. - if db.closers.memtable != nil { - close(db.flushChan) - db.closers.memtable.SignalAndWait() - } -} - -func (db *DB) stopCompactions() { - // Stop compactions. - if db.closers.compactors != nil { - db.closers.compactors.SignalAndWait() - } -} - -func (db *DB) startCompactions() { - // Resume compactions. - if db.closers.compactors != nil { - db.closers.compactors = z.NewCloser(1) - db.lc.startCompact(db.closers.compactors) - } -} - -func (db *DB) startMemoryFlush() { - // Start memory fluhser. - if db.closers.memtable != nil { - db.flushChan = make(chan flushTask, db.opt.NumMemtables) - db.closers.memtable = z.NewCloser(1) - go func() { - _ = db.flushMemtable(db.closers.memtable) - }() - } -} - -// Flatten can be used to force compactions on the LSM tree so all the tables fall on the same -// level. This ensures that all the versions of keys are colocated and not split across multiple -// levels, which is necessary after a restore from backup. During Flatten, live compactions are -// stopped. Ideally, no writes are going on during Flatten. Otherwise, it would create competition -// between flattening the tree and new tables being created at level zero. -func (db *DB) Flatten(workers int) error { - - db.stopCompactions() - defer db.startCompactions() - - compactAway := func(cp compactionPriority) error { - db.opt.Infof("Attempting to compact with %+v\n", cp) - errCh := make(chan error, 1) - for i := 0; i < workers; i++ { - go func() { - errCh <- db.lc.doCompact(175, cp) - }() - } - var success int - var rerr error - for i := 0; i < workers; i++ { - err := <-errCh - if err != nil { - rerr = err - db.opt.Warningf("While running doCompact with %+v. Error: %v\n", cp, err) - } else { - success++ - } - } - if success == 0 { - return rerr - } - // We could do at least one successful compaction. So, we'll consider this a success. - db.opt.Infof("%d compactor(s) succeeded. One or more tables from level %d compacted.\n", - success, cp.level) - return nil - } - - hbytes := func(sz int64) string { - return humanize.IBytes(uint64(sz)) - } - - t := db.lc.levelTargets() - for { - db.opt.Infof("\n") - var levels []int - for i, l := range db.lc.levels { - sz := l.getTotalSize() - db.opt.Infof("Level: %d. %8s Size. %8s Max.\n", - i, hbytes(l.getTotalSize()), hbytes(t.targetSz[i])) - if sz > 0 { - levels = append(levels, i) - } - } - if len(levels) <= 1 { - prios := db.lc.pickCompactLevels() - if len(prios) == 0 || prios[0].score <= 1.0 { - db.opt.Infof("All tables consolidated into one level. Flattening done.\n") - return nil - } - if err := compactAway(prios[0]); err != nil { - return err - } - continue - } - // Create an artificial compaction priority, to ensure that we compact the level. - cp := compactionPriority{level: levels[0], score: 1.71} - if err := compactAway(cp); err != nil { - return err - } - } -} - -func (db *DB) blockWrite() error { - // Stop accepting new writes. - if !atomic.CompareAndSwapInt32(&db.blockWrites, 0, 1) { - return ErrBlockedWrites - } - - // Make all pending writes finish. The following will also close writeCh. - db.closers.writes.SignalAndWait() - db.opt.Infof("Writes flushed. Stopping compactions now...") - return nil -} - -func (db *DB) unblockWrite() { - db.closers.writes = z.NewCloser(1) - go db.doWrites(db.closers.writes) - - // Resume writes. - atomic.StoreInt32(&db.blockWrites, 0) -} - -func (db *DB) prepareToDrop() (func(), error) { - if db.opt.ReadOnly { - panic("Attempting to drop data in read-only mode.") - } - // In order prepare for drop, we need to block the incoming writes and - // write it to db. Then, flush all the pending flushtask. So that, we - // don't miss any entries. - if err := db.blockWrite(); err != nil { - return nil, err - } - reqs := make([]*request, 0, 10) - for { - select { - case r := <-db.writeCh: - reqs = append(reqs, r) - default: - if err := db.writeRequests(reqs); err != nil { - db.opt.Errorf("writeRequests: %v", err) - } - db.stopMemoryFlush() - return func() { - db.opt.Infof("Resuming writes") - db.startMemoryFlush() - db.unblockWrite() - }, nil - } - } -} - -// DropAll would drop all the data stored in Badger. It does this in the following way. -// - Stop accepting new writes. -// - Pause memtable flushes and compactions. -// - Pick all tables from all levels, create a changeset to delete all these -// tables and apply it to manifest. -// - Pick all log files from value log, and delete all of them. Restart value log files from zero. -// - Resume memtable flushes and compactions. -// -// NOTE: DropAll is resilient to concurrent writes, but not to reads. It is up to the user to not do -// any reads while DropAll is going on, otherwise they may result in panics. Ideally, both reads and -// writes are paused before running DropAll, and resumed after it is finished. -func (db *DB) DropAll() error { - f, err := db.dropAll() - if f != nil { - f() - } - return err -} - -func (db *DB) dropAll() (func(), error) { - db.opt.Infof("DropAll called. Blocking writes...") - f, err := db.prepareToDrop() - if err != nil { - return f, err - } - // prepareToDrop will stop all the incomming write and flushes any pending flush tasks. - // Before we drop, we'll stop the compaction because anyways all the datas are going to - // be deleted. - db.stopCompactions() - resume := func() { - db.startCompactions() - f() - } - // Block all foreign interactions with memory tables. - db.lock.Lock() - defer db.lock.Unlock() - - // Remove inmemory tables. Calling DecrRef for safety. Not sure if they're absolutely needed. - db.mt.DecrRef() - for _, mt := range db.imm { - mt.DecrRef() - } - db.imm = db.imm[:0] - db.mt, err = db.newMemTable() // Set it up for future writes. - if err != nil { - return resume, y.Wrapf(err, "cannot open new memtable") - } - - num, err := db.lc.dropTree() - if err != nil { - return resume, err - } - db.opt.Infof("Deleted %d SSTables. Now deleting value logs...\n", num) - - num, err = db.vlog.dropAll() - if err != nil { - return resume, err - } - db.lc.nextFileID = 1 - db.opt.Infof("Deleted %d value log files. DropAll done.\n", num) - db.blockCache.Clear() - db.indexCache.Clear() - db.threshold.Clear(db.opt) - return resume, nil -} - -// DropPrefix would drop all the keys with the provided prefix. It does this in the following way: -// - Stop accepting new writes. -// - Stop memtable flushes before acquiring lock. Because we're acquring lock here -// and memtable flush stalls for lock, which leads to deadlock -// - Flush out all memtables, skipping over keys with the given prefix, Kp. -// - Write out the value log header to memtables when flushing, so we don't accidentally bring Kp -// back after a restart. -// - Stop compaction. -// - Compact L0->L1, skipping over Kp. -// - Compact rest of the levels, Li->Li, picking tables which have Kp. -// - Resume memtable flushes, compactions and writes. -func (db *DB) DropPrefix(prefixes ...[]byte) error { - if len(prefixes) == 0 { - return nil - } - db.opt.Infof("DropPrefix called for %s", prefixes) - f, err := db.prepareToDrop() - if err != nil { - return err - } - defer f() - - var filtered [][]byte - if filtered, err = db.filterPrefixesToDrop(prefixes); err != nil { - return err - } - // If there is no prefix for which the data already exist, do not do anything. - if len(filtered) == 0 { - db.opt.Infof("No prefixes to drop") - return nil - } - // Block all foreign interactions with memory tables. - db.lock.Lock() - defer db.lock.Unlock() - - db.imm = append(db.imm, db.mt) - for _, memtable := range db.imm { - if memtable.sl.Empty() { - memtable.DecrRef() - continue - } - task := flushTask{ - mt: memtable, - // Ensure that the head of value log gets persisted to disk. - dropPrefixes: filtered, - } - db.opt.Debugf("Flushing memtable") - if err := db.handleFlushTask(task); err != nil { - db.opt.Errorf("While trying to flush memtable: %v", err) - return err - } - memtable.DecrRef() - } - db.stopCompactions() - defer db.startCompactions() - db.imm = db.imm[:0] - db.mt, err = db.newMemTable() - if err != nil { - return y.Wrapf(err, "cannot create new mem table") - } - - // Drop prefixes from the levels. - if err := db.lc.dropPrefixes(filtered); err != nil { - return err - } - db.opt.Infof("DropPrefix done") - return nil -} - -func (db *DB) filterPrefixesToDrop(prefixes [][]byte) ([][]byte, error) { - var filtered [][]byte - for _, prefix := range prefixes { - err := db.View(func(txn *Txn) error { - iopts := DefaultIteratorOptions - iopts.Prefix = prefix - iopts.PrefetchValues = false - itr := txn.NewIterator(iopts) - defer itr.Close() - itr.Rewind() - if itr.ValidForPrefix(prefix) { - filtered = append(filtered, prefix) - } - return nil - }) - if err != nil { - return filtered, err - } - } - return filtered, nil -} - -// Checks if the key is banned. Returns the respective error if the key belongs to any of the banned -// namepspaces. Else it returns nil. -func (db *DB) isBanned(key []byte) error { - if db.opt.NamespaceOffset < 0 { - return nil - } - if len(key) <= db.opt.NamespaceOffset+8 { - return nil - } - if db.bannedNamespaces.has(y.BytesToU64(key[db.opt.NamespaceOffset:])) { - return ErrBannedKey - } - return nil -} - -// BanNamespace bans a namespace. Read/write to keys belonging to any of such namespace is denied. -func (db *DB) BanNamespace(ns uint64) error { - if db.opt.NamespaceOffset < 0 { - return ErrNamespaceMode - } - db.opt.Infof("Banning namespace: %d", ns) - // First set the banned namespaces in DB and then update the in-memory structure. - key := y.KeyWithTs(append(bannedNsKey, y.U64ToBytes(ns)...), 1) - entry := []*Entry{{ - Key: key, - Value: nil, - }} - req, err := db.sendToWriteCh(entry) - if err != nil { - return err - } - if err := req.Wait(); err != nil { - return err - } - db.bannedNamespaces.add(ns) - return nil -} - -// BannedNamespaces returns the list of prefixes banned for DB. -func (db *DB) BannedNamespaces() []uint64 { - return db.bannedNamespaces.all() -} - -// KVList contains a list of key-value pairs. -type KVList = pb.KVList - -// Subscribe can be used to watch key changes for the given key prefixes and the ignore string. -// At least one prefix should be passed, or an error will be returned. -// You can use an empty prefix to monitor all changes to the DB. -// Ignore string is the byte ranges for which prefix matching will be ignored. -// For example: ignore = "2-3", and prefix = "abc" will match for keys "abxxc", "abdfc" etc. -// This function blocks until the given context is done or an error occurs. -// The given function will be called with a new KVList containing the modified keys and the -// corresponding values. -func (db *DB) Subscribe(ctx context.Context, cb func(kv *KVList) error, matches []pb.Match) error { - if cb == nil { - return ErrNilCallback - } - - c := z.NewCloser(1) - s := db.pub.newSubscriber(c, matches) - slurp := func(batch *pb.KVList) error { - for { - select { - case kvs := <-s.sendCh: - batch.Kv = append(batch.Kv, kvs.Kv...) - default: - if len(batch.GetKv()) > 0 { - return cb(batch) - } - return nil - } - } - } - - drain := func() { - for { - select { - case <-s.sendCh: - default: - return - } - } - } - for { - select { - case <-c.HasBeenClosed(): - // No need to delete here. Closer will be called only while - // closing DB. Subscriber will be deleted by cleanSubscribers. - err := slurp(new(pb.KVList)) - // Drain if any pending updates. - c.Done() - return err - case <-ctx.Done(): - c.Done() - atomic.StoreUint64(s.active, 0) - drain() - db.pub.deleteSubscriber(s.id) - // Delete the subscriber to avoid further updates. - return ctx.Err() - case batch := <-s.sendCh: - err := slurp(batch) - if err != nil { - c.Done() - atomic.StoreUint64(s.active, 0) - drain() - // Delete the subscriber if there is an error by the callback. - db.pub.deleteSubscriber(s.id) - return err - } - } - } -} - -// shouldEncrypt returns bool, which tells whether to encrypt or not. -func (db *DB) shouldEncrypt() bool { - return len(db.opt.EncryptionKey) > 0 -} - -func (db *DB) syncDir(dir string) error { - if db.opt.InMemory { - return nil - } - return syncDir(dir) -} - -func createDirs(opt Options) error { - for _, path := range []string{opt.Dir, opt.ValueDir} { - dirExists, err := exists(path) - if err != nil { - return y.Wrapf(err, "Invalid Dir: %q", path) - } - if !dirExists { - if opt.ReadOnly { - return errors.Errorf("Cannot find directory %q for read-only open", path) - } - // Try to create the directory - err = os.MkdirAll(path, 0700) - if err != nil { - return y.Wrapf(err, "Error Creating Dir: %q", path) - } - } - } - return nil -} - -// Stream the contents of this DB to a new DB with options outOptions that will be -// created in outDir. -func (db *DB) StreamDB(outOptions Options) error { - outDir := outOptions.Dir - - // Open output DB. - outDB, err := OpenManaged(outOptions) - if err != nil { - return y.Wrapf(err, "cannot open out DB at %s", outDir) - } - defer outDB.Close() - writer := outDB.NewStreamWriter() - if err := writer.Prepare(); err != nil { - y.Wrapf(err, "cannot create stream writer in out DB at %s", outDir) - } - - // Stream contents of DB to the output DB. - stream := db.NewStreamAt(math.MaxUint64) - stream.LogPrefix = fmt.Sprintf("Streaming DB to new DB at %s", outDir) - - stream.Send = func(buf *z.Buffer) error { - return writer.Write(buf) - } - if err := stream.Orchestrate(context.Background()); err != nil { - return y.Wrapf(err, "cannot stream DB to out DB at %s", outDir) - } - if err := writer.Flush(); err != nil { - return y.Wrapf(err, "cannot flush writer") - } - return nil -} - -// Opts returns a copy of the DB options. -func (db *DB) Opts() Options { - return db.opt -} - -type CacheType int - -const ( - BlockCache CacheType = iota - IndexCache -) - -// CacheMaxCost updates the max cost of the given cache (either block or index cache). -// The call will have an effect only if the DB was created with the cache. Otherwise it is -// a no-op. If you pass a negative value, the function will return the current value -// without updating it. -func (db *DB) CacheMaxCost(cache CacheType, maxCost int64) (int64, error) { - if db == nil { - return 0, nil - } - - if maxCost < 0 { - switch cache { - case BlockCache: - return db.blockCache.MaxCost(), nil - case IndexCache: - return db.indexCache.MaxCost(), nil - default: - return 0, errors.Errorf("invalid cache type") - } - } - - switch cache { - case BlockCache: - db.blockCache.UpdateMaxCost(maxCost) - return maxCost, nil - case IndexCache: - db.indexCache.UpdateMaxCost(maxCost) - return maxCost, nil - default: - return 0, errors.Errorf("invalid cache type") - } -} - -func (db *DB) LevelsToString() string { - levels := db.Levels() - h := func(sz int64) string { - return humanize.IBytes(uint64(sz)) - } - base := func(b bool) string { - if b { - return "B" - } - return " " - } - - var b strings.Builder - b.WriteRune('\n') - for _, li := range levels { - b.WriteString(fmt.Sprintf( - "Level %d [%s]: NumTables: %02d. Size: %s of %s. Score: %.2f->%.2f"+ - " StaleData: %s Target FileSize: %s\n", - li.Level, base(li.IsBaseLevel), li.NumTables, - h(li.Size), h(li.TargetSize), li.Score, li.Adjusted, h(li.StaleDatSize), - h(li.TargetFileSize))) - } - b.WriteString("Level Done\n") - return b.String() -} diff --git a/vendor/github.com/dgraph-io/badger/v3/dir_plan9.go b/vendor/github.com/dgraph-io/badger/v3/dir_plan9.go deleted file mode 100644 index 76e3fa2111..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/dir_plan9.go +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/dgraph-io/badger/v3/y" -) - -// directoryLockGuard holds a lock on a directory and a pid file inside. The pid file isn't part -// of the locking mechanism, it's just advisory. -type directoryLockGuard struct { - // File handle on the directory, which we've locked. - f *os.File - // The absolute path to our pid file. - path string -} - -// acquireDirectoryLock gets a lock on the directory. -// It will also write our pid to dirPath/pidFileName for convenience. -// readOnly is not supported on Plan 9. -func acquireDirectoryLock(dirPath string, pidFileName string, readOnly bool) ( - *directoryLockGuard, error) { - if readOnly { - return nil, ErrPlan9NotSupported - } - - // Convert to absolute path so that Release still works even if we do an unbalanced - // chdir in the meantime. - absPidFilePath, err := filepath.Abs(filepath.Join(dirPath, pidFileName)) - if err != nil { - return nil, y.Wrap(err, "cannot get absolute path for pid lock file") - } - - // If the file was unpacked or created by some other program, it might not - // have the ModeExclusive bit set. Set it before we call OpenFile, so that we - // can be confident that a successful OpenFile implies exclusive use. - // - // OpenFile fails if the file ModeExclusive bit set *and* the file is already open. - // So, if the file is closed when the DB crashed, we're fine. When the process - // that was managing the DB crashes, the OS will close the file for us. - // - // This bit of code is copied from Go's lockedfile internal package: - // https://github.com/golang/go/blob/go1.15rc1/src/cmd/go/internal/lockedfile/lockedfile_plan9.go#L58 - if fi, err := os.Stat(absPidFilePath); err == nil { - if fi.Mode()&os.ModeExclusive == 0 { - if err := os.Chmod(absPidFilePath, fi.Mode()|os.ModeExclusive); err != nil { - return nil, y.Wrapf(err, "could not set exclusive mode bit") - } - } - } else if !os.IsNotExist(err) { - return nil, err - } - f, err := os.OpenFile(absPidFilePath, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0666|os.ModeExclusive) - if err != nil { - if isLocked(err) { - return nil, y.Wrapf(err, - "Cannot open pid lock file %q. Another process is using this Badger database", - absPidFilePath) - } - return nil, y.Wrapf(err, "Cannot open pid lock file %q", absPidFilePath) - } - - if _, err = fmt.Fprintf(f, "%d\n", os.Getpid()); err != nil { - f.Close() - return nil, y.Wrapf(err, "could not write pid") - } - return &directoryLockGuard{f, absPidFilePath}, nil -} - -// Release deletes the pid file and releases our lock on the directory. -func (guard *directoryLockGuard) release() error { - // It's important that we remove the pid file first. - err := os.Remove(guard.path) - - if closeErr := guard.f.Close(); err == nil { - err = closeErr - } - guard.path = "" - guard.f = nil - - return err -} - -// openDir opens a directory for syncing. -func openDir(path string) (*os.File, error) { return os.Open(path) } - -// When you create or delete a file, you have to ensure the directory entry for the file is synced -// in order to guarantee the file is visible (if the system crashes). (See the man page for fsync, -// or see https://github.com/coreos/etcd/issues/6368 for an example.) -func syncDir(dir string) error { - f, err := openDir(dir) - if err != nil { - return y.Wrapf(err, "While opening directory: %s.", dir) - } - - err = f.Sync() - closeErr := f.Close() - if err != nil { - return y.Wrapf(err, "While syncing directory: %s.", dir) - } - return y.Wrapf(closeErr, "While closing directory: %s.", dir) -} - -// Opening an exclusive-use file returns an error. -// The expected error strings are: -// -// - "open/create -- file is locked" (cwfs, kfs) -// - "exclusive lock" (fossil) -// - "exclusive use file already open" (ramfs) -// -// See https://github.com/golang/go/blob/go1.15rc1/src/cmd/go/internal/lockedfile/lockedfile_plan9.go#L16 -var lockedErrStrings = [...]string{ - "file is locked", - "exclusive lock", - "exclusive use file already open", -} - -// Even though plan9 doesn't support the Lock/RLock/Unlock functions to -// manipulate already-open files, IsLocked is still meaningful: os.OpenFile -// itself may return errors that indicate that a file with the ModeExclusive bit -// set is already open. -func isLocked(err error) bool { - s := err.Error() - - for _, frag := range lockedErrStrings { - if strings.Contains(s, frag) { - return true - } - } - return false -} diff --git a/vendor/github.com/dgraph-io/badger/v3/dir_unix.go b/vendor/github.com/dgraph-io/badger/v3/dir_unix.go deleted file mode 100644 index 48addc976a..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/dir_unix.go +++ /dev/null @@ -1,118 +0,0 @@ -// +build !windows,!plan9 - -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - - "github.com/dgraph-io/badger/v3/y" - "golang.org/x/sys/unix" -) - -// directoryLockGuard holds a lock on a directory and a pid file inside. The pid file isn't part -// of the locking mechanism, it's just advisory. -type directoryLockGuard struct { - // File handle on the directory, which we've flocked. - f *os.File - // The absolute path to our pid file. - path string - // Was this a shared lock for a read-only database? - readOnly bool -} - -// acquireDirectoryLock gets a lock on the directory (using flock). If -// this is not read-only, it will also write our pid to -// dirPath/pidFileName for convenience. -func acquireDirectoryLock(dirPath string, pidFileName string, readOnly bool) ( - *directoryLockGuard, error) { - // Convert to absolute path so that Release still works even if we do an unbalanced - // chdir in the meantime. - absPidFilePath, err := filepath.Abs(filepath.Join(dirPath, pidFileName)) - if err != nil { - return nil, y.Wrapf(err, "cannot get absolute path for pid lock file") - } - f, err := os.Open(dirPath) - if err != nil { - return nil, y.Wrapf(err, "cannot open directory %q", dirPath) - } - opts := unix.LOCK_EX | unix.LOCK_NB - if readOnly { - opts = unix.LOCK_SH | unix.LOCK_NB - } - - err = unix.Flock(int(f.Fd()), opts) - if err != nil { - f.Close() - return nil, y.Wrapf(err, - "Cannot acquire directory lock on %q. Another process is using this Badger database.", - dirPath) - } - - if !readOnly { - // Yes, we happily overwrite a pre-existing pid file. We're the - // only read-write badger process using this directory. - err = ioutil.WriteFile(absPidFilePath, []byte(fmt.Sprintf("%d\n", os.Getpid())), 0666) - if err != nil { - f.Close() - return nil, y.Wrapf(err, - "Cannot write pid file %q", absPidFilePath) - } - } - return &directoryLockGuard{f, absPidFilePath, readOnly}, nil -} - -// Release deletes the pid file and releases our lock on the directory. -func (guard *directoryLockGuard) release() error { - var err error - if !guard.readOnly { - // It's important that we remove the pid file first. - err = os.Remove(guard.path) - } - - if closeErr := guard.f.Close(); err == nil { - err = closeErr - } - guard.path = "" - guard.f = nil - - return err -} - -// openDir opens a directory for syncing. -func openDir(path string) (*os.File, error) { return os.Open(path) } - -// When you create or delete a file, you have to ensure the directory entry for the file is synced -// in order to guarantee the file is visible (if the system crashes). (See the man page for fsync, -// or see https://github.com/coreos/etcd/issues/6368 for an example.) -func syncDir(dir string) error { - f, err := openDir(dir) - if err != nil { - return y.Wrapf(err, "While opening directory: %s.", dir) - } - - err = f.Sync() - closeErr := f.Close() - if err != nil { - return y.Wrapf(err, "While syncing directory: %s.", dir) - } - return y.Wrapf(closeErr, "While closing directory: %s.", dir) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/dir_windows.go b/vendor/github.com/dgraph-io/badger/v3/dir_windows.go deleted file mode 100644 index 43b00e37c7..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/dir_windows.go +++ /dev/null @@ -1,110 +0,0 @@ -// +build windows - -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -// OpenDir opens a directory in windows with write access for syncing. -import ( - "os" - "path/filepath" - "syscall" - - "github.com/dgraph-io/badger/v3/y" -) - -// FILE_ATTRIBUTE_TEMPORARY - A file that is being used for temporary storage. -// FILE_FLAG_DELETE_ON_CLOSE - The file is to be deleted immediately after all of its handles are -// closed, which includes the specified handle and any other open or duplicated handles. -// See: https://docs.microsoft.com/en-us/windows/desktop/FileIO/file-attribute-constants -// NOTE: Added here to avoid importing golang.org/x/sys/windows -const ( - FILE_ATTRIBUTE_TEMPORARY = 0x00000100 - FILE_FLAG_DELETE_ON_CLOSE = 0x04000000 -) - -func openDir(path string) (*os.File, error) { - fd, err := openDirWin(path) - if err != nil { - return nil, err - } - return os.NewFile(uintptr(fd), path), nil -} - -func openDirWin(path string) (fd syscall.Handle, err error) { - if len(path) == 0 { - return syscall.InvalidHandle, syscall.ERROR_FILE_NOT_FOUND - } - pathp, err := syscall.UTF16PtrFromString(path) - if err != nil { - return syscall.InvalidHandle, err - } - access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE) - sharemode := uint32(syscall.FILE_SHARE_READ | syscall.FILE_SHARE_WRITE) - createmode := uint32(syscall.OPEN_EXISTING) - fl := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS) - return syscall.CreateFile(pathp, access, sharemode, nil, createmode, fl, 0) -} - -// DirectoryLockGuard holds a lock on the directory. -type directoryLockGuard struct { - h syscall.Handle - path string -} - -// AcquireDirectoryLock acquires exclusive access to a directory. -func acquireDirectoryLock(dirPath string, pidFileName string, readOnly bool) (*directoryLockGuard, error) { - if readOnly { - return nil, ErrWindowsNotSupported - } - - // Convert to absolute path so that Release still works even if we do an unbalanced - // chdir in the meantime. - absLockFilePath, err := filepath.Abs(filepath.Join(dirPath, pidFileName)) - if err != nil { - return nil, y.Wrap(err, "Cannot get absolute path for pid lock file") - } - - // This call creates a file handler in memory that only one process can use at a time. When - // that process ends, the file is deleted by the system. - // FILE_ATTRIBUTE_TEMPORARY is used to tell Windows to try to create the handle in memory. - // FILE_FLAG_DELETE_ON_CLOSE is not specified in syscall_windows.go but tells Windows to delete - // the file when all processes holding the handler are closed. - // XXX: this works but it's a bit klunky. i'd prefer to use LockFileEx but it needs unsafe pkg. - h, err := syscall.CreateFile( - syscall.StringToUTF16Ptr(absLockFilePath), 0, 0, nil, - syscall.OPEN_ALWAYS, - uint32(FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE), - 0) - if err != nil { - return nil, y.Wrapf(err, - "Cannot create lock file %q. Another process is using this Badger database", - absLockFilePath) - } - - return &directoryLockGuard{h: h, path: absLockFilePath}, nil -} - -// Release removes the directory lock. -func (g *directoryLockGuard) release() error { - g.path = "" - return syscall.CloseHandle(g.h) -} - -// Windows doesn't support syncing directories to the file system. See -// https://github.com/dgraph-io/badger/issues/699#issuecomment-504133587 for more details. -func syncDir(dir string) error { return nil } diff --git a/vendor/github.com/dgraph-io/badger/v3/discard.go b/vendor/github.com/dgraph-io/badger/v3/discard.go deleted file mode 100644 index 050d5caa2e..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/discard.go +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "encoding/binary" - "os" - "path/filepath" - "sort" - "sync" - - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" -) - -// discardStats keeps track of the amount of data that could be discarded for -// a given logfile. -type discardStats struct { - sync.Mutex - - *z.MmapFile - opt Options - nextEmptySlot int -} - -const discardFname string = "DISCARD" - -func InitDiscardStats(opt Options) (*discardStats, error) { - fname := filepath.Join(opt.ValueDir, discardFname) - - // 1GB file can store 67M discard entries. Each entry is 16 bytes. - mf, err := z.OpenMmapFile(fname, os.O_CREATE|os.O_RDWR, 1<<20) - lf := &discardStats{ - MmapFile: mf, - opt: opt, - } - if err == z.NewFile { - // We don't need to zero out the entire 1GB. - lf.zeroOut() - - } else if err != nil { - return nil, y.Wrapf(err, "while opening file: %s\n", discardFname) - } - - for slot := 0; slot < lf.maxSlot(); slot++ { - if lf.get(16*slot) == 0 { - lf.nextEmptySlot = slot - break - } - } - sort.Sort(lf) - opt.Infof("Discard stats nextEmptySlot: %d\n", lf.nextEmptySlot) - return lf, nil -} - -func (lf *discardStats) Len() int { - return lf.nextEmptySlot -} -func (lf *discardStats) Less(i, j int) bool { - return lf.get(16*i) < lf.get(16*j) -} -func (lf *discardStats) Swap(i, j int) { - left := lf.Data[16*i : 16*i+16] - right := lf.Data[16*j : 16*j+16] - var tmp [16]byte - copy(tmp[:], left) - copy(left, right) - copy(right, tmp[:]) -} - -// offset is not slot. -func (lf *discardStats) get(offset int) uint64 { - return binary.BigEndian.Uint64(lf.Data[offset : offset+8]) -} -func (lf *discardStats) set(offset int, val uint64) { - binary.BigEndian.PutUint64(lf.Data[offset:offset+8], val) -} - -// zeroOut would zero out the next slot. -func (lf *discardStats) zeroOut() { - lf.set(lf.nextEmptySlot*16, 0) - lf.set(lf.nextEmptySlot*16+8, 0) -} - -func (lf *discardStats) maxSlot() int { - return len(lf.Data) / 16 -} - -// Update would update the discard stats for the given file id. If discard is -// 0, it would return the current value of discard for the file. If discard is -// < 0, it would set the current value of discard to zero for the file. -func (lf *discardStats) Update(fidu uint32, discard int64) int64 { - fid := uint64(fidu) - lf.Lock() - defer lf.Unlock() - - idx := sort.Search(lf.nextEmptySlot, func(slot int) bool { - return lf.get(slot*16) >= fid - }) - if idx < lf.nextEmptySlot && lf.get(idx*16) == fid { - off := idx*16 + 8 - curDisc := lf.get(off) - if discard == 0 { - return int64(curDisc) - } - if discard < 0 { - lf.set(off, 0) - return 0 - } - lf.set(off, curDisc+uint64(discard)) - return int64(curDisc + uint64(discard)) - } - if discard <= 0 { - // No need to add a new entry. - return 0 - } - - // Could not find the fid. Add the entry. - idx = lf.nextEmptySlot - lf.set(idx*16, uint64(fid)) - lf.set(idx*16+8, uint64(discard)) - - // Move to next slot. - lf.nextEmptySlot++ - for lf.nextEmptySlot >= lf.maxSlot() { - y.Check(lf.Truncate(2 * int64(len(lf.Data)))) - } - lf.zeroOut() - - sort.Sort(lf) - return int64(discard) -} - -func (lf *discardStats) Iterate(f func(fid, stats uint64)) { - for slot := 0; slot < lf.nextEmptySlot; slot++ { - idx := 16 * slot - f(lf.get(idx), lf.get(idx+8)) - } -} - -// MaxDiscard returns the file id with maximum discard bytes. -func (lf *discardStats) MaxDiscard() (uint32, int64) { - lf.Lock() - defer lf.Unlock() - - var maxFid, maxVal uint64 - lf.Iterate(func(fid, val uint64) { - if maxVal < val { - maxVal = val - maxFid = fid - } - }) - return uint32(maxFid), int64(maxVal) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/doc.go b/vendor/github.com/dgraph-io/badger/v3/doc.go deleted file mode 100644 index 83dc9a28ac..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/doc.go +++ /dev/null @@ -1,28 +0,0 @@ -/* -Package badger implements an embeddable, simple and fast key-value database, -written in pure Go. It is designed to be highly performant for both reads and -writes simultaneously. Badger uses Multi-Version Concurrency Control (MVCC), and -supports transactions. It runs transactions concurrently, with serializable -snapshot isolation guarantees. - -Badger uses an LSM tree along with a value log to separate keys from values, -hence reducing both write amplification and the size of the LSM tree. This -allows LSM tree to be served entirely from RAM, while the values are served -from SSD. - - -Usage - -Badger has the following main types: DB, Txn, Item and Iterator. DB contains -keys that are associated with values. It must be opened with the appropriate -options before it can be accessed. - -All operations happen inside a Txn. Txn represents a transaction, which can -be read-only or read-write. Read-only transactions can read values for a -given key (which are returned inside an Item), or iterate over a set of -key-value pairs using an Iterator (which are returned as Item type values as -well). Read-write transactions can also update and delete keys from the DB. - -See the examples for more usage details. -*/ -package badger diff --git a/vendor/github.com/dgraph-io/badger/v3/errors.go b/vendor/github.com/dgraph-io/badger/v3/errors.go deleted file mode 100644 index f5df6d5118..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/errors.go +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "math" - - "github.com/pkg/errors" -) - -const ( - // ValueThresholdLimit is the maximum permissible value of opt.ValueThreshold. - ValueThresholdLimit = math.MaxUint16 - 16 + 1 -) - -var ( - // ErrValueLogSize is returned when opt.ValueLogFileSize option is not within the valid - // range. - ErrValueLogSize = errors.New("Invalid ValueLogFileSize, must be in range [1MB, 2GB)") - - // ErrKeyNotFound is returned when key isn't found on a txn.Get. - ErrKeyNotFound = errors.New("Key not found") - - // ErrTxnTooBig is returned if too many writes are fit into a single transaction. - ErrTxnTooBig = errors.New("Txn is too big to fit into one request") - - // ErrConflict is returned when a transaction conflicts with another transaction. This can - // happen if the read rows had been updated concurrently by another transaction. - ErrConflict = errors.New("Transaction Conflict. Please retry") - - // ErrReadOnlyTxn is returned if an update function is called on a read-only transaction. - ErrReadOnlyTxn = errors.New("No sets or deletes are allowed in a read-only transaction") - - // ErrDiscardedTxn is returned if a previously discarded transaction is re-used. - ErrDiscardedTxn = errors.New("This transaction has been discarded. Create a new one") - - // ErrEmptyKey is returned if an empty key is passed on an update function. - ErrEmptyKey = errors.New("Key cannot be empty") - - // ErrInvalidKey is returned if the key has a special !badger! prefix, - // reserved for internal usage. - ErrInvalidKey = errors.New("Key is using a reserved !badger! prefix") - - // ErrBannedKey is returned if the read/write key belongs to any banned namespace. - ErrBannedKey = errors.New("Key is using the banned prefix") - - // ErrThresholdZero is returned if threshold is set to zero, and value log GC is called. - // In such a case, GC can't be run. - ErrThresholdZero = errors.New( - "Value log GC can't run because threshold is set to zero") - - // ErrNoRewrite is returned if a call for value log GC doesn't result in a log file rewrite. - ErrNoRewrite = errors.New( - "Value log GC attempt didn't result in any cleanup") - - // ErrRejected is returned if a value log GC is called either while another GC is running, or - // after DB::Close has been called. - ErrRejected = errors.New("Value log GC request rejected") - - // ErrInvalidRequest is returned if the user request is invalid. - ErrInvalidRequest = errors.New("Invalid request") - - // ErrManagedTxn is returned if the user tries to use an API which isn't - // allowed due to external management of transactions, when using ManagedDB. - ErrManagedTxn = errors.New( - "Invalid API request. Not allowed to perform this action using ManagedDB") - - // ErrNamespaceMode is returned if the user tries to use an API which is allowed only when - // NamespaceOffset is non-negative. - ErrNamespaceMode = errors.New( - "Invalid API request. Not allowed to perform this action when NamespaceMode is not set.") - - // ErrInvalidDump if a data dump made previously cannot be loaded into the database. - ErrInvalidDump = errors.New("Data dump cannot be read") - - // ErrZeroBandwidth is returned if the user passes in zero bandwidth for sequence. - ErrZeroBandwidth = errors.New("Bandwidth must be greater than zero") - - // ErrWindowsNotSupported is returned when opt.ReadOnly is used on Windows - ErrWindowsNotSupported = errors.New("Read-only mode is not supported on Windows") - - // ErrPlan9NotSupported is returned when opt.ReadOnly is used on Plan 9 - ErrPlan9NotSupported = errors.New("Read-only mode is not supported on Plan 9") - - // ErrTruncateNeeded is returned when the value log gets corrupt, and requires truncation of - // corrupt data to allow Badger to run properly. - ErrTruncateNeeded = errors.New( - "Log truncate required to run DB. This might result in data loss") - - // ErrBlockedWrites is returned if the user called DropAll. During the process of dropping all - // data from Badger, we stop accepting new writes, by returning this error. - ErrBlockedWrites = errors.New("Writes are blocked, possibly due to DropAll or Close") - - // ErrNilCallback is returned when subscriber's callback is nil. - ErrNilCallback = errors.New("Callback cannot be nil") - - // ErrEncryptionKeyMismatch is returned when the storage key is not - // matched with the key previously given. - ErrEncryptionKeyMismatch = errors.New("Encryption key mismatch") - - // ErrInvalidDataKeyID is returned if the datakey id is invalid. - ErrInvalidDataKeyID = errors.New("Invalid datakey id") - - // ErrInvalidEncryptionKey is returned if length of encryption keys is invalid. - ErrInvalidEncryptionKey = errors.New("Encryption key's length should be" + - "either 16, 24, or 32 bytes") - // ErrGCInMemoryMode is returned when db.RunValueLogGC is called in in-memory mode. - ErrGCInMemoryMode = errors.New("Cannot run value log GC when DB is opened in InMemory mode") - - // ErrDBClosed is returned when a get operation is performed after closing the DB. - ErrDBClosed = errors.New("DB Closed") -) diff --git a/vendor/github.com/dgraph-io/badger/v3/fb/BlockOffset.go b/vendor/github.com/dgraph-io/badger/v3/fb/BlockOffset.go deleted file mode 100644 index 6ef437e250..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/fb/BlockOffset.go +++ /dev/null @@ -1,104 +0,0 @@ -// Code generated by the FlatBuffers compiler. DO NOT EDIT. - -package fb - -import ( - flatbuffers "github.com/google/flatbuffers/go" -) - -type BlockOffset struct { - _tab flatbuffers.Table -} - -func GetRootAsBlockOffset(buf []byte, offset flatbuffers.UOffsetT) *BlockOffset { - n := flatbuffers.GetUOffsetT(buf[offset:]) - x := &BlockOffset{} - x.Init(buf, n+offset) - return x -} - -func (rcv *BlockOffset) Init(buf []byte, i flatbuffers.UOffsetT) { - rcv._tab.Bytes = buf - rcv._tab.Pos = i -} - -func (rcv *BlockOffset) Table() flatbuffers.Table { - return rcv._tab -} - -func (rcv *BlockOffset) Key(j int) byte { - o := flatbuffers.UOffsetT(rcv._tab.Offset(4)) - if o != 0 { - a := rcv._tab.Vector(o) - return rcv._tab.GetByte(a + flatbuffers.UOffsetT(j*1)) - } - return 0 -} - -func (rcv *BlockOffset) KeyLength() int { - o := flatbuffers.UOffsetT(rcv._tab.Offset(4)) - if o != 0 { - return rcv._tab.VectorLen(o) - } - return 0 -} - -func (rcv *BlockOffset) KeyBytes() []byte { - o := flatbuffers.UOffsetT(rcv._tab.Offset(4)) - if o != 0 { - return rcv._tab.ByteVector(o + rcv._tab.Pos) - } - return nil -} - -func (rcv *BlockOffset) MutateKey(j int, n byte) bool { - o := flatbuffers.UOffsetT(rcv._tab.Offset(4)) - if o != 0 { - a := rcv._tab.Vector(o) - return rcv._tab.MutateByte(a+flatbuffers.UOffsetT(j*1), n) - } - return false -} - -func (rcv *BlockOffset) Offset() uint32 { - o := flatbuffers.UOffsetT(rcv._tab.Offset(6)) - if o != 0 { - return rcv._tab.GetUint32(o + rcv._tab.Pos) - } - return 0 -} - -func (rcv *BlockOffset) MutateOffset(n uint32) bool { - return rcv._tab.MutateUint32Slot(6, n) -} - -func (rcv *BlockOffset) Len() uint32 { - o := flatbuffers.UOffsetT(rcv._tab.Offset(8)) - if o != 0 { - return rcv._tab.GetUint32(o + rcv._tab.Pos) - } - return 0 -} - -func (rcv *BlockOffset) MutateLen(n uint32) bool { - return rcv._tab.MutateUint32Slot(8, n) -} - -func BlockOffsetStart(builder *flatbuffers.Builder) { - builder.StartObject(3) -} -func BlockOffsetAddKey(builder *flatbuffers.Builder, key flatbuffers.UOffsetT) { - builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(key), 0) -} -func BlockOffsetStartKeyVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { - return builder.StartVector(1, numElems, 1) -} -func BlockOffsetAddOffset(builder *flatbuffers.Builder, offset uint32) { - builder.PrependUint32Slot(1, offset, 0) -} -func BlockOffsetAddLen(builder *flatbuffers.Builder, len uint32) { - builder.PrependUint32Slot(2, len, 0) -} -func BlockOffsetEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { - return builder.EndObject() -} diff --git a/vendor/github.com/dgraph-io/badger/v3/fb/TableIndex.go b/vendor/github.com/dgraph-io/badger/v3/fb/TableIndex.go deleted file mode 100644 index 7b4074b57a..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/fb/TableIndex.go +++ /dev/null @@ -1,175 +0,0 @@ -// Code generated by the FlatBuffers compiler. DO NOT EDIT. - -package fb - -import ( - flatbuffers "github.com/google/flatbuffers/go" -) - -type TableIndex struct { - _tab flatbuffers.Table -} - -func GetRootAsTableIndex(buf []byte, offset flatbuffers.UOffsetT) *TableIndex { - n := flatbuffers.GetUOffsetT(buf[offset:]) - x := &TableIndex{} - x.Init(buf, n+offset) - return x -} - -func (rcv *TableIndex) Init(buf []byte, i flatbuffers.UOffsetT) { - rcv._tab.Bytes = buf - rcv._tab.Pos = i -} - -func (rcv *TableIndex) Table() flatbuffers.Table { - return rcv._tab -} - -func (rcv *TableIndex) Offsets(obj *BlockOffset, j int) bool { - o := flatbuffers.UOffsetT(rcv._tab.Offset(4)) - if o != 0 { - x := rcv._tab.Vector(o) - x += flatbuffers.UOffsetT(j) * 4 - x = rcv._tab.Indirect(x) - obj.Init(rcv._tab.Bytes, x) - return true - } - return false -} - -func (rcv *TableIndex) OffsetsLength() int { - o := flatbuffers.UOffsetT(rcv._tab.Offset(4)) - if o != 0 { - return rcv._tab.VectorLen(o) - } - return 0 -} - -func (rcv *TableIndex) BloomFilter(j int) byte { - o := flatbuffers.UOffsetT(rcv._tab.Offset(6)) - if o != 0 { - a := rcv._tab.Vector(o) - return rcv._tab.GetByte(a + flatbuffers.UOffsetT(j*1)) - } - return 0 -} - -func (rcv *TableIndex) BloomFilterLength() int { - o := flatbuffers.UOffsetT(rcv._tab.Offset(6)) - if o != 0 { - return rcv._tab.VectorLen(o) - } - return 0 -} - -func (rcv *TableIndex) BloomFilterBytes() []byte { - o := flatbuffers.UOffsetT(rcv._tab.Offset(6)) - if o != 0 { - return rcv._tab.ByteVector(o + rcv._tab.Pos) - } - return nil -} - -func (rcv *TableIndex) MutateBloomFilter(j int, n byte) bool { - o := flatbuffers.UOffsetT(rcv._tab.Offset(6)) - if o != 0 { - a := rcv._tab.Vector(o) - return rcv._tab.MutateByte(a+flatbuffers.UOffsetT(j*1), n) - } - return false -} - -func (rcv *TableIndex) MaxVersion() uint64 { - o := flatbuffers.UOffsetT(rcv._tab.Offset(8)) - if o != 0 { - return rcv._tab.GetUint64(o + rcv._tab.Pos) - } - return 0 -} - -func (rcv *TableIndex) MutateMaxVersion(n uint64) bool { - return rcv._tab.MutateUint64Slot(8, n) -} - -func (rcv *TableIndex) KeyCount() uint32 { - o := flatbuffers.UOffsetT(rcv._tab.Offset(10)) - if o != 0 { - return rcv._tab.GetUint32(o + rcv._tab.Pos) - } - return 0 -} - -func (rcv *TableIndex) MutateKeyCount(n uint32) bool { - return rcv._tab.MutateUint32Slot(10, n) -} - -func (rcv *TableIndex) UncompressedSize() uint32 { - o := flatbuffers.UOffsetT(rcv._tab.Offset(12)) - if o != 0 { - return rcv._tab.GetUint32(o + rcv._tab.Pos) - } - return 0 -} - -func (rcv *TableIndex) MutateUncompressedSize(n uint32) bool { - return rcv._tab.MutateUint32Slot(12, n) -} - -func (rcv *TableIndex) OnDiskSize() uint32 { - o := flatbuffers.UOffsetT(rcv._tab.Offset(14)) - if o != 0 { - return rcv._tab.GetUint32(o + rcv._tab.Pos) - } - return 0 -} - -func (rcv *TableIndex) MutateOnDiskSize(n uint32) bool { - return rcv._tab.MutateUint32Slot(14, n) -} - -func (rcv *TableIndex) StaleDataSize() uint32 { - o := flatbuffers.UOffsetT(rcv._tab.Offset(16)) - if o != 0 { - return rcv._tab.GetUint32(o + rcv._tab.Pos) - } - return 0 -} - -func (rcv *TableIndex) MutateStaleDataSize(n uint32) bool { - return rcv._tab.MutateUint32Slot(16, n) -} - -func TableIndexStart(builder *flatbuffers.Builder) { - builder.StartObject(7) -} -func TableIndexAddOffsets(builder *flatbuffers.Builder, offsets flatbuffers.UOffsetT) { - builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(offsets), 0) -} -func TableIndexStartOffsetsVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { - return builder.StartVector(4, numElems, 4) -} -func TableIndexAddBloomFilter(builder *flatbuffers.Builder, bloomFilter flatbuffers.UOffsetT) { - builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(bloomFilter), 0) -} -func TableIndexStartBloomFilterVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { - return builder.StartVector(1, numElems, 1) -} -func TableIndexAddMaxVersion(builder *flatbuffers.Builder, maxVersion uint64) { - builder.PrependUint64Slot(2, maxVersion, 0) -} -func TableIndexAddKeyCount(builder *flatbuffers.Builder, keyCount uint32) { - builder.PrependUint32Slot(3, keyCount, 0) -} -func TableIndexAddUncompressedSize(builder *flatbuffers.Builder, uncompressedSize uint32) { - builder.PrependUint32Slot(4, uncompressedSize, 0) -} -func TableIndexAddOnDiskSize(builder *flatbuffers.Builder, onDiskSize uint32) { - builder.PrependUint32Slot(5, onDiskSize, 0) -} -func TableIndexAddStaleDataSize(builder *flatbuffers.Builder, staleDataSize uint32) { - builder.PrependUint32Slot(6, staleDataSize, 0) -} -func TableIndexEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { - return builder.EndObject() -} diff --git a/vendor/github.com/dgraph-io/badger/v3/fb/flatbuffer.fbs b/vendor/github.com/dgraph-io/badger/v3/fb/flatbuffer.fbs deleted file mode 100644 index af559dd4a4..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/fb/flatbuffer.fbs +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -namespace fb; - -table TableIndex { - offsets:[BlockOffset]; - bloom_filter:[ubyte]; - max_version:uint64; - key_count:uint32; - uncompressed_size:uint32; - on_disk_size:uint32; - stale_data_size:uint32; -} - -table BlockOffset { - key:[ubyte]; - offset:uint; - len:uint; -} - -root_type TableIndex; -root_type BlockOffset; diff --git a/vendor/github.com/dgraph-io/badger/v3/fb/gen.sh b/vendor/github.com/dgraph-io/badger/v3/fb/gen.sh deleted file mode 100644 index 90d88b4a3a..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/fb/gen.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -set -e - -## Install flatc if not present -## ref. https://google.github.io/flatbuffers/flatbuffers_guide_building.html -command -v flatc > /dev/null || { ./install_flatbuffers.sh ; } - -flatc --go flatbuffer.fbs -# Move files to the correct directory. -mv fb/* ./ -rmdir fb diff --git a/vendor/github.com/dgraph-io/badger/v3/fb/install_flatbuffers.sh b/vendor/github.com/dgraph-io/badger/v3/fb/install_flatbuffers.sh deleted file mode 100644 index ae07da7e24..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/fb/install_flatbuffers.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash - -set -e - -install_mac() { - command -v brew > /dev/null || \ - { echo "[ERROR]: 'brew' command not not found. Exiting" 1>&2; exit 1; } - brew install flatbuffers -} - -install_linux() { - for CMD in curl cmake g++ make; do - command -v $CMD > /dev/null || \ - { echo "[ERROR]: '$CMD' command not not found. Exiting" 1>&2; exit 1; } - done - - ## Create Temp Build Directory - BUILD_DIR=$(mktemp -d) - pushd $BUILD_DIR - - ## Fetch Latest Tarball - LATEST_VERSION=$(curl -s https://api.github.com/repos/google/flatbuffers/releases/latest | grep -oP '(?<=tag_name": ")[^"]+') - curl -sLO https://github.com/google/flatbuffers/archive/$LATEST_VERSION.tar.gz - tar xf $LATEST_VERSION.tar.gz - - ## Build Binaries - cd flatbuffers-${LATEST_VERSION#v} - cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release - make - ./flattests - cp flatc /usr/local/bin/flatc - - ## Cleanup Temp Build Directory - popd - rm -rf $BUILD_DIR -} - -SYSTEM=$(uname -s) - -case ${SYSTEM,,} in - linux) - sudo bash -c "$(declare -f install_linux); install_linux" - ;; - darwin) - install_mac - ;; -esac diff --git a/vendor/github.com/dgraph-io/badger/v3/histogram.go b/vendor/github.com/dgraph-io/badger/v3/histogram.go deleted file mode 100644 index d8c94bb7ad..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/histogram.go +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "fmt" - "math" -) - -// PrintHistogram builds and displays the key-value size histogram. -// When keyPrefix is set, only the keys that have prefix "keyPrefix" are -// considered for creating the histogram -func (db *DB) PrintHistogram(keyPrefix []byte) { - if db == nil { - fmt.Println("\nCannot build histogram: DB is nil.") - return - } - histogram := db.buildHistogram(keyPrefix) - fmt.Printf("Histogram of key sizes (in bytes)\n") - histogram.keySizeHistogram.printHistogram() - fmt.Printf("Histogram of value sizes (in bytes)\n") - histogram.valueSizeHistogram.printHistogram() -} - -// histogramData stores information about a histogram -type histogramData struct { - bins []int64 - countPerBin []int64 - totalCount int64 - min int64 - max int64 - sum int64 -} - -// sizeHistogram contains keySize histogram and valueSize histogram -type sizeHistogram struct { - keySizeHistogram, valueSizeHistogram histogramData -} - -// newSizeHistogram returns a new instance of keyValueSizeHistogram with -// properly initialized fields. -func newSizeHistogram() *sizeHistogram { - // TODO(ibrahim): find appropriate bin size. - keyBins := createHistogramBins(1, 16) - valueBins := createHistogramBins(1, 30) - return &sizeHistogram{ - keySizeHistogram: histogramData{ - bins: keyBins, - countPerBin: make([]int64, len(keyBins)+1), - max: math.MinInt64, - min: math.MaxInt64, - sum: 0, - }, - valueSizeHistogram: histogramData{ - bins: valueBins, - countPerBin: make([]int64, len(valueBins)+1), - max: math.MinInt64, - min: math.MaxInt64, - sum: 0, - }, - } -} - -// createHistogramBins creates bins for an histogram. The bin sizes are powers -// of two of the form [2^min_exponent, ..., 2^max_exponent]. -func createHistogramBins(minExponent, maxExponent uint32) []int64 { - var bins []int64 - for i := minExponent; i <= maxExponent; i++ { - bins = append(bins, int64(1)< histogram.max { - histogram.max = value - } - if value < histogram.min { - histogram.min = value - } - - histogram.sum += value - histogram.totalCount++ - - for index := 0; index <= len(histogram.bins); index++ { - // Allocate value in the last buckets if we reached the end of the Bounds array. - if index == len(histogram.bins) { - histogram.countPerBin[index]++ - break - } - - // Check if the value should be added to the "index" bin - if value < int64(histogram.bins[index]) { - histogram.countPerBin[index]++ - break - } - } -} - -// buildHistogram builds the key-value size histogram. -// When keyPrefix is set, only the keys that have prefix "keyPrefix" are -// considered for creating the histogram -func (db *DB) buildHistogram(keyPrefix []byte) *sizeHistogram { - txn := db.NewTransaction(false) - defer txn.Discard() - - itr := txn.NewIterator(DefaultIteratorOptions) - defer itr.Close() - - badgerHistogram := newSizeHistogram() - - // Collect key and value sizes. - for itr.Seek(keyPrefix); itr.ValidForPrefix(keyPrefix); itr.Next() { - item := itr.Item() - badgerHistogram.keySizeHistogram.Update(item.KeySize()) - badgerHistogram.valueSizeHistogram.Update(item.ValueSize()) - } - return badgerHistogram -} - -// printHistogram prints the histogram data in a human-readable format. -func (histogram histogramData) printHistogram() { - fmt.Printf("Total count: %d\n", histogram.totalCount) - fmt.Printf("Min value: %d\n", histogram.min) - fmt.Printf("Max value: %d\n", histogram.max) - fmt.Printf("Mean: %.2f\n", float64(histogram.sum)/float64(histogram.totalCount)) - fmt.Printf("%24s %9s\n", "Range", "Count") - - numBins := len(histogram.bins) - for index, count := range histogram.countPerBin { - if count == 0 { - continue - } - - // The last bin represents the bin that contains the range from - // the last bin up to infinity so it's processed differently than the - // other bins. - if index == len(histogram.countPerBin)-1 { - lowerBound := int(histogram.bins[numBins-1]) - fmt.Printf("[%10d, %10s) %9d\n", lowerBound, "infinity", count) - continue - } - - upperBound := int(histogram.bins[index]) - lowerBound := 0 - if index > 0 { - lowerBound = int(histogram.bins[index-1]) - } - - fmt.Printf("[%10d, %10d) %9d\n", lowerBound, upperBound, count) - } - fmt.Println() -} diff --git a/vendor/github.com/dgraph-io/badger/v3/iterator.go b/vendor/github.com/dgraph-io/badger/v3/iterator.go deleted file mode 100644 index 409e8618a6..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/iterator.go +++ /dev/null @@ -1,788 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "bytes" - "fmt" - "hash/crc32" - "math" - "sort" - "sync" - "sync/atomic" - "time" - - "github.com/dgraph-io/badger/v3/table" - "github.com/dgraph-io/ristretto/z" - - "github.com/dgraph-io/badger/v3/y" -) - -type prefetchStatus uint8 - -const ( - prefetched prefetchStatus = iota + 1 -) - -// Item is returned during iteration. Both the Key() and Value() output is only valid until -// iterator.Next() is called. -type Item struct { - key []byte - vptr []byte - val []byte - version uint64 - expiresAt uint64 - - slice *y.Slice // Used only during prefetching. - next *Item - txn *Txn - - err error - wg sync.WaitGroup - status prefetchStatus - meta byte // We need to store meta to know about bitValuePointer. - userMeta byte -} - -// String returns a string representation of Item -func (item *Item) String() string { - return fmt.Sprintf("key=%q, version=%d, meta=%x", item.Key(), item.Version(), item.meta) -} - -// Key returns the key. -// -// Key is only valid as long as item is valid, or transaction is valid. If you need to use it -// outside its validity, please use KeyCopy. -func (item *Item) Key() []byte { - return item.key -} - -// KeyCopy returns a copy of the key of the item, writing it to dst slice. -// If nil is passed, or capacity of dst isn't sufficient, a new slice would be allocated and -// returned. -func (item *Item) KeyCopy(dst []byte) []byte { - return y.SafeCopy(dst, item.key) -} - -// Version returns the commit timestamp of the item. -func (item *Item) Version() uint64 { - return item.version -} - -// Value retrieves the value of the item from the value log. -// -// This method must be called within a transaction. Calling it outside a -// transaction is considered undefined behavior. If an iterator is being used, -// then Item.Value() is defined in the current iteration only, because items are -// reused. -// -// If you need to use a value outside a transaction, please use Item.ValueCopy -// instead, or copy it yourself. Value might change once discard or commit is called. -// Use ValueCopy if you want to do a Set after Get. -func (item *Item) Value(fn func(val []byte) error) error { - item.wg.Wait() - if item.status == prefetched { - if item.err == nil && fn != nil { - if err := fn(item.val); err != nil { - return err - } - } - return item.err - } - buf, cb, err := item.yieldItemValue() - defer runCallback(cb) - if err != nil { - return err - } - if fn != nil { - return fn(buf) - } - return nil -} - -// ValueCopy returns a copy of the value of the item from the value log, writing it to dst slice. -// If nil is passed, or capacity of dst isn't sufficient, a new slice would be allocated and -// returned. Tip: It might make sense to reuse the returned slice as dst argument for the next call. -// -// This function is useful in long running iterate/update transactions to avoid a write deadlock. -// See Github issue: https://github.com/dgraph-io/badger/issues/315 -func (item *Item) ValueCopy(dst []byte) ([]byte, error) { - item.wg.Wait() - if item.status == prefetched { - return y.SafeCopy(dst, item.val), item.err - } - buf, cb, err := item.yieldItemValue() - defer runCallback(cb) - return y.SafeCopy(dst, buf), err -} - -func (item *Item) hasValue() bool { - if item.meta == 0 && item.vptr == nil { - // key not found - return false - } - return true -} - -// IsDeletedOrExpired returns true if item contains deleted or expired value. -func (item *Item) IsDeletedOrExpired() bool { - return isDeletedOrExpired(item.meta, item.expiresAt) -} - -// DiscardEarlierVersions returns whether the item was created with the -// option to discard earlier versions of a key when multiple are available. -func (item *Item) DiscardEarlierVersions() bool { - return item.meta&bitDiscardEarlierVersions > 0 -} - -func (item *Item) yieldItemValue() ([]byte, func(), error) { - key := item.Key() // No need to copy. - if !item.hasValue() { - return nil, nil, nil - } - - if item.slice == nil { - item.slice = new(y.Slice) - } - - if (item.meta & bitValuePointer) == 0 { - val := item.slice.Resize(len(item.vptr)) - copy(val, item.vptr) - return val, nil, nil - } - - var vp valuePointer - vp.Decode(item.vptr) - db := item.txn.db - result, cb, err := db.vlog.Read(vp, item.slice) - if err != nil { - db.opt.Logger.Errorf("Unable to read: Key: %v, Version : %v, meta: %v, userMeta: %v"+ - " Error: %v", key, item.version, item.meta, item.userMeta, err) - var txn *Txn - if db.opt.managedTxns { - txn = db.NewTransactionAt(math.MaxUint64, false) - } else { - txn = db.NewTransaction(false) - } - defer txn.Discard() - - iopt := DefaultIteratorOptions - iopt.AllVersions = true - iopt.InternalAccess = true - iopt.PrefetchValues = false - - it := txn.NewKeyIterator(item.Key(), iopt) - defer it.Close() - for it.Rewind(); it.Valid(); it.Next() { - item := it.Item() - var vp valuePointer - if item.meta&bitValuePointer > 0 { - vp.Decode(item.vptr) - } - db.opt.Logger.Errorf("Key: %v, Version : %v, meta: %v, userMeta: %v valuePointer: %+v", - item.Key(), item.version, item.meta, item.userMeta, vp) - } - } - // Don't return error if we cannot read the value. Just log the error. - return result, cb, nil -} - -func runCallback(cb func()) { - if cb != nil { - cb() - } -} - -func (item *Item) prefetchValue() { - val, cb, err := item.yieldItemValue() - defer runCallback(cb) - - item.err = err - item.status = prefetched - if val == nil { - return - } - buf := item.slice.Resize(len(val)) - copy(buf, val) - item.val = buf -} - -// EstimatedSize returns the approximate size of the key-value pair. -// -// This can be called while iterating through a store to quickly estimate the -// size of a range of key-value pairs (without fetching the corresponding -// values). -func (item *Item) EstimatedSize() int64 { - if !item.hasValue() { - return 0 - } - if (item.meta & bitValuePointer) == 0 { - return int64(len(item.key) + len(item.vptr)) - } - var vp valuePointer - vp.Decode(item.vptr) - return int64(vp.Len) // includes key length. -} - -// KeySize returns the size of the key. -// Exact size of the key is key + 8 bytes of timestamp -func (item *Item) KeySize() int64 { - return int64(len(item.key)) -} - -// ValueSize returns the approximate size of the value. -// -// This can be called to quickly estimate the size of a value without fetching -// it. -func (item *Item) ValueSize() int64 { - if !item.hasValue() { - return 0 - } - if (item.meta & bitValuePointer) == 0 { - return int64(len(item.vptr)) - } - var vp valuePointer - vp.Decode(item.vptr) - - klen := int64(len(item.key) + 8) // 8 bytes for timestamp. - // 6 bytes are for the approximate length of the header. Since header is encoded in varint, we - // cannot find the exact length of header without fetching it. - return int64(vp.Len) - klen - 6 - crc32.Size -} - -// UserMeta returns the userMeta set by the user. Typically, this byte, optionally set by the user -// is used to interpret the value. -func (item *Item) UserMeta() byte { - return item.userMeta -} - -// ExpiresAt returns a Unix time value indicating when the item will be -// considered expired. 0 indicates that the item will never expire. -func (item *Item) ExpiresAt() uint64 { - return item.expiresAt -} - -// TODO: Switch this to use linked list container in Go. -type list struct { - head *Item - tail *Item -} - -func (l *list) push(i *Item) { - i.next = nil - if l.tail == nil { - l.head = i - l.tail = i - return - } - l.tail.next = i - l.tail = i -} - -func (l *list) pop() *Item { - if l.head == nil { - return nil - } - i := l.head - if l.head == l.tail { - l.tail = nil - l.head = nil - } else { - l.head = i.next - } - i.next = nil - return i -} - -// IteratorOptions is used to set options when iterating over Badger key-value -// stores. -// -// This package provides DefaultIteratorOptions which contains options that -// should work for most applications. Consider using that as a starting point -// before customizing it for your own needs. -type IteratorOptions struct { - // PrefetchSize is the number of KV pairs to prefetch while iterating. - // Valid only if PrefetchValues is true. - PrefetchSize int - // PrefetchValues Indicates whether we should prefetch values during - // iteration and store them. - PrefetchValues bool - Reverse bool // Direction of iteration. False is forward, true is backward. - AllVersions bool // Fetch all valid versions of the same key. - InternalAccess bool // Used to allow internal access to badger keys. - - // The following option is used to narrow down the SSTables that iterator - // picks up. If Prefix is specified, only tables which could have this - // prefix are picked based on their range of keys. - prefixIsKey bool // If set, use the prefix for bloom filter lookup. - Prefix []byte // Only iterate over this given prefix. - SinceTs uint64 // Only read data that has version > SinceTs. -} - -func (opt *IteratorOptions) compareToPrefix(key []byte) int { - // We should compare key without timestamp. For example key - a[TS] might be > "aa" prefix. - key = y.ParseKey(key) - if len(key) > len(opt.Prefix) { - key = key[:len(opt.Prefix)] - } - return bytes.Compare(key, opt.Prefix) -} - -func (opt *IteratorOptions) pickTable(t table.TableInterface) bool { - // Ignore this table if its max version is less than the sinceTs. - if t.MaxVersion() < opt.SinceTs { - return false - } - if len(opt.Prefix) == 0 { - return true - } - if opt.compareToPrefix(t.Smallest()) > 0 { - return false - } - if opt.compareToPrefix(t.Biggest()) < 0 { - return false - } - // Bloom filter lookup would only work if opt.Prefix does NOT have the read - // timestamp as part of the key. - if opt.prefixIsKey && t.DoesNotHave(y.Hash(opt.Prefix)) { - return false - } - return true -} - -// pickTables picks the necessary table for the iterator. This function also assumes -// that the tables are sorted in the right order. -func (opt *IteratorOptions) pickTables(all []*table.Table) []*table.Table { - filterTables := func(tables []*table.Table) []*table.Table { - if opt.SinceTs > 0 { - tmp := tables[:0] - for _, t := range tables { - if t.MaxVersion() < opt.SinceTs { - continue - } - tmp = append(tmp, t) - } - tables = tmp - } - return tables - } - - if len(opt.Prefix) == 0 { - out := make([]*table.Table, len(all)) - copy(out, all) - return filterTables(out) - } - sIdx := sort.Search(len(all), func(i int) bool { - // table.Biggest >= opt.prefix - // if opt.Prefix < table.Biggest, then surely it is not in any of the preceding tables. - return opt.compareToPrefix(all[i].Biggest()) >= 0 - }) - if sIdx == len(all) { - // Not found. - return []*table.Table{} - } - - filtered := all[sIdx:] - if !opt.prefixIsKey { - eIdx := sort.Search(len(filtered), func(i int) bool { - return opt.compareToPrefix(filtered[i].Smallest()) > 0 - }) - out := make([]*table.Table, len(filtered[:eIdx])) - copy(out, filtered[:eIdx]) - return filterTables(out) - } - - // opt.prefixIsKey == true. This code is optimizing for opt.prefixIsKey part. - var out []*table.Table - hash := y.Hash(opt.Prefix) - for _, t := range filtered { - // When we encounter the first table whose smallest key is higher than opt.Prefix, we can - // stop. This is an IMPORTANT optimization, just considering how often we call - // NewKeyIterator. - if opt.compareToPrefix(t.Smallest()) > 0 { - // if table.Smallest > opt.Prefix, then this and all tables after this can be ignored. - break - } - // opt.Prefix is actually the key. So, we can run bloom filter checks - // as well. - if t.DoesNotHave(hash) { - continue - } - out = append(out, t) - } - return filterTables(out) -} - -// DefaultIteratorOptions contains default options when iterating over Badger key-value stores. -var DefaultIteratorOptions = IteratorOptions{ - PrefetchValues: true, - PrefetchSize: 100, - Reverse: false, - AllVersions: false, -} - -// Iterator helps iterating over the KV pairs in a lexicographically sorted order. -type Iterator struct { - iitr y.Iterator - txn *Txn - readTs uint64 - - opt IteratorOptions - item *Item - data list - waste list - - lastKey []byte // Used to skip over multiple versions of the same key. - - closed bool - scanned int // Used to estimate the size of data scanned by iterator. - - // ThreadId is an optional value that can be set to identify which goroutine created - // the iterator. It can be used, for example, to uniquely identify each of the - // iterators created by the stream interface - ThreadId int - - Alloc *z.Allocator -} - -// NewIterator returns a new iterator. Depending upon the options, either only keys, or both -// key-value pairs would be fetched. The keys are returned in lexicographically sorted order. -// Using prefetch is recommended if you're doing a long running iteration, for performance. -// -// Multiple Iterators: -// For a read-only txn, multiple iterators can be running simultaneously. However, for a read-write -// txn, iterators have the nuance of being a snapshot of the writes for the transaction at the time -// iterator was created. If writes are performed after an iterator is created, then that iterator -// will not be able to see those writes. Only writes performed before an iterator was created can be -// viewed. -func (txn *Txn) NewIterator(opt IteratorOptions) *Iterator { - if txn.discarded { - panic("Transaction has already been discarded") - } - if txn.db.IsClosed() { - panic(ErrDBClosed.Error()) - } - - // Keep track of the number of active iterators. - atomic.AddInt32(&txn.numIterators, 1) - - // TODO: If Prefix is set, only pick those memtables which have keys with - // the prefix. - tables, decr := txn.db.getMemTables() - defer decr() - txn.db.vlog.incrIteratorCount() - var iters []y.Iterator - if itr := txn.newPendingWritesIterator(opt.Reverse); itr != nil { - iters = append(iters, itr) - } - for i := 0; i < len(tables); i++ { - iters = append(iters, tables[i].sl.NewUniIterator(opt.Reverse)) - } - iters = txn.db.lc.appendIterators(iters, &opt) // This will increment references. - res := &Iterator{ - txn: txn, - iitr: table.NewMergeIterator(iters, opt.Reverse), - opt: opt, - readTs: txn.readTs, - } - return res -} - -// NewKeyIterator is just like NewIterator, but allows the user to iterate over all versions of a -// single key. Internally, it sets the Prefix option in provided opt, and uses that prefix to -// additionally run bloom filter lookups before picking tables from the LSM tree. -func (txn *Txn) NewKeyIterator(key []byte, opt IteratorOptions) *Iterator { - if len(opt.Prefix) > 0 { - panic("opt.Prefix should be nil for NewKeyIterator.") - } - opt.Prefix = key // This key must be without the timestamp. - opt.prefixIsKey = true - opt.AllVersions = true - return txn.NewIterator(opt) -} - -func (it *Iterator) newItem() *Item { - item := it.waste.pop() - if item == nil { - item = &Item{slice: new(y.Slice), txn: it.txn} - } - return item -} - -// Item returns pointer to the current key-value pair. -// This item is only valid until it.Next() gets called. -func (it *Iterator) Item() *Item { - tx := it.txn - tx.addReadKey(it.item.Key()) - return it.item -} - -// Valid returns false when iteration is done. -func (it *Iterator) Valid() bool { - if it.item == nil { - return false - } - if it.opt.prefixIsKey { - return bytes.Equal(it.item.key, it.opt.Prefix) - } - return bytes.HasPrefix(it.item.key, it.opt.Prefix) -} - -// ValidForPrefix returns false when iteration is done -// or when the current key is not prefixed by the specified prefix. -func (it *Iterator) ValidForPrefix(prefix []byte) bool { - return it.Valid() && bytes.HasPrefix(it.item.key, prefix) -} - -// Close would close the iterator. It is important to call this when you're done with iteration. -func (it *Iterator) Close() { - if it.closed { - return - } - it.closed = true - if it.iitr == nil { - atomic.AddInt32(&it.txn.numIterators, -1) - return - } - - it.iitr.Close() - // It is important to wait for the fill goroutines to finish. Otherwise, we might leave zombie - // goroutines behind, which are waiting to acquire file read locks after DB has been closed. - waitFor := func(l list) { - item := l.pop() - for item != nil { - item.wg.Wait() - item = l.pop() - } - } - waitFor(it.waste) - waitFor(it.data) - - // TODO: We could handle this error. - _ = it.txn.db.vlog.decrIteratorCount() - atomic.AddInt32(&it.txn.numIterators, -1) -} - -// Next would advance the iterator by one. Always check it.Valid() after a Next() -// to ensure you have access to a valid it.Item(). -func (it *Iterator) Next() { - if it.iitr == nil { - return - } - // Reuse current item - it.item.wg.Wait() // Just cleaner to wait before pushing to avoid doing ref counting. - it.scanned += len(it.item.key) + len(it.item.val) + len(it.item.vptr) + 2 - it.waste.push(it.item) - - // Set next item to current - it.item = it.data.pop() - for it.iitr.Valid() { - if it.parseItem() { - // parseItem calls one extra next. - // This is used to deal with the complexity of reverse iteration. - break - } - } -} - -func isDeletedOrExpired(meta byte, expiresAt uint64) bool { - if meta&bitDelete > 0 { - return true - } - if expiresAt == 0 { - return false - } - return expiresAt <= uint64(time.Now().Unix()) -} - -// parseItem is a complex function because it needs to handle both forward and reverse iteration -// implementation. We store keys such that their versions are sorted in descending order. This makes -// forward iteration efficient, but revese iteration complicated. This tradeoff is better because -// forward iteration is more common than reverse. It returns true, if either the iterator is invalid -// or it has pushed an item into it.data list, else it returns false. -// -// This function advances the iterator. -func (it *Iterator) parseItem() bool { - mi := it.iitr - key := mi.Key() - - setItem := func(item *Item) { - if it.item == nil { - it.item = item - } else { - it.data.push(item) - } - } - - isInternalKey := bytes.HasPrefix(key, badgerPrefix) - // Skip badger keys. - if !it.opt.InternalAccess && isInternalKey { - mi.Next() - return false - } - - // Skip any versions which are beyond the readTs. - version := y.ParseTs(key) - // Ignore everything that is above the readTs and below or at the sinceTs. - if version > it.readTs || (it.opt.SinceTs > 0 && version <= it.opt.SinceTs) { - mi.Next() - return false - } - - // Skip banned keys only if it does not have badger internal prefix. - if !isInternalKey && it.txn.db.isBanned(key) != nil { - mi.Next() - return false - } - - if it.opt.AllVersions { - // Return deleted or expired values also, otherwise user can't figure out - // whether the key was deleted. - item := it.newItem() - it.fill(item) - setItem(item) - mi.Next() - return true - } - - // If iterating in forward direction, then just checking the last key against current key would - // be sufficient. - if !it.opt.Reverse { - if y.SameKey(it.lastKey, key) { - mi.Next() - return false - } - // Only track in forward direction. - // We should update lastKey as soon as we find a different key in our snapshot. - // Consider keys: a 5, b 7 (del), b 5. When iterating, lastKey = a. - // Then we see b 7, which is deleted. If we don't store lastKey = b, we'll then return b 5, - // which is wrong. Therefore, update lastKey here. - it.lastKey = y.SafeCopy(it.lastKey, mi.Key()) - } - -FILL: - // If deleted, advance and return. - vs := mi.Value() - if isDeletedOrExpired(vs.Meta, vs.ExpiresAt) { - mi.Next() - return false - } - - item := it.newItem() - it.fill(item) - // fill item based on current cursor position. All Next calls have returned, so reaching here - // means no Next was called. - - mi.Next() // Advance but no fill item yet. - if !it.opt.Reverse || !mi.Valid() { // Forward direction, or invalid. - setItem(item) - return true - } - - // Reverse direction. - nextTs := y.ParseTs(mi.Key()) - mik := y.ParseKey(mi.Key()) - if nextTs <= it.readTs && bytes.Equal(mik, item.key) { - // This is a valid potential candidate. - goto FILL - } - // Ignore the next candidate. Return the current one. - setItem(item) - return true -} - -func (it *Iterator) fill(item *Item) { - vs := it.iitr.Value() - item.meta = vs.Meta - item.userMeta = vs.UserMeta - item.expiresAt = vs.ExpiresAt - - item.version = y.ParseTs(it.iitr.Key()) - item.key = y.SafeCopy(item.key, y.ParseKey(it.iitr.Key())) - - item.vptr = y.SafeCopy(item.vptr, vs.Value) - item.val = nil - if it.opt.PrefetchValues { - item.wg.Add(1) - go func() { - // FIXME we are not handling errors here. - item.prefetchValue() - item.wg.Done() - }() - } -} - -func (it *Iterator) prefetch() { - prefetchSize := 2 - if it.opt.PrefetchValues && it.opt.PrefetchSize > 1 { - prefetchSize = it.opt.PrefetchSize - } - - i := it.iitr - var count int - it.item = nil - for i.Valid() { - if !it.parseItem() { - continue - } - count++ - if count == prefetchSize { - break - } - } -} - -// Seek would seek to the provided key if present. If absent, it would seek to the next -// smallest key greater than the provided key if iterating in the forward direction. -// Behavior would be reversed if iterating backwards. -func (it *Iterator) Seek(key []byte) { - if it.iitr == nil { - return - } - if len(key) > 0 { - it.txn.addReadKey(key) - } - for i := it.data.pop(); i != nil; i = it.data.pop() { - i.wg.Wait() - it.waste.push(i) - } - - it.lastKey = it.lastKey[:0] - if len(key) == 0 { - key = it.opt.Prefix - } - if len(key) == 0 { - it.iitr.Rewind() - it.prefetch() - return - } - - if !it.opt.Reverse { - key = y.KeyWithTs(key, it.txn.readTs) - } else { - key = y.KeyWithTs(key, 0) - } - it.iitr.Seek(key) - it.prefetch() -} - -// Rewind would rewind the iterator cursor all the way to zero-th position, which would be the -// smallest key if iterating forward, and largest if iterating backward. It does not keep track of -// whether the cursor started with a Seek(). -func (it *Iterator) Rewind() { - it.Seek(nil) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/key_registry.go b/vendor/github.com/dgraph-io/badger/v3/key_registry.go deleted file mode 100644 index 306e9c1297..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/key_registry.go +++ /dev/null @@ -1,424 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "bytes" - "crypto/aes" - "crypto/rand" - "encoding/binary" - "hash/crc32" - "io" - "os" - "path/filepath" - "sync" - "time" - - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/y" -) - -const ( - // KeyRegistryFileName is the file name for the key registry file. - KeyRegistryFileName = "KEYREGISTRY" - // KeyRegistryRewriteFileName is the file name for the rewrite key registry file. - KeyRegistryRewriteFileName = "REWRITE-KEYREGISTRY" -) - -// SanityText is used to check whether the given user provided storage key is valid or not -var sanityText = []byte("Hello Badger") - -// KeyRegistry used to maintain all the data keys. -type KeyRegistry struct { - sync.RWMutex - dataKeys map[uint64]*pb.DataKey - lastCreated int64 //lastCreated is the timestamp(seconds) of the last data key generated. - nextKeyID uint64 - fp *os.File - opt KeyRegistryOptions -} - -type KeyRegistryOptions struct { - Dir string - ReadOnly bool - EncryptionKey []byte - EncryptionKeyRotationDuration time.Duration - InMemory bool -} - -// newKeyRegistry returns KeyRegistry. -func newKeyRegistry(opt KeyRegistryOptions) *KeyRegistry { - return &KeyRegistry{ - dataKeys: make(map[uint64]*pb.DataKey), - nextKeyID: 0, - opt: opt, - } -} - -// OpenKeyRegistry opens key registry if it exists, otherwise it'll create key registry -// and returns key registry. -func OpenKeyRegistry(opt KeyRegistryOptions) (*KeyRegistry, error) { - // sanity check the encryption key length. - if len(opt.EncryptionKey) > 0 { - switch len(opt.EncryptionKey) { - default: - return nil, y.Wrapf(ErrInvalidEncryptionKey, "During OpenKeyRegistry") - case 16, 24, 32: - break - } - } - // If db is opened in InMemory mode, we don't need to write key registry to the disk. - if opt.InMemory { - return newKeyRegistry(opt), nil - } - path := filepath.Join(opt.Dir, KeyRegistryFileName) - var flags y.Flags - if opt.ReadOnly { - flags |= y.ReadOnly - } else { - flags |= y.Sync - } - fp, err := y.OpenExistingFile(path, flags) - // OpenExistingFile just open file. - // So checking whether the file exist or not. If not - // We'll create new keyregistry. - if os.IsNotExist(err) { - // Creating new registry file if not exist. - kr := newKeyRegistry(opt) - if opt.ReadOnly { - return kr, nil - } - // Writing the key registry to the file. - if err := WriteKeyRegistry(kr, opt); err != nil { - return nil, y.Wrapf(err, "Error while writing key registry.") - } - fp, err = y.OpenExistingFile(path, flags) - if err != nil { - return nil, y.Wrapf(err, "Error while opening newly created key registry.") - } - } else if err != nil { - return nil, y.Wrapf(err, "Error while opening key registry.") - } - kr, err := readKeyRegistry(fp, opt) - if err != nil { - // This case happens only if the file is opened properly and - // not able to read. - fp.Close() - return nil, err - } - if opt.ReadOnly { - // We'll close the file in readonly mode. - return kr, fp.Close() - } - kr.fp = fp - return kr, nil -} - -// keyRegistryIterator reads all the datakey from the key registry -type keyRegistryIterator struct { - encryptionKey []byte - fp *os.File - // lenCrcBuf contains crc buf and data length to move forward. - lenCrcBuf [8]byte -} - -// newKeyRegistryIterator returns iterator which will allow you to iterate -// over the data key of the key registry. -func newKeyRegistryIterator(fp *os.File, encryptionKey []byte) (*keyRegistryIterator, error) { - return &keyRegistryIterator{ - encryptionKey: encryptionKey, - fp: fp, - lenCrcBuf: [8]byte{}, - }, validRegistry(fp, encryptionKey) -} - -// validRegistry checks that given encryption key is valid or not. -func validRegistry(fp *os.File, encryptionKey []byte) error { - iv := make([]byte, aes.BlockSize) - var err error - if _, err = fp.Read(iv); err != nil { - return y.Wrapf(err, "Error while reading IV for key registry.") - } - eSanityText := make([]byte, len(sanityText)) - if _, err = fp.Read(eSanityText); err != nil { - return y.Wrapf(err, "Error while reading sanity text.") - } - if len(encryptionKey) > 0 { - // Decrypting sanity text. - if eSanityText, err = y.XORBlockAllocate(eSanityText, encryptionKey, iv); err != nil { - return y.Wrapf(err, "During validRegistry") - } - } - // Check the given key is valid or not. - if !bytes.Equal(eSanityText, sanityText) { - return ErrEncryptionKeyMismatch - } - return nil -} - -func (kri *keyRegistryIterator) next() (*pb.DataKey, error) { - var err error - // Read crc buf and data length. - if _, err = kri.fp.Read(kri.lenCrcBuf[:]); err != nil { - // EOF means end of the iteration. - if err != io.EOF { - return nil, y.Wrapf(err, "While reading crc in keyRegistryIterator.next") - } - return nil, err - } - l := int64(binary.BigEndian.Uint32(kri.lenCrcBuf[0:4])) - // Read protobuf data. - data := make([]byte, l) - if _, err = kri.fp.Read(data); err != nil { - // EOF means end of the iteration. - if err != io.EOF { - return nil, y.Wrapf(err, "While reading protobuf in keyRegistryIterator.next") - } - return nil, err - } - // Check checksum. - if crc32.Checksum(data, y.CastagnoliCrcTable) != binary.BigEndian.Uint32(kri.lenCrcBuf[4:]) { - return nil, y.Wrapf(y.ErrChecksumMismatch, "Error while checking checksum for data key.") - } - dataKey := &pb.DataKey{} - if err = dataKey.Unmarshal(data); err != nil { - return nil, y.Wrapf(err, "While unmarshal of datakey in keyRegistryIterator.next") - } - if len(kri.encryptionKey) > 0 { - // Decrypt the key if the storage key exists. - if dataKey.Data, err = y.XORBlockAllocate(dataKey.Data, kri.encryptionKey, dataKey.Iv); err != nil { - return nil, y.Wrapf(err, "While decrypting datakey in keyRegistryIterator.next") - } - } - return dataKey, nil -} - -// readKeyRegistry will read the key registry file and build the key registry struct. -func readKeyRegistry(fp *os.File, opt KeyRegistryOptions) (*KeyRegistry, error) { - itr, err := newKeyRegistryIterator(fp, opt.EncryptionKey) - if err != nil { - return nil, err - } - kr := newKeyRegistry(opt) - var dk *pb.DataKey - dk, err = itr.next() - for err == nil && dk != nil { - if dk.KeyId > kr.nextKeyID { - // Set the maximum key ID for next key ID generation. - kr.nextKeyID = dk.KeyId - } - if dk.CreatedAt > kr.lastCreated { - // Set the last generated key timestamp. - kr.lastCreated = dk.CreatedAt - } - // No need to lock since we are building the initial state. - kr.dataKeys[dk.KeyId] = dk - // Forward the iterator. - dk, err = itr.next() - } - // We read all the key. So, Ignoring this error. - if err == io.EOF { - err = nil - } - return kr, err -} - -/* -Structure of Key Registry. -+-------------------+---------------------+--------------------+--------------+------------------+ -| IV | Sanity Text | DataKey1 | DataKey2 | ... | -+-------------------+---------------------+--------------------+--------------+------------------+ -*/ - -// WriteKeyRegistry will rewrite the existing key registry file with new one. -// It is okay to give closed key registry. Since, it's using only the datakey. -func WriteKeyRegistry(reg *KeyRegistry, opt KeyRegistryOptions) error { - buf := &bytes.Buffer{} - iv, err := y.GenerateIV() - y.Check(err) - // Encrypt sanity text if the encryption key is presents. - eSanity := sanityText - if len(opt.EncryptionKey) > 0 { - var err error - eSanity, err = y.XORBlockAllocate(eSanity, opt.EncryptionKey, iv) - if err != nil { - return y.Wrapf(err, "Error while encrpting sanity text in WriteKeyRegistry") - } - } - y.Check2(buf.Write(iv)) - y.Check2(buf.Write(eSanity)) - // Write all the datakeys to the buf. - for _, k := range reg.dataKeys { - // Writing the datakey to the given buffer. - if err := storeDataKey(buf, opt.EncryptionKey, k); err != nil { - return y.Wrapf(err, "Error while storing datakey in WriteKeyRegistry") - } - } - tmpPath := filepath.Join(opt.Dir, KeyRegistryRewriteFileName) - // Open temporary file to write the data and do atomic rename. - fp, err := y.OpenTruncFile(tmpPath, true) - if err != nil { - return y.Wrapf(err, "Error while opening tmp file in WriteKeyRegistry") - } - // Write buf to the disk. - if _, err = fp.Write(buf.Bytes()); err != nil { - // close the fd before returning error. We're not using defer - // because, for windows we need to close the fd explicitly before - // renaming. - fp.Close() - return y.Wrapf(err, "Error while writing buf in WriteKeyRegistry") - } - // In Windows the files should be closed before doing a Rename. - if err = fp.Close(); err != nil { - return y.Wrapf(err, "Error while closing tmp file in WriteKeyRegistry") - } - // Rename to the original file. - if err = os.Rename(tmpPath, filepath.Join(opt.Dir, KeyRegistryFileName)); err != nil { - return y.Wrapf(err, "Error while renaming file in WriteKeyRegistry") - } - // Sync Dir. - return syncDir(opt.Dir) -} - -// DataKey returns datakey of the given key id. -func (kr *KeyRegistry) DataKey(id uint64) (*pb.DataKey, error) { - kr.RLock() - defer kr.RUnlock() - if id == 0 { - // nil represent plain text. - return nil, nil - } - dk, ok := kr.dataKeys[id] - if !ok { - return nil, y.Wrapf(ErrInvalidDataKeyID, "Error for the KEY ID %d", id) - } - return dk, nil -} - -// LatestDataKey will give you the latest generated datakey based on the rotation -// period. If the last generated datakey lifetime exceeds the rotation period. -// It'll create new datakey. -func (kr *KeyRegistry) LatestDataKey() (*pb.DataKey, error) { - if len(kr.opt.EncryptionKey) == 0 { - // nil is for no encryption. - return nil, nil - } - // validKey return datakey if the last generated key duration less than - // rotation duration. - validKey := func() (*pb.DataKey, bool) { - // Time diffrence from the last generated time. - diff := time.Since(time.Unix(kr.lastCreated, 0)) - if diff < kr.opt.EncryptionKeyRotationDuration { - return kr.dataKeys[kr.nextKeyID], true - } - return nil, false - } - kr.RLock() - key, valid := validKey() - kr.RUnlock() - if valid { - // If less than EncryptionKeyRotationDuration, returns the last generated key. - return key, nil - } - kr.Lock() - defer kr.Unlock() - // Key might have generated by another go routine. So, - // checking once again. - key, valid = validKey() - if valid { - return key, nil - } - k := make([]byte, len(kr.opt.EncryptionKey)) - iv, err := y.GenerateIV() - if err != nil { - return nil, err - } - _, err = rand.Read(k) - if err != nil { - return nil, err - } - // Otherwise Increment the KeyID and generate new datakey. - kr.nextKeyID++ - dk := &pb.DataKey{ - KeyId: kr.nextKeyID, - Data: k, - CreatedAt: time.Now().Unix(), - Iv: iv, - } - // Don't store the datakey on file if badger is running in InMemory mode. - if !kr.opt.InMemory { - // Store the datekey. - buf := &bytes.Buffer{} - if err = storeDataKey(buf, kr.opt.EncryptionKey, dk); err != nil { - return nil, err - } - // Persist the datakey to the disk - if _, err = kr.fp.Write(buf.Bytes()); err != nil { - return nil, err - } - } - // storeDatakey encrypts the datakey So, placing un-encrypted key in the memory. - dk.Data = k - kr.lastCreated = dk.CreatedAt - kr.dataKeys[kr.nextKeyID] = dk - return dk, nil -} - -// Close closes the key registry. -func (kr *KeyRegistry) Close() error { - if !(kr.opt.ReadOnly || kr.opt.InMemory) { - return kr.fp.Close() - } - return nil -} - -// storeDataKey stores datakey in an encrypted format in the given buffer. If storage key preset. -func storeDataKey(buf *bytes.Buffer, storageKey []byte, k *pb.DataKey) error { - // xor will encrypt the IV and xor with the given data. - // It'll used for both encryption and decryption. - xor := func() error { - if len(storageKey) == 0 { - return nil - } - var err error - k.Data, err = y.XORBlockAllocate(k.Data, storageKey, k.Iv) - return err - } - // In memory datakey will be plain text so encrypting before storing to the disk. - var err error - if err = xor(); err != nil { - return y.Wrapf(err, "Error while encrypting datakey in storeDataKey") - } - var data []byte - if data, err = k.Marshal(); err != nil { - err = y.Wrapf(err, "Error while marshaling datakey in storeDataKey") - var err2 error - // decrypting the datakey back. - if err2 = xor(); err2 != nil { - return y.Wrapf(err, - y.Wrapf(err2, "Error while decrypting datakey in storeDataKey").Error()) - } - return err - } - var lenCrcBuf [8]byte - binary.BigEndian.PutUint32(lenCrcBuf[0:4], uint32(len(data))) - binary.BigEndian.PutUint32(lenCrcBuf[4:8], crc32.Checksum(data, y.CastagnoliCrcTable)) - y.Check2(buf.Write(lenCrcBuf[:])) - y.Check2(buf.Write(data)) - // Decrypting the datakey back since we're using the pointer. - return xor() -} diff --git a/vendor/github.com/dgraph-io/badger/v3/level_handler.go b/vendor/github.com/dgraph-io/badger/v3/level_handler.go deleted file mode 100644 index 669c097f4f..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/level_handler.go +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "fmt" - "sort" - "sync" - - "github.com/dgraph-io/badger/v3/table" - "github.com/dgraph-io/badger/v3/y" -) - -type levelHandler struct { - // Guards tables, totalSize. - sync.RWMutex - - // For level >= 1, tables are sorted by key ranges, which do not overlap. - // For level 0, tables are sorted by time. - // For level 0, newest table are at the back. Compact the oldest one first, which is at the front. - tables []*table.Table - totalSize int64 - totalStaleSize int64 - - // The following are initialized once and const. - level int - strLevel string - db *DB -} - -func (s *levelHandler) isLastLevel() bool { - return s.level == s.db.opt.MaxLevels-1 -} - -func (s *levelHandler) getTotalStaleSize() int64 { - s.RLock() - defer s.RUnlock() - return s.totalStaleSize -} - -func (s *levelHandler) getTotalSize() int64 { - s.RLock() - defer s.RUnlock() - return s.totalSize -} - -// initTables replaces s.tables with given tables. This is done during loading. -func (s *levelHandler) initTables(tables []*table.Table) { - s.Lock() - defer s.Unlock() - - s.tables = tables - s.totalSize = 0 - s.totalStaleSize = 0 - for _, t := range tables { - s.addSize(t) - } - - if s.level == 0 { - // Key range will overlap. Just sort by fileID in ascending order - // because newer tables are at the end of level 0. - sort.Slice(s.tables, func(i, j int) bool { - return s.tables[i].ID() < s.tables[j].ID() - }) - } else { - // Sort tables by keys. - sort.Slice(s.tables, func(i, j int) bool { - return y.CompareKeys(s.tables[i].Smallest(), s.tables[j].Smallest()) < 0 - }) - } -} - -// deleteTables remove tables idx0, ..., idx1-1. -func (s *levelHandler) deleteTables(toDel []*table.Table) error { - s.Lock() // s.Unlock() below - - toDelMap := make(map[uint64]struct{}) - for _, t := range toDel { - toDelMap[t.ID()] = struct{}{} - } - - // Make a copy as iterators might be keeping a slice of tables. - var newTables []*table.Table - for _, t := range s.tables { - _, found := toDelMap[t.ID()] - if !found { - newTables = append(newTables, t) - continue - } - s.subtractSize(t) - } - s.tables = newTables - - s.Unlock() // Unlock s _before_ we DecrRef our tables, which can be slow. - - return decrRefs(toDel) -} - -// replaceTables will replace tables[left:right] with newTables. Note this EXCLUDES tables[right]. -// You must call decr() to delete the old tables _after_ writing the update to the manifest. -func (s *levelHandler) replaceTables(toDel, toAdd []*table.Table) error { - // Need to re-search the range of tables in this level to be replaced as other goroutines might - // be changing it as well. (They can't touch our tables, but if they add/remove other tables, - // the indices get shifted around.) - s.Lock() // We s.Unlock() below. - - toDelMap := make(map[uint64]struct{}) - for _, t := range toDel { - toDelMap[t.ID()] = struct{}{} - } - var newTables []*table.Table - for _, t := range s.tables { - _, found := toDelMap[t.ID()] - if !found { - newTables = append(newTables, t) - continue - } - s.subtractSize(t) - } - - // Increase totalSize first. - for _, t := range toAdd { - s.addSize(t) - t.IncrRef() - newTables = append(newTables, t) - } - - // Assign tables. - s.tables = newTables - sort.Slice(s.tables, func(i, j int) bool { - return y.CompareKeys(s.tables[i].Smallest(), s.tables[j].Smallest()) < 0 - }) - s.Unlock() // s.Unlock before we DecrRef tables -- that can be slow. - return decrRefs(toDel) -} - -// addTable adds toAdd table to levelHandler. Normally when we add tables to levelHandler, we sort -// tables based on table.Smallest. This is required for correctness of the system. But in case of -// stream writer this can be avoided. We can just add tables to levelHandler's table list -// and after all addTable calls, we can sort table list(check sortTable method). -// NOTE: levelHandler.sortTables() should be called after call addTable calls are done. -func (s *levelHandler) addTable(t *table.Table) { - s.Lock() - defer s.Unlock() - - s.addSize(t) // Increase totalSize first. - t.IncrRef() - s.tables = append(s.tables, t) -} - -// sortTables sorts tables of levelHandler based on table.Smallest. -// Normally it should be called after all addTable calls. -func (s *levelHandler) sortTables() { - s.RLock() - defer s.RUnlock() - - sort.Slice(s.tables, func(i, j int) bool { - return y.CompareKeys(s.tables[i].Smallest(), s.tables[j].Smallest()) < 0 - }) -} - -func decrRefs(tables []*table.Table) error { - for _, table := range tables { - if err := table.DecrRef(); err != nil { - return err - } - } - return nil -} - -func newLevelHandler(db *DB, level int) *levelHandler { - return &levelHandler{ - level: level, - strLevel: fmt.Sprintf("l%d", level), - db: db, - } -} - -// tryAddLevel0Table returns true if ok and no stalling. -func (s *levelHandler) tryAddLevel0Table(t *table.Table) bool { - y.AssertTrue(s.level == 0) - // Need lock as we may be deleting the first table during a level 0 compaction. - s.Lock() - defer s.Unlock() - // Stall (by returning false) if we are above the specified stall setting for L0. - if len(s.tables) >= s.db.opt.NumLevelZeroTablesStall { - return false - } - - s.tables = append(s.tables, t) - t.IncrRef() - s.addSize(t) - - return true -} - -// This should be called while holding the lock on the level. -func (s *levelHandler) addSize(t *table.Table) { - s.totalSize += t.Size() - s.totalStaleSize += int64(t.StaleDataSize()) -} - -// This should be called while holding the lock on the level. -func (s *levelHandler) subtractSize(t *table.Table) { - s.totalSize -= t.Size() - s.totalStaleSize -= int64(t.StaleDataSize()) -} -func (s *levelHandler) numTables() int { - s.RLock() - defer s.RUnlock() - return len(s.tables) -} - -func (s *levelHandler) close() error { - s.RLock() - defer s.RUnlock() - var err error - for _, t := range s.tables { - if closeErr := t.Close(-1); closeErr != nil && err == nil { - err = closeErr - } - } - return y.Wrap(err, "levelHandler.close") -} - -// getTableForKey acquires a read-lock to access s.tables. It returns a list of tableHandlers. -func (s *levelHandler) getTableForKey(key []byte) ([]*table.Table, func() error) { - s.RLock() - defer s.RUnlock() - - if s.level == 0 { - // For level 0, we need to check every table. Remember to make a copy as s.tables may change - // once we exit this function, and we don't want to lock s.tables while seeking in tables. - // CAUTION: Reverse the tables. - out := make([]*table.Table, 0, len(s.tables)) - for i := len(s.tables) - 1; i >= 0; i-- { - out = append(out, s.tables[i]) - s.tables[i].IncrRef() - } - return out, func() error { - for _, t := range out { - if err := t.DecrRef(); err != nil { - return err - } - } - return nil - } - } - // For level >= 1, we can do a binary search as key range does not overlap. - idx := sort.Search(len(s.tables), func(i int) bool { - return y.CompareKeys(s.tables[i].Biggest(), key) >= 0 - }) - if idx >= len(s.tables) { - // Given key is strictly > than every element we have. - return nil, func() error { return nil } - } - tbl := s.tables[idx] - tbl.IncrRef() - return []*table.Table{tbl}, tbl.DecrRef -} - -// get returns value for a given key or the key after that. If not found, return nil. -func (s *levelHandler) get(key []byte) (y.ValueStruct, error) { - tables, decr := s.getTableForKey(key) - keyNoTs := y.ParseKey(key) - - hash := y.Hash(keyNoTs) - var maxVs y.ValueStruct - for _, th := range tables { - if th.DoesNotHave(hash) { - y.NumLSMBloomHitsAdd(s.db.opt.MetricsEnabled, s.strLevel, 1) - continue - } - - it := th.NewIterator(0) - defer it.Close() - - y.NumLSMGetsAdd(s.db.opt.MetricsEnabled, s.strLevel, 1) - it.Seek(key) - if !it.Valid() { - continue - } - if y.SameKey(key, it.Key()) { - if version := y.ParseTs(it.Key()); maxVs.Version < version { - maxVs = it.ValueCopy() - maxVs.Version = version - } - } - } - return maxVs, decr() -} - -// appendIterators appends iterators to an array of iterators, for merging. -// Note: This obtains references for the table handlers. Remember to close these iterators. -func (s *levelHandler) appendIterators(iters []y.Iterator, opt *IteratorOptions) []y.Iterator { - s.RLock() - defer s.RUnlock() - - var topt int - if opt.Reverse { - topt = table.REVERSED - } - if s.level == 0 { - // Remember to add in reverse order! - // The newer table at the end of s.tables should be added first as it takes precedence. - // Level 0 tables are not in key sorted order, so we need to consider them one by one. - var out []*table.Table - for _, t := range s.tables { - if opt.pickTable(t) { - out = append(out, t) - } - } - return appendIteratorsReversed(iters, out, topt) - } - - tables := opt.pickTables(s.tables) - if len(tables) == 0 { - return iters - } - return append(iters, table.NewConcatIterator(tables, topt)) -} - -type levelHandlerRLocked struct{} - -// overlappingTables returns the tables that intersect with key range. Returns a half-interval. -// This function should already have acquired a read lock, and this is so important the caller must -// pass an empty parameter declaring such. -func (s *levelHandler) overlappingTables(_ levelHandlerRLocked, kr keyRange) (int, int) { - if len(kr.left) == 0 || len(kr.right) == 0 { - return 0, 0 - } - left := sort.Search(len(s.tables), func(i int) bool { - return y.CompareKeys(kr.left, s.tables[i].Biggest()) <= 0 - }) - right := sort.Search(len(s.tables), func(i int) bool { - return y.CompareKeys(kr.right, s.tables[i].Smallest()) < 0 - }) - return left, right -} diff --git a/vendor/github.com/dgraph-io/badger/v3/levels.go b/vendor/github.com/dgraph-io/badger/v3/levels.go deleted file mode 100644 index 1c625d1b34..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/levels.go +++ /dev/null @@ -1,1761 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "bytes" - "context" - "encoding/hex" - "fmt" - "math" - "math/rand" - "os" - "sort" - "strings" - "sync" - "sync/atomic" - "time" - - otrace "go.opencensus.io/trace" - - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/table" - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" - "github.com/pkg/errors" -) - -type levelsController struct { - nextFileID uint64 // Atomic - l0stallsMs int64 // Atomic - - // The following are initialized once and const. - levels []*levelHandler - kv *DB - - cstatus compactStatus -} - -// revertToManifest checks that all necessary table files exist and removes all table files not -// referenced by the manifest. idMap is a set of table file id's that were read from the directory -// listing. -func revertToManifest(kv *DB, mf *Manifest, idMap map[uint64]struct{}) error { - // 1. Check all files in manifest exist. - for id := range mf.Tables { - if _, ok := idMap[id]; !ok { - return fmt.Errorf("file does not exist for table %d", id) - } - } - - // 2. Delete files that shouldn't exist. - for id := range idMap { - if _, ok := mf.Tables[id]; !ok { - kv.opt.Debugf("Table file %d not referenced in MANIFEST\n", id) - filename := table.NewFilename(id, kv.opt.Dir) - if err := os.Remove(filename); err != nil { - return y.Wrapf(err, "While removing table %d", id) - } - } - } - - return nil -} - -func newLevelsController(db *DB, mf *Manifest) (*levelsController, error) { - y.AssertTrue(db.opt.NumLevelZeroTablesStall > db.opt.NumLevelZeroTables) - s := &levelsController{ - kv: db, - levels: make([]*levelHandler, db.opt.MaxLevels), - } - s.cstatus.tables = make(map[uint64]struct{}) - s.cstatus.levels = make([]*levelCompactStatus, db.opt.MaxLevels) - - for i := 0; i < db.opt.MaxLevels; i++ { - s.levels[i] = newLevelHandler(db, i) - s.cstatus.levels[i] = new(levelCompactStatus) - } - - if db.opt.InMemory { - return s, nil - } - // Compare manifest against directory, check for existent/non-existent files, and remove. - if err := revertToManifest(db, mf, getIDMap(db.opt.Dir)); err != nil { - return nil, err - } - - var mu sync.Mutex - tables := make([][]*table.Table, db.opt.MaxLevels) - var maxFileID uint64 - - // We found that using 3 goroutines allows disk throughput to be utilized to its max. - // Disk utilization is the main thing we should focus on, while trying to read the data. That's - // the one factor that remains constant between HDD and SSD. - throttle := y.NewThrottle(3) - - start := time.Now() - var numOpened int32 - tick := time.NewTicker(3 * time.Second) - defer tick.Stop() - - for fileID, tf := range mf.Tables { - fname := table.NewFilename(fileID, db.opt.Dir) - select { - case <-tick.C: - db.opt.Infof("%d tables out of %d opened in %s\n", atomic.LoadInt32(&numOpened), - len(mf.Tables), time.Since(start).Round(time.Millisecond)) - default: - } - if err := throttle.Do(); err != nil { - closeAllTables(tables) - return nil, err - } - if fileID > maxFileID { - maxFileID = fileID - } - go func(fname string, tf TableManifest) { - var rerr error - defer func() { - throttle.Done(rerr) - atomic.AddInt32(&numOpened, 1) - }() - dk, err := db.registry.DataKey(tf.KeyID) - if err != nil { - rerr = y.Wrapf(err, "Error while reading datakey") - return - } - topt := buildTableOptions(db) - // Explicitly set Compression and DataKey based on how the table was generated. - topt.Compression = tf.Compression - topt.DataKey = dk - - mf, err := z.OpenMmapFile(fname, db.opt.getFileFlags(), 0) - if err != nil { - rerr = y.Wrapf(err, "Opening file: %q", fname) - return - } - t, err := table.OpenTable(mf, topt) - if err != nil { - if strings.HasPrefix(err.Error(), "CHECKSUM_MISMATCH:") { - db.opt.Errorf(err.Error()) - db.opt.Errorf("Ignoring table %s", mf.Fd.Name()) - // Do not set rerr. We will continue without this table. - } else { - rerr = y.Wrapf(err, "Opening table: %q", fname) - } - return - } - - mu.Lock() - tables[tf.Level] = append(tables[tf.Level], t) - mu.Unlock() - }(fname, tf) - } - if err := throttle.Finish(); err != nil { - closeAllTables(tables) - return nil, err - } - db.opt.Infof("All %d tables opened in %s\n", atomic.LoadInt32(&numOpened), - time.Since(start).Round(time.Millisecond)) - s.nextFileID = maxFileID + 1 - for i, tbls := range tables { - s.levels[i].initTables(tbls) - } - - // Make sure key ranges do not overlap etc. - if err := s.validate(); err != nil { - _ = s.cleanupLevels() - return nil, y.Wrap(err, "Level validation") - } - - // Sync directory (because we have at least removed some files, or previously created the - // manifest file). - if err := syncDir(db.opt.Dir); err != nil { - _ = s.close() - return nil, err - } - - return s, nil -} - -// Closes the tables, for cleanup in newLevelsController. (We Close() instead of using DecrRef() -// because that would delete the underlying files.) We ignore errors, which is OK because tables -// are read-only. -func closeAllTables(tables [][]*table.Table) { - for _, tableSlice := range tables { - for _, table := range tableSlice { - _ = table.Close(-1) - } - } -} - -func (s *levelsController) cleanupLevels() error { - var firstErr error - for _, l := range s.levels { - if err := l.close(); err != nil && firstErr == nil { - firstErr = err - } - } - return firstErr -} - -// dropTree picks all tables from all levels, creates a manifest changeset, -// applies it, and then decrements the refs of these tables, which would result -// in their deletion. -func (s *levelsController) dropTree() (int, error) { - // First pick all tables, so we can create a manifest changelog. - var all []*table.Table - for _, l := range s.levels { - l.RLock() - all = append(all, l.tables...) - l.RUnlock() - } - if len(all) == 0 { - return 0, nil - } - - // Generate the manifest changes. - changes := []*pb.ManifestChange{} - for _, table := range all { - // Add a delete change only if the table is not in memory. - if !table.IsInmemory { - changes = append(changes, newDeleteChange(table.ID())) - } - } - changeSet := pb.ManifestChangeSet{Changes: changes} - if err := s.kv.manifest.addChanges(changeSet.Changes); err != nil { - return 0, err - } - - // Now that manifest has been successfully written, we can delete the tables. - for _, l := range s.levels { - l.Lock() - l.totalSize = 0 - l.tables = l.tables[:0] - l.Unlock() - } - for _, table := range all { - if err := table.DecrRef(); err != nil { - return 0, err - } - } - return len(all), nil -} - -// dropPrefix runs a L0->L1 compaction, and then runs same level compaction on the rest of the -// levels. For L0->L1 compaction, it runs compactions normally, but skips over -// all the keys with the provided prefix. -// For Li->Li compactions, it picks up the tables which would have the prefix. The -// tables who only have keys with this prefix are quickly dropped. The ones which have other keys -// are run through MergeIterator and compacted to create new tables. All the mechanisms of -// compactions apply, i.e. level sizes and MANIFEST are updated as in the normal flow. -func (s *levelsController) dropPrefixes(prefixes [][]byte) error { - opt := s.kv.opt - // Iterate levels in the reverse order because if we were to iterate from - // lower level (say level 0) to a higher level (say level 3) we could have - // a state in which level 0 is compacted and an older version of a key exists in lower level. - // At this point, if someone creates an iterator, they would see an old - // value for a key from lower levels. Iterating in reverse order ensures we - // drop the oldest data first so that lookups never return stale data. - for i := len(s.levels) - 1; i >= 0; i-- { - l := s.levels[i] - - l.RLock() - if l.level == 0 { - size := len(l.tables) - l.RUnlock() - - if size > 0 { - cp := compactionPriority{ - level: 0, - score: 1.74, - // A unique number greater than 1.0 does two things. Helps identify this - // function in logs, and forces a compaction. - dropPrefixes: prefixes, - } - if err := s.doCompact(174, cp); err != nil { - opt.Warningf("While compacting level 0: %v", err) - return nil - } - } - continue - } - - // Build a list of compaction tableGroups affecting all the prefixes we - // need to drop. We need to build tableGroups that satisfy the invariant that - // bottom tables are consecutive. - // tableGroup contains groups of consecutive tables. - var tableGroups [][]*table.Table - var tableGroup []*table.Table - - finishGroup := func() { - if len(tableGroup) > 0 { - tableGroups = append(tableGroups, tableGroup) - tableGroup = nil - } - } - - for _, table := range l.tables { - if containsAnyPrefixes(table, prefixes) { - tableGroup = append(tableGroup, table) - } else { - finishGroup() - } - } - finishGroup() - - l.RUnlock() - - if len(tableGroups) == 0 { - continue - } - _, span := otrace.StartSpan(context.Background(), "Badger.Compaction") - span.Annotatef(nil, "Compaction level: %v", l.level) - span.Annotatef(nil, "Drop Prefixes: %v", prefixes) - defer span.End() - opt.Infof("Dropping prefix at level %d (%d tableGroups)", l.level, len(tableGroups)) - for _, operation := range tableGroups { - cd := compactDef{ - span: span, - thisLevel: l, - nextLevel: l, - top: nil, - bot: operation, - dropPrefixes: prefixes, - t: s.levelTargets(), - } - cd.t.baseLevel = l.level - if err := s.runCompactDef(-1, l.level, cd); err != nil { - opt.Warningf("While running compact def: %+v. Error: %v", cd, err) - return err - } - } - } - return nil -} - -func (s *levelsController) startCompact(lc *z.Closer) { - n := s.kv.opt.NumCompactors - lc.AddRunning(n - 1) - for i := 0; i < n; i++ { - go s.runCompactor(i, lc) - } -} - -type targets struct { - baseLevel int - targetSz []int64 - fileSz []int64 -} - -// levelTargets calculates the targets for levels in the LSM tree. The idea comes from Dynamic Level -// Sizes ( https://rocksdb.org/blog/2015/07/23/dynamic-level.html ) in RocksDB. The sizes of levels -// are calculated based on the size of the lowest level, typically L6. So, if L6 size is 1GB, then -// L5 target size is 100MB, L4 target size is 10MB and so on. -// -// L0 files don't automatically go to L1. Instead, they get compacted to Lbase, where Lbase is -// chosen based on the first level which is non-empty from top (check L1 through L6). For an empty -// DB, that would be L6. So, L0 compactions go to L6, then L5, L4 and so on. -// -// Lbase is advanced to the upper levels when its target size exceeds BaseLevelSize. For -// example, when L6 reaches 1.1GB, then L4 target sizes becomes 11MB, thus exceeding the -// BaseLevelSize of 10MB. L3 would then become the new Lbase, with a target size of 1MB < -// BaseLevelSize. -func (s *levelsController) levelTargets() targets { - adjust := func(sz int64) int64 { - if sz < s.kv.opt.BaseLevelSize { - return s.kv.opt.BaseLevelSize - } - return sz - } - - t := targets{ - targetSz: make([]int64, len(s.levels)), - fileSz: make([]int64, len(s.levels)), - } - // DB size is the size of the last level. - dbSize := s.lastLevel().getTotalSize() - for i := len(s.levels) - 1; i > 0; i-- { - ltarget := adjust(dbSize) - t.targetSz[i] = ltarget - if t.baseLevel == 0 && ltarget <= s.kv.opt.BaseLevelSize { - t.baseLevel = i - } - dbSize /= int64(s.kv.opt.LevelSizeMultiplier) - } - - tsz := s.kv.opt.BaseTableSize - for i := 0; i < len(s.levels); i++ { - if i == 0 { - // Use MemTableSize for Level 0. Because at Level 0, we stop compactions based on the - // number of tables, not the size of the level. So, having a 1:1 size ratio between - // memtable size and the size of L0 files is better than churning out 32 files per - // memtable (assuming 64MB MemTableSize and 2MB BaseTableSize). - t.fileSz[i] = s.kv.opt.MemTableSize - } else if i <= t.baseLevel { - t.fileSz[i] = tsz - } else { - tsz *= int64(s.kv.opt.TableSizeMultiplier) - t.fileSz[i] = tsz - } - } - - // Bring the base level down to the last empty level. - for i := t.baseLevel + 1; i < len(s.levels)-1; i++ { - if s.levels[i].getTotalSize() > 0 { - break - } - t.baseLevel = i - } - - // If the base level is empty and the next level size is less than the - // target size, pick the next level as the base level. - b := t.baseLevel - lvl := s.levels - if b < len(lvl)-1 && lvl[b].getTotalSize() == 0 && lvl[b+1].getTotalSize() < t.targetSz[b+1] { - t.baseLevel++ - } - return t -} - -func (s *levelsController) runCompactor(id int, lc *z.Closer) { - defer lc.Done() - - randomDelay := time.NewTimer(time.Duration(rand.Int31n(1000)) * time.Millisecond) - select { - case <-randomDelay.C: - case <-lc.HasBeenClosed(): - randomDelay.Stop() - return - } - - moveL0toFront := func(prios []compactionPriority) []compactionPriority { - idx := -1 - for i, p := range prios { - if p.level == 0 { - idx = i - break - } - } - // If idx == -1, we didn't find L0. - // If idx == 0, then we don't need to do anything. L0 is already at the front. - if idx > 0 { - out := append([]compactionPriority{}, prios[idx]) - out = append(out, prios[:idx]...) - out = append(out, prios[idx+1:]...) - return out - } - return prios - } - - run := func(p compactionPriority) bool { - err := s.doCompact(id, p) - switch err { - case nil: - return true - case errFillTables: - // pass - default: - s.kv.opt.Warningf("While running doCompact: %v\n", err) - } - return false - } - runOnce := func() bool { - prios := s.pickCompactLevels() - if id == 0 { - // Worker ID zero prefers to compact L0 always. - prios = moveL0toFront(prios) - } - for _, p := range prios { - if id == 0 && p.level == 0 { - // Allow worker zero to run level 0, irrespective of its adjusted score. - } else if p.adjusted < 1.0 { - break - } - if run(p) { - return true - } - } - - return false - } - - tryLmaxToLmaxCompaction := func() { - p := compactionPriority{ - level: s.lastLevel().level, - t: s.levelTargets(), - } - run(p) - - } - count := 0 - ticker := time.NewTicker(50 * time.Millisecond) - defer ticker.Stop() - for { - select { - // Can add a done channel or other stuff. - case <-ticker.C: - count++ - // Each ticker is 50ms so 50*200=10seconds. - if s.kv.opt.LmaxCompaction && id == 2 && count >= 200 { - tryLmaxToLmaxCompaction() - count = 0 - } else { - runOnce() - } - case <-lc.HasBeenClosed(): - return - } - } -} - -type compactionPriority struct { - level int - score float64 - adjusted float64 - dropPrefixes [][]byte - t targets -} - -func (s *levelsController) lastLevel() *levelHandler { - return s.levels[len(s.levels)-1] -} - -// pickCompactLevel determines which level to compact. -// Based on: https://github.com/facebook/rocksdb/wiki/Leveled-Compaction -func (s *levelsController) pickCompactLevels() (prios []compactionPriority) { - t := s.levelTargets() - addPriority := func(level int, score float64) { - pri := compactionPriority{ - level: level, - score: score, - adjusted: score, - t: t, - } - prios = append(prios, pri) - } - - // Add L0 priority based on the number of tables. - addPriority(0, float64(s.levels[0].numTables())/float64(s.kv.opt.NumLevelZeroTables)) - - // All other levels use size to calculate priority. - for i := 1; i < len(s.levels); i++ { - // Don't consider those tables that are already being compacted right now. - delSize := s.cstatus.delSize(i) - - l := s.levels[i] - sz := l.getTotalSize() - delSize - addPriority(i, float64(sz)/float64(t.targetSz[i])) - } - y.AssertTrue(len(prios) == len(s.levels)) - - // The following code is borrowed from PebbleDB and results in healthier LSM tree structure. - // If Li-1 has score > 1.0, then we'll divide Li-1 score by Li. If Li score is >= 1.0, then Li-1 - // score is reduced, which means we'll prioritize the compaction of lower levels (L5, L4 and so - // on) over the higher levels (L0, L1 and so on). On the other hand, if Li score is < 1.0, then - // we'll increase the priority of Li-1. - // Overall what this means is, if the bottom level is already overflowing, then de-prioritize - // compaction of the above level. If the bottom level is not full, then increase the priority of - // above level. - var prevLevel int - for level := t.baseLevel; level < len(s.levels); level++ { - if prios[prevLevel].adjusted >= 1 { - // Avoid absurdly large scores by placing a floor on the score that we'll - // adjust a level by. The value of 0.01 was chosen somewhat arbitrarily - const minScore = 0.01 - if prios[level].score >= minScore { - prios[prevLevel].adjusted /= prios[level].adjusted - } else { - prios[prevLevel].adjusted /= minScore - } - } - prevLevel = level - } - - // Pick all the levels whose original score is >= 1.0, irrespective of their adjusted score. - // We'll still sort them by their adjusted score below. Having both these scores allows us to - // make better decisions about compacting L0. If we see a score >= 1.0, we can do L0->L0 - // compactions. If the adjusted score >= 1.0, then we can do L0->Lbase compactions. - out := prios[:0] - for _, p := range prios[:len(prios)-1] { - if p.score >= 1.0 { - out = append(out, p) - } - } - prios = out - - // Sort by the adjusted score. - sort.Slice(prios, func(i, j int) bool { - return prios[i].adjusted > prios[j].adjusted - }) - return prios -} - -// checkOverlap checks if the given tables overlap with any level from the given "lev" onwards. -func (s *levelsController) checkOverlap(tables []*table.Table, lev int) bool { - kr := getKeyRange(tables...) - for i, lh := range s.levels { - if i < lev { // Skip upper levels. - continue - } - lh.RLock() - left, right := lh.overlappingTables(levelHandlerRLocked{}, kr) - lh.RUnlock() - if right-left > 0 { - return true - } - } - return false -} - -// subcompact runs a single sub-compaction, iterating over the specified key-range only. -// -// We use splits to do a single compaction concurrently. If we have >= 3 tables -// involved in the bottom level during compaction, we choose key ranges to -// split the main compaction up into sub-compactions. Each sub-compaction runs -// concurrently, only iterating over the provided key range, generating tables. -// This speeds up the compaction significantly. -func (s *levelsController) subcompact(it y.Iterator, kr keyRange, cd compactDef, - inflightBuilders *y.Throttle, res chan<- *table.Table) { - - // Check overlap of the top level with the levels which are not being - // compacted in this compaction. - hasOverlap := s.checkOverlap(cd.allTables(), cd.nextLevel.level+1) - - // Pick a discard ts, so we can discard versions below this ts. We should - // never discard any versions starting from above this timestamp, because - // that would affect the snapshot view guarantee provided by transactions. - discardTs := s.kv.orc.discardAtOrBelow() - - // Try to collect stats so that we can inform value log about GC. That would help us find which - // value log file should be GCed. - discardStats := make(map[uint32]int64) - updateStats := func(vs y.ValueStruct) { - // We don't need to store/update discard stats when badger is running in Disk-less mode. - if s.kv.opt.InMemory { - return - } - if vs.Meta&bitValuePointer > 0 { - var vp valuePointer - vp.Decode(vs.Value) - discardStats[vp.Fid] += int64(vp.Len) - } - } - - // exceedsAllowedOverlap returns true if the given key range would overlap with more than 10 - // tables from level below nextLevel (nextLevel+1). This helps avoid generating tables at Li - // with huge overlaps with Li+1. - exceedsAllowedOverlap := func(kr keyRange) bool { - n2n := cd.nextLevel.level + 1 - if n2n <= 1 || n2n >= len(s.levels) { - return false - } - n2nl := s.levels[n2n] - n2nl.RLock() - defer n2nl.RUnlock() - - l, r := n2nl.overlappingTables(levelHandlerRLocked{}, kr) - return r-l >= 10 - } - - var ( - lastKey, skipKey []byte - numBuilds, numVersions int - // Denotes if the first key is a series of duplicate keys had - // "DiscardEarlierVersions" set - firstKeyHasDiscardSet bool - ) - - addKeys := func(builder *table.Builder) { - timeStart := time.Now() - var numKeys, numSkips uint64 - var rangeCheck int - var tableKr keyRange - for ; it.Valid(); it.Next() { - // See if we need to skip the prefix. - if len(cd.dropPrefixes) > 0 && hasAnyPrefixes(it.Key(), cd.dropPrefixes) { - numSkips++ - updateStats(it.Value()) - continue - } - - // See if we need to skip this key. - if len(skipKey) > 0 { - if y.SameKey(it.Key(), skipKey) { - numSkips++ - updateStats(it.Value()) - continue - } else { - skipKey = skipKey[:0] - } - } - - if !y.SameKey(it.Key(), lastKey) { - firstKeyHasDiscardSet = false - if len(kr.right) > 0 && y.CompareKeys(it.Key(), kr.right) >= 0 { - break - } - if builder.ReachedCapacity() { - // Only break if we are on a different key, and have reached capacity. We want - // to ensure that all versions of the key are stored in the same sstable, and - // not divided across multiple tables at the same level. - break - } - lastKey = y.SafeCopy(lastKey, it.Key()) - numVersions = 0 - firstKeyHasDiscardSet = it.Value().Meta&bitDiscardEarlierVersions > 0 - - if len(tableKr.left) == 0 { - tableKr.left = y.SafeCopy(tableKr.left, it.Key()) - } - tableKr.right = lastKey - - rangeCheck++ - if rangeCheck%5000 == 0 { - // This table's range exceeds the allowed range overlap with the level after - // next. So, we stop writing to this table. If we don't do this, then we end up - // doing very expensive compactions involving too many tables. To amortize the - // cost of this check, we do it only every N keys. - if exceedsAllowedOverlap(tableKr) { - // s.kv.opt.Debugf("L%d -> L%d Breaking due to exceedsAllowedOverlap with - // kr: %s\n", cd.thisLevel.level, cd.nextLevel.level, tableKr) - break - } - } - } - - vs := it.Value() - version := y.ParseTs(it.Key()) - - isExpired := isDeletedOrExpired(vs.Meta, vs.ExpiresAt) - - // Do not discard entries inserted by merge operator. These entries will be - // discarded once they're merged - if version <= discardTs && vs.Meta&bitMergeEntry == 0 { - // Keep track of the number of versions encountered for this key. Only consider the - // versions which are below the minReadTs, otherwise, we might end up discarding the - // only valid version for a running transaction. - numVersions++ - // Keep the current version and discard all the next versions if - // - The `discardEarlierVersions` bit is set OR - // - We've already processed `NumVersionsToKeep` number of versions - // (including the current item being processed) - lastValidVersion := vs.Meta&bitDiscardEarlierVersions > 0 || - numVersions == s.kv.opt.NumVersionsToKeep - - if isExpired || lastValidVersion { - // If this version of the key is deleted or expired, skip all the rest of the - // versions. Ensure that we're only removing versions below readTs. - skipKey = y.SafeCopy(skipKey, it.Key()) - - switch { - // Add the key to the table only if it has not expired. - // We don't want to add the deleted/expired keys. - case !isExpired && lastValidVersion: - // Add this key. We have set skipKey, so the following key versions - // would be skipped. - case hasOverlap: - // If this key range has overlap with lower levels, then keep the deletion - // marker with the latest version, discarding the rest. We have set skipKey, - // so the following key versions would be skipped. - default: - // If no overlap, we can skip all the versions, by continuing here. - numSkips++ - updateStats(vs) - continue // Skip adding this key. - } - } - } - numKeys++ - var vp valuePointer - if vs.Meta&bitValuePointer > 0 { - vp.Decode(vs.Value) - } - switch { - case firstKeyHasDiscardSet: - // This key is same as the last key which had "DiscardEarlierVersions" set. The - // the next compactions will drop this key if its ts > - // discardTs (of the next compaction). - builder.AddStaleKey(it.Key(), vs, vp.Len) - case isExpired: - // If the key is expired, the next compaction will drop it if - // its ts > discardTs (of the next compaction). - builder.AddStaleKey(it.Key(), vs, vp.Len) - default: - builder.Add(it.Key(), vs, vp.Len) - } - } - s.kv.opt.Debugf("[%d] LOG Compact. Added %d keys. Skipped %d keys. Iteration took: %v", - cd.compactorId, numKeys, numSkips, time.Since(timeStart).Round(time.Millisecond)) - } // End of function: addKeys - - if len(kr.left) > 0 { - it.Seek(kr.left) - } else { - it.Rewind() - } - for it.Valid() { - if len(kr.right) > 0 && y.CompareKeys(it.Key(), kr.right) >= 0 { - break - } - - bopts := buildTableOptions(s.kv) - // Set TableSize to the target file size for that level. - bopts.TableSize = uint64(cd.t.fileSz[cd.nextLevel.level]) - builder := table.NewTableBuilder(bopts) - - // This would do the iteration and add keys to builder. - addKeys(builder) - - // It was true that it.Valid() at least once in the loop above, which means we - // called Add() at least once, and builder is not Empty(). - if builder.Empty() { - // Cleanup builder resources: - builder.Finish() - builder.Close() - continue - } - numBuilds++ - if err := inflightBuilders.Do(); err != nil { - // Can't return from here, until I decrRef all the tables that I built so far. - break - } - go func(builder *table.Builder, fileID uint64) { - var err error - defer inflightBuilders.Done(err) - defer builder.Close() - - var tbl *table.Table - if s.kv.opt.InMemory { - tbl, err = table.OpenInMemoryTable(builder.Finish(), fileID, &bopts) - } else { - fname := table.NewFilename(fileID, s.kv.opt.Dir) - tbl, err = table.CreateTable(fname, builder) - } - - // If we couldn't build the table, return fast. - if err != nil { - return - } - res <- tbl - }(builder, s.reserveFileID()) - } - s.kv.vlog.updateDiscardStats(discardStats) - s.kv.opt.Debugf("Discard stats: %v", discardStats) -} - -// compactBuildTables merges topTables and botTables to form a list of new tables. -func (s *levelsController) compactBuildTables( - lev int, cd compactDef) ([]*table.Table, func() error, error) { - - topTables := cd.top - botTables := cd.bot - - numTables := int64(len(topTables) + len(botTables)) - y.NumCompactionTablesAdd(s.kv.opt.MetricsEnabled, numTables) - defer y.NumCompactionTablesAdd(s.kv.opt.MetricsEnabled, -numTables) - - cd.span.Annotatef(nil, "Top tables count: %v Bottom tables count: %v", - len(topTables), len(botTables)) - - keepTable := func(t *table.Table) bool { - for _, prefix := range cd.dropPrefixes { - if bytes.HasPrefix(t.Smallest(), prefix) && - bytes.HasPrefix(t.Biggest(), prefix) { - // All the keys in this table have the dropPrefix. So, this - // table does not need to be in the iterator and can be - // dropped immediately. - return false - } - } - return true - } - var valid []*table.Table - for _, table := range botTables { - if keepTable(table) { - valid = append(valid, table) - } - } - - newIterator := func() []y.Iterator { - // Create iterators across all the tables involved first. - var iters []y.Iterator - switch { - case lev == 0: - iters = appendIteratorsReversed(iters, topTables, table.NOCACHE) - case len(topTables) > 0: - y.AssertTrue(len(topTables) == 1) - iters = []y.Iterator{topTables[0].NewIterator(table.NOCACHE)} - } - // Next level has level>=1 and we can use ConcatIterator as key ranges do not overlap. - return append(iters, table.NewConcatIterator(valid, table.NOCACHE)) - } - - res := make(chan *table.Table, 3) - inflightBuilders := y.NewThrottle(8 + len(cd.splits)) - for _, kr := range cd.splits { - // Initiate Do here so we can register the goroutines for buildTables too. - if err := inflightBuilders.Do(); err != nil { - s.kv.opt.Errorf("cannot start subcompaction: %+v", err) - return nil, nil, err - } - go func(kr keyRange) { - defer inflightBuilders.Done(nil) - it := table.NewMergeIterator(newIterator(), false) - defer it.Close() - s.subcompact(it, kr, cd, inflightBuilders, res) - }(kr) - } - - var newTables []*table.Table - var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() - for t := range res { - newTables = append(newTables, t) - } - }() - - // Wait for all table builders to finish and also for newTables accumulator to finish. - err := inflightBuilders.Finish() - close(res) - wg.Wait() // Wait for all tables to be picked up. - - if err == nil { - // Ensure created files' directory entries are visible. We don't mind the extra latency - // from not doing this ASAP after all file creation has finished because this is a - // background operation. - err = s.kv.syncDir(s.kv.opt.Dir) - } - - if err != nil { - // An error happened. Delete all the newly created table files (by calling DecrRef - // -- we're the only holders of a ref). - _ = decrRefs(newTables) - return nil, nil, y.Wrapf(err, "while running compactions for: %+v", cd) - } - - sort.Slice(newTables, func(i, j int) bool { - return y.CompareKeys(newTables[i].Biggest(), newTables[j].Biggest()) < 0 - }) - return newTables, func() error { return decrRefs(newTables) }, nil -} - -func buildChangeSet(cd *compactDef, newTables []*table.Table) pb.ManifestChangeSet { - changes := []*pb.ManifestChange{} - for _, table := range newTables { - changes = append(changes, - newCreateChange(table.ID(), cd.nextLevel.level, table.KeyID(), table.CompressionType())) - } - for _, table := range cd.top { - // Add a delete change only if the table is not in memory. - if !table.IsInmemory { - changes = append(changes, newDeleteChange(table.ID())) - } - } - for _, table := range cd.bot { - changes = append(changes, newDeleteChange(table.ID())) - } - return pb.ManifestChangeSet{Changes: changes} -} - -func hasAnyPrefixes(s []byte, listOfPrefixes [][]byte) bool { - for _, prefix := range listOfPrefixes { - if bytes.HasPrefix(s, prefix) { - return true - } - } - - return false -} - -func containsPrefix(table *table.Table, prefix []byte) bool { - smallValue := table.Smallest() - largeValue := table.Biggest() - if bytes.HasPrefix(smallValue, prefix) { - return true - } - if bytes.HasPrefix(largeValue, prefix) { - return true - } - isPresent := func() bool { - ti := table.NewIterator(0) - defer ti.Close() - // In table iterator's Seek, we assume that key has version in last 8 bytes. We set - // version=0 (ts=math.MaxUint64), so that we don't skip the key prefixed with prefix. - ti.Seek(y.KeyWithTs(prefix, math.MaxUint64)) - if bytes.HasPrefix(ti.Key(), prefix) { - return true - } - return false - } - - if bytes.Compare(prefix, smallValue) > 0 && - bytes.Compare(prefix, largeValue) < 0 { - // There may be a case when table contains [0x0000,...., 0xffff]. If we are searching for - // k=0x0011, we should not directly infer that k is present. It may not be present. - if !isPresent() { - return false - } - return true - } - - return false -} - -func containsAnyPrefixes(table *table.Table, listOfPrefixes [][]byte) bool { - for _, prefix := range listOfPrefixes { - if containsPrefix(table, prefix) { - return true - } - } - - return false -} - -type compactDef struct { - span *otrace.Span - - compactorId int - t targets - p compactionPriority - thisLevel *levelHandler - nextLevel *levelHandler - - top []*table.Table - bot []*table.Table - - thisRange keyRange - nextRange keyRange - splits []keyRange - - thisSize int64 - - dropPrefixes [][]byte -} - -// addSplits can allow us to run multiple sub-compactions in parallel across the split key ranges. -func (s *levelsController) addSplits(cd *compactDef) { - cd.splits = cd.splits[:0] - - // Let's say we have 10 tables in cd.bot and min width = 3. Then, we'll pick - // 0, 1, 2 (pick), 3, 4, 5 (pick), 6, 7, 8 (pick), 9 (pick, because last table). - // This gives us 4 picks for 10 tables. - // In an edge case, 142 tables in bottom led to 48 splits. That's too many splits, because it - // then uses up a lot of memory for table builder. - // We should keep it so we have at max 5 splits. - width := int(math.Ceil(float64(len(cd.bot)) / 5.0)) - if width < 3 { - width = 3 - } - skr := cd.thisRange - skr.extend(cd.nextRange) - - addRange := func(right []byte) { - skr.right = y.Copy(right) - cd.splits = append(cd.splits, skr) - - skr.left = skr.right - } - - for i, t := range cd.bot { - // last entry in bottom table. - if i == len(cd.bot)-1 { - addRange([]byte{}) - return - } - if i%width == width-1 { - // Right should always have ts=maxUint64 otherwise we'll lose keys - // in subcompaction. Consider the following. - // Top table is [A1...C3(deleted)] - // bot table is [B1....C2] - // This will generate splits like [A1 ... C2] . Notice that we - // dropped the C3 which is the last key of the top table. - // See TestCompaction/with_split test. - right := y.KeyWithTs(y.ParseKey(t.Biggest()), math.MaxUint64) - addRange(right) - } - } -} - -func (cd *compactDef) lockLevels() { - cd.thisLevel.RLock() - cd.nextLevel.RLock() -} - -func (cd *compactDef) unlockLevels() { - cd.nextLevel.RUnlock() - cd.thisLevel.RUnlock() -} - -func (cd *compactDef) allTables() []*table.Table { - ret := make([]*table.Table, 0, len(cd.top)+len(cd.bot)) - ret = append(ret, cd.top...) - ret = append(ret, cd.bot...) - return ret -} - -func (s *levelsController) fillTablesL0ToL0(cd *compactDef) bool { - if cd.compactorId != 0 { - // Only compactor zero can work on this. - return false - } - - cd.nextLevel = s.levels[0] - cd.nextRange = keyRange{} - cd.bot = nil - - // Because this level and next level are both level 0, we should NOT acquire - // the read lock twice, because it can result in a deadlock. So, we don't - // call compactDef.lockLevels, instead locking the level only once and - // directly here. - // - // As per godocs on RWMutex: - // If a goroutine holds a RWMutex for reading and another goroutine might - // call Lock, no goroutine should expect to be able to acquire a read lock - // until the initial read lock is released. In particular, this prohibits - // recursive read locking. This is to ensure that the lock eventually - // becomes available; a blocked Lock call excludes new readers from - // acquiring the lock. - y.AssertTrue(cd.thisLevel.level == 0) - y.AssertTrue(cd.nextLevel.level == 0) - s.levels[0].RLock() - defer s.levels[0].RUnlock() - - s.cstatus.Lock() - defer s.cstatus.Unlock() - - top := cd.thisLevel.tables - var out []*table.Table - now := time.Now() - for _, t := range top { - if t.Size() >= 2*cd.t.fileSz[0] { - // This file is already big, don't include it. - continue - } - if now.Sub(t.CreatedAt) < 10*time.Second { - // Just created it 10s ago. Don't pick for compaction. - continue - } - if _, beingCompacted := s.cstatus.tables[t.ID()]; beingCompacted { - continue - } - out = append(out, t) - } - - if len(out) < 4 { - // If we don't have enough tables to merge in L0, don't do it. - return false - } - cd.thisRange = infRange - cd.top = out - - // Avoid any other L0 -> Lbase from happening, while this is going on. - thisLevel := s.cstatus.levels[cd.thisLevel.level] - thisLevel.ranges = append(thisLevel.ranges, infRange) - for _, t := range out { - s.cstatus.tables[t.ID()] = struct{}{} - } - - // For L0->L0 compaction, we set the target file size to max, so the output is always one file. - // This significantly decreases the L0 table stalls and improves the performance. - cd.t.fileSz[0] = math.MaxUint32 - return true -} - -func (s *levelsController) fillTablesL0ToLbase(cd *compactDef) bool { - if cd.nextLevel.level == 0 { - panic("Base level can't be zero.") - } - // We keep cd.p.adjusted > 0.0 here to allow functions in db.go to artificially trigger - // L0->Lbase compactions. Those functions wouldn't be setting the adjusted score. - if cd.p.adjusted > 0.0 && cd.p.adjusted < 1.0 { - // Do not compact to Lbase if adjusted score is less than 1.0. - return false - } - cd.lockLevels() - defer cd.unlockLevels() - - top := cd.thisLevel.tables - if len(top) == 0 { - return false - } - - var out []*table.Table - if len(cd.dropPrefixes) > 0 { - // Use all tables if drop prefix is set. We don't want to compact only a - // sub-range. We want to compact all the tables. - out = top - - } else { - var kr keyRange - // cd.top[0] is the oldest file. So we start from the oldest file first. - for _, t := range top { - dkr := getKeyRange(t) - if kr.overlapsWith(dkr) { - out = append(out, t) - kr.extend(dkr) - } else { - break - } - } - } - cd.thisRange = getKeyRange(out...) - cd.top = out - - left, right := cd.nextLevel.overlappingTables(levelHandlerRLocked{}, cd.thisRange) - cd.bot = make([]*table.Table, right-left) - copy(cd.bot, cd.nextLevel.tables[left:right]) - - if len(cd.bot) == 0 { - cd.nextRange = cd.thisRange - } else { - cd.nextRange = getKeyRange(cd.bot...) - } - return s.cstatus.compareAndAdd(thisAndNextLevelRLocked{}, *cd) -} - -// fillTablesL0 would try to fill tables from L0 to be compacted with Lbase. If -// it can not do that, it would try to compact tables from L0 -> L0. -// -// Say L0 has 10 tables. -// fillTablesL0ToLbase picks up 5 tables to compact from L0 -> L5. -// Next call to fillTablesL0 would run L0ToLbase again, which fails this time. -// So, instead, we run fillTablesL0ToL0, which picks up rest of the 5 tables to -// be compacted within L0. Additionally, it would set the compaction range in -// cstatus to inf, so no other L0 -> Lbase compactions can happen. -// Thus, L0 -> L0 must finish for the next L0 -> Lbase to begin. -func (s *levelsController) fillTablesL0(cd *compactDef) bool { - if ok := s.fillTablesL0ToLbase(cd); ok { - return true - } - return s.fillTablesL0ToL0(cd) -} - -// sortByStaleData sorts tables based on the amount of stale data they have. -// This is useful in removing tombstones. -func (s *levelsController) sortByStaleDataSize(tables []*table.Table, cd *compactDef) { - if len(tables) == 0 || cd.nextLevel == nil { - return - } - - sort.Slice(tables, func(i, j int) bool { - return tables[i].StaleDataSize() > tables[j].StaleDataSize() - }) -} - -// sortByHeuristic sorts tables in increasing order of MaxVersion, so we -// compact older tables first. -func (s *levelsController) sortByHeuristic(tables []*table.Table, cd *compactDef) { - if len(tables) == 0 || cd.nextLevel == nil { - return - } - - // Sort tables by max version. This is what RocksDB does. - sort.Slice(tables, func(i, j int) bool { - return tables[i].MaxVersion() < tables[j].MaxVersion() - }) -} - -// This function should be called with lock on levels. -func (s *levelsController) fillMaxLevelTables(tables []*table.Table, cd *compactDef) bool { - sortedTables := make([]*table.Table, len(tables)) - copy(sortedTables, tables) - s.sortByStaleDataSize(sortedTables, cd) - - if len(sortedTables) > 0 && sortedTables[0].StaleDataSize() == 0 { - // This is a maxLevel to maxLevel compaction and we don't have any stale data. - return false - } - cd.bot = []*table.Table{} - collectBotTables := func(t *table.Table, needSz int64) { - totalSize := t.Size() - - j := sort.Search(len(tables), func(i int) bool { - return y.CompareKeys(tables[i].Smallest(), t.Smallest()) >= 0 - }) - y.AssertTrue(tables[j].ID() == t.ID()) - j++ - // Collect tables until we reach the the required size. - for j < len(tables) { - newT := tables[j] - totalSize += newT.Size() - - if totalSize >= needSz { - break - } - cd.bot = append(cd.bot, newT) - cd.nextRange.extend(getKeyRange(newT)) - j++ - } - } - now := time.Now() - for _, t := range sortedTables { - // If the maxVersion is above the discardTs, we won't clean anything in - // the compaction. So skip this table. - if t.MaxVersion() > s.kv.orc.discardAtOrBelow() { - continue - } - if now.Sub(t.CreatedAt) < time.Hour { - // Just created it an hour ago. Don't pick for compaction. - continue - } - // If the stale data size is less than 10 MB, it might not be worth - // rewriting the table. Skip it. - if t.StaleDataSize() < 10<<20 { - continue - } - - cd.thisSize = t.Size() - cd.thisRange = getKeyRange(t) - // Set the next range as the same as the current range. If we don't do - // this, we won't be able to run more than one max level compactions. - cd.nextRange = cd.thisRange - // If we're already compacting this range, don't do anything. - if s.cstatus.overlapsWith(cd.thisLevel.level, cd.thisRange) { - continue - } - - // Found a valid table! - cd.top = []*table.Table{t} - - needFileSz := cd.t.fileSz[cd.thisLevel.level] - // The table size is what we want so no need to collect more tables. - if t.Size() >= needFileSz { - break - } - // TableSize is less than what we want. Collect more tables for compaction. - // If the level has multiple small tables, we collect all of them - // together to form a bigger table. - collectBotTables(t, needFileSz) - if !s.cstatus.compareAndAdd(thisAndNextLevelRLocked{}, *cd) { - cd.bot = cd.bot[:0] - cd.nextRange = keyRange{} - continue - } - return true - } - if len(cd.top) == 0 { - return false - } - - return s.cstatus.compareAndAdd(thisAndNextLevelRLocked{}, *cd) -} - -func (s *levelsController) fillTables(cd *compactDef) bool { - cd.lockLevels() - defer cd.unlockLevels() - - tables := make([]*table.Table, len(cd.thisLevel.tables)) - copy(tables, cd.thisLevel.tables) - if len(tables) == 0 { - return false - } - // We're doing a maxLevel to maxLevel compaction. Pick tables based on the stale data size. - if cd.thisLevel.isLastLevel() { - return s.fillMaxLevelTables(tables, cd) - } - // We pick tables, so we compact older tables first. This is similar to - // kOldestLargestSeqFirst in RocksDB. - s.sortByHeuristic(tables, cd) - - for _, t := range tables { - cd.thisSize = t.Size() - cd.thisRange = getKeyRange(t) - // If we're already compacting this range, don't do anything. - if s.cstatus.overlapsWith(cd.thisLevel.level, cd.thisRange) { - continue - } - cd.top = []*table.Table{t} - left, right := cd.nextLevel.overlappingTables(levelHandlerRLocked{}, cd.thisRange) - - cd.bot = make([]*table.Table, right-left) - copy(cd.bot, cd.nextLevel.tables[left:right]) - - if len(cd.bot) == 0 { - cd.bot = []*table.Table{} - cd.nextRange = cd.thisRange - if !s.cstatus.compareAndAdd(thisAndNextLevelRLocked{}, *cd) { - continue - } - return true - } - cd.nextRange = getKeyRange(cd.bot...) - - if s.cstatus.overlapsWith(cd.nextLevel.level, cd.nextRange) { - continue - } - if !s.cstatus.compareAndAdd(thisAndNextLevelRLocked{}, *cd) { - continue - } - return true - } - return false -} - -func (s *levelsController) runCompactDef(id, l int, cd compactDef) (err error) { - if len(cd.t.fileSz) == 0 { - return errors.New("Filesizes cannot be zero. Targets are not set") - } - timeStart := time.Now() - - thisLevel := cd.thisLevel - nextLevel := cd.nextLevel - - y.AssertTrue(len(cd.splits) == 0) - if thisLevel.level == nextLevel.level { - // don't do anything for L0 -> L0 and Lmax -> Lmax. - } else { - s.addSplits(&cd) - } - if len(cd.splits) == 0 { - cd.splits = append(cd.splits, keyRange{}) - } - - // Table should never be moved directly between levels, always be rewritten to allow discarding - // invalid versions. - - newTables, decr, err := s.compactBuildTables(l, cd) - if err != nil { - return err - } - defer func() { - // Only assign to err, if it's not already nil. - if decErr := decr(); err == nil { - err = decErr - } - }() - changeSet := buildChangeSet(&cd, newTables) - - // We write to the manifest _before_ we delete files (and after we created files) - if err := s.kv.manifest.addChanges(changeSet.Changes); err != nil { - return err - } - - // See comment earlier in this function about the ordering of these ops, and the order in which - // we access levels when reading. - if err := nextLevel.replaceTables(cd.bot, newTables); err != nil { - return err - } - if err := thisLevel.deleteTables(cd.top); err != nil { - return err - } - - // Note: For level 0, while doCompact is running, it is possible that new tables are added. - // However, the tables are added only to the end, so it is ok to just delete the first table. - - from := append(tablesToString(cd.top), tablesToString(cd.bot)...) - to := tablesToString(newTables) - if dur := time.Since(timeStart); dur > 2*time.Second { - var expensive string - if dur > time.Second { - expensive = " [E]" - } - s.kv.opt.Infof("[%d]%s LOG Compact %d->%d (%d, %d -> %d tables with %d splits)."+ - " [%s] -> [%s], took %v\n", - id, expensive, thisLevel.level, nextLevel.level, len(cd.top), len(cd.bot), - len(newTables), len(cd.splits), strings.Join(from, " "), strings.Join(to, " "), - dur.Round(time.Millisecond)) - } - - if cd.thisLevel.level != 0 && len(newTables) > 2*s.kv.opt.LevelSizeMultiplier { - s.kv.opt.Debugf("This Range (numTables: %d)\nLeft:\n%s\nRight:\n%s\n", - len(cd.top), hex.Dump(cd.thisRange.left), hex.Dump(cd.thisRange.right)) - s.kv.opt.Debugf("Next Range (numTables: %d)\nLeft:\n%s\nRight:\n%s\n", - len(cd.bot), hex.Dump(cd.nextRange.left), hex.Dump(cd.nextRange.right)) - } - return nil -} - -func tablesToString(tables []*table.Table) []string { - var res []string - for _, t := range tables { - res = append(res, fmt.Sprintf("%05d", t.ID())) - } - res = append(res, ".") - return res -} - -var errFillTables = errors.New("Unable to fill tables") - -// doCompact picks some table on level l and compacts it away to the next level. -func (s *levelsController) doCompact(id int, p compactionPriority) error { - l := p.level - y.AssertTrue(l < s.kv.opt.MaxLevels) // Sanity check. - if p.t.baseLevel == 0 { - p.t = s.levelTargets() - } - - _, span := otrace.StartSpan(context.Background(), "Badger.Compaction") - defer span.End() - - cd := compactDef{ - compactorId: id, - span: span, - p: p, - t: p.t, - thisLevel: s.levels[l], - dropPrefixes: p.dropPrefixes, - } - - // While picking tables to be compacted, both levels' tables are expected to - // remain unchanged. - if l == 0 { - cd.nextLevel = s.levels[p.t.baseLevel] - if !s.fillTablesL0(&cd) { - return errFillTables - } - } else { - cd.nextLevel = cd.thisLevel - // We're not compacting the last level so pick the next level. - if !cd.thisLevel.isLastLevel() { - cd.nextLevel = s.levels[l+1] - } - if !s.fillTables(&cd) { - return errFillTables - } - } - defer s.cstatus.delete(cd) // Remove the ranges from compaction status. - - span.Annotatef(nil, "Compaction: %+v", cd) - if err := s.runCompactDef(id, l, cd); err != nil { - // This compaction couldn't be done successfully. - s.kv.opt.Warningf("[Compactor: %d] LOG Compact FAILED with error: %+v: %+v", id, err, cd) - return err - } - - s.kv.opt.Debugf("[Compactor: %d] Compaction for level: %d DONE", id, cd.thisLevel.level) - return nil -} - -func (s *levelsController) addLevel0Table(t *table.Table) error { - // Add table to manifest file only if it is not opened in memory. We don't want to add a table - // to the manifest file if it exists only in memory. - if !t.IsInmemory { - // We update the manifest _before_ the table becomes part of a levelHandler, because at that - // point it could get used in some compaction. This ensures the manifest file gets updated in - // the proper order. (That means this update happens before that of some compaction which - // deletes the table.) - err := s.kv.manifest.addChanges([]*pb.ManifestChange{ - newCreateChange(t.ID(), 0, t.KeyID(), t.CompressionType()), - }) - if err != nil { - return err - } - } - - for !s.levels[0].tryAddLevel0Table(t) { - // Before we unstall, we need to make sure that level 0 is healthy. - timeStart := time.Now() - for s.levels[0].numTables() >= s.kv.opt.NumLevelZeroTablesStall { - time.Sleep(10 * time.Millisecond) - } - dur := time.Since(timeStart) - if dur > time.Second { - s.kv.opt.Infof("L0 was stalled for %s\n", dur.Round(time.Millisecond)) - } - atomic.AddInt64(&s.l0stallsMs, int64(dur.Round(time.Millisecond))) - } - - return nil -} - -func (s *levelsController) close() error { - err := s.cleanupLevels() - return y.Wrap(err, "levelsController.Close") -} - -// get searches for a given key in all the levels of the LSM tree. It returns -// key version <= the expected version (maxVs). If not found, it returns an empty -// y.ValueStruct. -func (s *levelsController) get(key []byte, maxVs y.ValueStruct, startLevel int) ( - y.ValueStruct, error) { - if s.kv.IsClosed() { - return y.ValueStruct{}, ErrDBClosed - } - // It's important that we iterate the levels from 0 on upward. The reason is, if we iterated - // in opposite order, or in parallel (naively calling all the h.RLock() in some order) we could - // read level L's tables post-compaction and level L+1's tables pre-compaction. (If we do - // parallelize this, we will need to call the h.RLock() function by increasing order of level - // number.) - version := y.ParseTs(key) - for _, h := range s.levels { - // Ignore all levels below startLevel. This is useful for GC when L0 is kept in memory. - if h.level < startLevel { - continue - } - vs, err := h.get(key) // Calls h.RLock() and h.RUnlock(). - if err != nil { - return y.ValueStruct{}, y.Wrapf(err, "get key: %q", key) - } - if vs.Value == nil && vs.Meta == 0 { - continue - } - if vs.Version == version { - return vs, nil - } - if maxVs.Version < vs.Version { - maxVs = vs - } - } - return maxVs, nil -} - -func appendIteratorsReversed(out []y.Iterator, th []*table.Table, opt int) []y.Iterator { - for i := len(th) - 1; i >= 0; i-- { - // This will increment the reference of the table handler. - out = append(out, th[i].NewIterator(opt)) - } - return out -} - -// appendIterators appends iterators to an array of iterators, for merging. -// Note: This obtains references for the table handlers. Remember to close these iterators. -func (s *levelsController) appendIterators( - iters []y.Iterator, opt *IteratorOptions) []y.Iterator { - // Just like with get, it's important we iterate the levels from 0 on upward, to avoid missing - // data when there's a compaction. - for _, level := range s.levels { - iters = level.appendIterators(iters, opt) - } - return iters -} - -// TableInfo represents the information about a table. -type TableInfo struct { - ID uint64 - Level int - Left []byte - Right []byte - KeyCount uint32 // Number of keys in the table - OnDiskSize uint32 - StaleDataSize uint32 - UncompressedSize uint32 - MaxVersion uint64 - IndexSz int - BloomFilterSize int -} - -func (s *levelsController) getTableInfo() (result []TableInfo) { - for _, l := range s.levels { - l.RLock() - for _, t := range l.tables { - info := TableInfo{ - ID: t.ID(), - Level: l.level, - Left: t.Smallest(), - Right: t.Biggest(), - KeyCount: t.KeyCount(), - OnDiskSize: t.OnDiskSize(), - StaleDataSize: t.StaleDataSize(), - IndexSz: t.IndexSize(), - BloomFilterSize: t.BloomFilterSize(), - UncompressedSize: t.UncompressedSize(), - MaxVersion: t.MaxVersion(), - } - result = append(result, info) - } - l.RUnlock() - } - sort.Slice(result, func(i, j int) bool { - if result[i].Level != result[j].Level { - return result[i].Level < result[j].Level - } - return result[i].ID < result[j].ID - }) - return -} - -type LevelInfo struct { - Level int - NumTables int - Size int64 - TargetSize int64 - TargetFileSize int64 - IsBaseLevel bool - Score float64 - Adjusted float64 - StaleDatSize int64 -} - -func (s *levelsController) getLevelInfo() []LevelInfo { - t := s.levelTargets() - prios := s.pickCompactLevels() - result := make([]LevelInfo, len(s.levels)) - for i, l := range s.levels { - l.RLock() - result[i].Level = i - result[i].Size = l.totalSize - result[i].NumTables = len(l.tables) - result[i].StaleDatSize = l.totalStaleSize - - l.RUnlock() - - result[i].TargetSize = t.targetSz[i] - result[i].TargetFileSize = t.fileSz[i] - result[i].IsBaseLevel = t.baseLevel == i - } - for _, p := range prios { - result[p.level].Score = p.score - result[p.level].Adjusted = p.adjusted - } - return result -} - -// verifyChecksum verifies checksum for all tables on all levels. -func (s *levelsController) verifyChecksum() error { - var tables []*table.Table - for _, l := range s.levels { - l.RLock() - tables = tables[:0] - for _, t := range l.tables { - tables = append(tables, t) - t.IncrRef() - } - l.RUnlock() - - for _, t := range tables { - errChkVerify := t.VerifyChecksum() - if err := t.DecrRef(); err != nil { - s.kv.opt.Errorf("unable to decrease reference of table: %s while "+ - "verifying checksum with error: %s", t.Filename(), err) - } - - if errChkVerify != nil { - return errChkVerify - } - } - } - - return nil -} - -// Returns the sorted list of splits for all the levels and tables based -// on the block offsets. -func (s *levelsController) keySplits(numPerTable int, prefix []byte) []string { - splits := make([]string, 0) - for _, l := range s.levels { - l.RLock() - for _, t := range l.tables { - tableSplits := t.KeySplits(numPerTable, prefix) - splits = append(splits, tableSplits...) - } - l.RUnlock() - } - sort.Strings(splits) - return splits -} diff --git a/vendor/github.com/dgraph-io/badger/v3/logger.go b/vendor/github.com/dgraph-io/badger/v3/logger.go deleted file mode 100644 index c7b4cd6c1f..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/logger.go +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "log" - "os" -) - -// Logger is implemented by any logging system that is used for standard logs. -type Logger interface { - Errorf(string, ...interface{}) - Warningf(string, ...interface{}) - Infof(string, ...interface{}) - Debugf(string, ...interface{}) -} - -// Errorf logs an ERROR log message to the logger specified in opts or to the -// global logger if no logger is specified in opts. -func (opt *Options) Errorf(format string, v ...interface{}) { - if opt.Logger == nil { - return - } - opt.Logger.Errorf(format, v...) -} - -// Infof logs an INFO message to the logger specified in opts. -func (opt *Options) Infof(format string, v ...interface{}) { - if opt.Logger == nil { - return - } - opt.Logger.Infof(format, v...) -} - -// Warningf logs a WARNING message to the logger specified in opts. -func (opt *Options) Warningf(format string, v ...interface{}) { - if opt.Logger == nil { - return - } - opt.Logger.Warningf(format, v...) -} - -// Debugf logs a DEBUG message to the logger specified in opts. -func (opt *Options) Debugf(format string, v ...interface{}) { - if opt.Logger == nil { - return - } - opt.Logger.Debugf(format, v...) -} - -type loggingLevel int - -const ( - DEBUG loggingLevel = iota - INFO - WARNING - ERROR -) - -type defaultLog struct { - *log.Logger - level loggingLevel -} - -func defaultLogger(level loggingLevel) *defaultLog { - return &defaultLog{Logger: log.New(os.Stderr, "badger ", log.LstdFlags), level: level} -} - -func (l *defaultLog) Errorf(f string, v ...interface{}) { - if l.level <= ERROR { - l.Printf("ERROR: "+f, v...) - } -} - -func (l *defaultLog) Warningf(f string, v ...interface{}) { - if l.level <= WARNING { - l.Printf("WARNING: "+f, v...) - } -} - -func (l *defaultLog) Infof(f string, v ...interface{}) { - if l.level <= INFO { - l.Printf("INFO: "+f, v...) - } -} - -func (l *defaultLog) Debugf(f string, v ...interface{}) { - if l.level <= DEBUG { - l.Printf("DEBUG: "+f, v...) - } -} diff --git a/vendor/github.com/dgraph-io/badger/v3/managed_db.go b/vendor/github.com/dgraph-io/badger/v3/managed_db.go deleted file mode 100644 index 23c7988457..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/managed_db.go +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -// OpenManaged returns a new DB, which allows more control over setting -// transaction timestamps, aka managed mode. -// -// This is only useful for databases built on top of Badger (like Dgraph), and -// can be ignored by most users. -func OpenManaged(opts Options) (*DB, error) { - opts.managedTxns = true - return Open(opts) -} - -// NewTransactionAt follows the same logic as DB.NewTransaction(), but uses the -// provided read timestamp. -// -// This is only useful for databases built on top of Badger (like Dgraph), and -// can be ignored by most users. -func (db *DB) NewTransactionAt(readTs uint64, update bool) *Txn { - if !db.opt.managedTxns { - panic("Cannot use NewTransactionAt with managedDB=false. Use NewTransaction instead.") - } - txn := db.newTransaction(update, true) - txn.readTs = readTs - return txn -} - -// NewWriteBatchAt is similar to NewWriteBatch but it allows user to set the commit timestamp. -// NewWriteBatchAt is supposed to be used only in the managed mode. -func (db *DB) NewWriteBatchAt(commitTs uint64) *WriteBatch { - if !db.opt.managedTxns { - panic("cannot use NewWriteBatchAt with managedDB=false. Use NewWriteBatch instead") - } - - wb := db.newWriteBatch(true) - wb.commitTs = commitTs - wb.txn.commitTs = commitTs - return wb -} -func (db *DB) NewManagedWriteBatch() *WriteBatch { - if !db.opt.managedTxns { - panic("cannot use NewManagedWriteBatch with managedDB=false. Use NewWriteBatch instead") - } - - wb := db.newWriteBatch(true) - return wb -} - -// CommitAt commits the transaction, following the same logic as Commit(), but -// at the given commit timestamp. This will panic if not used with managed transactions. -// -// This is only useful for databases built on top of Badger (like Dgraph), and -// can be ignored by most users. -func (txn *Txn) CommitAt(commitTs uint64, callback func(error)) error { - if !txn.db.opt.managedTxns { - panic("Cannot use CommitAt with managedDB=false. Use Commit instead.") - } - txn.commitTs = commitTs - if callback == nil { - return txn.Commit() - } - txn.CommitWith(callback) - return nil -} - -// SetDiscardTs sets a timestamp at or below which, any invalid or deleted -// versions can be discarded from the LSM tree, and thence from the value log to -// reclaim disk space. Can only be used with managed transactions. -func (db *DB) SetDiscardTs(ts uint64) { - if !db.opt.managedTxns { - panic("Cannot use SetDiscardTs with managedDB=false.") - } - db.orc.setDiscardTs(ts) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/manifest.go b/vendor/github.com/dgraph-io/badger/v3/manifest.go deleted file mode 100644 index bb27fb2477..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/manifest.go +++ /dev/null @@ -1,475 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "bufio" - "bytes" - "encoding/binary" - "fmt" - "hash/crc32" - "io" - "os" - "path/filepath" - "sync" - - "github.com/dgraph-io/badger/v3/options" - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/y" - "github.com/golang/protobuf/proto" - "github.com/pkg/errors" -) - -// Manifest represents the contents of the MANIFEST file in a Badger store. -// -// The MANIFEST file describes the startup state of the db -- all LSM files and what level they're -// at. -// -// It consists of a sequence of ManifestChangeSet objects. Each of these is treated atomically, -// and contains a sequence of ManifestChange's (file creations/deletions) which we use to -// reconstruct the manifest at startup. -type Manifest struct { - Levels []levelManifest - Tables map[uint64]TableManifest - - // Contains total number of creation and deletion changes in the manifest -- used to compute - // whether it'd be useful to rewrite the manifest. - Creations int - Deletions int -} - -func createManifest() Manifest { - levels := make([]levelManifest, 0) - return Manifest{ - Levels: levels, - Tables: make(map[uint64]TableManifest), - } -} - -// levelManifest contains information about LSM tree levels -// in the MANIFEST file. -type levelManifest struct { - Tables map[uint64]struct{} // Set of table id's -} - -// TableManifest contains information about a specific table -// in the LSM tree. -type TableManifest struct { - Level uint8 - KeyID uint64 - Compression options.CompressionType -} - -// manifestFile holds the file pointer (and other info) about the manifest file, which is a log -// file we append to. -type manifestFile struct { - fp *os.File - directory string - // We make this configurable so that unit tests can hit rewrite() code quickly - deletionsRewriteThreshold int - - // Guards appends, which includes access to the manifest field. - appendLock sync.Mutex - - // Used to track the current state of the manifest, used when rewriting. - manifest Manifest - - // Used to indicate if badger was opened in InMemory mode. - inMemory bool -} - -const ( - // ManifestFilename is the filename for the manifest file. - ManifestFilename = "MANIFEST" - manifestRewriteFilename = "MANIFEST-REWRITE" - manifestDeletionsRewriteThreshold = 10000 - manifestDeletionsRatio = 10 -) - -// asChanges returns a sequence of changes that could be used to recreate the Manifest in its -// present state. -func (m *Manifest) asChanges() []*pb.ManifestChange { - changes := make([]*pb.ManifestChange, 0, len(m.Tables)) - for id, tm := range m.Tables { - changes = append(changes, newCreateChange(id, int(tm.Level), tm.KeyID, tm.Compression)) - } - return changes -} - -func (m *Manifest) clone() Manifest { - changeSet := pb.ManifestChangeSet{Changes: m.asChanges()} - ret := createManifest() - y.Check(applyChangeSet(&ret, &changeSet)) - return ret -} - -// openOrCreateManifestFile opens a Badger manifest file if it exists, or creates one if -// doesn’t exists. -func openOrCreateManifestFile(opt Options) ( - ret *manifestFile, result Manifest, err error) { - if opt.InMemory { - return &manifestFile{inMemory: true}, Manifest{}, nil - } - return helpOpenOrCreateManifestFile(opt.Dir, opt.ReadOnly, manifestDeletionsRewriteThreshold) -} - -func helpOpenOrCreateManifestFile(dir string, readOnly bool, deletionsThreshold int) ( - *manifestFile, Manifest, error) { - - path := filepath.Join(dir, ManifestFilename) - var flags y.Flags - if readOnly { - flags |= y.ReadOnly - } - fp, err := y.OpenExistingFile(path, flags) // We explicitly sync in addChanges, outside the lock. - if err != nil { - if !os.IsNotExist(err) { - return nil, Manifest{}, err - } - if readOnly { - return nil, Manifest{}, fmt.Errorf("no manifest found, required for read-only db") - } - m := createManifest() - fp, netCreations, err := helpRewrite(dir, &m) - if err != nil { - return nil, Manifest{}, err - } - y.AssertTrue(netCreations == 0) - mf := &manifestFile{ - fp: fp, - directory: dir, - manifest: m.clone(), - deletionsRewriteThreshold: deletionsThreshold, - } - return mf, m, nil - } - - manifest, truncOffset, err := ReplayManifestFile(fp) - if err != nil { - _ = fp.Close() - return nil, Manifest{}, err - } - - if !readOnly { - // Truncate file so we don't have a half-written entry at the end. - if err := fp.Truncate(truncOffset); err != nil { - _ = fp.Close() - return nil, Manifest{}, err - } - } - if _, err = fp.Seek(0, io.SeekEnd); err != nil { - _ = fp.Close() - return nil, Manifest{}, err - } - - mf := &manifestFile{ - fp: fp, - directory: dir, - manifest: manifest.clone(), - deletionsRewriteThreshold: deletionsThreshold, - } - return mf, manifest, nil -} - -func (mf *manifestFile) close() error { - if mf.inMemory { - return nil - } - return mf.fp.Close() -} - -// addChanges writes a batch of changes, atomically, to the file. By "atomically" that means when -// we replay the MANIFEST file, we'll either replay all the changes or none of them. (The truth of -// this depends on the filesystem -- some might append garbage data if a system crash happens at -// the wrong time.) -func (mf *manifestFile) addChanges(changesParam []*pb.ManifestChange) error { - if mf.inMemory { - return nil - } - changes := pb.ManifestChangeSet{Changes: changesParam} - buf, err := proto.Marshal(&changes) - if err != nil { - return err - } - - // Maybe we could use O_APPEND instead (on certain file systems) - mf.appendLock.Lock() - if err := applyChangeSet(&mf.manifest, &changes); err != nil { - mf.appendLock.Unlock() - return err - } - // Rewrite manifest if it'd shrink by 1/10 and it's big enough to care - if mf.manifest.Deletions > mf.deletionsRewriteThreshold && - mf.manifest.Deletions > manifestDeletionsRatio*(mf.manifest.Creations-mf.manifest.Deletions) { - if err := mf.rewrite(); err != nil { - mf.appendLock.Unlock() - return err - } - } else { - var lenCrcBuf [8]byte - binary.BigEndian.PutUint32(lenCrcBuf[0:4], uint32(len(buf))) - binary.BigEndian.PutUint32(lenCrcBuf[4:8], crc32.Checksum(buf, y.CastagnoliCrcTable)) - buf = append(lenCrcBuf[:], buf...) - if _, err := mf.fp.Write(buf); err != nil { - mf.appendLock.Unlock() - return err - } - } - - mf.appendLock.Unlock() - return mf.fp.Sync() -} - -// Has to be 4 bytes. The value can never change, ever, anyway. -var magicText = [4]byte{'B', 'd', 'g', 'r'} - -// The magic version number. -const magicVersion = 8 - -func helpRewrite(dir string, m *Manifest) (*os.File, int, error) { - rewritePath := filepath.Join(dir, manifestRewriteFilename) - // We explicitly sync. - fp, err := y.OpenTruncFile(rewritePath, false) - if err != nil { - return nil, 0, err - } - - buf := make([]byte, 8) - copy(buf[0:4], magicText[:]) - binary.BigEndian.PutUint32(buf[4:8], magicVersion) - - netCreations := len(m.Tables) - changes := m.asChanges() - set := pb.ManifestChangeSet{Changes: changes} - - changeBuf, err := proto.Marshal(&set) - if err != nil { - fp.Close() - return nil, 0, err - } - var lenCrcBuf [8]byte - binary.BigEndian.PutUint32(lenCrcBuf[0:4], uint32(len(changeBuf))) - binary.BigEndian.PutUint32(lenCrcBuf[4:8], crc32.Checksum(changeBuf, y.CastagnoliCrcTable)) - buf = append(buf, lenCrcBuf[:]...) - buf = append(buf, changeBuf...) - if _, err := fp.Write(buf); err != nil { - fp.Close() - return nil, 0, err - } - if err := fp.Sync(); err != nil { - fp.Close() - return nil, 0, err - } - - // In Windows the files should be closed before doing a Rename. - if err = fp.Close(); err != nil { - return nil, 0, err - } - manifestPath := filepath.Join(dir, ManifestFilename) - if err := os.Rename(rewritePath, manifestPath); err != nil { - return nil, 0, err - } - fp, err = y.OpenExistingFile(manifestPath, 0) - if err != nil { - return nil, 0, err - } - if _, err := fp.Seek(0, io.SeekEnd); err != nil { - fp.Close() - return nil, 0, err - } - if err := syncDir(dir); err != nil { - fp.Close() - return nil, 0, err - } - - return fp, netCreations, nil -} - -// Must be called while appendLock is held. -func (mf *manifestFile) rewrite() error { - // In Windows the files should be closed before doing a Rename. - if err := mf.fp.Close(); err != nil { - return err - } - fp, netCreations, err := helpRewrite(mf.directory, &mf.manifest) - if err != nil { - return err - } - mf.fp = fp - mf.manifest.Creations = netCreations - mf.manifest.Deletions = 0 - - return nil -} - -type countingReader struct { - wrapped *bufio.Reader - count int64 -} - -func (r *countingReader) Read(p []byte) (n int, err error) { - n, err = r.wrapped.Read(p) - r.count += int64(n) - return -} - -func (r *countingReader) ReadByte() (b byte, err error) { - b, err = r.wrapped.ReadByte() - if err == nil { - r.count++ - } - return -} - -var ( - errBadMagic = errors.New("manifest has bad magic") - errBadChecksum = errors.New("manifest has checksum mismatch") -) - -// ReplayManifestFile reads the manifest file and constructs two manifest objects. (We need one -// immutable copy and one mutable copy of the manifest. Easiest way is to construct two of them.) -// Also, returns the last offset after a completely read manifest entry -- the file must be -// truncated at that point before further appends are made (if there is a partial entry after -// that). In normal conditions, truncOffset is the file size. -func ReplayManifestFile(fp *os.File) (Manifest, int64, error) { - r := countingReader{wrapped: bufio.NewReader(fp)} - - var magicBuf [8]byte - if _, err := io.ReadFull(&r, magicBuf[:]); err != nil { - return Manifest{}, 0, errBadMagic - } - if !bytes.Equal(magicBuf[0:4], magicText[:]) { - return Manifest{}, 0, errBadMagic - } - version := y.BytesToU32(magicBuf[4:8]) - if version != magicVersion { - return Manifest{}, 0, - //nolint:lll - fmt.Errorf("manifest has unsupported version: %d (we support %d).\n"+ - "Please see https://github.com/dgraph-io/badger/blob/master/README.md#i-see-manifest-has-unsupported-version-x-we-support-y-error"+ - " on how to fix this.", - version, magicVersion) - } - - stat, err := fp.Stat() - if err != nil { - return Manifest{}, 0, err - } - - build := createManifest() - var offset int64 - for { - offset = r.count - var lenCrcBuf [8]byte - _, err := io.ReadFull(&r, lenCrcBuf[:]) - if err != nil { - if err == io.EOF || err == io.ErrUnexpectedEOF { - break - } - return Manifest{}, 0, err - } - length := y.BytesToU32(lenCrcBuf[0:4]) - // Sanity check to ensure we don't over-allocate memory. - if length > uint32(stat.Size()) { - return Manifest{}, 0, errors.Errorf( - "Buffer length: %d greater than file size: %d. Manifest file might be corrupted", - length, stat.Size()) - } - var buf = make([]byte, length) - if _, err := io.ReadFull(&r, buf); err != nil { - if err == io.EOF || err == io.ErrUnexpectedEOF { - break - } - return Manifest{}, 0, err - } - if crc32.Checksum(buf, y.CastagnoliCrcTable) != y.BytesToU32(lenCrcBuf[4:8]) { - return Manifest{}, 0, errBadChecksum - } - - var changeSet pb.ManifestChangeSet - if err := proto.Unmarshal(buf, &changeSet); err != nil { - return Manifest{}, 0, err - } - - if err := applyChangeSet(&build, &changeSet); err != nil { - return Manifest{}, 0, err - } - } - - return build, offset, nil -} - -func applyManifestChange(build *Manifest, tc *pb.ManifestChange) error { - switch tc.Op { - case pb.ManifestChange_CREATE: - if _, ok := build.Tables[tc.Id]; ok { - return fmt.Errorf("MANIFEST invalid, table %d exists", tc.Id) - } - build.Tables[tc.Id] = TableManifest{ - Level: uint8(tc.Level), - KeyID: tc.KeyId, - Compression: options.CompressionType(tc.Compression), - } - for len(build.Levels) <= int(tc.Level) { - build.Levels = append(build.Levels, levelManifest{make(map[uint64]struct{})}) - } - build.Levels[tc.Level].Tables[tc.Id] = struct{}{} - build.Creations++ - case pb.ManifestChange_DELETE: - tm, ok := build.Tables[tc.Id] - if !ok { - return fmt.Errorf("MANIFEST removes non-existing table %d", tc.Id) - } - delete(build.Levels[tm.Level].Tables, tc.Id) - delete(build.Tables, tc.Id) - build.Deletions++ - default: - return fmt.Errorf("MANIFEST file has invalid manifestChange op") - } - return nil -} - -// This is not a "recoverable" error -- opening the KV store fails because the MANIFEST file is -// just plain broken. -func applyChangeSet(build *Manifest, changeSet *pb.ManifestChangeSet) error { - for _, change := range changeSet.Changes { - if err := applyManifestChange(build, change); err != nil { - return err - } - } - return nil -} - -func newCreateChange( - id uint64, level int, keyID uint64, c options.CompressionType) *pb.ManifestChange { - return &pb.ManifestChange{ - Id: id, - Op: pb.ManifestChange_CREATE, - Level: uint32(level), - KeyId: keyID, - // Hard coding it, since we're supporting only AES for now. - EncryptionAlgo: pb.EncryptionAlgo_aes, - Compression: uint32(c), - } -} - -func newDeleteChange(id uint64) *pb.ManifestChange { - return &pb.ManifestChange{ - Id: id, - Op: pb.ManifestChange_DELETE, - } -} diff --git a/vendor/github.com/dgraph-io/badger/v3/memtable.go b/vendor/github.com/dgraph-io/badger/v3/memtable.go deleted file mode 100644 index a200fa2fa7..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/memtable.go +++ /dev/null @@ -1,633 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "bufio" - "bytes" - "crypto/aes" - cryptorand "crypto/rand" - "encoding/binary" - "fmt" - "hash/crc32" - "io" - "io/ioutil" - "os" - "path/filepath" - "sort" - "strconv" - "strings" - "sync" - "sync/atomic" - - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/skl" - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" - "github.com/pkg/errors" -) - -// memTable structure stores a skiplist and a corresponding WAL. Writes to memTable are written -// both to the WAL and the skiplist. On a crash, the WAL is replayed to bring the skiplist back to -// its pre-crash form. -type memTable struct { - // TODO: Give skiplist z.Calloc'd []byte. - sl *skl.Skiplist - wal *logFile - maxVersion uint64 - opt Options - buf *bytes.Buffer -} - -func (db *DB) openMemTables(opt Options) error { - // We don't need to open any tables in in-memory mode. - if db.opt.InMemory { - return nil - } - files, err := ioutil.ReadDir(db.opt.Dir) - if err != nil { - return errFile(err, db.opt.Dir, "Unable to open mem dir.") - } - - var fids []int - for _, file := range files { - if !strings.HasSuffix(file.Name(), memFileExt) { - continue - } - fsz := len(file.Name()) - fid, err := strconv.ParseInt(file.Name()[:fsz-len(memFileExt)], 10, 64) - if err != nil { - return errFile(err, file.Name(), "Unable to parse log id.") - } - fids = append(fids, int(fid)) - } - - // Sort in ascending order. - sort.Slice(fids, func(i, j int) bool { - return fids[i] < fids[j] - }) - for _, fid := range fids { - flags := os.O_RDWR - if db.opt.ReadOnly { - flags = os.O_RDONLY - } - mt, err := db.openMemTable(fid, flags) - if err != nil { - return y.Wrapf(err, "while opening fid: %d", fid) - } - // If this memtable is empty we don't need to add it. This is a - // memtable that was completely truncated. - if mt.sl.Empty() { - mt.DecrRef() - continue - } - // These should no longer be written to. So, make them part of the imm. - db.imm = append(db.imm, mt) - } - if len(fids) != 0 { - db.nextMemFid = fids[len(fids)-1] - } - db.nextMemFid++ - return nil -} - -const memFileExt string = ".mem" - -func (db *DB) openMemTable(fid, flags int) (*memTable, error) { - filepath := db.mtFilePath(fid) - s := skl.NewSkiplist(arenaSize(db.opt)) - mt := &memTable{ - sl: s, - opt: db.opt, - buf: &bytes.Buffer{}, - } - // We don't need to create the wal for the skiplist in in-memory mode so return the mt. - if db.opt.InMemory { - return mt, z.NewFile - } - - mt.wal = &logFile{ - fid: uint32(fid), - path: filepath, - registry: db.registry, - writeAt: vlogHeaderSize, - opt: db.opt, - } - lerr := mt.wal.open(filepath, flags, 2*db.opt.MemTableSize) - if lerr != z.NewFile && lerr != nil { - return nil, y.Wrapf(lerr, "While opening memtable: %s", filepath) - } - - // Have a callback set to delete WAL when skiplist reference count goes down to zero. That is, - // when it gets flushed to L0. - s.OnClose = func() { - if err := mt.wal.Delete(); err != nil { - db.opt.Errorf("while deleting file: %s, err: %v", filepath, err) - } - } - - if lerr == z.NewFile { - return mt, lerr - } - err := mt.UpdateSkipList() - return mt, y.Wrapf(err, "while updating skiplist") -} - -var errExpectingNewFile = errors.New("Expecting to create a new file, but found an existing file") - -func (db *DB) newMemTable() (*memTable, error) { - mt, err := db.openMemTable(db.nextMemFid, os.O_CREATE|os.O_RDWR) - if err == z.NewFile { - db.nextMemFid++ - return mt, nil - } - - if err != nil { - db.opt.Errorf("Got error: %v for id: %d\n", err, db.nextMemFid) - return nil, y.Wrapf(err, "newMemTable") - } - return nil, errors.Errorf("File %s already exists", mt.wal.Fd.Name()) -} - -func (db *DB) mtFilePath(fid int) string { - return filepath.Join(db.opt.Dir, fmt.Sprintf("%05d%s", fid, memFileExt)) -} - -func (mt *memTable) SyncWAL() error { - return mt.wal.Sync() -} - -func (mt *memTable) isFull() bool { - if mt.sl.MemSize() >= mt.opt.MemTableSize { - return true - } - if mt.opt.InMemory { - // InMemory mode doesn't have any WAL. - return false - } - return int64(mt.wal.writeAt) >= mt.opt.MemTableSize -} - -func (mt *memTable) Put(key []byte, value y.ValueStruct) error { - entry := &Entry{ - Key: key, - Value: value.Value, - UserMeta: value.UserMeta, - meta: value.Meta, - ExpiresAt: value.ExpiresAt, - } - - // wal is nil only when badger in running in in-memory mode and we don't need the wal. - if mt.wal != nil { - // If WAL exceeds opt.ValueLogFileSize, we'll force flush the memTable. See logic in - // ensureRoomForWrite. - if err := mt.wal.writeEntry(mt.buf, entry, mt.opt); err != nil { - return y.Wrapf(err, "cannot write entry to WAL file") - } - } - // We insert the finish marker in the WAL but not in the memtable. - if entry.meta&bitFinTxn > 0 { - return nil - } - - // Write to skiplist and update maxVersion encountered. - mt.sl.Put(key, value) - if ts := y.ParseTs(entry.Key); ts > mt.maxVersion { - mt.maxVersion = ts - } - return nil -} - -func (mt *memTable) UpdateSkipList() error { - if mt.wal == nil || mt.sl == nil { - return nil - } - endOff, err := mt.wal.iterate(true, 0, mt.replayFunction(mt.opt)) - if err != nil { - return y.Wrapf(err, "while iterating wal: %s", mt.wal.Fd.Name()) - } - if endOff < mt.wal.size && mt.opt.ReadOnly { - return y.Wrapf(ErrTruncateNeeded, "end offset: %d < size: %d", endOff, mt.wal.size) - } - return mt.wal.Truncate(int64(endOff)) -} - -// IncrRef increases the refcount -func (mt *memTable) IncrRef() { - mt.sl.IncrRef() -} - -// DecrRef decrements the refcount, deallocating the Skiplist when done using it -func (mt *memTable) DecrRef() { - mt.sl.DecrRef() -} - -func (mt *memTable) replayFunction(opt Options) func(Entry, valuePointer) error { - first := true - return func(e Entry, _ valuePointer) error { // Function for replaying. - if first { - opt.Debugf("First key=%q\n", e.Key) - } - first = false - if ts := y.ParseTs(e.Key); ts > mt.maxVersion { - mt.maxVersion = ts - } - v := y.ValueStruct{ - Value: e.Value, - Meta: e.meta, - UserMeta: e.UserMeta, - ExpiresAt: e.ExpiresAt, - } - // This is already encoded correctly. Value would be either a vptr, or a full value - // depending upon how big the original value was. Skiplist makes a copy of the key and - // value. - mt.sl.Put(e.Key, v) - return nil - } -} - -type logFile struct { - *z.MmapFile - path string - // This is a lock on the log file. It guards the fd’s value, the file’s - // existence and the file’s memory map. - // - // Use shared ownership when reading/writing the file or memory map, use - // exclusive ownership to open/close the descriptor, unmap or remove the file. - lock sync.RWMutex - fid uint32 - size uint32 - dataKey *pb.DataKey - baseIV []byte - registry *KeyRegistry - writeAt uint32 - opt Options -} - -func (lf *logFile) Truncate(end int64) error { - if fi, err := lf.Fd.Stat(); err != nil { - return fmt.Errorf("while file.stat on file: %s, error: %v\n", lf.Fd.Name(), err) - } else if fi.Size() == end { - return nil - } - y.AssertTrue(!lf.opt.ReadOnly) - lf.size = uint32(end) - return lf.MmapFile.Truncate(end) -} - -// encodeEntry will encode entry to the buf -// layout of entry -// +--------+-----+-------+-------+ -// | header | key | value | crc32 | -// +--------+-----+-------+-------+ -func (lf *logFile) encodeEntry(buf *bytes.Buffer, e *Entry, offset uint32) (int, error) { - h := header{ - klen: uint32(len(e.Key)), - vlen: uint32(len(e.Value)), - expiresAt: e.ExpiresAt, - meta: e.meta, - userMeta: e.UserMeta, - } - - hash := crc32.New(y.CastagnoliCrcTable) - writer := io.MultiWriter(buf, hash) - - // encode header. - var headerEnc [maxHeaderSize]byte - sz := h.Encode(headerEnc[:]) - y.Check2(writer.Write(headerEnc[:sz])) - // we'll encrypt only key and value. - if lf.encryptionEnabled() { - // TODO: no need to allocate the bytes. we can calculate the encrypted buf one by one - // since we're using ctr mode of AES encryption. Ordering won't changed. Need some - // refactoring in XORBlock which will work like stream cipher. - eBuf := make([]byte, 0, len(e.Key)+len(e.Value)) - eBuf = append(eBuf, e.Key...) - eBuf = append(eBuf, e.Value...) - if err := y.XORBlockStream( - writer, eBuf, lf.dataKey.Data, lf.generateIV(offset)); err != nil { - return 0, y.Wrapf(err, "Error while encoding entry for vlog.") - } - } else { - // Encryption is disabled so writing directly to the buffer. - y.Check2(writer.Write(e.Key)) - y.Check2(writer.Write(e.Value)) - } - // write crc32 hash. - var crcBuf [crc32.Size]byte - binary.BigEndian.PutUint32(crcBuf[:], hash.Sum32()) - y.Check2(buf.Write(crcBuf[:])) - // return encoded length. - return len(headerEnc[:sz]) + len(e.Key) + len(e.Value) + len(crcBuf), nil -} - -func (lf *logFile) writeEntry(buf *bytes.Buffer, e *Entry, opt Options) error { - buf.Reset() - plen, err := lf.encodeEntry(buf, e, lf.writeAt) - if err != nil { - return err - } - y.AssertTrue(plen == copy(lf.Data[lf.writeAt:], buf.Bytes())) - lf.writeAt += uint32(plen) - - lf.zeroNextEntry() - return nil -} - -func (lf *logFile) decodeEntry(buf []byte, offset uint32) (*Entry, error) { - var h header - hlen := h.Decode(buf) - kv := buf[hlen:] - if lf.encryptionEnabled() { - var err error - // No need to worry about mmap. because, XORBlock allocates a byte array to do the - // xor. So, the given slice is not being mutated. - if kv, err = lf.decryptKV(kv, offset); err != nil { - return nil, err - } - } - e := &Entry{ - meta: h.meta, - UserMeta: h.userMeta, - ExpiresAt: h.expiresAt, - offset: offset, - Key: kv[:h.klen], - Value: kv[h.klen : h.klen+h.vlen], - } - return e, nil -} - -func (lf *logFile) decryptKV(buf []byte, offset uint32) ([]byte, error) { - return y.XORBlockAllocate(buf, lf.dataKey.Data, lf.generateIV(offset)) -} - -// KeyID returns datakey's ID. -func (lf *logFile) keyID() uint64 { - if lf.dataKey == nil { - // If there is no datakey, then we'll return 0. Which means no encryption. - return 0 - } - return lf.dataKey.KeyId -} - -func (lf *logFile) encryptionEnabled() bool { - return lf.dataKey != nil -} - -// Acquire lock on mmap/file if you are calling this -func (lf *logFile) read(p valuePointer) (buf []byte, err error) { - var nbr int64 - offset := p.Offset - // Do not convert size to uint32, because the lf.Data can be of size - // 4GB, which overflows the uint32 during conversion to make the size 0, - // causing the read to fail with ErrEOF. See issue #585. - size := int64(len(lf.Data)) - valsz := p.Len - lfsz := atomic.LoadUint32(&lf.size) - if int64(offset) >= size || int64(offset+valsz) > size || - // Ensure that the read is within the file's actual size. It might be possible that - // the offset+valsz length is beyond the file's actual size. This could happen when - // dropAll and iterations are running simultaneously. - int64(offset+valsz) > int64(lfsz) { - err = y.ErrEOF - } else { - buf = lf.Data[offset : offset+valsz] - nbr = int64(valsz) - } - y.NumReadsAdd(lf.opt.MetricsEnabled, 1) - y.NumBytesReadAdd(lf.opt.MetricsEnabled, nbr) - return buf, err -} - -// generateIV will generate IV by appending given offset with the base IV. -func (lf *logFile) generateIV(offset uint32) []byte { - iv := make([]byte, aes.BlockSize) - // baseIV is of 12 bytes. - y.AssertTrue(12 == copy(iv[:12], lf.baseIV)) - // remaining 4 bytes is obtained from offset. - binary.BigEndian.PutUint32(iv[12:], offset) - return iv -} - -func (lf *logFile) doneWriting(offset uint32) error { - if lf.opt.SyncWrites { - if err := lf.Sync(); err != nil { - return y.Wrapf(err, "Unable to sync value log: %q", lf.path) - } - } - - // Before we were acquiring a lock here on lf.lock, because we were invalidating the file - // descriptor due to reopening it as read-only. Now, we don't invalidate the fd, but unmap it, - // truncate it and remap it. That creates a window where we have segfaults because the mmap is - // no longer valid, while someone might be reading it. Therefore, we need a lock here again. - lf.lock.Lock() - defer lf.lock.Unlock() - - if err := lf.Truncate(int64(offset)); err != nil { - return y.Wrapf(err, "Unable to truncate file: %q", lf.path) - } - - // Previously we used to close the file after it was written and reopen it in read-only mode. - // We no longer open files in read-only mode. We keep all vlog files open in read-write mode. - return nil -} - -// iterate iterates over log file. It doesn't not allocate new memory for every kv pair. -// Therefore, the kv pair is only valid for the duration of fn call. -func (lf *logFile) iterate(readOnly bool, offset uint32, fn logEntry) (uint32, error) { - if offset == 0 { - // If offset is set to zero, let's advance past the encryption key header. - offset = vlogHeaderSize - } - - // For now, read directly from file, because it allows - reader := bufio.NewReader(lf.NewReader(int(offset))) - read := &safeRead{ - k: make([]byte, 10), - v: make([]byte, 10), - recordOffset: offset, - lf: lf, - } - - var lastCommit uint64 - var validEndOffset uint32 = offset - - var entries []*Entry - var vptrs []valuePointer - -loop: - for { - e, err := read.Entry(reader) - switch { - // We have not reached the end of the file but the entry we read is - // zero. This happens because we have truncated the file and - // zero'ed it out. - case err == io.EOF: - break loop - case err == io.ErrUnexpectedEOF || err == errTruncate: - break loop - case err != nil: - return 0, err - case e == nil: - continue - case e.isZero(): - break loop - } - - var vp valuePointer - vp.Len = uint32(int(e.hlen) + len(e.Key) + len(e.Value) + crc32.Size) - read.recordOffset += vp.Len - - vp.Offset = e.offset - vp.Fid = lf.fid - - switch { - case e.meta&bitTxn > 0: - txnTs := y.ParseTs(e.Key) - if lastCommit == 0 { - lastCommit = txnTs - } - if lastCommit != txnTs { - break loop - } - entries = append(entries, e) - vptrs = append(vptrs, vp) - - case e.meta&bitFinTxn > 0: - txnTs, err := strconv.ParseUint(string(e.Value), 10, 64) - if err != nil || lastCommit != txnTs { - break loop - } - // Got the end of txn. Now we can store them. - lastCommit = 0 - validEndOffset = read.recordOffset - - for i, e := range entries { - vp := vptrs[i] - if err := fn(*e, vp); err != nil { - if err == errStop { - break - } - return 0, errFile(err, lf.path, "Iteration function") - } - } - entries = entries[:0] - vptrs = vptrs[:0] - - default: - if lastCommit != 0 { - // This is most likely an entry which was moved as part of GC. - // We shouldn't get this entry in the middle of a transaction. - break loop - } - validEndOffset = read.recordOffset - - if err := fn(*e, vp); err != nil { - if err == errStop { - break - } - return 0, errFile(err, lf.path, "Iteration function") - } - } - } - return validEndOffset, nil -} - -// Zero out the next entry to deal with any crashes. -func (lf *logFile) zeroNextEntry() { - z.ZeroOut(lf.Data, int(lf.writeAt), int(lf.writeAt+maxHeaderSize)) -} - -func (lf *logFile) open(path string, flags int, fsize int64) error { - mf, ferr := z.OpenMmapFile(path, flags, int(fsize)) - lf.MmapFile = mf - - if ferr == z.NewFile { - if err := lf.bootstrap(); err != nil { - os.Remove(path) - return err - } - lf.size = vlogHeaderSize - - } else if ferr != nil { - return y.Wrapf(ferr, "while opening file: %s", path) - } - lf.size = uint32(len(lf.Data)) - - if lf.size < vlogHeaderSize { - // Every vlog file should have at least vlogHeaderSize. If it is less than vlogHeaderSize - // then it must have been corrupted. But no need to handle here. log replayer will truncate - // and bootstrap the logfile. So ignoring here. - return nil - } - - // Copy over the encryption registry data. - buf := make([]byte, vlogHeaderSize) - - y.AssertTruef(vlogHeaderSize == copy(buf, lf.Data), - "Unable to copy from %s, size %d", path, lf.size) - keyID := binary.BigEndian.Uint64(buf[:8]) - // retrieve datakey. - if dk, err := lf.registry.DataKey(keyID); err != nil { - return y.Wrapf(err, "While opening vlog file %d", lf.fid) - } else { - lf.dataKey = dk - } - lf.baseIV = buf[8:] - y.AssertTrue(len(lf.baseIV) == 12) - - // Preserved ferr so we can return if this was a new file. - return ferr -} - -// bootstrap will initialize the log file with key id and baseIV. -// The below figure shows the layout of log file. -// +----------------+------------------+------------------+ -// | keyID(8 bytes) | baseIV(12 bytes)| entry... | -// +----------------+------------------+------------------+ -func (lf *logFile) bootstrap() error { - var err error - - // generate data key for the log file. - var dk *pb.DataKey - if dk, err = lf.registry.LatestDataKey(); err != nil { - return y.Wrapf(err, "Error while retrieving datakey in logFile.bootstarp") - } - lf.dataKey = dk - - // We'll always preserve vlogHeaderSize for key id and baseIV. - buf := make([]byte, vlogHeaderSize) - - // write key id to the buf. - // key id will be zero if the logfile is in plain text. - binary.BigEndian.PutUint64(buf[:8], lf.keyID()) - // generate base IV. It'll be used with offset of the vptr to encrypt the entry. - if _, err := cryptorand.Read(buf[8:]); err != nil { - return y.Wrapf(err, "Error while creating base IV, while creating logfile") - } - - // Initialize base IV. - lf.baseIV = buf[8:] - y.AssertTrue(len(lf.baseIV) == 12) - - // Copy over to the logFile. - y.AssertTrue(vlogHeaderSize == copy(lf.Data[0:], buf)) - - // Zero out the next entry. - lf.zeroNextEntry() - return nil -} diff --git a/vendor/github.com/dgraph-io/badger/v3/merge.go b/vendor/github.com/dgraph-io/badger/v3/merge.go deleted file mode 100644 index ac1a2b51e7..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/merge.go +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "sync" - "time" - - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" - "github.com/pkg/errors" -) - -// MergeOperator represents a Badger merge operator. -type MergeOperator struct { - sync.RWMutex - f MergeFunc - db *DB - key []byte - closer *z.Closer -} - -// MergeFunc accepts two byte slices, one representing an existing value, and -// another representing a new value that needs to be ‘merged’ into it. MergeFunc -// contains the logic to perform the ‘merge’ and return an updated value. -// MergeFunc could perform operations like integer addition, list appends etc. -// Note that the ordering of the operands is maintained. -type MergeFunc func(existingVal, newVal []byte) []byte - -// GetMergeOperator creates a new MergeOperator for a given key and returns a -// pointer to it. It also fires off a goroutine that performs a compaction using -// the merge function that runs periodically, as specified by dur. -func (db *DB) GetMergeOperator(key []byte, - f MergeFunc, dur time.Duration) *MergeOperator { - op := &MergeOperator{ - f: f, - db: db, - key: key, - closer: z.NewCloser(1), - } - - go op.runCompactions(dur) - return op -} - -var errNoMerge = errors.New("No need for merge") - -func (op *MergeOperator) iterateAndMerge() (newVal []byte, latest uint64, err error) { - txn := op.db.NewTransaction(false) - defer txn.Discard() - opt := DefaultIteratorOptions - opt.AllVersions = true - it := txn.NewKeyIterator(op.key, opt) - defer it.Close() - - var numVersions int - for it.Rewind(); it.Valid(); it.Next() { - item := it.Item() - if item.IsDeletedOrExpired() { - break - } - numVersions++ - if numVersions == 1 { - // This should be the newVal, considering this is the latest version. - newVal, err = item.ValueCopy(newVal) - if err != nil { - return nil, 0, err - } - latest = item.Version() - } else { - if err := item.Value(func(oldVal []byte) error { - // The merge should always be on the newVal considering it has the merge result of - // the latest version. The value read should be the oldVal. - newVal = op.f(oldVal, newVal) - return nil - }); err != nil { - return nil, 0, err - } - } - if item.DiscardEarlierVersions() { - break - } - } - if numVersions == 0 { - return nil, latest, ErrKeyNotFound - } else if numVersions == 1 { - return newVal, latest, errNoMerge - } - return newVal, latest, nil -} - -func (op *MergeOperator) compact() error { - op.Lock() - defer op.Unlock() - val, version, err := op.iterateAndMerge() - if err == ErrKeyNotFound || err == errNoMerge { - return nil - } else if err != nil { - return err - } - entries := []*Entry{ - { - Key: y.KeyWithTs(op.key, version), - Value: val, - meta: bitDiscardEarlierVersions, - }, - } - // Write value back to the DB. It is important that we do not set the bitMergeEntry bit - // here. When compaction happens, all the older merged entries will be removed. - return op.db.batchSetAsync(entries, func(err error) { - if err != nil { - op.db.opt.Errorf("failed to insert the result of merge compaction: %s", err) - } - }) -} - -func (op *MergeOperator) runCompactions(dur time.Duration) { - ticker := time.NewTicker(dur) - defer op.closer.Done() - var stop bool - for { - select { - case <-op.closer.HasBeenClosed(): - stop = true - case <-ticker.C: // wait for tick - } - if err := op.compact(); err != nil { - op.db.opt.Errorf("failure while running merge operation: %s", err) - } - if stop { - ticker.Stop() - break - } - } -} - -// Add records a value in Badger which will eventually be merged by a background -// routine into the values that were recorded by previous invocations to Add(). -func (op *MergeOperator) Add(val []byte) error { - return op.db.Update(func(txn *Txn) error { - return txn.SetEntry(NewEntry(op.key, val).withMergeBit()) - }) -} - -// Get returns the latest value for the merge operator, which is derived by -// applying the merge function to all the values added so far. -// -// If Add has not been called even once, Get will return ErrKeyNotFound. -func (op *MergeOperator) Get() ([]byte, error) { - op.RLock() - defer op.RUnlock() - var existing []byte - err := op.db.View(func(txn *Txn) (err error) { - existing, _, err = op.iterateAndMerge() - return err - }) - if err == errNoMerge { - return existing, nil - } - return existing, err -} - -// Stop waits for any pending merge to complete and then stops the background -// goroutine. -func (op *MergeOperator) Stop() { - op.closer.SignalAndWait() -} diff --git a/vendor/github.com/dgraph-io/badger/v3/options.go b/vendor/github.com/dgraph-io/badger/v3/options.go deleted file mode 100644 index 2963355608..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/options.go +++ /dev/null @@ -1,791 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "fmt" - "os" - "reflect" - "strconv" - "strings" - "time" - - "github.com/dgraph-io/ristretto/z" - "github.com/pkg/errors" - - "github.com/dgraph-io/badger/v3/options" - "github.com/dgraph-io/badger/v3/table" - "github.com/dgraph-io/badger/v3/y" -) - -// Note: If you add a new option X make sure you also add a WithX method on Options. - -// Options are params for creating DB object. -// -// This package provides DefaultOptions which contains options that should -// work for most applications. Consider using that as a starting point before -// customizing it for your own needs. -// -// Each option X is documented on the WithX method. -type Options struct { - // Required options. - - Dir string - ValueDir string - - // Usually modified options. - - SyncWrites bool - NumVersionsToKeep int - ReadOnly bool - Logger Logger - Compression options.CompressionType - InMemory bool - MetricsEnabled bool - // Sets the Stream.numGo field - NumGoroutines int - - // Fine tuning options. - - MemTableSize int64 - BaseTableSize int64 - BaseLevelSize int64 - LevelSizeMultiplier int - TableSizeMultiplier int - MaxLevels int - - VLogPercentile float64 - ValueThreshold int64 - NumMemtables int - // Changing BlockSize across DB runs will not break badger. The block size is - // read from the block index stored at the end of the table. - BlockSize int - BloomFalsePositive float64 - BlockCacheSize int64 - IndexCacheSize int64 - - NumLevelZeroTables int - NumLevelZeroTablesStall int - - ValueLogFileSize int64 - ValueLogMaxEntries uint32 - - NumCompactors int - CompactL0OnClose bool - LmaxCompaction bool - ZSTDCompressionLevel int - - // When set, checksum will be validated for each entry read from the value log file. - VerifyValueChecksum bool - - // Encryption related options. - EncryptionKey []byte // encryption key - EncryptionKeyRotationDuration time.Duration // key rotation duration - - // BypassLockGuard will bypass the lock guard on badger. Bypassing lock - // guard can cause data corruption if multiple badger instances are using - // the same directory. Use this options with caution. - BypassLockGuard bool - - // ChecksumVerificationMode decides when db should verify checksums for SSTable blocks. - ChecksumVerificationMode options.ChecksumVerificationMode - - // DetectConflicts determines whether the transactions would be checked for - // conflicts. The transactions can be processed at a higher rate when - // conflict detection is disabled. - DetectConflicts bool - - // NamespaceOffset specifies the offset from where the next 8 bytes contains the namespace. - NamespaceOffset int - - // Transaction start and commit timestamps are managed by end-user. - // This is only useful for databases built on top of Badger (like Dgraph). - // Not recommended for most users. - managedTxns bool - - // 4. Flags for testing purposes - // ------------------------------ - maxBatchCount int64 // max entries in batch - maxBatchSize int64 // max batch size in bytes - - maxValueThreshold float64 -} - -// DefaultOptions sets a list of recommended options for good performance. -// Feel free to modify these to suit your needs with the WithX methods. -func DefaultOptions(path string) Options { - return Options{ - Dir: path, - ValueDir: path, - - MemTableSize: 64 << 20, - BaseTableSize: 2 << 20, - BaseLevelSize: 10 << 20, - TableSizeMultiplier: 2, - LevelSizeMultiplier: 10, - MaxLevels: 7, - NumGoroutines: 8, - MetricsEnabled: true, - - NumCompactors: 4, // Run at least 2 compactors. Zero-th compactor prioritizes L0. - NumLevelZeroTables: 5, - NumLevelZeroTablesStall: 15, - NumMemtables: 5, - BloomFalsePositive: 0.01, - BlockSize: 4 * 1024, - SyncWrites: false, - NumVersionsToKeep: 1, - CompactL0OnClose: false, - VerifyValueChecksum: false, - Compression: options.Snappy, - BlockCacheSize: 256 << 20, - IndexCacheSize: 0, - - // The following benchmarks were done on a 4 KB block size (default block size). The - // compression is ratio supposed to increase with increasing compression level but since the - // input for compression algorithm is small (4 KB), we don't get significant benefit at - // level 3. - // NOTE: The benchmarks are with DataDog ZSTD that requires CGO. Hence, no longer valid. - // no_compression-16 10 502848865 ns/op 165.46 MB/s - - // zstd_compression/level_1-16 7 739037966 ns/op 112.58 MB/s 2.93 - // zstd_compression/level_3-16 7 756950250 ns/op 109.91 MB/s 2.72 - // zstd_compression/level_15-16 1 11135686219 ns/op 7.47 MB/s 4.38 - // Benchmark code can be found in table/builder_test.go file - ZSTDCompressionLevel: 1, - - // Nothing to read/write value log using standard File I/O - // MemoryMap to mmap() the value log files - // (2^30 - 1)*2 when mmapping < 2^31 - 1, max int32. - // -1 so 2*ValueLogFileSize won't overflow on 32-bit systems. - ValueLogFileSize: 1<<30 - 1, - - ValueLogMaxEntries: 1000000, - - VLogPercentile: 0.0, - ValueThreshold: maxValueThreshold, - - Logger: defaultLogger(INFO), - EncryptionKey: []byte{}, - EncryptionKeyRotationDuration: 10 * 24 * time.Hour, // Default 10 days. - DetectConflicts: true, - NamespaceOffset: -1, - } -} - -func buildTableOptions(db *DB) table.Options { - opt := db.opt - dk, err := db.registry.LatestDataKey() - y.Check(err) - return table.Options{ - ReadOnly: opt.ReadOnly, - MetricsEnabled: db.opt.MetricsEnabled, - TableSize: uint64(opt.BaseTableSize), - BlockSize: opt.BlockSize, - BloomFalsePositive: opt.BloomFalsePositive, - ChkMode: opt.ChecksumVerificationMode, - Compression: opt.Compression, - ZSTDCompressionLevel: opt.ZSTDCompressionLevel, - BlockCache: db.blockCache, - IndexCache: db.indexCache, - AllocPool: db.allocPool, - DataKey: dk, - } -} - -const ( - maxValueThreshold = (1 << 20) // 1 MB -) - -// LSMOnlyOptions follows from DefaultOptions, but sets a higher ValueThreshold -// so values would be collocated with the LSM tree, with value log largely acting -// as a write-ahead log only. These options would reduce the disk usage of value -// log, and make Badger act more like a typical LSM tree. -func LSMOnlyOptions(path string) Options { - // Let's not set any other options, because they can cause issues with the - // size of key-value a user can pass to Badger. For e.g., if we set - // ValueLogFileSize to 64MB, a user can't pass a value more than that. - // Setting it to ValueLogMaxEntries to 1000, can generate too many files. - // These options are better configured on a usage basis, than broadly here. - // The ValueThreshold is the most important setting a user needs to do to - // achieve a heavier usage of LSM tree. - // NOTE: If a user does not want to set 64KB as the ValueThreshold because - // of performance reasons, 1KB would be a good option too, allowing - // values smaller than 1KB to be collocated with the keys in the LSM tree. - return DefaultOptions(path).WithValueThreshold(maxValueThreshold /* 1 MB */) -} - -// parseCompression returns badger.compressionType and compression level given compression string -// of format compression-type:compression-level -func parseCompression(cStr string) (options.CompressionType, int, error) { - cStrSplit := strings.Split(cStr, ":") - cType := cStrSplit[0] - level := 3 - - var err error - if len(cStrSplit) == 2 { - level, err = strconv.Atoi(cStrSplit[1]) - y.Check(err) - if level <= 0 { - return 0, 0, - errors.Errorf("ERROR: compression level(%v) must be greater than zero", level) - } - } else if len(cStrSplit) > 2 { - return 0, 0, errors.Errorf("ERROR: Invalid badger.compression argument") - } - switch cType { - case "zstd": - return options.ZSTD, level, nil - case "snappy": - return options.Snappy, 0, nil - case "none": - return options.None, 0, nil - } - return 0, 0, errors.Errorf("ERROR: compression type (%s) invalid", cType) -} - -// generateSuperFlag generates an identical SuperFlag string from the provided Options. -func generateSuperFlag(options Options) string { - superflag := "" - v := reflect.ValueOf(&options).Elem() - optionsStruct := v.Type() - for i := 0; i < v.NumField(); i++ { - if field := v.Field(i); field.CanInterface() { - name := strings.ToLower(optionsStruct.Field(i).Name) - kind := v.Field(i).Kind() - switch kind { - case reflect.Bool: - superflag += name + "=" - superflag += fmt.Sprintf("%v; ", field.Bool()) - case reflect.Int, reflect.Int64: - superflag += name + "=" - superflag += fmt.Sprintf("%v; ", field.Int()) - case reflect.Uint32, reflect.Uint64: - superflag += name + "=" - superflag += fmt.Sprintf("%v; ", field.Uint()) - case reflect.Float64: - superflag += name + "=" - superflag += fmt.Sprintf("%v; ", field.Float()) - case reflect.String: - superflag += name + "=" - superflag += fmt.Sprintf("%v; ", field.String()) - default: - continue - } - } - } - return superflag -} - -// FromSuperFlag fills Options fields for each flag within the superflag. For -// example, replacing the default Options.NumGoroutines: -// -// options := FromSuperFlag("numgoroutines=4", DefaultOptions("")) -// -// It's important to note that if you pass an empty Options struct, FromSuperFlag -// will not fill it with default values. FromSuperFlag only writes to the fields -// present within the superflag string (case insensitive). -// -// It specially handles compression subflag. -// Valid options are {none,snappy,zstd:} -// Example: compression=zstd:3; -// Unsupported: Options.Logger, Options.EncryptionKey -func (opt Options) FromSuperFlag(superflag string) Options { - // currentOptions act as a default value for the options superflag. - currentOptions := generateSuperFlag(opt) - currentOptions += "compression=;" - - flags := z.NewSuperFlag(superflag).MergeAndCheckDefault(currentOptions) - v := reflect.ValueOf(&opt).Elem() - optionsStruct := v.Type() - for i := 0; i < v.NumField(); i++ { - // only iterate over exported fields - if field := v.Field(i); field.CanInterface() { - // z.SuperFlag stores keys as lowercase, keep everything case - // insensitive - name := strings.ToLower(optionsStruct.Field(i).Name) - if name == "compression" { - // We will specially handle this later. Skip it here. - continue - } - kind := v.Field(i).Kind() - switch kind { - case reflect.Bool: - field.SetBool(flags.GetBool(name)) - case reflect.Int, reflect.Int64: - field.SetInt(flags.GetInt64(name)) - case reflect.Uint32, reflect.Uint64: - field.SetUint(uint64(flags.GetUint64(name))) - case reflect.Float64: - field.SetFloat(flags.GetFloat64(name)) - case reflect.String: - field.SetString(flags.GetString(name)) - } - } - } - - // Only update the options for special flags that were present in the input superflag. - inputFlag := z.NewSuperFlag(superflag) - if inputFlag.Has("compression") { - ctype, clevel, err := parseCompression(flags.GetString("compression")) - switch err { - case nil: - opt.Compression = ctype - opt.ZSTDCompressionLevel = clevel - default: - ctype = options.CompressionType(flags.GetUint32("compression")) - y.AssertTruef(ctype <= 2, "ERROR: Invalid format or compression type. Got: %s", - flags.GetString("compression")) - opt.Compression = ctype - } - } - - return opt -} - -// WithDir returns a new Options value with Dir set to the given value. -// -// Dir is the path of the directory where key data will be stored in. -// If it doesn't exist, Badger will try to create it for you. -// This is set automatically to be the path given to `DefaultOptions`. -func (opt Options) WithDir(val string) Options { - opt.Dir = val - return opt -} - -// WithValueDir returns a new Options value with ValueDir set to the given value. -// -// ValueDir is the path of the directory where value data will be stored in. -// If it doesn't exist, Badger will try to create it for you. -// This is set automatically to be the path given to `DefaultOptions`. -func (opt Options) WithValueDir(val string) Options { - opt.ValueDir = val - return opt -} - -// WithSyncWrites returns a new Options value with SyncWrites set to the given value. -// -// Badger does all writes via mmap. So, all writes can survive process crashes or k8s environments -// with SyncWrites set to false. -// -// When set to true, Badger would call an additional msync after writes to flush mmap buffer over to -// disk to survive hard reboots. Most users of Badger should not need to do this. -// -// The default value of SyncWrites is false. -func (opt Options) WithSyncWrites(val bool) Options { - opt.SyncWrites = val - return opt -} - -// WithNumVersionsToKeep returns a new Options value with NumVersionsToKeep set to the given value. -// -// NumVersionsToKeep sets how many versions to keep per key at most. -// -// The default value of NumVersionsToKeep is 1. -func (opt Options) WithNumVersionsToKeep(val int) Options { - opt.NumVersionsToKeep = val - return opt -} - -// WithNumGoroutines sets the number of goroutines to be used in Stream. -// -// The default value of NumGoroutines is 8. -func (opt Options) WithNumGoroutines(val int) Options { - opt.NumGoroutines = val - return opt -} - -// WithReadOnly returns a new Options value with ReadOnly set to the given value. -// -// When ReadOnly is true the DB will be opened on read-only mode. -// Multiple processes can open the same Badger DB. -// Note: if the DB being opened had crashed before and has vlog data to be replayed, -// ReadOnly will cause Open to fail with an appropriate message. -// -// The default value of ReadOnly is false. -func (opt Options) WithReadOnly(val bool) Options { - opt.ReadOnly = val - return opt -} - -// WithMetricsEnabled returns a new Options value with MetricsEnabled set to the given value. -// -// When MetricsEnabled is set to false, then the DB will be opened and no badger metrics -// will be logged. Metrics are defined in metric.go file. -// -// This flag is useful for use cases like in Dgraph where we open temporary badger instances to -// index data. In those cases we don't want badger metrics to be polluted with the noise from -// those temporary instances. -// -// Default value is set to true -func (opt Options) WithMetricsEnabled(val bool) Options { - opt.MetricsEnabled = val - return opt -} - -// WithLogger returns a new Options value with Logger set to the given value. -// -// Logger provides a way to configure what logger each value of badger.DB uses. -// -// The default value of Logger writes to stderr using the log package from the Go standard library. -func (opt Options) WithLogger(val Logger) Options { - opt.Logger = val - return opt -} - -// WithLoggingLevel returns a new Options value with logging level of the -// default logger set to the given value. -// LoggingLevel sets the level of logging. It should be one of DEBUG, INFO, -// WARNING or ERROR levels. -// -// The default value of LoggingLevel is INFO. -func (opt Options) WithLoggingLevel(val loggingLevel) Options { - opt.Logger = defaultLogger(val) - return opt -} - -// WithBaseTableSize returns a new Options value with MaxTableSize set to the given value. -// -// BaseTableSize sets the maximum size in bytes for LSM table or file in the base level. -// -// The default value of BaseTableSize is 2MB. -func (opt Options) WithBaseTableSize(val int64) Options { - opt.BaseTableSize = val - return opt -} - -// WithLevelSizeMultiplier returns a new Options value with LevelSizeMultiplier set to the given -// value. -// -// LevelSizeMultiplier sets the ratio between the maximum sizes of contiguous levels in the LSM. -// Once a level grows to be larger than this ratio allowed, the compaction process will be -// triggered. -// -// The default value of LevelSizeMultiplier is 10. -func (opt Options) WithLevelSizeMultiplier(val int) Options { - opt.LevelSizeMultiplier = val - return opt -} - -// WithMaxLevels returns a new Options value with MaxLevels set to the given value. -// -// Maximum number of levels of compaction allowed in the LSM. -// -// The default value of MaxLevels is 7. -func (opt Options) WithMaxLevels(val int) Options { - opt.MaxLevels = val - return opt -} - -// WithValueThreshold returns a new Options value with ValueThreshold set to the given value. -// -// ValueThreshold sets the threshold used to decide whether a value is stored directly in the LSM -// tree or separately in the log value files. -// -// The default value of ValueThreshold is 1 MB, but LSMOnlyOptions sets it to maxValueThreshold. -func (opt Options) WithValueThreshold(val int64) Options { - opt.ValueThreshold = val - return opt -} - -// WithVLogPercentile returns a new Options value with ValLogPercentile set to given value. -// -// VLogPercentile with 0.0 means no dynamic thresholding is enabled. -// MinThreshold value will always act as the value threshold. -// -// VLogPercentile with value 0.99 means 99 percentile of value will be put in LSM tree -// and only 1 percent in vlog. The value threshold will be dynamically updated within the range of -// [ValueThreshold, Options.maxValueThreshold] -// -// Say VLogPercentile with 1.0 means threshold will eventually set to Options.maxValueThreshold -// -// The default value of VLogPercentile is 0.0. -func (opt Options) WithVLogPercentile(t float64) Options { - opt.VLogPercentile = t - return opt -} - -// WithNumMemtables returns a new Options value with NumMemtables set to the given value. -// -// NumMemtables sets the maximum number of tables to keep in memory before stalling. -// -// The default value of NumMemtables is 5. -func (opt Options) WithNumMemtables(val int) Options { - opt.NumMemtables = val - return opt -} - -// WithMemTableSize returns a new Options value with MemTableSize set to the given value. -// -// MemTableSize sets the maximum size in bytes for memtable table. -// -// The default value of MemTableSize is 64MB. -func (opt Options) WithMemTableSize(val int64) Options { - opt.MemTableSize = val - return opt -} - -// WithBloomFalsePositive returns a new Options value with BloomFalsePositive set -// to the given value. -// -// BloomFalsePositive sets the false positive probability of the bloom filter in any SSTable. -// Before reading a key from table, the bloom filter is checked for key existence. -// BloomFalsePositive might impact read performance of DB. Lower BloomFalsePositive value might -// consume more memory. -// -// The default value of BloomFalsePositive is 0.01. -// -// Setting this to 0 disables the bloom filter completely. -func (opt Options) WithBloomFalsePositive(val float64) Options { - opt.BloomFalsePositive = val - return opt -} - -// WithBlockSize returns a new Options value with BlockSize set to the given value. -// -// BlockSize sets the size of any block in SSTable. SSTable is divided into multiple blocks -// internally. Each block is compressed using prefix diff encoding. -// -// The default value of BlockSize is 4KB. -func (opt Options) WithBlockSize(val int) Options { - opt.BlockSize = val - return opt -} - -// WithNumLevelZeroTables sets the maximum number of Level 0 tables before compaction starts. -// -// The default value of NumLevelZeroTables is 5. -func (opt Options) WithNumLevelZeroTables(val int) Options { - opt.NumLevelZeroTables = val - return opt -} - -// WithNumLevelZeroTablesStall sets the number of Level 0 tables that once reached causes the DB to -// stall until compaction succeeds. -// -// The default value of NumLevelZeroTablesStall is 10. -func (opt Options) WithNumLevelZeroTablesStall(val int) Options { - opt.NumLevelZeroTablesStall = val - return opt -} - -// WithBaseLevelSize sets the maximum size target for the base level. -// -// The default value is 10MB. -func (opt Options) WithBaseLevelSize(val int64) Options { - opt.BaseLevelSize = val - return opt -} - -// WithValueLogFileSize sets the maximum size of a single value log file. -// -// The default value of ValueLogFileSize is 1GB. -func (opt Options) WithValueLogFileSize(val int64) Options { - opt.ValueLogFileSize = val - return opt -} - -// WithValueLogMaxEntries sets the maximum number of entries a value log file -// can hold approximately. A actual size limit of a value log file is the -// minimum of ValueLogFileSize and ValueLogMaxEntries. -// -// The default value of ValueLogMaxEntries is one million (1000000). -func (opt Options) WithValueLogMaxEntries(val uint32) Options { - opt.ValueLogMaxEntries = val - return opt -} - -// WithNumCompactors sets the number of compaction workers to run concurrently. Setting this to -// zero stops compactions, which could eventually cause writes to block forever. -// -// The default value of NumCompactors is 2. One is dedicated just for L0 and L1. -func (opt Options) WithNumCompactors(val int) Options { - opt.NumCompactors = val - return opt -} - -// WithCompactL0OnClose determines whether Level 0 should be compacted before closing the DB. This -// ensures that both reads and writes are efficient when the DB is opened later. -// -// The default value of CompactL0OnClose is false. -func (opt Options) WithCompactL0OnClose(val bool) Options { - opt.CompactL0OnClose = val - return opt -} - -// WithEncryptionKey is used to encrypt the data with AES. Type of AES is used based on the key -// size. For example 16 bytes will use AES-128. 24 bytes will use AES-192. 32 bytes will -// use AES-256. -func (opt Options) WithEncryptionKey(key []byte) Options { - opt.EncryptionKey = key - return opt -} - -// WithEncryptionKeyRotationDuration returns new Options value with the duration set to -// the given value. -// -// Key Registry will use this duration to create new keys. If the previous generated -// key exceed the given duration. Then the key registry will create new key. -func (opt Options) WithEncryptionKeyRotationDuration(d time.Duration) Options { - opt.EncryptionKeyRotationDuration = d - return opt -} - -// WithCompression is used to enable or disable compression. When compression is enabled, every -// block will be compressed using the specified algorithm. This option doesn't affect existing -// tables. Only the newly created tables will be compressed. -// -// The default compression algorithm used is zstd when built with Cgo. Without Cgo, the default is -// snappy. Compression is enabled by default. -func (opt Options) WithCompression(cType options.CompressionType) Options { - opt.Compression = cType - return opt -} - -// WithVerifyValueChecksum is used to set VerifyValueChecksum. When VerifyValueChecksum is set to -// true, checksum will be verified for every entry read from the value log. If the value is stored -// in SST (value size less than value threshold) then the checksum validation will not be done. -// -// The default value of VerifyValueChecksum is False. -func (opt Options) WithVerifyValueChecksum(val bool) Options { - opt.VerifyValueChecksum = val - return opt -} - -// WithChecksumVerificationMode returns a new Options value with ChecksumVerificationMode set to -// the given value. -// -// ChecksumVerificationMode indicates when the db should verify checksums for SSTable blocks. -// -// The default value of VerifyValueChecksum is options.NoVerification. -func (opt Options) WithChecksumVerificationMode(cvMode options.ChecksumVerificationMode) Options { - opt.ChecksumVerificationMode = cvMode - return opt -} - -// WithBlockCacheSize returns a new Options value with BlockCacheSize set to the given value. -// -// This value specifies how much data cache should hold in memory. A small size -// of cache means lower memory consumption and lookups/iterations would take -// longer. It is recommended to use a cache if you're using compression or encryption. -// If compression and encryption both are disabled, adding a cache will lead to -// unnecessary overhead which will affect the read performance. Setting size to -// zero disables the cache altogether. -// -// Default value of BlockCacheSize is zero. -func (opt Options) WithBlockCacheSize(size int64) Options { - opt.BlockCacheSize = size - return opt -} - -// WithInMemory returns a new Options value with Inmemory mode set to the given value. -// -// When badger is running in InMemory mode, everything is stored in memory. No value/sst files are -// created. In case of a crash all data will be lost. -func (opt Options) WithInMemory(b bool) Options { - opt.InMemory = b - return opt -} - -// WithZSTDCompressionLevel returns a new Options value with ZSTDCompressionLevel set -// to the given value. -// -// The ZSTD compression algorithm supports 20 compression levels. The higher the compression -// level, the better is the compression ratio but lower is the performance. Lower levels -// have better performance and higher levels have better compression ratios. -// We recommend using level 1 ZSTD Compression Level. Any level higher than 1 seems to -// deteriorate badger's performance. -// The following benchmarks were done on a 4 KB block size (default block size). The compression is -// ratio supposed to increase with increasing compression level but since the input for compression -// algorithm is small (4 KB), we don't get significant benefit at level 3. It is advised to write -// your own benchmarks before choosing a compression algorithm or level. -// -// NOTE: The benchmarks are with DataDog ZSTD that requires CGO. Hence, no longer valid. -// no_compression-16 10 502848865 ns/op 165.46 MB/s - -// zstd_compression/level_1-16 7 739037966 ns/op 112.58 MB/s 2.93 -// zstd_compression/level_3-16 7 756950250 ns/op 109.91 MB/s 2.72 -// zstd_compression/level_15-16 1 11135686219 ns/op 7.47 MB/s 4.38 -// Benchmark code can be found in table/builder_test.go file -func (opt Options) WithZSTDCompressionLevel(cLevel int) Options { - opt.ZSTDCompressionLevel = cLevel - return opt -} - -// WithBypassLockGuard returns a new Options value with BypassLockGuard -// set to the given value. -// -// When BypassLockGuard option is set, badger will not acquire a lock on the -// directory. This could lead to data corruption if multiple badger instances -// write to the same data directory. Use this option with caution. -// -// The default value of BypassLockGuard is false. -func (opt Options) WithBypassLockGuard(b bool) Options { - opt.BypassLockGuard = b - return opt -} - -// WithIndexCacheSize returns a new Options value with IndexCacheSize set to -// the given value. -// -// This value specifies how much memory should be used by table indices. These -// indices include the block offsets and the bloomfilters. Badger uses bloom -// filters to speed up lookups. Each table has its own bloom -// filter and each bloom filter is approximately of 5 MB. -// -// Zero value for IndexCacheSize means all the indices will be kept in -// memory and the cache is disabled. -// -// The default value of IndexCacheSize is 0 which means all indices are kept in -// memory. -func (opt Options) WithIndexCacheSize(size int64) Options { - opt.IndexCacheSize = size - return opt -} - -// WithDetectConflicts returns a new Options value with DetectConflicts set to the given value. -// -// Detect conflicts options determines if the transactions would be checked for -// conflicts before committing them. When this option is set to false -// (detectConflicts=false) badger can process transactions at a higher rate. -// Setting this options to false might be useful when the user application -// deals with conflict detection and resolution. -// -// The default value of Detect conflicts is True. -func (opt Options) WithDetectConflicts(b bool) Options { - opt.DetectConflicts = b - return opt -} - -// WithNamespaceOffset returns a new Options value with NamespaceOffset set to the given value. DB -// will expect the namespace in each key at the 8 bytes starting from NamespaceOffset. A negative -// value means that namespace is not stored in the key. -// -// The default value for NamespaceOffset is -1. -func (opt Options) WithNamespaceOffset(offset int) Options { - opt.NamespaceOffset = offset - return opt -} - -func (opt Options) getFileFlags() int { - var flags int - // opt.SyncWrites would be using msync to sync. All writes go through mmap. - if opt.ReadOnly { - flags |= os.O_RDONLY - } else { - flags |= os.O_RDWR - } - return flags -} diff --git a/vendor/github.com/dgraph-io/badger/v3/options/options.go b/vendor/github.com/dgraph-io/badger/v3/options/options.go deleted file mode 100644 index e5ee932c0c..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/options/options.go +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package options - -// ChecksumVerificationMode tells when should DB verify checksum for SSTable blocks. -type ChecksumVerificationMode int - -const ( - // NoVerification indicates DB should not verify checksum for SSTable blocks. - NoVerification ChecksumVerificationMode = iota - // OnTableRead indicates checksum should be verified while opening SSTtable. - OnTableRead - // OnBlockRead indicates checksum should be verified on every SSTable block read. - OnBlockRead - // OnTableAndBlockRead indicates checksum should be verified - // on SSTable opening and on every block read. - OnTableAndBlockRead -) - -// CompressionType specifies how a block should be compressed. -type CompressionType uint32 - -const ( - // None mode indicates that a block is not compressed. - None CompressionType = 0 - // Snappy mode indicates that a block is compressed using Snappy algorithm. - Snappy CompressionType = 1 - // ZSTD mode indicates that a block is compressed using ZSTD algorithm. - ZSTD CompressionType = 2 -) diff --git a/vendor/github.com/dgraph-io/badger/v3/pb/badgerpb3.pb.go b/vendor/github.com/dgraph-io/badger/v3/pb/badgerpb3.pb.go deleted file mode 100644 index 927878ca03..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/pb/badgerpb3.pb.go +++ /dev/null @@ -1,2164 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: badgerpb3.proto - -package pb - -import ( - fmt "fmt" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type EncryptionAlgo int32 - -const ( - EncryptionAlgo_aes EncryptionAlgo = 0 -) - -var EncryptionAlgo_name = map[int32]string{ - 0: "aes", -} - -var EncryptionAlgo_value = map[string]int32{ - "aes": 0, -} - -func (x EncryptionAlgo) String() string { - return proto.EnumName(EncryptionAlgo_name, int32(x)) -} - -func (EncryptionAlgo) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_6d729c99bbc38987, []int{0} -} - -type ManifestChange_Operation int32 - -const ( - ManifestChange_CREATE ManifestChange_Operation = 0 - ManifestChange_DELETE ManifestChange_Operation = 1 -) - -var ManifestChange_Operation_name = map[int32]string{ - 0: "CREATE", - 1: "DELETE", -} - -var ManifestChange_Operation_value = map[string]int32{ - "CREATE": 0, - "DELETE": 1, -} - -func (x ManifestChange_Operation) String() string { - return proto.EnumName(ManifestChange_Operation_name, int32(x)) -} - -func (ManifestChange_Operation) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_6d729c99bbc38987, []int{3, 0} -} - -type Checksum_Algorithm int32 - -const ( - Checksum_CRC32C Checksum_Algorithm = 0 - Checksum_XXHash64 Checksum_Algorithm = 1 -) - -var Checksum_Algorithm_name = map[int32]string{ - 0: "CRC32C", - 1: "XXHash64", -} - -var Checksum_Algorithm_value = map[string]int32{ - "CRC32C": 0, - "XXHash64": 1, -} - -func (x Checksum_Algorithm) String() string { - return proto.EnumName(Checksum_Algorithm_name, int32(x)) -} - -func (Checksum_Algorithm) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_6d729c99bbc38987, []int{4, 0} -} - -type KV struct { - Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - UserMeta []byte `protobuf:"bytes,3,opt,name=user_meta,json=userMeta,proto3" json:"user_meta,omitempty"` - Version uint64 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` - ExpiresAt uint64 `protobuf:"varint,5,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` - Meta []byte `protobuf:"bytes,6,opt,name=meta,proto3" json:"meta,omitempty"` - // Stream id is used to identify which stream the KV came from. - StreamId uint32 `protobuf:"varint,10,opt,name=stream_id,json=streamId,proto3" json:"stream_id,omitempty"` - // Stream done is used to indicate end of stream. - StreamDone bool `protobuf:"varint,11,opt,name=stream_done,json=streamDone,proto3" json:"stream_done,omitempty"` -} - -func (m *KV) Reset() { *m = KV{} } -func (m *KV) String() string { return proto.CompactTextString(m) } -func (*KV) ProtoMessage() {} -func (*KV) Descriptor() ([]byte, []int) { - return fileDescriptor_6d729c99bbc38987, []int{0} -} -func (m *KV) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *KV) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_KV.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *KV) XXX_Merge(src proto.Message) { - xxx_messageInfo_KV.Merge(m, src) -} -func (m *KV) XXX_Size() int { - return m.Size() -} -func (m *KV) XXX_DiscardUnknown() { - xxx_messageInfo_KV.DiscardUnknown(m) -} - -var xxx_messageInfo_KV proto.InternalMessageInfo - -func (m *KV) GetKey() []byte { - if m != nil { - return m.Key - } - return nil -} - -func (m *KV) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (m *KV) GetUserMeta() []byte { - if m != nil { - return m.UserMeta - } - return nil -} - -func (m *KV) GetVersion() uint64 { - if m != nil { - return m.Version - } - return 0 -} - -func (m *KV) GetExpiresAt() uint64 { - if m != nil { - return m.ExpiresAt - } - return 0 -} - -func (m *KV) GetMeta() []byte { - if m != nil { - return m.Meta - } - return nil -} - -func (m *KV) GetStreamId() uint32 { - if m != nil { - return m.StreamId - } - return 0 -} - -func (m *KV) GetStreamDone() bool { - if m != nil { - return m.StreamDone - } - return false -} - -type KVList struct { - Kv []*KV `protobuf:"bytes,1,rep,name=kv,proto3" json:"kv,omitempty"` - // alloc_ref used internally for memory management. - AllocRef uint64 `protobuf:"varint,10,opt,name=alloc_ref,json=allocRef,proto3" json:"alloc_ref,omitempty"` -} - -func (m *KVList) Reset() { *m = KVList{} } -func (m *KVList) String() string { return proto.CompactTextString(m) } -func (*KVList) ProtoMessage() {} -func (*KVList) Descriptor() ([]byte, []int) { - return fileDescriptor_6d729c99bbc38987, []int{1} -} -func (m *KVList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *KVList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_KVList.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *KVList) XXX_Merge(src proto.Message) { - xxx_messageInfo_KVList.Merge(m, src) -} -func (m *KVList) XXX_Size() int { - return m.Size() -} -func (m *KVList) XXX_DiscardUnknown() { - xxx_messageInfo_KVList.DiscardUnknown(m) -} - -var xxx_messageInfo_KVList proto.InternalMessageInfo - -func (m *KVList) GetKv() []*KV { - if m != nil { - return m.Kv - } - return nil -} - -func (m *KVList) GetAllocRef() uint64 { - if m != nil { - return m.AllocRef - } - return 0 -} - -type ManifestChangeSet struct { - // A set of changes that are applied atomically. - Changes []*ManifestChange `protobuf:"bytes,1,rep,name=changes,proto3" json:"changes,omitempty"` -} - -func (m *ManifestChangeSet) Reset() { *m = ManifestChangeSet{} } -func (m *ManifestChangeSet) String() string { return proto.CompactTextString(m) } -func (*ManifestChangeSet) ProtoMessage() {} -func (*ManifestChangeSet) Descriptor() ([]byte, []int) { - return fileDescriptor_6d729c99bbc38987, []int{2} -} -func (m *ManifestChangeSet) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ManifestChangeSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ManifestChangeSet.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ManifestChangeSet) XXX_Merge(src proto.Message) { - xxx_messageInfo_ManifestChangeSet.Merge(m, src) -} -func (m *ManifestChangeSet) XXX_Size() int { - return m.Size() -} -func (m *ManifestChangeSet) XXX_DiscardUnknown() { - xxx_messageInfo_ManifestChangeSet.DiscardUnknown(m) -} - -var xxx_messageInfo_ManifestChangeSet proto.InternalMessageInfo - -func (m *ManifestChangeSet) GetChanges() []*ManifestChange { - if m != nil { - return m.Changes - } - return nil -} - -type ManifestChange struct { - Id uint64 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` - Op ManifestChange_Operation `protobuf:"varint,2,opt,name=Op,proto3,enum=badgerpb3.ManifestChange_Operation" json:"Op,omitempty"` - Level uint32 `protobuf:"varint,3,opt,name=Level,proto3" json:"Level,omitempty"` - KeyId uint64 `protobuf:"varint,4,opt,name=key_id,json=keyId,proto3" json:"key_id,omitempty"` - EncryptionAlgo EncryptionAlgo `protobuf:"varint,5,opt,name=encryption_algo,json=encryptionAlgo,proto3,enum=badgerpb3.EncryptionAlgo" json:"encryption_algo,omitempty"` - Compression uint32 `protobuf:"varint,6,opt,name=compression,proto3" json:"compression,omitempty"` -} - -func (m *ManifestChange) Reset() { *m = ManifestChange{} } -func (m *ManifestChange) String() string { return proto.CompactTextString(m) } -func (*ManifestChange) ProtoMessage() {} -func (*ManifestChange) Descriptor() ([]byte, []int) { - return fileDescriptor_6d729c99bbc38987, []int{3} -} -func (m *ManifestChange) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ManifestChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ManifestChange.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ManifestChange) XXX_Merge(src proto.Message) { - xxx_messageInfo_ManifestChange.Merge(m, src) -} -func (m *ManifestChange) XXX_Size() int { - return m.Size() -} -func (m *ManifestChange) XXX_DiscardUnknown() { - xxx_messageInfo_ManifestChange.DiscardUnknown(m) -} - -var xxx_messageInfo_ManifestChange proto.InternalMessageInfo - -func (m *ManifestChange) GetId() uint64 { - if m != nil { - return m.Id - } - return 0 -} - -func (m *ManifestChange) GetOp() ManifestChange_Operation { - if m != nil { - return m.Op - } - return ManifestChange_CREATE -} - -func (m *ManifestChange) GetLevel() uint32 { - if m != nil { - return m.Level - } - return 0 -} - -func (m *ManifestChange) GetKeyId() uint64 { - if m != nil { - return m.KeyId - } - return 0 -} - -func (m *ManifestChange) GetEncryptionAlgo() EncryptionAlgo { - if m != nil { - return m.EncryptionAlgo - } - return EncryptionAlgo_aes -} - -func (m *ManifestChange) GetCompression() uint32 { - if m != nil { - return m.Compression - } - return 0 -} - -type Checksum struct { - Algo Checksum_Algorithm `protobuf:"varint,1,opt,name=algo,proto3,enum=badgerpb3.Checksum_Algorithm" json:"algo,omitempty"` - Sum uint64 `protobuf:"varint,2,opt,name=sum,proto3" json:"sum,omitempty"` -} - -func (m *Checksum) Reset() { *m = Checksum{} } -func (m *Checksum) String() string { return proto.CompactTextString(m) } -func (*Checksum) ProtoMessage() {} -func (*Checksum) Descriptor() ([]byte, []int) { - return fileDescriptor_6d729c99bbc38987, []int{4} -} -func (m *Checksum) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Checksum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Checksum.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Checksum) XXX_Merge(src proto.Message) { - xxx_messageInfo_Checksum.Merge(m, src) -} -func (m *Checksum) XXX_Size() int { - return m.Size() -} -func (m *Checksum) XXX_DiscardUnknown() { - xxx_messageInfo_Checksum.DiscardUnknown(m) -} - -var xxx_messageInfo_Checksum proto.InternalMessageInfo - -func (m *Checksum) GetAlgo() Checksum_Algorithm { - if m != nil { - return m.Algo - } - return Checksum_CRC32C -} - -func (m *Checksum) GetSum() uint64 { - if m != nil { - return m.Sum - } - return 0 -} - -type DataKey struct { - KeyId uint64 `protobuf:"varint,1,opt,name=key_id,json=keyId,proto3" json:"key_id,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` - Iv []byte `protobuf:"bytes,3,opt,name=iv,proto3" json:"iv,omitempty"` - CreatedAt int64 `protobuf:"varint,4,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` -} - -func (m *DataKey) Reset() { *m = DataKey{} } -func (m *DataKey) String() string { return proto.CompactTextString(m) } -func (*DataKey) ProtoMessage() {} -func (*DataKey) Descriptor() ([]byte, []int) { - return fileDescriptor_6d729c99bbc38987, []int{5} -} -func (m *DataKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DataKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DataKey.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *DataKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_DataKey.Merge(m, src) -} -func (m *DataKey) XXX_Size() int { - return m.Size() -} -func (m *DataKey) XXX_DiscardUnknown() { - xxx_messageInfo_DataKey.DiscardUnknown(m) -} - -var xxx_messageInfo_DataKey proto.InternalMessageInfo - -func (m *DataKey) GetKeyId() uint64 { - if m != nil { - return m.KeyId - } - return 0 -} - -func (m *DataKey) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -func (m *DataKey) GetIv() []byte { - if m != nil { - return m.Iv - } - return nil -} - -func (m *DataKey) GetCreatedAt() int64 { - if m != nil { - return m.CreatedAt - } - return 0 -} - -type Match struct { - Prefix []byte `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` - IgnoreBytes string `protobuf:"bytes,2,opt,name=ignore_bytes,json=ignoreBytes,proto3" json:"ignore_bytes,omitempty"` -} - -func (m *Match) Reset() { *m = Match{} } -func (m *Match) String() string { return proto.CompactTextString(m) } -func (*Match) ProtoMessage() {} -func (*Match) Descriptor() ([]byte, []int) { - return fileDescriptor_6d729c99bbc38987, []int{6} -} -func (m *Match) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Match) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Match.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Match) XXX_Merge(src proto.Message) { - xxx_messageInfo_Match.Merge(m, src) -} -func (m *Match) XXX_Size() int { - return m.Size() -} -func (m *Match) XXX_DiscardUnknown() { - xxx_messageInfo_Match.DiscardUnknown(m) -} - -var xxx_messageInfo_Match proto.InternalMessageInfo - -func (m *Match) GetPrefix() []byte { - if m != nil { - return m.Prefix - } - return nil -} - -func (m *Match) GetIgnoreBytes() string { - if m != nil { - return m.IgnoreBytes - } - return "" -} - -func init() { - proto.RegisterEnum("badgerpb3.EncryptionAlgo", EncryptionAlgo_name, EncryptionAlgo_value) - proto.RegisterEnum("badgerpb3.ManifestChange_Operation", ManifestChange_Operation_name, ManifestChange_Operation_value) - proto.RegisterEnum("badgerpb3.Checksum_Algorithm", Checksum_Algorithm_name, Checksum_Algorithm_value) - proto.RegisterType((*KV)(nil), "badgerpb3.KV") - proto.RegisterType((*KVList)(nil), "badgerpb3.KVList") - proto.RegisterType((*ManifestChangeSet)(nil), "badgerpb3.ManifestChangeSet") - proto.RegisterType((*ManifestChange)(nil), "badgerpb3.ManifestChange") - proto.RegisterType((*Checksum)(nil), "badgerpb3.Checksum") - proto.RegisterType((*DataKey)(nil), "badgerpb3.DataKey") - proto.RegisterType((*Match)(nil), "badgerpb3.Match") -} - -func init() { proto.RegisterFile("badgerpb3.proto", fileDescriptor_6d729c99bbc38987) } - -var fileDescriptor_6d729c99bbc38987 = []byte{ - // 651 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0x4d, 0x6b, 0xdb, 0x40, - 0x10, 0xf5, 0xca, 0xf2, 0xd7, 0x38, 0x71, 0xdc, 0xa5, 0x2d, 0x0a, 0x25, 0xae, 0xa3, 0x50, 0x30, - 0x85, 0xda, 0x34, 0x2e, 0xbd, 0xf4, 0xe4, 0x2f, 0x88, 0x71, 0x42, 0x60, 0x1b, 0x42, 0xe8, 0xc5, - 0xac, 0xa5, 0xb1, 0x2d, 0x6c, 0x4b, 0x62, 0xb5, 0x16, 0xf1, 0x8f, 0x28, 0xf4, 0x67, 0xf5, 0x98, - 0x43, 0x0f, 0x3d, 0x96, 0xe4, 0x8f, 0x94, 0x5d, 0x29, 0xae, 0x7d, 0xe8, 0x6d, 0xe6, 0xcd, 0x68, - 0xde, 0xe8, 0xbd, 0x91, 0xe0, 0x68, 0xc2, 0xdd, 0x19, 0x8a, 0x70, 0xd2, 0x6e, 0x86, 0x22, 0x90, - 0x01, 0x2d, 0x6d, 0x01, 0xfb, 0x17, 0x01, 0x63, 0x74, 0x4b, 0xab, 0x90, 0x5d, 0xe0, 0xc6, 0x22, - 0x75, 0xd2, 0x38, 0x60, 0x2a, 0xa4, 0x2f, 0x21, 0x17, 0xf3, 0xe5, 0x1a, 0x2d, 0x43, 0x63, 0x49, - 0x42, 0xdf, 0x40, 0x69, 0x1d, 0xa1, 0x18, 0xaf, 0x50, 0x72, 0x2b, 0xab, 0x2b, 0x45, 0x05, 0x5c, - 0xa1, 0xe4, 0xd4, 0x82, 0x42, 0x8c, 0x22, 0xf2, 0x02, 0xdf, 0x32, 0xeb, 0xa4, 0x61, 0xb2, 0xe7, - 0x94, 0x9e, 0x00, 0xe0, 0x7d, 0xe8, 0x09, 0x8c, 0xc6, 0x5c, 0x5a, 0x39, 0x5d, 0x2c, 0xa5, 0x48, - 0x47, 0x52, 0x0a, 0xa6, 0x1e, 0x98, 0xd7, 0x03, 0x75, 0xac, 0x98, 0x22, 0x29, 0x90, 0xaf, 0xc6, - 0x9e, 0x6b, 0x41, 0x9d, 0x34, 0x0e, 0x59, 0x31, 0x01, 0x86, 0x2e, 0x7d, 0x0b, 0xe5, 0xb4, 0xe8, - 0x06, 0x3e, 0x5a, 0xe5, 0x3a, 0x69, 0x14, 0x19, 0x24, 0x50, 0x3f, 0xf0, 0xd1, 0xee, 0x43, 0x7e, - 0x74, 0x7b, 0xe9, 0x45, 0x92, 0x9e, 0x80, 0xb1, 0x88, 0x2d, 0x52, 0xcf, 0x36, 0xca, 0xe7, 0x87, - 0xcd, 0x7f, 0x4a, 0x8c, 0x6e, 0x99, 0xb1, 0x88, 0x15, 0x0d, 0x5f, 0x2e, 0x03, 0x67, 0x2c, 0x70, - 0xaa, 0x69, 0x4c, 0x56, 0xd4, 0x00, 0xc3, 0xa9, 0x7d, 0x01, 0x2f, 0xae, 0xb8, 0xef, 0x4d, 0x31, - 0x92, 0xbd, 0x39, 0xf7, 0x67, 0xf8, 0x15, 0x25, 0x6d, 0x43, 0xc1, 0xd1, 0x49, 0x94, 0x4e, 0x3d, - 0xde, 0x99, 0xba, 0xdf, 0xce, 0x9e, 0x3b, 0xed, 0xef, 0x06, 0x54, 0xf6, 0x6b, 0xb4, 0x02, 0xc6, - 0xd0, 0xd5, 0x8a, 0x9b, 0xcc, 0x18, 0xba, 0xb4, 0x0d, 0xc6, 0x75, 0xa8, 0xd5, 0xae, 0x9c, 0x9f, - 0xfd, 0x77, 0x64, 0xf3, 0x3a, 0x44, 0xc1, 0xa5, 0x17, 0xf8, 0xcc, 0xb8, 0x0e, 0x95, 0x4b, 0x97, - 0x18, 0xe3, 0x52, 0x7b, 0x71, 0xc8, 0x92, 0x84, 0xbe, 0x82, 0xfc, 0x02, 0x37, 0x4a, 0xb8, 0xc4, - 0x87, 0xdc, 0x02, 0x37, 0x43, 0x97, 0x76, 0xe1, 0x08, 0x7d, 0x47, 0x6c, 0x42, 0xf5, 0xf8, 0x98, - 0x2f, 0x67, 0x81, 0xb6, 0xa2, 0xb2, 0xf7, 0x06, 0x83, 0x6d, 0x47, 0x67, 0x39, 0x0b, 0x58, 0x05, - 0xf7, 0x72, 0x5a, 0x87, 0xb2, 0x13, 0xac, 0x42, 0x81, 0x91, 0xf6, 0x39, 0xaf, 0x69, 0x77, 0x21, - 0xfb, 0x0c, 0x4a, 0xdb, 0x1d, 0x29, 0x40, 0xbe, 0xc7, 0x06, 0x9d, 0x9b, 0x41, 0x35, 0xa3, 0xe2, - 0xfe, 0xe0, 0x72, 0x70, 0x33, 0xa8, 0x12, 0x3b, 0x86, 0x62, 0x6f, 0x8e, 0xce, 0x22, 0x5a, 0xaf, - 0xe8, 0x47, 0x30, 0xf5, 0x2e, 0x44, 0xef, 0x72, 0xb2, 0xb3, 0xcb, 0x73, 0x4b, 0x53, 0x51, 0x0b, - 0x4f, 0xce, 0x57, 0x4c, 0xb7, 0xaa, 0x73, 0x8d, 0xd6, 0x2b, 0x2d, 0x96, 0xc9, 0x54, 0x68, 0xbf, - 0x83, 0xd2, 0xb6, 0x29, 0x61, 0xed, 0xb5, 0xcf, 0x7b, 0xd5, 0x0c, 0x3d, 0x80, 0xe2, 0xdd, 0xdd, - 0x05, 0x8f, 0xe6, 0x9f, 0x3f, 0x55, 0x89, 0xed, 0x40, 0xa1, 0xcf, 0x25, 0x1f, 0xe1, 0x66, 0x47, - 0x24, 0xb2, 0x2b, 0x12, 0x05, 0xd3, 0xe5, 0x92, 0xa7, 0x67, 0xaf, 0x63, 0x65, 0x95, 0x17, 0xa7, - 0xe7, 0x6e, 0x78, 0xb1, 0x3a, 0x67, 0x47, 0x20, 0x97, 0xe8, 0xaa, 0x73, 0x56, 0x1a, 0x67, 0x59, - 0x29, 0x45, 0x3a, 0xd2, 0xee, 0x42, 0xee, 0x8a, 0x4b, 0x67, 0x4e, 0x5f, 0x43, 0x3e, 0x14, 0x38, - 0xf5, 0xee, 0xd3, 0x0f, 0x2b, 0xcd, 0xe8, 0x29, 0x1c, 0x78, 0x33, 0x3f, 0x10, 0x38, 0x9e, 0x6c, - 0x24, 0x46, 0x9a, 0xab, 0xc4, 0xca, 0x09, 0xd6, 0x55, 0xd0, 0xfb, 0x63, 0xa8, 0xec, 0x3b, 0x41, - 0x0b, 0x90, 0xe5, 0x18, 0x55, 0x33, 0xdd, 0x2f, 0x3f, 0x1f, 0x6b, 0xe4, 0xe1, 0xb1, 0x46, 0xfe, - 0x3c, 0xd6, 0xc8, 0x8f, 0xa7, 0x5a, 0xe6, 0xe1, 0xa9, 0x96, 0xf9, 0xfd, 0x54, 0xcb, 0x7c, 0x3b, - 0x9d, 0x79, 0x72, 0xbe, 0x9e, 0x34, 0x9d, 0x60, 0xd5, 0x72, 0x67, 0x82, 0x87, 0xf3, 0x0f, 0x5e, - 0xd0, 0x4a, 0xf4, 0x6c, 0xc5, 0xed, 0x56, 0x38, 0x99, 0xe4, 0xf5, 0x1f, 0xa0, 0xfd, 0x37, 0x00, - 0x00, 0xff, 0xff, 0xa2, 0x8d, 0xa8, 0xf5, 0x14, 0x04, 0x00, 0x00, -} - -func (m *KV) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *KV) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *KV) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.StreamDone { - i-- - if m.StreamDone { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x58 - } - if m.StreamId != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.StreamId)) - i-- - dAtA[i] = 0x50 - } - if len(m.Meta) > 0 { - i -= len(m.Meta) - copy(dAtA[i:], m.Meta) - i = encodeVarintBadgerpb3(dAtA, i, uint64(len(m.Meta))) - i-- - dAtA[i] = 0x32 - } - if m.ExpiresAt != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.ExpiresAt)) - i-- - dAtA[i] = 0x28 - } - if m.Version != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.Version)) - i-- - dAtA[i] = 0x20 - } - if len(m.UserMeta) > 0 { - i -= len(m.UserMeta) - copy(dAtA[i:], m.UserMeta) - i = encodeVarintBadgerpb3(dAtA, i, uint64(len(m.UserMeta))) - i-- - dAtA[i] = 0x1a - } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintBadgerpb3(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x12 - } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintBadgerpb3(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *KVList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *KVList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *KVList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.AllocRef != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.AllocRef)) - i-- - dAtA[i] = 0x50 - } - if len(m.Kv) > 0 { - for iNdEx := len(m.Kv) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Kv[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintBadgerpb3(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ManifestChangeSet) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ManifestChangeSet) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ManifestChangeSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Changes) > 0 { - for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintBadgerpb3(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ManifestChange) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ManifestChange) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ManifestChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Compression != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.Compression)) - i-- - dAtA[i] = 0x30 - } - if m.EncryptionAlgo != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.EncryptionAlgo)) - i-- - dAtA[i] = 0x28 - } - if m.KeyId != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.KeyId)) - i-- - dAtA[i] = 0x20 - } - if m.Level != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.Level)) - i-- - dAtA[i] = 0x18 - } - if m.Op != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.Op)) - i-- - dAtA[i] = 0x10 - } - if m.Id != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.Id)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Checksum) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Checksum) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Checksum) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Sum != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.Sum)) - i-- - dAtA[i] = 0x10 - } - if m.Algo != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.Algo)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *DataKey) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *DataKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DataKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.CreatedAt != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.CreatedAt)) - i-- - dAtA[i] = 0x20 - } - if len(m.Iv) > 0 { - i -= len(m.Iv) - copy(dAtA[i:], m.Iv) - i = encodeVarintBadgerpb3(dAtA, i, uint64(len(m.Iv))) - i-- - dAtA[i] = 0x1a - } - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintBadgerpb3(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x12 - } - if m.KeyId != 0 { - i = encodeVarintBadgerpb3(dAtA, i, uint64(m.KeyId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Match) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Match) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Match) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.IgnoreBytes) > 0 { - i -= len(m.IgnoreBytes) - copy(dAtA[i:], m.IgnoreBytes) - i = encodeVarintBadgerpb3(dAtA, i, uint64(len(m.IgnoreBytes))) - i-- - dAtA[i] = 0x12 - } - if len(m.Prefix) > 0 { - i -= len(m.Prefix) - copy(dAtA[i:], m.Prefix) - i = encodeVarintBadgerpb3(dAtA, i, uint64(len(m.Prefix))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintBadgerpb3(dAtA []byte, offset int, v uint64) int { - offset -= sovBadgerpb3(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *KV) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovBadgerpb3(uint64(l)) - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovBadgerpb3(uint64(l)) - } - l = len(m.UserMeta) - if l > 0 { - n += 1 + l + sovBadgerpb3(uint64(l)) - } - if m.Version != 0 { - n += 1 + sovBadgerpb3(uint64(m.Version)) - } - if m.ExpiresAt != 0 { - n += 1 + sovBadgerpb3(uint64(m.ExpiresAt)) - } - l = len(m.Meta) - if l > 0 { - n += 1 + l + sovBadgerpb3(uint64(l)) - } - if m.StreamId != 0 { - n += 1 + sovBadgerpb3(uint64(m.StreamId)) - } - if m.StreamDone { - n += 2 - } - return n -} - -func (m *KVList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Kv) > 0 { - for _, e := range m.Kv { - l = e.Size() - n += 1 + l + sovBadgerpb3(uint64(l)) - } - } - if m.AllocRef != 0 { - n += 1 + sovBadgerpb3(uint64(m.AllocRef)) - } - return n -} - -func (m *ManifestChangeSet) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Changes) > 0 { - for _, e := range m.Changes { - l = e.Size() - n += 1 + l + sovBadgerpb3(uint64(l)) - } - } - return n -} - -func (m *ManifestChange) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Id != 0 { - n += 1 + sovBadgerpb3(uint64(m.Id)) - } - if m.Op != 0 { - n += 1 + sovBadgerpb3(uint64(m.Op)) - } - if m.Level != 0 { - n += 1 + sovBadgerpb3(uint64(m.Level)) - } - if m.KeyId != 0 { - n += 1 + sovBadgerpb3(uint64(m.KeyId)) - } - if m.EncryptionAlgo != 0 { - n += 1 + sovBadgerpb3(uint64(m.EncryptionAlgo)) - } - if m.Compression != 0 { - n += 1 + sovBadgerpb3(uint64(m.Compression)) - } - return n -} - -func (m *Checksum) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Algo != 0 { - n += 1 + sovBadgerpb3(uint64(m.Algo)) - } - if m.Sum != 0 { - n += 1 + sovBadgerpb3(uint64(m.Sum)) - } - return n -} - -func (m *DataKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.KeyId != 0 { - n += 1 + sovBadgerpb3(uint64(m.KeyId)) - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovBadgerpb3(uint64(l)) - } - l = len(m.Iv) - if l > 0 { - n += 1 + l + sovBadgerpb3(uint64(l)) - } - if m.CreatedAt != 0 { - n += 1 + sovBadgerpb3(uint64(m.CreatedAt)) - } - return n -} - -func (m *Match) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Prefix) - if l > 0 { - n += 1 + l + sovBadgerpb3(uint64(l)) - } - l = len(m.IgnoreBytes) - if l > 0 { - n += 1 + l + sovBadgerpb3(uint64(l)) - } - return n -} - -func sovBadgerpb3(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozBadgerpb3(x uint64) (n int) { - return sovBadgerpb3(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *KV) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: KV: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: KV: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthBadgerpb3 - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthBadgerpb3 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthBadgerpb3 - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthBadgerpb3 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) - if m.Value == nil { - m.Value = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMeta", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthBadgerpb3 - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthBadgerpb3 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.UserMeta = append(m.UserMeta[:0], dAtA[iNdEx:postIndex]...) - if m.UserMeta == nil { - m.UserMeta = []byte{} - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - m.Version = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Version |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ExpiresAt", wireType) - } - m.ExpiresAt = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ExpiresAt |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Meta", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthBadgerpb3 - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthBadgerpb3 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Meta = append(m.Meta[:0], dAtA[iNdEx:postIndex]...) - if m.Meta == nil { - m.Meta = []byte{} - } - iNdEx = postIndex - case 10: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StreamId", wireType) - } - m.StreamId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.StreamId |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 11: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StreamDone", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.StreamDone = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipBadgerpb3(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthBadgerpb3 - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *KVList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: KVList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: KVList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kv", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthBadgerpb3 - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthBadgerpb3 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Kv = append(m.Kv, &KV{}) - if err := m.Kv[len(m.Kv)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllocRef", wireType) - } - m.AllocRef = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.AllocRef |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipBadgerpb3(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthBadgerpb3 - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ManifestChangeSet) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ManifestChangeSet: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ManifestChangeSet: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthBadgerpb3 - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthBadgerpb3 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Changes = append(m.Changes, &ManifestChange{}) - if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipBadgerpb3(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthBadgerpb3 - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ManifestChange) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ManifestChange: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ManifestChange: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - m.Id = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Id |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Op", wireType) - } - m.Op = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Op |= ManifestChange_Operation(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) - } - m.Level = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Level |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field KeyId", wireType) - } - m.KeyId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.KeyId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptionAlgo", wireType) - } - m.EncryptionAlgo = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EncryptionAlgo |= EncryptionAlgo(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Compression", wireType) - } - m.Compression = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Compression |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipBadgerpb3(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthBadgerpb3 - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Checksum) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Checksum: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Checksum: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Algo", wireType) - } - m.Algo = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Algo |= Checksum_Algorithm(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Sum", wireType) - } - m.Sum = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Sum |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipBadgerpb3(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthBadgerpb3 - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DataKey) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: DataKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DataKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field KeyId", wireType) - } - m.KeyId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.KeyId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthBadgerpb3 - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthBadgerpb3 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Iv", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthBadgerpb3 - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthBadgerpb3 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Iv = append(m.Iv[:0], dAtA[iNdEx:postIndex]...) - if m.Iv == nil { - m.Iv = []byte{} - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CreatedAt", wireType) - } - m.CreatedAt = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CreatedAt |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipBadgerpb3(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthBadgerpb3 - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Match) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Match: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Match: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Prefix", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthBadgerpb3 - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthBadgerpb3 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Prefix = append(m.Prefix[:0], dAtA[iNdEx:postIndex]...) - if m.Prefix == nil { - m.Prefix = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IgnoreBytes", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthBadgerpb3 - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthBadgerpb3 - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IgnoreBytes = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipBadgerpb3(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthBadgerpb3 - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipBadgerpb3(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowBadgerpb3 - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthBadgerpb3 - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupBadgerpb3 - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthBadgerpb3 - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthBadgerpb3 = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowBadgerpb3 = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupBadgerpb3 = fmt.Errorf("proto: unexpected end of group") -) diff --git a/vendor/github.com/dgraph-io/badger/v3/pb/badgerpb3.proto b/vendor/github.com/dgraph-io/badger/v3/pb/badgerpb3.proto deleted file mode 100644 index d0df21fb33..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/pb/badgerpb3.proto +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Use protos/gen.sh to generate .pb.go files. -syntax = "proto3"; - -package badgerpb3; - -option go_package = "github.com/dgraph-io/badger/v3/pb"; - -message KV { - bytes key = 1; - bytes value = 2; - bytes user_meta = 3; - uint64 version = 4; - uint64 expires_at = 5; - bytes meta = 6; - - // Stream id is used to identify which stream the KV came from. - uint32 stream_id = 10; - // Stream done is used to indicate end of stream. - bool stream_done = 11; -} - -message KVList { - repeated KV kv = 1; - - // alloc_ref used internally for memory management. - uint64 alloc_ref = 10; -} - -message ManifestChangeSet { - // A set of changes that are applied atomically. - repeated ManifestChange changes = 1; -} - -enum EncryptionAlgo { - aes = 0; -} - -message ManifestChange { - uint64 Id = 1; // Table ID. - enum Operation { - CREATE = 0; - DELETE = 1; - } - Operation Op = 2; - uint32 Level = 3; // Only used for CREATE. - uint64 key_id = 4; - EncryptionAlgo encryption_algo = 5; - uint32 compression = 6; // Only used for CREATE Op. -} - -message Checksum { - enum Algorithm { - CRC32C = 0; - XXHash64 = 1; - } - Algorithm algo = 1; // For storing type of Checksum algorithm used - uint64 sum = 2; -} - -message DataKey { - uint64 key_id = 1; - bytes data = 2; - bytes iv = 3; - int64 created_at = 4; -} - -message Match { - bytes prefix = 1; - string ignore_bytes = 2; // Comma separated with dash to represent ranges "1, 2-3, 4-7, 9" -} diff --git a/vendor/github.com/dgraph-io/badger/v3/pb/gen.sh b/vendor/github.com/dgraph-io/badger/v3/pb/gen.sh deleted file mode 100644 index e41208c9da..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/pb/gen.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -# Run this script from its directory, so that badgerpb2.proto is where it's expected to -# be. - -# You might need to go get -v github.com/gogo/protobuf/... -go get -v github.com/gogo/protobuf/protoc-gen-gogofaster -protoc --gogofaster_out=. --gogofaster_opt=paths=source_relative -I=. badgerpb3.proto diff --git a/vendor/github.com/dgraph-io/badger/v3/publisher.go b/vendor/github.com/dgraph-io/badger/v3/publisher.go deleted file mode 100644 index f4c31b2ea6..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/publisher.go +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "sync" - "sync/atomic" - - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/trie" - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" -) - -type subscriber struct { - id uint64 - matches []pb.Match - sendCh chan *pb.KVList - subCloser *z.Closer - // this will be atomic pointer which will be used to - // track whether the subscriber is active or not - active *uint64 -} - -type publisher struct { - sync.Mutex - pubCh chan requests - subscribers map[uint64]subscriber - nextID uint64 - indexer *trie.Trie -} - -func newPublisher() *publisher { - return &publisher{ - pubCh: make(chan requests, 1000), - subscribers: make(map[uint64]subscriber), - nextID: 0, - indexer: trie.NewTrie(), - } -} - -func (p *publisher) listenForUpdates(c *z.Closer) { - defer func() { - p.cleanSubscribers() - c.Done() - }() - slurp := func(batch requests) { - for { - select { - case reqs := <-p.pubCh: - batch = append(batch, reqs...) - default: - p.publishUpdates(batch) - return - } - } - } - for { - select { - case <-c.HasBeenClosed(): - return - case reqs := <-p.pubCh: - slurp(reqs) - } - } -} - -func (p *publisher) publishUpdates(reqs requests) { - p.Lock() - defer func() { - p.Unlock() - // Release all the request. - reqs.DecrRef() - }() - batchedUpdates := make(map[uint64]*pb.KVList) - for _, req := range reqs { - for _, e := range req.Entries { - ids := p.indexer.Get(e.Key) - if len(ids) == 0 { - continue - } - k := y.SafeCopy(nil, e.Key) - kv := &pb.KV{ - Key: y.ParseKey(k), - Value: y.SafeCopy(nil, e.Value), - Meta: []byte{e.UserMeta}, - ExpiresAt: e.ExpiresAt, - Version: y.ParseTs(k), - } - for id := range ids { - if _, ok := batchedUpdates[id]; !ok { - batchedUpdates[id] = &pb.KVList{} - } - batchedUpdates[id].Kv = append(batchedUpdates[id].Kv, kv) - } - } - } - - for id, kvs := range batchedUpdates { - if atomic.LoadUint64(p.subscribers[id].active) == 1 { - p.subscribers[id].sendCh <- kvs - } - } -} - -func (p *publisher) newSubscriber(c *z.Closer, matches []pb.Match) subscriber { - p.Lock() - defer p.Unlock() - ch := make(chan *pb.KVList, 1000) - id := p.nextID - // Increment next ID. - p.nextID++ - active := uint64(1) - s := subscriber{ - active: &active, - id: id, - matches: matches, - sendCh: ch, - subCloser: c, - } - p.subscribers[id] = s - for _, m := range matches { - p.indexer.AddMatch(m, id) - } - return s -} - -// cleanSubscribers stops all the subscribers. Ideally, It should be called while closing DB. -func (p *publisher) cleanSubscribers() { - p.Lock() - defer p.Unlock() - for id, s := range p.subscribers { - for _, m := range s.matches { - p.indexer.DeleteMatch(m, id) - } - delete(p.subscribers, id) - s.subCloser.SignalAndWait() - } -} - -func (p *publisher) deleteSubscriber(id uint64) { - p.Lock() - defer p.Unlock() - if s, ok := p.subscribers[id]; ok { - for _, m := range s.matches { - p.indexer.DeleteMatch(m, id) - } - } - delete(p.subscribers, id) -} - -func (p *publisher) sendUpdates(reqs requests) { - if p.noOfSubscribers() != 0 { - reqs.IncrRef() - p.pubCh <- reqs - } -} - -func (p *publisher) noOfSubscribers() int { - p.Lock() - defer p.Unlock() - return len(p.subscribers) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/skl/README.md b/vendor/github.com/dgraph-io/badger/v3/skl/README.md deleted file mode 100644 index e22e4590bb..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/skl/README.md +++ /dev/null @@ -1,113 +0,0 @@ -This is much better than `skiplist` and `slist`. - -``` -BenchmarkReadWrite/frac_0-8 3000000 537 ns/op -BenchmarkReadWrite/frac_1-8 3000000 503 ns/op -BenchmarkReadWrite/frac_2-8 3000000 492 ns/op -BenchmarkReadWrite/frac_3-8 3000000 475 ns/op -BenchmarkReadWrite/frac_4-8 3000000 440 ns/op -BenchmarkReadWrite/frac_5-8 5000000 442 ns/op -BenchmarkReadWrite/frac_6-8 5000000 380 ns/op -BenchmarkReadWrite/frac_7-8 5000000 338 ns/op -BenchmarkReadWrite/frac_8-8 5000000 294 ns/op -BenchmarkReadWrite/frac_9-8 10000000 268 ns/op -BenchmarkReadWrite/frac_10-8 100000000 26.3 ns/op -``` - -And even better than a simple map with read-write lock: - -``` -BenchmarkReadWriteMap/frac_0-8 2000000 774 ns/op -BenchmarkReadWriteMap/frac_1-8 2000000 647 ns/op -BenchmarkReadWriteMap/frac_2-8 3000000 605 ns/op -BenchmarkReadWriteMap/frac_3-8 3000000 603 ns/op -BenchmarkReadWriteMap/frac_4-8 3000000 556 ns/op -BenchmarkReadWriteMap/frac_5-8 3000000 472 ns/op -BenchmarkReadWriteMap/frac_6-8 3000000 476 ns/op -BenchmarkReadWriteMap/frac_7-8 3000000 457 ns/op -BenchmarkReadWriteMap/frac_8-8 5000000 444 ns/op -BenchmarkReadWriteMap/frac_9-8 5000000 361 ns/op -BenchmarkReadWriteMap/frac_10-8 10000000 212 ns/op -``` - -# Node Pooling - -Command used - -``` -rm -Rf tmp && /usr/bin/time -l ./populate -keys_mil 10 -``` - -For pprof results, we run without using /usr/bin/time. There are four runs below. - -Results seem to vary quite a bit between runs. - -## Before node pooling - -``` -1311.53MB of 1338.69MB total (97.97%) -Dropped 30 nodes (cum <= 6.69MB) -Showing top 10 nodes out of 37 (cum >= 12.50MB) - flat flat% sum% cum cum% - 523.04MB 39.07% 39.07% 523.04MB 39.07% github.com/dgraph-io/badger/skl.(*Skiplist).Put - 184.51MB 13.78% 52.85% 184.51MB 13.78% runtime.stringtoslicebyte - 166.01MB 12.40% 65.25% 689.04MB 51.47% github.com/dgraph-io/badger/mem.(*Table).Put - 165MB 12.33% 77.58% 165MB 12.33% runtime.convT2E - 116.92MB 8.73% 86.31% 116.92MB 8.73% bytes.makeSlice - 62.50MB 4.67% 90.98% 62.50MB 4.67% main.newValue - 34.50MB 2.58% 93.56% 34.50MB 2.58% github.com/dgraph-io/badger/table.(*BlockIterator).parseKV - 25.50MB 1.90% 95.46% 100.06MB 7.47% github.com/dgraph-io/badger/y.(*MergeIterator).Next - 21.06MB 1.57% 97.04% 21.06MB 1.57% github.com/dgraph-io/badger/table.(*Table).read - 12.50MB 0.93% 97.97% 12.50MB 0.93% github.com/dgraph-io/badger/table.header.Encode - - 128.31 real 329.37 user 17.11 sys -3355660288 maximum resident set size - 0 average shared memory size - 0 average unshared data size - 0 average unshared stack size - 2203080 page reclaims - 764 page faults - 0 swaps - 275 block input operations - 76 block output operations - 0 messages sent - 0 messages received - 0 signals received - 49173 voluntary context switches - 599922 involuntary context switches -``` - -## After node pooling - -``` -1963.13MB of 2026.09MB total (96.89%) -Dropped 29 nodes (cum <= 10.13MB) -Showing top 10 nodes out of 41 (cum >= 185.62MB) - flat flat% sum% cum cum% - 658.05MB 32.48% 32.48% 658.05MB 32.48% github.com/dgraph-io/badger/skl.glob..func1 - 297.51MB 14.68% 47.16% 297.51MB 14.68% runtime.convT2E - 257.51MB 12.71% 59.87% 257.51MB 12.71% runtime.stringtoslicebyte - 249.01MB 12.29% 72.16% 1007.06MB 49.70% github.com/dgraph-io/badger/mem.(*Table).Put - 142.43MB 7.03% 79.19% 142.43MB 7.03% bytes.makeSlice - 100MB 4.94% 84.13% 758.05MB 37.41% github.com/dgraph-io/badger/skl.newNode - 99.50MB 4.91% 89.04% 99.50MB 4.91% main.newValue - 75MB 3.70% 92.74% 75MB 3.70% github.com/dgraph-io/badger/table.(*BlockIterator).parseKV - 44.62MB 2.20% 94.94% 44.62MB 2.20% github.com/dgraph-io/badger/table.(*Table).read - 39.50MB 1.95% 96.89% 185.62MB 9.16% github.com/dgraph-io/badger/y.(*MergeIterator).Next - - 135.58 real 374.29 user 17.65 sys -3740614656 maximum resident set size - 0 average shared memory size - 0 average unshared data size - 0 average unshared stack size - 2276566 page reclaims - 770 page faults - 0 swaps - 128 block input operations - 90 block output operations - 0 messages sent - 0 messages received - 0 signals received - 46434 voluntary context switches - 597049 involuntary context switches -``` diff --git a/vendor/github.com/dgraph-io/badger/v3/skl/arena.go b/vendor/github.com/dgraph-io/badger/v3/skl/arena.go deleted file mode 100644 index facf07325d..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/skl/arena.go +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package skl - -import ( - "sync/atomic" - "unsafe" - - "github.com/dgraph-io/badger/v3/y" -) - -const ( - offsetSize = int(unsafe.Sizeof(uint32(0))) - - // Always align nodes on 64-bit boundaries, even on 32-bit architectures, - // so that the node.value field is 64-bit aligned. This is necessary because - // node.getValueOffset uses atomic.LoadUint64, which expects its input - // pointer to be 64-bit aligned. - nodeAlign = int(unsafe.Sizeof(uint64(0))) - 1 -) - -// Arena should be lock-free. -type Arena struct { - n uint32 - buf []byte -} - -// newArena returns a new arena. -func newArena(n int64) *Arena { - // Don't store data at position 0 in order to reserve offset=0 as a kind - // of nil pointer. - out := &Arena{ - n: 1, - buf: make([]byte, n), - } - return out -} - -func (s *Arena) size() int64 { - return int64(atomic.LoadUint32(&s.n)) -} - -// putNode allocates a node in the arena. The node is aligned on a pointer-sized -// boundary. The arena offset of the node is returned. -func (s *Arena) putNode(height int) uint32 { - // Compute the amount of the tower that will never be used, since the height - // is less than maxHeight. - unusedSize := (maxHeight - height) * offsetSize - - // Pad the allocation with enough bytes to ensure pointer alignment. - l := uint32(MaxNodeSize - unusedSize + nodeAlign) - n := atomic.AddUint32(&s.n, l) - y.AssertTruef(int(n) <= len(s.buf), - "Arena too small, toWrite:%d newTotal:%d limit:%d", - l, n, len(s.buf)) - - // Return the aligned offset. - m := (n - l + uint32(nodeAlign)) & ^uint32(nodeAlign) - return m -} - -// Put will *copy* val into arena. To make better use of this, reuse your input -// val buffer. Returns an offset into buf. User is responsible for remembering -// size of val. We could also store this size inside arena but the encoding and -// decoding will incur some overhead. -func (s *Arena) putVal(v y.ValueStruct) uint32 { - l := uint32(v.EncodedSize()) - n := atomic.AddUint32(&s.n, l) - y.AssertTruef(int(n) <= len(s.buf), - "Arena too small, toWrite:%d newTotal:%d limit:%d", - l, n, len(s.buf)) - m := n - l - v.Encode(s.buf[m:]) - return m -} - -func (s *Arena) putKey(key []byte) uint32 { - l := uint32(len(key)) - n := atomic.AddUint32(&s.n, l) - y.AssertTruef(int(n) <= len(s.buf), - "Arena too small, toWrite:%d newTotal:%d limit:%d", - l, n, len(s.buf)) - // m is the offset where you should write. - // n = new len - key len give you the offset at which you should write. - m := n - l - // Copy to buffer from m:n - y.AssertTrue(len(key) == copy(s.buf[m:n], key)) - return m -} - -// getNode returns a pointer to the node located at offset. If the offset is -// zero, then the nil node pointer is returned. -func (s *Arena) getNode(offset uint32) *node { - if offset == 0 { - return nil - } - - return (*node)(unsafe.Pointer(&s.buf[offset])) -} - -// getKey returns byte slice at offset. -func (s *Arena) getKey(offset uint32, size uint16) []byte { - return s.buf[offset : offset+uint32(size)] -} - -// getVal returns byte slice at offset. The given size should be just the value -// size and should NOT include the meta bytes. -func (s *Arena) getVal(offset uint32, size uint32) (ret y.ValueStruct) { - ret.Decode(s.buf[offset : offset+size]) - return -} - -// getNodeOffset returns the offset of node in the arena. If the node pointer is -// nil, then the zero offset is returned. -func (s *Arena) getNodeOffset(nd *node) uint32 { - if nd == nil { - return 0 - } - - return uint32(uintptr(unsafe.Pointer(nd)) - uintptr(unsafe.Pointer(&s.buf[0]))) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/skl/skl.go b/vendor/github.com/dgraph-io/badger/v3/skl/skl.go deleted file mode 100644 index a39d349210..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/skl/skl.go +++ /dev/null @@ -1,524 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* -Adapted from RocksDB inline skiplist. - -Key differences: -- No optimization for sequential inserts (no "prev"). -- No custom comparator. -- Support overwrites. This requires care when we see the same key when inserting. - For RocksDB or LevelDB, overwrites are implemented as a newer sequence number in the key, so - there is no need for values. We don't intend to support versioning. In-place updates of values - would be more efficient. -- We discard all non-concurrent code. -- We do not support Splices. This simplifies the code a lot. -- No AllocateNode or other pointer arithmetic. -- We combine the findLessThan, findGreaterOrEqual, etc into one function. -*/ - -package skl - -import ( - "math" - "sync/atomic" - "unsafe" - - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" -) - -const ( - maxHeight = 20 - heightIncrease = math.MaxUint32 / 3 -) - -// MaxNodeSize is the memory footprint of a node of maximum height. -const MaxNodeSize = int(unsafe.Sizeof(node{})) - -type node struct { - // Multiple parts of the value are encoded as a single uint64 so that it - // can be atomically loaded and stored: - // value offset: uint32 (bits 0-31) - // value size : uint16 (bits 32-63) - value uint64 - - // A byte slice is 24 bytes. We are trying to save space here. - keyOffset uint32 // Immutable. No need to lock to access key. - keySize uint16 // Immutable. No need to lock to access key. - - // Height of the tower. - height uint16 - - // Most nodes do not need to use the full height of the tower, since the - // probability of each successive level decreases exponentially. Because - // these elements are never accessed, they do not need to be allocated. - // Therefore, when a node is allocated in the arena, its memory footprint - // is deliberately truncated to not include unneeded tower elements. - // - // All accesses to elements should use CAS operations, with no need to lock. - tower [maxHeight]uint32 -} - -type Skiplist struct { - height int32 // Current height. 1 <= height <= kMaxHeight. CAS. - head *node - ref int32 - arena *Arena - OnClose func() -} - -// IncrRef increases the refcount -func (s *Skiplist) IncrRef() { - atomic.AddInt32(&s.ref, 1) -} - -// DecrRef decrements the refcount, deallocating the Skiplist when done using it -func (s *Skiplist) DecrRef() { - newRef := atomic.AddInt32(&s.ref, -1) - if newRef > 0 { - return - } - if s.OnClose != nil { - s.OnClose() - } - - // Indicate we are closed. Good for testing. Also, lets GC reclaim memory. Race condition - // here would suggest we are accessing skiplist when we are supposed to have no reference! - s.arena = nil - // Since the head references the arena's buf, as long as the head is kept around - // GC can't release the buf. - s.head = nil -} - -func newNode(arena *Arena, key []byte, v y.ValueStruct, height int) *node { - // The base level is already allocated in the node struct. - offset := arena.putNode(height) - node := arena.getNode(offset) - node.keyOffset = arena.putKey(key) - node.keySize = uint16(len(key)) - node.height = uint16(height) - node.value = encodeValue(arena.putVal(v), v.EncodedSize()) - return node -} - -func encodeValue(valOffset uint32, valSize uint32) uint64 { - return uint64(valSize)<<32 | uint64(valOffset) -} - -func decodeValue(value uint64) (valOffset uint32, valSize uint32) { - valOffset = uint32(value) - valSize = uint32(value >> 32) - return -} - -// NewSkiplist makes a new empty skiplist, with a given arena size -func NewSkiplist(arenaSize int64) *Skiplist { - arena := newArena(arenaSize) - head := newNode(arena, nil, y.ValueStruct{}, maxHeight) - return &Skiplist{ - height: 1, - head: head, - arena: arena, - ref: 1, - } -} - -func (s *node) getValueOffset() (uint32, uint32) { - value := atomic.LoadUint64(&s.value) - return decodeValue(value) -} - -func (s *node) key(arena *Arena) []byte { - return arena.getKey(s.keyOffset, s.keySize) -} - -func (s *node) setValue(arena *Arena, v y.ValueStruct) { - valOffset := arena.putVal(v) - value := encodeValue(valOffset, v.EncodedSize()) - atomic.StoreUint64(&s.value, value) -} - -func (s *node) getNextOffset(h int) uint32 { - return atomic.LoadUint32(&s.tower[h]) -} - -func (s *node) casNextOffset(h int, old, val uint32) bool { - return atomic.CompareAndSwapUint32(&s.tower[h], old, val) -} - -// Returns true if key is strictly > n.key. -// If n is nil, this is an "end" marker and we return false. -//func (s *Skiplist) keyIsAfterNode(key []byte, n *node) bool { -// y.AssertTrue(n != s.head) -// return n != nil && y.CompareKeys(key, n.key) > 0 -//} - -func (s *Skiplist) randomHeight() int { - h := 1 - for h < maxHeight && z.FastRand() <= heightIncrease { - h++ - } - return h -} - -func (s *Skiplist) getNext(nd *node, height int) *node { - return s.arena.getNode(nd.getNextOffset(height)) -} - -// findNear finds the node near to key. -// If less=true, it finds rightmost node such that node.key < key (if allowEqual=false) or -// node.key <= key (if allowEqual=true). -// If less=false, it finds leftmost node such that node.key > key (if allowEqual=false) or -// node.key >= key (if allowEqual=true). -// Returns the node found. The bool returned is true if the node has key equal to given key. -func (s *Skiplist) findNear(key []byte, less bool, allowEqual bool) (*node, bool) { - x := s.head - level := int(s.getHeight() - 1) - for { - // Assume x.key < key. - next := s.getNext(x, level) - if next == nil { - // x.key < key < END OF LIST - if level > 0 { - // Can descend further to iterate closer to the end. - level-- - continue - } - // Level=0. Cannot descend further. Let's return something that makes sense. - if !less { - return nil, false - } - // Try to return x. Make sure it is not a head node. - if x == s.head { - return nil, false - } - return x, false - } - - nextKey := next.key(s.arena) - cmp := y.CompareKeys(key, nextKey) - if cmp > 0 { - // x.key < next.key < key. We can continue to move right. - x = next - continue - } - if cmp == 0 { - // x.key < key == next.key. - if allowEqual { - return next, true - } - if !less { - // We want >, so go to base level to grab the next bigger note. - return s.getNext(next, 0), false - } - // We want <. If not base level, we should go closer in the next level. - if level > 0 { - level-- - continue - } - // On base level. Return x. - if x == s.head { - return nil, false - } - return x, false - } - // cmp < 0. In other words, x.key < key < next. - if level > 0 { - level-- - continue - } - // At base level. Need to return something. - if !less { - return next, false - } - // Try to return x. Make sure it is not a head node. - if x == s.head { - return nil, false - } - return x, false - } -} - -// findSpliceForLevel returns (outBefore, outAfter) with outBefore.key <= key <= outAfter.key. -// The input "before" tells us where to start looking. -// If we found a node with the same key, then we return outBefore = outAfter. -// Otherwise, outBefore.key < key < outAfter.key. -func (s *Skiplist) findSpliceForLevel(key []byte, before *node, level int) (*node, *node) { - for { - // Assume before.key < key. - next := s.getNext(before, level) - if next == nil { - return before, next - } - nextKey := next.key(s.arena) - cmp := y.CompareKeys(key, nextKey) - if cmp == 0 { - // Equality case. - return next, next - } - if cmp < 0 { - // before.key < key < next.key. We are done for this level. - return before, next - } - before = next // Keep moving right on this level. - } -} - -func (s *Skiplist) getHeight() int32 { - return atomic.LoadInt32(&s.height) -} - -// Put inserts the key-value pair. -func (s *Skiplist) Put(key []byte, v y.ValueStruct) { - // Since we allow overwrite, we may not need to create a new node. We might not even need to - // increase the height. Let's defer these actions. - - listHeight := s.getHeight() - var prev [maxHeight + 1]*node - var next [maxHeight + 1]*node - prev[listHeight] = s.head - next[listHeight] = nil - for i := int(listHeight) - 1; i >= 0; i-- { - // Use higher level to speed up for current level. - prev[i], next[i] = s.findSpliceForLevel(key, prev[i+1], i) - if prev[i] == next[i] { - prev[i].setValue(s.arena, v) - return - } - } - - // We do need to create a new node. - height := s.randomHeight() - x := newNode(s.arena, key, v, height) - - // Try to increase s.height via CAS. - listHeight = s.getHeight() - for height > int(listHeight) { - if atomic.CompareAndSwapInt32(&s.height, listHeight, int32(height)) { - // Successfully increased skiplist.height. - break - } - listHeight = s.getHeight() - } - - // We always insert from the base level and up. After you add a node in base level, we cannot - // create a node in the level above because it would have discovered the node in the base level. - for i := 0; i < height; i++ { - for { - if prev[i] == nil { - y.AssertTrue(i > 1) // This cannot happen in base level. - // We haven't computed prev, next for this level because height exceeds old listHeight. - // For these levels, we expect the lists to be sparse, so we can just search from head. - prev[i], next[i] = s.findSpliceForLevel(key, s.head, i) - // Someone adds the exact same key before we are able to do so. This can only happen on - // the base level. But we know we are not on the base level. - y.AssertTrue(prev[i] != next[i]) - } - nextOffset := s.arena.getNodeOffset(next[i]) - x.tower[i] = nextOffset - if prev[i].casNextOffset(i, nextOffset, s.arena.getNodeOffset(x)) { - // Managed to insert x between prev[i] and next[i]. Go to the next level. - break - } - // CAS failed. We need to recompute prev and next. - // It is unlikely to be helpful to try to use a different level as we redo the search, - // because it is unlikely that lots of nodes are inserted between prev[i] and next[i]. - prev[i], next[i] = s.findSpliceForLevel(key, prev[i], i) - if prev[i] == next[i] { - y.AssertTruef(i == 0, "Equality can happen only on base level: %d", i) - prev[i].setValue(s.arena, v) - return - } - } - } -} - -// Empty returns if the Skiplist is empty. -func (s *Skiplist) Empty() bool { - return s.findLast() == nil -} - -// findLast returns the last element. If head (empty list), we return nil. All the find functions -// will NEVER return the head nodes. -func (s *Skiplist) findLast() *node { - n := s.head - level := int(s.getHeight()) - 1 - for { - next := s.getNext(n, level) - if next != nil { - n = next - continue - } - if level == 0 { - if n == s.head { - return nil - } - return n - } - level-- - } -} - -// Get gets the value associated with the key. It returns a valid value if it finds equal or earlier -// version of the same key. -func (s *Skiplist) Get(key []byte) y.ValueStruct { - n, _ := s.findNear(key, false, true) // findGreaterOrEqual. - if n == nil { - return y.ValueStruct{} - } - - nextKey := s.arena.getKey(n.keyOffset, n.keySize) - if !y.SameKey(key, nextKey) { - return y.ValueStruct{} - } - - valOffset, valSize := n.getValueOffset() - vs := s.arena.getVal(valOffset, valSize) - vs.Version = y.ParseTs(nextKey) - return vs -} - -// NewIterator returns a skiplist iterator. You have to Close() the iterator. -func (s *Skiplist) NewIterator() *Iterator { - s.IncrRef() - return &Iterator{list: s} -} - -// MemSize returns the size of the Skiplist in terms of how much memory is used within its internal -// arena. -func (s *Skiplist) MemSize() int64 { return s.arena.size() } - -// Iterator is an iterator over skiplist object. For new objects, you just -// need to initialize Iterator.list. -type Iterator struct { - list *Skiplist - n *node -} - -// Close frees the resources held by the iterator -func (s *Iterator) Close() error { - s.list.DecrRef() - return nil -} - -// Valid returns true iff the iterator is positioned at a valid node. -func (s *Iterator) Valid() bool { return s.n != nil } - -// Key returns the key at the current position. -func (s *Iterator) Key() []byte { - return s.list.arena.getKey(s.n.keyOffset, s.n.keySize) -} - -// Value returns value. -func (s *Iterator) Value() y.ValueStruct { - valOffset, valSize := s.n.getValueOffset() - return s.list.arena.getVal(valOffset, valSize) -} - -// ValueUint64 returns the uint64 value of the current node. -func (s *Iterator) ValueUint64() uint64 { - return s.n.value -} - -// Next advances to the next position. -func (s *Iterator) Next() { - y.AssertTrue(s.Valid()) - s.n = s.list.getNext(s.n, 0) -} - -// Prev advances to the previous position. -func (s *Iterator) Prev() { - y.AssertTrue(s.Valid()) - s.n, _ = s.list.findNear(s.Key(), true, false) // find <. No equality allowed. -} - -// Seek advances to the first entry with a key >= target. -func (s *Iterator) Seek(target []byte) { - s.n, _ = s.list.findNear(target, false, true) // find >=. -} - -// SeekForPrev finds an entry with key <= target. -func (s *Iterator) SeekForPrev(target []byte) { - s.n, _ = s.list.findNear(target, true, true) // find <=. -} - -// SeekToFirst seeks position at the first entry in list. -// Final state of iterator is Valid() iff list is not empty. -func (s *Iterator) SeekToFirst() { - s.n = s.list.getNext(s.list.head, 0) -} - -// SeekToLast seeks position at the last entry in list. -// Final state of iterator is Valid() iff list is not empty. -func (s *Iterator) SeekToLast() { - s.n = s.list.findLast() -} - -// UniIterator is a unidirectional memtable iterator. It is a thin wrapper around -// Iterator. We like to keep Iterator as before, because it is more powerful and -// we might support bidirectional iterators in the future. -type UniIterator struct { - iter *Iterator - reversed bool -} - -// NewUniIterator returns a UniIterator. -func (s *Skiplist) NewUniIterator(reversed bool) *UniIterator { - return &UniIterator{ - iter: s.NewIterator(), - reversed: reversed, - } -} - -// Next implements y.Interface -func (s *UniIterator) Next() { - if !s.reversed { - s.iter.Next() - } else { - s.iter.Prev() - } -} - -// Rewind implements y.Interface -func (s *UniIterator) Rewind() { - if !s.reversed { - s.iter.SeekToFirst() - } else { - s.iter.SeekToLast() - } -} - -// Seek implements y.Interface -func (s *UniIterator) Seek(key []byte) { - if !s.reversed { - s.iter.Seek(key) - } else { - s.iter.SeekForPrev(key) - } -} - -// Key implements y.Interface -func (s *UniIterator) Key() []byte { return s.iter.Key() } - -// Value implements y.Interface -func (s *UniIterator) Value() y.ValueStruct { return s.iter.Value() } - -// Valid implements y.Interface -func (s *UniIterator) Valid() bool { return s.iter.Valid() } - -// Close implements y.Interface (and frees up the iter's resources) -func (s *UniIterator) Close() error { return s.iter.Close() } diff --git a/vendor/github.com/dgraph-io/badger/v3/stream.go b/vendor/github.com/dgraph-io/badger/v3/stream.go deleted file mode 100644 index 0614f19aa5..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/stream.go +++ /dev/null @@ -1,491 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "bytes" - "context" - "sort" - "sync" - "sync/atomic" - "time" - - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" - humanize "github.com/dustin/go-humanize" -) - -const batchSize = 16 << 20 // 16 MB - -// maxStreamSize is the maximum allowed size of a stream batch. This is a soft limit -// as a single list that is still over the limit will have to be sent as is since it -// cannot be split further. This limit prevents the framework from creating batches -// so big that sending them causes issues (e.g running into the max size gRPC limit). -var maxStreamSize = uint64(100 << 20) // 100MB - -// Stream provides a framework to concurrently iterate over a snapshot of Badger, pick up -// key-values, batch them up and call Send. Stream does concurrent iteration over many smaller key -// ranges. It does NOT send keys in lexicographical sorted order. To get keys in sorted -// order, use Iterator. -type Stream struct { - // Prefix to only iterate over certain range of keys. If set to nil (default), Stream would - // iterate over the entire DB. - Prefix []byte - - // Number of goroutines to use for iterating over key ranges. Defaults to 8. - NumGo int - - // Badger would produce log entries in Infof to indicate the progress of Stream. LogPrefix can - // be used to help differentiate them from other activities. Default is "Badger.Stream". - LogPrefix string - - // ChooseKey is invoked each time a new key is encountered. Note that this is not called - // on every version of the value, only the first encountered version (i.e. the highest version - // of the value a key has). ChooseKey can be left nil to select all keys. - // - // Note: Calls to ChooseKey are concurrent. - ChooseKey func(item *Item) bool - - // KeyToList, similar to ChooseKey, is only invoked on the highest version of the value. It - // is upto the caller to iterate over the versions and generate zero, one or more KVs. It - // is expected that the user would advance the iterator to go through the versions of the - // values. However, the user MUST immediately return from this function on the first encounter - // with a mismatching key. See example usage in ToList function. Can be left nil to use ToList - // function by default. - // - // KeyToList has access to z.Allocator accessible via stream.Allocator(itr.ThreadId). This - // allocator can be used to allocate KVs, to decrease the memory pressure on Go GC. Stream - // framework takes care of releasing those resources after calling Send. AllocRef does - // NOT need to be set in the returned KVList, as Stream framework would ignore that field, - // instead using the allocator assigned to that thread id. - // - // Note: Calls to KeyToList are concurrent. - KeyToList func(key []byte, itr *Iterator) (*pb.KVList, error) - - // This is the method where Stream sends the final output. All calls to Send are done by a - // single goroutine, i.e. logic within Send method can expect single threaded execution. - Send func(buf *z.Buffer) error - - // Read data above the sinceTs. All keys with version =< sinceTs will be ignored. - SinceTs uint64 - readTs uint64 - db *DB - rangeCh chan keyRange - kvChan chan *z.Buffer - nextStreamId uint32 - doneMarkers bool - scanned uint64 // used to estimate the ETA for data scan. - numProducers int32 -} - -// SendDoneMarkers when true would send out done markers on the stream. False by default. -func (st *Stream) SendDoneMarkers(done bool) { - st.doneMarkers = done -} - -// ToList is a default implementation of KeyToList. It picks up all valid versions of the key, -// skipping over deleted or expired keys. -func (st *Stream) ToList(key []byte, itr *Iterator) (*pb.KVList, error) { - a := itr.Alloc - ka := a.Copy(key) - - list := &pb.KVList{} - for ; itr.Valid(); itr.Next() { - item := itr.Item() - if item.IsDeletedOrExpired() { - break - } - if !bytes.Equal(key, item.Key()) { - // Break out on the first encounter with another key. - break - } - - kv := y.NewKV(a) - kv.Key = ka - - if err := item.Value(func(val []byte) error { - kv.Value = a.Copy(val) - return nil - - }); err != nil { - return nil, err - } - kv.Version = item.Version() - kv.ExpiresAt = item.ExpiresAt() - kv.UserMeta = a.Copy([]byte{item.UserMeta()}) - - list.Kv = append(list.Kv, kv) - if st.db.opt.NumVersionsToKeep == 1 { - break - } - - if item.DiscardEarlierVersions() { - break - } - } - return list, nil -} - -// keyRange is [start, end), including start, excluding end. Do ensure that the start, -// end byte slices are owned by keyRange struct. -func (st *Stream) produceRanges(ctx context.Context) { - ranges := st.db.Ranges(st.Prefix, 16) - y.AssertTrue(len(ranges) > 0) - y.AssertTrue(ranges[0].left == nil) - y.AssertTrue(ranges[len(ranges)-1].right == nil) - st.db.opt.Infof("Number of ranges found: %d\n", len(ranges)) - - // Sort in descending order of size. - sort.Slice(ranges, func(i, j int) bool { - return ranges[i].size > ranges[j].size - }) - for i, r := range ranges { - st.rangeCh <- *r - st.db.opt.Infof("Sent range %d for iteration: [%x, %x) of size: %s\n", - i, r.left, r.right, humanize.IBytes(uint64(r.size))) - } - close(st.rangeCh) -} - -// produceKVs picks up ranges from rangeCh, generates KV lists and sends them to kvChan. -func (st *Stream) produceKVs(ctx context.Context, threadId int) error { - atomic.AddInt32(&st.numProducers, 1) - defer atomic.AddInt32(&st.numProducers, -1) - - var txn *Txn - if st.readTs > 0 { - txn = st.db.NewTransactionAt(st.readTs, false) - } else { - txn = st.db.NewTransaction(false) - } - defer txn.Discard() - - // produceKVs is running iterate serially. So, we can define the outList here. - outList := z.NewBuffer(2*batchSize, "Stream.ProduceKVs") - defer func() { - // The outList variable changes. So, we need to evaluate the variable in the defer. DO NOT - // call `defer outList.Release()`. - outList.Release() - }() - - iterate := func(kr keyRange) error { - iterOpts := DefaultIteratorOptions - iterOpts.AllVersions = true - iterOpts.Prefix = st.Prefix - iterOpts.PrefetchValues = false - iterOpts.SinceTs = st.SinceTs - itr := txn.NewIterator(iterOpts) - itr.ThreadId = threadId - defer itr.Close() - - itr.Alloc = z.NewAllocator(1<<20, "Stream.Iterate") - defer itr.Alloc.Release() - - // This unique stream id is used to identify all the keys from this iteration. - streamId := atomic.AddUint32(&st.nextStreamId, 1) - var scanned int - - sendIt := func() error { - select { - case st.kvChan <- outList: - outList = z.NewBuffer(2*batchSize, "Stream.ProduceKVs") - atomic.AddUint64(&st.scanned, uint64(itr.scanned-scanned)) - scanned = itr.scanned - case <-ctx.Done(): - return ctx.Err() - } - return nil - } - - var prevKey []byte - for itr.Seek(kr.left); itr.Valid(); { - // it.Valid would only return true for keys with the provided Prefix in iterOpts. - item := itr.Item() - if bytes.Equal(item.Key(), prevKey) { - itr.Next() - continue - } - prevKey = append(prevKey[:0], item.Key()...) - - // Check if we reached the end of the key range. - if len(kr.right) > 0 && bytes.Compare(item.Key(), kr.right) >= 0 { - break - } - - // Check if we should pick this key. - if st.ChooseKey != nil && !st.ChooseKey(item) { - continue - } - - // Now convert to key value. - itr.Alloc.Reset() - list, err := st.KeyToList(item.KeyCopy(nil), itr) - if err != nil { - st.db.opt.Warningf("While reading key: %x, got error: %v", item.Key(), err) - continue - } - if list == nil || len(list.Kv) == 0 { - continue - } - for _, kv := range list.Kv { - kv.StreamId = streamId - KVToBuffer(kv, outList) - if outList.LenNoPadding() < batchSize { - continue - } - if err := sendIt(); err != nil { - return err - } - } - } - // Mark the stream as done. - if st.doneMarkers { - kv := &pb.KV{ - StreamId: streamId, - StreamDone: true, - } - KVToBuffer(kv, outList) - } - return sendIt() - } - - for { - select { - case kr, ok := <-st.rangeCh: - if !ok { - // Done with the keys. - return nil - } - if err := iterate(kr); err != nil { - return err - } - case <-ctx.Done(): - return ctx.Err() - } - } -} - -func (st *Stream) streamKVs(ctx context.Context) error { - onDiskSize, uncompressedSize := st.db.EstimateSize(st.Prefix) - // Manish has seen uncompressed size to be in 20% error margin. - uncompressedSize = uint64(float64(uncompressedSize) * 1.2) - st.db.opt.Infof("%s Streaming about %s of uncompressed data (%s on disk)\n", - st.LogPrefix, humanize.IBytes(uncompressedSize), humanize.IBytes(onDiskSize)) - - tickerDur := 5 * time.Second - var bytesSent uint64 - t := time.NewTicker(tickerDur) - defer t.Stop() - now := time.Now() - - sendBatch := func(batch *z.Buffer) error { - defer batch.Release() - sz := uint64(batch.LenNoPadding()) - if sz == 0 { - return nil - } - bytesSent += sz - // st.db.opt.Infof("%s Sending batch of size: %s.\n", st.LogPrefix, humanize.IBytes(sz)) - if err := st.Send(batch); err != nil { - st.db.opt.Warningf("Error while sending: %v\n", err) - return err - } - return nil - } - - slurp := func(batch *z.Buffer) error { - loop: - for { - // Send the batch immediately if it already exceeds the maximum allowed size. - // If the size of the batch exceeds maxStreamSize, break from the loop to - // avoid creating a batch that is so big that certain limits are reached. - if batch.LenNoPadding() > int(maxStreamSize) { - break loop - } - select { - case kvs, ok := <-st.kvChan: - if !ok { - break loop - } - y.AssertTrue(kvs != nil) - y.Check2(batch.Write(kvs.Bytes())) - y.Check(kvs.Release()) - - default: - break loop - } - } - return sendBatch(batch) - } // end of slurp. - - writeRate := y.NewRateMonitor(20) - scanRate := y.NewRateMonitor(20) -outer: - for { - var batch *z.Buffer - select { - case <-ctx.Done(): - return ctx.Err() - - case <-t.C: - // Instead of calculating speed over the entire lifetime, we average the speed over - // ticker duration. - writeRate.Capture(bytesSent) - scanned := atomic.LoadUint64(&st.scanned) - scanRate.Capture(scanned) - numProducers := atomic.LoadInt32(&st.numProducers) - - st.db.opt.Infof("%s [%s] Scan (%d): ~%s/%s at %s/sec. Sent: %s at %s/sec."+ - " jemalloc: %s\n", - st.LogPrefix, y.FixedDuration(time.Since(now)), numProducers, - y.IBytesToString(scanned, 1), humanize.IBytes(uncompressedSize), - humanize.IBytes(scanRate.Rate()), - y.IBytesToString(bytesSent, 1), humanize.IBytes(writeRate.Rate()), - humanize.IBytes(uint64(z.NumAllocBytes()))) - - case kvs, ok := <-st.kvChan: - if !ok { - break outer - } - y.AssertTrue(kvs != nil) - batch = kvs - - // Otherwise, slurp more keys into this batch. - if err := slurp(batch); err != nil { - return err - } - } - } - - st.db.opt.Infof("%s Sent data of size %s\n", st.LogPrefix, humanize.IBytes(bytesSent)) - return nil -} - -// Orchestrate runs Stream. It picks up ranges from the SSTables, then runs NumGo number of -// goroutines to iterate over these ranges and batch up KVs in lists. It concurrently runs a single -// goroutine to pick these lists, batch them up further and send to Output.Send. Orchestrate also -// spits logs out to Infof, using provided LogPrefix. Note that all calls to Output.Send -// are serial. In case any of these steps encounter an error, Orchestrate would stop execution and -// return that error. Orchestrate can be called multiple times, but in serial order. -func (st *Stream) Orchestrate(ctx context.Context) error { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - st.rangeCh = make(chan keyRange, 3) // Contains keys for posting lists. - - // kvChan should only have a small capacity to ensure that we don't buffer up too much data if - // sending is slow. Page size is set to 4MB, which is used to lazily cap the size of each - // KVList. To get 128MB buffer, we can set the channel size to 32. - st.kvChan = make(chan *z.Buffer, 32) - - if st.KeyToList == nil { - st.KeyToList = st.ToList - } - - // Picks up ranges from Badger, and sends them to rangeCh. - go st.produceRanges(ctx) - - errCh := make(chan error, st.NumGo) // Stores error by consumeKeys. - var wg sync.WaitGroup - for i := 0; i < st.NumGo; i++ { - wg.Add(1) - - go func(threadId int) { - defer wg.Done() - // Picks up ranges from rangeCh, generates KV lists, and sends them to kvChan. - if err := st.produceKVs(ctx, threadId); err != nil { - select { - case errCh <- err: - default: - } - } - }(i) - } - - // Pick up key-values from kvChan and send to stream. - kvErr := make(chan error, 1) - go func() { - // Picks up KV lists from kvChan, and sends them to Output. - err := st.streamKVs(ctx) - if err != nil { - cancel() // Stop all the go routines. - } - kvErr <- err - }() - wg.Wait() // Wait for produceKVs to be over. - close(st.kvChan) // Now we can close kvChan. - defer func() { - // If due to some error, we have buffers left in kvChan, we should release them. - for buf := range st.kvChan { - buf.Release() - } - }() - - select { - case err := <-errCh: // Check error from produceKVs. - return err - default: - } - - // Wait for key streaming to be over. - err := <-kvErr - return err -} - -func (db *DB) newStream() *Stream { - return &Stream{ - db: db, - NumGo: db.opt.NumGoroutines, - LogPrefix: "Badger.Stream", - } -} - -// NewStream creates a new Stream. -func (db *DB) NewStream() *Stream { - if db.opt.managedTxns { - panic("This API can not be called in managed mode.") - } - return db.newStream() -} - -// NewStreamAt creates a new Stream at a particular timestamp. Should only be used with managed DB. -func (db *DB) NewStreamAt(readTs uint64) *Stream { - if !db.opt.managedTxns { - panic("This API can only be called in managed mode.") - } - stream := db.newStream() - stream.readTs = readTs - return stream -} - -func BufferToKVList(buf *z.Buffer) (*pb.KVList, error) { - var list pb.KVList - err := buf.SliceIterate(func(s []byte) error { - kv := new(pb.KV) - if err := kv.Unmarshal(s); err != nil { - return err - } - list.Kv = append(list.Kv, kv) - return nil - }) - return &list, err -} - -func KVToBuffer(kv *pb.KV, buf *z.Buffer) { - out := buf.SliceAllocate(kv.Size()) - y.Check2(kv.MarshalToSizedBuffer(out)) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/stream_writer.go b/vendor/github.com/dgraph-io/badger/v3/stream_writer.go deleted file mode 100644 index 4613718cce..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/stream_writer.go +++ /dev/null @@ -1,459 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "encoding/hex" - "fmt" - "sync" - - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/table" - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" - humanize "github.com/dustin/go-humanize" - "github.com/pkg/errors" -) - -// StreamWriter is used to write data coming from multiple streams. The streams must not have any -// overlapping key ranges. Within each stream, the keys must be sorted. Badger Stream framework is -// capable of generating such an output. So, this StreamWriter can be used at the other end to build -// BadgerDB at a much faster pace by writing SSTables (and value logs) directly to LSM tree levels -// without causing any compactions at all. This is way faster than using batched writer or using -// transactions, but only applicable in situations where the keys are pre-sorted and the DB is being -// bootstrapped. Existing data would get deleted when using this writer. So, this is only useful -// when restoring from backup or replicating DB across servers. -// -// StreamWriter should not be called on in-use DB instances. It is designed only to bootstrap new -// DBs. -type StreamWriter struct { - writeLock sync.Mutex - db *DB - done func() - throttle *y.Throttle - maxVersion uint64 - writers map[uint32]*sortedWriter -} - -// NewStreamWriter creates a StreamWriter. Right after creating StreamWriter, Prepare must be -// called. The memory usage of a StreamWriter is directly proportional to the number of streams -// possible. So, efforts must be made to keep the number of streams low. Stream framework would -// typically use 16 goroutines and hence create 16 streams. -func (db *DB) NewStreamWriter() *StreamWriter { - return &StreamWriter{ - db: db, - // throttle shouldn't make much difference. Memory consumption is based on the number of - // concurrent streams being processed. - throttle: y.NewThrottle(16), - writers: make(map[uint32]*sortedWriter), - } -} - -// Prepare should be called before writing any entry to StreamWriter. It deletes all data present in -// existing DB, stops compactions and any writes being done by other means. Be very careful when -// calling Prepare, because it could result in permanent data loss. Not calling Prepare would result -// in a corrupt Badger instance. -func (sw *StreamWriter) Prepare() error { - sw.writeLock.Lock() - defer sw.writeLock.Unlock() - - done, err := sw.db.dropAll() - - // Ensure that done() is never called more than once. - var once sync.Once - sw.done = func() { once.Do(done) } - - return err -} - -// Write writes KVList to DB. Each KV within the list contains the stream id which StreamWriter -// would use to demux the writes. Write is thread safe and can be called concurrently by multiple -// goroutines. -func (sw *StreamWriter) Write(buf *z.Buffer) error { - if buf.LenNoPadding() == 0 { - return nil - } - - // closedStreams keeps track of all streams which are going to be marked as done. We are - // keeping track of all streams so that we can close them at the end, after inserting all - // the valid kvs. - closedStreams := make(map[uint32]struct{}) - streamReqs := make(map[uint32]*request) - - err := buf.SliceIterate(func(s []byte) error { - var kv pb.KV - if err := kv.Unmarshal(s); err != nil { - return err - } - if kv.StreamDone { - closedStreams[kv.StreamId] = struct{}{} - return nil - } - - // Panic if some kv comes after stream has been marked as closed. - if _, ok := closedStreams[kv.StreamId]; ok { - panic(fmt.Sprintf("write performed on closed stream: %d", kv.StreamId)) - } - - var meta, userMeta byte - if len(kv.Meta) > 0 { - meta = kv.Meta[0] - } - if len(kv.UserMeta) > 0 { - userMeta = kv.UserMeta[0] - } - if sw.maxVersion < kv.Version { - sw.maxVersion = kv.Version - } - e := &Entry{ - Key: y.KeyWithTs(kv.Key, kv.Version), - Value: y.Copy(kv.Value), - UserMeta: userMeta, - ExpiresAt: kv.ExpiresAt, - meta: meta, - } - // If the value can be collocated with the key in LSM tree, we can skip - // writing the value to value log. - req := streamReqs[kv.StreamId] - if req == nil { - req = &request{} - streamReqs[kv.StreamId] = req - } - req.Entries = append(req.Entries, e) - return nil - }) - if err != nil { - return err - } - - all := make([]*request, 0, len(streamReqs)) - for _, req := range streamReqs { - all = append(all, req) - } - - sw.writeLock.Lock() - defer sw.writeLock.Unlock() - - // We are writing all requests to vlog even if some request belongs to already closed stream. - // It is safe to do because we are panicking while writing to sorted writer, which will be nil - // for closed stream. At restart, stream writer will drop all the data in Prepare function. - if err := sw.db.vlog.write(all); err != nil { - return err - } - - for streamID, req := range streamReqs { - writer, ok := sw.writers[streamID] - if !ok { - var err error - writer, err = sw.newWriter(streamID) - if err != nil { - return y.Wrapf(err, "failed to create writer with ID %d", streamID) - } - sw.writers[streamID] = writer - } - - if writer == nil { - panic(fmt.Sprintf("write performed on closed stream: %d", streamID)) - } - - writer.reqCh <- req - } - - // Now we can close any streams if required. We will make writer for - // the closed streams as nil. - for streamId := range closedStreams { - writer, ok := sw.writers[streamId] - if !ok { - sw.db.opt.Logger.Warningf("Trying to close stream: %d, but no sorted "+ - "writer found for it", streamId) - continue - } - - writer.closer.SignalAndWait() - if err := writer.Done(); err != nil { - return err - } - - sw.writers[streamId] = nil - } - return nil -} - -// Flush is called once we are done writing all the entries. It syncs DB directories. It also -// updates Oracle with maxVersion found in all entries (if DB is not managed). -func (sw *StreamWriter) Flush() error { - sw.writeLock.Lock() - defer sw.writeLock.Unlock() - - defer sw.done() - - for _, writer := range sw.writers { - if writer != nil { - writer.closer.SignalAndWait() - } - } - - for _, writer := range sw.writers { - if writer == nil { - continue - } - if err := writer.Done(); err != nil { - return err - } - } - - if !sw.db.opt.managedTxns { - if sw.db.orc != nil { - sw.db.orc.Stop() - } - sw.db.orc = newOracle(sw.db.opt) - sw.db.orc.nextTxnTs = sw.maxVersion - sw.db.orc.txnMark.Done(sw.maxVersion) - sw.db.orc.readMark.Done(sw.maxVersion) - sw.db.orc.incrementNextTs() - } - - // Wait for all files to be written. - if err := sw.throttle.Finish(); err != nil { - return err - } - - // Sort tables at the end. - for _, l := range sw.db.lc.levels { - l.sortTables() - } - - // Now sync the directories, so all the files are registered. - if sw.db.opt.ValueDir != sw.db.opt.Dir { - if err := sw.db.syncDir(sw.db.opt.ValueDir); err != nil { - return err - } - } - if err := sw.db.syncDir(sw.db.opt.Dir); err != nil { - return err - } - return sw.db.lc.validate() -} - -// Cancel signals all goroutines to exit. Calling defer sw.Cancel() immediately after creating a new StreamWriter -// ensures that writes are unblocked even upon early return. Note that dropAll() is not called here, so any -// partially written data will not be erased until a new StreamWriter is initialized. -func (sw *StreamWriter) Cancel() { - sw.writeLock.Lock() - defer sw.writeLock.Unlock() - - for _, writer := range sw.writers { - if writer != nil { - writer.closer.Signal() - } - } - for _, writer := range sw.writers { - if writer != nil { - writer.closer.Wait() - } - } - - if err := sw.throttle.Finish(); err != nil { - sw.db.opt.Errorf("error in throttle.Finish: %+v", err) - } - - // Handle Cancel() being called before Prepare(). - if sw.done != nil { - sw.done() - } -} - -type sortedWriter struct { - db *DB - throttle *y.Throttle - opts table.Options - - builder *table.Builder - lastKey []byte - streamID uint32 - reqCh chan *request - // Have separate closer for each writer, as it can be closed at any time. - closer *z.Closer -} - -func (sw *StreamWriter) newWriter(streamID uint32) (*sortedWriter, error) { - bopts := buildTableOptions(sw.db) - for i := 2; i < sw.db.opt.MaxLevels; i++ { - bopts.TableSize *= uint64(sw.db.opt.TableSizeMultiplier) - } - w := &sortedWriter{ - db: sw.db, - opts: bopts, - streamID: streamID, - throttle: sw.throttle, - builder: table.NewTableBuilder(bopts), - reqCh: make(chan *request, 3), - closer: z.NewCloser(1), - } - - go w.handleRequests() - return w, nil -} - -func (w *sortedWriter) handleRequests() { - defer w.closer.Done() - - process := func(req *request) { - for i, e := range req.Entries { - // If badger is running in InMemory mode, len(req.Ptrs) == 0. - var vs y.ValueStruct - if e.skipVlogAndSetThreshold(w.db.valueThreshold()) { - vs = y.ValueStruct{ - Value: e.Value, - Meta: e.meta, - UserMeta: e.UserMeta, - ExpiresAt: e.ExpiresAt, - } - } else { - vptr := req.Ptrs[i] - vs = y.ValueStruct{ - Value: vptr.Encode(), - Meta: e.meta | bitValuePointer, - UserMeta: e.UserMeta, - ExpiresAt: e.ExpiresAt, - } - } - if err := w.Add(e.Key, vs); err != nil { - panic(err) - } - } - } - - for { - select { - case req := <-w.reqCh: - process(req) - case <-w.closer.HasBeenClosed(): - close(w.reqCh) - for req := range w.reqCh { - process(req) - } - return - } - } -} - -// Add adds key and vs to sortedWriter. -func (w *sortedWriter) Add(key []byte, vs y.ValueStruct) error { - if len(w.lastKey) > 0 && y.CompareKeys(key, w.lastKey) <= 0 { - return errors.Errorf("keys not in sorted order (last key: %s, key: %s)", - hex.Dump(w.lastKey), hex.Dump(key)) - } - - sameKey := y.SameKey(key, w.lastKey) - - // Same keys should go into the same SSTable. - if !sameKey && w.builder.ReachedCapacity() { - if err := w.send(false); err != nil { - return err - } - } - - w.lastKey = y.SafeCopy(w.lastKey, key) - var vp valuePointer - if vs.Meta&bitValuePointer > 0 { - vp.Decode(vs.Value) - } - - w.builder.Add(key, vs, vp.Len) - return nil -} - -func (w *sortedWriter) send(done bool) error { - if err := w.throttle.Do(); err != nil { - return err - } - go func(builder *table.Builder) { - err := w.createTable(builder) - w.throttle.Done(err) - }(w.builder) - // If done is true, this indicates we can close the writer. - // No need to allocate underlying TableBuilder now. - if done { - w.builder = nil - return nil - } - - w.builder = table.NewTableBuilder(w.opts) - return nil -} - -// Done is called once we are done writing all keys and valueStructs -// to sortedWriter. It completes writing current SST to disk. -func (w *sortedWriter) Done() error { - if w.builder.Empty() { - w.builder.Close() - // Assign builder as nil, so that underlying memory can be garbage collected. - w.builder = nil - return nil - } - - return w.send(true) -} - -func (w *sortedWriter) createTable(builder *table.Builder) error { - defer builder.Close() - if builder.Empty() { - builder.Finish() - return nil - } - - fileID := w.db.lc.reserveFileID() - var tbl *table.Table - if w.db.opt.InMemory { - data := builder.Finish() - var err error - if tbl, err = table.OpenInMemoryTable(data, fileID, builder.Opts()); err != nil { - return err - } - } else { - var err error - fname := table.NewFilename(fileID, w.db.opt.Dir) - if tbl, err = table.CreateTable(fname, builder); err != nil { - return err - } - } - lc := w.db.lc - - lhandler := lc.levels[len(lc.levels)-1] - // Now that table can be opened successfully, let's add this to the MANIFEST. - change := &pb.ManifestChange{ - Id: tbl.ID(), - KeyId: tbl.KeyID(), - Op: pb.ManifestChange_CREATE, - Level: uint32(lhandler.level), - Compression: uint32(tbl.CompressionType()), - } - if err := w.db.manifest.addChanges([]*pb.ManifestChange{change}); err != nil { - return err - } - - // We are not calling lhandler.replaceTables() here, as it sorts tables on every addition. - // We can sort all tables only once during Flush() call. - lhandler.addTable(tbl) - - // Release the ref held by OpenTable. - _ = tbl.DecrRef() - w.db.opt.Infof("Table created: %d at level: %d for stream: %d. Size: %s\n", - fileID, lhandler.level, w.streamID, humanize.IBytes(uint64(tbl.Size()))) - return nil -} diff --git a/vendor/github.com/dgraph-io/badger/v3/structs.go b/vendor/github.com/dgraph-io/badger/v3/structs.go deleted file mode 100644 index c17f818cf7..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/structs.go +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "encoding/binary" - "fmt" - "time" - "unsafe" -) - -type valuePointer struct { - Fid uint32 - Len uint32 - Offset uint32 -} - -const vptrSize = unsafe.Sizeof(valuePointer{}) - -func (p valuePointer) Less(o valuePointer) bool { - if p.Fid != o.Fid { - return p.Fid < o.Fid - } - if p.Offset != o.Offset { - return p.Offset < o.Offset - } - return p.Len < o.Len -} - -func (p valuePointer) IsZero() bool { - return p.Fid == 0 && p.Offset == 0 && p.Len == 0 -} - -// Encode encodes Pointer into byte buffer. -func (p valuePointer) Encode() []byte { - b := make([]byte, vptrSize) - // Copy over the content from p to b. - *(*valuePointer)(unsafe.Pointer(&b[0])) = p - return b -} - -// Decode decodes the value pointer into the provided byte buffer. -func (p *valuePointer) Decode(b []byte) { - // Copy over data from b into p. Using *p=unsafe.pointer(...) leads to - // pointer alignment issues. See https://github.com/dgraph-io/badger/issues/1096 - // and comment https://github.com/dgraph-io/badger/pull/1097#pullrequestreview-307361714 - copy(((*[vptrSize]byte)(unsafe.Pointer(p))[:]), b[:vptrSize]) -} - -// header is used in value log as a header before Entry. -type header struct { - klen uint32 - vlen uint32 - expiresAt uint64 - meta byte - userMeta byte -} - -const ( - // Maximum possible size of the header. The maximum size of header struct will be 18 but the - // maximum size of varint encoded header will be 21. - maxHeaderSize = 21 -) - -// Encode encodes the header into []byte. The provided []byte should be atleast 5 bytes. The -// function will panic if out []byte isn't large enough to hold all the values. -// The encoded header looks like -// +------+----------+------------+--------------+-----------+ -// | Meta | UserMeta | Key Length | Value Length | ExpiresAt | -// +------+----------+------------+--------------+-----------+ -func (h header) Encode(out []byte) int { - out[0], out[1] = h.meta, h.userMeta - index := 2 - index += binary.PutUvarint(out[index:], uint64(h.klen)) - index += binary.PutUvarint(out[index:], uint64(h.vlen)) - index += binary.PutUvarint(out[index:], h.expiresAt) - return index -} - -// Decode decodes the given header from the provided byte slice. -// Returns the number of bytes read. -func (h *header) Decode(buf []byte) int { - h.meta, h.userMeta = buf[0], buf[1] - index := 2 - klen, count := binary.Uvarint(buf[index:]) - h.klen = uint32(klen) - index += count - vlen, count := binary.Uvarint(buf[index:]) - h.vlen = uint32(vlen) - index += count - h.expiresAt, count = binary.Uvarint(buf[index:]) - return index + count -} - -// DecodeFrom reads the header from the hashReader. -// Returns the number of bytes read. -func (h *header) DecodeFrom(reader *hashReader) (int, error) { - var err error - h.meta, err = reader.ReadByte() - if err != nil { - return 0, err - } - h.userMeta, err = reader.ReadByte() - if err != nil { - return 0, err - } - klen, err := binary.ReadUvarint(reader) - if err != nil { - return 0, err - } - h.klen = uint32(klen) - vlen, err := binary.ReadUvarint(reader) - if err != nil { - return 0, err - } - h.vlen = uint32(vlen) - h.expiresAt, err = binary.ReadUvarint(reader) - if err != nil { - return 0, err - } - return reader.bytesRead, nil -} - -// Entry provides Key, Value, UserMeta and ExpiresAt. This struct can be used by -// the user to set data. -type Entry struct { - Key []byte - Value []byte - ExpiresAt uint64 // time.Unix - version uint64 - offset uint32 // offset is an internal field. - UserMeta byte - meta byte - - // Fields maintained internally. - hlen int // Length of the header. - valThreshold int64 -} - -func (e *Entry) isZero() bool { - return len(e.Key) == 0 -} - -func (e *Entry) estimateSizeAndSetThreshold(threshold int64) int64 { - if e.valThreshold == 0 { - e.valThreshold = threshold - } - k := int64(len(e.Key)) - v := int64(len(e.Value)) - if v < e.valThreshold { - return k + v + 2 // Meta, UserMeta - } - return k + 12 + 2 // 12 for ValuePointer, 2 for metas. -} - -func (e *Entry) skipVlogAndSetThreshold(threshold int64) bool { - if e.valThreshold == 0 { - e.valThreshold = threshold - } - return int64(len(e.Value)) < e.valThreshold -} - -func (e Entry) print(prefix string) { - fmt.Printf("%s Key: %s Meta: %d UserMeta: %d Offset: %d len(val)=%d", - prefix, e.Key, e.meta, e.UserMeta, e.offset, len(e.Value)) -} - -// NewEntry creates a new entry with key and value passed in args. This newly created entry can be -// set in a transaction by calling txn.SetEntry(). All other properties of Entry can be set by -// calling WithMeta, WithDiscard, WithTTL methods on it. -// This function uses key and value reference, hence users must -// not modify key and value until the end of transaction. -func NewEntry(key, value []byte) *Entry { - return &Entry{ - Key: key, - Value: value, - } -} - -// WithMeta adds meta data to Entry e. This byte is stored alongside the key -// and can be used as an aid to interpret the value or store other contextual -// bits corresponding to the key-value pair of entry. -func (e *Entry) WithMeta(meta byte) *Entry { - e.UserMeta = meta - return e -} - -// WithDiscard adds a marker to Entry e. This means all the previous versions of the key (of the -// Entry) will be eligible for garbage collection. -// This method is only useful if you have set a higher limit for options.NumVersionsToKeep. The -// default setting is 1, in which case, this function doesn't add any more benefit. If however, you -// have a higher setting for NumVersionsToKeep (in Dgraph, we set it to infinity), you can use this -// method to indicate that all the older versions can be discarded and removed during compactions. -func (e *Entry) WithDiscard() *Entry { - e.meta = bitDiscardEarlierVersions - return e -} - -// WithTTL adds time to live duration to Entry e. Entry stored with a TTL would automatically expire -// after the time has elapsed, and will be eligible for garbage collection. -func (e *Entry) WithTTL(dur time.Duration) *Entry { - e.ExpiresAt = uint64(time.Now().Add(dur).Unix()) - return e -} - -// withMergeBit sets merge bit in entry's metadata. This -// function is called by MergeOperator's Add method. -func (e *Entry) withMergeBit() *Entry { - e.meta = bitMergeEntry - return e -} diff --git a/vendor/github.com/dgraph-io/badger/v3/table/README.md b/vendor/github.com/dgraph-io/badger/v3/table/README.md deleted file mode 100644 index 19276079ef..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/table/README.md +++ /dev/null @@ -1,108 +0,0 @@ -Size of table is 123,217,667 bytes for all benchmarks. - -# BenchmarkRead -``` -$ go test -bench ^BenchmarkRead$ -run ^$ -count 3 -goos: linux -goarch: amd64 -pkg: github.com/dgraph-io/badger/table -BenchmarkRead-16 10 154074944 ns/op -BenchmarkRead-16 10 154340411 ns/op -BenchmarkRead-16 10 151914489 ns/op -PASS -ok github.com/dgraph-io/badger/table 22.467s -``` - -Size of table is 123,217,667 bytes, which is ~118MB. - -The rate is ~762MB/s using LoadToRAM (when table is in RAM). - -To read a 64MB table, this would take ~0.084s, which is negligible. - -# BenchmarkReadAndBuild -```go -$ go test -bench BenchmarkReadAndBuild -run ^$ -count 3 -goos: linux -goarch: amd64 -pkg: github.com/dgraph-io/badger/table -BenchmarkReadAndBuild-16 1 1026755231 ns/op -BenchmarkReadAndBuild-16 1 1009543316 ns/op -BenchmarkReadAndBuild-16 1 1039920546 ns/op -PASS -ok github.com/dgraph-io/badger/table 12.081s -``` - -The rate is ~123MB/s. To build a 64MB table, this would take ~0.56s. Note that this -does NOT include the flushing of the table to disk. All we are doing above is -reading one table (which is in RAM) and write one table in memory. - -The table building takes 0.56-0.084s ~ 0.4823s. - -# BenchmarkReadMerged -Below, we merge 5 tables. The total size remains unchanged at ~122M. - -```go -$ go test -bench ReadMerged -run ^$ -count 3 -goos: linux -goarch: amd64 -pkg: github.com/dgraph-io/badger/table -BenchmarkReadMerged-16 2 977588975 ns/op -BenchmarkReadMerged-16 2 982140738 ns/op -BenchmarkReadMerged-16 2 962046017 ns/op -PASS -ok github.com/dgraph-io/badger/table 27.433s -``` - -The rate is ~120MB/s. To read a 64MB table using merge iterator, this would take ~0.53s. - -# BenchmarkRandomRead - -```go -go test -bench BenchmarkRandomRead$ -run ^$ -count 3 -goos: linux -goarch: amd64 -pkg: github.com/dgraph-io/badger/table -BenchmarkRandomRead-16 500000 2645 ns/op -BenchmarkRandomRead-16 500000 2648 ns/op -BenchmarkRandomRead-16 500000 2614 ns/op -PASS -ok github.com/dgraph-io/badger/table 50.850s -``` -For random read benchmarking, we are randomly reading a key and verifying its value. - -# DB Open benchmark -1. Create badger DB with 2 billion key-value pairs (about 380GB of data) -``` -badger fill -m 2000 --dir="/tmp/data" --sorted -``` -2. Clear buffers and swap memory -``` -free -mh && sync && echo 3 | sudo tee /proc/sys/vm/drop_caches && sudo swapoff -a && sudo swapon -a && free -mh -``` -Also flush disk buffers -``` -blockdev --flushbufs /dev/nvme0n1p4 -``` -3. Run the benchmark -``` -go test -run=^$ github.com/dgraph-io/badger -bench ^BenchmarkDBOpen$ -benchdir="/tmp/data" -v - -badger 2019/06/04 17:15:56 INFO: 126 tables out of 1028 opened in 3.017s -badger 2019/06/04 17:15:59 INFO: 257 tables out of 1028 opened in 6.014s -badger 2019/06/04 17:16:02 INFO: 387 tables out of 1028 opened in 9.017s -badger 2019/06/04 17:16:05 INFO: 516 tables out of 1028 opened in 12.025s -badger 2019/06/04 17:16:08 INFO: 645 tables out of 1028 opened in 15.013s -badger 2019/06/04 17:16:11 INFO: 775 tables out of 1028 opened in 18.008s -badger 2019/06/04 17:16:14 INFO: 906 tables out of 1028 opened in 21.003s -badger 2019/06/04 17:16:17 INFO: All 1028 tables opened in 23.851s -badger 2019/06/04 17:16:17 INFO: Replaying file id: 1998 at offset: 332000 -badger 2019/06/04 17:16:17 INFO: Replay took: 9.81µs -goos: linux -goarch: amd64 -pkg: github.com/dgraph-io/badger -BenchmarkDBOpen-16 1 23930082140 ns/op -PASS -ok github.com/dgraph-io/badger 24.076s - -``` -It takes about 23.851s to open a DB with 2 billion sorted key-value entries. diff --git a/vendor/github.com/dgraph-io/badger/v3/table/builder.go b/vendor/github.com/dgraph-io/badger/v3/table/builder.go deleted file mode 100644 index 5bab48a72f..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/table/builder.go +++ /dev/null @@ -1,591 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package table - -import ( - "crypto/aes" - "math" - "runtime" - "sync" - "sync/atomic" - "unsafe" - - "github.com/dgraph-io/badger/v3/fb" - "github.com/golang/protobuf/proto" - "github.com/golang/snappy" - fbs "github.com/google/flatbuffers/go" - "github.com/pkg/errors" - - "github.com/dgraph-io/badger/v3/options" - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" -) - -const ( - KB = 1024 - MB = KB * 1024 - - // When a block is encrypted, it's length increases. We add 256 bytes of padding to - // handle cases when block size increases. This is an approximate number. - padding = 256 -) - -type header struct { - overlap uint16 // Overlap with base key. - diff uint16 // Length of the diff. -} - -const headerSize = uint16(unsafe.Sizeof(header{})) - -// Encode encodes the header. -func (h header) Encode() []byte { - var b [4]byte - *(*header)(unsafe.Pointer(&b[0])) = h - return b[:] -} - -// Decode decodes the header. -func (h *header) Decode(buf []byte) { - // Copy over data from buf into h. Using *h=unsafe.pointer(...) leads to - // pointer alignment issues. See https://github.com/dgraph-io/badger/issues/1096 - // and comment https://github.com/dgraph-io/badger/pull/1097#pullrequestreview-307361714 - copy(((*[headerSize]byte)(unsafe.Pointer(h))[:]), buf[:headerSize]) -} - -// bblock represents a block that is being compressed/encrypted in the background. -type bblock struct { - data []byte - baseKey []byte // Base key for the current block. - entryOffsets []uint32 // Offsets of entries present in current block. - end int // Points to the end offset of the block. -} - -// Builder is used in building a table. -type Builder struct { - // Typically tens or hundreds of meg. This is for one single file. - alloc *z.Allocator - curBlock *bblock - compressedSize uint32 - uncompressedSize uint32 - - lenOffsets uint32 - estimatedSize uint32 - keyHashes []uint32 // Used for building the bloomfilter. - opts *Options - maxVersion uint64 - onDiskSize uint32 - staleDataSize int - - // Used to concurrently compress/encrypt blocks. - wg sync.WaitGroup - blockChan chan *bblock - blockList []*bblock -} - -func (b *Builder) allocate(need int) []byte { - bb := b.curBlock - if len(bb.data[bb.end:]) < need { - // We need to reallocate. 1GB is the max size that the allocator can allocate. - // While reallocating, if doubling exceeds that limit, then put the upper bound on it. - sz := 2 * len(bb.data) - if sz > (1 << 30) { - sz = 1 << 30 - } - if bb.end+need > sz { - sz = bb.end + need - } - tmp := b.alloc.Allocate(sz) - copy(tmp, bb.data) - bb.data = tmp - } - bb.end += need - return bb.data[bb.end-need : bb.end] -} - -// append appends to curBlock.data -func (b *Builder) append(data []byte) { - dst := b.allocate(len(data)) - y.AssertTrue(len(data) == copy(dst, data)) -} - -const maxAllocatorInitialSz = 256 << 20 - -// NewTableBuilder makes a new TableBuilder. -func NewTableBuilder(opts Options) *Builder { - sz := 2 * int(opts.TableSize) - if sz > maxAllocatorInitialSz { - sz = maxAllocatorInitialSz - } - b := &Builder{ - alloc: opts.AllocPool.Get(sz, "TableBuilder"), - opts: &opts, - } - b.alloc.Tag = "Builder" - b.curBlock = &bblock{ - data: b.alloc.Allocate(opts.BlockSize + padding), - } - b.opts.tableCapacity = uint64(float64(b.opts.TableSize) * 0.95) - - // If encryption or compression is not enabled, do not start compression/encryption goroutines - // and write directly to the buffer. - if b.opts.Compression == options.None && b.opts.DataKey == nil { - return b - } - - count := 2 * runtime.NumCPU() - b.blockChan = make(chan *bblock, count*2) - - b.wg.Add(count) - for i := 0; i < count; i++ { - go b.handleBlock() - } - return b -} - -func (b *Builder) handleBlock() { - defer b.wg.Done() - - doCompress := b.opts.Compression != options.None - for item := range b.blockChan { - // Extract the block. - blockBuf := item.data[:item.end] - // Compress the block. - if doCompress { - out, err := b.compressData(blockBuf) - y.Check(err) - blockBuf = out - } - if b.shouldEncrypt() { - out, err := b.encrypt(blockBuf) - y.Check(y.Wrapf(err, "Error while encrypting block in table builder.")) - blockBuf = out - } - - // BlockBuf should always less than or equal to allocated space. If the blockBuf is greater - // than allocated space that means the data from this block cannot be stored in its - // existing location. - allocatedSpace := (item.end) + padding + 1 - y.AssertTrue(len(blockBuf) <= allocatedSpace) - - // blockBuf was allocated on allocator. So, we don't need to copy it over. - item.data = blockBuf - item.end = len(blockBuf) - atomic.AddUint32(&b.compressedSize, uint32(len(blockBuf))) - } -} - -// Close closes the TableBuilder. -func (b *Builder) Close() { - b.opts.AllocPool.Return(b.alloc) -} - -// Empty returns whether it's empty. -func (b *Builder) Empty() bool { return len(b.keyHashes) == 0 } - -// keyDiff returns a suffix of newKey that is different from b.baseKey. -func (b *Builder) keyDiff(newKey []byte) []byte { - var i int - for i = 0; i < len(newKey) && i < len(b.curBlock.baseKey); i++ { - if newKey[i] != b.curBlock.baseKey[i] { - break - } - } - return newKey[i:] -} - -func (b *Builder) addHelper(key []byte, v y.ValueStruct, vpLen uint32) { - b.keyHashes = append(b.keyHashes, y.Hash(y.ParseKey(key))) - - if version := y.ParseTs(key); version > b.maxVersion { - b.maxVersion = version - } - - // diffKey stores the difference of key with baseKey. - var diffKey []byte - if len(b.curBlock.baseKey) == 0 { - // Make a copy. Builder should not keep references. Otherwise, caller has to be very careful - // and will have to make copies of keys every time they add to builder, which is even worse. - b.curBlock.baseKey = append(b.curBlock.baseKey[:0], key...) - diffKey = key - } else { - diffKey = b.keyDiff(key) - } - - y.AssertTrue(len(key)-len(diffKey) <= math.MaxUint16) - y.AssertTrue(len(diffKey) <= math.MaxUint16) - - h := header{ - overlap: uint16(len(key) - len(diffKey)), - diff: uint16(len(diffKey)), - } - - // store current entry's offset - b.curBlock.entryOffsets = append(b.curBlock.entryOffsets, uint32(b.curBlock.end)) - - // Layout: header, diffKey, value. - b.append(h.Encode()) - b.append(diffKey) - - dst := b.allocate(int(v.EncodedSize())) - v.Encode(dst) - - // Add the vpLen to the onDisk size. We'll add the size of the block to - // onDisk size in Finish() function. - b.onDiskSize += vpLen -} - -/* -Structure of Block. -+-------------------+---------------------+--------------------+--------------+------------------+ -| Entry1 | Entry2 | Entry3 | Entry4 | Entry5 | -+-------------------+---------------------+--------------------+--------------+------------------+ -| Entry6 | ... | ... | ... | EntryN | -+-------------------+---------------------+--------------------+--------------+------------------+ -| Block Meta(contains list of offsets used| Block Meta Size | Block | Checksum Size | -| to perform binary search in the block) | (4 Bytes) | Checksum | (4 Bytes) | -+-----------------------------------------+--------------------+--------------+------------------+ -*/ -// In case the data is encrypted, the "IV" is added to the end of the block. -func (b *Builder) finishBlock() { - if len(b.curBlock.entryOffsets) == 0 { - return - } - // Append the entryOffsets and its length. - b.append(y.U32SliceToBytes(b.curBlock.entryOffsets)) - b.append(y.U32ToBytes(uint32(len(b.curBlock.entryOffsets)))) - - checksum := b.calculateChecksum(b.curBlock.data[:b.curBlock.end]) - - // Append the block checksum and its length. - b.append(checksum) - b.append(y.U32ToBytes(uint32(len(checksum)))) - - b.blockList = append(b.blockList, b.curBlock) - atomic.AddUint32(&b.uncompressedSize, uint32(b.curBlock.end)) - - // Add length of baseKey (rounded to next multiple of 4 because of alignment). - // Add another 40 Bytes, these additional 40 bytes consists of - // 12 bytes of metadata of flatbuffer - // 8 bytes for Key in flat buffer - // 8 bytes for offset - // 8 bytes for the len - // 4 bytes for the size of slice while SliceAllocate - b.lenOffsets += uint32(int(math.Ceil(float64(len(b.curBlock.baseKey))/4))*4) + 40 - - // If compression/encryption is enabled, we need to send the block to the blockChan. - if b.blockChan != nil { - b.blockChan <- b.curBlock - } - return -} - -func (b *Builder) shouldFinishBlock(key []byte, value y.ValueStruct) bool { - // If there is no entry till now, we will return false. - if len(b.curBlock.entryOffsets) <= 0 { - return false - } - - // Integer overflow check for statements below. - y.AssertTrue((uint32(len(b.curBlock.entryOffsets))+1)*4+4+8+4 < math.MaxUint32) - // We should include current entry also in size, that's why +1 to len(b.entryOffsets). - entriesOffsetsSize := uint32((len(b.curBlock.entryOffsets)+1)*4 + - 4 + // size of list - 8 + // Sum64 in checksum proto - 4) // checksum length - estimatedSize := uint32(b.curBlock.end) + uint32(6 /*header size for entry*/) + - uint32(len(key)) + uint32(value.EncodedSize()) + entriesOffsetsSize - - if b.shouldEncrypt() { - // IV is added at the end of the block, while encrypting. - // So, size of IV is added to estimatedSize. - estimatedSize += aes.BlockSize - } - - // Integer overflow check for table size. - y.AssertTrue(uint64(b.curBlock.end)+uint64(estimatedSize) < math.MaxUint32) - - return estimatedSize > uint32(b.opts.BlockSize) -} - -// AddStaleKey is same is Add function but it also increments the internal -// staleDataSize counter. This value will be used to prioritize this table for -// compaction. -func (b *Builder) AddStaleKey(key []byte, v y.ValueStruct, valueLen uint32) { - // Rough estimate based on how much space it will occupy in the SST. - b.staleDataSize += len(key) + len(v.Value) + 4 /* entry offset */ + 4 /* header size */ - b.addInternal(key, v, valueLen, true) -} - -// Add adds a key-value pair to the block. -func (b *Builder) Add(key []byte, value y.ValueStruct, valueLen uint32) { - b.addInternal(key, value, valueLen, false) -} - -func (b *Builder) addInternal(key []byte, value y.ValueStruct, valueLen uint32, isStale bool) { - if b.shouldFinishBlock(key, value) { - if isStale { - // This key will be added to tableIndex and it is stale. - b.staleDataSize += len(key) + 4 /* len */ + 4 /* offset */ - } - b.finishBlock() - // Create a new block and start writing. - b.curBlock = &bblock{ - data: b.alloc.Allocate(b.opts.BlockSize + padding), - } - } - b.addHelper(key, value, valueLen) -} - -// TODO: vvv this was the comment on ReachedCapacity. -// FinalSize returns the *rough* final size of the array, counting the header which is -// not yet written. -// TODO: Look into why there is a discrepancy. I suspect it is because of Write(empty, empty) -// at the end. The diff can vary. - -// ReachedCapacity returns true if we... roughly (?) reached capacity? -func (b *Builder) ReachedCapacity() bool { - // If encryption/compression is enabled then use the compresssed size. - sumBlockSizes := atomic.LoadUint32(&b.compressedSize) - if b.opts.Compression == options.None && b.opts.DataKey == nil { - sumBlockSizes = b.uncompressedSize - } - blocksSize := sumBlockSizes + // actual length of current buffer - uint32(len(b.curBlock.entryOffsets)*4) + // all entry offsets size - 4 + // count of all entry offsets - 8 + // checksum bytes - 4 // checksum length - - estimateSz := blocksSize + - 4 + // Index length - b.lenOffsets - - return uint64(estimateSz) > b.opts.tableCapacity -} - -// Finish finishes the table by appending the index. -/* -The table structure looks like -+---------+------------+-----------+---------------+ -| Block 1 | Block 2 | Block 3 | Block 4 | -+---------+------------+-----------+---------------+ -| Block 5 | Block 6 | Block ... | Block N | -+---------+------------+-----------+---------------+ -| Index | Index Size | Checksum | Checksum Size | -+---------+------------+-----------+---------------+ -*/ -// In case the data is encrypted, the "IV" is added to the end of the index. -func (b *Builder) Finish() []byte { - bd := b.Done() - buf := make([]byte, bd.Size) - written := bd.Copy(buf) - y.AssertTrue(written == len(buf)) - return buf -} - -type buildData struct { - blockList []*bblock - index []byte - checksum []byte - Size int - alloc *z.Allocator -} - -func (bd *buildData) Copy(dst []byte) int { - var written int - for _, bl := range bd.blockList { - written += copy(dst[written:], bl.data[:bl.end]) - } - written += copy(dst[written:], bd.index) - written += copy(dst[written:], y.U32ToBytes(uint32(len(bd.index)))) - - written += copy(dst[written:], bd.checksum) - written += copy(dst[written:], y.U32ToBytes(uint32(len(bd.checksum)))) - return written -} - -func (b *Builder) Done() buildData { - b.finishBlock() // This will never start a new block. - if b.blockChan != nil { - close(b.blockChan) - } - // Wait for block handler to finish. - b.wg.Wait() - - if len(b.blockList) == 0 { - return buildData{} - } - bd := buildData{ - blockList: b.blockList, - alloc: b.alloc, - } - - var f y.Filter - if b.opts.BloomFalsePositive > 0 { - bits := y.BloomBitsPerKey(len(b.keyHashes), b.opts.BloomFalsePositive) - f = y.NewFilter(b.keyHashes, bits) - } - index, dataSize := b.buildIndex(f) - - var err error - if b.shouldEncrypt() { - index, err = b.encrypt(index) - y.Check(err) - } - checksum := b.calculateChecksum(index) - - bd.index = index - bd.checksum = checksum - bd.Size = int(dataSize) + len(index) + len(checksum) + 4 + 4 - return bd -} - -func (b *Builder) calculateChecksum(data []byte) []byte { - // Build checksum for the index. - checksum := pb.Checksum{ - // TODO: The checksum type should be configurable from the - // options. - // We chose to use CRC32 as the default option because - // it performed better compared to xxHash64. - // See the BenchmarkChecksum in table_test.go file - // Size => 1024 B 2048 B - // CRC32 => 63.7 ns/op 112 ns/op - // xxHash64 => 87.5 ns/op 158 ns/op - Sum: y.CalculateChecksum(data, pb.Checksum_CRC32C), - Algo: pb.Checksum_CRC32C, - } - - // Write checksum to the file. - chksum, err := proto.Marshal(&checksum) - y.Check(err) - // Write checksum size. - return chksum -} - -// DataKey returns datakey of the builder. -func (b *Builder) DataKey() *pb.DataKey { - return b.opts.DataKey -} - -func (b *Builder) Opts() *Options { - return b.opts -} - -// encrypt will encrypt the given data and appends IV to the end of the encrypted data. -// This should be only called only after checking shouldEncrypt method. -func (b *Builder) encrypt(data []byte) ([]byte, error) { - iv, err := y.GenerateIV() - if err != nil { - return data, y.Wrapf(err, "Error while generating IV in Builder.encrypt") - } - needSz := len(data) + len(iv) - dst := b.alloc.Allocate(needSz) - - if err = y.XORBlock(dst[:len(data)], data, b.DataKey().Data, iv); err != nil { - return data, y.Wrapf(err, "Error while encrypting in Builder.encrypt") - } - - y.AssertTrue(len(iv) == copy(dst[len(data):], iv)) - return dst, nil -} - -// shouldEncrypt tells us whether to encrypt the data or not. -// We encrypt only if the data key exist. Otherwise, not. -func (b *Builder) shouldEncrypt() bool { - return b.opts.DataKey != nil -} - -// compressData compresses the given data. -func (b *Builder) compressData(data []byte) ([]byte, error) { - switch b.opts.Compression { - case options.None: - return data, nil - case options.Snappy: - sz := snappy.MaxEncodedLen(len(data)) - dst := b.alloc.Allocate(sz) - return snappy.Encode(dst, data), nil - case options.ZSTD: - sz := y.ZSTDCompressBound(len(data)) - dst := b.alloc.Allocate(sz) - return y.ZSTDCompress(dst, data, b.opts.ZSTDCompressionLevel) - } - return nil, errors.New("Unsupported compression type") -} - -func (b *Builder) buildIndex(bloom []byte) ([]byte, uint32) { - builder := fbs.NewBuilder(3 << 20) - - boList, dataSize := b.writeBlockOffsets(builder) - // Write block offset vector the the idxBuilder. - fb.TableIndexStartOffsetsVector(builder, len(boList)) - - // Write individual block offsets in reverse order to work around how Flatbuffers expects it. - for i := len(boList) - 1; i >= 0; i-- { - builder.PrependUOffsetT(boList[i]) - } - boEnd := builder.EndVector(len(boList)) - - var bfoff fbs.UOffsetT - // Write the bloom filter. - if len(bloom) > 0 { - bfoff = builder.CreateByteVector(bloom) - } - b.onDiskSize += dataSize - fb.TableIndexStart(builder) - fb.TableIndexAddOffsets(builder, boEnd) - fb.TableIndexAddBloomFilter(builder, bfoff) - fb.TableIndexAddMaxVersion(builder, b.maxVersion) - fb.TableIndexAddUncompressedSize(builder, b.uncompressedSize) - fb.TableIndexAddKeyCount(builder, uint32(len(b.keyHashes))) - fb.TableIndexAddOnDiskSize(builder, b.onDiskSize) - fb.TableIndexAddStaleDataSize(builder, uint32(b.staleDataSize)) - builder.Finish(fb.TableIndexEnd(builder)) - - buf := builder.FinishedBytes() - index := fb.GetRootAsTableIndex(buf, 0) - // Mutate the ondisk size to include the size of the index as well. - y.AssertTrue(index.MutateOnDiskSize(index.OnDiskSize() + uint32(len(buf)))) - return buf, dataSize -} - -// writeBlockOffsets writes all the blockOffets in b.offsets and returns the -// offsets for the newly written items. -func (b *Builder) writeBlockOffsets(builder *fbs.Builder) ([]fbs.UOffsetT, uint32) { - var startOffset uint32 - var uoffs []fbs.UOffsetT - for _, bl := range b.blockList { - uoff := b.writeBlockOffset(builder, bl, startOffset) - uoffs = append(uoffs, uoff) - startOffset += uint32(bl.end) - } - return uoffs, startOffset -} - -// writeBlockOffset writes the given key,offset,len triple to the indexBuilder. -// It returns the offset of the newly written blockoffset. -func (b *Builder) writeBlockOffset( - builder *fbs.Builder, bl *bblock, startOffset uint32) fbs.UOffsetT { - // Write the key to the buffer. - k := builder.CreateByteVector(bl.baseKey) - - // Build the blockOffset. - fb.BlockOffsetStart(builder) - fb.BlockOffsetAddKey(builder, k) - fb.BlockOffsetAddOffset(builder, startOffset) - fb.BlockOffsetAddLen(builder, uint32(bl.end)) - return fb.BlockOffsetEnd(builder) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/table/iterator.go b/vendor/github.com/dgraph-io/badger/v3/table/iterator.go deleted file mode 100644 index 26c9043c28..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/table/iterator.go +++ /dev/null @@ -1,568 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package table - -import ( - "bytes" - "fmt" - "io" - "sort" - - "github.com/dgraph-io/badger/v3/fb" - "github.com/dgraph-io/badger/v3/y" -) - -type blockIterator struct { - data []byte - idx int // Idx of the entry inside a block - err error - baseKey []byte - key []byte - val []byte - entryOffsets []uint32 - block *block - - tableID uint64 - blockID int - // prevOverlap stores the overlap of the previous key with the base key. - // This avoids unnecessary copy of base key when the overlap is same for multiple keys. - prevOverlap uint16 -} - -func (itr *blockIterator) setBlock(b *block) { - // Decrement the ref for the old block. If the old block was compressed, we - // might be able to reuse it. - itr.block.decrRef() - - itr.block = b - itr.err = nil - itr.idx = 0 - itr.baseKey = itr.baseKey[:0] - itr.prevOverlap = 0 - itr.key = itr.key[:0] - itr.val = itr.val[:0] - // Drop the index from the block. We don't need it anymore. - itr.data = b.data[:b.entriesIndexStart] - itr.entryOffsets = b.entryOffsets -} - -// setIdx sets the iterator to the entry at index i and set it's key and value. -func (itr *blockIterator) setIdx(i int) { - itr.idx = i - if i >= len(itr.entryOffsets) || i < 0 { - itr.err = io.EOF - return - } - itr.err = nil - startOffset := int(itr.entryOffsets[i]) - - // Set base key. - if len(itr.baseKey) == 0 { - var baseHeader header - baseHeader.Decode(itr.data) - itr.baseKey = itr.data[headerSize : headerSize+baseHeader.diff] - } - - var endOffset int - // idx points to the last entry in the block. - if itr.idx+1 == len(itr.entryOffsets) { - endOffset = len(itr.data) - } else { - // idx point to some entry other than the last one in the block. - // EndOffset of the current entry is the start offset of the next entry. - endOffset = int(itr.entryOffsets[itr.idx+1]) - } - defer func() { - if r := recover(); r != nil { - var debugBuf bytes.Buffer - fmt.Fprintf(&debugBuf, "==== Recovered====\n") - fmt.Fprintf(&debugBuf, "Table ID: %d\nBlock ID: %d\nEntry Idx: %d\nData len: %d\n"+ - "StartOffset: %d\nEndOffset: %d\nEntryOffsets len: %d\nEntryOffsets: %v\n", - itr.tableID, itr.blockID, itr.idx, len(itr.data), startOffset, endOffset, - len(itr.entryOffsets), itr.entryOffsets) - panic(debugBuf.String()) - } - }() - - entryData := itr.data[startOffset:endOffset] - var h header - h.Decode(entryData) - // Header contains the length of key overlap and difference compared to the base key. If the key - // before this one had the same or better key overlap, we can avoid copying that part into - // itr.key. But, if the overlap was lesser, we could copy over just that portion. - if h.overlap > itr.prevOverlap { - itr.key = append(itr.key[:itr.prevOverlap], itr.baseKey[itr.prevOverlap:h.overlap]...) - } - itr.prevOverlap = h.overlap - valueOff := headerSize + h.diff - diffKey := entryData[headerSize:valueOff] - itr.key = append(itr.key[:h.overlap], diffKey...) - itr.val = entryData[valueOff:] -} - -func (itr *blockIterator) Valid() bool { - return itr != nil && itr.err == nil -} - -func (itr *blockIterator) Error() error { - return itr.err -} - -func (itr *blockIterator) Close() { - itr.block.decrRef() -} - -var ( - origin = 0 - current = 1 -) - -// seek brings us to the first block element that is >= input key. -func (itr *blockIterator) seek(key []byte, whence int) { - itr.err = nil - startIndex := 0 // This tells from which index we should start binary search. - - switch whence { - case origin: - // We don't need to do anything. startIndex is already at 0 - case current: - startIndex = itr.idx - } - - foundEntryIdx := sort.Search(len(itr.entryOffsets), func(idx int) bool { - // If idx is less than start index then just return false. - if idx < startIndex { - return false - } - itr.setIdx(idx) - return y.CompareKeys(itr.key, key) >= 0 - }) - itr.setIdx(foundEntryIdx) -} - -// seekToFirst brings us to the first element. -func (itr *blockIterator) seekToFirst() { - itr.setIdx(0) -} - -// seekToLast brings us to the last element. -func (itr *blockIterator) seekToLast() { - itr.setIdx(len(itr.entryOffsets) - 1) -} - -func (itr *blockIterator) next() { - itr.setIdx(itr.idx + 1) -} - -func (itr *blockIterator) prev() { - itr.setIdx(itr.idx - 1) -} - -// Iterator is an iterator for a Table. -type Iterator struct { - t *Table - bpos int - bi blockIterator - err error - - // Internally, Iterator is bidirectional. However, we only expose the - // unidirectional functionality for now. - opt int // Valid options are REVERSED and NOCACHE. -} - -// NewIterator returns a new iterator of the Table -func (t *Table) NewIterator(opt int) *Iterator { - t.IncrRef() // Important. - ti := &Iterator{t: t, opt: opt} - return ti -} - -// Close closes the iterator (and it must be called). -func (itr *Iterator) Close() error { - itr.bi.Close() - return itr.t.DecrRef() -} - -func (itr *Iterator) reset() { - itr.bpos = 0 - itr.err = nil -} - -// Valid follows the y.Iterator interface -func (itr *Iterator) Valid() bool { - return itr.err == nil -} - -func (itr *Iterator) useCache() bool { - return itr.opt&NOCACHE == 0 -} - -func (itr *Iterator) seekToFirst() { - numBlocks := itr.t.offsetsLength() - if numBlocks == 0 { - itr.err = io.EOF - return - } - itr.bpos = 0 - block, err := itr.t.block(itr.bpos, itr.useCache()) - if err != nil { - itr.err = err - return - } - itr.bi.tableID = itr.t.id - itr.bi.blockID = itr.bpos - itr.bi.setBlock(block) - itr.bi.seekToFirst() - itr.err = itr.bi.Error() -} - -func (itr *Iterator) seekToLast() { - numBlocks := itr.t.offsetsLength() - if numBlocks == 0 { - itr.err = io.EOF - return - } - itr.bpos = numBlocks - 1 - block, err := itr.t.block(itr.bpos, itr.useCache()) - if err != nil { - itr.err = err - return - } - itr.bi.tableID = itr.t.id - itr.bi.blockID = itr.bpos - itr.bi.setBlock(block) - itr.bi.seekToLast() - itr.err = itr.bi.Error() -} - -func (itr *Iterator) seekHelper(blockIdx int, key []byte) { - itr.bpos = blockIdx - block, err := itr.t.block(blockIdx, itr.useCache()) - if err != nil { - itr.err = err - return - } - itr.bi.tableID = itr.t.id - itr.bi.blockID = itr.bpos - itr.bi.setBlock(block) - itr.bi.seek(key, origin) - itr.err = itr.bi.Error() -} - -// seekFrom brings us to a key that is >= input key. -func (itr *Iterator) seekFrom(key []byte, whence int) { - itr.err = nil - switch whence { - case origin: - itr.reset() - case current: - } - - var ko fb.BlockOffset - idx := sort.Search(itr.t.offsetsLength(), func(idx int) bool { - // Offsets should never return false since we're iterating within the OffsetsLength. - y.AssertTrue(itr.t.offsets(&ko, idx)) - return y.CompareKeys(ko.KeyBytes(), key) > 0 - }) - if idx == 0 { - // The smallest key in our table is already strictly > key. We can return that. - // This is like a SeekToFirst. - itr.seekHelper(0, key) - return - } - - // block[idx].smallest is > key. - // Since idx>0, we know block[idx-1].smallest is <= key. - // There are two cases. - // 1) Everything in block[idx-1] is strictly < key. In this case, we should go to the first - // element of block[idx]. - // 2) Some element in block[idx-1] is >= key. We should go to that element. - itr.seekHelper(idx-1, key) - if itr.err == io.EOF { - // Case 1. Need to visit block[idx]. - if idx == itr.t.offsetsLength() { - // If idx == len(itr.t.blockIndex), then input key is greater than ANY element of table. - // There's nothing we can do. Valid() should return false as we seek to end of table. - return - } - // Since block[idx].smallest is > key. This is essentially a block[idx].SeekToFirst. - itr.seekHelper(idx, key) - } - // Case 2: No need to do anything. We already did the seek in block[idx-1]. -} - -// seek will reset iterator and seek to >= key. -func (itr *Iterator) seek(key []byte) { - itr.seekFrom(key, origin) -} - -// seekForPrev will reset iterator and seek to <= key. -func (itr *Iterator) seekForPrev(key []byte) { - // TODO: Optimize this. We shouldn't have to take a Prev step. - itr.seekFrom(key, origin) - if !bytes.Equal(itr.Key(), key) { - itr.prev() - } -} - -func (itr *Iterator) next() { - itr.err = nil - - if itr.bpos >= itr.t.offsetsLength() { - itr.err = io.EOF - return - } - - if len(itr.bi.data) == 0 { - block, err := itr.t.block(itr.bpos, itr.useCache()) - if err != nil { - itr.err = err - return - } - itr.bi.tableID = itr.t.id - itr.bi.blockID = itr.bpos - itr.bi.setBlock(block) - itr.bi.seekToFirst() - itr.err = itr.bi.Error() - return - } - - itr.bi.next() - if !itr.bi.Valid() { - itr.bpos++ - itr.bi.data = nil - itr.next() - return - } -} - -func (itr *Iterator) prev() { - itr.err = nil - if itr.bpos < 0 { - itr.err = io.EOF - return - } - - if len(itr.bi.data) == 0 { - block, err := itr.t.block(itr.bpos, itr.useCache()) - if err != nil { - itr.err = err - return - } - itr.bi.tableID = itr.t.id - itr.bi.blockID = itr.bpos - itr.bi.setBlock(block) - itr.bi.seekToLast() - itr.err = itr.bi.Error() - return - } - - itr.bi.prev() - if !itr.bi.Valid() { - itr.bpos-- - itr.bi.data = nil - itr.prev() - return - } -} - -// Key follows the y.Iterator interface. -// Returns the key with timestamp. -func (itr *Iterator) Key() []byte { - return itr.bi.key -} - -// Value follows the y.Iterator interface -func (itr *Iterator) Value() (ret y.ValueStruct) { - ret.Decode(itr.bi.val) - return -} - -// ValueCopy copies the current value and returns it as decoded -// ValueStruct. -func (itr *Iterator) ValueCopy() (ret y.ValueStruct) { - dst := y.Copy(itr.bi.val) - ret.Decode(dst) - return -} - -// Next follows the y.Iterator interface -func (itr *Iterator) Next() { - if itr.opt&REVERSED == 0 { - itr.next() - } else { - itr.prev() - } -} - -// Rewind follows the y.Iterator interface -func (itr *Iterator) Rewind() { - if itr.opt&REVERSED == 0 { - itr.seekToFirst() - } else { - itr.seekToLast() - } -} - -// Seek follows the y.Iterator interface -func (itr *Iterator) Seek(key []byte) { - if itr.opt&REVERSED == 0 { - itr.seek(key) - } else { - itr.seekForPrev(key) - } -} - -var ( - REVERSED int = 2 - NOCACHE int = 4 -) - -// ConcatIterator concatenates the sequences defined by several iterators. (It only works with -// TableIterators, probably just because it's faster to not be so generic.) -type ConcatIterator struct { - idx int // Which iterator is active now. - cur *Iterator - iters []*Iterator // Corresponds to tables. - tables []*Table // Disregarding reversed, this is in ascending order. - options int // Valid options are REVERSED and NOCACHE. -} - -// NewConcatIterator creates a new concatenated iterator -func NewConcatIterator(tbls []*Table, opt int) *ConcatIterator { - iters := make([]*Iterator, len(tbls)) - for i := 0; i < len(tbls); i++ { - // Increment the reference count. Since, we're not creating the iterator right now. - // Here, We'll hold the reference of the tables, till the lifecycle of the iterator. - tbls[i].IncrRef() - - // Save cycles by not initializing the iterators until needed. - // iters[i] = tbls[i].NewIterator(reversed) - } - return &ConcatIterator{ - options: opt, - iters: iters, - tables: tbls, - idx: -1, // Not really necessary because s.it.Valid()=false, but good to have. - } -} - -func (s *ConcatIterator) setIdx(idx int) { - s.idx = idx - if idx < 0 || idx >= len(s.iters) { - s.cur = nil - return - } - if s.iters[idx] == nil { - s.iters[idx] = s.tables[idx].NewIterator(s.options) - } - s.cur = s.iters[s.idx] -} - -// Rewind implements y.Interface -func (s *ConcatIterator) Rewind() { - if len(s.iters) == 0 { - return - } - if s.options&REVERSED == 0 { - s.setIdx(0) - } else { - s.setIdx(len(s.iters) - 1) - } - s.cur.Rewind() -} - -// Valid implements y.Interface -func (s *ConcatIterator) Valid() bool { - return s.cur != nil && s.cur.Valid() -} - -// Key implements y.Interface -func (s *ConcatIterator) Key() []byte { - return s.cur.Key() -} - -// Value implements y.Interface -func (s *ConcatIterator) Value() y.ValueStruct { - return s.cur.Value() -} - -// Seek brings us to element >= key if reversed is false. Otherwise, <= key. -func (s *ConcatIterator) Seek(key []byte) { - var idx int - if s.options&REVERSED == 0 { - idx = sort.Search(len(s.tables), func(i int) bool { - return y.CompareKeys(s.tables[i].Biggest(), key) >= 0 - }) - } else { - n := len(s.tables) - idx = n - 1 - sort.Search(n, func(i int) bool { - return y.CompareKeys(s.tables[n-1-i].Smallest(), key) <= 0 - }) - } - if idx >= len(s.tables) || idx < 0 { - s.setIdx(-1) - return - } - // For reversed=false, we know s.tables[i-1].Biggest() < key. Thus, the - // previous table cannot possibly contain key. - s.setIdx(idx) - s.cur.Seek(key) -} - -// Next advances our concat iterator. -func (s *ConcatIterator) Next() { - s.cur.Next() - if s.cur.Valid() { - // Nothing to do. Just stay with the current table. - return - } - for { // In case there are empty tables. - if s.options&REVERSED == 0 { - s.setIdx(s.idx + 1) - } else { - s.setIdx(s.idx - 1) - } - if s.cur == nil { - // End of list. Valid will become false. - return - } - s.cur.Rewind() - if s.cur.Valid() { - break - } - } -} - -// Close implements y.Interface. -func (s *ConcatIterator) Close() error { - for _, t := range s.tables { - // DeReference the tables while closing the iterator. - if err := t.DecrRef(); err != nil { - return err - } - } - for _, it := range s.iters { - if it == nil { - continue - } - if err := it.Close(); err != nil { - return y.Wrap(err, "ConcatIterator") - } - } - return nil -} diff --git a/vendor/github.com/dgraph-io/badger/v3/table/merge_iterator.go b/vendor/github.com/dgraph-io/badger/v3/table/merge_iterator.go deleted file mode 100644 index 789a24fd7b..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/table/merge_iterator.go +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package table - -import ( - "bytes" - - "github.com/dgraph-io/badger/v3/y" -) - -// MergeIterator merges multiple iterators. -// NOTE: MergeIterator owns the array of iterators and is responsible for closing them. -type MergeIterator struct { - left node - right node - small *node - - curKey []byte - reverse bool -} - -type node struct { - valid bool - key []byte - iter y.Iterator - - // The two iterators are type asserted from `y.Iterator`, used to inline more function calls. - // Calling functions on concrete types is much faster (about 25-30%) than calling the - // interface's function. - merge *MergeIterator - concat *ConcatIterator -} - -func (n *node) setIterator(iter y.Iterator) { - n.iter = iter - // It's okay if the type assertion below fails and n.merge/n.concat are set to nil. - // We handle the nil values of merge and concat in all the methods. - n.merge, _ = iter.(*MergeIterator) - n.concat, _ = iter.(*ConcatIterator) -} - -func (n *node) setKey() { - switch { - case n.merge != nil: - n.valid = n.merge.small.valid - if n.valid { - n.key = n.merge.small.key - } - case n.concat != nil: - n.valid = n.concat.Valid() - if n.valid { - n.key = n.concat.Key() - } - default: - n.valid = n.iter.Valid() - if n.valid { - n.key = n.iter.Key() - } - } -} - -func (n *node) next() { - switch { - case n.merge != nil: - n.merge.Next() - case n.concat != nil: - n.concat.Next() - default: - n.iter.Next() - } - n.setKey() -} - -func (n *node) rewind() { - n.iter.Rewind() - n.setKey() -} - -func (n *node) seek(key []byte) { - n.iter.Seek(key) - n.setKey() -} - -func (mi *MergeIterator) fix() { - if !mi.bigger().valid { - return - } - if !mi.small.valid { - mi.swapSmall() - return - } - cmp := y.CompareKeys(mi.small.key, mi.bigger().key) - switch { - case cmp == 0: // Both the keys are equal. - // In case of same keys, move the right iterator ahead. - mi.right.next() - if &mi.right == mi.small { - mi.swapSmall() - } - return - case cmp < 0: // Small is less than bigger(). - if mi.reverse { - mi.swapSmall() - } else { - // we don't need to do anything. Small already points to the smallest. - } - return - default: // bigger() is less than small. - if mi.reverse { - // Do nothing since we're iterating in reverse. Small currently points to - // the bigger key and that's okay in reverse iteration. - } else { - mi.swapSmall() - } - return - } -} - -func (mi *MergeIterator) bigger() *node { - if mi.small == &mi.left { - return &mi.right - } - return &mi.left -} - -func (mi *MergeIterator) swapSmall() { - if mi.small == &mi.left { - mi.small = &mi.right - return - } - if mi.small == &mi.right { - mi.small = &mi.left - return - } -} - -// Next returns the next element. If it is the same as the current key, ignore it. -func (mi *MergeIterator) Next() { - for mi.Valid() { - if !bytes.Equal(mi.small.key, mi.curKey) { - break - } - mi.small.next() - mi.fix() - } - mi.setCurrent() -} - -func (mi *MergeIterator) setCurrent() { - mi.curKey = append(mi.curKey[:0], mi.small.key...) -} - -// Rewind seeks to first element (or last element for reverse iterator). -func (mi *MergeIterator) Rewind() { - mi.left.rewind() - mi.right.rewind() - mi.fix() - mi.setCurrent() -} - -// Seek brings us to element with key >= given key. -func (mi *MergeIterator) Seek(key []byte) { - mi.left.seek(key) - mi.right.seek(key) - mi.fix() - mi.setCurrent() -} - -// Valid returns whether the MergeIterator is at a valid element. -func (mi *MergeIterator) Valid() bool { - return mi.small.valid -} - -// Key returns the key associated with the current iterator. -func (mi *MergeIterator) Key() []byte { - return mi.small.key -} - -// Value returns the value associated with the iterator. -func (mi *MergeIterator) Value() y.ValueStruct { - return mi.small.iter.Value() -} - -// Close implements y.Iterator. -func (mi *MergeIterator) Close() error { - err1 := mi.left.iter.Close() - err2 := mi.right.iter.Close() - if err1 != nil { - return y.Wrap(err1, "MergeIterator") - } - return y.Wrap(err2, "MergeIterator") -} - -// NewMergeIterator creates a merge iterator. -func NewMergeIterator(iters []y.Iterator, reverse bool) y.Iterator { - switch len(iters) { - case 0: - return nil - case 1: - return iters[0] - case 2: - mi := &MergeIterator{ - reverse: reverse, - } - mi.left.setIterator(iters[0]) - mi.right.setIterator(iters[1]) - // Assign left iterator randomly. This will be fixed when user calls rewind/seek. - mi.small = &mi.left - return mi - } - mid := len(iters) / 2 - return NewMergeIterator( - []y.Iterator{ - NewMergeIterator(iters[:mid], reverse), - NewMergeIterator(iters[mid:], reverse), - }, reverse) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/table/table.go b/vendor/github.com/dgraph-io/badger/v3/table/table.go deleted file mode 100644 index 1378f9a36b..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/table/table.go +++ /dev/null @@ -1,842 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package table - -import ( - "bytes" - "crypto/aes" - "encoding/binary" - "fmt" - "math" - "os" - "path/filepath" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" - "unsafe" - - "github.com/golang/protobuf/proto" - "github.com/golang/snappy" - "github.com/pkg/errors" - - "github.com/dgraph-io/badger/v3/fb" - "github.com/dgraph-io/badger/v3/options" - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto" - "github.com/dgraph-io/ristretto/z" -) - -const fileSuffix = ".sst" -const intSize = int(unsafe.Sizeof(int(0))) - -// Options contains configurable options for Table/Builder. -type Options struct { - // Options for Opening/Building Table. - - // Open tables in read only mode. - ReadOnly bool - MetricsEnabled bool - - // Maximum size of the table. - TableSize uint64 - tableCapacity uint64 // 0.9x TableSize. - - // ChkMode is the checksum verification mode for Table. - ChkMode options.ChecksumVerificationMode - - // Options for Table builder. - - // BloomFalsePositive is the false positive probabiltiy of bloom filter. - BloomFalsePositive float64 - - // BlockSize is the size of each block inside SSTable in bytes. - BlockSize int - - // DataKey is the key used to decrypt the encrypted text. - DataKey *pb.DataKey - - // Compression indicates the compression algorithm used for block compression. - Compression options.CompressionType - - // Block cache is used to cache decompressed and decrypted blocks. - BlockCache *ristretto.Cache - IndexCache *ristretto.Cache - - AllocPool *z.AllocatorPool - - // ZSTDCompressionLevel is the ZSTD compression level used for compressing blocks. - ZSTDCompressionLevel int -} - -// TableInterface is useful for testing. -type TableInterface interface { - Smallest() []byte - Biggest() []byte - DoesNotHave(hash uint32) bool - MaxVersion() uint64 -} - -// Table represents a loaded table file with the info we have about it. -type Table struct { - sync.Mutex - *z.MmapFile - - tableSize int // Initialized in OpenTable, using fd.Stat(). - - _index *fb.TableIndex // Nil if encryption is enabled. Use fetchIndex to access. - _cheap *cheapIndex - ref int32 // For file garbage collection. Atomic. - - // The following are initialized once and const. - smallest, biggest []byte // Smallest and largest keys (with timestamps). - id uint64 // file id, part of filename - - Checksum []byte - CreatedAt time.Time - indexStart int - indexLen int - hasBloomFilter bool - - IsInmemory bool // Set to true if the table is on level 0 and opened in memory. - opt *Options -} - -type cheapIndex struct { - MaxVersion uint64 - KeyCount uint32 - UncompressedSize uint32 - OnDiskSize uint32 - BloomFilterLength int - OffsetsLength int -} - -func (t *Table) cheapIndex() *cheapIndex { - return t._cheap -} -func (t *Table) offsetsLength() int { return t.cheapIndex().OffsetsLength } - -// MaxVersion returns the maximum version across all keys stored in this table. -func (t *Table) MaxVersion() uint64 { return t.cheapIndex().MaxVersion } - -// BloomFilterSize returns the size of the bloom filter in bytes stored in memory. -func (t *Table) BloomFilterSize() int { return t.cheapIndex().BloomFilterLength } - -// UncompressedSize is the size uncompressed data stored in this file. -func (t *Table) UncompressedSize() uint32 { return t.cheapIndex().UncompressedSize } - -// KeyCount is the total number of keys in this table. -func (t *Table) KeyCount() uint32 { return t.cheapIndex().KeyCount } - -// OnDiskSize returns the total size of key-values stored in this table (including the -// disk space occupied on the value log). -func (t *Table) OnDiskSize() uint32 { return t.cheapIndex().OnDiskSize } - -// CompressionType returns the compression algorithm used for block compression. -func (t *Table) CompressionType() options.CompressionType { - return t.opt.Compression -} - -// IncrRef increments the refcount (having to do with whether the file should be deleted) -func (t *Table) IncrRef() { - atomic.AddInt32(&t.ref, 1) -} - -// DecrRef decrements the refcount and possibly deletes the table -func (t *Table) DecrRef() error { - newRef := atomic.AddInt32(&t.ref, -1) - if newRef == 0 { - // We can safely delete this file, because for all the current files, we always have - // at least one reference pointing to them. - - // Delete all blocks from the cache. - for i := 0; i < t.offsetsLength(); i++ { - t.opt.BlockCache.Del(t.blockCacheKey(i)) - } - if err := t.Delete(); err != nil { - return err - } - } - return nil -} - -// BlockEvictHandler is used to reuse the byte slice stored in the block on cache eviction. -func BlockEvictHandler(value interface{}) { - if b, ok := value.(*block); ok { - b.decrRef() - } -} - -type block struct { - offset int - data []byte - checksum []byte - entriesIndexStart int // start index of entryOffsets list - entryOffsets []uint32 // used to binary search an entry in the block. - chkLen int // checksum length. - freeMe bool // used to determine if the blocked should be reused. - ref int32 -} - -var NumBlocks int32 - -// incrRef increments the ref of a block and return a bool indicating if the -// increment was successful. A true value indicates that the block can be used. -func (b *block) incrRef() bool { - for { - // We can't blindly add 1 to ref. We need to check whether it has - // reached zero first, because if it did, then we should absolutely not - // use this block. - ref := atomic.LoadInt32(&b.ref) - // The ref would not be equal to 0 unless the existing - // block get evicted before this line. If the ref is zero, it means that - // the block is already added the the blockPool and cannot be used - // anymore. The ref of a new block is 1 so the following condition will - // be true only if the block got reused before we could increment its - // ref. - if ref == 0 { - return false - } - // Increment the ref only if it is not zero and has not changed between - // the time we read it and we're updating it. - // - if atomic.CompareAndSwapInt32(&b.ref, ref, ref+1) { - return true - } - } -} -func (b *block) decrRef() { - if b == nil { - return - } - - // Insert the []byte into pool only if the block is resuable. When a block - // is reusable a new []byte is used for decompression and this []byte can - // be reused. - // In case of an uncompressed block, the []byte is a reference to the - // table.mmap []byte slice. Any attempt to write data to the mmap []byte - // will lead to SEGFAULT. - if atomic.AddInt32(&b.ref, -1) == 0 { - if b.freeMe { - z.Free(b.data) - } - atomic.AddInt32(&NumBlocks, -1) - // blockPool.Put(&b.data) - } - y.AssertTrue(atomic.LoadInt32(&b.ref) >= 0) -} -func (b *block) size() int64 { - return int64(3*intSize /* Size of the offset, entriesIndexStart and chkLen */ + - cap(b.data) + cap(b.checksum) + cap(b.entryOffsets)*4) -} - -func (b block) verifyCheckSum() error { - cs := &pb.Checksum{} - if err := proto.Unmarshal(b.checksum, cs); err != nil { - return y.Wrapf(err, "unable to unmarshal checksum for block") - } - return y.VerifyChecksum(b.data, cs) -} - -func CreateTable(fname string, builder *Builder) (*Table, error) { - bd := builder.Done() - mf, err := z.OpenMmapFile(fname, os.O_CREATE|os.O_RDWR|os.O_EXCL, bd.Size) - if err == z.NewFile { - // Expected. - } else if err != nil { - return nil, y.Wrapf(err, "while creating table: %s", fname) - } else { - return nil, errors.Errorf("file already exists: %s", fname) - } - - written := bd.Copy(mf.Data) - y.AssertTrue(written == len(mf.Data)) - if err := z.Msync(mf.Data); err != nil { - return nil, y.Wrapf(err, "while calling msync on %s", fname) - } - return OpenTable(mf, *builder.opts) -} - -// OpenTable assumes file has only one table and opens it. Takes ownership of fd upon function -// entry. Returns a table with one reference count on it (decrementing which may delete the file! -// -- consider t.Close() instead). The fd has to writeable because we call Truncate on it before -// deleting. Checksum for all blocks of table is verified based on value of chkMode. -func OpenTable(mf *z.MmapFile, opts Options) (*Table, error) { - // BlockSize is used to compute the approximate size of the decompressed - // block. It should not be zero if the table is compressed. - if opts.BlockSize == 0 && opts.Compression != options.None { - return nil, errors.New("Block size cannot be zero") - } - fileInfo, err := mf.Fd.Stat() - if err != nil { - mf.Close(-1) - return nil, y.Wrap(err, "") - } - - filename := fileInfo.Name() - id, ok := ParseFileID(filename) - if !ok { - mf.Close(-1) - return nil, errors.Errorf("Invalid filename: %s", filename) - } - t := &Table{ - MmapFile: mf, - ref: 1, // Caller is given one reference. - id: id, - opt: &opts, - IsInmemory: false, - tableSize: int(fileInfo.Size()), - CreatedAt: fileInfo.ModTime(), - } - - if err := t.initBiggestAndSmallest(); err != nil { - return nil, y.Wrapf(err, "failed to initialize table") - } - - if opts.ChkMode == options.OnTableRead || opts.ChkMode == options.OnTableAndBlockRead { - if err := t.VerifyChecksum(); err != nil { - mf.Close(-1) - return nil, y.Wrapf(err, "failed to verify checksum") - } - } - - return t, nil -} - -// OpenInMemoryTable is similar to OpenTable but it opens a new table from the provided data. -// OpenInMemoryTable is used for L0 tables. -func OpenInMemoryTable(data []byte, id uint64, opt *Options) (*Table, error) { - mf := &z.MmapFile{ - Data: data, - Fd: nil, - } - t := &Table{ - MmapFile: mf, - ref: 1, // Caller is given one reference. - opt: opt, - tableSize: len(data), - IsInmemory: true, - id: id, // It is important that each table gets a unique ID. - } - - if err := t.initBiggestAndSmallest(); err != nil { - return nil, err - } - return t, nil -} - -func (t *Table) initBiggestAndSmallest() error { - // This defer will help gathering debugging info incase initIndex crashes. - defer func() { - if r := recover(); r != nil { - // Use defer for printing info because there may be an intermediate panic. - var debugBuf bytes.Buffer - defer func() { - panic(fmt.Sprintf("%s\n== Recovered ==\n", debugBuf.String())) - }() - - // Get the count of null bytes at the end of file. This is to make sure if there was an - // issue with mmap sync or file copy. - count := 0 - for i := len(t.Data) - 1; i >= 0; i-- { - if t.Data[i] != 0 { - break - } - count++ - } - - fmt.Fprintf(&debugBuf, "\n== Recovering from initIndex crash ==\n") - fmt.Fprintf(&debugBuf, "File Info: [ID: %d, Size: %d, Zeros: %d]\n", - t.id, t.tableSize, count) - - fmt.Fprintf(&debugBuf, "isEnrypted: %v ", t.shouldDecrypt()) - - readPos := t.tableSize - - // Read checksum size. - readPos -= 4 - buf := t.readNoFail(readPos, 4) - checksumLen := int(y.BytesToU32(buf)) - fmt.Fprintf(&debugBuf, "checksumLen: %d ", checksumLen) - - // Read checksum. - checksum := &pb.Checksum{} - readPos -= checksumLen - buf = t.readNoFail(readPos, checksumLen) - proto.Unmarshal(buf, checksum) - fmt.Fprintf(&debugBuf, "checksum: %+v ", checksum) - - // Read index size from the footer. - readPos -= 4 - buf = t.readNoFail(readPos, 4) - indexLen := int(y.BytesToU32(buf)) - fmt.Fprintf(&debugBuf, "indexLen: %d ", indexLen) - - // Read index. - readPos -= t.indexLen - t.indexStart = readPos - indexData := t.readNoFail(readPos, t.indexLen) - fmt.Fprintf(&debugBuf, "index: %v ", indexData) - } - }() - - var err error - var ko *fb.BlockOffset - if ko, err = t.initIndex(); err != nil { - return y.Wrapf(err, "failed to read index.") - } - - t.smallest = y.Copy(ko.KeyBytes()) - - it2 := t.NewIterator(REVERSED | NOCACHE) - defer it2.Close() - it2.Rewind() - if !it2.Valid() { - return y.Wrapf(it2.err, "failed to initialize biggest for table %s", t.Filename()) - } - t.biggest = y.Copy(it2.Key()) - return nil -} - -func (t *Table) read(off, sz int) ([]byte, error) { - return t.Bytes(off, sz) -} - -func (t *Table) readNoFail(off, sz int) []byte { - res, err := t.read(off, sz) - y.Check(err) - return res -} - -// initIndex reads the index and populate the necessary table fields and returns -// first block offset -func (t *Table) initIndex() (*fb.BlockOffset, error) { - readPos := t.tableSize - - // Read checksum len from the last 4 bytes. - readPos -= 4 - buf := t.readNoFail(readPos, 4) - checksumLen := int(y.BytesToU32(buf)) - if checksumLen < 0 { - return nil, errors.New("checksum length less than zero. Data corrupted") - } - - // Read checksum. - expectedChk := &pb.Checksum{} - readPos -= checksumLen - buf = t.readNoFail(readPos, checksumLen) - if err := proto.Unmarshal(buf, expectedChk); err != nil { - return nil, err - } - - // Read index size from the footer. - readPos -= 4 - buf = t.readNoFail(readPos, 4) - t.indexLen = int(y.BytesToU32(buf)) - - // Read index. - readPos -= t.indexLen - t.indexStart = readPos - data := t.readNoFail(readPos, t.indexLen) - - if err := y.VerifyChecksum(data, expectedChk); err != nil { - return nil, y.Wrapf(err, "failed to verify checksum for table: %s", t.Filename()) - } - - index, err := t.readTableIndex() - if err != nil { - return nil, err - } - if !t.shouldDecrypt() { - // If there's no encryption, this points to the mmap'ed buffer. - t._index = index - } - t._cheap = &cheapIndex{ - MaxVersion: index.MaxVersion(), - KeyCount: index.KeyCount(), - UncompressedSize: index.UncompressedSize(), - OnDiskSize: index.OnDiskSize(), - OffsetsLength: index.OffsetsLength(), - BloomFilterLength: index.BloomFilterLength(), - } - - t.hasBloomFilter = len(index.BloomFilterBytes()) > 0 - - var bo fb.BlockOffset - y.AssertTrue(index.Offsets(&bo, 0)) - return &bo, nil -} - -// KeySplits splits the table into at least n ranges based on the block offsets. -func (t *Table) KeySplits(n int, prefix []byte) []string { - if n == 0 { - return nil - } - - oLen := t.offsetsLength() - jump := oLen / n - if jump == 0 { - jump = 1 - } - - var bo fb.BlockOffset - var res []string - for i := 0; i < oLen; i += jump { - if i >= oLen { - i = oLen - 1 - } - y.AssertTrue(t.offsets(&bo, i)) - if bytes.HasPrefix(bo.KeyBytes(), prefix) { - res = append(res, string(bo.KeyBytes())) - } - } - return res -} - -func (t *Table) fetchIndex() *fb.TableIndex { - if !t.shouldDecrypt() { - return t._index - } - - if t.opt.IndexCache == nil { - panic("Index Cache must be set for encrypted workloads") - } - if val, ok := t.opt.IndexCache.Get(t.indexKey()); ok && val != nil { - return val.(*fb.TableIndex) - } - - index, err := t.readTableIndex() - y.Check(err) - t.opt.IndexCache.Set(t.indexKey(), index, int64(t.indexLen)) - return index -} - -func (t *Table) offsets(ko *fb.BlockOffset, i int) bool { - return t.fetchIndex().Offsets(ko, i) -} - -// block function return a new block. Each block holds a ref and the byte -// slice stored in the block will be reused when the ref becomes zero. The -// caller should release the block by calling block.decrRef() on it. -func (t *Table) block(idx int, useCache bool) (*block, error) { - y.AssertTruef(idx >= 0, "idx=%d", idx) - if idx >= t.offsetsLength() { - return nil, errors.New("block out of index") - } - if t.opt.BlockCache != nil { - key := t.blockCacheKey(idx) - blk, ok := t.opt.BlockCache.Get(key) - if ok && blk != nil { - // Use the block only if the increment was successful. The block - // could get evicted from the cache between the Get() call and the - // incrRef() call. - if b := blk.(*block); b.incrRef() { - return b, nil - } - } - } - - var ko fb.BlockOffset - y.AssertTrue(t.offsets(&ko, idx)) - blk := &block{ - offset: int(ko.Offset()), - ref: 1, - } - defer blk.decrRef() // Deal with any errors, where blk would not be returned. - atomic.AddInt32(&NumBlocks, 1) - - var err error - if blk.data, err = t.read(blk.offset, int(ko.Len())); err != nil { - return nil, y.Wrapf(err, - "failed to read from file: %s at offset: %d, len: %d", - t.Fd.Name(), blk.offset, ko.Len()) - } - - if t.shouldDecrypt() { - // Decrypt the block if it is encrypted. - if blk.data, err = t.decrypt(blk.data, true); err != nil { - return nil, err - } - // blk.data is allocated via Calloc. So, do free. - blk.freeMe = true - } - - if err = t.decompress(blk); err != nil { - return nil, y.Wrapf(err, - "failed to decode compressed data in file: %s at offset: %d, len: %d", - t.Fd.Name(), blk.offset, ko.Len()) - } - - // Read meta data related to block. - readPos := len(blk.data) - 4 // First read checksum length. - blk.chkLen = int(y.BytesToU32(blk.data[readPos : readPos+4])) - - // Checksum length greater than block size could happen if the table was compressed and - // it was opened with an incorrect compression algorithm (or the data was corrupted). - if blk.chkLen > len(blk.data) { - return nil, errors.New("invalid checksum length. Either the data is " + - "corrupted or the table options are incorrectly set") - } - - // Read checksum and store it - readPos -= blk.chkLen - blk.checksum = blk.data[readPos : readPos+blk.chkLen] - // Move back and read numEntries in the block. - readPos -= 4 - numEntries := int(y.BytesToU32(blk.data[readPos : readPos+4])) - entriesIndexStart := readPos - (numEntries * 4) - entriesIndexEnd := entriesIndexStart + numEntries*4 - - blk.entryOffsets = y.BytesToU32Slice(blk.data[entriesIndexStart:entriesIndexEnd]) - - blk.entriesIndexStart = entriesIndexStart - - // Drop checksum and checksum length. - // The checksum is calculated for actual data + entry index + index length - blk.data = blk.data[:readPos+4] - - // Verify checksum on if checksum verification mode is OnRead on OnStartAndRead. - if t.opt.ChkMode == options.OnBlockRead || t.opt.ChkMode == options.OnTableAndBlockRead { - if err = blk.verifyCheckSum(); err != nil { - return nil, err - } - } - - blk.incrRef() - if useCache && t.opt.BlockCache != nil { - key := t.blockCacheKey(idx) - // incrRef should never return false here because we're calling it on a - // new block with ref=1. - y.AssertTrue(blk.incrRef()) - - // Decrement the block ref if we could not insert it in the cache. - if !t.opt.BlockCache.Set(key, blk, blk.size()) { - blk.decrRef() - } - // We have added an OnReject func in our cache, which gets called in case the block is not - // admitted to the cache. So, every block would be accounted for. - } - return blk, nil -} - -// blockCacheKey is used to store blocks in the block cache. -func (t *Table) blockCacheKey(idx int) []byte { - y.AssertTrue(t.id < math.MaxUint32) - y.AssertTrue(uint32(idx) < math.MaxUint32) - - buf := make([]byte, 8) - // Assume t.ID does not overflow uint32. - binary.BigEndian.PutUint32(buf[:4], uint32(t.ID())) - binary.BigEndian.PutUint32(buf[4:], uint32(idx)) - return buf -} - -// indexKey returns the cache key for block offsets. blockOffsets -// are stored in the index cache. -func (t *Table) indexKey() uint64 { - return t.id -} - -// IndexSize is the size of table index in bytes. -func (t *Table) IndexSize() int { - return t.indexLen -} - -// Size is its file size in bytes -func (t *Table) Size() int64 { return int64(t.tableSize) } - -// StaleDataSize is the amount of stale data (that can be dropped by a compaction )in this SST. -func (t *Table) StaleDataSize() uint32 { return t.fetchIndex().StaleDataSize() } - -// Smallest is its smallest key, or nil if there are none -func (t *Table) Smallest() []byte { return t.smallest } - -// Biggest is its biggest key, or nil if there are none -func (t *Table) Biggest() []byte { return t.biggest } - -// Filename is NOT the file name. Just kidding, it is. -func (t *Table) Filename() string { return t.Fd.Name() } - -// ID is the table's ID number (used to make the file name). -func (t *Table) ID() uint64 { return t.id } - -// DoesNotHave returns true if and only if the table does not have the key hash. -// It does a bloom filter lookup. -func (t *Table) DoesNotHave(hash uint32) bool { - if !t.hasBloomFilter { - return false - } - - y.NumLSMBloomHitsAdd(t.opt.MetricsEnabled, "DoesNotHave_ALL", 1) - index := t.fetchIndex() - bf := index.BloomFilterBytes() - mayContain := y.Filter(bf).MayContain(hash) - if !mayContain { - y.NumLSMBloomHitsAdd(t.opt.MetricsEnabled, "DoesNotHave_HIT", 1) - } - return !mayContain -} - -// readTableIndex reads table index from the sst and returns its pb format. -func (t *Table) readTableIndex() (*fb.TableIndex, error) { - data := t.readNoFail(t.indexStart, t.indexLen) - var err error - // Decrypt the table index if it is encrypted. - if t.shouldDecrypt() { - if data, err = t.decrypt(data, false); err != nil { - return nil, y.Wrapf(err, - "Error while decrypting table index for the table %d in readTableIndex", t.id) - } - } - return fb.GetRootAsTableIndex(data, 0), nil -} - -// VerifyChecksum verifies checksum for all blocks of table. This function is called by -// OpenTable() function. This function is also called inside levelsController.VerifyChecksum(). -func (t *Table) VerifyChecksum() error { - ti := t.fetchIndex() - for i := 0; i < ti.OffsetsLength(); i++ { - b, err := t.block(i, true) - if err != nil { - return y.Wrapf(err, "checksum validation failed for table: %s, block: %d, offset:%d", - t.Filename(), i, b.offset) - } - // We should not call incrRef here, because the block already has one ref when created. - defer b.decrRef() - // OnBlockRead or OnTableAndBlockRead, we don't need to call verify checksum - // on block, verification would be done while reading block itself. - if !(t.opt.ChkMode == options.OnBlockRead || t.opt.ChkMode == options.OnTableAndBlockRead) { - if err = b.verifyCheckSum(); err != nil { - return y.Wrapf(err, - "checksum validation failed for table: %s, block: %d, offset:%d", - t.Filename(), i, b.offset) - } - } - } - return nil -} - -// shouldDecrypt tells whether to decrypt or not. We decrypt only if the datakey exist -// for the table. -func (t *Table) shouldDecrypt() bool { - return t.opt.DataKey != nil -} - -// KeyID returns data key id. -func (t *Table) KeyID() uint64 { - if t.opt.DataKey != nil { - return t.opt.DataKey.KeyId - } - // By default it's 0, if it is plain text. - return 0 -} - -// decrypt decrypts the given data. It should be called only after checking shouldDecrypt. -func (t *Table) decrypt(data []byte, viaCalloc bool) ([]byte, error) { - // Last BlockSize bytes of the data is the IV. - iv := data[len(data)-aes.BlockSize:] - // Rest all bytes are data. - data = data[:len(data)-aes.BlockSize] - - var dst []byte - if viaCalloc { - dst = z.Calloc(len(data), "Table.Decrypt") - } else { - dst = make([]byte, len(data)) - } - if err := y.XORBlock(dst, data, t.opt.DataKey.Data, iv); err != nil { - return nil, y.Wrapf(err, "while decrypt") - } - return dst, nil -} - -// ParseFileID reads the file id out of a filename. -func ParseFileID(name string) (uint64, bool) { - name = filepath.Base(name) - if !strings.HasSuffix(name, fileSuffix) { - return 0, false - } - // suffix := name[len(fileSuffix):] - name = strings.TrimSuffix(name, fileSuffix) - id, err := strconv.Atoi(name) - if err != nil { - return 0, false - } - y.AssertTrue(id >= 0) - return uint64(id), true -} - -// IDToFilename does the inverse of ParseFileID -func IDToFilename(id uint64) string { - return fmt.Sprintf("%06d", id) + fileSuffix -} - -// NewFilename should be named TableFilepath -- it combines the dir with the ID to make a table -// filepath. -func NewFilename(id uint64, dir string) string { - return filepath.Join(dir, IDToFilename(id)) -} - -// decompress decompresses the data stored in a block. -func (t *Table) decompress(b *block) error { - var dst []byte - var err error - - // Point to the original b.data - src := b.data - - switch t.opt.Compression { - case options.None: - // Nothing to be done here. - return nil - case options.Snappy: - if sz, err := snappy.DecodedLen(b.data); err == nil { - dst = z.Calloc(sz, "Table.Decompress") - } else { - dst = z.Calloc(len(b.data) * 4, "Table.Decompress") // Take a guess. - } - b.data, err = snappy.Decode(dst, b.data) - if err != nil { - z.Free(dst) - return y.Wrap(err, "failed to decompress") - } - case options.ZSTD: - sz := int(float64(t.opt.BlockSize) * 1.2) - dst = z.Calloc(sz, "Table.Decompress") - b.data, err = y.ZSTDDecompress(dst, b.data) - if err != nil { - z.Free(dst) - return y.Wrap(err, "failed to decompress") - } - default: - return errors.New("Unsupported compression type") - } - - if b.freeMe == true { - z.Free(src) - b.freeMe = false - } - - if len(b.data) > 0 && len(dst) > 0 && &dst[0] != &b.data[0] { - z.Free(dst) - } else { - b.freeMe = true - } - return nil -} diff --git a/vendor/github.com/dgraph-io/badger/v3/test.sh b/vendor/github.com/dgraph-io/badger/v3/test.sh deleted file mode 100644 index 6922eed0bf..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/test.sh +++ /dev/null @@ -1,120 +0,0 @@ -#!/bin/bash - -set -eo pipefail - -go version - -# Run `go list` BEFORE setting GOFLAGS so that the output is in the right -# format for grep. -# export packages because the test will run in a sub process. -export packages=$(go list ./... | grep "github.com/dgraph-io/badger/v3/") - -if [[ ! -z "$TEAMCITY_VERSION" ]]; then - export GOFLAGS="-json" -fi - -function InstallJemalloc() { - pushd . - if [ ! -f /usr/local/lib/libjemalloc.a ]; then - USER_ID=`id -u` - JEMALLOC_URL="https://github.com/jemalloc/jemalloc/releases/download/5.2.1/jemalloc-5.2.1.tar.bz2" - - mkdir -p /tmp/jemalloc-temp && cd /tmp/jemalloc-temp ; - echo "Downloading jemalloc" ; - curl -s -L ${JEMALLOC_URL} -o jemalloc.tar.bz2 ; - tar xjf ./jemalloc.tar.bz2 ; - cd jemalloc-5.2.1 ; - ./configure --with-jemalloc-prefix='je_' ; - make ; - if [ "$USER_ID" -eq "0" ]; then - make install ; - else - echo "==== Need sudo access to install jemalloc" ; - sudo make install ; - fi - fi - popd -} - -tags="-tags=jemalloc" - -# Ensure that we can compile the binary. -pushd badger -go build -v $tags . -popd - -# tags="" -InstallJemalloc - -# Run the memory intensive tests first. -manual() { - timeout="-timeout 2m" - echo "==> Running package tests for $packages" - set -e - for pkg in $packages; do - echo "===> Testing $pkg" - go test $tags -timeout=25m -race $pkg -parallel 16 - done - echo "==> DONE package tests" - - echo "==> Running manual tests" - # Run the special Truncate test. - rm -rf p - set -e - go test $tags $timeout -run='TestTruncateVlogNoClose$' --manual=true - truncate --size=4096 p/000000.vlog - go test $tags $timeout -run='TestTruncateVlogNoClose2$' --manual=true - go test $tags $timeout -run='TestTruncateVlogNoClose3$' --manual=true - rm -rf p - - # TODO(ibrahim): Let's make these tests have Manual prefix. - # go test $tags -run='TestManual' --manual=true --parallel=2 - # TestWriteBatch - # TestValueGCManaged - # TestDropPrefix - # TestDropAllManaged - go test $tags $timeout -run='TestBigKeyValuePairs$' --manual=true - go test $tags $timeout -run='TestPushValueLogLimit' --manual=true - go test $tags $timeout -run='TestKeyCount' --manual=true - go test $tags $timeout -run='TestIteratePrefix' --manual=true - go test $tags $timeout -run='TestIterateParallel' --manual=true - go test $tags $timeout -run='TestBigStream' --manual=true - go test $tags $timeout -run='TestGoroutineLeak' --manual=true - go test $tags $timeout -run='TestGetMore' --manual=true - - echo "==> DONE manual tests" -} - -root() { - # Run the normal tests. - # go test -timeout=25m -v -race github.com/dgraph-io/badger/v3/... - - echo "==> Running root level tests." - set -e - go test $tags -timeout=25m . -v -race -parallel 16 - echo "==> DONE root level tests" -} - -stream() { - set -eo pipefail - pushd badger - baseDir=$(mktemp -d -p .) - ./badger benchmark write -s --dir=$baseDir/test | tee $baseDir/log.txt - ./badger benchmark read --dir=$baseDir/test --full-scan | tee --append $baseDir/log.txt - ./badger benchmark read --dir=$baseDir/test -d=30s | tee --append $baseDir/log.txt - ./badger stream --dir=$baseDir/test -o "$baseDir/test2" | tee --append $baseDir/log.txt - count=$(cat "$baseDir/log.txt" | grep "at program end: 0 B" | wc -l) - rm -rf $baseDir - if [ $count -ne 4 ]; then - echo "LEAK detected in Badger stream." - return 1 - fi - echo "==> DONE stream test" - return 0 -} - -export -f stream -export -f manual -export -f root - -parallel --halt now,fail=1 --progress --line-buffer ::: stream manual root diff --git a/vendor/github.com/dgraph-io/badger/v3/trie/trie.go b/vendor/github.com/dgraph-io/badger/v3/trie/trie.go deleted file mode 100644 index eac974ab22..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/trie/trie.go +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package trie - -import ( - "fmt" - "strconv" - "strings" - - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/badger/v3/y" - "github.com/pkg/errors" -) - -type node struct { - children map[byte]*node - ignore *node - ids []uint64 -} - -func (n *node) isEmpty() bool { - return len(n.children) == 0 && len(n.ids) == 0 && n.ignore == nil -} - -func newNode() *node { - return &node{ - children: make(map[byte]*node), - ids: []uint64{}, - } -} - -// Trie datastructure. -type Trie struct { - root *node -} - -// NewTrie returns Trie. -func NewTrie() *Trie { - return &Trie{ - root: newNode(), - } -} - -// parseIgnoreBytes would parse the ignore string, and convert it into a list of bools, where -// bool[idx] = true implies that key[idx] can be ignored during comparison. -func parseIgnoreBytes(ig string) ([]bool, error) { - var out []bool - if ig == "" { - return out, nil - } - - for _, each := range strings.Split(strings.TrimSpace(ig), ",") { - r := strings.Split(strings.TrimSpace(each), "-") - if len(r) == 0 || len(r) > 2 { - return out, fmt.Errorf("Invalid range: %s", each) - } - start, end := -1, -1 - if len(r) == 2 { - idx, err := strconv.Atoi(strings.TrimSpace(r[1])) - if err != nil { - return out, err - } - end = idx - } - { - // Always consider r[0] - idx, err := strconv.Atoi(strings.TrimSpace(r[0])) - if err != nil { - return out, err - } - start = idx - } - if start == -1 { - return out, fmt.Errorf("Invalid range: %s", each) - } - for start >= len(out) { - out = append(out, false) - } - for end >= len(out) { // end could be -1, so do have the start loop above. - out = append(out, false) - } - if end == -1 { - out[start] = true - } else { - for i := start; i <= end; i++ { - out[i] = true - } - } - } - return out, nil -} - -// Add adds the id in the trie for the given prefix path. -func (t *Trie) Add(prefix []byte, id uint64) { - m := pb.Match{ - Prefix: prefix, - } - y.Check(t.AddMatch(m, id)) -} - -// AddMatch allows you to send in a prefix match, with "holes" in the prefix. The holes are -// specified via IgnoreBytes in a comma-separated list of indices starting from 0. A dash can be -// used to denote a range. Valid example is "3, 5-8, 10, 12-15". Length of IgnoreBytes does not need -// to match the length of the Prefix passed. -// -// Consider a prefix = "aaaa". If the IgnoreBytes is set to "0, 2", then along with key "aaaa...", -// a key "baba..." would also match. -func (t *Trie) AddMatch(m pb.Match, id uint64) error { - return t.fix(m, id, set) -} - -const ( - set = iota - del -) - -func (t *Trie) fix(m pb.Match, id uint64, op int) error { - curNode := t.root - - ignore, err := parseIgnoreBytes(m.IgnoreBytes) - if err != nil { - return errors.Wrapf(err, "while parsing ignore bytes: %s", m.IgnoreBytes) - } - for len(ignore) < len(m.Prefix) { - ignore = append(ignore, false) - } - for idx, byt := range m.Prefix { - var child *node - if ignore[idx] { - child = curNode.ignore - if child == nil { - if op == del { - // No valid node found for delete operation. Return immediately. - return nil - } - child = newNode() - curNode.ignore = child - } - } else { - child = curNode.children[byt] - if child == nil { - if op == del { - // No valid node found for delete operation. Return immediately. - return nil - } - child = newNode() - curNode.children[byt] = child - } - } - curNode = child - } - - // We only need to add the id to the last node of the given prefix. - if op == set { - curNode.ids = append(curNode.ids, id) - - } else if op == del { - out := curNode.ids[:0] - for _, cid := range curNode.ids { - if id != cid { - out = append(out, cid) - } - } - curNode.ids = out - } else { - y.AssertTrue(false) - } - return nil -} - -func (t *Trie) Get(key []byte) map[uint64]struct{} { - return t.get(t.root, key) -} - -// Get returns prefix matched ids for the given key. -func (t *Trie) get(curNode *node, key []byte) map[uint64]struct{} { - y.AssertTrue(curNode != nil) - - out := make(map[uint64]struct{}) - // If any node in the path of the key has ids, pick them up. - // This would also match nil prefixes. - for _, i := range curNode.ids { - out[i] = struct{}{} - } - if len(key) == 0 { - return out - } - - // If we found an ignore node, traverse that path. - if curNode.ignore != nil { - res := t.get(curNode.ignore, key[1:]) - for id := range res { - out[id] = struct{}{} - } - } - - if child := curNode.children[key[0]]; child != nil { - res := t.get(child, key[1:]) - for id := range res { - out[id] = struct{}{} - } - } - return out -} - -func removeEmpty(curNode *node) bool { - // Go depth first. - if curNode.ignore != nil { - if empty := removeEmpty(curNode.ignore); empty { - curNode.ignore = nil - } - } - - for byt, n := range curNode.children { - if empty := removeEmpty(n); empty { - delete(curNode.children, byt) - } - } - - return curNode.isEmpty() -} - -// Delete will delete the id if the id exist in the given index path. -func (t *Trie) Delete(prefix []byte, id uint64) error { - return t.DeleteMatch(pb.Match{Prefix: prefix}, id) -} - -func (t *Trie) DeleteMatch(m pb.Match, id uint64) error { - if err := t.fix(m, id, del); err != nil { - return err - } - // Would recursively delete empty nodes. - // Do not remove the t.root even if its empty. - removeEmpty(t.root) - return nil -} - -func numNodes(curNode *node) int { - if curNode == nil { - return 0 - } - - num := numNodes(curNode.ignore) - for _, n := range curNode.children { - num += numNodes(n) - } - return num + 1 -} diff --git a/vendor/github.com/dgraph-io/badger/v3/txn.go b/vendor/github.com/dgraph-io/badger/v3/txn.go deleted file mode 100644 index 7ab42e60d5..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/txn.go +++ /dev/null @@ -1,827 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "bytes" - "context" - "encoding/hex" - "math" - "sort" - "strconv" - "sync" - "sync/atomic" - - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" - "github.com/pkg/errors" -) - -type oracle struct { - isManaged bool // Does not change value, so no locking required. - detectConflicts bool // Determines if the txns should be checked for conflicts. - - sync.Mutex // For nextTxnTs and commits. - // writeChLock lock is for ensuring that transactions go to the write - // channel in the same order as their commit timestamps. - writeChLock sync.Mutex - nextTxnTs uint64 - - // Used to block NewTransaction, so all previous commits are visible to a new read. - txnMark *y.WaterMark - - // Either of these is used to determine which versions can be permanently - // discarded during compaction. - discardTs uint64 // Used by ManagedDB. - readMark *y.WaterMark // Used by DB. - - // committedTxns contains all committed writes (contains fingerprints - // of keys written and their latest commit counter). - committedTxns []committedTxn - lastCleanupTs uint64 - - // closer is used to stop watermarks. - closer *z.Closer -} - -type committedTxn struct { - ts uint64 - // ConflictKeys Keeps track of the entries written at timestamp ts. - conflictKeys map[uint64]struct{} -} - -func newOracle(opt Options) *oracle { - orc := &oracle{ - isManaged: opt.managedTxns, - detectConflicts: opt.DetectConflicts, - // We're not initializing nextTxnTs and readOnlyTs. It would be done after replay in Open. - // - // WaterMarks must be 64-bit aligned for atomic package, hence we must use pointers here. - // See https://golang.org/pkg/sync/atomic/#pkg-note-BUG. - readMark: &y.WaterMark{Name: "badger.PendingReads"}, - txnMark: &y.WaterMark{Name: "badger.TxnTimestamp"}, - closer: z.NewCloser(2), - } - orc.readMark.Init(orc.closer) - orc.txnMark.Init(orc.closer) - return orc -} - -func (o *oracle) Stop() { - o.closer.SignalAndWait() -} - -func (o *oracle) readTs() uint64 { - if o.isManaged { - panic("ReadTs should not be retrieved for managed DB") - } - - var readTs uint64 - o.Lock() - readTs = o.nextTxnTs - 1 - o.readMark.Begin(readTs) - o.Unlock() - - // Wait for all txns which have no conflicts, have been assigned a commit - // timestamp and are going through the write to value log and LSM tree - // process. Not waiting here could mean that some txns which have been - // committed would not be read. - y.Check(o.txnMark.WaitForMark(context.Background(), readTs)) - return readTs -} - -func (o *oracle) nextTs() uint64 { - o.Lock() - defer o.Unlock() - return o.nextTxnTs -} - -func (o *oracle) incrementNextTs() { - o.Lock() - defer o.Unlock() - o.nextTxnTs++ -} - -// Any deleted or invalid versions at or below ts would be discarded during -// compaction to reclaim disk space in LSM tree and thence value log. -func (o *oracle) setDiscardTs(ts uint64) { - o.Lock() - defer o.Unlock() - o.discardTs = ts - o.cleanupCommittedTransactions() -} - -func (o *oracle) discardAtOrBelow() uint64 { - if o.isManaged { - o.Lock() - defer o.Unlock() - return o.discardTs - } - return o.readMark.DoneUntil() -} - -// hasConflict must be called while having a lock. -func (o *oracle) hasConflict(txn *Txn) bool { - if len(txn.reads) == 0 { - return false - } - for _, committedTxn := range o.committedTxns { - // If the committedTxn.ts is less than txn.readTs that implies that the - // committedTxn finished before the current transaction started. - // We don't need to check for conflict in that case. - // This change assumes linearizability. Lack of linearizability could - // cause the read ts of a new txn to be lower than the commit ts of - // a txn before it (@mrjn). - if committedTxn.ts <= txn.readTs { - continue - } - - for _, ro := range txn.reads { - if _, has := committedTxn.conflictKeys[ro]; has { - return true - } - } - } - - return false -} - -func (o *oracle) newCommitTs(txn *Txn) (uint64, bool) { - o.Lock() - defer o.Unlock() - - if o.hasConflict(txn) { - return 0, true - } - - var ts uint64 - if !o.isManaged { - o.doneRead(txn) - o.cleanupCommittedTransactions() - - // This is the general case, when user doesn't specify the read and commit ts. - ts = o.nextTxnTs - o.nextTxnTs++ - o.txnMark.Begin(ts) - - } else { - // If commitTs is set, use it instead. - ts = txn.commitTs - } - - y.AssertTrue(ts >= o.lastCleanupTs) - - if o.detectConflicts { - // We should ensure that txns are not added to o.committedTxns slice when - // conflict detection is disabled otherwise this slice would keep growing. - o.committedTxns = append(o.committedTxns, committedTxn{ - ts: ts, - conflictKeys: txn.conflictKeys, - }) - } - - return ts, false -} - -func (o *oracle) doneRead(txn *Txn) { - if !txn.doneRead { - txn.doneRead = true - o.readMark.Done(txn.readTs) - } -} - -func (o *oracle) cleanupCommittedTransactions() { // Must be called under o.Lock - if !o.detectConflicts { - // When detectConflicts is set to false, we do not store any - // committedTxns and so there's nothing to clean up. - return - } - // Same logic as discardAtOrBelow but unlocked - var maxReadTs uint64 - if o.isManaged { - maxReadTs = o.discardTs - } else { - maxReadTs = o.readMark.DoneUntil() - } - - y.AssertTrue(maxReadTs >= o.lastCleanupTs) - - // do not run clean up if the maxReadTs (read timestamp of the - // oldest transaction that is still in flight) has not increased - if maxReadTs == o.lastCleanupTs { - return - } - o.lastCleanupTs = maxReadTs - - tmp := o.committedTxns[:0] - for _, txn := range o.committedTxns { - if txn.ts <= maxReadTs { - continue - } - tmp = append(tmp, txn) - } - o.committedTxns = tmp -} - -func (o *oracle) doneCommit(cts uint64) { - if o.isManaged { - // No need to update anything. - return - } - o.txnMark.Done(cts) -} - -// Txn represents a Badger transaction. -type Txn struct { - readTs uint64 - commitTs uint64 - size int64 - count int64 - db *DB - - reads []uint64 // contains fingerprints of keys read. - // contains fingerprints of keys written. This is used for conflict detection. - conflictKeys map[uint64]struct{} - readsLock sync.Mutex // guards the reads slice. See addReadKey. - - pendingWrites map[string]*Entry // cache stores any writes done by txn. - duplicateWrites []*Entry // Used in managed mode to store duplicate entries. - - numIterators int32 - discarded bool - doneRead bool - update bool // update is used to conditionally keep track of reads. -} - -type pendingWritesIterator struct { - entries []*Entry - nextIdx int - readTs uint64 - reversed bool -} - -func (pi *pendingWritesIterator) Next() { - pi.nextIdx++ -} - -func (pi *pendingWritesIterator) Rewind() { - pi.nextIdx = 0 -} - -func (pi *pendingWritesIterator) Seek(key []byte) { - key = y.ParseKey(key) - pi.nextIdx = sort.Search(len(pi.entries), func(idx int) bool { - cmp := bytes.Compare(pi.entries[idx].Key, key) - if !pi.reversed { - return cmp >= 0 - } - return cmp <= 0 - }) -} - -func (pi *pendingWritesIterator) Key() []byte { - y.AssertTrue(pi.Valid()) - entry := pi.entries[pi.nextIdx] - return y.KeyWithTs(entry.Key, pi.readTs) -} - -func (pi *pendingWritesIterator) Value() y.ValueStruct { - y.AssertTrue(pi.Valid()) - entry := pi.entries[pi.nextIdx] - return y.ValueStruct{ - Value: entry.Value, - Meta: entry.meta, - UserMeta: entry.UserMeta, - ExpiresAt: entry.ExpiresAt, - Version: pi.readTs, - } -} - -func (pi *pendingWritesIterator) Valid() bool { - return pi.nextIdx < len(pi.entries) -} - -func (pi *pendingWritesIterator) Close() error { - return nil -} - -func (txn *Txn) newPendingWritesIterator(reversed bool) *pendingWritesIterator { - if !txn.update || len(txn.pendingWrites) == 0 { - return nil - } - entries := make([]*Entry, 0, len(txn.pendingWrites)) - for _, e := range txn.pendingWrites { - entries = append(entries, e) - } - // Number of pending writes per transaction shouldn't be too big in general. - sort.Slice(entries, func(i, j int) bool { - cmp := bytes.Compare(entries[i].Key, entries[j].Key) - if !reversed { - return cmp < 0 - } - return cmp > 0 - }) - return &pendingWritesIterator{ - readTs: txn.readTs, - entries: entries, - reversed: reversed, - } -} - -func (txn *Txn) checkSize(e *Entry) error { - count := txn.count + 1 - // Extra bytes for the version in key. - size := txn.size + e.estimateSizeAndSetThreshold(txn.db.valueThreshold()) + 10 - if count >= txn.db.opt.maxBatchCount || size >= txn.db.opt.maxBatchSize { - return ErrTxnTooBig - } - txn.count, txn.size = count, size - return nil -} - -func exceedsSize(prefix string, max int64, key []byte) error { - return errors.Errorf("%s with size %d exceeded %d limit. %s:\n%s", - prefix, len(key), max, prefix, hex.Dump(key[:1<<10])) -} - -func (txn *Txn) modify(e *Entry) error { - const maxKeySize = 65000 - - switch { - case !txn.update: - return ErrReadOnlyTxn - case txn.discarded: - return ErrDiscardedTxn - case len(e.Key) == 0: - return ErrEmptyKey - case bytes.HasPrefix(e.Key, badgerPrefix): - return ErrInvalidKey - case len(e.Key) > maxKeySize: - // Key length can't be more than uint16, as determined by table::header. To - // keep things safe and allow badger move prefix and a timestamp suffix, let's - // cut it down to 65000, instead of using 65536. - return exceedsSize("Key", maxKeySize, e.Key) - case int64(len(e.Value)) > txn.db.opt.ValueLogFileSize: - return exceedsSize("Value", txn.db.opt.ValueLogFileSize, e.Value) - case txn.db.opt.InMemory && int64(len(e.Value)) > txn.db.valueThreshold(): - return exceedsSize("Value", txn.db.valueThreshold(), e.Value) - } - - if err := txn.db.isBanned(e.Key); err != nil { - return err - } - - if err := txn.checkSize(e); err != nil { - return err - } - - // The txn.conflictKeys is used for conflict detection. If conflict detection - // is disabled, we don't need to store key hashes in this map. - if txn.db.opt.DetectConflicts { - fp := z.MemHash(e.Key) // Avoid dealing with byte arrays. - txn.conflictKeys[fp] = struct{}{} - } - // If a duplicate entry was inserted in managed mode, move it to the duplicate writes slice. - // Add the entry to duplicateWrites only if both the entries have different versions. For - // same versions, we will overwrite the existing entry. - if oldEntry, ok := txn.pendingWrites[string(e.Key)]; ok && oldEntry.version != e.version { - txn.duplicateWrites = append(txn.duplicateWrites, oldEntry) - } - txn.pendingWrites[string(e.Key)] = e - return nil -} - -// Set adds a key-value pair to the database. -// It will return ErrReadOnlyTxn if update flag was set to false when creating the transaction. -// -// The current transaction keeps a reference to the key and val byte slice -// arguments. Users must not modify key and val until the end of the transaction. -func (txn *Txn) Set(key, val []byte) error { - return txn.SetEntry(NewEntry(key, val)) -} - -// SetEntry takes an Entry struct and adds the key-value pair in the struct, -// along with other metadata to the database. -// -// The current transaction keeps a reference to the entry passed in argument. -// Users must not modify the entry until the end of the transaction. -func (txn *Txn) SetEntry(e *Entry) error { - return txn.modify(e) -} - -// Delete deletes a key. -// -// This is done by adding a delete marker for the key at commit timestamp. Any -// reads happening before this timestamp would be unaffected. Any reads after -// this commit would see the deletion. -// -// The current transaction keeps a reference to the key byte slice argument. -// Users must not modify the key until the end of the transaction. -func (txn *Txn) Delete(key []byte) error { - e := &Entry{ - Key: key, - meta: bitDelete, - } - return txn.modify(e) -} - -// Get looks for key and returns corresponding Item. -// If key is not found, ErrKeyNotFound is returned. -func (txn *Txn) Get(key []byte) (item *Item, rerr error) { - if len(key) == 0 { - return nil, ErrEmptyKey - } else if txn.discarded { - return nil, ErrDiscardedTxn - } - - if err := txn.db.isBanned(key); err != nil { - return nil, err - } - - item = new(Item) - if txn.update { - if e, has := txn.pendingWrites[string(key)]; has && bytes.Equal(key, e.Key) { - if isDeletedOrExpired(e.meta, e.ExpiresAt) { - return nil, ErrKeyNotFound - } - // Fulfill from cache. - item.meta = e.meta - item.val = e.Value - item.userMeta = e.UserMeta - item.key = key - item.status = prefetched - item.version = txn.readTs - item.expiresAt = e.ExpiresAt - // We probably don't need to set db on item here. - return item, nil - } - // Only track reads if this is update txn. No need to track read if txn serviced it - // internally. - txn.addReadKey(key) - } - - seek := y.KeyWithTs(key, txn.readTs) - vs, err := txn.db.get(seek) - if err != nil { - return nil, y.Wrapf(err, "DB::Get key: %q", key) - } - if vs.Value == nil && vs.Meta == 0 { - return nil, ErrKeyNotFound - } - if isDeletedOrExpired(vs.Meta, vs.ExpiresAt) { - return nil, ErrKeyNotFound - } - - item.key = key - item.version = vs.Version - item.meta = vs.Meta - item.userMeta = vs.UserMeta - item.vptr = y.SafeCopy(item.vptr, vs.Value) - item.txn = txn - item.expiresAt = vs.ExpiresAt - return item, nil -} - -func (txn *Txn) addReadKey(key []byte) { - if txn.update { - fp := z.MemHash(key) - - // Because of the possibility of multiple iterators it is now possible - // for multiple threads within a read-write transaction to read keys at - // the same time. The reads slice is not currently thread-safe and - // needs to be locked whenever we mark a key as read. - txn.readsLock.Lock() - txn.reads = append(txn.reads, fp) - txn.readsLock.Unlock() - } -} - -// Discard discards a created transaction. This method is very important and must be called. Commit -// method calls this internally, however, calling this multiple times doesn't cause any issues. So, -// this can safely be called via a defer right when transaction is created. -// -// NOTE: If any operations are run on a discarded transaction, ErrDiscardedTxn is returned. -func (txn *Txn) Discard() { - if txn.discarded { // Avoid a re-run. - return - } - if atomic.LoadInt32(&txn.numIterators) > 0 { - panic("Unclosed iterator at time of Txn.Discard.") - } - txn.discarded = true - if !txn.db.orc.isManaged { - txn.db.orc.doneRead(txn) - } -} - -func (txn *Txn) commitAndSend() (func() error, error) { - orc := txn.db.orc - // Ensure that the order in which we get the commit timestamp is the same as - // the order in which we push these updates to the write channel. So, we - // acquire a writeChLock before getting a commit timestamp, and only release - // it after pushing the entries to it. - orc.writeChLock.Lock() - defer orc.writeChLock.Unlock() - - commitTs, conflict := orc.newCommitTs(txn) - if conflict { - return nil, ErrConflict - } - - keepTogether := true - setVersion := func(e *Entry) { - if e.version == 0 { - e.version = commitTs - } else { - keepTogether = false - } - } - for _, e := range txn.pendingWrites { - setVersion(e) - } - // The duplicateWrites slice will be non-empty only if there are duplicate - // entries with different versions. - for _, e := range txn.duplicateWrites { - setVersion(e) - } - - entries := make([]*Entry, 0, len(txn.pendingWrites)+len(txn.duplicateWrites)+1) - - processEntry := func(e *Entry) { - // Suffix the keys with commit ts, so the key versions are sorted in - // descending order of commit timestamp. - e.Key = y.KeyWithTs(e.Key, e.version) - // Add bitTxn only if these entries are part of a transaction. We - // support SetEntryAt(..) in managed mode which means a single - // transaction can have entries with different timestamps. If entries - // in a single transaction have different timestamps, we don't add the - // transaction markers. - if keepTogether { - e.meta |= bitTxn - } - entries = append(entries, e) - } - - // The following debug information is what led to determining the cause of - // bank txn violation bug, and it took a whole bunch of effort to narrow it - // down to here. So, keep this around for at least a couple of months. - // var b strings.Builder - // fmt.Fprintf(&b, "Read: %d. Commit: %d. reads: %v. writes: %v. Keys: ", - // txn.readTs, commitTs, txn.reads, txn.conflictKeys) - for _, e := range txn.pendingWrites { - processEntry(e) - } - for _, e := range txn.duplicateWrites { - processEntry(e) - } - - if keepTogether { - // CommitTs should not be zero if we're inserting transaction markers. - y.AssertTrue(commitTs != 0) - e := &Entry{ - Key: y.KeyWithTs(txnKey, commitTs), - Value: []byte(strconv.FormatUint(commitTs, 10)), - meta: bitFinTxn, - } - entries = append(entries, e) - } - - req, err := txn.db.sendToWriteCh(entries) - if err != nil { - orc.doneCommit(commitTs) - return nil, err - } - ret := func() error { - err := req.Wait() - // Wait before marking commitTs as done. - // We can't defer doneCommit above, because it is being called from a - // callback here. - orc.doneCommit(commitTs) - return err - } - return ret, nil -} - -func (txn *Txn) commitPrecheck() error { - if txn.discarded { - return errors.New("Trying to commit a discarded txn") - } - keepTogether := true - for _, e := range txn.pendingWrites { - if e.version != 0 { - keepTogether = false - } - } - - // If keepTogether is True, it implies transaction markers will be added. - // In that case, commitTs should not be never be zero. This might happen if - // someone uses txn.Commit instead of txn.CommitAt in managed mode. This - // should happen only in managed mode. In normal mode, keepTogether will - // always be true. - if keepTogether && txn.db.opt.managedTxns && txn.commitTs == 0 { - return errors.New("CommitTs cannot be zero. Please use commitAt instead") - } - return nil -} - -// Commit commits the transaction, following these steps: -// -// 1. If there are no writes, return immediately. -// -// 2. Check if read rows were updated since txn started. If so, return ErrConflict. -// -// 3. If no conflict, generate a commit timestamp and update written rows' commit ts. -// -// 4. Batch up all writes, write them to value log and LSM tree. -// -// 5. If callback is provided, Badger will return immediately after checking -// for conflicts. Writes to the database will happen in the background. If -// there is a conflict, an error will be returned and the callback will not -// run. If there are no conflicts, the callback will be called in the -// background upon successful completion of writes or any error during write. -// -// If error is nil, the transaction is successfully committed. In case of a non-nil error, the LSM -// tree won't be updated, so there's no need for any rollback. -func (txn *Txn) Commit() error { - // txn.conflictKeys can be zero if conflict detection is turned off. So we - // should check txn.pendingWrites. - if len(txn.pendingWrites) == 0 { - return nil // Nothing to do. - } - // Precheck before discarding txn. - if err := txn.commitPrecheck(); err != nil { - return err - } - defer txn.Discard() - - txnCb, err := txn.commitAndSend() - if err != nil { - return err - } - // If batchSet failed, LSM would not have been updated. So, no need to rollback anything. - - // TODO: What if some of the txns successfully make it to value log, but others fail. - // Nothing gets updated to LSM, until a restart happens. - return txnCb() -} - -type txnCb struct { - commit func() error - user func(error) - err error -} - -func runTxnCallback(cb *txnCb) { - switch { - case cb == nil: - panic("txn callback is nil") - case cb.user == nil: - panic("Must have caught a nil callback for txn.CommitWith") - case cb.err != nil: - cb.user(cb.err) - case cb.commit != nil: - err := cb.commit() - cb.user(err) - default: - cb.user(nil) - } -} - -// CommitWith acts like Commit, but takes a callback, which gets run via a -// goroutine to avoid blocking this function. The callback is guaranteed to run, -// so it is safe to increment sync.WaitGroup before calling CommitWith, and -// decrementing it in the callback; to block until all callbacks are run. -func (txn *Txn) CommitWith(cb func(error)) { - if cb == nil { - panic("Nil callback provided to CommitWith") - } - - if len(txn.pendingWrites) == 0 { - // Do not run these callbacks from here, because the CommitWith and the - // callback might be acquiring the same locks. Instead run the callback - // from another goroutine. - go runTxnCallback(&txnCb{user: cb, err: nil}) - return - } - - // Precheck before discarding txn. - if err := txn.commitPrecheck(); err != nil { - cb(err) - return - } - - defer txn.Discard() - - commitCb, err := txn.commitAndSend() - if err != nil { - go runTxnCallback(&txnCb{user: cb, err: err}) - return - } - - go runTxnCallback(&txnCb{user: cb, commit: commitCb}) -} - -// ReadTs returns the read timestamp of the transaction. -func (txn *Txn) ReadTs() uint64 { - return txn.readTs -} - -// NewTransaction creates a new transaction. Badger supports concurrent execution of transactions, -// providing serializable snapshot isolation, avoiding write skews. Badger achieves this by tracking -// the keys read and at Commit time, ensuring that these read keys weren't concurrently modified by -// another transaction. -// -// For read-only transactions, set update to false. In this mode, we don't track the rows read for -// any changes. Thus, any long running iterations done in this mode wouldn't pay this overhead. -// -// Running transactions concurrently is OK. However, a transaction itself isn't thread safe, and -// should only be run serially. It doesn't matter if a transaction is created by one goroutine and -// passed down to other, as long as the Txn APIs are called serially. -// -// When you create a new transaction, it is absolutely essential to call -// Discard(). This should be done irrespective of what the update param is set -// to. Commit API internally runs Discard, but running it twice wouldn't cause -// any issues. -// -// txn := db.NewTransaction(false) -// defer txn.Discard() -// // Call various APIs. -func (db *DB) NewTransaction(update bool) *Txn { - return db.newTransaction(update, false) -} - -func (db *DB) newTransaction(update, isManaged bool) *Txn { - if db.opt.ReadOnly && update { - // DB is read-only, force read-only transaction. - update = false - } - - txn := &Txn{ - update: update, - db: db, - count: 1, // One extra entry for BitFin. - size: int64(len(txnKey) + 10), // Some buffer for the extra entry. - } - if update { - if db.opt.DetectConflicts { - txn.conflictKeys = make(map[uint64]struct{}) - } - txn.pendingWrites = make(map[string]*Entry) - } - if !isManaged { - txn.readTs = db.orc.readTs() - } - return txn -} - -// View executes a function creating and managing a read-only transaction for the user. Error -// returned by the function is relayed by the View method. -// If View is used with managed transactions, it would assume a read timestamp of MaxUint64. -func (db *DB) View(fn func(txn *Txn) error) error { - if db.IsClosed() { - return ErrDBClosed - } - var txn *Txn - if db.opt.managedTxns { - txn = db.NewTransactionAt(math.MaxUint64, false) - } else { - txn = db.NewTransaction(false) - } - defer txn.Discard() - - return fn(txn) -} - -// Update executes a function, creating and managing a read-write transaction -// for the user. Error returned by the function is relayed by the Update method. -// Update cannot be used with managed transactions. -func (db *DB) Update(fn func(txn *Txn) error) error { - if db.IsClosed() { - return ErrDBClosed - } - if db.opt.managedTxns { - panic("Update can only be used with managedDB=false.") - } - txn := db.NewTransaction(true) - defer txn.Discard() - - if err := fn(txn); err != nil { - return err - } - - return txn.Commit() -} diff --git a/vendor/github.com/dgraph-io/badger/v3/util.go b/vendor/github.com/dgraph-io/badger/v3/util.go deleted file mode 100644 index 2e75a9ead6..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/util.go +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "encoding/hex" - "io/ioutil" - "math/rand" - "sync/atomic" - "time" - - "github.com/dgraph-io/badger/v3/table" - "github.com/dgraph-io/badger/v3/y" - "github.com/pkg/errors" -) - -func (s *levelsController) validate() error { - for _, l := range s.levels { - if err := l.validate(); err != nil { - return y.Wrap(err, "Levels Controller") - } - } - return nil -} - -// Check does some sanity check on one level of data or in-memory index. -func (s *levelHandler) validate() error { - if s.level == 0 { - return nil - } - - s.RLock() - defer s.RUnlock() - numTables := len(s.tables) - for j := 1; j < numTables; j++ { - if j >= len(s.tables) { - return errors.Errorf("Level %d, j=%d numTables=%d", s.level, j, numTables) - } - - if y.CompareKeys(s.tables[j-1].Biggest(), s.tables[j].Smallest()) >= 0 { - return errors.Errorf( - "Inter: Biggest(j-1)[%d] \n%s\n vs Smallest(j)[%d]: \n%s\n: "+ - "level=%d j=%d numTables=%d", - s.tables[j-1].ID(), hex.Dump(s.tables[j-1].Biggest()), s.tables[j].ID(), - hex.Dump(s.tables[j].Smallest()), s.level, j, numTables) - } - - if y.CompareKeys(s.tables[j].Smallest(), s.tables[j].Biggest()) > 0 { - return errors.Errorf( - "Intra: \n%s\n vs \n%s\n: level=%d j=%d numTables=%d", - hex.Dump(s.tables[j].Smallest()), hex.Dump(s.tables[j].Biggest()), s.level, j, numTables) - } - } - return nil -} - -// func (s *KV) debugPrintMore() { s.lc.debugPrintMore() } - -// // debugPrintMore shows key ranges of each level. -// func (s *levelsController) debugPrintMore() { -// s.Lock() -// defer s.Unlock() -// for i := 0; i < s.kv.opt.MaxLevels; i++ { -// s.levels[i].debugPrintMore() -// } -// } - -// func (s *levelHandler) debugPrintMore() { -// s.RLock() -// defer s.RUnlock() -// s.elog.Printf("Level %d:", s.level) -// for _, t := range s.tables { -// y.Printf(" [%s, %s]", t.Smallest(), t.Biggest()) -// } -// y.Printf("\n") -// } - -// reserveFileID reserves a unique file id. -func (s *levelsController) reserveFileID() uint64 { - id := atomic.AddUint64(&s.nextFileID, 1) - return id - 1 -} - -func getIDMap(dir string) map[uint64]struct{} { - fileInfos, err := ioutil.ReadDir(dir) - y.Check(err) - idMap := make(map[uint64]struct{}) - for _, info := range fileInfos { - if info.IsDir() { - continue - } - fileID, ok := table.ParseFileID(info.Name()) - if !ok { - continue - } - idMap[fileID] = struct{}{} - } - return idMap -} - -func init() { - rand.Seed(time.Now().UnixNano()) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/value.go b/vendor/github.com/dgraph-io/badger/v3/value.go deleted file mode 100644 index 6e8f9178e2..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/value.go +++ /dev/null @@ -1,1193 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package badger - -import ( - "bytes" - "context" - "fmt" - "hash" - "hash/crc32" - "io" - "io/ioutil" - "math" - "os" - "sort" - "strconv" - "strings" - "sync" - "sync/atomic" - - "github.com/dgraph-io/badger/v3/y" - "github.com/dgraph-io/ristretto/z" - "github.com/pkg/errors" - otrace "go.opencensus.io/trace" -) - -// maxVlogFileSize is the maximum size of the vlog file which can be created. Vlog Offset is of -// uint32, so limiting at max uint32. -var maxVlogFileSize uint32 = math.MaxUint32 - -// Values have their first byte being byteData or byteDelete. This helps us distinguish between -// a key that has never been seen and a key that has been explicitly deleted. -const ( - bitDelete byte = 1 << 0 // Set if the key has been deleted. - bitValuePointer byte = 1 << 1 // Set if the value is NOT stored directly next to key. - bitDiscardEarlierVersions byte = 1 << 2 // Set if earlier versions can be discarded. - // Set if item shouldn't be discarded via compactions (used by merge operator) - bitMergeEntry byte = 1 << 3 - // The MSB 2 bits are for transactions. - bitTxn byte = 1 << 6 // Set if the entry is part of a txn. - bitFinTxn byte = 1 << 7 // Set if the entry is to indicate end of txn in value log. - - mi int64 = 1 << 20 - - // size of vlog header. - // +----------------+------------------+ - // | keyID(8 bytes) | baseIV(12 bytes)| - // +----------------+------------------+ - vlogHeaderSize = 20 -) - -var errStop = errors.New("Stop iteration") -var errTruncate = errors.New("Do truncate") -var errDeleteVlogFile = errors.New("Delete vlog file") - -type logEntry func(e Entry, vp valuePointer) error - -type safeRead struct { - k []byte - v []byte - - recordOffset uint32 - lf *logFile -} - -// hashReader implements io.Reader, io.ByteReader interfaces. It also keeps track of the number -// bytes read. The hashReader writes to h (hash) what it reads from r. -type hashReader struct { - r io.Reader - h hash.Hash32 - bytesRead int // Number of bytes read. -} - -func newHashReader(r io.Reader) *hashReader { - hash := crc32.New(y.CastagnoliCrcTable) - return &hashReader{ - r: r, - h: hash, - } -} - -// Read reads len(p) bytes from the reader. Returns the number of bytes read, error on failure. -func (t *hashReader) Read(p []byte) (int, error) { - n, err := t.r.Read(p) - if err != nil { - return n, err - } - t.bytesRead += n - return t.h.Write(p[:n]) -} - -// ReadByte reads exactly one byte from the reader. Returns error on failure. -func (t *hashReader) ReadByte() (byte, error) { - b := make([]byte, 1) - _, err := t.Read(b) - return b[0], err -} - -// Sum32 returns the sum32 of the underlying hash. -func (t *hashReader) Sum32() uint32 { - return t.h.Sum32() -} - -// Entry reads an entry from the provided reader. It also validates the checksum for every entry -// read. Returns error on failure. -func (r *safeRead) Entry(reader io.Reader) (*Entry, error) { - tee := newHashReader(reader) - var h header - hlen, err := h.DecodeFrom(tee) - if err != nil { - return nil, err - } - if h.klen > uint32(1<<16) { // Key length must be below uint16. - return nil, errTruncate - } - kl := int(h.klen) - if cap(r.k) < kl { - r.k = make([]byte, 2*kl) - } - vl := int(h.vlen) - if cap(r.v) < vl { - r.v = make([]byte, 2*vl) - } - - e := &Entry{} - e.offset = r.recordOffset - e.hlen = hlen - buf := make([]byte, h.klen+h.vlen) - if _, err := io.ReadFull(tee, buf[:]); err != nil { - if err == io.EOF { - err = errTruncate - } - return nil, err - } - if r.lf.encryptionEnabled() { - if buf, err = r.lf.decryptKV(buf[:], r.recordOffset); err != nil { - return nil, err - } - } - e.Key = buf[:h.klen] - e.Value = buf[h.klen:] - var crcBuf [crc32.Size]byte - if _, err := io.ReadFull(reader, crcBuf[:]); err != nil { - if err == io.EOF { - err = errTruncate - } - return nil, err - } - crc := y.BytesToU32(crcBuf[:]) - if crc != tee.Sum32() { - return nil, errTruncate - } - e.meta = h.meta - e.UserMeta = h.userMeta - e.ExpiresAt = h.expiresAt - return e, nil -} - -func (vlog *valueLog) rewrite(f *logFile) error { - vlog.filesLock.RLock() - for _, fid := range vlog.filesToBeDeleted { - if fid == f.fid { - vlog.filesLock.RUnlock() - return errors.Errorf("value log file already marked for deletion fid: %d", fid) - } - } - maxFid := vlog.maxFid - y.AssertTruef(uint32(f.fid) < maxFid, "fid to move: %d. Current max fid: %d", f.fid, maxFid) - vlog.filesLock.RUnlock() - - vlog.opt.Infof("Rewriting fid: %d", f.fid) - wb := make([]*Entry, 0, 1000) - var size int64 - - y.AssertTrue(vlog.db != nil) - var count, moved int - fe := func(e Entry) error { - count++ - if count%100000 == 0 { - vlog.opt.Debugf("Processing entry %d", count) - } - - vs, err := vlog.db.get(e.Key) - if err != nil { - return err - } - if discardEntry(e, vs, vlog.db) { - return nil - } - - // Value is still present in value log. - if len(vs.Value) == 0 { - return errors.Errorf("Empty value: %+v", vs) - } - var vp valuePointer - vp.Decode(vs.Value) - - // If the entry found from the LSM Tree points to a newer vlog file, don't do anything. - if vp.Fid > f.fid { - return nil - } - // If the entry found from the LSM Tree points to an offset greater than the one - // read from vlog, don't do anything. - if vp.Offset > e.offset { - return nil - } - // If the entry read from LSM Tree and vlog file point to the same vlog file and offset, - // insert them back into the DB. - // NOTE: It might be possible that the entry read from the LSM Tree points to - // an older vlog file. See the comments in the else part. - if vp.Fid == f.fid && vp.Offset == e.offset { - moved++ - // This new entry only contains the key, and a pointer to the value. - ne := new(Entry) - // Remove only the bitValuePointer and transaction markers. We - // should keep the other bits. - ne.meta = e.meta &^ (bitValuePointer | bitTxn | bitFinTxn) - ne.UserMeta = e.UserMeta - ne.ExpiresAt = e.ExpiresAt - ne.Key = append([]byte{}, e.Key...) - ne.Value = append([]byte{}, e.Value...) - es := ne.estimateSizeAndSetThreshold(vlog.db.valueThreshold()) - // Consider size of value as well while considering the total size - // of the batch. There have been reports of high memory usage in - // rewrite because we don't consider the value size. See #1292. - es += int64(len(e.Value)) - - // Ensure length and size of wb is within transaction limits. - if int64(len(wb)+1) >= vlog.opt.maxBatchCount || - size+es >= vlog.opt.maxBatchSize { - if err := vlog.db.batchSet(wb); err != nil { - return err - } - size = 0 - wb = wb[:0] - } - wb = append(wb, ne) - size += es - } else { - // It might be possible that the entry read from LSM Tree points to - // an older vlog file. This can happen in the following situation. - // Assume DB is opened with - // numberOfVersionsToKeep=1 - // - // Now, if we have ONLY one key in the system "FOO" which has been - // updated 3 times and the same key has been garbage collected 3 - // times, we'll have 3 versions of the movekey - // for the same key "FOO". - // - // NOTE: moveKeyi is the gc'ed version of the original key with version i - // We're calling the gc'ed keys as moveKey to simplify the - // explanantion. We used to add move keys but we no longer do that. - // - // Assume we have 3 move keys in L0. - // - moveKey1 (points to vlog file 10), - // - moveKey2 (points to vlog file 14) and - // - moveKey3 (points to vlog file 15). - // - // Also, assume there is another move key "moveKey1" (points to - // vlog file 6) (this is also a move Key for key "FOO" ) on upper - // levels (let's say 3). The move key "moveKey1" on level 0 was - // inserted because vlog file 6 was GCed. - // - // Here's what the arrangement looks like - // L0 => (moveKey1 => vlog10), (moveKey2 => vlog14), (moveKey3 => vlog15) - // L1 => .... - // L2 => .... - // L3 => (moveKey1 => vlog6) - // - // When L0 compaction runs, it keeps only moveKey3 because the number of versions - // to keep is set to 1. (we've dropped moveKey1's latest version) - // - // The new arrangement of keys is - // L0 => .... - // L1 => (moveKey3 => vlog15) - // L2 => .... - // L3 => (moveKey1 => vlog6) - // - // Now if we try to GC vlog file 10, the entry read from vlog file - // will point to vlog10 but the entry read from LSM Tree will point - // to vlog6. The move key read from LSM tree will point to vlog6 - // because we've asked for version 1 of the move key. - // - // This might seem like an issue but it's not really an issue - // because the user has set the number of versions to keep to 1 and - // the latest version of moveKey points to the correct vlog file - // and offset. The stale move key on L3 will be eventually dropped - // by compaction because there is a newer versions in the upper - // levels. - } - return nil - } - - _, err := f.iterate(vlog.opt.ReadOnly, 0, func(e Entry, vp valuePointer) error { - return fe(e) - }) - if err != nil { - return err - } - - batchSize := 1024 - var loops int - for i := 0; i < len(wb); { - loops++ - if batchSize == 0 { - vlog.db.opt.Warningf("We shouldn't reach batch size of zero.") - return ErrNoRewrite - } - end := i + batchSize - if end > len(wb) { - end = len(wb) - } - if err := vlog.db.batchSet(wb[i:end]); err != nil { - if err == ErrTxnTooBig { - // Decrease the batch size to half. - batchSize = batchSize / 2 - continue - } - return err - } - i += batchSize - } - vlog.opt.Infof("Processed %d entries in %d loops", len(wb), loops) - vlog.opt.Infof("Total entries: %d. Moved: %d", count, moved) - vlog.opt.Infof("Removing fid: %d", f.fid) - var deleteFileNow bool - // Entries written to LSM. Remove the older file now. - { - vlog.filesLock.Lock() - // Just a sanity-check. - if _, ok := vlog.filesMap[f.fid]; !ok { - vlog.filesLock.Unlock() - return errors.Errorf("Unable to find fid: %d", f.fid) - } - if vlog.iteratorCount() == 0 { - delete(vlog.filesMap, f.fid) - deleteFileNow = true - } else { - vlog.filesToBeDeleted = append(vlog.filesToBeDeleted, f.fid) - } - vlog.filesLock.Unlock() - } - - if deleteFileNow { - if err := vlog.deleteLogFile(f); err != nil { - return err - } - } - return nil -} - -func (vlog *valueLog) incrIteratorCount() { - atomic.AddInt32(&vlog.numActiveIterators, 1) -} - -func (vlog *valueLog) iteratorCount() int { - return int(atomic.LoadInt32(&vlog.numActiveIterators)) -} - -func (vlog *valueLog) decrIteratorCount() error { - num := atomic.AddInt32(&vlog.numActiveIterators, -1) - if num != 0 { - return nil - } - - vlog.filesLock.Lock() - lfs := make([]*logFile, 0, len(vlog.filesToBeDeleted)) - for _, id := range vlog.filesToBeDeleted { - lfs = append(lfs, vlog.filesMap[id]) - delete(vlog.filesMap, id) - } - vlog.filesToBeDeleted = nil - vlog.filesLock.Unlock() - - for _, lf := range lfs { - if err := vlog.deleteLogFile(lf); err != nil { - return err - } - } - return nil -} - -func (vlog *valueLog) deleteLogFile(lf *logFile) error { - if lf == nil { - return nil - } - lf.lock.Lock() - defer lf.lock.Unlock() - // Delete fid from discard stats as well. - vlog.discardStats.Update(lf.fid, -1) - - return lf.Delete() -} - -func (vlog *valueLog) dropAll() (int, error) { - // If db is opened in InMemory mode, we don't need to do anything since there are no vlog files. - if vlog.db.opt.InMemory { - return 0, nil - } - // We don't want to block dropAll on any pending transactions. So, don't worry about iterator - // count. - var count int - deleteAll := func() error { - vlog.filesLock.Lock() - defer vlog.filesLock.Unlock() - for _, lf := range vlog.filesMap { - if err := vlog.deleteLogFile(lf); err != nil { - return err - } - count++ - } - vlog.filesMap = make(map[uint32]*logFile) - vlog.maxFid = 0 - return nil - } - if err := deleteAll(); err != nil { - return count, err - } - - vlog.db.opt.Infof("Value logs deleted. Creating value log file: 1") - if _, err := vlog.createVlogFile(); err != nil { // Called while writes are stopped. - return count, err - } - return count, nil -} - -func (db *DB) valueThreshold() int64 { - return atomic.LoadInt64(&db.threshold.valueThreshold) -} - -type valueLog struct { - dirPath string - - // guards our view of which files exist, which to be deleted, how many active iterators - filesLock sync.RWMutex - filesMap map[uint32]*logFile - maxFid uint32 - filesToBeDeleted []uint32 - // A refcount of iterators -- when this hits zero, we can delete the filesToBeDeleted. - numActiveIterators int32 - - db *DB - writableLogOffset uint32 // read by read, written by write. Must access via atomics. - numEntriesWritten uint32 - opt Options - - garbageCh chan struct{} - discardStats *discardStats -} - -func vlogFilePath(dirPath string, fid uint32) string { - return fmt.Sprintf("%s%s%06d.vlog", dirPath, string(os.PathSeparator), fid) -} - -func (vlog *valueLog) fpath(fid uint32) string { - return vlogFilePath(vlog.dirPath, fid) -} - -func (vlog *valueLog) populateFilesMap() error { - vlog.filesMap = make(map[uint32]*logFile) - - files, err := ioutil.ReadDir(vlog.dirPath) - if err != nil { - return errFile(err, vlog.dirPath, "Unable to open log dir.") - } - - found := make(map[uint64]struct{}) - for _, file := range files { - if !strings.HasSuffix(file.Name(), ".vlog") { - continue - } - fsz := len(file.Name()) - fid, err := strconv.ParseUint(file.Name()[:fsz-5], 10, 32) - if err != nil { - return errFile(err, file.Name(), "Unable to parse log id.") - } - if _, ok := found[fid]; ok { - return errFile(err, file.Name(), "Duplicate file found. Please delete one.") - } - found[fid] = struct{}{} - - lf := &logFile{ - fid: uint32(fid), - path: vlog.fpath(uint32(fid)), - registry: vlog.db.registry, - } - vlog.filesMap[uint32(fid)] = lf - if vlog.maxFid < uint32(fid) { - vlog.maxFid = uint32(fid) - } - } - return nil -} - -func (vlog *valueLog) createVlogFile() (*logFile, error) { - fid := vlog.maxFid + 1 - path := vlog.fpath(fid) - lf := &logFile{ - fid: fid, - path: path, - registry: vlog.db.registry, - writeAt: vlogHeaderSize, - opt: vlog.opt, - } - err := lf.open(path, os.O_RDWR|os.O_CREATE|os.O_EXCL, 2*vlog.opt.ValueLogFileSize) - if err != z.NewFile && err != nil { - return nil, err - } - - vlog.filesLock.Lock() - vlog.filesMap[fid] = lf - y.AssertTrue(vlog.maxFid < fid) - vlog.maxFid = fid - // writableLogOffset is only written by write func, by read by Read func. - // To avoid a race condition, all reads and updates to this variable must be - // done via atomics. - atomic.StoreUint32(&vlog.writableLogOffset, vlogHeaderSize) - vlog.numEntriesWritten = 0 - vlog.filesLock.Unlock() - - return lf, nil -} - -func errFile(err error, path string, msg string) error { - return fmt.Errorf("%s. Path=%s. Error=%v", msg, path, err) -} - -// init initializes the value log struct. This initialization needs to happen -// before compactions start. -func (vlog *valueLog) init(db *DB) { - vlog.opt = db.opt - vlog.db = db - // We don't need to open any vlog files or collect stats for GC if DB is opened - // in InMemory mode. InMemory mode doesn't create any files/directories on disk. - if vlog.opt.InMemory { - return - } - vlog.dirPath = vlog.opt.ValueDir - - vlog.garbageCh = make(chan struct{}, 1) // Only allow one GC at a time. - lf, err := InitDiscardStats(vlog.opt) - y.Check(err) - vlog.discardStats = lf -} - -func (vlog *valueLog) open(db *DB) error { - // We don't need to open any vlog files or collect stats for GC if DB is opened - // in InMemory mode. InMemory mode doesn't create any files/directories on disk. - if db.opt.InMemory { - return nil - } - - if err := vlog.populateFilesMap(); err != nil { - return err - } - // If no files are found, then create a new file. - if len(vlog.filesMap) == 0 { - if vlog.opt.ReadOnly { - return nil - } - _, err := vlog.createVlogFile() - return y.Wrapf(err, "Error while creating log file in valueLog.open") - } - fids := vlog.sortedFids() - for _, fid := range fids { - lf, ok := vlog.filesMap[fid] - y.AssertTrue(ok) - - // Just open in RDWR mode. This should not create a new log file. - lf.opt = vlog.opt - if err := lf.open(vlog.fpath(fid), os.O_RDWR, - 2*vlog.opt.ValueLogFileSize); err != nil { - return y.Wrapf(err, "Open existing file: %q", lf.path) - } - // We shouldn't delete the maxFid file. - if lf.size == vlogHeaderSize && fid != vlog.maxFid { - vlog.opt.Infof("Deleting empty file: %s", lf.path) - if err := lf.Delete(); err != nil { - return y.Wrapf(err, "while trying to delete empty file: %s", lf.path) - } - delete(vlog.filesMap, fid) - } - } - - if vlog.opt.ReadOnly { - return nil - } - // Now we can read the latest value log file, and see if it needs truncation. We could - // technically do this over all the value log files, but that would mean slowing down the value - // log open. - last, ok := vlog.filesMap[vlog.maxFid] - y.AssertTrue(ok) - lastOff, err := last.iterate(vlog.opt.ReadOnly, vlogHeaderSize, - func(_ Entry, vp valuePointer) error { - return nil - }) - if err != nil { - return y.Wrapf(err, "while iterating over: %s", last.path) - } - if err := last.Truncate(int64(lastOff)); err != nil { - return y.Wrapf(err, "while truncating last value log file: %s", last.path) - } - - // Don't write to the old log file. Always create a new one. - if _, err := vlog.createVlogFile(); err != nil { - return y.Wrapf(err, "Error while creating log file in valueLog.open") - } - return nil -} - -func (vlog *valueLog) Close() error { - if vlog == nil || vlog.db == nil || vlog.db.opt.InMemory { - return nil - } - - vlog.opt.Debugf("Stopping garbage collection of values.") - var err error - for id, lf := range vlog.filesMap { - lf.lock.Lock() // We won’t release the lock. - offset := int64(-1) - - if !vlog.opt.ReadOnly && id == vlog.maxFid { - offset = int64(vlog.woffset()) - } - if terr := lf.Close(offset); terr != nil && err == nil { - err = terr - } - } - if vlog.discardStats != nil { - if terr := vlog.discardStats.Close(-1); terr != nil && err == nil { - err = terr - } - } - return err -} - -// sortedFids returns the file id's not pending deletion, sorted. Assumes we have shared access to -// filesMap. -func (vlog *valueLog) sortedFids() []uint32 { - toBeDeleted := make(map[uint32]struct{}) - for _, fid := range vlog.filesToBeDeleted { - toBeDeleted[fid] = struct{}{} - } - ret := make([]uint32, 0, len(vlog.filesMap)) - for fid := range vlog.filesMap { - if _, ok := toBeDeleted[fid]; !ok { - ret = append(ret, fid) - } - } - sort.Slice(ret, func(i, j int) bool { - return ret[i] < ret[j] - }) - return ret -} - -type request struct { - // Input values - Entries []*Entry - // Output values and wait group stuff below - Ptrs []valuePointer - Wg sync.WaitGroup - Err error - ref int32 -} - -func (req *request) reset() { - req.Entries = req.Entries[:0] - req.Ptrs = req.Ptrs[:0] - req.Wg = sync.WaitGroup{} - req.Err = nil - req.ref = 0 -} - -func (req *request) IncrRef() { - atomic.AddInt32(&req.ref, 1) -} - -func (req *request) DecrRef() { - nRef := atomic.AddInt32(&req.ref, -1) - if nRef > 0 { - return - } - req.Entries = nil - requestPool.Put(req) -} - -func (req *request) Wait() error { - req.Wg.Wait() - err := req.Err - req.DecrRef() // DecrRef after writing to DB. - return err -} - -type requests []*request - -func (reqs requests) DecrRef() { - for _, req := range reqs { - req.DecrRef() - } -} - -func (reqs requests) IncrRef() { - for _, req := range reqs { - req.IncrRef() - } -} - -// sync function syncs content of latest value log file to disk. Syncing of value log directory is -// not required here as it happens every time a value log file rotation happens(check createVlogFile -// function). During rotation, previous value log file also gets synced to disk. It only syncs file -// if fid >= vlog.maxFid. In some cases such as replay(while opening db), it might be called with -// fid < vlog.maxFid. To sync irrespective of file id just call it with math.MaxUint32. -func (vlog *valueLog) sync() error { - if vlog.opt.SyncWrites || vlog.opt.InMemory { - return nil - } - - vlog.filesLock.RLock() - maxFid := vlog.maxFid - curlf := vlog.filesMap[maxFid] - // Sometimes it is possible that vlog.maxFid has been increased but file creation - // with same id is still in progress and this function is called. In those cases - // entry for the file might not be present in vlog.filesMap. - if curlf == nil { - vlog.filesLock.RUnlock() - return nil - } - curlf.lock.RLock() - vlog.filesLock.RUnlock() - - err := curlf.Sync() - curlf.lock.RUnlock() - return err -} - -func (vlog *valueLog) woffset() uint32 { - return atomic.LoadUint32(&vlog.writableLogOffset) -} - -// validateWrites will check whether the given requests can fit into 4GB vlog file. -// NOTE: 4GB is the maximum size we can create for vlog because value pointer offset is of type -// uint32. If we create more than 4GB, it will overflow uint32. So, limiting the size to 4GB. -func (vlog *valueLog) validateWrites(reqs []*request) error { - vlogOffset := uint64(vlog.woffset()) - for _, req := range reqs { - // calculate size of the request. - size := estimateRequestSize(req) - estimatedVlogOffset := vlogOffset + size - if estimatedVlogOffset > uint64(maxVlogFileSize) { - return errors.Errorf("Request size offset %d is bigger than maximum offset %d", - estimatedVlogOffset, maxVlogFileSize) - } - - if estimatedVlogOffset >= uint64(vlog.opt.ValueLogFileSize) { - // We'll create a new vlog file if the estimated offset is greater or equal to - // max vlog size. So, resetting the vlogOffset. - vlogOffset = 0 - continue - } - // Estimated vlog offset will become current vlog offset if the vlog is not rotated. - vlogOffset = estimatedVlogOffset - } - return nil -} - -// estimateRequestSize returns the size that needed to be written for the given request. -func estimateRequestSize(req *request) uint64 { - size := uint64(0) - for _, e := range req.Entries { - size += uint64(maxHeaderSize + len(e.Key) + len(e.Value) + crc32.Size) - } - return size -} - -// write is thread-unsafe by design and should not be called concurrently. -func (vlog *valueLog) write(reqs []*request) error { - if vlog.db.opt.InMemory { - return nil - } - // Validate writes before writing to vlog. Because, we don't want to partially write and return - // an error. - if err := vlog.validateWrites(reqs); err != nil { - return y.Wrapf(err, "while validating writes") - } - - vlog.filesLock.RLock() - maxFid := vlog.maxFid - curlf := vlog.filesMap[maxFid] - vlog.filesLock.RUnlock() - - defer func() { - if vlog.opt.SyncWrites { - if err := curlf.Sync(); err != nil { - vlog.opt.Errorf("Error while curlf sync: %v\n", err) - } - } - }() - - write := func(buf *bytes.Buffer) error { - if buf.Len() == 0 { - return nil - } - - n := uint32(buf.Len()) - endOffset := atomic.AddUint32(&vlog.writableLogOffset, n) - // Increase the file size if we cannot accommodate this entry. - if int(endOffset) >= len(curlf.Data) { - curlf.Truncate(int64(endOffset)) - } - - start := int(endOffset - n) - y.AssertTrue(copy(curlf.Data[start:], buf.Bytes()) == int(n)) - - atomic.StoreUint32(&curlf.size, endOffset) - return nil - } - - toDisk := func() error { - if vlog.woffset() > uint32(vlog.opt.ValueLogFileSize) || - vlog.numEntriesWritten > vlog.opt.ValueLogMaxEntries { - if err := curlf.doneWriting(vlog.woffset()); err != nil { - return err - } - - newlf, err := vlog.createVlogFile() - if err != nil { - return err - } - curlf = newlf - } - return nil - } - - buf := new(bytes.Buffer) - for i := range reqs { - b := reqs[i] - b.Ptrs = b.Ptrs[:0] - var written, bytesWritten int - valueSizes := make([]int64, 0, len(b.Entries)) - for j := range b.Entries { - buf.Reset() - - e := b.Entries[j] - valueSizes = append(valueSizes, int64(len(e.Value))) - if e.skipVlogAndSetThreshold(vlog.db.valueThreshold()) { - b.Ptrs = append(b.Ptrs, valuePointer{}) - continue - } - var p valuePointer - - p.Fid = curlf.fid - p.Offset = vlog.woffset() - - // We should not store transaction marks in the vlog file because it will never have all - // the entries in a transaction. If we store entries with transaction marks then value - // GC will not be able to iterate on the entire vlog file. - // But, we still want the entry to stay intact for the memTable WAL. So, store the meta - // in a temporary variable and reassign it after writing to the value log. - tmpMeta := e.meta - e.meta = e.meta &^ (bitTxn | bitFinTxn) - plen, err := curlf.encodeEntry(buf, e, p.Offset) // Now encode the entry into buffer. - if err != nil { - return err - } - // Restore the meta. - e.meta = tmpMeta - - p.Len = uint32(plen) - b.Ptrs = append(b.Ptrs, p) - if err := write(buf); err != nil { - return err - } - written++ - bytesWritten += buf.Len() - // No need to flush anything, we write to file directly via mmap. - } - y.NumWritesAdd(vlog.opt.MetricsEnabled, int64(written)) - y.NumBytesWrittenAdd(vlog.opt.MetricsEnabled, int64(bytesWritten)) - - vlog.numEntriesWritten += uint32(written) - vlog.db.threshold.update(valueSizes) - // We write to disk here so that all entries that are part of the same transaction are - // written to the same vlog file. - if err := toDisk(); err != nil { - return err - } - } - return toDisk() -} - -// Gets the logFile and acquires and RLock() for the mmap. You must call RUnlock on the file -// (if non-nil) -func (vlog *valueLog) getFileRLocked(vp valuePointer) (*logFile, error) { - vlog.filesLock.RLock() - defer vlog.filesLock.RUnlock() - ret, ok := vlog.filesMap[vp.Fid] - if !ok { - // log file has gone away, we can't do anything. Return. - return nil, errors.Errorf("file with ID: %d not found", vp.Fid) - } - - // Check for valid offset if we are reading from writable log. - maxFid := vlog.maxFid - // In read-only mode we don't need to check for writable offset as we are not writing anything. - // Moreover, this offset is not set in readonly mode. - if !vlog.opt.ReadOnly && vp.Fid == maxFid { - currentOffset := vlog.woffset() - if vp.Offset >= currentOffset { - return nil, errors.Errorf( - "Invalid value pointer offset: %d greater than current offset: %d", - vp.Offset, currentOffset) - } - } - - ret.lock.RLock() - return ret, nil -} - -// Read reads the value log at a given location. -// TODO: Make this read private. -func (vlog *valueLog) Read(vp valuePointer, _ *y.Slice) ([]byte, func(), error) { - buf, lf, err := vlog.readValueBytes(vp) - // log file is locked so, decide whether to lock immediately or let the caller to - // unlock it, after caller uses it. - cb := vlog.getUnlockCallback(lf) - if err != nil { - return nil, cb, err - } - - if vlog.opt.VerifyValueChecksum { - hash := crc32.New(y.CastagnoliCrcTable) - if _, err := hash.Write(buf[:len(buf)-crc32.Size]); err != nil { - runCallback(cb) - return nil, nil, y.Wrapf(err, "failed to write hash for vp %+v", vp) - } - // Fetch checksum from the end of the buffer. - checksum := buf[len(buf)-crc32.Size:] - if hash.Sum32() != y.BytesToU32(checksum) { - runCallback(cb) - return nil, nil, y.Wrapf(y.ErrChecksumMismatch, "value corrupted for vp: %+v", vp) - } - } - var h header - headerLen := h.Decode(buf) - kv := buf[headerLen:] - if lf.encryptionEnabled() { - kv, err = lf.decryptKV(kv, vp.Offset) - if err != nil { - return nil, cb, err - } - } - if uint32(len(kv)) < h.klen+h.vlen { - vlog.db.opt.Logger.Errorf("Invalid read: vp: %+v", vp) - return nil, nil, errors.Errorf("Invalid read: Len: %d read at:[%d:%d]", - len(kv), h.klen, h.klen+h.vlen) - } - return kv[h.klen : h.klen+h.vlen], cb, nil -} - -// getUnlockCallback will returns a function which unlock the logfile if the logfile is mmaped. -// otherwise, it unlock the logfile and return nil. -func (vlog *valueLog) getUnlockCallback(lf *logFile) func() { - if lf == nil { - return nil - } - return lf.lock.RUnlock -} - -// readValueBytes return vlog entry slice and read locked log file. Caller should take care of -// logFile unlocking. -func (vlog *valueLog) readValueBytes(vp valuePointer) ([]byte, *logFile, error) { - lf, err := vlog.getFileRLocked(vp) - if err != nil { - return nil, nil, err - } - - buf, err := lf.read(vp) - return buf, lf, err -} - -func (vlog *valueLog) pickLog(discardRatio float64) *logFile { - vlog.filesLock.RLock() - defer vlog.filesLock.RUnlock() - -LOOP: - // Pick a candidate that contains the largest amount of discardable data - fid, discard := vlog.discardStats.MaxDiscard() - - // MaxDiscard will return fid=0 if it doesn't have any discard data. The - // vlog files start from 1. - if fid == 0 { - vlog.opt.Debugf("No file with discard stats") - return nil - } - lf, ok := vlog.filesMap[fid] - // This file was deleted but it's discard stats increased because of compactions. The file - // doesn't exist so we don't need to do anything. Skip it and retry. - if !ok { - vlog.discardStats.Update(fid, -1) - goto LOOP - } - // We have a valid file. - fi, err := lf.Fd.Stat() - if err != nil { - vlog.opt.Errorf("Unable to get stats for value log fid: %d err: %+v", fi, err) - return nil - } - if thr := discardRatio * float64(fi.Size()); float64(discard) < thr { - vlog.opt.Debugf("Discard: %d less than threshold: %.0f for file: %s", - discard, thr, fi.Name()) - return nil - } - maxFid := atomic.LoadUint32(&vlog.maxFid) - if fid < maxFid { - vlog.opt.Infof("Found value log max discard fid: %d discard: %d\n", fid, discard) - lf, ok := vlog.filesMap[fid] - y.AssertTrue(ok) - return lf - } - - // Don't randomly pick any value log file. - return nil -} - -func discardEntry(e Entry, vs y.ValueStruct, db *DB) bool { - if vs.Version != y.ParseTs(e.Key) { - // Version not found. Discard. - return true - } - if isDeletedOrExpired(vs.Meta, vs.ExpiresAt) { - return true - } - if (vs.Meta & bitValuePointer) == 0 { - // Key also stores the value in LSM. Discard. - return true - } - if (vs.Meta & bitFinTxn) > 0 { - // Just a txn finish entry. Discard. - return true - } - return false -} - -type reason struct { - total float64 - discard float64 - count int -} - -func (vlog *valueLog) doRunGC(lf *logFile) error { - _, span := otrace.StartSpan(context.Background(), "Badger.GC") - span.Annotatef(nil, "GC rewrite for: %v", lf.path) - defer span.End() - if err := vlog.rewrite(lf); err != nil { - return err - } - // Remove the file from discardStats. - vlog.discardStats.Update(lf.fid, -1) - return nil -} - -func (vlog *valueLog) waitOnGC(lc *z.Closer) { - defer lc.Done() - - <-lc.HasBeenClosed() // Wait for lc to be closed. - - // Block any GC in progress to finish, and don't allow any more writes to runGC by filling up - // the channel of size 1. - vlog.garbageCh <- struct{}{} -} - -func (vlog *valueLog) runGC(discardRatio float64) error { - select { - case vlog.garbageCh <- struct{}{}: - // Pick a log file for GC. - defer func() { - <-vlog.garbageCh - }() - - lf := vlog.pickLog(discardRatio) - if lf == nil { - return ErrNoRewrite - } - return vlog.doRunGC(lf) - default: - return ErrRejected - } -} - -func (vlog *valueLog) updateDiscardStats(stats map[uint32]int64) { - if vlog.opt.InMemory { - return - } - for fid, discard := range stats { - vlog.discardStats.Update(fid, discard) - } -} - -type vlogThreshold struct { - logger Logger - percentile float64 - valueThreshold int64 - valueCh chan []int64 - clearCh chan bool - closer *z.Closer - // Metrics contains a running log of statistics like amount of data stored etc. - vlMetrics *z.HistogramData -} - -func initVlogThreshold(opt *Options) *vlogThreshold { - getBounds := func() []float64 { - mxbd := opt.maxValueThreshold - mnbd := float64(opt.ValueThreshold) - y.AssertTruef(mxbd >= mnbd, "maximum threshold bound is less than the min threshold") - size := math.Min(mxbd-mnbd+1, 1024.0) - bdstp := (mxbd - mnbd) / size - bounds := make([]float64, int64(size)) - for i := range bounds { - if i == 0 { - bounds[0] = mnbd - continue - } - if i == int(size-1) { - bounds[i] = mxbd - continue - } - bounds[i] = bounds[i-1] + bdstp - } - return bounds - } - return &vlogThreshold{ - logger: opt.Logger, - percentile: opt.VLogPercentile, - valueThreshold: opt.ValueThreshold, - valueCh: make(chan []int64, 1000), - clearCh: make(chan bool, 1), - closer: z.NewCloser(1), - vlMetrics: z.NewHistogramData(getBounds()), - } -} - -func (v *vlogThreshold) Clear(opt Options) { - atomic.StoreInt64(&v.valueThreshold, opt.ValueThreshold) - v.clearCh <- true -} - -func (v *vlogThreshold) update(sizes []int64) { - v.valueCh <- sizes -} - -func (v *vlogThreshold) close() { - v.closer.SignalAndWait() -} - -func (v *vlogThreshold) listenForValueThresholdUpdate() { - defer v.closer.Done() - for { - select { - case <-v.closer.HasBeenClosed(): - return - case val := <-v.valueCh: - for _, e := range val { - v.vlMetrics.Update(e) - } - // we are making it to get Options.VlogPercentile so that values with sizes - // in range of Options.VlogPercentile will make it to the LSM tree and rest to the - // value log file. - p := int64(v.vlMetrics.Percentile(v.percentile)) - if atomic.LoadInt64(&v.valueThreshold) != p { - if v.logger != nil { - v.logger.Infof("updating value of threshold to: %d", p) - } - atomic.StoreInt64(&v.valueThreshold, p) - } - case <-v.clearCh: - v.vlMetrics.Clear() - } - } -} diff --git a/vendor/github.com/dgraph-io/badger/v3/y/bloom.go b/vendor/github.com/dgraph-io/badger/v3/y/bloom.go deleted file mode 100644 index 806770bbf7..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/bloom.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2013 The LevelDB-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package y - -import "math" - -// Filter is an encoded set of []byte keys. -type Filter []byte - -func (f Filter) MayContainKey(k []byte) bool { - return f.MayContain(Hash(k)) -} - -// MayContain returns whether the filter may contain given key. False positives -// are possible, where it returns true for keys not in the original set. -func (f Filter) MayContain(h uint32) bool { - if len(f) < 2 { - return false - } - k := f[len(f)-1] - if k > 30 { - // This is reserved for potentially new encodings for short Bloom filters. - // Consider it a match. - return true - } - nBits := uint32(8 * (len(f) - 1)) - delta := h>>17 | h<<15 - for j := uint8(0); j < k; j++ { - bitPos := h % nBits - if f[bitPos/8]&(1<<(bitPos%8)) == 0 { - return false - } - h += delta - } - return true -} - -// NewFilter returns a new Bloom filter that encodes a set of []byte keys with -// the given number of bits per key, approximately. -// -// A good bitsPerKey value is 10, which yields a filter with ~ 1% false -// positive rate. -func NewFilter(keys []uint32, bitsPerKey int) Filter { - return Filter(appendFilter(nil, keys, bitsPerKey)) -} - -// BloomBitsPerKey returns the bits per key required by bloomfilter based on -// the false positive rate. -func BloomBitsPerKey(numEntries int, fp float64) int { - size := -1 * float64(numEntries) * math.Log(fp) / math.Pow(float64(0.69314718056), 2) - locs := math.Ceil(float64(0.69314718056) * size / float64(numEntries)) - return int(locs) -} - -func appendFilter(buf []byte, keys []uint32, bitsPerKey int) []byte { - if bitsPerKey < 0 { - bitsPerKey = 0 - } - // 0.69 is approximately ln(2). - k := uint32(float64(bitsPerKey) * 0.69) - if k < 1 { - k = 1 - } - if k > 30 { - k = 30 - } - - nBits := len(keys) * int(bitsPerKey) - // For small len(keys), we can see a very high false positive rate. Fix it - // by enforcing a minimum bloom filter length. - if nBits < 64 { - nBits = 64 - } - nBytes := (nBits + 7) / 8 - nBits = nBytes * 8 - buf, filter := extend(buf, nBytes+1) - - for _, h := range keys { - delta := h>>17 | h<<15 - for j := uint32(0); j < k; j++ { - bitPos := h % uint32(nBits) - filter[bitPos/8] |= 1 << (bitPos % 8) - h += delta - } - } - filter[nBytes] = uint8(k) - - return buf -} - -// extend appends n zero bytes to b. It returns the overall slice (of length -// n+len(originalB)) and the slice of n trailing zeroes. -func extend(b []byte, n int) (overall, trailer []byte) { - want := n + len(b) - if want <= cap(b) { - overall = b[:want] - trailer = overall[len(b):] - for i := range trailer { - trailer[i] = 0 - } - } else { - // Grow the capacity exponentially, with a 1KiB minimum. - c := 1024 - for c < want { - c += c / 4 - } - overall = make([]byte, want, c) - trailer = overall[len(b):] - copy(overall, b) - } - return overall, trailer -} - -// hash implements a hashing algorithm similar to the Murmur hash. -func Hash(b []byte) uint32 { - const ( - seed = 0xbc9f1d34 - m = 0xc6a4a793 - ) - h := uint32(seed) ^ uint32(len(b))*m - for ; len(b) >= 4; b = b[4:] { - h += uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - h *= m - h ^= h >> 16 - } - switch len(b) { - case 3: - h += uint32(b[2]) << 16 - fallthrough - case 2: - h += uint32(b[1]) << 8 - fallthrough - case 1: - h += uint32(b[0]) - h *= m - h ^= h >> 24 - } - return h -} - -// FilterPolicy implements the db.FilterPolicy interface from the leveldb/db -// package. -// -// The integer value is the approximate number of bits used per key. A good -// value is 10, which yields a filter with ~ 1% false positive rate. -// -// It is valid to use the other API in this package (leveldb/bloom) without -// using this type or the leveldb/db package. - -// type FilterPolicy int - -// // Name implements the db.FilterPolicy interface. -// func (p FilterPolicy) Name() string { -// // This string looks arbitrary, but its value is written to LevelDB .ldb -// // files, and should be this exact value to be compatible with those files -// // and with the C++ LevelDB code. -// return "leveldb.BuiltinBloomFilter2" -// } - -// // AppendFilter implements the db.FilterPolicy interface. -// func (p FilterPolicy) AppendFilter(dst []byte, keys [][]byte) []byte { -// return appendFilter(dst, keys, int(p)) -// } - -// // MayContain implements the db.FilterPolicy interface. -// func (p FilterPolicy) MayContain(filter, key []byte) bool { -// return Filter(filter).MayContain(key) -// } diff --git a/vendor/github.com/dgraph-io/badger/v3/y/checksum.go b/vendor/github.com/dgraph-io/badger/v3/y/checksum.go deleted file mode 100644 index 17d60c55d5..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/checksum.go +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package y - -import ( - "hash/crc32" - - "github.com/dgraph-io/badger/v3/pb" - - "github.com/cespare/xxhash" - "github.com/pkg/errors" -) - -// ErrChecksumMismatch is returned at checksum mismatch. -var ErrChecksumMismatch = errors.New("checksum mismatch") - -// CalculateChecksum calculates checksum for data using ct checksum type. -func CalculateChecksum(data []byte, ct pb.Checksum_Algorithm) uint64 { - switch ct { - case pb.Checksum_CRC32C: - return uint64(crc32.Checksum(data, CastagnoliCrcTable)) - case pb.Checksum_XXHash64: - return xxhash.Sum64(data) - default: - panic("checksum type not supported") - } -} - -// VerifyChecksum validates the checksum for the data against the given expected checksum. -func VerifyChecksum(data []byte, expected *pb.Checksum) error { - actual := CalculateChecksum(data, expected.Algo) - if actual != expected.Sum { - return Wrapf(ErrChecksumMismatch, "actual: %d, expected: %d", actual, expected.Sum) - } - return nil -} diff --git a/vendor/github.com/dgraph-io/badger/v3/y/encrypt.go b/vendor/github.com/dgraph-io/badger/v3/y/encrypt.go deleted file mode 100644 index a238fcf1b0..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/encrypt.go +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package y - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "crypto/rand" - "io" -) - -// XORBlock encrypts the given data with AES and XOR's with IV. -// Can be used for both encryption and decryption. IV is of -// AES block size. -func XORBlock(dst, src, key, iv []byte) error { - block, err := aes.NewCipher(key) - if err != nil { - return err - } - stream := cipher.NewCTR(block, iv) - stream.XORKeyStream(dst, src) - return nil -} - -func XORBlockAllocate(src, key, iv []byte) ([]byte, error) { - block, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - stream := cipher.NewCTR(block, iv) - dst := make([]byte, len(src)) - stream.XORKeyStream(dst, src) - return dst, nil -} - -func XORBlockStream(w io.Writer, src, key, iv []byte) error { - block, err := aes.NewCipher(key) - if err != nil { - return err - } - stream := cipher.NewCTR(block, iv) - sw := cipher.StreamWriter{S: stream, W: w} - _, err = io.Copy(sw, bytes.NewReader(src)) - return Wrapf(err, "XORBlockStream") -} - -// GenerateIV generates IV. -func GenerateIV() ([]byte, error) { - iv := make([]byte, aes.BlockSize) - _, err := rand.Read(iv) - return iv, err -} diff --git a/vendor/github.com/dgraph-io/badger/v3/y/error.go b/vendor/github.com/dgraph-io/badger/v3/y/error.go deleted file mode 100644 index a727a82eaa..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/error.go +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package y - -// This file contains some functions for error handling. Note that we are moving -// towards using x.Trace, i.e., rpc tracing using net/tracer. But for now, these -// functions are useful for simple checks logged on one machine. -// Some common use cases are: -// (1) You receive an error from external lib, and would like to check/log fatal. -// For this, use x.Check, x.Checkf. These will check for err != nil, which is -// more common in Go. If you want to check for boolean being true, use -// x.Assert, x.Assertf. -// (2) You receive an error from external lib, and would like to pass on with some -// stack trace information. In this case, use x.Wrap or x.Wrapf. -// (3) You want to generate a new error with stack trace info. Use x.Errorf. - -import ( - "fmt" - "log" - - "github.com/pkg/errors" -) - -var debugMode = false - -// Check logs fatal if err != nil. -func Check(err error) { - if err != nil { - log.Fatalf("%+v", Wrap(err, "")) - } -} - -// Check2 acts as convenience wrapper around Check, using the 2nd argument as error. -func Check2(_ interface{}, err error) { - Check(err) -} - -// AssertTrue asserts that b is true. Otherwise, it would log fatal. -func AssertTrue(b bool) { - if !b { - log.Fatalf("%+v", errors.Errorf("Assert failed")) - } -} - -// AssertTruef is AssertTrue with extra info. -func AssertTruef(b bool, format string, args ...interface{}) { - if !b { - log.Fatalf("%+v", errors.Errorf(format, args...)) - } -} - -// Wrap wraps errors from external lib. -func Wrap(err error, msg string) error { - if !debugMode { - if err == nil { - return nil - } - return fmt.Errorf("%s err: %+v", msg, err) - } - return errors.Wrap(err, msg) -} - -// Wrapf is Wrap with extra info. -func Wrapf(err error, format string, args ...interface{}) error { - if !debugMode { - if err == nil { - return nil - } - return fmt.Errorf(format+" error: %+v", append(args, err)...) - } - return errors.Wrapf(err, format, args...) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/y/event_log.go b/vendor/github.com/dgraph-io/badger/v3/y/event_log.go deleted file mode 100644 index ba9dcb1f63..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/event_log.go +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package y - -import "golang.org/x/net/trace" - -var ( - NoEventLog trace.EventLog = nilEventLog{} -) - -type nilEventLog struct{} - -func (nel nilEventLog) Printf(format string, a ...interface{}) {} - -func (nel nilEventLog) Errorf(format string, a ...interface{}) {} - -func (nel nilEventLog) Finish() {} diff --git a/vendor/github.com/dgraph-io/badger/v3/y/file_dsync.go b/vendor/github.com/dgraph-io/badger/v3/y/file_dsync.go deleted file mode 100644 index ea4d9ab260..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/file_dsync.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build !dragonfly,!freebsd,!windows,!plan9 - -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package y - -import "golang.org/x/sys/unix" - -func init() { - datasyncFileFlag = unix.O_DSYNC -} diff --git a/vendor/github.com/dgraph-io/badger/v3/y/file_nodsync.go b/vendor/github.com/dgraph-io/badger/v3/y/file_nodsync.go deleted file mode 100644 index 54a2184e19..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/file_nodsync.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build dragonfly freebsd windows plan9 - -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package y - -import "syscall" - -func init() { - datasyncFileFlag = syscall.O_SYNC -} diff --git a/vendor/github.com/dgraph-io/badger/v3/y/iterator.go b/vendor/github.com/dgraph-io/badger/v3/y/iterator.go deleted file mode 100644 index ef032ef4fa..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/iterator.go +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package y - -import ( - "bytes" - "encoding/binary" -) - -// ValueStruct represents the value info that can be associated with a key, but also the internal -// Meta field. -type ValueStruct struct { - Meta byte - UserMeta byte - ExpiresAt uint64 - Value []byte - - Version uint64 // This field is not serialized. Only for internal usage. -} - -func sizeVarint(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n -} - -// EncodedSize is the size of the ValueStruct when encoded -func (v *ValueStruct) EncodedSize() uint32 { - sz := len(v.Value) + 2 // meta, usermeta. - enc := sizeVarint(v.ExpiresAt) - return uint32(sz + enc) -} - -// Decode uses the length of the slice to infer the length of the Value field. -func (v *ValueStruct) Decode(b []byte) { - v.Meta = b[0] - v.UserMeta = b[1] - var sz int - v.ExpiresAt, sz = binary.Uvarint(b[2:]) - v.Value = b[2+sz:] -} - -// Encode expects a slice of length at least v.EncodedSize(). -func (v *ValueStruct) Encode(b []byte) uint32 { - b[0] = v.Meta - b[1] = v.UserMeta - sz := binary.PutUvarint(b[2:], v.ExpiresAt) - n := copy(b[2+sz:], v.Value) - return uint32(2 + sz + n) -} - -// EncodeTo should be kept in sync with the Encode function above. The reason -// this function exists is to avoid creating byte arrays per key-value pair in -// table/builder.go. -func (v *ValueStruct) EncodeTo(buf *bytes.Buffer) { - buf.WriteByte(v.Meta) - buf.WriteByte(v.UserMeta) - var enc [binary.MaxVarintLen64]byte - sz := binary.PutUvarint(enc[:], v.ExpiresAt) - - buf.Write(enc[:sz]) - buf.Write(v.Value) -} - -// Iterator is an interface for a basic iterator. -type Iterator interface { - Next() - Rewind() - Seek(key []byte) - Key() []byte - Value() ValueStruct - Valid() bool - - // All iterators should be closed so that file garbage collection works. - Close() error -} diff --git a/vendor/github.com/dgraph-io/badger/v3/y/metrics.go b/vendor/github.com/dgraph-io/badger/v3/y/metrics.go deleted file mode 100644 index cdae2a194a..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/metrics.go +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (C) 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package y - -import ( - "expvar" -) - -var ( - // lsmSize has size of the LSM in bytes - lsmSize *expvar.Map - // vlogSize has size of the value log in bytes - vlogSize *expvar.Map - // pendingWrites tracks the number of pending writes. - pendingWrites *expvar.Map - - // These are cumulative - - // numReads has cumulative number of reads - numReads *expvar.Int - // numWrites has cumulative number of writes - numWrites *expvar.Int - // numBytesRead has cumulative number of bytes read - numBytesRead *expvar.Int - // numBytesWritten has cumulative number of bytes written - numBytesWritten *expvar.Int - // numLSMGets is number of LMS gets - numLSMGets *expvar.Map - // numLSMBloomHits is number of LMS bloom hits - numLSMBloomHits *expvar.Map - // numGets is number of gets - numGets *expvar.Int - // numPuts is number of puts - numPuts *expvar.Int - // numBlockedPuts is number of blocked puts - numBlockedPuts *expvar.Int - // numMemtableGets is number of memtable gets - numMemtableGets *expvar.Int - // numCompactionTables is the number of tables being compacted - numCompactionTables *expvar.Int -) - -// These variables are global and have cumulative values for all kv stores. -func init() { - numReads = expvar.NewInt("badger_v3_disk_reads_total") - numWrites = expvar.NewInt("badger_v3_disk_writes_total") - numBytesRead = expvar.NewInt("badger_v3_read_bytes") - numBytesWritten = expvar.NewInt("badger_v3_written_bytes") - numLSMGets = expvar.NewMap("badger_v3_lsm_level_gets_total") - numLSMBloomHits = expvar.NewMap("badger_v3_lsm_bloom_hits_total") - numGets = expvar.NewInt("badger_v3_gets_total") - numPuts = expvar.NewInt("badger_v3_puts_total") - numBlockedPuts = expvar.NewInt("badger_v3_blocked_puts_total") - numMemtableGets = expvar.NewInt("badger_v3_memtable_gets_total") - lsmSize = expvar.NewMap("badger_v3_lsm_size_bytes") - vlogSize = expvar.NewMap("badger_v3_vlog_size_bytes") - pendingWrites = expvar.NewMap("badger_v3_pending_writes_total") - numCompactionTables = expvar.NewInt("badger_v3_compactions_current") -} - -func NumReadsAdd(enabled bool, val int64) { - addInt(enabled, numReads, val) -} - -func NumWritesAdd(enabled bool, val int64) { - addInt(enabled, numWrites, val) -} - -func NumBytesReadAdd(enabled bool, val int64) { - addInt(enabled, numBytesRead, val) -} - -func NumBytesWrittenAdd(enabled bool, val int64) { - addInt(enabled, numBytesWritten, val) -} - -func NumGetsAdd(enabled bool, val int64) { - addInt(enabled, numGets, val) -} - -func NumPutsAdd(enabled bool, val int64) { - addInt(enabled, numPuts, val) -} - -func NumBlockedPutsAdd(enabled bool, val int64) { - addInt(enabled, numBlockedPuts, val) -} - -func NumMemtableGetsAdd(enabled bool, val int64) { - addInt(enabled, numMemtableGets, val) -} - -func NumCompactionTablesAdd(enabled bool, val int64) { - addInt(enabled, numCompactionTables, val) -} - -func LSMSizeSet(enabled bool, key string, val expvar.Var) { - storeToMap(enabled, lsmSize, key, val) -} - -func VlogSizeSet(enabled bool, key string, val expvar.Var) { - storeToMap(enabled, vlogSize, key, val) -} - -func PendingWritesSet(enabled bool, key string, val expvar.Var) { - storeToMap(enabled, pendingWrites, key, val) -} - -func NumLSMBloomHitsAdd(enabled bool, key string, val int64) { - addToMap(enabled, numLSMBloomHits, key, val) -} - -func NumLSMGetsAdd(enabled bool, key string, val int64) { - addToMap(enabled, numLSMGets, key, val) -} - -func LSMSizeGet(enabled bool, key string) expvar.Var { - return getFromMap(enabled, lsmSize, key) -} - -func VlogSizeGet(enabled bool, key string) expvar.Var { - return getFromMap(enabled, vlogSize, key) -} - -func addInt(enabled bool, metric *expvar.Int, val int64) { - if !enabled { - return - } - - metric.Add(val) -} - -func addToMap(enabled bool, metric *expvar.Map, key string, val int64) { - if !enabled { - return - } - - metric.Add(key, val) -} - -func storeToMap(enabled bool, metric *expvar.Map, key string, val expvar.Var) { - if !enabled { - return - } - - metric.Set(key, val) -} - -func getFromMap(enabled bool, metric *expvar.Map, key string) expvar.Var { - if !enabled { - return nil - } - - return metric.Get(key) -} \ No newline at end of file diff --git a/vendor/github.com/dgraph-io/badger/v3/y/watermark.go b/vendor/github.com/dgraph-io/badger/v3/y/watermark.go deleted file mode 100644 index 1d7b9509c6..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/watermark.go +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright 2016-2018 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package y - -import ( - "container/heap" - "context" - "sync/atomic" - - "github.com/dgraph-io/ristretto/z" -) - -type uint64Heap []uint64 - -func (u uint64Heap) Len() int { return len(u) } -func (u uint64Heap) Less(i, j int) bool { return u[i] < u[j] } -func (u uint64Heap) Swap(i, j int) { u[i], u[j] = u[j], u[i] } -func (u *uint64Heap) Push(x interface{}) { *u = append(*u, x.(uint64)) } -func (u *uint64Heap) Pop() interface{} { - old := *u - n := len(old) - x := old[n-1] - *u = old[0 : n-1] - return x -} - -// mark contains one of more indices, along with a done boolean to indicate the -// status of the index: begin or done. It also contains waiters, who could be -// waiting for the watermark to reach >= a certain index. -type mark struct { - // Either this is an (index, waiter) pair or (index, done) or (indices, done). - index uint64 - waiter chan struct{} - indices []uint64 - done bool // Set to true if the index is done. -} - -// WaterMark is used to keep track of the minimum un-finished index. Typically, an index k becomes -// finished or "done" according to a WaterMark once Done(k) has been called -// 1. as many times as Begin(k) has, AND -// 2. a positive number of times. -// -// An index may also become "done" by calling SetDoneUntil at a time such that it is not -// inter-mingled with Begin/Done calls. -// -// Since doneUntil and lastIndex addresses are passed to sync/atomic packages, we ensure that they -// are 64-bit aligned by putting them at the beginning of the structure. -type WaterMark struct { - doneUntil uint64 - lastIndex uint64 - Name string - markCh chan mark -} - -// Init initializes a WaterMark struct. MUST be called before using it. -func (w *WaterMark) Init(closer *z.Closer) { - w.markCh = make(chan mark, 100) - go w.process(closer) -} - -// Begin sets the last index to the given value. -func (w *WaterMark) Begin(index uint64) { - atomic.StoreUint64(&w.lastIndex, index) - w.markCh <- mark{index: index, done: false} -} - -// BeginMany works like Begin but accepts multiple indices. -func (w *WaterMark) BeginMany(indices []uint64) { - atomic.StoreUint64(&w.lastIndex, indices[len(indices)-1]) - w.markCh <- mark{index: 0, indices: indices, done: false} -} - -// Done sets a single index as done. -func (w *WaterMark) Done(index uint64) { - w.markCh <- mark{index: index, done: true} -} - -// DoneMany works like Done but accepts multiple indices. -func (w *WaterMark) DoneMany(indices []uint64) { - w.markCh <- mark{index: 0, indices: indices, done: true} -} - -// DoneUntil returns the maximum index that has the property that all indices -// less than or equal to it are done. -func (w *WaterMark) DoneUntil() uint64 { - return atomic.LoadUint64(&w.doneUntil) -} - -// SetDoneUntil sets the maximum index that has the property that all indices -// less than or equal to it are done. -func (w *WaterMark) SetDoneUntil(val uint64) { - atomic.StoreUint64(&w.doneUntil, val) -} - -// LastIndex returns the last index for which Begin has been called. -func (w *WaterMark) LastIndex() uint64 { - return atomic.LoadUint64(&w.lastIndex) -} - -// WaitForMark waits until the given index is marked as done. -func (w *WaterMark) WaitForMark(ctx context.Context, index uint64) error { - if w.DoneUntil() >= index { - return nil - } - waitCh := make(chan struct{}) - w.markCh <- mark{index: index, waiter: waitCh} - - select { - case <-ctx.Done(): - return ctx.Err() - case <-waitCh: - return nil - } -} - -// process is used to process the Mark channel. This is not thread-safe, -// so only run one goroutine for process. One is sufficient, because -// all goroutine ops use purely memory and cpu. -// Each index has to emit atleast one begin watermark in serial order otherwise waiters -// can get blocked idefinitely. Example: We had an watermark at 100 and a waiter at 101, -// if no watermark is emitted at index 101 then waiter would get stuck indefinitely as it -// can't decide whether the task at 101 has decided not to emit watermark or it didn't get -// scheduled yet. -func (w *WaterMark) process(closer *z.Closer) { - defer closer.Done() - - var indices uint64Heap - // pending maps raft proposal index to the number of pending mutations for this proposal. - pending := make(map[uint64]int) - waiters := make(map[uint64][]chan struct{}) - - heap.Init(&indices) - - processOne := func(index uint64, done bool) { - // If not already done, then set. Otherwise, don't undo a done entry. - prev, present := pending[index] - if !present { - heap.Push(&indices, index) - } - - delta := 1 - if done { - delta = -1 - } - pending[index] = prev + delta - - // Update mark by going through all indices in order; and checking if they have - // been done. Stop at the first index, which isn't done. - doneUntil := w.DoneUntil() - if doneUntil > index { - AssertTruef(false, "Name: %s doneUntil: %d. Index: %d", w.Name, doneUntil, index) - } - - until := doneUntil - loops := 0 - - for len(indices) > 0 { - min := indices[0] - if done := pending[min]; done > 0 { - break // len(indices) will be > 0. - } - // Even if done is called multiple times causing it to become - // negative, we should still pop the index. - heap.Pop(&indices) - delete(pending, min) - until = min - loops++ - } - - if until != doneUntil { - AssertTrue(atomic.CompareAndSwapUint64(&w.doneUntil, doneUntil, until)) - } - - notifyAndRemove := func(idx uint64, toNotify []chan struct{}) { - for _, ch := range toNotify { - close(ch) - } - delete(waiters, idx) // Release the memory back. - } - - if until-doneUntil <= uint64(len(waiters)) { - // Issue #908 showed that if doneUntil is close to 2^60, while until is zero, this loop - // can hog up CPU just iterating over integers creating a busy-wait loop. So, only do - // this path if until - doneUntil is less than the number of waiters. - for idx := doneUntil + 1; idx <= until; idx++ { - if toNotify, ok := waiters[idx]; ok { - notifyAndRemove(idx, toNotify) - } - } - } else { - for idx, toNotify := range waiters { - if idx <= until { - notifyAndRemove(idx, toNotify) - } - } - } // end of notifying waiters. - } - - for { - select { - case <-closer.HasBeenClosed(): - return - case mark := <-w.markCh: - if mark.waiter != nil { - doneUntil := atomic.LoadUint64(&w.doneUntil) - if doneUntil >= mark.index { - close(mark.waiter) - } else { - ws, ok := waiters[mark.index] - if !ok { - waiters[mark.index] = []chan struct{}{mark.waiter} - } else { - waiters[mark.index] = append(ws, mark.waiter) - } - } - } else { - if mark.index > 0 { - processOne(mark.index, mark.done) - } - for _, index := range mark.indices { - processOne(index, mark.done) - } - } - } - } -} diff --git a/vendor/github.com/dgraph-io/badger/v3/y/y.go b/vendor/github.com/dgraph-io/badger/v3/y/y.go deleted file mode 100644 index 92dfffcfd0..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/y.go +++ /dev/null @@ -1,582 +0,0 @@ -/* - * Copyright 2017 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package y - -import ( - "bytes" - "encoding/binary" - "fmt" - "hash/crc32" - "io" - "math" - "os" - "reflect" - "strconv" - "sync" - "time" - "unsafe" - - "github.com/dgraph-io/badger/v3/pb" - "github.com/dgraph-io/ristretto/z" - "github.com/pkg/errors" -) - -var ( - // ErrEOF indicates an end of file when trying to read from a memory mapped file - // and encountering the end of slice. - ErrEOF = errors.New("ErrEOF: End of file") - - // ErrCommitAfterFinish indicates that write batch commit was called after - // finish - ErrCommitAfterFinish = errors.New("Batch commit not permitted after finish") -) - -type Flags int - -const ( - // Sync indicates that O_DSYNC should be set on the underlying file, - // ensuring that data writes do not return until the data is flushed - // to disk. - Sync Flags = 1 << iota - // ReadOnly opens the underlying file on a read-only basis. - ReadOnly -) - -var ( - // This is O_DSYNC (datasync) on platforms that support it -- see file_unix.go - datasyncFileFlag = 0x0 - - // CastagnoliCrcTable is a CRC32 polynomial table - CastagnoliCrcTable = crc32.MakeTable(crc32.Castagnoli) -) - -// OpenExistingFile opens an existing file, errors if it doesn't exist. -func OpenExistingFile(filename string, flags Flags) (*os.File, error) { - openFlags := os.O_RDWR - if flags&ReadOnly != 0 { - openFlags = os.O_RDONLY - } - - if flags&Sync != 0 { - openFlags |= datasyncFileFlag - } - return os.OpenFile(filename, openFlags, 0) -} - -// CreateSyncedFile creates a new file (using O_EXCL), errors if it already existed. -func CreateSyncedFile(filename string, sync bool) (*os.File, error) { - flags := os.O_RDWR | os.O_CREATE | os.O_EXCL - if sync { - flags |= datasyncFileFlag - } - return os.OpenFile(filename, flags, 0600) -} - -// OpenSyncedFile creates the file if one doesn't exist. -func OpenSyncedFile(filename string, sync bool) (*os.File, error) { - flags := os.O_RDWR | os.O_CREATE - if sync { - flags |= datasyncFileFlag - } - return os.OpenFile(filename, flags, 0600) -} - -// OpenTruncFile opens the file with O_RDWR | O_CREATE | O_TRUNC -func OpenTruncFile(filename string, sync bool) (*os.File, error) { - flags := os.O_RDWR | os.O_CREATE | os.O_TRUNC - if sync { - flags |= datasyncFileFlag - } - return os.OpenFile(filename, flags, 0600) -} - -// SafeCopy does append(a[:0], src...). -func SafeCopy(a, src []byte) []byte { - return append(a[:0], src...) -} - -// Copy copies a byte slice and returns the copied slice. -func Copy(a []byte) []byte { - b := make([]byte, len(a)) - copy(b, a) - return b -} - -// KeyWithTs generates a new key by appending ts to key. -func KeyWithTs(key []byte, ts uint64) []byte { - out := make([]byte, len(key)+8) - copy(out, key) - binary.BigEndian.PutUint64(out[len(key):], math.MaxUint64-ts) - return out -} - -// ParseTs parses the timestamp from the key bytes. -func ParseTs(key []byte) uint64 { - if len(key) <= 8 { - return 0 - } - return math.MaxUint64 - binary.BigEndian.Uint64(key[len(key)-8:]) -} - -// CompareKeys checks the key without timestamp and checks the timestamp if keyNoTs -// is same. -// a would be sorted higher than aa if we use bytes.compare -// All keys should have timestamp. -func CompareKeys(key1, key2 []byte) int { - if cmp := bytes.Compare(key1[:len(key1)-8], key2[:len(key2)-8]); cmp != 0 { - return cmp - } - return bytes.Compare(key1[len(key1)-8:], key2[len(key2)-8:]) -} - -// ParseKey parses the actual key from the key bytes. -func ParseKey(key []byte) []byte { - if key == nil { - return nil - } - - return key[:len(key)-8] -} - -// SameKey checks for key equality ignoring the version timestamp suffix. -func SameKey(src, dst []byte) bool { - if len(src) != len(dst) { - return false - } - return bytes.Equal(ParseKey(src), ParseKey(dst)) -} - -// Slice holds a reusable buf, will reallocate if you request a larger size than ever before. -// One problem is with n distinct sizes in random order it'll reallocate log(n) times. -type Slice struct { - buf []byte -} - -// Resize reuses the Slice's buffer (or makes a new one) and returns a slice in that buffer of -// length sz. -func (s *Slice) Resize(sz int) []byte { - if cap(s.buf) < sz { - s.buf = make([]byte, sz) - } - return s.buf[0:sz] -} - -// FixedDuration returns a string representation of the given duration with the -// hours, minutes, and seconds. -func FixedDuration(d time.Duration) string { - str := fmt.Sprintf("%02ds", int(d.Seconds())%60) - if d >= time.Minute { - str = fmt.Sprintf("%02dm", int(d.Minutes())%60) + str - } - if d >= time.Hour { - str = fmt.Sprintf("%02dh", int(d.Hours())) + str - } - return str -} - -// Throttle allows a limited number of workers to run at a time. It also -// provides a mechanism to check for errors encountered by workers and wait for -// them to finish. -type Throttle struct { - once sync.Once - wg sync.WaitGroup - ch chan struct{} - errCh chan error - finishErr error -} - -// NewThrottle creates a new throttle with a max number of workers. -func NewThrottle(max int) *Throttle { - return &Throttle{ - ch: make(chan struct{}, max), - errCh: make(chan error, max), - } -} - -// Do should be called by workers before they start working. It blocks if there -// are already maximum number of workers working. If it detects an error from -// previously Done workers, it would return it. -func (t *Throttle) Do() error { - for { - select { - case t.ch <- struct{}{}: - t.wg.Add(1) - return nil - case err := <-t.errCh: - if err != nil { - return err - } - } - } -} - -// Done should be called by workers when they finish working. They can also -// pass the error status of work done. -func (t *Throttle) Done(err error) { - if err != nil { - t.errCh <- err - } - select { - case <-t.ch: - default: - panic("Throttle Do Done mismatch") - } - t.wg.Done() -} - -// Finish waits until all workers have finished working. It would return any error passed by Done. -// If Finish is called multiple time, it will wait for workers to finish only once(first time). -// From next calls, it will return same error as found on first call. -func (t *Throttle) Finish() error { - t.once.Do(func() { - t.wg.Wait() - close(t.ch) - close(t.errCh) - for err := range t.errCh { - if err != nil { - t.finishErr = err - return - } - } - }) - - return t.finishErr -} - -// U32ToBytes converts the given Uint32 to bytes -func U32ToBytes(v uint32) []byte { - var uBuf [4]byte - binary.BigEndian.PutUint32(uBuf[:], v) - return uBuf[:] -} - -// BytesToU32 converts the given byte slice to uint32 -func BytesToU32(b []byte) uint32 { - return binary.BigEndian.Uint32(b) -} - -// U32SliceToBytes converts the given Uint32 slice to byte slice -func U32SliceToBytes(u32s []uint32) []byte { - if len(u32s) == 0 { - return nil - } - var b []byte - hdr := (*reflect.SliceHeader)(unsafe.Pointer(&b)) - hdr.Len = len(u32s) * 4 - hdr.Cap = hdr.Len - hdr.Data = uintptr(unsafe.Pointer(&u32s[0])) - return b -} - -// BytesToU32Slice converts the given byte slice to uint32 slice -func BytesToU32Slice(b []byte) []uint32 { - if len(b) == 0 { - return nil - } - var u32s []uint32 - hdr := (*reflect.SliceHeader)(unsafe.Pointer(&u32s)) - hdr.Len = len(b) / 4 - hdr.Cap = hdr.Len - hdr.Data = uintptr(unsafe.Pointer(&b[0])) - return u32s -} - -// U64ToBytes converts the given Uint64 to bytes -func U64ToBytes(v uint64) []byte { - var uBuf [8]byte - binary.BigEndian.PutUint64(uBuf[:], v) - return uBuf[:] -} - -// BytesToU64 converts the given byte slice to uint64 -func BytesToU64(b []byte) uint64 { - return binary.BigEndian.Uint64(b) -} - -// U64SliceToBytes converts the given Uint64 slice to byte slice -func U64SliceToBytes(u64s []uint64) []byte { - if len(u64s) == 0 { - return nil - } - var b []byte - hdr := (*reflect.SliceHeader)(unsafe.Pointer(&b)) - hdr.Len = len(u64s) * 8 - hdr.Cap = hdr.Len - hdr.Data = uintptr(unsafe.Pointer(&u64s[0])) - return b -} - -// BytesToU64Slice converts the given byte slice to uint64 slice -func BytesToU64Slice(b []byte) []uint64 { - if len(b) == 0 { - return nil - } - var u64s []uint64 - hdr := (*reflect.SliceHeader)(unsafe.Pointer(&u64s)) - hdr.Len = len(b) / 8 - hdr.Cap = hdr.Len - hdr.Data = uintptr(unsafe.Pointer(&b[0])) - return u64s -} - -// page struct contains one underlying buffer. -type page struct { - buf []byte -} - -// PageBuffer consists of many pages. A page is a wrapper over []byte. PageBuffer can act as a -// replacement of bytes.Buffer. Instead of having single underlying buffer, it has multiple -// underlying buffers. Hence it avoids any copy during relocation(as happens in bytes.Buffer). -// PageBuffer allocates memory in pages. Once a page is full, it will allocate page with double the -// size of previous page. Its function are not thread safe. -type PageBuffer struct { - pages []*page - - length int // Length of PageBuffer. - nextPageSize int // Size of next page to be allocated. -} - -// NewPageBuffer returns a new PageBuffer with first page having size pageSize. -func NewPageBuffer(pageSize int) *PageBuffer { - b := &PageBuffer{} - b.pages = append(b.pages, &page{buf: make([]byte, 0, pageSize)}) - b.nextPageSize = pageSize * 2 - return b -} - -// Write writes data to PageBuffer b. It returns number of bytes written and any error encountered. -func (b *PageBuffer) Write(data []byte) (int, error) { - dataLen := len(data) - for { - cp := b.pages[len(b.pages)-1] // Current page. - - n := copy(cp.buf[len(cp.buf):cap(cp.buf)], data) - cp.buf = cp.buf[:len(cp.buf)+n] - b.length += n - - if len(data) == n { - break - } - data = data[n:] - - b.pages = append(b.pages, &page{buf: make([]byte, 0, b.nextPageSize)}) - b.nextPageSize *= 2 - } - - return dataLen, nil -} - -// WriteByte writes data byte to PageBuffer and returns any encountered error. -func (b *PageBuffer) WriteByte(data byte) error { - _, err := b.Write([]byte{data}) - return err -} - -// Len returns length of PageBuffer. -func (b *PageBuffer) Len() int { - return b.length -} - -// pageForOffset returns pageIdx and startIdx for the offset. -func (b *PageBuffer) pageForOffset(offset int) (int, int) { - AssertTrue(offset < b.length) - - var pageIdx, startIdx, sizeNow int - for i := 0; i < len(b.pages); i++ { - cp := b.pages[i] - - if sizeNow+len(cp.buf)-1 < offset { - sizeNow += len(cp.buf) - } else { - pageIdx = i - startIdx = offset - sizeNow - break - } - } - - return pageIdx, startIdx -} - -// Truncate truncates PageBuffer to length n. -func (b *PageBuffer) Truncate(n int) { - pageIdx, startIdx := b.pageForOffset(n) - // For simplicity of the code reject extra pages. These pages can be kept. - b.pages = b.pages[:pageIdx+1] - cp := b.pages[len(b.pages)-1] - cp.buf = cp.buf[:startIdx] - b.length = n -} - -// Bytes returns whole Buffer data as single []byte. -func (b *PageBuffer) Bytes() []byte { - buf := make([]byte, b.length) - written := 0 - for i := 0; i < len(b.pages); i++ { - written += copy(buf[written:], b.pages[i].buf) - } - - return buf -} - -// WriteTo writes whole buffer to w. It returns number of bytes written and any error encountered. -func (b *PageBuffer) WriteTo(w io.Writer) (int64, error) { - written := int64(0) - for i := 0; i < len(b.pages); i++ { - n, err := w.Write(b.pages[i].buf) - written += int64(n) - if err != nil { - return written, err - } - } - - return written, nil -} - -// NewReaderAt returns a reader which starts reading from offset in page buffer. -func (b *PageBuffer) NewReaderAt(offset int) *PageBufferReader { - pageIdx, startIdx := b.pageForOffset(offset) - - return &PageBufferReader{ - buf: b, - pageIdx: pageIdx, - startIdx: startIdx, - } -} - -// PageBufferReader is a reader for PageBuffer. -type PageBufferReader struct { - buf *PageBuffer // Underlying page buffer. - pageIdx int // Idx of page from where it will start reading. - startIdx int // Idx inside page - buf.pages[pageIdx] from where it will start reading. -} - -// Read reads upto len(p) bytes. It returns number of bytes read and any error encountered. -func (r *PageBufferReader) Read(p []byte) (int, error) { - // Check if there is enough to Read. - pc := len(r.buf.pages) - - read := 0 - for r.pageIdx < pc && read < len(p) { - cp := r.buf.pages[r.pageIdx] // Current Page. - endIdx := len(cp.buf) // Last Idx up to which we can read from this page. - - n := copy(p[read:], cp.buf[r.startIdx:endIdx]) - read += n - r.startIdx += n - - // Instead of len(cp.buf), we comparing with cap(cp.buf). This ensures that we move to next - // page only when we have read all data. Reading from last page is an edge case. We don't - // want to move to next page until last page is full to its capacity. - if r.startIdx >= cap(cp.buf) { - // We should move to next page. - r.pageIdx++ - r.startIdx = 0 - continue - } - - // When last page in not full to its capacity and we have read all data up to its - // length, just break out of the loop. - if r.pageIdx == pc-1 { - break - } - } - - if read == 0 { - return read, io.EOF - } - - return read, nil -} - -const kvsz = int(unsafe.Sizeof(pb.KV{})) - -func NewKV(alloc *z.Allocator) *pb.KV { - if alloc == nil { - return &pb.KV{} - } - b := alloc.AllocateAligned(kvsz) - return (*pb.KV)(unsafe.Pointer(&b[0])) -} - -// IBytesToString converts size in bytes to human readable format. -// The code is taken from humanize library and changed to provide -// value upto custom decimal precision. -// IBytesToString(12312412, 1) -> 11.7 MiB -func IBytesToString(size uint64, precision int) string { - sizes := []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"} - base := float64(1024) - if size < 10 { - return fmt.Sprintf("%d B", size) - } - e := math.Floor(math.Log(float64(size)) / math.Log(base)) - suffix := sizes[int(e)] - val := float64(size) / math.Pow(base, e) - f := "%." + strconv.Itoa(precision) + "f %s" - - return fmt.Sprintf(f, val, suffix) -} - -type RateMonitor struct { - start time.Time - lastSent uint64 - lastCapture time.Time - rates []float64 - idx int -} - -func NewRateMonitor(numSamples int) *RateMonitor { - return &RateMonitor{ - start: time.Now(), - rates: make([]float64, numSamples), - } -} - -const minRate = 0.0001 - -// Capture captures the current number of sent bytes. This number should be monotonically -// increasing. -func (rm *RateMonitor) Capture(sent uint64) { - diff := sent - rm.lastSent - dur := time.Since(rm.lastCapture) - rm.lastCapture, rm.lastSent = time.Now(), sent - - rate := float64(diff) / dur.Seconds() - if rate < minRate { - rate = minRate - } - rm.rates[rm.idx] = rate - rm.idx = (rm.idx + 1) % len(rm.rates) -} - -// Rate returns the average rate of transmission smoothed out by the number of samples. -func (rm *RateMonitor) Rate() uint64 { - var total float64 - var den float64 - for _, r := range rm.rates { - if r < minRate { - // Ignore this. We always set minRate, so this is a zero. - // Typically at the start of the rate monitor, we'd have zeros. - continue - } - total += r - den += 1.0 - } - if den < minRate { - return 0 - } - return uint64(total / den) -} diff --git a/vendor/github.com/dgraph-io/badger/v3/y/zstd.go b/vendor/github.com/dgraph-io/badger/v3/y/zstd.go deleted file mode 100644 index 57018680a7..0000000000 --- a/vendor/github.com/dgraph-io/badger/v3/y/zstd.go +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package y - -import ( - "sync" - - "github.com/klauspost/compress/zstd" -) - -var ( - decoder *zstd.Decoder - encoder *zstd.Encoder - - encOnce, decOnce sync.Once -) - -// ZSTDDecompress decompresses a block using ZSTD algorithm. -func ZSTDDecompress(dst, src []byte) ([]byte, error) { - decOnce.Do(func() { - var err error - decoder, err = zstd.NewReader(nil) - Check(err) - }) - return decoder.DecodeAll(src, dst[:0]) -} - -// ZSTDCompress compresses a block using ZSTD algorithm. -func ZSTDCompress(dst, src []byte, compressionLevel int) ([]byte, error) { - encOnce.Do(func() { - var err error - level := zstd.EncoderLevelFromZstd(compressionLevel) - encoder, err = zstd.NewWriter(nil, zstd.WithEncoderLevel(level)) - Check(err) - }) - return encoder.EncodeAll(src, dst[:0]), nil -} - -// ZSTDCompressBound returns the worst case size needed for a destination buffer. -// Klauspost ZSTD library does not provide any API for Compression Bound. This -// calculation is based on the DataDog ZSTD library. -// See https://pkg.go.dev/github.com/DataDog/zstd#CompressBound -func ZSTDCompressBound(srcSize int) int { - lowLimit := 128 << 10 // 128 kB - var margin int - if srcSize < lowLimit { - margin = (lowLimit - srcSize) >> 11 - } - return srcSize + (srcSize >> 8) + margin -} diff --git a/vendor/github.com/dgraph-io/ristretto/.deepsource.toml b/vendor/github.com/dgraph-io/ristretto/.deepsource.toml deleted file mode 100644 index 40609eff3f..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/.deepsource.toml +++ /dev/null @@ -1,17 +0,0 @@ -version = 1 - -test_patterns = [ - '**/*_test.go' -] - -exclude_patterns = [ - -] - -[[analyzers]] -name = 'go' -enabled = true - - - [analyzers.meta] - import_path = 'github.com/dgraph-io/ristretto' diff --git a/vendor/github.com/dgraph-io/ristretto/CHANGELOG.md b/vendor/github.com/dgraph-io/ristretto/CHANGELOG.md deleted file mode 100644 index da964bc0c8..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/CHANGELOG.md +++ /dev/null @@ -1,172 +0,0 @@ -# Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and this project will adhere to [Semantic Versioning](http://semver.org/spec/v2.0.0.html) starting v1.0.0. - -## Unreleased - -## [0.1.0] - 2021-06-03 - -[0.1.0]: https://github.com/dgraph-io/ristretto/compare/v0.1.0..v0.0.3 -This release contains bug fixes and improvements to Ristretto. It also contains -major updates to the z package. The z package contains types such as Tree (B+ -tree), Buffer, Mmap file, etc. All these types are used in Badger and Dgraph to -improve performance and reduce memory requirements. - -### Changed -- Make item public. Add a new onReject call for rejected items. (#180) - -### Added -- Use z.Buffer backing for B+ tree (#268) -- expose GetTTL function (#270) -- docs(README): Ristretto is production-ready. (#267) -- Add IterateKV (#265) -- feat(super-flags): Add GetPath method in superflags (#258) -- add GetDuration to SuperFlag (#248) -- add Has, GetFloat64, and GetInt64 to SuperFlag (#247) -- move SuperFlag to Ristretto (#246) -- add SuperFlagHelp tool to generate flag help text (#251) -- allow empty defaults in SuperFlag (#254) -- add mmaped b+ tree (#207) -- Add API to allow the MaxCost of an existing cache to be updated. (#200) -- Add OnExit handler which can be used for manual memory management (#183) -- Add life expectancy histogram (#182) -- Add mechanism to wait for items to be processed. (#184) - -### Fixed -- change expiration type from int64 to time.Time (#277) -- fix(buffer): make buffer capacity atleast defaultCapacity (#273) -- Fixes for z.PersistentTree (#272) -- Initialize persistent tree correctly (#271) -- use xxhash v2 (#266) -- update comments to correctly reflect counter space usage (#189) -- enable riscv64 builds (#264) -- Switch from log to glog (#263) -- Use Fibonacci for latency numbers -- cache: fix race when clearning a cache (#261) -- Check for keys without values in superflags (#259) -- chore(perf): using tags instead of runtime callers to improve the performance of leak detection (#255) -- fix(Flags): panic on user errors (#256) -- fix SuperFlagHelp newline (#252) -- fix(arm): Fix crashing under ARMv6 due to memory mis-alignment (#239) -- Fix incorrect unit test coverage depiction (#245) -- chore(histogram): adding percentile in histogram (#241) -- fix(windows): use filepath instead of path (#244) -- fix(MmapFile): Close the fd before deleting the file (#242) -- Fixes CGO_ENABLED=0 compilation error (#240) -- fix(build): fix build on non-amd64 architectures (#238) -- fix(b+tree): Do not double the size of btree (#237) -- fix(jemalloc): Fix the stats of jemalloc (#236) -- Don't print stuff, only return strings. -- Bring memclrNoHeapPointers to z (#235) -- increase number of buffers from 32 to 64 in allocator (#234) -- Set minSize to 1MB. -- Opt(btree): Use Go memory instead of mmap files -- Opt(btree): Lightweight stats calculation -- Put padding internally to z.Buffer -- Chore(z): Add SetTmpDir API to set the temp directory (#233) -- Add a BufferFrom -- Bring z.Allocator and z.AllocatorPool back -- Fix(z.Allocator): Make Allocator use Go memory -- Updated ZeroOut to use a simple for loop. (#231) -- Add concurrency back -- Add a test to check concurrency of Allocator. -- Fix(buffer): Expose padding by z.Buffer's APIs and fix test (#222) -- AllocateSlice should Truncate if the file is not big enough (#226) -- Zero out allocations for structs now that we're reusing Allocators. -- Fix the ristretto substring -- Deal with nil z.AllocatorPool -- Create an AllocatorPool class. -- chore(btree): clean NewTree API (#225) -- fix(MmapFile): Don't error out if fileSize > sz (#224) -- feat(btree): allow option to reset btree and mmaping it to specified file. (#223) -- Use mremap on Linux instead of munmap+mmap (#221) -- Reuse pages in B+ tree (#220) -- fix(allocator): make nil allocator return go byte slice (#217) -- fix(buffer): Make padding internal to z.buffer (#216) -- chore(buffer): add a parent directory field in z.Buffer (#215) -- Make Allocator concurrent -- Fix infinite loop in allocator (#214) -- Add trim func -- Use allocator pool. Turn off freelist. -- Add freelists to Allocator to reuse. -- make DeleteBelow delete values that are less than lo (#211) -- Avoid an unnecessary Load procedure in IncrementOffset. -- Add Stats method in Btree. -- chore(script): fix local test script (#210) -- fix(btree): Increase buffer size if needed. (#209) -- chore(btree): add occupancy ratio, search benchmark and compact bug fix (#208) -- Add licenses, remove prints, and fix a bug in compact -- Add IncrementOffset API for z.buffers (#206) -- Show count when printing histogram (#201) -- Zbuffer: Add LenNoPadding and make padding 8 bytes (#204) -- Allocate Go memory in case allocator is nil. -- Add leak detection via leak build flag and fix a leak during cache.Close. -- Add some APIs for allocator and buffer -- Sync before truncation or close. -- Handle nil MmapFile for Sync. -- Public methods must not panic after Close() (#202) -- Check for RD_ONLY correctly. -- Modify MmapFile APIs -- Add a bunch of APIs around MmapFile -- Move APIs for mmapfile creation over to z package. -- Add ZeroOut func -- Add SliceOffsets -- z: Add TotalSize method on bloom filter (#197) -- Add Msync func -- Buffer: Use 256 GB mmap size instead of MaxInt64 (#198) -- Add a simple test to check next2Pow -- Improve memory performance (#195) -- Have a way to automatically mmap a growing buffer (#196) -- Introduce Mmapped buffers and Merge Sort (#194) -- Add a way to access an allocator via reference. -- Use jemalloc.a to ensure compilation with the Go binary -- Fix up a build issue with ReadMemStats -- Add ReadMemStats function (#193) -- Allocator helps allocate memory to be used by unsafe structs (#192) -- Improve histogram output -- Move Closer from y to z (#191) -- Add histogram.Mean() method (#188) -- Introduce Calloc: Manual Memory Management via jemalloc (#186) - -## [0.0.3] - 2020-07-06 - -[0.0.3]: https://github.com/dgraph-io/ristretto/compare/v0.0.2..v0.0.3 - -### Changed - -### Added - -### Fixed - -- z: use MemHashString and xxhash.Sum64String ([#153][]) -- Check conflict key before updating expiration map. ([#154][]) -- Fix race condition in Cache.Clear ([#133][]) -- Improve handling of updated items ([#168][]) -- Fix droppedSets count while updating the item ([#171][]) - -## [0.0.2] - 2020-02-24 - -[0.0.2]: https://github.com/dgraph-io/ristretto/compare/v0.0.1..v0.0.2 - -### Added - -- Sets with TTL. ([#122][]) - -### Fixed - -- Fix the way metrics are handled for deletions. ([#111][]) -- Support nil `*Cache` values in `Clear` and `Close`. ([#119][]) -- Delete item immediately. ([#113][]) -- Remove key from policy after TTL eviction. ([#130][]) - -[#111]: https://github.com/dgraph-io/ristretto/issues/111 -[#113]: https://github.com/dgraph-io/ristretto/issues/113 -[#119]: https://github.com/dgraph-io/ristretto/issues/119 -[#122]: https://github.com/dgraph-io/ristretto/issues/122 -[#130]: https://github.com/dgraph-io/ristretto/issues/130 - -## 0.0.1 - -First release. Basic cache functionality based on a LFU policy. diff --git a/vendor/github.com/dgraph-io/ristretto/LICENSE b/vendor/github.com/dgraph-io/ristretto/LICENSE deleted file mode 100644 index d9a10c0d8e..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/LICENSE +++ /dev/null @@ -1,176 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/vendor/github.com/dgraph-io/ristretto/README.md b/vendor/github.com/dgraph-io/ristretto/README.md deleted file mode 100644 index f4bb28cd75..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/README.md +++ /dev/null @@ -1,220 +0,0 @@ -# Ristretto -[![Go Doc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/dgraph-io/ristretto) -[![Go Report Card](https://img.shields.io/badge/go%20report-A%2B-brightgreen)](https://goreportcard.com/report/github.com/dgraph-io/ristretto) -[![Coverage](https://gocover.io/_badge/github.com/dgraph-io/ristretto)](https://gocover.io/github.com/dgraph-io/ristretto) -![Tests](https://github.com/dgraph-io/ristretto/workflows/tests/badge.svg) - -Ristretto is a fast, concurrent cache library built with a focus on performance and correctness. - -The motivation to build Ristretto comes from the need for a contention-free -cache in [Dgraph][]. - -**Use [Discuss Issues](https://discuss.dgraph.io/tags/c/issues/35/ristretto/40) for reporting issues about this repository.** - -[Dgraph]: https://github.com/dgraph-io/dgraph - -## Features - -* **High Hit Ratios** - with our unique admission/eviction policy pairing, Ristretto's performance is best in class. - * **Eviction: SampledLFU** - on par with exact LRU and better performance on Search and Database traces. - * **Admission: TinyLFU** - extra performance with little memory overhead (12 bits per counter). -* **Fast Throughput** - we use a variety of techniques for managing contention and the result is excellent throughput. -* **Cost-Based Eviction** - any large new item deemed valuable can evict multiple smaller items (cost could be anything). -* **Fully Concurrent** - you can use as many goroutines as you want with little throughput degradation. -* **Metrics** - optional performance metrics for throughput, hit ratios, and other stats. -* **Simple API** - just figure out your ideal `Config` values and you're off and running. - -## Status - -Ristretto is production-ready. See [Projects using Ristretto](#projects-using-ristretto). - -## Table of Contents - -* [Usage](#Usage) - * [Example](#Example) - * [Config](#Config) - * [NumCounters](#Config) - * [MaxCost](#Config) - * [BufferItems](#Config) - * [Metrics](#Config) - * [OnEvict](#Config) - * [KeyToHash](#Config) - * [Cost](#Config) -* [Benchmarks](#Benchmarks) - * [Hit Ratios](#Hit-Ratios) - * [Search](#Search) - * [Database](#Database) - * [Looping](#Looping) - * [CODASYL](#CODASYL) - * [Throughput](#Throughput) - * [Mixed](#Mixed) - * [Read](#Read) - * [Write](#Write) -* [Projects using Ristretto](#projects-using-ristretto) -* [FAQ](#FAQ) - -## Usage - -### Example - -```go -func main() { - cache, err := ristretto.NewCache(&ristretto.Config{ - NumCounters: 1e7, // number of keys to track frequency of (10M). - MaxCost: 1 << 30, // maximum cost of cache (1GB). - BufferItems: 64, // number of keys per Get buffer. - }) - if err != nil { - panic(err) - } - - // set a value with a cost of 1 - cache.Set("key", "value", 1) - - // wait for value to pass through buffers - time.Sleep(10 * time.Millisecond) - - value, found := cache.Get("key") - if !found { - panic("missing value") - } - fmt.Println(value) - cache.Del("key") -} -``` - -### Config - -The `Config` struct is passed to `NewCache` when creating Ristretto instances (see the example above). - -**NumCounters** `int64` - -NumCounters is the number of 4-bit access counters to keep for admission and eviction. We've seen good performance in setting this to 10x the number of items you expect to keep in the cache when full. - -For example, if you expect each item to have a cost of 1 and MaxCost is 100, set NumCounters to 1,000. Or, if you use variable cost values but expect the cache to hold around 10,000 items when full, set NumCounters to 100,000. The important thing is the *number of unique items* in the full cache, not necessarily the MaxCost value. - -**MaxCost** `int64` - -MaxCost is how eviction decisions are made. For example, if MaxCost is 100 and a new item with a cost of 1 increases total cache cost to 101, 1 item will be evicted. - -MaxCost can also be used to denote the max size in bytes. For example, if MaxCost is 1,000,000 (1MB) and the cache is full with 1,000 1KB items, a new item (that's accepted) would cause 5 1KB items to be evicted. - -MaxCost could be anything as long as it matches how you're using the cost values when calling Set. - -**BufferItems** `int64` - -BufferItems is the size of the Get buffers. The best value we've found for this is 64. - -If for some reason you see Get performance decreasing with lots of contention (you shouldn't), try increasing this value in increments of 64. This is a fine-tuning mechanism and you probably won't have to touch this. - -**Metrics** `bool` - -Metrics is true when you want real-time logging of a variety of stats. The reason this is a Config flag is because there's a 10% throughput performance overhead. - -**OnEvict** `func(hashes [2]uint64, value interface{}, cost int64)` - -OnEvict is called for every eviction. - -**KeyToHash** `func(key interface{}) [2]uint64` - -KeyToHash is the hashing algorithm used for every key. If this is nil, Ristretto has a variety of [defaults depending on the underlying interface type](https://github.com/dgraph-io/ristretto/blob/master/z/z.go#L19-L41). - -Note that if you want 128bit hashes you should use the full `[2]uint64`, -otherwise just fill the `uint64` at the `0` position and it will behave like -any 64bit hash. - -**Cost** `func(value interface{}) int64` - -Cost is an optional function you can pass to the Config in order to evaluate -item cost at runtime, and only for the Set calls that aren't dropped (this is -useful if calculating item cost is particularly expensive and you don't want to -waste time on items that will be dropped anyways). - -To signal to Ristretto that you'd like to use this Cost function: - -1. Set the Cost field to a non-nil function. -2. When calling Set for new items or item updates, use a `cost` of 0. - -## Benchmarks - -The benchmarks can be found in https://github.com/dgraph-io/benchmarks/tree/master/cachebench/ristretto. - -### Hit Ratios - -#### Search - -This trace is described as "disk read accesses initiated by a large commercial -search engine in response to various web search requests." - -

- -

- -#### Database - -This trace is described as "a database server running at a commercial site -running an ERP application on top of a commercial database." - -

- -

- -#### Looping - -This trace demonstrates a looping access pattern. - -

- -

- -#### CODASYL - -This trace is described as "references to a CODASYL database for a one hour -period." - -

- -

- -### Throughput - -All throughput benchmarks were ran on an Intel Core i7-8700K (3.7GHz) with 16gb -of RAM. - -#### Mixed - -

- -

- -#### Read - -

- -

- -#### Write - -

- -

- -## Projects Using Ristretto - -Below is a list of known projects that use Ristretto: - -- [Badger](https://github.com/dgraph-io/badger) - Embeddable key-value DB in Go -- [Dgraph](https://github.com/dgraph-io/dgraph) - Horizontally scalable and distributed GraphQL database with a graph backend -- [Vitess](https://github.com/vitessio/vitess) - database clustering system for horizontal scaling of MySQL - -## FAQ - -### How are you achieving this performance? What shortcuts are you taking? - -We go into detail in the [Ristretto blog post](https://blog.dgraph.io/post/introducing-ristretto-high-perf-go-cache/), but in short: our throughput performance can be attributed to a mix of batching and eventual consistency. Our hit ratio performance is mostly due to an excellent [admission policy](https://arxiv.org/abs/1512.00727) and SampledLFU eviction policy. - -As for "shortcuts," the only thing Ristretto does that could be construed as one is dropping some Set calls. That means a Set call for a new item (updates are guaranteed) isn't guaranteed to make it into the cache. The new item could be dropped at two points: when passing through the Set buffer or when passing through the admission policy. However, this doesn't affect hit ratios much at all as we expect the most popular items to be Set multiple times and eventually make it in the cache. - -### Is Ristretto distributed? - -No, it's just like any other Go library that you can import into your project and use in a single process. diff --git a/vendor/github.com/dgraph-io/ristretto/cache.go b/vendor/github.com/dgraph-io/ristretto/cache.go deleted file mode 100644 index 7226245bcc..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/cache.go +++ /dev/null @@ -1,719 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Ristretto is a fast, fixed size, in-memory cache with a dual focus on -// throughput and hit ratio performance. You can easily add Ristretto to an -// existing system and keep the most valuable data where you need it. -package ristretto - -import ( - "bytes" - "errors" - "fmt" - "sync" - "sync/atomic" - "time" - "unsafe" - - "github.com/dgraph-io/ristretto/z" -) - -var ( - // TODO: find the optimal value for this or make it configurable - setBufSize = 32 * 1024 -) - -type itemCallback func(*Item) - -const itemSize = int64(unsafe.Sizeof(storeItem{})) - -// Cache is a thread-safe implementation of a hashmap with a TinyLFU admission -// policy and a Sampled LFU eviction policy. You can use the same Cache instance -// from as many goroutines as you want. -type Cache struct { - // store is the central concurrent hashmap where key-value items are stored. - store store - // policy determines what gets let in to the cache and what gets kicked out. - policy policy - // getBuf is a custom ring buffer implementation that gets pushed to when - // keys are read. - getBuf *ringBuffer - // setBuf is a buffer allowing us to batch/drop Sets during times of high - // contention. - setBuf chan *Item - // onEvict is called for item evictions. - onEvict itemCallback - // onReject is called when an item is rejected via admission policy. - onReject itemCallback - // onExit is called whenever a value goes out of scope from the cache. - onExit (func(interface{})) - // KeyToHash function is used to customize the key hashing algorithm. - // Each key will be hashed using the provided function. If keyToHash value - // is not set, the default keyToHash function is used. - keyToHash func(interface{}) (uint64, uint64) - // stop is used to stop the processItems goroutine. - stop chan struct{} - // indicates whether cache is closed. - isClosed bool - // cost calculates cost from a value. - cost func(value interface{}) int64 - // ignoreInternalCost dictates whether to ignore the cost of internally storing - // the item in the cost calculation. - ignoreInternalCost bool - // cleanupTicker is used to periodically check for entries whose TTL has passed. - cleanupTicker *time.Ticker - // Metrics contains a running log of important statistics like hits, misses, - // and dropped items. - Metrics *Metrics -} - -// Config is passed to NewCache for creating new Cache instances. -type Config struct { - // NumCounters determines the number of counters (keys) to keep that hold - // access frequency information. It's generally a good idea to have more - // counters than the max cache capacity, as this will improve eviction - // accuracy and subsequent hit ratios. - // - // For example, if you expect your cache to hold 1,000,000 items when full, - // NumCounters should be 10,000,000 (10x). Each counter takes up roughly - // 3 bytes (4 bits for each counter * 4 copies plus about a byte per - // counter for the bloom filter). Note that the number of counters is - // internally rounded up to the nearest power of 2, so the space usage - // may be a little larger than 3 bytes * NumCounters. - NumCounters int64 - // MaxCost can be considered as the cache capacity, in whatever units you - // choose to use. - // - // For example, if you want the cache to have a max capacity of 100MB, you - // would set MaxCost to 100,000,000 and pass an item's number of bytes as - // the `cost` parameter for calls to Set. If new items are accepted, the - // eviction process will take care of making room for the new item and not - // overflowing the MaxCost value. - MaxCost int64 - // BufferItems determines the size of Get buffers. - // - // Unless you have a rare use case, using `64` as the BufferItems value - // results in good performance. - BufferItems int64 - // Metrics determines whether cache statistics are kept during the cache's - // lifetime. There *is* some overhead to keeping statistics, so you should - // only set this flag to true when testing or throughput performance isn't a - // major factor. - Metrics bool - // OnEvict is called for every eviction and passes the hashed key, value, - // and cost to the function. - OnEvict func(item *Item) - // OnReject is called for every rejection done via the policy. - OnReject func(item *Item) - // OnExit is called whenever a value is removed from cache. This can be - // used to do manual memory deallocation. Would also be called on eviction - // and rejection of the value. - OnExit func(val interface{}) - // KeyToHash function is used to customize the key hashing algorithm. - // Each key will be hashed using the provided function. If keyToHash value - // is not set, the default keyToHash function is used. - KeyToHash func(key interface{}) (uint64, uint64) - // Cost evaluates a value and outputs a corresponding cost. This function - // is ran after Set is called for a new item or an item update with a cost - // param of 0. - Cost func(value interface{}) int64 - // IgnoreInternalCost set to true indicates to the cache that the cost of - // internally storing the value should be ignored. This is useful when the - // cost passed to set is not using bytes as units. Keep in mind that setting - // this to true will increase the memory usage. - IgnoreInternalCost bool -} - -type itemFlag byte - -const ( - itemNew itemFlag = iota - itemDelete - itemUpdate -) - -// Item is passed to setBuf so items can eventually be added to the cache. -type Item struct { - flag itemFlag - Key uint64 - Conflict uint64 - Value interface{} - Cost int64 - Expiration time.Time - wg *sync.WaitGroup -} - -// NewCache returns a new Cache instance and any configuration errors, if any. -func NewCache(config *Config) (*Cache, error) { - switch { - case config.NumCounters == 0: - return nil, errors.New("NumCounters can't be zero") - case config.MaxCost == 0: - return nil, errors.New("MaxCost can't be zero") - case config.BufferItems == 0: - return nil, errors.New("BufferItems can't be zero") - } - policy := newPolicy(config.NumCounters, config.MaxCost) - cache := &Cache{ - store: newStore(), - policy: policy, - getBuf: newRingBuffer(policy, config.BufferItems), - setBuf: make(chan *Item, setBufSize), - keyToHash: config.KeyToHash, - stop: make(chan struct{}), - cost: config.Cost, - ignoreInternalCost: config.IgnoreInternalCost, - cleanupTicker: time.NewTicker(time.Duration(bucketDurationSecs) * time.Second / 2), - } - cache.onExit = func(val interface{}) { - if config.OnExit != nil && val != nil { - config.OnExit(val) - } - } - cache.onEvict = func(item *Item) { - if config.OnEvict != nil { - config.OnEvict(item) - } - cache.onExit(item.Value) - } - cache.onReject = func(item *Item) { - if config.OnReject != nil { - config.OnReject(item) - } - cache.onExit(item.Value) - } - if cache.keyToHash == nil { - cache.keyToHash = z.KeyToHash - } - if config.Metrics { - cache.collectMetrics() - } - // NOTE: benchmarks seem to show that performance decreases the more - // goroutines we have running cache.processItems(), so 1 should - // usually be sufficient - go cache.processItems() - return cache, nil -} - -func (c *Cache) Wait() { - if c == nil || c.isClosed { - return - } - wg := &sync.WaitGroup{} - wg.Add(1) - c.setBuf <- &Item{wg: wg} - wg.Wait() -} - -// Get returns the value (if any) and a boolean representing whether the -// value was found or not. The value can be nil and the boolean can be true at -// the same time. -func (c *Cache) Get(key interface{}) (interface{}, bool) { - if c == nil || c.isClosed || key == nil { - return nil, false - } - keyHash, conflictHash := c.keyToHash(key) - c.getBuf.Push(keyHash) - value, ok := c.store.Get(keyHash, conflictHash) - if ok { - c.Metrics.add(hit, keyHash, 1) - } else { - c.Metrics.add(miss, keyHash, 1) - } - return value, ok -} - -// Set attempts to add the key-value item to the cache. If it returns false, -// then the Set was dropped and the key-value item isn't added to the cache. If -// it returns true, there's still a chance it could be dropped by the policy if -// its determined that the key-value item isn't worth keeping, but otherwise the -// item will be added and other items will be evicted in order to make room. -// -// To dynamically evaluate the items cost using the Config.Coster function, set -// the cost parameter to 0 and Coster will be ran when needed in order to find -// the items true cost. -func (c *Cache) Set(key, value interface{}, cost int64) bool { - return c.SetWithTTL(key, value, cost, 0*time.Second) -} - -// SetWithTTL works like Set but adds a key-value pair to the cache that will expire -// after the specified TTL (time to live) has passed. A zero value means the value never -// expires, which is identical to calling Set. A negative value is a no-op and the value -// is discarded. -func (c *Cache) SetWithTTL(key, value interface{}, cost int64, ttl time.Duration) bool { - if c == nil || c.isClosed || key == nil { - return false - } - - var expiration time.Time - switch { - case ttl == 0: - // No expiration. - break - case ttl < 0: - // Treat this a a no-op. - return false - default: - expiration = time.Now().Add(ttl) - } - - keyHash, conflictHash := c.keyToHash(key) - i := &Item{ - flag: itemNew, - Key: keyHash, - Conflict: conflictHash, - Value: value, - Cost: cost, - Expiration: expiration, - } - // cost is eventually updated. The expiration must also be immediately updated - // to prevent items from being prematurely removed from the map. - if prev, ok := c.store.Update(i); ok { - c.onExit(prev) - i.flag = itemUpdate - } - // Attempt to send item to policy. - select { - case c.setBuf <- i: - return true - default: - if i.flag == itemUpdate { - // Return true if this was an update operation since we've already - // updated the store. For all the other operations (set/delete), we - // return false which means the item was not inserted. - return true - } - c.Metrics.add(dropSets, keyHash, 1) - return false - } -} - -// Del deletes the key-value item from the cache if it exists. -func (c *Cache) Del(key interface{}) { - if c == nil || c.isClosed || key == nil { - return - } - keyHash, conflictHash := c.keyToHash(key) - // Delete immediately. - _, prev := c.store.Del(keyHash, conflictHash) - c.onExit(prev) - // If we've set an item, it would be applied slightly later. - // So we must push the same item to `setBuf` with the deletion flag. - // This ensures that if a set is followed by a delete, it will be - // applied in the correct order. - c.setBuf <- &Item{ - flag: itemDelete, - Key: keyHash, - Conflict: conflictHash, - } -} - -// GetTTL returns the TTL for the specified key and a bool that is true if the -// item was found and is not expired. -func (c *Cache) GetTTL(key interface{}) (time.Duration, bool) { - if c == nil || key == nil { - return 0, false - } - - keyHash, conflictHash := c.keyToHash(key) - if _, ok := c.store.Get(keyHash, conflictHash); !ok { - // not found - return 0, false - } - - expiration := c.store.Expiration(keyHash) - if expiration.IsZero() { - // found but no expiration - return 0, true - } - - if time.Now().After(expiration) { - // found but expired - return 0, false - } - - return time.Until(expiration), true -} - -// Close stops all goroutines and closes all channels. -func (c *Cache) Close() { - if c == nil || c.isClosed { - return - } - c.Clear() - - // Block until processItems goroutine is returned. - c.stop <- struct{}{} - close(c.stop) - close(c.setBuf) - c.policy.Close() - c.isClosed = true -} - -// Clear empties the hashmap and zeroes all policy counters. Note that this is -// not an atomic operation (but that shouldn't be a problem as it's assumed that -// Set/Get calls won't be occurring until after this). -func (c *Cache) Clear() { - if c == nil || c.isClosed { - return - } - // Block until processItems goroutine is returned. - c.stop <- struct{}{} - - // Clear out the setBuf channel. -loop: - for { - select { - case i := <-c.setBuf: - if i.wg != nil { - i.wg.Done() - continue - } - if i.flag != itemUpdate { - // In itemUpdate, the value is already set in the store. So, no need to call - // onEvict here. - c.onEvict(i) - } - default: - break loop - } - } - - // Clear value hashmap and policy data. - c.policy.Clear() - c.store.Clear(c.onEvict) - // Only reset metrics if they're enabled. - if c.Metrics != nil { - c.Metrics.Clear() - } - // Restart processItems goroutine. - go c.processItems() -} - -// MaxCost returns the max cost of the cache. -func (c *Cache) MaxCost() int64 { - if c == nil { - return 0 - } - return c.policy.MaxCost() -} - -// UpdateMaxCost updates the maxCost of an existing cache. -func (c *Cache) UpdateMaxCost(maxCost int64) { - if c == nil { - return - } - c.policy.UpdateMaxCost(maxCost) -} - -// processItems is ran by goroutines processing the Set buffer. -func (c *Cache) processItems() { - startTs := make(map[uint64]time.Time) - numToKeep := 100000 // TODO: Make this configurable via options. - - trackAdmission := func(key uint64) { - if c.Metrics == nil { - return - } - startTs[key] = time.Now() - if len(startTs) > numToKeep { - for k := range startTs { - if len(startTs) <= numToKeep { - break - } - delete(startTs, k) - } - } - } - onEvict := func(i *Item) { - if ts, has := startTs[i.Key]; has { - c.Metrics.trackEviction(int64(time.Since(ts) / time.Second)) - delete(startTs, i.Key) - } - if c.onEvict != nil { - c.onEvict(i) - } - } - - for { - select { - case i := <-c.setBuf: - if i.wg != nil { - i.wg.Done() - continue - } - // Calculate item cost value if new or update. - if i.Cost == 0 && c.cost != nil && i.flag != itemDelete { - i.Cost = c.cost(i.Value) - } - if !c.ignoreInternalCost { - // Add the cost of internally storing the object. - i.Cost += itemSize - } - - switch i.flag { - case itemNew: - victims, added := c.policy.Add(i.Key, i.Cost) - if added { - c.store.Set(i) - c.Metrics.add(keyAdd, i.Key, 1) - trackAdmission(i.Key) - } else { - c.onReject(i) - } - for _, victim := range victims { - victim.Conflict, victim.Value = c.store.Del(victim.Key, 0) - onEvict(victim) - } - - case itemUpdate: - c.policy.Update(i.Key, i.Cost) - - case itemDelete: - c.policy.Del(i.Key) // Deals with metrics updates. - _, val := c.store.Del(i.Key, i.Conflict) - c.onExit(val) - } - case <-c.cleanupTicker.C: - c.store.Cleanup(c.policy, onEvict) - case <-c.stop: - return - } - } -} - -// collectMetrics just creates a new *Metrics instance and adds the pointers -// to the cache and policy instances. -func (c *Cache) collectMetrics() { - c.Metrics = newMetrics() - c.policy.CollectMetrics(c.Metrics) -} - -type metricType int - -const ( - // The following 2 keep track of hits and misses. - hit = iota - miss - // The following 3 keep track of number of keys added, updated and evicted. - keyAdd - keyUpdate - keyEvict - // The following 2 keep track of cost of keys added and evicted. - costAdd - costEvict - // The following keep track of how many sets were dropped or rejected later. - dropSets - rejectSets - // The following 2 keep track of how many gets were kept and dropped on the - // floor. - dropGets - keepGets - // This should be the final enum. Other enums should be set before this. - doNotUse -) - -func stringFor(t metricType) string { - switch t { - case hit: - return "hit" - case miss: - return "miss" - case keyAdd: - return "keys-added" - case keyUpdate: - return "keys-updated" - case keyEvict: - return "keys-evicted" - case costAdd: - return "cost-added" - case costEvict: - return "cost-evicted" - case dropSets: - return "sets-dropped" - case rejectSets: - return "sets-rejected" // by policy. - case dropGets: - return "gets-dropped" - case keepGets: - return "gets-kept" - default: - return "unidentified" - } -} - -// Metrics is a snapshot of performance statistics for the lifetime of a cache instance. -type Metrics struct { - all [doNotUse][]*uint64 - - mu sync.RWMutex - life *z.HistogramData // Tracks the life expectancy of a key. -} - -func newMetrics() *Metrics { - s := &Metrics{ - life: z.NewHistogramData(z.HistogramBounds(1, 16)), - } - for i := 0; i < doNotUse; i++ { - s.all[i] = make([]*uint64, 256) - slice := s.all[i] - for j := range slice { - slice[j] = new(uint64) - } - } - return s -} - -func (p *Metrics) add(t metricType, hash, delta uint64) { - if p == nil { - return - } - valp := p.all[t] - // Avoid false sharing by padding at least 64 bytes of space between two - // atomic counters which would be incremented. - idx := (hash % 25) * 10 - atomic.AddUint64(valp[idx], delta) -} - -func (p *Metrics) get(t metricType) uint64 { - if p == nil { - return 0 - } - valp := p.all[t] - var total uint64 - for i := range valp { - total += atomic.LoadUint64(valp[i]) - } - return total -} - -// Hits is the number of Get calls where a value was found for the corresponding key. -func (p *Metrics) Hits() uint64 { - return p.get(hit) -} - -// Misses is the number of Get calls where a value was not found for the corresponding key. -func (p *Metrics) Misses() uint64 { - return p.get(miss) -} - -// KeysAdded is the total number of Set calls where a new key-value item was added. -func (p *Metrics) KeysAdded() uint64 { - return p.get(keyAdd) -} - -// KeysUpdated is the total number of Set calls where the value was updated. -func (p *Metrics) KeysUpdated() uint64 { - return p.get(keyUpdate) -} - -// KeysEvicted is the total number of keys evicted. -func (p *Metrics) KeysEvicted() uint64 { - return p.get(keyEvict) -} - -// CostAdded is the sum of costs that have been added (successful Set calls). -func (p *Metrics) CostAdded() uint64 { - return p.get(costAdd) -} - -// CostEvicted is the sum of all costs that have been evicted. -func (p *Metrics) CostEvicted() uint64 { - return p.get(costEvict) -} - -// SetsDropped is the number of Set calls that don't make it into internal -// buffers (due to contention or some other reason). -func (p *Metrics) SetsDropped() uint64 { - return p.get(dropSets) -} - -// SetsRejected is the number of Set calls rejected by the policy (TinyLFU). -func (p *Metrics) SetsRejected() uint64 { - return p.get(rejectSets) -} - -// GetsDropped is the number of Get counter increments that are dropped -// internally. -func (p *Metrics) GetsDropped() uint64 { - return p.get(dropGets) -} - -// GetsKept is the number of Get counter increments that are kept. -func (p *Metrics) GetsKept() uint64 { - return p.get(keepGets) -} - -// Ratio is the number of Hits over all accesses (Hits + Misses). This is the -// percentage of successful Get calls. -func (p *Metrics) Ratio() float64 { - if p == nil { - return 0.0 - } - hits, misses := p.get(hit), p.get(miss) - if hits == 0 && misses == 0 { - return 0.0 - } - return float64(hits) / float64(hits+misses) -} - -func (p *Metrics) trackEviction(numSeconds int64) { - if p == nil { - return - } - p.mu.Lock() - defer p.mu.Unlock() - p.life.Update(numSeconds) -} - -func (p *Metrics) LifeExpectancySeconds() *z.HistogramData { - if p == nil { - return nil - } - p.mu.RLock() - defer p.mu.RUnlock() - return p.life.Copy() -} - -// Clear resets all the metrics. -func (p *Metrics) Clear() { - if p == nil { - return - } - for i := 0; i < doNotUse; i++ { - for j := range p.all[i] { - atomic.StoreUint64(p.all[i][j], 0) - } - } - p.mu.Lock() - p.life = z.NewHistogramData(z.HistogramBounds(1, 16)) - p.mu.Unlock() -} - -// String returns a string representation of the metrics. -func (p *Metrics) String() string { - if p == nil { - return "" - } - var buf bytes.Buffer - for i := 0; i < doNotUse; i++ { - t := metricType(i) - fmt.Fprintf(&buf, "%s: %d ", stringFor(t), p.get(t)) - } - fmt.Fprintf(&buf, "gets-total: %d ", p.get(hit)+p.get(miss)) - fmt.Fprintf(&buf, "hit-ratio: %.2f", p.Ratio()) - return buf.String() -} diff --git a/vendor/github.com/dgraph-io/ristretto/policy.go b/vendor/github.com/dgraph-io/ristretto/policy.go deleted file mode 100644 index bf23f91fd9..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/policy.go +++ /dev/null @@ -1,423 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ristretto - -import ( - "math" - "sync" - "sync/atomic" - - "github.com/dgraph-io/ristretto/z" -) - -const ( - // lfuSample is the number of items to sample when looking at eviction - // candidates. 5 seems to be the most optimal number [citation needed]. - lfuSample = 5 -) - -// policy is the interface encapsulating eviction/admission behavior. -// -// TODO: remove this interface and just rename defaultPolicy to policy, as we -// are probably only going to use/implement/maintain one policy. -type policy interface { - ringConsumer - // Add attempts to Add the key-cost pair to the Policy. It returns a slice - // of evicted keys and a bool denoting whether or not the key-cost pair - // was added. If it returns true, the key should be stored in cache. - Add(uint64, int64) ([]*Item, bool) - // Has returns true if the key exists in the Policy. - Has(uint64) bool - // Del deletes the key from the Policy. - Del(uint64) - // Cap returns the available capacity. - Cap() int64 - // Close stops all goroutines and closes all channels. - Close() - // Update updates the cost value for the key. - Update(uint64, int64) - // Cost returns the cost value of a key or -1 if missing. - Cost(uint64) int64 - // Optionally, set stats object to track how policy is performing. - CollectMetrics(*Metrics) - // Clear zeroes out all counters and clears hashmaps. - Clear() - // MaxCost returns the current max cost of the cache policy. - MaxCost() int64 - // UpdateMaxCost updates the max cost of the cache policy. - UpdateMaxCost(int64) -} - -func newPolicy(numCounters, maxCost int64) policy { - return newDefaultPolicy(numCounters, maxCost) -} - -type defaultPolicy struct { - sync.Mutex - admit *tinyLFU - evict *sampledLFU - itemsCh chan []uint64 - stop chan struct{} - isClosed bool - metrics *Metrics -} - -func newDefaultPolicy(numCounters, maxCost int64) *defaultPolicy { - p := &defaultPolicy{ - admit: newTinyLFU(numCounters), - evict: newSampledLFU(maxCost), - itemsCh: make(chan []uint64, 3), - stop: make(chan struct{}), - } - go p.processItems() - return p -} - -func (p *defaultPolicy) CollectMetrics(metrics *Metrics) { - p.metrics = metrics - p.evict.metrics = metrics -} - -type policyPair struct { - key uint64 - cost int64 -} - -func (p *defaultPolicy) processItems() { - for { - select { - case items := <-p.itemsCh: - p.Lock() - p.admit.Push(items) - p.Unlock() - case <-p.stop: - return - } - } -} - -func (p *defaultPolicy) Push(keys []uint64) bool { - if p.isClosed { - return false - } - - if len(keys) == 0 { - return true - } - - select { - case p.itemsCh <- keys: - p.metrics.add(keepGets, keys[0], uint64(len(keys))) - return true - default: - p.metrics.add(dropGets, keys[0], uint64(len(keys))) - return false - } -} - -// Add decides whether the item with the given key and cost should be accepted by -// the policy. It returns the list of victims that have been evicted and a boolean -// indicating whether the incoming item should be accepted. -func (p *defaultPolicy) Add(key uint64, cost int64) ([]*Item, bool) { - p.Lock() - defer p.Unlock() - - // Cannot add an item bigger than entire cache. - if cost > p.evict.getMaxCost() { - return nil, false - } - - // No need to go any further if the item is already in the cache. - if has := p.evict.updateIfHas(key, cost); has { - // An update does not count as an addition, so return false. - return nil, false - } - - // If the execution reaches this point, the key doesn't exist in the cache. - // Calculate the remaining room in the cache (usually bytes). - room := p.evict.roomLeft(cost) - if room >= 0 { - // There's enough room in the cache to store the new item without - // overflowing. Do that now and stop here. - p.evict.add(key, cost) - p.metrics.add(costAdd, key, uint64(cost)) - return nil, true - } - - // incHits is the hit count for the incoming item. - incHits := p.admit.Estimate(key) - // sample is the eviction candidate pool to be filled via random sampling. - // TODO: perhaps we should use a min heap here. Right now our time - // complexity is N for finding the min. Min heap should bring it down to - // O(lg N). - sample := make([]*policyPair, 0, lfuSample) - // As items are evicted they will be appended to victims. - victims := make([]*Item, 0) - - // Delete victims until there's enough space or a minKey is found that has - // more hits than incoming item. - for ; room < 0; room = p.evict.roomLeft(cost) { - // Fill up empty slots in sample. - sample = p.evict.fillSample(sample) - - // Find minimally used item in sample. - minKey, minHits, minId, minCost := uint64(0), int64(math.MaxInt64), 0, int64(0) - for i, pair := range sample { - // Look up hit count for sample key. - if hits := p.admit.Estimate(pair.key); hits < minHits { - minKey, minHits, minId, minCost = pair.key, hits, i, pair.cost - } - } - - // If the incoming item isn't worth keeping in the policy, reject. - if incHits < minHits { - p.metrics.add(rejectSets, key, 1) - return victims, false - } - - // Delete the victim from metadata. - p.evict.del(minKey) - - // Delete the victim from sample. - sample[minId] = sample[len(sample)-1] - sample = sample[:len(sample)-1] - // Store victim in evicted victims slice. - victims = append(victims, &Item{ - Key: minKey, - Conflict: 0, - Cost: minCost, - }) - } - - p.evict.add(key, cost) - p.metrics.add(costAdd, key, uint64(cost)) - return victims, true -} - -func (p *defaultPolicy) Has(key uint64) bool { - p.Lock() - _, exists := p.evict.keyCosts[key] - p.Unlock() - return exists -} - -func (p *defaultPolicy) Del(key uint64) { - p.Lock() - p.evict.del(key) - p.Unlock() -} - -func (p *defaultPolicy) Cap() int64 { - p.Lock() - capacity := int64(p.evict.getMaxCost() - p.evict.used) - p.Unlock() - return capacity -} - -func (p *defaultPolicy) Update(key uint64, cost int64) { - p.Lock() - p.evict.updateIfHas(key, cost) - p.Unlock() -} - -func (p *defaultPolicy) Cost(key uint64) int64 { - p.Lock() - if cost, found := p.evict.keyCosts[key]; found { - p.Unlock() - return cost - } - p.Unlock() - return -1 -} - -func (p *defaultPolicy) Clear() { - p.Lock() - p.admit.clear() - p.evict.clear() - p.Unlock() -} - -func (p *defaultPolicy) Close() { - if p.isClosed { - return - } - - // Block until the p.processItems goroutine returns. - p.stop <- struct{}{} - close(p.stop) - close(p.itemsCh) - p.isClosed = true -} - -func (p *defaultPolicy) MaxCost() int64 { - if p == nil || p.evict == nil { - return 0 - } - return p.evict.getMaxCost() -} - -func (p *defaultPolicy) UpdateMaxCost(maxCost int64) { - if p == nil || p.evict == nil { - return - } - p.evict.updateMaxCost(maxCost) -} - -// sampledLFU is an eviction helper storing key-cost pairs. -type sampledLFU struct { - // NOTE: align maxCost to 64-bit boundary for use with atomic. - // As per https://golang.org/pkg/sync/atomic/: "On ARM, x86-32, - // and 32-bit MIPS, it is the caller’s responsibility to arrange - // for 64-bit alignment of 64-bit words accessed atomically. - // The first word in a variable or in an allocated struct, array, - // or slice can be relied upon to be 64-bit aligned." - maxCost int64 - used int64 - metrics *Metrics - keyCosts map[uint64]int64 -} - -func newSampledLFU(maxCost int64) *sampledLFU { - return &sampledLFU{ - keyCosts: make(map[uint64]int64), - maxCost: maxCost, - } -} - -func (p *sampledLFU) getMaxCost() int64 { - return atomic.LoadInt64(&p.maxCost) -} - -func (p *sampledLFU) updateMaxCost(maxCost int64) { - atomic.StoreInt64(&p.maxCost, maxCost) -} - -func (p *sampledLFU) roomLeft(cost int64) int64 { - return p.getMaxCost() - (p.used + cost) -} - -func (p *sampledLFU) fillSample(in []*policyPair) []*policyPair { - if len(in) >= lfuSample { - return in - } - for key, cost := range p.keyCosts { - in = append(in, &policyPair{key, cost}) - if len(in) >= lfuSample { - return in - } - } - return in -} - -func (p *sampledLFU) del(key uint64) { - cost, ok := p.keyCosts[key] - if !ok { - return - } - p.used -= cost - delete(p.keyCosts, key) - p.metrics.add(costEvict, key, uint64(cost)) - p.metrics.add(keyEvict, key, 1) -} - -func (p *sampledLFU) add(key uint64, cost int64) { - p.keyCosts[key] = cost - p.used += cost -} - -func (p *sampledLFU) updateIfHas(key uint64, cost int64) bool { - if prev, found := p.keyCosts[key]; found { - // Update the cost of an existing key, but don't worry about evicting. - // Evictions will be handled the next time a new item is added. - p.metrics.add(keyUpdate, key, 1) - if prev > cost { - diff := prev - cost - p.metrics.add(costAdd, key, ^uint64(uint64(diff)-1)) - } else if cost > prev { - diff := cost - prev - p.metrics.add(costAdd, key, uint64(diff)) - } - p.used += cost - prev - p.keyCosts[key] = cost - return true - } - return false -} - -func (p *sampledLFU) clear() { - p.used = 0 - p.keyCosts = make(map[uint64]int64) -} - -// tinyLFU is an admission helper that keeps track of access frequency using -// tiny (4-bit) counters in the form of a count-min sketch. -// tinyLFU is NOT thread safe. -type tinyLFU struct { - freq *cmSketch - door *z.Bloom - incrs int64 - resetAt int64 -} - -func newTinyLFU(numCounters int64) *tinyLFU { - return &tinyLFU{ - freq: newCmSketch(numCounters), - door: z.NewBloomFilter(float64(numCounters), 0.01), - resetAt: numCounters, - } -} - -func (p *tinyLFU) Push(keys []uint64) { - for _, key := range keys { - p.Increment(key) - } -} - -func (p *tinyLFU) Estimate(key uint64) int64 { - hits := p.freq.Estimate(key) - if p.door.Has(key) { - hits++ - } - return hits -} - -func (p *tinyLFU) Increment(key uint64) { - // Flip doorkeeper bit if not already done. - if added := p.door.AddIfNotHas(key); !added { - // Increment count-min counter if doorkeeper bit is already set. - p.freq.Increment(key) - } - p.incrs++ - if p.incrs >= p.resetAt { - p.reset() - } -} - -func (p *tinyLFU) reset() { - // Zero out incrs. - p.incrs = 0 - // clears doorkeeper bits - p.door.Clear() - // halves count-min counters - p.freq.Reset() -} - -func (p *tinyLFU) clear() { - p.incrs = 0 - p.door.Clear() - p.freq.Clear() -} diff --git a/vendor/github.com/dgraph-io/ristretto/ring.go b/vendor/github.com/dgraph-io/ristretto/ring.go deleted file mode 100644 index 5dbed4cc59..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/ring.go +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ristretto - -import ( - "sync" -) - -// ringConsumer is the user-defined object responsible for receiving and -// processing items in batches when buffers are drained. -type ringConsumer interface { - Push([]uint64) bool -} - -// ringStripe is a singular ring buffer that is not concurrent safe. -type ringStripe struct { - cons ringConsumer - data []uint64 - capa int -} - -func newRingStripe(cons ringConsumer, capa int64) *ringStripe { - return &ringStripe{ - cons: cons, - data: make([]uint64, 0, capa), - capa: int(capa), - } -} - -// Push appends an item in the ring buffer and drains (copies items and -// sends to Consumer) if full. -func (s *ringStripe) Push(item uint64) { - s.data = append(s.data, item) - // Decide if the ring buffer should be drained. - if len(s.data) >= s.capa { - // Send elements to consumer and create a new ring stripe. - if s.cons.Push(s.data) { - s.data = make([]uint64, 0, s.capa) - } else { - s.data = s.data[:0] - } - } -} - -// ringBuffer stores multiple buffers (stripes) and distributes Pushed items -// between them to lower contention. -// -// This implements the "batching" process described in the BP-Wrapper paper -// (section III part A). -type ringBuffer struct { - pool *sync.Pool -} - -// newRingBuffer returns a striped ring buffer. The Consumer in ringConfig will -// be called when individual stripes are full and need to drain their elements. -func newRingBuffer(cons ringConsumer, capa int64) *ringBuffer { - // LOSSY buffers use a very simple sync.Pool for concurrently reusing - // stripes. We do lose some stripes due to GC (unheld items in sync.Pool - // are cleared), but the performance gains generally outweigh the small - // percentage of elements lost. The performance primarily comes from - // low-level runtime functions used in the standard library that aren't - // available to us (such as runtime_procPin()). - return &ringBuffer{ - pool: &sync.Pool{ - New: func() interface{} { return newRingStripe(cons, capa) }, - }, - } -} - -// Push adds an element to one of the internal stripes and possibly drains if -// the stripe becomes full. -func (b *ringBuffer) Push(item uint64) { - // Reuse or create a new stripe. - stripe := b.pool.Get().(*ringStripe) - stripe.Push(item) - b.pool.Put(stripe) -} diff --git a/vendor/github.com/dgraph-io/ristretto/sketch.go b/vendor/github.com/dgraph-io/ristretto/sketch.go deleted file mode 100644 index 10f414689a..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/sketch.go +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// This package includes multiple probabalistic data structures needed for -// admission/eviction metadata. Most are Counting Bloom Filter variations, but -// a caching-specific feature that is also required is a "freshness" mechanism, -// which basically serves as a "lifetime" process. This freshness mechanism -// was described in the original TinyLFU paper [1], but other mechanisms may -// be better suited for certain data distributions. -// -// [1]: https://arxiv.org/abs/1512.00727 -package ristretto - -import ( - "fmt" - "math/rand" - "time" -) - -// cmSketch is a Count-Min sketch implementation with 4-bit counters, heavily -// based on Damian Gryski's CM4 [1]. -// -// [1]: https://github.com/dgryski/go-tinylfu/blob/master/cm4.go -type cmSketch struct { - rows [cmDepth]cmRow - seed [cmDepth]uint64 - mask uint64 -} - -const ( - // cmDepth is the number of counter copies to store (think of it as rows). - cmDepth = 4 -) - -func newCmSketch(numCounters int64) *cmSketch { - if numCounters == 0 { - panic("cmSketch: bad numCounters") - } - // Get the next power of 2 for better cache performance. - numCounters = next2Power(numCounters) - sketch := &cmSketch{mask: uint64(numCounters - 1)} - // Initialize rows of counters and seeds. - source := rand.New(rand.NewSource(time.Now().UnixNano())) - for i := 0; i < cmDepth; i++ { - sketch.seed[i] = source.Uint64() - sketch.rows[i] = newCmRow(numCounters) - } - return sketch -} - -// Increment increments the count(ers) for the specified key. -func (s *cmSketch) Increment(hashed uint64) { - for i := range s.rows { - s.rows[i].increment((hashed ^ s.seed[i]) & s.mask) - } -} - -// Estimate returns the value of the specified key. -func (s *cmSketch) Estimate(hashed uint64) int64 { - min := byte(255) - for i := range s.rows { - val := s.rows[i].get((hashed ^ s.seed[i]) & s.mask) - if val < min { - min = val - } - } - return int64(min) -} - -// Reset halves all counter values. -func (s *cmSketch) Reset() { - for _, r := range s.rows { - r.reset() - } -} - -// Clear zeroes all counters. -func (s *cmSketch) Clear() { - for _, r := range s.rows { - r.clear() - } -} - -// cmRow is a row of bytes, with each byte holding two counters. -type cmRow []byte - -func newCmRow(numCounters int64) cmRow { - return make(cmRow, numCounters/2) -} - -func (r cmRow) get(n uint64) byte { - return byte(r[n/2]>>((n&1)*4)) & 0x0f -} - -func (r cmRow) increment(n uint64) { - // Index of the counter. - i := n / 2 - // Shift distance (even 0, odd 4). - s := (n & 1) * 4 - // Counter value. - v := (r[i] >> s) & 0x0f - // Only increment if not max value (overflow wrap is bad for LFU). - if v < 15 { - r[i] += 1 << s - } -} - -func (r cmRow) reset() { - // Halve each counter. - for i := range r { - r[i] = (r[i] >> 1) & 0x77 - } -} - -func (r cmRow) clear() { - // Zero each counter. - for i := range r { - r[i] = 0 - } -} - -func (r cmRow) string() string { - s := "" - for i := uint64(0); i < uint64(len(r)*2); i++ { - s += fmt.Sprintf("%02d ", (r[(i/2)]>>((i&1)*4))&0x0f) - } - s = s[:len(s)-1] - return s -} - -// next2Power rounds x up to the next power of 2, if it's not already one. -func next2Power(x int64) int64 { - x-- - x |= x >> 1 - x |= x >> 2 - x |= x >> 4 - x |= x >> 8 - x |= x >> 16 - x |= x >> 32 - x++ - return x -} diff --git a/vendor/github.com/dgraph-io/ristretto/store.go b/vendor/github.com/dgraph-io/ristretto/store.go deleted file mode 100644 index e42a98b787..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/store.go +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ristretto - -import ( - "sync" - "time" -) - -// TODO: Do we need this to be a separate struct from Item? -type storeItem struct { - key uint64 - conflict uint64 - value interface{} - expiration time.Time -} - -// store is the interface fulfilled by all hash map implementations in this -// file. Some hash map implementations are better suited for certain data -// distributions than others, so this allows us to abstract that out for use -// in Ristretto. -// -// Every store is safe for concurrent usage. -type store interface { - // Get returns the value associated with the key parameter. - Get(uint64, uint64) (interface{}, bool) - // Expiration returns the expiration time for this key. - Expiration(uint64) time.Time - // Set adds the key-value pair to the Map or updates the value if it's - // already present. The key-value pair is passed as a pointer to an - // item object. - Set(*Item) - // Del deletes the key-value pair from the Map. - Del(uint64, uint64) (uint64, interface{}) - // Update attempts to update the key with a new value and returns true if - // successful. - Update(*Item) (interface{}, bool) - // Cleanup removes items that have an expired TTL. - Cleanup(policy policy, onEvict itemCallback) - // Clear clears all contents of the store. - Clear(onEvict itemCallback) -} - -// newStore returns the default store implementation. -func newStore() store { - return newShardedMap() -} - -const numShards uint64 = 256 - -type shardedMap struct { - shards []*lockedMap - expiryMap *expirationMap -} - -func newShardedMap() *shardedMap { - sm := &shardedMap{ - shards: make([]*lockedMap, int(numShards)), - expiryMap: newExpirationMap(), - } - for i := range sm.shards { - sm.shards[i] = newLockedMap(sm.expiryMap) - } - return sm -} - -func (sm *shardedMap) Get(key, conflict uint64) (interface{}, bool) { - return sm.shards[key%numShards].get(key, conflict) -} - -func (sm *shardedMap) Expiration(key uint64) time.Time { - return sm.shards[key%numShards].Expiration(key) -} - -func (sm *shardedMap) Set(i *Item) { - if i == nil { - // If item is nil make this Set a no-op. - return - } - - sm.shards[i.Key%numShards].Set(i) -} - -func (sm *shardedMap) Del(key, conflict uint64) (uint64, interface{}) { - return sm.shards[key%numShards].Del(key, conflict) -} - -func (sm *shardedMap) Update(newItem *Item) (interface{}, bool) { - return sm.shards[newItem.Key%numShards].Update(newItem) -} - -func (sm *shardedMap) Cleanup(policy policy, onEvict itemCallback) { - sm.expiryMap.cleanup(sm, policy, onEvict) -} - -func (sm *shardedMap) Clear(onEvict itemCallback) { - for i := uint64(0); i < numShards; i++ { - sm.shards[i].Clear(onEvict) - } -} - -type lockedMap struct { - sync.RWMutex - data map[uint64]storeItem - em *expirationMap -} - -func newLockedMap(em *expirationMap) *lockedMap { - return &lockedMap{ - data: make(map[uint64]storeItem), - em: em, - } -} - -func (m *lockedMap) get(key, conflict uint64) (interface{}, bool) { - m.RLock() - item, ok := m.data[key] - m.RUnlock() - if !ok { - return nil, false - } - if conflict != 0 && (conflict != item.conflict) { - return nil, false - } - - // Handle expired items. - if !item.expiration.IsZero() && time.Now().After(item.expiration) { - return nil, false - } - return item.value, true -} - -func (m *lockedMap) Expiration(key uint64) time.Time { - m.RLock() - defer m.RUnlock() - return m.data[key].expiration -} - -func (m *lockedMap) Set(i *Item) { - if i == nil { - // If the item is nil make this Set a no-op. - return - } - - m.Lock() - defer m.Unlock() - item, ok := m.data[i.Key] - - if ok { - // The item existed already. We need to check the conflict key and reject the - // update if they do not match. Only after that the expiration map is updated. - if i.Conflict != 0 && (i.Conflict != item.conflict) { - return - } - m.em.update(i.Key, i.Conflict, item.expiration, i.Expiration) - } else { - // The value is not in the map already. There's no need to return anything. - // Simply add the expiration map. - m.em.add(i.Key, i.Conflict, i.Expiration) - } - - m.data[i.Key] = storeItem{ - key: i.Key, - conflict: i.Conflict, - value: i.Value, - expiration: i.Expiration, - } -} - -func (m *lockedMap) Del(key, conflict uint64) (uint64, interface{}) { - m.Lock() - item, ok := m.data[key] - if !ok { - m.Unlock() - return 0, nil - } - if conflict != 0 && (conflict != item.conflict) { - m.Unlock() - return 0, nil - } - - if !item.expiration.IsZero() { - m.em.del(key, item.expiration) - } - - delete(m.data, key) - m.Unlock() - return item.conflict, item.value -} - -func (m *lockedMap) Update(newItem *Item) (interface{}, bool) { - m.Lock() - item, ok := m.data[newItem.Key] - if !ok { - m.Unlock() - return nil, false - } - if newItem.Conflict != 0 && (newItem.Conflict != item.conflict) { - m.Unlock() - return nil, false - } - - m.em.update(newItem.Key, newItem.Conflict, item.expiration, newItem.Expiration) - m.data[newItem.Key] = storeItem{ - key: newItem.Key, - conflict: newItem.Conflict, - value: newItem.Value, - expiration: newItem.Expiration, - } - - m.Unlock() - return item.value, true -} - -func (m *lockedMap) Clear(onEvict itemCallback) { - m.Lock() - i := &Item{} - if onEvict != nil { - for _, si := range m.data { - i.Key = si.key - i.Conflict = si.conflict - i.Value = si.value - onEvict(i) - } - } - m.data = make(map[uint64]storeItem) - m.Unlock() -} diff --git a/vendor/github.com/dgraph-io/ristretto/test.sh b/vendor/github.com/dgraph-io/ristretto/test.sh deleted file mode 100644 index d53b32d42a..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/test.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /bin/sh - -starttest() { - set -e - GO111MODULE=on go test -race ./... -} - -if [ -z "${TEAMCITY_VERSION}" ]; then - # running locally, so start test in a container - # TEAMCITY_VERSION=local will avoid recursive calls, when it would be running in container - docker run --rm --name ristretto-test -ti \ - -v `pwd`:/go/src/github.com/dgraph-io/ristretto \ - --workdir /go/src/github.com/dgraph-io/ristretto \ - --env TEAMCITY_VERSION=local \ - golang:1.13 \ - sh test.sh -else - # running in teamcity, since teamcity itself run this in container, let's simply run this - starttest -fi diff --git a/vendor/github.com/dgraph-io/ristretto/ttl.go b/vendor/github.com/dgraph-io/ristretto/ttl.go deleted file mode 100644 index 337976ad43..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/ttl.go +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ristretto - -import ( - "sync" - "time" -) - -var ( - // TODO: find the optimal value or make it configurable. - bucketDurationSecs = int64(5) -) - -func storageBucket(t time.Time) int64 { - return (t.Unix() / bucketDurationSecs) + 1 -} - -func cleanupBucket(t time.Time) int64 { - // The bucket to cleanup is always behind the storage bucket by one so that - // no elements in that bucket (which might not have expired yet) are deleted. - return storageBucket(t) - 1 -} - -// bucket type is a map of key to conflict. -type bucket map[uint64]uint64 - -// expirationMap is a map of bucket number to the corresponding bucket. -type expirationMap struct { - sync.RWMutex - buckets map[int64]bucket -} - -func newExpirationMap() *expirationMap { - return &expirationMap{ - buckets: make(map[int64]bucket), - } -} - -func (m *expirationMap) add(key, conflict uint64, expiration time.Time) { - if m == nil { - return - } - - // Items that don't expire don't need to be in the expiration map. - if expiration.IsZero() { - return - } - - bucketNum := storageBucket(expiration) - m.Lock() - defer m.Unlock() - - b, ok := m.buckets[bucketNum] - if !ok { - b = make(bucket) - m.buckets[bucketNum] = b - } - b[key] = conflict -} - -func (m *expirationMap) update(key, conflict uint64, oldExpTime, newExpTime time.Time) { - if m == nil { - return - } - - m.Lock() - defer m.Unlock() - - oldBucketNum := storageBucket(oldExpTime) - oldBucket, ok := m.buckets[oldBucketNum] - if ok { - delete(oldBucket, key) - } - - newBucketNum := storageBucket(newExpTime) - newBucket, ok := m.buckets[newBucketNum] - if !ok { - newBucket = make(bucket) - m.buckets[newBucketNum] = newBucket - } - newBucket[key] = conflict -} - -func (m *expirationMap) del(key uint64, expiration time.Time) { - if m == nil { - return - } - - bucketNum := storageBucket(expiration) - m.Lock() - defer m.Unlock() - _, ok := m.buckets[bucketNum] - if !ok { - return - } - delete(m.buckets[bucketNum], key) -} - -// cleanup removes all the items in the bucket that was just completed. It deletes -// those items from the store, and calls the onEvict function on those items. -// This function is meant to be called periodically. -func (m *expirationMap) cleanup(store store, policy policy, onEvict itemCallback) { - if m == nil { - return - } - - m.Lock() - now := time.Now() - bucketNum := cleanupBucket(now) - keys := m.buckets[bucketNum] - delete(m.buckets, bucketNum) - m.Unlock() - - for key, conflict := range keys { - // Sanity check. Verify that the store agrees that this key is expired. - if store.Expiration(key).After(now) { - continue - } - - cost := policy.Cost(key) - policy.Del(key) - _, value := store.Del(key, conflict) - - if onEvict != nil { - onEvict(&Item{Key: key, - Conflict: conflict, - Value: value, - Cost: cost, - }) - } - } -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/LICENSE b/vendor/github.com/dgraph-io/ristretto/z/LICENSE deleted file mode 100644 index 0860cbfe85..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/LICENSE +++ /dev/null @@ -1,64 +0,0 @@ -bbloom.go - -// The MIT License (MIT) -// Copyright (c) 2014 Andreas Briese, eduToolbox@Bri-C GmbH, Sarstedt - -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -rtutil.go - -// MIT License - -// Copyright (c) 2019 Ewan Chou - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -Modifications: - -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - diff --git a/vendor/github.com/dgraph-io/ristretto/z/README.md b/vendor/github.com/dgraph-io/ristretto/z/README.md deleted file mode 100644 index 6d77e146eb..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/README.md +++ /dev/null @@ -1,129 +0,0 @@ -## bbloom: a bitset Bloom filter for go/golang -=== - -package implements a fast bloom filter with real 'bitset' and JSONMarshal/JSONUnmarshal to store/reload the Bloom filter. - -NOTE: the package uses unsafe.Pointer to set and read the bits from the bitset. If you're uncomfortable with using the unsafe package, please consider using my bloom filter package at github.com/AndreasBriese/bloom - -=== - -changelog 11/2015: new thread safe methods AddTS(), HasTS(), AddIfNotHasTS() following a suggestion from Srdjan Marinovic (github @a-little-srdjan), who used this to code a bloomfilter cache. - -This bloom filter was developed to strengthen a website-log database and was tested and optimized for this log-entry mask: "2014/%02i/%02i %02i:%02i:%02i /info.html". -Nonetheless bbloom should work with any other form of entries. - -~~Hash function is a modified Berkeley DB sdbm hash (to optimize for smaller strings). sdbm http://www.cse.yorku.ca/~oz/hash.html~~ - -Found sipHash (SipHash-2-4, a fast short-input PRF created by Jean-Philippe Aumasson and Daniel J. Bernstein.) to be about as fast. sipHash had been ported by Dimtry Chestnyk to Go (github.com/dchest/siphash ) - -Minimum hashset size is: 512 ([4]uint64; will be set automatically). - -###install - -```sh -go get github.com/AndreasBriese/bbloom -``` - -###test -+ change to folder ../bbloom -+ create wordlist in file "words.txt" (you might use `python permut.py`) -+ run 'go test -bench=.' within the folder - -```go -go test -bench=. -``` - -~~If you've installed the GOCONVEY TDD-framework http://goconvey.co/ you can run the tests automatically.~~ - -using go's testing framework now (have in mind that the op timing is related to 65536 operations of Add, Has, AddIfNotHas respectively) - -### usage - -after installation add - -```go -import ( - ... - "github.com/AndreasBriese/bbloom" - ... - ) -``` - -at your header. In the program use - -```go -// create a bloom filter for 65536 items and 1 % wrong-positive ratio -bf := bbloom.New(float64(1<<16), float64(0.01)) - -// or -// create a bloom filter with 650000 for 65536 items and 7 locs per hash explicitly -// bf = bbloom.New(float64(650000), float64(7)) -// or -bf = bbloom.New(650000.0, 7.0) - -// add one item -bf.Add([]byte("butter")) - -// Number of elements added is exposed now -// Note: ElemNum will not be included in JSON export (for compatability to older version) -nOfElementsInFilter := bf.ElemNum - -// check if item is in the filter -isIn := bf.Has([]byte("butter")) // should be true -isNotIn := bf.Has([]byte("Butter")) // should be false - -// 'add only if item is new' to the bloomfilter -added := bf.AddIfNotHas([]byte("butter")) // should be false because 'butter' is already in the set -added = bf.AddIfNotHas([]byte("buTTer")) // should be true because 'buTTer' is new - -// thread safe versions for concurrent use: AddTS, HasTS, AddIfNotHasTS -// add one item -bf.AddTS([]byte("peanutbutter")) -// check if item is in the filter -isIn = bf.HasTS([]byte("peanutbutter")) // should be true -isNotIn = bf.HasTS([]byte("peanutButter")) // should be false -// 'add only if item is new' to the bloomfilter -added = bf.AddIfNotHasTS([]byte("butter")) // should be false because 'peanutbutter' is already in the set -added = bf.AddIfNotHasTS([]byte("peanutbuTTer")) // should be true because 'penutbuTTer' is new - -// convert to JSON ([]byte) -Json := bf.JSONMarshal() - -// bloomfilters Mutex is exposed for external un-/locking -// i.e. mutex lock while doing JSON conversion -bf.Mtx.Lock() -Json = bf.JSONMarshal() -bf.Mtx.Unlock() - -// restore a bloom filter from storage -bfNew := bbloom.JSONUnmarshal(Json) - -isInNew := bfNew.Has([]byte("butter")) // should be true -isNotInNew := bfNew.Has([]byte("Butter")) // should be false - -``` - -to work with the bloom filter. - -### why 'fast'? - -It's about 3 times faster than William Fitzgeralds bitset bloom filter https://github.com/willf/bloom . And it is about so fast as my []bool set variant for Boom filters (see https://github.com/AndreasBriese/bloom ) but having a 8times smaller memory footprint: - - - Bloom filter (filter size 524288, 7 hashlocs) - github.com/AndreasBriese/bbloom 'Add' 65536 items (10 repetitions): 6595800 ns (100 ns/op) - github.com/AndreasBriese/bbloom 'Has' 65536 items (10 repetitions): 5986600 ns (91 ns/op) - github.com/AndreasBriese/bloom 'Add' 65536 items (10 repetitions): 6304684 ns (96 ns/op) - github.com/AndreasBriese/bloom 'Has' 65536 items (10 repetitions): 6568663 ns (100 ns/op) - - github.com/willf/bloom 'Add' 65536 items (10 repetitions): 24367224 ns (371 ns/op) - github.com/willf/bloom 'Test' 65536 items (10 repetitions): 21881142 ns (333 ns/op) - github.com/dataence/bloom/standard 'Add' 65536 items (10 repetitions): 23041644 ns (351 ns/op) - github.com/dataence/bloom/standard 'Check' 65536 items (10 repetitions): 19153133 ns (292 ns/op) - github.com/cabello/bloom 'Add' 65536 items (10 repetitions): 131921507 ns (2012 ns/op) - github.com/cabello/bloom 'Contains' 65536 items (10 repetitions): 131108962 ns (2000 ns/op) - -(on MBPro15 OSX10.8.5 i7 4Core 2.4Ghz) - - -With 32bit bloom filters (bloom32) using modified sdbm, bloom32 does hashing with only 2 bit shifts, one xor and one substraction per byte. smdb is about as fast as fnv64a but gives less collisions with the dataset (see mask above). bloom.New(float64(10 * 1<<16),float64(7)) populated with 1<<16 random items from the dataset (see above) and tested against the rest results in less than 0.05% collisions. diff --git a/vendor/github.com/dgraph-io/ristretto/z/allocator.go b/vendor/github.com/dgraph-io/ristretto/z/allocator.go deleted file mode 100644 index db00ff5eca..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/allocator.go +++ /dev/null @@ -1,403 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "bytes" - "fmt" - "math" - "math/bits" - "math/rand" - "strings" - "sync" - "sync/atomic" - "time" - "unsafe" - - "github.com/dustin/go-humanize" -) - -// Allocator amortizes the cost of small allocations by allocating memory in -// bigger chunks. Internally it uses z.Calloc to allocate memory. Once -// allocated, the memory is not moved, so it is safe to use the allocated bytes -// to unsafe cast them to Go struct pointers. Maintaining a freelist is slow. -// Instead, Allocator only allocates memory, with the idea that finally we -// would just release the entire Allocator. -type Allocator struct { - sync.Mutex - compIdx uint64 // Stores bufIdx in 32 MSBs and posIdx in 32 LSBs. - buffers [][]byte - Ref uint64 - Tag string -} - -// allocs keeps references to all Allocators, so we can safely discard them later. -var allocsMu *sync.Mutex -var allocRef uint64 -var allocs map[uint64]*Allocator -var calculatedLog2 []int - -func init() { - allocsMu = new(sync.Mutex) - allocs = make(map[uint64]*Allocator) - - // Set up a unique Ref per process. - rand.Seed(time.Now().UnixNano()) - allocRef = uint64(rand.Int63n(1<<16)) << 48 - - calculatedLog2 = make([]int, 1025) - for i := 1; i <= 1024; i++ { - calculatedLog2[i] = int(math.Log2(float64(i))) - } -} - -// NewAllocator creates an allocator starting with the given size. -func NewAllocator(sz int, tag string) *Allocator { - ref := atomic.AddUint64(&allocRef, 1) - // We should not allow a zero sized page because addBufferWithMinSize - // will run into an infinite loop trying to double the pagesize. - if sz < 512 { - sz = 512 - } - a := &Allocator{ - Ref: ref, - buffers: make([][]byte, 64), - Tag: tag, - } - l2 := uint64(log2(sz)) - if bits.OnesCount64(uint64(sz)) > 1 { - l2 += 1 - } - a.buffers[0] = Calloc(1<> 32), int(pos & 0xFFFFFFFF) -} - -// Size returns the size of the allocations so far. -func (a *Allocator) Size() int { - pos := atomic.LoadUint64(&a.compIdx) - bi, pi := parse(pos) - var sz int - for i, b := range a.buffers { - if i < bi { - sz += len(b) - continue - } - sz += pi - return sz - } - panic("Size should not reach here") -} - -func log2(sz int) int { - if sz < len(calculatedLog2) { - return calculatedLog2[sz] - } - pow := 10 - sz >>= 10 - for sz > 1 { - sz >>= 1 - pow++ - } - return pow -} - -func (a *Allocator) Allocated() uint64 { - var alloc int - for _, b := range a.buffers { - alloc += cap(b) - } - return uint64(alloc) -} - -func (a *Allocator) TrimTo(max int) { - var alloc int - for i, b := range a.buffers { - if len(b) == 0 { - break - } - alloc += len(b) - if alloc < max { - continue - } - Free(b) - a.buffers[i] = nil - } -} - -// Release would release the memory back. Remember to make this call to avoid memory leaks. -func (a *Allocator) Release() { - if a == nil { - return - } - - var alloc int - for _, b := range a.buffers { - if len(b) == 0 { - break - } - alloc += len(b) - Free(b) - } - - allocsMu.Lock() - delete(allocs, a.Ref) - allocsMu.Unlock() -} - -const maxAlloc = 1 << 30 - -func (a *Allocator) MaxAlloc() int { - return maxAlloc -} - -const nodeAlign = unsafe.Sizeof(uint64(0)) - 1 - -func (a *Allocator) AllocateAligned(sz int) []byte { - tsz := sz + int(nodeAlign) - out := a.Allocate(tsz) - // We are reusing allocators. In that case, it's important to zero out the memory allocated - // here. We don't always zero it out (in Allocate), because other functions would be immediately - // overwriting the allocated slices anyway (see Copy). - ZeroOut(out, 0, len(out)) - - addr := uintptr(unsafe.Pointer(&out[0])) - aligned := (addr + nodeAlign) & ^nodeAlign - start := int(aligned - addr) - - return out[start : start+sz] -} - -func (a *Allocator) Copy(buf []byte) []byte { - if a == nil { - return append([]byte{}, buf...) - } - out := a.Allocate(len(buf)) - copy(out, buf) - return out -} - -func (a *Allocator) addBufferAt(bufIdx, minSz int) { - for { - if bufIdx >= len(a.buffers) { - panic(fmt.Sprintf("Allocator can not allocate more than %d buffers", len(a.buffers))) - } - if len(a.buffers[bufIdx]) == 0 { - break - } - if minSz <= len(a.buffers[bufIdx]) { - // No need to do anything. We already have a buffer which can satisfy minSz. - return - } - bufIdx++ - } - assert(bufIdx > 0) - // We need to allocate a new buffer. - // Make pageSize double of the last allocation. - pageSize := 2 * len(a.buffers[bufIdx-1]) - // Ensure pageSize is bigger than sz. - for pageSize < minSz { - pageSize *= 2 - } - // If bigger than maxAlloc, trim to maxAlloc. - if pageSize > maxAlloc { - pageSize = maxAlloc - } - - buf := Calloc(pageSize, a.Tag) - assert(len(a.buffers[bufIdx]) == 0) - a.buffers[bufIdx] = buf -} - -func (a *Allocator) Allocate(sz int) []byte { - if a == nil { - return make([]byte, sz) - } - if sz > maxAlloc { - panic(fmt.Sprintf("Unable to allocate more than %d\n", maxAlloc)) - } - if sz == 0 { - return nil - } - for { - pos := atomic.AddUint64(&a.compIdx, uint64(sz)) - bufIdx, posIdx := parse(pos) - buf := a.buffers[bufIdx] - if posIdx > len(buf) { - a.Lock() - newPos := atomic.LoadUint64(&a.compIdx) - newBufIdx, _ := parse(newPos) - if newBufIdx != bufIdx { - a.Unlock() - continue - } - a.addBufferAt(bufIdx+1, sz) - atomic.StoreUint64(&a.compIdx, uint64((bufIdx+1)<<32)) - a.Unlock() - // We added a new buffer. Let's acquire slice the right way by going back to the top. - continue - } - data := buf[posIdx-sz : posIdx] - return data - } -} - -type AllocatorPool struct { - numGets int64 - allocCh chan *Allocator - closer *Closer -} - -func NewAllocatorPool(sz int) *AllocatorPool { - a := &AllocatorPool{ - allocCh: make(chan *Allocator, sz), - closer: NewCloser(1), - } - go a.freeupAllocators() - return a -} - -func (p *AllocatorPool) Get(sz int, tag string) *Allocator { - if p == nil { - return NewAllocator(sz, tag) - } - atomic.AddInt64(&p.numGets, 1) - select { - case alloc := <-p.allocCh: - alloc.Reset() - alloc.Tag = tag - return alloc - default: - return NewAllocator(sz, tag) - } -} -func (p *AllocatorPool) Return(a *Allocator) { - if a == nil { - return - } - if p == nil { - a.Release() - return - } - a.TrimTo(400 << 20) - - select { - case p.allocCh <- a: - return - default: - a.Release() - } -} - -func (p *AllocatorPool) Release() { - if p == nil { - return - } - p.closer.SignalAndWait() -} - -func (p *AllocatorPool) freeupAllocators() { - defer p.closer.Done() - - ticker := time.NewTicker(2 * time.Second) - defer ticker.Stop() - - releaseOne := func() bool { - select { - case alloc := <-p.allocCh: - alloc.Release() - return true - default: - return false - } - } - - var last int64 - for { - select { - case <-p.closer.HasBeenClosed(): - close(p.allocCh) - for alloc := range p.allocCh { - alloc.Release() - } - return - - case <-ticker.C: - gets := atomic.LoadInt64(&p.numGets) - if gets != last { - // Some retrievals were made since the last time. So, let's avoid doing a release. - last = gets - continue - } - releaseOne() - } - } -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/bbloom.go b/vendor/github.com/dgraph-io/ristretto/z/bbloom.go deleted file mode 100644 index 37135b012f..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/bbloom.go +++ /dev/null @@ -1,211 +0,0 @@ -// The MIT License (MIT) -// Copyright (c) 2014 Andreas Briese, eduToolbox@Bri-C GmbH, Sarstedt - -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -package z - -import ( - "bytes" - "encoding/json" - "math" - "unsafe" - - "github.com/golang/glog" -) - -// helper -var mask = []uint8{1, 2, 4, 8, 16, 32, 64, 128} - -func getSize(ui64 uint64) (size uint64, exponent uint64) { - if ui64 < uint64(512) { - ui64 = uint64(512) - } - size = uint64(1) - for size < ui64 { - size <<= 1 - exponent++ - } - return size, exponent -} - -func calcSizeByWrongPositives(numEntries, wrongs float64) (uint64, uint64) { - size := -1 * numEntries * math.Log(wrongs) / math.Pow(float64(0.69314718056), 2) - locs := math.Ceil(float64(0.69314718056) * size / numEntries) - return uint64(size), uint64(locs) -} - -// NewBloomFilter returns a new bloomfilter. -func NewBloomFilter(params ...float64) (bloomfilter *Bloom) { - var entries, locs uint64 - if len(params) == 2 { - if params[1] < 1 { - entries, locs = calcSizeByWrongPositives(params[0], params[1]) - } else { - entries, locs = uint64(params[0]), uint64(params[1]) - } - } else { - glog.Fatal("usage: New(float64(number_of_entries), float64(number_of_hashlocations))" + - " i.e. New(float64(1000), float64(3)) or New(float64(number_of_entries)," + - " float64(number_of_hashlocations)) i.e. New(float64(1000), float64(0.03))") - } - size, exponent := getSize(entries) - bloomfilter = &Bloom{ - sizeExp: exponent, - size: size - 1, - setLocs: locs, - shift: 64 - exponent, - } - bloomfilter.Size(size) - return bloomfilter -} - -// Bloom filter -type Bloom struct { - bitset []uint64 - ElemNum uint64 - sizeExp uint64 - size uint64 - setLocs uint64 - shift uint64 -} - -// <--- http://www.cse.yorku.ca/~oz/hash.html -// modified Berkeley DB Hash (32bit) -// hash is casted to l, h = 16bit fragments -// func (bl Bloom) absdbm(b *[]byte) (l, h uint64) { -// hash := uint64(len(*b)) -// for _, c := range *b { -// hash = uint64(c) + (hash << 6) + (hash << bl.sizeExp) - hash -// } -// h = hash >> bl.shift -// l = hash << bl.shift >> bl.shift -// return l, h -// } - -// Add adds hash of a key to the bloomfilter. -func (bl *Bloom) Add(hash uint64) { - h := hash >> bl.shift - l := hash << bl.shift >> bl.shift - for i := uint64(0); i < bl.setLocs; i++ { - bl.Set((h + i*l) & bl.size) - bl.ElemNum++ - } -} - -// Has checks if bit(s) for entry hash is/are set, -// returns true if the hash was added to the Bloom Filter. -func (bl Bloom) Has(hash uint64) bool { - h := hash >> bl.shift - l := hash << bl.shift >> bl.shift - for i := uint64(0); i < bl.setLocs; i++ { - if !bl.IsSet((h + i*l) & bl.size) { - return false - } - } - return true -} - -// AddIfNotHas only Adds hash, if it's not present in the bloomfilter. -// Returns true if hash was added. -// Returns false if hash was already registered in the bloomfilter. -func (bl *Bloom) AddIfNotHas(hash uint64) bool { - if bl.Has(hash) { - return false - } - bl.Add(hash) - return true -} - -// TotalSize returns the total size of the bloom filter. -func (bl *Bloom) TotalSize() int { - // The bl struct has 5 members and each one is 8 byte. The bitset is a - // uint64 byte slice. - return len(bl.bitset)*8 + 5*8 -} - -// Size makes Bloom filter with as bitset of size sz. -func (bl *Bloom) Size(sz uint64) { - bl.bitset = make([]uint64, sz>>6) -} - -// Clear resets the Bloom filter. -func (bl *Bloom) Clear() { - for i := range bl.bitset { - bl.bitset[i] = 0 - } -} - -// Set sets the bit[idx] of bitset. -func (bl *Bloom) Set(idx uint64) { - ptr := unsafe.Pointer(uintptr(unsafe.Pointer(&bl.bitset[idx>>6])) + uintptr((idx%64)>>3)) - *(*uint8)(ptr) |= mask[idx%8] -} - -// IsSet checks if bit[idx] of bitset is set, returns true/false. -func (bl *Bloom) IsSet(idx uint64) bool { - ptr := unsafe.Pointer(uintptr(unsafe.Pointer(&bl.bitset[idx>>6])) + uintptr((idx%64)>>3)) - r := ((*(*uint8)(ptr)) >> (idx % 8)) & 1 - return r == 1 -} - -// bloomJSONImExport -// Im/Export structure used by JSONMarshal / JSONUnmarshal -type bloomJSONImExport struct { - FilterSet []byte - SetLocs uint64 -} - -// NewWithBoolset takes a []byte slice and number of locs per entry, -// returns the bloomfilter with a bitset populated according to the input []byte. -func newWithBoolset(bs *[]byte, locs uint64) *Bloom { - bloomfilter := NewBloomFilter(float64(len(*bs)<<3), float64(locs)) - for i, b := range *bs { - *(*uint8)(unsafe.Pointer(uintptr(unsafe.Pointer(&bloomfilter.bitset[0])) + uintptr(i))) = b - } - return bloomfilter -} - -// JSONUnmarshal takes JSON-Object (type bloomJSONImExport) as []bytes -// returns bloom32 / bloom64 object. -func JSONUnmarshal(dbData []byte) (*Bloom, error) { - bloomImEx := bloomJSONImExport{} - if err := json.Unmarshal(dbData, &bloomImEx); err != nil { - return nil, err - } - buf := bytes.NewBuffer(bloomImEx.FilterSet) - bs := buf.Bytes() - bf := newWithBoolset(&bs, bloomImEx.SetLocs) - return bf, nil -} - -// JSONMarshal returns JSON-object (type bloomJSONImExport) as []byte. -func (bl Bloom) JSONMarshal() []byte { - bloomImEx := bloomJSONImExport{} - bloomImEx.SetLocs = bl.setLocs - bloomImEx.FilterSet = make([]byte, len(bl.bitset)<<3) - for i := range bloomImEx.FilterSet { - bloomImEx.FilterSet[i] = *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&bl.bitset[0])) + - uintptr(i))) - } - data, err := json.Marshal(bloomImEx) - if err != nil { - glog.Fatal("json.Marshal failed: ", err) - } - return data -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/btree.go b/vendor/github.com/dgraph-io/ristretto/z/btree.go deleted file mode 100644 index 12b735bb03..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/btree.go +++ /dev/null @@ -1,710 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "fmt" - "math" - "os" - "reflect" - "strings" - "unsafe" - - "github.com/dgraph-io/ristretto/z/simd" -) - -var ( - pageSize = os.Getpagesize() - maxKeys = (pageSize / 16) - 1 - oneThird = int(float64(maxKeys) / 3) -) - -const ( - absoluteMax = uint64(math.MaxUint64 - 1) - minSize = 1 << 20 -) - -// Tree represents the structure for custom mmaped B+ tree. -// It supports keys in range [1, math.MaxUint64-1] and values [1, math.Uint64]. -type Tree struct { - buffer *Buffer - data []byte - nextPage uint64 - freePage uint64 - stats TreeStats -} - -func (t *Tree) initRootNode() { - // This is the root node. - t.newNode(0) - // This acts as the rightmost pointer (all the keys are <= this key). - t.Set(absoluteMax, 0) -} - -// NewTree returns an in-memory B+ tree. -func NewTree(tag string) *Tree { - const defaultTag = "tree" - if tag == "" { - tag = defaultTag - } - t := &Tree{buffer: NewBuffer(minSize, tag)} - t.Reset() - return t -} - -// NewTree returns a persistent on-disk B+ tree. -func NewTreePersistent(path string) (*Tree, error) { - t := &Tree{} - var err error - - // Open the buffer from disk and set it to the maximum allocated size. - t.buffer, err = NewBufferPersistent(path, minSize) - if err != nil { - return nil, err - } - t.buffer.offset = uint64(len(t.buffer.buf)) - t.data = t.buffer.Bytes() - - // pageID can never be 0 if the tree has been initialized. - root := t.node(1) - isInitialized := root.pageID() != 0 - - if !isInitialized { - t.nextPage = 1 - t.freePage = 0 - t.initRootNode() - } else { - t.reinit() - } - - return t, nil -} - -// reinit sets the internal variables of a Tree, which are normally stored -// in-memory, but are lost when loading from disk. -func (t *Tree) reinit() { - // Calculate t.nextPage by finding the first node whose pageID is not set. - t.nextPage = 1 - for int(t.nextPage)*pageSize < len(t.data) { - n := t.node(t.nextPage) - if n.pageID() == 0 { - break - } - t.nextPage++ - } - maxPageId := t.nextPage - 1 - - // Calculate t.freePage by finding the page to which no other page points. - // This would be the head of the page linked list. - // tailPages[i] is true if pageId i+1 is not the head of the list. - tailPages := make([]bool, maxPageId) - // Mark all pages containing nodes as tail pages. - t.Iterate(func(n node) { - i := n.pageID() - 1 - tailPages[i] = true - // If this is a leaf node, increment the stats. - if n.isLeaf() { - t.stats.NumLeafKeys += n.numKeys() - } - }) - // pointedPages is a list of page IDs that the tail pages point to. - pointedPages := make([]uint64, 0) - for i, isTail := range tailPages { - if !isTail { - pageId := uint64(i) + 1 - // Skip if nextPageId = 0, as that is equivalent to null page. - if nextPageId := t.node(pageId).uint64(0); nextPageId != 0 { - pointedPages = append(pointedPages, nextPageId) - } - t.stats.NumPagesFree++ - } - } - - // Mark all pages being pointed to as tail pages. - for _, pageId := range pointedPages { - i := pageId - 1 - tailPages[i] = true - } - // There should only be one head page left. - for i, isTail := range tailPages { - if !isTail { - pageId := uint64(i) + 1 - t.freePage = pageId - break - } - } -} - -// Reset resets the tree and truncates it to maxSz. -func (t *Tree) Reset() { - // Tree relies on uninitialized data being zeroed out, so we need to Memclr - // the data before using it again. - Memclr(t.buffer.buf) - t.buffer.Reset() - t.buffer.AllocateOffset(minSize) - t.data = t.buffer.Bytes() - t.stats = TreeStats{} - t.nextPage = 1 - t.freePage = 0 - t.initRootNode() -} - -// Close releases the memory used by the tree. -func (t *Tree) Close() error { - if t == nil { - return nil - } - return t.buffer.Release() -} - -type TreeStats struct { - Allocated int // Derived. - Bytes int // Derived. - NumLeafKeys int // Calculated. - NumPages int // Derived. - NumPagesFree int // Calculated. - Occupancy float64 // Derived. - PageSize int // Derived. -} - -// Stats returns stats about the tree. -func (t *Tree) Stats() TreeStats { - numPages := int(t.nextPage - 1) - out := TreeStats{ - Bytes: numPages * pageSize, - Allocated: len(t.data), - NumLeafKeys: t.stats.NumLeafKeys, - NumPages: numPages, - NumPagesFree: t.stats.NumPagesFree, - PageSize: pageSize, - } - out.Occupancy = 100.0 * float64(out.NumLeafKeys) / float64(maxKeys*numPages) - return out -} - -// BytesToUint64Slice converts a byte slice to a uint64 slice. -func BytesToUint64Slice(b []byte) []uint64 { - if len(b) == 0 { - return nil - } - var u64s []uint64 - hdr := (*reflect.SliceHeader)(unsafe.Pointer(&u64s)) - hdr.Len = len(b) / 8 - hdr.Cap = hdr.Len - hdr.Data = uintptr(unsafe.Pointer(&b[0])) - return u64s -} - -func (t *Tree) newNode(bit uint64) node { - var pageId uint64 - if t.freePage > 0 { - pageId = t.freePage - t.stats.NumPagesFree-- - } else { - pageId = t.nextPage - t.nextPage++ - offset := int(pageId) * pageSize - reqSize := offset + pageSize - if reqSize > len(t.data) { - t.buffer.AllocateOffset(reqSize - len(t.data)) - t.data = t.buffer.Bytes() - } - } - n := t.node(pageId) - if t.freePage > 0 { - t.freePage = n.uint64(0) - } - zeroOut(n) - n.setBit(bit) - n.setAt(keyOffset(maxKeys), pageId) - return n -} - -func getNode(data []byte) node { - return node(BytesToUint64Slice(data)) -} - -func zeroOut(data []uint64) { - for i := 0; i < len(data); i++ { - data[i] = 0 - } -} - -func (t *Tree) node(pid uint64) node { - // page does not exist - if pid == 0 { - return nil - } - start := pageSize * int(pid) - return getNode(t.data[start : start+pageSize]) -} - -// Set sets the key-value pair in the tree. -func (t *Tree) Set(k, v uint64) { - if k == math.MaxUint64 || k == 0 { - panic("Error setting zero or MaxUint64") - } - root := t.set(1, k, v) - if root.isFull() { - right := t.split(1) - left := t.newNode(root.bits()) - // Re-read the root as the underlying buffer for tree might have changed during split. - root = t.node(1) - copy(left[:keyOffset(maxKeys)], root) - left.setNumKeys(root.numKeys()) - - // reset the root node. - zeroOut(root[:keyOffset(maxKeys)]) - root.setNumKeys(0) - - // set the pointers for left and right child in the root node. - root.set(left.maxKey(), left.pageID()) - root.set(right.maxKey(), right.pageID()) - } -} - -// For internal nodes, they contain . -// where all entries <= key are stored in the corresponding ptr. -func (t *Tree) set(pid, k, v uint64) node { - n := t.node(pid) - if n.isLeaf() { - t.stats.NumLeafKeys += n.set(k, v) - return n - } - - // This is an internal node. - idx := n.search(k) - if idx >= maxKeys { - panic("search returned index >= maxKeys") - } - // If no key at idx. - if n.key(idx) == 0 { - n.setAt(keyOffset(idx), k) - n.setNumKeys(n.numKeys() + 1) - } - child := t.node(n.val(idx)) - if child == nil { - child = t.newNode(bitLeaf) - n = t.node(pid) - n.setAt(valOffset(idx), child.pageID()) - } - child = t.set(child.pageID(), k, v) - // Re-read n as the underlying buffer for tree might have changed during set. - n = t.node(pid) - if child.isFull() { - // Just consider the left sibling for simplicity. - // if t.shareWithSibling(n, idx) { - // return n - // } - - nn := t.split(child.pageID()) - // Re-read n and child as the underlying buffer for tree might have changed during split. - n = t.node(pid) - child = t.node(n.uint64(valOffset(idx))) - // Set child pointers in the node n. - // Note that key for right node (nn) already exist in node n, but the - // pointer is updated. - n.set(child.maxKey(), child.pageID()) - n.set(nn.maxKey(), nn.pageID()) - } - return n -} - -// Get looks for key and returns the corresponding value. -// If key is not found, 0 is returned. -func (t *Tree) Get(k uint64) uint64 { - if k == math.MaxUint64 || k == 0 { - panic("Does not support getting MaxUint64/Zero") - } - root := t.node(1) - return t.get(root, k) -} - -func (t *Tree) get(n node, k uint64) uint64 { - if n.isLeaf() { - return n.get(k) - } - // This is internal node - idx := n.search(k) - if idx == n.numKeys() || n.key(idx) == 0 { - return 0 - } - child := t.node(n.uint64(valOffset(idx))) - assert(child != nil) - return t.get(child, k) -} - -// DeleteBelow deletes all keys with value under ts. -func (t *Tree) DeleteBelow(ts uint64) { - root := t.node(1) - t.stats.NumLeafKeys = 0 - t.compact(root, ts) - assert(root.numKeys() >= 1) -} - -func (t *Tree) compact(n node, ts uint64) int { - if n.isLeaf() { - numKeys := n.compact(ts) - t.stats.NumLeafKeys += n.numKeys() - return numKeys - } - // Not leaf. - N := n.numKeys() - for i := 0; i < N; i++ { - assert(n.key(i) > 0) - childID := n.uint64(valOffset(i)) - child := t.node(childID) - if rem := t.compact(child, ts); rem == 0 && i < N-1 { - // If no valid key is remaining we can drop this child. However, don't do that if this - // is the max key. - t.stats.NumLeafKeys -= child.numKeys() - child.setAt(0, t.freePage) - t.freePage = childID - n.setAt(valOffset(i), 0) - t.stats.NumPagesFree++ - } - } - // We use ts=1 here because we want to delete all the keys whose value is 0, which means they no - // longer have a valid page for that key. - return n.compact(1) -} - -func (t *Tree) iterate(n node, fn func(node)) { - fn(n) - if n.isLeaf() { - return - } - // Explore children. - for i := 0; i < maxKeys; i++ { - if n.key(i) == 0 { - return - } - childID := n.uint64(valOffset(i)) - assert(childID > 0) - - child := t.node(childID) - t.iterate(child, fn) - } -} - -// Iterate iterates over the tree and executes the fn on each node. -func (t *Tree) Iterate(fn func(node)) { - root := t.node(1) - t.iterate(root, fn) -} - -// IterateKV iterates through all keys and values in the tree. -// If newVal is non-zero, it will be set in the tree. -func (t *Tree) IterateKV(f func(key, val uint64) (newVal uint64)) { - t.Iterate(func(n node) { - // Only leaf nodes contain keys. - if !n.isLeaf() { - return - } - - for i := 0; i < n.numKeys(); i++ { - key := n.key(i) - val := n.val(i) - - // A zero value here means that this is a bogus entry. - if val == 0 { - continue - } - - newVal := f(key, val) - if newVal != 0 { - n.setAt(valOffset(i), newVal) - } - } - }) -} - -func (t *Tree) print(n node, parentID uint64) { - n.print(parentID) - if n.isLeaf() { - return - } - pid := n.pageID() - for i := 0; i < maxKeys; i++ { - if n.key(i) == 0 { - return - } - childID := n.uint64(valOffset(i)) - child := t.node(childID) - t.print(child, pid) - } -} - -// Print iterates over the tree and prints all valid KVs. -func (t *Tree) Print() { - root := t.node(1) - t.print(root, 0) -} - -// Splits the node into two. It moves right half of the keys from the original node to a newly -// created right node. It returns the right node. -func (t *Tree) split(pid uint64) node { - n := t.node(pid) - if !n.isFull() { - panic("This should be called only when n is full") - } - - // Create a new node nn, copy over half the keys from n, and set the parent to n's parent. - nn := t.newNode(n.bits()) - // Re-read n as the underlying buffer for tree might have changed during newNode. - n = t.node(pid) - rightHalf := n[keyOffset(maxKeys/2):keyOffset(maxKeys)] - copy(nn, rightHalf) - nn.setNumKeys(maxKeys - maxKeys/2) - - // Remove entries from node n. - zeroOut(rightHalf) - n.setNumKeys(maxKeys / 2) - return nn -} - -// shareWithSiblingXXX is unused for now. The idea is to move some keys to -// sibling when a node is full. But, I don't see any special benefits in our -// access pattern. It doesn't result in better occupancy ratios. -func (t *Tree) shareWithSiblingXXX(n node, idx int) bool { - if idx == 0 { - return false - } - left := t.node(n.val(idx - 1)) - ns := left.numKeys() - if ns >= maxKeys/2 { - // Sibling is already getting full. - return false - } - - right := t.node(n.val(idx)) - // Copy over keys from right child to left child. - copied := copy(left[keyOffset(ns):], right[:keyOffset(oneThird)]) - copied /= 2 // Considering that key-val constitute one key. - left.setNumKeys(ns + copied) - - // Update the max key in parent node n for the left sibling. - n.setAt(keyOffset(idx-1), left.maxKey()) - - // Now move keys to left for the right sibling. - until := copy(right, right[keyOffset(oneThird):keyOffset(maxKeys)]) - right.setNumKeys(until / 2) - zeroOut(right[until:keyOffset(maxKeys)]) - return true -} - -// Each node in the node is of size pageSize. Two kinds of nodes. Leaf nodes and internal nodes. -// Leaf nodes only contain the data. Internal nodes would contain the key and the offset to the -// child node. -// Internal node would have first entry as -// <0 offset to child>, <1000 offset>, <5000 offset>, and so on... -// Leaf nodes would just have: , , and so on... -// Last 16 bytes of the node are off limits. -// | pageID (8 bytes) | metaBits (1 byte) | 3 free bytes | numKeys (4 bytes) | -type node []uint64 - -func (n node) uint64(start int) uint64 { return n[start] } - -// func (n node) uint32(start int) uint32 { return *(*uint32)(unsafe.Pointer(&n[start])) } - -func keyOffset(i int) int { return 2 * i } -func valOffset(i int) int { return 2*i + 1 } -func (n node) numKeys() int { return int(n.uint64(valOffset(maxKeys)) & 0xFFFFFFFF) } -func (n node) pageID() uint64 { return n.uint64(keyOffset(maxKeys)) } -func (n node) key(i int) uint64 { return n.uint64(keyOffset(i)) } -func (n node) val(i int) uint64 { return n.uint64(valOffset(i)) } -func (n node) data(i int) []uint64 { return n[keyOffset(i):keyOffset(i+1)] } - -func (n node) setAt(start int, k uint64) { - n[start] = k -} - -func (n node) setNumKeys(num int) { - idx := valOffset(maxKeys) - val := n[idx] - val &= 0xFFFFFFFF00000000 - val |= uint64(num) - n[idx] = val -} - -func (n node) moveRight(lo int) { - hi := n.numKeys() - assert(hi != maxKeys) - // copy works despite of overlap in src and dst. - // See https://golang.org/pkg/builtin/#copy - copy(n[keyOffset(lo+1):keyOffset(hi+1)], n[keyOffset(lo):keyOffset(hi)]) -} - -const ( - bitLeaf = uint64(1 << 63) -) - -func (n node) setBit(b uint64) { - vo := valOffset(maxKeys) - val := n[vo] - val &= 0xFFFFFFFF - val |= b - n[vo] = val -} -func (n node) bits() uint64 { - return n.val(maxKeys) & 0xFF00000000000000 -} -func (n node) isLeaf() bool { - return n.bits()&bitLeaf > 0 -} - -// isFull checks that the node is already full. -func (n node) isFull() bool { - return n.numKeys() == maxKeys -} - -// Search returns the index of a smallest key >= k in a node. -func (n node) search(k uint64) int { - N := n.numKeys() - if N < 4 { - for i := 0; i < N; i++ { - if ki := n.key(i); ki >= k { - return i - } - } - return N - } - return int(simd.Search(n[:2*N], k)) - // lo, hi := 0, N - // // Reduce the search space using binary seach and then do linear search. - // for hi-lo > 32 { - // mid := (hi + lo) / 2 - // km := n.key(mid) - // if k == km { - // return mid - // } - // if k > km { - // // key is greater than the key at mid, so move right. - // lo = mid + 1 - // } else { - // // else move left. - // hi = mid - // } - // } - // for i := lo; i <= hi; i++ { - // if ki := n.key(i); ki >= k { - // return i - // } - // } - // return N -} -func (n node) maxKey() uint64 { - idx := n.numKeys() - // idx points to the first key which is zero. - if idx > 0 { - idx-- - } - return n.key(idx) -} - -// compacts the node i.e., remove all the kvs with value < lo. It returns the remaining number of -// keys. -func (n node) compact(lo uint64) int { - N := n.numKeys() - mk := n.maxKey() - var left, right int - for right = 0; right < N; right++ { - if n.val(right) < lo && n.key(right) < mk { - // Skip over this key. Don't copy it. - continue - } - // Valid data. Copy it from right to left. Advance left. - if left != right { - copy(n.data(left), n.data(right)) - } - left++ - } - // zero out rest of the kv pairs. - zeroOut(n[keyOffset(left):keyOffset(right)]) - n.setNumKeys(left) - - // If the only key we have is the max key, and its value is less than lo, then we can indicate - // to the caller by returning a zero that it's OK to drop the node. - if left == 1 && n.key(0) == mk && n.val(0) < lo { - return 0 - } - return left -} - -func (n node) get(k uint64) uint64 { - idx := n.search(k) - // key is not found - if idx == n.numKeys() { - return 0 - } - if ki := n.key(idx); ki == k { - return n.val(idx) - } - return 0 -} - -// set returns true if it added a new key. -func (n node) set(k, v uint64) (numAdded int) { - idx := n.search(k) - ki := n.key(idx) - if n.numKeys() == maxKeys { - // This happens during split of non-root node, when we are updating the child pointer of - // right node. Hence, the key should already exist. - assert(ki == k) - } - if ki > k { - // Found the first entry which is greater than k. So, we need to fit k - // just before it. For that, we should move the rest of the data in the - // node to the right to make space for k. - n.moveRight(idx) - } - // If the k does not exist already, increment the number of keys. - if ki != k { - n.setNumKeys(n.numKeys() + 1) - numAdded = 1 - } - if ki == 0 || ki >= k { - n.setAt(keyOffset(idx), k) - n.setAt(valOffset(idx), v) - return - } - panic("shouldn't reach here") -} - -func (n node) iterate(fn func(node, int)) { - for i := 0; i < maxKeys; i++ { - if k := n.key(i); k > 0 { - fn(n, i) - } else { - break - } - } -} - -func (n node) print(parentID uint64) { - var keys []string - n.iterate(func(n node, i int) { - keys = append(keys, fmt.Sprintf("%d", n.key(i))) - }) - if len(keys) > 8 { - copy(keys[4:], keys[len(keys)-4:]) - keys[3] = "..." - keys = keys[:8] - } - fmt.Printf("%d Child of: %d num keys: %d keys: %s\n", - n.pageID(), parentID, n.numKeys(), strings.Join(keys, " ")) -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/buffer.go b/vendor/github.com/dgraph-io/ristretto/z/buffer.go deleted file mode 100644 index 5a22de8c7f..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/buffer.go +++ /dev/null @@ -1,544 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "encoding/binary" - "fmt" - "io/ioutil" - "os" - "sort" - "sync/atomic" - - "github.com/golang/glog" - "github.com/pkg/errors" -) - -const ( - defaultCapacity = 64 - defaultTag = "buffer" -) - -// Buffer is equivalent of bytes.Buffer without the ability to read. It is NOT thread-safe. -// -// In UseCalloc mode, z.Calloc is used to allocate memory, which depending upon how the code is -// compiled could use jemalloc for allocations. -// -// In UseMmap mode, Buffer uses file mmap to allocate memory. This allows us to store big data -// structures without using physical memory. -// -// MaxSize can be set to limit the memory usage. -type Buffer struct { - padding uint64 // number of starting bytes used for padding - offset uint64 // used length of the buffer - buf []byte // backing slice for the buffer - bufType BufferType // type of the underlying buffer - curSz int // capacity of the buffer - maxSz int // causes a panic if the buffer grows beyond this size - mmapFile *MmapFile // optional mmap backing for the buffer - autoMmapAfter int // Calloc falls back to an mmaped tmpfile after crossing this size - autoMmapDir string // directory for autoMmap to create a tempfile in - persistent bool // when enabled, Release will not delete the underlying mmap file - tag string // used for jemalloc stats -} - -func NewBuffer(capacity int, tag string) *Buffer { - if capacity < defaultCapacity { - capacity = defaultCapacity - } - if tag == "" { - tag = defaultTag - } - return &Buffer{ - buf: Calloc(capacity, tag), - bufType: UseCalloc, - curSz: capacity, - offset: 8, - padding: 8, - tag: tag, - } -} - -// It is the caller's responsibility to set offset after this, because Buffer -// doesn't remember what it was. -func NewBufferPersistent(path string, capacity int) (*Buffer, error) { - file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0666) - if err != nil { - return nil, err - } - buffer, err := newBufferFile(file, capacity) - if err != nil { - return nil, err - } - buffer.persistent = true - return buffer, nil -} - -func NewBufferTmp(dir string, capacity int) (*Buffer, error) { - if dir == "" { - dir = tmpDir - } - file, err := ioutil.TempFile(dir, "buffer") - if err != nil { - return nil, err - } - return newBufferFile(file, capacity) -} - -func newBufferFile(file *os.File, capacity int) (*Buffer, error) { - if capacity < defaultCapacity { - capacity = defaultCapacity - } - mmapFile, err := OpenMmapFileUsing(file, capacity, true) - if err != nil && err != NewFile { - return nil, err - } - buf := &Buffer{ - buf: mmapFile.Data, - bufType: UseMmap, - curSz: len(mmapFile.Data), - mmapFile: mmapFile, - offset: 8, - padding: 8, - } - return buf, nil -} - -func NewBufferSlice(slice []byte) *Buffer { - return &Buffer{ - offset: uint64(len(slice)), - buf: slice, - bufType: UseInvalid, - } -} - -func (b *Buffer) WithAutoMmap(threshold int, path string) *Buffer { - if b.bufType != UseCalloc { - panic("can only autoMmap with UseCalloc") - } - b.autoMmapAfter = threshold - if path == "" { - b.autoMmapDir = tmpDir - } else { - b.autoMmapDir = path - } - return b -} - -func (b *Buffer) WithMaxSize(size int) *Buffer { - b.maxSz = size - return b -} - -func (b *Buffer) IsEmpty() bool { - return int(b.offset) == b.StartOffset() -} - -// LenWithPadding would return the number of bytes written to the buffer so far -// plus the padding at the start of the buffer. -func (b *Buffer) LenWithPadding() int { - return int(atomic.LoadUint64(&b.offset)) -} - -// LenNoPadding would return the number of bytes written to the buffer so far -// (without the padding). -func (b *Buffer) LenNoPadding() int { - return int(atomic.LoadUint64(&b.offset) - b.padding) -} - -// Bytes would return all the written bytes as a slice. -func (b *Buffer) Bytes() []byte { - off := atomic.LoadUint64(&b.offset) - return b.buf[b.padding:off] -} - -// Grow would grow the buffer to have at least n more bytes. In case the buffer is at capacity, it -// would reallocate twice the size of current capacity + n, to ensure n bytes can be written to the -// buffer without further allocation. In UseMmap mode, this might result in underlying file -// expansion. -func (b *Buffer) Grow(n int) { - if b.buf == nil { - panic("z.Buffer needs to be initialized before using") - } - if b.maxSz > 0 && int(b.offset)+n > b.maxSz { - err := fmt.Errorf( - "z.Buffer max size exceeded: %d offset: %d grow: %d", b.maxSz, b.offset, n) - panic(err) - } - if int(b.offset)+n < b.curSz { - return - } - - // Calculate new capacity. - growBy := b.curSz + n - // Don't allocate more than 1GB at a time. - if growBy > 1<<30 { - growBy = 1 << 30 - } - // Allocate at least n, even if it exceeds the 1GB limit above. - if n > growBy { - growBy = n - } - b.curSz += growBy - - switch b.bufType { - case UseCalloc: - // If autoMmap gets triggered, copy the slice over to an mmaped file. - if b.autoMmapAfter > 0 && b.curSz > b.autoMmapAfter { - b.bufType = UseMmap - file, err := ioutil.TempFile(b.autoMmapDir, "") - if err != nil { - panic(err) - } - mmapFile, err := OpenMmapFileUsing(file, b.curSz, true) - if err != nil && err != NewFile { - panic(err) - } - assert(int(b.offset) == copy(mmapFile.Data, b.buf[:b.offset])) - Free(b.buf) - b.mmapFile = mmapFile - b.buf = mmapFile.Data - break - } - - // Else, reallocate the slice. - newBuf := Calloc(b.curSz, b.tag) - assert(int(b.offset) == copy(newBuf, b.buf[:b.offset])) - Free(b.buf) - b.buf = newBuf - - case UseMmap: - // Truncate and remap the underlying file. - if err := b.mmapFile.Truncate(int64(b.curSz)); err != nil { - err = errors.Wrapf(err, - "while trying to truncate file: %s to size: %d", b.mmapFile.Fd.Name(), b.curSz) - panic(err) - } - b.buf = b.mmapFile.Data - - default: - panic("can only use Grow on UseCalloc and UseMmap buffers") - } -} - -// Allocate is a way to get a slice of size n back from the buffer. This slice can be directly -// written to. Warning: Allocate is not thread-safe. The byte slice returned MUST be used before -// further calls to Buffer. -func (b *Buffer) Allocate(n int) []byte { - b.Grow(n) - off := b.offset - b.offset += uint64(n) - return b.buf[off:int(b.offset)] -} - -// AllocateOffset works the same way as allocate, but instead of returning a byte slice, it returns -// the offset of the allocation. -func (b *Buffer) AllocateOffset(n int) int { - b.Grow(n) - b.offset += uint64(n) - return int(b.offset) - n -} - -func (b *Buffer) writeLen(sz int) { - buf := b.Allocate(4) - binary.BigEndian.PutUint32(buf, uint32(sz)) -} - -// SliceAllocate would encode the size provided into the buffer, followed by a call to Allocate, -// hence returning the slice of size sz. This can be used to allocate a lot of small buffers into -// this big buffer. -// Note that SliceAllocate should NOT be mixed with normal calls to Write. -func (b *Buffer) SliceAllocate(sz int) []byte { - b.Grow(4 + sz) - b.writeLen(sz) - return b.Allocate(sz) -} - -func (b *Buffer) StartOffset() int { - return int(b.padding) -} - -func (b *Buffer) WriteSlice(slice []byte) { - dst := b.SliceAllocate(len(slice)) - assert(len(slice) == copy(dst, slice)) -} - -func (b *Buffer) SliceIterate(f func(slice []byte) error) error { - if b.IsEmpty() { - return nil - } - slice, next := []byte{}, b.StartOffset() - for next >= 0 { - slice, next = b.Slice(next) - if len(slice) == 0 { - continue - } - if err := f(slice); err != nil { - return err - } - } - return nil -} - -const ( - UseCalloc BufferType = iota - UseMmap - UseInvalid -) - -type BufferType int - -func (t BufferType) String() string { - switch t { - case UseCalloc: - return "UseCalloc" - case UseMmap: - return "UseMmap" - default: - return "UseInvalid" - } -} - -type LessFunc func(a, b []byte) bool -type sortHelper struct { - offsets []int - b *Buffer - tmp *Buffer - less LessFunc - small []int -} - -func (s *sortHelper) sortSmall(start, end int) { - s.tmp.Reset() - s.small = s.small[:0] - next := start - for next >= 0 && next < end { - s.small = append(s.small, next) - _, next = s.b.Slice(next) - } - - // We are sorting the slices pointed to by s.small offsets, but only moving the offsets around. - sort.Slice(s.small, func(i, j int) bool { - left, _ := s.b.Slice(s.small[i]) - right, _ := s.b.Slice(s.small[j]) - return s.less(left, right) - }) - // Now we iterate over the s.small offsets and copy over the slices. The result is now in order. - for _, off := range s.small { - s.tmp.Write(rawSlice(s.b.buf[off:])) - } - assert(end-start == copy(s.b.buf[start:end], s.tmp.Bytes())) -} - -func assert(b bool) { - if !b { - glog.Fatalf("%+v", errors.Errorf("Assertion failure")) - } -} -func check(err error) { - if err != nil { - glog.Fatalf("%+v", err) - } -} -func check2(_ interface{}, err error) { - check(err) -} - -func (s *sortHelper) merge(left, right []byte, start, end int) { - if len(left) == 0 || len(right) == 0 { - return - } - s.tmp.Reset() - check2(s.tmp.Write(left)) - left = s.tmp.Bytes() - - var ls, rs []byte - - copyLeft := func() { - assert(len(ls) == copy(s.b.buf[start:], ls)) - left = left[len(ls):] - start += len(ls) - } - copyRight := func() { - assert(len(rs) == copy(s.b.buf[start:], rs)) - right = right[len(rs):] - start += len(rs) - } - - for start < end { - if len(left) == 0 { - assert(len(right) == copy(s.b.buf[start:end], right)) - return - } - if len(right) == 0 { - assert(len(left) == copy(s.b.buf[start:end], left)) - return - } - ls = rawSlice(left) - rs = rawSlice(right) - - // We skip the first 4 bytes in the rawSlice, because that stores the length. - if s.less(ls[4:], rs[4:]) { - copyLeft() - } else { - copyRight() - } - } -} - -func (s *sortHelper) sort(lo, hi int) []byte { - assert(lo <= hi) - - mid := lo + (hi-lo)/2 - loff, hoff := s.offsets[lo], s.offsets[hi] - if lo == mid { - // No need to sort, just return the buffer. - return s.b.buf[loff:hoff] - } - - // lo, mid would sort from [offset[lo], offset[mid]) . - left := s.sort(lo, mid) - // Typically we'd use mid+1, but here mid represents an offset in the buffer. Each offset - // contains a thousand entries. So, if we do mid+1, we'd skip over those entries. - right := s.sort(mid, hi) - - s.merge(left, right, loff, hoff) - return s.b.buf[loff:hoff] -} - -// SortSlice is like SortSliceBetween but sorting over the entire buffer. -func (b *Buffer) SortSlice(less func(left, right []byte) bool) { - b.SortSliceBetween(b.StartOffset(), int(b.offset), less) -} -func (b *Buffer) SortSliceBetween(start, end int, less LessFunc) { - if start >= end { - return - } - if start == 0 { - panic("start can never be zero") - } - - var offsets []int - next, count := start, 0 - for next >= 0 && next < end { - if count%1024 == 0 { - offsets = append(offsets, next) - } - _, next = b.Slice(next) - count++ - } - assert(len(offsets) > 0) - if offsets[len(offsets)-1] != end { - offsets = append(offsets, end) - } - - szTmp := int(float64((end-start)/2) * 1.1) - s := &sortHelper{ - offsets: offsets, - b: b, - less: less, - small: make([]int, 0, 1024), - tmp: NewBuffer(szTmp, b.tag), - } - defer s.tmp.Release() - - left := offsets[0] - for _, off := range offsets[1:] { - s.sortSmall(left, off) - left = off - } - s.sort(0, len(offsets)-1) -} - -func rawSlice(buf []byte) []byte { - sz := binary.BigEndian.Uint32(buf) - return buf[:4+int(sz)] -} - -// Slice would return the slice written at offset. -func (b *Buffer) Slice(offset int) ([]byte, int) { - if offset >= int(b.offset) { - return nil, -1 - } - - sz := binary.BigEndian.Uint32(b.buf[offset:]) - start := offset + 4 - next := start + int(sz) - res := b.buf[start:next] - if next >= int(b.offset) { - next = -1 - } - return res, next -} - -// SliceOffsets is an expensive function. Use sparingly. -func (b *Buffer) SliceOffsets() []int { - next := b.StartOffset() - var offsets []int - for next >= 0 { - offsets = append(offsets, next) - _, next = b.Slice(next) - } - return offsets -} - -func (b *Buffer) Data(offset int) []byte { - if offset > b.curSz { - panic("offset beyond current size") - } - return b.buf[offset:b.curSz] -} - -// Write would write p bytes to the buffer. -func (b *Buffer) Write(p []byte) (n int, err error) { - n = len(p) - b.Grow(n) - assert(n == copy(b.buf[b.offset:], p)) - b.offset += uint64(n) - return n, nil -} - -// Reset would reset the buffer to be reused. -func (b *Buffer) Reset() { - b.offset = uint64(b.StartOffset()) -} - -// Release would free up the memory allocated by the buffer. Once the usage of buffer is done, it is -// important to call Release, otherwise a memory leak can happen. -func (b *Buffer) Release() error { - if b == nil { - return nil - } - switch b.bufType { - case UseCalloc: - Free(b.buf) - case UseMmap: - if b.mmapFile == nil { - return nil - } - path := b.mmapFile.Fd.Name() - if err := b.mmapFile.Close(-1); err != nil { - return errors.Wrapf(err, "while closing file: %s", path) - } - if !b.persistent { - if err := os.Remove(path); err != nil { - return errors.Wrapf(err, "while deleting file %s", path) - } - } - } - return nil -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/calloc.go b/vendor/github.com/dgraph-io/ristretto/z/calloc.go deleted file mode 100644 index 2e5d613813..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/calloc.go +++ /dev/null @@ -1,42 +0,0 @@ -package z - -import "sync/atomic" - -var numBytes int64 - -// NumAllocBytes returns the number of bytes allocated using calls to z.Calloc. The allocations -// could be happening via either Go or jemalloc, depending upon the build flags. -func NumAllocBytes() int64 { - return atomic.LoadInt64(&numBytes) -} - -// MemStats is used to fetch JE Malloc Stats. The stats are fetched from -// the mallctl namespace http://jemalloc.net/jemalloc.3.html#mallctl_namespace. -type MemStats struct { - // Total number of bytes allocated by the application. - // http://jemalloc.net/jemalloc.3.html#stats.allocated - Allocated uint64 - // Total number of bytes in active pages allocated by the application. This - // is a multiple of the page size, and greater than or equal to - // Allocated. - // http://jemalloc.net/jemalloc.3.html#stats.active - Active uint64 - // Maximum number of bytes in physically resident data pages mapped by the - // allocator, comprising all pages dedicated to allocator metadata, pages - // backing active allocations, and unused dirty pages. This is a maximum - // rather than precise because pages may not actually be physically - // resident if they correspond to demand-zeroed virtual memory that has not - // yet been touched. This is a multiple of the page size, and is larger - // than stats.active. - // http://jemalloc.net/jemalloc.3.html#stats.resident - Resident uint64 - // Total number of bytes in virtual memory mappings that were retained - // rather than being returned to the operating system via e.g. munmap(2) or - // similar. Retained virtual memory is typically untouched, decommitted, or - // purged, so it has no strongly associated physical memory (see extent - // hooks http://jemalloc.net/jemalloc.3.html#arena.i.extent_hooks for - // details). Retained memory is excluded from mapped memory statistics, - // e.g. stats.mapped (http://jemalloc.net/jemalloc.3.html#stats.mapped). - // http://jemalloc.net/jemalloc.3.html#stats.retained - Retained uint64 -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/calloc_32bit.go b/vendor/github.com/dgraph-io/ristretto/z/calloc_32bit.go deleted file mode 100644 index 3a0442614f..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/calloc_32bit.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2020 The LevelDB-Go and Pebble Authors. All rights reserved. Use -// of this source code is governed by a BSD-style license that can be found in -// the LICENSE file. - -// +build 386 amd64p32 arm armbe mips mipsle mips64p32 mips64p32le ppc sparc - -package z - -const ( - // MaxArrayLen is a safe maximum length for slices on this architecture. - MaxArrayLen = 1<<31 - 1 - // MaxBufferSize is the size of virtually unlimited buffer on this architecture. - MaxBufferSize = 1 << 30 -) diff --git a/vendor/github.com/dgraph-io/ristretto/z/calloc_64bit.go b/vendor/github.com/dgraph-io/ristretto/z/calloc_64bit.go deleted file mode 100644 index b898248bba..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/calloc_64bit.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2020 The LevelDB-Go and Pebble Authors. All rights reserved. Use -// of this source code is governed by a BSD-style license that can be found in -// the LICENSE file. - -// +build amd64 arm64 arm64be ppc64 ppc64le mips64 mips64le riscv64 s390x sparc64 - -package z - -const ( - // MaxArrayLen is a safe maximum length for slices on this architecture. - MaxArrayLen = 1<<50 - 1 - // MaxBufferSize is the size of virtually unlimited buffer on this architecture. - MaxBufferSize = 256 << 30 -) diff --git a/vendor/github.com/dgraph-io/ristretto/z/calloc_jemalloc.go b/vendor/github.com/dgraph-io/ristretto/z/calloc_jemalloc.go deleted file mode 100644 index 904d73ac57..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/calloc_jemalloc.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2020 The LevelDB-Go and Pebble Authors. All rights reserved. Use -// of this source code is governed by a BSD-style license that can be found in -// the LICENSE file. - -// +build jemalloc - -package z - -/* -#cgo LDFLAGS: /usr/local/lib/libjemalloc.a -L/usr/local/lib -Wl,-rpath,/usr/local/lib -ljemalloc -lm -lstdc++ -pthread -ldl -#include -#include -*/ -import "C" -import ( - "bytes" - "fmt" - "sync" - "sync/atomic" - "unsafe" - - "github.com/dustin/go-humanize" -) - -// The go:linkname directives provides backdoor access to private functions in -// the runtime. Below we're accessing the throw function. - -//go:linkname throw runtime.throw -func throw(s string) - -// New allocates a slice of size n. The returned slice is from manually managed -// memory and MUST be released by calling Free. Failure to do so will result in -// a memory leak. -// -// Compile jemalloc with ./configure --with-jemalloc-prefix="je_" -// https://android.googlesource.com/platform/external/jemalloc_new/+/6840b22e8e11cb68b493297a5cd757d6eaa0b406/TUNING.md -// These two config options seems useful for frequent allocations and deallocations in -// multi-threaded programs (like we have). -// JE_MALLOC_CONF="background_thread:true,metadata_thp:auto" -// -// Compile Go program with `go build -tags=jemalloc` to enable this. - -type dalloc struct { - t string - sz int -} - -var dallocsMu sync.Mutex -var dallocs map[unsafe.Pointer]*dalloc - -func init() { - // By initializing dallocs, we can start tracking allocations and deallocations via z.Calloc. - dallocs = make(map[unsafe.Pointer]*dalloc) -} - -func Calloc(n int, tag string) []byte { - if n == 0 { - return make([]byte, 0) - } - // We need to be conscious of the Cgo pointer passing rules: - // - // https://golang.org/cmd/cgo/#hdr-Passing_pointers - // - // ... - // Note: the current implementation has a bug. While Go code is permitted - // to write nil or a C pointer (but not a Go pointer) to C memory, the - // current implementation may sometimes cause a runtime error if the - // contents of the C memory appear to be a Go pointer. Therefore, avoid - // passing uninitialized C memory to Go code if the Go code is going to - // store pointer values in it. Zero out the memory in C before passing it - // to Go. - - ptr := C.je_calloc(C.size_t(n), 1) - if ptr == nil { - // NB: throw is like panic, except it guarantees the process will be - // terminated. The call below is exactly what the Go runtime invokes when - // it cannot allocate memory. - throw("out of memory") - } - - uptr := unsafe.Pointer(ptr) - dallocsMu.Lock() - dallocs[uptr] = &dalloc{ - t: tag, - sz: n, - } - dallocsMu.Unlock() - atomic.AddInt64(&numBytes, int64(n)) - // Interpret the C pointer as a pointer to a Go array, then slice. - return (*[MaxArrayLen]byte)(uptr)[:n:n] -} - -// CallocNoRef does the exact same thing as Calloc with jemalloc enabled. -func CallocNoRef(n int, tag string) []byte { - return Calloc(n, tag) -} - -// Free frees the specified slice. -func Free(b []byte) { - if sz := cap(b); sz != 0 { - b = b[:cap(b)] - ptr := unsafe.Pointer(&b[0]) - C.je_free(ptr) - atomic.AddInt64(&numBytes, -int64(sz)) - dallocsMu.Lock() - delete(dallocs, ptr) - dallocsMu.Unlock() - } -} - -func Leaks() string { - if dallocs == nil { - return "Leak detection disabled. Enable with 'leak' build flag." - } - dallocsMu.Lock() - defer dallocsMu.Unlock() - if len(dallocs) == 0 { - return "NO leaks found." - } - m := make(map[string]int) - for _, da := range dallocs { - m[da.t] += da.sz - } - var buf bytes.Buffer - fmt.Fprintf(&buf, "Allocations:\n") - for f, sz := range m { - fmt.Fprintf(&buf, "%s at file: %s\n", humanize.IBytes(uint64(sz)), f) - } - return buf.String() -} - -// ReadMemStats populates stats with JE Malloc statistics. -func ReadMemStats(stats *MemStats) { - if stats == nil { - return - } - // Call an epoch mallclt to refresh the stats data as mentioned in the docs. - // http://jemalloc.net/jemalloc.3.html#epoch - // Note: This epoch mallctl is as expensive as a malloc call. It takes up the - // malloc_mutex_lock. - epoch := 1 - sz := unsafe.Sizeof(&epoch) - C.je_mallctl( - (C.CString)("epoch"), - unsafe.Pointer(&epoch), - (*C.size_t)(unsafe.Pointer(&sz)), - unsafe.Pointer(&epoch), - (C.size_t)(unsafe.Sizeof(epoch))) - stats.Allocated = fetchStat("stats.allocated") - stats.Active = fetchStat("stats.active") - stats.Resident = fetchStat("stats.resident") - stats.Retained = fetchStat("stats.retained") -} - -// fetchStat is used to read a specific attribute from je malloc stats using mallctl. -func fetchStat(s string) uint64 { - var out uint64 - sz := unsafe.Sizeof(&out) - C.je_mallctl( - (C.CString)(s), // Query: eg: stats.allocated, stats.resident, etc. - unsafe.Pointer(&out), // Variable to store the output. - (*C.size_t)(unsafe.Pointer(&sz)), // Size of the output variable. - nil, // Input variable used to set a value. - 0) // Size of the input variable. - return out -} - -func StatsPrint() { - opts := C.CString("mdablxe") - C.je_malloc_stats_print(nil, nil, opts) - C.free(unsafe.Pointer(opts)) -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/calloc_nojemalloc.go b/vendor/github.com/dgraph-io/ristretto/z/calloc_nojemalloc.go deleted file mode 100644 index 93ceedf906..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/calloc_nojemalloc.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2020 The LevelDB-Go and Pebble Authors. All rights reserved. Use -// of this source code is governed by a BSD-style license that can be found in -// the LICENSE file. - -// +build !jemalloc !cgo - -package z - -import ( - "fmt" -) - -// Provides versions of Calloc, CallocNoRef, etc when jemalloc is not available -// (eg: build without jemalloc tag). - -// Calloc allocates a slice of size n. -func Calloc(n int, tag string) []byte { - return make([]byte, n) -} - -// CallocNoRef will not give you memory back without jemalloc. -func CallocNoRef(n int, tag string) []byte { - // We do the add here just to stay compatible with a corresponding Free call. - return nil -} - -// Free does not do anything in this mode. -func Free(b []byte) {} - -func Leaks() string { return "Leaks: Using Go memory" } -func StatsPrint() { - fmt.Println("Using Go memory") -} - -// ReadMemStats doesn't do anything since all the memory is being managed -// by the Go runtime. -func ReadMemStats(_ *MemStats) { return } diff --git a/vendor/github.com/dgraph-io/ristretto/z/file.go b/vendor/github.com/dgraph-io/ristretto/z/file.go deleted file mode 100644 index 880caf0ad9..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/file.go +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "encoding/binary" - "fmt" - "io" - "os" - "path/filepath" - - "github.com/pkg/errors" -) - -// MmapFile represents an mmapd file and includes both the buffer to the data -// and the file descriptor. -type MmapFile struct { - Data []byte - Fd *os.File -} - -var NewFile = errors.New("Create a new file") - -func OpenMmapFileUsing(fd *os.File, sz int, writable bool) (*MmapFile, error) { - filename := fd.Name() - fi, err := fd.Stat() - if err != nil { - return nil, errors.Wrapf(err, "cannot stat file: %s", filename) - } - - var rerr error - fileSize := fi.Size() - if sz > 0 && fileSize == 0 { - // If file is empty, truncate it to sz. - if err := fd.Truncate(int64(sz)); err != nil { - return nil, errors.Wrapf(err, "error while truncation") - } - fileSize = int64(sz) - rerr = NewFile - } - - // fmt.Printf("Mmaping file: %s with writable: %v filesize: %d\n", fd.Name(), writable, fileSize) - buf, err := Mmap(fd, writable, fileSize) // Mmap up to file size. - if err != nil { - return nil, errors.Wrapf(err, "while mmapping %s with size: %d", fd.Name(), fileSize) - } - - if fileSize == 0 { - dir, _ := filepath.Split(filename) - go SyncDir(dir) - } - return &MmapFile{ - Data: buf, - Fd: fd, - }, rerr -} - -// OpenMmapFile opens an existing file or creates a new file. If the file is -// created, it would truncate the file to maxSz. In both cases, it would mmap -// the file to maxSz and returned it. In case the file is created, z.NewFile is -// returned. -func OpenMmapFile(filename string, flag int, maxSz int) (*MmapFile, error) { - // fmt.Printf("opening file %s with flag: %v\n", filename, flag) - fd, err := os.OpenFile(filename, flag, 0666) - if err != nil { - return nil, errors.Wrapf(err, "unable to open: %s", filename) - } - writable := true - if flag == os.O_RDONLY { - writable = false - } - return OpenMmapFileUsing(fd, maxSz, writable) -} - -type mmapReader struct { - Data []byte - offset int -} - -func (mr *mmapReader) Read(buf []byte) (int, error) { - if mr.offset > len(mr.Data) { - return 0, io.EOF - } - n := copy(buf, mr.Data[mr.offset:]) - mr.offset += n - if n < len(buf) { - return n, io.EOF - } - return n, nil -} - -func (m *MmapFile) NewReader(offset int) io.Reader { - return &mmapReader{ - Data: m.Data, - offset: offset, - } -} - -// Bytes returns data starting from offset off of size sz. If there's not enough data, it would -// return nil slice and io.EOF. -func (m *MmapFile) Bytes(off, sz int) ([]byte, error) { - if len(m.Data[off:]) < sz { - return nil, io.EOF - } - return m.Data[off : off+sz], nil -} - -// Slice returns the slice at the given offset. -func (m *MmapFile) Slice(offset int) []byte { - sz := binary.BigEndian.Uint32(m.Data[offset:]) - start := offset + 4 - next := start + int(sz) - if next > len(m.Data) { - return []byte{} - } - res := m.Data[start:next] - return res -} - -// AllocateSlice allocates a slice of the given size at the given offset. -func (m *MmapFile) AllocateSlice(sz, offset int) ([]byte, int, error) { - start := offset + 4 - - // If the file is too small, double its size or increase it by 1GB, whichever is smaller. - if start+sz > len(m.Data) { - const oneGB = 1 << 30 - growBy := len(m.Data) - if growBy > oneGB { - growBy = oneGB - } - if growBy < sz+4 { - growBy = sz + 4 - } - if err := m.Truncate(int64(len(m.Data) + growBy)); err != nil { - return nil, 0, err - } - } - - binary.BigEndian.PutUint32(m.Data[offset:], uint32(sz)) - return m.Data[start : start+sz], start + sz, nil -} - -func (m *MmapFile) Sync() error { - if m == nil { - return nil - } - return Msync(m.Data) -} - -func (m *MmapFile) Delete() error { - // Badger can set the m.Data directly, without setting any Fd. In that case, this should be a - // NOOP. - if m.Fd == nil { - return nil - } - - if err := Munmap(m.Data); err != nil { - return fmt.Errorf("while munmap file: %s, error: %v\n", m.Fd.Name(), err) - } - m.Data = nil - if err := m.Fd.Truncate(0); err != nil { - return fmt.Errorf("while truncate file: %s, error: %v\n", m.Fd.Name(), err) - } - if err := m.Fd.Close(); err != nil { - return fmt.Errorf("while close file: %s, error: %v\n", m.Fd.Name(), err) - } - return os.Remove(m.Fd.Name()) -} - -// Close would close the file. It would also truncate the file if maxSz >= 0. -func (m *MmapFile) Close(maxSz int64) error { - // Badger can set the m.Data directly, without setting any Fd. In that case, this should be a - // NOOP. - if m.Fd == nil { - return nil - } - if err := m.Sync(); err != nil { - return fmt.Errorf("while sync file: %s, error: %v\n", m.Fd.Name(), err) - } - if err := Munmap(m.Data); err != nil { - return fmt.Errorf("while munmap file: %s, error: %v\n", m.Fd.Name(), err) - } - if maxSz >= 0 { - if err := m.Fd.Truncate(maxSz); err != nil { - return fmt.Errorf("while truncate file: %s, error: %v\n", m.Fd.Name(), err) - } - } - return m.Fd.Close() -} - -func SyncDir(dir string) error { - df, err := os.Open(dir) - if err != nil { - return errors.Wrapf(err, "while opening %s", dir) - } - if err := df.Sync(); err != nil { - return errors.Wrapf(err, "while syncing %s", dir) - } - if err := df.Close(); err != nil { - return errors.Wrapf(err, "while closing %s", dir) - } - return nil -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/file_default.go b/vendor/github.com/dgraph-io/ristretto/z/file_default.go deleted file mode 100644 index d9c0db43e7..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/file_default.go +++ /dev/null @@ -1,39 +0,0 @@ -// +build !linux - -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import "fmt" - -// Truncate would truncate the mmapped file to the given size. On Linux, we truncate -// the underlying file and then call mremap, but on other systems, we unmap first, -// then truncate, then re-map. -func (m *MmapFile) Truncate(maxSz int64) error { - if err := m.Sync(); err != nil { - return fmt.Errorf("while sync file: %s, error: %v\n", m.Fd.Name(), err) - } - if err := Munmap(m.Data); err != nil { - return fmt.Errorf("while munmap file: %s, error: %v\n", m.Fd.Name(), err) - } - if err := m.Fd.Truncate(maxSz); err != nil { - return fmt.Errorf("while truncate file: %s, error: %v\n", m.Fd.Name(), err) - } - var err error - m.Data, err = Mmap(m.Fd, true, maxSz) // Mmap up to max size. - return err -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/file_linux.go b/vendor/github.com/dgraph-io/ristretto/z/file_linux.go deleted file mode 100644 index 7f670bd2cc..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/file_linux.go +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "fmt" -) - -// Truncate would truncate the mmapped file to the given size. On Linux, we truncate -// the underlying file and then call mremap, but on other systems, we unmap first, -// then truncate, then re-map. -func (m *MmapFile) Truncate(maxSz int64) error { - if err := m.Sync(); err != nil { - return fmt.Errorf("while sync file: %s, error: %v\n", m.Fd.Name(), err) - } - if err := m.Fd.Truncate(maxSz); err != nil { - return fmt.Errorf("while truncate file: %s, error: %v\n", m.Fd.Name(), err) - } - - var err error - m.Data, err = mremap(m.Data, int(maxSz)) // Mmap up to max size. - return err -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/flags.go b/vendor/github.com/dgraph-io/ristretto/z/flags.go deleted file mode 100644 index a55c474ab2..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/flags.go +++ /dev/null @@ -1,311 +0,0 @@ -package z - -import ( - "fmt" - "os" - "os/user" - "path/filepath" - "sort" - "strconv" - "strings" - "time" - - "github.com/golang/glog" - "github.com/pkg/errors" -) - -// SuperFlagHelp makes it really easy to generate command line `--help` output for a SuperFlag. For -// example: -// -// const flagDefaults = `enabled=true; path=some/path;` -// -// var help string = z.NewSuperFlagHelp(flagDefaults). -// Flag("enabled", "Turns on ."). -// Flag("path", "The path to ."). -// Flag("another", "Not present in defaults, but still included."). -// String() -// -// The `help` string would then contain: -// -// enabled=true; Turns on . -// path=some/path; The path to . -// another=; Not present in defaults, but still included. -// -// All flags are sorted alphabetically for consistent `--help` output. Flags with default values are -// placed at the top, and everything else goes under. -type SuperFlagHelp struct { - head string - defaults *SuperFlag - flags map[string]string -} - -func NewSuperFlagHelp(defaults string) *SuperFlagHelp { - return &SuperFlagHelp{ - defaults: NewSuperFlag(defaults), - flags: make(map[string]string, 0), - } -} - -func (h *SuperFlagHelp) Head(head string) *SuperFlagHelp { - h.head = head - return h -} - -func (h *SuperFlagHelp) Flag(name, description string) *SuperFlagHelp { - h.flags[name] = description - return h -} - -func (h *SuperFlagHelp) String() string { - defaultLines := make([]string, 0) - otherLines := make([]string, 0) - for name, help := range h.flags { - val, found := h.defaults.m[name] - line := fmt.Sprintf(" %s=%s; %s\n", name, val, help) - if found { - defaultLines = append(defaultLines, line) - } else { - otherLines = append(otherLines, line) - } - } - sort.Strings(defaultLines) - sort.Strings(otherLines) - dls := strings.Join(defaultLines, "") - ols := strings.Join(otherLines, "") - if len(h.defaults.m) == 0 && len(ols) == 0 { - // remove last newline - dls = dls[:len(dls)-1] - } - // remove last newline - if len(h.defaults.m) == 0 && len(ols) > 1 { - ols = ols[:len(ols)-1] - } - return h.head + "\n" + dls + ols -} - -func parseFlag(flag string) (map[string]string, error) { - kvm := make(map[string]string) - for _, kv := range strings.Split(flag, ";") { - if strings.TrimSpace(kv) == "" { - continue - } - // For a non-empty separator, 0 < len(splits) ≤ 2. - splits := strings.SplitN(kv, "=", 2) - k := strings.TrimSpace(splits[0]) - if len(splits) < 2 { - return nil, fmt.Errorf("superflag: missing value for '%s' in flag: %s", k, flag) - } - k = strings.ToLower(k) - k = strings.ReplaceAll(k, "_", "-") - kvm[k] = strings.TrimSpace(splits[1]) - } - return kvm, nil -} - -type SuperFlag struct { - m map[string]string -} - -func NewSuperFlag(flag string) *SuperFlag { - sf, err := newSuperFlagImpl(flag) - if err != nil { - glog.Fatal(err) - } - return sf -} - -func newSuperFlagImpl(flag string) (*SuperFlag, error) { - m, err := parseFlag(flag) - if err != nil { - return nil, err - } - return &SuperFlag{m}, nil -} - -func (sf *SuperFlag) String() string { - if sf == nil { - return "" - } - kvs := make([]string, 0, len(sf.m)) - for k, v := range sf.m { - kvs = append(kvs, fmt.Sprintf("%s=%s", k, v)) - } - return strings.Join(kvs, "; ") -} - -func (sf *SuperFlag) MergeAndCheckDefault(flag string) *SuperFlag { - sf, err := sf.mergeAndCheckDefaultImpl(flag) - if err != nil { - glog.Fatal(err) - } - return sf -} - -func (sf *SuperFlag) mergeAndCheckDefaultImpl(flag string) (*SuperFlag, error) { - if sf == nil { - m, err := parseFlag(flag) - if err != nil { - return nil, err - } - return &SuperFlag{m}, nil - } - - src, err := parseFlag(flag) - if err != nil { - return nil, err - } - - numKeys := len(sf.m) - for k := range src { - if _, ok := sf.m[k]; ok { - numKeys-- - } - } - if numKeys != 0 { - return nil, fmt.Errorf("superflag: found invalid options in flag: %s.\nvalid options: %v", sf, flag) - } - for k, v := range src { - if _, ok := sf.m[k]; !ok { - sf.m[k] = v - } - } - return sf, nil -} - -func (sf *SuperFlag) Has(opt string) bool { - val := sf.GetString(opt) - return val != "" -} - -func (sf *SuperFlag) GetDuration(opt string) time.Duration { - val := sf.GetString(opt) - if val == "" { - return time.Duration(0) - } - if strings.Contains(val, "d") { - val = strings.Replace(val, "d", "", 1) - days, err := strconv.ParseUint(val, 0, 64) - if err != nil { - return time.Duration(0) - } - return time.Hour * 24 * time.Duration(days) - } - d, err := time.ParseDuration(val) - if err != nil { - return time.Duration(0) - } - return d -} - -func (sf *SuperFlag) GetBool(opt string) bool { - val := sf.GetString(opt) - if val == "" { - return false - } - b, err := strconv.ParseBool(val) - if err != nil { - err = errors.Wrapf(err, - "Unable to parse %s as bool for key: %s. Options: %s\n", - val, opt, sf) - glog.Fatalf("%+v", err) - } - return b -} - -func (sf *SuperFlag) GetFloat64(opt string) float64 { - val := sf.GetString(opt) - if val == "" { - return 0 - } - f, err := strconv.ParseFloat(val, 64) - if err != nil { - err = errors.Wrapf(err, - "Unable to parse %s as float64 for key: %s. Options: %s\n", - val, opt, sf) - glog.Fatalf("%+v", err) - } - return f -} - -func (sf *SuperFlag) GetInt64(opt string) int64 { - val := sf.GetString(opt) - if val == "" { - return 0 - } - i, err := strconv.ParseInt(val, 0, 64) - if err != nil { - err = errors.Wrapf(err, - "Unable to parse %s as int64 for key: %s. Options: %s\n", - val, opt, sf) - glog.Fatalf("%+v", err) - } - return i -} - -func (sf *SuperFlag) GetUint64(opt string) uint64 { - val := sf.GetString(opt) - if val == "" { - return 0 - } - u, err := strconv.ParseUint(val, 0, 64) - if err != nil { - err = errors.Wrapf(err, - "Unable to parse %s as uint64 for key: %s. Options: %s\n", - val, opt, sf) - glog.Fatalf("%+v", err) - } - return u -} - -func (sf *SuperFlag) GetUint32(opt string) uint32 { - val := sf.GetString(opt) - if val == "" { - return 0 - } - u, err := strconv.ParseUint(val, 0, 32) - if err != nil { - err = errors.Wrapf(err, - "Unable to parse %s as uint32 for key: %s. Options: %s\n", - val, opt, sf) - glog.Fatalf("%+v", err) - } - return uint32(u) -} - -func (sf *SuperFlag) GetString(opt string) string { - if sf == nil { - return "" - } - return sf.m[opt] -} - -func (sf *SuperFlag) GetPath(opt string) string { - p := sf.GetString(opt) - path, err := expandPath(p) - if err != nil { - glog.Fatalf("Failed to get path: %+v", err) - } - return path -} - -// expandPath expands the paths containing ~ to /home/user. It also computes the absolute path -// from the relative paths. For example: ~/abc/../cef will be transformed to /home/user/cef. -func expandPath(path string) (string, error) { - if len(path) == 0 { - return "", nil - } - if path[0] == '~' && (len(path) == 1 || os.IsPathSeparator(path[1])) { - usr, err := user.Current() - if err != nil { - return "", errors.Wrap(err, "Failed to get the home directory of the user") - } - path = filepath.Join(usr.HomeDir, path[1:]) - } - - var err error - path, err = filepath.Abs(path) - if err != nil { - return "", errors.Wrap(err, "Failed to generate absolute path") - } - return path, nil -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/histogram.go b/vendor/github.com/dgraph-io/ristretto/z/histogram.go deleted file mode 100644 index 4eb0c4f6c9..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/histogram.go +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "fmt" - "math" - "strings" - - "github.com/dustin/go-humanize" -) - -// Creates bounds for an histogram. The bounds are powers of two of the form -// [2^min_exponent, ..., 2^max_exponent]. -func HistogramBounds(minExponent, maxExponent uint32) []float64 { - var bounds []float64 - for i := minExponent; i <= maxExponent; i++ { - bounds = append(bounds, float64(int(1)< 4) - bounds := make([]float64, num) - bounds[0] = 1 - bounds[1] = 2 - for i := 2; i < num; i++ { - bounds[i] = bounds[i-1] + bounds[i-2] - } - return bounds -} - -// HistogramData stores the information needed to represent the sizes of the keys and values -// as a histogram. -type HistogramData struct { - Bounds []float64 - Count int64 - CountPerBucket []int64 - Min int64 - Max int64 - Sum int64 -} - -// NewHistogramData returns a new instance of HistogramData with properly initialized fields. -func NewHistogramData(bounds []float64) *HistogramData { - return &HistogramData{ - Bounds: bounds, - CountPerBucket: make([]int64, len(bounds)+1), - Max: 0, - Min: math.MaxInt64, - } -} - -func (histogram *HistogramData) Copy() *HistogramData { - if histogram == nil { - return nil - } - return &HistogramData{ - Bounds: append([]float64{}, histogram.Bounds...), - CountPerBucket: append([]int64{}, histogram.CountPerBucket...), - Count: histogram.Count, - Min: histogram.Min, - Max: histogram.Max, - Sum: histogram.Sum, - } -} - -// Update changes the Min and Max fields if value is less than or greater than the current values. -func (histogram *HistogramData) Update(value int64) { - if histogram == nil { - return - } - if value > histogram.Max { - histogram.Max = value - } - if value < histogram.Min { - histogram.Min = value - } - - histogram.Sum += value - histogram.Count++ - - for index := 0; index <= len(histogram.Bounds); index++ { - // Allocate value in the last buckets if we reached the end of the Bounds array. - if index == len(histogram.Bounds) { - histogram.CountPerBucket[index]++ - break - } - - if value < int64(histogram.Bounds[index]) { - histogram.CountPerBucket[index]++ - break - } - } -} - -// Mean returns the mean value for the histogram. -func (histogram *HistogramData) Mean() float64 { - if histogram.Count == 0 { - return 0 - } - return float64(histogram.Sum) / float64(histogram.Count) -} - -// String converts the histogram data into human-readable string. -func (histogram *HistogramData) String() string { - if histogram == nil { - return "" - } - var b strings.Builder - - b.WriteString("\n -- Histogram: \n") - b.WriteString(fmt.Sprintf("Min value: %d \n", histogram.Min)) - b.WriteString(fmt.Sprintf("Max value: %d \n", histogram.Max)) - b.WriteString(fmt.Sprintf("Count: %d \n", histogram.Count)) - b.WriteString(fmt.Sprintf("50p: %.2f \n", histogram.Percentile(0.5))) - b.WriteString(fmt.Sprintf("75p: %.2f \n", histogram.Percentile(0.75))) - b.WriteString(fmt.Sprintf("90p: %.2f \n", histogram.Percentile(0.90))) - - numBounds := len(histogram.Bounds) - var cum float64 - for index, count := range histogram.CountPerBucket { - if count == 0 { - continue - } - - // The last bucket represents the bucket that contains the range from - // the last bound up to infinity so it's processed differently than the - // other buckets. - if index == len(histogram.CountPerBucket)-1 { - lowerBound := uint64(histogram.Bounds[numBounds-1]) - page := float64(count*100) / float64(histogram.Count) - cum += page - b.WriteString(fmt.Sprintf("[%s, %s) %d %.2f%% %.2f%%\n", - humanize.IBytes(lowerBound), "infinity", count, page, cum)) - continue - } - - upperBound := uint64(histogram.Bounds[index]) - lowerBound := uint64(0) - if index > 0 { - lowerBound = uint64(histogram.Bounds[index-1]) - } - - page := float64(count*100) / float64(histogram.Count) - cum += page - b.WriteString(fmt.Sprintf("[%d, %d) %d %.2f%% %.2f%%\n", - lowerBound, upperBound, count, page, cum)) - } - b.WriteString(" --\n") - return b.String() -} - -// Percentile returns the percentile value for the histogram. -// value of p should be between [0.0-1.0] -func (histogram *HistogramData) Percentile(p float64) float64 { - if histogram == nil { - return 0 - } - - if histogram.Count == 0 { - // if no data return the minimum range - return histogram.Bounds[0] - } - pval := int64(float64(histogram.Count) * p) - for i, v := range histogram.CountPerBucket { - pval = pval - v - if pval <= 0 { - if i == len(histogram.Bounds) { - break - } - return histogram.Bounds[i] - } - } - // default return should be the max range - return histogram.Bounds[len(histogram.Bounds)-1] -} - -// Clear reset the histogram. Helpful in situations where we need to reset the metrics -func (histogram *HistogramData) Clear() { - if histogram == nil { - return - } - - histogram.Count = 0 - histogram.CountPerBucket = make([]int64, len(histogram.Bounds)+1) - histogram.Sum = 0 - histogram.Max = 0 - histogram.Min = math.MaxInt64 -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/mmap.go b/vendor/github.com/dgraph-io/ristretto/z/mmap.go deleted file mode 100644 index 9b02510003..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/mmap.go +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "os" -) - -// Mmap uses the mmap system call to memory-map a file. If writable is true, -// memory protection of the pages is set so that they may be written to as well. -func Mmap(fd *os.File, writable bool, size int64) ([]byte, error) { - return mmap(fd, writable, size) -} - -// Munmap unmaps a previously mapped slice. -func Munmap(b []byte) error { - return munmap(b) -} - -// Madvise uses the madvise system call to give advise about the use of memory -// when using a slice that is memory-mapped to a file. Set the readahead flag to -// false if page references are expected in random order. -func Madvise(b []byte, readahead bool) error { - return madvise(b, readahead) -} - -// Msync would call sync on the mmapped data. -func Msync(b []byte) error { - return msync(b) -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/mmap_darwin.go b/vendor/github.com/dgraph-io/ristretto/z/mmap_darwin.go deleted file mode 100644 index 4d6d74f193..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/mmap_darwin.go +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "os" - "syscall" - "unsafe" - - "golang.org/x/sys/unix" -) - -// Mmap uses the mmap system call to memory-map a file. If writable is true, -// memory protection of the pages is set so that they may be written to as well. -func mmap(fd *os.File, writable bool, size int64) ([]byte, error) { - mtype := unix.PROT_READ - if writable { - mtype |= unix.PROT_WRITE - } - return unix.Mmap(int(fd.Fd()), 0, int(size), mtype, unix.MAP_SHARED) -} - -// Munmap unmaps a previously mapped slice. -func munmap(b []byte) error { - return unix.Munmap(b) -} - -// This is required because the unix package does not support the madvise system call on OS X. -func madvise(b []byte, readahead bool) error { - advice := unix.MADV_NORMAL - if !readahead { - advice = unix.MADV_RANDOM - } - - _, _, e1 := syscall.Syscall(syscall.SYS_MADVISE, uintptr(unsafe.Pointer(&b[0])), - uintptr(len(b)), uintptr(advice)) - if e1 != 0 { - return e1 - } - return nil -} - -func msync(b []byte) error { - return unix.Msync(b, unix.MS_SYNC) -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/mmap_linux.go b/vendor/github.com/dgraph-io/ristretto/z/mmap_linux.go deleted file mode 100644 index 9cc3497a16..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/mmap_linux.go +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "fmt" - "os" - "reflect" - "unsafe" - - "golang.org/x/sys/unix" -) - -// mmap uses the mmap system call to memory-map a file. If writable is true, -// memory protection of the pages is set so that they may be written to as well. -func mmap(fd *os.File, writable bool, size int64) ([]byte, error) { - mtype := unix.PROT_READ - if writable { - mtype |= unix.PROT_WRITE - } - return unix.Mmap(int(fd.Fd()), 0, int(size), mtype, unix.MAP_SHARED) -} - -// mremap is a Linux-specific system call to remap pages in memory. This can be used in place of munmap + mmap. -func mremap(data []byte, size int) ([]byte, error) { - // taken from - const MREMAP_MAYMOVE = 0x1 - - header := (*reflect.SliceHeader)(unsafe.Pointer(&data)) - mmapAddr, mmapSize, errno := unix.Syscall6( - unix.SYS_MREMAP, - header.Data, - uintptr(header.Len), - uintptr(size), - uintptr(MREMAP_MAYMOVE), - 0, - 0, - ) - if errno != 0 { - return nil, errno - } - if mmapSize != uintptr(size) { - return nil, fmt.Errorf("mremap size mismatch: requested: %d got: %d", size, mmapSize) - } - - header.Data = mmapAddr - header.Cap = size - header.Len = size - return data, nil -} - -// munmap unmaps a previously mapped slice. -// -// unix.Munmap maintains an internal list of mmapped addresses, and only calls munmap -// if the address is present in that list. If we use mremap, this list is not updated. -// To bypass this, we call munmap ourselves. -func munmap(data []byte) error { - if len(data) == 0 || len(data) != cap(data) { - return unix.EINVAL - } - _, _, errno := unix.Syscall( - unix.SYS_MUNMAP, - uintptr(unsafe.Pointer(&data[0])), - uintptr(len(data)), - 0, - ) - if errno != 0 { - return errno - } - return nil -} - -// madvise uses the madvise system call to give advise about the use of memory -// when using a slice that is memory-mapped to a file. Set the readahead flag to -// false if page references are expected in random order. -func madvise(b []byte, readahead bool) error { - flags := unix.MADV_NORMAL - if !readahead { - flags = unix.MADV_RANDOM - } - return unix.Madvise(b, flags) -} - -// msync writes any modified data to persistent storage. -func msync(b []byte) error { - return unix.Msync(b, unix.MS_SYNC) -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/mmap_plan9.go b/vendor/github.com/dgraph-io/ristretto/z/mmap_plan9.go deleted file mode 100644 index f30729654f..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/mmap_plan9.go +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "os" - "syscall" -) - -// Mmap uses the mmap system call to memory-map a file. If writable is true, -// memory protection of the pages is set so that they may be written to as well. -func mmap(fd *os.File, writable bool, size int64) ([]byte, error) { - return nil, syscall.EPLAN9 -} - -// Munmap unmaps a previously mapped slice. -func munmap(b []byte) error { - return syscall.EPLAN9 -} - -// Madvise uses the madvise system call to give advise about the use of memory -// when using a slice that is memory-mapped to a file. Set the readahead flag to -// false if page references are expected in random order. -func madvise(b []byte, readahead bool) error { - return syscall.EPLAN9 -} - -func msync(b []byte) error { - return syscall.EPLAN9 -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/mmap_unix.go b/vendor/github.com/dgraph-io/ristretto/z/mmap_unix.go deleted file mode 100644 index e8b2699cf9..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/mmap_unix.go +++ /dev/null @@ -1,55 +0,0 @@ -// +build !windows,!darwin,!plan9,!linux - -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "os" - - "golang.org/x/sys/unix" -) - -// Mmap uses the mmap system call to memory-map a file. If writable is true, -// memory protection of the pages is set so that they may be written to as well. -func mmap(fd *os.File, writable bool, size int64) ([]byte, error) { - mtype := unix.PROT_READ - if writable { - mtype |= unix.PROT_WRITE - } - return unix.Mmap(int(fd.Fd()), 0, int(size), mtype, unix.MAP_SHARED) -} - -// Munmap unmaps a previously mapped slice. -func munmap(b []byte) error { - return unix.Munmap(b) -} - -// Madvise uses the madvise system call to give advise about the use of memory -// when using a slice that is memory-mapped to a file. Set the readahead flag to -// false if page references are expected in random order. -func madvise(b []byte, readahead bool) error { - flags := unix.MADV_NORMAL - if !readahead { - flags = unix.MADV_RANDOM - } - return unix.Madvise(b, flags) -} - -func msync(b []byte) error { - return unix.Msync(b, unix.MS_SYNC) -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/mmap_windows.go b/vendor/github.com/dgraph-io/ristretto/z/mmap_windows.go deleted file mode 100644 index 171176e9fe..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/mmap_windows.go +++ /dev/null @@ -1,96 +0,0 @@ -// +build windows - -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "fmt" - "os" - "syscall" - "unsafe" -) - -func mmap(fd *os.File, write bool, size int64) ([]byte, error) { - protect := syscall.PAGE_READONLY - access := syscall.FILE_MAP_READ - - if write { - protect = syscall.PAGE_READWRITE - access = syscall.FILE_MAP_WRITE - } - fi, err := fd.Stat() - if err != nil { - return nil, err - } - - // In windows, we cannot mmap a file more than it's actual size. - // So truncate the file to the size of the mmap. - if fi.Size() < size { - if err := fd.Truncate(size); err != nil { - return nil, fmt.Errorf("truncate: %s", err) - } - } - - // Open a file mapping handle. - sizelo := uint32(size >> 32) - sizehi := uint32(size) & 0xffffffff - - handler, err := syscall.CreateFileMapping(syscall.Handle(fd.Fd()), nil, - uint32(protect), sizelo, sizehi, nil) - if err != nil { - return nil, os.NewSyscallError("CreateFileMapping", err) - } - - // Create the memory map. - addr, err := syscall.MapViewOfFile(handler, uint32(access), 0, 0, uintptr(size)) - if addr == 0 { - return nil, os.NewSyscallError("MapViewOfFile", err) - } - - // Close mapping handle. - if err := syscall.CloseHandle(syscall.Handle(handler)); err != nil { - return nil, os.NewSyscallError("CloseHandle", err) - } - - // Slice memory layout - // Copied this snippet from golang/sys package - var sl = struct { - addr uintptr - len int - cap int - }{addr, int(size), int(size)} - - // Use unsafe to turn sl into a []byte. - data := *(*[]byte)(unsafe.Pointer(&sl)) - - return data, nil -} - -func munmap(b []byte) error { - return syscall.UnmapViewOfFile(uintptr(unsafe.Pointer(&b[0]))) -} - -func madvise(b []byte, readahead bool) error { - // Do Nothing. We don’t care about this setting on Windows - return nil -} - -func msync(b []byte) error { - // TODO: Figure out how to do msync on Windows. - return nil -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/rtutil.go b/vendor/github.com/dgraph-io/ristretto/z/rtutil.go deleted file mode 100644 index 8f317c80d3..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/rtutil.go +++ /dev/null @@ -1,75 +0,0 @@ -// MIT License - -// Copyright (c) 2019 Ewan Chou - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package z - -import ( - "unsafe" -) - -// NanoTime returns the current time in nanoseconds from a monotonic clock. -//go:linkname NanoTime runtime.nanotime -func NanoTime() int64 - -// CPUTicks is a faster alternative to NanoTime to measure time duration. -//go:linkname CPUTicks runtime.cputicks -func CPUTicks() int64 - -type stringStruct struct { - str unsafe.Pointer - len int -} - -//go:noescape -//go:linkname memhash runtime.memhash -func memhash(p unsafe.Pointer, h, s uintptr) uintptr - -// MemHash is the hash function used by go map, it utilizes available hardware instructions(behaves -// as aeshash if aes instruction is available). -// NOTE: The hash seed changes for every process. So, this cannot be used as a persistent hash. -func MemHash(data []byte) uint64 { - ss := (*stringStruct)(unsafe.Pointer(&data)) - return uint64(memhash(ss.str, 0, uintptr(ss.len))) -} - -// MemHashString is the hash function used by go map, it utilizes available hardware instructions -// (behaves as aeshash if aes instruction is available). -// NOTE: The hash seed changes for every process. So, this cannot be used as a persistent hash. -func MemHashString(str string) uint64 { - ss := (*stringStruct)(unsafe.Pointer(&str)) - return uint64(memhash(ss.str, 0, uintptr(ss.len))) -} - -// FastRand is a fast thread local random function. -//go:linkname FastRand runtime.fastrand -func FastRand() uint32 - -//go:linkname memclrNoHeapPointers runtime.memclrNoHeapPointers -func memclrNoHeapPointers(p unsafe.Pointer, n uintptr) - -func Memclr(b []byte) { - if len(b) == 0 { - return - } - p := unsafe.Pointer(&b[0]) - memclrNoHeapPointers(p, uintptr(len(b))) -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/rtutil.s b/vendor/github.com/dgraph-io/ristretto/z/rtutil.s deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/github.com/dgraph-io/ristretto/z/simd/baseline.go b/vendor/github.com/dgraph-io/ristretto/z/simd/baseline.go deleted file mode 100644 index 967e3a307e..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/simd/baseline.go +++ /dev/null @@ -1,127 +0,0 @@ -package simd - -import ( - "fmt" - "runtime" - "sort" - "sync" -) - -// Search finds the key using the naive way -func Naive(xs []uint64, k uint64) int16 { - var i int - for i = 0; i < len(xs); i += 2 { - x := xs[i] - if x >= k { - return int16(i / 2) - } - } - return int16(i / 2) -} - -func Clever(xs []uint64, k uint64) int16 { - if len(xs) < 8 { - return Naive(xs, k) - } - var twos, pk [4]uint64 - pk[0] = k - pk[1] = k - pk[2] = k - pk[3] = k - for i := 0; i < len(xs); i += 8 { - twos[0] = xs[i] - twos[1] = xs[i+2] - twos[2] = xs[i+4] - twos[3] = xs[i+6] - if twos[0] >= pk[0] { - return int16(i / 2) - } - if twos[1] >= pk[1] { - return int16((i + 2) / 2) - } - if twos[2] >= pk[2] { - return int16((i + 4) / 2) - } - if twos[3] >= pk[3] { - return int16((i + 6) / 2) - } - - } - return int16(len(xs) / 2) -} - -func Parallel(xs []uint64, k uint64) int16 { - cpus := runtime.NumCPU() - if cpus%2 != 0 { - panic(fmt.Sprintf("odd number of CPUs %v", cpus)) - } - sz := len(xs)/cpus + 1 - var wg sync.WaitGroup - retChan := make(chan int16, cpus) - for i := 0; i < len(xs); i += sz { - end := i + sz - if end >= len(xs) { - end = len(xs) - } - chunk := xs[i:end] - wg.Add(1) - go func(hd int16, xs []uint64, k uint64, wg *sync.WaitGroup, ch chan int16) { - for i := 0; i < len(xs); i += 2 { - if xs[i] >= k { - ch <- (int16(i) + hd) / 2 - break - } - } - wg.Done() - }(int16(i), chunk, k, &wg, retChan) - } - wg.Wait() - close(retChan) - var min int16 = (1 << 15) - 1 - for i := range retChan { - if i < min { - min = i - } - } - if min == (1<<15)-1 { - return int16(len(xs) / 2) - } - return min -} - -func Binary(keys []uint64, key uint64) int16 { - return int16(sort.Search(len(keys), func(i int) bool { - if i*2 >= len(keys) { - return true - } - return keys[i*2] >= key - })) -} - -func cmp2_native(twos, pk [2]uint64) int16 { - if twos[0] == pk[0] { - return 0 - } - if twos[1] == pk[1] { - return 1 - } - return 2 -} - -func cmp4_native(fours, pk [4]uint64) int16 { - for i := range fours { - if fours[i] >= pk[i] { - return int16(i) - } - } - return 4 -} - -func cmp8_native(a [8]uint64, pk [4]uint64) int16 { - for i := range a { - if a[i] >= pk[0] { - return int16(i) - } - } - return 8 -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/simd/search.go b/vendor/github.com/dgraph-io/ristretto/z/simd/search.go deleted file mode 100644 index 0d001ee0c4..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/simd/search.go +++ /dev/null @@ -1,51 +0,0 @@ -// +build !amd64 - -/* - * Copyright 2020 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package simd - -// Search uses the Clever search to find the correct key. -func Search(xs []uint64, k uint64) int16 { - if len(xs) < 8 { - return Naive(xs, k) - } - var twos, pk [4]uint64 - pk[0] = k - pk[1] = k - pk[2] = k - pk[3] = k - for i := 0; i < len(xs); i += 8 { - twos[0] = xs[i] - twos[1] = xs[i+2] - twos[2] = xs[i+4] - twos[3] = xs[i+6] - if twos[0] >= pk[0] { - return int16(i / 2) - } - if twos[1] >= pk[1] { - return int16((i + 2) / 2) - } - if twos[2] >= pk[2] { - return int16((i + 4) / 2) - } - if twos[3] >= pk[3] { - return int16((i + 6) / 2) - } - - } - return int16(len(xs) / 2) -} diff --git a/vendor/github.com/dgraph-io/ristretto/z/simd/search_amd64.s b/vendor/github.com/dgraph-io/ristretto/z/simd/search_amd64.s deleted file mode 100644 index 150c846647..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/simd/search_amd64.s +++ /dev/null @@ -1,60 +0,0 @@ -// Code generated by command: go run asm2.go -out search_amd64.s -stubs stub_search_amd64.go. DO NOT EDIT. - -#include "textflag.h" - -// func Search(xs []uint64, k uint64) int16 -TEXT ·Search(SB), NOSPLIT, $0-34 - MOVQ xs_base+0(FP), AX - MOVQ xs_len+8(FP), CX - MOVQ k+24(FP), DX - - // Save n - MOVQ CX, BX - - // Initialize idx register to zero. - XORL BP, BP - -loop: - // Unroll1 - CMPQ (AX)(BP*8), DX - JAE Found - - // Unroll2 - CMPQ 16(AX)(BP*8), DX - JAE Found2 - - // Unroll3 - CMPQ 32(AX)(BP*8), DX - JAE Found3 - - // Unroll4 - CMPQ 48(AX)(BP*8), DX - JAE Found4 - - // plus8 - ADDQ $0x08, BP - CMPQ BP, CX - JB loop - JMP NotFound - -Found2: - ADDL $0x02, BP - JMP Found - -Found3: - ADDL $0x04, BP - JMP Found - -Found4: - ADDL $0x06, BP - -Found: - MOVL BP, BX - -NotFound: - MOVL BX, BP - SHRL $0x1f, BP - ADDL BX, BP - SHRL $0x01, BP - MOVL BP, ret+32(FP) - RET diff --git a/vendor/github.com/dgraph-io/ristretto/z/simd/stub_search_amd64.go b/vendor/github.com/dgraph-io/ristretto/z/simd/stub_search_amd64.go deleted file mode 100644 index 0821d38a77..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/simd/stub_search_amd64.go +++ /dev/null @@ -1,6 +0,0 @@ -// Code generated by command: go run asm2.go -out search_amd64.s -stubs stub_search_amd64.go. DO NOT EDIT. - -package simd - -// Search finds the first idx for which xs[idx] >= k in xs. -func Search(xs []uint64, k uint64) int16 diff --git a/vendor/github.com/dgraph-io/ristretto/z/z.go b/vendor/github.com/dgraph-io/ristretto/z/z.go deleted file mode 100644 index 97455586a1..0000000000 --- a/vendor/github.com/dgraph-io/ristretto/z/z.go +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright 2019 Dgraph Labs, Inc. and Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package z - -import ( - "context" - "sync" - - "github.com/cespare/xxhash/v2" -) - -// TODO: Figure out a way to re-use memhash for the second uint64 hash, we -// already know that appending bytes isn't reliable for generating a -// second hash (see Ristretto PR #88). -// -// We also know that while the Go runtime has a runtime memhash128 -// function, it's not possible to use it to generate [2]uint64 or -// anything resembling a 128bit hash, even though that's exactly what -// we need in this situation. -func KeyToHash(key interface{}) (uint64, uint64) { - if key == nil { - return 0, 0 - } - switch k := key.(type) { - case uint64: - return k, 0 - case string: - return MemHashString(k), xxhash.Sum64String(k) - case []byte: - return MemHash(k), xxhash.Sum64(k) - case byte: - return uint64(k), 0 - case int: - return uint64(k), 0 - case int32: - return uint64(k), 0 - case uint32: - return uint64(k), 0 - case int64: - return uint64(k), 0 - default: - panic("Key type not supported") - } -} - -var ( - dummyCloserChan <-chan struct{} - tmpDir string -) - -// Closer holds the two things we need to close a goroutine and wait for it to -// finish: a chan to tell the goroutine to shut down, and a WaitGroup with -// which to wait for it to finish shutting down. -type Closer struct { - waiting sync.WaitGroup - - ctx context.Context - cancel context.CancelFunc -} - -// SetTmpDir sets the temporary directory for the temporary buffers. -func SetTmpDir(dir string) { - tmpDir = dir -} - -// NewCloser constructs a new Closer, with an initial count on the WaitGroup. -func NewCloser(initial int) *Closer { - ret := &Closer{} - ret.ctx, ret.cancel = context.WithCancel(context.Background()) - ret.waiting.Add(initial) - return ret -} - -// AddRunning Add()'s delta to the WaitGroup. -func (lc *Closer) AddRunning(delta int) { - lc.waiting.Add(delta) -} - -// Ctx can be used to get a context, which would automatically get cancelled when Signal is called. -func (lc *Closer) Ctx() context.Context { - if lc == nil { - return context.Background() - } - return lc.ctx -} - -// Signal signals the HasBeenClosed signal. -func (lc *Closer) Signal() { - // Todo(ibrahim): Change Signal to return error on next badger breaking change. - lc.cancel() -} - -// HasBeenClosed gets signaled when Signal() is called. -func (lc *Closer) HasBeenClosed() <-chan struct{} { - if lc == nil { - return dummyCloserChan - } - return lc.ctx.Done() -} - -// Done calls Done() on the WaitGroup. -func (lc *Closer) Done() { - if lc == nil { - return - } - lc.waiting.Done() -} - -// Wait waits on the WaitGroup. (It waits for NewCloser's initial value, AddRunning, and Done -// calls to balance out.) -func (lc *Closer) Wait() { - lc.waiting.Wait() -} - -// SignalAndWait calls Signal(), then Wait(). -func (lc *Closer) SignalAndWait() { - lc.Signal() - lc.Wait() -} - -// ZeroOut zeroes out all the bytes in the range [start, end). -func ZeroOut(dst []byte, start, end int) { - if start < 0 || start >= len(dst) { - return // BAD - } - if end >= len(dst) { - end = len(dst) - } - if end-start <= 0 { - return - } - Memclr(dst[start:end]) - // b := dst[start:end] - // for i := range b { - // b[i] = 0x0 - // } -} diff --git a/vendor/github.com/dustin/go-humanize/.travis.yml b/vendor/github.com/dustin/go-humanize/.travis.yml deleted file mode 100644 index ac12e485a1..0000000000 --- a/vendor/github.com/dustin/go-humanize/.travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -sudo: false -language: go -go_import_path: github.com/dustin/go-humanize -go: - - 1.13.x - - 1.14.x - - 1.15.x - - 1.16.x - - stable - - master -matrix: - allow_failures: - - go: master - fast_finish: true -install: - - # Do nothing. This is needed to prevent default install action "go get -t -v ./..." from happening here (we want it to happen inside script step). -script: - - diff -u <(echo -n) <(gofmt -d -s .) - - go vet . - - go install -v -race ./... - - go test -v -race ./... diff --git a/vendor/github.com/dustin/go-humanize/LICENSE b/vendor/github.com/dustin/go-humanize/LICENSE deleted file mode 100644 index 8d9a94a906..0000000000 --- a/vendor/github.com/dustin/go-humanize/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2005-2008 Dustin Sallings - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - diff --git a/vendor/github.com/dustin/go-humanize/README.markdown b/vendor/github.com/dustin/go-humanize/README.markdown deleted file mode 100644 index 7d0b16b34f..0000000000 --- a/vendor/github.com/dustin/go-humanize/README.markdown +++ /dev/null @@ -1,124 +0,0 @@ -# Humane Units [![Build Status](https://travis-ci.org/dustin/go-humanize.svg?branch=master)](https://travis-ci.org/dustin/go-humanize) [![GoDoc](https://godoc.org/github.com/dustin/go-humanize?status.svg)](https://godoc.org/github.com/dustin/go-humanize) - -Just a few functions for helping humanize times and sizes. - -`go get` it as `github.com/dustin/go-humanize`, import it as -`"github.com/dustin/go-humanize"`, use it as `humanize`. - -See [godoc](https://pkg.go.dev/github.com/dustin/go-humanize) for -complete documentation. - -## Sizes - -This lets you take numbers like `82854982` and convert them to useful -strings like, `83 MB` or `79 MiB` (whichever you prefer). - -Example: - -```go -fmt.Printf("That file is %s.", humanize.Bytes(82854982)) // That file is 83 MB. -``` - -## Times - -This lets you take a `time.Time` and spit it out in relative terms. -For example, `12 seconds ago` or `3 days from now`. - -Example: - -```go -fmt.Printf("This was touched %s.", humanize.Time(someTimeInstance)) // This was touched 7 hours ago. -``` - -Thanks to Kyle Lemons for the time implementation from an IRC -conversation one day. It's pretty neat. - -## Ordinals - -From a [mailing list discussion][odisc] where a user wanted to be able -to label ordinals. - - 0 -> 0th - 1 -> 1st - 2 -> 2nd - 3 -> 3rd - 4 -> 4th - [...] - -Example: - -```go -fmt.Printf("You're my %s best friend.", humanize.Ordinal(193)) // You are my 193rd best friend. -``` - -## Commas - -Want to shove commas into numbers? Be my guest. - - 0 -> 0 - 100 -> 100 - 1000 -> 1,000 - 1000000000 -> 1,000,000,000 - -100000 -> -100,000 - -Example: - -```go -fmt.Printf("You owe $%s.\n", humanize.Comma(6582491)) // You owe $6,582,491. -``` - -## Ftoa - -Nicer float64 formatter that removes trailing zeros. - -```go -fmt.Printf("%f", 2.24) // 2.240000 -fmt.Printf("%s", humanize.Ftoa(2.24)) // 2.24 -fmt.Printf("%f", 2.0) // 2.000000 -fmt.Printf("%s", humanize.Ftoa(2.0)) // 2 -``` - -## SI notation - -Format numbers with [SI notation][sinotation]. - -Example: - -```go -humanize.SI(0.00000000223, "M") // 2.23 nM -``` - -## English-specific functions - -The following functions are in the `humanize/english` subpackage. - -### Plurals - -Simple English pluralization - -```go -english.PluralWord(1, "object", "") // object -english.PluralWord(42, "object", "") // objects -english.PluralWord(2, "bus", "") // buses -english.PluralWord(99, "locus", "loci") // loci - -english.Plural(1, "object", "") // 1 object -english.Plural(42, "object", "") // 42 objects -english.Plural(2, "bus", "") // 2 buses -english.Plural(99, "locus", "loci") // 99 loci -``` - -### Word series - -Format comma-separated words lists with conjuctions: - -```go -english.WordSeries([]string{"foo"}, "and") // foo -english.WordSeries([]string{"foo", "bar"}, "and") // foo and bar -english.WordSeries([]string{"foo", "bar", "baz"}, "and") // foo, bar and baz - -english.OxfordWordSeries([]string{"foo", "bar", "baz"}, "and") // foo, bar, and baz -``` - -[odisc]: https://groups.google.com/d/topic/golang-nuts/l8NhI74jl-4/discussion -[sinotation]: http://en.wikipedia.org/wiki/Metric_prefix diff --git a/vendor/github.com/dustin/go-humanize/big.go b/vendor/github.com/dustin/go-humanize/big.go deleted file mode 100644 index f49dc337dc..0000000000 --- a/vendor/github.com/dustin/go-humanize/big.go +++ /dev/null @@ -1,31 +0,0 @@ -package humanize - -import ( - "math/big" -) - -// order of magnitude (to a max order) -func oomm(n, b *big.Int, maxmag int) (float64, int) { - mag := 0 - m := &big.Int{} - for n.Cmp(b) >= 0 { - n.DivMod(n, b, m) - mag++ - if mag == maxmag && maxmag >= 0 { - break - } - } - return float64(n.Int64()) + (float64(m.Int64()) / float64(b.Int64())), mag -} - -// total order of magnitude -// (same as above, but with no upper limit) -func oom(n, b *big.Int) (float64, int) { - mag := 0 - m := &big.Int{} - for n.Cmp(b) >= 0 { - n.DivMod(n, b, m) - mag++ - } - return float64(n.Int64()) + (float64(m.Int64()) / float64(b.Int64())), mag -} diff --git a/vendor/github.com/dustin/go-humanize/bigbytes.go b/vendor/github.com/dustin/go-humanize/bigbytes.go deleted file mode 100644 index 3b015fd59e..0000000000 --- a/vendor/github.com/dustin/go-humanize/bigbytes.go +++ /dev/null @@ -1,189 +0,0 @@ -package humanize - -import ( - "fmt" - "math/big" - "strings" - "unicode" -) - -var ( - bigIECExp = big.NewInt(1024) - - // BigByte is one byte in bit.Ints - BigByte = big.NewInt(1) - // BigKiByte is 1,024 bytes in bit.Ints - BigKiByte = (&big.Int{}).Mul(BigByte, bigIECExp) - // BigMiByte is 1,024 k bytes in bit.Ints - BigMiByte = (&big.Int{}).Mul(BigKiByte, bigIECExp) - // BigGiByte is 1,024 m bytes in bit.Ints - BigGiByte = (&big.Int{}).Mul(BigMiByte, bigIECExp) - // BigTiByte is 1,024 g bytes in bit.Ints - BigTiByte = (&big.Int{}).Mul(BigGiByte, bigIECExp) - // BigPiByte is 1,024 t bytes in bit.Ints - BigPiByte = (&big.Int{}).Mul(BigTiByte, bigIECExp) - // BigEiByte is 1,024 p bytes in bit.Ints - BigEiByte = (&big.Int{}).Mul(BigPiByte, bigIECExp) - // BigZiByte is 1,024 e bytes in bit.Ints - BigZiByte = (&big.Int{}).Mul(BigEiByte, bigIECExp) - // BigYiByte is 1,024 z bytes in bit.Ints - BigYiByte = (&big.Int{}).Mul(BigZiByte, bigIECExp) - // BigRiByte is 1,024 y bytes in bit.Ints - BigRiByte = (&big.Int{}).Mul(BigYiByte, bigIECExp) - // BigQiByte is 1,024 r bytes in bit.Ints - BigQiByte = (&big.Int{}).Mul(BigRiByte, bigIECExp) -) - -var ( - bigSIExp = big.NewInt(1000) - - // BigSIByte is one SI byte in big.Ints - BigSIByte = big.NewInt(1) - // BigKByte is 1,000 SI bytes in big.Ints - BigKByte = (&big.Int{}).Mul(BigSIByte, bigSIExp) - // BigMByte is 1,000 SI k bytes in big.Ints - BigMByte = (&big.Int{}).Mul(BigKByte, bigSIExp) - // BigGByte is 1,000 SI m bytes in big.Ints - BigGByte = (&big.Int{}).Mul(BigMByte, bigSIExp) - // BigTByte is 1,000 SI g bytes in big.Ints - BigTByte = (&big.Int{}).Mul(BigGByte, bigSIExp) - // BigPByte is 1,000 SI t bytes in big.Ints - BigPByte = (&big.Int{}).Mul(BigTByte, bigSIExp) - // BigEByte is 1,000 SI p bytes in big.Ints - BigEByte = (&big.Int{}).Mul(BigPByte, bigSIExp) - // BigZByte is 1,000 SI e bytes in big.Ints - BigZByte = (&big.Int{}).Mul(BigEByte, bigSIExp) - // BigYByte is 1,000 SI z bytes in big.Ints - BigYByte = (&big.Int{}).Mul(BigZByte, bigSIExp) - // BigRByte is 1,000 SI y bytes in big.Ints - BigRByte = (&big.Int{}).Mul(BigYByte, bigSIExp) - // BigQByte is 1,000 SI r bytes in big.Ints - BigQByte = (&big.Int{}).Mul(BigRByte, bigSIExp) -) - -var bigBytesSizeTable = map[string]*big.Int{ - "b": BigByte, - "kib": BigKiByte, - "kb": BigKByte, - "mib": BigMiByte, - "mb": BigMByte, - "gib": BigGiByte, - "gb": BigGByte, - "tib": BigTiByte, - "tb": BigTByte, - "pib": BigPiByte, - "pb": BigPByte, - "eib": BigEiByte, - "eb": BigEByte, - "zib": BigZiByte, - "zb": BigZByte, - "yib": BigYiByte, - "yb": BigYByte, - "rib": BigRiByte, - "rb": BigRByte, - "qib": BigQiByte, - "qb": BigQByte, - // Without suffix - "": BigByte, - "ki": BigKiByte, - "k": BigKByte, - "mi": BigMiByte, - "m": BigMByte, - "gi": BigGiByte, - "g": BigGByte, - "ti": BigTiByte, - "t": BigTByte, - "pi": BigPiByte, - "p": BigPByte, - "ei": BigEiByte, - "e": BigEByte, - "z": BigZByte, - "zi": BigZiByte, - "y": BigYByte, - "yi": BigYiByte, - "r": BigRByte, - "ri": BigRiByte, - "q": BigQByte, - "qi": BigQiByte, -} - -var ten = big.NewInt(10) - -func humanateBigBytes(s, base *big.Int, sizes []string) string { - if s.Cmp(ten) < 0 { - return fmt.Sprintf("%d B", s) - } - c := (&big.Int{}).Set(s) - val, mag := oomm(c, base, len(sizes)-1) - suffix := sizes[mag] - f := "%.0f %s" - if val < 10 { - f = "%.1f %s" - } - - return fmt.Sprintf(f, val, suffix) - -} - -// BigBytes produces a human readable representation of an SI size. -// -// See also: ParseBigBytes. -// -// BigBytes(82854982) -> 83 MB -func BigBytes(s *big.Int) string { - sizes := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB", "RB", "QB"} - return humanateBigBytes(s, bigSIExp, sizes) -} - -// BigIBytes produces a human readable representation of an IEC size. -// -// See also: ParseBigBytes. -// -// BigIBytes(82854982) -> 79 MiB -func BigIBytes(s *big.Int) string { - sizes := []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", "RiB", "QiB"} - return humanateBigBytes(s, bigIECExp, sizes) -} - -// ParseBigBytes parses a string representation of bytes into the number -// of bytes it represents. -// -// See also: BigBytes, BigIBytes. -// -// ParseBigBytes("42 MB") -> 42000000, nil -// ParseBigBytes("42 mib") -> 44040192, nil -func ParseBigBytes(s string) (*big.Int, error) { - lastDigit := 0 - hasComma := false - for _, r := range s { - if !(unicode.IsDigit(r) || r == '.' || r == ',') { - break - } - if r == ',' { - hasComma = true - } - lastDigit++ - } - - num := s[:lastDigit] - if hasComma { - num = strings.Replace(num, ",", "", -1) - } - - val := &big.Rat{} - _, err := fmt.Sscanf(num, "%f", val) - if err != nil { - return nil, err - } - - extra := strings.ToLower(strings.TrimSpace(s[lastDigit:])) - if m, ok := bigBytesSizeTable[extra]; ok { - mv := (&big.Rat{}).SetInt(m) - val.Mul(val, mv) - rv := &big.Int{} - rv.Div(val.Num(), val.Denom()) - return rv, nil - } - - return nil, fmt.Errorf("unhandled size name: %v", extra) -} diff --git a/vendor/github.com/dustin/go-humanize/bytes.go b/vendor/github.com/dustin/go-humanize/bytes.go deleted file mode 100644 index 0b498f4885..0000000000 --- a/vendor/github.com/dustin/go-humanize/bytes.go +++ /dev/null @@ -1,143 +0,0 @@ -package humanize - -import ( - "fmt" - "math" - "strconv" - "strings" - "unicode" -) - -// IEC Sizes. -// kibis of bits -const ( - Byte = 1 << (iota * 10) - KiByte - MiByte - GiByte - TiByte - PiByte - EiByte -) - -// SI Sizes. -const ( - IByte = 1 - KByte = IByte * 1000 - MByte = KByte * 1000 - GByte = MByte * 1000 - TByte = GByte * 1000 - PByte = TByte * 1000 - EByte = PByte * 1000 -) - -var bytesSizeTable = map[string]uint64{ - "b": Byte, - "kib": KiByte, - "kb": KByte, - "mib": MiByte, - "mb": MByte, - "gib": GiByte, - "gb": GByte, - "tib": TiByte, - "tb": TByte, - "pib": PiByte, - "pb": PByte, - "eib": EiByte, - "eb": EByte, - // Without suffix - "": Byte, - "ki": KiByte, - "k": KByte, - "mi": MiByte, - "m": MByte, - "gi": GiByte, - "g": GByte, - "ti": TiByte, - "t": TByte, - "pi": PiByte, - "p": PByte, - "ei": EiByte, - "e": EByte, -} - -func logn(n, b float64) float64 { - return math.Log(n) / math.Log(b) -} - -func humanateBytes(s uint64, base float64, sizes []string) string { - if s < 10 { - return fmt.Sprintf("%d B", s) - } - e := math.Floor(logn(float64(s), base)) - suffix := sizes[int(e)] - val := math.Floor(float64(s)/math.Pow(base, e)*10+0.5) / 10 - f := "%.0f %s" - if val < 10 { - f = "%.1f %s" - } - - return fmt.Sprintf(f, val, suffix) -} - -// Bytes produces a human readable representation of an SI size. -// -// See also: ParseBytes. -// -// Bytes(82854982) -> 83 MB -func Bytes(s uint64) string { - sizes := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB"} - return humanateBytes(s, 1000, sizes) -} - -// IBytes produces a human readable representation of an IEC size. -// -// See also: ParseBytes. -// -// IBytes(82854982) -> 79 MiB -func IBytes(s uint64) string { - sizes := []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"} - return humanateBytes(s, 1024, sizes) -} - -// ParseBytes parses a string representation of bytes into the number -// of bytes it represents. -// -// See Also: Bytes, IBytes. -// -// ParseBytes("42 MB") -> 42000000, nil -// ParseBytes("42 mib") -> 44040192, nil -func ParseBytes(s string) (uint64, error) { - lastDigit := 0 - hasComma := false - for _, r := range s { - if !(unicode.IsDigit(r) || r == '.' || r == ',') { - break - } - if r == ',' { - hasComma = true - } - lastDigit++ - } - - num := s[:lastDigit] - if hasComma { - num = strings.Replace(num, ",", "", -1) - } - - f, err := strconv.ParseFloat(num, 64) - if err != nil { - return 0, err - } - - extra := strings.ToLower(strings.TrimSpace(s[lastDigit:])) - if m, ok := bytesSizeTable[extra]; ok { - f *= float64(m) - if f >= math.MaxUint64 { - return 0, fmt.Errorf("too large: %v", s) - } - return uint64(f), nil - } - - return 0, fmt.Errorf("unhandled size name: %v", extra) -} diff --git a/vendor/github.com/dustin/go-humanize/comma.go b/vendor/github.com/dustin/go-humanize/comma.go deleted file mode 100644 index 520ae3e57d..0000000000 --- a/vendor/github.com/dustin/go-humanize/comma.go +++ /dev/null @@ -1,116 +0,0 @@ -package humanize - -import ( - "bytes" - "math" - "math/big" - "strconv" - "strings" -) - -// Comma produces a string form of the given number in base 10 with -// commas after every three orders of magnitude. -// -// e.g. Comma(834142) -> 834,142 -func Comma(v int64) string { - sign := "" - - // Min int64 can't be negated to a usable value, so it has to be special cased. - if v == math.MinInt64 { - return "-9,223,372,036,854,775,808" - } - - if v < 0 { - sign = "-" - v = 0 - v - } - - parts := []string{"", "", "", "", "", "", ""} - j := len(parts) - 1 - - for v > 999 { - parts[j] = strconv.FormatInt(v%1000, 10) - switch len(parts[j]) { - case 2: - parts[j] = "0" + parts[j] - case 1: - parts[j] = "00" + parts[j] - } - v = v / 1000 - j-- - } - parts[j] = strconv.Itoa(int(v)) - return sign + strings.Join(parts[j:], ",") -} - -// Commaf produces a string form of the given number in base 10 with -// commas after every three orders of magnitude. -// -// e.g. Commaf(834142.32) -> 834,142.32 -func Commaf(v float64) string { - buf := &bytes.Buffer{} - if v < 0 { - buf.Write([]byte{'-'}) - v = 0 - v - } - - comma := []byte{','} - - parts := strings.Split(strconv.FormatFloat(v, 'f', -1, 64), ".") - pos := 0 - if len(parts[0])%3 != 0 { - pos += len(parts[0]) % 3 - buf.WriteString(parts[0][:pos]) - buf.Write(comma) - } - for ; pos < len(parts[0]); pos += 3 { - buf.WriteString(parts[0][pos : pos+3]) - buf.Write(comma) - } - buf.Truncate(buf.Len() - 1) - - if len(parts) > 1 { - buf.Write([]byte{'.'}) - buf.WriteString(parts[1]) - } - return buf.String() -} - -// CommafWithDigits works like the Commaf but limits the resulting -// string to the given number of decimal places. -// -// e.g. CommafWithDigits(834142.32, 1) -> 834,142.3 -func CommafWithDigits(f float64, decimals int) string { - return stripTrailingDigits(Commaf(f), decimals) -} - -// BigComma produces a string form of the given big.Int in base 10 -// with commas after every three orders of magnitude. -func BigComma(b *big.Int) string { - sign := "" - if b.Sign() < 0 { - sign = "-" - b.Abs(b) - } - - athousand := big.NewInt(1000) - c := (&big.Int{}).Set(b) - _, m := oom(c, athousand) - parts := make([]string, m+1) - j := len(parts) - 1 - - mod := &big.Int{} - for b.Cmp(athousand) >= 0 { - b.DivMod(b, athousand, mod) - parts[j] = strconv.FormatInt(mod.Int64(), 10) - switch len(parts[j]) { - case 2: - parts[j] = "0" + parts[j] - case 1: - parts[j] = "00" + parts[j] - } - j-- - } - parts[j] = strconv.Itoa(int(b.Int64())) - return sign + strings.Join(parts[j:], ",") -} diff --git a/vendor/github.com/dustin/go-humanize/commaf.go b/vendor/github.com/dustin/go-humanize/commaf.go deleted file mode 100644 index 2bc83a03cf..0000000000 --- a/vendor/github.com/dustin/go-humanize/commaf.go +++ /dev/null @@ -1,41 +0,0 @@ -//go:build go1.6 -// +build go1.6 - -package humanize - -import ( - "bytes" - "math/big" - "strings" -) - -// BigCommaf produces a string form of the given big.Float in base 10 -// with commas after every three orders of magnitude. -func BigCommaf(v *big.Float) string { - buf := &bytes.Buffer{} - if v.Sign() < 0 { - buf.Write([]byte{'-'}) - v.Abs(v) - } - - comma := []byte{','} - - parts := strings.Split(v.Text('f', -1), ".") - pos := 0 - if len(parts[0])%3 != 0 { - pos += len(parts[0]) % 3 - buf.WriteString(parts[0][:pos]) - buf.Write(comma) - } - for ; pos < len(parts[0]); pos += 3 { - buf.WriteString(parts[0][pos : pos+3]) - buf.Write(comma) - } - buf.Truncate(buf.Len() - 1) - - if len(parts) > 1 { - buf.Write([]byte{'.'}) - buf.WriteString(parts[1]) - } - return buf.String() -} diff --git a/vendor/github.com/dustin/go-humanize/ftoa.go b/vendor/github.com/dustin/go-humanize/ftoa.go deleted file mode 100644 index bce923f371..0000000000 --- a/vendor/github.com/dustin/go-humanize/ftoa.go +++ /dev/null @@ -1,49 +0,0 @@ -package humanize - -import ( - "strconv" - "strings" -) - -func stripTrailingZeros(s string) string { - if !strings.ContainsRune(s, '.') { - return s - } - offset := len(s) - 1 - for offset > 0 { - if s[offset] == '.' { - offset-- - break - } - if s[offset] != '0' { - break - } - offset-- - } - return s[:offset+1] -} - -func stripTrailingDigits(s string, digits int) string { - if i := strings.Index(s, "."); i >= 0 { - if digits <= 0 { - return s[:i] - } - i++ - if i+digits >= len(s) { - return s - } - return s[:i+digits] - } - return s -} - -// Ftoa converts a float to a string with no trailing zeros. -func Ftoa(num float64) string { - return stripTrailingZeros(strconv.FormatFloat(num, 'f', 6, 64)) -} - -// FtoaWithDigits converts a float to a string but limits the resulting string -// to the given number of decimal places, and no trailing zeros. -func FtoaWithDigits(num float64, digits int) string { - return stripTrailingZeros(stripTrailingDigits(strconv.FormatFloat(num, 'f', 6, 64), digits)) -} diff --git a/vendor/github.com/dustin/go-humanize/humanize.go b/vendor/github.com/dustin/go-humanize/humanize.go deleted file mode 100644 index a2c2da31ef..0000000000 --- a/vendor/github.com/dustin/go-humanize/humanize.go +++ /dev/null @@ -1,8 +0,0 @@ -/* -Package humanize converts boring ugly numbers to human-friendly strings and back. - -Durations can be turned into strings such as "3 days ago", numbers -representing sizes like 82854982 into useful strings like, "83 MB" or -"79 MiB" (whichever you prefer). -*/ -package humanize diff --git a/vendor/github.com/dustin/go-humanize/number.go b/vendor/github.com/dustin/go-humanize/number.go deleted file mode 100644 index 6470d0d47a..0000000000 --- a/vendor/github.com/dustin/go-humanize/number.go +++ /dev/null @@ -1,192 +0,0 @@ -package humanize - -/* -Slightly adapted from the source to fit go-humanize. - -Author: https://github.com/gorhill -Source: https://gist.github.com/gorhill/5285193 - -*/ - -import ( - "math" - "strconv" -) - -var ( - renderFloatPrecisionMultipliers = [...]float64{ - 1, - 10, - 100, - 1000, - 10000, - 100000, - 1000000, - 10000000, - 100000000, - 1000000000, - } - - renderFloatPrecisionRounders = [...]float64{ - 0.5, - 0.05, - 0.005, - 0.0005, - 0.00005, - 0.000005, - 0.0000005, - 0.00000005, - 0.000000005, - 0.0000000005, - } -) - -// FormatFloat produces a formatted number as string based on the following user-specified criteria: -// * thousands separator -// * decimal separator -// * decimal precision -// -// Usage: s := RenderFloat(format, n) -// The format parameter tells how to render the number n. -// -// See examples: http://play.golang.org/p/LXc1Ddm1lJ -// -// Examples of format strings, given n = 12345.6789: -// "#,###.##" => "12,345.67" -// "#,###." => "12,345" -// "#,###" => "12345,678" -// "#\u202F###,##" => "12 345,68" -// "#.###,###### => 12.345,678900 -// "" (aka default format) => 12,345.67 -// -// The highest precision allowed is 9 digits after the decimal symbol. -// There is also a version for integer number, FormatInteger(), -// which is convenient for calls within template. -func FormatFloat(format string, n float64) string { - // Special cases: - // NaN = "NaN" - // +Inf = "+Infinity" - // -Inf = "-Infinity" - if math.IsNaN(n) { - return "NaN" - } - if n > math.MaxFloat64 { - return "Infinity" - } - if n < (0.0 - math.MaxFloat64) { - return "-Infinity" - } - - // default format - precision := 2 - decimalStr := "." - thousandStr := "," - positiveStr := "" - negativeStr := "-" - - if len(format) > 0 { - format := []rune(format) - - // If there is an explicit format directive, - // then default values are these: - precision = 9 - thousandStr = "" - - // collect indices of meaningful formatting directives - formatIndx := []int{} - for i, char := range format { - if char != '#' && char != '0' { - formatIndx = append(formatIndx, i) - } - } - - if len(formatIndx) > 0 { - // Directive at index 0: - // Must be a '+' - // Raise an error if not the case - // index: 0123456789 - // +0.000,000 - // +000,000.0 - // +0000.00 - // +0000 - if formatIndx[0] == 0 { - if format[formatIndx[0]] != '+' { - panic("RenderFloat(): invalid positive sign directive") - } - positiveStr = "+" - formatIndx = formatIndx[1:] - } - - // Two directives: - // First is thousands separator - // Raise an error if not followed by 3-digit - // 0123456789 - // 0.000,000 - // 000,000.00 - if len(formatIndx) == 2 { - if (formatIndx[1] - formatIndx[0]) != 4 { - panic("RenderFloat(): thousands separator directive must be followed by 3 digit-specifiers") - } - thousandStr = string(format[formatIndx[0]]) - formatIndx = formatIndx[1:] - } - - // One directive: - // Directive is decimal separator - // The number of digit-specifier following the separator indicates wanted precision - // 0123456789 - // 0.00 - // 000,0000 - if len(formatIndx) == 1 { - decimalStr = string(format[formatIndx[0]]) - precision = len(format) - formatIndx[0] - 1 - } - } - } - - // generate sign part - var signStr string - if n >= 0.000000001 { - signStr = positiveStr - } else if n <= -0.000000001 { - signStr = negativeStr - n = -n - } else { - signStr = "" - n = 0.0 - } - - // split number into integer and fractional parts - intf, fracf := math.Modf(n + renderFloatPrecisionRounders[precision]) - - // generate integer part string - intStr := strconv.FormatInt(int64(intf), 10) - - // add thousand separator if required - if len(thousandStr) > 0 { - for i := len(intStr); i > 3; { - i -= 3 - intStr = intStr[:i] + thousandStr + intStr[i:] - } - } - - // no fractional part, we can leave now - if precision == 0 { - return signStr + intStr - } - - // generate fractional part - fracStr := strconv.Itoa(int(fracf * renderFloatPrecisionMultipliers[precision])) - // may need padding - if len(fracStr) < precision { - fracStr = "000000000000000"[:precision-len(fracStr)] + fracStr - } - - return signStr + intStr + decimalStr + fracStr -} - -// FormatInteger produces a formatted number as string. -// See FormatFloat. -func FormatInteger(format string, n int) string { - return FormatFloat(format, float64(n)) -} diff --git a/vendor/github.com/dustin/go-humanize/ordinals.go b/vendor/github.com/dustin/go-humanize/ordinals.go deleted file mode 100644 index 43d88a8619..0000000000 --- a/vendor/github.com/dustin/go-humanize/ordinals.go +++ /dev/null @@ -1,25 +0,0 @@ -package humanize - -import "strconv" - -// Ordinal gives you the input number in a rank/ordinal format. -// -// Ordinal(3) -> 3rd -func Ordinal(x int) string { - suffix := "th" - switch x % 10 { - case 1: - if x%100 != 11 { - suffix = "st" - } - case 2: - if x%100 != 12 { - suffix = "nd" - } - case 3: - if x%100 != 13 { - suffix = "rd" - } - } - return strconv.Itoa(x) + suffix -} diff --git a/vendor/github.com/dustin/go-humanize/si.go b/vendor/github.com/dustin/go-humanize/si.go deleted file mode 100644 index 8b85019849..0000000000 --- a/vendor/github.com/dustin/go-humanize/si.go +++ /dev/null @@ -1,127 +0,0 @@ -package humanize - -import ( - "errors" - "math" - "regexp" - "strconv" -) - -var siPrefixTable = map[float64]string{ - -30: "q", // quecto - -27: "r", // ronto - -24: "y", // yocto - -21: "z", // zepto - -18: "a", // atto - -15: "f", // femto - -12: "p", // pico - -9: "n", // nano - -6: "µ", // micro - -3: "m", // milli - 0: "", - 3: "k", // kilo - 6: "M", // mega - 9: "G", // giga - 12: "T", // tera - 15: "P", // peta - 18: "E", // exa - 21: "Z", // zetta - 24: "Y", // yotta - 27: "R", // ronna - 30: "Q", // quetta -} - -var revSIPrefixTable = revfmap(siPrefixTable) - -// revfmap reverses the map and precomputes the power multiplier -func revfmap(in map[float64]string) map[string]float64 { - rv := map[string]float64{} - for k, v := range in { - rv[v] = math.Pow(10, k) - } - return rv -} - -var riParseRegex *regexp.Regexp - -func init() { - ri := `^([\-0-9.]+)\s?([` - for _, v := range siPrefixTable { - ri += v - } - ri += `]?)(.*)` - - riParseRegex = regexp.MustCompile(ri) -} - -// ComputeSI finds the most appropriate SI prefix for the given number -// and returns the prefix along with the value adjusted to be within -// that prefix. -// -// See also: SI, ParseSI. -// -// e.g. ComputeSI(2.2345e-12) -> (2.2345, "p") -func ComputeSI(input float64) (float64, string) { - if input == 0 { - return 0, "" - } - mag := math.Abs(input) - exponent := math.Floor(logn(mag, 10)) - exponent = math.Floor(exponent/3) * 3 - - value := mag / math.Pow(10, exponent) - - // Handle special case where value is exactly 1000.0 - // Should return 1 M instead of 1000 k - if value == 1000.0 { - exponent += 3 - value = mag / math.Pow(10, exponent) - } - - value = math.Copysign(value, input) - - prefix := siPrefixTable[exponent] - return value, prefix -} - -// SI returns a string with default formatting. -// -// SI uses Ftoa to format float value, removing trailing zeros. -// -// See also: ComputeSI, ParseSI. -// -// e.g. SI(1000000, "B") -> 1 MB -// e.g. SI(2.2345e-12, "F") -> 2.2345 pF -func SI(input float64, unit string) string { - value, prefix := ComputeSI(input) - return Ftoa(value) + " " + prefix + unit -} - -// SIWithDigits works like SI but limits the resulting string to the -// given number of decimal places. -// -// e.g. SIWithDigits(1000000, 0, "B") -> 1 MB -// e.g. SIWithDigits(2.2345e-12, 2, "F") -> 2.23 pF -func SIWithDigits(input float64, decimals int, unit string) string { - value, prefix := ComputeSI(input) - return FtoaWithDigits(value, decimals) + " " + prefix + unit -} - -var errInvalid = errors.New("invalid input") - -// ParseSI parses an SI string back into the number and unit. -// -// See also: SI, ComputeSI. -// -// e.g. ParseSI("2.2345 pF") -> (2.2345e-12, "F", nil) -func ParseSI(input string) (float64, string, error) { - found := riParseRegex.FindStringSubmatch(input) - if len(found) != 4 { - return 0, "", errInvalid - } - mag := revSIPrefixTable[found[2]] - unit := found[3] - - base, err := strconv.ParseFloat(found[1], 64) - return base * mag, unit, err -} diff --git a/vendor/github.com/dustin/go-humanize/times.go b/vendor/github.com/dustin/go-humanize/times.go deleted file mode 100644 index dd3fbf5efc..0000000000 --- a/vendor/github.com/dustin/go-humanize/times.go +++ /dev/null @@ -1,117 +0,0 @@ -package humanize - -import ( - "fmt" - "math" - "sort" - "time" -) - -// Seconds-based time units -const ( - Day = 24 * time.Hour - Week = 7 * Day - Month = 30 * Day - Year = 12 * Month - LongTime = 37 * Year -) - -// Time formats a time into a relative string. -// -// Time(someT) -> "3 weeks ago" -func Time(then time.Time) string { - return RelTime(then, time.Now(), "ago", "from now") -} - -// A RelTimeMagnitude struct contains a relative time point at which -// the relative format of time will switch to a new format string. A -// slice of these in ascending order by their "D" field is passed to -// CustomRelTime to format durations. -// -// The Format field is a string that may contain a "%s" which will be -// replaced with the appropriate signed label (e.g. "ago" or "from -// now") and a "%d" that will be replaced by the quantity. -// -// The DivBy field is the amount of time the time difference must be -// divided by in order to display correctly. -// -// e.g. if D is 2*time.Minute and you want to display "%d minutes %s" -// DivBy should be time.Minute so whatever the duration is will be -// expressed in minutes. -type RelTimeMagnitude struct { - D time.Duration - Format string - DivBy time.Duration -} - -var defaultMagnitudes = []RelTimeMagnitude{ - {time.Second, "now", time.Second}, - {2 * time.Second, "1 second %s", 1}, - {time.Minute, "%d seconds %s", time.Second}, - {2 * time.Minute, "1 minute %s", 1}, - {time.Hour, "%d minutes %s", time.Minute}, - {2 * time.Hour, "1 hour %s", 1}, - {Day, "%d hours %s", time.Hour}, - {2 * Day, "1 day %s", 1}, - {Week, "%d days %s", Day}, - {2 * Week, "1 week %s", 1}, - {Month, "%d weeks %s", Week}, - {2 * Month, "1 month %s", 1}, - {Year, "%d months %s", Month}, - {18 * Month, "1 year %s", 1}, - {2 * Year, "2 years %s", 1}, - {LongTime, "%d years %s", Year}, - {math.MaxInt64, "a long while %s", 1}, -} - -// RelTime formats a time into a relative string. -// -// It takes two times and two labels. In addition to the generic time -// delta string (e.g. 5 minutes), the labels are used applied so that -// the label corresponding to the smaller time is applied. -// -// RelTime(timeInPast, timeInFuture, "earlier", "later") -> "3 weeks earlier" -func RelTime(a, b time.Time, albl, blbl string) string { - return CustomRelTime(a, b, albl, blbl, defaultMagnitudes) -} - -// CustomRelTime formats a time into a relative string. -// -// It takes two times two labels and a table of relative time formats. -// In addition to the generic time delta string (e.g. 5 minutes), the -// labels are used applied so that the label corresponding to the -// smaller time is applied. -func CustomRelTime(a, b time.Time, albl, blbl string, magnitudes []RelTimeMagnitude) string { - lbl := albl - diff := b.Sub(a) - - if a.After(b) { - lbl = blbl - diff = a.Sub(b) - } - - n := sort.Search(len(magnitudes), func(i int) bool { - return magnitudes[i].D > diff - }) - - if n >= len(magnitudes) { - n = len(magnitudes) - 1 - } - mag := magnitudes[n] - args := []interface{}{} - escaped := false - for _, ch := range mag.Format { - if escaped { - switch ch { - case 's': - args = append(args, lbl) - case 'd': - args = append(args, diff/mag.DivBy) - } - escaped = false - } else { - escaped = ch == '%' - } - } - return fmt.Sprintf(mag.Format, args...) -} diff --git a/vendor/github.com/gogo/protobuf/AUTHORS b/vendor/github.com/gogo/protobuf/AUTHORS deleted file mode 100644 index 3d97fc7a29..0000000000 --- a/vendor/github.com/gogo/protobuf/AUTHORS +++ /dev/null @@ -1,15 +0,0 @@ -# This is the official list of GoGo authors for copyright purposes. -# This file is distinct from the CONTRIBUTORS file, which -# lists people. For example, employees are listed in CONTRIBUTORS, -# but not in AUTHORS, because the employer holds the copyright. - -# Names should be added to this file as one of -# Organization's name -# Individual's name -# Individual's name - -# Please keep the list sorted. - -Sendgrid, Inc -Vastech SA (PTY) LTD -Walter Schulze diff --git a/vendor/github.com/gogo/protobuf/CONTRIBUTORS b/vendor/github.com/gogo/protobuf/CONTRIBUTORS deleted file mode 100644 index 1b4f6c208a..0000000000 --- a/vendor/github.com/gogo/protobuf/CONTRIBUTORS +++ /dev/null @@ -1,23 +0,0 @@ -Anton Povarov -Brian Goff -Clayton Coleman -Denis Smirnov -DongYun Kang -Dwayne Schultz -Georg Apitz -Gustav Paul -Johan Brandhorst -John Shahid -John Tuley -Laurent -Patrick Lee -Peter Edge -Roger Johansson -Sam Nguyen -Sergio Arbeo -Stephen J Day -Tamir Duberstein -Todd Eisenberger -Tormod Erevik Lea -Vyacheslav Kim -Walter Schulze diff --git a/vendor/github.com/gogo/protobuf/LICENSE b/vendor/github.com/gogo/protobuf/LICENSE deleted file mode 100644 index f57de90da8..0000000000 --- a/vendor/github.com/gogo/protobuf/LICENSE +++ /dev/null @@ -1,35 +0,0 @@ -Copyright (c) 2013, The GoGo Authors. All rights reserved. - -Protocol Buffers for Go with Gadgets - -Go support for Protocol Buffers - Google's data interchange format - -Copyright 2010 The Go Authors. All rights reserved. -https://github.com/golang/protobuf - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/github.com/gogo/protobuf/proto/Makefile b/vendor/github.com/gogo/protobuf/proto/Makefile deleted file mode 100644 index 00d65f3277..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -install: - go install - -test: install generate-test-pbs - go test - - -generate-test-pbs: - make install - make -C test_proto - make -C proto3_proto - make diff --git a/vendor/github.com/gogo/protobuf/proto/clone.go b/vendor/github.com/gogo/protobuf/proto/clone.go deleted file mode 100644 index a26b046d94..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/clone.go +++ /dev/null @@ -1,258 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Protocol buffer deep copy and merge. -// TODO: RawMessage. - -package proto - -import ( - "fmt" - "log" - "reflect" - "strings" -) - -// Clone returns a deep copy of a protocol buffer. -func Clone(src Message) Message { - in := reflect.ValueOf(src) - if in.IsNil() { - return src - } - out := reflect.New(in.Type().Elem()) - dst := out.Interface().(Message) - Merge(dst, src) - return dst -} - -// Merger is the interface representing objects that can merge messages of the same type. -type Merger interface { - // Merge merges src into this message. - // Required and optional fields that are set in src will be set to that value in dst. - // Elements of repeated fields will be appended. - // - // Merge may panic if called with a different argument type than the receiver. - Merge(src Message) -} - -// generatedMerger is the custom merge method that generated protos will have. -// We must add this method since a generate Merge method will conflict with -// many existing protos that have a Merge data field already defined. -type generatedMerger interface { - XXX_Merge(src Message) -} - -// Merge merges src into dst. -// Required and optional fields that are set in src will be set to that value in dst. -// Elements of repeated fields will be appended. -// Merge panics if src and dst are not the same type, or if dst is nil. -func Merge(dst, src Message) { - if m, ok := dst.(Merger); ok { - m.Merge(src) - return - } - - in := reflect.ValueOf(src) - out := reflect.ValueOf(dst) - if out.IsNil() { - panic("proto: nil destination") - } - if in.Type() != out.Type() { - panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) - } - if in.IsNil() { - return // Merge from nil src is a noop - } - if m, ok := dst.(generatedMerger); ok { - m.XXX_Merge(src) - return - } - mergeStruct(out.Elem(), in.Elem()) -} - -func mergeStruct(out, in reflect.Value) { - sprop := GetProperties(in.Type()) - for i := 0; i < in.NumField(); i++ { - f := in.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) - } - - if emIn, ok := in.Addr().Interface().(extensionsBytes); ok { - emOut := out.Addr().Interface().(extensionsBytes) - bIn := emIn.GetExtensions() - bOut := emOut.GetExtensions() - *bOut = append(*bOut, *bIn...) - } else if emIn, err := extendable(in.Addr().Interface()); err == nil { - emOut, _ := extendable(out.Addr().Interface()) - mIn, muIn := emIn.extensionsRead() - if mIn != nil { - mOut := emOut.extensionsWrite() - muIn.Lock() - mergeExtension(mOut, mIn) - muIn.Unlock() - } - } - - uf := in.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return - } - uin := uf.Bytes() - if len(uin) > 0 { - out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) - } -} - -// mergeAny performs a merge between two values of the same type. -// viaPtr indicates whether the values were indirected through a pointer (implying proto2). -// prop is set if this is a struct field (it may be nil). -func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { - if in.Type() == protoMessageType { - if !in.IsNil() { - if out.IsNil() { - out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) - } else { - Merge(out.Interface().(Message), in.Interface().(Message)) - } - } - return - } - switch in.Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - if !viaPtr && isProto3Zero(in) { - return - } - out.Set(in) - case reflect.Interface: - // Probably a oneof field; copy non-nil values. - if in.IsNil() { - return - } - // Allocate destination if it is not set, or set to a different type. - // Otherwise we will merge as normal. - if out.IsNil() || out.Elem().Type() != in.Elem().Type() { - out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) - } - mergeAny(out.Elem(), in.Elem(), false, nil) - case reflect.Map: - if in.Len() == 0 { - return - } - if out.IsNil() { - out.Set(reflect.MakeMap(in.Type())) - } - // For maps with value types of *T or []byte we need to deep copy each value. - elemKind := in.Type().Elem().Kind() - for _, key := range in.MapKeys() { - var val reflect.Value - switch elemKind { - case reflect.Ptr: - val = reflect.New(in.Type().Elem().Elem()) - mergeAny(val, in.MapIndex(key), false, nil) - case reflect.Slice: - val = in.MapIndex(key) - val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) - default: - val = in.MapIndex(key) - } - out.SetMapIndex(key, val) - } - case reflect.Ptr: - if in.IsNil() { - return - } - if out.IsNil() { - out.Set(reflect.New(in.Elem().Type())) - } - mergeAny(out.Elem(), in.Elem(), true, nil) - case reflect.Slice: - if in.IsNil() { - return - } - if in.Type().Elem().Kind() == reflect.Uint8 { - // []byte is a scalar bytes field, not a repeated field. - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value, and should not - // be merged. - if prop != nil && prop.proto3 && in.Len() == 0 { - return - } - - // Make a deep copy. - // Append to []byte{} instead of []byte(nil) so that we never end up - // with a nil result. - out.SetBytes(append([]byte{}, in.Bytes()...)) - return - } - n := in.Len() - if out.IsNil() { - out.Set(reflect.MakeSlice(in.Type(), 0, n)) - } - switch in.Type().Elem().Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - out.Set(reflect.AppendSlice(out, in)) - default: - for i := 0; i < n; i++ { - x := reflect.Indirect(reflect.New(in.Type().Elem())) - mergeAny(x, in.Index(i), false, nil) - out.Set(reflect.Append(out, x)) - } - } - case reflect.Struct: - mergeStruct(out, in) - default: - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to copy %v", in) - } -} - -func mergeExtension(out, in map[int32]Extension) { - for extNum, eIn := range in { - eOut := Extension{desc: eIn.desc} - if eIn.value != nil { - v := reflect.New(reflect.TypeOf(eIn.value)).Elem() - mergeAny(v, reflect.ValueOf(eIn.value), false, nil) - eOut.value = v.Interface() - } - if eIn.enc != nil { - eOut.enc = make([]byte, len(eIn.enc)) - copy(eOut.enc, eIn.enc) - } - - out[extNum] = eOut - } -} diff --git a/vendor/github.com/gogo/protobuf/proto/custom_gogo.go b/vendor/github.com/gogo/protobuf/proto/custom_gogo.go deleted file mode 100644 index 24552483c6..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/custom_gogo.go +++ /dev/null @@ -1,39 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2018, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import "reflect" - -type custom interface { - Marshal() ([]byte, error) - Unmarshal(data []byte) error - Size() int -} - -var customType = reflect.TypeOf((*custom)(nil)).Elem() diff --git a/vendor/github.com/gogo/protobuf/proto/decode.go b/vendor/github.com/gogo/protobuf/proto/decode.go deleted file mode 100644 index 63b0f08bef..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/decode.go +++ /dev/null @@ -1,427 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for decoding protocol buffer data to construct in-memory representations. - */ - -import ( - "errors" - "fmt" - "io" -) - -// errOverflow is returned when an integer is too large to be represented. -var errOverflow = errors.New("proto: integer overflow") - -// ErrInternalBadWireType is returned by generated code when an incorrect -// wire type is encountered. It does not get returned to user code. -var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") - -// DecodeVarint reads a varint-encoded integer from the slice. -// It returns the integer and the number of bytes consumed, or -// zero if there is not enough. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func DecodeVarint(buf []byte) (x uint64, n int) { - for shift := uint(0); shift < 64; shift += 7 { - if n >= len(buf) { - return 0, 0 - } - b := uint64(buf[n]) - n++ - x |= (b & 0x7F) << shift - if (b & 0x80) == 0 { - return x, n - } - } - - // The number is too large to represent in a 64-bit value. - return 0, 0 -} - -func (p *Buffer) decodeVarintSlow() (x uint64, err error) { - i := p.index - l := len(p.buf) - - for shift := uint(0); shift < 64; shift += 7 { - if i >= l { - err = io.ErrUnexpectedEOF - return - } - b := p.buf[i] - i++ - x |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - p.index = i - return - } - } - - // The number is too large to represent in a 64-bit value. - err = errOverflow - return -} - -// DecodeVarint reads a varint-encoded integer from the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) DecodeVarint() (x uint64, err error) { - i := p.index - buf := p.buf - - if i >= len(buf) { - return 0, io.ErrUnexpectedEOF - } else if buf[i] < 0x80 { - p.index++ - return uint64(buf[i]), nil - } else if len(buf)-i < 10 { - return p.decodeVarintSlow() - } - - var b uint64 - // we already checked the first byte - x = uint64(buf[i]) - 0x80 - i++ - - b = uint64(buf[i]) - i++ - x += b << 7 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 7 - - b = uint64(buf[i]) - i++ - x += b << 14 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 14 - - b = uint64(buf[i]) - i++ - x += b << 21 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 21 - - b = uint64(buf[i]) - i++ - x += b << 28 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 28 - - b = uint64(buf[i]) - i++ - x += b << 35 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 35 - - b = uint64(buf[i]) - i++ - x += b << 42 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 42 - - b = uint64(buf[i]) - i++ - x += b << 49 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 49 - - b = uint64(buf[i]) - i++ - x += b << 56 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 56 - - b = uint64(buf[i]) - i++ - x += b << 63 - if b&0x80 == 0 { - goto done - } - - return 0, errOverflow - -done: - p.index = i - return x, nil -} - -// DecodeFixed64 reads a 64-bit integer from the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) DecodeFixed64() (x uint64, err error) { - // x, err already 0 - i := p.index + 8 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-8]) - x |= uint64(p.buf[i-7]) << 8 - x |= uint64(p.buf[i-6]) << 16 - x |= uint64(p.buf[i-5]) << 24 - x |= uint64(p.buf[i-4]) << 32 - x |= uint64(p.buf[i-3]) << 40 - x |= uint64(p.buf[i-2]) << 48 - x |= uint64(p.buf[i-1]) << 56 - return -} - -// DecodeFixed32 reads a 32-bit integer from the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) DecodeFixed32() (x uint64, err error) { - // x, err already 0 - i := p.index + 4 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-4]) - x |= uint64(p.buf[i-3]) << 8 - x |= uint64(p.buf[i-2]) << 16 - x |= uint64(p.buf[i-1]) << 24 - return -} - -// DecodeZigzag64 reads a zigzag-encoded 64-bit integer -// from the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) DecodeZigzag64() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) - return -} - -// DecodeZigzag32 reads a zigzag-encoded 32-bit integer -// from the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) DecodeZigzag32() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) - return -} - -// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { - n, err := p.DecodeVarint() - if err != nil { - return nil, err - } - - nb := int(n) - if nb < 0 { - return nil, fmt.Errorf("proto: bad byte length %d", nb) - } - end := p.index + nb - if end < p.index || end > len(p.buf) { - return nil, io.ErrUnexpectedEOF - } - - if !alloc { - // todo: check if can get more uses of alloc=false - buf = p.buf[p.index:end] - p.index += nb - return - } - - buf = make([]byte, nb) - copy(buf, p.buf[p.index:]) - p.index += nb - return -} - -// DecodeStringBytes reads an encoded string from the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) DecodeStringBytes() (s string, err error) { - buf, err := p.DecodeRawBytes(false) - if err != nil { - return - } - return string(buf), nil -} - -// Unmarshaler is the interface representing objects that can -// unmarshal themselves. The argument points to data that may be -// overwritten, so implementations should not keep references to the -// buffer. -// Unmarshal implementations should not clear the receiver. -// Any unmarshaled data should be merged into the receiver. -// Callers of Unmarshal that do not want to retain existing data -// should Reset the receiver before calling Unmarshal. -type Unmarshaler interface { - Unmarshal([]byte) error -} - -// newUnmarshaler is the interface representing objects that can -// unmarshal themselves. The semantics are identical to Unmarshaler. -// -// This exists to support protoc-gen-go generated messages. -// The proto package will stop type-asserting to this interface in the future. -// -// DO NOT DEPEND ON THIS. -type newUnmarshaler interface { - XXX_Unmarshal([]byte) error -} - -// Unmarshal parses the protocol buffer representation in buf and places the -// decoded result in pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// Unmarshal resets pb before starting to unmarshal, so any -// existing data in pb is always removed. Use UnmarshalMerge -// to preserve and append to existing data. -func Unmarshal(buf []byte, pb Message) error { - pb.Reset() - if u, ok := pb.(newUnmarshaler); ok { - return u.XXX_Unmarshal(buf) - } - if u, ok := pb.(Unmarshaler); ok { - return u.Unmarshal(buf) - } - return NewBuffer(buf).Unmarshal(pb) -} - -// UnmarshalMerge parses the protocol buffer representation in buf and -// writes the decoded result to pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// UnmarshalMerge merges into existing data in pb. -// Most code should use Unmarshal instead. -func UnmarshalMerge(buf []byte, pb Message) error { - if u, ok := pb.(newUnmarshaler); ok { - return u.XXX_Unmarshal(buf) - } - if u, ok := pb.(Unmarshaler); ok { - // NOTE: The history of proto have unfortunately been inconsistent - // whether Unmarshaler should or should not implicitly clear itself. - // Some implementations do, most do not. - // Thus, calling this here may or may not do what people want. - // - // See https://github.com/golang/protobuf/issues/424 - return u.Unmarshal(buf) - } - return NewBuffer(buf).Unmarshal(pb) -} - -// DecodeMessage reads a count-delimited message from the Buffer. -func (p *Buffer) DecodeMessage(pb Message) error { - enc, err := p.DecodeRawBytes(false) - if err != nil { - return err - } - return NewBuffer(enc).Unmarshal(pb) -} - -// DecodeGroup reads a tag-delimited group from the Buffer. -// StartGroup tag is already consumed. This function consumes -// EndGroup tag. -func (p *Buffer) DecodeGroup(pb Message) error { - b := p.buf[p.index:] - x, y := findEndGroup(b) - if x < 0 { - return io.ErrUnexpectedEOF - } - err := Unmarshal(b[:x], pb) - p.index += y - return err -} - -// Unmarshal parses the protocol buffer representation in the -// Buffer and places the decoded result in pb. If the struct -// underlying pb does not match the data in the buffer, the results can be -// unpredictable. -// -// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. -func (p *Buffer) Unmarshal(pb Message) error { - // If the object can unmarshal itself, let it. - if u, ok := pb.(newUnmarshaler); ok { - err := u.XXX_Unmarshal(p.buf[p.index:]) - p.index = len(p.buf) - return err - } - if u, ok := pb.(Unmarshaler); ok { - // NOTE: The history of proto have unfortunately been inconsistent - // whether Unmarshaler should or should not implicitly clear itself. - // Some implementations do, most do not. - // Thus, calling this here may or may not do what people want. - // - // See https://github.com/golang/protobuf/issues/424 - err := u.Unmarshal(p.buf[p.index:]) - p.index = len(p.buf) - return err - } - - // Slow workaround for messages that aren't Unmarshalers. - // This includes some hand-coded .pb.go files and - // bootstrap protos. - // TODO: fix all of those and then add Unmarshal to - // the Message interface. Then: - // The cast above and code below can be deleted. - // The old unmarshaler can be deleted. - // Clients can call Unmarshal directly (can already do that, actually). - var info InternalMessageInfo - err := info.Unmarshal(pb, p.buf[p.index:]) - p.index = len(p.buf) - return err -} diff --git a/vendor/github.com/gogo/protobuf/proto/deprecated.go b/vendor/github.com/gogo/protobuf/proto/deprecated.go deleted file mode 100644 index 35b882c09a..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/deprecated.go +++ /dev/null @@ -1,63 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2018 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import "errors" - -// Deprecated: do not use. -type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 } - -// Deprecated: do not use. -func GetStats() Stats { return Stats{} } - -// Deprecated: do not use. -func MarshalMessageSet(interface{}) ([]byte, error) { - return nil, errors.New("proto: not implemented") -} - -// Deprecated: do not use. -func UnmarshalMessageSet([]byte, interface{}) error { - return errors.New("proto: not implemented") -} - -// Deprecated: do not use. -func MarshalMessageSetJSON(interface{}) ([]byte, error) { - return nil, errors.New("proto: not implemented") -} - -// Deprecated: do not use. -func UnmarshalMessageSetJSON([]byte, interface{}) error { - return errors.New("proto: not implemented") -} - -// Deprecated: do not use. -func RegisterMessageSetType(Message, int32, string) {} diff --git a/vendor/github.com/gogo/protobuf/proto/discard.go b/vendor/github.com/gogo/protobuf/proto/discard.go deleted file mode 100644 index fe1bd7d904..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/discard.go +++ /dev/null @@ -1,350 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2017 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "reflect" - "strings" - "sync" - "sync/atomic" -) - -type generatedDiscarder interface { - XXX_DiscardUnknown() -} - -// DiscardUnknown recursively discards all unknown fields from this message -// and all embedded messages. -// -// When unmarshaling a message with unrecognized fields, the tags and values -// of such fields are preserved in the Message. This allows a later call to -// marshal to be able to produce a message that continues to have those -// unrecognized fields. To avoid this, DiscardUnknown is used to -// explicitly clear the unknown fields after unmarshaling. -// -// For proto2 messages, the unknown fields of message extensions are only -// discarded from messages that have been accessed via GetExtension. -func DiscardUnknown(m Message) { - if m, ok := m.(generatedDiscarder); ok { - m.XXX_DiscardUnknown() - return - } - // TODO: Dynamically populate a InternalMessageInfo for legacy messages, - // but the master branch has no implementation for InternalMessageInfo, - // so it would be more work to replicate that approach. - discardLegacy(m) -} - -// DiscardUnknown recursively discards all unknown fields. -func (a *InternalMessageInfo) DiscardUnknown(m Message) { - di := atomicLoadDiscardInfo(&a.discard) - if di == nil { - di = getDiscardInfo(reflect.TypeOf(m).Elem()) - atomicStoreDiscardInfo(&a.discard, di) - } - di.discard(toPointer(&m)) -} - -type discardInfo struct { - typ reflect.Type - - initialized int32 // 0: only typ is valid, 1: everything is valid - lock sync.Mutex - - fields []discardFieldInfo - unrecognized field -} - -type discardFieldInfo struct { - field field // Offset of field, guaranteed to be valid - discard func(src pointer) -} - -var ( - discardInfoMap = map[reflect.Type]*discardInfo{} - discardInfoLock sync.Mutex -) - -func getDiscardInfo(t reflect.Type) *discardInfo { - discardInfoLock.Lock() - defer discardInfoLock.Unlock() - di := discardInfoMap[t] - if di == nil { - di = &discardInfo{typ: t} - discardInfoMap[t] = di - } - return di -} - -func (di *discardInfo) discard(src pointer) { - if src.isNil() { - return // Nothing to do. - } - - if atomic.LoadInt32(&di.initialized) == 0 { - di.computeDiscardInfo() - } - - for _, fi := range di.fields { - sfp := src.offset(fi.field) - fi.discard(sfp) - } - - // For proto2 messages, only discard unknown fields in message extensions - // that have been accessed via GetExtension. - if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { - // Ignore lock since DiscardUnknown is not concurrency safe. - emm, _ := em.extensionsRead() - for _, mx := range emm { - if m, ok := mx.value.(Message); ok { - DiscardUnknown(m) - } - } - } - - if di.unrecognized.IsValid() { - *src.offset(di.unrecognized).toBytes() = nil - } -} - -func (di *discardInfo) computeDiscardInfo() { - di.lock.Lock() - defer di.lock.Unlock() - if di.initialized != 0 { - return - } - t := di.typ - n := t.NumField() - - for i := 0; i < n; i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - - dfi := discardFieldInfo{field: toField(&f)} - tf := f.Type - - // Unwrap tf to get its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) - } - - switch tf.Kind() { - case reflect.Struct: - switch { - case !isPointer: - panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) - case isSlice: // E.g., []*pb.T - discardInfo := getDiscardInfo(tf) - dfi.discard = func(src pointer) { - sps := src.getPointerSlice() - for _, sp := range sps { - if !sp.isNil() { - discardInfo.discard(sp) - } - } - } - default: // E.g., *pb.T - discardInfo := getDiscardInfo(tf) - dfi.discard = func(src pointer) { - sp := src.getPointer() - if !sp.isNil() { - discardInfo.discard(sp) - } - } - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) - default: // E.g., map[K]V - if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) - dfi.discard = func(src pointer) { - sm := src.asPointerTo(tf).Elem() - if sm.Len() == 0 { - return - } - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - DiscardUnknown(val.Interface().(Message)) - } - } - } else { - dfi.discard = func(pointer) {} // Noop - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) - default: // E.g., interface{} - // TODO: Make this faster? - dfi.discard = func(src pointer) { - su := src.asPointerTo(tf).Elem() - if !su.IsNil() { - sv := su.Elem().Elem().Field(0) - if sv.Kind() == reflect.Ptr && sv.IsNil() { - return - } - switch sv.Type().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - DiscardUnknown(sv.Interface().(Message)) - } - } - } - } - default: - continue - } - di.fields = append(di.fields, dfi) - } - - di.unrecognized = invalidField - if f, ok := t.FieldByName("XXX_unrecognized"); ok { - if f.Type != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - di.unrecognized = toField(&f) - } - - atomic.StoreInt32(&di.initialized, 1) -} - -func discardLegacy(m Message) { - v := reflect.ValueOf(m) - if v.Kind() != reflect.Ptr || v.IsNil() { - return - } - v = v.Elem() - if v.Kind() != reflect.Struct { - return - } - t := v.Type() - - for i := 0; i < v.NumField(); i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - vf := v.Field(i) - tf := f.Type - - // Unwrap tf to get its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) - } - - switch tf.Kind() { - case reflect.Struct: - switch { - case !isPointer: - panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) - case isSlice: // E.g., []*pb.T - for j := 0; j < vf.Len(); j++ { - discardLegacy(vf.Index(j).Interface().(Message)) - } - default: // E.g., *pb.T - discardLegacy(vf.Interface().(Message)) - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) - default: // E.g., map[K]V - tv := vf.Type().Elem() - if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) - for _, key := range vf.MapKeys() { - val := vf.MapIndex(key) - discardLegacy(val.Interface().(Message)) - } - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) - default: // E.g., test_proto.isCommunique_Union interface - if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { - vf = vf.Elem() // E.g., *test_proto.Communique_Msg - if !vf.IsNil() { - vf = vf.Elem() // E.g., test_proto.Communique_Msg - vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value - if vf.Kind() == reflect.Ptr { - discardLegacy(vf.Interface().(Message)) - } - } - } - } - } - } - - if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { - if vf.Type() != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - vf.Set(reflect.ValueOf([]byte(nil))) - } - - // For proto2 messages, only discard unknown fields in message extensions - // that have been accessed via GetExtension. - if em, err := extendable(m); err == nil { - // Ignore lock since discardLegacy is not concurrency safe. - emm, _ := em.extensionsRead() - for _, mx := range emm { - if m, ok := mx.value.(Message); ok { - discardLegacy(m) - } - } - } -} diff --git a/vendor/github.com/gogo/protobuf/proto/duration.go b/vendor/github.com/gogo/protobuf/proto/duration.go deleted file mode 100644 index 93464c91cf..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/duration.go +++ /dev/null @@ -1,100 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// This file implements conversions between google.protobuf.Duration -// and time.Duration. - -import ( - "errors" - "fmt" - "time" -) - -const ( - // Range of a Duration in seconds, as specified in - // google/protobuf/duration.proto. This is about 10,000 years in seconds. - maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) - minSeconds = -maxSeconds -) - -// validateDuration determines whether the Duration is valid according to the -// definition in google/protobuf/duration.proto. A valid Duration -// may still be too large to fit into a time.Duration (the range of Duration -// is about 10,000 years, and the range of time.Duration is about 290). -func validateDuration(d *duration) error { - if d == nil { - return errors.New("duration: nil Duration") - } - if d.Seconds < minSeconds || d.Seconds > maxSeconds { - return fmt.Errorf("duration: %#v: seconds out of range", d) - } - if d.Nanos <= -1e9 || d.Nanos >= 1e9 { - return fmt.Errorf("duration: %#v: nanos out of range", d) - } - // Seconds and Nanos must have the same sign, unless d.Nanos is zero. - if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { - return fmt.Errorf("duration: %#v: seconds and nanos have different signs", d) - } - return nil -} - -// DurationFromProto converts a Duration to a time.Duration. DurationFromProto -// returns an error if the Duration is invalid or is too large to be -// represented in a time.Duration. -func durationFromProto(p *duration) (time.Duration, error) { - if err := validateDuration(p); err != nil { - return 0, err - } - d := time.Duration(p.Seconds) * time.Second - if int64(d/time.Second) != p.Seconds { - return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) - } - if p.Nanos != 0 { - d += time.Duration(p.Nanos) - if (d < 0) != (p.Nanos < 0) { - return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) - } - } - return d, nil -} - -// DurationProto converts a time.Duration to a Duration. -func durationProto(d time.Duration) *duration { - nanos := d.Nanoseconds() - secs := nanos / 1e9 - nanos -= secs * 1e9 - return &duration{ - Seconds: secs, - Nanos: int32(nanos), - } -} diff --git a/vendor/github.com/gogo/protobuf/proto/duration_gogo.go b/vendor/github.com/gogo/protobuf/proto/duration_gogo.go deleted file mode 100644 index e748e1730e..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/duration_gogo.go +++ /dev/null @@ -1,49 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2016, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "reflect" - "time" -) - -var durationType = reflect.TypeOf((*time.Duration)(nil)).Elem() - -type duration struct { - Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` - Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` -} - -func (m *duration) Reset() { *m = duration{} } -func (*duration) ProtoMessage() {} -func (*duration) String() string { return "duration" } - -func init() { - RegisterType((*duration)(nil), "gogo.protobuf.proto.duration") -} diff --git a/vendor/github.com/gogo/protobuf/proto/encode.go b/vendor/github.com/gogo/protobuf/proto/encode.go deleted file mode 100644 index 9581ccd304..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/encode.go +++ /dev/null @@ -1,205 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "errors" - "reflect" -) - -var ( - // errRepeatedHasNil is the error returned if Marshal is called with - // a struct with a repeated field containing a nil element. - errRepeatedHasNil = errors.New("proto: repeated field has nil element") - - // errOneofHasNil is the error returned if Marshal is called with - // a struct with a oneof field containing a nil element. - errOneofHasNil = errors.New("proto: oneof field has nil value") - - // ErrNil is the error returned if Marshal is called with nil. - ErrNil = errors.New("proto: Marshal called with nil") - - // ErrTooLarge is the error returned if Marshal is called with a - // message that encodes to >2GB. - ErrTooLarge = errors.New("proto: message encodes to over 2 GB") -) - -// The fundamental encoders that put bytes on the wire. -// Those that take integer types all accept uint64 and are -// therefore of type valueEncoder. - -const maxVarintBytes = 10 // maximum length of a varint - -// EncodeVarint returns the varint encoding of x. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -// Not used by the package itself, but helpful to clients -// wishing to use the same encoding. -func EncodeVarint(x uint64) []byte { - var buf [maxVarintBytes]byte - var n int - for n = 0; x > 127; n++ { - buf[n] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - buf[n] = uint8(x) - n++ - return buf[0:n] -} - -// EncodeVarint writes a varint-encoded integer to the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) EncodeVarint(x uint64) error { - for x >= 1<<7 { - p.buf = append(p.buf, uint8(x&0x7f|0x80)) - x >>= 7 - } - p.buf = append(p.buf, uint8(x)) - return nil -} - -// SizeVarint returns the varint encoding size of an integer. -func SizeVarint(x uint64) int { - switch { - case x < 1<<7: - return 1 - case x < 1<<14: - return 2 - case x < 1<<21: - return 3 - case x < 1<<28: - return 4 - case x < 1<<35: - return 5 - case x < 1<<42: - return 6 - case x < 1<<49: - return 7 - case x < 1<<56: - return 8 - case x < 1<<63: - return 9 - } - return 10 -} - -// EncodeFixed64 writes a 64-bit integer to the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) EncodeFixed64(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24), - uint8(x>>32), - uint8(x>>40), - uint8(x>>48), - uint8(x>>56)) - return nil -} - -// EncodeFixed32 writes a 32-bit integer to the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) EncodeFixed32(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24)) - return nil -} - -// EncodeZigzag64 writes a zigzag-encoded 64-bit integer -// to the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) EncodeZigzag64(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -// EncodeZigzag32 writes a zigzag-encoded 32-bit integer -// to the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) EncodeZigzag32(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - -// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) EncodeRawBytes(b []byte) error { - p.EncodeVarint(uint64(len(b))) - p.buf = append(p.buf, b...) - return nil -} - -// EncodeStringBytes writes an encoded string to the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) EncodeStringBytes(s string) error { - p.EncodeVarint(uint64(len(s))) - p.buf = append(p.buf, s...) - return nil -} - -// Marshaler is the interface representing objects that can marshal themselves. -type Marshaler interface { - Marshal() ([]byte, error) -} - -// EncodeMessage writes the protocol buffer to the Buffer, -// prefixed by a varint-encoded length. -func (p *Buffer) EncodeMessage(pb Message) error { - siz := Size(pb) - sizVar := SizeVarint(uint64(siz)) - p.grow(siz + sizVar) - p.EncodeVarint(uint64(siz)) - return p.Marshal(pb) -} - -// All protocol buffer fields are nillable, but be careful. -func isNil(v reflect.Value) bool { - switch v.Kind() { - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return v.IsNil() - } - return false -} diff --git a/vendor/github.com/gogo/protobuf/proto/encode_gogo.go b/vendor/github.com/gogo/protobuf/proto/encode_gogo.go deleted file mode 100644 index 0f5fb173e9..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/encode_gogo.go +++ /dev/null @@ -1,33 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -func NewRequiredNotSetError(field string) *RequiredNotSetError { - return &RequiredNotSetError{field} -} diff --git a/vendor/github.com/gogo/protobuf/proto/equal.go b/vendor/github.com/gogo/protobuf/proto/equal.go deleted file mode 100644 index d4db5a1c14..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/equal.go +++ /dev/null @@ -1,300 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Protocol buffer comparison. - -package proto - -import ( - "bytes" - "log" - "reflect" - "strings" -) - -/* -Equal returns true iff protocol buffers a and b are equal. -The arguments must both be pointers to protocol buffer structs. - -Equality is defined in this way: - - Two messages are equal iff they are the same type, - corresponding fields are equal, unknown field sets - are equal, and extensions sets are equal. - - Two set scalar fields are equal iff their values are equal. - If the fields are of a floating-point type, remember that - NaN != x for all x, including NaN. If the message is defined - in a proto3 .proto file, fields are not "set"; specifically, - zero length proto3 "bytes" fields are equal (nil == {}). - - Two repeated fields are equal iff their lengths are the same, - and their corresponding elements are equal. Note a "bytes" field, - although represented by []byte, is not a repeated field and the - rule for the scalar fields described above applies. - - Two unset fields are equal. - - Two unknown field sets are equal if their current - encoded state is equal. - - Two extension sets are equal iff they have corresponding - elements that are pairwise equal. - - Two map fields are equal iff their lengths are the same, - and they contain the same set of elements. Zero-length map - fields are equal. - - Every other combination of things are not equal. - -The return value is undefined if a and b are not protocol buffers. -*/ -func Equal(a, b Message) bool { - if a == nil || b == nil { - return a == b - } - v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) - if v1.Type() != v2.Type() { - return false - } - if v1.Kind() == reflect.Ptr { - if v1.IsNil() { - return v2.IsNil() - } - if v2.IsNil() { - return false - } - v1, v2 = v1.Elem(), v2.Elem() - } - if v1.Kind() != reflect.Struct { - return false - } - return equalStruct(v1, v2) -} - -// v1 and v2 are known to have the same type. -func equalStruct(v1, v2 reflect.Value) bool { - sprop := GetProperties(v1.Type()) - for i := 0; i < v1.NumField(); i++ { - f := v1.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - f1, f2 := v1.Field(i), v2.Field(i) - if f.Type.Kind() == reflect.Ptr { - if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { - // both unset - continue - } else if n1 != n2 { - // set/unset mismatch - return false - } - f1, f2 = f1.Elem(), f2.Elem() - } - if !equalAny(f1, f2, sprop.Prop[i]) { - return false - } - } - - if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_InternalExtensions") - if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { - return false - } - } - - if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_extensions") - if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { - return false - } - } - - uf := v1.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return true - } - - u1 := uf.Bytes() - u2 := v2.FieldByName("XXX_unrecognized").Bytes() - return bytes.Equal(u1, u2) -} - -// v1 and v2 are known to have the same type. -// prop may be nil. -func equalAny(v1, v2 reflect.Value, prop *Properties) bool { - if v1.Type() == protoMessageType { - m1, _ := v1.Interface().(Message) - m2, _ := v2.Interface().(Message) - return Equal(m1, m2) - } - switch v1.Kind() { - case reflect.Bool: - return v1.Bool() == v2.Bool() - case reflect.Float32, reflect.Float64: - return v1.Float() == v2.Float() - case reflect.Int32, reflect.Int64: - return v1.Int() == v2.Int() - case reflect.Interface: - // Probably a oneof field; compare the inner values. - n1, n2 := v1.IsNil(), v2.IsNil() - if n1 || n2 { - return n1 == n2 - } - e1, e2 := v1.Elem(), v2.Elem() - if e1.Type() != e2.Type() { - return false - } - return equalAny(e1, e2, nil) - case reflect.Map: - if v1.Len() != v2.Len() { - return false - } - for _, key := range v1.MapKeys() { - val2 := v2.MapIndex(key) - if !val2.IsValid() { - // This key was not found in the second map. - return false - } - if !equalAny(v1.MapIndex(key), val2, nil) { - return false - } - } - return true - case reflect.Ptr: - // Maps may have nil values in them, so check for nil. - if v1.IsNil() && v2.IsNil() { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return equalAny(v1.Elem(), v2.Elem(), prop) - case reflect.Slice: - if v1.Type().Elem().Kind() == reflect.Uint8 { - // short circuit: []byte - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value. - if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) - } - - if v1.Len() != v2.Len() { - return false - } - for i := 0; i < v1.Len(); i++ { - if !equalAny(v1.Index(i), v2.Index(i), prop) { - return false - } - } - return true - case reflect.String: - return v1.Interface().(string) == v2.Interface().(string) - case reflect.Struct: - return equalStruct(v1, v2) - case reflect.Uint32, reflect.Uint64: - return v1.Uint() == v2.Uint() - } - - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to compare %v", v1) - return false -} - -// base is the struct type that the extensions are based on. -// x1 and x2 are InternalExtensions. -func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { - em1, _ := x1.extensionsRead() - em2, _ := x2.extensionsRead() - return equalExtMap(base, em1, em2) -} - -func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { - if len(em1) != len(em2) { - return false - } - - for extNum, e1 := range em1 { - e2, ok := em2[extNum] - if !ok { - return false - } - - m1, m2 := e1.value, e2.value - - if m1 == nil && m2 == nil { - // Both have only encoded form. - if bytes.Equal(e1.enc, e2.enc) { - continue - } - // The bytes are different, but the extensions might still be - // equal. We need to decode them to compare. - } - - if m1 != nil && m2 != nil { - // Both are unencoded. - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - continue - } - - // At least one is encoded. To do a semantically correct comparison - // we need to unmarshal them first. - var desc *ExtensionDesc - if m := extensionMaps[base]; m != nil { - desc = m[extNum] - } - if desc == nil { - // If both have only encoded form and the bytes are the same, - // it is handled above. We get here when the bytes are different. - // We don't know how to decode it, so just compare them as byte - // slices. - log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) - return false - } - var err error - if m1 == nil { - m1, err = decodeExtension(e1.enc, desc) - } - if m2 == nil && err == nil { - m2, err = decodeExtension(e2.enc, desc) - } - if err != nil { - // The encoded form is invalid. - log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) - return false - } - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - } - - return true -} diff --git a/vendor/github.com/gogo/protobuf/proto/extensions.go b/vendor/github.com/gogo/protobuf/proto/extensions.go deleted file mode 100644 index 341c6f57f5..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/extensions.go +++ /dev/null @@ -1,605 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Types and routines for supporting protocol buffer extensions. - */ - -import ( - "errors" - "fmt" - "io" - "reflect" - "strconv" - "sync" -) - -// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. -var ErrMissingExtension = errors.New("proto: missing extension") - -// ExtensionRange represents a range of message extensions for a protocol buffer. -// Used in code generated by the protocol compiler. -type ExtensionRange struct { - Start, End int32 // both inclusive -} - -// extendableProto is an interface implemented by any protocol buffer generated by the current -// proto compiler that may be extended. -type extendableProto interface { - Message - ExtensionRangeArray() []ExtensionRange - extensionsWrite() map[int32]Extension - extensionsRead() (map[int32]Extension, sync.Locker) -} - -// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous -// version of the proto compiler that may be extended. -type extendableProtoV1 interface { - Message - ExtensionRangeArray() []ExtensionRange - ExtensionMap() map[int32]Extension -} - -// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. -type extensionAdapter struct { - extendableProtoV1 -} - -func (e extensionAdapter) extensionsWrite() map[int32]Extension { - return e.ExtensionMap() -} - -func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { - return e.ExtensionMap(), notLocker{} -} - -// notLocker is a sync.Locker whose Lock and Unlock methods are nops. -type notLocker struct{} - -func (n notLocker) Lock() {} -func (n notLocker) Unlock() {} - -// extendable returns the extendableProto interface for the given generated proto message. -// If the proto message has the old extension format, it returns a wrapper that implements -// the extendableProto interface. -func extendable(p interface{}) (extendableProto, error) { - switch p := p.(type) { - case extendableProto: - if isNilPtr(p) { - return nil, fmt.Errorf("proto: nil %T is not extendable", p) - } - return p, nil - case extendableProtoV1: - if isNilPtr(p) { - return nil, fmt.Errorf("proto: nil %T is not extendable", p) - } - return extensionAdapter{p}, nil - case extensionsBytes: - return slowExtensionAdapter{p}, nil - } - // Don't allocate a specific error containing %T: - // this is the hot path for Clone and MarshalText. - return nil, errNotExtendable -} - -var errNotExtendable = errors.New("proto: not an extendable proto.Message") - -func isNilPtr(x interface{}) bool { - v := reflect.ValueOf(x) - return v.Kind() == reflect.Ptr && v.IsNil() -} - -// XXX_InternalExtensions is an internal representation of proto extensions. -// -// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, -// thus gaining the unexported 'extensions' method, which can be called only from the proto package. -// -// The methods of XXX_InternalExtensions are not concurrency safe in general, -// but calls to logically read-only methods such as has and get may be executed concurrently. -type XXX_InternalExtensions struct { - // The struct must be indirect so that if a user inadvertently copies a - // generated message and its embedded XXX_InternalExtensions, they - // avoid the mayhem of a copied mutex. - // - // The mutex serializes all logically read-only operations to p.extensionMap. - // It is up to the client to ensure that write operations to p.extensionMap are - // mutually exclusive with other accesses. - p *struct { - mu sync.Mutex - extensionMap map[int32]Extension - } -} - -// extensionsWrite returns the extension map, creating it on first use. -func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { - if e.p == nil { - e.p = new(struct { - mu sync.Mutex - extensionMap map[int32]Extension - }) - e.p.extensionMap = make(map[int32]Extension) - } - return e.p.extensionMap -} - -// extensionsRead returns the extensions map for read-only use. It may be nil. -// The caller must hold the returned mutex's lock when accessing Elements within the map. -func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { - if e.p == nil { - return nil, nil - } - return e.p.extensionMap, &e.p.mu -} - -// ExtensionDesc represents an extension specification. -// Used in generated code from the protocol compiler. -type ExtensionDesc struct { - ExtendedType Message // nil pointer to the type that is being extended - ExtensionType interface{} // nil pointer to the extension type - Field int32 // field number - Name string // fully-qualified name of extension, for text formatting - Tag string // protobuf tag style - Filename string // name of the file in which the extension is defined -} - -func (ed *ExtensionDesc) repeated() bool { - t := reflect.TypeOf(ed.ExtensionType) - return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 -} - -// Extension represents an extension in a message. -type Extension struct { - // When an extension is stored in a message using SetExtension - // only desc and value are set. When the message is marshaled - // enc will be set to the encoded form of the message. - // - // When a message is unmarshaled and contains extensions, each - // extension will have only enc set. When such an extension is - // accessed using GetExtension (or GetExtensions) desc and value - // will be set. - desc *ExtensionDesc - value interface{} - enc []byte -} - -// SetRawExtension is for testing only. -func SetRawExtension(base Message, id int32, b []byte) { - if ebase, ok := base.(extensionsBytes); ok { - clearExtension(base, id) - ext := ebase.GetExtensions() - *ext = append(*ext, b...) - return - } - epb, err := extendable(base) - if err != nil { - return - } - extmap := epb.extensionsWrite() - extmap[id] = Extension{enc: b} -} - -// isExtensionField returns true iff the given field number is in an extension range. -func isExtensionField(pb extendableProto, field int32) bool { - for _, er := range pb.ExtensionRangeArray() { - if er.Start <= field && field <= er.End { - return true - } - } - return false -} - -// checkExtensionTypes checks that the given extension is valid for pb. -func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { - var pbi interface{} = pb - // Check the extended type. - if ea, ok := pbi.(extensionAdapter); ok { - pbi = ea.extendableProtoV1 - } - if ea, ok := pbi.(slowExtensionAdapter); ok { - pbi = ea.extensionsBytes - } - if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { - return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) - } - // Check the range. - if !isExtensionField(pb, extension.Field) { - return errors.New("proto: bad extension number; not in declared ranges") - } - return nil -} - -// extPropKey is sufficient to uniquely identify an extension. -type extPropKey struct { - base reflect.Type - field int32 -} - -var extProp = struct { - sync.RWMutex - m map[extPropKey]*Properties -}{ - m: make(map[extPropKey]*Properties), -} - -func extensionProperties(ed *ExtensionDesc) *Properties { - key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} - - extProp.RLock() - if prop, ok := extProp.m[key]; ok { - extProp.RUnlock() - return prop - } - extProp.RUnlock() - - extProp.Lock() - defer extProp.Unlock() - // Check again. - if prop, ok := extProp.m[key]; ok { - return prop - } - - prop := new(Properties) - prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) - extProp.m[key] = prop - return prop -} - -// HasExtension returns whether the given extension is present in pb. -func HasExtension(pb Message, extension *ExtensionDesc) bool { - if epb, doki := pb.(extensionsBytes); doki { - ext := epb.GetExtensions() - buf := *ext - o := 0 - for o < len(buf) { - tag, n := DecodeVarint(buf[o:]) - fieldNum := int32(tag >> 3) - if int32(fieldNum) == extension.Field { - return true - } - wireType := int(tag & 0x7) - o += n - l, err := size(buf[o:], wireType) - if err != nil { - return false - } - o += l - } - return false - } - // TODO: Check types, field numbers, etc.? - epb, err := extendable(pb) - if err != nil { - return false - } - extmap, mu := epb.extensionsRead() - if extmap == nil { - return false - } - mu.Lock() - _, ok := extmap[extension.Field] - mu.Unlock() - return ok -} - -// ClearExtension removes the given extension from pb. -func ClearExtension(pb Message, extension *ExtensionDesc) { - clearExtension(pb, extension.Field) -} - -func clearExtension(pb Message, fieldNum int32) { - if epb, ok := pb.(extensionsBytes); ok { - offset := 0 - for offset != -1 { - offset = deleteExtension(epb, fieldNum, offset) - } - return - } - epb, err := extendable(pb) - if err != nil { - return - } - // TODO: Check types, field numbers, etc.? - extmap := epb.extensionsWrite() - delete(extmap, fieldNum) -} - -// GetExtension retrieves a proto2 extended field from pb. -// -// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), -// then GetExtension parses the encoded field and returns a Go value of the specified type. -// If the field is not present, then the default value is returned (if one is specified), -// otherwise ErrMissingExtension is reported. -// -// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), -// then GetExtension returns the raw encoded bytes of the field extension. -func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { - if epb, doki := pb.(extensionsBytes); doki { - ext := epb.GetExtensions() - return decodeExtensionFromBytes(extension, *ext) - } - - epb, err := extendable(pb) - if err != nil { - return nil, err - } - - if extension.ExtendedType != nil { - // can only check type if this is a complete descriptor - if cerr := checkExtensionTypes(epb, extension); cerr != nil { - return nil, cerr - } - } - - emap, mu := epb.extensionsRead() - if emap == nil { - return defaultExtensionValue(extension) - } - mu.Lock() - defer mu.Unlock() - e, ok := emap[extension.Field] - if !ok { - // defaultExtensionValue returns the default value or - // ErrMissingExtension if there is no default. - return defaultExtensionValue(extension) - } - - if e.value != nil { - // Already decoded. Check the descriptor, though. - if e.desc != extension { - // This shouldn't happen. If it does, it means that - // GetExtension was called twice with two different - // descriptors with the same field number. - return nil, errors.New("proto: descriptor conflict") - } - return e.value, nil - } - - if extension.ExtensionType == nil { - // incomplete descriptor - return e.enc, nil - } - - v, err := decodeExtension(e.enc, extension) - if err != nil { - return nil, err - } - - // Remember the decoded version and drop the encoded version. - // That way it is safe to mutate what we return. - e.value = v - e.desc = extension - e.enc = nil - emap[extension.Field] = e - return e.value, nil -} - -// defaultExtensionValue returns the default value for extension. -// If no default for an extension is defined ErrMissingExtension is returned. -func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { - if extension.ExtensionType == nil { - // incomplete descriptor, so no default - return nil, ErrMissingExtension - } - - t := reflect.TypeOf(extension.ExtensionType) - props := extensionProperties(extension) - - sf, _, err := fieldDefault(t, props) - if err != nil { - return nil, err - } - - if sf == nil || sf.value == nil { - // There is no default value. - return nil, ErrMissingExtension - } - - if t.Kind() != reflect.Ptr { - // We do not need to return a Ptr, we can directly return sf.value. - return sf.value, nil - } - - // We need to return an interface{} that is a pointer to sf.value. - value := reflect.New(t).Elem() - value.Set(reflect.New(value.Type().Elem())) - if sf.kind == reflect.Int32 { - // We may have an int32 or an enum, but the underlying data is int32. - // Since we can't set an int32 into a non int32 reflect.value directly - // set it as a int32. - value.Elem().SetInt(int64(sf.value.(int32))) - } else { - value.Elem().Set(reflect.ValueOf(sf.value)) - } - return value.Interface(), nil -} - -// decodeExtension decodes an extension encoded in b. -func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { - t := reflect.TypeOf(extension.ExtensionType) - unmarshal := typeUnmarshaler(t, extension.Tag) - - // t is a pointer to a struct, pointer to basic type or a slice. - // Allocate space to store the pointer/slice. - value := reflect.New(t).Elem() - - var err error - for { - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - wire := int(x) & 7 - - b, err = unmarshal(b, valToPointer(value.Addr()), wire) - if err != nil { - return nil, err - } - - if len(b) == 0 { - break - } - } - return value.Interface(), nil -} - -// GetExtensions returns a slice of the extensions present in pb that are also listed in es. -// The returned slice has the same length as es; missing extensions will appear as nil elements. -func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { - epb, err := extendable(pb) - if err != nil { - return nil, err - } - extensions = make([]interface{}, len(es)) - for i, e := range es { - extensions[i], err = GetExtension(epb, e) - if err == ErrMissingExtension { - err = nil - } - if err != nil { - return - } - } - return -} - -// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. -// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing -// just the Field field, which defines the extension's field number. -func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { - epb, err := extendable(pb) - if err != nil { - return nil, err - } - registeredExtensions := RegisteredExtensions(pb) - - emap, mu := epb.extensionsRead() - if emap == nil { - return nil, nil - } - mu.Lock() - defer mu.Unlock() - extensions := make([]*ExtensionDesc, 0, len(emap)) - for extid, e := range emap { - desc := e.desc - if desc == nil { - desc = registeredExtensions[extid] - if desc == nil { - desc = &ExtensionDesc{Field: extid} - } - } - - extensions = append(extensions, desc) - } - return extensions, nil -} - -// SetExtension sets the specified extension of pb to the specified value. -func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { - if epb, ok := pb.(extensionsBytes); ok { - ClearExtension(pb, extension) - newb, err := encodeExtension(extension, value) - if err != nil { - return err - } - bb := epb.GetExtensions() - *bb = append(*bb, newb...) - return nil - } - epb, err := extendable(pb) - if err != nil { - return err - } - if err := checkExtensionTypes(epb, extension); err != nil { - return err - } - typ := reflect.TypeOf(extension.ExtensionType) - if typ != reflect.TypeOf(value) { - return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", value, extension.ExtensionType) - } - // nil extension values need to be caught early, because the - // encoder can't distinguish an ErrNil due to a nil extension - // from an ErrNil due to a missing field. Extensions are - // always optional, so the encoder would just swallow the error - // and drop all the extensions from the encoded message. - if reflect.ValueOf(value).IsNil() { - return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) - } - - extmap := epb.extensionsWrite() - extmap[extension.Field] = Extension{desc: extension, value: value} - return nil -} - -// ClearAllExtensions clears all extensions from pb. -func ClearAllExtensions(pb Message) { - if epb, doki := pb.(extensionsBytes); doki { - ext := epb.GetExtensions() - *ext = []byte{} - return - } - epb, err := extendable(pb) - if err != nil { - return - } - m := epb.extensionsWrite() - for k := range m { - delete(m, k) - } -} - -// A global registry of extensions. -// The generated code will register the generated descriptors by calling RegisterExtension. - -var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) - -// RegisterExtension is called from the generated code. -func RegisterExtension(desc *ExtensionDesc) { - st := reflect.TypeOf(desc.ExtendedType).Elem() - m := extensionMaps[st] - if m == nil { - m = make(map[int32]*ExtensionDesc) - extensionMaps[st] = m - } - if _, ok := m[desc.Field]; ok { - panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) - } - m[desc.Field] = desc -} - -// RegisteredExtensions returns a map of the registered extensions of a -// protocol buffer struct, indexed by the extension number. -// The argument pb should be a nil pointer to the struct type. -func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { - return extensionMaps[reflect.TypeOf(pb).Elem()] -} diff --git a/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go b/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go deleted file mode 100644 index 6f1ae120ec..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go +++ /dev/null @@ -1,389 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "bytes" - "errors" - "fmt" - "io" - "reflect" - "sort" - "strings" - "sync" -) - -type extensionsBytes interface { - Message - ExtensionRangeArray() []ExtensionRange - GetExtensions() *[]byte -} - -type slowExtensionAdapter struct { - extensionsBytes -} - -func (s slowExtensionAdapter) extensionsWrite() map[int32]Extension { - panic("Please report a bug to github.com/gogo/protobuf if you see this message: Writing extensions is not supported for extensions stored in a byte slice field.") -} - -func (s slowExtensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { - b := s.GetExtensions() - m, err := BytesToExtensionsMap(*b) - if err != nil { - panic(err) - } - return m, notLocker{} -} - -func GetBoolExtension(pb Message, extension *ExtensionDesc, ifnotset bool) bool { - if reflect.ValueOf(pb).IsNil() { - return ifnotset - } - value, err := GetExtension(pb, extension) - if err != nil { - return ifnotset - } - if value == nil { - return ifnotset - } - if value.(*bool) == nil { - return ifnotset - } - return *(value.(*bool)) -} - -func (this *Extension) Equal(that *Extension) bool { - if err := this.Encode(); err != nil { - return false - } - if err := that.Encode(); err != nil { - return false - } - return bytes.Equal(this.enc, that.enc) -} - -func (this *Extension) Compare(that *Extension) int { - if err := this.Encode(); err != nil { - return 1 - } - if err := that.Encode(); err != nil { - return -1 - } - return bytes.Compare(this.enc, that.enc) -} - -func SizeOfInternalExtension(m extendableProto) (n int) { - info := getMarshalInfo(reflect.TypeOf(m)) - return info.sizeV1Extensions(m.extensionsWrite()) -} - -type sortableMapElem struct { - field int32 - ext Extension -} - -func newSortableExtensionsFromMap(m map[int32]Extension) sortableExtensions { - s := make(sortableExtensions, 0, len(m)) - for k, v := range m { - s = append(s, &sortableMapElem{field: k, ext: v}) - } - return s -} - -type sortableExtensions []*sortableMapElem - -func (this sortableExtensions) Len() int { return len(this) } - -func (this sortableExtensions) Swap(i, j int) { this[i], this[j] = this[j], this[i] } - -func (this sortableExtensions) Less(i, j int) bool { return this[i].field < this[j].field } - -func (this sortableExtensions) String() string { - sort.Sort(this) - ss := make([]string, len(this)) - for i := range this { - ss[i] = fmt.Sprintf("%d: %v", this[i].field, this[i].ext) - } - return "map[" + strings.Join(ss, ",") + "]" -} - -func StringFromInternalExtension(m extendableProto) string { - return StringFromExtensionsMap(m.extensionsWrite()) -} - -func StringFromExtensionsMap(m map[int32]Extension) string { - return newSortableExtensionsFromMap(m).String() -} - -func StringFromExtensionsBytes(ext []byte) string { - m, err := BytesToExtensionsMap(ext) - if err != nil { - panic(err) - } - return StringFromExtensionsMap(m) -} - -func EncodeInternalExtension(m extendableProto, data []byte) (n int, err error) { - return EncodeExtensionMap(m.extensionsWrite(), data) -} - -func EncodeInternalExtensionBackwards(m extendableProto, data []byte) (n int, err error) { - return EncodeExtensionMapBackwards(m.extensionsWrite(), data) -} - -func EncodeExtensionMap(m map[int32]Extension, data []byte) (n int, err error) { - o := 0 - for _, e := range m { - if err := e.Encode(); err != nil { - return 0, err - } - n := copy(data[o:], e.enc) - if n != len(e.enc) { - return 0, io.ErrShortBuffer - } - o += n - } - return o, nil -} - -func EncodeExtensionMapBackwards(m map[int32]Extension, data []byte) (n int, err error) { - o := 0 - end := len(data) - for _, e := range m { - if err := e.Encode(); err != nil { - return 0, err - } - n := copy(data[end-len(e.enc):], e.enc) - if n != len(e.enc) { - return 0, io.ErrShortBuffer - } - end -= n - o += n - } - return o, nil -} - -func GetRawExtension(m map[int32]Extension, id int32) ([]byte, error) { - e := m[id] - if err := e.Encode(); err != nil { - return nil, err - } - return e.enc, nil -} - -func size(buf []byte, wire int) (int, error) { - switch wire { - case WireVarint: - _, n := DecodeVarint(buf) - return n, nil - case WireFixed64: - return 8, nil - case WireBytes: - v, n := DecodeVarint(buf) - return int(v) + n, nil - case WireFixed32: - return 4, nil - case WireStartGroup: - offset := 0 - for { - u, n := DecodeVarint(buf[offset:]) - fwire := int(u & 0x7) - offset += n - if fwire == WireEndGroup { - return offset, nil - } - s, err := size(buf[offset:], wire) - if err != nil { - return 0, err - } - offset += s - } - } - return 0, fmt.Errorf("proto: can't get size for unknown wire type %d", wire) -} - -func BytesToExtensionsMap(buf []byte) (map[int32]Extension, error) { - m := make(map[int32]Extension) - i := 0 - for i < len(buf) { - tag, n := DecodeVarint(buf[i:]) - if n <= 0 { - return nil, fmt.Errorf("unable to decode varint") - } - fieldNum := int32(tag >> 3) - wireType := int(tag & 0x7) - l, err := size(buf[i+n:], wireType) - if err != nil { - return nil, err - } - end := i + int(l) + n - m[int32(fieldNum)] = Extension{enc: buf[i:end]} - i = end - } - return m, nil -} - -func NewExtension(e []byte) Extension { - ee := Extension{enc: make([]byte, len(e))} - copy(ee.enc, e) - return ee -} - -func AppendExtension(e Message, tag int32, buf []byte) { - if ee, eok := e.(extensionsBytes); eok { - ext := ee.GetExtensions() - *ext = append(*ext, buf...) - return - } - if ee, eok := e.(extendableProto); eok { - m := ee.extensionsWrite() - ext := m[int32(tag)] // may be missing - ext.enc = append(ext.enc, buf...) - m[int32(tag)] = ext - } -} - -func encodeExtension(extension *ExtensionDesc, value interface{}) ([]byte, error) { - u := getMarshalInfo(reflect.TypeOf(extension.ExtendedType)) - ei := u.getExtElemInfo(extension) - v := value - p := toAddrPointer(&v, ei.isptr) - siz := ei.sizer(p, SizeVarint(ei.wiretag)) - buf := make([]byte, 0, siz) - return ei.marshaler(buf, p, ei.wiretag, false) -} - -func decodeExtensionFromBytes(extension *ExtensionDesc, buf []byte) (interface{}, error) { - o := 0 - for o < len(buf) { - tag, n := DecodeVarint((buf)[o:]) - fieldNum := int32(tag >> 3) - wireType := int(tag & 0x7) - if o+n > len(buf) { - return nil, fmt.Errorf("unable to decode extension") - } - l, err := size((buf)[o+n:], wireType) - if err != nil { - return nil, err - } - if int32(fieldNum) == extension.Field { - if o+n+l > len(buf) { - return nil, fmt.Errorf("unable to decode extension") - } - v, err := decodeExtension((buf)[o:o+n+l], extension) - if err != nil { - return nil, err - } - return v, nil - } - o += n + l - } - return defaultExtensionValue(extension) -} - -func (this *Extension) Encode() error { - if this.enc == nil { - var err error - this.enc, err = encodeExtension(this.desc, this.value) - if err != nil { - return err - } - } - return nil -} - -func (this Extension) GoString() string { - if err := this.Encode(); err != nil { - return fmt.Sprintf("error encoding extension: %v", err) - } - return fmt.Sprintf("proto.NewExtension(%#v)", this.enc) -} - -func SetUnsafeExtension(pb Message, fieldNum int32, value interface{}) error { - typ := reflect.TypeOf(pb).Elem() - ext, ok := extensionMaps[typ] - if !ok { - return fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) - } - desc, ok := ext[fieldNum] - if !ok { - return errors.New("proto: bad extension number; not in declared ranges") - } - return SetExtension(pb, desc, value) -} - -func GetUnsafeExtension(pb Message, fieldNum int32) (interface{}, error) { - typ := reflect.TypeOf(pb).Elem() - ext, ok := extensionMaps[typ] - if !ok { - return nil, fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) - } - desc, ok := ext[fieldNum] - if !ok { - return nil, fmt.Errorf("unregistered field number %d", fieldNum) - } - return GetExtension(pb, desc) -} - -func NewUnsafeXXX_InternalExtensions(m map[int32]Extension) XXX_InternalExtensions { - x := &XXX_InternalExtensions{ - p: new(struct { - mu sync.Mutex - extensionMap map[int32]Extension - }), - } - x.p.extensionMap = m - return *x -} - -func GetUnsafeExtensionsMap(extendable Message) map[int32]Extension { - pb := extendable.(extendableProto) - return pb.extensionsWrite() -} - -func deleteExtension(pb extensionsBytes, theFieldNum int32, offset int) int { - ext := pb.GetExtensions() - for offset < len(*ext) { - tag, n1 := DecodeVarint((*ext)[offset:]) - fieldNum := int32(tag >> 3) - wireType := int(tag & 0x7) - n2, err := size((*ext)[offset+n1:], wireType) - if err != nil { - panic(err) - } - newOffset := offset + n1 + n2 - if fieldNum == theFieldNum { - *ext = append((*ext)[:offset], (*ext)[newOffset:]...) - return offset - } - offset = newOffset - } - return -1 -} diff --git a/vendor/github.com/gogo/protobuf/proto/lib.go b/vendor/github.com/gogo/protobuf/proto/lib.go deleted file mode 100644 index 80db1c155b..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/lib.go +++ /dev/null @@ -1,973 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/* -Package proto converts data structures to and from the wire format of -protocol buffers. It works in concert with the Go source code generated -for .proto files by the protocol compiler. - -A summary of the properties of the protocol buffer interface -for a protocol buffer variable v: - - - Names are turned from camel_case to CamelCase for export. - - There are no methods on v to set fields; just treat - them as structure fields. - - There are getters that return a field's value if set, - and return the field's default value if unset. - The getters work even if the receiver is a nil message. - - The zero value for a struct is its correct initialization state. - All desired fields must be set before marshaling. - - A Reset() method will restore a protobuf struct to its zero state. - - Non-repeated fields are pointers to the values; nil means unset. - That is, optional or required field int32 f becomes F *int32. - - Repeated fields are slices. - - Helper functions are available to aid the setting of fields. - msg.Foo = proto.String("hello") // set field - - Constants are defined to hold the default values of all fields that - have them. They have the form Default_StructName_FieldName. - Because the getter methods handle defaulted values, - direct use of these constants should be rare. - - Enums are given type names and maps from names to values. - Enum values are prefixed by the enclosing message's name, or by the - enum's type name if it is a top-level enum. Enum types have a String - method, and a Enum method to assist in message construction. - - Nested messages, groups and enums have type names prefixed with the name of - the surrounding message type. - - Extensions are given descriptor names that start with E_, - followed by an underscore-delimited list of the nested messages - that contain it (if any) followed by the CamelCased name of the - extension field itself. HasExtension, ClearExtension, GetExtension - and SetExtension are functions for manipulating extensions. - - Oneof field sets are given a single field in their message, - with distinguished wrapper types for each possible field value. - - Marshal and Unmarshal are functions to encode and decode the wire format. - -When the .proto file specifies `syntax="proto3"`, there are some differences: - - - Non-repeated fields of non-message type are values instead of pointers. - - Enum types do not get an Enum method. - -The simplest way to describe this is to see an example. -Given file test.proto, containing - - package example; - - enum FOO { X = 17; } - - message Test { - required string label = 1; - optional int32 type = 2 [default=77]; - repeated int64 reps = 3; - optional group OptionalGroup = 4 { - required string RequiredField = 5; - } - oneof union { - int32 number = 6; - string name = 7; - } - } - -The resulting file, test.pb.go, is: - - package example - - import proto "github.com/gogo/protobuf/proto" - import math "math" - - type FOO int32 - const ( - FOO_X FOO = 17 - ) - var FOO_name = map[int32]string{ - 17: "X", - } - var FOO_value = map[string]int32{ - "X": 17, - } - - func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p - } - func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) - } - func (x *FOO) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FOO_value, data) - if err != nil { - return err - } - *x = FOO(value) - return nil - } - - type Test struct { - Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` - Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` - Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` - Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - // Types that are valid to be assigned to Union: - // *Test_Number - // *Test_Name - Union isTest_Union `protobuf_oneof:"union"` - XXX_unrecognized []byte `json:"-"` - } - func (m *Test) Reset() { *m = Test{} } - func (m *Test) String() string { return proto.CompactTextString(m) } - func (*Test) ProtoMessage() {} - - type isTest_Union interface { - isTest_Union() - } - - type Test_Number struct { - Number int32 `protobuf:"varint,6,opt,name=number"` - } - type Test_Name struct { - Name string `protobuf:"bytes,7,opt,name=name"` - } - - func (*Test_Number) isTest_Union() {} - func (*Test_Name) isTest_Union() {} - - func (m *Test) GetUnion() isTest_Union { - if m != nil { - return m.Union - } - return nil - } - const Default_Test_Type int32 = 77 - - func (m *Test) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" - } - - func (m *Test) GetType() int32 { - if m != nil && m.Type != nil { - return *m.Type - } - return Default_Test_Type - } - - func (m *Test) GetOptionalgroup() *Test_OptionalGroup { - if m != nil { - return m.Optionalgroup - } - return nil - } - - type Test_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` - } - func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } - func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } - - func (m *Test_OptionalGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" - } - - func (m *Test) GetNumber() int32 { - if x, ok := m.GetUnion().(*Test_Number); ok { - return x.Number - } - return 0 - } - - func (m *Test) GetName() string { - if x, ok := m.GetUnion().(*Test_Name); ok { - return x.Name - } - return "" - } - - func init() { - proto.RegisterEnum("example.FOO", FOO_name, FOO_value) - } - -To create and play with a Test object: - - package main - - import ( - "log" - - "github.com/gogo/protobuf/proto" - pb "./example.pb" - ) - - func main() { - test := &pb.Test{ - Label: proto.String("hello"), - Type: proto.Int32(17), - Reps: []int64{1, 2, 3}, - Optionalgroup: &pb.Test_OptionalGroup{ - RequiredField: proto.String("good bye"), - }, - Union: &pb.Test_Name{"fred"}, - } - data, err := proto.Marshal(test) - if err != nil { - log.Fatal("marshaling error: ", err) - } - newTest := &pb.Test{} - err = proto.Unmarshal(data, newTest) - if err != nil { - log.Fatal("unmarshaling error: ", err) - } - // Now test and newTest contain the same data. - if test.GetLabel() != newTest.GetLabel() { - log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) - } - // Use a type switch to determine which oneof was set. - switch u := test.Union.(type) { - case *pb.Test_Number: // u.Number contains the number. - case *pb.Test_Name: // u.Name contains the string. - } - // etc. - } -*/ -package proto - -import ( - "encoding/json" - "fmt" - "log" - "reflect" - "sort" - "strconv" - "sync" -) - -// RequiredNotSetError is an error type returned by either Marshal or Unmarshal. -// Marshal reports this when a required field is not initialized. -// Unmarshal reports this when a required field is missing from the wire data. -type RequiredNotSetError struct{ field string } - -func (e *RequiredNotSetError) Error() string { - if e.field == "" { - return fmt.Sprintf("proto: required field not set") - } - return fmt.Sprintf("proto: required field %q not set", e.field) -} -func (e *RequiredNotSetError) RequiredNotSet() bool { - return true -} - -type invalidUTF8Error struct{ field string } - -func (e *invalidUTF8Error) Error() string { - if e.field == "" { - return "proto: invalid UTF-8 detected" - } - return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field) -} -func (e *invalidUTF8Error) InvalidUTF8() bool { - return true -} - -// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8. -// This error should not be exposed to the external API as such errors should -// be recreated with the field information. -var errInvalidUTF8 = &invalidUTF8Error{} - -// isNonFatal reports whether the error is either a RequiredNotSet error -// or a InvalidUTF8 error. -func isNonFatal(err error) bool { - if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() { - return true - } - if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() { - return true - } - return false -} - -type nonFatal struct{ E error } - -// Merge merges err into nf and reports whether it was successful. -// Otherwise it returns false for any fatal non-nil errors. -func (nf *nonFatal) Merge(err error) (ok bool) { - if err == nil { - return true // not an error - } - if !isNonFatal(err) { - return false // fatal error - } - if nf.E == nil { - nf.E = err // store first instance of non-fatal error - } - return true -} - -// Message is implemented by generated protocol buffer messages. -type Message interface { - Reset() - String() string - ProtoMessage() -} - -// A Buffer is a buffer manager for marshaling and unmarshaling -// protocol buffers. It may be reused between invocations to -// reduce memory usage. It is not necessary to use a Buffer; -// the global functions Marshal and Unmarshal create a -// temporary Buffer and are fine for most applications. -type Buffer struct { - buf []byte // encode/decode byte stream - index int // read point - - deterministic bool -} - -// NewBuffer allocates a new Buffer and initializes its internal data to -// the contents of the argument slice. -func NewBuffer(e []byte) *Buffer { - return &Buffer{buf: e} -} - -// Reset resets the Buffer, ready for marshaling a new protocol buffer. -func (p *Buffer) Reset() { - p.buf = p.buf[0:0] // for reading/writing - p.index = 0 // for reading -} - -// SetBuf replaces the internal buffer with the slice, -// ready for unmarshaling the contents of the slice. -func (p *Buffer) SetBuf(s []byte) { - p.buf = s - p.index = 0 -} - -// Bytes returns the contents of the Buffer. -func (p *Buffer) Bytes() []byte { return p.buf } - -// SetDeterministic sets whether to use deterministic serialization. -// -// Deterministic serialization guarantees that for a given binary, equal -// messages will always be serialized to the same bytes. This implies: -// -// - Repeated serialization of a message will return the same bytes. -// - Different processes of the same binary (which may be executing on -// different machines) will serialize equal messages to the same bytes. -// -// Note that the deterministic serialization is NOT canonical across -// languages. It is not guaranteed to remain stable over time. It is unstable -// across different builds with schema changes due to unknown fields. -// Users who need canonical serialization (e.g., persistent storage in a -// canonical form, fingerprinting, etc.) should define their own -// canonicalization specification and implement their own serializer rather -// than relying on this API. -// -// If deterministic serialization is requested, map entries will be sorted -// by keys in lexographical order. This is an implementation detail and -// subject to change. -func (p *Buffer) SetDeterministic(deterministic bool) { - p.deterministic = deterministic -} - -/* - * Helper routines for simplifying the creation of optional fields of basic type. - */ - -// Bool is a helper routine that allocates a new bool value -// to store v and returns a pointer to it. -func Bool(v bool) *bool { - return &v -} - -// Int32 is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it. -func Int32(v int32) *int32 { - return &v -} - -// Int is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it, but unlike Int32 -// its argument value is an int. -func Int(v int) *int32 { - p := new(int32) - *p = int32(v) - return p -} - -// Int64 is a helper routine that allocates a new int64 value -// to store v and returns a pointer to it. -func Int64(v int64) *int64 { - return &v -} - -// Float32 is a helper routine that allocates a new float32 value -// to store v and returns a pointer to it. -func Float32(v float32) *float32 { - return &v -} - -// Float64 is a helper routine that allocates a new float64 value -// to store v and returns a pointer to it. -func Float64(v float64) *float64 { - return &v -} - -// Uint32 is a helper routine that allocates a new uint32 value -// to store v and returns a pointer to it. -func Uint32(v uint32) *uint32 { - return &v -} - -// Uint64 is a helper routine that allocates a new uint64 value -// to store v and returns a pointer to it. -func Uint64(v uint64) *uint64 { - return &v -} - -// String is a helper routine that allocates a new string value -// to store v and returns a pointer to it. -func String(v string) *string { - return &v -} - -// EnumName is a helper function to simplify printing protocol buffer enums -// by name. Given an enum map and a value, it returns a useful string. -func EnumName(m map[int32]string, v int32) string { - s, ok := m[v] - if ok { - return s - } - return strconv.Itoa(int(v)) -} - -// UnmarshalJSONEnum is a helper function to simplify recovering enum int values -// from their JSON-encoded representation. Given a map from the enum's symbolic -// names to its int values, and a byte buffer containing the JSON-encoded -// value, it returns an int32 that can be cast to the enum type by the caller. -// -// The function can deal with both JSON representations, numeric and symbolic. -func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { - if data[0] == '"' { - // New style: enums are strings. - var repr string - if err := json.Unmarshal(data, &repr); err != nil { - return -1, err - } - val, ok := m[repr] - if !ok { - return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) - } - return val, nil - } - // Old style: enums are ints. - var val int32 - if err := json.Unmarshal(data, &val); err != nil { - return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) - } - return val, nil -} - -// DebugPrint dumps the encoded data in b in a debugging format with a header -// including the string s. Used in testing but made available for general debugging. -func (p *Buffer) DebugPrint(s string, b []byte) { - var u uint64 - - obuf := p.buf - sindex := p.index - p.buf = b - p.index = 0 - depth := 0 - - fmt.Printf("\n--- %s ---\n", s) - -out: - for { - for i := 0; i < depth; i++ { - fmt.Print(" ") - } - - index := p.index - if index == len(p.buf) { - break - } - - op, err := p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: fetching op err %v\n", index, err) - break out - } - tag := op >> 3 - wire := op & 7 - - switch wire { - default: - fmt.Printf("%3d: t=%3d unknown wire=%d\n", - index, tag, wire) - break out - - case WireBytes: - var r []byte - - r, err = p.DecodeRawBytes(false) - if err != nil { - break out - } - fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) - if len(r) <= 6 { - for i := 0; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } else { - for i := 0; i < 3; i++ { - fmt.Printf(" %.2x", r[i]) - } - fmt.Printf(" ..") - for i := len(r) - 3; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } - fmt.Printf("\n") - - case WireFixed32: - u, err = p.DecodeFixed32() - if err != nil { - fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) - - case WireFixed64: - u, err = p.DecodeFixed64() - if err != nil { - fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) - - case WireVarint: - u, err = p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) - - case WireStartGroup: - fmt.Printf("%3d: t=%3d start\n", index, tag) - depth++ - - case WireEndGroup: - depth-- - fmt.Printf("%3d: t=%3d end\n", index, tag) - } - } - - if depth != 0 { - fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) - } - fmt.Printf("\n") - - p.buf = obuf - p.index = sindex -} - -// SetDefaults sets unset protocol buffer fields to their default values. -// It only modifies fields that are both unset and have defined defaults. -// It recursively sets default values in any non-nil sub-messages. -func SetDefaults(pb Message) { - setDefaults(reflect.ValueOf(pb), true, false) -} - -// v is a struct. -func setDefaults(v reflect.Value, recur, zeros bool) { - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - - defaultMu.RLock() - dm, ok := defaults[v.Type()] - defaultMu.RUnlock() - if !ok { - dm = buildDefaultMessage(v.Type()) - defaultMu.Lock() - defaults[v.Type()] = dm - defaultMu.Unlock() - } - - for _, sf := range dm.scalars { - f := v.Field(sf.index) - if !f.IsNil() { - // field already set - continue - } - dv := sf.value - if dv == nil && !zeros { - // no explicit default, and don't want to set zeros - continue - } - fptr := f.Addr().Interface() // **T - // TODO: Consider batching the allocations we do here. - switch sf.kind { - case reflect.Bool: - b := new(bool) - if dv != nil { - *b = dv.(bool) - } - *(fptr.(**bool)) = b - case reflect.Float32: - f := new(float32) - if dv != nil { - *f = dv.(float32) - } - *(fptr.(**float32)) = f - case reflect.Float64: - f := new(float64) - if dv != nil { - *f = dv.(float64) - } - *(fptr.(**float64)) = f - case reflect.Int32: - // might be an enum - if ft := f.Type(); ft != int32PtrType { - // enum - f.Set(reflect.New(ft.Elem())) - if dv != nil { - f.Elem().SetInt(int64(dv.(int32))) - } - } else { - // int32 field - i := new(int32) - if dv != nil { - *i = dv.(int32) - } - *(fptr.(**int32)) = i - } - case reflect.Int64: - i := new(int64) - if dv != nil { - *i = dv.(int64) - } - *(fptr.(**int64)) = i - case reflect.String: - s := new(string) - if dv != nil { - *s = dv.(string) - } - *(fptr.(**string)) = s - case reflect.Uint8: - // exceptional case: []byte - var b []byte - if dv != nil { - db := dv.([]byte) - b = make([]byte, len(db)) - copy(b, db) - } else { - b = []byte{} - } - *(fptr.(*[]byte)) = b - case reflect.Uint32: - u := new(uint32) - if dv != nil { - *u = dv.(uint32) - } - *(fptr.(**uint32)) = u - case reflect.Uint64: - u := new(uint64) - if dv != nil { - *u = dv.(uint64) - } - *(fptr.(**uint64)) = u - default: - log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) - } - } - - for _, ni := range dm.nested { - f := v.Field(ni) - // f is *T or T or []*T or []T - switch f.Kind() { - case reflect.Struct: - setDefaults(f, recur, zeros) - - case reflect.Ptr: - if f.IsNil() { - continue - } - setDefaults(f, recur, zeros) - - case reflect.Slice: - for i := 0; i < f.Len(); i++ { - e := f.Index(i) - if e.Kind() == reflect.Ptr && e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - - case reflect.Map: - for _, k := range f.MapKeys() { - e := f.MapIndex(k) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - } - } -} - -var ( - // defaults maps a protocol buffer struct type to a slice of the fields, - // with its scalar fields set to their proto-declared non-zero default values. - defaultMu sync.RWMutex - defaults = make(map[reflect.Type]defaultMessage) - - int32PtrType = reflect.TypeOf((*int32)(nil)) -) - -// defaultMessage represents information about the default values of a message. -type defaultMessage struct { - scalars []scalarField - nested []int // struct field index of nested messages -} - -type scalarField struct { - index int // struct field index - kind reflect.Kind // element type (the T in *T or []T) - value interface{} // the proto-declared default value, or nil -} - -// t is a struct type. -func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { - sprop := GetProperties(t) - for _, prop := range sprop.Prop { - fi, ok := sprop.decoderTags.get(prop.Tag) - if !ok { - // XXX_unrecognized - continue - } - ft := t.Field(fi).Type - - sf, nested, err := fieldDefault(ft, prop) - switch { - case err != nil: - log.Print(err) - case nested: - dm.nested = append(dm.nested, fi) - case sf != nil: - sf.index = fi - dm.scalars = append(dm.scalars, *sf) - } - } - - return dm -} - -// fieldDefault returns the scalarField for field type ft. -// sf will be nil if the field can not have a default. -// nestedMessage will be true if this is a nested message. -// Note that sf.index is not set on return. -func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { - var canHaveDefault bool - switch ft.Kind() { - case reflect.Struct: - nestedMessage = true // non-nullable - - case reflect.Ptr: - if ft.Elem().Kind() == reflect.Struct { - nestedMessage = true - } else { - canHaveDefault = true // proto2 scalar field - } - - case reflect.Slice: - switch ft.Elem().Kind() { - case reflect.Ptr, reflect.Struct: - nestedMessage = true // repeated message - case reflect.Uint8: - canHaveDefault = true // bytes field - } - - case reflect.Map: - if ft.Elem().Kind() == reflect.Ptr { - nestedMessage = true // map with message values - } - } - - if !canHaveDefault { - if nestedMessage { - return nil, true, nil - } - return nil, false, nil - } - - // We now know that ft is a pointer or slice. - sf = &scalarField{kind: ft.Elem().Kind()} - - // scalar fields without defaults - if !prop.HasDefault { - return sf, false, nil - } - - // a scalar field: either *T or []byte - switch ft.Elem().Kind() { - case reflect.Bool: - x, err := strconv.ParseBool(prop.Default) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Float32: - x, err := strconv.ParseFloat(prop.Default, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) - } - sf.value = float32(x) - case reflect.Float64: - x, err := strconv.ParseFloat(prop.Default, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Int32: - x, err := strconv.ParseInt(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) - } - sf.value = int32(x) - case reflect.Int64: - x, err := strconv.ParseInt(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.String: - sf.value = prop.Default - case reflect.Uint8: - // []byte (not *uint8) - sf.value = []byte(prop.Default) - case reflect.Uint32: - x, err := strconv.ParseUint(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) - } - sf.value = uint32(x) - case reflect.Uint64: - x, err := strconv.ParseUint(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) - } - sf.value = x - default: - return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) - } - - return sf, false, nil -} - -// mapKeys returns a sort.Interface to be used for sorting the map keys. -// Map fields may have key types of non-float scalars, strings and enums. -func mapKeys(vs []reflect.Value) sort.Interface { - s := mapKeySorter{vs: vs} - - // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. - if len(vs) == 0 { - return s - } - switch vs[0].Kind() { - case reflect.Int32, reflect.Int64: - s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } - case reflect.Uint32, reflect.Uint64: - s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } - case reflect.Bool: - s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true - case reflect.String: - s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } - default: - panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) - } - - return s -} - -type mapKeySorter struct { - vs []reflect.Value - less func(a, b reflect.Value) bool -} - -func (s mapKeySorter) Len() int { return len(s.vs) } -func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } -func (s mapKeySorter) Less(i, j int) bool { - return s.less(s.vs[i], s.vs[j]) -} - -// isProto3Zero reports whether v is a zero proto3 value. -func isProto3Zero(v reflect.Value) bool { - switch v.Kind() { - case reflect.Bool: - return !v.Bool() - case reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint32, reflect.Uint64: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.String: - return v.String() == "" - } - return false -} - -const ( - // ProtoPackageIsVersion3 is referenced from generated protocol buffer files - // to assert that that code is compatible with this version of the proto package. - GoGoProtoPackageIsVersion3 = true - - // ProtoPackageIsVersion2 is referenced from generated protocol buffer files - // to assert that that code is compatible with this version of the proto package. - GoGoProtoPackageIsVersion2 = true - - // ProtoPackageIsVersion1 is referenced from generated protocol buffer files - // to assert that that code is compatible with this version of the proto package. - GoGoProtoPackageIsVersion1 = true -) - -// InternalMessageInfo is a type used internally by generated .pb.go files. -// This type is not intended to be used by non-generated code. -// This type is not subject to any compatibility guarantee. -type InternalMessageInfo struct { - marshal *marshalInfo - unmarshal *unmarshalInfo - merge *mergeInfo - discard *discardInfo -} diff --git a/vendor/github.com/gogo/protobuf/proto/lib_gogo.go b/vendor/github.com/gogo/protobuf/proto/lib_gogo.go deleted file mode 100644 index b3aa39190a..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/lib_gogo.go +++ /dev/null @@ -1,50 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "encoding/json" - "strconv" -) - -type Sizer interface { - Size() int -} - -type ProtoSizer interface { - ProtoSize() int -} - -func MarshalJSONEnum(m map[int32]string, value int32) ([]byte, error) { - s, ok := m[value] - if !ok { - s = strconv.Itoa(int(value)) - } - return json.Marshal(s) -} diff --git a/vendor/github.com/gogo/protobuf/proto/message_set.go b/vendor/github.com/gogo/protobuf/proto/message_set.go deleted file mode 100644 index f48a756761..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/message_set.go +++ /dev/null @@ -1,181 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Support for message sets. - */ - -import ( - "errors" -) - -// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. -// A message type ID is required for storing a protocol buffer in a message set. -var errNoMessageTypeID = errors.New("proto does not have a message type ID") - -// The first two types (_MessageSet_Item and messageSet) -// model what the protocol compiler produces for the following protocol message: -// message MessageSet { -// repeated group Item = 1 { -// required int32 type_id = 2; -// required string message = 3; -// }; -// } -// That is the MessageSet wire format. We can't use a proto to generate these -// because that would introduce a circular dependency between it and this package. - -type _MessageSet_Item struct { - TypeId *int32 `protobuf:"varint,2,req,name=type_id"` - Message []byte `protobuf:"bytes,3,req,name=message"` -} - -type messageSet struct { - Item []*_MessageSet_Item `protobuf:"group,1,rep"` - XXX_unrecognized []byte - // TODO: caching? -} - -// Make sure messageSet is a Message. -var _ Message = (*messageSet)(nil) - -// messageTypeIder is an interface satisfied by a protocol buffer type -// that may be stored in a MessageSet. -type messageTypeIder interface { - MessageTypeId() int32 -} - -func (ms *messageSet) find(pb Message) *_MessageSet_Item { - mti, ok := pb.(messageTypeIder) - if !ok { - return nil - } - id := mti.MessageTypeId() - for _, item := range ms.Item { - if *item.TypeId == id { - return item - } - } - return nil -} - -func (ms *messageSet) Has(pb Message) bool { - return ms.find(pb) != nil -} - -func (ms *messageSet) Unmarshal(pb Message) error { - if item := ms.find(pb); item != nil { - return Unmarshal(item.Message, pb) - } - if _, ok := pb.(messageTypeIder); !ok { - return errNoMessageTypeID - } - return nil // TODO: return error instead? -} - -func (ms *messageSet) Marshal(pb Message) error { - msg, err := Marshal(pb) - if err != nil { - return err - } - if item := ms.find(pb); item != nil { - // reuse existing item - item.Message = msg - return nil - } - - mti, ok := pb.(messageTypeIder) - if !ok { - return errNoMessageTypeID - } - - mtid := mti.MessageTypeId() - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: &mtid, - Message: msg, - }) - return nil -} - -func (ms *messageSet) Reset() { *ms = messageSet{} } -func (ms *messageSet) String() string { return CompactTextString(ms) } -func (*messageSet) ProtoMessage() {} - -// Support for the message_set_wire_format message option. - -func skipVarint(buf []byte) []byte { - i := 0 - for ; buf[i]&0x80 != 0; i++ { - } - return buf[i+1:] -} - -// unmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. -// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. -func unmarshalMessageSet(buf []byte, exts interface{}) error { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - m = exts.extensionsWrite() - case map[int32]Extension: - m = exts - default: - return errors.New("proto: not an extension map") - } - - ms := new(messageSet) - if err := Unmarshal(buf, ms); err != nil { - return err - } - for _, item := range ms.Item { - id := *item.TypeId - msg := item.Message - - // Restore wire type and field number varint, plus length varint. - // Be careful to preserve duplicate items. - b := EncodeVarint(uint64(id)<<3 | WireBytes) - if ext, ok := m[id]; ok { - // Existing data; rip off the tag and length varint - // so we join the new data correctly. - // We can assume that ext.enc is set because we are unmarshaling. - o := ext.enc[len(b):] // skip wire type and field number - _, n := DecodeVarint(o) // calculate length of length varint - o = o[n:] // skip length varint - msg = append(o, msg...) // join old data and new data - } - b = append(b, EncodeVarint(uint64(len(msg)))...) - b = append(b, msg...) - - m[id] = Extension{enc: b} - } - return nil -} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go deleted file mode 100644 index b6cad90834..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go +++ /dev/null @@ -1,357 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build purego appengine js - -// This file contains an implementation of proto field accesses using package reflect. -// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can -// be used on App Engine. - -package proto - -import ( - "reflect" - "sync" -) - -const unsafeAllowed = false - -// A field identifies a field in a struct, accessible from a pointer. -// In this implementation, a field is identified by the sequence of field indices -// passed to reflect's FieldByIndex. -type field []int - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return f.Index -} - -// invalidField is an invalid field identifier. -var invalidField = field(nil) - -// zeroField is a noop when calling pointer.offset. -var zeroField = field([]int{}) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { return f != nil } - -// The pointer type is for the table-driven decoder. -// The implementation here uses a reflect.Value of pointer type to -// create a generic pointer. In pointer_unsafe.go we use unsafe -// instead of reflect to implement the same (but faster) interface. -type pointer struct { - v reflect.Value -} - -// toPointer converts an interface of pointer type to a pointer -// that points to the same target. -func toPointer(i *Message) pointer { - return pointer{v: reflect.ValueOf(*i)} -} - -// toAddrPointer converts an interface to a pointer that points to -// the interface data. -func toAddrPointer(i *interface{}, isptr bool) pointer { - v := reflect.ValueOf(*i) - u := reflect.New(v.Type()) - u.Elem().Set(v) - return pointer{v: u} -} - -// valToPointer converts v to a pointer. v must be of pointer type. -func valToPointer(v reflect.Value) pointer { - return pointer{v: v} -} - -// offset converts from a pointer to a structure to a pointer to -// one of its fields. -func (p pointer) offset(f field) pointer { - return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} -} - -func (p pointer) isNil() bool { - return p.v.IsNil() -} - -// grow updates the slice s in place to make it one element longer. -// s must be addressable. -// Returns the (addressable) new element. -func grow(s reflect.Value) reflect.Value { - n, m := s.Len(), s.Cap() - if n < m { - s.SetLen(n + 1) - } else { - s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) - } - return s.Index(n) -} - -func (p pointer) toInt64() *int64 { - return p.v.Interface().(*int64) -} -func (p pointer) toInt64Ptr() **int64 { - return p.v.Interface().(**int64) -} -func (p pointer) toInt64Slice() *[]int64 { - return p.v.Interface().(*[]int64) -} - -var int32ptr = reflect.TypeOf((*int32)(nil)) - -func (p pointer) toInt32() *int32 { - return p.v.Convert(int32ptr).Interface().(*int32) -} - -// The toInt32Ptr/Slice methods don't work because of enums. -// Instead, we must use set/get methods for the int32ptr/slice case. -/* - func (p pointer) toInt32Ptr() **int32 { - return p.v.Interface().(**int32) -} - func (p pointer) toInt32Slice() *[]int32 { - return p.v.Interface().(*[]int32) -} -*/ -func (p pointer) getInt32Ptr() *int32 { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - return p.v.Elem().Interface().(*int32) - } - // an enum - return p.v.Elem().Convert(int32PtrType).Interface().(*int32) -} -func (p pointer) setInt32Ptr(v int32) { - // Allocate value in a *int32. Possibly convert that to a *enum. - // Then assign it to a **int32 or **enum. - // Note: we can convert *int32 to *enum, but we can't convert - // **int32 to **enum! - p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) -} - -// getInt32Slice copies []int32 from p as a new slice. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) getInt32Slice() []int32 { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - return p.v.Elem().Interface().([]int32) - } - // an enum - // Allocate a []int32, then assign []enum's values into it. - // Note: we can't convert []enum to []int32. - slice := p.v.Elem() - s := make([]int32, slice.Len()) - for i := 0; i < slice.Len(); i++ { - s[i] = int32(slice.Index(i).Int()) - } - return s -} - -// setInt32Slice copies []int32 into p as a new slice. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) setInt32Slice(v []int32) { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - p.v.Elem().Set(reflect.ValueOf(v)) - return - } - // an enum - // Allocate a []enum, then assign []int32's values into it. - // Note: we can't convert []enum to []int32. - slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) - for i, x := range v { - slice.Index(i).SetInt(int64(x)) - } - p.v.Elem().Set(slice) -} -func (p pointer) appendInt32Slice(v int32) { - grow(p.v.Elem()).SetInt(int64(v)) -} - -func (p pointer) toUint64() *uint64 { - return p.v.Interface().(*uint64) -} -func (p pointer) toUint64Ptr() **uint64 { - return p.v.Interface().(**uint64) -} -func (p pointer) toUint64Slice() *[]uint64 { - return p.v.Interface().(*[]uint64) -} -func (p pointer) toUint32() *uint32 { - return p.v.Interface().(*uint32) -} -func (p pointer) toUint32Ptr() **uint32 { - return p.v.Interface().(**uint32) -} -func (p pointer) toUint32Slice() *[]uint32 { - return p.v.Interface().(*[]uint32) -} -func (p pointer) toBool() *bool { - return p.v.Interface().(*bool) -} -func (p pointer) toBoolPtr() **bool { - return p.v.Interface().(**bool) -} -func (p pointer) toBoolSlice() *[]bool { - return p.v.Interface().(*[]bool) -} -func (p pointer) toFloat64() *float64 { - return p.v.Interface().(*float64) -} -func (p pointer) toFloat64Ptr() **float64 { - return p.v.Interface().(**float64) -} -func (p pointer) toFloat64Slice() *[]float64 { - return p.v.Interface().(*[]float64) -} -func (p pointer) toFloat32() *float32 { - return p.v.Interface().(*float32) -} -func (p pointer) toFloat32Ptr() **float32 { - return p.v.Interface().(**float32) -} -func (p pointer) toFloat32Slice() *[]float32 { - return p.v.Interface().(*[]float32) -} -func (p pointer) toString() *string { - return p.v.Interface().(*string) -} -func (p pointer) toStringPtr() **string { - return p.v.Interface().(**string) -} -func (p pointer) toStringSlice() *[]string { - return p.v.Interface().(*[]string) -} -func (p pointer) toBytes() *[]byte { - return p.v.Interface().(*[]byte) -} -func (p pointer) toBytesSlice() *[][]byte { - return p.v.Interface().(*[][]byte) -} -func (p pointer) toExtensions() *XXX_InternalExtensions { - return p.v.Interface().(*XXX_InternalExtensions) -} -func (p pointer) toOldExtensions() *map[int32]Extension { - return p.v.Interface().(*map[int32]Extension) -} -func (p pointer) getPointer() pointer { - return pointer{v: p.v.Elem()} -} -func (p pointer) setPointer(q pointer) { - p.v.Elem().Set(q.v) -} -func (p pointer) appendPointer(q pointer) { - grow(p.v.Elem()).Set(q.v) -} - -// getPointerSlice copies []*T from p as a new []pointer. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) getPointerSlice() []pointer { - if p.v.IsNil() { - return nil - } - n := p.v.Elem().Len() - s := make([]pointer, n) - for i := 0; i < n; i++ { - s[i] = pointer{v: p.v.Elem().Index(i)} - } - return s -} - -// setPointerSlice copies []pointer into p as a new []*T. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) setPointerSlice(v []pointer) { - if v == nil { - p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) - return - } - s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) - for _, p := range v { - s = reflect.Append(s, p.v) - } - p.v.Elem().Set(s) -} - -// getInterfacePointer returns a pointer that points to the -// interface data of the interface pointed by p. -func (p pointer) getInterfacePointer() pointer { - if p.v.Elem().IsNil() { - return pointer{v: p.v.Elem()} - } - return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct -} - -func (p pointer) asPointerTo(t reflect.Type) reflect.Value { - // TODO: check that p.v.Type().Elem() == t? - return p.v -} - -func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} -func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} -func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} -func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} - -var atomicLock sync.Mutex diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go deleted file mode 100644 index 7ffd3c29d9..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go +++ /dev/null @@ -1,59 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2018, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build purego appengine js - -// This file contains an implementation of proto field accesses using package reflect. -// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can -// be used on App Engine. - -package proto - -import ( - "reflect" -) - -// TODO: untested, so probably incorrect. - -func (p pointer) getRef() pointer { - return pointer{v: p.v.Addr()} -} - -func (p pointer) appendRef(v pointer, typ reflect.Type) { - slice := p.getSlice(typ) - elem := v.asPointerTo(typ).Elem() - newSlice := reflect.Append(slice, elem) - slice.Set(newSlice) -} - -func (p pointer) getSlice(typ reflect.Type) reflect.Value { - sliceTyp := reflect.SliceOf(typ) - slice := p.asPointerTo(sliceTyp) - slice = slice.Elem() - return slice -} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go deleted file mode 100644 index d55a335d94..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go +++ /dev/null @@ -1,308 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build !purego,!appengine,!js - -// This file contains the implementation of the proto field accesses using package unsafe. - -package proto - -import ( - "reflect" - "sync/atomic" - "unsafe" -) - -const unsafeAllowed = true - -// A field identifies a field in a struct, accessible from a pointer. -// In this implementation, a field is identified by its byte offset from the start of the struct. -type field uintptr - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return field(f.Offset) -} - -// invalidField is an invalid field identifier. -const invalidField = ^field(0) - -// zeroField is a noop when calling pointer.offset. -const zeroField = field(0) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { - return f != invalidField -} - -// The pointer type below is for the new table-driven encoder/decoder. -// The implementation here uses unsafe.Pointer to create a generic pointer. -// In pointer_reflect.go we use reflect instead of unsafe to implement -// the same (but slower) interface. -type pointer struct { - p unsafe.Pointer -} - -// size of pointer -var ptrSize = unsafe.Sizeof(uintptr(0)) - -// toPointer converts an interface of pointer type to a pointer -// that points to the same target. -func toPointer(i *Message) pointer { - // Super-tricky - read pointer out of data word of interface value. - // Saves ~25ns over the equivalent: - // return valToPointer(reflect.ValueOf(*i)) - return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} -} - -// toAddrPointer converts an interface to a pointer that points to -// the interface data. -func toAddrPointer(i *interface{}, isptr bool) pointer { - // Super-tricky - read or get the address of data word of interface value. - if isptr { - // The interface is of pointer type, thus it is a direct interface. - // The data word is the pointer data itself. We take its address. - return pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} - } - // The interface is not of pointer type. The data word is the pointer - // to the data. - return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} -} - -// valToPointer converts v to a pointer. v must be of pointer type. -func valToPointer(v reflect.Value) pointer { - return pointer{p: unsafe.Pointer(v.Pointer())} -} - -// offset converts from a pointer to a structure to a pointer to -// one of its fields. -func (p pointer) offset(f field) pointer { - // For safety, we should panic if !f.IsValid, however calling panic causes - // this to no longer be inlineable, which is a serious performance cost. - /* - if !f.IsValid() { - panic("invalid field") - } - */ - return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} -} - -func (p pointer) isNil() bool { - return p.p == nil -} - -func (p pointer) toInt64() *int64 { - return (*int64)(p.p) -} -func (p pointer) toInt64Ptr() **int64 { - return (**int64)(p.p) -} -func (p pointer) toInt64Slice() *[]int64 { - return (*[]int64)(p.p) -} -func (p pointer) toInt32() *int32 { - return (*int32)(p.p) -} - -// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. -/* - func (p pointer) toInt32Ptr() **int32 { - return (**int32)(p.p) - } - func (p pointer) toInt32Slice() *[]int32 { - return (*[]int32)(p.p) - } -*/ -func (p pointer) getInt32Ptr() *int32 { - return *(**int32)(p.p) -} -func (p pointer) setInt32Ptr(v int32) { - *(**int32)(p.p) = &v -} - -// getInt32Slice loads a []int32 from p. -// The value returned is aliased with the original slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) getInt32Slice() []int32 { - return *(*[]int32)(p.p) -} - -// setInt32Slice stores a []int32 to p. -// The value set is aliased with the input slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) setInt32Slice(v []int32) { - *(*[]int32)(p.p) = v -} - -// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? -func (p pointer) appendInt32Slice(v int32) { - s := (*[]int32)(p.p) - *s = append(*s, v) -} - -func (p pointer) toUint64() *uint64 { - return (*uint64)(p.p) -} -func (p pointer) toUint64Ptr() **uint64 { - return (**uint64)(p.p) -} -func (p pointer) toUint64Slice() *[]uint64 { - return (*[]uint64)(p.p) -} -func (p pointer) toUint32() *uint32 { - return (*uint32)(p.p) -} -func (p pointer) toUint32Ptr() **uint32 { - return (**uint32)(p.p) -} -func (p pointer) toUint32Slice() *[]uint32 { - return (*[]uint32)(p.p) -} -func (p pointer) toBool() *bool { - return (*bool)(p.p) -} -func (p pointer) toBoolPtr() **bool { - return (**bool)(p.p) -} -func (p pointer) toBoolSlice() *[]bool { - return (*[]bool)(p.p) -} -func (p pointer) toFloat64() *float64 { - return (*float64)(p.p) -} -func (p pointer) toFloat64Ptr() **float64 { - return (**float64)(p.p) -} -func (p pointer) toFloat64Slice() *[]float64 { - return (*[]float64)(p.p) -} -func (p pointer) toFloat32() *float32 { - return (*float32)(p.p) -} -func (p pointer) toFloat32Ptr() **float32 { - return (**float32)(p.p) -} -func (p pointer) toFloat32Slice() *[]float32 { - return (*[]float32)(p.p) -} -func (p pointer) toString() *string { - return (*string)(p.p) -} -func (p pointer) toStringPtr() **string { - return (**string)(p.p) -} -func (p pointer) toStringSlice() *[]string { - return (*[]string)(p.p) -} -func (p pointer) toBytes() *[]byte { - return (*[]byte)(p.p) -} -func (p pointer) toBytesSlice() *[][]byte { - return (*[][]byte)(p.p) -} -func (p pointer) toExtensions() *XXX_InternalExtensions { - return (*XXX_InternalExtensions)(p.p) -} -func (p pointer) toOldExtensions() *map[int32]Extension { - return (*map[int32]Extension)(p.p) -} - -// getPointerSlice loads []*T from p as a []pointer. -// The value returned is aliased with the original slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) getPointerSlice() []pointer { - // Super-tricky - p should point to a []*T where T is a - // message type. We load it as []pointer. - return *(*[]pointer)(p.p) -} - -// setPointerSlice stores []pointer into p as a []*T. -// The value set is aliased with the input slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) setPointerSlice(v []pointer) { - // Super-tricky - p should point to a []*T where T is a - // message type. We store it as []pointer. - *(*[]pointer)(p.p) = v -} - -// getPointer loads the pointer at p and returns it. -func (p pointer) getPointer() pointer { - return pointer{p: *(*unsafe.Pointer)(p.p)} -} - -// setPointer stores the pointer q at p. -func (p pointer) setPointer(q pointer) { - *(*unsafe.Pointer)(p.p) = q.p -} - -// append q to the slice pointed to by p. -func (p pointer) appendPointer(q pointer) { - s := (*[]unsafe.Pointer)(p.p) - *s = append(*s, q.p) -} - -// getInterfacePointer returns a pointer that points to the -// interface data of the interface pointed by p. -func (p pointer) getInterfacePointer() pointer { - // Super-tricky - read pointer out of data word of interface value. - return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} -} - -// asPointerTo returns a reflect.Value that is a pointer to an -// object of type t stored at p. -func (p pointer) asPointerTo(t reflect.Type) reflect.Value { - return reflect.NewAt(t, p.p) -} - -func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { - return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} -func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { - return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} -func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { - return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} -func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { - return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go deleted file mode 100644 index aca8eed02a..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go +++ /dev/null @@ -1,56 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2018, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build !purego,!appengine,!js - -// This file contains the implementation of the proto field accesses using package unsafe. - -package proto - -import ( - "reflect" - "unsafe" -) - -func (p pointer) getRef() pointer { - return pointer{p: (unsafe.Pointer)(&p.p)} -} - -func (p pointer) appendRef(v pointer, typ reflect.Type) { - slice := p.getSlice(typ) - elem := v.asPointerTo(typ).Elem() - newSlice := reflect.Append(slice, elem) - slice.Set(newSlice) -} - -func (p pointer) getSlice(typ reflect.Type) reflect.Value { - sliceTyp := reflect.SliceOf(typ) - slice := p.asPointerTo(sliceTyp) - slice = slice.Elem() - return slice -} diff --git a/vendor/github.com/gogo/protobuf/proto/properties.go b/vendor/github.com/gogo/protobuf/proto/properties.go deleted file mode 100644 index 28da1475fb..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/properties.go +++ /dev/null @@ -1,610 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "fmt" - "log" - "reflect" - "sort" - "strconv" - "strings" - "sync" -) - -const debug bool = false - -// Constants that identify the encoding of a value on the wire. -const ( - WireVarint = 0 - WireFixed64 = 1 - WireBytes = 2 - WireStartGroup = 3 - WireEndGroup = 4 - WireFixed32 = 5 -) - -// tagMap is an optimization over map[int]int for typical protocol buffer -// use-cases. Encoded protocol buffers are often in tag order with small tag -// numbers. -type tagMap struct { - fastTags []int - slowTags map[int]int -} - -// tagMapFastLimit is the upper bound on the tag number that will be stored in -// the tagMap slice rather than its map. -const tagMapFastLimit = 1024 - -func (p *tagMap) get(t int) (int, bool) { - if t > 0 && t < tagMapFastLimit { - if t >= len(p.fastTags) { - return 0, false - } - fi := p.fastTags[t] - return fi, fi >= 0 - } - fi, ok := p.slowTags[t] - return fi, ok -} - -func (p *tagMap) put(t int, fi int) { - if t > 0 && t < tagMapFastLimit { - for len(p.fastTags) < t+1 { - p.fastTags = append(p.fastTags, -1) - } - p.fastTags[t] = fi - return - } - if p.slowTags == nil { - p.slowTags = make(map[int]int) - } - p.slowTags[t] = fi -} - -// StructProperties represents properties for all the fields of a struct. -// decoderTags and decoderOrigNames should only be used by the decoder. -type StructProperties struct { - Prop []*Properties // properties for each field - reqCount int // required count - decoderTags tagMap // map from proto tag to struct field number - decoderOrigNames map[string]int // map from original name to struct field number - order []int // list of struct field numbers in tag order - - // OneofTypes contains information about the oneof fields in this message. - // It is keyed by the original name of a field. - OneofTypes map[string]*OneofProperties -} - -// OneofProperties represents information about a specific field in a oneof. -type OneofProperties struct { - Type reflect.Type // pointer to generated struct type for this oneof field - Field int // struct field number of the containing oneof in the message - Prop *Properties -} - -// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. -// See encode.go, (*Buffer).enc_struct. - -func (sp *StructProperties) Len() int { return len(sp.order) } -func (sp *StructProperties) Less(i, j int) bool { - return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag -} -func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } - -// Properties represents the protocol-specific behavior of a single struct field. -type Properties struct { - Name string // name of the field, for error messages - OrigName string // original name before protocol compiler (always set) - JSONName string // name to use for JSON; determined by protoc - Wire string - WireType int - Tag int - Required bool - Optional bool - Repeated bool - Packed bool // relevant for repeated primitives only - Enum string // set for enum types only - proto3 bool // whether this is known to be a proto3 field - oneof bool // whether this is a oneof field - - Default string // default value - HasDefault bool // whether an explicit default was provided - CustomType string - CastType string - StdTime bool - StdDuration bool - WktPointer bool - - stype reflect.Type // set for struct types only - ctype reflect.Type // set for custom types only - sprop *StructProperties // set for struct types only - - mtype reflect.Type // set for map types only - MapKeyProp *Properties // set for map types only - MapValProp *Properties // set for map types only -} - -// String formats the properties in the protobuf struct field tag style. -func (p *Properties) String() string { - s := p.Wire - s += "," - s += strconv.Itoa(p.Tag) - if p.Required { - s += ",req" - } - if p.Optional { - s += ",opt" - } - if p.Repeated { - s += ",rep" - } - if p.Packed { - s += ",packed" - } - s += ",name=" + p.OrigName - if p.JSONName != p.OrigName { - s += ",json=" + p.JSONName - } - if p.proto3 { - s += ",proto3" - } - if p.oneof { - s += ",oneof" - } - if len(p.Enum) > 0 { - s += ",enum=" + p.Enum - } - if p.HasDefault { - s += ",def=" + p.Default - } - return s -} - -// Parse populates p by parsing a string in the protobuf struct field tag style. -func (p *Properties) Parse(s string) { - // "bytes,49,opt,name=foo,def=hello!" - fields := strings.Split(s, ",") // breaks def=, but handled below. - if len(fields) < 2 { - log.Printf("proto: tag has too few fields: %q", s) - return - } - - p.Wire = fields[0] - switch p.Wire { - case "varint": - p.WireType = WireVarint - case "fixed32": - p.WireType = WireFixed32 - case "fixed64": - p.WireType = WireFixed64 - case "zigzag32": - p.WireType = WireVarint - case "zigzag64": - p.WireType = WireVarint - case "bytes", "group": - p.WireType = WireBytes - // no numeric converter for non-numeric types - default: - log.Printf("proto: tag has unknown wire type: %q", s) - return - } - - var err error - p.Tag, err = strconv.Atoi(fields[1]) - if err != nil { - return - } - -outer: - for i := 2; i < len(fields); i++ { - f := fields[i] - switch { - case f == "req": - p.Required = true - case f == "opt": - p.Optional = true - case f == "rep": - p.Repeated = true - case f == "packed": - p.Packed = true - case strings.HasPrefix(f, "name="): - p.OrigName = f[5:] - case strings.HasPrefix(f, "json="): - p.JSONName = f[5:] - case strings.HasPrefix(f, "enum="): - p.Enum = f[5:] - case f == "proto3": - p.proto3 = true - case f == "oneof": - p.oneof = true - case strings.HasPrefix(f, "def="): - p.HasDefault = true - p.Default = f[4:] // rest of string - if i+1 < len(fields) { - // Commas aren't escaped, and def is always last. - p.Default += "," + strings.Join(fields[i+1:], ",") - break outer - } - case strings.HasPrefix(f, "embedded="): - p.OrigName = strings.Split(f, "=")[1] - case strings.HasPrefix(f, "customtype="): - p.CustomType = strings.Split(f, "=")[1] - case strings.HasPrefix(f, "casttype="): - p.CastType = strings.Split(f, "=")[1] - case f == "stdtime": - p.StdTime = true - case f == "stdduration": - p.StdDuration = true - case f == "wktptr": - p.WktPointer = true - } - } -} - -var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() - -// setFieldProps initializes the field properties for submessages and maps. -func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { - isMap := typ.Kind() == reflect.Map - if len(p.CustomType) > 0 && !isMap { - p.ctype = typ - p.setTag(lockGetProp) - return - } - if p.StdTime && !isMap { - p.setTag(lockGetProp) - return - } - if p.StdDuration && !isMap { - p.setTag(lockGetProp) - return - } - if p.WktPointer && !isMap { - p.setTag(lockGetProp) - return - } - switch t1 := typ; t1.Kind() { - case reflect.Struct: - p.stype = typ - case reflect.Ptr: - if t1.Elem().Kind() == reflect.Struct { - p.stype = t1.Elem() - } - case reflect.Slice: - switch t2 := t1.Elem(); t2.Kind() { - case reflect.Ptr: - switch t3 := t2.Elem(); t3.Kind() { - case reflect.Struct: - p.stype = t3 - } - case reflect.Struct: - p.stype = t2 - } - - case reflect.Map: - - p.mtype = t1 - p.MapKeyProp = &Properties{} - p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) - p.MapValProp = &Properties{} - vtype := p.mtype.Elem() - if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { - // The value type is not a message (*T) or bytes ([]byte), - // so we need encoders for the pointer to this type. - vtype = reflect.PtrTo(vtype) - } - - p.MapValProp.CustomType = p.CustomType - p.MapValProp.StdDuration = p.StdDuration - p.MapValProp.StdTime = p.StdTime - p.MapValProp.WktPointer = p.WktPointer - p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) - } - p.setTag(lockGetProp) -} - -func (p *Properties) setTag(lockGetProp bool) { - if p.stype != nil { - if lockGetProp { - p.sprop = GetProperties(p.stype) - } else { - p.sprop = getPropertiesLocked(p.stype) - } - } -} - -var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() -) - -// Init populates the properties from a protocol buffer struct tag. -func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { - p.init(typ, name, tag, f, true) -} - -func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { - // "bytes,49,opt,def=hello!" - p.Name = name - p.OrigName = name - if tag == "" { - return - } - p.Parse(tag) - p.setFieldProps(typ, f, lockGetProp) -} - -var ( - propertiesMu sync.RWMutex - propertiesMap = make(map[reflect.Type]*StructProperties) -) - -// GetProperties returns the list of properties for the type represented by t. -// t must represent a generated struct type of a protocol message. -func GetProperties(t reflect.Type) *StructProperties { - if t.Kind() != reflect.Struct { - panic("proto: type must have kind struct") - } - - // Most calls to GetProperties in a long-running program will be - // retrieving details for types we have seen before. - propertiesMu.RLock() - sprop, ok := propertiesMap[t] - propertiesMu.RUnlock() - if ok { - return sprop - } - - propertiesMu.Lock() - sprop = getPropertiesLocked(t) - propertiesMu.Unlock() - return sprop -} - -type ( - oneofFuncsIface interface { - XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) - } - oneofWrappersIface interface { - XXX_OneofWrappers() []interface{} - } -) - -// getPropertiesLocked requires that propertiesMu is held. -func getPropertiesLocked(t reflect.Type) *StructProperties { - if prop, ok := propertiesMap[t]; ok { - return prop - } - - prop := new(StructProperties) - // in case of recursive protos, fill this in now. - propertiesMap[t] = prop - - // build properties - prop.Prop = make([]*Properties, t.NumField()) - prop.order = make([]int, t.NumField()) - - isOneofMessage := false - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - p := new(Properties) - name := f.Name - p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) - - oneof := f.Tag.Get("protobuf_oneof") // special case - if oneof != "" { - isOneofMessage = true - // Oneof fields don't use the traditional protobuf tag. - p.OrigName = oneof - } - prop.Prop[i] = p - prop.order[i] = i - if debug { - print(i, " ", f.Name, " ", t.String(), " ") - if p.Tag > 0 { - print(p.String()) - } - print("\n") - } - } - - // Re-order prop.order. - sort.Sort(prop) - - if isOneofMessage { - var oots []interface{} - switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { - case oneofFuncsIface: - _, _, _, oots = m.XXX_OneofFuncs() - case oneofWrappersIface: - oots = m.XXX_OneofWrappers() - } - if len(oots) > 0 { - // Interpret oneof metadata. - prop.OneofTypes = make(map[string]*OneofProperties) - for _, oot := range oots { - oop := &OneofProperties{ - Type: reflect.ValueOf(oot).Type(), // *T - Prop: new(Properties), - } - sft := oop.Type.Elem().Field(0) - oop.Prop.Name = sft.Name - oop.Prop.Parse(sft.Tag.Get("protobuf")) - // There will be exactly one interface field that - // this new value is assignable to. - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if f.Type.Kind() != reflect.Interface { - continue - } - if !oop.Type.AssignableTo(f.Type) { - continue - } - oop.Field = i - break - } - prop.OneofTypes[oop.Prop.OrigName] = oop - } - } - } - - // build required counts - // build tags - reqCount := 0 - prop.decoderOrigNames = make(map[string]int) - for i, p := range prop.Prop { - if strings.HasPrefix(p.Name, "XXX_") { - // Internal fields should not appear in tags/origNames maps. - // They are handled specially when encoding and decoding. - continue - } - if p.Required { - reqCount++ - } - prop.decoderTags.put(p.Tag, i) - prop.decoderOrigNames[p.OrigName] = i - } - prop.reqCount = reqCount - - return prop -} - -// A global registry of enum types. -// The generated code will register the generated maps by calling RegisterEnum. - -var enumValueMaps = make(map[string]map[string]int32) -var enumStringMaps = make(map[string]map[int32]string) - -// RegisterEnum is called from the generated code to install the enum descriptor -// maps into the global table to aid parsing text format protocol buffers. -func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { - if _, ok := enumValueMaps[typeName]; ok { - panic("proto: duplicate enum registered: " + typeName) - } - enumValueMaps[typeName] = valueMap - if _, ok := enumStringMaps[typeName]; ok { - panic("proto: duplicate enum registered: " + typeName) - } - enumStringMaps[typeName] = unusedNameMap -} - -// EnumValueMap returns the mapping from names to integers of the -// enum type enumType, or a nil if not found. -func EnumValueMap(enumType string) map[string]int32 { - return enumValueMaps[enumType] -} - -// A registry of all linked message types. -// The string is a fully-qualified proto name ("pkg.Message"). -var ( - protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers - protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types - revProtoTypes = make(map[reflect.Type]string) -) - -// RegisterType is called from generated code and maps from the fully qualified -// proto name to the type (pointer to struct) of the protocol buffer. -func RegisterType(x Message, name string) { - if _, ok := protoTypedNils[name]; ok { - // TODO: Some day, make this a panic. - log.Printf("proto: duplicate proto type registered: %s", name) - return - } - t := reflect.TypeOf(x) - if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { - // Generated code always calls RegisterType with nil x. - // This check is just for extra safety. - protoTypedNils[name] = x - } else { - protoTypedNils[name] = reflect.Zero(t).Interface().(Message) - } - revProtoTypes[t] = name -} - -// RegisterMapType is called from generated code and maps from the fully qualified -// proto name to the native map type of the proto map definition. -func RegisterMapType(x interface{}, name string) { - if reflect.TypeOf(x).Kind() != reflect.Map { - panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) - } - if _, ok := protoMapTypes[name]; ok { - log.Printf("proto: duplicate proto type registered: %s", name) - return - } - t := reflect.TypeOf(x) - protoMapTypes[name] = t - revProtoTypes[t] = name -} - -// MessageName returns the fully-qualified proto name for the given message type. -func MessageName(x Message) string { - type xname interface { - XXX_MessageName() string - } - if m, ok := x.(xname); ok { - return m.XXX_MessageName() - } - return revProtoTypes[reflect.TypeOf(x)] -} - -// MessageType returns the message type (pointer to struct) for a named message. -// The type is not guaranteed to implement proto.Message if the name refers to a -// map entry. -func MessageType(name string) reflect.Type { - if t, ok := protoTypedNils[name]; ok { - return reflect.TypeOf(t) - } - return protoMapTypes[name] -} - -// A registry of all linked proto files. -var ( - protoFiles = make(map[string][]byte) // file name => fileDescriptor -) - -// RegisterFile is called from generated code and maps from the -// full file name of a .proto file to its compressed FileDescriptorProto. -func RegisterFile(filename string, fileDescriptor []byte) { - protoFiles[filename] = fileDescriptor -} - -// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. -func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/gogo/protobuf/proto/properties_gogo.go b/vendor/github.com/gogo/protobuf/proto/properties_gogo.go deleted file mode 100644 index 40ea3dd935..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/properties_gogo.go +++ /dev/null @@ -1,36 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2018, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "reflect" -) - -var sizerType = reflect.TypeOf((*Sizer)(nil)).Elem() -var protosizerType = reflect.TypeOf((*ProtoSizer)(nil)).Elem() diff --git a/vendor/github.com/gogo/protobuf/proto/skip_gogo.go b/vendor/github.com/gogo/protobuf/proto/skip_gogo.go deleted file mode 100644 index 5a5fd93f7c..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/skip_gogo.go +++ /dev/null @@ -1,119 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "io" -) - -func Skip(data []byte) (n int, err error) { - l := len(data) - index := 0 - for index < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - b := data[index] - index++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - index++ - if data[index-1] < 0x80 { - break - } - } - return index, nil - case 1: - index += 8 - return index, nil - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - b := data[index] - index++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - index += length - return index, nil - case 3: - for { - var innerWire uint64 - var start int = index - for shift := uint(0); ; shift += 7 { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - b := data[index] - index++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := Skip(data[start:]) - if err != nil { - return 0, err - } - index = start + next - } - return index, nil - case 4: - return index, nil - case 5: - index += 4 - return index, nil - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - } - panic("unreachable") -} diff --git a/vendor/github.com/gogo/protobuf/proto/table_marshal.go b/vendor/github.com/gogo/protobuf/proto/table_marshal.go deleted file mode 100644 index f8babdefab..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/table_marshal.go +++ /dev/null @@ -1,3009 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "errors" - "fmt" - "math" - "reflect" - "sort" - "strconv" - "strings" - "sync" - "sync/atomic" - "unicode/utf8" -) - -// a sizer takes a pointer to a field and the size of its tag, computes the size of -// the encoded data. -type sizer func(pointer, int) int - -// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), -// marshals the field to the end of the slice, returns the slice and error (if any). -type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) - -// marshalInfo is the information used for marshaling a message. -type marshalInfo struct { - typ reflect.Type - fields []*marshalFieldInfo - unrecognized field // offset of XXX_unrecognized - extensions field // offset of XXX_InternalExtensions - v1extensions field // offset of XXX_extensions - sizecache field // offset of XXX_sizecache - initialized int32 // 0 -- only typ is set, 1 -- fully initialized - messageset bool // uses message set wire format - hasmarshaler bool // has custom marshaler - sync.RWMutex // protect extElems map, also for initialization - extElems map[int32]*marshalElemInfo // info of extension elements - - hassizer bool // has custom sizer - hasprotosizer bool // has custom protosizer - - bytesExtensions field // offset of XXX_extensions where the field type is []byte -} - -// marshalFieldInfo is the information used for marshaling a field of a message. -type marshalFieldInfo struct { - field field - wiretag uint64 // tag in wire format - tagsize int // size of tag in wire format - sizer sizer - marshaler marshaler - isPointer bool - required bool // field is required - name string // name of the field, for error reporting - oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements -} - -// marshalElemInfo is the information used for marshaling an extension or oneof element. -type marshalElemInfo struct { - wiretag uint64 // tag in wire format - tagsize int // size of tag in wire format - sizer sizer - marshaler marshaler - isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) -} - -var ( - marshalInfoMap = map[reflect.Type]*marshalInfo{} - marshalInfoLock sync.Mutex - - uint8SliceType = reflect.TypeOf(([]uint8)(nil)).Kind() -) - -// getMarshalInfo returns the information to marshal a given type of message. -// The info it returns may not necessarily initialized. -// t is the type of the message (NOT the pointer to it). -func getMarshalInfo(t reflect.Type) *marshalInfo { - marshalInfoLock.Lock() - u, ok := marshalInfoMap[t] - if !ok { - u = &marshalInfo{typ: t} - marshalInfoMap[t] = u - } - marshalInfoLock.Unlock() - return u -} - -// Size is the entry point from generated code, -// and should be ONLY called by generated code. -// It computes the size of encoded data of msg. -// a is a pointer to a place to store cached marshal info. -func (a *InternalMessageInfo) Size(msg Message) int { - u := getMessageMarshalInfo(msg, a) - ptr := toPointer(&msg) - if ptr.isNil() { - // We get here if msg is a typed nil ((*SomeMessage)(nil)), - // so it satisfies the interface, and msg == nil wouldn't - // catch it. We don't want crash in this case. - return 0 - } - return u.size(ptr) -} - -// Marshal is the entry point from generated code, -// and should be ONLY called by generated code. -// It marshals msg to the end of b. -// a is a pointer to a place to store cached marshal info. -func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { - u := getMessageMarshalInfo(msg, a) - ptr := toPointer(&msg) - if ptr.isNil() { - // We get here if msg is a typed nil ((*SomeMessage)(nil)), - // so it satisfies the interface, and msg == nil wouldn't - // catch it. We don't want crash in this case. - return b, ErrNil - } - return u.marshal(b, ptr, deterministic) -} - -func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { - // u := a.marshal, but atomically. - // We use an atomic here to ensure memory consistency. - u := atomicLoadMarshalInfo(&a.marshal) - if u == nil { - // Get marshal information from type of message. - t := reflect.ValueOf(msg).Type() - if t.Kind() != reflect.Ptr { - panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) - } - u = getMarshalInfo(t.Elem()) - // Store it in the cache for later users. - // a.marshal = u, but atomically. - atomicStoreMarshalInfo(&a.marshal, u) - } - return u -} - -// size is the main function to compute the size of the encoded data of a message. -// ptr is the pointer to the message. -func (u *marshalInfo) size(ptr pointer) int { - if atomic.LoadInt32(&u.initialized) == 0 { - u.computeMarshalInfo() - } - - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if u.hasmarshaler { - // Uses the message's Size method if available - if u.hassizer { - s := ptr.asPointerTo(u.typ).Interface().(Sizer) - return s.Size() - } - // Uses the message's ProtoSize method if available - if u.hasprotosizer { - s := ptr.asPointerTo(u.typ).Interface().(ProtoSizer) - return s.ProtoSize() - } - - m := ptr.asPointerTo(u.typ).Interface().(Marshaler) - b, _ := m.Marshal() - return len(b) - } - - n := 0 - for _, f := range u.fields { - if f.isPointer && ptr.offset(f.field).getPointer().isNil() { - // nil pointer always marshals to nothing - continue - } - n += f.sizer(ptr.offset(f.field), f.tagsize) - } - if u.extensions.IsValid() { - e := ptr.offset(u.extensions).toExtensions() - if u.messageset { - n += u.sizeMessageSet(e) - } else { - n += u.sizeExtensions(e) - } - } - if u.v1extensions.IsValid() { - m := *ptr.offset(u.v1extensions).toOldExtensions() - n += u.sizeV1Extensions(m) - } - if u.bytesExtensions.IsValid() { - s := *ptr.offset(u.bytesExtensions).toBytes() - n += len(s) - } - if u.unrecognized.IsValid() { - s := *ptr.offset(u.unrecognized).toBytes() - n += len(s) - } - - // cache the result for use in marshal - if u.sizecache.IsValid() { - atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) - } - return n -} - -// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), -// fall back to compute the size. -func (u *marshalInfo) cachedsize(ptr pointer) int { - if u.sizecache.IsValid() { - return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) - } - return u.size(ptr) -} - -// marshal is the main function to marshal a message. It takes a byte slice and appends -// the encoded data to the end of the slice, returns the slice and error (if any). -// ptr is the pointer to the message. -// If deterministic is true, map is marshaled in deterministic order. -func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { - if atomic.LoadInt32(&u.initialized) == 0 { - u.computeMarshalInfo() - } - - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if u.hasmarshaler { - m := ptr.asPointerTo(u.typ).Interface().(Marshaler) - b1, err := m.Marshal() - b = append(b, b1...) - return b, err - } - - var err, errLater error - // The old marshaler encodes extensions at beginning. - if u.extensions.IsValid() { - e := ptr.offset(u.extensions).toExtensions() - if u.messageset { - b, err = u.appendMessageSet(b, e, deterministic) - } else { - b, err = u.appendExtensions(b, e, deterministic) - } - if err != nil { - return b, err - } - } - if u.v1extensions.IsValid() { - m := *ptr.offset(u.v1extensions).toOldExtensions() - b, err = u.appendV1Extensions(b, m, deterministic) - if err != nil { - return b, err - } - } - if u.bytesExtensions.IsValid() { - s := *ptr.offset(u.bytesExtensions).toBytes() - b = append(b, s...) - } - for _, f := range u.fields { - if f.required { - if f.isPointer && ptr.offset(f.field).getPointer().isNil() { - // Required field is not set. - // We record the error but keep going, to give a complete marshaling. - if errLater == nil { - errLater = &RequiredNotSetError{f.name} - } - continue - } - } - if f.isPointer && ptr.offset(f.field).getPointer().isNil() { - // nil pointer always marshals to nothing - continue - } - b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) - if err != nil { - if err1, ok := err.(*RequiredNotSetError); ok { - // Required field in submessage is not set. - // We record the error but keep going, to give a complete marshaling. - if errLater == nil { - errLater = &RequiredNotSetError{f.name + "." + err1.field} - } - continue - } - if err == errRepeatedHasNil { - err = errors.New("proto: repeated field " + f.name + " has nil element") - } - if err == errInvalidUTF8 { - if errLater == nil { - fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name - errLater = &invalidUTF8Error{fullName} - } - continue - } - return b, err - } - } - if u.unrecognized.IsValid() { - s := *ptr.offset(u.unrecognized).toBytes() - b = append(b, s...) - } - return b, errLater -} - -// computeMarshalInfo initializes the marshal info. -func (u *marshalInfo) computeMarshalInfo() { - u.Lock() - defer u.Unlock() - if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock - return - } - - t := u.typ - u.unrecognized = invalidField - u.extensions = invalidField - u.v1extensions = invalidField - u.bytesExtensions = invalidField - u.sizecache = invalidField - isOneofMessage := false - - if reflect.PtrTo(t).Implements(sizerType) { - u.hassizer = true - } - if reflect.PtrTo(t).Implements(protosizerType) { - u.hasprotosizer = true - } - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if reflect.PtrTo(t).Implements(marshalerType) { - u.hasmarshaler = true - atomic.StoreInt32(&u.initialized, 1) - return - } - - n := t.NumField() - - // deal with XXX fields first - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if f.Tag.Get("protobuf_oneof") != "" { - isOneofMessage = true - } - if !strings.HasPrefix(f.Name, "XXX_") { - continue - } - switch f.Name { - case "XXX_sizecache": - u.sizecache = toField(&f) - case "XXX_unrecognized": - u.unrecognized = toField(&f) - case "XXX_InternalExtensions": - u.extensions = toField(&f) - u.messageset = f.Tag.Get("protobuf_messageset") == "1" - case "XXX_extensions": - if f.Type.Kind() == reflect.Map { - u.v1extensions = toField(&f) - } else { - u.bytesExtensions = toField(&f) - } - case "XXX_NoUnkeyedLiteral": - // nothing to do - default: - panic("unknown XXX field: " + f.Name) - } - n-- - } - - // get oneof implementers - var oneofImplementers []interface{} - // gogo: isOneofMessage is needed for embedded oneof messages, without a marshaler and unmarshaler - if isOneofMessage { - switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { - case oneofFuncsIface: - _, _, _, oneofImplementers = m.XXX_OneofFuncs() - case oneofWrappersIface: - oneofImplementers = m.XXX_OneofWrappers() - } - } - - // normal fields - fields := make([]marshalFieldInfo, n) // batch allocation - u.fields = make([]*marshalFieldInfo, 0, n) - for i, j := 0, 0; i < t.NumField(); i++ { - f := t.Field(i) - - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - field := &fields[j] - j++ - field.name = f.Name - u.fields = append(u.fields, field) - if f.Tag.Get("protobuf_oneof") != "" { - field.computeOneofFieldInfo(&f, oneofImplementers) - continue - } - if f.Tag.Get("protobuf") == "" { - // field has no tag (not in generated message), ignore it - u.fields = u.fields[:len(u.fields)-1] - j-- - continue - } - field.computeMarshalFieldInfo(&f) - } - - // fields are marshaled in tag order on the wire. - sort.Sort(byTag(u.fields)) - - atomic.StoreInt32(&u.initialized, 1) -} - -// helper for sorting fields by tag -type byTag []*marshalFieldInfo - -func (a byTag) Len() int { return len(a) } -func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } - -// getExtElemInfo returns the information to marshal an extension element. -// The info it returns is initialized. -func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { - // get from cache first - u.RLock() - e, ok := u.extElems[desc.Field] - u.RUnlock() - if ok { - return e - } - - t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct - tags := strings.Split(desc.Tag, ",") - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - sizr, marshalr := typeMarshaler(t, tags, false, false) - e = &marshalElemInfo{ - wiretag: uint64(tag)<<3 | wt, - tagsize: SizeVarint(uint64(tag) << 3), - sizer: sizr, - marshaler: marshalr, - isptr: t.Kind() == reflect.Ptr, - } - - // update cache - u.Lock() - if u.extElems == nil { - u.extElems = make(map[int32]*marshalElemInfo) - } - u.extElems[desc.Field] = e - u.Unlock() - return e -} - -// computeMarshalFieldInfo fills up the information to marshal a field. -func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { - // parse protobuf tag of the field. - // tag has format of "bytes,49,opt,name=foo,def=hello!" - tags := strings.Split(f.Tag.Get("protobuf"), ",") - if tags[0] == "" { - return - } - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - if tags[2] == "req" { - fi.required = true - } - fi.setTag(f, tag, wt) - fi.setMarshaler(f, tags) -} - -func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { - fi.field = toField(f) - fi.wiretag = math.MaxInt32 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. - fi.isPointer = true - fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) - fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) - - ityp := f.Type // interface type - for _, o := range oneofImplementers { - t := reflect.TypeOf(o) - if !t.Implements(ityp) { - continue - } - sf := t.Elem().Field(0) // oneof implementer is a struct with a single field - tags := strings.Split(sf.Tag.Get("protobuf"), ",") - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - sizr, marshalr := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value - fi.oneofElems[t.Elem()] = &marshalElemInfo{ - wiretag: uint64(tag)<<3 | wt, - tagsize: SizeVarint(uint64(tag) << 3), - sizer: sizr, - marshaler: marshalr, - } - } -} - -// wiretype returns the wire encoding of the type. -func wiretype(encoding string) uint64 { - switch encoding { - case "fixed32": - return WireFixed32 - case "fixed64": - return WireFixed64 - case "varint", "zigzag32", "zigzag64": - return WireVarint - case "bytes": - return WireBytes - case "group": - return WireStartGroup - } - panic("unknown wire type " + encoding) -} - -// setTag fills up the tag (in wire format) and its size in the info of a field. -func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { - fi.field = toField(f) - fi.wiretag = uint64(tag)<<3 | wt - fi.tagsize = SizeVarint(uint64(tag) << 3) -} - -// setMarshaler fills up the sizer and marshaler in the info of a field. -func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { - switch f.Type.Kind() { - case reflect.Map: - // map field - fi.isPointer = true - fi.sizer, fi.marshaler = makeMapMarshaler(f) - return - case reflect.Ptr, reflect.Slice: - fi.isPointer = true - } - fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) -} - -// typeMarshaler returns the sizer and marshaler of a given field. -// t is the type of the field. -// tags is the generated "protobuf" tag of the field. -// If nozero is true, zero value is not marshaled to the wire. -// If oneof is true, it is a oneof field. -func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { - encoding := tags[0] - - pointer := false - slice := false - if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { - slice = true - t = t.Elem() - } - if t.Kind() == reflect.Ptr { - pointer = true - t = t.Elem() - } - - packed := false - proto3 := false - ctype := false - isTime := false - isDuration := false - isWktPointer := false - validateUTF8 := true - for i := 2; i < len(tags); i++ { - if tags[i] == "packed" { - packed = true - } - if tags[i] == "proto3" { - proto3 = true - } - if strings.HasPrefix(tags[i], "customtype=") { - ctype = true - } - if tags[i] == "stdtime" { - isTime = true - } - if tags[i] == "stdduration" { - isDuration = true - } - if tags[i] == "wktptr" { - isWktPointer = true - } - } - validateUTF8 = validateUTF8 && proto3 - if !proto3 && !pointer && !slice { - nozero = false - } - - if ctype { - if reflect.PtrTo(t).Implements(customType) { - if slice { - return makeMessageRefSliceMarshaler(getMarshalInfo(t)) - } - if pointer { - return makeCustomPtrMarshaler(getMarshalInfo(t)) - } - return makeCustomMarshaler(getMarshalInfo(t)) - } else { - panic(fmt.Sprintf("custom type: type: %v, does not implement the proto.custom interface", t)) - } - } - - if isTime { - if pointer { - if slice { - return makeTimePtrSliceMarshaler(getMarshalInfo(t)) - } - return makeTimePtrMarshaler(getMarshalInfo(t)) - } - if slice { - return makeTimeSliceMarshaler(getMarshalInfo(t)) - } - return makeTimeMarshaler(getMarshalInfo(t)) - } - - if isDuration { - if pointer { - if slice { - return makeDurationPtrSliceMarshaler(getMarshalInfo(t)) - } - return makeDurationPtrMarshaler(getMarshalInfo(t)) - } - if slice { - return makeDurationSliceMarshaler(getMarshalInfo(t)) - } - return makeDurationMarshaler(getMarshalInfo(t)) - } - - if isWktPointer { - switch t.Kind() { - case reflect.Float64: - if pointer { - if slice { - return makeStdDoubleValuePtrSliceMarshaler(getMarshalInfo(t)) - } - return makeStdDoubleValuePtrMarshaler(getMarshalInfo(t)) - } - if slice { - return makeStdDoubleValueSliceMarshaler(getMarshalInfo(t)) - } - return makeStdDoubleValueMarshaler(getMarshalInfo(t)) - case reflect.Float32: - if pointer { - if slice { - return makeStdFloatValuePtrSliceMarshaler(getMarshalInfo(t)) - } - return makeStdFloatValuePtrMarshaler(getMarshalInfo(t)) - } - if slice { - return makeStdFloatValueSliceMarshaler(getMarshalInfo(t)) - } - return makeStdFloatValueMarshaler(getMarshalInfo(t)) - case reflect.Int64: - if pointer { - if slice { - return makeStdInt64ValuePtrSliceMarshaler(getMarshalInfo(t)) - } - return makeStdInt64ValuePtrMarshaler(getMarshalInfo(t)) - } - if slice { - return makeStdInt64ValueSliceMarshaler(getMarshalInfo(t)) - } - return makeStdInt64ValueMarshaler(getMarshalInfo(t)) - case reflect.Uint64: - if pointer { - if slice { - return makeStdUInt64ValuePtrSliceMarshaler(getMarshalInfo(t)) - } - return makeStdUInt64ValuePtrMarshaler(getMarshalInfo(t)) - } - if slice { - return makeStdUInt64ValueSliceMarshaler(getMarshalInfo(t)) - } - return makeStdUInt64ValueMarshaler(getMarshalInfo(t)) - case reflect.Int32: - if pointer { - if slice { - return makeStdInt32ValuePtrSliceMarshaler(getMarshalInfo(t)) - } - return makeStdInt32ValuePtrMarshaler(getMarshalInfo(t)) - } - if slice { - return makeStdInt32ValueSliceMarshaler(getMarshalInfo(t)) - } - return makeStdInt32ValueMarshaler(getMarshalInfo(t)) - case reflect.Uint32: - if pointer { - if slice { - return makeStdUInt32ValuePtrSliceMarshaler(getMarshalInfo(t)) - } - return makeStdUInt32ValuePtrMarshaler(getMarshalInfo(t)) - } - if slice { - return makeStdUInt32ValueSliceMarshaler(getMarshalInfo(t)) - } - return makeStdUInt32ValueMarshaler(getMarshalInfo(t)) - case reflect.Bool: - if pointer { - if slice { - return makeStdBoolValuePtrSliceMarshaler(getMarshalInfo(t)) - } - return makeStdBoolValuePtrMarshaler(getMarshalInfo(t)) - } - if slice { - return makeStdBoolValueSliceMarshaler(getMarshalInfo(t)) - } - return makeStdBoolValueMarshaler(getMarshalInfo(t)) - case reflect.String: - if pointer { - if slice { - return makeStdStringValuePtrSliceMarshaler(getMarshalInfo(t)) - } - return makeStdStringValuePtrMarshaler(getMarshalInfo(t)) - } - if slice { - return makeStdStringValueSliceMarshaler(getMarshalInfo(t)) - } - return makeStdStringValueMarshaler(getMarshalInfo(t)) - case uint8SliceType: - if pointer { - if slice { - return makeStdBytesValuePtrSliceMarshaler(getMarshalInfo(t)) - } - return makeStdBytesValuePtrMarshaler(getMarshalInfo(t)) - } - if slice { - return makeStdBytesValueSliceMarshaler(getMarshalInfo(t)) - } - return makeStdBytesValueMarshaler(getMarshalInfo(t)) - default: - panic(fmt.Sprintf("unknown wktpointer type %#v", t)) - } - } - - switch t.Kind() { - case reflect.Bool: - if pointer { - return sizeBoolPtr, appendBoolPtr - } - if slice { - if packed { - return sizeBoolPackedSlice, appendBoolPackedSlice - } - return sizeBoolSlice, appendBoolSlice - } - if nozero { - return sizeBoolValueNoZero, appendBoolValueNoZero - } - return sizeBoolValue, appendBoolValue - case reflect.Uint32: - switch encoding { - case "fixed32": - if pointer { - return sizeFixed32Ptr, appendFixed32Ptr - } - if slice { - if packed { - return sizeFixed32PackedSlice, appendFixed32PackedSlice - } - return sizeFixed32Slice, appendFixed32Slice - } - if nozero { - return sizeFixed32ValueNoZero, appendFixed32ValueNoZero - } - return sizeFixed32Value, appendFixed32Value - case "varint": - if pointer { - return sizeVarint32Ptr, appendVarint32Ptr - } - if slice { - if packed { - return sizeVarint32PackedSlice, appendVarint32PackedSlice - } - return sizeVarint32Slice, appendVarint32Slice - } - if nozero { - return sizeVarint32ValueNoZero, appendVarint32ValueNoZero - } - return sizeVarint32Value, appendVarint32Value - } - case reflect.Int32: - switch encoding { - case "fixed32": - if pointer { - return sizeFixedS32Ptr, appendFixedS32Ptr - } - if slice { - if packed { - return sizeFixedS32PackedSlice, appendFixedS32PackedSlice - } - return sizeFixedS32Slice, appendFixedS32Slice - } - if nozero { - return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero - } - return sizeFixedS32Value, appendFixedS32Value - case "varint": - if pointer { - return sizeVarintS32Ptr, appendVarintS32Ptr - } - if slice { - if packed { - return sizeVarintS32PackedSlice, appendVarintS32PackedSlice - } - return sizeVarintS32Slice, appendVarintS32Slice - } - if nozero { - return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero - } - return sizeVarintS32Value, appendVarintS32Value - case "zigzag32": - if pointer { - return sizeZigzag32Ptr, appendZigzag32Ptr - } - if slice { - if packed { - return sizeZigzag32PackedSlice, appendZigzag32PackedSlice - } - return sizeZigzag32Slice, appendZigzag32Slice - } - if nozero { - return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero - } - return sizeZigzag32Value, appendZigzag32Value - } - case reflect.Uint64: - switch encoding { - case "fixed64": - if pointer { - return sizeFixed64Ptr, appendFixed64Ptr - } - if slice { - if packed { - return sizeFixed64PackedSlice, appendFixed64PackedSlice - } - return sizeFixed64Slice, appendFixed64Slice - } - if nozero { - return sizeFixed64ValueNoZero, appendFixed64ValueNoZero - } - return sizeFixed64Value, appendFixed64Value - case "varint": - if pointer { - return sizeVarint64Ptr, appendVarint64Ptr - } - if slice { - if packed { - return sizeVarint64PackedSlice, appendVarint64PackedSlice - } - return sizeVarint64Slice, appendVarint64Slice - } - if nozero { - return sizeVarint64ValueNoZero, appendVarint64ValueNoZero - } - return sizeVarint64Value, appendVarint64Value - } - case reflect.Int64: - switch encoding { - case "fixed64": - if pointer { - return sizeFixedS64Ptr, appendFixedS64Ptr - } - if slice { - if packed { - return sizeFixedS64PackedSlice, appendFixedS64PackedSlice - } - return sizeFixedS64Slice, appendFixedS64Slice - } - if nozero { - return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero - } - return sizeFixedS64Value, appendFixedS64Value - case "varint": - if pointer { - return sizeVarintS64Ptr, appendVarintS64Ptr - } - if slice { - if packed { - return sizeVarintS64PackedSlice, appendVarintS64PackedSlice - } - return sizeVarintS64Slice, appendVarintS64Slice - } - if nozero { - return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero - } - return sizeVarintS64Value, appendVarintS64Value - case "zigzag64": - if pointer { - return sizeZigzag64Ptr, appendZigzag64Ptr - } - if slice { - if packed { - return sizeZigzag64PackedSlice, appendZigzag64PackedSlice - } - return sizeZigzag64Slice, appendZigzag64Slice - } - if nozero { - return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero - } - return sizeZigzag64Value, appendZigzag64Value - } - case reflect.Float32: - if pointer { - return sizeFloat32Ptr, appendFloat32Ptr - } - if slice { - if packed { - return sizeFloat32PackedSlice, appendFloat32PackedSlice - } - return sizeFloat32Slice, appendFloat32Slice - } - if nozero { - return sizeFloat32ValueNoZero, appendFloat32ValueNoZero - } - return sizeFloat32Value, appendFloat32Value - case reflect.Float64: - if pointer { - return sizeFloat64Ptr, appendFloat64Ptr - } - if slice { - if packed { - return sizeFloat64PackedSlice, appendFloat64PackedSlice - } - return sizeFloat64Slice, appendFloat64Slice - } - if nozero { - return sizeFloat64ValueNoZero, appendFloat64ValueNoZero - } - return sizeFloat64Value, appendFloat64Value - case reflect.String: - if validateUTF8 { - if pointer { - return sizeStringPtr, appendUTF8StringPtr - } - if slice { - return sizeStringSlice, appendUTF8StringSlice - } - if nozero { - return sizeStringValueNoZero, appendUTF8StringValueNoZero - } - return sizeStringValue, appendUTF8StringValue - } - if pointer { - return sizeStringPtr, appendStringPtr - } - if slice { - return sizeStringSlice, appendStringSlice - } - if nozero { - return sizeStringValueNoZero, appendStringValueNoZero - } - return sizeStringValue, appendStringValue - case reflect.Slice: - if slice { - return sizeBytesSlice, appendBytesSlice - } - if oneof { - // Oneof bytes field may also have "proto3" tag. - // We want to marshal it as a oneof field. Do this - // check before the proto3 check. - return sizeBytesOneof, appendBytesOneof - } - if proto3 { - return sizeBytes3, appendBytes3 - } - return sizeBytes, appendBytes - case reflect.Struct: - switch encoding { - case "group": - if slice { - return makeGroupSliceMarshaler(getMarshalInfo(t)) - } - return makeGroupMarshaler(getMarshalInfo(t)) - case "bytes": - if pointer { - if slice { - return makeMessageSliceMarshaler(getMarshalInfo(t)) - } - return makeMessageMarshaler(getMarshalInfo(t)) - } else { - if slice { - return makeMessageRefSliceMarshaler(getMarshalInfo(t)) - } - return makeMessageRefMarshaler(getMarshalInfo(t)) - } - } - } - panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) -} - -// Below are functions to size/marshal a specific type of a field. -// They are stored in the field's info, and called by function pointers. -// They have type sizer or marshaler. - -func sizeFixed32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFixed32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFixed32Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - return (4 + tagsize) * len(s) -} -func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFixedS32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFixedS32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFixedS32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - return (4 + tagsize) * len(s) -} -func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFloat32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { - v := math.Float32bits(*ptr.toFloat32()) - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFloat32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toFloat32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFloat32Slice(ptr pointer, tagsize int) int { - s := *ptr.toFloat32Slice() - return (4 + tagsize) * len(s) -} -func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toFloat32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFixed64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFixed64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFixed64Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - return (8 + tagsize) * len(s) -} -func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeFixedS64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFixedS64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFixedS64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - return (8 + tagsize) * len(s) -} -func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeFloat64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { - v := math.Float64bits(*ptr.toFloat64()) - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFloat64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toFloat64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFloat64Slice(ptr pointer, tagsize int) int { - s := *ptr.toFloat64Slice() - return (8 + tagsize) * len(s) -} -func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toFloat64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeVarint32Value(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarint32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint32Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarint32Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarintS32Value(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarintS32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarint64Value(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - return SizeVarint(v) + tagsize -} -func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - if v == 0 { - return 0 - } - return SizeVarint(v) + tagsize -} -func sizeVarint64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint64Ptr() - if p == nil { - return 0 - } - return SizeVarint(*p) + tagsize -} -func sizeVarint64Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(v) + tagsize - } - return n -} -func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(v) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarintS64Value(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarintS64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeZigzag32Value(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - v := *p - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize - } - return n -} -func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeZigzag64Value(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - v := *p - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize - } - return n -} -func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeBoolValue(_ pointer, tagsize int) int { - return 1 + tagsize -} -func sizeBoolValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toBool() - if !v { - return 0 - } - return 1 + tagsize -} -func sizeBoolPtr(ptr pointer, tagsize int) int { - p := *ptr.toBoolPtr() - if p == nil { - return 0 - } - return 1 + tagsize -} -func sizeBoolSlice(ptr pointer, tagsize int) int { - s := *ptr.toBoolSlice() - return (1 + tagsize) * len(s) -} -func sizeBoolPackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toBoolSlice() - if len(s) == 0 { - return 0 - } - return len(s) + SizeVarint(uint64(len(s))) + tagsize -} -func sizeStringValue(ptr pointer, tagsize int) int { - v := *ptr.toString() - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toString() - if v == "" { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringPtr(ptr pointer, tagsize int) int { - p := *ptr.toStringPtr() - if p == nil { - return 0 - } - v := *p - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringSlice(ptr pointer, tagsize int) int { - s := *ptr.toStringSlice() - n := 0 - for _, v := range s { - n += len(v) + SizeVarint(uint64(len(v))) + tagsize - } - return n -} -func sizeBytes(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - if v == nil { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytes3(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - if len(v) == 0 { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytesOneof(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytesSlice(ptr pointer, tagsize int) int { - s := *ptr.toBytesSlice() - n := 0 - for _, v := range s { - n += len(v) + SizeVarint(uint64(len(v))) + tagsize - } - return n -} - -// appendFixed32 appends an encoded fixed32 to b. -func appendFixed32(b []byte, v uint32) []byte { - b = append(b, - byte(v), - byte(v>>8), - byte(v>>16), - byte(v>>24)) - return b -} - -// appendFixed64 appends an encoded fixed64 to b. -func appendFixed64(b []byte, v uint64) []byte { - b = append(b, - byte(v), - byte(v>>8), - byte(v>>16), - byte(v>>24), - byte(v>>32), - byte(v>>40), - byte(v>>48), - byte(v>>56)) - return b -} - -// appendVarint appends an encoded varint to b. -func appendVarint(b []byte, v uint64) []byte { - // TODO: make 1-byte (maybe 2-byte) case inline-able, once we - // have non-leaf inliner. - switch { - case v < 1<<7: - b = append(b, byte(v)) - case v < 1<<14: - b = append(b, - byte(v&0x7f|0x80), - byte(v>>7)) - case v < 1<<21: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte(v>>14)) - case v < 1<<28: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte(v>>21)) - case v < 1<<35: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte(v>>28)) - case v < 1<<42: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte(v>>35)) - case v < 1<<49: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte(v>>42)) - case v < 1<<56: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte(v>>49)) - case v < 1<<63: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte((v>>49)&0x7f|0x80), - byte(v>>56)) - default: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte((v>>49)&0x7f|0x80), - byte((v>>56)&0x7f|0x80), - 1) - } - return b -} - -func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, *p) - return b, nil -} -func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - } - return b, nil -} -func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, v) - } - return b, nil -} -func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - return b, nil -} -func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - return b, nil -} -func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(*p)) - return b, nil -} -func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - } - return b, nil -} -func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, uint32(v)) - } - return b, nil -} -func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float32bits(*ptr.toFloat32()) - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float32bits(*ptr.toFloat32()) - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toFloat32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, math.Float32bits(*p)) - return b, nil -} -func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, math.Float32bits(v)) - } - return b, nil -} -func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, math.Float32bits(v)) - } - return b, nil -} -func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, *p) - return b, nil -} -func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - } - return b, nil -} -func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, v) - } - return b, nil -} -func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - return b, nil -} -func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - return b, nil -} -func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(*p)) - return b, nil -} -func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - } - return b, nil -} -func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, uint64(v)) - } - return b, nil -} -func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float64bits(*ptr.toFloat64()) - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float64bits(*ptr.toFloat64()) - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toFloat64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, math.Float64bits(*p)) - return b, nil -} -func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, math.Float64bits(v)) - } - return b, nil -} -func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, math.Float64bits(v)) - } - return b, nil -} -func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - return b, nil -} -func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - return b, nil -} -func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, *p) - return b, nil -} -func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - } - return b, nil -} -func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(v) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, v) - } - return b, nil -} -func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - v := *p - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - } - return b, nil -} -func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - } - return b, nil -} -func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - v := *p - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - } - return b, nil -} -func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - } - return b, nil -} -func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBool() - b = appendVarint(b, wiretag) - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - return b, nil -} -func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBool() - if !v { - return b, nil - } - b = appendVarint(b, wiretag) - b = append(b, 1) - return b, nil -} - -func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toBoolPtr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - if *p { - b = append(b, 1) - } else { - b = append(b, 0) - } - return b, nil -} -func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBoolSlice() - for _, v := range s { - b = appendVarint(b, wiretag) - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - } - return b, nil -} -func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBoolSlice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(len(s))) - for _, v := range s { - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - } - return b, nil -} -func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toString() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toString() - if v == "" { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toStringPtr() - if p == nil { - return b, nil - } - v := *p - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toStringSlice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - } - return b, nil -} -func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - v := *ptr.toString() - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - v := *ptr.toString() - if v == "" { - return b, nil - } - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - p := *ptr.toStringPtr() - if p == nil { - return b, nil - } - v := *p - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - s := *ptr.toStringSlice() - for _, v := range s { - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - } - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - if v == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - if len(v) == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBytesSlice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - } - return b, nil -} - -// makeGroupMarshaler returns the sizer and marshaler for a group. -// u is the marshal info of the underlying message. -func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - p := ptr.getPointer() - if p.isNil() { - return 0 - } - return u.size(p) + 2*tagsize - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - p := ptr.getPointer() - if p.isNil() { - return b, nil - } - var err error - b = appendVarint(b, wiretag) // start group - b, err = u.marshal(b, p, deterministic) - b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group - return b, err - } -} - -// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. -// u is the marshal info of the underlying message. -func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getPointerSlice() - n := 0 - for _, v := range s { - if v.isNil() { - continue - } - n += u.size(v) + 2*tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getPointerSlice() - var err error - var nerr nonFatal - for _, v := range s { - if v.isNil() { - return b, errRepeatedHasNil - } - b = appendVarint(b, wiretag) // start group - b, err = u.marshal(b, v, deterministic) - b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group - if !nerr.Merge(err) { - if err == ErrNil { - err = errRepeatedHasNil - } - return b, err - } - } - return b, nerr.E - } -} - -// makeMessageMarshaler returns the sizer and marshaler for a message field. -// u is the marshal info of the message. -func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - p := ptr.getPointer() - if p.isNil() { - return 0 - } - siz := u.size(p) - return siz + SizeVarint(uint64(siz)) + tagsize - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - p := ptr.getPointer() - if p.isNil() { - return b, nil - } - b = appendVarint(b, wiretag) - siz := u.cachedsize(p) - b = appendVarint(b, uint64(siz)) - return u.marshal(b, p, deterministic) - } -} - -// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. -// u is the marshal info of the message. -func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getPointerSlice() - n := 0 - for _, v := range s { - if v.isNil() { - continue - } - siz := u.size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getPointerSlice() - var err error - var nerr nonFatal - for _, v := range s { - if v.isNil() { - return b, errRepeatedHasNil - } - b = appendVarint(b, wiretag) - siz := u.cachedsize(v) - b = appendVarint(b, uint64(siz)) - b, err = u.marshal(b, v, deterministic) - - if !nerr.Merge(err) { - if err == ErrNil { - err = errRepeatedHasNil - } - return b, err - } - } - return b, nerr.E - } -} - -// makeMapMarshaler returns the sizer and marshaler for a map field. -// f is the pointer to the reflect data structure of the field. -func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { - // figure out key and value type - t := f.Type - keyType := t.Key() - valType := t.Elem() - tags := strings.Split(f.Tag.Get("protobuf"), ",") - keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") - valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") - stdOptions := false - for _, t := range tags { - if strings.HasPrefix(t, "customtype=") { - valTags = append(valTags, t) - } - if t == "stdtime" { - valTags = append(valTags, t) - stdOptions = true - } - if t == "stdduration" { - valTags = append(valTags, t) - stdOptions = true - } - if t == "wktptr" { - valTags = append(valTags, t) - } - } - keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map - valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map - keyWireTag := 1<<3 | wiretype(keyTags[0]) - valWireTag := 2<<3 | wiretype(valTags[0]) - - // We create an interface to get the addresses of the map key and value. - // If value is pointer-typed, the interface is a direct interface, the - // idata itself is the value. Otherwise, the idata is the pointer to the - // value. - // Key cannot be pointer-typed. - valIsPtr := valType.Kind() == reflect.Ptr - - // If value is a message with nested maps, calling - // valSizer in marshal may be quadratic. We should use - // cached version in marshal (but not in size). - // If value is not message type, we don't have size cache, - // but it cannot be nested either. Just use valSizer. - valCachedSizer := valSizer - if valIsPtr && !stdOptions && valType.Elem().Kind() == reflect.Struct { - u := getMarshalInfo(valType.Elem()) - valCachedSizer = func(ptr pointer, tagsize int) int { - // Same as message sizer, but use cache. - p := ptr.getPointer() - if p.isNil() { - return 0 - } - siz := u.cachedsize(p) - return siz + SizeVarint(uint64(siz)) + tagsize - } - } - return func(ptr pointer, tagsize int) int { - m := ptr.asPointerTo(t).Elem() // the map - n := 0 - for _, k := range m.MapKeys() { - ki := k.Interface() - vi := m.MapIndex(k).Interface() - kaddr := toAddrPointer(&ki, false) // pointer to key - vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value - siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { - m := ptr.asPointerTo(t).Elem() // the map - var err error - keys := m.MapKeys() - if len(keys) > 1 && deterministic { - sort.Sort(mapKeys(keys)) - } - - var nerr nonFatal - for _, k := range keys { - ki := k.Interface() - vi := m.MapIndex(k).Interface() - kaddr := toAddrPointer(&ki, false) // pointer to key - vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value - b = appendVarint(b, tag) - siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) - b = appendVarint(b, uint64(siz)) - b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) - if !nerr.Merge(err) { - return b, err - } - b, err = valMarshaler(b, vaddr, valWireTag, deterministic) - if err != ErrNil && !nerr.Merge(err) { // allow nil value in map - return b, err - } - } - return b, nerr.E - } -} - -// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. -// fi is the marshal info of the field. -// f is the pointer to the reflect data structure of the field. -func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { - // Oneof field is an interface. We need to get the actual data type on the fly. - t := f.Type - return func(ptr pointer, _ int) int { - p := ptr.getInterfacePointer() - if p.isNil() { - return 0 - } - v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct - telem := v.Type() - e := fi.oneofElems[telem] - return e.sizer(p, e.tagsize) - }, - func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { - p := ptr.getInterfacePointer() - if p.isNil() { - return b, nil - } - v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct - telem := v.Type() - if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { - return b, errOneofHasNil - } - e := fi.oneofElems[telem] - return e.marshaler(b, p, e.wiretag, deterministic) - } -} - -// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. -func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { - m, mu := ext.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - - n := 0 - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - n += ei.sizer(p, ei.tagsize) - } - mu.Unlock() - return n -} - -// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. -func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { - m, mu := ext.extensionsRead() - if m == nil { - return b, nil - } - mu.Lock() - defer mu.Unlock() - - var err error - var nerr nonFatal - - // Fast-path for common cases: zero or one extensions. - // Don't bother sorting the keys. - if len(m) <= 1 { - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E - } - - // Sort the keys to provide a deterministic encoding. - // Not sure this is required, but the old code does it. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, k := range keys { - e := m[int32(k)] - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E -} - -// message set format is: -// message MessageSet { -// repeated group Item = 1 { -// required int32 type_id = 2; -// required string message = 3; -// }; -// } - -// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field -// in message set format (above). -func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { - m, mu := ext.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - - n := 0 - for id, e := range m { - n += 2 // start group, end group. tag = 1 (size=1) - n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - siz := len(msgWithLen) - n += siz + 1 // message, tag = 3 (size=1) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - n += ei.sizer(p, 1) // message, tag = 3 (size=1) - } - mu.Unlock() - return n -} - -// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) -// to the end of byte slice b. -func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { - m, mu := ext.extensionsRead() - if m == nil { - return b, nil - } - mu.Lock() - defer mu.Unlock() - - var err error - var nerr nonFatal - - // Fast-path for common cases: zero or one extensions. - // Don't bother sorting the keys. - if len(m) <= 1 { - for id, e := range m { - b = append(b, 1<<3|WireStartGroup) - b = append(b, 2<<3|WireVarint) - b = appendVarint(b, uint64(id)) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - b = append(b, 3<<3|WireBytes) - b = append(b, msgWithLen...) - b = append(b, 1<<3|WireEndGroup) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) - if !nerr.Merge(err) { - return b, err - } - b = append(b, 1<<3|WireEndGroup) - } - return b, nerr.E - } - - // Sort the keys to provide a deterministic encoding. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, id := range keys { - e := m[int32(id)] - b = append(b, 1<<3|WireStartGroup) - b = append(b, 2<<3|WireVarint) - b = appendVarint(b, uint64(id)) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - b = append(b, 3<<3|WireBytes) - b = append(b, msgWithLen...) - b = append(b, 1<<3|WireEndGroup) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) - b = append(b, 1<<3|WireEndGroup) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E -} - -// sizeV1Extensions computes the size of encoded data for a V1-API extension field. -func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { - if m == nil { - return 0 - } - - n := 0 - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - n += ei.sizer(p, ei.tagsize) - } - return n -} - -// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. -func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { - if m == nil { - return b, nil - } - - // Sort the keys to provide a deterministic encoding. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - var err error - var nerr nonFatal - for _, k := range keys { - e := m[int32(k)] - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E -} - -// newMarshaler is the interface representing objects that can marshal themselves. -// -// This exists to support protoc-gen-go generated messages. -// The proto package will stop type-asserting to this interface in the future. -// -// DO NOT DEPEND ON THIS. -type newMarshaler interface { - XXX_Size() int - XXX_Marshal(b []byte, deterministic bool) ([]byte, error) -} - -// Size returns the encoded size of a protocol buffer message. -// This is the main entry point. -func Size(pb Message) int { - if m, ok := pb.(newMarshaler); ok { - return m.XXX_Size() - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - b, _ := m.Marshal() - return len(b) - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return 0 - } - var info InternalMessageInfo - return info.Size(pb) -} - -// Marshal takes a protocol buffer message -// and encodes it into the wire format, returning the data. -// This is the main entry point. -func Marshal(pb Message) ([]byte, error) { - if m, ok := pb.(newMarshaler); ok { - siz := m.XXX_Size() - b := make([]byte, 0, siz) - return m.XXX_Marshal(b, false) - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - return m.Marshal() - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return nil, ErrNil - } - var info InternalMessageInfo - siz := info.Size(pb) - b := make([]byte, 0, siz) - return info.Marshal(b, pb, false) -} - -// Marshal takes a protocol buffer message -// and encodes it into the wire format, writing the result to the -// Buffer. -// This is an alternative entry point. It is not necessary to use -// a Buffer for most applications. -func (p *Buffer) Marshal(pb Message) error { - var err error - if p.deterministic { - if _, ok := pb.(Marshaler); ok { - return fmt.Errorf("proto: deterministic not supported by the Marshal method of %T", pb) - } - } - if m, ok := pb.(newMarshaler); ok { - siz := m.XXX_Size() - p.grow(siz) // make sure buf has enough capacity - pp := p.buf[len(p.buf) : len(p.buf) : len(p.buf)+siz] - pp, err = m.XXX_Marshal(pp, p.deterministic) - p.buf = append(p.buf, pp...) - return err - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - var b []byte - b, err = m.Marshal() - p.buf = append(p.buf, b...) - return err - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return ErrNil - } - var info InternalMessageInfo - siz := info.Size(pb) - p.grow(siz) // make sure buf has enough capacity - p.buf, err = info.Marshal(p.buf, pb, p.deterministic) - return err -} - -// grow grows the buffer's capacity, if necessary, to guarantee space for -// another n bytes. After grow(n), at least n bytes can be written to the -// buffer without another allocation. -func (p *Buffer) grow(n int) { - need := len(p.buf) + n - if need <= cap(p.buf) { - return - } - newCap := len(p.buf) * 2 - if newCap < need { - newCap = need - } - p.buf = append(make([]byte, 0, newCap), p.buf...) -} diff --git a/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go b/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go deleted file mode 100644 index 997f57c1e1..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go +++ /dev/null @@ -1,388 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2018, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "reflect" - "time" -) - -// makeMessageRefMarshaler differs a bit from makeMessageMarshaler -// It marshal a message T instead of a *T -func makeMessageRefMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - siz := u.size(ptr) - return siz + SizeVarint(uint64(siz)) + tagsize - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - b = appendVarint(b, wiretag) - siz := u.cachedsize(ptr) - b = appendVarint(b, uint64(siz)) - return u.marshal(b, ptr, deterministic) - } -} - -// makeMessageRefSliceMarshaler differs quite a lot from makeMessageSliceMarshaler -// It marshals a slice of messages []T instead of []*T -func makeMessageRefSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - e := elem.Interface() - v := toAddrPointer(&e, false) - siz := u.size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - var err, errreq error - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - e := elem.Interface() - v := toAddrPointer(&e, false) - b = appendVarint(b, wiretag) - siz := u.size(v) - b = appendVarint(b, uint64(siz)) - b, err = u.marshal(b, v, deterministic) - - if err != nil { - if _, ok := err.(*RequiredNotSetError); ok { - // Required field in submessage is not set. - // We record the error but keep going, to give a complete marshaling. - if errreq == nil { - errreq = err - } - continue - } - if err == ErrNil { - err = errRepeatedHasNil - } - return b, err - } - } - - return b, errreq - } -} - -func makeCustomPtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - m := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(custom) - siz := m.Size() - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - m := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(custom) - siz := m.Size() - buf, err := m.Marshal() - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - return b, nil - } -} - -func makeCustomMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - m := ptr.asPointerTo(u.typ).Interface().(custom) - siz := m.Size() - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - m := ptr.asPointerTo(u.typ).Interface().(custom) - siz := m.Size() - buf, err := m.Marshal() - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - return b, nil - } -} - -func makeTimeMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - t := ptr.asPointerTo(u.typ).Interface().(*time.Time) - ts, err := timestampProto(*t) - if err != nil { - return 0 - } - siz := Size(ts) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - t := ptr.asPointerTo(u.typ).Interface().(*time.Time) - ts, err := timestampProto(*t) - if err != nil { - return nil, err - } - buf, err := Marshal(ts) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeTimePtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Time) - ts, err := timestampProto(*t) - if err != nil { - return 0 - } - siz := Size(ts) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Time) - ts, err := timestampProto(*t) - if err != nil { - return nil, err - } - buf, err := Marshal(ts) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeTimeSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(time.Time) - ts, err := timestampProto(t) - if err != nil { - return 0 - } - siz := Size(ts) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(time.Time) - ts, err := timestampProto(t) - if err != nil { - return nil, err - } - siz := Size(ts) - buf, err := Marshal(ts) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeTimePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*time.Time) - ts, err := timestampProto(*t) - if err != nil { - return 0 - } - siz := Size(ts) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*time.Time) - ts, err := timestampProto(*t) - if err != nil { - return nil, err - } - siz := Size(ts) - buf, err := Marshal(ts) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeDurationMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - d := ptr.asPointerTo(u.typ).Interface().(*time.Duration) - dur := durationProto(*d) - siz := Size(dur) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - d := ptr.asPointerTo(u.typ).Interface().(*time.Duration) - dur := durationProto(*d) - buf, err := Marshal(dur) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeDurationPtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - d := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Duration) - dur := durationProto(*d) - siz := Size(dur) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - d := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Duration) - dur := durationProto(*d) - buf, err := Marshal(dur) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeDurationSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - d := elem.Interface().(time.Duration) - dur := durationProto(d) - siz := Size(dur) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - d := elem.Interface().(time.Duration) - dur := durationProto(d) - siz := Size(dur) - buf, err := Marshal(dur) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeDurationPtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - d := elem.Interface().(*time.Duration) - dur := durationProto(*d) - siz := Size(dur) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - d := elem.Interface().(*time.Duration) - dur := durationProto(*d) - siz := Size(dur) - buf, err := Marshal(dur) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} diff --git a/vendor/github.com/gogo/protobuf/proto/table_merge.go b/vendor/github.com/gogo/protobuf/proto/table_merge.go deleted file mode 100644 index 60dcf70d1e..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/table_merge.go +++ /dev/null @@ -1,676 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "reflect" - "strings" - "sync" - "sync/atomic" -) - -// Merge merges the src message into dst. -// This assumes that dst and src of the same type and are non-nil. -func (a *InternalMessageInfo) Merge(dst, src Message) { - mi := atomicLoadMergeInfo(&a.merge) - if mi == nil { - mi = getMergeInfo(reflect.TypeOf(dst).Elem()) - atomicStoreMergeInfo(&a.merge, mi) - } - mi.merge(toPointer(&dst), toPointer(&src)) -} - -type mergeInfo struct { - typ reflect.Type - - initialized int32 // 0: only typ is valid, 1: everything is valid - lock sync.Mutex - - fields []mergeFieldInfo - unrecognized field // Offset of XXX_unrecognized -} - -type mergeFieldInfo struct { - field field // Offset of field, guaranteed to be valid - - // isPointer reports whether the value in the field is a pointer. - // This is true for the following situations: - // * Pointer to struct - // * Pointer to basic type (proto2 only) - // * Slice (first value in slice header is a pointer) - // * String (first value in string header is a pointer) - isPointer bool - - // basicWidth reports the width of the field assuming that it is directly - // embedded in the struct (as is the case for basic types in proto3). - // The possible values are: - // 0: invalid - // 1: bool - // 4: int32, uint32, float32 - // 8: int64, uint64, float64 - basicWidth int - - // Where dst and src are pointers to the types being merged. - merge func(dst, src pointer) -} - -var ( - mergeInfoMap = map[reflect.Type]*mergeInfo{} - mergeInfoLock sync.Mutex -) - -func getMergeInfo(t reflect.Type) *mergeInfo { - mergeInfoLock.Lock() - defer mergeInfoLock.Unlock() - mi := mergeInfoMap[t] - if mi == nil { - mi = &mergeInfo{typ: t} - mergeInfoMap[t] = mi - } - return mi -} - -// merge merges src into dst assuming they are both of type *mi.typ. -func (mi *mergeInfo) merge(dst, src pointer) { - if dst.isNil() { - panic("proto: nil destination") - } - if src.isNil() { - return // Nothing to do. - } - - if atomic.LoadInt32(&mi.initialized) == 0 { - mi.computeMergeInfo() - } - - for _, fi := range mi.fields { - sfp := src.offset(fi.field) - - // As an optimization, we can avoid the merge function call cost - // if we know for sure that the source will have no effect - // by checking if it is the zero value. - if unsafeAllowed { - if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string - continue - } - if fi.basicWidth > 0 { - switch { - case fi.basicWidth == 1 && !*sfp.toBool(): - continue - case fi.basicWidth == 4 && *sfp.toUint32() == 0: - continue - case fi.basicWidth == 8 && *sfp.toUint64() == 0: - continue - } - } - } - - dfp := dst.offset(fi.field) - fi.merge(dfp, sfp) - } - - // TODO: Make this faster? - out := dst.asPointerTo(mi.typ).Elem() - in := src.asPointerTo(mi.typ).Elem() - if emIn, err := extendable(in.Addr().Interface()); err == nil { - emOut, _ := extendable(out.Addr().Interface()) - mIn, muIn := emIn.extensionsRead() - if mIn != nil { - mOut := emOut.extensionsWrite() - muIn.Lock() - mergeExtension(mOut, mIn) - muIn.Unlock() - } - } - - if mi.unrecognized.IsValid() { - if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { - *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) - } - } -} - -func (mi *mergeInfo) computeMergeInfo() { - mi.lock.Lock() - defer mi.lock.Unlock() - if mi.initialized != 0 { - return - } - t := mi.typ - n := t.NumField() - - props := GetProperties(t) - for i := 0; i < n; i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - - mfi := mergeFieldInfo{field: toField(&f)} - tf := f.Type - - // As an optimization, we can avoid the merge function call cost - // if we know for sure that the source will have no effect - // by checking if it is the zero value. - if unsafeAllowed { - switch tf.Kind() { - case reflect.Ptr, reflect.Slice, reflect.String: - // As a special case, we assume slices and strings are pointers - // since we know that the first field in the SliceSlice or - // StringHeader is a data pointer. - mfi.isPointer = true - case reflect.Bool: - mfi.basicWidth = 1 - case reflect.Int32, reflect.Uint32, reflect.Float32: - mfi.basicWidth = 4 - case reflect.Int64, reflect.Uint64, reflect.Float64: - mfi.basicWidth = 8 - } - } - - // Unwrap tf to get at its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic("both pointer and slice for basic type in " + tf.Name()) - } - - switch tf.Kind() { - case reflect.Int32: - switch { - case isSlice: // E.g., []int32 - mfi.merge = func(dst, src pointer) { - // NOTE: toInt32Slice is not defined (see pointer_reflect.go). - /* - sfsp := src.toInt32Slice() - if *sfsp != nil { - dfsp := dst.toInt32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []int64{} - } - } - */ - sfs := src.getInt32Slice() - if sfs != nil { - dfs := dst.getInt32Slice() - dfs = append(dfs, sfs...) - if dfs == nil { - dfs = []int32{} - } - dst.setInt32Slice(dfs) - } - } - case isPointer: // E.g., *int32 - mfi.merge = func(dst, src pointer) { - // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). - /* - sfpp := src.toInt32Ptr() - if *sfpp != nil { - dfpp := dst.toInt32Ptr() - if *dfpp == nil { - *dfpp = Int32(**sfpp) - } else { - **dfpp = **sfpp - } - } - */ - sfp := src.getInt32Ptr() - if sfp != nil { - dfp := dst.getInt32Ptr() - if dfp == nil { - dst.setInt32Ptr(*sfp) - } else { - *dfp = *sfp - } - } - } - default: // E.g., int32 - mfi.merge = func(dst, src pointer) { - if v := *src.toInt32(); v != 0 { - *dst.toInt32() = v - } - } - } - case reflect.Int64: - switch { - case isSlice: // E.g., []int64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toInt64Slice() - if *sfsp != nil { - dfsp := dst.toInt64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []int64{} - } - } - } - case isPointer: // E.g., *int64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toInt64Ptr() - if *sfpp != nil { - dfpp := dst.toInt64Ptr() - if *dfpp == nil { - *dfpp = Int64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., int64 - mfi.merge = func(dst, src pointer) { - if v := *src.toInt64(); v != 0 { - *dst.toInt64() = v - } - } - } - case reflect.Uint32: - switch { - case isSlice: // E.g., []uint32 - mfi.merge = func(dst, src pointer) { - sfsp := src.toUint32Slice() - if *sfsp != nil { - dfsp := dst.toUint32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []uint32{} - } - } - } - case isPointer: // E.g., *uint32 - mfi.merge = func(dst, src pointer) { - sfpp := src.toUint32Ptr() - if *sfpp != nil { - dfpp := dst.toUint32Ptr() - if *dfpp == nil { - *dfpp = Uint32(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., uint32 - mfi.merge = func(dst, src pointer) { - if v := *src.toUint32(); v != 0 { - *dst.toUint32() = v - } - } - } - case reflect.Uint64: - switch { - case isSlice: // E.g., []uint64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toUint64Slice() - if *sfsp != nil { - dfsp := dst.toUint64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []uint64{} - } - } - } - case isPointer: // E.g., *uint64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toUint64Ptr() - if *sfpp != nil { - dfpp := dst.toUint64Ptr() - if *dfpp == nil { - *dfpp = Uint64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., uint64 - mfi.merge = func(dst, src pointer) { - if v := *src.toUint64(); v != 0 { - *dst.toUint64() = v - } - } - } - case reflect.Float32: - switch { - case isSlice: // E.g., []float32 - mfi.merge = func(dst, src pointer) { - sfsp := src.toFloat32Slice() - if *sfsp != nil { - dfsp := dst.toFloat32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []float32{} - } - } - } - case isPointer: // E.g., *float32 - mfi.merge = func(dst, src pointer) { - sfpp := src.toFloat32Ptr() - if *sfpp != nil { - dfpp := dst.toFloat32Ptr() - if *dfpp == nil { - *dfpp = Float32(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., float32 - mfi.merge = func(dst, src pointer) { - if v := *src.toFloat32(); v != 0 { - *dst.toFloat32() = v - } - } - } - case reflect.Float64: - switch { - case isSlice: // E.g., []float64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toFloat64Slice() - if *sfsp != nil { - dfsp := dst.toFloat64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []float64{} - } - } - } - case isPointer: // E.g., *float64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toFloat64Ptr() - if *sfpp != nil { - dfpp := dst.toFloat64Ptr() - if *dfpp == nil { - *dfpp = Float64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., float64 - mfi.merge = func(dst, src pointer) { - if v := *src.toFloat64(); v != 0 { - *dst.toFloat64() = v - } - } - } - case reflect.Bool: - switch { - case isSlice: // E.g., []bool - mfi.merge = func(dst, src pointer) { - sfsp := src.toBoolSlice() - if *sfsp != nil { - dfsp := dst.toBoolSlice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []bool{} - } - } - } - case isPointer: // E.g., *bool - mfi.merge = func(dst, src pointer) { - sfpp := src.toBoolPtr() - if *sfpp != nil { - dfpp := dst.toBoolPtr() - if *dfpp == nil { - *dfpp = Bool(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., bool - mfi.merge = func(dst, src pointer) { - if v := *src.toBool(); v { - *dst.toBool() = v - } - } - } - case reflect.String: - switch { - case isSlice: // E.g., []string - mfi.merge = func(dst, src pointer) { - sfsp := src.toStringSlice() - if *sfsp != nil { - dfsp := dst.toStringSlice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []string{} - } - } - } - case isPointer: // E.g., *string - mfi.merge = func(dst, src pointer) { - sfpp := src.toStringPtr() - if *sfpp != nil { - dfpp := dst.toStringPtr() - if *dfpp == nil { - *dfpp = String(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., string - mfi.merge = func(dst, src pointer) { - if v := *src.toString(); v != "" { - *dst.toString() = v - } - } - } - case reflect.Slice: - isProto3 := props.Prop[i].proto3 - switch { - case isPointer: - panic("bad pointer in byte slice case in " + tf.Name()) - case tf.Elem().Kind() != reflect.Uint8: - panic("bad element kind in byte slice case in " + tf.Name()) - case isSlice: // E.g., [][]byte - mfi.merge = func(dst, src pointer) { - sbsp := src.toBytesSlice() - if *sbsp != nil { - dbsp := dst.toBytesSlice() - for _, sb := range *sbsp { - if sb == nil { - *dbsp = append(*dbsp, nil) - } else { - *dbsp = append(*dbsp, append([]byte{}, sb...)) - } - } - if *dbsp == nil { - *dbsp = [][]byte{} - } - } - } - default: // E.g., []byte - mfi.merge = func(dst, src pointer) { - sbp := src.toBytes() - if *sbp != nil { - dbp := dst.toBytes() - if !isProto3 || len(*sbp) > 0 { - *dbp = append([]byte{}, *sbp...) - } - } - } - } - case reflect.Struct: - switch { - case isSlice && !isPointer: // E.g. []pb.T - mergeInfo := getMergeInfo(tf) - zero := reflect.Zero(tf) - mfi.merge = func(dst, src pointer) { - // TODO: Make this faster? - dstsp := dst.asPointerTo(f.Type) - dsts := dstsp.Elem() - srcs := src.asPointerTo(f.Type).Elem() - for i := 0; i < srcs.Len(); i++ { - dsts = reflect.Append(dsts, zero) - srcElement := srcs.Index(i).Addr() - dstElement := dsts.Index(dsts.Len() - 1).Addr() - mergeInfo.merge(valToPointer(dstElement), valToPointer(srcElement)) - } - if dsts.IsNil() { - dsts = reflect.MakeSlice(f.Type, 0, 0) - } - dstsp.Elem().Set(dsts) - } - case !isPointer: - mergeInfo := getMergeInfo(tf) - mfi.merge = func(dst, src pointer) { - mergeInfo.merge(dst, src) - } - case isSlice: // E.g., []*pb.T - mergeInfo := getMergeInfo(tf) - mfi.merge = func(dst, src pointer) { - sps := src.getPointerSlice() - if sps != nil { - dps := dst.getPointerSlice() - for _, sp := range sps { - var dp pointer - if !sp.isNil() { - dp = valToPointer(reflect.New(tf)) - mergeInfo.merge(dp, sp) - } - dps = append(dps, dp) - } - if dps == nil { - dps = []pointer{} - } - dst.setPointerSlice(dps) - } - } - default: // E.g., *pb.T - mergeInfo := getMergeInfo(tf) - mfi.merge = func(dst, src pointer) { - sp := src.getPointer() - if !sp.isNil() { - dp := dst.getPointer() - if dp.isNil() { - dp = valToPointer(reflect.New(tf)) - dst.setPointer(dp) - } - mergeInfo.merge(dp, sp) - } - } - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic("bad pointer or slice in map case in " + tf.Name()) - default: // E.g., map[K]V - mfi.merge = func(dst, src pointer) { - sm := src.asPointerTo(tf).Elem() - if sm.Len() == 0 { - return - } - dm := dst.asPointerTo(tf).Elem() - if dm.IsNil() { - dm.Set(reflect.MakeMap(tf)) - } - - switch tf.Elem().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - val = reflect.ValueOf(Clone(val.Interface().(Message))) - dm.SetMapIndex(key, val) - } - case reflect.Slice: // E.g. Bytes type (e.g., []byte) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) - dm.SetMapIndex(key, val) - } - default: // Basic type (e.g., string) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - dm.SetMapIndex(key, val) - } - } - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic("bad pointer or slice in interface case in " + tf.Name()) - default: // E.g., interface{} - // TODO: Make this faster? - mfi.merge = func(dst, src pointer) { - su := src.asPointerTo(tf).Elem() - if !su.IsNil() { - du := dst.asPointerTo(tf).Elem() - typ := su.Elem().Type() - if du.IsNil() || du.Elem().Type() != typ { - du.Set(reflect.New(typ.Elem())) // Initialize interface if empty - } - sv := su.Elem().Elem().Field(0) - if sv.Kind() == reflect.Ptr && sv.IsNil() { - return - } - dv := du.Elem().Elem().Field(0) - if dv.Kind() == reflect.Ptr && dv.IsNil() { - dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty - } - switch sv.Type().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - Merge(dv.Interface().(Message), sv.Interface().(Message)) - case reflect.Slice: // E.g. Bytes type (e.g., []byte) - dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) - default: // Basic type (e.g., string) - dv.Set(sv) - } - } - } - } - default: - panic(fmt.Sprintf("merger not found for type:%s", tf)) - } - mi.fields = append(mi.fields, mfi) - } - - mi.unrecognized = invalidField - if f, ok := t.FieldByName("XXX_unrecognized"); ok { - if f.Type != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - mi.unrecognized = toField(&f) - } - - atomic.StoreInt32(&mi.initialized, 1) -} diff --git a/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go b/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go deleted file mode 100644 index 937229386a..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go +++ /dev/null @@ -1,2249 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "errors" - "fmt" - "io" - "math" - "reflect" - "strconv" - "strings" - "sync" - "sync/atomic" - "unicode/utf8" -) - -// Unmarshal is the entry point from the generated .pb.go files. -// This function is not intended to be used by non-generated code. -// This function is not subject to any compatibility guarantee. -// msg contains a pointer to a protocol buffer struct. -// b is the data to be unmarshaled into the protocol buffer. -// a is a pointer to a place to store cached unmarshal information. -func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { - // Load the unmarshal information for this message type. - // The atomic load ensures memory consistency. - u := atomicLoadUnmarshalInfo(&a.unmarshal) - if u == nil { - // Slow path: find unmarshal info for msg, update a with it. - u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) - atomicStoreUnmarshalInfo(&a.unmarshal, u) - } - // Then do the unmarshaling. - err := u.unmarshal(toPointer(&msg), b) - return err -} - -type unmarshalInfo struct { - typ reflect.Type // type of the protobuf struct - - // 0 = only typ field is initialized - // 1 = completely initialized - initialized int32 - lock sync.Mutex // prevents double initialization - dense []unmarshalFieldInfo // fields indexed by tag # - sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # - reqFields []string // names of required fields - reqMask uint64 // 1< 0 { - // Read tag and wire type. - // Special case 1 and 2 byte varints. - var x uint64 - if b[0] < 128 { - x = uint64(b[0]) - b = b[1:] - } else if len(b) >= 2 && b[1] < 128 { - x = uint64(b[0]&0x7f) + uint64(b[1])<<7 - b = b[2:] - } else { - var n int - x, n = decodeVarint(b) - if n == 0 { - return io.ErrUnexpectedEOF - } - b = b[n:] - } - tag := x >> 3 - wire := int(x) & 7 - - // Dispatch on the tag to one of the unmarshal* functions below. - var f unmarshalFieldInfo - if tag < uint64(len(u.dense)) { - f = u.dense[tag] - } else { - f = u.sparse[tag] - } - if fn := f.unmarshal; fn != nil { - var err error - b, err = fn(b, m.offset(f.field), wire) - if err == nil { - reqMask |= f.reqMask - continue - } - if r, ok := err.(*RequiredNotSetError); ok { - // Remember this error, but keep parsing. We need to produce - // a full parse even if a required field is missing. - if errLater == nil { - errLater = r - } - reqMask |= f.reqMask - continue - } - if err != errInternalBadWireType { - if err == errInvalidUTF8 { - if errLater == nil { - fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name - errLater = &invalidUTF8Error{fullName} - } - continue - } - return err - } - // Fragments with bad wire type are treated as unknown fields. - } - - // Unknown tag. - if !u.unrecognized.IsValid() { - // Don't keep unrecognized data; just skip it. - var err error - b, err = skipField(b, wire) - if err != nil { - return err - } - continue - } - // Keep unrecognized data around. - // maybe in extensions, maybe in the unrecognized field. - z := m.offset(u.unrecognized).toBytes() - var emap map[int32]Extension - var e Extension - for _, r := range u.extensionRanges { - if uint64(r.Start) <= tag && tag <= uint64(r.End) { - if u.extensions.IsValid() { - mp := m.offset(u.extensions).toExtensions() - emap = mp.extensionsWrite() - e = emap[int32(tag)] - z = &e.enc - break - } - if u.oldExtensions.IsValid() { - p := m.offset(u.oldExtensions).toOldExtensions() - emap = *p - if emap == nil { - emap = map[int32]Extension{} - *p = emap - } - e = emap[int32(tag)] - z = &e.enc - break - } - if u.bytesExtensions.IsValid() { - z = m.offset(u.bytesExtensions).toBytes() - break - } - panic("no extensions field available") - } - } - // Use wire type to skip data. - var err error - b0 := b - b, err = skipField(b, wire) - if err != nil { - return err - } - *z = encodeVarint(*z, tag<<3|uint64(wire)) - *z = append(*z, b0[:len(b0)-len(b)]...) - - if emap != nil { - emap[int32(tag)] = e - } - } - if reqMask != u.reqMask && errLater == nil { - // A required field of this message is missing. - for _, n := range u.reqFields { - if reqMask&1 == 0 { - errLater = &RequiredNotSetError{n} - } - reqMask >>= 1 - } - } - return errLater -} - -// computeUnmarshalInfo fills in u with information for use -// in unmarshaling protocol buffers of type u.typ. -func (u *unmarshalInfo) computeUnmarshalInfo() { - u.lock.Lock() - defer u.lock.Unlock() - if u.initialized != 0 { - return - } - t := u.typ - n := t.NumField() - - // Set up the "not found" value for the unrecognized byte buffer. - // This is the default for proto3. - u.unrecognized = invalidField - u.extensions = invalidField - u.oldExtensions = invalidField - u.bytesExtensions = invalidField - - // List of the generated type and offset for each oneof field. - type oneofField struct { - ityp reflect.Type // interface type of oneof field - field field // offset in containing message - } - var oneofFields []oneofField - - for i := 0; i < n; i++ { - f := t.Field(i) - if f.Name == "XXX_unrecognized" { - // The byte slice used to hold unrecognized input is special. - if f.Type != reflect.TypeOf(([]byte)(nil)) { - panic("bad type for XXX_unrecognized field: " + f.Type.Name()) - } - u.unrecognized = toField(&f) - continue - } - if f.Name == "XXX_InternalExtensions" { - // Ditto here. - if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { - panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) - } - u.extensions = toField(&f) - if f.Tag.Get("protobuf_messageset") == "1" { - u.isMessageSet = true - } - continue - } - if f.Name == "XXX_extensions" { - // An older form of the extensions field. - if f.Type == reflect.TypeOf((map[int32]Extension)(nil)) { - u.oldExtensions = toField(&f) - continue - } else if f.Type == reflect.TypeOf(([]byte)(nil)) { - u.bytesExtensions = toField(&f) - continue - } - panic("bad type for XXX_extensions field: " + f.Type.Name()) - } - if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { - continue - } - - oneof := f.Tag.Get("protobuf_oneof") - if oneof != "" { - oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) - // The rest of oneof processing happens below. - continue - } - - tags := f.Tag.Get("protobuf") - tagArray := strings.Split(tags, ",") - if len(tagArray) < 2 { - panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) - } - tag, err := strconv.Atoi(tagArray[1]) - if err != nil { - panic("protobuf tag field not an integer: " + tagArray[1]) - } - - name := "" - for _, tag := range tagArray[3:] { - if strings.HasPrefix(tag, "name=") { - name = tag[5:] - } - } - - // Extract unmarshaling function from the field (its type and tags). - unmarshal := fieldUnmarshaler(&f) - - // Required field? - var reqMask uint64 - if tagArray[2] == "req" { - bit := len(u.reqFields) - u.reqFields = append(u.reqFields, name) - reqMask = uint64(1) << uint(bit) - // TODO: if we have more than 64 required fields, we end up - // not verifying that all required fields are present. - // Fix this, perhaps using a count of required fields? - } - - // Store the info in the correct slot in the message. - u.setTag(tag, toField(&f), unmarshal, reqMask, name) - } - - // Find any types associated with oneof fields. - // gogo: len(oneofFields) > 0 is needed for embedded oneof messages, without a marshaler and unmarshaler - if len(oneofFields) > 0 { - var oneofImplementers []interface{} - switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { - case oneofFuncsIface: - _, _, _, oneofImplementers = m.XXX_OneofFuncs() - case oneofWrappersIface: - oneofImplementers = m.XXX_OneofWrappers() - } - for _, v := range oneofImplementers { - tptr := reflect.TypeOf(v) // *Msg_X - typ := tptr.Elem() // Msg_X - - f := typ.Field(0) // oneof implementers have one field - baseUnmarshal := fieldUnmarshaler(&f) - tags := strings.Split(f.Tag.Get("protobuf"), ",") - fieldNum, err := strconv.Atoi(tags[1]) - if err != nil { - panic("protobuf tag field not an integer: " + tags[1]) - } - var name string - for _, tag := range tags { - if strings.HasPrefix(tag, "name=") { - name = strings.TrimPrefix(tag, "name=") - break - } - } - - // Find the oneof field that this struct implements. - // Might take O(n^2) to process all of the oneofs, but who cares. - for _, of := range oneofFields { - if tptr.Implements(of.ityp) { - // We have found the corresponding interface for this struct. - // That lets us know where this struct should be stored - // when we encounter it during unmarshaling. - unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) - u.setTag(fieldNum, of.field, unmarshal, 0, name) - } - } - - } - } - - // Get extension ranges, if any. - fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") - if fn.IsValid() { - if !u.extensions.IsValid() && !u.oldExtensions.IsValid() && !u.bytesExtensions.IsValid() { - panic("a message with extensions, but no extensions field in " + t.Name()) - } - u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) - } - - // Explicitly disallow tag 0. This will ensure we flag an error - // when decoding a buffer of all zeros. Without this code, we - // would decode and skip an all-zero buffer of even length. - // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. - u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { - return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) - }, 0, "") - - // Set mask for required field check. - u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? - for len(u.dense) <= tag { - u.dense = append(u.dense, unmarshalFieldInfo{}) - } - u.dense[tag] = i - return - } - if u.sparse == nil { - u.sparse = map[uint64]unmarshalFieldInfo{} - } - u.sparse[uint64(tag)] = i -} - -// fieldUnmarshaler returns an unmarshaler for the given field. -func fieldUnmarshaler(f *reflect.StructField) unmarshaler { - if f.Type.Kind() == reflect.Map { - return makeUnmarshalMap(f) - } - return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) -} - -// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. -func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { - tagArray := strings.Split(tags, ",") - encoding := tagArray[0] - name := "unknown" - ctype := false - isTime := false - isDuration := false - isWktPointer := false - proto3 := false - validateUTF8 := true - for _, tag := range tagArray[3:] { - if strings.HasPrefix(tag, "name=") { - name = tag[5:] - } - if tag == "proto3" { - proto3 = true - } - if strings.HasPrefix(tag, "customtype=") { - ctype = true - } - if tag == "stdtime" { - isTime = true - } - if tag == "stdduration" { - isDuration = true - } - if tag == "wktptr" { - isWktPointer = true - } - } - validateUTF8 = validateUTF8 && proto3 - - // Figure out packaging (pointer, slice, or both) - slice := false - pointer := false - if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { - slice = true - t = t.Elem() - } - if t.Kind() == reflect.Ptr { - pointer = true - t = t.Elem() - } - - if ctype { - if reflect.PtrTo(t).Implements(customType) { - if slice { - return makeUnmarshalCustomSlice(getUnmarshalInfo(t), name) - } - if pointer { - return makeUnmarshalCustomPtr(getUnmarshalInfo(t), name) - } - return makeUnmarshalCustom(getUnmarshalInfo(t), name) - } else { - panic(fmt.Sprintf("custom type: type: %v, does not implement the proto.custom interface", t)) - } - } - - if isTime { - if pointer { - if slice { - return makeUnmarshalTimePtrSlice(getUnmarshalInfo(t), name) - } - return makeUnmarshalTimePtr(getUnmarshalInfo(t), name) - } - if slice { - return makeUnmarshalTimeSlice(getUnmarshalInfo(t), name) - } - return makeUnmarshalTime(getUnmarshalInfo(t), name) - } - - if isDuration { - if pointer { - if slice { - return makeUnmarshalDurationPtrSlice(getUnmarshalInfo(t), name) - } - return makeUnmarshalDurationPtr(getUnmarshalInfo(t), name) - } - if slice { - return makeUnmarshalDurationSlice(getUnmarshalInfo(t), name) - } - return makeUnmarshalDuration(getUnmarshalInfo(t), name) - } - - if isWktPointer { - switch t.Kind() { - case reflect.Float64: - if pointer { - if slice { - return makeStdDoubleValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdDoubleValuePtrUnmarshaler(getUnmarshalInfo(t), name) - } - if slice { - return makeStdDoubleValueSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdDoubleValueUnmarshaler(getUnmarshalInfo(t), name) - case reflect.Float32: - if pointer { - if slice { - return makeStdFloatValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdFloatValuePtrUnmarshaler(getUnmarshalInfo(t), name) - } - if slice { - return makeStdFloatValueSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdFloatValueUnmarshaler(getUnmarshalInfo(t), name) - case reflect.Int64: - if pointer { - if slice { - return makeStdInt64ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdInt64ValuePtrUnmarshaler(getUnmarshalInfo(t), name) - } - if slice { - return makeStdInt64ValueSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdInt64ValueUnmarshaler(getUnmarshalInfo(t), name) - case reflect.Uint64: - if pointer { - if slice { - return makeStdUInt64ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdUInt64ValuePtrUnmarshaler(getUnmarshalInfo(t), name) - } - if slice { - return makeStdUInt64ValueSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdUInt64ValueUnmarshaler(getUnmarshalInfo(t), name) - case reflect.Int32: - if pointer { - if slice { - return makeStdInt32ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdInt32ValuePtrUnmarshaler(getUnmarshalInfo(t), name) - } - if slice { - return makeStdInt32ValueSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdInt32ValueUnmarshaler(getUnmarshalInfo(t), name) - case reflect.Uint32: - if pointer { - if slice { - return makeStdUInt32ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdUInt32ValuePtrUnmarshaler(getUnmarshalInfo(t), name) - } - if slice { - return makeStdUInt32ValueSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdUInt32ValueUnmarshaler(getUnmarshalInfo(t), name) - case reflect.Bool: - if pointer { - if slice { - return makeStdBoolValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdBoolValuePtrUnmarshaler(getUnmarshalInfo(t), name) - } - if slice { - return makeStdBoolValueSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdBoolValueUnmarshaler(getUnmarshalInfo(t), name) - case reflect.String: - if pointer { - if slice { - return makeStdStringValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdStringValuePtrUnmarshaler(getUnmarshalInfo(t), name) - } - if slice { - return makeStdStringValueSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdStringValueUnmarshaler(getUnmarshalInfo(t), name) - case uint8SliceType: - if pointer { - if slice { - return makeStdBytesValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdBytesValuePtrUnmarshaler(getUnmarshalInfo(t), name) - } - if slice { - return makeStdBytesValueSliceUnmarshaler(getUnmarshalInfo(t), name) - } - return makeStdBytesValueUnmarshaler(getUnmarshalInfo(t), name) - default: - panic(fmt.Sprintf("unknown wktpointer type %#v", t)) - } - } - - // We'll never have both pointer and slice for basic types. - if pointer && slice && t.Kind() != reflect.Struct { - panic("both pointer and slice for basic type in " + t.Name()) - } - - switch t.Kind() { - case reflect.Bool: - if pointer { - return unmarshalBoolPtr - } - if slice { - return unmarshalBoolSlice - } - return unmarshalBoolValue - case reflect.Int32: - switch encoding { - case "fixed32": - if pointer { - return unmarshalFixedS32Ptr - } - if slice { - return unmarshalFixedS32Slice - } - return unmarshalFixedS32Value - case "varint": - // this could be int32 or enum - if pointer { - return unmarshalInt32Ptr - } - if slice { - return unmarshalInt32Slice - } - return unmarshalInt32Value - case "zigzag32": - if pointer { - return unmarshalSint32Ptr - } - if slice { - return unmarshalSint32Slice - } - return unmarshalSint32Value - } - case reflect.Int64: - switch encoding { - case "fixed64": - if pointer { - return unmarshalFixedS64Ptr - } - if slice { - return unmarshalFixedS64Slice - } - return unmarshalFixedS64Value - case "varint": - if pointer { - return unmarshalInt64Ptr - } - if slice { - return unmarshalInt64Slice - } - return unmarshalInt64Value - case "zigzag64": - if pointer { - return unmarshalSint64Ptr - } - if slice { - return unmarshalSint64Slice - } - return unmarshalSint64Value - } - case reflect.Uint32: - switch encoding { - case "fixed32": - if pointer { - return unmarshalFixed32Ptr - } - if slice { - return unmarshalFixed32Slice - } - return unmarshalFixed32Value - case "varint": - if pointer { - return unmarshalUint32Ptr - } - if slice { - return unmarshalUint32Slice - } - return unmarshalUint32Value - } - case reflect.Uint64: - switch encoding { - case "fixed64": - if pointer { - return unmarshalFixed64Ptr - } - if slice { - return unmarshalFixed64Slice - } - return unmarshalFixed64Value - case "varint": - if pointer { - return unmarshalUint64Ptr - } - if slice { - return unmarshalUint64Slice - } - return unmarshalUint64Value - } - case reflect.Float32: - if pointer { - return unmarshalFloat32Ptr - } - if slice { - return unmarshalFloat32Slice - } - return unmarshalFloat32Value - case reflect.Float64: - if pointer { - return unmarshalFloat64Ptr - } - if slice { - return unmarshalFloat64Slice - } - return unmarshalFloat64Value - case reflect.Map: - panic("map type in typeUnmarshaler in " + t.Name()) - case reflect.Slice: - if pointer { - panic("bad pointer in slice case in " + t.Name()) - } - if slice { - return unmarshalBytesSlice - } - return unmarshalBytesValue - case reflect.String: - if validateUTF8 { - if pointer { - return unmarshalUTF8StringPtr - } - if slice { - return unmarshalUTF8StringSlice - } - return unmarshalUTF8StringValue - } - if pointer { - return unmarshalStringPtr - } - if slice { - return unmarshalStringSlice - } - return unmarshalStringValue - case reflect.Struct: - // message or group field - if !pointer { - switch encoding { - case "bytes": - if slice { - return makeUnmarshalMessageSlice(getUnmarshalInfo(t), name) - } - return makeUnmarshalMessage(getUnmarshalInfo(t), name) - } - } - switch encoding { - case "bytes": - if slice { - return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) - } - return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) - case "group": - if slice { - return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) - } - return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) - } - } - panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) -} - -// Below are all the unmarshalers for individual fields of various types. - -func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - *f.toInt64() = v - return b, nil -} - -func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - *f.toInt64Ptr() = &v - return b, nil -} - -func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - s := f.toInt64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - s := f.toInt64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - *f.toInt64() = v - return b, nil -} - -func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - *f.toInt64Ptr() = &v - return b, nil -} - -func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - s := f.toInt64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - s := f.toInt64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - *f.toUint64() = v - return b, nil -} - -func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - *f.toUint64Ptr() = &v - return b, nil -} - -func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - s := f.toUint64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - s := f.toUint64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - *f.toInt32() = v - return b, nil -} - -func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.setInt32Ptr(v) - return b, nil -} - -func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.appendInt32Slice(v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.appendInt32Slice(v) - return b, nil -} - -func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - *f.toInt32() = v - return b, nil -} - -func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.setInt32Ptr(v) - return b, nil -} - -func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.appendInt32Slice(v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.appendInt32Slice(v) - return b, nil -} - -func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - *f.toUint32() = v - return b, nil -} - -func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - *f.toUint32Ptr() = &v - return b, nil -} - -func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - s := f.toUint32Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - s := f.toUint32Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - *f.toUint64() = v - return b[8:], nil -} - -func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - *f.toUint64Ptr() = &v - return b[8:], nil -} - -func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - s := f.toUint64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - s := f.toUint64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - *f.toInt64() = v - return b[8:], nil -} - -func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - *f.toInt64Ptr() = &v - return b[8:], nil -} - -func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - s := f.toInt64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - s := f.toInt64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - *f.toUint32() = v - return b[4:], nil -} - -func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - *f.toUint32Ptr() = &v - return b[4:], nil -} - -func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - s := f.toUint32Slice() - *s = append(*s, v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - s := f.toUint32Slice() - *s = append(*s, v) - return b[4:], nil -} - -func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - *f.toInt32() = v - return b[4:], nil -} - -func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.setInt32Ptr(v) - return b[4:], nil -} - -func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.appendInt32Slice(v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.appendInt32Slice(v) - return b[4:], nil -} - -func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - // Note: any length varint is allowed, even though any sane - // encoder will use one byte. - // See https://github.com/golang/protobuf/issues/76 - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - // TODO: check if x>1? Tests seem to indicate no. - v := x != 0 - *f.toBool() = v - return b[n:], nil -} - -func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - *f.toBoolPtr() = &v - return b[n:], nil -} - -func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - s := f.toBoolSlice() - *s = append(*s, v) - b = b[n:] - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - s := f.toBoolSlice() - *s = append(*s, v) - return b[n:], nil -} - -func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - *f.toFloat64() = v - return b[8:], nil -} - -func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - *f.toFloat64Ptr() = &v - return b[8:], nil -} - -func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - s := f.toFloat64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - s := f.toFloat64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - *f.toFloat32() = v - return b[4:], nil -} - -func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - *f.toFloat32Ptr() = &v - return b[4:], nil -} - -func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - s := f.toFloat32Slice() - *s = append(*s, v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - s := f.toFloat32Slice() - *s = append(*s, v) - return b[4:], nil -} - -func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toString() = v - return b[x:], nil -} - -func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toStringPtr() = &v - return b[x:], nil -} - -func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - s := f.toStringSlice() - *s = append(*s, v) - return b[x:], nil -} - -func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toString() = v - if !utf8.ValidString(v) { - return b[x:], errInvalidUTF8 - } - return b[x:], nil -} - -func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toStringPtr() = &v - if !utf8.ValidString(v) { - return b[x:], errInvalidUTF8 - } - return b[x:], nil -} - -func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - s := f.toStringSlice() - *s = append(*s, v) - if !utf8.ValidString(v) { - return b[x:], errInvalidUTF8 - } - return b[x:], nil -} - -var emptyBuf [0]byte - -func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - // The use of append here is a trick which avoids the zeroing - // that would be required if we used a make/copy pair. - // We append to emptyBuf instead of nil because we want - // a non-nil result even when the length is 0. - v := append(emptyBuf[:], b[:x]...) - *f.toBytes() = v - return b[x:], nil -} - -func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := append(emptyBuf[:], b[:x]...) - s := f.toBytesSlice() - *s = append(*s, v) - return b[x:], nil -} - -func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - // First read the message field to see if something is there. - // The semantics of multiple submessages are weird. Instead of - // the last one winning (as it is for all other fields), multiple - // submessages are merged. - v := f.getPointer() - if v.isNil() { - v = valToPointer(reflect.New(sub.typ)) - f.setPointer(v) - } - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - return b[x:], err - } -} - -func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := valToPointer(reflect.New(sub.typ)) - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - f.appendPointer(v) - return b[x:], err - } -} - -func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireStartGroup { - return b, errInternalBadWireType - } - x, y := findEndGroup(b) - if x < 0 { - return nil, io.ErrUnexpectedEOF - } - v := f.getPointer() - if v.isNil() { - v = valToPointer(reflect.New(sub.typ)) - f.setPointer(v) - } - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - return b[y:], err - } -} - -func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireStartGroup { - return b, errInternalBadWireType - } - x, y := findEndGroup(b) - if x < 0 { - return nil, io.ErrUnexpectedEOF - } - v := valToPointer(reflect.New(sub.typ)) - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - f.appendPointer(v) - return b[y:], err - } -} - -func makeUnmarshalMap(f *reflect.StructField) unmarshaler { - t := f.Type - kt := t.Key() - vt := t.Elem() - tagArray := strings.Split(f.Tag.Get("protobuf"), ",") - valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") - for _, t := range tagArray { - if strings.HasPrefix(t, "customtype=") { - valTags = append(valTags, t) - } - if t == "stdtime" { - valTags = append(valTags, t) - } - if t == "stdduration" { - valTags = append(valTags, t) - } - if t == "wktptr" { - valTags = append(valTags, t) - } - } - unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) - unmarshalVal := typeUnmarshaler(vt, strings.Join(valTags, ",")) - return func(b []byte, f pointer, w int) ([]byte, error) { - // The map entry is a submessage. Figure out how big it is. - if w != WireBytes { - return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - r := b[x:] // unused data to return - b = b[:x] // data for map entry - - // Note: we could use #keys * #values ~= 200 functions - // to do map decoding without reflection. Probably not worth it. - // Maps will be somewhat slow. Oh well. - - // Read key and value from data. - var nerr nonFatal - k := reflect.New(kt) - v := reflect.New(vt) - for len(b) > 0 { - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - wire := int(x) & 7 - b = b[n:] - - var err error - switch x >> 3 { - case 1: - b, err = unmarshalKey(b, valToPointer(k), wire) - case 2: - b, err = unmarshalVal(b, valToPointer(v), wire) - default: - err = errInternalBadWireType // skip unknown tag - } - - if nerr.Merge(err) { - continue - } - if err != errInternalBadWireType { - return nil, err - } - - // Skip past unknown fields. - b, err = skipField(b, wire) - if err != nil { - return nil, err - } - } - - // Get map, allocate if needed. - m := f.asPointerTo(t).Elem() // an addressable map[K]T - if m.IsNil() { - m.Set(reflect.MakeMap(t)) - } - - // Insert into map. - m.SetMapIndex(k.Elem(), v.Elem()) - - return r, nerr.E - } -} - -// makeUnmarshalOneof makes an unmarshaler for oneof fields. -// for: -// message Msg { -// oneof F { -// int64 X = 1; -// float64 Y = 2; -// } -// } -// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). -// ityp is the interface type of the oneof field (e.g. isMsg_F). -// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). -// Note that this function will be called once for each case in the oneof. -func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { - sf := typ.Field(0) - field0 := toField(&sf) - return func(b []byte, f pointer, w int) ([]byte, error) { - // Allocate holder for value. - v := reflect.New(typ) - - // Unmarshal data into holder. - // We unmarshal into the first field of the holder object. - var err error - var nerr nonFatal - b, err = unmarshal(b, valToPointer(v).offset(field0), w) - if !nerr.Merge(err) { - return nil, err - } - - // Write pointer to holder into target field. - f.asPointerTo(ityp).Elem().Set(v) - - return b, nerr.E - } -} - -// Error used by decode internally. -var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") - -// skipField skips past a field of type wire and returns the remaining bytes. -func skipField(b []byte, wire int) ([]byte, error) { - switch wire { - case WireVarint: - _, k := decodeVarint(b) - if k == 0 { - return b, io.ErrUnexpectedEOF - } - b = b[k:] - case WireFixed32: - if len(b) < 4 { - return b, io.ErrUnexpectedEOF - } - b = b[4:] - case WireFixed64: - if len(b) < 8 { - return b, io.ErrUnexpectedEOF - } - b = b[8:] - case WireBytes: - m, k := decodeVarint(b) - if k == 0 || uint64(len(b)-k) < m { - return b, io.ErrUnexpectedEOF - } - b = b[uint64(k)+m:] - case WireStartGroup: - _, i := findEndGroup(b) - if i == -1 { - return b, io.ErrUnexpectedEOF - } - b = b[i:] - default: - return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) - } - return b, nil -} - -// findEndGroup finds the index of the next EndGroup tag. -// Groups may be nested, so the "next" EndGroup tag is the first -// unpaired EndGroup. -// findEndGroup returns the indexes of the start and end of the EndGroup tag. -// Returns (-1,-1) if it can't find one. -func findEndGroup(b []byte) (int, int) { - depth := 1 - i := 0 - for { - x, n := decodeVarint(b[i:]) - if n == 0 { - return -1, -1 - } - j := i - i += n - switch x & 7 { - case WireVarint: - _, k := decodeVarint(b[i:]) - if k == 0 { - return -1, -1 - } - i += k - case WireFixed32: - if len(b)-4 < i { - return -1, -1 - } - i += 4 - case WireFixed64: - if len(b)-8 < i { - return -1, -1 - } - i += 8 - case WireBytes: - m, k := decodeVarint(b[i:]) - if k == 0 { - return -1, -1 - } - i += k - if uint64(len(b)-i) < m { - return -1, -1 - } - i += int(m) - case WireStartGroup: - depth++ - case WireEndGroup: - depth-- - if depth == 0 { - return j, i - } - default: - return -1, -1 - } - } -} - -// encodeVarint appends a varint-encoded integer to b and returns the result. -func encodeVarint(b []byte, x uint64) []byte { - for x >= 1<<7 { - b = append(b, byte(x&0x7f|0x80)) - x >>= 7 - } - return append(b, byte(x)) -} - -// decodeVarint reads a varint-encoded integer from b. -// Returns the decoded integer and the number of bytes read. -// If there is an error, it returns 0,0. -func decodeVarint(b []byte) (uint64, int) { - var x, y uint64 - if len(b) == 0 { - goto bad - } - x = uint64(b[0]) - if x < 0x80 { - return x, 1 - } - x -= 0x80 - - if len(b) <= 1 { - goto bad - } - y = uint64(b[1]) - x += y << 7 - if y < 0x80 { - return x, 2 - } - x -= 0x80 << 7 - - if len(b) <= 2 { - goto bad - } - y = uint64(b[2]) - x += y << 14 - if y < 0x80 { - return x, 3 - } - x -= 0x80 << 14 - - if len(b) <= 3 { - goto bad - } - y = uint64(b[3]) - x += y << 21 - if y < 0x80 { - return x, 4 - } - x -= 0x80 << 21 - - if len(b) <= 4 { - goto bad - } - y = uint64(b[4]) - x += y << 28 - if y < 0x80 { - return x, 5 - } - x -= 0x80 << 28 - - if len(b) <= 5 { - goto bad - } - y = uint64(b[5]) - x += y << 35 - if y < 0x80 { - return x, 6 - } - x -= 0x80 << 35 - - if len(b) <= 6 { - goto bad - } - y = uint64(b[6]) - x += y << 42 - if y < 0x80 { - return x, 7 - } - x -= 0x80 << 42 - - if len(b) <= 7 { - goto bad - } - y = uint64(b[7]) - x += y << 49 - if y < 0x80 { - return x, 8 - } - x -= 0x80 << 49 - - if len(b) <= 8 { - goto bad - } - y = uint64(b[8]) - x += y << 56 - if y < 0x80 { - return x, 9 - } - x -= 0x80 << 56 - - if len(b) <= 9 { - goto bad - } - y = uint64(b[9]) - x += y << 63 - if y < 2 { - return x, 10 - } - -bad: - return 0, 0 -} diff --git a/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go b/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go deleted file mode 100644 index 00d6c7ad93..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go +++ /dev/null @@ -1,385 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2018, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "io" - "reflect" -) - -func makeUnmarshalMessage(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - // First read the message field to see if something is there. - // The semantics of multiple submessages are weird. Instead of - // the last one winning (as it is for all other fields), multiple - // submessages are merged. - v := f // gogo: changed from v := f.getPointer() - if v.isNil() { - v = valToPointer(reflect.New(sub.typ)) - f.setPointer(v) - } - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - return b[x:], err - } -} - -func makeUnmarshalMessageSlice(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := valToPointer(reflect.New(sub.typ)) - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - f.appendRef(v, sub.typ) // gogo: changed from f.appendPointer(v) - return b[x:], err - } -} - -func makeUnmarshalCustomPtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.New(sub.typ)) - m := s.Interface().(custom) - if err := m.Unmarshal(b[:x]); err != nil { - return nil, err - } - return b[x:], nil - } -} - -func makeUnmarshalCustomSlice(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := reflect.New(sub.typ) - c := m.Interface().(custom) - if err := c.Unmarshal(b[:x]); err != nil { - return nil, err - } - v := valToPointer(m) - f.appendRef(v, sub.typ) - return b[x:], nil - } -} - -func makeUnmarshalCustom(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - - m := f.asPointerTo(sub.typ).Interface().(custom) - if err := m.Unmarshal(b[:x]); err != nil { - return nil, err - } - return b[x:], nil - } -} - -func makeUnmarshalTime(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := ×tamp{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - t, err := timestampFromProto(m) - if err != nil { - return nil, err - } - s := f.asPointerTo(sub.typ).Elem() - s.Set(reflect.ValueOf(t)) - return b[x:], nil - } -} - -func makeUnmarshalTimePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := ×tamp{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - t, err := timestampFromProto(m) - if err != nil { - return nil, err - } - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.ValueOf(&t)) - return b[x:], nil - } -} - -func makeUnmarshalTimePtrSlice(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := ×tamp{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - t, err := timestampFromProto(m) - if err != nil { - return nil, err - } - slice := f.getSlice(reflect.PtrTo(sub.typ)) - newSlice := reflect.Append(slice, reflect.ValueOf(&t)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeUnmarshalTimeSlice(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := ×tamp{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - t, err := timestampFromProto(m) - if err != nil { - return nil, err - } - slice := f.getSlice(sub.typ) - newSlice := reflect.Append(slice, reflect.ValueOf(t)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeUnmarshalDurationPtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &duration{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - d, err := durationFromProto(m) - if err != nil { - return nil, err - } - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.ValueOf(&d)) - return b[x:], nil - } -} - -func makeUnmarshalDuration(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &duration{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - d, err := durationFromProto(m) - if err != nil { - return nil, err - } - s := f.asPointerTo(sub.typ).Elem() - s.Set(reflect.ValueOf(d)) - return b[x:], nil - } -} - -func makeUnmarshalDurationPtrSlice(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &duration{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - d, err := durationFromProto(m) - if err != nil { - return nil, err - } - slice := f.getSlice(reflect.PtrTo(sub.typ)) - newSlice := reflect.Append(slice, reflect.ValueOf(&d)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeUnmarshalDurationSlice(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &duration{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - d, err := durationFromProto(m) - if err != nil { - return nil, err - } - slice := f.getSlice(sub.typ) - newSlice := reflect.Append(slice, reflect.ValueOf(d)) - slice.Set(newSlice) - return b[x:], nil - } -} diff --git a/vendor/github.com/gogo/protobuf/proto/text.go b/vendor/github.com/gogo/protobuf/proto/text.go deleted file mode 100644 index 87416afe95..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/text.go +++ /dev/null @@ -1,930 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// Functions for writing the text protocol buffer format. - -import ( - "bufio" - "bytes" - "encoding" - "errors" - "fmt" - "io" - "log" - "math" - "reflect" - "sort" - "strings" - "sync" - "time" -) - -var ( - newline = []byte("\n") - spaces = []byte(" ") - endBraceNewline = []byte("}\n") - backslashN = []byte{'\\', 'n'} - backslashR = []byte{'\\', 'r'} - backslashT = []byte{'\\', 't'} - backslashDQ = []byte{'\\', '"'} - backslashBS = []byte{'\\', '\\'} - posInf = []byte("inf") - negInf = []byte("-inf") - nan = []byte("nan") -) - -type writer interface { - io.Writer - WriteByte(byte) error -} - -// textWriter is an io.Writer that tracks its indentation level. -type textWriter struct { - ind int - complete bool // if the current position is a complete line - compact bool // whether to write out as a one-liner - w writer -} - -func (w *textWriter) WriteString(s string) (n int, err error) { - if !strings.Contains(s, "\n") { - if !w.compact && w.complete { - w.writeIndent() - } - w.complete = false - return io.WriteString(w.w, s) - } - // WriteString is typically called without newlines, so this - // codepath and its copy are rare. We copy to avoid - // duplicating all of Write's logic here. - return w.Write([]byte(s)) -} - -func (w *textWriter) Write(p []byte) (n int, err error) { - newlines := bytes.Count(p, newline) - if newlines == 0 { - if !w.compact && w.complete { - w.writeIndent() - } - n, err = w.w.Write(p) - w.complete = false - return n, err - } - - frags := bytes.SplitN(p, newline, newlines+1) - if w.compact { - for i, frag := range frags { - if i > 0 { - if err := w.w.WriteByte(' '); err != nil { - return n, err - } - n++ - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - } - return n, nil - } - - for i, frag := range frags { - if w.complete { - w.writeIndent() - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - if i+1 < len(frags) { - if err := w.w.WriteByte('\n'); err != nil { - return n, err - } - n++ - } - } - w.complete = len(frags[len(frags)-1]) == 0 - return n, nil -} - -func (w *textWriter) WriteByte(c byte) error { - if w.compact && c == '\n' { - c = ' ' - } - if !w.compact && w.complete { - w.writeIndent() - } - err := w.w.WriteByte(c) - w.complete = c == '\n' - return err -} - -func (w *textWriter) indent() { w.ind++ } - -func (w *textWriter) unindent() { - if w.ind == 0 { - log.Print("proto: textWriter unindented too far") - return - } - w.ind-- -} - -func writeName(w *textWriter, props *Properties) error { - if _, err := w.WriteString(props.OrigName); err != nil { - return err - } - if props.Wire != "group" { - return w.WriteByte(':') - } - return nil -} - -func requiresQuotes(u string) bool { - // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. - for _, ch := range u { - switch { - case ch == '.' || ch == '/' || ch == '_': - continue - case '0' <= ch && ch <= '9': - continue - case 'A' <= ch && ch <= 'Z': - continue - case 'a' <= ch && ch <= 'z': - continue - default: - return true - } - } - return false -} - -// isAny reports whether sv is a google.protobuf.Any message -func isAny(sv reflect.Value) bool { - type wkt interface { - XXX_WellKnownType() string - } - t, ok := sv.Addr().Interface().(wkt) - return ok && t.XXX_WellKnownType() == "Any" -} - -// writeProto3Any writes an expanded google.protobuf.Any message. -// -// It returns (false, nil) if sv value can't be unmarshaled (e.g. because -// required messages are not linked in). -// -// It returns (true, error) when sv was written in expanded format or an error -// was encountered. -func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { - turl := sv.FieldByName("TypeUrl") - val := sv.FieldByName("Value") - if !turl.IsValid() || !val.IsValid() { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - b, ok := val.Interface().([]byte) - if !ok { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - parts := strings.Split(turl.String(), "/") - mt := MessageType(parts[len(parts)-1]) - if mt == nil { - return false, nil - } - m := reflect.New(mt.Elem()) - if err := Unmarshal(b, m.Interface().(Message)); err != nil { - return false, nil - } - w.Write([]byte("[")) - u := turl.String() - if requiresQuotes(u) { - writeString(w, u) - } else { - w.Write([]byte(u)) - } - if w.compact { - w.Write([]byte("]:<")) - } else { - w.Write([]byte("]: <\n")) - w.ind++ - } - if err := tm.writeStruct(w, m.Elem()); err != nil { - return true, err - } - if w.compact { - w.Write([]byte("> ")) - } else { - w.ind-- - w.Write([]byte(">\n")) - } - return true, nil -} - -func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { - if tm.ExpandAny && isAny(sv) { - if canExpand, err := tm.writeProto3Any(w, sv); canExpand { - return err - } - } - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < sv.NumField(); i++ { - fv := sv.Field(i) - props := sprops.Prop[i] - name := st.Field(i).Name - - if name == "XXX_NoUnkeyedLiteral" { - continue - } - - if strings.HasPrefix(name, "XXX_") { - // There are two XXX_ fields: - // XXX_unrecognized []byte - // XXX_extensions map[int32]proto.Extension - // The first is handled here; - // the second is handled at the bottom of this function. - if name == "XXX_unrecognized" && !fv.IsNil() { - if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Field not filled in. This could be an optional field or - // a required field that wasn't filled in. Either way, there - // isn't anything we can show for it. - continue - } - if fv.Kind() == reflect.Slice && fv.IsNil() { - // Repeated field that is empty, or a bytes field that is unused. - continue - } - - if props.Repeated && fv.Kind() == reflect.Slice { - // Repeated field. - for j := 0; j < fv.Len(); j++ { - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - v := fv.Index(j) - if v.Kind() == reflect.Ptr && v.IsNil() { - // A nil message in a repeated field is not valid, - // but we can handle that more gracefully than panicking. - if _, err := w.Write([]byte("\n")); err != nil { - return err - } - continue - } - if len(props.Enum) > 0 { - if err := tm.writeEnum(w, v, props); err != nil { - return err - } - } else if err := tm.writeAny(w, v, props); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Map { - // Map fields are rendered as a repeated struct with key/value fields. - keys := fv.MapKeys() - sort.Sort(mapKeys(keys)) - for _, key := range keys { - val := fv.MapIndex(key) - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - // open struct - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - // key - if _, err := w.WriteString("key:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, key, props.MapKeyProp); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - // nil values aren't legal, but we can avoid panicking because of them. - if val.Kind() != reflect.Ptr || !val.IsNil() { - // value - if _, err := w.WriteString("value:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, val, props.MapValProp); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - // close struct - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { - // empty bytes field - continue - } - if props.proto3 && fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { - // proto3 non-repeated scalar field; skip if zero value - if isProto3Zero(fv) { - continue - } - } - - if fv.Kind() == reflect.Interface { - // Check if it is a oneof. - if st.Field(i).Tag.Get("protobuf_oneof") != "" { - // fv is nil, or holds a pointer to generated struct. - // That generated struct has exactly one field, - // which has a protobuf struct tag. - if fv.IsNil() { - continue - } - inner := fv.Elem().Elem() // interface -> *T -> T - tag := inner.Type().Field(0).Tag.Get("protobuf") - props = new(Properties) // Overwrite the outer props var, but not its pointee. - props.Parse(tag) - // Write the value in the oneof, not the oneof itself. - fv = inner.Field(0) - - // Special case to cope with malformed messages gracefully: - // If the value in the oneof is a nil pointer, don't panic - // in writeAny. - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Use errors.New so writeAny won't render quotes. - msg := errors.New("/* nil */") - fv = reflect.ValueOf(&msg).Elem() - } - } - } - - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - - if len(props.Enum) > 0 { - if err := tm.writeEnum(w, fv, props); err != nil { - return err - } - } else if err := tm.writeAny(w, fv, props); err != nil { - return err - } - - if err := w.WriteByte('\n'); err != nil { - return err - } - } - - // Extensions (the XXX_extensions field). - pv := sv - if pv.CanAddr() { - pv = sv.Addr() - } else { - pv = reflect.New(sv.Type()) - pv.Elem().Set(sv) - } - if _, err := extendable(pv.Interface()); err == nil { - if err := tm.writeExtensions(w, pv); err != nil { - return err - } - } - - return nil -} - -var textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() - -// writeAny writes an arbitrary field. -func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { - v = reflect.Indirect(v) - - if props != nil { - if len(props.CustomType) > 0 { - custom, ok := v.Interface().(Marshaler) - if ok { - data, err := custom.Marshal() - if err != nil { - return err - } - if err := writeString(w, string(data)); err != nil { - return err - } - return nil - } - } else if len(props.CastType) > 0 { - if _, ok := v.Interface().(interface { - String() string - }); ok { - switch v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - _, err := fmt.Fprintf(w, "%d", v.Interface()) - return err - } - } - } else if props.StdTime { - t, ok := v.Interface().(time.Time) - if !ok { - return fmt.Errorf("stdtime is not time.Time, but %T", v.Interface()) - } - tproto, err := timestampProto(t) - if err != nil { - return err - } - propsCopy := *props // Make a copy so that this is goroutine-safe - propsCopy.StdTime = false - err = tm.writeAny(w, reflect.ValueOf(tproto), &propsCopy) - return err - } else if props.StdDuration { - d, ok := v.Interface().(time.Duration) - if !ok { - return fmt.Errorf("stdtime is not time.Duration, but %T", v.Interface()) - } - dproto := durationProto(d) - propsCopy := *props // Make a copy so that this is goroutine-safe - propsCopy.StdDuration = false - err := tm.writeAny(w, reflect.ValueOf(dproto), &propsCopy) - return err - } - } - - // Floats have special cases. - if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { - x := v.Float() - var b []byte - switch { - case math.IsInf(x, 1): - b = posInf - case math.IsInf(x, -1): - b = negInf - case math.IsNaN(x): - b = nan - } - if b != nil { - _, err := w.Write(b) - return err - } - // Other values are handled below. - } - - // We don't attempt to serialise every possible value type; only those - // that can occur in protocol buffers. - switch v.Kind() { - case reflect.Slice: - // Should only be a []byte; repeated fields are handled in writeStruct. - if err := writeString(w, string(v.Bytes())); err != nil { - return err - } - case reflect.String: - if err := writeString(w, v.String()); err != nil { - return err - } - case reflect.Struct: - // Required/optional group/message. - var bra, ket byte = '<', '>' - if props != nil && props.Wire == "group" { - bra, ket = '{', '}' - } - if err := w.WriteByte(bra); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if v.CanAddr() { - // Calling v.Interface on a struct causes the reflect package to - // copy the entire struct. This is racy with the new Marshaler - // since we atomically update the XXX_sizecache. - // - // Thus, we retrieve a pointer to the struct if possible to avoid - // a race since v.Interface on the pointer doesn't copy the struct. - // - // If v is not addressable, then we are not worried about a race - // since it implies that the binary Marshaler cannot possibly be - // mutating this value. - v = v.Addr() - } - if v.Type().Implements(textMarshalerType) { - text, err := v.Interface().(encoding.TextMarshaler).MarshalText() - if err != nil { - return err - } - if _, err = w.Write(text); err != nil { - return err - } - } else { - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - if err := tm.writeStruct(w, v); err != nil { - return err - } - } - w.unindent() - if err := w.WriteByte(ket); err != nil { - return err - } - default: - _, err := fmt.Fprint(w, v.Interface()) - return err - } - return nil -} - -// equivalent to C's isprint. -func isprint(c byte) bool { - return c >= 0x20 && c < 0x7f -} - -// writeString writes a string in the protocol buffer text format. -// It is similar to strconv.Quote except we don't use Go escape sequences, -// we treat the string as a byte sequence, and we use octal escapes. -// These differences are to maintain interoperability with the other -// languages' implementations of the text format. -func writeString(w *textWriter, s string) error { - // use WriteByte here to get any needed indent - if err := w.WriteByte('"'); err != nil { - return err - } - // Loop over the bytes, not the runes. - for i := 0; i < len(s); i++ { - var err error - // Divergence from C++: we don't escape apostrophes. - // There's no need to escape them, and the C++ parser - // copes with a naked apostrophe. - switch c := s[i]; c { - case '\n': - _, err = w.w.Write(backslashN) - case '\r': - _, err = w.w.Write(backslashR) - case '\t': - _, err = w.w.Write(backslashT) - case '"': - _, err = w.w.Write(backslashDQ) - case '\\': - _, err = w.w.Write(backslashBS) - default: - if isprint(c) { - err = w.w.WriteByte(c) - } else { - _, err = fmt.Fprintf(w.w, "\\%03o", c) - } - } - if err != nil { - return err - } - } - return w.WriteByte('"') -} - -func writeUnknownStruct(w *textWriter, data []byte) (err error) { - if !w.compact { - if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { - return err - } - } - b := NewBuffer(data) - for b.index < len(b.buf) { - x, err := b.DecodeVarint() - if err != nil { - _, ferr := fmt.Fprintf(w, "/* %v */\n", err) - return ferr - } - wire, tag := x&7, x>>3 - if wire == WireEndGroup { - w.unindent() - if _, werr := w.Write(endBraceNewline); werr != nil { - return werr - } - continue - } - if _, ferr := fmt.Fprint(w, tag); ferr != nil { - return ferr - } - if wire != WireStartGroup { - if err = w.WriteByte(':'); err != nil { - return err - } - } - if !w.compact || wire == WireStartGroup { - if err = w.WriteByte(' '); err != nil { - return err - } - } - switch wire { - case WireBytes: - buf, e := b.DecodeRawBytes(false) - if e == nil { - _, err = fmt.Fprintf(w, "%q", buf) - } else { - _, err = fmt.Fprintf(w, "/* %v */", e) - } - case WireFixed32: - x, err = b.DecodeFixed32() - err = writeUnknownInt(w, x, err) - case WireFixed64: - x, err = b.DecodeFixed64() - err = writeUnknownInt(w, x, err) - case WireStartGroup: - err = w.WriteByte('{') - w.indent() - case WireVarint: - x, err = b.DecodeVarint() - err = writeUnknownInt(w, x, err) - default: - _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) - } - if err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - return nil -} - -func writeUnknownInt(w *textWriter, x uint64, err error) error { - if err == nil { - _, err = fmt.Fprint(w, x) - } else { - _, err = fmt.Fprintf(w, "/* %v */", err) - } - return err -} - -type int32Slice []int32 - -func (s int32Slice) Len() int { return len(s) } -func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } -func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// writeExtensions writes all the extensions in pv. -// pv is assumed to be a pointer to a protocol message struct that is extendable. -func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { - emap := extensionMaps[pv.Type().Elem()] - e := pv.Interface().(Message) - - var m map[int32]Extension - var mu sync.Locker - if em, ok := e.(extensionsBytes); ok { - eb := em.GetExtensions() - var err error - m, err = BytesToExtensionsMap(*eb) - if err != nil { - return err - } - mu = notLocker{} - } else if _, ok := e.(extendableProto); ok { - ep, _ := extendable(e) - m, mu = ep.extensionsRead() - if m == nil { - return nil - } - } - - // Order the extensions by ID. - // This isn't strictly necessary, but it will give us - // canonical output, which will also make testing easier. - - mu.Lock() - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) - mu.Unlock() - - for _, extNum := range ids { - ext := m[extNum] - var desc *ExtensionDesc - if emap != nil { - desc = emap[extNum] - } - if desc == nil { - // Unknown extension. - if err := writeUnknownStruct(w, ext.enc); err != nil { - return err - } - continue - } - - pb, err := GetExtension(e, desc) - if err != nil { - return fmt.Errorf("failed getting extension: %v", err) - } - - // Repeated extensions will appear as a slice. - if !desc.repeated() { - if err := tm.writeExtension(w, desc.Name, pb); err != nil { - return err - } - } else { - v := reflect.ValueOf(pb) - for i := 0; i < v.Len(); i++ { - if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { - return err - } - } - } - } - return nil -} - -func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { - if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - return nil -} - -func (w *textWriter) writeIndent() { - if !w.complete { - return - } - remain := w.ind * 2 - for remain > 0 { - n := remain - if n > len(spaces) { - n = len(spaces) - } - w.w.Write(spaces[:n]) - remain -= n - } - w.complete = false -} - -// TextMarshaler is a configurable text format marshaler. -type TextMarshaler struct { - Compact bool // use compact text format (one line). - ExpandAny bool // expand google.protobuf.Any messages of known types -} - -// Marshal writes a given protocol buffer in text format. -// The only errors returned are from w. -func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { - val := reflect.ValueOf(pb) - if pb == nil || val.IsNil() { - w.Write([]byte("")) - return nil - } - var bw *bufio.Writer - ww, ok := w.(writer) - if !ok { - bw = bufio.NewWriter(w) - ww = bw - } - aw := &textWriter{ - w: ww, - complete: true, - compact: tm.Compact, - } - - if etm, ok := pb.(encoding.TextMarshaler); ok { - text, err := etm.MarshalText() - if err != nil { - return err - } - if _, err = aw.Write(text); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil - } - // Dereference the received pointer so we don't have outer < and >. - v := reflect.Indirect(val) - if err := tm.writeStruct(aw, v); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil -} - -// Text is the same as Marshal, but returns the string directly. -func (tm *TextMarshaler) Text(pb Message) string { - var buf bytes.Buffer - tm.Marshal(&buf, pb) - return buf.String() -} - -var ( - defaultTextMarshaler = TextMarshaler{} - compactTextMarshaler = TextMarshaler{Compact: true} -) - -// TODO: consider removing some of the Marshal functions below. - -// MarshalText writes a given protocol buffer in text format. -// The only errors returned are from w. -func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } - -// MarshalTextString is the same as MarshalText, but returns the string directly. -func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } - -// CompactText writes a given protocol buffer in compact text format (one line). -func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } - -// CompactTextString is the same as CompactText, but returns the string directly. -func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/gogo/protobuf/proto/text_gogo.go b/vendor/github.com/gogo/protobuf/proto/text_gogo.go deleted file mode 100644 index 1d6c6aa0e4..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/text_gogo.go +++ /dev/null @@ -1,57 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "reflect" -) - -func (tm *TextMarshaler) writeEnum(w *textWriter, v reflect.Value, props *Properties) error { - m, ok := enumStringMaps[props.Enum] - if !ok { - if err := tm.writeAny(w, v, props); err != nil { - return err - } - } - key := int32(0) - if v.Kind() == reflect.Ptr { - key = int32(v.Elem().Int()) - } else { - key = int32(v.Int()) - } - s, ok := m[key] - if !ok { - if err := tm.writeAny(w, v, props); err != nil { - return err - } - } - _, err := fmt.Fprint(w, s) - return err -} diff --git a/vendor/github.com/gogo/protobuf/proto/text_parser.go b/vendor/github.com/gogo/protobuf/proto/text_parser.go deleted file mode 100644 index f85c0cc81a..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/text_parser.go +++ /dev/null @@ -1,1018 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// Functions for parsing the Text protocol buffer format. -// TODO: message sets. - -import ( - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "time" - "unicode/utf8" -) - -// Error string emitted when deserializing Any and fields are already set -const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" - -type ParseError struct { - Message string - Line int // 1-based line number - Offset int // 0-based byte offset from start of input -} - -func (p *ParseError) Error() string { - if p.Line == 1 { - // show offset only for first line - return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) - } - return fmt.Sprintf("line %d: %v", p.Line, p.Message) -} - -type token struct { - value string - err *ParseError - line int // line number - offset int // byte number from start of input, not start of line - unquoted string // the unquoted version of value, if it was a quoted string -} - -func (t *token) String() string { - if t.err == nil { - return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) - } - return fmt.Sprintf("parse error: %v", t.err) -} - -type textParser struct { - s string // remaining input - done bool // whether the parsing is finished (success or error) - backed bool // whether back() was called - offset, line int - cur token -} - -func newTextParser(s string) *textParser { - p := new(textParser) - p.s = s - p.line = 1 - p.cur.line = 1 - return p -} - -func (p *textParser) errorf(format string, a ...interface{}) *ParseError { - pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} - p.cur.err = pe - p.done = true - return pe -} - -// Numbers and identifiers are matched by [-+._A-Za-z0-9] -func isIdentOrNumberChar(c byte) bool { - switch { - case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': - return true - case '0' <= c && c <= '9': - return true - } - switch c { - case '-', '+', '.', '_': - return true - } - return false -} - -func isWhitespace(c byte) bool { - switch c { - case ' ', '\t', '\n', '\r': - return true - } - return false -} - -func isQuote(c byte) bool { - switch c { - case '"', '\'': - return true - } - return false -} - -func (p *textParser) skipWhitespace() { - i := 0 - for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { - if p.s[i] == '#' { - // comment; skip to end of line or input - for i < len(p.s) && p.s[i] != '\n' { - i++ - } - if i == len(p.s) { - break - } - } - if p.s[i] == '\n' { - p.line++ - } - i++ - } - p.offset += i - p.s = p.s[i:len(p.s)] - if len(p.s) == 0 { - p.done = true - } -} - -func (p *textParser) advance() { - // Skip whitespace - p.skipWhitespace() - if p.done { - return - } - - // Start of non-whitespace - p.cur.err = nil - p.cur.offset, p.cur.line = p.offset, p.line - p.cur.unquoted = "" - switch p.s[0] { - case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': - // Single symbol - p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] - case '"', '\'': - // Quoted string - i := 1 - for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { - if p.s[i] == '\\' && i+1 < len(p.s) { - // skip escaped char - i++ - } - i++ - } - if i >= len(p.s) || p.s[i] != p.s[0] { - p.errorf("unmatched quote") - return - } - unq, err := unquoteC(p.s[1:i], rune(p.s[0])) - if err != nil { - p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) - return - } - p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] - p.cur.unquoted = unq - default: - i := 0 - for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { - i++ - } - if i == 0 { - p.errorf("unexpected byte %#x", p.s[0]) - return - } - p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] - } - p.offset += len(p.cur.value) -} - -var ( - errBadUTF8 = errors.New("proto: bad UTF-8") -) - -func unquoteC(s string, quote rune) (string, error) { - // This is based on C++'s tokenizer.cc. - // Despite its name, this is *not* parsing C syntax. - // For instance, "\0" is an invalid quoted string. - - // Avoid allocation in trivial cases. - simple := true - for _, r := range s { - if r == '\\' || r == quote { - simple = false - break - } - } - if simple { - return s, nil - } - - buf := make([]byte, 0, 3*len(s)/2) - for len(s) > 0 { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", errBadUTF8 - } - s = s[n:] - if r != '\\' { - if r < utf8.RuneSelf { - buf = append(buf, byte(r)) - } else { - buf = append(buf, string(r)...) - } - continue - } - - ch, tail, err := unescape(s) - if err != nil { - return "", err - } - buf = append(buf, ch...) - s = tail - } - return string(buf), nil -} - -func unescape(s string) (ch string, tail string, err error) { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", "", errBadUTF8 - } - s = s[n:] - switch r { - case 'a': - return "\a", s, nil - case 'b': - return "\b", s, nil - case 'f': - return "\f", s, nil - case 'n': - return "\n", s, nil - case 'r': - return "\r", s, nil - case 't': - return "\t", s, nil - case 'v': - return "\v", s, nil - case '?': - return "?", s, nil // trigraph workaround - case '\'', '"', '\\': - return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7': - if len(s) < 2 { - return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) - } - ss := string(r) + s[:2] - s = s[2:] - i, err := strconv.ParseUint(ss, 8, 8) - if err != nil { - return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) - } - return string([]byte{byte(i)}), s, nil - case 'x', 'X', 'u', 'U': - var n int - switch r { - case 'x', 'X': - n = 2 - case 'u': - n = 4 - case 'U': - n = 8 - } - if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) - } - ss := s[:n] - s = s[n:] - i, err := strconv.ParseUint(ss, 16, 64) - if err != nil { - return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) - } - if r == 'x' || r == 'X' { - return string([]byte{byte(i)}), s, nil - } - if i > utf8.MaxRune { - return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) - } - return string(rune(i)), s, nil - } - return "", "", fmt.Errorf(`unknown escape \%c`, r) -} - -// Back off the parser by one token. Can only be done between calls to next(). -// It makes the next advance() a no-op. -func (p *textParser) back() { p.backed = true } - -// Advances the parser and returns the new current token. -func (p *textParser) next() *token { - if p.backed || p.done { - p.backed = false - return &p.cur - } - p.advance() - if p.done { - p.cur.value = "" - } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { - // Look for multiple quoted strings separated by whitespace, - // and concatenate them. - cat := p.cur - for { - p.skipWhitespace() - if p.done || !isQuote(p.s[0]) { - break - } - p.advance() - if p.cur.err != nil { - return &p.cur - } - cat.value += " " + p.cur.value - cat.unquoted += p.cur.unquoted - } - p.done = false // parser may have seen EOF, but we want to return cat - p.cur = cat - } - return &p.cur -} - -func (p *textParser) consumeToken(s string) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != s { - p.back() - return p.errorf("expected %q, found %q", s, tok.value) - } - return nil -} - -// Return a RequiredNotSetError indicating which required field was not set. -func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < st.NumField(); i++ { - if !isNil(sv.Field(i)) { - continue - } - - props := sprops.Prop[i] - if props.Required { - return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} - } - } - return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen -} - -// Returns the index in the struct for the named field, as well as the parsed tag properties. -func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { - i, ok := sprops.decoderOrigNames[name] - if ok { - return i, sprops.Prop[i], true - } - return -1, nil, false -} - -// Consume a ':' from the input stream (if the next token is a colon), -// returning an error if a colon is needed but not present. -func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ":" { - // Colon is optional when the field is a group or message. - needColon := true - switch props.Wire { - case "group": - needColon = false - case "bytes": - // A "bytes" field is either a message, a string, or a repeated field; - // those three become *T, *string and []T respectively, so we can check for - // this field being a pointer to a non-string. - if typ.Kind() == reflect.Ptr { - // *T or *string - if typ.Elem().Kind() == reflect.String { - break - } - } else if typ.Kind() == reflect.Slice { - // []T or []*T - if typ.Elem().Kind() != reflect.Ptr { - break - } - } else if typ.Kind() == reflect.String { - // The proto3 exception is for a string field, - // which requires a colon. - break - } - needColon = false - } - if needColon { - return p.errorf("expected ':', found %q", tok.value) - } - p.back() - } - return nil -} - -func (p *textParser) readStruct(sv reflect.Value, terminator string) error { - st := sv.Type() - sprops := GetProperties(st) - reqCount := sprops.reqCount - var reqFieldErr error - fieldSet := make(map[string]bool) - // A struct is a sequence of "name: value", terminated by one of - // '>' or '}', or the end of the input. A name may also be - // "[extension]" or "[type/url]". - // - // The whole struct can also be an expanded Any message, like: - // [type/url] < ... struct contents ... > - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - if tok.value == "[" { - // Looks like an extension or an Any. - // - // TODO: Check whether we need to handle - // namespace rooted names (e.g. ".something.Foo"). - extName, err := p.consumeExtName() - if err != nil { - return err - } - - if s := strings.LastIndex(extName, "/"); s >= 0 { - // If it contains a slash, it's an Any type URL. - messageName := extName[s+1:] - mt := MessageType(messageName) - if mt == nil { - return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) - } - tok = p.next() - if tok.err != nil { - return tok.err - } - // consume an optional colon - if tok.value == ":" { - tok = p.next() - if tok.err != nil { - return tok.err - } - } - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - v := reflect.New(mt.Elem()) - if pe := p.readStruct(v.Elem(), terminator); pe != nil { - return pe - } - b, err := Marshal(v.Interface().(Message)) - if err != nil { - return p.errorf("failed to marshal message of type %q: %v", messageName, err) - } - if fieldSet["type_url"] { - return p.errorf(anyRepeatedlyUnpacked, "type_url") - } - if fieldSet["value"] { - return p.errorf(anyRepeatedlyUnpacked, "value") - } - sv.FieldByName("TypeUrl").SetString(extName) - sv.FieldByName("Value").SetBytes(b) - fieldSet["type_url"] = true - fieldSet["value"] = true - continue - } - - var desc *ExtensionDesc - // This could be faster, but it's functional. - // TODO: Do something smarter than a linear scan. - for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { - if d.Name == extName { - desc = d - break - } - } - if desc == nil { - return p.errorf("unrecognized extension %q", extName) - } - - props := &Properties{} - props.Parse(desc.Tag) - - typ := reflect.TypeOf(desc.ExtensionType) - if err := p.checkForColon(props, typ); err != nil { - return err - } - - rep := desc.repeated() - - // Read the extension structure, and set it in - // the value we're constructing. - var ext reflect.Value - if !rep { - ext = reflect.New(typ).Elem() - } else { - ext = reflect.New(typ.Elem()).Elem() - } - if err := p.readAny(ext, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - ep := sv.Addr().Interface().(Message) - if !rep { - SetExtension(ep, desc, ext.Interface()) - } else { - old, err := GetExtension(ep, desc) - var sl reflect.Value - if err == nil { - sl = reflect.ValueOf(old) // existing slice - } else { - sl = reflect.MakeSlice(typ, 0, 1) - } - sl = reflect.Append(sl, ext) - SetExtension(ep, desc, sl.Interface()) - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - continue - } - - // This is a normal, non-extension field. - name := tok.value - var dst reflect.Value - fi, props, ok := structFieldByName(sprops, name) - if ok { - dst = sv.Field(fi) - } else if oop, ok := sprops.OneofTypes[name]; ok { - // It is a oneof. - props = oop.Prop - nv := reflect.New(oop.Type.Elem()) - dst = nv.Elem().Field(0) - field := sv.Field(oop.Field) - if !field.IsNil() { - return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) - } - field.Set(nv) - } - if !dst.IsValid() { - return p.errorf("unknown field name %q in %v", name, st) - } - - if dst.Kind() == reflect.Map { - // Consume any colon. - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Construct the map if it doesn't already exist. - if dst.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) - } - key := reflect.New(dst.Type().Key()).Elem() - val := reflect.New(dst.Type().Elem()).Elem() - - // The map entry should be this sequence of tokens: - // < key : KEY value : VALUE > - // However, implementations may omit key or value, and technically - // we should support them in any order. See b/28924776 for a time - // this went wrong. - - tok := p.next() - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - switch tok.value { - case "key": - if err := p.consumeToken(":"); err != nil { - return err - } - if err := p.readAny(key, props.MapKeyProp); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - case "value": - if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil { - return err - } - if err := p.readAny(val, props.MapValProp); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - default: - p.back() - return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) - } - } - - dst.SetMapIndex(key, val) - continue - } - - // Check that it's not already set if it's not a repeated field. - if !props.Repeated && fieldSet[name] { - return p.errorf("non-repeated field %q was repeated", name) - } - - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Parse into the field. - fieldSet[name] = true - if err := p.readAny(dst, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - if props.Required { - reqCount-- - } - - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - - } - - if reqCount > 0 { - return p.missingRequiredFieldError(sv) - } - return reqFieldErr -} - -// consumeExtName consumes extension name or expanded Any type URL and the -// following ']'. It returns the name or URL consumed. -func (p *textParser) consumeExtName() (string, error) { - tok := p.next() - if tok.err != nil { - return "", tok.err - } - - // If extension name or type url is quoted, it's a single token. - if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { - name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) - if err != nil { - return "", err - } - return name, p.consumeToken("]") - } - - // Consume everything up to "]" - var parts []string - for tok.value != "]" { - parts = append(parts, tok.value) - tok = p.next() - if tok.err != nil { - return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) - } - if p.done && tok.value != "]" { - return "", p.errorf("unclosed type_url or extension name") - } - } - return strings.Join(parts, ""), nil -} - -// consumeOptionalSeparator consumes an optional semicolon or comma. -// It is used in readStruct to provide backward compatibility. -func (p *textParser) consumeOptionalSeparator() error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ";" && tok.value != "," { - p.back() - } - return nil -} - -func (p *textParser) readAny(v reflect.Value, props *Properties) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == "" { - return p.errorf("unexpected EOF") - } - if len(props.CustomType) > 0 { - if props.Repeated { - t := reflect.TypeOf(v.Interface()) - if t.Kind() == reflect.Slice { - tc := reflect.TypeOf(new(Marshaler)) - ok := t.Elem().Implements(tc.Elem()) - if ok { - fv := v - flen := fv.Len() - if flen == fv.Cap() { - nav := reflect.MakeSlice(v.Type(), flen, 2*flen+1) - reflect.Copy(nav, fv) - fv.Set(nav) - } - fv.SetLen(flen + 1) - - // Read one. - p.back() - return p.readAny(fv.Index(flen), props) - } - } - } - if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { - custom := reflect.New(props.ctype.Elem()).Interface().(Unmarshaler) - err := custom.Unmarshal([]byte(tok.unquoted)) - if err != nil { - return p.errorf("%v %v: %v", err, v.Type(), tok.value) - } - v.Set(reflect.ValueOf(custom)) - } else { - custom := reflect.New(reflect.TypeOf(v.Interface())).Interface().(Unmarshaler) - err := custom.Unmarshal([]byte(tok.unquoted)) - if err != nil { - return p.errorf("%v %v: %v", err, v.Type(), tok.value) - } - v.Set(reflect.Indirect(reflect.ValueOf(custom))) - } - return nil - } - if props.StdTime { - fv := v - p.back() - props.StdTime = false - tproto := ×tamp{} - err := p.readAny(reflect.ValueOf(tproto).Elem(), props) - props.StdTime = true - if err != nil { - return err - } - tim, err := timestampFromProto(tproto) - if err != nil { - return err - } - if props.Repeated { - t := reflect.TypeOf(v.Interface()) - if t.Kind() == reflect.Slice { - if t.Elem().Kind() == reflect.Ptr { - ts := fv.Interface().([]*time.Time) - ts = append(ts, &tim) - fv.Set(reflect.ValueOf(ts)) - return nil - } else { - ts := fv.Interface().([]time.Time) - ts = append(ts, tim) - fv.Set(reflect.ValueOf(ts)) - return nil - } - } - } - if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { - v.Set(reflect.ValueOf(&tim)) - } else { - v.Set(reflect.Indirect(reflect.ValueOf(&tim))) - } - return nil - } - if props.StdDuration { - fv := v - p.back() - props.StdDuration = false - dproto := &duration{} - err := p.readAny(reflect.ValueOf(dproto).Elem(), props) - props.StdDuration = true - if err != nil { - return err - } - dur, err := durationFromProto(dproto) - if err != nil { - return err - } - if props.Repeated { - t := reflect.TypeOf(v.Interface()) - if t.Kind() == reflect.Slice { - if t.Elem().Kind() == reflect.Ptr { - ds := fv.Interface().([]*time.Duration) - ds = append(ds, &dur) - fv.Set(reflect.ValueOf(ds)) - return nil - } else { - ds := fv.Interface().([]time.Duration) - ds = append(ds, dur) - fv.Set(reflect.ValueOf(ds)) - return nil - } - } - } - if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { - v.Set(reflect.ValueOf(&dur)) - } else { - v.Set(reflect.Indirect(reflect.ValueOf(&dur))) - } - return nil - } - switch fv := v; fv.Kind() { - case reflect.Slice: - at := v.Type() - if at.Elem().Kind() == reflect.Uint8 { - // Special case for []byte - if tok.value[0] != '"' && tok.value[0] != '\'' { - // Deliberately written out here, as the error after - // this switch statement would write "invalid []byte: ...", - // which is not as user-friendly. - return p.errorf("invalid string: %v", tok.value) - } - bytes := []byte(tok.unquoted) - fv.Set(reflect.ValueOf(bytes)) - return nil - } - // Repeated field. - if tok.value == "[" { - // Repeated field with list notation, like [1,2,3]. - for { - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - err := p.readAny(fv.Index(fv.Len()-1), props) - if err != nil { - return err - } - ntok := p.next() - if ntok.err != nil { - return ntok.err - } - if ntok.value == "]" { - break - } - if ntok.value != "," { - return p.errorf("Expected ']' or ',' found %q", ntok.value) - } - } - return nil - } - // One value of the repeated field. - p.back() - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - return p.readAny(fv.Index(fv.Len()-1), props) - case reflect.Bool: - // true/1/t/True or false/f/0/False. - switch tok.value { - case "true", "1", "t", "True": - fv.SetBool(true) - return nil - case "false", "0", "f", "False": - fv.SetBool(false) - return nil - } - case reflect.Float32, reflect.Float64: - v := tok.value - // Ignore 'f' for compatibility with output generated by C++, but don't - // remove 'f' when the value is "-inf" or "inf". - if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { - v = v[:len(v)-1] - } - if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { - fv.SetFloat(f) - return nil - } - case reflect.Int8: - if x, err := strconv.ParseInt(tok.value, 0, 8); err == nil { - fv.SetInt(x) - return nil - } - case reflect.Int16: - if x, err := strconv.ParseInt(tok.value, 0, 16); err == nil { - fv.SetInt(x) - return nil - } - case reflect.Int32: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - fv.SetInt(x) - return nil - } - - if len(props.Enum) == 0 { - break - } - m, ok := enumValueMaps[props.Enum] - if !ok { - break - } - x, ok := m[tok.value] - if !ok { - break - } - fv.SetInt(int64(x)) - return nil - case reflect.Int64: - if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { - fv.SetInt(x) - return nil - } - - case reflect.Ptr: - // A basic field (indirected through pointer), or a repeated message/group - p.back() - fv.Set(reflect.New(fv.Type().Elem())) - return p.readAny(fv.Elem(), props) - case reflect.String: - if tok.value[0] == '"' || tok.value[0] == '\'' { - fv.SetString(tok.unquoted) - return nil - } - case reflect.Struct: - var terminator string - switch tok.value { - case "{": - terminator = "}" - case "<": - terminator = ">" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - // TODO: Handle nested messages which implement encoding.TextUnmarshaler. - return p.readStruct(fv, terminator) - case reflect.Uint8: - if x, err := strconv.ParseUint(tok.value, 0, 8); err == nil { - fv.SetUint(x) - return nil - } - case reflect.Uint16: - if x, err := strconv.ParseUint(tok.value, 0, 16); err == nil { - fv.SetUint(x) - return nil - } - case reflect.Uint32: - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - fv.SetUint(uint64(x)) - return nil - } - case reflect.Uint64: - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - fv.SetUint(x) - return nil - } - } - return p.errorf("invalid %v: %v", v.Type(), tok.value) -} - -// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb -// before starting to unmarshal, so any existing data in pb is always removed. -// If a required field is not set and no other error occurs, -// UnmarshalText returns *RequiredNotSetError. -func UnmarshalText(s string, pb Message) error { - if um, ok := pb.(encoding.TextUnmarshaler); ok { - return um.UnmarshalText([]byte(s)) - } - pb.Reset() - v := reflect.ValueOf(pb) - return newTextParser(s).readStruct(v.Elem(), "") -} diff --git a/vendor/github.com/gogo/protobuf/proto/timestamp.go b/vendor/github.com/gogo/protobuf/proto/timestamp.go deleted file mode 100644 index 9324f6542b..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/timestamp.go +++ /dev/null @@ -1,113 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// This file implements operations on google.protobuf.Timestamp. - -import ( - "errors" - "fmt" - "time" -) - -const ( - // Seconds field of the earliest valid Timestamp. - // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). - minValidSeconds = -62135596800 - // Seconds field just after the latest valid Timestamp. - // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). - maxValidSeconds = 253402300800 -) - -// validateTimestamp determines whether a Timestamp is valid. -// A valid timestamp represents a time in the range -// [0001-01-01, 10000-01-01) and has a Nanos field -// in the range [0, 1e9). -// -// If the Timestamp is valid, validateTimestamp returns nil. -// Otherwise, it returns an error that describes -// the problem. -// -// Every valid Timestamp can be represented by a time.Time, but the converse is not true. -func validateTimestamp(ts *timestamp) error { - if ts == nil { - return errors.New("timestamp: nil Timestamp") - } - if ts.Seconds < minValidSeconds { - return fmt.Errorf("timestamp: %#v before 0001-01-01", ts) - } - if ts.Seconds >= maxValidSeconds { - return fmt.Errorf("timestamp: %#v after 10000-01-01", ts) - } - if ts.Nanos < 0 || ts.Nanos >= 1e9 { - return fmt.Errorf("timestamp: %#v: nanos not in range [0, 1e9)", ts) - } - return nil -} - -// TimestampFromProto converts a google.protobuf.Timestamp proto to a time.Time. -// It returns an error if the argument is invalid. -// -// Unlike most Go functions, if Timestamp returns an error, the first return value -// is not the zero time.Time. Instead, it is the value obtained from the -// time.Unix function when passed the contents of the Timestamp, in the UTC -// locale. This may or may not be a meaningful time; many invalid Timestamps -// do map to valid time.Times. -// -// A nil Timestamp returns an error. The first return value in that case is -// undefined. -func timestampFromProto(ts *timestamp) (time.Time, error) { - // Don't return the zero value on error, because corresponds to a valid - // timestamp. Instead return whatever time.Unix gives us. - var t time.Time - if ts == nil { - t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp - } else { - t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() - } - return t, validateTimestamp(ts) -} - -// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. -// It returns an error if the resulting Timestamp is invalid. -func timestampProto(t time.Time) (*timestamp, error) { - seconds := t.Unix() - nanos := int32(t.Sub(time.Unix(seconds, 0))) - ts := ×tamp{ - Seconds: seconds, - Nanos: nanos, - } - if err := validateTimestamp(ts); err != nil { - return nil, err - } - return ts, nil -} diff --git a/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go b/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go deleted file mode 100644 index 38439fa990..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go +++ /dev/null @@ -1,49 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2016, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "reflect" - "time" -) - -var timeType = reflect.TypeOf((*time.Time)(nil)).Elem() - -type timestamp struct { - Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` - Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` -} - -func (m *timestamp) Reset() { *m = timestamp{} } -func (*timestamp) ProtoMessage() {} -func (*timestamp) String() string { return "timestamp" } - -func init() { - RegisterType((*timestamp)(nil), "gogo.protobuf.proto.timestamp") -} diff --git a/vendor/github.com/gogo/protobuf/proto/wrappers.go b/vendor/github.com/gogo/protobuf/proto/wrappers.go deleted file mode 100644 index b175d1b642..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/wrappers.go +++ /dev/null @@ -1,1888 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2018, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "io" - "reflect" -) - -func makeStdDoubleValueMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - t := ptr.asPointerTo(u.typ).Interface().(*float64) - v := &float64Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - t := ptr.asPointerTo(u.typ).Interface().(*float64) - v := &float64Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdDoubleValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float64) - v := &float64Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float64) - v := &float64Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdDoubleValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(float64) - v := &float64Value{t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(float64) - v := &float64Value{t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdDoubleValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*float64) - v := &float64Value{*t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*float64) - v := &float64Value{*t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdDoubleValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &float64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(sub.typ).Elem() - s.Set(reflect.ValueOf(m.Value)) - return b[x:], nil - } -} - -func makeStdDoubleValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &float64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.ValueOf(&m.Value)) - return b[x:], nil - } -} - -func makeStdDoubleValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &float64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(reflect.PtrTo(sub.typ)) - newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdDoubleValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &float64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(sub.typ) - newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdFloatValueMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - t := ptr.asPointerTo(u.typ).Interface().(*float32) - v := &float32Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - t := ptr.asPointerTo(u.typ).Interface().(*float32) - v := &float32Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdFloatValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float32) - v := &float32Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float32) - v := &float32Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdFloatValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(float32) - v := &float32Value{t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(float32) - v := &float32Value{t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdFloatValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*float32) - v := &float32Value{*t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*float32) - v := &float32Value{*t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdFloatValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &float32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(sub.typ).Elem() - s.Set(reflect.ValueOf(m.Value)) - return b[x:], nil - } -} - -func makeStdFloatValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &float32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.ValueOf(&m.Value)) - return b[x:], nil - } -} - -func makeStdFloatValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &float32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(reflect.PtrTo(sub.typ)) - newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdFloatValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &float32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(sub.typ) - newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdInt64ValueMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - t := ptr.asPointerTo(u.typ).Interface().(*int64) - v := &int64Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - t := ptr.asPointerTo(u.typ).Interface().(*int64) - v := &int64Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdInt64ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int64) - v := &int64Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int64) - v := &int64Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdInt64ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(int64) - v := &int64Value{t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(int64) - v := &int64Value{t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdInt64ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*int64) - v := &int64Value{*t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*int64) - v := &int64Value{*t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdInt64ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &int64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(sub.typ).Elem() - s.Set(reflect.ValueOf(m.Value)) - return b[x:], nil - } -} - -func makeStdInt64ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &int64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.ValueOf(&m.Value)) - return b[x:], nil - } -} - -func makeStdInt64ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &int64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(reflect.PtrTo(sub.typ)) - newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdInt64ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &int64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(sub.typ) - newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdUInt64ValueMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - t := ptr.asPointerTo(u.typ).Interface().(*uint64) - v := &uint64Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - t := ptr.asPointerTo(u.typ).Interface().(*uint64) - v := &uint64Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdUInt64ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint64) - v := &uint64Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint64) - v := &uint64Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdUInt64ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(uint64) - v := &uint64Value{t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(uint64) - v := &uint64Value{t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdUInt64ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*uint64) - v := &uint64Value{*t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*uint64) - v := &uint64Value{*t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdUInt64ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &uint64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(sub.typ).Elem() - s.Set(reflect.ValueOf(m.Value)) - return b[x:], nil - } -} - -func makeStdUInt64ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &uint64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.ValueOf(&m.Value)) - return b[x:], nil - } -} - -func makeStdUInt64ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &uint64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(reflect.PtrTo(sub.typ)) - newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdUInt64ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &uint64Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(sub.typ) - newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdInt32ValueMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - t := ptr.asPointerTo(u.typ).Interface().(*int32) - v := &int32Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - t := ptr.asPointerTo(u.typ).Interface().(*int32) - v := &int32Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdInt32ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int32) - v := &int32Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int32) - v := &int32Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdInt32ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(int32) - v := &int32Value{t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(int32) - v := &int32Value{t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdInt32ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*int32) - v := &int32Value{*t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*int32) - v := &int32Value{*t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdInt32ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &int32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(sub.typ).Elem() - s.Set(reflect.ValueOf(m.Value)) - return b[x:], nil - } -} - -func makeStdInt32ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &int32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.ValueOf(&m.Value)) - return b[x:], nil - } -} - -func makeStdInt32ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &int32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(reflect.PtrTo(sub.typ)) - newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdInt32ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &int32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(sub.typ) - newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdUInt32ValueMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - t := ptr.asPointerTo(u.typ).Interface().(*uint32) - v := &uint32Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - t := ptr.asPointerTo(u.typ).Interface().(*uint32) - v := &uint32Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdUInt32ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint32) - v := &uint32Value{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint32) - v := &uint32Value{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdUInt32ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(uint32) - v := &uint32Value{t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(uint32) - v := &uint32Value{t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdUInt32ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*uint32) - v := &uint32Value{*t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*uint32) - v := &uint32Value{*t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdUInt32ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &uint32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(sub.typ).Elem() - s.Set(reflect.ValueOf(m.Value)) - return b[x:], nil - } -} - -func makeStdUInt32ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &uint32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.ValueOf(&m.Value)) - return b[x:], nil - } -} - -func makeStdUInt32ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &uint32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(reflect.PtrTo(sub.typ)) - newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdUInt32ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &uint32Value{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(sub.typ) - newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdBoolValueMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - t := ptr.asPointerTo(u.typ).Interface().(*bool) - v := &boolValue{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - t := ptr.asPointerTo(u.typ).Interface().(*bool) - v := &boolValue{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdBoolValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*bool) - v := &boolValue{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*bool) - v := &boolValue{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdBoolValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(bool) - v := &boolValue{t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(bool) - v := &boolValue{t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdBoolValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*bool) - v := &boolValue{*t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*bool) - v := &boolValue{*t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdBoolValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &boolValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(sub.typ).Elem() - s.Set(reflect.ValueOf(m.Value)) - return b[x:], nil - } -} - -func makeStdBoolValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &boolValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.ValueOf(&m.Value)) - return b[x:], nil - } -} - -func makeStdBoolValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &boolValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(reflect.PtrTo(sub.typ)) - newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdBoolValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &boolValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(sub.typ) - newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdStringValueMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - t := ptr.asPointerTo(u.typ).Interface().(*string) - v := &stringValue{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - t := ptr.asPointerTo(u.typ).Interface().(*string) - v := &stringValue{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdStringValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*string) - v := &stringValue{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*string) - v := &stringValue{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdStringValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(string) - v := &stringValue{t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(string) - v := &stringValue{t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdStringValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*string) - v := &stringValue{*t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*string) - v := &stringValue{*t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdStringValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &stringValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(sub.typ).Elem() - s.Set(reflect.ValueOf(m.Value)) - return b[x:], nil - } -} - -func makeStdStringValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &stringValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.ValueOf(&m.Value)) - return b[x:], nil - } -} - -func makeStdStringValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &stringValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(reflect.PtrTo(sub.typ)) - newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdStringValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &stringValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(sub.typ) - newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdBytesValueMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - t := ptr.asPointerTo(u.typ).Interface().(*[]byte) - v := &bytesValue{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - t := ptr.asPointerTo(u.typ).Interface().(*[]byte) - v := &bytesValue{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdBytesValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - if ptr.isNil() { - return 0 - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*[]byte) - v := &bytesValue{*t} - siz := Size(v) - return tagsize + SizeVarint(uint64(siz)) + siz - }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - if ptr.isNil() { - return b, nil - } - t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*[]byte) - v := &bytesValue{*t} - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(buf))) - b = append(b, buf...) - return b, nil - } -} - -func makeStdBytesValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(u.typ) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().([]byte) - v := &bytesValue{t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(u.typ) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().([]byte) - v := &bytesValue{t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdBytesValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - n := 0 - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*[]byte) - v := &bytesValue{*t} - siz := Size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getSlice(reflect.PtrTo(u.typ)) - for i := 0; i < s.Len(); i++ { - elem := s.Index(i) - t := elem.Interface().(*[]byte) - v := &bytesValue{*t} - siz := Size(v) - buf, err := Marshal(v) - if err != nil { - return nil, err - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(siz)) - b = append(b, buf...) - } - - return b, nil - } -} - -func makeStdBytesValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &bytesValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(sub.typ).Elem() - s.Set(reflect.ValueOf(m.Value)) - return b[x:], nil - } -} - -func makeStdBytesValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &bytesValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() - s.Set(reflect.ValueOf(&m.Value)) - return b[x:], nil - } -} - -func makeStdBytesValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &bytesValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(reflect.PtrTo(sub.typ)) - newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} - -func makeStdBytesValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return nil, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - m := &bytesValue{} - if err := Unmarshal(b[:x], m); err != nil { - return nil, err - } - slice := f.getSlice(sub.typ) - newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) - slice.Set(newSlice) - return b[x:], nil - } -} diff --git a/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go b/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go deleted file mode 100644 index c1cf7bf85e..0000000000 --- a/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go +++ /dev/null @@ -1,113 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2018, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -type float64Value struct { - Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *float64Value) Reset() { *m = float64Value{} } -func (*float64Value) ProtoMessage() {} -func (*float64Value) String() string { return "float64" } - -type float32Value struct { - Value float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *float32Value) Reset() { *m = float32Value{} } -func (*float32Value) ProtoMessage() {} -func (*float32Value) String() string { return "float32" } - -type int64Value struct { - Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *int64Value) Reset() { *m = int64Value{} } -func (*int64Value) ProtoMessage() {} -func (*int64Value) String() string { return "int64" } - -type uint64Value struct { - Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *uint64Value) Reset() { *m = uint64Value{} } -func (*uint64Value) ProtoMessage() {} -func (*uint64Value) String() string { return "uint64" } - -type int32Value struct { - Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *int32Value) Reset() { *m = int32Value{} } -func (*int32Value) ProtoMessage() {} -func (*int32Value) String() string { return "int32" } - -type uint32Value struct { - Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *uint32Value) Reset() { *m = uint32Value{} } -func (*uint32Value) ProtoMessage() {} -func (*uint32Value) String() string { return "uint32" } - -type boolValue struct { - Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *boolValue) Reset() { *m = boolValue{} } -func (*boolValue) ProtoMessage() {} -func (*boolValue) String() string { return "bool" } - -type stringValue struct { - Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *stringValue) Reset() { *m = stringValue{} } -func (*stringValue) ProtoMessage() {} -func (*stringValue) String() string { return "string" } - -type bytesValue struct { - Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` -} - -func (m *bytesValue) Reset() { *m = bytesValue{} } -func (*bytesValue) ProtoMessage() {} -func (*bytesValue) String() string { return "[]byte" } - -func init() { - RegisterType((*float64Value)(nil), "gogo.protobuf.proto.DoubleValue") - RegisterType((*float32Value)(nil), "gogo.protobuf.proto.FloatValue") - RegisterType((*int64Value)(nil), "gogo.protobuf.proto.Int64Value") - RegisterType((*uint64Value)(nil), "gogo.protobuf.proto.UInt64Value") - RegisterType((*int32Value)(nil), "gogo.protobuf.proto.Int32Value") - RegisterType((*uint32Value)(nil), "gogo.protobuf.proto.UInt32Value") - RegisterType((*boolValue)(nil), "gogo.protobuf.proto.BoolValue") - RegisterType((*stringValue)(nil), "gogo.protobuf.proto.StringValue") - RegisterType((*bytesValue)(nil), "gogo.protobuf.proto.BytesValue") -} diff --git a/vendor/github.com/golang/glog/LICENSE b/vendor/github.com/golang/glog/LICENSE deleted file mode 100644 index 37ec93a14f..0000000000 --- a/vendor/github.com/golang/glog/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/golang/glog/README b/vendor/github.com/golang/glog/README deleted file mode 100644 index 387b4eb689..0000000000 --- a/vendor/github.com/golang/glog/README +++ /dev/null @@ -1,44 +0,0 @@ -glog -==== - -Leveled execution logs for Go. - -This is an efficient pure Go implementation of leveled logs in the -manner of the open source C++ package - https://github.com/google/glog - -By binding methods to booleans it is possible to use the log package -without paying the expense of evaluating the arguments to the log. -Through the -vmodule flag, the package also provides fine-grained -control over logging at the file level. - -The comment from glog.go introduces the ideas: - - Package glog implements logging analogous to the Google-internal - C++ INFO/ERROR/V setup. It provides functions Info, Warning, - Error, Fatal, plus formatting variants such as Infof. It - also provides V-style logging controlled by the -v and - -vmodule=file=2 flags. - - Basic examples: - - glog.Info("Prepare to repel boarders") - - glog.Fatalf("Initialization failed: %s", err) - - See the documentation for the V function for an explanation - of these examples: - - if glog.V(2) { - glog.Info("Starting transaction...") - } - - glog.V(2).Infoln("Processed", nItems, "elements") - - -The repository contains an open source version of the log package -used inside Google. The master copy of the source lives inside -Google, not here. The code in this repo is for export only and is not itself -under development. Feature requests will be ignored. - -Send bug reports to golang-nuts@googlegroups.com. diff --git a/vendor/github.com/golang/glog/glog.go b/vendor/github.com/golang/glog/glog.go deleted file mode 100644 index 54bd7afdca..0000000000 --- a/vendor/github.com/golang/glog/glog.go +++ /dev/null @@ -1,1180 +0,0 @@ -// Go support for leveled logs, analogous to https://code.google.com/p/google-glog/ -// -// Copyright 2013 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package glog implements logging analogous to the Google-internal C++ INFO/ERROR/V setup. -// It provides functions Info, Warning, Error, Fatal, plus formatting variants such as -// Infof. It also provides V-style logging controlled by the -v and -vmodule=file=2 flags. -// -// Basic examples: -// -// glog.Info("Prepare to repel boarders") -// -// glog.Fatalf("Initialization failed: %s", err) -// -// See the documentation for the V function for an explanation of these examples: -// -// if glog.V(2) { -// glog.Info("Starting transaction...") -// } -// -// glog.V(2).Infoln("Processed", nItems, "elements") -// -// Log output is buffered and written periodically using Flush. Programs -// should call Flush before exiting to guarantee all log output is written. -// -// By default, all log statements write to files in a temporary directory. -// This package provides several flags that modify this behavior. -// As a result, flag.Parse must be called before any logging is done. -// -// -logtostderr=false -// Logs are written to standard error instead of to files. -// -alsologtostderr=false -// Logs are written to standard error as well as to files. -// -stderrthreshold=ERROR -// Log events at or above this severity are logged to standard -// error as well as to files. -// -log_dir="" -// Log files will be written to this directory instead of the -// default temporary directory. -// -// Other flags provide aids to debugging. -// -// -log_backtrace_at="" -// When set to a file and line number holding a logging statement, -// such as -// -log_backtrace_at=gopherflakes.go:234 -// a stack trace will be written to the Info log whenever execution -// hits that statement. (Unlike with -vmodule, the ".go" must be -// present.) -// -v=0 -// Enable V-leveled logging at the specified level. -// -vmodule="" -// The syntax of the argument is a comma-separated list of pattern=N, -// where pattern is a literal file name (minus the ".go" suffix) or -// "glob" pattern and N is a V level. For instance, -// -vmodule=gopher*=3 -// sets the V level to 3 in all Go files whose names begin "gopher". -// -package glog - -import ( - "bufio" - "bytes" - "errors" - "flag" - "fmt" - "io" - stdLog "log" - "os" - "path/filepath" - "runtime" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" -) - -// severity identifies the sort of log: info, warning etc. It also implements -// the flag.Value interface. The -stderrthreshold flag is of type severity and -// should be modified only through the flag.Value interface. The values match -// the corresponding constants in C++. -type severity int32 // sync/atomic int32 - -// These constants identify the log levels in order of increasing severity. -// A message written to a high-severity log file is also written to each -// lower-severity log file. -const ( - infoLog severity = iota - warningLog - errorLog - fatalLog - numSeverity = 4 -) - -const severityChar = "IWEF" - -var severityName = []string{ - infoLog: "INFO", - warningLog: "WARNING", - errorLog: "ERROR", - fatalLog: "FATAL", -} - -// get returns the value of the severity. -func (s *severity) get() severity { - return severity(atomic.LoadInt32((*int32)(s))) -} - -// set sets the value of the severity. -func (s *severity) set(val severity) { - atomic.StoreInt32((*int32)(s), int32(val)) -} - -// String is part of the flag.Value interface. -func (s *severity) String() string { - return strconv.FormatInt(int64(*s), 10) -} - -// Get is part of the flag.Value interface. -func (s *severity) Get() interface{} { - return *s -} - -// Set is part of the flag.Value interface. -func (s *severity) Set(value string) error { - var threshold severity - // Is it a known name? - if v, ok := severityByName(value); ok { - threshold = v - } else { - v, err := strconv.Atoi(value) - if err != nil { - return err - } - threshold = severity(v) - } - logging.stderrThreshold.set(threshold) - return nil -} - -func severityByName(s string) (severity, bool) { - s = strings.ToUpper(s) - for i, name := range severityName { - if name == s { - return severity(i), true - } - } - return 0, false -} - -// OutputStats tracks the number of output lines and bytes written. -type OutputStats struct { - lines int64 - bytes int64 -} - -// Lines returns the number of lines written. -func (s *OutputStats) Lines() int64 { - return atomic.LoadInt64(&s.lines) -} - -// Bytes returns the number of bytes written. -func (s *OutputStats) Bytes() int64 { - return atomic.LoadInt64(&s.bytes) -} - -// Stats tracks the number of lines of output and number of bytes -// per severity level. Values must be read with atomic.LoadInt64. -var Stats struct { - Info, Warning, Error OutputStats -} - -var severityStats = [numSeverity]*OutputStats{ - infoLog: &Stats.Info, - warningLog: &Stats.Warning, - errorLog: &Stats.Error, -} - -// Level is exported because it appears in the arguments to V and is -// the type of the v flag, which can be set programmatically. -// It's a distinct type because we want to discriminate it from logType. -// Variables of type level are only changed under logging.mu. -// The -v flag is read only with atomic ops, so the state of the logging -// module is consistent. - -// Level is treated as a sync/atomic int32. - -// Level specifies a level of verbosity for V logs. *Level implements -// flag.Value; the -v flag is of type Level and should be modified -// only through the flag.Value interface. -type Level int32 - -// get returns the value of the Level. -func (l *Level) get() Level { - return Level(atomic.LoadInt32((*int32)(l))) -} - -// set sets the value of the Level. -func (l *Level) set(val Level) { - atomic.StoreInt32((*int32)(l), int32(val)) -} - -// String is part of the flag.Value interface. -func (l *Level) String() string { - return strconv.FormatInt(int64(*l), 10) -} - -// Get is part of the flag.Value interface. -func (l *Level) Get() interface{} { - return *l -} - -// Set is part of the flag.Value interface. -func (l *Level) Set(value string) error { - v, err := strconv.Atoi(value) - if err != nil { - return err - } - logging.mu.Lock() - defer logging.mu.Unlock() - logging.setVState(Level(v), logging.vmodule.filter, false) - return nil -} - -// moduleSpec represents the setting of the -vmodule flag. -type moduleSpec struct { - filter []modulePat -} - -// modulePat contains a filter for the -vmodule flag. -// It holds a verbosity level and a file pattern to match. -type modulePat struct { - pattern string - literal bool // The pattern is a literal string - level Level -} - -// match reports whether the file matches the pattern. It uses a string -// comparison if the pattern contains no metacharacters. -func (m *modulePat) match(file string) bool { - if m.literal { - return file == m.pattern - } - match, _ := filepath.Match(m.pattern, file) - return match -} - -func (m *moduleSpec) String() string { - // Lock because the type is not atomic. TODO: clean this up. - logging.mu.Lock() - defer logging.mu.Unlock() - var b bytes.Buffer - for i, f := range m.filter { - if i > 0 { - b.WriteRune(',') - } - fmt.Fprintf(&b, "%s=%d", f.pattern, f.level) - } - return b.String() -} - -// Get is part of the (Go 1.2) flag.Getter interface. It always returns nil for this flag type since the -// struct is not exported. -func (m *moduleSpec) Get() interface{} { - return nil -} - -var errVmoduleSyntax = errors.New("syntax error: expect comma-separated list of filename=N") - -// Syntax: -vmodule=recordio=2,file=1,gfs*=3 -func (m *moduleSpec) Set(value string) error { - var filter []modulePat - for _, pat := range strings.Split(value, ",") { - if len(pat) == 0 { - // Empty strings such as from a trailing comma can be ignored. - continue - } - patLev := strings.Split(pat, "=") - if len(patLev) != 2 || len(patLev[0]) == 0 || len(patLev[1]) == 0 { - return errVmoduleSyntax - } - pattern := patLev[0] - v, err := strconv.Atoi(patLev[1]) - if err != nil { - return errors.New("syntax error: expect comma-separated list of filename=N") - } - if v < 0 { - return errors.New("negative value for vmodule level") - } - if v == 0 { - continue // Ignore. It's harmless but no point in paying the overhead. - } - // TODO: check syntax of filter? - filter = append(filter, modulePat{pattern, isLiteral(pattern), Level(v)}) - } - logging.mu.Lock() - defer logging.mu.Unlock() - logging.setVState(logging.verbosity, filter, true) - return nil -} - -// isLiteral reports whether the pattern is a literal string, that is, has no metacharacters -// that require filepath.Match to be called to match the pattern. -func isLiteral(pattern string) bool { - return !strings.ContainsAny(pattern, `\*?[]`) -} - -// traceLocation represents the setting of the -log_backtrace_at flag. -type traceLocation struct { - file string - line int -} - -// isSet reports whether the trace location has been specified. -// logging.mu is held. -func (t *traceLocation) isSet() bool { - return t.line > 0 -} - -// match reports whether the specified file and line matches the trace location. -// The argument file name is the full path, not the basename specified in the flag. -// logging.mu is held. -func (t *traceLocation) match(file string, line int) bool { - if t.line != line { - return false - } - if i := strings.LastIndex(file, "/"); i >= 0 { - file = file[i+1:] - } - return t.file == file -} - -func (t *traceLocation) String() string { - // Lock because the type is not atomic. TODO: clean this up. - logging.mu.Lock() - defer logging.mu.Unlock() - return fmt.Sprintf("%s:%d", t.file, t.line) -} - -// Get is part of the (Go 1.2) flag.Getter interface. It always returns nil for this flag type since the -// struct is not exported -func (t *traceLocation) Get() interface{} { - return nil -} - -var errTraceSyntax = errors.New("syntax error: expect file.go:234") - -// Syntax: -log_backtrace_at=gopherflakes.go:234 -// Note that unlike vmodule the file extension is included here. -func (t *traceLocation) Set(value string) error { - if value == "" { - // Unset. - t.line = 0 - t.file = "" - } - fields := strings.Split(value, ":") - if len(fields) != 2 { - return errTraceSyntax - } - file, line := fields[0], fields[1] - if !strings.Contains(file, ".") { - return errTraceSyntax - } - v, err := strconv.Atoi(line) - if err != nil { - return errTraceSyntax - } - if v <= 0 { - return errors.New("negative or zero value for level") - } - logging.mu.Lock() - defer logging.mu.Unlock() - t.line = v - t.file = file - return nil -} - -// flushSyncWriter is the interface satisfied by logging destinations. -type flushSyncWriter interface { - Flush() error - Sync() error - io.Writer -} - -func init() { - flag.BoolVar(&logging.toStderr, "logtostderr", false, "log to standard error instead of files") - flag.BoolVar(&logging.alsoToStderr, "alsologtostderr", false, "log to standard error as well as files") - flag.Var(&logging.verbosity, "v", "log level for V logs") - flag.Var(&logging.stderrThreshold, "stderrthreshold", "logs at or above this threshold go to stderr") - flag.Var(&logging.vmodule, "vmodule", "comma-separated list of pattern=N settings for file-filtered logging") - flag.Var(&logging.traceLocation, "log_backtrace_at", "when logging hits line file:N, emit a stack trace") - - // Default stderrThreshold is ERROR. - logging.stderrThreshold = errorLog - - logging.setVState(0, nil, false) - go logging.flushDaemon() -} - -// Flush flushes all pending log I/O. -func Flush() { - logging.lockAndFlushAll() -} - -// loggingT collects all the global state of the logging setup. -type loggingT struct { - // Boolean flags. Not handled atomically because the flag.Value interface - // does not let us avoid the =true, and that shorthand is necessary for - // compatibility. TODO: does this matter enough to fix? Seems unlikely. - toStderr bool // The -logtostderr flag. - alsoToStderr bool // The -alsologtostderr flag. - - // Level flag. Handled atomically. - stderrThreshold severity // The -stderrthreshold flag. - - // freeList is a list of byte buffers, maintained under freeListMu. - freeList *buffer - // freeListMu maintains the free list. It is separate from the main mutex - // so buffers can be grabbed and printed to without holding the main lock, - // for better parallelization. - freeListMu sync.Mutex - - // mu protects the remaining elements of this structure and is - // used to synchronize logging. - mu sync.Mutex - // file holds writer for each of the log types. - file [numSeverity]flushSyncWriter - // pcs is used in V to avoid an allocation when computing the caller's PC. - pcs [1]uintptr - // vmap is a cache of the V Level for each V() call site, identified by PC. - // It is wiped whenever the vmodule flag changes state. - vmap map[uintptr]Level - // filterLength stores the length of the vmodule filter chain. If greater - // than zero, it means vmodule is enabled. It may be read safely - // using sync.LoadInt32, but is only modified under mu. - filterLength int32 - // traceLocation is the state of the -log_backtrace_at flag. - traceLocation traceLocation - // These flags are modified only under lock, although verbosity may be fetched - // safely using atomic.LoadInt32. - vmodule moduleSpec // The state of the -vmodule flag. - verbosity Level // V logging level, the value of the -v flag/ -} - -// buffer holds a byte Buffer for reuse. The zero value is ready for use. -type buffer struct { - bytes.Buffer - tmp [64]byte // temporary byte array for creating headers. - next *buffer -} - -var logging loggingT - -// setVState sets a consistent state for V logging. -// l.mu is held. -func (l *loggingT) setVState(verbosity Level, filter []modulePat, setFilter bool) { - // Turn verbosity off so V will not fire while we are in transition. - logging.verbosity.set(0) - // Ditto for filter length. - atomic.StoreInt32(&logging.filterLength, 0) - - // Set the new filters and wipe the pc->Level map if the filter has changed. - if setFilter { - logging.vmodule.filter = filter - logging.vmap = make(map[uintptr]Level) - } - - // Things are consistent now, so enable filtering and verbosity. - // They are enabled in order opposite to that in V. - atomic.StoreInt32(&logging.filterLength, int32(len(filter))) - logging.verbosity.set(verbosity) -} - -// getBuffer returns a new, ready-to-use buffer. -func (l *loggingT) getBuffer() *buffer { - l.freeListMu.Lock() - b := l.freeList - if b != nil { - l.freeList = b.next - } - l.freeListMu.Unlock() - if b == nil { - b = new(buffer) - } else { - b.next = nil - b.Reset() - } - return b -} - -// putBuffer returns a buffer to the free list. -func (l *loggingT) putBuffer(b *buffer) { - if b.Len() >= 256 { - // Let big buffers die a natural death. - return - } - l.freeListMu.Lock() - b.next = l.freeList - l.freeList = b - l.freeListMu.Unlock() -} - -var timeNow = time.Now // Stubbed out for testing. - -/* -header formats a log header as defined by the C++ implementation. -It returns a buffer containing the formatted header and the user's file and line number. -The depth specifies how many stack frames above lives the source line to be identified in the log message. - -Log lines have this form: - Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg... -where the fields are defined as follows: - L A single character, representing the log level (eg 'I' for INFO) - mm The month (zero padded; ie May is '05') - dd The day (zero padded) - hh:mm:ss.uuuuuu Time in hours, minutes and fractional seconds - threadid The space-padded thread ID as returned by GetTID() - file The file name - line The line number - msg The user-supplied message -*/ -func (l *loggingT) header(s severity, depth int) (*buffer, string, int) { - _, file, line, ok := runtime.Caller(3 + depth) - if !ok { - file = "???" - line = 1 - } else { - slash := strings.LastIndex(file, "/") - if slash >= 0 { - file = file[slash+1:] - } - } - return l.formatHeader(s, file, line), file, line -} - -// formatHeader formats a log header using the provided file name and line number. -func (l *loggingT) formatHeader(s severity, file string, line int) *buffer { - now := timeNow() - if line < 0 { - line = 0 // not a real line number, but acceptable to someDigits - } - if s > fatalLog { - s = infoLog // for safety. - } - buf := l.getBuffer() - - // Avoid Fprintf, for speed. The format is so simple that we can do it quickly by hand. - // It's worth about 3X. Fprintf is hard. - _, month, day := now.Date() - hour, minute, second := now.Clock() - // Lmmdd hh:mm:ss.uuuuuu threadid file:line] - buf.tmp[0] = severityChar[s] - buf.twoDigits(1, int(month)) - buf.twoDigits(3, day) - buf.tmp[5] = ' ' - buf.twoDigits(6, hour) - buf.tmp[8] = ':' - buf.twoDigits(9, minute) - buf.tmp[11] = ':' - buf.twoDigits(12, second) - buf.tmp[14] = '.' - buf.nDigits(6, 15, now.Nanosecond()/1000, '0') - buf.tmp[21] = ' ' - buf.nDigits(7, 22, pid, ' ') // TODO: should be TID - buf.tmp[29] = ' ' - buf.Write(buf.tmp[:30]) - buf.WriteString(file) - buf.tmp[0] = ':' - n := buf.someDigits(1, line) - buf.tmp[n+1] = ']' - buf.tmp[n+2] = ' ' - buf.Write(buf.tmp[:n+3]) - return buf -} - -// Some custom tiny helper functions to print the log header efficiently. - -const digits = "0123456789" - -// twoDigits formats a zero-prefixed two-digit integer at buf.tmp[i]. -func (buf *buffer) twoDigits(i, d int) { - buf.tmp[i+1] = digits[d%10] - d /= 10 - buf.tmp[i] = digits[d%10] -} - -// nDigits formats an n-digit integer at buf.tmp[i], -// padding with pad on the left. -// It assumes d >= 0. -func (buf *buffer) nDigits(n, i, d int, pad byte) { - j := n - 1 - for ; j >= 0 && d > 0; j-- { - buf.tmp[i+j] = digits[d%10] - d /= 10 - } - for ; j >= 0; j-- { - buf.tmp[i+j] = pad - } -} - -// someDigits formats a zero-prefixed variable-width integer at buf.tmp[i]. -func (buf *buffer) someDigits(i, d int) int { - // Print into the top, then copy down. We know there's space for at least - // a 10-digit number. - j := len(buf.tmp) - for { - j-- - buf.tmp[j] = digits[d%10] - d /= 10 - if d == 0 { - break - } - } - return copy(buf.tmp[i:], buf.tmp[j:]) -} - -func (l *loggingT) println(s severity, args ...interface{}) { - buf, file, line := l.header(s, 0) - fmt.Fprintln(buf, args...) - l.output(s, buf, file, line, false) -} - -func (l *loggingT) print(s severity, args ...interface{}) { - l.printDepth(s, 1, args...) -} - -func (l *loggingT) printDepth(s severity, depth int, args ...interface{}) { - buf, file, line := l.header(s, depth) - fmt.Fprint(buf, args...) - if buf.Bytes()[buf.Len()-1] != '\n' { - buf.WriteByte('\n') - } - l.output(s, buf, file, line, false) -} - -func (l *loggingT) printf(s severity, format string, args ...interface{}) { - buf, file, line := l.header(s, 0) - fmt.Fprintf(buf, format, args...) - if buf.Bytes()[buf.Len()-1] != '\n' { - buf.WriteByte('\n') - } - l.output(s, buf, file, line, false) -} - -// printWithFileLine behaves like print but uses the provided file and line number. If -// alsoLogToStderr is true, the log message always appears on standard error; it -// will also appear in the log file unless --logtostderr is set. -func (l *loggingT) printWithFileLine(s severity, file string, line int, alsoToStderr bool, args ...interface{}) { - buf := l.formatHeader(s, file, line) - fmt.Fprint(buf, args...) - if buf.Bytes()[buf.Len()-1] != '\n' { - buf.WriteByte('\n') - } - l.output(s, buf, file, line, alsoToStderr) -} - -// output writes the data to the log files and releases the buffer. -func (l *loggingT) output(s severity, buf *buffer, file string, line int, alsoToStderr bool) { - l.mu.Lock() - if l.traceLocation.isSet() { - if l.traceLocation.match(file, line) { - buf.Write(stacks(false)) - } - } - data := buf.Bytes() - if !flag.Parsed() { - os.Stderr.Write([]byte("ERROR: logging before flag.Parse: ")) - os.Stderr.Write(data) - } else if l.toStderr { - os.Stderr.Write(data) - } else { - if alsoToStderr || l.alsoToStderr || s >= l.stderrThreshold.get() { - os.Stderr.Write(data) - } - if l.file[s] == nil { - if err := l.createFiles(s); err != nil { - os.Stderr.Write(data) // Make sure the message appears somewhere. - l.exit(err) - } - } - switch s { - case fatalLog: - l.file[fatalLog].Write(data) - fallthrough - case errorLog: - l.file[errorLog].Write(data) - fallthrough - case warningLog: - l.file[warningLog].Write(data) - fallthrough - case infoLog: - l.file[infoLog].Write(data) - } - } - if s == fatalLog { - // If we got here via Exit rather than Fatal, print no stacks. - if atomic.LoadUint32(&fatalNoStacks) > 0 { - l.mu.Unlock() - timeoutFlush(10 * time.Second) - os.Exit(1) - } - // Dump all goroutine stacks before exiting. - // First, make sure we see the trace for the current goroutine on standard error. - // If -logtostderr has been specified, the loop below will do that anyway - // as the first stack in the full dump. - if !l.toStderr { - os.Stderr.Write(stacks(false)) - } - // Write the stack trace for all goroutines to the files. - trace := stacks(true) - logExitFunc = func(error) {} // If we get a write error, we'll still exit below. - for log := fatalLog; log >= infoLog; log-- { - if f := l.file[log]; f != nil { // Can be nil if -logtostderr is set. - f.Write(trace) - } - } - l.mu.Unlock() - timeoutFlush(10 * time.Second) - os.Exit(255) // C++ uses -1, which is silly because it's anded with 255 anyway. - } - l.putBuffer(buf) - l.mu.Unlock() - if stats := severityStats[s]; stats != nil { - atomic.AddInt64(&stats.lines, 1) - atomic.AddInt64(&stats.bytes, int64(len(data))) - } -} - -// timeoutFlush calls Flush and returns when it completes or after timeout -// elapses, whichever happens first. This is needed because the hooks invoked -// by Flush may deadlock when glog.Fatal is called from a hook that holds -// a lock. -func timeoutFlush(timeout time.Duration) { - done := make(chan bool, 1) - go func() { - Flush() // calls logging.lockAndFlushAll() - done <- true - }() - select { - case <-done: - case <-time.After(timeout): - fmt.Fprintln(os.Stderr, "glog: Flush took longer than", timeout) - } -} - -// stacks is a wrapper for runtime.Stack that attempts to recover the data for all goroutines. -func stacks(all bool) []byte { - // We don't know how big the traces are, so grow a few times if they don't fit. Start large, though. - n := 10000 - if all { - n = 100000 - } - var trace []byte - for i := 0; i < 5; i++ { - trace = make([]byte, n) - nbytes := runtime.Stack(trace, all) - if nbytes < len(trace) { - return trace[:nbytes] - } - n *= 2 - } - return trace -} - -// logExitFunc provides a simple mechanism to override the default behavior -// of exiting on error. Used in testing and to guarantee we reach a required exit -// for fatal logs. Instead, exit could be a function rather than a method but that -// would make its use clumsier. -var logExitFunc func(error) - -// exit is called if there is trouble creating or writing log files. -// It flushes the logs and exits the program; there's no point in hanging around. -// l.mu is held. -func (l *loggingT) exit(err error) { - fmt.Fprintf(os.Stderr, "log: exiting because of error: %s\n", err) - // If logExitFunc is set, we do that instead of exiting. - if logExitFunc != nil { - logExitFunc(err) - return - } - l.flushAll() - os.Exit(2) -} - -// syncBuffer joins a bufio.Writer to its underlying file, providing access to the -// file's Sync method and providing a wrapper for the Write method that provides log -// file rotation. There are conflicting methods, so the file cannot be embedded. -// l.mu is held for all its methods. -type syncBuffer struct { - logger *loggingT - *bufio.Writer - file *os.File - sev severity - nbytes uint64 // The number of bytes written to this file -} - -func (sb *syncBuffer) Sync() error { - return sb.file.Sync() -} - -func (sb *syncBuffer) Write(p []byte) (n int, err error) { - if sb.nbytes+uint64(len(p)) >= MaxSize { - if err := sb.rotateFile(time.Now()); err != nil { - sb.logger.exit(err) - } - } - n, err = sb.Writer.Write(p) - sb.nbytes += uint64(n) - if err != nil { - sb.logger.exit(err) - } - return -} - -// rotateFile closes the syncBuffer's file and starts a new one. -func (sb *syncBuffer) rotateFile(now time.Time) error { - if sb.file != nil { - sb.Flush() - sb.file.Close() - } - var err error - sb.file, _, err = create(severityName[sb.sev], now) - sb.nbytes = 0 - if err != nil { - return err - } - - sb.Writer = bufio.NewWriterSize(sb.file, bufferSize) - - // Write header. - var buf bytes.Buffer - fmt.Fprintf(&buf, "Log file created at: %s\n", now.Format("2006/01/02 15:04:05")) - fmt.Fprintf(&buf, "Running on machine: %s\n", host) - fmt.Fprintf(&buf, "Binary: Built with %s %s for %s/%s\n", runtime.Compiler, runtime.Version(), runtime.GOOS, runtime.GOARCH) - fmt.Fprintf(&buf, "Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg\n") - n, err := sb.file.Write(buf.Bytes()) - sb.nbytes += uint64(n) - return err -} - -// bufferSize sizes the buffer associated with each log file. It's large -// so that log records can accumulate without the logging thread blocking -// on disk I/O. The flushDaemon will block instead. -const bufferSize = 256 * 1024 - -// createFiles creates all the log files for severity from sev down to infoLog. -// l.mu is held. -func (l *loggingT) createFiles(sev severity) error { - now := time.Now() - // Files are created in decreasing severity order, so as soon as we find one - // has already been created, we can stop. - for s := sev; s >= infoLog && l.file[s] == nil; s-- { - sb := &syncBuffer{ - logger: l, - sev: s, - } - if err := sb.rotateFile(now); err != nil { - return err - } - l.file[s] = sb - } - return nil -} - -const flushInterval = 30 * time.Second - -// flushDaemon periodically flushes the log file buffers. -func (l *loggingT) flushDaemon() { - for _ = range time.NewTicker(flushInterval).C { - l.lockAndFlushAll() - } -} - -// lockAndFlushAll is like flushAll but locks l.mu first. -func (l *loggingT) lockAndFlushAll() { - l.mu.Lock() - l.flushAll() - l.mu.Unlock() -} - -// flushAll flushes all the logs and attempts to "sync" their data to disk. -// l.mu is held. -func (l *loggingT) flushAll() { - // Flush from fatal down, in case there's trouble flushing. - for s := fatalLog; s >= infoLog; s-- { - file := l.file[s] - if file != nil { - file.Flush() // ignore error - file.Sync() // ignore error - } - } -} - -// CopyStandardLogTo arranges for messages written to the Go "log" package's -// default logs to also appear in the Google logs for the named and lower -// severities. Subsequent changes to the standard log's default output location -// or format may break this behavior. -// -// Valid names are "INFO", "WARNING", "ERROR", and "FATAL". If the name is not -// recognized, CopyStandardLogTo panics. -func CopyStandardLogTo(name string) { - sev, ok := severityByName(name) - if !ok { - panic(fmt.Sprintf("log.CopyStandardLogTo(%q): unrecognized severity name", name)) - } - // Set a log format that captures the user's file and line: - // d.go:23: message - stdLog.SetFlags(stdLog.Lshortfile) - stdLog.SetOutput(logBridge(sev)) -} - -// logBridge provides the Write method that enables CopyStandardLogTo to connect -// Go's standard logs to the logs provided by this package. -type logBridge severity - -// Write parses the standard logging line and passes its components to the -// logger for severity(lb). -func (lb logBridge) Write(b []byte) (n int, err error) { - var ( - file = "???" - line = 1 - text string - ) - // Split "d.go:23: message" into "d.go", "23", and "message". - if parts := bytes.SplitN(b, []byte{':'}, 3); len(parts) != 3 || len(parts[0]) < 1 || len(parts[2]) < 1 { - text = fmt.Sprintf("bad log format: %s", b) - } else { - file = string(parts[0]) - text = string(parts[2][1:]) // skip leading space - line, err = strconv.Atoi(string(parts[1])) - if err != nil { - text = fmt.Sprintf("bad line number: %s", b) - line = 1 - } - } - // printWithFileLine with alsoToStderr=true, so standard log messages - // always appear on standard error. - logging.printWithFileLine(severity(lb), file, line, true, text) - return len(b), nil -} - -// setV computes and remembers the V level for a given PC -// when vmodule is enabled. -// File pattern matching takes the basename of the file, stripped -// of its .go suffix, and uses filepath.Match, which is a little more -// general than the *? matching used in C++. -// l.mu is held. -func (l *loggingT) setV(pc uintptr) Level { - fn := runtime.FuncForPC(pc) - file, _ := fn.FileLine(pc) - // The file is something like /a/b/c/d.go. We want just the d. - if strings.HasSuffix(file, ".go") { - file = file[:len(file)-3] - } - if slash := strings.LastIndex(file, "/"); slash >= 0 { - file = file[slash+1:] - } - for _, filter := range l.vmodule.filter { - if filter.match(file) { - l.vmap[pc] = filter.level - return filter.level - } - } - l.vmap[pc] = 0 - return 0 -} - -// Verbose is a boolean type that implements Infof (like Printf) etc. -// See the documentation of V for more information. -type Verbose bool - -// V reports whether verbosity at the call site is at least the requested level. -// The returned value is a boolean of type Verbose, which implements Info, Infoln -// and Infof. These methods will write to the Info log if called. -// Thus, one may write either -// if glog.V(2) { glog.Info("log this") } -// or -// glog.V(2).Info("log this") -// The second form is shorter but the first is cheaper if logging is off because it does -// not evaluate its arguments. -// -// Whether an individual call to V generates a log record depends on the setting of -// the -v and --vmodule flags; both are off by default. If the level in the call to -// V is at least the value of -v, or of -vmodule for the source file containing the -// call, the V call will log. -func V(level Level) Verbose { - // This function tries hard to be cheap unless there's work to do. - // The fast path is two atomic loads and compares. - - // Here is a cheap but safe test to see if V logging is enabled globally. - if logging.verbosity.get() >= level { - return Verbose(true) - } - - // It's off globally but it vmodule may still be set. - // Here is another cheap but safe test to see if vmodule is enabled. - if atomic.LoadInt32(&logging.filterLength) > 0 { - // Now we need a proper lock to use the logging structure. The pcs field - // is shared so we must lock before accessing it. This is fairly expensive, - // but if V logging is enabled we're slow anyway. - logging.mu.Lock() - defer logging.mu.Unlock() - if runtime.Callers(2, logging.pcs[:]) == 0 { - return Verbose(false) - } - v, ok := logging.vmap[logging.pcs[0]] - if !ok { - v = logging.setV(logging.pcs[0]) - } - return Verbose(v >= level) - } - return Verbose(false) -} - -// Info is equivalent to the global Info function, guarded by the value of v. -// See the documentation of V for usage. -func (v Verbose) Info(args ...interface{}) { - if v { - logging.print(infoLog, args...) - } -} - -// Infoln is equivalent to the global Infoln function, guarded by the value of v. -// See the documentation of V for usage. -func (v Verbose) Infoln(args ...interface{}) { - if v { - logging.println(infoLog, args...) - } -} - -// Infof is equivalent to the global Infof function, guarded by the value of v. -// See the documentation of V for usage. -func (v Verbose) Infof(format string, args ...interface{}) { - if v { - logging.printf(infoLog, format, args...) - } -} - -// Info logs to the INFO log. -// Arguments are handled in the manner of fmt.Print; a newline is appended if missing. -func Info(args ...interface{}) { - logging.print(infoLog, args...) -} - -// InfoDepth acts as Info but uses depth to determine which call frame to log. -// InfoDepth(0, "msg") is the same as Info("msg"). -func InfoDepth(depth int, args ...interface{}) { - logging.printDepth(infoLog, depth, args...) -} - -// Infoln logs to the INFO log. -// Arguments are handled in the manner of fmt.Println; a newline is appended if missing. -func Infoln(args ...interface{}) { - logging.println(infoLog, args...) -} - -// Infof logs to the INFO log. -// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing. -func Infof(format string, args ...interface{}) { - logging.printf(infoLog, format, args...) -} - -// Warning logs to the WARNING and INFO logs. -// Arguments are handled in the manner of fmt.Print; a newline is appended if missing. -func Warning(args ...interface{}) { - logging.print(warningLog, args...) -} - -// WarningDepth acts as Warning but uses depth to determine which call frame to log. -// WarningDepth(0, "msg") is the same as Warning("msg"). -func WarningDepth(depth int, args ...interface{}) { - logging.printDepth(warningLog, depth, args...) -} - -// Warningln logs to the WARNING and INFO logs. -// Arguments are handled in the manner of fmt.Println; a newline is appended if missing. -func Warningln(args ...interface{}) { - logging.println(warningLog, args...) -} - -// Warningf logs to the WARNING and INFO logs. -// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing. -func Warningf(format string, args ...interface{}) { - logging.printf(warningLog, format, args...) -} - -// Error logs to the ERROR, WARNING, and INFO logs. -// Arguments are handled in the manner of fmt.Print; a newline is appended if missing. -func Error(args ...interface{}) { - logging.print(errorLog, args...) -} - -// ErrorDepth acts as Error but uses depth to determine which call frame to log. -// ErrorDepth(0, "msg") is the same as Error("msg"). -func ErrorDepth(depth int, args ...interface{}) { - logging.printDepth(errorLog, depth, args...) -} - -// Errorln logs to the ERROR, WARNING, and INFO logs. -// Arguments are handled in the manner of fmt.Println; a newline is appended if missing. -func Errorln(args ...interface{}) { - logging.println(errorLog, args...) -} - -// Errorf logs to the ERROR, WARNING, and INFO logs. -// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing. -func Errorf(format string, args ...interface{}) { - logging.printf(errorLog, format, args...) -} - -// Fatal logs to the FATAL, ERROR, WARNING, and INFO logs, -// including a stack trace of all running goroutines, then calls os.Exit(255). -// Arguments are handled in the manner of fmt.Print; a newline is appended if missing. -func Fatal(args ...interface{}) { - logging.print(fatalLog, args...) -} - -// FatalDepth acts as Fatal but uses depth to determine which call frame to log. -// FatalDepth(0, "msg") is the same as Fatal("msg"). -func FatalDepth(depth int, args ...interface{}) { - logging.printDepth(fatalLog, depth, args...) -} - -// Fatalln logs to the FATAL, ERROR, WARNING, and INFO logs, -// including a stack trace of all running goroutines, then calls os.Exit(255). -// Arguments are handled in the manner of fmt.Println; a newline is appended if missing. -func Fatalln(args ...interface{}) { - logging.println(fatalLog, args...) -} - -// Fatalf logs to the FATAL, ERROR, WARNING, and INFO logs, -// including a stack trace of all running goroutines, then calls os.Exit(255). -// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing. -func Fatalf(format string, args ...interface{}) { - logging.printf(fatalLog, format, args...) -} - -// fatalNoStacks is non-zero if we are to exit without dumping goroutine stacks. -// It allows Exit and relatives to use the Fatal logs. -var fatalNoStacks uint32 - -// Exit logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1). -// Arguments are handled in the manner of fmt.Print; a newline is appended if missing. -func Exit(args ...interface{}) { - atomic.StoreUint32(&fatalNoStacks, 1) - logging.print(fatalLog, args...) -} - -// ExitDepth acts as Exit but uses depth to determine which call frame to log. -// ExitDepth(0, "msg") is the same as Exit("msg"). -func ExitDepth(depth int, args ...interface{}) { - atomic.StoreUint32(&fatalNoStacks, 1) - logging.printDepth(fatalLog, depth, args...) -} - -// Exitln logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1). -func Exitln(args ...interface{}) { - atomic.StoreUint32(&fatalNoStacks, 1) - logging.println(fatalLog, args...) -} - -// Exitf logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1). -// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing. -func Exitf(format string, args ...interface{}) { - atomic.StoreUint32(&fatalNoStacks, 1) - logging.printf(fatalLog, format, args...) -} diff --git a/vendor/github.com/golang/glog/glog_file.go b/vendor/github.com/golang/glog/glog_file.go deleted file mode 100644 index 65075d2811..0000000000 --- a/vendor/github.com/golang/glog/glog_file.go +++ /dev/null @@ -1,124 +0,0 @@ -// Go support for leveled logs, analogous to https://code.google.com/p/google-glog/ -// -// Copyright 2013 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// File I/O for logs. - -package glog - -import ( - "errors" - "flag" - "fmt" - "os" - "os/user" - "path/filepath" - "strings" - "sync" - "time" -) - -// MaxSize is the maximum size of a log file in bytes. -var MaxSize uint64 = 1024 * 1024 * 1800 - -// logDirs lists the candidate directories for new log files. -var logDirs []string - -// If non-empty, overrides the choice of directory in which to write logs. -// See createLogDirs for the full list of possible destinations. -var logDir = flag.String("log_dir", "", "If non-empty, write log files in this directory") - -func createLogDirs() { - if *logDir != "" { - logDirs = append(logDirs, *logDir) - } - logDirs = append(logDirs, os.TempDir()) -} - -var ( - pid = os.Getpid() - program = filepath.Base(os.Args[0]) - host = "unknownhost" - userName = "unknownuser" -) - -func init() { - h, err := os.Hostname() - if err == nil { - host = shortHostname(h) - } - - current, err := user.Current() - if err == nil { - userName = current.Username - } - - // Sanitize userName since it may contain filepath separators on Windows. - userName = strings.Replace(userName, `\`, "_", -1) -} - -// shortHostname returns its argument, truncating at the first period. -// For instance, given "www.google.com" it returns "www". -func shortHostname(hostname string) string { - if i := strings.Index(hostname, "."); i >= 0 { - return hostname[:i] - } - return hostname -} - -// logName returns a new log file name containing tag, with start time t, and -// the name for the symlink for tag. -func logName(tag string, t time.Time) (name, link string) { - name = fmt.Sprintf("%s.%s.%s.log.%s.%04d%02d%02d-%02d%02d%02d.%d", - program, - host, - userName, - tag, - t.Year(), - t.Month(), - t.Day(), - t.Hour(), - t.Minute(), - t.Second(), - pid) - return name, program + "." + tag -} - -var onceLogDirs sync.Once - -// create creates a new log file and returns the file and its filename, which -// contains tag ("INFO", "FATAL", etc.) and t. If the file is created -// successfully, create also attempts to update the symlink for that tag, ignoring -// errors. -func create(tag string, t time.Time) (f *os.File, filename string, err error) { - onceLogDirs.Do(createLogDirs) - if len(logDirs) == 0 { - return nil, "", errors.New("log: no log dirs") - } - name, link := logName(tag, t) - var lastErr error - for _, dir := range logDirs { - fname := filepath.Join(dir, name) - f, err := os.Create(fname) - if err == nil { - symlink := filepath.Join(dir, link) - os.Remove(symlink) // ignore err - os.Symlink(name, symlink) // ignore err - return f, fname, nil - } - lastErr = err - } - return nil, "", fmt.Errorf("log: cannot create log: %v", lastErr) -} diff --git a/vendor/github.com/golang/groupcache/LICENSE b/vendor/github.com/golang/groupcache/LICENSE deleted file mode 100644 index 37ec93a14f..0000000000 --- a/vendor/github.com/golang/groupcache/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/golang/groupcache/lru/lru.go b/vendor/github.com/golang/groupcache/lru/lru.go deleted file mode 100644 index eac1c7664f..0000000000 --- a/vendor/github.com/golang/groupcache/lru/lru.go +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright 2013 Google Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package lru implements an LRU cache. -package lru - -import "container/list" - -// Cache is an LRU cache. It is not safe for concurrent access. -type Cache struct { - // MaxEntries is the maximum number of cache entries before - // an item is evicted. Zero means no limit. - MaxEntries int - - // OnEvicted optionally specifies a callback function to be - // executed when an entry is purged from the cache. - OnEvicted func(key Key, value interface{}) - - ll *list.List - cache map[interface{}]*list.Element -} - -// A Key may be any value that is comparable. See http://golang.org/ref/spec#Comparison_operators -type Key interface{} - -type entry struct { - key Key - value interface{} -} - -// New creates a new Cache. -// If maxEntries is zero, the cache has no limit and it's assumed -// that eviction is done by the caller. -func New(maxEntries int) *Cache { - return &Cache{ - MaxEntries: maxEntries, - ll: list.New(), - cache: make(map[interface{}]*list.Element), - } -} - -// Add adds a value to the cache. -func (c *Cache) Add(key Key, value interface{}) { - if c.cache == nil { - c.cache = make(map[interface{}]*list.Element) - c.ll = list.New() - } - if ee, ok := c.cache[key]; ok { - c.ll.MoveToFront(ee) - ee.Value.(*entry).value = value - return - } - ele := c.ll.PushFront(&entry{key, value}) - c.cache[key] = ele - if c.MaxEntries != 0 && c.ll.Len() > c.MaxEntries { - c.RemoveOldest() - } -} - -// Get looks up a key's value from the cache. -func (c *Cache) Get(key Key) (value interface{}, ok bool) { - if c.cache == nil { - return - } - if ele, hit := c.cache[key]; hit { - c.ll.MoveToFront(ele) - return ele.Value.(*entry).value, true - } - return -} - -// Remove removes the provided key from the cache. -func (c *Cache) Remove(key Key) { - if c.cache == nil { - return - } - if ele, hit := c.cache[key]; hit { - c.removeElement(ele) - } -} - -// RemoveOldest removes the oldest item from the cache. -func (c *Cache) RemoveOldest() { - if c.cache == nil { - return - } - ele := c.ll.Back() - if ele != nil { - c.removeElement(ele) - } -} - -func (c *Cache) removeElement(e *list.Element) { - c.ll.Remove(e) - kv := e.Value.(*entry) - delete(c.cache, kv.key) - if c.OnEvicted != nil { - c.OnEvicted(kv.key, kv.value) - } -} - -// Len returns the number of items in the cache. -func (c *Cache) Len() int { - if c.cache == nil { - return 0 - } - return c.ll.Len() -} - -// Clear purges all stored items from the cache. -func (c *Cache) Clear() { - if c.OnEvicted != nil { - for _, e := range c.cache { - kv := e.Value.(*entry) - c.OnEvicted(kv.key, kv.value) - } - } - c.ll = nil - c.cache = nil -} diff --git a/vendor/github.com/golang/protobuf/AUTHORS b/vendor/github.com/golang/protobuf/AUTHORS deleted file mode 100644 index 15167cd746..0000000000 --- a/vendor/github.com/golang/protobuf/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/golang/protobuf/CONTRIBUTORS b/vendor/github.com/golang/protobuf/CONTRIBUTORS deleted file mode 100644 index 1c4577e968..0000000000 --- a/vendor/github.com/golang/protobuf/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE deleted file mode 100644 index 0f646931a4..0000000000 --- a/vendor/github.com/golang/protobuf/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/github.com/golang/protobuf/proto/buffer.go b/vendor/github.com/golang/protobuf/proto/buffer.go deleted file mode 100644 index e810e6fea1..0000000000 --- a/vendor/github.com/golang/protobuf/proto/buffer.go +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "errors" - "fmt" - - "google.golang.org/protobuf/encoding/prototext" - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - WireVarint = 0 - WireFixed32 = 5 - WireFixed64 = 1 - WireBytes = 2 - WireStartGroup = 3 - WireEndGroup = 4 -) - -// EncodeVarint returns the varint encoded bytes of v. -func EncodeVarint(v uint64) []byte { - return protowire.AppendVarint(nil, v) -} - -// SizeVarint returns the length of the varint encoded bytes of v. -// This is equal to len(EncodeVarint(v)). -func SizeVarint(v uint64) int { - return protowire.SizeVarint(v) -} - -// DecodeVarint parses a varint encoded integer from b, -// returning the integer value and the length of the varint. -// It returns (0, 0) if there is a parse error. -func DecodeVarint(b []byte) (uint64, int) { - v, n := protowire.ConsumeVarint(b) - if n < 0 { - return 0, 0 - } - return v, n -} - -// Buffer is a buffer for encoding and decoding the protobuf wire format. -// It may be reused between invocations to reduce memory usage. -type Buffer struct { - buf []byte - idx int - deterministic bool -} - -// NewBuffer allocates a new Buffer initialized with buf, -// where the contents of buf are considered the unread portion of the buffer. -func NewBuffer(buf []byte) *Buffer { - return &Buffer{buf: buf} -} - -// SetDeterministic specifies whether to use deterministic serialization. -// -// Deterministic serialization guarantees that for a given binary, equal -// messages will always be serialized to the same bytes. This implies: -// -// - Repeated serialization of a message will return the same bytes. -// - Different processes of the same binary (which may be executing on -// different machines) will serialize equal messages to the same bytes. -// -// Note that the deterministic serialization is NOT canonical across -// languages. It is not guaranteed to remain stable over time. It is unstable -// across different builds with schema changes due to unknown fields. -// Users who need canonical serialization (e.g., persistent storage in a -// canonical form, fingerprinting, etc.) should define their own -// canonicalization specification and implement their own serializer rather -// than relying on this API. -// -// If deterministic serialization is requested, map entries will be sorted -// by keys in lexographical order. This is an implementation detail and -// subject to change. -func (b *Buffer) SetDeterministic(deterministic bool) { - b.deterministic = deterministic -} - -// SetBuf sets buf as the internal buffer, -// where the contents of buf are considered the unread portion of the buffer. -func (b *Buffer) SetBuf(buf []byte) { - b.buf = buf - b.idx = 0 -} - -// Reset clears the internal buffer of all written and unread data. -func (b *Buffer) Reset() { - b.buf = b.buf[:0] - b.idx = 0 -} - -// Bytes returns the internal buffer. -func (b *Buffer) Bytes() []byte { - return b.buf -} - -// Unread returns the unread portion of the buffer. -func (b *Buffer) Unread() []byte { - return b.buf[b.idx:] -} - -// Marshal appends the wire-format encoding of m to the buffer. -func (b *Buffer) Marshal(m Message) error { - var err error - b.buf, err = marshalAppend(b.buf, m, b.deterministic) - return err -} - -// Unmarshal parses the wire-format message in the buffer and -// places the decoded results in m. -// It does not reset m before unmarshaling. -func (b *Buffer) Unmarshal(m Message) error { - err := UnmarshalMerge(b.Unread(), m) - b.idx = len(b.buf) - return err -} - -type unknownFields struct{ XXX_unrecognized protoimpl.UnknownFields } - -func (m *unknownFields) String() string { panic("not implemented") } -func (m *unknownFields) Reset() { panic("not implemented") } -func (m *unknownFields) ProtoMessage() { panic("not implemented") } - -// DebugPrint dumps the encoded bytes of b with a header and footer including s -// to stdout. This is only intended for debugging. -func (*Buffer) DebugPrint(s string, b []byte) { - m := MessageReflect(new(unknownFields)) - m.SetUnknown(b) - b, _ = prototext.MarshalOptions{AllowPartial: true, Indent: "\t"}.Marshal(m.Interface()) - fmt.Printf("==== %s ====\n%s==== %s ====\n", s, b, s) -} - -// EncodeVarint appends an unsigned varint encoding to the buffer. -func (b *Buffer) EncodeVarint(v uint64) error { - b.buf = protowire.AppendVarint(b.buf, v) - return nil -} - -// EncodeZigzag32 appends a 32-bit zig-zag varint encoding to the buffer. -func (b *Buffer) EncodeZigzag32(v uint64) error { - return b.EncodeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) -} - -// EncodeZigzag64 appends a 64-bit zig-zag varint encoding to the buffer. -func (b *Buffer) EncodeZigzag64(v uint64) error { - return b.EncodeVarint(uint64((uint64(v) << 1) ^ uint64((int64(v) >> 63)))) -} - -// EncodeFixed32 appends a 32-bit little-endian integer to the buffer. -func (b *Buffer) EncodeFixed32(v uint64) error { - b.buf = protowire.AppendFixed32(b.buf, uint32(v)) - return nil -} - -// EncodeFixed64 appends a 64-bit little-endian integer to the buffer. -func (b *Buffer) EncodeFixed64(v uint64) error { - b.buf = protowire.AppendFixed64(b.buf, uint64(v)) - return nil -} - -// EncodeRawBytes appends a length-prefixed raw bytes to the buffer. -func (b *Buffer) EncodeRawBytes(v []byte) error { - b.buf = protowire.AppendBytes(b.buf, v) - return nil -} - -// EncodeStringBytes appends a length-prefixed raw bytes to the buffer. -// It does not validate whether v contains valid UTF-8. -func (b *Buffer) EncodeStringBytes(v string) error { - b.buf = protowire.AppendString(b.buf, v) - return nil -} - -// EncodeMessage appends a length-prefixed encoded message to the buffer. -func (b *Buffer) EncodeMessage(m Message) error { - var err error - b.buf = protowire.AppendVarint(b.buf, uint64(Size(m))) - b.buf, err = marshalAppend(b.buf, m, b.deterministic) - return err -} - -// DecodeVarint consumes an encoded unsigned varint from the buffer. -func (b *Buffer) DecodeVarint() (uint64, error) { - v, n := protowire.ConsumeVarint(b.buf[b.idx:]) - if n < 0 { - return 0, protowire.ParseError(n) - } - b.idx += n - return uint64(v), nil -} - -// DecodeZigzag32 consumes an encoded 32-bit zig-zag varint from the buffer. -func (b *Buffer) DecodeZigzag32() (uint64, error) { - v, err := b.DecodeVarint() - if err != nil { - return 0, err - } - return uint64((uint32(v) >> 1) ^ uint32((int32(v&1)<<31)>>31)), nil -} - -// DecodeZigzag64 consumes an encoded 64-bit zig-zag varint from the buffer. -func (b *Buffer) DecodeZigzag64() (uint64, error) { - v, err := b.DecodeVarint() - if err != nil { - return 0, err - } - return uint64((uint64(v) >> 1) ^ uint64((int64(v&1)<<63)>>63)), nil -} - -// DecodeFixed32 consumes a 32-bit little-endian integer from the buffer. -func (b *Buffer) DecodeFixed32() (uint64, error) { - v, n := protowire.ConsumeFixed32(b.buf[b.idx:]) - if n < 0 { - return 0, protowire.ParseError(n) - } - b.idx += n - return uint64(v), nil -} - -// DecodeFixed64 consumes a 64-bit little-endian integer from the buffer. -func (b *Buffer) DecodeFixed64() (uint64, error) { - v, n := protowire.ConsumeFixed64(b.buf[b.idx:]) - if n < 0 { - return 0, protowire.ParseError(n) - } - b.idx += n - return uint64(v), nil -} - -// DecodeRawBytes consumes a length-prefixed raw bytes from the buffer. -// If alloc is specified, it returns a copy the raw bytes -// rather than a sub-slice of the buffer. -func (b *Buffer) DecodeRawBytes(alloc bool) ([]byte, error) { - v, n := protowire.ConsumeBytes(b.buf[b.idx:]) - if n < 0 { - return nil, protowire.ParseError(n) - } - b.idx += n - if alloc { - v = append([]byte(nil), v...) - } - return v, nil -} - -// DecodeStringBytes consumes a length-prefixed raw bytes from the buffer. -// It does not validate whether the raw bytes contain valid UTF-8. -func (b *Buffer) DecodeStringBytes() (string, error) { - v, n := protowire.ConsumeString(b.buf[b.idx:]) - if n < 0 { - return "", protowire.ParseError(n) - } - b.idx += n - return v, nil -} - -// DecodeMessage consumes a length-prefixed message from the buffer. -// It does not reset m before unmarshaling. -func (b *Buffer) DecodeMessage(m Message) error { - v, err := b.DecodeRawBytes(false) - if err != nil { - return err - } - return UnmarshalMerge(v, m) -} - -// DecodeGroup consumes a message group from the buffer. -// It assumes that the start group marker has already been consumed and -// consumes all bytes until (and including the end group marker). -// It does not reset m before unmarshaling. -func (b *Buffer) DecodeGroup(m Message) error { - v, n, err := consumeGroup(b.buf[b.idx:]) - if err != nil { - return err - } - b.idx += n - return UnmarshalMerge(v, m) -} - -// consumeGroup parses b until it finds an end group marker, returning -// the raw bytes of the message (excluding the end group marker) and the -// the total length of the message (including the end group marker). -func consumeGroup(b []byte) ([]byte, int, error) { - b0 := b - depth := 1 // assume this follows a start group marker - for { - _, wtyp, tagLen := protowire.ConsumeTag(b) - if tagLen < 0 { - return nil, 0, protowire.ParseError(tagLen) - } - b = b[tagLen:] - - var valLen int - switch wtyp { - case protowire.VarintType: - _, valLen = protowire.ConsumeVarint(b) - case protowire.Fixed32Type: - _, valLen = protowire.ConsumeFixed32(b) - case protowire.Fixed64Type: - _, valLen = protowire.ConsumeFixed64(b) - case protowire.BytesType: - _, valLen = protowire.ConsumeBytes(b) - case protowire.StartGroupType: - depth++ - case protowire.EndGroupType: - depth-- - default: - return nil, 0, errors.New("proto: cannot parse reserved wire type") - } - if valLen < 0 { - return nil, 0, protowire.ParseError(valLen) - } - b = b[valLen:] - - if depth == 0 { - return b0[:len(b0)-len(b)-tagLen], len(b0) - len(b), nil - } - } -} diff --git a/vendor/github.com/golang/protobuf/proto/defaults.go b/vendor/github.com/golang/protobuf/proto/defaults.go deleted file mode 100644 index d399bf069c..0000000000 --- a/vendor/github.com/golang/protobuf/proto/defaults.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "google.golang.org/protobuf/reflect/protoreflect" -) - -// SetDefaults sets unpopulated scalar fields to their default values. -// Fields within a oneof are not set even if they have a default value. -// SetDefaults is recursively called upon any populated message fields. -func SetDefaults(m Message) { - if m != nil { - setDefaults(MessageReflect(m)) - } -} - -func setDefaults(m protoreflect.Message) { - fds := m.Descriptor().Fields() - for i := 0; i < fds.Len(); i++ { - fd := fds.Get(i) - if !m.Has(fd) { - if fd.HasDefault() && fd.ContainingOneof() == nil { - v := fd.Default() - if fd.Kind() == protoreflect.BytesKind { - v = protoreflect.ValueOf(append([]byte(nil), v.Bytes()...)) // copy the default bytes - } - m.Set(fd, v) - } - continue - } - } - - m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - switch { - // Handle singular message. - case fd.Cardinality() != protoreflect.Repeated: - if fd.Message() != nil { - setDefaults(m.Get(fd).Message()) - } - // Handle list of messages. - case fd.IsList(): - if fd.Message() != nil { - ls := m.Get(fd).List() - for i := 0; i < ls.Len(); i++ { - setDefaults(ls.Get(i).Message()) - } - } - // Handle map of messages. - case fd.IsMap(): - if fd.MapValue().Message() != nil { - ms := m.Get(fd).Map() - ms.Range(func(_ protoreflect.MapKey, v protoreflect.Value) bool { - setDefaults(v.Message()) - return true - }) - } - } - return true - }) -} diff --git a/vendor/github.com/golang/protobuf/proto/deprecated.go b/vendor/github.com/golang/protobuf/proto/deprecated.go deleted file mode 100644 index e8db57e097..0000000000 --- a/vendor/github.com/golang/protobuf/proto/deprecated.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "encoding/json" - "errors" - "fmt" - "strconv" - - protoV2 "google.golang.org/protobuf/proto" -) - -var ( - // Deprecated: No longer returned. - ErrNil = errors.New("proto: Marshal called with nil") - - // Deprecated: No longer returned. - ErrTooLarge = errors.New("proto: message encodes to over 2 GB") - - // Deprecated: No longer returned. - ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") -) - -// Deprecated: Do not use. -type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 } - -// Deprecated: Do not use. -func GetStats() Stats { return Stats{} } - -// Deprecated: Do not use. -func MarshalMessageSet(interface{}) ([]byte, error) { - return nil, errors.New("proto: not implemented") -} - -// Deprecated: Do not use. -func UnmarshalMessageSet([]byte, interface{}) error { - return errors.New("proto: not implemented") -} - -// Deprecated: Do not use. -func MarshalMessageSetJSON(interface{}) ([]byte, error) { - return nil, errors.New("proto: not implemented") -} - -// Deprecated: Do not use. -func UnmarshalMessageSetJSON([]byte, interface{}) error { - return errors.New("proto: not implemented") -} - -// Deprecated: Do not use. -func RegisterMessageSetType(Message, int32, string) {} - -// Deprecated: Do not use. -func EnumName(m map[int32]string, v int32) string { - s, ok := m[v] - if ok { - return s - } - return strconv.Itoa(int(v)) -} - -// Deprecated: Do not use. -func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { - if data[0] == '"' { - // New style: enums are strings. - var repr string - if err := json.Unmarshal(data, &repr); err != nil { - return -1, err - } - val, ok := m[repr] - if !ok { - return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) - } - return val, nil - } - // Old style: enums are ints. - var val int32 - if err := json.Unmarshal(data, &val); err != nil { - return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) - } - return val, nil -} - -// Deprecated: Do not use; this type existed for intenal-use only. -type InternalMessageInfo struct{} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) DiscardUnknown(m Message) { - DiscardUnknown(m) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Marshal(b []byte, m Message, deterministic bool) ([]byte, error) { - return protoV2.MarshalOptions{Deterministic: deterministic}.MarshalAppend(b, MessageV2(m)) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Merge(dst, src Message) { - protoV2.Merge(MessageV2(dst), MessageV2(src)) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Size(m Message) int { - return protoV2.Size(MessageV2(m)) -} - -// Deprecated: Do not use; this method existed for intenal-use only. -func (*InternalMessageInfo) Unmarshal(m Message, b []byte) error { - return protoV2.UnmarshalOptions{Merge: true}.Unmarshal(b, MessageV2(m)) -} diff --git a/vendor/github.com/golang/protobuf/proto/discard.go b/vendor/github.com/golang/protobuf/proto/discard.go deleted file mode 100644 index 2187e877fa..0000000000 --- a/vendor/github.com/golang/protobuf/proto/discard.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "google.golang.org/protobuf/reflect/protoreflect" -) - -// DiscardUnknown recursively discards all unknown fields from this message -// and all embedded messages. -// -// When unmarshaling a message with unrecognized fields, the tags and values -// of such fields are preserved in the Message. This allows a later call to -// marshal to be able to produce a message that continues to have those -// unrecognized fields. To avoid this, DiscardUnknown is used to -// explicitly clear the unknown fields after unmarshaling. -func DiscardUnknown(m Message) { - if m != nil { - discardUnknown(MessageReflect(m)) - } -} - -func discardUnknown(m protoreflect.Message) { - m.Range(func(fd protoreflect.FieldDescriptor, val protoreflect.Value) bool { - switch { - // Handle singular message. - case fd.Cardinality() != protoreflect.Repeated: - if fd.Message() != nil { - discardUnknown(m.Get(fd).Message()) - } - // Handle list of messages. - case fd.IsList(): - if fd.Message() != nil { - ls := m.Get(fd).List() - for i := 0; i < ls.Len(); i++ { - discardUnknown(ls.Get(i).Message()) - } - } - // Handle map of messages. - case fd.IsMap(): - if fd.MapValue().Message() != nil { - ms := m.Get(fd).Map() - ms.Range(func(_ protoreflect.MapKey, v protoreflect.Value) bool { - discardUnknown(v.Message()) - return true - }) - } - } - return true - }) - - // Discard unknown fields. - if len(m.GetUnknown()) > 0 { - m.SetUnknown(nil) - } -} diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go deleted file mode 100644 index 42fc120c97..0000000000 --- a/vendor/github.com/golang/protobuf/proto/extensions.go +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "errors" - "fmt" - "reflect" - - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - "google.golang.org/protobuf/runtime/protoiface" - "google.golang.org/protobuf/runtime/protoimpl" -) - -type ( - // ExtensionDesc represents an extension descriptor and - // is used to interact with an extension field in a message. - // - // Variables of this type are generated in code by protoc-gen-go. - ExtensionDesc = protoimpl.ExtensionInfo - - // ExtensionRange represents a range of message extensions. - // Used in code generated by protoc-gen-go. - ExtensionRange = protoiface.ExtensionRangeV1 - - // Deprecated: Do not use; this is an internal type. - Extension = protoimpl.ExtensionFieldV1 - - // Deprecated: Do not use; this is an internal type. - XXX_InternalExtensions = protoimpl.ExtensionFields -) - -// ErrMissingExtension reports whether the extension was not present. -var ErrMissingExtension = errors.New("proto: missing extension") - -var errNotExtendable = errors.New("proto: not an extendable proto.Message") - -// HasExtension reports whether the extension field is present in m -// either as an explicitly populated field or as an unknown field. -func HasExtension(m Message, xt *ExtensionDesc) (has bool) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return false - } - - // Check whether any populated known field matches the field number. - xtd := xt.TypeDescriptor() - if isValidExtension(mr.Descriptor(), xtd) { - has = mr.Has(xtd) - } else { - mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool { - has = int32(fd.Number()) == xt.Field - return !has - }) - } - - // Check whether any unknown field matches the field number. - for b := mr.GetUnknown(); !has && len(b) > 0; { - num, _, n := protowire.ConsumeField(b) - has = int32(num) == xt.Field - b = b[n:] - } - return has -} - -// ClearExtension removes the extension field from m -// either as an explicitly populated field or as an unknown field. -func ClearExtension(m Message, xt *ExtensionDesc) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return - } - - xtd := xt.TypeDescriptor() - if isValidExtension(mr.Descriptor(), xtd) { - mr.Clear(xtd) - } else { - mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool { - if int32(fd.Number()) == xt.Field { - mr.Clear(fd) - return false - } - return true - }) - } - clearUnknown(mr, fieldNum(xt.Field)) -} - -// ClearAllExtensions clears all extensions from m. -// This includes populated fields and unknown fields in the extension range. -func ClearAllExtensions(m Message) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return - } - - mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool { - if fd.IsExtension() { - mr.Clear(fd) - } - return true - }) - clearUnknown(mr, mr.Descriptor().ExtensionRanges()) -} - -// GetExtension retrieves a proto2 extended field from m. -// -// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), -// then GetExtension parses the encoded field and returns a Go value of the specified type. -// If the field is not present, then the default value is returned (if one is specified), -// otherwise ErrMissingExtension is reported. -// -// If the descriptor is type incomplete (i.e., ExtensionDesc.ExtensionType is nil), -// then GetExtension returns the raw encoded bytes for the extension field. -func GetExtension(m Message, xt *ExtensionDesc) (interface{}, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 { - return nil, errNotExtendable - } - - // Retrieve the unknown fields for this extension field. - var bo protoreflect.RawFields - for bi := mr.GetUnknown(); len(bi) > 0; { - num, _, n := protowire.ConsumeField(bi) - if int32(num) == xt.Field { - bo = append(bo, bi[:n]...) - } - bi = bi[n:] - } - - // For type incomplete descriptors, only retrieve the unknown fields. - if xt.ExtensionType == nil { - return []byte(bo), nil - } - - // If the extension field only exists as unknown fields, unmarshal it. - // This is rarely done since proto.Unmarshal eagerly unmarshals extensions. - xtd := xt.TypeDescriptor() - if !isValidExtension(mr.Descriptor(), xtd) { - return nil, fmt.Errorf("proto: bad extended type; %T does not extend %T", xt.ExtendedType, m) - } - if !mr.Has(xtd) && len(bo) > 0 { - m2 := mr.New() - if err := (proto.UnmarshalOptions{ - Resolver: extensionResolver{xt}, - }.Unmarshal(bo, m2.Interface())); err != nil { - return nil, err - } - if m2.Has(xtd) { - mr.Set(xtd, m2.Get(xtd)) - clearUnknown(mr, fieldNum(xt.Field)) - } - } - - // Check whether the message has the extension field set or a default. - var pv protoreflect.Value - switch { - case mr.Has(xtd): - pv = mr.Get(xtd) - case xtd.HasDefault(): - pv = xtd.Default() - default: - return nil, ErrMissingExtension - } - - v := xt.InterfaceOf(pv) - rv := reflect.ValueOf(v) - if isScalarKind(rv.Kind()) { - rv2 := reflect.New(rv.Type()) - rv2.Elem().Set(rv) - v = rv2.Interface() - } - return v, nil -} - -// extensionResolver is a custom extension resolver that stores a single -// extension type that takes precedence over the global registry. -type extensionResolver struct{ xt protoreflect.ExtensionType } - -func (r extensionResolver) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) { - if xtd := r.xt.TypeDescriptor(); xtd.FullName() == field { - return r.xt, nil - } - return protoregistry.GlobalTypes.FindExtensionByName(field) -} - -func (r extensionResolver) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) { - if xtd := r.xt.TypeDescriptor(); xtd.ContainingMessage().FullName() == message && xtd.Number() == field { - return r.xt, nil - } - return protoregistry.GlobalTypes.FindExtensionByNumber(message, field) -} - -// GetExtensions returns a list of the extensions values present in m, -// corresponding with the provided list of extension descriptors, xts. -// If an extension is missing in m, the corresponding value is nil. -func GetExtensions(m Message, xts []*ExtensionDesc) ([]interface{}, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return nil, errNotExtendable - } - - vs := make([]interface{}, len(xts)) - for i, xt := range xts { - v, err := GetExtension(m, xt) - if err != nil { - if err == ErrMissingExtension { - continue - } - return vs, err - } - vs[i] = v - } - return vs, nil -} - -// SetExtension sets an extension field in m to the provided value. -func SetExtension(m Message, xt *ExtensionDesc, v interface{}) error { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 { - return errNotExtendable - } - - rv := reflect.ValueOf(v) - if reflect.TypeOf(v) != reflect.TypeOf(xt.ExtensionType) { - return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", v, xt.ExtensionType) - } - if rv.Kind() == reflect.Ptr { - if rv.IsNil() { - return fmt.Errorf("proto: SetExtension called with nil value of type %T", v) - } - if isScalarKind(rv.Elem().Kind()) { - v = rv.Elem().Interface() - } - } - - xtd := xt.TypeDescriptor() - if !isValidExtension(mr.Descriptor(), xtd) { - return fmt.Errorf("proto: bad extended type; %T does not extend %T", xt.ExtendedType, m) - } - mr.Set(xtd, xt.ValueOf(v)) - clearUnknown(mr, fieldNum(xt.Field)) - return nil -} - -// SetRawExtension inserts b into the unknown fields of m. -// -// Deprecated: Use Message.ProtoReflect.SetUnknown instead. -func SetRawExtension(m Message, fnum int32, b []byte) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return - } - - // Verify that the raw field is valid. - for b0 := b; len(b0) > 0; { - num, _, n := protowire.ConsumeField(b0) - if int32(num) != fnum { - panic(fmt.Sprintf("mismatching field number: got %d, want %d", num, fnum)) - } - b0 = b0[n:] - } - - ClearExtension(m, &ExtensionDesc{Field: fnum}) - mr.SetUnknown(append(mr.GetUnknown(), b...)) -} - -// ExtensionDescs returns a list of extension descriptors found in m, -// containing descriptors for both populated extension fields in m and -// also unknown fields of m that are in the extension range. -// For the later case, an type incomplete descriptor is provided where only -// the ExtensionDesc.Field field is populated. -// The order of the extension descriptors is undefined. -func ExtensionDescs(m Message) ([]*ExtensionDesc, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 { - return nil, errNotExtendable - } - - // Collect a set of known extension descriptors. - extDescs := make(map[protoreflect.FieldNumber]*ExtensionDesc) - mr.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - if fd.IsExtension() { - xt := fd.(protoreflect.ExtensionTypeDescriptor) - if xd, ok := xt.Type().(*ExtensionDesc); ok { - extDescs[fd.Number()] = xd - } - } - return true - }) - - // Collect a set of unknown extension descriptors. - extRanges := mr.Descriptor().ExtensionRanges() - for b := mr.GetUnknown(); len(b) > 0; { - num, _, n := protowire.ConsumeField(b) - if extRanges.Has(num) && extDescs[num] == nil { - extDescs[num] = nil - } - b = b[n:] - } - - // Transpose the set of descriptors into a list. - var xts []*ExtensionDesc - for num, xt := range extDescs { - if xt == nil { - xt = &ExtensionDesc{Field: int32(num)} - } - xts = append(xts, xt) - } - return xts, nil -} - -// isValidExtension reports whether xtd is a valid extension descriptor for md. -func isValidExtension(md protoreflect.MessageDescriptor, xtd protoreflect.ExtensionTypeDescriptor) bool { - return xtd.ContainingMessage() == md && md.ExtensionRanges().Has(xtd.Number()) -} - -// isScalarKind reports whether k is a protobuf scalar kind (except bytes). -// This function exists for historical reasons since the representation of -// scalars differs between v1 and v2, where v1 uses *T and v2 uses T. -func isScalarKind(k reflect.Kind) bool { - switch k { - case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: - return true - default: - return false - } -} - -// clearUnknown removes unknown fields from m where remover.Has reports true. -func clearUnknown(m protoreflect.Message, remover interface { - Has(protoreflect.FieldNumber) bool -}) { - var bo protoreflect.RawFields - for bi := m.GetUnknown(); len(bi) > 0; { - num, _, n := protowire.ConsumeField(bi) - if !remover.Has(num) { - bo = append(bo, bi[:n]...) - } - bi = bi[n:] - } - if bi := m.GetUnknown(); len(bi) != len(bo) { - m.SetUnknown(bo) - } -} - -type fieldNum protoreflect.FieldNumber - -func (n1 fieldNum) Has(n2 protoreflect.FieldNumber) bool { - return protoreflect.FieldNumber(n1) == n2 -} diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go deleted file mode 100644 index dcdc2202fa..0000000000 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "fmt" - "reflect" - "strconv" - "strings" - "sync" - - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/runtime/protoimpl" -) - -// StructProperties represents protocol buffer type information for a -// generated protobuf message in the open-struct API. -// -// Deprecated: Do not use. -type StructProperties struct { - // Prop are the properties for each field. - // - // Fields belonging to a oneof are stored in OneofTypes instead, with a - // single Properties representing the parent oneof held here. - // - // The order of Prop matches the order of fields in the Go struct. - // Struct fields that are not related to protobufs have a "XXX_" prefix - // in the Properties.Name and must be ignored by the user. - Prop []*Properties - - // OneofTypes contains information about the oneof fields in this message. - // It is keyed by the protobuf field name. - OneofTypes map[string]*OneofProperties -} - -// Properties represents the type information for a protobuf message field. -// -// Deprecated: Do not use. -type Properties struct { - // Name is a placeholder name with little meaningful semantic value. - // If the name has an "XXX_" prefix, the entire Properties must be ignored. - Name string - // OrigName is the protobuf field name or oneof name. - OrigName string - // JSONName is the JSON name for the protobuf field. - JSONName string - // Enum is a placeholder name for enums. - // For historical reasons, this is neither the Go name for the enum, - // nor the protobuf name for the enum. - Enum string // Deprecated: Do not use. - // Weak contains the full name of the weakly referenced message. - Weak string - // Wire is a string representation of the wire type. - Wire string - // WireType is the protobuf wire type for the field. - WireType int - // Tag is the protobuf field number. - Tag int - // Required reports whether this is a required field. - Required bool - // Optional reports whether this is a optional field. - Optional bool - // Repeated reports whether this is a repeated field. - Repeated bool - // Packed reports whether this is a packed repeated field of scalars. - Packed bool - // Proto3 reports whether this field operates under the proto3 syntax. - Proto3 bool - // Oneof reports whether this field belongs within a oneof. - Oneof bool - - // Default is the default value in string form. - Default string - // HasDefault reports whether the field has a default value. - HasDefault bool - - // MapKeyProp is the properties for the key field for a map field. - MapKeyProp *Properties - // MapValProp is the properties for the value field for a map field. - MapValProp *Properties -} - -// OneofProperties represents the type information for a protobuf oneof. -// -// Deprecated: Do not use. -type OneofProperties struct { - // Type is a pointer to the generated wrapper type for the field value. - // This is nil for messages that are not in the open-struct API. - Type reflect.Type - // Field is the index into StructProperties.Prop for the containing oneof. - Field int - // Prop is the properties for the field. - Prop *Properties -} - -// String formats the properties in the protobuf struct field tag style. -func (p *Properties) String() string { - s := p.Wire - s += "," + strconv.Itoa(p.Tag) - if p.Required { - s += ",req" - } - if p.Optional { - s += ",opt" - } - if p.Repeated { - s += ",rep" - } - if p.Packed { - s += ",packed" - } - s += ",name=" + p.OrigName - if p.JSONName != "" { - s += ",json=" + p.JSONName - } - if len(p.Enum) > 0 { - s += ",enum=" + p.Enum - } - if len(p.Weak) > 0 { - s += ",weak=" + p.Weak - } - if p.Proto3 { - s += ",proto3" - } - if p.Oneof { - s += ",oneof" - } - if p.HasDefault { - s += ",def=" + p.Default - } - return s -} - -// Parse populates p by parsing a string in the protobuf struct field tag style. -func (p *Properties) Parse(tag string) { - // For example: "bytes,49,opt,name=foo,def=hello!" - for len(tag) > 0 { - i := strings.IndexByte(tag, ',') - if i < 0 { - i = len(tag) - } - switch s := tag[:i]; { - case strings.HasPrefix(s, "name="): - p.OrigName = s[len("name="):] - case strings.HasPrefix(s, "json="): - p.JSONName = s[len("json="):] - case strings.HasPrefix(s, "enum="): - p.Enum = s[len("enum="):] - case strings.HasPrefix(s, "weak="): - p.Weak = s[len("weak="):] - case strings.Trim(s, "0123456789") == "": - n, _ := strconv.ParseUint(s, 10, 32) - p.Tag = int(n) - case s == "opt": - p.Optional = true - case s == "req": - p.Required = true - case s == "rep": - p.Repeated = true - case s == "varint" || s == "zigzag32" || s == "zigzag64": - p.Wire = s - p.WireType = WireVarint - case s == "fixed32": - p.Wire = s - p.WireType = WireFixed32 - case s == "fixed64": - p.Wire = s - p.WireType = WireFixed64 - case s == "bytes": - p.Wire = s - p.WireType = WireBytes - case s == "group": - p.Wire = s - p.WireType = WireStartGroup - case s == "packed": - p.Packed = true - case s == "proto3": - p.Proto3 = true - case s == "oneof": - p.Oneof = true - case strings.HasPrefix(s, "def="): - // The default tag is special in that everything afterwards is the - // default regardless of the presence of commas. - p.HasDefault = true - p.Default, i = tag[len("def="):], len(tag) - } - tag = strings.TrimPrefix(tag[i:], ",") - } -} - -// Init populates the properties from a protocol buffer struct tag. -// -// Deprecated: Do not use. -func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { - p.Name = name - p.OrigName = name - if tag == "" { - return - } - p.Parse(tag) - - if typ != nil && typ.Kind() == reflect.Map { - p.MapKeyProp = new(Properties) - p.MapKeyProp.Init(nil, "Key", f.Tag.Get("protobuf_key"), nil) - p.MapValProp = new(Properties) - p.MapValProp.Init(nil, "Value", f.Tag.Get("protobuf_val"), nil) - } -} - -var propertiesCache sync.Map // map[reflect.Type]*StructProperties - -// GetProperties returns the list of properties for the type represented by t, -// which must be a generated protocol buffer message in the open-struct API, -// where protobuf message fields are represented by exported Go struct fields. -// -// Deprecated: Use protobuf reflection instead. -func GetProperties(t reflect.Type) *StructProperties { - if p, ok := propertiesCache.Load(t); ok { - return p.(*StructProperties) - } - p, _ := propertiesCache.LoadOrStore(t, newProperties(t)) - return p.(*StructProperties) -} - -func newProperties(t reflect.Type) *StructProperties { - if t.Kind() != reflect.Struct { - panic(fmt.Sprintf("%v is not a generated message in the open-struct API", t)) - } - - var hasOneof bool - prop := new(StructProperties) - - // Construct a list of properties for each field in the struct. - for i := 0; i < t.NumField(); i++ { - p := new(Properties) - f := t.Field(i) - tagField := f.Tag.Get("protobuf") - p.Init(f.Type, f.Name, tagField, &f) - - tagOneof := f.Tag.Get("protobuf_oneof") - if tagOneof != "" { - hasOneof = true - p.OrigName = tagOneof - } - - // Rename unrelated struct fields with the "XXX_" prefix since so much - // user code simply checks for this to exclude special fields. - if tagField == "" && tagOneof == "" && !strings.HasPrefix(p.Name, "XXX_") { - p.Name = "XXX_" + p.Name - p.OrigName = "XXX_" + p.OrigName - } else if p.Weak != "" { - p.Name = p.OrigName // avoid possible "XXX_" prefix on weak field - } - - prop.Prop = append(prop.Prop, p) - } - - // Construct a mapping of oneof field names to properties. - if hasOneof { - var oneofWrappers []interface{} - if fn, ok := reflect.PtrTo(t).MethodByName("XXX_OneofFuncs"); ok { - oneofWrappers = fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[3].Interface().([]interface{}) - } - if fn, ok := reflect.PtrTo(t).MethodByName("XXX_OneofWrappers"); ok { - oneofWrappers = fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0].Interface().([]interface{}) - } - if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(protoreflect.ProtoMessage); ok { - if m, ok := m.ProtoReflect().(interface{ ProtoMessageInfo() *protoimpl.MessageInfo }); ok { - oneofWrappers = m.ProtoMessageInfo().OneofWrappers - } - } - - prop.OneofTypes = make(map[string]*OneofProperties) - for _, wrapper := range oneofWrappers { - p := &OneofProperties{ - Type: reflect.ValueOf(wrapper).Type(), // *T - Prop: new(Properties), - } - f := p.Type.Elem().Field(0) - p.Prop.Name = f.Name - p.Prop.Parse(f.Tag.Get("protobuf")) - - // Determine the struct field that contains this oneof. - // Each wrapper is assignable to exactly one parent field. - var foundOneof bool - for i := 0; i < t.NumField() && !foundOneof; i++ { - if p.Type.AssignableTo(t.Field(i).Type) { - p.Field = i - foundOneof = true - } - } - if !foundOneof { - panic(fmt.Sprintf("%v is not a generated message in the open-struct API", t)) - } - prop.OneofTypes[p.Prop.OrigName] = p - } - } - - return prop -} - -func (sp *StructProperties) Len() int { return len(sp.Prop) } -func (sp *StructProperties) Less(i, j int) bool { return false } -func (sp *StructProperties) Swap(i, j int) { return } diff --git a/vendor/github.com/golang/protobuf/proto/proto.go b/vendor/github.com/golang/protobuf/proto/proto.go deleted file mode 100644 index 5aee89c323..0000000000 --- a/vendor/github.com/golang/protobuf/proto/proto.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package proto provides functionality for handling protocol buffer messages. -// In particular, it provides marshaling and unmarshaling between a protobuf -// message and the binary wire format. -// -// See https://developers.google.com/protocol-buffers/docs/gotutorial for -// more information. -// -// Deprecated: Use the "google.golang.org/protobuf/proto" package instead. -package proto - -import ( - protoV2 "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/runtime/protoiface" - "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - ProtoPackageIsVersion1 = true - ProtoPackageIsVersion2 = true - ProtoPackageIsVersion3 = true - ProtoPackageIsVersion4 = true -) - -// GeneratedEnum is any enum type generated by protoc-gen-go -// which is a named int32 kind. -// This type exists for documentation purposes. -type GeneratedEnum interface{} - -// GeneratedMessage is any message type generated by protoc-gen-go -// which is a pointer to a named struct kind. -// This type exists for documentation purposes. -type GeneratedMessage interface{} - -// Message is a protocol buffer message. -// -// This is the v1 version of the message interface and is marginally better -// than an empty interface as it lacks any method to programatically interact -// with the contents of the message. -// -// A v2 message is declared in "google.golang.org/protobuf/proto".Message and -// exposes protobuf reflection as a first-class feature of the interface. -// -// To convert a v1 message to a v2 message, use the MessageV2 function. -// To convert a v2 message to a v1 message, use the MessageV1 function. -type Message = protoiface.MessageV1 - -// MessageV1 converts either a v1 or v2 message to a v1 message. -// It returns nil if m is nil. -func MessageV1(m GeneratedMessage) protoiface.MessageV1 { - return protoimpl.X.ProtoMessageV1Of(m) -} - -// MessageV2 converts either a v1 or v2 message to a v2 message. -// It returns nil if m is nil. -func MessageV2(m GeneratedMessage) protoV2.Message { - return protoimpl.X.ProtoMessageV2Of(m) -} - -// MessageReflect returns a reflective view for a message. -// It returns nil if m is nil. -func MessageReflect(m Message) protoreflect.Message { - return protoimpl.X.MessageOf(m) -} - -// Marshaler is implemented by messages that can marshal themselves. -// This interface is used by the following functions: Size, Marshal, -// Buffer.Marshal, and Buffer.EncodeMessage. -// -// Deprecated: Do not implement. -type Marshaler interface { - // Marshal formats the encoded bytes of the message. - // It should be deterministic and emit valid protobuf wire data. - // The caller takes ownership of the returned buffer. - Marshal() ([]byte, error) -} - -// Unmarshaler is implemented by messages that can unmarshal themselves. -// This interface is used by the following functions: Unmarshal, UnmarshalMerge, -// Buffer.Unmarshal, Buffer.DecodeMessage, and Buffer.DecodeGroup. -// -// Deprecated: Do not implement. -type Unmarshaler interface { - // Unmarshal parses the encoded bytes of the protobuf wire input. - // The provided buffer is only valid for during method call. - // It should not reset the receiver message. - Unmarshal([]byte) error -} - -// Merger is implemented by messages that can merge themselves. -// This interface is used by the following functions: Clone and Merge. -// -// Deprecated: Do not implement. -type Merger interface { - // Merge merges the contents of src into the receiver message. - // It clones all data structures in src such that it aliases no mutable - // memory referenced by src. - Merge(src Message) -} - -// RequiredNotSetError is an error type returned when -// marshaling or unmarshaling a message with missing required fields. -type RequiredNotSetError struct { - err error -} - -func (e *RequiredNotSetError) Error() string { - if e.err != nil { - return e.err.Error() - } - return "proto: required field not set" -} -func (e *RequiredNotSetError) RequiredNotSet() bool { - return true -} - -func checkRequiredNotSet(m protoV2.Message) error { - if err := protoV2.CheckInitialized(m); err != nil { - return &RequiredNotSetError{err: err} - } - return nil -} - -// Clone returns a deep copy of src. -func Clone(src Message) Message { - return MessageV1(protoV2.Clone(MessageV2(src))) -} - -// Merge merges src into dst, which must be messages of the same type. -// -// Populated scalar fields in src are copied to dst, while populated -// singular messages in src are merged into dst by recursively calling Merge. -// The elements of every list field in src is appended to the corresponded -// list fields in dst. The entries of every map field in src is copied into -// the corresponding map field in dst, possibly replacing existing entries. -// The unknown fields of src are appended to the unknown fields of dst. -func Merge(dst, src Message) { - protoV2.Merge(MessageV2(dst), MessageV2(src)) -} - -// Equal reports whether two messages are equal. -// If two messages marshal to the same bytes under deterministic serialization, -// then Equal is guaranteed to report true. -// -// Two messages are equal if they are the same protobuf message type, -// have the same set of populated known and extension field values, -// and the same set of unknown fields values. -// -// Scalar values are compared with the equivalent of the == operator in Go, -// except bytes values which are compared using bytes.Equal and -// floating point values which specially treat NaNs as equal. -// Message values are compared by recursively calling Equal. -// Lists are equal if each element value is also equal. -// Maps are equal if they have the same set of keys, where the pair of values -// for each key is also equal. -func Equal(x, y Message) bool { - return protoV2.Equal(MessageV2(x), MessageV2(y)) -} - -func isMessageSet(md protoreflect.MessageDescriptor) bool { - ms, ok := md.(interface{ IsMessageSet() bool }) - return ok && ms.IsMessageSet() -} diff --git a/vendor/github.com/golang/protobuf/proto/registry.go b/vendor/github.com/golang/protobuf/proto/registry.go deleted file mode 100644 index 066b4323b4..0000000000 --- a/vendor/github.com/golang/protobuf/proto/registry.go +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "bytes" - "compress/gzip" - "fmt" - "io/ioutil" - "reflect" - "strings" - "sync" - - "google.golang.org/protobuf/reflect/protodesc" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" - "google.golang.org/protobuf/runtime/protoimpl" -) - -// filePath is the path to the proto source file. -type filePath = string // e.g., "google/protobuf/descriptor.proto" - -// fileDescGZIP is the compressed contents of the encoded FileDescriptorProto. -type fileDescGZIP = []byte - -var fileCache sync.Map // map[filePath]fileDescGZIP - -// RegisterFile is called from generated code to register the compressed -// FileDescriptorProto with the file path for a proto source file. -// -// Deprecated: Use protoregistry.GlobalFiles.RegisterFile instead. -func RegisterFile(s filePath, d fileDescGZIP) { - // Decompress the descriptor. - zr, err := gzip.NewReader(bytes.NewReader(d)) - if err != nil { - panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err)) - } - b, err := ioutil.ReadAll(zr) - if err != nil { - panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err)) - } - - // Construct a protoreflect.FileDescriptor from the raw descriptor. - // Note that DescBuilder.Build automatically registers the constructed - // file descriptor with the v2 registry. - protoimpl.DescBuilder{RawDescriptor: b}.Build() - - // Locally cache the raw descriptor form for the file. - fileCache.Store(s, d) -} - -// FileDescriptor returns the compressed FileDescriptorProto given the file path -// for a proto source file. It returns nil if not found. -// -// Deprecated: Use protoregistry.GlobalFiles.FindFileByPath instead. -func FileDescriptor(s filePath) fileDescGZIP { - if v, ok := fileCache.Load(s); ok { - return v.(fileDescGZIP) - } - - // Find the descriptor in the v2 registry. - var b []byte - if fd, _ := protoregistry.GlobalFiles.FindFileByPath(s); fd != nil { - b, _ = Marshal(protodesc.ToFileDescriptorProto(fd)) - } - - // Locally cache the raw descriptor form for the file. - if len(b) > 0 { - v, _ := fileCache.LoadOrStore(s, protoimpl.X.CompressGZIP(b)) - return v.(fileDescGZIP) - } - return nil -} - -// enumName is the name of an enum. For historical reasons, the enum name is -// neither the full Go name nor the full protobuf name of the enum. -// The name is the dot-separated combination of just the proto package that the -// enum is declared within followed by the Go type name of the generated enum. -type enumName = string // e.g., "my.proto.package.GoMessage_GoEnum" - -// enumsByName maps enum values by name to their numeric counterpart. -type enumsByName = map[string]int32 - -// enumsByNumber maps enum values by number to their name counterpart. -type enumsByNumber = map[int32]string - -var enumCache sync.Map // map[enumName]enumsByName -var numFilesCache sync.Map // map[protoreflect.FullName]int - -// RegisterEnum is called from the generated code to register the mapping of -// enum value names to enum numbers for the enum identified by s. -// -// Deprecated: Use protoregistry.GlobalTypes.RegisterEnum instead. -func RegisterEnum(s enumName, _ enumsByNumber, m enumsByName) { - if _, ok := enumCache.Load(s); ok { - panic("proto: duplicate enum registered: " + s) - } - enumCache.Store(s, m) - - // This does not forward registration to the v2 registry since this API - // lacks sufficient information to construct a complete v2 enum descriptor. -} - -// EnumValueMap returns the mapping from enum value names to enum numbers for -// the enum of the given name. It returns nil if not found. -// -// Deprecated: Use protoregistry.GlobalTypes.FindEnumByName instead. -func EnumValueMap(s enumName) enumsByName { - if v, ok := enumCache.Load(s); ok { - return v.(enumsByName) - } - - // Check whether the cache is stale. If the number of files in the current - // package differs, then it means that some enums may have been recently - // registered upstream that we do not know about. - var protoPkg protoreflect.FullName - if i := strings.LastIndexByte(s, '.'); i >= 0 { - protoPkg = protoreflect.FullName(s[:i]) - } - v, _ := numFilesCache.Load(protoPkg) - numFiles, _ := v.(int) - if protoregistry.GlobalFiles.NumFilesByPackage(protoPkg) == numFiles { - return nil // cache is up-to-date; was not found earlier - } - - // Update the enum cache for all enums declared in the given proto package. - numFiles = 0 - protoregistry.GlobalFiles.RangeFilesByPackage(protoPkg, func(fd protoreflect.FileDescriptor) bool { - walkEnums(fd, func(ed protoreflect.EnumDescriptor) { - name := protoimpl.X.LegacyEnumName(ed) - if _, ok := enumCache.Load(name); !ok { - m := make(enumsByName) - evs := ed.Values() - for i := evs.Len() - 1; i >= 0; i-- { - ev := evs.Get(i) - m[string(ev.Name())] = int32(ev.Number()) - } - enumCache.LoadOrStore(name, m) - } - }) - numFiles++ - return true - }) - numFilesCache.Store(protoPkg, numFiles) - - // Check cache again for enum map. - if v, ok := enumCache.Load(s); ok { - return v.(enumsByName) - } - return nil -} - -// walkEnums recursively walks all enums declared in d. -func walkEnums(d interface { - Enums() protoreflect.EnumDescriptors - Messages() protoreflect.MessageDescriptors -}, f func(protoreflect.EnumDescriptor)) { - eds := d.Enums() - for i := eds.Len() - 1; i >= 0; i-- { - f(eds.Get(i)) - } - mds := d.Messages() - for i := mds.Len() - 1; i >= 0; i-- { - walkEnums(mds.Get(i), f) - } -} - -// messageName is the full name of protobuf message. -type messageName = string - -var messageTypeCache sync.Map // map[messageName]reflect.Type - -// RegisterType is called from generated code to register the message Go type -// for a message of the given name. -// -// Deprecated: Use protoregistry.GlobalTypes.RegisterMessage instead. -func RegisterType(m Message, s messageName) { - mt := protoimpl.X.LegacyMessageTypeOf(m, protoreflect.FullName(s)) - if err := protoregistry.GlobalTypes.RegisterMessage(mt); err != nil { - panic(err) - } - messageTypeCache.Store(s, reflect.TypeOf(m)) -} - -// RegisterMapType is called from generated code to register the Go map type -// for a protobuf message representing a map entry. -// -// Deprecated: Do not use. -func RegisterMapType(m interface{}, s messageName) { - t := reflect.TypeOf(m) - if t.Kind() != reflect.Map { - panic(fmt.Sprintf("invalid map kind: %v", t)) - } - if _, ok := messageTypeCache.Load(s); ok { - panic(fmt.Errorf("proto: duplicate proto message registered: %s", s)) - } - messageTypeCache.Store(s, t) -} - -// MessageType returns the message type for a named message. -// It returns nil if not found. -// -// Deprecated: Use protoregistry.GlobalTypes.FindMessageByName instead. -func MessageType(s messageName) reflect.Type { - if v, ok := messageTypeCache.Load(s); ok { - return v.(reflect.Type) - } - - // Derive the message type from the v2 registry. - var t reflect.Type - if mt, _ := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName(s)); mt != nil { - t = messageGoType(mt) - } - - // If we could not get a concrete type, it is possible that it is a - // pseudo-message for a map entry. - if t == nil { - d, _ := protoregistry.GlobalFiles.FindDescriptorByName(protoreflect.FullName(s)) - if md, _ := d.(protoreflect.MessageDescriptor); md != nil && md.IsMapEntry() { - kt := goTypeForField(md.Fields().ByNumber(1)) - vt := goTypeForField(md.Fields().ByNumber(2)) - t = reflect.MapOf(kt, vt) - } - } - - // Locally cache the message type for the given name. - if t != nil { - v, _ := messageTypeCache.LoadOrStore(s, t) - return v.(reflect.Type) - } - return nil -} - -func goTypeForField(fd protoreflect.FieldDescriptor) reflect.Type { - switch k := fd.Kind(); k { - case protoreflect.EnumKind: - if et, _ := protoregistry.GlobalTypes.FindEnumByName(fd.Enum().FullName()); et != nil { - return enumGoType(et) - } - return reflect.TypeOf(protoreflect.EnumNumber(0)) - case protoreflect.MessageKind, protoreflect.GroupKind: - if mt, _ := protoregistry.GlobalTypes.FindMessageByName(fd.Message().FullName()); mt != nil { - return messageGoType(mt) - } - return reflect.TypeOf((*protoreflect.Message)(nil)).Elem() - default: - return reflect.TypeOf(fd.Default().Interface()) - } -} - -func enumGoType(et protoreflect.EnumType) reflect.Type { - return reflect.TypeOf(et.New(0)) -} - -func messageGoType(mt protoreflect.MessageType) reflect.Type { - return reflect.TypeOf(MessageV1(mt.Zero().Interface())) -} - -// MessageName returns the full protobuf name for the given message type. -// -// Deprecated: Use protoreflect.MessageDescriptor.FullName instead. -func MessageName(m Message) messageName { - if m == nil { - return "" - } - if m, ok := m.(interface{ XXX_MessageName() messageName }); ok { - return m.XXX_MessageName() - } - return messageName(protoimpl.X.MessageDescriptorOf(m).FullName()) -} - -// RegisterExtension is called from the generated code to register -// the extension descriptor. -// -// Deprecated: Use protoregistry.GlobalTypes.RegisterExtension instead. -func RegisterExtension(d *ExtensionDesc) { - if err := protoregistry.GlobalTypes.RegisterExtension(d); err != nil { - panic(err) - } -} - -type extensionsByNumber = map[int32]*ExtensionDesc - -var extensionCache sync.Map // map[messageName]extensionsByNumber - -// RegisteredExtensions returns a map of the registered extensions for the -// provided protobuf message, indexed by the extension field number. -// -// Deprecated: Use protoregistry.GlobalTypes.RangeExtensionsByMessage instead. -func RegisteredExtensions(m Message) extensionsByNumber { - // Check whether the cache is stale. If the number of extensions for - // the given message differs, then it means that some extensions were - // recently registered upstream that we do not know about. - s := MessageName(m) - v, _ := extensionCache.Load(s) - xs, _ := v.(extensionsByNumber) - if protoregistry.GlobalTypes.NumExtensionsByMessage(protoreflect.FullName(s)) == len(xs) { - return xs // cache is up-to-date - } - - // Cache is stale, re-compute the extensions map. - xs = make(extensionsByNumber) - protoregistry.GlobalTypes.RangeExtensionsByMessage(protoreflect.FullName(s), func(xt protoreflect.ExtensionType) bool { - if xd, ok := xt.(*ExtensionDesc); ok { - xs[int32(xt.TypeDescriptor().Number())] = xd - } else { - // TODO: This implies that the protoreflect.ExtensionType is a - // custom type not generated by protoc-gen-go. We could try and - // convert the type to an ExtensionDesc. - } - return true - }) - extensionCache.Store(s, xs) - return xs -} diff --git a/vendor/github.com/golang/protobuf/proto/text_decode.go b/vendor/github.com/golang/protobuf/proto/text_decode.go deleted file mode 100644 index 47eb3e4450..0000000000 --- a/vendor/github.com/golang/protobuf/proto/text_decode.go +++ /dev/null @@ -1,801 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "unicode/utf8" - - "google.golang.org/protobuf/encoding/prototext" - protoV2 "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" -) - -const wrapTextUnmarshalV2 = false - -// ParseError is returned by UnmarshalText. -type ParseError struct { - Message string - - // Deprecated: Do not use. - Line, Offset int -} - -func (e *ParseError) Error() string { - if wrapTextUnmarshalV2 { - return e.Message - } - if e.Line == 1 { - return fmt.Sprintf("line 1.%d: %v", e.Offset, e.Message) - } - return fmt.Sprintf("line %d: %v", e.Line, e.Message) -} - -// UnmarshalText parses a proto text formatted string into m. -func UnmarshalText(s string, m Message) error { - if u, ok := m.(encoding.TextUnmarshaler); ok { - return u.UnmarshalText([]byte(s)) - } - - m.Reset() - mi := MessageV2(m) - - if wrapTextUnmarshalV2 { - err := prototext.UnmarshalOptions{ - AllowPartial: true, - }.Unmarshal([]byte(s), mi) - if err != nil { - return &ParseError{Message: err.Error()} - } - return checkRequiredNotSet(mi) - } else { - if err := newTextParser(s).unmarshalMessage(mi.ProtoReflect(), ""); err != nil { - return err - } - return checkRequiredNotSet(mi) - } -} - -type textParser struct { - s string // remaining input - done bool // whether the parsing is finished (success or error) - backed bool // whether back() was called - offset, line int - cur token -} - -type token struct { - value string - err *ParseError - line int // line number - offset int // byte number from start of input, not start of line - unquoted string // the unquoted version of value, if it was a quoted string -} - -func newTextParser(s string) *textParser { - p := new(textParser) - p.s = s - p.line = 1 - p.cur.line = 1 - return p -} - -func (p *textParser) unmarshalMessage(m protoreflect.Message, terminator string) (err error) { - md := m.Descriptor() - fds := md.Fields() - - // A struct is a sequence of "name: value", terminated by one of - // '>' or '}', or the end of the input. A name may also be - // "[extension]" or "[type/url]". - // - // The whole struct can also be an expanded Any message, like: - // [type/url] < ... struct contents ... > - seen := make(map[protoreflect.FieldNumber]bool) - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - if tok.value == "[" { - if err := p.unmarshalExtensionOrAny(m, seen); err != nil { - return err - } - continue - } - - // This is a normal, non-extension field. - name := protoreflect.Name(tok.value) - fd := fds.ByName(name) - switch { - case fd == nil: - gd := fds.ByName(protoreflect.Name(strings.ToLower(string(name)))) - if gd != nil && gd.Kind() == protoreflect.GroupKind && gd.Message().Name() == name { - fd = gd - } - case fd.Kind() == protoreflect.GroupKind && fd.Message().Name() != name: - fd = nil - case fd.IsWeak() && fd.Message().IsPlaceholder(): - fd = nil - } - if fd == nil { - typeName := string(md.FullName()) - if m, ok := m.Interface().(Message); ok { - t := reflect.TypeOf(m) - if t.Kind() == reflect.Ptr { - typeName = t.Elem().String() - } - } - return p.errorf("unknown field name %q in %v", name, typeName) - } - if od := fd.ContainingOneof(); od != nil && m.WhichOneof(od) != nil { - return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, od.Name()) - } - if fd.Cardinality() != protoreflect.Repeated && seen[fd.Number()] { - return p.errorf("non-repeated field %q was repeated", fd.Name()) - } - seen[fd.Number()] = true - - // Consume any colon. - if err := p.checkForColon(fd); err != nil { - return err - } - - // Parse into the field. - v := m.Get(fd) - if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) { - v = m.Mutable(fd) - } - if v, err = p.unmarshalValue(v, fd); err != nil { - return err - } - m.Set(fd, v) - - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - } - return nil -} - -func (p *textParser) unmarshalExtensionOrAny(m protoreflect.Message, seen map[protoreflect.FieldNumber]bool) error { - name, err := p.consumeExtensionOrAnyName() - if err != nil { - return err - } - - // If it contains a slash, it's an Any type URL. - if slashIdx := strings.LastIndex(name, "/"); slashIdx >= 0 { - tok := p.next() - if tok.err != nil { - return tok.err - } - // consume an optional colon - if tok.value == ":" { - tok = p.next() - if tok.err != nil { - return tok.err - } - } - - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - - mt, err := protoregistry.GlobalTypes.FindMessageByURL(name) - if err != nil { - return p.errorf("unrecognized message %q in google.protobuf.Any", name[slashIdx+len("/"):]) - } - m2 := mt.New() - if err := p.unmarshalMessage(m2, terminator); err != nil { - return err - } - b, err := protoV2.Marshal(m2.Interface()) - if err != nil { - return p.errorf("failed to marshal message of type %q: %v", name[slashIdx+len("/"):], err) - } - - urlFD := m.Descriptor().Fields().ByName("type_url") - valFD := m.Descriptor().Fields().ByName("value") - if seen[urlFD.Number()] { - return p.errorf("Any message unpacked multiple times, or %q already set", urlFD.Name()) - } - if seen[valFD.Number()] { - return p.errorf("Any message unpacked multiple times, or %q already set", valFD.Name()) - } - m.Set(urlFD, protoreflect.ValueOfString(name)) - m.Set(valFD, protoreflect.ValueOfBytes(b)) - seen[urlFD.Number()] = true - seen[valFD.Number()] = true - return nil - } - - xname := protoreflect.FullName(name) - xt, _ := protoregistry.GlobalTypes.FindExtensionByName(xname) - if xt == nil && isMessageSet(m.Descriptor()) { - xt, _ = protoregistry.GlobalTypes.FindExtensionByName(xname.Append("message_set_extension")) - } - if xt == nil { - return p.errorf("unrecognized extension %q", name) - } - fd := xt.TypeDescriptor() - if fd.ContainingMessage().FullName() != m.Descriptor().FullName() { - return p.errorf("extension field %q does not extend message %q", name, m.Descriptor().FullName()) - } - - if err := p.checkForColon(fd); err != nil { - return err - } - - v := m.Get(fd) - if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) { - v = m.Mutable(fd) - } - v, err = p.unmarshalValue(v, fd) - if err != nil { - return err - } - m.Set(fd, v) - return p.consumeOptionalSeparator() -} - -func (p *textParser) unmarshalValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == "" { - return v, p.errorf("unexpected EOF") - } - - switch { - case fd.IsList(): - lv := v.List() - var err error - if tok.value == "[" { - // Repeated field with list notation, like [1,2,3]. - for { - vv := lv.NewElement() - vv, err = p.unmarshalSingularValue(vv, fd) - if err != nil { - return v, err - } - lv.Append(vv) - - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == "]" { - break - } - if tok.value != "," { - return v, p.errorf("Expected ']' or ',' found %q", tok.value) - } - } - return v, nil - } - - // One value of the repeated field. - p.back() - vv := lv.NewElement() - vv, err = p.unmarshalSingularValue(vv, fd) - if err != nil { - return v, err - } - lv.Append(vv) - return v, nil - case fd.IsMap(): - // The map entry should be this sequence of tokens: - // < key : KEY value : VALUE > - // However, implementations may omit key or value, and technically - // we should support them in any order. - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return v, p.errorf("expected '{' or '<', found %q", tok.value) - } - - keyFD := fd.MapKey() - valFD := fd.MapValue() - - mv := v.Map() - kv := keyFD.Default() - vv := mv.NewValue() - for { - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == terminator { - break - } - var err error - switch tok.value { - case "key": - if err := p.consumeToken(":"); err != nil { - return v, err - } - if kv, err = p.unmarshalSingularValue(kv, keyFD); err != nil { - return v, err - } - if err := p.consumeOptionalSeparator(); err != nil { - return v, err - } - case "value": - if err := p.checkForColon(valFD); err != nil { - return v, err - } - if vv, err = p.unmarshalSingularValue(vv, valFD); err != nil { - return v, err - } - if err := p.consumeOptionalSeparator(); err != nil { - return v, err - } - default: - p.back() - return v, p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) - } - } - mv.Set(kv.MapKey(), vv) - return v, nil - default: - p.back() - return p.unmarshalSingularValue(v, fd) - } -} - -func (p *textParser) unmarshalSingularValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { - tok := p.next() - if tok.err != nil { - return v, tok.err - } - if tok.value == "" { - return v, p.errorf("unexpected EOF") - } - - switch fd.Kind() { - case protoreflect.BoolKind: - switch tok.value { - case "true", "1", "t", "True": - return protoreflect.ValueOfBool(true), nil - case "false", "0", "f", "False": - return protoreflect.ValueOfBool(false), nil - } - case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfInt32(int32(x)), nil - } - - // The C++ parser accepts large positive hex numbers that uses - // two's complement arithmetic to represent negative numbers. - // This feature is here for backwards compatibility with C++. - if strings.HasPrefix(tok.value, "0x") { - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfInt32(int32(-(int64(^x) + 1))), nil - } - } - case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { - return protoreflect.ValueOfInt64(int64(x)), nil - } - - // The C++ parser accepts large positive hex numbers that uses - // two's complement arithmetic to represent negative numbers. - // This feature is here for backwards compatibility with C++. - if strings.HasPrefix(tok.value, "0x") { - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - return protoreflect.ValueOfInt64(int64(-(int64(^x) + 1))), nil - } - } - case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfUint32(uint32(x)), nil - } - case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - return protoreflect.ValueOfUint64(uint64(x)), nil - } - case protoreflect.FloatKind: - // Ignore 'f' for compatibility with output generated by C++, - // but don't remove 'f' when the value is "-inf" or "inf". - v := tok.value - if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" { - v = v[:len(v)-len("f")] - } - if x, err := strconv.ParseFloat(v, 32); err == nil { - return protoreflect.ValueOfFloat32(float32(x)), nil - } - case protoreflect.DoubleKind: - // Ignore 'f' for compatibility with output generated by C++, - // but don't remove 'f' when the value is "-inf" or "inf". - v := tok.value - if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" { - v = v[:len(v)-len("f")] - } - if x, err := strconv.ParseFloat(v, 64); err == nil { - return protoreflect.ValueOfFloat64(float64(x)), nil - } - case protoreflect.StringKind: - if isQuote(tok.value[0]) { - return protoreflect.ValueOfString(tok.unquoted), nil - } - case protoreflect.BytesKind: - if isQuote(tok.value[0]) { - return protoreflect.ValueOfBytes([]byte(tok.unquoted)), nil - } - case protoreflect.EnumKind: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - return protoreflect.ValueOfEnum(protoreflect.EnumNumber(x)), nil - } - vd := fd.Enum().Values().ByName(protoreflect.Name(tok.value)) - if vd != nil { - return protoreflect.ValueOfEnum(vd.Number()), nil - } - case protoreflect.MessageKind, protoreflect.GroupKind: - var terminator string - switch tok.value { - case "{": - terminator = "}" - case "<": - terminator = ">" - default: - return v, p.errorf("expected '{' or '<', found %q", tok.value) - } - err := p.unmarshalMessage(v.Message(), terminator) - return v, err - default: - panic(fmt.Sprintf("invalid kind %v", fd.Kind())) - } - return v, p.errorf("invalid %v: %v", fd.Kind(), tok.value) -} - -// Consume a ':' from the input stream (if the next token is a colon), -// returning an error if a colon is needed but not present. -func (p *textParser) checkForColon(fd protoreflect.FieldDescriptor) *ParseError { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ":" { - if fd.Message() == nil { - return p.errorf("expected ':', found %q", tok.value) - } - p.back() - } - return nil -} - -// consumeExtensionOrAnyName consumes an extension name or an Any type URL and -// the following ']'. It returns the name or URL consumed. -func (p *textParser) consumeExtensionOrAnyName() (string, error) { - tok := p.next() - if tok.err != nil { - return "", tok.err - } - - // If extension name or type url is quoted, it's a single token. - if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { - name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) - if err != nil { - return "", err - } - return name, p.consumeToken("]") - } - - // Consume everything up to "]" - var parts []string - for tok.value != "]" { - parts = append(parts, tok.value) - tok = p.next() - if tok.err != nil { - return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) - } - if p.done && tok.value != "]" { - return "", p.errorf("unclosed type_url or extension name") - } - } - return strings.Join(parts, ""), nil -} - -// consumeOptionalSeparator consumes an optional semicolon or comma. -// It is used in unmarshalMessage to provide backward compatibility. -func (p *textParser) consumeOptionalSeparator() error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ";" && tok.value != "," { - p.back() - } - return nil -} - -func (p *textParser) errorf(format string, a ...interface{}) *ParseError { - pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} - p.cur.err = pe - p.done = true - return pe -} - -func (p *textParser) skipWhitespace() { - i := 0 - for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { - if p.s[i] == '#' { - // comment; skip to end of line or input - for i < len(p.s) && p.s[i] != '\n' { - i++ - } - if i == len(p.s) { - break - } - } - if p.s[i] == '\n' { - p.line++ - } - i++ - } - p.offset += i - p.s = p.s[i:len(p.s)] - if len(p.s) == 0 { - p.done = true - } -} - -func (p *textParser) advance() { - // Skip whitespace - p.skipWhitespace() - if p.done { - return - } - - // Start of non-whitespace - p.cur.err = nil - p.cur.offset, p.cur.line = p.offset, p.line - p.cur.unquoted = "" - switch p.s[0] { - case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': - // Single symbol - p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] - case '"', '\'': - // Quoted string - i := 1 - for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { - if p.s[i] == '\\' && i+1 < len(p.s) { - // skip escaped char - i++ - } - i++ - } - if i >= len(p.s) || p.s[i] != p.s[0] { - p.errorf("unmatched quote") - return - } - unq, err := unquoteC(p.s[1:i], rune(p.s[0])) - if err != nil { - p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) - return - } - p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] - p.cur.unquoted = unq - default: - i := 0 - for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { - i++ - } - if i == 0 { - p.errorf("unexpected byte %#x", p.s[0]) - return - } - p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] - } - p.offset += len(p.cur.value) -} - -// Back off the parser by one token. Can only be done between calls to next(). -// It makes the next advance() a no-op. -func (p *textParser) back() { p.backed = true } - -// Advances the parser and returns the new current token. -func (p *textParser) next() *token { - if p.backed || p.done { - p.backed = false - return &p.cur - } - p.advance() - if p.done { - p.cur.value = "" - } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { - // Look for multiple quoted strings separated by whitespace, - // and concatenate them. - cat := p.cur - for { - p.skipWhitespace() - if p.done || !isQuote(p.s[0]) { - break - } - p.advance() - if p.cur.err != nil { - return &p.cur - } - cat.value += " " + p.cur.value - cat.unquoted += p.cur.unquoted - } - p.done = false // parser may have seen EOF, but we want to return cat - p.cur = cat - } - return &p.cur -} - -func (p *textParser) consumeToken(s string) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != s { - p.back() - return p.errorf("expected %q, found %q", s, tok.value) - } - return nil -} - -var errBadUTF8 = errors.New("proto: bad UTF-8") - -func unquoteC(s string, quote rune) (string, error) { - // This is based on C++'s tokenizer.cc. - // Despite its name, this is *not* parsing C syntax. - // For instance, "\0" is an invalid quoted string. - - // Avoid allocation in trivial cases. - simple := true - for _, r := range s { - if r == '\\' || r == quote { - simple = false - break - } - } - if simple { - return s, nil - } - - buf := make([]byte, 0, 3*len(s)/2) - for len(s) > 0 { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", errBadUTF8 - } - s = s[n:] - if r != '\\' { - if r < utf8.RuneSelf { - buf = append(buf, byte(r)) - } else { - buf = append(buf, string(r)...) - } - continue - } - - ch, tail, err := unescape(s) - if err != nil { - return "", err - } - buf = append(buf, ch...) - s = tail - } - return string(buf), nil -} - -func unescape(s string) (ch string, tail string, err error) { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", "", errBadUTF8 - } - s = s[n:] - switch r { - case 'a': - return "\a", s, nil - case 'b': - return "\b", s, nil - case 'f': - return "\f", s, nil - case 'n': - return "\n", s, nil - case 'r': - return "\r", s, nil - case 't': - return "\t", s, nil - case 'v': - return "\v", s, nil - case '?': - return "?", s, nil // trigraph workaround - case '\'', '"', '\\': - return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7': - if len(s) < 2 { - return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) - } - ss := string(r) + s[:2] - s = s[2:] - i, err := strconv.ParseUint(ss, 8, 8) - if err != nil { - return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) - } - return string([]byte{byte(i)}), s, nil - case 'x', 'X', 'u', 'U': - var n int - switch r { - case 'x', 'X': - n = 2 - case 'u': - n = 4 - case 'U': - n = 8 - } - if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) - } - ss := s[:n] - s = s[n:] - i, err := strconv.ParseUint(ss, 16, 64) - if err != nil { - return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) - } - if r == 'x' || r == 'X' { - return string([]byte{byte(i)}), s, nil - } - if i > utf8.MaxRune { - return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) - } - return string(rune(i)), s, nil - } - return "", "", fmt.Errorf(`unknown escape \%c`, r) -} - -func isIdentOrNumberChar(c byte) bool { - switch { - case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': - return true - case '0' <= c && c <= '9': - return true - } - switch c { - case '-', '+', '.', '_': - return true - } - return false -} - -func isWhitespace(c byte) bool { - switch c { - case ' ', '\t', '\n', '\r': - return true - } - return false -} - -func isQuote(c byte) bool { - switch c { - case '"', '\'': - return true - } - return false -} diff --git a/vendor/github.com/golang/protobuf/proto/text_encode.go b/vendor/github.com/golang/protobuf/proto/text_encode.go deleted file mode 100644 index a31134eeb3..0000000000 --- a/vendor/github.com/golang/protobuf/proto/text_encode.go +++ /dev/null @@ -1,560 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - "bytes" - "encoding" - "fmt" - "io" - "math" - "sort" - "strings" - - "google.golang.org/protobuf/encoding/prototext" - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/reflect/protoregistry" -) - -const wrapTextMarshalV2 = false - -// TextMarshaler is a configurable text format marshaler. -type TextMarshaler struct { - Compact bool // use compact text format (one line) - ExpandAny bool // expand google.protobuf.Any messages of known types -} - -// Marshal writes the proto text format of m to w. -func (tm *TextMarshaler) Marshal(w io.Writer, m Message) error { - b, err := tm.marshal(m) - if len(b) > 0 { - if _, err := w.Write(b); err != nil { - return err - } - } - return err -} - -// Text returns a proto text formatted string of m. -func (tm *TextMarshaler) Text(m Message) string { - b, _ := tm.marshal(m) - return string(b) -} - -func (tm *TextMarshaler) marshal(m Message) ([]byte, error) { - mr := MessageReflect(m) - if mr == nil || !mr.IsValid() { - return []byte(""), nil - } - - if wrapTextMarshalV2 { - if m, ok := m.(encoding.TextMarshaler); ok { - return m.MarshalText() - } - - opts := prototext.MarshalOptions{ - AllowPartial: true, - EmitUnknown: true, - } - if !tm.Compact { - opts.Indent = " " - } - if !tm.ExpandAny { - opts.Resolver = (*protoregistry.Types)(nil) - } - return opts.Marshal(mr.Interface()) - } else { - w := &textWriter{ - compact: tm.Compact, - expandAny: tm.ExpandAny, - complete: true, - } - - if m, ok := m.(encoding.TextMarshaler); ok { - b, err := m.MarshalText() - if err != nil { - return nil, err - } - w.Write(b) - return w.buf, nil - } - - err := w.writeMessage(mr) - return w.buf, err - } -} - -var ( - defaultTextMarshaler = TextMarshaler{} - compactTextMarshaler = TextMarshaler{Compact: true} -) - -// MarshalText writes the proto text format of m to w. -func MarshalText(w io.Writer, m Message) error { return defaultTextMarshaler.Marshal(w, m) } - -// MarshalTextString returns a proto text formatted string of m. -func MarshalTextString(m Message) string { return defaultTextMarshaler.Text(m) } - -// CompactText writes the compact proto text format of m to w. -func CompactText(w io.Writer, m Message) error { return compactTextMarshaler.Marshal(w, m) } - -// CompactTextString returns a compact proto text formatted string of m. -func CompactTextString(m Message) string { return compactTextMarshaler.Text(m) } - -var ( - newline = []byte("\n") - endBraceNewline = []byte("}\n") - posInf = []byte("inf") - negInf = []byte("-inf") - nan = []byte("nan") -) - -// textWriter is an io.Writer that tracks its indentation level. -type textWriter struct { - compact bool // same as TextMarshaler.Compact - expandAny bool // same as TextMarshaler.ExpandAny - complete bool // whether the current position is a complete line - indent int // indentation level; never negative - buf []byte -} - -func (w *textWriter) Write(p []byte) (n int, _ error) { - newlines := bytes.Count(p, newline) - if newlines == 0 { - if !w.compact && w.complete { - w.writeIndent() - } - w.buf = append(w.buf, p...) - w.complete = false - return len(p), nil - } - - frags := bytes.SplitN(p, newline, newlines+1) - if w.compact { - for i, frag := range frags { - if i > 0 { - w.buf = append(w.buf, ' ') - n++ - } - w.buf = append(w.buf, frag...) - n += len(frag) - } - return n, nil - } - - for i, frag := range frags { - if w.complete { - w.writeIndent() - } - w.buf = append(w.buf, frag...) - n += len(frag) - if i+1 < len(frags) { - w.buf = append(w.buf, '\n') - n++ - } - } - w.complete = len(frags[len(frags)-1]) == 0 - return n, nil -} - -func (w *textWriter) WriteByte(c byte) error { - if w.compact && c == '\n' { - c = ' ' - } - if !w.compact && w.complete { - w.writeIndent() - } - w.buf = append(w.buf, c) - w.complete = c == '\n' - return nil -} - -func (w *textWriter) writeName(fd protoreflect.FieldDescriptor) { - if !w.compact && w.complete { - w.writeIndent() - } - w.complete = false - - if fd.Kind() != protoreflect.GroupKind { - w.buf = append(w.buf, fd.Name()...) - w.WriteByte(':') - } else { - // Use message type name for group field name. - w.buf = append(w.buf, fd.Message().Name()...) - } - - if !w.compact { - w.WriteByte(' ') - } -} - -func requiresQuotes(u string) bool { - // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. - for _, ch := range u { - switch { - case ch == '.' || ch == '/' || ch == '_': - continue - case '0' <= ch && ch <= '9': - continue - case 'A' <= ch && ch <= 'Z': - continue - case 'a' <= ch && ch <= 'z': - continue - default: - return true - } - } - return false -} - -// writeProto3Any writes an expanded google.protobuf.Any message. -// -// It returns (false, nil) if sv value can't be unmarshaled (e.g. because -// required messages are not linked in). -// -// It returns (true, error) when sv was written in expanded format or an error -// was encountered. -func (w *textWriter) writeProto3Any(m protoreflect.Message) (bool, error) { - md := m.Descriptor() - fdURL := md.Fields().ByName("type_url") - fdVal := md.Fields().ByName("value") - - url := m.Get(fdURL).String() - mt, err := protoregistry.GlobalTypes.FindMessageByURL(url) - if err != nil { - return false, nil - } - - b := m.Get(fdVal).Bytes() - m2 := mt.New() - if err := proto.Unmarshal(b, m2.Interface()); err != nil { - return false, nil - } - w.Write([]byte("[")) - if requiresQuotes(url) { - w.writeQuotedString(url) - } else { - w.Write([]byte(url)) - } - if w.compact { - w.Write([]byte("]:<")) - } else { - w.Write([]byte("]: <\n")) - w.indent++ - } - if err := w.writeMessage(m2); err != nil { - return true, err - } - if w.compact { - w.Write([]byte("> ")) - } else { - w.indent-- - w.Write([]byte(">\n")) - } - return true, nil -} - -func (w *textWriter) writeMessage(m protoreflect.Message) error { - md := m.Descriptor() - if w.expandAny && md.FullName() == "google.protobuf.Any" { - if canExpand, err := w.writeProto3Any(m); canExpand { - return err - } - } - - fds := md.Fields() - for i := 0; i < fds.Len(); { - fd := fds.Get(i) - if od := fd.ContainingOneof(); od != nil { - fd = m.WhichOneof(od) - i += od.Fields().Len() - } else { - i++ - } - if fd == nil || !m.Has(fd) { - continue - } - - switch { - case fd.IsList(): - lv := m.Get(fd).List() - for j := 0; j < lv.Len(); j++ { - w.writeName(fd) - v := lv.Get(j) - if err := w.writeSingularValue(v, fd); err != nil { - return err - } - w.WriteByte('\n') - } - case fd.IsMap(): - kfd := fd.MapKey() - vfd := fd.MapValue() - mv := m.Get(fd).Map() - - type entry struct{ key, val protoreflect.Value } - var entries []entry - mv.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool { - entries = append(entries, entry{k.Value(), v}) - return true - }) - sort.Slice(entries, func(i, j int) bool { - switch kfd.Kind() { - case protoreflect.BoolKind: - return !entries[i].key.Bool() && entries[j].key.Bool() - case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: - return entries[i].key.Int() < entries[j].key.Int() - case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind: - return entries[i].key.Uint() < entries[j].key.Uint() - case protoreflect.StringKind: - return entries[i].key.String() < entries[j].key.String() - default: - panic("invalid kind") - } - }) - for _, entry := range entries { - w.writeName(fd) - w.WriteByte('<') - if !w.compact { - w.WriteByte('\n') - } - w.indent++ - w.writeName(kfd) - if err := w.writeSingularValue(entry.key, kfd); err != nil { - return err - } - w.WriteByte('\n') - w.writeName(vfd) - if err := w.writeSingularValue(entry.val, vfd); err != nil { - return err - } - w.WriteByte('\n') - w.indent-- - w.WriteByte('>') - w.WriteByte('\n') - } - default: - w.writeName(fd) - if err := w.writeSingularValue(m.Get(fd), fd); err != nil { - return err - } - w.WriteByte('\n') - } - } - - if b := m.GetUnknown(); len(b) > 0 { - w.writeUnknownFields(b) - } - return w.writeExtensions(m) -} - -func (w *textWriter) writeSingularValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) error { - switch fd.Kind() { - case protoreflect.FloatKind, protoreflect.DoubleKind: - switch vf := v.Float(); { - case math.IsInf(vf, +1): - w.Write(posInf) - case math.IsInf(vf, -1): - w.Write(negInf) - case math.IsNaN(vf): - w.Write(nan) - default: - fmt.Fprint(w, v.Interface()) - } - case protoreflect.StringKind: - // NOTE: This does not validate UTF-8 for historical reasons. - w.writeQuotedString(string(v.String())) - case protoreflect.BytesKind: - w.writeQuotedString(string(v.Bytes())) - case protoreflect.MessageKind, protoreflect.GroupKind: - var bra, ket byte = '<', '>' - if fd.Kind() == protoreflect.GroupKind { - bra, ket = '{', '}' - } - w.WriteByte(bra) - if !w.compact { - w.WriteByte('\n') - } - w.indent++ - m := v.Message() - if m2, ok := m.Interface().(encoding.TextMarshaler); ok { - b, err := m2.MarshalText() - if err != nil { - return err - } - w.Write(b) - } else { - w.writeMessage(m) - } - w.indent-- - w.WriteByte(ket) - case protoreflect.EnumKind: - if ev := fd.Enum().Values().ByNumber(v.Enum()); ev != nil { - fmt.Fprint(w, ev.Name()) - } else { - fmt.Fprint(w, v.Enum()) - } - default: - fmt.Fprint(w, v.Interface()) - } - return nil -} - -// writeQuotedString writes a quoted string in the protocol buffer text format. -func (w *textWriter) writeQuotedString(s string) { - w.WriteByte('"') - for i := 0; i < len(s); i++ { - switch c := s[i]; c { - case '\n': - w.buf = append(w.buf, `\n`...) - case '\r': - w.buf = append(w.buf, `\r`...) - case '\t': - w.buf = append(w.buf, `\t`...) - case '"': - w.buf = append(w.buf, `\"`...) - case '\\': - w.buf = append(w.buf, `\\`...) - default: - if isPrint := c >= 0x20 && c < 0x7f; isPrint { - w.buf = append(w.buf, c) - } else { - w.buf = append(w.buf, fmt.Sprintf(`\%03o`, c)...) - } - } - } - w.WriteByte('"') -} - -func (w *textWriter) writeUnknownFields(b []byte) { - if !w.compact { - fmt.Fprintf(w, "/* %d unknown bytes */\n", len(b)) - } - - for len(b) > 0 { - num, wtyp, n := protowire.ConsumeTag(b) - if n < 0 { - return - } - b = b[n:] - - if wtyp == protowire.EndGroupType { - w.indent-- - w.Write(endBraceNewline) - continue - } - fmt.Fprint(w, num) - if wtyp != protowire.StartGroupType { - w.WriteByte(':') - } - if !w.compact || wtyp == protowire.StartGroupType { - w.WriteByte(' ') - } - switch wtyp { - case protowire.VarintType: - v, n := protowire.ConsumeVarint(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprint(w, v) - case protowire.Fixed32Type: - v, n := protowire.ConsumeFixed32(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprint(w, v) - case protowire.Fixed64Type: - v, n := protowire.ConsumeFixed64(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprint(w, v) - case protowire.BytesType: - v, n := protowire.ConsumeBytes(b) - if n < 0 { - return - } - b = b[n:] - fmt.Fprintf(w, "%q", v) - case protowire.StartGroupType: - w.WriteByte('{') - w.indent++ - default: - fmt.Fprintf(w, "/* unknown wire type %d */", wtyp) - } - w.WriteByte('\n') - } -} - -// writeExtensions writes all the extensions in m. -func (w *textWriter) writeExtensions(m protoreflect.Message) error { - md := m.Descriptor() - if md.ExtensionRanges().Len() == 0 { - return nil - } - - type ext struct { - desc protoreflect.FieldDescriptor - val protoreflect.Value - } - var exts []ext - m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - if fd.IsExtension() { - exts = append(exts, ext{fd, v}) - } - return true - }) - sort.Slice(exts, func(i, j int) bool { - return exts[i].desc.Number() < exts[j].desc.Number() - }) - - for _, ext := range exts { - // For message set, use the name of the message as the extension name. - name := string(ext.desc.FullName()) - if isMessageSet(ext.desc.ContainingMessage()) { - name = strings.TrimSuffix(name, ".message_set_extension") - } - - if !ext.desc.IsList() { - if err := w.writeSingularExtension(name, ext.val, ext.desc); err != nil { - return err - } - } else { - lv := ext.val.List() - for i := 0; i < lv.Len(); i++ { - if err := w.writeSingularExtension(name, lv.Get(i), ext.desc); err != nil { - return err - } - } - } - } - return nil -} - -func (w *textWriter) writeSingularExtension(name string, v protoreflect.Value, fd protoreflect.FieldDescriptor) error { - fmt.Fprintf(w, "[%s]:", name) - if !w.compact { - w.WriteByte(' ') - } - if err := w.writeSingularValue(v, fd); err != nil { - return err - } - w.WriteByte('\n') - return nil -} - -func (w *textWriter) writeIndent() { - if !w.complete { - return - } - for i := 0; i < w.indent*2; i++ { - w.buf = append(w.buf, ' ') - } - w.complete = false -} diff --git a/vendor/github.com/golang/protobuf/proto/wire.go b/vendor/github.com/golang/protobuf/proto/wire.go deleted file mode 100644 index d7c28da5a7..0000000000 --- a/vendor/github.com/golang/protobuf/proto/wire.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -import ( - protoV2 "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/runtime/protoiface" -) - -// Size returns the size in bytes of the wire-format encoding of m. -func Size(m Message) int { - if m == nil { - return 0 - } - mi := MessageV2(m) - return protoV2.Size(mi) -} - -// Marshal returns the wire-format encoding of m. -func Marshal(m Message) ([]byte, error) { - b, err := marshalAppend(nil, m, false) - if b == nil { - b = zeroBytes - } - return b, err -} - -var zeroBytes = make([]byte, 0, 0) - -func marshalAppend(buf []byte, m Message, deterministic bool) ([]byte, error) { - if m == nil { - return nil, ErrNil - } - mi := MessageV2(m) - nbuf, err := protoV2.MarshalOptions{ - Deterministic: deterministic, - AllowPartial: true, - }.MarshalAppend(buf, mi) - if err != nil { - return buf, err - } - if len(buf) == len(nbuf) { - if !mi.ProtoReflect().IsValid() { - return buf, ErrNil - } - } - return nbuf, checkRequiredNotSet(mi) -} - -// Unmarshal parses a wire-format message in b and places the decoded results in m. -// -// Unmarshal resets m before starting to unmarshal, so any existing data in m is always -// removed. Use UnmarshalMerge to preserve and append to existing data. -func Unmarshal(b []byte, m Message) error { - m.Reset() - return UnmarshalMerge(b, m) -} - -// UnmarshalMerge parses a wire-format message in b and places the decoded results in m. -func UnmarshalMerge(b []byte, m Message) error { - mi := MessageV2(m) - out, err := protoV2.UnmarshalOptions{ - AllowPartial: true, - Merge: true, - }.UnmarshalState(protoiface.UnmarshalInput{ - Buf: b, - Message: mi.ProtoReflect(), - }) - if err != nil { - return err - } - if out.Flags&protoiface.UnmarshalInitialized > 0 { - return nil - } - return checkRequiredNotSet(mi) -} diff --git a/vendor/github.com/golang/protobuf/proto/wrappers.go b/vendor/github.com/golang/protobuf/proto/wrappers.go deleted file mode 100644 index 398e348599..0000000000 --- a/vendor/github.com/golang/protobuf/proto/wrappers.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proto - -// Bool stores v in a new bool value and returns a pointer to it. -func Bool(v bool) *bool { return &v } - -// Int stores v in a new int32 value and returns a pointer to it. -// -// Deprecated: Use Int32 instead. -func Int(v int) *int32 { return Int32(int32(v)) } - -// Int32 stores v in a new int32 value and returns a pointer to it. -func Int32(v int32) *int32 { return &v } - -// Int64 stores v in a new int64 value and returns a pointer to it. -func Int64(v int64) *int64 { return &v } - -// Uint32 stores v in a new uint32 value and returns a pointer to it. -func Uint32(v uint32) *uint32 { return &v } - -// Uint64 stores v in a new uint64 value and returns a pointer to it. -func Uint64(v uint64) *uint64 { return &v } - -// Float32 stores v in a new float32 value and returns a pointer to it. -func Float32(v float32) *float32 { return &v } - -// Float64 stores v in a new float64 value and returns a pointer to it. -func Float64(v float64) *float64 { return &v } - -// String stores v in a new string value and returns a pointer to it. -func String(v string) *string { return &v } diff --git a/vendor/github.com/golang/snappy/.gitignore b/vendor/github.com/golang/snappy/.gitignore deleted file mode 100644 index 042091d9b3..0000000000 --- a/vendor/github.com/golang/snappy/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -cmd/snappytool/snappytool -testdata/bench - -# These explicitly listed benchmark data files are for an obsolete version of -# snappy_test.go. -testdata/alice29.txt -testdata/asyoulik.txt -testdata/fireworks.jpeg -testdata/geo.protodata -testdata/html -testdata/html_x_4 -testdata/kppkn.gtb -testdata/lcet10.txt -testdata/paper-100k.pdf -testdata/plrabn12.txt -testdata/urls.10K diff --git a/vendor/github.com/golang/snappy/AUTHORS b/vendor/github.com/golang/snappy/AUTHORS deleted file mode 100644 index 52ccb5a934..0000000000 --- a/vendor/github.com/golang/snappy/AUTHORS +++ /dev/null @@ -1,18 +0,0 @@ -# This is the official list of Snappy-Go authors for copyright purposes. -# This file is distinct from the CONTRIBUTORS files. -# See the latter for an explanation. - -# Names should be added to this file as -# Name or Organization -# The email address is not required for organizations. - -# Please keep the list sorted. - -Amazon.com, Inc -Damian Gryski -Eric Buth -Google Inc. -Jan Mercl <0xjnml@gmail.com> -Klaus Post -Rodolfo Carvalho -Sebastien Binet diff --git a/vendor/github.com/golang/snappy/CONTRIBUTORS b/vendor/github.com/golang/snappy/CONTRIBUTORS deleted file mode 100644 index ea6524ddd0..0000000000 --- a/vendor/github.com/golang/snappy/CONTRIBUTORS +++ /dev/null @@ -1,41 +0,0 @@ -# This is the official list of people who can contribute -# (and typically have contributed) code to the Snappy-Go repository. -# The AUTHORS file lists the copyright holders; this file -# lists people. For example, Google employees are listed here -# but not in AUTHORS, because Google holds the copyright. -# -# The submission process automatically checks to make sure -# that people submitting code are listed in this file (by email address). -# -# Names should be added to this file only after verifying that -# the individual or the individual's organization has agreed to -# the appropriate Contributor License Agreement, found here: -# -# http://code.google.com/legal/individual-cla-v1.0.html -# http://code.google.com/legal/corporate-cla-v1.0.html -# -# The agreement for individuals can be filled out on the web. -# -# When adding J Random Contributor's name to this file, -# either J's name or J's organization's name should be -# added to the AUTHORS file, depending on whether the -# individual or corporate CLA was used. - -# Names should be added to this file like so: -# Name - -# Please keep the list sorted. - -Alex Legg -Damian Gryski -Eric Buth -Jan Mercl <0xjnml@gmail.com> -Jonathan Swinney -Kai Backman -Klaus Post -Marc-Antoine Ruel -Nigel Tao -Rob Pike -Rodolfo Carvalho -Russ Cox -Sebastien Binet diff --git a/vendor/github.com/golang/snappy/LICENSE b/vendor/github.com/golang/snappy/LICENSE deleted file mode 100644 index 6050c10f4c..0000000000 --- a/vendor/github.com/golang/snappy/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/golang/snappy/README b/vendor/github.com/golang/snappy/README deleted file mode 100644 index cea12879a0..0000000000 --- a/vendor/github.com/golang/snappy/README +++ /dev/null @@ -1,107 +0,0 @@ -The Snappy compression format in the Go programming language. - -To download and install from source: -$ go get github.com/golang/snappy - -Unless otherwise noted, the Snappy-Go source files are distributed -under the BSD-style license found in the LICENSE file. - - - -Benchmarks. - -The golang/snappy benchmarks include compressing (Z) and decompressing (U) ten -or so files, the same set used by the C++ Snappy code (github.com/google/snappy -and note the "google", not "golang"). On an "Intel(R) Core(TM) i7-3770 CPU @ -3.40GHz", Go's GOARCH=amd64 numbers as of 2016-05-29: - -"go test -test.bench=." - -_UFlat0-8 2.19GB/s ± 0% html -_UFlat1-8 1.41GB/s ± 0% urls -_UFlat2-8 23.5GB/s ± 2% jpg -_UFlat3-8 1.91GB/s ± 0% jpg_200 -_UFlat4-8 14.0GB/s ± 1% pdf -_UFlat5-8 1.97GB/s ± 0% html4 -_UFlat6-8 814MB/s ± 0% txt1 -_UFlat7-8 785MB/s ± 0% txt2 -_UFlat8-8 857MB/s ± 0% txt3 -_UFlat9-8 719MB/s ± 1% txt4 -_UFlat10-8 2.84GB/s ± 0% pb -_UFlat11-8 1.05GB/s ± 0% gaviota - -_ZFlat0-8 1.04GB/s ± 0% html -_ZFlat1-8 534MB/s ± 0% urls -_ZFlat2-8 15.7GB/s ± 1% jpg -_ZFlat3-8 740MB/s ± 3% jpg_200 -_ZFlat4-8 9.20GB/s ± 1% pdf -_ZFlat5-8 991MB/s ± 0% html4 -_ZFlat6-8 379MB/s ± 0% txt1 -_ZFlat7-8 352MB/s ± 0% txt2 -_ZFlat8-8 396MB/s ± 1% txt3 -_ZFlat9-8 327MB/s ± 1% txt4 -_ZFlat10-8 1.33GB/s ± 1% pb -_ZFlat11-8 605MB/s ± 1% gaviota - - - -"go test -test.bench=. -tags=noasm" - -_UFlat0-8 621MB/s ± 2% html -_UFlat1-8 494MB/s ± 1% urls -_UFlat2-8 23.2GB/s ± 1% jpg -_UFlat3-8 1.12GB/s ± 1% jpg_200 -_UFlat4-8 4.35GB/s ± 1% pdf -_UFlat5-8 609MB/s ± 0% html4 -_UFlat6-8 296MB/s ± 0% txt1 -_UFlat7-8 288MB/s ± 0% txt2 -_UFlat8-8 309MB/s ± 1% txt3 -_UFlat9-8 280MB/s ± 1% txt4 -_UFlat10-8 753MB/s ± 0% pb -_UFlat11-8 400MB/s ± 0% gaviota - -_ZFlat0-8 409MB/s ± 1% html -_ZFlat1-8 250MB/s ± 1% urls -_ZFlat2-8 12.3GB/s ± 1% jpg -_ZFlat3-8 132MB/s ± 0% jpg_200 -_ZFlat4-8 2.92GB/s ± 0% pdf -_ZFlat5-8 405MB/s ± 1% html4 -_ZFlat6-8 179MB/s ± 1% txt1 -_ZFlat7-8 170MB/s ± 1% txt2 -_ZFlat8-8 189MB/s ± 1% txt3 -_ZFlat9-8 164MB/s ± 1% txt4 -_ZFlat10-8 479MB/s ± 1% pb -_ZFlat11-8 270MB/s ± 1% gaviota - - - -For comparison (Go's encoded output is byte-for-byte identical to C++'s), here -are the numbers from C++ Snappy's - -make CXXFLAGS="-O2 -DNDEBUG -g" clean snappy_unittest.log && cat snappy_unittest.log - -BM_UFlat/0 2.4GB/s html -BM_UFlat/1 1.4GB/s urls -BM_UFlat/2 21.8GB/s jpg -BM_UFlat/3 1.5GB/s jpg_200 -BM_UFlat/4 13.3GB/s pdf -BM_UFlat/5 2.1GB/s html4 -BM_UFlat/6 1.0GB/s txt1 -BM_UFlat/7 959.4MB/s txt2 -BM_UFlat/8 1.0GB/s txt3 -BM_UFlat/9 864.5MB/s txt4 -BM_UFlat/10 2.9GB/s pb -BM_UFlat/11 1.2GB/s gaviota - -BM_ZFlat/0 944.3MB/s html (22.31 %) -BM_ZFlat/1 501.6MB/s urls (47.78 %) -BM_ZFlat/2 14.3GB/s jpg (99.95 %) -BM_ZFlat/3 538.3MB/s jpg_200 (73.00 %) -BM_ZFlat/4 8.3GB/s pdf (83.30 %) -BM_ZFlat/5 903.5MB/s html4 (22.52 %) -BM_ZFlat/6 336.0MB/s txt1 (57.88 %) -BM_ZFlat/7 312.3MB/s txt2 (61.91 %) -BM_ZFlat/8 353.1MB/s txt3 (54.99 %) -BM_ZFlat/9 289.9MB/s txt4 (66.26 %) -BM_ZFlat/10 1.2GB/s pb (19.68 %) -BM_ZFlat/11 527.4MB/s gaviota (37.72 %) diff --git a/vendor/github.com/golang/snappy/decode.go b/vendor/github.com/golang/snappy/decode.go deleted file mode 100644 index 23c6e26c6b..0000000000 --- a/vendor/github.com/golang/snappy/decode.go +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2011 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package snappy - -import ( - "encoding/binary" - "errors" - "io" -) - -var ( - // ErrCorrupt reports that the input is invalid. - ErrCorrupt = errors.New("snappy: corrupt input") - // ErrTooLarge reports that the uncompressed length is too large. - ErrTooLarge = errors.New("snappy: decoded block is too large") - // ErrUnsupported reports that the input isn't supported. - ErrUnsupported = errors.New("snappy: unsupported input") - - errUnsupportedLiteralLength = errors.New("snappy: unsupported literal length") -) - -// DecodedLen returns the length of the decoded block. -func DecodedLen(src []byte) (int, error) { - v, _, err := decodedLen(src) - return v, err -} - -// decodedLen returns the length of the decoded block and the number of bytes -// that the length header occupied. -func decodedLen(src []byte) (blockLen, headerLen int, err error) { - v, n := binary.Uvarint(src) - if n <= 0 || v > 0xffffffff { - return 0, 0, ErrCorrupt - } - - const wordSize = 32 << (^uint(0) >> 32 & 1) - if wordSize == 32 && v > 0x7fffffff { - return 0, 0, ErrTooLarge - } - return int(v), n, nil -} - -const ( - decodeErrCodeCorrupt = 1 - decodeErrCodeUnsupportedLiteralLength = 2 -) - -// Decode returns the decoded form of src. The returned slice may be a sub- -// slice of dst if dst was large enough to hold the entire decoded block. -// Otherwise, a newly allocated slice will be returned. -// -// The dst and src must not overlap. It is valid to pass a nil dst. -// -// Decode handles the Snappy block format, not the Snappy stream format. -func Decode(dst, src []byte) ([]byte, error) { - dLen, s, err := decodedLen(src) - if err != nil { - return nil, err - } - if dLen <= len(dst) { - dst = dst[:dLen] - } else { - dst = make([]byte, dLen) - } - switch decode(dst, src[s:]) { - case 0: - return dst, nil - case decodeErrCodeUnsupportedLiteralLength: - return nil, errUnsupportedLiteralLength - } - return nil, ErrCorrupt -} - -// NewReader returns a new Reader that decompresses from r, using the framing -// format described at -// https://github.com/google/snappy/blob/master/framing_format.txt -func NewReader(r io.Reader) *Reader { - return &Reader{ - r: r, - decoded: make([]byte, maxBlockSize), - buf: make([]byte, maxEncodedLenOfMaxBlockSize+checksumSize), - } -} - -// Reader is an io.Reader that can read Snappy-compressed bytes. -// -// Reader handles the Snappy stream format, not the Snappy block format. -type Reader struct { - r io.Reader - err error - decoded []byte - buf []byte - // decoded[i:j] contains decoded bytes that have not yet been passed on. - i, j int - readHeader bool -} - -// Reset discards any buffered data, resets all state, and switches the Snappy -// reader to read from r. This permits reusing a Reader rather than allocating -// a new one. -func (r *Reader) Reset(reader io.Reader) { - r.r = reader - r.err = nil - r.i = 0 - r.j = 0 - r.readHeader = false -} - -func (r *Reader) readFull(p []byte, allowEOF bool) (ok bool) { - if _, r.err = io.ReadFull(r.r, p); r.err != nil { - if r.err == io.ErrUnexpectedEOF || (r.err == io.EOF && !allowEOF) { - r.err = ErrCorrupt - } - return false - } - return true -} - -func (r *Reader) fill() error { - for r.i >= r.j { - if !r.readFull(r.buf[:4], true) { - return r.err - } - chunkType := r.buf[0] - if !r.readHeader { - if chunkType != chunkTypeStreamIdentifier { - r.err = ErrCorrupt - return r.err - } - r.readHeader = true - } - chunkLen := int(r.buf[1]) | int(r.buf[2])<<8 | int(r.buf[3])<<16 - if chunkLen > len(r.buf) { - r.err = ErrUnsupported - return r.err - } - - // The chunk types are specified at - // https://github.com/google/snappy/blob/master/framing_format.txt - switch chunkType { - case chunkTypeCompressedData: - // Section 4.2. Compressed data (chunk type 0x00). - if chunkLen < checksumSize { - r.err = ErrCorrupt - return r.err - } - buf := r.buf[:chunkLen] - if !r.readFull(buf, false) { - return r.err - } - checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 - buf = buf[checksumSize:] - - n, err := DecodedLen(buf) - if err != nil { - r.err = err - return r.err - } - if n > len(r.decoded) { - r.err = ErrCorrupt - return r.err - } - if _, err := Decode(r.decoded, buf); err != nil { - r.err = err - return r.err - } - if crc(r.decoded[:n]) != checksum { - r.err = ErrCorrupt - return r.err - } - r.i, r.j = 0, n - continue - - case chunkTypeUncompressedData: - // Section 4.3. Uncompressed data (chunk type 0x01). - if chunkLen < checksumSize { - r.err = ErrCorrupt - return r.err - } - buf := r.buf[:checksumSize] - if !r.readFull(buf, false) { - return r.err - } - checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 - // Read directly into r.decoded instead of via r.buf. - n := chunkLen - checksumSize - if n > len(r.decoded) { - r.err = ErrCorrupt - return r.err - } - if !r.readFull(r.decoded[:n], false) { - return r.err - } - if crc(r.decoded[:n]) != checksum { - r.err = ErrCorrupt - return r.err - } - r.i, r.j = 0, n - continue - - case chunkTypeStreamIdentifier: - // Section 4.1. Stream identifier (chunk type 0xff). - if chunkLen != len(magicBody) { - r.err = ErrCorrupt - return r.err - } - if !r.readFull(r.buf[:len(magicBody)], false) { - return r.err - } - for i := 0; i < len(magicBody); i++ { - if r.buf[i] != magicBody[i] { - r.err = ErrCorrupt - return r.err - } - } - continue - } - - if chunkType <= 0x7f { - // Section 4.5. Reserved unskippable chunks (chunk types 0x02-0x7f). - r.err = ErrUnsupported - return r.err - } - // Section 4.4 Padding (chunk type 0xfe). - // Section 4.6. Reserved skippable chunks (chunk types 0x80-0xfd). - if !r.readFull(r.buf[:chunkLen], false) { - return r.err - } - } - - return nil -} - -// Read satisfies the io.Reader interface. -func (r *Reader) Read(p []byte) (int, error) { - if r.err != nil { - return 0, r.err - } - - if err := r.fill(); err != nil { - return 0, err - } - - n := copy(p, r.decoded[r.i:r.j]) - r.i += n - return n, nil -} - -// ReadByte satisfies the io.ByteReader interface. -func (r *Reader) ReadByte() (byte, error) { - if r.err != nil { - return 0, r.err - } - - if err := r.fill(); err != nil { - return 0, err - } - - c := r.decoded[r.i] - r.i++ - return c, nil -} diff --git a/vendor/github.com/golang/snappy/decode_amd64.s b/vendor/github.com/golang/snappy/decode_amd64.s deleted file mode 100644 index e6179f65e3..0000000000 --- a/vendor/github.com/golang/snappy/decode_amd64.s +++ /dev/null @@ -1,490 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine -// +build gc -// +build !noasm - -#include "textflag.h" - -// The asm code generally follows the pure Go code in decode_other.go, except -// where marked with a "!!!". - -// func decode(dst, src []byte) int -// -// All local variables fit into registers. The non-zero stack size is only to -// spill registers and push args when issuing a CALL. The register allocation: -// - AX scratch -// - BX scratch -// - CX length or x -// - DX offset -// - SI &src[s] -// - DI &dst[d] -// + R8 dst_base -// + R9 dst_len -// + R10 dst_base + dst_len -// + R11 src_base -// + R12 src_len -// + R13 src_base + src_len -// - R14 used by doCopy -// - R15 used by doCopy -// -// The registers R8-R13 (marked with a "+") are set at the start of the -// function, and after a CALL returns, and are not otherwise modified. -// -// The d variable is implicitly DI - R8, and len(dst)-d is R10 - DI. -// The s variable is implicitly SI - R11, and len(src)-s is R13 - SI. -TEXT ·decode(SB), NOSPLIT, $48-56 - // Initialize SI, DI and R8-R13. - MOVQ dst_base+0(FP), R8 - MOVQ dst_len+8(FP), R9 - MOVQ R8, DI - MOVQ R8, R10 - ADDQ R9, R10 - MOVQ src_base+24(FP), R11 - MOVQ src_len+32(FP), R12 - MOVQ R11, SI - MOVQ R11, R13 - ADDQ R12, R13 - -loop: - // for s < len(src) - CMPQ SI, R13 - JEQ end - - // CX = uint32(src[s]) - // - // switch src[s] & 0x03 - MOVBLZX (SI), CX - MOVL CX, BX - ANDL $3, BX - CMPL BX, $1 - JAE tagCopy - - // ---------------------------------------- - // The code below handles literal tags. - - // case tagLiteral: - // x := uint32(src[s] >> 2) - // switch - SHRL $2, CX - CMPL CX, $60 - JAE tagLit60Plus - - // case x < 60: - // s++ - INCQ SI - -doLit: - // This is the end of the inner "switch", when we have a literal tag. - // - // We assume that CX == x and x fits in a uint32, where x is the variable - // used in the pure Go decode_other.go code. - - // length = int(x) + 1 - // - // Unlike the pure Go code, we don't need to check if length <= 0 because - // CX can hold 64 bits, so the increment cannot overflow. - INCQ CX - - // Prepare to check if copying length bytes will run past the end of dst or - // src. - // - // AX = len(dst) - d - // BX = len(src) - s - MOVQ R10, AX - SUBQ DI, AX - MOVQ R13, BX - SUBQ SI, BX - - // !!! Try a faster technique for short (16 or fewer bytes) copies. - // - // if length > 16 || len(dst)-d < 16 || len(src)-s < 16 { - // goto callMemmove // Fall back on calling runtime·memmove. - // } - // - // The C++ snappy code calls this TryFastAppend. It also checks len(src)-s - // against 21 instead of 16, because it cannot assume that all of its input - // is contiguous in memory and so it needs to leave enough source bytes to - // read the next tag without refilling buffers, but Go's Decode assumes - // contiguousness (the src argument is a []byte). - CMPQ CX, $16 - JGT callMemmove - CMPQ AX, $16 - JLT callMemmove - CMPQ BX, $16 - JLT callMemmove - - // !!! Implement the copy from src to dst as a 16-byte load and store. - // (Decode's documentation says that dst and src must not overlap.) - // - // This always copies 16 bytes, instead of only length bytes, but that's - // OK. If the input is a valid Snappy encoding then subsequent iterations - // will fix up the overrun. Otherwise, Decode returns a nil []byte (and a - // non-nil error), so the overrun will be ignored. - // - // Note that on amd64, it is legal and cheap to issue unaligned 8-byte or - // 16-byte loads and stores. This technique probably wouldn't be as - // effective on architectures that are fussier about alignment. - MOVOU 0(SI), X0 - MOVOU X0, 0(DI) - - // d += length - // s += length - ADDQ CX, DI - ADDQ CX, SI - JMP loop - -callMemmove: - // if length > len(dst)-d || length > len(src)-s { etc } - CMPQ CX, AX - JGT errCorrupt - CMPQ CX, BX - JGT errCorrupt - - // copy(dst[d:], src[s:s+length]) - // - // This means calling runtime·memmove(&dst[d], &src[s], length), so we push - // DI, SI and CX as arguments. Coincidentally, we also need to spill those - // three registers to the stack, to save local variables across the CALL. - MOVQ DI, 0(SP) - MOVQ SI, 8(SP) - MOVQ CX, 16(SP) - MOVQ DI, 24(SP) - MOVQ SI, 32(SP) - MOVQ CX, 40(SP) - CALL runtime·memmove(SB) - - // Restore local variables: unspill registers from the stack and - // re-calculate R8-R13. - MOVQ 24(SP), DI - MOVQ 32(SP), SI - MOVQ 40(SP), CX - MOVQ dst_base+0(FP), R8 - MOVQ dst_len+8(FP), R9 - MOVQ R8, R10 - ADDQ R9, R10 - MOVQ src_base+24(FP), R11 - MOVQ src_len+32(FP), R12 - MOVQ R11, R13 - ADDQ R12, R13 - - // d += length - // s += length - ADDQ CX, DI - ADDQ CX, SI - JMP loop - -tagLit60Plus: - // !!! This fragment does the - // - // s += x - 58; if uint(s) > uint(len(src)) { etc } - // - // checks. In the asm version, we code it once instead of once per switch case. - ADDQ CX, SI - SUBQ $58, SI - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // case x == 60: - CMPL CX, $61 - JEQ tagLit61 - JA tagLit62Plus - - // x = uint32(src[s-1]) - MOVBLZX -1(SI), CX - JMP doLit - -tagLit61: - // case x == 61: - // x = uint32(src[s-2]) | uint32(src[s-1])<<8 - MOVWLZX -2(SI), CX - JMP doLit - -tagLit62Plus: - CMPL CX, $62 - JA tagLit63 - - // case x == 62: - // x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16 - MOVWLZX -3(SI), CX - MOVBLZX -1(SI), BX - SHLL $16, BX - ORL BX, CX - JMP doLit - -tagLit63: - // case x == 63: - // x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 - MOVL -4(SI), CX - JMP doLit - -// The code above handles literal tags. -// ---------------------------------------- -// The code below handles copy tags. - -tagCopy4: - // case tagCopy4: - // s += 5 - ADDQ $5, SI - - // if uint(s) > uint(len(src)) { etc } - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // length = 1 + int(src[s-5])>>2 - SHRQ $2, CX - INCQ CX - - // offset = int(uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24) - MOVLQZX -4(SI), DX - JMP doCopy - -tagCopy2: - // case tagCopy2: - // s += 3 - ADDQ $3, SI - - // if uint(s) > uint(len(src)) { etc } - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // length = 1 + int(src[s-3])>>2 - SHRQ $2, CX - INCQ CX - - // offset = int(uint32(src[s-2]) | uint32(src[s-1])<<8) - MOVWQZX -2(SI), DX - JMP doCopy - -tagCopy: - // We have a copy tag. We assume that: - // - BX == src[s] & 0x03 - // - CX == src[s] - CMPQ BX, $2 - JEQ tagCopy2 - JA tagCopy4 - - // case tagCopy1: - // s += 2 - ADDQ $2, SI - - // if uint(s) > uint(len(src)) { etc } - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // offset = int(uint32(src[s-2])&0xe0<<3 | uint32(src[s-1])) - MOVQ CX, DX - ANDQ $0xe0, DX - SHLQ $3, DX - MOVBQZX -1(SI), BX - ORQ BX, DX - - // length = 4 + int(src[s-2])>>2&0x7 - SHRQ $2, CX - ANDQ $7, CX - ADDQ $4, CX - -doCopy: - // This is the end of the outer "switch", when we have a copy tag. - // - // We assume that: - // - CX == length && CX > 0 - // - DX == offset - - // if offset <= 0 { etc } - CMPQ DX, $0 - JLE errCorrupt - - // if d < offset { etc } - MOVQ DI, BX - SUBQ R8, BX - CMPQ BX, DX - JLT errCorrupt - - // if length > len(dst)-d { etc } - MOVQ R10, BX - SUBQ DI, BX - CMPQ CX, BX - JGT errCorrupt - - // forwardCopy(dst[d:d+length], dst[d-offset:]); d += length - // - // Set: - // - R14 = len(dst)-d - // - R15 = &dst[d-offset] - MOVQ R10, R14 - SUBQ DI, R14 - MOVQ DI, R15 - SUBQ DX, R15 - - // !!! Try a faster technique for short (16 or fewer bytes) forward copies. - // - // First, try using two 8-byte load/stores, similar to the doLit technique - // above. Even if dst[d:d+length] and dst[d-offset:] can overlap, this is - // still OK if offset >= 8. Note that this has to be two 8-byte load/stores - // and not one 16-byte load/store, and the first store has to be before the - // second load, due to the overlap if offset is in the range [8, 16). - // - // if length > 16 || offset < 8 || len(dst)-d < 16 { - // goto slowForwardCopy - // } - // copy 16 bytes - // d += length - CMPQ CX, $16 - JGT slowForwardCopy - CMPQ DX, $8 - JLT slowForwardCopy - CMPQ R14, $16 - JLT slowForwardCopy - MOVQ 0(R15), AX - MOVQ AX, 0(DI) - MOVQ 8(R15), BX - MOVQ BX, 8(DI) - ADDQ CX, DI - JMP loop - -slowForwardCopy: - // !!! If the forward copy is longer than 16 bytes, or if offset < 8, we - // can still try 8-byte load stores, provided we can overrun up to 10 extra - // bytes. As above, the overrun will be fixed up by subsequent iterations - // of the outermost loop. - // - // The C++ snappy code calls this technique IncrementalCopyFastPath. Its - // commentary says: - // - // ---- - // - // The main part of this loop is a simple copy of eight bytes at a time - // until we've copied (at least) the requested amount of bytes. However, - // if d and d-offset are less than eight bytes apart (indicating a - // repeating pattern of length < 8), we first need to expand the pattern in - // order to get the correct results. For instance, if the buffer looks like - // this, with the eight-byte and patterns marked as - // intervals: - // - // abxxxxxxxxxxxx - // [------] d-offset - // [------] d - // - // a single eight-byte copy from to will repeat the pattern - // once, after which we can move two bytes without moving : - // - // ababxxxxxxxxxx - // [------] d-offset - // [------] d - // - // and repeat the exercise until the two no longer overlap. - // - // This allows us to do very well in the special case of one single byte - // repeated many times, without taking a big hit for more general cases. - // - // The worst case of extra writing past the end of the match occurs when - // offset == 1 and length == 1; the last copy will read from byte positions - // [0..7] and write to [4..11], whereas it was only supposed to write to - // position 1. Thus, ten excess bytes. - // - // ---- - // - // That "10 byte overrun" worst case is confirmed by Go's - // TestSlowForwardCopyOverrun, which also tests the fixUpSlowForwardCopy - // and finishSlowForwardCopy algorithm. - // - // if length > len(dst)-d-10 { - // goto verySlowForwardCopy - // } - SUBQ $10, R14 - CMPQ CX, R14 - JGT verySlowForwardCopy - -makeOffsetAtLeast8: - // !!! As above, expand the pattern so that offset >= 8 and we can use - // 8-byte load/stores. - // - // for offset < 8 { - // copy 8 bytes from dst[d-offset:] to dst[d:] - // length -= offset - // d += offset - // offset += offset - // // The two previous lines together means that d-offset, and therefore - // // R15, is unchanged. - // } - CMPQ DX, $8 - JGE fixUpSlowForwardCopy - MOVQ (R15), BX - MOVQ BX, (DI) - SUBQ DX, CX - ADDQ DX, DI - ADDQ DX, DX - JMP makeOffsetAtLeast8 - -fixUpSlowForwardCopy: - // !!! Add length (which might be negative now) to d (implied by DI being - // &dst[d]) so that d ends up at the right place when we jump back to the - // top of the loop. Before we do that, though, we save DI to AX so that, if - // length is positive, copying the remaining length bytes will write to the - // right place. - MOVQ DI, AX - ADDQ CX, DI - -finishSlowForwardCopy: - // !!! Repeat 8-byte load/stores until length <= 0. Ending with a negative - // length means that we overrun, but as above, that will be fixed up by - // subsequent iterations of the outermost loop. - CMPQ CX, $0 - JLE loop - MOVQ (R15), BX - MOVQ BX, (AX) - ADDQ $8, R15 - ADDQ $8, AX - SUBQ $8, CX - JMP finishSlowForwardCopy - -verySlowForwardCopy: - // verySlowForwardCopy is a simple implementation of forward copy. In C - // parlance, this is a do/while loop instead of a while loop, since we know - // that length > 0. In Go syntax: - // - // for { - // dst[d] = dst[d - offset] - // d++ - // length-- - // if length == 0 { - // break - // } - // } - MOVB (R15), BX - MOVB BX, (DI) - INCQ R15 - INCQ DI - DECQ CX - JNZ verySlowForwardCopy - JMP loop - -// The code above handles copy tags. -// ---------------------------------------- - -end: - // This is the end of the "for s < len(src)". - // - // if d != len(dst) { etc } - CMPQ DI, R10 - JNE errCorrupt - - // return 0 - MOVQ $0, ret+48(FP) - RET - -errCorrupt: - // return decodeErrCodeCorrupt - MOVQ $1, ret+48(FP) - RET diff --git a/vendor/github.com/golang/snappy/decode_arm64.s b/vendor/github.com/golang/snappy/decode_arm64.s deleted file mode 100644 index 7a3ead17ea..0000000000 --- a/vendor/github.com/golang/snappy/decode_arm64.s +++ /dev/null @@ -1,494 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine -// +build gc -// +build !noasm - -#include "textflag.h" - -// The asm code generally follows the pure Go code in decode_other.go, except -// where marked with a "!!!". - -// func decode(dst, src []byte) int -// -// All local variables fit into registers. The non-zero stack size is only to -// spill registers and push args when issuing a CALL. The register allocation: -// - R2 scratch -// - R3 scratch -// - R4 length or x -// - R5 offset -// - R6 &src[s] -// - R7 &dst[d] -// + R8 dst_base -// + R9 dst_len -// + R10 dst_base + dst_len -// + R11 src_base -// + R12 src_len -// + R13 src_base + src_len -// - R14 used by doCopy -// - R15 used by doCopy -// -// The registers R8-R13 (marked with a "+") are set at the start of the -// function, and after a CALL returns, and are not otherwise modified. -// -// The d variable is implicitly R7 - R8, and len(dst)-d is R10 - R7. -// The s variable is implicitly R6 - R11, and len(src)-s is R13 - R6. -TEXT ·decode(SB), NOSPLIT, $56-56 - // Initialize R6, R7 and R8-R13. - MOVD dst_base+0(FP), R8 - MOVD dst_len+8(FP), R9 - MOVD R8, R7 - MOVD R8, R10 - ADD R9, R10, R10 - MOVD src_base+24(FP), R11 - MOVD src_len+32(FP), R12 - MOVD R11, R6 - MOVD R11, R13 - ADD R12, R13, R13 - -loop: - // for s < len(src) - CMP R13, R6 - BEQ end - - // R4 = uint32(src[s]) - // - // switch src[s] & 0x03 - MOVBU (R6), R4 - MOVW R4, R3 - ANDW $3, R3 - MOVW $1, R1 - CMPW R1, R3 - BGE tagCopy - - // ---------------------------------------- - // The code below handles literal tags. - - // case tagLiteral: - // x := uint32(src[s] >> 2) - // switch - MOVW $60, R1 - LSRW $2, R4, R4 - CMPW R4, R1 - BLS tagLit60Plus - - // case x < 60: - // s++ - ADD $1, R6, R6 - -doLit: - // This is the end of the inner "switch", when we have a literal tag. - // - // We assume that R4 == x and x fits in a uint32, where x is the variable - // used in the pure Go decode_other.go code. - - // length = int(x) + 1 - // - // Unlike the pure Go code, we don't need to check if length <= 0 because - // R4 can hold 64 bits, so the increment cannot overflow. - ADD $1, R4, R4 - - // Prepare to check if copying length bytes will run past the end of dst or - // src. - // - // R2 = len(dst) - d - // R3 = len(src) - s - MOVD R10, R2 - SUB R7, R2, R2 - MOVD R13, R3 - SUB R6, R3, R3 - - // !!! Try a faster technique for short (16 or fewer bytes) copies. - // - // if length > 16 || len(dst)-d < 16 || len(src)-s < 16 { - // goto callMemmove // Fall back on calling runtime·memmove. - // } - // - // The C++ snappy code calls this TryFastAppend. It also checks len(src)-s - // against 21 instead of 16, because it cannot assume that all of its input - // is contiguous in memory and so it needs to leave enough source bytes to - // read the next tag without refilling buffers, but Go's Decode assumes - // contiguousness (the src argument is a []byte). - CMP $16, R4 - BGT callMemmove - CMP $16, R2 - BLT callMemmove - CMP $16, R3 - BLT callMemmove - - // !!! Implement the copy from src to dst as a 16-byte load and store. - // (Decode's documentation says that dst and src must not overlap.) - // - // This always copies 16 bytes, instead of only length bytes, but that's - // OK. If the input is a valid Snappy encoding then subsequent iterations - // will fix up the overrun. Otherwise, Decode returns a nil []byte (and a - // non-nil error), so the overrun will be ignored. - // - // Note that on arm64, it is legal and cheap to issue unaligned 8-byte or - // 16-byte loads and stores. This technique probably wouldn't be as - // effective on architectures that are fussier about alignment. - LDP 0(R6), (R14, R15) - STP (R14, R15), 0(R7) - - // d += length - // s += length - ADD R4, R7, R7 - ADD R4, R6, R6 - B loop - -callMemmove: - // if length > len(dst)-d || length > len(src)-s { etc } - CMP R2, R4 - BGT errCorrupt - CMP R3, R4 - BGT errCorrupt - - // copy(dst[d:], src[s:s+length]) - // - // This means calling runtime·memmove(&dst[d], &src[s], length), so we push - // R7, R6 and R4 as arguments. Coincidentally, we also need to spill those - // three registers to the stack, to save local variables across the CALL. - MOVD R7, 8(RSP) - MOVD R6, 16(RSP) - MOVD R4, 24(RSP) - MOVD R7, 32(RSP) - MOVD R6, 40(RSP) - MOVD R4, 48(RSP) - CALL runtime·memmove(SB) - - // Restore local variables: unspill registers from the stack and - // re-calculate R8-R13. - MOVD 32(RSP), R7 - MOVD 40(RSP), R6 - MOVD 48(RSP), R4 - MOVD dst_base+0(FP), R8 - MOVD dst_len+8(FP), R9 - MOVD R8, R10 - ADD R9, R10, R10 - MOVD src_base+24(FP), R11 - MOVD src_len+32(FP), R12 - MOVD R11, R13 - ADD R12, R13, R13 - - // d += length - // s += length - ADD R4, R7, R7 - ADD R4, R6, R6 - B loop - -tagLit60Plus: - // !!! This fragment does the - // - // s += x - 58; if uint(s) > uint(len(src)) { etc } - // - // checks. In the asm version, we code it once instead of once per switch case. - ADD R4, R6, R6 - SUB $58, R6, R6 - MOVD R6, R3 - SUB R11, R3, R3 - CMP R12, R3 - BGT errCorrupt - - // case x == 60: - MOVW $61, R1 - CMPW R1, R4 - BEQ tagLit61 - BGT tagLit62Plus - - // x = uint32(src[s-1]) - MOVBU -1(R6), R4 - B doLit - -tagLit61: - // case x == 61: - // x = uint32(src[s-2]) | uint32(src[s-1])<<8 - MOVHU -2(R6), R4 - B doLit - -tagLit62Plus: - CMPW $62, R4 - BHI tagLit63 - - // case x == 62: - // x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16 - MOVHU -3(R6), R4 - MOVBU -1(R6), R3 - ORR R3<<16, R4 - B doLit - -tagLit63: - // case x == 63: - // x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 - MOVWU -4(R6), R4 - B doLit - - // The code above handles literal tags. - // ---------------------------------------- - // The code below handles copy tags. - -tagCopy4: - // case tagCopy4: - // s += 5 - ADD $5, R6, R6 - - // if uint(s) > uint(len(src)) { etc } - MOVD R6, R3 - SUB R11, R3, R3 - CMP R12, R3 - BGT errCorrupt - - // length = 1 + int(src[s-5])>>2 - MOVD $1, R1 - ADD R4>>2, R1, R4 - - // offset = int(uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24) - MOVWU -4(R6), R5 - B doCopy - -tagCopy2: - // case tagCopy2: - // s += 3 - ADD $3, R6, R6 - - // if uint(s) > uint(len(src)) { etc } - MOVD R6, R3 - SUB R11, R3, R3 - CMP R12, R3 - BGT errCorrupt - - // length = 1 + int(src[s-3])>>2 - MOVD $1, R1 - ADD R4>>2, R1, R4 - - // offset = int(uint32(src[s-2]) | uint32(src[s-1])<<8) - MOVHU -2(R6), R5 - B doCopy - -tagCopy: - // We have a copy tag. We assume that: - // - R3 == src[s] & 0x03 - // - R4 == src[s] - CMP $2, R3 - BEQ tagCopy2 - BGT tagCopy4 - - // case tagCopy1: - // s += 2 - ADD $2, R6, R6 - - // if uint(s) > uint(len(src)) { etc } - MOVD R6, R3 - SUB R11, R3, R3 - CMP R12, R3 - BGT errCorrupt - - // offset = int(uint32(src[s-2])&0xe0<<3 | uint32(src[s-1])) - MOVD R4, R5 - AND $0xe0, R5 - MOVBU -1(R6), R3 - ORR R5<<3, R3, R5 - - // length = 4 + int(src[s-2])>>2&0x7 - MOVD $7, R1 - AND R4>>2, R1, R4 - ADD $4, R4, R4 - -doCopy: - // This is the end of the outer "switch", when we have a copy tag. - // - // We assume that: - // - R4 == length && R4 > 0 - // - R5 == offset - - // if offset <= 0 { etc } - MOVD $0, R1 - CMP R1, R5 - BLE errCorrupt - - // if d < offset { etc } - MOVD R7, R3 - SUB R8, R3, R3 - CMP R5, R3 - BLT errCorrupt - - // if length > len(dst)-d { etc } - MOVD R10, R3 - SUB R7, R3, R3 - CMP R3, R4 - BGT errCorrupt - - // forwardCopy(dst[d:d+length], dst[d-offset:]); d += length - // - // Set: - // - R14 = len(dst)-d - // - R15 = &dst[d-offset] - MOVD R10, R14 - SUB R7, R14, R14 - MOVD R7, R15 - SUB R5, R15, R15 - - // !!! Try a faster technique for short (16 or fewer bytes) forward copies. - // - // First, try using two 8-byte load/stores, similar to the doLit technique - // above. Even if dst[d:d+length] and dst[d-offset:] can overlap, this is - // still OK if offset >= 8. Note that this has to be two 8-byte load/stores - // and not one 16-byte load/store, and the first store has to be before the - // second load, due to the overlap if offset is in the range [8, 16). - // - // if length > 16 || offset < 8 || len(dst)-d < 16 { - // goto slowForwardCopy - // } - // copy 16 bytes - // d += length - CMP $16, R4 - BGT slowForwardCopy - CMP $8, R5 - BLT slowForwardCopy - CMP $16, R14 - BLT slowForwardCopy - MOVD 0(R15), R2 - MOVD R2, 0(R7) - MOVD 8(R15), R3 - MOVD R3, 8(R7) - ADD R4, R7, R7 - B loop - -slowForwardCopy: - // !!! If the forward copy is longer than 16 bytes, or if offset < 8, we - // can still try 8-byte load stores, provided we can overrun up to 10 extra - // bytes. As above, the overrun will be fixed up by subsequent iterations - // of the outermost loop. - // - // The C++ snappy code calls this technique IncrementalCopyFastPath. Its - // commentary says: - // - // ---- - // - // The main part of this loop is a simple copy of eight bytes at a time - // until we've copied (at least) the requested amount of bytes. However, - // if d and d-offset are less than eight bytes apart (indicating a - // repeating pattern of length < 8), we first need to expand the pattern in - // order to get the correct results. For instance, if the buffer looks like - // this, with the eight-byte and patterns marked as - // intervals: - // - // abxxxxxxxxxxxx - // [------] d-offset - // [------] d - // - // a single eight-byte copy from to will repeat the pattern - // once, after which we can move two bytes without moving : - // - // ababxxxxxxxxxx - // [------] d-offset - // [------] d - // - // and repeat the exercise until the two no longer overlap. - // - // This allows us to do very well in the special case of one single byte - // repeated many times, without taking a big hit for more general cases. - // - // The worst case of extra writing past the end of the match occurs when - // offset == 1 and length == 1; the last copy will read from byte positions - // [0..7] and write to [4..11], whereas it was only supposed to write to - // position 1. Thus, ten excess bytes. - // - // ---- - // - // That "10 byte overrun" worst case is confirmed by Go's - // TestSlowForwardCopyOverrun, which also tests the fixUpSlowForwardCopy - // and finishSlowForwardCopy algorithm. - // - // if length > len(dst)-d-10 { - // goto verySlowForwardCopy - // } - SUB $10, R14, R14 - CMP R14, R4 - BGT verySlowForwardCopy - -makeOffsetAtLeast8: - // !!! As above, expand the pattern so that offset >= 8 and we can use - // 8-byte load/stores. - // - // for offset < 8 { - // copy 8 bytes from dst[d-offset:] to dst[d:] - // length -= offset - // d += offset - // offset += offset - // // The two previous lines together means that d-offset, and therefore - // // R15, is unchanged. - // } - CMP $8, R5 - BGE fixUpSlowForwardCopy - MOVD (R15), R3 - MOVD R3, (R7) - SUB R5, R4, R4 - ADD R5, R7, R7 - ADD R5, R5, R5 - B makeOffsetAtLeast8 - -fixUpSlowForwardCopy: - // !!! Add length (which might be negative now) to d (implied by R7 being - // &dst[d]) so that d ends up at the right place when we jump back to the - // top of the loop. Before we do that, though, we save R7 to R2 so that, if - // length is positive, copying the remaining length bytes will write to the - // right place. - MOVD R7, R2 - ADD R4, R7, R7 - -finishSlowForwardCopy: - // !!! Repeat 8-byte load/stores until length <= 0. Ending with a negative - // length means that we overrun, but as above, that will be fixed up by - // subsequent iterations of the outermost loop. - MOVD $0, R1 - CMP R1, R4 - BLE loop - MOVD (R15), R3 - MOVD R3, (R2) - ADD $8, R15, R15 - ADD $8, R2, R2 - SUB $8, R4, R4 - B finishSlowForwardCopy - -verySlowForwardCopy: - // verySlowForwardCopy is a simple implementation of forward copy. In C - // parlance, this is a do/while loop instead of a while loop, since we know - // that length > 0. In Go syntax: - // - // for { - // dst[d] = dst[d - offset] - // d++ - // length-- - // if length == 0 { - // break - // } - // } - MOVB (R15), R3 - MOVB R3, (R7) - ADD $1, R15, R15 - ADD $1, R7, R7 - SUB $1, R4, R4 - CBNZ R4, verySlowForwardCopy - B loop - - // The code above handles copy tags. - // ---------------------------------------- - -end: - // This is the end of the "for s < len(src)". - // - // if d != len(dst) { etc } - CMP R10, R7 - BNE errCorrupt - - // return 0 - MOVD $0, ret+48(FP) - RET - -errCorrupt: - // return decodeErrCodeCorrupt - MOVD $1, R2 - MOVD R2, ret+48(FP) - RET diff --git a/vendor/github.com/golang/snappy/decode_asm.go b/vendor/github.com/golang/snappy/decode_asm.go deleted file mode 100644 index 7082b34919..0000000000 --- a/vendor/github.com/golang/snappy/decode_asm.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2016 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine -// +build gc -// +build !noasm -// +build amd64 arm64 - -package snappy - -// decode has the same semantics as in decode_other.go. -// -//go:noescape -func decode(dst, src []byte) int diff --git a/vendor/github.com/golang/snappy/decode_other.go b/vendor/github.com/golang/snappy/decode_other.go deleted file mode 100644 index 2f672be557..0000000000 --- a/vendor/github.com/golang/snappy/decode_other.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2016 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64,!arm64 appengine !gc noasm - -package snappy - -// decode writes the decoding of src to dst. It assumes that the varint-encoded -// length of the decompressed bytes has already been read, and that len(dst) -// equals that length. -// -// It returns 0 on success or a decodeErrCodeXxx error code on failure. -func decode(dst, src []byte) int { - var d, s, offset, length int - for s < len(src) { - switch src[s] & 0x03 { - case tagLiteral: - x := uint32(src[s] >> 2) - switch { - case x < 60: - s++ - case x == 60: - s += 2 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-1]) - case x == 61: - s += 3 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-2]) | uint32(src[s-1])<<8 - case x == 62: - s += 4 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16 - case x == 63: - s += 5 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 - } - length = int(x) + 1 - if length <= 0 { - return decodeErrCodeUnsupportedLiteralLength - } - if length > len(dst)-d || length > len(src)-s { - return decodeErrCodeCorrupt - } - copy(dst[d:], src[s:s+length]) - d += length - s += length - continue - - case tagCopy1: - s += 2 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 4 + int(src[s-2])>>2&0x7 - offset = int(uint32(src[s-2])&0xe0<<3 | uint32(src[s-1])) - - case tagCopy2: - s += 3 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 1 + int(src[s-3])>>2 - offset = int(uint32(src[s-2]) | uint32(src[s-1])<<8) - - case tagCopy4: - s += 5 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 1 + int(src[s-5])>>2 - offset = int(uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24) - } - - if offset <= 0 || d < offset || length > len(dst)-d { - return decodeErrCodeCorrupt - } - // Copy from an earlier sub-slice of dst to a later sub-slice. - // If no overlap, use the built-in copy: - if offset >= length { - copy(dst[d:d+length], dst[d-offset:]) - d += length - continue - } - - // Unlike the built-in copy function, this byte-by-byte copy always runs - // forwards, even if the slices overlap. Conceptually, this is: - // - // d += forwardCopy(dst[d:d+length], dst[d-offset:]) - // - // We align the slices into a and b and show the compiler they are the same size. - // This allows the loop to run without bounds checks. - a := dst[d : d+length] - b := dst[d-offset:] - b = b[:len(a)] - for i := range a { - a[i] = b[i] - } - d += length - } - if d != len(dst) { - return decodeErrCodeCorrupt - } - return 0 -} diff --git a/vendor/github.com/golang/snappy/encode.go b/vendor/github.com/golang/snappy/encode.go deleted file mode 100644 index 7f23657076..0000000000 --- a/vendor/github.com/golang/snappy/encode.go +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright 2011 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package snappy - -import ( - "encoding/binary" - "errors" - "io" -) - -// Encode returns the encoded form of src. The returned slice may be a sub- -// slice of dst if dst was large enough to hold the entire encoded block. -// Otherwise, a newly allocated slice will be returned. -// -// The dst and src must not overlap. It is valid to pass a nil dst. -// -// Encode handles the Snappy block format, not the Snappy stream format. -func Encode(dst, src []byte) []byte { - if n := MaxEncodedLen(len(src)); n < 0 { - panic(ErrTooLarge) - } else if len(dst) < n { - dst = make([]byte, n) - } - - // The block starts with the varint-encoded length of the decompressed bytes. - d := binary.PutUvarint(dst, uint64(len(src))) - - for len(src) > 0 { - p := src - src = nil - if len(p) > maxBlockSize { - p, src = p[:maxBlockSize], p[maxBlockSize:] - } - if len(p) < minNonLiteralBlockSize { - d += emitLiteral(dst[d:], p) - } else { - d += encodeBlock(dst[d:], p) - } - } - return dst[:d] -} - -// inputMargin is the minimum number of extra input bytes to keep, inside -// encodeBlock's inner loop. On some architectures, this margin lets us -// implement a fast path for emitLiteral, where the copy of short (<= 16 byte) -// literals can be implemented as a single load to and store from a 16-byte -// register. That literal's actual length can be as short as 1 byte, so this -// can copy up to 15 bytes too much, but that's OK as subsequent iterations of -// the encoding loop will fix up the copy overrun, and this inputMargin ensures -// that we don't overrun the dst and src buffers. -const inputMargin = 16 - 1 - -// minNonLiteralBlockSize is the minimum size of the input to encodeBlock that -// could be encoded with a copy tag. This is the minimum with respect to the -// algorithm used by encodeBlock, not a minimum enforced by the file format. -// -// The encoded output must start with at least a 1 byte literal, as there are -// no previous bytes to copy. A minimal (1 byte) copy after that, generated -// from an emitCopy call in encodeBlock's main loop, would require at least -// another inputMargin bytes, for the reason above: we want any emitLiteral -// calls inside encodeBlock's main loop to use the fast path if possible, which -// requires being able to overrun by inputMargin bytes. Thus, -// minNonLiteralBlockSize equals 1 + 1 + inputMargin. -// -// The C++ code doesn't use this exact threshold, but it could, as discussed at -// https://groups.google.com/d/topic/snappy-compression/oGbhsdIJSJ8/discussion -// The difference between Go (2+inputMargin) and C++ (inputMargin) is purely an -// optimization. It should not affect the encoded form. This is tested by -// TestSameEncodingAsCppShortCopies. -const minNonLiteralBlockSize = 1 + 1 + inputMargin - -// MaxEncodedLen returns the maximum length of a snappy block, given its -// uncompressed length. -// -// It will return a negative value if srcLen is too large to encode. -func MaxEncodedLen(srcLen int) int { - n := uint64(srcLen) - if n > 0xffffffff { - return -1 - } - // Compressed data can be defined as: - // compressed := item* literal* - // item := literal* copy - // - // The trailing literal sequence has a space blowup of at most 62/60 - // since a literal of length 60 needs one tag byte + one extra byte - // for length information. - // - // Item blowup is trickier to measure. Suppose the "copy" op copies - // 4 bytes of data. Because of a special check in the encoding code, - // we produce a 4-byte copy only if the offset is < 65536. Therefore - // the copy op takes 3 bytes to encode, and this type of item leads - // to at most the 62/60 blowup for representing literals. - // - // Suppose the "copy" op copies 5 bytes of data. If the offset is big - // enough, it will take 5 bytes to encode the copy op. Therefore the - // worst case here is a one-byte literal followed by a five-byte copy. - // That is, 6 bytes of input turn into 7 bytes of "compressed" data. - // - // This last factor dominates the blowup, so the final estimate is: - n = 32 + n + n/6 - if n > 0xffffffff { - return -1 - } - return int(n) -} - -var errClosed = errors.New("snappy: Writer is closed") - -// NewWriter returns a new Writer that compresses to w. -// -// The Writer returned does not buffer writes. There is no need to Flush or -// Close such a Writer. -// -// Deprecated: the Writer returned is not suitable for many small writes, only -// for few large writes. Use NewBufferedWriter instead, which is efficient -// regardless of the frequency and shape of the writes, and remember to Close -// that Writer when done. -func NewWriter(w io.Writer) *Writer { - return &Writer{ - w: w, - obuf: make([]byte, obufLen), - } -} - -// NewBufferedWriter returns a new Writer that compresses to w, using the -// framing format described at -// https://github.com/google/snappy/blob/master/framing_format.txt -// -// The Writer returned buffers writes. Users must call Close to guarantee all -// data has been forwarded to the underlying io.Writer. They may also call -// Flush zero or more times before calling Close. -func NewBufferedWriter(w io.Writer) *Writer { - return &Writer{ - w: w, - ibuf: make([]byte, 0, maxBlockSize), - obuf: make([]byte, obufLen), - } -} - -// Writer is an io.Writer that can write Snappy-compressed bytes. -// -// Writer handles the Snappy stream format, not the Snappy block format. -type Writer struct { - w io.Writer - err error - - // ibuf is a buffer for the incoming (uncompressed) bytes. - // - // Its use is optional. For backwards compatibility, Writers created by the - // NewWriter function have ibuf == nil, do not buffer incoming bytes, and - // therefore do not need to be Flush'ed or Close'd. - ibuf []byte - - // obuf is a buffer for the outgoing (compressed) bytes. - obuf []byte - - // wroteStreamHeader is whether we have written the stream header. - wroteStreamHeader bool -} - -// Reset discards the writer's state and switches the Snappy writer to write to -// w. This permits reusing a Writer rather than allocating a new one. -func (w *Writer) Reset(writer io.Writer) { - w.w = writer - w.err = nil - if w.ibuf != nil { - w.ibuf = w.ibuf[:0] - } - w.wroteStreamHeader = false -} - -// Write satisfies the io.Writer interface. -func (w *Writer) Write(p []byte) (nRet int, errRet error) { - if w.ibuf == nil { - // Do not buffer incoming bytes. This does not perform or compress well - // if the caller of Writer.Write writes many small slices. This - // behavior is therefore deprecated, but still supported for backwards - // compatibility with code that doesn't explicitly Flush or Close. - return w.write(p) - } - - // The remainder of this method is based on bufio.Writer.Write from the - // standard library. - - for len(p) > (cap(w.ibuf)-len(w.ibuf)) && w.err == nil { - var n int - if len(w.ibuf) == 0 { - // Large write, empty buffer. - // Write directly from p to avoid copy. - n, _ = w.write(p) - } else { - n = copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p) - w.ibuf = w.ibuf[:len(w.ibuf)+n] - w.Flush() - } - nRet += n - p = p[n:] - } - if w.err != nil { - return nRet, w.err - } - n := copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p) - w.ibuf = w.ibuf[:len(w.ibuf)+n] - nRet += n - return nRet, nil -} - -func (w *Writer) write(p []byte) (nRet int, errRet error) { - if w.err != nil { - return 0, w.err - } - for len(p) > 0 { - obufStart := len(magicChunk) - if !w.wroteStreamHeader { - w.wroteStreamHeader = true - copy(w.obuf, magicChunk) - obufStart = 0 - } - - var uncompressed []byte - if len(p) > maxBlockSize { - uncompressed, p = p[:maxBlockSize], p[maxBlockSize:] - } else { - uncompressed, p = p, nil - } - checksum := crc(uncompressed) - - // Compress the buffer, discarding the result if the improvement - // isn't at least 12.5%. - compressed := Encode(w.obuf[obufHeaderLen:], uncompressed) - chunkType := uint8(chunkTypeCompressedData) - chunkLen := 4 + len(compressed) - obufEnd := obufHeaderLen + len(compressed) - if len(compressed) >= len(uncompressed)-len(uncompressed)/8 { - chunkType = chunkTypeUncompressedData - chunkLen = 4 + len(uncompressed) - obufEnd = obufHeaderLen - } - - // Fill in the per-chunk header that comes before the body. - w.obuf[len(magicChunk)+0] = chunkType - w.obuf[len(magicChunk)+1] = uint8(chunkLen >> 0) - w.obuf[len(magicChunk)+2] = uint8(chunkLen >> 8) - w.obuf[len(magicChunk)+3] = uint8(chunkLen >> 16) - w.obuf[len(magicChunk)+4] = uint8(checksum >> 0) - w.obuf[len(magicChunk)+5] = uint8(checksum >> 8) - w.obuf[len(magicChunk)+6] = uint8(checksum >> 16) - w.obuf[len(magicChunk)+7] = uint8(checksum >> 24) - - if _, err := w.w.Write(w.obuf[obufStart:obufEnd]); err != nil { - w.err = err - return nRet, err - } - if chunkType == chunkTypeUncompressedData { - if _, err := w.w.Write(uncompressed); err != nil { - w.err = err - return nRet, err - } - } - nRet += len(uncompressed) - } - return nRet, nil -} - -// Flush flushes the Writer to its underlying io.Writer. -func (w *Writer) Flush() error { - if w.err != nil { - return w.err - } - if len(w.ibuf) == 0 { - return nil - } - w.write(w.ibuf) - w.ibuf = w.ibuf[:0] - return w.err -} - -// Close calls Flush and then closes the Writer. -func (w *Writer) Close() error { - w.Flush() - ret := w.err - if w.err == nil { - w.err = errClosed - } - return ret -} diff --git a/vendor/github.com/golang/snappy/encode_amd64.s b/vendor/github.com/golang/snappy/encode_amd64.s deleted file mode 100644 index adfd979fe2..0000000000 --- a/vendor/github.com/golang/snappy/encode_amd64.s +++ /dev/null @@ -1,730 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine -// +build gc -// +build !noasm - -#include "textflag.h" - -// The XXX lines assemble on Go 1.4, 1.5 and 1.7, but not 1.6, due to a -// Go toolchain regression. See https://github.com/golang/go/issues/15426 and -// https://github.com/golang/snappy/issues/29 -// -// As a workaround, the package was built with a known good assembler, and -// those instructions were disassembled by "objdump -d" to yield the -// 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 -// style comments, in AT&T asm syntax. Note that rsp here is a physical -// register, not Go/asm's SP pseudo-register (see https://golang.org/doc/asm). -// The instructions were then encoded as "BYTE $0x.." sequences, which assemble -// fine on Go 1.6. - -// The asm code generally follows the pure Go code in encode_other.go, except -// where marked with a "!!!". - -// ---------------------------------------------------------------------------- - -// func emitLiteral(dst, lit []byte) int -// -// All local variables fit into registers. The register allocation: -// - AX len(lit) -// - BX n -// - DX return value -// - DI &dst[i] -// - R10 &lit[0] -// -// The 24 bytes of stack space is to call runtime·memmove. -// -// The unusual register allocation of local variables, such as R10 for the -// source pointer, matches the allocation used at the call site in encodeBlock, -// which makes it easier to manually inline this function. -TEXT ·emitLiteral(SB), NOSPLIT, $24-56 - MOVQ dst_base+0(FP), DI - MOVQ lit_base+24(FP), R10 - MOVQ lit_len+32(FP), AX - MOVQ AX, DX - MOVL AX, BX - SUBL $1, BX - - CMPL BX, $60 - JLT oneByte - CMPL BX, $256 - JLT twoBytes - -threeBytes: - MOVB $0xf4, 0(DI) - MOVW BX, 1(DI) - ADDQ $3, DI - ADDQ $3, DX - JMP memmove - -twoBytes: - MOVB $0xf0, 0(DI) - MOVB BX, 1(DI) - ADDQ $2, DI - ADDQ $2, DX - JMP memmove - -oneByte: - SHLB $2, BX - MOVB BX, 0(DI) - ADDQ $1, DI - ADDQ $1, DX - -memmove: - MOVQ DX, ret+48(FP) - - // copy(dst[i:], lit) - // - // This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push - // DI, R10 and AX as arguments. - MOVQ DI, 0(SP) - MOVQ R10, 8(SP) - MOVQ AX, 16(SP) - CALL runtime·memmove(SB) - RET - -// ---------------------------------------------------------------------------- - -// func emitCopy(dst []byte, offset, length int) int -// -// All local variables fit into registers. The register allocation: -// - AX length -// - SI &dst[0] -// - DI &dst[i] -// - R11 offset -// -// The unusual register allocation of local variables, such as R11 for the -// offset, matches the allocation used at the call site in encodeBlock, which -// makes it easier to manually inline this function. -TEXT ·emitCopy(SB), NOSPLIT, $0-48 - MOVQ dst_base+0(FP), DI - MOVQ DI, SI - MOVQ offset+24(FP), R11 - MOVQ length+32(FP), AX - -loop0: - // for length >= 68 { etc } - CMPL AX, $68 - JLT step1 - - // Emit a length 64 copy, encoded as 3 bytes. - MOVB $0xfe, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $64, AX - JMP loop0 - -step1: - // if length > 64 { etc } - CMPL AX, $64 - JLE step2 - - // Emit a length 60 copy, encoded as 3 bytes. - MOVB $0xee, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $60, AX - -step2: - // if length >= 12 || offset >= 2048 { goto step3 } - CMPL AX, $12 - JGE step3 - CMPL R11, $2048 - JGE step3 - - // Emit the remaining copy, encoded as 2 bytes. - MOVB R11, 1(DI) - SHRL $8, R11 - SHLB $5, R11 - SUBB $4, AX - SHLB $2, AX - ORB AX, R11 - ORB $1, R11 - MOVB R11, 0(DI) - ADDQ $2, DI - - // Return the number of bytes written. - SUBQ SI, DI - MOVQ DI, ret+40(FP) - RET - -step3: - // Emit the remaining copy, encoded as 3 bytes. - SUBL $1, AX - SHLB $2, AX - ORB $2, AX - MOVB AX, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - - // Return the number of bytes written. - SUBQ SI, DI - MOVQ DI, ret+40(FP) - RET - -// ---------------------------------------------------------------------------- - -// func extendMatch(src []byte, i, j int) int -// -// All local variables fit into registers. The register allocation: -// - DX &src[0] -// - SI &src[j] -// - R13 &src[len(src) - 8] -// - R14 &src[len(src)] -// - R15 &src[i] -// -// The unusual register allocation of local variables, such as R15 for a source -// pointer, matches the allocation used at the call site in encodeBlock, which -// makes it easier to manually inline this function. -TEXT ·extendMatch(SB), NOSPLIT, $0-48 - MOVQ src_base+0(FP), DX - MOVQ src_len+8(FP), R14 - MOVQ i+24(FP), R15 - MOVQ j+32(FP), SI - ADDQ DX, R14 - ADDQ DX, R15 - ADDQ DX, SI - MOVQ R14, R13 - SUBQ $8, R13 - -cmp8: - // As long as we are 8 or more bytes before the end of src, we can load and - // compare 8 bytes at a time. If those 8 bytes are equal, repeat. - CMPQ SI, R13 - JA cmp1 - MOVQ (R15), AX - MOVQ (SI), BX - CMPQ AX, BX - JNE bsf - ADDQ $8, R15 - ADDQ $8, SI - JMP cmp8 - -bsf: - // If those 8 bytes were not equal, XOR the two 8 byte values, and return - // the index of the first byte that differs. The BSF instruction finds the - // least significant 1 bit, the amd64 architecture is little-endian, and - // the shift by 3 converts a bit index to a byte index. - XORQ AX, BX - BSFQ BX, BX - SHRQ $3, BX - ADDQ BX, SI - - // Convert from &src[ret] to ret. - SUBQ DX, SI - MOVQ SI, ret+40(FP) - RET - -cmp1: - // In src's tail, compare 1 byte at a time. - CMPQ SI, R14 - JAE extendMatchEnd - MOVB (R15), AX - MOVB (SI), BX - CMPB AX, BX - JNE extendMatchEnd - ADDQ $1, R15 - ADDQ $1, SI - JMP cmp1 - -extendMatchEnd: - // Convert from &src[ret] to ret. - SUBQ DX, SI - MOVQ SI, ret+40(FP) - RET - -// ---------------------------------------------------------------------------- - -// func encodeBlock(dst, src []byte) (d int) -// -// All local variables fit into registers, other than "var table". The register -// allocation: -// - AX . . -// - BX . . -// - CX 56 shift (note that amd64 shifts by non-immediates must use CX). -// - DX 64 &src[0], tableSize -// - SI 72 &src[s] -// - DI 80 &dst[d] -// - R9 88 sLimit -// - R10 . &src[nextEmit] -// - R11 96 prevHash, currHash, nextHash, offset -// - R12 104 &src[base], skip -// - R13 . &src[nextS], &src[len(src) - 8] -// - R14 . len(src), bytesBetweenHashLookups, &src[len(src)], x -// - R15 112 candidate -// -// The second column (56, 64, etc) is the stack offset to spill the registers -// when calling other functions. We could pack this slightly tighter, but it's -// simpler to have a dedicated spill map independent of the function called. -// -// "var table [maxTableSize]uint16" takes up 32768 bytes of stack space. An -// extra 56 bytes, to call other functions, and an extra 64 bytes, to spill -// local variables (registers) during calls gives 32768 + 56 + 64 = 32888. -TEXT ·encodeBlock(SB), 0, $32888-56 - MOVQ dst_base+0(FP), DI - MOVQ src_base+24(FP), SI - MOVQ src_len+32(FP), R14 - - // shift, tableSize := uint32(32-8), 1<<8 - MOVQ $24, CX - MOVQ $256, DX - -calcShift: - // for ; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 { - // shift-- - // } - CMPQ DX, $16384 - JGE varTable - CMPQ DX, R14 - JGE varTable - SUBQ $1, CX - SHLQ $1, DX - JMP calcShift - -varTable: - // var table [maxTableSize]uint16 - // - // In the asm code, unlike the Go code, we can zero-initialize only the - // first tableSize elements. Each uint16 element is 2 bytes and each MOVOU - // writes 16 bytes, so we can do only tableSize/8 writes instead of the - // 2048 writes that would zero-initialize all of table's 32768 bytes. - SHRQ $3, DX - LEAQ table-32768(SP), BX - PXOR X0, X0 - -memclr: - MOVOU X0, 0(BX) - ADDQ $16, BX - SUBQ $1, DX - JNZ memclr - - // !!! DX = &src[0] - MOVQ SI, DX - - // sLimit := len(src) - inputMargin - MOVQ R14, R9 - SUBQ $15, R9 - - // !!! Pre-emptively spill CX, DX and R9 to the stack. Their values don't - // change for the rest of the function. - MOVQ CX, 56(SP) - MOVQ DX, 64(SP) - MOVQ R9, 88(SP) - - // nextEmit := 0 - MOVQ DX, R10 - - // s := 1 - ADDQ $1, SI - - // nextHash := hash(load32(src, s), shift) - MOVL 0(SI), R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - -outer: - // for { etc } - - // skip := 32 - MOVQ $32, R12 - - // nextS := s - MOVQ SI, R13 - - // candidate := 0 - MOVQ $0, R15 - -inner0: - // for { etc } - - // s := nextS - MOVQ R13, SI - - // bytesBetweenHashLookups := skip >> 5 - MOVQ R12, R14 - SHRQ $5, R14 - - // nextS = s + bytesBetweenHashLookups - ADDQ R14, R13 - - // skip += bytesBetweenHashLookups - ADDQ R14, R12 - - // if nextS > sLimit { goto emitRemainder } - MOVQ R13, AX - SUBQ DX, AX - CMPQ AX, R9 - JA emitRemainder - - // candidate = int(table[nextHash]) - // XXX: MOVWQZX table-32768(SP)(R11*2), R15 - // XXX: 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 - BYTE $0x4e - BYTE $0x0f - BYTE $0xb7 - BYTE $0x7c - BYTE $0x5c - BYTE $0x78 - - // table[nextHash] = uint16(s) - MOVQ SI, AX - SUBQ DX, AX - - // XXX: MOVW AX, table-32768(SP)(R11*2) - // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) - BYTE $0x66 - BYTE $0x42 - BYTE $0x89 - BYTE $0x44 - BYTE $0x5c - BYTE $0x78 - - // nextHash = hash(load32(src, nextS), shift) - MOVL 0(R13), R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // if load32(src, s) != load32(src, candidate) { continue } break - MOVL 0(SI), AX - MOVL (DX)(R15*1), BX - CMPL AX, BX - JNE inner0 - -fourByteMatch: - // As per the encode_other.go code: - // - // A 4-byte match has been found. We'll later see etc. - - // !!! Jump to a fast path for short (<= 16 byte) literals. See the comment - // on inputMargin in encode.go. - MOVQ SI, AX - SUBQ R10, AX - CMPQ AX, $16 - JLE emitLiteralFastPath - - // ---------------------------------------- - // Begin inline of the emitLiteral call. - // - // d += emitLiteral(dst[d:], src[nextEmit:s]) - - MOVL AX, BX - SUBL $1, BX - - CMPL BX, $60 - JLT inlineEmitLiteralOneByte - CMPL BX, $256 - JLT inlineEmitLiteralTwoBytes - -inlineEmitLiteralThreeBytes: - MOVB $0xf4, 0(DI) - MOVW BX, 1(DI) - ADDQ $3, DI - JMP inlineEmitLiteralMemmove - -inlineEmitLiteralTwoBytes: - MOVB $0xf0, 0(DI) - MOVB BX, 1(DI) - ADDQ $2, DI - JMP inlineEmitLiteralMemmove - -inlineEmitLiteralOneByte: - SHLB $2, BX - MOVB BX, 0(DI) - ADDQ $1, DI - -inlineEmitLiteralMemmove: - // Spill local variables (registers) onto the stack; call; unspill. - // - // copy(dst[i:], lit) - // - // This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push - // DI, R10 and AX as arguments. - MOVQ DI, 0(SP) - MOVQ R10, 8(SP) - MOVQ AX, 16(SP) - ADDQ AX, DI // Finish the "d +=" part of "d += emitLiteral(etc)". - MOVQ SI, 72(SP) - MOVQ DI, 80(SP) - MOVQ R15, 112(SP) - CALL runtime·memmove(SB) - MOVQ 56(SP), CX - MOVQ 64(SP), DX - MOVQ 72(SP), SI - MOVQ 80(SP), DI - MOVQ 88(SP), R9 - MOVQ 112(SP), R15 - JMP inner1 - -inlineEmitLiteralEnd: - // End inline of the emitLiteral call. - // ---------------------------------------- - -emitLiteralFastPath: - // !!! Emit the 1-byte encoding "uint8(len(lit)-1)<<2". - MOVB AX, BX - SUBB $1, BX - SHLB $2, BX - MOVB BX, (DI) - ADDQ $1, DI - - // !!! Implement the copy from lit to dst as a 16-byte load and store. - // (Encode's documentation says that dst and src must not overlap.) - // - // This always copies 16 bytes, instead of only len(lit) bytes, but that's - // OK. Subsequent iterations will fix up the overrun. - // - // Note that on amd64, it is legal and cheap to issue unaligned 8-byte or - // 16-byte loads and stores. This technique probably wouldn't be as - // effective on architectures that are fussier about alignment. - MOVOU 0(R10), X0 - MOVOU X0, 0(DI) - ADDQ AX, DI - -inner1: - // for { etc } - - // base := s - MOVQ SI, R12 - - // !!! offset := base - candidate - MOVQ R12, R11 - SUBQ R15, R11 - SUBQ DX, R11 - - // ---------------------------------------- - // Begin inline of the extendMatch call. - // - // s = extendMatch(src, candidate+4, s+4) - - // !!! R14 = &src[len(src)] - MOVQ src_len+32(FP), R14 - ADDQ DX, R14 - - // !!! R13 = &src[len(src) - 8] - MOVQ R14, R13 - SUBQ $8, R13 - - // !!! R15 = &src[candidate + 4] - ADDQ $4, R15 - ADDQ DX, R15 - - // !!! s += 4 - ADDQ $4, SI - -inlineExtendMatchCmp8: - // As long as we are 8 or more bytes before the end of src, we can load and - // compare 8 bytes at a time. If those 8 bytes are equal, repeat. - CMPQ SI, R13 - JA inlineExtendMatchCmp1 - MOVQ (R15), AX - MOVQ (SI), BX - CMPQ AX, BX - JNE inlineExtendMatchBSF - ADDQ $8, R15 - ADDQ $8, SI - JMP inlineExtendMatchCmp8 - -inlineExtendMatchBSF: - // If those 8 bytes were not equal, XOR the two 8 byte values, and return - // the index of the first byte that differs. The BSF instruction finds the - // least significant 1 bit, the amd64 architecture is little-endian, and - // the shift by 3 converts a bit index to a byte index. - XORQ AX, BX - BSFQ BX, BX - SHRQ $3, BX - ADDQ BX, SI - JMP inlineExtendMatchEnd - -inlineExtendMatchCmp1: - // In src's tail, compare 1 byte at a time. - CMPQ SI, R14 - JAE inlineExtendMatchEnd - MOVB (R15), AX - MOVB (SI), BX - CMPB AX, BX - JNE inlineExtendMatchEnd - ADDQ $1, R15 - ADDQ $1, SI - JMP inlineExtendMatchCmp1 - -inlineExtendMatchEnd: - // End inline of the extendMatch call. - // ---------------------------------------- - - // ---------------------------------------- - // Begin inline of the emitCopy call. - // - // d += emitCopy(dst[d:], base-candidate, s-base) - - // !!! length := s - base - MOVQ SI, AX - SUBQ R12, AX - -inlineEmitCopyLoop0: - // for length >= 68 { etc } - CMPL AX, $68 - JLT inlineEmitCopyStep1 - - // Emit a length 64 copy, encoded as 3 bytes. - MOVB $0xfe, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $64, AX - JMP inlineEmitCopyLoop0 - -inlineEmitCopyStep1: - // if length > 64 { etc } - CMPL AX, $64 - JLE inlineEmitCopyStep2 - - // Emit a length 60 copy, encoded as 3 bytes. - MOVB $0xee, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $60, AX - -inlineEmitCopyStep2: - // if length >= 12 || offset >= 2048 { goto inlineEmitCopyStep3 } - CMPL AX, $12 - JGE inlineEmitCopyStep3 - CMPL R11, $2048 - JGE inlineEmitCopyStep3 - - // Emit the remaining copy, encoded as 2 bytes. - MOVB R11, 1(DI) - SHRL $8, R11 - SHLB $5, R11 - SUBB $4, AX - SHLB $2, AX - ORB AX, R11 - ORB $1, R11 - MOVB R11, 0(DI) - ADDQ $2, DI - JMP inlineEmitCopyEnd - -inlineEmitCopyStep3: - // Emit the remaining copy, encoded as 3 bytes. - SUBL $1, AX - SHLB $2, AX - ORB $2, AX - MOVB AX, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - -inlineEmitCopyEnd: - // End inline of the emitCopy call. - // ---------------------------------------- - - // nextEmit = s - MOVQ SI, R10 - - // if s >= sLimit { goto emitRemainder } - MOVQ SI, AX - SUBQ DX, AX - CMPQ AX, R9 - JAE emitRemainder - - // As per the encode_other.go code: - // - // We could immediately etc. - - // x := load64(src, s-1) - MOVQ -1(SI), R14 - - // prevHash := hash(uint32(x>>0), shift) - MOVL R14, R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // table[prevHash] = uint16(s-1) - MOVQ SI, AX - SUBQ DX, AX - SUBQ $1, AX - - // XXX: MOVW AX, table-32768(SP)(R11*2) - // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) - BYTE $0x66 - BYTE $0x42 - BYTE $0x89 - BYTE $0x44 - BYTE $0x5c - BYTE $0x78 - - // currHash := hash(uint32(x>>8), shift) - SHRQ $8, R14 - MOVL R14, R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // candidate = int(table[currHash]) - // XXX: MOVWQZX table-32768(SP)(R11*2), R15 - // XXX: 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 - BYTE $0x4e - BYTE $0x0f - BYTE $0xb7 - BYTE $0x7c - BYTE $0x5c - BYTE $0x78 - - // table[currHash] = uint16(s) - ADDQ $1, AX - - // XXX: MOVW AX, table-32768(SP)(R11*2) - // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) - BYTE $0x66 - BYTE $0x42 - BYTE $0x89 - BYTE $0x44 - BYTE $0x5c - BYTE $0x78 - - // if uint32(x>>8) == load32(src, candidate) { continue } - MOVL (DX)(R15*1), BX - CMPL R14, BX - JEQ inner1 - - // nextHash = hash(uint32(x>>16), shift) - SHRQ $8, R14 - MOVL R14, R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // s++ - ADDQ $1, SI - - // break out of the inner1 for loop, i.e. continue the outer loop. - JMP outer - -emitRemainder: - // if nextEmit < len(src) { etc } - MOVQ src_len+32(FP), AX - ADDQ DX, AX - CMPQ R10, AX - JEQ encodeBlockEnd - - // d += emitLiteral(dst[d:], src[nextEmit:]) - // - // Push args. - MOVQ DI, 0(SP) - MOVQ $0, 8(SP) // Unnecessary, as the callee ignores it, but conservative. - MOVQ $0, 16(SP) // Unnecessary, as the callee ignores it, but conservative. - MOVQ R10, 24(SP) - SUBQ R10, AX - MOVQ AX, 32(SP) - MOVQ AX, 40(SP) // Unnecessary, as the callee ignores it, but conservative. - - // Spill local variables (registers) onto the stack; call; unspill. - MOVQ DI, 80(SP) - CALL ·emitLiteral(SB) - MOVQ 80(SP), DI - - // Finish the "d +=" part of "d += emitLiteral(etc)". - ADDQ 48(SP), DI - -encodeBlockEnd: - MOVQ dst_base+0(FP), AX - SUBQ AX, DI - MOVQ DI, d+48(FP) - RET diff --git a/vendor/github.com/golang/snappy/encode_arm64.s b/vendor/github.com/golang/snappy/encode_arm64.s deleted file mode 100644 index f8d54adfc5..0000000000 --- a/vendor/github.com/golang/snappy/encode_arm64.s +++ /dev/null @@ -1,722 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine -// +build gc -// +build !noasm - -#include "textflag.h" - -// The asm code generally follows the pure Go code in encode_other.go, except -// where marked with a "!!!". - -// ---------------------------------------------------------------------------- - -// func emitLiteral(dst, lit []byte) int -// -// All local variables fit into registers. The register allocation: -// - R3 len(lit) -// - R4 n -// - R6 return value -// - R8 &dst[i] -// - R10 &lit[0] -// -// The 32 bytes of stack space is to call runtime·memmove. -// -// The unusual register allocation of local variables, such as R10 for the -// source pointer, matches the allocation used at the call site in encodeBlock, -// which makes it easier to manually inline this function. -TEXT ·emitLiteral(SB), NOSPLIT, $32-56 - MOVD dst_base+0(FP), R8 - MOVD lit_base+24(FP), R10 - MOVD lit_len+32(FP), R3 - MOVD R3, R6 - MOVW R3, R4 - SUBW $1, R4, R4 - - CMPW $60, R4 - BLT oneByte - CMPW $256, R4 - BLT twoBytes - -threeBytes: - MOVD $0xf4, R2 - MOVB R2, 0(R8) - MOVW R4, 1(R8) - ADD $3, R8, R8 - ADD $3, R6, R6 - B memmove - -twoBytes: - MOVD $0xf0, R2 - MOVB R2, 0(R8) - MOVB R4, 1(R8) - ADD $2, R8, R8 - ADD $2, R6, R6 - B memmove - -oneByte: - LSLW $2, R4, R4 - MOVB R4, 0(R8) - ADD $1, R8, R8 - ADD $1, R6, R6 - -memmove: - MOVD R6, ret+48(FP) - - // copy(dst[i:], lit) - // - // This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push - // R8, R10 and R3 as arguments. - MOVD R8, 8(RSP) - MOVD R10, 16(RSP) - MOVD R3, 24(RSP) - CALL runtime·memmove(SB) - RET - -// ---------------------------------------------------------------------------- - -// func emitCopy(dst []byte, offset, length int) int -// -// All local variables fit into registers. The register allocation: -// - R3 length -// - R7 &dst[0] -// - R8 &dst[i] -// - R11 offset -// -// The unusual register allocation of local variables, such as R11 for the -// offset, matches the allocation used at the call site in encodeBlock, which -// makes it easier to manually inline this function. -TEXT ·emitCopy(SB), NOSPLIT, $0-48 - MOVD dst_base+0(FP), R8 - MOVD R8, R7 - MOVD offset+24(FP), R11 - MOVD length+32(FP), R3 - -loop0: - // for length >= 68 { etc } - CMPW $68, R3 - BLT step1 - - // Emit a length 64 copy, encoded as 3 bytes. - MOVD $0xfe, R2 - MOVB R2, 0(R8) - MOVW R11, 1(R8) - ADD $3, R8, R8 - SUB $64, R3, R3 - B loop0 - -step1: - // if length > 64 { etc } - CMP $64, R3 - BLE step2 - - // Emit a length 60 copy, encoded as 3 bytes. - MOVD $0xee, R2 - MOVB R2, 0(R8) - MOVW R11, 1(R8) - ADD $3, R8, R8 - SUB $60, R3, R3 - -step2: - // if length >= 12 || offset >= 2048 { goto step3 } - CMP $12, R3 - BGE step3 - CMPW $2048, R11 - BGE step3 - - // Emit the remaining copy, encoded as 2 bytes. - MOVB R11, 1(R8) - LSRW $3, R11, R11 - AND $0xe0, R11, R11 - SUB $4, R3, R3 - LSLW $2, R3 - AND $0xff, R3, R3 - ORRW R3, R11, R11 - ORRW $1, R11, R11 - MOVB R11, 0(R8) - ADD $2, R8, R8 - - // Return the number of bytes written. - SUB R7, R8, R8 - MOVD R8, ret+40(FP) - RET - -step3: - // Emit the remaining copy, encoded as 3 bytes. - SUB $1, R3, R3 - AND $0xff, R3, R3 - LSLW $2, R3, R3 - ORRW $2, R3, R3 - MOVB R3, 0(R8) - MOVW R11, 1(R8) - ADD $3, R8, R8 - - // Return the number of bytes written. - SUB R7, R8, R8 - MOVD R8, ret+40(FP) - RET - -// ---------------------------------------------------------------------------- - -// func extendMatch(src []byte, i, j int) int -// -// All local variables fit into registers. The register allocation: -// - R6 &src[0] -// - R7 &src[j] -// - R13 &src[len(src) - 8] -// - R14 &src[len(src)] -// - R15 &src[i] -// -// The unusual register allocation of local variables, such as R15 for a source -// pointer, matches the allocation used at the call site in encodeBlock, which -// makes it easier to manually inline this function. -TEXT ·extendMatch(SB), NOSPLIT, $0-48 - MOVD src_base+0(FP), R6 - MOVD src_len+8(FP), R14 - MOVD i+24(FP), R15 - MOVD j+32(FP), R7 - ADD R6, R14, R14 - ADD R6, R15, R15 - ADD R6, R7, R7 - MOVD R14, R13 - SUB $8, R13, R13 - -cmp8: - // As long as we are 8 or more bytes before the end of src, we can load and - // compare 8 bytes at a time. If those 8 bytes are equal, repeat. - CMP R13, R7 - BHI cmp1 - MOVD (R15), R3 - MOVD (R7), R4 - CMP R4, R3 - BNE bsf - ADD $8, R15, R15 - ADD $8, R7, R7 - B cmp8 - -bsf: - // If those 8 bytes were not equal, XOR the two 8 byte values, and return - // the index of the first byte that differs. - // RBIT reverses the bit order, then CLZ counts the leading zeros, the - // combination of which finds the least significant bit which is set. - // The arm64 architecture is little-endian, and the shift by 3 converts - // a bit index to a byte index. - EOR R3, R4, R4 - RBIT R4, R4 - CLZ R4, R4 - ADD R4>>3, R7, R7 - - // Convert from &src[ret] to ret. - SUB R6, R7, R7 - MOVD R7, ret+40(FP) - RET - -cmp1: - // In src's tail, compare 1 byte at a time. - CMP R7, R14 - BLS extendMatchEnd - MOVB (R15), R3 - MOVB (R7), R4 - CMP R4, R3 - BNE extendMatchEnd - ADD $1, R15, R15 - ADD $1, R7, R7 - B cmp1 - -extendMatchEnd: - // Convert from &src[ret] to ret. - SUB R6, R7, R7 - MOVD R7, ret+40(FP) - RET - -// ---------------------------------------------------------------------------- - -// func encodeBlock(dst, src []byte) (d int) -// -// All local variables fit into registers, other than "var table". The register -// allocation: -// - R3 . . -// - R4 . . -// - R5 64 shift -// - R6 72 &src[0], tableSize -// - R7 80 &src[s] -// - R8 88 &dst[d] -// - R9 96 sLimit -// - R10 . &src[nextEmit] -// - R11 104 prevHash, currHash, nextHash, offset -// - R12 112 &src[base], skip -// - R13 . &src[nextS], &src[len(src) - 8] -// - R14 . len(src), bytesBetweenHashLookups, &src[len(src)], x -// - R15 120 candidate -// - R16 . hash constant, 0x1e35a7bd -// - R17 . &table -// - . 128 table -// -// The second column (64, 72, etc) is the stack offset to spill the registers -// when calling other functions. We could pack this slightly tighter, but it's -// simpler to have a dedicated spill map independent of the function called. -// -// "var table [maxTableSize]uint16" takes up 32768 bytes of stack space. An -// extra 64 bytes, to call other functions, and an extra 64 bytes, to spill -// local variables (registers) during calls gives 32768 + 64 + 64 = 32896. -TEXT ·encodeBlock(SB), 0, $32896-56 - MOVD dst_base+0(FP), R8 - MOVD src_base+24(FP), R7 - MOVD src_len+32(FP), R14 - - // shift, tableSize := uint32(32-8), 1<<8 - MOVD $24, R5 - MOVD $256, R6 - MOVW $0xa7bd, R16 - MOVKW $(0x1e35<<16), R16 - -calcShift: - // for ; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 { - // shift-- - // } - MOVD $16384, R2 - CMP R2, R6 - BGE varTable - CMP R14, R6 - BGE varTable - SUB $1, R5, R5 - LSL $1, R6, R6 - B calcShift - -varTable: - // var table [maxTableSize]uint16 - // - // In the asm code, unlike the Go code, we can zero-initialize only the - // first tableSize elements. Each uint16 element is 2 bytes and each - // iterations writes 64 bytes, so we can do only tableSize/32 writes - // instead of the 2048 writes that would zero-initialize all of table's - // 32768 bytes. This clear could overrun the first tableSize elements, but - // it won't overrun the allocated stack size. - ADD $128, RSP, R17 - MOVD R17, R4 - - // !!! R6 = &src[tableSize] - ADD R6<<1, R17, R6 - -memclr: - STP.P (ZR, ZR), 64(R4) - STP (ZR, ZR), -48(R4) - STP (ZR, ZR), -32(R4) - STP (ZR, ZR), -16(R4) - CMP R4, R6 - BHI memclr - - // !!! R6 = &src[0] - MOVD R7, R6 - - // sLimit := len(src) - inputMargin - MOVD R14, R9 - SUB $15, R9, R9 - - // !!! Pre-emptively spill R5, R6 and R9 to the stack. Their values don't - // change for the rest of the function. - MOVD R5, 64(RSP) - MOVD R6, 72(RSP) - MOVD R9, 96(RSP) - - // nextEmit := 0 - MOVD R6, R10 - - // s := 1 - ADD $1, R7, R7 - - // nextHash := hash(load32(src, s), shift) - MOVW 0(R7), R11 - MULW R16, R11, R11 - LSRW R5, R11, R11 - -outer: - // for { etc } - - // skip := 32 - MOVD $32, R12 - - // nextS := s - MOVD R7, R13 - - // candidate := 0 - MOVD $0, R15 - -inner0: - // for { etc } - - // s := nextS - MOVD R13, R7 - - // bytesBetweenHashLookups := skip >> 5 - MOVD R12, R14 - LSR $5, R14, R14 - - // nextS = s + bytesBetweenHashLookups - ADD R14, R13, R13 - - // skip += bytesBetweenHashLookups - ADD R14, R12, R12 - - // if nextS > sLimit { goto emitRemainder } - MOVD R13, R3 - SUB R6, R3, R3 - CMP R9, R3 - BHI emitRemainder - - // candidate = int(table[nextHash]) - MOVHU 0(R17)(R11<<1), R15 - - // table[nextHash] = uint16(s) - MOVD R7, R3 - SUB R6, R3, R3 - - MOVH R3, 0(R17)(R11<<1) - - // nextHash = hash(load32(src, nextS), shift) - MOVW 0(R13), R11 - MULW R16, R11 - LSRW R5, R11, R11 - - // if load32(src, s) != load32(src, candidate) { continue } break - MOVW 0(R7), R3 - MOVW (R6)(R15), R4 - CMPW R4, R3 - BNE inner0 - -fourByteMatch: - // As per the encode_other.go code: - // - // A 4-byte match has been found. We'll later see etc. - - // !!! Jump to a fast path for short (<= 16 byte) literals. See the comment - // on inputMargin in encode.go. - MOVD R7, R3 - SUB R10, R3, R3 - CMP $16, R3 - BLE emitLiteralFastPath - - // ---------------------------------------- - // Begin inline of the emitLiteral call. - // - // d += emitLiteral(dst[d:], src[nextEmit:s]) - - MOVW R3, R4 - SUBW $1, R4, R4 - - MOVW $60, R2 - CMPW R2, R4 - BLT inlineEmitLiteralOneByte - MOVW $256, R2 - CMPW R2, R4 - BLT inlineEmitLiteralTwoBytes - -inlineEmitLiteralThreeBytes: - MOVD $0xf4, R1 - MOVB R1, 0(R8) - MOVW R4, 1(R8) - ADD $3, R8, R8 - B inlineEmitLiteralMemmove - -inlineEmitLiteralTwoBytes: - MOVD $0xf0, R1 - MOVB R1, 0(R8) - MOVB R4, 1(R8) - ADD $2, R8, R8 - B inlineEmitLiteralMemmove - -inlineEmitLiteralOneByte: - LSLW $2, R4, R4 - MOVB R4, 0(R8) - ADD $1, R8, R8 - -inlineEmitLiteralMemmove: - // Spill local variables (registers) onto the stack; call; unspill. - // - // copy(dst[i:], lit) - // - // This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push - // R8, R10 and R3 as arguments. - MOVD R8, 8(RSP) - MOVD R10, 16(RSP) - MOVD R3, 24(RSP) - - // Finish the "d +=" part of "d += emitLiteral(etc)". - ADD R3, R8, R8 - MOVD R7, 80(RSP) - MOVD R8, 88(RSP) - MOVD R15, 120(RSP) - CALL runtime·memmove(SB) - MOVD 64(RSP), R5 - MOVD 72(RSP), R6 - MOVD 80(RSP), R7 - MOVD 88(RSP), R8 - MOVD 96(RSP), R9 - MOVD 120(RSP), R15 - ADD $128, RSP, R17 - MOVW $0xa7bd, R16 - MOVKW $(0x1e35<<16), R16 - B inner1 - -inlineEmitLiteralEnd: - // End inline of the emitLiteral call. - // ---------------------------------------- - -emitLiteralFastPath: - // !!! Emit the 1-byte encoding "uint8(len(lit)-1)<<2". - MOVB R3, R4 - SUBW $1, R4, R4 - AND $0xff, R4, R4 - LSLW $2, R4, R4 - MOVB R4, (R8) - ADD $1, R8, R8 - - // !!! Implement the copy from lit to dst as a 16-byte load and store. - // (Encode's documentation says that dst and src must not overlap.) - // - // This always copies 16 bytes, instead of only len(lit) bytes, but that's - // OK. Subsequent iterations will fix up the overrun. - // - // Note that on arm64, it is legal and cheap to issue unaligned 8-byte or - // 16-byte loads and stores. This technique probably wouldn't be as - // effective on architectures that are fussier about alignment. - LDP 0(R10), (R0, R1) - STP (R0, R1), 0(R8) - ADD R3, R8, R8 - -inner1: - // for { etc } - - // base := s - MOVD R7, R12 - - // !!! offset := base - candidate - MOVD R12, R11 - SUB R15, R11, R11 - SUB R6, R11, R11 - - // ---------------------------------------- - // Begin inline of the extendMatch call. - // - // s = extendMatch(src, candidate+4, s+4) - - // !!! R14 = &src[len(src)] - MOVD src_len+32(FP), R14 - ADD R6, R14, R14 - - // !!! R13 = &src[len(src) - 8] - MOVD R14, R13 - SUB $8, R13, R13 - - // !!! R15 = &src[candidate + 4] - ADD $4, R15, R15 - ADD R6, R15, R15 - - // !!! s += 4 - ADD $4, R7, R7 - -inlineExtendMatchCmp8: - // As long as we are 8 or more bytes before the end of src, we can load and - // compare 8 bytes at a time. If those 8 bytes are equal, repeat. - CMP R13, R7 - BHI inlineExtendMatchCmp1 - MOVD (R15), R3 - MOVD (R7), R4 - CMP R4, R3 - BNE inlineExtendMatchBSF - ADD $8, R15, R15 - ADD $8, R7, R7 - B inlineExtendMatchCmp8 - -inlineExtendMatchBSF: - // If those 8 bytes were not equal, XOR the two 8 byte values, and return - // the index of the first byte that differs. - // RBIT reverses the bit order, then CLZ counts the leading zeros, the - // combination of which finds the least significant bit which is set. - // The arm64 architecture is little-endian, and the shift by 3 converts - // a bit index to a byte index. - EOR R3, R4, R4 - RBIT R4, R4 - CLZ R4, R4 - ADD R4>>3, R7, R7 - B inlineExtendMatchEnd - -inlineExtendMatchCmp1: - // In src's tail, compare 1 byte at a time. - CMP R7, R14 - BLS inlineExtendMatchEnd - MOVB (R15), R3 - MOVB (R7), R4 - CMP R4, R3 - BNE inlineExtendMatchEnd - ADD $1, R15, R15 - ADD $1, R7, R7 - B inlineExtendMatchCmp1 - -inlineExtendMatchEnd: - // End inline of the extendMatch call. - // ---------------------------------------- - - // ---------------------------------------- - // Begin inline of the emitCopy call. - // - // d += emitCopy(dst[d:], base-candidate, s-base) - - // !!! length := s - base - MOVD R7, R3 - SUB R12, R3, R3 - -inlineEmitCopyLoop0: - // for length >= 68 { etc } - MOVW $68, R2 - CMPW R2, R3 - BLT inlineEmitCopyStep1 - - // Emit a length 64 copy, encoded as 3 bytes. - MOVD $0xfe, R1 - MOVB R1, 0(R8) - MOVW R11, 1(R8) - ADD $3, R8, R8 - SUBW $64, R3, R3 - B inlineEmitCopyLoop0 - -inlineEmitCopyStep1: - // if length > 64 { etc } - MOVW $64, R2 - CMPW R2, R3 - BLE inlineEmitCopyStep2 - - // Emit a length 60 copy, encoded as 3 bytes. - MOVD $0xee, R1 - MOVB R1, 0(R8) - MOVW R11, 1(R8) - ADD $3, R8, R8 - SUBW $60, R3, R3 - -inlineEmitCopyStep2: - // if length >= 12 || offset >= 2048 { goto inlineEmitCopyStep3 } - MOVW $12, R2 - CMPW R2, R3 - BGE inlineEmitCopyStep3 - MOVW $2048, R2 - CMPW R2, R11 - BGE inlineEmitCopyStep3 - - // Emit the remaining copy, encoded as 2 bytes. - MOVB R11, 1(R8) - LSRW $8, R11, R11 - LSLW $5, R11, R11 - SUBW $4, R3, R3 - AND $0xff, R3, R3 - LSLW $2, R3, R3 - ORRW R3, R11, R11 - ORRW $1, R11, R11 - MOVB R11, 0(R8) - ADD $2, R8, R8 - B inlineEmitCopyEnd - -inlineEmitCopyStep3: - // Emit the remaining copy, encoded as 3 bytes. - SUBW $1, R3, R3 - LSLW $2, R3, R3 - ORRW $2, R3, R3 - MOVB R3, 0(R8) - MOVW R11, 1(R8) - ADD $3, R8, R8 - -inlineEmitCopyEnd: - // End inline of the emitCopy call. - // ---------------------------------------- - - // nextEmit = s - MOVD R7, R10 - - // if s >= sLimit { goto emitRemainder } - MOVD R7, R3 - SUB R6, R3, R3 - CMP R3, R9 - BLS emitRemainder - - // As per the encode_other.go code: - // - // We could immediately etc. - - // x := load64(src, s-1) - MOVD -1(R7), R14 - - // prevHash := hash(uint32(x>>0), shift) - MOVW R14, R11 - MULW R16, R11, R11 - LSRW R5, R11, R11 - - // table[prevHash] = uint16(s-1) - MOVD R7, R3 - SUB R6, R3, R3 - SUB $1, R3, R3 - - MOVHU R3, 0(R17)(R11<<1) - - // currHash := hash(uint32(x>>8), shift) - LSR $8, R14, R14 - MOVW R14, R11 - MULW R16, R11, R11 - LSRW R5, R11, R11 - - // candidate = int(table[currHash]) - MOVHU 0(R17)(R11<<1), R15 - - // table[currHash] = uint16(s) - ADD $1, R3, R3 - MOVHU R3, 0(R17)(R11<<1) - - // if uint32(x>>8) == load32(src, candidate) { continue } - MOVW (R6)(R15), R4 - CMPW R4, R14 - BEQ inner1 - - // nextHash = hash(uint32(x>>16), shift) - LSR $8, R14, R14 - MOVW R14, R11 - MULW R16, R11, R11 - LSRW R5, R11, R11 - - // s++ - ADD $1, R7, R7 - - // break out of the inner1 for loop, i.e. continue the outer loop. - B outer - -emitRemainder: - // if nextEmit < len(src) { etc } - MOVD src_len+32(FP), R3 - ADD R6, R3, R3 - CMP R3, R10 - BEQ encodeBlockEnd - - // d += emitLiteral(dst[d:], src[nextEmit:]) - // - // Push args. - MOVD R8, 8(RSP) - MOVD $0, 16(RSP) // Unnecessary, as the callee ignores it, but conservative. - MOVD $0, 24(RSP) // Unnecessary, as the callee ignores it, but conservative. - MOVD R10, 32(RSP) - SUB R10, R3, R3 - MOVD R3, 40(RSP) - MOVD R3, 48(RSP) // Unnecessary, as the callee ignores it, but conservative. - - // Spill local variables (registers) onto the stack; call; unspill. - MOVD R8, 88(RSP) - CALL ·emitLiteral(SB) - MOVD 88(RSP), R8 - - // Finish the "d +=" part of "d += emitLiteral(etc)". - MOVD 56(RSP), R1 - ADD R1, R8, R8 - -encodeBlockEnd: - MOVD dst_base+0(FP), R3 - SUB R3, R8, R8 - MOVD R8, d+48(FP) - RET diff --git a/vendor/github.com/golang/snappy/encode_asm.go b/vendor/github.com/golang/snappy/encode_asm.go deleted file mode 100644 index 107c1e7141..0000000000 --- a/vendor/github.com/golang/snappy/encode_asm.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2016 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine -// +build gc -// +build !noasm -// +build amd64 arm64 - -package snappy - -// emitLiteral has the same semantics as in encode_other.go. -// -//go:noescape -func emitLiteral(dst, lit []byte) int - -// emitCopy has the same semantics as in encode_other.go. -// -//go:noescape -func emitCopy(dst []byte, offset, length int) int - -// extendMatch has the same semantics as in encode_other.go. -// -//go:noescape -func extendMatch(src []byte, i, j int) int - -// encodeBlock has the same semantics as in encode_other.go. -// -//go:noescape -func encodeBlock(dst, src []byte) (d int) diff --git a/vendor/github.com/golang/snappy/encode_other.go b/vendor/github.com/golang/snappy/encode_other.go deleted file mode 100644 index 296d7f0beb..0000000000 --- a/vendor/github.com/golang/snappy/encode_other.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2016 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !amd64,!arm64 appengine !gc noasm - -package snappy - -func load32(b []byte, i int) uint32 { - b = b[i : i+4 : len(b)] // Help the compiler eliminate bounds checks on the next line. - return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 -} - -func load64(b []byte, i int) uint64 { - b = b[i : i+8 : len(b)] // Help the compiler eliminate bounds checks on the next line. - return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | - uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 -} - -// emitLiteral writes a literal chunk and returns the number of bytes written. -// -// It assumes that: -// dst is long enough to hold the encoded bytes -// 1 <= len(lit) && len(lit) <= 65536 -func emitLiteral(dst, lit []byte) int { - i, n := 0, uint(len(lit)-1) - switch { - case n < 60: - dst[0] = uint8(n)<<2 | tagLiteral - i = 1 - case n < 1<<8: - dst[0] = 60<<2 | tagLiteral - dst[1] = uint8(n) - i = 2 - default: - dst[0] = 61<<2 | tagLiteral - dst[1] = uint8(n) - dst[2] = uint8(n >> 8) - i = 3 - } - return i + copy(dst[i:], lit) -} - -// emitCopy writes a copy chunk and returns the number of bytes written. -// -// It assumes that: -// dst is long enough to hold the encoded bytes -// 1 <= offset && offset <= 65535 -// 4 <= length && length <= 65535 -func emitCopy(dst []byte, offset, length int) int { - i := 0 - // The maximum length for a single tagCopy1 or tagCopy2 op is 64 bytes. The - // threshold for this loop is a little higher (at 68 = 64 + 4), and the - // length emitted down below is is a little lower (at 60 = 64 - 4), because - // it's shorter to encode a length 67 copy as a length 60 tagCopy2 followed - // by a length 7 tagCopy1 (which encodes as 3+2 bytes) than to encode it as - // a length 64 tagCopy2 followed by a length 3 tagCopy2 (which encodes as - // 3+3 bytes). The magic 4 in the 64±4 is because the minimum length for a - // tagCopy1 op is 4 bytes, which is why a length 3 copy has to be an - // encodes-as-3-bytes tagCopy2 instead of an encodes-as-2-bytes tagCopy1. - for length >= 68 { - // Emit a length 64 copy, encoded as 3 bytes. - dst[i+0] = 63<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - i += 3 - length -= 64 - } - if length > 64 { - // Emit a length 60 copy, encoded as 3 bytes. - dst[i+0] = 59<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - i += 3 - length -= 60 - } - if length >= 12 || offset >= 2048 { - // Emit the remaining copy, encoded as 3 bytes. - dst[i+0] = uint8(length-1)<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - return i + 3 - } - // Emit the remaining copy, encoded as 2 bytes. - dst[i+0] = uint8(offset>>8)<<5 | uint8(length-4)<<2 | tagCopy1 - dst[i+1] = uint8(offset) - return i + 2 -} - -// extendMatch returns the largest k such that k <= len(src) and that -// src[i:i+k-j] and src[j:k] have the same contents. -// -// It assumes that: -// 0 <= i && i < j && j <= len(src) -func extendMatch(src []byte, i, j int) int { - for ; j < len(src) && src[i] == src[j]; i, j = i+1, j+1 { - } - return j -} - -func hash(u, shift uint32) uint32 { - return (u * 0x1e35a7bd) >> shift -} - -// encodeBlock encodes a non-empty src to a guaranteed-large-enough dst. It -// assumes that the varint-encoded length of the decompressed bytes has already -// been written. -// -// It also assumes that: -// len(dst) >= MaxEncodedLen(len(src)) && -// minNonLiteralBlockSize <= len(src) && len(src) <= maxBlockSize -func encodeBlock(dst, src []byte) (d int) { - // Initialize the hash table. Its size ranges from 1<<8 to 1<<14 inclusive. - // The table element type is uint16, as s < sLimit and sLimit < len(src) - // and len(src) <= maxBlockSize and maxBlockSize == 65536. - const ( - maxTableSize = 1 << 14 - // tableMask is redundant, but helps the compiler eliminate bounds - // checks. - tableMask = maxTableSize - 1 - ) - shift := uint32(32 - 8) - for tableSize := 1 << 8; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 { - shift-- - } - // In Go, all array elements are zero-initialized, so there is no advantage - // to a smaller tableSize per se. However, it matches the C++ algorithm, - // and in the asm versions of this code, we can get away with zeroing only - // the first tableSize elements. - var table [maxTableSize]uint16 - - // sLimit is when to stop looking for offset/length copies. The inputMargin - // lets us use a fast path for emitLiteral in the main loop, while we are - // looking for copies. - sLimit := len(src) - inputMargin - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := 0 - - // The encoded form must start with a literal, as there are no previous - // bytes to copy, so we start looking for hash matches at s == 1. - s := 1 - nextHash := hash(load32(src, s), shift) - - for { - // Copied from the C++ snappy implementation: - // - // Heuristic match skipping: If 32 bytes are scanned with no matches - // found, start looking only at every other byte. If 32 more bytes are - // scanned (or skipped), look at every third byte, etc.. When a match - // is found, immediately go back to looking at every byte. This is a - // small loss (~5% performance, ~0.1% density) for compressible data - // due to more bookkeeping, but for non-compressible data (such as - // JPEG) it's a huge win since the compressor quickly "realizes" the - // data is incompressible and doesn't bother looking for matches - // everywhere. - // - // The "skip" variable keeps track of how many bytes there are since - // the last match; dividing it by 32 (ie. right-shifting by five) gives - // the number of bytes to move ahead for each iteration. - skip := 32 - - nextS := s - candidate := 0 - for { - s = nextS - bytesBetweenHashLookups := skip >> 5 - nextS = s + bytesBetweenHashLookups - skip += bytesBetweenHashLookups - if nextS > sLimit { - goto emitRemainder - } - candidate = int(table[nextHash&tableMask]) - table[nextHash&tableMask] = uint16(s) - nextHash = hash(load32(src, nextS), shift) - if load32(src, s) == load32(src, candidate) { - break - } - } - - // A 4-byte match has been found. We'll later see if more than 4 bytes - // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit - // them as literal bytes. - d += emitLiteral(dst[d:], src[nextEmit:s]) - - // Call emitCopy, and then see if another emitCopy could be our next - // move. Repeat until we find no match for the input immediately after - // what was consumed by the last emitCopy call. - // - // If we exit this loop normally then we need to call emitLiteral next, - // though we don't yet know how big the literal will be. We handle that - // by proceeding to the next iteration of the main loop. We also can - // exit this loop via goto if we get close to exhausting the input. - for { - // Invariant: we have a 4-byte match at s, and no need to emit any - // literal bytes prior to s. - base := s - - // Extend the 4-byte match as long as possible. - // - // This is an inlined version of: - // s = extendMatch(src, candidate+4, s+4) - s += 4 - for i := candidate + 4; s < len(src) && src[i] == src[s]; i, s = i+1, s+1 { - } - - d += emitCopy(dst[d:], base-candidate, s-base) - nextEmit = s - if s >= sLimit { - goto emitRemainder - } - - // We could immediately start working at s now, but to improve - // compression we first update the hash table at s-1 and at s. If - // another emitCopy is not our next move, also calculate nextHash - // at s+1. At least on GOARCH=amd64, these three hash calculations - // are faster as one load64 call (with some shifts) instead of - // three load32 calls. - x := load64(src, s-1) - prevHash := hash(uint32(x>>0), shift) - table[prevHash&tableMask] = uint16(s - 1) - currHash := hash(uint32(x>>8), shift) - candidate = int(table[currHash&tableMask]) - table[currHash&tableMask] = uint16(s) - if uint32(x>>8) != load32(src, candidate) { - nextHash = hash(uint32(x>>16), shift) - s++ - break - } - } - } - -emitRemainder: - if nextEmit < len(src) { - d += emitLiteral(dst[d:], src[nextEmit:]) - } - return d -} diff --git a/vendor/github.com/golang/snappy/snappy.go b/vendor/github.com/golang/snappy/snappy.go deleted file mode 100644 index ece692ea46..0000000000 --- a/vendor/github.com/golang/snappy/snappy.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2011 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package snappy implements the Snappy compression format. It aims for very -// high speeds and reasonable compression. -// -// There are actually two Snappy formats: block and stream. They are related, -// but different: trying to decompress block-compressed data as a Snappy stream -// will fail, and vice versa. The block format is the Decode and Encode -// functions and the stream format is the Reader and Writer types. -// -// The block format, the more common case, is used when the complete size (the -// number of bytes) of the original data is known upfront, at the time -// compression starts. The stream format, also known as the framing format, is -// for when that isn't always true. -// -// The canonical, C++ implementation is at https://github.com/google/snappy and -// it only implements the block format. -package snappy // import "github.com/golang/snappy" - -import ( - "hash/crc32" -) - -/* -Each encoded block begins with the varint-encoded length of the decoded data, -followed by a sequence of chunks. Chunks begin and end on byte boundaries. The -first byte of each chunk is broken into its 2 least and 6 most significant bits -called l and m: l ranges in [0, 4) and m ranges in [0, 64). l is the chunk tag. -Zero means a literal tag. All other values mean a copy tag. - -For literal tags: - - If m < 60, the next 1 + m bytes are literal bytes. - - Otherwise, let n be the little-endian unsigned integer denoted by the next - m - 59 bytes. The next 1 + n bytes after that are literal bytes. - -For copy tags, length bytes are copied from offset bytes ago, in the style of -Lempel-Ziv compression algorithms. In particular: - - For l == 1, the offset ranges in [0, 1<<11) and the length in [4, 12). - The length is 4 + the low 3 bits of m. The high 3 bits of m form bits 8-10 - of the offset. The next byte is bits 0-7 of the offset. - - For l == 2, the offset ranges in [0, 1<<16) and the length in [1, 65). - The length is 1 + m. The offset is the little-endian unsigned integer - denoted by the next 2 bytes. - - For l == 3, this tag is a legacy format that is no longer issued by most - encoders. Nonetheless, the offset ranges in [0, 1<<32) and the length in - [1, 65). The length is 1 + m. The offset is the little-endian unsigned - integer denoted by the next 4 bytes. -*/ -const ( - tagLiteral = 0x00 - tagCopy1 = 0x01 - tagCopy2 = 0x02 - tagCopy4 = 0x03 -) - -const ( - checksumSize = 4 - chunkHeaderSize = 4 - magicChunk = "\xff\x06\x00\x00" + magicBody - magicBody = "sNaPpY" - - // maxBlockSize is the maximum size of the input to encodeBlock. It is not - // part of the wire format per se, but some parts of the encoder assume - // that an offset fits into a uint16. - // - // Also, for the framing format (Writer type instead of Encode function), - // https://github.com/google/snappy/blob/master/framing_format.txt says - // that "the uncompressed data in a chunk must be no longer than 65536 - // bytes". - maxBlockSize = 65536 - - // maxEncodedLenOfMaxBlockSize equals MaxEncodedLen(maxBlockSize), but is - // hard coded to be a const instead of a variable, so that obufLen can also - // be a const. Their equivalence is confirmed by - // TestMaxEncodedLenOfMaxBlockSize. - maxEncodedLenOfMaxBlockSize = 76490 - - obufHeaderLen = len(magicChunk) + checksumSize + chunkHeaderSize - obufLen = obufHeaderLen + maxEncodedLenOfMaxBlockSize -) - -const ( - chunkTypeCompressedData = 0x00 - chunkTypeUncompressedData = 0x01 - chunkTypePadding = 0xfe - chunkTypeStreamIdentifier = 0xff -) - -var crcTable = crc32.MakeTable(crc32.Castagnoli) - -// crc implements the checksum specified in section 3 of -// https://github.com/google/snappy/blob/master/framing_format.txt -func crc(b []byte) uint32 { - c := crc32.Update(0, crcTable, b) - return uint32(c>>15|c<<17) + 0xa282ead8 -} diff --git a/vendor/github.com/google/flatbuffers/LICENSE b/vendor/github.com/google/flatbuffers/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/vendor/github.com/google/flatbuffers/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/google/flatbuffers/go/BUILD.bazel b/vendor/github.com/google/flatbuffers/go/BUILD.bazel deleted file mode 100644 index 78bd8d81ad..0000000000 --- a/vendor/github.com/google/flatbuffers/go/BUILD.bazel +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -alias( - name = "go_default_library", - actual = ":go", - visibility = ["//visibility:public"], -) - -go_library( - name = "go", - srcs = [ - "builder.go", - "doc.go", - "encode.go", - "grpc.go", - "lib.go", - "sizes.go", - "struct.go", - "table.go", - ], - importpath = "github.com/google/flatbuffers/go", - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/google/flatbuffers/go/builder.go b/vendor/github.com/google/flatbuffers/go/builder.go deleted file mode 100644 index 5d90e8ef98..0000000000 --- a/vendor/github.com/google/flatbuffers/go/builder.go +++ /dev/null @@ -1,856 +0,0 @@ -package flatbuffers - -import "sort" - -// Builder is a state machine for creating FlatBuffer objects. -// Use a Builder to construct object(s) starting from leaf nodes. -// -// A Builder constructs byte buffers in a last-first manner for simplicity and -// performance. -type Builder struct { - // `Bytes` gives raw access to the buffer. Most users will want to use - // FinishedBytes() instead. - Bytes []byte - - minalign int - vtable []UOffsetT - objectEnd UOffsetT - vtables []UOffsetT - head UOffsetT - nested bool - finished bool - - sharedStrings map[string]UOffsetT -} - -const fileIdentifierLength = 4 -const sizePrefixLength = 4 - -// NewBuilder initializes a Builder of size `initial_size`. -// The internal buffer is grown as needed. -func NewBuilder(initialSize int) *Builder { - if initialSize <= 0 { - initialSize = 0 - } - - b := &Builder{} - b.Bytes = make([]byte, initialSize) - b.head = UOffsetT(initialSize) - b.minalign = 1 - b.vtables = make([]UOffsetT, 0, 16) // sensible default capacity - return b -} - -// Reset truncates the underlying Builder buffer, facilitating alloc-free -// reuse of a Builder. It also resets bookkeeping data. -func (b *Builder) Reset() { - if b.Bytes != nil { - b.Bytes = b.Bytes[:cap(b.Bytes)] - } - - if b.vtables != nil { - b.vtables = b.vtables[:0] - } - - if b.vtable != nil { - b.vtable = b.vtable[:0] - } - - if b.sharedStrings != nil { - for key := range b.sharedStrings { - delete(b.sharedStrings, key) - } - } - - b.head = UOffsetT(len(b.Bytes)) - b.minalign = 1 - b.nested = false - b.finished = false -} - -// FinishedBytes returns a pointer to the written data in the byte buffer. -// Panics if the builder is not in a finished state (which is caused by calling -// `Finish()`). -func (b *Builder) FinishedBytes() []byte { - b.assertFinished() - return b.Bytes[b.Head():] -} - -// StartObject initializes bookkeeping for writing a new object. -func (b *Builder) StartObject(numfields int) { - b.assertNotNested() - b.nested = true - - // use 32-bit offsets so that arithmetic doesn't overflow. - if cap(b.vtable) < numfields || b.vtable == nil { - b.vtable = make([]UOffsetT, numfields) - } else { - b.vtable = b.vtable[:numfields] - for i := 0; i < len(b.vtable); i++ { - b.vtable[i] = 0 - } - } - - b.objectEnd = b.Offset() -} - -// WriteVtable serializes the vtable for the current object, if applicable. -// -// Before writing out the vtable, this checks pre-existing vtables for equality -// to this one. If an equal vtable is found, point the object to the existing -// vtable and return. -// -// Because vtable values are sensitive to alignment of object data, not all -// logically-equal vtables will be deduplicated. -// -// A vtable has the following format: -// -// -// * N, where N is the number of fields in -// the schema for this type. Includes deprecated fields. -// Thus, a vtable is made of 2 + N elements, each SizeVOffsetT bytes wide. -// -// An object has the following format: -// -// + -func (b *Builder) WriteVtable() (n UOffsetT) { - // Prepend a zero scalar to the object. Later in this function we'll - // write an offset here that points to the object's vtable: - b.PrependSOffsetT(0) - - objectOffset := b.Offset() - existingVtable := UOffsetT(0) - - // Trim vtable of trailing zeroes. - i := len(b.vtable) - 1 - for ; i >= 0 && b.vtable[i] == 0; i-- { - } - b.vtable = b.vtable[:i+1] - - // Search backwards through existing vtables, because similar vtables - // are likely to have been recently appended. See - // BenchmarkVtableDeduplication for a case in which this heuristic - // saves about 30% of the time used in writing objects with duplicate - // tables. - for i := len(b.vtables) - 1; i >= 0; i-- { - // Find the other vtable, which is associated with `i`: - vt2Offset := b.vtables[i] - vt2Start := len(b.Bytes) - int(vt2Offset) - vt2Len := GetVOffsetT(b.Bytes[vt2Start:]) - - metadata := VtableMetadataFields * SizeVOffsetT - vt2End := vt2Start + int(vt2Len) - vt2 := b.Bytes[vt2Start+metadata : vt2End] - - // Compare the other vtable to the one under consideration. - // If they are equal, store the offset and break: - if vtableEqual(b.vtable, objectOffset, vt2) { - existingVtable = vt2Offset - break - } - } - - if existingVtable == 0 { - // Did not find a vtable, so write this one to the buffer. - - // Write out the current vtable in reverse , because - // serialization occurs in last-first order: - for i := len(b.vtable) - 1; i >= 0; i-- { - var off UOffsetT - if b.vtable[i] != 0 { - // Forward reference to field; - // use 32bit number to assert no overflow: - off = objectOffset - b.vtable[i] - } - - b.PrependVOffsetT(VOffsetT(off)) - } - - // The two metadata fields are written last. - - // First, store the object bytesize: - objectSize := objectOffset - b.objectEnd - b.PrependVOffsetT(VOffsetT(objectSize)) - - // Second, store the vtable bytesize: - vBytes := (len(b.vtable) + VtableMetadataFields) * SizeVOffsetT - b.PrependVOffsetT(VOffsetT(vBytes)) - - // Next, write the offset to the new vtable in the - // already-allocated SOffsetT at the beginning of this object: - objectStart := SOffsetT(len(b.Bytes)) - SOffsetT(objectOffset) - WriteSOffsetT(b.Bytes[objectStart:], - SOffsetT(b.Offset())-SOffsetT(objectOffset)) - - // Finally, store this vtable in memory for future - // deduplication: - b.vtables = append(b.vtables, b.Offset()) - } else { - // Found a duplicate vtable. - - objectStart := SOffsetT(len(b.Bytes)) - SOffsetT(objectOffset) - b.head = UOffsetT(objectStart) - - // Write the offset to the found vtable in the - // already-allocated SOffsetT at the beginning of this object: - WriteSOffsetT(b.Bytes[b.head:], - SOffsetT(existingVtable)-SOffsetT(objectOffset)) - } - - b.vtable = b.vtable[:0] - return objectOffset -} - -// EndObject writes data necessary to finish object construction. -func (b *Builder) EndObject() UOffsetT { - b.assertNested() - n := b.WriteVtable() - b.nested = false - return n -} - -// Doubles the size of the byteslice, and copies the old data towards the -// end of the new byteslice (since we build the buffer backwards). -func (b *Builder) growByteBuffer() { - if (int64(len(b.Bytes)) & int64(0xC0000000)) != 0 { - panic("cannot grow buffer beyond 2 gigabytes") - } - newLen := len(b.Bytes) * 2 - if newLen == 0 { - newLen = 1 - } - - if cap(b.Bytes) >= newLen { - b.Bytes = b.Bytes[:newLen] - } else { - extension := make([]byte, newLen-len(b.Bytes)) - b.Bytes = append(b.Bytes, extension...) - } - - middle := newLen / 2 - copy(b.Bytes[middle:], b.Bytes[:middle]) -} - -// Head gives the start of useful data in the underlying byte buffer. -// Note: unlike other functions, this value is interpreted as from the left. -func (b *Builder) Head() UOffsetT { - return b.head -} - -// Offset relative to the end of the buffer. -func (b *Builder) Offset() UOffsetT { - return UOffsetT(len(b.Bytes)) - b.head -} - -// Pad places zeros at the current offset. -func (b *Builder) Pad(n int) { - for i := 0; i < n; i++ { - b.PlaceByte(0) - } -} - -// Prep prepares to write an element of `size` after `additional_bytes` -// have been written, e.g. if you write a string, you need to align such -// the int length field is aligned to SizeInt32, and the string data follows it -// directly. -// If all you need to do is align, `additionalBytes` will be 0. -func (b *Builder) Prep(size, additionalBytes int) { - // Track the biggest thing we've ever aligned to. - if size > b.minalign { - b.minalign = size - } - // Find the amount of alignment needed such that `size` is properly - // aligned after `additionalBytes`: - alignSize := (^(len(b.Bytes) - int(b.Head()) + additionalBytes)) + 1 - alignSize &= (size - 1) - - // Reallocate the buffer if needed: - for int(b.head) <= alignSize+size+additionalBytes { - oldBufSize := len(b.Bytes) - b.growByteBuffer() - b.head += UOffsetT(len(b.Bytes) - oldBufSize) - } - b.Pad(alignSize) -} - -// PrependSOffsetT prepends an SOffsetT, relative to where it will be written. -func (b *Builder) PrependSOffsetT(off SOffsetT) { - b.Prep(SizeSOffsetT, 0) // Ensure alignment is already done. - if !(UOffsetT(off) <= b.Offset()) { - panic("unreachable: off <= b.Offset()") - } - off2 := SOffsetT(b.Offset()) - off + SOffsetT(SizeSOffsetT) - b.PlaceSOffsetT(off2) -} - -// PrependUOffsetT prepends an UOffsetT, relative to where it will be written. -func (b *Builder) PrependUOffsetT(off UOffsetT) { - b.Prep(SizeUOffsetT, 0) // Ensure alignment is already done. - if !(off <= b.Offset()) { - panic("unreachable: off <= b.Offset()") - } - off2 := b.Offset() - off + UOffsetT(SizeUOffsetT) - b.PlaceUOffsetT(off2) -} - -// StartVector initializes bookkeeping for writing a new vector. -// -// A vector has the following format: -// -// +, where T is the type of elements of this vector. -func (b *Builder) StartVector(elemSize, numElems, alignment int) UOffsetT { - b.assertNotNested() - b.nested = true - b.Prep(SizeUint32, elemSize*numElems) - b.Prep(alignment, elemSize*numElems) // Just in case alignment > int. - return b.Offset() -} - -// EndVector writes data necessary to finish vector construction. -func (b *Builder) EndVector(vectorNumElems int) UOffsetT { - b.assertNested() - - // we already made space for this, so write without PrependUint32 - b.PlaceUOffsetT(UOffsetT(vectorNumElems)) - - b.nested = false - return b.Offset() -} - -// CreateVectorOfTables serializes slice of table offsets into a vector. -func (b *Builder) CreateVectorOfTables(offsets []UOffsetT) UOffsetT { - b.assertNotNested() - b.StartVector(4, len(offsets), 4) - for i := len(offsets) - 1; i >= 0; i-- { - b.PrependUOffsetT(offsets[i]) - } - return b.EndVector(len(offsets)) -} - -type KeyCompare func(o1, o2 UOffsetT, buf []byte) bool - -func (b *Builder) CreateVectorOfSortedTables(offsets []UOffsetT, keyCompare KeyCompare) UOffsetT { - sort.Slice(offsets, func(i, j int) bool { - return keyCompare(offsets[i], offsets[j], b.Bytes) - }) - return b.CreateVectorOfTables(offsets) -} - -// CreateSharedString Checks if the string is already written -// to the buffer before calling CreateString -func (b *Builder) CreateSharedString(s string) UOffsetT { - if b.sharedStrings == nil { - b.sharedStrings = make(map[string]UOffsetT) - } - if v, ok := b.sharedStrings[s]; ok { - return v - } - off := b.CreateString(s) - b.sharedStrings[s] = off - return off -} - -// CreateString writes a null-terminated string as a vector. -func (b *Builder) CreateString(s string) UOffsetT { - b.assertNotNested() - b.nested = true - - b.Prep(int(SizeUOffsetT), (len(s)+1)*SizeByte) - b.PlaceByte(0) - - l := UOffsetT(len(s)) - - b.head -= l - copy(b.Bytes[b.head:b.head+l], s) - - return b.EndVector(len(s)) -} - -// CreateByteString writes a byte slice as a string (null-terminated). -func (b *Builder) CreateByteString(s []byte) UOffsetT { - b.assertNotNested() - b.nested = true - - b.Prep(int(SizeUOffsetT), (len(s)+1)*SizeByte) - b.PlaceByte(0) - - l := UOffsetT(len(s)) - - b.head -= l - copy(b.Bytes[b.head:b.head+l], s) - - return b.EndVector(len(s)) -} - -// CreateByteVector writes a ubyte vector -func (b *Builder) CreateByteVector(v []byte) UOffsetT { - b.assertNotNested() - b.nested = true - - b.Prep(int(SizeUOffsetT), len(v)*SizeByte) - - l := UOffsetT(len(v)) - - b.head -= l - copy(b.Bytes[b.head:b.head+l], v) - - return b.EndVector(len(v)) -} - -func (b *Builder) assertNested() { - // If you get this assert, you're in an object while trying to write - // data that belongs outside of an object. - // To fix this, write non-inline data (like vectors) before creating - // objects. - if !b.nested { - panic("Incorrect creation order: must be inside object.") - } -} - -func (b *Builder) assertNotNested() { - // If you hit this, you're trying to construct a Table/Vector/String - // during the construction of its parent table (between the MyTableBuilder - // and builder.Finish()). - // Move the creation of these sub-objects to above the MyTableBuilder to - // not get this assert. - // Ignoring this assert may appear to work in simple cases, but the reason - // it is here is that storing objects in-line may cause vtable offsets - // to not fit anymore. It also leads to vtable duplication. - if b.nested { - panic("Incorrect creation order: object must not be nested.") - } -} - -func (b *Builder) assertFinished() { - // If you get this assert, you're attempting to get access a buffer - // which hasn't been finished yet. Be sure to call builder.Finish() - // with your root table. - // If you really need to access an unfinished buffer, use the Bytes - // buffer directly. - if !b.finished { - panic("Incorrect use of FinishedBytes(): must call 'Finish' first.") - } -} - -// PrependBoolSlot prepends a bool onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependBoolSlot(o int, x, d bool) { - val := byte(0) - if x { - val = 1 - } - def := byte(0) - if d { - def = 1 - } - b.PrependByteSlot(o, val, def) -} - -// PrependByteSlot prepends a byte onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependByteSlot(o int, x, d byte) { - if x != d { - b.PrependByte(x) - b.Slot(o) - } -} - -// PrependUint8Slot prepends a uint8 onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependUint8Slot(o int, x, d uint8) { - if x != d { - b.PrependUint8(x) - b.Slot(o) - } -} - -// PrependUint16Slot prepends a uint16 onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependUint16Slot(o int, x, d uint16) { - if x != d { - b.PrependUint16(x) - b.Slot(o) - } -} - -// PrependUint32Slot prepends a uint32 onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependUint32Slot(o int, x, d uint32) { - if x != d { - b.PrependUint32(x) - b.Slot(o) - } -} - -// PrependUint64Slot prepends a uint64 onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependUint64Slot(o int, x, d uint64) { - if x != d { - b.PrependUint64(x) - b.Slot(o) - } -} - -// PrependInt8Slot prepends a int8 onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependInt8Slot(o int, x, d int8) { - if x != d { - b.PrependInt8(x) - b.Slot(o) - } -} - -// PrependInt16Slot prepends a int16 onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependInt16Slot(o int, x, d int16) { - if x != d { - b.PrependInt16(x) - b.Slot(o) - } -} - -// PrependInt32Slot prepends a int32 onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependInt32Slot(o int, x, d int32) { - if x != d { - b.PrependInt32(x) - b.Slot(o) - } -} - -// PrependInt64Slot prepends a int64 onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependInt64Slot(o int, x, d int64) { - if x != d { - b.PrependInt64(x) - b.Slot(o) - } -} - -// PrependFloat32Slot prepends a float32 onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependFloat32Slot(o int, x, d float32) { - if x != d { - b.PrependFloat32(x) - b.Slot(o) - } -} - -// PrependFloat64Slot prepends a float64 onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependFloat64Slot(o int, x, d float64) { - if x != d { - b.PrependFloat64(x) - b.Slot(o) - } -} - -// PrependUOffsetTSlot prepends an UOffsetT onto the object at vtable slot `o`. -// If value `x` equals default `d`, then the slot will be set to zero and no -// other data will be written. -func (b *Builder) PrependUOffsetTSlot(o int, x, d UOffsetT) { - if x != d { - b.PrependUOffsetT(x) - b.Slot(o) - } -} - -// PrependStructSlot prepends a struct onto the object at vtable slot `o`. -// Structs are stored inline, so nothing additional is being added. -// In generated code, `d` is always 0. -func (b *Builder) PrependStructSlot(voffset int, x, d UOffsetT) { - if x != d { - b.assertNested() - if x != b.Offset() { - panic("inline data write outside of object") - } - b.Slot(voffset) - } -} - -// Slot sets the vtable key `voffset` to the current location in the buffer. -func (b *Builder) Slot(slotnum int) { - b.vtable[slotnum] = UOffsetT(b.Offset()) -} - -// FinishWithFileIdentifier finalizes a buffer, pointing to the given `rootTable`. -// as well as applys a file identifier -func (b *Builder) FinishWithFileIdentifier(rootTable UOffsetT, fid []byte) { - if fid == nil || len(fid) != fileIdentifierLength { - panic("incorrect file identifier length") - } - // In order to add a file identifier to the flatbuffer message, we need - // to prepare an alignment and file identifier length - b.Prep(b.minalign, SizeInt32+fileIdentifierLength) - for i := fileIdentifierLength - 1; i >= 0; i-- { - // place the file identifier - b.PlaceByte(fid[i]) - } - // finish - b.Finish(rootTable) -} - -// FinishSizePrefixed finalizes a buffer, pointing to the given `rootTable`. -// The buffer is prefixed with the size of the buffer, excluding the size -// of the prefix itself. -func (b *Builder) FinishSizePrefixed(rootTable UOffsetT) { - b.finish(rootTable, true) -} - -// FinishSizePrefixedWithFileIdentifier finalizes a buffer, pointing to the given `rootTable` -// and applies a file identifier. The buffer is prefixed with the size of the buffer, -// excluding the size of the prefix itself. -func (b *Builder) FinishSizePrefixedWithFileIdentifier(rootTable UOffsetT, fid []byte) { - if fid == nil || len(fid) != fileIdentifierLength { - panic("incorrect file identifier length") - } - // In order to add a file identifier and size prefix to the flatbuffer message, - // we need to prepare an alignment, a size prefix length, and file identifier length - b.Prep(b.minalign, SizeInt32+fileIdentifierLength+sizePrefixLength) - for i := fileIdentifierLength - 1; i >= 0; i-- { - // place the file identifier - b.PlaceByte(fid[i]) - } - // finish - b.finish(rootTable, true) -} - -// Finish finalizes a buffer, pointing to the given `rootTable`. -func (b *Builder) Finish(rootTable UOffsetT) { - b.finish(rootTable, false) -} - -// finish finalizes a buffer, pointing to the given `rootTable` -// with an optional size prefix. -func (b *Builder) finish(rootTable UOffsetT, sizePrefix bool) { - b.assertNotNested() - - if sizePrefix { - b.Prep(b.minalign, SizeUOffsetT+sizePrefixLength) - } else { - b.Prep(b.minalign, SizeUOffsetT) - } - - b.PrependUOffsetT(rootTable) - - if sizePrefix { - b.PlaceUint32(uint32(b.Offset())) - } - - b.finished = true -} - -// vtableEqual compares an unwritten vtable to a written vtable. -func vtableEqual(a []UOffsetT, objectStart UOffsetT, b []byte) bool { - if len(a)*SizeVOffsetT != len(b) { - return false - } - - for i := 0; i < len(a); i++ { - x := GetVOffsetT(b[i*SizeVOffsetT : (i+1)*SizeVOffsetT]) - - // Skip vtable entries that indicate a default value. - if x == 0 && a[i] == 0 { - continue - } - - y := SOffsetT(objectStart) - SOffsetT(a[i]) - if SOffsetT(x) != y { - return false - } - } - return true -} - -// PrependBool prepends a bool to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependBool(x bool) { - b.Prep(SizeBool, 0) - b.PlaceBool(x) -} - -// PrependUint8 prepends a uint8 to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependUint8(x uint8) { - b.Prep(SizeUint8, 0) - b.PlaceUint8(x) -} - -// PrependUint16 prepends a uint16 to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependUint16(x uint16) { - b.Prep(SizeUint16, 0) - b.PlaceUint16(x) -} - -// PrependUint32 prepends a uint32 to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependUint32(x uint32) { - b.Prep(SizeUint32, 0) - b.PlaceUint32(x) -} - -// PrependUint64 prepends a uint64 to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependUint64(x uint64) { - b.Prep(SizeUint64, 0) - b.PlaceUint64(x) -} - -// PrependInt8 prepends a int8 to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependInt8(x int8) { - b.Prep(SizeInt8, 0) - b.PlaceInt8(x) -} - -// PrependInt16 prepends a int16 to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependInt16(x int16) { - b.Prep(SizeInt16, 0) - b.PlaceInt16(x) -} - -// PrependInt32 prepends a int32 to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependInt32(x int32) { - b.Prep(SizeInt32, 0) - b.PlaceInt32(x) -} - -// PrependInt64 prepends a int64 to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependInt64(x int64) { - b.Prep(SizeInt64, 0) - b.PlaceInt64(x) -} - -// PrependFloat32 prepends a float32 to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependFloat32(x float32) { - b.Prep(SizeFloat32, 0) - b.PlaceFloat32(x) -} - -// PrependFloat64 prepends a float64 to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependFloat64(x float64) { - b.Prep(SizeFloat64, 0) - b.PlaceFloat64(x) -} - -// PrependByte prepends a byte to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependByte(x byte) { - b.Prep(SizeByte, 0) - b.PlaceByte(x) -} - -// PrependVOffsetT prepends a VOffsetT to the Builder buffer. -// Aligns and checks for space. -func (b *Builder) PrependVOffsetT(x VOffsetT) { - b.Prep(SizeVOffsetT, 0) - b.PlaceVOffsetT(x) -} - -// PlaceBool prepends a bool to the Builder, without checking for space. -func (b *Builder) PlaceBool(x bool) { - b.head -= UOffsetT(SizeBool) - WriteBool(b.Bytes[b.head:], x) -} - -// PlaceUint8 prepends a uint8 to the Builder, without checking for space. -func (b *Builder) PlaceUint8(x uint8) { - b.head -= UOffsetT(SizeUint8) - WriteUint8(b.Bytes[b.head:], x) -} - -// PlaceUint16 prepends a uint16 to the Builder, without checking for space. -func (b *Builder) PlaceUint16(x uint16) { - b.head -= UOffsetT(SizeUint16) - WriteUint16(b.Bytes[b.head:], x) -} - -// PlaceUint32 prepends a uint32 to the Builder, without checking for space. -func (b *Builder) PlaceUint32(x uint32) { - b.head -= UOffsetT(SizeUint32) - WriteUint32(b.Bytes[b.head:], x) -} - -// PlaceUint64 prepends a uint64 to the Builder, without checking for space. -func (b *Builder) PlaceUint64(x uint64) { - b.head -= UOffsetT(SizeUint64) - WriteUint64(b.Bytes[b.head:], x) -} - -// PlaceInt8 prepends a int8 to the Builder, without checking for space. -func (b *Builder) PlaceInt8(x int8) { - b.head -= UOffsetT(SizeInt8) - WriteInt8(b.Bytes[b.head:], x) -} - -// PlaceInt16 prepends a int16 to the Builder, without checking for space. -func (b *Builder) PlaceInt16(x int16) { - b.head -= UOffsetT(SizeInt16) - WriteInt16(b.Bytes[b.head:], x) -} - -// PlaceInt32 prepends a int32 to the Builder, without checking for space. -func (b *Builder) PlaceInt32(x int32) { - b.head -= UOffsetT(SizeInt32) - WriteInt32(b.Bytes[b.head:], x) -} - -// PlaceInt64 prepends a int64 to the Builder, without checking for space. -func (b *Builder) PlaceInt64(x int64) { - b.head -= UOffsetT(SizeInt64) - WriteInt64(b.Bytes[b.head:], x) -} - -// PlaceFloat32 prepends a float32 to the Builder, without checking for space. -func (b *Builder) PlaceFloat32(x float32) { - b.head -= UOffsetT(SizeFloat32) - WriteFloat32(b.Bytes[b.head:], x) -} - -// PlaceFloat64 prepends a float64 to the Builder, without checking for space. -func (b *Builder) PlaceFloat64(x float64) { - b.head -= UOffsetT(SizeFloat64) - WriteFloat64(b.Bytes[b.head:], x) -} - -// PlaceByte prepends a byte to the Builder, without checking for space. -func (b *Builder) PlaceByte(x byte) { - b.head -= UOffsetT(SizeByte) - WriteByte(b.Bytes[b.head:], x) -} - -// PlaceVOffsetT prepends a VOffsetT to the Builder, without checking for space. -func (b *Builder) PlaceVOffsetT(x VOffsetT) { - b.head -= UOffsetT(SizeVOffsetT) - WriteVOffsetT(b.Bytes[b.head:], x) -} - -// PlaceSOffsetT prepends a SOffsetT to the Builder, without checking for space. -func (b *Builder) PlaceSOffsetT(x SOffsetT) { - b.head -= UOffsetT(SizeSOffsetT) - WriteSOffsetT(b.Bytes[b.head:], x) -} - -// PlaceUOffsetT prepends a UOffsetT to the Builder, without checking for space. -func (b *Builder) PlaceUOffsetT(x UOffsetT) { - b.head -= UOffsetT(SizeUOffsetT) - WriteUOffsetT(b.Bytes[b.head:], x) -} diff --git a/vendor/github.com/google/flatbuffers/go/doc.go b/vendor/github.com/google/flatbuffers/go/doc.go deleted file mode 100644 index 694edc763d..0000000000 --- a/vendor/github.com/google/flatbuffers/go/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package flatbuffers provides facilities to read and write flatbuffers -// objects. -package flatbuffers diff --git a/vendor/github.com/google/flatbuffers/go/encode.go b/vendor/github.com/google/flatbuffers/go/encode.go deleted file mode 100644 index a2a5798125..0000000000 --- a/vendor/github.com/google/flatbuffers/go/encode.go +++ /dev/null @@ -1,238 +0,0 @@ -package flatbuffers - -import ( - "math" -) - -type ( - // A SOffsetT stores a signed offset into arbitrary data. - SOffsetT int32 - // A UOffsetT stores an unsigned offset into vector data. - UOffsetT uint32 - // A VOffsetT stores an unsigned offset in a vtable. - VOffsetT uint16 -) - -const ( - // VtableMetadataFields is the count of metadata fields in each vtable. - VtableMetadataFields = 2 -) - -// GetByte decodes a little-endian byte from a byte slice. -func GetByte(buf []byte) byte { - return byte(GetUint8(buf)) -} - -// GetBool decodes a little-endian bool from a byte slice. -func GetBool(buf []byte) bool { - return buf[0] == 1 -} - -// GetUint8 decodes a little-endian uint8 from a byte slice. -func GetUint8(buf []byte) (n uint8) { - n = uint8(buf[0]) - return -} - -// GetUint16 decodes a little-endian uint16 from a byte slice. -func GetUint16(buf []byte) (n uint16) { - _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 - n |= uint16(buf[0]) - n |= uint16(buf[1]) << 8 - return -} - -// GetUint32 decodes a little-endian uint32 from a byte slice. -func GetUint32(buf []byte) (n uint32) { - _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 - n |= uint32(buf[0]) - n |= uint32(buf[1]) << 8 - n |= uint32(buf[2]) << 16 - n |= uint32(buf[3]) << 24 - return -} - -// GetUint64 decodes a little-endian uint64 from a byte slice. -func GetUint64(buf []byte) (n uint64) { - _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 - n |= uint64(buf[0]) - n |= uint64(buf[1]) << 8 - n |= uint64(buf[2]) << 16 - n |= uint64(buf[3]) << 24 - n |= uint64(buf[4]) << 32 - n |= uint64(buf[5]) << 40 - n |= uint64(buf[6]) << 48 - n |= uint64(buf[7]) << 56 - return -} - -// GetInt8 decodes a little-endian int8 from a byte slice. -func GetInt8(buf []byte) (n int8) { - n = int8(buf[0]) - return -} - -// GetInt16 decodes a little-endian int16 from a byte slice. -func GetInt16(buf []byte) (n int16) { - _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 - n |= int16(buf[0]) - n |= int16(buf[1]) << 8 - return -} - -// GetInt32 decodes a little-endian int32 from a byte slice. -func GetInt32(buf []byte) (n int32) { - _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 - n |= int32(buf[0]) - n |= int32(buf[1]) << 8 - n |= int32(buf[2]) << 16 - n |= int32(buf[3]) << 24 - return -} - -// GetInt64 decodes a little-endian int64 from a byte slice. -func GetInt64(buf []byte) (n int64) { - _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 - n |= int64(buf[0]) - n |= int64(buf[1]) << 8 - n |= int64(buf[2]) << 16 - n |= int64(buf[3]) << 24 - n |= int64(buf[4]) << 32 - n |= int64(buf[5]) << 40 - n |= int64(buf[6]) << 48 - n |= int64(buf[7]) << 56 - return -} - -// GetFloat32 decodes a little-endian float32 from a byte slice. -func GetFloat32(buf []byte) float32 { - x := GetUint32(buf) - return math.Float32frombits(x) -} - -// GetFloat64 decodes a little-endian float64 from a byte slice. -func GetFloat64(buf []byte) float64 { - x := GetUint64(buf) - return math.Float64frombits(x) -} - -// GetUOffsetT decodes a little-endian UOffsetT from a byte slice. -func GetUOffsetT(buf []byte) UOffsetT { - return UOffsetT(GetUint32(buf)) -} - -// GetSOffsetT decodes a little-endian SOffsetT from a byte slice. -func GetSOffsetT(buf []byte) SOffsetT { - return SOffsetT(GetInt32(buf)) -} - -// GetVOffsetT decodes a little-endian VOffsetT from a byte slice. -func GetVOffsetT(buf []byte) VOffsetT { - return VOffsetT(GetUint16(buf)) -} - -// WriteByte encodes a little-endian uint8 into a byte slice. -func WriteByte(buf []byte, n byte) { - WriteUint8(buf, uint8(n)) -} - -// WriteBool encodes a little-endian bool into a byte slice. -func WriteBool(buf []byte, b bool) { - buf[0] = 0 - if b { - buf[0] = 1 - } -} - -// WriteUint8 encodes a little-endian uint8 into a byte slice. -func WriteUint8(buf []byte, n uint8) { - buf[0] = byte(n) -} - -// WriteUint16 encodes a little-endian uint16 into a byte slice. -func WriteUint16(buf []byte, n uint16) { - _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 - buf[0] = byte(n) - buf[1] = byte(n >> 8) -} - -// WriteUint32 encodes a little-endian uint32 into a byte slice. -func WriteUint32(buf []byte, n uint32) { - _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 - buf[0] = byte(n) - buf[1] = byte(n >> 8) - buf[2] = byte(n >> 16) - buf[3] = byte(n >> 24) -} - -// WriteUint64 encodes a little-endian uint64 into a byte slice. -func WriteUint64(buf []byte, n uint64) { - _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 - buf[0] = byte(n) - buf[1] = byte(n >> 8) - buf[2] = byte(n >> 16) - buf[3] = byte(n >> 24) - buf[4] = byte(n >> 32) - buf[5] = byte(n >> 40) - buf[6] = byte(n >> 48) - buf[7] = byte(n >> 56) -} - -// WriteInt8 encodes a little-endian int8 into a byte slice. -func WriteInt8(buf []byte, n int8) { - buf[0] = byte(n) -} - -// WriteInt16 encodes a little-endian int16 into a byte slice. -func WriteInt16(buf []byte, n int16) { - _ = buf[1] // Force one bounds check. See: golang.org/issue/14808 - buf[0] = byte(n) - buf[1] = byte(n >> 8) -} - -// WriteInt32 encodes a little-endian int32 into a byte slice. -func WriteInt32(buf []byte, n int32) { - _ = buf[3] // Force one bounds check. See: golang.org/issue/14808 - buf[0] = byte(n) - buf[1] = byte(n >> 8) - buf[2] = byte(n >> 16) - buf[3] = byte(n >> 24) -} - -// WriteInt64 encodes a little-endian int64 into a byte slice. -func WriteInt64(buf []byte, n int64) { - _ = buf[7] // Force one bounds check. See: golang.org/issue/14808 - buf[0] = byte(n) - buf[1] = byte(n >> 8) - buf[2] = byte(n >> 16) - buf[3] = byte(n >> 24) - buf[4] = byte(n >> 32) - buf[5] = byte(n >> 40) - buf[6] = byte(n >> 48) - buf[7] = byte(n >> 56) -} - -// WriteFloat32 encodes a little-endian float32 into a byte slice. -func WriteFloat32(buf []byte, n float32) { - WriteUint32(buf, math.Float32bits(n)) -} - -// WriteFloat64 encodes a little-endian float64 into a byte slice. -func WriteFloat64(buf []byte, n float64) { - WriteUint64(buf, math.Float64bits(n)) -} - -// WriteVOffsetT encodes a little-endian VOffsetT into a byte slice. -func WriteVOffsetT(buf []byte, n VOffsetT) { - WriteUint16(buf, uint16(n)) -} - -// WriteSOffsetT encodes a little-endian SOffsetT into a byte slice. -func WriteSOffsetT(buf []byte, n SOffsetT) { - WriteInt32(buf, int32(n)) -} - -// WriteUOffsetT encodes a little-endian UOffsetT into a byte slice. -func WriteUOffsetT(buf []byte, n UOffsetT) { - WriteUint32(buf, uint32(n)) -} diff --git a/vendor/github.com/google/flatbuffers/go/grpc.go b/vendor/github.com/google/flatbuffers/go/grpc.go deleted file mode 100644 index 15f1a510d3..0000000000 --- a/vendor/github.com/google/flatbuffers/go/grpc.go +++ /dev/null @@ -1,38 +0,0 @@ -package flatbuffers - -// Codec implements gRPC-go Codec which is used to encode and decode messages. -var Codec = "flatbuffers" - -// FlatbuffersCodec defines the interface gRPC uses to encode and decode messages. Note -// that implementations of this interface must be thread safe; a Codec's -// methods can be called from concurrent goroutines. -type FlatbuffersCodec struct{} - -// Marshal returns the wire format of v. -func (FlatbuffersCodec) Marshal(v interface{}) ([]byte, error) { - return v.(*Builder).FinishedBytes(), nil -} - -// Unmarshal parses the wire format into v. -func (FlatbuffersCodec) Unmarshal(data []byte, v interface{}) error { - v.(flatbuffersInit).Init(data, GetUOffsetT(data)) - return nil -} - -// String old gRPC Codec interface func -func (FlatbuffersCodec) String() string { - return Codec -} - -// Name returns the name of the Codec implementation. The returned string -// will be used as part of content type in transmission. The result must be -// static; the result cannot change between calls. -// -// add Name() for ForceCodec interface -func (FlatbuffersCodec) Name() string { - return Codec -} - -type flatbuffersInit interface { - Init(data []byte, i UOffsetT) -} diff --git a/vendor/github.com/google/flatbuffers/go/lib.go b/vendor/github.com/google/flatbuffers/go/lib.go deleted file mode 100644 index a4e99de101..0000000000 --- a/vendor/github.com/google/flatbuffers/go/lib.go +++ /dev/null @@ -1,50 +0,0 @@ -package flatbuffers - -// FlatBuffer is the interface that represents a flatbuffer. -type FlatBuffer interface { - Table() Table - Init(buf []byte, i UOffsetT) -} - -// GetRootAs is a generic helper to initialize a FlatBuffer with the provided buffer bytes and its data offset. -func GetRootAs(buf []byte, offset UOffsetT, fb FlatBuffer) { - n := GetUOffsetT(buf[offset:]) - fb.Init(buf, n+offset) -} - -// GetSizePrefixedRootAs is a generic helper to initialize a FlatBuffer with the provided size-prefixed buffer -// bytes and its data offset -func GetSizePrefixedRootAs(buf []byte, offset UOffsetT, fb FlatBuffer) { - n := GetUOffsetT(buf[offset+sizePrefixLength:]) - fb.Init(buf, n+offset+sizePrefixLength) -} - -// GetSizePrefix reads the size from a size-prefixed flatbuffer -func GetSizePrefix(buf []byte, offset UOffsetT) uint32 { - return GetUint32(buf[offset:]) -} - -// GetIndirectOffset retrives the relative offset in the provided buffer stored at `offset`. -func GetIndirectOffset(buf []byte, offset UOffsetT) UOffsetT { - return offset + GetUOffsetT(buf[offset:]) -} - -// GetBufferIdentifier returns the file identifier as string -func GetBufferIdentifier(buf []byte) string { - return string(buf[SizeUOffsetT:][:fileIdentifierLength]) -} - -// GetBufferIdentifier returns the file identifier as string for a size-prefixed buffer -func GetSizePrefixedBufferIdentifier(buf []byte) string { - return string(buf[SizeUOffsetT+sizePrefixLength:][:fileIdentifierLength]) -} - -// BufferHasIdentifier checks if the identifier in a buffer has the expected value -func BufferHasIdentifier(buf []byte, identifier string) bool { - return GetBufferIdentifier(buf) == identifier -} - -// BufferHasIdentifier checks if the identifier in a buffer has the expected value for a size-prefixed buffer -func SizePrefixedBufferHasIdentifier(buf []byte, identifier string) bool { - return GetSizePrefixedBufferIdentifier(buf) == identifier -} diff --git a/vendor/github.com/google/flatbuffers/go/sizes.go b/vendor/github.com/google/flatbuffers/go/sizes.go deleted file mode 100644 index ba22169845..0000000000 --- a/vendor/github.com/google/flatbuffers/go/sizes.go +++ /dev/null @@ -1,55 +0,0 @@ -package flatbuffers - -import ( - "unsafe" -) - -const ( - // See http://golang.org/ref/spec#Numeric_types - - // SizeUint8 is the byte size of a uint8. - SizeUint8 = 1 - // SizeUint16 is the byte size of a uint16. - SizeUint16 = 2 - // SizeUint32 is the byte size of a uint32. - SizeUint32 = 4 - // SizeUint64 is the byte size of a uint64. - SizeUint64 = 8 - - // SizeInt8 is the byte size of a int8. - SizeInt8 = 1 - // SizeInt16 is the byte size of a int16. - SizeInt16 = 2 - // SizeInt32 is the byte size of a int32. - SizeInt32 = 4 - // SizeInt64 is the byte size of a int64. - SizeInt64 = 8 - - // SizeFloat32 is the byte size of a float32. - SizeFloat32 = 4 - // SizeFloat64 is the byte size of a float64. - SizeFloat64 = 8 - - // SizeByte is the byte size of a byte. - // The `byte` type is aliased (by Go definition) to uint8. - SizeByte = 1 - - // SizeBool is the byte size of a bool. - // The `bool` type is aliased (by flatbuffers convention) to uint8. - SizeBool = 1 - - // SizeSOffsetT is the byte size of an SOffsetT. - // The `SOffsetT` type is aliased (by flatbuffers convention) to int32. - SizeSOffsetT = 4 - // SizeUOffsetT is the byte size of an UOffsetT. - // The `UOffsetT` type is aliased (by flatbuffers convention) to uint32. - SizeUOffsetT = 4 - // SizeVOffsetT is the byte size of an VOffsetT. - // The `VOffsetT` type is aliased (by flatbuffers convention) to uint16. - SizeVOffsetT = 2 -) - -// byteSliceToString converts a []byte to string without a heap allocation. -func byteSliceToString(b []byte) string { - return *(*string)(unsafe.Pointer(&b)) -} diff --git a/vendor/github.com/google/flatbuffers/go/struct.go b/vendor/github.com/google/flatbuffers/go/struct.go deleted file mode 100644 index 11258f715d..0000000000 --- a/vendor/github.com/google/flatbuffers/go/struct.go +++ /dev/null @@ -1,8 +0,0 @@ -package flatbuffers - -// Struct wraps a byte slice and provides read access to its data. -// -// Structs do not have a vtable. -type Struct struct { - Table -} diff --git a/vendor/github.com/google/flatbuffers/go/table.go b/vendor/github.com/google/flatbuffers/go/table.go deleted file mode 100644 index b273146fad..0000000000 --- a/vendor/github.com/google/flatbuffers/go/table.go +++ /dev/null @@ -1,505 +0,0 @@ -package flatbuffers - -// Table wraps a byte slice and provides read access to its data. -// -// The variable `Pos` indicates the root of the FlatBuffers object therein. -type Table struct { - Bytes []byte - Pos UOffsetT // Always < 1<<31. -} - -// Offset provides access into the Table's vtable. -// -// Fields which are deprecated are ignored by checking against the vtable's length. -func (t *Table) Offset(vtableOffset VOffsetT) VOffsetT { - vtable := UOffsetT(SOffsetT(t.Pos) - t.GetSOffsetT(t.Pos)) - if vtableOffset < t.GetVOffsetT(vtable) { - return t.GetVOffsetT(vtable + UOffsetT(vtableOffset)) - } - return 0 -} - -// Indirect retrieves the relative offset stored at `offset`. -func (t *Table) Indirect(off UOffsetT) UOffsetT { - return off + GetUOffsetT(t.Bytes[off:]) -} - -// String gets a string from data stored inside the flatbuffer. -func (t *Table) String(off UOffsetT) string { - b := t.ByteVector(off) - return byteSliceToString(b) -} - -// ByteVector gets a byte slice from data stored inside the flatbuffer. -func (t *Table) ByteVector(off UOffsetT) []byte { - off += GetUOffsetT(t.Bytes[off:]) - start := off + UOffsetT(SizeUOffsetT) - length := GetUOffsetT(t.Bytes[off:]) - return t.Bytes[start : start+length] -} - -// VectorLen retrieves the length of the vector whose offset is stored at -// "off" in this object. -func (t *Table) VectorLen(off UOffsetT) int { - off += t.Pos - off += GetUOffsetT(t.Bytes[off:]) - return int(GetUOffsetT(t.Bytes[off:])) -} - -// Vector retrieves the start of data of the vector whose offset is stored -// at "off" in this object. -func (t *Table) Vector(off UOffsetT) UOffsetT { - off += t.Pos - x := off + GetUOffsetT(t.Bytes[off:]) - // data starts after metadata containing the vector length - x += UOffsetT(SizeUOffsetT) - return x -} - -// Union initializes any Table-derived type to point to the union at the given -// offset. -func (t *Table) Union(t2 *Table, off UOffsetT) { - off += t.Pos - t2.Pos = off + t.GetUOffsetT(off) - t2.Bytes = t.Bytes -} - -// GetBool retrieves a bool at the given offset. -func (t *Table) GetBool(off UOffsetT) bool { - return GetBool(t.Bytes[off:]) -} - -// GetByte retrieves a byte at the given offset. -func (t *Table) GetByte(off UOffsetT) byte { - return GetByte(t.Bytes[off:]) -} - -// GetUint8 retrieves a uint8 at the given offset. -func (t *Table) GetUint8(off UOffsetT) uint8 { - return GetUint8(t.Bytes[off:]) -} - -// GetUint16 retrieves a uint16 at the given offset. -func (t *Table) GetUint16(off UOffsetT) uint16 { - return GetUint16(t.Bytes[off:]) -} - -// GetUint32 retrieves a uint32 at the given offset. -func (t *Table) GetUint32(off UOffsetT) uint32 { - return GetUint32(t.Bytes[off:]) -} - -// GetUint64 retrieves a uint64 at the given offset. -func (t *Table) GetUint64(off UOffsetT) uint64 { - return GetUint64(t.Bytes[off:]) -} - -// GetInt8 retrieves a int8 at the given offset. -func (t *Table) GetInt8(off UOffsetT) int8 { - return GetInt8(t.Bytes[off:]) -} - -// GetInt16 retrieves a int16 at the given offset. -func (t *Table) GetInt16(off UOffsetT) int16 { - return GetInt16(t.Bytes[off:]) -} - -// GetInt32 retrieves a int32 at the given offset. -func (t *Table) GetInt32(off UOffsetT) int32 { - return GetInt32(t.Bytes[off:]) -} - -// GetInt64 retrieves a int64 at the given offset. -func (t *Table) GetInt64(off UOffsetT) int64 { - return GetInt64(t.Bytes[off:]) -} - -// GetFloat32 retrieves a float32 at the given offset. -func (t *Table) GetFloat32(off UOffsetT) float32 { - return GetFloat32(t.Bytes[off:]) -} - -// GetFloat64 retrieves a float64 at the given offset. -func (t *Table) GetFloat64(off UOffsetT) float64 { - return GetFloat64(t.Bytes[off:]) -} - -// GetUOffsetT retrieves a UOffsetT at the given offset. -func (t *Table) GetUOffsetT(off UOffsetT) UOffsetT { - return GetUOffsetT(t.Bytes[off:]) -} - -// GetVOffsetT retrieves a VOffsetT at the given offset. -func (t *Table) GetVOffsetT(off UOffsetT) VOffsetT { - return GetVOffsetT(t.Bytes[off:]) -} - -// GetSOffsetT retrieves a SOffsetT at the given offset. -func (t *Table) GetSOffsetT(off UOffsetT) SOffsetT { - return GetSOffsetT(t.Bytes[off:]) -} - -// GetBoolSlot retrieves the bool that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetBoolSlot(slot VOffsetT, d bool) bool { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetBool(t.Pos + UOffsetT(off)) -} - -// GetByteSlot retrieves the byte that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetByteSlot(slot VOffsetT, d byte) byte { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetByte(t.Pos + UOffsetT(off)) -} - -// GetInt8Slot retrieves the int8 that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetInt8Slot(slot VOffsetT, d int8) int8 { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetInt8(t.Pos + UOffsetT(off)) -} - -// GetUint8Slot retrieves the uint8 that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetUint8Slot(slot VOffsetT, d uint8) uint8 { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetUint8(t.Pos + UOffsetT(off)) -} - -// GetInt16Slot retrieves the int16 that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetInt16Slot(slot VOffsetT, d int16) int16 { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetInt16(t.Pos + UOffsetT(off)) -} - -// GetUint16Slot retrieves the uint16 that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetUint16Slot(slot VOffsetT, d uint16) uint16 { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetUint16(t.Pos + UOffsetT(off)) -} - -// GetInt32Slot retrieves the int32 that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetInt32Slot(slot VOffsetT, d int32) int32 { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetInt32(t.Pos + UOffsetT(off)) -} - -// GetUint32Slot retrieves the uint32 that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetUint32Slot(slot VOffsetT, d uint32) uint32 { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetUint32(t.Pos + UOffsetT(off)) -} - -// GetInt64Slot retrieves the int64 that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetInt64Slot(slot VOffsetT, d int64) int64 { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetInt64(t.Pos + UOffsetT(off)) -} - -// GetUint64Slot retrieves the uint64 that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetUint64Slot(slot VOffsetT, d uint64) uint64 { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetUint64(t.Pos + UOffsetT(off)) -} - -// GetFloat32Slot retrieves the float32 that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetFloat32Slot(slot VOffsetT, d float32) float32 { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetFloat32(t.Pos + UOffsetT(off)) -} - -// GetFloat64Slot retrieves the float64 that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetFloat64Slot(slot VOffsetT, d float64) float64 { - off := t.Offset(slot) - if off == 0 { - return d - } - - return t.GetFloat64(t.Pos + UOffsetT(off)) -} - -// GetVOffsetTSlot retrieves the VOffsetT that the given vtable location -// points to. If the vtable value is zero, the default value `d` -// will be returned. -func (t *Table) GetVOffsetTSlot(slot VOffsetT, d VOffsetT) VOffsetT { - off := t.Offset(slot) - if off == 0 { - return d - } - return VOffsetT(off) -} - -// MutateBool updates a bool at the given offset. -func (t *Table) MutateBool(off UOffsetT, n bool) bool { - WriteBool(t.Bytes[off:], n) - return true -} - -// MutateByte updates a Byte at the given offset. -func (t *Table) MutateByte(off UOffsetT, n byte) bool { - WriteByte(t.Bytes[off:], n) - return true -} - -// MutateUint8 updates a Uint8 at the given offset. -func (t *Table) MutateUint8(off UOffsetT, n uint8) bool { - WriteUint8(t.Bytes[off:], n) - return true -} - -// MutateUint16 updates a Uint16 at the given offset. -func (t *Table) MutateUint16(off UOffsetT, n uint16) bool { - WriteUint16(t.Bytes[off:], n) - return true -} - -// MutateUint32 updates a Uint32 at the given offset. -func (t *Table) MutateUint32(off UOffsetT, n uint32) bool { - WriteUint32(t.Bytes[off:], n) - return true -} - -// MutateUint64 updates a Uint64 at the given offset. -func (t *Table) MutateUint64(off UOffsetT, n uint64) bool { - WriteUint64(t.Bytes[off:], n) - return true -} - -// MutateInt8 updates a Int8 at the given offset. -func (t *Table) MutateInt8(off UOffsetT, n int8) bool { - WriteInt8(t.Bytes[off:], n) - return true -} - -// MutateInt16 updates a Int16 at the given offset. -func (t *Table) MutateInt16(off UOffsetT, n int16) bool { - WriteInt16(t.Bytes[off:], n) - return true -} - -// MutateInt32 updates a Int32 at the given offset. -func (t *Table) MutateInt32(off UOffsetT, n int32) bool { - WriteInt32(t.Bytes[off:], n) - return true -} - -// MutateInt64 updates a Int64 at the given offset. -func (t *Table) MutateInt64(off UOffsetT, n int64) bool { - WriteInt64(t.Bytes[off:], n) - return true -} - -// MutateFloat32 updates a Float32 at the given offset. -func (t *Table) MutateFloat32(off UOffsetT, n float32) bool { - WriteFloat32(t.Bytes[off:], n) - return true -} - -// MutateFloat64 updates a Float64 at the given offset. -func (t *Table) MutateFloat64(off UOffsetT, n float64) bool { - WriteFloat64(t.Bytes[off:], n) - return true -} - -// MutateUOffsetT updates a UOffsetT at the given offset. -func (t *Table) MutateUOffsetT(off UOffsetT, n UOffsetT) bool { - WriteUOffsetT(t.Bytes[off:], n) - return true -} - -// MutateVOffsetT updates a VOffsetT at the given offset. -func (t *Table) MutateVOffsetT(off UOffsetT, n VOffsetT) bool { - WriteVOffsetT(t.Bytes[off:], n) - return true -} - -// MutateSOffsetT updates a SOffsetT at the given offset. -func (t *Table) MutateSOffsetT(off UOffsetT, n SOffsetT) bool { - WriteSOffsetT(t.Bytes[off:], n) - return true -} - -// MutateBoolSlot updates the bool at given vtable location -func (t *Table) MutateBoolSlot(slot VOffsetT, n bool) bool { - if off := t.Offset(slot); off != 0 { - t.MutateBool(t.Pos+UOffsetT(off), n) - return true - } - - return false -} - -// MutateByteSlot updates the byte at given vtable location -func (t *Table) MutateByteSlot(slot VOffsetT, n byte) bool { - if off := t.Offset(slot); off != 0 { - t.MutateByte(t.Pos+UOffsetT(off), n) - return true - } - - return false -} - -// MutateInt8Slot updates the int8 at given vtable location -func (t *Table) MutateInt8Slot(slot VOffsetT, n int8) bool { - if off := t.Offset(slot); off != 0 { - t.MutateInt8(t.Pos+UOffsetT(off), n) - return true - } - - return false -} - -// MutateUint8Slot updates the uint8 at given vtable location -func (t *Table) MutateUint8Slot(slot VOffsetT, n uint8) bool { - if off := t.Offset(slot); off != 0 { - t.MutateUint8(t.Pos+UOffsetT(off), n) - return true - } - - return false -} - -// MutateInt16Slot updates the int16 at given vtable location -func (t *Table) MutateInt16Slot(slot VOffsetT, n int16) bool { - if off := t.Offset(slot); off != 0 { - t.MutateInt16(t.Pos+UOffsetT(off), n) - return true - } - - return false -} - -// MutateUint16Slot updates the uint16 at given vtable location -func (t *Table) MutateUint16Slot(slot VOffsetT, n uint16) bool { - if off := t.Offset(slot); off != 0 { - t.MutateUint16(t.Pos+UOffsetT(off), n) - return true - } - - return false -} - -// MutateInt32Slot updates the int32 at given vtable location -func (t *Table) MutateInt32Slot(slot VOffsetT, n int32) bool { - if off := t.Offset(slot); off != 0 { - t.MutateInt32(t.Pos+UOffsetT(off), n) - return true - } - - return false -} - -// MutateUint32Slot updates the uint32 at given vtable location -func (t *Table) MutateUint32Slot(slot VOffsetT, n uint32) bool { - if off := t.Offset(slot); off != 0 { - t.MutateUint32(t.Pos+UOffsetT(off), n) - return true - } - - return false -} - -// MutateInt64Slot updates the int64 at given vtable location -func (t *Table) MutateInt64Slot(slot VOffsetT, n int64) bool { - if off := t.Offset(slot); off != 0 { - t.MutateInt64(t.Pos+UOffsetT(off), n) - return true - } - - return false -} - -// MutateUint64Slot updates the uint64 at given vtable location -func (t *Table) MutateUint64Slot(slot VOffsetT, n uint64) bool { - if off := t.Offset(slot); off != 0 { - t.MutateUint64(t.Pos+UOffsetT(off), n) - return true - } - - return false -} - -// MutateFloat32Slot updates the float32 at given vtable location -func (t *Table) MutateFloat32Slot(slot VOffsetT, n float32) bool { - if off := t.Offset(slot); off != 0 { - t.MutateFloat32(t.Pos+UOffsetT(off), n) - return true - } - - return false -} - -// MutateFloat64Slot updates the float64 at given vtable location -func (t *Table) MutateFloat64Slot(slot VOffsetT, n float64) bool { - if off := t.Offset(slot); off != 0 { - t.MutateFloat64(t.Pos+UOffsetT(off), n) - return true - } - - return false -} diff --git a/vendor/github.com/klauspost/compress/.gitattributes b/vendor/github.com/klauspost/compress/.gitattributes deleted file mode 100644 index 402433593c..0000000000 --- a/vendor/github.com/klauspost/compress/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -* -text -*.bin -text -diff diff --git a/vendor/github.com/klauspost/compress/.gitignore b/vendor/github.com/klauspost/compress/.gitignore deleted file mode 100644 index d31b378152..0000000000 --- a/vendor/github.com/klauspost/compress/.gitignore +++ /dev/null @@ -1,32 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof -/s2/cmd/_s2sx/sfx-exe - -# Linux perf files -perf.data -perf.data.old - -# gdb history -.gdb_history diff --git a/vendor/github.com/klauspost/compress/.goreleaser.yml b/vendor/github.com/klauspost/compress/.goreleaser.yml deleted file mode 100644 index 4528059ca6..0000000000 --- a/vendor/github.com/klauspost/compress/.goreleaser.yml +++ /dev/null @@ -1,123 +0,0 @@ -version: 2 - -before: - hooks: - - ./gen.sh - -builds: - - - id: "s2c" - binary: s2c - main: ./s2/cmd/s2c/main.go - flags: - - -trimpath - env: - - CGO_ENABLED=0 - goos: - - aix - - linux - - freebsd - - netbsd - - windows - - darwin - goarch: - - 386 - - amd64 - - arm - - arm64 - - ppc64 - - ppc64le - - mips64 - - mips64le - goarm: - - 7 - - - id: "s2d" - binary: s2d - main: ./s2/cmd/s2d/main.go - flags: - - -trimpath - env: - - CGO_ENABLED=0 - goos: - - aix - - linux - - freebsd - - netbsd - - windows - - darwin - goarch: - - 386 - - amd64 - - arm - - arm64 - - ppc64 - - ppc64le - - mips64 - - mips64le - goarm: - - 7 - - - id: "s2sx" - binary: s2sx - main: ./s2/cmd/_s2sx/main.go - flags: - - -modfile=s2sx.mod - - -trimpath - env: - - CGO_ENABLED=0 - goos: - - aix - - linux - - freebsd - - netbsd - - windows - - darwin - goarch: - - 386 - - amd64 - - arm - - arm64 - - ppc64 - - ppc64le - - mips64 - - mips64le - goarm: - - 7 - -archives: - - - id: s2-binaries - name_template: "s2-{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}" - format_overrides: - - goos: windows - format: zip - files: - - unpack/* - - s2/LICENSE - - s2/README.md -checksum: - name_template: 'checksums.txt' -snapshot: - version_template: "{{ .Tag }}-next" -changelog: - sort: asc - filters: - exclude: - - '^doc:' - - '^docs:' - - '^test:' - - '^tests:' - - '^Update\sREADME.md' - -nfpms: - - - file_name_template: "s2_package__{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}" - vendor: Klaus Post - homepage: https://github.com/klauspost/compress - maintainer: Klaus Post - description: S2 Compression Tool - license: BSD 3-Clause - formats: - - deb - - rpm diff --git a/vendor/github.com/klauspost/compress/LICENSE b/vendor/github.com/klauspost/compress/LICENSE deleted file mode 100644 index 87d5574777..0000000000 --- a/vendor/github.com/klauspost/compress/LICENSE +++ /dev/null @@ -1,304 +0,0 @@ -Copyright (c) 2012 The Go Authors. All rights reserved. -Copyright (c) 2019 Klaus Post. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------------------- - -Files: gzhttp/* - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2016-2017 The New York Times Company - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ------------------- - -Files: s2/cmd/internal/readahead/* - -The MIT License (MIT) - -Copyright (c) 2015 Klaus Post - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---------------------- -Files: snappy/* -Files: internal/snapref/* - -Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------------------ - -Files: s2/cmd/internal/filepathx/* - -Copyright 2016 The filepathx Authors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/klauspost/compress/README.md b/vendor/github.com/klauspost/compress/README.md deleted file mode 100644 index de264c85a5..0000000000 --- a/vendor/github.com/klauspost/compress/README.md +++ /dev/null @@ -1,721 +0,0 @@ -# compress - -This package provides various compression algorithms. - -* [zstandard](https://github.com/klauspost/compress/tree/master/zstd#zstd) compression and decompression in pure Go. -* [S2](https://github.com/klauspost/compress/tree/master/s2#s2-compression) is a high performance replacement for Snappy. -* Optimized [deflate](https://godoc.org/github.com/klauspost/compress/flate) packages which can be used as a dropin replacement for [gzip](https://godoc.org/github.com/klauspost/compress/gzip), [zip](https://godoc.org/github.com/klauspost/compress/zip) and [zlib](https://godoc.org/github.com/klauspost/compress/zlib). -* [snappy](https://github.com/klauspost/compress/tree/master/snappy) is a drop-in replacement for `github.com/golang/snappy` offering better compression and concurrent streams. -* [huff0](https://github.com/klauspost/compress/tree/master/huff0) and [FSE](https://github.com/klauspost/compress/tree/master/fse) implementations for raw entropy encoding. -* [gzhttp](https://github.com/klauspost/compress/tree/master/gzhttp) Provides client and server wrappers for handling gzipped requests efficiently. -* [pgzip](https://github.com/klauspost/pgzip) is a separate package that provides a very fast parallel gzip implementation. - -[![Go Reference](https://pkg.go.dev/badge/klauspost/compress.svg)](https://pkg.go.dev/github.com/klauspost/compress?tab=subdirectories) -[![Go](https://github.com/klauspost/compress/actions/workflows/go.yml/badge.svg)](https://github.com/klauspost/compress/actions/workflows/go.yml) -[![Sourcegraph Badge](https://sourcegraph.com/github.com/klauspost/compress/-/badge.svg)](https://sourcegraph.com/github.com/klauspost/compress?badge) - -# changelog - -* Sep 23rd, 2024 - [1.17.10](https://github.com/klauspost/compress/releases/tag/v1.17.10) - * gzhttp: Add TransportAlwaysDecompress option. https://github.com/klauspost/compress/pull/978 - * gzhttp: Add supported decompress request body by @mirecl in https://github.com/klauspost/compress/pull/1002 - * s2: Add EncodeBuffer buffer recycling callback https://github.com/klauspost/compress/pull/982 - * zstd: Improve memory usage on small streaming encodes https://github.com/klauspost/compress/pull/1007 - * flate: read data written with partial flush by @vajexal in https://github.com/klauspost/compress/pull/996 - -* Jun 12th, 2024 - [1.17.9](https://github.com/klauspost/compress/releases/tag/v1.17.9) - * s2: Reduce ReadFrom temporary allocations https://github.com/klauspost/compress/pull/949 - * flate, zstd: Shave some bytes off amd64 matchLen by @greatroar in https://github.com/klauspost/compress/pull/963 - * Upgrade zip/zlib to 1.22.4 upstream https://github.com/klauspost/compress/pull/970 https://github.com/klauspost/compress/pull/971 - * zstd: BuildDict fails with RLE table https://github.com/klauspost/compress/pull/951 - -* Apr 9th, 2024 - [1.17.8](https://github.com/klauspost/compress/releases/tag/v1.17.8) - * zstd: Reject blocks where reserved values are not 0 https://github.com/klauspost/compress/pull/885 - * zstd: Add RLE detection+encoding https://github.com/klauspost/compress/pull/938 - -* Feb 21st, 2024 - [1.17.7](https://github.com/klauspost/compress/releases/tag/v1.17.7) - * s2: Add AsyncFlush method: Complete the block without flushing by @Jille in https://github.com/klauspost/compress/pull/927 - * s2: Fix literal+repeat exceeds dst crash https://github.com/klauspost/compress/pull/930 - -* Feb 5th, 2024 - [1.17.6](https://github.com/klauspost/compress/releases/tag/v1.17.6) - * zstd: Fix incorrect repeat coding in best mode https://github.com/klauspost/compress/pull/923 - * s2: Fix DecodeConcurrent deadlock on errors https://github.com/klauspost/compress/pull/925 - -* Jan 26th, 2024 - [v1.17.5](https://github.com/klauspost/compress/releases/tag/v1.17.5) - * flate: Fix reset with dictionary on custom window encodes https://github.com/klauspost/compress/pull/912 - * zstd: Add Frame header encoding and stripping https://github.com/klauspost/compress/pull/908 - * zstd: Limit better/best default window to 8MB https://github.com/klauspost/compress/pull/913 - * zstd: Speed improvements by @greatroar in https://github.com/klauspost/compress/pull/896 https://github.com/klauspost/compress/pull/910 - * s2: Fix callbacks for skippable blocks and disallow 0xfe (Padding) by @Jille in https://github.com/klauspost/compress/pull/916 https://github.com/klauspost/compress/pull/917 -https://github.com/klauspost/compress/pull/919 https://github.com/klauspost/compress/pull/918 - -* Dec 1st, 2023 - [v1.17.4](https://github.com/klauspost/compress/releases/tag/v1.17.4) - * huff0: Speed up symbol counting by @greatroar in https://github.com/klauspost/compress/pull/887 - * huff0: Remove byteReader by @greatroar in https://github.com/klauspost/compress/pull/886 - * gzhttp: Allow overriding decompression on transport https://github.com/klauspost/compress/pull/892 - * gzhttp: Clamp compression level https://github.com/klauspost/compress/pull/890 - * gzip: Error out if reserved bits are set https://github.com/klauspost/compress/pull/891 - -* Nov 15th, 2023 - [v1.17.3](https://github.com/klauspost/compress/releases/tag/v1.17.3) - * fse: Fix max header size https://github.com/klauspost/compress/pull/881 - * zstd: Improve better/best compression https://github.com/klauspost/compress/pull/877 - * gzhttp: Fix missing content type on Close https://github.com/klauspost/compress/pull/883 - -* Oct 22nd, 2023 - [v1.17.2](https://github.com/klauspost/compress/releases/tag/v1.17.2) - * zstd: Fix rare *CORRUPTION* output in "best" mode. See https://github.com/klauspost/compress/pull/876 - -* Oct 14th, 2023 - [v1.17.1](https://github.com/klauspost/compress/releases/tag/v1.17.1) - * s2: Fix S2 "best" dictionary wrong encoding by @klauspost in https://github.com/klauspost/compress/pull/871 - * flate: Reduce allocations in decompressor and minor code improvements by @fakefloordiv in https://github.com/klauspost/compress/pull/869 - * s2: Fix EstimateBlockSize on 6&7 length input by @klauspost in https://github.com/klauspost/compress/pull/867 - -* Sept 19th, 2023 - [v1.17.0](https://github.com/klauspost/compress/releases/tag/v1.17.0) - * Add experimental dictionary builder https://github.com/klauspost/compress/pull/853 - * Add xerial snappy read/writer https://github.com/klauspost/compress/pull/838 - * flate: Add limited window compression https://github.com/klauspost/compress/pull/843 - * s2: Do 2 overlapping match checks https://github.com/klauspost/compress/pull/839 - * flate: Add amd64 assembly matchlen https://github.com/klauspost/compress/pull/837 - * gzip: Copy bufio.Reader on Reset by @thatguystone in https://github.com/klauspost/compress/pull/860 - -
- See changes to v1.16.x - - -* July 1st, 2023 - [v1.16.7](https://github.com/klauspost/compress/releases/tag/v1.16.7) - * zstd: Fix default level first dictionary encode https://github.com/klauspost/compress/pull/829 - * s2: add GetBufferCapacity() method by @GiedriusS in https://github.com/klauspost/compress/pull/832 - -* June 13, 2023 - [v1.16.6](https://github.com/klauspost/compress/releases/tag/v1.16.6) - * zstd: correctly ignore WithEncoderPadding(1) by @ianlancetaylor in https://github.com/klauspost/compress/pull/806 - * zstd: Add amd64 match length assembly https://github.com/klauspost/compress/pull/824 - * gzhttp: Handle informational headers by @rtribotte in https://github.com/klauspost/compress/pull/815 - * s2: Improve Better compression slightly https://github.com/klauspost/compress/pull/663 - -* Apr 16, 2023 - [v1.16.5](https://github.com/klauspost/compress/releases/tag/v1.16.5) - * zstd: readByte needs to use io.ReadFull by @jnoxon in https://github.com/klauspost/compress/pull/802 - * gzip: Fix WriterTo after initial read https://github.com/klauspost/compress/pull/804 - -* Apr 5, 2023 - [v1.16.4](https://github.com/klauspost/compress/releases/tag/v1.16.4) - * zstd: Improve zstd best efficiency by @greatroar and @klauspost in https://github.com/klauspost/compress/pull/784 - * zstd: Respect WithAllLitEntropyCompression https://github.com/klauspost/compress/pull/792 - * zstd: Fix amd64 not always detecting corrupt data https://github.com/klauspost/compress/pull/785 - * zstd: Various minor improvements by @greatroar in https://github.com/klauspost/compress/pull/788 https://github.com/klauspost/compress/pull/794 https://github.com/klauspost/compress/pull/795 - * s2: Fix huge block overflow https://github.com/klauspost/compress/pull/779 - * s2: Allow CustomEncoder fallback https://github.com/klauspost/compress/pull/780 - * gzhttp: Support ResponseWriter Unwrap() in gzhttp handler by @jgimenez in https://github.com/klauspost/compress/pull/799 - -* Mar 13, 2023 - [v1.16.1](https://github.com/klauspost/compress/releases/tag/v1.16.1) - * zstd: Speed up + improve best encoder by @greatroar in https://github.com/klauspost/compress/pull/776 - * gzhttp: Add optional [BREACH mitigation](https://github.com/klauspost/compress/tree/master/gzhttp#breach-mitigation). https://github.com/klauspost/compress/pull/762 https://github.com/klauspost/compress/pull/768 https://github.com/klauspost/compress/pull/769 https://github.com/klauspost/compress/pull/770 https://github.com/klauspost/compress/pull/767 - * s2: Add Intel LZ4s converter https://github.com/klauspost/compress/pull/766 - * zstd: Minor bug fixes https://github.com/klauspost/compress/pull/771 https://github.com/klauspost/compress/pull/772 https://github.com/klauspost/compress/pull/773 - * huff0: Speed up compress1xDo by @greatroar in https://github.com/klauspost/compress/pull/774 - -* Feb 26, 2023 - [v1.16.0](https://github.com/klauspost/compress/releases/tag/v1.16.0) - * s2: Add [Dictionary](https://github.com/klauspost/compress/tree/master/s2#dictionaries) support. https://github.com/klauspost/compress/pull/685 - * s2: Add Compression Size Estimate. https://github.com/klauspost/compress/pull/752 - * s2: Add support for custom stream encoder. https://github.com/klauspost/compress/pull/755 - * s2: Add LZ4 block converter. https://github.com/klauspost/compress/pull/748 - * s2: Support io.ReaderAt in ReadSeeker. https://github.com/klauspost/compress/pull/747 - * s2c/s2sx: Use concurrent decoding. https://github.com/klauspost/compress/pull/746 -
- -
- See changes to v1.15.x - -* Jan 21st, 2023 (v1.15.15) - * deflate: Improve level 7-9 by @klauspost in https://github.com/klauspost/compress/pull/739 - * zstd: Add delta encoding support by @greatroar in https://github.com/klauspost/compress/pull/728 - * zstd: Various speed improvements by @greatroar https://github.com/klauspost/compress/pull/741 https://github.com/klauspost/compress/pull/734 https://github.com/klauspost/compress/pull/736 https://github.com/klauspost/compress/pull/744 https://github.com/klauspost/compress/pull/743 https://github.com/klauspost/compress/pull/745 - * gzhttp: Add SuffixETag() and DropETag() options to prevent ETag collisions on compressed responses by @willbicks in https://github.com/klauspost/compress/pull/740 - -* Jan 3rd, 2023 (v1.15.14) - - * flate: Improve speed in big stateless blocks https://github.com/klauspost/compress/pull/718 - * zstd: Minor speed tweaks by @greatroar in https://github.com/klauspost/compress/pull/716 https://github.com/klauspost/compress/pull/720 - * export NoGzipResponseWriter for custom ResponseWriter wrappers by @harshavardhana in https://github.com/klauspost/compress/pull/722 - * s2: Add example for indexing and existing stream https://github.com/klauspost/compress/pull/723 - -* Dec 11, 2022 (v1.15.13) - * zstd: Add [MaxEncodedSize](https://pkg.go.dev/github.com/klauspost/compress@v1.15.13/zstd#Encoder.MaxEncodedSize) to encoder https://github.com/klauspost/compress/pull/691 - * zstd: Various tweaks and improvements https://github.com/klauspost/compress/pull/693 https://github.com/klauspost/compress/pull/695 https://github.com/klauspost/compress/pull/696 https://github.com/klauspost/compress/pull/701 https://github.com/klauspost/compress/pull/702 https://github.com/klauspost/compress/pull/703 https://github.com/klauspost/compress/pull/704 https://github.com/klauspost/compress/pull/705 https://github.com/klauspost/compress/pull/706 https://github.com/klauspost/compress/pull/707 https://github.com/klauspost/compress/pull/708 - -* Oct 26, 2022 (v1.15.12) - - * zstd: Tweak decoder allocs. https://github.com/klauspost/compress/pull/680 - * gzhttp: Always delete `HeaderNoCompression` https://github.com/klauspost/compress/pull/683 - -* Sept 26, 2022 (v1.15.11) - - * flate: Improve level 1-3 compression https://github.com/klauspost/compress/pull/678 - * zstd: Improve "best" compression by @nightwolfz in https://github.com/klauspost/compress/pull/677 - * zstd: Fix+reduce decompression allocations https://github.com/klauspost/compress/pull/668 - * zstd: Fix non-effective noescape tag https://github.com/klauspost/compress/pull/667 - -* Sept 16, 2022 (v1.15.10) - - * zstd: Add [WithDecodeAllCapLimit](https://pkg.go.dev/github.com/klauspost/compress@v1.15.10/zstd#WithDecodeAllCapLimit) https://github.com/klauspost/compress/pull/649 - * Add Go 1.19 - deprecate Go 1.16 https://github.com/klauspost/compress/pull/651 - * flate: Improve level 5+6 compression https://github.com/klauspost/compress/pull/656 - * zstd: Improve "better" compression https://github.com/klauspost/compress/pull/657 - * s2: Improve "best" compression https://github.com/klauspost/compress/pull/658 - * s2: Improve "better" compression. https://github.com/klauspost/compress/pull/635 - * s2: Slightly faster non-assembly decompression https://github.com/klauspost/compress/pull/646 - * Use arrays for constant size copies https://github.com/klauspost/compress/pull/659 - -* July 21, 2022 (v1.15.9) - - * zstd: Fix decoder crash on amd64 (no BMI) on invalid input https://github.com/klauspost/compress/pull/645 - * zstd: Disable decoder extended memory copies (amd64) due to possible crashes https://github.com/klauspost/compress/pull/644 - * zstd: Allow single segments up to "max decoded size" by @klauspost in https://github.com/klauspost/compress/pull/643 - -* July 13, 2022 (v1.15.8) - - * gzip: fix stack exhaustion bug in Reader.Read https://github.com/klauspost/compress/pull/641 - * s2: Add Index header trim/restore https://github.com/klauspost/compress/pull/638 - * zstd: Optimize seqdeq amd64 asm by @greatroar in https://github.com/klauspost/compress/pull/636 - * zstd: Improve decoder memcopy https://github.com/klauspost/compress/pull/637 - * huff0: Pass a single bitReader pointer to asm by @greatroar in https://github.com/klauspost/compress/pull/634 - * zstd: Branchless getBits for amd64 w/o BMI2 by @greatroar in https://github.com/klauspost/compress/pull/640 - * gzhttp: Remove header before writing https://github.com/klauspost/compress/pull/639 - -* June 29, 2022 (v1.15.7) - - * s2: Fix absolute forward seeks https://github.com/klauspost/compress/pull/633 - * zip: Merge upstream https://github.com/klauspost/compress/pull/631 - * zip: Re-add zip64 fix https://github.com/klauspost/compress/pull/624 - * zstd: translate fseDecoder.buildDtable into asm by @WojciechMula in https://github.com/klauspost/compress/pull/598 - * flate: Faster histograms https://github.com/klauspost/compress/pull/620 - * deflate: Use compound hcode https://github.com/klauspost/compress/pull/622 - -* June 3, 2022 (v1.15.6) - * s2: Improve coding for long, close matches https://github.com/klauspost/compress/pull/613 - * s2c: Add Snappy/S2 stream recompression https://github.com/klauspost/compress/pull/611 - * zstd: Always use configured block size https://github.com/klauspost/compress/pull/605 - * zstd: Fix incorrect hash table placement for dict encoding in default https://github.com/klauspost/compress/pull/606 - * zstd: Apply default config to ZipDecompressor without options https://github.com/klauspost/compress/pull/608 - * gzhttp: Exclude more common archive formats https://github.com/klauspost/compress/pull/612 - * s2: Add ReaderIgnoreCRC https://github.com/klauspost/compress/pull/609 - * s2: Remove sanity load on index creation https://github.com/klauspost/compress/pull/607 - * snappy: Use dedicated function for scoring https://github.com/klauspost/compress/pull/614 - * s2c+s2d: Use official snappy framed extension https://github.com/klauspost/compress/pull/610 - -* May 25, 2022 (v1.15.5) - * s2: Add concurrent stream decompression https://github.com/klauspost/compress/pull/602 - * s2: Fix final emit oob read crash on amd64 https://github.com/klauspost/compress/pull/601 - * huff0: asm implementation of Decompress1X by @WojciechMula https://github.com/klauspost/compress/pull/596 - * zstd: Use 1 less goroutine for stream decoding https://github.com/klauspost/compress/pull/588 - * zstd: Copy literal in 16 byte blocks when possible https://github.com/klauspost/compress/pull/592 - * zstd: Speed up when WithDecoderLowmem(false) https://github.com/klauspost/compress/pull/599 - * zstd: faster next state update in BMI2 version of decode by @WojciechMula in https://github.com/klauspost/compress/pull/593 - * huff0: Do not check max size when reading table. https://github.com/klauspost/compress/pull/586 - * flate: Inplace hashing for level 7-9 by @klauspost in https://github.com/klauspost/compress/pull/590 - - -* May 11, 2022 (v1.15.4) - * huff0: decompress directly into output by @WojciechMula in [#577](https://github.com/klauspost/compress/pull/577) - * inflate: Keep dict on stack [#581](https://github.com/klauspost/compress/pull/581) - * zstd: Faster decoding memcopy in asm [#583](https://github.com/klauspost/compress/pull/583) - * zstd: Fix ignored crc [#580](https://github.com/klauspost/compress/pull/580) - -* May 5, 2022 (v1.15.3) - * zstd: Allow to ignore checksum checking by @WojciechMula [#572](https://github.com/klauspost/compress/pull/572) - * s2: Fix incorrect seek for io.SeekEnd in [#575](https://github.com/klauspost/compress/pull/575) - -* Apr 26, 2022 (v1.15.2) - * zstd: Add x86-64 assembly for decompression on streams and blocks. Contributed by [@WojciechMula](https://github.com/WojciechMula). Typically 2x faster. [#528](https://github.com/klauspost/compress/pull/528) [#531](https://github.com/klauspost/compress/pull/531) [#545](https://github.com/klauspost/compress/pull/545) [#537](https://github.com/klauspost/compress/pull/537) - * zstd: Add options to ZipDecompressor and fixes [#539](https://github.com/klauspost/compress/pull/539) - * s2: Use sorted search for index [#555](https://github.com/klauspost/compress/pull/555) - * Minimum version is Go 1.16, added CI test on 1.18. - -* Mar 11, 2022 (v1.15.1) - * huff0: Add x86 assembly of Decode4X by @WojciechMula in [#512](https://github.com/klauspost/compress/pull/512) - * zstd: Reuse zip decoders in [#514](https://github.com/klauspost/compress/pull/514) - * zstd: Detect extra block data and report as corrupted in [#520](https://github.com/klauspost/compress/pull/520) - * zstd: Handle zero sized frame content size stricter in [#521](https://github.com/klauspost/compress/pull/521) - * zstd: Add stricter block size checks in [#523](https://github.com/klauspost/compress/pull/523) - -* Mar 3, 2022 (v1.15.0) - * zstd: Refactor decoder by @klauspost in [#498](https://github.com/klauspost/compress/pull/498) - * zstd: Add stream encoding without goroutines by @klauspost in [#505](https://github.com/klauspost/compress/pull/505) - * huff0: Prevent single blocks exceeding 16 bits by @klauspost in[#507](https://github.com/klauspost/compress/pull/507) - * flate: Inline literal emission by @klauspost in [#509](https://github.com/klauspost/compress/pull/509) - * gzhttp: Add zstd to transport by @klauspost in [#400](https://github.com/klauspost/compress/pull/400) - * gzhttp: Make content-type optional by @klauspost in [#510](https://github.com/klauspost/compress/pull/510) - -Both compression and decompression now supports "synchronous" stream operations. This means that whenever "concurrency" is set to 1, they will operate without spawning goroutines. - -Stream decompression is now faster on asynchronous, since the goroutine allocation much more effectively splits the workload. On typical streams this will typically use 2 cores fully for decompression. When a stream has finished decoding no goroutines will be left over, so decoders can now safely be pooled and still be garbage collected. - -While the release has been extensively tested, it is recommended to testing when upgrading. - -
- -
- See changes to v1.14.x - -* Feb 22, 2022 (v1.14.4) - * flate: Fix rare huffman only (-2) corruption. [#503](https://github.com/klauspost/compress/pull/503) - * zip: Update deprecated CreateHeaderRaw to correctly call CreateRaw by @saracen in [#502](https://github.com/klauspost/compress/pull/502) - * zip: don't read data descriptor early by @saracen in [#501](https://github.com/klauspost/compress/pull/501) #501 - * huff0: Use static decompression buffer up to 30% faster by @klauspost in [#499](https://github.com/klauspost/compress/pull/499) [#500](https://github.com/klauspost/compress/pull/500) - -* Feb 17, 2022 (v1.14.3) - * flate: Improve fastest levels compression speed ~10% more throughput. [#482](https://github.com/klauspost/compress/pull/482) [#489](https://github.com/klauspost/compress/pull/489) [#490](https://github.com/klauspost/compress/pull/490) [#491](https://github.com/klauspost/compress/pull/491) [#494](https://github.com/klauspost/compress/pull/494) [#478](https://github.com/klauspost/compress/pull/478) - * flate: Faster decompression speed, ~5-10%. [#483](https://github.com/klauspost/compress/pull/483) - * s2: Faster compression with Go v1.18 and amd64 microarch level 3+. [#484](https://github.com/klauspost/compress/pull/484) [#486](https://github.com/klauspost/compress/pull/486) - -* Jan 25, 2022 (v1.14.2) - * zstd: improve header decoder by @dsnet [#476](https://github.com/klauspost/compress/pull/476) - * zstd: Add bigger default blocks [#469](https://github.com/klauspost/compress/pull/469) - * zstd: Remove unused decompression buffer [#470](https://github.com/klauspost/compress/pull/470) - * zstd: Fix logically dead code by @ningmingxiao [#472](https://github.com/klauspost/compress/pull/472) - * flate: Improve level 7-9 [#471](https://github.com/klauspost/compress/pull/471) [#473](https://github.com/klauspost/compress/pull/473) - * zstd: Add noasm tag for xxhash [#475](https://github.com/klauspost/compress/pull/475) - -* Jan 11, 2022 (v1.14.1) - * s2: Add stream index in [#462](https://github.com/klauspost/compress/pull/462) - * flate: Speed and efficiency improvements in [#439](https://github.com/klauspost/compress/pull/439) [#461](https://github.com/klauspost/compress/pull/461) [#455](https://github.com/klauspost/compress/pull/455) [#452](https://github.com/klauspost/compress/pull/452) [#458](https://github.com/klauspost/compress/pull/458) - * zstd: Performance improvement in [#420]( https://github.com/klauspost/compress/pull/420) [#456](https://github.com/klauspost/compress/pull/456) [#437](https://github.com/klauspost/compress/pull/437) [#467](https://github.com/klauspost/compress/pull/467) [#468](https://github.com/klauspost/compress/pull/468) - * zstd: add arm64 xxhash assembly in [#464](https://github.com/klauspost/compress/pull/464) - * Add garbled for binaries for s2 in [#445](https://github.com/klauspost/compress/pull/445) -
- -
- See changes to v1.13.x - -* Aug 30, 2021 (v1.13.5) - * gz/zlib/flate: Alias stdlib errors [#425](https://github.com/klauspost/compress/pull/425) - * s2: Add block support to commandline tools [#413](https://github.com/klauspost/compress/pull/413) - * zstd: pooledZipWriter should return Writers to the same pool [#426](https://github.com/klauspost/compress/pull/426) - * Removed golang/snappy as external dependency for tests [#421](https://github.com/klauspost/compress/pull/421) - -* Aug 12, 2021 (v1.13.4) - * Add [snappy replacement package](https://github.com/klauspost/compress/tree/master/snappy). - * zstd: Fix incorrect encoding in "best" mode [#415](https://github.com/klauspost/compress/pull/415) - -* Aug 3, 2021 (v1.13.3) - * zstd: Improve Best compression [#404](https://github.com/klauspost/compress/pull/404) - * zstd: Fix WriteTo error forwarding [#411](https://github.com/klauspost/compress/pull/411) - * gzhttp: Return http.HandlerFunc instead of http.Handler. Unlikely breaking change. [#406](https://github.com/klauspost/compress/pull/406) - * s2sx: Fix max size error [#399](https://github.com/klauspost/compress/pull/399) - * zstd: Add optional stream content size on reset [#401](https://github.com/klauspost/compress/pull/401) - * zstd: use SpeedBestCompression for level >= 10 [#410](https://github.com/klauspost/compress/pull/410) - -* Jun 14, 2021 (v1.13.1) - * s2: Add full Snappy output support [#396](https://github.com/klauspost/compress/pull/396) - * zstd: Add configurable [Decoder window](https://pkg.go.dev/github.com/klauspost/compress/zstd#WithDecoderMaxWindow) size [#394](https://github.com/klauspost/compress/pull/394) - * gzhttp: Add header to skip compression [#389](https://github.com/klauspost/compress/pull/389) - * s2: Improve speed with bigger output margin [#395](https://github.com/klauspost/compress/pull/395) - -* Jun 3, 2021 (v1.13.0) - * Added [gzhttp](https://github.com/klauspost/compress/tree/master/gzhttp#gzip-handler) which allows wrapping HTTP servers and clients with GZIP compressors. - * zstd: Detect short invalid signatures [#382](https://github.com/klauspost/compress/pull/382) - * zstd: Spawn decoder goroutine only if needed. [#380](https://github.com/klauspost/compress/pull/380) -
- - -
- See changes to v1.12.x - -* May 25, 2021 (v1.12.3) - * deflate: Better/faster Huffman encoding [#374](https://github.com/klauspost/compress/pull/374) - * deflate: Allocate less for history. [#375](https://github.com/klauspost/compress/pull/375) - * zstd: Forward read errors [#373](https://github.com/klauspost/compress/pull/373) - -* Apr 27, 2021 (v1.12.2) - * zstd: Improve better/best compression [#360](https://github.com/klauspost/compress/pull/360) [#364](https://github.com/klauspost/compress/pull/364) [#365](https://github.com/klauspost/compress/pull/365) - * zstd: Add helpers to compress/decompress zstd inside zip files [#363](https://github.com/klauspost/compress/pull/363) - * deflate: Improve level 5+6 compression [#367](https://github.com/klauspost/compress/pull/367) - * s2: Improve better/best compression [#358](https://github.com/klauspost/compress/pull/358) [#359](https://github.com/klauspost/compress/pull/358) - * s2: Load after checking src limit on amd64. [#362](https://github.com/klauspost/compress/pull/362) - * s2sx: Limit max executable size [#368](https://github.com/klauspost/compress/pull/368) - -* Apr 14, 2021 (v1.12.1) - * snappy package removed. Upstream added as dependency. - * s2: Better compression in "best" mode [#353](https://github.com/klauspost/compress/pull/353) - * s2sx: Add stdin input and detect pre-compressed from signature [#352](https://github.com/klauspost/compress/pull/352) - * s2c/s2d: Add http as possible input [#348](https://github.com/klauspost/compress/pull/348) - * s2c/s2d/s2sx: Always truncate when writing files [#352](https://github.com/klauspost/compress/pull/352) - * zstd: Reduce memory usage further when using [WithLowerEncoderMem](https://pkg.go.dev/github.com/klauspost/compress/zstd#WithLowerEncoderMem) [#346](https://github.com/klauspost/compress/pull/346) - * s2: Fix potential problem with amd64 assembly and profilers [#349](https://github.com/klauspost/compress/pull/349) -
- -
- See changes to v1.11.x - -* Mar 26, 2021 (v1.11.13) - * zstd: Big speedup on small dictionary encodes [#344](https://github.com/klauspost/compress/pull/344) [#345](https://github.com/klauspost/compress/pull/345) - * zstd: Add [WithLowerEncoderMem](https://pkg.go.dev/github.com/klauspost/compress/zstd#WithLowerEncoderMem) encoder option [#336](https://github.com/klauspost/compress/pull/336) - * deflate: Improve entropy compression [#338](https://github.com/klauspost/compress/pull/338) - * s2: Clean up and minor performance improvement in best [#341](https://github.com/klauspost/compress/pull/341) - -* Mar 5, 2021 (v1.11.12) - * s2: Add `s2sx` binary that creates [self extracting archives](https://github.com/klauspost/compress/tree/master/s2#s2sx-self-extracting-archives). - * s2: Speed up decompression on non-assembly platforms [#328](https://github.com/klauspost/compress/pull/328) - -* Mar 1, 2021 (v1.11.9) - * s2: Add ARM64 decompression assembly. Around 2x output speed. [#324](https://github.com/klauspost/compress/pull/324) - * s2: Improve "better" speed and efficiency. [#325](https://github.com/klauspost/compress/pull/325) - * s2: Fix binaries. - -* Feb 25, 2021 (v1.11.8) - * s2: Fixed occasional out-of-bounds write on amd64. Upgrade recommended. - * s2: Add AMD64 assembly for better mode. 25-50% faster. [#315](https://github.com/klauspost/compress/pull/315) - * s2: Less upfront decoder allocation. [#322](https://github.com/klauspost/compress/pull/322) - * zstd: Faster "compression" of incompressible data. [#314](https://github.com/klauspost/compress/pull/314) - * zip: Fix zip64 headers. [#313](https://github.com/klauspost/compress/pull/313) - -* Jan 14, 2021 (v1.11.7) - * Use Bytes() interface to get bytes across packages. [#309](https://github.com/klauspost/compress/pull/309) - * s2: Add 'best' compression option. [#310](https://github.com/klauspost/compress/pull/310) - * s2: Add ReaderMaxBlockSize, changes `s2.NewReader` signature to include varargs. [#311](https://github.com/klauspost/compress/pull/311) - * s2: Fix crash on small better buffers. [#308](https://github.com/klauspost/compress/pull/308) - * s2: Clean up decoder. [#312](https://github.com/klauspost/compress/pull/312) - -* Jan 7, 2021 (v1.11.6) - * zstd: Make decoder allocations smaller [#306](https://github.com/klauspost/compress/pull/306) - * zstd: Free Decoder resources when Reset is called with a nil io.Reader [#305](https://github.com/klauspost/compress/pull/305) - -* Dec 20, 2020 (v1.11.4) - * zstd: Add Best compression mode [#304](https://github.com/klauspost/compress/pull/304) - * Add header decoder [#299](https://github.com/klauspost/compress/pull/299) - * s2: Add uncompressed stream option [#297](https://github.com/klauspost/compress/pull/297) - * Simplify/speed up small blocks with known max size. [#300](https://github.com/klauspost/compress/pull/300) - * zstd: Always reset literal dict encoder [#303](https://github.com/klauspost/compress/pull/303) - -* Nov 15, 2020 (v1.11.3) - * inflate: 10-15% faster decompression [#293](https://github.com/klauspost/compress/pull/293) - * zstd: Tweak DecodeAll default allocation [#295](https://github.com/klauspost/compress/pull/295) - -* Oct 11, 2020 (v1.11.2) - * s2: Fix out of bounds read in "better" block compression [#291](https://github.com/klauspost/compress/pull/291) - -* Oct 1, 2020 (v1.11.1) - * zstd: Set allLitEntropy true in default configuration [#286](https://github.com/klauspost/compress/pull/286) - -* Sept 8, 2020 (v1.11.0) - * zstd: Add experimental compression [dictionaries](https://github.com/klauspost/compress/tree/master/zstd#dictionaries) [#281](https://github.com/klauspost/compress/pull/281) - * zstd: Fix mixed Write and ReadFrom calls [#282](https://github.com/klauspost/compress/pull/282) - * inflate/gz: Limit variable shifts, ~5% faster decompression [#274](https://github.com/klauspost/compress/pull/274) -
- -
- See changes to v1.10.x - -* July 8, 2020 (v1.10.11) - * zstd: Fix extra block when compressing with ReadFrom. [#278](https://github.com/klauspost/compress/pull/278) - * huff0: Also populate compression table when reading decoding table. [#275](https://github.com/klauspost/compress/pull/275) - -* June 23, 2020 (v1.10.10) - * zstd: Skip entropy compression in fastest mode when no matches. [#270](https://github.com/klauspost/compress/pull/270) - -* June 16, 2020 (v1.10.9): - * zstd: API change for specifying dictionaries. See [#268](https://github.com/klauspost/compress/pull/268) - * zip: update CreateHeaderRaw to handle zip64 fields. [#266](https://github.com/klauspost/compress/pull/266) - * Fuzzit tests removed. The service has been purchased and is no longer available. - -* June 5, 2020 (v1.10.8): - * 1.15x faster zstd block decompression. [#265](https://github.com/klauspost/compress/pull/265) - -* June 1, 2020 (v1.10.7): - * Added zstd decompression [dictionary support](https://github.com/klauspost/compress/tree/master/zstd#dictionaries) - * Increase zstd decompression speed up to 1.19x. [#259](https://github.com/klauspost/compress/pull/259) - * Remove internal reset call in zstd compression and reduce allocations. [#263](https://github.com/klauspost/compress/pull/263) - -* May 21, 2020: (v1.10.6) - * zstd: Reduce allocations while decoding. [#258](https://github.com/klauspost/compress/pull/258), [#252](https://github.com/klauspost/compress/pull/252) - * zstd: Stricter decompression checks. - -* April 12, 2020: (v1.10.5) - * s2-commands: Flush output when receiving SIGINT. [#239](https://github.com/klauspost/compress/pull/239) - -* Apr 8, 2020: (v1.10.4) - * zstd: Minor/special case optimizations. [#251](https://github.com/klauspost/compress/pull/251), [#250](https://github.com/klauspost/compress/pull/250), [#249](https://github.com/klauspost/compress/pull/249), [#247](https://github.com/klauspost/compress/pull/247) -* Mar 11, 2020: (v1.10.3) - * s2: Use S2 encoder in pure Go mode for Snappy output as well. [#245](https://github.com/klauspost/compress/pull/245) - * s2: Fix pure Go block encoder. [#244](https://github.com/klauspost/compress/pull/244) - * zstd: Added "better compression" mode. [#240](https://github.com/klauspost/compress/pull/240) - * zstd: Improve speed of fastest compression mode by 5-10% [#241](https://github.com/klauspost/compress/pull/241) - * zstd: Skip creating encoders when not needed. [#238](https://github.com/klauspost/compress/pull/238) - -* Feb 27, 2020: (v1.10.2) - * Close to 50% speedup in inflate (gzip/zip decompression). [#236](https://github.com/klauspost/compress/pull/236) [#234](https://github.com/klauspost/compress/pull/234) [#232](https://github.com/klauspost/compress/pull/232) - * Reduce deflate level 1-6 memory usage up to 59%. [#227](https://github.com/klauspost/compress/pull/227) - -* Feb 18, 2020: (v1.10.1) - * Fix zstd crash when resetting multiple times without sending data. [#226](https://github.com/klauspost/compress/pull/226) - * deflate: Fix dictionary use on level 1-6. [#224](https://github.com/klauspost/compress/pull/224) - * Remove deflate writer reference when closing. [#224](https://github.com/klauspost/compress/pull/224) - -* Feb 4, 2020: (v1.10.0) - * Add optional dictionary to [stateless deflate](https://pkg.go.dev/github.com/klauspost/compress/flate?tab=doc#StatelessDeflate). Breaking change, send `nil` for previous behaviour. [#216](https://github.com/klauspost/compress/pull/216) - * Fix buffer overflow on repeated small block deflate. [#218](https://github.com/klauspost/compress/pull/218) - * Allow copying content from an existing ZIP file without decompressing+compressing. [#214](https://github.com/klauspost/compress/pull/214) - * Added [S2](https://github.com/klauspost/compress/tree/master/s2#s2-compression) AMD64 assembler and various optimizations. Stream speed >10GB/s. [#186](https://github.com/klauspost/compress/pull/186) - -
- -
- See changes prior to v1.10.0 - -* Jan 20,2020 (v1.9.8) Optimize gzip/deflate with better size estimates and faster table generation. [#207](https://github.com/klauspost/compress/pull/207) by [luyu6056](https://github.com/luyu6056), [#206](https://github.com/klauspost/compress/pull/206). -* Jan 11, 2020: S2 Encode/Decode will use provided buffer if capacity is big enough. [#204](https://github.com/klauspost/compress/pull/204) -* Jan 5, 2020: (v1.9.7) Fix another zstd regression in v1.9.5 - v1.9.6 removed. -* Jan 4, 2020: (v1.9.6) Regression in v1.9.5 fixed causing corrupt zstd encodes in rare cases. -* Jan 4, 2020: Faster IO in [s2c + s2d commandline tools](https://github.com/klauspost/compress/tree/master/s2#commandline-tools) compression/decompression. [#192](https://github.com/klauspost/compress/pull/192) -* Dec 29, 2019: Removed v1.9.5 since fuzz tests showed a compatibility problem with the reference zstandard decoder. -* Dec 29, 2019: (v1.9.5) zstd: 10-20% faster block compression. [#199](https://github.com/klauspost/compress/pull/199) -* Dec 29, 2019: [zip](https://godoc.org/github.com/klauspost/compress/zip) package updated with latest Go features -* Dec 29, 2019: zstd: Single segment flag condintions tweaked. [#197](https://github.com/klauspost/compress/pull/197) -* Dec 18, 2019: s2: Faster compression when ReadFrom is used. [#198](https://github.com/klauspost/compress/pull/198) -* Dec 10, 2019: s2: Fix repeat length output when just above at 16MB limit. -* Dec 10, 2019: zstd: Add function to get decoder as io.ReadCloser. [#191](https://github.com/klauspost/compress/pull/191) -* Dec 3, 2019: (v1.9.4) S2: limit max repeat length. [#188](https://github.com/klauspost/compress/pull/188) -* Dec 3, 2019: Add [WithNoEntropyCompression](https://godoc.org/github.com/klauspost/compress/zstd#WithNoEntropyCompression) to zstd [#187](https://github.com/klauspost/compress/pull/187) -* Dec 3, 2019: Reduce memory use for tests. Check for leaked goroutines. -* Nov 28, 2019 (v1.9.3) Less allocations in stateless deflate. -* Nov 28, 2019: 5-20% Faster huff0 decode. Impacts zstd as well. [#184](https://github.com/klauspost/compress/pull/184) -* Nov 12, 2019 (v1.9.2) Added [Stateless Compression](#stateless-compression) for gzip/deflate. -* Nov 12, 2019: Fixed zstd decompression of large single blocks. [#180](https://github.com/klauspost/compress/pull/180) -* Nov 11, 2019: Set default [s2c](https://github.com/klauspost/compress/tree/master/s2#commandline-tools) block size to 4MB. -* Nov 11, 2019: Reduce inflate memory use by 1KB. -* Nov 10, 2019: Less allocations in deflate bit writer. -* Nov 10, 2019: Fix inconsistent error returned by zstd decoder. -* Oct 28, 2019 (v1.9.1) ztsd: Fix crash when compressing blocks. [#174](https://github.com/klauspost/compress/pull/174) -* Oct 24, 2019 (v1.9.0) zstd: Fix rare data corruption [#173](https://github.com/klauspost/compress/pull/173) -* Oct 24, 2019 zstd: Fix huff0 out of buffer write [#171](https://github.com/klauspost/compress/pull/171) and always return errors [#172](https://github.com/klauspost/compress/pull/172) -* Oct 10, 2019: Big deflate rewrite, 30-40% faster with better compression [#105](https://github.com/klauspost/compress/pull/105) - -
- -
- See changes prior to v1.9.0 - -* Oct 10, 2019: (v1.8.6) zstd: Allow partial reads to get flushed data. [#169](https://github.com/klauspost/compress/pull/169) -* Oct 3, 2019: Fix inconsistent results on broken zstd streams. -* Sep 25, 2019: Added `-rm` (remove source files) and `-q` (no output except errors) to `s2c` and `s2d` [commands](https://github.com/klauspost/compress/tree/master/s2#commandline-tools) -* Sep 16, 2019: (v1.8.4) Add `s2c` and `s2d` [commandline tools](https://github.com/klauspost/compress/tree/master/s2#commandline-tools). -* Sep 10, 2019: (v1.8.3) Fix s2 decoder [Skip](https://godoc.org/github.com/klauspost/compress/s2#Reader.Skip). -* Sep 7, 2019: zstd: Added [WithWindowSize](https://godoc.org/github.com/klauspost/compress/zstd#WithWindowSize), contributed by [ianwilkes](https://github.com/ianwilkes). -* Sep 5, 2019: (v1.8.2) Add [WithZeroFrames](https://godoc.org/github.com/klauspost/compress/zstd#WithZeroFrames) which adds full zero payload block encoding option. -* Sep 5, 2019: Lazy initialization of zstandard predefined en/decoder tables. -* Aug 26, 2019: (v1.8.1) S2: 1-2% compression increase in "better" compression mode. -* Aug 26, 2019: zstd: Check maximum size of Huffman 1X compressed literals while decoding. -* Aug 24, 2019: (v1.8.0) Added [S2 compression](https://github.com/klauspost/compress/tree/master/s2#s2-compression), a high performance replacement for Snappy. -* Aug 21, 2019: (v1.7.6) Fixed minor issues found by fuzzer. One could lead to zstd not decompressing. -* Aug 18, 2019: Add [fuzzit](https://fuzzit.dev/) continuous fuzzing. -* Aug 14, 2019: zstd: Skip incompressible data 2x faster. [#147](https://github.com/klauspost/compress/pull/147) -* Aug 4, 2019 (v1.7.5): Better literal compression. [#146](https://github.com/klauspost/compress/pull/146) -* Aug 4, 2019: Faster zstd compression. [#143](https://github.com/klauspost/compress/pull/143) [#144](https://github.com/klauspost/compress/pull/144) -* Aug 4, 2019: Faster zstd decompression. [#145](https://github.com/klauspost/compress/pull/145) [#143](https://github.com/klauspost/compress/pull/143) [#142](https://github.com/klauspost/compress/pull/142) -* July 15, 2019 (v1.7.4): Fix double EOF block in rare cases on zstd encoder. -* July 15, 2019 (v1.7.3): Minor speedup/compression increase in default zstd encoder. -* July 14, 2019: zstd decoder: Fix decompression error on multiple uses with mixed content. -* July 7, 2019 (v1.7.2): Snappy update, zstd decoder potential race fix. -* June 17, 2019: zstd decompression bugfix. -* June 17, 2019: fix 32 bit builds. -* June 17, 2019: Easier use in modules (less dependencies). -* June 9, 2019: New stronger "default" [zstd](https://github.com/klauspost/compress/tree/master/zstd#zstd) compression mode. Matches zstd default compression ratio. -* June 5, 2019: 20-40% throughput in [zstandard](https://github.com/klauspost/compress/tree/master/zstd#zstd) compression and better compression. -* June 5, 2019: deflate/gzip compression: Reduce memory usage of lower compression levels. -* June 2, 2019: Added [zstandard](https://github.com/klauspost/compress/tree/master/zstd#zstd) compression! -* May 25, 2019: deflate/gzip: 10% faster bit writer, mostly visible in lower levels. -* Apr 22, 2019: [zstd](https://github.com/klauspost/compress/tree/master/zstd#zstd) decompression added. -* Aug 1, 2018: Added [huff0 README](https://github.com/klauspost/compress/tree/master/huff0#huff0-entropy-compression). -* Jul 8, 2018: Added [Performance Update 2018](#performance-update-2018) below. -* Jun 23, 2018: Merged [Go 1.11 inflate optimizations](https://go-review.googlesource.com/c/go/+/102235). Go 1.9 is now required. Backwards compatible version tagged with [v1.3.0](https://github.com/klauspost/compress/releases/tag/v1.3.0). -* Apr 2, 2018: Added [huff0](https://godoc.org/github.com/klauspost/compress/huff0) en/decoder. Experimental for now, API may change. -* Mar 4, 2018: Added [FSE Entropy](https://godoc.org/github.com/klauspost/compress/fse) en/decoder. Experimental for now, API may change. -* Nov 3, 2017: Add compression [Estimate](https://godoc.org/github.com/klauspost/compress#Estimate) function. -* May 28, 2017: Reduce allocations when resetting decoder. -* Apr 02, 2017: Change back to official crc32, since changes were merged in Go 1.7. -* Jan 14, 2017: Reduce stack pressure due to array copies. See [Issue #18625](https://github.com/golang/go/issues/18625). -* Oct 25, 2016: Level 2-4 have been rewritten and now offers significantly better performance than before. -* Oct 20, 2016: Port zlib changes from Go 1.7 to fix zlib writer issue. Please update. -* Oct 16, 2016: Go 1.7 changes merged. Apples to apples this package is a few percent faster, but has a significantly better balance between speed and compression per level. -* Mar 24, 2016: Always attempt Huffman encoding on level 4-7. This improves base 64 encoded data compression. -* Mar 24, 2016: Small speedup for level 1-3. -* Feb 19, 2016: Faster bit writer, level -2 is 15% faster, level 1 is 4% faster. -* Feb 19, 2016: Handle small payloads faster in level 1-3. -* Feb 19, 2016: Added faster level 2 + 3 compression modes. -* Feb 19, 2016: [Rebalanced compression levels](https://blog.klauspost.com/rebalancing-deflate-compression-levels/), so there is a more even progression in terms of compression. New default level is 5. -* Feb 14, 2016: Snappy: Merge upstream changes. -* Feb 14, 2016: Snappy: Fix aggressive skipping. -* Feb 14, 2016: Snappy: Update benchmark. -* Feb 13, 2016: Deflate: Fixed assembler problem that could lead to sub-optimal compression. -* Feb 12, 2016: Snappy: Added AMD64 SSE 4.2 optimizations to matching, which makes easy to compress material run faster. Typical speedup is around 25%. -* Feb 9, 2016: Added Snappy package fork. This version is 5-7% faster, much more on hard to compress content. -* Jan 30, 2016: Optimize level 1 to 3 by not considering static dictionary or storing uncompressed. ~4-5% speedup. -* Jan 16, 2016: Optimization on deflate level 1,2,3 compression. -* Jan 8 2016: Merge [CL 18317](https://go-review.googlesource.com/#/c/18317): fix reading, writing of zip64 archives. -* Dec 8 2015: Make level 1 and -2 deterministic even if write size differs. -* Dec 8 2015: Split encoding functions, so hashing and matching can potentially be inlined. 1-3% faster on AMD64. 5% faster on other platforms. -* Dec 8 2015: Fixed rare [one byte out-of bounds read](https://github.com/klauspost/compress/issues/20). Please update! -* Nov 23 2015: Optimization on token writer. ~2-4% faster. Contributed by [@dsnet](https://github.com/dsnet). -* Nov 20 2015: Small optimization to bit writer on 64 bit systems. -* Nov 17 2015: Fixed out-of-bound errors if the underlying Writer returned an error. See [#15](https://github.com/klauspost/compress/issues/15). -* Nov 12 2015: Added [io.WriterTo](https://golang.org/pkg/io/#WriterTo) support to gzip/inflate. -* Nov 11 2015: Merged [CL 16669](https://go-review.googlesource.com/#/c/16669/4): archive/zip: enable overriding (de)compressors per file -* Oct 15 2015: Added skipping on uncompressible data. Random data speed up >5x. - -
- -# deflate usage - -The packages are drop-in replacements for standard libraries. Simply replace the import path to use them: - -| old import | new import | Documentation -|--------------------|-----------------------------------------|--------------------| -| `compress/gzip` | `github.com/klauspost/compress/gzip` | [gzip](https://pkg.go.dev/github.com/klauspost/compress/gzip?tab=doc) -| `compress/zlib` | `github.com/klauspost/compress/zlib` | [zlib](https://pkg.go.dev/github.com/klauspost/compress/zlib?tab=doc) -| `archive/zip` | `github.com/klauspost/compress/zip` | [zip](https://pkg.go.dev/github.com/klauspost/compress/zip?tab=doc) -| `compress/flate` | `github.com/klauspost/compress/flate` | [flate](https://pkg.go.dev/github.com/klauspost/compress/flate?tab=doc) - -* Optimized [deflate](https://godoc.org/github.com/klauspost/compress/flate) packages which can be used as a dropin replacement for [gzip](https://godoc.org/github.com/klauspost/compress/gzip), [zip](https://godoc.org/github.com/klauspost/compress/zip) and [zlib](https://godoc.org/github.com/klauspost/compress/zlib). - -You may also be interested in [pgzip](https://github.com/klauspost/pgzip), which is a drop in replacement for gzip, which support multithreaded compression on big files and the optimized [crc32](https://github.com/klauspost/crc32) package used by these packages. - -The packages contains the same as the standard library, so you can use the godoc for that: [gzip](http://golang.org/pkg/compress/gzip/), [zip](http://golang.org/pkg/archive/zip/), [zlib](http://golang.org/pkg/compress/zlib/), [flate](http://golang.org/pkg/compress/flate/). - -Currently there is only minor speedup on decompression (mostly CRC32 calculation). - -Memory usage is typically 1MB for a Writer. stdlib is in the same range. -If you expect to have a lot of concurrently allocated Writers consider using -the stateless compress described below. - -For compression performance, see: [this spreadsheet](https://docs.google.com/spreadsheets/d/1nuNE2nPfuINCZJRMt6wFWhKpToF95I47XjSsc-1rbPQ/edit?usp=sharing). - -To disable all assembly add `-tags=noasm`. This works across all packages. - -# Stateless compression - -This package offers stateless compression as a special option for gzip/deflate. -It will do compression but without maintaining any state between Write calls. - -This means there will be no memory kept between Write calls, but compression and speed will be suboptimal. - -This is only relevant in cases where you expect to run many thousands of compressors concurrently, -but with very little activity. This is *not* intended for regular web servers serving individual requests. - -Because of this, the size of actual Write calls will affect output size. - -In gzip, specify level `-3` / `gzip.StatelessCompression` to enable. - -For direct deflate use, NewStatelessWriter and StatelessDeflate are available. See [documentation](https://godoc.org/github.com/klauspost/compress/flate#NewStatelessWriter) - -A `bufio.Writer` can of course be used to control write sizes. For example, to use a 4KB buffer: - -```go - // replace 'ioutil.Discard' with your output. - gzw, err := gzip.NewWriterLevel(ioutil.Discard, gzip.StatelessCompression) - if err != nil { - return err - } - defer gzw.Close() - - w := bufio.NewWriterSize(gzw, 4096) - defer w.Flush() - - // Write to 'w' -``` - -This will only use up to 4KB in memory when the writer is idle. - -Compression is almost always worse than the fastest compression level -and each write will allocate (a little) memory. - -# Performance Update 2018 - -It has been a while since we have been looking at the speed of this package compared to the standard library, so I thought I would re-do my tests and give some overall recommendations based on the current state. All benchmarks have been performed with Go 1.10 on my Desktop Intel(R) Core(TM) i7-2600 CPU @3.40GHz. Since I last ran the tests, I have gotten more RAM, which means tests with big files are no longer limited by my SSD. - -The raw results are in my [updated spreadsheet](https://docs.google.com/spreadsheets/d/1nuNE2nPfuINCZJRMt6wFWhKpToF95I47XjSsc-1rbPQ/edit?usp=sharing). Due to cgo changes and upstream updates i could not get the cgo version of gzip to compile. Instead I included the [zstd](https://github.com/datadog/zstd) cgo implementation. If I get cgo gzip to work again, I might replace the results in the sheet. - -The columns to take note of are: *MB/s* - the throughput. *Reduction* - the data size reduction in percent of the original. *Rel Speed* relative speed compared to the standard library at the same level. *Smaller* - how many percent smaller is the compressed output compared to stdlib. Negative means the output was bigger. *Loss* means the loss (or gain) in compression as a percentage difference of the input. - -The `gzstd` (standard library gzip) and `gzkp` (this package gzip) only uses one CPU core. [`pgzip`](https://github.com/klauspost/pgzip), [`bgzf`](https://github.com/biogo/hts/tree/master/bgzf) uses all 4 cores. [`zstd`](https://github.com/DataDog/zstd) uses one core, and is a beast (but not Go, yet). - - -## Overall differences. - -There appears to be a roughly 5-10% speed advantage over the standard library when comparing at similar compression levels. - -The biggest difference you will see is the result of [re-balancing](https://blog.klauspost.com/rebalancing-deflate-compression-levels/) the compression levels. I wanted by library to give a smoother transition between the compression levels than the standard library. - -This package attempts to provide a more smooth transition, where "1" is taking a lot of shortcuts, "5" is the reasonable trade-off and "9" is the "give me the best compression", and the values in between gives something reasonable in between. The standard library has big differences in levels 1-4, but levels 5-9 having no significant gains - often spending a lot more time than can be justified by the achieved compression. - -There are links to all the test data in the [spreadsheet](https://docs.google.com/spreadsheets/d/1nuNE2nPfuINCZJRMt6wFWhKpToF95I47XjSsc-1rbPQ/edit?usp=sharing) in the top left field on each tab. - -## Web Content - -This test set aims to emulate typical use in a web server. The test-set is 4GB data in 53k files, and is a mixture of (mostly) HTML, JS, CSS. - -Since level 1 and 9 are close to being the same code, they are quite close. But looking at the levels in-between the differences are quite big. - -Looking at level 6, this package is 88% faster, but will output about 6% more data. For a web server, this means you can serve 88% more data, but have to pay for 6% more bandwidth. You can draw your own conclusions on what would be the most expensive for your case. - -## Object files - -This test is for typical data files stored on a server. In this case it is a collection of Go precompiled objects. They are very compressible. - -The picture is similar to the web content, but with small differences since this is very compressible. Levels 2-3 offer good speed, but is sacrificing quite a bit of compression. - -The standard library seems suboptimal on level 3 and 4 - offering both worse compression and speed than level 6 & 7 of this package respectively. - -## Highly Compressible File - -This is a JSON file with very high redundancy. The reduction starts at 95% on level 1, so in real life terms we are dealing with something like a highly redundant stream of data, etc. - -It is definitely visible that we are dealing with specialized content here, so the results are very scattered. This package does not do very well at levels 1-4, but picks up significantly at level 5 and levels 7 and 8 offering great speed for the achieved compression. - -So if you know you content is extremely compressible you might want to go slightly higher than the defaults. The standard library has a huge gap between levels 3 and 4 in terms of speed (2.75x slowdown), so it offers little "middle ground". - -## Medium-High Compressible - -This is a pretty common test corpus: [enwik9](http://mattmahoney.net/dc/textdata.html). It contains the first 10^9 bytes of the English Wikipedia dump on Mar. 3, 2006. This is a very good test of typical text based compression and more data heavy streams. - -We see a similar picture here as in "Web Content". On equal levels some compression is sacrificed for more speed. Level 5 seems to be the best trade-off between speed and size, beating stdlib level 3 in both. - -## Medium Compressible - -I will combine two test sets, one [10GB file set](http://mattmahoney.net/dc/10gb.html) and a VM disk image (~8GB). Both contain different data types and represent a typical backup scenario. - -The most notable thing is how quickly the standard library drops to very low compression speeds around level 5-6 without any big gains in compression. Since this type of data is fairly common, this does not seem like good behavior. - - -## Un-compressible Content - -This is mainly a test of how good the algorithms are at detecting un-compressible input. The standard library only offers this feature with very conservative settings at level 1. Obviously there is no reason for the algorithms to try to compress input that cannot be compressed. The only downside is that it might skip some compressible data on false detections. - - -## Huffman only compression - -This compression library adds a special compression level, named `HuffmanOnly`, which allows near linear time compression. This is done by completely disabling matching of previous data, and only reduce the number of bits to represent each character. - -This means that often used characters, like 'e' and ' ' (space) in text use the fewest bits to represent, and rare characters like '¤' takes more bits to represent. For more information see [wikipedia](https://en.wikipedia.org/wiki/Huffman_coding) or this nice [video](https://youtu.be/ZdooBTdW5bM). - -Since this type of compression has much less variance, the compression speed is mostly unaffected by the input data, and is usually more than *180MB/s* for a single core. - -The downside is that the compression ratio is usually considerably worse than even the fastest conventional compression. The compression ratio can never be better than 8:1 (12.5%). - -The linear time compression can be used as a "better than nothing" mode, where you cannot risk the encoder to slow down on some content. For comparison, the size of the "Twain" text is *233460 bytes* (+29% vs. level 1) and encode speed is 144MB/s (4.5x level 1). So in this case you trade a 30% size increase for a 4 times speedup. - -For more information see my blog post on [Fast Linear Time Compression](http://blog.klauspost.com/constant-time-gzipzip-compression/). - -This is implemented on Go 1.7 as "Huffman Only" mode, though not exposed for gzip. - -# Other packages - -Here are other packages of good quality and pure Go (no cgo wrappers or autoconverted code): - -* [github.com/pierrec/lz4](https://github.com/pierrec/lz4) - strong multithreaded LZ4 compression. -* [github.com/cosnicolaou/pbzip2](https://github.com/cosnicolaou/pbzip2) - multithreaded bzip2 decompression. -* [github.com/dsnet/compress](https://github.com/dsnet/compress) - brotli decompression, bzip2 writer. -* [github.com/ronanh/intcomp](https://github.com/ronanh/intcomp) - Integer compression. -* [github.com/spenczar/fpc](https://github.com/spenczar/fpc) - Float compression. -* [github.com/minio/zipindex](https://github.com/minio/zipindex) - External ZIP directory index. -* [github.com/ybirader/pzip](https://github.com/ybirader/pzip) - Fast concurrent zip archiver and extractor. - -# license - -This code is licensed under the same conditions as the original Go code. See LICENSE file. diff --git a/vendor/github.com/klauspost/compress/SECURITY.md b/vendor/github.com/klauspost/compress/SECURITY.md deleted file mode 100644 index ca6685e2b7..0000000000 --- a/vendor/github.com/klauspost/compress/SECURITY.md +++ /dev/null @@ -1,25 +0,0 @@ -# Security Policy - -## Supported Versions - -Security updates are applied only to the latest release. - -## Vulnerability Definition - -A security vulnerability is a bug that with certain input triggers a crash or an infinite loop. Most calls will have varying execution time and only in rare cases will slow operation be considered a security vulnerability. - -Corrupted output generally is not considered a security vulnerability, unless independent operations are able to affect each other. Note that not all functionality is re-entrant and safe to use concurrently. - -Out-of-memory crashes only applies if the en/decoder uses an abnormal amount of memory, with appropriate options applied, to limit maximum window size, concurrency, etc. However, if you are in doubt you are welcome to file a security issue. - -It is assumed that all callers are trusted, meaning internal data exposed through reflection or inspection of returned data structures is not considered a vulnerability. - -Vulnerabilities resulting from compiler/assembler errors should be reported upstream. Depending on the severity this package may or may not implement a workaround. - -## Reporting a Vulnerability - -If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. - -Please disclose it at [security advisory](https://github.com/klauspost/compress/security/advisories/new). If possible please provide a minimal reproducer. If the issue only applies to a single platform, it would be helpful to provide access to that. - -This project is maintained by a team of volunteers on a reasonable-effort basis. As such, vulnerabilities will be disclosed in a best effort base. diff --git a/vendor/github.com/klauspost/compress/compressible.go b/vendor/github.com/klauspost/compress/compressible.go deleted file mode 100644 index ea5a692d51..0000000000 --- a/vendor/github.com/klauspost/compress/compressible.go +++ /dev/null @@ -1,85 +0,0 @@ -package compress - -import "math" - -// Estimate returns a normalized compressibility estimate of block b. -// Values close to zero are likely uncompressible. -// Values above 0.1 are likely to be compressible. -// Values above 0.5 are very compressible. -// Very small lengths will return 0. -func Estimate(b []byte) float64 { - if len(b) < 16 { - return 0 - } - - // Correctly predicted order 1 - hits := 0 - lastMatch := false - var o1 [256]byte - var hist [256]int - c1 := byte(0) - for _, c := range b { - if c == o1[c1] { - // We only count a hit if there was two correct predictions in a row. - if lastMatch { - hits++ - } - lastMatch = true - } else { - lastMatch = false - } - o1[c1] = c - c1 = c - hist[c]++ - } - - // Use x^0.6 to give better spread - prediction := math.Pow(float64(hits)/float64(len(b)), 0.6) - - // Calculate histogram distribution - variance := float64(0) - avg := float64(len(b)) / 256 - - for _, v := range hist { - Δ := float64(v) - avg - variance += Δ * Δ - } - - stddev := math.Sqrt(float64(variance)) / float64(len(b)) - exp := math.Sqrt(1 / float64(len(b))) - - // Subtract expected stddev - stddev -= exp - if stddev < 0 { - stddev = 0 - } - stddev *= 1 + exp - - // Use x^0.4 to give better spread - entropy := math.Pow(stddev, 0.4) - - // 50/50 weight between prediction and histogram distribution - return math.Pow((prediction+entropy)/2, 0.9) -} - -// ShannonEntropyBits returns the number of bits minimum required to represent -// an entropy encoding of the input bytes. -// https://en.wiktionary.org/wiki/Shannon_entropy -func ShannonEntropyBits(b []byte) int { - if len(b) == 0 { - return 0 - } - var hist [256]int - for _, c := range b { - hist[c]++ - } - shannon := float64(0) - invTotal := 1.0 / float64(len(b)) - for _, v := range hist[:] { - if v > 0 { - n := float64(v) - shannon += math.Ceil(-math.Log2(n*invTotal) * n) - } - } - return int(math.Ceil(shannon)) -} diff --git a/vendor/github.com/klauspost/compress/fse/README.md b/vendor/github.com/klauspost/compress/fse/README.md deleted file mode 100644 index ea7324da67..0000000000 --- a/vendor/github.com/klauspost/compress/fse/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# Finite State Entropy - -This package provides Finite State Entropy encoding and decoding. - -Finite State Entropy (also referenced as [tANS](https://en.wikipedia.org/wiki/Asymmetric_numeral_systems#tANS)) -encoding provides a fast near-optimal symbol encoding/decoding -for byte blocks as implemented in [zstandard](https://github.com/facebook/zstd). - -This can be used for compressing input with a lot of similar input values to the smallest number of bytes. -This does not perform any multi-byte [dictionary coding](https://en.wikipedia.org/wiki/Dictionary_coder) as LZ coders, -but it can be used as a secondary step to compressors (like Snappy) that does not do entropy encoding. - -* [Godoc documentation](https://godoc.org/github.com/klauspost/compress/fse) - -## News - - * Feb 2018: First implementation released. Consider this beta software for now. - -# Usage - -This package provides a low level interface that allows to compress single independent blocks. - -Each block is separate, and there is no built in integrity checks. -This means that the caller should keep track of block sizes and also do checksums if needed. - -Compressing a block is done via the [`Compress`](https://godoc.org/github.com/klauspost/compress/fse#Compress) function. -You must provide input and will receive the output and maybe an error. - -These error values can be returned: - -| Error | Description | -|---------------------|-----------------------------------------------------------------------------| -| `` | Everything ok, output is returned | -| `ErrIncompressible` | Returned when input is judged to be too hard to compress | -| `ErrUseRLE` | Returned from the compressor when the input is a single byte value repeated | -| `(error)` | An internal error occurred. | - -As can be seen above there are errors that will be returned even under normal operation so it is important to handle these. - -To reduce allocations you can provide a [`Scratch`](https://godoc.org/github.com/klauspost/compress/fse#Scratch) object -that can be re-used for successive calls. Both compression and decompression accepts a `Scratch` object, and the same -object can be used for both. - -Be aware, that when re-using a `Scratch` object that the *output* buffer is also re-used, so if you are still using this -you must set the `Out` field in the scratch to nil. The same buffer is used for compression and decompression output. - -Decompressing is done by calling the [`Decompress`](https://godoc.org/github.com/klauspost/compress/fse#Decompress) function. -You must provide the output from the compression stage, at exactly the size you got back. If you receive an error back -your input was likely corrupted. - -It is important to note that a successful decoding does *not* mean your output matches your original input. -There are no integrity checks, so relying on errors from the decompressor does not assure your data is valid. - -For more detailed usage, see examples in the [godoc documentation](https://godoc.org/github.com/klauspost/compress/fse#pkg-examples). - -# Performance - -A lot of factors are affecting speed. Block sizes and compressibility of the material are primary factors. -All compression functions are currently only running on the calling goroutine so only one core will be used per block. - -The compressor is significantly faster if symbols are kept as small as possible. The highest byte value of the input -is used to reduce some of the processing, so if all your input is above byte value 64 for instance, it may be -beneficial to transpose all your input values down by 64. - -With moderate block sizes around 64k speed are typically 200MB/s per core for compression and -around 300MB/s decompression speed. - -The same hardware typically does Huffman (deflate) encoding at 125MB/s and decompression at 100MB/s. - -# Plans - -At one point, more internals will be exposed to facilitate more "expert" usage of the components. - -A streaming interface is also likely to be implemented. Likely compatible with [FSE stream format](https://github.com/Cyan4973/FiniteStateEntropy/blob/dev/programs/fileio.c#L261). - -# Contributing - -Contributions are always welcome. Be aware that adding public functions will require good justification and breaking -changes will likely not be accepted. If in doubt open an issue before writing the PR. \ No newline at end of file diff --git a/vendor/github.com/klauspost/compress/fse/bitreader.go b/vendor/github.com/klauspost/compress/fse/bitreader.go deleted file mode 100644 index f65eb3909c..0000000000 --- a/vendor/github.com/klauspost/compress/fse/bitreader.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2018 Klaus Post. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// Based on work Copyright (c) 2013, Yann Collet, released under BSD License. - -package fse - -import ( - "encoding/binary" - "errors" - "io" -) - -// bitReader reads a bitstream in reverse. -// The last set bit indicates the start of the stream and is used -// for aligning the input. -type bitReader struct { - in []byte - off uint // next byte to read is at in[off - 1] - value uint64 - bitsRead uint8 -} - -// init initializes and resets the bit reader. -func (b *bitReader) init(in []byte) error { - if len(in) < 1 { - return errors.New("corrupt stream: too short") - } - b.in = in - b.off = uint(len(in)) - // The highest bit of the last byte indicates where to start - v := in[len(in)-1] - if v == 0 { - return errors.New("corrupt stream, did not find end of stream") - } - b.bitsRead = 64 - b.value = 0 - if len(in) >= 8 { - b.fillFastStart() - } else { - b.fill() - b.fill() - } - b.bitsRead += 8 - uint8(highBits(uint32(v))) - return nil -} - -// getBits will return n bits. n can be 0. -func (b *bitReader) getBits(n uint8) uint16 { - if n == 0 || b.bitsRead >= 64 { - return 0 - } - return b.getBitsFast(n) -} - -// getBitsFast requires that at least one bit is requested every time. -// There are no checks if the buffer is filled. -func (b *bitReader) getBitsFast(n uint8) uint16 { - const regMask = 64 - 1 - v := uint16((b.value << (b.bitsRead & regMask)) >> ((regMask + 1 - n) & regMask)) - b.bitsRead += n - return v -} - -// fillFast() will make sure at least 32 bits are available. -// There must be at least 4 bytes available. -func (b *bitReader) fillFast() { - if b.bitsRead < 32 { - return - } - // 2 bounds checks. - v := b.in[b.off-4:] - v = v[:4] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - b.value = (b.value << 32) | uint64(low) - b.bitsRead -= 32 - b.off -= 4 -} - -// fill() will make sure at least 32 bits are available. -func (b *bitReader) fill() { - if b.bitsRead < 32 { - return - } - if b.off > 4 { - v := b.in[b.off-4:] - v = v[:4] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - b.value = (b.value << 32) | uint64(low) - b.bitsRead -= 32 - b.off -= 4 - return - } - for b.off > 0 { - b.value = (b.value << 8) | uint64(b.in[b.off-1]) - b.bitsRead -= 8 - b.off-- - } -} - -// fillFastStart() assumes the bitreader is empty and there is at least 8 bytes to read. -func (b *bitReader) fillFastStart() { - // Do single re-slice to avoid bounds checks. - b.value = binary.LittleEndian.Uint64(b.in[b.off-8:]) - b.bitsRead = 0 - b.off -= 8 -} - -// finished returns true if all bits have been read from the bit stream. -func (b *bitReader) finished() bool { - return b.bitsRead >= 64 && b.off == 0 -} - -// close the bitstream and returns an error if out-of-buffer reads occurred. -func (b *bitReader) close() error { - // Release reference. - b.in = nil - if b.bitsRead > 64 { - return io.ErrUnexpectedEOF - } - return nil -} diff --git a/vendor/github.com/klauspost/compress/fse/bitwriter.go b/vendor/github.com/klauspost/compress/fse/bitwriter.go deleted file mode 100644 index e82fa3bb7b..0000000000 --- a/vendor/github.com/klauspost/compress/fse/bitwriter.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2018 Klaus Post. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// Based on work Copyright (c) 2013, Yann Collet, released under BSD License. - -package fse - -import "fmt" - -// bitWriter will write bits. -// First bit will be LSB of the first byte of output. -type bitWriter struct { - bitContainer uint64 - nBits uint8 - out []byte -} - -// bitMask16 is bitmasks. Has extra to avoid bounds check. -var bitMask16 = [32]uint16{ - 0, 1, 3, 7, 0xF, 0x1F, - 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, - 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0xFFFF, - 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, - 0xFFFF, 0xFFFF} /* up to 16 bits */ - -// addBits16NC will add up to 16 bits. -// It will not check if there is space for them, -// so the caller must ensure that it has flushed recently. -func (b *bitWriter) addBits16NC(value uint16, bits uint8) { - b.bitContainer |= uint64(value&bitMask16[bits&31]) << (b.nBits & 63) - b.nBits += bits -} - -// addBits16Clean will add up to 16 bits. value may not contain more set bits than indicated. -// It will not check if there is space for them, so the caller must ensure that it has flushed recently. -func (b *bitWriter) addBits16Clean(value uint16, bits uint8) { - b.bitContainer |= uint64(value) << (b.nBits & 63) - b.nBits += bits -} - -// addBits16ZeroNC will add up to 16 bits. -// It will not check if there is space for them, -// so the caller must ensure that it has flushed recently. -// This is fastest if bits can be zero. -func (b *bitWriter) addBits16ZeroNC(value uint16, bits uint8) { - if bits == 0 { - return - } - value <<= (16 - bits) & 15 - value >>= (16 - bits) & 15 - b.bitContainer |= uint64(value) << (b.nBits & 63) - b.nBits += bits -} - -// flush will flush all pending full bytes. -// There will be at least 56 bits available for writing when this has been called. -// Using flush32 is faster, but leaves less space for writing. -func (b *bitWriter) flush() { - v := b.nBits >> 3 - switch v { - case 0: - case 1: - b.out = append(b.out, - byte(b.bitContainer), - ) - case 2: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - ) - case 3: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - ) - case 4: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - ) - case 5: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - ) - case 6: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - byte(b.bitContainer>>40), - ) - case 7: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - byte(b.bitContainer>>40), - byte(b.bitContainer>>48), - ) - case 8: - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24), - byte(b.bitContainer>>32), - byte(b.bitContainer>>40), - byte(b.bitContainer>>48), - byte(b.bitContainer>>56), - ) - default: - panic(fmt.Errorf("bits (%d) > 64", b.nBits)) - } - b.bitContainer >>= v << 3 - b.nBits &= 7 -} - -// flush32 will flush out, so there are at least 32 bits available for writing. -func (b *bitWriter) flush32() { - if b.nBits < 32 { - return - } - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24)) - b.nBits -= 32 - b.bitContainer >>= 32 -} - -// flushAlign will flush remaining full bytes and align to next byte boundary. -func (b *bitWriter) flushAlign() { - nbBytes := (b.nBits + 7) >> 3 - for i := uint8(0); i < nbBytes; i++ { - b.out = append(b.out, byte(b.bitContainer>>(i*8))) - } - b.nBits = 0 - b.bitContainer = 0 -} - -// close will write the alignment bit and write the final byte(s) -// to the output. -func (b *bitWriter) close() { - // End mark - b.addBits16Clean(1, 1) - // flush until next byte. - b.flushAlign() -} - -// reset and continue writing by appending to out. -func (b *bitWriter) reset(out []byte) { - b.bitContainer = 0 - b.nBits = 0 - b.out = out -} diff --git a/vendor/github.com/klauspost/compress/fse/bytereader.go b/vendor/github.com/klauspost/compress/fse/bytereader.go deleted file mode 100644 index abade2d605..0000000000 --- a/vendor/github.com/klauspost/compress/fse/bytereader.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2018 Klaus Post. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// Based on work Copyright (c) 2013, Yann Collet, released under BSD License. - -package fse - -// byteReader provides a byte reader that reads -// little endian values from a byte stream. -// The input stream is manually advanced. -// The reader performs no bounds checks. -type byteReader struct { - b []byte - off int -} - -// init will initialize the reader and set the input. -func (b *byteReader) init(in []byte) { - b.b = in - b.off = 0 -} - -// advance the stream b n bytes. -func (b *byteReader) advance(n uint) { - b.off += int(n) -} - -// Uint32 returns a little endian uint32 starting at current offset. -func (b byteReader) Uint32() uint32 { - b2 := b.b[b.off:] - b2 = b2[:4] - v3 := uint32(b2[3]) - v2 := uint32(b2[2]) - v1 := uint32(b2[1]) - v0 := uint32(b2[0]) - return v0 | (v1 << 8) | (v2 << 16) | (v3 << 24) -} - -// unread returns the unread portion of the input. -func (b byteReader) unread() []byte { - return b.b[b.off:] -} - -// remain will return the number of bytes remaining. -func (b byteReader) remain() int { - return len(b.b) - b.off -} diff --git a/vendor/github.com/klauspost/compress/fse/compress.go b/vendor/github.com/klauspost/compress/fse/compress.go deleted file mode 100644 index 074018d8f9..0000000000 --- a/vendor/github.com/klauspost/compress/fse/compress.go +++ /dev/null @@ -1,683 +0,0 @@ -// Copyright 2018 Klaus Post. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// Based on work Copyright (c) 2013, Yann Collet, released under BSD License. - -package fse - -import ( - "errors" - "fmt" -) - -// Compress the input bytes. Input must be < 2GB. -// Provide a Scratch buffer to avoid memory allocations. -// Note that the output is also kept in the scratch buffer. -// If input is too hard to compress, ErrIncompressible is returned. -// If input is a single byte value repeated ErrUseRLE is returned. -func Compress(in []byte, s *Scratch) ([]byte, error) { - if len(in) <= 1 { - return nil, ErrIncompressible - } - if len(in) > (2<<30)-1 { - return nil, errors.New("input too big, must be < 2GB") - } - s, err := s.prepare(in) - if err != nil { - return nil, err - } - - // Create histogram, if none was provided. - maxCount := s.maxCount - if maxCount == 0 { - maxCount = s.countSimple(in) - } - // Reset for next run. - s.clearCount = true - s.maxCount = 0 - if maxCount == len(in) { - // One symbol, use RLE - return nil, ErrUseRLE - } - if maxCount == 1 || maxCount < (len(in)>>7) { - // Each symbol present maximum once or too well distributed. - return nil, ErrIncompressible - } - s.optimalTableLog() - err = s.normalizeCount() - if err != nil { - return nil, err - } - err = s.writeCount() - if err != nil { - return nil, err - } - - if false { - err = s.validateNorm() - if err != nil { - return nil, err - } - } - - err = s.buildCTable() - if err != nil { - return nil, err - } - err = s.compress(in) - if err != nil { - return nil, err - } - s.Out = s.bw.out - // Check if we compressed. - if len(s.Out) >= len(in) { - return nil, ErrIncompressible - } - return s.Out, nil -} - -// cState contains the compression state of a stream. -type cState struct { - bw *bitWriter - stateTable []uint16 - state uint16 -} - -// init will initialize the compression state to the first symbol of the stream. -func (c *cState) init(bw *bitWriter, ct *cTable, tableLog uint8, first symbolTransform) { - c.bw = bw - c.stateTable = ct.stateTable - - nbBitsOut := (first.deltaNbBits + (1 << 15)) >> 16 - im := int32((nbBitsOut << 16) - first.deltaNbBits) - lu := (im >> nbBitsOut) + first.deltaFindState - c.state = c.stateTable[lu] -} - -// encode the output symbol provided and write it to the bitstream. -func (c *cState) encode(symbolTT symbolTransform) { - nbBitsOut := (uint32(c.state) + symbolTT.deltaNbBits) >> 16 - dstState := int32(c.state>>(nbBitsOut&15)) + symbolTT.deltaFindState - c.bw.addBits16NC(c.state, uint8(nbBitsOut)) - c.state = c.stateTable[dstState] -} - -// encode the output symbol provided and write it to the bitstream. -func (c *cState) encodeZero(symbolTT symbolTransform) { - nbBitsOut := (uint32(c.state) + symbolTT.deltaNbBits) >> 16 - dstState := int32(c.state>>(nbBitsOut&15)) + symbolTT.deltaFindState - c.bw.addBits16ZeroNC(c.state, uint8(nbBitsOut)) - c.state = c.stateTable[dstState] -} - -// flush will write the tablelog to the output and flush the remaining full bytes. -func (c *cState) flush(tableLog uint8) { - c.bw.flush32() - c.bw.addBits16NC(c.state, tableLog) - c.bw.flush() -} - -// compress is the main compression loop that will encode the input from the last byte to the first. -func (s *Scratch) compress(src []byte) error { - if len(src) <= 2 { - return errors.New("compress: src too small") - } - tt := s.ct.symbolTT[:256] - s.bw.reset(s.Out) - - // Our two states each encodes every second byte. - // Last byte encoded (first byte decoded) will always be encoded by c1. - var c1, c2 cState - - // Encode so remaining size is divisible by 4. - ip := len(src) - if ip&1 == 1 { - c1.init(&s.bw, &s.ct, s.actualTableLog, tt[src[ip-1]]) - c2.init(&s.bw, &s.ct, s.actualTableLog, tt[src[ip-2]]) - c1.encodeZero(tt[src[ip-3]]) - ip -= 3 - } else { - c2.init(&s.bw, &s.ct, s.actualTableLog, tt[src[ip-1]]) - c1.init(&s.bw, &s.ct, s.actualTableLog, tt[src[ip-2]]) - ip -= 2 - } - if ip&2 != 0 { - c2.encodeZero(tt[src[ip-1]]) - c1.encodeZero(tt[src[ip-2]]) - ip -= 2 - } - src = src[:ip] - - // Main compression loop. - switch { - case !s.zeroBits && s.actualTableLog <= 8: - // We can encode 4 symbols without requiring a flush. - // We do not need to check if any output is 0 bits. - for ; len(src) >= 4; src = src[:len(src)-4] { - s.bw.flush32() - v3, v2, v1, v0 := src[len(src)-4], src[len(src)-3], src[len(src)-2], src[len(src)-1] - c2.encode(tt[v0]) - c1.encode(tt[v1]) - c2.encode(tt[v2]) - c1.encode(tt[v3]) - } - case !s.zeroBits: - // We do not need to check if any output is 0 bits. - for ; len(src) >= 4; src = src[:len(src)-4] { - s.bw.flush32() - v3, v2, v1, v0 := src[len(src)-4], src[len(src)-3], src[len(src)-2], src[len(src)-1] - c2.encode(tt[v0]) - c1.encode(tt[v1]) - s.bw.flush32() - c2.encode(tt[v2]) - c1.encode(tt[v3]) - } - case s.actualTableLog <= 8: - // We can encode 4 symbols without requiring a flush - for ; len(src) >= 4; src = src[:len(src)-4] { - s.bw.flush32() - v3, v2, v1, v0 := src[len(src)-4], src[len(src)-3], src[len(src)-2], src[len(src)-1] - c2.encodeZero(tt[v0]) - c1.encodeZero(tt[v1]) - c2.encodeZero(tt[v2]) - c1.encodeZero(tt[v3]) - } - default: - for ; len(src) >= 4; src = src[:len(src)-4] { - s.bw.flush32() - v3, v2, v1, v0 := src[len(src)-4], src[len(src)-3], src[len(src)-2], src[len(src)-1] - c2.encodeZero(tt[v0]) - c1.encodeZero(tt[v1]) - s.bw.flush32() - c2.encodeZero(tt[v2]) - c1.encodeZero(tt[v3]) - } - } - - // Flush final state. - // Used to initialize state when decoding. - c2.flush(s.actualTableLog) - c1.flush(s.actualTableLog) - - s.bw.close() - return nil -} - -// writeCount will write the normalized histogram count to header. -// This is read back by readNCount. -func (s *Scratch) writeCount() error { - var ( - tableLog = s.actualTableLog - tableSize = 1 << tableLog - previous0 bool - charnum uint16 - - maxHeaderSize = ((int(s.symbolLen)*int(tableLog) + 4 + 2) >> 3) + 3 - - // Write Table Size - bitStream = uint32(tableLog - minTablelog) - bitCount = uint(4) - remaining = int16(tableSize + 1) /* +1 for extra accuracy */ - threshold = int16(tableSize) - nbBits = uint(tableLog + 1) - ) - if cap(s.Out) < maxHeaderSize { - s.Out = make([]byte, 0, s.br.remain()+maxHeaderSize) - } - outP := uint(0) - out := s.Out[:maxHeaderSize] - - // stops at 1 - for remaining > 1 { - if previous0 { - start := charnum - for s.norm[charnum] == 0 { - charnum++ - } - for charnum >= start+24 { - start += 24 - bitStream += uint32(0xFFFF) << bitCount - out[outP] = byte(bitStream) - out[outP+1] = byte(bitStream >> 8) - outP += 2 - bitStream >>= 16 - } - for charnum >= start+3 { - start += 3 - bitStream += 3 << bitCount - bitCount += 2 - } - bitStream += uint32(charnum-start) << bitCount - bitCount += 2 - if bitCount > 16 { - out[outP] = byte(bitStream) - out[outP+1] = byte(bitStream >> 8) - outP += 2 - bitStream >>= 16 - bitCount -= 16 - } - } - - count := s.norm[charnum] - charnum++ - max := (2*threshold - 1) - remaining - if count < 0 { - remaining += count - } else { - remaining -= count - } - count++ // +1 for extra accuracy - if count >= threshold { - count += max // [0..max[ [max..threshold[ (...) [threshold+max 2*threshold[ - } - bitStream += uint32(count) << bitCount - bitCount += nbBits - if count < max { - bitCount-- - } - - previous0 = count == 1 - if remaining < 1 { - return errors.New("internal error: remaining<1") - } - for remaining < threshold { - nbBits-- - threshold >>= 1 - } - - if bitCount > 16 { - out[outP] = byte(bitStream) - out[outP+1] = byte(bitStream >> 8) - outP += 2 - bitStream >>= 16 - bitCount -= 16 - } - } - - out[outP] = byte(bitStream) - out[outP+1] = byte(bitStream >> 8) - outP += (bitCount + 7) / 8 - - if charnum > s.symbolLen { - return errors.New("internal error: charnum > s.symbolLen") - } - s.Out = out[:outP] - return nil -} - -// symbolTransform contains the state transform for a symbol. -type symbolTransform struct { - deltaFindState int32 - deltaNbBits uint32 -} - -// String prints values as a human readable string. -func (s symbolTransform) String() string { - return fmt.Sprintf("dnbits: %08x, fs:%d", s.deltaNbBits, s.deltaFindState) -} - -// cTable contains tables used for compression. -type cTable struct { - tableSymbol []byte - stateTable []uint16 - symbolTT []symbolTransform -} - -// allocCtable will allocate tables needed for compression. -// If existing tables a re big enough, they are simply re-used. -func (s *Scratch) allocCtable() { - tableSize := 1 << s.actualTableLog - // get tableSymbol that is big enough. - if cap(s.ct.tableSymbol) < tableSize { - s.ct.tableSymbol = make([]byte, tableSize) - } - s.ct.tableSymbol = s.ct.tableSymbol[:tableSize] - - ctSize := tableSize - if cap(s.ct.stateTable) < ctSize { - s.ct.stateTable = make([]uint16, ctSize) - } - s.ct.stateTable = s.ct.stateTable[:ctSize] - - if cap(s.ct.symbolTT) < 256 { - s.ct.symbolTT = make([]symbolTransform, 256) - } - s.ct.symbolTT = s.ct.symbolTT[:256] -} - -// buildCTable will populate the compression table so it is ready to be used. -func (s *Scratch) buildCTable() error { - tableSize := uint32(1 << s.actualTableLog) - highThreshold := tableSize - 1 - var cumul [maxSymbolValue + 2]int16 - - s.allocCtable() - tableSymbol := s.ct.tableSymbol[:tableSize] - // symbol start positions - { - cumul[0] = 0 - for ui, v := range s.norm[:s.symbolLen-1] { - u := byte(ui) // one less than reference - if v == -1 { - // Low proba symbol - cumul[u+1] = cumul[u] + 1 - tableSymbol[highThreshold] = u - highThreshold-- - } else { - cumul[u+1] = cumul[u] + v - } - } - // Encode last symbol separately to avoid overflowing u - u := int(s.symbolLen - 1) - v := s.norm[s.symbolLen-1] - if v == -1 { - // Low proba symbol - cumul[u+1] = cumul[u] + 1 - tableSymbol[highThreshold] = byte(u) - highThreshold-- - } else { - cumul[u+1] = cumul[u] + v - } - if uint32(cumul[s.symbolLen]) != tableSize { - return fmt.Errorf("internal error: expected cumul[s.symbolLen] (%d) == tableSize (%d)", cumul[s.symbolLen], tableSize) - } - cumul[s.symbolLen] = int16(tableSize) + 1 - } - // Spread symbols - s.zeroBits = false - { - step := tableStep(tableSize) - tableMask := tableSize - 1 - var position uint32 - // if any symbol > largeLimit, we may have 0 bits output. - largeLimit := int16(1 << (s.actualTableLog - 1)) - for ui, v := range s.norm[:s.symbolLen] { - symbol := byte(ui) - if v > largeLimit { - s.zeroBits = true - } - for nbOccurrences := int16(0); nbOccurrences < v; nbOccurrences++ { - tableSymbol[position] = symbol - position = (position + step) & tableMask - for position > highThreshold { - position = (position + step) & tableMask - } /* Low proba area */ - } - } - - // Check if we have gone through all positions - if position != 0 { - return errors.New("position!=0") - } - } - - // Build table - table := s.ct.stateTable - { - tsi := int(tableSize) - for u, v := range tableSymbol { - // TableU16 : sorted by symbol order; gives next state value - table[cumul[v]] = uint16(tsi + u) - cumul[v]++ - } - } - - // Build Symbol Transformation Table - { - total := int16(0) - symbolTT := s.ct.symbolTT[:s.symbolLen] - tableLog := s.actualTableLog - tl := (uint32(tableLog) << 16) - (1 << tableLog) - for i, v := range s.norm[:s.symbolLen] { - switch v { - case 0: - case -1, 1: - symbolTT[i].deltaNbBits = tl - symbolTT[i].deltaFindState = int32(total - 1) - total++ - default: - maxBitsOut := uint32(tableLog) - highBits(uint32(v-1)) - minStatePlus := uint32(v) << maxBitsOut - symbolTT[i].deltaNbBits = (maxBitsOut << 16) - minStatePlus - symbolTT[i].deltaFindState = int32(total - v) - total += v - } - } - if total != int16(tableSize) { - return fmt.Errorf("total mismatch %d (got) != %d (want)", total, tableSize) - } - } - return nil -} - -// countSimple will create a simple histogram in s.count. -// Returns the biggest count. -// Does not update s.clearCount. -func (s *Scratch) countSimple(in []byte) (max int) { - for _, v := range in { - s.count[v]++ - } - m, symlen := uint32(0), s.symbolLen - for i, v := range s.count[:] { - if v == 0 { - continue - } - if v > m { - m = v - } - symlen = uint16(i) + 1 - } - s.symbolLen = symlen - return int(m) -} - -// minTableLog provides the minimum logSize to safely represent a distribution. -func (s *Scratch) minTableLog() uint8 { - minBitsSrc := highBits(uint32(s.br.remain()-1)) + 1 - minBitsSymbols := highBits(uint32(s.symbolLen-1)) + 2 - if minBitsSrc < minBitsSymbols { - return uint8(minBitsSrc) - } - return uint8(minBitsSymbols) -} - -// optimalTableLog calculates and sets the optimal tableLog in s.actualTableLog -func (s *Scratch) optimalTableLog() { - tableLog := s.TableLog - minBits := s.minTableLog() - maxBitsSrc := uint8(highBits(uint32(s.br.remain()-1))) - 2 - if maxBitsSrc < tableLog { - // Accuracy can be reduced - tableLog = maxBitsSrc - } - if minBits > tableLog { - tableLog = minBits - } - // Need a minimum to safely represent all symbol values - if tableLog < minTablelog { - tableLog = minTablelog - } - if tableLog > maxTableLog { - tableLog = maxTableLog - } - s.actualTableLog = tableLog -} - -var rtbTable = [...]uint32{0, 473195, 504333, 520860, 550000, 700000, 750000, 830000} - -// normalizeCount will normalize the count of the symbols so -// the total is equal to the table size. -func (s *Scratch) normalizeCount() error { - var ( - tableLog = s.actualTableLog - scale = 62 - uint64(tableLog) - step = (1 << 62) / uint64(s.br.remain()) - vStep = uint64(1) << (scale - 20) - stillToDistribute = int16(1 << tableLog) - largest int - largestP int16 - lowThreshold = (uint32)(s.br.remain() >> tableLog) - ) - - for i, cnt := range s.count[:s.symbolLen] { - // already handled - // if (count[s] == s.length) return 0; /* rle special case */ - - if cnt == 0 { - s.norm[i] = 0 - continue - } - if cnt <= lowThreshold { - s.norm[i] = -1 - stillToDistribute-- - } else { - proba := (int16)((uint64(cnt) * step) >> scale) - if proba < 8 { - restToBeat := vStep * uint64(rtbTable[proba]) - v := uint64(cnt)*step - (uint64(proba) << scale) - if v > restToBeat { - proba++ - } - } - if proba > largestP { - largestP = proba - largest = i - } - s.norm[i] = proba - stillToDistribute -= proba - } - } - - if -stillToDistribute >= (s.norm[largest] >> 1) { - // corner case, need another normalization method - return s.normalizeCount2() - } - s.norm[largest] += stillToDistribute - return nil -} - -// Secondary normalization method. -// To be used when primary method fails. -func (s *Scratch) normalizeCount2() error { - const notYetAssigned = -2 - var ( - distributed uint32 - total = uint32(s.br.remain()) - tableLog = s.actualTableLog - lowThreshold = total >> tableLog - lowOne = (total * 3) >> (tableLog + 1) - ) - for i, cnt := range s.count[:s.symbolLen] { - if cnt == 0 { - s.norm[i] = 0 - continue - } - if cnt <= lowThreshold { - s.norm[i] = -1 - distributed++ - total -= cnt - continue - } - if cnt <= lowOne { - s.norm[i] = 1 - distributed++ - total -= cnt - continue - } - s.norm[i] = notYetAssigned - } - toDistribute := (1 << tableLog) - distributed - - if (total / toDistribute) > lowOne { - // risk of rounding to zero - lowOne = (total * 3) / (toDistribute * 2) - for i, cnt := range s.count[:s.symbolLen] { - if (s.norm[i] == notYetAssigned) && (cnt <= lowOne) { - s.norm[i] = 1 - distributed++ - total -= cnt - continue - } - } - toDistribute = (1 << tableLog) - distributed - } - if distributed == uint32(s.symbolLen)+1 { - // all values are pretty poor; - // probably incompressible data (should have already been detected); - // find max, then give all remaining points to max - var maxV int - var maxC uint32 - for i, cnt := range s.count[:s.symbolLen] { - if cnt > maxC { - maxV = i - maxC = cnt - } - } - s.norm[maxV] += int16(toDistribute) - return nil - } - - if total == 0 { - // all of the symbols were low enough for the lowOne or lowThreshold - for i := uint32(0); toDistribute > 0; i = (i + 1) % (uint32(s.symbolLen)) { - if s.norm[i] > 0 { - toDistribute-- - s.norm[i]++ - } - } - return nil - } - - var ( - vStepLog = 62 - uint64(tableLog) - mid = uint64((1 << (vStepLog - 1)) - 1) - rStep = (((1 << vStepLog) * uint64(toDistribute)) + mid) / uint64(total) // scale on remaining - tmpTotal = mid - ) - for i, cnt := range s.count[:s.symbolLen] { - if s.norm[i] == notYetAssigned { - var ( - end = tmpTotal + uint64(cnt)*rStep - sStart = uint32(tmpTotal >> vStepLog) - sEnd = uint32(end >> vStepLog) - weight = sEnd - sStart - ) - if weight < 1 { - return errors.New("weight < 1") - } - s.norm[i] = int16(weight) - tmpTotal = end - } - } - return nil -} - -// validateNorm validates the normalized histogram table. -func (s *Scratch) validateNorm() (err error) { - var total int - for _, v := range s.norm[:s.symbolLen] { - if v >= 0 { - total += int(v) - } else { - total -= int(v) - } - } - defer func() { - if err == nil { - return - } - fmt.Printf("selected TableLog: %d, Symbol length: %d\n", s.actualTableLog, s.symbolLen) - for i, v := range s.norm[:s.symbolLen] { - fmt.Printf("%3d: %5d -> %4d \n", i, s.count[i], v) - } - }() - if total != (1 << s.actualTableLog) { - return fmt.Errorf("warning: Total == %d != %d", total, 1< tablelogAbsoluteMax { - return errors.New("tableLog too large") - } - bitStream >>= 4 - bitCount := uint(4) - - s.actualTableLog = uint8(nbBits) - remaining := int32((1 << nbBits) + 1) - threshold := int32(1 << nbBits) - gotTotal := int32(0) - nbBits++ - - for remaining > 1 { - if previous0 { - n0 := charnum - for (bitStream & 0xFFFF) == 0xFFFF { - n0 += 24 - if b.off < iend-5 { - b.advance(2) - bitStream = b.Uint32() >> bitCount - } else { - bitStream >>= 16 - bitCount += 16 - } - } - for (bitStream & 3) == 3 { - n0 += 3 - bitStream >>= 2 - bitCount += 2 - } - n0 += uint16(bitStream & 3) - bitCount += 2 - if n0 > maxSymbolValue { - return errors.New("maxSymbolValue too small") - } - for charnum < n0 { - s.norm[charnum&0xff] = 0 - charnum++ - } - - if b.off <= iend-7 || b.off+int(bitCount>>3) <= iend-4 { - b.advance(bitCount >> 3) - bitCount &= 7 - bitStream = b.Uint32() >> bitCount - } else { - bitStream >>= 2 - } - } - - max := (2*(threshold) - 1) - (remaining) - var count int32 - - if (int32(bitStream) & (threshold - 1)) < max { - count = int32(bitStream) & (threshold - 1) - bitCount += nbBits - 1 - } else { - count = int32(bitStream) & (2*threshold - 1) - if count >= threshold { - count -= max - } - bitCount += nbBits - } - - count-- // extra accuracy - if count < 0 { - // -1 means +1 - remaining += count - gotTotal -= count - } else { - remaining -= count - gotTotal += count - } - s.norm[charnum&0xff] = int16(count) - charnum++ - previous0 = count == 0 - for remaining < threshold { - nbBits-- - threshold >>= 1 - } - if b.off <= iend-7 || b.off+int(bitCount>>3) <= iend-4 { - b.advance(bitCount >> 3) - bitCount &= 7 - } else { - bitCount -= (uint)(8 * (len(b.b) - 4 - b.off)) - b.off = len(b.b) - 4 - } - bitStream = b.Uint32() >> (bitCount & 31) - } - s.symbolLen = charnum - - if s.symbolLen <= 1 { - return fmt.Errorf("symbolLen (%d) too small", s.symbolLen) - } - if s.symbolLen > maxSymbolValue+1 { - return fmt.Errorf("symbolLen (%d) too big", s.symbolLen) - } - if remaining != 1 { - return fmt.Errorf("corruption detected (remaining %d != 1)", remaining) - } - if bitCount > 32 { - return fmt.Errorf("corruption detected (bitCount %d > 32)", bitCount) - } - if gotTotal != 1<> 3) - return nil -} - -// decSymbol contains information about a state entry, -// Including the state offset base, the output symbol and -// the number of bits to read for the low part of the destination state. -type decSymbol struct { - newState uint16 - symbol uint8 - nbBits uint8 -} - -// allocDtable will allocate decoding tables if they are not big enough. -func (s *Scratch) allocDtable() { - tableSize := 1 << s.actualTableLog - if cap(s.decTable) < tableSize { - s.decTable = make([]decSymbol, tableSize) - } - s.decTable = s.decTable[:tableSize] - - if cap(s.ct.tableSymbol) < 256 { - s.ct.tableSymbol = make([]byte, 256) - } - s.ct.tableSymbol = s.ct.tableSymbol[:256] - - if cap(s.ct.stateTable) < 256 { - s.ct.stateTable = make([]uint16, 256) - } - s.ct.stateTable = s.ct.stateTable[:256] -} - -// buildDtable will build the decoding table. -func (s *Scratch) buildDtable() error { - tableSize := uint32(1 << s.actualTableLog) - highThreshold := tableSize - 1 - s.allocDtable() - symbolNext := s.ct.stateTable[:256] - - // Init, lay down lowprob symbols - s.zeroBits = false - { - largeLimit := int16(1 << (s.actualTableLog - 1)) - for i, v := range s.norm[:s.symbolLen] { - if v == -1 { - s.decTable[highThreshold].symbol = uint8(i) - highThreshold-- - symbolNext[i] = 1 - } else { - if v >= largeLimit { - s.zeroBits = true - } - symbolNext[i] = uint16(v) - } - } - } - // Spread symbols - { - tableMask := tableSize - 1 - step := tableStep(tableSize) - position := uint32(0) - for ss, v := range s.norm[:s.symbolLen] { - for i := 0; i < int(v); i++ { - s.decTable[position].symbol = uint8(ss) - position = (position + step) & tableMask - for position > highThreshold { - // lowprob area - position = (position + step) & tableMask - } - } - } - if position != 0 { - // position must reach all cells once, otherwise normalizedCounter is incorrect - return errors.New("corrupted input (position != 0)") - } - } - - // Build Decoding table - { - tableSize := uint16(1 << s.actualTableLog) - for u, v := range s.decTable { - symbol := v.symbol - nextState := symbolNext[symbol] - symbolNext[symbol] = nextState + 1 - nBits := s.actualTableLog - byte(highBits(uint32(nextState))) - s.decTable[u].nbBits = nBits - newState := (nextState << nBits) - tableSize - if newState >= tableSize { - return fmt.Errorf("newState (%d) outside table size (%d)", newState, tableSize) - } - if newState == uint16(u) && nBits == 0 { - // Seems weird that this is possible with nbits > 0. - return fmt.Errorf("newState (%d) == oldState (%d) and no bits", newState, u) - } - s.decTable[u].newState = newState - } - } - return nil -} - -// decompress will decompress the bitstream. -// If the buffer is over-read an error is returned. -func (s *Scratch) decompress() error { - br := &s.bits - if err := br.init(s.br.unread()); err != nil { - return err - } - - var s1, s2 decoder - // Initialize and decode first state and symbol. - s1.init(br, s.decTable, s.actualTableLog) - s2.init(br, s.decTable, s.actualTableLog) - - // Use temp table to avoid bound checks/append penalty. - var tmp = s.ct.tableSymbol[:256] - var off uint8 - - // Main part - if !s.zeroBits { - for br.off >= 8 { - br.fillFast() - tmp[off+0] = s1.nextFast() - tmp[off+1] = s2.nextFast() - br.fillFast() - tmp[off+2] = s1.nextFast() - tmp[off+3] = s2.nextFast() - off += 4 - // When off is 0, we have overflowed and should write. - if off == 0 { - s.Out = append(s.Out, tmp...) - if len(s.Out) >= s.DecompressLimit { - return fmt.Errorf("output size (%d) > DecompressLimit (%d)", len(s.Out), s.DecompressLimit) - } - } - } - } else { - for br.off >= 8 { - br.fillFast() - tmp[off+0] = s1.next() - tmp[off+1] = s2.next() - br.fillFast() - tmp[off+2] = s1.next() - tmp[off+3] = s2.next() - off += 4 - if off == 0 { - s.Out = append(s.Out, tmp...) - // When off is 0, we have overflowed and should write. - if len(s.Out) >= s.DecompressLimit { - return fmt.Errorf("output size (%d) > DecompressLimit (%d)", len(s.Out), s.DecompressLimit) - } - } - } - } - s.Out = append(s.Out, tmp[:off]...) - - // Final bits, a bit more expensive check - for { - if s1.finished() { - s.Out = append(s.Out, s1.final(), s2.final()) - break - } - br.fill() - s.Out = append(s.Out, s1.next()) - if s2.finished() { - s.Out = append(s.Out, s2.final(), s1.final()) - break - } - s.Out = append(s.Out, s2.next()) - if len(s.Out) >= s.DecompressLimit { - return fmt.Errorf("output size (%d) > DecompressLimit (%d)", len(s.Out), s.DecompressLimit) - } - } - return br.close() -} - -// decoder keeps track of the current state and updates it from the bitstream. -type decoder struct { - state uint16 - br *bitReader - dt []decSymbol -} - -// init will initialize the decoder and read the first state from the stream. -func (d *decoder) init(in *bitReader, dt []decSymbol, tableLog uint8) { - d.dt = dt - d.br = in - d.state = in.getBits(tableLog) -} - -// next returns the next symbol and sets the next state. -// At least tablelog bits must be available in the bit reader. -func (d *decoder) next() uint8 { - n := &d.dt[d.state] - lowBits := d.br.getBits(n.nbBits) - d.state = n.newState + lowBits - return n.symbol -} - -// finished returns true if all bits have been read from the bitstream -// and the next state would require reading bits from the input. -func (d *decoder) finished() bool { - return d.br.finished() && d.dt[d.state].nbBits > 0 -} - -// final returns the current state symbol without decoding the next. -func (d *decoder) final() uint8 { - return d.dt[d.state].symbol -} - -// nextFast returns the next symbol and sets the next state. -// This can only be used if no symbols are 0 bits. -// At least tablelog bits must be available in the bit reader. -func (d *decoder) nextFast() uint8 { - n := d.dt[d.state] - lowBits := d.br.getBitsFast(n.nbBits) - d.state = n.newState + lowBits - return n.symbol -} diff --git a/vendor/github.com/klauspost/compress/fse/fse.go b/vendor/github.com/klauspost/compress/fse/fse.go deleted file mode 100644 index 535cbadfde..0000000000 --- a/vendor/github.com/klauspost/compress/fse/fse.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2018 Klaus Post. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// Based on work Copyright (c) 2013, Yann Collet, released under BSD License. - -// Package fse provides Finite State Entropy encoding and decoding. -// -// Finite State Entropy encoding provides a fast near-optimal symbol encoding/decoding -// for byte blocks as implemented in zstd. -// -// See https://github.com/klauspost/compress/tree/master/fse for more information. -package fse - -import ( - "errors" - "fmt" - "math/bits" -) - -const ( - /*!MEMORY_USAGE : - * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.) - * Increasing memory usage improves compression ratio - * Reduced memory usage can improve speed, due to cache effect - * Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */ - maxMemoryUsage = 14 - defaultMemoryUsage = 13 - - maxTableLog = maxMemoryUsage - 2 - maxTablesize = 1 << maxTableLog - defaultTablelog = defaultMemoryUsage - 2 - minTablelog = 5 - maxSymbolValue = 255 -) - -var ( - // ErrIncompressible is returned when input is judged to be too hard to compress. - ErrIncompressible = errors.New("input is not compressible") - - // ErrUseRLE is returned from the compressor when the input is a single byte value repeated. - ErrUseRLE = errors.New("input is single value repeated") -) - -// Scratch provides temporary storage for compression and decompression. -type Scratch struct { - // Private - count [maxSymbolValue + 1]uint32 - norm [maxSymbolValue + 1]int16 - br byteReader - bits bitReader - bw bitWriter - ct cTable // Compression tables. - decTable []decSymbol // Decompression table. - maxCount int // count of the most probable symbol - - // Per block parameters. - // These can be used to override compression parameters of the block. - // Do not touch, unless you know what you are doing. - - // Out is output buffer. - // If the scratch is re-used before the caller is done processing the output, - // set this field to nil. - // Otherwise the output buffer will be re-used for next Compression/Decompression step - // and allocation will be avoided. - Out []byte - - // DecompressLimit limits the maximum decoded size acceptable. - // If > 0 decompression will stop when approximately this many bytes - // has been decoded. - // If 0, maximum size will be 2GB. - DecompressLimit int - - symbolLen uint16 // Length of active part of the symbol table. - actualTableLog uint8 // Selected tablelog. - zeroBits bool // no bits has prob > 50%. - clearCount bool // clear count - - // MaxSymbolValue will override the maximum symbol value of the next block. - MaxSymbolValue uint8 - - // TableLog will attempt to override the tablelog for the next block. - TableLog uint8 -} - -// Histogram allows to populate the histogram and skip that step in the compression, -// It otherwise allows to inspect the histogram when compression is done. -// To indicate that you have populated the histogram call HistogramFinished -// with the value of the highest populated symbol, as well as the number of entries -// in the most populated entry. These are accepted at face value. -// The returned slice will always be length 256. -func (s *Scratch) Histogram() []uint32 { - return s.count[:] -} - -// HistogramFinished can be called to indicate that the histogram has been populated. -// maxSymbol is the index of the highest set symbol of the next data segment. -// maxCount is the number of entries in the most populated entry. -// These are accepted at face value. -func (s *Scratch) HistogramFinished(maxSymbol uint8, maxCount int) { - s.maxCount = maxCount - s.symbolLen = uint16(maxSymbol) + 1 - s.clearCount = maxCount != 0 -} - -// prepare will prepare and allocate scratch tables used for both compression and decompression. -func (s *Scratch) prepare(in []byte) (*Scratch, error) { - if s == nil { - s = &Scratch{} - } - if s.MaxSymbolValue == 0 { - s.MaxSymbolValue = 255 - } - if s.TableLog == 0 { - s.TableLog = defaultTablelog - } - if s.TableLog > maxTableLog { - return nil, fmt.Errorf("tableLog (%d) > maxTableLog (%d)", s.TableLog, maxTableLog) - } - if cap(s.Out) == 0 { - s.Out = make([]byte, 0, len(in)) - } - if s.clearCount && s.maxCount == 0 { - for i := range s.count { - s.count[i] = 0 - } - s.clearCount = false - } - s.br.init(in) - if s.DecompressLimit == 0 { - // Max size 2GB. - s.DecompressLimit = (2 << 30) - 1 - } - - return s, nil -} - -// tableStep returns the next table index. -func tableStep(tableSize uint32) uint32 { - return (tableSize >> 1) + (tableSize >> 3) + 3 -} - -func highBits(val uint32) (n uint32) { - return uint32(bits.Len32(val) - 1) -} diff --git a/vendor/github.com/klauspost/compress/gen.sh b/vendor/github.com/klauspost/compress/gen.sh deleted file mode 100644 index aff942205f..0000000000 --- a/vendor/github.com/klauspost/compress/gen.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -cd s2/cmd/_s2sx/ || exit 1 -go generate . diff --git a/vendor/github.com/klauspost/compress/huff0/.gitignore b/vendor/github.com/klauspost/compress/huff0/.gitignore deleted file mode 100644 index b3d262958f..0000000000 --- a/vendor/github.com/klauspost/compress/huff0/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/huff0-fuzz.zip diff --git a/vendor/github.com/klauspost/compress/huff0/README.md b/vendor/github.com/klauspost/compress/huff0/README.md deleted file mode 100644 index 8b6e5c6638..0000000000 --- a/vendor/github.com/klauspost/compress/huff0/README.md +++ /dev/null @@ -1,89 +0,0 @@ -# Huff0 entropy compression - -This package provides Huff0 encoding and decoding as used in zstd. - -[Huff0](https://github.com/Cyan4973/FiniteStateEntropy#new-generation-entropy-coders), -a Huffman codec designed for modern CPU, featuring OoO (Out of Order) operations on multiple ALU -(Arithmetic Logic Unit), achieving extremely fast compression and decompression speeds. - -This can be used for compressing input with a lot of similar input values to the smallest number of bytes. -This does not perform any multi-byte [dictionary coding](https://en.wikipedia.org/wiki/Dictionary_coder) as LZ coders, -but it can be used as a secondary step to compressors (like Snappy) that does not do entropy encoding. - -* [Godoc documentation](https://godoc.org/github.com/klauspost/compress/huff0) - -## News - -This is used as part of the [zstandard](https://github.com/klauspost/compress/tree/master/zstd#zstd) compression and decompression package. - -This ensures that most functionality is well tested. - -# Usage - -This package provides a low level interface that allows to compress single independent blocks. - -Each block is separate, and there is no built in integrity checks. -This means that the caller should keep track of block sizes and also do checksums if needed. - -Compressing a block is done via the [`Compress1X`](https://godoc.org/github.com/klauspost/compress/huff0#Compress1X) and -[`Compress4X`](https://godoc.org/github.com/klauspost/compress/huff0#Compress4X) functions. -You must provide input and will receive the output and maybe an error. - -These error values can be returned: - -| Error | Description | -|---------------------|-----------------------------------------------------------------------------| -| `` | Everything ok, output is returned | -| `ErrIncompressible` | Returned when input is judged to be too hard to compress | -| `ErrUseRLE` | Returned from the compressor when the input is a single byte value repeated | -| `ErrTooBig` | Returned if the input block exceeds the maximum allowed size (128 Kib) | -| `(error)` | An internal error occurred. | - - -As can be seen above some of there are errors that will be returned even under normal operation so it is important to handle these. - -To reduce allocations you can provide a [`Scratch`](https://godoc.org/github.com/klauspost/compress/huff0#Scratch) object -that can be re-used for successive calls. Both compression and decompression accepts a `Scratch` object, and the same -object can be used for both. - -Be aware, that when re-using a `Scratch` object that the *output* buffer is also re-used, so if you are still using this -you must set the `Out` field in the scratch to nil. The same buffer is used for compression and decompression output. - -The `Scratch` object will retain state that allows to re-use previous tables for encoding and decoding. - -## Tables and re-use - -Huff0 allows for reusing tables from the previous block to save space if that is expected to give better/faster results. - -The Scratch object allows you to set a [`ReusePolicy`](https://godoc.org/github.com/klauspost/compress/huff0#ReusePolicy) -that controls this behaviour. See the documentation for details. This can be altered between each block. - -Do however note that this information is *not* stored in the output block and it is up to the users of the package to -record whether [`ReadTable`](https://godoc.org/github.com/klauspost/compress/huff0#ReadTable) should be called, -based on the boolean reported back from the CompressXX call. - -If you want to store the table separate from the data, you can access them as `OutData` and `OutTable` on the -[`Scratch`](https://godoc.org/github.com/klauspost/compress/huff0#Scratch) object. - -## Decompressing - -The first part of decoding is to initialize the decoding table through [`ReadTable`](https://godoc.org/github.com/klauspost/compress/huff0#ReadTable). -This will initialize the decoding tables. -You can supply the complete block to `ReadTable` and it will return the data part of the block -which can be given to the decompressor. - -Decompressing is done by calling the [`Decompress1X`](https://godoc.org/github.com/klauspost/compress/huff0#Scratch.Decompress1X) -or [`Decompress4X`](https://godoc.org/github.com/klauspost/compress/huff0#Scratch.Decompress4X) function. - -For concurrently decompressing content with a fixed table a stateless [`Decoder`](https://godoc.org/github.com/klauspost/compress/huff0#Decoder) can be requested which will remain correct as long as the scratch is unchanged. The capacity of the provided slice indicates the expected output size. - -You must provide the output from the compression stage, at exactly the size you got back. If you receive an error back -your input was likely corrupted. - -It is important to note that a successful decoding does *not* mean your output matches your original input. -There are no integrity checks, so relying on errors from the decompressor does not assure your data is valid. - -# Contributing - -Contributions are always welcome. Be aware that adding public functions will require good justification and breaking -changes will likely not be accepted. If in doubt open an issue before writing the PR. diff --git a/vendor/github.com/klauspost/compress/huff0/bitreader.go b/vendor/github.com/klauspost/compress/huff0/bitreader.go deleted file mode 100644 index e36d9742f9..0000000000 --- a/vendor/github.com/klauspost/compress/huff0/bitreader.go +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright 2018 Klaus Post. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// Based on work Copyright (c) 2013, Yann Collet, released under BSD License. - -package huff0 - -import ( - "encoding/binary" - "errors" - "fmt" - "io" -) - -// bitReader reads a bitstream in reverse. -// The last set bit indicates the start of the stream and is used -// for aligning the input. -type bitReaderBytes struct { - in []byte - off uint // next byte to read is at in[off - 1] - value uint64 - bitsRead uint8 -} - -// init initializes and resets the bit reader. -func (b *bitReaderBytes) init(in []byte) error { - if len(in) < 1 { - return errors.New("corrupt stream: too short") - } - b.in = in - b.off = uint(len(in)) - // The highest bit of the last byte indicates where to start - v := in[len(in)-1] - if v == 0 { - return errors.New("corrupt stream, did not find end of stream") - } - b.bitsRead = 64 - b.value = 0 - if len(in) >= 8 { - b.fillFastStart() - } else { - b.fill() - b.fill() - } - b.advance(8 - uint8(highBit32(uint32(v)))) - return nil -} - -// peekBitsFast requires that at least one bit is requested every time. -// There are no checks if the buffer is filled. -func (b *bitReaderBytes) peekByteFast() uint8 { - got := uint8(b.value >> 56) - return got -} - -func (b *bitReaderBytes) advance(n uint8) { - b.bitsRead += n - b.value <<= n & 63 -} - -// fillFast() will make sure at least 32 bits are available. -// There must be at least 4 bytes available. -func (b *bitReaderBytes) fillFast() { - if b.bitsRead < 32 { - return - } - - // 2 bounds checks. - v := b.in[b.off-4 : b.off] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - b.value |= uint64(low) << (b.bitsRead - 32) - b.bitsRead -= 32 - b.off -= 4 -} - -// fillFastStart() assumes the bitReaderBytes is empty and there is at least 8 bytes to read. -func (b *bitReaderBytes) fillFastStart() { - // Do single re-slice to avoid bounds checks. - b.value = binary.LittleEndian.Uint64(b.in[b.off-8:]) - b.bitsRead = 0 - b.off -= 8 -} - -// fill() will make sure at least 32 bits are available. -func (b *bitReaderBytes) fill() { - if b.bitsRead < 32 { - return - } - if b.off > 4 { - v := b.in[b.off-4 : b.off] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - b.value |= uint64(low) << (b.bitsRead - 32) - b.bitsRead -= 32 - b.off -= 4 - return - } - for b.off > 0 { - b.value |= uint64(b.in[b.off-1]) << (b.bitsRead - 8) - b.bitsRead -= 8 - b.off-- - } -} - -// finished returns true if all bits have been read from the bit stream. -func (b *bitReaderBytes) finished() bool { - return b.off == 0 && b.bitsRead >= 64 -} - -func (b *bitReaderBytes) remaining() uint { - return b.off*8 + uint(64-b.bitsRead) -} - -// close the bitstream and returns an error if out-of-buffer reads occurred. -func (b *bitReaderBytes) close() error { - // Release reference. - b.in = nil - if b.remaining() > 0 { - return fmt.Errorf("corrupt input: %d bits remain on stream", b.remaining()) - } - if b.bitsRead > 64 { - return io.ErrUnexpectedEOF - } - return nil -} - -// bitReaderShifted reads a bitstream in reverse. -// The last set bit indicates the start of the stream and is used -// for aligning the input. -type bitReaderShifted struct { - in []byte - off uint // next byte to read is at in[off - 1] - value uint64 - bitsRead uint8 -} - -// init initializes and resets the bit reader. -func (b *bitReaderShifted) init(in []byte) error { - if len(in) < 1 { - return errors.New("corrupt stream: too short") - } - b.in = in - b.off = uint(len(in)) - // The highest bit of the last byte indicates where to start - v := in[len(in)-1] - if v == 0 { - return errors.New("corrupt stream, did not find end of stream") - } - b.bitsRead = 64 - b.value = 0 - if len(in) >= 8 { - b.fillFastStart() - } else { - b.fill() - b.fill() - } - b.advance(8 - uint8(highBit32(uint32(v)))) - return nil -} - -// peekBitsFast requires that at least one bit is requested every time. -// There are no checks if the buffer is filled. -func (b *bitReaderShifted) peekBitsFast(n uint8) uint16 { - return uint16(b.value >> ((64 - n) & 63)) -} - -func (b *bitReaderShifted) advance(n uint8) { - b.bitsRead += n - b.value <<= n & 63 -} - -// fillFast() will make sure at least 32 bits are available. -// There must be at least 4 bytes available. -func (b *bitReaderShifted) fillFast() { - if b.bitsRead < 32 { - return - } - - // 2 bounds checks. - v := b.in[b.off-4 : b.off] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - b.value |= uint64(low) << ((b.bitsRead - 32) & 63) - b.bitsRead -= 32 - b.off -= 4 -} - -// fillFastStart() assumes the bitReaderShifted is empty and there is at least 8 bytes to read. -func (b *bitReaderShifted) fillFastStart() { - // Do single re-slice to avoid bounds checks. - b.value = binary.LittleEndian.Uint64(b.in[b.off-8:]) - b.bitsRead = 0 - b.off -= 8 -} - -// fill() will make sure at least 32 bits are available. -func (b *bitReaderShifted) fill() { - if b.bitsRead < 32 { - return - } - if b.off > 4 { - v := b.in[b.off-4 : b.off] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - b.value |= uint64(low) << ((b.bitsRead - 32) & 63) - b.bitsRead -= 32 - b.off -= 4 - return - } - for b.off > 0 { - b.value |= uint64(b.in[b.off-1]) << ((b.bitsRead - 8) & 63) - b.bitsRead -= 8 - b.off-- - } -} - -func (b *bitReaderShifted) remaining() uint { - return b.off*8 + uint(64-b.bitsRead) -} - -// close the bitstream and returns an error if out-of-buffer reads occurred. -func (b *bitReaderShifted) close() error { - // Release reference. - b.in = nil - if b.remaining() > 0 { - return fmt.Errorf("corrupt input: %d bits remain on stream", b.remaining()) - } - if b.bitsRead > 64 { - return io.ErrUnexpectedEOF - } - return nil -} diff --git a/vendor/github.com/klauspost/compress/huff0/bitwriter.go b/vendor/github.com/klauspost/compress/huff0/bitwriter.go deleted file mode 100644 index 0ebc9aaac7..0000000000 --- a/vendor/github.com/klauspost/compress/huff0/bitwriter.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2018 Klaus Post. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// Based on work Copyright (c) 2013, Yann Collet, released under BSD License. - -package huff0 - -// bitWriter will write bits. -// First bit will be LSB of the first byte of output. -type bitWriter struct { - bitContainer uint64 - nBits uint8 - out []byte -} - -// addBits16Clean will add up to 16 bits. value may not contain more set bits than indicated. -// It will not check if there is space for them, so the caller must ensure that it has flushed recently. -func (b *bitWriter) addBits16Clean(value uint16, bits uint8) { - b.bitContainer |= uint64(value) << (b.nBits & 63) - b.nBits += bits -} - -// encSymbol will add up to 16 bits. value may not contain more set bits than indicated. -// It will not check if there is space for them, so the caller must ensure that it has flushed recently. -func (b *bitWriter) encSymbol(ct cTable, symbol byte) { - enc := ct[symbol] - b.bitContainer |= uint64(enc.val) << (b.nBits & 63) - if false { - if enc.nBits == 0 { - panic("nbits 0") - } - } - b.nBits += enc.nBits -} - -// encTwoSymbols will add up to 32 bits. value may not contain more set bits than indicated. -// It will not check if there is space for them, so the caller must ensure that it has flushed recently. -func (b *bitWriter) encTwoSymbols(ct cTable, av, bv byte) { - encA := ct[av] - encB := ct[bv] - sh := b.nBits & 63 - combined := uint64(encA.val) | (uint64(encB.val) << (encA.nBits & 63)) - b.bitContainer |= combined << sh - if false { - if encA.nBits == 0 { - panic("nbitsA 0") - } - if encB.nBits == 0 { - panic("nbitsB 0") - } - } - b.nBits += encA.nBits + encB.nBits -} - -// encFourSymbols adds up to 32 bits from four symbols. -// It will not check if there is space for them, -// so the caller must ensure that b has been flushed recently. -func (b *bitWriter) encFourSymbols(encA, encB, encC, encD cTableEntry) { - bitsA := encA.nBits - bitsB := bitsA + encB.nBits - bitsC := bitsB + encC.nBits - bitsD := bitsC + encD.nBits - combined := uint64(encA.val) | - (uint64(encB.val) << (bitsA & 63)) | - (uint64(encC.val) << (bitsB & 63)) | - (uint64(encD.val) << (bitsC & 63)) - b.bitContainer |= combined << (b.nBits & 63) - b.nBits += bitsD -} - -// flush32 will flush out, so there are at least 32 bits available for writing. -func (b *bitWriter) flush32() { - if b.nBits < 32 { - return - } - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24)) - b.nBits -= 32 - b.bitContainer >>= 32 -} - -// flushAlign will flush remaining full bytes and align to next byte boundary. -func (b *bitWriter) flushAlign() { - nbBytes := (b.nBits + 7) >> 3 - for i := uint8(0); i < nbBytes; i++ { - b.out = append(b.out, byte(b.bitContainer>>(i*8))) - } - b.nBits = 0 - b.bitContainer = 0 -} - -// close will write the alignment bit and write the final byte(s) -// to the output. -func (b *bitWriter) close() { - // End mark - b.addBits16Clean(1, 1) - // flush until next byte. - b.flushAlign() -} diff --git a/vendor/github.com/klauspost/compress/huff0/compress.go b/vendor/github.com/klauspost/compress/huff0/compress.go deleted file mode 100644 index 84aa3d12f0..0000000000 --- a/vendor/github.com/klauspost/compress/huff0/compress.go +++ /dev/null @@ -1,742 +0,0 @@ -package huff0 - -import ( - "fmt" - "math" - "runtime" - "sync" -) - -// Compress1X will compress the input. -// The output can be decoded using Decompress1X. -// Supply a Scratch object. The scratch object contains state about re-use, -// So when sharing across independent encodes, be sure to set the re-use policy. -func Compress1X(in []byte, s *Scratch) (out []byte, reUsed bool, err error) { - s, err = s.prepare(in) - if err != nil { - return nil, false, err - } - return compress(in, s, s.compress1X) -} - -// Compress4X will compress the input. The input is split into 4 independent blocks -// and compressed similar to Compress1X. -// The output can be decoded using Decompress4X. -// Supply a Scratch object. The scratch object contains state about re-use, -// So when sharing across independent encodes, be sure to set the re-use policy. -func Compress4X(in []byte, s *Scratch) (out []byte, reUsed bool, err error) { - s, err = s.prepare(in) - if err != nil { - return nil, false, err - } - if false { - // TODO: compress4Xp only slightly faster. - const parallelThreshold = 8 << 10 - if len(in) < parallelThreshold || runtime.GOMAXPROCS(0) == 1 { - return compress(in, s, s.compress4X) - } - return compress(in, s, s.compress4Xp) - } - return compress(in, s, s.compress4X) -} - -func compress(in []byte, s *Scratch, compressor func(src []byte) ([]byte, error)) (out []byte, reUsed bool, err error) { - // Nuke previous table if we cannot reuse anyway. - if s.Reuse == ReusePolicyNone { - s.prevTable = s.prevTable[:0] - } - - // Create histogram, if none was provided. - maxCount := s.maxCount - var canReuse = false - if maxCount == 0 { - maxCount, canReuse = s.countSimple(in) - } else { - canReuse = s.canUseTable(s.prevTable) - } - - // We want the output size to be less than this: - wantSize := len(in) - if s.WantLogLess > 0 { - wantSize -= wantSize >> s.WantLogLess - } - - // Reset for next run. - s.clearCount = true - s.maxCount = 0 - if maxCount >= len(in) { - if maxCount > len(in) { - return nil, false, fmt.Errorf("maxCount (%d) > length (%d)", maxCount, len(in)) - } - if len(in) == 1 { - return nil, false, ErrIncompressible - } - // One symbol, use RLE - return nil, false, ErrUseRLE - } - if maxCount == 1 || maxCount < (len(in)>>7) { - // Each symbol present maximum once or too well distributed. - return nil, false, ErrIncompressible - } - if s.Reuse == ReusePolicyMust && !canReuse { - // We must reuse, but we can't. - return nil, false, ErrIncompressible - } - if (s.Reuse == ReusePolicyPrefer || s.Reuse == ReusePolicyMust) && canReuse { - keepTable := s.cTable - keepTL := s.actualTableLog - s.cTable = s.prevTable - s.actualTableLog = s.prevTableLog - s.Out, err = compressor(in) - s.cTable = keepTable - s.actualTableLog = keepTL - if err == nil && len(s.Out) < wantSize { - s.OutData = s.Out - return s.Out, true, nil - } - if s.Reuse == ReusePolicyMust { - return nil, false, ErrIncompressible - } - // Do not attempt to re-use later. - s.prevTable = s.prevTable[:0] - } - - // Calculate new table. - err = s.buildCTable() - if err != nil { - return nil, false, err - } - - if false && !s.canUseTable(s.cTable) { - panic("invalid table generated") - } - - if s.Reuse == ReusePolicyAllow && canReuse { - hSize := len(s.Out) - oldSize := s.prevTable.estimateSize(s.count[:s.symbolLen]) - newSize := s.cTable.estimateSize(s.count[:s.symbolLen]) - if oldSize <= hSize+newSize || hSize+12 >= wantSize { - // Retain cTable even if we re-use. - keepTable := s.cTable - keepTL := s.actualTableLog - - s.cTable = s.prevTable - s.actualTableLog = s.prevTableLog - s.Out, err = compressor(in) - - // Restore ctable. - s.cTable = keepTable - s.actualTableLog = keepTL - if err != nil { - return nil, false, err - } - if len(s.Out) >= wantSize { - return nil, false, ErrIncompressible - } - s.OutData = s.Out - return s.Out, true, nil - } - } - - // Use new table - err = s.cTable.write(s) - if err != nil { - s.OutTable = nil - return nil, false, err - } - s.OutTable = s.Out - - // Compress using new table - s.Out, err = compressor(in) - if err != nil { - s.OutTable = nil - return nil, false, err - } - if len(s.Out) >= wantSize { - s.OutTable = nil - return nil, false, ErrIncompressible - } - // Move current table into previous. - s.prevTable, s.prevTableLog, s.cTable = s.cTable, s.actualTableLog, s.prevTable[:0] - s.OutData = s.Out[len(s.OutTable):] - return s.Out, false, nil -} - -// EstimateSizes will estimate the data sizes -func EstimateSizes(in []byte, s *Scratch) (tableSz, dataSz, reuseSz int, err error) { - s, err = s.prepare(in) - if err != nil { - return 0, 0, 0, err - } - - // Create histogram, if none was provided. - tableSz, dataSz, reuseSz = -1, -1, -1 - maxCount := s.maxCount - var canReuse = false - if maxCount == 0 { - maxCount, canReuse = s.countSimple(in) - } else { - canReuse = s.canUseTable(s.prevTable) - } - - // We want the output size to be less than this: - wantSize := len(in) - if s.WantLogLess > 0 { - wantSize -= wantSize >> s.WantLogLess - } - - // Reset for next run. - s.clearCount = true - s.maxCount = 0 - if maxCount >= len(in) { - if maxCount > len(in) { - return 0, 0, 0, fmt.Errorf("maxCount (%d) > length (%d)", maxCount, len(in)) - } - if len(in) == 1 { - return 0, 0, 0, ErrIncompressible - } - // One symbol, use RLE - return 0, 0, 0, ErrUseRLE - } - if maxCount == 1 || maxCount < (len(in)>>7) { - // Each symbol present maximum once or too well distributed. - return 0, 0, 0, ErrIncompressible - } - - // Calculate new table. - err = s.buildCTable() - if err != nil { - return 0, 0, 0, err - } - - if false && !s.canUseTable(s.cTable) { - panic("invalid table generated") - } - - tableSz, err = s.cTable.estTableSize(s) - if err != nil { - return 0, 0, 0, err - } - if canReuse { - reuseSz = s.prevTable.estimateSize(s.count[:s.symbolLen]) - } - dataSz = s.cTable.estimateSize(s.count[:s.symbolLen]) - - // Restore - return tableSz, dataSz, reuseSz, nil -} - -func (s *Scratch) compress1X(src []byte) ([]byte, error) { - return s.compress1xDo(s.Out, src), nil -} - -func (s *Scratch) compress1xDo(dst, src []byte) []byte { - var bw = bitWriter{out: dst} - - // N is length divisible by 4. - n := len(src) - n -= n & 3 - cTable := s.cTable[:256] - - // Encode last bytes. - for i := len(src) & 3; i > 0; i-- { - bw.encSymbol(cTable, src[n+i-1]) - } - n -= 4 - if s.actualTableLog <= 8 { - for ; n >= 0; n -= 4 { - tmp := src[n : n+4] - // tmp should be len 4 - bw.flush32() - bw.encFourSymbols(cTable[tmp[3]], cTable[tmp[2]], cTable[tmp[1]], cTable[tmp[0]]) - } - } else { - for ; n >= 0; n -= 4 { - tmp := src[n : n+4] - // tmp should be len 4 - bw.flush32() - bw.encTwoSymbols(cTable, tmp[3], tmp[2]) - bw.flush32() - bw.encTwoSymbols(cTable, tmp[1], tmp[0]) - } - } - bw.close() - return bw.out -} - -var sixZeros [6]byte - -func (s *Scratch) compress4X(src []byte) ([]byte, error) { - if len(src) < 12 { - return nil, ErrIncompressible - } - segmentSize := (len(src) + 3) / 4 - - // Add placeholder for output length - offsetIdx := len(s.Out) - s.Out = append(s.Out, sixZeros[:]...) - - for i := 0; i < 4; i++ { - toDo := src - if len(toDo) > segmentSize { - toDo = toDo[:segmentSize] - } - src = src[len(toDo):] - - idx := len(s.Out) - s.Out = s.compress1xDo(s.Out, toDo) - if len(s.Out)-idx > math.MaxUint16 { - // We cannot store the size in the jump table - return nil, ErrIncompressible - } - // Write compressed length as little endian before block. - if i < 3 { - // Last length is not written. - length := len(s.Out) - idx - s.Out[i*2+offsetIdx] = byte(length) - s.Out[i*2+offsetIdx+1] = byte(length >> 8) - } - } - - return s.Out, nil -} - -// compress4Xp will compress 4 streams using separate goroutines. -func (s *Scratch) compress4Xp(src []byte) ([]byte, error) { - if len(src) < 12 { - return nil, ErrIncompressible - } - // Add placeholder for output length - s.Out = s.Out[:6] - - segmentSize := (len(src) + 3) / 4 - var wg sync.WaitGroup - wg.Add(4) - for i := 0; i < 4; i++ { - toDo := src - if len(toDo) > segmentSize { - toDo = toDo[:segmentSize] - } - src = src[len(toDo):] - - // Separate goroutine for each block. - go func(i int) { - s.tmpOut[i] = s.compress1xDo(s.tmpOut[i][:0], toDo) - wg.Done() - }(i) - } - wg.Wait() - for i := 0; i < 4; i++ { - o := s.tmpOut[i] - if len(o) > math.MaxUint16 { - // We cannot store the size in the jump table - return nil, ErrIncompressible - } - // Write compressed length as little endian before block. - if i < 3 { - // Last length is not written. - s.Out[i*2] = byte(len(o)) - s.Out[i*2+1] = byte(len(o) >> 8) - } - - // Write output. - s.Out = append(s.Out, o...) - } - return s.Out, nil -} - -// countSimple will create a simple histogram in s.count. -// Returns the biggest count. -// Does not update s.clearCount. -func (s *Scratch) countSimple(in []byte) (max int, reuse bool) { - reuse = true - _ = s.count // Assert that s != nil to speed up the following loop. - for _, v := range in { - s.count[v]++ - } - m := uint32(0) - if len(s.prevTable) > 0 { - for i, v := range s.count[:] { - if v == 0 { - continue - } - if v > m { - m = v - } - s.symbolLen = uint16(i) + 1 - if i >= len(s.prevTable) { - reuse = false - } else if s.prevTable[i].nBits == 0 { - reuse = false - } - } - return int(m), reuse - } - for i, v := range s.count[:] { - if v == 0 { - continue - } - if v > m { - m = v - } - s.symbolLen = uint16(i) + 1 - } - return int(m), false -} - -func (s *Scratch) canUseTable(c cTable) bool { - if len(c) < int(s.symbolLen) { - return false - } - for i, v := range s.count[:s.symbolLen] { - if v != 0 && c[i].nBits == 0 { - return false - } - } - return true -} - -//lint:ignore U1000 used for debugging -func (s *Scratch) validateTable(c cTable) bool { - if len(c) < int(s.symbolLen) { - return false - } - for i, v := range s.count[:s.symbolLen] { - if v != 0 { - if c[i].nBits == 0 { - return false - } - if c[i].nBits > s.actualTableLog { - return false - } - } - } - return true -} - -// minTableLog provides the minimum logSize to safely represent a distribution. -func (s *Scratch) minTableLog() uint8 { - minBitsSrc := highBit32(uint32(s.srcLen)) + 1 - minBitsSymbols := highBit32(uint32(s.symbolLen-1)) + 2 - if minBitsSrc < minBitsSymbols { - return uint8(minBitsSrc) - } - return uint8(minBitsSymbols) -} - -// optimalTableLog calculates and sets the optimal tableLog in s.actualTableLog -func (s *Scratch) optimalTableLog() { - tableLog := s.TableLog - minBits := s.minTableLog() - maxBitsSrc := uint8(highBit32(uint32(s.srcLen-1))) - 1 - if maxBitsSrc < tableLog { - // Accuracy can be reduced - tableLog = maxBitsSrc - } - if minBits > tableLog { - tableLog = minBits - } - // Need a minimum to safely represent all symbol values - if tableLog < minTablelog { - tableLog = minTablelog - } - if tableLog > tableLogMax { - tableLog = tableLogMax - } - s.actualTableLog = tableLog -} - -type cTableEntry struct { - val uint16 - nBits uint8 - // We have 8 bits extra -} - -const huffNodesMask = huffNodesLen - 1 - -func (s *Scratch) buildCTable() error { - s.optimalTableLog() - s.huffSort() - if cap(s.cTable) < maxSymbolValue+1 { - s.cTable = make([]cTableEntry, s.symbolLen, maxSymbolValue+1) - } else { - s.cTable = s.cTable[:s.symbolLen] - for i := range s.cTable { - s.cTable[i] = cTableEntry{} - } - } - - var startNode = int16(s.symbolLen) - nonNullRank := s.symbolLen - 1 - - nodeNb := startNode - huffNode := s.nodes[1 : huffNodesLen+1] - - // This overlays the slice above, but allows "-1" index lookups. - // Different from reference implementation. - huffNode0 := s.nodes[0 : huffNodesLen+1] - - for huffNode[nonNullRank].count() == 0 { - nonNullRank-- - } - - lowS := int16(nonNullRank) - nodeRoot := nodeNb + lowS - 1 - lowN := nodeNb - huffNode[nodeNb].setCount(huffNode[lowS].count() + huffNode[lowS-1].count()) - huffNode[lowS].setParent(nodeNb) - huffNode[lowS-1].setParent(nodeNb) - nodeNb++ - lowS -= 2 - for n := nodeNb; n <= nodeRoot; n++ { - huffNode[n].setCount(1 << 30) - } - // fake entry, strong barrier - huffNode0[0].setCount(1 << 31) - - // create parents - for nodeNb <= nodeRoot { - var n1, n2 int16 - if huffNode0[lowS+1].count() < huffNode0[lowN+1].count() { - n1 = lowS - lowS-- - } else { - n1 = lowN - lowN++ - } - if huffNode0[lowS+1].count() < huffNode0[lowN+1].count() { - n2 = lowS - lowS-- - } else { - n2 = lowN - lowN++ - } - - huffNode[nodeNb].setCount(huffNode0[n1+1].count() + huffNode0[n2+1].count()) - huffNode0[n1+1].setParent(nodeNb) - huffNode0[n2+1].setParent(nodeNb) - nodeNb++ - } - - // distribute weights (unlimited tree height) - huffNode[nodeRoot].setNbBits(0) - for n := nodeRoot - 1; n >= startNode; n-- { - huffNode[n].setNbBits(huffNode[huffNode[n].parent()].nbBits() + 1) - } - for n := uint16(0); n <= nonNullRank; n++ { - huffNode[n].setNbBits(huffNode[huffNode[n].parent()].nbBits() + 1) - } - s.actualTableLog = s.setMaxHeight(int(nonNullRank)) - maxNbBits := s.actualTableLog - - // fill result into tree (val, nbBits) - if maxNbBits > tableLogMax { - return fmt.Errorf("internal error: maxNbBits (%d) > tableLogMax (%d)", maxNbBits, tableLogMax) - } - var nbPerRank [tableLogMax + 1]uint16 - var valPerRank [16]uint16 - for _, v := range huffNode[:nonNullRank+1] { - nbPerRank[v.nbBits()]++ - } - // determine stating value per rank - { - min := uint16(0) - for n := maxNbBits; n > 0; n-- { - // get starting value within each rank - valPerRank[n] = min - min += nbPerRank[n] - min >>= 1 - } - } - - // push nbBits per symbol, symbol order - for _, v := range huffNode[:nonNullRank+1] { - s.cTable[v.symbol()].nBits = v.nbBits() - } - - // assign value within rank, symbol order - t := s.cTable[:s.symbolLen] - for n, val := range t { - nbits := val.nBits & 15 - v := valPerRank[nbits] - t[n].val = v - valPerRank[nbits] = v + 1 - } - - return nil -} - -// huffSort will sort symbols, decreasing order. -func (s *Scratch) huffSort() { - type rankPos struct { - base uint32 - current uint32 - } - - // Clear nodes - nodes := s.nodes[:huffNodesLen+1] - s.nodes = nodes - nodes = nodes[1 : huffNodesLen+1] - - // Sort into buckets based on length of symbol count. - var rank [32]rankPos - for _, v := range s.count[:s.symbolLen] { - r := highBit32(v+1) & 31 - rank[r].base++ - } - // maxBitLength is log2(BlockSizeMax) + 1 - const maxBitLength = 18 + 1 - for n := maxBitLength; n > 0; n-- { - rank[n-1].base += rank[n].base - } - for n := range rank[:maxBitLength] { - rank[n].current = rank[n].base - } - for n, c := range s.count[:s.symbolLen] { - r := (highBit32(c+1) + 1) & 31 - pos := rank[r].current - rank[r].current++ - prev := nodes[(pos-1)&huffNodesMask] - for pos > rank[r].base && c > prev.count() { - nodes[pos&huffNodesMask] = prev - pos-- - prev = nodes[(pos-1)&huffNodesMask] - } - nodes[pos&huffNodesMask] = makeNodeElt(c, byte(n)) - } -} - -func (s *Scratch) setMaxHeight(lastNonNull int) uint8 { - maxNbBits := s.actualTableLog - huffNode := s.nodes[1 : huffNodesLen+1] - //huffNode = huffNode[: huffNodesLen] - - largestBits := huffNode[lastNonNull].nbBits() - - // early exit : no elt > maxNbBits - if largestBits <= maxNbBits { - return largestBits - } - totalCost := int(0) - baseCost := int(1) << (largestBits - maxNbBits) - n := uint32(lastNonNull) - - for huffNode[n].nbBits() > maxNbBits { - totalCost += baseCost - (1 << (largestBits - huffNode[n].nbBits())) - huffNode[n].setNbBits(maxNbBits) - n-- - } - // n stops at huffNode[n].nbBits <= maxNbBits - - for huffNode[n].nbBits() == maxNbBits { - n-- - } - // n end at index of smallest symbol using < maxNbBits - - // renorm totalCost - totalCost >>= largestBits - maxNbBits /* note : totalCost is necessarily a multiple of baseCost */ - - // repay normalized cost - { - const noSymbol = 0xF0F0F0F0 - var rankLast [tableLogMax + 2]uint32 - - for i := range rankLast[:] { - rankLast[i] = noSymbol - } - - // Get pos of last (smallest) symbol per rank - { - currentNbBits := maxNbBits - for pos := int(n); pos >= 0; pos-- { - if huffNode[pos].nbBits() >= currentNbBits { - continue - } - currentNbBits = huffNode[pos].nbBits() // < maxNbBits - rankLast[maxNbBits-currentNbBits] = uint32(pos) - } - } - - for totalCost > 0 { - nBitsToDecrease := uint8(highBit32(uint32(totalCost))) + 1 - - for ; nBitsToDecrease > 1; nBitsToDecrease-- { - highPos := rankLast[nBitsToDecrease] - lowPos := rankLast[nBitsToDecrease-1] - if highPos == noSymbol { - continue - } - if lowPos == noSymbol { - break - } - highTotal := huffNode[highPos].count() - lowTotal := 2 * huffNode[lowPos].count() - if highTotal <= lowTotal { - break - } - } - // only triggered when no more rank 1 symbol left => find closest one (note : there is necessarily at least one !) - // HUF_MAX_TABLELOG test just to please gcc 5+; but it should not be necessary - // FIXME: try to remove - for (nBitsToDecrease <= tableLogMax) && (rankLast[nBitsToDecrease] == noSymbol) { - nBitsToDecrease++ - } - totalCost -= 1 << (nBitsToDecrease - 1) - if rankLast[nBitsToDecrease-1] == noSymbol { - // this rank is no longer empty - rankLast[nBitsToDecrease-1] = rankLast[nBitsToDecrease] - } - huffNode[rankLast[nBitsToDecrease]].setNbBits(1 + - huffNode[rankLast[nBitsToDecrease]].nbBits()) - if rankLast[nBitsToDecrease] == 0 { - /* special case, reached largest symbol */ - rankLast[nBitsToDecrease] = noSymbol - } else { - rankLast[nBitsToDecrease]-- - if huffNode[rankLast[nBitsToDecrease]].nbBits() != maxNbBits-nBitsToDecrease { - rankLast[nBitsToDecrease] = noSymbol /* this rank is now empty */ - } - } - } - - for totalCost < 0 { /* Sometimes, cost correction overshoot */ - if rankLast[1] == noSymbol { /* special case : no rank 1 symbol (using maxNbBits-1); let's create one from largest rank 0 (using maxNbBits) */ - for huffNode[n].nbBits() == maxNbBits { - n-- - } - huffNode[n+1].setNbBits(huffNode[n+1].nbBits() - 1) - rankLast[1] = n + 1 - totalCost++ - continue - } - huffNode[rankLast[1]+1].setNbBits(huffNode[rankLast[1]+1].nbBits() - 1) - rankLast[1]++ - totalCost++ - } - } - return maxNbBits -} - -// A nodeElt is the fields -// -// count uint32 -// parent uint16 -// symbol byte -// nbBits uint8 -// -// in some order, all squashed into an integer so that the compiler -// always loads and stores entire nodeElts instead of separate fields. -type nodeElt uint64 - -func makeNodeElt(count uint32, symbol byte) nodeElt { - return nodeElt(count) | nodeElt(symbol)<<48 -} - -func (e *nodeElt) count() uint32 { return uint32(*e) } -func (e *nodeElt) parent() uint16 { return uint16(*e >> 32) } -func (e *nodeElt) symbol() byte { return byte(*e >> 48) } -func (e *nodeElt) nbBits() uint8 { return uint8(*e >> 56) } - -func (e *nodeElt) setCount(c uint32) { *e = (*e)&0xffffffff00000000 | nodeElt(c) } -func (e *nodeElt) setParent(p int16) { *e = (*e)&0xffff0000ffffffff | nodeElt(uint16(p))<<32 } -func (e *nodeElt) setNbBits(n uint8) { *e = (*e)&0x00ffffffffffffff | nodeElt(n)<<56 } diff --git a/vendor/github.com/klauspost/compress/huff0/decompress.go b/vendor/github.com/klauspost/compress/huff0/decompress.go deleted file mode 100644 index 0f56b02d74..0000000000 --- a/vendor/github.com/klauspost/compress/huff0/decompress.go +++ /dev/null @@ -1,1167 +0,0 @@ -package huff0 - -import ( - "errors" - "fmt" - "io" - "sync" - - "github.com/klauspost/compress/fse" -) - -type dTable struct { - single []dEntrySingle -} - -// single-symbols decoding -type dEntrySingle struct { - entry uint16 -} - -// Uses special code for all tables that are < 8 bits. -const use8BitTables = true - -// ReadTable will read a table from the input. -// The size of the input may be larger than the table definition. -// Any content remaining after the table definition will be returned. -// If no Scratch is provided a new one is allocated. -// The returned Scratch can be used for encoding or decoding input using this table. -func ReadTable(in []byte, s *Scratch) (s2 *Scratch, remain []byte, err error) { - s, err = s.prepare(nil) - if err != nil { - return s, nil, err - } - if len(in) <= 1 { - return s, nil, errors.New("input too small for table") - } - iSize := in[0] - in = in[1:] - if iSize >= 128 { - // Uncompressed - oSize := iSize - 127 - iSize = (oSize + 1) / 2 - if int(iSize) > len(in) { - return s, nil, errors.New("input too small for table") - } - for n := uint8(0); n < oSize; n += 2 { - v := in[n/2] - s.huffWeight[n] = v >> 4 - s.huffWeight[n+1] = v & 15 - } - s.symbolLen = uint16(oSize) - in = in[iSize:] - } else { - if len(in) < int(iSize) { - return s, nil, fmt.Errorf("input too small for table, want %d bytes, have %d", iSize, len(in)) - } - // FSE compressed weights - s.fse.DecompressLimit = 255 - hw := s.huffWeight[:] - s.fse.Out = hw - b, err := fse.Decompress(in[:iSize], s.fse) - s.fse.Out = nil - if err != nil { - return s, nil, fmt.Errorf("fse decompress returned: %w", err) - } - if len(b) > 255 { - return s, nil, errors.New("corrupt input: output table too large") - } - s.symbolLen = uint16(len(b)) - in = in[iSize:] - } - - // collect weight stats - var rankStats [16]uint32 - weightTotal := uint32(0) - for _, v := range s.huffWeight[:s.symbolLen] { - if v > tableLogMax { - return s, nil, errors.New("corrupt input: weight too large") - } - v2 := v & 15 - rankStats[v2]++ - // (1 << (v2-1)) is slower since the compiler cannot prove that v2 isn't 0. - weightTotal += (1 << v2) >> 1 - } - if weightTotal == 0 { - return s, nil, errors.New("corrupt input: weights zero") - } - - // get last non-null symbol weight (implied, total must be 2^n) - { - tableLog := highBit32(weightTotal) + 1 - if tableLog > tableLogMax { - return s, nil, errors.New("corrupt input: tableLog too big") - } - s.actualTableLog = uint8(tableLog) - // determine last weight - { - total := uint32(1) << tableLog - rest := total - weightTotal - verif := uint32(1) << highBit32(rest) - lastWeight := highBit32(rest) + 1 - if verif != rest { - // last value must be a clean power of 2 - return s, nil, errors.New("corrupt input: last value not power of two") - } - s.huffWeight[s.symbolLen] = uint8(lastWeight) - s.symbolLen++ - rankStats[lastWeight]++ - } - } - - if (rankStats[1] < 2) || (rankStats[1]&1 != 0) { - // by construction : at least 2 elts of rank 1, must be even - return s, nil, errors.New("corrupt input: min elt size, even check failed ") - } - - // TODO: Choose between single/double symbol decoding - - // Calculate starting value for each rank - { - var nextRankStart uint32 - for n := uint8(1); n < s.actualTableLog+1; n++ { - current := nextRankStart - nextRankStart += rankStats[n] << (n - 1) - rankStats[n] = current - } - } - - // fill DTable (always full size) - tSize := 1 << tableLogMax - if len(s.dt.single) != tSize { - s.dt.single = make([]dEntrySingle, tSize) - } - cTable := s.prevTable - if cap(cTable) < maxSymbolValue+1 { - cTable = make([]cTableEntry, 0, maxSymbolValue+1) - } - cTable = cTable[:maxSymbolValue+1] - s.prevTable = cTable[:s.symbolLen] - s.prevTableLog = s.actualTableLog - - for n, w := range s.huffWeight[:s.symbolLen] { - if w == 0 { - cTable[n] = cTableEntry{ - val: 0, - nBits: 0, - } - continue - } - length := (uint32(1) << w) >> 1 - d := dEntrySingle{ - entry: uint16(s.actualTableLog+1-w) | (uint16(n) << 8), - } - - rank := &rankStats[w] - cTable[n] = cTableEntry{ - val: uint16(*rank >> (w - 1)), - nBits: uint8(d.entry), - } - - single := s.dt.single[*rank : *rank+length] - for i := range single { - single[i] = d - } - *rank += length - } - - return s, in, nil -} - -// Decompress1X will decompress a 1X encoded stream. -// The length of the supplied input must match the end of a block exactly. -// Before this is called, the table must be initialized with ReadTable unless -// the encoder re-used the table. -// deprecated: Use the stateless Decoder() to get a concurrent version. -func (s *Scratch) Decompress1X(in []byte) (out []byte, err error) { - if cap(s.Out) < s.MaxDecodedSize { - s.Out = make([]byte, s.MaxDecodedSize) - } - s.Out = s.Out[:0:s.MaxDecodedSize] - s.Out, err = s.Decoder().Decompress1X(s.Out, in) - return s.Out, err -} - -// Decompress4X will decompress a 4X encoded stream. -// Before this is called, the table must be initialized with ReadTable unless -// the encoder re-used the table. -// The length of the supplied input must match the end of a block exactly. -// The destination size of the uncompressed data must be known and provided. -// deprecated: Use the stateless Decoder() to get a concurrent version. -func (s *Scratch) Decompress4X(in []byte, dstSize int) (out []byte, err error) { - if dstSize > s.MaxDecodedSize { - return nil, ErrMaxDecodedSizeExceeded - } - if cap(s.Out) < dstSize { - s.Out = make([]byte, s.MaxDecodedSize) - } - s.Out = s.Out[:0:dstSize] - s.Out, err = s.Decoder().Decompress4X(s.Out, in) - return s.Out, err -} - -// Decoder will return a stateless decoder that can be used by multiple -// decompressors concurrently. -// Before this is called, the table must be initialized with ReadTable. -// The Decoder is still linked to the scratch buffer so that cannot be reused. -// However, it is safe to discard the scratch. -func (s *Scratch) Decoder() *Decoder { - return &Decoder{ - dt: s.dt, - actualTableLog: s.actualTableLog, - bufs: &s.decPool, - } -} - -// Decoder provides stateless decoding. -type Decoder struct { - dt dTable - actualTableLog uint8 - bufs *sync.Pool -} - -func (d *Decoder) buffer() *[4][256]byte { - buf, ok := d.bufs.Get().(*[4][256]byte) - if ok { - return buf - } - return &[4][256]byte{} -} - -// decompress1X8Bit will decompress a 1X encoded stream with tablelog <= 8. -// The cap of the output buffer will be the maximum decompressed size. -// The length of the supplied input must match the end of a block exactly. -func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { - if d.actualTableLog == 8 { - return d.decompress1X8BitExactly(dst, src) - } - var br bitReaderBytes - err := br.init(src) - if err != nil { - return dst, err - } - maxDecodedSize := cap(dst) - dst = dst[:0] - - // Avoid bounds check by always having full sized table. - dt := d.dt.single[:256] - - // Use temp table to avoid bound checks/append penalty. - bufs := d.buffer() - buf := &bufs[0] - var off uint8 - - switch d.actualTableLog { - case 8: - const shift = 0 - for br.off >= 4 { - br.fillFast() - v := dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+0] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+1] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+2] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+3] = uint8(v.entry >> 8) - - off += 4 - if off == 0 { - if len(dst)+256 > maxDecodedSize { - br.close() - d.bufs.Put(bufs) - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:]...) - } - } - case 7: - const shift = 8 - 7 - for br.off >= 4 { - br.fillFast() - v := dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+0] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+1] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+2] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+3] = uint8(v.entry >> 8) - - off += 4 - if off == 0 { - if len(dst)+256 > maxDecodedSize { - br.close() - d.bufs.Put(bufs) - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:]...) - } - } - case 6: - const shift = 8 - 6 - for br.off >= 4 { - br.fillFast() - v := dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+0] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+1] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+2] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+3] = uint8(v.entry >> 8) - - off += 4 - if off == 0 { - if len(dst)+256 > maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:]...) - } - } - case 5: - const shift = 8 - 5 - for br.off >= 4 { - br.fillFast() - v := dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+0] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+1] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+2] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+3] = uint8(v.entry >> 8) - - off += 4 - if off == 0 { - if len(dst)+256 > maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:]...) - } - } - case 4: - const shift = 8 - 4 - for br.off >= 4 { - br.fillFast() - v := dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+0] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+1] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+2] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+3] = uint8(v.entry >> 8) - - off += 4 - if off == 0 { - if len(dst)+256 > maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:]...) - } - } - case 3: - const shift = 8 - 3 - for br.off >= 4 { - br.fillFast() - v := dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+0] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+1] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+2] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+3] = uint8(v.entry >> 8) - - off += 4 - if off == 0 { - if len(dst)+256 > maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:]...) - } - } - case 2: - const shift = 8 - 2 - for br.off >= 4 { - br.fillFast() - v := dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+0] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+1] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+2] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+3] = uint8(v.entry >> 8) - - off += 4 - if off == 0 { - if len(dst)+256 > maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:]...) - } - } - case 1: - const shift = 8 - 1 - for br.off >= 4 { - br.fillFast() - v := dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+0] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+1] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+2] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>(56+shift))] - br.advance(uint8(v.entry)) - buf[off+3] = uint8(v.entry >> 8) - - off += 4 - if off == 0 { - if len(dst)+256 > maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:]...) - } - } - default: - d.bufs.Put(bufs) - return nil, fmt.Errorf("invalid tablelog: %d", d.actualTableLog) - } - - if len(dst)+int(off) > maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:off]...) - - // br < 4, so uint8 is fine - bitsLeft := int8(uint8(br.off)*8 + (64 - br.bitsRead)) - shift := (8 - d.actualTableLog) & 7 - - for bitsLeft > 0 { - if br.bitsRead >= 64-8 { - for br.off > 0 { - br.value |= uint64(br.in[br.off-1]) << (br.bitsRead - 8) - br.bitsRead -= 8 - br.off-- - } - } - if len(dst) >= maxDecodedSize { - br.close() - d.bufs.Put(bufs) - return nil, ErrMaxDecodedSizeExceeded - } - v := dt[br.peekByteFast()>>shift] - nBits := uint8(v.entry) - br.advance(nBits) - bitsLeft -= int8(nBits) - dst = append(dst, uint8(v.entry>>8)) - } - d.bufs.Put(bufs) - return dst, br.close() -} - -// decompress1X8Bit will decompress a 1X encoded stream with tablelog <= 8. -// The cap of the output buffer will be the maximum decompressed size. -// The length of the supplied input must match the end of a block exactly. -func (d *Decoder) decompress1X8BitExactly(dst, src []byte) ([]byte, error) { - var br bitReaderBytes - err := br.init(src) - if err != nil { - return dst, err - } - maxDecodedSize := cap(dst) - dst = dst[:0] - - // Avoid bounds check by always having full sized table. - dt := d.dt.single[:256] - - // Use temp table to avoid bound checks/append penalty. - bufs := d.buffer() - buf := &bufs[0] - var off uint8 - - const shift = 56 - - //fmt.Printf("mask: %b, tl:%d\n", mask, d.actualTableLog) - for br.off >= 4 { - br.fillFast() - v := dt[uint8(br.value>>shift)] - br.advance(uint8(v.entry)) - buf[off+0] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>shift)] - br.advance(uint8(v.entry)) - buf[off+1] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>shift)] - br.advance(uint8(v.entry)) - buf[off+2] = uint8(v.entry >> 8) - - v = dt[uint8(br.value>>shift)] - br.advance(uint8(v.entry)) - buf[off+3] = uint8(v.entry >> 8) - - off += 4 - if off == 0 { - if len(dst)+256 > maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:]...) - } - } - - if len(dst)+int(off) > maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:off]...) - - // br < 4, so uint8 is fine - bitsLeft := int8(uint8(br.off)*8 + (64 - br.bitsRead)) - for bitsLeft > 0 { - if br.bitsRead >= 64-8 { - for br.off > 0 { - br.value |= uint64(br.in[br.off-1]) << (br.bitsRead - 8) - br.bitsRead -= 8 - br.off-- - } - } - if len(dst) >= maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - v := dt[br.peekByteFast()] - nBits := uint8(v.entry) - br.advance(nBits) - bitsLeft -= int8(nBits) - dst = append(dst, uint8(v.entry>>8)) - } - d.bufs.Put(bufs) - return dst, br.close() -} - -// Decompress4X will decompress a 4X encoded stream. -// The length of the supplied input must match the end of a block exactly. -// The *capacity* of the dst slice must match the destination size of -// the uncompressed data exactly. -func (d *Decoder) decompress4X8bit(dst, src []byte) ([]byte, error) { - if d.actualTableLog == 8 { - return d.decompress4X8bitExactly(dst, src) - } - - var br [4]bitReaderBytes - start := 6 - for i := 0; i < 3; i++ { - length := int(src[i*2]) | (int(src[i*2+1]) << 8) - if start+length >= len(src) { - return nil, errors.New("truncated input (or invalid offset)") - } - err := br[i].init(src[start : start+length]) - if err != nil { - return nil, err - } - start += length - } - err := br[3].init(src[start:]) - if err != nil { - return nil, err - } - - // destination, offset to match first output - dstSize := cap(dst) - dst = dst[:dstSize] - out := dst - dstEvery := (dstSize + 3) / 4 - - shift := (56 + (8 - d.actualTableLog)) & 63 - - const tlSize = 1 << 8 - single := d.dt.single[:tlSize] - - // Use temp table to avoid bound checks/append penalty. - buf := d.buffer() - var off uint8 - var decoded int - - // Decode 4 values from each decoder/loop. - const bufoff = 256 - for { - if br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4 { - break - } - - { - // Interleave 2 decodes. - const stream = 0 - const stream2 = 1 - br1 := &br[stream] - br2 := &br[stream2] - br1.fillFast() - br2.fillFast() - - v := single[uint8(br1.value>>shift)].entry - v2 := single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off] = uint8(v >> 8) - buf[stream2][off] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+1] = uint8(v >> 8) - buf[stream2][off+1] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+2] = uint8(v >> 8) - buf[stream2][off+2] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+3] = uint8(v >> 8) - buf[stream2][off+3] = uint8(v2 >> 8) - } - - { - const stream = 2 - const stream2 = 3 - br1 := &br[stream] - br2 := &br[stream2] - br1.fillFast() - br2.fillFast() - - v := single[uint8(br1.value>>shift)].entry - v2 := single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off] = uint8(v >> 8) - buf[stream2][off] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+1] = uint8(v >> 8) - buf[stream2][off+1] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+2] = uint8(v >> 8) - buf[stream2][off+2] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+3] = uint8(v >> 8) - buf[stream2][off+3] = uint8(v2 >> 8) - } - - off += 4 - - if off == 0 { - if bufoff > dstEvery { - d.bufs.Put(buf) - return nil, errors.New("corruption detected: stream overrun 1") - } - // There must at least be 3 buffers left. - if len(out)-bufoff < dstEvery*3 { - d.bufs.Put(buf) - return nil, errors.New("corruption detected: stream overrun 2") - } - //copy(out, buf[0][:]) - //copy(out[dstEvery:], buf[1][:]) - //copy(out[dstEvery*2:], buf[2][:]) - *(*[bufoff]byte)(out) = buf[0] - *(*[bufoff]byte)(out[dstEvery:]) = buf[1] - *(*[bufoff]byte)(out[dstEvery*2:]) = buf[2] - *(*[bufoff]byte)(out[dstEvery*3:]) = buf[3] - out = out[bufoff:] - decoded += bufoff * 4 - } - } - if off > 0 { - ioff := int(off) - if len(out) < dstEvery*3+ioff { - d.bufs.Put(buf) - return nil, errors.New("corruption detected: stream overrun 3") - } - copy(out, buf[0][:off]) - copy(out[dstEvery:], buf[1][:off]) - copy(out[dstEvery*2:], buf[2][:off]) - copy(out[dstEvery*3:], buf[3][:off]) - decoded += int(off) * 4 - out = out[off:] - } - - // Decode remaining. - // Decode remaining. - remainBytes := dstEvery - (decoded / 4) - for i := range br { - offset := dstEvery * i - endsAt := offset + remainBytes - if endsAt > len(out) { - endsAt = len(out) - } - br := &br[i] - bitsLeft := br.remaining() - for bitsLeft > 0 { - if br.finished() { - d.bufs.Put(buf) - return nil, io.ErrUnexpectedEOF - } - if br.bitsRead >= 56 { - if br.off >= 4 { - v := br.in[br.off-4:] - v = v[:4] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - br.value |= uint64(low) << (br.bitsRead - 32) - br.bitsRead -= 32 - br.off -= 4 - } else { - for br.off > 0 { - br.value |= uint64(br.in[br.off-1]) << (br.bitsRead - 8) - br.bitsRead -= 8 - br.off-- - } - } - } - // end inline... - if offset >= endsAt { - d.bufs.Put(buf) - return nil, errors.New("corruption detected: stream overrun 4") - } - - // Read value and increment offset. - v := single[uint8(br.value>>shift)].entry - nBits := uint8(v) - br.advance(nBits) - bitsLeft -= uint(nBits) - out[offset] = uint8(v >> 8) - offset++ - } - if offset != endsAt { - d.bufs.Put(buf) - return nil, fmt.Errorf("corruption detected: short output block %d, end %d != %d", i, offset, endsAt) - } - decoded += offset - dstEvery*i - err = br.close() - if err != nil { - d.bufs.Put(buf) - return nil, err - } - } - d.bufs.Put(buf) - if dstSize != decoded { - return nil, errors.New("corruption detected: short output block") - } - return dst, nil -} - -// Decompress4X will decompress a 4X encoded stream. -// The length of the supplied input must match the end of a block exactly. -// The *capacity* of the dst slice must match the destination size of -// the uncompressed data exactly. -func (d *Decoder) decompress4X8bitExactly(dst, src []byte) ([]byte, error) { - var br [4]bitReaderBytes - start := 6 - for i := 0; i < 3; i++ { - length := int(src[i*2]) | (int(src[i*2+1]) << 8) - if start+length >= len(src) { - return nil, errors.New("truncated input (or invalid offset)") - } - err := br[i].init(src[start : start+length]) - if err != nil { - return nil, err - } - start += length - } - err := br[3].init(src[start:]) - if err != nil { - return nil, err - } - - // destination, offset to match first output - dstSize := cap(dst) - dst = dst[:dstSize] - out := dst - dstEvery := (dstSize + 3) / 4 - - const shift = 56 - const tlSize = 1 << 8 - single := d.dt.single[:tlSize] - - // Use temp table to avoid bound checks/append penalty. - buf := d.buffer() - var off uint8 - var decoded int - - // Decode 4 values from each decoder/loop. - const bufoff = 256 - for { - if br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4 { - break - } - - { - // Interleave 2 decodes. - const stream = 0 - const stream2 = 1 - br1 := &br[stream] - br2 := &br[stream2] - br1.fillFast() - br2.fillFast() - - v := single[uint8(br1.value>>shift)].entry - v2 := single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off] = uint8(v >> 8) - buf[stream2][off] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+1] = uint8(v >> 8) - buf[stream2][off+1] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+2] = uint8(v >> 8) - buf[stream2][off+2] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+3] = uint8(v >> 8) - buf[stream2][off+3] = uint8(v2 >> 8) - } - - { - const stream = 2 - const stream2 = 3 - br1 := &br[stream] - br2 := &br[stream2] - br1.fillFast() - br2.fillFast() - - v := single[uint8(br1.value>>shift)].entry - v2 := single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off] = uint8(v >> 8) - buf[stream2][off] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+1] = uint8(v >> 8) - buf[stream2][off+1] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+2] = uint8(v >> 8) - buf[stream2][off+2] = uint8(v2 >> 8) - - v = single[uint8(br1.value>>shift)].entry - v2 = single[uint8(br2.value>>shift)].entry - br1.bitsRead += uint8(v) - br1.value <<= v & 63 - br2.bitsRead += uint8(v2) - br2.value <<= v2 & 63 - buf[stream][off+3] = uint8(v >> 8) - buf[stream2][off+3] = uint8(v2 >> 8) - } - - off += 4 - - if off == 0 { - if bufoff > dstEvery { - d.bufs.Put(buf) - return nil, errors.New("corruption detected: stream overrun 1") - } - // There must at least be 3 buffers left. - if len(out)-bufoff < dstEvery*3 { - d.bufs.Put(buf) - return nil, errors.New("corruption detected: stream overrun 2") - } - - //copy(out, buf[0][:]) - //copy(out[dstEvery:], buf[1][:]) - //copy(out[dstEvery*2:], buf[2][:]) - // copy(out[dstEvery*3:], buf[3][:]) - *(*[bufoff]byte)(out) = buf[0] - *(*[bufoff]byte)(out[dstEvery:]) = buf[1] - *(*[bufoff]byte)(out[dstEvery*2:]) = buf[2] - *(*[bufoff]byte)(out[dstEvery*3:]) = buf[3] - out = out[bufoff:] - decoded += bufoff * 4 - } - } - if off > 0 { - ioff := int(off) - if len(out) < dstEvery*3+ioff { - return nil, errors.New("corruption detected: stream overrun 3") - } - copy(out, buf[0][:off]) - copy(out[dstEvery:], buf[1][:off]) - copy(out[dstEvery*2:], buf[2][:off]) - copy(out[dstEvery*3:], buf[3][:off]) - decoded += int(off) * 4 - out = out[off:] - } - - // Decode remaining. - remainBytes := dstEvery - (decoded / 4) - for i := range br { - offset := dstEvery * i - endsAt := offset + remainBytes - if endsAt > len(out) { - endsAt = len(out) - } - br := &br[i] - bitsLeft := br.remaining() - for bitsLeft > 0 { - if br.finished() { - d.bufs.Put(buf) - return nil, io.ErrUnexpectedEOF - } - if br.bitsRead >= 56 { - if br.off >= 4 { - v := br.in[br.off-4:] - v = v[:4] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - br.value |= uint64(low) << (br.bitsRead - 32) - br.bitsRead -= 32 - br.off -= 4 - } else { - for br.off > 0 { - br.value |= uint64(br.in[br.off-1]) << (br.bitsRead - 8) - br.bitsRead -= 8 - br.off-- - } - } - } - // end inline... - if offset >= endsAt { - d.bufs.Put(buf) - return nil, errors.New("corruption detected: stream overrun 4") - } - - // Read value and increment offset. - v := single[br.peekByteFast()].entry - nBits := uint8(v) - br.advance(nBits) - bitsLeft -= uint(nBits) - out[offset] = uint8(v >> 8) - offset++ - } - if offset != endsAt { - d.bufs.Put(buf) - return nil, fmt.Errorf("corruption detected: short output block %d, end %d != %d", i, offset, endsAt) - } - - decoded += offset - dstEvery*i - err = br.close() - if err != nil { - d.bufs.Put(buf) - return nil, err - } - } - d.bufs.Put(buf) - if dstSize != decoded { - return nil, errors.New("corruption detected: short output block") - } - return dst, nil -} - -// matches will compare a decoding table to a coding table. -// Errors are written to the writer. -// Nothing will be written if table is ok. -func (s *Scratch) matches(ct cTable, w io.Writer) { - if s == nil || len(s.dt.single) == 0 { - return - } - dt := s.dt.single[:1<>8) == byte(sym) { - fmt.Fprintf(w, "symbol %x has decoder, but no encoder\n", sym) - errs++ - break - } - } - if errs == 0 { - broken-- - } - continue - } - // Unused bits in input - ub := tablelog - enc.nBits - top := enc.val << ub - // decoder looks at top bits. - dec := dt[top] - if uint8(dec.entry) != enc.nBits { - fmt.Fprintf(w, "symbol 0x%x bit size mismatch (enc: %d, dec:%d).\n", sym, enc.nBits, uint8(dec.entry)) - errs++ - } - if uint8(dec.entry>>8) != uint8(sym) { - fmt.Fprintf(w, "symbol 0x%x decoder output mismatch (enc: %d, dec:%d).\n", sym, sym, uint8(dec.entry>>8)) - errs++ - } - if errs > 0 { - fmt.Fprintf(w, "%d errors in base, stopping\n", errs) - continue - } - // Ensure that all combinations are covered. - for i := uint16(0); i < (1 << ub); i++ { - vval := top | i - dec := dt[vval] - if uint8(dec.entry) != enc.nBits { - fmt.Fprintf(w, "symbol 0x%x bit size mismatch (enc: %d, dec:%d).\n", vval, enc.nBits, uint8(dec.entry)) - errs++ - } - if uint8(dec.entry>>8) != uint8(sym) { - fmt.Fprintf(w, "symbol 0x%x decoder output mismatch (enc: %d, dec:%d).\n", vval, sym, uint8(dec.entry>>8)) - errs++ - } - if errs > 20 { - fmt.Fprintf(w, "%d errors, stopping\n", errs) - break - } - } - if errs == 0 { - ok++ - broken-- - } - } - if broken > 0 { - fmt.Fprintf(w, "%d broken, %d ok\n", broken, ok) - } -} diff --git a/vendor/github.com/klauspost/compress/huff0/decompress_amd64.go b/vendor/github.com/klauspost/compress/huff0/decompress_amd64.go deleted file mode 100644 index ba7e8e6b02..0000000000 --- a/vendor/github.com/klauspost/compress/huff0/decompress_amd64.go +++ /dev/null @@ -1,226 +0,0 @@ -//go:build amd64 && !appengine && !noasm && gc -// +build amd64,!appengine,!noasm,gc - -// This file contains the specialisation of Decoder.Decompress4X -// and Decoder.Decompress1X that use an asm implementation of thir main loops. -package huff0 - -import ( - "errors" - "fmt" - - "github.com/klauspost/compress/internal/cpuinfo" -) - -// decompress4x_main_loop_x86 is an x86 assembler implementation -// of Decompress4X when tablelog > 8. -// -//go:noescape -func decompress4x_main_loop_amd64(ctx *decompress4xContext) - -// decompress4x_8b_loop_x86 is an x86 assembler implementation -// of Decompress4X when tablelog <= 8 which decodes 4 entries -// per loop. -// -//go:noescape -func decompress4x_8b_main_loop_amd64(ctx *decompress4xContext) - -// fallback8BitSize is the size where using Go version is faster. -const fallback8BitSize = 800 - -type decompress4xContext struct { - pbr *[4]bitReaderShifted - peekBits uint8 - out *byte - dstEvery int - tbl *dEntrySingle - decoded int - limit *byte -} - -// Decompress4X will decompress a 4X encoded stream. -// The length of the supplied input must match the end of a block exactly. -// The *capacity* of the dst slice must match the destination size of -// the uncompressed data exactly. -func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { - if len(d.dt.single) == 0 { - return nil, errors.New("no table loaded") - } - if len(src) < 6+(4*1) { - return nil, errors.New("input too small") - } - - use8BitTables := d.actualTableLog <= 8 - if cap(dst) < fallback8BitSize && use8BitTables { - return d.decompress4X8bit(dst, src) - } - - var br [4]bitReaderShifted - // Decode "jump table" - start := 6 - for i := 0; i < 3; i++ { - length := int(src[i*2]) | (int(src[i*2+1]) << 8) - if start+length >= len(src) { - return nil, errors.New("truncated input (or invalid offset)") - } - err := br[i].init(src[start : start+length]) - if err != nil { - return nil, err - } - start += length - } - err := br[3].init(src[start:]) - if err != nil { - return nil, err - } - - // destination, offset to match first output - dstSize := cap(dst) - dst = dst[:dstSize] - out := dst - dstEvery := (dstSize + 3) / 4 - - const tlSize = 1 << tableLogMax - const tlMask = tlSize - 1 - single := d.dt.single[:tlSize] - - var decoded int - - if len(out) > 4*4 && !(br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4) { - ctx := decompress4xContext{ - pbr: &br, - peekBits: uint8((64 - d.actualTableLog) & 63), // see: bitReaderShifted.peekBitsFast() - out: &out[0], - dstEvery: dstEvery, - tbl: &single[0], - limit: &out[dstEvery-4], // Always stop decoding when first buffer gets here to avoid writing OOB on last. - } - if use8BitTables { - decompress4x_8b_main_loop_amd64(&ctx) - } else { - decompress4x_main_loop_amd64(&ctx) - } - - decoded = ctx.decoded - out = out[decoded/4:] - } - - // Decode remaining. - remainBytes := dstEvery - (decoded / 4) - for i := range br { - offset := dstEvery * i - endsAt := offset + remainBytes - if endsAt > len(out) { - endsAt = len(out) - } - br := &br[i] - bitsLeft := br.remaining() - for bitsLeft > 0 { - br.fill() - if offset >= endsAt { - return nil, errors.New("corruption detected: stream overrun 4") - } - - // Read value and increment offset. - val := br.peekBitsFast(d.actualTableLog) - v := single[val&tlMask].entry - nBits := uint8(v) - br.advance(nBits) - bitsLeft -= uint(nBits) - out[offset] = uint8(v >> 8) - offset++ - } - if offset != endsAt { - return nil, fmt.Errorf("corruption detected: short output block %d, end %d != %d", i, offset, endsAt) - } - decoded += offset - dstEvery*i - err = br.close() - if err != nil { - return nil, err - } - } - if dstSize != decoded { - return nil, errors.New("corruption detected: short output block") - } - return dst, nil -} - -// decompress4x_main_loop_x86 is an x86 assembler implementation -// of Decompress1X when tablelog > 8. -// -//go:noescape -func decompress1x_main_loop_amd64(ctx *decompress1xContext) - -// decompress4x_main_loop_x86 is an x86 with BMI2 assembler implementation -// of Decompress1X when tablelog > 8. -// -//go:noescape -func decompress1x_main_loop_bmi2(ctx *decompress1xContext) - -type decompress1xContext struct { - pbr *bitReaderShifted - peekBits uint8 - out *byte - outCap int - tbl *dEntrySingle - decoded int -} - -// Error reported by asm implementations -const error_max_decoded_size_exeeded = -1 - -// Decompress1X will decompress a 1X encoded stream. -// The cap of the output buffer will be the maximum decompressed size. -// The length of the supplied input must match the end of a block exactly. -func (d *Decoder) Decompress1X(dst, src []byte) ([]byte, error) { - if len(d.dt.single) == 0 { - return nil, errors.New("no table loaded") - } - var br bitReaderShifted - err := br.init(src) - if err != nil { - return dst, err - } - maxDecodedSize := cap(dst) - dst = dst[:maxDecodedSize] - - const tlSize = 1 << tableLogMax - const tlMask = tlSize - 1 - - if maxDecodedSize >= 4 { - ctx := decompress1xContext{ - pbr: &br, - out: &dst[0], - outCap: maxDecodedSize, - peekBits: uint8((64 - d.actualTableLog) & 63), // see: bitReaderShifted.peekBitsFast() - tbl: &d.dt.single[0], - } - - if cpuinfo.HasBMI2() { - decompress1x_main_loop_bmi2(&ctx) - } else { - decompress1x_main_loop_amd64(&ctx) - } - if ctx.decoded == error_max_decoded_size_exeeded { - return nil, ErrMaxDecodedSizeExceeded - } - - dst = dst[:ctx.decoded] - } - - // br < 8, so uint8 is fine - bitsLeft := uint8(br.off)*8 + 64 - br.bitsRead - for bitsLeft > 0 { - br.fill() - if len(dst) >= maxDecodedSize { - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - v := d.dt.single[br.peekBitsFast(d.actualTableLog)&tlMask] - nBits := uint8(v.entry) - br.advance(nBits) - bitsLeft -= nBits - dst = append(dst, uint8(v.entry>>8)) - } - return dst, br.close() -} diff --git a/vendor/github.com/klauspost/compress/huff0/decompress_amd64.s b/vendor/github.com/klauspost/compress/huff0/decompress_amd64.s deleted file mode 100644 index c4c7ab2d1f..0000000000 --- a/vendor/github.com/klauspost/compress/huff0/decompress_amd64.s +++ /dev/null @@ -1,830 +0,0 @@ -// Code generated by command: go run gen.go -out ../decompress_amd64.s -pkg=huff0. DO NOT EDIT. - -//go:build amd64 && !appengine && !noasm && gc - -// func decompress4x_main_loop_amd64(ctx *decompress4xContext) -TEXT ·decompress4x_main_loop_amd64(SB), $0-8 - // Preload values - MOVQ ctx+0(FP), AX - MOVBQZX 8(AX), DI - MOVQ 16(AX), BX - MOVQ 48(AX), SI - MOVQ 24(AX), R8 - MOVQ 32(AX), R9 - MOVQ (AX), R10 - - // Main loop -main_loop: - XORL DX, DX - CMPQ BX, SI - SETGE DL - - // br0.fillFast32() - MOVQ 32(R10), R11 - MOVBQZX 40(R10), R12 - CMPQ R12, $0x20 - JBE skip_fill0 - MOVQ 24(R10), AX - SUBQ $0x20, R12 - SUBQ $0x04, AX - MOVQ (R10), R13 - - // b.value |= uint64(low) << (b.bitsRead & 63) - MOVL (AX)(R13*1), R13 - MOVQ R12, CX - SHLQ CL, R13 - MOVQ AX, 24(R10) - ORQ R13, R11 - - // exhausted += (br0.off < 4) - CMPQ AX, $0x04 - ADCB $+0, DL - -skip_fill0: - // val0 := br0.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v0 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br0.advance(uint8(v0.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - - // val1 := br0.peekTopBits(peekBits) - MOVQ DI, CX - MOVQ R11, R13 - SHRQ CL, R13 - - // v1 := table[val1&mask] - MOVW (R9)(R13*2), CX - - // br0.advance(uint8(v1.entry)) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - - // these two writes get coalesced - // out[id * dstEvery + 0] = uint8(v0.entry >> 8) - // out[id * dstEvery + 1] = uint8(v1.entry >> 8) - MOVW AX, (BX) - - // update the bitreader structure - MOVQ R11, 32(R10) - MOVB R12, 40(R10) - - // br1.fillFast32() - MOVQ 80(R10), R11 - MOVBQZX 88(R10), R12 - CMPQ R12, $0x20 - JBE skip_fill1 - MOVQ 72(R10), AX - SUBQ $0x20, R12 - SUBQ $0x04, AX - MOVQ 48(R10), R13 - - // b.value |= uint64(low) << (b.bitsRead & 63) - MOVL (AX)(R13*1), R13 - MOVQ R12, CX - SHLQ CL, R13 - MOVQ AX, 72(R10) - ORQ R13, R11 - - // exhausted += (br1.off < 4) - CMPQ AX, $0x04 - ADCB $+0, DL - -skip_fill1: - // val0 := br1.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v0 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br1.advance(uint8(v0.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - - // val1 := br1.peekTopBits(peekBits) - MOVQ DI, CX - MOVQ R11, R13 - SHRQ CL, R13 - - // v1 := table[val1&mask] - MOVW (R9)(R13*2), CX - - // br1.advance(uint8(v1.entry)) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - - // these two writes get coalesced - // out[id * dstEvery + 0] = uint8(v0.entry >> 8) - // out[id * dstEvery + 1] = uint8(v1.entry >> 8) - MOVW AX, (BX)(R8*1) - - // update the bitreader structure - MOVQ R11, 80(R10) - MOVB R12, 88(R10) - - // br2.fillFast32() - MOVQ 128(R10), R11 - MOVBQZX 136(R10), R12 - CMPQ R12, $0x20 - JBE skip_fill2 - MOVQ 120(R10), AX - SUBQ $0x20, R12 - SUBQ $0x04, AX - MOVQ 96(R10), R13 - - // b.value |= uint64(low) << (b.bitsRead & 63) - MOVL (AX)(R13*1), R13 - MOVQ R12, CX - SHLQ CL, R13 - MOVQ AX, 120(R10) - ORQ R13, R11 - - // exhausted += (br2.off < 4) - CMPQ AX, $0x04 - ADCB $+0, DL - -skip_fill2: - // val0 := br2.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v0 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br2.advance(uint8(v0.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - - // val1 := br2.peekTopBits(peekBits) - MOVQ DI, CX - MOVQ R11, R13 - SHRQ CL, R13 - - // v1 := table[val1&mask] - MOVW (R9)(R13*2), CX - - // br2.advance(uint8(v1.entry)) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - - // these two writes get coalesced - // out[id * dstEvery + 0] = uint8(v0.entry >> 8) - // out[id * dstEvery + 1] = uint8(v1.entry >> 8) - MOVW AX, (BX)(R8*2) - - // update the bitreader structure - MOVQ R11, 128(R10) - MOVB R12, 136(R10) - - // br3.fillFast32() - MOVQ 176(R10), R11 - MOVBQZX 184(R10), R12 - CMPQ R12, $0x20 - JBE skip_fill3 - MOVQ 168(R10), AX - SUBQ $0x20, R12 - SUBQ $0x04, AX - MOVQ 144(R10), R13 - - // b.value |= uint64(low) << (b.bitsRead & 63) - MOVL (AX)(R13*1), R13 - MOVQ R12, CX - SHLQ CL, R13 - MOVQ AX, 168(R10) - ORQ R13, R11 - - // exhausted += (br3.off < 4) - CMPQ AX, $0x04 - ADCB $+0, DL - -skip_fill3: - // val0 := br3.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v0 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br3.advance(uint8(v0.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - - // val1 := br3.peekTopBits(peekBits) - MOVQ DI, CX - MOVQ R11, R13 - SHRQ CL, R13 - - // v1 := table[val1&mask] - MOVW (R9)(R13*2), CX - - // br3.advance(uint8(v1.entry)) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - - // these two writes get coalesced - // out[id * dstEvery + 0] = uint8(v0.entry >> 8) - // out[id * dstEvery + 1] = uint8(v1.entry >> 8) - LEAQ (R8)(R8*2), CX - MOVW AX, (BX)(CX*1) - - // update the bitreader structure - MOVQ R11, 176(R10) - MOVB R12, 184(R10) - ADDQ $0x02, BX - TESTB DL, DL - JZ main_loop - MOVQ ctx+0(FP), AX - SUBQ 16(AX), BX - SHLQ $0x02, BX - MOVQ BX, 40(AX) - RET - -// func decompress4x_8b_main_loop_amd64(ctx *decompress4xContext) -TEXT ·decompress4x_8b_main_loop_amd64(SB), $0-8 - // Preload values - MOVQ ctx+0(FP), CX - MOVBQZX 8(CX), DI - MOVQ 16(CX), BX - MOVQ 48(CX), SI - MOVQ 24(CX), R8 - MOVQ 32(CX), R9 - MOVQ (CX), R10 - - // Main loop -main_loop: - XORL DX, DX - CMPQ BX, SI - SETGE DL - - // br0.fillFast32() - MOVQ 32(R10), R11 - MOVBQZX 40(R10), R12 - CMPQ R12, $0x20 - JBE skip_fill0 - MOVQ 24(R10), R13 - SUBQ $0x20, R12 - SUBQ $0x04, R13 - MOVQ (R10), R14 - - // b.value |= uint64(low) << (b.bitsRead & 63) - MOVL (R13)(R14*1), R14 - MOVQ R12, CX - SHLQ CL, R14 - MOVQ R13, 24(R10) - ORQ R14, R11 - - // exhausted += (br0.off < 4) - CMPQ R13, $0x04 - ADCB $+0, DL - -skip_fill0: - // val0 := br0.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v0 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br0.advance(uint8(v0.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - - // val1 := br0.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v1 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br0.advance(uint8(v1.entry) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - BSWAPL AX - - // val2 := br0.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v2 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br0.advance(uint8(v2.entry) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - - // val3 := br0.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v3 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br0.advance(uint8(v3.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - BSWAPL AX - - // these four writes get coalesced - // out[id * dstEvery + 0] = uint8(v0.entry >> 8) - // out[id * dstEvery + 1] = uint8(v1.entry >> 8) - // out[id * dstEvery + 3] = uint8(v2.entry >> 8) - // out[id * dstEvery + 4] = uint8(v3.entry >> 8) - MOVL AX, (BX) - - // update the bitreader structure - MOVQ R11, 32(R10) - MOVB R12, 40(R10) - - // br1.fillFast32() - MOVQ 80(R10), R11 - MOVBQZX 88(R10), R12 - CMPQ R12, $0x20 - JBE skip_fill1 - MOVQ 72(R10), R13 - SUBQ $0x20, R12 - SUBQ $0x04, R13 - MOVQ 48(R10), R14 - - // b.value |= uint64(low) << (b.bitsRead & 63) - MOVL (R13)(R14*1), R14 - MOVQ R12, CX - SHLQ CL, R14 - MOVQ R13, 72(R10) - ORQ R14, R11 - - // exhausted += (br1.off < 4) - CMPQ R13, $0x04 - ADCB $+0, DL - -skip_fill1: - // val0 := br1.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v0 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br1.advance(uint8(v0.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - - // val1 := br1.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v1 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br1.advance(uint8(v1.entry) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - BSWAPL AX - - // val2 := br1.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v2 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br1.advance(uint8(v2.entry) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - - // val3 := br1.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v3 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br1.advance(uint8(v3.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - BSWAPL AX - - // these four writes get coalesced - // out[id * dstEvery + 0] = uint8(v0.entry >> 8) - // out[id * dstEvery + 1] = uint8(v1.entry >> 8) - // out[id * dstEvery + 3] = uint8(v2.entry >> 8) - // out[id * dstEvery + 4] = uint8(v3.entry >> 8) - MOVL AX, (BX)(R8*1) - - // update the bitreader structure - MOVQ R11, 80(R10) - MOVB R12, 88(R10) - - // br2.fillFast32() - MOVQ 128(R10), R11 - MOVBQZX 136(R10), R12 - CMPQ R12, $0x20 - JBE skip_fill2 - MOVQ 120(R10), R13 - SUBQ $0x20, R12 - SUBQ $0x04, R13 - MOVQ 96(R10), R14 - - // b.value |= uint64(low) << (b.bitsRead & 63) - MOVL (R13)(R14*1), R14 - MOVQ R12, CX - SHLQ CL, R14 - MOVQ R13, 120(R10) - ORQ R14, R11 - - // exhausted += (br2.off < 4) - CMPQ R13, $0x04 - ADCB $+0, DL - -skip_fill2: - // val0 := br2.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v0 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br2.advance(uint8(v0.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - - // val1 := br2.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v1 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br2.advance(uint8(v1.entry) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - BSWAPL AX - - // val2 := br2.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v2 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br2.advance(uint8(v2.entry) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - - // val3 := br2.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v3 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br2.advance(uint8(v3.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - BSWAPL AX - - // these four writes get coalesced - // out[id * dstEvery + 0] = uint8(v0.entry >> 8) - // out[id * dstEvery + 1] = uint8(v1.entry >> 8) - // out[id * dstEvery + 3] = uint8(v2.entry >> 8) - // out[id * dstEvery + 4] = uint8(v3.entry >> 8) - MOVL AX, (BX)(R8*2) - - // update the bitreader structure - MOVQ R11, 128(R10) - MOVB R12, 136(R10) - - // br3.fillFast32() - MOVQ 176(R10), R11 - MOVBQZX 184(R10), R12 - CMPQ R12, $0x20 - JBE skip_fill3 - MOVQ 168(R10), R13 - SUBQ $0x20, R12 - SUBQ $0x04, R13 - MOVQ 144(R10), R14 - - // b.value |= uint64(low) << (b.bitsRead & 63) - MOVL (R13)(R14*1), R14 - MOVQ R12, CX - SHLQ CL, R14 - MOVQ R13, 168(R10) - ORQ R14, R11 - - // exhausted += (br3.off < 4) - CMPQ R13, $0x04 - ADCB $+0, DL - -skip_fill3: - // val0 := br3.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v0 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br3.advance(uint8(v0.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - - // val1 := br3.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v1 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br3.advance(uint8(v1.entry) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - BSWAPL AX - - // val2 := br3.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v2 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br3.advance(uint8(v2.entry) - MOVB CH, AH - SHLQ CL, R11 - ADDB CL, R12 - - // val3 := br3.peekTopBits(peekBits) - MOVQ R11, R13 - MOVQ DI, CX - SHRQ CL, R13 - - // v3 := table[val0&mask] - MOVW (R9)(R13*2), CX - - // br3.advance(uint8(v3.entry) - MOVB CH, AL - SHLQ CL, R11 - ADDB CL, R12 - BSWAPL AX - - // these four writes get coalesced - // out[id * dstEvery + 0] = uint8(v0.entry >> 8) - // out[id * dstEvery + 1] = uint8(v1.entry >> 8) - // out[id * dstEvery + 3] = uint8(v2.entry >> 8) - // out[id * dstEvery + 4] = uint8(v3.entry >> 8) - LEAQ (R8)(R8*2), CX - MOVL AX, (BX)(CX*1) - - // update the bitreader structure - MOVQ R11, 176(R10) - MOVB R12, 184(R10) - ADDQ $0x04, BX - TESTB DL, DL - JZ main_loop - MOVQ ctx+0(FP), AX - SUBQ 16(AX), BX - SHLQ $0x02, BX - MOVQ BX, 40(AX) - RET - -// func decompress1x_main_loop_amd64(ctx *decompress1xContext) -TEXT ·decompress1x_main_loop_amd64(SB), $0-8 - MOVQ ctx+0(FP), CX - MOVQ 16(CX), DX - MOVQ 24(CX), BX - CMPQ BX, $0x04 - JB error_max_decoded_size_exceeded - LEAQ (DX)(BX*1), BX - MOVQ (CX), SI - MOVQ (SI), R8 - MOVQ 24(SI), R9 - MOVQ 32(SI), R10 - MOVBQZX 40(SI), R11 - MOVQ 32(CX), SI - MOVBQZX 8(CX), DI - JMP loop_condition - -main_loop: - // Check if we have room for 4 bytes in the output buffer - LEAQ 4(DX), CX - CMPQ CX, BX - JGE error_max_decoded_size_exceeded - - // Decode 4 values - CMPQ R11, $0x20 - JL bitReader_fillFast_1_end - SUBQ $0x20, R11 - SUBQ $0x04, R9 - MOVL (R8)(R9*1), R12 - MOVQ R11, CX - SHLQ CL, R12 - ORQ R12, R10 - -bitReader_fillFast_1_end: - MOVQ DI, CX - MOVQ R10, R12 - SHRQ CL, R12 - MOVW (SI)(R12*2), CX - MOVB CH, AL - MOVBQZX CL, CX - ADDQ CX, R11 - SHLQ CL, R10 - MOVQ DI, CX - MOVQ R10, R12 - SHRQ CL, R12 - MOVW (SI)(R12*2), CX - MOVB CH, AH - MOVBQZX CL, CX - ADDQ CX, R11 - SHLQ CL, R10 - BSWAPL AX - CMPQ R11, $0x20 - JL bitReader_fillFast_2_end - SUBQ $0x20, R11 - SUBQ $0x04, R9 - MOVL (R8)(R9*1), R12 - MOVQ R11, CX - SHLQ CL, R12 - ORQ R12, R10 - -bitReader_fillFast_2_end: - MOVQ DI, CX - MOVQ R10, R12 - SHRQ CL, R12 - MOVW (SI)(R12*2), CX - MOVB CH, AH - MOVBQZX CL, CX - ADDQ CX, R11 - SHLQ CL, R10 - MOVQ DI, CX - MOVQ R10, R12 - SHRQ CL, R12 - MOVW (SI)(R12*2), CX - MOVB CH, AL - MOVBQZX CL, CX - ADDQ CX, R11 - SHLQ CL, R10 - BSWAPL AX - - // Store the decoded values - MOVL AX, (DX) - ADDQ $0x04, DX - -loop_condition: - CMPQ R9, $0x08 - JGE main_loop - - // Update ctx structure - MOVQ ctx+0(FP), AX - SUBQ 16(AX), DX - MOVQ DX, 40(AX) - MOVQ (AX), AX - MOVQ R9, 24(AX) - MOVQ R10, 32(AX) - MOVB R11, 40(AX) - RET - - // Report error -error_max_decoded_size_exceeded: - MOVQ ctx+0(FP), AX - MOVQ $-1, CX - MOVQ CX, 40(AX) - RET - -// func decompress1x_main_loop_bmi2(ctx *decompress1xContext) -// Requires: BMI2 -TEXT ·decompress1x_main_loop_bmi2(SB), $0-8 - MOVQ ctx+0(FP), CX - MOVQ 16(CX), DX - MOVQ 24(CX), BX - CMPQ BX, $0x04 - JB error_max_decoded_size_exceeded - LEAQ (DX)(BX*1), BX - MOVQ (CX), SI - MOVQ (SI), R8 - MOVQ 24(SI), R9 - MOVQ 32(SI), R10 - MOVBQZX 40(SI), R11 - MOVQ 32(CX), SI - MOVBQZX 8(CX), DI - JMP loop_condition - -main_loop: - // Check if we have room for 4 bytes in the output buffer - LEAQ 4(DX), CX - CMPQ CX, BX - JGE error_max_decoded_size_exceeded - - // Decode 4 values - CMPQ R11, $0x20 - JL bitReader_fillFast_1_end - SUBQ $0x20, R11 - SUBQ $0x04, R9 - MOVL (R8)(R9*1), CX - SHLXQ R11, CX, CX - ORQ CX, R10 - -bitReader_fillFast_1_end: - SHRXQ DI, R10, CX - MOVW (SI)(CX*2), CX - MOVB CH, AL - MOVBQZX CL, CX - ADDQ CX, R11 - SHLXQ CX, R10, R10 - SHRXQ DI, R10, CX - MOVW (SI)(CX*2), CX - MOVB CH, AH - MOVBQZX CL, CX - ADDQ CX, R11 - SHLXQ CX, R10, R10 - BSWAPL AX - CMPQ R11, $0x20 - JL bitReader_fillFast_2_end - SUBQ $0x20, R11 - SUBQ $0x04, R9 - MOVL (R8)(R9*1), CX - SHLXQ R11, CX, CX - ORQ CX, R10 - -bitReader_fillFast_2_end: - SHRXQ DI, R10, CX - MOVW (SI)(CX*2), CX - MOVB CH, AH - MOVBQZX CL, CX - ADDQ CX, R11 - SHLXQ CX, R10, R10 - SHRXQ DI, R10, CX - MOVW (SI)(CX*2), CX - MOVB CH, AL - MOVBQZX CL, CX - ADDQ CX, R11 - SHLXQ CX, R10, R10 - BSWAPL AX - - // Store the decoded values - MOVL AX, (DX) - ADDQ $0x04, DX - -loop_condition: - CMPQ R9, $0x08 - JGE main_loop - - // Update ctx structure - MOVQ ctx+0(FP), AX - SUBQ 16(AX), DX - MOVQ DX, 40(AX) - MOVQ (AX), AX - MOVQ R9, 24(AX) - MOVQ R10, 32(AX) - MOVB R11, 40(AX) - RET - - // Report error -error_max_decoded_size_exceeded: - MOVQ ctx+0(FP), AX - MOVQ $-1, CX - MOVQ CX, 40(AX) - RET diff --git a/vendor/github.com/klauspost/compress/huff0/decompress_generic.go b/vendor/github.com/klauspost/compress/huff0/decompress_generic.go deleted file mode 100644 index 908c17de63..0000000000 --- a/vendor/github.com/klauspost/compress/huff0/decompress_generic.go +++ /dev/null @@ -1,299 +0,0 @@ -//go:build !amd64 || appengine || !gc || noasm -// +build !amd64 appengine !gc noasm - -// This file contains a generic implementation of Decoder.Decompress4X. -package huff0 - -import ( - "errors" - "fmt" -) - -// Decompress4X will decompress a 4X encoded stream. -// The length of the supplied input must match the end of a block exactly. -// The *capacity* of the dst slice must match the destination size of -// the uncompressed data exactly. -func (d *Decoder) Decompress4X(dst, src []byte) ([]byte, error) { - if len(d.dt.single) == 0 { - return nil, errors.New("no table loaded") - } - if len(src) < 6+(4*1) { - return nil, errors.New("input too small") - } - if use8BitTables && d.actualTableLog <= 8 { - return d.decompress4X8bit(dst, src) - } - - var br [4]bitReaderShifted - // Decode "jump table" - start := 6 - for i := 0; i < 3; i++ { - length := int(src[i*2]) | (int(src[i*2+1]) << 8) - if start+length >= len(src) { - return nil, errors.New("truncated input (or invalid offset)") - } - err := br[i].init(src[start : start+length]) - if err != nil { - return nil, err - } - start += length - } - err := br[3].init(src[start:]) - if err != nil { - return nil, err - } - - // destination, offset to match first output - dstSize := cap(dst) - dst = dst[:dstSize] - out := dst - dstEvery := (dstSize + 3) / 4 - - const tlSize = 1 << tableLogMax - const tlMask = tlSize - 1 - single := d.dt.single[:tlSize] - - // Use temp table to avoid bound checks/append penalty. - buf := d.buffer() - var off uint8 - var decoded int - - // Decode 2 values from each decoder/loop. - const bufoff = 256 - for { - if br[0].off < 4 || br[1].off < 4 || br[2].off < 4 || br[3].off < 4 { - break - } - - { - const stream = 0 - const stream2 = 1 - br[stream].fillFast() - br[stream2].fillFast() - - val := br[stream].peekBitsFast(d.actualTableLog) - val2 := br[stream2].peekBitsFast(d.actualTableLog) - v := single[val&tlMask] - v2 := single[val2&tlMask] - br[stream].advance(uint8(v.entry)) - br[stream2].advance(uint8(v2.entry)) - buf[stream][off] = uint8(v.entry >> 8) - buf[stream2][off] = uint8(v2.entry >> 8) - - val = br[stream].peekBitsFast(d.actualTableLog) - val2 = br[stream2].peekBitsFast(d.actualTableLog) - v = single[val&tlMask] - v2 = single[val2&tlMask] - br[stream].advance(uint8(v.entry)) - br[stream2].advance(uint8(v2.entry)) - buf[stream][off+1] = uint8(v.entry >> 8) - buf[stream2][off+1] = uint8(v2.entry >> 8) - } - - { - const stream = 2 - const stream2 = 3 - br[stream].fillFast() - br[stream2].fillFast() - - val := br[stream].peekBitsFast(d.actualTableLog) - val2 := br[stream2].peekBitsFast(d.actualTableLog) - v := single[val&tlMask] - v2 := single[val2&tlMask] - br[stream].advance(uint8(v.entry)) - br[stream2].advance(uint8(v2.entry)) - buf[stream][off] = uint8(v.entry >> 8) - buf[stream2][off] = uint8(v2.entry >> 8) - - val = br[stream].peekBitsFast(d.actualTableLog) - val2 = br[stream2].peekBitsFast(d.actualTableLog) - v = single[val&tlMask] - v2 = single[val2&tlMask] - br[stream].advance(uint8(v.entry)) - br[stream2].advance(uint8(v2.entry)) - buf[stream][off+1] = uint8(v.entry >> 8) - buf[stream2][off+1] = uint8(v2.entry >> 8) - } - - off += 2 - - if off == 0 { - if bufoff > dstEvery { - d.bufs.Put(buf) - return nil, errors.New("corruption detected: stream overrun 1") - } - // There must at least be 3 buffers left. - if len(out)-bufoff < dstEvery*3 { - d.bufs.Put(buf) - return nil, errors.New("corruption detected: stream overrun 2") - } - //copy(out, buf[0][:]) - //copy(out[dstEvery:], buf[1][:]) - //copy(out[dstEvery*2:], buf[2][:]) - //copy(out[dstEvery*3:], buf[3][:]) - *(*[bufoff]byte)(out) = buf[0] - *(*[bufoff]byte)(out[dstEvery:]) = buf[1] - *(*[bufoff]byte)(out[dstEvery*2:]) = buf[2] - *(*[bufoff]byte)(out[dstEvery*3:]) = buf[3] - out = out[bufoff:] - decoded += bufoff * 4 - } - } - if off > 0 { - ioff := int(off) - if len(out) < dstEvery*3+ioff { - d.bufs.Put(buf) - return nil, errors.New("corruption detected: stream overrun 3") - } - copy(out, buf[0][:off]) - copy(out[dstEvery:], buf[1][:off]) - copy(out[dstEvery*2:], buf[2][:off]) - copy(out[dstEvery*3:], buf[3][:off]) - decoded += int(off) * 4 - out = out[off:] - } - - // Decode remaining. - remainBytes := dstEvery - (decoded / 4) - for i := range br { - offset := dstEvery * i - endsAt := offset + remainBytes - if endsAt > len(out) { - endsAt = len(out) - } - br := &br[i] - bitsLeft := br.remaining() - for bitsLeft > 0 { - br.fill() - if offset >= endsAt { - d.bufs.Put(buf) - return nil, errors.New("corruption detected: stream overrun 4") - } - - // Read value and increment offset. - val := br.peekBitsFast(d.actualTableLog) - v := single[val&tlMask].entry - nBits := uint8(v) - br.advance(nBits) - bitsLeft -= uint(nBits) - out[offset] = uint8(v >> 8) - offset++ - } - if offset != endsAt { - d.bufs.Put(buf) - return nil, fmt.Errorf("corruption detected: short output block %d, end %d != %d", i, offset, endsAt) - } - decoded += offset - dstEvery*i - err = br.close() - if err != nil { - return nil, err - } - } - d.bufs.Put(buf) - if dstSize != decoded { - return nil, errors.New("corruption detected: short output block") - } - return dst, nil -} - -// Decompress1X will decompress a 1X encoded stream. -// The cap of the output buffer will be the maximum decompressed size. -// The length of the supplied input must match the end of a block exactly. -func (d *Decoder) Decompress1X(dst, src []byte) ([]byte, error) { - if len(d.dt.single) == 0 { - return nil, errors.New("no table loaded") - } - if use8BitTables && d.actualTableLog <= 8 { - return d.decompress1X8Bit(dst, src) - } - var br bitReaderShifted - err := br.init(src) - if err != nil { - return dst, err - } - maxDecodedSize := cap(dst) - dst = dst[:0] - - // Avoid bounds check by always having full sized table. - const tlSize = 1 << tableLogMax - const tlMask = tlSize - 1 - dt := d.dt.single[:tlSize] - - // Use temp table to avoid bound checks/append penalty. - bufs := d.buffer() - buf := &bufs[0] - var off uint8 - - for br.off >= 8 { - br.fillFast() - v := dt[br.peekBitsFast(d.actualTableLog)&tlMask] - br.advance(uint8(v.entry)) - buf[off+0] = uint8(v.entry >> 8) - - v = dt[br.peekBitsFast(d.actualTableLog)&tlMask] - br.advance(uint8(v.entry)) - buf[off+1] = uint8(v.entry >> 8) - - // Refill - br.fillFast() - - v = dt[br.peekBitsFast(d.actualTableLog)&tlMask] - br.advance(uint8(v.entry)) - buf[off+2] = uint8(v.entry >> 8) - - v = dt[br.peekBitsFast(d.actualTableLog)&tlMask] - br.advance(uint8(v.entry)) - buf[off+3] = uint8(v.entry >> 8) - - off += 4 - if off == 0 { - if len(dst)+256 > maxDecodedSize { - br.close() - d.bufs.Put(bufs) - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:]...) - } - } - - if len(dst)+int(off) > maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - dst = append(dst, buf[:off]...) - - // br < 8, so uint8 is fine - bitsLeft := uint8(br.off)*8 + 64 - br.bitsRead - for bitsLeft > 0 { - br.fill() - if false && br.bitsRead >= 32 { - if br.off >= 4 { - v := br.in[br.off-4:] - v = v[:4] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - br.value = (br.value << 32) | uint64(low) - br.bitsRead -= 32 - br.off -= 4 - } else { - for br.off > 0 { - br.value = (br.value << 8) | uint64(br.in[br.off-1]) - br.bitsRead -= 8 - br.off-- - } - } - } - if len(dst) >= maxDecodedSize { - d.bufs.Put(bufs) - br.close() - return nil, ErrMaxDecodedSizeExceeded - } - v := d.dt.single[br.peekBitsFast(d.actualTableLog)&tlMask] - nBits := uint8(v.entry) - br.advance(nBits) - bitsLeft -= nBits - dst = append(dst, uint8(v.entry>>8)) - } - d.bufs.Put(bufs) - return dst, br.close() -} diff --git a/vendor/github.com/klauspost/compress/huff0/huff0.go b/vendor/github.com/klauspost/compress/huff0/huff0.go deleted file mode 100644 index 77ecd68e0a..0000000000 --- a/vendor/github.com/klauspost/compress/huff0/huff0.go +++ /dev/null @@ -1,337 +0,0 @@ -// Package huff0 provides fast huffman encoding as used in zstd. -// -// See README.md at https://github.com/klauspost/compress/tree/master/huff0 for details. -package huff0 - -import ( - "errors" - "fmt" - "math" - "math/bits" - "sync" - - "github.com/klauspost/compress/fse" -) - -const ( - maxSymbolValue = 255 - - // zstandard limits tablelog to 11, see: - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#huffman-tree-description - tableLogMax = 11 - tableLogDefault = 11 - minTablelog = 5 - huffNodesLen = 512 - - // BlockSizeMax is maximum input size for a single block uncompressed. - BlockSizeMax = 1<<18 - 1 -) - -var ( - // ErrIncompressible is returned when input is judged to be too hard to compress. - ErrIncompressible = errors.New("input is not compressible") - - // ErrUseRLE is returned from the compressor when the input is a single byte value repeated. - ErrUseRLE = errors.New("input is single value repeated") - - // ErrTooBig is return if input is too large for a single block. - ErrTooBig = errors.New("input too big") - - // ErrMaxDecodedSizeExceeded is return if input is too large for a single block. - ErrMaxDecodedSizeExceeded = errors.New("maximum output size exceeded") -) - -type ReusePolicy uint8 - -const ( - // ReusePolicyAllow will allow reuse if it produces smaller output. - ReusePolicyAllow ReusePolicy = iota - - // ReusePolicyPrefer will re-use aggressively if possible. - // This will not check if a new table will produce smaller output, - // except if the current table is impossible to use or - // compressed output is bigger than input. - ReusePolicyPrefer - - // ReusePolicyNone will disable re-use of tables. - // This is slightly faster than ReusePolicyAllow but may produce larger output. - ReusePolicyNone - - // ReusePolicyMust must allow reuse and produce smaller output. - ReusePolicyMust -) - -type Scratch struct { - count [maxSymbolValue + 1]uint32 - - // Per block parameters. - // These can be used to override compression parameters of the block. - // Do not touch, unless you know what you are doing. - - // Out is output buffer. - // If the scratch is re-used before the caller is done processing the output, - // set this field to nil. - // Otherwise the output buffer will be re-used for next Compression/Decompression step - // and allocation will be avoided. - Out []byte - - // OutTable will contain the table data only, if a new table has been generated. - // Slice of the returned data. - OutTable []byte - - // OutData will contain the compressed data. - // Slice of the returned data. - OutData []byte - - // MaxDecodedSize will set the maximum allowed output size. - // This value will automatically be set to BlockSizeMax if not set. - // Decoders will return ErrMaxDecodedSizeExceeded is this limit is exceeded. - MaxDecodedSize int - - srcLen int - - // MaxSymbolValue will override the maximum symbol value of the next block. - MaxSymbolValue uint8 - - // TableLog will attempt to override the tablelog for the next block. - // Must be <= 11 and >= 5. - TableLog uint8 - - // Reuse will specify the reuse policy - Reuse ReusePolicy - - // WantLogLess allows to specify a log 2 reduction that should at least be achieved, - // otherwise the block will be returned as incompressible. - // The reduction should then at least be (input size >> WantLogLess) - // If WantLogLess == 0 any improvement will do. - WantLogLess uint8 - - symbolLen uint16 // Length of active part of the symbol table. - maxCount int // count of the most probable symbol - clearCount bool // clear count - actualTableLog uint8 // Selected tablelog. - prevTableLog uint8 // Tablelog for previous table - prevTable cTable // Table used for previous compression. - cTable cTable // compression table - dt dTable // decompression table - nodes []nodeElt - tmpOut [4][]byte - fse *fse.Scratch - decPool sync.Pool // *[4][256]byte buffers. - huffWeight [maxSymbolValue + 1]byte -} - -// TransferCTable will transfer the previously used compression table. -func (s *Scratch) TransferCTable(src *Scratch) { - if cap(s.prevTable) < len(src.prevTable) { - s.prevTable = make(cTable, 0, maxSymbolValue+1) - } - s.prevTable = s.prevTable[:len(src.prevTable)] - copy(s.prevTable, src.prevTable) - s.prevTableLog = src.prevTableLog -} - -func (s *Scratch) prepare(in []byte) (*Scratch, error) { - if len(in) > BlockSizeMax { - return nil, ErrTooBig - } - if s == nil { - s = &Scratch{} - } - if s.MaxSymbolValue == 0 { - s.MaxSymbolValue = maxSymbolValue - } - if s.TableLog == 0 { - s.TableLog = tableLogDefault - } - if s.TableLog > tableLogMax || s.TableLog < minTablelog { - return nil, fmt.Errorf(" invalid tableLog %d (%d -> %d)", s.TableLog, minTablelog, tableLogMax) - } - if s.MaxDecodedSize <= 0 || s.MaxDecodedSize > BlockSizeMax { - s.MaxDecodedSize = BlockSizeMax - } - if s.clearCount && s.maxCount == 0 { - for i := range s.count { - s.count[i] = 0 - } - s.clearCount = false - } - if cap(s.Out) == 0 { - s.Out = make([]byte, 0, len(in)) - } - s.Out = s.Out[:0] - - s.OutTable = nil - s.OutData = nil - if cap(s.nodes) < huffNodesLen+1 { - s.nodes = make([]nodeElt, 0, huffNodesLen+1) - } - s.nodes = s.nodes[:0] - if s.fse == nil { - s.fse = &fse.Scratch{} - } - s.srcLen = len(in) - - return s, nil -} - -type cTable []cTableEntry - -func (c cTable) write(s *Scratch) error { - var ( - // precomputed conversion table - bitsToWeight [tableLogMax + 1]byte - huffLog = s.actualTableLog - // last weight is not saved. - maxSymbolValue = uint8(s.symbolLen - 1) - huffWeight = s.huffWeight[:256] - ) - const ( - maxFSETableLog = 6 - ) - // convert to weight - bitsToWeight[0] = 0 - for n := uint8(1); n < huffLog+1; n++ { - bitsToWeight[n] = huffLog + 1 - n - } - - // Acquire histogram for FSE. - hist := s.fse.Histogram() - hist = hist[:256] - for i := range hist[:16] { - hist[i] = 0 - } - for n := uint8(0); n < maxSymbolValue; n++ { - v := bitsToWeight[c[n].nBits] & 15 - huffWeight[n] = v - hist[v]++ - } - - // FSE compress if feasible. - if maxSymbolValue >= 2 { - huffMaxCnt := uint32(0) - huffMax := uint8(0) - for i, v := range hist[:16] { - if v == 0 { - continue - } - huffMax = byte(i) - if v > huffMaxCnt { - huffMaxCnt = v - } - } - s.fse.HistogramFinished(huffMax, int(huffMaxCnt)) - s.fse.TableLog = maxFSETableLog - b, err := fse.Compress(huffWeight[:maxSymbolValue], s.fse) - if err == nil && len(b) < int(s.symbolLen>>1) { - s.Out = append(s.Out, uint8(len(b))) - s.Out = append(s.Out, b...) - return nil - } - // Unable to compress (RLE/uncompressible) - } - // write raw values as 4-bits (max : 15) - if maxSymbolValue > (256 - 128) { - // should not happen : likely means source cannot be compressed - return ErrIncompressible - } - op := s.Out - // special case, pack weights 4 bits/weight. - op = append(op, 128|(maxSymbolValue-1)) - // be sure it doesn't cause msan issue in final combination - huffWeight[maxSymbolValue] = 0 - for n := uint16(0); n < uint16(maxSymbolValue); n += 2 { - op = append(op, (huffWeight[n]<<4)|huffWeight[n+1]) - } - s.Out = op - return nil -} - -func (c cTable) estTableSize(s *Scratch) (sz int, err error) { - var ( - // precomputed conversion table - bitsToWeight [tableLogMax + 1]byte - huffLog = s.actualTableLog - // last weight is not saved. - maxSymbolValue = uint8(s.symbolLen - 1) - huffWeight = s.huffWeight[:256] - ) - const ( - maxFSETableLog = 6 - ) - // convert to weight - bitsToWeight[0] = 0 - for n := uint8(1); n < huffLog+1; n++ { - bitsToWeight[n] = huffLog + 1 - n - } - - // Acquire histogram for FSE. - hist := s.fse.Histogram() - hist = hist[:256] - for i := range hist[:16] { - hist[i] = 0 - } - for n := uint8(0); n < maxSymbolValue; n++ { - v := bitsToWeight[c[n].nBits] & 15 - huffWeight[n] = v - hist[v]++ - } - - // FSE compress if feasible. - if maxSymbolValue >= 2 { - huffMaxCnt := uint32(0) - huffMax := uint8(0) - for i, v := range hist[:16] { - if v == 0 { - continue - } - huffMax = byte(i) - if v > huffMaxCnt { - huffMaxCnt = v - } - } - s.fse.HistogramFinished(huffMax, int(huffMaxCnt)) - s.fse.TableLog = maxFSETableLog - b, err := fse.Compress(huffWeight[:maxSymbolValue], s.fse) - if err == nil && len(b) < int(s.symbolLen>>1) { - sz += 1 + len(b) - return sz, nil - } - // Unable to compress (RLE/uncompressible) - } - // write raw values as 4-bits (max : 15) - if maxSymbolValue > (256 - 128) { - // should not happen : likely means source cannot be compressed - return 0, ErrIncompressible - } - // special case, pack weights 4 bits/weight. - sz += 1 + int(maxSymbolValue/2) - return sz, nil -} - -// estimateSize returns the estimated size in bytes of the input represented in the -// histogram supplied. -func (c cTable) estimateSize(hist []uint32) int { - nbBits := uint32(7) - for i, v := range c[:len(hist)] { - nbBits += uint32(v.nBits) * hist[i] - } - return int(nbBits >> 3) -} - -// minSize returns the minimum possible size considering the shannon limit. -func (s *Scratch) minSize(total int) int { - nbBits := float64(7) - fTotal := float64(total) - for _, v := range s.count[:s.symbolLen] { - n := float64(v) - if n > 0 { - nbBits += math.Log2(fTotal/n) * n - } - } - return int(nbBits) >> 3 -} - -func highBit32(val uint32) (n uint32) { - return uint32(bits.Len32(val) - 1) -} diff --git a/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.go b/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.go deleted file mode 100644 index 3954c51219..0000000000 --- a/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.go +++ /dev/null @@ -1,34 +0,0 @@ -// Package cpuinfo gives runtime info about the current CPU. -// -// This is a very limited module meant for use internally -// in this project. For more versatile solution check -// https://github.com/klauspost/cpuid. -package cpuinfo - -// HasBMI1 checks whether an x86 CPU supports the BMI1 extension. -func HasBMI1() bool { - return hasBMI1 -} - -// HasBMI2 checks whether an x86 CPU supports the BMI2 extension. -func HasBMI2() bool { - return hasBMI2 -} - -// DisableBMI2 will disable BMI2, for testing purposes. -// Call returned function to restore previous state. -func DisableBMI2() func() { - old := hasBMI2 - hasBMI2 = false - return func() { - hasBMI2 = old - } -} - -// HasBMI checks whether an x86 CPU supports both BMI1 and BMI2 extensions. -func HasBMI() bool { - return HasBMI1() && HasBMI2() -} - -var hasBMI1 bool -var hasBMI2 bool diff --git a/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.go b/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.go deleted file mode 100644 index e802579c4f..0000000000 --- a/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build amd64 && !appengine && !noasm && gc -// +build amd64,!appengine,!noasm,gc - -package cpuinfo - -// go:noescape -func x86extensions() (bmi1, bmi2 bool) - -func init() { - hasBMI1, hasBMI2 = x86extensions() -} diff --git a/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.s b/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.s deleted file mode 100644 index 4465fbe9e9..0000000000 --- a/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.s +++ /dev/null @@ -1,36 +0,0 @@ -// +build !appengine -// +build gc -// +build !noasm - -#include "textflag.h" -#include "funcdata.h" -#include "go_asm.h" - -TEXT ·x86extensions(SB), NOSPLIT, $0 - // 1. determine max EAX value - XORQ AX, AX - CPUID - - CMPQ AX, $7 - JB unsupported - - // 2. EAX = 7, ECX = 0 --- see Table 3-8 "Information Returned by CPUID Instruction" - MOVQ $7, AX - MOVQ $0, CX - CPUID - - BTQ $3, BX // bit 3 = BMI1 - SETCS AL - - BTQ $8, BX // bit 8 = BMI2 - SETCS AH - - MOVB AL, bmi1+0(FP) - MOVB AH, bmi2+1(FP) - RET - -unsupported: - XORQ AX, AX - MOVB AL, bmi1+0(FP) - MOVB AL, bmi2+1(FP) - RET diff --git a/vendor/github.com/klauspost/compress/internal/snapref/LICENSE b/vendor/github.com/klauspost/compress/internal/snapref/LICENSE deleted file mode 100644 index 6050c10f4c..0000000000 --- a/vendor/github.com/klauspost/compress/internal/snapref/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/klauspost/compress/internal/snapref/decode.go b/vendor/github.com/klauspost/compress/internal/snapref/decode.go deleted file mode 100644 index 40796a49d6..0000000000 --- a/vendor/github.com/klauspost/compress/internal/snapref/decode.go +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2011 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package snapref - -import ( - "encoding/binary" - "errors" - "io" -) - -var ( - // ErrCorrupt reports that the input is invalid. - ErrCorrupt = errors.New("snappy: corrupt input") - // ErrTooLarge reports that the uncompressed length is too large. - ErrTooLarge = errors.New("snappy: decoded block is too large") - // ErrUnsupported reports that the input isn't supported. - ErrUnsupported = errors.New("snappy: unsupported input") - - errUnsupportedLiteralLength = errors.New("snappy: unsupported literal length") -) - -// DecodedLen returns the length of the decoded block. -func DecodedLen(src []byte) (int, error) { - v, _, err := decodedLen(src) - return v, err -} - -// decodedLen returns the length of the decoded block and the number of bytes -// that the length header occupied. -func decodedLen(src []byte) (blockLen, headerLen int, err error) { - v, n := binary.Uvarint(src) - if n <= 0 || v > 0xffffffff { - return 0, 0, ErrCorrupt - } - - const wordSize = 32 << (^uint(0) >> 32 & 1) - if wordSize == 32 && v > 0x7fffffff { - return 0, 0, ErrTooLarge - } - return int(v), n, nil -} - -const ( - decodeErrCodeCorrupt = 1 - decodeErrCodeUnsupportedLiteralLength = 2 -) - -// Decode returns the decoded form of src. The returned slice may be a sub- -// slice of dst if dst was large enough to hold the entire decoded block. -// Otherwise, a newly allocated slice will be returned. -// -// The dst and src must not overlap. It is valid to pass a nil dst. -// -// Decode handles the Snappy block format, not the Snappy stream format. -func Decode(dst, src []byte) ([]byte, error) { - dLen, s, err := decodedLen(src) - if err != nil { - return nil, err - } - if dLen <= len(dst) { - dst = dst[:dLen] - } else { - dst = make([]byte, dLen) - } - switch decode(dst, src[s:]) { - case 0: - return dst, nil - case decodeErrCodeUnsupportedLiteralLength: - return nil, errUnsupportedLiteralLength - } - return nil, ErrCorrupt -} - -// NewReader returns a new Reader that decompresses from r, using the framing -// format described at -// https://github.com/google/snappy/blob/master/framing_format.txt -func NewReader(r io.Reader) *Reader { - return &Reader{ - r: r, - decoded: make([]byte, maxBlockSize), - buf: make([]byte, maxEncodedLenOfMaxBlockSize+checksumSize), - } -} - -// Reader is an io.Reader that can read Snappy-compressed bytes. -// -// Reader handles the Snappy stream format, not the Snappy block format. -type Reader struct { - r io.Reader - err error - decoded []byte - buf []byte - // decoded[i:j] contains decoded bytes that have not yet been passed on. - i, j int - readHeader bool -} - -// Reset discards any buffered data, resets all state, and switches the Snappy -// reader to read from r. This permits reusing a Reader rather than allocating -// a new one. -func (r *Reader) Reset(reader io.Reader) { - r.r = reader - r.err = nil - r.i = 0 - r.j = 0 - r.readHeader = false -} - -func (r *Reader) readFull(p []byte, allowEOF bool) (ok bool) { - if _, r.err = io.ReadFull(r.r, p); r.err != nil { - if r.err == io.ErrUnexpectedEOF || (r.err == io.EOF && !allowEOF) { - r.err = ErrCorrupt - } - return false - } - return true -} - -func (r *Reader) fill() error { - for r.i >= r.j { - if !r.readFull(r.buf[:4], true) { - return r.err - } - chunkType := r.buf[0] - if !r.readHeader { - if chunkType != chunkTypeStreamIdentifier { - r.err = ErrCorrupt - return r.err - } - r.readHeader = true - } - chunkLen := int(r.buf[1]) | int(r.buf[2])<<8 | int(r.buf[3])<<16 - if chunkLen > len(r.buf) { - r.err = ErrUnsupported - return r.err - } - - // The chunk types are specified at - // https://github.com/google/snappy/blob/master/framing_format.txt - switch chunkType { - case chunkTypeCompressedData: - // Section 4.2. Compressed data (chunk type 0x00). - if chunkLen < checksumSize { - r.err = ErrCorrupt - return r.err - } - buf := r.buf[:chunkLen] - if !r.readFull(buf, false) { - return r.err - } - checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 - buf = buf[checksumSize:] - - n, err := DecodedLen(buf) - if err != nil { - r.err = err - return r.err - } - if n > len(r.decoded) { - r.err = ErrCorrupt - return r.err - } - if _, err := Decode(r.decoded, buf); err != nil { - r.err = err - return r.err - } - if crc(r.decoded[:n]) != checksum { - r.err = ErrCorrupt - return r.err - } - r.i, r.j = 0, n - continue - - case chunkTypeUncompressedData: - // Section 4.3. Uncompressed data (chunk type 0x01). - if chunkLen < checksumSize { - r.err = ErrCorrupt - return r.err - } - buf := r.buf[:checksumSize] - if !r.readFull(buf, false) { - return r.err - } - checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 - // Read directly into r.decoded instead of via r.buf. - n := chunkLen - checksumSize - if n > len(r.decoded) { - r.err = ErrCorrupt - return r.err - } - if !r.readFull(r.decoded[:n], false) { - return r.err - } - if crc(r.decoded[:n]) != checksum { - r.err = ErrCorrupt - return r.err - } - r.i, r.j = 0, n - continue - - case chunkTypeStreamIdentifier: - // Section 4.1. Stream identifier (chunk type 0xff). - if chunkLen != len(magicBody) { - r.err = ErrCorrupt - return r.err - } - if !r.readFull(r.buf[:len(magicBody)], false) { - return r.err - } - for i := 0; i < len(magicBody); i++ { - if r.buf[i] != magicBody[i] { - r.err = ErrCorrupt - return r.err - } - } - continue - } - - if chunkType <= 0x7f { - // Section 4.5. Reserved unskippable chunks (chunk types 0x02-0x7f). - r.err = ErrUnsupported - return r.err - } - // Section 4.4 Padding (chunk type 0xfe). - // Section 4.6. Reserved skippable chunks (chunk types 0x80-0xfd). - if !r.readFull(r.buf[:chunkLen], false) { - return r.err - } - } - - return nil -} - -// Read satisfies the io.Reader interface. -func (r *Reader) Read(p []byte) (int, error) { - if r.err != nil { - return 0, r.err - } - - if err := r.fill(); err != nil { - return 0, err - } - - n := copy(p, r.decoded[r.i:r.j]) - r.i += n - return n, nil -} - -// ReadByte satisfies the io.ByteReader interface. -func (r *Reader) ReadByte() (byte, error) { - if r.err != nil { - return 0, r.err - } - - if err := r.fill(); err != nil { - return 0, err - } - - c := r.decoded[r.i] - r.i++ - return c, nil -} diff --git a/vendor/github.com/klauspost/compress/internal/snapref/decode_other.go b/vendor/github.com/klauspost/compress/internal/snapref/decode_other.go deleted file mode 100644 index 77395a6b8b..0000000000 --- a/vendor/github.com/klauspost/compress/internal/snapref/decode_other.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2016 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package snapref - -// decode writes the decoding of src to dst. It assumes that the varint-encoded -// length of the decompressed bytes has already been read, and that len(dst) -// equals that length. -// -// It returns 0 on success or a decodeErrCodeXxx error code on failure. -func decode(dst, src []byte) int { - var d, s, offset, length int - for s < len(src) { - switch src[s] & 0x03 { - case tagLiteral: - x := uint32(src[s] >> 2) - switch { - case x < 60: - s++ - case x == 60: - s += 2 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-1]) - case x == 61: - s += 3 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-2]) | uint32(src[s-1])<<8 - case x == 62: - s += 4 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16 - case x == 63: - s += 5 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 - } - length = int(x) + 1 - if length <= 0 { - return decodeErrCodeUnsupportedLiteralLength - } - if length > len(dst)-d || length > len(src)-s { - return decodeErrCodeCorrupt - } - copy(dst[d:], src[s:s+length]) - d += length - s += length - continue - - case tagCopy1: - s += 2 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 4 + int(src[s-2])>>2&0x7 - offset = int(uint32(src[s-2])&0xe0<<3 | uint32(src[s-1])) - - case tagCopy2: - s += 3 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 1 + int(src[s-3])>>2 - offset = int(uint32(src[s-2]) | uint32(src[s-1])<<8) - - case tagCopy4: - s += 5 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 1 + int(src[s-5])>>2 - offset = int(uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24) - } - - if offset <= 0 || d < offset || length > len(dst)-d { - return decodeErrCodeCorrupt - } - // Copy from an earlier sub-slice of dst to a later sub-slice. - // If no overlap, use the built-in copy: - if offset >= length { - copy(dst[d:d+length], dst[d-offset:]) - d += length - continue - } - - // Unlike the built-in copy function, this byte-by-byte copy always runs - // forwards, even if the slices overlap. Conceptually, this is: - // - // d += forwardCopy(dst[d:d+length], dst[d-offset:]) - // - // We align the slices into a and b and show the compiler they are the same size. - // This allows the loop to run without bounds checks. - a := dst[d : d+length] - b := dst[d-offset:] - b = b[:len(a)] - for i := range a { - a[i] = b[i] - } - d += length - } - if d != len(dst) { - return decodeErrCodeCorrupt - } - return 0 -} diff --git a/vendor/github.com/klauspost/compress/internal/snapref/encode.go b/vendor/github.com/klauspost/compress/internal/snapref/encode.go deleted file mode 100644 index 13c6040a5d..0000000000 --- a/vendor/github.com/klauspost/compress/internal/snapref/encode.go +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright 2011 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package snapref - -import ( - "encoding/binary" - "errors" - "io" -) - -// Encode returns the encoded form of src. The returned slice may be a sub- -// slice of dst if dst was large enough to hold the entire encoded block. -// Otherwise, a newly allocated slice will be returned. -// -// The dst and src must not overlap. It is valid to pass a nil dst. -// -// Encode handles the Snappy block format, not the Snappy stream format. -func Encode(dst, src []byte) []byte { - if n := MaxEncodedLen(len(src)); n < 0 { - panic(ErrTooLarge) - } else if len(dst) < n { - dst = make([]byte, n) - } - - // The block starts with the varint-encoded length of the decompressed bytes. - d := binary.PutUvarint(dst, uint64(len(src))) - - for len(src) > 0 { - p := src - src = nil - if len(p) > maxBlockSize { - p, src = p[:maxBlockSize], p[maxBlockSize:] - } - if len(p) < minNonLiteralBlockSize { - d += emitLiteral(dst[d:], p) - } else { - d += encodeBlock(dst[d:], p) - } - } - return dst[:d] -} - -// inputMargin is the minimum number of extra input bytes to keep, inside -// encodeBlock's inner loop. On some architectures, this margin lets us -// implement a fast path for emitLiteral, where the copy of short (<= 16 byte) -// literals can be implemented as a single load to and store from a 16-byte -// register. That literal's actual length can be as short as 1 byte, so this -// can copy up to 15 bytes too much, but that's OK as subsequent iterations of -// the encoding loop will fix up the copy overrun, and this inputMargin ensures -// that we don't overrun the dst and src buffers. -const inputMargin = 16 - 1 - -// minNonLiteralBlockSize is the minimum size of the input to encodeBlock that -// could be encoded with a copy tag. This is the minimum with respect to the -// algorithm used by encodeBlock, not a minimum enforced by the file format. -// -// The encoded output must start with at least a 1 byte literal, as there are -// no previous bytes to copy. A minimal (1 byte) copy after that, generated -// from an emitCopy call in encodeBlock's main loop, would require at least -// another inputMargin bytes, for the reason above: we want any emitLiteral -// calls inside encodeBlock's main loop to use the fast path if possible, which -// requires being able to overrun by inputMargin bytes. Thus, -// minNonLiteralBlockSize equals 1 + 1 + inputMargin. -// -// The C++ code doesn't use this exact threshold, but it could, as discussed at -// https://groups.google.com/d/topic/snappy-compression/oGbhsdIJSJ8/discussion -// The difference between Go (2+inputMargin) and C++ (inputMargin) is purely an -// optimization. It should not affect the encoded form. This is tested by -// TestSameEncodingAsCppShortCopies. -const minNonLiteralBlockSize = 1 + 1 + inputMargin - -// MaxEncodedLen returns the maximum length of a snappy block, given its -// uncompressed length. -// -// It will return a negative value if srcLen is too large to encode. -func MaxEncodedLen(srcLen int) int { - n := uint64(srcLen) - if n > 0xffffffff { - return -1 - } - // Compressed data can be defined as: - // compressed := item* literal* - // item := literal* copy - // - // The trailing literal sequence has a space blowup of at most 62/60 - // since a literal of length 60 needs one tag byte + one extra byte - // for length information. - // - // Item blowup is trickier to measure. Suppose the "copy" op copies - // 4 bytes of data. Because of a special check in the encoding code, - // we produce a 4-byte copy only if the offset is < 65536. Therefore - // the copy op takes 3 bytes to encode, and this type of item leads - // to at most the 62/60 blowup for representing literals. - // - // Suppose the "copy" op copies 5 bytes of data. If the offset is big - // enough, it will take 5 bytes to encode the copy op. Therefore the - // worst case here is a one-byte literal followed by a five-byte copy. - // That is, 6 bytes of input turn into 7 bytes of "compressed" data. - // - // This last factor dominates the blowup, so the final estimate is: - n = 32 + n + n/6 - if n > 0xffffffff { - return -1 - } - return int(n) -} - -var errClosed = errors.New("snappy: Writer is closed") - -// NewWriter returns a new Writer that compresses to w. -// -// The Writer returned does not buffer writes. There is no need to Flush or -// Close such a Writer. -// -// Deprecated: the Writer returned is not suitable for many small writes, only -// for few large writes. Use NewBufferedWriter instead, which is efficient -// regardless of the frequency and shape of the writes, and remember to Close -// that Writer when done. -func NewWriter(w io.Writer) *Writer { - return &Writer{ - w: w, - obuf: make([]byte, obufLen), - } -} - -// NewBufferedWriter returns a new Writer that compresses to w, using the -// framing format described at -// https://github.com/google/snappy/blob/master/framing_format.txt -// -// The Writer returned buffers writes. Users must call Close to guarantee all -// data has been forwarded to the underlying io.Writer. They may also call -// Flush zero or more times before calling Close. -func NewBufferedWriter(w io.Writer) *Writer { - return &Writer{ - w: w, - ibuf: make([]byte, 0, maxBlockSize), - obuf: make([]byte, obufLen), - } -} - -// Writer is an io.Writer that can write Snappy-compressed bytes. -// -// Writer handles the Snappy stream format, not the Snappy block format. -type Writer struct { - w io.Writer - err error - - // ibuf is a buffer for the incoming (uncompressed) bytes. - // - // Its use is optional. For backwards compatibility, Writers created by the - // NewWriter function have ibuf == nil, do not buffer incoming bytes, and - // therefore do not need to be Flush'ed or Close'd. - ibuf []byte - - // obuf is a buffer for the outgoing (compressed) bytes. - obuf []byte - - // wroteStreamHeader is whether we have written the stream header. - wroteStreamHeader bool -} - -// Reset discards the writer's state and switches the Snappy writer to write to -// w. This permits reusing a Writer rather than allocating a new one. -func (w *Writer) Reset(writer io.Writer) { - w.w = writer - w.err = nil - if w.ibuf != nil { - w.ibuf = w.ibuf[:0] - } - w.wroteStreamHeader = false -} - -// Write satisfies the io.Writer interface. -func (w *Writer) Write(p []byte) (nRet int, errRet error) { - if w.ibuf == nil { - // Do not buffer incoming bytes. This does not perform or compress well - // if the caller of Writer.Write writes many small slices. This - // behavior is therefore deprecated, but still supported for backwards - // compatibility with code that doesn't explicitly Flush or Close. - return w.write(p) - } - - // The remainder of this method is based on bufio.Writer.Write from the - // standard library. - - for len(p) > (cap(w.ibuf)-len(w.ibuf)) && w.err == nil { - var n int - if len(w.ibuf) == 0 { - // Large write, empty buffer. - // Write directly from p to avoid copy. - n, _ = w.write(p) - } else { - n = copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p) - w.ibuf = w.ibuf[:len(w.ibuf)+n] - w.Flush() - } - nRet += n - p = p[n:] - } - if w.err != nil { - return nRet, w.err - } - n := copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p) - w.ibuf = w.ibuf[:len(w.ibuf)+n] - nRet += n - return nRet, nil -} - -func (w *Writer) write(p []byte) (nRet int, errRet error) { - if w.err != nil { - return 0, w.err - } - for len(p) > 0 { - obufStart := len(magicChunk) - if !w.wroteStreamHeader { - w.wroteStreamHeader = true - copy(w.obuf, magicChunk) - obufStart = 0 - } - - var uncompressed []byte - if len(p) > maxBlockSize { - uncompressed, p = p[:maxBlockSize], p[maxBlockSize:] - } else { - uncompressed, p = p, nil - } - checksum := crc(uncompressed) - - // Compress the buffer, discarding the result if the improvement - // isn't at least 12.5%. - compressed := Encode(w.obuf[obufHeaderLen:], uncompressed) - chunkType := uint8(chunkTypeCompressedData) - chunkLen := 4 + len(compressed) - obufEnd := obufHeaderLen + len(compressed) - if len(compressed) >= len(uncompressed)-len(uncompressed)/8 { - chunkType = chunkTypeUncompressedData - chunkLen = 4 + len(uncompressed) - obufEnd = obufHeaderLen - } - - // Fill in the per-chunk header that comes before the body. - w.obuf[len(magicChunk)+0] = chunkType - w.obuf[len(magicChunk)+1] = uint8(chunkLen >> 0) - w.obuf[len(magicChunk)+2] = uint8(chunkLen >> 8) - w.obuf[len(magicChunk)+3] = uint8(chunkLen >> 16) - w.obuf[len(magicChunk)+4] = uint8(checksum >> 0) - w.obuf[len(magicChunk)+5] = uint8(checksum >> 8) - w.obuf[len(magicChunk)+6] = uint8(checksum >> 16) - w.obuf[len(magicChunk)+7] = uint8(checksum >> 24) - - if _, err := w.w.Write(w.obuf[obufStart:obufEnd]); err != nil { - w.err = err - return nRet, err - } - if chunkType == chunkTypeUncompressedData { - if _, err := w.w.Write(uncompressed); err != nil { - w.err = err - return nRet, err - } - } - nRet += len(uncompressed) - } - return nRet, nil -} - -// Flush flushes the Writer to its underlying io.Writer. -func (w *Writer) Flush() error { - if w.err != nil { - return w.err - } - if len(w.ibuf) == 0 { - return nil - } - w.write(w.ibuf) - w.ibuf = w.ibuf[:0] - return w.err -} - -// Close calls Flush and then closes the Writer. -func (w *Writer) Close() error { - w.Flush() - ret := w.err - if w.err == nil { - w.err = errClosed - } - return ret -} diff --git a/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go b/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go deleted file mode 100644 index 2754bac6f1..0000000000 --- a/vendor/github.com/klauspost/compress/internal/snapref/encode_other.go +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright 2016 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package snapref - -func load32(b []byte, i int) uint32 { - b = b[i : i+4 : len(b)] // Help the compiler eliminate bounds checks on the next line. - return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 -} - -func load64(b []byte, i int) uint64 { - b = b[i : i+8 : len(b)] // Help the compiler eliminate bounds checks on the next line. - return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | - uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 -} - -// emitLiteral writes a literal chunk and returns the number of bytes written. -// -// It assumes that: -// -// dst is long enough to hold the encoded bytes -// 1 <= len(lit) && len(lit) <= 65536 -func emitLiteral(dst, lit []byte) int { - i, n := 0, uint(len(lit)-1) - switch { - case n < 60: - dst[0] = uint8(n)<<2 | tagLiteral - i = 1 - case n < 1<<8: - dst[0] = 60<<2 | tagLiteral - dst[1] = uint8(n) - i = 2 - default: - dst[0] = 61<<2 | tagLiteral - dst[1] = uint8(n) - dst[2] = uint8(n >> 8) - i = 3 - } - return i + copy(dst[i:], lit) -} - -// emitCopy writes a copy chunk and returns the number of bytes written. -// -// It assumes that: -// -// dst is long enough to hold the encoded bytes -// 1 <= offset && offset <= 65535 -// 4 <= length && length <= 65535 -func emitCopy(dst []byte, offset, length int) int { - i := 0 - // The maximum length for a single tagCopy1 or tagCopy2 op is 64 bytes. The - // threshold for this loop is a little higher (at 68 = 64 + 4), and the - // length emitted down below is a little lower (at 60 = 64 - 4), because - // it's shorter to encode a length 67 copy as a length 60 tagCopy2 followed - // by a length 7 tagCopy1 (which encodes as 3+2 bytes) than to encode it as - // a length 64 tagCopy2 followed by a length 3 tagCopy2 (which encodes as - // 3+3 bytes). The magic 4 in the 64±4 is because the minimum length for a - // tagCopy1 op is 4 bytes, which is why a length 3 copy has to be an - // encodes-as-3-bytes tagCopy2 instead of an encodes-as-2-bytes tagCopy1. - for length >= 68 { - // Emit a length 64 copy, encoded as 3 bytes. - dst[i+0] = 63<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - i += 3 - length -= 64 - } - if length > 64 { - // Emit a length 60 copy, encoded as 3 bytes. - dst[i+0] = 59<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - i += 3 - length -= 60 - } - if length >= 12 || offset >= 2048 { - // Emit the remaining copy, encoded as 3 bytes. - dst[i+0] = uint8(length-1)<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - return i + 3 - } - // Emit the remaining copy, encoded as 2 bytes. - dst[i+0] = uint8(offset>>8)<<5 | uint8(length-4)<<2 | tagCopy1 - dst[i+1] = uint8(offset) - return i + 2 -} - -func hash(u, shift uint32) uint32 { - return (u * 0x1e35a7bd) >> shift -} - -// EncodeBlockInto exposes encodeBlock but checks dst size. -func EncodeBlockInto(dst, src []byte) (d int) { - if MaxEncodedLen(len(src)) > len(dst) { - return 0 - } - - // encodeBlock breaks on too big blocks, so split. - for len(src) > 0 { - p := src - src = nil - if len(p) > maxBlockSize { - p, src = p[:maxBlockSize], p[maxBlockSize:] - } - if len(p) < minNonLiteralBlockSize { - d += emitLiteral(dst[d:], p) - } else { - d += encodeBlock(dst[d:], p) - } - } - return d -} - -// encodeBlock encodes a non-empty src to a guaranteed-large-enough dst. It -// assumes that the varint-encoded length of the decompressed bytes has already -// been written. -// -// It also assumes that: -// -// len(dst) >= MaxEncodedLen(len(src)) && -// minNonLiteralBlockSize <= len(src) && len(src) <= maxBlockSize -func encodeBlock(dst, src []byte) (d int) { - // Initialize the hash table. Its size ranges from 1<<8 to 1<<14 inclusive. - // The table element type is uint16, as s < sLimit and sLimit < len(src) - // and len(src) <= maxBlockSize and maxBlockSize == 65536. - const ( - maxTableSize = 1 << 14 - // tableMask is redundant, but helps the compiler eliminate bounds - // checks. - tableMask = maxTableSize - 1 - ) - shift := uint32(32 - 8) - for tableSize := 1 << 8; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 { - shift-- - } - // In Go, all array elements are zero-initialized, so there is no advantage - // to a smaller tableSize per se. However, it matches the C++ algorithm, - // and in the asm versions of this code, we can get away with zeroing only - // the first tableSize elements. - var table [maxTableSize]uint16 - - // sLimit is when to stop looking for offset/length copies. The inputMargin - // lets us use a fast path for emitLiteral in the main loop, while we are - // looking for copies. - sLimit := len(src) - inputMargin - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := 0 - - // The encoded form must start with a literal, as there are no previous - // bytes to copy, so we start looking for hash matches at s == 1. - s := 1 - nextHash := hash(load32(src, s), shift) - - for { - // Copied from the C++ snappy implementation: - // - // Heuristic match skipping: If 32 bytes are scanned with no matches - // found, start looking only at every other byte. If 32 more bytes are - // scanned (or skipped), look at every third byte, etc.. When a match - // is found, immediately go back to looking at every byte. This is a - // small loss (~5% performance, ~0.1% density) for compressible data - // due to more bookkeeping, but for non-compressible data (such as - // JPEG) it's a huge win since the compressor quickly "realizes" the - // data is incompressible and doesn't bother looking for matches - // everywhere. - // - // The "skip" variable keeps track of how many bytes there are since - // the last match; dividing it by 32 (ie. right-shifting by five) gives - // the number of bytes to move ahead for each iteration. - skip := 32 - - nextS := s - candidate := 0 - for { - s = nextS - bytesBetweenHashLookups := skip >> 5 - nextS = s + bytesBetweenHashLookups - skip += bytesBetweenHashLookups - if nextS > sLimit { - goto emitRemainder - } - candidate = int(table[nextHash&tableMask]) - table[nextHash&tableMask] = uint16(s) - nextHash = hash(load32(src, nextS), shift) - if load32(src, s) == load32(src, candidate) { - break - } - } - - // A 4-byte match has been found. We'll later see if more than 4 bytes - // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit - // them as literal bytes. - d += emitLiteral(dst[d:], src[nextEmit:s]) - - // Call emitCopy, and then see if another emitCopy could be our next - // move. Repeat until we find no match for the input immediately after - // what was consumed by the last emitCopy call. - // - // If we exit this loop normally then we need to call emitLiteral next, - // though we don't yet know how big the literal will be. We handle that - // by proceeding to the next iteration of the main loop. We also can - // exit this loop via goto if we get close to exhausting the input. - for { - // Invariant: we have a 4-byte match at s, and no need to emit any - // literal bytes prior to s. - base := s - - // Extend the 4-byte match as long as possible. - // - // This is an inlined version of: - // s = extendMatch(src, candidate+4, s+4) - s += 4 - for i := candidate + 4; s < len(src) && src[i] == src[s]; i, s = i+1, s+1 { - } - - d += emitCopy(dst[d:], base-candidate, s-base) - nextEmit = s - if s >= sLimit { - goto emitRemainder - } - - // We could immediately start working at s now, but to improve - // compression we first update the hash table at s-1 and at s. If - // another emitCopy is not our next move, also calculate nextHash - // at s+1. At least on GOARCH=amd64, these three hash calculations - // are faster as one load64 call (with some shifts) instead of - // three load32 calls. - x := load64(src, s-1) - prevHash := hash(uint32(x>>0), shift) - table[prevHash&tableMask] = uint16(s - 1) - currHash := hash(uint32(x>>8), shift) - candidate = int(table[currHash&tableMask]) - table[currHash&tableMask] = uint16(s) - if uint32(x>>8) != load32(src, candidate) { - nextHash = hash(uint32(x>>16), shift) - s++ - break - } - } - } - -emitRemainder: - if nextEmit < len(src) { - d += emitLiteral(dst[d:], src[nextEmit:]) - } - return d -} diff --git a/vendor/github.com/klauspost/compress/internal/snapref/snappy.go b/vendor/github.com/klauspost/compress/internal/snapref/snappy.go deleted file mode 100644 index 34d01f4aa6..0000000000 --- a/vendor/github.com/klauspost/compress/internal/snapref/snappy.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2011 The Snappy-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package snapref implements the Snappy compression format. It aims for very -// high speeds and reasonable compression. -// -// There are actually two Snappy formats: block and stream. They are related, -// but different: trying to decompress block-compressed data as a Snappy stream -// will fail, and vice versa. The block format is the Decode and Encode -// functions and the stream format is the Reader and Writer types. -// -// The block format, the more common case, is used when the complete size (the -// number of bytes) of the original data is known upfront, at the time -// compression starts. The stream format, also known as the framing format, is -// for when that isn't always true. -// -// The canonical, C++ implementation is at https://github.com/google/snappy and -// it only implements the block format. -package snapref - -import ( - "hash/crc32" -) - -/* -Each encoded block begins with the varint-encoded length of the decoded data, -followed by a sequence of chunks. Chunks begin and end on byte boundaries. The -first byte of each chunk is broken into its 2 least and 6 most significant bits -called l and m: l ranges in [0, 4) and m ranges in [0, 64). l is the chunk tag. -Zero means a literal tag. All other values mean a copy tag. - -For literal tags: - - If m < 60, the next 1 + m bytes are literal bytes. - - Otherwise, let n be the little-endian unsigned integer denoted by the next - m - 59 bytes. The next 1 + n bytes after that are literal bytes. - -For copy tags, length bytes are copied from offset bytes ago, in the style of -Lempel-Ziv compression algorithms. In particular: - - For l == 1, the offset ranges in [0, 1<<11) and the length in [4, 12). - The length is 4 + the low 3 bits of m. The high 3 bits of m form bits 8-10 - of the offset. The next byte is bits 0-7 of the offset. - - For l == 2, the offset ranges in [0, 1<<16) and the length in [1, 65). - The length is 1 + m. The offset is the little-endian unsigned integer - denoted by the next 2 bytes. - - For l == 3, this tag is a legacy format that is no longer issued by most - encoders. Nonetheless, the offset ranges in [0, 1<<32) and the length in - [1, 65). The length is 1 + m. The offset is the little-endian unsigned - integer denoted by the next 4 bytes. -*/ -const ( - tagLiteral = 0x00 - tagCopy1 = 0x01 - tagCopy2 = 0x02 - tagCopy4 = 0x03 -) - -const ( - checksumSize = 4 - chunkHeaderSize = 4 - magicChunk = "\xff\x06\x00\x00" + magicBody - magicBody = "sNaPpY" - - // maxBlockSize is the maximum size of the input to encodeBlock. It is not - // part of the wire format per se, but some parts of the encoder assume - // that an offset fits into a uint16. - // - // Also, for the framing format (Writer type instead of Encode function), - // https://github.com/google/snappy/blob/master/framing_format.txt says - // that "the uncompressed data in a chunk must be no longer than 65536 - // bytes". - maxBlockSize = 65536 - - // maxEncodedLenOfMaxBlockSize equals MaxEncodedLen(maxBlockSize), but is - // hard coded to be a const instead of a variable, so that obufLen can also - // be a const. Their equivalence is confirmed by - // TestMaxEncodedLenOfMaxBlockSize. - maxEncodedLenOfMaxBlockSize = 76490 - - obufHeaderLen = len(magicChunk) + checksumSize + chunkHeaderSize - obufLen = obufHeaderLen + maxEncodedLenOfMaxBlockSize -) - -const ( - chunkTypeCompressedData = 0x00 - chunkTypeUncompressedData = 0x01 - chunkTypePadding = 0xfe - chunkTypeStreamIdentifier = 0xff -) - -var crcTable = crc32.MakeTable(crc32.Castagnoli) - -// crc implements the checksum specified in section 3 of -// https://github.com/google/snappy/blob/master/framing_format.txt -func crc(b []byte) uint32 { - c := crc32.Update(0, crcTable, b) - return uint32(c>>15|c<<17) + 0xa282ead8 -} diff --git a/vendor/github.com/klauspost/compress/s2sx.mod b/vendor/github.com/klauspost/compress/s2sx.mod deleted file mode 100644 index 5a4412f907..0000000000 --- a/vendor/github.com/klauspost/compress/s2sx.mod +++ /dev/null @@ -1,4 +0,0 @@ -module github.com/klauspost/compress - -go 1.19 - diff --git a/vendor/github.com/klauspost/compress/s2sx.sum b/vendor/github.com/klauspost/compress/s2sx.sum deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/vendor/github.com/klauspost/compress/zstd/README.md b/vendor/github.com/klauspost/compress/zstd/README.md deleted file mode 100644 index 92e2347bbc..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/README.md +++ /dev/null @@ -1,441 +0,0 @@ -# zstd - -[Zstandard](https://facebook.github.io/zstd/) is a real-time compression algorithm, providing high compression ratios. -It offers a very wide range of compression / speed trade-off, while being backed by a very fast decoder. -A high performance compression algorithm is implemented. For now focused on speed. - -This package provides [compression](#Compressor) to and [decompression](#Decompressor) of Zstandard content. - -This package is pure Go and without use of "unsafe". - -The `zstd` package is provided as open source software using a Go standard license. - -Currently the package is heavily optimized for 64 bit processors and will be significantly slower on 32 bit processors. - -For seekable zstd streams, see [this excellent package](https://github.com/SaveTheRbtz/zstd-seekable-format-go). - -## Installation - -Install using `go get -u github.com/klauspost/compress`. The package is located in `github.com/klauspost/compress/zstd`. - -[![Go Reference](https://pkg.go.dev/badge/github.com/klauspost/compress/zstd.svg)](https://pkg.go.dev/github.com/klauspost/compress/zstd) - -## Compressor - -### Status: - -STABLE - there may always be subtle bugs, a wide variety of content has been tested and the library is actively -used by several projects. This library is being [fuzz-tested](https://github.com/klauspost/compress-fuzz) for all updates. - -There may still be specific combinations of data types/size/settings that could lead to edge cases, -so as always, testing is recommended. - -For now, a high speed (fastest) and medium-fast (default) compressor has been implemented. - -* The "Fastest" compression ratio is roughly equivalent to zstd level 1. -* The "Default" compression ratio is roughly equivalent to zstd level 3 (default). -* The "Better" compression ratio is roughly equivalent to zstd level 7. -* The "Best" compression ratio is roughly equivalent to zstd level 11. - -In terms of speed, it is typically 2x as fast as the stdlib deflate/gzip in its fastest mode. -The compression ratio compared to stdlib is around level 3, but usually 3x as fast. - - -### Usage - -An Encoder can be used for either compressing a stream via the -`io.WriteCloser` interface supported by the Encoder or as multiple independent -tasks via the `EncodeAll` function. -Smaller encodes are encouraged to use the EncodeAll function. -Use `NewWriter` to create a new instance that can be used for both. - -To create a writer with default options, do like this: - -```Go -// Compress input to output. -func Compress(in io.Reader, out io.Writer) error { - enc, err := zstd.NewWriter(out) - if err != nil { - return err - } - _, err = io.Copy(enc, in) - if err != nil { - enc.Close() - return err - } - return enc.Close() -} -``` - -Now you can encode by writing data to `enc`. The output will be finished writing when `Close()` is called. -Even if your encode fails, you should still call `Close()` to release any resources that may be held up. - -The above is fine for big encodes. However, whenever possible try to *reuse* the writer. - -To reuse the encoder, you can use the `Reset(io.Writer)` function to change to another output. -This will allow the encoder to reuse all resources and avoid wasteful allocations. - -Currently stream encoding has 'light' concurrency, meaning up to 2 goroutines can be working on part -of a stream. This is independent of the `WithEncoderConcurrency(n)`, but that is likely to change -in the future. So if you want to limit concurrency for future updates, specify the concurrency -you would like. - -If you would like stream encoding to be done without spawning async goroutines, use `WithEncoderConcurrency(1)` -which will compress input as each block is completed, blocking on writes until each has completed. - -You can specify your desired compression level using `WithEncoderLevel()` option. Currently only pre-defined -compression settings can be specified. - -#### Future Compatibility Guarantees - -This will be an evolving project. When using this package it is important to note that both the compression efficiency and speed may change. - -The goal will be to keep the default efficiency at the default zstd (level 3). -However the encoding should never be assumed to remain the same, -and you should not use hashes of compressed output for similarity checks. - -The Encoder can be assumed to produce the same output from the exact same code version. -However, the may be modes in the future that break this, -although they will not be enabled without an explicit option. - -This encoder is not designed to (and will probably never) output the exact same bitstream as the reference encoder. - -Also note, that the cgo decompressor currently does not [report all errors on invalid input](https://github.com/DataDog/zstd/issues/59), -[omits error checks](https://github.com/DataDog/zstd/issues/61), [ignores checksums](https://github.com/DataDog/zstd/issues/43) -and seems to ignore concatenated streams, even though [it is part of the spec](https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#frames). - -#### Blocks - -For compressing small blocks, the returned encoder has a function called `EncodeAll(src, dst []byte) []byte`. - -`EncodeAll` will encode all input in src and append it to dst. -This function can be called concurrently. -Each call will only run on a same goroutine as the caller. - -Encoded blocks can be concatenated and the result will be the combined input stream. -Data compressed with EncodeAll can be decoded with the Decoder, using either a stream or `DecodeAll`. - -Especially when encoding blocks you should take special care to reuse the encoder. -This will effectively make it run without allocations after a warmup period. -To make it run completely without allocations, supply a destination buffer with space for all content. - -```Go -import "github.com/klauspost/compress/zstd" - -// Create a writer that caches compressors. -// For this operation type we supply a nil Reader. -var encoder, _ = zstd.NewWriter(nil) - -// Compress a buffer. -// If you have a destination buffer, the allocation in the call can also be eliminated. -func Compress(src []byte) []byte { - return encoder.EncodeAll(src, make([]byte, 0, len(src))) -} -``` - -You can control the maximum number of concurrent encodes using the `WithEncoderConcurrency(n)` -option when creating the writer. - -Using the Encoder for both a stream and individual blocks concurrently is safe. - -### Performance - -I have collected some speed examples to compare speed and compression against other compressors. - -* `file` is the input file. -* `out` is the compressor used. `zskp` is this package. `zstd` is the Datadog cgo library. `gzstd/gzkp` is gzip standard and this library. -* `level` is the compression level used. For `zskp` level 1 is "fastest", level 2 is "default"; 3 is "better", 4 is "best". -* `insize`/`outsize` is the input/output size. -* `millis` is the number of milliseconds used for compression. -* `mb/s` is megabytes (2^20 bytes) per second. - -``` -Silesia Corpus: -http://sun.aei.polsl.pl/~sdeor/corpus/silesia.zip - -This package: -file out level insize outsize millis mb/s -silesia.tar zskp 1 211947520 73821326 634 318.47 -silesia.tar zskp 2 211947520 67655404 1508 133.96 -silesia.tar zskp 3 211947520 64746933 3000 67.37 -silesia.tar zskp 4 211947520 60073508 16926 11.94 - -cgo zstd: -silesia.tar zstd 1 211947520 73605392 543 371.56 -silesia.tar zstd 3 211947520 66793289 864 233.68 -silesia.tar zstd 6 211947520 62916450 1913 105.66 -silesia.tar zstd 9 211947520 60212393 5063 39.92 - -gzip, stdlib/this package: -silesia.tar gzstd 1 211947520 80007735 1498 134.87 -silesia.tar gzkp 1 211947520 80088272 1009 200.31 - -GOB stream of binary data. Highly compressible. -https://files.klauspost.com/compress/gob-stream.7z - -file out level insize outsize millis mb/s -gob-stream zskp 1 1911399616 233948096 3230 564.34 -gob-stream zskp 2 1911399616 203997694 4997 364.73 -gob-stream zskp 3 1911399616 173526523 13435 135.68 -gob-stream zskp 4 1911399616 162195235 47559 38.33 - -gob-stream zstd 1 1911399616 249810424 2637 691.26 -gob-stream zstd 3 1911399616 208192146 3490 522.31 -gob-stream zstd 6 1911399616 193632038 6687 272.56 -gob-stream zstd 9 1911399616 177620386 16175 112.70 - -gob-stream gzstd 1 1911399616 357382013 9046 201.49 -gob-stream gzkp 1 1911399616 359136669 4885 373.08 - -The test data for the Large Text Compression Benchmark is the first -10^9 bytes of the English Wikipedia dump on Mar. 3, 2006. -http://mattmahoney.net/dc/textdata.html - -file out level insize outsize millis mb/s -enwik9 zskp 1 1000000000 343833605 3687 258.64 -enwik9 zskp 2 1000000000 317001237 7672 124.29 -enwik9 zskp 3 1000000000 291915823 15923 59.89 -enwik9 zskp 4 1000000000 261710291 77697 12.27 - -enwik9 zstd 1 1000000000 358072021 3110 306.65 -enwik9 zstd 3 1000000000 313734672 4784 199.35 -enwik9 zstd 6 1000000000 295138875 10290 92.68 -enwik9 zstd 9 1000000000 278348700 28549 33.40 - -enwik9 gzstd 1 1000000000 382578136 8608 110.78 -enwik9 gzkp 1 1000000000 382781160 5628 169.45 - -Highly compressible JSON file. -https://files.klauspost.com/compress/github-june-2days-2019.json.zst - -file out level insize outsize millis mb/s -github-june-2days-2019.json zskp 1 6273951764 697439532 9789 611.17 -github-june-2days-2019.json zskp 2 6273951764 610876538 18553 322.49 -github-june-2days-2019.json zskp 3 6273951764 517662858 44186 135.41 -github-june-2days-2019.json zskp 4 6273951764 464617114 165373 36.18 - -github-june-2days-2019.json zstd 1 6273951764 766284037 8450 708.00 -github-june-2days-2019.json zstd 3 6273951764 661889476 10927 547.57 -github-june-2days-2019.json zstd 6 6273951764 642756859 22996 260.18 -github-june-2days-2019.json zstd 9 6273951764 601974523 52413 114.16 - -github-june-2days-2019.json gzstd 1 6273951764 1164397768 26793 223.32 -github-june-2days-2019.json gzkp 1 6273951764 1120631856 17693 338.16 - -VM Image, Linux mint with a few installed applications: -https://files.klauspost.com/compress/rawstudio-mint14.7z - -file out level insize outsize millis mb/s -rawstudio-mint14.tar zskp 1 8558382592 3718400221 18206 448.29 -rawstudio-mint14.tar zskp 2 8558382592 3326118337 37074 220.15 -rawstudio-mint14.tar zskp 3 8558382592 3163842361 87306 93.49 -rawstudio-mint14.tar zskp 4 8558382592 2970480650 783862 10.41 - -rawstudio-mint14.tar zstd 1 8558382592 3609250104 17136 476.27 -rawstudio-mint14.tar zstd 3 8558382592 3341679997 29262 278.92 -rawstudio-mint14.tar zstd 6 8558382592 3235846406 77904 104.77 -rawstudio-mint14.tar zstd 9 8558382592 3160778861 140946 57.91 - -rawstudio-mint14.tar gzstd 1 8558382592 3926234992 51345 158.96 -rawstudio-mint14.tar gzkp 1 8558382592 3960117298 36722 222.26 - -CSV data: -https://files.klauspost.com/compress/nyc-taxi-data-10M.csv.zst - -file out level insize outsize millis mb/s -nyc-taxi-data-10M.csv zskp 1 3325605752 641319332 9462 335.17 -nyc-taxi-data-10M.csv zskp 2 3325605752 588976126 17570 180.50 -nyc-taxi-data-10M.csv zskp 3 3325605752 529329260 32432 97.79 -nyc-taxi-data-10M.csv zskp 4 3325605752 474949772 138025 22.98 - -nyc-taxi-data-10M.csv zstd 1 3325605752 687399637 8233 385.18 -nyc-taxi-data-10M.csv zstd 3 3325605752 598514411 10065 315.07 -nyc-taxi-data-10M.csv zstd 6 3325605752 570522953 20038 158.27 -nyc-taxi-data-10M.csv zstd 9 3325605752 517554797 64565 49.12 - -nyc-taxi-data-10M.csv gzstd 1 3325605752 928654908 21270 149.11 -nyc-taxi-data-10M.csv gzkp 1 3325605752 922273214 13929 227.68 -``` - -## Decompressor - -Status: STABLE - there may still be subtle bugs, but a wide variety of content has been tested. - -This library is being continuously [fuzz-tested](https://github.com/klauspost/compress-fuzz), -kindly supplied by [fuzzit.dev](https://fuzzit.dev/). -The main purpose of the fuzz testing is to ensure that it is not possible to crash the decoder, -or run it past its limits with ANY input provided. - -### Usage - -The package has been designed for two main usages, big streams of data and smaller in-memory buffers. -There are two main usages of the package for these. Both of them are accessed by creating a `Decoder`. - -For streaming use a simple setup could look like this: - -```Go -import "github.com/klauspost/compress/zstd" - -func Decompress(in io.Reader, out io.Writer) error { - d, err := zstd.NewReader(in) - if err != nil { - return err - } - defer d.Close() - - // Copy content... - _, err = io.Copy(out, d) - return err -} -``` - -It is important to use the "Close" function when you no longer need the Reader to stop running goroutines, -when running with default settings. -Goroutines will exit once an error has been returned, including `io.EOF` at the end of a stream. - -Streams are decoded concurrently in 4 asynchronous stages to give the best possible throughput. -However, if you prefer synchronous decompression, use `WithDecoderConcurrency(1)` which will decompress data -as it is being requested only. - -For decoding buffers, it could look something like this: - -```Go -import "github.com/klauspost/compress/zstd" - -// Create a reader that caches decompressors. -// For this operation type we supply a nil Reader. -var decoder, _ = zstd.NewReader(nil, zstd.WithDecoderConcurrency(0)) - -// Decompress a buffer. We don't supply a destination buffer, -// so it will be allocated by the decoder. -func Decompress(src []byte) ([]byte, error) { - return decoder.DecodeAll(src, nil) -} -``` - -Both of these cases should provide the functionality needed. -The decoder can be used for *concurrent* decompression of multiple buffers. -By default 4 decompressors will be created. - -It will only allow a certain number of concurrent operations to run. -To tweak that yourself use the `WithDecoderConcurrency(n)` option when creating the decoder. -It is possible to use `WithDecoderConcurrency(0)` to create GOMAXPROCS decoders. - -### Dictionaries - -Data compressed with [dictionaries](https://github.com/facebook/zstd#the-case-for-small-data-compression) can be decompressed. - -Dictionaries are added individually to Decoders. -Dictionaries are generated by the `zstd --train` command and contains an initial state for the decoder. -To add a dictionary use the `WithDecoderDicts(dicts ...[]byte)` option with the dictionary data. -Several dictionaries can be added at once. - -The dictionary will be used automatically for the data that specifies them. -A re-used Decoder will still contain the dictionaries registered. - -When registering multiple dictionaries with the same ID, the last one will be used. - -It is possible to use dictionaries when compressing data. - -To enable a dictionary use `WithEncoderDict(dict []byte)`. Here only one dictionary will be used -and it will likely be used even if it doesn't improve compression. - -The used dictionary must be used to decompress the content. - -For any real gains, the dictionary should be built with similar data. -If an unsuitable dictionary is used the output may be slightly larger than using no dictionary. -Use the [zstd commandline tool](https://github.com/facebook/zstd/releases) to build a dictionary from sample data. -For information see [zstd dictionary information](https://github.com/facebook/zstd#the-case-for-small-data-compression). - -For now there is a fixed startup performance penalty for compressing content with dictionaries. -This will likely be improved over time. Just be aware to test performance when implementing. - -### Allocation-less operation - -The decoder has been designed to operate without allocations after a warmup. - -This means that you should *store* the decoder for best performance. -To re-use a stream decoder, use the `Reset(r io.Reader) error` to switch to another stream. -A decoder can safely be re-used even if the previous stream failed. - -To release the resources, you must call the `Close()` function on a decoder. -After this it can *no longer be reused*, but all running goroutines will be stopped. -So you *must* use this if you will no longer need the Reader. - -For decompressing smaller buffers a single decoder can be used. -When decoding buffers, you can supply a destination slice with length 0 and your expected capacity. -In this case no unneeded allocations should be made. - -### Concurrency - -The buffer decoder does everything on the same goroutine and does nothing concurrently. -It can however decode several buffers concurrently. Use `WithDecoderConcurrency(n)` to limit that. - -The stream decoder will create goroutines that: - -1) Reads input and splits the input into blocks. -2) Decompression of literals. -3) Decompression of sequences. -4) Reconstruction of output stream. - -So effectively this also means the decoder will "read ahead" and prepare data to always be available for output. - -The concurrency level will, for streams, determine how many blocks ahead the compression will start. - -Since "blocks" are quite dependent on the output of the previous block stream decoding will only have limited concurrency. - -In practice this means that concurrency is often limited to utilizing about 3 cores effectively. - -### Benchmarks - -The first two are streaming decodes and the last are smaller inputs. - -Running on AMD Ryzen 9 3950X 16-Core Processor. AMD64 assembly used. - -``` -BenchmarkDecoderSilesia-32 5 206878840 ns/op 1024.50 MB/s 49808 B/op 43 allocs/op -BenchmarkDecoderEnwik9-32 1 1271809000 ns/op 786.28 MB/s 72048 B/op 52 allocs/op - -Concurrent blocks, performance: - -BenchmarkDecoder_DecodeAllParallel/kppkn.gtb.zst-32 67356 17857 ns/op 10321.96 MB/s 22.48 pct 102 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/geo.protodata.zst-32 266656 4421 ns/op 26823.21 MB/s 11.89 pct 19 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/plrabn12.txt.zst-32 20992 56842 ns/op 8477.17 MB/s 39.90 pct 754 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/lcet10.txt.zst-32 27456 43932 ns/op 9714.01 MB/s 33.27 pct 524 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/asyoulik.txt.zst-32 78432 15047 ns/op 8319.15 MB/s 40.34 pct 66 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/alice29.txt.zst-32 65800 18436 ns/op 8249.63 MB/s 37.75 pct 88 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/html_x_4.zst-32 102993 11523 ns/op 35546.09 MB/s 3.637 pct 143 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/paper-100k.pdf.zst-32 1000000 1070 ns/op 95720.98 MB/s 80.53 pct 3 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/fireworks.jpeg.zst-32 749802 1752 ns/op 70272.35 MB/s 100.0 pct 5 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/urls.10K.zst-32 22640 52934 ns/op 13263.37 MB/s 26.25 pct 1014 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/html.zst-32 226412 5232 ns/op 19572.27 MB/s 14.49 pct 20 B/op 0 allocs/op -BenchmarkDecoder_DecodeAllParallel/comp-data.bin.zst-32 923041 1276 ns/op 3194.71 MB/s 31.26 pct 0 B/op 0 allocs/op -``` - -This reflects the performance around May 2022, but this may be out of date. - -## Zstd inside ZIP files - -It is possible to use zstandard to compress individual files inside zip archives. -While this isn't widely supported it can be useful for internal files. - -To support the compression and decompression of these files you must register a compressor and decompressor. - -It is highly recommended registering the (de)compressors on individual zip Reader/Writer and NOT -use the global registration functions. The main reason for this is that 2 registrations from -different packages will result in a panic. - -It is a good idea to only have a single compressor and decompressor, since they can be used for multiple zip -files concurrently, and using a single instance will allow reusing some resources. - -See [this example](https://pkg.go.dev/github.com/klauspost/compress/zstd#example-ZipCompressor) for -how to compress and decompress files inside zip archives. - -# Contributions - -Contributions are always welcome. -For new features/fixes, remember to add tests and for performance enhancements include benchmarks. - -For general feedback and experience reports, feel free to open an issue or write me on [Twitter](https://twitter.com/sh0dan). - -This package includes the excellent [`github.com/cespare/xxhash`](https://github.com/cespare/xxhash) package Copyright (c) 2016 Caleb Spare. diff --git a/vendor/github.com/klauspost/compress/zstd/bitreader.go b/vendor/github.com/klauspost/compress/zstd/bitreader.go deleted file mode 100644 index 25ca983941..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/bitreader.go +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "encoding/binary" - "errors" - "fmt" - "io" - "math/bits" -) - -// bitReader reads a bitstream in reverse. -// The last set bit indicates the start of the stream and is used -// for aligning the input. -type bitReader struct { - in []byte - value uint64 // Maybe use [16]byte, but shifting is awkward. - bitsRead uint8 -} - -// init initializes and resets the bit reader. -func (b *bitReader) init(in []byte) error { - if len(in) < 1 { - return errors.New("corrupt stream: too short") - } - b.in = in - // The highest bit of the last byte indicates where to start - v := in[len(in)-1] - if v == 0 { - return errors.New("corrupt stream, did not find end of stream") - } - b.bitsRead = 64 - b.value = 0 - if len(in) >= 8 { - b.fillFastStart() - } else { - b.fill() - b.fill() - } - b.bitsRead += 8 - uint8(highBits(uint32(v))) - return nil -} - -// getBits will return n bits. n can be 0. -func (b *bitReader) getBits(n uint8) int { - if n == 0 /*|| b.bitsRead >= 64 */ { - return 0 - } - return int(b.get32BitsFast(n)) -} - -// get32BitsFast requires that at least one bit is requested every time. -// There are no checks if the buffer is filled. -func (b *bitReader) get32BitsFast(n uint8) uint32 { - const regMask = 64 - 1 - v := uint32((b.value << (b.bitsRead & regMask)) >> ((regMask + 1 - n) & regMask)) - b.bitsRead += n - return v -} - -// fillFast() will make sure at least 32 bits are available. -// There must be at least 4 bytes available. -func (b *bitReader) fillFast() { - if b.bitsRead < 32 { - return - } - v := b.in[len(b.in)-4:] - b.in = b.in[:len(b.in)-4] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - b.value = (b.value << 32) | uint64(low) - b.bitsRead -= 32 -} - -// fillFastStart() assumes the bitreader is empty and there is at least 8 bytes to read. -func (b *bitReader) fillFastStart() { - v := b.in[len(b.in)-8:] - b.in = b.in[:len(b.in)-8] - b.value = binary.LittleEndian.Uint64(v) - b.bitsRead = 0 -} - -// fill() will make sure at least 32 bits are available. -func (b *bitReader) fill() { - if b.bitsRead < 32 { - return - } - if len(b.in) >= 4 { - v := b.in[len(b.in)-4:] - b.in = b.in[:len(b.in)-4] - low := (uint32(v[0])) | (uint32(v[1]) << 8) | (uint32(v[2]) << 16) | (uint32(v[3]) << 24) - b.value = (b.value << 32) | uint64(low) - b.bitsRead -= 32 - return - } - - b.bitsRead -= uint8(8 * len(b.in)) - for len(b.in) > 0 { - b.value = (b.value << 8) | uint64(b.in[len(b.in)-1]) - b.in = b.in[:len(b.in)-1] - } -} - -// finished returns true if all bits have been read from the bit stream. -func (b *bitReader) finished() bool { - return len(b.in) == 0 && b.bitsRead >= 64 -} - -// overread returns true if more bits have been requested than is on the stream. -func (b *bitReader) overread() bool { - return b.bitsRead > 64 -} - -// remain returns the number of bits remaining. -func (b *bitReader) remain() uint { - return 8*uint(len(b.in)) + 64 - uint(b.bitsRead) -} - -// close the bitstream and returns an error if out-of-buffer reads occurred. -func (b *bitReader) close() error { - // Release reference. - b.in = nil - if !b.finished() { - return fmt.Errorf("%d extra bits on block, should be 0", b.remain()) - } - if b.bitsRead > 64 { - return io.ErrUnexpectedEOF - } - return nil -} - -func highBits(val uint32) (n uint32) { - return uint32(bits.Len32(val) - 1) -} diff --git a/vendor/github.com/klauspost/compress/zstd/bitwriter.go b/vendor/github.com/klauspost/compress/zstd/bitwriter.go deleted file mode 100644 index 1952f175b0..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/bitwriter.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2018 Klaus Post. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// Based on work Copyright (c) 2013, Yann Collet, released under BSD License. - -package zstd - -// bitWriter will write bits. -// First bit will be LSB of the first byte of output. -type bitWriter struct { - bitContainer uint64 - nBits uint8 - out []byte -} - -// bitMask16 is bitmasks. Has extra to avoid bounds check. -var bitMask16 = [32]uint16{ - 0, 1, 3, 7, 0xF, 0x1F, - 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, - 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0xFFFF, - 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, - 0xFFFF, 0xFFFF} /* up to 16 bits */ - -var bitMask32 = [32]uint32{ - 0, 1, 3, 7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, - 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, - 0x1ffff, 0x3ffff, 0x7FFFF, 0xfFFFF, 0x1fFFFF, 0x3fFFFF, 0x7fFFFF, 0xffFFFF, - 0x1ffFFFF, 0x3ffFFFF, 0x7ffFFFF, 0xfffFFFF, 0x1fffFFFF, 0x3fffFFFF, 0x7fffFFFF, -} // up to 32 bits - -// addBits16NC will add up to 16 bits. -// It will not check if there is space for them, -// so the caller must ensure that it has flushed recently. -func (b *bitWriter) addBits16NC(value uint16, bits uint8) { - b.bitContainer |= uint64(value&bitMask16[bits&31]) << (b.nBits & 63) - b.nBits += bits -} - -// addBits32NC will add up to 31 bits. -// It will not check if there is space for them, -// so the caller must ensure that it has flushed recently. -func (b *bitWriter) addBits32NC(value uint32, bits uint8) { - b.bitContainer |= uint64(value&bitMask32[bits&31]) << (b.nBits & 63) - b.nBits += bits -} - -// addBits64NC will add up to 64 bits. -// There must be space for 32 bits. -func (b *bitWriter) addBits64NC(value uint64, bits uint8) { - if bits <= 31 { - b.addBits32Clean(uint32(value), bits) - return - } - b.addBits32Clean(uint32(value), 32) - b.flush32() - b.addBits32Clean(uint32(value>>32), bits-32) -} - -// addBits32Clean will add up to 32 bits. -// It will not check if there is space for them. -// The input must not contain more bits than specified. -func (b *bitWriter) addBits32Clean(value uint32, bits uint8) { - b.bitContainer |= uint64(value) << (b.nBits & 63) - b.nBits += bits -} - -// addBits16Clean will add up to 16 bits. value may not contain more set bits than indicated. -// It will not check if there is space for them, so the caller must ensure that it has flushed recently. -func (b *bitWriter) addBits16Clean(value uint16, bits uint8) { - b.bitContainer |= uint64(value) << (b.nBits & 63) - b.nBits += bits -} - -// flush32 will flush out, so there are at least 32 bits available for writing. -func (b *bitWriter) flush32() { - if b.nBits < 32 { - return - } - b.out = append(b.out, - byte(b.bitContainer), - byte(b.bitContainer>>8), - byte(b.bitContainer>>16), - byte(b.bitContainer>>24)) - b.nBits -= 32 - b.bitContainer >>= 32 -} - -// flushAlign will flush remaining full bytes and align to next byte boundary. -func (b *bitWriter) flushAlign() { - nbBytes := (b.nBits + 7) >> 3 - for i := uint8(0); i < nbBytes; i++ { - b.out = append(b.out, byte(b.bitContainer>>(i*8))) - } - b.nBits = 0 - b.bitContainer = 0 -} - -// close will write the alignment bit and write the final byte(s) -// to the output. -func (b *bitWriter) close() { - // End mark - b.addBits16Clean(1, 1) - // flush until next byte. - b.flushAlign() -} - -// reset and continue writing by appending to out. -func (b *bitWriter) reset(out []byte) { - b.bitContainer = 0 - b.nBits = 0 - b.out = out -} diff --git a/vendor/github.com/klauspost/compress/zstd/blockdec.go b/vendor/github.com/klauspost/compress/zstd/blockdec.go deleted file mode 100644 index 9c28840c3b..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/blockdec.go +++ /dev/null @@ -1,731 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "hash/crc32" - "io" - "os" - "path/filepath" - "sync" - - "github.com/klauspost/compress/huff0" - "github.com/klauspost/compress/zstd/internal/xxhash" -) - -type blockType uint8 - -//go:generate stringer -type=blockType,literalsBlockType,seqCompMode,tableIndex - -const ( - blockTypeRaw blockType = iota - blockTypeRLE - blockTypeCompressed - blockTypeReserved -) - -type literalsBlockType uint8 - -const ( - literalsBlockRaw literalsBlockType = iota - literalsBlockRLE - literalsBlockCompressed - literalsBlockTreeless -) - -const ( - // maxCompressedBlockSize is the biggest allowed compressed block size (128KB) - maxCompressedBlockSize = 128 << 10 - - compressedBlockOverAlloc = 16 - maxCompressedBlockSizeAlloc = 128<<10 + compressedBlockOverAlloc - - // Maximum possible block size (all Raw+Uncompressed). - maxBlockSize = (1 << 21) - 1 - - maxMatchLen = 131074 - maxSequences = 0x7f00 + 0xffff - - // We support slightly less than the reference decoder to be able to - // use ints on 32 bit archs. - maxOffsetBits = 30 -) - -var ( - huffDecoderPool = sync.Pool{New: func() interface{} { - return &huff0.Scratch{} - }} - - fseDecoderPool = sync.Pool{New: func() interface{} { - return &fseDecoder{} - }} -) - -type blockDec struct { - // Raw source data of the block. - data []byte - dataStorage []byte - - // Destination of the decoded data. - dst []byte - - // Buffer for literals data. - literalBuf []byte - - // Window size of the block. - WindowSize uint64 - - err error - - // Check against this crc, if hasCRC is true. - checkCRC uint32 - hasCRC bool - - // Frame to use for singlethreaded decoding. - // Should not be used by the decoder itself since parent may be another frame. - localFrame *frameDec - - sequence []seqVals - - async struct { - newHist *history - literals []byte - seqData []byte - seqSize int // Size of uncompressed sequences - fcs uint64 - } - - // Block is RLE, this is the size. - RLESize uint32 - - Type blockType - - // Is this the last block of a frame? - Last bool - - // Use less memory - lowMem bool -} - -func (b *blockDec) String() string { - if b == nil { - return "" - } - return fmt.Sprintf("Steam Size: %d, Type: %v, Last: %t, Window: %d", len(b.data), b.Type, b.Last, b.WindowSize) -} - -func newBlockDec(lowMem bool) *blockDec { - b := blockDec{ - lowMem: lowMem, - } - return &b -} - -// reset will reset the block. -// Input must be a start of a block and will be at the end of the block when returned. -func (b *blockDec) reset(br byteBuffer, windowSize uint64) error { - b.WindowSize = windowSize - tmp, err := br.readSmall(3) - if err != nil { - println("Reading block header:", err) - return err - } - bh := uint32(tmp[0]) | (uint32(tmp[1]) << 8) | (uint32(tmp[2]) << 16) - b.Last = bh&1 != 0 - b.Type = blockType((bh >> 1) & 3) - // find size. - cSize := int(bh >> 3) - maxSize := maxCompressedBlockSizeAlloc - switch b.Type { - case blockTypeReserved: - return ErrReservedBlockType - case blockTypeRLE: - if cSize > maxCompressedBlockSize || cSize > int(b.WindowSize) { - if debugDecoder { - printf("rle block too big: csize:%d block: %+v\n", uint64(cSize), b) - } - return ErrWindowSizeExceeded - } - b.RLESize = uint32(cSize) - if b.lowMem { - maxSize = cSize - } - cSize = 1 - case blockTypeCompressed: - if debugDecoder { - println("Data size on stream:", cSize) - } - b.RLESize = 0 - maxSize = maxCompressedBlockSizeAlloc - if windowSize < maxCompressedBlockSize && b.lowMem { - maxSize = int(windowSize) + compressedBlockOverAlloc - } - if cSize > maxCompressedBlockSize || uint64(cSize) > b.WindowSize { - if debugDecoder { - printf("compressed block too big: csize:%d block: %+v\n", uint64(cSize), b) - } - return ErrCompressedSizeTooBig - } - // Empty compressed blocks must at least be 2 bytes - // for Literals_Block_Type and one for Sequences_Section_Header. - if cSize < 2 { - return ErrBlockTooSmall - } - case blockTypeRaw: - if cSize > maxCompressedBlockSize || cSize > int(b.WindowSize) { - if debugDecoder { - printf("rle block too big: csize:%d block: %+v\n", uint64(cSize), b) - } - return ErrWindowSizeExceeded - } - - b.RLESize = 0 - // We do not need a destination for raw blocks. - maxSize = -1 - default: - panic("Invalid block type") - } - - // Read block data. - if _, ok := br.(*byteBuf); !ok && cap(b.dataStorage) < cSize { - // byteBuf doesn't need a destination buffer. - if b.lowMem || cSize > maxCompressedBlockSize { - b.dataStorage = make([]byte, 0, cSize+compressedBlockOverAlloc) - } else { - b.dataStorage = make([]byte, 0, maxCompressedBlockSizeAlloc) - } - } - b.data, err = br.readBig(cSize, b.dataStorage) - if err != nil { - if debugDecoder { - println("Reading block:", err, "(", cSize, ")", len(b.data)) - printf("%T", br) - } - return err - } - if cap(b.dst) <= maxSize { - b.dst = make([]byte, 0, maxSize+1) - } - return nil -} - -// sendEOF will make the decoder send EOF on this frame. -func (b *blockDec) sendErr(err error) { - b.Last = true - b.Type = blockTypeReserved - b.err = err -} - -// Close will release resources. -// Closed blockDec cannot be reset. -func (b *blockDec) Close() { -} - -// decodeBuf -func (b *blockDec) decodeBuf(hist *history) error { - switch b.Type { - case blockTypeRLE: - if cap(b.dst) < int(b.RLESize) { - if b.lowMem { - b.dst = make([]byte, b.RLESize) - } else { - b.dst = make([]byte, maxCompressedBlockSize) - } - } - b.dst = b.dst[:b.RLESize] - v := b.data[0] - for i := range b.dst { - b.dst[i] = v - } - hist.appendKeep(b.dst) - return nil - case blockTypeRaw: - hist.appendKeep(b.data) - return nil - case blockTypeCompressed: - saved := b.dst - // Append directly to history - if hist.ignoreBuffer == 0 { - b.dst = hist.b - hist.b = nil - } else { - b.dst = b.dst[:0] - } - err := b.decodeCompressed(hist) - if debugDecoder { - println("Decompressed to total", len(b.dst), "bytes, hash:", xxhash.Sum64(b.dst), "error:", err) - } - if hist.ignoreBuffer == 0 { - hist.b = b.dst - b.dst = saved - } else { - hist.appendKeep(b.dst) - } - return err - case blockTypeReserved: - // Used for returning errors. - return b.err - default: - panic("Invalid block type") - } -} - -func (b *blockDec) decodeLiterals(in []byte, hist *history) (remain []byte, err error) { - // There must be at least one byte for Literals_Block_Type and one for Sequences_Section_Header - if len(in) < 2 { - return in, ErrBlockTooSmall - } - - litType := literalsBlockType(in[0] & 3) - var litRegenSize int - var litCompSize int - sizeFormat := (in[0] >> 2) & 3 - var fourStreams bool - var literals []byte - switch litType { - case literalsBlockRaw, literalsBlockRLE: - switch sizeFormat { - case 0, 2: - // Regenerated_Size uses 5 bits (0-31). Literals_Section_Header uses 1 byte. - litRegenSize = int(in[0] >> 3) - in = in[1:] - case 1: - // Regenerated_Size uses 12 bits (0-4095). Literals_Section_Header uses 2 bytes. - litRegenSize = int(in[0]>>4) + (int(in[1]) << 4) - in = in[2:] - case 3: - // Regenerated_Size uses 20 bits (0-1048575). Literals_Section_Header uses 3 bytes. - if len(in) < 3 { - println("too small: litType:", litType, " sizeFormat", sizeFormat, len(in)) - return in, ErrBlockTooSmall - } - litRegenSize = int(in[0]>>4) + (int(in[1]) << 4) + (int(in[2]) << 12) - in = in[3:] - } - case literalsBlockCompressed, literalsBlockTreeless: - switch sizeFormat { - case 0, 1: - // Both Regenerated_Size and Compressed_Size use 10 bits (0-1023). - if len(in) < 3 { - println("too small: litType:", litType, " sizeFormat", sizeFormat, len(in)) - return in, ErrBlockTooSmall - } - n := uint64(in[0]>>4) + (uint64(in[1]) << 4) + (uint64(in[2]) << 12) - litRegenSize = int(n & 1023) - litCompSize = int(n >> 10) - fourStreams = sizeFormat == 1 - in = in[3:] - case 2: - fourStreams = true - if len(in) < 4 { - println("too small: litType:", litType, " sizeFormat", sizeFormat, len(in)) - return in, ErrBlockTooSmall - } - n := uint64(in[0]>>4) + (uint64(in[1]) << 4) + (uint64(in[2]) << 12) + (uint64(in[3]) << 20) - litRegenSize = int(n & 16383) - litCompSize = int(n >> 14) - in = in[4:] - case 3: - fourStreams = true - if len(in) < 5 { - println("too small: litType:", litType, " sizeFormat", sizeFormat, len(in)) - return in, ErrBlockTooSmall - } - n := uint64(in[0]>>4) + (uint64(in[1]) << 4) + (uint64(in[2]) << 12) + (uint64(in[3]) << 20) + (uint64(in[4]) << 28) - litRegenSize = int(n & 262143) - litCompSize = int(n >> 18) - in = in[5:] - } - } - if debugDecoder { - println("literals type:", litType, "litRegenSize:", litRegenSize, "litCompSize:", litCompSize, "sizeFormat:", sizeFormat, "4X:", fourStreams) - } - if litRegenSize > int(b.WindowSize) || litRegenSize > maxCompressedBlockSize { - return in, ErrWindowSizeExceeded - } - - switch litType { - case literalsBlockRaw: - if len(in) < litRegenSize { - println("too small: litType:", litType, " sizeFormat", sizeFormat, "remain:", len(in), "want:", litRegenSize) - return in, ErrBlockTooSmall - } - literals = in[:litRegenSize] - in = in[litRegenSize:] - //printf("Found %d uncompressed literals\n", litRegenSize) - case literalsBlockRLE: - if len(in) < 1 { - println("too small: litType:", litType, " sizeFormat", sizeFormat, "remain:", len(in), "want:", 1) - return in, ErrBlockTooSmall - } - if cap(b.literalBuf) < litRegenSize { - if b.lowMem { - b.literalBuf = make([]byte, litRegenSize, litRegenSize+compressedBlockOverAlloc) - } else { - b.literalBuf = make([]byte, litRegenSize, maxCompressedBlockSize+compressedBlockOverAlloc) - } - } - literals = b.literalBuf[:litRegenSize] - v := in[0] - for i := range literals { - literals[i] = v - } - in = in[1:] - if debugDecoder { - printf("Found %d RLE compressed literals\n", litRegenSize) - } - case literalsBlockTreeless: - if len(in) < litCompSize { - println("too small: litType:", litType, " sizeFormat", sizeFormat, "remain:", len(in), "want:", litCompSize) - return in, ErrBlockTooSmall - } - // Store compressed literals, so we defer decoding until we get history. - literals = in[:litCompSize] - in = in[litCompSize:] - if debugDecoder { - printf("Found %d compressed literals\n", litCompSize) - } - huff := hist.huffTree - if huff == nil { - return in, errors.New("literal block was treeless, but no history was defined") - } - // Ensure we have space to store it. - if cap(b.literalBuf) < litRegenSize { - if b.lowMem { - b.literalBuf = make([]byte, 0, litRegenSize+compressedBlockOverAlloc) - } else { - b.literalBuf = make([]byte, 0, maxCompressedBlockSize+compressedBlockOverAlloc) - } - } - var err error - // Use our out buffer. - huff.MaxDecodedSize = litRegenSize - if fourStreams { - literals, err = huff.Decoder().Decompress4X(b.literalBuf[:0:litRegenSize], literals) - } else { - literals, err = huff.Decoder().Decompress1X(b.literalBuf[:0:litRegenSize], literals) - } - // Make sure we don't leak our literals buffer - if err != nil { - println("decompressing literals:", err) - return in, err - } - if len(literals) != litRegenSize { - return in, fmt.Errorf("literal output size mismatch want %d, got %d", litRegenSize, len(literals)) - } - - case literalsBlockCompressed: - if len(in) < litCompSize { - println("too small: litType:", litType, " sizeFormat", sizeFormat, "remain:", len(in), "want:", litCompSize) - return in, ErrBlockTooSmall - } - literals = in[:litCompSize] - in = in[litCompSize:] - // Ensure we have space to store it. - if cap(b.literalBuf) < litRegenSize { - if b.lowMem { - b.literalBuf = make([]byte, 0, litRegenSize+compressedBlockOverAlloc) - } else { - b.literalBuf = make([]byte, 0, maxCompressedBlockSize+compressedBlockOverAlloc) - } - } - huff := hist.huffTree - if huff == nil || (hist.dict != nil && huff == hist.dict.litEnc) { - huff = huffDecoderPool.Get().(*huff0.Scratch) - if huff == nil { - huff = &huff0.Scratch{} - } - } - var err error - if debugDecoder { - println("huff table input:", len(literals), "CRC:", crc32.ChecksumIEEE(literals)) - } - huff, literals, err = huff0.ReadTable(literals, huff) - if err != nil { - println("reading huffman table:", err) - return in, err - } - hist.huffTree = huff - huff.MaxDecodedSize = litRegenSize - // Use our out buffer. - if fourStreams { - literals, err = huff.Decoder().Decompress4X(b.literalBuf[:0:litRegenSize], literals) - } else { - literals, err = huff.Decoder().Decompress1X(b.literalBuf[:0:litRegenSize], literals) - } - if err != nil { - println("decoding compressed literals:", err) - return in, err - } - // Make sure we don't leak our literals buffer - if len(literals) != litRegenSize { - return in, fmt.Errorf("literal output size mismatch want %d, got %d", litRegenSize, len(literals)) - } - // Re-cap to get extra size. - literals = b.literalBuf[:len(literals)] - if debugDecoder { - printf("Decompressed %d literals into %d bytes\n", litCompSize, litRegenSize) - } - } - hist.decoders.literals = literals - return in, nil -} - -// decodeCompressed will start decompressing a block. -func (b *blockDec) decodeCompressed(hist *history) error { - in := b.data - in, err := b.decodeLiterals(in, hist) - if err != nil { - return err - } - err = b.prepareSequences(in, hist) - if err != nil { - return err - } - if hist.decoders.nSeqs == 0 { - b.dst = append(b.dst, hist.decoders.literals...) - return nil - } - before := len(hist.decoders.out) - err = hist.decoders.decodeSync(hist.b[hist.ignoreBuffer:]) - if err != nil { - return err - } - if hist.decoders.maxSyncLen > 0 { - hist.decoders.maxSyncLen += uint64(before) - hist.decoders.maxSyncLen -= uint64(len(hist.decoders.out)) - } - b.dst = hist.decoders.out - hist.recentOffsets = hist.decoders.prevOffset - return nil -} - -func (b *blockDec) prepareSequences(in []byte, hist *history) (err error) { - if debugDecoder { - printf("prepareSequences: %d byte(s) input\n", len(in)) - } - // Decode Sequences - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#sequences-section - if len(in) < 1 { - return ErrBlockTooSmall - } - var nSeqs int - seqHeader := in[0] - switch { - case seqHeader < 128: - nSeqs = int(seqHeader) - in = in[1:] - case seqHeader < 255: - if len(in) < 2 { - return ErrBlockTooSmall - } - nSeqs = int(seqHeader-128)<<8 | int(in[1]) - in = in[2:] - case seqHeader == 255: - if len(in) < 3 { - return ErrBlockTooSmall - } - nSeqs = 0x7f00 + int(in[1]) + (int(in[2]) << 8) - in = in[3:] - } - if nSeqs == 0 && len(in) != 0 { - // When no sequences, there should not be any more data... - if debugDecoder { - printf("prepareSequences: 0 sequences, but %d byte(s) left on stream\n", len(in)) - } - return ErrUnexpectedBlockSize - } - - var seqs = &hist.decoders - seqs.nSeqs = nSeqs - if nSeqs > 0 { - if len(in) < 1 { - return ErrBlockTooSmall - } - br := byteReader{b: in, off: 0} - compMode := br.Uint8() - br.advance(1) - if debugDecoder { - printf("Compression modes: 0b%b", compMode) - } - if compMode&3 != 0 { - return errors.New("corrupt block: reserved bits not zero") - } - for i := uint(0); i < 3; i++ { - mode := seqCompMode((compMode >> (6 - i*2)) & 3) - if debugDecoder { - println("Table", tableIndex(i), "is", mode) - } - var seq *sequenceDec - switch tableIndex(i) { - case tableLiteralLengths: - seq = &seqs.litLengths - case tableOffsets: - seq = &seqs.offsets - case tableMatchLengths: - seq = &seqs.matchLengths - default: - panic("unknown table") - } - switch mode { - case compModePredefined: - if seq.fse != nil && !seq.fse.preDefined { - fseDecoderPool.Put(seq.fse) - } - seq.fse = &fsePredef[i] - case compModeRLE: - if br.remain() < 1 { - return ErrBlockTooSmall - } - v := br.Uint8() - br.advance(1) - if seq.fse == nil || seq.fse.preDefined { - seq.fse = fseDecoderPool.Get().(*fseDecoder) - } - symb, err := decSymbolValue(v, symbolTableX[i]) - if err != nil { - printf("RLE Transform table (%v) error: %v", tableIndex(i), err) - return err - } - seq.fse.setRLE(symb) - if debugDecoder { - printf("RLE set to 0x%x, code: %v", symb, v) - } - case compModeFSE: - if debugDecoder { - println("Reading table for", tableIndex(i)) - } - if seq.fse == nil || seq.fse.preDefined { - seq.fse = fseDecoderPool.Get().(*fseDecoder) - } - err := seq.fse.readNCount(&br, uint16(maxTableSymbol[i])) - if err != nil { - println("Read table error:", err) - return err - } - err = seq.fse.transform(symbolTableX[i]) - if err != nil { - println("Transform table error:", err) - return err - } - if debugDecoder { - println("Read table ok", "symbolLen:", seq.fse.symbolLen) - } - case compModeRepeat: - seq.repeat = true - } - if br.overread() { - return io.ErrUnexpectedEOF - } - } - in = br.unread() - } - if debugDecoder { - println("Literals:", len(seqs.literals), "hash:", xxhash.Sum64(seqs.literals), "and", seqs.nSeqs, "sequences.") - } - - if nSeqs == 0 { - if len(b.sequence) > 0 { - b.sequence = b.sequence[:0] - } - return nil - } - br := seqs.br - if br == nil { - br = &bitReader{} - } - if err := br.init(in); err != nil { - return err - } - - if err := seqs.initialize(br, hist, b.dst); err != nil { - println("initializing sequences:", err) - return err - } - // Extract blocks... - if false && hist.dict == nil { - fatalErr := func(err error) { - if err != nil { - panic(err) - } - } - fn := fmt.Sprintf("n-%d-lits-%d-prev-%d-%d-%d-win-%d.blk", hist.decoders.nSeqs, len(hist.decoders.literals), hist.recentOffsets[0], hist.recentOffsets[1], hist.recentOffsets[2], hist.windowSize) - var buf bytes.Buffer - fatalErr(binary.Write(&buf, binary.LittleEndian, hist.decoders.litLengths.fse)) - fatalErr(binary.Write(&buf, binary.LittleEndian, hist.decoders.matchLengths.fse)) - fatalErr(binary.Write(&buf, binary.LittleEndian, hist.decoders.offsets.fse)) - buf.Write(in) - os.WriteFile(filepath.Join("testdata", "seqs", fn), buf.Bytes(), os.ModePerm) - } - - return nil -} - -func (b *blockDec) decodeSequences(hist *history) error { - if cap(b.sequence) < hist.decoders.nSeqs { - if b.lowMem { - b.sequence = make([]seqVals, 0, hist.decoders.nSeqs) - } else { - b.sequence = make([]seqVals, 0, 0x7F00+0xffff) - } - } - b.sequence = b.sequence[:hist.decoders.nSeqs] - if hist.decoders.nSeqs == 0 { - hist.decoders.seqSize = len(hist.decoders.literals) - return nil - } - hist.decoders.windowSize = hist.windowSize - hist.decoders.prevOffset = hist.recentOffsets - - err := hist.decoders.decode(b.sequence) - hist.recentOffsets = hist.decoders.prevOffset - return err -} - -func (b *blockDec) executeSequences(hist *history) error { - hbytes := hist.b - if len(hbytes) > hist.windowSize { - hbytes = hbytes[len(hbytes)-hist.windowSize:] - // We do not need history anymore. - if hist.dict != nil { - hist.dict.content = nil - } - } - hist.decoders.windowSize = hist.windowSize - hist.decoders.out = b.dst[:0] - err := hist.decoders.execute(b.sequence, hbytes) - if err != nil { - return err - } - return b.updateHistory(hist) -} - -func (b *blockDec) updateHistory(hist *history) error { - if len(b.data) > maxCompressedBlockSize { - return fmt.Errorf("compressed block size too large (%d)", len(b.data)) - } - // Set output and release references. - b.dst = hist.decoders.out - hist.recentOffsets = hist.decoders.prevOffset - - if b.Last { - // if last block we don't care about history. - println("Last block, no history returned") - hist.b = hist.b[:0] - return nil - } else { - hist.append(b.dst) - if debugDecoder { - println("Finished block with ", len(b.sequence), "sequences. Added", len(b.dst), "to history, now length", len(hist.b)) - } - } - hist.decoders.out, hist.decoders.literals = nil, nil - - return nil -} diff --git a/vendor/github.com/klauspost/compress/zstd/blockenc.go b/vendor/github.com/klauspost/compress/zstd/blockenc.go deleted file mode 100644 index 32a7f401d5..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/blockenc.go +++ /dev/null @@ -1,909 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "errors" - "fmt" - "math" - "math/bits" - - "github.com/klauspost/compress/huff0" -) - -type blockEnc struct { - size int - literals []byte - sequences []seq - coders seqCoders - litEnc *huff0.Scratch - dictLitEnc *huff0.Scratch - wr bitWriter - - extraLits int - output []byte - recentOffsets [3]uint32 - prevRecentOffsets [3]uint32 - - last bool - lowMem bool -} - -// init should be used once the block has been created. -// If called more than once, the effect is the same as calling reset. -func (b *blockEnc) init() { - if b.lowMem { - // 1K literals - if cap(b.literals) < 1<<10 { - b.literals = make([]byte, 0, 1<<10) - } - const defSeqs = 20 - if cap(b.sequences) < defSeqs { - b.sequences = make([]seq, 0, defSeqs) - } - // 1K - if cap(b.output) < 1<<10 { - b.output = make([]byte, 0, 1<<10) - } - } else { - if cap(b.literals) < maxCompressedBlockSize { - b.literals = make([]byte, 0, maxCompressedBlockSize) - } - const defSeqs = 2000 - if cap(b.sequences) < defSeqs { - b.sequences = make([]seq, 0, defSeqs) - } - if cap(b.output) < maxCompressedBlockSize { - b.output = make([]byte, 0, maxCompressedBlockSize) - } - } - - if b.coders.mlEnc == nil { - b.coders.mlEnc = &fseEncoder{} - b.coders.mlPrev = &fseEncoder{} - b.coders.ofEnc = &fseEncoder{} - b.coders.ofPrev = &fseEncoder{} - b.coders.llEnc = &fseEncoder{} - b.coders.llPrev = &fseEncoder{} - } - b.litEnc = &huff0.Scratch{WantLogLess: 4} - b.reset(nil) -} - -// initNewEncode can be used to reset offsets and encoders to the initial state. -func (b *blockEnc) initNewEncode() { - b.recentOffsets = [3]uint32{1, 4, 8} - b.litEnc.Reuse = huff0.ReusePolicyNone - b.coders.setPrev(nil, nil, nil) -} - -// reset will reset the block for a new encode, but in the same stream, -// meaning that state will be carried over, but the block content is reset. -// If a previous block is provided, the recent offsets are carried over. -func (b *blockEnc) reset(prev *blockEnc) { - b.extraLits = 0 - b.literals = b.literals[:0] - b.size = 0 - b.sequences = b.sequences[:0] - b.output = b.output[:0] - b.last = false - if prev != nil { - b.recentOffsets = prev.prevRecentOffsets - } - b.dictLitEnc = nil -} - -// reset will reset the block for a new encode, but in the same stream, -// meaning that state will be carried over, but the block content is reset. -// If a previous block is provided, the recent offsets are carried over. -func (b *blockEnc) swapEncoders(prev *blockEnc) { - b.coders.swap(&prev.coders) - b.litEnc, prev.litEnc = prev.litEnc, b.litEnc -} - -// blockHeader contains the information for a block header. -type blockHeader uint32 - -// setLast sets the 'last' indicator on a block. -func (h *blockHeader) setLast(b bool) { - if b { - *h = *h | 1 - } else { - const mask = (1 << 24) - 2 - *h = *h & mask - } -} - -// setSize will store the compressed size of a block. -func (h *blockHeader) setSize(v uint32) { - const mask = 7 - *h = (*h)&mask | blockHeader(v<<3) -} - -// setType sets the block type. -func (h *blockHeader) setType(t blockType) { - const mask = 1 | (((1 << 24) - 1) ^ 7) - *h = (*h & mask) | blockHeader(t<<1) -} - -// appendTo will append the block header to a slice. -func (h blockHeader) appendTo(b []byte) []byte { - return append(b, uint8(h), uint8(h>>8), uint8(h>>16)) -} - -// String returns a string representation of the block. -func (h blockHeader) String() string { - return fmt.Sprintf("Type: %d, Size: %d, Last:%t", (h>>1)&3, h>>3, h&1 == 1) -} - -// literalsHeader contains literals header information. -type literalsHeader uint64 - -// setType can be used to set the type of literal block. -func (h *literalsHeader) setType(t literalsBlockType) { - const mask = math.MaxUint64 - 3 - *h = (*h & mask) | literalsHeader(t) -} - -// setSize can be used to set a single size, for uncompressed and RLE content. -func (h *literalsHeader) setSize(regenLen int) { - inBits := bits.Len32(uint32(regenLen)) - // Only retain 2 bits - const mask = 3 - lh := uint64(*h & mask) - switch { - case inBits < 5: - lh |= (uint64(regenLen) << 3) | (1 << 60) - if debugEncoder { - got := int(lh>>3) & 0xff - if got != regenLen { - panic(fmt.Sprint("litRegenSize = ", regenLen, "(want) != ", got, "(got)")) - } - } - case inBits < 12: - lh |= (1 << 2) | (uint64(regenLen) << 4) | (2 << 60) - case inBits < 20: - lh |= (3 << 2) | (uint64(regenLen) << 4) | (3 << 60) - default: - panic(fmt.Errorf("internal error: block too big (%d)", regenLen)) - } - *h = literalsHeader(lh) -} - -// setSizes will set the size of a compressed literals section and the input length. -func (h *literalsHeader) setSizes(compLen, inLen int, single bool) { - compBits, inBits := bits.Len32(uint32(compLen)), bits.Len32(uint32(inLen)) - // Only retain 2 bits - const mask = 3 - lh := uint64(*h & mask) - switch { - case compBits <= 10 && inBits <= 10: - if !single { - lh |= 1 << 2 - } - lh |= (uint64(inLen) << 4) | (uint64(compLen) << (10 + 4)) | (3 << 60) - if debugEncoder { - const mmask = (1 << 24) - 1 - n := (lh >> 4) & mmask - if int(n&1023) != inLen { - panic(fmt.Sprint("regensize:", int(n&1023), "!=", inLen, inBits)) - } - if int(n>>10) != compLen { - panic(fmt.Sprint("compsize:", int(n>>10), "!=", compLen, compBits)) - } - } - case compBits <= 14 && inBits <= 14: - lh |= (2 << 2) | (uint64(inLen) << 4) | (uint64(compLen) << (14 + 4)) | (4 << 60) - if single { - panic("single stream used with more than 10 bits length.") - } - case compBits <= 18 && inBits <= 18: - lh |= (3 << 2) | (uint64(inLen) << 4) | (uint64(compLen) << (18 + 4)) | (5 << 60) - if single { - panic("single stream used with more than 10 bits length.") - } - default: - panic("internal error: block too big") - } - *h = literalsHeader(lh) -} - -// appendTo will append the literals header to a byte slice. -func (h literalsHeader) appendTo(b []byte) []byte { - size := uint8(h >> 60) - switch size { - case 1: - b = append(b, uint8(h)) - case 2: - b = append(b, uint8(h), uint8(h>>8)) - case 3: - b = append(b, uint8(h), uint8(h>>8), uint8(h>>16)) - case 4: - b = append(b, uint8(h), uint8(h>>8), uint8(h>>16), uint8(h>>24)) - case 5: - b = append(b, uint8(h), uint8(h>>8), uint8(h>>16), uint8(h>>24), uint8(h>>32)) - default: - panic(fmt.Errorf("internal error: literalsHeader has invalid size (%d)", size)) - } - return b -} - -// size returns the output size with currently set values. -func (h literalsHeader) size() int { - return int(h >> 60) -} - -func (h literalsHeader) String() string { - return fmt.Sprintf("Type: %d, SizeFormat: %d, Size: 0x%d, Bytes:%d", literalsBlockType(h&3), (h>>2)&3, h&((1<<60)-1)>>4, h>>60) -} - -// pushOffsets will push the recent offsets to the backup store. -func (b *blockEnc) pushOffsets() { - b.prevRecentOffsets = b.recentOffsets -} - -// pushOffsets will push the recent offsets to the backup store. -func (b *blockEnc) popOffsets() { - b.recentOffsets = b.prevRecentOffsets -} - -// matchOffset will adjust recent offsets and return the adjusted one, -// if it matches a previous offset. -func (b *blockEnc) matchOffset(offset, lits uint32) uint32 { - // Check if offset is one of the recent offsets. - // Adjusts the output offset accordingly. - // Gives a tiny bit of compression, typically around 1%. - if true { - if lits > 0 { - switch offset { - case b.recentOffsets[0]: - offset = 1 - case b.recentOffsets[1]: - b.recentOffsets[1] = b.recentOffsets[0] - b.recentOffsets[0] = offset - offset = 2 - case b.recentOffsets[2]: - b.recentOffsets[2] = b.recentOffsets[1] - b.recentOffsets[1] = b.recentOffsets[0] - b.recentOffsets[0] = offset - offset = 3 - default: - b.recentOffsets[2] = b.recentOffsets[1] - b.recentOffsets[1] = b.recentOffsets[0] - b.recentOffsets[0] = offset - offset += 3 - } - } else { - switch offset { - case b.recentOffsets[1]: - b.recentOffsets[1] = b.recentOffsets[0] - b.recentOffsets[0] = offset - offset = 1 - case b.recentOffsets[2]: - b.recentOffsets[2] = b.recentOffsets[1] - b.recentOffsets[1] = b.recentOffsets[0] - b.recentOffsets[0] = offset - offset = 2 - case b.recentOffsets[0] - 1: - b.recentOffsets[2] = b.recentOffsets[1] - b.recentOffsets[1] = b.recentOffsets[0] - b.recentOffsets[0] = offset - offset = 3 - default: - b.recentOffsets[2] = b.recentOffsets[1] - b.recentOffsets[1] = b.recentOffsets[0] - b.recentOffsets[0] = offset - offset += 3 - } - } - } else { - offset += 3 - } - return offset -} - -// encodeRaw can be used to set the output to a raw representation of supplied bytes. -func (b *blockEnc) encodeRaw(a []byte) { - var bh blockHeader - bh.setLast(b.last) - bh.setSize(uint32(len(a))) - bh.setType(blockTypeRaw) - b.output = bh.appendTo(b.output[:0]) - b.output = append(b.output, a...) - if debugEncoder { - println("Adding RAW block, length", len(a), "last:", b.last) - } -} - -// encodeRaw can be used to set the output to a raw representation of supplied bytes. -func (b *blockEnc) encodeRawTo(dst, src []byte) []byte { - var bh blockHeader - bh.setLast(b.last) - bh.setSize(uint32(len(src))) - bh.setType(blockTypeRaw) - dst = bh.appendTo(dst) - dst = append(dst, src...) - if debugEncoder { - println("Adding RAW block, length", len(src), "last:", b.last) - } - return dst -} - -// encodeLits can be used if the block is only litLen. -func (b *blockEnc) encodeLits(lits []byte, raw bool) error { - var bh blockHeader - bh.setLast(b.last) - bh.setSize(uint32(len(lits))) - - // Don't compress extremely small blocks - if len(lits) < 8 || (len(lits) < 32 && b.dictLitEnc == nil) || raw { - if debugEncoder { - println("Adding RAW block, length", len(lits), "last:", b.last) - } - bh.setType(blockTypeRaw) - b.output = bh.appendTo(b.output) - b.output = append(b.output, lits...) - return nil - } - - var ( - out []byte - reUsed, single bool - err error - ) - if b.dictLitEnc != nil { - b.litEnc.TransferCTable(b.dictLitEnc) - b.litEnc.Reuse = huff0.ReusePolicyAllow - b.dictLitEnc = nil - } - if len(lits) >= 1024 { - // Use 4 Streams. - out, reUsed, err = huff0.Compress4X(lits, b.litEnc) - } else if len(lits) > 16 { - // Use 1 stream - single = true - out, reUsed, err = huff0.Compress1X(lits, b.litEnc) - } else { - err = huff0.ErrIncompressible - } - if err == nil && len(out)+5 > len(lits) { - // If we are close, we may still be worse or equal to raw. - var lh literalsHeader - lh.setSizes(len(out), len(lits), single) - if len(out)+lh.size() >= len(lits) { - err = huff0.ErrIncompressible - } - } - switch err { - case huff0.ErrIncompressible: - if debugEncoder { - println("Adding RAW block, length", len(lits), "last:", b.last) - } - bh.setType(blockTypeRaw) - b.output = bh.appendTo(b.output) - b.output = append(b.output, lits...) - return nil - case huff0.ErrUseRLE: - if debugEncoder { - println("Adding RLE block, length", len(lits)) - } - bh.setType(blockTypeRLE) - b.output = bh.appendTo(b.output) - b.output = append(b.output, lits[0]) - return nil - case nil: - default: - return err - } - // Compressed... - // Now, allow reuse - b.litEnc.Reuse = huff0.ReusePolicyAllow - bh.setType(blockTypeCompressed) - var lh literalsHeader - if reUsed { - if debugEncoder { - println("Reused tree, compressed to", len(out)) - } - lh.setType(literalsBlockTreeless) - } else { - if debugEncoder { - println("New tree, compressed to", len(out), "tree size:", len(b.litEnc.OutTable)) - } - lh.setType(literalsBlockCompressed) - } - // Set sizes - lh.setSizes(len(out), len(lits), single) - bh.setSize(uint32(len(out) + lh.size() + 1)) - - // Write block headers. - b.output = bh.appendTo(b.output) - b.output = lh.appendTo(b.output) - // Add compressed data. - b.output = append(b.output, out...) - // No sequences. - b.output = append(b.output, 0) - return nil -} - -// encodeRLE will encode an RLE block. -func (b *blockEnc) encodeRLE(val byte, length uint32) { - var bh blockHeader - bh.setLast(b.last) - bh.setSize(length) - bh.setType(blockTypeRLE) - b.output = bh.appendTo(b.output) - b.output = append(b.output, val) -} - -// fuzzFseEncoder can be used to fuzz the FSE encoder. -func fuzzFseEncoder(data []byte) int { - if len(data) > maxSequences || len(data) < 2 { - return 0 - } - enc := fseEncoder{} - hist := enc.Histogram() - maxSym := uint8(0) - for i, v := range data { - v = v & 63 - data[i] = v - hist[v]++ - if v > maxSym { - maxSym = v - } - } - if maxSym == 0 { - // All 0 - return 0 - } - maxCount := func(a []uint32) int { - var max uint32 - for _, v := range a { - if v > max { - max = v - } - } - return int(max) - } - cnt := maxCount(hist[:maxSym]) - if cnt == len(data) { - // RLE - return 0 - } - enc.HistogramFinished(maxSym, cnt) - err := enc.normalizeCount(len(data)) - if err != nil { - return 0 - } - _, err = enc.writeCount(nil) - if err != nil { - panic(err) - } - return 1 -} - -// encode will encode the block and append the output in b.output. -// Previous offset codes must be pushed if more blocks are expected. -func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error { - if len(b.sequences) == 0 { - return b.encodeLits(b.literals, rawAllLits) - } - if len(b.sequences) == 1 && len(org) > 0 && len(b.literals) <= 1 { - // Check common RLE cases. - seq := b.sequences[0] - if seq.litLen == uint32(len(b.literals)) && seq.offset-3 == 1 { - // Offset == 1 and 0 or 1 literals. - b.encodeRLE(org[0], b.sequences[0].matchLen+zstdMinMatch+seq.litLen) - return nil - } - } - - // We want some difference to at least account for the headers. - saved := b.size - len(b.literals) - (b.size >> 6) - if saved < 16 { - if org == nil { - return errIncompressible - } - b.popOffsets() - return b.encodeLits(org, rawAllLits) - } - - var bh blockHeader - var lh literalsHeader - bh.setLast(b.last) - bh.setType(blockTypeCompressed) - // Store offset of the block header. Needed when we know the size. - bhOffset := len(b.output) - b.output = bh.appendTo(b.output) - - var ( - out []byte - reUsed, single bool - err error - ) - if b.dictLitEnc != nil { - b.litEnc.TransferCTable(b.dictLitEnc) - b.litEnc.Reuse = huff0.ReusePolicyAllow - b.dictLitEnc = nil - } - if len(b.literals) >= 1024 && !raw { - // Use 4 Streams. - out, reUsed, err = huff0.Compress4X(b.literals, b.litEnc) - } else if len(b.literals) > 16 && !raw { - // Use 1 stream - single = true - out, reUsed, err = huff0.Compress1X(b.literals, b.litEnc) - } else { - err = huff0.ErrIncompressible - } - - if err == nil && len(out)+5 > len(b.literals) { - // If we are close, we may still be worse or equal to raw. - var lh literalsHeader - lh.setSize(len(b.literals)) - szRaw := lh.size() - lh.setSizes(len(out), len(b.literals), single) - szComp := lh.size() - if len(out)+szComp >= len(b.literals)+szRaw { - err = huff0.ErrIncompressible - } - } - switch err { - case huff0.ErrIncompressible: - lh.setType(literalsBlockRaw) - lh.setSize(len(b.literals)) - b.output = lh.appendTo(b.output) - b.output = append(b.output, b.literals...) - if debugEncoder { - println("Adding literals RAW, length", len(b.literals)) - } - case huff0.ErrUseRLE: - lh.setType(literalsBlockRLE) - lh.setSize(len(b.literals)) - b.output = lh.appendTo(b.output) - b.output = append(b.output, b.literals[0]) - if debugEncoder { - println("Adding literals RLE") - } - case nil: - // Compressed litLen... - if reUsed { - if debugEncoder { - println("reused tree") - } - lh.setType(literalsBlockTreeless) - } else { - if debugEncoder { - println("new tree, size:", len(b.litEnc.OutTable)) - } - lh.setType(literalsBlockCompressed) - if debugEncoder { - _, _, err := huff0.ReadTable(out, nil) - if err != nil { - panic(err) - } - } - } - lh.setSizes(len(out), len(b.literals), single) - if debugEncoder { - printf("Compressed %d literals to %d bytes", len(b.literals), len(out)) - println("Adding literal header:", lh) - } - b.output = lh.appendTo(b.output) - b.output = append(b.output, out...) - b.litEnc.Reuse = huff0.ReusePolicyAllow - if debugEncoder { - println("Adding literals compressed") - } - default: - if debugEncoder { - println("Adding literals ERROR:", err) - } - return err - } - // Sequence compression - - // Write the number of sequences - switch { - case len(b.sequences) < 128: - b.output = append(b.output, uint8(len(b.sequences))) - case len(b.sequences) < 0x7f00: // TODO: this could be wrong - n := len(b.sequences) - b.output = append(b.output, 128+uint8(n>>8), uint8(n)) - default: - n := len(b.sequences) - 0x7f00 - b.output = append(b.output, 255, uint8(n), uint8(n>>8)) - } - if debugEncoder { - println("Encoding", len(b.sequences), "sequences") - } - b.genCodes() - llEnc := b.coders.llEnc - ofEnc := b.coders.ofEnc - mlEnc := b.coders.mlEnc - err = llEnc.normalizeCount(len(b.sequences)) - if err != nil { - return err - } - err = ofEnc.normalizeCount(len(b.sequences)) - if err != nil { - return err - } - err = mlEnc.normalizeCount(len(b.sequences)) - if err != nil { - return err - } - - // Choose the best compression mode for each type. - // Will evaluate the new vs predefined and previous. - chooseComp := func(cur, prev, preDef *fseEncoder) (*fseEncoder, seqCompMode) { - // See if predefined/previous is better - hist := cur.count[:cur.symbolLen] - nSize := cur.approxSize(hist) + cur.maxHeaderSize() - predefSize := preDef.approxSize(hist) - prevSize := prev.approxSize(hist) - - // Add a small penalty for new encoders. - // Don't bother with extremely small (<2 byte gains). - nSize = nSize + (nSize+2*8*16)>>4 - switch { - case predefSize <= prevSize && predefSize <= nSize || forcePreDef: - if debugEncoder { - println("Using predefined", predefSize>>3, "<=", nSize>>3) - } - return preDef, compModePredefined - case prevSize <= nSize: - if debugEncoder { - println("Using previous", prevSize>>3, "<=", nSize>>3) - } - return prev, compModeRepeat - default: - if debugEncoder { - println("Using new, predef", predefSize>>3, ". previous:", prevSize>>3, ">", nSize>>3, "header max:", cur.maxHeaderSize()>>3, "bytes") - println("tl:", cur.actualTableLog, "symbolLen:", cur.symbolLen, "norm:", cur.norm[:cur.symbolLen], "hist", cur.count[:cur.symbolLen]) - } - return cur, compModeFSE - } - } - - // Write compression mode - var mode uint8 - if llEnc.useRLE { - mode |= uint8(compModeRLE) << 6 - llEnc.setRLE(b.sequences[0].llCode) - if debugEncoder { - println("llEnc.useRLE") - } - } else { - var m seqCompMode - llEnc, m = chooseComp(llEnc, b.coders.llPrev, &fsePredefEnc[tableLiteralLengths]) - mode |= uint8(m) << 6 - } - if ofEnc.useRLE { - mode |= uint8(compModeRLE) << 4 - ofEnc.setRLE(b.sequences[0].ofCode) - if debugEncoder { - println("ofEnc.useRLE") - } - } else { - var m seqCompMode - ofEnc, m = chooseComp(ofEnc, b.coders.ofPrev, &fsePredefEnc[tableOffsets]) - mode |= uint8(m) << 4 - } - - if mlEnc.useRLE { - mode |= uint8(compModeRLE) << 2 - mlEnc.setRLE(b.sequences[0].mlCode) - if debugEncoder { - println("mlEnc.useRLE, code: ", b.sequences[0].mlCode, "value", b.sequences[0].matchLen) - } - } else { - var m seqCompMode - mlEnc, m = chooseComp(mlEnc, b.coders.mlPrev, &fsePredefEnc[tableMatchLengths]) - mode |= uint8(m) << 2 - } - b.output = append(b.output, mode) - if debugEncoder { - printf("Compression modes: 0b%b", mode) - } - b.output, err = llEnc.writeCount(b.output) - if err != nil { - return err - } - start := len(b.output) - b.output, err = ofEnc.writeCount(b.output) - if err != nil { - return err - } - if false { - println("block:", b.output[start:], "tablelog", ofEnc.actualTableLog, "maxcount:", ofEnc.maxCount) - fmt.Printf("selected TableLog: %d, Symbol length: %d\n", ofEnc.actualTableLog, ofEnc.symbolLen) - for i, v := range ofEnc.norm[:ofEnc.symbolLen] { - fmt.Printf("%3d: %5d -> %4d \n", i, ofEnc.count[i], v) - } - } - b.output, err = mlEnc.writeCount(b.output) - if err != nil { - return err - } - - // Maybe in block? - wr := &b.wr - wr.reset(b.output) - - var ll, of, ml cState - - // Current sequence - seq := len(b.sequences) - 1 - s := b.sequences[seq] - llEnc.setBits(llBitsTable[:]) - mlEnc.setBits(mlBitsTable[:]) - ofEnc.setBits(nil) - - llTT, ofTT, mlTT := llEnc.ct.symbolTT[:256], ofEnc.ct.symbolTT[:256], mlEnc.ct.symbolTT[:256] - - // We have 3 bounds checks here (and in the loop). - // Since we are iterating backwards it is kinda hard to avoid. - llB, ofB, mlB := llTT[s.llCode], ofTT[s.ofCode], mlTT[s.mlCode] - ll.init(wr, &llEnc.ct, llB) - of.init(wr, &ofEnc.ct, ofB) - wr.flush32() - ml.init(wr, &mlEnc.ct, mlB) - - // Each of these lookups also generates a bounds check. - wr.addBits32NC(s.litLen, llB.outBits) - wr.addBits32NC(s.matchLen, mlB.outBits) - wr.flush32() - wr.addBits32NC(s.offset, ofB.outBits) - if debugSequences { - println("Encoded seq", seq, s, "codes:", s.llCode, s.mlCode, s.ofCode, "states:", ll.state, ml.state, of.state, "bits:", llB, mlB, ofB) - } - seq-- - // Store sequences in reverse... - for seq >= 0 { - s = b.sequences[seq] - - ofB := ofTT[s.ofCode] - wr.flush32() // tablelog max is below 8 for each, so it will fill max 24 bits. - //of.encode(ofB) - nbBitsOut := (uint32(of.state) + ofB.deltaNbBits) >> 16 - dstState := int32(of.state>>(nbBitsOut&15)) + int32(ofB.deltaFindState) - wr.addBits16NC(of.state, uint8(nbBitsOut)) - of.state = of.stateTable[dstState] - - // Accumulate extra bits. - outBits := ofB.outBits & 31 - extraBits := uint64(s.offset & bitMask32[outBits]) - extraBitsN := outBits - - mlB := mlTT[s.mlCode] - //ml.encode(mlB) - nbBitsOut = (uint32(ml.state) + mlB.deltaNbBits) >> 16 - dstState = int32(ml.state>>(nbBitsOut&15)) + int32(mlB.deltaFindState) - wr.addBits16NC(ml.state, uint8(nbBitsOut)) - ml.state = ml.stateTable[dstState] - - outBits = mlB.outBits & 31 - extraBits = extraBits<> 16 - dstState = int32(ll.state>>(nbBitsOut&15)) + int32(llB.deltaFindState) - wr.addBits16NC(ll.state, uint8(nbBitsOut)) - ll.state = ll.stateTable[dstState] - - outBits = llB.outBits & 31 - extraBits = extraBits<= b.size { - // Discard and encode as raw block. - b.output = b.encodeRawTo(b.output[:bhOffset], org) - b.popOffsets() - b.litEnc.Reuse = huff0.ReusePolicyNone - return nil - } - - // Size is output minus block header. - bh.setSize(uint32(len(b.output)-bhOffset) - 3) - if debugEncoder { - println("Rewriting block header", bh) - } - _ = bh.appendTo(b.output[bhOffset:bhOffset]) - b.coders.setPrev(llEnc, mlEnc, ofEnc) - return nil -} - -var errIncompressible = errors.New("incompressible") - -func (b *blockEnc) genCodes() { - if len(b.sequences) == 0 { - // nothing to do - return - } - if len(b.sequences) > math.MaxUint16 { - panic("can only encode up to 64K sequences") - } - // No bounds checks after here: - llH := b.coders.llEnc.Histogram() - ofH := b.coders.ofEnc.Histogram() - mlH := b.coders.mlEnc.Histogram() - for i := range llH { - llH[i] = 0 - } - for i := range ofH { - ofH[i] = 0 - } - for i := range mlH { - mlH[i] = 0 - } - - var llMax, ofMax, mlMax uint8 - for i := range b.sequences { - seq := &b.sequences[i] - v := llCode(seq.litLen) - seq.llCode = v - llH[v]++ - if v > llMax { - llMax = v - } - - v = ofCode(seq.offset) - seq.ofCode = v - ofH[v]++ - if v > ofMax { - ofMax = v - } - - v = mlCode(seq.matchLen) - seq.mlCode = v - mlH[v]++ - if v > mlMax { - mlMax = v - if debugAsserts && mlMax > maxMatchLengthSymbol { - panic(fmt.Errorf("mlMax > maxMatchLengthSymbol (%d), matchlen: %d", mlMax, seq.matchLen)) - } - } - } - maxCount := func(a []uint32) int { - var max uint32 - for _, v := range a { - if v > max { - max = v - } - } - return int(max) - } - if debugAsserts && mlMax > maxMatchLengthSymbol { - panic(fmt.Errorf("mlMax > maxMatchLengthSymbol (%d)", mlMax)) - } - if debugAsserts && ofMax > maxOffsetBits { - panic(fmt.Errorf("ofMax > maxOffsetBits (%d)", ofMax)) - } - if debugAsserts && llMax > maxLiteralLengthSymbol { - panic(fmt.Errorf("llMax > maxLiteralLengthSymbol (%d)", llMax)) - } - - b.coders.mlEnc.HistogramFinished(mlMax, maxCount(mlH[:mlMax+1])) - b.coders.ofEnc.HistogramFinished(ofMax, maxCount(ofH[:ofMax+1])) - b.coders.llEnc.HistogramFinished(llMax, maxCount(llH[:llMax+1])) -} diff --git a/vendor/github.com/klauspost/compress/zstd/blocktype_string.go b/vendor/github.com/klauspost/compress/zstd/blocktype_string.go deleted file mode 100644 index 01a01e486e..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/blocktype_string.go +++ /dev/null @@ -1,85 +0,0 @@ -// Code generated by "stringer -type=blockType,literalsBlockType,seqCompMode,tableIndex"; DO NOT EDIT. - -package zstd - -import "strconv" - -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[blockTypeRaw-0] - _ = x[blockTypeRLE-1] - _ = x[blockTypeCompressed-2] - _ = x[blockTypeReserved-3] -} - -const _blockType_name = "blockTypeRawblockTypeRLEblockTypeCompressedblockTypeReserved" - -var _blockType_index = [...]uint8{0, 12, 24, 43, 60} - -func (i blockType) String() string { - if i >= blockType(len(_blockType_index)-1) { - return "blockType(" + strconv.FormatInt(int64(i), 10) + ")" - } - return _blockType_name[_blockType_index[i]:_blockType_index[i+1]] -} -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[literalsBlockRaw-0] - _ = x[literalsBlockRLE-1] - _ = x[literalsBlockCompressed-2] - _ = x[literalsBlockTreeless-3] -} - -const _literalsBlockType_name = "literalsBlockRawliteralsBlockRLEliteralsBlockCompressedliteralsBlockTreeless" - -var _literalsBlockType_index = [...]uint8{0, 16, 32, 55, 76} - -func (i literalsBlockType) String() string { - if i >= literalsBlockType(len(_literalsBlockType_index)-1) { - return "literalsBlockType(" + strconv.FormatInt(int64(i), 10) + ")" - } - return _literalsBlockType_name[_literalsBlockType_index[i]:_literalsBlockType_index[i+1]] -} -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[compModePredefined-0] - _ = x[compModeRLE-1] - _ = x[compModeFSE-2] - _ = x[compModeRepeat-3] -} - -const _seqCompMode_name = "compModePredefinedcompModeRLEcompModeFSEcompModeRepeat" - -var _seqCompMode_index = [...]uint8{0, 18, 29, 40, 54} - -func (i seqCompMode) String() string { - if i >= seqCompMode(len(_seqCompMode_index)-1) { - return "seqCompMode(" + strconv.FormatInt(int64(i), 10) + ")" - } - return _seqCompMode_name[_seqCompMode_index[i]:_seqCompMode_index[i+1]] -} -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[tableLiteralLengths-0] - _ = x[tableOffsets-1] - _ = x[tableMatchLengths-2] -} - -const _tableIndex_name = "tableLiteralLengthstableOffsetstableMatchLengths" - -var _tableIndex_index = [...]uint8{0, 19, 31, 48} - -func (i tableIndex) String() string { - if i >= tableIndex(len(_tableIndex_index)-1) { - return "tableIndex(" + strconv.FormatInt(int64(i), 10) + ")" - } - return _tableIndex_name[_tableIndex_index[i]:_tableIndex_index[i+1]] -} diff --git a/vendor/github.com/klauspost/compress/zstd/bytebuf.go b/vendor/github.com/klauspost/compress/zstd/bytebuf.go deleted file mode 100644 index 55a388553d..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/bytebuf.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "fmt" - "io" -) - -type byteBuffer interface { - // Read up to 8 bytes. - // Returns io.ErrUnexpectedEOF if this cannot be satisfied. - readSmall(n int) ([]byte, error) - - // Read >8 bytes. - // MAY use the destination slice. - readBig(n int, dst []byte) ([]byte, error) - - // Read a single byte. - readByte() (byte, error) - - // Skip n bytes. - skipN(n int64) error -} - -// in-memory buffer -type byteBuf []byte - -func (b *byteBuf) readSmall(n int) ([]byte, error) { - if debugAsserts && n > 8 { - panic(fmt.Errorf("small read > 8 (%d). use readBig", n)) - } - bb := *b - if len(bb) < n { - return nil, io.ErrUnexpectedEOF - } - r := bb[:n] - *b = bb[n:] - return r, nil -} - -func (b *byteBuf) readBig(n int, dst []byte) ([]byte, error) { - bb := *b - if len(bb) < n { - return nil, io.ErrUnexpectedEOF - } - r := bb[:n] - *b = bb[n:] - return r, nil -} - -func (b *byteBuf) readByte() (byte, error) { - bb := *b - if len(bb) < 1 { - return 0, io.ErrUnexpectedEOF - } - r := bb[0] - *b = bb[1:] - return r, nil -} - -func (b *byteBuf) skipN(n int64) error { - bb := *b - if n < 0 { - return fmt.Errorf("negative skip (%d) requested", n) - } - if int64(len(bb)) < n { - return io.ErrUnexpectedEOF - } - *b = bb[n:] - return nil -} - -// wrapper around a reader. -type readerWrapper struct { - r io.Reader - tmp [8]byte -} - -func (r *readerWrapper) readSmall(n int) ([]byte, error) { - if debugAsserts && n > 8 { - panic(fmt.Errorf("small read > 8 (%d). use readBig", n)) - } - n2, err := io.ReadFull(r.r, r.tmp[:n]) - // We only really care about the actual bytes read. - if err != nil { - if err == io.EOF { - return nil, io.ErrUnexpectedEOF - } - if debugDecoder { - println("readSmall: got", n2, "want", n, "err", err) - } - return nil, err - } - return r.tmp[:n], nil -} - -func (r *readerWrapper) readBig(n int, dst []byte) ([]byte, error) { - if cap(dst) < n { - dst = make([]byte, n) - } - n2, err := io.ReadFull(r.r, dst[:n]) - if err == io.EOF && n > 0 { - err = io.ErrUnexpectedEOF - } - return dst[:n2], err -} - -func (r *readerWrapper) readByte() (byte, error) { - n2, err := io.ReadFull(r.r, r.tmp[:1]) - if err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - return 0, err - } - if n2 != 1 { - return 0, io.ErrUnexpectedEOF - } - return r.tmp[0], nil -} - -func (r *readerWrapper) skipN(n int64) error { - n2, err := io.CopyN(io.Discard, r.r, n) - if n2 != n { - err = io.ErrUnexpectedEOF - } - return err -} diff --git a/vendor/github.com/klauspost/compress/zstd/bytereader.go b/vendor/github.com/klauspost/compress/zstd/bytereader.go deleted file mode 100644 index 0e59a242d8..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/bytereader.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -// byteReader provides a byte reader that reads -// little endian values from a byte stream. -// The input stream is manually advanced. -// The reader performs no bounds checks. -type byteReader struct { - b []byte - off int -} - -// advance the stream b n bytes. -func (b *byteReader) advance(n uint) { - b.off += int(n) -} - -// overread returns whether we have advanced too far. -func (b *byteReader) overread() bool { - return b.off > len(b.b) -} - -// Int32 returns a little endian int32 starting at current offset. -func (b byteReader) Int32() int32 { - b2 := b.b[b.off:] - b2 = b2[:4] - v3 := int32(b2[3]) - v2 := int32(b2[2]) - v1 := int32(b2[1]) - v0 := int32(b2[0]) - return v0 | (v1 << 8) | (v2 << 16) | (v3 << 24) -} - -// Uint8 returns the next byte -func (b *byteReader) Uint8() uint8 { - v := b.b[b.off] - return v -} - -// Uint32 returns a little endian uint32 starting at current offset. -func (b byteReader) Uint32() uint32 { - if r := b.remain(); r < 4 { - // Very rare - v := uint32(0) - for i := 1; i <= r; i++ { - v = (v << 8) | uint32(b.b[len(b.b)-i]) - } - return v - } - b2 := b.b[b.off:] - b2 = b2[:4] - v3 := uint32(b2[3]) - v2 := uint32(b2[2]) - v1 := uint32(b2[1]) - v0 := uint32(b2[0]) - return v0 | (v1 << 8) | (v2 << 16) | (v3 << 24) -} - -// Uint32NC returns a little endian uint32 starting at current offset. -// The caller must be sure if there are at least 4 bytes left. -func (b byteReader) Uint32NC() uint32 { - b2 := b.b[b.off:] - b2 = b2[:4] - v3 := uint32(b2[3]) - v2 := uint32(b2[2]) - v1 := uint32(b2[1]) - v0 := uint32(b2[0]) - return v0 | (v1 << 8) | (v2 << 16) | (v3 << 24) -} - -// unread returns the unread portion of the input. -func (b byteReader) unread() []byte { - return b.b[b.off:] -} - -// remain will return the number of bytes remaining. -func (b byteReader) remain() int { - return len(b.b) - b.off -} diff --git a/vendor/github.com/klauspost/compress/zstd/decodeheader.go b/vendor/github.com/klauspost/compress/zstd/decodeheader.go deleted file mode 100644 index 6a5a2988b6..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/decodeheader.go +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright 2020+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. - -package zstd - -import ( - "encoding/binary" - "errors" - "io" -) - -// HeaderMaxSize is the maximum size of a Frame and Block Header. -// If less is sent to Header.Decode it *may* still contain enough information. -const HeaderMaxSize = 14 + 3 - -// Header contains information about the first frame and block within that. -type Header struct { - // SingleSegment specifies whether the data is to be decompressed into a - // single contiguous memory segment. - // It implies that WindowSize is invalid and that FrameContentSize is valid. - SingleSegment bool - - // WindowSize is the window of data to keep while decoding. - // Will only be set if SingleSegment is false. - WindowSize uint64 - - // Dictionary ID. - // If 0, no dictionary. - DictionaryID uint32 - - // HasFCS specifies whether FrameContentSize has a valid value. - HasFCS bool - - // FrameContentSize is the expected uncompressed size of the entire frame. - FrameContentSize uint64 - - // Skippable will be true if the frame is meant to be skipped. - // This implies that FirstBlock.OK is false. - Skippable bool - - // SkippableID is the user-specific ID for the skippable frame. - // Valid values are between 0 to 15, inclusive. - SkippableID int - - // SkippableSize is the length of the user data to skip following - // the header. - SkippableSize uint32 - - // HeaderSize is the raw size of the frame header. - // - // For normal frames, it includes the size of the magic number and - // the size of the header (per section 3.1.1.1). - // It does not include the size for any data blocks (section 3.1.1.2) nor - // the size for the trailing content checksum. - // - // For skippable frames, this counts the size of the magic number - // along with the size of the size field of the payload. - // It does not include the size of the skippable payload itself. - // The total frame size is the HeaderSize plus the SkippableSize. - HeaderSize int - - // First block information. - FirstBlock struct { - // OK will be set if first block could be decoded. - OK bool - - // Is this the last block of a frame? - Last bool - - // Is the data compressed? - // If true CompressedSize will be populated. - // Unfortunately DecompressedSize cannot be determined - // without decoding the blocks. - Compressed bool - - // DecompressedSize is the expected decompressed size of the block. - // Will be 0 if it cannot be determined. - DecompressedSize int - - // CompressedSize of the data in the block. - // Does not include the block header. - // Will be equal to DecompressedSize if not Compressed. - CompressedSize int - } - - // If set there is a checksum present for the block content. - // The checksum field at the end is always 4 bytes long. - HasCheckSum bool -} - -// Decode the header from the beginning of the stream. -// This will decode the frame header and the first block header if enough bytes are provided. -// It is recommended to provide at least HeaderMaxSize bytes. -// If the frame header cannot be read an error will be returned. -// If there isn't enough input, io.ErrUnexpectedEOF is returned. -// The FirstBlock.OK will indicate if enough information was available to decode the first block header. -func (h *Header) Decode(in []byte) error { - _, err := h.DecodeAndStrip(in) - return err -} - -// DecodeAndStrip will decode the header from the beginning of the stream -// and on success return the remaining bytes. -// This will decode the frame header and the first block header if enough bytes are provided. -// It is recommended to provide at least HeaderMaxSize bytes. -// If the frame header cannot be read an error will be returned. -// If there isn't enough input, io.ErrUnexpectedEOF is returned. -// The FirstBlock.OK will indicate if enough information was available to decode the first block header. -func (h *Header) DecodeAndStrip(in []byte) (remain []byte, err error) { - *h = Header{} - if len(in) < 4 { - return nil, io.ErrUnexpectedEOF - } - h.HeaderSize += 4 - b, in := in[:4], in[4:] - if string(b) != frameMagic { - if string(b[1:4]) != skippableFrameMagic || b[0]&0xf0 != 0x50 { - return nil, ErrMagicMismatch - } - if len(in) < 4 { - return nil, io.ErrUnexpectedEOF - } - h.HeaderSize += 4 - h.Skippable = true - h.SkippableID = int(b[0] & 0xf) - h.SkippableSize = binary.LittleEndian.Uint32(in) - return in[4:], nil - } - - // Read Window_Descriptor - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#window_descriptor - if len(in) < 1 { - return nil, io.ErrUnexpectedEOF - } - fhd, in := in[0], in[1:] - h.HeaderSize++ - h.SingleSegment = fhd&(1<<5) != 0 - h.HasCheckSum = fhd&(1<<2) != 0 - if fhd&(1<<3) != 0 { - return nil, errors.New("reserved bit set on frame header") - } - - if !h.SingleSegment { - if len(in) < 1 { - return nil, io.ErrUnexpectedEOF - } - var wd byte - wd, in = in[0], in[1:] - h.HeaderSize++ - windowLog := 10 + (wd >> 3) - windowBase := uint64(1) << windowLog - windowAdd := (windowBase / 8) * uint64(wd&0x7) - h.WindowSize = windowBase + windowAdd - } - - // Read Dictionary_ID - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#dictionary_id - if size := fhd & 3; size != 0 { - if size == 3 { - size = 4 - } - if len(in) < int(size) { - return nil, io.ErrUnexpectedEOF - } - b, in = in[:size], in[size:] - h.HeaderSize += int(size) - switch len(b) { - case 1: - h.DictionaryID = uint32(b[0]) - case 2: - h.DictionaryID = uint32(b[0]) | (uint32(b[1]) << 8) - case 4: - h.DictionaryID = uint32(b[0]) | (uint32(b[1]) << 8) | (uint32(b[2]) << 16) | (uint32(b[3]) << 24) - } - } - - // Read Frame_Content_Size - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#frame_content_size - var fcsSize int - v := fhd >> 6 - switch v { - case 0: - if h.SingleSegment { - fcsSize = 1 - } - default: - fcsSize = 1 << v - } - - if fcsSize > 0 { - h.HasFCS = true - if len(in) < fcsSize { - return nil, io.ErrUnexpectedEOF - } - b, in = in[:fcsSize], in[fcsSize:] - h.HeaderSize += int(fcsSize) - switch len(b) { - case 1: - h.FrameContentSize = uint64(b[0]) - case 2: - // When FCS_Field_Size is 2, the offset of 256 is added. - h.FrameContentSize = uint64(b[0]) | (uint64(b[1]) << 8) + 256 - case 4: - h.FrameContentSize = uint64(b[0]) | (uint64(b[1]) << 8) | (uint64(b[2]) << 16) | (uint64(b[3]) << 24) - case 8: - d1 := uint32(b[0]) | (uint32(b[1]) << 8) | (uint32(b[2]) << 16) | (uint32(b[3]) << 24) - d2 := uint32(b[4]) | (uint32(b[5]) << 8) | (uint32(b[6]) << 16) | (uint32(b[7]) << 24) - h.FrameContentSize = uint64(d1) | (uint64(d2) << 32) - } - } - - // Frame Header done, we will not fail from now on. - if len(in) < 3 { - return in, nil - } - tmp := in[:3] - bh := uint32(tmp[0]) | (uint32(tmp[1]) << 8) | (uint32(tmp[2]) << 16) - h.FirstBlock.Last = bh&1 != 0 - blockType := blockType((bh >> 1) & 3) - // find size. - cSize := int(bh >> 3) - switch blockType { - case blockTypeReserved: - return in, nil - case blockTypeRLE: - h.FirstBlock.Compressed = true - h.FirstBlock.DecompressedSize = cSize - h.FirstBlock.CompressedSize = 1 - case blockTypeCompressed: - h.FirstBlock.Compressed = true - h.FirstBlock.CompressedSize = cSize - case blockTypeRaw: - h.FirstBlock.DecompressedSize = cSize - h.FirstBlock.CompressedSize = cSize - default: - panic("Invalid block type") - } - - h.FirstBlock.OK = true - return in, nil -} - -// AppendTo will append the encoded header to the dst slice. -// There is no error checking performed on the header values. -func (h *Header) AppendTo(dst []byte) ([]byte, error) { - if h.Skippable { - magic := [4]byte{0x50, 0x2a, 0x4d, 0x18} - magic[0] |= byte(h.SkippableID & 0xf) - dst = append(dst, magic[:]...) - f := h.SkippableSize - return append(dst, uint8(f), uint8(f>>8), uint8(f>>16), uint8(f>>24)), nil - } - f := frameHeader{ - ContentSize: h.FrameContentSize, - WindowSize: uint32(h.WindowSize), - SingleSegment: h.SingleSegment, - Checksum: h.HasCheckSum, - DictID: h.DictionaryID, - } - return f.appendTo(dst), nil -} diff --git a/vendor/github.com/klauspost/compress/zstd/decoder.go b/vendor/github.com/klauspost/compress/zstd/decoder.go deleted file mode 100644 index bbca17234a..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/decoder.go +++ /dev/null @@ -1,948 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "context" - "encoding/binary" - "io" - "sync" - - "github.com/klauspost/compress/zstd/internal/xxhash" -) - -// Decoder provides decoding of zstandard streams. -// The decoder has been designed to operate without allocations after a warmup. -// This means that you should store the decoder for best performance. -// To re-use a stream decoder, use the Reset(r io.Reader) error to switch to another stream. -// A decoder can safely be re-used even if the previous stream failed. -// To release the resources, you must call the Close() function on a decoder. -type Decoder struct { - o decoderOptions - - // Unreferenced decoders, ready for use. - decoders chan *blockDec - - // Current read position used for Reader functionality. - current decoderState - - // sync stream decoding - syncStream struct { - decodedFrame uint64 - br readerWrapper - enabled bool - inFrame bool - dstBuf []byte - } - - frame *frameDec - - // Custom dictionaries. - dicts map[uint32]*dict - - // streamWg is the waitgroup for all streams - streamWg sync.WaitGroup -} - -// decoderState is used for maintaining state when the decoder -// is used for streaming. -type decoderState struct { - // current block being written to stream. - decodeOutput - - // output in order to be written to stream. - output chan decodeOutput - - // cancel remaining output. - cancel context.CancelFunc - - // crc of current frame - crc *xxhash.Digest - - flushed bool -} - -var ( - // Check the interfaces we want to support. - _ = io.WriterTo(&Decoder{}) - _ = io.Reader(&Decoder{}) -) - -// NewReader creates a new decoder. -// A nil Reader can be provided in which case Reset can be used to start a decode. -// -// A Decoder can be used in two modes: -// -// 1) As a stream, or -// 2) For stateless decoding using DecodeAll. -// -// Only a single stream can be decoded concurrently, but the same decoder -// can run multiple concurrent stateless decodes. It is even possible to -// use stateless decodes while a stream is being decoded. -// -// The Reset function can be used to initiate a new stream, which will considerably -// reduce the allocations normally caused by NewReader. -func NewReader(r io.Reader, opts ...DOption) (*Decoder, error) { - initPredefined() - var d Decoder - d.o.setDefault() - for _, o := range opts { - err := o(&d.o) - if err != nil { - return nil, err - } - } - d.current.crc = xxhash.New() - d.current.flushed = true - - if r == nil { - d.current.err = ErrDecoderNilInput - } - - // Transfer option dicts. - d.dicts = make(map[uint32]*dict, len(d.o.dicts)) - for _, dc := range d.o.dicts { - d.dicts[dc.id] = dc - } - d.o.dicts = nil - - // Create decoders - d.decoders = make(chan *blockDec, d.o.concurrent) - for i := 0; i < d.o.concurrent; i++ { - dec := newBlockDec(d.o.lowMem) - dec.localFrame = newFrameDec(d.o) - d.decoders <- dec - } - - if r == nil { - return &d, nil - } - return &d, d.Reset(r) -} - -// Read bytes from the decompressed stream into p. -// Returns the number of bytes written and any error that occurred. -// When the stream is done, io.EOF will be returned. -func (d *Decoder) Read(p []byte) (int, error) { - var n int - for { - if len(d.current.b) > 0 { - filled := copy(p, d.current.b) - p = p[filled:] - d.current.b = d.current.b[filled:] - n += filled - } - if len(p) == 0 { - break - } - if len(d.current.b) == 0 { - // We have an error and no more data - if d.current.err != nil { - break - } - if !d.nextBlock(n == 0) { - return n, d.current.err - } - } - } - if len(d.current.b) > 0 { - if debugDecoder { - println("returning", n, "still bytes left:", len(d.current.b)) - } - // Only return error at end of block - return n, nil - } - if d.current.err != nil { - d.drainOutput() - } - if debugDecoder { - println("returning", n, d.current.err, len(d.decoders)) - } - return n, d.current.err -} - -// Reset will reset the decoder the supplied stream after the current has finished processing. -// Note that this functionality cannot be used after Close has been called. -// Reset can be called with a nil reader to release references to the previous reader. -// After being called with a nil reader, no other operations than Reset or DecodeAll or Close -// should be used. -func (d *Decoder) Reset(r io.Reader) error { - if d.current.err == ErrDecoderClosed { - return d.current.err - } - - d.drainOutput() - - d.syncStream.br.r = nil - if r == nil { - d.current.err = ErrDecoderNilInput - if len(d.current.b) > 0 { - d.current.b = d.current.b[:0] - } - d.current.flushed = true - return nil - } - - // If bytes buffer and < 5MB, do sync decoding anyway. - if bb, ok := r.(byter); ok && bb.Len() < d.o.decodeBufsBelow && !d.o.limitToCap { - bb2 := bb - if debugDecoder { - println("*bytes.Buffer detected, doing sync decode, len:", bb.Len()) - } - b := bb2.Bytes() - var dst []byte - if cap(d.syncStream.dstBuf) > 0 { - dst = d.syncStream.dstBuf[:0] - } - - dst, err := d.DecodeAll(b, dst) - if err == nil { - err = io.EOF - } - // Save output buffer - d.syncStream.dstBuf = dst - d.current.b = dst - d.current.err = err - d.current.flushed = true - if debugDecoder { - println("sync decode to", len(dst), "bytes, err:", err) - } - return nil - } - // Remove current block. - d.stashDecoder() - d.current.decodeOutput = decodeOutput{} - d.current.err = nil - d.current.flushed = false - d.current.d = nil - d.syncStream.dstBuf = nil - - // Ensure no-one else is still running... - d.streamWg.Wait() - if d.frame == nil { - d.frame = newFrameDec(d.o) - } - - if d.o.concurrent == 1 { - return d.startSyncDecoder(r) - } - - d.current.output = make(chan decodeOutput, d.o.concurrent) - ctx, cancel := context.WithCancel(context.Background()) - d.current.cancel = cancel - d.streamWg.Add(1) - go d.startStreamDecoder(ctx, r, d.current.output) - - return nil -} - -// drainOutput will drain the output until errEndOfStream is sent. -func (d *Decoder) drainOutput() { - if d.current.cancel != nil { - if debugDecoder { - println("cancelling current") - } - d.current.cancel() - d.current.cancel = nil - } - if d.current.d != nil { - if debugDecoder { - printf("re-adding current decoder %p, decoders: %d", d.current.d, len(d.decoders)) - } - d.decoders <- d.current.d - d.current.d = nil - d.current.b = nil - } - if d.current.output == nil || d.current.flushed { - println("current already flushed") - return - } - for v := range d.current.output { - if v.d != nil { - if debugDecoder { - printf("re-adding decoder %p", v.d) - } - d.decoders <- v.d - } - } - d.current.output = nil - d.current.flushed = true -} - -// WriteTo writes data to w until there's no more data to write or when an error occurs. -// The return value n is the number of bytes written. -// Any error encountered during the write is also returned. -func (d *Decoder) WriteTo(w io.Writer) (int64, error) { - var n int64 - for { - if len(d.current.b) > 0 { - n2, err2 := w.Write(d.current.b) - n += int64(n2) - if err2 != nil && (d.current.err == nil || d.current.err == io.EOF) { - d.current.err = err2 - } else if n2 != len(d.current.b) { - d.current.err = io.ErrShortWrite - } - } - if d.current.err != nil { - break - } - d.nextBlock(true) - } - err := d.current.err - if err != nil { - d.drainOutput() - } - if err == io.EOF { - err = nil - } - return n, err -} - -// DecodeAll allows stateless decoding of a blob of bytes. -// Output will be appended to dst, so if the destination size is known -// you can pre-allocate the destination slice to avoid allocations. -// DecodeAll can be used concurrently. -// The Decoder concurrency limits will be respected. -func (d *Decoder) DecodeAll(input, dst []byte) ([]byte, error) { - if d.decoders == nil { - return dst, ErrDecoderClosed - } - - // Grab a block decoder and frame decoder. - block := <-d.decoders - frame := block.localFrame - initialSize := len(dst) - defer func() { - if debugDecoder { - printf("re-adding decoder: %p", block) - } - frame.rawInput = nil - frame.bBuf = nil - if frame.history.decoders.br != nil { - frame.history.decoders.br.in = nil - } - d.decoders <- block - }() - frame.bBuf = input - - for { - frame.history.reset() - err := frame.reset(&frame.bBuf) - if err != nil { - if err == io.EOF { - if debugDecoder { - println("frame reset return EOF") - } - return dst, nil - } - return dst, err - } - if err = d.setDict(frame); err != nil { - return nil, err - } - if frame.WindowSize > d.o.maxWindowSize { - if debugDecoder { - println("window size exceeded:", frame.WindowSize, ">", d.o.maxWindowSize) - } - return dst, ErrWindowSizeExceeded - } - if frame.FrameContentSize != fcsUnknown { - if frame.FrameContentSize > d.o.maxDecodedSize-uint64(len(dst)-initialSize) { - if debugDecoder { - println("decoder size exceeded; fcs:", frame.FrameContentSize, "> mcs:", d.o.maxDecodedSize-uint64(len(dst)-initialSize), "len:", len(dst)) - } - return dst, ErrDecoderSizeExceeded - } - if d.o.limitToCap && frame.FrameContentSize > uint64(cap(dst)-len(dst)) { - if debugDecoder { - println("decoder size exceeded; fcs:", frame.FrameContentSize, "> (cap-len)", cap(dst)-len(dst)) - } - return dst, ErrDecoderSizeExceeded - } - if cap(dst)-len(dst) < int(frame.FrameContentSize) { - dst2 := make([]byte, len(dst), len(dst)+int(frame.FrameContentSize)+compressedBlockOverAlloc) - copy(dst2, dst) - dst = dst2 - } - } - - if cap(dst) == 0 && !d.o.limitToCap { - // Allocate len(input) * 2 by default if nothing is provided - // and we didn't get frame content size. - size := len(input) * 2 - // Cap to 1 MB. - if size > 1<<20 { - size = 1 << 20 - } - if uint64(size) > d.o.maxDecodedSize { - size = int(d.o.maxDecodedSize) - } - dst = make([]byte, 0, size) - } - - dst, err = frame.runDecoder(dst, block) - if err != nil { - return dst, err - } - if uint64(len(dst)-initialSize) > d.o.maxDecodedSize { - return dst, ErrDecoderSizeExceeded - } - if len(frame.bBuf) == 0 { - if debugDecoder { - println("frame dbuf empty") - } - break - } - } - return dst, nil -} - -// nextBlock returns the next block. -// If an error occurs d.err will be set. -// Optionally the function can block for new output. -// If non-blocking mode is used the returned boolean will be false -// if no data was available without blocking. -func (d *Decoder) nextBlock(blocking bool) (ok bool) { - if d.current.err != nil { - // Keep error state. - return false - } - d.current.b = d.current.b[:0] - - // SYNC: - if d.syncStream.enabled { - if !blocking { - return false - } - ok = d.nextBlockSync() - if !ok { - d.stashDecoder() - } - return ok - } - - //ASYNC: - d.stashDecoder() - if blocking { - d.current.decodeOutput, ok = <-d.current.output - } else { - select { - case d.current.decodeOutput, ok = <-d.current.output: - default: - return false - } - } - if !ok { - // This should not happen, so signal error state... - d.current.err = io.ErrUnexpectedEOF - return false - } - next := d.current.decodeOutput - if next.d != nil && next.d.async.newHist != nil { - d.current.crc.Reset() - } - if debugDecoder { - var tmp [4]byte - binary.LittleEndian.PutUint32(tmp[:], uint32(xxhash.Sum64(next.b))) - println("got", len(d.current.b), "bytes, error:", d.current.err, "data crc:", tmp) - } - - if d.o.ignoreChecksum { - return true - } - - if len(next.b) > 0 { - d.current.crc.Write(next.b) - } - if next.err == nil && next.d != nil && next.d.hasCRC { - got := uint32(d.current.crc.Sum64()) - if got != next.d.checkCRC { - if debugDecoder { - printf("CRC Check Failed: %08x (got) != %08x (on stream)\n", got, next.d.checkCRC) - } - d.current.err = ErrCRCMismatch - } else { - if debugDecoder { - printf("CRC ok %08x\n", got) - } - } - } - - return true -} - -func (d *Decoder) nextBlockSync() (ok bool) { - if d.current.d == nil { - d.current.d = <-d.decoders - } - for len(d.current.b) == 0 { - if !d.syncStream.inFrame { - d.frame.history.reset() - d.current.err = d.frame.reset(&d.syncStream.br) - if d.current.err == nil { - d.current.err = d.setDict(d.frame) - } - if d.current.err != nil { - return false - } - if d.frame.WindowSize > d.o.maxDecodedSize || d.frame.WindowSize > d.o.maxWindowSize { - d.current.err = ErrDecoderSizeExceeded - return false - } - - d.syncStream.decodedFrame = 0 - d.syncStream.inFrame = true - } - d.current.err = d.frame.next(d.current.d) - if d.current.err != nil { - return false - } - d.frame.history.ensureBlock() - if debugDecoder { - println("History trimmed:", len(d.frame.history.b), "decoded already:", d.syncStream.decodedFrame) - } - histBefore := len(d.frame.history.b) - d.current.err = d.current.d.decodeBuf(&d.frame.history) - - if d.current.err != nil { - println("error after:", d.current.err) - return false - } - d.current.b = d.frame.history.b[histBefore:] - if debugDecoder { - println("history after:", len(d.frame.history.b)) - } - - // Check frame size (before CRC) - d.syncStream.decodedFrame += uint64(len(d.current.b)) - if d.syncStream.decodedFrame > d.frame.FrameContentSize { - if debugDecoder { - printf("DecodedFrame (%d) > FrameContentSize (%d)\n", d.syncStream.decodedFrame, d.frame.FrameContentSize) - } - d.current.err = ErrFrameSizeExceeded - return false - } - - // Check FCS - if d.current.d.Last && d.frame.FrameContentSize != fcsUnknown && d.syncStream.decodedFrame != d.frame.FrameContentSize { - if debugDecoder { - printf("DecodedFrame (%d) != FrameContentSize (%d)\n", d.syncStream.decodedFrame, d.frame.FrameContentSize) - } - d.current.err = ErrFrameSizeMismatch - return false - } - - // Update/Check CRC - if d.frame.HasCheckSum { - if !d.o.ignoreChecksum { - d.frame.crc.Write(d.current.b) - } - if d.current.d.Last { - if !d.o.ignoreChecksum { - d.current.err = d.frame.checkCRC() - } else { - d.current.err = d.frame.consumeCRC() - } - if d.current.err != nil { - println("CRC error:", d.current.err) - return false - } - } - } - d.syncStream.inFrame = !d.current.d.Last - } - return true -} - -func (d *Decoder) stashDecoder() { - if d.current.d != nil { - if debugDecoder { - printf("re-adding current decoder %p", d.current.d) - } - d.decoders <- d.current.d - d.current.d = nil - } -} - -// Close will release all resources. -// It is NOT possible to reuse the decoder after this. -func (d *Decoder) Close() { - if d.current.err == ErrDecoderClosed { - return - } - d.drainOutput() - if d.current.cancel != nil { - d.current.cancel() - d.streamWg.Wait() - d.current.cancel = nil - } - if d.decoders != nil { - close(d.decoders) - for dec := range d.decoders { - dec.Close() - } - d.decoders = nil - } - if d.current.d != nil { - d.current.d.Close() - d.current.d = nil - } - d.current.err = ErrDecoderClosed -} - -// IOReadCloser returns the decoder as an io.ReadCloser for convenience. -// Any changes to the decoder will be reflected, so the returned ReadCloser -// can be reused along with the decoder. -// io.WriterTo is also supported by the returned ReadCloser. -func (d *Decoder) IOReadCloser() io.ReadCloser { - return closeWrapper{d: d} -} - -// closeWrapper wraps a function call as a closer. -type closeWrapper struct { - d *Decoder -} - -// WriteTo forwards WriteTo calls to the decoder. -func (c closeWrapper) WriteTo(w io.Writer) (n int64, err error) { - return c.d.WriteTo(w) -} - -// Read forwards read calls to the decoder. -func (c closeWrapper) Read(p []byte) (n int, err error) { - return c.d.Read(p) -} - -// Close closes the decoder. -func (c closeWrapper) Close() error { - c.d.Close() - return nil -} - -type decodeOutput struct { - d *blockDec - b []byte - err error -} - -func (d *Decoder) startSyncDecoder(r io.Reader) error { - d.frame.history.reset() - d.syncStream.br = readerWrapper{r: r} - d.syncStream.inFrame = false - d.syncStream.enabled = true - d.syncStream.decodedFrame = 0 - return nil -} - -// Create Decoder: -// ASYNC: -// Spawn 3 go routines. -// 0: Read frames and decode block literals. -// 1: Decode sequences. -// 2: Execute sequences, send to output. -func (d *Decoder) startStreamDecoder(ctx context.Context, r io.Reader, output chan decodeOutput) { - defer d.streamWg.Done() - br := readerWrapper{r: r} - - var seqDecode = make(chan *blockDec, d.o.concurrent) - var seqExecute = make(chan *blockDec, d.o.concurrent) - - // Async 1: Decode sequences... - go func() { - var hist history - var hasErr bool - - for block := range seqDecode { - if hasErr { - if block != nil { - seqExecute <- block - } - continue - } - if block.async.newHist != nil { - if debugDecoder { - println("Async 1: new history, recent:", block.async.newHist.recentOffsets) - } - hist.reset() - hist.decoders = block.async.newHist.decoders - hist.recentOffsets = block.async.newHist.recentOffsets - hist.windowSize = block.async.newHist.windowSize - if block.async.newHist.dict != nil { - hist.setDict(block.async.newHist.dict) - } - } - if block.err != nil || block.Type != blockTypeCompressed { - hasErr = block.err != nil - seqExecute <- block - continue - } - - hist.decoders.literals = block.async.literals - block.err = block.prepareSequences(block.async.seqData, &hist) - if debugDecoder && block.err != nil { - println("prepareSequences returned:", block.err) - } - hasErr = block.err != nil - if block.err == nil { - block.err = block.decodeSequences(&hist) - if debugDecoder && block.err != nil { - println("decodeSequences returned:", block.err) - } - hasErr = block.err != nil - // block.async.sequence = hist.decoders.seq[:hist.decoders.nSeqs] - block.async.seqSize = hist.decoders.seqSize - } - seqExecute <- block - } - close(seqExecute) - hist.reset() - }() - - var wg sync.WaitGroup - wg.Add(1) - - // Async 3: Execute sequences... - frameHistCache := d.frame.history.b - go func() { - var hist history - var decodedFrame uint64 - var fcs uint64 - var hasErr bool - for block := range seqExecute { - out := decodeOutput{err: block.err, d: block} - if block.err != nil || hasErr { - hasErr = true - output <- out - continue - } - if block.async.newHist != nil { - if debugDecoder { - println("Async 2: new history") - } - hist.reset() - hist.windowSize = block.async.newHist.windowSize - hist.allocFrameBuffer = block.async.newHist.allocFrameBuffer - if block.async.newHist.dict != nil { - hist.setDict(block.async.newHist.dict) - } - - if cap(hist.b) < hist.allocFrameBuffer { - if cap(frameHistCache) >= hist.allocFrameBuffer { - hist.b = frameHistCache - } else { - hist.b = make([]byte, 0, hist.allocFrameBuffer) - println("Alloc history sized", hist.allocFrameBuffer) - } - } - hist.b = hist.b[:0] - fcs = block.async.fcs - decodedFrame = 0 - } - do := decodeOutput{err: block.err, d: block} - switch block.Type { - case blockTypeRLE: - if debugDecoder { - println("add rle block length:", block.RLESize) - } - - if cap(block.dst) < int(block.RLESize) { - if block.lowMem { - block.dst = make([]byte, block.RLESize) - } else { - block.dst = make([]byte, maxCompressedBlockSize) - } - } - block.dst = block.dst[:block.RLESize] - v := block.data[0] - for i := range block.dst { - block.dst[i] = v - } - hist.append(block.dst) - do.b = block.dst - case blockTypeRaw: - if debugDecoder { - println("add raw block length:", len(block.data)) - } - hist.append(block.data) - do.b = block.data - case blockTypeCompressed: - if debugDecoder { - println("execute with history length:", len(hist.b), "window:", hist.windowSize) - } - hist.decoders.seqSize = block.async.seqSize - hist.decoders.literals = block.async.literals - do.err = block.executeSequences(&hist) - hasErr = do.err != nil - if debugDecoder && hasErr { - println("executeSequences returned:", do.err) - } - do.b = block.dst - } - if !hasErr { - decodedFrame += uint64(len(do.b)) - if decodedFrame > fcs { - println("fcs exceeded", block.Last, fcs, decodedFrame) - do.err = ErrFrameSizeExceeded - hasErr = true - } else if block.Last && fcs != fcsUnknown && decodedFrame != fcs { - do.err = ErrFrameSizeMismatch - hasErr = true - } else { - if debugDecoder { - println("fcs ok", block.Last, fcs, decodedFrame) - } - } - } - output <- do - } - close(output) - frameHistCache = hist.b - wg.Done() - if debugDecoder { - println("decoder goroutines finished") - } - hist.reset() - }() - - var hist history -decodeStream: - for { - var hasErr bool - hist.reset() - decodeBlock := func(block *blockDec) { - if hasErr { - if block != nil { - seqDecode <- block - } - return - } - if block.err != nil || block.Type != blockTypeCompressed { - hasErr = block.err != nil - seqDecode <- block - return - } - - remain, err := block.decodeLiterals(block.data, &hist) - block.err = err - hasErr = block.err != nil - if err == nil { - block.async.literals = hist.decoders.literals - block.async.seqData = remain - } else if debugDecoder { - println("decodeLiterals error:", err) - } - seqDecode <- block - } - frame := d.frame - if debugDecoder { - println("New frame...") - } - var historySent bool - frame.history.reset() - err := frame.reset(&br) - if debugDecoder && err != nil { - println("Frame decoder returned", err) - } - if err == nil { - err = d.setDict(frame) - } - if err == nil && d.frame.WindowSize > d.o.maxWindowSize { - if debugDecoder { - println("decoder size exceeded, fws:", d.frame.WindowSize, "> mws:", d.o.maxWindowSize) - } - - err = ErrDecoderSizeExceeded - } - if err != nil { - select { - case <-ctx.Done(): - case dec := <-d.decoders: - dec.sendErr(err) - decodeBlock(dec) - } - break decodeStream - } - - // Go through all blocks of the frame. - for { - var dec *blockDec - select { - case <-ctx.Done(): - break decodeStream - case dec = <-d.decoders: - // Once we have a decoder, we MUST return it. - } - err := frame.next(dec) - if !historySent { - h := frame.history - if debugDecoder { - println("Alloc History:", h.allocFrameBuffer) - } - hist.reset() - if h.dict != nil { - hist.setDict(h.dict) - } - dec.async.newHist = &h - dec.async.fcs = frame.FrameContentSize - historySent = true - } else { - dec.async.newHist = nil - } - if debugDecoder && err != nil { - println("next block returned error:", err) - } - dec.err = err - dec.hasCRC = false - if dec.Last && frame.HasCheckSum && err == nil { - crc, err := frame.rawInput.readSmall(4) - if len(crc) < 4 { - if err == nil { - err = io.ErrUnexpectedEOF - - } - println("CRC missing?", err) - dec.err = err - } else { - dec.checkCRC = binary.LittleEndian.Uint32(crc) - dec.hasCRC = true - if debugDecoder { - printf("found crc to check: %08x\n", dec.checkCRC) - } - } - } - err = dec.err - last := dec.Last - decodeBlock(dec) - if err != nil { - break decodeStream - } - if last { - break - } - } - } - close(seqDecode) - wg.Wait() - hist.reset() - d.frame.history.b = frameHistCache -} - -func (d *Decoder) setDict(frame *frameDec) (err error) { - dict, ok := d.dicts[frame.DictionaryID] - if ok { - if debugDecoder { - println("setting dict", frame.DictionaryID) - } - frame.history.setDict(dict) - } else if frame.DictionaryID != 0 { - // A zero or missing dictionary id is ambiguous: - // either dictionary zero, or no dictionary. In particular, - // zstd --patch-from uses this id for the source file, - // so only return an error if the dictionary id is not zero. - err = ErrUnknownDictionary - } - return err -} diff --git a/vendor/github.com/klauspost/compress/zstd/decoder_options.go b/vendor/github.com/klauspost/compress/zstd/decoder_options.go deleted file mode 100644 index 774c5f00fe..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/decoder_options.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "errors" - "fmt" - "math/bits" - "runtime" -) - -// DOption is an option for creating a decoder. -type DOption func(*decoderOptions) error - -// options retains accumulated state of multiple options. -type decoderOptions struct { - lowMem bool - concurrent int - maxDecodedSize uint64 - maxWindowSize uint64 - dicts []*dict - ignoreChecksum bool - limitToCap bool - decodeBufsBelow int -} - -func (o *decoderOptions) setDefault() { - *o = decoderOptions{ - // use less ram: true for now, but may change. - lowMem: true, - concurrent: runtime.GOMAXPROCS(0), - maxWindowSize: MaxWindowSize, - decodeBufsBelow: 128 << 10, - } - if o.concurrent > 4 { - o.concurrent = 4 - } - o.maxDecodedSize = 64 << 30 -} - -// WithDecoderLowmem will set whether to use a lower amount of memory, -// but possibly have to allocate more while running. -func WithDecoderLowmem(b bool) DOption { - return func(o *decoderOptions) error { o.lowMem = b; return nil } -} - -// WithDecoderConcurrency sets the number of created decoders. -// When decoding block with DecodeAll, this will limit the number -// of possible concurrently running decodes. -// When decoding streams, this will limit the number of -// inflight blocks. -// When decoding streams and setting maximum to 1, -// no async decoding will be done. -// When a value of 0 is provided GOMAXPROCS will be used. -// By default this will be set to 4 or GOMAXPROCS, whatever is lower. -func WithDecoderConcurrency(n int) DOption { - return func(o *decoderOptions) error { - if n < 0 { - return errors.New("concurrency must be at least 1") - } - if n == 0 { - o.concurrent = runtime.GOMAXPROCS(0) - } else { - o.concurrent = n - } - return nil - } -} - -// WithDecoderMaxMemory allows to set a maximum decoded size for in-memory -// non-streaming operations or maximum window size for streaming operations. -// This can be used to control memory usage of potentially hostile content. -// Maximum is 1 << 63 bytes. Default is 64GiB. -func WithDecoderMaxMemory(n uint64) DOption { - return func(o *decoderOptions) error { - if n == 0 { - return errors.New("WithDecoderMaxMemory must be at least 1") - } - if n > 1<<63 { - return errors.New("WithDecoderMaxmemory must be less than 1 << 63") - } - o.maxDecodedSize = n - return nil - } -} - -// WithDecoderDicts allows to register one or more dictionaries for the decoder. -// -// Each slice in dict must be in the [dictionary format] produced by -// "zstd --train" from the Zstandard reference implementation. -// -// If several dictionaries with the same ID are provided, the last one will be used. -// -// [dictionary format]: https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#dictionary-format -func WithDecoderDicts(dicts ...[]byte) DOption { - return func(o *decoderOptions) error { - for _, b := range dicts { - d, err := loadDict(b) - if err != nil { - return err - } - o.dicts = append(o.dicts, d) - } - return nil - } -} - -// WithDecoderDictRaw registers a dictionary that may be used by the decoder. -// The slice content can be arbitrary data. -func WithDecoderDictRaw(id uint32, content []byte) DOption { - return func(o *decoderOptions) error { - if bits.UintSize > 32 && uint(len(content)) > dictMaxLength { - return fmt.Errorf("dictionary of size %d > 2GiB too large", len(content)) - } - o.dicts = append(o.dicts, &dict{id: id, content: content, offsets: [3]int{1, 4, 8}}) - return nil - } -} - -// WithDecoderMaxWindow allows to set a maximum window size for decodes. -// This allows rejecting packets that will cause big memory usage. -// The Decoder will likely allocate more memory based on the WithDecoderLowmem setting. -// If WithDecoderMaxMemory is set to a lower value, that will be used. -// Default is 512MB, Maximum is ~3.75 TB as per zstandard spec. -func WithDecoderMaxWindow(size uint64) DOption { - return func(o *decoderOptions) error { - if size < MinWindowSize { - return errors.New("WithMaxWindowSize must be at least 1KB, 1024 bytes") - } - if size > (1<<41)+7*(1<<38) { - return errors.New("WithMaxWindowSize must be less than (1<<41) + 7*(1<<38) ~ 3.75TB") - } - o.maxWindowSize = size - return nil - } -} - -// WithDecodeAllCapLimit will limit DecodeAll to decoding cap(dst)-len(dst) bytes, -// or any size set in WithDecoderMaxMemory. -// This can be used to limit decoding to a specific maximum output size. -// Disabled by default. -func WithDecodeAllCapLimit(b bool) DOption { - return func(o *decoderOptions) error { - o.limitToCap = b - return nil - } -} - -// WithDecodeBuffersBelow will fully decode readers that have a -// `Bytes() []byte` and `Len() int` interface similar to bytes.Buffer. -// This typically uses less allocations but will have the full decompressed object in memory. -// Note that DecodeAllCapLimit will disable this, as well as giving a size of 0 or less. -// Default is 128KiB. -func WithDecodeBuffersBelow(size int) DOption { - return func(o *decoderOptions) error { - o.decodeBufsBelow = size - return nil - } -} - -// IgnoreChecksum allows to forcibly ignore checksum checking. -func IgnoreChecksum(b bool) DOption { - return func(o *decoderOptions) error { - o.ignoreChecksum = b - return nil - } -} diff --git a/vendor/github.com/klauspost/compress/zstd/dict.go b/vendor/github.com/klauspost/compress/zstd/dict.go deleted file mode 100644 index b7b83164bc..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/dict.go +++ /dev/null @@ -1,565 +0,0 @@ -package zstd - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "io" - "math" - "sort" - - "github.com/klauspost/compress/huff0" -) - -type dict struct { - id uint32 - - litEnc *huff0.Scratch - llDec, ofDec, mlDec sequenceDec - offsets [3]int - content []byte -} - -const dictMagic = "\x37\xa4\x30\xec" - -// Maximum dictionary size for the reference implementation (1.5.3) is 2 GiB. -const dictMaxLength = 1 << 31 - -// ID returns the dictionary id or 0 if d is nil. -func (d *dict) ID() uint32 { - if d == nil { - return 0 - } - return d.id -} - -// ContentSize returns the dictionary content size or 0 if d is nil. -func (d *dict) ContentSize() int { - if d == nil { - return 0 - } - return len(d.content) -} - -// Content returns the dictionary content. -func (d *dict) Content() []byte { - if d == nil { - return nil - } - return d.content -} - -// Offsets returns the initial offsets. -func (d *dict) Offsets() [3]int { - if d == nil { - return [3]int{} - } - return d.offsets -} - -// LitEncoder returns the literal encoder. -func (d *dict) LitEncoder() *huff0.Scratch { - if d == nil { - return nil - } - return d.litEnc -} - -// Load a dictionary as described in -// https://github.com/facebook/zstd/blob/master/doc/zstd_compression_format.md#dictionary-format -func loadDict(b []byte) (*dict, error) { - // Check static field size. - if len(b) <= 8+(3*4) { - return nil, io.ErrUnexpectedEOF - } - d := dict{ - llDec: sequenceDec{fse: &fseDecoder{}}, - ofDec: sequenceDec{fse: &fseDecoder{}}, - mlDec: sequenceDec{fse: &fseDecoder{}}, - } - if string(b[:4]) != dictMagic { - return nil, ErrMagicMismatch - } - d.id = binary.LittleEndian.Uint32(b[4:8]) - if d.id == 0 { - return nil, errors.New("dictionaries cannot have ID 0") - } - - // Read literal table - var err error - d.litEnc, b, err = huff0.ReadTable(b[8:], nil) - if err != nil { - return nil, fmt.Errorf("loading literal table: %w", err) - } - d.litEnc.Reuse = huff0.ReusePolicyMust - - br := byteReader{ - b: b, - off: 0, - } - readDec := func(i tableIndex, dec *fseDecoder) error { - if err := dec.readNCount(&br, uint16(maxTableSymbol[i])); err != nil { - return err - } - if br.overread() { - return io.ErrUnexpectedEOF - } - err = dec.transform(symbolTableX[i]) - if err != nil { - println("Transform table error:", err) - return err - } - if debugDecoder || debugEncoder { - println("Read table ok", "symbolLen:", dec.symbolLen) - } - // Set decoders as predefined so they aren't reused. - dec.preDefined = true - return nil - } - - if err := readDec(tableOffsets, d.ofDec.fse); err != nil { - return nil, err - } - if err := readDec(tableMatchLengths, d.mlDec.fse); err != nil { - return nil, err - } - if err := readDec(tableLiteralLengths, d.llDec.fse); err != nil { - return nil, err - } - if br.remain() < 12 { - return nil, io.ErrUnexpectedEOF - } - - d.offsets[0] = int(br.Uint32()) - br.advance(4) - d.offsets[1] = int(br.Uint32()) - br.advance(4) - d.offsets[2] = int(br.Uint32()) - br.advance(4) - if d.offsets[0] <= 0 || d.offsets[1] <= 0 || d.offsets[2] <= 0 { - return nil, errors.New("invalid offset in dictionary") - } - d.content = make([]byte, br.remain()) - copy(d.content, br.unread()) - if d.offsets[0] > len(d.content) || d.offsets[1] > len(d.content) || d.offsets[2] > len(d.content) { - return nil, fmt.Errorf("initial offset bigger than dictionary content size %d, offsets: %v", len(d.content), d.offsets) - } - - return &d, nil -} - -// InspectDictionary loads a zstd dictionary and provides functions to inspect the content. -func InspectDictionary(b []byte) (interface { - ID() uint32 - ContentSize() int - Content() []byte - Offsets() [3]int - LitEncoder() *huff0.Scratch -}, error) { - initPredefined() - d, err := loadDict(b) - return d, err -} - -type BuildDictOptions struct { - // Dictionary ID. - ID uint32 - - // Content to use to create dictionary tables. - Contents [][]byte - - // History to use for all blocks. - History []byte - - // Offsets to use. - Offsets [3]int - - // CompatV155 will make the dictionary compatible with Zstd v1.5.5 and earlier. - // See https://github.com/facebook/zstd/issues/3724 - CompatV155 bool - - // Use the specified encoder level. - // The dictionary will be built using the specified encoder level, - // which will reflect speed and make the dictionary tailored for that level. - // If not set SpeedBestCompression will be used. - Level EncoderLevel - - // DebugOut will write stats and other details here if set. - DebugOut io.Writer -} - -func BuildDict(o BuildDictOptions) ([]byte, error) { - initPredefined() - hist := o.History - contents := o.Contents - debug := o.DebugOut != nil - println := func(args ...interface{}) { - if o.DebugOut != nil { - fmt.Fprintln(o.DebugOut, args...) - } - } - printf := func(s string, args ...interface{}) { - if o.DebugOut != nil { - fmt.Fprintf(o.DebugOut, s, args...) - } - } - print := func(args ...interface{}) { - if o.DebugOut != nil { - fmt.Fprint(o.DebugOut, args...) - } - } - - if int64(len(hist)) > dictMaxLength { - return nil, fmt.Errorf("dictionary of size %d > %d", len(hist), int64(dictMaxLength)) - } - if len(hist) < 8 { - return nil, fmt.Errorf("dictionary of size %d < %d", len(hist), 8) - } - if len(contents) == 0 { - return nil, errors.New("no content provided") - } - d := dict{ - id: o.ID, - litEnc: nil, - llDec: sequenceDec{}, - ofDec: sequenceDec{}, - mlDec: sequenceDec{}, - offsets: o.Offsets, - content: hist, - } - block := blockEnc{lowMem: false} - block.init() - enc := encoder(&bestFastEncoder{fastBase: fastBase{maxMatchOff: int32(maxMatchLen), bufferReset: math.MaxInt32 - int32(maxMatchLen*2), lowMem: false}}) - if o.Level != 0 { - eOpts := encoderOptions{ - level: o.Level, - blockSize: maxMatchLen, - windowSize: maxMatchLen, - dict: &d, - lowMem: false, - } - enc = eOpts.encoder() - } else { - o.Level = SpeedBestCompression - } - var ( - remain [256]int - ll [256]int - ml [256]int - of [256]int - ) - addValues := func(dst *[256]int, src []byte) { - for _, v := range src { - dst[v]++ - } - } - addHist := func(dst *[256]int, src *[256]uint32) { - for i, v := range src { - dst[i] += int(v) - } - } - seqs := 0 - nUsed := 0 - litTotal := 0 - newOffsets := make(map[uint32]int, 1000) - for _, b := range contents { - block.reset(nil) - if len(b) < 8 { - continue - } - nUsed++ - enc.Reset(&d, true) - enc.Encode(&block, b) - addValues(&remain, block.literals) - litTotal += len(block.literals) - if len(block.sequences) == 0 { - continue - } - seqs += len(block.sequences) - block.genCodes() - addHist(&ll, block.coders.llEnc.Histogram()) - addHist(&ml, block.coders.mlEnc.Histogram()) - addHist(&of, block.coders.ofEnc.Histogram()) - for i, seq := range block.sequences { - if i > 3 { - break - } - offset := seq.offset - if offset == 0 { - continue - } - if int(offset) >= len(o.History) { - continue - } - if offset > 3 { - newOffsets[offset-3]++ - } else { - newOffsets[uint32(o.Offsets[offset-1])]++ - } - } - } - // Find most used offsets. - var sortedOffsets []uint32 - for k := range newOffsets { - sortedOffsets = append(sortedOffsets, k) - } - sort.Slice(sortedOffsets, func(i, j int) bool { - a, b := sortedOffsets[i], sortedOffsets[j] - if a == b { - // Prefer the longer offset - return sortedOffsets[i] > sortedOffsets[j] - } - return newOffsets[sortedOffsets[i]] > newOffsets[sortedOffsets[j]] - }) - if len(sortedOffsets) > 3 { - if debug { - print("Offsets:") - for i, v := range sortedOffsets { - if i > 20 { - break - } - printf("[%d: %d],", v, newOffsets[v]) - } - println("") - } - - sortedOffsets = sortedOffsets[:3] - } - for i, v := range sortedOffsets { - o.Offsets[i] = int(v) - } - if debug { - println("New repeat offsets", o.Offsets) - } - - if nUsed == 0 || seqs == 0 { - return nil, fmt.Errorf("%d blocks, %d sequences found", nUsed, seqs) - } - if debug { - println("Sequences:", seqs, "Blocks:", nUsed, "Literals:", litTotal) - } - if seqs/nUsed < 512 { - // Use 512 as minimum. - nUsed = seqs / 512 - if nUsed == 0 { - nUsed = 1 - } - } - copyHist := func(dst *fseEncoder, src *[256]int) ([]byte, error) { - hist := dst.Histogram() - var maxSym uint8 - var maxCount int - var fakeLength int - for i, v := range src { - if v > 0 { - v = v / nUsed - if v == 0 { - v = 1 - } - } - if v > maxCount { - maxCount = v - } - if v != 0 { - maxSym = uint8(i) - } - fakeLength += v - hist[i] = uint32(v) - } - - // Ensure we aren't trying to represent RLE. - if maxCount == fakeLength { - for i := range hist { - if uint8(i) == maxSym { - fakeLength++ - maxSym++ - hist[i+1] = 1 - if maxSym > 1 { - break - } - } - if hist[0] == 0 { - fakeLength++ - hist[i] = 1 - if maxSym > 1 { - break - } - } - } - } - - dst.HistogramFinished(maxSym, maxCount) - dst.reUsed = false - dst.useRLE = false - err := dst.normalizeCount(fakeLength) - if err != nil { - return nil, err - } - if debug { - println("RAW:", dst.count[:maxSym+1], "NORM:", dst.norm[:maxSym+1], "LEN:", fakeLength) - } - return dst.writeCount(nil) - } - if debug { - print("Literal lengths: ") - } - llTable, err := copyHist(block.coders.llEnc, &ll) - if err != nil { - return nil, err - } - if debug { - print("Match lengths: ") - } - mlTable, err := copyHist(block.coders.mlEnc, &ml) - if err != nil { - return nil, err - } - if debug { - print("Offsets: ") - } - ofTable, err := copyHist(block.coders.ofEnc, &of) - if err != nil { - return nil, err - } - - // Literal table - avgSize := litTotal - if avgSize > huff0.BlockSizeMax/2 { - avgSize = huff0.BlockSizeMax / 2 - } - huffBuff := make([]byte, 0, avgSize) - // Target size - div := litTotal / avgSize - if div < 1 { - div = 1 - } - if debug { - println("Huffman weights:") - } - for i, n := range remain[:] { - if n > 0 { - n = n / div - // Allow all entries to be represented. - if n == 0 { - n = 1 - } - huffBuff = append(huffBuff, bytes.Repeat([]byte{byte(i)}, n)...) - if debug { - printf("[%d: %d], ", i, n) - } - } - } - if o.CompatV155 && remain[255]/div == 0 { - huffBuff = append(huffBuff, 255) - } - scratch := &huff0.Scratch{TableLog: 11} - for tries := 0; tries < 255; tries++ { - scratch = &huff0.Scratch{TableLog: 11} - _, _, err = huff0.Compress1X(huffBuff, scratch) - if err == nil { - break - } - if debug { - printf("Try %d: Huffman error: %v\n", tries+1, err) - } - huffBuff = huffBuff[:0] - if tries == 250 { - if debug { - println("Huffman: Bailing out with predefined table") - } - - // Bail out.... Just generate something - huffBuff = append(huffBuff, bytes.Repeat([]byte{255}, 10000)...) - for i := 0; i < 128; i++ { - huffBuff = append(huffBuff, byte(i)) - } - continue - } - if errors.Is(err, huff0.ErrIncompressible) { - // Try truncating least common. - for i, n := range remain[:] { - if n > 0 { - n = n / (div * (i + 1)) - if n > 0 { - huffBuff = append(huffBuff, bytes.Repeat([]byte{byte(i)}, n)...) - } - } - } - if o.CompatV155 && len(huffBuff) > 0 && huffBuff[len(huffBuff)-1] != 255 { - huffBuff = append(huffBuff, 255) - } - if len(huffBuff) == 0 { - huffBuff = append(huffBuff, 0, 255) - } - } - if errors.Is(err, huff0.ErrUseRLE) { - for i, n := range remain[:] { - n = n / (div * (i + 1)) - // Allow all entries to be represented. - if n == 0 { - n = 1 - } - huffBuff = append(huffBuff, bytes.Repeat([]byte{byte(i)}, n)...) - } - } - } - - var out bytes.Buffer - out.Write([]byte(dictMagic)) - out.Write(binary.LittleEndian.AppendUint32(nil, o.ID)) - out.Write(scratch.OutTable) - if debug { - println("huff table:", len(scratch.OutTable), "bytes") - println("of table:", len(ofTable), "bytes") - println("ml table:", len(mlTable), "bytes") - println("ll table:", len(llTable), "bytes") - } - out.Write(ofTable) - out.Write(mlTable) - out.Write(llTable) - out.Write(binary.LittleEndian.AppendUint32(nil, uint32(o.Offsets[0]))) - out.Write(binary.LittleEndian.AppendUint32(nil, uint32(o.Offsets[1]))) - out.Write(binary.LittleEndian.AppendUint32(nil, uint32(o.Offsets[2]))) - out.Write(hist) - if debug { - _, err := loadDict(out.Bytes()) - if err != nil { - panic(err) - } - i, err := InspectDictionary(out.Bytes()) - if err != nil { - panic(err) - } - println("ID:", i.ID()) - println("Content size:", i.ContentSize()) - println("Encoder:", i.LitEncoder() != nil) - println("Offsets:", i.Offsets()) - var totalSize int - for _, b := range contents { - totalSize += len(b) - } - - encWith := func(opts ...EOption) int { - enc, err := NewWriter(nil, opts...) - if err != nil { - panic(err) - } - defer enc.Close() - var dst []byte - var totalSize int - for _, b := range contents { - dst = enc.EncodeAll(b, dst[:0]) - totalSize += len(dst) - } - return totalSize - } - plain := encWith(WithEncoderLevel(o.Level)) - withDict := encWith(WithEncoderLevel(o.Level), WithEncoderDict(out.Bytes())) - println("Input size:", totalSize) - println("Plain Compressed:", plain) - println("Dict Compressed:", withDict) - println("Saved:", plain-withDict, (plain-withDict)/len(contents), "bytes per input (rounded down)") - } - return out.Bytes(), nil -} diff --git a/vendor/github.com/klauspost/compress/zstd/enc_base.go b/vendor/github.com/klauspost/compress/zstd/enc_base.go deleted file mode 100644 index 5ca46038ad..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/enc_base.go +++ /dev/null @@ -1,173 +0,0 @@ -package zstd - -import ( - "fmt" - "math/bits" - - "github.com/klauspost/compress/zstd/internal/xxhash" -) - -const ( - dictShardBits = 6 -) - -type fastBase struct { - // cur is the offset at the start of hist - cur int32 - // maximum offset. Should be at least 2x block size. - maxMatchOff int32 - bufferReset int32 - hist []byte - crc *xxhash.Digest - tmp [8]byte - blk *blockEnc - lastDictID uint32 - lowMem bool -} - -// CRC returns the underlying CRC writer. -func (e *fastBase) CRC() *xxhash.Digest { - return e.crc -} - -// AppendCRC will append the CRC to the destination slice and return it. -func (e *fastBase) AppendCRC(dst []byte) []byte { - crc := e.crc.Sum(e.tmp[:0]) - dst = append(dst, crc[7], crc[6], crc[5], crc[4]) - return dst -} - -// WindowSize returns the window size of the encoder, -// or a window size small enough to contain the input size, if > 0. -func (e *fastBase) WindowSize(size int64) int32 { - if size > 0 && size < int64(e.maxMatchOff) { - b := int32(1) << uint(bits.Len(uint(size))) - // Keep minimum window. - if b < 1024 { - b = 1024 - } - return b - } - return e.maxMatchOff -} - -// Block returns the current block. -func (e *fastBase) Block() *blockEnc { - return e.blk -} - -func (e *fastBase) addBlock(src []byte) int32 { - if debugAsserts && e.cur > e.bufferReset { - panic(fmt.Sprintf("ecur (%d) > buffer reset (%d)", e.cur, e.bufferReset)) - } - // check if we have space already - if len(e.hist)+len(src) > cap(e.hist) { - if cap(e.hist) == 0 { - e.ensureHist(len(src)) - } else { - if cap(e.hist) < int(e.maxMatchOff+maxCompressedBlockSize) { - panic(fmt.Errorf("unexpected buffer cap %d, want at least %d with window %d", cap(e.hist), e.maxMatchOff+maxCompressedBlockSize, e.maxMatchOff)) - } - // Move down - offset := int32(len(e.hist)) - e.maxMatchOff - copy(e.hist[0:e.maxMatchOff], e.hist[offset:]) - e.cur += offset - e.hist = e.hist[:e.maxMatchOff] - } - } - s := int32(len(e.hist)) - e.hist = append(e.hist, src...) - return s -} - -// ensureHist will ensure that history can keep at least this many bytes. -func (e *fastBase) ensureHist(n int) { - if cap(e.hist) >= n { - return - } - l := e.maxMatchOff - if (e.lowMem && e.maxMatchOff > maxCompressedBlockSize) || e.maxMatchOff <= maxCompressedBlockSize { - l += maxCompressedBlockSize - } else { - l += e.maxMatchOff - } - // Make it at least 1MB. - if l < 1<<20 && !e.lowMem { - l = 1 << 20 - } - // Make it at least the requested size. - if l < int32(n) { - l = int32(n) - } - e.hist = make([]byte, 0, l) -} - -// useBlock will replace the block with the provided one, -// but transfer recent offsets from the previous. -func (e *fastBase) UseBlock(enc *blockEnc) { - enc.reset(e.blk) - e.blk = enc -} - -func (e *fastBase) matchlen(s, t int32, src []byte) int32 { - if debugAsserts { - if s < 0 { - err := fmt.Sprintf("s (%d) < 0", s) - panic(err) - } - if t < 0 { - err := fmt.Sprintf("s (%d) < 0", s) - panic(err) - } - if s-t > e.maxMatchOff { - err := fmt.Sprintf("s (%d) - t (%d) > maxMatchOff (%d)", s, t, e.maxMatchOff) - panic(err) - } - if len(src)-int(s) > maxCompressedBlockSize { - panic(fmt.Sprintf("len(src)-s (%d) > maxCompressedBlockSize (%d)", len(src)-int(s), maxCompressedBlockSize)) - } - } - return int32(matchLen(src[s:], src[t:])) -} - -// Reset the encoding table. -func (e *fastBase) resetBase(d *dict, singleBlock bool) { - if e.blk == nil { - e.blk = &blockEnc{lowMem: e.lowMem} - e.blk.init() - } else { - e.blk.reset(nil) - } - e.blk.initNewEncode() - if e.crc == nil { - e.crc = xxhash.New() - } else { - e.crc.Reset() - } - e.blk.dictLitEnc = nil - if d != nil { - low := e.lowMem - if singleBlock { - e.lowMem = true - } - e.ensureHist(d.ContentSize() + maxCompressedBlockSize) - e.lowMem = low - } - - // We offset current position so everything will be out of reach. - // If above reset line, history will be purged. - if e.cur < e.bufferReset { - e.cur += e.maxMatchOff + int32(len(e.hist)) - } - e.hist = e.hist[:0] - if d != nil { - // Set offsets (currently not used) - for i, off := range d.offsets { - e.blk.recentOffsets[i] = uint32(off) - e.blk.prevRecentOffsets[i] = e.blk.recentOffsets[i] - } - // Transfer litenc. - e.blk.dictLitEnc = d.litEnc - e.hist = append(e.hist, d.content...) - } -} diff --git a/vendor/github.com/klauspost/compress/zstd/enc_best.go b/vendor/github.com/klauspost/compress/zstd/enc_best.go deleted file mode 100644 index 4613724e9d..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/enc_best.go +++ /dev/null @@ -1,560 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "bytes" - "fmt" - - "github.com/klauspost/compress" -) - -const ( - bestLongTableBits = 22 // Bits used in the long match table - bestLongTableSize = 1 << bestLongTableBits // Size of the table - bestLongLen = 8 // Bytes used for table hash - - // Note: Increasing the short table bits or making the hash shorter - // can actually lead to compression degradation since it will 'steal' more from the - // long match table and match offsets are quite big. - // This greatly depends on the type of input. - bestShortTableBits = 18 // Bits used in the short match table - bestShortTableSize = 1 << bestShortTableBits // Size of the table - bestShortLen = 4 // Bytes used for table hash - -) - -type match struct { - offset int32 - s int32 - length int32 - rep int32 - est int32 -} - -const highScore = maxMatchLen * 8 - -// estBits will estimate output bits from predefined tables. -func (m *match) estBits(bitsPerByte int32) { - mlc := mlCode(uint32(m.length - zstdMinMatch)) - var ofc uint8 - if m.rep < 0 { - ofc = ofCode(uint32(m.s-m.offset) + 3) - } else { - ofc = ofCode(uint32(m.rep) & 3) - } - // Cost, excluding - ofTT, mlTT := fsePredefEnc[tableOffsets].ct.symbolTT[ofc], fsePredefEnc[tableMatchLengths].ct.symbolTT[mlc] - - // Add cost of match encoding... - m.est = int32(ofTT.outBits + mlTT.outBits) - m.est += int32(ofTT.deltaNbBits>>16 + mlTT.deltaNbBits>>16) - // Subtract savings compared to literal encoding... - m.est -= (m.length * bitsPerByte) >> 10 - if m.est > 0 { - // Unlikely gain.. - m.length = 0 - m.est = highScore - } -} - -// bestFastEncoder uses 2 tables, one for short matches (5 bytes) and one for long matches. -// The long match table contains the previous entry with the same hash, -// effectively making it a "chain" of length 2. -// When we find a long match we choose between the two values and select the longest. -// When we find a short match, after checking the long, we check if we can find a long at n+1 -// and that it is longer (lazy matching). -type bestFastEncoder struct { - fastBase - table [bestShortTableSize]prevEntry - longTable [bestLongTableSize]prevEntry - dictTable []prevEntry - dictLongTable []prevEntry -} - -// Encode improves compression... -func (e *bestFastEncoder) Encode(blk *blockEnc, src []byte) { - const ( - // Input margin is the number of bytes we read (8) - // and the maximum we will read ahead (2) - inputMargin = 8 + 4 - minNonLiteralBlockSize = 16 - ) - - // Protect against e.cur wraparound. - for e.cur >= e.bufferReset-int32(len(e.hist)) { - if len(e.hist) == 0 { - e.table = [bestShortTableSize]prevEntry{} - e.longTable = [bestLongTableSize]prevEntry{} - e.cur = e.maxMatchOff - break - } - // Shift down everything in the table that isn't already too far away. - minOff := e.cur + int32(len(e.hist)) - e.maxMatchOff - for i := range e.table[:] { - v := e.table[i].offset - v2 := e.table[i].prev - if v < minOff { - v = 0 - v2 = 0 - } else { - v = v - e.cur + e.maxMatchOff - if v2 < minOff { - v2 = 0 - } else { - v2 = v2 - e.cur + e.maxMatchOff - } - } - e.table[i] = prevEntry{ - offset: v, - prev: v2, - } - } - for i := range e.longTable[:] { - v := e.longTable[i].offset - v2 := e.longTable[i].prev - if v < minOff { - v = 0 - v2 = 0 - } else { - v = v - e.cur + e.maxMatchOff - if v2 < minOff { - v2 = 0 - } else { - v2 = v2 - e.cur + e.maxMatchOff - } - } - e.longTable[i] = prevEntry{ - offset: v, - prev: v2, - } - } - e.cur = e.maxMatchOff - break - } - - // Add block to history - s := e.addBlock(src) - blk.size = len(src) - - // Check RLE first - if len(src) > zstdMinMatch { - ml := matchLen(src[1:], src) - if ml == len(src)-1 { - blk.literals = append(blk.literals, src[0]) - blk.sequences = append(blk.sequences, seq{litLen: 1, matchLen: uint32(len(src)-1) - zstdMinMatch, offset: 1 + 3}) - return - } - } - - if len(src) < minNonLiteralBlockSize { - blk.extraLits = len(src) - blk.literals = blk.literals[:len(src)] - copy(blk.literals, src) - return - } - - // Use this to estimate literal cost. - // Scaled by 10 bits. - bitsPerByte := int32((compress.ShannonEntropyBits(src) * 1024) / len(src)) - // Huffman can never go < 1 bit/byte - if bitsPerByte < 1024 { - bitsPerByte = 1024 - } - - // Override src - src = e.hist - sLimit := int32(len(src)) - inputMargin - const kSearchStrength = 10 - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := s - - // Relative offsets - offset1 := int32(blk.recentOffsets[0]) - offset2 := int32(blk.recentOffsets[1]) - offset3 := int32(blk.recentOffsets[2]) - - addLiterals := func(s *seq, until int32) { - if until == nextEmit { - return - } - blk.literals = append(blk.literals, src[nextEmit:until]...) - s.litLen = uint32(until - nextEmit) - } - - if debugEncoder { - println("recent offsets:", blk.recentOffsets) - } - -encodeLoop: - for { - // We allow the encoder to optionally turn off repeat offsets across blocks - canRepeat := len(blk.sequences) > 2 - - if debugAsserts && canRepeat && offset1 == 0 { - panic("offset0 was 0") - } - - const goodEnough = 250 - - cv := load6432(src, s) - - nextHashL := hashLen(cv, bestLongTableBits, bestLongLen) - nextHashS := hashLen(cv, bestShortTableBits, bestShortLen) - candidateL := e.longTable[nextHashL] - candidateS := e.table[nextHashS] - - // Set m to a match at offset if it looks like that will improve compression. - improve := func(m *match, offset int32, s int32, first uint32, rep int32) { - delta := s - offset - if delta >= e.maxMatchOff || delta <= 0 || load3232(src, offset) != first { - return - } - // Try to quick reject if we already have a long match. - if m.length > 16 { - left := len(src) - int(m.s+m.length) - // If we are too close to the end, keep as is. - if left <= 0 { - return - } - checkLen := m.length - (s - m.s) - 8 - if left > 2 && checkLen > 4 { - // Check 4 bytes, 4 bytes from the end of the current match. - a := load3232(src, offset+checkLen) - b := load3232(src, s+checkLen) - if a != b { - return - } - } - } - l := 4 + e.matchlen(s+4, offset+4, src) - if m.rep <= 0 { - // Extend candidate match backwards as far as possible. - // Do not extend repeats as we can assume they are optimal - // and offsets change if s == nextEmit. - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for offset > tMin && s > nextEmit && src[offset-1] == src[s-1] && l < maxMatchLength { - s-- - offset-- - l++ - } - } - if debugAsserts { - if offset >= s { - panic(fmt.Sprintf("offset: %d - s:%d - rep: %d - cur :%d - max: %d", offset, s, rep, e.cur, e.maxMatchOff)) - } - if !bytes.Equal(src[s:s+l], src[offset:offset+l]) { - panic(fmt.Sprintf("second match mismatch: %v != %v, first: %08x", src[s:s+4], src[offset:offset+4], first)) - } - } - cand := match{offset: offset, s: s, length: l, rep: rep} - cand.estBits(bitsPerByte) - if m.est >= highScore || cand.est-m.est+(cand.s-m.s)*bitsPerByte>>10 < 0 { - *m = cand - } - } - - best := match{s: s, est: highScore} - improve(&best, candidateL.offset-e.cur, s, uint32(cv), -1) - improve(&best, candidateL.prev-e.cur, s, uint32(cv), -1) - improve(&best, candidateS.offset-e.cur, s, uint32(cv), -1) - improve(&best, candidateS.prev-e.cur, s, uint32(cv), -1) - - if canRepeat && best.length < goodEnough { - if s == nextEmit { - // Check repeats straight after a match. - improve(&best, s-offset2, s, uint32(cv), 1|4) - improve(&best, s-offset3, s, uint32(cv), 2|4) - if offset1 > 1 { - improve(&best, s-(offset1-1), s, uint32(cv), 3|4) - } - } - - // If either no match or a non-repeat match, check at + 1 - if best.rep <= 0 { - cv32 := uint32(cv >> 8) - spp := s + 1 - improve(&best, spp-offset1, spp, cv32, 1) - improve(&best, spp-offset2, spp, cv32, 2) - improve(&best, spp-offset3, spp, cv32, 3) - if best.rep < 0 { - cv32 = uint32(cv >> 24) - spp += 2 - improve(&best, spp-offset1, spp, cv32, 1) - improve(&best, spp-offset2, spp, cv32, 2) - improve(&best, spp-offset3, spp, cv32, 3) - } - } - } - // Load next and check... - e.longTable[nextHashL] = prevEntry{offset: s + e.cur, prev: candidateL.offset} - e.table[nextHashS] = prevEntry{offset: s + e.cur, prev: candidateS.offset} - index0 := s + 1 - - // Look far ahead, unless we have a really long match already... - if best.length < goodEnough { - // No match found, move forward on input, no need to check forward... - if best.length < 4 { - s += 1 + (s-nextEmit)>>(kSearchStrength-1) - if s >= sLimit { - break encodeLoop - } - continue - } - - candidateS = e.table[hashLen(cv>>8, bestShortTableBits, bestShortLen)] - cv = load6432(src, s+1) - cv2 := load6432(src, s+2) - candidateL = e.longTable[hashLen(cv, bestLongTableBits, bestLongLen)] - candidateL2 := e.longTable[hashLen(cv2, bestLongTableBits, bestLongLen)] - - // Short at s+1 - improve(&best, candidateS.offset-e.cur, s+1, uint32(cv), -1) - // Long at s+1, s+2 - improve(&best, candidateL.offset-e.cur, s+1, uint32(cv), -1) - improve(&best, candidateL.prev-e.cur, s+1, uint32(cv), -1) - improve(&best, candidateL2.offset-e.cur, s+2, uint32(cv2), -1) - improve(&best, candidateL2.prev-e.cur, s+2, uint32(cv2), -1) - if false { - // Short at s+3. - // Too often worse... - improve(&best, e.table[hashLen(cv2>>8, bestShortTableBits, bestShortLen)].offset-e.cur, s+3, uint32(cv2>>8), -1) - } - - // Start check at a fixed offset to allow for a few mismatches. - // For this compression level 2 yields the best results. - // We cannot do this if we have already indexed this position. - const skipBeginning = 2 - if best.s > s-skipBeginning { - // See if we can find a better match by checking where the current best ends. - // Use that offset to see if we can find a better full match. - if sAt := best.s + best.length; sAt < sLimit { - nextHashL := hashLen(load6432(src, sAt), bestLongTableBits, bestLongLen) - candidateEnd := e.longTable[nextHashL] - - if off := candidateEnd.offset - e.cur - best.length + skipBeginning; off >= 0 { - improve(&best, off, best.s+skipBeginning, load3232(src, best.s+skipBeginning), -1) - if off := candidateEnd.prev - e.cur - best.length + skipBeginning; off >= 0 { - improve(&best, off, best.s+skipBeginning, load3232(src, best.s+skipBeginning), -1) - } - } - } - } - } - - if debugAsserts { - if best.offset >= best.s { - panic(fmt.Sprintf("best.offset > s: %d >= %d", best.offset, best.s)) - } - if best.s < nextEmit { - panic(fmt.Sprintf("s %d < nextEmit %d", best.s, nextEmit)) - } - if best.offset < s-e.maxMatchOff { - panic(fmt.Sprintf("best.offset < s-e.maxMatchOff: %d < %d", best.offset, s-e.maxMatchOff)) - } - if !bytes.Equal(src[best.s:best.s+best.length], src[best.offset:best.offset+best.length]) { - panic(fmt.Sprintf("match mismatch: %v != %v", src[best.s:best.s+best.length], src[best.offset:best.offset+best.length])) - } - } - - // We have a match, we can store the forward value - s = best.s - if best.rep > 0 { - var seq seq - seq.matchLen = uint32(best.length - zstdMinMatch) - addLiterals(&seq, best.s) - - // Repeat. If bit 4 is set, this is a non-lit repeat. - seq.offset = uint32(best.rep & 3) - if debugSequences { - println("repeat sequence", seq, "next s:", best.s, "off:", best.s-best.offset) - } - blk.sequences = append(blk.sequences, seq) - - // Index old s + 1 -> s - 1 - s = best.s + best.length - nextEmit = s - - // Index skipped... - end := s - if s > sLimit+4 { - end = sLimit + 4 - } - off := index0 + e.cur - for index0 < end { - cv0 := load6432(src, index0) - h0 := hashLen(cv0, bestLongTableBits, bestLongLen) - h1 := hashLen(cv0, bestShortTableBits, bestShortLen) - e.longTable[h0] = prevEntry{offset: off, prev: e.longTable[h0].offset} - e.table[h1] = prevEntry{offset: off, prev: e.table[h1].offset} - off++ - index0++ - } - - switch best.rep { - case 2, 4 | 1: - offset1, offset2 = offset2, offset1 - case 3, 4 | 2: - offset1, offset2, offset3 = offset3, offset1, offset2 - case 4 | 3: - offset1, offset2, offset3 = offset1-1, offset1, offset2 - } - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, best.length) - } - break encodeLoop - } - continue - } - - // A 4-byte match has been found. Update recent offsets. - // We'll later see if more than 4 bytes. - t := best.offset - offset1, offset2, offset3 = s-t, offset1, offset2 - - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - - if debugAsserts && int(offset1) > len(src) { - panic("invalid offset") - } - - // Write our sequence - var seq seq - l := best.length - seq.litLen = uint32(s - nextEmit) - seq.matchLen = uint32(l - zstdMinMatch) - if seq.litLen > 0 { - blk.literals = append(blk.literals, src[nextEmit:s]...) - } - seq.offset = uint32(s-t) + 3 - s += l - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - nextEmit = s - - // Index old s + 1 -> s - 1 or sLimit - end := s - if s > sLimit-4 { - end = sLimit - 4 - } - - off := index0 + e.cur - for index0 < end { - cv0 := load6432(src, index0) - h0 := hashLen(cv0, bestLongTableBits, bestLongLen) - h1 := hashLen(cv0, bestShortTableBits, bestShortLen) - e.longTable[h0] = prevEntry{offset: off, prev: e.longTable[h0].offset} - e.table[h1] = prevEntry{offset: off, prev: e.table[h1].offset} - index0++ - off++ - } - if s >= sLimit { - break encodeLoop - } - } - - if int(nextEmit) < len(src) { - blk.literals = append(blk.literals, src[nextEmit:]...) - blk.extraLits = len(src) - int(nextEmit) - } - blk.recentOffsets[0] = uint32(offset1) - blk.recentOffsets[1] = uint32(offset2) - blk.recentOffsets[2] = uint32(offset3) - if debugEncoder { - println("returning, recent offsets:", blk.recentOffsets, "extra literals:", blk.extraLits) - } -} - -// EncodeNoHist will encode a block with no history and no following blocks. -// Most notable difference is that src will not be copied for history and -// we do not need to check for max match length. -func (e *bestFastEncoder) EncodeNoHist(blk *blockEnc, src []byte) { - e.ensureHist(len(src)) - e.Encode(blk, src) -} - -// Reset will reset and set a dictionary if not nil -func (e *bestFastEncoder) Reset(d *dict, singleBlock bool) { - e.resetBase(d, singleBlock) - if d == nil { - return - } - // Init or copy dict table - if len(e.dictTable) != len(e.table) || d.id != e.lastDictID { - if len(e.dictTable) != len(e.table) { - e.dictTable = make([]prevEntry, len(e.table)) - } - end := int32(len(d.content)) - 8 + e.maxMatchOff - for i := e.maxMatchOff; i < end; i += 4 { - const hashLog = bestShortTableBits - - cv := load6432(d.content, i-e.maxMatchOff) - nextHash := hashLen(cv, hashLog, bestShortLen) // 0 -> 4 - nextHash1 := hashLen(cv>>8, hashLog, bestShortLen) // 1 -> 5 - nextHash2 := hashLen(cv>>16, hashLog, bestShortLen) // 2 -> 6 - nextHash3 := hashLen(cv>>24, hashLog, bestShortLen) // 3 -> 7 - e.dictTable[nextHash] = prevEntry{ - prev: e.dictTable[nextHash].offset, - offset: i, - } - e.dictTable[nextHash1] = prevEntry{ - prev: e.dictTable[nextHash1].offset, - offset: i + 1, - } - e.dictTable[nextHash2] = prevEntry{ - prev: e.dictTable[nextHash2].offset, - offset: i + 2, - } - e.dictTable[nextHash3] = prevEntry{ - prev: e.dictTable[nextHash3].offset, - offset: i + 3, - } - } - e.lastDictID = d.id - } - - // Init or copy dict table - if len(e.dictLongTable) != len(e.longTable) || d.id != e.lastDictID { - if len(e.dictLongTable) != len(e.longTable) { - e.dictLongTable = make([]prevEntry, len(e.longTable)) - } - if len(d.content) >= 8 { - cv := load6432(d.content, 0) - h := hashLen(cv, bestLongTableBits, bestLongLen) - e.dictLongTable[h] = prevEntry{ - offset: e.maxMatchOff, - prev: e.dictLongTable[h].offset, - } - - end := int32(len(d.content)) - 8 + e.maxMatchOff - off := 8 // First to read - for i := e.maxMatchOff + 1; i < end; i++ { - cv = cv>>8 | (uint64(d.content[off]) << 56) - h := hashLen(cv, bestLongTableBits, bestLongLen) - e.dictLongTable[h] = prevEntry{ - offset: i, - prev: e.dictLongTable[h].offset, - } - off++ - } - } - e.lastDictID = d.id - } - // Reset table to initial state - copy(e.longTable[:], e.dictLongTable) - - e.cur = e.maxMatchOff - // Reset table to initial state - copy(e.table[:], e.dictTable) -} diff --git a/vendor/github.com/klauspost/compress/zstd/enc_better.go b/vendor/github.com/klauspost/compress/zstd/enc_better.go deleted file mode 100644 index 84a79fde76..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/enc_better.go +++ /dev/null @@ -1,1252 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import "fmt" - -const ( - betterLongTableBits = 19 // Bits used in the long match table - betterLongTableSize = 1 << betterLongTableBits // Size of the table - betterLongLen = 8 // Bytes used for table hash - - // Note: Increasing the short table bits or making the hash shorter - // can actually lead to compression degradation since it will 'steal' more from the - // long match table and match offsets are quite big. - // This greatly depends on the type of input. - betterShortTableBits = 13 // Bits used in the short match table - betterShortTableSize = 1 << betterShortTableBits // Size of the table - betterShortLen = 5 // Bytes used for table hash - - betterLongTableShardCnt = 1 << (betterLongTableBits - dictShardBits) // Number of shards in the table - betterLongTableShardSize = betterLongTableSize / betterLongTableShardCnt // Size of an individual shard - - betterShortTableShardCnt = 1 << (betterShortTableBits - dictShardBits) // Number of shards in the table - betterShortTableShardSize = betterShortTableSize / betterShortTableShardCnt // Size of an individual shard -) - -type prevEntry struct { - offset int32 - prev int32 -} - -// betterFastEncoder uses 2 tables, one for short matches (5 bytes) and one for long matches. -// The long match table contains the previous entry with the same hash, -// effectively making it a "chain" of length 2. -// When we find a long match we choose between the two values and select the longest. -// When we find a short match, after checking the long, we check if we can find a long at n+1 -// and that it is longer (lazy matching). -type betterFastEncoder struct { - fastBase - table [betterShortTableSize]tableEntry - longTable [betterLongTableSize]prevEntry -} - -type betterFastEncoderDict struct { - betterFastEncoder - dictTable []tableEntry - dictLongTable []prevEntry - shortTableShardDirty [betterShortTableShardCnt]bool - longTableShardDirty [betterLongTableShardCnt]bool - allDirty bool -} - -// Encode improves compression... -func (e *betterFastEncoder) Encode(blk *blockEnc, src []byte) { - const ( - // Input margin is the number of bytes we read (8) - // and the maximum we will read ahead (2) - inputMargin = 8 + 2 - minNonLiteralBlockSize = 16 - ) - - // Protect against e.cur wraparound. - for e.cur >= e.bufferReset-int32(len(e.hist)) { - if len(e.hist) == 0 { - e.table = [betterShortTableSize]tableEntry{} - e.longTable = [betterLongTableSize]prevEntry{} - e.cur = e.maxMatchOff - break - } - // Shift down everything in the table that isn't already too far away. - minOff := e.cur + int32(len(e.hist)) - e.maxMatchOff - for i := range e.table[:] { - v := e.table[i].offset - if v < minOff { - v = 0 - } else { - v = v - e.cur + e.maxMatchOff - } - e.table[i].offset = v - } - for i := range e.longTable[:] { - v := e.longTable[i].offset - v2 := e.longTable[i].prev - if v < minOff { - v = 0 - v2 = 0 - } else { - v = v - e.cur + e.maxMatchOff - if v2 < minOff { - v2 = 0 - } else { - v2 = v2 - e.cur + e.maxMatchOff - } - } - e.longTable[i] = prevEntry{ - offset: v, - prev: v2, - } - } - e.cur = e.maxMatchOff - break - } - // Add block to history - s := e.addBlock(src) - blk.size = len(src) - - // Check RLE first - if len(src) > zstdMinMatch { - ml := matchLen(src[1:], src) - if ml == len(src)-1 { - blk.literals = append(blk.literals, src[0]) - blk.sequences = append(blk.sequences, seq{litLen: 1, matchLen: uint32(len(src)-1) - zstdMinMatch, offset: 1 + 3}) - return - } - } - - if len(src) < minNonLiteralBlockSize { - blk.extraLits = len(src) - blk.literals = blk.literals[:len(src)] - copy(blk.literals, src) - return - } - - // Override src - src = e.hist - sLimit := int32(len(src)) - inputMargin - // stepSize is the number of bytes to skip on every main loop iteration. - // It should be >= 1. - const stepSize = 1 - - const kSearchStrength = 9 - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := s - cv := load6432(src, s) - - // Relative offsets - offset1 := int32(blk.recentOffsets[0]) - offset2 := int32(blk.recentOffsets[1]) - - addLiterals := func(s *seq, until int32) { - if until == nextEmit { - return - } - blk.literals = append(blk.literals, src[nextEmit:until]...) - s.litLen = uint32(until - nextEmit) - } - if debugEncoder { - println("recent offsets:", blk.recentOffsets) - } - -encodeLoop: - for { - var t int32 - // We allow the encoder to optionally turn off repeat offsets across blocks - canRepeat := len(blk.sequences) > 2 - var matched, index0 int32 - - for { - if debugAsserts && canRepeat && offset1 == 0 { - panic("offset0 was 0") - } - - nextHashL := hashLen(cv, betterLongTableBits, betterLongLen) - nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) - candidateL := e.longTable[nextHashL] - candidateS := e.table[nextHashS] - - const repOff = 1 - repIndex := s - offset1 + repOff - off := s + e.cur - e.longTable[nextHashL] = prevEntry{offset: off, prev: candidateL.offset} - e.table[nextHashS] = tableEntry{offset: off, val: uint32(cv)} - index0 = s + 1 - - if canRepeat { - if repIndex >= 0 && load3232(src, repIndex) == uint32(cv>>(repOff*8)) { - // Consider history as well. - var seq seq - length := 4 + e.matchlen(s+4+repOff, repIndex+4, src) - - seq.matchLen = uint32(length - zstdMinMatch) - - // We might be able to match backwards. - // Extend as long as we can. - start := s + repOff - // We end the search early, so we don't risk 0 literals - // and have to do special offset treatment. - startLimit := nextEmit + 1 - - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for repIndex > tMin && start > startLimit && src[repIndex-1] == src[start-1] && seq.matchLen < maxMatchLength-zstdMinMatch-1 { - repIndex-- - start-- - seq.matchLen++ - } - addLiterals(&seq, start) - - // rep 0 - seq.offset = 1 - if debugSequences { - println("repeat sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - // Index match start+1 (long) -> s - 1 - index0 := s + repOff - s += length + repOff - - nextEmit = s - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, length) - - } - break encodeLoop - } - // Index skipped... - for index0 < s-1 { - cv0 := load6432(src, index0) - cv1 := cv0 >> 8 - h0 := hashLen(cv0, betterLongTableBits, betterLongLen) - off := index0 + e.cur - e.longTable[h0] = prevEntry{offset: off, prev: e.longTable[h0].offset} - e.table[hashLen(cv1, betterShortTableBits, betterShortLen)] = tableEntry{offset: off + 1, val: uint32(cv1)} - index0 += 2 - } - cv = load6432(src, s) - continue - } - const repOff2 = 1 - - // We deviate from the reference encoder and also check offset 2. - // Still slower and not much better, so disabled. - // repIndex = s - offset2 + repOff2 - if false && repIndex >= 0 && load6432(src, repIndex) == load6432(src, s+repOff) { - // Consider history as well. - var seq seq - length := 8 + e.matchlen(s+8+repOff2, repIndex+8, src) - - seq.matchLen = uint32(length - zstdMinMatch) - - // We might be able to match backwards. - // Extend as long as we can. - start := s + repOff2 - // We end the search early, so we don't risk 0 literals - // and have to do special offset treatment. - startLimit := nextEmit + 1 - - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for repIndex > tMin && start > startLimit && src[repIndex-1] == src[start-1] && seq.matchLen < maxMatchLength-zstdMinMatch-1 { - repIndex-- - start-- - seq.matchLen++ - } - addLiterals(&seq, start) - - // rep 2 - seq.offset = 2 - if debugSequences { - println("repeat sequence 2", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - s += length + repOff2 - nextEmit = s - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, length) - - } - break encodeLoop - } - - // Index skipped... - for index0 < s-1 { - cv0 := load6432(src, index0) - cv1 := cv0 >> 8 - h0 := hashLen(cv0, betterLongTableBits, betterLongLen) - off := index0 + e.cur - e.longTable[h0] = prevEntry{offset: off, prev: e.longTable[h0].offset} - e.table[hashLen(cv1, betterShortTableBits, betterShortLen)] = tableEntry{offset: off + 1, val: uint32(cv1)} - index0 += 2 - } - cv = load6432(src, s) - // Swap offsets - offset1, offset2 = offset2, offset1 - continue - } - } - // Find the offsets of our two matches. - coffsetL := candidateL.offset - e.cur - coffsetLP := candidateL.prev - e.cur - - // Check if we have a long match. - if s-coffsetL < e.maxMatchOff && cv == load6432(src, coffsetL) { - // Found a long match, at least 8 bytes. - matched = e.matchlen(s+8, coffsetL+8, src) + 8 - t = coffsetL - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugMatches { - println("long match") - } - - if s-coffsetLP < e.maxMatchOff && cv == load6432(src, coffsetLP) { - // Found a long match, at least 8 bytes. - prevMatch := e.matchlen(s+8, coffsetLP+8, src) + 8 - if prevMatch > matched { - matched = prevMatch - t = coffsetLP - } - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugMatches { - println("long match") - } - } - break - } - - // Check if we have a long match on prev. - if s-coffsetLP < e.maxMatchOff && cv == load6432(src, coffsetLP) { - // Found a long match, at least 8 bytes. - matched = e.matchlen(s+8, coffsetLP+8, src) + 8 - t = coffsetLP - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugMatches { - println("long match") - } - break - } - - coffsetS := candidateS.offset - e.cur - - // Check if we have a short match. - if s-coffsetS < e.maxMatchOff && uint32(cv) == candidateS.val { - // found a regular match - matched = e.matchlen(s+4, coffsetS+4, src) + 4 - - // See if we can find a long match at s+1 - const checkAt = 1 - cv := load6432(src, s+checkAt) - nextHashL = hashLen(cv, betterLongTableBits, betterLongLen) - candidateL = e.longTable[nextHashL] - coffsetL = candidateL.offset - e.cur - - // We can store it, since we have at least a 4 byte match. - e.longTable[nextHashL] = prevEntry{offset: s + checkAt + e.cur, prev: candidateL.offset} - if s-coffsetL < e.maxMatchOff && cv == load6432(src, coffsetL) { - // Found a long match, at least 8 bytes. - matchedNext := e.matchlen(s+8+checkAt, coffsetL+8, src) + 8 - if matchedNext > matched { - t = coffsetL - s += checkAt - matched = matchedNext - if debugMatches { - println("long match (after short)") - } - break - } - } - - // Check prev long... - coffsetL = candidateL.prev - e.cur - if s-coffsetL < e.maxMatchOff && cv == load6432(src, coffsetL) { - // Found a long match, at least 8 bytes. - matchedNext := e.matchlen(s+8+checkAt, coffsetL+8, src) + 8 - if matchedNext > matched { - t = coffsetL - s += checkAt - matched = matchedNext - if debugMatches { - println("prev long match (after short)") - } - break - } - } - t = coffsetS - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugAsserts && t < 0 { - panic("t<0") - } - if debugMatches { - println("short match") - } - break - } - - // No match found, move forward in input. - s += stepSize + ((s - nextEmit) >> (kSearchStrength - 1)) - if s >= sLimit { - break encodeLoop - } - cv = load6432(src, s) - } - - // Try to find a better match by searching for a long match at the end of the current best match - if s+matched < sLimit { - // Allow some bytes at the beginning to mismatch. - // Sweet spot is around 3 bytes, but depends on input. - // The skipped bytes are tested in Extend backwards, - // and still picked up as part of the match if they do. - const skipBeginning = 3 - - nextHashL := hashLen(load6432(src, s+matched), betterLongTableBits, betterLongLen) - s2 := s + skipBeginning - cv := load3232(src, s2) - candidateL := e.longTable[nextHashL] - coffsetL := candidateL.offset - e.cur - matched + skipBeginning - if coffsetL >= 0 && coffsetL < s2 && s2-coffsetL < e.maxMatchOff && cv == load3232(src, coffsetL) { - // Found a long match, at least 4 bytes. - matchedNext := e.matchlen(s2+4, coffsetL+4, src) + 4 - if matchedNext > matched { - t = coffsetL - s = s2 - matched = matchedNext - if debugMatches { - println("long match at end-of-match") - } - } - } - - // Check prev long... - if true { - coffsetL = candidateL.prev - e.cur - matched + skipBeginning - if coffsetL >= 0 && coffsetL < s2 && s2-coffsetL < e.maxMatchOff && cv == load3232(src, coffsetL) { - // Found a long match, at least 4 bytes. - matchedNext := e.matchlen(s2+4, coffsetL+4, src) + 4 - if matchedNext > matched { - t = coffsetL - s = s2 - matched = matchedNext - if debugMatches { - println("prev long match at end-of-match") - } - } - } - } - } - // A match has been found. Update recent offsets. - offset2 = offset1 - offset1 = s - t - - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - - if debugAsserts && canRepeat && int(offset1) > len(src) { - panic("invalid offset") - } - - // Extend the n-byte match as long as possible. - l := matched - - // Extend backwards - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for t > tMin && s > nextEmit && src[t-1] == src[s-1] && l < maxMatchLength { - s-- - t-- - l++ - } - - // Write our sequence - var seq seq - seq.litLen = uint32(s - nextEmit) - seq.matchLen = uint32(l - zstdMinMatch) - if seq.litLen > 0 { - blk.literals = append(blk.literals, src[nextEmit:s]...) - } - seq.offset = uint32(s-t) + 3 - s += l - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - nextEmit = s - if s >= sLimit { - break encodeLoop - } - - // Index match start+1 (long) -> s - 1 - off := index0 + e.cur - for index0 < s-1 { - cv0 := load6432(src, index0) - cv1 := cv0 >> 8 - h0 := hashLen(cv0, betterLongTableBits, betterLongLen) - e.longTable[h0] = prevEntry{offset: off, prev: e.longTable[h0].offset} - e.table[hashLen(cv1, betterShortTableBits, betterShortLen)] = tableEntry{offset: off + 1, val: uint32(cv1)} - index0 += 2 - off += 2 - } - - cv = load6432(src, s) - if !canRepeat { - continue - } - - // Check offset 2 - for { - o2 := s - offset2 - if load3232(src, o2) != uint32(cv) { - // Do regular search - break - } - - // Store this, since we have it. - nextHashL := hashLen(cv, betterLongTableBits, betterLongLen) - nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) - - // We have at least 4 byte match. - // No need to check backwards. We come straight from a match - l := 4 + e.matchlen(s+4, o2+4, src) - - e.longTable[nextHashL] = prevEntry{offset: s + e.cur, prev: e.longTable[nextHashL].offset} - e.table[nextHashS] = tableEntry{offset: s + e.cur, val: uint32(cv)} - seq.matchLen = uint32(l) - zstdMinMatch - seq.litLen = 0 - - // Since litlen is always 0, this is offset 1. - seq.offset = 1 - s += l - nextEmit = s - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - // Swap offset 1 and 2. - offset1, offset2 = offset2, offset1 - if s >= sLimit { - // Finished - break encodeLoop - } - cv = load6432(src, s) - } - } - - if int(nextEmit) < len(src) { - blk.literals = append(blk.literals, src[nextEmit:]...) - blk.extraLits = len(src) - int(nextEmit) - } - blk.recentOffsets[0] = uint32(offset1) - blk.recentOffsets[1] = uint32(offset2) - if debugEncoder { - println("returning, recent offsets:", blk.recentOffsets, "extra literals:", blk.extraLits) - } -} - -// EncodeNoHist will encode a block with no history and no following blocks. -// Most notable difference is that src will not be copied for history and -// we do not need to check for max match length. -func (e *betterFastEncoder) EncodeNoHist(blk *blockEnc, src []byte) { - e.ensureHist(len(src)) - e.Encode(blk, src) -} - -// Encode improves compression... -func (e *betterFastEncoderDict) Encode(blk *blockEnc, src []byte) { - const ( - // Input margin is the number of bytes we read (8) - // and the maximum we will read ahead (2) - inputMargin = 8 + 2 - minNonLiteralBlockSize = 16 - ) - - // Protect against e.cur wraparound. - for e.cur >= e.bufferReset-int32(len(e.hist)) { - if len(e.hist) == 0 { - for i := range e.table[:] { - e.table[i] = tableEntry{} - } - for i := range e.longTable[:] { - e.longTable[i] = prevEntry{} - } - e.cur = e.maxMatchOff - e.allDirty = true - break - } - // Shift down everything in the table that isn't already too far away. - minOff := e.cur + int32(len(e.hist)) - e.maxMatchOff - for i := range e.table[:] { - v := e.table[i].offset - if v < minOff { - v = 0 - } else { - v = v - e.cur + e.maxMatchOff - } - e.table[i].offset = v - } - for i := range e.longTable[:] { - v := e.longTable[i].offset - v2 := e.longTable[i].prev - if v < minOff { - v = 0 - v2 = 0 - } else { - v = v - e.cur + e.maxMatchOff - if v2 < minOff { - v2 = 0 - } else { - v2 = v2 - e.cur + e.maxMatchOff - } - } - e.longTable[i] = prevEntry{ - offset: v, - prev: v2, - } - } - e.allDirty = true - e.cur = e.maxMatchOff - break - } - - s := e.addBlock(src) - blk.size = len(src) - if len(src) < minNonLiteralBlockSize { - blk.extraLits = len(src) - blk.literals = blk.literals[:len(src)] - copy(blk.literals, src) - return - } - - // Override src - src = e.hist - sLimit := int32(len(src)) - inputMargin - // stepSize is the number of bytes to skip on every main loop iteration. - // It should be >= 1. - const stepSize = 1 - - const kSearchStrength = 9 - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := s - cv := load6432(src, s) - - // Relative offsets - offset1 := int32(blk.recentOffsets[0]) - offset2 := int32(blk.recentOffsets[1]) - - addLiterals := func(s *seq, until int32) { - if until == nextEmit { - return - } - blk.literals = append(blk.literals, src[nextEmit:until]...) - s.litLen = uint32(until - nextEmit) - } - if debugEncoder { - println("recent offsets:", blk.recentOffsets) - } - -encodeLoop: - for { - var t int32 - // We allow the encoder to optionally turn off repeat offsets across blocks - canRepeat := len(blk.sequences) > 2 - var matched, index0 int32 - - for { - if debugAsserts && canRepeat && offset1 == 0 { - panic("offset0 was 0") - } - - nextHashL := hashLen(cv, betterLongTableBits, betterLongLen) - nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) - candidateL := e.longTable[nextHashL] - candidateS := e.table[nextHashS] - - const repOff = 1 - repIndex := s - offset1 + repOff - off := s + e.cur - e.longTable[nextHashL] = prevEntry{offset: off, prev: candidateL.offset} - e.markLongShardDirty(nextHashL) - e.table[nextHashS] = tableEntry{offset: off, val: uint32(cv)} - e.markShortShardDirty(nextHashS) - index0 = s + 1 - - if canRepeat { - if repIndex >= 0 && load3232(src, repIndex) == uint32(cv>>(repOff*8)) { - // Consider history as well. - var seq seq - length := 4 + e.matchlen(s+4+repOff, repIndex+4, src) - - seq.matchLen = uint32(length - zstdMinMatch) - - // We might be able to match backwards. - // Extend as long as we can. - start := s + repOff - // We end the search early, so we don't risk 0 literals - // and have to do special offset treatment. - startLimit := nextEmit + 1 - - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for repIndex > tMin && start > startLimit && src[repIndex-1] == src[start-1] && seq.matchLen < maxMatchLength-zstdMinMatch-1 { - repIndex-- - start-- - seq.matchLen++ - } - addLiterals(&seq, start) - - // rep 0 - seq.offset = 1 - if debugSequences { - println("repeat sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - // Index match start+1 (long) -> s - 1 - s += length + repOff - - nextEmit = s - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, length) - - } - break encodeLoop - } - // Index skipped... - for index0 < s-1 { - cv0 := load6432(src, index0) - cv1 := cv0 >> 8 - h0 := hashLen(cv0, betterLongTableBits, betterLongLen) - off := index0 + e.cur - e.longTable[h0] = prevEntry{offset: off, prev: e.longTable[h0].offset} - e.markLongShardDirty(h0) - h1 := hashLen(cv1, betterShortTableBits, betterShortLen) - e.table[h1] = tableEntry{offset: off + 1, val: uint32(cv1)} - e.markShortShardDirty(h1) - index0 += 2 - } - cv = load6432(src, s) - continue - } - const repOff2 = 1 - - // We deviate from the reference encoder and also check offset 2. - // Still slower and not much better, so disabled. - // repIndex = s - offset2 + repOff2 - if false && repIndex >= 0 && load6432(src, repIndex) == load6432(src, s+repOff) { - // Consider history as well. - var seq seq - length := 8 + e.matchlen(s+8+repOff2, repIndex+8, src) - - seq.matchLen = uint32(length - zstdMinMatch) - - // We might be able to match backwards. - // Extend as long as we can. - start := s + repOff2 - // We end the search early, so we don't risk 0 literals - // and have to do special offset treatment. - startLimit := nextEmit + 1 - - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for repIndex > tMin && start > startLimit && src[repIndex-1] == src[start-1] && seq.matchLen < maxMatchLength-zstdMinMatch-1 { - repIndex-- - start-- - seq.matchLen++ - } - addLiterals(&seq, start) - - // rep 2 - seq.offset = 2 - if debugSequences { - println("repeat sequence 2", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - s += length + repOff2 - nextEmit = s - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, length) - - } - break encodeLoop - } - - // Index skipped... - for index0 < s-1 { - cv0 := load6432(src, index0) - cv1 := cv0 >> 8 - h0 := hashLen(cv0, betterLongTableBits, betterLongLen) - off := index0 + e.cur - e.longTable[h0] = prevEntry{offset: off, prev: e.longTable[h0].offset} - e.markLongShardDirty(h0) - h1 := hashLen(cv1, betterShortTableBits, betterShortLen) - e.table[h1] = tableEntry{offset: off + 1, val: uint32(cv1)} - e.markShortShardDirty(h1) - index0 += 2 - } - cv = load6432(src, s) - // Swap offsets - offset1, offset2 = offset2, offset1 - continue - } - } - // Find the offsets of our two matches. - coffsetL := candidateL.offset - e.cur - coffsetLP := candidateL.prev - e.cur - - // Check if we have a long match. - if s-coffsetL < e.maxMatchOff && cv == load6432(src, coffsetL) { - // Found a long match, at least 8 bytes. - matched = e.matchlen(s+8, coffsetL+8, src) + 8 - t = coffsetL - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugMatches { - println("long match") - } - - if s-coffsetLP < e.maxMatchOff && cv == load6432(src, coffsetLP) { - // Found a long match, at least 8 bytes. - prevMatch := e.matchlen(s+8, coffsetLP+8, src) + 8 - if prevMatch > matched { - matched = prevMatch - t = coffsetLP - } - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugMatches { - println("long match") - } - } - break - } - - // Check if we have a long match on prev. - if s-coffsetLP < e.maxMatchOff && cv == load6432(src, coffsetLP) { - // Found a long match, at least 8 bytes. - matched = e.matchlen(s+8, coffsetLP+8, src) + 8 - t = coffsetLP - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugMatches { - println("long match") - } - break - } - - coffsetS := candidateS.offset - e.cur - - // Check if we have a short match. - if s-coffsetS < e.maxMatchOff && uint32(cv) == candidateS.val { - // found a regular match - matched = e.matchlen(s+4, coffsetS+4, src) + 4 - - // See if we can find a long match at s+1 - const checkAt = 1 - cv := load6432(src, s+checkAt) - nextHashL = hashLen(cv, betterLongTableBits, betterLongLen) - candidateL = e.longTable[nextHashL] - coffsetL = candidateL.offset - e.cur - - // We can store it, since we have at least a 4 byte match. - e.longTable[nextHashL] = prevEntry{offset: s + checkAt + e.cur, prev: candidateL.offset} - e.markLongShardDirty(nextHashL) - if s-coffsetL < e.maxMatchOff && cv == load6432(src, coffsetL) { - // Found a long match, at least 8 bytes. - matchedNext := e.matchlen(s+8+checkAt, coffsetL+8, src) + 8 - if matchedNext > matched { - t = coffsetL - s += checkAt - matched = matchedNext - if debugMatches { - println("long match (after short)") - } - break - } - } - - // Check prev long... - coffsetL = candidateL.prev - e.cur - if s-coffsetL < e.maxMatchOff && cv == load6432(src, coffsetL) { - // Found a long match, at least 8 bytes. - matchedNext := e.matchlen(s+8+checkAt, coffsetL+8, src) + 8 - if matchedNext > matched { - t = coffsetL - s += checkAt - matched = matchedNext - if debugMatches { - println("prev long match (after short)") - } - break - } - } - t = coffsetS - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugAsserts && t < 0 { - panic("t<0") - } - if debugMatches { - println("short match") - } - break - } - - // No match found, move forward in input. - s += stepSize + ((s - nextEmit) >> (kSearchStrength - 1)) - if s >= sLimit { - break encodeLoop - } - cv = load6432(src, s) - } - // Try to find a better match by searching for a long match at the end of the current best match - if s+matched < sLimit { - nextHashL := hashLen(load6432(src, s+matched), betterLongTableBits, betterLongLen) - cv := load3232(src, s) - candidateL := e.longTable[nextHashL] - coffsetL := candidateL.offset - e.cur - matched - if coffsetL >= 0 && coffsetL < s && s-coffsetL < e.maxMatchOff && cv == load3232(src, coffsetL) { - // Found a long match, at least 4 bytes. - matchedNext := e.matchlen(s+4, coffsetL+4, src) + 4 - if matchedNext > matched { - t = coffsetL - matched = matchedNext - if debugMatches { - println("long match at end-of-match") - } - } - } - - // Check prev long... - if true { - coffsetL = candidateL.prev - e.cur - matched - if coffsetL >= 0 && coffsetL < s && s-coffsetL < e.maxMatchOff && cv == load3232(src, coffsetL) { - // Found a long match, at least 4 bytes. - matchedNext := e.matchlen(s+4, coffsetL+4, src) + 4 - if matchedNext > matched { - t = coffsetL - matched = matchedNext - if debugMatches { - println("prev long match at end-of-match") - } - } - } - } - } - // A match has been found. Update recent offsets. - offset2 = offset1 - offset1 = s - t - - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - - if debugAsserts && canRepeat && int(offset1) > len(src) { - panic("invalid offset") - } - - // Extend the n-byte match as long as possible. - l := matched - - // Extend backwards - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for t > tMin && s > nextEmit && src[t-1] == src[s-1] && l < maxMatchLength { - s-- - t-- - l++ - } - - // Write our sequence - var seq seq - seq.litLen = uint32(s - nextEmit) - seq.matchLen = uint32(l - zstdMinMatch) - if seq.litLen > 0 { - blk.literals = append(blk.literals, src[nextEmit:s]...) - } - seq.offset = uint32(s-t) + 3 - s += l - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - nextEmit = s - if s >= sLimit { - break encodeLoop - } - - // Index match start+1 (long) -> s - 1 - off := index0 + e.cur - for index0 < s-1 { - cv0 := load6432(src, index0) - cv1 := cv0 >> 8 - h0 := hashLen(cv0, betterLongTableBits, betterLongLen) - e.longTable[h0] = prevEntry{offset: off, prev: e.longTable[h0].offset} - e.markLongShardDirty(h0) - h1 := hashLen(cv1, betterShortTableBits, betterShortLen) - e.table[h1] = tableEntry{offset: off + 1, val: uint32(cv1)} - e.markShortShardDirty(h1) - index0 += 2 - off += 2 - } - - cv = load6432(src, s) - if !canRepeat { - continue - } - - // Check offset 2 - for { - o2 := s - offset2 - if load3232(src, o2) != uint32(cv) { - // Do regular search - break - } - - // Store this, since we have it. - nextHashL := hashLen(cv, betterLongTableBits, betterLongLen) - nextHashS := hashLen(cv, betterShortTableBits, betterShortLen) - - // We have at least 4 byte match. - // No need to check backwards. We come straight from a match - l := 4 + e.matchlen(s+4, o2+4, src) - - e.longTable[nextHashL] = prevEntry{offset: s + e.cur, prev: e.longTable[nextHashL].offset} - e.markLongShardDirty(nextHashL) - e.table[nextHashS] = tableEntry{offset: s + e.cur, val: uint32(cv)} - e.markShortShardDirty(nextHashS) - seq.matchLen = uint32(l) - zstdMinMatch - seq.litLen = 0 - - // Since litlen is always 0, this is offset 1. - seq.offset = 1 - s += l - nextEmit = s - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - // Swap offset 1 and 2. - offset1, offset2 = offset2, offset1 - if s >= sLimit { - // Finished - break encodeLoop - } - cv = load6432(src, s) - } - } - - if int(nextEmit) < len(src) { - blk.literals = append(blk.literals, src[nextEmit:]...) - blk.extraLits = len(src) - int(nextEmit) - } - blk.recentOffsets[0] = uint32(offset1) - blk.recentOffsets[1] = uint32(offset2) - if debugEncoder { - println("returning, recent offsets:", blk.recentOffsets, "extra literals:", blk.extraLits) - } -} - -// ResetDict will reset and set a dictionary if not nil -func (e *betterFastEncoder) Reset(d *dict, singleBlock bool) { - e.resetBase(d, singleBlock) - if d != nil { - panic("betterFastEncoder: Reset with dict") - } -} - -// ResetDict will reset and set a dictionary if not nil -func (e *betterFastEncoderDict) Reset(d *dict, singleBlock bool) { - e.resetBase(d, singleBlock) - if d == nil { - return - } - // Init or copy dict table - if len(e.dictTable) != len(e.table) || d.id != e.lastDictID { - if len(e.dictTable) != len(e.table) { - e.dictTable = make([]tableEntry, len(e.table)) - } - end := int32(len(d.content)) - 8 + e.maxMatchOff - for i := e.maxMatchOff; i < end; i += 4 { - const hashLog = betterShortTableBits - - cv := load6432(d.content, i-e.maxMatchOff) - nextHash := hashLen(cv, hashLog, betterShortLen) // 0 -> 4 - nextHash1 := hashLen(cv>>8, hashLog, betterShortLen) // 1 -> 5 - nextHash2 := hashLen(cv>>16, hashLog, betterShortLen) // 2 -> 6 - nextHash3 := hashLen(cv>>24, hashLog, betterShortLen) // 3 -> 7 - e.dictTable[nextHash] = tableEntry{ - val: uint32(cv), - offset: i, - } - e.dictTable[nextHash1] = tableEntry{ - val: uint32(cv >> 8), - offset: i + 1, - } - e.dictTable[nextHash2] = tableEntry{ - val: uint32(cv >> 16), - offset: i + 2, - } - e.dictTable[nextHash3] = tableEntry{ - val: uint32(cv >> 24), - offset: i + 3, - } - } - e.lastDictID = d.id - e.allDirty = true - } - - // Init or copy dict table - if len(e.dictLongTable) != len(e.longTable) || d.id != e.lastDictID { - if len(e.dictLongTable) != len(e.longTable) { - e.dictLongTable = make([]prevEntry, len(e.longTable)) - } - if len(d.content) >= 8 { - cv := load6432(d.content, 0) - h := hashLen(cv, betterLongTableBits, betterLongLen) - e.dictLongTable[h] = prevEntry{ - offset: e.maxMatchOff, - prev: e.dictLongTable[h].offset, - } - - end := int32(len(d.content)) - 8 + e.maxMatchOff - off := 8 // First to read - for i := e.maxMatchOff + 1; i < end; i++ { - cv = cv>>8 | (uint64(d.content[off]) << 56) - h := hashLen(cv, betterLongTableBits, betterLongLen) - e.dictLongTable[h] = prevEntry{ - offset: i, - prev: e.dictLongTable[h].offset, - } - off++ - } - } - e.lastDictID = d.id - e.allDirty = true - } - - // Reset table to initial state - { - dirtyShardCnt := 0 - if !e.allDirty { - for i := range e.shortTableShardDirty { - if e.shortTableShardDirty[i] { - dirtyShardCnt++ - } - } - } - const shardCnt = betterShortTableShardCnt - const shardSize = betterShortTableShardSize - if e.allDirty || dirtyShardCnt > shardCnt*4/6 { - copy(e.table[:], e.dictTable) - for i := range e.shortTableShardDirty { - e.shortTableShardDirty[i] = false - } - } else { - for i := range e.shortTableShardDirty { - if !e.shortTableShardDirty[i] { - continue - } - - copy(e.table[i*shardSize:(i+1)*shardSize], e.dictTable[i*shardSize:(i+1)*shardSize]) - e.shortTableShardDirty[i] = false - } - } - } - { - dirtyShardCnt := 0 - if !e.allDirty { - for i := range e.shortTableShardDirty { - if e.shortTableShardDirty[i] { - dirtyShardCnt++ - } - } - } - const shardCnt = betterLongTableShardCnt - const shardSize = betterLongTableShardSize - if e.allDirty || dirtyShardCnt > shardCnt*4/6 { - copy(e.longTable[:], e.dictLongTable) - for i := range e.longTableShardDirty { - e.longTableShardDirty[i] = false - } - } else { - for i := range e.longTableShardDirty { - if !e.longTableShardDirty[i] { - continue - } - - copy(e.longTable[i*shardSize:(i+1)*shardSize], e.dictLongTable[i*shardSize:(i+1)*shardSize]) - e.longTableShardDirty[i] = false - } - } - } - e.cur = e.maxMatchOff - e.allDirty = false -} - -func (e *betterFastEncoderDict) markLongShardDirty(entryNum uint32) { - e.longTableShardDirty[entryNum/betterLongTableShardSize] = true -} - -func (e *betterFastEncoderDict) markShortShardDirty(entryNum uint32) { - e.shortTableShardDirty[entryNum/betterShortTableShardSize] = true -} diff --git a/vendor/github.com/klauspost/compress/zstd/enc_dfast.go b/vendor/github.com/klauspost/compress/zstd/enc_dfast.go deleted file mode 100644 index d36be7bd8c..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/enc_dfast.go +++ /dev/null @@ -1,1123 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import "fmt" - -const ( - dFastLongTableBits = 17 // Bits used in the long match table - dFastLongTableSize = 1 << dFastLongTableBits // Size of the table - dFastLongTableMask = dFastLongTableSize - 1 // Mask for table indices. Redundant, but can eliminate bounds checks. - dFastLongLen = 8 // Bytes used for table hash - - dLongTableShardCnt = 1 << (dFastLongTableBits - dictShardBits) // Number of shards in the table - dLongTableShardSize = dFastLongTableSize / tableShardCnt // Size of an individual shard - - dFastShortTableBits = tableBits // Bits used in the short match table - dFastShortTableSize = 1 << dFastShortTableBits // Size of the table - dFastShortTableMask = dFastShortTableSize - 1 // Mask for table indices. Redundant, but can eliminate bounds checks. - dFastShortLen = 5 // Bytes used for table hash - -) - -type doubleFastEncoder struct { - fastEncoder - longTable [dFastLongTableSize]tableEntry -} - -type doubleFastEncoderDict struct { - fastEncoderDict - longTable [dFastLongTableSize]tableEntry - dictLongTable []tableEntry - longTableShardDirty [dLongTableShardCnt]bool -} - -// Encode mimmics functionality in zstd_dfast.c -func (e *doubleFastEncoder) Encode(blk *blockEnc, src []byte) { - const ( - // Input margin is the number of bytes we read (8) - // and the maximum we will read ahead (2) - inputMargin = 8 + 2 - minNonLiteralBlockSize = 16 - ) - - // Protect against e.cur wraparound. - for e.cur >= e.bufferReset-int32(len(e.hist)) { - if len(e.hist) == 0 { - e.table = [dFastShortTableSize]tableEntry{} - e.longTable = [dFastLongTableSize]tableEntry{} - e.cur = e.maxMatchOff - break - } - // Shift down everything in the table that isn't already too far away. - minOff := e.cur + int32(len(e.hist)) - e.maxMatchOff - for i := range e.table[:] { - v := e.table[i].offset - if v < minOff { - v = 0 - } else { - v = v - e.cur + e.maxMatchOff - } - e.table[i].offset = v - } - for i := range e.longTable[:] { - v := e.longTable[i].offset - if v < minOff { - v = 0 - } else { - v = v - e.cur + e.maxMatchOff - } - e.longTable[i].offset = v - } - e.cur = e.maxMatchOff - break - } - - s := e.addBlock(src) - blk.size = len(src) - if len(src) < minNonLiteralBlockSize { - blk.extraLits = len(src) - blk.literals = blk.literals[:len(src)] - copy(blk.literals, src) - return - } - - // Override src - src = e.hist - sLimit := int32(len(src)) - inputMargin - // stepSize is the number of bytes to skip on every main loop iteration. - // It should be >= 1. - const stepSize = 1 - - const kSearchStrength = 8 - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := s - cv := load6432(src, s) - - // Relative offsets - offset1 := int32(blk.recentOffsets[0]) - offset2 := int32(blk.recentOffsets[1]) - - addLiterals := func(s *seq, until int32) { - if until == nextEmit { - return - } - blk.literals = append(blk.literals, src[nextEmit:until]...) - s.litLen = uint32(until - nextEmit) - } - if debugEncoder { - println("recent offsets:", blk.recentOffsets) - } - -encodeLoop: - for { - var t int32 - // We allow the encoder to optionally turn off repeat offsets across blocks - canRepeat := len(blk.sequences) > 2 - - for { - if debugAsserts && canRepeat && offset1 == 0 { - panic("offset0 was 0") - } - - nextHashL := hashLen(cv, dFastLongTableBits, dFastLongLen) - nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) - candidateL := e.longTable[nextHashL] - candidateS := e.table[nextHashS] - - const repOff = 1 - repIndex := s - offset1 + repOff - entry := tableEntry{offset: s + e.cur, val: uint32(cv)} - e.longTable[nextHashL] = entry - e.table[nextHashS] = entry - - if canRepeat { - if repIndex >= 0 && load3232(src, repIndex) == uint32(cv>>(repOff*8)) { - // Consider history as well. - var seq seq - length := 4 + e.matchlen(s+4+repOff, repIndex+4, src) - - seq.matchLen = uint32(length - zstdMinMatch) - - // We might be able to match backwards. - // Extend as long as we can. - start := s + repOff - // We end the search early, so we don't risk 0 literals - // and have to do special offset treatment. - startLimit := nextEmit + 1 - - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for repIndex > tMin && start > startLimit && src[repIndex-1] == src[start-1] && seq.matchLen < maxMatchLength-zstdMinMatch-1 { - repIndex-- - start-- - seq.matchLen++ - } - addLiterals(&seq, start) - - // rep 0 - seq.offset = 1 - if debugSequences { - println("repeat sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - s += length + repOff - nextEmit = s - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, length) - - } - break encodeLoop - } - cv = load6432(src, s) - continue - } - } - // Find the offsets of our two matches. - coffsetL := s - (candidateL.offset - e.cur) - coffsetS := s - (candidateS.offset - e.cur) - - // Check if we have a long match. - if coffsetL < e.maxMatchOff && uint32(cv) == candidateL.val { - // Found a long match, likely at least 8 bytes. - // Reference encoder checks all 8 bytes, we only check 4, - // but the likelihood of both the first 4 bytes and the hash matching should be enough. - t = candidateL.offset - e.cur - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugMatches { - println("long match") - } - break - } - - // Check if we have a short match. - if coffsetS < e.maxMatchOff && uint32(cv) == candidateS.val { - // found a regular match - // See if we can find a long match at s+1 - const checkAt = 1 - cv := load6432(src, s+checkAt) - nextHashL = hashLen(cv, dFastLongTableBits, dFastLongLen) - candidateL = e.longTable[nextHashL] - coffsetL = s - (candidateL.offset - e.cur) + checkAt - - // We can store it, since we have at least a 4 byte match. - e.longTable[nextHashL] = tableEntry{offset: s + checkAt + e.cur, val: uint32(cv)} - if coffsetL < e.maxMatchOff && uint32(cv) == candidateL.val { - // Found a long match, likely at least 8 bytes. - // Reference encoder checks all 8 bytes, we only check 4, - // but the likelihood of both the first 4 bytes and the hash matching should be enough. - t = candidateL.offset - e.cur - s += checkAt - if debugMatches { - println("long match (after short)") - } - break - } - - t = candidateS.offset - e.cur - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugAsserts && t < 0 { - panic("t<0") - } - if debugMatches { - println("short match") - } - break - } - - // No match found, move forward in input. - s += stepSize + ((s - nextEmit) >> (kSearchStrength - 1)) - if s >= sLimit { - break encodeLoop - } - cv = load6432(src, s) - } - - // A 4-byte match has been found. Update recent offsets. - // We'll later see if more than 4 bytes. - offset2 = offset1 - offset1 = s - t - - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - - if debugAsserts && canRepeat && int(offset1) > len(src) { - panic("invalid offset") - } - - // Extend the 4-byte match as long as possible. - l := e.matchlen(s+4, t+4, src) + 4 - - // Extend backwards - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for t > tMin && s > nextEmit && src[t-1] == src[s-1] && l < maxMatchLength { - s-- - t-- - l++ - } - - // Write our sequence - var seq seq - seq.litLen = uint32(s - nextEmit) - seq.matchLen = uint32(l - zstdMinMatch) - if seq.litLen > 0 { - blk.literals = append(blk.literals, src[nextEmit:s]...) - } - seq.offset = uint32(s-t) + 3 - s += l - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - nextEmit = s - if s >= sLimit { - break encodeLoop - } - - // Index match start+1 (long) and start+2 (short) - index0 := s - l + 1 - // Index match end-2 (long) and end-1 (short) - index1 := s - 2 - - cv0 := load6432(src, index0) - cv1 := load6432(src, index1) - te0 := tableEntry{offset: index0 + e.cur, val: uint32(cv0)} - te1 := tableEntry{offset: index1 + e.cur, val: uint32(cv1)} - e.longTable[hashLen(cv0, dFastLongTableBits, dFastLongLen)] = te0 - e.longTable[hashLen(cv1, dFastLongTableBits, dFastLongLen)] = te1 - cv0 >>= 8 - cv1 >>= 8 - te0.offset++ - te1.offset++ - te0.val = uint32(cv0) - te1.val = uint32(cv1) - e.table[hashLen(cv0, dFastShortTableBits, dFastShortLen)] = te0 - e.table[hashLen(cv1, dFastShortTableBits, dFastShortLen)] = te1 - - cv = load6432(src, s) - - if !canRepeat { - continue - } - - // Check offset 2 - for { - o2 := s - offset2 - if load3232(src, o2) != uint32(cv) { - // Do regular search - break - } - - // Store this, since we have it. - nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) - nextHashL := hashLen(cv, dFastLongTableBits, dFastLongLen) - - // We have at least 4 byte match. - // No need to check backwards. We come straight from a match - l := 4 + e.matchlen(s+4, o2+4, src) - - entry := tableEntry{offset: s + e.cur, val: uint32(cv)} - e.longTable[nextHashL] = entry - e.table[nextHashS] = entry - seq.matchLen = uint32(l) - zstdMinMatch - seq.litLen = 0 - - // Since litlen is always 0, this is offset 1. - seq.offset = 1 - s += l - nextEmit = s - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - // Swap offset 1 and 2. - offset1, offset2 = offset2, offset1 - if s >= sLimit { - // Finished - break encodeLoop - } - cv = load6432(src, s) - } - } - - if int(nextEmit) < len(src) { - blk.literals = append(blk.literals, src[nextEmit:]...) - blk.extraLits = len(src) - int(nextEmit) - } - blk.recentOffsets[0] = uint32(offset1) - blk.recentOffsets[1] = uint32(offset2) - if debugEncoder { - println("returning, recent offsets:", blk.recentOffsets, "extra literals:", blk.extraLits) - } -} - -// EncodeNoHist will encode a block with no history and no following blocks. -// Most notable difference is that src will not be copied for history and -// we do not need to check for max match length. -func (e *doubleFastEncoder) EncodeNoHist(blk *blockEnc, src []byte) { - const ( - // Input margin is the number of bytes we read (8) - // and the maximum we will read ahead (2) - inputMargin = 8 + 2 - minNonLiteralBlockSize = 16 - ) - - // Protect against e.cur wraparound. - if e.cur >= e.bufferReset { - for i := range e.table[:] { - e.table[i] = tableEntry{} - } - for i := range e.longTable[:] { - e.longTable[i] = tableEntry{} - } - e.cur = e.maxMatchOff - } - - s := int32(0) - blk.size = len(src) - if len(src) < minNonLiteralBlockSize { - blk.extraLits = len(src) - blk.literals = blk.literals[:len(src)] - copy(blk.literals, src) - return - } - - // Override src - sLimit := int32(len(src)) - inputMargin - // stepSize is the number of bytes to skip on every main loop iteration. - // It should be >= 1. - const stepSize = 1 - - const kSearchStrength = 8 - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := s - cv := load6432(src, s) - - // Relative offsets - offset1 := int32(blk.recentOffsets[0]) - offset2 := int32(blk.recentOffsets[1]) - - addLiterals := func(s *seq, until int32) { - if until == nextEmit { - return - } - blk.literals = append(blk.literals, src[nextEmit:until]...) - s.litLen = uint32(until - nextEmit) - } - if debugEncoder { - println("recent offsets:", blk.recentOffsets) - } - -encodeLoop: - for { - var t int32 - for { - - nextHashL := hashLen(cv, dFastLongTableBits, dFastLongLen) - nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) - candidateL := e.longTable[nextHashL] - candidateS := e.table[nextHashS] - - const repOff = 1 - repIndex := s - offset1 + repOff - entry := tableEntry{offset: s + e.cur, val: uint32(cv)} - e.longTable[nextHashL] = entry - e.table[nextHashS] = entry - - if len(blk.sequences) > 2 { - if load3232(src, repIndex) == uint32(cv>>(repOff*8)) { - // Consider history as well. - var seq seq - //length := 4 + e.matchlen(s+4+repOff, repIndex+4, src) - length := 4 + int32(matchLen(src[s+4+repOff:], src[repIndex+4:])) - - seq.matchLen = uint32(length - zstdMinMatch) - - // We might be able to match backwards. - // Extend as long as we can. - start := s + repOff - // We end the search early, so we don't risk 0 literals - // and have to do special offset treatment. - startLimit := nextEmit + 1 - - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for repIndex > tMin && start > startLimit && src[repIndex-1] == src[start-1] { - repIndex-- - start-- - seq.matchLen++ - } - addLiterals(&seq, start) - - // rep 0 - seq.offset = 1 - if debugSequences { - println("repeat sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - s += length + repOff - nextEmit = s - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, length) - - } - break encodeLoop - } - cv = load6432(src, s) - continue - } - } - // Find the offsets of our two matches. - coffsetL := s - (candidateL.offset - e.cur) - coffsetS := s - (candidateS.offset - e.cur) - - // Check if we have a long match. - if coffsetL < e.maxMatchOff && uint32(cv) == candidateL.val { - // Found a long match, likely at least 8 bytes. - // Reference encoder checks all 8 bytes, we only check 4, - // but the likelihood of both the first 4 bytes and the hash matching should be enough. - t = candidateL.offset - e.cur - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d). cur: %d", s, t, e.cur)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugMatches { - println("long match") - } - break - } - - // Check if we have a short match. - if coffsetS < e.maxMatchOff && uint32(cv) == candidateS.val { - // found a regular match - // See if we can find a long match at s+1 - const checkAt = 1 - cv := load6432(src, s+checkAt) - nextHashL = hashLen(cv, dFastLongTableBits, dFastLongLen) - candidateL = e.longTable[nextHashL] - coffsetL = s - (candidateL.offset - e.cur) + checkAt - - // We can store it, since we have at least a 4 byte match. - e.longTable[nextHashL] = tableEntry{offset: s + checkAt + e.cur, val: uint32(cv)} - if coffsetL < e.maxMatchOff && uint32(cv) == candidateL.val { - // Found a long match, likely at least 8 bytes. - // Reference encoder checks all 8 bytes, we only check 4, - // but the likelihood of both the first 4 bytes and the hash matching should be enough. - t = candidateL.offset - e.cur - s += checkAt - if debugMatches { - println("long match (after short)") - } - break - } - - t = candidateS.offset - e.cur - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugAsserts && t < 0 { - panic("t<0") - } - if debugMatches { - println("short match") - } - break - } - - // No match found, move forward in input. - s += stepSize + ((s - nextEmit) >> (kSearchStrength - 1)) - if s >= sLimit { - break encodeLoop - } - cv = load6432(src, s) - } - - // A 4-byte match has been found. Update recent offsets. - // We'll later see if more than 4 bytes. - offset2 = offset1 - offset1 = s - t - - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - - // Extend the 4-byte match as long as possible. - //l := e.matchlen(s+4, t+4, src) + 4 - l := int32(matchLen(src[s+4:], src[t+4:])) + 4 - - // Extend backwards - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for t > tMin && s > nextEmit && src[t-1] == src[s-1] { - s-- - t-- - l++ - } - - // Write our sequence - var seq seq - seq.litLen = uint32(s - nextEmit) - seq.matchLen = uint32(l - zstdMinMatch) - if seq.litLen > 0 { - blk.literals = append(blk.literals, src[nextEmit:s]...) - } - seq.offset = uint32(s-t) + 3 - s += l - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - nextEmit = s - if s >= sLimit { - break encodeLoop - } - - // Index match start+1 (long) and start+2 (short) - index0 := s - l + 1 - // Index match end-2 (long) and end-1 (short) - index1 := s - 2 - - cv0 := load6432(src, index0) - cv1 := load6432(src, index1) - te0 := tableEntry{offset: index0 + e.cur, val: uint32(cv0)} - te1 := tableEntry{offset: index1 + e.cur, val: uint32(cv1)} - e.longTable[hashLen(cv0, dFastLongTableBits, dFastLongLen)] = te0 - e.longTable[hashLen(cv1, dFastLongTableBits, dFastLongLen)] = te1 - cv0 >>= 8 - cv1 >>= 8 - te0.offset++ - te1.offset++ - te0.val = uint32(cv0) - te1.val = uint32(cv1) - e.table[hashLen(cv0, dFastShortTableBits, dFastShortLen)] = te0 - e.table[hashLen(cv1, dFastShortTableBits, dFastShortLen)] = te1 - - cv = load6432(src, s) - - if len(blk.sequences) <= 2 { - continue - } - - // Check offset 2 - for { - o2 := s - offset2 - if load3232(src, o2) != uint32(cv) { - // Do regular search - break - } - - // Store this, since we have it. - nextHashS := hashLen(cv1>>8, dFastShortTableBits, dFastShortLen) - nextHashL := hashLen(cv, dFastLongTableBits, dFastLongLen) - - // We have at least 4 byte match. - // No need to check backwards. We come straight from a match - //l := 4 + e.matchlen(s+4, o2+4, src) - l := 4 + int32(matchLen(src[s+4:], src[o2+4:])) - - entry := tableEntry{offset: s + e.cur, val: uint32(cv)} - e.longTable[nextHashL] = entry - e.table[nextHashS] = entry - seq.matchLen = uint32(l) - zstdMinMatch - seq.litLen = 0 - - // Since litlen is always 0, this is offset 1. - seq.offset = 1 - s += l - nextEmit = s - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - // Swap offset 1 and 2. - offset1, offset2 = offset2, offset1 - if s >= sLimit { - // Finished - break encodeLoop - } - cv = load6432(src, s) - } - } - - if int(nextEmit) < len(src) { - blk.literals = append(blk.literals, src[nextEmit:]...) - blk.extraLits = len(src) - int(nextEmit) - } - if debugEncoder { - println("returning, recent offsets:", blk.recentOffsets, "extra literals:", blk.extraLits) - } - - // We do not store history, so we must offset e.cur to avoid false matches for next user. - if e.cur < e.bufferReset { - e.cur += int32(len(src)) - } -} - -// Encode will encode the content, with a dictionary if initialized for it. -func (e *doubleFastEncoderDict) Encode(blk *blockEnc, src []byte) { - const ( - // Input margin is the number of bytes we read (8) - // and the maximum we will read ahead (2) - inputMargin = 8 + 2 - minNonLiteralBlockSize = 16 - ) - - // Protect against e.cur wraparound. - for e.cur >= e.bufferReset-int32(len(e.hist)) { - if len(e.hist) == 0 { - for i := range e.table[:] { - e.table[i] = tableEntry{} - } - for i := range e.longTable[:] { - e.longTable[i] = tableEntry{} - } - e.markAllShardsDirty() - e.cur = e.maxMatchOff - break - } - // Shift down everything in the table that isn't already too far away. - minOff := e.cur + int32(len(e.hist)) - e.maxMatchOff - for i := range e.table[:] { - v := e.table[i].offset - if v < minOff { - v = 0 - } else { - v = v - e.cur + e.maxMatchOff - } - e.table[i].offset = v - } - for i := range e.longTable[:] { - v := e.longTable[i].offset - if v < minOff { - v = 0 - } else { - v = v - e.cur + e.maxMatchOff - } - e.longTable[i].offset = v - } - e.markAllShardsDirty() - e.cur = e.maxMatchOff - break - } - - s := e.addBlock(src) - blk.size = len(src) - if len(src) < minNonLiteralBlockSize { - blk.extraLits = len(src) - blk.literals = blk.literals[:len(src)] - copy(blk.literals, src) - return - } - - // Override src - src = e.hist - sLimit := int32(len(src)) - inputMargin - // stepSize is the number of bytes to skip on every main loop iteration. - // It should be >= 1. - const stepSize = 1 - - const kSearchStrength = 8 - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := s - cv := load6432(src, s) - - // Relative offsets - offset1 := int32(blk.recentOffsets[0]) - offset2 := int32(blk.recentOffsets[1]) - - addLiterals := func(s *seq, until int32) { - if until == nextEmit { - return - } - blk.literals = append(blk.literals, src[nextEmit:until]...) - s.litLen = uint32(until - nextEmit) - } - if debugEncoder { - println("recent offsets:", blk.recentOffsets) - } - -encodeLoop: - for { - var t int32 - // We allow the encoder to optionally turn off repeat offsets across blocks - canRepeat := len(blk.sequences) > 2 - - for { - if debugAsserts && canRepeat && offset1 == 0 { - panic("offset0 was 0") - } - - nextHashL := hashLen(cv, dFastLongTableBits, dFastLongLen) - nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) - candidateL := e.longTable[nextHashL] - candidateS := e.table[nextHashS] - - const repOff = 1 - repIndex := s - offset1 + repOff - entry := tableEntry{offset: s + e.cur, val: uint32(cv)} - e.longTable[nextHashL] = entry - e.markLongShardDirty(nextHashL) - e.table[nextHashS] = entry - e.markShardDirty(nextHashS) - - if canRepeat { - if repIndex >= 0 && load3232(src, repIndex) == uint32(cv>>(repOff*8)) { - // Consider history as well. - var seq seq - length := 4 + e.matchlen(s+4+repOff, repIndex+4, src) - - seq.matchLen = uint32(length - zstdMinMatch) - - // We might be able to match backwards. - // Extend as long as we can. - start := s + repOff - // We end the search early, so we don't risk 0 literals - // and have to do special offset treatment. - startLimit := nextEmit + 1 - - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for repIndex > tMin && start > startLimit && src[repIndex-1] == src[start-1] && seq.matchLen < maxMatchLength-zstdMinMatch-1 { - repIndex-- - start-- - seq.matchLen++ - } - addLiterals(&seq, start) - - // rep 0 - seq.offset = 1 - if debugSequences { - println("repeat sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - s += length + repOff - nextEmit = s - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, length) - - } - break encodeLoop - } - cv = load6432(src, s) - continue - } - } - // Find the offsets of our two matches. - coffsetL := s - (candidateL.offset - e.cur) - coffsetS := s - (candidateS.offset - e.cur) - - // Check if we have a long match. - if coffsetL < e.maxMatchOff && uint32(cv) == candidateL.val { - // Found a long match, likely at least 8 bytes. - // Reference encoder checks all 8 bytes, we only check 4, - // but the likelihood of both the first 4 bytes and the hash matching should be enough. - t = candidateL.offset - e.cur - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugMatches { - println("long match") - } - break - } - - // Check if we have a short match. - if coffsetS < e.maxMatchOff && uint32(cv) == candidateS.val { - // found a regular match - // See if we can find a long match at s+1 - const checkAt = 1 - cv := load6432(src, s+checkAt) - nextHashL = hashLen(cv, dFastLongTableBits, dFastLongLen) - candidateL = e.longTable[nextHashL] - coffsetL = s - (candidateL.offset - e.cur) + checkAt - - // We can store it, since we have at least a 4 byte match. - e.longTable[nextHashL] = tableEntry{offset: s + checkAt + e.cur, val: uint32(cv)} - e.markLongShardDirty(nextHashL) - if coffsetL < e.maxMatchOff && uint32(cv) == candidateL.val { - // Found a long match, likely at least 8 bytes. - // Reference encoder checks all 8 bytes, we only check 4, - // but the likelihood of both the first 4 bytes and the hash matching should be enough. - t = candidateL.offset - e.cur - s += checkAt - if debugMatches { - println("long match (after short)") - } - break - } - - t = candidateS.offset - e.cur - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugAsserts && t < 0 { - panic("t<0") - } - if debugMatches { - println("short match") - } - break - } - - // No match found, move forward in input. - s += stepSize + ((s - nextEmit) >> (kSearchStrength - 1)) - if s >= sLimit { - break encodeLoop - } - cv = load6432(src, s) - } - - // A 4-byte match has been found. Update recent offsets. - // We'll later see if more than 4 bytes. - offset2 = offset1 - offset1 = s - t - - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - - if debugAsserts && canRepeat && int(offset1) > len(src) { - panic("invalid offset") - } - - // Extend the 4-byte match as long as possible. - l := e.matchlen(s+4, t+4, src) + 4 - - // Extend backwards - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for t > tMin && s > nextEmit && src[t-1] == src[s-1] && l < maxMatchLength { - s-- - t-- - l++ - } - - // Write our sequence - var seq seq - seq.litLen = uint32(s - nextEmit) - seq.matchLen = uint32(l - zstdMinMatch) - if seq.litLen > 0 { - blk.literals = append(blk.literals, src[nextEmit:s]...) - } - seq.offset = uint32(s-t) + 3 - s += l - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - nextEmit = s - if s >= sLimit { - break encodeLoop - } - - // Index match start+1 (long) and start+2 (short) - index0 := s - l + 1 - // Index match end-2 (long) and end-1 (short) - index1 := s - 2 - - cv0 := load6432(src, index0) - cv1 := load6432(src, index1) - te0 := tableEntry{offset: index0 + e.cur, val: uint32(cv0)} - te1 := tableEntry{offset: index1 + e.cur, val: uint32(cv1)} - longHash1 := hashLen(cv0, dFastLongTableBits, dFastLongLen) - longHash2 := hashLen(cv1, dFastLongTableBits, dFastLongLen) - e.longTable[longHash1] = te0 - e.longTable[longHash2] = te1 - e.markLongShardDirty(longHash1) - e.markLongShardDirty(longHash2) - cv0 >>= 8 - cv1 >>= 8 - te0.offset++ - te1.offset++ - te0.val = uint32(cv0) - te1.val = uint32(cv1) - hashVal1 := hashLen(cv0, dFastShortTableBits, dFastShortLen) - hashVal2 := hashLen(cv1, dFastShortTableBits, dFastShortLen) - e.table[hashVal1] = te0 - e.markShardDirty(hashVal1) - e.table[hashVal2] = te1 - e.markShardDirty(hashVal2) - - cv = load6432(src, s) - - if !canRepeat { - continue - } - - // Check offset 2 - for { - o2 := s - offset2 - if load3232(src, o2) != uint32(cv) { - // Do regular search - break - } - - // Store this, since we have it. - nextHashL := hashLen(cv, dFastLongTableBits, dFastLongLen) - nextHashS := hashLen(cv, dFastShortTableBits, dFastShortLen) - - // We have at least 4 byte match. - // No need to check backwards. We come straight from a match - l := 4 + e.matchlen(s+4, o2+4, src) - - entry := tableEntry{offset: s + e.cur, val: uint32(cv)} - e.longTable[nextHashL] = entry - e.markLongShardDirty(nextHashL) - e.table[nextHashS] = entry - e.markShardDirty(nextHashS) - seq.matchLen = uint32(l) - zstdMinMatch - seq.litLen = 0 - - // Since litlen is always 0, this is offset 1. - seq.offset = 1 - s += l - nextEmit = s - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - // Swap offset 1 and 2. - offset1, offset2 = offset2, offset1 - if s >= sLimit { - // Finished - break encodeLoop - } - cv = load6432(src, s) - } - } - - if int(nextEmit) < len(src) { - blk.literals = append(blk.literals, src[nextEmit:]...) - blk.extraLits = len(src) - int(nextEmit) - } - blk.recentOffsets[0] = uint32(offset1) - blk.recentOffsets[1] = uint32(offset2) - if debugEncoder { - println("returning, recent offsets:", blk.recentOffsets, "extra literals:", blk.extraLits) - } - // If we encoded more than 64K mark all dirty. - if len(src) > 64<<10 { - e.markAllShardsDirty() - } -} - -// ResetDict will reset and set a dictionary if not nil -func (e *doubleFastEncoder) Reset(d *dict, singleBlock bool) { - e.fastEncoder.Reset(d, singleBlock) - if d != nil { - panic("doubleFastEncoder: Reset with dict not supported") - } -} - -// ResetDict will reset and set a dictionary if not nil -func (e *doubleFastEncoderDict) Reset(d *dict, singleBlock bool) { - allDirty := e.allDirty - e.fastEncoderDict.Reset(d, singleBlock) - if d == nil { - return - } - - // Init or copy dict table - if len(e.dictLongTable) != len(e.longTable) || d.id != e.lastDictID { - if len(e.dictLongTable) != len(e.longTable) { - e.dictLongTable = make([]tableEntry, len(e.longTable)) - } - if len(d.content) >= 8 { - cv := load6432(d.content, 0) - e.dictLongTable[hashLen(cv, dFastLongTableBits, dFastLongLen)] = tableEntry{ - val: uint32(cv), - offset: e.maxMatchOff, - } - end := int32(len(d.content)) - 8 + e.maxMatchOff - for i := e.maxMatchOff + 1; i < end; i++ { - cv = cv>>8 | (uint64(d.content[i-e.maxMatchOff+7]) << 56) - e.dictLongTable[hashLen(cv, dFastLongTableBits, dFastLongLen)] = tableEntry{ - val: uint32(cv), - offset: i, - } - } - } - e.lastDictID = d.id - allDirty = true - } - // Reset table to initial state - e.cur = e.maxMatchOff - - dirtyShardCnt := 0 - if !allDirty { - for i := range e.longTableShardDirty { - if e.longTableShardDirty[i] { - dirtyShardCnt++ - } - } - } - - if allDirty || dirtyShardCnt > dLongTableShardCnt/2 { - //copy(e.longTable[:], e.dictLongTable) - e.longTable = *(*[dFastLongTableSize]tableEntry)(e.dictLongTable) - for i := range e.longTableShardDirty { - e.longTableShardDirty[i] = false - } - return - } - for i := range e.longTableShardDirty { - if !e.longTableShardDirty[i] { - continue - } - - // copy(e.longTable[i*dLongTableShardSize:(i+1)*dLongTableShardSize], e.dictLongTable[i*dLongTableShardSize:(i+1)*dLongTableShardSize]) - *(*[dLongTableShardSize]tableEntry)(e.longTable[i*dLongTableShardSize:]) = *(*[dLongTableShardSize]tableEntry)(e.dictLongTable[i*dLongTableShardSize:]) - - e.longTableShardDirty[i] = false - } -} - -func (e *doubleFastEncoderDict) markLongShardDirty(entryNum uint32) { - e.longTableShardDirty[entryNum/dLongTableShardSize] = true -} diff --git a/vendor/github.com/klauspost/compress/zstd/enc_fast.go b/vendor/github.com/klauspost/compress/zstd/enc_fast.go deleted file mode 100644 index f45a3da7da..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/enc_fast.go +++ /dev/null @@ -1,891 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "fmt" -) - -const ( - tableBits = 15 // Bits used in the table - tableSize = 1 << tableBits // Size of the table - tableShardCnt = 1 << (tableBits - dictShardBits) // Number of shards in the table - tableShardSize = tableSize / tableShardCnt // Size of an individual shard - tableFastHashLen = 6 - tableMask = tableSize - 1 // Mask for table indices. Redundant, but can eliminate bounds checks. - maxMatchLength = 131074 -) - -type tableEntry struct { - val uint32 - offset int32 -} - -type fastEncoder struct { - fastBase - table [tableSize]tableEntry -} - -type fastEncoderDict struct { - fastEncoder - dictTable []tableEntry - tableShardDirty [tableShardCnt]bool - allDirty bool -} - -// Encode mimmics functionality in zstd_fast.c -func (e *fastEncoder) Encode(blk *blockEnc, src []byte) { - const ( - inputMargin = 8 - minNonLiteralBlockSize = 1 + 1 + inputMargin - ) - - // Protect against e.cur wraparound. - for e.cur >= e.bufferReset-int32(len(e.hist)) { - if len(e.hist) == 0 { - for i := range e.table[:] { - e.table[i] = tableEntry{} - } - e.cur = e.maxMatchOff - break - } - // Shift down everything in the table that isn't already too far away. - minOff := e.cur + int32(len(e.hist)) - e.maxMatchOff - for i := range e.table[:] { - v := e.table[i].offset - if v < minOff { - v = 0 - } else { - v = v - e.cur + e.maxMatchOff - } - e.table[i].offset = v - } - e.cur = e.maxMatchOff - break - } - - s := e.addBlock(src) - blk.size = len(src) - if len(src) < minNonLiteralBlockSize { - blk.extraLits = len(src) - blk.literals = blk.literals[:len(src)] - copy(blk.literals, src) - return - } - - // Override src - src = e.hist - sLimit := int32(len(src)) - inputMargin - // stepSize is the number of bytes to skip on every main loop iteration. - // It should be >= 2. - const stepSize = 2 - - // TEMPLATE - const hashLog = tableBits - // seems global, but would be nice to tweak. - const kSearchStrength = 6 - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := s - cv := load6432(src, s) - - // Relative offsets - offset1 := int32(blk.recentOffsets[0]) - offset2 := int32(blk.recentOffsets[1]) - - addLiterals := func(s *seq, until int32) { - if until == nextEmit { - return - } - blk.literals = append(blk.literals, src[nextEmit:until]...) - s.litLen = uint32(until - nextEmit) - } - if debugEncoder { - println("recent offsets:", blk.recentOffsets) - } - -encodeLoop: - for { - // t will contain the match offset when we find one. - // When existing the search loop, we have already checked 4 bytes. - var t int32 - - // We will not use repeat offsets across blocks. - // By not using them for the first 3 matches - canRepeat := len(blk.sequences) > 2 - - for { - if debugAsserts && canRepeat && offset1 == 0 { - panic("offset0 was 0") - } - - nextHash := hashLen(cv, hashLog, tableFastHashLen) - nextHash2 := hashLen(cv>>8, hashLog, tableFastHashLen) - candidate := e.table[nextHash] - candidate2 := e.table[nextHash2] - repIndex := s - offset1 + 2 - - e.table[nextHash] = tableEntry{offset: s + e.cur, val: uint32(cv)} - e.table[nextHash2] = tableEntry{offset: s + e.cur + 1, val: uint32(cv >> 8)} - - if canRepeat && repIndex >= 0 && load3232(src, repIndex) == uint32(cv>>16) { - // Consider history as well. - var seq seq - length := 4 + e.matchlen(s+6, repIndex+4, src) - seq.matchLen = uint32(length - zstdMinMatch) - - // We might be able to match backwards. - // Extend as long as we can. - start := s + 2 - // We end the search early, so we don't risk 0 literals - // and have to do special offset treatment. - startLimit := nextEmit + 1 - - sMin := s - e.maxMatchOff - if sMin < 0 { - sMin = 0 - } - for repIndex > sMin && start > startLimit && src[repIndex-1] == src[start-1] && seq.matchLen < maxMatchLength-zstdMinMatch { - repIndex-- - start-- - seq.matchLen++ - } - addLiterals(&seq, start) - - // rep 0 - seq.offset = 1 - if debugSequences { - println("repeat sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - s += length + 2 - nextEmit = s - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, length) - - } - break encodeLoop - } - cv = load6432(src, s) - continue - } - coffset0 := s - (candidate.offset - e.cur) - coffset1 := s - (candidate2.offset - e.cur) + 1 - if coffset0 < e.maxMatchOff && uint32(cv) == candidate.val { - // found a regular match - t = candidate.offset - e.cur - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - break - } - - if coffset1 < e.maxMatchOff && uint32(cv>>8) == candidate2.val { - // found a regular match - t = candidate2.offset - e.cur - s++ - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugAsserts && t < 0 { - panic("t<0") - } - break - } - s += stepSize + ((s - nextEmit) >> (kSearchStrength - 1)) - if s >= sLimit { - break encodeLoop - } - cv = load6432(src, s) - } - // A 4-byte match has been found. We'll later see if more than 4 bytes. - offset2 = offset1 - offset1 = s - t - - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - - if debugAsserts && canRepeat && int(offset1) > len(src) { - panic("invalid offset") - } - - // Extend the 4-byte match as long as possible. - l := e.matchlen(s+4, t+4, src) + 4 - - // Extend backwards - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for t > tMin && s > nextEmit && src[t-1] == src[s-1] && l < maxMatchLength { - s-- - t-- - l++ - } - - // Write our sequence. - var seq seq - seq.litLen = uint32(s - nextEmit) - seq.matchLen = uint32(l - zstdMinMatch) - if seq.litLen > 0 { - blk.literals = append(blk.literals, src[nextEmit:s]...) - } - // Don't use repeat offsets - seq.offset = uint32(s-t) + 3 - s += l - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - nextEmit = s - if s >= sLimit { - break encodeLoop - } - cv = load6432(src, s) - - // Check offset 2 - if o2 := s - offset2; canRepeat && load3232(src, o2) == uint32(cv) { - // We have at least 4 byte match. - // No need to check backwards. We come straight from a match - l := 4 + e.matchlen(s+4, o2+4, src) - - // Store this, since we have it. - nextHash := hashLen(cv, hashLog, tableFastHashLen) - e.table[nextHash] = tableEntry{offset: s + e.cur, val: uint32(cv)} - seq.matchLen = uint32(l) - zstdMinMatch - seq.litLen = 0 - // Since litlen is always 0, this is offset 1. - seq.offset = 1 - s += l - nextEmit = s - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - // Swap offset 1 and 2. - offset1, offset2 = offset2, offset1 - if s >= sLimit { - break encodeLoop - } - // Prepare next loop. - cv = load6432(src, s) - } - } - - if int(nextEmit) < len(src) { - blk.literals = append(blk.literals, src[nextEmit:]...) - blk.extraLits = len(src) - int(nextEmit) - } - blk.recentOffsets[0] = uint32(offset1) - blk.recentOffsets[1] = uint32(offset2) - if debugEncoder { - println("returning, recent offsets:", blk.recentOffsets, "extra literals:", blk.extraLits) - } -} - -// EncodeNoHist will encode a block with no history and no following blocks. -// Most notable difference is that src will not be copied for history and -// we do not need to check for max match length. -func (e *fastEncoder) EncodeNoHist(blk *blockEnc, src []byte) { - const ( - inputMargin = 8 - minNonLiteralBlockSize = 1 + 1 + inputMargin - ) - if debugEncoder { - if len(src) > maxCompressedBlockSize { - panic("src too big") - } - } - - // Protect against e.cur wraparound. - if e.cur >= e.bufferReset { - for i := range e.table[:] { - e.table[i] = tableEntry{} - } - e.cur = e.maxMatchOff - } - - s := int32(0) - blk.size = len(src) - if len(src) < minNonLiteralBlockSize { - blk.extraLits = len(src) - blk.literals = blk.literals[:len(src)] - copy(blk.literals, src) - return - } - - sLimit := int32(len(src)) - inputMargin - // stepSize is the number of bytes to skip on every main loop iteration. - // It should be >= 2. - const stepSize = 2 - - // TEMPLATE - const hashLog = tableBits - // seems global, but would be nice to tweak. - const kSearchStrength = 6 - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := s - cv := load6432(src, s) - - // Relative offsets - offset1 := int32(blk.recentOffsets[0]) - offset2 := int32(blk.recentOffsets[1]) - - addLiterals := func(s *seq, until int32) { - if until == nextEmit { - return - } - blk.literals = append(blk.literals, src[nextEmit:until]...) - s.litLen = uint32(until - nextEmit) - } - if debugEncoder { - println("recent offsets:", blk.recentOffsets) - } - -encodeLoop: - for { - // t will contain the match offset when we find one. - // When existing the search loop, we have already checked 4 bytes. - var t int32 - - // We will not use repeat offsets across blocks. - // By not using them for the first 3 matches - - for { - nextHash := hashLen(cv, hashLog, tableFastHashLen) - nextHash2 := hashLen(cv>>8, hashLog, tableFastHashLen) - candidate := e.table[nextHash] - candidate2 := e.table[nextHash2] - repIndex := s - offset1 + 2 - - e.table[nextHash] = tableEntry{offset: s + e.cur, val: uint32(cv)} - e.table[nextHash2] = tableEntry{offset: s + e.cur + 1, val: uint32(cv >> 8)} - - if len(blk.sequences) > 2 && load3232(src, repIndex) == uint32(cv>>16) { - // Consider history as well. - var seq seq - length := 4 + e.matchlen(s+6, repIndex+4, src) - - seq.matchLen = uint32(length - zstdMinMatch) - - // We might be able to match backwards. - // Extend as long as we can. - start := s + 2 - // We end the search early, so we don't risk 0 literals - // and have to do special offset treatment. - startLimit := nextEmit + 1 - - sMin := s - e.maxMatchOff - if sMin < 0 { - sMin = 0 - } - for repIndex > sMin && start > startLimit && src[repIndex-1] == src[start-1] { - repIndex-- - start-- - seq.matchLen++ - } - addLiterals(&seq, start) - - // rep 0 - seq.offset = 1 - if debugSequences { - println("repeat sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - s += length + 2 - nextEmit = s - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, length) - - } - break encodeLoop - } - cv = load6432(src, s) - continue - } - coffset0 := s - (candidate.offset - e.cur) - coffset1 := s - (candidate2.offset - e.cur) + 1 - if coffset0 < e.maxMatchOff && uint32(cv) == candidate.val { - // found a regular match - t = candidate.offset - e.cur - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugAsserts && t < 0 { - panic(fmt.Sprintf("t (%d) < 0, candidate.offset: %d, e.cur: %d, coffset0: %d, e.maxMatchOff: %d", t, candidate.offset, e.cur, coffset0, e.maxMatchOff)) - } - break - } - - if coffset1 < e.maxMatchOff && uint32(cv>>8) == candidate2.val { - // found a regular match - t = candidate2.offset - e.cur - s++ - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugAsserts && t < 0 { - panic("t<0") - } - break - } - s += stepSize + ((s - nextEmit) >> (kSearchStrength - 1)) - if s >= sLimit { - break encodeLoop - } - cv = load6432(src, s) - } - // A 4-byte match has been found. We'll later see if more than 4 bytes. - offset2 = offset1 - offset1 = s - t - - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - - if debugAsserts && t < 0 { - panic(fmt.Sprintf("t (%d) < 0 ", t)) - } - // Extend the 4-byte match as long as possible. - l := e.matchlen(s+4, t+4, src) + 4 - - // Extend backwards - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for t > tMin && s > nextEmit && src[t-1] == src[s-1] { - s-- - t-- - l++ - } - - // Write our sequence. - var seq seq - seq.litLen = uint32(s - nextEmit) - seq.matchLen = uint32(l - zstdMinMatch) - if seq.litLen > 0 { - blk.literals = append(blk.literals, src[nextEmit:s]...) - } - // Don't use repeat offsets - seq.offset = uint32(s-t) + 3 - s += l - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - nextEmit = s - if s >= sLimit { - break encodeLoop - } - cv = load6432(src, s) - - // Check offset 2 - if o2 := s - offset2; len(blk.sequences) > 2 && load3232(src, o2) == uint32(cv) { - // We have at least 4 byte match. - // No need to check backwards. We come straight from a match - l := 4 + e.matchlen(s+4, o2+4, src) - - // Store this, since we have it. - nextHash := hashLen(cv, hashLog, tableFastHashLen) - e.table[nextHash] = tableEntry{offset: s + e.cur, val: uint32(cv)} - seq.matchLen = uint32(l) - zstdMinMatch - seq.litLen = 0 - // Since litlen is always 0, this is offset 1. - seq.offset = 1 - s += l - nextEmit = s - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - // Swap offset 1 and 2. - offset1, offset2 = offset2, offset1 - if s >= sLimit { - break encodeLoop - } - // Prepare next loop. - cv = load6432(src, s) - } - } - - if int(nextEmit) < len(src) { - blk.literals = append(blk.literals, src[nextEmit:]...) - blk.extraLits = len(src) - int(nextEmit) - } - if debugEncoder { - println("returning, recent offsets:", blk.recentOffsets, "extra literals:", blk.extraLits) - } - // We do not store history, so we must offset e.cur to avoid false matches for next user. - if e.cur < e.bufferReset { - e.cur += int32(len(src)) - } -} - -// Encode will encode the content, with a dictionary if initialized for it. -func (e *fastEncoderDict) Encode(blk *blockEnc, src []byte) { - const ( - inputMargin = 8 - minNonLiteralBlockSize = 1 + 1 + inputMargin - ) - if e.allDirty || len(src) > 32<<10 { - e.fastEncoder.Encode(blk, src) - e.allDirty = true - return - } - // Protect against e.cur wraparound. - for e.cur >= e.bufferReset-int32(len(e.hist)) { - if len(e.hist) == 0 { - e.table = [tableSize]tableEntry{} - e.cur = e.maxMatchOff - break - } - // Shift down everything in the table that isn't already too far away. - minOff := e.cur + int32(len(e.hist)) - e.maxMatchOff - for i := range e.table[:] { - v := e.table[i].offset - if v < minOff { - v = 0 - } else { - v = v - e.cur + e.maxMatchOff - } - e.table[i].offset = v - } - e.cur = e.maxMatchOff - break - } - - s := e.addBlock(src) - blk.size = len(src) - if len(src) < minNonLiteralBlockSize { - blk.extraLits = len(src) - blk.literals = blk.literals[:len(src)] - copy(blk.literals, src) - return - } - - // Override src - src = e.hist - sLimit := int32(len(src)) - inputMargin - // stepSize is the number of bytes to skip on every main loop iteration. - // It should be >= 2. - const stepSize = 2 - - // TEMPLATE - const hashLog = tableBits - // seems global, but would be nice to tweak. - const kSearchStrength = 7 - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := s - cv := load6432(src, s) - - // Relative offsets - offset1 := int32(blk.recentOffsets[0]) - offset2 := int32(blk.recentOffsets[1]) - - addLiterals := func(s *seq, until int32) { - if until == nextEmit { - return - } - blk.literals = append(blk.literals, src[nextEmit:until]...) - s.litLen = uint32(until - nextEmit) - } - if debugEncoder { - println("recent offsets:", blk.recentOffsets) - } - -encodeLoop: - for { - // t will contain the match offset when we find one. - // When existing the search loop, we have already checked 4 bytes. - var t int32 - - // We will not use repeat offsets across blocks. - // By not using them for the first 3 matches - canRepeat := len(blk.sequences) > 2 - - for { - if debugAsserts && canRepeat && offset1 == 0 { - panic("offset0 was 0") - } - - nextHash := hashLen(cv, hashLog, tableFastHashLen) - nextHash2 := hashLen(cv>>8, hashLog, tableFastHashLen) - candidate := e.table[nextHash] - candidate2 := e.table[nextHash2] - repIndex := s - offset1 + 2 - - e.table[nextHash] = tableEntry{offset: s + e.cur, val: uint32(cv)} - e.markShardDirty(nextHash) - e.table[nextHash2] = tableEntry{offset: s + e.cur + 1, val: uint32(cv >> 8)} - e.markShardDirty(nextHash2) - - if canRepeat && repIndex >= 0 && load3232(src, repIndex) == uint32(cv>>16) { - // Consider history as well. - var seq seq - length := 4 + e.matchlen(s+6, repIndex+4, src) - - seq.matchLen = uint32(length - zstdMinMatch) - - // We might be able to match backwards. - // Extend as long as we can. - start := s + 2 - // We end the search early, so we don't risk 0 literals - // and have to do special offset treatment. - startLimit := nextEmit + 1 - - sMin := s - e.maxMatchOff - if sMin < 0 { - sMin = 0 - } - for repIndex > sMin && start > startLimit && src[repIndex-1] == src[start-1] && seq.matchLen < maxMatchLength-zstdMinMatch { - repIndex-- - start-- - seq.matchLen++ - } - addLiterals(&seq, start) - - // rep 0 - seq.offset = 1 - if debugSequences { - println("repeat sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - s += length + 2 - nextEmit = s - if s >= sLimit { - if debugEncoder { - println("repeat ended", s, length) - - } - break encodeLoop - } - cv = load6432(src, s) - continue - } - coffset0 := s - (candidate.offset - e.cur) - coffset1 := s - (candidate2.offset - e.cur) + 1 - if coffset0 < e.maxMatchOff && uint32(cv) == candidate.val { - // found a regular match - t = candidate.offset - e.cur - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - break - } - - if coffset1 < e.maxMatchOff && uint32(cv>>8) == candidate2.val { - // found a regular match - t = candidate2.offset - e.cur - s++ - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - if debugAsserts && s-t > e.maxMatchOff { - panic("s - t >e.maxMatchOff") - } - if debugAsserts && t < 0 { - panic("t<0") - } - break - } - s += stepSize + ((s - nextEmit) >> (kSearchStrength - 1)) - if s >= sLimit { - break encodeLoop - } - cv = load6432(src, s) - } - // A 4-byte match has been found. We'll later see if more than 4 bytes. - offset2 = offset1 - offset1 = s - t - - if debugAsserts && s <= t { - panic(fmt.Sprintf("s (%d) <= t (%d)", s, t)) - } - - if debugAsserts && canRepeat && int(offset1) > len(src) { - panic("invalid offset") - } - - // Extend the 4-byte match as long as possible. - l := e.matchlen(s+4, t+4, src) + 4 - - // Extend backwards - tMin := s - e.maxMatchOff - if tMin < 0 { - tMin = 0 - } - for t > tMin && s > nextEmit && src[t-1] == src[s-1] && l < maxMatchLength { - s-- - t-- - l++ - } - - // Write our sequence. - var seq seq - seq.litLen = uint32(s - nextEmit) - seq.matchLen = uint32(l - zstdMinMatch) - if seq.litLen > 0 { - blk.literals = append(blk.literals, src[nextEmit:s]...) - } - // Don't use repeat offsets - seq.offset = uint32(s-t) + 3 - s += l - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - nextEmit = s - if s >= sLimit { - break encodeLoop - } - cv = load6432(src, s) - - // Check offset 2 - if o2 := s - offset2; canRepeat && load3232(src, o2) == uint32(cv) { - // We have at least 4 byte match. - // No need to check backwards. We come straight from a match - l := 4 + e.matchlen(s+4, o2+4, src) - - // Store this, since we have it. - nextHash := hashLen(cv, hashLog, tableFastHashLen) - e.table[nextHash] = tableEntry{offset: s + e.cur, val: uint32(cv)} - e.markShardDirty(nextHash) - seq.matchLen = uint32(l) - zstdMinMatch - seq.litLen = 0 - // Since litlen is always 0, this is offset 1. - seq.offset = 1 - s += l - nextEmit = s - if debugSequences { - println("sequence", seq, "next s:", s) - } - blk.sequences = append(blk.sequences, seq) - - // Swap offset 1 and 2. - offset1, offset2 = offset2, offset1 - if s >= sLimit { - break encodeLoop - } - // Prepare next loop. - cv = load6432(src, s) - } - } - - if int(nextEmit) < len(src) { - blk.literals = append(blk.literals, src[nextEmit:]...) - blk.extraLits = len(src) - int(nextEmit) - } - blk.recentOffsets[0] = uint32(offset1) - blk.recentOffsets[1] = uint32(offset2) - if debugEncoder { - println("returning, recent offsets:", blk.recentOffsets, "extra literals:", blk.extraLits) - } -} - -// ResetDict will reset and set a dictionary if not nil -func (e *fastEncoder) Reset(d *dict, singleBlock bool) { - e.resetBase(d, singleBlock) - if d != nil { - panic("fastEncoder: Reset with dict") - } -} - -// ResetDict will reset and set a dictionary if not nil -func (e *fastEncoderDict) Reset(d *dict, singleBlock bool) { - e.resetBase(d, singleBlock) - if d == nil { - return - } - - // Init or copy dict table - if len(e.dictTable) != len(e.table) || d.id != e.lastDictID { - if len(e.dictTable) != len(e.table) { - e.dictTable = make([]tableEntry, len(e.table)) - } - if true { - end := e.maxMatchOff + int32(len(d.content)) - 8 - for i := e.maxMatchOff; i < end; i += 2 { - const hashLog = tableBits - - cv := load6432(d.content, i-e.maxMatchOff) - nextHash := hashLen(cv, hashLog, tableFastHashLen) // 0 -> 6 - nextHash1 := hashLen(cv>>8, hashLog, tableFastHashLen) // 1 -> 7 - e.dictTable[nextHash] = tableEntry{ - val: uint32(cv), - offset: i, - } - e.dictTable[nextHash1] = tableEntry{ - val: uint32(cv >> 8), - offset: i + 1, - } - } - } - e.lastDictID = d.id - e.allDirty = true - } - - e.cur = e.maxMatchOff - dirtyShardCnt := 0 - if !e.allDirty { - for i := range e.tableShardDirty { - if e.tableShardDirty[i] { - dirtyShardCnt++ - } - } - } - - const shardCnt = tableShardCnt - const shardSize = tableShardSize - if e.allDirty || dirtyShardCnt > shardCnt*4/6 { - //copy(e.table[:], e.dictTable) - e.table = *(*[tableSize]tableEntry)(e.dictTable) - for i := range e.tableShardDirty { - e.tableShardDirty[i] = false - } - e.allDirty = false - return - } - for i := range e.tableShardDirty { - if !e.tableShardDirty[i] { - continue - } - - //copy(e.table[i*shardSize:(i+1)*shardSize], e.dictTable[i*shardSize:(i+1)*shardSize]) - *(*[shardSize]tableEntry)(e.table[i*shardSize:]) = *(*[shardSize]tableEntry)(e.dictTable[i*shardSize:]) - e.tableShardDirty[i] = false - } - e.allDirty = false -} - -func (e *fastEncoderDict) markAllShardsDirty() { - e.allDirty = true -} - -func (e *fastEncoderDict) markShardDirty(entryNum uint32) { - e.tableShardDirty[entryNum/tableShardSize] = true -} diff --git a/vendor/github.com/klauspost/compress/zstd/encoder.go b/vendor/github.com/klauspost/compress/zstd/encoder.go deleted file mode 100644 index 8f8223cd3a..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/encoder.go +++ /dev/null @@ -1,642 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "crypto/rand" - "errors" - "fmt" - "io" - "math" - rdebug "runtime/debug" - "sync" - - "github.com/klauspost/compress/zstd/internal/xxhash" -) - -// Encoder provides encoding to Zstandard. -// An Encoder can be used for either compressing a stream via the -// io.WriteCloser interface supported by the Encoder or as multiple independent -// tasks via the EncodeAll function. -// Smaller encodes are encouraged to use the EncodeAll function. -// Use NewWriter to create a new instance. -type Encoder struct { - o encoderOptions - encoders chan encoder - state encoderState - init sync.Once -} - -type encoder interface { - Encode(blk *blockEnc, src []byte) - EncodeNoHist(blk *blockEnc, src []byte) - Block() *blockEnc - CRC() *xxhash.Digest - AppendCRC([]byte) []byte - WindowSize(size int64) int32 - UseBlock(*blockEnc) - Reset(d *dict, singleBlock bool) -} - -type encoderState struct { - w io.Writer - filling []byte - current []byte - previous []byte - encoder encoder - writing *blockEnc - err error - writeErr error - nWritten int64 - nInput int64 - frameContentSize int64 - headerWritten bool - eofWritten bool - fullFrameWritten bool - - // This waitgroup indicates an encode is running. - wg sync.WaitGroup - // This waitgroup indicates we have a block encoding/writing. - wWg sync.WaitGroup -} - -// NewWriter will create a new Zstandard encoder. -// If the encoder will be used for encoding blocks a nil writer can be used. -func NewWriter(w io.Writer, opts ...EOption) (*Encoder, error) { - initPredefined() - var e Encoder - e.o.setDefault() - for _, o := range opts { - err := o(&e.o) - if err != nil { - return nil, err - } - } - if w != nil { - e.Reset(w) - } - return &e, nil -} - -func (e *Encoder) initialize() { - if e.o.concurrent == 0 { - e.o.setDefault() - } - e.encoders = make(chan encoder, e.o.concurrent) - for i := 0; i < e.o.concurrent; i++ { - enc := e.o.encoder() - e.encoders <- enc - } -} - -// Reset will re-initialize the writer and new writes will encode to the supplied writer -// as a new, independent stream. -func (e *Encoder) Reset(w io.Writer) { - s := &e.state - s.wg.Wait() - s.wWg.Wait() - if cap(s.filling) == 0 { - s.filling = make([]byte, 0, e.o.blockSize) - } - if e.o.concurrent > 1 { - if cap(s.current) == 0 { - s.current = make([]byte, 0, e.o.blockSize) - } - if cap(s.previous) == 0 { - s.previous = make([]byte, 0, e.o.blockSize) - } - s.current = s.current[:0] - s.previous = s.previous[:0] - if s.writing == nil { - s.writing = &blockEnc{lowMem: e.o.lowMem} - s.writing.init() - } - s.writing.initNewEncode() - } - if s.encoder == nil { - s.encoder = e.o.encoder() - } - s.filling = s.filling[:0] - s.encoder.Reset(e.o.dict, false) - s.headerWritten = false - s.eofWritten = false - s.fullFrameWritten = false - s.w = w - s.err = nil - s.nWritten = 0 - s.nInput = 0 - s.writeErr = nil - s.frameContentSize = 0 -} - -// ResetContentSize will reset and set a content size for the next stream. -// If the bytes written does not match the size given an error will be returned -// when calling Close(). -// This is removed when Reset is called. -// Sizes <= 0 results in no content size set. -func (e *Encoder) ResetContentSize(w io.Writer, size int64) { - e.Reset(w) - if size >= 0 { - e.state.frameContentSize = size - } -} - -// Write data to the encoder. -// Input data will be buffered and as the buffer fills up -// content will be compressed and written to the output. -// When done writing, use Close to flush the remaining output -// and write CRC if requested. -func (e *Encoder) Write(p []byte) (n int, err error) { - s := &e.state - if s.eofWritten { - return 0, ErrEncoderClosed - } - for len(p) > 0 { - if len(p)+len(s.filling) < e.o.blockSize { - if e.o.crc { - _, _ = s.encoder.CRC().Write(p) - } - s.filling = append(s.filling, p...) - return n + len(p), nil - } - add := p - if len(p)+len(s.filling) > e.o.blockSize { - add = add[:e.o.blockSize-len(s.filling)] - } - if e.o.crc { - _, _ = s.encoder.CRC().Write(add) - } - s.filling = append(s.filling, add...) - p = p[len(add):] - n += len(add) - if len(s.filling) < e.o.blockSize { - return n, nil - } - err := e.nextBlock(false) - if err != nil { - return n, err - } - if debugAsserts && len(s.filling) > 0 { - panic(len(s.filling)) - } - } - return n, nil -} - -// nextBlock will synchronize and start compressing input in e.state.filling. -// If an error has occurred during encoding it will be returned. -func (e *Encoder) nextBlock(final bool) error { - s := &e.state - // Wait for current block. - s.wg.Wait() - if s.err != nil { - return s.err - } - if len(s.filling) > e.o.blockSize { - return fmt.Errorf("block > maxStoreBlockSize") - } - if !s.headerWritten { - // If we have a single block encode, do a sync compression. - if final && len(s.filling) == 0 && !e.o.fullZero { - s.headerWritten = true - s.fullFrameWritten = true - s.eofWritten = true - return nil - } - if final && len(s.filling) > 0 { - s.current = e.encodeAll(s.encoder, s.filling, s.current[:0]) - var n2 int - n2, s.err = s.w.Write(s.current) - if s.err != nil { - return s.err - } - s.nWritten += int64(n2) - s.nInput += int64(len(s.filling)) - s.current = s.current[:0] - s.filling = s.filling[:0] - s.headerWritten = true - s.fullFrameWritten = true - s.eofWritten = true - return nil - } - - var tmp [maxHeaderSize]byte - fh := frameHeader{ - ContentSize: uint64(s.frameContentSize), - WindowSize: uint32(s.encoder.WindowSize(s.frameContentSize)), - SingleSegment: false, - Checksum: e.o.crc, - DictID: e.o.dict.ID(), - } - - dst := fh.appendTo(tmp[:0]) - s.headerWritten = true - s.wWg.Wait() - var n2 int - n2, s.err = s.w.Write(dst) - if s.err != nil { - return s.err - } - s.nWritten += int64(n2) - } - if s.eofWritten { - // Ensure we only write it once. - final = false - } - - if len(s.filling) == 0 { - // Final block, but no data. - if final { - enc := s.encoder - blk := enc.Block() - blk.reset(nil) - blk.last = true - blk.encodeRaw(nil) - s.wWg.Wait() - _, s.err = s.w.Write(blk.output) - s.nWritten += int64(len(blk.output)) - s.eofWritten = true - } - return s.err - } - - // SYNC: - if e.o.concurrent == 1 { - src := s.filling - s.nInput += int64(len(s.filling)) - if debugEncoder { - println("Adding sync block,", len(src), "bytes, final:", final) - } - enc := s.encoder - blk := enc.Block() - blk.reset(nil) - enc.Encode(blk, src) - blk.last = final - if final { - s.eofWritten = true - } - - s.err = blk.encode(src, e.o.noEntropy, !e.o.allLitEntropy) - if s.err != nil { - return s.err - } - _, s.err = s.w.Write(blk.output) - s.nWritten += int64(len(blk.output)) - s.filling = s.filling[:0] - return s.err - } - - // Move blocks forward. - s.filling, s.current, s.previous = s.previous[:0], s.filling, s.current - s.nInput += int64(len(s.current)) - s.wg.Add(1) - if final { - s.eofWritten = true - } - go func(src []byte) { - if debugEncoder { - println("Adding block,", len(src), "bytes, final:", final) - } - defer func() { - if r := recover(); r != nil { - s.err = fmt.Errorf("panic while encoding: %v", r) - rdebug.PrintStack() - } - s.wg.Done() - }() - enc := s.encoder - blk := enc.Block() - enc.Encode(blk, src) - blk.last = final - // Wait for pending writes. - s.wWg.Wait() - if s.writeErr != nil { - s.err = s.writeErr - return - } - // Transfer encoders from previous write block. - blk.swapEncoders(s.writing) - // Transfer recent offsets to next. - enc.UseBlock(s.writing) - s.writing = blk - s.wWg.Add(1) - go func() { - defer func() { - if r := recover(); r != nil { - s.writeErr = fmt.Errorf("panic while encoding/writing: %v", r) - rdebug.PrintStack() - } - s.wWg.Done() - }() - s.writeErr = blk.encode(src, e.o.noEntropy, !e.o.allLitEntropy) - if s.writeErr != nil { - return - } - _, s.writeErr = s.w.Write(blk.output) - s.nWritten += int64(len(blk.output)) - }() - }(s.current) - return nil -} - -// ReadFrom reads data from r until EOF or error. -// The return value n is the number of bytes read. -// Any error except io.EOF encountered during the read is also returned. -// -// The Copy function uses ReaderFrom if available. -func (e *Encoder) ReadFrom(r io.Reader) (n int64, err error) { - if debugEncoder { - println("Using ReadFrom") - } - - // Flush any current writes. - if len(e.state.filling) > 0 { - if err := e.nextBlock(false); err != nil { - return 0, err - } - } - e.state.filling = e.state.filling[:e.o.blockSize] - src := e.state.filling - for { - n2, err := r.Read(src) - if e.o.crc { - _, _ = e.state.encoder.CRC().Write(src[:n2]) - } - // src is now the unfilled part... - src = src[n2:] - n += int64(n2) - switch err { - case io.EOF: - e.state.filling = e.state.filling[:len(e.state.filling)-len(src)] - if debugEncoder { - println("ReadFrom: got EOF final block:", len(e.state.filling)) - } - return n, nil - case nil: - default: - if debugEncoder { - println("ReadFrom: got error:", err) - } - e.state.err = err - return n, err - } - if len(src) > 0 { - if debugEncoder { - println("ReadFrom: got space left in source:", len(src)) - } - continue - } - err = e.nextBlock(false) - if err != nil { - return n, err - } - e.state.filling = e.state.filling[:e.o.blockSize] - src = e.state.filling - } -} - -// Flush will send the currently written data to output -// and block until everything has been written. -// This should only be used on rare occasions where pushing the currently queued data is critical. -func (e *Encoder) Flush() error { - s := &e.state - if len(s.filling) > 0 { - err := e.nextBlock(false) - if err != nil { - // Ignore Flush after Close. - if errors.Is(s.err, ErrEncoderClosed) { - return nil - } - return err - } - } - s.wg.Wait() - s.wWg.Wait() - if s.err != nil { - // Ignore Flush after Close. - if errors.Is(s.err, ErrEncoderClosed) { - return nil - } - return s.err - } - return s.writeErr -} - -// Close will flush the final output and close the stream. -// The function will block until everything has been written. -// The Encoder can still be re-used after calling this. -func (e *Encoder) Close() error { - s := &e.state - if s.encoder == nil { - return nil - } - err := e.nextBlock(true) - if err != nil { - if errors.Is(s.err, ErrEncoderClosed) { - return nil - } - return err - } - if s.frameContentSize > 0 { - if s.nInput != s.frameContentSize { - return fmt.Errorf("frame content size %d given, but %d bytes was written", s.frameContentSize, s.nInput) - } - } - if e.state.fullFrameWritten { - return s.err - } - s.wg.Wait() - s.wWg.Wait() - - if s.err != nil { - return s.err - } - if s.writeErr != nil { - return s.writeErr - } - - // Write CRC - if e.o.crc && s.err == nil { - // heap alloc. - var tmp [4]byte - _, s.err = s.w.Write(s.encoder.AppendCRC(tmp[:0])) - s.nWritten += 4 - } - - // Add padding with content from crypto/rand.Reader - if s.err == nil && e.o.pad > 0 { - add := calcSkippableFrame(s.nWritten, int64(e.o.pad)) - frame, err := skippableFrame(s.filling[:0], add, rand.Reader) - if err != nil { - return err - } - _, s.err = s.w.Write(frame) - } - if s.err == nil { - s.err = ErrEncoderClosed - return nil - } - - return s.err -} - -// EncodeAll will encode all input in src and append it to dst. -// This function can be called concurrently, but each call will only run on a single goroutine. -// If empty input is given, nothing is returned, unless WithZeroFrames is specified. -// Encoded blocks can be concatenated and the result will be the combined input stream. -// Data compressed with EncodeAll can be decoded with the Decoder, -// using either a stream or DecodeAll. -func (e *Encoder) EncodeAll(src, dst []byte) []byte { - e.init.Do(e.initialize) - enc := <-e.encoders - defer func() { - e.encoders <- enc - }() - return e.encodeAll(enc, src, dst) -} - -func (e *Encoder) encodeAll(enc encoder, src, dst []byte) []byte { - if len(src) == 0 { - if e.o.fullZero { - // Add frame header. - fh := frameHeader{ - ContentSize: 0, - WindowSize: MinWindowSize, - SingleSegment: true, - // Adding a checksum would be a waste of space. - Checksum: false, - DictID: 0, - } - dst = fh.appendTo(dst) - - // Write raw block as last one only. - var blk blockHeader - blk.setSize(0) - blk.setType(blockTypeRaw) - blk.setLast(true) - dst = blk.appendTo(dst) - } - return dst - } - - // Use single segments when above minimum window and below window size. - single := len(src) <= e.o.windowSize && len(src) > MinWindowSize - if e.o.single != nil { - single = *e.o.single - } - fh := frameHeader{ - ContentSize: uint64(len(src)), - WindowSize: uint32(enc.WindowSize(int64(len(src)))), - SingleSegment: single, - Checksum: e.o.crc, - DictID: e.o.dict.ID(), - } - - // If less than 1MB, allocate a buffer up front. - if len(dst) == 0 && cap(dst) == 0 && len(src) < 1<<20 && !e.o.lowMem { - dst = make([]byte, 0, len(src)) - } - dst = fh.appendTo(dst) - - // If we can do everything in one block, prefer that. - if len(src) <= e.o.blockSize { - enc.Reset(e.o.dict, true) - // Slightly faster with no history and everything in one block. - if e.o.crc { - _, _ = enc.CRC().Write(src) - } - blk := enc.Block() - blk.last = true - if e.o.dict == nil { - enc.EncodeNoHist(blk, src) - } else { - enc.Encode(blk, src) - } - - // If we got the exact same number of literals as input, - // assume the literals cannot be compressed. - oldout := blk.output - // Output directly to dst - blk.output = dst - - err := blk.encode(src, e.o.noEntropy, !e.o.allLitEntropy) - if err != nil { - panic(err) - } - dst = blk.output - blk.output = oldout - } else { - enc.Reset(e.o.dict, false) - blk := enc.Block() - for len(src) > 0 { - todo := src - if len(todo) > e.o.blockSize { - todo = todo[:e.o.blockSize] - } - src = src[len(todo):] - if e.o.crc { - _, _ = enc.CRC().Write(todo) - } - blk.pushOffsets() - enc.Encode(blk, todo) - if len(src) == 0 { - blk.last = true - } - err := blk.encode(todo, e.o.noEntropy, !e.o.allLitEntropy) - if err != nil { - panic(err) - } - dst = append(dst, blk.output...) - blk.reset(nil) - } - } - if e.o.crc { - dst = enc.AppendCRC(dst) - } - // Add padding with content from crypto/rand.Reader - if e.o.pad > 0 { - add := calcSkippableFrame(int64(len(dst)), int64(e.o.pad)) - var err error - dst, err = skippableFrame(dst, add, rand.Reader) - if err != nil { - panic(err) - } - } - return dst -} - -// MaxEncodedSize returns the expected maximum -// size of an encoded block or stream. -func (e *Encoder) MaxEncodedSize(size int) int { - frameHeader := 4 + 2 // magic + frame header & window descriptor - if e.o.dict != nil { - frameHeader += 4 - } - // Frame content size: - if size < 256 { - frameHeader++ - } else if size < 65536+256 { - frameHeader += 2 - } else if size < math.MaxInt32 { - frameHeader += 4 - } else { - frameHeader += 8 - } - // Final crc - if e.o.crc { - frameHeader += 4 - } - - // Max overhead is 3 bytes/block. - // There cannot be 0 blocks. - blocks := (size + e.o.blockSize) / e.o.blockSize - - // Combine, add padding. - maxSz := frameHeader + 3*blocks + size - if e.o.pad > 1 { - maxSz += calcSkippableFrame(int64(maxSz), int64(e.o.pad)) - } - return maxSz -} diff --git a/vendor/github.com/klauspost/compress/zstd/encoder_options.go b/vendor/github.com/klauspost/compress/zstd/encoder_options.go deleted file mode 100644 index 20671dcb91..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/encoder_options.go +++ /dev/null @@ -1,339 +0,0 @@ -package zstd - -import ( - "errors" - "fmt" - "math" - "math/bits" - "runtime" - "strings" -) - -// EOption is an option for creating a encoder. -type EOption func(*encoderOptions) error - -// options retains accumulated state of multiple options. -type encoderOptions struct { - concurrent int - level EncoderLevel - single *bool - pad int - blockSize int - windowSize int - crc bool - fullZero bool - noEntropy bool - allLitEntropy bool - customWindow bool - customALEntropy bool - customBlockSize bool - lowMem bool - dict *dict -} - -func (o *encoderOptions) setDefault() { - *o = encoderOptions{ - concurrent: runtime.GOMAXPROCS(0), - crc: true, - single: nil, - blockSize: maxCompressedBlockSize, - windowSize: 8 << 20, - level: SpeedDefault, - allLitEntropy: false, - lowMem: false, - } -} - -// encoder returns an encoder with the selected options. -func (o encoderOptions) encoder() encoder { - switch o.level { - case SpeedFastest: - if o.dict != nil { - return &fastEncoderDict{fastEncoder: fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}}} - } - return &fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}} - - case SpeedDefault: - if o.dict != nil { - return &doubleFastEncoderDict{fastEncoderDict: fastEncoderDict{fastEncoder: fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}}}} - } - return &doubleFastEncoder{fastEncoder: fastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}}} - case SpeedBetterCompression: - if o.dict != nil { - return &betterFastEncoderDict{betterFastEncoder: betterFastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}}} - } - return &betterFastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}} - case SpeedBestCompression: - return &bestFastEncoder{fastBase: fastBase{maxMatchOff: int32(o.windowSize), bufferReset: math.MaxInt32 - int32(o.windowSize*2), lowMem: o.lowMem}} - } - panic("unknown compression level") -} - -// WithEncoderCRC will add CRC value to output. -// Output will be 4 bytes larger. -func WithEncoderCRC(b bool) EOption { - return func(o *encoderOptions) error { o.crc = b; return nil } -} - -// WithEncoderConcurrency will set the concurrency, -// meaning the maximum number of encoders to run concurrently. -// The value supplied must be at least 1. -// For streams, setting a value of 1 will disable async compression. -// By default this will be set to GOMAXPROCS. -func WithEncoderConcurrency(n int) EOption { - return func(o *encoderOptions) error { - if n <= 0 { - return fmt.Errorf("concurrency must be at least 1") - } - o.concurrent = n - return nil - } -} - -// WithWindowSize will set the maximum allowed back-reference distance. -// The value must be a power of two between MinWindowSize and MaxWindowSize. -// A larger value will enable better compression but allocate more memory and, -// for above-default values, take considerably longer. -// The default value is determined by the compression level and max 8MB. -func WithWindowSize(n int) EOption { - return func(o *encoderOptions) error { - switch { - case n < MinWindowSize: - return fmt.Errorf("window size must be at least %d", MinWindowSize) - case n > MaxWindowSize: - return fmt.Errorf("window size must be at most %d", MaxWindowSize) - case (n & (n - 1)) != 0: - return errors.New("window size must be a power of 2") - } - - o.windowSize = n - o.customWindow = true - if o.blockSize > o.windowSize { - o.blockSize = o.windowSize - o.customBlockSize = true - } - return nil - } -} - -// WithEncoderPadding will add padding to all output so the size will be a multiple of n. -// This can be used to obfuscate the exact output size or make blocks of a certain size. -// The contents will be a skippable frame, so it will be invisible by the decoder. -// n must be > 0 and <= 1GB, 1<<30 bytes. -// The padded area will be filled with data from crypto/rand.Reader. -// If `EncodeAll` is used with data already in the destination, the total size will be multiple of this. -func WithEncoderPadding(n int) EOption { - return func(o *encoderOptions) error { - if n <= 0 { - return fmt.Errorf("padding must be at least 1") - } - // No need to waste our time. - if n == 1 { - n = 0 - } - if n > 1<<30 { - return fmt.Errorf("padding must less than 1GB (1<<30 bytes) ") - } - o.pad = n - return nil - } -} - -// EncoderLevel predefines encoder compression levels. -// Only use the constants made available, since the actual mapping -// of these values are very likely to change and your compression could change -// unpredictably when upgrading the library. -type EncoderLevel int - -const ( - speedNotSet EncoderLevel = iota - - // SpeedFastest will choose the fastest reasonable compression. - // This is roughly equivalent to the fastest Zstandard mode. - SpeedFastest - - // SpeedDefault is the default "pretty fast" compression option. - // This is roughly equivalent to the default Zstandard mode (level 3). - SpeedDefault - - // SpeedBetterCompression will yield better compression than the default. - // Currently it is about zstd level 7-8 with ~ 2x-3x the default CPU usage. - // By using this, notice that CPU usage may go up in the future. - SpeedBetterCompression - - // SpeedBestCompression will choose the best available compression option. - // This will offer the best compression no matter the CPU cost. - SpeedBestCompression - - // speedLast should be kept as the last actual compression option. - // The is not for external usage, but is used to keep track of the valid options. - speedLast -) - -// EncoderLevelFromString will convert a string representation of an encoding level back -// to a compression level. The compare is not case sensitive. -// If the string wasn't recognized, (false, SpeedDefault) will be returned. -func EncoderLevelFromString(s string) (bool, EncoderLevel) { - for l := speedNotSet + 1; l < speedLast; l++ { - if strings.EqualFold(s, l.String()) { - return true, l - } - } - return false, SpeedDefault -} - -// EncoderLevelFromZstd will return an encoder level that closest matches the compression -// ratio of a specific zstd compression level. -// Many input values will provide the same compression level. -func EncoderLevelFromZstd(level int) EncoderLevel { - switch { - case level < 3: - return SpeedFastest - case level >= 3 && level < 6: - return SpeedDefault - case level >= 6 && level < 10: - return SpeedBetterCompression - default: - return SpeedBestCompression - } -} - -// String provides a string representation of the compression level. -func (e EncoderLevel) String() string { - switch e { - case SpeedFastest: - return "fastest" - case SpeedDefault: - return "default" - case SpeedBetterCompression: - return "better" - case SpeedBestCompression: - return "best" - default: - return "invalid" - } -} - -// WithEncoderLevel specifies a predefined compression level. -func WithEncoderLevel(l EncoderLevel) EOption { - return func(o *encoderOptions) error { - switch { - case l <= speedNotSet || l >= speedLast: - return fmt.Errorf("unknown encoder level") - } - o.level = l - if !o.customWindow { - switch o.level { - case SpeedFastest: - o.windowSize = 4 << 20 - if !o.customBlockSize { - o.blockSize = 1 << 16 - } - case SpeedDefault: - o.windowSize = 8 << 20 - case SpeedBetterCompression: - o.windowSize = 8 << 20 - case SpeedBestCompression: - o.windowSize = 8 << 20 - } - } - if !o.customALEntropy { - o.allLitEntropy = l > SpeedDefault - } - - return nil - } -} - -// WithZeroFrames will encode 0 length input as full frames. -// This can be needed for compatibility with zstandard usage, -// but is not needed for this package. -func WithZeroFrames(b bool) EOption { - return func(o *encoderOptions) error { - o.fullZero = b - return nil - } -} - -// WithAllLitEntropyCompression will apply entropy compression if no matches are found. -// Disabling this will skip incompressible data faster, but in cases with no matches but -// skewed character distribution compression is lost. -// Default value depends on the compression level selected. -func WithAllLitEntropyCompression(b bool) EOption { - return func(o *encoderOptions) error { - o.customALEntropy = true - o.allLitEntropy = b - return nil - } -} - -// WithNoEntropyCompression will always skip entropy compression of literals. -// This can be useful if content has matches, but unlikely to benefit from entropy -// compression. Usually the slight speed improvement is not worth enabling this. -func WithNoEntropyCompression(b bool) EOption { - return func(o *encoderOptions) error { - o.noEntropy = b - return nil - } -} - -// WithSingleSegment will set the "single segment" flag when EncodeAll is used. -// If this flag is set, data must be regenerated within a single continuous memory segment. -// In this case, Window_Descriptor byte is skipped, but Frame_Content_Size is necessarily present. -// As a consequence, the decoder must allocate a memory segment of size equal or larger than size of your content. -// In order to preserve the decoder from unreasonable memory requirements, -// a decoder is allowed to reject a compressed frame which requests a memory size beyond decoder's authorized range. -// For broader compatibility, decoders are recommended to support memory sizes of at least 8 MB. -// This is only a recommendation, each decoder is free to support higher or lower limits, depending on local limitations. -// If this is not specified, block encodes will automatically choose this based on the input size and the window size. -// This setting has no effect on streamed encodes. -func WithSingleSegment(b bool) EOption { - return func(o *encoderOptions) error { - o.single = &b - return nil - } -} - -// WithLowerEncoderMem will trade in some memory cases trade less memory usage for -// slower encoding speed. -// This will not change the window size which is the primary function for reducing -// memory usage. See WithWindowSize. -func WithLowerEncoderMem(b bool) EOption { - return func(o *encoderOptions) error { - o.lowMem = b - return nil - } -} - -// WithEncoderDict allows to register a dictionary that will be used for the encode. -// -// The slice dict must be in the [dictionary format] produced by -// "zstd --train" from the Zstandard reference implementation. -// -// The encoder *may* choose to use no dictionary instead for certain payloads. -// -// [dictionary format]: https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#dictionary-format -func WithEncoderDict(dict []byte) EOption { - return func(o *encoderOptions) error { - d, err := loadDict(dict) - if err != nil { - return err - } - o.dict = d - return nil - } -} - -// WithEncoderDictRaw registers a dictionary that may be used by the encoder. -// -// The slice content may contain arbitrary data. It will be used as an initial -// history. -func WithEncoderDictRaw(id uint32, content []byte) EOption { - return func(o *encoderOptions) error { - if bits.UintSize > 32 && uint(len(content)) > dictMaxLength { - return fmt.Errorf("dictionary of size %d > 2GiB too large", len(content)) - } - o.dict = &dict{id: id, content: content, offsets: [3]int{1, 4, 8}} - return nil - } -} diff --git a/vendor/github.com/klauspost/compress/zstd/framedec.go b/vendor/github.com/klauspost/compress/zstd/framedec.go deleted file mode 100644 index e47af66e7c..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/framedec.go +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "encoding/binary" - "encoding/hex" - "errors" - "io" - - "github.com/klauspost/compress/zstd/internal/xxhash" -) - -type frameDec struct { - o decoderOptions - crc *xxhash.Digest - - WindowSize uint64 - - // Frame history passed between blocks - history history - - rawInput byteBuffer - - // Byte buffer that can be reused for small input blocks. - bBuf byteBuf - - FrameContentSize uint64 - - DictionaryID uint32 - HasCheckSum bool - SingleSegment bool -} - -const ( - // MinWindowSize is the minimum Window Size, which is 1 KB. - MinWindowSize = 1 << 10 - - // MaxWindowSize is the maximum encoder window size - // and the default decoder maximum window size. - MaxWindowSize = 1 << 29 -) - -const ( - frameMagic = "\x28\xb5\x2f\xfd" - skippableFrameMagic = "\x2a\x4d\x18" -) - -func newFrameDec(o decoderOptions) *frameDec { - if o.maxWindowSize > o.maxDecodedSize { - o.maxWindowSize = o.maxDecodedSize - } - d := frameDec{ - o: o, - } - return &d -} - -// reset will read the frame header and prepare for block decoding. -// If nothing can be read from the input, io.EOF will be returned. -// Any other error indicated that the stream contained data, but -// there was a problem. -func (d *frameDec) reset(br byteBuffer) error { - d.HasCheckSum = false - d.WindowSize = 0 - var signature [4]byte - for { - var err error - // Check if we can read more... - b, err := br.readSmall(1) - switch err { - case io.EOF, io.ErrUnexpectedEOF: - return io.EOF - case nil: - signature[0] = b[0] - default: - return err - } - // Read the rest, don't allow io.ErrUnexpectedEOF - b, err = br.readSmall(3) - switch err { - case io.EOF: - return io.EOF - case nil: - copy(signature[1:], b) - default: - return err - } - - if string(signature[1:4]) != skippableFrameMagic || signature[0]&0xf0 != 0x50 { - if debugDecoder { - println("Not skippable", hex.EncodeToString(signature[:]), hex.EncodeToString([]byte(skippableFrameMagic))) - } - // Break if not skippable frame. - break - } - // Read size to skip - b, err = br.readSmall(4) - if err != nil { - if debugDecoder { - println("Reading Frame Size", err) - } - return err - } - n := uint32(b[0]) | (uint32(b[1]) << 8) | (uint32(b[2]) << 16) | (uint32(b[3]) << 24) - println("Skipping frame with", n, "bytes.") - err = br.skipN(int64(n)) - if err != nil { - if debugDecoder { - println("Reading discarded frame", err) - } - return err - } - } - if string(signature[:]) != frameMagic { - if debugDecoder { - println("Got magic numbers: ", signature, "want:", []byte(frameMagic)) - } - return ErrMagicMismatch - } - - // Read Frame_Header_Descriptor - fhd, err := br.readByte() - if err != nil { - if debugDecoder { - println("Reading Frame_Header_Descriptor", err) - } - return err - } - d.SingleSegment = fhd&(1<<5) != 0 - - if fhd&(1<<3) != 0 { - return errors.New("reserved bit set on frame header") - } - - // Read Window_Descriptor - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#window_descriptor - d.WindowSize = 0 - if !d.SingleSegment { - wd, err := br.readByte() - if err != nil { - if debugDecoder { - println("Reading Window_Descriptor", err) - } - return err - } - if debugDecoder { - printf("raw: %x, mantissa: %d, exponent: %d\n", wd, wd&7, wd>>3) - } - windowLog := 10 + (wd >> 3) - windowBase := uint64(1) << windowLog - windowAdd := (windowBase / 8) * uint64(wd&0x7) - d.WindowSize = windowBase + windowAdd - } - - // Read Dictionary_ID - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#dictionary_id - d.DictionaryID = 0 - if size := fhd & 3; size != 0 { - if size == 3 { - size = 4 - } - - b, err := br.readSmall(int(size)) - if err != nil { - println("Reading Dictionary_ID", err) - return err - } - var id uint32 - switch len(b) { - case 1: - id = uint32(b[0]) - case 2: - id = uint32(b[0]) | (uint32(b[1]) << 8) - case 4: - id = uint32(b[0]) | (uint32(b[1]) << 8) | (uint32(b[2]) << 16) | (uint32(b[3]) << 24) - } - if debugDecoder { - println("Dict size", size, "ID:", id) - } - d.DictionaryID = id - } - - // Read Frame_Content_Size - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#frame_content_size - var fcsSize int - v := fhd >> 6 - switch v { - case 0: - if d.SingleSegment { - fcsSize = 1 - } - default: - fcsSize = 1 << v - } - d.FrameContentSize = fcsUnknown - if fcsSize > 0 { - b, err := br.readSmall(fcsSize) - if err != nil { - println("Reading Frame content", err) - return err - } - switch len(b) { - case 1: - d.FrameContentSize = uint64(b[0]) - case 2: - // When FCS_Field_Size is 2, the offset of 256 is added. - d.FrameContentSize = uint64(b[0]) | (uint64(b[1]) << 8) + 256 - case 4: - d.FrameContentSize = uint64(b[0]) | (uint64(b[1]) << 8) | (uint64(b[2]) << 16) | (uint64(b[3]) << 24) - case 8: - d1 := uint32(b[0]) | (uint32(b[1]) << 8) | (uint32(b[2]) << 16) | (uint32(b[3]) << 24) - d2 := uint32(b[4]) | (uint32(b[5]) << 8) | (uint32(b[6]) << 16) | (uint32(b[7]) << 24) - d.FrameContentSize = uint64(d1) | (uint64(d2) << 32) - } - if debugDecoder { - println("Read FCS:", d.FrameContentSize) - } - } - - // Move this to shared. - d.HasCheckSum = fhd&(1<<2) != 0 - if d.HasCheckSum { - if d.crc == nil { - d.crc = xxhash.New() - } - d.crc.Reset() - } - - if d.WindowSize > d.o.maxWindowSize { - if debugDecoder { - printf("window size %d > max %d\n", d.WindowSize, d.o.maxWindowSize) - } - return ErrWindowSizeExceeded - } - - if d.WindowSize == 0 && d.SingleSegment { - // We may not need window in this case. - d.WindowSize = d.FrameContentSize - if d.WindowSize < MinWindowSize { - d.WindowSize = MinWindowSize - } - if d.WindowSize > d.o.maxDecodedSize { - if debugDecoder { - printf("window size %d > max %d\n", d.WindowSize, d.o.maxWindowSize) - } - return ErrDecoderSizeExceeded - } - } - - // The minimum Window_Size is 1 KB. - if d.WindowSize < MinWindowSize { - if debugDecoder { - println("got window size: ", d.WindowSize) - } - return ErrWindowSizeTooSmall - } - d.history.windowSize = int(d.WindowSize) - if !d.o.lowMem || d.history.windowSize < maxBlockSize { - // Alloc 2x window size if not low-mem, or window size below 2MB. - d.history.allocFrameBuffer = d.history.windowSize * 2 - } else { - if d.o.lowMem { - // Alloc with 1MB extra. - d.history.allocFrameBuffer = d.history.windowSize + maxBlockSize/2 - } else { - // Alloc with 2MB extra. - d.history.allocFrameBuffer = d.history.windowSize + maxBlockSize - } - } - - if debugDecoder { - println("Frame: Dict:", d.DictionaryID, "FrameContentSize:", d.FrameContentSize, "singleseg:", d.SingleSegment, "window:", d.WindowSize, "crc:", d.HasCheckSum) - } - - // history contains input - maybe we do something - d.rawInput = br - return nil -} - -// next will start decoding the next block from stream. -func (d *frameDec) next(block *blockDec) error { - if debugDecoder { - println("decoding new block") - } - err := block.reset(d.rawInput, d.WindowSize) - if err != nil { - println("block error:", err) - // Signal the frame decoder we have a problem. - block.sendErr(err) - return err - } - return nil -} - -// checkCRC will check the checksum, assuming the frame has one. -// Will return ErrCRCMismatch if crc check failed, otherwise nil. -func (d *frameDec) checkCRC() error { - // We can overwrite upper tmp now - buf, err := d.rawInput.readSmall(4) - if err != nil { - println("CRC missing?", err) - return err - } - - want := binary.LittleEndian.Uint32(buf[:4]) - got := uint32(d.crc.Sum64()) - - if got != want { - if debugDecoder { - printf("CRC check failed: got %08x, want %08x\n", got, want) - } - return ErrCRCMismatch - } - if debugDecoder { - printf("CRC ok %08x\n", got) - } - return nil -} - -// consumeCRC skips over the checksum, assuming the frame has one. -func (d *frameDec) consumeCRC() error { - _, err := d.rawInput.readSmall(4) - if err != nil { - println("CRC missing?", err) - } - return err -} - -// runDecoder will run the decoder for the remainder of the frame. -func (d *frameDec) runDecoder(dst []byte, dec *blockDec) ([]byte, error) { - saved := d.history.b - - // We use the history for output to avoid copying it. - d.history.b = dst - d.history.ignoreBuffer = len(dst) - // Store input length, so we only check new data. - crcStart := len(dst) - d.history.decoders.maxSyncLen = 0 - if d.o.limitToCap { - d.history.decoders.maxSyncLen = uint64(cap(dst) - len(dst)) - } - if d.FrameContentSize != fcsUnknown { - if !d.o.limitToCap || d.FrameContentSize+uint64(len(dst)) < d.history.decoders.maxSyncLen { - d.history.decoders.maxSyncLen = d.FrameContentSize + uint64(len(dst)) - } - if d.history.decoders.maxSyncLen > d.o.maxDecodedSize { - if debugDecoder { - println("maxSyncLen:", d.history.decoders.maxSyncLen, "> maxDecodedSize:", d.o.maxDecodedSize) - } - return dst, ErrDecoderSizeExceeded - } - if debugDecoder { - println("maxSyncLen:", d.history.decoders.maxSyncLen) - } - if !d.o.limitToCap && uint64(cap(dst)) < d.history.decoders.maxSyncLen { - // Alloc for output - dst2 := make([]byte, len(dst), d.history.decoders.maxSyncLen+compressedBlockOverAlloc) - copy(dst2, dst) - dst = dst2 - } - } - var err error - for { - err = dec.reset(d.rawInput, d.WindowSize) - if err != nil { - break - } - if debugDecoder { - println("next block:", dec) - } - err = dec.decodeBuf(&d.history) - if err != nil { - break - } - if uint64(len(d.history.b)-crcStart) > d.o.maxDecodedSize { - println("runDecoder: maxDecodedSize exceeded", uint64(len(d.history.b)-crcStart), ">", d.o.maxDecodedSize) - err = ErrDecoderSizeExceeded - break - } - if d.o.limitToCap && len(d.history.b) > cap(dst) { - println("runDecoder: cap exceeded", uint64(len(d.history.b)), ">", cap(dst)) - err = ErrDecoderSizeExceeded - break - } - if uint64(len(d.history.b)-crcStart) > d.FrameContentSize { - println("runDecoder: FrameContentSize exceeded", uint64(len(d.history.b)-crcStart), ">", d.FrameContentSize) - err = ErrFrameSizeExceeded - break - } - if dec.Last { - break - } - if debugDecoder { - println("runDecoder: FrameContentSize", uint64(len(d.history.b)-crcStart), "<=", d.FrameContentSize) - } - } - dst = d.history.b - if err == nil { - if d.FrameContentSize != fcsUnknown && uint64(len(d.history.b)-crcStart) != d.FrameContentSize { - err = ErrFrameSizeMismatch - } else if d.HasCheckSum { - if d.o.ignoreChecksum { - err = d.consumeCRC() - } else { - d.crc.Write(dst[crcStart:]) - err = d.checkCRC() - } - } - } - d.history.b = saved - return dst, err -} diff --git a/vendor/github.com/klauspost/compress/zstd/frameenc.go b/vendor/github.com/klauspost/compress/zstd/frameenc.go deleted file mode 100644 index 667ca06794..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/frameenc.go +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "encoding/binary" - "fmt" - "io" - "math" - "math/bits" -) - -type frameHeader struct { - ContentSize uint64 - WindowSize uint32 - SingleSegment bool - Checksum bool - DictID uint32 -} - -const maxHeaderSize = 14 - -func (f frameHeader) appendTo(dst []byte) []byte { - dst = append(dst, frameMagic...) - var fhd uint8 - if f.Checksum { - fhd |= 1 << 2 - } - if f.SingleSegment { - fhd |= 1 << 5 - } - - var dictIDContent []byte - if f.DictID > 0 { - var tmp [4]byte - if f.DictID < 256 { - fhd |= 1 - tmp[0] = uint8(f.DictID) - dictIDContent = tmp[:1] - } else if f.DictID < 1<<16 { - fhd |= 2 - binary.LittleEndian.PutUint16(tmp[:2], uint16(f.DictID)) - dictIDContent = tmp[:2] - } else { - fhd |= 3 - binary.LittleEndian.PutUint32(tmp[:4], f.DictID) - dictIDContent = tmp[:4] - } - } - var fcs uint8 - if f.ContentSize >= 256 { - fcs++ - } - if f.ContentSize >= 65536+256 { - fcs++ - } - if f.ContentSize >= 0xffffffff { - fcs++ - } - - fhd |= fcs << 6 - - dst = append(dst, fhd) - if !f.SingleSegment { - const winLogMin = 10 - windowLog := (bits.Len32(f.WindowSize-1) - winLogMin) << 3 - dst = append(dst, uint8(windowLog)) - } - if f.DictID > 0 { - dst = append(dst, dictIDContent...) - } - switch fcs { - case 0: - if f.SingleSegment { - dst = append(dst, uint8(f.ContentSize)) - } - // Unless SingleSegment is set, framessizes < 256 are not stored. - case 1: - f.ContentSize -= 256 - dst = append(dst, uint8(f.ContentSize), uint8(f.ContentSize>>8)) - case 2: - dst = append(dst, uint8(f.ContentSize), uint8(f.ContentSize>>8), uint8(f.ContentSize>>16), uint8(f.ContentSize>>24)) - case 3: - dst = append(dst, uint8(f.ContentSize), uint8(f.ContentSize>>8), uint8(f.ContentSize>>16), uint8(f.ContentSize>>24), - uint8(f.ContentSize>>32), uint8(f.ContentSize>>40), uint8(f.ContentSize>>48), uint8(f.ContentSize>>56)) - default: - panic("invalid fcs") - } - return dst -} - -const skippableFrameHeader = 4 + 4 - -// calcSkippableFrame will return a total size to be added for written -// to be divisible by multiple. -// The value will always be > skippableFrameHeader. -// The function will panic if written < 0 or wantMultiple <= 0. -func calcSkippableFrame(written, wantMultiple int64) int { - if wantMultiple <= 0 { - panic("wantMultiple <= 0") - } - if written < 0 { - panic("written < 0") - } - leftOver := written % wantMultiple - if leftOver == 0 { - return 0 - } - toAdd := wantMultiple - leftOver - for toAdd < skippableFrameHeader { - toAdd += wantMultiple - } - return int(toAdd) -} - -// skippableFrame will add a skippable frame with a total size of bytes. -// total should be >= skippableFrameHeader and < math.MaxUint32. -func skippableFrame(dst []byte, total int, r io.Reader) ([]byte, error) { - if total == 0 { - return dst, nil - } - if total < skippableFrameHeader { - return dst, fmt.Errorf("requested skippable frame (%d) < 8", total) - } - if int64(total) > math.MaxUint32 { - return dst, fmt.Errorf("requested skippable frame (%d) > max uint32", total) - } - dst = append(dst, 0x50, 0x2a, 0x4d, 0x18) - f := uint32(total - skippableFrameHeader) - dst = append(dst, uint8(f), uint8(f>>8), uint8(f>>16), uint8(f>>24)) - start := len(dst) - dst = append(dst, make([]byte, f)...) - _, err := io.ReadFull(r, dst[start:]) - return dst, err -} diff --git a/vendor/github.com/klauspost/compress/zstd/fse_decoder.go b/vendor/github.com/klauspost/compress/zstd/fse_decoder.go deleted file mode 100644 index 2f8860a722..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/fse_decoder.go +++ /dev/null @@ -1,307 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "encoding/binary" - "errors" - "fmt" - "io" -) - -const ( - tablelogAbsoluteMax = 9 -) - -const ( - /*!MEMORY_USAGE : - * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.) - * Increasing memory usage improves compression ratio - * Reduced memory usage can improve speed, due to cache effect - * Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */ - maxMemoryUsage = tablelogAbsoluteMax + 2 - - maxTableLog = maxMemoryUsage - 2 - maxTablesize = 1 << maxTableLog - maxTableMask = (1 << maxTableLog) - 1 - minTablelog = 5 - maxSymbolValue = 255 -) - -// fseDecoder provides temporary storage for compression and decompression. -type fseDecoder struct { - dt [maxTablesize]decSymbol // Decompression table. - symbolLen uint16 // Length of active part of the symbol table. - actualTableLog uint8 // Selected tablelog. - maxBits uint8 // Maximum number of additional bits - - // used for table creation to avoid allocations. - stateTable [256]uint16 - norm [maxSymbolValue + 1]int16 - preDefined bool -} - -// tableStep returns the next table index. -func tableStep(tableSize uint32) uint32 { - return (tableSize >> 1) + (tableSize >> 3) + 3 -} - -// readNCount will read the symbol distribution so decoding tables can be constructed. -func (s *fseDecoder) readNCount(b *byteReader, maxSymbol uint16) error { - var ( - charnum uint16 - previous0 bool - ) - if b.remain() < 4 { - return errors.New("input too small") - } - bitStream := b.Uint32NC() - nbBits := uint((bitStream & 0xF) + minTablelog) // extract tableLog - if nbBits > tablelogAbsoluteMax { - println("Invalid tablelog:", nbBits) - return errors.New("tableLog too large") - } - bitStream >>= 4 - bitCount := uint(4) - - s.actualTableLog = uint8(nbBits) - remaining := int32((1 << nbBits) + 1) - threshold := int32(1 << nbBits) - gotTotal := int32(0) - nbBits++ - - for remaining > 1 && charnum <= maxSymbol { - if previous0 { - //println("prev0") - n0 := charnum - for (bitStream & 0xFFFF) == 0xFFFF { - //println("24 x 0") - n0 += 24 - if r := b.remain(); r > 5 { - b.advance(2) - // The check above should make sure we can read 32 bits - bitStream = b.Uint32NC() >> bitCount - } else { - // end of bit stream - bitStream >>= 16 - bitCount += 16 - } - } - //printf("bitstream: %d, 0b%b", bitStream&3, bitStream) - for (bitStream & 3) == 3 { - n0 += 3 - bitStream >>= 2 - bitCount += 2 - } - n0 += uint16(bitStream & 3) - bitCount += 2 - - if n0 > maxSymbolValue { - return errors.New("maxSymbolValue too small") - } - //println("inserting ", n0-charnum, "zeroes from idx", charnum, "ending before", n0) - for charnum < n0 { - s.norm[uint8(charnum)] = 0 - charnum++ - } - - if r := b.remain(); r >= 7 || r-int(bitCount>>3) >= 4 { - b.advance(bitCount >> 3) - bitCount &= 7 - // The check above should make sure we can read 32 bits - bitStream = b.Uint32NC() >> bitCount - } else { - bitStream >>= 2 - } - } - - max := (2*threshold - 1) - remaining - var count int32 - - if int32(bitStream)&(threshold-1) < max { - count = int32(bitStream) & (threshold - 1) - if debugAsserts && nbBits < 1 { - panic("nbBits underflow") - } - bitCount += nbBits - 1 - } else { - count = int32(bitStream) & (2*threshold - 1) - if count >= threshold { - count -= max - } - bitCount += nbBits - } - - // extra accuracy - count-- - if count < 0 { - // -1 means +1 - remaining += count - gotTotal -= count - } else { - remaining -= count - gotTotal += count - } - s.norm[charnum&0xff] = int16(count) - charnum++ - previous0 = count == 0 - for remaining < threshold { - nbBits-- - threshold >>= 1 - } - - if r := b.remain(); r >= 7 || r-int(bitCount>>3) >= 4 { - b.advance(bitCount >> 3) - bitCount &= 7 - // The check above should make sure we can read 32 bits - bitStream = b.Uint32NC() >> (bitCount & 31) - } else { - bitCount -= (uint)(8 * (len(b.b) - 4 - b.off)) - b.off = len(b.b) - 4 - bitStream = b.Uint32() >> (bitCount & 31) - } - } - s.symbolLen = charnum - if s.symbolLen <= 1 { - return fmt.Errorf("symbolLen (%d) too small", s.symbolLen) - } - if s.symbolLen > maxSymbolValue+1 { - return fmt.Errorf("symbolLen (%d) too big", s.symbolLen) - } - if remaining != 1 { - return fmt.Errorf("corruption detected (remaining %d != 1)", remaining) - } - if bitCount > 32 { - return fmt.Errorf("corruption detected (bitCount %d > 32)", bitCount) - } - if gotTotal != 1<> 3) - return s.buildDtable() -} - -func (s *fseDecoder) mustReadFrom(r io.Reader) { - fatalErr := func(err error) { - if err != nil { - panic(err) - } - } - // dt [maxTablesize]decSymbol // Decompression table. - // symbolLen uint16 // Length of active part of the symbol table. - // actualTableLog uint8 // Selected tablelog. - // maxBits uint8 // Maximum number of additional bits - // // used for table creation to avoid allocations. - // stateTable [256]uint16 - // norm [maxSymbolValue + 1]int16 - // preDefined bool - fatalErr(binary.Read(r, binary.LittleEndian, &s.dt)) - fatalErr(binary.Read(r, binary.LittleEndian, &s.symbolLen)) - fatalErr(binary.Read(r, binary.LittleEndian, &s.actualTableLog)) - fatalErr(binary.Read(r, binary.LittleEndian, &s.maxBits)) - fatalErr(binary.Read(r, binary.LittleEndian, &s.stateTable)) - fatalErr(binary.Read(r, binary.LittleEndian, &s.norm)) - fatalErr(binary.Read(r, binary.LittleEndian, &s.preDefined)) -} - -// decSymbol contains information about a state entry, -// Including the state offset base, the output symbol and -// the number of bits to read for the low part of the destination state. -// Using a composite uint64 is faster than a struct with separate members. -type decSymbol uint64 - -func newDecSymbol(nbits, addBits uint8, newState uint16, baseline uint32) decSymbol { - return decSymbol(nbits) | (decSymbol(addBits) << 8) | (decSymbol(newState) << 16) | (decSymbol(baseline) << 32) -} - -func (d decSymbol) nbBits() uint8 { - return uint8(d) -} - -func (d decSymbol) addBits() uint8 { - return uint8(d >> 8) -} - -func (d decSymbol) newState() uint16 { - return uint16(d >> 16) -} - -func (d decSymbol) baselineInt() int { - return int(d >> 32) -} - -func (d *decSymbol) setNBits(nBits uint8) { - const mask = 0xffffffffffffff00 - *d = (*d & mask) | decSymbol(nBits) -} - -func (d *decSymbol) setAddBits(addBits uint8) { - const mask = 0xffffffffffff00ff - *d = (*d & mask) | (decSymbol(addBits) << 8) -} - -func (d *decSymbol) setNewState(state uint16) { - const mask = 0xffffffff0000ffff - *d = (*d & mask) | decSymbol(state)<<16 -} - -func (d *decSymbol) setExt(addBits uint8, baseline uint32) { - const mask = 0xffff00ff - *d = (*d & mask) | (decSymbol(addBits) << 8) | (decSymbol(baseline) << 32) -} - -// decSymbolValue returns the transformed decSymbol for the given symbol. -func decSymbolValue(symb uint8, t []baseOffset) (decSymbol, error) { - if int(symb) >= len(t) { - return 0, fmt.Errorf("rle symbol %d >= max %d", symb, len(t)) - } - lu := t[symb] - return newDecSymbol(0, lu.addBits, 0, lu.baseLine), nil -} - -// setRLE will set the decoder til RLE mode. -func (s *fseDecoder) setRLE(symbol decSymbol) { - s.actualTableLog = 0 - s.maxBits = symbol.addBits() - s.dt[0] = symbol -} - -// transform will transform the decoder table into a table usable for -// decoding without having to apply the transformation while decoding. -// The state will contain the base value and the number of bits to read. -func (s *fseDecoder) transform(t []baseOffset) error { - tableSize := uint16(1 << s.actualTableLog) - s.maxBits = 0 - for i, v := range s.dt[:tableSize] { - add := v.addBits() - if int(add) >= len(t) { - return fmt.Errorf("invalid decoding table entry %d, symbol %d >= max (%d)", i, v.addBits(), len(t)) - } - lu := t[add] - if lu.addBits > s.maxBits { - s.maxBits = lu.addBits - } - v.setExt(lu.addBits, lu.baseLine) - s.dt[i] = v - } - return nil -} - -type fseState struct { - dt []decSymbol - state decSymbol -} - -// Initialize and decodeAsync first state and symbol. -func (s *fseState) init(br *bitReader, tableLog uint8, dt []decSymbol) { - s.dt = dt - br.fill() - s.state = dt[br.getBits(tableLog)] -} - -// final returns the current state symbol without decoding the next. -func (s decSymbol) final() (int, uint8) { - return s.baselineInt(), s.addBits() -} diff --git a/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.go b/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.go deleted file mode 100644 index d04a829b0a..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.go +++ /dev/null @@ -1,65 +0,0 @@ -//go:build amd64 && !appengine && !noasm && gc -// +build amd64,!appengine,!noasm,gc - -package zstd - -import ( - "fmt" -) - -type buildDtableAsmContext struct { - // inputs - stateTable *uint16 - norm *int16 - dt *uint64 - - // outputs --- set by the procedure in the case of error; - // for interpretation please see the error handling part below - errParam1 uint64 - errParam2 uint64 -} - -// buildDtable_asm is an x86 assembly implementation of fseDecoder.buildDtable. -// Function returns non-zero exit code on error. -// -//go:noescape -func buildDtable_asm(s *fseDecoder, ctx *buildDtableAsmContext) int - -// please keep in sync with _generate/gen_fse.go -const ( - errorCorruptedNormalizedCounter = 1 - errorNewStateTooBig = 2 - errorNewStateNoBits = 3 -) - -// buildDtable will build the decoding table. -func (s *fseDecoder) buildDtable() error { - ctx := buildDtableAsmContext{ - stateTable: &s.stateTable[0], - norm: &s.norm[0], - dt: (*uint64)(&s.dt[0]), - } - code := buildDtable_asm(s, &ctx) - - if code != 0 { - switch code { - case errorCorruptedNormalizedCounter: - position := ctx.errParam1 - return fmt.Errorf("corrupted input (position=%d, expected 0)", position) - - case errorNewStateTooBig: - newState := decSymbol(ctx.errParam1) - size := ctx.errParam2 - return fmt.Errorf("newState (%d) outside table size (%d)", newState, size) - - case errorNewStateNoBits: - newState := decSymbol(ctx.errParam1) - oldState := decSymbol(ctx.errParam2) - return fmt.Errorf("newState (%d) == oldState (%d) and no bits", newState, oldState) - - default: - return fmt.Errorf("buildDtable_asm returned unhandled nonzero code = %d", code) - } - } - return nil -} diff --git a/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.s b/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.s deleted file mode 100644 index bcde398695..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.s +++ /dev/null @@ -1,126 +0,0 @@ -// Code generated by command: go run gen_fse.go -out ../fse_decoder_amd64.s -pkg=zstd. DO NOT EDIT. - -//go:build !appengine && !noasm && gc && !noasm - -// func buildDtable_asm(s *fseDecoder, ctx *buildDtableAsmContext) int -TEXT ·buildDtable_asm(SB), $0-24 - MOVQ ctx+8(FP), CX - MOVQ s+0(FP), DI - - // Load values - MOVBQZX 4098(DI), DX - XORQ AX, AX - BTSQ DX, AX - MOVQ (CX), BX - MOVQ 16(CX), SI - LEAQ -1(AX), R8 - MOVQ 8(CX), CX - MOVWQZX 4096(DI), DI - - // End load values - // Init, lay down lowprob symbols - XORQ R9, R9 - JMP init_main_loop_condition - -init_main_loop: - MOVWQSX (CX)(R9*2), R10 - CMPW R10, $-1 - JNE do_not_update_high_threshold - MOVB R9, 1(SI)(R8*8) - DECQ R8 - MOVQ $0x0000000000000001, R10 - -do_not_update_high_threshold: - MOVW R10, (BX)(R9*2) - INCQ R9 - -init_main_loop_condition: - CMPQ R9, DI - JL init_main_loop - - // Spread symbols - // Calculate table step - MOVQ AX, R9 - SHRQ $0x01, R9 - MOVQ AX, R10 - SHRQ $0x03, R10 - LEAQ 3(R9)(R10*1), R9 - - // Fill add bits values - LEAQ -1(AX), R10 - XORQ R11, R11 - XORQ R12, R12 - JMP spread_main_loop_condition - -spread_main_loop: - XORQ R13, R13 - MOVWQSX (CX)(R12*2), R14 - JMP spread_inner_loop_condition - -spread_inner_loop: - MOVB R12, 1(SI)(R11*8) - -adjust_position: - ADDQ R9, R11 - ANDQ R10, R11 - CMPQ R11, R8 - JG adjust_position - INCQ R13 - -spread_inner_loop_condition: - CMPQ R13, R14 - JL spread_inner_loop - INCQ R12 - -spread_main_loop_condition: - CMPQ R12, DI - JL spread_main_loop - TESTQ R11, R11 - JZ spread_check_ok - MOVQ ctx+8(FP), AX - MOVQ R11, 24(AX) - MOVQ $+1, ret+16(FP) - RET - -spread_check_ok: - // Build Decoding table - XORQ DI, DI - -build_table_main_table: - MOVBQZX 1(SI)(DI*8), CX - MOVWQZX (BX)(CX*2), R8 - LEAQ 1(R8), R9 - MOVW R9, (BX)(CX*2) - MOVQ R8, R9 - BSRQ R9, R9 - MOVQ DX, CX - SUBQ R9, CX - SHLQ CL, R8 - SUBQ AX, R8 - MOVB CL, (SI)(DI*8) - MOVW R8, 2(SI)(DI*8) - CMPQ R8, AX - JLE build_table_check1_ok - MOVQ ctx+8(FP), CX - MOVQ R8, 24(CX) - MOVQ AX, 32(CX) - MOVQ $+2, ret+16(FP) - RET - -build_table_check1_ok: - TESTB CL, CL - JNZ build_table_check2_ok - CMPW R8, DI - JNE build_table_check2_ok - MOVQ ctx+8(FP), AX - MOVQ R8, 24(AX) - MOVQ DI, 32(AX) - MOVQ $+3, ret+16(FP) - RET - -build_table_check2_ok: - INCQ DI - CMPQ DI, AX - JL build_table_main_table - MOVQ $+0, ret+16(FP) - RET diff --git a/vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go b/vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go deleted file mode 100644 index 8adfebb029..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go +++ /dev/null @@ -1,73 +0,0 @@ -//go:build !amd64 || appengine || !gc || noasm -// +build !amd64 appengine !gc noasm - -package zstd - -import ( - "errors" - "fmt" -) - -// buildDtable will build the decoding table. -func (s *fseDecoder) buildDtable() error { - tableSize := uint32(1 << s.actualTableLog) - highThreshold := tableSize - 1 - symbolNext := s.stateTable[:256] - - // Init, lay down lowprob symbols - { - for i, v := range s.norm[:s.symbolLen] { - if v == -1 { - s.dt[highThreshold].setAddBits(uint8(i)) - highThreshold-- - v = 1 - } - symbolNext[i] = uint16(v) - } - } - - // Spread symbols - { - tableMask := tableSize - 1 - step := tableStep(tableSize) - position := uint32(0) - for ss, v := range s.norm[:s.symbolLen] { - for i := 0; i < int(v); i++ { - s.dt[position].setAddBits(uint8(ss)) - for { - // lowprob area - position = (position + step) & tableMask - if position <= highThreshold { - break - } - } - } - } - if position != 0 { - // position must reach all cells once, otherwise normalizedCounter is incorrect - return errors.New("corrupted input (position != 0)") - } - } - - // Build Decoding table - { - tableSize := uint16(1 << s.actualTableLog) - for u, v := range s.dt[:tableSize] { - symbol := v.addBits() - nextState := symbolNext[symbol] - symbolNext[symbol] = nextState + 1 - nBits := s.actualTableLog - byte(highBits(uint32(nextState))) - s.dt[u&maxTableMask].setNBits(nBits) - newState := (nextState << nBits) - tableSize - if newState > tableSize { - return fmt.Errorf("newState (%d) outside table size (%d)", newState, tableSize) - } - if newState == uint16(u) && nBits == 0 { - // Seems weird that this is possible with nbits > 0. - return fmt.Errorf("newState (%d) == oldState (%d) and no bits", newState, u) - } - s.dt[u&maxTableMask].setNewState(newState) - } - } - return nil -} diff --git a/vendor/github.com/klauspost/compress/zstd/fse_encoder.go b/vendor/github.com/klauspost/compress/zstd/fse_encoder.go deleted file mode 100644 index ab26326a8f..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/fse_encoder.go +++ /dev/null @@ -1,701 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "errors" - "fmt" - "math" -) - -const ( - // For encoding we only support up to - maxEncTableLog = 8 - maxEncTablesize = 1 << maxTableLog - maxEncTableMask = (1 << maxTableLog) - 1 - minEncTablelog = 5 - maxEncSymbolValue = maxMatchLengthSymbol -) - -// Scratch provides temporary storage for compression and decompression. -type fseEncoder struct { - symbolLen uint16 // Length of active part of the symbol table. - actualTableLog uint8 // Selected tablelog. - ct cTable // Compression tables. - maxCount int // count of the most probable symbol - zeroBits bool // no bits has prob > 50%. - clearCount bool // clear count - useRLE bool // This encoder is for RLE - preDefined bool // This encoder is predefined. - reUsed bool // Set to know when the encoder has been reused. - rleVal uint8 // RLE Symbol - maxBits uint8 // Maximum output bits after transform. - - // TODO: Technically zstd should be fine with 64 bytes. - count [256]uint32 - norm [256]int16 -} - -// cTable contains tables used for compression. -type cTable struct { - tableSymbol []byte - stateTable []uint16 - symbolTT []symbolTransform -} - -// symbolTransform contains the state transform for a symbol. -type symbolTransform struct { - deltaNbBits uint32 - deltaFindState int16 - outBits uint8 -} - -// String prints values as a human readable string. -func (s symbolTransform) String() string { - return fmt.Sprintf("{deltabits: %08x, findstate:%d outbits:%d}", s.deltaNbBits, s.deltaFindState, s.outBits) -} - -// Histogram allows to populate the histogram and skip that step in the compression, -// It otherwise allows to inspect the histogram when compression is done. -// To indicate that you have populated the histogram call HistogramFinished -// with the value of the highest populated symbol, as well as the number of entries -// in the most populated entry. These are accepted at face value. -func (s *fseEncoder) Histogram() *[256]uint32 { - return &s.count -} - -// HistogramFinished can be called to indicate that the histogram has been populated. -// maxSymbol is the index of the highest set symbol of the next data segment. -// maxCount is the number of entries in the most populated entry. -// These are accepted at face value. -func (s *fseEncoder) HistogramFinished(maxSymbol uint8, maxCount int) { - s.maxCount = maxCount - s.symbolLen = uint16(maxSymbol) + 1 - s.clearCount = maxCount != 0 -} - -// allocCtable will allocate tables needed for compression. -// If existing tables a re big enough, they are simply re-used. -func (s *fseEncoder) allocCtable() { - tableSize := 1 << s.actualTableLog - // get tableSymbol that is big enough. - if cap(s.ct.tableSymbol) < tableSize { - s.ct.tableSymbol = make([]byte, tableSize) - } - s.ct.tableSymbol = s.ct.tableSymbol[:tableSize] - - ctSize := tableSize - if cap(s.ct.stateTable) < ctSize { - s.ct.stateTable = make([]uint16, ctSize) - } - s.ct.stateTable = s.ct.stateTable[:ctSize] - - if cap(s.ct.symbolTT) < 256 { - s.ct.symbolTT = make([]symbolTransform, 256) - } - s.ct.symbolTT = s.ct.symbolTT[:256] -} - -// buildCTable will populate the compression table so it is ready to be used. -func (s *fseEncoder) buildCTable() error { - tableSize := uint32(1 << s.actualTableLog) - highThreshold := tableSize - 1 - var cumul [256]int16 - - s.allocCtable() - tableSymbol := s.ct.tableSymbol[:tableSize] - // symbol start positions - { - cumul[0] = 0 - for ui, v := range s.norm[:s.symbolLen-1] { - u := byte(ui) // one less than reference - if v == -1 { - // Low proba symbol - cumul[u+1] = cumul[u] + 1 - tableSymbol[highThreshold] = u - highThreshold-- - } else { - cumul[u+1] = cumul[u] + v - } - } - // Encode last symbol separately to avoid overflowing u - u := int(s.symbolLen - 1) - v := s.norm[s.symbolLen-1] - if v == -1 { - // Low proba symbol - cumul[u+1] = cumul[u] + 1 - tableSymbol[highThreshold] = byte(u) - highThreshold-- - } else { - cumul[u+1] = cumul[u] + v - } - if uint32(cumul[s.symbolLen]) != tableSize { - return fmt.Errorf("internal error: expected cumul[s.symbolLen] (%d) == tableSize (%d)", cumul[s.symbolLen], tableSize) - } - cumul[s.symbolLen] = int16(tableSize) + 1 - } - // Spread symbols - s.zeroBits = false - { - step := tableStep(tableSize) - tableMask := tableSize - 1 - var position uint32 - // if any symbol > largeLimit, we may have 0 bits output. - largeLimit := int16(1 << (s.actualTableLog - 1)) - for ui, v := range s.norm[:s.symbolLen] { - symbol := byte(ui) - if v > largeLimit { - s.zeroBits = true - } - for nbOccurrences := int16(0); nbOccurrences < v; nbOccurrences++ { - tableSymbol[position] = symbol - position = (position + step) & tableMask - for position > highThreshold { - position = (position + step) & tableMask - } /* Low proba area */ - } - } - - // Check if we have gone through all positions - if position != 0 { - return errors.New("position!=0") - } - } - - // Build table - table := s.ct.stateTable - { - tsi := int(tableSize) - for u, v := range tableSymbol { - // TableU16 : sorted by symbol order; gives next state value - table[cumul[v]] = uint16(tsi + u) - cumul[v]++ - } - } - - // Build Symbol Transformation Table - { - total := int16(0) - symbolTT := s.ct.symbolTT[:s.symbolLen] - tableLog := s.actualTableLog - tl := (uint32(tableLog) << 16) - (1 << tableLog) - for i, v := range s.norm[:s.symbolLen] { - switch v { - case 0: - case -1, 1: - symbolTT[i].deltaNbBits = tl - symbolTT[i].deltaFindState = total - 1 - total++ - default: - maxBitsOut := uint32(tableLog) - highBit(uint32(v-1)) - minStatePlus := uint32(v) << maxBitsOut - symbolTT[i].deltaNbBits = (maxBitsOut << 16) - minStatePlus - symbolTT[i].deltaFindState = total - v - total += v - } - } - if total != int16(tableSize) { - return fmt.Errorf("total mismatch %d (got) != %d (want)", total, tableSize) - } - } - return nil -} - -var rtbTable = [...]uint32{0, 473195, 504333, 520860, 550000, 700000, 750000, 830000} - -func (s *fseEncoder) setRLE(val byte) { - s.allocCtable() - s.actualTableLog = 0 - s.ct.stateTable = s.ct.stateTable[:1] - s.ct.symbolTT[val] = symbolTransform{ - deltaFindState: 0, - deltaNbBits: 0, - } - if debugEncoder { - println("setRLE: val", val, "symbolTT", s.ct.symbolTT[val]) - } - s.rleVal = val - s.useRLE = true -} - -// setBits will set output bits for the transform. -// if nil is provided, the number of bits is equal to the index. -func (s *fseEncoder) setBits(transform []byte) { - if s.reUsed || s.preDefined { - return - } - if s.useRLE { - if transform == nil { - s.ct.symbolTT[s.rleVal].outBits = s.rleVal - s.maxBits = s.rleVal - return - } - s.maxBits = transform[s.rleVal] - s.ct.symbolTT[s.rleVal].outBits = s.maxBits - return - } - if transform == nil { - for i := range s.ct.symbolTT[:s.symbolLen] { - s.ct.symbolTT[i].outBits = uint8(i) - } - s.maxBits = uint8(s.symbolLen - 1) - return - } - s.maxBits = 0 - for i, v := range transform[:s.symbolLen] { - s.ct.symbolTT[i].outBits = v - if v > s.maxBits { - // We could assume bits always going up, but we play safe. - s.maxBits = v - } - } -} - -// normalizeCount will normalize the count of the symbols so -// the total is equal to the table size. -// If successful, compression tables will also be made ready. -func (s *fseEncoder) normalizeCount(length int) error { - if s.reUsed { - return nil - } - s.optimalTableLog(length) - var ( - tableLog = s.actualTableLog - scale = 62 - uint64(tableLog) - step = (1 << 62) / uint64(length) - vStep = uint64(1) << (scale - 20) - stillToDistribute = int16(1 << tableLog) - largest int - largestP int16 - lowThreshold = (uint32)(length >> tableLog) - ) - if s.maxCount == length { - s.useRLE = true - return nil - } - s.useRLE = false - for i, cnt := range s.count[:s.symbolLen] { - // already handled - // if (count[s] == s.length) return 0; /* rle special case */ - - if cnt == 0 { - s.norm[i] = 0 - continue - } - if cnt <= lowThreshold { - s.norm[i] = -1 - stillToDistribute-- - } else { - proba := (int16)((uint64(cnt) * step) >> scale) - if proba < 8 { - restToBeat := vStep * uint64(rtbTable[proba]) - v := uint64(cnt)*step - (uint64(proba) << scale) - if v > restToBeat { - proba++ - } - } - if proba > largestP { - largestP = proba - largest = i - } - s.norm[i] = proba - stillToDistribute -= proba - } - } - - if -stillToDistribute >= (s.norm[largest] >> 1) { - // corner case, need another normalization method - err := s.normalizeCount2(length) - if err != nil { - return err - } - if debugAsserts { - err = s.validateNorm() - if err != nil { - return err - } - } - return s.buildCTable() - } - s.norm[largest] += stillToDistribute - if debugAsserts { - err := s.validateNorm() - if err != nil { - return err - } - } - return s.buildCTable() -} - -// Secondary normalization method. -// To be used when primary method fails. -func (s *fseEncoder) normalizeCount2(length int) error { - const notYetAssigned = -2 - var ( - distributed uint32 - total = uint32(length) - tableLog = s.actualTableLog - lowThreshold = total >> tableLog - lowOne = (total * 3) >> (tableLog + 1) - ) - for i, cnt := range s.count[:s.symbolLen] { - if cnt == 0 { - s.norm[i] = 0 - continue - } - if cnt <= lowThreshold { - s.norm[i] = -1 - distributed++ - total -= cnt - continue - } - if cnt <= lowOne { - s.norm[i] = 1 - distributed++ - total -= cnt - continue - } - s.norm[i] = notYetAssigned - } - toDistribute := (1 << tableLog) - distributed - - if (total / toDistribute) > lowOne { - // risk of rounding to zero - lowOne = (total * 3) / (toDistribute * 2) - for i, cnt := range s.count[:s.symbolLen] { - if (s.norm[i] == notYetAssigned) && (cnt <= lowOne) { - s.norm[i] = 1 - distributed++ - total -= cnt - continue - } - } - toDistribute = (1 << tableLog) - distributed - } - if distributed == uint32(s.symbolLen)+1 { - // all values are pretty poor; - // probably incompressible data (should have already been detected); - // find max, then give all remaining points to max - var maxV int - var maxC uint32 - for i, cnt := range s.count[:s.symbolLen] { - if cnt > maxC { - maxV = i - maxC = cnt - } - } - s.norm[maxV] += int16(toDistribute) - return nil - } - - if total == 0 { - // all of the symbols were low enough for the lowOne or lowThreshold - for i := uint32(0); toDistribute > 0; i = (i + 1) % (uint32(s.symbolLen)) { - if s.norm[i] > 0 { - toDistribute-- - s.norm[i]++ - } - } - return nil - } - - var ( - vStepLog = 62 - uint64(tableLog) - mid = uint64((1 << (vStepLog - 1)) - 1) - rStep = (((1 << vStepLog) * uint64(toDistribute)) + mid) / uint64(total) // scale on remaining - tmpTotal = mid - ) - for i, cnt := range s.count[:s.symbolLen] { - if s.norm[i] == notYetAssigned { - var ( - end = tmpTotal + uint64(cnt)*rStep - sStart = uint32(tmpTotal >> vStepLog) - sEnd = uint32(end >> vStepLog) - weight = sEnd - sStart - ) - if weight < 1 { - return errors.New("weight < 1") - } - s.norm[i] = int16(weight) - tmpTotal = end - } - } - return nil -} - -// optimalTableLog calculates and sets the optimal tableLog in s.actualTableLog -func (s *fseEncoder) optimalTableLog(length int) { - tableLog := uint8(maxEncTableLog) - minBitsSrc := highBit(uint32(length)) + 1 - minBitsSymbols := highBit(uint32(s.symbolLen-1)) + 2 - minBits := uint8(minBitsSymbols) - if minBitsSrc < minBitsSymbols { - minBits = uint8(minBitsSrc) - } - - maxBitsSrc := uint8(highBit(uint32(length-1))) - 2 - if maxBitsSrc < tableLog { - // Accuracy can be reduced - tableLog = maxBitsSrc - } - if minBits > tableLog { - tableLog = minBits - } - // Need a minimum to safely represent all symbol values - if tableLog < minEncTablelog { - tableLog = minEncTablelog - } - if tableLog > maxEncTableLog { - tableLog = maxEncTableLog - } - s.actualTableLog = tableLog -} - -// validateNorm validates the normalized histogram table. -func (s *fseEncoder) validateNorm() (err error) { - var total int - for _, v := range s.norm[:s.symbolLen] { - if v >= 0 { - total += int(v) - } else { - total -= int(v) - } - } - defer func() { - if err == nil { - return - } - fmt.Printf("selected TableLog: %d, Symbol length: %d\n", s.actualTableLog, s.symbolLen) - for i, v := range s.norm[:s.symbolLen] { - fmt.Printf("%3d: %5d -> %4d \n", i, s.count[i], v) - } - }() - if total != (1 << s.actualTableLog) { - return fmt.Errorf("warning: Total == %d != %d", total, 1<> 3) + 3 + 2 - - // Write Table Size - bitStream = uint32(tableLog - minEncTablelog) - bitCount = uint(4) - remaining = int16(tableSize + 1) /* +1 for extra accuracy */ - threshold = int16(tableSize) - nbBits = uint(tableLog + 1) - outP = len(out) - ) - if cap(out) < outP+maxHeaderSize { - out = append(out, make([]byte, maxHeaderSize*3)...) - out = out[:len(out)-maxHeaderSize*3] - } - out = out[:outP+maxHeaderSize] - - // stops at 1 - for remaining > 1 { - if previous0 { - start := charnum - for s.norm[charnum] == 0 { - charnum++ - } - for charnum >= start+24 { - start += 24 - bitStream += uint32(0xFFFF) << bitCount - out[outP] = byte(bitStream) - out[outP+1] = byte(bitStream >> 8) - outP += 2 - bitStream >>= 16 - } - for charnum >= start+3 { - start += 3 - bitStream += 3 << bitCount - bitCount += 2 - } - bitStream += uint32(charnum-start) << bitCount - bitCount += 2 - if bitCount > 16 { - out[outP] = byte(bitStream) - out[outP+1] = byte(bitStream >> 8) - outP += 2 - bitStream >>= 16 - bitCount -= 16 - } - } - - count := s.norm[charnum] - charnum++ - max := (2*threshold - 1) - remaining - if count < 0 { - remaining += count - } else { - remaining -= count - } - count++ // +1 for extra accuracy - if count >= threshold { - count += max // [0..max[ [max..threshold[ (...) [threshold+max 2*threshold[ - } - bitStream += uint32(count) << bitCount - bitCount += nbBits - if count < max { - bitCount-- - } - - previous0 = count == 1 - if remaining < 1 { - return nil, errors.New("internal error: remaining < 1") - } - for remaining < threshold { - nbBits-- - threshold >>= 1 - } - - if bitCount > 16 { - out[outP] = byte(bitStream) - out[outP+1] = byte(bitStream >> 8) - outP += 2 - bitStream >>= 16 - bitCount -= 16 - } - } - - if outP+2 > len(out) { - return nil, fmt.Errorf("internal error: %d > %d, maxheader: %d, sl: %d, tl: %d, normcount: %v", outP+2, len(out), maxHeaderSize, s.symbolLen, int(tableLog), s.norm[:s.symbolLen]) - } - out[outP] = byte(bitStream) - out[outP+1] = byte(bitStream >> 8) - outP += int((bitCount + 7) / 8) - - if charnum > s.symbolLen { - return nil, errors.New("internal error: charnum > s.symbolLen") - } - return out[:outP], nil -} - -// Approximate symbol cost, as fractional value, using fixed-point format (accuracyLog fractional bits) -// note 1 : assume symbolValue is valid (<= maxSymbolValue) -// note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits * -func (s *fseEncoder) bitCost(symbolValue uint8, accuracyLog uint32) uint32 { - minNbBits := s.ct.symbolTT[symbolValue].deltaNbBits >> 16 - threshold := (minNbBits + 1) << 16 - if debugAsserts { - if !(s.actualTableLog < 16) { - panic("!s.actualTableLog < 16") - } - // ensure enough room for renormalization double shift - if !(uint8(accuracyLog) < 31-s.actualTableLog) { - panic("!uint8(accuracyLog) < 31-s.actualTableLog") - } - } - tableSize := uint32(1) << s.actualTableLog - deltaFromThreshold := threshold - (s.ct.symbolTT[symbolValue].deltaNbBits + tableSize) - // linear interpolation (very approximate) - normalizedDeltaFromThreshold := (deltaFromThreshold << accuracyLog) >> s.actualTableLog - bitMultiplier := uint32(1) << accuracyLog - if debugAsserts { - if s.ct.symbolTT[symbolValue].deltaNbBits+tableSize > threshold { - panic("s.ct.symbolTT[symbolValue].deltaNbBits+tableSize > threshold") - } - if normalizedDeltaFromThreshold > bitMultiplier { - panic("normalizedDeltaFromThreshold > bitMultiplier") - } - } - return (minNbBits+1)*bitMultiplier - normalizedDeltaFromThreshold -} - -// Returns the cost in bits of encoding the distribution in count using ctable. -// Histogram should only be up to the last non-zero symbol. -// Returns an -1 if ctable cannot represent all the symbols in count. -func (s *fseEncoder) approxSize(hist []uint32) uint32 { - if int(s.symbolLen) < len(hist) { - // More symbols than we have. - return math.MaxUint32 - } - if s.useRLE { - // We will never reuse RLE encoders. - return math.MaxUint32 - } - const kAccuracyLog = 8 - badCost := (uint32(s.actualTableLog) + 1) << kAccuracyLog - var cost uint32 - for i, v := range hist { - if v == 0 { - continue - } - if s.norm[i] == 0 { - return math.MaxUint32 - } - bitCost := s.bitCost(uint8(i), kAccuracyLog) - if bitCost > badCost { - return math.MaxUint32 - } - cost += v * bitCost - } - return cost >> kAccuracyLog -} - -// maxHeaderSize returns the maximum header size in bits. -// This is not exact size, but we want a penalty for new tables anyway. -func (s *fseEncoder) maxHeaderSize() uint32 { - if s.preDefined { - return 0 - } - if s.useRLE { - return 8 - } - return (((uint32(s.symbolLen) * uint32(s.actualTableLog)) >> 3) + 3) * 8 -} - -// cState contains the compression state of a stream. -type cState struct { - bw *bitWriter - stateTable []uint16 - state uint16 -} - -// init will initialize the compression state to the first symbol of the stream. -func (c *cState) init(bw *bitWriter, ct *cTable, first symbolTransform) { - c.bw = bw - c.stateTable = ct.stateTable - if len(c.stateTable) == 1 { - // RLE - c.stateTable[0] = uint16(0) - c.state = 0 - return - } - nbBitsOut := (first.deltaNbBits + (1 << 15)) >> 16 - im := int32((nbBitsOut << 16) - first.deltaNbBits) - lu := (im >> nbBitsOut) + int32(first.deltaFindState) - c.state = c.stateTable[lu] -} - -// flush will write the tablelog to the output and flush the remaining full bytes. -func (c *cState) flush(tableLog uint8) { - c.bw.flush32() - c.bw.addBits16NC(c.state, tableLog) -} diff --git a/vendor/github.com/klauspost/compress/zstd/fse_predefined.go b/vendor/github.com/klauspost/compress/zstd/fse_predefined.go deleted file mode 100644 index 474cb77d2b..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/fse_predefined.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "fmt" - "math" - "sync" -) - -var ( - // fsePredef are the predefined fse tables as defined here: - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#default-distributions - // These values are already transformed. - fsePredef [3]fseDecoder - - // fsePredefEnc are the predefined encoder based on fse tables as defined here: - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#default-distributions - // These values are already transformed. - fsePredefEnc [3]fseEncoder - - // symbolTableX contain the transformations needed for each type as defined in - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#the-codes-for-literals-lengths-match-lengths-and-offsets - symbolTableX [3][]baseOffset - - // maxTableSymbol is the biggest supported symbol for each table type - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#the-codes-for-literals-lengths-match-lengths-and-offsets - maxTableSymbol = [3]uint8{tableLiteralLengths: maxLiteralLengthSymbol, tableOffsets: maxOffsetLengthSymbol, tableMatchLengths: maxMatchLengthSymbol} - - // bitTables is the bits table for each table. - bitTables = [3][]byte{tableLiteralLengths: llBitsTable[:], tableOffsets: nil, tableMatchLengths: mlBitsTable[:]} -) - -type tableIndex uint8 - -const ( - // indexes for fsePredef and symbolTableX - tableLiteralLengths tableIndex = 0 - tableOffsets tableIndex = 1 - tableMatchLengths tableIndex = 2 - - maxLiteralLengthSymbol = 35 - maxOffsetLengthSymbol = 30 - maxMatchLengthSymbol = 52 -) - -// baseOffset is used for calculating transformations. -type baseOffset struct { - baseLine uint32 - addBits uint8 -} - -// fillBase will precalculate base offsets with the given bit distributions. -func fillBase(dst []baseOffset, base uint32, bits ...uint8) { - if len(bits) != len(dst) { - panic(fmt.Sprintf("len(dst) (%d) != len(bits) (%d)", len(dst), len(bits))) - } - for i, bit := range bits { - if base > math.MaxInt32 { - panic("invalid decoding table, base overflows int32") - } - - dst[i] = baseOffset{ - baseLine: base, - addBits: bit, - } - base += 1 << bit - } -} - -var predef sync.Once - -func initPredefined() { - predef.Do(func() { - // Literals length codes - tmp := make([]baseOffset, 36) - for i := range tmp[:16] { - tmp[i] = baseOffset{ - baseLine: uint32(i), - addBits: 0, - } - } - fillBase(tmp[16:], 16, 1, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) - symbolTableX[tableLiteralLengths] = tmp - - // Match length codes - tmp = make([]baseOffset, 53) - for i := range tmp[:32] { - tmp[i] = baseOffset{ - // The transformation adds the 3 length. - baseLine: uint32(i) + 3, - addBits: 0, - } - } - fillBase(tmp[32:], 35, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) - symbolTableX[tableMatchLengths] = tmp - - // Offset codes - tmp = make([]baseOffset, maxOffsetBits+1) - tmp[1] = baseOffset{ - baseLine: 1, - addBits: 1, - } - fillBase(tmp[2:], 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) - symbolTableX[tableOffsets] = tmp - - // Fill predefined tables and transform them. - // https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#default-distributions - for i := range fsePredef[:] { - f := &fsePredef[i] - switch tableIndex(i) { - case tableLiteralLengths: - // https://github.com/facebook/zstd/blob/ededcfca57366461021c922720878c81a5854a0a/lib/decompress/zstd_decompress_block.c#L243 - f.actualTableLog = 6 - copy(f.norm[:], []int16{4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1, - -1, -1, -1, -1}) - f.symbolLen = 36 - case tableOffsets: - // https://github.com/facebook/zstd/blob/ededcfca57366461021c922720878c81a5854a0a/lib/decompress/zstd_decompress_block.c#L281 - f.actualTableLog = 5 - copy(f.norm[:], []int16{ - 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1}) - f.symbolLen = 29 - case tableMatchLengths: - //https://github.com/facebook/zstd/blob/ededcfca57366461021c922720878c81a5854a0a/lib/decompress/zstd_decompress_block.c#L304 - f.actualTableLog = 6 - copy(f.norm[:], []int16{ - 1, 4, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, - -1, -1, -1, -1, -1}) - f.symbolLen = 53 - } - if err := f.buildDtable(); err != nil { - panic(fmt.Errorf("building table %v: %v", tableIndex(i), err)) - } - if err := f.transform(symbolTableX[i]); err != nil { - panic(fmt.Errorf("building table %v: %v", tableIndex(i), err)) - } - f.preDefined = true - - // Create encoder as well - enc := &fsePredefEnc[i] - copy(enc.norm[:], f.norm[:]) - enc.symbolLen = f.symbolLen - enc.actualTableLog = f.actualTableLog - if err := enc.buildCTable(); err != nil { - panic(fmt.Errorf("building encoding table %v: %v", tableIndex(i), err)) - } - enc.setBits(bitTables[i]) - enc.preDefined = true - } - }) -} diff --git a/vendor/github.com/klauspost/compress/zstd/hash.go b/vendor/github.com/klauspost/compress/zstd/hash.go deleted file mode 100644 index 5d73c21ebd..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/hash.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -const ( - prime3bytes = 506832829 - prime4bytes = 2654435761 - prime5bytes = 889523592379 - prime6bytes = 227718039650203 - prime7bytes = 58295818150454627 - prime8bytes = 0xcf1bbcdcb7a56463 -) - -// hashLen returns a hash of the lowest mls bytes of with length output bits. -// mls must be >=3 and <=8. Any other value will return hash for 4 bytes. -// length should always be < 32. -// Preferably length and mls should be a constant for inlining. -func hashLen(u uint64, length, mls uint8) uint32 { - switch mls { - case 3: - return (uint32(u<<8) * prime3bytes) >> (32 - length) - case 5: - return uint32(((u << (64 - 40)) * prime5bytes) >> (64 - length)) - case 6: - return uint32(((u << (64 - 48)) * prime6bytes) >> (64 - length)) - case 7: - return uint32(((u << (64 - 56)) * prime7bytes) >> (64 - length)) - case 8: - return uint32((u * prime8bytes) >> (64 - length)) - default: - return (uint32(u) * prime4bytes) >> (32 - length) - } -} diff --git a/vendor/github.com/klauspost/compress/zstd/history.go b/vendor/github.com/klauspost/compress/zstd/history.go deleted file mode 100644 index 09164856d2..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/history.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "github.com/klauspost/compress/huff0" -) - -// history contains the information transferred between blocks. -type history struct { - // Literal decompression - huffTree *huff0.Scratch - - // Sequence decompression - decoders sequenceDecs - recentOffsets [3]int - - // History buffer... - b []byte - - // ignoreBuffer is meant to ignore a number of bytes - // when checking for matches in history - ignoreBuffer int - - windowSize int - allocFrameBuffer int // needed? - error bool - dict *dict -} - -// reset will reset the history to initial state of a frame. -// The history must already have been initialized to the desired size. -func (h *history) reset() { - h.b = h.b[:0] - h.ignoreBuffer = 0 - h.error = false - h.recentOffsets = [3]int{1, 4, 8} - h.decoders.freeDecoders() - h.decoders = sequenceDecs{br: h.decoders.br} - h.freeHuffDecoder() - h.huffTree = nil - h.dict = nil - //printf("history created: %+v (l: %d, c: %d)", *h, len(h.b), cap(h.b)) -} - -func (h *history) freeHuffDecoder() { - if h.huffTree != nil { - if h.dict == nil || h.dict.litEnc != h.huffTree { - huffDecoderPool.Put(h.huffTree) - h.huffTree = nil - } - } -} - -func (h *history) setDict(dict *dict) { - if dict == nil { - return - } - h.dict = dict - h.decoders.litLengths = dict.llDec - h.decoders.offsets = dict.ofDec - h.decoders.matchLengths = dict.mlDec - h.decoders.dict = dict.content - h.recentOffsets = dict.offsets - h.huffTree = dict.litEnc -} - -// append bytes to history. -// This function will make sure there is space for it, -// if the buffer has been allocated with enough extra space. -func (h *history) append(b []byte) { - if len(b) >= h.windowSize { - // Discard all history by simply overwriting - h.b = h.b[:h.windowSize] - copy(h.b, b[len(b)-h.windowSize:]) - return - } - - // If there is space, append it. - if len(b) < cap(h.b)-len(h.b) { - h.b = append(h.b, b...) - return - } - - // Move data down so we only have window size left. - // We know we have less than window size in b at this point. - discard := len(b) + len(h.b) - h.windowSize - copy(h.b, h.b[discard:]) - h.b = h.b[:h.windowSize] - copy(h.b[h.windowSize-len(b):], b) -} - -// ensureBlock will ensure there is space for at least one block... -func (h *history) ensureBlock() { - if cap(h.b) < h.allocFrameBuffer { - h.b = make([]byte, 0, h.allocFrameBuffer) - return - } - - avail := cap(h.b) - len(h.b) - if avail >= h.windowSize || avail > maxCompressedBlockSize { - return - } - // Move data down so we only have window size left. - // We know we have less than window size in b at this point. - discard := len(h.b) - h.windowSize - copy(h.b, h.b[discard:]) - h.b = h.b[:h.windowSize] -} - -// append bytes to history without ever discarding anything. -func (h *history) appendKeep(b []byte) { - h.b = append(h.b, b...) -} diff --git a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/LICENSE.txt b/vendor/github.com/klauspost/compress/zstd/internal/xxhash/LICENSE.txt deleted file mode 100644 index 24b53065f4..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2016 Caleb Spare - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md b/vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md deleted file mode 100644 index 777290d44c..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# xxhash - -VENDORED: Go to [github.com/cespare/xxhash](https://github.com/cespare/xxhash) for original package. - -xxhash is a Go implementation of the 64-bit [xxHash] algorithm, XXH64. This is a -high-quality hashing algorithm that is much faster than anything in the Go -standard library. - -This package provides a straightforward API: - -``` -func Sum64(b []byte) uint64 -func Sum64String(s string) uint64 -type Digest struct{ ... } - func New() *Digest -``` - -The `Digest` type implements hash.Hash64. Its key methods are: - -``` -func (*Digest) Write([]byte) (int, error) -func (*Digest) WriteString(string) (int, error) -func (*Digest) Sum64() uint64 -``` - -The package is written with optimized pure Go and also contains even faster -assembly implementations for amd64 and arm64. If desired, the `purego` build tag -opts into using the Go code even on those architectures. - -[xxHash]: http://cyan4973.github.io/xxHash/ - -## Compatibility - -This package is in a module and the latest code is in version 2 of the module. -You need a version of Go with at least "minimal module compatibility" to use -github.com/cespare/xxhash/v2: - -* 1.9.7+ for Go 1.9 -* 1.10.3+ for Go 1.10 -* Go 1.11 or later - -I recommend using the latest release of Go. - -## Benchmarks - -Here are some quick benchmarks comparing the pure-Go and assembly -implementations of Sum64. - -| input size | purego | asm | -| ---------- | --------- | --------- | -| 4 B | 1.3 GB/s | 1.2 GB/s | -| 16 B | 2.9 GB/s | 3.5 GB/s | -| 100 B | 6.9 GB/s | 8.1 GB/s | -| 4 KB | 11.7 GB/s | 16.7 GB/s | -| 10 MB | 12.0 GB/s | 17.3 GB/s | - -These numbers were generated on Ubuntu 20.04 with an Intel Xeon Platinum 8252C -CPU using the following commands under Go 1.19.2: - -``` -benchstat <(go test -tags purego -benchtime 500ms -count 15 -bench 'Sum64$') -benchstat <(go test -benchtime 500ms -count 15 -bench 'Sum64$') -``` - -## Projects using this package - -- [InfluxDB](https://github.com/influxdata/influxdb) -- [Prometheus](https://github.com/prometheus/prometheus) -- [VictoriaMetrics](https://github.com/VictoriaMetrics/VictoriaMetrics) -- [FreeCache](https://github.com/coocood/freecache) -- [FastCache](https://github.com/VictoriaMetrics/fastcache) diff --git a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go b/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go deleted file mode 100644 index fc40c82001..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go +++ /dev/null @@ -1,230 +0,0 @@ -// Package xxhash implements the 64-bit variant of xxHash (XXH64) as described -// at http://cyan4973.github.io/xxHash/. -// THIS IS VENDORED: Go to github.com/cespare/xxhash for original package. - -package xxhash - -import ( - "encoding/binary" - "errors" - "math/bits" -) - -const ( - prime1 uint64 = 11400714785074694791 - prime2 uint64 = 14029467366897019727 - prime3 uint64 = 1609587929392839161 - prime4 uint64 = 9650029242287828579 - prime5 uint64 = 2870177450012600261 -) - -// Store the primes in an array as well. -// -// The consts are used when possible in Go code to avoid MOVs but we need a -// contiguous array of the assembly code. -var primes = [...]uint64{prime1, prime2, prime3, prime4, prime5} - -// Digest implements hash.Hash64. -type Digest struct { - v1 uint64 - v2 uint64 - v3 uint64 - v4 uint64 - total uint64 - mem [32]byte - n int // how much of mem is used -} - -// New creates a new Digest that computes the 64-bit xxHash algorithm. -func New() *Digest { - var d Digest - d.Reset() - return &d -} - -// Reset clears the Digest's state so that it can be reused. -func (d *Digest) Reset() { - d.v1 = primes[0] + prime2 - d.v2 = prime2 - d.v3 = 0 - d.v4 = -primes[0] - d.total = 0 - d.n = 0 -} - -// Size always returns 8 bytes. -func (d *Digest) Size() int { return 8 } - -// BlockSize always returns 32 bytes. -func (d *Digest) BlockSize() int { return 32 } - -// Write adds more data to d. It always returns len(b), nil. -func (d *Digest) Write(b []byte) (n int, err error) { - n = len(b) - d.total += uint64(n) - - memleft := d.mem[d.n&(len(d.mem)-1):] - - if d.n+n < 32 { - // This new data doesn't even fill the current block. - copy(memleft, b) - d.n += n - return - } - - if d.n > 0 { - // Finish off the partial block. - c := copy(memleft, b) - d.v1 = round(d.v1, u64(d.mem[0:8])) - d.v2 = round(d.v2, u64(d.mem[8:16])) - d.v3 = round(d.v3, u64(d.mem[16:24])) - d.v4 = round(d.v4, u64(d.mem[24:32])) - b = b[c:] - d.n = 0 - } - - if len(b) >= 32 { - // One or more full blocks left. - nw := writeBlocks(d, b) - b = b[nw:] - } - - // Store any remaining partial block. - copy(d.mem[:], b) - d.n = len(b) - - return -} - -// Sum appends the current hash to b and returns the resulting slice. -func (d *Digest) Sum(b []byte) []byte { - s := d.Sum64() - return append( - b, - byte(s>>56), - byte(s>>48), - byte(s>>40), - byte(s>>32), - byte(s>>24), - byte(s>>16), - byte(s>>8), - byte(s), - ) -} - -// Sum64 returns the current hash. -func (d *Digest) Sum64() uint64 { - var h uint64 - - if d.total >= 32 { - v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4 - h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4) - h = mergeRound(h, v1) - h = mergeRound(h, v2) - h = mergeRound(h, v3) - h = mergeRound(h, v4) - } else { - h = d.v3 + prime5 - } - - h += d.total - - b := d.mem[:d.n&(len(d.mem)-1)] - for ; len(b) >= 8; b = b[8:] { - k1 := round(0, u64(b[:8])) - h ^= k1 - h = rol27(h)*prime1 + prime4 - } - if len(b) >= 4 { - h ^= uint64(u32(b[:4])) * prime1 - h = rol23(h)*prime2 + prime3 - b = b[4:] - } - for ; len(b) > 0; b = b[1:] { - h ^= uint64(b[0]) * prime5 - h = rol11(h) * prime1 - } - - h ^= h >> 33 - h *= prime2 - h ^= h >> 29 - h *= prime3 - h ^= h >> 32 - - return h -} - -const ( - magic = "xxh\x06" - marshaledSize = len(magic) + 8*5 + 32 -) - -// MarshalBinary implements the encoding.BinaryMarshaler interface. -func (d *Digest) MarshalBinary() ([]byte, error) { - b := make([]byte, 0, marshaledSize) - b = append(b, magic...) - b = appendUint64(b, d.v1) - b = appendUint64(b, d.v2) - b = appendUint64(b, d.v3) - b = appendUint64(b, d.v4) - b = appendUint64(b, d.total) - b = append(b, d.mem[:d.n]...) - b = b[:len(b)+len(d.mem)-d.n] - return b, nil -} - -// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. -func (d *Digest) UnmarshalBinary(b []byte) error { - if len(b) < len(magic) || string(b[:len(magic)]) != magic { - return errors.New("xxhash: invalid hash state identifier") - } - if len(b) != marshaledSize { - return errors.New("xxhash: invalid hash state size") - } - b = b[len(magic):] - b, d.v1 = consumeUint64(b) - b, d.v2 = consumeUint64(b) - b, d.v3 = consumeUint64(b) - b, d.v4 = consumeUint64(b) - b, d.total = consumeUint64(b) - copy(d.mem[:], b) - d.n = int(d.total % uint64(len(d.mem))) - return nil -} - -func appendUint64(b []byte, x uint64) []byte { - var a [8]byte - binary.LittleEndian.PutUint64(a[:], x) - return append(b, a[:]...) -} - -func consumeUint64(b []byte) ([]byte, uint64) { - x := u64(b) - return b[8:], x -} - -func u64(b []byte) uint64 { return binary.LittleEndian.Uint64(b) } -func u32(b []byte) uint32 { return binary.LittleEndian.Uint32(b) } - -func round(acc, input uint64) uint64 { - acc += input * prime2 - acc = rol31(acc) - acc *= prime1 - return acc -} - -func mergeRound(acc, val uint64) uint64 { - val = round(0, val) - acc ^= val - acc = acc*prime1 + prime4 - return acc -} - -func rol1(x uint64) uint64 { return bits.RotateLeft64(x, 1) } -func rol7(x uint64) uint64 { return bits.RotateLeft64(x, 7) } -func rol11(x uint64) uint64 { return bits.RotateLeft64(x, 11) } -func rol12(x uint64) uint64 { return bits.RotateLeft64(x, 12) } -func rol18(x uint64) uint64 { return bits.RotateLeft64(x, 18) } -func rol23(x uint64) uint64 { return bits.RotateLeft64(x, 23) } -func rol27(x uint64) uint64 { return bits.RotateLeft64(x, 27) } -func rol31(x uint64) uint64 { return bits.RotateLeft64(x, 31) } diff --git a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s b/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s deleted file mode 100644 index ddb63aa91b..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s +++ /dev/null @@ -1,210 +0,0 @@ -//go:build !appengine && gc && !purego && !noasm -// +build !appengine -// +build gc -// +build !purego -// +build !noasm - -#include "textflag.h" - -// Registers: -#define h AX -#define d AX -#define p SI // pointer to advance through b -#define n DX -#define end BX // loop end -#define v1 R8 -#define v2 R9 -#define v3 R10 -#define v4 R11 -#define x R12 -#define prime1 R13 -#define prime2 R14 -#define prime4 DI - -#define round(acc, x) \ - IMULQ prime2, x \ - ADDQ x, acc \ - ROLQ $31, acc \ - IMULQ prime1, acc - -// round0 performs the operation x = round(0, x). -#define round0(x) \ - IMULQ prime2, x \ - ROLQ $31, x \ - IMULQ prime1, x - -// mergeRound applies a merge round on the two registers acc and x. -// It assumes that prime1, prime2, and prime4 have been loaded. -#define mergeRound(acc, x) \ - round0(x) \ - XORQ x, acc \ - IMULQ prime1, acc \ - ADDQ prime4, acc - -// blockLoop processes as many 32-byte blocks as possible, -// updating v1, v2, v3, and v4. It assumes that there is at least one block -// to process. -#define blockLoop() \ -loop: \ - MOVQ +0(p), x \ - round(v1, x) \ - MOVQ +8(p), x \ - round(v2, x) \ - MOVQ +16(p), x \ - round(v3, x) \ - MOVQ +24(p), x \ - round(v4, x) \ - ADDQ $32, p \ - CMPQ p, end \ - JLE loop - -// func Sum64(b []byte) uint64 -TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32 - // Load fixed primes. - MOVQ ·primes+0(SB), prime1 - MOVQ ·primes+8(SB), prime2 - MOVQ ·primes+24(SB), prime4 - - // Load slice. - MOVQ b_base+0(FP), p - MOVQ b_len+8(FP), n - LEAQ (p)(n*1), end - - // The first loop limit will be len(b)-32. - SUBQ $32, end - - // Check whether we have at least one block. - CMPQ n, $32 - JLT noBlocks - - // Set up initial state (v1, v2, v3, v4). - MOVQ prime1, v1 - ADDQ prime2, v1 - MOVQ prime2, v2 - XORQ v3, v3 - XORQ v4, v4 - SUBQ prime1, v4 - - blockLoop() - - MOVQ v1, h - ROLQ $1, h - MOVQ v2, x - ROLQ $7, x - ADDQ x, h - MOVQ v3, x - ROLQ $12, x - ADDQ x, h - MOVQ v4, x - ROLQ $18, x - ADDQ x, h - - mergeRound(h, v1) - mergeRound(h, v2) - mergeRound(h, v3) - mergeRound(h, v4) - - JMP afterBlocks - -noBlocks: - MOVQ ·primes+32(SB), h - -afterBlocks: - ADDQ n, h - - ADDQ $24, end - CMPQ p, end - JG try4 - -loop8: - MOVQ (p), x - ADDQ $8, p - round0(x) - XORQ x, h - ROLQ $27, h - IMULQ prime1, h - ADDQ prime4, h - - CMPQ p, end - JLE loop8 - -try4: - ADDQ $4, end - CMPQ p, end - JG try1 - - MOVL (p), x - ADDQ $4, p - IMULQ prime1, x - XORQ x, h - - ROLQ $23, h - IMULQ prime2, h - ADDQ ·primes+16(SB), h - -try1: - ADDQ $4, end - CMPQ p, end - JGE finalize - -loop1: - MOVBQZX (p), x - ADDQ $1, p - IMULQ ·primes+32(SB), x - XORQ x, h - ROLQ $11, h - IMULQ prime1, h - - CMPQ p, end - JL loop1 - -finalize: - MOVQ h, x - SHRQ $33, x - XORQ x, h - IMULQ prime2, h - MOVQ h, x - SHRQ $29, x - XORQ x, h - IMULQ ·primes+16(SB), h - MOVQ h, x - SHRQ $32, x - XORQ x, h - - MOVQ h, ret+24(FP) - RET - -// func writeBlocks(d *Digest, b []byte) int -TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40 - // Load fixed primes needed for round. - MOVQ ·primes+0(SB), prime1 - MOVQ ·primes+8(SB), prime2 - - // Load slice. - MOVQ b_base+8(FP), p - MOVQ b_len+16(FP), n - LEAQ (p)(n*1), end - SUBQ $32, end - - // Load vN from d. - MOVQ s+0(FP), d - MOVQ 0(d), v1 - MOVQ 8(d), v2 - MOVQ 16(d), v3 - MOVQ 24(d), v4 - - // We don't need to check the loop condition here; this function is - // always called with at least one block of data to process. - blockLoop() - - // Copy vN back to d. - MOVQ v1, 0(d) - MOVQ v2, 8(d) - MOVQ v3, 16(d) - MOVQ v4, 24(d) - - // The number of bytes written is p minus the old base pointer. - SUBQ b_base+8(FP), p - MOVQ p, ret+32(FP) - - RET diff --git a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_arm64.s b/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_arm64.s deleted file mode 100644 index ae7d4d3295..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_arm64.s +++ /dev/null @@ -1,184 +0,0 @@ -//go:build !appengine && gc && !purego && !noasm -// +build !appengine -// +build gc -// +build !purego -// +build !noasm - -#include "textflag.h" - -// Registers: -#define digest R1 -#define h R2 // return value -#define p R3 // input pointer -#define n R4 // input length -#define nblocks R5 // n / 32 -#define prime1 R7 -#define prime2 R8 -#define prime3 R9 -#define prime4 R10 -#define prime5 R11 -#define v1 R12 -#define v2 R13 -#define v3 R14 -#define v4 R15 -#define x1 R20 -#define x2 R21 -#define x3 R22 -#define x4 R23 - -#define round(acc, x) \ - MADD prime2, acc, x, acc \ - ROR $64-31, acc \ - MUL prime1, acc - -// round0 performs the operation x = round(0, x). -#define round0(x) \ - MUL prime2, x \ - ROR $64-31, x \ - MUL prime1, x - -#define mergeRound(acc, x) \ - round0(x) \ - EOR x, acc \ - MADD acc, prime4, prime1, acc - -// blockLoop processes as many 32-byte blocks as possible, -// updating v1, v2, v3, and v4. It assumes that n >= 32. -#define blockLoop() \ - LSR $5, n, nblocks \ - PCALIGN $16 \ - loop: \ - LDP.P 16(p), (x1, x2) \ - LDP.P 16(p), (x3, x4) \ - round(v1, x1) \ - round(v2, x2) \ - round(v3, x3) \ - round(v4, x4) \ - SUB $1, nblocks \ - CBNZ nblocks, loop - -// func Sum64(b []byte) uint64 -TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32 - LDP b_base+0(FP), (p, n) - - LDP ·primes+0(SB), (prime1, prime2) - LDP ·primes+16(SB), (prime3, prime4) - MOVD ·primes+32(SB), prime5 - - CMP $32, n - CSEL LT, prime5, ZR, h // if n < 32 { h = prime5 } else { h = 0 } - BLT afterLoop - - ADD prime1, prime2, v1 - MOVD prime2, v2 - MOVD $0, v3 - NEG prime1, v4 - - blockLoop() - - ROR $64-1, v1, x1 - ROR $64-7, v2, x2 - ADD x1, x2 - ROR $64-12, v3, x3 - ROR $64-18, v4, x4 - ADD x3, x4 - ADD x2, x4, h - - mergeRound(h, v1) - mergeRound(h, v2) - mergeRound(h, v3) - mergeRound(h, v4) - -afterLoop: - ADD n, h - - TBZ $4, n, try8 - LDP.P 16(p), (x1, x2) - - round0(x1) - - // NOTE: here and below, sequencing the EOR after the ROR (using a - // rotated register) is worth a small but measurable speedup for small - // inputs. - ROR $64-27, h - EOR x1 @> 64-27, h, h - MADD h, prime4, prime1, h - - round0(x2) - ROR $64-27, h - EOR x2 @> 64-27, h, h - MADD h, prime4, prime1, h - -try8: - TBZ $3, n, try4 - MOVD.P 8(p), x1 - - round0(x1) - ROR $64-27, h - EOR x1 @> 64-27, h, h - MADD h, prime4, prime1, h - -try4: - TBZ $2, n, try2 - MOVWU.P 4(p), x2 - - MUL prime1, x2 - ROR $64-23, h - EOR x2 @> 64-23, h, h - MADD h, prime3, prime2, h - -try2: - TBZ $1, n, try1 - MOVHU.P 2(p), x3 - AND $255, x3, x1 - LSR $8, x3, x2 - - MUL prime5, x1 - ROR $64-11, h - EOR x1 @> 64-11, h, h - MUL prime1, h - - MUL prime5, x2 - ROR $64-11, h - EOR x2 @> 64-11, h, h - MUL prime1, h - -try1: - TBZ $0, n, finalize - MOVBU (p), x4 - - MUL prime5, x4 - ROR $64-11, h - EOR x4 @> 64-11, h, h - MUL prime1, h - -finalize: - EOR h >> 33, h - MUL prime2, h - EOR h >> 29, h - MUL prime3, h - EOR h >> 32, h - - MOVD h, ret+24(FP) - RET - -// func writeBlocks(s *Digest, b []byte) int -TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40 - LDP ·primes+0(SB), (prime1, prime2) - - // Load state. Assume v[1-4] are stored contiguously. - MOVD s+0(FP), digest - LDP 0(digest), (v1, v2) - LDP 16(digest), (v3, v4) - - LDP b_base+8(FP), (p, n) - - blockLoop() - - // Store updated state. - STP (v1, v2), 0(digest) - STP (v3, v4), 16(digest) - - BIC $31, n - MOVD n, ret+32(FP) - RET diff --git a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_asm.go b/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_asm.go deleted file mode 100644 index d4221edf4f..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_asm.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build (amd64 || arm64) && !appengine && gc && !purego && !noasm -// +build amd64 arm64 -// +build !appengine -// +build gc -// +build !purego -// +build !noasm - -package xxhash - -// Sum64 computes the 64-bit xxHash digest of b. -// -//go:noescape -func Sum64(b []byte) uint64 - -//go:noescape -func writeBlocks(s *Digest, b []byte) int diff --git a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go b/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go deleted file mode 100644 index 0be16cefc7..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go +++ /dev/null @@ -1,76 +0,0 @@ -//go:build (!amd64 && !arm64) || appengine || !gc || purego || noasm -// +build !amd64,!arm64 appengine !gc purego noasm - -package xxhash - -// Sum64 computes the 64-bit xxHash digest of b. -func Sum64(b []byte) uint64 { - // A simpler version would be - // d := New() - // d.Write(b) - // return d.Sum64() - // but this is faster, particularly for small inputs. - - n := len(b) - var h uint64 - - if n >= 32 { - v1 := primes[0] + prime2 - v2 := prime2 - v3 := uint64(0) - v4 := -primes[0] - for len(b) >= 32 { - v1 = round(v1, u64(b[0:8:len(b)])) - v2 = round(v2, u64(b[8:16:len(b)])) - v3 = round(v3, u64(b[16:24:len(b)])) - v4 = round(v4, u64(b[24:32:len(b)])) - b = b[32:len(b):len(b)] - } - h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4) - h = mergeRound(h, v1) - h = mergeRound(h, v2) - h = mergeRound(h, v3) - h = mergeRound(h, v4) - } else { - h = prime5 - } - - h += uint64(n) - - for ; len(b) >= 8; b = b[8:] { - k1 := round(0, u64(b[:8])) - h ^= k1 - h = rol27(h)*prime1 + prime4 - } - if len(b) >= 4 { - h ^= uint64(u32(b[:4])) * prime1 - h = rol23(h)*prime2 + prime3 - b = b[4:] - } - for ; len(b) > 0; b = b[1:] { - h ^= uint64(b[0]) * prime5 - h = rol11(h) * prime1 - } - - h ^= h >> 33 - h *= prime2 - h ^= h >> 29 - h *= prime3 - h ^= h >> 32 - - return h -} - -func writeBlocks(d *Digest, b []byte) int { - v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4 - n := len(b) - for len(b) >= 32 { - v1 = round(v1, u64(b[0:8:len(b)])) - v2 = round(v2, u64(b[8:16:len(b)])) - v3 = round(v3, u64(b[16:24:len(b)])) - v4 = round(v4, u64(b[24:32:len(b)])) - b = b[32:len(b):len(b)] - } - d.v1, d.v2, d.v3, d.v4 = v1, v2, v3, v4 - return n - len(b) -} diff --git a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_safe.go b/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_safe.go deleted file mode 100644 index 6f3b0cb102..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_safe.go +++ /dev/null @@ -1,11 +0,0 @@ -package xxhash - -// Sum64String computes the 64-bit xxHash digest of s. -func Sum64String(s string) uint64 { - return Sum64([]byte(s)) -} - -// WriteString adds more data to d. It always returns len(s), nil. -func (d *Digest) WriteString(s string) (n int, err error) { - return d.Write([]byte(s)) -} diff --git a/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.go b/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.go deleted file mode 100644 index f41932b7a4..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build amd64 && !appengine && !noasm && gc -// +build amd64,!appengine,!noasm,gc - -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. - -package zstd - -// matchLen returns how many bytes match in a and b -// -// It assumes that: -// -// len(a) <= len(b) and len(a) > 0 -// -//go:noescape -func matchLen(a []byte, b []byte) int diff --git a/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.s b/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.s deleted file mode 100644 index 0782b86e3d..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/matchlen_amd64.s +++ /dev/null @@ -1,66 +0,0 @@ -// Copied from S2 implementation. - -//go:build !appengine && !noasm && gc && !noasm - -#include "textflag.h" - -// func matchLen(a []byte, b []byte) int -TEXT ·matchLen(SB), NOSPLIT, $0-56 - MOVQ a_base+0(FP), AX - MOVQ b_base+24(FP), CX - MOVQ a_len+8(FP), DX - - // matchLen - XORL SI, SI - CMPL DX, $0x08 - JB matchlen_match4_standalone - -matchlen_loopback_standalone: - MOVQ (AX)(SI*1), BX - XORQ (CX)(SI*1), BX - JZ matchlen_loop_standalone - -#ifdef GOAMD64_v3 - TZCNTQ BX, BX -#else - BSFQ BX, BX -#endif - SHRL $0x03, BX - LEAL (SI)(BX*1), SI - JMP gen_match_len_end - -matchlen_loop_standalone: - LEAL -8(DX), DX - LEAL 8(SI), SI - CMPL DX, $0x08 - JAE matchlen_loopback_standalone - -matchlen_match4_standalone: - CMPL DX, $0x04 - JB matchlen_match2_standalone - MOVL (AX)(SI*1), BX - CMPL (CX)(SI*1), BX - JNE matchlen_match2_standalone - LEAL -4(DX), DX - LEAL 4(SI), SI - -matchlen_match2_standalone: - CMPL DX, $0x02 - JB matchlen_match1_standalone - MOVW (AX)(SI*1), BX - CMPW (CX)(SI*1), BX - JNE matchlen_match1_standalone - LEAL -2(DX), DX - LEAL 2(SI), SI - -matchlen_match1_standalone: - CMPL DX, $0x01 - JB gen_match_len_end - MOVB (AX)(SI*1), BL - CMPB (CX)(SI*1), BL - JNE gen_match_len_end - INCL SI - -gen_match_len_end: - MOVQ SI, ret+48(FP) - RET diff --git a/vendor/github.com/klauspost/compress/zstd/matchlen_generic.go b/vendor/github.com/klauspost/compress/zstd/matchlen_generic.go deleted file mode 100644 index 57b9c31c02..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/matchlen_generic.go +++ /dev/null @@ -1,33 +0,0 @@ -//go:build !amd64 || appengine || !gc || noasm -// +build !amd64 appengine !gc noasm - -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. - -package zstd - -import ( - "encoding/binary" - "math/bits" -) - -// matchLen returns the maximum common prefix length of a and b. -// a must be the shortest of the two. -func matchLen(a, b []byte) (n int) { - for ; len(a) >= 8 && len(b) >= 8; a, b = a[8:], b[8:] { - diff := binary.LittleEndian.Uint64(a) ^ binary.LittleEndian.Uint64(b) - if diff != 0 { - return n + bits.TrailingZeros64(diff)>>3 - } - n += 8 - } - - for i := range a { - if a[i] != b[i] { - break - } - n++ - } - return n - -} diff --git a/vendor/github.com/klauspost/compress/zstd/seqdec.go b/vendor/github.com/klauspost/compress/zstd/seqdec.go deleted file mode 100644 index d7fe6d82d9..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/seqdec.go +++ /dev/null @@ -1,503 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "errors" - "fmt" - "io" -) - -type seq struct { - litLen uint32 - matchLen uint32 - offset uint32 - - // Codes are stored here for the encoder - // so they only have to be looked up once. - llCode, mlCode, ofCode uint8 -} - -type seqVals struct { - ll, ml, mo int -} - -func (s seq) String() string { - if s.offset <= 3 { - if s.offset == 0 { - return fmt.Sprint("litLen:", s.litLen, ", matchLen:", s.matchLen+zstdMinMatch, ", offset: INVALID (0)") - } - return fmt.Sprint("litLen:", s.litLen, ", matchLen:", s.matchLen+zstdMinMatch, ", offset:", s.offset, " (repeat)") - } - return fmt.Sprint("litLen:", s.litLen, ", matchLen:", s.matchLen+zstdMinMatch, ", offset:", s.offset-3, " (new)") -} - -type seqCompMode uint8 - -const ( - compModePredefined seqCompMode = iota - compModeRLE - compModeFSE - compModeRepeat -) - -type sequenceDec struct { - // decoder keeps track of the current state and updates it from the bitstream. - fse *fseDecoder - state fseState - repeat bool -} - -// init the state of the decoder with input from stream. -func (s *sequenceDec) init(br *bitReader) error { - if s.fse == nil { - return errors.New("sequence decoder not defined") - } - s.state.init(br, s.fse.actualTableLog, s.fse.dt[:1< cap(s.out) { - addBytes := s.seqSize + len(s.out) - s.out = append(s.out, make([]byte, addBytes)...) - s.out = s.out[:len(s.out)-addBytes] - } - - if debugDecoder { - printf("Execute %d seqs with hist %d, dict %d, literals: %d into %d bytes\n", len(seqs), len(hist), len(s.dict), len(s.literals), s.seqSize) - } - - var t = len(s.out) - out := s.out[:t+s.seqSize] - - for _, seq := range seqs { - // Add literals - copy(out[t:], s.literals[:seq.ll]) - t += seq.ll - s.literals = s.literals[seq.ll:] - - // Copy from dictionary... - if seq.mo > t+len(hist) || seq.mo > s.windowSize { - if len(s.dict) == 0 { - return fmt.Errorf("match offset (%d) bigger than current history (%d)", seq.mo, t+len(hist)) - } - - // we may be in dictionary. - dictO := len(s.dict) - (seq.mo - (t + len(hist))) - if dictO < 0 || dictO >= len(s.dict) { - return fmt.Errorf("match offset (%d) bigger than current history+dict (%d)", seq.mo, t+len(hist)+len(s.dict)) - } - end := dictO + seq.ml - if end > len(s.dict) { - n := len(s.dict) - dictO - copy(out[t:], s.dict[dictO:]) - t += n - seq.ml -= n - } else { - copy(out[t:], s.dict[dictO:end]) - t += end - dictO - continue - } - } - - // Copy from history. - if v := seq.mo - t; v > 0 { - // v is the start position in history from end. - start := len(hist) - v - if seq.ml > v { - // Some goes into current block. - // Copy remainder of history - copy(out[t:], hist[start:]) - t += v - seq.ml -= v - } else { - copy(out[t:], hist[start:start+seq.ml]) - t += seq.ml - continue - } - } - // We must be in current buffer now - if seq.ml > 0 { - start := t - seq.mo - if seq.ml <= t-start { - // No overlap - copy(out[t:], out[start:start+seq.ml]) - t += seq.ml - continue - } else { - // Overlapping copy - // Extend destination slice and copy one byte at the time. - src := out[start : start+seq.ml] - dst := out[t:] - dst = dst[:len(src)] - t += len(src) - // Destination is the space we just added. - for i := range src { - dst[i] = src[i] - } - } - } - } - - // Add final literals - copy(out[t:], s.literals) - if debugDecoder { - t += len(s.literals) - if t != len(out) { - panic(fmt.Errorf("length mismatch, want %d, got %d, ss: %d", len(out), t, s.seqSize)) - } - } - s.out = out - - return nil -} - -// decode sequences from the stream with the provided history. -func (s *sequenceDecs) decodeSync(hist []byte) error { - supported, err := s.decodeSyncSimple(hist) - if supported { - return err - } - - br := s.br - seqs := s.nSeqs - startSize := len(s.out) - // Grab full sizes tables, to avoid bounds checks. - llTable, mlTable, ofTable := s.litLengths.fse.dt[:maxTablesize], s.matchLengths.fse.dt[:maxTablesize], s.offsets.fse.dt[:maxTablesize] - llState, mlState, ofState := s.litLengths.state.state, s.matchLengths.state.state, s.offsets.state.state - out := s.out - maxBlockSize := maxCompressedBlockSize - if s.windowSize < maxBlockSize { - maxBlockSize = s.windowSize - } - - if debugDecoder { - println("decodeSync: decoding", seqs, "sequences", br.remain(), "bits remain on stream") - } - for i := seqs - 1; i >= 0; i-- { - if br.overread() { - printf("reading sequence %d, exceeded available data. Overread by %d\n", seqs-i, -br.remain()) - return io.ErrUnexpectedEOF - } - var ll, mo, ml int - if len(br.in) > 4+((maxOffsetBits+16+16)>>3) { - // inlined function: - // ll, mo, ml = s.nextFast(br, llState, mlState, ofState) - - // Final will not read from stream. - var llB, mlB, moB uint8 - ll, llB = llState.final() - ml, mlB = mlState.final() - mo, moB = ofState.final() - - // extra bits are stored in reverse order. - br.fillFast() - mo += br.getBits(moB) - if s.maxBits > 32 { - br.fillFast() - } - ml += br.getBits(mlB) - ll += br.getBits(llB) - - if moB > 1 { - s.prevOffset[2] = s.prevOffset[1] - s.prevOffset[1] = s.prevOffset[0] - s.prevOffset[0] = mo - } else { - // mo = s.adjustOffset(mo, ll, moB) - // Inlined for rather big speedup - if ll == 0 { - // There is an exception though, when current sequence's literals_length = 0. - // In this case, repeated offsets are shifted by one, so an offset_value of 1 means Repeated_Offset2, - // an offset_value of 2 means Repeated_Offset3, and an offset_value of 3 means Repeated_Offset1 - 1_byte. - mo++ - } - - if mo == 0 { - mo = s.prevOffset[0] - } else { - var temp int - if mo == 3 { - temp = s.prevOffset[0] - 1 - } else { - temp = s.prevOffset[mo] - } - - if temp == 0 { - // 0 is not valid; input is corrupted; force offset to 1 - println("WARNING: temp was 0") - temp = 1 - } - - if mo != 1 { - s.prevOffset[2] = s.prevOffset[1] - } - s.prevOffset[1] = s.prevOffset[0] - s.prevOffset[0] = temp - mo = temp - } - } - br.fillFast() - } else { - ll, mo, ml = s.next(br, llState, mlState, ofState) - br.fill() - } - - if debugSequences { - println("Seq", seqs-i-1, "Litlen:", ll, "mo:", mo, "(abs) ml:", ml) - } - - if ll > len(s.literals) { - return fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", ll, len(s.literals)) - } - size := ll + ml + len(out) - if size-startSize > maxBlockSize { - return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) - } - if size > cap(out) { - // Not enough size, which can happen under high volume block streaming conditions - // but could be if destination slice is too small for sync operations. - // over-allocating here can create a large amount of GC pressure so we try to keep - // it as contained as possible - used := len(out) - startSize - addBytes := 256 + ll + ml + used>>2 - // Clamp to max block size. - if used+addBytes > maxBlockSize { - addBytes = maxBlockSize - used - } - out = append(out, make([]byte, addBytes)...) - out = out[:len(out)-addBytes] - } - if ml > maxMatchLen { - return fmt.Errorf("match len (%d) bigger than max allowed length", ml) - } - - // Add literals - out = append(out, s.literals[:ll]...) - s.literals = s.literals[ll:] - - if mo == 0 && ml > 0 { - return fmt.Errorf("zero matchoff and matchlen (%d) > 0", ml) - } - - if mo > len(out)+len(hist) || mo > s.windowSize { - if len(s.dict) == 0 { - return fmt.Errorf("match offset (%d) bigger than current history (%d)", mo, len(out)+len(hist)-startSize) - } - - // we may be in dictionary. - dictO := len(s.dict) - (mo - (len(out) + len(hist))) - if dictO < 0 || dictO >= len(s.dict) { - return fmt.Errorf("match offset (%d) bigger than current history (%d)", mo, len(out)+len(hist)-startSize) - } - end := dictO + ml - if end > len(s.dict) { - out = append(out, s.dict[dictO:]...) - ml -= len(s.dict) - dictO - } else { - out = append(out, s.dict[dictO:end]...) - mo = 0 - ml = 0 - } - } - - // Copy from history. - // TODO: Blocks without history could be made to ignore this completely. - if v := mo - len(out); v > 0 { - // v is the start position in history from end. - start := len(hist) - v - if ml > v { - // Some goes into current block. - // Copy remainder of history - out = append(out, hist[start:]...) - ml -= v - } else { - out = append(out, hist[start:start+ml]...) - ml = 0 - } - } - // We must be in current buffer now - if ml > 0 { - start := len(out) - mo - if ml <= len(out)-start { - // No overlap - out = append(out, out[start:start+ml]...) - } else { - // Overlapping copy - // Extend destination slice and copy one byte at the time. - out = out[:len(out)+ml] - src := out[start : start+ml] - // Destination is the space we just added. - dst := out[len(out)-ml:] - dst = dst[:len(src)] - for i := range src { - dst[i] = src[i] - } - } - } - if i == 0 { - // This is the last sequence, so we shouldn't update state. - break - } - - // Manually inlined, ~ 5-20% faster - // Update all 3 states at once. Approx 20% faster. - nBits := llState.nbBits() + mlState.nbBits() + ofState.nbBits() - if nBits == 0 { - llState = llTable[llState.newState()&maxTableMask] - mlState = mlTable[mlState.newState()&maxTableMask] - ofState = ofTable[ofState.newState()&maxTableMask] - } else { - bits := br.get32BitsFast(nBits) - - lowBits := uint16(bits >> ((ofState.nbBits() + mlState.nbBits()) & 31)) - llState = llTable[(llState.newState()+lowBits)&maxTableMask] - - lowBits = uint16(bits >> (ofState.nbBits() & 31)) - lowBits &= bitMask[mlState.nbBits()&15] - mlState = mlTable[(mlState.newState()+lowBits)&maxTableMask] - - lowBits = uint16(bits) & bitMask[ofState.nbBits()&15] - ofState = ofTable[(ofState.newState()+lowBits)&maxTableMask] - } - } - - if size := len(s.literals) + len(out) - startSize; size > maxBlockSize { - return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) - } - - // Add final literals - s.out = append(out, s.literals...) - return br.close() -} - -var bitMask [16]uint16 - -func init() { - for i := range bitMask[:] { - bitMask[i] = uint16((1 << uint(i)) - 1) - } -} - -func (s *sequenceDecs) next(br *bitReader, llState, mlState, ofState decSymbol) (ll, mo, ml int) { - // Final will not read from stream. - ll, llB := llState.final() - ml, mlB := mlState.final() - mo, moB := ofState.final() - - // extra bits are stored in reverse order. - br.fill() - mo += br.getBits(moB) - if s.maxBits > 32 { - br.fill() - } - // matchlength+literal length, max 32 bits - ml += br.getBits(mlB) - ll += br.getBits(llB) - mo = s.adjustOffset(mo, ll, moB) - return -} - -func (s *sequenceDecs) adjustOffset(offset, litLen int, offsetB uint8) int { - if offsetB > 1 { - s.prevOffset[2] = s.prevOffset[1] - s.prevOffset[1] = s.prevOffset[0] - s.prevOffset[0] = offset - return offset - } - - if litLen == 0 { - // There is an exception though, when current sequence's literals_length = 0. - // In this case, repeated offsets are shifted by one, so an offset_value of 1 means Repeated_Offset2, - // an offset_value of 2 means Repeated_Offset3, and an offset_value of 3 means Repeated_Offset1 - 1_byte. - offset++ - } - - if offset == 0 { - return s.prevOffset[0] - } - var temp int - if offset == 3 { - temp = s.prevOffset[0] - 1 - } else { - temp = s.prevOffset[offset] - } - - if temp == 0 { - // 0 is not valid; input is corrupted; force offset to 1 - println("temp was 0") - temp = 1 - } - - if offset != 1 { - s.prevOffset[2] = s.prevOffset[1] - } - s.prevOffset[1] = s.prevOffset[0] - s.prevOffset[0] = temp - return temp -} diff --git a/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go b/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go deleted file mode 100644 index c59f17e07a..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go +++ /dev/null @@ -1,394 +0,0 @@ -//go:build amd64 && !appengine && !noasm && gc -// +build amd64,!appengine,!noasm,gc - -package zstd - -import ( - "fmt" - "io" - - "github.com/klauspost/compress/internal/cpuinfo" -) - -type decodeSyncAsmContext struct { - llTable []decSymbol - mlTable []decSymbol - ofTable []decSymbol - llState uint64 - mlState uint64 - ofState uint64 - iteration int - litRemain int - out []byte - outPosition int - literals []byte - litPosition int - history []byte - windowSize int - ll int // set on error (not for all errors, please refer to _generate/gen.go) - ml int // set on error (not for all errors, please refer to _generate/gen.go) - mo int // set on error (not for all errors, please refer to _generate/gen.go) -} - -// sequenceDecs_decodeSync_amd64 implements the main loop of sequenceDecs.decodeSync in x86 asm. -// -// Please refer to seqdec_generic.go for the reference implementation. -// -//go:noescape -func sequenceDecs_decodeSync_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int - -// sequenceDecs_decodeSync_bmi2 implements the main loop of sequenceDecs.decodeSync in x86 asm with BMI2 extensions. -// -//go:noescape -func sequenceDecs_decodeSync_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int - -// sequenceDecs_decodeSync_safe_amd64 does the same as above, but does not write more than output buffer. -// -//go:noescape -func sequenceDecs_decodeSync_safe_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int - -// sequenceDecs_decodeSync_safe_bmi2 does the same as above, but does not write more than output buffer. -// -//go:noescape -func sequenceDecs_decodeSync_safe_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int - -// decode sequences from the stream with the provided history but without a dictionary. -func (s *sequenceDecs) decodeSyncSimple(hist []byte) (bool, error) { - if len(s.dict) > 0 { - return false, nil - } - if s.maxSyncLen == 0 && cap(s.out)-len(s.out) < maxCompressedBlockSize { - return false, nil - } - - // FIXME: Using unsafe memory copies leads to rare, random crashes - // with fuzz testing. It is therefore disabled for now. - const useSafe = true - /* - useSafe := false - if s.maxSyncLen == 0 && cap(s.out)-len(s.out) < maxCompressedBlockSizeAlloc { - useSafe = true - } - if s.maxSyncLen > 0 && cap(s.out)-len(s.out)-compressedBlockOverAlloc < int(s.maxSyncLen) { - useSafe = true - } - if cap(s.literals) < len(s.literals)+compressedBlockOverAlloc { - useSafe = true - } - */ - - br := s.br - - maxBlockSize := maxCompressedBlockSize - if s.windowSize < maxBlockSize { - maxBlockSize = s.windowSize - } - - ctx := decodeSyncAsmContext{ - llTable: s.litLengths.fse.dt[:maxTablesize], - mlTable: s.matchLengths.fse.dt[:maxTablesize], - ofTable: s.offsets.fse.dt[:maxTablesize], - llState: uint64(s.litLengths.state.state), - mlState: uint64(s.matchLengths.state.state), - ofState: uint64(s.offsets.state.state), - iteration: s.nSeqs - 1, - litRemain: len(s.literals), - out: s.out, - outPosition: len(s.out), - literals: s.literals, - windowSize: s.windowSize, - history: hist, - } - - s.seqSize = 0 - startSize := len(s.out) - - var errCode int - if cpuinfo.HasBMI2() { - if useSafe { - errCode = sequenceDecs_decodeSync_safe_bmi2(s, br, &ctx) - } else { - errCode = sequenceDecs_decodeSync_bmi2(s, br, &ctx) - } - } else { - if useSafe { - errCode = sequenceDecs_decodeSync_safe_amd64(s, br, &ctx) - } else { - errCode = sequenceDecs_decodeSync_amd64(s, br, &ctx) - } - } - switch errCode { - case noError: - break - - case errorMatchLenOfsMismatch: - return true, fmt.Errorf("zero matchoff and matchlen (%d) > 0", ctx.ml) - - case errorMatchLenTooBig: - return true, fmt.Errorf("match len (%d) bigger than max allowed length", ctx.ml) - - case errorMatchOffTooBig: - return true, fmt.Errorf("match offset (%d) bigger than current history (%d)", - ctx.mo, ctx.outPosition+len(hist)-startSize) - - case errorNotEnoughLiterals: - return true, fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", - ctx.ll, ctx.litRemain+ctx.ll) - - case errorOverread: - return true, io.ErrUnexpectedEOF - - case errorNotEnoughSpace: - size := ctx.outPosition + ctx.ll + ctx.ml - if debugDecoder { - println("msl:", s.maxSyncLen, "cap", cap(s.out), "bef:", startSize, "sz:", size-startSize, "mbs:", maxBlockSize, "outsz:", cap(s.out)-startSize) - } - return true, fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) - - default: - return true, fmt.Errorf("sequenceDecs_decode returned erroneous code %d", errCode) - } - - s.seqSize += ctx.litRemain - if s.seqSize > maxBlockSize { - return true, fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) - } - err := br.close() - if err != nil { - printf("Closing sequences: %v, %+v\n", err, *br) - return true, err - } - - s.literals = s.literals[ctx.litPosition:] - t := ctx.outPosition - s.out = s.out[:t] - - // Add final literals - s.out = append(s.out, s.literals...) - if debugDecoder { - t += len(s.literals) - if t != len(s.out) { - panic(fmt.Errorf("length mismatch, want %d, got %d", len(s.out), t)) - } - } - - return true, nil -} - -// -------------------------------------------------------------------------------- - -type decodeAsmContext struct { - llTable []decSymbol - mlTable []decSymbol - ofTable []decSymbol - llState uint64 - mlState uint64 - ofState uint64 - iteration int - seqs []seqVals - litRemain int -} - -const noError = 0 - -// error reported when mo == 0 && ml > 0 -const errorMatchLenOfsMismatch = 1 - -// error reported when ml > maxMatchLen -const errorMatchLenTooBig = 2 - -// error reported when mo > available history or mo > s.windowSize -const errorMatchOffTooBig = 3 - -// error reported when the sum of literal lengths exeeceds the literal buffer size -const errorNotEnoughLiterals = 4 - -// error reported when capacity of `out` is too small -const errorNotEnoughSpace = 5 - -// error reported when bits are overread. -const errorOverread = 6 - -// sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm. -// -// Please refer to seqdec_generic.go for the reference implementation. -// -//go:noescape -func sequenceDecs_decode_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int - -// sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm. -// -// Please refer to seqdec_generic.go for the reference implementation. -// -//go:noescape -func sequenceDecs_decode_56_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int - -// sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm with BMI2 extensions. -// -//go:noescape -func sequenceDecs_decode_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int - -// sequenceDecs_decode implements the main loop of sequenceDecs in x86 asm with BMI2 extensions. -// -//go:noescape -func sequenceDecs_decode_56_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int - -// decode sequences from the stream without the provided history. -func (s *sequenceDecs) decode(seqs []seqVals) error { - br := s.br - - maxBlockSize := maxCompressedBlockSize - if s.windowSize < maxBlockSize { - maxBlockSize = s.windowSize - } - - ctx := decodeAsmContext{ - llTable: s.litLengths.fse.dt[:maxTablesize], - mlTable: s.matchLengths.fse.dt[:maxTablesize], - ofTable: s.offsets.fse.dt[:maxTablesize], - llState: uint64(s.litLengths.state.state), - mlState: uint64(s.matchLengths.state.state), - ofState: uint64(s.offsets.state.state), - seqs: seqs, - iteration: len(seqs) - 1, - litRemain: len(s.literals), - } - - if debugDecoder { - println("decode: decoding", len(seqs), "sequences", br.remain(), "bits remain on stream") - } - - s.seqSize = 0 - lte56bits := s.maxBits+s.offsets.fse.actualTableLog+s.matchLengths.fse.actualTableLog+s.litLengths.fse.actualTableLog <= 56 - var errCode int - if cpuinfo.HasBMI2() { - if lte56bits { - errCode = sequenceDecs_decode_56_bmi2(s, br, &ctx) - } else { - errCode = sequenceDecs_decode_bmi2(s, br, &ctx) - } - } else { - if lte56bits { - errCode = sequenceDecs_decode_56_amd64(s, br, &ctx) - } else { - errCode = sequenceDecs_decode_amd64(s, br, &ctx) - } - } - if errCode != 0 { - i := len(seqs) - ctx.iteration - 1 - switch errCode { - case errorMatchLenOfsMismatch: - ml := ctx.seqs[i].ml - return fmt.Errorf("zero matchoff and matchlen (%d) > 0", ml) - - case errorMatchLenTooBig: - ml := ctx.seqs[i].ml - return fmt.Errorf("match len (%d) bigger than max allowed length", ml) - - case errorNotEnoughLiterals: - ll := ctx.seqs[i].ll - return fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", ll, ctx.litRemain+ll) - case errorOverread: - return io.ErrUnexpectedEOF - } - - return fmt.Errorf("sequenceDecs_decode_amd64 returned erroneous code %d", errCode) - } - - if ctx.litRemain < 0 { - return fmt.Errorf("literal count is too big: total available %d, total requested %d", - len(s.literals), len(s.literals)-ctx.litRemain) - } - - s.seqSize += ctx.litRemain - if s.seqSize > maxBlockSize { - return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) - } - if debugDecoder { - println("decode: ", br.remain(), "bits remain on stream. code:", errCode) - } - err := br.close() - if err != nil { - printf("Closing sequences: %v, %+v\n", err, *br) - } - return err -} - -// -------------------------------------------------------------------------------- - -type executeAsmContext struct { - seqs []seqVals - seqIndex int - out []byte - history []byte - literals []byte - outPosition int - litPosition int - windowSize int -} - -// sequenceDecs_executeSimple_amd64 implements the main loop of sequenceDecs.executeSimple in x86 asm. -// -// Returns false if a match offset is too big. -// -// Please refer to seqdec_generic.go for the reference implementation. -// -//go:noescape -func sequenceDecs_executeSimple_amd64(ctx *executeAsmContext) bool - -// Same as above, but with safe memcopies -// -//go:noescape -func sequenceDecs_executeSimple_safe_amd64(ctx *executeAsmContext) bool - -// executeSimple handles cases when dictionary is not used. -func (s *sequenceDecs) executeSimple(seqs []seqVals, hist []byte) error { - // Ensure we have enough output size... - if len(s.out)+s.seqSize+compressedBlockOverAlloc > cap(s.out) { - addBytes := s.seqSize + len(s.out) + compressedBlockOverAlloc - s.out = append(s.out, make([]byte, addBytes)...) - s.out = s.out[:len(s.out)-addBytes] - } - - if debugDecoder { - printf("Execute %d seqs with literals: %d into %d bytes\n", len(seqs), len(s.literals), s.seqSize) - } - - var t = len(s.out) - out := s.out[:t+s.seqSize] - - ctx := executeAsmContext{ - seqs: seqs, - seqIndex: 0, - out: out, - history: hist, - outPosition: t, - litPosition: 0, - literals: s.literals, - windowSize: s.windowSize, - } - var ok bool - if cap(s.literals) < len(s.literals)+compressedBlockOverAlloc { - ok = sequenceDecs_executeSimple_safe_amd64(&ctx) - } else { - ok = sequenceDecs_executeSimple_amd64(&ctx) - } - if !ok { - return fmt.Errorf("match offset (%d) bigger than current history (%d)", - seqs[ctx.seqIndex].mo, ctx.outPosition+len(hist)) - } - s.literals = s.literals[ctx.litPosition:] - t = ctx.outPosition - - // Add final literals - copy(out[t:], s.literals) - if debugDecoder { - t += len(s.literals) - if t != len(out) { - panic(fmt.Errorf("length mismatch, want %d, got %d, ss: %d", len(out), t, s.seqSize)) - } - } - s.out = out - - return nil -} diff --git a/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s b/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s deleted file mode 100644 index f5591fa1e8..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s +++ /dev/null @@ -1,4151 +0,0 @@ -// Code generated by command: go run gen.go -out ../seqdec_amd64.s -pkg=zstd. DO NOT EDIT. - -//go:build !appengine && !noasm && gc && !noasm - -// func sequenceDecs_decode_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int -// Requires: CMOV -TEXT ·sequenceDecs_decode_amd64(SB), $8-32 - MOVQ br+8(FP), CX - MOVQ 24(CX), DX - MOVBQZX 32(CX), BX - MOVQ (CX), AX - MOVQ 8(CX), SI - ADDQ SI, AX - MOVQ AX, (SP) - MOVQ ctx+16(FP), AX - MOVQ 72(AX), DI - MOVQ 80(AX), R8 - MOVQ 88(AX), R9 - MOVQ 104(AX), R10 - MOVQ s+0(FP), AX - MOVQ 144(AX), R11 - MOVQ 152(AX), R12 - MOVQ 160(AX), R13 - -sequenceDecs_decode_amd64_main_loop: - MOVQ (SP), R14 - - // Fill bitreader to have enough for the offset and match length. - CMPQ SI, $0x08 - JL sequenceDecs_decode_amd64_fill_byte_by_byte - MOVQ BX, AX - SHRQ $0x03, AX - SUBQ AX, R14 - MOVQ (R14), DX - SUBQ AX, SI - ANDQ $0x07, BX - JMP sequenceDecs_decode_amd64_fill_end - -sequenceDecs_decode_amd64_fill_byte_by_byte: - CMPQ SI, $0x00 - JLE sequenceDecs_decode_amd64_fill_check_overread - CMPQ BX, $0x07 - JLE sequenceDecs_decode_amd64_fill_end - SHLQ $0x08, DX - SUBQ $0x01, R14 - SUBQ $0x01, SI - SUBQ $0x08, BX - MOVBQZX (R14), AX - ORQ AX, DX - JMP sequenceDecs_decode_amd64_fill_byte_by_byte - -sequenceDecs_decode_amd64_fill_check_overread: - CMPQ BX, $0x40 - JA error_overread - -sequenceDecs_decode_amd64_fill_end: - // Update offset - MOVQ R9, AX - MOVQ BX, CX - MOVQ DX, R15 - SHLQ CL, R15 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decode_amd64_of_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decode_amd64_of_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decode_amd64_of_update_zero - NEGQ CX - SHRQ CL, R15 - ADDQ R15, AX - -sequenceDecs_decode_amd64_of_update_zero: - MOVQ AX, 16(R10) - - // Update match length - MOVQ R8, AX - MOVQ BX, CX - MOVQ DX, R15 - SHLQ CL, R15 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decode_amd64_ml_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decode_amd64_ml_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decode_amd64_ml_update_zero - NEGQ CX - SHRQ CL, R15 - ADDQ R15, AX - -sequenceDecs_decode_amd64_ml_update_zero: - MOVQ AX, 8(R10) - - // Fill bitreader to have enough for the remaining - CMPQ SI, $0x08 - JL sequenceDecs_decode_amd64_fill_2_byte_by_byte - MOVQ BX, AX - SHRQ $0x03, AX - SUBQ AX, R14 - MOVQ (R14), DX - SUBQ AX, SI - ANDQ $0x07, BX - JMP sequenceDecs_decode_amd64_fill_2_end - -sequenceDecs_decode_amd64_fill_2_byte_by_byte: - CMPQ SI, $0x00 - JLE sequenceDecs_decode_amd64_fill_2_check_overread - CMPQ BX, $0x07 - JLE sequenceDecs_decode_amd64_fill_2_end - SHLQ $0x08, DX - SUBQ $0x01, R14 - SUBQ $0x01, SI - SUBQ $0x08, BX - MOVBQZX (R14), AX - ORQ AX, DX - JMP sequenceDecs_decode_amd64_fill_2_byte_by_byte - -sequenceDecs_decode_amd64_fill_2_check_overread: - CMPQ BX, $0x40 - JA error_overread - -sequenceDecs_decode_amd64_fill_2_end: - // Update literal length - MOVQ DI, AX - MOVQ BX, CX - MOVQ DX, R15 - SHLQ CL, R15 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decode_amd64_ll_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decode_amd64_ll_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decode_amd64_ll_update_zero - NEGQ CX - SHRQ CL, R15 - ADDQ R15, AX - -sequenceDecs_decode_amd64_ll_update_zero: - MOVQ AX, (R10) - - // Fill bitreader for state updates - MOVQ R14, (SP) - MOVQ R9, AX - SHRQ $0x08, AX - MOVBQZX AL, AX - MOVQ ctx+16(FP), CX - CMPQ 96(CX), $0x00 - JZ sequenceDecs_decode_amd64_skip_update - - // Update Literal Length State - MOVBQZX DI, R14 - SHRL $0x10, DI - LEAQ (BX)(R14*1), CX - MOVQ DX, R15 - MOVQ CX, BX - ROLQ CL, R15 - MOVL $0x00000001, BP - MOVB R14, CL - SHLL CL, BP - DECL BP - ANDQ BP, R15 - ADDQ R15, DI - - // Load ctx.llTable - MOVQ ctx+16(FP), CX - MOVQ (CX), CX - MOVQ (CX)(DI*8), DI - - // Update Match Length State - MOVBQZX R8, R14 - SHRL $0x10, R8 - LEAQ (BX)(R14*1), CX - MOVQ DX, R15 - MOVQ CX, BX - ROLQ CL, R15 - MOVL $0x00000001, BP - MOVB R14, CL - SHLL CL, BP - DECL BP - ANDQ BP, R15 - ADDQ R15, R8 - - // Load ctx.mlTable - MOVQ ctx+16(FP), CX - MOVQ 24(CX), CX - MOVQ (CX)(R8*8), R8 - - // Update Offset State - MOVBQZX R9, R14 - SHRL $0x10, R9 - LEAQ (BX)(R14*1), CX - MOVQ DX, R15 - MOVQ CX, BX - ROLQ CL, R15 - MOVL $0x00000001, BP - MOVB R14, CL - SHLL CL, BP - DECL BP - ANDQ BP, R15 - ADDQ R15, R9 - - // Load ctx.ofTable - MOVQ ctx+16(FP), CX - MOVQ 48(CX), CX - MOVQ (CX)(R9*8), R9 - -sequenceDecs_decode_amd64_skip_update: - // Adjust offset - MOVQ 16(R10), CX - CMPQ AX, $0x01 - JBE sequenceDecs_decode_amd64_adjust_offsetB_1_or_0 - MOVQ R12, R13 - MOVQ R11, R12 - MOVQ CX, R11 - JMP sequenceDecs_decode_amd64_after_adjust - -sequenceDecs_decode_amd64_adjust_offsetB_1_or_0: - CMPQ (R10), $0x00000000 - JNE sequenceDecs_decode_amd64_adjust_offset_maybezero - INCQ CX - JMP sequenceDecs_decode_amd64_adjust_offset_nonzero - -sequenceDecs_decode_amd64_adjust_offset_maybezero: - TESTQ CX, CX - JNZ sequenceDecs_decode_amd64_adjust_offset_nonzero - MOVQ R11, CX - JMP sequenceDecs_decode_amd64_after_adjust - -sequenceDecs_decode_amd64_adjust_offset_nonzero: - CMPQ CX, $0x01 - JB sequenceDecs_decode_amd64_adjust_zero - JEQ sequenceDecs_decode_amd64_adjust_one - CMPQ CX, $0x02 - JA sequenceDecs_decode_amd64_adjust_three - JMP sequenceDecs_decode_amd64_adjust_two - -sequenceDecs_decode_amd64_adjust_zero: - MOVQ R11, AX - JMP sequenceDecs_decode_amd64_adjust_test_temp_valid - -sequenceDecs_decode_amd64_adjust_one: - MOVQ R12, AX - JMP sequenceDecs_decode_amd64_adjust_test_temp_valid - -sequenceDecs_decode_amd64_adjust_two: - MOVQ R13, AX - JMP sequenceDecs_decode_amd64_adjust_test_temp_valid - -sequenceDecs_decode_amd64_adjust_three: - LEAQ -1(R11), AX - -sequenceDecs_decode_amd64_adjust_test_temp_valid: - TESTQ AX, AX - JNZ sequenceDecs_decode_amd64_adjust_temp_valid - MOVQ $0x00000001, AX - -sequenceDecs_decode_amd64_adjust_temp_valid: - CMPQ CX, $0x01 - CMOVQNE R12, R13 - MOVQ R11, R12 - MOVQ AX, R11 - MOVQ AX, CX - -sequenceDecs_decode_amd64_after_adjust: - MOVQ CX, 16(R10) - - // Check values - MOVQ 8(R10), AX - MOVQ (R10), R14 - LEAQ (AX)(R14*1), R15 - MOVQ s+0(FP), BP - ADDQ R15, 256(BP) - MOVQ ctx+16(FP), R15 - SUBQ R14, 128(R15) - JS error_not_enough_literals - CMPQ AX, $0x00020002 - JA sequenceDecs_decode_amd64_error_match_len_too_big - TESTQ CX, CX - JNZ sequenceDecs_decode_amd64_match_len_ofs_ok - TESTQ AX, AX - JNZ sequenceDecs_decode_amd64_error_match_len_ofs_mismatch - -sequenceDecs_decode_amd64_match_len_ofs_ok: - ADDQ $0x18, R10 - MOVQ ctx+16(FP), AX - DECQ 96(AX) - JNS sequenceDecs_decode_amd64_main_loop - MOVQ s+0(FP), AX - MOVQ R11, 144(AX) - MOVQ R12, 152(AX) - MOVQ R13, 160(AX) - MOVQ br+8(FP), AX - MOVQ DX, 24(AX) - MOVB BL, 32(AX) - MOVQ SI, 8(AX) - - // Return success - MOVQ $0x00000000, ret+24(FP) - RET - - // Return with match length error -sequenceDecs_decode_amd64_error_match_len_ofs_mismatch: - MOVQ $0x00000001, ret+24(FP) - RET - - // Return with match too long error -sequenceDecs_decode_amd64_error_match_len_too_big: - MOVQ $0x00000002, ret+24(FP) - RET - - // Return with match offset too long error - MOVQ $0x00000003, ret+24(FP) - RET - - // Return with not enough literals error -error_not_enough_literals: - MOVQ $0x00000004, ret+24(FP) - RET - - // Return with overread error -error_overread: - MOVQ $0x00000006, ret+24(FP) - RET - -// func sequenceDecs_decode_56_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int -// Requires: CMOV -TEXT ·sequenceDecs_decode_56_amd64(SB), $8-32 - MOVQ br+8(FP), CX - MOVQ 24(CX), DX - MOVBQZX 32(CX), BX - MOVQ (CX), AX - MOVQ 8(CX), SI - ADDQ SI, AX - MOVQ AX, (SP) - MOVQ ctx+16(FP), AX - MOVQ 72(AX), DI - MOVQ 80(AX), R8 - MOVQ 88(AX), R9 - MOVQ 104(AX), R10 - MOVQ s+0(FP), AX - MOVQ 144(AX), R11 - MOVQ 152(AX), R12 - MOVQ 160(AX), R13 - -sequenceDecs_decode_56_amd64_main_loop: - MOVQ (SP), R14 - - // Fill bitreader to have enough for the offset and match length. - CMPQ SI, $0x08 - JL sequenceDecs_decode_56_amd64_fill_byte_by_byte - MOVQ BX, AX - SHRQ $0x03, AX - SUBQ AX, R14 - MOVQ (R14), DX - SUBQ AX, SI - ANDQ $0x07, BX - JMP sequenceDecs_decode_56_amd64_fill_end - -sequenceDecs_decode_56_amd64_fill_byte_by_byte: - CMPQ SI, $0x00 - JLE sequenceDecs_decode_56_amd64_fill_check_overread - CMPQ BX, $0x07 - JLE sequenceDecs_decode_56_amd64_fill_end - SHLQ $0x08, DX - SUBQ $0x01, R14 - SUBQ $0x01, SI - SUBQ $0x08, BX - MOVBQZX (R14), AX - ORQ AX, DX - JMP sequenceDecs_decode_56_amd64_fill_byte_by_byte - -sequenceDecs_decode_56_amd64_fill_check_overread: - CMPQ BX, $0x40 - JA error_overread - -sequenceDecs_decode_56_amd64_fill_end: - // Update offset - MOVQ R9, AX - MOVQ BX, CX - MOVQ DX, R15 - SHLQ CL, R15 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decode_56_amd64_of_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decode_56_amd64_of_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decode_56_amd64_of_update_zero - NEGQ CX - SHRQ CL, R15 - ADDQ R15, AX - -sequenceDecs_decode_56_amd64_of_update_zero: - MOVQ AX, 16(R10) - - // Update match length - MOVQ R8, AX - MOVQ BX, CX - MOVQ DX, R15 - SHLQ CL, R15 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decode_56_amd64_ml_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decode_56_amd64_ml_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decode_56_amd64_ml_update_zero - NEGQ CX - SHRQ CL, R15 - ADDQ R15, AX - -sequenceDecs_decode_56_amd64_ml_update_zero: - MOVQ AX, 8(R10) - - // Update literal length - MOVQ DI, AX - MOVQ BX, CX - MOVQ DX, R15 - SHLQ CL, R15 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decode_56_amd64_ll_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decode_56_amd64_ll_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decode_56_amd64_ll_update_zero - NEGQ CX - SHRQ CL, R15 - ADDQ R15, AX - -sequenceDecs_decode_56_amd64_ll_update_zero: - MOVQ AX, (R10) - - // Fill bitreader for state updates - MOVQ R14, (SP) - MOVQ R9, AX - SHRQ $0x08, AX - MOVBQZX AL, AX - MOVQ ctx+16(FP), CX - CMPQ 96(CX), $0x00 - JZ sequenceDecs_decode_56_amd64_skip_update - - // Update Literal Length State - MOVBQZX DI, R14 - SHRL $0x10, DI - LEAQ (BX)(R14*1), CX - MOVQ DX, R15 - MOVQ CX, BX - ROLQ CL, R15 - MOVL $0x00000001, BP - MOVB R14, CL - SHLL CL, BP - DECL BP - ANDQ BP, R15 - ADDQ R15, DI - - // Load ctx.llTable - MOVQ ctx+16(FP), CX - MOVQ (CX), CX - MOVQ (CX)(DI*8), DI - - // Update Match Length State - MOVBQZX R8, R14 - SHRL $0x10, R8 - LEAQ (BX)(R14*1), CX - MOVQ DX, R15 - MOVQ CX, BX - ROLQ CL, R15 - MOVL $0x00000001, BP - MOVB R14, CL - SHLL CL, BP - DECL BP - ANDQ BP, R15 - ADDQ R15, R8 - - // Load ctx.mlTable - MOVQ ctx+16(FP), CX - MOVQ 24(CX), CX - MOVQ (CX)(R8*8), R8 - - // Update Offset State - MOVBQZX R9, R14 - SHRL $0x10, R9 - LEAQ (BX)(R14*1), CX - MOVQ DX, R15 - MOVQ CX, BX - ROLQ CL, R15 - MOVL $0x00000001, BP - MOVB R14, CL - SHLL CL, BP - DECL BP - ANDQ BP, R15 - ADDQ R15, R9 - - // Load ctx.ofTable - MOVQ ctx+16(FP), CX - MOVQ 48(CX), CX - MOVQ (CX)(R9*8), R9 - -sequenceDecs_decode_56_amd64_skip_update: - // Adjust offset - MOVQ 16(R10), CX - CMPQ AX, $0x01 - JBE sequenceDecs_decode_56_amd64_adjust_offsetB_1_or_0 - MOVQ R12, R13 - MOVQ R11, R12 - MOVQ CX, R11 - JMP sequenceDecs_decode_56_amd64_after_adjust - -sequenceDecs_decode_56_amd64_adjust_offsetB_1_or_0: - CMPQ (R10), $0x00000000 - JNE sequenceDecs_decode_56_amd64_adjust_offset_maybezero - INCQ CX - JMP sequenceDecs_decode_56_amd64_adjust_offset_nonzero - -sequenceDecs_decode_56_amd64_adjust_offset_maybezero: - TESTQ CX, CX - JNZ sequenceDecs_decode_56_amd64_adjust_offset_nonzero - MOVQ R11, CX - JMP sequenceDecs_decode_56_amd64_after_adjust - -sequenceDecs_decode_56_amd64_adjust_offset_nonzero: - CMPQ CX, $0x01 - JB sequenceDecs_decode_56_amd64_adjust_zero - JEQ sequenceDecs_decode_56_amd64_adjust_one - CMPQ CX, $0x02 - JA sequenceDecs_decode_56_amd64_adjust_three - JMP sequenceDecs_decode_56_amd64_adjust_two - -sequenceDecs_decode_56_amd64_adjust_zero: - MOVQ R11, AX - JMP sequenceDecs_decode_56_amd64_adjust_test_temp_valid - -sequenceDecs_decode_56_amd64_adjust_one: - MOVQ R12, AX - JMP sequenceDecs_decode_56_amd64_adjust_test_temp_valid - -sequenceDecs_decode_56_amd64_adjust_two: - MOVQ R13, AX - JMP sequenceDecs_decode_56_amd64_adjust_test_temp_valid - -sequenceDecs_decode_56_amd64_adjust_three: - LEAQ -1(R11), AX - -sequenceDecs_decode_56_amd64_adjust_test_temp_valid: - TESTQ AX, AX - JNZ sequenceDecs_decode_56_amd64_adjust_temp_valid - MOVQ $0x00000001, AX - -sequenceDecs_decode_56_amd64_adjust_temp_valid: - CMPQ CX, $0x01 - CMOVQNE R12, R13 - MOVQ R11, R12 - MOVQ AX, R11 - MOVQ AX, CX - -sequenceDecs_decode_56_amd64_after_adjust: - MOVQ CX, 16(R10) - - // Check values - MOVQ 8(R10), AX - MOVQ (R10), R14 - LEAQ (AX)(R14*1), R15 - MOVQ s+0(FP), BP - ADDQ R15, 256(BP) - MOVQ ctx+16(FP), R15 - SUBQ R14, 128(R15) - JS error_not_enough_literals - CMPQ AX, $0x00020002 - JA sequenceDecs_decode_56_amd64_error_match_len_too_big - TESTQ CX, CX - JNZ sequenceDecs_decode_56_amd64_match_len_ofs_ok - TESTQ AX, AX - JNZ sequenceDecs_decode_56_amd64_error_match_len_ofs_mismatch - -sequenceDecs_decode_56_amd64_match_len_ofs_ok: - ADDQ $0x18, R10 - MOVQ ctx+16(FP), AX - DECQ 96(AX) - JNS sequenceDecs_decode_56_amd64_main_loop - MOVQ s+0(FP), AX - MOVQ R11, 144(AX) - MOVQ R12, 152(AX) - MOVQ R13, 160(AX) - MOVQ br+8(FP), AX - MOVQ DX, 24(AX) - MOVB BL, 32(AX) - MOVQ SI, 8(AX) - - // Return success - MOVQ $0x00000000, ret+24(FP) - RET - - // Return with match length error -sequenceDecs_decode_56_amd64_error_match_len_ofs_mismatch: - MOVQ $0x00000001, ret+24(FP) - RET - - // Return with match too long error -sequenceDecs_decode_56_amd64_error_match_len_too_big: - MOVQ $0x00000002, ret+24(FP) - RET - - // Return with match offset too long error - MOVQ $0x00000003, ret+24(FP) - RET - - // Return with not enough literals error -error_not_enough_literals: - MOVQ $0x00000004, ret+24(FP) - RET - - // Return with overread error -error_overread: - MOVQ $0x00000006, ret+24(FP) - RET - -// func sequenceDecs_decode_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int -// Requires: BMI, BMI2, CMOV -TEXT ·sequenceDecs_decode_bmi2(SB), $8-32 - MOVQ br+8(FP), BX - MOVQ 24(BX), AX - MOVBQZX 32(BX), DX - MOVQ (BX), CX - MOVQ 8(BX), BX - ADDQ BX, CX - MOVQ CX, (SP) - MOVQ ctx+16(FP), CX - MOVQ 72(CX), SI - MOVQ 80(CX), DI - MOVQ 88(CX), R8 - MOVQ 104(CX), R9 - MOVQ s+0(FP), CX - MOVQ 144(CX), R10 - MOVQ 152(CX), R11 - MOVQ 160(CX), R12 - -sequenceDecs_decode_bmi2_main_loop: - MOVQ (SP), R13 - - // Fill bitreader to have enough for the offset and match length. - CMPQ BX, $0x08 - JL sequenceDecs_decode_bmi2_fill_byte_by_byte - MOVQ DX, CX - SHRQ $0x03, CX - SUBQ CX, R13 - MOVQ (R13), AX - SUBQ CX, BX - ANDQ $0x07, DX - JMP sequenceDecs_decode_bmi2_fill_end - -sequenceDecs_decode_bmi2_fill_byte_by_byte: - CMPQ BX, $0x00 - JLE sequenceDecs_decode_bmi2_fill_check_overread - CMPQ DX, $0x07 - JLE sequenceDecs_decode_bmi2_fill_end - SHLQ $0x08, AX - SUBQ $0x01, R13 - SUBQ $0x01, BX - SUBQ $0x08, DX - MOVBQZX (R13), CX - ORQ CX, AX - JMP sequenceDecs_decode_bmi2_fill_byte_by_byte - -sequenceDecs_decode_bmi2_fill_check_overread: - CMPQ DX, $0x40 - JA error_overread - -sequenceDecs_decode_bmi2_fill_end: - // Update offset - MOVQ $0x00000808, CX - BEXTRQ CX, R8, R14 - MOVQ AX, R15 - LEAQ (DX)(R14*1), CX - ROLQ CL, R15 - BZHIQ R14, R15, R15 - MOVQ CX, DX - MOVQ R8, CX - SHRQ $0x20, CX - ADDQ R15, CX - MOVQ CX, 16(R9) - - // Update match length - MOVQ $0x00000808, CX - BEXTRQ CX, DI, R14 - MOVQ AX, R15 - LEAQ (DX)(R14*1), CX - ROLQ CL, R15 - BZHIQ R14, R15, R15 - MOVQ CX, DX - MOVQ DI, CX - SHRQ $0x20, CX - ADDQ R15, CX - MOVQ CX, 8(R9) - - // Fill bitreader to have enough for the remaining - CMPQ BX, $0x08 - JL sequenceDecs_decode_bmi2_fill_2_byte_by_byte - MOVQ DX, CX - SHRQ $0x03, CX - SUBQ CX, R13 - MOVQ (R13), AX - SUBQ CX, BX - ANDQ $0x07, DX - JMP sequenceDecs_decode_bmi2_fill_2_end - -sequenceDecs_decode_bmi2_fill_2_byte_by_byte: - CMPQ BX, $0x00 - JLE sequenceDecs_decode_bmi2_fill_2_check_overread - CMPQ DX, $0x07 - JLE sequenceDecs_decode_bmi2_fill_2_end - SHLQ $0x08, AX - SUBQ $0x01, R13 - SUBQ $0x01, BX - SUBQ $0x08, DX - MOVBQZX (R13), CX - ORQ CX, AX - JMP sequenceDecs_decode_bmi2_fill_2_byte_by_byte - -sequenceDecs_decode_bmi2_fill_2_check_overread: - CMPQ DX, $0x40 - JA error_overread - -sequenceDecs_decode_bmi2_fill_2_end: - // Update literal length - MOVQ $0x00000808, CX - BEXTRQ CX, SI, R14 - MOVQ AX, R15 - LEAQ (DX)(R14*1), CX - ROLQ CL, R15 - BZHIQ R14, R15, R15 - MOVQ CX, DX - MOVQ SI, CX - SHRQ $0x20, CX - ADDQ R15, CX - MOVQ CX, (R9) - - // Fill bitreader for state updates - MOVQ R13, (SP) - MOVQ $0x00000808, CX - BEXTRQ CX, R8, R13 - MOVQ ctx+16(FP), CX - CMPQ 96(CX), $0x00 - JZ sequenceDecs_decode_bmi2_skip_update - LEAQ (SI)(DI*1), R14 - ADDQ R8, R14 - MOVBQZX R14, R14 - LEAQ (DX)(R14*1), CX - MOVQ AX, R15 - MOVQ CX, DX - ROLQ CL, R15 - BZHIQ R14, R15, R15 - - // Update Offset State - BZHIQ R8, R15, CX - SHRXQ R8, R15, R15 - SHRL $0x10, R8 - ADDQ CX, R8 - - // Load ctx.ofTable - MOVQ ctx+16(FP), CX - MOVQ 48(CX), CX - MOVQ (CX)(R8*8), R8 - - // Update Match Length State - BZHIQ DI, R15, CX - SHRXQ DI, R15, R15 - SHRL $0x10, DI - ADDQ CX, DI - - // Load ctx.mlTable - MOVQ ctx+16(FP), CX - MOVQ 24(CX), CX - MOVQ (CX)(DI*8), DI - - // Update Literal Length State - BZHIQ SI, R15, CX - SHRL $0x10, SI - ADDQ CX, SI - - // Load ctx.llTable - MOVQ ctx+16(FP), CX - MOVQ (CX), CX - MOVQ (CX)(SI*8), SI - -sequenceDecs_decode_bmi2_skip_update: - // Adjust offset - MOVQ 16(R9), CX - CMPQ R13, $0x01 - JBE sequenceDecs_decode_bmi2_adjust_offsetB_1_or_0 - MOVQ R11, R12 - MOVQ R10, R11 - MOVQ CX, R10 - JMP sequenceDecs_decode_bmi2_after_adjust - -sequenceDecs_decode_bmi2_adjust_offsetB_1_or_0: - CMPQ (R9), $0x00000000 - JNE sequenceDecs_decode_bmi2_adjust_offset_maybezero - INCQ CX - JMP sequenceDecs_decode_bmi2_adjust_offset_nonzero - -sequenceDecs_decode_bmi2_adjust_offset_maybezero: - TESTQ CX, CX - JNZ sequenceDecs_decode_bmi2_adjust_offset_nonzero - MOVQ R10, CX - JMP sequenceDecs_decode_bmi2_after_adjust - -sequenceDecs_decode_bmi2_adjust_offset_nonzero: - CMPQ CX, $0x01 - JB sequenceDecs_decode_bmi2_adjust_zero - JEQ sequenceDecs_decode_bmi2_adjust_one - CMPQ CX, $0x02 - JA sequenceDecs_decode_bmi2_adjust_three - JMP sequenceDecs_decode_bmi2_adjust_two - -sequenceDecs_decode_bmi2_adjust_zero: - MOVQ R10, R13 - JMP sequenceDecs_decode_bmi2_adjust_test_temp_valid - -sequenceDecs_decode_bmi2_adjust_one: - MOVQ R11, R13 - JMP sequenceDecs_decode_bmi2_adjust_test_temp_valid - -sequenceDecs_decode_bmi2_adjust_two: - MOVQ R12, R13 - JMP sequenceDecs_decode_bmi2_adjust_test_temp_valid - -sequenceDecs_decode_bmi2_adjust_three: - LEAQ -1(R10), R13 - -sequenceDecs_decode_bmi2_adjust_test_temp_valid: - TESTQ R13, R13 - JNZ sequenceDecs_decode_bmi2_adjust_temp_valid - MOVQ $0x00000001, R13 - -sequenceDecs_decode_bmi2_adjust_temp_valid: - CMPQ CX, $0x01 - CMOVQNE R11, R12 - MOVQ R10, R11 - MOVQ R13, R10 - MOVQ R13, CX - -sequenceDecs_decode_bmi2_after_adjust: - MOVQ CX, 16(R9) - - // Check values - MOVQ 8(R9), R13 - MOVQ (R9), R14 - LEAQ (R13)(R14*1), R15 - MOVQ s+0(FP), BP - ADDQ R15, 256(BP) - MOVQ ctx+16(FP), R15 - SUBQ R14, 128(R15) - JS error_not_enough_literals - CMPQ R13, $0x00020002 - JA sequenceDecs_decode_bmi2_error_match_len_too_big - TESTQ CX, CX - JNZ sequenceDecs_decode_bmi2_match_len_ofs_ok - TESTQ R13, R13 - JNZ sequenceDecs_decode_bmi2_error_match_len_ofs_mismatch - -sequenceDecs_decode_bmi2_match_len_ofs_ok: - ADDQ $0x18, R9 - MOVQ ctx+16(FP), CX - DECQ 96(CX) - JNS sequenceDecs_decode_bmi2_main_loop - MOVQ s+0(FP), CX - MOVQ R10, 144(CX) - MOVQ R11, 152(CX) - MOVQ R12, 160(CX) - MOVQ br+8(FP), CX - MOVQ AX, 24(CX) - MOVB DL, 32(CX) - MOVQ BX, 8(CX) - - // Return success - MOVQ $0x00000000, ret+24(FP) - RET - - // Return with match length error -sequenceDecs_decode_bmi2_error_match_len_ofs_mismatch: - MOVQ $0x00000001, ret+24(FP) - RET - - // Return with match too long error -sequenceDecs_decode_bmi2_error_match_len_too_big: - MOVQ $0x00000002, ret+24(FP) - RET - - // Return with match offset too long error - MOVQ $0x00000003, ret+24(FP) - RET - - // Return with not enough literals error -error_not_enough_literals: - MOVQ $0x00000004, ret+24(FP) - RET - - // Return with overread error -error_overread: - MOVQ $0x00000006, ret+24(FP) - RET - -// func sequenceDecs_decode_56_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int -// Requires: BMI, BMI2, CMOV -TEXT ·sequenceDecs_decode_56_bmi2(SB), $8-32 - MOVQ br+8(FP), BX - MOVQ 24(BX), AX - MOVBQZX 32(BX), DX - MOVQ (BX), CX - MOVQ 8(BX), BX - ADDQ BX, CX - MOVQ CX, (SP) - MOVQ ctx+16(FP), CX - MOVQ 72(CX), SI - MOVQ 80(CX), DI - MOVQ 88(CX), R8 - MOVQ 104(CX), R9 - MOVQ s+0(FP), CX - MOVQ 144(CX), R10 - MOVQ 152(CX), R11 - MOVQ 160(CX), R12 - -sequenceDecs_decode_56_bmi2_main_loop: - MOVQ (SP), R13 - - // Fill bitreader to have enough for the offset and match length. - CMPQ BX, $0x08 - JL sequenceDecs_decode_56_bmi2_fill_byte_by_byte - MOVQ DX, CX - SHRQ $0x03, CX - SUBQ CX, R13 - MOVQ (R13), AX - SUBQ CX, BX - ANDQ $0x07, DX - JMP sequenceDecs_decode_56_bmi2_fill_end - -sequenceDecs_decode_56_bmi2_fill_byte_by_byte: - CMPQ BX, $0x00 - JLE sequenceDecs_decode_56_bmi2_fill_check_overread - CMPQ DX, $0x07 - JLE sequenceDecs_decode_56_bmi2_fill_end - SHLQ $0x08, AX - SUBQ $0x01, R13 - SUBQ $0x01, BX - SUBQ $0x08, DX - MOVBQZX (R13), CX - ORQ CX, AX - JMP sequenceDecs_decode_56_bmi2_fill_byte_by_byte - -sequenceDecs_decode_56_bmi2_fill_check_overread: - CMPQ DX, $0x40 - JA error_overread - -sequenceDecs_decode_56_bmi2_fill_end: - // Update offset - MOVQ $0x00000808, CX - BEXTRQ CX, R8, R14 - MOVQ AX, R15 - LEAQ (DX)(R14*1), CX - ROLQ CL, R15 - BZHIQ R14, R15, R15 - MOVQ CX, DX - MOVQ R8, CX - SHRQ $0x20, CX - ADDQ R15, CX - MOVQ CX, 16(R9) - - // Update match length - MOVQ $0x00000808, CX - BEXTRQ CX, DI, R14 - MOVQ AX, R15 - LEAQ (DX)(R14*1), CX - ROLQ CL, R15 - BZHIQ R14, R15, R15 - MOVQ CX, DX - MOVQ DI, CX - SHRQ $0x20, CX - ADDQ R15, CX - MOVQ CX, 8(R9) - - // Update literal length - MOVQ $0x00000808, CX - BEXTRQ CX, SI, R14 - MOVQ AX, R15 - LEAQ (DX)(R14*1), CX - ROLQ CL, R15 - BZHIQ R14, R15, R15 - MOVQ CX, DX - MOVQ SI, CX - SHRQ $0x20, CX - ADDQ R15, CX - MOVQ CX, (R9) - - // Fill bitreader for state updates - MOVQ R13, (SP) - MOVQ $0x00000808, CX - BEXTRQ CX, R8, R13 - MOVQ ctx+16(FP), CX - CMPQ 96(CX), $0x00 - JZ sequenceDecs_decode_56_bmi2_skip_update - LEAQ (SI)(DI*1), R14 - ADDQ R8, R14 - MOVBQZX R14, R14 - LEAQ (DX)(R14*1), CX - MOVQ AX, R15 - MOVQ CX, DX - ROLQ CL, R15 - BZHIQ R14, R15, R15 - - // Update Offset State - BZHIQ R8, R15, CX - SHRXQ R8, R15, R15 - SHRL $0x10, R8 - ADDQ CX, R8 - - // Load ctx.ofTable - MOVQ ctx+16(FP), CX - MOVQ 48(CX), CX - MOVQ (CX)(R8*8), R8 - - // Update Match Length State - BZHIQ DI, R15, CX - SHRXQ DI, R15, R15 - SHRL $0x10, DI - ADDQ CX, DI - - // Load ctx.mlTable - MOVQ ctx+16(FP), CX - MOVQ 24(CX), CX - MOVQ (CX)(DI*8), DI - - // Update Literal Length State - BZHIQ SI, R15, CX - SHRL $0x10, SI - ADDQ CX, SI - - // Load ctx.llTable - MOVQ ctx+16(FP), CX - MOVQ (CX), CX - MOVQ (CX)(SI*8), SI - -sequenceDecs_decode_56_bmi2_skip_update: - // Adjust offset - MOVQ 16(R9), CX - CMPQ R13, $0x01 - JBE sequenceDecs_decode_56_bmi2_adjust_offsetB_1_or_0 - MOVQ R11, R12 - MOVQ R10, R11 - MOVQ CX, R10 - JMP sequenceDecs_decode_56_bmi2_after_adjust - -sequenceDecs_decode_56_bmi2_adjust_offsetB_1_or_0: - CMPQ (R9), $0x00000000 - JNE sequenceDecs_decode_56_bmi2_adjust_offset_maybezero - INCQ CX - JMP sequenceDecs_decode_56_bmi2_adjust_offset_nonzero - -sequenceDecs_decode_56_bmi2_adjust_offset_maybezero: - TESTQ CX, CX - JNZ sequenceDecs_decode_56_bmi2_adjust_offset_nonzero - MOVQ R10, CX - JMP sequenceDecs_decode_56_bmi2_after_adjust - -sequenceDecs_decode_56_bmi2_adjust_offset_nonzero: - CMPQ CX, $0x01 - JB sequenceDecs_decode_56_bmi2_adjust_zero - JEQ sequenceDecs_decode_56_bmi2_adjust_one - CMPQ CX, $0x02 - JA sequenceDecs_decode_56_bmi2_adjust_three - JMP sequenceDecs_decode_56_bmi2_adjust_two - -sequenceDecs_decode_56_bmi2_adjust_zero: - MOVQ R10, R13 - JMP sequenceDecs_decode_56_bmi2_adjust_test_temp_valid - -sequenceDecs_decode_56_bmi2_adjust_one: - MOVQ R11, R13 - JMP sequenceDecs_decode_56_bmi2_adjust_test_temp_valid - -sequenceDecs_decode_56_bmi2_adjust_two: - MOVQ R12, R13 - JMP sequenceDecs_decode_56_bmi2_adjust_test_temp_valid - -sequenceDecs_decode_56_bmi2_adjust_three: - LEAQ -1(R10), R13 - -sequenceDecs_decode_56_bmi2_adjust_test_temp_valid: - TESTQ R13, R13 - JNZ sequenceDecs_decode_56_bmi2_adjust_temp_valid - MOVQ $0x00000001, R13 - -sequenceDecs_decode_56_bmi2_adjust_temp_valid: - CMPQ CX, $0x01 - CMOVQNE R11, R12 - MOVQ R10, R11 - MOVQ R13, R10 - MOVQ R13, CX - -sequenceDecs_decode_56_bmi2_after_adjust: - MOVQ CX, 16(R9) - - // Check values - MOVQ 8(R9), R13 - MOVQ (R9), R14 - LEAQ (R13)(R14*1), R15 - MOVQ s+0(FP), BP - ADDQ R15, 256(BP) - MOVQ ctx+16(FP), R15 - SUBQ R14, 128(R15) - JS error_not_enough_literals - CMPQ R13, $0x00020002 - JA sequenceDecs_decode_56_bmi2_error_match_len_too_big - TESTQ CX, CX - JNZ sequenceDecs_decode_56_bmi2_match_len_ofs_ok - TESTQ R13, R13 - JNZ sequenceDecs_decode_56_bmi2_error_match_len_ofs_mismatch - -sequenceDecs_decode_56_bmi2_match_len_ofs_ok: - ADDQ $0x18, R9 - MOVQ ctx+16(FP), CX - DECQ 96(CX) - JNS sequenceDecs_decode_56_bmi2_main_loop - MOVQ s+0(FP), CX - MOVQ R10, 144(CX) - MOVQ R11, 152(CX) - MOVQ R12, 160(CX) - MOVQ br+8(FP), CX - MOVQ AX, 24(CX) - MOVB DL, 32(CX) - MOVQ BX, 8(CX) - - // Return success - MOVQ $0x00000000, ret+24(FP) - RET - - // Return with match length error -sequenceDecs_decode_56_bmi2_error_match_len_ofs_mismatch: - MOVQ $0x00000001, ret+24(FP) - RET - - // Return with match too long error -sequenceDecs_decode_56_bmi2_error_match_len_too_big: - MOVQ $0x00000002, ret+24(FP) - RET - - // Return with match offset too long error - MOVQ $0x00000003, ret+24(FP) - RET - - // Return with not enough literals error -error_not_enough_literals: - MOVQ $0x00000004, ret+24(FP) - RET - - // Return with overread error -error_overread: - MOVQ $0x00000006, ret+24(FP) - RET - -// func sequenceDecs_executeSimple_amd64(ctx *executeAsmContext) bool -// Requires: SSE -TEXT ·sequenceDecs_executeSimple_amd64(SB), $8-9 - MOVQ ctx+0(FP), R10 - MOVQ 8(R10), CX - TESTQ CX, CX - JZ empty_seqs - MOVQ (R10), AX - MOVQ 24(R10), DX - MOVQ 32(R10), BX - MOVQ 80(R10), SI - MOVQ 104(R10), DI - MOVQ 120(R10), R8 - MOVQ 56(R10), R9 - MOVQ 64(R10), R10 - ADDQ R10, R9 - - // seqsBase += 24 * seqIndex - LEAQ (DX)(DX*2), R11 - SHLQ $0x03, R11 - ADDQ R11, AX - - // outBase += outPosition - ADDQ DI, BX - -main_loop: - MOVQ (AX), R11 - MOVQ 16(AX), R12 - MOVQ 8(AX), R13 - - // Copy literals - TESTQ R11, R11 - JZ check_offset - XORQ R14, R14 - -copy_1: - MOVUPS (SI)(R14*1), X0 - MOVUPS X0, (BX)(R14*1) - ADDQ $0x10, R14 - CMPQ R14, R11 - JB copy_1 - ADDQ R11, SI - ADDQ R11, BX - ADDQ R11, DI - - // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) -check_offset: - LEAQ (DI)(R10*1), R11 - CMPQ R12, R11 - JG error_match_off_too_big - CMPQ R12, R8 - JG error_match_off_too_big - - // Copy match from history - MOVQ R12, R11 - SUBQ DI, R11 - JLS copy_match - MOVQ R9, R14 - SUBQ R11, R14 - CMPQ R13, R11 - JG copy_all_from_history - MOVQ R13, R11 - SUBQ $0x10, R11 - JB copy_4_small - -copy_4_loop: - MOVUPS (R14), X0 - MOVUPS X0, (BX) - ADDQ $0x10, R14 - ADDQ $0x10, BX - SUBQ $0x10, R11 - JAE copy_4_loop - LEAQ 16(R14)(R11*1), R14 - LEAQ 16(BX)(R11*1), BX - MOVUPS -16(R14), X0 - MOVUPS X0, -16(BX) - JMP copy_4_end - -copy_4_small: - CMPQ R13, $0x03 - JE copy_4_move_3 - CMPQ R13, $0x08 - JB copy_4_move_4through7 - JMP copy_4_move_8through16 - -copy_4_move_3: - MOVW (R14), R11 - MOVB 2(R14), R12 - MOVW R11, (BX) - MOVB R12, 2(BX) - ADDQ R13, R14 - ADDQ R13, BX - JMP copy_4_end - -copy_4_move_4through7: - MOVL (R14), R11 - MOVL -4(R14)(R13*1), R12 - MOVL R11, (BX) - MOVL R12, -4(BX)(R13*1) - ADDQ R13, R14 - ADDQ R13, BX - JMP copy_4_end - -copy_4_move_8through16: - MOVQ (R14), R11 - MOVQ -8(R14)(R13*1), R12 - MOVQ R11, (BX) - MOVQ R12, -8(BX)(R13*1) - ADDQ R13, R14 - ADDQ R13, BX - -copy_4_end: - ADDQ R13, DI - ADDQ $0x18, AX - INCQ DX - CMPQ DX, CX - JB main_loop - JMP loop_finished - -copy_all_from_history: - MOVQ R11, R15 - SUBQ $0x10, R15 - JB copy_5_small - -copy_5_loop: - MOVUPS (R14), X0 - MOVUPS X0, (BX) - ADDQ $0x10, R14 - ADDQ $0x10, BX - SUBQ $0x10, R15 - JAE copy_5_loop - LEAQ 16(R14)(R15*1), R14 - LEAQ 16(BX)(R15*1), BX - MOVUPS -16(R14), X0 - MOVUPS X0, -16(BX) - JMP copy_5_end - -copy_5_small: - CMPQ R11, $0x03 - JE copy_5_move_3 - JB copy_5_move_1or2 - CMPQ R11, $0x08 - JB copy_5_move_4through7 - JMP copy_5_move_8through16 - -copy_5_move_1or2: - MOVB (R14), R15 - MOVB -1(R14)(R11*1), BP - MOVB R15, (BX) - MOVB BP, -1(BX)(R11*1) - ADDQ R11, R14 - ADDQ R11, BX - JMP copy_5_end - -copy_5_move_3: - MOVW (R14), R15 - MOVB 2(R14), BP - MOVW R15, (BX) - MOVB BP, 2(BX) - ADDQ R11, R14 - ADDQ R11, BX - JMP copy_5_end - -copy_5_move_4through7: - MOVL (R14), R15 - MOVL -4(R14)(R11*1), BP - MOVL R15, (BX) - MOVL BP, -4(BX)(R11*1) - ADDQ R11, R14 - ADDQ R11, BX - JMP copy_5_end - -copy_5_move_8through16: - MOVQ (R14), R15 - MOVQ -8(R14)(R11*1), BP - MOVQ R15, (BX) - MOVQ BP, -8(BX)(R11*1) - ADDQ R11, R14 - ADDQ R11, BX - -copy_5_end: - ADDQ R11, DI - SUBQ R11, R13 - - // Copy match from the current buffer -copy_match: - MOVQ BX, R11 - SUBQ R12, R11 - - // ml <= mo - CMPQ R13, R12 - JA copy_overlapping_match - - // Copy non-overlapping match - ADDQ R13, DI - MOVQ BX, R12 - ADDQ R13, BX - -copy_2: - MOVUPS (R11), X0 - MOVUPS X0, (R12) - ADDQ $0x10, R11 - ADDQ $0x10, R12 - SUBQ $0x10, R13 - JHI copy_2 - JMP handle_loop - - // Copy overlapping match -copy_overlapping_match: - ADDQ R13, DI - -copy_slow_3: - MOVB (R11), R12 - MOVB R12, (BX) - INCQ R11 - INCQ BX - DECQ R13 - JNZ copy_slow_3 - -handle_loop: - ADDQ $0x18, AX - INCQ DX - CMPQ DX, CX - JB main_loop - -loop_finished: - // Return value - MOVB $0x01, ret+8(FP) - - // Update the context - MOVQ ctx+0(FP), AX - MOVQ DX, 24(AX) - MOVQ DI, 104(AX) - SUBQ 80(AX), SI - MOVQ SI, 112(AX) - RET - -error_match_off_too_big: - // Return value - MOVB $0x00, ret+8(FP) - - // Update the context - MOVQ ctx+0(FP), AX - MOVQ DX, 24(AX) - MOVQ DI, 104(AX) - SUBQ 80(AX), SI - MOVQ SI, 112(AX) - RET - -empty_seqs: - // Return value - MOVB $0x01, ret+8(FP) - RET - -// func sequenceDecs_executeSimple_safe_amd64(ctx *executeAsmContext) bool -// Requires: SSE -TEXT ·sequenceDecs_executeSimple_safe_amd64(SB), $8-9 - MOVQ ctx+0(FP), R10 - MOVQ 8(R10), CX - TESTQ CX, CX - JZ empty_seqs - MOVQ (R10), AX - MOVQ 24(R10), DX - MOVQ 32(R10), BX - MOVQ 80(R10), SI - MOVQ 104(R10), DI - MOVQ 120(R10), R8 - MOVQ 56(R10), R9 - MOVQ 64(R10), R10 - ADDQ R10, R9 - - // seqsBase += 24 * seqIndex - LEAQ (DX)(DX*2), R11 - SHLQ $0x03, R11 - ADDQ R11, AX - - // outBase += outPosition - ADDQ DI, BX - -main_loop: - MOVQ (AX), R11 - MOVQ 16(AX), R12 - MOVQ 8(AX), R13 - - // Copy literals - TESTQ R11, R11 - JZ check_offset - MOVQ R11, R14 - SUBQ $0x10, R14 - JB copy_1_small - -copy_1_loop: - MOVUPS (SI), X0 - MOVUPS X0, (BX) - ADDQ $0x10, SI - ADDQ $0x10, BX - SUBQ $0x10, R14 - JAE copy_1_loop - LEAQ 16(SI)(R14*1), SI - LEAQ 16(BX)(R14*1), BX - MOVUPS -16(SI), X0 - MOVUPS X0, -16(BX) - JMP copy_1_end - -copy_1_small: - CMPQ R11, $0x03 - JE copy_1_move_3 - JB copy_1_move_1or2 - CMPQ R11, $0x08 - JB copy_1_move_4through7 - JMP copy_1_move_8through16 - -copy_1_move_1or2: - MOVB (SI), R14 - MOVB -1(SI)(R11*1), R15 - MOVB R14, (BX) - MOVB R15, -1(BX)(R11*1) - ADDQ R11, SI - ADDQ R11, BX - JMP copy_1_end - -copy_1_move_3: - MOVW (SI), R14 - MOVB 2(SI), R15 - MOVW R14, (BX) - MOVB R15, 2(BX) - ADDQ R11, SI - ADDQ R11, BX - JMP copy_1_end - -copy_1_move_4through7: - MOVL (SI), R14 - MOVL -4(SI)(R11*1), R15 - MOVL R14, (BX) - MOVL R15, -4(BX)(R11*1) - ADDQ R11, SI - ADDQ R11, BX - JMP copy_1_end - -copy_1_move_8through16: - MOVQ (SI), R14 - MOVQ -8(SI)(R11*1), R15 - MOVQ R14, (BX) - MOVQ R15, -8(BX)(R11*1) - ADDQ R11, SI - ADDQ R11, BX - -copy_1_end: - ADDQ R11, DI - - // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) -check_offset: - LEAQ (DI)(R10*1), R11 - CMPQ R12, R11 - JG error_match_off_too_big - CMPQ R12, R8 - JG error_match_off_too_big - - // Copy match from history - MOVQ R12, R11 - SUBQ DI, R11 - JLS copy_match - MOVQ R9, R14 - SUBQ R11, R14 - CMPQ R13, R11 - JG copy_all_from_history - MOVQ R13, R11 - SUBQ $0x10, R11 - JB copy_4_small - -copy_4_loop: - MOVUPS (R14), X0 - MOVUPS X0, (BX) - ADDQ $0x10, R14 - ADDQ $0x10, BX - SUBQ $0x10, R11 - JAE copy_4_loop - LEAQ 16(R14)(R11*1), R14 - LEAQ 16(BX)(R11*1), BX - MOVUPS -16(R14), X0 - MOVUPS X0, -16(BX) - JMP copy_4_end - -copy_4_small: - CMPQ R13, $0x03 - JE copy_4_move_3 - CMPQ R13, $0x08 - JB copy_4_move_4through7 - JMP copy_4_move_8through16 - -copy_4_move_3: - MOVW (R14), R11 - MOVB 2(R14), R12 - MOVW R11, (BX) - MOVB R12, 2(BX) - ADDQ R13, R14 - ADDQ R13, BX - JMP copy_4_end - -copy_4_move_4through7: - MOVL (R14), R11 - MOVL -4(R14)(R13*1), R12 - MOVL R11, (BX) - MOVL R12, -4(BX)(R13*1) - ADDQ R13, R14 - ADDQ R13, BX - JMP copy_4_end - -copy_4_move_8through16: - MOVQ (R14), R11 - MOVQ -8(R14)(R13*1), R12 - MOVQ R11, (BX) - MOVQ R12, -8(BX)(R13*1) - ADDQ R13, R14 - ADDQ R13, BX - -copy_4_end: - ADDQ R13, DI - ADDQ $0x18, AX - INCQ DX - CMPQ DX, CX - JB main_loop - JMP loop_finished - -copy_all_from_history: - MOVQ R11, R15 - SUBQ $0x10, R15 - JB copy_5_small - -copy_5_loop: - MOVUPS (R14), X0 - MOVUPS X0, (BX) - ADDQ $0x10, R14 - ADDQ $0x10, BX - SUBQ $0x10, R15 - JAE copy_5_loop - LEAQ 16(R14)(R15*1), R14 - LEAQ 16(BX)(R15*1), BX - MOVUPS -16(R14), X0 - MOVUPS X0, -16(BX) - JMP copy_5_end - -copy_5_small: - CMPQ R11, $0x03 - JE copy_5_move_3 - JB copy_5_move_1or2 - CMPQ R11, $0x08 - JB copy_5_move_4through7 - JMP copy_5_move_8through16 - -copy_5_move_1or2: - MOVB (R14), R15 - MOVB -1(R14)(R11*1), BP - MOVB R15, (BX) - MOVB BP, -1(BX)(R11*1) - ADDQ R11, R14 - ADDQ R11, BX - JMP copy_5_end - -copy_5_move_3: - MOVW (R14), R15 - MOVB 2(R14), BP - MOVW R15, (BX) - MOVB BP, 2(BX) - ADDQ R11, R14 - ADDQ R11, BX - JMP copy_5_end - -copy_5_move_4through7: - MOVL (R14), R15 - MOVL -4(R14)(R11*1), BP - MOVL R15, (BX) - MOVL BP, -4(BX)(R11*1) - ADDQ R11, R14 - ADDQ R11, BX - JMP copy_5_end - -copy_5_move_8through16: - MOVQ (R14), R15 - MOVQ -8(R14)(R11*1), BP - MOVQ R15, (BX) - MOVQ BP, -8(BX)(R11*1) - ADDQ R11, R14 - ADDQ R11, BX - -copy_5_end: - ADDQ R11, DI - SUBQ R11, R13 - - // Copy match from the current buffer -copy_match: - MOVQ BX, R11 - SUBQ R12, R11 - - // ml <= mo - CMPQ R13, R12 - JA copy_overlapping_match - - // Copy non-overlapping match - ADDQ R13, DI - MOVQ R13, R12 - SUBQ $0x10, R12 - JB copy_2_small - -copy_2_loop: - MOVUPS (R11), X0 - MOVUPS X0, (BX) - ADDQ $0x10, R11 - ADDQ $0x10, BX - SUBQ $0x10, R12 - JAE copy_2_loop - LEAQ 16(R11)(R12*1), R11 - LEAQ 16(BX)(R12*1), BX - MOVUPS -16(R11), X0 - MOVUPS X0, -16(BX) - JMP copy_2_end - -copy_2_small: - CMPQ R13, $0x03 - JE copy_2_move_3 - JB copy_2_move_1or2 - CMPQ R13, $0x08 - JB copy_2_move_4through7 - JMP copy_2_move_8through16 - -copy_2_move_1or2: - MOVB (R11), R12 - MOVB -1(R11)(R13*1), R14 - MOVB R12, (BX) - MOVB R14, -1(BX)(R13*1) - ADDQ R13, R11 - ADDQ R13, BX - JMP copy_2_end - -copy_2_move_3: - MOVW (R11), R12 - MOVB 2(R11), R14 - MOVW R12, (BX) - MOVB R14, 2(BX) - ADDQ R13, R11 - ADDQ R13, BX - JMP copy_2_end - -copy_2_move_4through7: - MOVL (R11), R12 - MOVL -4(R11)(R13*1), R14 - MOVL R12, (BX) - MOVL R14, -4(BX)(R13*1) - ADDQ R13, R11 - ADDQ R13, BX - JMP copy_2_end - -copy_2_move_8through16: - MOVQ (R11), R12 - MOVQ -8(R11)(R13*1), R14 - MOVQ R12, (BX) - MOVQ R14, -8(BX)(R13*1) - ADDQ R13, R11 - ADDQ R13, BX - -copy_2_end: - JMP handle_loop - - // Copy overlapping match -copy_overlapping_match: - ADDQ R13, DI - -copy_slow_3: - MOVB (R11), R12 - MOVB R12, (BX) - INCQ R11 - INCQ BX - DECQ R13 - JNZ copy_slow_3 - -handle_loop: - ADDQ $0x18, AX - INCQ DX - CMPQ DX, CX - JB main_loop - -loop_finished: - // Return value - MOVB $0x01, ret+8(FP) - - // Update the context - MOVQ ctx+0(FP), AX - MOVQ DX, 24(AX) - MOVQ DI, 104(AX) - SUBQ 80(AX), SI - MOVQ SI, 112(AX) - RET - -error_match_off_too_big: - // Return value - MOVB $0x00, ret+8(FP) - - // Update the context - MOVQ ctx+0(FP), AX - MOVQ DX, 24(AX) - MOVQ DI, 104(AX) - SUBQ 80(AX), SI - MOVQ SI, 112(AX) - RET - -empty_seqs: - // Return value - MOVB $0x01, ret+8(FP) - RET - -// func sequenceDecs_decodeSync_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int -// Requires: CMOV, SSE -TEXT ·sequenceDecs_decodeSync_amd64(SB), $64-32 - MOVQ br+8(FP), CX - MOVQ 24(CX), DX - MOVBQZX 32(CX), BX - MOVQ (CX), AX - MOVQ 8(CX), SI - ADDQ SI, AX - MOVQ AX, (SP) - MOVQ ctx+16(FP), AX - MOVQ 72(AX), DI - MOVQ 80(AX), R8 - MOVQ 88(AX), R9 - XORQ CX, CX - MOVQ CX, 8(SP) - MOVQ CX, 16(SP) - MOVQ CX, 24(SP) - MOVQ 112(AX), R10 - MOVQ 128(AX), CX - MOVQ CX, 32(SP) - MOVQ 144(AX), R11 - MOVQ 136(AX), R12 - MOVQ 200(AX), CX - MOVQ CX, 56(SP) - MOVQ 176(AX), CX - MOVQ CX, 48(SP) - MOVQ 184(AX), AX - MOVQ AX, 40(SP) - MOVQ 40(SP), AX - ADDQ AX, 48(SP) - - // Calculate pointer to s.out[cap(s.out)] (a past-end pointer) - ADDQ R10, 32(SP) - - // outBase += outPosition - ADDQ R12, R10 - -sequenceDecs_decodeSync_amd64_main_loop: - MOVQ (SP), R13 - - // Fill bitreader to have enough for the offset and match length. - CMPQ SI, $0x08 - JL sequenceDecs_decodeSync_amd64_fill_byte_by_byte - MOVQ BX, AX - SHRQ $0x03, AX - SUBQ AX, R13 - MOVQ (R13), DX - SUBQ AX, SI - ANDQ $0x07, BX - JMP sequenceDecs_decodeSync_amd64_fill_end - -sequenceDecs_decodeSync_amd64_fill_byte_by_byte: - CMPQ SI, $0x00 - JLE sequenceDecs_decodeSync_amd64_fill_check_overread - CMPQ BX, $0x07 - JLE sequenceDecs_decodeSync_amd64_fill_end - SHLQ $0x08, DX - SUBQ $0x01, R13 - SUBQ $0x01, SI - SUBQ $0x08, BX - MOVBQZX (R13), AX - ORQ AX, DX - JMP sequenceDecs_decodeSync_amd64_fill_byte_by_byte - -sequenceDecs_decodeSync_amd64_fill_check_overread: - CMPQ BX, $0x40 - JA error_overread - -sequenceDecs_decodeSync_amd64_fill_end: - // Update offset - MOVQ R9, AX - MOVQ BX, CX - MOVQ DX, R14 - SHLQ CL, R14 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decodeSync_amd64_of_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decodeSync_amd64_of_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decodeSync_amd64_of_update_zero - NEGQ CX - SHRQ CL, R14 - ADDQ R14, AX - -sequenceDecs_decodeSync_amd64_of_update_zero: - MOVQ AX, 8(SP) - - // Update match length - MOVQ R8, AX - MOVQ BX, CX - MOVQ DX, R14 - SHLQ CL, R14 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decodeSync_amd64_ml_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decodeSync_amd64_ml_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decodeSync_amd64_ml_update_zero - NEGQ CX - SHRQ CL, R14 - ADDQ R14, AX - -sequenceDecs_decodeSync_amd64_ml_update_zero: - MOVQ AX, 16(SP) - - // Fill bitreader to have enough for the remaining - CMPQ SI, $0x08 - JL sequenceDecs_decodeSync_amd64_fill_2_byte_by_byte - MOVQ BX, AX - SHRQ $0x03, AX - SUBQ AX, R13 - MOVQ (R13), DX - SUBQ AX, SI - ANDQ $0x07, BX - JMP sequenceDecs_decodeSync_amd64_fill_2_end - -sequenceDecs_decodeSync_amd64_fill_2_byte_by_byte: - CMPQ SI, $0x00 - JLE sequenceDecs_decodeSync_amd64_fill_2_check_overread - CMPQ BX, $0x07 - JLE sequenceDecs_decodeSync_amd64_fill_2_end - SHLQ $0x08, DX - SUBQ $0x01, R13 - SUBQ $0x01, SI - SUBQ $0x08, BX - MOVBQZX (R13), AX - ORQ AX, DX - JMP sequenceDecs_decodeSync_amd64_fill_2_byte_by_byte - -sequenceDecs_decodeSync_amd64_fill_2_check_overread: - CMPQ BX, $0x40 - JA error_overread - -sequenceDecs_decodeSync_amd64_fill_2_end: - // Update literal length - MOVQ DI, AX - MOVQ BX, CX - MOVQ DX, R14 - SHLQ CL, R14 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decodeSync_amd64_ll_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decodeSync_amd64_ll_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decodeSync_amd64_ll_update_zero - NEGQ CX - SHRQ CL, R14 - ADDQ R14, AX - -sequenceDecs_decodeSync_amd64_ll_update_zero: - MOVQ AX, 24(SP) - - // Fill bitreader for state updates - MOVQ R13, (SP) - MOVQ R9, AX - SHRQ $0x08, AX - MOVBQZX AL, AX - MOVQ ctx+16(FP), CX - CMPQ 96(CX), $0x00 - JZ sequenceDecs_decodeSync_amd64_skip_update - - // Update Literal Length State - MOVBQZX DI, R13 - SHRL $0x10, DI - LEAQ (BX)(R13*1), CX - MOVQ DX, R14 - MOVQ CX, BX - ROLQ CL, R14 - MOVL $0x00000001, R15 - MOVB R13, CL - SHLL CL, R15 - DECL R15 - ANDQ R15, R14 - ADDQ R14, DI - - // Load ctx.llTable - MOVQ ctx+16(FP), CX - MOVQ (CX), CX - MOVQ (CX)(DI*8), DI - - // Update Match Length State - MOVBQZX R8, R13 - SHRL $0x10, R8 - LEAQ (BX)(R13*1), CX - MOVQ DX, R14 - MOVQ CX, BX - ROLQ CL, R14 - MOVL $0x00000001, R15 - MOVB R13, CL - SHLL CL, R15 - DECL R15 - ANDQ R15, R14 - ADDQ R14, R8 - - // Load ctx.mlTable - MOVQ ctx+16(FP), CX - MOVQ 24(CX), CX - MOVQ (CX)(R8*8), R8 - - // Update Offset State - MOVBQZX R9, R13 - SHRL $0x10, R9 - LEAQ (BX)(R13*1), CX - MOVQ DX, R14 - MOVQ CX, BX - ROLQ CL, R14 - MOVL $0x00000001, R15 - MOVB R13, CL - SHLL CL, R15 - DECL R15 - ANDQ R15, R14 - ADDQ R14, R9 - - // Load ctx.ofTable - MOVQ ctx+16(FP), CX - MOVQ 48(CX), CX - MOVQ (CX)(R9*8), R9 - -sequenceDecs_decodeSync_amd64_skip_update: - // Adjust offset - MOVQ s+0(FP), CX - MOVQ 8(SP), R13 - CMPQ AX, $0x01 - JBE sequenceDecs_decodeSync_amd64_adjust_offsetB_1_or_0 - MOVUPS 144(CX), X0 - MOVQ R13, 144(CX) - MOVUPS X0, 152(CX) - JMP sequenceDecs_decodeSync_amd64_after_adjust - -sequenceDecs_decodeSync_amd64_adjust_offsetB_1_or_0: - CMPQ 24(SP), $0x00000000 - JNE sequenceDecs_decodeSync_amd64_adjust_offset_maybezero - INCQ R13 - JMP sequenceDecs_decodeSync_amd64_adjust_offset_nonzero - -sequenceDecs_decodeSync_amd64_adjust_offset_maybezero: - TESTQ R13, R13 - JNZ sequenceDecs_decodeSync_amd64_adjust_offset_nonzero - MOVQ 144(CX), R13 - JMP sequenceDecs_decodeSync_amd64_after_adjust - -sequenceDecs_decodeSync_amd64_adjust_offset_nonzero: - MOVQ R13, AX - XORQ R14, R14 - MOVQ $-1, R15 - CMPQ R13, $0x03 - CMOVQEQ R14, AX - CMOVQEQ R15, R14 - ADDQ 144(CX)(AX*8), R14 - JNZ sequenceDecs_decodeSync_amd64_adjust_temp_valid - MOVQ $0x00000001, R14 - -sequenceDecs_decodeSync_amd64_adjust_temp_valid: - CMPQ R13, $0x01 - JZ sequenceDecs_decodeSync_amd64_adjust_skip - MOVQ 152(CX), AX - MOVQ AX, 160(CX) - -sequenceDecs_decodeSync_amd64_adjust_skip: - MOVQ 144(CX), AX - MOVQ AX, 152(CX) - MOVQ R14, 144(CX) - MOVQ R14, R13 - -sequenceDecs_decodeSync_amd64_after_adjust: - MOVQ R13, 8(SP) - - // Check values - MOVQ 16(SP), AX - MOVQ 24(SP), CX - LEAQ (AX)(CX*1), R14 - MOVQ s+0(FP), R15 - ADDQ R14, 256(R15) - MOVQ ctx+16(FP), R14 - SUBQ CX, 104(R14) - JS error_not_enough_literals - CMPQ AX, $0x00020002 - JA sequenceDecs_decodeSync_amd64_error_match_len_too_big - TESTQ R13, R13 - JNZ sequenceDecs_decodeSync_amd64_match_len_ofs_ok - TESTQ AX, AX - JNZ sequenceDecs_decodeSync_amd64_error_match_len_ofs_mismatch - -sequenceDecs_decodeSync_amd64_match_len_ofs_ok: - MOVQ 24(SP), AX - MOVQ 8(SP), CX - MOVQ 16(SP), R13 - - // Check if we have enough space in s.out - LEAQ (AX)(R13*1), R14 - ADDQ R10, R14 - CMPQ R14, 32(SP) - JA error_not_enough_space - - // Copy literals - TESTQ AX, AX - JZ check_offset - XORQ R14, R14 - -copy_1: - MOVUPS (R11)(R14*1), X0 - MOVUPS X0, (R10)(R14*1) - ADDQ $0x10, R14 - CMPQ R14, AX - JB copy_1 - ADDQ AX, R11 - ADDQ AX, R10 - ADDQ AX, R12 - - // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) -check_offset: - MOVQ R12, AX - ADDQ 40(SP), AX - CMPQ CX, AX - JG error_match_off_too_big - CMPQ CX, 56(SP) - JG error_match_off_too_big - - // Copy match from history - MOVQ CX, AX - SUBQ R12, AX - JLS copy_match - MOVQ 48(SP), R14 - SUBQ AX, R14 - CMPQ R13, AX - JG copy_all_from_history - MOVQ R13, AX - SUBQ $0x10, AX - JB copy_4_small - -copy_4_loop: - MOVUPS (R14), X0 - MOVUPS X0, (R10) - ADDQ $0x10, R14 - ADDQ $0x10, R10 - SUBQ $0x10, AX - JAE copy_4_loop - LEAQ 16(R14)(AX*1), R14 - LEAQ 16(R10)(AX*1), R10 - MOVUPS -16(R14), X0 - MOVUPS X0, -16(R10) - JMP copy_4_end - -copy_4_small: - CMPQ R13, $0x03 - JE copy_4_move_3 - CMPQ R13, $0x08 - JB copy_4_move_4through7 - JMP copy_4_move_8through16 - -copy_4_move_3: - MOVW (R14), AX - MOVB 2(R14), CL - MOVW AX, (R10) - MOVB CL, 2(R10) - ADDQ R13, R14 - ADDQ R13, R10 - JMP copy_4_end - -copy_4_move_4through7: - MOVL (R14), AX - MOVL -4(R14)(R13*1), CX - MOVL AX, (R10) - MOVL CX, -4(R10)(R13*1) - ADDQ R13, R14 - ADDQ R13, R10 - JMP copy_4_end - -copy_4_move_8through16: - MOVQ (R14), AX - MOVQ -8(R14)(R13*1), CX - MOVQ AX, (R10) - MOVQ CX, -8(R10)(R13*1) - ADDQ R13, R14 - ADDQ R13, R10 - -copy_4_end: - ADDQ R13, R12 - JMP handle_loop - JMP loop_finished - -copy_all_from_history: - MOVQ AX, R15 - SUBQ $0x10, R15 - JB copy_5_small - -copy_5_loop: - MOVUPS (R14), X0 - MOVUPS X0, (R10) - ADDQ $0x10, R14 - ADDQ $0x10, R10 - SUBQ $0x10, R15 - JAE copy_5_loop - LEAQ 16(R14)(R15*1), R14 - LEAQ 16(R10)(R15*1), R10 - MOVUPS -16(R14), X0 - MOVUPS X0, -16(R10) - JMP copy_5_end - -copy_5_small: - CMPQ AX, $0x03 - JE copy_5_move_3 - JB copy_5_move_1or2 - CMPQ AX, $0x08 - JB copy_5_move_4through7 - JMP copy_5_move_8through16 - -copy_5_move_1or2: - MOVB (R14), R15 - MOVB -1(R14)(AX*1), BP - MOVB R15, (R10) - MOVB BP, -1(R10)(AX*1) - ADDQ AX, R14 - ADDQ AX, R10 - JMP copy_5_end - -copy_5_move_3: - MOVW (R14), R15 - MOVB 2(R14), BP - MOVW R15, (R10) - MOVB BP, 2(R10) - ADDQ AX, R14 - ADDQ AX, R10 - JMP copy_5_end - -copy_5_move_4through7: - MOVL (R14), R15 - MOVL -4(R14)(AX*1), BP - MOVL R15, (R10) - MOVL BP, -4(R10)(AX*1) - ADDQ AX, R14 - ADDQ AX, R10 - JMP copy_5_end - -copy_5_move_8through16: - MOVQ (R14), R15 - MOVQ -8(R14)(AX*1), BP - MOVQ R15, (R10) - MOVQ BP, -8(R10)(AX*1) - ADDQ AX, R14 - ADDQ AX, R10 - -copy_5_end: - ADDQ AX, R12 - SUBQ AX, R13 - - // Copy match from the current buffer -copy_match: - MOVQ R10, AX - SUBQ CX, AX - - // ml <= mo - CMPQ R13, CX - JA copy_overlapping_match - - // Copy non-overlapping match - ADDQ R13, R12 - MOVQ R10, CX - ADDQ R13, R10 - -copy_2: - MOVUPS (AX), X0 - MOVUPS X0, (CX) - ADDQ $0x10, AX - ADDQ $0x10, CX - SUBQ $0x10, R13 - JHI copy_2 - JMP handle_loop - - // Copy overlapping match -copy_overlapping_match: - ADDQ R13, R12 - -copy_slow_3: - MOVB (AX), CL - MOVB CL, (R10) - INCQ AX - INCQ R10 - DECQ R13 - JNZ copy_slow_3 - -handle_loop: - MOVQ ctx+16(FP), AX - DECQ 96(AX) - JNS sequenceDecs_decodeSync_amd64_main_loop - -loop_finished: - MOVQ br+8(FP), AX - MOVQ DX, 24(AX) - MOVB BL, 32(AX) - MOVQ SI, 8(AX) - - // Update the context - MOVQ ctx+16(FP), AX - MOVQ R12, 136(AX) - MOVQ 144(AX), CX - SUBQ CX, R11 - MOVQ R11, 168(AX) - - // Return success - MOVQ $0x00000000, ret+24(FP) - RET - - // Return with match length error -sequenceDecs_decodeSync_amd64_error_match_len_ofs_mismatch: - MOVQ 16(SP), AX - MOVQ ctx+16(FP), CX - MOVQ AX, 216(CX) - MOVQ $0x00000001, ret+24(FP) - RET - - // Return with match too long error -sequenceDecs_decodeSync_amd64_error_match_len_too_big: - MOVQ ctx+16(FP), AX - MOVQ 16(SP), CX - MOVQ CX, 216(AX) - MOVQ $0x00000002, ret+24(FP) - RET - - // Return with match offset too long error -error_match_off_too_big: - MOVQ ctx+16(FP), AX - MOVQ 8(SP), CX - MOVQ CX, 224(AX) - MOVQ R12, 136(AX) - MOVQ $0x00000003, ret+24(FP) - RET - - // Return with not enough literals error -error_not_enough_literals: - MOVQ ctx+16(FP), AX - MOVQ 24(SP), CX - MOVQ CX, 208(AX) - MOVQ $0x00000004, ret+24(FP) - RET - - // Return with overread error -error_overread: - MOVQ $0x00000006, ret+24(FP) - RET - - // Return with not enough output space error -error_not_enough_space: - MOVQ ctx+16(FP), AX - MOVQ 24(SP), CX - MOVQ CX, 208(AX) - MOVQ 16(SP), CX - MOVQ CX, 216(AX) - MOVQ R12, 136(AX) - MOVQ $0x00000005, ret+24(FP) - RET - -// func sequenceDecs_decodeSync_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int -// Requires: BMI, BMI2, CMOV, SSE -TEXT ·sequenceDecs_decodeSync_bmi2(SB), $64-32 - MOVQ br+8(FP), BX - MOVQ 24(BX), AX - MOVBQZX 32(BX), DX - MOVQ (BX), CX - MOVQ 8(BX), BX - ADDQ BX, CX - MOVQ CX, (SP) - MOVQ ctx+16(FP), CX - MOVQ 72(CX), SI - MOVQ 80(CX), DI - MOVQ 88(CX), R8 - XORQ R9, R9 - MOVQ R9, 8(SP) - MOVQ R9, 16(SP) - MOVQ R9, 24(SP) - MOVQ 112(CX), R9 - MOVQ 128(CX), R10 - MOVQ R10, 32(SP) - MOVQ 144(CX), R10 - MOVQ 136(CX), R11 - MOVQ 200(CX), R12 - MOVQ R12, 56(SP) - MOVQ 176(CX), R12 - MOVQ R12, 48(SP) - MOVQ 184(CX), CX - MOVQ CX, 40(SP) - MOVQ 40(SP), CX - ADDQ CX, 48(SP) - - // Calculate pointer to s.out[cap(s.out)] (a past-end pointer) - ADDQ R9, 32(SP) - - // outBase += outPosition - ADDQ R11, R9 - -sequenceDecs_decodeSync_bmi2_main_loop: - MOVQ (SP), R12 - - // Fill bitreader to have enough for the offset and match length. - CMPQ BX, $0x08 - JL sequenceDecs_decodeSync_bmi2_fill_byte_by_byte - MOVQ DX, CX - SHRQ $0x03, CX - SUBQ CX, R12 - MOVQ (R12), AX - SUBQ CX, BX - ANDQ $0x07, DX - JMP sequenceDecs_decodeSync_bmi2_fill_end - -sequenceDecs_decodeSync_bmi2_fill_byte_by_byte: - CMPQ BX, $0x00 - JLE sequenceDecs_decodeSync_bmi2_fill_check_overread - CMPQ DX, $0x07 - JLE sequenceDecs_decodeSync_bmi2_fill_end - SHLQ $0x08, AX - SUBQ $0x01, R12 - SUBQ $0x01, BX - SUBQ $0x08, DX - MOVBQZX (R12), CX - ORQ CX, AX - JMP sequenceDecs_decodeSync_bmi2_fill_byte_by_byte - -sequenceDecs_decodeSync_bmi2_fill_check_overread: - CMPQ DX, $0x40 - JA error_overread - -sequenceDecs_decodeSync_bmi2_fill_end: - // Update offset - MOVQ $0x00000808, CX - BEXTRQ CX, R8, R13 - MOVQ AX, R14 - LEAQ (DX)(R13*1), CX - ROLQ CL, R14 - BZHIQ R13, R14, R14 - MOVQ CX, DX - MOVQ R8, CX - SHRQ $0x20, CX - ADDQ R14, CX - MOVQ CX, 8(SP) - - // Update match length - MOVQ $0x00000808, CX - BEXTRQ CX, DI, R13 - MOVQ AX, R14 - LEAQ (DX)(R13*1), CX - ROLQ CL, R14 - BZHIQ R13, R14, R14 - MOVQ CX, DX - MOVQ DI, CX - SHRQ $0x20, CX - ADDQ R14, CX - MOVQ CX, 16(SP) - - // Fill bitreader to have enough for the remaining - CMPQ BX, $0x08 - JL sequenceDecs_decodeSync_bmi2_fill_2_byte_by_byte - MOVQ DX, CX - SHRQ $0x03, CX - SUBQ CX, R12 - MOVQ (R12), AX - SUBQ CX, BX - ANDQ $0x07, DX - JMP sequenceDecs_decodeSync_bmi2_fill_2_end - -sequenceDecs_decodeSync_bmi2_fill_2_byte_by_byte: - CMPQ BX, $0x00 - JLE sequenceDecs_decodeSync_bmi2_fill_2_check_overread - CMPQ DX, $0x07 - JLE sequenceDecs_decodeSync_bmi2_fill_2_end - SHLQ $0x08, AX - SUBQ $0x01, R12 - SUBQ $0x01, BX - SUBQ $0x08, DX - MOVBQZX (R12), CX - ORQ CX, AX - JMP sequenceDecs_decodeSync_bmi2_fill_2_byte_by_byte - -sequenceDecs_decodeSync_bmi2_fill_2_check_overread: - CMPQ DX, $0x40 - JA error_overread - -sequenceDecs_decodeSync_bmi2_fill_2_end: - // Update literal length - MOVQ $0x00000808, CX - BEXTRQ CX, SI, R13 - MOVQ AX, R14 - LEAQ (DX)(R13*1), CX - ROLQ CL, R14 - BZHIQ R13, R14, R14 - MOVQ CX, DX - MOVQ SI, CX - SHRQ $0x20, CX - ADDQ R14, CX - MOVQ CX, 24(SP) - - // Fill bitreader for state updates - MOVQ R12, (SP) - MOVQ $0x00000808, CX - BEXTRQ CX, R8, R12 - MOVQ ctx+16(FP), CX - CMPQ 96(CX), $0x00 - JZ sequenceDecs_decodeSync_bmi2_skip_update - LEAQ (SI)(DI*1), R13 - ADDQ R8, R13 - MOVBQZX R13, R13 - LEAQ (DX)(R13*1), CX - MOVQ AX, R14 - MOVQ CX, DX - ROLQ CL, R14 - BZHIQ R13, R14, R14 - - // Update Offset State - BZHIQ R8, R14, CX - SHRXQ R8, R14, R14 - SHRL $0x10, R8 - ADDQ CX, R8 - - // Load ctx.ofTable - MOVQ ctx+16(FP), CX - MOVQ 48(CX), CX - MOVQ (CX)(R8*8), R8 - - // Update Match Length State - BZHIQ DI, R14, CX - SHRXQ DI, R14, R14 - SHRL $0x10, DI - ADDQ CX, DI - - // Load ctx.mlTable - MOVQ ctx+16(FP), CX - MOVQ 24(CX), CX - MOVQ (CX)(DI*8), DI - - // Update Literal Length State - BZHIQ SI, R14, CX - SHRL $0x10, SI - ADDQ CX, SI - - // Load ctx.llTable - MOVQ ctx+16(FP), CX - MOVQ (CX), CX - MOVQ (CX)(SI*8), SI - -sequenceDecs_decodeSync_bmi2_skip_update: - // Adjust offset - MOVQ s+0(FP), CX - MOVQ 8(SP), R13 - CMPQ R12, $0x01 - JBE sequenceDecs_decodeSync_bmi2_adjust_offsetB_1_or_0 - MOVUPS 144(CX), X0 - MOVQ R13, 144(CX) - MOVUPS X0, 152(CX) - JMP sequenceDecs_decodeSync_bmi2_after_adjust - -sequenceDecs_decodeSync_bmi2_adjust_offsetB_1_or_0: - CMPQ 24(SP), $0x00000000 - JNE sequenceDecs_decodeSync_bmi2_adjust_offset_maybezero - INCQ R13 - JMP sequenceDecs_decodeSync_bmi2_adjust_offset_nonzero - -sequenceDecs_decodeSync_bmi2_adjust_offset_maybezero: - TESTQ R13, R13 - JNZ sequenceDecs_decodeSync_bmi2_adjust_offset_nonzero - MOVQ 144(CX), R13 - JMP sequenceDecs_decodeSync_bmi2_after_adjust - -sequenceDecs_decodeSync_bmi2_adjust_offset_nonzero: - MOVQ R13, R12 - XORQ R14, R14 - MOVQ $-1, R15 - CMPQ R13, $0x03 - CMOVQEQ R14, R12 - CMOVQEQ R15, R14 - ADDQ 144(CX)(R12*8), R14 - JNZ sequenceDecs_decodeSync_bmi2_adjust_temp_valid - MOVQ $0x00000001, R14 - -sequenceDecs_decodeSync_bmi2_adjust_temp_valid: - CMPQ R13, $0x01 - JZ sequenceDecs_decodeSync_bmi2_adjust_skip - MOVQ 152(CX), R12 - MOVQ R12, 160(CX) - -sequenceDecs_decodeSync_bmi2_adjust_skip: - MOVQ 144(CX), R12 - MOVQ R12, 152(CX) - MOVQ R14, 144(CX) - MOVQ R14, R13 - -sequenceDecs_decodeSync_bmi2_after_adjust: - MOVQ R13, 8(SP) - - // Check values - MOVQ 16(SP), CX - MOVQ 24(SP), R12 - LEAQ (CX)(R12*1), R14 - MOVQ s+0(FP), R15 - ADDQ R14, 256(R15) - MOVQ ctx+16(FP), R14 - SUBQ R12, 104(R14) - JS error_not_enough_literals - CMPQ CX, $0x00020002 - JA sequenceDecs_decodeSync_bmi2_error_match_len_too_big - TESTQ R13, R13 - JNZ sequenceDecs_decodeSync_bmi2_match_len_ofs_ok - TESTQ CX, CX - JNZ sequenceDecs_decodeSync_bmi2_error_match_len_ofs_mismatch - -sequenceDecs_decodeSync_bmi2_match_len_ofs_ok: - MOVQ 24(SP), CX - MOVQ 8(SP), R12 - MOVQ 16(SP), R13 - - // Check if we have enough space in s.out - LEAQ (CX)(R13*1), R14 - ADDQ R9, R14 - CMPQ R14, 32(SP) - JA error_not_enough_space - - // Copy literals - TESTQ CX, CX - JZ check_offset - XORQ R14, R14 - -copy_1: - MOVUPS (R10)(R14*1), X0 - MOVUPS X0, (R9)(R14*1) - ADDQ $0x10, R14 - CMPQ R14, CX - JB copy_1 - ADDQ CX, R10 - ADDQ CX, R9 - ADDQ CX, R11 - - // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) -check_offset: - MOVQ R11, CX - ADDQ 40(SP), CX - CMPQ R12, CX - JG error_match_off_too_big - CMPQ R12, 56(SP) - JG error_match_off_too_big - - // Copy match from history - MOVQ R12, CX - SUBQ R11, CX - JLS copy_match - MOVQ 48(SP), R14 - SUBQ CX, R14 - CMPQ R13, CX - JG copy_all_from_history - MOVQ R13, CX - SUBQ $0x10, CX - JB copy_4_small - -copy_4_loop: - MOVUPS (R14), X0 - MOVUPS X0, (R9) - ADDQ $0x10, R14 - ADDQ $0x10, R9 - SUBQ $0x10, CX - JAE copy_4_loop - LEAQ 16(R14)(CX*1), R14 - LEAQ 16(R9)(CX*1), R9 - MOVUPS -16(R14), X0 - MOVUPS X0, -16(R9) - JMP copy_4_end - -copy_4_small: - CMPQ R13, $0x03 - JE copy_4_move_3 - CMPQ R13, $0x08 - JB copy_4_move_4through7 - JMP copy_4_move_8through16 - -copy_4_move_3: - MOVW (R14), CX - MOVB 2(R14), R12 - MOVW CX, (R9) - MOVB R12, 2(R9) - ADDQ R13, R14 - ADDQ R13, R9 - JMP copy_4_end - -copy_4_move_4through7: - MOVL (R14), CX - MOVL -4(R14)(R13*1), R12 - MOVL CX, (R9) - MOVL R12, -4(R9)(R13*1) - ADDQ R13, R14 - ADDQ R13, R9 - JMP copy_4_end - -copy_4_move_8through16: - MOVQ (R14), CX - MOVQ -8(R14)(R13*1), R12 - MOVQ CX, (R9) - MOVQ R12, -8(R9)(R13*1) - ADDQ R13, R14 - ADDQ R13, R9 - -copy_4_end: - ADDQ R13, R11 - JMP handle_loop - JMP loop_finished - -copy_all_from_history: - MOVQ CX, R15 - SUBQ $0x10, R15 - JB copy_5_small - -copy_5_loop: - MOVUPS (R14), X0 - MOVUPS X0, (R9) - ADDQ $0x10, R14 - ADDQ $0x10, R9 - SUBQ $0x10, R15 - JAE copy_5_loop - LEAQ 16(R14)(R15*1), R14 - LEAQ 16(R9)(R15*1), R9 - MOVUPS -16(R14), X0 - MOVUPS X0, -16(R9) - JMP copy_5_end - -copy_5_small: - CMPQ CX, $0x03 - JE copy_5_move_3 - JB copy_5_move_1or2 - CMPQ CX, $0x08 - JB copy_5_move_4through7 - JMP copy_5_move_8through16 - -copy_5_move_1or2: - MOVB (R14), R15 - MOVB -1(R14)(CX*1), BP - MOVB R15, (R9) - MOVB BP, -1(R9)(CX*1) - ADDQ CX, R14 - ADDQ CX, R9 - JMP copy_5_end - -copy_5_move_3: - MOVW (R14), R15 - MOVB 2(R14), BP - MOVW R15, (R9) - MOVB BP, 2(R9) - ADDQ CX, R14 - ADDQ CX, R9 - JMP copy_5_end - -copy_5_move_4through7: - MOVL (R14), R15 - MOVL -4(R14)(CX*1), BP - MOVL R15, (R9) - MOVL BP, -4(R9)(CX*1) - ADDQ CX, R14 - ADDQ CX, R9 - JMP copy_5_end - -copy_5_move_8through16: - MOVQ (R14), R15 - MOVQ -8(R14)(CX*1), BP - MOVQ R15, (R9) - MOVQ BP, -8(R9)(CX*1) - ADDQ CX, R14 - ADDQ CX, R9 - -copy_5_end: - ADDQ CX, R11 - SUBQ CX, R13 - - // Copy match from the current buffer -copy_match: - MOVQ R9, CX - SUBQ R12, CX - - // ml <= mo - CMPQ R13, R12 - JA copy_overlapping_match - - // Copy non-overlapping match - ADDQ R13, R11 - MOVQ R9, R12 - ADDQ R13, R9 - -copy_2: - MOVUPS (CX), X0 - MOVUPS X0, (R12) - ADDQ $0x10, CX - ADDQ $0x10, R12 - SUBQ $0x10, R13 - JHI copy_2 - JMP handle_loop - - // Copy overlapping match -copy_overlapping_match: - ADDQ R13, R11 - -copy_slow_3: - MOVB (CX), R12 - MOVB R12, (R9) - INCQ CX - INCQ R9 - DECQ R13 - JNZ copy_slow_3 - -handle_loop: - MOVQ ctx+16(FP), CX - DECQ 96(CX) - JNS sequenceDecs_decodeSync_bmi2_main_loop - -loop_finished: - MOVQ br+8(FP), CX - MOVQ AX, 24(CX) - MOVB DL, 32(CX) - MOVQ BX, 8(CX) - - // Update the context - MOVQ ctx+16(FP), AX - MOVQ R11, 136(AX) - MOVQ 144(AX), CX - SUBQ CX, R10 - MOVQ R10, 168(AX) - - // Return success - MOVQ $0x00000000, ret+24(FP) - RET - - // Return with match length error -sequenceDecs_decodeSync_bmi2_error_match_len_ofs_mismatch: - MOVQ 16(SP), AX - MOVQ ctx+16(FP), CX - MOVQ AX, 216(CX) - MOVQ $0x00000001, ret+24(FP) - RET - - // Return with match too long error -sequenceDecs_decodeSync_bmi2_error_match_len_too_big: - MOVQ ctx+16(FP), AX - MOVQ 16(SP), CX - MOVQ CX, 216(AX) - MOVQ $0x00000002, ret+24(FP) - RET - - // Return with match offset too long error -error_match_off_too_big: - MOVQ ctx+16(FP), AX - MOVQ 8(SP), CX - MOVQ CX, 224(AX) - MOVQ R11, 136(AX) - MOVQ $0x00000003, ret+24(FP) - RET - - // Return with not enough literals error -error_not_enough_literals: - MOVQ ctx+16(FP), AX - MOVQ 24(SP), CX - MOVQ CX, 208(AX) - MOVQ $0x00000004, ret+24(FP) - RET - - // Return with overread error -error_overread: - MOVQ $0x00000006, ret+24(FP) - RET - - // Return with not enough output space error -error_not_enough_space: - MOVQ ctx+16(FP), AX - MOVQ 24(SP), CX - MOVQ CX, 208(AX) - MOVQ 16(SP), CX - MOVQ CX, 216(AX) - MOVQ R11, 136(AX) - MOVQ $0x00000005, ret+24(FP) - RET - -// func sequenceDecs_decodeSync_safe_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int -// Requires: CMOV, SSE -TEXT ·sequenceDecs_decodeSync_safe_amd64(SB), $64-32 - MOVQ br+8(FP), CX - MOVQ 24(CX), DX - MOVBQZX 32(CX), BX - MOVQ (CX), AX - MOVQ 8(CX), SI - ADDQ SI, AX - MOVQ AX, (SP) - MOVQ ctx+16(FP), AX - MOVQ 72(AX), DI - MOVQ 80(AX), R8 - MOVQ 88(AX), R9 - XORQ CX, CX - MOVQ CX, 8(SP) - MOVQ CX, 16(SP) - MOVQ CX, 24(SP) - MOVQ 112(AX), R10 - MOVQ 128(AX), CX - MOVQ CX, 32(SP) - MOVQ 144(AX), R11 - MOVQ 136(AX), R12 - MOVQ 200(AX), CX - MOVQ CX, 56(SP) - MOVQ 176(AX), CX - MOVQ CX, 48(SP) - MOVQ 184(AX), AX - MOVQ AX, 40(SP) - MOVQ 40(SP), AX - ADDQ AX, 48(SP) - - // Calculate pointer to s.out[cap(s.out)] (a past-end pointer) - ADDQ R10, 32(SP) - - // outBase += outPosition - ADDQ R12, R10 - -sequenceDecs_decodeSync_safe_amd64_main_loop: - MOVQ (SP), R13 - - // Fill bitreader to have enough for the offset and match length. - CMPQ SI, $0x08 - JL sequenceDecs_decodeSync_safe_amd64_fill_byte_by_byte - MOVQ BX, AX - SHRQ $0x03, AX - SUBQ AX, R13 - MOVQ (R13), DX - SUBQ AX, SI - ANDQ $0x07, BX - JMP sequenceDecs_decodeSync_safe_amd64_fill_end - -sequenceDecs_decodeSync_safe_amd64_fill_byte_by_byte: - CMPQ SI, $0x00 - JLE sequenceDecs_decodeSync_safe_amd64_fill_check_overread - CMPQ BX, $0x07 - JLE sequenceDecs_decodeSync_safe_amd64_fill_end - SHLQ $0x08, DX - SUBQ $0x01, R13 - SUBQ $0x01, SI - SUBQ $0x08, BX - MOVBQZX (R13), AX - ORQ AX, DX - JMP sequenceDecs_decodeSync_safe_amd64_fill_byte_by_byte - -sequenceDecs_decodeSync_safe_amd64_fill_check_overread: - CMPQ BX, $0x40 - JA error_overread - -sequenceDecs_decodeSync_safe_amd64_fill_end: - // Update offset - MOVQ R9, AX - MOVQ BX, CX - MOVQ DX, R14 - SHLQ CL, R14 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decodeSync_safe_amd64_of_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decodeSync_safe_amd64_of_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decodeSync_safe_amd64_of_update_zero - NEGQ CX - SHRQ CL, R14 - ADDQ R14, AX - -sequenceDecs_decodeSync_safe_amd64_of_update_zero: - MOVQ AX, 8(SP) - - // Update match length - MOVQ R8, AX - MOVQ BX, CX - MOVQ DX, R14 - SHLQ CL, R14 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decodeSync_safe_amd64_ml_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decodeSync_safe_amd64_ml_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decodeSync_safe_amd64_ml_update_zero - NEGQ CX - SHRQ CL, R14 - ADDQ R14, AX - -sequenceDecs_decodeSync_safe_amd64_ml_update_zero: - MOVQ AX, 16(SP) - - // Fill bitreader to have enough for the remaining - CMPQ SI, $0x08 - JL sequenceDecs_decodeSync_safe_amd64_fill_2_byte_by_byte - MOVQ BX, AX - SHRQ $0x03, AX - SUBQ AX, R13 - MOVQ (R13), DX - SUBQ AX, SI - ANDQ $0x07, BX - JMP sequenceDecs_decodeSync_safe_amd64_fill_2_end - -sequenceDecs_decodeSync_safe_amd64_fill_2_byte_by_byte: - CMPQ SI, $0x00 - JLE sequenceDecs_decodeSync_safe_amd64_fill_2_check_overread - CMPQ BX, $0x07 - JLE sequenceDecs_decodeSync_safe_amd64_fill_2_end - SHLQ $0x08, DX - SUBQ $0x01, R13 - SUBQ $0x01, SI - SUBQ $0x08, BX - MOVBQZX (R13), AX - ORQ AX, DX - JMP sequenceDecs_decodeSync_safe_amd64_fill_2_byte_by_byte - -sequenceDecs_decodeSync_safe_amd64_fill_2_check_overread: - CMPQ BX, $0x40 - JA error_overread - -sequenceDecs_decodeSync_safe_amd64_fill_2_end: - // Update literal length - MOVQ DI, AX - MOVQ BX, CX - MOVQ DX, R14 - SHLQ CL, R14 - MOVB AH, CL - SHRQ $0x20, AX - TESTQ CX, CX - JZ sequenceDecs_decodeSync_safe_amd64_ll_update_zero - ADDQ CX, BX - CMPQ BX, $0x40 - JA sequenceDecs_decodeSync_safe_amd64_ll_update_zero - CMPQ CX, $0x40 - JAE sequenceDecs_decodeSync_safe_amd64_ll_update_zero - NEGQ CX - SHRQ CL, R14 - ADDQ R14, AX - -sequenceDecs_decodeSync_safe_amd64_ll_update_zero: - MOVQ AX, 24(SP) - - // Fill bitreader for state updates - MOVQ R13, (SP) - MOVQ R9, AX - SHRQ $0x08, AX - MOVBQZX AL, AX - MOVQ ctx+16(FP), CX - CMPQ 96(CX), $0x00 - JZ sequenceDecs_decodeSync_safe_amd64_skip_update - - // Update Literal Length State - MOVBQZX DI, R13 - SHRL $0x10, DI - LEAQ (BX)(R13*1), CX - MOVQ DX, R14 - MOVQ CX, BX - ROLQ CL, R14 - MOVL $0x00000001, R15 - MOVB R13, CL - SHLL CL, R15 - DECL R15 - ANDQ R15, R14 - ADDQ R14, DI - - // Load ctx.llTable - MOVQ ctx+16(FP), CX - MOVQ (CX), CX - MOVQ (CX)(DI*8), DI - - // Update Match Length State - MOVBQZX R8, R13 - SHRL $0x10, R8 - LEAQ (BX)(R13*1), CX - MOVQ DX, R14 - MOVQ CX, BX - ROLQ CL, R14 - MOVL $0x00000001, R15 - MOVB R13, CL - SHLL CL, R15 - DECL R15 - ANDQ R15, R14 - ADDQ R14, R8 - - // Load ctx.mlTable - MOVQ ctx+16(FP), CX - MOVQ 24(CX), CX - MOVQ (CX)(R8*8), R8 - - // Update Offset State - MOVBQZX R9, R13 - SHRL $0x10, R9 - LEAQ (BX)(R13*1), CX - MOVQ DX, R14 - MOVQ CX, BX - ROLQ CL, R14 - MOVL $0x00000001, R15 - MOVB R13, CL - SHLL CL, R15 - DECL R15 - ANDQ R15, R14 - ADDQ R14, R9 - - // Load ctx.ofTable - MOVQ ctx+16(FP), CX - MOVQ 48(CX), CX - MOVQ (CX)(R9*8), R9 - -sequenceDecs_decodeSync_safe_amd64_skip_update: - // Adjust offset - MOVQ s+0(FP), CX - MOVQ 8(SP), R13 - CMPQ AX, $0x01 - JBE sequenceDecs_decodeSync_safe_amd64_adjust_offsetB_1_or_0 - MOVUPS 144(CX), X0 - MOVQ R13, 144(CX) - MOVUPS X0, 152(CX) - JMP sequenceDecs_decodeSync_safe_amd64_after_adjust - -sequenceDecs_decodeSync_safe_amd64_adjust_offsetB_1_or_0: - CMPQ 24(SP), $0x00000000 - JNE sequenceDecs_decodeSync_safe_amd64_adjust_offset_maybezero - INCQ R13 - JMP sequenceDecs_decodeSync_safe_amd64_adjust_offset_nonzero - -sequenceDecs_decodeSync_safe_amd64_adjust_offset_maybezero: - TESTQ R13, R13 - JNZ sequenceDecs_decodeSync_safe_amd64_adjust_offset_nonzero - MOVQ 144(CX), R13 - JMP sequenceDecs_decodeSync_safe_amd64_after_adjust - -sequenceDecs_decodeSync_safe_amd64_adjust_offset_nonzero: - MOVQ R13, AX - XORQ R14, R14 - MOVQ $-1, R15 - CMPQ R13, $0x03 - CMOVQEQ R14, AX - CMOVQEQ R15, R14 - ADDQ 144(CX)(AX*8), R14 - JNZ sequenceDecs_decodeSync_safe_amd64_adjust_temp_valid - MOVQ $0x00000001, R14 - -sequenceDecs_decodeSync_safe_amd64_adjust_temp_valid: - CMPQ R13, $0x01 - JZ sequenceDecs_decodeSync_safe_amd64_adjust_skip - MOVQ 152(CX), AX - MOVQ AX, 160(CX) - -sequenceDecs_decodeSync_safe_amd64_adjust_skip: - MOVQ 144(CX), AX - MOVQ AX, 152(CX) - MOVQ R14, 144(CX) - MOVQ R14, R13 - -sequenceDecs_decodeSync_safe_amd64_after_adjust: - MOVQ R13, 8(SP) - - // Check values - MOVQ 16(SP), AX - MOVQ 24(SP), CX - LEAQ (AX)(CX*1), R14 - MOVQ s+0(FP), R15 - ADDQ R14, 256(R15) - MOVQ ctx+16(FP), R14 - SUBQ CX, 104(R14) - JS error_not_enough_literals - CMPQ AX, $0x00020002 - JA sequenceDecs_decodeSync_safe_amd64_error_match_len_too_big - TESTQ R13, R13 - JNZ sequenceDecs_decodeSync_safe_amd64_match_len_ofs_ok - TESTQ AX, AX - JNZ sequenceDecs_decodeSync_safe_amd64_error_match_len_ofs_mismatch - -sequenceDecs_decodeSync_safe_amd64_match_len_ofs_ok: - MOVQ 24(SP), AX - MOVQ 8(SP), CX - MOVQ 16(SP), R13 - - // Check if we have enough space in s.out - LEAQ (AX)(R13*1), R14 - ADDQ R10, R14 - CMPQ R14, 32(SP) - JA error_not_enough_space - - // Copy literals - TESTQ AX, AX - JZ check_offset - MOVQ AX, R14 - SUBQ $0x10, R14 - JB copy_1_small - -copy_1_loop: - MOVUPS (R11), X0 - MOVUPS X0, (R10) - ADDQ $0x10, R11 - ADDQ $0x10, R10 - SUBQ $0x10, R14 - JAE copy_1_loop - LEAQ 16(R11)(R14*1), R11 - LEAQ 16(R10)(R14*1), R10 - MOVUPS -16(R11), X0 - MOVUPS X0, -16(R10) - JMP copy_1_end - -copy_1_small: - CMPQ AX, $0x03 - JE copy_1_move_3 - JB copy_1_move_1or2 - CMPQ AX, $0x08 - JB copy_1_move_4through7 - JMP copy_1_move_8through16 - -copy_1_move_1or2: - MOVB (R11), R14 - MOVB -1(R11)(AX*1), R15 - MOVB R14, (R10) - MOVB R15, -1(R10)(AX*1) - ADDQ AX, R11 - ADDQ AX, R10 - JMP copy_1_end - -copy_1_move_3: - MOVW (R11), R14 - MOVB 2(R11), R15 - MOVW R14, (R10) - MOVB R15, 2(R10) - ADDQ AX, R11 - ADDQ AX, R10 - JMP copy_1_end - -copy_1_move_4through7: - MOVL (R11), R14 - MOVL -4(R11)(AX*1), R15 - MOVL R14, (R10) - MOVL R15, -4(R10)(AX*1) - ADDQ AX, R11 - ADDQ AX, R10 - JMP copy_1_end - -copy_1_move_8through16: - MOVQ (R11), R14 - MOVQ -8(R11)(AX*1), R15 - MOVQ R14, (R10) - MOVQ R15, -8(R10)(AX*1) - ADDQ AX, R11 - ADDQ AX, R10 - -copy_1_end: - ADDQ AX, R12 - - // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) -check_offset: - MOVQ R12, AX - ADDQ 40(SP), AX - CMPQ CX, AX - JG error_match_off_too_big - CMPQ CX, 56(SP) - JG error_match_off_too_big - - // Copy match from history - MOVQ CX, AX - SUBQ R12, AX - JLS copy_match - MOVQ 48(SP), R14 - SUBQ AX, R14 - CMPQ R13, AX - JG copy_all_from_history - MOVQ R13, AX - SUBQ $0x10, AX - JB copy_4_small - -copy_4_loop: - MOVUPS (R14), X0 - MOVUPS X0, (R10) - ADDQ $0x10, R14 - ADDQ $0x10, R10 - SUBQ $0x10, AX - JAE copy_4_loop - LEAQ 16(R14)(AX*1), R14 - LEAQ 16(R10)(AX*1), R10 - MOVUPS -16(R14), X0 - MOVUPS X0, -16(R10) - JMP copy_4_end - -copy_4_small: - CMPQ R13, $0x03 - JE copy_4_move_3 - CMPQ R13, $0x08 - JB copy_4_move_4through7 - JMP copy_4_move_8through16 - -copy_4_move_3: - MOVW (R14), AX - MOVB 2(R14), CL - MOVW AX, (R10) - MOVB CL, 2(R10) - ADDQ R13, R14 - ADDQ R13, R10 - JMP copy_4_end - -copy_4_move_4through7: - MOVL (R14), AX - MOVL -4(R14)(R13*1), CX - MOVL AX, (R10) - MOVL CX, -4(R10)(R13*1) - ADDQ R13, R14 - ADDQ R13, R10 - JMP copy_4_end - -copy_4_move_8through16: - MOVQ (R14), AX - MOVQ -8(R14)(R13*1), CX - MOVQ AX, (R10) - MOVQ CX, -8(R10)(R13*1) - ADDQ R13, R14 - ADDQ R13, R10 - -copy_4_end: - ADDQ R13, R12 - JMP handle_loop - JMP loop_finished - -copy_all_from_history: - MOVQ AX, R15 - SUBQ $0x10, R15 - JB copy_5_small - -copy_5_loop: - MOVUPS (R14), X0 - MOVUPS X0, (R10) - ADDQ $0x10, R14 - ADDQ $0x10, R10 - SUBQ $0x10, R15 - JAE copy_5_loop - LEAQ 16(R14)(R15*1), R14 - LEAQ 16(R10)(R15*1), R10 - MOVUPS -16(R14), X0 - MOVUPS X0, -16(R10) - JMP copy_5_end - -copy_5_small: - CMPQ AX, $0x03 - JE copy_5_move_3 - JB copy_5_move_1or2 - CMPQ AX, $0x08 - JB copy_5_move_4through7 - JMP copy_5_move_8through16 - -copy_5_move_1or2: - MOVB (R14), R15 - MOVB -1(R14)(AX*1), BP - MOVB R15, (R10) - MOVB BP, -1(R10)(AX*1) - ADDQ AX, R14 - ADDQ AX, R10 - JMP copy_5_end - -copy_5_move_3: - MOVW (R14), R15 - MOVB 2(R14), BP - MOVW R15, (R10) - MOVB BP, 2(R10) - ADDQ AX, R14 - ADDQ AX, R10 - JMP copy_5_end - -copy_5_move_4through7: - MOVL (R14), R15 - MOVL -4(R14)(AX*1), BP - MOVL R15, (R10) - MOVL BP, -4(R10)(AX*1) - ADDQ AX, R14 - ADDQ AX, R10 - JMP copy_5_end - -copy_5_move_8through16: - MOVQ (R14), R15 - MOVQ -8(R14)(AX*1), BP - MOVQ R15, (R10) - MOVQ BP, -8(R10)(AX*1) - ADDQ AX, R14 - ADDQ AX, R10 - -copy_5_end: - ADDQ AX, R12 - SUBQ AX, R13 - - // Copy match from the current buffer -copy_match: - MOVQ R10, AX - SUBQ CX, AX - - // ml <= mo - CMPQ R13, CX - JA copy_overlapping_match - - // Copy non-overlapping match - ADDQ R13, R12 - MOVQ R13, CX - SUBQ $0x10, CX - JB copy_2_small - -copy_2_loop: - MOVUPS (AX), X0 - MOVUPS X0, (R10) - ADDQ $0x10, AX - ADDQ $0x10, R10 - SUBQ $0x10, CX - JAE copy_2_loop - LEAQ 16(AX)(CX*1), AX - LEAQ 16(R10)(CX*1), R10 - MOVUPS -16(AX), X0 - MOVUPS X0, -16(R10) - JMP copy_2_end - -copy_2_small: - CMPQ R13, $0x03 - JE copy_2_move_3 - JB copy_2_move_1or2 - CMPQ R13, $0x08 - JB copy_2_move_4through7 - JMP copy_2_move_8through16 - -copy_2_move_1or2: - MOVB (AX), CL - MOVB -1(AX)(R13*1), R14 - MOVB CL, (R10) - MOVB R14, -1(R10)(R13*1) - ADDQ R13, AX - ADDQ R13, R10 - JMP copy_2_end - -copy_2_move_3: - MOVW (AX), CX - MOVB 2(AX), R14 - MOVW CX, (R10) - MOVB R14, 2(R10) - ADDQ R13, AX - ADDQ R13, R10 - JMP copy_2_end - -copy_2_move_4through7: - MOVL (AX), CX - MOVL -4(AX)(R13*1), R14 - MOVL CX, (R10) - MOVL R14, -4(R10)(R13*1) - ADDQ R13, AX - ADDQ R13, R10 - JMP copy_2_end - -copy_2_move_8through16: - MOVQ (AX), CX - MOVQ -8(AX)(R13*1), R14 - MOVQ CX, (R10) - MOVQ R14, -8(R10)(R13*1) - ADDQ R13, AX - ADDQ R13, R10 - -copy_2_end: - JMP handle_loop - - // Copy overlapping match -copy_overlapping_match: - ADDQ R13, R12 - -copy_slow_3: - MOVB (AX), CL - MOVB CL, (R10) - INCQ AX - INCQ R10 - DECQ R13 - JNZ copy_slow_3 - -handle_loop: - MOVQ ctx+16(FP), AX - DECQ 96(AX) - JNS sequenceDecs_decodeSync_safe_amd64_main_loop - -loop_finished: - MOVQ br+8(FP), AX - MOVQ DX, 24(AX) - MOVB BL, 32(AX) - MOVQ SI, 8(AX) - - // Update the context - MOVQ ctx+16(FP), AX - MOVQ R12, 136(AX) - MOVQ 144(AX), CX - SUBQ CX, R11 - MOVQ R11, 168(AX) - - // Return success - MOVQ $0x00000000, ret+24(FP) - RET - - // Return with match length error -sequenceDecs_decodeSync_safe_amd64_error_match_len_ofs_mismatch: - MOVQ 16(SP), AX - MOVQ ctx+16(FP), CX - MOVQ AX, 216(CX) - MOVQ $0x00000001, ret+24(FP) - RET - - // Return with match too long error -sequenceDecs_decodeSync_safe_amd64_error_match_len_too_big: - MOVQ ctx+16(FP), AX - MOVQ 16(SP), CX - MOVQ CX, 216(AX) - MOVQ $0x00000002, ret+24(FP) - RET - - // Return with match offset too long error -error_match_off_too_big: - MOVQ ctx+16(FP), AX - MOVQ 8(SP), CX - MOVQ CX, 224(AX) - MOVQ R12, 136(AX) - MOVQ $0x00000003, ret+24(FP) - RET - - // Return with not enough literals error -error_not_enough_literals: - MOVQ ctx+16(FP), AX - MOVQ 24(SP), CX - MOVQ CX, 208(AX) - MOVQ $0x00000004, ret+24(FP) - RET - - // Return with overread error -error_overread: - MOVQ $0x00000006, ret+24(FP) - RET - - // Return with not enough output space error -error_not_enough_space: - MOVQ ctx+16(FP), AX - MOVQ 24(SP), CX - MOVQ CX, 208(AX) - MOVQ 16(SP), CX - MOVQ CX, 216(AX) - MOVQ R12, 136(AX) - MOVQ $0x00000005, ret+24(FP) - RET - -// func sequenceDecs_decodeSync_safe_bmi2(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int -// Requires: BMI, BMI2, CMOV, SSE -TEXT ·sequenceDecs_decodeSync_safe_bmi2(SB), $64-32 - MOVQ br+8(FP), BX - MOVQ 24(BX), AX - MOVBQZX 32(BX), DX - MOVQ (BX), CX - MOVQ 8(BX), BX - ADDQ BX, CX - MOVQ CX, (SP) - MOVQ ctx+16(FP), CX - MOVQ 72(CX), SI - MOVQ 80(CX), DI - MOVQ 88(CX), R8 - XORQ R9, R9 - MOVQ R9, 8(SP) - MOVQ R9, 16(SP) - MOVQ R9, 24(SP) - MOVQ 112(CX), R9 - MOVQ 128(CX), R10 - MOVQ R10, 32(SP) - MOVQ 144(CX), R10 - MOVQ 136(CX), R11 - MOVQ 200(CX), R12 - MOVQ R12, 56(SP) - MOVQ 176(CX), R12 - MOVQ R12, 48(SP) - MOVQ 184(CX), CX - MOVQ CX, 40(SP) - MOVQ 40(SP), CX - ADDQ CX, 48(SP) - - // Calculate pointer to s.out[cap(s.out)] (a past-end pointer) - ADDQ R9, 32(SP) - - // outBase += outPosition - ADDQ R11, R9 - -sequenceDecs_decodeSync_safe_bmi2_main_loop: - MOVQ (SP), R12 - - // Fill bitreader to have enough for the offset and match length. - CMPQ BX, $0x08 - JL sequenceDecs_decodeSync_safe_bmi2_fill_byte_by_byte - MOVQ DX, CX - SHRQ $0x03, CX - SUBQ CX, R12 - MOVQ (R12), AX - SUBQ CX, BX - ANDQ $0x07, DX - JMP sequenceDecs_decodeSync_safe_bmi2_fill_end - -sequenceDecs_decodeSync_safe_bmi2_fill_byte_by_byte: - CMPQ BX, $0x00 - JLE sequenceDecs_decodeSync_safe_bmi2_fill_check_overread - CMPQ DX, $0x07 - JLE sequenceDecs_decodeSync_safe_bmi2_fill_end - SHLQ $0x08, AX - SUBQ $0x01, R12 - SUBQ $0x01, BX - SUBQ $0x08, DX - MOVBQZX (R12), CX - ORQ CX, AX - JMP sequenceDecs_decodeSync_safe_bmi2_fill_byte_by_byte - -sequenceDecs_decodeSync_safe_bmi2_fill_check_overread: - CMPQ DX, $0x40 - JA error_overread - -sequenceDecs_decodeSync_safe_bmi2_fill_end: - // Update offset - MOVQ $0x00000808, CX - BEXTRQ CX, R8, R13 - MOVQ AX, R14 - LEAQ (DX)(R13*1), CX - ROLQ CL, R14 - BZHIQ R13, R14, R14 - MOVQ CX, DX - MOVQ R8, CX - SHRQ $0x20, CX - ADDQ R14, CX - MOVQ CX, 8(SP) - - // Update match length - MOVQ $0x00000808, CX - BEXTRQ CX, DI, R13 - MOVQ AX, R14 - LEAQ (DX)(R13*1), CX - ROLQ CL, R14 - BZHIQ R13, R14, R14 - MOVQ CX, DX - MOVQ DI, CX - SHRQ $0x20, CX - ADDQ R14, CX - MOVQ CX, 16(SP) - - // Fill bitreader to have enough for the remaining - CMPQ BX, $0x08 - JL sequenceDecs_decodeSync_safe_bmi2_fill_2_byte_by_byte - MOVQ DX, CX - SHRQ $0x03, CX - SUBQ CX, R12 - MOVQ (R12), AX - SUBQ CX, BX - ANDQ $0x07, DX - JMP sequenceDecs_decodeSync_safe_bmi2_fill_2_end - -sequenceDecs_decodeSync_safe_bmi2_fill_2_byte_by_byte: - CMPQ BX, $0x00 - JLE sequenceDecs_decodeSync_safe_bmi2_fill_2_check_overread - CMPQ DX, $0x07 - JLE sequenceDecs_decodeSync_safe_bmi2_fill_2_end - SHLQ $0x08, AX - SUBQ $0x01, R12 - SUBQ $0x01, BX - SUBQ $0x08, DX - MOVBQZX (R12), CX - ORQ CX, AX - JMP sequenceDecs_decodeSync_safe_bmi2_fill_2_byte_by_byte - -sequenceDecs_decodeSync_safe_bmi2_fill_2_check_overread: - CMPQ DX, $0x40 - JA error_overread - -sequenceDecs_decodeSync_safe_bmi2_fill_2_end: - // Update literal length - MOVQ $0x00000808, CX - BEXTRQ CX, SI, R13 - MOVQ AX, R14 - LEAQ (DX)(R13*1), CX - ROLQ CL, R14 - BZHIQ R13, R14, R14 - MOVQ CX, DX - MOVQ SI, CX - SHRQ $0x20, CX - ADDQ R14, CX - MOVQ CX, 24(SP) - - // Fill bitreader for state updates - MOVQ R12, (SP) - MOVQ $0x00000808, CX - BEXTRQ CX, R8, R12 - MOVQ ctx+16(FP), CX - CMPQ 96(CX), $0x00 - JZ sequenceDecs_decodeSync_safe_bmi2_skip_update - LEAQ (SI)(DI*1), R13 - ADDQ R8, R13 - MOVBQZX R13, R13 - LEAQ (DX)(R13*1), CX - MOVQ AX, R14 - MOVQ CX, DX - ROLQ CL, R14 - BZHIQ R13, R14, R14 - - // Update Offset State - BZHIQ R8, R14, CX - SHRXQ R8, R14, R14 - SHRL $0x10, R8 - ADDQ CX, R8 - - // Load ctx.ofTable - MOVQ ctx+16(FP), CX - MOVQ 48(CX), CX - MOVQ (CX)(R8*8), R8 - - // Update Match Length State - BZHIQ DI, R14, CX - SHRXQ DI, R14, R14 - SHRL $0x10, DI - ADDQ CX, DI - - // Load ctx.mlTable - MOVQ ctx+16(FP), CX - MOVQ 24(CX), CX - MOVQ (CX)(DI*8), DI - - // Update Literal Length State - BZHIQ SI, R14, CX - SHRL $0x10, SI - ADDQ CX, SI - - // Load ctx.llTable - MOVQ ctx+16(FP), CX - MOVQ (CX), CX - MOVQ (CX)(SI*8), SI - -sequenceDecs_decodeSync_safe_bmi2_skip_update: - // Adjust offset - MOVQ s+0(FP), CX - MOVQ 8(SP), R13 - CMPQ R12, $0x01 - JBE sequenceDecs_decodeSync_safe_bmi2_adjust_offsetB_1_or_0 - MOVUPS 144(CX), X0 - MOVQ R13, 144(CX) - MOVUPS X0, 152(CX) - JMP sequenceDecs_decodeSync_safe_bmi2_after_adjust - -sequenceDecs_decodeSync_safe_bmi2_adjust_offsetB_1_or_0: - CMPQ 24(SP), $0x00000000 - JNE sequenceDecs_decodeSync_safe_bmi2_adjust_offset_maybezero - INCQ R13 - JMP sequenceDecs_decodeSync_safe_bmi2_adjust_offset_nonzero - -sequenceDecs_decodeSync_safe_bmi2_adjust_offset_maybezero: - TESTQ R13, R13 - JNZ sequenceDecs_decodeSync_safe_bmi2_adjust_offset_nonzero - MOVQ 144(CX), R13 - JMP sequenceDecs_decodeSync_safe_bmi2_after_adjust - -sequenceDecs_decodeSync_safe_bmi2_adjust_offset_nonzero: - MOVQ R13, R12 - XORQ R14, R14 - MOVQ $-1, R15 - CMPQ R13, $0x03 - CMOVQEQ R14, R12 - CMOVQEQ R15, R14 - ADDQ 144(CX)(R12*8), R14 - JNZ sequenceDecs_decodeSync_safe_bmi2_adjust_temp_valid - MOVQ $0x00000001, R14 - -sequenceDecs_decodeSync_safe_bmi2_adjust_temp_valid: - CMPQ R13, $0x01 - JZ sequenceDecs_decodeSync_safe_bmi2_adjust_skip - MOVQ 152(CX), R12 - MOVQ R12, 160(CX) - -sequenceDecs_decodeSync_safe_bmi2_adjust_skip: - MOVQ 144(CX), R12 - MOVQ R12, 152(CX) - MOVQ R14, 144(CX) - MOVQ R14, R13 - -sequenceDecs_decodeSync_safe_bmi2_after_adjust: - MOVQ R13, 8(SP) - - // Check values - MOVQ 16(SP), CX - MOVQ 24(SP), R12 - LEAQ (CX)(R12*1), R14 - MOVQ s+0(FP), R15 - ADDQ R14, 256(R15) - MOVQ ctx+16(FP), R14 - SUBQ R12, 104(R14) - JS error_not_enough_literals - CMPQ CX, $0x00020002 - JA sequenceDecs_decodeSync_safe_bmi2_error_match_len_too_big - TESTQ R13, R13 - JNZ sequenceDecs_decodeSync_safe_bmi2_match_len_ofs_ok - TESTQ CX, CX - JNZ sequenceDecs_decodeSync_safe_bmi2_error_match_len_ofs_mismatch - -sequenceDecs_decodeSync_safe_bmi2_match_len_ofs_ok: - MOVQ 24(SP), CX - MOVQ 8(SP), R12 - MOVQ 16(SP), R13 - - // Check if we have enough space in s.out - LEAQ (CX)(R13*1), R14 - ADDQ R9, R14 - CMPQ R14, 32(SP) - JA error_not_enough_space - - // Copy literals - TESTQ CX, CX - JZ check_offset - MOVQ CX, R14 - SUBQ $0x10, R14 - JB copy_1_small - -copy_1_loop: - MOVUPS (R10), X0 - MOVUPS X0, (R9) - ADDQ $0x10, R10 - ADDQ $0x10, R9 - SUBQ $0x10, R14 - JAE copy_1_loop - LEAQ 16(R10)(R14*1), R10 - LEAQ 16(R9)(R14*1), R9 - MOVUPS -16(R10), X0 - MOVUPS X0, -16(R9) - JMP copy_1_end - -copy_1_small: - CMPQ CX, $0x03 - JE copy_1_move_3 - JB copy_1_move_1or2 - CMPQ CX, $0x08 - JB copy_1_move_4through7 - JMP copy_1_move_8through16 - -copy_1_move_1or2: - MOVB (R10), R14 - MOVB -1(R10)(CX*1), R15 - MOVB R14, (R9) - MOVB R15, -1(R9)(CX*1) - ADDQ CX, R10 - ADDQ CX, R9 - JMP copy_1_end - -copy_1_move_3: - MOVW (R10), R14 - MOVB 2(R10), R15 - MOVW R14, (R9) - MOVB R15, 2(R9) - ADDQ CX, R10 - ADDQ CX, R9 - JMP copy_1_end - -copy_1_move_4through7: - MOVL (R10), R14 - MOVL -4(R10)(CX*1), R15 - MOVL R14, (R9) - MOVL R15, -4(R9)(CX*1) - ADDQ CX, R10 - ADDQ CX, R9 - JMP copy_1_end - -copy_1_move_8through16: - MOVQ (R10), R14 - MOVQ -8(R10)(CX*1), R15 - MOVQ R14, (R9) - MOVQ R15, -8(R9)(CX*1) - ADDQ CX, R10 - ADDQ CX, R9 - -copy_1_end: - ADDQ CX, R11 - - // Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize) -check_offset: - MOVQ R11, CX - ADDQ 40(SP), CX - CMPQ R12, CX - JG error_match_off_too_big - CMPQ R12, 56(SP) - JG error_match_off_too_big - - // Copy match from history - MOVQ R12, CX - SUBQ R11, CX - JLS copy_match - MOVQ 48(SP), R14 - SUBQ CX, R14 - CMPQ R13, CX - JG copy_all_from_history - MOVQ R13, CX - SUBQ $0x10, CX - JB copy_4_small - -copy_4_loop: - MOVUPS (R14), X0 - MOVUPS X0, (R9) - ADDQ $0x10, R14 - ADDQ $0x10, R9 - SUBQ $0x10, CX - JAE copy_4_loop - LEAQ 16(R14)(CX*1), R14 - LEAQ 16(R9)(CX*1), R9 - MOVUPS -16(R14), X0 - MOVUPS X0, -16(R9) - JMP copy_4_end - -copy_4_small: - CMPQ R13, $0x03 - JE copy_4_move_3 - CMPQ R13, $0x08 - JB copy_4_move_4through7 - JMP copy_4_move_8through16 - -copy_4_move_3: - MOVW (R14), CX - MOVB 2(R14), R12 - MOVW CX, (R9) - MOVB R12, 2(R9) - ADDQ R13, R14 - ADDQ R13, R9 - JMP copy_4_end - -copy_4_move_4through7: - MOVL (R14), CX - MOVL -4(R14)(R13*1), R12 - MOVL CX, (R9) - MOVL R12, -4(R9)(R13*1) - ADDQ R13, R14 - ADDQ R13, R9 - JMP copy_4_end - -copy_4_move_8through16: - MOVQ (R14), CX - MOVQ -8(R14)(R13*1), R12 - MOVQ CX, (R9) - MOVQ R12, -8(R9)(R13*1) - ADDQ R13, R14 - ADDQ R13, R9 - -copy_4_end: - ADDQ R13, R11 - JMP handle_loop - JMP loop_finished - -copy_all_from_history: - MOVQ CX, R15 - SUBQ $0x10, R15 - JB copy_5_small - -copy_5_loop: - MOVUPS (R14), X0 - MOVUPS X0, (R9) - ADDQ $0x10, R14 - ADDQ $0x10, R9 - SUBQ $0x10, R15 - JAE copy_5_loop - LEAQ 16(R14)(R15*1), R14 - LEAQ 16(R9)(R15*1), R9 - MOVUPS -16(R14), X0 - MOVUPS X0, -16(R9) - JMP copy_5_end - -copy_5_small: - CMPQ CX, $0x03 - JE copy_5_move_3 - JB copy_5_move_1or2 - CMPQ CX, $0x08 - JB copy_5_move_4through7 - JMP copy_5_move_8through16 - -copy_5_move_1or2: - MOVB (R14), R15 - MOVB -1(R14)(CX*1), BP - MOVB R15, (R9) - MOVB BP, -1(R9)(CX*1) - ADDQ CX, R14 - ADDQ CX, R9 - JMP copy_5_end - -copy_5_move_3: - MOVW (R14), R15 - MOVB 2(R14), BP - MOVW R15, (R9) - MOVB BP, 2(R9) - ADDQ CX, R14 - ADDQ CX, R9 - JMP copy_5_end - -copy_5_move_4through7: - MOVL (R14), R15 - MOVL -4(R14)(CX*1), BP - MOVL R15, (R9) - MOVL BP, -4(R9)(CX*1) - ADDQ CX, R14 - ADDQ CX, R9 - JMP copy_5_end - -copy_5_move_8through16: - MOVQ (R14), R15 - MOVQ -8(R14)(CX*1), BP - MOVQ R15, (R9) - MOVQ BP, -8(R9)(CX*1) - ADDQ CX, R14 - ADDQ CX, R9 - -copy_5_end: - ADDQ CX, R11 - SUBQ CX, R13 - - // Copy match from the current buffer -copy_match: - MOVQ R9, CX - SUBQ R12, CX - - // ml <= mo - CMPQ R13, R12 - JA copy_overlapping_match - - // Copy non-overlapping match - ADDQ R13, R11 - MOVQ R13, R12 - SUBQ $0x10, R12 - JB copy_2_small - -copy_2_loop: - MOVUPS (CX), X0 - MOVUPS X0, (R9) - ADDQ $0x10, CX - ADDQ $0x10, R9 - SUBQ $0x10, R12 - JAE copy_2_loop - LEAQ 16(CX)(R12*1), CX - LEAQ 16(R9)(R12*1), R9 - MOVUPS -16(CX), X0 - MOVUPS X0, -16(R9) - JMP copy_2_end - -copy_2_small: - CMPQ R13, $0x03 - JE copy_2_move_3 - JB copy_2_move_1or2 - CMPQ R13, $0x08 - JB copy_2_move_4through7 - JMP copy_2_move_8through16 - -copy_2_move_1or2: - MOVB (CX), R12 - MOVB -1(CX)(R13*1), R14 - MOVB R12, (R9) - MOVB R14, -1(R9)(R13*1) - ADDQ R13, CX - ADDQ R13, R9 - JMP copy_2_end - -copy_2_move_3: - MOVW (CX), R12 - MOVB 2(CX), R14 - MOVW R12, (R9) - MOVB R14, 2(R9) - ADDQ R13, CX - ADDQ R13, R9 - JMP copy_2_end - -copy_2_move_4through7: - MOVL (CX), R12 - MOVL -4(CX)(R13*1), R14 - MOVL R12, (R9) - MOVL R14, -4(R9)(R13*1) - ADDQ R13, CX - ADDQ R13, R9 - JMP copy_2_end - -copy_2_move_8through16: - MOVQ (CX), R12 - MOVQ -8(CX)(R13*1), R14 - MOVQ R12, (R9) - MOVQ R14, -8(R9)(R13*1) - ADDQ R13, CX - ADDQ R13, R9 - -copy_2_end: - JMP handle_loop - - // Copy overlapping match -copy_overlapping_match: - ADDQ R13, R11 - -copy_slow_3: - MOVB (CX), R12 - MOVB R12, (R9) - INCQ CX - INCQ R9 - DECQ R13 - JNZ copy_slow_3 - -handle_loop: - MOVQ ctx+16(FP), CX - DECQ 96(CX) - JNS sequenceDecs_decodeSync_safe_bmi2_main_loop - -loop_finished: - MOVQ br+8(FP), CX - MOVQ AX, 24(CX) - MOVB DL, 32(CX) - MOVQ BX, 8(CX) - - // Update the context - MOVQ ctx+16(FP), AX - MOVQ R11, 136(AX) - MOVQ 144(AX), CX - SUBQ CX, R10 - MOVQ R10, 168(AX) - - // Return success - MOVQ $0x00000000, ret+24(FP) - RET - - // Return with match length error -sequenceDecs_decodeSync_safe_bmi2_error_match_len_ofs_mismatch: - MOVQ 16(SP), AX - MOVQ ctx+16(FP), CX - MOVQ AX, 216(CX) - MOVQ $0x00000001, ret+24(FP) - RET - - // Return with match too long error -sequenceDecs_decodeSync_safe_bmi2_error_match_len_too_big: - MOVQ ctx+16(FP), AX - MOVQ 16(SP), CX - MOVQ CX, 216(AX) - MOVQ $0x00000002, ret+24(FP) - RET - - // Return with match offset too long error -error_match_off_too_big: - MOVQ ctx+16(FP), AX - MOVQ 8(SP), CX - MOVQ CX, 224(AX) - MOVQ R11, 136(AX) - MOVQ $0x00000003, ret+24(FP) - RET - - // Return with not enough literals error -error_not_enough_literals: - MOVQ ctx+16(FP), AX - MOVQ 24(SP), CX - MOVQ CX, 208(AX) - MOVQ $0x00000004, ret+24(FP) - RET - - // Return with overread error -error_overread: - MOVQ $0x00000006, ret+24(FP) - RET - - // Return with not enough output space error -error_not_enough_space: - MOVQ ctx+16(FP), AX - MOVQ 24(SP), CX - MOVQ CX, 208(AX) - MOVQ 16(SP), CX - MOVQ CX, 216(AX) - MOVQ R11, 136(AX) - MOVQ $0x00000005, ret+24(FP) - RET diff --git a/vendor/github.com/klauspost/compress/zstd/seqdec_generic.go b/vendor/github.com/klauspost/compress/zstd/seqdec_generic.go deleted file mode 100644 index 2fb35b788c..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/seqdec_generic.go +++ /dev/null @@ -1,237 +0,0 @@ -//go:build !amd64 || appengine || !gc || noasm -// +build !amd64 appengine !gc noasm - -package zstd - -import ( - "fmt" - "io" -) - -// decode sequences from the stream with the provided history but without dictionary. -func (s *sequenceDecs) decodeSyncSimple(hist []byte) (bool, error) { - return false, nil -} - -// decode sequences from the stream without the provided history. -func (s *sequenceDecs) decode(seqs []seqVals) error { - br := s.br - - // Grab full sizes tables, to avoid bounds checks. - llTable, mlTable, ofTable := s.litLengths.fse.dt[:maxTablesize], s.matchLengths.fse.dt[:maxTablesize], s.offsets.fse.dt[:maxTablesize] - llState, mlState, ofState := s.litLengths.state.state, s.matchLengths.state.state, s.offsets.state.state - s.seqSize = 0 - litRemain := len(s.literals) - - maxBlockSize := maxCompressedBlockSize - if s.windowSize < maxBlockSize { - maxBlockSize = s.windowSize - } - for i := range seqs { - var ll, mo, ml int - if len(br.in) > 4+((maxOffsetBits+16+16)>>3) { - // inlined function: - // ll, mo, ml = s.nextFast(br, llState, mlState, ofState) - - // Final will not read from stream. - var llB, mlB, moB uint8 - ll, llB = llState.final() - ml, mlB = mlState.final() - mo, moB = ofState.final() - - // extra bits are stored in reverse order. - br.fillFast() - mo += br.getBits(moB) - if s.maxBits > 32 { - br.fillFast() - } - ml += br.getBits(mlB) - ll += br.getBits(llB) - - if moB > 1 { - s.prevOffset[2] = s.prevOffset[1] - s.prevOffset[1] = s.prevOffset[0] - s.prevOffset[0] = mo - } else { - // mo = s.adjustOffset(mo, ll, moB) - // Inlined for rather big speedup - if ll == 0 { - // There is an exception though, when current sequence's literals_length = 0. - // In this case, repeated offsets are shifted by one, so an offset_value of 1 means Repeated_Offset2, - // an offset_value of 2 means Repeated_Offset3, and an offset_value of 3 means Repeated_Offset1 - 1_byte. - mo++ - } - - if mo == 0 { - mo = s.prevOffset[0] - } else { - var temp int - if mo == 3 { - temp = s.prevOffset[0] - 1 - } else { - temp = s.prevOffset[mo] - } - - if temp == 0 { - // 0 is not valid; input is corrupted; force offset to 1 - println("WARNING: temp was 0") - temp = 1 - } - - if mo != 1 { - s.prevOffset[2] = s.prevOffset[1] - } - s.prevOffset[1] = s.prevOffset[0] - s.prevOffset[0] = temp - mo = temp - } - } - br.fillFast() - } else { - if br.overread() { - if debugDecoder { - printf("reading sequence %d, exceeded available data\n", i) - } - return io.ErrUnexpectedEOF - } - ll, mo, ml = s.next(br, llState, mlState, ofState) - br.fill() - } - - if debugSequences { - println("Seq", i, "Litlen:", ll, "mo:", mo, "(abs) ml:", ml) - } - // Evaluate. - // We might be doing this async, so do it early. - if mo == 0 && ml > 0 { - return fmt.Errorf("zero matchoff and matchlen (%d) > 0", ml) - } - if ml > maxMatchLen { - return fmt.Errorf("match len (%d) bigger than max allowed length", ml) - } - s.seqSize += ll + ml - if s.seqSize > maxBlockSize { - return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) - } - litRemain -= ll - if litRemain < 0 { - return fmt.Errorf("unexpected literal count, want %d bytes, but only %d is available", ll, litRemain+ll) - } - seqs[i] = seqVals{ - ll: ll, - ml: ml, - mo: mo, - } - if i == len(seqs)-1 { - // This is the last sequence, so we shouldn't update state. - break - } - - // Manually inlined, ~ 5-20% faster - // Update all 3 states at once. Approx 20% faster. - nBits := llState.nbBits() + mlState.nbBits() + ofState.nbBits() - if nBits == 0 { - llState = llTable[llState.newState()&maxTableMask] - mlState = mlTable[mlState.newState()&maxTableMask] - ofState = ofTable[ofState.newState()&maxTableMask] - } else { - bits := br.get32BitsFast(nBits) - lowBits := uint16(bits >> ((ofState.nbBits() + mlState.nbBits()) & 31)) - llState = llTable[(llState.newState()+lowBits)&maxTableMask] - - lowBits = uint16(bits >> (ofState.nbBits() & 31)) - lowBits &= bitMask[mlState.nbBits()&15] - mlState = mlTable[(mlState.newState()+lowBits)&maxTableMask] - - lowBits = uint16(bits) & bitMask[ofState.nbBits()&15] - ofState = ofTable[(ofState.newState()+lowBits)&maxTableMask] - } - } - s.seqSize += litRemain - if s.seqSize > maxBlockSize { - return fmt.Errorf("output bigger than max block size (%d)", maxBlockSize) - } - err := br.close() - if err != nil { - printf("Closing sequences: %v, %+v\n", err, *br) - } - return err -} - -// executeSimple handles cases when a dictionary is not used. -func (s *sequenceDecs) executeSimple(seqs []seqVals, hist []byte) error { - // Ensure we have enough output size... - if len(s.out)+s.seqSize > cap(s.out) { - addBytes := s.seqSize + len(s.out) - s.out = append(s.out, make([]byte, addBytes)...) - s.out = s.out[:len(s.out)-addBytes] - } - - if debugDecoder { - printf("Execute %d seqs with literals: %d into %d bytes\n", len(seqs), len(s.literals), s.seqSize) - } - - var t = len(s.out) - out := s.out[:t+s.seqSize] - - for _, seq := range seqs { - // Add literals - copy(out[t:], s.literals[:seq.ll]) - t += seq.ll - s.literals = s.literals[seq.ll:] - - // Malformed input - if seq.mo > t+len(hist) || seq.mo > s.windowSize { - return fmt.Errorf("match offset (%d) bigger than current history (%d)", seq.mo, t+len(hist)) - } - - // Copy from history. - if v := seq.mo - t; v > 0 { - // v is the start position in history from end. - start := len(hist) - v - if seq.ml > v { - // Some goes into the current block. - // Copy remainder of history - copy(out[t:], hist[start:]) - t += v - seq.ml -= v - } else { - copy(out[t:], hist[start:start+seq.ml]) - t += seq.ml - continue - } - } - - // We must be in the current buffer now - if seq.ml > 0 { - start := t - seq.mo - if seq.ml <= t-start { - // No overlap - copy(out[t:], out[start:start+seq.ml]) - t += seq.ml - } else { - // Overlapping copy - // Extend destination slice and copy one byte at the time. - src := out[start : start+seq.ml] - dst := out[t:] - dst = dst[:len(src)] - t += len(src) - // Destination is the space we just added. - for i := range src { - dst[i] = src[i] - } - } - } - } - // Add final literals - copy(out[t:], s.literals) - if debugDecoder { - t += len(s.literals) - if t != len(out) { - panic(fmt.Errorf("length mismatch, want %d, got %d, ss: %d", len(out), t, s.seqSize)) - } - } - s.out = out - - return nil -} diff --git a/vendor/github.com/klauspost/compress/zstd/seqenc.go b/vendor/github.com/klauspost/compress/zstd/seqenc.go deleted file mode 100644 index 8014174a77..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/seqenc.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import "math/bits" - -type seqCoders struct { - llEnc, ofEnc, mlEnc *fseEncoder - llPrev, ofPrev, mlPrev *fseEncoder -} - -// swap coders with another (block). -func (s *seqCoders) swap(other *seqCoders) { - *s, *other = *other, *s -} - -// setPrev will update the previous encoders to the actually used ones -// and make sure a fresh one is in the main slot. -func (s *seqCoders) setPrev(ll, ml, of *fseEncoder) { - compareSwap := func(used *fseEncoder, current, prev **fseEncoder) { - // We used the new one, more current to history and reuse the previous history - if *current == used { - *prev, *current = *current, *prev - c := *current - p := *prev - c.reUsed = false - p.reUsed = true - return - } - if used == *prev { - return - } - // Ensure we cannot reuse by accident - prevEnc := *prev - prevEnc.symbolLen = 0 - } - compareSwap(ll, &s.llEnc, &s.llPrev) - compareSwap(ml, &s.mlEnc, &s.mlPrev) - compareSwap(of, &s.ofEnc, &s.ofPrev) -} - -func highBit(val uint32) (n uint32) { - return uint32(bits.Len32(val) - 1) -} - -var llCodeTable = [64]byte{0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 16, 17, 17, 18, 18, 19, 19, - 20, 20, 20, 20, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 22, 22, 22, - 23, 23, 23, 23, 23, 23, 23, 23, - 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24} - -// Up to 6 bits -const maxLLCode = 35 - -// llBitsTable translates from ll code to number of bits. -var llBitsTable = [maxLLCode + 1]byte{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 2, 2, 3, 3, - 4, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16} - -// llCode returns the code that represents the literal length requested. -func llCode(litLength uint32) uint8 { - const llDeltaCode = 19 - if litLength <= 63 { - // Compiler insists on bounds check (Go 1.12) - return llCodeTable[litLength&63] - } - return uint8(highBit(litLength)) + llDeltaCode -} - -var mlCodeTable = [128]byte{0, 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, 33, 33, 34, 34, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, - 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42} - -// Up to 6 bits -const maxMLCode = 52 - -// mlBitsTable translates from ml code to number of bits. -var mlBitsTable = [maxMLCode + 1]byte{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 2, 2, 3, 3, - 4, 4, 5, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16} - -// note : mlBase = matchLength - MINMATCH; -// because it's the format it's stored in seqStore->sequences -func mlCode(mlBase uint32) uint8 { - const mlDeltaCode = 36 - if mlBase <= 127 { - // Compiler insists on bounds check (Go 1.12) - return mlCodeTable[mlBase&127] - } - return uint8(highBit(mlBase)) + mlDeltaCode -} - -func ofCode(offset uint32) uint8 { - // A valid offset will always be > 0. - return uint8(bits.Len32(offset) - 1) -} diff --git a/vendor/github.com/klauspost/compress/zstd/snappy.go b/vendor/github.com/klauspost/compress/zstd/snappy.go deleted file mode 100644 index ec13594e89..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/snappy.go +++ /dev/null @@ -1,434 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. -// Based on work by Yann Collet, released under BSD License. - -package zstd - -import ( - "encoding/binary" - "errors" - "hash/crc32" - "io" - - "github.com/klauspost/compress/huff0" - snappy "github.com/klauspost/compress/internal/snapref" -) - -const ( - snappyTagLiteral = 0x00 - snappyTagCopy1 = 0x01 - snappyTagCopy2 = 0x02 - snappyTagCopy4 = 0x03 -) - -const ( - snappyChecksumSize = 4 - snappyMagicBody = "sNaPpY" - - // snappyMaxBlockSize is the maximum size of the input to encodeBlock. It is not - // part of the wire format per se, but some parts of the encoder assume - // that an offset fits into a uint16. - // - // Also, for the framing format (Writer type instead of Encode function), - // https://github.com/google/snappy/blob/master/framing_format.txt says - // that "the uncompressed data in a chunk must be no longer than 65536 - // bytes". - snappyMaxBlockSize = 65536 - - // snappyMaxEncodedLenOfMaxBlockSize equals MaxEncodedLen(snappyMaxBlockSize), but is - // hard coded to be a const instead of a variable, so that obufLen can also - // be a const. Their equivalence is confirmed by - // TestMaxEncodedLenOfMaxBlockSize. - snappyMaxEncodedLenOfMaxBlockSize = 76490 -) - -const ( - chunkTypeCompressedData = 0x00 - chunkTypeUncompressedData = 0x01 - chunkTypePadding = 0xfe - chunkTypeStreamIdentifier = 0xff -) - -var ( - // ErrSnappyCorrupt reports that the input is invalid. - ErrSnappyCorrupt = errors.New("snappy: corrupt input") - // ErrSnappyTooLarge reports that the uncompressed length is too large. - ErrSnappyTooLarge = errors.New("snappy: decoded block is too large") - // ErrSnappyUnsupported reports that the input isn't supported. - ErrSnappyUnsupported = errors.New("snappy: unsupported input") - - errUnsupportedLiteralLength = errors.New("snappy: unsupported literal length") -) - -// SnappyConverter can read SnappyConverter-compressed streams and convert them to zstd. -// Conversion is done by converting the stream directly from Snappy without intermediate -// full decoding. -// Therefore the compression ratio is much less than what can be done by a full decompression -// and compression, and a faulty Snappy stream may lead to a faulty Zstandard stream without -// any errors being generated. -// No CRC value is being generated and not all CRC values of the Snappy stream are checked. -// However, it provides really fast recompression of Snappy streams. -// The converter can be reused to avoid allocations, even after errors. -type SnappyConverter struct { - r io.Reader - err error - buf []byte - block *blockEnc -} - -// Convert the Snappy stream supplied in 'in' and write the zStandard stream to 'w'. -// If any error is detected on the Snappy stream it is returned. -// The number of bytes written is returned. -func (r *SnappyConverter) Convert(in io.Reader, w io.Writer) (int64, error) { - initPredefined() - r.err = nil - r.r = in - if r.block == nil { - r.block = &blockEnc{} - r.block.init() - } - r.block.initNewEncode() - if len(r.buf) != snappyMaxEncodedLenOfMaxBlockSize+snappyChecksumSize { - r.buf = make([]byte, snappyMaxEncodedLenOfMaxBlockSize+snappyChecksumSize) - } - r.block.litEnc.Reuse = huff0.ReusePolicyNone - var written int64 - var readHeader bool - { - header := frameHeader{WindowSize: snappyMaxBlockSize}.appendTo(r.buf[:0]) - - var n int - n, r.err = w.Write(header) - if r.err != nil { - return written, r.err - } - written += int64(n) - } - - for { - if !r.readFull(r.buf[:4], true) { - // Add empty last block - r.block.reset(nil) - r.block.last = true - err := r.block.encodeLits(r.block.literals, false) - if err != nil { - return written, err - } - n, err := w.Write(r.block.output) - if err != nil { - return written, err - } - written += int64(n) - - return written, r.err - } - chunkType := r.buf[0] - if !readHeader { - if chunkType != chunkTypeStreamIdentifier { - println("chunkType != chunkTypeStreamIdentifier", chunkType) - r.err = ErrSnappyCorrupt - return written, r.err - } - readHeader = true - } - chunkLen := int(r.buf[1]) | int(r.buf[2])<<8 | int(r.buf[3])<<16 - if chunkLen > len(r.buf) { - println("chunkLen > len(r.buf)", chunkType) - r.err = ErrSnappyUnsupported - return written, r.err - } - - // The chunk types are specified at - // https://github.com/google/snappy/blob/master/framing_format.txt - switch chunkType { - case chunkTypeCompressedData: - // Section 4.2. Compressed data (chunk type 0x00). - if chunkLen < snappyChecksumSize { - println("chunkLen < snappyChecksumSize", chunkLen, snappyChecksumSize) - r.err = ErrSnappyCorrupt - return written, r.err - } - buf := r.buf[:chunkLen] - if !r.readFull(buf, false) { - return written, r.err - } - //checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 - buf = buf[snappyChecksumSize:] - - n, hdr, err := snappyDecodedLen(buf) - if err != nil { - r.err = err - return written, r.err - } - buf = buf[hdr:] - if n > snappyMaxBlockSize { - println("n > snappyMaxBlockSize", n, snappyMaxBlockSize) - r.err = ErrSnappyCorrupt - return written, r.err - } - r.block.reset(nil) - r.block.pushOffsets() - if err := decodeSnappy(r.block, buf); err != nil { - r.err = err - return written, r.err - } - if r.block.size+r.block.extraLits != n { - printf("invalid size, want %d, got %d\n", n, r.block.size+r.block.extraLits) - r.err = ErrSnappyCorrupt - return written, r.err - } - err = r.block.encode(nil, false, false) - switch err { - case errIncompressible: - r.block.popOffsets() - r.block.reset(nil) - r.block.literals, err = snappy.Decode(r.block.literals[:n], r.buf[snappyChecksumSize:chunkLen]) - if err != nil { - return written, err - } - err = r.block.encodeLits(r.block.literals, false) - if err != nil { - return written, err - } - case nil: - default: - return written, err - } - - n, r.err = w.Write(r.block.output) - if r.err != nil { - return written, err - } - written += int64(n) - continue - case chunkTypeUncompressedData: - if debugEncoder { - println("Uncompressed, chunklen", chunkLen) - } - // Section 4.3. Uncompressed data (chunk type 0x01). - if chunkLen < snappyChecksumSize { - println("chunkLen < snappyChecksumSize", chunkLen, snappyChecksumSize) - r.err = ErrSnappyCorrupt - return written, r.err - } - r.block.reset(nil) - buf := r.buf[:snappyChecksumSize] - if !r.readFull(buf, false) { - return written, r.err - } - checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 - // Read directly into r.decoded instead of via r.buf. - n := chunkLen - snappyChecksumSize - if n > snappyMaxBlockSize { - println("n > snappyMaxBlockSize", n, snappyMaxBlockSize) - r.err = ErrSnappyCorrupt - return written, r.err - } - r.block.literals = r.block.literals[:n] - if !r.readFull(r.block.literals, false) { - return written, r.err - } - if snappyCRC(r.block.literals) != checksum { - println("literals crc mismatch") - r.err = ErrSnappyCorrupt - return written, r.err - } - err := r.block.encodeLits(r.block.literals, false) - if err != nil { - return written, err - } - n, r.err = w.Write(r.block.output) - if r.err != nil { - return written, err - } - written += int64(n) - continue - - case chunkTypeStreamIdentifier: - if debugEncoder { - println("stream id", chunkLen, len(snappyMagicBody)) - } - // Section 4.1. Stream identifier (chunk type 0xff). - if chunkLen != len(snappyMagicBody) { - println("chunkLen != len(snappyMagicBody)", chunkLen, len(snappyMagicBody)) - r.err = ErrSnappyCorrupt - return written, r.err - } - if !r.readFull(r.buf[:len(snappyMagicBody)], false) { - return written, r.err - } - for i := 0; i < len(snappyMagicBody); i++ { - if r.buf[i] != snappyMagicBody[i] { - println("r.buf[i] != snappyMagicBody[i]", r.buf[i], snappyMagicBody[i], i) - r.err = ErrSnappyCorrupt - return written, r.err - } - } - continue - } - - if chunkType <= 0x7f { - // Section 4.5. Reserved unskippable chunks (chunk types 0x02-0x7f). - println("chunkType <= 0x7f") - r.err = ErrSnappyUnsupported - return written, r.err - } - // Section 4.4 Padding (chunk type 0xfe). - // Section 4.6. Reserved skippable chunks (chunk types 0x80-0xfd). - if !r.readFull(r.buf[:chunkLen], false) { - return written, r.err - } - } -} - -// decodeSnappy writes the decoding of src to dst. It assumes that the varint-encoded -// length of the decompressed bytes has already been read. -func decodeSnappy(blk *blockEnc, src []byte) error { - //decodeRef(make([]byte, snappyMaxBlockSize), src) - var s, length int - lits := blk.extraLits - var offset uint32 - for s < len(src) { - switch src[s] & 0x03 { - case snappyTagLiteral: - x := uint32(src[s] >> 2) - switch { - case x < 60: - s++ - case x == 60: - s += 2 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - println("uint(s) > uint(len(src)", s, src) - return ErrSnappyCorrupt - } - x = uint32(src[s-1]) - case x == 61: - s += 3 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - println("uint(s) > uint(len(src)", s, src) - return ErrSnappyCorrupt - } - x = uint32(src[s-2]) | uint32(src[s-1])<<8 - case x == 62: - s += 4 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - println("uint(s) > uint(len(src)", s, src) - return ErrSnappyCorrupt - } - x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16 - case x == 63: - s += 5 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - println("uint(s) > uint(len(src)", s, src) - return ErrSnappyCorrupt - } - x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 - } - if x > snappyMaxBlockSize { - println("x > snappyMaxBlockSize", x, snappyMaxBlockSize) - return ErrSnappyCorrupt - } - length = int(x) + 1 - if length <= 0 { - println("length <= 0 ", length) - - return errUnsupportedLiteralLength - } - //if length > snappyMaxBlockSize-d || uint32(length) > len(src)-s { - // return ErrSnappyCorrupt - //} - - blk.literals = append(blk.literals, src[s:s+length]...) - //println(length, "litLen") - lits += length - s += length - continue - - case snappyTagCopy1: - s += 2 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - println("uint(s) > uint(len(src)", s, len(src)) - return ErrSnappyCorrupt - } - length = 4 + int(src[s-2])>>2&0x7 - offset = uint32(src[s-2])&0xe0<<3 | uint32(src[s-1]) - - case snappyTagCopy2: - s += 3 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - println("uint(s) > uint(len(src)", s, len(src)) - return ErrSnappyCorrupt - } - length = 1 + int(src[s-3])>>2 - offset = uint32(src[s-2]) | uint32(src[s-1])<<8 - - case snappyTagCopy4: - s += 5 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - println("uint(s) > uint(len(src)", s, len(src)) - return ErrSnappyCorrupt - } - length = 1 + int(src[s-5])>>2 - offset = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 - } - - if offset <= 0 || blk.size+lits < int(offset) /*|| length > len(blk)-d */ { - println("offset <= 0 || blk.size+lits < int(offset)", offset, blk.size+lits, int(offset), blk.size, lits) - - return ErrSnappyCorrupt - } - - // Check if offset is one of the recent offsets. - // Adjusts the output offset accordingly. - // Gives a tiny bit of compression, typically around 1%. - if false { - offset = blk.matchOffset(offset, uint32(lits)) - } else { - offset += 3 - } - - blk.sequences = append(blk.sequences, seq{ - litLen: uint32(lits), - offset: offset, - matchLen: uint32(length) - zstdMinMatch, - }) - blk.size += length + lits - lits = 0 - } - blk.extraLits = lits - return nil -} - -func (r *SnappyConverter) readFull(p []byte, allowEOF bool) (ok bool) { - if _, r.err = io.ReadFull(r.r, p); r.err != nil { - if r.err == io.ErrUnexpectedEOF || (r.err == io.EOF && !allowEOF) { - r.err = ErrSnappyCorrupt - } - return false - } - return true -} - -var crcTable = crc32.MakeTable(crc32.Castagnoli) - -// crc implements the checksum specified in section 3 of -// https://github.com/google/snappy/blob/master/framing_format.txt -func snappyCRC(b []byte) uint32 { - c := crc32.Update(0, crcTable, b) - return c>>15 | c<<17 + 0xa282ead8 -} - -// snappyDecodedLen returns the length of the decoded block and the number of bytes -// that the length header occupied. -func snappyDecodedLen(src []byte) (blockLen, headerLen int, err error) { - v, n := binary.Uvarint(src) - if n <= 0 || v > 0xffffffff { - return 0, 0, ErrSnappyCorrupt - } - - const wordSize = 32 << (^uint(0) >> 32 & 1) - if wordSize == 32 && v > 0x7fffffff { - return 0, 0, ErrSnappyTooLarge - } - return int(v), n, nil -} diff --git a/vendor/github.com/klauspost/compress/zstd/zip.go b/vendor/github.com/klauspost/compress/zstd/zip.go deleted file mode 100644 index 29c15c8c4e..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/zip.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2019+ Klaus Post. All rights reserved. -// License information can be found in the LICENSE file. - -package zstd - -import ( - "errors" - "io" - "sync" -) - -// ZipMethodWinZip is the method for Zstandard compressed data inside Zip files for WinZip. -// See https://www.winzip.com/win/en/comp_info.html -const ZipMethodWinZip = 93 - -// ZipMethodPKWare is the original method number used by PKWARE to indicate Zstandard compression. -// Deprecated: This has been deprecated by PKWARE, use ZipMethodWinZip instead for compression. -// See https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.3.9.TXT -const ZipMethodPKWare = 20 - -// zipReaderPool is the default reader pool. -var zipReaderPool = sync.Pool{New: func() interface{} { - z, err := NewReader(nil, WithDecoderLowmem(true), WithDecoderMaxWindow(128<<20), WithDecoderConcurrency(1)) - if err != nil { - panic(err) - } - return z -}} - -// newZipReader creates a pooled zip decompressor. -func newZipReader(opts ...DOption) func(r io.Reader) io.ReadCloser { - pool := &zipReaderPool - if len(opts) > 0 { - opts = append([]DOption{WithDecoderLowmem(true), WithDecoderMaxWindow(128 << 20)}, opts...) - // Force concurrency 1 - opts = append(opts, WithDecoderConcurrency(1)) - // Create our own pool - pool = &sync.Pool{} - } - return func(r io.Reader) io.ReadCloser { - dec, ok := pool.Get().(*Decoder) - if ok { - dec.Reset(r) - } else { - d, err := NewReader(r, opts...) - if err != nil { - panic(err) - } - dec = d - } - return &pooledZipReader{dec: dec, pool: pool} - } -} - -type pooledZipReader struct { - mu sync.Mutex // guards Close and Read - pool *sync.Pool - dec *Decoder -} - -func (r *pooledZipReader) Read(p []byte) (n int, err error) { - r.mu.Lock() - defer r.mu.Unlock() - if r.dec == nil { - return 0, errors.New("read after close or EOF") - } - dec, err := r.dec.Read(p) - if err == io.EOF { - r.dec.Reset(nil) - r.pool.Put(r.dec) - r.dec = nil - } - return dec, err -} - -func (r *pooledZipReader) Close() error { - r.mu.Lock() - defer r.mu.Unlock() - var err error - if r.dec != nil { - err = r.dec.Reset(nil) - r.pool.Put(r.dec) - r.dec = nil - } - return err -} - -type pooledZipWriter struct { - mu sync.Mutex // guards Close and Read - enc *Encoder - pool *sync.Pool -} - -func (w *pooledZipWriter) Write(p []byte) (n int, err error) { - w.mu.Lock() - defer w.mu.Unlock() - if w.enc == nil { - return 0, errors.New("Write after Close") - } - return w.enc.Write(p) -} - -func (w *pooledZipWriter) Close() error { - w.mu.Lock() - defer w.mu.Unlock() - var err error - if w.enc != nil { - err = w.enc.Close() - w.pool.Put(w.enc) - w.enc = nil - } - return err -} - -// ZipCompressor returns a compressor that can be registered with zip libraries. -// The provided encoder options will be used on all encodes. -func ZipCompressor(opts ...EOption) func(w io.Writer) (io.WriteCloser, error) { - var pool sync.Pool - return func(w io.Writer) (io.WriteCloser, error) { - enc, ok := pool.Get().(*Encoder) - if ok { - enc.Reset(w) - } else { - var err error - enc, err = NewWriter(w, opts...) - if err != nil { - return nil, err - } - } - return &pooledZipWriter{enc: enc, pool: &pool}, nil - } -} - -// ZipDecompressor returns a decompressor that can be registered with zip libraries. -// See ZipCompressor for example. -// Options can be specified. WithDecoderConcurrency(1) is forced, -// and by default a 128MB maximum decompression window is specified. -// The window size can be overridden if required. -func ZipDecompressor(opts ...DOption) func(r io.Reader) io.ReadCloser { - return newZipReader(opts...) -} diff --git a/vendor/github.com/klauspost/compress/zstd/zstd.go b/vendor/github.com/klauspost/compress/zstd/zstd.go deleted file mode 100644 index 066bef2a4f..0000000000 --- a/vendor/github.com/klauspost/compress/zstd/zstd.go +++ /dev/null @@ -1,125 +0,0 @@ -// Package zstd provides decompression of zstandard files. -// -// For advanced usage and examples, go to the README: https://github.com/klauspost/compress/tree/master/zstd#zstd -package zstd - -import ( - "bytes" - "encoding/binary" - "errors" - "log" - "math" -) - -// enable debug printing -const debug = false - -// enable encoding debug printing -const debugEncoder = debug - -// enable decoding debug printing -const debugDecoder = debug - -// Enable extra assertions. -const debugAsserts = debug || false - -// print sequence details -const debugSequences = false - -// print detailed matching information -const debugMatches = false - -// force encoder to use predefined tables. -const forcePreDef = false - -// zstdMinMatch is the minimum zstd match length. -const zstdMinMatch = 3 - -// fcsUnknown is used for unknown frame content size. -const fcsUnknown = math.MaxUint64 - -var ( - // ErrReservedBlockType is returned when a reserved block type is found. - // Typically this indicates wrong or corrupted input. - ErrReservedBlockType = errors.New("invalid input: reserved block type encountered") - - // ErrCompressedSizeTooBig is returned when a block is bigger than allowed. - // Typically this indicates wrong or corrupted input. - ErrCompressedSizeTooBig = errors.New("invalid input: compressed size too big") - - // ErrBlockTooSmall is returned when a block is too small to be decoded. - // Typically returned on invalid input. - ErrBlockTooSmall = errors.New("block too small") - - // ErrUnexpectedBlockSize is returned when a block has unexpected size. - // Typically returned on invalid input. - ErrUnexpectedBlockSize = errors.New("unexpected block size") - - // ErrMagicMismatch is returned when a "magic" number isn't what is expected. - // Typically this indicates wrong or corrupted input. - ErrMagicMismatch = errors.New("invalid input: magic number mismatch") - - // ErrWindowSizeExceeded is returned when a reference exceeds the valid window size. - // Typically this indicates wrong or corrupted input. - ErrWindowSizeExceeded = errors.New("window size exceeded") - - // ErrWindowSizeTooSmall is returned when no window size is specified. - // Typically this indicates wrong or corrupted input. - ErrWindowSizeTooSmall = errors.New("invalid input: window size was too small") - - // ErrDecoderSizeExceeded is returned if decompressed size exceeds the configured limit. - ErrDecoderSizeExceeded = errors.New("decompressed size exceeds configured limit") - - // ErrUnknownDictionary is returned if the dictionary ID is unknown. - ErrUnknownDictionary = errors.New("unknown dictionary") - - // ErrFrameSizeExceeded is returned if the stated frame size is exceeded. - // This is only returned if SingleSegment is specified on the frame. - ErrFrameSizeExceeded = errors.New("frame size exceeded") - - // ErrFrameSizeMismatch is returned if the stated frame size does not match the expected size. - // This is only returned if SingleSegment is specified on the frame. - ErrFrameSizeMismatch = errors.New("frame size does not match size on stream") - - // ErrCRCMismatch is returned if CRC mismatches. - ErrCRCMismatch = errors.New("CRC check failed") - - // ErrDecoderClosed will be returned if the Decoder was used after - // Close has been called. - ErrDecoderClosed = errors.New("decoder used after Close") - - // ErrEncoderClosed will be returned if the Encoder was used after - // Close has been called. - ErrEncoderClosed = errors.New("encoder used after Close") - - // ErrDecoderNilInput is returned when a nil Reader was provided - // and an operation other than Reset/DecodeAll/Close was attempted. - ErrDecoderNilInput = errors.New("nil input provided as reader") -) - -func println(a ...interface{}) { - if debug || debugDecoder || debugEncoder { - log.Println(a...) - } -} - -func printf(format string, a ...interface{}) { - if debug || debugDecoder || debugEncoder { - log.Printf(format, a...) - } -} - -func load3232(b []byte, i int32) uint32 { - return binary.LittleEndian.Uint32(b[:len(b):len(b)][i:]) -} - -func load6432(b []byte, i int32) uint64 { - return binary.LittleEndian.Uint64(b[:len(b):len(b)][i:]) -} - -type byter interface { - Bytes() []byte - Len() int -} - -var _ byter = &bytes.Buffer{} diff --git a/vendor/github.com/skycoin/skywire-services/cmd/node-visualizer/commands/root.go b/vendor/github.com/skycoin/skywire-services/cmd/node-visualizer/commands/root.go deleted file mode 100644 index dfff85ccf1..0000000000 --- a/vendor/github.com/skycoin/skywire-services/cmd/node-visualizer/commands/root.go +++ /dev/null @@ -1,100 +0,0 @@ -// Package commands cmd/node-visualizer/commands/root.go -package commands - -import ( - "context" - "fmt" - "log" - "net/http" - "os" - "path/filepath" - "strings" - "time" - - "github.com/skycoin/skywire-utilities/pkg/buildinfo" - "github.com/skycoin/skywire-utilities/pkg/cmdutil" - "github.com/skycoin/skywire-utilities/pkg/logging" - "github.com/skycoin/skywire-utilities/pkg/metricsutil" - "github.com/spf13/cobra" - - "github.com/skycoin/skywire-services/internal/tpdiscmetrics" - "github.com/skycoin/skywire-services/pkg/node-visualizer/api" -) - -var ( - addr string - metricsAddr string - logEnabled bool - tag string - testing bool -) - -func init() { - RootCmd.Flags().StringVarP(&addr, "addr", "a", ":9081", "address to bind to\033[0m") - RootCmd.Flags().StringVarP(&metricsAddr, "metrics", "m", "", "address to bind metrics API to\033[0m") - RootCmd.Flags().BoolVarP(&logEnabled, "log", "l", true, "enable request logging\033[0m") - RootCmd.Flags().StringVar(&tag, "tag", "node-visualizer", "logging tag\033[0m") - RootCmd.Flags().BoolVarP(&testing, "testing", "t", false, "enable testing to start without redis\033[0m") -} - -// RootCmd contains the root command -var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), - Short: "Node Visualizer Server for skywire", - Long: ` - ┌┐┌┌─┐┌┬┐┌─┐ ┬ ┬┬┌─┐┬ ┬┌─┐┬ ┬┌─┐┌─┐┬─┐ - ││││ │ ││├┤───└┐┌┘│└─┐│ │├─┤│ │┌─┘├┤ ├┬┘ - ┘└┘└─┘─┴┘└─┘ └┘ ┴└─┘└─┘┴ ┴┴─┘┴└─┘└─┘┴└─`, - SilenceErrors: true, - SilenceUsage: true, - DisableSuggestions: true, - DisableFlagsInUseLine: true, - Version: buildinfo.Version(), - Run: func(_ *cobra.Command, _ []string) { - if _, err := buildinfo.Get().WriteTo(os.Stdout); err != nil { - log.Printf("Failed to output build info: %v", err) - } - - const loggerTag = "node_visualizer" - logger := logging.MustGetLogger(loggerTag) - - metricsutil.ServeHTTPMetrics(logger, metricsAddr) - - var m tpdiscmetrics.Metrics - if metricsAddr == "" { - m = tpdiscmetrics.NewEmpty() - } else { - m = tpdiscmetrics.NewVictoriaMetrics() - } - - enableMetrics := metricsAddr != "" - nvAPI := api.New(logger, enableMetrics, m) - - logger.Infof("Listening on %s", addr) - ctx, cancel := cmdutil.SignalContext(context.Background(), logger) - defer cancel() - go nvAPI.RunBackgroundTasks(ctx, logger) - go func() { - srv := &http.Server{ - Addr: addr, - ReadHeaderTimeout: 2 * time.Second, - IdleTimeout: 30 * time.Second, - Handler: nvAPI, - } - if err := srv.ListenAndServe(); err != nil { - logger.Errorf("ListenAndServe: %v", err) - cancel() - } - }() - <-ctx.Done() - }, -} - -// Execute executes root CLI command. -func Execute() { - if err := RootCmd.Execute(); err != nil { - log.Fatal("Failed to execute command: ", err) - } -} diff --git a/vendor/github.com/skycoin/skywire-services/cmd/skywire-services/commands/root.go b/vendor/github.com/skycoin/skywire-services/cmd/skywire-services/commands/root.go index 69157ef588..580d85f52e 100644 --- a/vendor/github.com/skycoin/skywire-services/cmd/skywire-services/commands/root.go +++ b/vendor/github.com/skycoin/skywire-services/cmd/skywire-services/commands/root.go @@ -14,7 +14,6 @@ import ( ar "github.com/skycoin/skywire-services/cmd/address-resolver/commands" confbs "github.com/skycoin/skywire-services/cmd/config-bootstrapper/commands" kg "github.com/skycoin/skywire-services/cmd/keys-gen/commands" - nv "github.com/skycoin/skywire-services/cmd/node-visualizer/commands" rf "github.com/skycoin/skywire-services/cmd/route-finder/commands" se "github.com/skycoin/skywire-services/cmd/sw-env/commands" tpd "github.com/skycoin/skywire-services/cmd/transport-discovery/commands" @@ -30,7 +29,6 @@ func init() { rf.RootCmd, confbs.RootCmd, kg.RootCmd, - nv.RootCmd, se.RootCmd, ut.RootCmd, ) @@ -40,7 +38,6 @@ func init() { rf.RootCmd.Use = "rf" confbs.RootCmd.Use = "confbs" kg.RootCmd.Use = "kg" - nv.RootCmd.Use = "nv" se.RootCmd.Use = "se" ut.RootCmd.Use = "ut" } diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/api.go b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/api.go deleted file mode 100644 index 8bd07f39c9..0000000000 --- a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/api.go +++ /dev/null @@ -1,270 +0,0 @@ -// Package api pkg/node-visualizer/api/api.go -package api - -import ( - "context" - "embed" - "errors" - "io" - "io/fs" - "net/http" - "os" - "path/filepath" - "strings" - "time" - - "github.com/dgraph-io/badger/v3" - "github.com/go-chi/chi/v5" - "github.com/go-chi/chi/v5/middleware" - json "github.com/json-iterator/go" - "github.com/rs/cors" - "github.com/sirupsen/logrus" - "github.com/skycoin/skywire-utilities/pkg/buildinfo" - "github.com/skycoin/skywire-utilities/pkg/httputil" - "github.com/skycoin/skywire-utilities/pkg/logging" - "github.com/skycoin/skywire-utilities/pkg/metricsutil" - "github.com/skycoin/skywire/pkg/transport" - - "github.com/skycoin/skywire-services/internal/tpdiscmetrics" -) - -//go:embed build/* -var frontendFS embed.FS - -// API register all the API endpoints. -// It implements a net/http.Handler. -type API struct { - http.Handler - metrics tpdiscmetrics.Metrics - reqsInFlightCountMiddleware *metricsutil.RequestsInFlightCountMiddleware - startedAt time.Time - cache *badger.DB - uptimeTrackerURL string - tpdiscURL string -} - -func (a *API) log(r *http.Request) logrus.FieldLogger { - return httputil.GetLogger(r) -} - -// HealthCheckResponse is struct of /health endpoint -type HealthCheckResponse struct { - BuildInfo *buildinfo.Info `json:"build_info,omitempty"` - StartedAt time.Time `json:"started_at"` -} - -// New constructs a new API instance. -func New(log logrus.FieldLogger, enableMetrics bool, m tpdiscmetrics.Metrics) *API { - if log == nil { - log = logging.MustGetLogger("tp_disc") - } - - uptimeURL := os.Getenv("UT_URL") - if uptimeURL == "" { - uptimeURL = utURL - } - - tpdiscURL := os.Getenv("TPD_URL") - if tpdiscURL == "" { - tpdiscURL = tpdURL - } - - dbPath := filepath.Join(os.TempDir(), "db") - db, err := badger.Open(badger.DefaultOptions(dbPath)) - if err != nil { - log.Fatalf("unable to create file db at %s: %v", dbPath, err) - } - - api := &API{ - metrics: m, - reqsInFlightCountMiddleware: metricsutil.NewRequestsInFlightCountMiddleware(), - cache: db, - startedAt: time.Now(), - uptimeTrackerURL: uptimeURL, - tpdiscURL: tpdiscURL, - } - c, err := api.pollUptimeTransport() - if err != nil { - log.Fatalf("unable to fetch initial ut and tpd visor map: %v", err) - } - err = api.AddToCache(c) - if err != nil { - log.Fatalf("unable to add to cache: %v", err) - } - - r := chi.NewRouter() - - r.Use(middleware.RequestID) - r.Use(middleware.RealIP) - r.Use(middleware.Logger) - r.Use(middleware.Recoverer) - if enableMetrics { - r.Use(api.reqsInFlightCountMiddleware.Handle) - r.Use(metricsutil.RequestDurationMiddleware) - } - r.Use(httputil.SetLoggerMiddleware(log)) - r.Use(cors.AllowAll().Handler) - - // Create a route along /files that will serve contents from - // the ./build/ folder. - fsys, err := fs.Sub(frontendFS, "build") - filesDir := http.FS(fsys) - if err != nil { - log.Fatalf("error getting build dir: %v", err) - } - log.Infof("serving static directory in: %s", filesDir) - api.FileServer(r, "/", filesDir) - - r.Get("/map", api.handleGetGraph) - - api.Handler = r - - return api -} - -const ( - // this should be internal endpoint to /visor-ips, the endpoint is not public. - // so use k8s / docker-compose host. - utURL = `http://uptime-tracker/visor-ips` - tpdURL = `http://tpd.skywire.dev/all-transports` -) - -type visorIPsResponse struct { - Count int `json:"count"` - PublicKeys []string `json:"public_keys"` -} - -// PollResult is the return value of uptime tracker and tpd API -type PollResult struct { - Nodes map[string]visorIPsResponse `json:"nodes"` - Edges []*transport.Entry `json:"edges"` -} - -// pollUptimeTransport polls tpd and uptime transport for geolocation data -func (a *API) pollUptimeTransport() (*PollResult, error) { - hc := http.Client{Timeout: 30 * time.Second} - - utReq, err := http.NewRequest(http.MethodGet, a.uptimeTrackerURL, nil) - if err != nil { - return nil, err - } - tpReq, err := http.NewRequest(http.MethodGet, a.tpdiscURL, nil) - if err != nil { - return nil, err - } - utresp, err := hc.Do(utReq) - if err != nil { - return nil, err - } - tpresp, err := hc.Do(tpReq) - if err != nil { - return nil, err - } - defer func() { - _ = utresp.Body.Close() //nolint:errcheck - _ = tpresp.Body.Close() //nolint:errcheck - }() - u, err := io.ReadAll(utresp.Body) - if err != nil { - return nil, err - } - t, err := io.ReadAll(tpresp.Body) - if err != nil { - return nil, err - } - var utResp map[string]visorIPsResponse - var tpResp []*transport.Entry - if err = json.Unmarshal(u, &utResp); err != nil { - return nil, errors.New("error unmarshal uptime-tracker response") - } - if err = json.Unmarshal(t, &tpResp); err != nil { - return nil, errors.New("error unmarshal transport-discovery response") - } - return &PollResult{ - Nodes: utResp, - Edges: tpResp, - }, nil -} - -func (a *API) handleGetGraph(w http.ResponseWriter, r *http.Request) { - res, err := a.GetCache() - if err != nil { - a.renderError(w, r, err) - return - } - w.Header().Set("Content-Type", "application/json") - if err = json.NewEncoder(w).Encode(res); err != nil { - a.renderError(w, r, err) - return - } -} - -// RunBackgroundTasks runs cache update every sets time interval -func (a *API) RunBackgroundTasks(ctx context.Context, logger logrus.FieldLogger) { - cacheTicker := time.NewTicker(time.Minute * 10) - defer cacheTicker.Stop() - for { - select { - case <-ctx.Done(): - return - case <-cacheTicker.C: - p, err := a.pollUptimeTransport() - if err != nil { - logger.WithError(err).Warn("unable to poll uptime-tracker and tpd") - } - err = a.AddToCache(p) - if err != nil { - logger.WithError(err).Warn("unable to poll UT and TPD") - } - } - } -} - -func (a *API) renderError(w http.ResponseWriter, r *http.Request, err error) { - var status int - - if err == context.DeadlineExceeded { - status = http.StatusRequestTimeout - } - - // we fallback to 500 - if status == 0 { - status = http.StatusInternalServerError - } - - if status != http.StatusNotFound { - a.log(r).Warnf("%d: %s", status, err) - } - - w.WriteHeader(status) - w.Header().Set("Content-Type", "application/json") - if err = json.NewEncoder(w).Encode(&Error{Error: err.Error()}); err != nil { - a.log(r).WithError(err).Warn("Failed to encode error") - } -} - -// FileServer conveniently sets up a http.FileServer handler to serve -// static files from a http.FileSystem. -func (a *API) FileServer(r chi.Router, path string, root http.FileSystem) { - if strings.ContainsAny(path, "{}*") { - return - } - - if path != "/" && path[len(path)-1] != '/' { - r.Get(path, http.RedirectHandler(path+"/", http.StatusMovedPermanently).ServeHTTP) - path += "/" - } - path += "*" - - r.Get(path, func(w http.ResponseWriter, r *http.Request) { - rctx := chi.RouteContext(r.Context()) - pathPrefix := strings.TrimSuffix(rctx.RoutePattern(), "/*") - f := http.StripPrefix(pathPrefix, http.FileServer(root)) - f.ServeHTTP(w, r) - }) -} - -// Error is the object returned to the client when there's an error. -type Error struct { - Error string `json:"error"` -} diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/asset-manifest.json b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/asset-manifest.json deleted file mode 100644 index add13362d3..0000000000 --- a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/asset-manifest.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "files": { - "main.css": "/static/css/main.08a4014d.chunk.css", - "main.js": "/static/js/main.588f2c65.chunk.js", - "main.js.map": "/static/js/main.588f2c65.chunk.js.map", - "runtime-main.js": "/static/js/runtime-main.21703e9e.js", - "runtime-main.js.map": "/static/js/runtime-main.21703e9e.js.map", - "static/css/2.da98c186.chunk.css": "/static/css/2.da98c186.chunk.css", - "static/js/2.5879b560.chunk.js": "/static/js/2.5879b560.chunk.js", - "static/js/2.5879b560.chunk.js.map": "/static/js/2.5879b560.chunk.js.map", - "static/js/3.c05a463d.chunk.js": "/static/js/3.c05a463d.chunk.js", - "static/js/3.c05a463d.chunk.js.map": "/static/js/3.c05a463d.chunk.js.map", - "index.html": "/index.html", - "static/css/2.da98c186.chunk.css.map": "/static/css/2.da98c186.chunk.css.map", - "static/css/main.08a4014d.chunk.css.map": "/static/css/main.08a4014d.chunk.css.map", - "static/js/2.5879b560.chunk.js.LICENSE.txt": "/static/js/2.5879b560.chunk.js.LICENSE.txt", - "static/media/marker.8a6e5ca6.svg": "/static/media/marker.8a6e5ca6.svg" - }, - "entrypoints": [ - "static/js/runtime-main.21703e9e.js", - "static/css/2.da98c186.chunk.css", - "static/js/2.5879b560.chunk.js", - "static/css/main.08a4014d.chunk.css", - "static/js/main.588f2c65.chunk.js" - ] -} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/favicon.ico b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/favicon.ico deleted file mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 zcma);c{J4h9>;%nil|2-o+rCuEF-(I%-F}ijC~o(k~HKAkr0)!FCj~d>`RtpD?8b; zXOC1OD!V*IsqUwzbMF1)-gEDD=A573Z-&G7^LoAC9|WO7Xc0Cx1g^Zu0u_SjAPB
3vGa^W|sj)80f#V0@M_CAZTIO(t--xg= z!sii`1giyH7EKL_+Wi0ab<)&E_0KD!3Rp2^HNB*K2@PHCs4PWSA32*-^7d{9nH2_E zmC{C*N*)(vEF1_aMamw2A{ZH5aIDqiabnFdJ|y0%aS|64E$`s2ccV~3lR!u<){eS` z#^Mx6o(iP1Ix%4dv`t@!&Za-K@mTm#vadc{0aWDV*_%EiGK7qMC_(`exc>-$Gb9~W!w_^{*pYRm~G zBN{nA;cm^w$VWg1O^^<6vY`1XCD|s_zv*g*5&V#wv&s#h$xlUilPe4U@I&UXZbL z0)%9Uj&@yd03n;!7do+bfixH^FeZ-Ema}s;DQX2gY+7g0s(9;`8GyvPY1*vxiF&|w z>!vA~GA<~JUqH}d;DfBSi^IT*#lrzXl$fNpq0_T1tA+`A$1?(gLb?e#0>UELvljtQ zK+*74m0jn&)5yk8mLBv;=@}c{t0ztT<v;Avck$S6D`Z)^c0(jiwKhQsn|LDRY&w(Fmi91I7H6S;b0XM{e zXp0~(T@k_r-!jkLwd1_Vre^v$G4|kh4}=Gi?$AaJ)3I+^m|Zyj#*?Kp@w(lQdJZf4 z#|IJW5z+S^e9@(6hW6N~{pj8|NO*>1)E=%?nNUAkmv~OY&ZV;m-%?pQ_11)hAr0oAwILrlsGawpxx4D43J&K=n+p3WLnlDsQ$b(9+4 z?mO^hmV^F8MV{4Lx>(Q=aHhQ1){0d*(e&s%G=i5rq3;t{JC zmgbn5Nkl)t@fPH$v;af26lyhH!k+#}_&aBK4baYPbZy$5aFx4}ka&qxl z$=Rh$W;U)>-=S-0=?7FH9dUAd2(q#4TCAHky!$^~;Dz^j|8_wuKc*YzfdAht@Q&ror?91Dm!N03=4=O!a)I*0q~p0g$Fm$pmr$ zb;wD;STDIi$@M%y1>p&_>%?UP($15gou_ue1u0!4(%81;qcIW8NyxFEvXpiJ|H4wz z*mFT(qVx1FKufG11hByuX%lPk4t#WZ{>8ka2efjY`~;AL6vWyQKpJun2nRiZYDij$ zP>4jQXPaP$UC$yIVgGa)jDV;F0l^n(V=HMRB5)20V7&r$jmk{UUIe zVjKroK}JAbD>B`2cwNQ&GDLx8{pg`7hbA~grk|W6LgiZ`8y`{Iq0i>t!3p2}MS6S+ zO_ruKyAElt)rdS>CtF7j{&6rP-#c=7evGMt7B6`7HG|-(WL`bDUAjyn+k$mx$CH;q2Dz4x;cPP$hW=`pFfLO)!jaCL@V2+F)So3}vg|%O*^T1j>C2lx zsURO-zIJC$^$g2byVbRIo^w>UxK}74^TqUiRR#7s_X$e)$6iYG1(PcW7un-va-S&u zHk9-6Zn&>T==A)lM^D~bk{&rFzCi35>UR!ZjQkdSiNX*-;l4z9j*7|q`TBl~Au`5& z+c)*8?#-tgUR$Zd%Q3bs96w6k7q@#tUn`5rj+r@_sAVVLqco|6O{ILX&U-&-cbVa3 zY?ngHR@%l{;`ri%H*0EhBWrGjv!LE4db?HEWb5mu*t@{kv|XwK8?npOshmzf=vZA@ zVSN9sL~!sn?r(AK)Q7Jk2(|M67Uy3I{eRy z_l&Y@A>;vjkWN5I2xvFFTLX0i+`{qz7C_@bo`ZUzDugfq4+>a3?1v%)O+YTd6@Ul7 zAfLfm=nhZ`)P~&v90$&UcF+yXm9sq!qCx3^9gzIcO|Y(js^Fj)Rvq>nQAHI92ap=P z10A4@prk+AGWCb`2)dQYFuR$|H6iDE8p}9a?#nV2}LBCoCf(Xi2@szia7#gY>b|l!-U`c}@ zLdhvQjc!BdLJvYvzzzngnw51yRYCqh4}$oRCy-z|v3Hc*d|?^Wj=l~18*E~*cR_kU z{XsxM1i{V*4GujHQ3DBpl2w4FgFR48Nma@HPgnyKoIEY-MqmMeY=I<%oG~l!f<+FN z1ZY^;10j4M4#HYXP zw5eJpA_y(>uLQ~OucgxDLuf}fVs272FaMxhn4xnDGIyLXnw>Xsd^J8XhcWIwIoQ9} z%FoSJTAGW(SRGwJwb=@pY7r$uQRK3Zd~XbxU)ts!4XsJrCycrWSI?e!IqwqIR8+Jh zlRjZ`UO1I!BtJR_2~7AbkbSm%XQqxEPkz6BTGWx8e}nQ=w7bZ|eVP4?*Tb!$(R)iC z9)&%bS*u(lXqzitAN)Oo=&Ytn>%Hzjc<5liuPi>zC_nw;Z0AE3Y$Jao_Q90R-gl~5 z_xAb2J%eArrC1CN4G$}-zVvCqF1;H;abAu6G*+PDHSYFx@Tdbfox*uEd3}BUyYY-l zTfEsOqsi#f9^FoLO;ChK<554qkri&Av~SIM*{fEYRE?vH7pTAOmu2pz3X?Wn*!ROX ztd54huAk&mFBemMooL33RV-*1f0Q3_(7hl$<#*|WF9P!;r;4_+X~k~uKEqdzZ$5Al zV63XN@)j$FN#cCD;ek1R#l zv%pGrhB~KWgoCj%GT?%{@@o(AJGt*PG#l3i>lhmb_twKH^EYvacVY-6bsCl5*^~L0 zonm@lk2UvvTKr2RS%}T>^~EYqdL1q4nD%0n&Xqr^cK^`J5W;lRRB^R-O8b&HENO||mo0xaD+S=I8RTlIfVgqN@SXDr2&-)we--K7w= zJVU8?Z+7k9dy;s;^gDkQa`0nz6N{T?(A&Iz)2!DEecLyRa&FI!id#5Z7B*O2=PsR0 zEvc|8{NS^)!d)MDX(97Xw}m&kEO@5jqRaDZ!+%`wYOI<23q|&js`&o4xvjP7D_xv@ z5hEwpsp{HezI9!~6O{~)lLR@oF7?J7i>1|5a~UuoN=q&6N}EJPV_GD`&M*v8Y`^2j zKII*d_@Fi$+i*YEW+Hbzn{iQk~yP z>7N{S4)r*!NwQ`(qcN#8SRQsNK6>{)X12nbF`*7#ecO7I)Q$uZsV+xS4E7aUn+U(K baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/favicon.svg b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/favicon.svg deleted file mode 100644 index 3c56f314f9..0000000000 --- a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/favicon.svg +++ /dev/null @@ -1,2 +0,0 @@ -Logo &amp; Icon_Resized-Refont \ No newline at end of file diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/index.html b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/index.html deleted file mode 100644 index 056b47610d..0000000000 --- a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/index.html +++ /dev/null @@ -1 +0,0 @@ -Skywire: Node Visualizer
\ No newline at end of file diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/logo192.png b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 zcmZWtbyO6NvR-oO24RV%BvuJ&=?+<7=`LvyB&A_#M7mSDYw1v6DJkiYl9XjT!%$dLEBTQ8R9|wd3008in6lFF3GV-6mLi?MoP_y~}QUnaDCHI#t z7w^m$@6DI)|C8_jrT?q=f8D?0AM?L)Z}xAo^e^W>t$*Y0KlT5=@bBjT9kxb%-KNdk zeOS1tKO#ChhG7%{ApNBzE2ZVNcxbrin#E1TiAw#BlUhXllzhN$qWez5l;h+t^q#Eav8PhR2|T}y5kkflaK`ba-eoE+Z2q@o6P$)=&` z+(8}+-McnNO>e#$Rr{32ngsZIAX>GH??tqgwUuUz6kjns|LjsB37zUEWd|(&O!)DY zQLrq%Y>)Y8G`yYbYCx&aVHi@-vZ3|ebG!f$sTQqMgi0hWRJ^Wc+Ibv!udh_r%2|U) zPi|E^PK?UE!>_4`f`1k4hqqj_$+d!EB_#IYt;f9)fBOumGNyglU(ofY`yHq4Y?B%- zp&G!MRY<~ajTgIHErMe(Z8JG*;D-PJhd@RX@QatggM7+G(Lz8eZ;73)72Hfx5KDOE zkT(m}i2;@X2AT5fW?qVp?@WgN$aT+f_6eo?IsLh;jscNRp|8H}Z9p_UBO^SJXpZew zEK8fz|0Th%(Wr|KZBGTM4yxkA5CFdAj8=QSrT$fKW#tweUFqr0TZ9D~a5lF{)%-tTGMK^2tz(y2v$i%V8XAxIywrZCp=)83p(zIk6@S5AWl|Oa2hF`~~^W zI;KeOSkw1O#TiQ8;U7OPXjZM|KrnN}9arP)m0v$c|L)lF`j_rpG(zW1Qjv$=^|p*f z>)Na{D&>n`jOWMwB^TM}slgTEcjxTlUby89j1)|6ydRfWERn3|7Zd2&e7?!K&5G$x z`5U3uFtn4~SZq|LjFVrz$3iln-+ucY4q$BC{CSm7Xe5c1J<=%Oagztj{ifpaZk_bQ z9Sb-LaQMKp-qJA*bP6DzgE3`}*i1o3GKmo2pn@dj0;He}F=BgINo};6gQF8!n0ULZ zL>kC0nPSFzlcB7p41doao2F7%6IUTi_+!L`MM4o*#Y#0v~WiO8uSeAUNp=vA2KaR&=jNR2iVwG>7t%sG2x_~yXzY)7K& zk3p+O0AFZ1eu^T3s};B%6TpJ6h-Y%B^*zT&SN7C=N;g|#dGIVMSOru3iv^SvO>h4M=t-N1GSLLDqVTcgurco6)3&XpU!FP6Hlrmj}f$ zp95;b)>M~`kxuZF3r~a!rMf4|&1=uMG$;h^g=Kl;H&Np-(pFT9FF@++MMEx3RBsK?AU0fPk-#mdR)Wdkj)`>ZMl#^<80kM87VvsI3r_c@_vX=fdQ`_9-d(xiI z4K;1y1TiPj_RPh*SpDI7U~^QQ?%0&!$Sh#?x_@;ag)P}ZkAik{_WPB4rHyW#%>|Gs zdbhyt=qQPA7`?h2_8T;-E6HI#im9K>au*(j4;kzwMSLgo6u*}-K`$_Gzgu&XE)udQ zmQ72^eZd|vzI)~!20JV-v-T|<4@7ruqrj|o4=JJPlybwMg;M$Ud7>h6g()CT@wXm` zbq=A(t;RJ^{Xxi*Ff~!|3!-l_PS{AyNAU~t{h;(N(PXMEf^R(B+ZVX3 z8y0;0A8hJYp@g+c*`>eTA|3Tgv9U8#BDTO9@a@gVMDxr(fVaEqL1tl?md{v^j8aUv zm&%PX4^|rX|?E4^CkplWWNv*OKM>DxPa z!RJ)U^0-WJMi)Ksc!^ixOtw^egoAZZ2Cg;X7(5xZG7yL_;UJ#yp*ZD-;I^Z9qkP`} zwCTs0*%rIVF1sgLervtnUo&brwz?6?PXRuOCS*JI-WL6GKy7-~yi0giTEMmDs_-UX zo=+nFrW_EfTg>oY72_4Z0*uG>MnXP=c0VpT&*|rvv1iStW;*^={rP1y?Hv+6R6bxFMkxpWkJ>m7Ba{>zc_q zEefC3jsXdyS5??Mz7IET$Kft|EMNJIv7Ny8ZOcKnzf`K5Cd)&`-fTY#W&jnV0l2vt z?Gqhic}l}mCv1yUEy$%DP}4AN;36$=7aNI^*AzV(eYGeJ(Px-j<^gSDp5dBAv2#?; zcMXv#aj>%;MiG^q^$0MSg-(uTl!xm49dH!{X0){Ew7ThWV~Gtj7h%ZD zVN-R-^7Cf0VH!8O)uUHPL2mO2tmE*cecwQv_5CzWeh)ykX8r5Hi`ehYo)d{Jnh&3p z9ndXT$OW51#H5cFKa76c<%nNkP~FU93b5h-|Cb}ScHs@4Q#|}byWg;KDMJ#|l zE=MKD*F@HDBcX@~QJH%56eh~jfPO-uKm}~t7VkHxHT;)4sd+?Wc4* z>CyR*{w@4(gnYRdFq=^(#-ytb^5ESD?x<0Skhb%Pt?npNW1m+Nv`tr9+qN<3H1f<% zZvNEqyK5FgPsQ`QIu9P0x_}wJR~^CotL|n zk?dn;tLRw9jJTur4uWoX6iMm914f0AJfB@C74a;_qRrAP4E7l890P&{v<}>_&GLrW z)klculcg`?zJO~4;BBAa=POU%aN|pmZJn2{hA!d!*lwO%YSIzv8bTJ}=nhC^n}g(ld^rn#kq9Z3)z`k9lvV>y#!F4e{5c$tnr9M{V)0m(Z< z#88vX6-AW7T2UUwW`g<;8I$Jb!R%z@rCcGT)-2k7&x9kZZT66}Ztid~6t0jKb&9mm zpa}LCb`bz`{MzpZR#E*QuBiZXI#<`5qxx=&LMr-UUf~@dRk}YI2hbMsAMWOmDzYtm zjof16D=mc`^B$+_bCG$$@R0t;e?~UkF?7<(vkb70*EQB1rfUWXh$j)R2)+dNAH5%R zEBs^?N;UMdy}V};59Gu#0$q53$}|+q7CIGg_w_WlvE}AdqoS<7DY1LWS9?TrfmcvT zaypmplwn=P4;a8-%l^e?f`OpGb}%(_mFsL&GywhyN(-VROj`4~V~9bGv%UhcA|YW% zs{;nh@aDX11y^HOFXB$a7#Sr3cEtNd4eLm@Y#fc&j)TGvbbMwze zXtekX_wJqxe4NhuW$r}cNy|L{V=t#$%SuWEW)YZTH|!iT79k#?632OFse{+BT_gau zJwQcbH{b}dzKO?^dV&3nTILYlGw{27UJ72ZN){BILd_HV_s$WfI2DC<9LIHFmtyw? zQ;?MuK7g%Ym+4e^W#5}WDLpko%jPOC=aN)3!=8)s#Rnercak&b3ESRX3z{xfKBF8L z5%CGkFmGO@x?_mPGlpEej!3!AMddChabyf~nJNZxx!D&{@xEb!TDyvqSj%Y5@A{}9 zRzoBn0?x}=krh{ok3Nn%e)#~uh;6jpezhA)ySb^b#E>73e*frBFu6IZ^D7Ii&rsiU z%jzygxT-n*joJpY4o&8UXr2s%j^Q{?e-voloX`4DQyEK+DmrZh8A$)iWL#NO9+Y@!sO2f@rI!@jN@>HOA< z?q2l{^%mY*PNx2FoX+A7X3N}(RV$B`g&N=e0uvAvEN1W^{*W?zT1i#fxuw10%~))J zjx#gxoVlXREWZf4hRkgdHx5V_S*;p-y%JtGgQ4}lnA~MBz-AFdxUxU1RIT$`sal|X zPB6sEVRjGbXIP0U+?rT|y5+ev&OMX*5C$n2SBPZr`jqzrmpVrNciR0e*Wm?fK6DY& zl(XQZ60yWXV-|Ps!A{EF;=_z(YAF=T(-MkJXUoX zI{UMQDAV2}Ya?EisdEW;@pE6dt;j0fg5oT2dxCi{wqWJ<)|SR6fxX~5CzblPGr8cb zUBVJ2CQd~3L?7yfTpLNbt)He1D>*KXI^GK%<`bq^cUq$Q@uJifG>p3LU(!H=C)aEL zenk7pVg}0{dKU}&l)Y2Y2eFMdS(JS0}oZUuVaf2+K*YFNGHB`^YGcIpnBlMhO7d4@vV zv(@N}(k#REdul8~fP+^F@ky*wt@~&|(&&meNO>rKDEnB{ykAZ}k>e@lad7to>Ao$B zz<1(L=#J*u4_LB=8w+*{KFK^u00NAmeNN7pr+Pf+N*Zl^dO{LM-hMHyP6N!~`24jd zXYP|Ze;dRXKdF2iJG$U{k=S86l@pytLx}$JFFs8e)*Vi?aVBtGJ3JZUj!~c{(rw5>vuRF$`^p!P8w1B=O!skwkO5yd4_XuG^QVF z`-r5K7(IPSiKQ2|U9+`@Js!g6sfJwAHVd|s?|mnC*q zp|B|z)(8+mxXyxQ{8Pg3F4|tdpgZZSoU4P&9I8)nHo1@)9_9u&NcT^FI)6|hsAZFk zZ+arl&@*>RXBf-OZxhZerOr&dN5LW9@gV=oGFbK*J+m#R-|e6(Loz(;g@T^*oO)0R zN`N=X46b{7yk5FZGr#5&n1!-@j@g02g|X>MOpF3#IjZ_4wg{dX+G9eqS+Es9@6nC7 zD9$NuVJI}6ZlwtUm5cCAiYv0(Yi{%eH+}t)!E^>^KxB5^L~a`4%1~5q6h>d;paC9c zTj0wTCKrhWf+F#5>EgX`sl%POl?oyCq0(w0xoL?L%)|Q7d|Hl92rUYAU#lc**I&^6p=4lNQPa0 znQ|A~i0ip@`B=FW-Q;zh?-wF;Wl5!+q3GXDu-x&}$gUO)NoO7^$BeEIrd~1Dh{Tr` z8s<(Bn@gZ(mkIGnmYh_ehXnq78QL$pNDi)|QcT*|GtS%nz1uKE+E{7jdEBp%h0}%r zD2|KmYGiPa4;md-t_m5YDz#c*oV_FqXd85d@eub?9N61QuYcb3CnVWpM(D-^|CmkL z(F}L&N7qhL2PCq)fRh}XO@U`Yn<?TNGR4L(mF7#4u29{i~@k;pLsgl({YW5`Mo+p=zZn3L*4{JU;++dG9 X@eDJUQo;Ye2mwlRs?y0|+_a0zY+Zo%Dkae}+MySoIppb75o?vUW_?)>@g{U2`ERQIXV zeY$JrWnMZ$QC<=ii4X|@0H8`si75jB(ElJb00HAB%>SlLR{!zO|C9P3zxw_U8?1d8uRZ=({Ga4shyN}3 zAK}WA(ds|``G4jA)9}Bt2Hy0+f3rV1E6b|@?hpGA=PI&r8)ah|)I2s(P5Ic*Ndhn^ z*T&j@gbCTv7+8rpYbR^Ty}1AY)YH;p!m948r#%7x^Z@_-w{pDl|1S4`EM3n_PaXvK z1JF)E3qy$qTj5Xs{jU9k=y%SQ0>8E$;x?p9ayU0bZZeo{5Z@&FKX>}s!0+^>C^D#z z>xsCPvxD3Z=dP}TTOSJhNTPyVt14VCQ9MQFN`rn!c&_p?&4<5_PGm4a;WS&1(!qKE z_H$;dDdiPQ!F_gsN`2>`X}$I=B;={R8%L~`>RyKcS$72ai$!2>d(YkciA^J0@X%G4 z4cu!%Ps~2JuJ8ex`&;Fa0NQOq_nDZ&X;^A=oc1&f#3P1(!5il>6?uK4QpEG8z0Rhu zvBJ+A9RV?z%v?!$=(vcH?*;vRs*+PPbOQ3cdPr5=tOcLqmfx@#hOqX0iN)wTTO21jH<>jpmwRIAGw7`a|sl?9y9zRBh>(_%| zF?h|P7}~RKj?HR+q|4U`CjRmV-$mLW>MScKnNXiv{vD3&2@*u)-6P@h0A`eeZ7}71 zK(w%@R<4lLt`O7fs1E)$5iGb~fPfJ?WxhY7c3Q>T-w#wT&zW522pH-B%r5v#5y^CF zcC30Se|`D2mY$hAlIULL%-PNXgbbpRHgn<&X3N9W!@BUk@9g*P5mz-YnZBb*-$zMM z7Qq}ic0mR8n{^L|=+diODdV}Q!gwr?y+2m=3HWwMq4z)DqYVg0J~^}-%7rMR@S1;9 z7GFj6K}i32X;3*$SmzB&HW{PJ55kT+EI#SsZf}bD7nW^Haf}_gXciYKX{QBxIPSx2Ma? zHQqgzZq!_{&zg{yxqv3xq8YV+`S}F6A>Gtl39_m;K4dA{pP$BW0oIXJ>jEQ!2V3A2 zdpoTxG&V=(?^q?ZTj2ZUpDUdMb)T?E$}CI>r@}PFPWD9@*%V6;4Ag>D#h>!s)=$0R zRXvdkZ%|c}ubej`jl?cS$onl9Tw52rBKT)kgyw~Xy%z62Lr%V6Y=f?2)J|bZJ5(Wx zmji`O;_B+*X@qe-#~`HFP<{8$w@z4@&`q^Q-Zk8JG3>WalhnW1cvnoVw>*R@c&|o8 zZ%w!{Z+MHeZ*OE4v*otkZqz11*s!#s^Gq>+o`8Z5 z^i-qzJLJh9!W-;SmFkR8HEZJWiXk$40i6)7 zZpr=k2lp}SasbM*Nbn3j$sn0;rUI;%EDbi7T1ZI4qL6PNNM2Y%6{LMIKW+FY_yF3) zSKQ2QSujzNMSL2r&bYs`|i2Dnn z=>}c0>a}>|uT!IiMOA~pVT~R@bGlm}Edf}Kq0?*Af6#mW9f9!}RjW7om0c9Qlp;yK z)=XQs(|6GCadQbWIhYF=rf{Y)sj%^Id-ARO0=O^Ad;Ph+ z0?$eE1xhH?{T$QI>0JP75`r)U_$#%K1^BQ8z#uciKf(C701&RyLQWBUp*Q7eyn76} z6JHpC9}R$J#(R0cDCkXoFSp;j6{x{b&0yE@P7{;pCEpKjS(+1RQy38`=&Yxo%F=3y zCPeefABp34U-s?WmU#JJw23dcC{sPPFc2#J$ZgEN%zod}J~8dLm*fx9f6SpO zn^Ww3bt9-r0XaT2a@Wpw;C23XM}7_14#%QpubrIw5aZtP+CqIFmsG4`Cm6rfxl9n5 z7=r2C-+lM2AB9X0T_`?EW&Byv&K?HS4QLoylJ|OAF z`8atBNTzJ&AQ!>sOo$?^0xj~D(;kS$`9zbEGd>f6r`NC3X`tX)sWgWUUOQ7w=$TO&*j;=u%25ay-%>3@81tGe^_z*C7pb9y*Ed^H3t$BIKH2o+olp#$q;)_ zfpjCb_^VFg5fU~K)nf*d*r@BCC>UZ!0&b?AGk_jTPXaSnCuW110wjHPPe^9R^;jo3 zwvzTl)C`Zl5}O2}3lec=hZ*$JnkW#7enKKc)(pM${_$9Hc=Sr_A9Biwe*Y=T?~1CK z6eZ9uPICjy-sMGbZl$yQmpB&`ouS8v{58__t0$JP%i3R&%QR3ianbZqDs<2#5FdN@n5bCn^ZtH992~5k(eA|8|@G9u`wdn7bnpg|@{m z^d6Y`*$Zf2Xr&|g%sai#5}Syvv(>Jnx&EM7-|Jr7!M~zdAyjt*xl;OLhvW-a%H1m0 z*x5*nb=R5u><7lyVpNAR?q@1U59 zO+)QWwL8t zyip?u_nI+K$uh{y)~}qj?(w0&=SE^8`_WMM zTybjG=999h38Yes7}-4*LJ7H)UE8{mE(6;8voE+TYY%33A>S6`G_95^5QHNTo_;Ao ztIQIZ_}49%{8|=O;isBZ?=7kfdF8_@azfoTd+hEJKWE!)$)N%HIe2cplaK`ry#=pV z0q{9w-`i0h@!R8K3GC{ivt{70IWG`EP|(1g7i_Q<>aEAT{5(yD z=!O?kq61VegV+st@XCw475j6vS)_z@efuqQgHQR1T4;|-#OLZNQJPV4k$AX1Uk8Lm z{N*b*ia=I+MB}kWpupJ~>!C@xEN#Wa7V+7{m4j8c?)ChV=D?o~sjT?0C_AQ7B-vxqX30s0I_`2$in86#`mAsT-w?j{&AL@B3$;P z31G4(lV|b}uSDCIrjk+M1R!X7s4Aabn<)zpgT}#gE|mIvV38^ODy@<&yflpCwS#fRf9ZX3lPV_?8@C5)A;T zqmouFLFk;qIs4rA=hh=GL~sCFsXHsqO6_y~*AFt939UYVBSx1s(=Kb&5;j7cSowdE;7()CC2|-i9Zz+_BIw8#ll~-tyH?F3{%`QCsYa*b#s*9iCc`1P1oC26?`g<9))EJ3%xz+O!B3 zZ7$j~To)C@PquR>a1+Dh>-a%IvH_Y7^ys|4o?E%3`I&ADXfC8++hAdZfzIT#%C+Jz z1lU~K_vAm0m8Qk}K$F>|>RPK%<1SI0(G+8q~H zAsjezyP+u!Se4q3GW)`h`NPSRlMoBjCzNPesWJwVTY!o@G8=(6I%4XHGaSiS3MEBK zhgGFv6Jc>L$4jVE!I?TQuwvz_%CyO!bLh94nqK11C2W$*aa2ueGopG8DnBICVUORP zgytv#)49fVXDaR$SukloYC3u7#5H)}1K21=?DKj^U)8G;MS)&Op)g^zR2($<>C*zW z;X7`hLxiIO#J`ANdyAOJle4V%ppa*(+0i3w;8i*BA_;u8gOO6)MY`ueq7stBMJTB; z-a0R>hT*}>z|Gg}@^zDL1MrH+2hsR8 zHc}*9IvuQC^Ju)^#Y{fOr(96rQNPNhxc;mH@W*m206>Lo<*SaaH?~8zg&f&%YiOEG zGiz?*CP>Bci}!WiS=zj#K5I}>DtpregpP_tfZtPa(N<%vo^#WCQ5BTv0vr%Z{)0q+ z)RbfHktUm|lg&U3YM%lMUM(fu}i#kjX9h>GYctkx9Mt_8{@s%!K_EI zScgwy6%_fR?CGJQtmgNAj^h9B#zmaMDWgH55pGuY1Gv7D z;8Psm(vEPiwn#MgJYu4Ty9D|h!?Rj0ddE|&L3S{IP%H4^N!m`60ZwZw^;eg4sk6K{ ziA^`Sbl_4~f&Oo%n;8Ye(tiAdlZKI!Z=|j$5hS|D$bDJ}p{gh$KN&JZYLUjv4h{NY zBJ>X9z!xfDGY z+oh_Z&_e#Q(-}>ssZfm=j$D&4W4FNy&-kAO1~#3Im;F)Nwe{(*75(p=P^VI?X0GFakfh+X-px4a%Uw@fSbmp9hM1_~R>?Z8+ ziy|e9>8V*`OP}4x5JjdWp}7eX;lVxp5qS}0YZek;SNmm7tEeSF*-dI)6U-A%m6YvCgM(}_=k#a6o^%-K4{`B1+}O4x zztDT%hVb;v#?j`lTvlFQ3aV#zkX=7;YFLS$uIzb0E3lozs5`Xy zi~vF+%{z9uLjKvKPhP%x5f~7-Gj+%5N`%^=yk*Qn{`> z;xj&ROY6g`iy2a@{O)V(jk&8#hHACVDXey5a+KDod_Z&}kHM}xt7}Md@pil{2x7E~ zL$k^d2@Ec2XskjrN+IILw;#7((abu;OJii&v3?60x>d_Ma(onIPtcVnX@ELF0aL?T zSmWiL3(dOFkt!x=1O!_0n(cAzZW+3nHJ{2S>tgSK?~cFha^y(l@-Mr2W$%MN{#af8J;V*>hdq!gx=d0h$T7l}>91Wh07)9CTX zh2_ZdQCyFOQ)l(}gft0UZG`Sh2`x-w`5vC2UD}lZs*5 zG76$akzn}Xi))L3oGJ75#pcN=cX3!=57$Ha=hQ2^lwdyU#a}4JJOz6ddR%zae%#4& za)bFj)z=YQela(F#Y|Q#dp}PJghITwXouVaMq$BM?K%cXn9^Y@g43$=O)F&ZlOUom zJiad#dea;-eywBA@e&D6Pdso1?2^(pXiN91?jvcaUyYoKUmvl5G9e$W!okWe*@a<^ z8cQQ6cNSf+UPDx%?_G4aIiybZHHagF{;IcD(dPO!#=u zWfqLcPc^+7Uu#l(Bpxft{*4lv#*u7X9AOzDO z1D9?^jIo}?%iz(_dwLa{ex#T}76ZfN_Z-hwpus9y+4xaUu9cX}&P{XrZVWE{1^0yw zO;YhLEW!pJcbCt3L8~a7>jsaN{V3>tz6_7`&pi%GxZ=V3?3K^U+*ryLSb)8^IblJ0 zSRLNDvIxt)S}g30?s_3NX>F?NKIGrG_zB9@Z>uSW3k2es_H2kU;Rnn%j5qP)!XHKE zPB2mHP~tLCg4K_vH$xv`HbRsJwbZMUV(t=ez;Ec(vyHH)FbfLg`c61I$W_uBB>i^r z&{_P;369-&>23R%qNIULe=1~T$(DA`ev*EWZ6j(B$(te}x1WvmIll21zvygkS%vwG zzkR6Z#RKA2!z!C%M!O>!=Gr0(J0FP=-MN=5t-Ir)of50y10W}j`GtRCsXBakrKtG& zazmITDJMA0C51&BnLY)SY9r)NVTMs);1<=oosS9g31l{4ztjD3#+2H7u_|66b|_*O z;Qk6nalpqdHOjx|K&vUS_6ITgGll;TdaN*ta=M_YtyC)I9Tmr~VaPrH2qb6sd~=AcIxV+%z{E&0@y=DPArw zdV7z(G1hBx7hd{>(cr43^WF%4Y@PXZ?wPpj{OQ#tvc$pABJbvPGvdR`cAtHn)cSEV zrpu}1tJwQ3y!mSmH*uz*x0o|CS<^w%&KJzsj~DU0cLQUxk5B!hWE>aBkjJle8z~;s z-!A=($+}Jq_BTK5^B!`R>!MulZN)F=iXXeUd0w5lUsE5VP*H*oCy(;?S$p*TVvTxwAeWFB$jHyb0593)$zqalVlDX=GcCN1gU0 zlgU)I$LcXZ8Oyc2TZYTPu@-;7<4YYB-``Qa;IDcvydIA$%kHhJKV^m*-zxcvU4viy&Kr5GVM{IT>WRywKQ9;>SEiQD*NqplK-KK4YR`p0@JW)n_{TU3bt0 zim%;(m1=#v2}zTps=?fU5w^(*y)xT%1vtQH&}50ZF!9YxW=&7*W($2kgKyz1mUgfs zfV<*XVVIFnohW=|j+@Kfo!#liQR^x>2yQdrG;2o8WZR+XzU_nG=Ed2rK?ntA;K5B{ z>M8+*A4!Jm^Bg}aW?R?6;@QG@uQ8&oJ{hFixcfEnJ4QH?A4>P=q29oDGW;L;= z9-a0;g%c`C+Ai!UmK$NC*4#;Jp<1=TioL=t^YM)<<%u#hnnfSS`nq63QKGO1L8RzX z@MFDqs1z ztYmxDl@LU)5acvHk)~Z`RW7=aJ_nGD!mOSYD>5Odjn@TK#LY{jf?+piB5AM-CAoT_ z?S-*q7}wyLJzK>N%eMPuFgN)Q_otKP;aqy=D5f!7<=n(lNkYRXVpkB{TAYLYg{|(jtRqYmg$xH zjmq?B(RE4 zQx^~Pt}gxC2~l=K$$-sYy_r$CO(d=+b3H1MB*y_5g6WLaWTXn+TKQ|hNY^>Mp6k*$ zwkovomhu776vQATqT4blf~g;TY(MWCrf^^yfWJvSAB$p5l;jm@o#=!lqw+Lqfq>X= z$6~kxfm7`3q4zUEB;u4qa#BdJxO!;xGm)wwuisj{0y2x{R(IGMrsIzDY9LW>m!Y`= z04sx3IjnYvL<4JqxQ8f7qYd0s2Ig%`ytYPEMKI)s(LD}D@EY>x`VFtqvnADNBdeao zC96X+MxnwKmjpg{U&gP3HE}1=s!lv&D{6(g_lzyF3A`7Jn*&d_kL<;dAFx!UZ>hB8 z5A*%LsAn;VLp>3${0>M?PSQ)9s3}|h2e?TG4_F{}{Cs>#3Q*t$(CUc}M)I}8cPF6% z=+h(Kh^8)}gj(0}#e7O^FQ6`~fd1#8#!}LMuo3A0bN`o}PYsm!Y}sdOz$+Tegc=qT z8x`PH$7lvnhJp{kHWb22l;@7B7|4yL4UOOVM0MP_>P%S1Lnid)+k9{+3D+JFa#Pyf zhVc#&df87APl4W9X)F3pGS>@etfl=_E5tBcVoOfrD4hmVeTY-cj((pkn%n@EgN{0f zwb_^Rk0I#iZuHK!l*lN`ceJn(sI{$Fq6nN& zE<-=0_2WN}m+*ivmIOxB@#~Q-cZ>l136w{#TIJe478`KE7@=a{>SzPHsKLzYAyBQO zAtuuF$-JSDy_S@6GW0MOE~R)b;+0f%_NMrW(+V#c_d&U8Z9+ec4=HmOHw?gdjF(Lu zzra83M_BoO-1b3;9`%&DHfuUY)6YDV21P$C!Rc?mv&{lx#f8oc6?0?x zK08{WP65?#>(vPfA-c=MCY|%*1_<3D4NX zeVTi-JGl2uP_2@0F{G({pxQOXt_d{g_CV6b?jNpfUG9;8yle-^4KHRvZs-_2siata zt+d_T@U$&t*xaD22(fH(W1r$Mo?3dc%Tncm=C6{V9y{v&VT#^1L04vDrLM9qBoZ4@ z6DBN#m57hX7$C(=#$Y5$bJmwA$T8jKD8+6A!-IJwA{WOfs%s}yxUw^?MRZjF$n_KN z6`_bGXcmE#5e4Ym)aQJ)xg3Pg0@k`iGuHe?f(5LtuzSq=nS^5z>vqU0EuZ&75V%Z{ zYyhRLN^)$c6Ds{f7*FBpE;n5iglx5PkHfWrj3`x^j^t z7ntuV`g!9Xg#^3!x)l*}IW=(Tz3>Y5l4uGaB&lz{GDjm2D5S$CExLT`I1#n^lBH7Y zDgpMag@`iETKAI=p<5E#LTkwzVR@=yY|uBVI1HG|8h+d;G-qfuj}-ZR6fN>EfCCW z9~wRQoAPEa#aO?3h?x{YvV*d+NtPkf&4V0k4|L=uj!U{L+oLa(z#&iuhJr3-PjO3R z5s?=nn_5^*^Rawr>>Nr@K(jwkB#JK-=+HqwfdO<+P5byeim)wvqGlP-P|~Nse8=XF zz`?RYB|D6SwS}C+YQv+;}k6$-%D(@+t14BL@vM z2q%q?f6D-A5s$_WY3{^G0F131bbh|g!}#BKw=HQ7mx;Dzg4Z*bTLQSfo{ed{4}NZW zfrRm^Ca$rlE{Ue~uYv>R9{3smwATcdM_6+yWIO z*ZRH~uXE@#p$XTbCt5j7j2=86e{9>HIB6xDzV+vAo&B?KUiMP|ttOElepnl%|DPqL b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/manifest.json b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/manifest.json deleted file mode 100644 index 1e62e17958..0000000000 --- a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "Node Visualizer", - "name": "Skycoin Node Visualizer", - "icons": [ - { - "src": "favicon.svg", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/robots.txt b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/robots.txt deleted file mode 100644 index e9e57dc4d4..0000000000 --- a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/2.da98c186.chunk.css b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/2.da98c186.chunk.css deleted file mode 100644 index 0068342912..0000000000 --- a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/2.da98c186.chunk.css +++ /dev/null @@ -1,2 +0,0 @@ -.leaflet-image-layer,.leaflet-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane,.leaflet-pane>canvas,.leaflet-pane>svg,.leaflet-tile,.leaflet-tile-container,.leaflet-zoom-box{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile{-webkit-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:transparent}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none!important;max-height:none!important}.leaflet-container.leaflet-touch-zoom{touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{-webkit-filter:inherit;filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-bottom,.leaflet-top{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-tile{will-change:opacity}.leaflet-fade-anim .leaflet-popup{opacity:0;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;transform-origin:0 0}.leaflet-zoom-anim .leaflet-zoom-animated{will-change:transform;transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1),-webkit-transform .25s cubic-bezier(0,0,.25,1)}.leaflet-pan-anim .leaflet-tile,.leaflet-zoom-anim .leaflet-tile{transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-control,.leaflet-popup-pane{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:grabbing}.leaflet-image-layer,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-image-layer.leaflet-interactive,.leaflet-marker-icon.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline:0}.leaflet-container a{color:#0078a8}.leaflet-container a.leaflet-active{outline:2px solid orange}.leaflet-zoom-box{border:2px dotted #38f;background:hsla(0,0%,100%,.5)}.leaflet-container{font:12px/1.5 "Helvetica Neue",Arial,Helvetica,sans-serif}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:700 18px "Lucida Console",Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6/ee/XeCQ4D3ykPtL5tHno4n0d/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a/PG2yutpS/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M/82yIDtC/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP+WOmcuhciVnmHVQcJnp7DFvScowZorad/+V/fVzMdMT2g9Cv9guXGv/7pYOrXh2U+RRR3dSd9JRx6bIFc/ekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA+CNjT/Ifff+/kDk2u/w/33/IeCMOSaWZ4glosqT3DNnNZQ7Cs58/3Ce5HL78iZH/vKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z/POLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty+vF0+Y2up9d3wwijfjZbabqm/3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm/ayYjHW5/h7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE+XSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm+fPu3fo5/3v61RMCO9Jx2EEYYhb0rmNQMX/vm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA/dpv+on9Shox52WFnx0KY8onHayrJzm87i5h9xGw/tfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3/IR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ+rroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao/6tWWhuuOM4SAK4EI4QmFHA+SEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm+0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1+TBEpF68d+DHR6IOWVv2BECtxo46hOFUBd/APU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo/UEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc/0PstHHcfEdQ+UAAAAASUVORK5CYII=);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers-expanded .leaflet-control-layers-toggle,.leaflet-control-layers .leaflet-control-layers-list{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=)}.leaflet-container .leaflet-control-attribution{background:#fff;background:hsla(0,0%,100%,.7);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;box-sizing:border-box;background:#fff;background:hsla(0,0%,100%,.5)}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers{box-shadow:none}.leaflet-touch .leaflet-bar,.leaflet-touch .leaflet-control-layers{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 19px;line-height:1.4}.leaflet-popup-content p{margin:18px 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;border:none;text-align:center;width:18px;height:14px;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;font-weight:700;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678,M12=0.70710678,M21=-0.70710678,M22=0.70710678)}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-clickable{cursor:pointer;pointer-events:auto}.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before,.leaflet-tooltip-top:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff} -/*# sourceMappingURL=2.da98c186.chunk.css.map */ \ No newline at end of file diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/2.da98c186.chunk.css.map b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/2.da98c186.chunk.css.map deleted file mode 100644 index 88e3197c27..0000000000 --- a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/2.da98c186.chunk.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://node_modules/leaflet/dist/leaflet.css"],"names":[],"mappings":"AAEA,6LAUC,iBAAkB,CAClB,MAAO,CACP,KACA,CACD,mBACC,eACA,CACD,0DAGC,wBAAyB,CAEjB,oBAAiB,CAAjB,gBAAiB,CACvB,sBACF,CAED,yBACC,sBACD,CAEA,8BACC,yCACA,CAED,wCACC,YAAa,CACb,aAAc,CACd,4BACA,CACD,4CAEC,aACA,CAGD,2PAMC,wBAA0B,CAC1B,yBACA,CAED,sCAEC,wBACA,CACD,sCAGC,iBAAkB,CAClB,uBACD,CACA,yDAEC,iBACD,CACA,mBACC,uCACD,CACA,qBACC,+CACD,CACA,cACC,sBAAe,CAAf,cAAe,CACf,iBACA,CACD,qBACC,kBACA,CACD,kBACC,OAAQ,CACR,QAAS,CAEJ,qBAAsB,CAC3B,WACA,CAED,0BACC,qBACA,CAED,cAAwB,WAAc,CAEtC,mBAAwB,WAAc,CACtC,sBAAwB,WAAc,CACtC,qBAAwB,WAAc,CACtC,qBAAwB,WAAc,CACtC,sBAA0B,WAAc,CACxC,oBAAwB,WAAc,CAEtC,yBAA2B,WAAc,CACzC,sBAA2B,WAAc,CAEzC,mBACC,SAAU,CACV,UACA,CACD,MACC,0BAA2B,CAC3B,oBAAqB,CACrB,iBACA,CAKD,iBACC,iBAAkB,CAClB,WAAY,CACZ,6BAA8B,CAC9B,mBACA,CACD,6BAEC,iBAAkB,CAClB,YAAa,CACb,mBACA,CACD,aACC,KACA,CACD,eACC,OACA,CACD,gBACC,QACA,CACD,cACC,MACA,CACD,iBACC,UAAW,CACX,UACA,CACD,gCACC,WACA,CACD,8BACC,eACA,CACD,iCACC,kBACA,CACD,+BACC,gBACA,CACD,gCACC,iBACA,CAKD,iCACC,mBACA,CACD,kCACC,SAAU,CAGF,6BACR,CACD,oDACC,SACA,CACD,uBACC,4BAA6B,CAErB,oBACR,CACD,0CACC,qBAAsB,CAKd,yDAA4D,CAA5D,iDAA4D,CAA5D,gGAJR,CAMD,iEAIS,eACR,CAED,sCACC,iBACA,CAKD,qBACC,cACA,CACD,cAGC,WACA,CACD,2DAEC,gBACA,CACD,qCAEC,WACA,CACD,iIAGC,WAAY,CAGZ,eACA,CAGD,gHAKC,mBACA,CAED,8KAIC,6BAA8B,CAC9B,mBACA,CAID,mBACC,eAAgB,CAChB,SACA,CACD,qBACC,aACA,CACD,oCACC,wBACA,CACD,kBACC,sBAAuB,CACvB,6BACA,CAID,mBACC,yDACA,CAKD,aACC,oCAAsC,CACtC,iBACA,CACD,oCAEC,qBAAsB,CACtB,4BAA6B,CAC7B,UAAW,CACX,WAAY,CACZ,gBAAiB,CACjB,aAAc,CACd,iBAAkB,CAClB,oBAAqB,CACrB,UACA,CACD,8CAEC,2BAA4B,CAC5B,2BAA4B,CAC5B,aACA,CACD,qBACC,wBACA,CACD,2BACC,0BAA2B,CAC3B,2BACA,CACD,0BACC,6BAA8B,CAC9B,8BAA+B,CAC/B,kBACA,CACD,gCACC,cAAe,CACf,wBAAyB,CACzB,UACA,CAED,8BACC,UAAW,CACX,WAAY,CACZ,gBACA,CACD,0CACC,0BAA2B,CAC3B,2BACA,CACD,yCACC,6BAA8B,CAC9B,8BACA,CAID,mDAEC,+CAAmD,CACnD,eACA,CAED,iFACC,cACA,CAKD,wBACC,mCAAqC,CACrC,eAAgB,CAChB,iBACA,CACD,+BACC,48BAAwC,CACxC,UAAW,CACX,WACA,CACD,+CACC,4rDAA2C,CAC3C,yBACA,CACD,8CACC,UAAW,CACX,WACA,CACD,qHAEC,YACA,CACD,8DACC,aAAc,CACd,iBACA,CACD,iCACC,wBAAyB,CACzB,UAAW,CACX,eACA,CACD,kCACC,iBAAkB,CAClB,iBAAkB,CAClB,iBACA,CACD,iCACC,cAAe,CACf,iBAAkB,CAClB,OACA,CACD,8BACC,aACA,CACD,kCACC,QAAS,CACT,yBAA0B,CAC1B,yBACA,CAGD,2BACC,g9DACA,CAKD,gDACC,eAAgB,CAChB,6BAAoC,CACpC,QACA,CACD,yDAEC,aAAc,CACd,UACA,CACD,+BACC,oBACA,CACD,qCACC,yBACA,CACD,0FAEC,cACA,CACD,qCACC,eACA,CACD,uCACC,iBACA,CACD,4BAEC,qBAAgB,CAAhB,eAAgB,CAChB,eAAgB,CAChB,mBAAoB,CACpB,cAAe,CACf,kBAAmB,CACnB,eAAgB,CAEX,qBAAsB,CAE3B,eAAgB,CAChB,6BACA,CACD,8CACC,yBAA0B,CAC1B,kBAAmB,CACnB,eACA,CACD,+DACC,4BACA,CAED,+GAGC,eACA,CACD,mEAEC,+BAAiC,CACjC,2BACA,CAKD,eACC,iBAAkB,CAClB,iBAAkB,CAClB,kBACA,CACD,+BACC,WAAY,CACZ,eAAgB,CAChB,kBACA,CACD,uBACC,gBAAiB,CACjB,eACA,CACD,yBACC,aACA,CACD,6BACC,UAAW,CACX,WAAY,CACZ,iBAAkB,CAClB,QAAS,CACT,iBAAkB,CAClB,eAAgB,CAChB,mBACA,CACD,mBACC,UAAW,CACX,WAAY,CACZ,WAAY,CAEZ,mBAAoB,CAEpB,+BAAgC,CAGxB,uBACR,CACD,kDAEC,eAAiB,CACjB,UAAW,CACX,oCACA,CACD,gDACC,iBAAkB,CAClB,KAAM,CACN,OAAQ,CACR,mBAAoB,CACpB,WAAY,CACZ,iBAAkB,CAClB,UAAW,CACX,WAAY,CACZ,wCAA2C,CAC3C,aAAc,CACd,oBAAqB,CACrB,eAAiB,CACjB,sBACA,CACD,sDACC,UACA,CACD,wBACC,aAAc,CACd,4BAA6B,CAC7B,yBACA,CAED,8CACC,UACA,CACD,kCACC,UAAW,CACX,aAAc,CAEd,sHAAuH,CACvH,6GACA,CACD,4CACC,eACA,CAED,4JAIC,qBACA,CAKD,kBACC,eAAgB,CAChB,qBACA,CAKD,iBACC,iBAAkB,CAClB,WAAY,CACZ,qBAAsB,CACtB,qBAAsB,CACtB,iBAAkB,CAClB,UAAW,CACX,kBAAmB,CACnB,wBAAyB,CAEzB,oBAAqB,CACrB,gBAAiB,CACjB,mBAAoB,CACpB,mCACA,CACD,mCACC,cAAe,CACf,mBACA,CACD,sHAIC,iBAAkB,CAClB,mBAAoB,CACpB,4BAA6B,CAC7B,sBAAuB,CACvB,UACA,CAID,wBACC,cACD,CACA,qBACC,eACD,CACA,2DAEC,QAAS,CACT,gBACA,CACD,4BACC,QAAS,CACT,mBAAoB,CACpB,qBACA,CACD,+BACC,KAAM,CACN,gBAAiB,CACjB,gBAAiB,CACjB,wBACA,CACD,sBACC,gBACD,CACA,uBACC,eACD,CACA,2DAEC,OAAQ,CACR,eACA,CACD,6BACC,OAAQ,CACR,kBAAmB,CACnB,sBACA,CACD,8BACC,MAAO,CACP,iBAAkB,CAClB,uBACA","file":"2.da98c186.chunk.css","sourcesContent":["/* required styles */\r\n\r\n.leaflet-pane,\r\n.leaflet-tile,\r\n.leaflet-marker-icon,\r\n.leaflet-marker-shadow,\r\n.leaflet-tile-container,\r\n.leaflet-pane > svg,\r\n.leaflet-pane > canvas,\r\n.leaflet-zoom-box,\r\n.leaflet-image-layer,\r\n.leaflet-layer {\r\n\tposition: absolute;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\t}\r\n.leaflet-container {\r\n\toverflow: hidden;\r\n\t}\r\n.leaflet-tile,\r\n.leaflet-marker-icon,\r\n.leaflet-marker-shadow {\r\n\t-webkit-user-select: none;\r\n\t -moz-user-select: none;\r\n\t user-select: none;\r\n\t -webkit-user-drag: none;\r\n\t}\r\n/* Prevents IE11 from highlighting tiles in blue */\r\n.leaflet-tile::selection {\r\n\tbackground: transparent;\r\n}\r\n/* Safari renders non-retina tile on retina better with this, but Chrome is worse */\r\n.leaflet-safari .leaflet-tile {\r\n\timage-rendering: -webkit-optimize-contrast;\r\n\t}\r\n/* hack that prevents hw layers \"stretching\" when loading new tiles */\r\n.leaflet-safari .leaflet-tile-container {\r\n\twidth: 1600px;\r\n\theight: 1600px;\r\n\t-webkit-transform-origin: 0 0;\r\n\t}\r\n.leaflet-marker-icon,\r\n.leaflet-marker-shadow {\r\n\tdisplay: block;\r\n\t}\r\n/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */\r\n/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */\r\n.leaflet-container .leaflet-overlay-pane svg,\r\n.leaflet-container .leaflet-marker-pane img,\r\n.leaflet-container .leaflet-shadow-pane img,\r\n.leaflet-container .leaflet-tile-pane img,\r\n.leaflet-container img.leaflet-image-layer,\r\n.leaflet-container .leaflet-tile {\r\n\tmax-width: none !important;\r\n\tmax-height: none !important;\r\n\t}\r\n\r\n.leaflet-container.leaflet-touch-zoom {\r\n\t-ms-touch-action: pan-x pan-y;\r\n\ttouch-action: pan-x pan-y;\r\n\t}\r\n.leaflet-container.leaflet-touch-drag {\r\n\t-ms-touch-action: pinch-zoom;\r\n\t/* Fallback for FF which doesn't support pinch-zoom */\r\n\ttouch-action: none;\r\n\ttouch-action: pinch-zoom;\r\n}\r\n.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {\r\n\t-ms-touch-action: none;\r\n\ttouch-action: none;\r\n}\r\n.leaflet-container {\r\n\t-webkit-tap-highlight-color: transparent;\r\n}\r\n.leaflet-container a {\r\n\t-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);\r\n}\r\n.leaflet-tile {\r\n\tfilter: inherit;\r\n\tvisibility: hidden;\r\n\t}\r\n.leaflet-tile-loaded {\r\n\tvisibility: inherit;\r\n\t}\r\n.leaflet-zoom-box {\r\n\twidth: 0;\r\n\theight: 0;\r\n\t-moz-box-sizing: border-box;\r\n\t box-sizing: border-box;\r\n\tz-index: 800;\r\n\t}\r\n/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */\r\n.leaflet-overlay-pane svg {\r\n\t-moz-user-select: none;\r\n\t}\r\n\r\n.leaflet-pane { z-index: 400; }\r\n\r\n.leaflet-tile-pane { z-index: 200; }\r\n.leaflet-overlay-pane { z-index: 400; }\r\n.leaflet-shadow-pane { z-index: 500; }\r\n.leaflet-marker-pane { z-index: 600; }\r\n.leaflet-tooltip-pane { z-index: 650; }\r\n.leaflet-popup-pane { z-index: 700; }\r\n\r\n.leaflet-map-pane canvas { z-index: 100; }\r\n.leaflet-map-pane svg { z-index: 200; }\r\n\r\n.leaflet-vml-shape {\r\n\twidth: 1px;\r\n\theight: 1px;\r\n\t}\r\n.lvml {\r\n\tbehavior: url(#default#VML);\r\n\tdisplay: inline-block;\r\n\tposition: absolute;\r\n\t}\r\n\r\n\r\n/* control positioning */\r\n\r\n.leaflet-control {\r\n\tposition: relative;\r\n\tz-index: 800;\r\n\tpointer-events: visiblePainted; /* IE 9-10 doesn't have auto */\r\n\tpointer-events: auto;\r\n\t}\r\n.leaflet-top,\r\n.leaflet-bottom {\r\n\tposition: absolute;\r\n\tz-index: 1000;\r\n\tpointer-events: none;\r\n\t}\r\n.leaflet-top {\r\n\ttop: 0;\r\n\t}\r\n.leaflet-right {\r\n\tright: 0;\r\n\t}\r\n.leaflet-bottom {\r\n\tbottom: 0;\r\n\t}\r\n.leaflet-left {\r\n\tleft: 0;\r\n\t}\r\n.leaflet-control {\r\n\tfloat: left;\r\n\tclear: both;\r\n\t}\r\n.leaflet-right .leaflet-control {\r\n\tfloat: right;\r\n\t}\r\n.leaflet-top .leaflet-control {\r\n\tmargin-top: 10px;\r\n\t}\r\n.leaflet-bottom .leaflet-control {\r\n\tmargin-bottom: 10px;\r\n\t}\r\n.leaflet-left .leaflet-control {\r\n\tmargin-left: 10px;\r\n\t}\r\n.leaflet-right .leaflet-control {\r\n\tmargin-right: 10px;\r\n\t}\r\n\r\n\r\n/* zoom and fade animations */\r\n\r\n.leaflet-fade-anim .leaflet-tile {\r\n\twill-change: opacity;\r\n\t}\r\n.leaflet-fade-anim .leaflet-popup {\r\n\topacity: 0;\r\n\t-webkit-transition: opacity 0.2s linear;\r\n\t -moz-transition: opacity 0.2s linear;\r\n\t transition: opacity 0.2s linear;\r\n\t}\r\n.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {\r\n\topacity: 1;\r\n\t}\r\n.leaflet-zoom-animated {\r\n\t-webkit-transform-origin: 0 0;\r\n\t -ms-transform-origin: 0 0;\r\n\t transform-origin: 0 0;\r\n\t}\r\n.leaflet-zoom-anim .leaflet-zoom-animated {\r\n\twill-change: transform;\r\n\t}\r\n.leaflet-zoom-anim .leaflet-zoom-animated {\r\n\t-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);\r\n\t -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);\r\n\t transition: transform 0.25s cubic-bezier(0,0,0.25,1);\r\n\t}\r\n.leaflet-zoom-anim .leaflet-tile,\r\n.leaflet-pan-anim .leaflet-tile {\r\n\t-webkit-transition: none;\r\n\t -moz-transition: none;\r\n\t transition: none;\r\n\t}\r\n\r\n.leaflet-zoom-anim .leaflet-zoom-hide {\r\n\tvisibility: hidden;\r\n\t}\r\n\r\n\r\n/* cursors */\r\n\r\n.leaflet-interactive {\r\n\tcursor: pointer;\r\n\t}\r\n.leaflet-grab {\r\n\tcursor: -webkit-grab;\r\n\tcursor: -moz-grab;\r\n\tcursor: grab;\r\n\t}\r\n.leaflet-crosshair,\r\n.leaflet-crosshair .leaflet-interactive {\r\n\tcursor: crosshair;\r\n\t}\r\n.leaflet-popup-pane,\r\n.leaflet-control {\r\n\tcursor: auto;\r\n\t}\r\n.leaflet-dragging .leaflet-grab,\r\n.leaflet-dragging .leaflet-grab .leaflet-interactive,\r\n.leaflet-dragging .leaflet-marker-draggable {\r\n\tcursor: move;\r\n\tcursor: -webkit-grabbing;\r\n\tcursor: -moz-grabbing;\r\n\tcursor: grabbing;\r\n\t}\r\n\r\n/* marker & overlays interactivity */\r\n.leaflet-marker-icon,\r\n.leaflet-marker-shadow,\r\n.leaflet-image-layer,\r\n.leaflet-pane > svg path,\r\n.leaflet-tile-container {\r\n\tpointer-events: none;\r\n\t}\r\n\r\n.leaflet-marker-icon.leaflet-interactive,\r\n.leaflet-image-layer.leaflet-interactive,\r\n.leaflet-pane > svg path.leaflet-interactive,\r\nsvg.leaflet-image-layer.leaflet-interactive path {\r\n\tpointer-events: visiblePainted; /* IE 9-10 doesn't have auto */\r\n\tpointer-events: auto;\r\n\t}\r\n\r\n/* visual tweaks */\r\n\r\n.leaflet-container {\r\n\tbackground: #ddd;\r\n\toutline: 0;\r\n\t}\r\n.leaflet-container a {\r\n\tcolor: #0078A8;\r\n\t}\r\n.leaflet-container a.leaflet-active {\r\n\toutline: 2px solid orange;\r\n\t}\r\n.leaflet-zoom-box {\r\n\tborder: 2px dotted #38f;\r\n\tbackground: rgba(255,255,255,0.5);\r\n\t}\r\n\r\n\r\n/* general typography */\r\n.leaflet-container {\r\n\tfont: 12px/1.5 \"Helvetica Neue\", Arial, Helvetica, sans-serif;\r\n\t}\r\n\r\n\r\n/* general toolbar styles */\r\n\r\n.leaflet-bar {\r\n\tbox-shadow: 0 1px 5px rgba(0,0,0,0.65);\r\n\tborder-radius: 4px;\r\n\t}\r\n.leaflet-bar a,\r\n.leaflet-bar a:hover {\r\n\tbackground-color: #fff;\r\n\tborder-bottom: 1px solid #ccc;\r\n\twidth: 26px;\r\n\theight: 26px;\r\n\tline-height: 26px;\r\n\tdisplay: block;\r\n\ttext-align: center;\r\n\ttext-decoration: none;\r\n\tcolor: black;\r\n\t}\r\n.leaflet-bar a,\r\n.leaflet-control-layers-toggle {\r\n\tbackground-position: 50% 50%;\r\n\tbackground-repeat: no-repeat;\r\n\tdisplay: block;\r\n\t}\r\n.leaflet-bar a:hover {\r\n\tbackground-color: #f4f4f4;\r\n\t}\r\n.leaflet-bar a:first-child {\r\n\tborder-top-left-radius: 4px;\r\n\tborder-top-right-radius: 4px;\r\n\t}\r\n.leaflet-bar a:last-child {\r\n\tborder-bottom-left-radius: 4px;\r\n\tborder-bottom-right-radius: 4px;\r\n\tborder-bottom: none;\r\n\t}\r\n.leaflet-bar a.leaflet-disabled {\r\n\tcursor: default;\r\n\tbackground-color: #f4f4f4;\r\n\tcolor: #bbb;\r\n\t}\r\n\r\n.leaflet-touch .leaflet-bar a {\r\n\twidth: 30px;\r\n\theight: 30px;\r\n\tline-height: 30px;\r\n\t}\r\n.leaflet-touch .leaflet-bar a:first-child {\r\n\tborder-top-left-radius: 2px;\r\n\tborder-top-right-radius: 2px;\r\n\t}\r\n.leaflet-touch .leaflet-bar a:last-child {\r\n\tborder-bottom-left-radius: 2px;\r\n\tborder-bottom-right-radius: 2px;\r\n\t}\r\n\r\n/* zoom control */\r\n\r\n.leaflet-control-zoom-in,\r\n.leaflet-control-zoom-out {\r\n\tfont: bold 18px 'Lucida Console', Monaco, monospace;\r\n\ttext-indent: 1px;\r\n\t}\r\n\r\n.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {\r\n\tfont-size: 22px;\r\n\t}\r\n\r\n\r\n/* layers control */\r\n\r\n.leaflet-control-layers {\r\n\tbox-shadow: 0 1px 5px rgba(0,0,0,0.4);\r\n\tbackground: #fff;\r\n\tborder-radius: 5px;\r\n\t}\r\n.leaflet-control-layers-toggle {\r\n\tbackground-image: url(images/layers.png);\r\n\twidth: 36px;\r\n\theight: 36px;\r\n\t}\r\n.leaflet-retina .leaflet-control-layers-toggle {\r\n\tbackground-image: url(images/layers-2x.png);\r\n\tbackground-size: 26px 26px;\r\n\t}\r\n.leaflet-touch .leaflet-control-layers-toggle {\r\n\twidth: 44px;\r\n\theight: 44px;\r\n\t}\r\n.leaflet-control-layers .leaflet-control-layers-list,\r\n.leaflet-control-layers-expanded .leaflet-control-layers-toggle {\r\n\tdisplay: none;\r\n\t}\r\n.leaflet-control-layers-expanded .leaflet-control-layers-list {\r\n\tdisplay: block;\r\n\tposition: relative;\r\n\t}\r\n.leaflet-control-layers-expanded {\r\n\tpadding: 6px 10px 6px 6px;\r\n\tcolor: #333;\r\n\tbackground: #fff;\r\n\t}\r\n.leaflet-control-layers-scrollbar {\r\n\toverflow-y: scroll;\r\n\toverflow-x: hidden;\r\n\tpadding-right: 5px;\r\n\t}\r\n.leaflet-control-layers-selector {\r\n\tmargin-top: 2px;\r\n\tposition: relative;\r\n\ttop: 1px;\r\n\t}\r\n.leaflet-control-layers label {\r\n\tdisplay: block;\r\n\t}\r\n.leaflet-control-layers-separator {\r\n\theight: 0;\r\n\tborder-top: 1px solid #ddd;\r\n\tmargin: 5px -10px 5px -6px;\r\n\t}\r\n\r\n/* Default icon URLs */\r\n.leaflet-default-icon-path {\r\n\tbackground-image: url(images/marker-icon.png);\r\n\t}\r\n\r\n\r\n/* attribution and scale controls */\r\n\r\n.leaflet-container .leaflet-control-attribution {\r\n\tbackground: #fff;\r\n\tbackground: rgba(255, 255, 255, 0.7);\r\n\tmargin: 0;\r\n\t}\r\n.leaflet-control-attribution,\r\n.leaflet-control-scale-line {\r\n\tpadding: 0 5px;\r\n\tcolor: #333;\r\n\t}\r\n.leaflet-control-attribution a {\r\n\ttext-decoration: none;\r\n\t}\r\n.leaflet-control-attribution a:hover {\r\n\ttext-decoration: underline;\r\n\t}\r\n.leaflet-container .leaflet-control-attribution,\r\n.leaflet-container .leaflet-control-scale {\r\n\tfont-size: 11px;\r\n\t}\r\n.leaflet-left .leaflet-control-scale {\r\n\tmargin-left: 5px;\r\n\t}\r\n.leaflet-bottom .leaflet-control-scale {\r\n\tmargin-bottom: 5px;\r\n\t}\r\n.leaflet-control-scale-line {\r\n\tborder: 2px solid #777;\r\n\tborder-top: none;\r\n\tline-height: 1.1;\r\n\tpadding: 2px 5px 1px;\r\n\tfont-size: 11px;\r\n\twhite-space: nowrap;\r\n\toverflow: hidden;\r\n\t-moz-box-sizing: border-box;\r\n\t box-sizing: border-box;\r\n\r\n\tbackground: #fff;\r\n\tbackground: rgba(255, 255, 255, 0.5);\r\n\t}\r\n.leaflet-control-scale-line:not(:first-child) {\r\n\tborder-top: 2px solid #777;\r\n\tborder-bottom: none;\r\n\tmargin-top: -2px;\r\n\t}\r\n.leaflet-control-scale-line:not(:first-child):not(:last-child) {\r\n\tborder-bottom: 2px solid #777;\r\n\t}\r\n\r\n.leaflet-touch .leaflet-control-attribution,\r\n.leaflet-touch .leaflet-control-layers,\r\n.leaflet-touch .leaflet-bar {\r\n\tbox-shadow: none;\r\n\t}\r\n.leaflet-touch .leaflet-control-layers,\r\n.leaflet-touch .leaflet-bar {\r\n\tborder: 2px solid rgba(0,0,0,0.2);\r\n\tbackground-clip: padding-box;\r\n\t}\r\n\r\n\r\n/* popup */\r\n\r\n.leaflet-popup {\r\n\tposition: absolute;\r\n\ttext-align: center;\r\n\tmargin-bottom: 20px;\r\n\t}\r\n.leaflet-popup-content-wrapper {\r\n\tpadding: 1px;\r\n\ttext-align: left;\r\n\tborder-radius: 12px;\r\n\t}\r\n.leaflet-popup-content {\r\n\tmargin: 13px 19px;\r\n\tline-height: 1.4;\r\n\t}\r\n.leaflet-popup-content p {\r\n\tmargin: 18px 0;\r\n\t}\r\n.leaflet-popup-tip-container {\r\n\twidth: 40px;\r\n\theight: 20px;\r\n\tposition: absolute;\r\n\tleft: 50%;\r\n\tmargin-left: -20px;\r\n\toverflow: hidden;\r\n\tpointer-events: none;\r\n\t}\r\n.leaflet-popup-tip {\r\n\twidth: 17px;\r\n\theight: 17px;\r\n\tpadding: 1px;\r\n\r\n\tmargin: -10px auto 0;\r\n\r\n\t-webkit-transform: rotate(45deg);\r\n\t -moz-transform: rotate(45deg);\r\n\t -ms-transform: rotate(45deg);\r\n\t transform: rotate(45deg);\r\n\t}\r\n.leaflet-popup-content-wrapper,\r\n.leaflet-popup-tip {\r\n\tbackground: white;\r\n\tcolor: #333;\r\n\tbox-shadow: 0 3px 14px rgba(0,0,0,0.4);\r\n\t}\r\n.leaflet-container a.leaflet-popup-close-button {\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tright: 0;\r\n\tpadding: 4px 4px 0 0;\r\n\tborder: none;\r\n\ttext-align: center;\r\n\twidth: 18px;\r\n\theight: 14px;\r\n\tfont: 16px/14px Tahoma, Verdana, sans-serif;\r\n\tcolor: #c3c3c3;\r\n\ttext-decoration: none;\r\n\tfont-weight: bold;\r\n\tbackground: transparent;\r\n\t}\r\n.leaflet-container a.leaflet-popup-close-button:hover {\r\n\tcolor: #999;\r\n\t}\r\n.leaflet-popup-scrolled {\r\n\toverflow: auto;\r\n\tborder-bottom: 1px solid #ddd;\r\n\tborder-top: 1px solid #ddd;\r\n\t}\r\n\r\n.leaflet-oldie .leaflet-popup-content-wrapper {\r\n\t-ms-zoom: 1;\r\n\t}\r\n.leaflet-oldie .leaflet-popup-tip {\r\n\twidth: 24px;\r\n\tmargin: 0 auto;\r\n\r\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)\";\r\n\tfilter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);\r\n\t}\r\n.leaflet-oldie .leaflet-popup-tip-container {\r\n\tmargin-top: -1px;\r\n\t}\r\n\r\n.leaflet-oldie .leaflet-control-zoom,\r\n.leaflet-oldie .leaflet-control-layers,\r\n.leaflet-oldie .leaflet-popup-content-wrapper,\r\n.leaflet-oldie .leaflet-popup-tip {\r\n\tborder: 1px solid #999;\r\n\t}\r\n\r\n\r\n/* div icon */\r\n\r\n.leaflet-div-icon {\r\n\tbackground: #fff;\r\n\tborder: 1px solid #666;\r\n\t}\r\n\r\n\r\n/* Tooltip */\r\n/* Base styles for the element that has a tooltip */\r\n.leaflet-tooltip {\r\n\tposition: absolute;\r\n\tpadding: 6px;\r\n\tbackground-color: #fff;\r\n\tborder: 1px solid #fff;\r\n\tborder-radius: 3px;\r\n\tcolor: #222;\r\n\twhite-space: nowrap;\r\n\t-webkit-user-select: none;\r\n\t-moz-user-select: none;\r\n\t-ms-user-select: none;\r\n\tuser-select: none;\r\n\tpointer-events: none;\r\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.4);\r\n\t}\r\n.leaflet-tooltip.leaflet-clickable {\r\n\tcursor: pointer;\r\n\tpointer-events: auto;\r\n\t}\r\n.leaflet-tooltip-top:before,\r\n.leaflet-tooltip-bottom:before,\r\n.leaflet-tooltip-left:before,\r\n.leaflet-tooltip-right:before {\r\n\tposition: absolute;\r\n\tpointer-events: none;\r\n\tborder: 6px solid transparent;\r\n\tbackground: transparent;\r\n\tcontent: \"\";\r\n\t}\r\n\r\n/* Directions */\r\n\r\n.leaflet-tooltip-bottom {\r\n\tmargin-top: 6px;\r\n}\r\n.leaflet-tooltip-top {\r\n\tmargin-top: -6px;\r\n}\r\n.leaflet-tooltip-bottom:before,\r\n.leaflet-tooltip-top:before {\r\n\tleft: 50%;\r\n\tmargin-left: -6px;\r\n\t}\r\n.leaflet-tooltip-top:before {\r\n\tbottom: 0;\r\n\tmargin-bottom: -12px;\r\n\tborder-top-color: #fff;\r\n\t}\r\n.leaflet-tooltip-bottom:before {\r\n\ttop: 0;\r\n\tmargin-top: -12px;\r\n\tmargin-left: -6px;\r\n\tborder-bottom-color: #fff;\r\n\t}\r\n.leaflet-tooltip-left {\r\n\tmargin-left: -6px;\r\n}\r\n.leaflet-tooltip-right {\r\n\tmargin-left: 6px;\r\n}\r\n.leaflet-tooltip-left:before,\r\n.leaflet-tooltip-right:before {\r\n\ttop: 50%;\r\n\tmargin-top: -6px;\r\n\t}\r\n.leaflet-tooltip-left:before {\r\n\tright: 0;\r\n\tmargin-right: -12px;\r\n\tborder-left-color: #fff;\r\n\t}\r\n.leaflet-tooltip-right:before {\r\n\tleft: 0;\r\n\tmargin-left: -12px;\r\n\tborder-right-color: #fff;\r\n\t}\r\n"]} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/main.08a4014d.chunk.css b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/main.08a4014d.chunk.css deleted file mode 100644 index e5ef2072df..0000000000 --- a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/main.08a4014d.chunk.css +++ /dev/null @@ -1,2 +0,0 @@ -#map,.leaflet-container{width:100%;height:100vh}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px;width:600px;height:100px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 19px;line-height:1.4}.leaflet-popup-content p{margin:18px 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;border:none;text-align:center;width:18px;height:14px;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;font-weight:700;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678,M12=0.70710678,M21=-0.70710678,M22=0.70710678)}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.edge-modal{position:fixed;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border:1px solid #ccc;background:#fff;overflow:auto;border-radius:4px;outline:none;padding:20px}.edge-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.75)}.ReactModal__Overlay{opacity:0;transition:opacity .5s ease-in-out}.ReactModal__Overlay--after-open{opacity:1}.ReactModal__Overlay--before-close{opacity:0}body,html{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:100%;height:100%}code{font-family:source-code-pro,Menlo,Monaco,Consolas,"Courier New",monospace} -/*# sourceMappingURL=main.08a4014d.chunk.css.map */ \ No newline at end of file diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/main.08a4014d.chunk.css.map b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/main.08a4014d.chunk.css.map deleted file mode 100644 index 07da462696..0000000000 --- a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/css/main.08a4014d.chunk.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://src/App.css","webpack://src/index.css"],"names":[],"mappings":"AAAA,wBACI,UAAW,CACX,YACJ,CAEA,eACI,iBAAkB,CAClB,iBAAkB,CAClB,kBAAmB,CACnB,WAAY,CACZ,YACJ,CAEA,+BACI,WAAY,CACZ,eAAgB,CAChB,kBACJ,CAEA,uBACI,gBAAiB,CACjB,eACJ,CAEA,yBACI,aACJ,CAEA,6BACI,UAAW,CACX,WAAY,CACZ,iBAAkB,CAClB,QAAS,CACT,iBAAkB,CAClB,eAAgB,CAChB,mBACJ,CAEA,mBACI,UAAW,CACX,WAAY,CACZ,WAAY,CAEZ,mBAAoB,CAEpB,+BAAgC,CAGhC,uBACJ,CAEA,kDAEI,eAAiB,CACjB,UAAW,CACX,oCACJ,CAEA,gDACI,iBAAkB,CAClB,KAAM,CACN,OAAQ,CACR,mBAAoB,CACpB,WAAY,CACZ,iBAAkB,CAClB,UAAW,CACX,WAAY,CACZ,wCAA2C,CAC3C,aAAc,CACd,oBAAqB,CACrB,eAAiB,CACjB,sBACJ,CAEA,sDACI,UACJ,CAEA,wBACI,aAAc,CACd,4BAA6B,CAC7B,yBACJ,CAEA,8CACI,UACJ,CAEA,kCACI,UAAW,CACX,aAAc,CAEd,sHAAuH,CACvH,6GACJ,CAEA,4CACI,eACJ,CAEA,4JAII,qBACJ,CAEA,YACI,cAAe,CACf,OAAQ,CACR,QAAS,CACT,sCAAgC,CAAhC,8BAAgC,CAEhC,qBAAsB,CACtB,eAAgB,CAChB,aAAc,CACd,iBAAkB,CAClB,YAAa,CACb,YACJ,CAEA,cACI,cAAe,CACf,KAAM,CACN,MAAO,CACP,OAAQ,CACR,QAAS,CACT,gCACJ,CAEA,qBACI,SAAU,CACV,kCACJ,CAEA,iCACI,SACJ,CAEA,mCACI,SACJ,CC7IA,UACE,QAAS,CACT,mJAEY,CACZ,kCAAmC,CACnC,iCAAkC,CAClC,UAAW,CACX,WACF,CAEA,KACE,yEAEF","file":"main.08a4014d.chunk.css","sourcesContent":["#map, .leaflet-container {\n width: 100%;\n height: 100vh;\n}\n\n.leaflet-popup {\n position: absolute;\n text-align: center;\n margin-bottom: 20px;\n width: 600px;\n height: 100px;\n}\n\n.leaflet-popup-content-wrapper {\n padding: 1px;\n text-align: left;\n border-radius: 12px;\n}\n\n.leaflet-popup-content {\n margin: 13px 19px;\n line-height: 1.4;\n}\n\n.leaflet-popup-content p {\n margin: 18px 0;\n}\n\n.leaflet-popup-tip-container {\n width: 40px;\n height: 20px;\n position: absolute;\n left: 50%;\n margin-left: -20px;\n overflow: hidden;\n pointer-events: none;\n}\n\n.leaflet-popup-tip {\n width: 17px;\n height: 17px;\n padding: 1px;\n\n margin: -10px auto 0;\n\n -webkit-transform: rotate(45deg);\n -moz-transform: rotate(45deg);\n -ms-transform: rotate(45deg);\n transform: rotate(45deg);\n}\n\n.leaflet-popup-content-wrapper,\n.leaflet-popup-tip {\n background: white;\n color: #333;\n box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4);\n}\n\n.leaflet-container a.leaflet-popup-close-button {\n position: absolute;\n top: 0;\n right: 0;\n padding: 4px 4px 0 0;\n border: none;\n text-align: center;\n width: 18px;\n height: 14px;\n font: 16px/14px Tahoma, Verdana, sans-serif;\n color: #c3c3c3;\n text-decoration: none;\n font-weight: bold;\n background: transparent;\n}\n\n.leaflet-container a.leaflet-popup-close-button:hover {\n color: #999;\n}\n\n.leaflet-popup-scrolled {\n overflow: auto;\n border-bottom: 1px solid #ddd;\n border-top: 1px solid #ddd;\n}\n\n.leaflet-oldie .leaflet-popup-content-wrapper {\n -ms-zoom: 1;\n}\n\n.leaflet-oldie .leaflet-popup-tip {\n width: 24px;\n margin: 0 auto;\n\n -ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)\";\n filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);\n}\n\n.leaflet-oldie .leaflet-popup-tip-container {\n margin-top: -1px;\n}\n\n.leaflet-oldie .leaflet-control-zoom,\n.leaflet-oldie .leaflet-control-layers,\n.leaflet-oldie .leaflet-popup-content-wrapper,\n.leaflet-oldie .leaflet-popup-tip {\n border: 1px solid #999;\n}\n\n.edge-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n border: 1px solid #ccc;\n background: #fff;\n overflow: auto;\n border-radius: 4px;\n outline: none;\n padding: 20px;\n}\n\n.edge-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.75);\n}\n\n.ReactModal__Overlay {\n opacity: 0;\n transition: opacity 500ms ease-in-out;\n}\n\n.ReactModal__Overlay--after-open {\n opacity: 1;\n}\n\n.ReactModal__Overlay--before-close {\n opacity: 0;\n}\n","html, body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n width: 100%;\n height: 100%;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n"]} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/2.5879b560.chunk.js b/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/2.5879b560.chunk.js deleted file mode 100644 index 4a103158dc..0000000000 --- a/vendor/github.com/skycoin/skywire-services/pkg/node-visualizer/api/build/static/js/2.5879b560.chunk.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see 2.5879b560.chunk.js.LICENSE.txt */ -(this.webpackJsonpweb=this.webpackJsonpweb||[]).push([[2],[function(t,e,n){"use strict";t.exports=n(36)},function(t,e,n){"use strict";t.exports=n(73)},function(t,e,n){"use strict";function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,o)}return n}function r(t){for(var e=1;e0?Math.floor(t):Math.ceil(t)};function R(t,e,n){return t instanceof N?t:v(t)?new N(t[0],t[1]):void 0===t||null===t?t:"object"===typeof t&&"x"in t&&"y"in t?new N(t.x,t.y):new N(t,e,n)}function A(t,e){if(t)for(var n=e?[t,e]:t,o=0,i=n.length;o=this.min.x&&n.x<=this.max.x&&e.y>=this.min.y&&n.y<=this.max.y},intersects:function(t){t=j(t);var e=this.min,n=this.max,o=t.min,i=t.max,r=i.x>=e.x&&o.x<=n.x,a=i.y>=e.y&&o.y<=n.y;return r&&a},overlaps:function(t){t=j(t);var e=this.min,n=this.max,o=t.min,i=t.max,r=i.x>e.x&&o.xe.y&&o.y=o.lat&&n.lat<=i.lat&&e.lng>=o.lng&&n.lng<=i.lng},intersects:function(t){t=D(t);var e=this._southWest,n=this._northEast,o=t.getSouthWest(),i=t.getNorthEast(),r=i.lat>=e.lat&&o.lat<=n.lat,a=i.lng>=e.lng&&o.lng<=n.lng;return r&&a},overlaps:function(t){t=D(t);var e=this._southWest,n=this._northEast,o=t.getSouthWest(),i=t.getNorthEast(),r=i.lat>e.lat&&o.late.lng&&o.lng1,St=function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("testPassiveEventSupport",u,e),window.removeEventListener("testPassiveEventSupport",u,e)}catch(n){}return t}(),Lt=!!document.createElement("canvas").getContext,Ct=!(!document.createElementNS||!Q("svg").createSVGRect),Ot=!Ct&&function(){try{var t=document.createElement("div");t.innerHTML='';var e=t.firstChild;return e.style.behavior="url(#default#VML)",e&&"object"===typeof e.adj}catch(n){return!1}}();function Mt(t){return navigator.userAgent.toLowerCase().indexOf(t)>=0}var zt={ie:J,ielt9:tt,edge:et,webkit:nt,android:ot,android23:it,androidStock:at,opera:st,chrome:lt,gecko:ut,safari:ct,phantom:ft,opera12:ht,win:dt,ie3d:pt,webkit3d:mt,gecko3d:_t,any3d:vt,mobile:gt,mobileWebkit:yt,mobileWebkit3d:bt,msPointer:wt,pointer:xt,touch:Et,mobileOpera:kt,mobileGecko:Pt,retina:Tt,passiveEvents:St,canvas:Lt,svg:Ct,vml:Ot},Nt=wt?"MSPointerDown":"pointerdown",It=wt?"MSPointerMove":"pointermove",Rt=wt?"MSPointerUp":"pointerup",At=wt?"MSPointerCancel":"pointercancel",jt={},Bt=!1;function Dt(t,e,n,o){return"touchstart"===e?Zt(t,n,o):"touchmove"===e?qt(t,n,o):"touchend"===e&&Kt(t,n,o),this}function Ft(t,e,n){var o=t["_leaflet_"+e+n];return"touchstart"===e?t.removeEventListener(Nt,o,!1):"touchmove"===e?t.removeEventListener(It,o,!1):"touchend"===e&&(t.removeEventListener(Rt,o,!1),t.removeEventListener(At,o,!1)),this}function Zt(t,e,n){var o=i((function(t){t.MSPOINTER_TYPE_TOUCH&&t.pointerType===t.MSPOINTER_TYPE_TOUCH&&He(t),Vt(t,e)}));t["_leaflet_touchstart"+n]=o,t.addEventListener(Nt,o,!1),Bt||(document.addEventListener(Nt,Ut,!0),document.addEventListener(It,Ht,!0),document.addEventListener(Rt,Wt,!0),document.addEventListener(At,Wt,!0),Bt=!0)}function Ut(t){jt[t.pointerId]=t}function Ht(t){jt[t.pointerId]&&(jt[t.pointerId]=t)}function Wt(t){delete jt[t.pointerId]}function Vt(t,e){for(var n in t.touches=[],jt)t.touches.push(jt[n]);t.changedTouches=[t],e(t)}function qt(t,e,n){var o=function(t){t.pointerType===(t.MSPOINTER_TYPE_MOUSE||"mouse")&&0===t.buttons||Vt(t,e)};t["_leaflet_touchmove"+n]=o,t.addEventListener(It,o,!1)}function Kt(t,e,n){var o=function(t){Vt(t,e)};t["_leaflet_touchend"+n]=o,t.addEventListener(Rt,o,!1),t.addEventListener(At,o,!1)}var Gt=wt?"MSPointerDown":xt?"pointerdown":"touchstart",$t=wt?"MSPointerUp":xt?"pointerup":"touchend",Qt="_leaflet_";function Yt(t,e,n){var o,i,r=!1,a=250;function s(t){if(xt){if(!t.isPrimary)return;if("mouse"===t.pointerType)return}else if(t.touches.length>1)return;var e=Date.now(),n=e-(o||e);i=t.touches?t.touches[0]:t,r=n>0&&n<=a,o=e}function l(t){if(r&&!i.cancelBubble){if(xt){if("mouse"===t.pointerType)return;var n,a,s={};for(a in i)n=i[a],s[a]=n&&n.bind?n.bind(i):n;i=s}i.type="dblclick",i.button=0,e(i),o=null}}return t[Qt+Gt+n]=s,t[Qt+$t+n]=l,t[Qt+"dblclick"+n]=e,t.addEventListener(Gt,s,!!St&&{passive:!1}),t.addEventListener($t,l,!!St&&{passive:!1}),t.addEventListener("dblclick",e,!1),this}function Xt(t,e){var n=t[Qt+Gt+e],o=t[Qt+$t+e],i=t[Qt+"dblclick"+e];return t.removeEventListener(Gt,n,!!St&&{passive:!1}),t.removeEventListener($t,o,!!St&&{passive:!1}),t.removeEventListener("dblclick",i,!1),this}var Jt,te,ee,ne,oe,ie=we(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),re=we(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),ae="webkitTransition"===re||"OTransition"===re?re+"End":"transitionend";function se(t){return"string"===typeof t?document.getElementById(t):t}function le(t,e){var n=t.style[e]||t.currentStyle&&t.currentStyle[e];if((!n||"auto"===n)&&document.defaultView){var o=document.defaultView.getComputedStyle(t,null);n=o?o[e]:null}return"auto"===n?null:n}function ue(t,e,n){var o=document.createElement(t);return o.className=e||"",n&&n.appendChild(o),o}function ce(t){var e=t.parentNode;e&&e.removeChild(t)}function fe(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function he(t){var e=t.parentNode;e&&e.lastChild!==t&&e.appendChild(t)}function de(t){var e=t.parentNode;e&&e.firstChild!==t&&e.insertBefore(t,e.firstChild)}function pe(t,e){if(void 0!==t.classList)return t.classList.contains(e);var n=ge(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)}function me(t,e){if(void 0!==t.classList)for(var n=h(e),o=0,i=n.length;othis.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,e){this._enforcingBounds=!0;var n=this.getCenter(),o=this._limitCenter(n,this._zoom,D(t));return n.equals(o)||this.panTo(o,e),this._enforcingBounds=!1,this},panInside:function(t,e){var n=R((e=e||{}).paddingTopLeft||e.padding||[0,0]),o=R(e.paddingBottomRight||e.padding||[0,0]),i=this.getCenter(),r=this.project(i),a=this.project(t),s=this.getPixelBounds(),l=s.getSize().divideBy(2),u=j([s.min.add(n),s.max.subtract(o)]);if(!u.contains(a)){this._enforcingBounds=!0;var c=r.subtract(a),f=R(a.x+c.x,a.y+c.y);(a.xu.max.x)&&(f.x=r.x-c.x,c.x>0?f.x+=l.x-n.x:f.x-=l.x-o.x),(a.yu.max.y)&&(f.y=r.y-c.y,c.y>0?f.y+=l.y-n.y:f.y-=l.y-o.y),this.panTo(this.unproject(f),e),this._enforcingBounds=!1}return this},invalidateSize:function(t){if(!this._loaded)return this;t=n({animate:!1,pan:!0},!0===t?{animate:!0}:t);var e=this.getSize();this._sizeChanged=!0,this._lastCenter=null;var o=this.getSize(),r=e.divideBy(2).round(),a=o.divideBy(2).round(),s=r.subtract(a);return s.x||s.y?(t.animate&&t.pan?this.panBy(s):(t.pan&&this._rawPanBy(s),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(i(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:o})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){if(t=this._locateOptions=n({timeout:1e4,watch:!1},t),!("geolocation"in navigator))return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=i(this._handleGeolocationResponse,this),o=i(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,o,t):navigator.geolocation.getCurrentPosition(e,o,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,n=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+n+"."})},_handleGeolocationResponse:function(t){var e=new F(t.coords.latitude,t.coords.longitude),n=e.toBounds(2*t.coords.accuracy),o=this._locateOptions;if(o.setView){var i=this.getBoundsZoom(n);this.setView(e,o.maxZoom?Math.min(i,o.maxZoom):i)}var r={latlng:e,bounds:n,timestamp:t.timestamp};for(var a in t.coords)"number"===typeof t.coords[a]&&(r[a]=t.coords[a]);this.fire("locationfound",r)},addHandler:function(t,e){if(!e)return this;var n=this[t]=new e(this);return this._handlers.push(n),this.options[t]&&n.enable(),this},remove:function(){if(this._initEvents(!0),this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(e){this._container._leaflet_id=void 0,this._containerId=void 0}var t;for(t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),ce(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(T(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)ce(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,e){var n=ue("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),e||this._mapPane);return t&&(this._panes[t]=n),n},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new B(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,n){t=D(t),n=R(n||[0,0]);var o=this.getZoom()||0,i=this.getMinZoom(),r=this.getMaxZoom(),a=t.getNorthWest(),s=t.getSouthEast(),l=this.getSize().subtract(n),u=j(this.project(s,o),this.project(a,o)).getSize(),c=vt?this.options.zoomSnap:1,f=l.x/u.x,h=l.y/u.y,d=e?Math.max(f,h):Math.min(f,h);return o=this.getScaleZoom(d,o),c&&(o=Math.round(o/(c/100))*(c/100),o=e?Math.ceil(o/c)*c:Math.floor(o/c)*c),Math.max(i,Math.min(r,o))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new N(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,e){var n=this._getTopLeftPoint(t,e);return new A(n,n.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"===typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,e){var n=this.options.crs;return e=void 0===e?this._zoom:e,n.scale(t)/n.scale(e)},getScaleZoom:function(t,e){var n=this.options.crs;e=void 0===e?this._zoom:e;var o=n.zoom(t*n.scale(e));return isNaN(o)?1/0:o},project:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.latLngToPoint(Z(t),e)},unproject:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.pointToLatLng(R(t),e)},layerPointToLatLng:function(t){var e=R(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){return this.project(Z(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(Z(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(D(t))},distance:function(t,e){return this.options.crs.distance(Z(t),Z(e))},containerPointToLayerPoint:function(t){return R(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return R(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(R(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(Z(t)))},mouseEventToContainerPoint:function(t){return Ve(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=se(t);if(!e)throw new Error("Map container not found.");if(e._leaflet_id)throw new Error("Map container is already initialized.");Ne(e,"scroll",this._onScroll,this),this._containerId=a(e)},_initLayout:function(){var t=this._container;this._fadeAnimated=this.options.fadeAnimation&&vt,me(t,"leaflet-container"+(Et?" leaflet-touch":"")+(Tt?" leaflet-retina":"")+(tt?" leaflet-oldie":"")+(ct?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var e=le(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),Ee(this._mapPane,new N(0,0)),this.createPane("tilePane"),this.createPane("shadowPane"),this.createPane("overlayPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(me(t.markerPane,"leaflet-zoom-hide"),me(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,e){Ee(this._mapPane,new N(0,0));var n=!this._loaded;this._loaded=!0,e=this._limitZoom(e),this.fire("viewprereset");var o=this._zoom!==e;this._moveStart(o,!1)._move(t,e)._moveEnd(o),this.fire("viewreset"),n&&this.fire("load")},_moveStart:function(t,e){return t&&this.fire("zoomstart"),e||this.fire("movestart"),this},_move:function(t,e,n){void 0===e&&(e=this._zoom);var o=this._zoom!==e;return this._zoom=e,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),(o||n&&n.pinch)&&this.fire("zoom",n),this.fire("move",n)},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return T(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){Ee(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={},this._targets[a(this._container)]=this;var e=t?Re:Ne;e(this._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&e(window,"resize",this._onResize,this),vt&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){T(this._resizeRequest),this._resizeRequest=P((function(){this.invalidateSize({debounceMoveend:!0})}),this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,e){for(var n,o=[],i="mouseout"===e||"mouseover"===e,r=t.target||t.srcElement,s=!1;r;){if((n=this._targets[a(r)])&&("click"===e||"preclick"===e)&&!t._simulated&&this._draggableMoved(n)){s=!0;break}if(n&&n.listens(e,!0)){if(i&&!Ye(r,t))break;if(o.push(n),i)break}if(r===this._container)break;r=r.parentNode}return o.length||s||i||!Ye(r,t)||(o=[this]),o},_handleDOMEvent:function(t){if(this._loaded&&!Qe(t)){var e=t.type;"mousedown"!==e&&"keypress"!==e&&"keyup"!==e&&"keydown"!==e||Le(t.target||t.srcElement),this._fireDOMEvent(t,e)}},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,e,o){if("click"===t.type){var i=n({},t);i.type="preclick",this._fireDOMEvent(i,i.type,o)}if(!t._stopped&&(o=(o||[]).concat(this._findEventTargets(t,e))).length){var r=o[0];"contextmenu"===e&&r.listens(e,!0)&&He(t);var a={originalEvent:t};if("keypress"!==t.type&&"keydown"!==t.type&&"keyup"!==t.type){var s=r.getLatLng&&(!r._radius||r._radius<=10);a.containerPoint=s?this.latLngToContainerPoint(r.getLatLng()):this.mouseEventToContainerPoint(t),a.layerPoint=this.containerPointToLayerPoint(a.containerPoint),a.latlng=s?r.getLatLng():this.layerPointToLatLng(a.layerPoint)}for(var l=0;l0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),n=this.getMaxZoom(),o=vt?this.options.zoomSnap:1;return o&&(t=Math.round(t/o)*o),Math.max(e,Math.min(n,t))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){_e(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var n=this._getCenterOffset(t)._trunc();return!(!0!==(e&&e.animate)&&!this.getSize().contains(n))&&(this.panBy(n,e),!0)},_createAnimProxy:function(){var t=this._proxy=ue("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(t),this.on("zoomanim",(function(t){var e=ie,n=this._proxy.style[e];xe(this._proxy,this.project(t.center,t.zoom),this.getZoomScale(t.zoom,1)),n===this._proxy.style[e]&&this._animatingZoom&&this._onZoomTransitionEnd()}),this),this.on("load moveend",this._animMoveEnd,this),this._on("unload",this._destroyAnimProxy,this)},_destroyAnimProxy:function(){ce(this._proxy),this.off("load moveend",this._animMoveEnd,this),delete this._proxy},_animMoveEnd:function(){var t=this.getCenter(),e=this.getZoom();xe(this._proxy,this.project(t,e),this.getZoomScale(e,1))},_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,n){if(this._animatingZoom)return!0;if(n=n||{},!this._zoomAnimated||!1===n.animate||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var o=this.getZoomScale(e),i=this._getCenterOffset(t)._divideBy(1-1/o);return!(!0!==n.animate&&!this.getSize().contains(i))&&(P((function(){this._moveStart(!0,!1)._animateZoom(t,e,!0)}),this),!0)},_animateZoom:function(t,e,n,o){this._mapPane&&(n&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=e,me(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:e,noUpdate:o}),setTimeout(i(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&_e(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),P((function(){this._moveEnd(!0)}),this))}});function en(t,e){return new tn(t,e)}var nn=C.extend({options:{position:"topright"},initialize:function(t){d(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var e=this._container=this.onAdd(t),n=this.getPosition(),o=t._controlCorners[n];return me(e,"leaflet-control"),-1!==n.indexOf("bottom")?o.insertBefore(e,o.firstChild):o.appendChild(e),this._map.on("unload",this.remove,this),this},remove:function(){return this._map?(ce(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null,this):this},_refocusOnMap:function(t){this._map&&t&&t.screenX>0&&t.screenY>0&&this._map.getContainer().focus()}}),on=function(t){return new nn(t)};tn.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.remove(),this},_initControlPos:function(){var t=this._controlCorners={},e="leaflet-",n=this._controlContainer=ue("div",e+"control-container",this._container);function o(o,i){var r=e+o+" "+e+i;t[o+i]=ue("div",r,n)}o("top","left"),o("top","right"),o("bottom","left"),o("bottom","right")},_clearControlPos:function(){for(var t in this._controlCorners)ce(this._controlCorners[t]);ce(this._controlContainer),delete this._controlCorners,delete this._controlContainer}});var rn=nn.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(t,e,n,o){return n1,this._baseLayersList.style.display=t?"":"none"),this._separator.style.display=e&&t?"":"none",this},_onLayerChange:function(t){this._handlingClick||this._update();var e=this._getLayer(a(t.target)),n=e.overlay?"add"===t.type?"overlayadd":"overlayremove":"add"===t.type?"baselayerchange":null;n&&this._map.fire(n,e)},_createRadioElement:function(t,e){var n='",o=document.createElement("div");return o.innerHTML=n,o.firstChild},_addItem:function(t){var e,n=document.createElement("label"),o=this._map.hasLayer(t.layer);t.overlay?((e=document.createElement("input")).type="checkbox",e.className="leaflet-control-layers-selector",e.defaultChecked=o):e=this._createRadioElement("leaflet-base-layers_"+a(this),o),this._layerControlInputs.push(e),e.layerId=a(t.layer),Ne(e,"click",this._onInputClick,this);var i=document.createElement("span");i.innerHTML=" "+t.name;var r=document.createElement("div");return n.appendChild(r),r.appendChild(e),r.appendChild(i),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(n),this._checkDisabledLayers(),n},_onInputClick:function(){var t,e,n=this._layerControlInputs,o=[],i=[];this._handlingClick=!0;for(var r=n.length-1;r>=0;r--)t=n[r],e=this._getLayer(t.layerId).layer,t.checked?o.push(e):t.checked||i.push(e);for(r=0;r=0;i--)t=n[i],e=this._getLayer(t.layerId).layer,t.disabled=void 0!==e.options.minZoom&&oe.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),an=function(t,e,n){return new rn(t,e,n)},sn=nn.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"−",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",n=ue("div",e+" leaflet-bar"),o=this.options;return this._zoomInButton=this._createButton(o.zoomInText,o.zoomInTitle,e+"-in",n,this._zoomIn),this._zoomOutButton=this._createButton(o.zoomOutText,o.zoomOutTitle,e+"-out",n,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),n},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,e,n,o,i){var r=ue("a",n,o);return r.innerHTML=t,r.href="#",r.title=e,r.setAttribute("role","button"),r.setAttribute("aria-label",e),Ue(r),Ne(r,"click",We),Ne(r,"click",i,this),Ne(r,"click",this._refocusOnMap,this),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";_e(this._zoomInButton,e),_e(this._zoomOutButton,e),(this._disabled||t._zoom===t.getMinZoom())&&me(this._zoomOutButton,e),(this._disabled||t._zoom===t.getMaxZoom())&&me(this._zoomInButton,e)}});tn.mergeOptions({zoomControl:!0}),tn.addInitHook((function(){this.options.zoomControl&&(this.zoomControl=new sn,this.addControl(this.zoomControl))}));var ln=function(t){return new sn(t)},un=nn.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var e="leaflet-control-scale",n=ue("div",e),o=this.options;return this._addScales(o,e+"-line",n),t.on(o.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),n},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,n){t.metric&&(this._mScale=ue("div",e,n)),t.imperial&&(this._iScale=ue("div",e,n))},_update:function(){var t=this._map,e=t.getSize().y/2,n=t.distance(t.containerPointToLatLng([0,e]),t.containerPointToLatLng([this.options.maxWidth,e]));this._updateScales(n)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var e=this._getRoundNum(t),n=e<1e3?e+" m":e/1e3+" km";this._updateScale(this._mScale,n,e/t)},_updateImperial:function(t){var e,n,o,i=3.2808399*t;i>5280?(e=i/5280,n=this._getRoundNum(e),this._updateScale(this._iScale,n+" mi",n/e)):(o=this._getRoundNum(i),this._updateScale(this._iScale,o+" ft",o/i))},_updateScale:function(t,e,n){t.style.width=Math.round(this.options.maxWidth*n)+"px",t.innerHTML=e},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),n=t/e;return e*(n=n>=10?10:n>=5?5:n>=3?3:n>=2?2:1)}}),cn=function(t){return new un(t)},fn=nn.extend({options:{position:"bottomright",prefix:'
Leaflet'},initialize:function(t){d(this,t),this._attributions={}},onAdd:function(t){for(var e in t.attributionControl=this,this._container=ue("div","leaflet-control-attribution"),Ue(this._container),t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return this._update(),this._container},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):this},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):this},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var n=[];this.options.prefix&&n.push(this.options.prefix),t.length&&n.push(t.join(", ")),this._container.innerHTML=n.join(" | ")}}});tn.mergeOptions({attributionControl:!0}),tn.addInitHook((function(){this.options.attributionControl&&(new fn).addTo(this)}));var hn=function(t){return new fn(t)};nn.Layers=rn,nn.Zoom=sn,nn.Scale=un,nn.Attribution=fn,on.layers=an,on.zoom=ln,on.scale=cn,on.attribution=hn;var dn=C.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},enabled:function(){return!!this._enabled}});dn.addTo=function(t,e){return t.addHandler(e,this),this};var pn,mn={Events:M},_n=Et?"touchstart mousedown":"mousedown",vn={mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},gn={mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"},yn=z.extend({options:{clickTolerance:3},initialize:function(t,e,n,o){d(this,o),this._element=t,this._dragStartTarget=e||t,this._preventOutline=n},enable:function(){this._enabled||(Ne(this._dragStartTarget,_n,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(yn._dragging===this&&this.finishDrag(),Re(this._dragStartTarget,_n,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){if(!t._simulated&&this._enabled&&(this._moved=!1,!pe(this._element,"leaflet-zoom-anim")&&!(yn._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches)&&(yn._dragging=this,this._preventOutline&&Le(this._element),Te(),Jt(),!this._moving))){this.fire("down");var e=t.touches?t.touches[0]:t,n=Oe(this._element);this._startPoint=new N(e.clientX,e.clientY),this._parentScale=Me(n),Ne(document,gn[t.type],this._onMove,this),Ne(document,vn[t.type],this._onUp,this)}},_onMove:function(t){if(!t._simulated&&this._enabled)if(t.touches&&t.touches.length>1)this._moved=!0;else{var e=t.touches&&1===t.touches.length?t.touches[0]:t,n=new N(e.clientX,e.clientY)._subtract(this._startPoint);(n.x||n.y)&&(Math.abs(n.x)+Math.abs(n.y)l&&(r=a,l=s);l>n&&(e[r]=1,kn(t,e,n,o,r),kn(t,e,n,r,i))}function Pn(t,e){for(var n=[t[0]],o=1,i=0,r=t.length;oe&&(n.push(t[o]),i=o);return ie.max.x&&(n|=2),t.ye.max.y&&(n|=8),n}function Cn(t,e){var n=e.x-t.x,o=e.y-t.y;return n*n+o*o}function On(t,e,n,o){var i,r=e.x,a=e.y,s=n.x-r,l=n.y-a,u=s*s+l*l;return u>0&&((i=((t.x-r)*s+(t.y-a)*l)/u)>1?(r=n.x,a=n.y):i>0&&(r+=s*i,a+=l*i)),s=t.x-r,l=t.y-a,o?s*s+l*l:new N(r,a)}function Mn(t){return!v(t[0])||"object"!==typeof t[0][0]&&"undefined"!==typeof t[0][0]}function zn(t){return console.warn("Deprecated use of _flat, please use L.LineUtil.isFlat instead."),Mn(t)}var Nn={simplify:bn,pointToSegmentDistance:wn,closestPointOnSegment:xn,clipSegment:Tn,_getEdgeIntersection:Sn,_getBitCode:Ln,_sqClosestPointOnSegment:On,isFlat:Mn,_flat:zn};function In(t,e,n){var o,i,r,a,s,l,u,c,f,h=[1,4,2,8];for(i=0,u=t.length;i1e-7;l++)e=r*Math.sin(s),e=Math.pow((1-e)/(1+e),r/2),s+=u=Math.PI/2-2*Math.atan(a*e)-s;return new F(s*n,t.x*n/o)}},Bn={LonLat:An,Mercator:jn,SphericalMercator:V},Dn=n({},H,{code:"EPSG:3395",projection:jn,transformation:function(){var t=.5/(Math.PI*jn.R);return K(t,.5,-t,.5)}()}),Fn=n({},H,{code:"EPSG:4326",projection:An,transformation:K(1/180,1,-1/180,.5)}),Zn=n({},U,{projection:An,transformation:K(1,0,-1,0),scale:function(t){return Math.pow(2,t)},zoom:function(t){return Math.log(t)/Math.LN2},distance:function(t,e){var n=e.lng-t.lng,o=e.lat-t.lat;return Math.sqrt(n*n+o*o)},infinite:!0});U.Earth=H,U.EPSG3395=Dn,U.EPSG3857=G,U.EPSG900913=$,U.EPSG4326=Fn,U.Simple=Zn;var Un=z.extend({options:{pane:"overlayPane",attribution:null,bubblingMouseEvents:!0},addTo:function(t){return t.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(t){return t&&t.removeLayer(this),this},getPane:function(t){return this._map.getPane(t?this.options[t]||t:this.options.pane)},addInteractiveTarget:function(t){return this._map._targets[a(t)]=this,this},removeInteractiveTarget:function(t){return delete this._map._targets[a(t)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(t){var e=t.target;if(e.hasLayer(this)){if(this._map=e,this._zoomAnimated=e._zoomAnimated,this.getEvents){var n=this.getEvents();e.on(n,this),this.once("remove",(function(){e.off(n,this)}),this)}this.onAdd(e),this.getAttribution&&e.attributionControl&&e.attributionControl.addAttribution(this.getAttribution()),this.fire("add"),e.fire("layeradd",{layer:this})}}});tn.include({addLayer:function(t){if(!t._layerAdd)throw new Error("The provided object is not a Layer.");var e=a(t);return this._layers[e]||(this._layers[e]=t,t._mapToAdd=this,t.beforeAdd&&t.beforeAdd(this),this.whenReady(t._layerAdd,t)),this},removeLayer:function(t){var e=a(t);return this._layers[e]?(this._loaded&&t.onRemove(this),t.getAttribution&&this.attributionControl&&this.attributionControl.removeAttribution(t.getAttribution()),delete this._layers[e],this._loaded&&(this.fire("layerremove",{layer:t}),t.fire("remove")),t._map=t._mapToAdd=null,this):this},hasLayer:function(t){return!!t&&a(t)in this._layers},eachLayer:function(t,e){for(var n in this._layers)t.call(e,this._layers[n]);return this},_addLayers:function(t){for(var e=0,n=(t=t?v(t)?t:[t]:[]).length;ethis._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()e)return a=(o-e)/n,this._map.layerPointToLatLng([r.x-a*(r.x-i.x),r.y-a*(r.y-i.y)])},getBounds:function(){return this._bounds},addLatLng:function(t,e){return e=e||this._defaultShape(),t=Z(t),e.push(t),this._bounds.extend(t),this.redraw()},_setLatLngs:function(t){this._bounds=new B,this._latlngs=this._convertLatLngs(t)},_defaultShape:function(){return Mn(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(t){for(var e=[],n=Mn(t),o=0,i=t.length;o=2&&e[0]instanceof F&&e[0].equals(e[n-1])&&e.pop(),e},_setLatLngs:function(t){io.prototype._setLatLngs.call(this,t),Mn(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return Mn(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var t=this._renderer._bounds,e=this.options.weight,n=new N(e,e);if(t=new A(t.min.subtract(n),t.max.add(n)),this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var o,i=0,r=this._rings.length;it.y!==o.y>t.y&&t.x<(o.x-n.x)*(t.y-n.y)/(o.y-n.y)+n.x&&(u=!u);return u||io.prototype._containsPoint.call(this,t,!0)}});function so(t,e){return new ao(t,e)}var lo=Vn.extend({initialize:function(t,e){d(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,n,o,i=v(t)?t:t.features;if(i){for(e=0,n=i.length;e0?o:[e.src]}else{v(this._url)||(this._url=[this._url]),!this.options.keepAspectRatio&&Object.prototype.hasOwnProperty.call(e.style,"objectFit")&&(e.style.objectFit="fill"),e.autoplay=!!this.options.autoplay,e.loop=!!this.options.loop,e.muted=!!this.options.muted;for(var a=0;ai?(e.height=i+"px",me(t,r)):_e(t,r),this._containerWidth=this._container.offsetWidth},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center),n=this._getAnchor();Ee(this._container,e.add(n))},_adjustPan:function(){if(this.options.autoPan){this._map._panAnim&&this._map._panAnim.stop();var t=this._map,e=parseInt(le(this._container,"marginBottom"),10)||0,n=this._container.offsetHeight+e,o=this._containerWidth,i=new N(this._containerLeft,-n-this._containerBottom);i._add(ke(this._container));var r=t.layerPointToContainerPoint(i),a=R(this.options.autoPanPadding),s=R(this.options.autoPanPaddingTopLeft||a),l=R(this.options.autoPanPaddingBottomRight||a),u=t.getSize(),c=0,f=0;r.x+o+l.x>u.x&&(c=r.x+o-u.x+l.x),r.x-c-s.x<0&&(c=r.x-s.x),r.y+n+l.y>u.y&&(f=r.y+n-u.y+l.y),r.y-f-s.y<0&&(f=r.y-s.y),(c||f)&&t.fire("autopanstart").panBy([c,f])}},_onCloseButtonClick:function(t){this._close(),We(t)},_getAnchor:function(){return R(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}}),Co=function(t,e){return new Lo(t,e)};tn.mergeOptions({closePopupOnClick:!0}),tn.include({openPopup:function(t,e,n){return t instanceof Lo||(t=new Lo(n).setContent(t)),e&&t.setLatLng(e),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),Un.include({bindPopup:function(t,e){return t instanceof Lo?(d(t,e),this._popup=t,t._source=this):(this._popup&&!e||(this._popup=new Lo(e,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t,e){return this._popup&&this._map&&(e=this._popup._prepareOpen(this,t,e),this._map.openPopup(this._popup,e)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var e=t.layer||t.target;this._popup&&this._map&&(We(t),e instanceof Jn?this.openPopup(t.layer||t.target,t.latlng):this._map.hasLayer(this._popup)&&this._popup._source===e?this.closePopup():this.openPopup(e,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var Oo=So.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){So.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&this._source.fire("tooltipopen",{tooltip:this},!0)},onRemove:function(t){So.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&this._source.fire("tooltipclose",{tooltip:this},!0)},getEvents:function(){var t=So.prototype.getEvents.call(this);return Et&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=ue("div",t)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var e,n,o=this._map,i=this._container,r=o.latLngToContainerPoint(o.getCenter()),a=o.layerPointToContainerPoint(t),s=this.options.direction,l=i.offsetWidth,u=i.offsetHeight,c=R(this.options.offset),f=this._getAnchor();"top"===s?(e=l/2,n=u):"bottom"===s?(e=l/2,n=0):"center"===s?(e=l/2,n=u/2):"right"===s?(e=0,n=u/2):"left"===s?(e=l,n=u/2):a.xthis.options.maxZoom||no&&this._retainParent(i,r,a,o))},_retainChildren:function(t,e,n,o){for(var i=2*t;i<2*t+2;i++)for(var r=2*e;r<2*e+2;r++){var a=new N(i,r);a.z=n+1;var s=this._tileCoordsToKey(a),l=this._tiles[s];l&&l.active?l.retain=!0:(l&&l.loaded&&(l.retain=!0),n+1this.options.maxZoom||void 0!==this.options.minZoom&&i1)this._setView(t,n);else{for(var f=i.min.y;f<=i.max.y;f++)for(var h=i.min.x;h<=i.max.x;h++){var d=new N(h,f);if(d.z=this._tileZoom,this._isValidTile(d)){var p=this._tiles[this._tileCoordsToKey(d)];p?p.current=!0:a.push(d)}}if(a.sort((function(t,e){return t.distanceTo(r)-e.distanceTo(r)})),0!==a.length){this._loading||(this._loading=!0,this.fire("loading"));var m=document.createDocumentFragment();for(h=0;hn.max.x)||!e.wrapLat&&(t.yn.max.y))return!1}if(!this.options.bounds)return!0;var o=this._tileCoordsToBounds(t);return D(this.options.bounds).overlaps(o)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var e=this._map,n=this.getTileSize(),o=t.scaleBy(n),i=o.add(n);return[e.unproject(o,t.z),e.unproject(i,t.z)]},_tileCoordsToBounds:function(t){var e=this._tileCoordsToNwSe(t),n=new B(e[0],e[1]);return this.options.noWrap||(n=this._map.wrapLatLngBounds(n)),n},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var e=t.split(":"),n=new N(+e[0],+e[1]);return n.z=+e[2],n},_removeTile:function(t){var e=this._tiles[t];e&&(ce(e.el),delete this._tiles[t],this.fire("tileunload",{tile:e.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){me(t,"leaflet-tile");var e=this.getTileSize();t.style.width=e.x+"px",t.style.height=e.y+"px",t.onselectstart=u,t.onmousemove=u,tt&&this.options.opacity<1&&ye(t,this.options.opacity),ot&&!it&&(t.style.WebkitBackfaceVisibility="hidden")},_addTile:function(t,e){var n=this._getTilePos(t),o=this._tileCoordsToKey(t),r=this.createTile(this._wrapCoords(t),i(this._tileReady,this,t));this._initTile(r),this.createTile.length<2&&P(i(this._tileReady,this,t,null,r)),Ee(r,n),this._tiles[o]={el:r,coords:t,current:!0},e.appendChild(r),this.fire("tileloadstart",{tile:r,coords:t})},_tileReady:function(t,e,n){e&&this.fire("tileerror",{error:e,tile:n,coords:t});var o=this._tileCoordsToKey(t);(n=this._tiles[o])&&(n.loaded=+new Date,this._map._fadeAnimated?(ye(n.el,0),T(this._fadeFrame),this._fadeFrame=P(this._updateOpacity,this)):(n.active=!0,this._pruneTiles()),e||(me(n.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:n.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),tt||!this._map._fadeAnimated?P(this._pruneTiles,this):setTimeout(i(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var e=new N(this._wrapX?l(t.x,this._wrapX):t.x,this._wrapY?l(t.y,this._wrapY):t.y);return e.z=t.z,e},_pxBoundsToTileRange:function(t){var e=this.getTileSize();return new A(t.min.unscaleBy(e).floor(),t.max.unscaleBy(e).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});function Ro(t){return new Io(t)}var Ao=Io.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,e){this._url=t,(e=d(this,e)).detectRetina&&Tt&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomReverse?(e.zoomOffset--,e.minZoom++):(e.zoomOffset++,e.maxZoom--),e.minZoom=Math.max(0,e.minZoom)),"string"===typeof e.subdomains&&(e.subdomains=e.subdomains.split("")),ot||this.on("tileunload",this._onTileRemove)},setUrl:function(t,e){return this._url===t&&void 0===e&&(e=!0),this._url=t,e||this.redraw(),this},createTile:function(t,e){var n=document.createElement("img");return Ne(n,"load",i(this._tileOnLoad,this,e,n)),Ne(n,"error",i(this._tileOnError,this,e,n)),(this.options.crossOrigin||""===this.options.crossOrigin)&&(n.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),n.alt="",n.setAttribute("role","presentation"),n.src=this.getTileUrl(t),n},getTileUrl:function(t){var e={r:Tt?"@2x":"",s:this._getSubdomain(t),x:t.x,y:t.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var o=this._globalTileRange.max.y-t.y;this.options.tms&&(e.y=o),e["-y"]=o}return _(this._url,n(e,this.options))},_tileOnLoad:function(t,e){tt?setTimeout(i(t,this,null,e),0):t(null,e)},_tileOnError:function(t,e,n){var o=this.options.errorTileUrl;o&&e.getAttribute("src")!==o&&(e.src=o),t(n,e)},_onTileRemove:function(t){t.tile.onload=null},_getZoomForUrl:function(){var t=this._tileZoom,e=this.options.maxZoom;return this.options.zoomReverse&&(t=e-t),t+this.options.zoomOffset},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_abortLoading:function(){var t,e;for(t in this._tiles)this._tiles[t].coords.z!==this._tileZoom&&((e=this._tiles[t].el).onload=u,e.onerror=u,e.complete||(e.src=y,ce(e),delete this._tiles[t]))},_removeTile:function(t){var e=this._tiles[t];if(e)return at||e.el.setAttribute("src",y),Io.prototype._removeTile.call(this,t)},_tileReady:function(t,e,n){if(this._map&&(!n||n.getAttribute("src")!==y))return Io.prototype._tileReady.call(this,t,e,n)}});function jo(t,e){return new Ao(t,e)}var Bo=Ao.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:!1,version:"1.1.1"},options:{crs:null,uppercase:!1},initialize:function(t,e){this._url=t;var o=n({},this.defaultWmsParams);for(var i in e)i in this.options||(o[i]=e[i]);var r=(e=d(this,e)).detectRetina&&Tt?2:1,a=this.getTileSize();o.width=a.x*r,o.height=a.y*r,this.wmsParams=o},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,Ao.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._tileCoordsToNwSe(t),n=this._crs,o=j(n.project(e[0]),n.project(e[1])),i=o.min,r=o.max,a=(this._wmsVersion>=1.3&&this._crs===Fn?[i.y,i.x,r.y,r.x]:[i.x,i.y,r.x,r.y]).join(","),s=Ao.prototype.getTileUrl.call(this,t);return s+p(this.wmsParams,s,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+a},setParams:function(t,e){return n(this.wmsParams,t),e||this.redraw(),this}});function Do(t,e){return new Bo(t,e)}Ao.WMS=Bo,jo.wms=Do;var Fo=Un.extend({options:{padding:.1,tolerance:0},initialize:function(t){d(this,t),a(this),this._layers=this._layers||{}},onAdd:function(){this._container||(this._initContainer(),this._zoomAnimated&&me(this._container,"leaflet-zoom-animated")),this.getPane().appendChild(this._container),this._update(),this.on("update",this._updatePaths,this)},onRemove:function(){this.off("update",this._updatePaths,this),this._destroyContainer()},getEvents:function(){var t={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};return this._zoomAnimated&&(t.zoomanim=this._onAnimZoom),t},_onAnimZoom:function(t){this._updateTransform(t.center,t.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(t,e){var n=this._map.getZoomScale(e,this._zoom),o=ke(this._container),i=this._map.getSize().multiplyBy(.5+this.options.padding),r=this._map.project(this._center,e),a=this._map.project(t,e).subtract(r),s=i.multiplyBy(-n).add(o).add(i).subtract(a);vt?xe(this._container,s,n):Ee(this._container,s)},_reset:function(){for(var t in this._update(),this._updateTransform(this._center,this._zoom),this._layers)this._layers[t]._reset()},_onZoomEnd:function(){for(var t in this._layers)this._layers[t]._project()},_updatePaths:function(){for(var t in this._layers)this._layers[t]._update()},_update:function(){var t=this.options.padding,e=this._map.getSize(),n=this._map.containerPointToLayerPoint(e.multiplyBy(-t)).round();this._bounds=new A(n,n.add(e.multiplyBy(1+2*t)).round()),this._center=this._map.getCenter(),this._zoom=this._map.getZoom()}}),Zo=Fo.extend({getEvents:function(){var t=Fo.prototype.getEvents.call(this);return t.viewprereset=this._onViewPreReset,t},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){Fo.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var t=this._container=document.createElement("canvas");Ne(t,"mousemove",this._onMouseMove,this),Ne(t,"click dblclick mousedown mouseup contextmenu",this._onClick,this),Ne(t,"mouseout",this._handleMouseOut,this),this._ctx=t.getContext("2d")},_destroyContainer:function(){T(this._redrawRequest),delete this._ctx,ce(this._container),Re(this._container),delete this._container},_updatePaths:function(){if(!this._postponeUpdatePaths){for(var t in this._redrawBounds=null,this._layers)this._layers[t]._update();this._redraw()}},_update:function(){if(!this._map._animatingZoom||!this._bounds){Fo.prototype._update.call(this);var t=this._bounds,e=this._container,n=t.getSize(),o=Tt?2:1;Ee(e,t.min),e.width=o*n.x,e.height=o*n.y,e.style.width=n.x+"px",e.style.height=n.y+"px",Tt&&this._ctx.scale(2,2),this._ctx.translate(-t.min.x,-t.min.y),this.fire("update")}},_reset:function(){Fo.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(t){this._updateDashArray(t),this._layers[a(t)]=t;var e=t._order={layer:t,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=e),this._drawLast=e,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(t){this._requestRedraw(t)},_removePath:function(t){var e=t._order,n=e.next,o=e.prev;n?n.prev=o:this._drawLast=o,o?o.next=n:this._drawFirst=n,delete t._order,delete this._layers[a(t)],this._requestRedraw(t)},_updatePath:function(t){this._extendRedrawBounds(t),t._project(),t._update(),this._requestRedraw(t)},_updateStyle:function(t){this._updateDashArray(t),this._requestRedraw(t)},_updateDashArray:function(t){if("string"===typeof t.options.dashArray){var e,n,o=t.options.dashArray.split(/[, ]+/),i=[];for(n=0;n')}}catch(t){return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),Wo={_initContainer:function(){this._container=ue("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(Fo.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var e=t._container=Ho("shape");me(e,"leaflet-vml-shape "+(this.options.className||"")),e.coordsize="1 1",t._path=Ho("path"),e.appendChild(t._path),this._updateStyle(t),this._layers[a(t)]=t},_addPath:function(t){var e=t._container;this._container.appendChild(e),t.options.interactive&&t.addInteractiveTarget(e)},_removePath:function(t){var e=t._container;ce(e),t.removeInteractiveTarget(e),delete this._layers[a(t)]},_updateStyle:function(t){var e=t._stroke,n=t._fill,o=t.options,i=t._container;i.stroked=!!o.stroke,i.filled=!!o.fill,o.stroke?(e||(e=t._stroke=Ho("stroke")),i.appendChild(e),e.weight=o.weight+"px",e.color=o.color,e.opacity=o.opacity,o.dashArray?e.dashStyle=v(o.dashArray)?o.dashArray.join(" "):o.dashArray.replace(/( *, *)/g," "):e.dashStyle="",e.endcap=o.lineCap.replace("butt","flat"),e.joinstyle=o.lineJoin):e&&(i.removeChild(e),t._stroke=null),o.fill?(n||(n=t._fill=Ho("fill")),i.appendChild(n),n.color=o.fillColor||o.color,n.opacity=o.fillOpacity):n&&(i.removeChild(n),t._fill=null)},_updateCircle:function(t){var e=t._point.round(),n=Math.round(t._radius),o=Math.round(t._radiusY||n);this._setPath(t,t._empty()?"M0 0":"AL "+e.x+","+e.y+" "+n+","+o+" 0,23592600")},_setPath:function(t,e){t._path.v=e},_bringToFront:function(t){he(t._container)},_bringToBack:function(t){de(t._container)}},Vo=Ot?Ho:Q,qo=Fo.extend({getEvents:function(){var t=Fo.prototype.getEvents.call(this);return t.zoomstart=this._onZoomStart,t},_initContainer:function(){this._container=Vo("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=Vo("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){ce(this._container),Re(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_onZoomStart:function(){this._update()},_update:function(){if(!this._map._animatingZoom||!this._bounds){Fo.prototype._update.call(this);var t=this._bounds,e=t.getSize(),n=this._container;this._svgSize&&this._svgSize.equals(e)||(this._svgSize=e,n.setAttribute("width",e.x),n.setAttribute("height",e.y)),Ee(n,t.min),n.setAttribute("viewBox",[t.min.x,t.min.y,e.x,e.y].join(" ")),this.fire("update")}},_initPath:function(t){var e=t._path=Vo("path");t.options.className&&me(e,t.options.className),t.options.interactive&&me(e,"leaflet-interactive"),this._updateStyle(t),this._layers[a(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){ce(t._path),t.removeInteractiveTarget(t._path),delete this._layers[a(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var e=t._path,n=t.options;e&&(n.stroke?(e.setAttribute("stroke",n.color),e.setAttribute("stroke-opacity",n.opacity),e.setAttribute("stroke-width",n.weight),e.setAttribute("stroke-linecap",n.lineCap),e.setAttribute("stroke-linejoin",n.lineJoin),n.dashArray?e.setAttribute("stroke-dasharray",n.dashArray):e.removeAttribute("stroke-dasharray"),n.dashOffset?e.setAttribute("stroke-dashoffset",n.dashOffset):e.removeAttribute("stroke-dashoffset")):e.setAttribute("stroke","none"),n.fill?(e.setAttribute("fill",n.fillColor||n.color),e.setAttribute("fill-opacity",n.fillOpacity),e.setAttribute("fill-rule",n.fillRule||"evenodd")):e.setAttribute("fill","none"))},_updatePoly:function(t,e){this._setPath(t,Y(t._parts,e))},_updateCircle:function(t){var e=t._point,n=Math.max(Math.round(t._radius),1),o="a"+n+","+(Math.max(Math.round(t._radiusY),1)||n)+" 0 1,0 ",i=t._empty()?"M0 0":"M"+(e.x-n)+","+e.y+o+2*n+",0 "+o+2*-n+",0 ";this._setPath(t,i)},_setPath:function(t,e){t._path.setAttribute("d",e)},_bringToFront:function(t){he(t._path)},_bringToBack:function(t){de(t._path)}});function Ko(t){return Ct||Ot?new qo(t):null}Ot&&qo.include(Wo),tn.include({getRenderer:function(t){var e=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer;return e||(e=this._renderer=this._createRenderer()),this.hasLayer(e)||this.addLayer(e),e},_getPaneRenderer:function(t){if("overlayPane"===t||void 0===t)return!1;var e=this._paneRenderers[t];return void 0===e&&(e=this._createRenderer({pane:t}),this._paneRenderers[t]=e),e},_createRenderer:function(t){return this.options.preferCanvas&&Uo(t)||Ko(t)}});var Go=ao.extend({initialize:function(t,e){ao.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=D(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});function $o(t,e){return new Go(t,e)}qo.create=Vo,qo.pointsToPath=Y,lo.geometryToLayer=uo,lo.coordsToLatLng=fo,lo.coordsToLatLngs=ho,lo.latLngToCoords=po,lo.latLngsToCoords=mo,lo.getFeature=_o,lo.asFeature=vo,tn.mergeOptions({boxZoom:!0});var Qo=dn.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){Ne(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Re(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){ce(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),Jt(),Te(),this._startPoint=this._map.mouseEventToContainerPoint(t),Ne(document,{contextmenu:We,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=ue("div","leaflet-zoom-box",this._container),me(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var e=new A(this._point,this._startPoint),n=e.getSize();Ee(this._box,e.min),this._box.style.width=n.x+"px",this._box.style.height=n.y+"px"},_finish:function(){this._moved&&(ce(this._box),_e(this._container,"leaflet-crosshair")),te(),Se(),Re(document,{contextmenu:We,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(i(this._resetState,this),0);var e=new B(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(e).fire("boxzoomend",{boxZoomBounds:e})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}});tn.addInitHook("addHandler","boxZoom",Qo),tn.mergeOptions({doubleClickZoom:!0});var Yo=dn.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,n=e.getZoom(),o=e.options.zoomDelta,i=t.originalEvent.shiftKey?n-o:n+o;"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}});tn.addInitHook("addHandler","doubleClickZoom",Yo),tn.mergeOptions({dragging:!0,inertia:!it,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var Xo=dn.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new yn(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))}me(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){_e(this._map._container,"leaflet-grab"),_e(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t=this._map;if(t._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var e=D(this._map.options.maxBounds);this._offsetLimit=j(this._map.latLngToContainerPoint(e.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(e.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else this._offsetLimit=null;t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){if(this._map.options.inertia){var e=this._lastTime=+new Date,n=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(n),this._times.push(e),this._prunePositions(e)}this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;this._positions.length>1&&t-this._times[0]>50;)this._positions.shift(),this._times.shift()},_onZoomEnd:function(){var t=this._map.getSize().divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(t,e){return t-(t-e)*this._viscosity},_onPreDragLimit:function(){if(this._viscosity&&this._offsetLimit){var t=this._draggable._newPos.subtract(this._draggable._startPos),e=this._offsetLimit;t.xe.max.x&&(t.x=this._viscousLimit(t.x,e.max.x)),t.y>e.max.y&&(t.y=this._viscousLimit(t.y,e.max.y)),this._draggable._newPos=this._draggable._startPos.add(t)}},_onPreDragWrap:function(){var t=this._worldWidth,e=Math.round(t/2),n=this._initialWorldOffset,o=this._draggable._newPos.x,i=(o-e+n)%t+e-n,r=(o+e+n)%t-e-n,a=Math.abs(i+n)0?r:-r))-e;this._delta=0,this._startTime=null,a&&("center"===t.options.scrollWheelZoom?t.setZoom(e+a):t.setZoomAround(this._lastMousePos,e+a))}});tn.addInitHook("addHandler","scrollWheelZoom",ti),tn.mergeOptions({tap:!0,tapTolerance:15});var ei=dn.extend({addHooks:function(){Ne(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){Re(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(He(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var e=t.touches[0],n=e.target;this._startPos=this._newPos=new N(e.clientX,e.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&me(n,"leaflet-active"),this._holdTimeout=setTimeout(i((function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",e))}),this),1e3),this._simulateEvent("mousedown",e),Ne(document,{touchmove:this._onMove,touchend:this._onUp},this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),Re(document,{touchmove:this._onMove,touchend:this._onUp},this),this._fireClick&&t&&t.changedTouches){var e=t.changedTouches[0],n=e.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&_e(n,"leaflet-active"),this._simulateEvent("mouseup",e),this._isTapValid()&&this._simulateEvent("click",e)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new N(e.clientX,e.clientY),this._simulateEvent("mousemove",e)},_simulateEvent:function(t,e){var n=document.createEvent("MouseEvents");n._simulated=!0,e.target._simulatedClick=!0,n.initMouseEvent(t,!0,!0,window,1,e.screenX,e.screenY,e.clientX,e.clientY,!1,!1,!1,!1,0,null),e.target.dispatchEvent(n)}});!Et||xt&&!ct||tn.addInitHook("addHandler","tap",ei),tn.mergeOptions({touchZoom:Et&&!it,bounceAtZoomLimits:!0});var ni=dn.extend({addHooks:function(){me(this._map._container,"leaflet-touch-zoom"),Ne(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){_e(this._map._container,"leaflet-touch-zoom"),Re(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var e=this._map;if(t.touches&&2===t.touches.length&&!e._animatingZoom&&!this._zooming){var n=e.mouseEventToContainerPoint(t.touches[0]),o=e.mouseEventToContainerPoint(t.touches[1]);this._centerPoint=e.getSize()._divideBy(2),this._startLatLng=e.containerPointToLatLng(this._centerPoint),"center"!==e.options.touchZoom&&(this._pinchStartLatLng=e.containerPointToLatLng(n.add(o)._divideBy(2))),this._startDist=n.distanceTo(o),this._startZoom=e.getZoom(),this._moved=!1,this._zooming=!0,e._stop(),Ne(document,"touchmove",this._onTouchMove,this),Ne(document,"touchend",this._onTouchEnd,this),He(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length&&this._zooming){var e=this._map,n=e.mouseEventToContainerPoint(t.touches[0]),o=e.mouseEventToContainerPoint(t.touches[1]),r=n.distanceTo(o)/this._startDist;if(this._zoom=e.getScaleZoom(r,this._startZoom),!e.options.bounceAtZoomLimits&&(this._zoome.getMaxZoom()&&r>1)&&(this._zoom=e._limitZoom(this._zoom)),"center"===e.options.touchZoom){if(this._center=this._startLatLng,1===r)return}else{var a=n._add(o)._divideBy(2)._subtract(this._centerPoint);if(1===r&&0===a.x&&0===a.y)return;this._center=e.unproject(e.project(this._pinchStartLatLng,this._zoom).subtract(a),this._zoom)}this._moved||(e._moveStart(!0,!1),this._moved=!0),T(this._animRequest);var s=i(e._move,e,this._center,this._zoom,{pinch:!0,round:!1});this._animRequest=P(s,this,!0),He(t)}},_onTouchEnd:function(){this._moved&&this._zooming?(this._zooming=!1,T(this._animRequest),Re(document,"touchmove",this._onTouchMove,this),Re(document,"touchend",this._onTouchEnd,this),this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom))):this._zooming=!1}});tn.addInitHook("addHandler","touchZoom",ni),tn.BoxZoom=Qo,tn.DoubleClickZoom=Yo,tn.Drag=Xo,tn.Keyboard=Jo,tn.ScrollWheelZoom=ti,tn.Tap=ei,tn.TouchZoom=ni,t.version=e,t.Control=nn,t.control=on,t.Browser=zt,t.Evented=z,t.Mixin=mn,t.Util=S,t.Class=C,t.Handler=dn,t.extend=n,t.bind=i,t.stamp=a,t.setOptions=d,t.DomEvent=Xe,t.DomUtil=ze,t.PosAnimation=Je,t.Draggable=yn,t.LineUtil=Nn,t.PolyUtil=Rn,t.Point=N,t.point=R,t.Bounds=A,t.bounds=j,t.Transformation=q,t.transformation=K,t.Projection=Bn,t.LatLng=F,t.latLng=Z,t.LatLngBounds=B,t.latLngBounds=D,t.CRS=U,t.GeoJSON=lo,t.geoJSON=yo,t.geoJson=bo,t.Layer=Un,t.LayerGroup=Hn,t.layerGroup=Wn,t.FeatureGroup=Vn,t.featureGroup=qn,t.ImageOverlay=wo,t.imageOverlay=xo,t.VideoOverlay=Eo,t.videoOverlay=ko,t.SVGOverlay=Po,t.svgOverlay=To,t.DivOverlay=So,t.Popup=Lo,t.popup=Co,t.Tooltip=Oo,t.tooltip=Mo,t.Icon=Kn,t.icon=Gn,t.DivIcon=zo,t.divIcon=No,t.Marker=Yn,t.marker=Xn,t.TileLayer=Ao,t.tileLayer=jo,t.GridLayer=Io,t.gridLayer=Ro,t.SVG=qo,t.svg=Ko,t.Renderer=Fo,t.Canvas=Zo,t.canvas=Uo,t.Path=Jn,t.CircleMarker=to,t.circleMarker=eo,t.Circle=no,t.circle=oo,t.Polyline=io,t.polyline=ro,t.Polygon=ao,t.polygon=so,t.Rectangle=Go,t.rectangle=$o,t.Map=tn,t.map=en;var oi=window.L;t.noConflict=function(){return window.L=oi,this},window.L=t}(e)},function(t,e,n){"use strict";var o=n(23),i=Object.prototype.toString;function r(t){return"[object Array]"===i.call(t)}function a(t){return"undefined"===typeof t}function s(t){return null!==t&&"object"===typeof t}function l(t){if("[object Object]"!==i.call(t))return!1;var e=Object.getPrototypeOf(t);return null===e||e===Object.prototype}function u(t){return"[object Function]"===i.call(t)}function c(t,e){if(null!==t&&"undefined"!==typeof t)if("object"!==typeof t&&(t=[t]),r(t))for(var n=0,o=t.length;n");return t}},function(t,e,n){t.exports=n(44)},function(t,e,n){"use strict";function o(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,o=new Array(e);n=0||(i[n]=t[n]);return i}(t,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(i[n]=t[n])}return i}n.d(e,"a",(function(){return o}))},function(t,e,n){"use strict";function o(t,e,n,o,i,r,a){try{var s=t[r](a),l=s.value}catch(u){return void n(u)}s.done?e(l):Promise.resolve(l).then(o,i)}function i(t){return function(){var e=this,n=arguments;return new Promise((function(i,r){var a=t.apply(e,n);function s(t){o(a,i,r,s,l,"next",t)}function l(t){o(a,i,r,s,l,"throw",t)}s(void 0)}))}}n.d(e,"a",(function(){return i}))},function(t,e,n){"use strict";(function(e){var o=n(4),i=n(61),r=n(25),a={"Content-Type":"application/x-www-form-urlencoded"};function s(t,e){!o.isUndefined(t)&&o.isUndefined(t["Content-Type"])&&(t["Content-Type"]=e)}var l={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:function(){var t;return("undefined"!==typeof XMLHttpRequest||"undefined"!==typeof e&&"[object process]"===Object.prototype.toString.call(e))&&(t=n(26)),t}(),transformRequest:[function(t,e){return i(e,"Accept"),i(e,"Content-Type"),o.isFormData(t)||o.isArrayBuffer(t)||o.isBuffer(t)||o.isStream(t)||o.isFile(t)||o.isBlob(t)?t:o.isArrayBufferView(t)?t.buffer:o.isURLSearchParams(t)?(s(e,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):o.isObject(t)||e&&"application/json"===e["Content-Type"]?(s(e,"application/json"),function(t,e,n){if(o.isString(t))try{return(e||JSON.parse)(t),o.trim(t)}catch(i){if("SyntaxError"!==i.name)throw i}return(n||JSON.stringify)(t)}(t)):t}],transformResponse:[function(t){var e=this.transitional||l.transitional,n=e&&e.silentJSONParsing,i=e&&e.forcedJSONParsing,a=!n&&"json"===this.responseType;if(a||i&&o.isString(t)&&t.length)try{return JSON.parse(t)}catch(s){if(a){if("SyntaxError"===s.name)throw r(s,this,"E_JSON_PARSE");throw s}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};o.forEach(["delete","get","head"],(function(t){l.headers[t]={}})),o.forEach(["post","put","patch"],(function(t){l.headers[t]=o.merge(a)})),t.exports=l}).call(this,n(16))},function(t,e,n){"use strict";function o(t){this.message=t}o.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},o.prototype.__CANCEL__=!0,t.exports=o},,function(t,e,n){"use strict";var o=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function a(t){if(null===t||void 0===t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}t.exports=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(e).map((function(t){return e[t]})).join(""))return!1;var o={};return"abcdefghijklmnopqrst".split("").forEach((function(t){o[t]=t})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},o)).join("")}catch(i){return!1}}()?Object.assign:function(t,e){for(var n,s,l=a(t),u=1;u1)for(var n=1;n=0||(i[n]=t[n]);return i}function c(t){return"number"===typeof t&&!isNaN(t)}function f(t){return"boolean"===typeof t}function h(t){return"string"===typeof t}function d(t){return"function"===typeof t}function p(t){return h(t)||d(t)?t:null}function m(t){return 0===t||t}var _=!("undefined"===typeof window||!window.document||!window.document.createElement);function v(t){return Object(o.isValidElement)(t)||h(t)||d(t)||c(t)}var g={TOP_LEFT:"top-left",TOP_RIGHT:"top-right",TOP_CENTER:"top-center",BOTTOM_LEFT:"bottom-left",BOTTOM_RIGHT:"bottom-right",BOTTOM_CENTER:"bottom-center"},y={INFO:"info",SUCCESS:"success",WARNING:"warning",ERROR:"error",DEFAULT:"default"};function b(t){var e=t.enter,n=t.exit,r=t.appendPosition,a=void 0!==r&&r,s=t.collapse,l=void 0===s||s,u=t.collapseDuration,c=void 0===u?300:u;return function(t){var r=t.children,s=t.position,u=t.preventExitTransition,f=t.done,h=t.nodeRef,d=t.isIn,p=a?e+"--"+s:e,m=a?n+"--"+s:n,_=Object(o.useRef)(),v=Object(o.useRef)(0);function g(t){if(t.target===h.current){var e=h.current;e.removeEventListener("animationend",g),0===v.current&&(e.className=_.current)}}function y(){var t=h.current;t.removeEventListener("animationend",y),l?function(t,e,n){void 0===n&&(n=300);var o=t.scrollHeight,i=t.style;requestAnimationFrame((function(){i.minHeight="initial",i.height=o+"px",i.transition="all "+n+"ms",requestAnimationFrame((function(){i.height="0",i.padding="0",i.margin="0",setTimeout(e,n)}))}))}(t,f,c):f()}return Object(o.useLayoutEffect)((function(){!function(){var t=h.current;_.current=t.className,t.className+=" "+p,t.addEventListener("animationend",g)}()}),[]),Object(o.useEffect)((function(){d||(u?y():function(){v.current=1;var t=h.current;t.className+=" "+m,t.addEventListener("animationend",y)}())}),[d]),i.a.createElement(i.a.Fragment,null,r)}}var w={list:new Map,emitQueue:new Map,on:function(t,e){return this.list.has(t)||this.list.set(t,[]),this.list.get(t).push(e),this},off:function(t,e){if(e){var n=this.list.get(t).filter((function(t){return t!==e}));return this.list.set(t,n),this}return this.list.delete(t),this},cancelEmit:function(t){var e=this.emitQueue.get(t);return e&&(e.forEach(clearTimeout),this.emitQueue.delete(t)),this},emit:function(t){for(var e=this,n=arguments.length,o=new Array(n>1?n-1:0),i=1;i0?M:z),hideProgressBar:f(b.hideProgressBar)?b.hideProgressBar:S.hideProgressBar,progress:b.progress,role:h(b.role)?b.role:S.role,deleteToast:function(){!function(t){delete _[t];var n=l.length;(s=m(t)?s-1:s-g.displayedToast)<0&&(s=0);if(n>0){var o=m(t)?1:g.props.limit;if(1===n||1===o)g.displayedToast++,T();else{var i=o>n?n:o;g.displayedToast=i;for(var r=0;r0&&s>S.limit&&O?l.push({toastContent:R,toastProps:N,staleId:y}):c(r)&&r>0?setTimeout((function(){L(R,N,y)}),r):L(R,N,y)}}function L(t,e,n){var o=e.toastId;n&&delete _[n],_[o]={content:t,props:e},r({type:0,toastId:o,staleId:n})}return Object(o.useEffect)((function(){return g.containerId=t.containerId,w.cancelEmit(3).on(0,S).on(1,(function(t){return a.current&&P(t)})).on(5,b).emit(2,g),function(){return w.emit(3,g)}}),[]),Object(o.useEffect)((function(){g.isToastActive=y,g.displayedToast=i.length,w.emit(4,i.length,t.containerId)}),[i]),Object(o.useEffect)((function(){g.props=t})),{getToastToRender:function(e){for(var n={},o=t.newestOnTop?Object.keys(_).reverse():Object.keys(_),i=0;i=1?t.targetTouches[0].clientX:t.clientX}function S(t){return t.targetTouches&&t.targetTouches.length>=1?t.targetTouches[0].clientY:t.clientY}function L(t){var e=Object(o.useState)(!0),n=e[0],i=e[1],r=Object(o.useState)(!1),a=r[0],s=r[1],l=Object(o.useRef)(null),u=x({start:0,x:0,y:0,delta:0,removalDistance:0,canCloseOnClick:!0,canDrag:!1,boundingRect:null}),c=x(t,!0),f=t.autoClose,h=t.pauseOnHover,p=t.closeToast,m=t.onClick,_=t.closeOnClick;function v(e){if(t.draggable){var n=l.current;u.canCloseOnClick=!0,u.canDrag=!0,u.boundingRect=n.getBoundingClientRect(),n.style.transition="",u.x=T(e.nativeEvent),u.y=S(e.nativeEvent),"x"===t.draggableDirection?(u.start=u.x,u.removalDistance=n.offsetWidth*(t.draggablePercent/100)):(u.start=u.y,u.removalDistance=n.offsetHeight*(t.draggablePercent/100))}}function g(){if(u.boundingRect){var e=u.boundingRect,n=e.top,o=e.bottom,i=e.left,r=e.right;t.pauseOnHover&&u.x>=i&&u.x<=r&&u.y>=n&&u.y<=o?b():y()}}function y(){i(!0)}function b(){i(!1)}function w(e){if(u.canDrag){e.preventDefault();var o=l.current;n&&b(),u.x=T(e),u.y=S(e),"x"===t.draggableDirection?u.delta=u.x-u.start:u.delta=u.y-u.start,u.start!==u.x&&(u.canCloseOnClick=!1),o.style.transform="translate"+t.draggableDirection+"("+u.delta+"px)",o.style.opacity=""+(1-Math.abs(u.delta/u.removalDistance))}}function E(){var e=l.current;if(u.canDrag){if(u.canDrag=!1,Math.abs(u.delta)>u.removalDistance)return s(!0),void t.closeToast();e.style.transition="transform 0.2s, opacity 0.2s",e.style.transform="translate"+t.draggableDirection+"(0)",e.style.opacity="1"}}Object(o.useEffect)((function(){return d(t.onOpen)&&t.onOpen(Object(o.isValidElement)(t.children)&&t.children.props),function(){d(c.onClose)&&c.onClose(Object(o.isValidElement)(c.children)&&c.children.props)}}),[]),Object(o.useEffect)((function(){return t.draggable&&(document.addEventListener("mousemove",w),document.addEventListener("mouseup",E),document.addEventListener("touchmove",w),document.addEventListener("touchend",E)),function(){t.draggable&&(document.removeEventListener("mousemove",w),document.removeEventListener("mouseup",E),document.removeEventListener("touchmove",w),document.removeEventListener("touchend",E))}}),[t.draggable]),Object(o.useEffect)((function(){return t.pauseOnFocusLoss&&function(){document.hasFocus()||b();window.addEventListener("focus",y),window.addEventListener("blur",b)}(),function(){t.pauseOnFocusLoss&&(window.removeEventListener("focus",y),window.removeEventListener("blur",b))}}),[t.pauseOnFocusLoss]);var k={onMouseDown:v,onTouchStart:v,onMouseUp:g,onTouchEnd:g};return f&&h&&(k.onMouseEnter=b,k.onMouseLeave=y),_&&(k.onClick=function(t){m&&m(t),u.canCloseOnClick&&p()}),{playToast:y,pauseToast:b,isRunning:n,preventExitTransition:a,toastRef:l,eventHandlers:k}}function C(t){var e=t.closeToast,n=t.theme,i=t.ariaLabel,r=void 0===i?"close":i;return Object(o.createElement)("button",{className:"Toastify__close-button Toastify__close-button--"+n,type:"button",onClick:function(t){t.stopPropagation(),e(t)},"aria-label":r},Object(o.createElement)("svg",{"aria-hidden":"true",viewBox:"0 0 14 16"},Object(o.createElement)("path",{fillRule:"evenodd",d:"M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"})))}function O(t){var e,n,i=t.delay,r=t.isRunning,s=t.closeToast,u=t.type,c=t.hide,f=t.className,h=t.style,p=t.controlledProgress,m=t.progress,_=t.rtl,v=t.isIn,g=t.theme,y=l({},h,{animationDuration:i+"ms",animationPlayState:r?"running":"paused",opacity:c?0:1});p&&(y.transform="scaleX("+m+")");var b=a("Toastify__progress-bar",p?"Toastify__progress-bar--controlled":"Toastify__progress-bar--animated","Toastify__progress-bar-theme--"+g,"Toastify__progress-bar--"+u,((e={})["Toastify__progress-bar--rtl"]=_,e)),w=d(f)?f({rtl:_,type:u,defaultClassName:b}):a(b,f),x=((n={})[p&&m>=1?"onTransitionEnd":"onAnimationEnd"]=p&&m<1?null:function(){v&&s()},n);return Object(o.createElement)("div",Object.assign({role:"progressbar","aria-hidden":c?"true":"false","aria-label":"notification timer",className:w,style:y},x))}O.defaultProps={type:y.DEFAULT,hide:!1};var M=["theme","type"],z=function(t){var e=t.theme,n=t.type,o=u(t,M);return i.a.createElement("svg",Object.assign({viewBox:"0 0 24 24",width:"100%",height:"100%",fill:"colored"===e?"currentColor":"var(--toastify-icon-color-"+n+")"},o))};var N={info:function(t){return i.a.createElement(z,Object.assign({},t),i.a.createElement("path",{d:"M12 0a12 12 0 1012 12A12.013 12.013 0 0012 0zm.25 5a1.5 1.5 0 11-1.5 1.5 1.5 1.5 0 011.5-1.5zm2.25 13.5h-4a1 1 0 010-2h.75a.25.25 0 00.25-.25v-4.5a.25.25 0 00-.25-.25h-.75a1 1 0 010-2h1a2 2 0 012 2v4.75a.25.25 0 00.25.25h.75a1 1 0 110 2z"}))},warning:function(t){return i.a.createElement(z,Object.assign({},t),i.a.createElement("path",{d:"M23.32 17.191L15.438 2.184C14.728.833 13.416 0 11.996 0c-1.42 0-2.733.833-3.443 2.184L.533 17.448a4.744 4.744 0 000 4.368C1.243 23.167 2.555 24 3.975 24h16.05C22.22 24 24 22.044 24 19.632c0-.904-.251-1.746-.68-2.44zm-9.622 1.46c0 1.033-.724 1.823-1.698 1.823s-1.698-.79-1.698-1.822v-.043c0-1.028.724-1.822 1.698-1.822s1.698.79 1.698 1.822v.043zm.039-12.285l-.84 8.06c-.057.581-.408.943-.897.943-.49 0-.84-.367-.896-.942l-.84-8.065c-.057-.624.25-1.095.779-1.095h1.91c.528.005.84.476.784 1.1z"}))},success:function(t){return i.a.createElement(z,Object.assign({},t),i.a.createElement("path",{d:"M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z"}))},error:function(t){return i.a.createElement(z,Object.assign({},t),i.a.createElement("path",{d:"M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"}))},spinner:function(){return i.a.createElement("div",{className:"Toastify__spinner"})}},I=function(t){var e,n,i=L(t),r=i.isRunning,s=i.preventExitTransition,l=i.toastRef,u=i.eventHandlers,c=t.closeButton,f=t.children,p=t.autoClose,m=t.onClick,_=t.type,v=t.hideProgressBar,g=t.closeToast,y=t.transition,b=t.position,w=t.className,x=t.style,E=t.bodyClassName,k=t.bodyStyle,P=t.progressClassName,T=t.progressStyle,S=t.updateId,C=t.role,M=t.progress,z=t.rtl,I=t.toastId,R=t.deleteToast,A=t.isIn,j=t.isLoading,B=t.icon,D=t.theme,F=a("Toastify__toast","Toastify__toast-theme--"+D,"Toastify__toast--"+_,((e={})["Toastify__toast--rtl"]=z,e)),Z=d(w)?w({rtl:z,position:b,type:_,defaultClassName:F}):a(F,w),U=!!M,H=N[_],W={theme:D,type:_},V=H&&H(W);return!1===B?V=void 0:d(B)?V=B(W):Object(o.isValidElement)(B)?V=Object(o.cloneElement)(B,W):h(B)?V=B:j&&(V=N.spinner()),Object(o.createElement)(y,{isIn:A,done:R,position:b,preventExitTransition:s,nodeRef:l},Object(o.createElement)("div",Object.assign({id:I,onClick:m,className:Z},u,{style:x,ref:l}),Object(o.createElement)("div",Object.assign({},A&&{role:C},{className:d(E)?E({type:_}):a("Toastify__toast-body",E),style:k}),V&&Object(o.createElement)("div",{className:a("Toastify__toast-icon",(n={},n["Toastify--animate-icon Toastify__zoom-enter"]=!j,n))},V),Object(o.createElement)("div",null,f)),function(t){if(t){var e={closeToast:g,type:_,theme:D};return d(t)?t(e):Object(o.isValidElement)(t)?Object(o.cloneElement)(t,e):void 0}}(c),(p||U)&&Object(o.createElement)(O,Object.assign({},S&&!U?{key:"pb-"+S}:{},{rtl:z,theme:D,delay:p,isRunning:r,isIn:A,closeToast:g,hide:v,type:_,style:T,className:P,controlledProgress:U,progress:M}))))},R=b({enter:"Toastify--animate Toastify__bounce-enter",exit:"Toastify--animate Toastify__bounce-exit",appendPosition:!0}),A=function(t){var e=P(t),n=e.getToastToRender,i=e.containerRef,r=e.isToastActive,s=t.className,u=t.style,c=t.rtl,f=t.containerId;function h(t){var e,n=a("Toastify__toast-container","Toastify__toast-container--"+t,((e={})["Toastify__toast-container--rtl"]=c,e));return d(s)?s({position:t,rtl:c,defaultClassName:n}):a(n,p(s))}return Object(o.createElement)("div",{ref:i,className:"Toastify",id:f},n((function(t,e){var n=0===e.length?l({},u,{pointerEvents:"none"}):l({},u);return Object(o.createElement)("div",{className:h(t),style:n,key:"container-"+t},e.map((function(t){var e=t.content,n=t.props;return Object(o.createElement)(I,Object.assign({},n,{isIn:r(n.toastId),key:"toast-"+n.key,closeButton:!0===n.closeButton?C:n.closeButton}),e)})))})))};A.defaultProps={position:g.TOP_RIGHT,transition:R,rtl:!1,autoClose:5e3,hideProgressBar:!1,closeButton:C,pauseOnHover:!0,pauseOnFocusLoss:!0,closeOnClick:!0,newestOnTop:!1,draggable:!0,draggablePercent:80,draggableDirection:"x",role:"alert",theme:"light"};var j,B,D,F=new Map,Z=[],U=!1;function H(){return Math.random().toString(36).substr(2,9)}function W(t){return t&&(h(t.toastId)||c(t.toastId))?t.toastId:H()}function V(t,e){return F.size>0?w.emit(0,t,e):(Z.push({content:t,options:e}),U&&_&&(U=!1,B=document.createElement("div"),document.body.appendChild(B),Object(s.render)(Object(o.createElement)(A,Object.assign({},D)),B))),e.toastId}function q(t,e){return l({},e,{type:e&&e.type||t,toastId:W(e)})}var K=function(t){return function(e,n){return V(e,q(t,n))}},G=function(t,e){return V(t,q(y.DEFAULT,e))};G.loading=function(t,e){return V(t,q(y.DEFAULT,l({isLoading:!0,autoClose:!1,closeOnClick:!1,closeButton:!1,draggable:!1},e)))},G.promise=function(t,e,n){var o,i=e.pending,r=e.error,a=e.success;i&&(o=h(i)?G.loading(i,n):G.loading(i.render,l({},n,i)));var s={isLoading:null,autoClose:null,closeOnClick:null,closeButton:null,draggable:null},u=function(t,e,i){var r=l({type:t},s,n,{data:i}),a=h(e)?{render:e}:e;return o?G.update(o,l({},r,a)):G(a.render,l({},r,a)),i},c=d(t)?t():t;return c.then((function(t){return a&&u("success",a,t)})).catch((function(t){return r&&u("error",r,t)})),c},G.success=K(y.SUCCESS),G.info=K(y.INFO),G.error=K(y.ERROR),G.warning=K(y.WARNING),G.warn=G.warning,G.dark=function(t,e){return V(t,q(y.DEFAULT,l({theme:"dark"},e)))},G.dismiss=function(t){return w.emit(1,t)},G.clearWaitingQueue=function(t){return void 0===t&&(t={}),w.emit(5,t)},G.isActive=function(t){var e=!1;return F.forEach((function(n){n.isToastActive&&n.isToastActive(t)&&(e=!0)})),e},G.update=function(t,e){void 0===e&&(e={}),setTimeout((function(){var n=function(t,e){var n=e.containerId,o=F.get(n||j);return o?o.getToast(t):null}(t,e);if(n){var o=n.props,i=n.content,r=l({},o,e,{toastId:e.toastId||t,updateId:H()});r.toastId!==t&&(r.staleId=t);var a=r.render||i;delete r.render,V(a,r)}}),0)},G.done=function(t){G.update(t,{progress:1})},G.onChange=function(t){return d(t)&&w.on(4,t),function(){d(t)&&w.off(4,t)}},G.configure=function(t){void 0===t&&(t={}),U=!0,D=t},G.POSITION=g,G.TYPE=y,w.on(2,(function(t){j=t.containerId||t,F.set(j,t),Z.forEach((function(t){w.emit(0,t.content,t.options)})),Z=[]})).on(3,(function(t){F.delete(t.containerId||t),0===F.size&&w.off(0).off(1).off(5),_&&B&&document.body.removeChild(B)}))},function(t,e,n){t.exports=n(46)()},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function t(e){var n=[].slice.call(e.querySelectorAll("*"),0).reduce((function(e,n){return e.concat(n.shadowRoot?t(n.shadowRoot):[n])}),[]);return n.filter(a)};var o=/input|select|textarea|button|object/;function i(t){var e=t.offsetWidth<=0&&t.offsetHeight<=0;if(e&&!t.innerHTML)return!0;try{var n=window.getComputedStyle(t);return e?"visible"!==n.getPropertyValue("overflow")||t.scrollWidth<=0&&t.scrollHeight<=0:"none"==n.getPropertyValue("display")}catch(o){return console.warn("Failed to inspect element style"),!1}}function r(t,e){var n=t.nodeName.toLowerCase();return(o.test(n)&&!t.disabled||"a"===n&&t.href||e)&&function(t){for(var e=t,n=t.getRootNode&&t.getRootNode();e&&e!==document.body;){if(n&&e===n&&(e=n.host.parentNode),i(e))return!1;e=e.parentNode}return!0}(t)}function a(t){var e=t.getAttribute("tabindex");null===e&&(e=void 0);var n=isNaN(e);return(n||e>=0)&&r(t,!n)}t.exports=e.default},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.resetState=function(){s&&(s.removeAttribute?s.removeAttribute("aria-hidden"):null!=s.length?s.forEach((function(t){return t.removeAttribute("aria-hidden")})):document.querySelectorAll(s).forEach((function(t){return t.removeAttribute("aria-hidden")})));s=null},e.log=function(){0},e.assertNodeList=l,e.setElement=function(t){var e=t;if("string"===typeof e&&a.canUseDOM){var n=document.querySelectorAll(e);l(n,e),e=n}return s=e||s},e.validateElement=u,e.hide=function(t){var e=!0,n=!1,o=void 0;try{for(var i,r=u(t)[Symbol.iterator]();!(e=(i=r.next()).done);e=!0){i.value.setAttribute("aria-hidden","true")}}catch(a){n=!0,o=a}finally{try{!e&&r.return&&r.return()}finally{if(n)throw o}}},e.show=function(t){var e=!0,n=!1,o=void 0;try{for(var i,r=u(t)[Symbol.iterator]();!(e=(i=r.next()).done);e=!0){i.value.removeAttribute("aria-hidden")}}catch(a){n=!0,o=a}finally{try{!e&&r.return&&r.return()}finally{if(n)throw o}}},e.documentNotReadyOrSSRTesting=function(){s=null};var o,i=n(51),r=(o=i)&&o.__esModule?o:{default:o},a=n(17);var s=null;function l(t,e){if(!t||!t.length)throw new Error("react-modal: No elements were found for selector "+e+".")}function u(t){var e=t||s;return e?Array.isArray(e)||e instanceof HTMLCollection||e instanceof NodeList?e:[e]:((0,r.default)(!1,["react-modal: App element is not defined.","Please use `Modal.setAppElement(el)` or set `appElement={el}`.","This is needed so screen readers don't see main content","when modal is opened. It is not recommended, but you can opt-out","by setting `ariaHideApp={false}`."].join(" ")),[])}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.log=function(){console.log("portalOpenInstances ----------"),console.log(i.openInstances.length),i.openInstances.forEach((function(t){return console.log(t)})),console.log("end portalOpenInstances ----------")},e.resetState=function(){i=new o};var o=function t(){var e=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.register=function(t){-1===e.openInstances.indexOf(t)&&(e.openInstances.push(t),e.emit("register"))},this.deregister=function(t){var n=e.openInstances.indexOf(t);-1!==n&&(e.openInstances.splice(n,1),e.emit("deregister"))},this.subscribe=function(t){e.subscribers.push(t)},this.emit=function(t){e.subscribers.forEach((function(n){return n(t,e.openInstances.slice())}))},this.openInstances=[],this.subscribers=[]},i=new o;e.default=i},function(t,e,n){"use strict";t.exports=function(t,e){return function(){for(var n=new Array(arguments.length),o=0;o

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%0AO%vd^OR2T~l{NnRm>(P@OrFH7$ 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 <+e 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%0AO%vd^OR2T~l{NnRm>(P@OrFH7$ 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 <+e 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.1e59d2330b4c6deb84b3.ttf b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.1e59d2330b4c6deb84b3.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 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 z 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%0AO%vd^OR2T~l{NnRm>(P@OrFH7$ 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 <+e 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 eM8DX!?f(xu>JuIT%Tbo@9rj-S@ zSVa|Vl?Xq2G;;3UlC44F3p?_(I`m2}URBDl=Fs}FTO zl{|@4cHVDJ?^$+PJBG0+;cU>i(;IVoqZt%Hu;KfSc{N{;Z`3)pJd>9#?7m{>ULj?n z+dB2zF9($cEXvW`EW0^JbG>(tN6pk5TuYs~ZR>qv(lZl0le``+Inr}v$@0HH!yaus zBHa00DD?j20|M(9s#Vr`pJ5HSeo{rxQ^zA_+K*!r2W0=A-7j|HgO4`u8s$ z&G@dWX0-14sv~P2SI_s%kvi4)WjDi9nZC-1RQuGJH;?uT?~7whl4ZWaWU0o)0EQ0t z(-@!gu75v$$E?H8?*^V_oxSz~xBvNPA7<{7l^0xK`nl~o{}YvlxUIW0G*&-TIgs1Q ze~0Ok;jGJr-hHWd+gc650eeKlA^th4yZ6Q~&fQ?HUD-Dt*-}pZLGV{4k=7So2 z>-+8U?Ylx8{Ll1gd}isLmvpXbT4ChO<#}Iy9<~+DG@KKsS-=fT3n$u=6ppL#`nX+R zd!gGY_WGs0VK?<3M!o&CcQ(fbso<=o>CE@7<%+LuuCrS=gV*QmiZ1pvW=2K^AZ*Z4 zIJ9R^2gA+a{L2qtGjc|{H+=aMb~ZQa81w&YwVt;QNhqjRbx(5_yptxc)xUlA$4G{~ zHm}!ly}0;V_XaRdTp7&cJnnEsFzmhaS~YWlwSDO4>yF%v^J-$BYunZTcJ^fc`uW?} zy1MTwek-1BF0Z|7@TfQI-69xr^VPx1eYlG75mjhnuRK5bn1W{c5(xs7*? zn@U!FSC;%xYL}OIe8QFHResAtb2G17r^YoGY&mNSwOKp{~?%LU4 z$Id9gAfRBE6TOAUdRp(%8-aWMnH#ksshCW1%j5M7%nSj)Cdd^{>DB-i1`M9AelF{r G5}E*xP_<@k+p{8s} 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 T%&DGb)_)Q%Cxl(e+`8vCVfDh< literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lang/ru.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lang/ru.png new file mode 100644 index 0000000000000000000000000000000000000000..61c27f9cf4866fe28e6f63d368abd51d7d45cc6a GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X_ISEDhE&{obIXv6$xwjxf{XZV+lIXf&r5AqZZ#L&R@BYv zD&5+9F#C_W0sD#OGbxjIH*_8xmFbs@EmHmaD!t@BFPp?Tn@{DWH2^ z8GNaz-^}Ru+}rFxZdL1j_BWeOH|W6>aM*E9%QZW2V^ex#m95;O`N!J+?n=pTJpaEj vLL8=sfkD86Z~D%b`YBsj5n?RI{2Le&aUSrmr>#I zj4kWxA|h%azA!K`bAv^}U?a0NGBFdujdrsIF)>gCVHo&xJeHUDb7G&UgOvxHU6IL@>z1V!($2Pyh-*0Vn_kpa2xW zzz*|tORZCYc=LnXTH{<@yw2zBjf?3<^M8MfJRF2a6PI53&EACo_fy7ju@wSS0V*2> z()p2c01cFMsX(IhTh!RT9Lv2jJxFyt+C6PvQ$QqOs91P~DTGwkt+^tQg%V1thWJ|mRJY}*AIuPs z#pt{+UJ+l1fb;h3Ba7L`q{@72>pab)q2c)?-#5Zqi$W}o0^AQg%{djOFt+Ra8PjVS z_B@ffh`SnA_lT69-J0DJl7 z6EOTc4XK6_XBvY1BQSM6_6g9~c{TXF!TW}&niWSfq_1*(x>^Z2Bq}igXGBg9%M37b zGKCrCNqQTtaCC`n^iNtrIj0X8@BbwJvnEH=;;n>J85uQBrzH$v|;L6go*PpvJZx}e~Hz3pJnfry@gj&8Ji=!P))b1fc8U! zH_YhSxS8)4DgX98i?@F#J_oqOww%6P&hWV*>9;b-E7cu2qA>}cZwD_X8wANu5@LP1 z(w1RfAz42GkdVk4hxla#n7k6>1!e37>|(V) z`B@ONryoC^VEkN+Hf#LrlNEft5TkyeFldR^*~Ne3*9>czOh;J?ll6Hi_Xi86CAYD0 z&Ca{OX!t|xW8GBK*`r-G^ zz3I)0u$aEdq<1&*C(>6%mnee(0Ab%RlLl?J$4>Tks6UC;$bZ02F`%Pyh-*0Vsfh8}5-SMMnOo1PB76-gZ`n(HltyNF>rod+#rj++a2={Sd+dVPkz7W z`8^+Rucx{qJuNQ{f}nI)rQNIV`y+p9ioTu`+OFwauIBJ-2jxaB$SMG`@NxryT_W2A zyny99+U7tR1Z~+R`23pReSqO)(a1(H#*i4$*$`A#9tyBrE70Hu&?HD^WMyI+fd$@- z9HQKqJ75FNLS?4{4t7@ixXxCN=8^Je;Ia^-I}m}!!Xfdnq%t8h67|dI=ZG0a;3!0E zH6ss1`Q0AaCMy7@jFf@H2pl%iMx3HdCSos4V0bZ#;V4cTaGEJDW-ttneTW`S;TsvR z-5HCe-^@s}rUe)j4F-e8AZe79CKRV>8pQ~dAPhRfpms%WjTkD5k-Va4Rr7*}GB!l3zK#Guy+D=Q z6;AI*V?ms(*Y44QB0yaYW0$#h5lEWLZbo#Akr#NzL^^P5iQR%bO9>ozSS^-f!fK-| zgrl^Cpsc1i*CnYMD{&ys6&`ZwM{*gP0$5E}e6oBv-aSvVtjTJ#9Dr@MXt&_PLxRN1 zL3MYeyfL*v5ncwoQ;|hDS|3K(Km%zf2#3>#lcWvT^;>9)Bua4-qe+6ItQ3vJxcmmW z$GF6%TvQi>Mw*8xz z#ueK@@?_$k(lOSeKl_zGCqYrJfC1W7mD!;Y1wmt2m?!8Z+BzuNtv-6wy>*N(**~0h3zaJmV zOz2FQ=7-6gXD+-#SIOn*<_$e!(2k3y#>&q9W&KPLaZ_UnrC&MWiz$L%W= zJiaUZ%ZDkaA3MrJ+}-&zd$uq5Pu_eM{a%;$cu{Ws zMA+F?k=634*+9QNeu}%ldd^p~_(4r~d6m<+Sy7|*BcobQJ){kFtPb2gbunUcIjZd! Ito7ah0b!-k#sB~S literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/list-blue.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/list-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..91838fdcf20036e7f39c96d58ad37825e22957a7 GIT binary patch literal 1164 zcmaJ=TSyd97#@u*ExS-bMbR`;blbVDgU#fw>CUPPj>)>DQHbNrQ74-@Rv8d0NCBWcj2Ro{p9OdF#KqO{DjRjmUcvIVpmR)`w8K0uL%9-{niGVQ5`GQIvs^L5ats#?aH3RPEU_#({!uuZqqj292MpNuBJKR?V>pNt@oeAZlc=;OdPnd%h7P-T8sQpwiI!I zilCE#a9gH|b?p#Aw;kGKB$BQgxuU_abeMEkrZI{l#Vi-8mIh*Sh{7ziVdzp&=J{x4 zgbM~E9LGh=MIp$q<$|mj0rJ^z`-#Av!u7%BtWw02=Z|)z>&RpRM@{bdvi;aol2Ns@q2aopf+nb;8v-lp9 z%M;$S4^OWY-eG4Ex8^@w+Sg1h@6DfoD!(~5uW#zr>eRuxN2e9cnz7=`qt#a~)@}Ll z<=~kUZpoWtU2|rppVr??&Fa)h_}JkW%joy&ld53~-u32n)2V^QyTa)CSz`9_d(n^U z`bYayyFW*t`;_jB%B@-^Qt!G zd`!JB8s0dxr+Cr+Ktsi=Yk4P{Msx0Oy&0W7H04~*H)2Z*fthpR`@aAC|MQrHy=PsQ~QB+~HR)~?g#{TBaBL53&`x`P9;cxiz}Np6K0G{R<8573`)-=Tr31n3~&>3BxtnFil1{nx$4bXo~CB%9V zLM8+rr^g|)E)IBoPR`@;dR>*k#d1{)%Q2kW!TI>ADxPJ*2@Nsnc;jsAH%vBm&-vA4y#kgQp%xQrC9|5TC%AcSVcOp6{SYhfde#g z`X>d=n3C14$ug0GF)7JlI45hTlm&|7|Dl>Tg|=`E{`EVpuodq#AQOWY>M&(;aZROm zD1#4~P{PQJBh;3yVtot3$ZA0b2!%3L1LZqZT|r4}b%rB~d{novq{}cW1Zbk-R8@tK zc!FUc8;Q8xA(rF9!Qh5)DCl(wYusymZkN}c_t*tgeZ$p|wq$v_4BY)WKUiJ%G4EFGt&1m~(ggzri_>d` zeWge5UhBSpBv8CkUH(WM_?{1ngxV;VaeHr`pbw$bLXIGB-g?Z1$SB_PjKC^D( z+sOF#MWC_d=D@x(X!V@h|9qKR@Tz@u>xZ2;W{!C)Wv=?i;>3(}#lt%fzUze*;PsE) zm51M*-470*k&WYv79{)q?+^CQJ2z6^dvoE$u;=Z!O(kC%o(z?DPf(tklJxw++2`{n vsJ#c)*Ax!Uj{9c~6&D}LpT;DW?ipXQi#k~pd)z$VZmaGh{z!>;b%n$3J# literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/list-purple.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/list-purple.png new file mode 100644 index 0000000000000000000000000000000000000000..34f4b3b00ef2e56201a3dcca4a76f9bebbd43d38 GIT binary patch literal 1166 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nAI{vB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc$WX!DQqR!T z)ZE-iN5ROz&_v(BP~Xs4*U-|+#Kg+LKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvP;hnz$CiRdcxGNoetEGbD0rc+O)bhSOHFYr%Fk5*hmTbz7B{$= zI=WgKxVae{I~#!9@95;}>}YP}VrFb+X>4R}tOV7Yg2nG(y@mz`IQ8lS9itD5T%^c` z2?0|OhzU=+Kn^_dr{)1ud=W5duYLF>8kjBqdAc};RNQ)V(~#?sfe1r@a^507xdXy4 zd~Md6Z&d%lz;`vYqyB|}k%h)Gulw!&Z2?7O&(x9zB`B%e!Bnw literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/load-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/load-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1cbf7fa5661e3aef2daa25952afdd48b2d9ce5 GIT binary patch literal 2014 zcma)7`#Teg8{cNt&@#4=Ew{-fJL#L;mdoZ&M>d>JDpp1db6v@C$t1V=lFM`v%FyPx zM}6I=<`Qy?!eJ?6$}N{Nn#))J!FiwO^M0Ps`@HY-{_y$XlT0{g2bEHi0ssI|2YYLm zJ*NKxWdC00nP2VMBgtTUcNzeIIr|I1Vzc`tdqW`2#m*8?(TDoFC%_cE6CMDlz9+qP zbsqq5faYM0cMAtD<`F~34Pgli%=Z)#n0Sr#ET~#$-~tw(1s^uSPs2w|V)Nh{CU`#F zKJd_$*>b0Mk~9gkFiggmJ4JFM$v_yQJzltb%{1iqq|7=C`8Ka=4ba}Ve^K-shyara ztRn1(9dkOeC_-fKzhkku+W+bN5Hm(thUrlflJic!CL1&`bbuPXeOG%k zyT#y!hf9m2e)o5z!H#j^Z)AUPt6B7eu-oD1>hlR>ym8f;vtgE-KiXf0Cw$pgrN)~~ zNR*0j8k_Q2uuQrL__=6h7dc*}Ut7L)r=y^Jb?w-#nM#Z9N10{)FfHPD8A&Wva2Yy0g#5@-*m*fa@htaZ#k* zUNngr*KMI}P=z94(8BXsQXi>JI;>8s)Q&l1F7A+!%ClUBvLd!VAF;t9Km!U^f>jYm znU;T~X*z~duy)JrXpSfs%=qkhG-_1qbCLoM*I#*%YuY%*L&l_iT~3b={{7}%SgaQ8 zH^BBfn`|gd7DS-gPn0vBNdSW;+&{DBH{z{bB!T24{OKfxpuO#3)`){EO%P)Yu-CAl24aod3?Ok)6IiV&dCtGCv+8GtiTt z)hJ>YRmQQ;w@>W&YuBT$y*2i{8=82N3?+3bz>jA+QkTVxNvj|)Q@SXXG#2L~6(K{8 zdd?>W%M^!vp|Y^M#f6Ww^;F+Tc%ws=CjTogKk|e@p3oeIBVLD0%IsZ+nzptt!^ikB z-39N(h|oX_!KB7095KWz+U;8Lr0txr$OKr2)72CEP1Z}{QrKGo0=U64INo1xM73@V)TIw&U6z1{%Ipk!IhxQ^uDU(g(^FOF z)crGT8W3@7x9=~D`pa|Ww2Jl(T}!i9Z$qL8Le(270GX;_kI~w`-qD;?F6$-aZxp!m z%I^34x6@3ok8SAsF>q&0{|v$% z9cl*D>VKcVv5P#l!%$KmDESf0`bO-uR|KJKFFku%=mQxW-&iwvQDXh6A$h*Btx@vT z#f+0s)aW6s6}NdtXH)4(VPxNVAEdKv-G`0cn|T!6Q8>RNJ!qg?AKj@}d#Pis*`|tO z@gUb{vN4GS2()^iHa`Nx&z@+~nc7FdRE$<1F$^bmo(0#3I<2*#@qiLR9XYvBTV~c%0=)~qGhAO7TL(RC*!1#$ zz8+^ftD)AAR^3QVO+A8qW>tn`3HG=aVj;t^SyOMoZ@F08Z_tGiiG*B~UbZhjHyl#9 z9eM1Q^BH8vddfg$BdcqInR84nNtQmFAhnhp6LcCe`r#0&IvP2X_SB0~BiMeyS$+Qc zyhOC2TUF%Z4`&^i_#eCk@1dWX`I*PQn>k>$3hRRhqBR%h`1|GE(g(Q@v$4$ce_ptj z`ZT2=q!>-H0;+R}U6^p1|Km22#@}U2D`k(>iQBIIN(tI>eNs0ICHQuRxel_Q`kMt_}^V5x_F-`1I6^>yS(2jl-AF^v6u!>A9-G zEN)Bg+l9-g97^Xq8tDE(^#)Jfr-e#EXD-4jG2 z-W2HYanNR5taAQ=MG$xr_L?Cg5ibBtgRqSWHs>;E8GeUI#9RcErwvMHIW~mS|Cg(5 zNzzIku+8jz0J>-i`$}YNA>tX}1dlI$rR`dqUQ7uiS_oBY&lNHQ#38S039+I`HUm06 zCtzYZ4{v*M4>80tpekdpYu&D>`3T(RO-8Mf&~7>aXJbzU-LM{W$-MH4{>iz@w zpiNVj(yOVn;cW%5m_QPo0<~(5%8|re^)`GKJ;9h`2q74Nu=J(Fs~-^Kwq8Xh5aLA? zLb0Tix~5JgcG hMNt$*Q4~c{lzZ5P<-q_)h6Dfr002ovPDHLkV1nTRMF;=@ literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lock-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lock-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..3f835e7d9cf5de76ab44f9e05ab7f0b37a253c69 GIT binary patch literal 774 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�`Q1L5xn3=PN29a-X^r;I|C@;50PChVir{ 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 VW?MV6Xo>&;002ovPDHLkV1hr3ooWC8 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/minus-red.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/minus-red.png new file mode 100644 index 0000000000000000000000000000000000000000..6686a98ccecbcd9f9c84a29796db3d20020ba23d GIT binary patch literal 1595 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⋙!^83_e-CJJ`oRPF~dD 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

wF7DI|Kx|V1sBQ9FYs>m5C)C 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 BJ$(QG literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css new file mode 100644 index 0000000000..2270c09d01 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(MaterialIcons-Regular.woff2) format('woff2'), + url(MaterialIcons-Regular.woff) format('woff'), + url(MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..780de6d66c1664caf60348cb4ef6a2cdec9eeff2 GIT binary patch literal 29700 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%0Dw-qHHSKZKL}#_NX?L%i&vk0~KDoH*f7~ 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 E0$VFRIRF3v literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..72a32ab2c209f238afa10adcd38e13e7584d1294 GIT binary patch literal 19940 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 P0ssI2pez7L`~(01d$TWj literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff new file mode 100644 index 0000000000000000000000000000000000000000..20ec4ab2d7429a9428d9086278817ae2b1f05f7f GIT binary patch literal 30876 zcmZr#V{oQTuzh1E8{4+6jcwbuoosBI@5Z(^-q^OevF+S^x9a}8Q*~;pyH9u5bUiau zPmhO!xHtd=@I5?p07%~x2$AQ1(*HNa#Z~3LdB47Gc>lo_ay(i>R7@NI(Ejr+vwedD z+zV1qLQz2l0MOF}0C33x0BJ1!#<4;P6*b{+-Z=mOY6Sp5tjvWKtthB4vV138`1bqe z0}M-Tx=Bpzj2r;~NXu_tG5`QpV+Bl2w=i<~)@j#$bD;mj*B1cH!q&?i06^dZ0K{Mb zfNEJ=dXfiAGb7XQc;9&e9RC3{^Z3m2TluX^_?Ah(K?cnUxnODM>iHd?3IG5X_zsu$ z_qUX)t%J!o5BmLE$NLS%QMh|hJ0s8UydX{AeuUp30(An&*c;iI0RYOP-}2#Wfq0s-2 zqik_)xMK(ap&&8`7lwp{VgiBy5aj_q|7$mQHec)iJNEZ)Q+RoFU|>F!Fzc2XlkxN5 zFK`SdrgINN#gVWZIGX4vY%FXv|3;>+H^L#JVddd#nZQ7&23p0q8;%)SNJt1sa{yx@ z^8RBfqEri02mm0hS0@+wP2{~5EZcl%{)ZgKGvGz&lnwZ+bS>Po}T=m847TMAGsizx4zU?bdsu`dob3?6!NqE;45aae$ev9 zZpRJz*APEL%ZYy0LIO*D;c<##PDjh9+`g8D;|gF1gRR*hacI@LYV))zy`Kg|R9)_9 zYo!DYJ{mueQ}`a+?g45Br+zaj)0_`3g?tz`HmR30ZyMcT)rtN0D!2lI%>pAz3Nmbz z%B{x_&ChTA_g+hE?Zp+1oX24Tv9#UQi*=F{?B)x3hXF-7YA+=O%@hP>3l+8LU#=(! ze%%u&tc$l_l}l~4?32u~4!T#`F3r|c#>?#I0eyb00vN*vcLrDccN#8bqz&_L>UY;T zZpFS}TAuibDn2m31#YYwjAg1{JtVh-qGDkVA0_AD6-&Vu&H)a8{WE`IcK{#lvBT_I zs6q|Jq<5D)@hQunk{9l*j5U&&Rnq*-gS*BLZPkRR8+j&dYt1}yP z*nKwS4kJfrI453nZ0mu4ns?~E2Db)U;F3aPaud4hP$}{wIlJdEuo<0uq&xD;G{>iRkEU|I8P)g8pW}w$JsF7M?p+06 z!=HyJl|}a|%qfe}o~h5&JgmI%ZzR1UW?30TKFvOaS`xVJOs6o~&NiK8z6CTltm8j=?1A?l4SeiFzl!)(zH=SxPD5BN2DCmiYSsc>{yW#2 zlTK9Pl(2>Zo>Us5QKa;b{1S?7kcR_C((*>$Ypcm+lsTx@);N(+O=r(JmR#>;5Ai5Ab zYW%5`?Z0RJm;|tnz%%Qa|G~CkU`c=UzUg0fYKq%~=j?pvz1@U|2ryw-+oS&dq)hoZe$}Ib`s!H$mJYv3{OYoU1#rF#E`U z)p+1`FW_I4uiL*EeYE5qi>n))-+4Lox){ButLxS_sESuFSF^QiZPC)Hj#bY~wUcWs zs2cHL{HVbBx)4MZEKFU-{!~VZDM`LT5;rMD>Ryu(%$g5MYbs#3vy|a|w^D!tg)Sl$ zaxGx(btMj|;eps}dfIH}wU_mtN!AaU%@(*XCfpUB0fNAr{s@jVg%*i4#_Erx2t$rB zMJvSa*UZh=9AXWOlr?5ii6G4bFJXy2Axjcvp)N`i=V8qlr87_N#XDq)f8hy)(-JN5 z|6+(*k)wtxKPZ|Sx0-U!bJ5*F(fBi=R^yawZLcUo-}-0N?$S9toNos?-VCCRjyT#@ zYYZ6Zaa$~bzdd&JMZE(4F7s@_@iu_3Fv zL3{f^Wds=};pb?|V1sPhILhc=9^QVWs7wvo2#yx*@V}5M(?Ysb+tK`A{O3h6C}XR` z{*TTP{aI?gPV$O_5>hFyOVSNRk~G<-VMS7NjJjjPQQzMreV?DG4IBV)?RV8w?U!d= z-Mq9mC2y0vq`khnYGJW%rBiBG&7Mhlci^35%CekFwoEp9N0uy`L@U)GXzoltdLT`q zkVH0`OeU2?7Ju~eL4^kUEC@CzBcr(uBttVQG+5k81AY zG4g9b=9nTdQ)qNK*L$RX1NjZ`{Rxo)z>5H={H1UN^;P|eo){GxB`nsqmkZ{snnNrf z);QR<1F9RrJ22_k`sZzf_L4S!SmiFMlX(l{D&P+3Pd# z7x53cA3~A|D0FZf;KM;4#0pfXr=d!_f0!uwP)9|Xm9$gPFCqyBrJYoBFpdU%_Gn?` zj8lFjg^-bJCA}wg1~XwnS@bHS7fLI!YqIO8Re4v5SB#$4E)JfC5Sbo?`*hd&9d6g_pX{y&hG18R?jyQG(&OA>4vX}}%Ro;p> ziYBY7@)g%w@dai#@m!5xN9jJ?Lwg0VHWm6j#9ZQFe1 zz0gO@=kL_HQ@f8PZA(8PMY5;~qDo0@FI$x+@^$s~F*_jS0+aa)$3`pdy2(XAGhwqJ zcCq+G2GbM{XAJqiNO)cU0`irlN0o7Rn08l5&pHWigC4?**eqyz&h z&orN?Jx?S2kP2gshpP`M{H=MMwX3|ln~z)GKtDR*Lio#&ANO|sRS*CM-H0d$T#77$ ztzPn-C`zkZ)-=;6I}?)TYo;RoZXGuV8cOS|4+BB5Vnx_V19p47>h zMDG=yK9GjbdxK%&V$4g1sD(GaYC+HUoeOtiyt4QJjTUt>-OXV}4Kb!p z#oN^R$PY~)Tl>Yz`lPQXrO|TYbM^Ig^`-x_!FH1WXd;u9)nbYRew>XN{*}``M~T@w ztX=}QP^pQ(9VYkCARqxBSY~!~r*(_~xh9t_c-lm4#Taj@ z>T#;EhI8>K?*88I(DN@F2M%uXB=kB5mp^<9W0$mf)G7oMHuTYwxwC$MyHC(EeVplh zzDN(&-ohj6LcSxbbAjTPg?n_|$|Flr9xXZFHu+~-`JY!OH8U!RBpX{cHti?1vTA+GGTYODt$ZV;?U!!QJQ0v%e>;s*Mf8J z;UI{(ZbW;@b*1jkI%XS!Prqg7XTOV~LA%HEroEVr!-CMu)ejvv^zpG<`WtTSmO=81 zjy_JidDg$xQKNSi`{#|aT!j|0vH~VhmsZsFF^rnH#?p-d1a}?V-#w(L4T6^P(vyRX zMO#}-oiIKAM_;9p{lT{PM7T+&lQQ8NwjDltsGZL*-2oY7IdMR~=}V|JBDAldhwizniFFepSf#IiZkIoX)9Jcy%(Q#&42-=tZN0v1s*#_e zJkP`B{Ci1%>aLQDo=+`cFZnal6f@h*JNfdaPQQ|+YYyzGC@rZPbgee=?`FLjwJnNU zpmZ)#WsN~jOIH-ePsAXh)|A}QI6N>V@J2n(h3GkEhn7^-i7K4w{zv4xZU!xj&2Nvu*8Vu_*9!NX@$Im{oKQ9$-A9Kbar_r@_r|J zhyBtl!5iuTeP+&{s3%d$3R|?gXpvSAmFQ3w6W1;j?y;P%kcuaEXnnYh7^{HvPb56v z2weNbFMf_S@G~4~^E18R+l4BrMct|aHzoebJ3*ZqdA7j6#LCwW+r_&9XCuYZ6j*Oa z8VH$zhZh4Qgbi~yeJtu3Qg{C4E-ARM)E3asD6n{gfMZIp34P45$u zRf@}RB48__aRa`_c5%0P%w?H;6;slFFP`YN><#g_zkgf@Z{pT;baEDM8jCu;cNy^n zZyEyE_o!-0Sjr$oqeGlR9&na`4?Oo_VFn&3_=Yx6I+QggHrNSFlru>nCgotZK} zY=n^JyU=Sfo_qcs;|;HyjPQD|Y@U^vj4`*_qT$L8vuWa=voX#UbdWxeaHWLA`54;& z`pkp!r`Xq1&dSF@*RzeL38oSxhxDzZ_1=Gv!`J$Uu9a0iI@&haHkvsqrL|tp^207? zxuu)CR$x4(=AUZ|e72c#oBzqGla{tPw1MQFcpW%We67y= z_=h!@saRe{GfA5p*)1{M$nwC$W>TO2NKOp?9H{s?SUzZarXhk(CJ_W6ls|V3vW^9pq?U53L7=Kt;^FC{&Iwc6E)9*oLTcGZZXa@Vn z+Qf+zk7xozybaO6(E->N>t&?bp;{fimgLUCYp>&5({8VKuQoDq_DW-5apnGta5Y+8 zISN$CDH{K|EqT4#lgJbP;vjq_9$k2+6J4<#(aT|Rne2!nafgJXIi#ovL_Dd8^PokatsZpnLMfGUwF0Xdp zen^|lv#f&h(tDZPmU7!>W_ea0Sgj=%vH(=u|yqIC13gfjD zy`I-r=9y2*xca&^+0&X5Q*a9bLrb#6q#nm{c*cr(}1_LO0FM3Hm{`26X508og^hTi~LYJqua;6}cQ`@3U*LVGr zaCr5n@f3qp*1BR^BgDntldeI};mFnk7!`8AF8m+C0v>oOd!nji2Tr|qf=Pj?r+yQ! zV|Jq{kXRuKn&lY=kln9DYP>EcroGpS(wkh9cRBu8gML!DnP6XB9ysL>rtP1HYX`uP z<{z~nyPjFAMjFC+udRtlSK?}vaSxvd_Mh(}lH*_4vA^e*4UP!+k)nNjE%avg`>%cf zPS-2kF{Z|(z294N`u1NP0fo$tcRaRd-9Xk1#E%rPSd7(Hp>Zx4x}mD)y!}m;$vo@7j3<) zX!#j`k782D%;>{{mB+}hY~@&9VSQPEhT!)wb;fp?;VyY7an=)u7}8@u{%nT9=6O0V z<8_8^cYbr3Hqz|L?u6{>GptTz7Q%!-mWhi;cSXgtWOgD7f1WT|&eoOC%{^~4amAN} zTFroZMa=~B9CaE?1*EEEnI0GS#_9FO9h&)^(NtKklI(1Keip?Z{=h)J2apD zrrsP4aG?p9&FPZ{<;6Cf2I&NE!DrmvGs2|B&C%9&m50B?9UXVL2AdQZzY_;xiTXiA zD$Du`X&I(vz9dr_wAJ|WyAreI(T>Mm<;!t?FGzZL?88Xcy%miueN8v7 z`ziU3cE;k-HTBL6tX;S0crDS7fP#%}OWw*jT_Gisjw->h&>>J9(G{6HRg;u?k2QKR zFMLjThFW62J$ATeYo(boMG*IZrqcV`OijsUuy`CV{h^w-t(KRZyXO|d#h-y-7#@H( z(H*Oy)v#P4ay=S1;Zurl&ZbVWYAB;yMVbhQz+cR-#;@F^(ZQ*joYT-vlFPqbD?e*? z)c#_l)Wh3KPs)pQY)T|BLB5ir)bY1Urae!FU}=q^lCZbsS_Cd?~| z)LNla9xH|F3c-_KU;(+dU|*X)9(;xbtDG!X`u9`o?+0hKA{q?*6avA@$9RLULbu(C ze&>y-W_unLCQRbke>9$bD?Mf=rH5z?hV1Z_HJ0^Nm%2)Ngm?7RKlsReD?k_uJY?JG z>7%JJ=kK)!ABd6l;n9bnu201}Klg)Y7uM6fW0AsgvUhp;`g|J!d<8CCV8?hKlZ~lO zyO`|ZMgrsD4YY2dOs6=#a4k-;->(X_-jpTQ9mtu<(RlkQj-{V-5beaMN4}Z67K*B zMRC3_9&gJ2p@>)TcHF$?k^4x)O52Bijt-NDR>HJtbg}y<@egma$58nscBK7N)nc_&OYUWV_-43l4mrY(k&igPHxw{A z#x$@QC1OtqwFLhaiLT{rtek7Lfkr4twk=vrYs^vox9}L8AxsCjVIn_rW*zM91oP+1 zlnsMc)Dc(br|25D(Ix!P4rsc5f`|TtjWeEkEuUfJPleoO4-etHS|#`|gs5K;7>r8Y|3j$CbUmiH0l|7EW9gt#OWnx!Nw}fpv zN+>PW8oz3;S&jj9kcOlzjuV$?O`Jc#l2L&OqmVzrg{pc=+!Tz!CR!p!7E|-V-DBh|6*R)?7Y$O8g%_1aJdEl2a zl9SDtVn$s2%mx9^-^uttRh71Wr`G#;Hrzayh-c-5wv!#}x!EoD@$-kyX@{qhz)W&m z><$7;PNVUH`BSp&C=~@;3U77+JEODC!Ti`}?kGB|&9J4xYA-|!{qeoDXHU;@5459x zAUxEa&E1`iQamZrSD4N}Oy1i;b+7T8)))BZeU+}96)97D%F@j!15uf;6O>EUq1vW+ z9dUXE%Yfn@r4CPYrPXcM^$mw4&Z?%y7z|TJje8#_&)`tE*Sq}o{B4A`ummvtJuQFE zSqFGq`ufp+X+wrFlj`S{!Bc!|XABqZ_bHPguhfd4$JWViAQ~Bv4lRdsOD%Kuv998G zFAu4IVl-t$h3$3CtH}92H6q&%J0FuCQmL`~Mq@vX^irRp+L!;V(A_i5ltLneAU`04 zU(crsata1q;veMd@o;i#yaS1|1ae$C4<6Hu>4J(cO)p9K>NE6$XI5q6saUSo(^dcxm26N7TCFDhe z9z#92X2&`E+Q}HhJ@UIenab{9uMkxyjYd_n>U@boCrCwtEBH>U&4MBwC)0B(H7Y$X z*#7-TxV`eYF+k_ORRlkN!$XIonYP~L4cUYk1#gPj(ObtT))U!T)zl!9o-Nad6$Uy` zR55>q)ATrXZ2HiArFCya4Dt!(O47Y(0ZQ2vO?4OEHJ~jWg90p!z}?_^UBs$U7Ezy= zGi0S$_zLU7RS|2uBKsGYPf7ZH2dbUe)63Y;M9H65iCbHwnP!=pX2%Hc^-tXI+^Bic z#!0KH9FUKtlBbiXPltw@w2H0%KLgTuWwu^4t!rD(*N?)!99-wSkllW#{?a%)qpc8D z&1`pw97;XY)J$*YiTd(cX*RcaXIW24FwnGNtZZ>#i_h32F}~K1!BHZ;#stdnsSNMq zH%Js{s?PE_7^&;YHZaWoz%9&HtEavVX3{|5(U?G`Y!_aL=G-tD)B`DC6;jEwHQoYw4_Au@Kt~u7>o<** zhG3IGt$;X#=^TN*bS=vftx^)?>3tx;=V?DYR+JcT&lBghpmsHD+`oh~s4!;qjogA> zoojbYm+u$+)b65h{Bn@{#Nj(JSf zg5NhzeS67?E<{vQt)4Va_O5tI4nRHHQAj!WI3j;JkGex#eek4YohRJ$-A97CyTZ(ig!&4S)a?}sLW;khJ9nB1VuQ?1 z;Lmsj(Yx0RZ8Lw|h(Jev!l%v{L^XIFsBW?d4)ALn{byalH5|81bFU<3C@8k{tR+kH z0EnnV8+?%G7H!fO@`TuV|L7K$eGPIO!;Hks{y99AC7i|GBM+Hyr5q~oHqIB2So-GJ z@X)DKOwKoCMEji8s=& zLC<3yJbt!Zs0j1j5I2$#UOmvT0@g?CUyi1Pcs{xar?2-N7%o3zeRC_8JYIZ&<@2H7 zB{ILUU#|rCn=k%#`niMibSiAo{IJghJ%_cj_fHJI?k2!=r5_L&&6)XYde~ENTB-aV z1X&JZ9t?sk>DY>Z3$H$8jOax=21)X>Qx^;kVBt+0MEBs8=v7LwROl%B%*xXl!emyE zb|2A#o7$}66oORPPhWJWe_>B_0nV7dusyrmF(99`^e4P1;JCD}^XM40%AiL)yw&>w zBJb%EIu`0B_y@(Oi4ui*>T1*!QKn09~aeTV-3JM749y6{#A?eGkdpF{GkbPmvE zIn1aS<+X*Q?IXxLBuc(#9 zY}-t7o^DuV0nW?KWQ(2(32}X;w5upgGzGyOH&O2R92W}OuHh>&Kv?VB_1KpyyvGP? z_>`Lp`-hUkZ07Rv%t=9GIO4eYThix#>2D6yF@U*j_ zdAX2N`I)jI*QOT8zR`SiFbo0V)8P($=OWCsiJHk;$*#0Mf1hm6w!)*~h2bNaLm$yO z9#{)Z8ot(U*rD=4*e16bkJ-t-xmOR0$4E-0Ap+%oKcL=$(+(wx${s{#_<=z)#w0+X zE1CsrJMqiS{m78p_dVC52IsYg|8&%=0VPJn5OJO4Xo_TOyHkb&uvRw}Bt9;>uK2HU~ z%XU1pRd%;~-S0iSQ1zVg#tQ2QU?M@v`(fPi<6)Ot=_3sG8f_C4=2IFuABynN??C@~vUxn@CHz{I`Hwt48RSrTr^PbJef;B7_K7Ask4$aM|q183ada_TZnZ6yR6IUe)KHQRi zr=faJOq`;JqR>l{jPMH~6nom_{uRb3&r?Z7QQPaBSzNnwWPz^U7&&ddiZ?;=xl%7@ zu0UJj^TB?n-EO!23j`)M;*{0pk2PpjNvu7=VVccy_io>$ZnGv-XRKbHB8 z+*q7zf_wM+bmk=#;q><3YbExHt#yBBQ1PwsADSjA#cjM0S^KVs`lvrpWj7)XXo*N! zqCSZy&{3DFe2>P^Hj*dN7y#BUqPx5wREEq**kcOp4_*7LIFB8qRg=cGZ;d7e@t?+C zyuOgV7en>tr&i&9;J8v9T1~ls`9WDkXIQOVtOSRg{Gdiz5AcG3xBTHd!|cwJ2*H}C zjkP7of6kVL(k4Z3>)I*8x>YiV+HsFyS{N8!KmH}!ROLRLl(*WRcDye6+lj8V$K;*S z$8pP?o|{#lH^OA<9fG;|NOR>Ckl4*j~IiM9^K{(yXy(Tae-s#hF_52A}~#y z8{hjwc~l9|l{uCO>MB)oz{OJ9x68`{d%W}<6D_F!@*CW1mjcI}==?-LxrR+x$5i<$ z`Z>rKw9L>!%DmY&hAlqE+N27grK@%tDY&aBZzeBq2Ja<7e~C-e*g(@bgM15?hlp-G z4hl55O;lHKr}9fo9dL}vwQbp)yJ{NTm=X3DFH^7-mR|FGi2NZZwO*B~cHy@?JmkLE zbgx(IL(6dJ-?E8T*hAQ?@`W77NOZSNbdEKq1o;$P*S$k%36L2bSpS@b6mT4sM<((% zf{HkuXN5Qq#1(cYGV*{1yfV{ND9{KGuM1}?=Y&Z21wKJU_tpH4xr~w3#6eda)0l|l zOz{*qCJt%VoQVsKh#)YWn;tBKu6iBYBMJFKz)Yb)u)L4YSH>dc#BZ-~Y$#&V8-cYP zoF-Kt4Dp`M#-jW?a!nb%NlJRR+IdomWI;wPC6R75(?iDHp>V1!Ny}`$uJ-Cke`#g2 z3$y#a!3U1#5c^~Ul&NHnX4)vjm&ol__9_f;1T$(LYr(N)azWNL8i%gcM*gzRL5Hi~ z(rd_k4b?Syo;seU<_y^%%HPllr=);{SqRO~RLWPDgOR8SMxX}n>HsklxjNcPF~6EF zB`efvxSJj`dH+nWfE^hhn~9HHKAAh8QT1RNUqm@D0P!$g(a7sUp3QYnom-_h>bW@V zl&G&*8WnSXZ5XKn6_K8*xW>YY{wC%kZJ1;1$3lCcMSf6Jo1o>4EpYp0n%;RB`6RZT z;Dvov`Y@*U;Qotw4^u2Ub<<8DvB_CG8FXGcos-pm3GXxb@XNGl&pLHm@}1Sdl5}NLGT6xeoDi#OyR)oH~tZK zv25bWL6IdGIbUe>5RZY#S8$L6C@}K~)oVGz9cK|OaqHZK=*a*I8ry7m_*oSrl2U*JwT0^y?{g6FoxWX9+CotK;%|Dh%fREw0B8*tvZjz_=l^vfgsR= z@;0AcWW$HdBe!mGWa?sXwt>SqSs z4C8uWXjl4ye9`WRa-)Fg1(;$T-Ak!*ktwB2-Trb6m8se>dzvbUhEdw<&Y*x_R^L%& z0bHVjg}l#;?`n^XKLekF2ww{!u{+l_(|a!H926E*dz3rvxZr3n88fQ5!oUF9XvRs< zOA*~qWeT_RTcqbw^9svu=o8Eq;j!~sRvElR+xhvU_z3sY@+3(^r@JuHSIaK%(ZS&c)BpcFEdNpJS`Grp|yG!u9J`U+{x zbzU+K|=4kMZMLXyobO|?AGJQUO(jc?)J`r$8jL}Eg#F?73p|0$tu>W9BHG3 zF+=PvsgIhCEZkdFW$SplEl0gZRJ~Woz@OuR3@n3a!Z;^vjR?GCsP7Am>u8^aq~N^#~ToV?wZ+sv<8jdVAC_WH2SKiD&;e51E|8v|8d zvOxYg{EL!M4PR#7$b^fR+TVaZD~(c@xfW$Hdbbuj35w$_!V@M50I!XD%=$wG;0c8~ zif5Z+tX5?H+j%vGQ@a*L-XPmF~lgS?;qZaF5! z)MC>vo_5AjT_e=n4U>r3tw~s)kvkcFu|j0d+VIC5v?J^o!+YBPY8`?jk^$PUyX*Ja zc!z%|n&s9%bkX>ThhsW{lXS^C_-ljb0|Vv79pPX;kmPF~y|T&QHx*OAOO5PrVG-Qe zXoS^^^NnRkwB#|JIob7BvsbuxQ+r?dZZy0axG1}^lAQ&GFb>*))(V#v!;+mDZ;@Nv z?h~Xgz+`SrandcdBH;muzm75Lkw3u9hM@+%+^MS;`*ce#z7VTx*Et)IFm~WN6L_S( zNEULTQE3&xRoo5#yc1d;Y(E=9G$YAZFFMfeCZVF=lq01=mml~_9?r2UuufD^K()c$1~{X=(8iSUZtE^;*biQ zN4J8U_=whWZ(Q~^{`zSu5Q3o1p&EY*Lj8fJa6|7S#Tdm|to9PQ5g9C8Qn}&O0uaMi zv{%5Ib*;Ort*-}@9T9A8h$5MCS&+r`5F-WfqP2GTk|Ay7k{)-RR#vzPIdcl4aY{zxZSC zT%E7{4%dSy=g<9N^3y{Bw;vWKN*Ue;V^;HBm;uU%|8tFX{I8 z(S4Ck?7TwuOzHQRjugx-lEy=WkW{z9ysCf;5<}>xF8$uE2fNIeMuLK@)7XO2;2|J! zkoG1k0fVR$%Ys8Gz`YU;DuG2U1!S<0O;{ny6Rq>n#AFYf%Mz}97{bD^kdJ!SWJ-u- z!B)reh+-p_SKUQ_DHpB>g*VF}s-wY;pZQLbKV{IAoJk#zQNpBw539?#-jr(6m`Q!U zy~_>GeYg9fs(PI+(~lxAwcTHm4!XgY`|>D>eBs@teCA`7EiZC`C5Sl&McgsUT3j;~ zMst=bo(deK0w*7lI_wCi0csGsTMsA=NennpyRwF?J7e=)W>rM?ldI~v2j;)zm0RZh zF_m4giA(IF4!e{SSj247tjfDB!EPxuc$uZ!cUfCtgR4pZWlD%<7Y;%dpy0rf4|yhQnTqfa`Por)HyEgKozg0G-dRZ<@fNx*G8`*vo)&ct zbCS;H(-+D|K~OKXpq&fjZ@qvWAU4lb6k$yAREgwIT2LI8Uyvg&B$sfNfR8_BN(>|A z>EtVPo&nhj@Z^vzi%;Gwj~6*BDGNPd?XowU8%nT%D7_w+P0Wr|sRnkX_9yg7eB8pu(*a;8&;tlC!C zbD3&OX=2%6?br{OMcWn8?MzH$P>*LGY=h!cwfkPk&+p6VRi~*jO094U(0K5bd9b z)Fg`iqILLDfdwW}$TdykmOSOi)=J0mNne|_rj|k`QIwZ<$MT`4`SQWsa`#;p1+<~c z1w{;+JmqkZ?U72vQ}X%J8N*4n2u~L!rVG=PbuYskN!~?dml1d6k~CBnTcJ|3Ak?@s zl|RdOxJ<14n6ZG+Sx!WiOca0bsM*}hQ`&db9Aza<5{~Z0##~;(!}BPsYb6V0(pD+Y zGxNAKVpSvQgcf{?gG@_Br3VbvIkY1(Z)bjl-g%MH`1Vhj9b7B;95G6Zz8umeX;&6} z%&XX?hOoS<>yqnh)}K}+v`U_q2yKttDgSGtagMsF$a`e2pN>Xf=*CHQ+=iPLA9sr0 zyzQU<3R{a7Lvi;x6^C{0lr!?8`6I=hr{9E!sY_47o*w<{;5{N~-W20J%b%=^I;KNX zC6tI0DcAP_8I1TBBst{$zGts}xd>cUvgSYK+k zb6P+vF~i$thdrLm829}$tnjWE#qTK+;boMNm}b=IJvRHd!f3#3ZN=K3tEwlzC7v*^ zG6*xvR1j=>(%nGm3_jA>i-;!QpFf4D^gdyWic}mnFo`*r4|fzIsjz zJLZ9okwyrTji&Q`31>c8gDmt{9v<3MoRvdNj3b|Vioz!rvQzwH&F`|hW5wrr%4{}0 zU8hG-nbx7Mp;s6DcWY}$NZ?kr4~%Bq^X_7|>< z?ydGF8HPBu_)YQWPF(RMt39C5M=BO#`Va$w@s|n^Rp3EvCYW=kfycdUY1squhQ4Gq zq~aiioc%EpF<(iUru?Af@8e_K~?q{#{$o--@WvhHms)&C>>|E5rS|{<+X1`EUD#7W6k#U{h@gEgayy z?XQ9s4!{yR)j6-Uq?fT0$_*4@y;Sz1mz$+lHg!wnvDwwQpU9oIYa_16^G^?0f;$A? za=+6e`$eWe?h13nrnDey2l`|CYKg!En7MscFdxb14Voq=$wwv1n>y)Zg~+*vPnL@2 zuZI#-QIjy^Pf)w;LAVjascL4U)UmzWx_ zljS>FZ`-W0m6Ta6%&>}oqLvdXB)Kr}15+bgUc*2}=jgTiN*(yP>r@K`N${cbiv8ie zpOiVhgT>kB*Gj~#FNiz_|3Vg=W|&BqH`Y`M3GR8%2RB#VE|e^)mC=s;VIv*WEV%*i~(-p=|tHRQDJ@ygPAJ=1gv=ZY&GeJj0~@f<>*V6#5YD$k?b^8xoe zp@S00jD;5D0YN1NQ2jSbf3vOf>IH>pu=%x>8D-@Y9U3w?-L{HjeIxG6my42SWv)Gy z&ZCF3UyZI7%&z30(V)#vK4454kNC8~D0`&xvt^43YTwX8W=i0;-*l_~&Uue8VM@ic zcak(<61=Z?EUWkYa&*C#^rSc-*@&Ijd*cd_UY}X!=Z@KEny$OAB4Uj zz#h7Lnf{nUS%x}v166BkVZWp9y{lRBQg0ZY(oA3H;9u>dFJilukB&=XA;dOHTV0u} z(OpR-+RfC6j+D|^|D0KpgHKH=njrteB?C<#rbHj_UI;H4rM<~8AmH$`kGP~24bj?$0l1KeX;@7nF zJN^)*fwbR3!ivOPBHtzMFl?`ajX|Kt-QM2Zxqw|7_*ZP0LZ6TT8x<2f_^k_YtSNSC zWa86Gmr8-c{m+Aj{_%?ARPmf6dYXa?)2^6h51xpW@i}@V+#e-KGIU(9@F62WjZVN6 z$C7&)Go+%<)9!<^vlvtW-%y1PykoKF{>;N4-QWhtkH89`k@E+IYLVU??W`T~C6zwx z0n=cJop1+vwZ(hXJtEyUdeJ^Gtkwy_?pOxTpX8VBFx9AAbdV;Tza;$(Q?+h5E&TQC zFK0PV`@((WQfI$865EnIC4@*%<)F}P41w~X}X00Pr$z3kU({G z_1u!hN7GfDnv4yjvwq5$to2K+D%GuAc4Kp4nfDWqhofnO&&73K$zhUks{ltvoDpMI zp*4|!F8z&EX2Gr?tEKjAiE;BNY|m3c%2sjL@yyLxRC?`*7KpSY?HA3M!$&{iGguEE z_6zwM;}-CN`5q)>J_aFh52Eh*-Ebi6yBBqi&Vc{*?|&-$=IBm>rrp@KlT9|pFE%!| zZ5tcg+1R!>wr$(CZTsfM_kHg@_ufD5oSK?C)je}&dggRjPgOmA-r9-JgBwMYJt2FH zF+|$oa_97AXRihYp#fD0$@fg%=4X6Y5drPjIZ#@n z+tlIIGasG6iB0j%^Y|YKqxwVSm9{O*nXNDspOwXexp;u)fsMVYwv%~5Id?`cUY0z-|DnY= z|G2+owTC3mu#@KCs}v3Gdne7LcHf!4<1OgWmCz_gKTaT>L^zTHQKj)YEh(B#AmtA|vB2pEP zFkqmgAMEpl@}XfGAB|khX07EL7?GJT8b&T++QlKKc@HigiQEg3)^M@iDkt&-1r>BxzIoxO0TE!=dm5J7gKR=2#}jX|7cy{3Lp9SL4IED?KqpZwF}XeQlgIHVE8k{*`a_nQ(wyvwBs%;brw4!kye=Mf&RaGapS*Lll41$>!J$ zTHL%XJV0kbg-U;C!m*p#>z1)e{e;<_N-=a?|F)B`12c-V!luyorFaw6QbjhpA99S( z1&8VgWxH>97OdM=I)$=_gGRG{5FXTPT7S#&_`iGRS#Yl*u6{ss5j`$^?;;7KJe2(@8t8uxi~ z)a039>98j;DU=n$F^PnQMQBd5tW=Ja*r&IAuG(i39s!1q!Lp%(dZFh+eq%>J_KfS! z(F7H<00CN>G3WBnY)b!ff5^FYB)m9wQqHalJA1uN_^eUNt>m@#PuInDemmm42M_`U zzohjW0h@weX!w0ucH_J_;T}G?5{_j^$_{Gy&0U@+g!D&*3-n9;LIw`f{qaPBsp)47 zx3-Ent0IuxSPvs>pT*{9DC@Qi3_u(M3z z(=Qo8iCjq!HmUaX^gc8E{PLu#+Gw>qld*D z-(g^!9#O&$dyt&>sLpfRlphXnl~q;6%qI1Tt4F6Azw5$jTj1tsp^vZbXkS%qU+|nHM zrM+7k+_+BXy7gMERX65v;NC^h8x{nk&;zkI3TE{jRWOv|QYNi?j`d>^^(+ zIYPAc@HP#|Ytddv?#me4XSX9iGBKA6{x*AdBA)?nbgp*V<@9W+3LAmcP|&AokfK`5 zY$2|i9qsoshfd0DXJ0v*>6t75l}=QBs^HL4j0^M6;CN|xW?4%}i3`v@CX{q(#ch+6 z#HixpY_GQwR5;{XA$5AW78r}8aVxp*eK!ki68;6c6KwlQOdL5+HF;QWRKT<>BkVk! z+T#<&*`DgR)M`16SxS>9eq7T84{(-079CUV1ye5_wfK)bKC%nJTrVE$s;0PFuIg=J zZK3ow%_T3NnEFE>L~B*q&Hlksg@dQ(N{p+Ui-+|+u9wMu>0^sk8I8Md)v0oUgv$e~ zU>jntHiY(_iKFb+(cEU}5^p}&O&-t_J{nuviI*pZmBv19k*Lfe*egj(^xUpfa^>dF zu`cAJ9HRVUUJ4$zie;nXW)rc@HMs_7Q%hq8%`ACs1A8YrF77iWnB){R%VU-Ux^%8C zY6fO*+CE!5jo%KQ1x1be&^K%rwv%Zq5IhP4_SNmB9N|-|ILgazm;H}#NDCVH1~r*N{3PS6zg-E z4U`zX%RwGxuX59yvn+{~=#hPW*L9tB$P_e?ol4^|0F7SEiZ|W8aEV$(OFi&j401qv zHjWI1OgN5=?x|WmzsXCRQZmx{cdq)CRm~6(mU`9#>Mgf7>LnkMvoLTY2mSdvP&JIwF*NW3qk*63kXlu{E^ z?k#k=t;GAxQk_Tq2W{~!aO-$4QDc=?x@VOYm-?@#*w3~U%N2fBg&P9i@FyP6CHG2D z!&C*=N?FgzBZ3<0jw@tCl8#H{KIbsY8Ijxa{jus{xfoU;LZ=y4e}G{XUfOn1E3|PR zPRNyV-^!Mupkc>-uL8Pu{vQon0WuV}zQoe^VLj8g`7(5b!xe^su!G=irQ%HN&$g&$ zPNpx1W8-H*J*OKZl8FRxaxuo!0d?(h$EC>D`a?^PA9y5ibLDDVFq8AHMZHzpG#pOI9ukt0>BS5huCE8eb0& z3ow1Q+>m{*k$1s>Kuy@Ep0SFJ#NDXXy%*Y*$f&lBOVRD@d(h)uvglf;Qco+{3V~WP z%PPrBo|3%`wBH*`J@DpSqXjW%+G9IU4Yl_-|IS>_sy=(v-brsffzGz-CeOO=y-cmO zHdTaFn6fujgix5wOR6*7FrAv^kn1z5ODqq|z^^V6$B%HO?P3P`ppE)EoRGO}g<@{%X8955XD4o+qqlnK{W>Npx?J-2J0G}7)yFYHOLXsK_gsMjO`UrBCk z81?ZYr6XBHiH*Tc#bNSB zY*xhXn&q{@Zs5-SNc6oGkWn)cs%V%~+ct2f4#> z1MJOb{TeuCR%6*5tbi(048vqmxJl$7i6Ti zTE2e`{-6Glcdzd8t;t-6fT|WBIZv=OPeijd=D7@xIUngsE#f=Ln2sOikW`|89N7dC zl*ZRTL^12bFXyv9lo-2BUj;Qt(#7cuiumD1D}H|_FV^ewFNc3PXLNnE9DNQfXN)xc z!ifHw#;U9PVqq}JIjm(ZNC^!)F(6YrG(F~El@HTZjaNSsid@KaugBV4zWKdF7_e>i zjE7UiE58mC39DHs-(o8Xbe1`#JQ=7L9=hM^~a2ZzU1lR>d){ zr=`T=`3U`aMsA_v7}D5`D7FD@0o(sXJU(v06htlm?uz3uk*ec;5@8j)Q@yv`?oeZ5 z<|X)HFq&k{8K0vjyn9!2E>e#$LGHgX+=SxGL{A#a_?>MntFq4~6q;5hWMDkt^Knv= zo51*!oE6lSh4P@EjL8_--oSLQ$;E5dP|@4>0N#9%tTM|#lz;wF#A@74ic*oZtLj|0 zzI*3=rrKu!hFr^o6;%<>0FMI7Yid)L3Zq#3#_sfWwru7pNpcr*w~8?cFb{f^N08z|Qx1++V$7o2hT$_<97IT6*73W$eP`9)nh6u|9fDl&|{rQ`-#` z)L{vVkA6!C%VJurzW-IP_j%z_4~9}GINC@V3MlVmoyxa1yDM2hE7Ip<#6lF%TD0Yt zYfwD^sbisuWP4=__|R|M3*0D#jwL8fFMh8ef5Om z0T)_Vg%S=f@_`-`~jn^WRRP+r|ly; zDc^g>BbykSw}N!UC|@Ox2>CCe;bSr!AaGO zu`C?hP)9yk1hDi3-@Pj(|H-K6%!dG(B}T1aUX<*1uO-GF!PBOM4Z3yQvxX!dy2EDF z6kz)&FMc;aq|>2%Res3XkfvnU($Y?iq$E=GC##ZQQ#OkpOAkM%M$c*?sOOD^XEycp zl64NikAvrNH+De7_g|`RbHnF#yqwZj%gRS_(V+S+bZkG_-qc?L|A|?c8O?*>{|hOQ z4~%6n8wtNUcaTW}CV#sm*pbP^o4E zdA{%;4t+d>6n(7JbV2x9HbHNBK3D|X8jA87lVY58CZ&f2ut`DI28}`Zi?vS^UNc+p zh=0F~WJLyI{S%nZ>rU1Ff`mHS%ebCXa6lF15mVmAH&G+HQ3-o2UZvbXAMj3yFq-eA z9JdX9-P{Qlu+<>!6|c1<9xUylinEmYAF3));ZqcRvUvhSU<%Xy^LeZjTwHOMPzI)2 z1c;zVI+B}R$Qfv06 zK+h3&qlcdCjr4i!Q@rS#bLS5$8f^>(}U%o zixsqk-7adLXnmrhC%b{aA-1fd)iBVHpO#&oa`M3jq?HY^<-A2amFF1^F4PP zJ-(;CPghXFUF-G$mmA>C{x|k$$m?GO{Q+)JhzI)I8KT!>>k*o^T$kPX-}kn|fEN~Q zhgLbT*G!1GtwS)7?*^%<%nkJS zzI1zP)3wUx;F=rc)xLIn`qQ<}=Fr;<5aGU{XG-+7Jn!Jp3t0BPqG#IFwL0(6(F=&~ zzT`Wi?jf~jV%3dPXAj#8#?~R1XY$pJmv=Yf3o_p!`Fle4je~a&;03+wknKHb>&D}= zoA3qI=MeCoi2I`ZIk@%0_u0eug86kwru^JPt(?nUs^FF=t6XBCoc~^`vQWZrQH_%q zRH|>$jFT%;DsNGblRsE$XVIRPLsmL5|C2>sT3&I1nMHd-j%k60Me`eEWr3Tei_@f_ zt}#(#_R{h^bkK_WBAjz(t$C1j5qr~&;TfmmPalyW2+30-`@P+n8MnxAEcNwhW$rK=wk~(u(sc|6AOMdILH_!#Q)0=#e8Kaew zY+gumc4>LPzj$X|(UJ^(;wQc}{PAjI%EBCK4wQ-@`;#z8T z{!93=gFw-oS+)akrrlh1WJGGoC8}~AWA;^y#bWYbm&EwaTr7(>__fh}clfpX^Hn-( zQ$(wAry#3$Y=@5HRw-||li5jn)DbI6O6x*NapA_)OM9pn{RGFxs(UwW*3_?&;mYNn zZn7G&6GR$+#TI+1%wUPF^mZ^ypwRT3%>1pZlDdXK$0$c3rbUGaS548g@X;fsC+;FJy zkdR``neDJ?5M*Fv0R(7{pZhT}g8wBr0iS}*gBQcfVMfv6X|uQ5_Ri{e7%fQRKE&w& zPT&>l`NLS7g&V+uk@=AessxA~k@b<0kspZH2kW~*zAp#GLA3811Nt8V38 zKLJ7eui{u{?crStX}p5a@66u>vZ&c!0R&hMn*HjSzW))Tpg4&4Lt;n-{w0h-FF*=` z2{)^^HVb1m9W%OUA6Aa7Kj@ucH!=KEbV_Zbb67IIY#rB5ZaMpR`9G9CM6FoAFhP$E zfVAOqf_uM!KG*{Ofx8U+jsFbtZ=B?9U;`c^69YYCJ)>fXU7R3JqN*%A2vCweslgUF zsffFjdEZ?cJ!Lo`$5yb7Z_KthakF@Sw4txBm)d#eK?TDK*vLnuuxSDzAtC=n;tDVr zVeWgmw8eUhIp&ExHD)nH0cV99^;i*ITlVVaU65 zwySiuuO?q0EvP&~m4)|h0awkv9o7V4fe{LmZZaJs#%fqJnwpEQsplab^RXEeM3z26 z^;H}JVQy?_eHG$`gkMClVWe`I5rwPrMI;=t_#8NuAQ{V-5TKiwx%Cn$D?BM{e8ag3>_CP??F9NpttQy1OrSnn{iywlmh_z%~OtLORY*8WJ#j zrTd?FaeHGUBq>7!Gny(+Yx@OO)&3d=2(MMv zeP6X;P|E02-fk zSiv;$LDkBxqb}k-8p%+r9LA5~qIJ=~Ok3ATPvd<(nE90a%w0RGemq;8gRD5q zFIuR|JHM*W;)S5u=I}pE`5jeNR%G_=d<$AaP{Y+p_sDS+gjtN@CD+jR8J=~eM6(Jf zAWX0s7Sb^QXFn}1i#JFj>V8w6?k(=vwhF+HSGFM4M?u+!OshDXmARt3=cZz3}w5df3L|?n zO7K!->uCXj=9+W?T|j_fRXHC_hNz{JUHh6}V1HWMV#Y zNVIFnOSF8~mB0G+I}@wFBY>Zy7)Y>NjvfvUlB6Bo;3qds1cc!)QY_d(zZ*ReYngi# z1C%4h63xi>mU^~;N0V6@bWh-7h`RRT6!@u~yB0lyCtWCAFuKRn{-bWsN?j0uFCQXc z{{>V2$zYT&cN52!GMhFq+3jqiywXr*iJ|N)Wx;9ul+(m1vpLoNtf#5RrQ4;4cH3iH z<=U$n_#Ma!tjSM$+u0U!8LrW{LJzkXd{n~u+KQ`3d)uZOb{+JzyJMTzmTwvU(U)+x zi_niSAlsKB`y-+AB9IUW(ceptj~&QcME9&`st3@`|GEl9P$(O1`|%B+){N|p=k0&Q z3C0Ia7?kaw9hB{t9T?p`)ic!x=mzwP?j&y~@96ecbtAk}y;DE4JUcZ*^Fnk1cR_c7 z4{h&VuU%K2O#R+Ad2YJC+TQB(@!h*7+~Mo-3Hkyd-*)MNwmRcEwcb~j=vEDX)CX>hOk_W7 zaCrj#_ISfOinNZ2(D$*;*v!Y>EjbMJgz)DEKaXEvm&-l`Gx0eR4`Pqa z9xP&OSf1XSWT^XF0UP~Hs;siVS)pJJ&b~lB*}8=>Qo}l{4G3))&`}+TQWZ+Bz;YQ=_Rc$FGv(Ow zw{j*=i|62!QdPFaBunIhB5Ni;oKhFidg`hT}8lp^F6ze73ClXz#&9e#QMr$5(8O9!-|$C`qO;cJ|rJ>pdsvbUtL z3)+ml4%P|YD7U3j4L|RHk+8!5lDSQ1%eD-D3GB43V@udfcn;z53+)^n(HF9Zx0(s($6*`X7Ofpl2e`_A=@+UiXghcmtmY#SD+Q2njuMy= z)E|CqEZ;2zuz()9sR3Cn&;9{EEzdq-<@B3y3SQ(y#bzIzXSipYlpi!4@tmouBh91g zdaT(~0hsbO(9LKx`B?`EU2rVzc;#TK{tFRJzsc)+%SrFgG3_g@aA*qVJfMnuC0mrTbdg~MH>$G^(6Z-W1|O9bc?GntgU~k#+#X=z(?k#idQ_L zb_<j0?uKMF2ZY~ zP#4}kb*MMTu`0@k{dCpO*8*mWu&Dm&7_3)hK|TXBQMe1SJbZ-JSRpRFdXi9QcJC;N zc+Ff~24<2Vlb8t4gjo5gj?m49vuSB0pzBe&QetlHg231xwWfXWCAO{^Z=r zK^1rGx*U*F$B;d)B5k=>H($je2U2AH`IRRdq8a;nl|mSSq+>jap)# zk)d^WQ6FywveD{2CS41C;)~x)F1TXTR{o7zM|?OIz)$rzNUxNCDZi?c-_pGq$<+hn zRD_NOjX$1IQqsqHbfZh5v$&SWBy_s@2OFTV$bg@MgzXln7Hd-L-5@ofR1;rO=9K-Q z=ZgqSZ~0Bq3~vR}6u{MOQXP1-{Lh=te083ll(EHZ#ytml^5wJzG$XDfItTC&!94my zb_eJYE+ZoN2Gq|0c@jECBDM}fYTtk@A@s=h2JaMY7wwpCo9-NS!){Z!Vz-0nfLHk~ zwG{nt{W5f7St!c;#DDdpKcqVSd|IB9!gX7o6R1f>lM@L2a@AIB=}{se67{$b$n^UD zG2$B0qtgeYI3*w5yu4(*eeUi8;4qzq$sOZn4 zNFHU~eEzF!D)}&)>|6hOA6#l70?lfgc$VSu{9rZAxRP}>^;k(JmYUzm<=!f>-8Q%* zR0xJnE(T5#WxZVh%lKSID))M6t4lNq5wGlqd-3;Rb9 z`+;wWV;~9j`4{`dU^k{}r>8cgDyOU0r81eQ_d&)l@ON+{tuQl9>>X> z+B+nhdu@lt8`V1`|I98=YLUS6PugG^y~HtgiL7nQlyhF9XtPZChsK1$1J5`*|J*Kt zC#rTx{(lN^{;jQKTIO|aA2oRErHa3REVF9l3_J7DgDaPdl|rih=x{fHYC9Fga4XL#3C#r-W{5`eZ2H zdrd))69Js4MF>mXMTjW7P0*0f9{MznvnfgNOSVW~{b+U*?lN_RM;Q;(*MdIW!?e%g z*^@41=q2!4c-!EbgFbtT&JVLYI~dbm_y8uHvf&S_MR!4c9h%NyTOyT9k?emP!p*6V zi;7eKr^UCwx%R#60ar7qmCBh^^}ibA;$r*r|1uVLBf3rgx6OyP3CjmW0QT1HZ42}s z(YY9q9iZzQaNhvTEtO5M^ZM^m`WKgzLc3b#+&<4|i z=mM((GN83wqPn5J#&ONOmA+g@{fLHq)a>ht;Y z1@?vg37g@&1y0`W(Jt%XW&g?hjC67l}ooSKXG?69Lb+t((J^ zZXI1M!zG|C-=BwlD!`hZkj^*!7ZRF-tZXypIxZP1Y1+atZ@Igmtu8yWRwB0un$jOs03YplL&$+aP~=brM0FM80WRk*DpPn# zScXanz*Pi`jv3jt|z)M#cLa%19igqAEB3Ss17bY8w;yo!D0w>^dCC8@U?*@;^$V`N?^mYamyobI`XQ z;24cN-rg6(Z9Cilw+S`3MbHfa?mmD%eJ0(osB|XPkfd}b)}WFx!ty$~T-p)us{>ie zlB4nE<#%SW;eyTZVo&@c@hsuWva+mNT$JyWy{ZU(_CCMl`#0*VBvv=RlYn{4p84!I zyL~;oX zhuW=Hj=fk16WAM`uZ@taQVpnnYmNk$8qk6sla9 z`$YTg`y9~r8DKBcAhL+@OZAPNE%W)bF&@~U?d<+XrSAm_RppgLujTt%6_u5{o{5b@ zuu}+iyN7CcVkN;J=m-UBs{O8aG(p(>58DwlqsOel>{Zx&V*( zPaf1Ywhh&-o)ZDU!hLU3aH`SD|DKn0Em?6_v<*S>2doMgdUu4wooO3A*IyBrZLp|a zRra{Mz%RC0+JeD>9O!YUbdUZf=7!EHcd$-0jW;}FDg5H8*c2C`oaGv^aDh{48wm&A z3*%XJ7q#MeDBtF8cwFy&`Imj}F0*N>uo5<0wVI(CwHb@{QI*OZ1q)$%ha zeJuJHmCbkY5_#KAe6jYK1fm%Q8s+C=Q2*2%&v8U=22wiv&46OyEpfpgndSFKj;nD= z;p@Mr5H^L8k=v}*(CY}7K8})ns zzTW4l2M#?_npnO@w%0h)XzfPelz}+)3*FQ{lOuM)GblMmU(=pooC=LvT&zKMay>>J zvL*>EwShL-VG1VeE)Q`c|4Z5ac=BMXB2SUZ2V=wOGG-KaUM65wf2Jj1vqh@(ilTa> zdDUrt%M$D!KN)Ff-dj9#bIuBlXZ3)HbME?-=@to{8sDC8tch?lJ6=7xawyJHrjx46 z?iRo0asT%LOIE@b_lw{QVY{x&E#*tLPG|e$K7-rFh>Oyt!!2kg@WI)V!pDf+$18%m zJHYPHAVhmnjnM{UX#Qa1cg3^YB4xdD1BlT@szuBv`}6+11WO0v2tjIHey+RB|2 z!Jo~70f-Cjv0b1Gd&Ib=+6pQ&!8f1>YoO}2J3tt5{d%CGTWmxM|n zwDXM-^mW!EyxzzUQ#Y85R2S77c4cSMYWrnpHOgY^ICUXo$D5=jzXtm-(8qIp*iREJ zAF}d&P~C)HLNMo8<$Fw{e&f3mIXR9V(OklLyiu&=_{d@_b)D0TN_qTva6MK1UC4V` zK36eQiGz#K)$q)>(VnS&wRkru##($lgry$w*D$Kt{eZ)OTf8nz?(_s}$=wT+cY>mH zNyO)p%RF(lmpSg$9P~4nhfi-;ECV^D$RN0tnq;zgrGaZfg{J~cPBV|eI7C!O`>c}^ zcRmS=>9JUZWzy`~%fS)PzC+{dRkZ$4FR?N;y!m9KIX8OjP3EMK>6oj0-7ADPpJ{m7;KMo?R@t9VT34;; zfZx$1j*^!{ii$j&m6w|R_tyEf3|?lIb9Y6D{WrOyvp3GCiw3U%MBIT z9D2-TaX8{zoexkfXHX`mvkZ&|yHZ-Z*1Uo+NOG+9oYYoj8)TLYIxD*_uVEg8j`Q~y z%xC6nYP(ai3R6)Pp1eFDmnQ_`50YdDbIYL>OK|!Zu!B0YpNlD}OqndyFa7x$IOG=t z(wz|WouX2B@{e(7rjJ+mnj=N#7lwS|oK%|LG=EUZCZRqirA0sCe9kgp-s>Xv)obIT z+BGW|vSof0$HEyI$tO`Ts4Fbj>z_X;KGi#Ifp~98RT|w)UTLZ|QLo-ld^pCAJqs~z zh;lhZy0+5X2^xfonO2&zl9->&tSI80Ng4CgIw!}1hbm#rn=}>1vt&-h0(!f&RgIh^?c0_>zpN_!~#rEWbnJtb>B<8qg4qrK&zMheU;j&wo~$jVDTmIg=)6C$H{xovvqMdWvN8UooF zNBo66N+B7-TX}s^3S9L7EiNMQzi>w95BUJbj_U%%-!1r1LY@#(nX{SAXqmB0<}b#s%GM$ctfrF^bqBZ}lUAx34ri}TMheZkN1Rj1DDve*p%E1x%{lv(l_&3sY9`8GTB z=u?`622tBG)hr9(Fb0LcCQ0R!@ zUe{C0aK8uzvLFT%m_GA5+5{(wK?g7r&Lj@(C4_v}QMC6Znk;5;pGT@$xvul^evWZT z7=bUY=f~sT@`G7jmaC4r>W7q4rUjp|`l3_3S(%wXjTyVl_SODcJYl`ZQD6UTAY;?+ zE~^R~7{aeApI~HT+n|M{)S}C5JGf`Q5aNrq#s-@*?>7>;zfNr-vcY<&pRs`l6c@@a zn0gMvt5izm(9>fuht?E}3(9Xzk@&K^m6W?$CJqpyp~Wb7sRL8t1M`X`N%}LVPYC(< zSNI}lTkH`tU3SH2=>yITlIKWo1H!w$?8Dmd0v{mH+Ui7~nx#G~&oQ41ec`97h`UeU zjJU+-f#|-9pmliRmYPx2CU(tO^@R`5?UpE*mhfOWIe1^O_7^XSZo+{2M%}G3MHzcp s(Rua)S6Nkr(Zd)HP4GM500z15+fVkr{d4uzgSljo1TOap-0fb4UGynhq literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..642a2d44187c82a7328e39249658068fd455717d GIT binary patch literal 20320 zcmV)XK&`)bPew8T0RR9108d~54*&oF0U&Gu08an_0RR9100000000000000000000 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%0AHM8N!I{CFWIz^UC@hs)7aKu_L+nJ6eZ33! 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff new file mode 100644 index 0000000000000000000000000000000000000000..7cc63b7e1a65d56877efd0cc99b2b0cf54641f7c GIT binary patch literal 31636 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3f438f80ea0b583676e2002f0c2eac5b08cadcd5 GIT binary patch literal 20436 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 P0000003ieb5reY;DTQ() literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..40c056ea4cf3e5bcd935eb59735af846be60ccb5 GIT binary patch literal 28472 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff new file mode 100644 index 0000000000000000000000000000000000000000..ddc9c0147cfe04689758caa9cd9c8801f8cd3675 GIT binary patch literal 31120 zcmZsBbByOr^X=HSXUDc}@7T6&W5>4f9ox3OqaE9}t=~Lva{s%PoODjr>FQLc)BQoa z%ZrNx0R#P*XFL$%PXkOE{vZ4QnYg%$?2pdnCx-VQTp+Y+Bt*r;fq=BpemLt7*ugv@ zbR`tzm4SeCn}C3Ddw_ssA*4*N=OvU?g@1ICKtLdtKtSLtb4x}0^2!X%KLalO^!w2R z8I%Zg-x=E)IsgGd`~V~g2ne*sGB+j7+|c=lYs39$p#H=6HxQ_~ji(t95WFA|keCh- zP>tlVqavtlkxNFl!=x-D#7Jbv<10s(=E{iI7x zWk$*DYTYv}PaF7QtsK!iW|1>y)KV`pe<3IwE-{lgc3Vrwg3 z#~2Rw&MrSC`~Wfy2neACl>>|Oe{=dXuLakv!}^H4k3g`XCqI3F#;~A!|7(||sgAyF zz9GP!z|??1e(D1G&kF?Pv1V*wVqoC)ED$Xe%eL=7{q3|w9Et`(1VP$Y1Oim_7h>f9 zX_U-w40a5FfXRQEfeAxEKr-e610l!(_5LqzHfNaK*Y~%tuPLlN>d&8iNMV*OQz(O% z;Q%lUM#c+w1BJ2BTUhF-NNg-@G`~j1?svkGU!y1^H!^?zI5yBI#NNWq6Z|Uf>w^Qr zjYAIo$r+PsZ?WKtH@clWb8T0x*=cKMtNdI#y*^#-mLn^ZvqS_?cNTEfi48@ksTcpF z#2B4N@M3@%cp~Ia5Q3!iKpP=g0HBQoPzoi?QiEekM+>9WPrW^T`CPlZ5h$;F+gfB6LkT4mc8x!NL;A@kQybAP* zP>94@at%M{Z24P>HSZ<(K3ny!P#Uv<^z2+sPG=Bwl+bv~uCBf-SCdrKGG>YgchtUY z_#D&|5Dn;4%PDR_`GpGRqqoDAIqrVt&NuYT)Uz#B)f@MTnjlvnXMUVn_{O))8!)>A zd$DNwT=--dg|R`lW%?U}%WNcP&v)ss=5th)gx<4*9WvGQ%!?b(^E+OS4Xo6zeNoY9 zcP)Ie+YR*S9pCkcr`_z)7;x+>7Bp9^x5qQQ6L63aCd6T6ma=2i9nB?gkS=jsh?cx| z^Zb=&@3HPx;?{(xuLjv?n+Ty0$>>24$jG5GZ>jwKM^m>ye{5IRA4h%;Nk}yr+{7;g zRNhgh=(%b6xl+&U5ro&i8QBvdur~y*f%>%ifpu@_z}5|^>!77ENaQB}7L+$iy%vAA z2Wtk`;%6bUqacbly{&cnMzsF(t+1`Hl=LYQ?%(a=M-`uy`8j11laR}TgdX}CYreKK zR?VHuTY_}#`nNdG``U#pTcW;rEU7i682exRuqSNI9>;vzB(ka&sLdrGRmWTmO?;J)neIo+!pY|7IO`(0goo+nN*`&--YL0s zgc+#I$`h&+X)v4OvM(M?xu5dQysbL-OlDtn$2`t8T8E4?kBHVw*zRXm`Un0|{!v1N zy%-{g&Y8A6o)i;&`;_e|XyYOWaIZmJE9V#!=H+UYB0U(Q=E;o~FenyAe3`%Ai~G82 z`@vRgX;x~)Vw>veFJQI?9WJb+$D&q*QQnwmnsdC5;!`mmBr(p(`k#Q<8@pqCUDNm5 zc{aE#Nw_!|=tw7gQ5S&Mh$gu4JDmGFJ+y1Oh~Tz1Uts`=B}Kr3g0ye&AJgc zyJi@!Y7z6eG(zpxZo#ZIb81hkqyXy)a7%T5J(|R!C|_C1*XKJDCLEp-%`XgR$|iKy z#)O|4BqdUF@<`3g3HfFIyjuJ0%;Rj+64oxKPWt}N^|DR2$YB<}QcG_+Up%Jlg|>S$ zb=Nc(NnAxi5Jko!lB2m|na#|kn@x_A9i9O8-YpccPV8E<<9UwO#>?|_$9BE#K701m z<83+i1W^}vZ@+*3$|6-nJmJ2^xP|VOG&`TKIq;_(_v#jYA~fr;3rutP)jU#Hrs@BStEF0`K4Q6Jq3z`eV16C5Wd0A2L+iTs#~0M?(fZu zUMj54|Be@rwdTZAK1@N_#(?K>eS<8fXae)Cx4xI1Bo^mX@9B-+^T~GlzOWJO$P;v~TAJIX z9;Je3@aRHp`W9t69+O^`FSU=$t!f4 zHB&0AT2B$22_4kiDt`|?uzXGdv5dhn>6*1+o6|F=J$c;@E;}~G?!j?%eem3ELOtE( zV%xI`Y&VZSN`Y4xpjRZP5$+!zmw#-(q{x0C_}?_L5{^3ZbIRv%moAk%{>=fSn1i-@ znNygnJ2f}`%z9IQ(ETa>HYzZ`$E;Q1R{H$1=ddgOUI{yE=BBFlM%?A4@_+;V6(N5 z;rXzXhXjEtA`x;aVCi=u3a;S>-)wr`Z0521?e#B7FL*YK|Dl+0SM*;lFq{ceP=pDT zNQ4pAU<7$6aI z9ppGu@OE0FC>zaT2)X*u6eURlnggg|yd;<H$k6eEWVAiQ6Q@uOqT2k>{uuh~8#e#E`N zPyxV$eZ+OpI*LG%0Vt)vmDQ-clb!$a73<_zr&nuKw-th@1fLZkD3q3Koke8jL&ej-x2sW>#~g zM2ZF<*&@2!T&1OcX>#d!>3Ug+g*3Q_>?r3$K23&>(oISrcPI3k z*!7Rp0*1phD-tGxxM+;h4gH%ETsrP9%1JRp`HDK~FD6zX6DJJCj^+!JpNbH5H+6+{ zMTx3RMc0|+qs(J8BNCU91Vnu87>-jkFNes~^pVQF(|tRRO4dTsnXPL(xFxnNmxbpn z6f3{1Qqp{O^PCoF^?kJ%oe1t6y+v))jBO%&72PWPa?7&X61FS!X2F%{^Ol{Zd~0p% z_6bq9yg-Tm()GDLTplpf3mlcmNS*PEDJ6FCh~a*;-%;v2%!K~?{2HzG_8_#uBit?moDHl1HE7z?xPq!hvR>YOj zi~FbS&$X|MJT9cL@m z8sp^{TnFn-VE45g=j*l!f_BJzQNCP0Q~;m+YUMq7_jcF)R@L*r_edHC5W)fF7cl;? z@4n?5p!8BX2>(e2Lrxcz&N1VK@1CFe|Psr#e>cV8wW)#YUC& zjec7GP5$NIMc;fiv4}&Zdjk8Nw^{Oi6vMsVh-R7|YnQ&z8aiSvH+-#s$dOJ$Au{nZ zAu@ffPsslX{;~lcz{r#g`$rlda*-wVdyfDWwUrcy`D*=y@@?UE_?UUJVA=xDm3+VL zoO6aF_I|`xM|_k_=Sx}jd8?-tv#<5z`@8#Etkd$Oqf|~chuigO&!Z-1e+N!r+>(=S zRI~86B9dv0RoFx@NA4j-DbA~^vi^NO-b}NcKRDS6eR|YR8~0X4P`s12rp|B4k%WV; z-L4AIcGdQFReS%)Z$D}N!#$R;9Ze6pK-)U)W;GvtX}lWVa0ZVjnU7J&mFZ~vG{a6( z`k4KONv+15o(r`%qd3iGvuZY2fxAU*YBd$Sk!76Eqv&R@Q;v`1dNmKSeTR|xgWPiz z%=bUv4&gdC52{^?%9Dr0Pe|r;jjG9*;Ht^%XMGhhELM$E*hKYA<#sjGt4qcXqYr9Js&1(d{{$|sMg?p%mv^dYSk`~HbIFF_8}H(_imK7o&{9d$ z{-&WkqdMQj?l7!GHn$#sP|uWkF>iC24&SFes^Uats`8&JWg@{%s7oC-9PJ1G0+>Ra z$4S$ABHW$XYd3mQ_52!tXHeF!-7!|X>E}9Z7JGTyx3Kcp-&q6I*NcMRca$<^knGym*g zx24I#K%lSap%&v@(H7Y8Fu2~HjIiVaFSnFpG?9{{EL-97XsdVr=7M}*tH5l}eoWC_ zeO`85!BqY91D=#;)J~*Z3_nxiNrwIut)Ow;D~^C(9s;u!_*{LEyHd4-#HMLsiL>ji zwj5<0I6cq{g6$JN?ki%07ZxwNLD1-sBD|c}cdT_xi`O+pQyn<^ z7x~a=%E#LdsOFiW8*r^1;ELE$sreg^+CU2D7E-g}1e#_l?Gc>J{GW%|9FbCC1U3AZg?Ux+k>`al zYiKFc;ZCdD{H%WE6+S&tDMeoOj=EY1AARGI%bFul=B{EHU@>db$ze^^#LJ#K*Mzr7%Phv1?qnbC%J(N6&0dS=UkS z$MPVaLl+%K*tRoN0-A%rRQyPTq0SIcgN5awkM88)v3Wat7BYd!y@rg*Gr&qT33ZSd zsklcD4sRzuqp>?Lp-#|Yx0yLXBjhY0R$6G6H<6GvDBpt!8M;i^>9W{BZh=x$TV8HQ zSmo++GL|V8)r2B!Ic&mViD(m68Dd_zQ~&w_4qN9>Qlkl%HjTd1COVQAlXO!@ zG>^swDm0S!;&WNkQv?55tzPY>zp^(Law4v+O6Vz;YC-}#h>7UCuGU&pU8TqGWm4Pd z>FhM?y%f47?bBZ}xd+bmLVW%w{N^>;&Jm&Ni8y{G2?LIJy9j@+RYv*OZ_koG7T^JS zgKBdSkA~b|7|&Iy^PX-hO;+Z^)K8e%47Mz>6z}Rj817vUa9q_0#z|cjWNo>Ikhb4z ztQpp*X~U3%xF$8{zhrQMwUjx#km)`MJU%;P$LskzA%|HU5fL5Yb8$PWZa8}#^i z^GdJ1b?7nox$1Q=dO@8If1MDC1^;!{cFgu4eU;g5K;vOh8cetF ztPY(bVu;;K^Bt*Xn}!#Ie-wKw;k`2!iuE+a&w=LWD{b&}mAOrv+sIBYvye!jtE~Ce z%S+bS=5VH8eD6Q*5_F{ZWmpsLyn_Yx*a$ito;@wncuM5eU?%-{})TPnV7vQ^34$?b}_oEr#vh>lR_C|)=!Vw08fA91gHnefkrq0UY6bfNf;wdJ1 zpt$&@P?|G07mXicP=%yPYDO^Fr3a^~i0%twK6i(}8(QF$EB4N-b1L>9l#q#u1cOW^ zos3MhL+r!(d}Yg;_(sT6bkpz+B#~X6L%HtAp}A{pdoMVM z+vF?clB`(b1ycux*awaQOAB&R1-nkuS zhky4e+}A3G2~jR<^6$~*%OoyH32EVY<$U<%_Hduq6Jh3}TX4MuuIbOp>M>a5*Ti>3 ztH#xmvG&Gy-tneB*x3PhVVBP?w4;c7oN5Xk{f$$>-T_rztYFo{ER24`(;PUC#viUy zde*8D#cx~dl%teYdJih z5{k!HWyP(ZSFNM1+3NU4v6Zc0l~*!C{zb|4-SUbIv!=L487=aJ5uAUl)mn>C_n93% zE2JCi3sJfu1IxmkJ`o3aLnaR#^>GqpUqCoC0DS{S>r{O>ItdPYF5mi_*EkNs5D|sj z)?R1eA9t2rD zqGQ?4`-N!Y@NvkVqvg!k+Ha#)Pj#|wVcCT{&``{dB^417# zCDNj=K%O9IEP7%i2*WgbI{hxd>3;BrHl~b7Vmt(%Whdc+FXN5xx*yn>e-t4^ZYnru zg5A^UT5Ud>{6-aEzkDUz_Eka7b56r{!X8u(Cd2*VcrmD&+*t53kx%6nF@C*8uNr+e z`PoFv6PUk2&5A@RhR!*2GA8LJQe+h6)vxd+lIq|n&F*$MI0jWOHCt@m0hS*2YDyM! z*h)$kvZK;kb&?aB@-!#~9$4NLq6+z9`lf|fG$r2^MVEz$8^^O?OyR0m^Bzw&+~Lxa zIp7wWB>&Z>{kflkBFw^Es5QbDOoAhXx>DI5Ok$Zhx#kVT&BV~JJNtJVgUQ~E?!Hv5 zq11U`(fmHJ8$-da!dhEZtGSmEbQoTm%fR{apLyfNPK_y4I^C6Ngr237aS@q_u z$I!URSjsYntFg&%egsv91}3t~#a8+DQu7OLbw&`P2GlJQbu;Zo&V!wb$jtNii*3g` zPAKlv$&={WlFRXZuZtDO0$0dj-TLY#N3_R)3si9s>2zS%au&i0wltz@kQ4VbBE9`n z{E(8b_+|uJ=RRmvu*pzyI?`en#0=p?hoz=UBagX3sDYHm+TkJNM>Qd{qW76?E${7!mQ#{7JVrqhc-(V&q(yY4 z)r7}9qC8Si50WEbIR4}eFO6JJvwpXh+pooMywjboJH=*TDsRnsb!XoTQEZbfo)*^BH9n}9csWlAt{}9;Y*a& zf}~B{zwS8>)5d{d<#{0GdEJn$(+9{IXA?anOqMirdA&EdY#fS_(QvgY>~FiJOqM)JT$Cz(3n~lwf7Y(e<&R=hyX~p3_XEN% zm0qaF=f;pPFBgwg^v+hEPjrrCph##b?VRtaHn`W4jYas3kF=q{bFCQf2!>A4$PsRr zH`Rlb$91nUL)UIBUC}GeQ_~9Lqj5`|BqDQVVonl8r{(6Ysk#EVS{XeWn>LEZVsCOg zSNlnZ;ERCM1g#;G+=8bR6#}aJ-x9*Te8xgvcE2;kzAQqvy6%Rhu%%>H5I5e7=e>UU zM80WUjNP5}h588KzJ6Q7P)wAJO3WNlsevbtV7-hbh_%)6 zGFV{5Th}~DkkIKj?u=evTf#%s?PbXyCP`y#PtGPg4Nh$`Bj(OCv8p6`mp{lBuePWF zZj);peP=q53!r3eyb zn==05QJnB>iw?*9CU;RNCqxIA#haF(ZDb52j7n~fo?oBae;_*TY6E--%NQDZ8atax z)fan7eWy;zXonOt2#-WDz+CHiK1&F^%}U%9FK(zc=aDpa`AGCShuw%g9Y)>UNw^z> zy4l$U1l>4O-y<;u9H+A?`CT#b3TxXa>8YtIdTlj4791P-lV6Job9czDZSF=d7l)VwW$2eP;yoWNkP6NZ0t3Z__|wem@r_j zH!tDR2(vOxXxLMtq0E8?#c(f??eamNy^QOir}_|2SFnS_&B*HVtD!BwtqpjKBsUB| znj5vcaoWzv2}`)sUX1$LyBA8rA6gqjzaQ)u*fXeRH5-~B5~lOgdqaYm)BAgY4!=x& zsNzEu3hb3QrCzQ@bm&Y2h>cM1maG8hg`&PKX?J|P6N*2v}gRJK2QNzQ(Y=9Y| z?~)y#iax_>d07^$&=og95#X04E!BwN`i2JutOat;K%p zin>~1ZJq7wZHW1TrvfhXNrzl<-*ui|6wkz0pWR^pfsk6?*C?s=#HLlyW8#+6LU9019P7mm(wf4*A) zBHB@MNSe5tC_h$5A-xjL+(O)o)b3X+2EC?|g+^dJ^u;~pHX_L}@hut{%gIjK?=a|- z@?}i{gGaKpagiz#!+|ibaSchIp`4~(v;(A9qqsj*nrvOxlE(vW{(GT}j{y|UzTulJ z4$^TEWu;qz%rJ*H{o=D`5;_vB9s!(5Q0%h>8z8n;6iU890}%_D|H6h!S)>;jbKzh- zaf-+b8q?`0Xa54QU&KCF(r>c=3fzystbR&U#1LY+p+{3VUc;0-2O|d}6=1;~%tB~HZSQ2WLM59S(2 zox#A4pC|-zg*ib(Hko*eyl8^-*}Luj^>- z=)l~Y-`}4PQLf-O8s}K#8Rxh)w^w-Tm;Z*KxL`Wdk22e`OcoI9MM>CztM-0X@gS0Z z@$I-Ul>T=%16SS73leGDfWrXc+HsQ|}5eir6$!VZ5v2ApDTKiBf?XQ?R$IqdX|>yWW{RbP_n zzEPIz8N1t>xV)U2eAZ`^Y2kfNoOGy;d9#2O)X7`~&}PRE6T_$;oNid^^Vl+1A{>+I`X_2aK)V zbJ(Odb@e9480gWg2E=Nm*|Q;#w7@!%|GWM}mv7O=H_p-MKszyiTUEQqZn&x+guD)w zW(9V)w%Og)5?f3HqhdKSHl_&y1+c|JTk=c399PYV4!{s)2>6fpX7lcZ7 z53B%*8qSsoyb!USHkDnwi}_?E{gwg+ubn?2%G(2J*V}K z!;-qpd9ZHAH2=tZIU?#QUFhG`udZ~>wtOGn3`S8+0HM3t>PzzTEHNC9Mn3a~#K@qBRjxb6a~aFb)#ZHMY3SB4`Qysv9i!(&2P@-e!a7#tj;xc%A1 zwnBRSMcg@k>^aPJIi2>wTD&cTKCQ*;t99rIx3u@(*#YO4QAN~<0uMe4z)+mwOp$cJ z=^LQpOj1#=oa47qUjFqiyu$Lt7MisEn0rnWJR&E<{5&Z#&uo<=AQHEK{9BhxCigin zI=3HP(Y`!T1U2hwa?`v7LDa-T>opSObPyewsXdIz;*Q-l);~B<)F+)UR$R|({lF~y zlO+;91rrImn9Tkx4!A^o0w^_Lj8=&fR2kP?i(-oMEI&gB+B~g$ zjp@z`Ss(%jyIQueZ^W)x-1-Z0XxH~VaSh_^dP@U$sdlJJpzT6xwc2fwW36K^Q0)k+ z_KGz2W`r6s5ZY{aw4n4d7na&)fxb6s1Y)T2@@{Jvn649b6vM4XMFI-Wik=Ivxl#g| zEYHx-r{fu=$hRhEHmeu?`Sl}!z;^@29`fe&{d9s~M!&jkruJ**5k1g6EMs*(eBP_% zYRi0mgIhUl|9Ar>Pey!Vg<@S@^Xq9bdQ+fmMcw$1qk>)4lVICF4d5$y?qw~ULL>5q zmzrI`uCl1Pj}T>Psu+f{Lb;uJ=_Pr%-HD|{!5ikhn<2oBv#{tCL=n=Ydi=CH-yzI_ zUQ{=Ncb5%~Mt+{LUwv-RkuxN=Fi zQuj8#Grz>St*4G%Hyf89aA!;W`98KJ{>=oo(G+L!8EdZsoJ%J&pVV^;j^nt2sO)X7 zv;zfN@c0(N%o!VXfp2+p?s)ay*ZdyD6CujPv$4?U&?pK&j@fiWAuiUlQ%*m$vn{fF z3=vv;%ccG4!glGL=j9Ib32v85H8o6nz@=XG7vt6&ENf94B4 zcKuCzNrKW$c#t9sbgd*GcH?XXv^f8qrbAfQ709$&8inKl*X-ej6cw#G=WNrEDndF@ z4BV9K486*iObuaHlg4SP=tOhnf zM3uR~-v(`ibc1T1WsHOmcx#QeDE%Ce$iI==CSWD@ag#H72cQ6p-_aBcJ#q=)Q)`wY z?fY+O;Dw=ykc&GhERLW~F^O{ZqRj$h#!fIv|1lz912!g*N}rqeGbV_zuMmzTo(uQb zBwq79#6l&^`V)PKvN%p;>>YRZ5r47Q-H@||W<5tqJBB>O@Jf?%*tX17thl-)hW!{` zl#Aql6s>fs4R*o@Ts%uMU49HYp4T8BaN&j{FPKe$u0{+;L$~ek_H=dOnhEoJAROiu zRJFTX)scLDb$^SCtY8Z@mclX?=W4QJiS&}Ho6=XP515bEjhhWea{9PbKX>{-UP-{O z>m*0P`}Q)jD!plFC7e;$CbXKYU2r;%YATWqg6o(~)7CR?))0C1SJFsxapFlmZSIO3 z`Ukf{^r>K-73HauzniCmR-qB4X@=3ZX`DC2uoJ=dP;+Flo z!OUqy%oCCy)zqW}`aKRvFAB+qU$HN^yn7!V`l6pDc;rkvv2ObS;5ag~=Hu)WK7UFq z;K@(igVr)e1MjDZfpr4nFBz9hLh234=zX(<0vH@;Zqgs}7isO9g0z?AHwAy(N~dvD z?|+WtO;&t~=^1Mb&^Bz(eX)M*(r)$u!TBtld9EKHza9PtlAFfqy`Q!&_QW)V6#T@7 zSVz1~x>w%^B}F-MDn= zj~Dd$bX4x99^c-cXg!EMy=S8jkPEW9|PQp-8F^+GNxvhU3gdLnl-46k1 z8rVXJMyi5q9I<2u&E#-P4=^hp_8=yUfwuoOxeJ>x=c?U21e&qZ;D_RgLf z)>56-^{9z@q?^LS&APS1?)Qk0jVUocaW8ycfNsr}>H;!K3)GneK`Jf+p2tN($Y(J` zoDEJi6Z%uYT0Ffe1}&tD%I1Iwn2ptb8yR_mqTiM8Ia3O{{Vtns4>*MP7$KCa7K_}p zfyxfaqI8UA@iQ0c=lD20^g1HObM-i)!9T6DFWnBU9I-Q z>Yma@8il1!lcH6P+A4MQSJG5$MD~FEUuKvKO0lNqvzQgSBj znF=;Vp<~-NRxM7#Eke>VwHUbAGj)kr(ShO@_KGlXiPE0D@gd|ZyN_eF!_fpC0j-%K zO!M-EsXIOh`>HSn2jN>wMEi|{m{w#{3icU?ZZn2G{0X1>;T;MTvmt%3=t0!;K4oY# zP=CZAk+iW{~*khelu{iH^BR?+cd`eYN*(FHuU4n$Et$XpmsL|-D0B?WrZ0ENDMv;xvr zojV!wXK13cc!msOogUj`{4m3&q_hxT3hky=#h#kUb=J43@dp!Uy?DHu`|0Ti6OXs?`2(qH zsGh((jKZ*1k3vLS;vlMLY|vdMW#}z7QVsf3ZfcRCF&_w(lU#-YADt8>>Eb_)93BeA z_u5oTh2bjdMZY5RI;cYw#5p@EScg|X_gNu3l_n)(RLqJ(m9hR-Ef`o$B{M67GXVgH zjeBpEcbd%r3h&VQ73G@&k+~k=ke?v{wL!3z3X$#FNidla1@6rhFj- zj|1pl^_oS&G>Vz%ZT!FbO%o;|XjqYp-`NsdWwQ7SLuK#Bv8Lzbl5YKkH|&(%zcior z6Zn^A`G-EKG~J-T#Gm?D2EdKH)4zl-Aie7skUiIH_9Hk6kvoUE6WyIJWJ6TqTm4+F zK*nCIXWIGZ?Z!rq`TLGDEdfC0zsxM3s-8~QcJJtzw5dbyTZfR80<$ZsRTUmo7uC4z z?trG%f~oCL%!RS3Ug@;qnb_~PN4VnR6n4WH!NzE}Bu@Ut5i)w}yfoH=DjbNU7{#EW z>p?Jd{Z;jlMQ7}#=a+HHq0$@a^Y}y|^qa)2p5MR8Cag+!E>_=Rm0##cwh$^sJ0Q!4 z@D3LqIHHxhtF5D$2O%@*9S^v;XK^0#dTi?5uxTMrvbhNDGxoMgguv~e>AuCfhjN`F05tl6g5eQ zvvkFvSc1#}>@1I#eG1RdtC<$7+;`^)+h;)<&S$h!lUeN*&Qs%xMv{PIcXfeedfMw? zv$6K1TJm`_xYHlAO%mlV@cuxqSxqwO>oDfnEtqAa=hvq=I#ghIJmK~?=X_MqvfjoBc5=LjR+Q0QEal&|*n}NqNCrubuFfw#z2f@qI49VjwpJ0)TQLZ=bZm%loTia1I>8_ zp%WWHf94Ow*jBEWw;XHVU7x0Hw}ZSZ-+<*Ij5klX6_MI1$z<{|OhQ^>2N$V*`kj(@ z-x-%cf0)cC#y>7TzrNC7g#NIFx5BS4N$gxwM}SH46>2jKGR+91r`F6d4O6ZrI>&Bl z#f)nB%B3GNNySwggOy~jtP#F&PI$(Wa%^;dDt`@OEl&BsvrFJQRqGAIzaxIKMNVSp z)T45?qAJmufO2XCOZRiPbJK+f3Ren|;tmlePdQAXsl%p_(juxmhbJc{6OQ+p!CNMc zw}Wxs<58G13hj~n-_Xg%heKGJ`kfX5b?u10+?^Zpf?1iD>yEb!ekmh674TaLX zEOS}u#fvjLcFxozE}{#BQbXzAiXYKHT4#{AByxXXky=m2Go%rdqly&}eViLwye8ZI zAa?3+sP}*F$NzkACWS?!@zepK@7gt2X&^cG>NQTfYraa??nzDG+GQCq*Ax$98nl?a z;TZuIV}?9Wi@A@M=Ph0l3s`*DN#MRq&E2g?6t{cE94()$lmRe-PRqM(_C|2a=i#+E z&a6ley?m&Iq+%L?laMXetoe&t1*EGh39uzC$xkW7iChjzv>fWnvK`Ym+7!eszoDsp z236DMVxKQ-453sOscDf{r=*_Ns%5&b0OSu@<79rxoR@}XQmEPgk=k%>lB21a_d#jR zuUMca_x8rLsZN+jMR(N}i2r04L`*)N1yqA*;qG%mHqkIiDWJ>VL=tA>h zxR!%x4MXXLfb?pwN$b;qp#W||^sv1NZcA`jYF|QIG-R5+rp1$l-dH$rpcXU{8NU}9 zf5FyCh+IAGb@)p-bwT({ZaHsx+M(3&!iNHyuKuHN_}}pFlCoY2mnn*P|7mk}XEh^4 z#A|oRu+0wmPxNB!3~UjfmxVMRr|QD#ytQ@Z6=7p-D?_EI>HZ2U#>B%~d5b@w(YrCbG8Q8d~a-3-<3i6?}QZmud zu&vt8EJVZzIMuKAUzVQd=;hO7o-(i);`ED|%GDV$(?iy4;&a6UlvWg|k@bn*C@u}V z;|4t+S4ji=CK&`cbK7?^ElSr_A>Q)s=lV|mCpBT772M%)p_;&;Axg`;rY@>2tS9vA z!kFY23M@r!*|GT3_;RBuW!3*QZu0!RY7(+zRJJc9JJmO_O~sPU8rT9s)x;cQ{5kUB zP!P?S_Ef&eKNDyrdp|9YvJ<2j+kE6SGiq)d-$6%)=Dp|^-1?37R@1vHTW;W2))%J! zShX^4XBPy>AWb|EeGcC7RetYd=PqPEeKztBhHqNgW#snaOZZskfN g*)f7qB>Wr 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..08d7a518c350c2869b56a794008792e431ba38e5 GIT binary patch literal 20380 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 L=BmFUX#N5K362DD literal 0 HcmV?d00001 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/header.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/header.png new file mode 100644 index 0000000000000000000000000000000000000000..be1002a4bc290b5cb277aef3da6d291060c4c678 GIT binary patch literal 284713 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